HEX
Server: Apache
System: Linux p102.lithium.hosting 4.18.0-553.141.1.el8_10.x86_64 #1 SMP Fri Jul 10 17:48:02 UTC 2026 x86_64
User: bvzmoamr (9955)
PHP: 8.1.34
Disabled: syslog
Upload Files
File: //proc/thread-self/root/usr/share/pear/joomlatools.phar
<?php

$web = 'index.php';

if (in_array('phar', stream_get_wrappers()) && class_exists('Phar', 0)) {
Phar::interceptFileFuncs();
set_include_path('phar://' . __FILE__ . PATH_SEPARATOR . get_include_path());
Phar::webPhar(null, $web);
include 'phar://' . __FILE__ . '/' . Extract_Phar::START;
return;
}

if (@(isset($_SERVER['REQUEST_URI']) && isset($_SERVER['REQUEST_METHOD']) && ($_SERVER['REQUEST_METHOD'] == 'GET' || $_SERVER['REQUEST_METHOD'] == 'POST'))) {
Extract_Phar::go(true);
$mimes = array(
'phps' => 2,
'c' => 'text/plain',
'cc' => 'text/plain',
'cpp' => 'text/plain',
'c++' => 'text/plain',
'dtd' => 'text/plain',
'h' => 'text/plain',
'log' => 'text/plain',
'rng' => 'text/plain',
'txt' => 'text/plain',
'xsd' => 'text/plain',
'php' => 1,
'inc' => 1,
'avi' => 'video/avi',
'bmp' => 'image/bmp',
'css' => 'text/css',
'gif' => 'image/gif',
'htm' => 'text/html',
'html' => 'text/html',
'htmls' => 'text/html',
'ico' => 'image/x-ico',
'jpe' => 'image/jpeg',
'jpg' => 'image/jpeg',
'jpeg' => 'image/jpeg',
'js' => 'application/x-javascript',
'midi' => 'audio/midi',
'mid' => 'audio/midi',
'mod' => 'audio/mod',
'mov' => 'movie/quicktime',
'mp3' => 'audio/mp3',
'mpg' => 'video/mpeg',
'mpeg' => 'video/mpeg',
'pdf' => 'application/pdf',
'png' => 'image/png',
'swf' => 'application/shockwave-flash',
'tif' => 'image/tiff',
'tiff' => 'image/tiff',
'wav' => 'audio/wav',
'xbm' => 'image/xbm',
'xml' => 'text/xml',
);

header("Cache-Control: no-cache, must-revalidate");
header("Pragma: no-cache");

$basename = basename(__FILE__);
if (!strpos($_SERVER['REQUEST_URI'], $basename)) {
chdir(Extract_Phar::$temp);
include $web;
return;
}
$pt = substr($_SERVER['REQUEST_URI'], strpos($_SERVER['REQUEST_URI'], $basename) + strlen($basename));
if (!$pt || $pt == '/') {
$pt = $web;
header('HTTP/1.1 301 Moved Permanently');
header('Location: ' . $_SERVER['REQUEST_URI'] . '/' . $pt);
exit;
}
$a = realpath(Extract_Phar::$temp . DIRECTORY_SEPARATOR . $pt);
if (!$a || strlen(dirname($a)) < strlen(Extract_Phar::$temp)) {
header('HTTP/1.0 404 Not Found');
echo "<html>\n <head>\n  <title>File Not Found<title>\n </head>\n <body>\n  <h1>404 - File Not Found</h1>\n </body>\n</html>";
exit;
}
$b = pathinfo($a);
if (!isset($b['extension'])) {
header('Content-Type: text/plain');
header('Content-Length: ' . filesize($a));
readfile($a);
exit;
}
if (isset($mimes[$b['extension']])) {
if ($mimes[$b['extension']] === 1) {
include $a;
exit;
}
if ($mimes[$b['extension']] === 2) {
highlight_file($a);
exit;
}
header('Content-Type: ' .$mimes[$b['extension']]);
header('Content-Length: ' . filesize($a));
readfile($a);
exit;
}
}

class Extract_Phar
{
static $temp;
static $origdir;
const GZ = 0x1000;
const BZ2 = 0x2000;
const MASK = 0x3000;
const START = 'bin/joomla';
const LEN = 6644;

static function go($return = false)
{
$fp = fopen(__FILE__, 'rb');
fseek($fp, self::LEN);
$L = unpack('V', $a = fread($fp, 4));
$m = '';

do {
$read = 8192;
if ($L[1] - strlen($m) < 8192) {
$read = $L[1] - strlen($m);
}
$last = fread($fp, $read);
$m .= $last;
} while (strlen($last) && strlen($m) < $L[1]);

if (strlen($m) < $L[1]) {
die('ERROR: manifest length read was "' .
strlen($m) .'" should be "' .
$L[1] . '"');
}

$info = self::_unpack($m);
$f = $info['c'];

if ($f & self::GZ) {
if (!function_exists('gzinflate')) {
die('Error: zlib extension is not enabled -' .
' gzinflate() function needed for zlib-compressed .phars');
}
}

if ($f & self::BZ2) {
if (!function_exists('bzdecompress')) {
die('Error: bzip2 extension is not enabled -' .
' bzdecompress() function needed for bz2-compressed .phars');
}
}

$temp = self::tmpdir();

if (!$temp || !is_writable($temp)) {
$sessionpath = session_save_path();
if (strpos ($sessionpath, ";") !== false)
$sessionpath = substr ($sessionpath, strpos ($sessionpath, ";")+1);
if (!file_exists($sessionpath) || !is_dir($sessionpath)) {
die('Could not locate temporary directory to extract phar');
}
$temp = $sessionpath;
}

$temp .= '/pharextract/'.basename(__FILE__, '.phar');
self::$temp = $temp;
self::$origdir = getcwd();
@mkdir($temp, 0777, true);
$temp = realpath($temp);

if (!file_exists($temp . DIRECTORY_SEPARATOR . md5_file(__FILE__))) {
self::_removeTmpFiles($temp, getcwd());
@mkdir($temp, 0777, true);
@file_put_contents($temp . '/' . md5_file(__FILE__), '');

foreach ($info['m'] as $path => $file) {
$a = !file_exists(dirname($temp . '/' . $path));
@mkdir(dirname($temp . '/' . $path), 0777, true);
clearstatcache();

if ($path[strlen($path) - 1] == '/') {
@mkdir($temp . '/' . $path, 0777);
} else {
file_put_contents($temp . '/' . $path, self::extractFile($path, $file, $fp));
@chmod($temp . '/' . $path, 0666);
}
}
}

chdir($temp);

if (!$return) {
include self::START;
}
}

static function tmpdir()
{
if (strpos(PHP_OS, 'WIN') !== false) {
if ($var = getenv('TMP') ? getenv('TMP') : getenv('TEMP')) {
return $var;
}
if (is_dir('/temp') || mkdir('/temp')) {
return realpath('/temp');
}
return false;
}
if ($var = getenv('TMPDIR')) {
return $var;
}
return realpath('/tmp');
}

static function _unpack($m)
{
$info = unpack('V', substr($m, 0, 4));
 $l = unpack('V', substr($m, 10, 4));
$m = substr($m, 14 + $l[1]);
$s = unpack('V', substr($m, 0, 4));
$o = 0;
$start = 4 + $s[1];
$ret['c'] = 0;

for ($i = 0; $i < $info[1]; $i++) {
 $len = unpack('V', substr($m, $start, 4));
$start += 4;
 $savepath = substr($m, $start, $len[1]);
$start += $len[1];
   $ret['m'][$savepath] = array_values(unpack('Va/Vb/Vc/Vd/Ve/Vf', substr($m, $start, 24)));
$ret['m'][$savepath][3] = sprintf('%u', $ret['m'][$savepath][3]
& 0xffffffff);
$ret['m'][$savepath][7] = $o;
$o += $ret['m'][$savepath][2];
$start += 24 + $ret['m'][$savepath][5];
$ret['c'] |= $ret['m'][$savepath][4] & self::MASK;
}
return $ret;
}

static function extractFile($path, $entry, $fp)
{
$data = '';
$c = $entry[2];

while ($c) {
if ($c < 8192) {
$data .= @fread($fp, $c);
$c = 0;
} else {
$c -= 8192;
$data .= @fread($fp, 8192);
}
}

if ($entry[4] & self::GZ) {
$data = gzinflate($data);
} elseif ($entry[4] & self::BZ2) {
$data = bzdecompress($data);
}

if (strlen($data) != $entry[0]) {
die("Invalid internal .phar file (size error " . strlen($data) . " != " .
$stat[7] . ")");
}

if ($entry[3] != sprintf("%u", crc32($data) & 0xffffffff)) {
die("Invalid internal .phar file (checksum error)");
}

return $data;
}

static function _removeTmpFiles($temp, $origdir)
{
chdir($temp);

foreach (glob('*') as $f) {
if (file_exists($f)) {
is_dir($f) ? @rmdir($f) : @unlink($f);
if (file_exists($f) && is_dir($f)) {
self::_removeTmpFiles($f, getcwd());
}
}
}

@rmdir($temp);
clearstatcache();
chdir($origdir);
}
}

Extract_Phar::go();
__HALT_COMPILER(); ?>
@�s.git/descriptionI�ceI7�� .git/hooks/applypatch-msg.sample��ce��O�	�.git/hooks/commit-msg.sample��ce����.git/hooks/post-update.sample��ce����� .git/hooks/pre-applypatch.sample��ce��L�.git/hooks/pre-commit.samplek�cek�2�".git/hooks/pre-merge-commit.sample��ce�D?�^�.git/hooks/pre-push.sample^�ce^
��.git/hooks/pre-receive.sample �ce ����".git/hooks/push-to-checkout.sample�
�ce�
���.git/hooks/update.sampleB�ceB���$.git/hooks/fsmonitor-watchman.samplev�cev�|<y�.git/hooks/pre-rebase.sample"�ce"��XQ�$.git/hooks/prepare-commit-msg.sample��ce��60�.git/info/exclude��ce�w=�!�.git/refs/heads/master)�ce)S�q_�.git/refs/remotes/origin/HEAD �ce �%Ԡ�/.git/refs/remotes/origin/feature/13-site_update)�ce)����,.git/refs/remotes/origin/feature/14-composer)�ce)��'.git/refs/remotes/origin/feature/47-url)�ce)	<1^�.git/refs/remotes/origin/master)�ce)S�q_�	.git/HEAD�ce+is��.git/config�ce��/�D.git/objects/pack/pack-a56d664b92787adc28326ca41b8a678c2d011736.pack��ce�!.��$C.git/objects/pack/pack-a56d664b92787adc28326ca41b8a678c2d011736.idxH��ceH�_6�$6.git/objects/48/34a3fba9a8951087775843178ea6f62def8b92��ce��w�H$6.git/objects/08/315dbd8218aaa9baa21ebe3f746e8256209e27��ce�0�n�$6.git/objects/16/7f539055479c9cf2c952164f47177de5f28787S�ceSF�2�$6.git/objects/ac/410d6fd778959d03f066f68b92570bf7a841875�ce5�=4-$6.git/objects/c6/0270d66013de7c15e130bec0cb4e2d4e6ba0331�ce1�Q��$6.git/objects/e1/03d6029b5ce137eadf68aa13e83d69551c52c5P�ceP�#��$6.git/objects/e1/5832a82d46b9a961195da6c7b67c654bd7f555k�cekgc`.$6.git/objects/93/ec1f926c2455c4494bc7c0ae92c32a9d1373c2s�ces�u$6.git/objects/43/6a26052cb7fa3a168cacc7f58b070cb2597e7a5�ce5��	�$6.git/objects/10/4d54f4d55bcaa4029a7d3c5eac224e7ab319951�ce1����$6.git/objects/10/0d073284a635c75ec4ec2a0435ada1e9ba98139�ce9�wh�$6.git/objects/9e/6e9636b5f8f9166bc114a61a0c343288426051�ce\�W$6.git/objects/18/d6e9bbc5e45ffe1077039e442a9c07a36951fe�ce>�-�$6.git/objects/47/15a87ae41e1aa52852757f631675bc6ce8393f��ce���$6.git/objects/23/6f4c0a2706a5ad18669483d9a5bca1a7244f72��ce����	$6.git/objects/e5/148e4a99f69a57ac50ac53f33bcb43692fdad4��ce����$6.git/objects/83/c96367b98018839d50a1280f43599bca98b429V�ceV�2��$6.git/objects/6e/c790820525fbaba7bb527e45114f3757969273��ce�`�P�$6.git/objects/0b/4beb082e98e051ab54dba4dcc3e59aab20c7a9|�ce|�&Д$6.git/objects/0b/e27c3e931e3ab2268345b11b79cc19bf1e969e1�ce1��D<$6.git/objects/5d/3c5bd7bb846b1153dc73842af6b249d99b5282U�ceUZ|�$6.git/objects/88/3230f282b2221a5a8d466ff469be1ed9aafa73>�ce>6� �$6.git/objects/69/9ed8909b1a22c975f39db0a96cf38ae05d4672R
�ceR
v���$6.git/objects/1a/0881180ff5ddef887082cd1e2c8aa1b35f6b62��ce�_��$6.git/objects/d8/710e385fe49706924dc9c11080f29c156451e9+�ce+J�h�$6.git/objects/24/f62b86623706601d4671843b9e5b17586cc40e��ce�B#�x$6.git/objects/03/68d8bfaab70ae5a4dde61dd53983148ab847f9B�ceB—G�$6.git/objects/df/3327eff140747ef3c5ee90b42097b3634ca080��ce���Q;$6.git/objects/45/e6f34cb48bd9884f7999b8747861c528de4ea8s�ces� g$6.git/objects/a5/da33ae39563c6ae3778381f89496828b42e0d8�ce��s$6.git/objects/65/7756bd17f286c7342f57acce09b6dcb9d2963b��ce���$6.git/objects/4a/a006f369ed813c8d2890b5ca42b72d7e4c1f71��ce��a�v$6.git/objects/6b/4163fd43717d12154b7d16ebb14bd6173533d2��ce�����$6.git/objects/61/1bd340ce975ecae84a1acf7f3434d7c52c3f215�ce5�Ww�$6.git/objects/1f/51132ae26d67cc5132aa078c98b992839fbc48|�ce|K�ei$6.git/objects/c5/821f2f7d819c93574130d021aedf7871198da0��ce��Oos$.git/packed-refs�
�ce�
��3ۤ".git/logs/refs/remotes/origin/HEAD��ce�)Pcb�4.git/logs/refs/remotes/origin/feature/13-site_update��ce�<��#�1.git/logs/refs/remotes/origin/feature/14-composer��ce���I��,.git/logs/refs/remotes/origin/feature/47-url��ce���]L�$.git/logs/refs/remotes/origin/master6�ce6p�|�.git/logs/refs/heads/master\�ce\�KC�.git/logs/HEAD\�ce\�KC�
.git/index��ce���O�.git/FETCH_HEAD��ce����r�.git/ORIG_HEAD)�ce)�a���.git/COMMIT_EDITMSG)�ce)V1H��.gitattributes#�ce#ۥ6��.github/issue_template.md��ce��:x� .github/workflows/index-wiki.ymlu�ceu㝙�".github/workflows/pull-request.yml��ce��!�
.gitignore%�ce%��|٤CONTRIBUTING.mde�cee\폙�LICENSEi>�cei>T��	README.md��ce�jd��bin/.files/joomla2.users.sql��ce�� m�bin/.files/joomla3.users.sqlR�ceR����bin/.files/vhosts/apache.conf��ce�&�mH�
bin/joomla��ce����screenshot.png�&�ce�&���0�'src/Joomlatools/Console/Application.php�#�ce�#(\�=src/Joomlatools/Console/Command/Database/AbstractDatabase.php�ce�N[3�1src/Joomlatools/Console/Command/Database/Drop.phpI�ceI�2�t�3src/Joomlatools/Console/Command/Database/Export.php"�ce"J�Ť4src/Joomlatools/Console/Command/Database/Install.php� �ce� *쳟�?src/Joomlatools/Console/Command/Extension/AbstractExtension.php�ceD���5src/Joomlatools/Console/Command/Extension/Install.php&�ce&�5-�?src/Joomlatools/Console/Command/Extension/Iterator/Iterator.phpB�ceB�d��6src/Joomlatools/Console/Command/Extension/Register.phpB"�ceB"&֡!�5src/Joomlatools/Console/Command/Extension/Symlink.php�"�ce�"C=��2src/Joomlatools/Console/Command/Plugin/ListAll.php��ce��~��2src/Joomlatools/Console/Command/Plugin/Install.php��ce��y�f�4src/Joomlatools/Console/Command/Plugin/Uninstall.php��ce���T�5src/Joomlatools/Console/Command/Site/AbstractSite.php:
�ce:
�m;��2src/Joomlatools/Console/Command/Site/Configure.php.�ce.ߊ��/src/Joomlatools/Console/Command/Site/Create.php�(�ce�(O�<��/src/Joomlatools/Console/Command/Site/Delete.php��ce��M5j�/src/Joomlatools/Console/Command/Site/Export.php�
�ce�
�]�դ0src/Joomlatools/Console/Command/Site/Install.php�ceZf3[�0src/Joomlatools/Console/Command/Site/Listing.php��ce�N�`�1src/Joomlatools/Console/Command/Site/Download.phpN5�ceN5�k�,src/Joomlatools/Console/Command/Versions.phpE�ceE ��-�0src/Joomlatools/Console/Command/Vhost/Create.php��ce���<z�0src/Joomlatools/Console/Command/Vhost/Remove.php��ce�Sȑ��0src/Joomlatools/Console/Command/Configurable.php�	�ce�	!���.src/Joomlatools/Console/Joomla/Application.php�>�ce�>&4L(�/src/Joomlatools/Console/Joomla/Bootstrapper.php!	�ce!	xI��(src/Joomlatools/Console/Joomla/Cache.php_�ce_h�!/�'src/Joomlatools/Console/Joomla/Util.phpL�ceL�0���1src/Joomlatools/Console/Joomla/VersionSniffer.php��ce�+�%٤=src/Joomlatools/Console/Symlinkers/joomlatools-components.php�
�ce�
=��ޤ<src/Joomlatools/Console/Symlinkers/joomlatools-framework.php�
�ce�
�Vt�%vendor/symfony/polyfill-php73/LICENSE,�ce,����'vendor/symfony/polyfill-php73/Php73.phpb�cebJ�<�'vendor/symfony/polyfill-php73/README.md/�ce/�m��?vendor/symfony/polyfill-php73/Resources/stubs/JsonException.phpE�ceE8S��+vendor/symfony/polyfill-php73/bootstrap.php��ce���|�+vendor/symfony/polyfill-php73/composer.json��ce�����%vendor/symfony/polyfill-php80/LICENSE,�ce,K�'vendor/symfony/polyfill-php80/Php80.php�
�ce�
cH���*vendor/symfony/polyfill-php80/PhpToken.php��ce�]f�'vendor/symfony/polyfill-php80/README.md��ce�"t�F�;vendor/symfony/polyfill-php80/Resources/stubs/Attribute.php��ce�MK�<�:vendor/symfony/polyfill-php80/Resources/stubs/PhpToken.phpw�cew=7T8�<vendor/symfony/polyfill-php80/Resources/stubs/Stringable.php��ce�t]\ڤEvendor/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.phpG�ceGֈ+�<vendor/symfony/polyfill-php80/Resources/stubs/ValueError.php>�ce>g���+vendor/symfony/polyfill-php80/bootstrap.php��ce��.Ĥ+vendor/symfony/polyfill-php80/composer.json=�ce=`�sǤ(vendor/symfony/polyfill-mbstring/LICENSE,�ce,��H�-vendor/symfony/polyfill-mbstring/Mbstring.php�}�ce�}{.L�*vendor/symfony/polyfill-mbstring/README.mdr�cer�A`�Bvendor/symfony/polyfill-mbstring/Resources/unidata/caseFolding.phpa	�cea	�|ⳤ@vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php�_�ce�_���d�Fvendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php9�ce9>|zK�@vendor/symfony/polyfill-mbstring/Resources/unidata/upperCase.php�f�ce�f�P��.vendor/symfony/polyfill-mbstring/bootstrap.phpV�ceV��m<�0vendor/symfony/polyfill-mbstring/bootstrap80.phpa#�cea#�,��.vendor/symfony/polyfill-mbstring/composer.json �ce ��N��2vendor/symfony/polyfill-intl-grapheme/Grapheme.php8&�ce8&��I�-vendor/symfony/polyfill-intl-grapheme/LICENSE,�ce,��H�/vendor/symfony/polyfill-intl-grapheme/README.mdK�ceKC�>�3vendor/symfony/polyfill-intl-grapheme/bootstrap.php��ce����5vendor/symfony/polyfill-intl-grapheme/bootstrap80.phpg
�ceg
��E{�3vendor/symfony/polyfill-intl-grapheme/composer.json�ce��ʤ'vendor/symfony/polyfill-ctype/Ctype.php��ce�xs��%vendor/symfony/polyfill-ctype/LICENSE,�ce,����'vendor/symfony/polyfill-ctype/README.md^�ce^lH�k�+vendor/symfony/polyfill-ctype/bootstrap.php@�ce@j�Q9�-vendor/symfony/polyfill-ctype/bootstrap80.phpr�cer�F)��+vendor/symfony/polyfill-ctype/composer.json	�ce	KBv��(vendor/symfony/string/AbstractString.php�O�ce�O<&��/vendor/symfony/string/AbstractUnicodeString.php�k�ce�k�}ݤ$vendor/symfony/string/ByteString.phpL<�ceL<ráE�"vendor/symfony/string/CHANGELOG.mdD�ceD����)vendor/symfony/string/CodePointString.php{�ce{n^t�6vendor/symfony/string/Exception/ExceptionInterface.phpQ�ceQ$��դ<vendor/symfony/string/Exception/InvalidArgumentException.php��ce�e����4vendor/symfony/string/Exception/RuntimeException.phpp�cep��0ʤ4vendor/symfony/string/Inflector/EnglishInflector.php8>�ce8>��f�3vendor/symfony/string/Inflector/FrenchInflector.php��ce�W���6vendor/symfony/string/Inflector/InflectorInterface.phpC�ceCQ�cc�vendor/symfony/string/LICENSE,�ce,զ_Ϥ$vendor/symfony/string/LazyString.phpc�cec��(ݤvendor/symfony/string/README.md+�ce+�L���<vendor/symfony/string/Resources/data/wcswidth_table_wide.php.1�ce.1��Pu�<vendor/symfony/string/Resources/data/wcswidth_table_zero.php�:�ce�:��-vendor/symfony/string/Resources/functions.php]�ce]�ې�.vendor/symfony/string/Slugger/AsciiSlugger.php��ce�e���2vendor/symfony/string/Slugger/SluggerInterface.php��ce�"�O��'vendor/symfony/string/UnicodeString.phpC2�ceC2j8���#vendor/symfony/string/composer.jsonn�cen�8��/vendor/symfony/deprecation-contracts/.gitignore"�ce"�U�1vendor/symfony/deprecation-contracts/CHANGELOG.md��ce�h{#�,vendor/symfony/deprecation-contracts/LICENSE)�ce)�2�.vendor/symfony/deprecation-contracts/README.md��ce���3�2vendor/symfony/deprecation-contracts/composer.jsonI�ceI,�H��1vendor/symfony/deprecation-contracts/function.php��ce�rg��+vendor/symfony/service-contracts/.gitignore"�ce"�U�7vendor/symfony/service-contracts/Attribute/Required.php��ce�e;Z�@vendor/symfony/service-contracts/Attribute/SubscribedService.php �ce ���-vendor/symfony/service-contracts/CHANGELOG.md��ce�h{#�(vendor/symfony/service-contracts/LICENSE)�ce)5古*vendor/symfony/service-contracts/README.mdL�ceL�Ȥ3vendor/symfony/service-contracts/ResetInterface.php��ce��v��8vendor/symfony/service-contracts/ServiceLocatorTrait.php��ce�za
�=vendor/symfony/service-contracts/ServiceProviderInterface.php��ce��mX¤?vendor/symfony/service-contracts/ServiceSubscriberInterface.php��ce��B�6�;vendor/symfony/service-contracts/ServiceSubscriberTrait.php��ce��CѤ<vendor/symfony/service-contracts/Test/ServiceLocatorTest.php��ce���3ͤ.vendor/symfony/service-contracts/composer.jsonu�ceu�9�!�/vendor/symfony/polyfill-intl-normalizer/LICENSE,�ce,��H�6vendor/symfony/polyfill-intl-normalizer/Normalizer.phpd%�ced%u���1vendor/symfony/polyfill-intl-normalizer/README.md��ce�+t�K�Fvendor/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php��ce����%�Rvendor/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalComposition.php�D�ce�D'�CԤTvendor/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalDecomposition.php{��ce{��je��Lvendor/symfony/polyfill-intl-normalizer/Resources/unidata/combiningClass.phpD5�ceD5����Xvendor/symfony/polyfill-intl-normalizer/Resources/unidata/compatibilityDecomposition.phpo�ceoc�,��5vendor/symfony/polyfill-intl-normalizer/bootstrap.php��ce�#p��7vendor/symfony/polyfill-intl-normalizer/bootstrap80.php��ce��,��5vendor/symfony/polyfill-intl-normalizer/composer.jsonC�ceC�g � vendor/symfony/yaml/CHANGELOG.md��ce��Z¤+vendor/symfony/yaml/Command/LintCommand.php?"�ce?"Ub��vendor/symfony/yaml/Dumper.php��ce�ث5��vendor/symfony/yaml/Escaper.php��ce���N�/vendor/symfony/yaml/Exception/DumpException.php��ce���4vendor/symfony/yaml/Exception/ExceptionInterface.php��ce�B9��0vendor/symfony/yaml/Exception/ParseException.php%
�ce%
u`ȉ�2vendor/symfony/yaml/Exception/RuntimeException.php��ce��_q��vendor/symfony/yaml/Inline.phpo�ceo\�vC�vendor/symfony/yaml/LICENSE)�ce)a�x�vendor/symfony/yaml/Parser.php��ce�J���vendor/symfony/yaml/README.md��ce��ـT�'vendor/symfony/yaml/Tag/TaggedValue.php��ce�n��%�!vendor/symfony/yaml/Unescaper.php)�ce)WY&X�vendor/symfony/yaml/Yaml.php�ceijὤ!vendor/symfony/yaml/composer.json��ce�{��c�&vendor/symfony/console/Application.php%��ce%�G���.vendor/symfony/console/Attribute/AsCommand.php]�ce]֚��#vendor/symfony/console/CHANGELOG.md� �ce� �P���2vendor/symfony/console/CI/GithubActionReporter.php?�ce?�"l� vendor/symfony/console/Color.php��ce�*<�!�*vendor/symfony/console/Command/Command.phpP�cePVn�t�2vendor/symfony/console/Command/CompleteCommand.phpV!�ceV!!=�N�8vendor/symfony/console/Command/DumpCompletionCommand.php=�ce=�"i5�.vendor/symfony/console/Command/HelpCommand.php(�ce(��͚�.vendor/symfony/console/Command/LazyCommand.php	�ce	�?��.vendor/symfony/console/Command/ListCommand.phpB�ceBZ$F�0vendor/symfony/console/Command/LockableTrait.php��ce��?��=vendor/symfony/console/Command/SignalableCommandInterface.php��ce�Ge�M�?vendor/symfony/console/CommandLoader/CommandLoaderInterface.phpM�ceM��d5�?vendor/symfony/console/CommandLoader/ContainerCommandLoader.php��ce���0w�=vendor/symfony/console/CommandLoader/FactoryCommandLoader.phpE�ceE=H���5vendor/symfony/console/Completion/CompletionInput.php
 �ce
 #���;vendor/symfony/console/Completion/CompletionSuggestions.phpN�ceN��(�Avendor/symfony/console/Completion/Output/BashCompletionOutput.php��ce��S��Fvendor/symfony/console/Completion/Output/CompletionOutputInterface.php��ce�3��O�0vendor/symfony/console/Completion/Suggestion.php��ce�b�ۋ�(vendor/symfony/console/ConsoleEvents.php~�ce~~6��!vendor/symfony/console/Cursor.php"�ce"і��Dvendor/symfony/console/DependencyInjection/AddConsoleCommandPass.php"�ce"䪴��<vendor/symfony/console/Descriptor/ApplicationDescription.php��ce�-���0vendor/symfony/console/Descriptor/Descriptor.php��ce��k%9�9vendor/symfony/console/Descriptor/DescriptorInterface.php-�ce-0�M$�4vendor/symfony/console/Descriptor/JsonDescriptor.php��ce��j�8vendor/symfony/console/Descriptor/MarkdownDescriptor.php��ce���4{�4vendor/symfony/console/Descriptor/TextDescriptor.phpL1�ceL1�ቜ�3vendor/symfony/console/Descriptor/XmlDescriptor.php�&�ce�&[
�4vendor/symfony/console/Event/ConsoleCommandEvent.php��ce����2vendor/symfony/console/Event/ConsoleErrorEvent.php��ce�T��Τ-vendor/symfony/console/Event/ConsoleEvent.phpt�cet:�[&�3vendor/symfony/console/Event/ConsoleSignalEvent.php��ce�b��6vendor/symfony/console/Event/ConsoleTerminateEvent.php"�ce"�q���6vendor/symfony/console/EventListener/ErrorListener.php�ce\q%;�=vendor/symfony/console/Exception/CommandNotFoundException.php��ce����7vendor/symfony/console/Exception/ExceptionInterface.php��ce��l�=vendor/symfony/console/Exception/InvalidArgumentException.php��ce��u i�;vendor/symfony/console/Exception/InvalidOptionException.php�ce/e�l�3vendor/symfony/console/Exception/LogicException.php��ce�SML��:vendor/symfony/console/Exception/MissingInputException.php��ce�Q�g;�?vendor/symfony/console/Exception/NamespaceNotFoundException.php��ce�BL�H�5vendor/symfony/console/Exception/RuntimeException.php��ce��*b�8vendor/symfony/console/Formatter/NullOutputFormatter.phpY�ceY��pɤ=vendor/symfony/console/Formatter/NullOutputFormatterStyle.php��ce�{=X��4vendor/symfony/console/Formatter/OutputFormatter.phpz �cez �!�=vendor/symfony/console/Formatter/OutputFormatterInterface.php7�ce7?�V��9vendor/symfony/console/Formatter/OutputFormatterStyle.php��ce��GH�Bvendor/symfony/console/Formatter/OutputFormatterStyleInterface.phpZ�ceZs���>vendor/symfony/console/Formatter/OutputFormatterStyleStack.php�	�ce�	�*���Fvendor/symfony/console/Formatter/WrappableOutputFormatterInterface.php��ce�}z��6vendor/symfony/console/Helper/DebugFormatterHelper.phpJ
�ceJ
G�(��2vendor/symfony/console/Helper/DescriptorHelper.php�	�ce�	X^}ߤ(vendor/symfony/console/Helper/Dumper.php��ce�+'�f�1vendor/symfony/console/Helper/FormatterHelper.phpX	�ceX	u�wY�(vendor/symfony/console/Helper/Helper.php@�ce@O�1�1vendor/symfony/console/Helper/HelperInterface.phpM�ceMd��8�+vendor/symfony/console/Helper/HelperSet.php
�ce
@����2vendor/symfony/console/Helper/InputAwareHelper.php��ce����/vendor/symfony/console/Helper/ProcessHelper.phpu�ceu���-vendor/symfony/console/Helper/ProgressBar.php�H�ce�H�x�h�3vendor/symfony/console/Helper/ProgressIndicator.php4�ce4	���0vendor/symfony/console/Helper/QuestionHelper.php�M�ce�M〢��7vendor/symfony/console/Helper/SymfonyQuestionHelper.php��ce��3T�'vendor/symfony/console/Helper/Table.php�s�ce�s�s�h�+vendor/symfony/console/Helper/TableCell.php�ce��.�0vendor/symfony/console/Helper/TableCellStyle.php��ce�-7��+vendor/symfony/console/Helper/TableRows.phpE�ceE��a��0vendor/symfony/console/Helper/TableSeparator.php�ce&��
�,vendor/symfony/console/Helper/TableStyle.php�1�ce�1���o�*vendor/symfony/console/Input/ArgvInput.php}0�ce}0K�~U�+vendor/symfony/console/Input/ArrayInput.php��ce��.�'�&vendor/symfony/console/Input/Input.php�ce���.vendor/symfony/console/Input/InputArgument.phpt
�cet
�=Eo�4vendor/symfony/console/Input/InputAwareInterface.php:�ce:� '��0vendor/symfony/console/Input/InputDefinition.php�.�ce�.���/vendor/symfony/console/Input/InputInterface.phpm�cem�Ӿ}�,vendor/symfony/console/Input/InputOption.phpU�ceUT��9vendor/symfony/console/Input/StreamableInputInterface.phpi�cei���,vendor/symfony/console/Input/StringInput.php�
�ce�
H�?�vendor/symfony/console/LICENSE,�ce,���U�/vendor/symfony/console/Logger/ConsoleLogger.php��ce�U���0vendor/symfony/console/Output/BufferedOutput.phpU�ceUBE$ޤ/vendor/symfony/console/Output/ConsoleOutput.php6�ce6���8vendor/symfony/console/Output/ConsoleOutputInterface.php �ce _��6vendor/symfony/console/Output/ConsoleSectionOutput.phpW�ceW���m�,vendor/symfony/console/Output/NullOutput.php	�ce	��Ф(vendor/symfony/console/Output/Output.php=�ce=1��ؤ1vendor/symfony/console/Output/OutputInterface.php\�ce\��t��.vendor/symfony/console/Output/StreamOutput.php�
�ce�
�$?.�5vendor/symfony/console/Output/TrimmedBufferOutput.php;�ce;�<�)�2vendor/symfony/console/Question/ChoiceQuestion.php��ce����8vendor/symfony/console/Question/ConfirmationQuestion.php�ce?u�Ȥ,vendor/symfony/console/Question/Question.phpW�ceWM?|d� vendor/symfony/console/README.md��ce��=NP�4vendor/symfony/console/Resources/bin/hiddeninput.exe$�ce$���v�0vendor/symfony/console/Resources/completion.bash�
�ce�
�z(�8vendor/symfony/console/SignalRegistry/SignalRegistry.php1�ce1v�.��3vendor/symfony/console/SingleCommandApplication.php��ce��t���,vendor/symfony/console/Style/OutputStyle.php��ce������/vendor/symfony/console/Style/StyleInterface.phpM
�ceM
���)�-vendor/symfony/console/Style/SymfonyStyle.php 9�ce 9��ͨ�#vendor/symfony/console/Terminal.phpa�cea~�`�3vendor/symfony/console/Tester/ApplicationTester.php\
�ce\
�!t�9vendor/symfony/console/Tester/CommandCompletionTester.php�ce�t5N�/vendor/symfony/console/Tester/CommandTester.php:	�ce:	7)a��@vendor/symfony/console/Tester/Constraint/CommandIsSuccessful.php��ce�ѧز�-vendor/symfony/console/Tester/TesterTrait.php��ce��C���$vendor/symfony/console/composer.json=�ce=�|��vendor/composer/installed.json���ce��N]	դvendor/composer/installed.php��ce��Jd�%vendor/composer/InstalledVersions.php�:�ce�:畎K�'vendor/composer/autoload_namespaces.php��ce�/�Ӥ!vendor/composer/autoload_psr4.phpq�ceq���%vendor/composer/autoload_classmap.phpw�cew/���"vendor/composer/autoload_files.php��ce�>�6��#vendor/composer/autoload_static.php��ce�{W!�"vendor/composer/platform_check.php��ce���%��!vendor/composer/autoload_real.php��ce���vendor/composer/ClassLoader.php�>�ce�>�5Ky�vendor/composer/LICENSE.�ce. ��vendor/psr/container/.gitignore%�ce%ӷ}d�vendor/psr/container/LICENSEy�cey�O�p�vendor/psr/container/README.mdB�ceBg?�"vendor/psr/container/composer.json/�ce/����8vendor/psr/container/src/ContainerExceptionInterface.php��ce�B�x��/vendor/psr/container/src/ContainerInterface.php�cej��.�7vendor/psr/container/src/NotFoundExceptionInterface.php��ce�>�悤vendor/autoload.php��ce����դvendor/bin/php-parse
�ce
�2��vendor/nikic/php-parser/LICENSE��ce���*�!vendor/nikic/php-parser/README.md��ce���;E�%vendor/nikic/php-parser/bin/php-parsef�cef�
��%vendor/nikic/php-parser/composer.json0�ce0����)vendor/nikic/php-parser/grammar/README.md��ce���eդ/vendor/nikic/php-parser/grammar/parser.template	�ce	-ɚQ�&vendor/nikic/php-parser/grammar/php5.y���ce�����&vendor/nikic/php-parser/grammar/php7.y���ce��Y��,vendor/nikic/php-parser/grammar/phpyLang.phpn�cen�����2vendor/nikic/php-parser/grammar/rebuildParsers.php��ce���{�/vendor/nikic/php-parser/grammar/tokens.template*�ce*��_֤(vendor/nikic/php-parser/grammar/tokens.y�
�ce�
�C~j�1vendor/nikic/php-parser/lib/PhpParser/Builder.php��ce��m��<vendor/nikic/php-parser/lib/PhpParser/Builder/ClassConst.php��ce����8vendor/nikic/php-parser/lib/PhpParser/Builder/Class_.php��ce���o��=vendor/nikic/php-parser/lib/PhpParser/Builder/Declaration.php��ce����F�:vendor/nikic/php-parser/lib/PhpParser/Builder/EnumCase.phps�ces�^]��7vendor/nikic/php-parser/lib/PhpParser/Builder/Enum_.php��ce��Z<�>vendor/nikic/php-parser/lib/PhpParser/Builder/FunctionLike.php��ce�X�g#�;vendor/nikic/php-parser/lib/PhpParser/Builder/Function_.phpj�cej]��~�<vendor/nikic/php-parser/lib/PhpParser/Builder/Interface_.php�	�ce�	]��
�8vendor/nikic/php-parser/lib/PhpParser/Builder/Method.php��ce�Z?Ϗ�<vendor/nikic/php-parser/lib/PhpParser/Builder/Namespace_.php
�ce
O��Ĥ7vendor/nikic/php-parser/lib/PhpParser/Builder/Param.phpd�cedP�8٤:vendor/nikic/php-parser/lib/PhpParser/Builder/Property.php��ce����:vendor/nikic/php-parser/lib/PhpParser/Builder/TraitUse.php%�ce%�jB�Dvendor/nikic/php-parser/lib/PhpParser/Builder/TraitUseAdaptation.phpX�ceX��z�8vendor/nikic/php-parser/lib/PhpParser/Builder/Trait_.php��ce�@%6vendor/nikic/php-parser/lib/PhpParser/Builder/Use_.php��ce�
�A�8vendor/nikic/php-parser/lib/PhpParser/BuilderFactory.phpk+�cek+n�פ8vendor/nikic/php-parser/lib/PhpParser/BuilderHelpers.php%&�ce%&@�gH�1vendor/nikic/php-parser/lib/PhpParser/Comment.phpz�cez]5�+�5vendor/nikic/php-parser/lib/PhpParser/Comment/Doc.phpg�ceg���ѤFvendor/nikic/php-parser/lib/PhpParser/ConstExprEvaluationException.phpV�ceV�o5�<vendor/nikic/php-parser/lib/PhpParser/ConstExprEvaluator.php6$�ce6$�/��/vendor/nikic/php-parser/lib/PhpParser/Error.php��ce�#����6vendor/nikic/php-parser/lib/PhpParser/ErrorHandler.php&�ce&��E�Avendor/nikic/php-parser/lib/PhpParser/ErrorHandler/Collecting.phpp�cep�z|��?vendor/nikic/php-parser/lib/PhpParser/ErrorHandler/Throwing.phpj�cej�gH[�;vendor/nikic/php-parser/lib/PhpParser/Internal/DiffElem.php,�ce,�j�F�9vendor/nikic/php-parser/lib/PhpParser/Internal/Differ.php:�ce:�_��Lvendor/nikic/php-parser/lib/PhpParser/Internal/PrintableNewAnonClassNode.php��ce�+.P��>vendor/nikic/php-parser/lib/PhpParser/Internal/TokenStream.php+$�ce+$��R�5vendor/nikic/php-parser/lib/PhpParser/JsonDecoder.php/
�ce/
?%C��/vendor/nikic/php-parser/lib/PhpParser/Lexer.php^�ce^�|?�9vendor/nikic/php-parser/lib/PhpParser/Lexer/Emulative.phpa#�cea#0��d�Ovendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/AttributeEmulator.php��ce����ܤWvendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/CoaleseEqualTokenEmulator.php#�ce#E�Js�Ovendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/EnumTokenEmulator.php��ce��^z;�Svendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ExplicitOctalEmulator.php��ce��)~�Wvendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FlexibleDocStringEmulator.phpW	�ceW	.��n�Mvendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FnTokenEmulator.php��ce���
�Mvendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/KeywordEmulator.php��ce�&wQΤPvendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/MatchTokenEmulator.php��ce�����Svendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NullsafeTokenEmulator.php��ce�;.6$�]vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NumericLiteralSeparatorEmulator.phpF�ceF5�Z�[vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyFunctionTokenEmulator.php��ce��7�ϤSvendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyTokenEmulator.php��ce��KB�Mvendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReverseEmulator.php��ce���y�Kvendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/TokenEmulator.phpg�cegO�c�5vendor/nikic/php-parser/lib/PhpParser/NameContext.php�&�ce�&��l�.vendor/nikic/php-parser/lib/PhpParser/Node.php��ce�Nm��2vendor/nikic/php-parser/lib/PhpParser/Node/Arg.php'�ce'��]�8vendor/nikic/php-parser/lib/PhpParser/Node/Attribute.php(�ce(Oi��=vendor/nikic/php-parser/lib/PhpParser/Node/AttributeGroup.php��ce�V)�:vendor/nikic/php-parser/lib/PhpParser/Node/ComplexType.phpC�ceC�S?0�5vendor/nikic/php-parser/lib/PhpParser/Node/Const_.php��ce����3vendor/nikic/php-parser/lib/PhpParser/Node/Expr.php��ce�����Avendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayDimFetch.php8�ce8_�Ȥ=vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayItem.php]�ce]�)^�:vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Array_.php�ceJ�ي�Avendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrowFunction.phpR	�ceR	�C=/�:vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Assign.php�ce$��2�<vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp.php��ce�����Gvendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseAnd.php��ce�4�)̤Fvendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseOr.php��ce��W!�Gvendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseXor.php��ce�F�%�Evendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Coalesce.php��ce�wy�Cvendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Concat.php��ce�@-t��@vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Div.php��ce�K�֤Bvendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Minus.php��ce����a�@vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mod.php��ce��M��@vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mul.php��ce�FH�b�Avendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Plus.php��ce��k��@vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Pow.php��ce��eФFvendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftLeft.php��ce��8�Gvendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftRight.php��ce�Z��=vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignRef.php3�ce3�s�i�<vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp.phpZ�ceZT�Z��Gvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseAnd.php=�ce=��&�Fvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseOr.php;�ce;����Gvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseXor.php=�ce= ��¤Gvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanAnd.php>�ce>�.Jo�Fvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanOr.php<�ce<�!�G�Evendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Coalesce.php:�ce:oR�դCvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Concat.php5�ce5Ҕڧ�@vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Div.php/�ce/}bz�Bvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Equal.php4�ce4}�uz�Dvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Greater.php7�ce7��x�Kvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/GreaterOrEqual.phpF�ceFa�)�Fvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Identical.php=�ce=��{�Gvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalAnd.php?�ce?��{ΤFvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalOr.php<�ce<0�tޤGvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalXor.php?�ce?c��Bvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Minus.php3�ce3[�J�@vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mod.php/�ce/�� �@vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mul.php/�ce/���Evendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotEqual.php:�ce:�ӤIvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotIdentical.phpC�ceC����Avendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Plus.php1�ce1Ӏ�/�@vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Pow.php0�ce0�jH��Fvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftLeft.php<�ce<�����Gvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftRight.php>�ce>���Dvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Smaller.php7�ce7�
ޯ�Kvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/SmallerOrEqual.phpF�ceF�0�Fvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Spaceship.php=�ce=���>vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BitwiseNot.php��ce���F�>vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BooleanNot.php��ce�ZF'�<vendor/nikic/php-parser/lib/PhpParser/Node/Expr/CallLike.php��ce��LB �8vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast.php+�ce+�x�w�?vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Array_.php��ce�g,Gd�>vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Bool_.php��ce�
໤?vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Double.php}�ce}��pn�=vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Int_.php��ce�uh�	�@vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Object_.php��ce����@vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/String_.php��ce�����?vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Unset_.php��ce��2���Cvendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClassConstFetch.php��ce�_!ʤ:vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Clone_.phpv�cev���[�;vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Closure.phpj
�cej
�<���>vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClosureUse.phpq�ceq����>vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ConstFetch.php��ce��S�C�:vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Empty_.phpy�ceyz5ܤ9vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Error.php��ce��GӤAvendor/nikic/php-parser/lib/PhpParser/Node/Expr/ErrorSuppress.php��ce� 6�ä9vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Eval_.phpv�cev� }�9vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Exit_.php��ce�+�,1�<vendor/nikic/php-parser/lib/PhpParser/Node/Expr/FuncCall.php�cep�z�<vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Include_.php��ce��9̓�?vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Instanceof_.phpD�ceD�E�m�:vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Isset_.phpz�cez�u\Ф9vendor/nikic/php-parser/lib/PhpParser/Node/Expr/List_.php��ce��F*��:vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Match_.php��ce���5�>vendor/nikic/php-parser/lib/PhpParser/Node/Expr/MethodCall.php�celD��8vendor/nikic/php-parser/lib/PhpParser/Node/Expr/New_.phpZ�ceZk��Fvendor/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafeMethodCall.php5�ce5Kj/�Ivendor/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafePropertyFetch.php��ce�����;vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostDec.phpy�cey�ukd�;vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostInc.phpy�ceyHuJ/�:vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreDec.phpr�cer����:vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreInc.phpv�cevL��:vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Print_.phpy�ceyر֤Avendor/nikic/php-parser/lib/PhpParser/Node/Expr/PropertyFetch.php��ce�-�Ĥ=vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ShellExec.php��ce��,
 �>vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticCall.php,�ce,6K蒤Gvendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticPropertyFetch.php�cev��;vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Ternary.php��ce�6���:vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Throw_.php��ce�Fa�s�>vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryMinus.php��ce�	��=vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryPlus.php��ce�*�^u�<vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Variable.php��ce�o�V��=vendor/nikic/php-parser/lib/PhpParser/Node/Expr/YieldFrom.php��ce�?:��:vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Yield_.phpG�ceG����;vendor/nikic/php-parser/lib/PhpParser/Node/FunctionLike.php��ce�2�ɤ9vendor/nikic/php-parser/lib/PhpParser/Node/Identifier.php��ce��!�$�?vendor/nikic/php-parser/lib/PhpParser/Node/IntersectionType.php��ce����C�7vendor/nikic/php-parser/lib/PhpParser/Node/MatchArm.php��ce�/�m�3vendor/nikic/php-parser/lib/PhpParser/Node/Name.php.�ce.��W�Bvendor/nikic/php-parser/lib/PhpParser/Node/Name/FullyQualified.php��ce��aXϤ<vendor/nikic/php-parser/lib/PhpParser/Node/Name/Relative.php��ce�)FCs�;vendor/nikic/php-parser/lib/PhpParser/Node/NullableType.php��ce���(��4vendor/nikic/php-parser/lib/PhpParser/Node/Param.phpu�ceu&�.�5vendor/nikic/php-parser/lib/PhpParser/Node/Scalar.phpb�ceb�f���=vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/DNumber.php��ce���>vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/Encapsed.php��ce��OsL�Hvendor/nikic/php-parser/lib/PhpParser/Node/Scalar/EncapsedStringPart.php��ce�1y�h�=vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/LNumber.php�	�ce�	�IY-�@vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst.phpM�ceMT!��Gvendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Class_.phpA�ceAT�z�Dvendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Dir.php:�ce:!qp�Evendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/File.php=�ce=i��Jvendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Function_.phpJ�ceJ(�de�Evendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Line.php=�ce=��g�Gvendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Method.phpC�ceC�~O�Kvendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Namespace_.phpM�ceMu���Gvendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Trait_.phpA�ceA��d��=vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/String_.phpU�ceU�:�b�3vendor/nikic/php-parser/lib/PhpParser/Node/Stmt.php��ce�n��:vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Break_.php��ce���`s�9vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Case_.phpW�ceWU���:vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Catch_.phpi�cei�_g>�>vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassConst.php�	�ce�	��6�=vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassLike.phpz�cezEPT��?vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassMethod.php��ce�ށ[8�:vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Class_.phpZ�ceZ���9�:vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Const_.php��ce�h���=vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Continue_.php��ce�HW
�Bvendor/nikic/php-parser/lib/PhpParser/Node/Stmt/DeclareDeclare.php��ce�*��#�<vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Declare_.phpq�ceq�Y�!�7vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Do_.php-�ce-��+�9vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Echo_.php��ce�I�a��;vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ElseIf_.php4�ce4�q^k�9vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Else_.php��ce���RR�<vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/EnumCase.php��ce�n��Ҥ9vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Enum_.php%�ce%Y�V�>vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Expression.php��ce��I�ˤ<vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Finally_.php��ce�h�|�8vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/For_.php)�ce)�je�<vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Foreach_.phpY�ceY��&��=vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Function_.php�	�ce�	ݚ��;vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Global_.php��ce��exФ9vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Goto_.php��ce��ׂ�<vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/GroupUse.php��ce�Y�k�@vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/HaltCompiler.php��ce�F���7vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/If_.php%�ce%i4�&�>vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/InlineHTML.php��ce��Yv�>vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Interface_.php��ce��ٝ+�9vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Label.php��ce���C�>vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Namespace_.php��ce��9���7vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Nop.php-�ce-�u��<vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Property.php
�ce
��5�Dvendor/nikic/php-parser/lib/PhpParser/Node/Stmt/PropertyProperty.php��ce�_��w�;vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Return_.php��ce��W��=vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/StaticVar.php��ce�/bTS�;vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Static_.php��ce��e��;vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Switch_.php �ce ��ؤ:vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Throw_.php��ce�wתƤ<vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUse.php��ce�G�,%�Fvendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation.php
�ce
!L�Z�Lvendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Alias.php,�ce,9=6�Qvendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Precedence.phpE�ceEz�:vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Trait_.php��ce��Xv��<vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TryCatch.php�ce�od�:vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Unset_.php��ce��ɤ�:vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/UseUse.phpE�ceE��d�8vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Use_.phpX�ceX���:vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/While_.php0�ce0�]u�8vendor/nikic/php-parser/lib/PhpParser/Node/UnionType.php��ce��Ȯ.�@vendor/nikic/php-parser/lib/PhpParser/Node/VarLikeIdentifier.php��ce�j�FפBvendor/nikic/php-parser/lib/PhpParser/Node/VariadicPlaceholder.php}�ce} zh�6vendor/nikic/php-parser/lib/PhpParser/NodeAbstract.php�ce�<<��4vendor/nikic/php-parser/lib/PhpParser/NodeDumper.php��ce�i�\�4vendor/nikic/php-parser/lib/PhpParser/NodeFinder.php�	�ce�	�8MH�7vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php`)�ce`)<-Av�@vendor/nikic/php-parser/lib/PhpParser/NodeTraverserInterface.phpu�ceu}�Ť5vendor/nikic/php-parser/lib/PhpParser/NodeVisitor.php��ce�ZM�ͤDvendor/nikic/php-parser/lib/PhpParser/NodeVisitor/CloningVisitor.php��ce��z�a�Dvendor/nikic/php-parser/lib/PhpParser/NodeVisitor/FindingVisitor.phpb�cebh�ł�Ivendor/nikic/php-parser/lib/PhpParser/NodeVisitor/FirstFindingVisitor.php��ce�z�JB�Bvendor/nikic/php-parser/lib/PhpParser/NodeVisitor/NameResolver.php�%�ce�%}�5��Kvendor/nikic/php-parser/lib/PhpParser/NodeVisitor/NodeConnectingVisitor.phpp�cep��1��Mvendor/nikic/php-parser/lib/PhpParser/NodeVisitor/ParentConnectingVisitor.phpa�cea����=vendor/nikic/php-parser/lib/PhpParser/NodeVisitorAbstract.php��ce����X�0vendor/nikic/php-parser/lib/PhpParser/Parser.phpt�cetT�ﺤ9vendor/nikic/php-parser/lib/PhpParser/Parser/Multiple.phpt�cetO��5vendor/nikic/php-parser/lib/PhpParser/Parser/Php5.php
��ce
�w�Ҥ5vendor/nikic/php-parser/lib/PhpParser/Parser/Php7.php��ce�u0��7vendor/nikic/php-parser/lib/PhpParser/Parser/Tokens.php�cey��\�8vendor/nikic/php-parser/lib/PhpParser/ParserAbstract.php��ce�5=��7vendor/nikic/php-parser/lib/PhpParser/ParserFactory.phpN�ceN�up��@vendor/nikic/php-parser/lib/PhpParser/PrettyPrinter/Standard.php_��ce_�؏'�?vendor/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php��ce��N���.idea/encodings.xml��ce��t֤.idea/modules.xml)�ce)p�1��.idea/deployment.xml)�ce)����$.idea/codeStyles/codeStyleConfig.xml��ce���a.�.idea/joomlatools-console.iml��ce��D��.idea/workspace.xml~�ce~�]8�
.idea/php.xml��ce�bV9�
composer.json��ce��p�9�
composer.locka��cea���6�Unnamed repository; edit this file 'description' to name the repository.
#!/bin/sh
#
# An example hook script to check the commit log message taken by
# applypatch from an e-mail message.
#
# The hook should exit with non-zero status after issuing an
# appropriate message if it wants to stop the commit.  The hook is
# allowed to edit the commit message file.
#
# To enable this hook, rename this file to "applypatch-msg".

. git-sh-setup
commitmsg="$(git rev-parse --git-path hooks/commit-msg)"
test -x "$commitmsg" && exec "$commitmsg" ${1+"$@"}
:
#!/bin/sh
#
# An example hook script to check the commit log message.
# Called by "git commit" with one argument, the name of the file
# that has the commit message.  The hook should exit with non-zero
# status after issuing an appropriate message if it wants to stop the
# commit.  The hook is allowed to edit the commit message file.
#
# To enable this hook, rename this file to "commit-msg".

# Uncomment the below to add a Signed-off-by line to the message.
# Doing this in a hook is a bad idea in general, but the prepare-commit-msg
# hook is more suited to it.
#
# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p')
# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1"

# This example catches duplicate Signed-off-by lines.

test "" = "$(grep '^Signed-off-by: ' "$1" |
	 sort | uniq -c | sed -e '/^[ 	]*1[ 	]/d')" || {
	echo >&2 Duplicate Signed-off-by lines.
	exit 1
}
#!/bin/sh
#
# An example hook script to prepare a packed repository for use over
# dumb transports.
#
# To enable this hook, rename this file to "post-update".

exec git update-server-info
#!/bin/sh
#
# An example hook script to verify what is about to be committed
# by applypatch from an e-mail message.
#
# The hook should exit with non-zero status after issuing an
# appropriate message if it wants to stop the commit.
#
# To enable this hook, rename this file to "pre-applypatch".

. git-sh-setup
precommit="$(git rev-parse --git-path hooks/pre-commit)"
test -x "$precommit" && exec "$precommit" ${1+"$@"}
:
#!/bin/sh
#
# An example hook script to verify what is about to be committed.
# Called by "git commit" with no arguments.  The hook should
# exit with non-zero status after issuing an appropriate message if
# it wants to stop the commit.
#
# To enable this hook, rename this file to "pre-commit".

if git rev-parse --verify HEAD >/dev/null 2>&1
then
	against=HEAD
else
	# Initial commit: diff against an empty tree object
	against=$(git hash-object -t tree /dev/null)
fi

# If you want to allow non-ASCII filenames set this variable to true.
allownonascii=$(git config --type=bool hooks.allownonascii)

# Redirect output to stderr.
exec 1>&2

# Cross platform projects tend to avoid non-ASCII filenames; prevent
# them from being added to the repository. We exploit the fact that the
# printable range starts at the space character and ends with tilde.
if [ "$allownonascii" != "true" ] &&
	# Note that the use of brackets around a tr range is ok here, (it's
	# even required, for portability to Solaris 10's /usr/bin/tr), since
	# the square bracket bytes happen to fall in the designated range.
	test $(git diff --cached --name-only --diff-filter=A -z $against |
	  LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0
then
	cat <<\EOF
Error: Attempt to add a non-ASCII file name.

This can cause problems if you want to work with people on other platforms.

To be portable it is advisable to rename the file.

If you know what you are doing you can disable this check using:

  git config hooks.allownonascii true
EOF
	exit 1
fi

# If there are whitespace errors, print the offending file names and fail.
exec git diff-index --check --cached $against --
#!/bin/sh
#
# An example hook script to verify what is about to be committed.
# Called by "git merge" with no arguments.  The hook should
# exit with non-zero status after issuing an appropriate message to
# stderr if it wants to stop the merge commit.
#
# To enable this hook, rename this file to "pre-merge-commit".

. git-sh-setup
test -x "$GIT_DIR/hooks/pre-commit" &&
        exec "$GIT_DIR/hooks/pre-commit"
:
#!/bin/sh

# An example hook script to verify what is about to be pushed.  Called by "git
# push" after it has checked the remote status, but before anything has been
# pushed.  If this script exits with a non-zero status nothing will be pushed.
#
# This hook is called with the following parameters:
#
# $1 -- Name of the remote to which the push is being done
# $2 -- URL to which the push is being done
#
# If pushing without using a named remote those arguments will be equal.
#
# Information about the commits which are being pushed is supplied as lines to
# the standard input in the form:
#
#   <local ref> <local oid> <remote ref> <remote oid>
#
# This sample shows how to prevent push of commits where the log message starts
# with "WIP" (work in progress).

remote="$1"
url="$2"

zero=$(git hash-object --stdin </dev/null | tr '[0-9a-f]' '0')

while read local_ref local_oid remote_ref remote_oid
do
	if test "$local_oid" = "$zero"
	then
		# Handle delete
		:
	else
		if test "$remote_oid" = "$zero"
		then
			# New branch, examine all commits
			range="$local_oid"
		else
			# Update to existing branch, examine new commits
			range="$remote_oid..$local_oid"
		fi

		# Check for WIP commit
		commit=$(git rev-list -n 1 --grep '^WIP' "$range")
		if test -n "$commit"
		then
			echo >&2 "Found WIP commit in $local_ref, not pushing"
			exit 1
		fi
	fi
done

exit 0
#!/bin/sh
#
# An example hook script to make use of push options.
# The example simply echoes all push options that start with 'echoback='
# and rejects all pushes when the "reject" push option is used.
#
# To enable this hook, rename this file to "pre-receive".

if test -n "$GIT_PUSH_OPTION_COUNT"
then
	i=0
	while test "$i" -lt "$GIT_PUSH_OPTION_COUNT"
	do
		eval "value=\$GIT_PUSH_OPTION_$i"
		case "$value" in
		echoback=*)
			echo "echo from the pre-receive-hook: ${value#*=}" >&2
			;;
		reject)
			exit 1
		esac
		i=$((i + 1))
	done
fi
#!/bin/sh

# An example hook script to update a checked-out tree on a git push.
#
# This hook is invoked by git-receive-pack(1) when it reacts to git
# push and updates reference(s) in its repository, and when the push
# tries to update the branch that is currently checked out and the
# receive.denyCurrentBranch configuration variable is set to
# updateInstead.
#
# By default, such a push is refused if the working tree and the index
# of the remote repository has any difference from the currently
# checked out commit; when both the working tree and the index match
# the current commit, they are updated to match the newly pushed tip
# of the branch. This hook is to be used to override the default
# behaviour; however the code below reimplements the default behaviour
# as a starting point for convenient modification.
#
# The hook receives the commit with which the tip of the current
# branch is going to be updated:
commit=$1

# It can exit with a non-zero status to refuse the push (when it does
# so, it must not modify the index or the working tree).
die () {
	echo >&2 "$*"
	exit 1
}

# Or it can make any necessary changes to the working tree and to the
# index to bring them to the desired state when the tip of the current
# branch is updated to the new commit, and exit with a zero status.
#
# For example, the hook can simply run git read-tree -u -m HEAD "$1"
# in order to emulate git fetch that is run in the reverse direction
# with git push, as the two-tree form of git read-tree -u -m is
# essentially the same as git switch or git checkout that switches
# branches while keeping the local changes in the working tree that do
# not interfere with the difference between the branches.

# The below is a more-or-less exact translation to shell of the C code
# for the default behaviour for git's push-to-checkout hook defined in
# the push_to_deploy() function in builtin/receive-pack.c.
#
# Note that the hook will be executed from the repository directory,
# not from the working tree, so if you want to perform operations on
# the working tree, you will have to adapt your code accordingly, e.g.
# by adding "cd .." or using relative paths.

if ! git update-index -q --ignore-submodules --refresh
then
	die "Up-to-date check failed"
fi

if ! git diff-files --quiet --ignore-submodules --
then
	die "Working directory has unstaged changes"
fi

# This is a rough translation of:
#
#   head_has_history() ? "HEAD" : EMPTY_TREE_SHA1_HEX
if git cat-file -e HEAD 2>/dev/null
then
	head=HEAD
else
	head=$(git hash-object -t tree --stdin </dev/null)
fi

if ! git diff-index --quiet --cached --ignore-submodules $head --
then
	die "Working directory has staged changes"
fi

if ! git read-tree -u -m "$commit"
then
	die "Could not update working tree to new HEAD"
fi
#!/bin/sh
#
# An example hook script to block unannotated tags from entering.
# Called by "git receive-pack" with arguments: refname sha1-old sha1-new
#
# To enable this hook, rename this file to "update".
#
# Config
# ------
# hooks.allowunannotated
#   This boolean sets whether unannotated tags will be allowed into the
#   repository.  By default they won't be.
# hooks.allowdeletetag
#   This boolean sets whether deleting tags will be allowed in the
#   repository.  By default they won't be.
# hooks.allowmodifytag
#   This boolean sets whether a tag may be modified after creation. By default
#   it won't be.
# hooks.allowdeletebranch
#   This boolean sets whether deleting branches will be allowed in the
#   repository.  By default they won't be.
# hooks.denycreatebranch
#   This boolean sets whether remotely creating branches will be denied
#   in the repository.  By default this is allowed.
#

# --- Command line
refname="$1"
oldrev="$2"
newrev="$3"

# --- Safety check
if [ -z "$GIT_DIR" ]; then
	echo "Don't run this script from the command line." >&2
	echo " (if you want, you could supply GIT_DIR then run" >&2
	echo "  $0 <ref> <oldrev> <newrev>)" >&2
	exit 1
fi

if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then
	echo "usage: $0 <ref> <oldrev> <newrev>" >&2
	exit 1
fi

# --- Config
allowunannotated=$(git config --type=bool hooks.allowunannotated)
allowdeletebranch=$(git config --type=bool hooks.allowdeletebranch)
denycreatebranch=$(git config --type=bool hooks.denycreatebranch)
allowdeletetag=$(git config --type=bool hooks.allowdeletetag)
allowmodifytag=$(git config --type=bool hooks.allowmodifytag)

# check for no description
projectdesc=$(sed -e '1q' "$GIT_DIR/description")
case "$projectdesc" in
"Unnamed repository"* | "")
	echo "*** Project description file hasn't been set" >&2
	exit 1
	;;
esac

# --- Check types
# if $newrev is 0000...0000, it's a commit to delete a ref.
zero=$(git hash-object --stdin </dev/null | tr '[0-9a-f]' '0')
if [ "$newrev" = "$zero" ]; then
	newrev_type=delete
else
	newrev_type=$(git cat-file -t $newrev)
fi

case "$refname","$newrev_type" in
	refs/tags/*,commit)
		# un-annotated tag
		short_refname=${refname##refs/tags/}
		if [ "$allowunannotated" != "true" ]; then
			echo "*** The un-annotated tag, $short_refname, is not allowed in this repository" >&2
			echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2
			exit 1
		fi
		;;
	refs/tags/*,delete)
		# delete tag
		if [ "$allowdeletetag" != "true" ]; then
			echo "*** Deleting a tag is not allowed in this repository" >&2
			exit 1
		fi
		;;
	refs/tags/*,tag)
		# annotated tag
		if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1
		then
			echo "*** Tag '$refname' already exists." >&2
			echo "*** Modifying a tag is not allowed in this repository." >&2
			exit 1
		fi
		;;
	refs/heads/*,commit)
		# branch
		if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then
			echo "*** Creating a branch is not allowed in this repository" >&2
			exit 1
		fi
		;;
	refs/heads/*,delete)
		# delete branch
		if [ "$allowdeletebranch" != "true" ]; then
			echo "*** Deleting a branch is not allowed in this repository" >&2
			exit 1
		fi
		;;
	refs/remotes/*,commit)
		# tracking branch
		;;
	refs/remotes/*,delete)
		# delete tracking branch
		if [ "$allowdeletebranch" != "true" ]; then
			echo "*** Deleting a tracking branch is not allowed in this repository" >&2
			exit 1
		fi
		;;
	*)
		# Anything else (is there anything else?)
		echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2
		exit 1
		;;
esac

# --- Finished
exit 0
#!/usr/bin/perl

use strict;
use warnings;
use IPC::Open2;

# An example hook script to integrate Watchman
# (https://facebook.github.io/watchman/) with git to speed up detecting
# new and modified files.
#
# The hook is passed a version (currently 2) and last update token
# formatted as a string and outputs to stdout a new update token and
# all files that have been modified since the update token. Paths must
# be relative to the root of the working tree and separated by a single NUL.
#
# To enable this hook, rename this file to "query-watchman" and set
# 'git config core.fsmonitor .git/hooks/query-watchman'
#
my ($version, $last_update_token) = @ARGV;

# Uncomment for debugging
# print STDERR "$0 $version $last_update_token\n";

# Check the hook interface version
if ($version ne 2) {
	die "Unsupported query-fsmonitor hook version '$version'.\n" .
	    "Falling back to scanning...\n";
}

my $git_work_tree = get_working_dir();

my $retry = 1;

my $json_pkg;
eval {
	require JSON::XS;
	$json_pkg = "JSON::XS";
	1;
} or do {
	require JSON::PP;
	$json_pkg = "JSON::PP";
};

launch_watchman();

sub launch_watchman {
	my $o = watchman_query();
	if (is_work_tree_watched($o)) {
		output_result($o->{clock}, @{$o->{files}});
	}
}

sub output_result {
	my ($clockid, @files) = @_;

	# Uncomment for debugging watchman output
	# open (my $fh, ">", ".git/watchman-output.out");
	# binmode $fh, ":utf8";
	# print $fh "$clockid\n@files\n";
	# close $fh;

	binmode STDOUT, ":utf8";
	print $clockid;
	print "\0";
	local $, = "\0";
	print @files;
}

sub watchman_clock {
	my $response = qx/watchman clock "$git_work_tree"/;
	die "Failed to get clock id on '$git_work_tree'.\n" .
		"Falling back to scanning...\n" if $? != 0;

	return $json_pkg->new->utf8->decode($response);
}

sub watchman_query {
	my $pid = open2(\*CHLD_OUT, \*CHLD_IN, 'watchman -j --no-pretty')
	or die "open2() failed: $!\n" .
	"Falling back to scanning...\n";

	# In the query expression below we're asking for names of files that
	# changed since $last_update_token but not from the .git folder.
	#
	# To accomplish this, we're using the "since" generator to use the
	# recency index to select candidate nodes and "fields" to limit the
	# output to file names only. Then we're using the "expression" term to
	# further constrain the results.
	my $last_update_line = "";
	if (substr($last_update_token, 0, 1) eq "c") {
		$last_update_token = "\"$last_update_token\"";
		$last_update_line = qq[\n"since": $last_update_token,];
	}
	my $query = <<"	END";
		["query", "$git_work_tree", {$last_update_line
			"fields": ["name"],
			"expression": ["not", ["dirname", ".git"]]
		}]
	END

	# Uncomment for debugging the watchman query
	# open (my $fh, ">", ".git/watchman-query.json");
	# print $fh $query;
	# close $fh;

	print CHLD_IN $query;
	close CHLD_IN;
	my $response = do {local $/; <CHLD_OUT>};

	# Uncomment for debugging the watch response
	# open ($fh, ">", ".git/watchman-response.json");
	# print $fh $response;
	# close $fh;

	die "Watchman: command returned no output.\n" .
	"Falling back to scanning...\n" if $response eq "";
	die "Watchman: command returned invalid output: $response\n" .
	"Falling back to scanning...\n" unless $response =~ /^\{/;

	return $json_pkg->new->utf8->decode($response);
}

sub is_work_tree_watched {
	my ($output) = @_;
	my $error = $output->{error};
	if ($retry > 0 and $error and $error =~ m/unable to resolve root .* directory (.*) is not watched/) {
		$retry--;
		my $response = qx/watchman watch "$git_work_tree"/;
		die "Failed to make watchman watch '$git_work_tree'.\n" .
		    "Falling back to scanning...\n" if $? != 0;
		$output = $json_pkg->new->utf8->decode($response);
		$error = $output->{error};
		die "Watchman: $error.\n" .
		"Falling back to scanning...\n" if $error;

		# Uncomment for debugging watchman output
		# open (my $fh, ">", ".git/watchman-output.out");
		# close $fh;

		# Watchman will always return all files on the first query so
		# return the fast "everything is dirty" flag to git and do the
		# Watchman query just to get it over with now so we won't pay
		# the cost in git to look up each individual file.
		my $o = watchman_clock();
		$error = $output->{error};

		die "Watchman: $error.\n" .
		"Falling back to scanning...\n" if $error;

		output_result($o->{clock}, ("/"));
		$last_update_token = $o->{clock};

		eval { launch_watchman() };
		return 0;
	}

	die "Watchman: $error.\n" .
	"Falling back to scanning...\n" if $error;

	return 1;
}

sub get_working_dir {
	my $working_dir;
	if ($^O =~ 'msys' || $^O =~ 'cygwin') {
		$working_dir = Win32::GetCwd();
		$working_dir =~ tr/\\/\//;
	} else {
		require Cwd;
		$working_dir = Cwd::cwd();
	}

	return $working_dir;
}
#!/bin/sh
#
# Copyright (c) 2006, 2008 Junio C Hamano
#
# The "pre-rebase" hook is run just before "git rebase" starts doing
# its job, and can prevent the command from running by exiting with
# non-zero status.
#
# The hook is called with the following parameters:
#
# $1 -- the upstream the series was forked from.
# $2 -- the branch being rebased (or empty when rebasing the current branch).
#
# This sample shows how to prevent topic branches that are already
# merged to 'next' branch from getting rebased, because allowing it
# would result in rebasing already published history.

publish=next
basebranch="$1"
if test "$#" = 2
then
	topic="refs/heads/$2"
else
	topic=`git symbolic-ref HEAD` ||
	exit 0 ;# we do not interrupt rebasing detached HEAD
fi

case "$topic" in
refs/heads/??/*)
	;;
*)
	exit 0 ;# we do not interrupt others.
	;;
esac

# Now we are dealing with a topic branch being rebased
# on top of master.  Is it OK to rebase it?

# Does the topic really exist?
git show-ref -q "$topic" || {
	echo >&2 "No such branch $topic"
	exit 1
}

# Is topic fully merged to master?
not_in_master=`git rev-list --pretty=oneline ^master "$topic"`
if test -z "$not_in_master"
then
	echo >&2 "$topic is fully merged to master; better remove it."
	exit 1 ;# we could allow it, but there is no point.
fi

# Is topic ever merged to next?  If so you should not be rebasing it.
only_next_1=`git rev-list ^master "^$topic" ${publish} | sort`
only_next_2=`git rev-list ^master           ${publish} | sort`
if test "$only_next_1" = "$only_next_2"
then
	not_in_topic=`git rev-list "^$topic" master`
	if test -z "$not_in_topic"
	then
		echo >&2 "$topic is already up to date with master"
		exit 1 ;# we could allow it, but there is no point.
	else
		exit 0
	fi
else
	not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"`
	/usr/bin/perl -e '
		my $topic = $ARGV[0];
		my $msg = "* $topic has commits already merged to public branch:\n";
		my (%not_in_next) = map {
			/^([0-9a-f]+) /;
			($1 => 1);
		} split(/\n/, $ARGV[1]);
		for my $elem (map {
				/^([0-9a-f]+) (.*)$/;
				[$1 => $2];
			} split(/\n/, $ARGV[2])) {
			if (!exists $not_in_next{$elem->[0]}) {
				if ($msg) {
					print STDERR $msg;
					undef $msg;
				}
				print STDERR " $elem->[1]\n";
			}
		}
	' "$topic" "$not_in_next" "$not_in_master"
	exit 1
fi

<<\DOC_END

This sample hook safeguards topic branches that have been
published from being rewound.

The workflow assumed here is:

 * Once a topic branch forks from "master", "master" is never
   merged into it again (either directly or indirectly).

 * Once a topic branch is fully cooked and merged into "master",
   it is deleted.  If you need to build on top of it to correct
   earlier mistakes, a new topic branch is created by forking at
   the tip of the "master".  This is not strictly necessary, but
   it makes it easier to keep your history simple.

 * Whenever you need to test or publish your changes to topic
   branches, merge them into "next" branch.

The script, being an example, hardcodes the publish branch name
to be "next", but it is trivial to make it configurable via
$GIT_DIR/config mechanism.

With this workflow, you would want to know:

(1) ... if a topic branch has ever been merged to "next".  Young
    topic branches can have stupid mistakes you would rather
    clean up before publishing, and things that have not been
    merged into other branches can be easily rebased without
    affecting other people.  But once it is published, you would
    not want to rewind it.

(2) ... if a topic branch has been fully merged to "master".
    Then you can delete it.  More importantly, you should not
    build on top of it -- other people may already want to
    change things related to the topic as patches against your
    "master", so if you need further changes, it is better to
    fork the topic (perhaps with the same name) afresh from the
    tip of "master".

Let's look at this example:

		   o---o---o---o---o---o---o---o---o---o "next"
		  /       /           /           /
		 /   a---a---b A     /           /
		/   /               /           /
	       /   /   c---c---c---c B         /
	      /   /   /             \         /
	     /   /   /   b---b C     \       /
	    /   /   /   /             \     /
    ---o---o---o---o---o---o---o---o---o---o---o "master"


A, B and C are topic branches.

 * A has one fix since it was merged up to "next".

 * B has finished.  It has been fully merged up to "master" and "next",
   and is ready to be deleted.

 * C has not merged to "next" at all.

We would want to allow C to be rebased, refuse A, and encourage
B to be deleted.

To compute (1):

	git rev-list ^master ^topic next
	git rev-list ^master        next

	if these match, topic has not merged in next at all.

To compute (2):

	git rev-list master..topic

	if this is empty, it is fully merged to "master".

DOC_END
#!/bin/sh
#
# An example hook script to prepare the commit log message.
# Called by "git commit" with the name of the file that has the
# commit message, followed by the description of the commit
# message's source.  The hook's purpose is to edit the commit
# message file.  If the hook fails with a non-zero status,
# the commit is aborted.
#
# To enable this hook, rename this file to "prepare-commit-msg".

# This hook includes three examples. The first one removes the
# "# Please enter the commit message..." help message.
#
# The second includes the output of "git diff --name-status -r"
# into the message, just before the "git status" output.  It is
# commented because it doesn't cope with --amend or with squashed
# commits.
#
# The third example adds a Signed-off-by line to the message, that can
# still be edited.  This is rarely a good idea.

COMMIT_MSG_FILE=$1
COMMIT_SOURCE=$2
SHA1=$3

/usr/bin/perl -i.bak -ne 'print unless(m/^. Please enter the commit message/..m/^#$/)' "$COMMIT_MSG_FILE"

# case "$COMMIT_SOURCE,$SHA1" in
#  ,|template,)
#    /usr/bin/perl -i.bak -pe '
#       print "\n" . `git diff --cached --name-status -r`
# 	 if /^#/ && $first++ == 0' "$COMMIT_MSG_FILE" ;;
#  *) ;;
# esac

# SOB=$(git var GIT_COMMITTER_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p')
# git interpret-trailers --in-place --trailer "$SOB" "$COMMIT_MSG_FILE"
# if test -z "$COMMIT_SOURCE"
# then
#   /usr/bin/perl -i.bak -pe 'print "\n" if !$first_line++' "$COMMIT_MSG_FILE"
# fi
# git ls-files --others --exclude-from=.git/info/exclude
# Lines that start with '#' are comments.
# For a project mostly in C, the following would be a good set of
# exclude patterns (uncomment them if you want to use them):
# *.[oa]
# *~
c5821f2f7d819c93574130d021aedf7871198da0
ref: refs/remotes/origin/master
08315dbd8218aaa9baa21ebe3f746e8256209e27
e100b9577d3984fda3cbbcb704b78734374afb0d
4834a3fba9a8951087775843178ea6f62def8b92
c5821f2f7d819c93574130d021aedf7871198da0
ref: refs/heads/master
[core]
	repositoryformatversion = 0
	filemode = true
	bare = false
	logallrefupdates = true
[remote "origin"]
	url = https://github.com/apisnetworks/joomlatools-console.git
	fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
	remote = origin
	merge = refs/heads/master
PACKʕx���MJ1@�}NQ{�Iҕ?Q�a\���*I�����z����~��@�B%N!�@s�̜k+���b#�){��J+w;��)���X);�%�P���F�����r+|	߸��X�]6x��g�~�)����:�m�Ve,�E��W��k%a8�����o'�^���v���X��MQ���P��x����N�0��<�%�+�]v��8!Jx��x����8<?	�Pю�oF��E��9�]A�:i)�&�D�ٵ���+eY���gc�m�
8؆^ǃh��C��{��{�$�E��ư3�;�!z�Zs4����)��"�����l�~��S�G��<(t�0��
P�iY�R�v�,y8�ȴ��:ݠ�s��8
{&��<�EN*E5�r���z�ʸ�嘭�$/ۄƴ�[J�L%�y��4��֒�/s����V{���x��;�0P��83L�T�c'��i�OŌ8R��iX90��=��8�o���h`F��P^[�,�Z+��g>{����I���M��1ů��j�B}�SM�?�?�a�����s P�x���[j�0�u���4�V�,���3��z�c�Z
�:�����f`�A�8z��N���B�����ʓ����Em���F���1�K�hS�"���(��Q:��ʎ�D�x�
~��T�\׸��	N���>#�Gtr�
>��R���3�V�7T�~;�7~��+����	.�T�Ј�V:L�o�ѧ��R.�|'X�,x�m�M��@�����泓���
�����T�t~��n��yo��*��5t��1�Td23UT K��U#YPĜ���`�%�@UP�c����L$�E�d,�LT)A��%��b�rdʦ�r�z��]�״�x͟��^j�2�� V�\��u5��]
�1�����^TC9�/���-�����aَ6�����Q�����z#3t�0u=0�
��4��R-��K�I�����5:I��u5v���i$����N0���cS�n]2��:��y2�؆�}P��a���a�}�+
%�GYg����`�e�°N���������l�|Y��p��Mw���00�K�I��k��ev�۴�ܛ�<7�OE�Ï�����K2sg�����=��-�qs�2f��}ty"�[{t��z�+�B�[uf0KJ&e�?��w���%AE�~�9ⓤ���������Tòi�64��DFԌp���X�VW�ʰÍ�{-�ۘ_���ާ�<{��̾Zܿ�,���Ÿ��(ȚKߜ)(��)XU�I����ۧ�x���A
�0�y�����q���-}@b6(�Ft���}BOÌ,���pǝi�v�����h�eoR�Z�1cRsXx�
�D�%:J��ёM���5dC�u�*lҗ�;Op/c<�
�'��"[��0����i<�4j��2���w�眂0��=tA�2�����M�*�>�XM��x���M
�0@�}N1{�̤��E�.DA���P�Zi��W<���2��m)&�)6��IQ���rc�L���u��'y0-if�&h�Z��%�#eN&Xg���~��R�-8�C����X^�����ءA��a�Q�qn����>�/�������MWV}J�H%�x���QJ�0��b�ǥ�I���
z�I2���fI�.���|����&��H�~��d�C�D�FL!L�S
T��q�Mab�KȔK��E���G9��̇xû.���ʗl�^�xH����k�}��(����qcrOp��Z��^T�k�������n�;��e�Kl��/
�B��(��x��/iSŖ4x�mR�r�@��+�*G�f����T�!a@�Y�`���ׇ$�[�����]�g�V��$�,H�Ul���e(#&��,��&u)g��fEV1�MU��II�B9ա�a�Z����Ȓ!D����5LF��hL�Բ(�dUCD3����h9�vf
H�?���_��qŞ&~YGH�LC3�*J���R�AP�����嬫n��R#~~�s�w�P���?�`��&���#����ep�cێk۱�Y��O�ĉ�⤭�*/�M������P���m��g�?]&�#�@�3���H��u��&[���ug���\�Ƽl{z���fߔ����w7Oɸ��lN��-�&����
œѹW������7�y�yȽy��2��F?I��b9�ニ�~���:%��/�I�nM�"��۠,�֎\�	�V?y�W�TY@��l]Dx?5�p�f=�4��m�m����g�������D��t����%������_X�3�7�-���f��&qѬ�����ȵso���B�"w�%���*��x�\���K�I��tcU��
��e2�� ��5m�c�U9�iV^�H�mŞΌ�?�1��Yy��ڶ�R��a�F�x�m�5�x����m�0�bp��Ȥ�p	`��T��n,C�4܂�rcQ� s}����:ʲ�&q�)�Q��;�6ɜ��/4W`��J��jݣM�5JߡvJ� c���o������s*����	�Dw�P+'���hVz�r�9부N�
��y��Z�_d�sx@hߐn9O��;�u��
k�_�C��	Z��+x�m�Is�@����&6B�T%Sa�aQAE�uc�(�b#�_?I�y��-��;ƀ&A�k��C��5H))D��9��EDt�c!�F:�p@���s��YFD�r�X J�`�ȅB�e"
�秶	gOր���/�o��+��k�_ "M���s��
y{�V��8w{
ޚ�c�z�(+~���W�Zy+U	�|�Ď�ȉ@�9�����@���M�0-�X�k��|�bs���r��:o0���y�����h}m����?���)[|F��N���Y�/]Xծ��:K�8X.��<��,]����ƞ�ϱq�ԗ�]��tI��X:jAvM���E�ݝpp%�[�o��RJn�z4
eC�j�$�Pj��9�L�AS_�?e��̧!
v�������P�q��{��Y��d��!�Wf��pTp�NC���j���s��\�1a�S���
�ik����`!Zw=���i�`�I�_3��e��C;k�%����=z4��}��n�Bt/����,Vu�[n�.�������	�ۑpbl�+�r�G�4x�m�K��J��J��t[P 9}�pDD��񴳂*
��P������Q�dOV�5Z�j�6A��-�e�)1SfZ܂RF�a�vJ9Z�ZQ)�-���6�0e1dZ�0cb�fj�:g0��ǺE85,j#��D:��G��ډ.�Sc��^eu"%Q��.�Wҁ��O�]�e\���P��XQHh@�%uY�J���Z�1x��V4���U��__�_j��].����z~�;���8�c��5���s�q�w�ٻ������=tWfv�����8|�,�s8������v���Q��Ҫ�)�ܝ�Fr�}��Eq�~�%�]o�0vǻ�b�	�Tٟa ���$����	���K9�ڋ��Č]���W���Y~
��><\��u؎���cs\/O�G��t��,r�>}��w����Ǚ����r;d��Z�<*���]��1*�dE/N�����x���{�x�Ӈ�32�|b՞�[W�����Φ8�c;Y\�$��Ly�y�|����u�b2V���T�%��~��[Ƅ\y2���ox�Zj�m�mf_L[�V
��EZq�E��?�n���K����S�9�b�0�d_tM�Δ�KB�y��b��R=���BMݽ˫N��`��MS����.x�m�Ks�@���[��~T%[AyD
�6��;À�_�{M�����C�T]�y	��r�h��T�e^E*����T�\�(nHu��R$*�f�<�!,!I�UQ�*��e� ��O0�FVt�v���4���
i��'�o���+�!	����\�5
aS�!l;^�K�Q���[NX1^??��>H~}�r6��M���`O����n��X�i�L3�B��Ǹ���V��?I�L3�Bh�3Q��ͻ�ȢIoyl�ˁ��k���g�V��E�>�R>�C�l�uY�0�>o�C�s"�+��@����_B_81۫�d"�z'���U?ɔB�I���}lQC���M���b4�q�J�m���ά82oq�#��(x�(s��J�$�j����aŸ�����1�d��>e�����|	�N^�y}n߭9F���Ut���+O��VQ+�_3�[Ӱ��0�b ���h8��9��<��E�|!��T���w�"���6j��v��9��Ǹ�O� {„Ҕ0ҵ��ul���C�
O\H;0T��;���;���2x�m��r�@E�|EW��J���*�
Q�����G4�~�8��f*wy�ܺ��B���D��HP�j*�$�R���j�(H#1��%jH��u$#H0��� 'X�D��DQ0�D��鉂ѷ��J4#1�"U�)}��RYFG��cD"����'ր5'=������o<+�<W����AM�T�H�DQHXYf��8w��T�!��f�����ZzI�,Ocڎ�Kg	֞�06ە�� �kk&�a�����z?Y�3|:+��xW�8��g�����\�X(��-[CN-�����?h���ju�y_������z�Ň�:
'h-(����|mw��	�w_��r[�X3�j.��Z9��d��tMgp����ZZ9�?��!r��&s�T�w�����Y:a�L�Y��.�
�}6��vnm���b��i�hH�s��k3������0I����6�`
4�lsS�]�}�6A2��Ɇ���
l��Jw�1V�[
@V�yV/��;~ҾG?�EK�~��G��f����v��N�B+ȯ�s��A7y�k)F[��g���1�'MJ��+
А�#-�$	ڰ�+��3V�cJ"�5d,I�S����?�-��x���A
�0��}N�� ���LAD�QP<@�N�H�Ҧ���ܼ��K����� 
H�X�b�@�@��R�,>��$C�hb�r[m* d kMn��&���ܒ�8�G���{�e���wLK��^v�XF�*�^�PM�WJ�_��c���p�O�[����D��x���[
�0�s�?ɫ���x���֊�)���[<������`zGdG�s�:�ܚP,��D���4NMi�Qۈ-o:�
e
Fo.{O]б��=�J��u���G�֡����.�*k�-��4������Fk��0<E��Z��#ܧ���]��yHi,0%��q�JW�+x�m��r�@E�|Eשּ�<��dj@�(�1��G��4����ls���=�;�THy���X!��`��a"Q�RL���u���b�UA��f���DE���bBbȣ��c̑q(���h�m?	����:�З���0Re(	
X@!��u]�U��צ�iw���ˡ���-�rV��׿�� �:���{�s�3�]�����;
�\�uW)���$�άi��8��w�r��y�¶���j3A�r�<$z3S2dzԋ����R[l눾��Y�&3��p=D���[-�NҲ9�WV�X�5	�3<���K�S�k���hLN�sW)�R�H�j%�W,�}��2I� �Ym�nJl��~9rK� X�*Z3�;Izm���d�;d1_�=P":��
)y�����w�~��mW�]�Lά*�3���`��73^]=���>��� �é�T���%P�|T�]�w�Cl��Xʧ�s�dr��-=kn�8���m�����]J
V��[���^��/Gx�A�+x�m��r�@E�|E爫�<l�J���&���dǣ�F^����'���.Oݳ:�@)P�����@Y&�X���.
e���"R�듁��IQE��L��Y��T����T�2�J(]ʐK���
 �蕶����y��kҚ>�t��� u	e��\�5
�&:�M�9�m7о���l:������ˑ��Ͽ�E��v  ���C���m�3]�tC�<���`���7|�$�*�i��m����菍Z���bN���9p�ո���.�V�9�xDa.ɶ]�V�.��wUfx�#�ڏ���h�0���ޣ>�2=D��]�^�F�Ȍ�.�2��^mY�SrW:�2e��^�s�hag�Jȟ�f��"�3~T�!ް��0��܆g��$��9��E0wY[�b������y��j��;��5�
��{��5����Y�w��3�=�<�$��D�\~������{���*6��.#W�Ūb���Rӈ��e`�����^��73���Ÿ5�W:��kA;7)�;R�U�3x�m�ߎ�J��y�NΥٕ��d�d�������wM� �д�>Ⱦо�Ꞝ���JU��|���1@SL05�<�M��&�F04(�1�,�"F���JKk$�Q�R��C�ܜX�д2�tjB�������e91�R�1K��L�f�-S�g�ЍL!y������y�$7^�s�.�:��׆�D�R-�uLTMU�뺔�	�(�򒂗��V��E)O���C𗳢-��_���
l�7{���?{(`��ض����`˫�w#g�Og}=h"m;[���I��g�����G�âipv���,a�����a�
��j'�̩��UӋ踋"S6�@W^2-�d��e�)�1��8�}kAl��� �шk���=+Y��nUkCm{n^��v���n|E���I�ew�/ӣۯ�4�̯������ʫA5��~�>�[�~=t��"�	��S>�>�;`�DM�$�����Mu�>F�ی[k7K�k��I�v
w�du�yع���0��(��N닰;�qb��#���;�ؠ�6
�sm��~��?z��&���7|�����_f����Ĕ�����RU@���z	��P��58s^WDr^�Ӝyl
���JY<�Q��OؽeӃ�W�.���l���V���x����qB_biIF~��kQrb���Ĺ
�f��
��\����%%���Ji.eCCc+��T�����̼b}-.4V�x���M
�0@�}N1�R���tq���t�E�H��+���E<�lqH�=*:��"b"�Y#�.p�!��
�S�+N:���bKDv"�z?H�:o��g���M_:åN�++���=o��z
�؇�l�M��4����fCD{8�o�k��X�E$�5x�m�ێ�@��y��zm����!a	9-K�d��XN�J���V�Um���[����
d�cLU��4!'	f�a�S���Pe��Z�RASuJ�DQ���҇ڠ_���H�UEU��c��LU���11؂r]345"��Q��q"E���-z0@�����C_��]de\��
�7���F4B�LVdYJ�̄���x�c�[h��{��k~4�G�6i����wXK�ۡ�{@���3�c������Y�e��m�/�˚���,�^sm?��M�={���NY��F��$ޯ2m{�o��6~@�q7�6m��m�;n����j��5��9��-�KWq2L+y���\B�h_��YN�g#���N��0����m�1I�<:^ػ>���So����/�uM�7	���yk��
�ɨ�N'\�6�-�.�?oVJ?w�SS����0=��<���G�g�e�_����{V����Ey>��z�/θ�,��{\2>�3r��y�wP6c�x��o�x��yjפ
�x�}��:w�&�%�qٌx����kk�嫄���t��x��9�wL�B�j��@-�z���(*�m]�~1�^�k/ĜC$���3�DV�OP6bz�C/�X�B"�v�$�(����G�FR�q�=j�>���x���Aj1@ѽO!�2PdklyJ	Y��	lYC�v��Q�}C����m�Bl�ʤ���PX(&�AC�~���`�Hi)L�3a���OϜ�l�y��]�٥8��u�ϾՇ\���W�ۥ�V=��L<��3�#:�۶��n��}x��{7h����.�*�֡b}��?ieL��x����N1�{?�J�������
<��^�,rv������!�4[��7k/g"��Z���6k횞Z��V7d�6ZaժN�0Sd�����U�c�*-��Z�hӗ�Vm�8�2|2�)�GMQ&x���+�<���3�V׺Q��ᡒU%l�L��ō��^��t~r@&0�*M.d���	0:�aKB�Exq>��P��a�=.�����Ą#A,cS:���'@�2C��ԥa�	�I�1L�wf.�1q�q��_-�.�U����qǧ���;���!x����N�0��y
�8��&�H��g/����k��])�ƍ�aH��%Jb���9�Aw�5�i�:��Q���u��ʹ�֪s�A]��I8(ܨ{�[+%���J�
�z�Ѷ��SRIa&�1��G�Y��A�9?����O �Zj�H�m��J�pD��:�2q2i�}Hh)�(��L>3��DK�y�/&-��h��`����ؗ��B�(�&�C��"��x��2�i���?��T������n�jHp�X3�;�}9���o�X�=ȳ^*f�R���}æ�M�j�ՏeŖ��
m�W�x���[
�0E����/�$q�@)]CK0I&*�:u��.���{.G7��b�ԲN)�2�$!�mp���>R6+o2+�����\Srͥs���V0'�B����l�T9d��2œ�p����R͢7�Ը@
�ZD��iU�Oݼ��*��{y/=���U���L�3x�m�Is�@�������n��*�
 .���7�i��f��׏�������qF)P�DQdM#d�Ɖ���(���$�"�4��B1Zq@�'NAD��XIPB�����:� ��a�Q��G
�HGXEX�X#	�I$�T֤�k�8��g5{N�~]�'i�k��y^��(��DA��"���EQ uY�S�9_t�V5�M�xOs�u��S�a�6i����_L{�܀�|������ ��5�i�e;s����o�j�!{w�-{È˥1��M��`a�%�P	��`(��o��s��:��Y�H�T
7�-�i�z��g���i�{�ٟwJ�a�bn��>p-{K֪T�)%Ks|}��;�}��E7+g�msMR;�lX�|��Kf��T�w�a�`��
���sO��qO�p�����:�q���+�Ww�,�yc����,�K��~u���Cvڭ.W?�7y|E�(	��u6V'�"p��%�9��x�5���e\�W�ӽ�n��{�ܐ5�'�V?zee�[YNt=����Aߞ�h���&Z(����L~LXS�R�tE�u����"HX]���.���uю��1���"���O�_Y!���hx����4!nb��������������Wr~nnfII���Z6(\ʆ�V
�y9�
E��%�E%
�y
^���9�%��9�
a��E�y%
I�\**�2x�m��n�0��<��=�6�&`�vUB	�$M(7�B!pB��o����s�fFix�@1�1T��
I0TH*g
�'�"C��Be�D;v�b(K�LUH&��i��	�	�e	���~���DN3B�`��N�$E�$�T��8��	��=�[�.�����O�x�EW���o�
$��gQ��$$M]��X_�c�tl:v�Ɨ�����������_�L�^��ֶ��-0��0�d��3C����i�2���~���;{�taۺ�F)�eˢy�)C���h/Ъ�ѠC{�\�qu��)A��D�8w7��H򄍻+��U�\�-���pp����^�'�w��Y�ĕ{>��,�	���ڕ���E����C�.U]�X���6RBB����,�,s�_~�'�.8�L>�CuP��eܬ�a�e��M9�!q֊藞�O���ˤ�lo�l�E�O�\�����ˮ~���1�y[n�X���M�w��h��91�<V
4�T�tY�U�l���k�r��?����|���sM���G�F����~��1aź��ӹ�@��3�9�%d]S��i��I�(?wl%�@������?�^���x���MN�@��}N�]���+!��	<�Fj�j:�D,8�G���
����9Z(�E�ݜ�e���<�!MW�
H�Ԓ��x��E=IK��\G.���$���!({l�4$�X*�B(fi��$�q�;|��
>��r���/��e�}�t��H�ed�$ĩ�뺌��̧w�_
����pZ�	�m�`*����=�e���l^ےx���A
�0E�9ŀKAf&I���W�$�V���V������B���Xr!.���Z}�s�Dy�)q��<���\JNZ�GE+5X7�8�J���#�~_l�>ʲ���5����>�e�����H�f��Ի�_�!�a�M6�ވ�)>D!�x����i1@Ừ�14��1!i ����f/xW�jl�R�Hc1.��<ٙ���s�\�+�W�StX����Rs�Mj�v^,��̩5��6
��1�N��%����.r�;|	_y�Ͼ��8�;�ɼ�3��,��>`�����V�/�,���	�9�;�˶�]��V>����>d���hDPE�x���[j�0�u��~ʮ��BI�О`WZ��*�6���|�m�P)���<���'bҤd<� �p���N�B�S+�[f?yL�dR�3����8�������]W�]���u���]}]�ށb:H��]��f���^�>j����B[�l��}�x�y����O�x���M
�0@�}N1�R�L�I���`�Lh��Ҏ=��#���=]D�
�6�{�69�W
1J@_��P*��D؛/R<gBXZ������gN!rBN�(c����M
��)��y��U�)>�TD/��y�p�h���iU���кn��
lüj�ϑW���$��Lޜ4x�m��r�0E�|�f��q-4�v
668�1`�Iv����B@���M����{V�
����MW144�����RL�nj�a��F��RG8k�؄�b�!�4&FƐ�YSa%C�a�c�_)�F�w�$T�Z�e��e0�Y���)�	�� ���X��5 jkz'=x�?�OQִb�&~���e@�
�R��u)�`[
o��i9�g^�b���hy��e�[���#���>�#��K@S�$�m;+��p�n�]���G���q����}�=�:��M�GC�j.����B���Y��Ό��2t����z����	�Z��Eu����g/�MNL�W��?3x���e(�1]��y�_4أB����u��'')�V�"ߒ�}��?kSP�^P9��~X��!m�k�dTښ�0]��[p�.�"'����q�n_�;��U(�c�FNRt�^٦9���������\D�c�L9��G�V�����L��|�O�ӫ	�)y$���b�Oo�y�ʽU�d�쏁%�"��m<��5�z����;�;f�n7��%�q{��f�a��Ť=�9�PU���z�(�ok���LsN�^�Ͳ/[�M/HU-깿U�0%���N��~����D�E��?d`$�����O�q���2��x���Aj�0@ѽN1�e�HI�R�}7iN0�����5�cr�,����P	�0x�	��"�r���SJ�"E�`n�ɪ�c:���h=W\"����D���]���Y��|H����/�k^�m��K1�ëu֚��:�ʓ�yqvx��7�o�U��Z]���e�p9��4/b�fTN�/x�}�˒�0E�|Ev���
�gU�T�@E����&AZ�~�gz95wy���\N	T`Q(�ajC�sl D���]Ut�h�5����:�B���jG��Ȁf.��tT%��
Ӕ���UG�$��84{0޵�U�e!U�_����=#���%��㥬y��/E���I�*AS"� >iSsN(pj�9x�����ג�%��5{�x��='�6I<�� ��مmY�ز";��ي$��^��IY���®�Yc5�{�*��z�ߞ�펜�L:S>�5�IicgO桏GnD3/,Iى�1�4w�������w�R�F}�Ӑ���(I���V�h���&�Lwb��2��w��n��'���YXsX�>rT�Y��V~�1i������OK�������:��4�h���*��m��9?�؉��-��x#?����e��Oc�T�A��ϧ*bq��ũ]xX^n�K�丧���!@2�NM��.��Ԅ�2r�k㶝*�*��s4��D�oKRFӃ�Xr��=�7���� �m6
&�.&��ܿ���k��RRp�3Nx�p�.=���u�BiGN��Y�3x�m�K��0��T푚�X5�5�TtF�ר��$�y���ם���t����S�5�	�

�]�$1E�cAL�B$G4�����"L�PR��	M�Ja�	�)���>g�-ʰf��MFyB����&7�
�MM�ҵ�����~KY�i�s�^ۼ��y��/M��-��5MIdY�m�k0��IG��Iּ*��4o���|���U��)x�#7�s�#�
�sg�Y_\
�6n�:��9N��S6����tgVv4����&a�yF߼�P	��Ӡ��̵�|T���.�ǹ����}SE��5�F�$��#�?R����/�����)��ӘI�}�zo�r�I��N�(��v�ޅ���Д��6�'��o��c�?Y�U��q0���&� �7;�r��Q|_��%0v��K��)��jU�u��xh�H����!�P���"6R��Ԫ{������=�s{2:晑��b�ڡ��>�v�e��od2ߛè�V�q�ﶿYq�#=2/���eĮK����{��/
x�G�X��Y0��Ly�u�A�����M~@
Q��,�JY4�I��|5��e�����7L����x���]J�0��‗��M�-�
z�/N�M$=��;�oދ^�%���.��w��JrSY��Ɩ��h���:Є\��fϜ)&Έ1�C\���-�>�Cp��{�!�p�����	�	�x;ѳ6Z�����z2:\�m���~��J��R7$��O�QsFS��cTO�x���Aj�0E�:�@6-���"[SJ)�M�E�������篚#d����V�b�$"	�`�@�t`���)�ѱ������S�}�4p��0*-}T�sDp�Ǿ��N�_�����F��
��T���B{��K�{�ޝ�Z'3ܩ���Do+��2mh�����z����H-qt�.QБx���Qj!��wO1��@Q���Pz��@�1YX�ew��g������1���b%Wb���.����["�0�TQ�y�!�hr��,�tq�lu�)�FL�p����+�e���|/���m��/�z��c�|��x�08k�����I������
?k�°q�Ә�^�e��|�]��,P}�x���Aj�0�z�B�����k���7��+i�"9X����O�u`��]��!�'1�X�dM�e�t���Cvm�E�12�4'��Q2J.D�N�v�v�1}i��ƃt������znj��tt�����G�]�j]��;��w�t�&U3�~}�����uۺ�i}�Ŵ�_�"R��3x�m��s�0���٣Ӛ@B�L�SP�h�Պ����C!�~����w��NO�J�mn)!������-J!���`�@�ae�y�J
(3�Iᘄ�T	�n
D�Mcɱ�0���;�$)�SS)nɘڌ�DJ��1�7�Pi�V��jթl�B�H�/�B��T�7@Ć&A�"`�F\E����$��V�����9�|J3}l�m��&K�ݿx�$X��d^���}�n�/n\/�\����[��!6�h�����Ϊ����i�>����ɶ;���·���!b�7�t}<�� �X��ݼ�(�;h:�3�6Y�C��V�#��$�K����G�.����~Ι�;r�3���,��۱�E�׺{�1���j�U�N�mq�A�������}v��jx4O�]Խ����������fq�ԦD�t��c�n̈́䪉�4E����n?�	�x�I/5^��S7�6b5�B�߿0���t&���Y�����F|����!_���7����i1
��:mGAqy���횯Q����=U�.�r
�����39��1c��T�s��V�V5�B���
p��"纪�f�(��Z
��ju�Y�������_��x���Kj1@�>���B�m�WJ��ȶ��q�Qr�=B���O7��KE$�	�$�ɧ���P.H��%1O�dU����·�k��$W��%�숛��C��~�}npSy�
�9�Av���E���i=�
�.&�D�h��*��͇E�W�-���P��z�]�
ֹ���sM�x���Qj�0��B��Aq,[�����H�BMRRm��_����nLZ0O��i,��r�ڐ�ԑ�LG�����"B�;�Fα�^�bHR��3b�$A������c+|n�>�o�'|���Ŏ��;�4FƔ�%1��-��n���0D|��~�n�7F�x���KJ1�9E�KA�L���;�z�N��	N�G�}�w�n����K�����h��և��3Ő���iUw����Tb^HoMH1:W�
��6�B&r��>&|	?���h�"'���]j��t�70ާ�]<k��*��*��Փ���y�0�Qv�|������:6�گ)�
�z�sQ�ڳY�x���I
1@�}NQ�R�T�N""z=A%�hC�]z~�#���,�`��b0�U]�)�#�VJ����������$�a�v���Ή<����P*�:L�^��	�y��<毬p\p�~��'���)���[�Z�2�c/��j���R+�v$���
tW�(J�-x�m�͒�@��<Eߍ�����iE@G�5�- � >�����_dUFdk	��QY&
U�I <�LH�I�DR)�S*�R�5�%7`§�&�"
p!'��(cmR☈�$�I"Ĕ�w��-��
��*�H޻�dy���F�_����\d��sI]U9c�V��{�ouK�r���,��o��ks��+��t�r<X�C�ho�880tz�#�/��u�8�˽�Q�o�b����UV�˟�)��~�`:髚^af�����Yy�C��3����d?OĠ���a�~�릯�Cz��o�\
������۰�su�4�<��U׹)F'��x�
S^.4M
�*�0�3�6�kH�� XA���<��A�|iQy�����*�����E�̒�	1���uF�Y�1/}��]�6�C�^ ��%d��P*Ԏ��i=�t��c�R+.�6�8+�6�EB�R<DO�ƛ�|X�]pv�*���WY�ҿ,�򦽚�q����iLq��1=��8�����
�%hں!-'����^2���N��I�6�0x�m�I��@���Ӳ%�
���,n���zB�,6*���{"������CF�ɠLUI�dU�J S��S<MPYզ)�2�L�BZ�9�uI9�hJdL��)�SQ�>�N(h�(Ɋ.��M���P����'��k�
�9��^j࿑��x"�:��H�DQȚ�b�C���>E�u�¥�sƋ>}y>��/y�r��K��x+9Z{���l��H@���L�0g���"���c��>.Γ���0��y�,�N�o
��m�������g{����k��Q�L�8�/D?�2�@wK�
��6H��=Z
�Z���U@@n�np8��3>�x���(����D������������]>O殊��f�iAē���l�)k��
W4�Q�j�`��r}�*���,���$���Nc���Z@g�Ƚ�>]�"ю:��e�᭥�G��پu`��&do��S��h�6E�b�~��>8���O�7����g,�x8���7��}$�Q��yٱ���;��U�e{���&���mf����@��:�iEX�.ms��O�o��K����A����:�D(��]���ЯLV�:��_^��x���MJ1��9E�f!��T�n���j���%=�A�>x����P�jq/�#��-�$�]H���Z�R<��|��>A\,�TR�N�@>��Y�m��r����Ɲ�R��"�^b
�%��s)b�k��oS������Z��x�����^��'�=�u��9[;����EǻB����K8�<����Y^��Fx�[�4�i���TM��ĢԼ��T#�D�S �2�01����� �"�,�"�4�����$�lb�)����v2
�@���Z����T������n�g��D����.x�[��q��FR�eb��Y�i�����Q���er��ej�I����ARR��I�����^&Ӊ�mL�
���+� %�$U�,��83?O!�47)���HΛx���M
�0@�}N�� �d2 ��ԅ(( I'X�?���x��'��1Ek�r���!�L�s`*�JU�j���-9��yd��C0���H�`2�Xŷ<�I߅?���ХEf�����K/^�,[m���*�^���C׵"��c��ᴿ���V_vF˕3x�m�M��0�����t�&|�L�)��ѫ�]�|0���K��g��y��y���E��ئ�n�؆&BZ����BS�M�`�����cA[	��e�)1�J�M�)^��l���m����6ݝj��L��f��f�m0�R�(�N���7ڂ���D�u�~ԝ�%��2&�֑�NQH�y)%�/�j�׶�o>~\JY�ٗ����_��>����[�1���9�'/�p\�:��9��݅�k�wm��v�Dpw�|��=֧��"��}�g3�*@�Y7?%�jC������-̃йިw�q]w�|E��h�pC�i�����J��ޫMw�y�L]m�S7��J��q���xb�*��s�x�aG�ch���]��:�n�n�J2N����CǴ;�v?�Z{����j]�ޫ��ջ��u��y)�Ip��YV�}��'���O�H5���.�y���l^�?���xr<	;��B��m��-�w�CH/�����@�ِ�֎W��n՗��^V㌇9~�c�]%s����}S���<��f/��S6T\(�Ǧ�^G:H�	A��8�eS�3nh=�d���<�:9H���
E�Ȥ�c��遛2X|������/�X^�x����M�0@ừ��qE4c�BPEL�1kp��v�=+���wx��Y���R�0�H,���4�R`�`�I��R����Ӌ3��a������'�w&�3&A��&�r��]���y�O�r��#���ٹ�i���r���˴��Y���;�� �����H���e�x��%/��M��mt!z-_��C���bԐx���[
�0E����ʤ��D\��
2���4�~�K��p�po���\fJ�-[�H=y>��ngE��F�<Sե��)�G͜ɦ��St8c��DTF�^�V�5}��u��lp�~�ܦY�-�N`�i�p@�h�:�Sk�gn.U�w�v�P��iS��`H��x�u�AJ�@�}O���d�i��0�f�E���x|Et����(��V�(hb�L�YHL[����p/�m�Pf��I���!1�Hy
3�$fb,Q�r�����a<��~���<�u?o�R�
�1�'fx }]w����w�l�=Q��>���8h�
�i�Eؕx���Mj1��>�.�"�ر
����	4�����qz�8W���x?|������J�Ţs�B"�ٲ�F7�D�✚?nZ:�c
iROn�((cH̘�Ԋ�.$6�����{��ԡ�m��ˠ�_�iZ�C�	�f����;t�f��ڻ��7ǫ�
N�'��v_k�Esm
�Q�Z.�"pI�	8�Q��5x�keja���(�$�,5O!(?7)���X��,�P��������Zb�`hjll`lfhi��m`8�.���5x�m�Ks�0F��
�t�I�C��I:�c;�w�A˜����t�;wu�ܹ��c��3f0Ƕ1e�%�*M	��T7i��`���c��	����c���:4M�6��.��dԲ��Tˌ�8����Et;�R����Р6����L�)���@"ٕ5`�kr'<�/�|�/�w�~��oՂ�qL0Q5UUR^ץ��~)���džw���缔EO�߅���m.�<�w���$����~����A����;Gh��VDc�e�w_��n�F� �j��o�z��z"�(���n�;h��X�š���Ռ�vh��8��ͶԞ{��G�P���va��b�5����F��e���$X���>��L.��H�_?��k'�`��TO��E�Ov��V@����}���+�gVx�<�B_P�Y��-z�����h���8֌k1l�*W
�9�S8D7�w��n�M]Q����U�;����#�ׇ�.�'y2z(��
@�~J���3(�C�O/�e�>���ш��9p,�eU,�W�G�ֲ��/�jxR�Ӵwr�of��bʆu9m_U�c=|sf �x
6��+�Ӈ�Y6�C��kIY7��}Ǧ�V�K��JQ�(�
�,y$�`�(��`�( J�~�����~\�=�x���A
�0�yłGQ�4I��� �]�Ф��~�O�40�,���S��ع��ȝ��d0�@E{WԜn)9��Dk��%F��(Xr]�M�C���&�i���<���Y��]��#��
�w���6�Q�U�jD��\���c��N۬�T�Fz�x���AJ�0F�9���i:I: �ǘ$S[H��F�oO���|���fZi^r1 zG�vĄ9�&�0�+O攮��6���<��"�`�Sd�( ���fl�kl��������V�C��g��<R��0�y�(g�	-��m����M�ھ5����5dh�}��V�]�D���K)�s;�Z`R�x���M�!����`�:��0�UJ�Ld���q�d�x|����2x��I�8뜋�%
6��Ț�H<��1e�	J2����䡘�D���l�=|��%�<F=��s���[ú_��~$�k�1�KoZ�E[��?{�前I*�������%Y��_}��'�1W���NFU��x���]
!��{W�}��	m�x���q�Z]���^x��E&O!���/Eg�)JQ��9�#A<i`���8X��blN%3����k��6J�z�G�6G��ַ�Ӹ���v��nR{.�,.ʓ2J���:'���@�od��^�Z�U����Lg�x���Mj�0��N1��k,C��H��V�r�v�t��;:@�ѱ_�J^��>�IJ""M�!	/�c�s��u�u�3���+$g0<VWRN�3��y���Iv\Wmt������:�wr10G����5�z�1�ۈ*����uaz#��Ƥ�S{��N��3N��x���KjC1�>�����J�"�r+�ó=~R�	�f1r���c�]cESC�������bJK�vuǓ�@���	>�l{�>Ƙ\�Tb���%)|�:���p����ׁ<��:>��v!_�M[���,B���F
pº�	��	臷�.4,�iO�,�s����?W�4x�m�I��J���%���B
6��$�'lC7�Ͱ�����Cï�����\�;�.���)�(CM&ЌA�T����SL�HL�5�b�,:�̈i���BP�@3c��&f�S����Έ��9�:1x"!ѵ)"3-Hb��\(�ﲲ�N���Ɵ�_���ǥ�}��;@:!��j@�BE��[�u�^�=_�����#ͻ��_�����U��)��s,�V �B�
����o��\
[KX�i٦Yт�ʹ7�r��k�4�h���c��q�eE�[ھlJ?�_����&�$[�ةie�l���bz�oYJ'��w/
���s�J����y��A�.��,L�ʗ�~�;�8ºh��X���X#'�+>�Nmօ]��G��;��~~ql��\_���w���e5�NQ�]���zf�E��*��*"8P�۰~���a�VFP8�ևv��t�?V����9��E�9��p½ꦫ՘1�'�>�������T��f�	w��|�l�Ct6s��(Z��M�#hGj����[���?ݹc=K#�S�7���_f��{bʫlR	��z��{�v����)o }���J��d��I�U?ٴyY��E�?��/.�g�@�E^��o���u�+x�m�Ks�0�����[Bf�;���Eݑ>!����ۻ�Y~s��|��PUO��gY�@�1a�P�AtE�,3�Q�&iy%��h�M%:���)b��<�q��1�LK��&����=�@X_�7�k��O����"C�5B���/�R����U���<��(n����,o���������A�:��ن�.	�;�Y�iML3��9�ېNBk�Gu��ֽ�f:s]s�L���`��|Ҡ٬	�H�f�w��T�t�b�"��Ȥ�E����ņ�"ac�91T'��|�ܙ˫�i�#R(+�)=/�澕��9�
�X�o��Ʒ���mmb���
����g���X�S�o�yv~F9�G����r��@7�k;��_=��[�P���=>�Z,���DM�WDS�8w�YDZ��e؎L�BM�8�%�;S�mן�J�z�]�~��s>��'�=ˌOOm>�z8�FJ̜����h�O‹�x�8�
���YPB�7	�A%�J��M=�wcҶ�?JX�r���\ԙ�x���M
�0@�}N��Pf��L"A�i2��m��=�?Gp����VU�BQ�X��cav�ZEr�yT�L���F�C��RΉJ�C��S-A��(��^���t��^�i��f���m���v���Er1�=��L�ؚ���˪�]�cG�7}�E��x���IN1��
�r@��[�R��@.���n����q"�=@u+U�.�r6�`GL�8�&1�x�)�d�N��%wY��Ldj12S��h\����
5���k�S��bK�����Z`�N�k��u�֮އ�dQok����~��cnt��EƋo��ST��xmmC��O����OjW%�k�����y>:^��k7��}^
��Sx���4�iB��>#fK㉇m��������������cJ���nneqa�nJ�nAQjZf�B~AIf~��BJ*P 9�$�&>%)�����2x�mQˎ�@�����t�
H�'
���@DQwU 
�C���'�������=79ME�e,�S!IT��|D$�@� ���H�|”QE�
T����`Y�pEr�,#�W�#U�F�z�L�CƢ<FE��0#~��*�)��0Q�\hv
y�;�i�F�o��q�M{�^�
xIPE��L��11-��iH���[��"e��Ysi��(����i������嬁gy`�Xk-���t�뚦��շ䮠j��+_���1��NӰ�8�k��Bħ"����t`i�1�e���A�uh\+9��2�GW�;�����=B�G�
���P|�hu����ks����6ub�`�I�NÂ���Є�m�s-�=�|i�ga��tw�d���z�^X.�W�M:)�FTf�����c�gQ�ں���
^�`�$�c+:a7elޓ�BI�VN�՚�b�Vq6��L��
1�)���)_��//���-��`�_2��47�
Q�r��g�t0]MNx<�Y���E\ja�7���3��8�)�3s=��1fE�����sP�ϖ�
��
 �h��y�P��lB�������/z��3�d��x���Aj1E�>���@�2��	!z��[&�x�(�ܾn�����óM�b�2ra	�x�=�…ṗ©�7]�$aLC�)c�,D��"�` %vk\M���w�S7w8���bs�~�sQ;�$�2z�y�ޥV�l�����#|����z�;���k���sM��x���Kn� �=�)�Hр�(�r��9��bɆ�L}�:9B����l�`�R��gc��/���
�u�&�Ʋ�����<R�7���Kf$�T�c�h�F�1*��g��Kx�
�m��t��7�e^�—�����#�5�Jm]g�g]���£3|ӑ��P�0W�y�s�^T3Hk���Q��x���I
1@�}NQ�R����x�$e5
=H'z~���[T��[�b@M�m�BhI0�D�JL.cd�ʋN
��"�� XػΥP�*�wz�#�$M~�Ǽ���G'8�cY�¡��Ԟct7i;��OL)l�"���ٚ���
�=ܪ�5�Ȑk5_�F��x���QJ1��"ৰ�M�IE�3(`�fpa�.3Q��+���vU��$X#�lA��%c�1��r����\�u�u��o�<�`࢒B�9`���R�R�is�7�/�:���O��ع�EOC�B�X�!�ཫ�������;�Gx���l�q����:�1/
���~��M�x����J1��y��K:=��{V�k'�`t&�d��O�>��*����E��B2�4e)�`(6�FW�-��|�D��]ڀ��s�49r!D�0K��EJ.������׭å'n���_���G]�"�&������&�U�ֵ�!�F����w�O^j����,5I;������Y�m�~z۷�~UPPޖx���K
1D�9E�ɧ�W@O��tp����F�`��+�7"@9��S�/�R���1�F��]�ΛA�i��aT6�b}N%x�起��رWtZ�HI���w��p[j��������t��Ϡ�
>�GK�3����􆩵���������� �K��x���]
�0�s�}$�4Ϡx��|��iK�z~�Gp�f`d��fO|Bb��d�>q�%����8�%������Zή�Rs����eglE��<��&��=�e��W{~�8A.Ď�GC����(�?w�Xjиmo��/�]���Jʟx���;n�0{�b�H�0\�M���%,D$q�\?B���adc��@�dtѡa4����M#�a��&�0�j�W��){�}�l"F�69F�8�K�z<N�wy�
��?\᫕p��/�2����
��YN�[)����G�{g���wj��c���e]���ٔOԕx���K
�0��}N1{�4M&ѕ��yL0`��N=�E����"PEy�B�!h�9H2.�.���f]�����B#�ӽ��X�r�!�Ay��D�Ť�E�E���sZ���S���p\�p��⋺��������ij�2�;��..9õ�m�P�u#`j�+0u�g�K7�-x�m�Io�@��}G�/R2J�8^B�����n/�^0�ׇ�m���էW�R�=���©�)�
+b^�2MJ%	c�q%�R^��C=mF@�T��Ld%��
��e*ʪ�H}D�5� �A�X�=؍�J�5~�<?��=a�p�*'k*X�1���ri�r�'����]����XL����K,�����M��@``�X�"�3��B݀0�C�����gѿ
�3C�ڎ]��ѽ������<t�l��B5�O��k�Z
��eGK��C�+���t�u��S�����_��3 0O��%ו��a	߂#_ș��=��?��D��3]{�"����إ׬#�`������`XҋX[Q�\^�c��.Ř��X��^BZ��Wd�#�|��^k�z����w�^c7n�73i�R�W:��n��os�
!7)KR��|�U/�ج`��P�dx�tZs���/���5ˇ?�Ըeq��4sf?�Y��[1U�����inIp;�/x�|�Q�g����������w<����N��F��-x�m�K��0��ܭU�@�jfk��%o"�"A������>����S�1�i"T��l6MU�)�:E��2�^�JG�2���$-�r�J(D2K�S�(R%j�ʩ<=J3EJPvD��REHz^�-8��+�늾H޺o�q�y_$c�~I�4$I�������UUr�Z�K��)x��-k.�G^��W�Y��]��_e,0q��=��a�/������u����Y%u�7֨8A�>m�C׳%!����%^��.ʈx���^�]��3Š���ssr(��>�e��x��6���w֩U�x�	;{Ux���R�v��]:��;{�)[y'�[��|�^�D�`U8�VDۻ�ҍ��x��X\P
��J;��h$6��Y8c�5���Aj�uW�AJ��Ƿm�%W��E�zx��w���(s������6��ojNm�"ku9x�{��|L4y�ıT�.5��v��_�j�6����b�/�&g~�v��l�\����?�
sޝ���]���¿�����]���uB�QH<�2������"�2x�m�Io�@����h%�f��Q��f���"���bC7&���d�9�;=����w���S;51�LY��HS[����1Ĥ
��aJ-�X�Aj`S�-���b�����a��eu���*Q��1B���!H�u��j
�S��)æ%c˒��yӁg�������^?.r��o�芩N�&��i���u�/x 0x������׬����X�f}�����]?܀�����8����% �{?'sǙ/g7߭��y��Gf^jo�څwǡA:�񂯟t���G�O�Og�4��x�f���]d����.d�i_��M�dGd��;�k_��s��߷�j���=�6�����+Q/4�G��B�n�˵^�ty3�+w�k�A2�V;�ȓ���K�L
Ap�ADgS~۔�����"�NΪ���M�}Um�9�� �h�HĝnS	 "'�@��|�����{W�yG��L�N��I�Ě��T
�kGab��R%p�'���4�kkU:)D����H���i�Ȉ�"xE�$~i�Y�H��E/��ҿ�����Ť�u��^A�n����,�vM�]��S�8�IZ4uZd�C�h�)����(�?�w��-x�u��n�@D�}%�ّ�(��0�c.Q7�0;���L�3u*�Tuy��QQ�ʴX�TT8��rk�$J�	���
�H-Dr,
�c$�$Ȓ�YU%#�#& ���ڴ��K��ȅ����k���I�5E�e��<��
"	)�IM��'sx�׬m�ZY��(|)�:�.�{��iG�SK�����G�i��-�l�������衎�>�x�oV$�o�|�;J���^��c��ml
�E�S`qq�4�(������9]��(��].�v�}&�%�(�:����b#�tV~a���݌A���M��H��˦}7$�in�sw������:�F#e�{Kt�'�R�$x�,���B���ˋ�j�ս9	阘���8Y��T�
���Os�M&WN�J�s��x�C^���.
0͸l������>slMe����e��|g꧆�
�Q�{���Ͼ��2�q�;�$�܍�ֽ����_V�e>�w����9Wj��i��g�ʓW_
�%���&#m�egIWG�UZ�S}��q
�����Q���g��֔Kx�uT[o�8~G�8�j2m�$!ٝ�r�m�\�6�ee�@܀M�݄��1��J#��LJ�vl�
,����Fi��e'�8F�Nݶ�6m'q�=���FI*d�n�;=�1�ZV�M�vd�i�6M�O�>ډ[�A���
fDJX��$���B�|�NJ*�#��&���`iv��ul�6��i�jA��
&TNU�������{��oY�	��u�I0��d�`2��7�ѥn�G�Ǿ��[��{u��`�?����ӇSG�K�A�M�s�ǪM�`�>֫���0��og�9(n��C1%u�;-��Uޟ�����T��Ҳ�8-'��iJⱮyoc�;&E�
o�n=[��<<�Ol�i�n����n��&x�ք���m�����|d>=D���r�tB�Z��L|����^L��U���?��7'�g��O�����Ik�鮦�گ[���_����ޝ�V\q7�:��pr�I�+=��)�
�Y�y��谕�B�<L���t��kiFX�`[���zV<�v����j ^M�wܝě�2��|����R���H�T��	RzR�a�JJr��g`O�@�J
IXBY����+����?�ʸ��*��1|�\��
"�=&��s�D�����*Z�^oN�'��4����2'1�a%�
� G�T	�\w]�Q�u/���������9��d7�YP��hSw�i]v���r%��Ɗ}��qH]��9�\iH�A+�@H��h�h��
E#_j)�&؈Җ@4$��M��x����o�B����^L |�y�O��T�������NPpvUa^kRQ����@��l�k�2=�<|I�$��k}�p=L�2�?n~�m��x���]J1�s�d��3QD���	��/�;�̶��<��Ve;@"`��ge(��K`1"��U�ZD
�Svt�2%���ʤ��sK2{�Z�@��96u�eױӇ���ǦG���/�m���{%Ϟ��S��t��ض����C�������w�*�C�\�_p��Pr�2x�m�K��:���
Ue��XB<DU�
���{��I @�`��_���ꦗ_w��h%96����aJI�:Vꠌ88�9��mah�ei-��Q�&���Q)�p�0�eY�1I
� ����S�'o"��¦�t)|>cZ��;����F{U	N��GQ�'��7��!T_���i��L�SZ*�T�K�j�3�����TE�^����.�+/���~�����׷��7׀��K=�f�yњ�X�gGocWc?`��������}��!�6:b�
��$҉�@��1�����x�[��5P��|ֈ���N�G=�e�K^����:��k��jѠ|��(ٻ���e�$uw��c�[��pȧ�w,d�N�S7u׻��*]������v;C�����oKu��M���(Y�d���oR�w5�t�՟��R's}j�D<Dx9?�ǴR�W.�(�j?Ү�$���C��!�tO�8��3Qh�Wp�_�J�ؒͶC�b�Q���<tw��<����^��ߚ]9�vU����8����eGg��-���v\^8h�����S��A.E
�B�UBT�4�T��O	�:������F��i�x���Qj�0��}
�=:;����^��E��������t���O��#�@�i
��#y3;���׍#�z,��
��j�I{�ll�sX|�Nw3���e��<�·\s��Np�qj��[}���q��X�Xc��=�u���*��ե��݋�p޶|�ķv���T!/P�q��Jm�����ӭ�ß���Ihn�x���Y
�0E���~
��M*"�]A�,4�4���7���έ3" �\!��Ap�5g�z�PPfd?�`����̘*pMU�T+�����w'{�SZx'U�:O̻>���&��h[R�\~����NxHX/��kF������X+����'�MS^!��n�˘S��l1�]�yB���Q~��x�;���4�T#�$1���"����$����� 9�<����0�����,��6�k�d`>q�-�������pqM|��Z����;��x���AN�0E�=Ev�@��IGB���ر�T�-�d�DHs��˧�6�U3'ɼ`oʩ�FEc�N*�1FA�%�ᗫ��i���Œ��"�LA�Bb�%uZ2��X
{ςA!�.!P��4h�
|m磺�f7���I'�z��m�����ڛ�f$?��|�P�m[[�����wOQy/gwڸK��ֽn1n�j/�o0Σ��9_v�2x�m�Ks�0��
U�ѕ $aAU����m����o���K��Ӧo�M��E�9�)�
�b
)W �4� B(�U�cT cR��,#�t��,Q`�h�1�bLȘRU9�(��#
5�y~B5b4⪦N#5��$U� �0�5)�EV�`'�����>E#�C���Z�Yx��@Q<�u)`GIq}:�B�����x8�-o��S�����G���I�<w�2m��A�`繾���_\:36
ôccn���0����YA�W�z�a���vY\ڋլ�c}�/v�0�$@�	-r���j����^��"�Z���ukns7�cg�7�Wq#�V�-fs���,�ߓP���9Р�
]�z�&��z���܄����37s4s��k3̻���j��@v�.�像������e�,R�n7���Z�"�G�7�3%�H)��v�6r<d�8����i{��0ʺ�EY	��N��^�&���1���,$�x]��g���FK���Vk\�I��B��+=��5{ˬe.Z߱���E_�r�(��jrt�����ƤoS���@�/=���!���	u}�BQ�U''<}��)�k�>���w���_���x���Mn1@�}Na�K$j'��A�p��A5���e�^�����t����"F!Df!�}�uB�
-�fy�E���ӕ�����&J���/5��x
&?�6V�������K68no��{/����D�8P ��+SG�wU��n>�=�Y��t���{�>gc��d�J��x���K
�0�9��R�K�����z�4�`�4�}-����0��ڐ�-�s9t�ͦ��]@�3�%0i%�8����c�(&�0mp�I|d��j�eR^���NpgZi�[-�ff8�?q�t/:�g@��	��^n�TK���]�:µCӬ4�}�.<.,>�XI��x���Mj�0@�N1�e�H�%١��
�	F�Q*�O��)�}M�з�����ll`y�p��6�O�w�9��z��M�)YD�\X�4iL3{�s�n��h"�p��—�|�O��m�����6�w0�fr�����Z��sW/�^�c�^Q2a)�d(|G:�Q�{n,ye�� �@�t��_�jZm�x���KJ1E�Y�I^�N���'��|n��N�H�jp�.�3<p�\�z
A3��sY��9$3��a*�W[X�lL�\_J5:q��imK��9v�{��U�C�>�Kp�J������wYZ��y����ƞc�5=��{k�������G����񽬴E�I:;��Nso��e K?���R
�x���A��0@ѽO!�ea�#ʼn�0��	,[J
q\R���#�/|�E �Qt�q�ZJ�n(Z(�
z��sq���f��
)�J��	G�̚k�L�w�aK��b�
έ�K��s�ɮ�W���~�~c��нr��z5�w�5��Z��byI�,k��?�QK�x���Aj�0�z�B����Z^)�R���ZyE�l9��:ǁ���B�T<3K愔�R�H�́��.!��<Ӧm@pnq�9�'��6%Duav�Ȕ��,��t�G��>�
�{���p���X�����HΓ�#���{����ܼ���Q���m_{�vT9w�^���K���
x��dz˨SR���`b���lndf����hl�ba�h�fhi��������ja���ja>Q'������r�dKEKA����-��SR�3��Ss�ӹc�J�2x�m�M��@�����Jd��*IeP�]w��0��
�23���c�JN��S�Շn1 �ɱc:e����԰lJ-(��Z6`C�(=�"�A��mͲL[\�B3���t����T���,p����r�d��0J�с�3�u4]ge�P)�n@�F��M����W��8wB��K�6�����c4QRX׶G!`@�Q,d��^���:�Z�_��Ī���
}�%���A�^� "o�����+��G�7#$�%}!I7�x+�>�Q�+!�"�_�vQw\���;�����T;�����-��bި7-]��kT��i���ᝬ�\s��e�C-�h~%�{Yh*��l���X�ׯ5�����y=�V}�`/
�޷�gFdX���{�#�ӬX�3!;�*�Z.O'cv�{�
�I1��E;��c��9K�jt�}3���0?��Ӽu�n� �6�K��
?��f�qY��t"�K�q�+c�O�7=nDc���~��JA_�leCP<�Ʒ��o�["{�M6բ��?2z����
⤛�T�o
�v���̏�_Ly���˦A�K�}�-T]�N]�6Tt]ç%P!�b���"}�aP����?����x���A
�0@�}Np)J&�$��� i�Xh�Ҧ������-�2ZD�VcH9(��gQ�Ω����s\�6	���(���O��%tT��t&ձ�E��{Z��|N%���{J�\��$ E@�Q�n*eh�����E>F������D��x���Aj1�~� �@����.��	%y���Mh�kl7��g�:�a`FS��1����(4ar�N�R�9�M:S��2@�$)q���	c�(�л�N��
�����4�ג��᳿�a\K��ۢ�h&
q���7���\���fG�|��j�=@�pU�,����p�n�SNb�x���M
�0@�}N1�R������`&�`�iK�z~�G�-?xu�Ml���d��:��b��8�9f6:��i��B�d�IbM����yFSl;�.E[}O��|d��Tx����/<�y�z���bD8�=��R�Z��]���cO�i�D}��H8�x���I
�@�����g�O>@_Гi1`�V��`�PP:�@)!���L�%�Z�R�(�T�qm�o&�eP�)9���\k��1��ܬ�B�";O��S��W��p����/����Cv��0 RFgl�ӎ}ߩʟ�٠�ù{�~��|~?Ez�x���Kj�@D�>�v���G�[�\ ��RK�1��C�'�	��M��՛8�@II<2a�Q(d-�G'���N��p�f�C⤌2O�Ȯ�2���H���Q�F��o_\q�#FI%ꬄ��P)8	�h~�8�_��ݾ��Ƕ�Avx���/���Z?z��HpvG����һ�Sޭ}H㚯pZ���	��7(�������r�vk��b�x���K
�0�9����׾DD��'�k^��$�����/ଆ������Dʎ:!i3Z�Q��v�G4��иt`%%�1�l��LD����5hC"EX��6��\b]���B9�6�S�gP�R�I����j�{�O�S���+/�#L�Pn�@j5õ�f�JM�x���Kj�0�:EC��A_[B���[��d�6�f�or��G���)��8Ne	�k����ٓ)b"k�ڱ�6�zcا=Q���k̖���NK��f���)
���,��֗������Ƨ0���Wm�V�Z�1��O�b�{ƱnpJ�tn���`�M6���;H�~�"�{�����U��x���]j�0��s
AK[�?Zg)�7)r"ok;����B.�7I3�0�f@^�T�E
CO(Q��ך��:G�L�N
�f�3����^3:#���XdeGe=Э���8-���1|W���x�s��QO�E��U�B�Ck�rx�b�ehj�۵��i�졓��:���~4N5�T�7�U*���HPZ�͇�Jϻp�B�sm��<���#��p_���[�ڟ5�8�s|�x���[
�0�s�?�&�6+"^%��m#1��^/��0��&�I��.ƒ$�am2�Đ���&K������٘�mq8���I��U��Sm�d��nq�M�M���1�ek�Z������S��m��\��|�(O���2-g�R�IL�x���Kn�0C�>�]dQ���r� (z��<N��i�Ʒ�S�]� �HnD@G��Z�Ԗh^=�H��-Z*���H�tz��(3�g���u�JΫRG���9�ZD�oog�|�4��t�����r�_�'��cĤN�.�Þ��L�'�79��VJ퐉�;�[�m���o�L�!�H0�}K1�;0=9a���{�!�c<�l}0�|����kDOPZ���x��w�	p��x���Mn� ���b�.SU���*�U��XF���Xjn�@w���_�"��F�n�ZfCd�9�ޚ�#Y���*��^�BF�(V�n
�6�y������St��Tx%�\N����sީ����&�݄8­_Ѫ�{jM��T��!�"K��J9>���r��HVʼ	����ѡ��JUN�pFT�x���Qj�0E����~�W&���(�n%�L�R52�������{��	3�]G.��C��c�9ѨI��M-�>)�=o
z4����
�r��;�Ȕ�)gbL��W�hS8g�R�����d�~�e}�6�����5���:��/Ջ6w���v�.%r�p}��/'䃂T�=�d�Ħn�&�E�eޞ�
HY�?�jm���k`��x���=!@�SLbib�e��U"Ŋa��n�쾼�.3cm"����J��`��xv���u�.�0�N��f��7�l��v�2���Ǹ��*��V8�pY�£�!����D�8��G�����1�S�4!�,��Y奾��E�x���Aj�0E�9����bDZ3J麗(���;��ܾdݝ���	T�ܨF�co��Z�*�*h-.�z��U��;׭Ȕ*�a�A��NJ'o8��z��5u�u3�íN�a��B.����[�r|���|���#D�B
ѵt�����EW�
ӝ�)��Ɵ;�
5C��]b"h�5�v#�Rq��7@�X�����a�zTJ%�T���֞[ko��ݧ��Y9{*��M4���\s3D& �̥�W�ٔx����
!E����g�Ո�Wtg$lK
��۠��^.��M�M6xM�φ"��X$Γ��K	�#�=6�
���8ϙ��ϙ��&�����,h4k��6x�����+��j���ZϠM0~
�!�Q#�m�e��T;m��K��f��oB�dz4�����qK=�2x�m�Ɏ�0D�|��9F=lb�{Ԑ!��l0d�C���L��2�:>ջT	N)@�.L�@9���犒�*�i�B	&���tƜ6�0C9APShn�F�`J�A "��h:�Ψ���>�H�
L��YD�<�i�9D���AB
%܉=�`)hO���<I^�O�~b��㟄����
R�i��򌔱�>A9�b���0N���<�}G~>�h�l%x����^��ګu�~r	H��:�c��ȶ��7��^0J���a��ܿ�v>�}�Y�t2�P�:CȪ\+�!]G�l��Hl���a���rctK����V��Z�.�a(z'�sU�F�6��6�e�-"�4ZY�7��� �G��
C>��[��6JT��
ǭ�f�^�ncȃ�$��9]G^��ǻ!��:E���B�╅U��$���q���<8����>�[����.k���l���w��P�c�l՜_>/�5C��cL�$,q�K ��$�=7[l|)��}��ӫ�K�k���,^\n�-���P7�XX��n�X��$��3&���
��?&�)/)8wU8�t���Pg582VWX0V�rA��8�u�%�XC���}�˝%x��RQ��0~ϯ8AEw�ݶۦ��=(��>	2i��`�,���{Ӟ
���	3�f�o�Ȣ���PTR#uU��LkYf]#�:#����g��1�.�T��B6e��.�F��K]�
��e��<�	���goU�x��{6V��u�אWy�5YS6�&KGt�Z�L�	Wš���'l6���?��4�G�'#	�8ܺs��ܶ_o�|�~��=~�����^\�8��L�qr��T2=�>���%C�dп]ނ��a�	���yHҞ����c�>�T{�4Q��ؒ�$��V`
Џx���L6;�[!�בMXH&J���0�����'���W���d)�M��|�nw2<D�M�؅���oB������Z�ea�wlrY˽̚��b�l�x���AJ1E�9E�KA*��&Dܺ�TWWc��=5��7z��=|;T�c�������u�N�MP�"�b(�]��n��J�<�
s\=��ӓO~+�XpŜ��}�>L���h�$7x���W�m�����Lf��8�d�V��{t��vݵ�~^�b ��
۽���y���~vUP.�x���Kj1нNѐMB �G��	&g�`ZR�$3n����>��%3��}`�H�0E��&�S1�8�)=SX����]m�%E;i.]�Ĝ\�1i�'��QfE��
��O�p-�r��~����Wg9:4:����{T�U��\���m�������x�S�vH����|�Ͻ�_�T��x���Kj1D�>� �`�cu�B��&'�G��vhk��19B�6Ń��C�"/��	�x�2�C�9m��N���'�+pr�P�q�h����$��-[�x]��ք�>��*����[�d��ZZ�r�E������N��[+��Ϻya���	C@����9�z�
���2O��)��SR��x���QJ1����OA�t2;#"���Iewp'2��7x��AQ�Z��\b�ʔ��l�.��s������搎�Tl��r�4Η���e�!/�&/9�M.��[��A����!'���۞�x��Wrѹy�L�vĬm�7U�sn8>�{kzj���8��*��J	�u�}H���@ھP�/%.U��3x�m�Is�0��
U͑�DbU�Tol�`�&@,^al���d*��S���u�(9)TY��I��@���"�!�
�3��E�	-�hÁ��%r.ɚ�g���)��H:��1��q��I��T�B3��b������CV	��,��W��ڀ
;�҃���*�;�R��"|H��\sN;0��bH�K�:ڞnoeͫ!��0�+۲�K��O�t�A0@���f��L��0�Vf��e�fh�K����X�^�"w�h���q�%�b1S�Qg��0�ЇfU-������v�n�ڲ���{���c<4�2P��u��@/��Qu�fX��|��E�
 J�|d���myuJ'���أ�)Bט�Oƽ���r{}?����g�N�
�����t7�J��n� �^�'/���9����'��Cם�3Ͳ�]\����5>P&9Q�-��qa'�xø�ŋ���0�Z�V�Q�?͖�2�D6�r��M�E�m�"O�!�&�7k�.���Ӹ�ӽ��Q]^�ܹ����xE}N{U�r�s�6���x=�
�;��'?7&�hWR�����@{~�;�c�ጝ��>t�Y��r�IJz��a�yq�Đx��MKJ1��f)H�I"�Aq=�$/tC'=t����xkU��O"(X�q�*�0��(�-���M6Xe5{qǓ:������%�ũ��vV)�1Q�� ����o��~�4�/��x㭥��;�+(�T�K<�	���6f�g]\���� �Jp��F^�!`/E?L}lG�8�`}�m}0�;��/��Z��2x�m�Io�@����h%�H�(@X�	�؎�[7`���x�׏)�Qީ��R�k�Hh,��@E,I�'�F ����5U��kHCXÓd�hR��1�'����
��(C�$?~ENcJ1MP'���Ty,����*`m<&c�#=��-\�BQ]���K�
�N5�s�L�/eQ5�N44��,�A��s{�^������e���a�%�5Yw��ӗ˙(tB��:��ZG�7�����n���0�.B`F�Lɏ����U�w:է�;�����0�G>����H��1��ң^��o9�aQ/�7u�\��щ6Yc����x�iب�i%���G��Ȕ#m����y��o|�W�9H�ʋ�o���Vy)��-���gC�A0��:��%�N"I���ᳰA���0'ZluRKf�9�,�xOܝ���G8͆�Xe�C~A{��'_��4s����Y�ﺳ��M$����	/6B�9�w������~�9R6���Y�*���5B[�  �������r۸���p�N?�B:"�d�z����w7V�{c����/
�¹���?��Ҷ.ѱ�˂��.:>�xE~��Cu�I��r��x���Aj�0F�N1�ei�X�-�P
�AzI�,��㜿!G�[~�t�S.\�fv=R�#�X��q�������͚6�JAE�ڹ�|{_�'t!�}vC�R�I�ޖ���t]Z~�N��zoy��!��]}�g�,��U��n>F�˄4+=nˮ�h���HM<�x����j�0��E��[J�5�R�/��+jYF��k�	��00�U/�#���$��Q=a,�#
��<���m��j�)��@���3���y�DR����ߦ]�U9���_x���M�W�7B�"���K�u1�����u����f�.��l��
�}�Z7���N��x���AJ1E�9E�KAR�IW"2�A��2;ɐ����x��?�`�����c&=�]�s�u�#�5�i�Q���&���hlZ�l��3R�9F�H)8�2%�^�C���/�;7��u=�/��x�R׍����[��Q���k-"�ϻz ��<��إW���r�{�ޡ4x��@h	>� ��
һ�ʙU��x���AN!E�}�J\Nb��i�3;w.�@I����K<����r0Õ�
�(���F�r�d3��q�L�dָ|����jZ5;����d�&�_�U)�i��/�{?�C����'�<��MJ�;?6��Nk����)PK���|yX��u�{���s0�y�<�4��@:�~����3�N��c���Z*�x����j�0E����.E�BH�݄�4҈�X�����|B���px%;d�%ʒhHҡ-�G�MA.��H:�KZif�E��Ѷ�FY��.bH%BE����(�ο}�����f��7N�9_AY��.H8��{k#3��.>�=ý�e�+C=J�z������? !OK�x���KN1�>Eﲈ��/����t��d�؃q|$.�[=�����D9:�؆�!#d�l!�B���V�>hH��0��H���m�`YJ^lN,)$�&v�|�����d��e_C����ԟ뤔��>/ۀ�)���mk��<�~��\_��<:D\�F��ާ���:��3W�2�<����8���Uhއ<���k�R�4d`T�5x�m�˒�@��<EWeI&6׆���Ќ(
(^"�i.�ͦA�U�&�'	�Tvs���-�s%�*�("U��"�D���$(�DY��H��MD\RR1j1�M�C���C�$�5U�<&H�#����B����z5�T]��A	�D�΃���j
֌��������z�Y��?"�� �,��� �X�e��`��i�窦�)�iβ.�1�8K���S��Ol,'K��'��ٮ�>8pm�6
��,A3Wx�����%j_
#��#ALY�91>����Q=�:��c6i��\�h�PK䋶����"N�~��P ��i��!E?@c��''�7�6�fEy�]+���G�%�ջ~W.�*UJc׻j�	�Y�֑?1�C� Cl΁%�.g��;�h���f���L�4��U-��_��V{�w���蘎��Da*�v�ɢ���m��1��u���ǎ�	��.z�v3��Ƈa����J}%���b��Jj�����4>\�͌�#�_Ns� N-*�G�F�j5�h3�Q���6~�K�W����{��1�%4%��Pr�H�7AB��M�V�]kznGe8̋r���X�I��AC�c���U
��z�\Ӏl�6g5�I�a�]K�5g����/�x���A
�0@�}Np)�d�tR��� i&Xh��N=��#���,�:�d3 ��!e��L�cc��������
G)b��RJ:�	�i���!�mRa�����~N%����%�|�,7m�� �G�S�T� ���@pя�C=m��W�E(�x����J�0�y���l��VD�z򘤻��&�h��oo����Nv^���8cp��z��)�h�x3�G��wjN��E^��s�ৌ����-yֆ�*��w���ヲ�x�IJM�5�G�Nk��E
�x�r����?su���� �|~}.
��(Cz����ކ��@Su�x���Aj�0E�:�@�!aF�,M	�gh��јj�ȓ��&G�[}��YW����e�2�S�1�'�!�|YPܖ��Q�&�U��0�j��>��I����O�n�Lu�϶���p�_����eU�"䫧Nx�-�l����[�wxl5���uk�6��
Uw��k�?=kOU�x���Kj!E絊6-�JC=��<�J�.m��YB���G@0ٺ�p�Ň��V���:.k2[�֞7^�<Єv�9����!)8��Wq6�9/�)}л���O3�y����#��� /�����<]�ɒ�qT��<��^��:��r�n��yRmg�3�B�>��Q1�_TaT��x���MJ�0��}N1�R��$�Dq���dB_�Ҏ?Ƿx����P���b�:��6E���r&������r�j�y�H�}�>y抡֘&D.ܸ��BD'�6o|�~�
��(���|���-���aU{����c�p�W�nc,f����1>���6+���&� k��c1�N����i�Oc�x��O�N1��WX�P�Q���
!'�
A��8�H3q������lↄO���,��Zv]��^U]�t���K��*�h��^���F
J��o��u-���j�*���6K4�ٺC����2p�7�x��H���<������t���M�j�F�)O��ʋ�F���^xB���������G�-	��c����g�v��p<�O�����}	���֛��e��]da�c���eJX��q�2�|��1����#OeN���>�x����ဣ�?����s	%���`�f���=�u��ټxD����x���A� ���'.M�)c<C=A�5�b*��6�YNf�P�:���H�s��eA�
�x�	^��s#+�]g�)[c��BO�%���9�l<[��O�ׅ�
+fj��y����(�Ìv&֡����
�j)����v�>ҀRWЄ��Q��a�I�x���KN�0D�9�w�@3��O�!.�N�v:�@Gv\�ĚZ��UIŅH�q�
hQ��ZP�+Gh�Q��S�,���d����2H@6H�F�� �*D#�o�"Ta�:�8�a :"� ��NM��Ϲ�W���K�bs�x���/[\�?
e��#ŝl�R޶����w�T�튂{��i���ȓ���z�ׅ�[��������\�k���"��s�{�+�e�,���?����uk�x���KR�0D�>�vY�/��(.�!F�Q�,�4)��Y�l����N$PKE
K"���s��Q(H�)��R�贳@�qY����!,�T��GK^Y��Wn��^k�s4h
$+KZ��^�1��7:���I�	��.�
p�V����؉Z�/��w��\��RKq�V��L띙��N��o$R�=��Ra���hE���x��۝�G���~�j�n��m��>�F�/li\��^x�%ű
1P�D�l��;�t�v.)B���m���y��/o���Fe�b.�%Jj�+��t�:��������XW�)��ku��œ@��|�ۧ��^~Qp ��rx�;˴�i�/3]..�Ԣ�T�����Te3K���T��Ĝ��r���T���"��Ԃ��̒��J�`f^:�Y��x���[
B!�W���uu ���:��ދ��ZC���r#�-ǂNA
�XA6�˞�	*DH�!���%)�Č�SԅM*!8�6W�F�[�(��mғr'yi�֍�:;��>�v��A�^�Gy ~��Z���~��9���3�F�x����j1��s��ؕv}J(�i���&		���J�^QI�H�u?r�'��|����L�ц��;2f�n��n�vѦwԮ5�J]�F̔h����v�]k�R�Fo�vkݺ15����w��I�t	�SD�/8��H������J_�m��60׵NU��OV}�|�>�8E�����saX-���9�=��������4���$��<J5�@	#U`'��9>����w�#������H�(�����..O�%{�.�ѩc�B9;�#�c=�C�PlF���S�9G(��G8x��S��ԯ>\�[��u}Mod'�مz����\x���
� �xe�$Z��ք������~,�{c����&���+%�%%[l�$������of�} �@��>������y����"x���An�0E�>w�d{lk�@Q4HQ]�
�D�BeQ��iO_�H/Е�O�G��VOzԭ�N!
}k/�Y�nTWc�J��W�DC�P(�F5P7���B�4\�Y�r������j�/���,,�fh#��K����H���+?^�@7�׳����vhۦVW_
�Oo�b-�N&p$p�'HB�|��8C�x�}Y6
B��/,�2�
�e�{�`�",����SL����w~�X
x��fȸ`��o`�����9f�������h�f��Z����	���I<��,8
�H����W���pðQ>b����s�X��ye2>������T���Q�|���?�h5�Y*}1K�����x���AJ�0@�9ŀKA:�f�|D\�v�'ȴS�'�v,ߢ7��m� �LsJ|��3�LB���i.i��#�ϲi3�9x�L4����”ʑ� ��c�%R!W���7x7=��[�r����lk��>4�'��'���~8qS�u5���.���MM�cm�p\�n��?�lZ���x�No�x���M
�0@�}N1�R���)"zz�$�؂mJ:-��|�UD�>E�J�R�,��Yc�1d��1.�,�es�8DԼ�ʍ�ύ�����x�N���ea��Txn8���q����4��	�ˆ=���#�c���@����L����k�>���\*��P�*B��N�2x�m�ˎ�@E�|E%�$�V�*H�'
H+��P<�P����I/&�<�'wqYK)P(�(H�*�"D0J� �H�cF�*F�C��\CZzfǚ*J�D�A��D���EH�F$�4N��+DK4���`,�a?�c�Z'�$9�H��kF�������o��8լ��kD$#������g�����1ڂI��}��uK��,��g�-k�������^w₵=Y�Ʒ�88p���u��u��fd|32�7���Ul훮'S���d5���/�d�?
AT�>���^7~�>6W��ݺ�4yƓ������g��W�%�Q��!rw�e�)T�Þ�]w�F,�v�i�#ʖ�
w�
?�,�`�i[�֜>�=w��M��8��ӏ���e��ꬸ�ly
�����J���r)=>�9�`��F�����>����h��a��� G�"-�l��7�tNf��I��iˁ���m����\�������'�����q'[���5��.��h����j�</~�h��ܿϬ��Ǹm3
��,AK/=���%��u�u]���uٍRJX�ґ"��2����F�˞x���[
�0E���?����6;�+��,�!��\���pp%3y����S�0�6֦�C
��#��QԍzS�E�-G�:�g0�R�֒6lj��&�)��k���s�Cq68o?�*�&����3�Q����(��ա��,P
�m���6��Syu�/X�MZ�x���Aj�0F�N1�e��cK�R�Ȳ��=�d�C��i��#�-|�$�
�*!1C��,ZX��2N���v�F�ÀNҔ��✂�Z�G�|�K�v�v�4<��u[�q*�տq�y�?hV�;u����H���M۲�f�'w/ax��
j�h^�
mJM��R����{�SN��x���Kj�0��O!�P�į�t�YtQ�q˖i ��D��w��/?�uL�9r�R�9��>�\��~(YF')sK��
�"yD�)_��b�2a	�R�ѣ�d�]��g�Y��?d���un���*���qp���[�U埻y
�����r�:�Ǭ�;��	�!/}�-Ikߚ��jOʕx���[j�0E����~�ޒC(]CJ0#�H���5	d�1]B��������6�V�D� 6�r����[�X��p�U`
ѳ���Kl8�Od	cs�2��B��%R��[��G��+\�B�p�[����|�	FO���T��r���#�3����Y��8��Y��p��y�C�z��Qk�x���Kj�0нO�}!X�(�Rz��	�X��:M��a���g���K��4e-<����JM�W&M����`V
-�֌��牔�����s
DeMu���3�6�d���)'��/����_�v���	Kʹ��G��:z����}=�.9�m�`.�҄�uJt�x���K
�0@�9E���L���"�QP<@>,�V��-�Ճ��Ȭ�B
2:�dCu}N��U��M\��ɪg�m�o3��-jJL��4)���rF}�p�/C�&����O���҃�=�J��z� � ��C׵"�g�n�����9�w��^}5�Fe�x���[j�0E����~��z�����+K��I��f�u��~��]E�|J�ǀ!����Y�K�~�1'47^�)p��B��K:��.���;�<�#φ��W�V�K��^�l�=��.u��k=9��Spp@B4�׺��?����78�������I�ޠ\���g����G�[��*�SГx���K
�0�}N�� ��t"�<�� �)LS�Q�Gp���ʬ#&rv�ŗ�1��q �i�X] YcԒV�E�DX9���2[5R��Ft9C�N������O������M��dj����M4d=�ށP��6��]�������+>D��x���K
�0��}N�� ��9 ��ԅ(( I'X����[<�����4ޕ`���ې2���^��0@�FW$�8Qϲ��9����WY(��!�F�#�Y�7?�Iޙ>���ХEf����K/Z��[	V9���J�R"]�2ӟ�x�Md���R��Z|+�FW�x�u��N�0D�|�J�����؎tB�AC_��ח@���'B�
��̛�F
3dC�N��j]�'��"����)(�\��*�Z��γ	:F<irʵ�ɷ�7ڣ�c���Gd�Z��wȉ��	�2�/���s^��lpھ��[�:�!�=���J{���4C^�I�<L�X��\�:�/��5v�Z����p����+o7�A*y�ל��$�y;&&���F��<�e�Ur����/��n"�x���Aj1�~���B��ql�Rz��Ȳ��u��}�>��a`cC�Oeъ�kTOK\*g��H�5�h^E��C7!�H�|H�b�k��eA�R�O9:���\Mt�Ko�a&��?�a�V��<Q""�H�Nzkw3�g�^����܇��`�P���1z7��	O��x���Aj!@ѽ�(�r hik%�0gH��,��������������V5�T(o�8D�00��k�ڂǰ1Wg~�@)�`M$�`�ᔘ�K�l�Y,�F��|��\������v����|��}���ȾD�5<{�U��<|��C��Z�
u�kN�}��6^�u����S��x�m��N�0��<�I����[�P7XX�	��iI���H�=�[��p.��`�n�d���M�b��^c���.\�\A�Q�u1i38�R�a��p�i$խ7�KL�zNʼn"Ji��=Gݫ(v�	;nu�>�|����d�������7A�A�j��*xD�؍yY��J��c}mv�\�2���:���w��M�A����|5Y+<X��N9/3ל�u��k+������6�Q�w;i��x���J�0@�}�b��"�d�4�"�[���f����f��ޢ�p���%��{�S(e�h�Q4����ܧ�dN���9�Ĝ��,z�]�}��5Db''��;<��u��Z�Cܶ_���L��ljw��(1�5zD�VKY����|785�[�q|W{����{[�vyV�P8�����T5�x���]��0E߳���4�!>�]A&�b���(.����t�@�8�X�1��C�<�`C�l�$]lj�^0)E���OR��!�>p{�,��z�.�"���煮�&�̣4���'��<���Gj^h�u�e�l�<�U?�f���Mϵ5ʂ�u��m����|¡N��x���j!��O1�c!���j���<���TX5��y��<B�������A��ˢ�����RJ.e��J�����M�$�h���j��_WS���j
Z���C��7�7���2�2^�-�ƍO�����+�5�J��"�o��cvg�ii;2�o�u#�N���ۀ�`��V�@?�~��x�T�x���;
1��>�H/Hf3��(���h����!zz�
�W_���,]$
d���:g�s��L��s"�,�Px�Ҫ�}Fp��J�� 1|��{��-³��"�҇I^��
r�?��0��'�[	�Q�i��+�(%�y�Z��U\�*��q��ӥ�A��x����N1�{?�J�@���v�Q"�a�^���������3�F�ftU�ȾyI6)*�ڊ�>T�PC�\��Z��.]��c�\*N4���P���4Y�%P�6�_Y8�����p�� �\�F�8��7r�C��^d��7���S��2�j�q�w��!\�E4�,����y��0uY�6Me�^�|���Ƙs�[m
�Y�[��揇�|z��x5�k�a��x���=
1@�>��$���GD����	.�����ӫW�|Ń�ͪb���|R��/H�,	���� �<�;�:5`�5�"�w}�l�d��L�g_�Q��~��m��\x���/���j׆���jҶ����S��������qhM�X͂��"0<�������F+�x�m�Aj�0E�:��F#��BI!IK��B0�'�C-y���B�]����*��%!� �$�R�)yۇ����vt��\%+XĈ6��%��B��s�[���ibxաT���3\8/����_>����	�:����֤2M��Tx�u��ϥ�u?|�:��قn�c�Y�O�ǷS3�Ɯ�o�\~�E��x����N1E{�H�@?ƏD�PF|�x<ή�nV�#_�RP�q�{u�t{c�
�*j��$[c��p��IW6��BM�;�V�2��hˡ�(�'�vFr,X�7V뤫�"9�N��b�Pr
�R�Ķ(�����1��F���Ӟ�8�lg�O`0���9��Nk��i{��� �(��<��
�k����c�(uֽ��i�6]O}\N�����@�x�t�p�Y�7c�pДx���KJA�}��KAz:��CčK��L����=��+��E�uU�&m-��E9�R�@Ur�	�	�`P)�N�h�S̞R�<Lc��"M\C����o6޺�?�����j��V}��^`��¡&x�轓c�3���R��;�̰�V[�U�k^L��d��rO_�
�]�b.Pߝx���A
�0�y�ޅ�٤�"��z=��M�Ţ�R�A_�~���a`ʬ
��d�j����L�#39�I�3�u*������r��>���Vǽ4y�(�ȳ\�3�s�	N﫼V��M�x�jҲ�/D�`�Ѥ�8���9?���~{��é��{`+_��|{E��x���M
�0@�}N�� �L�� �H�ѕ�$,�B\���+�|�Z��E�J��6�l���]b��!|1Fe�b��S���oEB���
�j�G��Y��L���g��Ev%�$/�;�Hn�W�:����V*�u�5^�D��q���X�uITY��sߝ.����B��x���AN�0E�9�w]��8vbGB�
K�f�h�&E��(�',������Z�L��,�`����(��)�T����+��4��{?�Zd���
��|1�b��۟OP5	�!#�d��&g�Y����o�p��*����wv�]�m^������a���{�@��eY���k���	'�W=���ۭ�iH�c�_��y^O��]���\��x���=N�0@�>��r���	Bhj*0�gDX;^9N\����6�|��+{�i&#����Q�K�D�LW�+x4X�B6e�$m��
L�s����'z��>�id��B_�Wg�Z�|��>�
��W8o̔{k�*��N7���ZH�zo���z�ʠƟ}\�lG���m?�j�1�u|R�x���1N�0E{�b$J$�3�d�
5����h7N����W�|�{z~�Q�k����P��2p�D���*��f�>�8�9��X�
NlCԾ$�#�)�b�b-�d�~�z;f4z����lwz�e�W{j�/YE���K]�m]w��d<��^�F������ݓh���O�/���[��CNI�x���KJ1�}NQ�r�IRUIZDĵ��Tpp:�RhO/^��[<�E�P$�zpp�^\A���T:�h]/�4���PϾV�[Gg�����;�ő'B΁��&���y�y���G>2<ȟ�z��U�!���c'�֚:��*����=��ZV��c�s�4��
�o��ř_�|H�x���j� л_1�㒢&�L)e���oud�3ai���z|�'���F�����~��q�g��Eg�	5qV�W�nK��y���d0��7��S���Snm�LjT��狾	^�OW){��sey�l���E�Z�����?�zr���쉄�G�۔�sM\c���=� q��.к�V�Txo{o�}AV0�x���M�1F�9E�,��O'���g��+،�-�����
n|��=�"`]i>��ڀ��:Pd�������s�E!4;J�i „�C��qs)��~̎�����ν���/?��^'��r��"�
�Sؒ)[ءC4u��IU>P�W����* �]��۸]����y��H;�x������0{�J�HhmǏ �h���*>`�و�8F�^�}��/P�43�D��vS�V��G�8�$rʽw�1�5Yp�/�g!Kǜ|Fv	�w8P�
�Я�j��ƴ��ߝ�'y�E�2,rXE�`��u>dأG4\K�U���B:�1�
|�Z�Z�
�gY�.m3�;LJљx���AN1E�9Ev]TBv;���.gp<���TQ@��S6���{3OyaH@�{")ֱD5�Z(�X2Tw�a��*El�;����ʵP���A��LhY�xh�W�� ���Rr,�!��M�����<�ß���_���K�����yY��6�OSa��5�#D���^����ƛ�6dӳ?,�i�vp?��RДx���KN�0D�9E�f��kǖ�l���6)�������|��zS�}$,VB��0J1l���J"�K�jn�t�`S(D���@�Q��Z�z�Kª1"O����C%o�1�h�a�QLa��&u�@�~�|v}���'9��o}^y�q�
6��u	�ɜd_׹w��|x����6�¥�t��8]`��|Y���
D�_���x����q��F���i�Q�����y����eb�I�����e��IR��I��EZ����^F��͍�
�
���Js�R��3���Js�R�J��L�,�'���x�m��J�@��y��B6�?�E��/��3=�h������� X������F��h�:YɄؑHJ�<�>j�|�b�B$���ђ҅�[����ѽ��F/��;}/
��Hi+tG����Ĕ���jp�C.�^��x�3d��v��\�[�'��ތ���H�<��r�籾��%^���u��N�!�3k^�\�}�����[�c!�<�G��5�i;�7>�V��>��pee�x���Aj�@@��B�e�X3#g\JI!Y�Zr�$�@lG�kr����kJ-��侍ZI���'�����M_g���Me�+�m��,OB1Q̱X����4×ۯ��9
u�;�����P��4���"6	��R�i.��=����|Sv��i�~<�}��UI�x���K
�0�9���$�K҈�[�z�|�X0���=��#8ˁ��NޤGvV���3h%R�d������x�N�!� m2�{絋Vg�2��q&����(�hEX��:ܙV�pk%nf���J|ѡ�A�ZID�����21ӟ��s�kM��y�>O�B]J�.>լL��x���MJD1��9Ev����_� ^������8��2��/`��>jU+ ��E�C"$*(|�91`'�����}Z�#I�9�[��{���^BRɁ�翽+A���=�/��7��:z����k6�5/ǰS�u���Vy������Vo���|�.���S��	VL;��:��S7o:>��{�ؓ,�v�O��W�x����j�0D�
�r-Z���B(��^�/XI��`�AQ����@o�cf`�7U��D�h>,L�
>3��!��<��.Mk7���%E���'`����Ĺ�Z�L��1������Hl�r�Pn�3/�N�p�g��|u��j>�y�������]_��7����k�t������Oڮjb��n�t��}�*�7y)2:��l�&����O?}`U��Ux����4�T#�2%�,5�<��� �$1�0%��8���8%�(�<%9-��,�tb�	����ö�
��\\ʆ�
�
.�
y�%�y�
�i
e�Eř�y
��
�y�y��\f�ğx���1N�0E����H���3��V4��3����j7Y�5��Pp~���~o�#�)�fK`�R�W�"!$���T��C��,�I���/	����PQ)�C���|2
3�ق�2�5��`�,��$�u�A?����K3���E��=ᗞ�y�W���M��Gq>x?�m]Ͻ�����nvr��+��i���ޕUS��Dx��ϴ�i��F����q��Q�aR��eb�I����QrZ�QR����I��y�e����؃|
�y%�
)�e�9�\y^��x���Aj�0E�:��([ь%�=@W9�h<�Ml)�j{��}���緪
��8E�@qfA!�$\}>�1����<�jn ��v�lHLO�l)]ȑ�X��ik��ͭ�MJ���罿�]9�l�.��a�vr�6vL��֚�wo�������s+�\��
<�<!Vβ��*����/P�x�m��N�0E�|�H��]۱�1Z��������&�ċ3F��I��(��}H�Xj[꒕.���6���
=��$2��Z��QG)����b�VY�h�B/�V;�(:4�EO[w�C�C��'+E��(b�+���-��)+��_������(�2
�VH!���yd�O#?��%�N����C
���O�y�r!��i�B��V���/y�����s��z�>�Z�(��4��4�)�:2����_��=gݞx���A
�0�yłGA��6iDīW}A�lQ0MI�}��'x�a�1�����<%ݏ�h��l�ϑ���z�j��'��c�أK�-���@H�B�)��w�dWy�O�'x�2�f���7y��ç��
H��`���V����?wu@�{�[��*�*��eG��x���MJ1��}�����+=�x�+���ΐ���6�
�>��3P2����eV-�ȋ�f�έ��c����4�&�F眒�I�#G��������,�#S�萏>൧^��[����
O�W>��ި�ǵ�g�}@��E��S[�ݙ4^᥷;I�������ٿ%H�
�}��+�B��Y;��_c�x��̱J1�>_1`)�e2ID��ƒ�'��.��H���W�?�}œY
[\F��]*f�&J!Tvq�G<�L�C ���l��g,+�YW�.���8�<%�h�U��uL8�e�:��s����?x���!��	z$�#�렵�ѵ���>��xy;�Bse��]��[�66�M��7�	V7�x��̽J1@�~�b�R���$+"��,�'��]�f$Nn�ӻ�o ��+��R Y]�����Z] ��`t&F�4z
)y�|�(] d�>m#�bk�1kJ���k*�O�uZp���8s��{k8�7<�_�����=/�]0!(�W�WQ���c)��,w:<��l�aÞ�������(Hw��K�$��,?Ǒ]ۚx���AJ1@�}NQ�R������0��JEғ!f���
ܾŇ?�T����k2����5��%�P+g"�B�ĝe�i�b�U�H�x`%#�|��/Xx����2��c/���[k2._�4~�/o�l�A���#Lj�#���n�os�;��#m�W��}��|Z���m�}��T��x���=
1@�>��d�L�]�V��5�5��Zxz����3 I���V�W���)X0YCs��1�N��o|�
k�8�ae$?a�����]L>�@�/�V�j��R�K�my��}��u�lb�� �)�P��5��S����t[8�Ü;C,~��gO��x���1nC!��Sx�T��A���G���"�B�CO�H�
����
,<��m$t�LVq�췔��(Dv�G�^�����"}$*H�@�T9#�3r]�}�WϽ��ښ������>��Km����9F)0Ë
֚��u-���|ʬ	f]
��U/gHM�47�R�x�m��j�0��~����7�Pr)ɹ}I^�&����y���{�c��JN�/��!���sv>k
���}�ݖ*��`qŨ�G��="��i0%G[z5�Rb��‡����Kn���/�>X�1�2��vm�
^�V�+�,�U�Mr?2\V������$�O��ֽ�ls�V��a'�c�F�>	�'Mh�f�����.�@@R2�x�m�AN�0E�9�H,ՌSDZT�vk8�'3%$n�1��b��?�'}+��d ���8ѕb�0�69�)ā0��{��-�Pa�Gr��>&��>y�c`2�إjs.�n��������g�:��3�1`�λ��)��b�^{��-�}��?�+��O�=x�'��@�2�ץ�ڎ�
�Gїx���KN�0E�Y�%�聛_	!��
�ġmS��|"$6����{��
3D墔.4����%%
O��8�C
�����`�>L4����HrP��B���_�Zk�4�>��h\ĤѢ���S��'c�?ۜ\�oy�N*<�_���9�;�G�U�i�5�v?!o����-^��3�B�ϓk���M%opݸ=��÷0_!^�o���}�NgH�;���|W9r�&�k�����	p�x���AN�0�y���Fc;v�B�~���	��x"�Y��1��C��.U�̐�OZ�%�5�d�G�m��r�
=R�<�T�4�fO��=���:˘�V�09#�)t�U*�q��oܨ��)x�-��yp=�"�������z�1�jrFi5iO8#}�rk��ᖿ�[�](�Nm����h�A���a��^R�?�bəx���KN�0D�9EK,�0�c�m	!88�?��@28>i.@-zQ���U" ����	��Qvt#a��b�)�6�/�*]��z�l�E�Л�0PPXF�Hd�®+���"��#���Ţ.c!�4��!�m�
��>�/���lp�����)�Ez�Q"�~�VH!���rn���=<S=��<C����7ZB����2��<olj[9�����6��0<�m"8B/(s8Ac�B���p�x��PKN�0��ޱ@S�i�6B n�n�̄i�Q�2�D��x��~�df`�8[��I��f�=��#�~��qA�Յ2G��OukF��XOh7!1���<:�u�rJބ?9�k��x(7�I�6��D�Gh{lk&½n�VKڶ ���g�@N��+��� 	��%�jZN��{�w��P~8/����p
U:g�3�^N�N���������(�E �[��۳�)�C<��I��Q�Yw���Ox����q��F����q��Q�aR��eb�I����QrZ�QR����I��y�e����^&#�-Ս��
�
���Js�R��3���Js�R�J��L�̸X��x���Mj�0F�:��e�я%���s�0����Y�MN�
�}o�_o�D�ōŎ�e������Ŭ�f1n�v�1�ru�a��'W-�X(!�`�+!8��sn�݄W8����O��Ӓg}_�`p>y$��!!9/�Ի������o\7�=s�K�:�C�,Z&��\�m��M�x����N�0{�vW ��3k	�k(߰��\t�s�$�zB�P�4�]IԹ"�XM5�R��
%<�`u��wi]
N{�u6ĄY�O�UF)�#G���9e]�V%:�}���p:�¦�D��(����K�����_O�K�li���x�<�.8k��8���-c�?R�*�] un��.��]��&����|ʺ����Y��x���AN1E�s
�@Bq�ĉT!6]"�`'.љ�Ҁ�gXp�O��7�p���)��H<��J��T�jI��Q�U�n�mC�)���w��@]+��q���g�\GC�9F��XY�Y�<%E�&���éWY�]���K�c^�j���'@��)���y禺-�<���:�X3�.k��a���9���
�}�u�M?quV���x�[�4�i���ER��e��i�a�����ab����a�y���yb�������ebR��؃�\����x���AJ1@�}NQ{�I%�T
DDp=gH:�L�I1-��G�0˿xU�lK��d���PR�[(ʫx��*����>�|b�Eb䒼�	Y0���V�a#�������ǚ;\~?�O�g��׹��K�(q��<Yg�Y��9�j��v�o_�ѡ���]�����FoF�x���;n�@D�=��p���.r�˅[�(��#_��`^1o��
�x�q(J��y�"�h�Hѓ��\��Mg-�W���S�	5�гp���@	둡ˎw�/
������2|ꋮ6N�SO���3O!���,�4��S������g��{��G?\��]lo����L؞
x���A
�0�{_��Pv��M@D�^/��$[,�����8�����X�[bvQ��Թ�6�C��,�ʤ��#I�`��)f7x��x�	
�5��1Ws�i�d��A�zұ�����Ѡ'�[�h�\�*��V1��|��m-_7�AM�
x���K
�0�}O��P&��"
v#�=�$�b�����|�'��>�7�ѓ7	SA�M	l�g4THOh1�n���(7�Xb.It6A�4�Bt&`��
�:��{��s��Fm߹��(K=�\��rR��u
��Y����kIX=��>�u��RA�x���AN1E�9�w] !{�d�B\�
��qZ�3S���!q��/�����"֔’[nJ�Ve���<a�"�ٲ�K�}��J��_��S(y��X*�%�?�jȦ
QSd�b�,*qM�]#��L��׸>�}���V&y���^�u+7{�m�1����9=��:��3wo�?
J�]/p��������W��Ax�[��q��Fb��i����ajbZr��Q�e�y��a�Qj���E�Ij�arr����^#Cc����eA���pq��$��*8{8������s��%�x���AN�0E�=Ev�@��&��B\�
��N��MJ���S!q���ߛ�!��JS�@=%��'��9��D��˰q��M�7�F;f���;�6fJA%'��$����1'fR�@L�Y��8ـ~��_k3�]������av��>���}�h\H֍�����ܻ�s><k{S#�K���{��y���,筶~2s�դ�k����+bK�x����N�0��y�����x�!�p�'X�H��l���!Uܙ��73R�!(�Hlv&P�!k굥����5�؜��*����̺K��.�1x�4����`g-�g�r.pO�;�6��09���R1�7
]d,^��x�������a�5�dZ�̧��И>(윅;��IeY&�g�y��+�i��r�>��T9@`9o�m�6�x�������7�׭}/e��ʺ��aZ��-<��4?��s��x����j�0E{}��0��!�f�H?�ƱY����b��7�8�8���
���#�8����t�Q�ͩX��Ք�.Mo�����x�vp�
�X2e�c���R�/m=z����/�!�����=��\��`�c��;OͰ׵w���9KQ8?�>?`�m��ۼ�ܛL��?�My�x���Aj1�~�o9����2���Ҿ@��$��
��w)���03���P��JL: eĄV�e.1'6l8Ww�n��@��"Oy΁�̵�"�i.�1K�g_�0[lB�d
P[�(B�T0Kb��e�{د��k[d7z���q]�f��ƻ1RH��
v\ݖ�:����O�g��y���m����Xm��@x�[��q��F����iZR�����I�������yJ������qR���i�iR����^6KKcs���-� ,m ��
-HI,IU(J-�/�,�/�T����.�l�ҝx���Kj1�s��y�_Kro����x���,��\ ���jZ�/Q�]yr�d#��BNS^Ƙx��!m�8��D�1�]T�[#�)��f��OtȘJ�ɐ'������P(���*m�9�}��oi��+/���W�ϣ�M^��7PֆE/��r���S��o_<R�W8մ�q���e�~�~�&[�x���Aj1�z�n>�F3Z���| ���fd��FV�?�4]P��Z��%qj1b�]n�@T�br��s�m؊^\�H��lX�ҦN*y_�9�Z���!B��Y[M�bɂ-	`͡DT(���qٻ�������2��==���q]�M���w;��yʢ}s3���zC_�ͧ�����V/� ����k�W��x���M
�0F�9���$i~@Ă]��'H�)L#��-��|�o��F&a��7��C"MvֳS*Ɯ�V
c '^q��A�Gk�B)$��!�nJ����9D�\��K�����Z��48����LO:��g@c|ge�rG�Zʃ����>ghi����2p�q请A|\�I}�x���Aj1�~�o9�$˶����/��r�������q����K��@t!�� ��&���ZQ2a�����a���5FI�5�Y
���h�F�b�����Xh��E�D`F���PQ���0��5/��Ӿm��Z���ǯx�׵��y���Y8#J�Op�}]�s�?w�f��|e[.�Ԏ��O��U��x���Aj1E�>�wY�e+�B��iO �r����k
�@������'fT�Ÿ+WkUC���0d^�e	��K�mx����p*��DJ�S�I��f��  �"Qͱ0�l��
0����������N���/x�Uo���x��Hc�/aΕ}]�c�?uw��e^�l��u��~p?�^W��
x���K
�0�}O��P�m& �`7��$�	LR����	*hd�J��)�m�%FphU(�L4�nX�F�E.�tHVz��S@� CL4yel�����x�*n��;�]��3/5}hl�'���WZ��r�^��L����$��z�ǚ�2BQ�x���K
�0�}O��P3�d@D�n
n0�QIK�/�'p��m)���c��yrRE�@�	��6��˖���T�p�k@���`��ڳS�YHYF�V��ݦe�2q#�}Ou����s_�Y(�8H%e�R^���v�\#�$�v�?N:E��x���K
�0�}N��P�&)�(�M���f�	ZHZ�x<�˷xmc�L2a�ɫ���FR�F���Yk���Ċ�&�R��:�ƱJAG#:��Ge���s��<��	�s��q��<��>I
�A?8yPZ)�R^��[<ք��}�\ocW�I�G�x���K
�0�}O��P&6�� "���P���ɄZ�6�_O��-^ZT
b�*�U�%IK	���Bٲc�l�E�d
�m���E�R���%K;�"Xq��d�Jݴ����h�<�����_���A�~��f �i�)�;k�I�~�թ���%��H��x���A
�0@�}O��P�IB��vQA��dJ-$�4�_O��-��������(��Nk���E�(��I0���&e����c@: q'�BVڈ�C��:��
댙
����������6с	�yjg�f;.8ošңV��n�BX�u��v�O�[?�����Ht�x���Kj�0D�>E�f1�H�_��d����ne��&�	�)j�xU��a	I���N�<#"ʼn�:瘪-Ã�n�$���9��E�3T��K0M����m,6�*�&f�T�p%��8QMa�g��
>�~��ZNr��o}^ˢ���1yB�p5g�i_׹w��|x��Po�.M�C_��G�����|Y���oG\���Ox��´�i��������e��a�aZ����YZ���Q���Aj��I���AZ�������$fs���l@�dFFUF.yU��x���Kn�0D�:�ES�,(��!=�>��2��c��ۼ�����l��v(5�F�0�Z)#���)Xۛ[\yQ@L�<zr6p��b�:�]�Ę
9�z�����EZ����K�uji����a�,�G�c��6��ws�%6��6G���o>�^em��o���	 nY�x���A
�0@�}N�� ��$S��H&��д�=��#������&0��g	���.���"e�Jn�w^D�3D�w�:�:[�X��ڒ�k0���q�S�Ë~�559�]��f>/,7m�Ap�dZ��Z'�sW�-GaMc\��A}�H��x���KN�0�>E��_&m	!�0��w L����3B,KުT����D���N%7��~�yu�	]�Թ)��"r(�yG)�dctޮ�%O��P����w}�����,5_̀��-�t�y��.FD�|�pc�3�Ժ��?��̍*C�CƦ�?A�D�N*���_|�H�3P+p�r����$�w�b��x���J1��{�b�B�d��)�X�"�b���l2��n"�i��w�����D�SB�gg	-�D����p�!w��Y�Db��IQȒWbd\ip���)9�lD�>1��Wm�r��:��,��N�x�M}��
�`�L��<��?w�R[���H��"p8�.�����?�A�eQ.j~k�O��x���Mj�0�N1���dY�z��@�8�!Os��=B��o�1��H�R�.�PR�Y�R��-%g�(f/�W��RҀ,ѥ!K����!E9O#"�SM�����K��+ܷ��r����O}.u�ne���B���Þ1�-�S��97�X��e�xަ�v���x�r�yC`P%�&x��Qˊ�0��+.t1�6A�e;S:Ca�M�P���$_���a$ř�}��2tW���=�{T"�7jy߶zTj8��x۵��+u�A(#4g�L
�a�� >���F��TܨF���zlG��<�9&8\1����d��������>`y�F���Ǿ��a:zoK���������,1��w���2|����Ê)��ȗ��m��a��!�KBc_��ٖ��;гLRS�=�1���`���SW��Nn�"�d����2��b�t��J�@�`,���d�	�ߌ�bk[�={~�U�#c�
��:$�C����S
��l�:W#-[$Ef?o�ېq�?R�~]���%gy�≲�u�����l�U���֎�N!�őx���[J�0E�;�~�!JҼZq���o�6)��5{�Cp�
�t��9sp*;�⺆�礢7�*�Y��Uhe8�j�X�%k`F����X7��mS��K��*�D����aNz<�ij�=]�P!O��]�s�z�Sc�}/"�g>u��l4��ۥ�/����8��J%�{�Xo[�`!iԱ7����EZ��~�-Z›x���Kj1�:EC�&A��!�
�	��Vf`>AӶ�o�#䭊��i�*�8�lɟm�!0��b�s�C�Gg~�ɦ�J��Ѻ����S�X���(XαX���]�����C6��W����O\u^y��M�.��`1������*��Mx�;ܖe���:�¡���N�<Q��o���Qv�x����n� �{�b���`��twJʴ�,�>#a��{�XQ�T�j���F��i4N�UQv�X��sڹA���Zo�@(��Qacߓ�q08H땚��6X�GC3LΑGx�6�dڨ�G]�AV8�?���3��(c��S��$f��]4��)x����}�����]�!�F�k��>�FmM����z�X��+F���)�ca�q�_S���}Ak��x���Kj1D�:E���F���1>Cٷ�<#M'������Z=xŝ�6�l�JbrQYC!��5��T���x�(ة2XwR.8�	�ju��(è�&�I:�o���L?Tᣭq�
��?��ƅ���ʘiLy`/GDj�:3�{��/]t��>)8���<!�ߺ4̔��G\�
�f��:�\�o��bow���VXL�x����J1�/.�t��<�eozT��L��$�e�W�|G?�:���`tq�w�5��i�>����ق5�=颮i�E��:LD���K�1��K���,g��J7��>��x�����l���m������&
4����rom��je�3V�#��k�;�)s=��V��^�s��?@�}���RŐx���QJ�0E�����#yyi�� �Aqi斩4MI��-.��w\8�����F��0[����C�f#q6{�ؔ�(��q�fg	Hi@H^'�8[1���{���F�N�9�z��7]��e��{?�D+BO�ĔV뢊���~�
���gt֥m�Ա���.�����g��:V���S��x���KJ1�9E�ˇC��D���	��`df"�v��Z�Lf�
}�֊�!���>6�)"FN��B�+M�����`)5:6�*qjֻ�s�����cLx>y������|����-���,/`��&��n�B��m]������`��Gx�?p�<��a���gZ�]c�clk��Eg��~�6S2��_x�����4!nb�!��������& ZA���BRKR�=��]}��u�Js�R��3��J��L��>n�x���Mj�0@�N1�BП娔�dӜ`f4"Ƒ�i{��!o���!�:�B��0	���l]�3b�T�OS
�'�!��)K����#�,i�3s���������߽�!;|�O�ҥ�]N��'�����o��pomQ�ws�U`_T޵����
}������?%N��x���A��0E�>���!��4�Rz���#�B[ӹ~3s�y�7����3�a@B�I�`B���~AMA)Sd���^�t7����<�8�)�B���L|�&>G��񷭵���;�k��t��?q�g�M�v�+��~7�i8p���4���rm?���U;�V7�m�����UR`�x���AN� @�=���7(M��+�	�ښ�4�o<��#�}/o�ze��1��^�Y!�@w4c�W���0O'U.<j��!krn82ơ[5*����'z�M*|v�����0H������υ�+�1V;��O
�����̧����pm�:�MG�ci�.pJ�+��"���E_��^�n�/�WY�x���Mj1F�s
�(ɒB��iO`��f 3��)��>����T!W�*z�l�Mg��O�KN�BTf�8�sӽ��VKT��("..���(����d�oS�̤d6{l$]��.Q�Kh�L8�g�
>�~��Vy����������߀�-I�$�8-Ƕ���?���K���/W8myH����C����uZƕx���A
�0F�}N1�R�IM�D<��2�_ڦ���[<���� �.�>��x$A϶�"h���D)� 3����`�(�"�p�kl�MbY��ęMz�.tU|0ѥ���_�p��(��D�9g]|�-[f��8>U�'7h�p����i�c�w��UL!�x���MJ1��9Evo!j:�4�x7z��t��7�#��/�࣪���Yr
�JAցhi�5DWW
�Z[�-nSVu��>������!��������t2@*S ��;�
�\|�l�J�Ϲ�!�'q�o�H����/s?ҕ�g	��hDy�@)��q�s�?����4b˛�l}��Q+w��o���E�D�[��x���MJ1���ٽ���'�""�;�������g�D��/ઠ��k�D|��ـZ.|sDqF��(c8�*}�#�@	��c��Fe	-C����F����ii��g;^,F{�A�KX��]?�Z~��I�����}�5��]��B��K��h!���B0_s�z���:ވ��_�i�=n_��f��ZƎv�[镇AKug쩖�6���j���k�	{��M#k5�М�����V�o�ug?�v_��Nx�[���4�T���RҒS͒L��,��R��
�-�,S�M
R-���&��2L<lga��m`h`��U���ld`����\��X��P���P�ZT�����W���Z�P��`�g�g��� ?�x���]J�0��b�˃��I��[�L:S,����wou	^}�ǫC�T��LS�K��R��)Q�]�8�O�\�1Ŋ�)���/�Ո�T/>'C_����ܥ�[��)<��^7yj�7p��0ڀp��Z3�}_U�w3���^��.��c�o���um�Ҷ�o�����nTA�x���M
�0@�}N1�;Q�3ʹ ���	2өL*m�����
>Q�A��d $8&g����R�(��f-��9�ѵ��C�����%XJ1!w�,��w}L3ܪ~��uʼ����:f~�h=�CD��쬳�Ȕ�X����Ya�m�=\�e����tGƖx���MJ1E�yV��OD܁���$uCW�I��+�wo��~p���h-e�e-6&�t1q�>���\J�F\ӎ�RY\P��A;���Y�RP�X�T�"|;}1~��s�|�I���yk���~#e�U�y��Q*)E�m�g.vЃ����{����o/e�9.������g��ߗi�Q	�4�/��V��x���K
�@��"�R��Ig: ���	�b���F�Gp��٢
�{e�
if�„�$�!�����x�H�N�s�
�3���k���B�11uJ.=�6/p5}��y�_Y��dØﺟԎ@"B,^�H����8���-
�=��<�a�m(�>a�GQ�x���Mj1@�B�e�=����M/ {4�ilYI��z�n?x�T���62�XL3EZ2&f�0�ɣ���p�!��s "C��i��8�m���3�m�~Y&:��/���t���޵�t���������L��ZT���$�x�ϣ�_`��J�a\면oP�/V(ZW��mOPZ��paI}�N7w�[k�x���Mj�0нN1�eiџ-B���ȟ����<
�
=B�����^����p-�f�kN%���iBF���$!��u͜$Y�i�����:�e�Aj���A��:�&O9�r��U�&_x��r1��M�ѫu֚������Ћ�3��
�H��}�8����c~�)P��x���KN�0�9EK,G�%�f�	�N܆@�9=|nO4G`[z���N:[�򔣉��|t>�qY�e��Y�Z�pM���l�%�4%�t�mt9G�`���&���U��p����~Y���H�@c4F�<��VjX��U�������3<34�7�d�N������M�jjk�]�t�p���Ǐ����\�x���[JC1��b�Oi�;܁]Ajn$u����Ë�7�Q�F��V�1�[�U�:94�ϴ�`��e�!Z��*U��ʙ��\L+>J��H_|�.L�t���.���p����3(k��%£TR�2�����.���N�(1_	ns�$�}Q�:m�
F߻��bgQ��x���Mj�0��:�@��adK3��m��	�3nL,)�JKo�#d���}��6���zD����@)�`Ӕ�$�8vLE�&�s�9�y"1b�39xoÀ�L��H�-'��Z7�4��_5�Nv8��-9�r,�>@c��U�9/�ɋu�	�
H���GhW�[����^K����ץ��Z�����z�W�x���M
�0@�}N1�R���
�x=A2�`Ѥ�F��[=���k��LNP�rg���DC���=39o�z�Yj��#Ō�� )��^�[�u0�9�����:�pi�
穤U8,?8����쫴#���ɻ`a�Qk�S)ck�g�f�
i;8K�^˻��z��8�A}`�L��x���;N1D�9��
�߱-� �t�˻#�=�k8?�§���2�q�y-Ʀ�ee.v�W�)�+�M��]>h�O�O%�l� ��ESu�(s�5�ՑH���*�H�(N4��1ӑTs�HR���B���>�������̭�
O�Yޅ���z){kۜ��|yŸ@�^��t9~�7Pm���qZ�˰^��x���]
!�wO1�A�;�=u�:��#-���w��#�'��u.ɥ���9���GK1�C�6"%�iP�ع	b�^{��2�PFÎh�dgS�fT�.��I��
�s��,�]~���ҕ׍e�����Z���I����0���~���n_�_�Ju�x����J�0@�}����_�dq�.
��jg+7�--N�����W�
�~��;P�T@�����](K-�Vn��uN�4j�ըL�Em��HJ��+�^�I)[�QX_���+�'E���$�]��^V��H|�i�0���BcZׅ���C&h�v�n�%���|<
�{߼m�<’#H���힎'��i'��!E��(CL+~d���ow�b�x���Kj�0@ѹW�y�Ȯ�gA)t�
��I �C�<��YB��C��<E�ւ�����\��6�"��T�JnO�v�ņ2�Wb.3M��	��@Ȣ���K���/ӻv�[��^�?x�e˫>w�7�D�XB�ѕ�m���3w�0�N�v�+��R��'�a�0뺃��N�
�dQe�x���K
�0@�9���iӤ�n��L�`Ғ�=��#�}���1C��M�Y?����l��(�~t]tQ-�q���1����.w�ڜb�h�N;R�-���.�q��\�NV8�?p�g	/>V�3�֤
j$8 !�8���?su-K�7�Wn^8�į�[_Ӫ>�MӜx���MJ1��}��f!J�^����	^��L�$=d��7^�Z~��耒�g�e%#L��lS�Rf��0b,w�hCi︔`W�-p�X3��(�7Wҟ?���e
�瀓��0�@�7��i��q=���FSG��<����^�
/
�U�
��'m�^�Q�>�_��/P�KKWu��_�
R*�.�UfG?���C��v;���Dc��x����j�0D�����dɒ%$��
���%�r������]w33sj� ��V
:��*j�CD/{�&��F���M�f�p"蕓\Fmd�B�`��C�Bõ����j��p�	���-Y�i�����8!�@(%:������PKID�O��x����.�eΎ��[8b�+nv���7	�Vܪ/��s���3��r-��;����늭����0�/�/��nk��x���An!C����#E|`HQ������i&Di�_�P/,�I�=:@�%�b`�,��k[�L��K4Z���9	.�h�I��-�FY.)���J)U�{<Z�O��r�~�g�����;�*���sl�j�褧Ԥ�:��W���l[�m?�}-�:�Cr�q�����P��x���MN�0@�}O��,F*N�X��8��8�H���󃐸�O�n��B�H(�兊JU�^4�!dЪ�wۆ�f�DF��(_7�`\4�_�j
�4����bh$>k����
*����۰/���ʏ�r��u�Wyؼ�xv�{
��;��t_���}z��nN:ozs�n�Þ��3��o[$Yy�x����J�0���)���8�_�f7��	r��i�IJ�}{�����9�ﴂH}ފ
�y	=(c�z��4�iOV[05�PB80J3c��Nh,J݋лM2��_��Qi��2 L�`��^8��`�sr��^ڔ=5��D_s�m���m���>a{�\)�G���qƈ�1έ�?u���Mn��h7��h�<�����s\l�y�ݵ߹�j^��cNa�]�rS����+�e�6���a�sN�����}�N+�o��x����N�0��~���;�*!T	.��6����ؑ�x{Z��ێ>��N-D`��8t�j�����Z��V����z+،�Re<玤"��/{��У?J-������:�/KA��'L� <l�T�4D�'�� ���1��7�3��)�J�s�ׯ)�t�5|�hL|��Z���PG

�N���Hp���#Ĝ/�ۄ�Μ�6��L�Q��7������M^����"��
7z�?�}'4~H�x���MN� �ᱬ����@�)��3'��so

��1qN��FC�(eA�R	bZ����-������%v��ep��	�EIH+����y��J
J�� I�%88�_b�V� Q;�{#@��E�ƭ6�9���;�����ǶCƩ�x�Rk)����B
�b�m�睽c�"�J��KÌ��,'=�c��P���쮷8�պ�0j�}>�^3�/�q�0�Z��v�;�m��x���[
�0F�b�ɵ� �0�����Ў���|:�� A�!A��BK���
��%q	Nb�<���WLJ�������}Bo;H�%'���o��j���y��⃉n�Xw����X_8N��������Ykd�A��� ^�� ��<���|�7M�x���I
�@@�}����tUzH���Y�Q<@U0I�
���e!ҥ ��B�Η�m����������ԜE��:Ɗ��花�:���2���ث���ЇF}���ɪ�N��E���Z�И��cT����?w��kҷ�|�v�n�F��x���Ij�0�~E��0�t����\���V��e�5yL ȵ���T�N�&'�U�S,���4�)��(�ᑚn$T���*��q�p�N���Re��fJ��۬�kv�Lv��Q�g�I�>�R0ː���7��|쫜�����ʢ������H�C��u�]���ھ��-���t�t��f��[ߡ��e?�h^&�x����J1F��s����6?P�"R/DA��̈́.4ٲ;��]}��ǧ��m����%{'X�����š�E��kZ�+��|�!3Sp8�8ٳ��'��TkM���ʏt��[��
��O<���Ev]�4Dcp��hƹ�IU����kI*�^�Nϯ�{h�i��;�zYac=\����~QĞx����J1��+��t
"."�A?��tp`�YfZ���O�ZPE�&Er+C�K��h�SKC��|@���C4g�d(Pc�&�9��<ͥ`@�N0�D�ft)�_��n��-�֞/d������In��8D��F�pe�����/��O�|�+�Txx:��_���/��:�7ͣ��R'N�x���;n�0@w��[�.)Q�E/Х=�(Q�Y�kt��>��zSB��K,�^�#,T�x2d%k=���t��b6!�B�S�|�L�b+W���ǚ��h�$��hsf�.�����P�”����g�o��c_�$܎_���U7�@�DgO�H�C��u�]���ھ��-���t�t��<���P�˲?��]Лx���K
�@E�y���T�?I@Dс((. �~b�|HJ�op	N���X&�G����S�RIdጝ��s�3T#:���\q�rx)E
5(���s|L�z��M�Ag�}+�Lv5�`�M+/,;�ڲ��>���1����mT��n�C�vwܞ���`�p�F|�x���J�0��{�b�B�I&IwQ���]�>I�X�4�;���~>�mW��a��$
�)�H�C&
ġ��i�n�]W��WSHu<�>)��1�U'D���f�}��鏮p���
��?x������3GdH����3���^om��m�,Ul���v:�~�u��t���K��x���Kj1D�:E�
����&r���<K�v��E-�EQ<� Ơ�A���H&-���YZZM����ʉ�j���Z�d�IeB�k�(g��&�k0K@4	���e���^�A&\�|s��A�F��y�*�JD{���>���ͷ��\����v޷v��y�	>��A�X�ݼV�x���Qj�0��B���b)vA�ޠ=�$ˬ�$%qz����^[���������}q#��p�
��Vs�����܀k��:��i-bu,Q�:*L��kt3
���e�[��p]&��
��?����?�޾SB$�a�C��-�to�?�au�b�#\.�q�7�]Hd�x���AN!D�r
v�0NM��qg�FO��鄆�1_b�L�^բ�!�DT�+0RD9�H�YiLZ��(�`a�oX�ˑ�ZIk�< z�Vk,��$��������[�0I=K�4� ��Ӛ0.Ī�a�J����^�0�����D�2��#�ZK��*�o��ź����ް}�+�/��O	=]Nw�MX�Vˉo�*_�X�c/���E�즷8�ֺgO��>��׌��q�Ө���~�r��x���Q�!D�=E�~&�u��,{���%���In�	{���ū]5�ѻ,q���s�MFD�d�3�H�ԥ��M�=2y�M��I0���%
a��&Ί�qiVڮ�"u��7~�������/0��g?8h���,e�����G��ei�s���z����*}<���;�
�m�)��<��[iU�VD�x���[
�0���~�r�jn@ĭ$��"����.���i��%k���v&1#B�q��U[�X�>p���m����6�/�OYw6:���Z+mi�>#��n>�8�	��N�Y�6p��̚Y��<����MU�)F�Pż�A�T_'�Bm�x���[�!E�]EA>�_���5LVPjIZ
����%��{�^b��[Yb	���K
>ۢ�5:J�x��6�|�EE�t�28�fq�x�F��K��I�k����77��5��	���εƍO������!�Q*)E굮s�?�b0�nL#�!~�7����o��`m��2��*�RQ�x���]J�0E߻�� J��_AŭL��
�i��!ݽ�;���=�r�3C2X�bp%�Pǒ��6�\��U���M`�)ie=��.�g�'��uT���x��,{���Y�ex���-���X>@��ym<+�Ԑ�m�"�Om�O�/P�0\Oa��Rm_ C������F�;��]���{s���<x��IV��x���An� D���K]V�)�z��[$[�T��K� ���{3��ċ�&�lf���I;?��ٻQ]t&�$n���䐳O���g��EK0�`��.!���������f��Ǐ^��⭢��2�	~���W��i߶�;�‚VL4Ћ҆.�������OG=�^�h�w����q@k�݆��O��֧T�x���AN!E�}
v�0juQP�L���4=a�Do�q����?���Y��C)1ڨN(�ja�R%.7ڧqT�2*�V¤�чB�����ŧ��2{��	�A�`��R�u�c^�anr\���bο�}�-]���|3+Y���G�+���mks�?��Cǧ�4��9mr\�L�s7UeC_c|֯������Z��x���Kj1�:EC�!���L�U4�'"��r��;>BVU�*�e�4�I2;/M�U�"*g�lSp)�Ŝeb(�!D��K5�/%H��WSA󵉬kS�sL:�}{t��K������"�磷v�w�̦��U���L�[��A�ϛR�[�狄_Ÿ�c�`��<�L�x���KN1@�s
�@@�$��8���t�N�JS����}z��!6k�b1I�[��唑�Z$	�Ű\iH��T�����R)��)���+g����??k��Z�5�3j����^mNFB+�b���y�9�[:|��/�_�6׍/��e�z�h����}��9��.�K��z��
��g��Q:�	�>wh��_�_�`�x���KN�0E�yVQC�O;B�F���]&�Dq������7x��r��YIK�gk�&��ur!�$��q2Æ;U��O�)b �ѓC�NZ?�����m��Uxoe9��K��+��dz�į �QJ5�Q���B������a'x�N����ul@w��S����'�J@���%��Q�b�Æ��l9��������?��b;�x���AJ1��}Op)j���4 ���$�f�0�JEo��\}������,�(H�s��c�eL��mK�(e��C��[�
[���V���1�ED�}�����/*����,��_x�z�]n����Ä��u֚�GU����r��
<uh]a�
��	��6���ĵ�4>��R��|��Y{��x�Yp�x���A
�0�9Ň.�%_b�z��1yRA�h�+=B��SV����&
i#:�fX��z�uBr^�1��V�B1����8���pc��JrH�D4�E
�
{y�+�
>��� ]���a�F\2ʍX�����f�U��i(�j��i��1"�j_(�	�~KH��x����N�0E��+����!Pa�Ħ|�؞��;����ǪĒMW#�{��RAdh�1�E��J�2Z�Z�Qck`�A�Dq0^JCD�;���dѮ��
��{A
bR�Hk�S^x��*ԓ��è�.t΅}~cbǼ��T�T��ͫ_p�����Z��5�λ��u&����	�/�™�b3���؜(�	�.{1�Lоt�!�i�����.@9/�o]������9��v�m<�ؿ������.�zo8�e�z�F��n�x���MN!�����FtuC'Ƹ�����������1������3�KC�1��1x�9`�-�h��8[,�Y��:W��4��^������@:�zrNk�'^����:|	߹�g+�$��/��\�ί���1�N�ó6Z��J�"�Ϻ�O����,@�hp;�FۀS�1!08���9@�_9�tz�泘i�#�o�+C磩��a�x���AN�0E�9�w] ��[�`'���HMR�n�O���>��xm�R2���S
%&�C��%x֌��T
ݵ�X��(�*DXCN"�l9sO���r���-��
#��ғ�<���%�1e땬XW�m�v����>�Ers��/xo�"��ho����%�'O�w�-����wؿ�d��N�4����W�Y�N8�ym۱�e�v?��`Z��Px���q���q��ib��e�������aj��Ej��Y��Ejb���������a��^cfCs㉇m䀔�����WQ���������sNjb�niJ���x����N�0k��@\��:�B�tH4�k{s��Ė���c����b��f�I��F}ߏ�5���R�Y=؏h����,�����`?Am��U�(��5V�__�$�!��l�N�(0����F��T�'���#m��*�<��;��Z�cA�*��i�f�g.ީ��+
�a��؊5�\vNr"�K�N�p0�$�kڧu	\��M-�{Ki[�SZk׶�V�sn
�c�����^R��s�r
�#����x���[j�@E�g�~��Ҽ��f�
fl��x<�V���,�?��6U F���IB�aJ�>
4����ѭe�� ���H�(pR�\EeȌ����J��	]yحo�c��\{����s�o��:�yQ�!��;�zkw3��ݽQ�p��8�X׾LG�o�m.�u.v��}�M�x����J1��}��ˢ$�9�@��\��r�2ɐ���o��~��σ���`QM��K8��4Z���+�������dt1&���RDOh�X���)*�7��_L���/�!78���*�4�WP��;�a'��"�e)���\�'e��Xk�C��|��X�ۀ��3�u�%z.�w��\.۠$~L8XS�x���Mj�0@�N1�eh���?(%gpN0�f�!����	�'��o"Pm��"U�_B.GQ��g%i��͍�,�sD��j	���v�T5����+f��p�
�-/����<ֶ\�k��4M�>�dᄄh���:����C��O�e�&�?_�ܻt���L$�x���KN�0���1��v��Cb'�=)�#������zUz�1K��:�A�qC���({o��l�J9P�o\�̖�IFM�s�*Y�ȠaҘ�M��L���8M)L
}=+�!��H�uz�΁�~�M~u��"?��˧���y
��g�� �H��= ��u]������va�/�*O�(����\z��}�5��C�K�&�[-y�c������^�^�Ƕׅ��m;��Z��u?��r'�x���]j�0E�w�b ��A#����f�zE��I����
�p>�9 �d|1(�z��y��Ur@4H!��ܱ	U�,�31Y븘l]����lk��:���r�;]/l�<ʃN�w�����9;�z��G�Ь�*{k�����Wt���s������Y�F�C��]�(^M֟x����N� D�����
�[�1F��č~\.����E~�ۙ9�̴JĽ���q�� ��G�@,z
�2�`���Ah��5N	�&孀q��	m�2�Hd�����&�4�)B�F�;ig�m)�4������r��Wxji�+�3�G.���Җ�
)òm�5�'�ި^��e\�)tb-����J�ڵ� �t��gʌ��ׄ�g7G�ᵔmu����w����}��R��}��74sқx���KN�0D�9�w�@��%��8A��f"%q���D,8ۧ�WR�1Ub�17��gN�	�5h�R%�%R��!�hss���$�1�6%,I���A��1���折�9�
[������'����-���[=�ͼ�~��.[]�i}5.gcL֚묝�oۢ*��O�2��+�|5�&��!��㱒�>��Yv�f>ek?��4a��x���Kj!�}�� ːPڭ�0�\ ��@�2#h�h͜?�#d���`��|�:EkQ�9�	I����[����L&D�n�F�:ٝb�3����k�9�"���\���;��[��	���RZ��|����6�F+t�
qI��"���`xP���;C�_%�t��R	�$���r���)�B�a���jV�x���KJ1��}������J:݁Af���G�iȣI׈���#���e0��h9p�iu�8+Z�QDƤ�ʣ�9E���nY3r�C4�V㜭6g�Hxb��]������|q��^�)\�?��VC����
�tƮ��
q���M���O��A���m����
��y���!������68J?���K�N�%XE�x���]j�0E�w�b���Ec˖�t
�
�s�ZV��	�}M�
�w��u�9맠9���zjc�A\ss��8�h�ֱc��ַf��cg���d���e.�>w�t)�e��>$e��m���qS��WtR�TJ�I���xSA/<z�r��j)B7'3����ʲ��1��%��J�w^�E��O�5?K�^d�x���KJ1�}NQ�R�J%����	򩌁N�I�����>x���$M|aǑKMhY_�sS֗PtMFi�.`���M�U�&��s%r��v![��ܬJ�>�	��s�9�z�³�7~�Y�@[��Y
��U�ct�G��u��t��/��-I�k@�SNY�8�~�m�zQߺ�Q�x���MJ1��}NQ�rP���T��x=Aҩh3��I���Fp��[<��'�����99
��`��
[©�j���-޺%�¨���Cȉ�5v�uL�����]>��w�/n��k:�����ִ�Scy3MѠ�p�Fk��ZW�N���_�Ã���3�}�C��w�ﺭ�X�tط(�W���S*�x���Aj�0нO1�eq�F�%A)9Cz���],+ؓ��
=B��qd�%E���q4�!V���j�b����.v�T<�Ro7D�MM>���g��l$'�"���A��>����[~�I��\tmy��� ;M�x�D��3��ڪ����H#]�K�ǯ��&t��Z�����Qj�x���AN!�=����P4�Cb����'��:P��x�/y:����ŧ���b�44��j��Ts恮�B(�f_[K�s�X��K���!��)qv0�G�dЇ�N�r\�2�y���n�u�S���%�%������ql��g7�Td�o�cϏE��tØ�t�:���ԑ��iUl�x���Kj1D�:EC�Ɖ$�@Y��	Z�<f42�v��#lr����+J6f��l�1�1:��H>Y"3�87�RQW�xt�Z]f$C�7�L!y�Lل��&������j��{�O�k^�ue��)��v�h���:��?���Z]PZ[�ۓ��ѧ���`��gA"����Y�x�X&�x���MJ1F�}��f!j%��jq�N�I�2�0�25��F�n�}�O��)�qc��%Q���T��R#r$��K����8���9���6O����)���=Ā�ئj����bNd}��S����-���k���<]��.k9��&�l�G��@�n�a⾮���3��d�+F�dM�ކ<������,�vS��s�L?��^��x���[j�0E����~�����H�Q�b�FS��:�.��s��N),�Y`r~
JJ�����l���+O8i�ة1h�rV��bm�E����CШ�~��x̯J-��w�K��ڈ?A�B�)Ā�Tf��m����u�{�G������h�};�Ɲ����3�a���`�L�k'䵿�U�]�x���Mj1@�O!�2$h<�lC)�ޠ9�,ˍ����o����=�T�E��zd�����H�K�Z�q�L�.���,��3�B.$-Q�VI��sWE�w�c�u���.���);��p�>�IO��aL�r�8 :Y繛鋹��r�#|�T��|w;6{@ߡ/��4iu�FOm�x���Mj�0@�N1�eh�X��$WhN Y#j�,#O��'��~�f��8y�LXl�&T�.E.4�/�R��N��=
�tMٰ�L&\�)����xts���&T���>�&|�
~z�/9�|��E��W��X���>Fc
�4j����"�o�j0|P�O��k���Vi��ΰ��x�Q`��f�P֐x���]N� F�Y�$>��R(�1>�]��{���ԟ�K\����w�4f`Mn�l���!nI;����8ֆ�Lq�n���E�`�ls�i
~��c�!x8��{…�r�
ޅ?��[�� ��x���?�g�f^혛�5��u߳�3W���;x��
_�}�r��G���$8;�A�˵� ��sd7�T�q?��ƕ2�ꥫ_�;a#�x���AJ1�}NQ�R���sz�J�6L�.�����;@R��\$��`��,�j�ˬe5��;��h5ɩ謺N���6բ¦s�r�/�;�9���u�r����?8����~�).�JZS�{��C�m�g;�.?������S�}���O$�x����J�0F��)���8M��"��BD}���f��&!���[_��΁�"O6��P�L��`fP�9�S@��MǨGV�a&>*%pLƧ09+���y�

"��CHF���(a�
VX1��N	e�^+��!:5�+]J㟄ߘ�G��N:���-�x�H\j���z~+�,�m[��9{�vF�x�y/�R|�TxB�k�arw�^��{.9�K�~b7��ᵔm*e�þ����T�-%륲��s��x���KN�0�9E�f�wl�m	!.�N��3�8#���!q���F��ъE�0g��s��H��bR%:��;� �*�v��QI'.�dSr]��
g������>���;��ok��r�8�E�S�����}���-�JO�_�2�-�xh��F{9R�Нb���o�2��O����c�g:U�q�xd/���m]�'���6v*Gm�/�PVa��x����j�0��A�Z�RB.=�|�JZ�X	��~}�_�qfda��lL�h�K��!��dC�ZF�%�z��]��Z8�͡%�,�n9�zFS���XߊU�#��_K�׿�6�O~�E�9��Y�`�7�u5j��c�G~#U«��D��41��|����W��qo�?�KJ�x���;n� ОS��"�n">)�r�1kK6��P�!�k�\̐�2e�b��&U����C*5��:g����@Ĵ��!�l�X)�jc�%-ա���l��'��w�V��?��������[��M�U�繋�?����p�M�u��a̜y�:�;�c��(�]`V/��L�x���1�0@�=��Ĉ@I�&��W��VjӪ�������ۮ
D�/lK'�����]�.*	"�"Ⲙ�w�
�$B1���'�|���{	��h����u����=i�p��M��z����F�������L�韛�N_]�L�gF�O}�v=Bڑx���Kj�0D�>EC�!A��a���j�&�e4�o����W��@-���j&&̌g��f�Ы�h�3u>9�ū�L��f"
fO���Q)Q�)]��g��{�#��%�e�����h��Ac��P�ii�n"������ �ގ�5�2�ʰ��P�@:��F�
��ŭ��c�򸚟�¶T~�x����ND!F{��n�0�l�����/�ϰK���An�ۋ���W�s��,U �2�h��ڸ�ٚLdC�� z�8�OIő��=e]M
.��KA��x�Z*(t��ť42��*�q�Lt�M�*�1����xܾ�"Ͽ�u�-���|�ʠqh�e�
@�}�ڜ�OM��L#�|��-~��I�>wY9�c�s��K�o���W��x���K� ���%.��ߣ%1ƫPx�DK	�.����f63܉@��<و=�i��'��F4�
Ғ՘�H�B��0g=I?�#�
�`cTit&k���
y�Z���uha}
��C\��E�J|e�VF��,��"n�Z���Lt�� ��f���²m�Rg�̅/����nJP�x����j�0@�
���b�n��2��i��[IL�$
e��)k�`G�{OH<��:"O��XwԦ�����٦��qƹ�`��3#�wq�<Yw0����L�����c�•�:�e^.�?��g���9M]�]!~��X���U�Ӕ����	^���)���<����g�0�ĩ�F
WLea5�S���u��@̩����(����|ISc^*�z��9o��m�S��O�*H/_Y�I	�ě;��/�8�J�x���;
1�>��d�L6; �X{�I2�����m<��,_�ZU���P\g)�K�9�\a��J*�yh�Rui�SN.3q�hQ0d*��^eʥ1���Z�R�E^p������|n�&=,�N`�E������<����T���\ע�'�e{��G�x���KjC1�>���B�?O�!��9�,�G���:���M���,f�9�@$�������b	�6���*X�/KX�7�QN5�"�00)�W�E��u�U������rp��?p�_ۮG~����e�n�|�)eĊ���m߷9�5�
�7�	N�?r1�nQ�zpI�KU�x���Ij1@ѽNQ�eH(Ukj0&W�P"Kj�jCn;7�����b�
b�K��b��mFC��D�BAo	����x41Y�yK�%M>֐L0����ϞT<�{.8�y�i<
\^�%���+h�yk���Q#�<{o"��M-�7�-|�����0+��Q�*��m�(z�q��aEO%�x���MJ1��}NQ�R��t~: �U*���`w2�jeno�ݻyxuđ�M�Pd����a'��EB� \��/��M�_�_V/�E,Ѧb@Қ�=��
z�n|l��&��oZ���A_irs�>�a���iM�^U�?��?f�a���h���7������w�+�t�CI;ɸ��SP�x���Aj�0�z�B���kIV����j�
�d�5I��	��af����C3�'t-1��9�aȒ�#'4{�Rr	l�82{)/9O1(LTJ�ת$kҡs밧c�[�f����6�r���@�」|!!n۶�ʇ��'
t��?G}�r�캴
�{��T�Jl�x����J�0E�N������\.�8�/��DMR�S���ȱ��^�ŝ���9��F?٘��F�Υ�)+�6��8��Se���	��m�N��\D�J	�.*������w�j>����{+� \�_��s	�+�H��Q���b���������FN#��[�/O������s�.�O�W���
�	�A�;��A\��
?
�Z��x���Kj!н�(�吡�+����Z�?bW/r��#��m�,f(�#��Mo:X׺�gO�s�%��8�I��l�)�%g��[{FW1�d��jR�A��薟s��{�|4��緌�l�:X�@;mv! <Q#�z��7�Z=|�6d�mP7�.�뜼d�P�Hz�x���K
1E�yVQ�P���+Aĭ$�W��?bq�"��ٝ��*@�:8�R|�%�4���G�E�mPk��9xFg�J��|2VPt@/��7>I�$v1����RiM�0:�چ)�8�h2Ά����^�U�L���d��v&z:�k�fZ�r�x>�Tt�H|�x���[j�0�u��~�����GY�W��-Y�u�п�]�h�!ĻLN�<cL)FČ�x�lfu�.u�$9��If�}$d���ze��2f���c,�Ý��Y��p{��([Z��t6N�Y��Qk�m����Mu�7�!	�ǩ�A��	��w�G'����У�V:�e`����[����VC�x���[J1�s�?E�k�4��vO�G��$K�]�;�����')W���qEV�T�b��R��H[문�I��Ƽ���a�&�sn�FE�q)Q��Ƅ3Ӎ:�FK���m�\[��k'~eMp�Y��,��"��*3�s��Iy/�Y
D����`�Y����<��7��p��Z*��;!jVI�x���Aj�0@ѽO!貴ȱDza(]��	$E��x�hz�=B7��a9NfjDQ��z�^d���JNܳ�i�Õ��N�OTk'�Z�IE����2�����~|����c����|��w_6Y�u7��S-),�1�ض������)R��0��j�e}tߋ�_�N~�x���Aj�0нN1�e�0��!d�m{����2�8�O��}�/Cra./���q���	YgG�M���,1¦1	��eDa�E
���o�]Z�o�+}���I����^��z%�(΅��Ȗ�ֻ̭*��Ml�t�Ϻ���]�]?h~`ZO�f��LU�x���MK1��<XK�;"J=(x(Z�y�����dI�-�{�����üϼ���¡��ժЭ�M�p�eS;��6���Sb�H��썑V�VI��5��
V�i54��]��mg~�"|2���#�:�����z��'~���T[����NR
��1�?�"���p/����߁A3R�8f���1��
8�M��%��20�ǯ<�t��������'�$�.��\�Mg18I���`��PJ[8HaZ�f�6p��H�YL�A�#��nɦ���4�[�K���a/~C�]�x���Mj�0��>�vY���ޓ���ݴ'�Ϩ6�vP��?��t5��|0��9[ɦP�/�\�h�9�#A�i���.�c*DP��%�@��Q8X�XsBK�Ԣ��o���H�z֙��…ki�j���?�ۘ������׾�\��|�e�g�l��0o�cRO�9=�}]�1�O}�D���=meV�z�rR�6vՐƭ��?�TfL�_��x���AN�0��O1�.0Nl�-U����=c)q*ׅ�!q����FW�9X/1T�6+ט�Z��L�"%J9�T����]��Nf��,�F�10J��y�"S�2�>8�Xh,��ųC�X/J��E
��e��1�K��[>���/��e˫>5/`�gO�#x@�hʾm��Ϲy���;�r�SU���6��J�.'X��A��u���a��x���Mj�0�N1�eH���7PB.�M{�%��\d9�����|��7-���<E	�G�H�4&�c��ZNl��	Mjb��
8i������j��f눼C�*l��4���
K������s���V�����G�
�մ��{��U8#����m�\��\o�m+W�
���Q�x���AN!���'.����1.<����<2$@O�?��ݸwY�TJv�L�|���6����8��%���I�v���ǚ,�#lv�y�-� �\l�Qg [��r�vz|`���f&=�_�"�s��<�������^�պ�^E��\�;5=�+R��*g��&��@��Y�1��?:�1%�F?�4��W�[�x���AN�0�~Ū=�:v���P��`���ة����	g���
Ⓞ�yB��GB7�l1M��"3&4gnZ;�I�I��2�����yIC
_�����U+|�%���۟8�\�/U�X�&w.p@�hd-%����MS�[�'����.���[^�pK;�����
��d~\-S��x���[J1����7EI%��4".AW��*t�/CR�q	�~���]�
��Rf�c�bv��X���g3Mdn�ˮP9ԩR�x�3S	s�l]A
0M�[t�'�N]��*?��ױ���?�ж�U�v�w@����EkM9����?�<�l�>�X`�yh�Se�.�P��Syd��=�(��ڀ��U��Z0�x���KJ1��}����(IW�0����	*I���鑹��Gp���̠-Z�Z���Hg76�(P{��$P��J��O`��`�ֲ�	7'�YW+�\�L����|���Sv���:s
����
jT�£�B,�ך����`x�^���W�9R)w�F�)��xp�k9�rہZ��)�{�?%�A��[8�x���KJ1�}NQ�R�ʧ�� �W�TR5�Н4I�z|�#�}�t�@�.	YI����eq�b�k�1��&�%���4��أe"Ɣ%YJ���[����Ƃ��M?��w�Oi�֏�+����v�]��3��_lB�hM�DZ��?�w6#<�+3|m;W�v�}(h�Vis������a�TP�x���KN�0нO��a���q'�	���iF����'բx B���j�T�6�)�Tf���Q+i��*��b�;�7�F���RrK�:���g�m�N����|�o�7��J-���ϼ���CG�����y��$��"Sk3�s.މ��h���y;z��3�j��_�������a����]|��\l�x���K
�0�}N1�R����x�z�$3j�$%{~�#�}�xAq	M�lq�W��Y#j(EL^�dUDŚ5��ĉ�C}��*	��L3٨�I+'қ�}��i�s��+��\y��E�F|e�қ��(����Zf����3վ�}0lļ����8J^�x���]
�0��s�}dcͶ��� ?[[0�4[�����~������:t�a�4{&�!0"v��{c)�	��&�d����&Ġ{��8����#Q��,C��.�����J*��\dL���r}l��A�P#�PRE�O]]���Tx�Z�d��aYp�cN�	)Pg�����\T�x����J1��}?E�����A� �
�h'CR->�=>������ ��U8#�Gj4�E� �j�$��	�F�k���9���dLQ���E�R�59�l�a�;��L���o�	��N�n�����G+��;�K�۶2�?�˹s]�%~�}p���A��#��͞�ug����η��B����Xœx���Q�� ��wO1щ
e)���qL�D�d�^��=¾��3��d�/�S4�)\{���4
f��wѩڹ	c��id�a���͙p�N�Hh)�d=d�;|?���o�S��*uK+��g��Z�I��Է���?��-�f�W�sm3P�]�v�+I�M�)O+�x���MJ1��s���4y��ѽ.� ?�L����7�
�jQ�AQ҉�۔��3!j}�5c���������N{�	T}�F+�hV[M,)�Z�R�4��
S���p����� <��I��V��HA�ơ�p��RS����|�dnk��˧}�ʽݸN�\
�~_�^���:~x����o�V��x���AN�0��}O��,�����l���0���(�p~*$.����
U�
f�1�OġT�A8zhY�Fi�b�n<t3TE���v�:�V�AuRl{)�"@��
��B�Y"h��!��k8��.}�O�o��G_�!�{��͖�\�iS{u!Θ)�݃�O��u1��ӻ�/ue�&wj�v�����X��'�l�]=�6�7�c��x���Aj�0@ѽN1�eh��Ʋ���$'�4cjZ�E����	!��oMR)u�U/�SF&%a�q�Ef�S�A���wn��2`�11����*�DR�yL�b�,���>�g��യ�&^�����K_6�7 �!�င�꾮���?�"1�G�����=*��
��4���?�ߥ[wWp�Q��x���Kj1EѹVQ�Q�kAe�
�y�
V�t�M�c�O/��Ħ[�ѾVW;�ӑ�͝sNl33���
�=�s=XZ��}�h�1E$�T��yn�+�c���Qv�ܟ�[�Q.8��/bgC�佥�Z�:�XD�>�Gv:���Y���z��mN�e��y�OL��x���[J1�s�?%�$==�ȞA�y��dHZ����UPPPҙ�h풎���GKVg�E�1˒v-:C�*@1�}s���hs�f%$�cʴ��5o�n*|ʽux��
o��i\ǯ��Q�_*�+g����E�!�Z)��?_�8�r���'x���0��C�P�9Z�}��� �:�m����tVI�x���KN�0�>EK,�@���#!W����(�GI3���J��D�(�QB)Ld	C�B>dK5�su6Q�d�y�M!V�;�.�)��G�Y0�Xe��L��Ͼû�M6x�r���^tie��M�l��go�-���ڢ*��c�>�?�\zok�����w�����(�	^k�e�̺��k�0�9TR�x���[j�0@��b�a�<�R
�AB�Lj,)ȓ�w�P���^8\̰X41q��X��}�s�n6H�[����M���\Ĝ�_�M>�@�,Vg‰2ZL1*<��
?����*;|��[�7>5�/���޺	>P#��k]E��|&mI����s��QKo�{�ư�q�q�t0�Y�N�O��x���[JC1F�3�
>%���S�$'�&�'[��[����%;@�Z�k��U�m2.8o�M�$�����.�+��|�P�k)A!��qb����@-�S.c�7�:��V�e�q���l�\��!Ϥ���J'���J-�hm��y��F�Ǘ�Gz������e�x�t�Є������sN�x���MJ1�}NQ�rP���t`/�FO��
�t������}��=DPR)�1���		��e�v�>"��) ���A'C��FE��CJ)��|��%}ٵ���>��N��-�d�u�o\[<��$~���+�D�Uf�?w�B���O����ዠ2��u	������
:��͠U��G�)~�Wȑx����i1�U�B>C�V�'���`W K�Dpw2:%i?�q��a`�`��\&'�tΔ��J�)�kf]	��-�&X�PID��A[%�����(�t�*�*���>�2��78��z�N�|ζ^~�x~Z�6ZB��V��k���ϏG����`xA�
����Am"|�|�{�}4��?>�O]�x���]jB1@�b���$�wD���+�$��J��+��끏#�|�6b؆JT]����	F�kL���N����Yg��Gt�S��ahm��C�:*z�:�K��>�%����7�K_�������c��~=UY����yL�z���dx3>�>&�0x<��C�u�SYG���d�A�P�x���KJ1��}����R�N:A���>A��2�ǐT������:��9�e�P�Cp�m�q���œ�U�f�1����S�#d�-S2=f�	;:�W�T�d��}M����g-kZ�a}��c?��Ac:�׵����Z��]�A�^KӲ���ΐD��:�,�y�+�6��tG�Va���
rY�u?ԪZ	�x���=N�0�{��u[���
%���Dl���E��1
�i�7����N�+����l`��9��QWsRWi�;1g.���q��b�5�L�K.��_�9�k-�h�֒��)��u!pVr������]������v�G��d|N:Of�T9�m�����7Pn���N����~ܖ
'Z�~P�.�U��Z��x����N�0�{?�H��M�l	!�x��y�� ?r��xz�+P�F�of�4�2F���r���g��L�NCR�ᰆ�)���3*�(���dH�9sMj�`�~����mt������ܛ/k����a��BO�-�۾��;��������Is_�mE�z���{[p�_3Lp�x���MJ1F�}��f!j寒/�FOP�T���d��x~��}����S�P�\d/aek%c.!�$j��B#\�4��I�b)���B��� �*��Eط?��_��m�Z����d�3p��.t���S�[��{9�ͼ�~��n{��S}56��0fD�`��3_�e~�)�:�ͩ	�}�s|���t�d����c�2����aʖx���KN!�=����8�i���v9����!�3�j��5z�/y<��
q1(�J����vZe��eB#�8�1�Z�Ia�]"���H�f	Fc�*Fc�߃���o}�;�'5���d���W��zj�Pz�v���I*)E�ff�g��J�c����d,J��r��0�!�/x��;Ox�����7H�]��x���QN�0D�s���Y
v�lm�7���Mۑ��z���h4�Hc�D&83�K$�>�rh�A��9F�'�ψqX�q0N�E�4)�F�,�%�܈��7ڄ�6�����\��;^���&s?�W�֌�zG��b�y�և�_�慤֥?�i�y�-��	��0�Y�9��w�J���Hk��=)�|��q?M(Pg�,�:���j*�x���]j�0�u��>��ۂ
�A{���	l�؛�?i���afdȴ8V�]�u�>E�B6i`��e_�/j�]�9���)ly��Z�[�5���X�7�֝�wt�]��$�����g|wș�w�9���Om�Ve]�����G�/���N��dݧ��1����{=��kQ�x���Qj� @�s��~v�h��@)��A{��i j�ɞӅ^��ރ'����%b�1��*�!Fv)N�,��-�N~رq�Ԭ��r6x�����1�J+�6D�h ����w.�Us8I�������[a�=k�ד�׳��Xs^E����b�
���\�v��,��|�0P���@�w�@kJ���GHu#n�g_��x���AJ1�yE��EIo:�Y��Y_�t�q0�H���.��UPP6E�}XTξ0_�T}%Y���Xŗ��0��<�Q*5�5rX�f�k^(״-���c"u���DŽ7�o��:�r3<��j�^�<t�'@
1`L+�ɣ��Ǿof����E�������9�
��l��0�~Xn�u�*�/qV5�x���AN�0F�}N1�.ȱ�#!��	f�?�"q�=m���~z�@�}�9qLp~�Ò5��c읤��r~���5��̳J��<C�
(�9N�Maa�
r���ѧ�J���tz��fe���J��O.r�G7:7�}ۊ�����]�A��@��=ݠ�v�u������R��a��iC��pj�Y�x���QN�0D�s���	����7�x�u	����r~B�o�4Ҍv��X��)ʑ��E3�vK�xry��.��e7�MyʌfD$�dND	C����C��g���-+��ʻ��y��W�+/򰊾��,����pDR�uV�և��Wku��ڲ=�����z=xGx�U`���
f����2��]�wC\���]l�x���Mj1@�O!貤ȿ���.z���-��x<�(=���Ow����)�\�)��+
[ǎ��k/.��vY��f���+����۹9!N=�D9REC���*߲�e��ޏ?��e�]�V���G���^�"�:�XT培y�p�/����&�H��X�6w���f~ŕQH�x���AN!E����
4�MO���'�P��40�k���x���|�D��3lh�s0s0y&�Ym=�S�E]�S�˚�-��)�I��i�zmC�e��0Rx����]�*��9��J�驒������W8i��J��M������J�ݮ��ؾ��0o��f������&tN�P�ˣ�~9�Z�x���KJD1E�YE�CQ��ހ{��R�z�%MR���}�gr�\��E��9��3��L(�4yF���4G'�擹�.U!"��LZ���9�(F�9�i��t����r�
�m��x�e�/y����b@W?���Z�mߋ��37w��n�������j�!Ǜ��J�tam��b�U��x���AN!��}��v�0jAA�1^�������DhC�x~;&^��/�NX�Ϝ��Uc���U�D[1D��dŚ��O
��O�gjՅ�	��`kL���RSF��?}�9Yt���ЌD���H�hS��
��oz�'��|ˀ���Sx:~�E��?�a�>�q䭍�ܡA\���*�̗W�y�(W�t>�y�m�MXoS��!�%�m��aD�x���AN�0�}En{@���N"!�����a+��^�O����fcC�q)̹q	�G�!����J�R�F	������D �J��k�s��E�$U������B%%��c(e��|[�B�����n��ݽ훜�pO�/x�u�O}�j�n~��>���`*���f��|z��N�ru���h\��mwM�nC��s�m����a��x���Ij�0E�:E�ۤI.
�&d:Aw.P�J��	�����87����Ke��07�1{�dmc�֛P�K>���j�ʳ#����bK�v���Zۜ-����)��~�p��n˔v��u;��S�2�<���:t�m�A�U�L� ���mw���>�U&��گp��q\�a�7�q$�d���;��<���'�>�a�zlm�	a(��)9�i|ё]�1p`��a�/��lu�x��P[J�0��*.�+���� ���7p���@����l�0���ys%�m�1��ܬ��
c
a�c@��&7E�&mĉ�
���	%�hqt��$�rc�ƣ�q
>���Q���C��:��=�7�{�h(į��ѣ���$��"����rq��p�e��J�4��	��m��1ȹ|��q/ہ`Y �Ƹm�s�v�s�
�ï�_/��s�'k�L��>��2OqJd0�Z�1��0�p��x���MN�0��9�5@�OӦB�رB3s'u���M����@l,�϶޳9��������:���#�[��{pfZԠ��Сt!���B�Tg(H?(�Ǡc��S�pd��i�x.7��y�jV�P�Ѷ�FI��JJҲ����uq�3�aw���2!S�M�\��/�1�#�2�e�`=m�~��)��|W`J����k��o�g*;!N�\ �<
�f��_���w/�x���Qj�0��w�b���e%Y�UJ��H�	XvP6=M�	�8̯ slM��s�͑C�c`��Tcve�"l�y`U
E��U���G	bф=����p�����w=o�N�?�t�z��F?��꥗�+�@v�sH�M���2�z���Ż�7'��#��A���
��eA�H�Q �x���K��0�>EC�CB[��0W��ݎ������'9�l^բ�vf��۔���$"�yFkK��Mb�팒�#w�|���\�(b��P��)�@62���|�u8�*���Ѻ�+�v�;�vr�[79��q(m۪*��6t��,\ak���$^����Cݟʙ�	,���'�C��T;]_��T��x���[
�0�s�?E��Ѵ �U���i�)��G�ofڦ
1u)	22�l)jhd�.dO�َGD�Ҧ��u>s�`�JCzKG}��^2���=�
VڧO�*p�ᣕy��Z����]�> �-Zkx��Қ���M�)�r�4/��z�����E��x���Kj�0D�>EC��}G�H.ҶJ3[r{1��'7Ȯ�ޫ�P�l��db��uLV[��3���Z��C�"���ū�*�l��a�р��:�F�|Ƚvj|��%��3~ɲM+�䓴�.F휦W���m���
�ɣ�7��~��,K-T3}�|�VH*�C�!�a�j��$(�!i��(X��x���1n�0w��@� i�RA�"Q$"�vY���O�v�ݍ�
!b)�b�X��0��z��`
&�b	\�n&��%"6͢���c��'��Ȗػ��W�w�,?M�
�?|���E/��;{N	gf8!!:y�kC�����E���1�<�	m;`WhC����P�|��eW��1NP�x���1n�0Ew�B[���dҢE.�CHY��@���>�ҽ��{������%*>x	lD��2V�x`0�0�sӭ��b���J�`�U3�LS�Tk��d<�5�£GB�g^SN$^���&@��罹{>n?�n�}��k_�rӷM��ȉ���w� ��.��?��K۷���&����q&.n��Ls?���W�2��4*X�x���Mj�0@�N1�eh��?����G�Z`�A�|��G��m>�XR��-��yƩ�D�XrČ���P攭g�!]!���$f+��+3���=��s��
�u=<齝Mz��_>���&�.�	.��M�j����}o��Of����@�G+�A����*�*�1�x5?�_J�x���Kj�0D�:EC�C�>-Ɇ!�U$�����`�Ir�8GȦ���%;@u���2��<y���1����>�IOI=ӎM�d��PGǥ��*�Pg�e�d�V�N��N�t.?
�D������o�;�!�t�FkU��6�s�vЋ�L��A�y�t*3�'}͐�^A��K����-8�����QD�x����j1{}�BJ��=�^B�	�T)�I��>�!���8��n�̐�f��Zt�D��9�ZS)��D�T(�YmipHSF�y�.̅3O�g���t-ds4�8�v����_����Uڒ���Y^��H�A�֪���D����	a��$������?�����t~��A.u���{Z�}�N:�
x���K
�0@�9ŀKQ2ʹ���W�$,�GL������ZUAuْ�b�Y0�N��'�����٤��r��r8����2��%���S`I����k�M��u��ᫍs��h{�#:�\-Zk�:�ck��f��=�
ڱ����AÜx���Aj�0F�N1�eI�X����*��Wb;F��}�#d�6ot�`�&Ѩ��2����s,^��Kђ��=wl�|K�jI�BI>�<�&9sk�x����Ǹ?;�x�,،���9��<p�0>�%�\&�Dw����x��zc:z���;��G������6�G��x���A��0��_!�c�E�e+.K�W[��8簿/}Bos��̀#	r��TOUJ�&
~�9��'�)��bt�v��*�LJT-g�9�O�C���X�杞��:z>�W�+��y�6?�g�q�H���J۶u���n�E��
������(Zv=�g��#E��x���Ij�0нNQ�ep�d
B�R��i�-�jy��7}�޽���5k�!!�R]2�F�&ۀ�a�R"�ɂ>ș�B-�'4n\����$=/lv^�5����v��~��^6�t�?2�ytN3}k���Ǿ�c�æ�e����>uT<�,7��t�qBƭ^	{Iv�x���M� @�=��ĥ��3��1ƫPR��48]x{����{ҙ�q���˅��{�����a�c���;oA#eWh�`&�j������`X�T<dn�x,��[��/�R�i������k"��D��ֵ��Lu��.�:G�m�V �4�m�/Q\jE)�x���An� �y���V� RU�+�����������2��AkZm"ryEF�>̅m\��R���h�Ha:qPS�gf��c	�0�%мm��-��)�0�]�>��{��Z��'~���{#����~�Wc��r?Q�j� x���`�*z�v(TI	�V�U��t�@�F��ڏ�D�u���_��a�0��T�\��x���K
1�9E�KQ�v@ī����d����9��GAQof�*H��WV�	�Y�!彴��oR"�>x��#�H2`��t6%�蕋ZZ����x,��[��9_��i���	h�1�G�J�R侮mN�S���
��8[ߠW�K;����ZGo�x���Aj�0�~����b�r�R�I��@���v���0�0TI%-)+1"J��R���+U�.v:Tj��"O�"s]U�͓���j�ֿ\�������6;Wx<�ӷCv{?�? aF,3-�1����n���0xI�
t��O�
V��
�F�/��S�_��K��x���Mj�0��N1�ei��я!�^e<�l�e�ۗ!�w�sT�k-[�Z)�7k,I�����Eą�]2�'�9^
W-�ߒ-#,k���l]�9y��9����_�;�c���1(pdN9�@>x��<�mN����Ba�$�����F*�vL�k-��?(xK��x���=n�0@�]� �1H@�����Ћ����@Q�޾����{��B�E�R�'+3y"�9�H��."�:���#wm�Hp�]e���eϬHQ�瀑��h�k�����-�
\�y�ƫ^��o�~"L��	Nh��۶��2��,!���}y��Oh;�{�˦Z��l J�x���AN�0D�=�%����B$q�O�4�RW�ۓ���fF�4�]Wr��pa�Q��H�DvE�-����4�K���D�dC������2��*q�~��?�O��.�5o��s}\�1D�G3��۶eU�'6u��x��J��T��V�Gn�#�=+h�_���q�:�*��i|���(�/
[��x����J�0E�}���L���CD>H:�`�MJ:}{� �uw�se0C��ǰ�bi����.ΚQ�虌Wv���&P�3T�V�s�I/��倬��O�0�)�����\?+�O��E궬��X�AY����'��VE���4�T@x������[�G�rH��_���x]����|�̐�}���O_/F`�x���KN�0D�9EK,�ȉ�ؖb�-<ݝK����1G`WUz�]ҘA�
�c�׊ч=� !mw�u�鲹m:B�"@�
:�Ҳ-f���
[4�����iZ�%=�Sn���t�\^���|I�RX�`6�)5[��������E����1<�N�3PSW�&�
g9ZFa�.=�ҟ���G�Jm9$��A"��*�� �#���p��G�A�w�y���}�;k'�x���A
1@�}Op)J2�N[�*i��ӑR�^=���ytU(X%h*lɧ<����U�1h��B��{J�6`Vu��V
�DlZq�b9O^L&S�N^�wx���^�U���6�-?��t\�f��(�	ѕ}��1�O�"�	JW��`7�&_����>��H���ix���
�0P��)�q�d��B,�	�@��f��[����;�ʠ!B���Q\^�P�I��v�糃��ޘ"�LQ��)��͒���e{���x���;n�0{��}��i��E�ԩrZ��F�dn�{�u�����fђH���{aT�j_ؤ�1�Ѻu�6[$�4�9"s�$Sg�R�L*�<�ą��7�n
>Z�>�zWx����2���j~��)Q�	^�Cٖev�����k�������|?�u�zrߎٷ6��U^K��x���K
�0�9E����D\y=�K��D�W�j��nf`x!�~t	Rt�i��P�'��F�A�I�j,������Hi��i@B�6G��rAL)���}�w�5y�s��U��=\��i�c#>��Q.ʃ�J���2ӟ��ַ�me�&���.˖����Of�x���K
�0�}O�� 3�D�"u!
z�$�P�4���_�n�:1�!rc�L��`{�
���$��V�q���4Vf����Ҥ*od��[-�J� }��C�_u(3�Uz�Ȯ%��,l��`�(�5�u�-C)$"8#�
8@K�Z�ݴ%OO�����N���;F
�x���AN!@�=�`7�BSTb�p�'(�™D�	�x~��p���E��1A�)�@J(Js�R���͕��e���ĺ14I���c��]
>kI��9l>TآTl�(�[jR�D�qC÷uާ}_��þ��a��_xY�^>�a�z��9GG��y��_����U��2y�ٞ��M}��W=�o��[��x���Kj1нO!�2�h�_�d��'�l�d���z�n<���0Sc
�}�A�Pl�4L�T�Y�{��Հ�ZDsCI�9�L������S+T��n�>���+��E޲������
S�?:%8��J_��L���P8L)�\��~7���;�S�6�սMOߔx���AJ1�9���$�t:�A��n�?��0�����m<�����dt�)a6>��8S�+S�&p�vևh�WWX����C��t	%TWf[+���\��#+��s�)�a����n6:n�Y��.x\!Od�5v�S�t���*���3Wtg��z�@��v���J�M�)����eDzN/��'��HU�x���KN�0�9EK,��q~B\�
���g�(q��Μ��#�-���4��rHH����F��Mc^��{b@w�E��6�1����1��e^8�9�Ο�#����#\��k��aG_�o�n�ar�M�lؘ.�ql����U�O�Ї<@g�ߠ�4�g�MJ#JWh�;j9v�"{�u��Z|�x���MN�0��9�%��(���TB�����83�Ҧ$�ܞ0���~�d�߅�֏��J�7�C�k�[�r�BP^�Ă�f�e7���3�u8���W��Qr�f��uW>�oL'�a�'۔
O�&�p�l��L�����eK��������N)
����5���5������X*��a��\g������ց�mw���F�c�C!�t�8-%���.���z#aJ�\aI�A�3Ѕ��q˯��=�.8-�<�	�<�$�x���Aj1��O!貴ȵc�PJs��E�{<�(�;�\ ��dzU���#֊RJ@�:y<$)��K��,���-��l��,�Y?8V�)�	}�C�1O:�B���~�
'�?��g�i/|n��m�>5}�վ���������/f�/����nUx��[7��f������]��E�?P#�x���Mj�0нN1�BY�~����!�Ɵ�!��<�[
9@����$����V��Z&A�����$��^���.�9CdF�2WK�mΖ�,YLy�utV<��go�O�<��[�Vo8u�Y�,[����F��6U�ѓM�������8��S��a~
[L|�x���[j�0�}
���/(K���ȎL��$�=��K/п���C�O�S���@cHSe���Z3H�gw�C�yn�f�� 7�1u�#��Pb(S�3:��~�Oӻ��o�����|�w[����P�xdB@���}�3�Ǟ1����:��_�i��b�>�r��/���XM��x���A
�0@�}O1{A&MҤ ".\x�I:c�6�4���	\>��f�!(q���ꥋ�S䣳-�gՊ`�yR�T!��U�!~6��H6�h��a��Z�\�GJp��,��ݿ>��μe�Bm<�����y�o��ws�4W�qK����N�f~�2���M�x���;n1D{������>#)R��ȵ�x���)���{�3x�0:D���2�#*H��Yb�y��M'I���P��u�.y����'ts�L���0�L���:�k����3�˞>�-�&�.z���x��ZS�ei��������|2�Ҷ�����t�
�ڦG���K4�x���AN!@ѵ���,�PP4���x��(fZ��	�=���.��"����9&
�S���Z�����u�.mh(�m�L脳%��b�dс�dȳE��/�
b�!"�c!A �2�d|����u�ܙ�~�z�O��[�c^�"�Mƃ���&��6`��m]�1��z�~�;5>�C{�c
7�e?������2�SWynǷm[R߆�^��x���N�0�}�b�&��P���h\�C�B��F�z�y��f2s��LP�s�)�ZݶC�|���^�u��8�Ġ'ݡ#���5Z���y��ͤ�1c�
/^�	/異�~Q\n��?s�Ǎ�D��k��}'[x�����}���?-N��W������Z`���
k�~pL3p��
��]s�!^�!��@��\Q���s�|U�	�7���F��>��7�W4���x��x����j� E���]�hF�0����O�NdF��~}C?��{8�+���7lB���C
>+�`"bHz
&�iظ�	E�J�i�3cNɸp��e�5��:X��Y�N�h����<�n��ߥ��ĥA�H]�W���L���!����:���\T2�ڞǽ4��J�.���Ny=u>��&��IV��DE.�/�\ǝx���KN�0�9EK,!�m�cK�e'�ۙ�9�g�#�+�Tz��P{m=Y'��:D#���w��Ni�lT$U@��8F1���`�J�\0j`��D�
�i託\�ʷ$��+��/��x��ʋ<'�����N�#<*T��y]�Z�yS\-��Zr8��F��&���	\s^j}N{^�ݖc���|�I%�i��rۥ��m�=U��3Jao~*fo�x���]J1�Y��r�37	��t��l�!I�~�K� �VN1���3�ZÉC�A!qf#Y-G쨓���֊wP��g� �)�)D+*{0/�6/�����>[I�:��}�%]q��o����GϬwk��s�}頧��}\G�ۑ�e�u�1��i^@�ݑ��O��8-�&�T��x��O[j�0��)�,ǏĆR�؟�@�卩c�م����Ā43̨U"pf\.ڨEt�(F��H�i��
�g;V�
���:(>jAA��:;;ݕƑ�B��0<�Z*\��+~S�Bx�����%2�w�0������l)�[���Y%x�>�N���=����*����6�%����1��O��+eh+��O׾C=��&_��x���;
1�>���d���CLˆ��#fO/x�W��T�k)A�!rV�Z=#��:q9Vv���`6i�t@G��'�5�jJ�8f�!�P
�,dd�ϵ��틼�._'���ǹL:,���R"����EkM]�y�]�ۦ)8�mRY�m0_�D6�x���A
�0@�}N1�R(�4M& �wb��X4mISO�xW��������5bpbu�}���
3��ٲ��Z���@�#�0Z�F��!�Lfȁ�Ɉ18�1+��}�p���+\�-��?��X�S�I��r�Y�k��Js)ck�߭��.p_�a�"��I�N}�fH&�x���MJ1@�}NQ�R�T~:	�xWz���i�$Cw���<���Of��-.�������*����IM�jZ�̕
�9kIJɒ3R���u���}̥��l覗y���7��}��	/����ם��+`pqY���5u����?ws0<�O�>��^���k'��;�v���[�P�x����J�0@�}�b��(3M'm@Dp�J� ?S[n�\ҹ�׷�n?8G�z�!y�vI�1�[�<��sr99�B��T+���1�8� �Yp
2�8�<MD�d�3�k���#>[���r���n%��\E_�Ɓ�#�	�Mj�l����t������ʵ�+7�U����y�խ�}���_=S�x���QN�0����d�I6�V�'pb*��r~
G�s�f�vU(�V��|n�E�xD�)]�/a�I��x�a0��h-�,���Ef&��B��yJ�I��ݾ�>L�u����S��j�Z�>���cJb�G$D׶u]��s�+<�O�&�g<l���8�{W�[����R=�x���AN�0E�>�Hl��c�N\!D�p��=.�b'J�=S������̀=f��\N���b��t>��
!f���YcP��Z2�L�ꘇ�{⮠b��dfm]�w^�G��
��w����e�q�����]p��I��*͵�"�ϺZ��g�������,ӘHƹ�g�O.t��c_���ǃ��yUf�x���Ij1E�:EA���!� ��%U	,�tW|��s�lߟ��2��!#r�K�..�q41g]���p5�I�p�!���jO%�JQ��9b &�<��|T��e��-���f���}�gi=_�m�|��'�]���6Z�2{o"�ϸZ���W������j�‡�6@��vm��1����}��q��χmԩ~��]�x���Kj�0��N1�eh��#�Js�n��1�
d�ؓ���G��~9��,����%džyb봍�%.z�b9f�ǃ�:��9�0M6h���B�f,](~��*��g�-�_cKO9�z����-5z�$�`&�1xm�Vyl[��� xY^�s<�v_k�6b�}}v�j��}o5G��Cn�<�/5�W�x���Qj�0��B�ϲb)��-��vG�Y N����-=�~<k�P�F�E�S��%a��AiT	3O<D�禫���1K�Qb�.���O1h���O�.��ok�k��~�:�䀯�
���yU��)p軔���{'[��������|­i6��/�d��d����hMX�x���[
�0��b�G�&�4�-�
rk�MK;u���y���r.&iR봡hS'��9`k�
H��S�R�a�ʀ�Z�T��h3�	/�^;�ؚ�Q��Z���{Z���
�i���pYp�2Ɓ�J|�Z�Yt�r�H�8f��.�������/\�:�V*4�y�RW�'�MI�x���Aj!E��� ��V��B��\��rFҭ�cor�dBN�����ɇ���dЙ@�$�`Z�ɲ%�XR;i"��rK��9�ϥ��19K����d����>�2��wx�/��/��o�nq�S��
��A$D��h�R߶:��o���SX�dX;���v�r�4koP~�=DmW�dm�ü	�5�#<�o��[U�x���=!@�SLbib�v����J�E�l��9��+�כ�1�&���[�C�L!� ��;�#'/���7���1����8C�޹1��B�Rf�K���R�	'~I�1�ׇ^�8ɦJ�ZBc����V�>ϥw��VM`s��i���-��y��Ks��j(L�x���9�0{�b%J$�m�<�G��
X$2N��9�@7S�������&M�K�ѳnHʄA%�3��5��'m��i$1B'�bT��56J�i���48���.��r'8��O��i�]�~4
�6��J�R�<���Z4�M�pΙ3<��Z�~��>;M|�T�N�(�M�x���Kj�0D�:EC����eIC�dr���f�-�H=���s�l
�Uŝ|N�_���K;E�Y;�)P��/Tp�N;�'�mv'Yr
�C��q�)h=��s4�J�7��_=�?�+>���>�Ը��N�j2ҫp���4R��j-��`/j��ƕ`�)���}=ﭯ0��0,+=S�t�Q��BC�`�YI�x���;NC1�w
w)��^K�PF�am�ID�r�N�R��#�H3��k)�L�, �C�jQ=Ah���4-�:l�.�PKH�b/Yj��(D��+,X��C����[D��=��.�Gl53xl�^��<������/�Q�b7z�ǵ��i������݃'�z^���t��4W�n��v�t^�=���r�-T�S���Fx�[��q����I������q���I�A�A�q��i��q�������a�I�����fˉ�-��������WQ��������[f�BN~�BAbIF1gm�x���=N1��=�t)"�c�%�P"�0vf�*Y/�:����4Oz��7��͘�z�$�S@*�����j�1�Z�O��س:u��B��Ѹ=c�A��F�>��ւ)�ڸ;�jt�c�fy�����>.k��^�������巽�y)7yl2N`�7d#�G㍙�,����&�C�tn����]s���Txܻ<�@�v�~�&Y��x����n�0w��d�zE���
I�Bm+P���7���7��l��T�"�ZTX�΅3��&��i�&qӕ����B�B\��(z))K$��.8;��Lt��>�<�v������M����vY�uW;�sI~���šs�mkf�u��[��Ӻ�C���sD�P�>h��vk����(Q��x���AN�0@ѽO1{$��L�DB�
,i�0��"JW�JO���?�*$GIs,�����s�"�/�4����J�}@�N���d�Q��<�I�ؠ������'��|_�x�G����M�w����L<��%kMj�.c�?Vs��};�۲����z��.UZ_�/s7J\�x���AJ�0��}N1{A&�4iADn���K�摦����\����U!�cB�ȳJ��D�l��˖b�d
~Z̍���B��D��X�� }�4c@!Vt��5>[��.|���w�'����ִ����������V�:����לἩ���y��zlЯ]O(�+�m��U�Z��i�O�x����j�0D{}�B�!�eɂr]����Ҋ��C^��ǹOH9ox�Hgf
�,jm����ֻ�?��Zݨs���!�fXx�"�B6X�0"��.)���:��^i�w��E�D��"y]
�*�3��λ�qD���Y��g���0�>j���(������N^�&�7�+���^��p�c5��/I`V�x���Qj!D�=EC>�:�����!g�qڍdu�!��Gr�|�TIgĜ����ݎF���5�N���eݬ%���M�ļ��]v~�A��~�`Ʉ�D���w��ϣ�[?
x�._W�˯R�v�Kcy��\:x�Fk��Z���V���`��S��7�V�
*�A7���hs]=&���r��#�2Ƥ/�	Y�x����j�0��F+ɖ�4�ڞ���U#K��)��A��Ǚa��
�^9���(��~�s�&����Gs�Mk�4�U��D��N>ڸ���4�dg�SΆ�~n���
^�S��=��c/�rѡj1���5�ֵ�ͦp�!�ә�
�NϠ��h�^Z��q����%��D3�>�/նW�x���An!�b�#Y���(��G�� ��
�/y}l?��SIU���<'�S����������\�vhB6g[r�� �s��C,vv�h�����A�qo|�3��^����?R���� �d�5ڻ)��Fk���U�W��0.�i��
��!
�F�I��+(�&�C	K��k��?�W�x���Mj�0��:�@���?k$(�9@ȪţD$��<���q{�.��<��Pb0�\qDMC�>���
�H��g�C
j��M�2�z�%�܎Ĉ;���0�H�6��N}k�™^\��N������[��Ek�C��u��*��Ug8�ge��\�s��Vaa.��߶i�sTor�Pz�x���;
1�>��$��f���CLf�b��+���UU�9����Za$<q�)9�!�@�]6W�P�s�p@�I��������s��1	�`xm׹©�?��o-7�=�|le�w�M���CK�K[���DZ���mS6�#��Sh�eޙ�FA�x����J�0@���2I�4�z�/�&��`��t��׻�	�O3Pt����~
;�43죙\��vj\�g?2&7��0���Iq��8ƨ
*�r��[�t�;}s� x�?~����*�3hk4�&8��U�ֵ��j��
pN���wj׾����Ui۲�z���
���[����!6&�UG>)��0վ��|�qR?>�cV�x���K��0нO!�e�H�O�ah�C؎̄I�ਛ���#��-�
UP��)s�>dVJ���be�sGin/C7�P�$�#�Ee�����B�|�Ը�+O�}���V�������W�׺�yS�
��>D��k�u����
�/
�}�m��X�tݗbzvo�hIC�x���Aj�0@ѽO!�0ز�0��z9�ih�ͦ�o���o�}�A׎3��JEi�e!ˑ�ą�qJ�i��a��4em]��F���u��5&��#R������>���/�����׽mv9�� �3!�kL1��﫻����%�7US8�
��&n��Iu�x���]J�0�߻�>
5�_[�����Io�0M�IRuvo܀p�>�w�D8ꞣ6Ji���`��(+cfjz��͎����B4{���Zkz�:��KH�'��4H9#�"�HK��+I��:E�)C
e�	�}�o1�J2<�_�|��X�5���Zp���Y�Xcc���ݼR�	�c]!��\�N�K1��'��Lj��i�p��4�Ӟ�/�{�q��5~�������ʧ3��rT��۶�<�y��x���Kj!E����_i��L3�����J��!���^B����p5V�q�b
�ő�UO�]��Ye����Fe���,�N�u�x��{g}
�S��P�~��6�H�|R=#����=5�Ͼ�WZ%��x�s6iNc�M��{�:�ඳQL�Pϑj�Q���@�I~�rK�מ��
��C����ttb�[��x���1j�0D{��C�"ɖ�!�I�&{Ya����@r�x��0�x�H�������q1�0[�g?��{I}dž"40�e����jΧv�h'N.!d
����,��GK����-�Fzŝ�eݧ
�y#3Zǚ�v��*�}_E�]��x�Bף/$����Z�RG�k-��[q���}��v���SS�x���I
A�������h�l45���	�) H�P��99[�Wz��I{lN�\�J�P�3M���̠�M�41�ZenZ��U�%�&a8L�"���Ú�q'��~�`�ʈ���j'����Yu�&b�?3�N�*��@�_�����0
�
���$��H��x���Kj1�:EC�R�7/��
�y�<���� �GAO&@�Ǟtp1�ı��]���+w��X���!d9�fS]����=��J@�n0=��*��Oz��>�X�U֭\�< /d��X���Z�}�V��SO�:P�"�u��~#���p^������������ϓ�3M#�x���KN�0D�>EK,��f�W��ΌEbGNG��	G�V�Tz%�0g��[�KI��Gr�X(�L���jO���-��b��L �f��s�|r�ؐf�a��)�>`O�S���W?�ny����ڒA'=�3^Q�o[�jj0<i������Hi]a��卿�ZkoP�̰���r�W���"S�x���An� @�=���(0�U��,��
�04H6X�x��'=B��m�l�`�9;�I{G%&ON��mI��Zi�&�L�k��Z�#9
c��^��JH
ZTtȣo��1�Vn.���L3�7�0�E�=��+���T��6�738�{O��3|߮_����A:,=3��*�7���NL�x���Mj!F�}��,'	��0�\E��D�U�r`n?�#�[��x|<��t���b0�%��49���ƹ����'5�	]��Y��1�HR:�(3�b�ɘ�oq�o�0��B
��\�T��4J녑p׶�Ga�f�$x��~@L�~w�?
W%�,\z{�Q�	'1��=R�.�.:�,W��x���[j!E�]EA>Cm�G �l��r"�h�=Cv��%�|]8\8k2C���;i���!:dtH�3Ʉ<��fq�� �H�������f�c�:[T���)d+��{L8謿�{��k~��B����Z봁W�D��ZY��y��E��
�q�k�:�m\�]��Xe���q�9K���X��N���7Uc�x���An� C��b�.�V����W��H	�����}�ꕽx�ed�vE�t3ڳ!���f�!���H��.]\�%D���Z��N�{�8G_-�̮ŗ|�N����^�gߥ�i�k����Փ�г�R��&�bj���3�B�k�s��o؏/��`?7PŒ����trPI$<'�/Q5V��x����n!���l�$p`8��j�f��7�� �q'B��}�ҽ��I�g[n�Y�L�Šѱ�!8=���@	<*
�ذri��x��$0�L��u�@T-%�����Xg"%��ɢv*�1��0��������V��}��\�|}�{��|(�ޤ���+�U���eɭ�?�ę�%U,�U���;�K[ebl��Gm���%?�}�����#��ZҜ�v{Oߧ����D��Xd�x���A� �b�F�R(mb�_Y�EI,mp=�{���f���$�hΉ]d�%r�1�N&?1R�(ٙ��4�ē�B!p½	D(%�N�΃$�3���[k����O��p��M뒞rn�W@�uvt�v��uY�����.p@�p����Tk�C^Y��궉����I*�x���An�0�z���DK�
EQ�Q�
�����{,0kC�����\H�Z#��E�x�rH���Pcvw���Ӝ�G#gB�^f�X��8W͎�������+\~�Ӗ�����])`N	i�w�I߶�L�����p�U����ٲ߀����v��v�~�{K5�x���Kj�0D�:EC�!�������,�(�I|���V�zO"��2u)FKg�Ăa�Z��tҘ��&ug.E:��F))��&띲Ґ�h�w��J��oc�����3|<�'�Wz��W@%������H���L���I�
�
j����B���(���i��?J��6��?��x�V��x���An� �b��TưKQկ,ˢ ac�M���I~�9�F�,k��,�N���'�|�0S`��I���!�����4[��FD�%"a�i�I$;2t�KpЭݫ��O�Ѻ�&_��7X?۰�4/�9=0ܷ��ʛ��[8����ǣW��ont}�E�C(S����wPߗx���AjD!D���!ː`�_ �\��]N�Q�,��s�Ԫ�Q�Z ����&v���H��ٖpZ��L�E�1�-d��U��>�N�B�vb0r_?c�M��GEW���߫����E��c��jϘ<Z�k�33A/��(�1��U���4L�y�^e��ij8�)����	��Qr�x���KN1��}Na�%�ORUq'v��RW�����6�
U�ȡԨ&�i&&�P2bꔵSe_*au7zĢs��u���$i�}�)����?l9��}�z\��a�^7}?Ԯ��1ŀ��u�͵s�W3�����ܷ�s1����	�(e����H��x���Aj�0E�9����b%��Pz{�M�meڹ}�]�}!�$@69�E���S*F�f�F��e�n1:�C���]��x<��N6������N�����_�փ���gF�t�������@>�3ؚ�Yӫ�1��g�sm8@/<3�Q�Wo�R;�#G􊔿qR��t�VK�$��{���G_+
E<����WRm���#k�g�r
|~�f�x���K��0�>EK�D��$	!�Ҷ_��c@�~�#L�jS�*@'���~�׀�b���э�%Ҙ��lZ�4ʖ5��:L)��lj#K��I�������J�>��%��O/����v&�����x:tLZ繴�f����3}S���>�r����M��۾#S��c~V>JM�x���An!@�=���e��:RU�*�$��������6ߦT��1���xՌLɣr"��H�7Ī�^���k͑8�d�e]x�A��LA���%�+O����_M�_����.�!�
!.!�D�p�����䟛�!8�æ��������]o�_���H��x���;n�0{�b���
R\~���$�6I�u��G)|?L1�<��f�͔8Pt��K5�G�V'
�R�qV;
��iD�)�z��<j��H��CAtA�S�G��sy5�
\��&mM_6�o08�N���}]�xS��ˠ�3�Ѷ�$�?Pxa��-u��I/�	ܻ�+�}�S"�x���K
1�9E�k%=I�ӣ3�3oo�����7fP.�%�F�s@��ϑ#%c�Lސ�HƋ
��\��Z�~h�O1x���c9�b8�{�\��wl
.�[�״�p������s��I)����;�%�Ƈ1�<�'��ga����o+Ig�x���KjC1�>���;�B(�Id[�{������ےd5��0Ce�����[O\E��x�NŧTyAO=Ws%�@�7�%猌��Tb��H�C��qI9�`��.�E�e��I"p�O��m�~��gp�%���5ucS�f#������ۼ���
)_@�������0H�j~�TJ�x����j�0E��=�(���0��>�Ȗ�'��/�?��=p׻�yȂʤ�b�xfJ4O�Z�8�9�ҭ9D����l4k�R8g�E�$|щ�ZK�?��:��j}kp��᳾ַ?ֲع��@��80�	1�m]��}D��v��4ߗ�ǟ#�/����3�O)�x���Aj1E�>� �kd�m!�'�5r�g��@r��]��Ϸ�
Rr�U�2g�ĉ�Z�I�*�c�~
9a(��CW��4Q"�djYP$�H�4Ĉ��VK��n?ۀ/�:�n<�叮v����0�<Q����?�l����_�z:$���/��n`���]���-^L�x���Kj1�:E��	�zZ�c�s}��5cDط�@n�̓*�����/lEbl�-ʱanv���g���V%?s�6W���j\r��1�&�\ȕ9����6�+u�m�[��叮z��z!7��Y��Ê��l��U���I�VTR��R�v%}?Ai|����y�M\�x���Qj�0�u��|7H�,YBiO��ޒ���z�z�|���hb��|�(����2�-MR�g͋V�ia�ȭ����f�����,�Hk�:û޶A��1���x����{/O�W�\p�O!�@v��ԭ��*ފ�鐤�U������FI+�x���A
�0�yłg%�$M"�/�$���V�|��qF;3$o��AP�`ȡDƜ����@S�w�ļ�󬐥J�d's!*C���8V���0%�%Z��t�R��p���X~t�{�O>̬'�0��aB��`�)KkwU�+6�w����ֶ}�/�^H��x���K
1�9E�k%�|DDO�O7
3��*��+���,�jI
]���%���ck�\$nBI=��m�O�a#�d�!�Df㉢�h!��ʯy��y��7��1�X�<�kY���<�q&�u. ��Zվ��9�/Y
�} ��4��}���Oh,��L��Iҝx���K
�0�9��J>�DDO���R�HS�t��������LSH�v:���X"����*r��8�ņ��^yc�P�>�"�"'��������2r1��i�X��^�;�)�zV�W�F�>@M�i3�`�*���u���E��s���F�� �}�zg?�N}�x���[j�0E��
A���1�RJ��A�Oh��[���B��=�Fdr�!���'v�8
�%y/!���.�N�99�*���E�a�|��8'���w��*}o��+������X����Ln
����[k��u����0g�0~��l�c�M�w�j�
;��Lú���}R�N��^OP��zlEu[�����d~�x����J1E��+�(�Ҵ�vDD�$��ٲ��t��oA|�)prOµ�
��>g"'d�9�~��E�g'��2��k38����#2��x�������"aq	'��q��JU���z�G>��\imj��[}�c�1�/�4h-f�O}�z3 T}7m�2n\������}����U�vk���w�����[��i��f��x��NMj� �{���S4��QJ{�q2&R4e�=~ͦ������5[Vҙ���r$v�-Q���1��Y}�p밠
�֔�
fb�ȋ63�4��͜)�h>�q
|be9|�<(
x��7��Jg}㌟���^�V���w�g\	�r���<��m���^������t0}AO��s����?k����`a��Oa��x��λj�@��~�b e ̎��ܤR�������h'��cC� ����"Pd�$8��e�c�T��xȃE�ֆB�ͅw�
���}8PǞ�0��I*�� 9&
�i��uO\�s�+ó���:-�TE_��6�]��	Ѥm]gU�5*M�n�c]��l���ES�1����[m0W����)��w�.�p���VӘx���K
�0�}N��P&I�D��F��̔ZHZ�x+x�o���,C�.��h�������	؊W.U�
�<�]p*�;���h������~��˶q��i��2��d>Kժ���Z�(��_��[<����]o�����F��x���A��0��_!豴X�c˰��/}���$'%����=�a�T�$Tc��k��%�0Q�NA{k9�H	݋O�
&��RZE�,U'��[�9g�ХNJ�߶'<�V�9d���߶���}W{&�!�R"\}���1�j����T�܀�~y�6����7D��x���Kj�0E�^��"ǿJ�t�$ӗ�a�
�}�����=6U!,�aŔ��nmAJ�x�a�*	K��ܝ��9e!��cnaE�DOcZӊ��-cq�}L� ��>x�^�ެ��ϧ�+��S���
O� :����ߢ#��	6�>���M��F��1�:�Oe����Q��x���1j�0E{�b����G�aI�fS��	$y�:ki�vL؜>N���=x����lg2�X�.�<���'L�zoq��~D�m�qU������@d#e�EG�'{x�=vq׫4xm9Vx���G�g��]JZ�TYπ���ZO��e)eQ���ǣ�K����W�ci�z���ܤ�^�&�����RU��ļ�E�����{���Y��x���AJ1�yE� J��L6 �]|D���6�e����<TA�-d��[�X3�)�Ij�FY�Z|H~��wǃՀ3QNGl���ڈ���1%_PJ�"�m�|�u������8���7~Q�7)�-{_
<�ལ9F7��N��
t��N��o�r�<�1(�jص� 4|�py��_:T��x��OAj�0��{�IW�lYPJJn���|@Z�bAl��R�����2�3S�\��Z���C�#F��O]T��0�Vb�4��+P�`�����J�F7АX{r-:J�R�u,�<�g�<�k-;�(g��X��(tNY�p@��P��������\r峰�|\��v��*������u�������%%�m�i����e)��p�?@��o�6�"c^)�(x����n�0E���A6M�X�lђ���k�E�|%"���#�������g�޹���`t�Fj�l�L�Lסl��J:uڷ�j'f�q"0�i�T�����Շ���Vv-��L]c��z�!e8�~�ϔ��
�`�X������k�<�N�%l�}�7y���mR���2j�jf���
����
.]���=9S!#¹q�za��v��u���.y
_a��S�B�>�Hg�R��x�e�4�}A����|m�|���8� ��
� ~-���X%���`��0怖_v�z�<\���qx�k�/�c�G����X��+����
�e���[^��r�<1�0�
�;�����Dׁ��B�i�����ƙ5
;�1h��J����x���AO1���	�ʲM�QF����o_���]���b�y�4��7����l�K�(�pf^h�䫪vT�Ec}Q�6�|�:��
�he�c�YpU�Ď�/y��j��9�ƒ�S�����p!�W>�f���%k�3�\:�j����4a��tõⷩ���:3
Ϻ}S��1}Ah{�QBjAt����ওln��%#��_w��ۻ�!<2��O�G\�0O��L����]���'�C/�h��yGsu�x���=N�0@�ާ��[B���N0�Ǜ�886�ۃ(8�FgM�hv�8�a��7ѡ�dQ��xoJ�S�m@,k�΢�>��98v��OTT���X�*��d����̩���CŪJVT1����9���u�o����#�����\�6����+e��k�����y��-����y�@��ǀ+��N�ͻ�F^nP���'���}%t_Ӕx���Mj�0F�:��r�dY� �nZڞ"c�(�-#M�s�$�t��>��У���#�cp��\�&$�E?��sF�
+��z�(��s���y��'�aB���BL�%�9�
��#��Ѥ̰�;�~9.�ϻ�,�`��5�;��Z��E��z˿ [Q곔��͵�6��*�P�>	����r��#�ذ5����u��ym�HWX�a7�x���KNE!D笂���6$�87o
�(`�/`R�J�Z�Y&�@�`-a��#���'��x��Hy*�&�%�l��a�p�Q�X�z{l*AyC>���SH�N�R):#�s��MeA?�S�iU�>��]��]�Vm铟:�W�,�Q��Gku-�7(�<O���X��&��O�&�|�ۘ�����v��/�JZ�x���AN�0D�}N��,�v�-��\�
���]�D�$�1����}�U��)�:�Dur�Z`	�3�$�&�>�
�ܰuSĒ��D�b
5$�1H��z=��2���� �BT+P
Fv��+{K#x�>��|t|c3�*���[_Vy�eC�,�iL�̓������;�9���0�x��\t��ҏ�σv~P�^�x���N!��;O1�GS,,��1��>�,�,40���6>��/���`"�y
d0do���:p�DW��|���F]�s0��B��%e��iԖ��b����qRt�S��)|�
m_�2�y��Q�}-�TY^�O��:x�Vk۾o"��\u��	�H�9D�x���xi�-\���{B�
��R�/�rU3�x���=n!@�S��2���.R%Mۇ�a���v���>{�_�7Vf 6�8���0IM�mrZa��sp39$�Vn0�Ike';O���l�l%�@��M>+��W��Q����
^�Qj\��x���$��[x�FJA��2?��ᠴ�#����6xl�O�J�� �7���w�u	���L��x���;�0{�b{�h�	!J:.�7	'���Sp^7S��J��"� ��ܳ�=�Vw8 �v�k2Am!�R`0��[�FLk�&�[ӓ9�L�!b@��Q�5�'xȾ�2J��T�I?��)̯��t�֢7��E8a��6ͥ�_���{^F86K�o�����!�O��x��M;N�0�s�)A�Ulg�bbf<I�u�ȞH7��׽�f0<O=�����(ƎL���7t�Wk�s��%)xjbC�ְ\��y�;ꉦ��\�����S�=�繬�-�HZ$��Z�e��oˆ!^x�^�Ԟ��:�S[�Tu����}Hd�!��#=	t��q��aO�KyLb}�Rs�gifO�w	�TR���T�?B�_;�j
�x���MJ1F�9E@�:툈��t3�*]&h�!)�6�\~��="�is	�eYmX��Eб����%�zI��\hHS�>&��aFĜS���%�W�Y�ح�g2��>�]�*
N���Lx���YKM_r�D�`��q�p��l�֢*�ң�?�|\�TNǗ׷�
3̢�s�Qc�ʘ��	��>*�>��VE�x���A
�0�{_��P�k�n@D�^
^��n�������x�ÔM�`
nh��a$&�I,��j�v���ʛ�b�����C��|��:GxL�=
��˸l�_FΦ��ws���L?׳�Mc��9Ti��W)�߮��pQ�讷{W��]�F��x���A
�0�y�~��M��ߠ��$�k����~�O�8�3xN^�p�y���2��=�$,�@šy�W�A�!�s}���� �rJ�;S�$h�[���U��+\�Rv���'�:/���z��'���`����e�U���ܞ���Ny���A��v�Y�߀Lh�x����N�0D�|��+���k[B���	h���.	���	?@93o^o�)V8�]����G�0����5�4|h��M���`���4p�ɓ�ZY���񏏖#�s��8
��*Cj�"�1��}�ڧ���Vt5��'�R�����%�q��?v�e�hnh$ʶ,s��uxA{��M�2�C��k�=s��D���zy+g�n*�[�[�x���Kj�0�:Ń�lB&�[�0drYj�fF� ?���i�
�;@I{5�%�e�9ʸ(�f?��Q�\R%�Y<c��d�-Õ�%�L.Ҹ19��CI�gE<ym��#o��Ҋ�>�O���u�HYi�ҳ��*��"�Z7f��(:�E���(�q����'S�qġ�ё��G,���~Ae{ช?l�O��x���Aj�0E�:�@��eF��Jɾ�#��b�(����B��޳Pn>i��V��KbHΩ�T^�!���h�a�_���e�y�$y�3�XFG�q��Kp�����[m����q��>�f�^x?`�$��I!҅���of���:�m4��+)��?��x�4��OUG��^��(K�x���;jC1E{�B���d�	�I��d
3�(6��3B.����R^8�g�h���bJaȦ�}p�UKM]iH�r�̩5����X��ѓ�)���O�rn	� ��b1'��-Ԙ��UH�m�֡�P�_�%�!��9���[���ƃ�lcN��*벜�\�Q��`P/'�kB�6�ݘ�:׋�<V��Ix�[���4!nb������.@JA�����$��DA����J�1%E�8�$ժ$?;5O!9?771/E�$_!=5/�(�$U�+<D,[�S���x���K
�0��=ŀKAf�4q#x�iV����Ѓx!/f�\����UK���@�γ1�E��)&��Y-�-Uw�s'�U��!�$̀V"���(����Qǹ��x��y���d���69�=�B)�W/`�m���4]j��t�aE��p���[S�e�s��S��I[�x���]J1@�"��o:�\D��+H��Vf��|/.�׏s��\�4�숞�
�-�o<�=a�l>锩�cdRL>���m�=�˲��*ۺeC_��NxW��	ok�].�]�}�!�S�\�Ɯ�zkMYctU��n^k�Q�W_��K�8Z?�lt�)T��_=�Q��x���AN�0F�}N�]h<vb��P/�N��J8A�˂�!q���0����y�糦R�ļp	l�b�g�X��Tc1DTkA�;{aW�.��׋��pI5S��BF���ԃf+U�sS������V�5=d7O�/\ƭ�W�gc=Y��ٜ�����v�ܧ�w�i�Wsڑ��-s?M?t[m�x���Kn� �>E�#�KQ�d������F�3��c�YV������d&c<"c�YR�Rb���!q�<�Sî$�_K��.�<���}ͣe�)E�S�C�G�o�;}����[��l��C��zcm��2�g̐�m[T���n��h Mm��=�[�A�Y��"��sZ�e�I��e�z"���8Y�x���[
�0F�"�B�I�KA�5(. ��(ڦ��뷸_?8GV@L%GNl����`,�n�c��{�ePKZ1����N��HDay�ΔZ�8�S�-����Y_ڔw��q��YS~��!'�=1G��"U�4=D�g�nKM�����6�ݫ���M�JX�x���=j1�~O���R�r��'[���$c����Ų$GH5�W3;��DF	��k+qc�<y#��&�%ja�X>\�:A`�Z'�2^�(n����oN�M�U�F��ۼ�ﮇ6���W��+�'<�_^��_.��}
���I<nl\#<!G\-yN������.p��
�TGnu���jN4&�6�U����H}��_B�x���MN� @�9��s��B�yQǺ�^���x�qiNݘ�[p�
N���`}$��2Zƈ��2�:��j֫Th%N׹Nؑ��~�2�#�ʸ`w�;�ۃ�$͆��Ϗ������4�{��&�����K��齸����
V�(��V�JDqiIs�C♈	�<[���T�t9N�#�
��W	b�<��^j�x���Aj� �ὧ�}!LF
���=�ƙV0�J��m/��+t��������EF��*Z��)�$�I��Y��йNXQ\b$�}�W�d#�Lư'-&nV�U�>?Z���6��/܏���_�x��R.��!�eo�����
�	Q]z�9��C�9%N0������:f(�sr�UH�5���cQ��]��x���AN�0E�9�H,0vKu��c�G�Tە=�ׇr�O��i��$�������n�M.��Ǽ�̜2��*U	Ql���<�����7l~��r�u�R|��g+�z�{�<W�;�9��Y==�e�R+eW�?�;z��tn���qQ:z�����qk=�l����:D�V�B�Y��x����J1�{�b���I��{�R� ��`��-ɬ���G���DJ9&߈�Y�%�������{�*4��Yi��R"t�6K����� �0����6�S��W�l�>d�q���^{����
������'���m�_U��ݜ��X�~S�'��t~��9�A�\Χ����E4P��x���Ij�0E�:E��f���r��%W�-�%cW��G���� '3Xt�L�>�'b?��Lr̳q����:��&�OK���	��KI�r�X��À
?d�'�r����A.x�����=o|k,w0n��qa��j�^E��s�Z�a�֑n�z�����:�j����<����Q���T~�x���K
�0�}N����Θf@D�z�|&Zii��W<���/"��|@�m�F�9�Q�!L6��Ԯy���R�P�(����$�&1�8P�ʿ��-���-U_Z	_Y�a���O%̲�ҏ� ���������w���s�y���a��Gke���I��x���M�1@�}NQ{A�L�D�
�	:I��Iӝ��+s��76@��k(IC��Y�Uc�ًP�C��Y�M�f>�Z���E�x�(k�Н����LLf����ϐ?ip�K����c^�K�M��&�}"8 !�җeC��ͭV�<־�v|�ܴ�7��J��x���K
�0��}N�� y5ɀ��]�Q<@3X0miG�o�n?��D�}4�e5��.g��T� �֪!#���2$�`�nKJv@���u�"���t)"��9-���Qަ�7Y�a�����_���R[p�`��)��(Sk3����\c���|���WQG+�x���Kj�0�:E��d},A��bv!>��n1"�4X�8�}D�x�z�Pr(}Rz6& ф�:���tJS�Lh�xă*Ig��(�ͭ��y#�P��s�d�	=Z-�'���Uxo�����;]*��h�ad<I%�X[)�������;��<Ohέ�7X2��S�\? �
^��j��v��.~xhX��x���MJ1�}NQ{A�ە� �a<A:���I"ݥ����}��hkIc+�]�����l�1xO�d�5��X��S�ق����}s���͙�l����XL¦򻼬���t]c���.�/<I�
��H�%�)m�N�UYct���+f��ίq��d>��k�����Rs�x���IN1�~Eߑ���&��/��Kc{b;@~O�x�Rաfgom��lKԛIa3j]WP�ը��L$))q��u�s�2dBBN��aI��M
e��l�1��6?Z��ɟ\�Ҋ�����\�Χ����M/���'$DZ)yN�g.^�7�<F��P�����j=�������6����c0�}��Zk�x���;�� ОSL)6H�j���$c�@��O�\`�W�ј�<yTZd�N[�nFF\H'cR`i��b���&f��c���|�1)4�-I��	����8�i�-�v�ӵ^�3o�?��[0��X�(��<�i1p�JJ�֒�����3��|�ۙ7(���Ž��j#����!^T-�x���Mj1@�O�]������
�	dYn2��Qr��=BW>x2�!4LŦ�$J��T4�B���se��jf�v��\n�
b�1k��	5��Բ$r��j�‡�Ƅ/�'w�������e�ʝ�;�'�}�9X'm�V4�m���R+��m�~L�ut�o�
�7��0y�#qU/"oT{�x���KJ1�}NQ{A��t�\�s�9A>��@�3tJ��"^��'3���„�P���j�Yl��]����R�zăw�YR弆XH{ͩ0W�.�%0��hQ����Ÿ��e��#^�/�J�i���d�u֑��轉�^�_W~l13L.���st��+��>���3l�ֲ��/P�x���[J1�����2�t���:��N9��m�
�����A>�T1�\M��W�Qˬr62imB�&j7<hg��$c�RT\H-WJP�uh-�ln謬��:�bz��s�,x[�����P&Yoݹ/RI)��3�3�k����ϺoP���������ܗ��NRY�x���[j�0@��b�E��aA(�A�]@�c&�V�'�k
]@~/�+����kt�!��#;�YO>v(a�h�=
ZL��y�(�|8F�s��0�(Gv�"���C�}��ГV��K>���/|H[��V�w0��8'm�V�/K�W���?W�O�U�J�7I�B�Sۀ�z��}�~��Whl$�/[U$�x���[J�0���S���tI���tH�t�q��=�rH�e..�t�)�_��!
-b�JZg��t��)%7cl�D
�I/�Q!��T�*���ף�'�FǞNt���uO.
�FR��j/��W!������g���ۧ���"��/�����
P-ty��z��c^A�n��hOL����<��"Y[�x���;!�~O1��~˒���g`P�����^���+�f �(���ц#g�2GE�,��-�yz��&�q�:��Y%�"Zs�Jq,F3��q��\���H��ы`�?�����Ʋe��-�3�A�}��k�?�t�R�F�\j+}�$�����G��
x���=
1@�>�H/H�$���h�&�Yv�!����
�k^�i��
��� }�}Iz�	3p(P}$�R�Y-��9� %e����N���C���S���Kc���s�7٣���T��EO�:�Jv�s��iU�j��ˮ���$�Ao�x���K
1�}O�� I��Dq��N�#5
zz�
.��i�Q(:�r
B�����q��W;�P;�̍�,
1K����)`�@�&���=&WB,hK6������*/p~_�Ű��:�e��"�r�G3l�"����*Ts�>&V���M��2���;G9�x���An� �b�*`��TE�ǪoX�%F�!����~����`��5f*&{��
�6<aH!/u���dՍ7�)c2�l�Ȓ.��,� .!�uS�9E��}������υ�/�G�R�|���r��M6h��I[��ܷ���?V�A��o7�W���쐹�q���a�Fg��:�+��Q�_ޘTF�x���AN�0�y��H��u�DB!8��q�B��\W+x=,O�6s��P
�0��d�0�2��<��p��ݕT����/#s�Tx1bb�B�a��+9t��Ӗ��L޿?��Q�l�>or�bO�
	C&��O�۾�f�Խ4�v��F�F���'z�(�v�E�U�c���as?,�T�x���M
�0@�}N�� �$�$ �`�"`&�b��BOo��˷�x���^�h���M�ޡ3>������*2Um��:�R ���U��2����̠�U�s�m�4���Ao�;�ա#?e;I�k�_�֣�0F�y�Z��nKGU�=�έ���A��x������0E����2M'	7o��d�LhѴ�7�ԯ����]��&}�z'R8B�(�!eK�{_p��s�Y!��䰋!�;�g�E�w.ڒ�|��Œ
?t\���3��W~1d['�j��~=B��Cga�Ѥ��IU�@�/kAnR7ՙ�����#�"[/֏ܛ��i>�Qחx���M
�0@�}N1{A�Dq���)-ڤ����W���1�u6��g�&��a4�7�;BV+6.>���){B����4q�"F�>d�
.����}�u�y�/,G0��Ѻ^'�i����,��Aչ�'7�	[��9Ê2m0�PW�k����L~�x���K
�0@�9�셒&�|@čK����m#5
zz?Gp���VH�.9���d�gD�"{G�ՕVY31z�#[-S_\�6y�9��g�Eѽ��
����ׅ�[�Ҿ�s��[���!z�6�h�J��5�#U��In0ԉ?�qi��Ro��Im�
x���1B!НS����P 1�EW�P���7�zz���d2k�L�9p2��P�G5 &�#R���'M�+�����l�R�PZnT�I��XP�Kn�ԧYh���No�{��(K����6��G��z@���E�����N"˸�/�rC!�x���;
1�>�H/H2�&Dl�-�g&3�a7�zz�
��xm��FH��]90@V���j��V5��*S�%gb���SJ!�(�%��;���ϫ�����~�F{���m�!�I��Pbץ��9p��<�Ck�G5�~h�-�bux�f��F}�x���A
�0�{^�wA�l�iA�"�D߰I�X���x�׋_�8��E$hC�1~�l��cj�F��K�x'�ZVO.�T�ΌMJ,2R<r&2Y�욜�AC�_���K���;�v�ӡNs|�v�����&�h��J�<O��Uu9���]��|�4A��x���K
�0�}N�� �L>SQ�K0Ig�h?���ӋWp���"Z��
�U�%�0:�=�&PfL��«LՖ��2If�{lSRR�B.���JQ��W�ϫ��“�|�f���u�S��Խu���nhS�qj�?��-=W���x:w��DB��x���;�0�=���q�ZB����8�#*hZ�a(�G\��
�7 L���8:D�`�ι$��`�[CP����1G*�\�b�8��
Q���d$_�Q�?�ז������$?]�4Ǘ��3G�`��A[�UZ�y�]���	��<%X�?6�TDp�x���Aj1�z��F#i$/��K.����<&"�RЎ��#��j���!��_�#gwq.qq��
�%"���懇4�YF�H�%�,c&Jκ��L'Z+��M����Q����7�^�޵ny�C}�K ��=�Xg�)}۪�<���\��|ݫ
Զ+��\�Y�����>�����2���ko���S�x���Aj1�~��bk-{JI��7Ȓ�.���q
��|!�a����l�iɲ.AfZW�y�k��(L�D��w��MBFIı %�PJ��B��:�����ԅ+�������t�^.�Zm�C����/��ţ�Nھoc��;��Gk����uk�
�Wu�t�HØx���Mj�0��:��A#�J�&�,z��4�"�\�	�9}�+t�|�{�2��Ɣ�d���5Pu�Kty�N�K+w�.y�(�*f;�їX�b�G[�Q�F�S~�nk����v�O>ӗ�y���Y��?Y�Z�h��2�M�����}�Z@۠// 8�6>Γp��m���K�x���AN�0�y��Hȉ�t+�8�7vD�M�Z�Dy=���flW�y"����GI!V�)�)T��٧,��x�aP|ɌK��LZ9�R�BTcJ� ��E���n���{�?7>^��^��e��vOs��<a@te뽙�?R�v������zB�=���m�T@�M�Ѷq�_�N��x���Aj�0F�N1�B��dقR�E�=�X�MMm�(Hr��W��}�g�5�/K��kՐdĔr��ӅYf��hF�(Y%�	(���%��x�0ʂj89�����m�ֻ��t�u�7�6�;I��s���{fW�}_��՝k%����v1�6t���F��x���MJ1��9E�\�T~�"n\�����a�3CR"�������}�d0Cvh\1�]�M
>�X��b���1h���
��j�&�|6�j�R*�&W�Xh�$���o��x�:��^� x�{{�����:�jo��F�U��{�L�G���`���^�f�ќ��<����<��e;���RG�x���;�0�=���8i	!f.�8�Zџ�0��#����ת*�T��)�R���b����%�tR������\um��znjJd��HT�e��Ż�]qJ9~�q�p��+<>/>.�ӭMK���j�BG�Y$�Nh�l�2��T��e�*�i>`�e�
;��|��I�x���AN�0E�>ŬA
��Nb	!$�5���=?�jcG�,���^��{�{�4i�dy�4z?#�&h��yNvQFg6�ȍ!�ǻ�<��)���Fe{?�mߥҡ&��y��.������2��6����@�<0�T�������TEA�}]J�_>J�)W�&�"'P+4t�{2MA�x���j1��{�b�c��$;IVD,��">�$;�EwWB<�O�
���
��1�As�Q(�W�]gS���J��=�K?v�Q8��<E-'���C	�Y]�Q�<�u�0�,�~o�#�ӗm��]?m{ <zK�����<O����
�H[�<Fi
���=�?�C��x���1n�0��]��ޠ�,����H��9-��[.fHO�
�xϺ�c��ǑT˔5#�DT5)Vﳸ_��&Q�b.CҠ��,��˜�ĊS��8~����np����$o�m^�E>���p$$1�DW�u���Sw��	�.lr�*��������w��xO�x���M
�0@�}N�� ��IAD�=�$�bi�J��zz<��6o��,-��Ҩ3��1�H{��b�Q���N�k�h�9��M��`P*��A�H�Q� ��ok������k��䁿w�S��+��T=8ﬕ;0"��L��?��8�,[Y�:so�B��x���1!@ўSLob��%1Fk�0�7��Y��ӫ�0��/^_E Y����c,%_���ƻ,�M����*����J��5&o�K��jt�JȚ?���pZW8���d��}��M�U����#�a��Jm����_�?��:���{�	�7ȂC��x���;!��SЛ��$�ha�x�	b��wM<��Ӫ�&�
L�,�L�"a`�1H��[��Zr��i�h\�̌���G�k���J��S��.sէJy��-����W�6�x��$m��
=�ޅ�7`��8�&����:2�/�C��'���FT�x���
�0@�{�� �n�VB�K�aR#"h"E�@a!C���k��ˀ�u����s��� #�G���!Qpr�Km0�$^�*��~x�_m��<q�#!l�]�˒���K�,7�M�]�7��	x��A
�0�{^�w�l��� ūW}A�ٔH�J����m�5>�MO&��w9%�6�I�6����fȉ�)��hm���0á;��Ǚ7x��}m1�e�����+w�ڞ{��N���-EJ��q尳��?.X�x��]� �wN�H
cc<���vu��a\�����ktV	bGi(ޱ���(匞��q쌾��j��h�`w�Y�q�\UvY��*�MW8��8�\�!v=��ǘ�G4��(.�x��K
�@��"��:B�n\�1�b��"A��oݽ�Oa���H9�<�#����3��
��ی���#�k���	vg�œ�l�oLܿ/:�r�s�b�\tɷ"�=�1?��%8�x��K
�@��"{aH:g@�מ!�R��� ��Kw��b �\k�P)�Dã%�L��p&�9u-�"��Q�u�'s�#|��G��	/p��xg�豫Ms{�_�z��t%a�D�
%s�x���
�0�{�"w�$f�-�x��3$5S���|z��}Yu�bXQ�ĥ��4�*���SF�gJ�q�}5��4�\�R�H��U���{�.p�c7'�X�ͯ@c�3�	1�?&i�x�-�M
�0@�}N1{!��)�x�z�$���i�N�^w�o�Z�s�Rp=c�9p��S�J�1;��.M�T�~2�V�"J�i��7g~�M���Vs�e��,5?X�, g���#�		Q�����)F�x�-�A
�0@�}N1{!L�I���g�$�L��F�X����o�ƓB��X�v��S)!S��>J�(����S�uQ�i����ߜ�	W�W����K78n?8�R���zG}�ȏDp@�h��*�x�-�A
1@�}O��P�jD<�����0b���o/���[�.7-RHu�ӠY2c�u�%��\�r%����[��Ya%��9�.���p�M��8,?8���~V;1�}$D��u)��x�-�M
�0@�}N1{��4���g�$uR*�)v,x{Q�=��k�.��!ژ,	���a�oP���,�ZB��U`l��j4M�S�}s�'\UvY��jN/���s���3{�H����(�x��M
�0@�}N1{!L�i��7�=C~&�jZ)�PO�ݽo���@��{_*u��VJ�p�.��2!���o���6��8��Y���d�ۖ���3�.r�sK/���������1?�%��x�5�A
�0@�}N1{!dL&iA�3�	2qR*�;��(�����|��0R�c.�'A!	���c��*<TOC$���!Pzk��lh�E��$O��l���7�/]��s��E�H.�(z�9t��8�*?�x�%�A
�0E�9�셐L����g�L��TLS�X�Z���[���]�0���|t%s�>���b�Ѕ���,�[���Vo�Ↄ<᪲��V�t���gkz��DO��Y ع�'>n�(��x�-�K
�0@�9���I�N"��� ��TL#vZ�~�o�Z�IV���0d�%d.	N�} ���(GF_��j��h�`GK���$O����j���pZ�sMw������C�C�����
��)�x�-�K
�0@�9�셐��$ ���t,�;��|��[�^oL���J�F>�T�@.�j0���������@��I��6�Q�WG~�Ex�ν���/�dj��zf9�EL9:"�����7��) �x��K
�0�}N1{��f�)��q���I��F�A�����k�SX�G��8�B�$��A�s�%f��%�?�j��(M��;�IV��L<~/�	.r�s��-�W�ѧ����=[k�Ҡʶ�$��M*��x��M� @�=���	��%1ƍk�0��
�����k��{mzp���ӞB�!7�HL�A��~�O��[)K�2|i%̼�m�T�}�Np��})Ӌe�~����A�ᤌRB����2���)��x�-�K
�0@�9���4�Ϡ'H�TL#v,x{?�V��x=_�(��21�B���2��,�r%�1V	���]���&5�FXђ
_�g�Uf8���S�/�pԩ��Y�H��#��c��7��)B�x��K
�0�}N1{!��Hq��3L�i��V� ��Kw�m��U���'��$�SK�bd�eW�������P��QB3|�:��y��^i���E����d���ze���b
�.�����&��x��1
�0w�B{�H�bR(�K�JH['%�B�:7��Z^*HT�H�,�������Cq3���������,O�#�z�<7��;�nz���Z>��;��)�#�sr(%�x�-�K� @��b�&�X���i��x{?�^��-|��P]��%�P{�JD�<�D����]�.�Oj����%�:�.*��p^:���pX�S��Y�HH1�c��s��?��*#�x�-�A
�0@�}N1{!̄�M@�3�	&�X*�)v,x{�t�y���S��K(N�b΁
3v��!����wȭ�I��Yo韣�᮲��Vt���U��^bg��w�Þ���1���))��x�-�K
�0��}N1{!���D<�� ��TL#v,x{Q�|��W�j|��딢a�����Dt-P��9Q+J��:z_DI�a'���O�
��e�_��q��Y�^�W���m���	Q���z�(��x�-�K� @��b�&�)���0�M��ƎM����V/o�z�1	؄h�%�%�P�+��
��r��.)y-�[�DIaC����o<ù�����a���L��Y�,G@�ݐ�1zؙJ�o�-)i�x�-�M
�0@�}N1{!L~&� ��I:)�;��(���|�"`9TLy0ц:�T��	)��WW�г���Pzk�(I�F��ߜ�	7�����K68m?�����rC�0:8�AT���)��x�-�K
�0��}N1{!L�<Z�z�L2�b�N�^w?���t�,`�����ZzWȕlkB
C)	'�������v%i��h��7g~�Yx��z������{���4���0:�-�R����)8�x�-�K
�0��}N1{!�$i���g��1�b�N�^w?���&Ea����3'�;L���K��&��)PzkW5�f����9��*�<��[N�.�_~p�w]/�f9
��1�;t��k(��x��R(I�(�M,-���J��������I�*�����דX�x�340031Q�,..M�/I�-�I,I��Ma�s�]ʤӶ�oo�3F�^~#7��E�9x�mRMo�0��Wpȥ-:�n�C3�%Cl�ahd���ʢ&Qn��G�ɐ5��_�{|����\5�9"�R�{�h��!8�q�X\����^�
Pq@�?��t�1*���V��Tf�'!��ᑤQN����Zf��{ſ�z���u7���P?
N1�K���H ����M{L*�H9��#�V����b��yD�q�b�=�Ph�M:�T�D�U�N�����l�x�Sd�{�T�
�."��:�q!d��D�H+���NK��GeD��0��֘t�-έЏ6���bp����5}}�È1�NO�(�FfC�+;l�3ŧ�7�r��!��gh饁WL��#ş�d��:��d�I%
I4��������:6m�8��[L�qjf�?ewd@!�����	4eg�-�IC(kx	��H��u����P��F�\r��������[t8�n��v��������L��2(��?�ǹ�b0W��mx��˾���FW�kB�{fIIj�BrFb����j"�y
%�
���9�y�
9��%
O_bb�յ��kFx�[ž���Fq#�Jf!�x�[�>���FQW�KYYy��RF]];.g�A�՛K����`�x��/K�K�/���O����K��I-�ONL�H��/�)M��+���>���x�Y�r��}�WL�,o	�U��|����<�R"ɱ@v��������\I�Y�)b��O7n�z�ۻ/���;;��RV$�8_�L/��id�H+ʕ��Ln��OXq1��"�SaeRU��B�})R��3��^g'6�X�s��Z,e�w�j�mD,l!�P���R,�(�X�ea�����\U�N��W?�^gq�uf�����L^ᙵ*�v��خ���O���wV�UlWRd���\�[)sQn�W�4E��ȫM��ſN�?���~�KF����w{��׏z×g�7q��2����2�2q�ׅ�҈"N��%�Q���R���k�{8�
�y��R�V�^���VE�M���T�N<�OF���Z6��(J2䈈ͲZK���`|����e�C���i\J�����&+��g���v���2�g�o�(�n�׸���S��N�~K'�&�*�u���j����+��&O����v�IM�"��Rp\��/
��\s�O2x�g�߫R|���l*&N�8v2h9��f]�K@�\TV�K�*�h�u/|<���
|X�R��KX�H�I�FlY�SJ��R�vR��F4��d�ފ\���H`�*�Q��VX]�D^2��P��pNw�U��0})b�D]P�[@���Up)�T
��ӿ߹�AOH3�%���K�+�,��t�7��RY��BW�U�zq��T��=9�S~2;�������'(W�b�y�8o�2�p������;x��n�6�\�b����f�m�ޗ/ xx���vq�W��Ŝ�Q��H�|�0�-���=~�K�f��k{py�{�Q�}�*��ݓP���1��ק�0"a>�C�Qw��a
l�5��	�5�XeH�y0!-N����WA�~��_A\�ƅ�[Y�B�cV�M&'��m����F����y	@!?2pR�	�D�8Y�I�G/�ZD
2�:�3e˃����_>\���I����z�!j�`�(4�BәA��I]e�JH���ԙ�S3�	q夲�^3 19��<�&@��z���Z67o�x�N#_)/bk��!Y�Q��|��=�`�Y0��è�v�'���.t��+խ1h��:I��v�F�z��e��2�Y���!�B���4��Dl�e��TIY�4��_�� m��FQ�
\Ҩ�̢h��d�3J�F��;��s�
p/sT%���ُ��4�S��R����4a��G��05�,=#�%�����T��	��4
;��O��!D��ޯ�<:���� �%����@/�]_�Da�%�'��!�Z=A������T��GN)D)�s��{�ѝ�K�{A�E׹�!r,%܇����D:�0�� ��d�L�38$d-�T!�ɩL#T�Q䒋�Lp�&���h��h��γ����
ŞW�9�la�4���OSt���-����Vp��w�a7����@"�?D�ێ4T���'>+LY�=/X�{�o}�^ɬ�|㊛hl�4w�[3�p�*6)E΁j��エ�n�u�d�Ϸ�E���a���\���d�4`o��B
�����G&|s�g�C�!w�� �I�i�t�B�…��.c�������!'Ǒ���leUt�9+Hr�﾿���6�(�#ڸ�b|��["�y�>��H1���.<)&'��]#��&9H���+A�`� ��eP�(�gɏ��F�ӪZT�]]3��3����R���a��O8�����{2�A:-@	�Wru�q
Rja.�=��.�O`�"�����4��?$W��\���sЈ2�p����/���$�;2�w��-�W
�)E�%��q�N��k���:X��퇿a��?^�؏IP�=H"����#?�C;6p3�S\��®Ͷ;b*K���F�GW�ps����"G��F&��LW���(]g�
�K`oA�7����0[0~6�~�|��+��
L]����:�ϜR%U��/"?k���C�
��
Ԡ�o,Ni����5gOC�@V��Т���nPG��Pc��l
y�C.�K�
R�R���<<����a��)c�����6	��c�~�Jb�"	1���%�.�ㆿ�d������
���o�Fׁe�*���.l4m��5O��=AД�����W����[�$�B�xT({l��a�g�57�N_
R���FR��^	e�xx?��B����s+�ZӰ�M�UC�E4��9#�ۛ7�ޒ�d����J�*��̩:R��y~�;��(��g�T`�\�t��L�~���ZY`"A(x�<O�pվ޸�җ]�ub1�z|h�W$5և�:Fi��MhiRϩ���@:V��56{��@O���n��9?�w���̚��8(���ށ�9�m5s�;蚟�w�S�)�����
<{���Sh
�-�ӻ�q�ʪ],�'��oJR�+�`� ~�eo�r��o�3:�O~w���	MAƀ�͎1�����`.M��0J�$���v|�Ł~3Yp��
in<�1�E/^"��99��MQd*q����F�|3�+��ĝ�]�X�`�S1�o.�n��7��1��G�;6��1ݽ
���A�\�E4|��h�
�q��ƃ�u�"��`ƹ��x���`��
H�%�DZ�� �SS�I`��q��ny�^`"�9-�94G�TG��.W~'���&3N8?��J�k�2���~��7|����ow�>�f8��3R?���p�0�R�Au�A����E�
�:押&��#]��V�qx�m�Kh�@�ik������€Bm1��Gݔ"֊�>hm}TK6�mC��:ɮ���oE����'AEE�q��ѳ'Q�o�[Q7�_f�����I�<~<_�#�"����nT�HW�����&5����~ݶt��qt�$�ר�����U�ߢ!Nu�Nmݷ��xyǶ�YOVEQ�Y�X5�9���Q����FF�{�g-2��s�#�%I��"D&K��6;Ft��3��:inR�M��H���'�_ܙQ��8t�u�Y9):�i��>�q
�95|b�"�r(��v�v���=��\C+!����� ]�@7Q{�=�b�Q%��T�,�[b�ª�)Ұ<�r��NO�|j����Vǩ#����ԅg�Jr���r2�IM[r���Q�D�C3Ԙ%c�c$K�I*m2�{.���O�E�:��}�Z�����n�#�%������'�`z<�W*4Eq��Q[1�J�Ӕ�[�q=1��0t���)39��J�� NĖ�����Z�b�b��r�@y
`��P~��8|��&�Y��e���J<�|�-��U9�|���2pf�9�j�y��ʌ���-n2�l��ƪ�@��+���R��Z������e�m���V3��+56�f0Z+'�~�Jѹ���X���%~��m�t=������kT���;�7��#�i��c� ������@E�T��&�v�	 �*[{�{�׭���ݲu��MZ�ڶ�����o~�[;�w;��KG\�*�	l	�1�YP�}�kCr�@�[�#$;�Ɉ+��a�p2�וq-��m���f�
�~^��Mx�[��{C
���������������&�h)�eV��(�h]���T��Ԥ���ݔ�"��<��̒T���ĒT�heC#���M''pjrqi)���6�5��ftN~�BZ~Qnb�Bb^�BAbIF1H@�� 19#U�,#���x������F[kCCS���
���,��83?O!�47)�hs	�%��De��Dx�[��gC
c��������������&�h)8����(�h/_���xg�`�x_W�Լ�̢���Լ��Ģ�Ĥ�T�heC��y�&q��hn.a�S�Ap�x�E�!�0P�)*�l�C�	b���t|�Ώ"��7	�ʤ6���y�-�;h��Ҥ88Z]�dv��o���bu��\D��k�%+�5/��&��x��[ێ���ߧ�M� �comz�&Nj��:�rD���Ru�\Y��kh_.O��?�pHQk7����?���˵��~6������]���ц�|W�������]��ݺ��*�g|�o���w}p�����{sS�?k�XYS�+�5��5�i+�����zן�~o����6��:���=~�� 4�vM �	���@�6�{��O&�;B�����`�`���u	2�O��Ƿ!V�n[���+7����&�5B�ф��CkB5aͿ�>#|?Ex�9����r��\AN����C����V�p ����">��!�������{H�6�l:<�@����m\_�Z3��l=�f�*|���_�&�	�w�q[W��+p+Vm"�\�C�]u�A4�����2K�`��� �#�N���-T�1�4>�F.)�̝�S9����X�|�:�����*~!�?C��Mq��p�)�Ѹ�=t�
�toÁY����ђ	YZ�gU�� ¾2m�K�Lt�;������K�����ÃX��]H�!Őߚ��c���T�#.�M�.Xω�.w�ud�
e�haT�J`n���q-P]d�,z�?
zŠKo������?���q����<�Jw���{R�]0]�Njs0�a8T�C�P�I�װb��ި1��M�N���8l���(�y��!Wf�6�`"��G{f��Ld����5��%�+ܭo[�_��ƺA�w�z R6-����i�H`�&�ھ�wz��ơ@*!@d�f?m��VgOA���D.��	�?�7�q�8�§��ώr��#�q�.鴇���z&p����YW��k�Z�d���C`Q��b�J�t�KoG�*��Z�qd��măl��
U���9�?�HBl��Fض���n-�dXѐb�M���r�,���-;3f[���<�Ͼ����m���8�V�������mgLj�>�2�O��[����/Ɠ��'~vF]���;9-9W-y�
��#v���x�E�}A�X��{�n��$/����IN��R�[<*�(q\�u~�8�i�h?�P;Қ�R�rqʓ;��<�ȣ�h�!Y1�IbJj�[2�R�j�2]�1���hp��~<�U�gpMΧ!=KH	n͊y|�'��\�5�lb
���6HK"=-?��#Ytfg)��Jh#�o6[q�<9R)@�ݬ(��ݑ<�)G�ۂaGH���?�T5���=�*��	�7�b(E�	�C��
,R�X}O�$��7�yIe������\�� r' I���ɑ3	�l��l�]���{f?@1�{̆R�)��C��2�=�(\-�^�>�)��V�V�=���1�c�S�,-nh����o�!�ŝIQ�5�m9g�7Z[q�=��tl=R8�g�5���y
�\�L�D��Y�'A_<����qE�g�s��N"cև;���0��Fr=��2�,`L�ϱ�Z���/��|
$`v��[J#��O��͊r9@�s�^��8�q�<�F$`+p.jN6߲�<���|'>(LKZNfC�UP�,Nݓ奄"\6��}
5�u�f+ߵ�:��s����>�v0.=E�<�wrHQ)�8[�FN��L�M�#���X��$�컔���O4@Z�[$W�(,$
�]P���"[
�5E[�9梲��;�����-GI���rh ��n݊\�4*8W��B�z��ԕ���j�έ��)W�IY���[xZ{�1{���e`js���z�w䜔p!p'fbP�t�}廬�v���R
J�K�TU���GrR��1������4x��ȏ�9��w��xJI)�{h�Y89o�Tr�"�����}�b�F�>|��$��J<����
5�R�C�0B����{���it2����)���l�)�&�n���ԙ/W�~K�����	��`�o��Ȫ{a�w��s-TD��"��bٯ�X8�G��Jxa�d��v���:�(�$�'�Ö2&��Z�
�j0�pY���vI������.�>(������R�)�∫�=�/ה�����Y����V'��n�X�5�h�M�F?"�����Ww���a��"�����%��^�=T�9\�C�tY]p��)	�'E�G�t�rA_RC�5�CR=Qᤘ�B�jfO-y��6g*��)�1]:�$G���s?�ȿ)Z���I�?
}t�O��R��z��T��k��.�;�C��K�g����)wq�u�
uV`ݤEW����%��p�L���7�[�(�Q�#I{3߽Ѐ��o.�Y�S%��=b���=��ޮ�4'��c�povc���%�
ޣ�F��p�	�O���q��	1-��s��b"b�����S�!�kG�/'F��jʵ��SR��gp�rbm�-��̊��7���9��b��e��/#^�ד0[T�<��;�dO�LY�,
Rr�Q蹸bJ&Y�/�{�z�����_����S~&f�;"�*�:9�nJ�,R��A\����r�i�3�J�C�YݬK�ʍ�-Yw'���ct�Pz6�Yi7�0_Z�0��7��$�~ʨj=�U�8J�/�Rů�@�����܃�~�߬p��[�@͈�7Ə�(}��8�Z�x�^���`+��5k��\��8�]�T\Ss�<���
�Sի$�q
��lG�X�1�܁�	3��JJC��8��c��3�~�Wi���^3�i0��ں�"#��//ѧ�T�M)���q2H&؜��Ο:$r���r��lGF�J��d\����'�ܕ�=5�q�x�||���Z6�u��8��#����QO���D�j�.�Q~b��зȼ�����������؟+6voڭ�M���WY���H���G)�&�v�ukM�NA'�BuG䏔���N�*�k�тc^��S��E����X0-]���n��1�梣7+'�OI�7 <��1�k_��4]2;&�-;^��UԜ��[�s�Cp�q����T�t-*�9V};0��� Y���nhNJ�
5Hԣ�1.�Q�x���b"r�"S�N���ά���7�cנ���
�4
):׹	oNW��~̓�yh����l��x�2VM�FɤJm��J�ÍQ�n@��(G�\�[SK�����a.kI��m��2��W���4|�N5�/%��5�QF���2P��(����޿�i���^�~f�A�s����fknjB렵���y5�Ϩk����f���a\k>J��ێ�}{E��M��R�T9�mo9�h�!�]�����#pe[j��:	��"s�5oZnk�(�� d�4�@�͑x�ѭ��+�'JP��:+�U|��T��DE��������nO���g�U�L�����:'݂/?�su[
���Ìߘ��:>��ޥFD�>ſD���s�	�(XR�H7��l|�`MW	�9��,;_���b2Ű!�Ϯ�Ԕ^�nQ�6ױ9�c�,g7Y�G����c?�I�����K�Y���-�)�������6m��E�4E�qN � �v֎Sc�U0��L�`�O�Z�{��!��L�GԐ@p���9S��5���FZS�Y5%M!G��UB�\�Y_50��}N+L)��,�ż�rŝ����Ntܛ��`�)�K~��*�ѧN!����<�� Z�/y3$�ߜtIu[�'�'"�O�gp;���c��X��hZ״�r&Ŗ�*7���G���M�D�p#�F��/�˗�6�\�x�Z��,�sѿ��8����!;��b��V��i^�m��k8�@�7�:�9��XE/:��G�ת��D�73yB˕bc))P�t��A��z�ޅ��5��=^�L
�JD&�����ʛ5��'�-�)���S�z
ü�B���y�kim�eb���.�i�)�-��$-.�mE�g8�ܦKr�Y2��G�B��>�˝L"��*eI���u�4� w�ߘ&�i�\��ȼY&�z@Dܿ5Q�:N�G�_��s��m*$X��c��p��B�0�'�W�X3Ӫ���Z
�ݡ��)�j��x����JʹF��i�'����,�g�-y���"��KV��L+J�WQ�q[��a-#AB�) I�1��i2�ʀrT��M2�E�LG	���K�����3�y�P꺖�]��Sk���Bi��%�Z}�j��zݏ���B�_��V"�p��bB�jxҮ�8ii�Sb�՝��㦱����"ډ��Z�&)��#e��#N�)1�����$���:��g��y�2%60/�6�	�5�\�DA}DV<eie�LҺz��D��+�c�;�Ov�
J�j5��ǡQb�ě?��̊m���r�,m��i�ҁ�&����riP1�>)��PO�K2�i�����9�'&."��#y6*d�ښ�ǻ��K��-6e��ђ��aIy�3	������3�I�[�{��|��g�	��B��FɆ7}��Q�B�eB(����"�1����
'S�� ^+G�Y�Q�i�>�P��@�V$}m�m�:�����m���Y���Jt�f��gY��j�h\aB�5m�q�a߉&Bӆ��}�@�	x�`�퍼�1�r�ZB��IFWBdFɴ��\�E�콤z7��r^	�_@��)?�����i�A�ܴ,�e���NMn��"�'�
��7|����r1yC�+��#
��_�.WO:B�-�v[����QLHo�PԅFF���Æ�	�wI��t��&��8F����+�g�ł��B�|�l^�l\uZ������ru�h��+������]ZF�3|w#��lM6��t��K5Z��&K��ӊÍ�����2MS��Y�weӉr�kv��R��X*w�G��>7]n�꜖ʤy���!���:���ϕ0��r*L������اL3G���J������-W��戴������%�z��@p,�Y=�$%���dRa�mϺ��V���Ԟ�]{�Wx�N��b��~|�/���7����E�s)����K��Y�B��?~���A���a�W<����<� �̣�N���@J^4¤_�̂
u�n擟������
��No�|���]�Mo�#�F��_+M��N{~��uV3l�F�`��]��6M�M)��~��B��8�Q��_�;��&�j��>~�Z։��+^��ֱ���[����x�V]o�6|ׯ�&j>	
З�6v�ԭ����0%�NL)R%��勵���t>�u�냜]�������Ii|c��~�7ygV?91�˃,����V�`��tb��Z�dG��˲�FyŸ �.P-�R�N�Tnh�f�	��ŷ{����KRxI���
#V��&�]Rʄ�
��t8R-�Z�c�`ݟd
�)�ߑ05}��˜�*S�S��T	�W�`$E_��	+�]J�#Õ
M_rr�Ɏ׳u��N�B�*eM6�e�H7�EdeV ��,��g-���VږB����I�!�����v%����������X�8k�N�ɪ�Ԓ�u�q��m�!�`݆�E�Oo�~��M��Vk;�6�LO�t�jջx\DE�
��|IGy�,?>����}t+����,��W��'bAZm+��b�ƶ��S-]�h�w�u�8�{�o�w�BE2����(�y�X�"�Z� A�5H\�l�F�@‘hKh
䁚6r��GNQ ��a*�q�!�ް��X,<��K��\���w�}Z�[@��@z3�x	���y���QV�XW�PLH�짛�Gb�FhD`~%:f)z���3��{OF�[�Nx�>랼��9-D�*��b�b���7�a$c�%�8�@��؝	�n�4os���9��fH��h7E�Yt"4�\�P�_{(��}�-���'���h�|�Q.*Vً�Ca�"�{�=_!�E���u�#n򌑏JmWL���-»�lǶ�r����T��V>��R��m}]۪g�K����3'Wuy�)�s4�x5YE�{l˛��h�Z
g��0
Q�>�^�D�>���%]$���>�^m�
��8f"�d�.��pN�}�cdYZ�`l��`��!+x��6��)4,�&���r�5#x#�����P,nc�̳����t
K�&@�^Ւ}��|<��8=�|uz�>o�H��c_����`5��a����X#B�Q�C"�0Cz<<Y��&R�3Ua�'Y[bTG���Y�.���Jxc,����֯�77�g�'o�/���.�!O&��w);
NT���idǡ��nb[��������)?���+x#�枘�<�X~K�G�L1�߁I3��z8�G��4\Ż����������6.8�˾���<�p�����E��(~�3�������9��DO��%��Oj��0�4x��R�n1V
-����()Һ��J�h���꭪��w�5�z���m.�ĉj_�>C�}������I�cK�����s�|�k�NV�-v��^�;
�㇙���9��*�@���)	�y�TT`��
)�02/�I4g�_��ɝ$�2іw�ٻַ�)08���i��L�A�La$u�<LFN��ƌ
Pd[xRPi���a����x�����I�H�}�yA��NP�T���[���x4LLV�cݨ����Ecg?n}o������ܙ������!�`����8��3E��}��R9
�
l,-���oO���0�Gw�F�Є�_�����+j�c�u�Hml��UfH|MU#�H4�	
g����.0�r|�(�c������R���؀����C���mx)�����ڍ�֫w��7���2
����bv��?��?,:��Nx�k�,����1t2��d+f��5��K�ͣx�31��̜�b��W�6UTM7��R�Y_S��G������T!+??7'���Ɋ�7[�U�o���K�s�g�XZ�
x�340031QH��+��I�MNL�H�+�(�-)�a�Rp(i��9����5�#�[>��B4d����$����0�Y�U࿙����l����.>�ć��I����.�\��%W��J�XM�@�,#����A�MT��+*���,{������B`�� x�[ø�q��'{��~�llҳ1�e@ᦦ�^n�(
W��x�U[O�0~ϯ0R&�����Q$k���*r]�f�8�B���c�IZq{Z^Z߹�oGŦ��5I�t:��M��d���h:K�G�Ӌc� {���^^Lg�C#���l�9���(f�UR����>|�
=�b���*�үN�֙) k����8=a��"V'
��Z�-3-R�sAZ0Q�%3�߈s��k�#ovQ.e�ɺ̹�Tn^Z����f��\f"���g8\kU�i��N�9�q0�.�|q÷�ō�83�P	�Ҟ{����Z�R"]l7��ST[qq񦀫A;�.�`7�b�R��w�8ML_��/bs)�~���(��j%���Z��R�7͆�	�Q�Qy*r�V�i�A���I����
n���Jy&5�䱦�U�5eꊩo�r��%�%���Ҏ���`v����?���d0�����~r���*��`x:�������9���z��ƹ��"�2P����j eH�+�V�8�g'�[���K�#�=�k�����RTq�z�~̛��ݫ)+t�m�B,�w�b�M`};K�H�T���mp%LH�(�j�=�n�Q��0S�����ִ�Z�Xᛊ�0C��Ks��h�1l���c�C�<@u�:v�
�3��.@�>Z���fq����l]��Ψu���W����M�T�j+8U��On��t@Lq	^Q�,�z_�/pw~}4ѩ�:1]`��}!q&�}l��^X<PgJ�Jf��f>����{��R�X͊B�^oN�����`�5���ڌػ���~6C�}n<��x�[+���jc_�Q0�q��e�NB��%�
��*��\�\��%�U�R�KsJl���ssK��s�c����sRc b1Ή��VV�%�E���@CL@�XsM.d�|�Q̔s
J��S5`���Iѝ���Xu��BjEAN~J������j
r�dΔԴD��V\��2)p%�&f[s�rqM��$͞Z�Ytu`X��Hx�ke=��dc_�Q����������X����h���j�R���Pͥ��%�y��%�E�U�)��\�\Y�)�v�NxՔ]o�0��ǯ���H0ٱ����*����T!'q�G��-���g��V��IV|��>��c�遼���Ͼ���V�R�ƅ/"�c�K���|�y�D�łI����� �õ%Ϣ�qG�c!+^�YU�I��vB��(��;V�<;$,Y*u�7N���L�z�˷Y�W�����1Z�m�Kc�,�ԊE��_�K���T��
Ȭ���N@�ń3Ȝ ���汼�����I���M��dd\F*	���	 ��kbP�.F���q@�ǀ�U��e�??���RV��/�hv�b²x��w���#Q����O
��ݙJ{ͳ��.�������A�S34��#=}���O�Q#�p�-BDQ�)�A`��>��D8�e+��6C�
���=�Mᱧk�ㄝ�\P�S6?��҆�MtH9�c����Zz�2��	�$-0�B�f�&�rb�b����~�V�qXNb��o�7��ɪ�^��|�� �P
�?bx�h��O݃�2�˔��Ǹ<4�����.�=f�O�.�j_6~RBf���+x�U��N�P�&{]�0u$%�K{δ.��%�`�e/��
��|	H�{����e�f2�?�o櫰)l��KF���Z/Y����]>p�u�*�4` %1�t
iF/x��4��L�n�����r{�q��*%_�C�9���9*cljR��´�x�0SSC����hW���Y��� [���1� ��A���A�xz�p�K5SW��]īik��2�Ѹ��c<���_+y��SL���'�w�5�e���2��#�p�����Ǿ�9`�0�Z��@o'�֮Y�����5��:���B�^�8�HU��gaU!���
�\Bi���Rx�����c����7�}OLNd��lȤø9�Y���	I�(x�{�q�}�%��������R7P�P��V�d���X!�L���XX�����^x�{�y�c�%#����������X�
a�d�A�Z�T�2an�%U��dr�x�340031QH,HL�H�K��Kc�l�}�g\M���O:M,:��2=f����8�4ۨ����'����V�cs7��4Ti^zf^D��ԗ�-��۲���ڤFCoU�)�ٙ%՞?;~���Y���P��9/aV�pW��ɼ;������G�L<���ۆ:p���Vu�:��:3A�\�P��,�3���k�xu�AK�0����^�z�R�9�X=X�:���������m�Vc9����w�[�`��2�LV��}h���zHoA���Sm��wVr@���$����1�L����'Q�t��DƂiάc�ђ��l
��U�v�v��+�Aﵒ_�p��n~dU�����!2u��'_R :酡FȃT߸�)�1f���Uˁl�.[R)d�(��8w.f�\,rq���2�x~��lx�����eB KIjq��c�%W������%�(5�$��RA�H��.�%��y�
�y)���
n�99���>�y���*A�e�EE�)� �dPja)��Ĝ��"�ļ�����p�M\�v�dCF�s'�3�;#��x���r�e�:1UC�b���2���r=g�F�;B�'x�;��e�&gqqN|A~Q��DE��̒TՉ2�E��@�|Q�H����W�Z\��
a���)����A�HAu�]ϓ�ZT��������Ϩ���Z�:y�ļɷM�,!&3�j/��tx�{Ų�Y�&,���41�#��DA�J5��� � ��DՎk����K~rinj^IP~~��j�T�X'?q����;r��M�`����(�g��Y��\�_Ti��5���da&K~}$;���'��yx��ʼ�yC#{|jQQ~���TF=�������b���t��ܤ̼�.��̢������;.*�o��0x�{��e{|jQQ~��dv&#�������b���t��ܤ̼Ԕ��L�\jλ-x�uRKO1��+zؽx��G<H�1�	��A��4���6�M[j���"L�ɴ�}�L��A�@���V3m�����2Fb)�I{>�=s�J53�f�A�:k�c��U;e�AF	a1�G]��	>�LS���J�:J(�q-JԲ|ETn�r^2��c����{(J	uH=���@
C�&8�㔜��V�F�R1�r���|�U�P{{ �^$i�1N��vm�����hCK�%Q��z�;�-ܢ�n7��lO��ڊ��M�;���aҟ���N&3���Ԓ�
��:�z�O��3�8|��G�V�k��4~{�+�-�®�f��./�O4:���H��C~]�Է?_Rݳ�xx��U[o�0~ﯰ�D�"��ˊ��6�!u]բ=�e�xJl�>����s�P�R�����w9��0=g�>Av��hku.�@%5���i���Z�o80?f-����~Gl^?�ۊ�

:MZ$�Bn���/Tn��*�0@� �E\����
����@��HÐCR9�W��Tc�b��W>���˴�z��rKh�@^e���H�y��⬿N�J�<��� %̡q-^1��ܢK���J0,��Vɮ7��
!��2��I�9��ǿ��5*�ڶ
MP�@\��|j���-�(�R{(i�q�p�� �a~�~�$,cu�4��4ǵa�����7��$��J�H���1��Ӵq+贽���O�TS��532�v�+�-��+m��Fh�W�G�)	���<ef�\B�))��(D�F�������m9ڞ��v�ts��w�ߠ�u���
_nB%v�:h�QO�ٸ�����7�3�|��8Q�4��-��*�ǎгH3CQM3�n�dts�y�H,A,_��7�׃��������w��1�]o����L���פ2����B�V�^��n���.�4�ئ	����_w�N��C�cx�}SMO�0�^��%���>0K��,c�Йx#�]F�`��d���_��x�wX6�Z`���y������L��*���L�L�uw�Q��H���l���Ϛ�$qAr}@�,�����7U��F�7'�R̟��J�$�?��cҙ��7�v`�fQ�g�$�Y!��2M�$H"
D�8x�ڝ���J
�3��. �Y6�\lh­vO{0G���~��s���-<9Pr�^��Ya��L
�S�
��Ȳ�8�!9u�;\pS��YM_��pW#{��J!L�R_eua�2��D%T��j�GN'����B�!��kf��l�|v��݅^�O�*\��Be�,*c<��|`\c��N�89�7#�C��K��$d������7}+�(�_#6_�o|��@~��lx�}U[o�0~�p��)!�����)�D%A*�a�	V��v��S��g0,�6+2��|�J|L� ~��BL��'M�4tӄ0pi�+i�tc!�P̐2d�2p�^��{!�EV�W�$	�d�"Ы؇�›XHi���r*�<D�&G -���15>�U-
��""$!u�ۜ+LE�4I</e�C�a{�!ɗ"�J+�=����E�Dy�8�]z��'
 A�q,m<��l�#��Y��I��$,�V��[�e,�a��H��4@�j��Ks`;���tƓ�w}=p����A:��G[Xr��M��5mw�Lc8N��d����ȹ;߶\��ެ�����j�A��.�]ˮ֊&��Xk[K�j6��i�ѪQ��^5}�6-kţ��@ҧ��7/����x�?v[{��8G����[3��s�93��˼����J���Ӭ���|�#���gG\���V~��Z�l1��8D���
�#�k�#!>jn����/yñ��QW��Cʼ#vSH`T����V��p?)g�fJ9K�]?��y���VY���ko���'A0L!�l:wY9�����o+���Z��d�����hz�u���w��S�������;#�D�?�'+兵1x��mo�0�_;����T�����b��LHH�"'�.f�/�N���ݹ�k�ا���|����i�L�f
m�/^�k:�0�W�[��/�}a�Q�=���'O�i�\��8���K�*5B��<���}����&��Ab�G_��=(�;����pѕ��۝>�5Z��Q��̍��k囮L*Z���VZz"��qE���$�A��!�*��Qg+�-9��n����V���Tc��lq�_�_|*>�^�s�P,Et��p��PQg|8أc`�dY�q�џp�Z��+����]ّ��M�Mb$;O�d͔�����Ą�r�;�hj��o�.qI ���¥�X�rޅ�ˢ����NY����Ң���P;�������?1�;�6ٶ�6�a���
��a$���\�d��Ӈ���v���J����7x���6�mC##��Lƍ��3��sqf�)h�e�ƧVd�k�������hjrqNN`RR��L�)NU�P�XZ����Q���}���	Xx��ζ�}�0c}f��FYjQqf~^|r~nAbQ�F�G@|�kP������������:�a����U�ř�������Y�ԑ����P�ZX�Y�Z��X����X\�4Cj����|���<=׊̼̒t=%k�Q\@����5W��fAF6&�|-�)x}R;o�0�'�$��Թj�݀�$6�}��E��^?
UU/>�}�g3\#[;i���u�
O
ټ �`3�::b���
�'oﯧ��o�7N� ɤ�?��А�ܴ%
B�@e=�!���h�^�0�2�i`��A�'Td3�I:2��&�Ozr�������:�����M�FI�R����>� �]5���� ��rZ)��K�*��>��a��TI�4{z��$I��@#�/�}�W�׮*.��,;��K�t2?�=�����R��S����eL+�%E��ߵ�-S��8�l��鍝L�Ś�{��mg�oJ����Nx���:�u��F%F֒�����v��X���'�2e�	�*x���z�u�?������C�|JV
Jv��zfJ:�9�dU�L��t��@��27-?�R�217�$?Y�)���%��x��Z]o�6}ϯ��U��e�СC�mly)�v )��"�I����wIˊ-ˊ�$��&���ν����3~q�����ݠ/f�0�,�F�ȥ0�	�h�ВdT,5�l΍���)��d2.K�(
!���Gד�0
Ʃ�0�K#���L�J���)���[�O�	#C�111�M�U$?�ML��8�
�森q��SZR`�%+�����@ۿ]
VJZJs���0�q��v��/�l8vhL\� ���"�Nl�C�J۔HvP	>��t�\d�T�e[n�_@���`{Z�'���z���0�=��m����[�a5� lS���3�ӔrXh��b�N��CNL���h��0y+G�����r%Ʉ�w�߬:�Teֆ3�BVl�4�i0,��`�w��D�j^�Y����?��Yi�N���ρ�Yv�D�`��/�	E�K����%��(ϐ��V	�2$$��}oB�`�S/L�s��=n��1�>��`��Da�wCx3�R%�Y
�@�4[I��ڐ�uAZ�
��Ùg��b�t6�/�_lcz���s����s���g)��f��Ԧ�O��b���m���)\m�	�g����V�42(�<E�)�@�iVN�U�K���Ƶ�2�G^���;X����hO��/��Vqvm'4~/w��c/�Ѷ��.�ȫ=�_,����!�`[t��6H�ʵF�;:

�PD��	�8qI�&����qH��G"y��EP�oH-�:8����(tw>��AB�|�l߹Vd�?}��X������^V�?;7�N�W3����w�z��J�1ȑ
I2[��g�rA��B�G�B�)h�=���)Է�P�MI�:�tţ�E�ϝ}8%���tt��s����%�Q�ԁ_Q����$�'�L9+L�#!
Tu�6^@:�~|���O�hi�3�Ow]	��i�2�Y�<��V�߃����J\��L���Х#6����C�A<n't�1�v|���h���W�R�s�: ,�N��
cU�{�*�mʸ_y�!$.�8"�!��9�M<
���xd�8u�a����N5��`�w�#H��[Z����Y�
S�i{�cLq��櫇����'�c��G�q߲?��@5,�&ToB˽�.iԢ�SU�Fp��|����1'���$x�7�cX������:�CӎLϾ������s����y�t���� .w)a/&ވ`'#��K)rqHh�Slj����	p���
��ĝE�(W7��������ԩ��QQ�2^ ��	��oG�ufM&/�}	���iAwc�$L�*u��]�ޫ�0��3N/Q����nH�z,�l���w�b����E�:��X�\�v��>����Y�����}k��}\"�sy���,+���}�vu�oc���%*�P[gm�r�K�
�A�<"��� 	��0�q����&6�c�?+�J>���)�]Pi#˶Fwu��?h:�P�K��*޿&N`�Cqy����[b�<�Ji�z�(���>{'q$~
��p"~8W!����K����Ǿ7��^=��|w��eo��z#�dﺩ�ʬ���_�
��b`�t�i��[�+]���~l�(t�/g�U���ˑT�����٧���4S��x�;��o�.;������������F��
��د���	N�:-x����kAƉ�6��CH�M\�-�Ygwfgv��'O,ZTffwl�M��j��A�����\�J%o=x���D��ݴ�ҹ��>����^_~BwJ��K�8�����V���Ӓ	`	rt������vjfJ���C°͵�0��Q�]'����'��^f��Tvx���q�����P�Nyn�:�lG�UX�O��v�¦Z�7��B��h5M�f�b+���V�H�B�|
z�Q�3.�T��7c�f$z�I������4�eG~��VZ��j��蠾R�A�2V>���d��V�U4�O����?�zuD��#�w��|��a�\��N��d�!�Bd��`�mecΔ�%2�\ْb/`�\^?��>�n�|1�\��]<��`ޮc4os�a>!Q�ş=����R��て��c���Q$�\(Q���tjG���{���$cv�K��g�L�O�ܙ��
|˧a�{}��o���~��?��0��7j{�l/�c0.�w-j��7f��ΊXӭ;�� �I���q��$x�̺S� ͖Z�m۶]]��m۶�.ۮ.��mۺ�Ϝ�gz�<�Ǜ_<dFF�X{g|�W�pyYqX(,(XI	E`�|��5��X ��������&�V�j���[�:o$���p����q��bmp�T@	PD�@Da� $�� (��r��l��6쯼�6��;���ΰ'X��,/y��.`�;UED �~զQ`�ڐ��ۜk�g��!�'��95''c>�ǚ�2��?#�}=����_�焕b`��i{I�c
�+\�u����#��/��N�������ͽ����S�lv~鱧���+�%� 7�)l�����)`���KH�_��
�
��%
�����94d�}������S��$��e�D"�[ďNs�v���C��ƹ��D"H5N���#�7�M��C�����k��*n��3���3��N.$���=0W�/��wD
��:n�����v-��L��W�
���ďF�B�Y�܏����GxG{0��ȟ�,89�%�\���/��^�ki�k(�'=\�|=�?	�PH�8�Bs��8L#`N�ly�A!Jy�$pT��_mPB���Ͱ<i�*~����
�"�@��b�֏��! B�K���ǴGf�rK�!XD\�� ƌ瑀,dRD7w|%.�3�2��t]	��
��!x��@��N(ˋ����NB�[.Ҕk�?$/'Y*3��g"��<3dF����#�N���6�*�t�j���X� ����0�a4�K��9(}�ư�N�Z�"�i�C߰V}�����%H�W�PJ_`GQ�> ?ii�`fP<��V�$�a�eɾ�^�'ߺ��:i�b�����[c��1���7��M,�!���=��g^*.**m*�r�r�������K�!@�z��)H�� m!��I,$--tO�N�N3��s��X�XVY.Y$Y�X�Yb�����u��;�D�B�$aH���T�k��^����O�N�NR$%��%S���X�/�6�����O���N�O�1�1�1q0�0�1�0�0�����J0k��Gz'�������C�Cӣ�#Wb9S[�S^ȡ�#������y�#��2X��R���y3�2�5��X�S�!\\���!��d�c b�bb`e�di�������R���+��ؖ�؁[�\!\9�0���c�h�ݳ%��uu<7�;p;�Ƽ>�H���2ߵ��)߭��A�ƀ�����@\@�ApA@�AU�҂���V�t���X�����r"�D�DD-D�E����c"�����F���>g�$5�d�d���C�ڌN+�+�)�*>��
f�MɊ;I|���:#�$}�C`J�J�D�BJOvE�K���_�WWŐ�� ��&b��;�D�i6���>١���1"�[۷���|��S�z$�^��y���Y'#��R�`-!%b�Cd�ũ&��	h9)5*
��ֈ�9΅�N6����ŧp'�0d'��[�X ��VXTd�p�y���Q�Q�Q�Q���2IҊ2C�e��2�2�"�����d�����jA�N�@R��
)w*B*�*-���*�ʋ�VFV�V�+	V�V�+��su��Oc:�|�>�C��y��
�u���c�'y��+�àg�۳��WS���)k
B��1|v���׹7׷Ƿ"�\:���'�M����'gJ�
����%���O3��˾���V=�&z��`�Z��PLP�Ы��0]^����O1W����p�Ц0��p	��Q�ʰ����X�9�"��6���٧��v�'�9����p}�1R��73��&	,�-5�ُG�Nڣ�,[-;��e�j�w�O<���ij�u�y~.@�%��󚶛8���]=��h�9�,�l�j:oS*U�WJ�t�D�o�j�s�u/r���6������&��ή�
�Dv9T�7Q�b��(s{�|Y�$]'m%ݚv����PSG�l��Q�T�յ/�U5�;�J�Ug�t�}������R�H�i�h�y�=:��޲B���`b�1s0ks|�d�tԹ���GGװ��H�Ф����1����<wq/׮�<�H�Í�u�����xQ~�`�$]�D��Jg�
v"v)sl�;9y�s�w�}�����ԅ�Bb�}~tR�����+���p}�2{q����s��Z [ 7\9Lv���껴}y�{��rU�u������۟��̎G���X��~W7��M�\�uB<Ȝ��/w���m�~�S9x~�f:}�~���Ƨ�xkpf�>��:�S�{457�ڥ�;w��o=��ד��;�p1[a�s��:s�����wO�4�������Pƺ��t�x�����S���)z6>P<w�VUZ�_�֥�N��m�f�6���������s��ɇ��'��[�{��U�\�Rh^h(����� ����!�@\������@�>0�4\IcL�`[���1�4'[@X�\YXj~I��\ڬ���T��	:fYZcz�ڪ�Ҋ(Gw������5-��	�d$EX6�ZܯT�$�8�ċDSe	�,�%���:57J�boS��e>E�������F���F+�MV�-wM�N���m<�L��g���+��{QG�5���̺��:�_�=�/������iBJϲ�#ͥ�f��i�u���76����ÉT���cei����'��N1w9�ӹ������dY}�p�O�]�5�4�]<����3�W+Ԥ�GTߠǙ�����'�n���k���n�t�Ԯ<���M���jl6��hجY���\H��w�>�^:����T����L��i6lC������2.r���^Qn,��2��|�_����gIJ���˔I�ŚX��-���[9U��oC��҇�v�xv2n}��^ăN�M<$|�O�~��_I�={���T����u]�^Q�pzp�E�!�~x��j��}�~���Z��`�Ӳ.8�C��}
P<�f*���F>�m?x�FE�l?�T�&���؛��:)�j����Ae֕@1"����c����	+�gJ�J���Y���]��G����
QD��������N�D�I�@�&h#飣/k/f���?VkQ�qo�m�{Yq������5�v.���)T(���*kM�]�{Q�4W�Ƶ�v&����}Q�����]ܳ�7�R�?cY�y�P^|����ˣ�!�a���6���y��F�€�&rH�g�	U}�/�.�!�5�~�����@���`�ނ���O�G<Ca�HI������xK�����V����6d�G/�ozl�γ���5�Ú�}���TB�N$Ga�e��+�=Gh
2M�Ί�s��V�?��X6kk�>�L5O壺YͥR�
���W1W6<�ϥ���U�d��479DKC[Q�z��E��i��[��^f��sz�$�m��`��xȹ���|�ܱ�t.�L���MO�ˇ�fg��4[h���Jlq3LS�	�3I��h#X���pS������J�{B�F�y����>�&��h�Io
�U�|�\m�
9E6^\o�@�~Z1�!UiBi�	Q������
��e̕;��=���1�ξ���a��i]@�j�^7B�<��>]�QcQ��A�AnR�.��������x�T�d����8|;�eU�U�J���2Ue�
�\@1IeR���VfŖ�MX���ΕΛ�!Ǘ����R��tX.�XΘ�X�ia�,�)i
i��ތOWl��xR
������g�ll���V����-�h�p�p1n�$�%�S�S�t�t�t����O(X��x2�m���|��
�Q�YOL�m���?@�Msu���߽>��>,�w����4G�An
���M��,��$<)(Y������'ďE��D�D6#�"�b^1�6p�o"1#"y��J0U���7Y��9	�����(n�|-��� ��b�`UC�,@�魬A���|R fA"8(C5�
�^j���>%p1�Vׂ��b���.FV��A�
��5C�"@��V;9 �B�C���5
�Q!�ӕ���NS��-2�Q��.h�1
m)�,��wJ���rJqbW��ɺ�7�1�1Jr>~Q9TVi=�d�2�2�Rxs 3�&�.�6�,��Ona��=�b�C�	�ES+�s1����V����!7���D!P�`��
Qя�AdRˢ��#�E#���D�r�r7���[�d�);�3�9��K�P1U�i�����j�ʲ���$ѐ�
�3�LUO�P��[���2v�.�n?ݛ=���-^9_C���:�>Q*Q�_ٴw��MvkG��Jb�|s�3�䕆�iv�޳.v\<�<��u�e%�,";@L>X�mJ|��姓�E1g��2�:��X��lo~�ݲ�^dx2����'�7�?���c�iu|T��n96n˟���{����8ڭ�}���#���{G�c����MG�xb��?R�X����?O.K)V�:4�4b���.pZ���}�}r�1�cU��_4v�"�=��X�@G�*g�ֽ�J
�0��Z�6ъ�L���:x9���E����ے?�i�����K�	<����$Y
��C�aܣ�������k�׭���O֦:�9~��V�t����C��d��λ���	Gx!a!�-r(�4^�_>�B�E!O
��)G���'�����P�hkx�V�-���Tc�S�$W�_a;i�vᆋ����3S�ni+������yS{[|�-N�s	ل=
��B��WB{��$�g��9������@ļKWQ/(IrX�s���N�]B-C�:����W�T�P�T���Y�޹�]Z���^�r�׽�������Ip��v�6�1�獬�XS�=-�s����>9���b;�����E�%�#����\�=G�^qsv��ú߁[�}����ﳙ��U��� m�D���gfa�/�KR;{����iaW��Py�g(ް'��11B�iy�$��]�Nq�<홃cS�(�b�;��P�>}x
i�1J��@�LYwHc2�]�"�M"�0�RJ��;�e���Dc��<[10j?�$���tM%�YMM���J���nw�vP�v���QQ��ndP�������Gp�ũը����*���-��7��ԝ=az`�ɼN�����X�!�p���0��������'o���3���f@�@n@��", �c�ƛ%������O��đ�����g�1�G��$6�n}3o�ޥ�U6]�]b�Q�t�EY�v�+Z8�==x��Ž�ξ�j�[�\�<ռ����7Ǩ��t�6{�8�(��|*�mXs\�	�Br�ؙ�"�9�z��gV}Xlf��~}tc��x;{o���\��;G��[��uu��2]�>�.�X�>�����,����u��s���~�?fx�}��,�80���V�:���.P;�N�ųn�������q�}
<�L��4�VJ�H�{�?2,���P�A4��ר(����/9$V�x�B�	Ɲ^��p'��r����&�k9Җ�4;�k.��W��e�m��D����xCF���퇪���2�m?N�^(Y�	�#4�'���26���E��[*�p��l�>]s�7+�P��a�ކ��&�eo����wf�u�d��f$'�4$4��Xϕ�/�$R)6K��Ҟ����oN 5�K�$AGU(�V��Y�~�䓆�g�FFA?�FY&�9E�-�M)]��L|�{�J�ħ�P�Ѩ��i��5�t���V�V�(���t�4�s��k�;�4�X�y��0�9CKQ��4�®��p�>;iOv/β�|LFWٔ�6���]�v�	�-^��-�<��02��_�mo��}�^�m�O�o�/&�ź_+�ύ3�fkyj�e�N�Nݷ�CǤ�b�dwu�n=o[�	
\+;L��?��G�Ti�]h�i�o�ݟ,m�$W�r�=�o���L�[p�}���1�2���ϐ3`�i���M�+��E��y�WQ�N���#� c*b6��2/�:����~MHn�-���On[�w�R����gШ���Q�&�$��ˤT$wW]���ˈ�.�E{��tJ(ܕ�t?�߀�}}���v�d�8�J�Ȱ��f�T0�lV���oh�ö.1�3�?�����u�$UT��Y�[x����M2�Y���M���\����w.yz�;Y)�2g
fr1>\�VDX8J��3�嫡�y����W��珠E�PE�zK(�"�V���>Q��7��w�1�2��i��Q8���Iw��5$[�eq�v;N���k
P���G��1��I9UaNՊU&U�e�U�
�ʺv|;F�&J����e�yU���k�t-�:7�'4��*qW5W[$.Џ8'M��?�}m�g��.<�����.��ba�OZלk>>���P�#�o�eLx���2l�ݯ�,S��o���B��t�׺8?\��;&�mވ=X�
����r޿>���?�x_�=z��}}���	i6��q�WsR���2����7�50�s�����q�}km�O�fme����K�_-�~�SMOD�_M�,y��d�	�m�	X�X����x�L�E���/����=���+�+3���)=#'''==�����6N�n�6��m��vD�
���mm�y�7�uv�%"�W����{ c7�d�/�~;H��zF:�?��1�O-��������������1�8�x��7�gO���ga�=�_=y�C�-������O��Lm#$E������RV^��%�ؽI��D��soDV�(X�?{���J��.8��27<M2��MH�6I�YV]���݌�m�MT��6�@��������Y������q��g���ێ�H��J�����Ɔ.M�䯲�Anw�dCpA�D�W!�b�E�I���E��G�NXX�oKY��9$�%�H�G��D�v��G�%�۾R.�I/�_��zX��&X�EX��#����q�%�� ��f���g|��WH�<PJ��9x��P�zչ]�+�|���|>�Е�78p�Cה'��F���k~��ٞ{�Ӧp3-]a;o"�|�w���^�f�<��c�s�s/��D}44.Y���*Q�Z�-G9���6Me��@������
�ۚ��e����qbO�#x��N���v��nO�����	�{>}y��1M�ވ�]Zԯ�ħXz�-���<1���y�W]��ɩ;�pnc���;�3;�4��+�ƾY���}m�@XE�h�t�9^��,�UҼ?݄�p;e:�E/����c.�\��A��p�o��	P�ꄬp�X����>���_����<йV���(������$���KU�?�`�p�VuZ��<��x���l����viۡ�@�б��Kڄ�
C��dВ��M�JMZ'�z�E~w���G��Ӊ�9�ӡ�}�7�yy4����s������c;�᧼� ��'6�J:��{x7`�Zz.�;?nh�B@NFp�O��J�J�~L3�,�$��}�R��D8��;>��2rY�~�����J��l�
�7�<�7��+O��1̻�
x/]r��a!��ZνRw,�kq�D$�y�{Q�F2}蘗���:���y"ƃ(֟�g9���+��O+
r<�h}ݪڠG�ڨ�Mz��a4���j.��l���]��r�ya���l�����.	1l|z'�[n�
��+��u���uӳ�ԙ�Mn��GJ4��x�'%_,�q�~o��ł���e��׏��눴'87a9��g��-۾$c
�a�+�6��%����(o(6���YE݃?�p�W��L���]�x�mFI6�&�Qc\M�L�>�����
dxg���6q�${��-n;���V��’x�y����
?Ux՗�G��n��a%��C%�rm�?�x�{.V�=�ۜ�]ʜ�,%OѨ)�yz�pO�qwt�/B��z����*��Trځr>�{%f���f)F�Z��b%���}À���R��Y�+�0v3���z�����]�z��̝���^���-V�T�Փq
�=/}�����ρ�s���^�;�%~��l���+����|�%�q�zѡ+�'#h�Dž���l�e�:]I�G>%Q.~��!�p��X�����V�,z'�3ݡD�ϥR+�7��7�nOs�Y�8��E�O���7�=S��V��m��^^��u�k��f2]\��R�a�r��Xzd���5���)��$
l:�.��ڳp|%1b���L�@7�?˪6�/I�~���U��`���۳���3v��l
G�+�:7�~���O�(�7	�Wذ>�殟%��L/y���v���mMH
3	m0�7w���Df|�{=pƫg:n/�u��`6ʍ����}o�y4�Ԋdcf-��N�*����v��m��f��f�9h��)�9=Փ�q�Xf�S�9:�mB�S�v:���G��2�6�9r�m龆ϑa
��;{[��Fs���}d�g������>�v��	�"�Oh��0�x�}�Yq��.�m&��g�b�=U1�X�����Q�V�ʦ�nN�F4�7����2�K��"#��kbGڣ�����f�i���>��5aƣ����JUv;��>'��=�Db�>�{{��
��͔'�}7ά��Ȧ��������o,����@"/BD����Y
�dCp�Ʈ^���)~u�f��|��Ѧj{�S�v�o��E��_�l�|UʾEVe!�'O���V�����/>0��۟)Ѐ�+��Ύ�!���Q�y�z���,���^����΃Ux��L-�d�&���{�™.��T�E[�x*f��&�,2!P��؍S(�(Y6	%�4��
��C�܌�pP�\���̾8��jQ�
�6td���eov�*�6�@bJ#;�%�Ql��+���Q9/5��I��t�l��w��B�g	�vu=d3��V���n8�ߡq���Y�H�l��dZ;Ab�ʌF���2�3�9��Y����*����f���@[�#����)�%���\�C��~xN�mԈ��m�ϖ*����/��g�f{��{���fh-�ʯ�p�]\�̭F��4%
�.�l/�9�*Z��6~L�����P�Bx�O�~j�'����"���A�������&���a�����s�]G�
%�D�O�OǫF��e��N<Bd�����˝-S���9�c�1˗�9Z�降W)��q��ѽ���IR�����*dĻS,�	Wk/D�i�*_p-p����0� *��w��:��G�m�mױ_�t0g�K��c����<8
R7Z�o�#��:��!�9�d�	<�b_Z]�����q?/��p�:^O�E��沙G��xcJ����Y}�>�������G�Xܕ ���R����~�x��~�����}B�Du�06�@w��yB�2�;⚳�4x|Ӽۓ�}ua6�:e��F�f����nWr���j
s��ď�Ap�iJq�zɁp�WW��d��X?S����h#1>�/WZ��0L�p�h��P��M͐tbA�>2U
s�J�p��q;�WYr�#�өcO�z-���N�϶�����S˯�,o���(��
̍�e��j�z6�����N7��E�FJ��e�2���ּ����>����r��yCي{�:���Zx�p�>�`4&��,��� F?J�~+�c�l�'‹/9�����k�}�3��S�uv�p�v�V��Nj�%W4�Z_�w4w�V�2��g�����G��Ggt��+;��hJ���V�E��AV(���I��A���
w�i���񠵦wh3\N�ξ�1�[��&�!F�dR*�j���C�Б��J�K�� ���{�~�w{���F��8^���k�}0���H��"�(
�3�|�z�K-�rD��g9��/ �j��E/g�4��O鏧5�G��J?b�>[�&#�$�v��� �2N�^���<QkNH<6*h�*r�7��2��L̫ƦO��X9!�#���<]؁�ْڧ��O��6tD5�UqQ{sA&��&a�!�ڽw4�RZQ1R���K ��{e��㩐��@vgm�sG��5�ws\֠9������}nq�����p��\]7�?�=F%Qhe�4v��÷�D'��-�ԓ�;�^ |��\���q^eY�G�q#�)�����mnZg�%�s���/�l4U'A���"��Ok�{���J�{��$?�Mec$r%��g�L�}[@�j�@c��˃��&�$|�z�S��-��
�^z~���x3ud����8RV8p�����'c:xh7��/c
�H�=]9��Ǜnۂ��*��\�����苜J�Q�x^�#�UyBN�C�[g�)ܕ`��c��NvN�1��N�U�ڍ��pxT`��k���(��#Q�����98>��%v׾�f$e�uuMc���]X�nx!���Ą@�[G��P��e~�_�-{ɤ���Q��S|�N=���3���M�3Q^���*q��T���@ڭ�jV�p�
�޻ x-�U����3<Nu�>w�.Fф����o���8Z9��ZP��+Ε1��~�'x���Ȣ�ݶ��<��6gFZ,����+�RRϘ�7\�Ն��#�� ~��Ș^���s�'Z�$��+�_=;�v(.z���*L��i2��D�__�k�A�[�)�	�*� R���,���5����c|��w�؝����pGEl���E� �?sE-��?��'Dp��u[e�'��6/�v��2�Pj���9�4w�yZq���<�G�X(��4j=wH�ƃ���ዂ���>�h\�����zИ���5R�\K��Tr9p�zg�_ݘXw`>nς.a^EھQ��ioM1�2b�Q�Nx�)����;7��SlfI�g�/Q(�����w��d�L���;��y-Un0�NIn,m+����NJwW6�3��u�c��
��J����sx#���_��\��Fʔ�0��R�#�;��{�G�(f���5P;��2X^Ë
�n��ԯ��L����|
;O��$Y����)t7��-0[8K��Zc��A&���#h�:�Q�v5���S���c�V�ޜพ}��gΣ#
�V�;2�Y!#u*��IȠWb;�n���Ʌ|���nW3�6n#u�}p����1k4�P��|18���`�Ʈ
����|�����d�&��}�4/zۋ6j�9	ǂ�0��
+II��aYQ	*���X�ȸ�4�rR���1����.��CL�S�␱�␪)<㕕�:��4��5��#\n����3��p�-���^;��X�_J����|�����5�"cs�mN�q���'��'%
�ٜ�K?�Ě1�1��HF����^n:��������[}�r���0׎8*�Ȳ��p���%}no��hjz��;�[�J��A�a����B��|��o���l
��ش}x;1�a�r�OuU<t�.�
�+�˿��OH�u6�s%)x�}����lq3����^�[��[�r��0-]�`����4zs���?�
��V'�/dP{�֗�6o*��.�T7�
nk0T8�R���� �;��BF��s�@����iW6��<i��Y��|�������P���H:�:e�0�q*�QCKm�?��h?��h��s࿈�u����/2�^��ͷ��÷��	��/�qb�sX�b�V�����g�	��[�R��ws9�y9]�\\S�GR��m�v+�Gh���5g�`
b��e��S���;�9���1��6���`��:+���U�7�,�/��5�Uͪ:�����##�;!���x|�S����a�gW쾦R�j�{�_����+�XX��ZPPa}� �ј��4of�]��#yﴐ���l"jh���b����@#t�ڷ��)�'yiU�L�jZ\��6�D�!�_A���u��Ec�U���=(�W�^�(&�/����_�9��Wc���Ni��0a���p{���QNUn�&�f[f�@�HO��v�y��j�Y���L&���2������804!�u��&������u�~�ﶃ}�����{���"������YT�����]V��/q�Ab�c��z����$s:���F�$��Kd`�P-QGf��6�������G����y�� 3��V7Gt��h���U�=S�n蛂)�/�2BJ�s:��h8J������Tօ[t������ѽ�����p����ʌ1r�����`�gD)�˚�?s{��ȉ�}��6����V{��M��SZ"�����qE�:6}e�/��M�3��
k7���P��q:Ķ�p@���A�w�5(��n���!�ȿvN�
��M���xrN���Ya��jR��W������e��ܭ�h;?U�%��d��i6��&:?NiZv}���蓪�W���y�D���r$k|�=7Q$�KC�f{ĕ�b��p]�!�3)�	�Q_���݇��8��Ҍp�DX-�*;���mh������	ڇ-��<B"����X�n9L8@����h�b"�/~�fD�Z*�v�F�?4񂌰�	q�YҚ�Z�!;��2qT��s���Qa�+5���6��Nʋז-�f,�7V�����N��L��#��V��jq;��(���ʍ\���`zN-�,���իS�!�������b��D�?v�a��R�&��_����I��%����#�Q,|�W��t&<6�{�0��{駷vQ72�<�ZY
��IT�%=l��pu�#�ꁲ������f�D��.bD7����o��P(�m��BBr��4�^qlZ+�%�'-,"ѕ�+��cud�S����$`�����/�����8$MJ����ݝc;��[���;M�u|(��r'E�!8����-���D��U�x�ӳ�7}�;���Ý�;����|��{޼���n�H�r�1���ky|(���wyv��(&Y��BU�Nݎ�Q���v0��n�ζ��!�G��+V��j����rI
��[*��#Zv�)�V����/�Y��<2�����$��{�0ݱb�O&��b���]�H�v��n�Z���y�6��喪JK�N���T}�Y�V5�,��o2�{����Az�Nd)���.vQ��p�.��C�<(P6.�9/�9#2��L�3E>9I��Ovi�9I���4�O���a{���Z����y�fRh��h#�/s�XY���%G&�7lq��	fqB��H`y;.�b,��Y���T@�T��i񩼆�jƏ�x5ܨ|^|}N�����������n
��B�U��o�İ�^I!�Vi	ϔ����F"�Sͳ@�0�谎����佤;���(ʵ�[���N�3�dm�7*�7Ą1*Rm>�]���D�8�V��$�v98�L፭k�-_wU�m�C!I1󬘗ڦ"YވV�8����?��@p¬��>�	#6P\��G����?���oD-�F�:���g?;�YV�����R�,��]0�j
Y���S�AkƊnG*&���J��)b�E�؈;Š"{��j0����dsu�$����
���^o]�*���fz��~v7$�ʵD؈�.Ղ�A-G���P�i���P��65��X��E.�{a9�i?��W�3���Aفm8�smnx�3^A�4��muc���o{G���d�ɭT�?0��/�0\����7��(��؈L�彚�+HJ��4��U=�
�����f�+ӂ�;��7��5E�Ϫ,�s��1�Q)��nh0��N���S�6:2]U�?�.1��O6�?i%v�5s�X51��_Z�
��}�Oڃ��1>>�Q]�n7��AT@u���2��B�]��Ȥz9lN�q?DD��|��QѤ{�JB��s9�ֳ�e8��p�uOQ�(�9T�����"��|��!'#�
Q���Ӳ��H N|'��U���_Z7�X{6�)���
�vx�t1��sG*��e���`xi���<Q��L�E��{�m�C��O6�C�Im%
���� [ՌȐ���5L̐��o�g����w<�b�LJ-�
���=�
���|�b���bY�n~��rN#�1���\�s\��	�u��꼌'PY*���$�&^��^?) JH/�h���9�����#i֥
؋'}W<�H�M
ž��� ��P]��BnB1'�Ӌ̄�����!IF�v�(ME�?2<?o�Hc@`F��X�E
�`�n.��2V�z]�~�c��B������Q=��5��s#��Q:$�(�5诔�NGb���ƥ��Y8g!$���J��R\��TL��U)�W�x�%�"��߅�U�P{m��)�^5(�KT��h��<�,[{
����g��K�-{V�yJ6_�4��y��o���<L܃���s����3���6>NmM{��i��4<竡�ʳbf|�^h�K>VJ��z��꧞��^>TR6C�~��M��Fu��3u����R�VMk�k|r8e�^3D₱���wr���e��,��$�r�p��8]�hi�i��|㲕���y�i[����=	�BA�G�%�M�x�Eq���
��_	8��X�9���2ӸpQFt<���:k���Ii��ҕp����gPv���Fi녲ŦWS���)�m+�K����'�R-���ӯI&)���r�l��^jf3UAp�?�B�t�"����ڀAu�W�Y�7�8�p~ѻ�-����9ƽ�`���"�+�z�1#������qBK�ޝ�;t�$&�@�\�b���,(��Rv^�T��R�) *d�X��聉d�=v[l�4J��H�31�h!�!���BK��A�o��O{H7���5�Ǩ����"?���ɐ�Kn��
�������.<����?37-�z`E��qc ��ƀ�'��M����M�����
���
�����6!����1�/�Ն@Nz�{�'cl@���!��M�oy�?����1�@�Ƹ"��A��Kgi�]:s�6�;����q݊x����Y��K�<n,?��h��M3����ǰ���_!@I�k%|���y� �(�U�v��mW��8E۴DU!g��/v5��J�yQC1Z� &�b�9p��oףs�u$6���6Wё��HF��B*>���UV;�*��Mz*
��	��?�A{\����A�x����W���=�՝��D�?��dd����^��U�c�q�ﳲ����5�8���y�K:AJol�
��A_�����v&ȇpx�Zp��3|�%pX�Dk.7r�K�
6�ʏ{�3�/�o&��r�.H��2k�J*i=vZ�>#��?d+�wt.Au�KC_/WT�;���y��Q<0�+c�
�K���,����L�|b�k��z�?�֔/'ϴa�;SG��K6���A�IY���u=#|i�_־!�pg���S�k}�~Ev&ᆴ,؈+�FDDڕ=�Сpe��E�b�̡�����?�4�F�:YVd,�Ep?���B1����?*M�z��P�V-5��"�Rbj��Ҟb�x����ߒ��Y�� h��M�2���r'n �ܢQ���~V%mUYp�o%ӇF�f�C�XM�I�8澐��U��fU���\Y���FUT�6-�S��UC�0%���j`LG_�ߊ���CqAG��}����SU�#��y%��-W���T���y������G��u��S23����Psw���*J�mY�/'B:�gx��3͛�<@�>Z�9�a|���_�B�B�{��n��b��=�]Γ+�T=m$��ũl}!3�߶�_��w��OBV��EnʄPX� ���8п>FlDNGa,"_"�
�;A��Š�?��Lx�A�qo�q�FD��k�	���ʺ��dj��[!ŅVw�0;���h�^l��{�k����Uu_>���@/j�N�����h�M,>,3z	�8�#+�_8���618��n�{wI~֝>�Ώ���G�>����*�T��D9�0n-ky�8Љ
���Z]��pI�[�{�>�4-�8/�� T{�1N{M�@�S������ws(����6�t��u�����t��1�Ҿn����L�z������.�;��jfq?2������j���x�,�����G]89ɸ�`�����͘��p�l�z��u�A�?k�P"��y�(5�Sa��Ҡ��ł����;F���
4Fc4Ɗm۶��N�4�m۶m��m7�}^=�?c�}���#߲֚��9/�~ל�Sv��G���?���+�]���_�����9����b~E(�4�����J��z�(��T�Y�!v�PpX�I�,5%�<�j�\����촢���A��v@:$fJ<PbVYgai��~C�B|�3v�#��Ooϋ��:���o�	z�z��n\?��X��W�֒�/�ԱGnr�i,L���a&G��C>֐4ȧ%l��!B^����!��/�?&���n�Ú��T(��*��l�6~#�D�#Pr&/�c�N���á�����r��vD�.Rk�ˡ��sQ���+S��Ny�#��+j��c�Q�;>�iS�۶�7u߿�Ӆٻ�}�z�gR�]��jqs���JY�.��)�W����r�4�Q���L�C�d5�!{c!9�es�K�9�o�C�`��ń�@���?�����CX� f<;ƥ�`:,%Q'(9h���VJ�|��Y,֫�=o[q�#&`J��w�4�/�6�F�\vQ�V������q��nfP���Ը�p�a�N|����H#�R�����m��;*��H��!L
Y
k+sҔ�U[�X����3M���v	�Ѷ��g�I�����]�ͤ�^��OE�E�Z-o�!/��
H�H쩚�dp};�����C�#h&Be�+	J,ʊ�l�~���F����GS=���V��?�w0�㜶T���e#T�C�S�F��aEk#��.�m�Z������H�
��S��hJ�c����԰��*z��V5�{�����l]��v�R��.輘����س��:��PBVN�Y�;n�����$�'��_<L��#0���!���J
x�I���-��gH�|C[[
��^v��]��{�g9���i�>ΐ���ȼnW�!	c�I�m��ja��]���*�F��u��	D����`���9��(,-�n([UunF�[9�2r|�1����t�f�4$p!|���Ǔ���l�}Oeҙ9|��D�4M�q$j�/�-u;E���c�p��e��H�o��`ؾ��b�E[�VY������Y'j��Q�F&��:J��:W��J����&H�8�Pҟ�gg��0r[�H��N;�6�4��+�ݝ)�p�uR)��p��O�_�z�Ug}3��\c����l�f��Q{&��r�7�:�>�"Y��Y�9׻�W��� �@�����w���U����ݓ+�=�M��&����<��Z���}2����o�s�r5C�>�	��=�>�7�X��T�k6j�K5�_w�6�K�cJ棶��e/�����΃�����!���!Wgh[��}�ֻ��f�PY8#r��F�ڣ(��
uj���7oDe:1�v6��계ۭ��uKD�����ʬQ�!�e�)���٘(��\ҋK�m[�=b��\���d�Y�ة闚Z�]�[C��d,7�־[r�g�F����'Q���V\��g-�����QP� <M6��	�{���ȡ��UlB��
���g����'�+3���K�D^���P�����l��SY<�~�9�voL��=��d�6�w���Ő��K%��:���x��h����'՘�#Зpjජ�~x����H�h�Y��-
J0Tq��џ=3����"���K�L��������9�zq(��>ijba,N:ٝ��:�*+`u���s�)1�砧B�gOE\-6�-�f��^_��^S�12���R�	�f�x��4�����\�1�W~
�X
W�0�>�I'b�@��J� >6,LUe��_}
�e�;�_W��;���:��Ԣ�q���v����k9��߱��s�n���������+�ߴJy�$��I��i��{E\���ާ�)���ZOB�ar^�ȳ��r�Nb���5y͏.�/����
�p%�Fy�~N�I���$`�[vc��r1�N=l�^B��߆CR��m��	>܃Tm�XDJ�	���"���DP��-�k�l�.�+��ָ8lEJ���7�vkސ���SoZ����5�5;�#E��`6�Aۥ]*Eg
�
�7R:Xv|�����;����'�
׫����x�f��fy�T$��4?
i��&1sʥ��ps��q��mA�ܕ�f�slĴ��)�Ġ��+�!Kp��Qm4k�pm��ݳKڛC_i��ܷ��ot��E�����	���ܠ`�y5��uu?�|��=��P�,g�5��%w@�u�������T������]����<D���&�x�s�o����p�{l�]�&��Wr�,jy!h�B�F�+e��hq�X�z�T�pN]���f��B�m�����R�;*#+[�DF_�;<;��̦�����Pְ��)8�@�K���v�����\N*aY��L}3�P�M��g�v�z%K�wZ���*�Q4#��p� =0Sw��k���	&I��l�p��0Bۥ .��Î-}K_�O��b��J��C�XN���
h�RR�m��N��>|T�&���WK�=߯���v�Q۾�fFBMG�e,]�<~�,�¦�@�x5�M�A���@>C_��q�6��C���<9ɹە���2-b#��O�9
�L�P\����.Ƽ�q�8fm�K&D�T)�
��S ��>���5����-���G*
�������^G�&B*=�\O�E�� k�x�'����/�{��=�E����Z�d+��i������N:w����f"�8?�.�cJ�o��֍�(�r�����KʤiQF�ִ?��D�{����s6��L��+�Ϫ�NOrH�����ӹ��8͔�$���jT:���G���^y"���#��sc3�w��V��Ne�-CL�kRw�l�1������_"�5�/Q��u
�T�?x��?�#�Ϣq�F03b;�
M� ED�wO^<V��7�0�H��P�x%^D@���S=[�P"�׈��c8��8\��m��z,�V�T��>ĥ��l�m���d ��!xRV*��M;��ܜ
��&}S�UW��	�T��Y���N1�.'�R7[Q��ů2#���zV��h5TO2�taO�tbp���D}�^�C�%.���HW�g��H�M4zO��ʧ-�O�k5��W�.�W�Kl����QQ\�����tv%�.�r޹(dM�:��@d�.�򇜖f�������Yw��M�ƭ��ߞ'�dP�"�g7<Ó)��nO�˃��\��9v�oh)ti:�,�#uO'+B�t͎��p�d�}�q����Z�M��E�oA��lv �ƒ�$Z�)eu���CY*�~�^�أ�v�u��+��.�|~�%�P�Gwo1tc�D��`k�Eґ̫f��#��q�U��=�
���'���x��=Q��[Q���7��^ ���5��fs��5���-0�,
�Ϭ����!s
g���V׫�4��#v���B��S��E��9ô�6������#7��LLO���/A�T�CR��+�=E?���|�O����,q�!��<a�d��P:����Ux���/S����ܘ��]�G>�uëN�[��W�gd��~����
9�)�u)�X~(�=� ���ן3��d�Äu%;|E���t��?��ޞΌ)μ��1�(��#B�����$���2�D����L�y3���ѮE�8vE�|5���_ـeՋ-�C,&����
֌�9xr�-.yl��.�_�����-)4Cg5��Ӑ^���_�Je���n�M9^![Z�X-3o�g%���y�^+�ۤH-�W����������;�*��Q�b7��}V�t���,(�.��O�1	@ˍ��D��{u&h\�ˏ٤¹-:�MFB��PJ��"޲~�-��НV��'��u�	|��}���]��fz\��kTq�;��}��B+e>
�w���N��?0.gX�K�d0B1���H(�6^�_\��{7첒�����}�p�|2�3�%(��1����j�5��%}��d�!�HU:�z"r����j&���_l �aAV���Q�SδCs�3Ue�~3�7f���H�Aid;_�`�e`x�>����T`�p'm���w�7���*�l1����q���(��[�4z�⪀6�G�wS��,# -"����*N��(µ{��BX�a���~C$���'��4���$����vaꓨ��n8A"BV�
!��WRNd����Z�[�cjD�E����	Lt��L���R�d��/٣�D�S񭏌�bU������V����J�2~[�.�OgJU[[���laպb[���LDl�(X�Y/�MA�s�=bo�(��9&‰g(t��F���+�?��H'~�P*���H�8fX�^����8��X�<u�_8�Mg�%Ҕ�m���P�n�xn�İZ�����,)K�D
̰�l*pjB�d�?@�gX�F��s�i)��<��nM�P^W��ڛJhq�c17���IY��9�|O��f��vdݮ
���/b����Ah�]�m�x�Mb8OZ�.~#�v��IJ�%���6۴�5}jƺ��y
Zab�i��2\9�\*z�ꩨ�K��� i4��8��C����q����u]��r"O�wsg>�E�Rt��LJ�	7
�JbK�� �����]�� ��
y����A�-4&]X#z��P�)C�v,!CE��6t�����^!�i#ޮ ��YT MÙ�&�RJeEѤŪ�vM�HbD���Fĺ����E��"�{�a,��a�^"%�����
0Ϝ8}���N6��$p�ʼneL*�L�\��+fqy��B�P�$�_���?ݹG�	׉H'�7�AH��HIJ�>����h3X ���p�}�:���"p�vT��!�{
5d�teø��/;�2��Z��3�1p=���{W��Έ�'��*�7op����P4n��'A�Q�a����0_�P���Vi
:K干W�Hf�(�}����ߦ�5��{�p/@)�H����L��O�-,��S���e�Hw�ˆ�iC����g�T��62k^��U!��.<7@^Ro01��dE��ň�IE��,�si��M{h�&E��}��[W�9a���<d�o_�_l�=P��֨�~l��Dt���M�c���z
i���	Sʆ_�-0��.�tOG&f\��ro$��hy��h�!��<,��S�����7��S��up�0�f�}��u}�ߚ�$�n�O3u��%SV����E�kZ���&���JQ0a�}��W�o�*S��>��D�RQ˯?�j�Kr=
�K�+����d�׬�����P��d%g_��Y�X�z.c�G�p�1��?�8)\g1W0VTk��Ë3H���PQ���UF����t��TjcM��v�zJ
t'�ɚ�T����nx.�I)����k�䬜v�=��\6�$�34D1Q�����[�ec)�?���d���<���2�@:2��#���\�L��o��f�v�Ko$��d�Sw���CտA(<!W��f�#�ڔL^򾡎/�JdF��g��w�Wɝ�
��J�NjG�M+Z4("�X}�����=��%�1����PJ�uZDt^�=6�l2�;�u9'-�(_�}���d�d���z�s|yw@c�l�w�F�N�Ҟd����6F7��4ә�3�t�2����-�M8n$U�V���J�p�w���ZC��.���gڨ+�Q��a��\�Q�v�.���VJ�ԫJ���'��x�5]j߻���}�w�f���BJ��y?`����&j<r�V�����d�X^i>��E���*�J|��+ze=�iw�W���U+V���&�ф���_���b�#x�!ۏy."=y{P\b�ϔ�Q��Gg��u0�\�}�NOA(��	���j�'�,�:V�a�uP�ro��$�<��S�y��	*��+?ZC��	|B�=���ә��伿O�?�ZV��P��c����Ҵ
�ql�%H�xc��t>5�@O$�"�}�w�wF�
%_���'��
�J]��(L�$t+�w5Q"P����B��@[�x2y{�=(����d���'F�_4��]�~�N/h��pW�y�s!
d�Av
敎��3�;�6L����i�X�3�O�D���"8�A�*��͐((DxӺN���^_��ÛD
W�w� EJ�I���A
����J�����US&ŸE��LT� j�r�^W��#��&�)0�P�*�ft85��f_��gT�,��*#V�E�Q�!����悈�w���:�b�Y�c5!�	�&�$�̓��U��mIOкğ�#��:��W��0\�q�+�Q��a^l]���٧����+E�wŏXxЩB��oS{�Na*m��m��B�CF��c-�"��9w�|@�4����+��r�C�����fvR�
1{���س��J������áY�>	��*J�������+�-�2yW@����6�ؕS�Ô]f2��z`�V���fO���xoC���n�t���G�OK0�����b�$�Y�O��7f�/h�/���!��cB;X�9�ݎ@��ӎq��^n2.cM��ӂyd��o�*�xz�	类�/U�gH��t�K�����#P8�ѧ#zձ�U�/e͚癋�H��a��7ъ�.�L*SKGgC{"�]��O�[���BD�;�ڛIs��)��k�t�s-ٲwoR�ՙw�+��8�y�gA�5OD�zxD��lJ�(�G+ߺў�oڼnB�7e�G���{cmUV?Rը!8�V}�M�u{d3��N�S��S��B�8Z�1�[��Ɨ�ҳi����Vl�|g�5� 8�N	��[��w��gڇP�>>R��G���-���B�X�km/qVXjY�%�^Elr��<�/LX^`c6��)'v�/����}͒�M*��e�	`fTe!��˽��wfa��Z+�Vz̶���u9�!���sՇ��O�{���"���'�<�휙%��I~��c&-�.cZ��Vv)��n�>��'��\���ꬠ��@
�YF��8��3�Ӿbܔt�5���v�0�,���Y�R����e��_�*e�~R#�؈Zj�[
�-'�"V��vJ�j���h\�ʂ��bR�a?�m�>Q�>�'�q�d�?^;��;���$J�T�J����s��e��ٰ=��;���0�ԛ��������[�Bkd��׫�x	�#����Z�4�F����x����$�s��[��`}=��b�7��Ab6}�R�*���P�M�� '��+�
�{?�y��~�Z&,��m��iT+��B�J�K]xd��Y��>�e�P�!a��R����О�h����x�l�Cq,AQ?��>x��D}��:?1�#�u�~p"����؝{hZ� �fbՃ<�T�����	m�/��	��n���ƽwdF�n	a��o��Lk,Y�ɜ}��x�z���V���w	&5a7<�C;H" �S�
�&NoQ�s�-�R^�@=��;tz�%w�)�T�*�
�'����*�#/Ph��-f٘�QBh�K\�$
^@�񗄩[g�?W�FP眍��ʷz��D@��{�V������R��H��@l4ʟ���#v���RSP}��
\iD�����4�[��.���{�·c��]8�QǼ5t�����_3>���c5�F�sy����%bIuш�#?�pg�7-�GtU�A��y];"5˫�#�Uoy*��(�y��[�@Wi��fk�@���
�
��]�{B���Mԯ���6�����O�
�d�U���0��`>�q|SAK"$�xh*Zg�HY5��@�K�������?�W��QK]$	�d�x��d:u����MHg{�Ҥ��"W��rd��̞n�W��/_˄��MF����6<�-5�,�jj��r	?P��D�3 �l����c�A���vyۺ��L��G0�(�W��aL��D�:reW�#��CP�i����`Uh��(��� Ss�c�)�ܧe�B
�j�B�u�pT�c`
��ֻ��m?i�S�Y�~�9���"'M�T����&~BS��Ę#葌�p����ۿ�����w�E�����{J,I��`�ʬ���U�w�5/�yu��wB���oX;��'N�e;t%h�(���ȃ���&�`�w(�35�n�����]		w���߸O����Ұ�ٝ�lO��GW`	&i;♞�cDHH�q�7H"<�H� �F�>��.�U�.���o:�^@����wav��˲ޚC��ڀ���2)���!�斦ש*ذoo$T�CD.���x �F�!��}�@@)�)��	[>��Q�j�iuwR!{bI��yľ�?��:y|d�W����6=`�'���ٱ�E�.}$H�pL26c�}��O4i��hR�|!!F��fH�� ����s��w볤M0b����h�H��X�Л�Պ�k���_@�����D{�c6�l<V?udz���̎Z���/)י]
��	���PP��n��Bl~"�Qc�X?D@a�:*Ϫj^5��&T_�Ϲ3y@�7��&xq���KU�R�FOig0�7�Ih�᧋��i�D�8n�p���?XPR
;c�.=�K�OL���I*5J��<Ek��x�@N��Gk/9���1�]�I� �a�۪�Vm0�-�K��q-A��C��^��I�J�'w.��		E7�)��TT��C�O��kNG\�l:�u�m#d�w��o�C���x(�f��""�v��q|P�{�s]X�-#堸z`�c���|�xf#�9�c��֜1"�E��f"
�ƚ���\n����U]���M�bE)Ctvl�����j+:�wS���d_b�7��3�>T�I��8+����h2C}��n_��*
{ҡp��H���ʥnZ1UnbQU�zy��f�gbu�B�C����<��	�;	�k��,�;�%r
�T�wK�Ʌ�;qZX?=���UK��h�ts�ya%�(q^�d�U2�YM�]K
��
D8�!{L.j)��c�C���d��ef�bb�t,����M�4�HQU,�u����C6��yV�d�
%����#�nP'�q�\�iN�.
����
�����L��Y;`����^�V�?� F�l��������x�q�.�s�H��P�n�2P�/��T��Kv:WgC�\�a"@�g��@Y���ۉ�L����;���[��2��v��9�����D1n�j8z�ILS�!Ш��O������w�(��a�Ӿ����r� ��2���w�� ��3��07x�x$ƿ����e�����Jfhp��p��-ض	bU���ߪ��k�)e�x�
���u���=9�Z?D)�׾� �I!��d�d	�ڣ��8��/r�&B@x����G��Щ��=�/��O��K&�j�<��*������C��bB��B'Sk���_;c�N@�Gx:�/*��B|K�N��IW���%=uň��;	�:R����us�km�Dfi���h[�.�L�bUnnA9���G��-�\tj��f��C:%�AZ(�K�0��'�nώ'Tka7�mjʸq~ӯϗ�߂P�?��#��	&�����ԮYIYP.��+���ѝPIXQҜ�WT�@
�
�ǁ��<s�)A��>4�'4֭ɈA���5����f]��ȥH����[��_���
z�AU�,C��ޔ6L��^O��J�0�/��b]oGm[3�k6D����C׌ܣ{W�V`�Ր�i����J�B/��!��{�5>���4�^���� 	AT�N��q	��j{B�GH���3�wm�b|{���=_ԗh��D
 `��H�

J���**EŜ����[bz��ؼA��>�%P�P�8DS�Q�K��[����4 ×��D�,,�1G�d*�(Y{*�!���ޭШ0X���yE��ц�*����h;��h���/�˟��$�U���R��YP�P4
t�MAp��/�!B�zEa�:�{z����Ѹ�L�E�[�#����F�<m����\?��&��S���9/k��a���6sWa���qـLb��c�D�J���|oֻXm>�E���03��&kHH�2�kWpLk�b�Vm�I�0���H�cͲ�&՗��� f����·�
�%
�����r6���p���n(Xi>(���#�~���h�
��&���+�- �ŔO�R'��Qy����
zr�!��3Iۣ骱�P4б� CZQR6�)j;��C��w�!!��?�_3+�_��-Xo9=�����S�Ԫ� `Fw�LWL����SB������j��P���VM"���)��ڡ��}9S�E��Op����elj޺�(�7*��
%1zk�෶
7
�����+��1�j>`m����V4������q7Q1~�����S1���	�=&�-��B��X�5t�E����_%��%�_�j(���0�6��� ��(1�U�g�LM�Ub���vnI]	������t��z��O��4J��%�v��E�WF�FcN�zp���`��ᤠ�>_|f�[1�~p��8�p���X�;פF����=�j��\)eq�����[�����w�6!E�:��(�������2:���R�+��18ɢ��t�m���J���#^�`
�V*�fp�+坊ED^�M�Om7��k���s��o^����p~��}��nsd����H[�3�=r3+y���S-bԧl����;�1G��s؊�FJ�A)D�.�\gi�g��#^����:c�:��pM�O��eж@�o�S�yEFu�+���2��m�/z��S��Aڋ�nAz�m�4�����T�T\]��?1]rх����u%y�Z~L�4��l�X�*���B�/Z新sD��߷5lA��wt��Mq$���H�^��n��f=����wMi��Q�D�����PYH�$�a���c���/
�o伇�i÷���f֛i.�B�\�9���&�
���:	�U���"��S�!5�c%��}�^|_�B�g���y�R�A�?l�v��Tz��/�������>��j���Ŀ��x�(��G8bݸ���%Ĵ�p�睾K�	������1$"t�S\��m���a���nMrKC�E���ɩZ��csJ	������D�,�Òt1}�^3�:��8]']������n!	�*��j�Ŗ�*GKbGE��٢a��V�9)V��:�S�=�|����ԀL���-�bL�/�؋�h��%"�gO�O���e�Qc����ڽ�0��E��~�vV�m�1�^��9a��9�?��R#�r�1Z��P�g q#R��,Ms��C1g�O�"$"����X�rHO[����G�@⩠�"�E�1��2N&*�*
�rH��;E���n�
����G�|�H�<
AG]<%J^
�/&YՎ���a$ɏ_0v�z�+�vL�[�ǽ��4���Ж�,b=~|����CGG7R1�lû�}9�	��6�w�8���iG���
v?�U��RTF
"�`�/:m�Y��	n��Av?
[���xA�� �;hI�B+B���H{}�E/�G��ǾwM��V�|L��
:5
��"�e�j6g���R�t�����h�x5{��%����B�`:�qu'#�|
D�<���W����P(%�'�"{�-�"n6e�'o�FK���v),Z�<�ԯ��}�.1�0���aJD!$���߃�ĻU�I���fl���x��ȘDv̶�;�"�<6���F��os�y2�5�e�^k�4�װOLv�Qa��9+L���u�a9b�!7'��'���`�n8ۀ�VY��ٮ{�P�}1�D�Eui $_��P���j��f,ȍ����ov5BL��BcL+ᯐK������b�A����o~]3��Dd��Ύ;�1��ɣV.pV}��́�T2CI�G��
���E�<��t����A:����,��ћ*E�l��0�c���K�Š��t�^o��Z�\�
Lvs��H��Ci��"�(D�Od�Y�-O�h�(��0P�����&W ��j�8-v��.Ϊ3誀��l�@C1���������Pm�Dm��B��:
]l����<�`���,��\;�� #z`����/A2T���J��bV��P�ر""vpO�W��VA��JZ�ڃl��bsϳ@R/�'�~`j��-0��ZI���HSO�.��Qܘ\	����
�w}�tﯣ)��ڌ�G�����h�8Jϡ�Ɣe8B=���ュ�ZR�&\}}�"��Q��QK����g�A࿄Iw�)�;�O^jexM3g_F�:�?Ӡy�偟b����-+��ʼn(y���v}OO�����'�@�T�������G�q}g��\j��
��q���#r�h+�\(���_v�Ūuk���F������U�/�LX@{�3h4-��+N�2�I~/~G�$��Ud��=�Q�?��`_&'`COpc��=�o�Dx|Ol�oO�N��O_u�����h��_��mA��� � `��ҭ�
?'O�V~�2��)���:���-�V�P�[�fY����)p'-�-�-�%r}ֶ\y�e����t��m\�#�b��YkȫjGa
�U����{Ǒ^��ŚZ�HA����w{��j�j:4y.䜝�r���sU9�DtnO�K5R=����槚�*�O)
��Y�����YHe�%N:����$c/	���JPbϝ��)���d��
��g¢�.�RLJ������|?��T	�^%Bþvx���pZ��r}/��o���b̀oJZw!t��%�-��7���|1�pA�&��W�]F���@�m�F2��N�"Tpw/�9�DZ�E�pe�^�?X3�T��zKޜWM�،!���1z�M�T&�7��=�X�R�_b��T�JdN�;AE��bc|�ea��'�,f��`�`�@ƛT�`��&���K�s�\�B���*d�nb�U츫�,qR��[$�=��z����ȅƪ��&����_���H*X�l����2 &“?�	��z��J<���Cs��鍋��l5�
���*[����w=�v�`A��$�*�$�N�b�E��F2��A����P 2�'6�WO��4x�Ld����G�3��PØ��qN���8b�@�ϑ�%/��B��v�Qc��G�Ř*2��
u�@��]��J$��I�ख�����ߩ���˷��@�@�
��`aݞܟ�`\Da��Z�A
�{E9�]���*�,�{��8��3�g��Fl�gk9+���pi�i{�
w����R#��r�=��z�.�vHٯDlZ	V�Dmt�<��rL�;5��Yb���'\V6KS?��qzU����eU�
��˨����M9�x\D^*�Iҏ�,Ť��
=�W7��#lɡ⺵/mOj}k�<��_vh���8���z�%�5��BX>K9�_`�2�8�[���ɶ�Y�j�&�E�if�hH+i�S	�Q�u��?rEy�ϡ[ĥ�ge��B��bh�'�:pCa\��M0���]��|7Y		�,�����ۛ]K!T
��s��f,��^ �ľr⼦�z<�R6k"�K2���.��͜6�xA�5���B�T��%B��2�)M�s�q�m���n5c��F�6�H�|�7�g�'0W��4�m��ˏ0��;md;J>���/�g6ڪb��w�Z�$��x����A��U�^�7�EY���7�0�O�e�Ɯe,��ɪ���0Z�n��������\�6ڝ�f���~�����ѲcT��L5�j����	�\�}�5!!_�˭���A���VC�h�aן�����V�o�Jm��39^�B��!���Q�9�r��j9�e�iTɳ���ykʚ��zϨb��Z�O�-����SK㮣�1OHM��}��^���葝!���s�z���G��+�1X1����%��Q��;�)���ϻ�'8���V�՝�=|�H���:�ma�m
mgIg��2c�[0�5�gC���ïj]UI��p�)ǣ�q�6gh{%��|3�&�	2��gr
JZM� ��в*{��Hˆ����hI�\���
�c�7��o�oZ��Q�o�ToN�	y�]b�&3�%�cu��J���
���eU�?�%�qy���ϣ_�	�Y�N�A*����
=:�0���۠�ДL@���mhy(��O@�]�jq7�{�{!����wM���0O~�e�op���K�QЧ%�(ND$��Q5y��q9��o�h==*8�a��̄�sJ.�7 ��V2K�e����9���h��?�Y�*��N���cl,��s-�@_.�t���PCg*ڏ�	�+ᕵ�7���+y��.��h9E\��n��_M���Ո�"��2$c\Jf����}��s`���ݮ^���F�1����j���E�#���3܌z4�^�n��,*q���|Ao%e4H����a*9�3�5��h:���հ���Vfo�σ�b<FS�������%į�'�p���Ƨ�y>fcZ|d\��~sw�^�s.��:}��^�w��/qp����KP-z\��4�c�X�2��^�tS�@��x��J����/��4���h��v���T,�摱+��;�7<����f���@�
6�^�*�b\nj���Z�Q2�""EM|�'4��|��7v��nf�}�m����ICT�EC3� ,S�ӏ����S�N�9'�$R�=Q��;���Pk��'@�~贅y�Y|C�q���9!W@y�@%�%_�A+���}xP��Kv2˞����q��5��˸�OyO��S��vJ�_���![�7�M�qK��?",2��e36�i)GWU�$����Y��)b0�{4f���v(�$����¹��v��-�Wq�R��Xz\�!>�2��-�f��,���̛�'
_�����:��Ԑ���qk�Ԋ�Jܐt�RO���X�.�wK�Q췢IN6�R�g���@�.&��MP$H�a�¿5(���_�T��8�k��Xqɚ��)d�,�>Xʢ&��,g|V�A1P�˩~�4xbK��'M
����G����kE�c��h'-��3�������~A�Qd��ȃ=�͌��s_�#�fv>����y�NU�݂��ar#�	EY�}Yֻ��͛y+�P�U�ʡ��#m�Hݍ��Dƪ��^�	V��ꝲ��z?�$5>y�&�w6��_�؜A���)+�n��ߐ��fV��-?t^P~���;�N|g�~�������׶r��A;o�foi�o��n��/oZX\Z5�5a�Q�ð���}I�EH*�_u����K�%Y��#&�3*O�j�5�_�Wޥ=۴H�|xX�T�算�I	|·�Tt��*�QZ�p ����t��Q���YZB�6�0v����ʂ��u�v"��ww����s��V�Ol3����i�YWx6�g�NnnI��J%Iu���˭���w��O/�9�=���a[1���T��4��֎�t8��Z���!'�����=����[�7�>6�E�u��7H�׼[��B�ތ��g�OR�L/���/��_��c�i�}{�[��:�����1�x�I����hp��t�� �+����X�_�Н��E���Z�]Au3�[?��I孺�/�R
� 3���׺�L�،�̃m�	��v.F�.q�����s���X�����ĸU�og�rnrt�Ӟְ�<��z�V� '�Ӛ	�	�<�7_��qb~@
#����۽���`Q���E�xh2ؒ�q��ð9�u��Y�Dl[�s������$�8?51�ۓ�y>��/��0�S���r8�O{v���2B�›\�o�:}��i�l^�\�GB�gaB��3U[c�	5�R��k��ܟ�S�e�^�*�"�~M��m�K!�I����&���]�� g��ؐ����1w����ڏo`d�v�v9��_�gl�{'.��;®w�f����Q�|.�ӆ���WiV�6�!��dor~����T��
Rz�[r�So%u���L���yb�:��f�V�-m�q�A�3�1İ�z@.��*���C�s��C�p�Ώ��
g7��;,��؏\�-��gB�ߧE����Sh��j���?�x�a�rc�S�������a�d��
6�'�D�j�a�g���-�m���=��Dh�
'{��l���#zK����q�$�nK`C�5Җ� a�ڝ�z6��u��D���T�$��e;��D�
n��g�-!�zI��r�Ȏ�s��<5q�qFW�ڃ�CmX��	sY�ˎ&i�PE�g0��������>�ȇg�fb���Nz�*����MWH"�'Sڢ	���lp=	�I��RV�5o����\(�g/��(�-�ʺҫp4;#N�_K�*ih����3�D�y�S3ڃ>��|q��y��2�c7u�+��1 ������&�IR��e�0fM�vG�ko���'��ۻ��
���2%��*���6�Ͳ�����wo �N}�8��'S��[�&ٶl�]�mv�v�m۶�.�vuٶm۶ͷ�>�������*�[9s��c���3���e�m��[�]f��ߊi�Y3��m��F����3��"mӲur5�04U+cf!x��}5�}�2G�1�#_��/�^޽�O���P�7Q�8�;5�j�(	�$]��t9m�[G��^���}�K/�c��Y(��|���E�x8n�J�<�(����Fk�%�8�^�ƣ��o;����K;'a�&�#'���Y-p�k
���~���r�t��Um��V{q����;ss3bY?��Ԛ��XTS�U��;X��v�̪Ǵ��xB\�3N�D��oY$$�q�y+fc�n��b-��U{�o(뭋hL���N}��N���h�z,�Z�'�%���>s`p~m�G#S�����۲V�s�~t����b)��%n��W86%T'+�T(
I��v �qY
��G>O�@9�ǔ�T�a8Ϸ�<�lt�i����N�A[�:�tzP���3u��[#���o�'�)�RX�쭻)�vb�mY!�x�3��
�mM�!����'�令i�aD�zfG���r�]n�̱Ck{�cc`��ث�T`_yr>�zz�?>�n,.,�&8�%�1�K�|��'��C3e1�̔�{82�&oi�햭���?�.42�/�'��^�z��֏y]�v��{�A
H5�?�.d��5(�6{3{�]J�F�w�'i���`�V���}̊	P��zݼ�?y����dtW^�!��l��OSO�W���|�~Q�j��ԢO.w=�B��t;�dM�򩈳�o������lJ�.��@&�4t$�q+��Q�ٍI�Y�(xZW��[� j�D{�*ĉJ�r��h�`?#R��Lr5DS����Ӻ��#���x����s1“�C{}[	Uڍ@�S���v0�`����/w�fA�S�K{���Z\�Ek���ʪ�}s�WsU�U�a�j0O�Υ$^|�q�s�3��m� ��,���Q,�4o�C�|�̈́5��0i�:�N0=�������&Jwe����
�Ū��zW��盳|��������T�N��b꿝�o�����B���<Z�A��~��l��I8����2�X��);�
`O����Ο֤-}R-�ΰ��u0�%��Fܻnn���K~��R�������O�J�mE���O�Q�N#*�W��c0�m�}>�6a7�NI�H�n6:2�5��x���!8q���z���$�z�q�D���ӑ"�ÝYJ��	�d0���?!���'�b5o3���
���-�7R�ۮ̠�1h\O��D�9(p�έs�{{]�P���ju�^2�fR[:�V�8��ғ)��1�'�h0s�i7��Kz�]�͋v7:4�]vL��G��+�ȧ�G=GJ�g��8]ᬢ���? �Юq��>C�s'/S�Wy"{���_�{?�Ɠ\]>
8Q"��r��؅��#y:ԃ�a�qL!�5d�ם�R�_�p-��+���xN�����%l�����a�l�Ԭ��S�>~�IN�+�Ӆ0�b9�W�����$=L̺��Ld�{Q$}}��dh���p�����]��uz��4���:�$��|Y�D�撮x[B������|i'0C�mLiIp�w`�&�G�o�)H��=��˜yh�d�p�0})}�+T($$�3�W�o ʼn��y���B��y�@�<���喬�9YIiXk�1h�?�0�� ��c�� �}^�d�_}��g_�O�SRK��o�:��|0U�EN��&P�:.�5�^~u�.9�2�*-x��L7���N��U�sDW��㶦��w���*��1w� P���E���!٥m|;{�˔�����s��B�^�J��:��ep�����E��~�`��?w:���3)��,��79�Vt��XΧ���9��^\b�'��-|K��gb^2Q�+ ��z�oP���';�����.�!@�J5]�&�����Pg�/O�F��2>�S���5���k�ذ��c����Rx$�%%��2En�F���s��&mW~"ux��!���q�G&LÈ�;�9u�n'��Q,�-��}�-�7�vAU�Yԭ����n��C�'��5y�*+�֮�.�5�Me��l��z�e����S���oc�%�fw���
���&,����Z�v]vMB���u-.N��;I��
g���Z�l`���5�kx:�Z���7v�E�5E�g���d}ׂ�3�S��Sp��fxUU��5��JZK�5��j�J5νB@˂�9��IV��X��ǝ.≠�aylϒ|K����(��V�LƲ%�v�R5`�!��ܫ�詻�\��������UV��u�aD����su��oIޝ���%�w���+(���|
&�/Ǹ���|�:��E:�<���B}o��&��P
��e!]!<�J����F+�u`��(ڨ��DnxGX�҉�clTܭ^|EB�y��S�ˍF�%��s2���u3_
sR��
$:��c�)~u]�P�TJϻ�ЎpvycDYh�+Sr����:V�����|�_�8h_���^FyeXy���:zf%SM
+l�ǐ�mB�Ͳ����.��u3�����N�����W@̀j,����5wc���Zߴ�Å�w�4a��O&q�!JN��~:|���ѷ�z��I�������7�qhˆ�k�b�O�}�t�p�g��=�)iܓ�•�O�����P���ɳ6V��˛8�Ө��������V6���m.��G`1�c<����z�W;��籏
��Ȩ�zl��!�0�;Y	]߀��<��?�a��Xl�)M��{'b��H�?Fz(�|k�ny�Ϯ4���[��S���*��ུ`���#R�i���{p����I5ʧk�I�n�\���{�*qYP��}�q/�^��S{���4���D�[{Ѭۗ�AL3Ц�i7Fu�M�'�SV�M�����1� ��,��	L��q�I���"Ⴚ9qY��y�cI�NhX�c�!+��i1�#
ERi����U	��Ӳ�Dl�D���g �2������P�E�Ғ��q�X���㲓t��m���7�Z��ɛͭ;�>�*).(n�3%��&�a Sf�����l�{�k�y�Brs�0��ʼn`W )�Ӎ����z�!�e��V�:ݓy���G�>	wB��hRR
��FT16{���������P?���Q�$���H�1MW�-��k�5!�Z�ؑ�c���`d�Tz
�3�M�f����ۑ��ta#�r�`��΂��J�B���i�ffŎ�T���W���vE��w��=�К���w�v�ұ��c�ê�e�yI�J*����q�����+$�?�q�rk���e��oa�7�������
|������O}����`R �@i�K�%�MW���]k�z�R퉁" �j<4g�MH�QY������u3�n�� ���X���V�zv��;:<��|��pu�x6��}�E;q⡑��uF�d�g\��ɀ�Ҁ�j��!@��i1��1+<�g�*�<O���Ҟ�RG�s����]�]���td" $�;�͢���ʩ�40,��)T�a��<]��~b�}�L���@��d�}���q��GU�A�L��/#E����8:r�I�/솳��?�Gb:(\�V	���o�ͷ���Aj�Qc��7�/�^��a���i���E�I��(��(�_י�SٟYk=�N�NN|s1﹌���}�a\��!iB
!
_z?�����m�w)�o}��M��}�]�ʫAie6�'�zu��_7|��r&�i)���G�@��9�]�1B����6��*�۰r���qtbZ��� �G��j���*�X+P�
�)��>V
R�M��qWz�)��ɭ��!D�
%�gc���?���K���+�����Mgº-��
	���X��[UL�d�G����Y��	s���O¬&G�k��G���\Ì�vs�5�2�n]��䓥e@�R@V�i�Q*�(���������7H[���� Ǔ��#X��ڠt}����;��kDw��۹g�Z��X��#�m��	xʰ���ĝ\�9
#ɪ%�#�H�e�^G�b��+���vw0S��L�j%��k�G`w���@E�E�6�D�jV��˩���{/�|���V:�!�U�X6�eK���+�&��e�$[�;��z��M����/B)$��F�G�'6��߼�]f<XsrS�#!��"(�%	ylX���a���
�!��k9�ع�I�G����L�\-�%[��+��8�^�i�r��|@R֨yaL��c�{�jm��砘��ϊ\��yo�G|Q�P�����N	���+�#xJ�3���Yb���C�Ôv��Uv�qJ�CԿ�Ƿ��?���M�1Q�������j�w]�ۖ,ZEc*���PhOޚ�\�c�0Z^����H��x&�Hwq�
eb!匙]��.D�h$n����9�>;�M��G3sQx���Nfż�'��c�gd�}�i��V�Êȫ4$l}�k������4�O�ݘ�ĒR0�6+��
ڂOY@�I���G'�-�2����L@U��3piРC�?�K4+�5��u�!8.l�S�4c%��	'�'�xؙ5�*���
��|"�P�ܪ�lM����l�P�ڌ0���x�R�6„�؞׳Ca�dY({��7��k�z�����W~�w.���ӡ�
���x��N_�^0�J.B�[a���@�X7e'�dB�+l�s!�߂���)��6|(~c�݇���7�9^����9sd�d9b��'���1$aW���>Pb��#���?���j�Gk�f�(�(5����{�y��1�
�7���B�q�Cć'G��o�kSN9h�ľ< tm��U�rU�d��t�'E�1]���!�Jx��Cj�Yk�z��!��a�y
�\q uVL��ۯޜ����;��P�MV8^ZV9���T���/�6„�M�)H��<���YZ�Lh�Y����xƳ)�����	�RO������baR��[N�TC
.O��SA�4��'��Q�n����n��d�<A��N!�$�86=J�����Ȥ�����YV��to��0�'��8�L���H�K7F���n7�iˮN�11���p�8�x�2`!��M@-Ѽ!���*:�q"[N���iA�V���2q|�j��jk���qX�"�[d��.�D��t��˄��b��H�z��TO2�ۈՈ��W���~y�e�vM{��!{�����|��B'R��j����5��x��f[,�(�&����i�S�9��BhwBᲜd��M�:�df���i]jv2_��s��[�y�(��7��<�gn}��FgN��)�xH=�y5���Y'��$�_6�/��@��L/�Y��k�<ʿ�OG��/���L�y��cH�+,�B�3�߼�:|iUiyUV���|1�E����G�L�nu'��~w��K���:����–�@�\�팄�-RS0_�au��J?K��nj�IZ�<lK�j9�~�z���S&.$��7���GC����'���ֳJ�>��#�Ӄ)�Q	���pz�g�¾j���$_��U�c�A�Qv"bE��5d���4V�ӣ��t�U!����O�S�yX�(�I��Y�W����dk.�Ʉ"&�5��8+y=���`ˏ�l^9`��o����5�|Er�i&9�OB���3c$�� �P�ѦG��DG�j4J�}���;ݤ���|7V�D����
�2�N򿅌�q�
��Lo�ZF༽}\��t(a�Ju�l�.����`!�t����u�V�ƾ����Z�꽰`��T��>&�IQ�<�:�8�>����2nãd���w�KZW(�gZ�B���
MÚ�V��I7��_�ki��9�v��l�o��Rֿ�I
o���Z�X.�T�3Q�"���'���*��m���F&W`g�s8�\�dd<�껖���ğ��"��*�S����d��VF߻7���y�M�F�2���"��9Z��=��U�hRm�&�1���β�F@�l8_X��*�:F�d�����a�$��ᶉ.����������B�&�8���9��^o9�˚��Ƚ/^{�^���&J8ߛ&pv��;��o�u.���Y�z��w���洫��-��Fk)��+�
��5��v�GwYD�O"�qlf�3mC.Q�9V����&�-�{�za$��9��{����Jd"�H]���M�"n+,�aT�_���?�h�fS��HT���E����(�Z�H��aFc����U��Sb����GóO�U��&��%
{��Ά�O�����5BR=������B�^%y.�s������a�^����;ޛ���XYȼ���l��BQ@R���zDG�ܨ��)\�k��Զ)d�����zl_�@J��+�.%@I�Lj��.�����v����*�׼������m�
��W�G^4��Ѐ��Գ����Gf���´2��T5������F˕�:jy�Q���DpKV�Zm���ȝ�O1��i`�8.SlW��NN�V����|�A݋����3�p5���A��+�=�6|�L,e)g/R(�)vzzd��Y�0}o��&!��'"������z���� L�%KH���@2�w�j[����g��l�"-Sx[ԀPQd1IB�������� �\w���t:*��!e]�;u��R��6U�7�����	�꼬������4�����L[>�$��+(e�	A4���I��k���NM��&bӬ
�Z(#� �bp;���3FFK�0�U�@{���]��T�3�W����]�˜h�s�ai�"�	�H�����
,ݝ%�p��:C�#�X!-pC*��w��[�Dd�hB�B�/����!�-�
ɥ����9_fI!�� �q_�-,s�ݷ��[����z`�46Û?”�*�_�jqVf���l�@�C����F/�(R�vP�M忪[��D�"T子{U0�#]�@��c�.��2ƹ.�DJ��@<����n�ZX��n0��`��2�����C9](ufl�^6��P�Z�]-MAj<"[� ):���wr���.���B���[o�!F����]�@B��n۝�s�x�n���N!�����1�^�^���	d�&d�¶�;3��=�@8�u��J�~!{dK�኎KN(RH>K���ԯ�v�'scJ���ZUq�H&vg6���e{�- (7�Y���$�)�+��g@���F�:҈��E��gMz����o~,(wh`��,�� g���_�2da,�-ԩvJ�+H�nr�)��Ch�{��
+�nj�d�5��F&
����d���Y���߸OCz	��Kw�_��q��$������A��R�A�w�J��{��Һ=�&�L�>���c��HG�z���1�}�_#4��IE�����i�ǽP�&}���0�����O��6�0����7�i?ׇ�n��S��Z�P&�/N�A-�����><G%qY�izZ6{�?,Us�#$<}��^}мI��5�P���k6�Z�Mɧ6�m�=���+��`5�n���@2���2��~�Fz0�u�i��yN�	�NC	��yY�t�U��ev2��F�BmD�G"���keo7$N��R��ګW��Jß`E�����A!��S�Θ�f�����_-���@��ో�c�
�
��BX`
���)F�ˮ�~��;Yե�����s>ȹs:EWi���84�-X��N��z��f���eO2�o/+j:wpg�7�V���e���P&���0c���:�|4�ǕZ�d� �̆�!��V��V--�3\����H���zLf!���a��������\���ugW�h~'>��m�A����-�H�USӡl�*��? �{��/47ʄ*{}0[	�`�\�6�Q�R
���!�8{��B�F�i4찠�zx����alP}��,2���9D����p�c�KzT��]�\�	��u�����<'�
>�E
�����B+Q����;/�3�?\a�).x�UolH<ɊU��
`B�L~�zX��6�jjw�7&E�g6[-�AM�2��P��}0	���0����m!��'��}�7�G��XP	5��g}���R�E.���gh������7�	�*�ߥ3����,a϶��Jܥ@'w�
T��^�M�W֘0)�8^��B\�w�HW5F,�ao����\Z,7�~ċH�~�씁�̈́���֞����
�n�-�O��JGQ� ��g��S.�.>�ͼ&�4���zɮz@Bv�o�CYc&�?��僡��z�'�B�mt;s�ʶY��$So��Á49�+���5|eg��l�_�( �6C=�S�m�~N1τ�Η�M�l�UCX*�;)I��U^�
�I*6�U��&�	5�n:с�+w���ѱ�����R�7뻕��Q�zl[s�����er�߳a�_������B�,��O�d�&��<�~�+�
[�D�e=[-Y8����դTa1���*�[�5���vij��k�j�!�"v����ka��R�H���6f+��>�>,����E���� ^9/���O�JiB��(+�
��Z�����Uc�=��iT���Mk��S`
!�>N&�\���_^��uׄC �C�Q�r~��k����Q���>aDm�;�EoL���w$%���[�����4��=%®�H�q2*�¬2�is%diM�ƫ�Ô��+=��$[�[�_�@�wY����
��=�
A��vc���9y�y����	�)�k.} ���]�Ki��y+�4T��W�oNk����W��P�o�.1Q��tP��Bt�X�M�L_���A8?�`��M�p���x��\���2������pݚ,c��[���}qW������o�/�jcM3�NX=C�p>�?�����[9>�4���*����L ���Ul������<R���)xR*�9�ju9�a��^]�
�Qt�`�UYR2B|��
�#h���N�Bc��n��y$��Y�J%�oQ$t�o9�����y��8?A$���ͣ�K�D-kX�Z��ؼ��6.�w+3���
)����^�ϭ�o���h�g�.�B�4����j~��-$6�{�q���4�m��\�9�� �[ݨ���i1Wq��mIҩB�Ɓ5R��S���8�ߍ����p&T������Adn7���R��:\�#�	�֪���Z^.�t=��0K+�ڛD9SuӢ	�n��|��ï��z��0\�����}���d��}�3��]})�L�P��ޣlݷB\�Ƣ/�O<s@#��Q�iY:.�(~��qxQ��ِRi��h`�Pզ:�,�hV�Vv��E��)�x�
Q��R�q���!CI/%��~�.c��Qz󺜀􋙫���y�r�Dع�������ތ;m�4�Y���Z<:�C1�����Ɖ�2�!p��q���`mXpi�1*W<Ԫ �zF�kM븠f�S��/^Y-��~__��՘�u���g������޺L%B�_�ZE&=i�����$�4�LiL��c��vU��"7Hգ2j-P��8l����4�̉s�����1����E��!
}�&Z�.#S�bI��A�
����V������Z�BJYջ���	@��iWgI�y�v�t����`�6����H�\��P4:����ď=-R�85ם=ʞ����޺V������ �/�jg��Pa�O�>�#t�+�vUz7%��
�/�`�:.v::XX�>nf�Xv�Q�E	��]�
bA��9���|���_��9��NQ���:�ͭӕ��Ƭ�d�������kq�J�e7�~�������+���$�[�>��o�0�]r�G<�-}*?��V�`����/�0�/R��k@�|��X����p�����ǔi���ۥ��@����q�p0A�rp��[��ȰOi���Ď]PR�G͵i40��T����svk|�~�1]���eO�c���0d��zא���O[���Z2J<�>�skGW����C�ʥ��<x�K<�^桎t����83l+�c2D�u�Վ���ռ-�:V��,]��h��2�:,��J�p�
5HYƫKO��9K_�ܹ��j�=�3��9�������r��P�^���I��J��N��	t[���M��~��
��Ϝ���^g��^��q�aVc��h����P ��
��aI&�3��4�Q�2�Z�J��=N,b���O+-'
e�9�?���q�Ԛ��[Ur�Å�#�vg
ek��V0}����K[ۮ�$"D��{�R�#*���B4��{'%?�`�q��H��FJۡo��{z
��ݝŴ0q�/�ٴ\&�Kan�TxS��goG�h{�[���f��Kx~F���y�\У�Cx(���-!-GfF��o&R/"]��Â�={hH�F���y�ty������1�:�kb��N,[�����ȧȭ���:����������L����������d�n��6�-7��	�S	
��y6st_$�3^ai��3�"���'�F`W��']k�:T�!u���������~�{��pq��\k��ݭ=��[@nQZӲ��{~��"צ��89Y�	��)=�Y~fqx�y2�JFѬ�n�]>-T6�
h�h���/�]vZ���?��H��K�x-ĩT��*����r`���!u��?`�%����
��
#���:�y�F��$��`�:��۳�E���*���t��@�~Ut���M���>^w�%�����O+6�?�V	b[/�FQ�ng����JyCT���>�2�5_�ɬ	N�|/���BV���M+T�M>��>[��G�g5�s5UʼnV
��-���!$��c���>�/2��78z}h��q�.�h&]3/ٜY'��ċ_���V2��4EG0���O\���ܓD���7|�5�s'�7�2���e,����4��y���@���h�B�O�{�[��Rw�� �N��[P�$P|R4�N�7{��<BF4��&0�a�S;��@9;�oT�|?xi��b���ƹS00�^���퀄�ig���e��A���L���X1�a3ދ�����jt6�B�����s����u�yb�=�K~ws����-���k8��,�A(��<n��c}�k�&*E�<%Y�,�hgEμ�Y�49*�oا>M�owU����/��:�Nf�A�x
+�������`Hy	��9
�m_Ǿ'V~!��sC�9f'��q�W1�M��c�e�����uB���ou���yj3�0��N�kM!�	LD��!�
�F3��+��/���&��=���8&FLA�>� ��9�F���0�WWšlW�8�4��g�*0����Q�A�˛h)� ���C�y���Z/͖����&o�\��jz�p�
����m!���(�:�3��C]'�r�r�-��H���(���x�+���<���Br(n��F�}�90��r��)*[h����~J���$��=��*�5
1�p_�XQ�(x/^bQm����s͙�Iw,>9�XN�8˚Cm�%�	E��
�S�K�����0�m{Yap{<�

�
::4r��+�	K����aC����>�'�U��}�w��u����!��SZS�5S�i@�=ٍig�)���k�u"~��X-�����2,;U4(./t[e���D�[uͅV�)�̟�x�g��YFm�Է�=b�J��˯�!��d��g>(q	`��*SDy���.����t��L��0wB��k�:3�a:�5��]��k+aw	���?�%4��#���MN�7$��c)P�#�W2�LĴg���D��]�/�U$S-�Yܟ�o��O(�^�N��n.]��0� ד��[}4Gv����ݑ��T���9G�fyF��,�U1�|`ScR���b������u�0�4i[�\�b��c�H�����-���0ᙙ��6&s���H�����L�@GqR�����*2X�K�+�"�6���_��w�~�-�������k��/����*�zb��aq�$4"�/����(Ry��A�${ex�8�i�
�=��qR8�e}�j�%��*2��̰J��e�DY��RE��%.�	�d���ęy��)�epx{�;����_��~�9=$C+�V[�	;}�0�E�<Zg_X[\�݆������/nh?`����eu*�}j�ө�h���tG���^t�1�Y<Zῒ`%S{�,y>*v�_JK1��D�^���ܤ;i��+���ɩʼ%ة,���敔��(��>��kS��߆��9PGCO~������*�!*��q�7bkG�m�XH{���>���d�*+䍄;^9:7*����aaZ��˚�<!����hU���_E�U¯�cD$����)0����!������ro���P�%�;=P�M��:N��Y򉕱�dG���K��s�L��fbI3�H2I��Y/.�uM�"`B)HA2��f_nu��U��E����W�zF7Z��igBT]��E99"4�o��Vg@(w4;.-(�K64*��d``��E����xD��Q�v��t�/+,�N���U���{�hSk�#S%j�:�\L�eko�m�1isnN/o
�ꍽw�B�XK���MS�C�#9:N���)3pIp�̴5*_ϑW~��£�ׇa

	;9�1E+����DB��v_͗�t�L�'^�Z���Ww��~#87��aX�u��iǢ��bU��[UP�J���9���OWۡ�^Ә��8��[���P��`������xeGiH0�ۼ�$;i�n�YT>Bl��##�1�@W�'���#��=�$f��{�����jrOȵ�����ʞ�<+4V8х݀��s�&H�D�.Ѻr0��l6>I�ny�[��rq��H�'X�0��98���0���wٯq(q�zK�J9�nS��>s��3cI��z4pQ€�6�����jcs��
�w�z|�6���~T�kӕ�p?��]e�`�c蝩�����\�i<X�2[T�$a����!��xc�ڌ��~4$�ނ���灑����m�#�x���bPI�?� �-K�E���X�r�GL%��rL}^��
;/�Ÿ����"���YЀ�	2�N�w{x8�r�%���2TB�����z�DnZu���4 ߌ��a<�q�"EW�U�(jA>�������k����nV�r����U��.�ђp��7~����у�6T�C�$��HK.��ףz�7�ÙlFwV�7HXKǠDu�B��BQI_ͣAeLHp�2,@���8�M�\&#ʼn�j���v���xhH��nh;Y���Zʿd�֚3���j�Sԓe�ڤ�B2�#��N<
#�T��kCH�tYY~Q~����-�}�7��aW��n@"X�%���V���$��
N�W��	�����S�H1�)���`�+��t*���Px|�����NK7~_��/!��t��T��{u�3c1�ZƜh��ƀ��7�3�%�z�
�RX�|]-�&��,�[�	����F�LD(g��C�g�iK9	�!��6ѩ��ќ^u��l�@�b%d���6�M�e�dQR�/�D�7�Wsp�e7�bkk}-p��Q�Y�7c�0�\ooQ�Z�>���Y=��V�r�>I�>EH"��G�~߈�pU�d`TC�?�g���3�9|��h�̻�q=��.J%X[QE1L���يg-ksTX��Q;S����M�����E�5^լ6
b
Wi�:�/?&���N8�>�x$�S�o�*��2&00�e�v�l����)x0�YCk_a0���G��+L�b���
��X�a?�(��M���ԫv[�3VR\��/�+�_����p����G�4�Za�'�K���L
�aK��—�e2vz�t9�-�y�H 1U�W�Ζ�µ��S�[��VG�t�kJ+�)e�k^w�R� �a�N��a�e�d\�7���$�=p�Q��6�9j悧��,��	 ��ۓ]E���� �=��Xq ��Dm��I��iT/Ce�)IG��B#�qcjg<ѕ�RD'C��R=�6���wRHy���R� ��q:�D��.��m�7	^��\�f�U�$C�U��BC>�a�F�Onq�U��Z�@=�<p��l9�#����(��⦨���+m��3�Ar�*�N�X�%��vU,�Z�y�<
@wnnƣo
��)��(n���c�2AK�q?��ٲ��HH�)!�x�(�D��x�u1�5�U���!�b~yB%�'��@IL�59�'��S�i5�[��^j&7T��E����؛Q5��>�#��U����b����I	��q����SB�6�'M��>
��h�sSKD���D�du�y��1�C�c�#�1��O��?Dp>�&��3*�#���r32�L�?�p��J_R��V;�jv�R��	AJ�Dg���1s`� �?i�:�bT4�����`\=,�0|���&�gC�V�q�5��re��dD�'P�eLF�^p�[�ӌ��	��Oc�)-���HX��@珋SDS�9Η����ٛ��j���x5�ѣ�Σ�y�ʮ���7k$%c�a��[�9��Z�ۺ�m�_��\����v'22���iv���-.�o$�ޝAa("�ȩ-��p(z@v2m���勋Aedw"-]-U��h��j����8���aV�a���f�Ȭ'��~�a�*m^�M���2���a�WGO������
����D�J4�꣹��#��񑚯d��b����cJz�oȅ FbW�	��k�����mp]����ȟ�@e��
BM���s��r�3�F�]�����W�����@����׍��:�&���U��2�YnXi�u�5YN&2��a�d���l~�<�5��x�;�R�
'O�е��9�a����&_�A��6x��T�G�4y!��,>-�T���E��ȭv���:4�7kz���s�:G�_�x8�6�Id#��#�W��9�v�>ڝQO
�=��o���9Z�FX���"���\u�ɿ٪{��j�t��|k�8�toQޱ9�f��V��m�<��,�0��GE*��s7E�
�)��Z�t��p����^Z.J8��9%�}�u�Iq���o�c������~gշn���p��v�ֱ���}��šs"�U���F������Z�°��<��d����"��X�uj酓VW���7U�'��!A�j�u0��틖ˋ��V	���"��d�v6�e��["y:������i��Z[��du�=��g����?f�d�$,'�<��CFo�x���yI��
���V~g���eSg�i7��C���L��0�Pj���%
R����Es��ٞvn��G��&D9�N���e��Mvm���.I٦��o`�ݗu0�sT$o�{�b?ٹ��IxInCB{��~d������p.@#�m����3�9QG�\��%#��M;@�%�R���@[ٜ���ћ�{�j�n�����}=��r�y����Y��Ra�N�ec�&�6ցr�`AZ�A>V�)�ri{v2�Ѽ�eHuWDm0�u��溇x.�3�7�4v���SJ��T�б���MV��ᄶ��$�ې�ͻ�e��rW���/�զ���}I[͔|J�B|g�O��A��j�$+�Sk�5���o�=�ڻ:��,�k��(�L	3��S���-:�\D�5\7(�6��v����2v�F���sV�S���E��V��^�FI׀3���o����%\�O4�C�^[:
�����$Kw'��L�����s���y�qM�'�:�>ݍS/�tܭ]1T1v���2z3�M��$�5��59[�t\�vY!��_�M��"��,�ni��>	׷��Ow5�{W���$�'3ch7�)ļ�O�*�wV1��b#U�y`�l!�{+s�C0��Ot�`��Н[h'6�(��"㞘�ݛ��'6��Fy�V�����F;H;�ʷG�d[����y<e���n��y��Y�߿;�I��t���㰯�9�YIoYJ�s{5ՀU�dz-L�d>��%VD`�dQq�/Ln�oR�
��kG��"?���.�we��E�a �@���r��2��D��KG�߃��z��h0��Q�u$ �.Ymȁm���[�Qڗ��is|Nn/�P�^���ca퐓<�liZ	��Hj	����dx��
�^Vɩ��:jjC�\�Tb�U߱���C��Ѓ���4>ښH��$��zH�K�ta�'kFa�uj����;&;u7(
��^�;���2�۞�6��^;�/|޻���

��	�&�aE�{�
�_�f0�?��?���mg�y�iaN��a���X]�cҷFmZK)pZg_7���;�]ٶE��TT1+F�V�fŶm۬ضmgǶm�ض��s﹧}�����^��9לc�>z�(/|�XaI��#���G��O[�x0b3��Eq�c�@g]yc����_E0��o��X�
Z2�clY��[Ka|��)0�F��=0��u�ͥ`��˾��e�T��'���v�P����D����0w�v.�3���Y2v�n3�w��o?���zj����ׇ�%$A�[	��ڔ�����>��!��
a�|��$9�i�zQ�$
�$S����a��q6~!d
j.���5P�aR���%t�x�����I≽�VC\�pv�B�[e�ߋI�Ԗ׆8���Ȭ�2U�I-�e�p��f�
z� ME{m�eO$ҥ�r�"9�a&
��=������m�7u�M�4d����̚��	G��(�#��\'��U�rc�m�"��|ݤ>��?��9�,ާ�)�K5���c��Y�B	�*R�����+q���!�nӠ7F-dq�W���I33�D���D\��(T2�4?S2��}}�<�h�;d��� �����^oK�i��>��zZP/zGM�u�����l!�	�B�jƭR��>�Թ�7�h�B�
͊V��E�����p���J���ڴ��K���13H<g��&�1�I�2'�p���N?*��L���ꙥ���hg<q>���n֐�F�٬6>w�f��u�Z9�(&��F�,-��oA��7��qg�'�PL�N|�M
2�uo�Z4�ٱ��g����N���5���/r�Bsv�o�.ܡ.�ۢ%������ZC�X�<S�	����[�%aͺ���K'��]�DS�E�,aq�ɖ}��~h�3*��Q��}]�-�n��f��&����'�#�Ż���4���u���P=k8p�8�ϝuD��)��!i�ߗ����ڗ�,J��a�k�w���C<����Ed�2�62B.P���y',�7�ϟ�����o��eG���ӯ��_��؀������rӷ:��XB���k� ͷ�S�
�G�<�>�B:ZH�֚��=�Q{�:����i������~�\��;����T��_�h�#&s?ǛOr���T#[m�t����*�I=�Ny��[���A)ٍ<?�1�6�,q���\�w�Brê̫����B��r�[�� �?w��;�K�Cr�_�*�M��6�]�%z��W�f���4��&�(��]dE�Bk^�w��3&���}��Rt2����ѽ�"�T��>���'���X����$�sP
.�6��
p���� �:�4E����K:`��-��8}m��α���11p�p��H��b]�huu��#�����[�,w&�'�X��ܲshƷk#"���l��}�f�0�����ɏ�e�����h��f,����ȁ�k�N"�>0������o@������W��֮N8<�|^%U�y����o�IY��
�#>1��C<�!�fI����b$k{���$��6�����j7�@�ʊUo�%A_�5�n#��Ŧ���[��L�OW:aa��>�:�w"�dJl�������?FMA]Q�L���j���P�t=��[�N��e��ڵi�����'^��ޙZ��<5p��T���V�t1�,��)�pL�����0	���1�A�UT=��+X�u���<�$S�?�甡�y	�"��Ï����O��D4��K9�Q��7dŽ����U7�~��8ɜBd]Ȣ�F�Ӊ)�?��o�$鿀T���@*iվ��_�
����#}���N	⬫n>V����ނ ��[>���O2-[�3+�rg������[J�Z�B��4T"��e����Aʙ���H���l�W=��R�s4�B3�n=t̨R��:��`���*~��v��PX��:�HO��Q�@8�v·�-��!���֢2���mg�㢙п���D��VT���I���͗��^����
Ƅ����G_P�>���Y��/�v!�}�CC�m����C���W���ӄ*���Vk��1�B���I��p�mj�Ѐ6���t�V�	�Z��x5{���_R�>�Y�:�������9��X��'��Z;�
��c��rߩ����j�X�����30��}�|譿\�⴩�y����g��j ˂9��~�Q�dXmՊ�^ =���83��y���Z������:4�*�gY=Pjv_����k�qiw�`u��`m2mϽ�\N%��#����*�/iôZq�W�[2u�A��Ny̨��Gc^բ1�U@I����7Z��ܺ^M�{����θ[��!\��-=�w�\��*�ʼ�h���F&`p���l:ԓ�;�!Z����Sc��9q@�_k�Q�s�d%!c�P4>h^�OȿD�}z<�w�~|�[n|��tm����a��t���[[ۣ�9����3��H��JH9&�Y�3�7Ci�<…B�	c�����]Ezl��� �8Y�r���F@�R�IJ_����G۠�e�
��ll2_=b��1�L���E�g�J���kc����71B��7ގ�b�8�3PB��wG���Z���e�-J�o@�E#s��X�@�'���I�
W�r��45��,��:'���V�l��4���_%�c����ݟ���r=�$�*�sFz\]T��|['t����r���+�ׇ���+2��M�'�y6>�����4��f���P��W��g���3Dj�*��)�2)��W���ۥ�[�l<�2��d���VԤ�A�>��%�t��[��ao�Hi�^�'s�7f��k�[���T.�:�O��Y���%�e�F0� �����:��N��nV�1˃r;%�k�������tA?�B}#�)a���@^n/9{�e�ư[��:��ދ �����,{�u�\&J�h�T�KH��w�\t�L^�ǭ5Rbs_��	�>0���oJ�
��Z\�D�iJ}!ӵ{��76n�<��&m�>ۛ1�Ɉ��}\h�PLcnW�)ɾ����]�}r}�nl�ܠ�sC0Jd��7��o����è��'��G)I01�l�X������\�v[�H�ĸ�
�L)�<�������ϟ�,A�T�t������.]$h�6+�K�^�)f�(�������].���&'�BRt4f���MKT��;p�jSUV�u�
X����э
��	�����lnO����m���P��x}>���T�#��2�W�,;�����x|Sgm_�K���v�Lg<���1A���c o(9U��g�QI|F�O�a�v��W8�ǫ!�."�^#��U��c߰��Y�+��!��6=Q2���v���F��?dx3�;uƆ��v�D��8.�0BO��|4�,תGܜ��[����
��[]ظyj��:f�l�WrqA�	&-�
Ӣ��3ٖ����F��<�
?��*�+w��I�`�5#HÂn���s~�1����-;#���`��1�YQ�$�~^ud�nA���Zߐ��D1�]�ؑ�M;�}@s�.�	���#�'�E_�lm$V�I��3]UA��6������z7ؼ�߉�^���װ��sΜ�`�'؆t�ɲ���E��s���h2�7�Ϗ<�Q�j��2y���_���)7Q�]E�.��T�n{�#{�jj�%����cr�5�6�C�s�l��"𒤸�Ɲ����m��j&RD���t]�N�Ci��8�N��E��x�vt?7�5ė_G�^��Ky�YAWs#_����)*�N/#���n���
����cD�C�;�1}xN5!���n�&%����V�ʷ�`��]Fw�����k�MZ����� $��T{{�|ФU���y&��@����yU7�q���=�Q 
n�|�\]�Tl����ىX0�S0��Q�p��E�{Fx�\�%)�>ϙ�������Ƚ�}s��Èd��=f�Έ�?�����o��4n���N{o�-Z�F���'q.�y�Q8�k]�@=݉.c��64~�q�ӿ���%04�*,?/t׃�-U��W���)�P�#p8����z+^�4�m��IH�e�>ܟ�0h��wl؉�w]�岽�u�LJ��'l�T�՚˒�h�-���5H<�
9�ι��e2��ϳn��>����RR3j.x�_�*�+;�,(��X��oZ��_��
���.�P[	ܢf|�lTJ5��ض�v�S;R&~���j�{~�P�7�8I�����Lk���x�|��������)��	�6��v���4wÎ����=�釩��Cn\��b���".L���Hk��A����}i�T(�OXN���¯W��]���1YP\�p�<*��x�v�C�̂�33�I�N�g��R�.��O�:��N�:�@PĪbq��“	"}*�(�M�$�W �ˊS��7.�=�8�L�]���c>����q��YF�C�h� �C�e8>~�^�x�gf��D����������*�4���E�ce��w�ڟ��E�NGxR�j,���������}Ϳ�(gz�K��÷g�c6���"��C�	��1�A����(����P��.����%��By5�>��66Ab�U�i%�?�|�.InÖ�I��"k���~{~�A��Dh�$����/������R
��hb3PX��J�#a�0�~�� p�l���؍;��x1�3�I��;C�!>Pvk����"ƈ*3&=�2�u�����A@7g!��RD�4ު�eJ�:l�ړ��븶Q��µ��w�$}|?��lw��.Zp�9f�4��'��p�'�~���eZN�U�o��Gm�d�,�yй܋xJ��f2<�V⸒AGw%G�#�g!�x�c+���r>��L�7_���Oˏ�ǴW�}�a&닽�/;��9&a�(Ovb�vA�'�oS������e*�fV�q�@&��W�_Yh*Jj���ft�ݮ<,����g��q�I>�D�e��q�ddD�e^oAb��c�,ڜ�"�a�K��ǃۍ�c�2m]LU��xQ�-����h(<�6M�I�1Y7�N�W��ްm�:-
_2pc�Qa��`:�����Eo�X�l�����"I2��wG�y��G�놽wO=-ߪ���t�kR���m|�3D��X��n����\��)�I�[�!%ժ�*�����F����\�\H���[�ǮΩ��S=�.�^]����v���ͱ�t�$���jW`V%�Ea���ߢ�;��̧���G��k��C�-�,{9�W��K�E�V�
(�E�I�M��]o��z^O�H�Y�3%�����
�.i>�S�Ԉ��D�f3R�0D��[���R�(�3���.h|��>�UH�m^^��WB�+5�8p����\��
��5�(��A(+��Z��W��ج�,���W�2}����ժm��:9w<Gy,�tJl�v<<�%m(�jS���g~3�.rڿO�7��^�3�Bׅ��k*t�e�O���A
�6̼Z�&Ϩhأ�D&Y2�Z1�@ה�� ��.�y���/f�n*��Jv�J���P��SϾ��ڗT2��f[�6���ѸZ\Q�����8~g��9�N�(-�-�Jœ��^��c��hk=������(�:�W���E��ө�П�&?[J������0Gf
B��J�X3�l�*�=xP�D���=�vk�+���`M�U#�U���C�_���D�� �:V�jy~�JR-j4t8I%a�T��Ƽ~��7�0C@�.��1���
��A�ȩIٯ~;A�����f�;;�Q�Ҧ>��Y����b^�u�����ZR$�О&

LS��\(�oL���_Ad�h�/�S^�x
b��gh��y��U��L�BՆqwF.:g����>��}x��k3����i�9s-ф�*nR�����,����X��bA�E���[�-�r�H����dW��tQtK�HQŽ?o�>s��"�)˺����{•�{BM~���J��;`Z��l�$�����z��C`������!xu�oo2�?���wП����dȰ�B���'c#��d*���p��,ےh�Ͱ^���pW�l�;感�s��o)B4�f�E�͆i�*9���6le')�X<4+efR�E��(��?��Q~|ms��Rnv݁�r��	�ZA@�q�ᢅ+���b��Ȁ���y\�����E�y%��R����t5X-�
�ն[S��n�͐�>�ڨ��&a
��#�lz�"K����iyU��3=ݐ�wgfٿP%s�f�}���D"y�<8[��ʺ�Y�ݡ�v��D@���^����$(���V?,�.Q��0�V[G���ب.�/g�oX�V�Cj�~濂�\��/K�[zQe�4��}��"&u}�"p#bgLo��-�:a����#TX�L�V�'�X����x��q0,��}�?O�^������c��3h�0}2��L��1�8�0~}���&�t��Ytf�J��]p�I����V�ρ�p��u��⦈�� �7��q҃^@�a �S��ح)9�-���GKm�1��zBWa���1���o��Cj�E�h8����^_U
:�\e&�E�V�P	��Kqo��yO��l���R�})���	�h���U�ȻOҏ�R@��%~�F9�e1��4!���hG�{<h�����
P���!�v:�D�����6yb^�e~f)D0���⛔��%��s9�����+nj�P�/��H�m�U.�/6{uZL���3�{{T�������c�{��F,�YB�/�g���+��n…2">_e&��h	}Y�WHH����
�)*/�99���>��2u8n�&i���b�{�g�1�TCҷ{�������اRh���DHh@)�̀3����������eԑ��&tT&�����A�~���?��k�����a�*��Xq���$j�O-+�)����h��̤(�E��Sg^~�I�ݗ:�����O<�y��ck0֏[�T.�*����s�P$Z��V���Ȍ�!��%IxQ9���2Y�걌����H41��i��7�ί�M�d��6��{�j7-����B���Ϸ�7�G��
�j�]�3��Va���sM��8�p�i����J1���6o:ߙN�`r ���ŌpK�+�])����Q[��]���ʱ��p�H7�x�!��J�V��T<����E��u��Y��ۯ��f ���I�X��W{�2�N%ۛ��^)߷�]�i���U�g��EM��&�.��:��aJdL�R+�_�1?��$�-9��'
At�~k_�̙�Y;�p�	��덥9N�t�jı��淏�Μ��&�l��>v/@.(W�:�L3��\�p8
������q��"ʚ)0=|,[���2�HZ�v�,�`��d�&���hݐ$�}�Q�n��t�%��;Ϥ�[�0��-.��[�����C�?��e-5΁PA����tj�W _ޤ����
u_�o���S��X�A1)T�����2�D�i�H	6;L�^���ɰ"En88�ڛ�ޝ�~��c>I�(�B�ܚ)��Y{����M�6�����r�����3vdO��]��#��ɲn 0s�a�CN}2s%:b�4�u�Td%���'"�BVO���/NA�2V!;�g�	!�G���W�V���
�J}j�lvY"(�
��˦gG
���0�8�S�P.,"I�"��
*c>Ѩ-���h\��o�����.�)���,%“{� �G��6�v[ؙ���ҧtj��:)-(�6���xnB5W*�ʱn�2�SҞ�G�Be��`y��?�/�v���h��ar�ێ��=|�5�&�A��>��km�4���V��z^��~��F����2@9�sl��@�v}��-s���7�*9��z��R�J��N���ni_�!Ӧɓ�����J�fW���i}�R����ʍ�d��d�lz�8�q���W�n�ڐV��k����?�
�pr�f��#�����Ax\L-�=A��W�FV?^�l&M��i���$wC�(�/y��v2�z#�t�o\�m�"�ֶ��K��N�����c\p\	`{.��FhVc��-�lD��6�JK��I.�wc0����_�QY)���3�x�*�&Y.RpX��2��	��E��ʔR�[���(vҜ��[��:�T�����kޕ?3�Ony�w;
�c�cQk��[�C�c�T��@�hĄ�h�cڤ��*F-��{
aV�����j�uNsB+�A7E�\Gí�u�m��A�^p�G�2q+�-kF$��Q���!9��A8�CR�Ĉ����(��E���2҂�ޢ4�
W`��*�	1�÷_, �/�[��1�^� ��6�K�⦶�
�b�<�o���ꊔk6er��ݏ�Xc)���!�I�ti4�`�4��MH��N�_	�����+Us��^����BP'�Fc���
���ٟD���G�\̎3G(��Э!L@�J���	f���K��	�U�P
 ���/��LF��G��ެbY#���4��"Gҍ����aI�gW*����_�sڅ@�����9
�F�'ds���O[�[��Dv�������%��D�}�s�Nũ��1b�Mcψ��[w6O�搘�p�0��|E.yA6�$[�Ȩ�|�׶���[�9�g�`�g��n"�I����/�x,����b�X)���E�ʗ���<8e�+�$�<ss��T1��?L���̞�Vi�v��ƒ}]�v����RNʚ�QE6�@��r��ٌ�jL7��D�~����gN=�r�n/1h���DS0�B�Ɇg"P���$Μ!ӄ=�~�j�
�j��flU����H#�����@1��"��$�"�9}�µC3�E�W���r��1�fŮ��0�
6䄢���-�9�]m�[���%
W��O�)����S�H�헒�$\�Hx�p=�����r2c $O-�qV�_�G�YhA*�"�x���x��AL�m�Ej<Z���!�5�Hl�A$|I�IV��x �)��vJx9K���`��I�:
��\]�����窅��?������CE����K�5c7�Ѯ}`��ĩ螼1�=]�R,m�?�V��V��k�����j)����SNE���R�L�����?��F*(���zr��B#UiQ&1���Q�u<
����c=�;��nE]V�y�zh�u������$�l+s1̩i#џ�[��A��p����cU͙`c�_��["�~�9��j<*-!�U�[	���9043#ڸ��
����m�k�gX5��㘩X�m�ꂦVӈ���]E��TR���>d�tf�{��ՓH�GݒR⁇��l���^�ܴlhZ��=CCp"��?��1'�z[R��uU�Q��v[rb����U�Ե�4�t�&�Y�u̵�#�O�]�˨İ�/�L8������Ѯ�g�]M4!+�,����8����q�8�y��^|ؒ缪���(=�2r=9-�X���S|�0S�S��'�-�w�{�0\J���G�ޒ�Cԅz���4A|�<^/o���;uG��_�x��i�-��`/:M9�*S/"�b����-�����FM9Y��L=㐐�嘨�X�颽D�v��c$\�K��vu+7�i����l� ��iu17��WJ������B�	�o/o3*�il+W��$��cM�(�f6�d�V�Ǜ^�*��֑W`9���3D:�S���"��)l�}+�>��!f�%������%��"�}��Z��a�0沐�T)�;��V��k:�vQ�Pf5�􄰴G�qai��mu<���ؑ9�o�!�T,j��EG#i`�.^a�X�D��"\�����B)�Ѭ\%��2(�G���S汯iy^S��B�=#��SY�[5���b}{���ʩo��^�ӴA,��o��9
ћR=I'�Y�}�V!Z~}�Ͷ'E�	߂����Z�39�u4f��l$�u��1б�x�#D��LŽ�^�j^��� bn�%�.�3�7K3
9�����9PY�o	�����dj�F�īg�9}ZV�h�5_�6~#�+ �Ҳ��!w3k�w�"�ɱ��U��^J\��T�@��"?�&��,�&x�.�r��wƋ"�Bh��jZ1�B@��={��xq�M��Y� ]R55�׸����}xN���&e|�x3��>!#snUU}�D� ��Y�7���\C�a�[�9ӻ�~����uް�Jt�Qiv<�Dm�y4'	���m���fB(��=�,�&��m�\DzZ��F�B���M�P3���^j
��Pp�AԲ ����^}���G���&�_�v����@-]��\�b��N�v,�H:qM+2� L<;e�1�澓9������85��	�miWHN"顬��?���R���bN��陡+H�rK
�2w��
\-4�o�U6O@�*^'��=�
V5o2���LT��*�	��8o�U��b��*rB����T�VC��k���t�T o!�6�fa��˜���&�gWȫ����B(2�=ԛ�w!�i�%>bڌ�׃<����L�i�G�k��=�f6z ����;D�c��^k���Oy����S���"��u��m�W?1
h_�˴kf��O7����`<l(�:=*1r�=�#��V����ܲ�%}X�u*6]����L��勩�N�ұ��!�g4vt���4����)�i��F����?M���fD�U���g�ܽ~r.���i����X6=��5��*)U��3ϔ
�1��Y#�Z�6Q�CB��u�V�>Id��\kPO!�ۡ����%Q������t�-�C~~tL/�ew���H�"FM[.��H��p����:q3�)�ݿ0�Zh��@S�@��@��l@��\������+��4�-64�J�&�`�䱿�Tϫ��H�-y�ێ1Ϧ鶹���ߪϘj�{�� ���Z���yr��9��<s8wQ��\H�V=�o*��y�[��
 ɩ	���f�V"�̖fG����.'�vP�]����^/b3�2K]��*uJBJ��A�B�F��z�!�P�Oy��z.bV�4�	�q�-�jc��q����z�o��9�i��R�ۄ�ը/2�n�n���N�}fI�7�z����櫾�����+ۈ�azZ匢u�iD�e�.��"h.
8�켞��h��z�2a�^�q�j�̖��1�M��?�h
e?��Pw#pc����/7|�=FQH6a字1̌�N�2í����]=EE�~R'�
�V糌�[F��:HeƋV���.��.�-Zl\���J�8^E�?��rG@5�PggƮ)�r>����`�@�"S�G�$�5��.�=-qbm�����
1E@��J�Q�0�k�Œ] ��w~M?�̽#ȏ4�Ц\ @ie�J�p���Gy���iS�(D�&�͜RM���
������R���-���P�J�ZEB4_����6Xf�Ȁ@>��=��×�\�=dZ��߅�@'� �T��8�30�%��؟\��Hh��m�Oc�V�O�ɏ�?^ycg%����B��B�Ov����]� ��i�x���@�R`�rQ����~J���xtS��{�+��pU���9'��s@���К4�j���I�_��@��V�>
��֫ط��c��(��"[Z0�'(��D���-{s꒞Pr��k
@��[竛Ƀ`�Y�7�j�-#d�~�fd&Q;��P1i�N�x�e��V��"�,l(��cf�1����~2#惘���0-�8�h�̧c_�:��X�6�z�껶|S�œ�&�W�D�,@���ך����'�7=dʸ���ƎP��e�������c�7˳�P�#߿�&�Y�t|fe
��g��ʗ�EO�T�����?�c%�etS���ɖ���*�	q��G��7r��{������עÄ�ϛg\�5�E]L��
n�ѱ�V�f��T���|��!Q�s6�DGmQ��H�I��Wߕ��M� Zv�B�MArX]�#C^ʝ��/'���m��0�]ᖢ�
]+~<Y�yNH���p�>nyS�g�2@��;,����qop�+oVTe'Uu��W�<�dA���X�vDeb[��◨���������r�����1ҧ%yb��yv���9�Y�
�:�w�����m��!~�&�����*V�0%�8����/���S'A��]po��b8�_��~��^���h��W��n��9!D����[�r�Xc0: Ep��K%%�y6&��$BX�lOɦ���D7��.�2dgxp�$���X�$�4C�׈~R�_ʱ=SCp؇t�z�Ể��]����K8]�TuId����7f`3�Xnx�cΕL��S0�;��k�o�B"B��1�`
��6�fl�X�`P�D�3�Eg�r�x�!�8��CxP3\Bd�Y,�+ )Լx�rz�k$�������5�y��������:�ºU�
y)&��,�Q.�|їZ�G�)���n'6�cHg;�T)L<�f:�b�u��	��*i&�W�6���l<���|���n��h���<�q�t��M�>��5�a��
���_�@!$#}�>s��
�o6��a]�$���|�W#��\��TAL�������^�c�(����q�b��s�����Ǩ[��/�}ƶ|=����K��(��������Œu+/<vSE�/����W���>>I���u$$�	Tt��:G�,��[�B/�&��_f_�٩�Lw
�o+��|��5ȼ�P
�N$�������Ј��I3��~����S��V�ǧ;�G�kC�-h�}��w�s4W��ۇz{]JQ�]�!����1\j%�;zuW�"�V����
L�^t;���:���_#�E|�������X�{�-mf�O8�i]ktd4�����Gi��0@�C��GyV|P,�g�D$O��l�Z�N܇)�ϋ�5��,,$���/#�4�~����3�U���"�zO*ȩ�`��+]hP�]���MS����3wB��1`����R�tyK���5���6-���L���Z�� �@m4ݣ��W��r�������]AV��"`ŲM�^�V=��G~��J����(��%���	��ό�\����ݯ�x+��9�Բ�*�E�}G�S�y�V)���ܥ�R#��!���ȝ���V���>a|�	F�\��A�ZxT�熒IQ~�OA�D 1���_oZ��)���i/rjw"��hw�{��;�9��*���,�M���
EU��Th�ϧ��MJ�ɼCH&r�4Զ_*_�o}��m��k^$����y�'kt��Y�9�F�C����<�@iR})>��މ�wu��S�V_]k_��j������n�wUƿM#���w
�XD���{@�q�O�����k�j��C7b�:���%p�s��Ӽ�,j�{����_���	��?�Wz``Y��H�,N���u:m�R�d�E����l+w�]��QN�m�����1ѕ���i��/�ҙsπ s�5�p�װ���}���m�2�m+<ZiXܚ�4�}�f�w'6�'\j�NoEQN�IOU����U����7�D�;�,�8F����+l�X�����Mrb~��ڌCu(��4����]�)�xDXKJ>'歨+w��e�X�$���PRR�)��D��
_J�N;��T흤s�h��=��(T�zK���z����?�\D� �9k��Y�Q��֑9�C����Ңʓ����b��������C����J�FTw���5`JRh\D�!�Z5`���ӌ!h�*
=JqC1�nGv���<�$���FH,X`��ڭ9����E�隦��;�h����Qtv�l��+�(�aU�j"VS�X��,L������p����Q�p��sά/���$I�3�x��^)F���HD�H�4�|�|Uލ�Y���C�y��<�<=�e��GL||=~��&�|/
+!X�pH�]=W�D~e���#�ZB_6�Q�f#���D��������j����..��y�_T+t0�{�����^b�x(�Q��S()E(9�Lj������m��>؟��}E1�����I���%�ٔ��:�0?�r�G�:1G]�-Q�*��;L�a�v�Tׄu4���	�>-B���&��5J��9N?��\V��2��awD��2��o@.�N>���pO)�D�_��r�(�D�G�ek_I�n;j`�N�=���5eǝɒH�Z�6�n�$`��BhR0[+<-׵z�q�c�j�ƒ���w���?˫P�_P�Ц��7�5��-�#�T��f!e��pj�h�ӿKQƹT�y>����CW����[�c� �#���H8��}S��ñl�j�
v�B�P�p���&x��c�3 �%4\R�����]z�@K��^��n�n-���#�.8�+ʝ�~n�E�KE]|�r�!@���Ȥ:�U�U��j�{�q�����\�t���C+�ݬ��=#�7���2��D�J۳{���=5���*�v*�J��d�ЁW�=p��9����}�W>j��2�j�E��G�!�^�w{b��n��1�V�u
���qŎee�1�?^��u��|F�pa0�'�O�}�j�3.�E��]�L���
���'�����&\\3ʂT�Y��g;�j��2hoBr���z��Z�)��
m3O(�����ENM?�s�'�ݢ�˟r�ֆ�URF�"������嫱��/jU�Ig�PT
�$(S3G�>�0��a	�nX]����8(�_
(0�9���Hj�9u߿oݠ|e�y����sؙ�>��ֆ������0�<�r��p�E�{~���-б]��Gb�'�V= �u����7	��M_o��<j�℈�#��"�Q�'��e��#C��Vqjuŀ֠�+N,�����2���
�h9��ZU��.���k�{�V�q&À�<)�ӇP"|���Yþ�7B�q>MI�	C�l�޲�o�>�pذϴFH��O{;f�]�[��x?���)�!sw
��G;$��q�Le=�y��+B�1E���@9m��Ua�l8����|G,�I����7M�Jސ�7W:��C9i+�r���I@yM�'ɢ�	��Y=(�B[&���A�F�!��<Q�����]���Œ��Z�����Wn������rY�F�O	$�*-�ǵ��P��b��Q�d��e�^_$ado�k��G�6n�O�tda����1�q��Ŝòf���FF�,&��q��>W��a���z�U�T��Bގ:1+���a��{ZH��f�yqW�PO~5�>��$�\Ϥ�Ͻgtk��~�

$�=Fɢ�)�� �`������gk�7�6|o��G���[BJ��ۙ��I���hp.�e[<-��������Vݭ<��� 0wƊo=�4何�QD�.��5n�v*�9�����&��Mg��lt��I��6�ϗ/g� ��[��>v��o}!ID�f?�l&��kuI���ku���_"�����
��d�90�^2T���PV�vV2�J�h���T�Y�Vb�~�E	40�N�r�z���h�~':�7*�e��������&/�z�f$�n7�=46p��4F��#�*�#8I�4�l�88ُ?1���k7�?�ϩ���C��!��?9榴4J�sDK��������ܚX�b�ne���.V ��g��#T*ɪ�8���f_�/t�%E,���Vl�E`$�$%�n/0��	�y|3�}����^�9��C��h]l�A�y�S�3�<���|�댁���f���I�){(�Q[�:�����4���X�կ9�`�1�ƴ�_�2ٛ��?es��jk}=e�����.�n��s�p�M��7l7���k��Cd��Lw�u�k:��j�!���C��yfc��S-�Y�sY	�wDYx�ԕ�7vg�h_��?p8�!}�3�񚃘�p#��zD``*۶:sD=ߴ��Z����[޹6i9ɔNIߝA֭=?�P#��nh��Z�M�����d8&j���r�R�5�/�O[��˲����?{������pP M6<rI��x���G<J�Zcd\�|h�z���a=�1al�iʓ��s��o���P~�&;������aю�0��|�+�d|�Σ��>k{�G��s�-�\?����b����}�pz��p/��׶���˳ʳlܼtb����ߴ��R��e��d����]���2zg���,*��S���?��5b�<�K�!�aҘ�TV%0�ي���3�f��D?,����O�i~Q8}IP�q��qej����U�"Xh؇�9��N�<�[�����QRw{�}����9a7?a�
�;�� �6}i2��0	���\��.<��x6*:0�rA��ٯhܚ�8�21&.������2�;�
���G�E�jUJ��P��5R;f�H��'��B��M��"F���TB�jČUԊ���ʳG�~�9�?����ν��;��_ҥ����@�p^�S�m��X͈���s���[]%�Rl$��l1,ۿ��l�Յ*���p��`}��<�v���J��J�A��)�w��P5Pҗ,��L��?DQc�'�Sr�L�a_b=_�,0�[���K5`��?�:gOO�ۅ��/�
6^�c�W�ݭ�`�y��|aX��x���uU���ݛ�x�274���1�a�'Qz7��O���l��ϨU��L���v~�s*l�U�a� �kG茰!聆ׅՃ�;�B�1G�[#���A�"!�U�h	}���.K��Ex\���L�M r��dM�1��U�9�[y�s��Q�����h���v>uW_Cz��%��?:c���"�83�`��1�Ee�
����c��.��epݡ�Ӥ��C��k����;����ǥh�o�t�}��B�Cn�Bk*PZ�a�G_|��	�綋j�׋�Cl��%����p��G�;H��)��ޜ,�;���H3���+Vt#��aוRTtv�kl��u�]'g��>%�/1M$$�-�e/�!���,�{�,�`T�RF�o$����
D�_�G�$R���	�w.^p��isR�v
n�#�4�.��B�x�	�&y��B�k�#��^
�87�	��NU����JWw]>�-;�1�;�I���D�^[��7���ҝ��𬌆P���_�@����J��
��~�Ts2�����5�M-ؚ�u̬��V���:0�,@+V�9�Q�јv�v�����Γa>�)�bT��1�r��R��:JNT�E"R'R�ϰ��7��׈����?�dr9:WMK���=s��qd$�7�Q�vM+��yl�;j�ֱ�'tS�LA��t��p�Am����+c@�:|5B���xcgـT(���
���Y�DK�	I��jy*��MϜ�+�uQ��N��}�m���&�pO���|�J�I�% ��s�.��	������a�W󷙏v)h��6I�7�iI�����&�U���^K���ezjs=��O���5Y^K�Y����hSK+ �2���xL�i���J��Z��x����M2$�(������o��u3�u�CW���5��w
�Nl��m9vG�(8��
-��w&e$�k.�2���|��2zՓ�'�6$w�Ԫdr���z:�
����D�����x?���Me5@ژ�[��4f��l���-�{�e���!x�o�
ɑ����(K�u����7�R�hj�উx�m�#��\;�dʀ]��t��1{��+K�G�o3(��y>��s��T��.�P�!�j��tz*�S��:9�q�1�2�:}���E�2�z��#��<�.i�+��yhƌ�ڜX/B('M�32�e����6E'�L��)�_���bv%�?��f�z����P� ��UVT�G���v��/1�%9�:�T��^!�q��
�q$��<=��2���V�%~�%Qm97gX��R��U��}�v��}U������T��{���mF�Bi�R��u�Vɚ/?��$�sh��
���a�]�?`����1/��c�V1������>Y�υA�:Q07�h
�^[O��u�s����l|���)B൅J�-�i���q��%��e��F����4[�R8)0)\���u�ܨ�JS�1e�	��M�}�������\�2%t���?�s�O[�@�ѩ��"��	�+ǵ���;ʟ�y��|���rU������J�4И�Z7�!d�,)���9�)���S��w��p��K��o�z��O���Uf��ڂ[��rQ�G	��yg��/���ٳ�/?O/���:�t���Y:�
�k�Ng��=�k>k�й8͉�[�g�~W�,
����~�is��M����Ĵ�E�I�l���JH�i�A�KH��-�&�q���.+�r0���%��E�h�G�ҳ�\���o~֒ˌh�kK-��EyyPu��_r�@늉e��B'Bti=2��"�\�3 �Ⱥ��z�T�ȗ����a6Ͼ�4��n��Aօ��M[�*��Q�~|��K�j0�:Ϊ�M6��<!`FL�N�/���E���Ϣ}ɰ׵����#����G�t�p��*�[�B4�����g�e|y�_���y�{:����a�OY�'��������[s5�[�8y��u��y�E�r���ڞ7�c����;�p�-������!� �P��<��_��{�~�T޽Ø���I�p��M-��L��e�3���K]c��X���x��X[o�6~ϯ`�
��^�:k֦��,)z}���)[�Lj$����wx�)��Z4(j�<���r[�P�#��)A1�+�d��W�
V���I%z��e���tW2J�t��%-+���{�4 �����_�7БXtQ�E�b�3��wI�Z�U�,����g��'z��i_NSC��	���:����#!yN7�h�?�D�.߽_�\��6}>}>C[Z|�UJ���?�J�	;�n!���[�J,�@��z.�MN�:�$���ݐ�3	d�F���(�]��HF8�)qYC����\n������Ӡ��b�2�CLqQ��Jx-��^�tKx.E;�%�xg��F^��WM�Y��-�eM5P�D�W���,���_�|�Oj�i��k�B(��|Q��ٙ��g�x^��#������	.�c�R�EI�fyu�$1���l:��lgc+����
�ݴ��T��2
GWc`I%�jFh���5W&�����qd���,R[�5?'���%z�����|P6g9%�8�Џ8����;R䖳hT��SR���K1@F�@��Qd�F�0�(,��b�묹o�|��9Z,VR�]�@�Ր�CEFtl��b�}r���F�n�Y��8Y�D
'-��Û���F��+�!�a\�I��|U���v����-:-;�
��%"j��j	�qmz�vS�k�᪐����!+�X"�eU�F�x�{�n	�8/�mA:k��2�_��ZÜ���N��������6��Ut��&/�d���Amb�#|C��|b��z
X5�Z@���E�$��4OI��^��S}`w�#�Tۑ?`\M�4�gh���Qc
@������#͇I?�!)|�دuW .�C]����o���K��A��@wd�T����ET]��"C-`�̩�Y��?i���q�C�ՈC�_M�T-؂��7��x���d���|�@����;�|SY^5z)�M�N���@�p:qg���A+����1k,1�B����-!��BX���9'�V��9$�l�������t�Z��F���z������}U8�|mSF�Qo�]�t��PH��G"�`fFz{�мh������d���#���wL�g�v
��>�U��?���F?a���#.9��Â�ޛ�ZLk岴	��>��K-]�{o�3���l����A#0��8n�@��"n���k�-�ES^Kw3~�,,eR�!�Z�\�:���?�/�P��?�rZ�y��k�v\�̑�W���-+7�V:=�y`A��XC4����r�w�c�]�L�<QQ�~gC��v?��G~�qN�ϰ�Ǎu��$�bQ[�#x��v��F^�kq8�����-���z�8=�܂F����3�l�^��w����	]WT�>�[������#��	wyY���?�>tO�'�80�?�=V����5x�}V�oE��Ď��W�6�$u��ֱ[���Iܖ$�@�Hڢ�F���۬w�;�8.�����WZ.��+8 āC/\*�NHP��x��������7o����?ɿ�>^z�9���^�1�g���5����z<�Z�2�V���]���{Ǡ�Ċ�o]
�������O>�I�^�FT�d��A�{	�b���\y�]����$��L��OҪ�|*Wh_M:��л��Ԫ2|��	UY���jҢ��&\�e�0V�;-2�t�4J�4|g^w�p/�lwo���h�ԉi�jM�P��;�tmmeQJ����R$�?�;�٢cN�B(|��e"Ӛa5�V
�V��z�P�j
��	x��M�[�����f;r.r	���Rh�Ǿd{z����7��4?�QńG��g��rkm����#]��4��g����l)���t��[0����T�liT	/�b=����:B4�����U���p" E;���1Q;��x�Y�T}�T�%U/Q3��߻�SWp ��];˫�i`��
D&qw����R4�}kS��RUZ�^҅�#`zY��M;�[+�I_~�k
�ߖ.PL�5��?���ƔҾ�ر/bR�J�u�M�V}7��[�����ƌ��[�7vN6h�����>�3|ٷ>�qR[Gȩ=��'_���I\=	��&�*b}?��߁�F �#�����v*�������tA�(8���j4���a�D��De[�i§�^�4�	��+�^��L/�I*'k���)��rVӠ)29I����9"�ԔK�)�0���Y�H�4�D{�?�O?ȅ^�nR��
�|UM�רn���XkL<�Kc"���p�҉R�z>iR^��йR���r�~���xq:M,�N!�?�s/Ÿ�'����s�Tu�,K��4���a�X�4L�X_��ϐu�3��(��jԬaE�3<3�u�IirpF�R��iw�)O_8�%����5ZQ�M��3|�>�ؑu];�����֯;ɴ��/�Txԋk!GtbCp/�_d5Ѣ�
�A��1�ݝZ��}`ض���X��)I�<�$��6�݅���L8V��bP^����Y��:,="͙C��.-�Ÿ �'>+�^��⧸�'#V��04��X���t�Yj�?��f��k�����&���T��i*M<��1�{\�7����hH�L+��j�hlKN�PFʞɺ��ҹ�}yy�����򭅥
{:�h:�߆�;6�$6�;T/1ӎ�׷��dk�	�5���9KηEҡR��:�ٗ������w=s���#�=G��7�Cb��];y�N~B�Í+
#'�Z�����{�X��"9{�pG��Z����=�o#q�܊^�QynEb�I]��S��`wgU�T�ey�mbUA*��)8I�plҎ��?>[��5Ǭ1��5>�� ϭ2K-�K��#��u����"7"�Pt�F���F�d;�hm�?5�"�f�J�I�i�&jEG��x�~O�_+�g�n�x�{b��n�4#��fF9*��x�{b��~�B�z����T[��ԒԼ2
u_WuMk.(�LSЀ�y����8�����;������C�+(��*��j�F@7�=�	kᬢԒҢ<�����\
�Y����m�3��wx��f��~�rv
0�UHO-I�+�P��uU״�R�����\�IZ
p��4
��܂�J
�|~n���w��H�'��N�e�����˪�
�b�暼WT�̟ .5�CL���cK.JM,I��T̞�C�Ɏ�b�y���6g��q�8�n�x��b��~�4#��f�r-�2�
x340031QpL*.)JL.qNL�H�+�(`8r�)�8߱D!��U;ߥ/��`Q윓�XV$�~:9j�]�%��I�_���C�d��'e�&����1�j��K|�;yƾǧ��=���4��(biM���}�Q;��K��D,Y���Y�=���x�[ĸ�q���Ӻ���u���ئkքk�uK�J
��+x�[ĸ�q��HM�5�oS�K�>\�SRh+�D�R�h䱗x�Xs7��|�M��8l'mZ�:7v������w�S|HIg�$��]�Np��8��&@Ү�޾]���i�V�O�T�	���Z�I�7:���lon>�~l=�C��+E��#��yB����n~�u�j6g�Y��D���Y�	цnl�Y�8��q���:\R���l�bc��8a:�΃PL�&D���{#\	D1tL!$\p���dHA�T(���F��J��)U)��Å�a'w���)�m�!aL_T*��п���6s�����fzh�?��1�}�p��T㩿dp�i�K�Q���s��L���Ғ��(�s�M>6<�,��ܳ��8MS*�%)v�0!J���2�JS-F
�ʧ
�J�i�i�L�+�㌇����$��G5�[[Db4Z�Ҋ��꘩����g�Z��x5H�
�߫/M�,I�Gl�sO�ֻݣ���}{v���-/||�;-��!E>�(Q.�׃�ig
m&�H�'�{�A�� S�7MQl��kP�d�F?DÌ:����e�@�s�s�֡���s"5$����2Z�ȲD`��B��K�vǛӑ�n8{a�n���a����Pe&M갢`�
�컢�9s���[�	ջ���E�5�81����,�I<���\WHeMhk0��m��p'���X��Ү�Vn�UL^�[l\�0��$^	J[5x�x��=;v��n|����_���좟W�E�Z�o�!�ј%tD�������c�X�p:�a/�x���UHmY�U���Ǿgj����G-�Ny�2ϵRpW8~T02b��3L�.'x�E~�?A)�S1e=�8�a����9��H�҂�u������Y"%���D�,���[=���*��S\�Մ�WZ
c"E����^w������9>9}�����ǟ��0��I��_$S.�R��rvu�qsk���x��O%i��UQͦ�!ou*��i\�\��|�����,F�`~���U�f�����{�G�����0��Y�1+I��Tg�;g��7�*#�\��v��V()�t�
~��y(��yD�cٍ6�M�,�i�t�y�Uj�8�.�L���RtN
{��ze���Zb�E��!����vr:��op�;�v����^��(��i{z��a�k��t�����}�0�A{���ޥ����,1��5bЯ.��a"�m�y稍IAEoS�-J��@�UXvj22�:r�犜j�.��l�{%�(���[b����ȴ)v�5���Ϩ�����}�/I�"8�#��:rw������B���9P�W�|���.)���B�)v0�iQ&¥���+\-�KW�`���axx�4���P䥍��$%:�G����hx� X�w�x30�j�%aC�I��*ɴH���{��Kl��l:�����o*\+�f�Z��1��IJb-[�;u>��mE%��{�ōm��WRRe����-�W3�bS���hf�6Di�IZ-�N�al����-6����;�ל�sZ��Y�=-s`wư�� v\�&��ex��m2}����|�"�2���凸���*�ɰ�>i�T���a\����^���s��a�V}۸�%
m��{���f���|,|Ú�n�ɨ`��G��J���‹o����Ϳ�$8��	�x����Bi�I֒����''���d�XY�������$��$�dhh*�)��'�����&'&g��d��O^�+a��Y������N��@�фQ����_��XZ�����2D}�"��d6�ɓ��glf��gk	59��
x�{��Zi�+��/yWL���9�7?�fF�t&�=
\��x�Vmo�F�~Ŝ�dHO�N"	����\%�Th�װ��uw�Gh/��3�6�K���;/�<�̚��|�����-8��b�o�X,�Ѩz�pԁ�����??�7j�$�0i��L`"V����Ǩ���|����u=�m���D�>���Kd��b�{p�O�+�F(	�{�����訌�vY�{�Z�Wj�1�Tf��n��Q�"U�C̤�"fU蘃�2�*���VK�79Ó�]��ȇ���
k��X��g�Va8<mV��:˕��n��2/�4Қm����w�ci�N���-��o��%T����ak���M?*e��,Ϲ�����3
��r���d[�N���ʵ�<�<���1�I*��!��7t�L#�A�S�	��]
�}����p{���:2�	O�Ò-g�XGPx�$_��_��$�{I)f�Ъȃ����M�Qj0��|5�����[�
��Y����)�H7�<hp@�*Hx�-��VEq&���Aܰ��*�
�n]���k/����/�̝�xm4H�?�<ܟ%h��8?����ɱ�V�W�um�>\�I����|J�t<j*����yي�3�/!��p	KVB
�<+�r`A����C	A��HB�4Kݡ�p��!O��j�e�˓�@خ0�eZ��Ԇ������3�B�j@��\Հ�R�j`ɰ�9�Ttr�!j�^�����博�pF�q�9l����E�7�B��dl&L�0���mI�J��b�wטm�=1�������.�;p	7��z}�<�?M��#���v�����^T$h��<���ux0@I���L�xc�i�Qz�4|�Bڰ�Bg�:W�W<I�nO��(��Z�Ȭ�Qz�UJ��[�oH�r̜`.@��Fo��n��VG���n�|z�<�M�Y�7}3$���p� Wd��l��*���6���/��ڽ�xf���}2�4�ď�,Qד�~ݷ�ꯆ�ocQB�.����2YڥVk�|
ӫ�WOUd	He�ς�
�H��^P���:6{�/2x�
M���m��C��K�t���
�Fx��='�A���919#u��#W�k`�g���B�dE��
�[9`B�mYR�d�� 3MAC19�4�DC%%5'�$5Es�&����Mf^Z�]HFjQ�B"��+�$�d����e�+$�,T�,I�-V(�W�h���S�<�-�d�dv�ɳ9Ϩ¬L�)NU�Y�`�v��UrNjb��作ғ�$�>A<��<x�;'xYp�I֒����'Y9>xڱ�x�Zmo�F�l��-Nҩm��(�ő���(re1�����^����]�HT� �X�rwvv���Ͽd�l���x ��*��㛥�9v߄�'~|���?�C��e��� -
�"H#1�W�D���O���_j�
�����C�/S���~�X#wv^���$	�e9ǘ83��̋X���ÇvA�ng�R������j���*	�RIa��*-�X�\�a��4�D��C)r��"�*���n�d�xsZS�>6d�Z�l�vw�B���j��;�T*S]��Y���y���G���Sǩ��|Ś�LC>_ZpQj��|4�a޺NkƮ�*��Y&s�<L��'q�|�?���ebk9���P�gW�aїb�
�.�,D�B'+��
���|�!��[@��8�V�O�?١>fy�!�R���f��^�J5��筏�/�2I�_��z����ĢLCb_d���̥@�1G罃�3��qaC?�R����`��G��5s�g���{ǹ$�5-��bcUE)~kS"�ee~#����TCj0x=<{5�]\N��ó
�.%L�؟�X�2�o
�ą���bQ&��1�B�ұ�"H
�bJ&�?9Uo��K-��m�^L�/֌A��6=:jn����ԃ#���7R���Q��t��Y�0t�~_�� ���A~'� �)����=j�OO`mp_L��N��oiMA�ܟ�,Lb�C	��X��j��«B"HuK���	8��ja��"����B
Xf���:P�޾8�N_�&��h��o_�~�GM�8� |'���9ֹ�����k��y)�� 	ZM�K��?�{��^GP��8k`M�������hl"'�iv�M��c�d�����`/.��-��|��O��e�b;�w_��;S79B�Y7�f��B�ߑ]��%A �[��p�$v��խH學�*S����4^�@�I��(.�Tid!e
�����F�!��o$��
$|�I��:8�ͱ��קSD�`�{'��g�����x6��N�g����#.+��&�KͶ���*U�;#@Z��s6�mt��z�|�c=�+rV�ߗ�
��|�E�}k��Y�"�ș .���mgq�/t��/�@�p���ϻ�O}�o����f9�g�+;�B�6|���=��.�o���ٺ�u��䒼�¥��F�2�W�6F�8q�E�\��U�.���>��ɻ8r��;�w�$Ij�xK���$S�TS�Im���3�%RT��Z��A�#��ʣ5��\��N}I3��!
�z�(,Xݙ�"�+Ƶ�e������C�ݹ>��V�i�6id��\d�q���C�]@���-�%Y��Xe���[m���=��V:_ϲ��	��@K4�@�{`{!��#��Ō#饘�T��L�A(�H� ��
	�Nd_��u��o*I���7���\:l��Ău���Z�:�����M[�
�_�C�Œn&�k��cgàr��<E�g�tZ��������h:z�@"�hg�sk�v��D�H����RrP���$|9��X�����$;dG�ˢ��²�E��`Ea�߳�WW�G�X��e�˙�����9���@/}��~���;G!`j������_A.h.p�u�	jI�==~�q2pBS�4�����0�dN��Ad<�lM�*��ii/���x!ʴ(�PŢL�S�U�k_ϙM�Ы-���{h|(1p�v6���d8>ct9��Gy�r��Hr1U�j�}�`����[���/�7yu|<����(Zj��l�_�B�'h]�-�
���z'N�Q�u+��б*Ӕ~�k�rfI�����\��r�xExBa@��A��Co6]�]��^L�����GnӋ�*�S�5�ݮ1�%�G�+Ş
��Cc[�'km27V'�5��7� C4�VG����E@���t����
5sR��Z����߳��6좷1G��g��c&���ٕD�g�7A,&�-k��kb�$�M��7����<��!f�c�%�
�A���%�`]
1/1c��g|4�b��>����=-}2^M���g�FW�r������k}cO*�]yG!?��Q�z}:�(54�|H�lLa!�Gz�
%�k�i�ۍ�Q2�GJ���� )�w��8��0W4��7M!]ɕ��%��3�x7X�͈Č_���&WylCGDm
���
��p.g�H͚+�M,�Wy�)����������9��=�TR��k�YW #'�;h
��g���FS}��*�Y���A2�[/�EN�M��Ki�c_���-�Ӵ\́n�ks�m�,{:�>�:�o�,a5-�q�~��W��hn9$,�a�ć���gr��Q��N/��\Q�˜�`�AèGc���zh�g"�/�_'-4�M�F4k���u�2j%�Dz��]sM
�Ә�L����9����uж��Y<����5U�{S�I�_�����-���i'Q�A��ʱ�����O	g]���|��<N�_T�
,�T������}����8��f���s�~՝=Yc��'�BA�6��5��8eOr1��$�~���2ЭQ��!Ӽu_�-B�C\�b�\$����Tek��L�}�>�q�%�n����4�j4�^\m�^~�Y)�x�;^��U��t��
���3�NpE?�Dk�h~p_�L�my��C�B�m�m�ij��&G3��],3D��R��"�lÞFp�3�ޱ#��s[�5��eշ�4���	�=�o�ճ+�3�����l�Ѽ��ok�VC�P�hꙮ�i2�����NWo<3巽�ֈ=��ۍB����-4mk
Dm�j�Q�'f�:��pb��ku4G��#P��M���x@7"�����K�dل���6O��Uړ-�~�ǪÁc�u)����&FuGҕ�K���:���Q�P�g-��$��n��:�>I�CBg��ʬڵ(�W�A!�-�S���Q7��u��*�n�("T�r�^������!��<�|(��|o��ȯ��&r�n�;�yˇ�|$3��*�(E��R��争�u���S�WwB�ڈo���P
�t��]�r��A�f���5{�b�? 4f7`����FYdV-t;Z���p���=?�~�/�%���6�x�m�On�@�U%"���h�Z�G�G�)�&Mh"�TA	a���9�̘�1�T.�4'��+6�8g�c;���̼y��7�v��%�]{�w�5����v��"WJ8�R���COI�S�̗p8�J���2�s]-�,���Q������2p�����p��(2����|KZp�#��Y~�y8x��h8x�"�U�
�@�Xţ��`�h�h)�\:u�Ӆ�-��*���G���V�[T�LB*���9�O�۷��q�����U6������<�3ʨ��I}$��
Oy����C��	Sv#��Լ���ߵ6s���	�Y�>ب�0�7<�����I�OT�(��Q�����7
Q �q������_>�<�A�ln7���_��9��|P)�{g�~���1��'�s'��1wgx�����F���9��EӢ4�����jgp�a�(g6��$�S�
�'(΀��Y��Z��L���@+cb ���o������^!K�J+j�ԅ�V���x�{���I֒����'��A�,��x�V[o�6~��i�Ar�Y1`��ymH�,m��)�AKGW�Tx��
��;$u��.٦�&ύ���g?�y����$��(���y=��|�ON~�!����d�\1�5

L��_-
���߽A�SN��z=2~a$�|��'���O^���/a����\
x=:��烃*⒛�.F�\���rU0#e���0�BK�"�
L��0!OXZZ� (,��F�
��z��P��V��hw�!�W+��i�g5���*�b�fK)P�]����/Ei͝�}��vE�N���q�UF%������9�X�
�N_�S����wRm+KT�UR0�a�`�͔u&�#�������ۅ3OL����G���U Z��7_���bYM���T�`b0����RΩ]ʬH@��*�����1SԊɤcQ�q�}�s=�j4�RiqԤ���a�9S�x�ԉ��8��`b��W�3KӚq�m��m��xoq�X����ç���žadP3�
18��
 >`b
�>OC�sG�cء�U
v�������>�
��c�m8]�i`�B�hU�KrL>�/��9���kD
O�\>�C��/� ~�����q���v�r5tX��L������
R\�=$h�K:0&�#w�@HC�hE:�outܰ��U�]��-�l2�E�m�O�A
��d��Z��Y`��>�@���BR����IRHٽ��BƝ���-���V�D�zl���c�NqA��9�s����4SrG�̩e���=�u�$:}�v8��$YAG��0���Fб�O�%}%��L䐂��8Ԕ�ݞ_)[@!��E�q�ȡ�B���-�����Y�*!�����fZ�}1��'��6�(�[!m	c�Q��Hh��
)	�vF�Zj67��P�f�{*\�
�U�yqc�TB�
�-W8����֞Y���(�t�hEw5�L�Eh7�W�A5^��FC���̢��0Mm�2@���9]{G�����=rm��i�N��;-9���u�rlw�R��t�H.
��rx�E&�ms�#k�A�$A�3[������a#=O"�ǁJXT���]�KT��t]�<�/�:+��)���x7��{�x����!�hx�}�MJ�@lj�]�ƝE}B1	�vߦ�P
�B��;Q��K�N���J��{�7�^��["��f���f>���;��
�8թ�"��劧�Ҿ��o�k���J	~&f������T��d�R�ܞ���+Q��ZfP0���M������*�2����J���̡z��k�k��2��yQ���Ѻ�����ј�)�вmX�
k�S0�
&���o�?�
��j{B&�f�5��@V.��a��X[n8���
����M�H�;.v(�Ϫ�C�.�ӫ���H2�Q�}�¸e:1���e"��#���A��N�65VdE������Ux����k�I֒����'W�CP���x��Yko۶��_�y9�T8v:�$�4�KN�
8h��h��Lj$�����ˋ$��$��$��*ǯ�U�7~�b�@?�<��\)�Y��E�������]�f�3)	����<%��OG(\)�M����2#FTdD�4����M���|+�]�;"$�}?:td�SA�/�Z��Q���?9_�Xq�Jws&9h���A1f���H�\�	�qI0��cxMd�a���̲���<���A�������~�qF�*�]�,W��X�kX;z:�SD,@�g�\e
��U�4�����.��?s��8ˈ��q��D�D	��#K*�"�M"�{���\�j�aOG�䖾^ �b�v��w�OwX  �l�^��o&�"�"	�/I�	
����ɾT�a����<�W��+ov1}��n�	Y�<U��9�Og��d7��S�sLL��g9� r�9��2�B[�e.H�-6�f3�����ñ�׾ZQY>��`*��r$J�'¥X���&2�he.b��~M��y�Ƿ�Y�.�@
��b���(శ��J�`�Z��d���]�;��܀:���:G��5��1�t�=�����կ�o��i��H�R��P��l��h���h�by��hj�M&�����|�C���B7�tS6��4_Rf�@R�1,+l 7`�z���^3��|%;�-w0�*U�D����/��{�R��~-���|��Za�t��)�z
�x}��S����h;���&Ĥ��d�N+�b����A���a�Eww���(D��5Or�Qr��4Azhc�$s���6y�Ĺ"a��}����+�>7/�B�� /�צ���JҜSX.�%)��7@g�G��MF��h�[ۤ�o�*�Z$�Aڢ�V=#�cp`��f8�V1���ɍuR��<��\o�FO������=�Z�@��ø�ڹt��p�eT���͚�R�=��Ҭ��l��Y�Ϡ��5V�A��!�����z<>8��z�z�ФH�����`��4�pK$�+�{ȈQ�@�f����Æ�(jZ�t�H����Ȍ�U�|jK�`z/��,�HGg<�m�g
�k$��:V22���:ΐ(A\$��q�o�
Li����ocqG 
�]��fǟ:ZDc[�Nzv-�/+�j�Y73AY��`f�D�9	uA�,���j% �t��.�[��C�W�0г��i�s�L�dP&�zEM�Y����܇9a�O���n5Y�Q�m�P>�IXQa��s��>$H�ER�~�v����OGG�Ճ���'����W�Y�t�-x�Q�����R��$,Pf����t%ԨMOϠQdy��"�ئ"�V���`Z�r���Lt�YZ��p>,ƌ�jdO~�k�ډ�
����2�l�z"���.s��N7��);V'(����@�b�UJG�MĚ��<t�X΂f_�P��\�vů#`a�bEzC��^����ҝ����b�T�_7x<fJf��s.���9��3��;1�,����i����t�$��A�U�a��C���[��}''G��+TfN��קX��u�q��?֫銲��E����a�KI �_9dƙC0bL�]c�
#���W�׷3(&�����/ǥ�Q���ܷ
��rQн�o�h_��
7F���?X@<.��&�DZ����R�Ilc5���3�WN�0�����)�����k�n+�}�w�j"H��T�Љ��"MQH|G�lԁ@���HQ��P���l~"�&R�S�:	5GO��i�V�	�Y�24�3�n�exG���IBS����\x��>��4�.%m!+̗�r?@�	z(���
�&��Z���&{��� :�Bpa�f�'���%�m�Ь�-��=A7��Tx	���dc�P��ǖϠ�	KfqJ0w�V�{�k3J�Z���U�@�QH�,z�������Lx]�K��5��ow1/&�w8#ݾ����+n���N5��슸|�����L��*�~\�n��{���zd0Tݚ���l��G6�z��l
n?��|;D��vf�Q=C�iJ{j{}�_5���'������l��?���"�Xx���QK�P�)$�"�CP���p�iF`%L�H�fԃ��]ud۸�
��	"��������[P=x��{�����>nƸ�����R��
�e2����IV_�ɽ:;?F\M��մb;K*{X"R�g:�|@�\���$[-��#&�[��Z��O9{*`o�x�[I��CQ-I I���=G�1�J`D�=
ǐ�]���u4@�>E�EY&>v\ږE��r�V�
�i@����Y5�!���Rj��u��(�|��A��;�幙�����-�(̰CB�H�=��^�W�1{��Nj%0O+�aʥ3j�Dj�"���a������̂��C�?����A��p��gx�[Ľ�{�I֒����'o�:LF�x340031QpL*.)JL.q�(I�+����+�(`�S�sG�fݚ�3{��N�X]\`��Y����
VvT��ѐA�L���u��kj��*s̓��6K�h�J�c��"��z��U^T�g^qIbNذs<�+�T�y�\7�uԧ�bTen�P{S'o����6���3]f}31ϒԢĒ�"��
�91�{����%׿�}�i'Դ����b�:������<��9W9p:K|?t�.�27'3/��m!�D���Z�Y�;�oz�T8�,4/���\��毶
�	�t�����ё���3x�6���������v	�ږŎn�����ɑ1`��uM!�aX�S1�#�@�%������"�Ex�7������}
��>��ޟ��W� 6��;�4M]�{=�vWC���z��B)!���Ex�7������Y��}�+x�`��4̊>8���;k˗xݧ��rKH�J�m���B)�z�Ex�{��i����K�I�W����7����5�bU��x�Vmo�6�����Ur�Y1`���KSH��m�t������U"�����;��,��!�`��{}��'����;p?DzX)�H�Y��Y^�z}�\Ȕ	�`Bk�H�7��2��OoN#Sc��p�\.#�"���g<&<8���,c𾜑.���Qi.�������゛��E�̇I�g�H�� �BK�b.�!fB
��,U������V�z����.�\l�ݞy7��s��U�Sj���|.��J)P�m��������4��T-ʜ\�z"B��\TsJ�ؼ+!����������/�}#��F��@EX����3�5L��ŸVr��D��Η�S(i06�������s�(�Dz���Ꙕ�%I�`�4�Z��h�v�-�G��ɇ�����]��4+��� E����%��LK�'���[����%���!�9�"hE�?��C�b������m�=�D�e��8伧������d�u��4*�Π�!�]��);$�2~�P{��^�ƥ���Sz�n�#�"0�#�W8�z�9����`�@S���k�Q��Z�k�[׮�a��O���<�I3
�A��k3ډVSÚ�B�����~~�n6U���gB��~3�N�k��u���n�0�T�%\��u)�P��C�n.��P\�y|t{L�HF��*�,*���-�li�b��D0:��Yk��a�r���GQб���S>���d&���/4��q�og2lӻ+Q��k�>��Q%zW�c���0��?�I��4W2�o�ԯ�4�;:�i��l㻒��4�����Q���B
���ک�O�n����5�f��{�$K�Q��N=
�
�J�p*۶;��̤a��Kr.����jHXk�9�B�e���L�.t��Ft
!z^Ly9žWVW��ʙ�������P�a�.���gdO�6/��jbE�M�jUU��%����A5�YU�^C�nC$� H���#i�m�5�S�[��*f^����vmC�aؗ�㖔t�B��Q�������국��'���^��U���.8�{f%^gE+m���Z�=�jc��i�f/]b�6��@��c�7�m�D;lA�>�㥢��zvO���q35X���c���{2tjݚk͌����y�\���f�"x��T�n�0V��PL��W%��U\�ZmBCTq��*Mn�f�\;�.�BSĉ�<���#/���`π�8^��E�����w����wPkLΖQ��a���}a�SZ?Lz�v��ΑY���I��,��;fT _��P��Y�
�U�F0�+7��#q|:?w�`�,��t,��i``9[`T�b,Ƌ0"%��bп�ai#��L�A�*�"�hc(�{IN�!	�Y�����G����ۅ�rMU�4��E��&<�@8ӳ�q5=��yO��<�/b�D�x��&��d����ڨj����U�74P�7�bh-��Wc�Yb*�����&&�]�X�X;w�j��B��,QRmȖ~�sݏ���ڡ	^�UG�6�_�"���s�M�a�Y���_O�����_�O
C��"�P�3�9�4ӧ�/m��@���Cͥ�i��hܣ�{&}��I�-q��Ю��"-#.�RY��a�-a�O����H�$\@�#ױU8��ٞ�S�F�'c�__
%1���
�4S�%-����S�欀j-[��8�nD���9Gy8;2���w���0R[�8�
�~�&8��Ґ3�(s����y�
�#��yx�{'�Yv�I֒����'U�C�X�x��,�Ev�
v����ͫ�=�G���x�Vko�6�l����� ����q�	�`�#��`��XhR �:ޖ��{iʒc�-P~�h���>��MUT�����]���.��.��#xy~�-�����Q�pä1\`2�_��Rp����tAamG�z�[71�܎�(\�{���R?�K���g�kS*	/��~���<b^ڢ^����Vj%�UJ�%�B/2��&�,&��Z'4��)�����}�V�TgnZ������6�z��2��߯
���*SrC�\�݊��j;w�S��+�{��Kf�r��7�Z�Smi���m��H�J��ӥ��%������َ��*eɾ��F�D0c`&�eB\��lN�I
ta���[����)����0��&!ھQV��R鱎Y�ך�l[4g�4�4�;�f�(�[A�����X�`�� .��g�p���؛��&�eE�C) I�Y���`����--5F�ĂRZ�f��,M^{~���ó��=N����/��n��X�B�dz���v��!�p
�4TY-�d��.�&J�A\#���$��-'�Imy�<��%y~Oh��\��fyc��ᤍ��oNr��U�Æ��cQ8I
�����	5o�S�a���Ƶw�_��2���i���&�Y�1�r4�r�Z�A�5�ok��̯�e��427�$ �Ez�2��+3<k�%R�|�	�q��O�l2�eaPy��2�TŪ�k��Szy�Q��:˸���x
o.�k���3���H�D�i)s/�Rl`]p	�3�4N7KY���
�t�y���g16i�f�t��R�<BI,���&2*�k��(�[SeCL;�&J��m>.�J쎜Z.P|�%�P�u��N�1L�<��1~�]��p���=6����V'[1�������eL�Oh�i���,(�`��B��>� ������ov���Aq\K��k�@K�
Z5��r�x�?�85�ko�m��Gph���1B�����f�c�7o�>����/.|�>��l�
LP7hA�
�s(��@ȼ�e4��5r!��ץ���.������N^G�p.O:�l\�/^����/��m��+������s�����`��B#�Dp|�y���Sq$�g�p�j|�M٬Ok�˼�cpi����S!a�>��#�S��:� 99��V"��j���yh����o�Dp&qx�?��ƺ�a��Vx��"��c���FC)F~���ļ�(=9�Q{rc��:Fn6����<����M����9���
.�ʼnI9�
�%�y)�
�I�%E��%� ~1P=W��*�P]������T
�T��U
D��&���Lr�0����ss�J�';�̜,�*1�$�@uI~zzN�FZbNq��5��䗖���ڕe����ie敤i(�d�����Z���X������uE��>X����JIFf���vM�% �k�j�.e���}x���q�c�I֒����'K�<w��&x��/��c�#W�kEIj^qf~�fFFF����b׼Ĥ�T�T�\J��cRqIQbr	\-W��kL�����ss!�@��X�'�XM~Ƣ�_������QRT��i��5Y�˔##�X!)55or*�s-W-ǥ.p��x��ɱ�c�I֒����'�;���x��W{o�6�;��,��¶�b����&ޚ�i�<6���m��I���xk����Ò-':�%������I���g�Z�~	D��l靣�	�#^>�t��ŏp*"��p�(W@x�l>�)����7�:�b��j{��T{V~��;;g������]�߆/T*&8��>����N.q�t�N��������D������
	:�.8HJ�2� i"�B.Q��jq2�*!xr��6:����|�����!��V+U.���Ks�N�.9Nx���_��9��?��k*���!��6L�O�˲ݧ��tԟ(-I���=<�����'	��_i�� &J�	W��1Pc�PA��ֿ-��H�i�i{�0�� R��롨:�4�6�����Y*��Y�L�%&M��U(r1f�鈩�ͬΡ��=Ɓ�z,��x���T�%���T�3��(��$��pkGf��w�������N���u���b�??�)��C̔1��E�����$�A�b|!S��|,H�p��9�8r��� F7��w�t�����WzK�TS�����{�"�������� _��a-�\~^~k�pFKW��iD4�i�n�,7���:Y]\����m�aSp�LYL��cA�9 M$*9��
�Y:�b�.`t�r��tp�,�U"1ܧ�cR��XyS��{�eM<y�ݧda�oSs���Z�z=��$�ۈž�y�M��t�+�+l��x"j��s80I�S�$
���`G�YJ$>Έ�(/��]��ɬ��,"�AQ"����EB����z��=�{�
A]N;��
9�t����q�OK_��^`�!��F��P���BҎ���y\�"&c���z�;�;�f��pRl�U����â�e%DGU1C|w=�y��^��!�4���;�38>r:�ǩ�k�v�q8g�������<�Kx�\�Y�_����TpJ�9e��7f�W��̨�͈�gf���u�~�E$Ui�M�)�u5���;�8�)�̕]�t�کYhdJ�����jƫV�
+�BÖ=׻^�/m�3��$V���X�P1>΀�reLMn�
9ƭG,7΍�`{�q�*���i��+Է�{��M�f��)W�j��B���~#WUq-S�Iu����J�1�賲Qy^Xg�j*5X���h�e��J>��=�6z�D��	��f��זb�;Uyo�U����!ï��R��z�)Z.�s`�X�˱�Z��Vu����Qٝ[����9\Hl�1ww_1>�G$5�z�d_D,�֕�2ͩ��z�4��bAߣ���Q�Ȍ���ʷ������z�o1E��`�Q�M}ܽ�/p��x��v�p1��k�	~���H��x38G��u�ن��m(`8B�υ�)��bh(
��R�)j��W��|
���J�k$�,��/�b8t�f�dݓ�	~P��c���8��j2ޖ����0������pf{)�\׳����3���~�A7����dڭ����۬�Ś`R�43f�˺�v�S���f<|w����w�WK��ܷ�����ύ��)�N%�O��G��:M��a0Ƴ�f*�QY��U��"��
f������q�� �U5�Nfu`nE~����ߙ���B��:��C�[�{M���?&I���a�x��T�sE�dN��$b~�!�`r�!>�A#kc1Q���x ��nOZ��{��K�0�IK��A����tPAGAA�?o�,�	Q�{��}�{��[�ޣ3ZJ�>�w�2���B�T o�b�g2t=J�����*�I���v��~�17�����<�L��\f)Я4�I�I!&��\�2�H�pv��mD �ILaM��Ό�~\�icM@8�C�lb>�1N�J&��,`���t��d����8’�"QS���GRNH�m�5�3z�	I�YL�5����y@��B�k��k�����QGR�Z�O����6!-�q>F�c�Z!#�ƹn@&2�'ڸ��^��Fx;^F�� �O�
;?̴NT�����/��e:m�u_y�3XPR��q�C��t�u�ұ�(���3�)������p���������h�?��\��o�t�2ia�ʸ��-t�������օK�`���	-R�M�x2I��y\͕���[����[-�nD)��L͟κ��\��R�{�|svu�D��d�Q�$C�)�4�Ht˼�Aov��P�H@;����G�������40ꯙ��
�ӌf����[W�0l�Y��y�h����y��a�E���_��W��Bm�Y��&�]8��zw���'|o Ȅ��b+ps}���foBk����O#�bܯ�6��O��<8w��?�_{�J	��TZ�W{��.��d���������S}�2����k�k%N^a�7+���ƶ��Q����F�Z��I_=�{.��Y��`�6Sh-A�u>���-q)�/�b�!i�o��/��	�h�Px��TO��DWS-	iڶPU-�X��FI���n��(R��J1��3ڱ�̌Ӭڕř�|n��V�"qA���7�T�x�؉�]��ϼ�~���=��l�\o�q��Zi�9Js�u��ه@���F]{ͥ�j���4
���ZWΖ��F��M��biNy����ʀà A������pv���*p�gMY��Pa���)f��~��w��\M��Ǐហ-$LQ*&�������aYSƙ��JU�Y����Y�I��ͼG]h��,B"Q����}���U{$�BfЛ�̷��ˣ>�V�=Jl��"�nOO��Ó|=�=�N�%bq�6�q	x��h�wd>n�~�ahL��I�ś,�uj��h�Q��6���5��t
�Ӫ�,����9�m�:蚟/�Z�$��kʞ� 礁���0����~Vp�߾n�`8�5�����f%kZ�ԭx@M��o�i~��y��f��@)�AS�!��r`���)��k�:��=�h��=�OP�|�B&~$Bgg�2-�0�ު�n�N���Ӯ)7���/w��k�e���p�<�����G2,KN���p��O���*u��sP�A��2q���/}Z��H�Yd���%�7+6Ȅ���|��Q*��y��`a[�ࡐ� br[��D���M���CE�~ŵn,Mߨi���(�ŧ'�pk�V��h}\b��B3�����^�Ó�v�Oc>\�O;e��}�+Y���]���h���� E=Q�HS���j3���B��L�!g�S��B.�8A�UV�"�"���-������4�U=����?����Tx�uQAJ1E�y�ॏ�2�q	�/�a���δf�!��]��_����x�	��af`fE�!�T����z�u��;f�woۈr�֟i��no�{n�0�E1��]$v�H����IxS<�
��Pp�WN��hr�>27��%'Ie��,�"F�$y�
�KS�$OB�t<;t���j�6����f޶9��H1AU���Yv�m��g�5g��(��ݦIz����R�9��5Vjld�LN@�7/)\b!�aUc��2�L!X��9‚[W���%�1����}�R�x�340031Q�,I-J,�/�+�(`p��[/νk�N���Q�Oog2oR	d��|x�T]O�0}n��h�hː�Iet��@L `H�:�n�ǎl��M��]�i���u��=�����y���S���|��mjj�rѠ�{{����T�D�)ZS���\�l�)n�>w J��{��|>���#�i9|�b<Ck�o��E1�=8�pO�fR�~g/w�Z@�e&-��Xf��Rf�)��v,���"�
LJ!&B
Z*��h.53R-�[��Q�|sZ���Y����)#�щ�
[��z����@���Wt��)-��
��?/L^����N�
bǜh
e3���L����sO�W���˕446t
?��!�l�Q>��Kx�`+09Q$m�%,\y9gLAT�p��D��'�C�Ku�tEϟ��<��с5�yJ�_`B�'�fBQ�fT��]?�PR����6F�������I��%�0)��~��a9��m� ���
B�
M�V�
:_q�)tCW�U�j�|����� \���A�{DO�'�Sa��� hpˑ%5��{�����f*%l���P�5����_`g�AΪ�]�>�� �c��8&:ZSy�M��K����.~��C�Ċ[u�~p�޴@��]�.�I��[[��>K�%c+
�c��]Y��ԥk���+�X�7�Y�p�]�udbE��g�����i���1�����x��r�n�����iL�6��QKYD�9;�eӂ��җ���c�o���[��Cظ{���������_
7�rI]k���ƈ�h�4���ά�=���L���?މ��J4-���h��1��6�|{tҽ ����m�
?������+�}���_^��Yx�;���I֒����'��?>��x�;ͿS`C0�d9F!���ܜ̼l��V�l�*��Eɩ
�
Pa+���̜(/ �$C�F�z��|�n^�Fx��)pH`�T�ɹ��<:
*%�E�%��\�;؞N^�>�ic��vx��UA�Ef4�춇� �P!1��
��2�0KF��WT����=�VW5]����4��%��r� ^={O�	�/������DY�2ӯ�����}����/�_��{���E��-*#�Z�6{/N0�b���hjl�f��}V���G�����w�T�M����p8�s+�@0c
�%V����P`�
�l*΄���E��!�90��4�h��ˤ���NY���,JT*�m�0)8���L���XHD�3*�k�J�ʼ�R����@ӓX�)ˇ��L[f:�Ta��B��@�D!�����C��ȉ�u�͙Ss�P*X�)*�t�⌡J0>g��(��I����B+�J�TsKu���d�#�,����cg�T#�@�Y��uXH�c���D RL=��,/�id��ͤ�X$��Vr���R,E`��I�B
�TR��9)�A��H�Nwtk�|P�:����7�Q{��=_z�0�� �u�����s4LK`��C�Զ�� 3U�Х�A�E9~�&�<��>)>#ә>�xE�T����L��D '%g:Q�Sz�}��cVH�.P������St"p�G�Kf�X�{�B²���R	�`g'֒#����ά�D��WBp�wn��"��S玹F���*�ni�0�MmJ:��w���?0\V��fPE�mC^�3ki� L������dj.�Z���1���M8�S��$5��B�XY^�F��f�J�r�G��a[f�Uc�H4�֖�[d��Ҧ�,�����)
��1,��.*S�Sr��o5�ә.�s�~8�'�tR���E5#�������9N�d���(B穷7������[����M�7�6?�ou����׭���v�
<W���|���WOL_�v����o�5:�y2�q��ͣw�'��;���O������ϊ��^����9x���t�i�
֒����7jF`���x�Xms�6�l�
\G�(�%�����ʼnݞ2n쳓�d��� �1E�Yms����AJv}�����ų��.8��j�j
��[l��L�jS���{�~��u������X_?����8go�\J�K�S�.]N2�^xu�g�B��p0X��}�_�s��Z�&���~��Y��r�1vn��^�T���s;!��۳�Z��~"���B,�X	�I����\
�����gI��<M�IQ	g_	�*Ql�z�j���U�7o*m7��|/�����^20�h�J��f9��ޯD�s�g��U�n��I1/�x���SF���h��9+��=��T�|����p�I򘟮S�oN&Rq��Y�)޵7#؎h���d����,���0L%Wh��bxV�P<Q|���J�#E���/�"��i�4d��H�[u��S��|�<OR�C�ݪ��yB�'穄�ܨm1#X;ԌD�c,�_F�p��R���ym�q�ז��qT����gy�\_�y\�r��TT��|w����}�C�ųt^<j.��d�pH�%�z�j�J��Fzǒ�����C9<��:F9�ѣEO�L�TgTԱ��[�\	3��k�?x���.�[�HQ�`k�9fW�ei���(�$�B,��!�ú�^ϭ؃��37m�4*p���5�>�kb�t�Q�t	�R���mP�XRJ���$[/R�J��8[�⎄�Hh^�[i�����r&�̦�����4$�(O#�V�^���`k�e}�*4������|���1��]�u2!�X��qLM���g�t���#]C�g�2K�9�	1�H=4���4E[���L�*�������D
�!>��LֻJ�tG>YE҄��;�)-r<�\,kFe���1��
]����;�)�e�%fJ
�2�5~���,��&�V�-j,��Js�n��H
+��)��`F���&�� \�h,.�S��4�BW�zvJ��,��� �=�T��S�=G5A�бZ;[�j�pxu�����S�k�]�O��N>n�蜀�R1p��3���ٯ+���	m��=�p�A$o:�<Gô��6�N
��M˰�p�(՝��e�m�-7*��'�����/�S[�6�>E�ϔ&�<U��@�͢�39��e���Q���'��}ۭ[���
��J�,��Gڔ�k�X;�n~(��2�T��ۜ�NC��7�U�L8��Q5���F�g�q���wצ�A�	t�3�P����h�3���F�Ǝ��d��y&&F���h�;]�p���JO�-����-W���̍c_=��/�clo�'����i{��U`���!Z"���+_|�6�rs"�\E���:�������t~��st\G�25��k
[K�J�n��֦oǥ���.�33d)�1�!7������o�?���L�>ݑl�;"_����I��Ѷ]�|�	ޓV�C��l���!?���S�]uD��k�`	���גG��]�b
q�Z��f`��{v�-�l���M3/Y��.�f*��S7�Җ�&�3M|�B�5����R+/���5F�M��E���v��+�K��g�	7�������B��e>�g%��wy��F���ݝU��r�Ԝ��T!��Q	��\� ��`P,(��s�$�Q�l9�����g�="���	����"�7�.��*�
�X�^:�}B@��<-l�Z|[ܸ,3��,�$."�
��1��(p���-��w�S\q8ũ�l����m�uZ��;m;��,��6�%c*.��1z�bL� 8��DC�fU
W��/�K$���(��f�3oV';A�qW���Hi���)dإ��`KY�fބ�}����x�Qї��~���YLn�+���۷_�%��x����7.�D�|Egs�9ݏ���%�ٱ����������Q�F��^��
,��U-��@G��Vs�ht�L��mt}$G�Ѿ0��l�~�����-w�����&ƺ����	����5�wQή^]\��}�_gMz�5z���<����t�u�ߚ��m�������Evpk|��h۫�D�����4�54�oK
J9�s�T@�s� A��w� �;�>���"��&����u�j!\1a�k��]���*b/->�C�y��In/4�\x��s|�ٲm��`��l��X�&��
p�'���̶�w|S���ͨ8�.�B�����}�VA���������TS����n�����nܗ��7�P��T�< �e�G��?Q���x��l��d�I֒����'WIG� �=x�}R�jA��`]�Bc+�����B|JH%h_ښFET�i2���,3m���m^�!��?�? ����n6��>��=��sϝ��~5?�Z���M�غ���\-�%��s��;�KЄG�4�o�2�h����������)̭ڰ��Uw������3A ��P���!A�.1&��B�>,�)�掿؟.l����_�o��1�#C*v�$�'D�}ʡ>�h�[�vY���G�C�����j
��7��!`z�3�GIٰ3
Q��i|����`g����?�rJ��𕭑 	�X2�>�t:/���a���ǜ�ĨK����$b}����
\����*�
�����e0�����އ4"�dž�D3�$�]N����n633����ԪU*�a��/B��7
��Ԓ�u���I8	詞T�N� !X"��5���ZE�sV�0�b~bF:(f�����Y[��RK��J=�����kb���󿍘-���wx��c�f����YAAas7�
[�̼��]�������<
��ԜĒ̲TuM[[[�����{\�9��K��Su&�H�@�@�E��9�%*!Mk..(�LS�(.��le�3fh��D>��Ke]��JZQ~.�i��Y��Y��R�Xt������`���K�M�KN>"S�q�fO�\F({�9C~��Z�Z�SP��Nx���AJa�������[�B�]A�ŭ��A�2��i2$��ε�E���G��j���@�K�x����v2���u�H�� ���@E�%� �$
��J�5�*3��,�XV��{KP-�B�e�(�6d�!�����	��7�w��q�P�2��b�$��jIj�)Y��"Ͱϗ笏�z���-��$p{���7w�8/�v�x�<^�Vpss��x��W�n�F}��b� eX�(�8j�l�qb'
V�P܄�e�RYm���EZ���H��̞3W���*�z��q��DV�g�98� <�����_`@��~�k�3�Lh�B)���@8��j<�07���h>�M�1h����'���˿xQ0xk��7�	��Js)��U�Z�3nr;&��>IY�HY�y�H�%�Ȥ�#$LH�V��V%
+���jA��^O�u�h�ze��1C��$n/z=��e&�­VR�0K�+QY���̖����U��A����s[r�)�Z�4��wL���p���JJ��bU�����i
����C�~\hÊ�-����i$��w誔4�L�;E
/�)�a��nH�E��[[��c݌Ϭ°_�4'��L�8�$Z3�:29��7w
F��},�Ŷ��/P'��^�����zD3%K`@��[�X�vY�m�k�G'[�k)�w��>\�]^�?�;W������m�
�
���k��ұ�7W==X��R�I�	����kRMN��B��L`�1l,����͇����W�o�7;,�W��lQ���g�h(,	������<�GL��p�:ሻ��('8��¾��u�f�Fk�҈F3\�5�e᩷�)�i��$���`bm�v~l���Xk���B�A�,�N�rV�S���$����er%� pwV����?�Jqa�0p�
�44'�Hc��j�#뒾���k$;�|�#j�8��Ʊ�{U�i�ƾ��g�G��f��RMuK)�h6��2E�3�жm��'�M]i'�\�a���L%�[w3���"��?�1�vfdb��l`�P�Y4�i!gUT.$=-"-33�R�R,А�A*̀�Nf�pP>�MY,O��	�U��.�:�转]V��U��.�N%I=\���Dþv��T�~r����j���~h���yPP�����~�0����!C~���K8]�N�����N���'z���F_,�l�ZS�0�C2HwObݬ��>��jÄ[���8C:k���r`:,��
��4����'�����`�p7�FUw�l�i��uk�B��v���sCm'܈ͳ�3>��s��'�(j+��3TJ���[
��1���	��,��'qj�*��ݬfઈ~Z��Y��Ow)4V��>�RG���sr�c����Bmӌ���%:�`�n'�,'<���:�5��p{��E&G�Kt��G�xu��;��
/=a��[�k�o��7%t�
�A�/���Sz��D���O��(X�)�x��RAKAf�6M⊈PJ��f��JIQ
�c��e��lf��[��{��=؟P�=�(��^�Ѓ�����h�ü��}�|3GO�}���H��Ԋ��z�N���-I��
%AHvÿ�7�%�� ��&a��}�}r\�t^mV� ��160@҂#J��B���y��/�K�:��Ǯ���3�tg"�`�
�iux�]��s�����j�7�˪�߫�+�5}X�&�۹
�׭�^�	�Fa��j5���k�VV4�o[��Xb���!y7��!#�Y�=<��hu
�R��i�{Z^��B��*̛�L@i�H�J4��	{9���\���Xk�؋���'$
�o%�-�mw~&��.��S`�Ѥ1��_ݥ{���zv"�
���2F��a�p"k�#Vӭ�9���0x��$�]l�I֒����'WrD�Ҫx�340031Q��KI��+�(`��>�x�;�|��k�v�M3�(
(-JO+���p���r[�y����]�����0�+��Dx�}Q=lRQ<�j���}�SJ|`����@1X1���BZ_�R^�x��{I���v:�8�Ac��7'46ѡiL����} Iu�.�='�|��yzc'�
�z]���@�|�뭖�իe��jv�2C�1�w�Y�a9��5�v�T�R��.�.#Z�¡r⾇/�mZGUq�Q,u4`M�l0(٨5���r�7GZ
˅\�
�<��1�	WP(S��?�A��[�/�\�uf*���H&�J7�;��̚0�ɤB����ъEYS�3&sf�ZW�8\��b���j���p��H�<�N�q�1m����vL�;ǔ�%�t�ftH<���4
�s�\�M�v��hd�vb��_F3�>oaq�yw�9�	�0—ηxv�O��`�쵥|!_������px��c�K���V[׈�@���4�dU%u�뭸8���|�9�N	������{O���oc%�b�vܸ91��2�㽇��V|6���jC⹑HZ�z&�yqQ�s�c$=;��x_���nx']1O�i�P*���텳��9����/x���z�u�I֒����'y�EBt�Q�&x��S�n�@U*фM�@����&	�pi�JpI�(�E�L�qb1�񘴨%�@5,��,�>������i��o|=>:��3��_�~����ݣ;?.V]���jRX��ch��P<����X*��s�z�y����;����.YM&m���!늵���5�2�a
���7GSΈ]���\���c�=�>b�1�
���0����1Q�(�@��e��A^7D]<�fԉ��٨"�S���]�kcX6'�C�EhI
���l�ʒ`i`tl��a�OT ;p_�
9 B�R
G�%USg�6��`�dJ1m*�#ޓNU~��u��CY_|I\�ب��V�lU�ZѦ}�z�M�J+r��>���mC���e�iw�J$�2��p	�5����$��8����Tv��8=-֓����=7ȗl���RS��y��O�)~�5k�o�[f��0ZۍS�_�2L��Q��.�⎬�RB�K�J<�k�C�/
��1�;-��u��jUsk�Ұ�5�R�S��n<�h���b�U�2lQ���_��}�dG{P�{�6{���j��v"����T�np��>W7�O�-�22�C�Iʈ;_R��?�b:zAh�8��(*�.e|��:��>&�%���'��ī�Q[yF�V�0k�u5bc+r{+�Q�U�o���1��>V=���R�մ�l�f�\�4�Z��2l���cRIx������Ix�{ �Tt�I֒����'ŹA*�x�340031Q��+.I���+�(`�q���I�Ϸ){�?~�wF�S��܆e>��%�PeT^(����2���H��Kn����B�2���RY,�����5�򠢠H�r�;�0x�V]o�6}�~ŭa�r`�I�a�{��<8�G�u{Y����-.��T���%)ڲ��b��_<��K]|WU2:>N���U��|Uأ���U�NN���~N��U0	7L���x�˹@����!����x4Z��C�_%ھ�/xN>xt��ඞ�����p%�lx�8���&�ۢ�sU��V��*%L��JEU,�[ �L*�s&��Z�+e�UzC�GI"Y��b��f�UC�eIg;O�� ��)�Jn�n�$J{h�����LV�}�^�U]R��dh�̤E������Km]����Jr���[Q���Ic�����@s��S�*�,���en+�j�)�I+���-�ɦ�τjګ|�1z����
ߠ�5�\�K	~�CB �e�����r!�<���)U��{�������^������ޑL<�54�d�U�hq׏���I�r��h�T6gz|:<��=O�K��#���W�e��	aAWy�������"�!Cjt�OG|ɚ�<��>�ϟ�`^(��>�Β	��sx�#9G��n;��7j��#�y4ueӵ�Qv�Z+=��f�����f������~��5�J�9Io�q�hz\�B��h,S���(��i��
j�P1[2�Wh/���
���gS�	��%Ô���Ւ����X��C��-��|w�뽴�{��^aA|�(ϳ��6K1V�TDp'��{}�L&���u�7^�T�k\we�Һq�ͽݫ�m�H�A�]k����4*���cj���]��x�ي�j
>�6�We�����!���^�n���ţ���ɰ��еr�
�.`�j`���Z,i��Xu��'˹�1H�Q��aח�g7��1���,/v�Em�\����&�t�a��l�SP�y�n�[�u��(�ƅ���i�rr�]�E�hk�1k:������a
-n��[��{���'���y����xN���#�^�$��_�ټr|�WDE�3��@��ߧZ�Wbh�M1��|%l���b�����h&F����W�En]�:/ˤ���^Q�Ȳ������֤=��S�cͩ3�!c�O�ӿiv�a�B�Ux��TM�A%��ē7�UH6��$,�uE0�E��S�i��{��I6�7�.9��p���=z���ЃՓ����=]���{�=gw>�r������۾�GB͡v5�U;�5v��-�g(�f���|R�s�L�P�1)!+��� <�:���Z"�.�"P8�Ӕ�Ȃ6��UT�4�B�5�g#��E���F�[�s��L[4@� ͭ�!3!ِ�i}�O�HXl����Y�W��҇Kz.����P�8�T,�{�,�$��58!����/�ƶ�B}kH�y�mW9a���
�2��/���J��/G`3�"�+W���d9<4L���2��{�W)*O��b9�J���
�u��8�h�b-��,�����ۦƤ�R�������-zQ�l�T9��=�� D���G�;sEl���;���O�%�&F8�����꠆�8���v�M��,xJ�j��l�� q���
Rs5jq:y:m������f�m����N�4J�{�c�*��#3*����p�{|=s�s�w{}w�p��-�����y�1��4wb&-�t�cc�S_"DMgD�|`����^lo}�Z�.�nvj�x�i���Yx�k���p��UW71'g�	�̌\K��� x��� ��4'_^�nf^IjQbrIf~���m��H�=x�t��o-x�� �Yz�&݂͋9xY.��Kx�SMO1=g�VZ'�E�*AKK� ڢRqB�g�u�ږ�%���c{W!�
v-ϛ�����?���Ѩ�|�n�\�a0�w��C8<8x��y��.������S6�0��|:V�`�f��f3
)0������rp0�j�H�8\�:��|>�{t^
�Ӄ.A�
]ŵu��
��~�(�Q��O�����qj���Rp޴N 8���`ܖJϊB�����U���2�o�v{�ڵ��E�z��m�2z��h���K;~~�mn�\t+��Z�6Ĥ�{�UŽ'}8U
�!�^z��e�	(.a�j��d�J�[��.�V�]j�''�7�U6yp��C���VB}A/���*�"����˹��&�����6 �7J��3�P�d��]?�ЫXc8����'~��	��[��X%>QKI�p���)�;Ƿ��p�Y�U�$d7�;�=W-�awe�iR#U�g%C�>�<�uZ�s��]��ǧT���7ܲ��Bu{��y�ɬ�/�*Y�̀.�Cu��a����<d�*���f�*pz��F#M�Y��ʮ��$����(�y���c�M��F�~%��Qx��¹�s�I֒����'_3<Sw�x����sC
#�GjNAjQLHbR��~F��5�[����T[���r�D��J~iIAi��5����d&dzD�bͽ�x��V[o�6~��YTR�Hi1`��dk�H��]��\F:��ʤFRM���}��d]l��0!�e�\��y�k>��ӧx
��2_*>���q��8��GG��!}=�.�	�dBk�H�/�2��_�^��ύ�GQt�
4����tpo��/�2o�;Z�7����\
xU
���^eq�ͼ�c��>I�Ș�2��a,���"�
�!fB
��,T��0����d:[���\6��f�{���^�Fx�\�R,�j.
ӗk�.~!�”�/լX���\�*%�?�3�
1�-�Ia�F��r3�3�5�͊7�mX�>��*���ɕ4L -Dl�e%�B�8�R�>f��FsE��ܹ�/X��lj���w�ލ��(�k.fP��C�!�P���x�I�z�K�:/�ş��!t6�;�������빳J��
*��0.,[�%$0Zѽp�W�]��ƅA��x8�z���6X�!�T���34�!��N�{C,�é���@9ׂ���FQ�~�y�tr)�4-,=<��#����Z��j�UZ*=M�"k�iڟN__�9�N��°���#��:u']��\o���=%�]MJ)�pJ�N�5m�M�e�Q{��*��_d�ڟ&��!U`XaN�֬5>x
�)�B�6h�K3��zr6Q"�B@��Mh�i"U��I��3���q�6.�[��ܾ�{�T���[e���@[@���x~��4y�d��)T����n�U�g�����*#�SI���ڝj�ni�0\��.�
�M4��>�ͭy-�=�b�l�R?�|��n��o�j�^i���-U�X��pt�Z�?�]���R�#��;Ur��Mv�!����M��]���Z�a�:~|���9�m���3�@� �����^�uQ�n���;����ɘN:V�B]d��(D��u=�\�y>���m���0{�,�<aU�:Ρ�9e��# I�esV�!�rS�u8џ��F�zȃ���q�L�.5\�f�gfg�l�q+�[������(�IM�p�~r5}=y7>�N^]���w�pO�b�)��RʻB+�{��W���{�
ft;vN�[�N�+K@HwX���ƌ�T�vM��0�N"{�ׯͅ
`���G|�>�ګ�^�ߒ���o� ���7"��Tv8�'Ժ�cJLZdٲ��8r�^A�����׎��N�IW��ն�e�4l"�:��G7F�B֗��#,�B�]^W���00��.�x����n1ƕFQET�p�B�U�݊8!��$dQ9�V*�^@��;ٵ��+ۛшW����{9�\8�
oBBJ%�O���曟<�v�����֧����˯'�oy�0q�͒%��ύG'U�����4A�~;�YnT��P�v�����{y��>/��݌�i�}�;�Ѕ�I�&a�� �8��aR{��§�:+�ZFMZ\���������~/?f5�:��I�Er4�"2wͤFa3�qS��~�ۂ�x���}��k�:0;[��d��ϋ|���ַ�ً���j�@�"n@�Ӏ̤.W��ֆr�1H	���1:���s��gMTJ��_CS�&W�S��;����U�NO�8=�wL,��_{]�.��
�R�u�����C��W���_V�fTk��<�Vx	�H5d"!1S�ſ�g15H&�1C��j'7�c\y�~O�Ug�_ O�k�Nx�{�{�w�:��'٤���x�;�{�w�6��|�̼�Ԣ�����3��E
*�x�340031QpL*.)JL.	�,I�+�(`�������:��;1��ض���9#59�3��m3����V'��57NZ��g�u�,?/-3��b^��}l���E^��aY���oRLaQj"��
�>S85���4*�7,��g���*�ԜT���9^�w�����}��0?��*�ɯ��̔{���橆n�3/��N������/���OL����y�~�~Йmg�o�p�l��G�:ϼ�Ĝ��J"W>�:���k�r��#����|2�K2����^V���>�����J�L�*��N��Z���<�G�x�i��ζ��&��b��Mx�u�����H�_�'�ū!#����$�f�,<:�$�<�����'��qha�100644 Create.phpl��S
��i5�T��H2�������k(Ǭ%�릿�v�ejQ�]Z�=LW!37��x�D������:�g�0�ekı!5���Z%100644 Delete.php�d�؎k� Q椶63�љ����a�Sx��d�d��'�g��\����&NJ�����E���x��x�Vmo�6���[aTr�i�a��d��M��m�t� %��J�*I����_$˲�4�a�$��sw�}�{�,{�����T�k�Ks0�GO��7��ůp)�D�%ZS���>�b�)L?�1I ^S�G��j���j��m����9��������U�I/��` ��3�j����-e�����0�Rh�,r��,)�DH�R�A�J�-�fF�5B�z=A
�K�+��۩��wQ�o����z�JS��.r)�v���
��9�zd��(+s�'jQ��a�ʑ�lޕ�����Xb��:�w>TT{��k�Hj �Dk���6�@*2
!H�{�O������19�Sge���L���2�vִ!���zg5�Dj��%g�J����'cG,���Yǚ�|<�H�Ak���^�S�%1�x6{sq=�%�(I�>s&F�c
����f�}�dzxF��E��5�D6>���ܖ�����7��o�7E^b͢�FƢ��~�%��3`�Ռ[�����$��L���9u�z=u�a�:�D�6G�[�ǟ'W7����E�d�����6N4�#�����o�F`M���V�ƎL�s�3[�G��?��PB�\�|�N����$�筕�`���~���0�6���Zm�o��dp'�-JZ��B�ڻ=��+l^�&���#��'pGxE}�.�_�D�����灘uv�9�Sn��M0�p縯Oر3�S�\��;A�YA���hN*nj���RdmQ<�_t�	\��쎊#�z*=�S(���ӥ�[��g��ș��V�fk87�)^���ڻV�t����}E�WL�l��eoYF}:�� ���w�X�=t%U���`�EM��&��WT��F�G�3��=Q�G�s���>�j�P�9Ɓ�Tp'L�ʒ���,�[7GuJ�Ŏ��M)j�i&tr;e�/�}���ӝ������֢0=s�)�����6�ed�qhbdi�pu����^�%n��	҆/a'L��,��A�at2r�_���o�ƀ;�4��O�]'=t�;uUR���)mm�:�}s��C��!T�`i7";=�*ڽ����3X�6��@��/,�͕�'�lX�-�>:W���i��s�‹��P��A�:�=�	����VH�5����������x��$~B|�I֒����'c'�c��
,M-.��ϳ�*-NU�����I��q��+��I���ń�d�L�a��bXY�������$�dhh*�)��'e���e��O.c^�R4|��������d#���9�X�sJS'�s�CYa��PV=���y;�4n>���'x�;!�Uj�M]�Ĕ����<
.$�^Z��[��T��_���Y4���$����UE�Rhqj�P>5�$��R�� 593-35E�<�$CAW���\!�X�$#U�8�$U!3��$1'�E�Ka�3����
J�A
�!��~
Jz*�y�%�v�%P��;G]���4
bth*T��]�$#�X�n�Vqq�i�
�9ũP������E��׆8���(�x��1�$�h}<ЮͿYϲW�k��rx��*�.���m�Y�͛ױg?�Alx�k����ʶ����
�E��x��X�o9��43U��VZ)�YB
R��B)H+@�3�df�؃�!dK��}�g&s���C���>~���_I�t���؇g>O6"Z�jo�w���?�����S��II��p��1�����R�h8\��e�*�ȏ#y���+�o�^�s܃3�߃�TȈ3x28��罽L�2Ra:�|5���UL�̾�}�$G+.@�|�8�|���)�p).6(z��0��2!xr���qj���j��=�tRI��fp�ѻ	g����%��'b�����YN��"@~��"Q��.R�9�GI�aks��}|ι�J�$����H	o#E�!�?�0��e�7�kR_u�;�+\Q_�tg�F�|�+4�q� ��|�V�l)�뀩�e*�����A�J���*�d,�:�ܻV�گ�9^Af�!;������H��8�*CGȜ`H��z���۔G�:�z����շqz�s��q�v�F����w/f�/޼;�|q�B�\��^h'�F�A�B�Z�P�Ō��6����|��G̟!Փb\Ȼ�ul
[U�{4�x}urq>9����������gq$�)[)��8X��h{c��o�Ou���H��A�ˡ��F�;��0�(c돗T�E[��
0�cP�ab4҂����r����
\g��=��0�V��Ґe�����W�=�`��Kp��_�ϊ�9�ߎ���K�2Ɵ�9w˚A��[a�q�(EusK^�U7�1�	@���<۫������?��2{�(�:�q��6+l�+�BU�lf�. ���f'=��/y���AW���\M=���
�������m|��E�,w��0?|خ'<%~�> 2se��6`j��1E�����m
���jOKuس�d[u�/)�r���
W��zM��W�&�r]�%E\0�+�VV_�F|��|�{��q?*�r��zP2�-�ݻ]�:�8���7Z��'�h�(׉L��Dk]7�� �\��$ۻ��j\X�+���1�
2�}*e���@6�t�����0��T��z#���*�RW^�L{^2� ���;����h�W�_�%a�ټK[K�����s��á٨��V~/ZdQ!�_�J3���قua���� � ��áe�BQ�
�t�k���%,��lfT�!��X/�b�P��8X�Ho	�R��.�=��
��^|���}�7���ڼw�2�7];ʃ�~����a6y�Ui�b�H0���gx�r��g^wLj�Z���;����,x��Y�!r/��틀{'�X`�e�1FO�~�-`��"�5�`Q�:*r!��	����iE������x?y�;�DX��?_�.#��{��f{�8aom��&�r��C��ۜ聃��x�@�F{t#[�%d�?s����O����.�W4gz������&G ��'���W��>CZ��#���ލ���\���r�^����4F<�=i�&~��g�3A��_nX9&NYW���������o�WǍ���yx�[�>_u�#kL�gI�fF6F���l�<�Ԋ�Լ�bǤ⒢���L�
7��̓�3qH�V�&���j�d����(�䗖��\����UJ22�u�J��SK�S2�&?d��ʖ�4��.��feN&m[�h�̼�|;o}0#VAC5EA�X!����<Mu��˸uLT��R�KRSt4�l[[C{���ru+0]��	t	�L��!ǡ��Z\���:y=��x�MjQQ~���������>��Y���
��U��x����Du�I֒����'�	<�~��x���{�8�����r�iҲ��N��^��.K��VS_Xr۰_��}O�m�)̬?h�]zz��_���pc���A��S+W��X����1��ȃ��_�6|�>$o���7��9�91}��;��e��gb,������끐�����:�N�(�渮IN��#��}�\��;�Ov���I(.��g+�_��sM./~߶� �<��X2b�~�;��đ�H�€;"�V@����	#or2��|zLpr����sF�V�<�W8>�E��c������@u��8'����C8�b���l>��+�$����M^0�"�t�o,�_�A8n3P���0g&g���i��Hc�&�0��"�a7��6'UЍ�nx���E~s��d,${I�9�^2X�\3�A8�����b�(EH��҄3!����?P%�u���%x)��+3"3�e�b(?��`�F�)�t�iJz������V&q�p�b�lnƮ W�3�cjF��j��O>��F8v�]�ض��NH���M� #�;.C(	Y`��q�E��iJ�Ȭ9�}a����ѓ j1%����� 2�t����/|��j��ܗ�x�W�[�"G�i�����Z	R�ᙶ�\�(
�C�K�b�k�~�����xp�a<=>9��IJ;Ӗ�X���؀�Wr��3'� ������D�{�T0��äN��c.�
^��[���:{ۡ�с���2���݇���/�`���ѡR*&P$�t�,�h�`m�#��
 rl�wʜ6s�r���o���n�f�S�:��O*1�t���sRj)z
^t��08�(����_�e�@PBZK3�!#z���o/_�~�����������O�6gě��r�z~~�����oV�vv��燏~��?�~�.Ds�-�@�CV����XF*Dq
�\/q�Rѷ���
F�\>{b�
0v�	����EY��2���8�Sb9�m56m?n
�%z�
��KJF�SLaF&���M�@���Tx�:<��a`����*`�lE�WSFb�>�U� ��`�fW�
B�/���RA|J�q�1�8q)��jv�(S��*8hLZ�^�<i���+�K��F2~��[��a���@�a֦��XF�5��d|c1%���ܠ���"τ��J����
�OrF��

���_ʉ���˥����V:�IV��߱r��ћ��_M��/�֒�H��|��>�&�v%�B���[�QU25kɬ˶P��U�ޞ�O�����5�k�߬)������`��[�6/�G�VI��I��Gg%�5�L�^IVݤ�Ճ؀��υ	} ��ʟm=��e�T��
j�}LK�$��@�F��F��&3�v�Su�(eo�`�2���_r��j��]�k�V?M�q����7'��Io��d�k<}ޟ�^�~B�B��zҭQ�0b���i�<��)6(9%�%V!=Ao��=�$�#�t���i2m����d�)��*͙��|��W�R�t@���@
��;�6����
Jܜ@�[�L��'��f��LԶ)��~JVC�1��EIWX��"ݖ�̓*����vV24��	��Z����F�[?CJ�Us$/!�+��M���Y�,��K�U`oſ�ۏq���_�M5��Xe@j�c���s�8�/�jYh�����Aa2�1<���,�"�DX���� KMjڞ�?e7��w��z�ʔ3�Fʊ�0��p�C�ei!Ǫ8 �'�2��
�%�a�(�B�Zu�t�O
�n,Rӣ~�W�j�(�R�;Ҫ�9��f(aj$�|@�C4�ľcA5��x�iS�6�����̙pp����R�����suQe��Em�T=os��3����-��*�P��.���Ȟ_�e/�e��"%��
(I�Y�H�N)}Vn~�-+ݣ���T�eHyG%�hS�A�2J,��ʾ(�\d&��2M��.L_j'ɽ����b�m,.�b�1��@L�S�qr��B��P!�p���!�s��G�~����qMUX�S���%_	G3\*o��º�MTKlݐ�ޜ�L_<��u�	��c|8��w�q9��ٙ�!��x�N��5x�l��:kp�-A;<y	2���?x"�G��������V2��lEŝ�r�J��P�J�;��}�.��y��f⾟�q��������1J!O	�����s�P
������L>N_�N�'���6�܀K�޺�ߖv�ѣ#�5v"��mgJ��,Y$�W�bU�<�cC�t��p#6=�(OЁ΁����_#���YV���獈6�JP՞F*�{Q���J`��ZY�V"Z*?P�f�y��T��@U�~��=�ˋ���]3��O^s��%xUX#<�
��w�ԫ�U\���	��}p|��"��4��`&N{R��
�a����Su�p�N�j�Y�Zu��|�Oy&��ۯU�Y���	=��S��W�ƾ����i����+^�!4���s!|{eFS��s����)�_�8�#s�a-��J��Og����%�9I<�=Z��;�O����/ݩ���q;IZ��骔Q�
i&Q@�\��Sp�� ��҅S�dIF���(�mF��s�:���Ne�N�	�L�RJT��V�����o1�Ã?vj[߻^�͟��L��>�㚳��D��y�6�tO_�Hit�f�=�^�XWČ�K�X_y��Gh��x*S��䩧,l�9�T���2EV���O����v�眹��e̾��!�*_<R���u�#��K:H@Rȧ�VB�m^��T1\�^�R72��wX?���g-�2)ܵun�,�Op�6��('��u�����X�&�DB�3���(���z?)3JG�Å��(�_azvl���$�T��i9�k�Q��*�b���V��ū\s�V�s�w�ȌVD"4KT�ǫ��X+�a�X'@aW��-�vQ�&y�"�-�"�ۍۍ�������Vx�k�8�!C�+�8>�47�(3ys��,��#"��
��(x�;~-lC���^�)��
�CD�x�Zmo�8�\�
���"��{8���%9 E��6m��%:f*K:���mr��f�&ɖ�t��_�j��3Ùg�=��X��g���F�˥zr�Hx�'�?�7��w%��%��+�I�2Ih���|5O9����	�J��p�^�~1Ș�k�)�a{��W����-�0F^���	��|?xn'd��<�/�Z��A���Wy�J���T��(�3���\�d$�Y��D楈��%W���a�����7�*n�c��W+���+���)%#��"�6���3�)O|���	A7��Ń�5�Y��X�_1�P���&��
�2_�e�lwl��`rB�SiE����2�j?C3u�A�t�TJr�IEӔ�kŲD���h.���r�/�����$*'r�Jy�I��nC��g*E;ّ��.D�`"KH��#/
Y��pnE�(��O����,�GS�1�(,|�SK.��>�X2��1�Cو����T'LƂk�+8��KųK�� \��Fr�@#e�ťZx<�v����u��*M�qaCh+�tU�,�����L��Q��h�����ӟ?��;=�%.�
Z<�����	[�2U7�4����<^�%nRFEv���E?hH��ͻ��C$Z��cv���iˎ��I�	_�M���U��]$"/Z6$-�-V�#�	p���;Kl�_�|��/��!��
*(��N
��5�rO-r���Wx�MH1���Q�p���b���z�#�{$.���C0ɓ6����Z��7r���:8 J�U8c�2'����G��+�u��7���?�-�`��qIxU(��]�5a.a����#�B�۽a�]��T,l�k����V~%�\�]��ݔู鎼� ��u4�d��ޠ��~��m0����f���k���d���v���U�kY�KȆ8?(%�S�ɐuB����'^��.R�Pap>�5�ZcW�x��O-��bY^ �Pɼ�Ԉ�UC�U`��j�X[37$k�-*��̛̌�qg�����6ɦ�S?����v�3e$��[d�D�|��B`@:��F#.����r�TT��M!b��$0h�8*B���>g���`�ʆ���N�iv��q)ckb�_RI���T2�����{��g��{�@�N�5��.���+׹H0��y��C�-rY+���pw��ƒ�W*���q��邧l�1X�xYM�ۧ]-E��*��+3����u�(�q�=hmA��$ə$Y��xZ;s@Я)�V;Ǟ�C��
����d�Q�wI<
;<�pIi��_�����lE��@U�o������Z}4=��\M|K�H������?Х�9M�~ق_��˟��RPS8�7F�%D��p&�{C�g��x�wcvczuq����M��v�ֈ7ӿ�(
Ƞ!ѿqQ=���8ί�'
��(��N{bK���RXd���,i4eb�����vR�㲍�g����(�O��Z��h/u�%P���Zt�����E3<�c-�)G�j_�8�FH��7���۪S��p�yj�
S�sӼ�[1�1�a;�E�u���@\]��JjK��4U�g�Z��̱�y�ua@�o��d7��q0�}`@�x����!T�+�I�eW�5���3jV���{�s=-X�1a�x�^�\R%?�Z̋w��|;�����6k�9�| ��S*wj�?m.~~]5^�V@Ρ�9��%���05�e��+VC�j��{��a�r�;K�f�{E��{���*��
�YƤÇ�d��P6`�{T��Y���uW�E�&�lʬm: �H�������`3������!�=����MwJj�̨�2p��t�Խ�;��Pof��R�͌�B�����ݖ����6�Gs��R�m5�,�)@d�_2�f&Ć���}�0��w	u�J!�H��R��4����0��nP��8�W��l����n`tx��
�}�D�^|>�`����w����>8\C���?�u=�Z�Vr7LacAdzזK�[j-
[��(f4.�e��|��:��/y���N�'X��7{�Dt���4�JғC�ԏ�K�ԫ�Fc�)��1p��o�%��إ����W^l��4���{fϡi�+�*OE2�̡��n-�@`[A�r9�.�x�,]�F=��`C!̆�ﭐ"D�k�]��(q�j}���{�1��1�4����Uq��`[\�9�%Q%h���)���?F�o����8֪���t�HT���'�"-��%�?�/E��U���p]�Dm3��<enB���]#{��Gힽ�8}����yNfWЎrM�	g�����g�7K�p��܍�A�L��1����/�Fn��;�}�wA H/�٭M�aC��<>m��s��w�/�2预��h���v�=�tq����l$���A3�w���L�XM���3��I�bQ�2�U-̡�K��A@�^��=���
�T�gql�b��5��Q�5A�']�b��'��C��i:��KhF%�V!����O��������b84��j���v��J0:���1x��WMl���/J����ɒ)�ܥb;h,Q�Y����1A�*���Cr���zg(�)\���@��C[�Ҟ��&�-(��%��\z롇��7�KR���<�;3o������_�>��^ɹ/>���v�{}[����w�^����C�*#%V�#e&��T�1������5�N	4�~��7��d�d.YpP�#�d���/�ZJ嗗��k��|�(%�/��>��!d&��@�Қ�83�
���9&�_t�5M0����$F�;�׈p"
�d�Fu��6����
���N�ȉ���/�x�J$��æ�g�ϑ������e��my5VU�D�B^��RE�>��$p�,��>����iɇ'I
��X 7��4ʟ���u���K
�di�m�S�,Y�Pi��y2�W���4x=���&ƾQ�I��� ��J��J�[�<~7;�j���L��i�NX�X$�\O�RbʿU�ն!�-��*�[��y�3RYm���@��8`l�	�?�~�	���9 ��!����&t]#�!<���uIxY���3Rj@�nG�;�iE,��a�Z�e�VG��"Oږ�D�Ϊ�	���T9��ϛ���Gz[�Z��TRD�բ�M6I
˜�x�N�gZ�����|E���[�i��",�9ͭ��]��XY�q�J��W�w]}�s�9��l�Qa�X1	��g�f�ܲ�˶�[)��S%�1��^��'�4�ǚ���Z��>�}����>�k��9�"Y�>�r��W�w��Ի����=_������z�!yL ��Q����D�$l�D�⇙�w8�'|�E6�T���s���C�P{nj|ۓrЈJ���D�R�a!�����H$tqA�>6�f�E��3jlR�z:��O����Gg�g���;�eG�*)�\��9l1XG��S�©�/���E�S!1ڻVÓ�"t?3�[��\i��)(�0X�2�B��<��n����~�3�DTy�w�m��ޛ�zeE���r=�nXB��}0{Ϭ��}�Y����A�rچ���5�1a�t	z��Ⱘ�=G��$&�d�0a�4�yy3���f���k$r�#���_P+X@���A7h"'U�1�/n�z@�!KĞֱ! �ݷo�R+V��^��ԗ����&y{��7ӆA�Q�?��q�8�4�����`5�\H��^j���<�&2������`�>Vlsv
�ΔLG��V)��~����L�Zb�
��O▒��6#�7��Nb#=2�3ttJy�eڦ}W2�Ȭ�=N��p}��o���Y�&{;�~�l��wP< ��1O��#�?�#����JUчX	2@��7�#���ڙ���g~T�̜�>�4������}���t*n���U�΀�O�SW}<ty*�A��)�]�,���+ꃑ[�/?^k]��+245�L��u���Q�W/��������@�����Jo��M�ߥ�(�۫~69����F�l|�T.ڋq7��H&���p�au���/Ǭn�d����^Ej�q�!��V��t��s�8��W�3>�����ߌ/�?����0O�,��n�7:�`��ܥ��)�����/��a�c�K1��ӻ�ā���U��9���]���kC��
2�G��]��~;��Ҧ)3�.̟E��ۀ1����v��e�'C�;��%�(��dь��\p�8_&K6�M�둗���UO��!+3���o�i�ˉ�*7��޸:9ۍ�~��N���|rf�E��)H3X�ɴa��F:֙��Sz�T�h���Oz�€� �Kk�J�ä��k2,e������RG/����X!}���1���!ӑh�0��]Z������|�'�}��iuu"=p/��ǣ�K�)0��?&���Tn�Z|-;�Wk(f^���W�z��r��x�Rq#�8_MKt>�8_Tϡ�&'�'RɆ�YҮ@��	�U�Gg�o"��?`g���Z�R�z��28��<�<�_sW���	�~x���z�m�JI!���T��Ԥ���ݔ̢�+$߳(�p) u]]4U�
%���57O�[�L�^~t1�|�".��1�|x��QMkQe��43miR��
�Nfl*"�4!X�T*�B�2�l�N�7o��B�{�u�B��])���O�/��q�$3I��qv�s�9w����«Ӹ`��NN����ޓ*�]��7gn�e�!�M�PA�͌��|7c;W�z+)!<[P�	��whw
��"B���JzD�B�R�]AL�뉪<����X�?Z��{6>q`HM
K��G��J�-�����0P�����}�X8Gm���]2w~.J0yT�sXI?�*{�w�W>���[eM�hF`{��5���P�`m
&:(X$��!ml�O��S0}Ω+�ApO�CƑaI��a��p�Ÿ0���8�i���w���~9�~
3ʲr��`_'��ٲ��E}6�H�⬫�2���Q�Po���o���#s+�e�kk~Y�m��r�Y�r�yjZ}輒Mො�9���vX����D�i5�]XZ�.�}8ZP�j~�d�q-��}�<~���dn�H>���.���~x��)�Jb��ezjIry��������JIFf��]IbP8>%�HAMM�B����|����ul�Y�|�Fx�{%�WbC>'sJ���xNnf8�_�x��+�Cb#;[fq|Jf�f�BVK1���x��W�n�6�?���&���$0�I�ei6�Ț�I�����b+�I��ڼ����J��,���x���#}�:����ŋ���}��[Dj�z�t���?�C���G^
o�TJL%xi�,���~9q����F��r�tU!pST��~�|Z�;;��X{p��i��ܡ���p���O;;��SQ>w}�?r�Ğ�<����Tr�"�T��{)O��� y.|��Lq�"��^/���G��_�ݜ34&	�vs��z�D�Z%!OWZ��S��\�GO�O�,W�X�	ɞ�d�*!���5�"X�Zp�+���mz~�I	o0��
�^aH8�K%<_i�z�{@O&�B_a�����+����4#{K.�n)-%"���0�S_���-r���P1ʞ��F��FiF?�*br��g,Q�#_m�������l*�A�V`i[%+b,q��’(
�S'Tن/�t�
�~,���!i�d4����~2={��h�z}	%v��	��\����<��!��T/2�L�T.��{I�¢����c�.���P�c�}i5\��Ю#X͎�P����7�F�'���f�1�k�����ѷ�eĽ�����+�v�������\�;9����	SEGc�����ź*�L��GB1�����4&�B��Y`���=h����Ķ���U�+�v��b*h
T�F�/p�r����Q{��m��XX&��jsQ��t,Z'��O?B��c�U�]j+O���l3�Sֶh�V6en��6���fY���B��Y�3�gRɎ�5u��H�%����i��m��}4��L�C���|/!�(!�

��ޚ*$��~�!+P汢���xf*�7�08wU+��0��a��1�8�/_�3�q�^,����`�`�]n1�Wt���ь���/���Q.�g���tt<4_k��	��Ryq��[gn��)����,�w���z��|��Ƙg�ɻ���s7	�vR����"/�"�
��l(����SD�$�d����K�[�m�B%J�Ej��my{�x�G��E��6!�5IwK��0n�6��6��tN�f�D��'����at�4���g�k��13���Ĭ�?cc6�Y\��WD�ta��l�]P6�;E�h�zS&_��z��L��?�1Ew�hCܘ���yIq��]�Q�Q�(�)�V�m�|4U'me�[��D.�e�l��՝�<�gĊI�L>�_R�Ѭ[�mՇ���u�j����,����&xi�ݸ4^u{6��PA���\�k�_�wv�R��w��z2�N�;�*����n���H���k�;�l�WoT��Q�닐]���B:$��ck�z�e�j2��ׅ��\Z���8E�A�dU���崢���Zx��&�HaC{=��d�e�d&�d��(�*��dd�ځ�3K�B4�

JKtT�KK�Mk.���4
Ed4��`�!�����Wj��$&�p+m~�.�̨5�?WȌ�m܉���DXJ�JS'��ɰ�%��Zo�����6O��x�{��\a�I֒����'g�C����x�YiS�H�~��gl��L2��U$��df�ʄ,!�/Ԃ,�m
��U�0��}H-�9D����}��|��
���h��FY~W�ә�w➨{ң���n�I��Y���0�R���tL��|�:���Y@ݙR��p�X,��T�����Έ{���>�Iһr�w�Ƽ�Ӎ(d���08���{�,�i�f�(�����,�'�ʲD�σ(KeR&YAj&(
�,��0!��E$�y&c�w�?��Kù�y���5ȋ��^���x��WJA���,��<KE��ͯҼT���T�b�����i������b,���x����HV�v�wT���(	���"M�pL�V�t,��H�"�Kd�������V��UFq*U�$z#��̾�7aA�S�j��y�))1���P�G<�n�8	�������4ǵ}�	��w�'e�>5��e!�0a\�g~���?<�vX0��V�ؒ�?q
��Poao�,P��l;��d��2*bm�N��5(�寭{���6\'�h�xlL�k�����)D"B):����L�շڸ
��Ï��|xyy���^��|����$,�č��N��RZ�G����>��_��;*�4��f@geJW7X�WڿC��HJb����|�o-������n�B���[�tvH�T���u�]��B���H���ۗk(���A��5�Iل��U85���KH��\o����ݏ3AU� 
��O��O�&�y|'`Ơ�	����hd�]w�%��i��}�G���B�xQ�<#N�rM��ahHL�^X=G�e�IE���nP�VD��f�v��OK��ڙ� ����掻�ˑmp�������@.�R� ��=d<!ip<��+�'���b./Y���gUZ��H�AXi��F�Ƨwc/���0<�v���j7
�[�C�ևA�@f%�4c��^&�V���+�?��S/�Թ���UX��ۡX���;7/=B+��!�}�=��$WG,�^3�6�: $.�-���:JV$ɛ�*�$Na�A�*�ސ�{�fE��6{�$�RV������2G�&unFز����l�l(�1���S�'���9�!G��8j$ē�̹�qa���V�E4#)�#�K�P���0N�N�FH�2k.YÎ�{f�?�*�b�>���q\����K4ȝ��W[�]E(댍�G���Ӥ6���+Ü\�~�
#����.��o�kI�nK�i��
ذp���W]͉�N,�6�]�Ө�ލ>�G�:Åu�:�%�1�
5U���p��(R�V��J��*���#����AڮD��Z˱� \�g>Z/�{�%���VP�q��j�[��G�+r�x~.�1p�Tu�I6�V�r����oN�_�=}zv{�tD�S�8�E��ɮ��A����|��*?�ۜ����(O�D��Y*K��(�����Ųn�wW'/����tA8'��]\�����$���D"��+K�7��D�S53��g�A�{�˭���%�
���K_�P^��%�D�ng�ߛ'��Ep1�G�I{�Y1N�k��,����Ozun:�b�������e���x<�L�������cnW���lb�i�'�
<�I�heqd�dO��p�a������YP���jjdC�WN|n���pZGg���0)�>�S��iq��5��f�Q��,���mJLI�Z=�`�H��fKZK����M"�����7���1��b*C�%T���
蝙��[w�.r�.yR�L
�;.]�_�_;&�@�T�U[[�g{�X��_���yV����{3.[AGUf[f�N��`��S��pHh��g"�-�bL����������O���"��yJ��XJ��Zb�r��TW�
���yV6/��bQO�4a:�\�Uc���mg�3ZX����
�
&K��|�+��=T6���{&Ȧר�4@
���ea!TY�d����+��P32�@��|�C��hn"Q�<!n�#��������-x0Z��y�U�d���w�����C��SS�?����YP51�HyXQb 7�L
�D�NuL�;<�dn0��tp�	�}�0�&�"���"�aR�ae!<ՒC��1�ė��9��0,n�8��bp�(0@M�n�q�N�c7 e���k�=��5]�
a�b1�S�Nd��T�� ;c-�K'p���]c=�'M��9hi����3:���_�v�f�S[0c��X������ꉷ���j��/{(�Dgh>�x�h����V�a��D�o�hcE�'8͚����ɘ�`dfN��0��y\H4-K��HZ+�JCn��a�Q�4V~X
�Ԩ,�Vc<�S����zD�3ݏ�z%���]���ӄ��.
-�5l�$�ܓ���C�������C�|�{1yMԶ�އ"�k�l,����DF���FO�a'��y����9�7G�n�kR�㝯z!�Ж;��3�%�i��:���C��Y�Ϊ~ȨF3D�|W�Zݮ@�K#4���,���!�%�Z��hy�R�K�]D5Q`�QөEfA��B&�6�?r�V�t�:���jO�(�Ŗ�`՚��}�1��R�z�g���*3b.�w�cD��Q��~�7b�޵\��@�ǒH쬖�(»���ִL�-
]'�X��ւua��x�J�ñ��'Ė���#JS�F�P�
%ҏ��n�>W�Y'�i�:����������T�U+��ox�z��J�ۍ����q7�l�`x��TMlEV���ib���N�f���ؖhA$!Q�$�T6��g��+�w���)I���7~zBHa�^(9q�́�!�2��vD%����̾���{?�'�/fVK��r�:�;U(��̴��ô��ޟ�/�� ��mv2�Av���M�"HQUl2)��\3M�A��(T�i�i�Ű�A��
^���$��=���/�GW�𩿛YO�
��P���ў�?�/~?"u�H���K�<��,�Z�2�?�笡�[�Z1����a�ֺS�U+7[��&|���q`��� ���%�/�'��Z��l��v�QuQ�a/�ref��t�*��]$7���4�ٙt�`���@Q�&Q�uT�{�lr��Bu
�[������<�c��,��d6#ጤڔb�I�"(f65�����)!ۑP���^�.>���П���m�_xΑ�Y���k!�Dd��8=�c��}�� �QFtrӼ�P�l�{�6P�\o�٨������,OR�e����*.Z��<���T�Dc=�]TI�R�D�.Æ� d�m?�V������R(Uxe=e�;J=�Li�_K�����;����I�S��w�������V��3t�tnS����02�8��Oĺ���lݝo�Z�N<4~���\"��A3!���5�8���MU����-���JH�yz+��n+<@�@�O5�����˼�ƙ��?�Lv�x_D^0�18�ŜN�o�_�:���喸y��vIBEd6|�-���x��>���G��%��ݜ��[a�?Q�M�.#�}ư��8���#�3���j�R���iߩť')F�+��Dpf��EݞA��n9I	6��9S�L��,�0F8��ǹ:5�-Y�e
:���U^��;�����W'<� ��t�u6n���p׌�a�
��������e*w�����ؓ>��=�#��	�W_�������3�bx�]R݊�@��.�֮h�.���ΆmM+("[#
���]�
u�Lӡi&����}��Gr#�y�K��L��.3g�����~���m��³����%3����|�y���e1��l崢��M����t����\�[N��}�Aħ�m���G��~�2�z@'`��8���9f���`���z�m>V�ܗ�����ۊ(Jխt�e�ʌ8	��I�ri��(Gb��e-�������7z=���
?q�=��n�4��uB}2"��@�����X$n6���q丰��s�V;S��~*C�4] '�D�O��@�iC���:��	�ٱ�OX0:���W�d��k��3�?9C���Zyf(Ǡ��2��Ou�V&u^�
�ѹ��@m$~j���*��
�9��Z�$�8sW��Z���̙���M��Ѕ=��)�/�>~���Q�ؕ�VluX��$����\�!ʷa�2��y&���F9���IjZ�ã$�i03��\��{�w�1���7t�r�E�'J��/�2��W�%x�}T�oG$n���WMǐ�l���&D�*��TU+E�P3l�J�]�;kQ��
	EU�.��"q��H>Pz@�֜zDBj��J����z��2���y_�����/���
ef*�U�#bâ�SC�v��.�Ep5"k�e��p
��-�kQ8�3�i�rtf�߂n:����ٔ0�l�j{&?��I��6ռ<�Y�`I��;�!�l����,�����=[�ڎn�
�jP69��W�VZ��B&�a�7
n�G��C��>�~�)�كk�IV���g�&N�r>�&*�������M.�O����3o�<]�T�4�'�;���>N���.܌M�do����
!��#3xz��_O����9���7c�ۮ"�N�C�Tƣ�,�YܛO��YN������A���.g���v���lѡ� Fqc��d��~���(��\���}���]�<��'9Y�<�g��W��2A�4L��JS��e�@�:����yӭ
x��'F3x��?2����p�Y\��=�#�K�z�ӱyN[bG�x?�\���&;m[7YC���=jT�{��?:���U��F��iQ��Ue)$Iy�b�F���zIgu�Z����0Xz����RN���_��@UU���J�eZ�]�b�df������p��\t��=e�O�*ǽ��G�kh��j���}4͕�v,��(O�q�h�����
j�U
K.�����A��UC�P�cxkr�<���/��UP���}�y���^V���^p�-Ka�^/��������4@s�S��i6ؽ����T���j��:��/ځ�T�!L�t7<�rip讕��U��B�0�"�^x�UQ�j�@�-�������i�,�X&=��Ӥ�B��>8��X�cKD�*�+�?�3r	��SN9���9�/:��6�˰o�ͼ7s�_���������W]1�}8���G<��X�3�r6�<E���j�֧ϫU%2,����-ύ��j�C&X�
� U!O�u���/��V��{:�
B�(&f��I(ZP@s�XM���n��o�O0ʫ���W\,փ��a��DD6[#
�u,X��8��'�3��܎��ʫֺ�SI�?�?oM��$L*�8�F���o�u�{��$-�b��`��#��	�*�6t��{�G�p
N(=�&3g����4^w�}ۤ"���:6ݦ�bI�(}��0���`v��tM��1K&�;Uq<KR�[F[��_K��6��}�+�vcyg�4��h���2�jx�uRMkSA��|Hkm����IS|)�T)�X(E���w�����93i�"�.,�?��Byn�u#RW.�.��y�6�g1��s�m|����T�3�i���}�
t%(r�1�w�%�����4H�o�`M"4+��f� 7Q�ř��Χ~Zz;Y<%�4��)�J�N���I權������|����0��D�
b�&����.����O-L��R��C_����s
6T��)(�}iW�����<XZ�-����[ QP��3t! �x�P�iq���.­��o�v���G��3�\�����*B�~���l6���N&�
[�=Y\�P�P��	���F�#�
��.�~?zz�>nΕ�R=7���e.�3㣅�z�J�P��L볹��7�e�;Kg:=Q�hT�o6'�������;6��kY�Z
FuϖU�J��>\�V��+;�����jc/��#�_�?���XV3,L5�d�
+��X^���i5���G�[�wƮdhx���_���ef�=A���:���u�y"mG�/���T�r�n���p�	�?x�[��쾡���%_!/�D��4O�$#UA�9��1�U��M��?D�5�38$X�&%�NI��4��RO!�8�4�X!3
���8�H!%?�lPFbY�Ԑ��̲̜�t�T>��ĒĤ��T=u.0���i��)��s.��x�VmO�H�L~��ڡ$���Iң�� zE��.�h�l�g��]���f�o�����w��g��C2KZ�v��H%�Z����I���6���:��ۇs5cΙ4�KLN�Z��1�����]f�&�0\,]�6��۶��u������c����"[߁{��P�wwsy���[�v������ߕ���*��ߝHI�0���`g"&����TG4O�V�G��Z�͹I�W&�'�|����JX~�j�����|��#m%JriK�3��v�I�����5��������K�2���PTQ̌A�����rb����,��B��heyd����,���M�m�y���'�_��	��苞N�p�;��'������2�\䔛H���>Ř��e�i|�q�Ft*%%��R40V~����z.%�����^��j���\=��O�TH�tt>�cp���)�}S���������k2��ן�~�Rɕ�z��$_��Th�6������i��"w��90Q�i����VM�QY��笽Tc2$��k[Jt��̨ݔ%y�m�%��>t�0Z��߭�nF���EV8�AO^�� �.����&M��P�ˤ5 �gPSj�k+p_ 3�dRB@V=7$ԯ��-�#�]f�TK�&��N��J��˱�|�
�Re�^��( N�T�W�=-����h��f����9U�LV�!�&�ǒ)�9��K�x�n�Fi���2h�۷𦾬lЮܑjݥsKq��UkE�}z���;��ي�ԯ����Έ�1�0c�4vA��a��Ż�ǜ��;w�t<U̹?����u��[�B��Vr[��ƪO�:P���!�^?R[�!�҈��@R7��F�I���hNj�	�{�,�$R4Z����B��c���֞V|4��)�7Œh$�k�Z�����g�	��Tp"�T�bR#k�Z<^~aA�&�g)�V ��O��K4��}'�{��C��x����^��V�7�d׍�eCA�k��\Kg����{�g�>'��0
�_���K�>�Fq������ӥ�Ͽ�I�����m�G�J�0�D@n��	"�u��	���z�!�DEZ)��n*u�njP��"�&u}��>�����䗱/�/��xf�w�� ]Ԛ�O`��4���:�Uu��+��wѯv��4��u�����Pn6�7$L����`�J��2]�2����`��W{�XP#��N��Z~��GO��Q�{W%���<�j��R�O��ֿᲯ���x�[&=Wz�v�j. ���4�
Oc��z^u��	?�4(x��Q=O�@�R�&��pb�]4�B !��H�A\���PR�h�?p����������nK����>������c��O��Dj��
���N"��
ˊ�HKv)�V:�s��j�����
��J�Y�4�/j��J}/�P�,�	$n�8%��0�Å꛿���v�=�tƌ;�١��r�f�4���	G�P�u�/�>�#@�\�ȍ��V���!&�zk∎��&��`�p�u�����<{��B׋3ͱ2�
S�1J���g_c�{���8։cp��t���&
b�9�iN�6�m���`�Վ�Y��|r}�jD��:��ZQ����k���Aa�&&�0�I�������~4;0r�M'_�\�W~�[�!���jR~�7�Lg�P3�f�@�w�|K��^��,x����Uq�^�Ģ��J
���u���<u�͗y_3n~�o�o6�-3x�e�OkA�ISj�m� j�IWg�.���č �P��1E�)aݝؑdgٙ6��	ބ�x�H.�
����<��l7[k�^�����������Z7-?�ӣ�H�����n=��l������8	H!c�|V��NXU��,���07ҁ-��C�"��{hp�O�GƔ�u/���ŧ�}_�!i�]�|̃�����)
�k���c����G�*Ȅ����&C'��<�$/�O����g�(|��ۥo��8��
w������ʒ�p�%g>��f����y?�,��֣���'rڠs*?:)���J�U��=�
'$8�fW�0��ʍ��h�`�m����V�a���<S��V�`��ʊ'p�>�ED����2�`=$| �c�_��w�Tb,P�?Z��e���0�>�8a��FC��\���"�G7��]Y��;�J+7
h�t�fHVXK5�aV/%�6�a0�0�]�l�FĄW�M��¥����m��l�����yx���vGsC'�nrn�n^j��d6.C��d��Ԣ��<���u}}c=��9e6wq�f���#�W�XR�Z���
���M��(�+��'�$+@M��TW��z!D�������$&���@M�B1
�0u=����̴��"����)�,�+1y���
��:
�y��Eɩ�y$&��ꃬ7B�>&�+??7'1&��78&f��+6�0N���Bћ�	��|����
ql�����gz��
�~x���yNj�gF���T���ܜĒ��������XLhIf�揌�,��9�&/��S,K-*���S�U�YY���@ԆA$4&�sIL��#"�����S�hk����S<���dE�ͼP	]��ʂ����D��PDt&o䖜�&�'.J�IM,NJ�n�#����Nm��x��Umo�6�l���AR�Y1`����ܠ��6[�n_4u��P�ʗ:ސ��#e�o�m�`��s�wϝ���m2:8H�~�]Qծ7^}A6�����w0��oa�k�`”��,0Uh�a�ۏ�C�j��b4���C�
]���d���[�����/~J{�s���X��-
�}��d����t�u3��u#��Z��ke5y1�\����Jp&�jo8��V[�Y�(Ikж�N&k��qGCs��ێ��[��E3�jv[�P�'ܹj��~OM�:;~�ɹrhf�×l.�Fݴa�pɬ�k��Fߣ|p��n�tj�a�%&@�5�!wXB?�b�_3�-����A3����LT�`�GH��̐�E��X҄�w��O�0'�;�{�R&�p��4�ǼFˍh�Y��H]	�,&���@H%��ú�G��o�yR�r����w�����Ӳ��鈉hA����(�BU`=��Yx8�"�����ٻX����8�3'qg��r���9��+˕x���0�@^��m�(��~}~u�z��ߌS�����tˊ2�����{�ٶ��/�v�
}7>'���|�������	g��
�vF��
�])�0I15���{��lw=���?�n��(����E�,
��+��lIgMu�p��q\f����En�b�
�
;��:���	]��������N6����ܷL�
͎���di���e�����I� l�JeK��n��48�*|I�Ȳ#���`�xb�������fB�>�l���<߀��j��]:�<u��8v�ȶ�
�,KC��We_��p�����>&�g��y��F�Eȱ�T��؏����/*��n��ix��"p]p���D��%��9�O���g��NV`\�VZ��������q��+��I���ń�d�Xsq%�$+��g��)�V���+8&�%&�����чQ�&9?775���>��$#���6�����F&�ىy>c=�X+���̜��Ģ�Ԓ�Ē
��̤�Ģ��b�,���!������z�:
*%�źv%`��)�E��\
PP�ZX�Y��������&
�����ҢĒ�<��nc�b�W)�Q��a�\����������Z�Y\R��USS�z�^�r����%x��.�Oh�+F^����⒢Ă��"�ͧ=�e�����SK
r2�K2��4&'��l�b=�P�|��x�YmS�H���a]�L��R���a7�B���漃<�'ȒJ3���4�l��ԭRb������d������a~	��.��Z�eo�갻����k����,�w,��GX4�s1�
9�>���*�t����ۖ����������C'�+\�#�ހ�JG��ڶ��5�q"�t~�
�Y�S�B��8��{3�#�*�85��(�D�B��<
8�<��Pqz������q�0�yW���=���/������lGw����T�����m���@�|)��Q��o�p���>�ց�\����
9ox��tp�0���Z��6��D�.
B&%|4��?+�$X�߯�Qt������y�t6<��_��ǰ�Zb�|G�L���{���w|��g�@�`&��:�@/[�c��X�\���冥 U*��]j��I+(>�M�0�kt��7��l&͟�Q+�'y8�t���B��<
(��1�y�},O|�x|c�77�~��#Jg�Rt:���
E�s��ԯC�v@�k{�>=�kj*ds�P��l�S�==_M(�U��7h��/�z���{�Qc�ң)�R���Φ�-�&BR1�	�L�>,��+3d��)=A��|�r9���h��U]Ά[��{��p�����J���2[�Ыނ�?�mr�6
���ոGܵ���6
c6�b�"�?�7�͏����_ޞTm��!q�{�Ky@���-�2<Q�`�E$	ڦ�\�S:+�8A<F�ńj��.r�T��v�b
*h6�Ľl����J	-f�) [<Kj��\q��@MPOj@�]@-�m��V	,�Ӽ���Gs���	��^�D�BȲ���O��4��z�GVą V0u�|cM�+��l]*�
�]{���C42ku�T�v$���z&z{�Pˊ�(���S���Z����n����c
��c�>0�D�))�e�Q��%�+�|��ABnB6O9֤�?M5��h��g\�uA��H^A:����-}��_3��ӈ�M|�Jߚ����a������u��p>�O���eS�0x�4p$<�3d�m�����f$4"���*�����WIT�0���⸳<��
�D7��	����f�i��ؐr5O��F
�S-Kw���� �f����
Ũ��b�!�J�›�ݲSX)�B"?�y-���՛��=�����;�?�lJ9�f���`z�����M ����'ݳ������<��0��.���3��n��';X����c]�F�g��X�.�d��71�`{��I�dU�Ƅ��<�7�J�j�F� �]�w��U�Ja�z��F �r&�x���k\-����ٳ�t�s�;3.�U^o��R)�x�+�Ʃ,1�7�,Qw�ux�D�0K���y��Qp�Hg�L���Q�
�ɗ?YDi�Ns��gF��K��bz����O0Ŷr�9�4i�Q�e[�\�/�^Q�vZ�$E�
��e��G���K�B2�q���U<�A��z�m_��|�-���7���V�!zF�*B��<a��j�y_1���ѴOl�l�8$��덼�kNlk	S4�r���`�/��^>ȧ$���Ķ�Y�Ak�ڗO뵶�ks���ТշCK�p�#I�d8#H�3]���S/sY�YP���]���ߑT1�\d.v./�8���Z����1��҃:\t��.,2t�7[)�߽��wZ�[?c=��c<:���`��=mϼ����
.���D4���j������SF��w���.G�U~+�GP��_�/�:�*ȿ�ST�5M`��F ���K��M� ӀO2��<
�iCw�Lx�G�|�[��5�}�犑�!�w]I����vĵ��0l�K
â�-rA+!�t7�	��
����*�]{w���qz���,�7L9�&�ɨ���v�]�PuZ9b�K��U��H|�&�ˣy
?�!1j����.��pZ�T&�2f[�`��}B����ި����Pi�eX3_E�L���w�t�����Q��q$�Ŋ�)���"�W�i�Pb�5`��q�zoɘ���8
lj~�*2�\Xˀچ],�v1Mi�Z��=5����/!�flo]���W&S�p�{H��O¥/��\�j��������(E>��'9:s��}ܭ%����{���y*/�j\]0�!�l��q.1q���@��	�T�/X޺���[�a|K�n�I��K��S�F�=`�t�[Wv�����mʻ�>����H�(	i���]�:�+4�}�\
͜��U����~��,��2
y�&�NzR*T��?̜����-x�[d��jC)#�GjNAjQLHbRN��]�
�W2rOn`|â�s�"!��L^� Fr~^q�B�k�������gH|��c���/HZ�VA=�����J_?=�$�4I/9?W�$3h�~v~Jjvf�nANbIZ~Q�P�f>�,�
n�E
�i����Biq���nQjA�-��Ɍl›7��3遜�8/�\�

��Ғ��Mk..$�R��1W(_pI%P�:�m��%��D'��..�,I�P�PYY�Y�_T9y���hr"�!�0�խ��N��v����T���m�bD���5��CU?���9D7O�$�C����6x��i�c����W�RKJ���'
�l��}_���
5�x�340031Qp��L,�+�(`��#�e^j�����Jy�O��p���E�E��%�`U�ϲ��p���(�"�}���;ڠ��Rs�� �t�\���7˾��os����ض+r��x��V�r�6}��b;#��Gm�t*%j]�3�'�]��Kܑ!r%�!�Ҍ��PH��"A��={�Ի_ʬl���M8�_Y.�d�q�~��"������C�ӟ�ZfL�5Z��D
�b�#\<�vޅ03����l6���h"���|��$��y���;�X�o���R�Y�d� �4+�	7Y5�&�����ș�2�s'�BKJe,�!aB
����T�������7���KF;�[�Nj��EA>>dR�~�Yi��E1�ba�J)P����(+S�^	�jL����ܔ�J��s5�
���Me�O}�2sn��}�
>���Q,1vA>I�3
87(RZy&ͯM��T�`b0�q%[Po�|R)#gR:c�(�^ϳ�H�ݖɸެ��h4P��`j;�c6� :4��:Q���`g��idʕ�H�����pg�^A�}��ӛ^���Ͽ��.?^�:�`�h�O�=-�/q�sL*�����
{���t/^��m�6�����0�9qΉ��u�30LM�S���C��ɔ���<�U�F^��{�KŅ���i�;�H{pD�
��-FQ��4b���[Ö��:Jq��U=ܖ�˂m���$1�1��Yl�u�M�M���s��V�6S��/^�`�5�fQC���Jh�N����r��+�)"�+������jc�eۘ�O�S�EE
R5J�{T4e�D���z���,���	�k�E��a��)Fᅍ|
6P$/cAp^�2����[<�Rl1���Fy�6'�I��;	s1t�a���
e��������Cx&������:�~#��:�9,YZ3�S��k�,�p�����棧����s������24��C�e��rw$�q^Rg��=AL��]G[��^rO�J%$%|�C�N��-�#��i/�g4�d@67Ԋ�c��=Pi��A��\�96���9.��k,��i�@��4U������**a�4��wfe���I���ex��(�%�a9����%����d��ip)���ԜԒTuL�����VVa�>���~�~�ؔ�
Q(�HUH��L,V�LS�,QH��,.)����l�8�,����,ZflT2�
JKt��SK���9FӚn�JZfN���dIV������-W�N�R�
�EE���ũ�E�*`w�(L~�&�Vbkk����S�:Y��z�gvga��T�б*��r"�yũ%*�E%�� ���֓?�[0rM�`o�|�]d��qF&d(�>�x��RM��@&�n�Te�ڭ.�)��$�����u�����4�l�M����Vlٓ ޖ��E�^/����D<�'I[[�@�0a�<�<�Nj�O���$��T�[a8��}N}8�ο �.����5ާ�y��D.��O1#����BN�������#��n�*Hʩ���vh0�M4!���`�����ɡ2�0��@��V���;C����i�"�r���!b$�#q+&�㘣�&��?���s�r����>�~D�O�i��Og	�>�N_؞�W�v�����f���vɓ�0v���;�x@�N�K�Q�¡��<�½��]{!_�4�ˢ�K<����w3����+ӣ>A�x��<��*��^��(��}�!ݚI�b\�Q�����U����t/�.���fHr
���x<�Z��i�M��S[��q\c���!ʑ���>��7).�YLx&�h.XT��5�
�J�ꂑ
</�$
�Z1]���/�y,�d5[SQj�';�r�UQ���`[Y����X��&�ʛr���C�ѱ�}i|��r���b“8�J�
����	���3��G`"i��5x�;(w@n?��܂�y�2���x�WmS�F���6�����i�dB�� �<��l_��T�Ɇv�߻{'��-^�N��&A��no_�}����|���g�Z�^%2�.�x�W��'�:����3x[�	��I,�],�bBA,�pƳ�����׻!���n�f�P��`�c�<�5le���i����Ȏ�”�K�Z�@\��T�\Oʋ0�Y�Yk)S�>�J�+#Y��0Hb!O��,��A�r����5ڏZ-gL�1�ywc��g��=�0��ljT�E�U*���H�kz�K��^�]�zq��C���o���2CS_��PhV���Xs�kL�}NJM�ٛ��	�,�r��Jq��ݩi��k�bZ�4V
�
k�J31T�j����Bj�h6�Q)���#>.�#�����v��܊���������`G1}�p�)���<k�f�ef�3��$���� �vK�Am!��\\���D��%{�ph��ϹC�y� ���V�^�2M�G
���n�������/���'{g�"o��z@{��q]5�e:��+,	h���s�S�ZL�]�
���6�����!�}kNO�*6�
�����A�]k1šB�	&۔C�@�'��|�<��1�)kȗ1�D��_��F�H�!y���/�u�~��=�[
9/���|L���b��=g�
�k6�	���f��u���z�[ɔV
E����D�Fy`�L5Y�+J�{����C�`L5���BYN.�6�^�$h�L㴴>��N�|��>pQѩe�tx%��F2�FG�)��
/L�>[ah�vŒR3���1�6'�^����4�y�����tW���`��!�3]�|��W�L��6@��\i�#s�[�RqJe�����A�Ea8�($�Q���Yh���!2:���G�s5��_�$L�4�)�׹��6Qi��x�cFX�
8���H+�MΣӖ�B���՘�Ĝ�
)5�M�n�����|svt\��t^�Á;!F<c���N�'em��p��!��ل�Ux�Ц���RU;���ަ��`�cPQڕQ'���|Zi���0@E�6تΩ8��ˬD^�c%��m+o*�Ioi�\��+m�ɮ������ӧ6��t`!dc94��
��'}�O��f����N�W�2��.]�G�II!�؊UO�*�9<:�z�
	���F��KE6�ά@ԥ���S�>;vHffȼ��	�N<bW�P�N#��da�Y��<��hƕ�bnE��E0T,ks�I�C<�0�G�y����%&ᰅu��O7HƬ�x?-q-�g���:�&dD��a�!�F$}���t
�e�U)R..����I���	��ȵ��_%��
�(ڋ=C���|w��W�i�J0��Z��1j=y�>�a'<J�M�Я�����g�Gsv���	��f4��<�6������bsss�4a�4�	��F$��Ģ�S,��`���<���w^%�s�ݫ4��u���?~1��xx�ۡ}Ug���u��\
P����������Z�Y\R��R��Y�kW�X��Z��Y���P
W%E��
y��
1A�y%����ɩ%��y�E�y%i�%�
y�%
i��y)V
���:
P��3�JR55��&OfT�,($5�&�S޲�|���3R7��cB�!��y1�d&1��lBK2s��2���SR�3K&�SQ�K�̫�ˆ�%�祩+X)@��\���|P��T@�m.��$C6bs�p"��i���x��U]k�T�2�L�ϙ�na�d6�2��b�k�V��_luW�4s2	�$���2�@����y-�BAoo*x#+�����I�����*��x��=����7'e���Ҝ��C�釞����^�#�v=,�8"`F�w4�9A�
|����dn��ms�@���-/�xc{�=0�.ܻw�.%s�H�
�A>!]�	��Қ
�>,M㗥Wf�������ড়��)����I��	�V���gR���eT���f�G؇�m]u�0f��}��N���&h����?�/�ن��%dݤ�<��C�1�i4A��^L.��C�<�h���
+s5|����w��	|X}���c��0v€���	��p������s�?��
~>[ǟ��cH&U�𧩵\��g�^�E^>���c�@�*�����?Y�&��T�S��~]��*o	v[>#��A���G��*��"IT�����ٸ�4�t�����&�p���>�	�f4/�� `�n`%� ?�C�&�Yu��[{��C'��a_��p�c�2���(
�M���`9ʸ�'�Gr27�)����6{�Ƹ%�"���k�����V/��
2�R������J�K	���c�'ex���-�4�j��'�㳈ˑ]��֔M9�"M�9��ǐ��!>�������s�������98R�n��d��\�˒�)��8��?.���',sh��'�><x��"��g��ˡ܈��r�F���/�y����Ѿ�,G/p�1�gd�<�t��''�Ѽ=�X�J�ݍ1���녣.���c�#�&�����ˢm��v*�p�����T�ru�و��ɜ�tmo�3�^���UѼC�F��$*F:�L/^������Ki^�A���m�+4\�0ig��W'Z�}�>xlZ��)�|q9�;K�x]�&O��`����Ϊ+ڿߵa�Hбr��
��V��Hx��ez�t�=��<�����JQjqIbQIt����zbAbrF���C|�̊x��g�U�O>�g:ٜ_�*7ِW2 �(�475���.3� '?%UC]A]n��5��	I�
ũEe�EVP%
*pS6�	��A�:
��x��Vmo�6����BR��Y�yI>8��.YM�2��b#�I����7K��u+?X2y��^���wߧQ���~�*]k���y��y����aH���•���+&�Ai��~�]�p�������t2�V���Fm��ǂ����q��mvG{���j#��W��RA���Ka��n�U2��T3�Tl�!W�(�b�4��3���,�2�4����ǽ�d	��������g��o'�^fn��Bɵ�M�Dik��L3[�N�2K����UfҢ^�
�A�Mj)D���&�N�x4������"N8���6B7����X͸��Z�V�����>�5[��E���>�|,�2���H��3M�N&
�ƭ������5<3h�l�VfOJK�`W�
�"���U�����BBZ�	���°J��:r˫����?�\_��nv}ym��n�������ba,�18�����*ٸPx-�W
�t8R
C�;��Y�񱀜L�O_���W~vxs!4�@��5šjxfl��F��a�I5�i�{/�m)�
�j����G
���=&
���^>�#�̢߮;��[�}�o��n�V�W��D&B�%S�ϖX3¯Iա�#�7t_P�i�B���n�4���b"��1��(L�Y���9�,�n�H�H\��u&iL��#ǂ�u�]+�,�=��^8TN�YЈ��sNnG���5�YBR�D���!��t튆�pzV�{�J���9o��(U�&����������j����X�
Rc��[����Rmޗ-�݁���X!Y�6Z��å��LsU����G�o�!3��8�fg��ᣳ��>i�8��w��q]��ٱC�N��	��~�����-yjA�:�l+$h��/�~r����i�p
ՙQ[g��Dv,��F�,�"�k7@�U�*!�-~6�{�L��dn'�#o�;�4�>�QǼ��i4��B��`���Q��!�ֱ�5���n���&���;3�Vr_����
��lhgko�6��q���S+j���GQ�F�^�vv�s���g�d�۬ہj"ѵ\�l�~ejS�Y�>�{M_讝��Q~�������A�[ޮ"j}�
jx��b��&n�$uB���+~���=�r� �x�m��J�0��C���/��n`�u��᠊�<
�i�b���&MZ{%#�<��{��tsHH���KVG��K�8{��j��(R�Ѫ_%�!�'�U��|�9",�	�'I8���guYay?O�E}TZǥ[���Q�>�4��Aߴ��$ʨ6��ޡ��6�~<��Iib�G��B&�AF�<�n��Lr�	C�[&���N��ᲭcЦ|�I{8#�Og����X�fu�D;�qa�\"����%l�#�����m�%��	ZsG�!t��/X��Fv�z����'���
��l�����#Jk��F���"�T:��)�DH�J����gq�ቧ�2�0�y�
���]��ix���u�k�I֒����'�Y?pZ�x���u�k�2f�����+�70B��x����k�&���Tǂ��T#�ļ��"��̼��ߘR�M
��0x�{���gC"��Dqּ�̼��,��E�
�i�yY��,�Ԓd}��~qfIj�nj^bRNj���W,��5Xy�z�Yu\��Qx����w���W~~nNbI~~Nq�s~^q~NjD,&�$3gr��d�i�����&;�h���$�(�*D�Zs)@�JZfN*���ϲ\	.
��j��jQO,HL�HU��z=����̼
u��\pff���qVV��H�wʯ��TPS�4��D�JbQzinj^I1���܂���T
uu�2Mk.w$$�W(���Y���0%�I�J�`d�x340031Qp,(��LN,����+�(`0����-�0sa��]QE����N��%�%E��E`�k-^z=7��y�{4�H`��ϜP�Ή��`EG��x*���	�?���/
U�Z�Z����Y5p����z��o?�t��t�\��&=��В��ysN��^��.��� �P|;fœM���:x�<����C��0�+h�I�kOM�W,Util.php�Ž�ǥ�Pj��.ܺ>V�]H�M���x�ZmS�H�~E�kmR`�K�}�.lXC(r����f�=��Ȓ�����{zF�eW�RˇĶfzzz�~�e�Ï�rc���
zL�I���<I����b�d&�eT�˜�i���l��3�yq�'�������e����dy���y�h�>Qo�I��)��gXw�t�Yf⌂xB���*24����>�xi�|ss���A?6��ȏ�1�G�^�yG/ߞ\?�*�gq�O�َ�vf˨?�ўΎ?>z���1�&)�sC� N�pD�%E:6��<̓��w66�`a�e�'þ&q�D���"3�x���A&�0
)�h��u�A��x���A�W7�E0f�~v���,�H��o��[9�W&Z��n��d���PUvA�sn�I�t�4<9�qdY��E>�5i��k�Y���O�=��e2&�!��`܏�lվ�;�5�jXw���o�&��fB�^�*Lah��4
n{��7�%K>���Su����4��C��#��GϗA,�,EԩJއ�YJ�,cΊT�B��sX��*�J9��3vB�0^�<$�+�
�Y�0qNy�;�'�&f�S3��l�g� � �fn9��?�trŒ����du�4��^�g��]#�R�Ҍ�ɋ4&�N��*�2����Cv�eq��i�#�����y�y�o�����I�KqExpff! }K��RruJ��#<�?�v�����l{�~�����c5mc[ny|(ׂ���n�0�0����_���P3S}��V�c:I�I&�b3fƀ!,�S^�A<Nh|4��qY����BigG�ggT,E���u8*�9��UU���SY��CP�5��PFY�4��'�IU�n�C����,�m����Ӽ� iE�b�6�I����%<u��w��<�u_�i3
��4�{,{b�Dם��<�4��t{���`9�r��zW��H&Ed*��`�sE��s���Nh`��)�T�d��Kq��NeY���TŸXn�)�Qln�_Mx�;�s
�tc�P
�F��_?���M�YHj��;���ltt�f���O�O������ܬ0
c����F�� Js�a�$���k������h0�ȵ����-��E
NNj>a���@zQ���O0j����':����ދ�<�.H��Lp�v������7G���ӳ-�i���350�E�R��i��>�9@��X&����6��s�=-�	݄�(�G&M�4(��x�BQ�p�*�^R�&�	�®Q2���a�8��r+�5���"oZ"-�R�Zɣ`#x�_��G�y��qN���K�,&��!�Xt��Ts��'7���&��52?7`�&
sRdsa��j!i�S�-�dn��
P���p��<�b���M6�+�Wr������P{UE\^�/��]��g�o��T��0�x^[������u��^q�h������=�h
�l�N���3Z�\�z��6�%4OL���IoB$
�V�[��&��Prz����(���t=h�����T���ԡ�e���D�*�7�w87�S��Dal^jF[k�q��ld"#��Id��Av���D�p@.���d�n^~�4|�v�|�<�/9(�,?Y�}�>������!ר,�甃�d�]��ۀ��j����γO�|;:<9�ӥW�"�\n�%S���g����o�yv��U�n���ҿ_�B���%��w&W�{�
T�^�M�s@��s�ZM�:~Iq����ׁ�6��J��;�Z�y��3}��}�xs��.m?U�5�vda�ݞ�$i��^1Cz#���`���[�G}z��H4� W[
i�b���xp��-m!�=Z\��(Q��.��W�d�	�b1�\�S��a���c���6Ý��$����L�֭�Oi ��a�A*�E��_5	.�@����"\;��7D��Z:�ORd�,�q=�i�鬇�(�q�r�W�*��g��ԃ�C�Q�~|��ݭ9�9��c�E6�]8�x�纭����|�c��%򕟻'�8͎I�$����E����,��m����:P�	t�f��^k��+8@Ҷ^�͓�EDvyO]���'H�q6[M�r��ױ-֐������P�B��Hw/��*ǩ �Eѭ��6�{i�Z�)�w�T��|*�x��^bCO�d��ON�ʛ%�t�:g^�uF�+p�[IAF��vE���A5���(�nm*g�c�l�pat;v��.2�f�y����6��M���-/yUfk�)�+e�M��.��r��]<8/�†Q�}�><;==���h(�Q�p4g�s�F���\��ɺ:�M��;�s]�mnŇ�ڵh�H��/
��Mu�
�j��6����I�|o��J`���rm�ѽ�n�� �M�)
\��L(~�^�,�M1�Y��Z�;�5:A�B��)��47�*h��CU��kMH��@#5e��v�8�^�Q޷-q-��N�
����fu�D��k
�x.B[���?ql뤲2�|l��ϑr��!L����3m�ǟЧ���~��B�O��96B��	P��G}�j�N��Wm�=Hե���WoW����4E^�xt�^q�G,� ]�	��g�Dz�C�P���*�2w�ʾ <����^K�F����t"Z���9����^�Bd���:�s�&�=�@)eK3��M���+�d�&q#��7�9K�$��[�ʦ������8���C1�M��H��M��uwM�<��$ w!8٪�O���G^���V�O��Ck}$l؍������=xI�GQ{��qc�
�ܚ�rl��:!A�5A�����l갣�s�|�p2&z���Tl����԰zA{T��i�����=|9��y�=87b0�K����AU$1Gr}+i��k�G�2�!�w��p�t=��*}�ש>ﰺ��u������
H��� /�����\�w��~?�gu��˽�%�����A,ԕ,pЏ�Ӽk��=/gv�Bkx�.�ƛC�F��n�O-[�������+� 2�<`��2�����!��k�nf�%ϻ���� ێq�O�D!�L����#"�=�����'T�M�	��Ҝ�;���.��1��0�Bƣ�5�2�H&ܪ?DK�4��SЏ��YG5�"��+aXU\��ln�;��<kw�m��w������č��&�[�&�ky�r�20�;\����~���h�/�%*�
�'|�zVV?[��Q�%둧��mπ\�H��c��6��{0��Y��/�g��7�آ��&�a5<�D�����~��
՗}���#�]wH���z�o6\`g�/�t_kB7����9R2I64���/'�h�Ut*�'�Ir�+i�miZ��^Hm�lI;yȻ8�n�@�	VKr)�Gʖu�����2p�wH�F�n|��v���97e��79�(F�F�ꃝԽP��Ί%{����Ԉ�Y�F6D�On��N�v�j��U
��N��3b�pnn��@BL�5
��83��>�UT=S~�]V�H��U�ea�ՊJY/5�a��e���;I�3��2���`� 7jG�\�w�E�H�g�bu�H`h&6��6���H���F���+�������
:�*���!���i�`�F�c��XHrqX�$���iRē�g�;���8L�"�Ё�h:]���N�#�x%���(�?��d���7�#�y򵹰G��vg�ҺNO?��Qe���;�g�SRե���sl�'+���(�/9�E﬚q6|OO��w�[�L�V�>��?h�x�l�����c���j�Q�����k�>���Gc/��a
gb<q@v�UkbL���A^�˶�h4�#���V�‡�o�ҊЀ*�Òެw�|9�9��<ji���x��V�OGW^���_��mjl����҄PPM %�R��Y���Mww��YZ!��?��(�>��mz�*���S�S�UO�f���ǡ+�ڝ����}3�>��`�[�Z=^�y�bs7a���x����&��q]���똰���${�q���P�{�gqHP��Y����D.��eh������ӗO���C|Q�@=Kp�R�3�u�J����b\m��Ăt�Ы!�'���]<��yu�cCV޿~eH�8V�\N~[��z��g	Ң��ٷ+��l�.q�N=����?�l�P��p���X��C�#��'(`(
ҭ��8���<%pGt�Ҿ�Nx�D�3�e��ubR	:~�`��φ�y��Ц���e�Q�39��BhK�h}����R	����$ڰ�mx�ps��ӧ�db���=�*_���d�p0�C\~���i���! f��Za��;�n�bjl_�]��������V��c0�Ҫ��rt$�)*�4�#21�����Q���*����%y���3��6T����cF.L�4M��#��]�Y-����D��xl�ʈ�q��	����,��2.�R`�S����f��QIoj�lXJ��`"._�ߌ��G1����Sht��̿��I*���ҝ�ʗ������vo|5z�����R�6�{�°ʼn��=���=�`��noo�獏T7UA�9�ÂPS��`l���OEA���M�'�Ol��
6��v^[��ayDԨ�5%�S�r����"�c��[��@�lx@!��QYI��'�_����?�-���$��h2������#��F����r6�uA
�k�
H�4��y;�%���k������E���3jP����<�S��^õ�̌ޛ������SEH3���""��f\s]�2Έ�0�G6��oJ,�J��(uE��\�ScR4kX��Q�Q��C���뢠I-�F�9:x�p�%�%�ψȉ�hfX`3�aF��Ұ���(+ġOK��'�ޅt�ܐ�hF��J7�ծ_����Á������Ɔ�ml��|���;3�����*��m ֘�I��+�`�5�t����
��U
��,��k���Ģh�
�J(@�}�͔+���;`�"!��=�"���P����<(hs(����C1�5��6m2]C$MV���u��Wn��MbF�4`PU,&�kw�����I=prxd5��u�g���t��	� 4�AT�~���ꑓ��WS����34��H:2�{�$vU+��Y8�7���k��1�^�_�]'/?LM�<`	��1 ���3�/�58���x���L_
���x;��_�z�xul�l��x�C�B��DŽ�.m֒<�A�70��	ax�zs�]KH��щ�g��:bk�5f�'�K\.���>�p�`�����<�)���á�H��f���m�k;3�hC|�DPx�)F��9���W�ݰ}%�j�\�˞zt�wB�VNX�|�u�k����x�BU�����mW*���.�A��/�����x�Vmo�F�~�TB2D�"U=qM V%wm�T�b��z��]�U��l��س3��<�b��K�Ij��i
N�:�ɓb�9����o���Op��~���#"��BK��x�)�?��mhl�I:���n�&;hj�>g�Г�;��qN`�.P�Nނ/Ti&\��s�xr�#��٤�v$c���1'FJ��H
-1��T`6""�`�e�"
�&R3#�B��� 1�	��Q���w0N��V�8�zRmI�j��/��l8.�CIؽ�ޣ�]Yؿ��%\ ��O�442t	��,�C�G:�A�\)���>�)5�����BI��
�(RMp�^#4�/��:��(�K����)��OBaG���14��
�������3*LȖ�-�'�	:�rՆ�")7ڊ�2f�]
Me��r
?�O\��l�Rٸ`MM�u#K�U�4�N'�
6"^��Y�,�~
�z�?���s�/��{,��zl��A��!�}r��]׸��%@�T���@�3�yj���S{y���-��W��k�T�W!S+�r�Yu$�D�m��]�U�z��K�-;e�K�l���kjk%�Dgx��H{�<B�	����K��M{#1����스�X0c�P�(�_��a��[HQ�����q�`4Qr�8��.�5$<]��
_l�{ɾ�l.��+U��j$Sa��h;K����iکmx���gWִ�
(��R񥇁��<͞��p�ji7�J���[7_��d���Mue���:��A�l�!Φ3[�!��i���è�}�3�Y�VX���0��'�`<s��7�W�t��#n���kp��}�^'���A+t�S���4��+bIWL`!�Q�{�Z�T1�N�f��7�iП��`B���δL}4�w:LOp�۞˗SA�>���j4���oAώ.Z�
i{��.��d-��YM��9��V�\^���� S/��L���W�Z�g�z�s�� V�φoɠ"m����m�� �,�a�T�!fmh� �T[�,e�㏢�L�P�4V�9���`��oY���A,�kz x���-��p�]��oK�g�2�tI���b�_-��c��A:����7�N���E'R�#\}�u+SA��{�=�Uf ���
x��,v@|�|���YDSR�2�RS4��\#\��55�'pHN^�.�R�ť�2�4\��O�K�"������Ay
�Sx�; ~J|�I֒����''�AX����X�;
o"x�;%~Al��dg.����.U�ux�T]o�0}n~�E�H2m현�:�ѕ�V1����*׽m��ݘ�߹v�,+������{��O�,��;;���;#�k
6+H)�ᅡ=��x	C�1C��Ee����r*�O�H2��^��Z�:.\t�4�K��[�K�SH�ઘ�|(�w�+����~e���Z�B���v�^v�i���i-m���ZYM,�ڀ�8SZ	�$X]�`0�V8m��E�-��n�h�A	3.���Kf-�0�����$ms�}^(�<���F�M�\
T>f�J�sH�Y��^o"���:��gI�6��.3z
W0�.�g�s�(�Kn@�$� �����)��i:N
���e[,G��awI}��܇;ec8:�*8��Ut>鿽��xq3��>]C�nxC�z0���jDbP�
��(����v�HI�1��]��J���/eR�A{.����eH�^�t��O:��N�B:���iS��>uT���7o�a���5�*�k*�M(�u^�t��uT�jC�qVGߔ��l+O@
��e�=�C'�]�p���iF$��8��I�ܛ{*�}h��b���&OQQ)�
�M��D̓vi�-F�B���(�ݮ�7ԩz����g���&/������;���"L���C�B�3>�h��Q�lO��&p���F����:K�����9�p.
︜�����ʹ]G�_�3#��Sx���w�o�I֒����''�@�v��x�Wko�6��
�0*;H��C1�k����-H��͂�`�m3�(M��]����C�Xi�a���$Ͻ��y��|�½��c/�,�-�j�wN����������=y�N�5W씫��d\��B��D���W�6Zk�O�p��L�٘(��F~"#`�����L�Ϋ�ؙ]�g7�(e���ɡ��'q%��ZL�,
��,M�β�t�Q��V,���`W��OX�UE$X!�:+n!:OE�s�6�>�X1���A��d�i�>��ȴ���Y����ù3�d��෣1�t�x�^��;�)n��Ί������LU��o���Ϙ\�Jqr���R��QV�}��/s^�vR��p�K�^џ��u��[*؏ h8�P
���p��~74�r2w�e�"�VB[��6�#�a�c�Fo�kq��3���D{��hW"���r:m���[it��H��Q���E%������a"���0J������}�,5J�����������(j�Ag��x�n,0����㋟��g�o~}�6�{�����βI��$D�����^2��͘��~��|]�;�Ϟ|������r)E�TJ�%�:���]!��QDg���{�nߪ��X�Q�	�}���V��;+���e��>u�J�]؄��W+��&tMqÓ��շ?���C^g0iIﹽ�T@�� ˩���ivp�+�����8J[o��w����كYJWu="�1�qJj(|L�;�g�����l��$�'wi9]cf�M��9S�*E�.H��è�	�lIm9�F�c�yo
I�����5�h<�Г��"w�rzԈ�N��}�Ӽ������G�R�*ۨ`��w�fK�����-�:��<ꊼ�V$3J[rl7�Z���[�˓�H=Y���^����h�<�ѷU`W�X�$�C� �$Ae�j������bn������L��KQjĤ��h�ۓ�9!�X�(&We�h0��t��./�5�>ק��n�CUO���M
ꚯu62b�4+���Q Æt�X;BS�B����FU+�H~�\���N��p;�^q(
=[VIҐ&�V�F(�����ǸoN�;W�d5��y�������W�s�M��m@��B�<��5�S*P?Cg�3���|&{�;���<S�8�
��O.l�(���:�x�	
�v�<�����+�W8��p�R���x&���rW�cI�֐r
^��"�4�OS�'�|3�e���_�Y$2V�C��}jKi�+�\ߺBf���Z va�<�T��Ru0��Ciʭ�����5-2B#"kۅG�y�&svq�sL����h��4�z��=��Ip	��W�
��=��<�=������R��z�k2r+�{����*	�"����n��ŦY\%�ڧ���}�&\�*tP����>d*bɽBg�F,B�އȓ
�5�G�_��ԟOV���0�zJ��R�Ⱥ�ls�}LD�B����.�D}{��v�S0���f�P��
놄K��D����+!�c�Vz���5����a�5?;�˥U_�m{0ۻպ��)I��|����D:�ju7!Mi�������j��[x��UMh$Ef'�$3�K�HbEzS�٤;�Q�&��u���,+��X�S��������d\�9z�(ŋ���'wAѳ���i�"���l �2�����Wo>7�{��yŹ/�~��9�c~M��_��oj{���t�~4�<Y�l�zb{8�����.M�S�*�A:f=��w8|���+H������Tw��#<�����F�#��ܦB2ڑ��8�E�����vV#���"��zC5�iS�(w1汖�b���ai�	��������Ǣ&�%-�p2H��%
��#����̧��Չh���i5�Y�0"�<H0�DRd��r�D�����U��L*i&y�~w�zz�[�(��'�fG)%��"xf�/3X?;?WM{[�d�S^����>���-`	=K?;����'�Ũ���Gb�2���_�]�H��q;�R߸3��Ob�]
wi@CuF�,���͚�
T�����@�_�͹^'г��7�T��$�ju뭃j��h����'S��&�ߡ���g��)蜬�ᒐ���F;�b� 1���hk�M}q�gŏ&��8�˩l���n�x��(@Q$Za��C�<@,��
)�����B��cD�6<��{�vC���vz�������e���C�m��{Y�	�Z�u�M!Z��0�7�^a��0�V�v�?�xM��Z!	��Cl������E�Uq�{o�x�x����1VQ��Q��H;������K IU��ђ0�
���5��I��U���$x]^mr(H�0ZZBÏ;����
)�4��꜈���=N.��27�Ʀ�C�)"d�s�IZ��ۮ���9�mq�j!�vD�O5&�H0E�>E�-�]��7	|��bA/�ン��A�	�{ǩ��Q*ekcZ�}*��/� R��YYr������!U5Q��o;v:9\N׵�ͬ�E�f�y� 
��KU�b�V�UHe�@`�\t�柼�����@��i]����ukw������&�Dv�:K�����_Hv	�Z��A�ɳ8�V������̂��zfZ�>�L�ӹ��F�
�@x��gv�f�-��W�����'p����)��YYe{秤fg��$����j�$%�jj*TsMn�65(�,HUW��SPφ(�-��T�QP/J�I*�(��OT��l�3�ir3�IfnRN�>L��<.P�`�M��(;Y�W�*�ّ��QM'��Ɋ��$�7���0G���,x��`3�v�dF+.�RJ-)-�+VH�S�O�JM.Q(�,�P((�/H-*�L-V(�,HJ�(��&�N�f�̞���X\\3�<��f?&&.!��`x��b��vC��jAQ~AjQIe|jEfqI��JAbrvbz���z^bn��������A^��'�x�340031Q�����I,���)�M��-��K�+)�+�(`(��uꠚ�-��e�wLL���h��+�(17�<�(��������-��e��y��*���x�V]o�6}��M`�R`KY�"��x[�h��Œ�e�f,�I�U��^�g+sV`{�^H]���A]�X��~|r҇�)e-�j�{W���������^��&���
_�-+9����?G��.'q��n#m?D�����,�=��{'>�<'�Z�
~q�|�R1��yt�l�^�A\1��Q*��^�"'Z�\5�q*��"�BJ��,%9(Qɔ���PLY#t��W��3gv�p,
�jv�I#Yds~p��>�M��-���L��`��S�=�J�����5�Tf$��V��Bl	�on���RZ��"g|C�%�9��$c�L$]1�p��� �x��w0(�����`I�f�3�qRP��jZ0�n_��� 8bj���z�h[����^	>��f����2�+��X�v��,C:p	f�|IS��������c Qx��:u3�
/Eu�a�S]�4��_�c��Kr!6&K���8��9_�=��F�����5r��[�4�yp|�
�r�ǖH�����5�+QaU7�C��"X�><ʋ��8�E�]�Q��`J��,�b�%����f������|I-�N ���!�̇ю��ى���~G���g�0��f�drw���7�o���n�<��)�v2�LP���Cb�5��	�dR�KDJR��'�E���-�����`�l!�dT�S��Lū�~��#8�Q�%#nwSC	�%���%EV2���j�?مM����A�fz�����<�k�WI���ᬀ���a��k�g�K����k�i]�����L�5��E{3�ۈ�p�C�[�����=�}�~ž��{���Zms%�|�$��Է�6ݝ�VH3Mrc��e�ȹd�L�nJ�2�`�	�i]��Y
F&e��p����]�*&��5�ږ���)��^[6����=���#�'�sd\�,�
�Ӷ�m?@{}�!<�J('���Xx�{-�(<�$kI~~N�Ɠ�L��%E��
55
���ũ%*��y�i��%�v`9]�j����ܜD�&��܂��Լ�Z�Ɍ̪��Y�]lH�hͥ*�)��i�9)�E@��Y�4�j(V�QPI����X����i��59�=p�q�(y�Q���E��JL��=��U�,
Խy+#����elF�����T�oVcg��MM�LT��31�<��X!#�X�,^��(5-�lpf��FqiRqI��ME[[u�uM�jd7C�)������fc��#E���	� x�k�*�!��Y��(?+5�D�V���$5�83?/&�27'3/��*�43'�H,�Ѐ)�QP)I,JO-Ѵ暼��~�c�3��*��)���V�f�m�X7��dx��*2_d�r6������̼Ē���k�2��77�$�,x�}Q;N1UD" H >�AZ�݈�2J


��+&^�AD���q�H)�5���.�Sn�3~��<�����]i�(U�)���xN�?�/5J�:�b� H������l5!<��1�����v���J����G`����R;�iym�P��,�U!?5�:2��"
RL$�&pc�0���3C��u{!�R��qjy;��g�Q;�':�̠���e�Zt6�f�ߗ���.0�.I�Hj�$�x���L����O���rܨQ�A��A41�-�P��@�(.@�_�H���D���Ű�[B*lㅴ�F9)���ʭߘ����[������Q�VL�d���d+:FW,(A��}n
�N��_Wc�
����F�*n��*�=��	x�;�?K`�JfF�ɹ̊
9�IE�E���Y���9�%��9ź���y�y%śg2��c��@x��%�@`��JZQ~����kEIj^qf~^LpenNf^��URifN
��X��V���R��i͵�/�,#upw��x��Xms�F����$3�`:�8$`3��	؁��t�,�m�|'�N��w�E�$�N �j2�|w����s{~�4�ǵ��5x��x8�˽��
��<��	Z���Gx��>�W>�P>��E�G��=�z��;�r���(�
�?
�!{{����(��u2�185�M�L��G޾�����Y(���آ���E�K�"a�[���S�A�	>e4�Kx@����P2�B��Z��"bg^��]5��X`l��P��Z-��Ŕѕ��%Tf��4N��ߧ��)j=���y,1����$�G�L-�|!�ė���O���I�D@w,$�����>:��yC#p\�Ah��tѳ�>�ҙj�Ϙ3II&PZ�H�A�JF^D�Li�pkS��Jt5RTcN�O�Y��a�G�l7)>�1s|D���wV*GZe�z�4��J+`aN�Y‰��K�z��1��Nn�U�����"���֑ ���u��I'��cS�46���P�뤵���)��
Y21u�&��L����ܘ�Im��*��y�=}�
zo�����NuM�;!S?���8b��1g�a��Tqz%�����es��!�&�"�id,N`~&�
�����Z <���7A��
 �/��g�S����G���G\/����+��oN��j�J�DX���h�o�44K�cP��-�i�X�}]�C�"H�s�6�@��+�:���
p���z�'t�G������H9�@�(ii.�r���}����
�U����u[�@�}�JQ�	I��	�P}oB�ȁ:���,Ֆ������:�m�Ck�u4#�E�,���j���TX���D�ݜ��\�95�4^��(��ݓ��k8�^t�w�=迀��������6S9�s�x47r~�yɉP��p���A�{�+�:;�ț���A���7�a�9�y����E,W�u�Q�\�9[%K�$�<��}�s�S]�X���+����9�|u6}iBf��f"�
� ߽PԴ+��?���
_���{���E�֧DP�it�6��"�|uj<̱��)�T΍ұ��l�FةF��\��H���g��騔�4g��!P��_\2>As6���J�bG�t���@�zk��l]@e�RXY��]W���V�ta
��'�oC-G�����T0�F9���k�F�<u���6]�]��X�jX]6��W��)��[��斴�(5qݎ�K��������+h6�޺Q�g�����2��i��\"\�w����:u�u��x��U���`7U��f��Eh���suNr�۰�P�tdZ��DӶa�m�{�VY�nY��VY����i|?�o�GʖD�eW�`
_>�
�U��P wӇ�3S�fa��X�{یG��
`Ԇ���b�����޾���?q*1�1�X��E*"�5��15�ef��U�l��"�l�����v$S�7�-{ �0����!F��m��o��<�V���&epG�f���eO��i����
�$Θ�>O���ȄS�cu;�o}�e�
����6���k�)2N	�n�]FF�[����.T�=���`�S����D�\{d�Cyb�?��v�L1��dAx��L�~R�q�~ޚ'��<��M�3-����GM;�����Ϩ��E����Y��M^�ļ��?(=�T?��`OY����+�+]�<��5�c�َ�ZQe�k���u`s����"w�Fj��G�6��n�Y�V���� ��P��l2q�8�)��t_�����([��������x��UMlE���M�$�����7NwboB[~�%$N)
m�����=��]�;k����8Q�“8��7�p�c��(�p@�ȁo�v�$n�j���7�}�޼�?��ح;M�m��;�c��/�&�p�wV|�a��J��Wl�`�gzԶ�m�ty/=�f��Ϙ:cd�{ߊ�6t~J��n:T�.�d0�Z.�V��[
G�Ww��"�4^����4�{M�&�0�n�o��=�Dƪ�1��������DL��_���_���R�Eݼ�b'kA|�ޕ��L����m��1rD��>��U8�����g-��~�X�O@B�'��|�_���ޞX�fn���X�h;�*�
;I��J��u����̮����o�fk��
-��Jƍ%��)��4��ӂ�VlR����`d���L���~�
F�I�H��-"wPNG�؅�ma�/5Ϩb>�TD)S�쪔�WY�L��-�n^�����*�$I.���,z&��8lR��2v�r�h��v�uKw���㜧Y�T��J�X��%���u�ї��]�:���;�$���˚C�溞���.\�c+����t,�]T
i�H�����u�0ö0�
�×�[`�l�+R���&�]�0*��%�)�t�D�e�+Y�Ǖ�ȣ��)N:c�m'��/EQ��ne9!Eǰܜ,z�a?=�Ǥ~&4p�O��l8��z����^�,OM� ~�
��9b�TAQ��z|��)�өɉ��9sn�<����2]����ӌ��p�k�̏L̥f��� 
,U����XO����&�FfS�g3<#3�Y���e���1�)���JҴ8L�bU��I���.-��I䵗Sө:ǥ���p�M;B3y���#ӧ1�ؙi"�w�2�GgOhW��p��dא8c��kf�.�񒕕6%chBM�E!�JF�ǮE
e��d2I\�DɍuFߖ�_�!o\-�?�0��m��^�@�9Bv��Z��ש�r���K^��Ώ}��f�q�v�b�n��I�B8�^�/j�r>�$R�m�I|�pz�D�ul������>Ľ&w��:<6j���	�Dž��5�@�6���`�=	�ښ������e���N⾬�W�C{��"�|�賍�(���Kɧ�n2�x�W���qW�z�U�Yף���?q#R���K�Q���m�2�����L>o�I��g��7��=[�\Q��ݘ�Y����w�A 1H��"��5����xzV{��MA�;�p:<o�Í�>
+w�j�CB|��,x�2�5���?JY���&x���r�e�
�������ĒT�� ���W�y;��7\)��w1l3x����e�T�͇Ef�(���x�[�r�uC1��/L⓻��'�1���&������Լ��/��Y'�s����)�d�*(9�:��*x�)���(�Fx�+ؤ$�))��U�)���f+d�����)��+��(d$��*@
)(�,��IMJ�C�OI,ILJ,N���Ur�''#���dO.%;y��hqvfA|2�K'p�M~�u�l����k܅�߈FN��;�_�c3+o�V�
���
%E��
� �������h|�x�340031Q�K�,I,))�L*-I-f��.��5�i�G��[>|�/j�����
3J��?�=�@0��j��3�L��+�b���2���R~2:�
��y�5i����=7TCU9{8��������0l�����;:����<�8
�����	�t

��+���z<����L|9\a̾�N��*��tv�ve8l{�fROJ�gu�=���b��B��:����̹��y�n-���*[s6�J]��Ť�<=#��k�	0�
4�2tl�v���P#��s�S�����j'ͯ>���݇�i�=-g=�mGW�������PYx��#��}v���*,N.JM�+��/�+�Kg�|i��.�S�'�]���*�}�%3H-H.ܾJ�ߺ��߹��h�t���	�x��m����^<vK���:؇6�0:HS�100644 CHANGELOG.md�$�����~�i����]��_2fg���Ny�P�^ں�xd!�40000 binUә�� #+�%��y#c�+�@�u�G����W�M�x��{y=���!x�4�����\I��k�w��1��=���2&�
����:xۧ/�zl=�Y��6�x���Cx�4�����ю%���T����80]0�rs����
/d�c%Gң=�[G�RP�.h>��Bx�4�����?�^��B;@�	�%�q���k.�K��b�hZ.����;Ih�x�31���ܜĒ���b�
q�m�5s��+F&�F����
��x�31��T�c]}������۾%i��{n�__�
��	x340031Qp,(��LN,����+�(`x������#�/到�6��F����ss�Rx�[���W�e���^�貺tD�W~~nN"ü*G>%ݸ��Yi������!
�+ss2�S��*n2.QY��'l�%*��~��2#>���x���8�q��{�Yf1�ԏ�Yq�o�M
�z>��
�Js�+x���8�q�����Q{�[��霽L���Ց-}��j
��*x���8�q��HJ<��95���h5؟���Qy�v����*x���8�q��HuQ�E�5��+'�m����k�R�3��
��*x���8�q��H�؄���귩�r�}8-�uRhr�D���ߠx�31���T�ͫ��-���}+�vK��9�7z���]K��S���h}ߵ��ﳤe�{$Q�ZQ��W����`j��#�`������T�܎8
Q㖙��Z�p���~%���K_��b	aP�9r�  �4=3�a9��̠7�ҏ|��INM��]�!���̒T�MUO�ܞg��~WC�l�I��mM�f&&
a�E 7�d0v��a+��I�~����SS�
�.���_\��+�ձT�r���tٰ8W�@����r��	x�3�����f�Q����K�=[���3�[��4�I!�3X���l��5���nY���Bx���4�i�����_����6n&׬���ď
��*x�����X�� �I��}'��ճ�ݑ�H��x340031QpL*.)JL.qI,ILJ,N�+�(`���^߰�	��6���E��F�d0��w)�/��R�<��J�t��9��ϝ��T�g^qIbNXY��ٹ"��1!�ٳ+�6&LW�.d�yx�����.b��y7��F �lй�Ӄ]m.k��u
a�%x�����.�����1�YMӎ-�htu�*2���1�%x�����.������Ȁ�3V?�ٚ(�M�6�$ѷ�x�Wmo�6���[�Bra9i�a���˒u�.m�v���%�f+�*I��_$ˌ�:�?�1_{�9���Ŵh�|ق��K*��d���;�����G��?A�_�~�+1%�W�r�g��F9��O��� �j]���yOۍ��c��,�;to���9�w���ڭw���	G�C����'LO�Q/���B�r��ȕ�;IWQ��=��.8KIJ�2� i!�B.��A��Ɍ��������3�߳�vA4E�[�RQ�[�Ƃ/�v!8庾0�E���s�5�c�|����Bc�߻pSj��}5�X?�¸c�ޟ���$���C�OHs�T�U�@4��r�\k���Rh�j�A[9�z���7�I��N �P5��{`f�P_�'�㒧&/���I)i�L�am�e�'����S��S�e.���mv�'�^�\L���[����3��:��x9��|�qp{y�zs����5��f��\㖒H��1 �d���υ�WoGR�7����B6���T(���
��A��:{>H��'D��y���5Po�}�vv�z��<�͊�4�P{.Ԅ�(�AR�	��Q��&������Ơ��Z�$�%�2{ �d��F؄�\o��$Jo~�zlǚ
��������Pj�4-5�mZk��63�ۅ@�-�\nR��Zu�:ޔ�)J�;����y)��Q�,�8��O�b:+�"n{�e/����-�h�\gˬ��w:r��׍,/�?������]qG(�ί{���=D哳<�ko���
z�Ө�EF�u7�Iy�GX��G`���g�^ R�E0�8G���
�?�\����£�£V+k���k�dOu/��M��^p�k��9��fB�
�5sa���C{33ɩs�yq��lW��t��D��Ŕ�9�ߖ8�f��!�V�bUH�8���Yn.:�B�2:V�)�wm䈸Y���q���%�����U���!W|V�x
Q}�P�'I�w!�m�ۀ�Ng��1:���t* r�"�	���䅂$1��>0)Oܘc�ks�j�K�KɱYh8ݖ�
Յ��T������u5pmZj����p*�4s�
�>d-K���R.�n��*{OhXm��Ew�ѩ)�3b�
��J�56�4
%�����Ffu'G���]M_��t.q�<�ΧB�<��j�גߩ{� Z��-��.�����g&�.42�)�k*O�z��ٱj�e�j;kb�:��P�#ۿ��cy�0��*N4y����ryK|;]��q|�o��5?Á��$x��.�Xy�I֒����'W1������p) ������ %Tcc�Ɏ,�m�e'��rn��r�ElX��NA#3�Ds�lvI�ћ'r~fd)�U-���m�\���$�h���ȫ*	q��JIFf��]neqa��Hp�"��d>.��ky3�Q�ϯ2y:�RFC��*x�[�|Gu�+�nJ��d)��₢̼�4
%���@��ĒĤ��T����T���Դ�
=�Դ�Ҝ�b��|���%��}����Y/C��`�9��MTV__�!���_!$_!)U�(57�,5E!3O�P�l23k�r��k@���c��K�����&/d�l�n�Ȣ`o�0y>�Њh�[
P�ٔ3��>�x�31���ܜĒ���b���M5q��u�(v�k}��BA�͢x�31��Te9������v��=����W�8
(��;x�;�|�y�FF���7N��
_���7��yKG�,�;C�)x�;�|�y�FF���VU�}ʽ��s��d����
Цx�31���ܜĒ���b���6���*Y0��H�ˤ�n�H"�$�x�31��T��N�xT�r����L��Zi�$1�o
���x���8�q��H�����`��.,U�e���Ϟ����
���Wx�;�|�y�FF��Ϳֻ��}�xy�W���]dj�<��
��x�31���ܜĒ���b����Y��S�\��lᗮ�.	��
�x�31��T�Cc���_�d����v��R�j����Hx�����y�O��,��ӜѾg�9�+hۥ.n��!x��f��~�4#��f�[r-�5�x�31���ܜĒ���b�1˟m��k�x��%�
���Ţx�31��T��Gֽ-�DZQ0�=#k�g��U'����7x�;�|�y�FF�g�[Z4���t<ƫ=��6�M������x�31���ܜĒ���b�'���TS�pM�8�Nn�*��;��F�x�31��T/�Ά�t#c��� I����6�����}x�;�|�y�FF�g�[Z4���t<ƫ=��6�M��������5x�[���cC
���������������&�h)�eV��(�h��Ԣ��<���ܤԢ�%�;�3�Ex�{�1�kC
#��������������䃜"�9��
i�E��%
�y)
�%� ǂ��T�����b��<���ܜĒ���b����ļ���
�heCC�Il6,@Jss	�{%��$��x�31���ܜĒ���b�il����(�*/��,T�겛��5
��x�31��T�{Ms^L��+ծrY)v�ﷻ�q
���;x�;�|�y�FF�[K���un���wsśc����
˦x�31���ܜĒ���b��k�z��l���¶�Ay�]���x�31��T���mK��l����E{g�S
?��_x�7�������(Q���8�[�� {���_��*�$�l��e�I���
����Fx�������$�����~�i����]��+�b����_x��'�Px���D6aF���¬��\\� �S�FFIIA���~yy�^V~~nNbI~~N�^r~�~JjYjN~Aj�>XL?9?�8?'U_S�83� '3-3�x��.=b�%�%��k�md�d1 ����Yٙ	�,��dH�����Ԓ S�V
�s~F��"x�M����@�!ۊǕs�mD�T��y�������%;Q�ho�(�D���с�����������Ap��
j�9bA�K�!0����$����6�-9�TT~DZX+٬�4��PR��:�3��m>����7����2k)Z4)�е��X�2�����8�-TT�L�e��e�i3�ʴW�V_�A��k+��*��>A���_��s�f3��ex����𝙥$��d�/fv=qw��x� ����h�o���	��иS�hˌ�+��I
�x�31��̜�b�_]���;-����� �}?
�MM���ss���(�%]�������>Wx��,t�x�340031QH,HL�H�K��Kc�W4�}bϓ��
��L��\q1DQV\�QZ�>g�ě�M�#�f(�"<�4/=3���u_�����mYp�D�BmR��7�������jϟ?f���,�SK(�眗��	�j�+|�d��S���#s&�~W�mC����u��W��i�� r.R(Iz�ߙ���h~��=x������!u����=�ħ�7f��<N��+�)
\��xx�L������!u����=�ħ�7f��<N��}h�o���	��иS�hˌ�+��ˣ�Ь�0�a�9ιl�\��{�&{�[x�;�|�y�FF��q�mK�=����>1E��v�������(x�;�|�y�FF��O�i�w���R�#�{���Z
[�(x�;�|�yB�H���_ϾZ�h�7�co�4����X����x�31���ܜĒ���b��\*��w���h~����KzG�v�$ޢx�31��T�)\�t9g�M��k��K�^�h�	x�340031Qp,(��LN,����+�(`����>�x����i�?�L�@�9?771/�ᷫ�`,��&QÒ�޵yf�CTx����$2�0j)�yֲw͚̩�N��}Q\������ZT�Pq�q��
�7<a3�+Qy~���]ps:U��x���8�q����	l1�m>��J�@�߮���n��
�+x����9�¦q�U��"�)п������MF���,x���8�q���꼔�g&X�_��g�Y�n���m}��\
��*x���8�q���-��e��t�^���#���j�����*x���8�q���A��;�������^Ǡ�������n���*x����9
�Ơ����/���AD�u��MF�c��,x����Z��$��b��W!�"�:@��8��n%�
��g��x�uT�oE���n�k;�L׏�I���8P�,�h�R)�hm�ד�g��qs�$��WR.���k/�\�D���f�+��1�ﵿd����|q����YP0f���7�/��vW�@h�-Zm�ý���2u��C�@@��]��E �×�)���ljc����3��Tp+��(>�y\\;��&�J�WJ4_�8껦<��<�x���l��7-l��R}S�	{�c\�A�<�Q�6q6�W�k�
�d�bp��_ʂ�*٬��̇��F��N��ֹ��F�-��(��o�R+���j&>��cSr�.��|�iZ���HE�#��m�,���>p�z��6	u�|_��!p2I��$B�0,��u@��TWO�ԉ�F��l�n:�.;J:��p�bU\��eʏ�yE/�3j1����<؋�p"���N0�q>m0.��c�����y?3x���k�ۑ���b��hZJW���T�H
Wck��OZ6b�!��{<���9����	OSP�a<	�D��Q
WY
g]K�t�S!h۲���wa(h�Ie	�XdSM��:�biCtZ8��i�/�(s�X�2�
Z�2ʙ��Zn7`V�=���!Т��h2.屮U؈�8�9"T0$��E������ѫ�TϤ�[��<��_��eH�a�FG*�t,��rlM
�X�tyw�v���r}�M���*�T�����ݕM/;�n�:�2y�޻G{�ۇ��[Vٺ��c|��sz�z�i����}ޮpag6y$�-9;�9��V�P�?r�.ZZ�I�c�~�&v(”�--x�g9G�lY�z6s��~ݏ���2�W.���	�ޮ�xLM��$��2�����M��yI�l||�m
|�%��0�6 mR��-8��)j4��ϪG�m�Į��w�z�������s�)�L�]�fb���Y�`�bg�rƇ+̪m�2A������ѣ'r�2^.�3Bgə����;���UE���@�e��F����yDL*G����N)�	�I*��~t�B�$x�u��jA�i�fC�m�d��"L%��J�Tl)�6�P�jA�L��$;����������})����+A�/!^��l7ik��s�������~TL��̅׀��iS���𤋮�2,�i݉�0j�]�!��j���yԑ�Q��0_0�Q���v�������ij�Xb�k��v�L��̚i��zU��5[t�Z�h��HY��U�"덀�m�7Gvl��o�Y�,f6� C����b��J����`��Q%0�_ɍi��d�$aWu��I#u)H��)�!�(�:���oS%�S�:-�ϵ�
|@�V�T6,3�8!�hmz�
oRr-���T��!��y#W�m8��!� ����HL}K���e��s��|�2I2t�}���m4/�h�bG`�v��?�0��D�T]����
��j�k�y�z�VCێ�TR�����t��`E�шD��Y�����E�u���f�	#�U�y>�W2jo�M}�K`e���Sv����4z�����)@�V&M{e�k*�O��
�z@,\'���)ux�*GS^�&�u��p��Z���uz��f����K!�t���3#�@�R���3��Cb'n�nx��g��n�vF��W�3�0���x��g��n�$#����fYFE9.�hnx��k��n�4#��fFE9&jnx��k��n�4#��fFE9&v�x��k��n�v>Vǜ���Ɍ�2�7�i�M�x��/K�K�/���O����K��I-�ONL�H�~���x�31���ܜĒ���b�-7��,�1��/��	��Z�K�[��x�31��T�L����^���u«;��3�i���x�;ø�qB�lhIf�^AF�U��{���Ǧ���r{e
���2x�[���qB���ˇ��/�cW5���4u�����
��'x�[���qB��^�R���Oǥ�N���n4��w��)�'x�[���q���=���%
��hg������$41���S��6x�;�|�y�FF��R�=S�����19Ș�8���iϦx�31���ܜĒ���b����߽mR5Ni�r����2[,��x�31��T�-�n~�;ǝd���M�S������Fx���8�q��ȶ-��d��N��p�X��yY�j}������x�3�����2�A{���q�v��^S&2G��4xSm1 X�� O�MC�E�����Bx���4�i��	{?�W}�M�%NO�):�7�#��'x�����C�(������X�ʚ�m�~�zm�)x���4�i�Y��;,�曮޻)���;�\B�'x���4�i��Y�R�q�ƘM�[\�8����9����'x���4�i��;���#�����|�i:m��<����'x���4�i���+�,�
�|s������p����������~x��d�d��'rI�B1^w�E�uW����f&5	L\��������x��W�o��%Q�(��-E�HF��U�j�h,��U�����Q+A�*���Cr���zgH�)\���@��C���s�? AoAQ�@/����[=�X��]~(��@qf��{��{o�����>�H�}�ѧ/�S��ޚ<��L�r�ơ�hD�4����1�4��N�,���X�* ��m�q��\�� ��1H�Ԩ/�^N����C�eΛ>MA��������/
��/r�<��ί����N����k�8BI�:��N-�M"��B:F1�N��}���ír����۹N�G?��d�H�LJM!�D_"Q+��)�H�j|���nU�J����s�@��n�8d���} ��6�|Z��$e�7�,��v�Fv�ӱS���%�^���-�vئ&Y�Pi��y*�׽��ty+��h�&�Q�Ej	�� �����%�mz������}�K\V�-_�4gV%�E@�8����X��e5u_H�X��G
�*v�kǘvHe��\oqqt���Jߦ~�	+&�s`�!���t�q�G�=� M�[��>��'�څ�݄�AtfόX�+a���5��c�|�D<�)1�B&J�q�CA��{#]�#�-h3�d]*)���K�"��m�@j<� �m��bEei�b|��U�Z_}��;�U���4b�,�`rg2�W$SQ?���[�&�BV�$&A�Y�l]-�k|XVs�F4p$�Mf������x�@I���=!���U�;]x�N��
xc�PvIۋd�����r]���d��ʞ�U7'>S�M>���E0�x�1�l�n��G�|A�aP=ARîE�S?5��ah��]Y�dK��2e �R�n
��ڌ|˓�r@D����P��qX)���!	S�F0��q�uQ���EN4ΰ��Th�#}tF~�
�}���@��Q6}��3��[��[
r����*™
�����u��Y\a ��n��A��s�
)C3�Lɳ�͏NN��Տ���o�������^�Q;S7f\O`�>l�_����w�bdGh�+�8�2:ւ����-����â�W�}x>0Q�l�p��4��
h�`�4u�uS�g:#�����DY�0L�
t�y�!�ixN|�%C\_P	qH���-H����N�����S<���!F�x{���~�[<��(���:���BAS��u�q�y.��5��	e�p|���;�s��]���!�ƺ:�2C}�Gz�B�G��:\Lg��4����/�$#%]�3F oh6��Ib!
2j���5����4�8��
2��1�r˹d��=��܍��;�ϩ�>��t!1��X�G�`�����ݹk��.�>��;z��̅��X�g��*W.�+�Y��r��E}�N�d&T�0�~���x&�~QȪ�gѨ����s��dj%b�3��p
o,�L*�ق9�VMu|��"J��]���Bs��D�n�o/����E�xqW�fq[�aqwUg3B��$���W^�_a[Ž������ta�c+������n1
���7�l~M}}�H�l�>�t��ل��n�.ܐJ��s_�郥����9ظRXG���iq��O
+��j�F�7Pk�d���ssCk����_�/_V��Ϙ^�lmxAؒ�~��{i�kv��D�F�H~�S��/N��7Qr��w���J|��&~1�(Ek�v���>R^[�	/�z_�szY]Y�go���d���3������_(Ͷq'�#|����e6>���ƶ��ϰN�u�/��6�	�7]O7�m��W
Kꏅl.݈k6��?�,�����П:�_�_C*N�/Ò�~bl����_�/L<�=���w��Ux�[�x�y����^A������ĒT�� ���W2�"����z�|������<���T%� W�WO7?����`��$;%���ԢJ=���T���b��4�����"����b�A�e�
PC
�2�2sRӁR��SK��S�Թ�`�������z16Wn.�����CR�
�1x����u�]in55���̢�kŕ'��N��C��	"��R��Y�kW�X��Z�iH�/�+�(NN�îFS�N�h�]iS��̒T�PjrI~Q�B��jq��Bf�B^~�BjnAI�����	���56gˤ���:���Px������=�T�r΀���@����u��
��x�31���ܜĒ���b��)�nyV35�\<D�7��pnd���x�31��T��VI1���k��Q��?�ɮ��_
���bx���8�q�����W�L'�L���Lɑ4]�iA�É�n�����<x���4�i�σ��渥�2s�*�.�d�1}���w����x��d�d��'�ܟt�ε7#�V�dƋ��x�o��ȫ���x����y�C��3d�&��M����$��
��	Z�x�31���ܜĒ���b�zF����m����jқ�ܭ��x�31��T5�͓v�_Q�>~ы}*��"]R��
���Mx�5����h�o���	��иS�hˌ�+��P��z�R�?$8ʟ��I�[���$t�Dx�������ˣ�Ь�0�a�9ιl�\���
A���x�[`��fC#���������N��2FH8�
!x�[`��nC
���������������&����gnAQ~Yj���BhAzQbJ�BI�BqenZ~^�~r~^q~N���^�B����dFV3�Nǔ�6 ����[Y\�����[P���Y��_P�������
HN,��K���OI����i2���Dss	��4��5�x�U�mHqp机�s���6�,�6���6���,�)�B(n�iW�ݸ�Lâ"%J,�+{�;߄=���ѫ�����E�z�7to>ܟ���s�,�th{�2�b����S|�/�`�e��$K��L+��2Cc����y�l(�,�DC̋����:`�.U
�B��S�)�\��d��RE�D�`%���S�%M7��� D�(K�ұ$�����T�8Z,�f2�.�ӗ������2���3�n�TT�MkŢ�J��f˄k���$�>!PA��Eo0ٵl�����΀�V|�����+�g�"�dS��-p�I;M�J�#n)�Ֆ���~�ۗ@��;*�Ӻ���]���j���?/�)�9�h�)���Hw�`���]@t��\��Ma+�~��?�� �G�=�ેƝ�f�]/e��RCޗ}����Eژ|��y�:������]Y��u��T��=>wςl�$���7w7p�
��@G�8�{<���Mӎ�}`���*w����?�!�	Ң�Ҏ���-H����
������b(b�����'8��x�31���ܜĒ���bo�Zk�/�?U�k㽩�S
�x�31��T��9K�\�h��^�ww���ov}g�n@�x�340031Qp��L,�+�(`��#�e^j�����Jy�O��p���E�E��%�`UgrO��s}�l��ګ�봮[U���_QuW)}�/�/�,��JW~d��*���?x�5����.2
ӭ�5�e�����ٓ+��QSSGZr��.Vr��扗m1:��Dx�5����z޻���pe��u��լ�+��P��z�R�?$8ʟ��I�[���;[�x�31��̜�b�s̺�ǧ����W)�)�4���QCsSS����ܜD��'+��lIW�~��{�/���}I)'�x31����T��)�����1�h�9���h�8C3���T]�B���ݒ�)���M��/�)]�:���TCV~~nN��^iqjQ�^qa�ӏ��ok��̸���U��`�%��H�C�ͧ}�=\j4?b���:��7��*.��/.�:(��/��R�e�&���O���r9Xd����8�R-񧆨�e��U���KSv���Y{_���Yx�3������P,ek�`o�F�Sڈ0��}��G1��b��z&���4!X�s��Bx��͸�q�����͕����T?�ߛ������dI��:]E P(��/.)fq�z��Å�?7��^�y��r�\Σx�31��̜�b����6�)���Ҩ�f飲���榦
Y���9�GOV��ْ��x[���_b�+<�AD�x340031QH,HL�H�+��/.�K��Kc�]�A�Op~B����g�\3'W�������K{�T�~�q�{������z�L�@!d6�Ք{lo�Oʘt4Μ�`n�X�@���9��`�z�%9R
%�:�_�S��u�{�G?~�����ܜD#���Ԣb����+3�ש~��7�]�S#aɒ6��H�C�ͧ}�=\j4?b���:��7��*�K�̫@�S��{�d8O�P�0i���3,j��t�_��;�ֳ�/cS�-h��I��x�{�4�y�4��nv~Jjvf�^r~^Cn�9_{�jވ(�,���w��ɜ�1��d�;x���|�qb�jE P(��/.)f�����
��s���Vg��v*�xF#�g4x�;ø�q���آx�340031QH,HL�H�K��Kc�]�A�Op~B����g�\3'W�EYqqD饽E*u�θ��[�Z��u=lP�y�yU�Z{���p�\��;`�ܽ�]y9f(���SR�3K �9���s�;d��^��d�:�������[m�Q��U��n��x��:p�N�5�}���h=k�26�ق6$eնx�}�AK�@��sH.�]�7	��*
�B^e�qqw��L��MR[�Ź��7l��Y[�H���\���!�u�	:|�V����e�(:zV�ڈI�D
�<�	�b#�_�od�V���D�r��ǰ��l��)	<��Q�B�nw�k�>��Z�M_����u����`C��mR�Ou��We�恙xM
�9X6�c��}��\n����k#�lE)�?�uE�H)+��߫���z���px�kc��<�ULA�P�X/%�L���\������
�,x�uRMO1��+�P.�|Ń����ěISKwi\��N�P���n��¤i�3y���l���8KZ����%�!�y��JB�M0�-l�ۨ:yo!7U��d��wjJ/�.��Ү��-�|��ʅ��,���pC]��D���2r�PD��S�Y�Gb�&�U�Z>Ha�|�X���������&)��?����BjjJ�t�����eC1G+�rn���;._�o�z�V�ra��#5��,<L���d�f�鼐3��9�KV|�%��`6z�����pr?����¨�Q���c7G��$t;��k�����$<���yФ�wx��U�o�0�_aiA*�eE}@Ր��j��Q�$xJ��������@��H[>����b���G�>�D#�z�獷��\
�|�x"*)�S}#А�|�+�/�2l�2P|2�Z����/���y��j0L*"� Cth����ݵ3��zR5Og��Q5�jA��e�o�=���;�.s	,�a�WX�<^��,ʰ|�W��4�e��Ԋ-aM+�9��%� �X�х)�U���*nLi�"����z��F|&�|���xi�
���T�hc4��6@�
��O�)�9�=�<L�}-p��e~�~����DT��Xr��k��˯�߰���+���Bڔ	�|b�6�v˫K9�X����:;��wJ��~��bV����8�Kx`���K��T+{6rѺ�.y9�����Ŷl���s�����;����buh�/7�%v���~����v
v���@��_oG���R[�]6��v{���g�xB�M�
�/?��1SK��A����U4��u�@t��vx3b�ë�u��` S�>nu*��5��o����[M���!Ug��4���=��SA��C�[x�uS�N�@�</^��^4KKӬф�FL�6lM�5�[K�O��O<��}�����PHw��a7��o������ϣ�3�l7(�Կ:�P�H<	������Y��QX�ԟ�$N���:	��T�V3���R��5�P�E��u��6�91y�[�ud�T�'^@�eR��`�pGI�F>�[x����p�z����n�H��&k(�-�'��C���v�dwN׳�P̀�k�:��
���9S�4��k���0�� �:��.�����S�:�ݕ��;����V�c��8)��j�J�X���͈v�
W����Y��EX�z;g$�Ѳ�D6z=�c(1
�l����Bi�L�fc��;�dh֌��*@���)[�b�˿?��\r
P�<���H��_��_7{�����jx�}U[o�0~�p$�)!wUDӔ[��� ��0	y�	V �I�N�o��a�fE�|�;Wr�)"D���W�)C1�d���FSS��cxB���h�!��z����i�.7��Hu�$\>Ш|���ʽ�St;�4L��
�Q�G���~�D�p��g���t�IHU�`JE�,�@O�� ��������H�����L����I�0o�h	����ީ�f���3���#%	K�$�J�[ǻ���-��R�8
QU�Mknw\o֙�^��n.;�|6O)���&
��qTլH�=f���H��5��a����k�7��y5�HT�z5�Rޕ�*��s�����S@���?��M�R
N�j����8��:�9�\�8��B�a�جݭ����#����Fk�=sfV-N��"�L�f���4V�r{�=�Y��*��Yc�I��f�
�|�e��7�#D�v&Xl:�
��$���?*f���E+Y�q�wE�����Cʂ�SH�)���ϖ��zy�ٺ�R�j����bXk�ei����^o3s�(�,�qܤ��b���-{ſgEK+�4 8e�B�[�uދ��w��c����������d�?����g�x�31���ܜĒ���b��>���t=�^���K�/�7�~1�<�x�31��Tͩ{����� 8"ܶ�T��ǜ�b
��x�340031Qp��L,�+�(`��#�e^j�����Jy�O��p���E�E��%�`UG�}��-�c�]��I�7CU���AT�UJ�������;����ҕ�]+m�x�31���ܜĒ���b�Ӊ��6��-$]R�����0�G	�x�31��T���׋h��i����X��	�Y�x�340031Qp��L,�+�(`�ز���3���,��L
�(����ȹ(5�$����@��B��E�~c�k�;�f�����2���J��18p}ygQ�#P��#+.%���Nx�;�|�y�FF���
g���sO�v���Gq�����
�x�31���ܜĒ���b��g�b��S�m��v{��T�.�f�x�31��T��ң�Fp��
c�i�t����^5؂w�x�340031Qp��L,�+�(`(H���D���>�a�d�=�l�E�E��%�`UG�}��-�c�]��I�7CU���AT�UJ�������;����ҕ�Т*����?x�;�|�y�FF�E�
{C;=������C�ŕb��
զx�31���ܜĒ���b���>
;�hF�❐G/�Oe$wۢx�31��T���f+n/�����q�5��K�٘y�x�340031Qp��L,�+�(`��4瀱Ȇ�%��g�Ʌ��2�(r.JM,I�:�8��P�h������N:��*(57���R��_\_�Y�8������B,����2x�5����z޻���pe��u��լ�+���˞��l���S�JF���S��Ex� ����h�o���	��иS�hˌ�+��I
�x�31���ܜĒ���b��{6�.�Xy�8�Τ��s�?��|y�x�31��T�d�w$-�����u�>��s��
��	x�340031Qp,(��LN,����+�(`��o��j�e�7K�������M3����s~nnb^
C���Ϝݥɳ���_[���j��1�
���ܜD�F-��]3�Z��Y�9u����!
�+ss2�S��*n2.QY��'l�%*��~����@d���Wx�u����������{9�}
+�0��̑,<:�$�<�����'��qha�100644 Create.phpl��S
��i5�T��H2�������k(Ǭ%�릿�v�ejQ�]Z�=L��3��x�340031Qp.JM,I�+�(`���U� �Y��m\R5�N&�4��
J��/�����>��חwu�?�+?2�/���Px��UMl�D�J��u����&)%�#xk[�nSHE�j#B�J�*��
+�;���13��r�F��ĹBʅB�+מ9p�\q@bƞ5v�m�>y�����ғ��_/=.}<!�:�xƍ\�G�9F�ˑ�0���q2�>p1C�2�>�wk�	����b�rL�|���&>8􂸇����p�ܽ�=L���6b���Gb�&�~�j����%��@�4�N5����2~�%�T�����b�Xt�m�bw3��0�������G׶��(��x�L6t{ڢ	Vʍ��0���5�i�"i�!ۥ���О��t���o�A��}1G��p���J�F�V���g�G_T'K�f�;��'V��<�F��)t:p}فG�����.p����:/��T�xn�	Ӗ�z��)�t	�zm~6��`U|^��`>�L����rn��(t�Ư���I�Jb�<�T���j�V��˼��O�{d�'�����$����/�Q���Ϊ����z�
%��l��/���Ǎs�$)_�x�&�n?�1��7g�d&	k�o��z����CD�P���tsi:QXY0�c=D9�c�M�H��r�g-����a�f���Eߗg��񘆹>,�{�ˤ�7�U�T���)���j�EL�q�[���M��v���"�C޷%"��Y������sm� ��q���Q�Z�J�r����~���ܧdG��<�`�C�*�Ί\��*p�A�H�C��b�[V~c4����ozR]�\�Q/���$9:p����l���s��X8H�Z��߂���o��I�;(^�h�%�Pߍ>����0�t
���;�����J�)�"��ʹW'�_�nUff�Yw�,&�&83[����d�ůS�oj��Zg�uIum�e�D*O��j�%����/3c��B�_.J�ԏ�Oh�V��" T���)K��F��(;o�
�>����x� �������|��T��h��Ȳ�m��+�/	�x�31��̜�b㘎�O�و���2_Vn���"��榦
Y���9�GOV��ْ��x[���_b�+<�.c`���Dx�[ø�q����͕����T?�ߛ������dI��8?��
���9x�;�|�y�FF�O�݋�:�Ρlƣ�W��"��
��x�31���ܜĒ���b�IIL3�Jܹ� �kB��G�:F�x�31��Tѧ)�'ޏ����4'k�𞬥j���nx���8�q���������L���6\���]}���
���Sx�����iD��������_�k�����w�x�340031Qp.JM,I�+�(`��P���*�"�4Z��/ں��!DUPjn~D�]�������p�(]��	�����&x��n|_g�"��Ϲܸ6Nj�g��/�lx	��x�;�|�y�FF���{jo	�-u���A���z�����	
ͦx�31���ܜĒ���b���T�JL��
��2_��/)
�&
�x�31��T�=��O��8U���=\`"�kv��9x���8�q��H��ͺ�wMZ;��7I�ܛ�w���x����x������!詨ś���f���{��[���x�340031Qp.JM,I�+�(`h/�.f��������kܟ_i�6��
J��/�����>��חwu�?�+?2�����qx��n�Cg�<����O~&b2y����ą�T
K2���2�K���3R�����&��3�l/�5ٔGhr��Q��^���'ߐ�Qî��8�]]ӚK&��r1Rs�ST�KK
JKt�ʋ2KRs�4�m��ssS�J삃}����KR��rRS��J2R�����'�Ij����t�kN�¿k�&�t��+�"'o��I�a�z*i�9����ǐOwr���"~n�k� n�E��*�qy�y���)��Xk������<x�;�|�y�8���Ay"�y����U�v]>�����ڌ��P2�x�31��̜�b��ݪ:f�����������d(��������BV~~nN"�ѓ�o���p?�ֽ���
ϾR�;��qx�[ø�q���M��מ(����(�����\�1D��x�6�����	/"�
@iT��nb2%��/�����&��'��$^Pژ��M���*;c��x340031Q�K�,I,))�L*-I-f��.��5�i�G��[>|�/j�����
3J��?�=�@0��j��3�L��+�b���2���R~2:�
��y�5i����=7TCU9{8��������0L/�H>��7iavZ�A�0��m��a�B�<�BC<��J����Oi|p�<_W��S/�J}<�]��]۞��ԓ��Y]r�2~����}�P%A��.�� +o�k��[�彼��֜M�R�{��x1)3�Aψ���u�M���x��&Ԉ�܂���"���<���I���x�!t�O�Y�{����'g385>T�y��F��E�{��2�m�
���RS�3�K�
��6_����T�ImW���¼J}�e�E�3]��g�q<v�*L�k~��[�K����x�4�������j�B���,�IŒAW���>�}v�诀�3��_mP���&�j�Cx�������e�!�8�������]
@��g�*x�;�|�y�FF���)�/�����Mu�x�Q�����(x�;�|�y�FF��m���>U��0�q�Hn����¦Z�x�31���ܜĒ���b��#V7��`Y�~8��w�Y*	/O�x�31��T�iY��&n{)�"�C��3����
���x�3����9�t�������Щ@e���W�M2���l���}T�7ip�>e��nw�e�Bx����9�퀞sХU��ת�K1���MF�M��,x�3����9����Jo���s^cb�7�j�M2�qnNՆ�K�J�!s�c�gA���Ax���8�qB�H�M�%*+|���|��D���w�
��'x���8�q��ȧ{�*��~q�o��<��6�a��ӎ
��x�31���T�ͫ��-���}+�vK��9�7z���]K��St�.�����)|v�n�ɗ�Ʒ~A��V���g��1��6��03S�m��L��C+��AԸe楤1����_ɺ��җ�XB�m�܇(�)M��cX�h53荾��~�SS�j�p� 8�$��b�B����><L��֮f�������BXj�
�z��n�ʽv��_����T�­K Ƅe��00�?�0��V֬���7z,L%+&�Ln���	x�6����/��;�E~뚄���h�~�^�Cq�z�t۞1���(%v��8�����H�`�Ex���4�iB��]�'u
T�t��L2Ϟ+=1}%�:M�*x����St0��;��P���;!�YG��g��$M�,x���4�iB���y���l��N��G�R}s;�L�����
P�x�340031Qp.JM,I�+�(`X�}��ߤ�B7�/VW\����*(57���R��_\_�Y�8�����4�����x�ۡ�_{���u�|bi�9�
�
�%�9VV���)�ٙ%��s���g�U�e���fC$�������%!�֓�,��T@Fn.�`؏$P�cx�ۯ}T{CoYF~qI�~bAbrF���8&T�����y�1�e秤fg��%�祩+X)��g�UL6�g��؜/�I�,��3�"O��s��+��x�31���ܜĒ���b�a&uY��
�����y�d�2%ˢx�31��T����"��8|�Z� ��@D��(
ܦx�31���ܜĒ���b�V��JkR�s�����{��Ʀ-�sD�x�31��T?�WA�[�4o��߸�?�j�̀
A�x�340031Q�����I,���)�M��-��K�+)�+�(`X���S&�t�3�T�_�e�M�>c��+�(17�<�(��������-��e��y�k*��x�31���ܜĒ���b�˻.����MQs�)oN�ő��x�31��T�>��L�K:6�/9�v~s�?�;+�

�x�340031Q�,I-J,�/�+�(`�2��X^����c:]�צ��_+��
Z�x�340031Q�����I,���)�M��-��K�+)�+�(`(5�^�ZI�Y[9�5���gǵ�1u�%榖�e�5y�3��>��Qʄ�7��<W8��D0�&��cx��Ξ.��'5�����������:�M'�#��x340031Q�K�,I,))�L*-I-f��.��5�i�G��[>|�/j����23=/�(��'�S�P͞�\��-��P��sC5T����������^n
�׭q��]q'5��“�FEV��?���	�t

��+���z<����L|9\a̾�N��*��tv�ve8l{�fROJ�gu�=���b��B��:�������}6�J8��؋/+�&�\�Uib
I�y�8��S!�l����]��\�܎P#��s�S������/oR=��NL��fߤGU~�_�+��O�f��q��5�M��Ļ�+���;C�+�)M��+f��
S�Y+�vf��cz�7�է�|�U�\���W��_�W��ΰ�Ҍ���]|�:Oj�����U� f%3D�,�e��|�IFL�s9�˲�A����x�;�|�yB����6�5(�6���y���X_ߦ(8%WH��թť_�6�1R01���<�П��_=���Ju�ӭ֏����($�����e��1x��Wb>y�Q�"���k�$�֣+��O�fX��ב��)�Sh��پ,�s[�f���&2!ʧ�|�X�s|�z���~��&/J�Q���Ax�4�����A�4Od����w3��t���	���@�E��Y0�͔���#%_�u�S��x�W�n7}�WЇ:AV;n}0'M�E�AaQ�Ԋ�.� ���U?��3��%�A�ڀ�Ւs9s���/W��_��~�s�����Q������ʕ�R�ґ_K<6r#�O'�-�����ɲ���i�v�=��h9R�f�m�u�h7�yC��V�V+ZK�\'K�Re2��jC�����'�Z�u����|3�m�7�q�sQ²i��[�'�ݎ�kM�	�p�1!Z�s%��A,��J��o�&��c脕��l<��x>�F����xFg���e1�ӟ���9]U����k�z���;/5�5w��Q�aA���Y�I��)}Kژ���pF=��S�X%����&��[[�%i-C�Jɝ�zy�!��“6�)F�V����pqb��.��ؒ}���ʂ=|���i���w�k��wJ��F�YЪ���m�f�K����&l���������Jv��/�?d�̳�wk�C.��+V����	
�w�J>s��Z���-�S��Z>>��q�3�A��m���PM�c����y�F��4�Oz�1�
��.d����\�9}ɟsD�
��&��dž�!���K�1��̖�j����}����G�>��b�؆ �r��9��j�r5d�/�N���V�Ħ�T���&m�]�.�d���F�+�j e��o����]g,Z��Fm*:T�m$��W>xtжoeizx���V����71B�e�_'�;ƒB���~�<5y%EZ0���B5K�R@;ѿk��B�Dt��y
�V@��R�c�@��!T)*2����A��S���:�)ۢ���!�ZO ��iM|N2�B*J̗ 4$6(&����,Qrt
����R��'��`�%8�q���#a�I)5	n@�Je��@��	2�ks�r���w�<ޚ2����H7�^4�6�sٶ�>D�j��J�D�x ��n�H���P�$(K�vފ������Q(�B�b	8�ӱ���^�/�ھ*.��g�˗�bBeA*l{�r=G���l���\؄:dQD�=��?h��뫷�]��U���w����M�(-wl�	�nH˔���p	,%����
�`T%���T�2_��#�wZ�O�W{���`�)�Iݓ���hpqS��o3~y��^�W��ڭB3��@Ź�5f E���W���0>a$
�'�H	�����{
kH��<��F[�i�q�6�}�l�0���`i��a�P��K�챗v�17�f�a\�>n^T<�
��M >� �d�kp%W$���Z1R߹�2��Ǘ'�t����O����h��q�Q�G4��Ђ�r�|�i0^���{G �t>�'��X��T���lv�QB����=#�%#�����U�N
�fOy���@�%��+_�s�!�i�0����lc�*{�!_���w�nE)[*�F����S�M�z��c���`����PL_�J�^�x>U�KUlE��]@�������&�h1���'�JaM�lb��p���[Bu��2��<�:���y�)�/�<H}d�������Q��;�>��E�"�q����8Uf�h��3�9F��OKF�"���V�J��'�S��E�r�fx�uUMo�FEP�(��Khd�������
j MP�A��5��Z�2�K�:���[��V��-?���,IYt��(q��7o�����?>�1����a�䬎`8G6~�&ӳ8��N���4�+c
�a:ZBb��{y#��;�^�{�_�^
�m�[H�p�����kȌ�Mn�%Fgxu69;99�h4�Ѹ0G
=���v�+�����s:��<�P�l��\K/.��^P	�)d\*�4�Z�,;�	/{8?�)a��C=;~��Z��X��n5�׃�F�p]���j�ֵ@��E'*bQ�#�M�oD(����9\]��L���#V�,��`ER�� #��dpIꜰ��RU+����bj]ԟ��exl	�N*�M�I0�ScY*�c�Y��R��v��T�-O�Dsn,�II.�5���~\��-�!���C�H��J��r܀�S���+�욎����wd�l��3����Ne�	K@-��J|e1�c�?u����ݜE��{t�ǘ�b��)F��r��Ue�\�&���}��oK���J����=��x�%�o�0�%����=zfݵ�׏c%~�R�>F}81ꪝ�W;�?j�/�νn����]��w��W���/J*d�ڊ
�&�=��@%�1�ls�qgm5�2M@�y����f�FX���Gx͸

u44��	w�h�#��hN���6y2E����@ݍfz�O����$1�L�UXS�2�]kD|��h*벦���4��ն�˗׸�;�rJm6H������޻z0jZ{
��rr��q���)��l�6(�����n�&_�;-��T4ɤUu_?t�]ŕ��rnS�^����'�����i�v��������?xS*��x����Y{�WFs-�̊�]���<�܂���"��̒]ݼ|�̼�Ԣ���<����t
e3�͟ۅN��x�31��̜�b�=M�7��ϯm"���7l�CsSS����ܜD��ǿ_����j��s��)^�[:c*��x�K�����j0<ԑi�~%�k��2t��~?��Z���8�Q��7m��@������sp���G�?�{u�U$�x�340031Q�K�,�NM-`x6���M�9{wk�+��q�IO�D�]o0x���ix�kcnd�`œ�Z6�B[Hq)ApjQYj�cNfb�Byy����J�HM�
��Ɇ��`:�Q	���	��Ox�����e��z�̢���JU#�b;.�/(���+V��KI�H-Vp����/�����.FV���/K-*�LI�%�RK��($��(�%敤���yl������-b�-���x��Vmo�6�l��+TR��i1`@�dk�p�
E��S��h��Lj$���w$%Y�[��a˼�����Ҋ<pA�x�rVo����4�S�#��R���F�D�^_\����W��3*�
���@Ew|�P0}}�.�hfL����b�gH3��/x�1l0�S�ˋ�§���֯��S�K���:@<5┛Y��drN�I9/�����y&���b"���
)xFвR�J���j��$Nhed!i������i��$I��T�1'X�p�I�u:����8���K�*���a�Vh�퍹����η
�
�,�)��#9/�`�������Q����W�ب�wh7�����^޸�BSTW���W�Eoğ_�<�,�ͺ-[����f�
)F
s�\��=�N>2qd����ݻ�x�XhC��'�|��}do>Ք?���[��0_��ho���Qk�V\�����B�#�#Q������*:�蝬;��0L*�9k��>�8�
sR�Is��ⷠs�����4�!�*�A�q��a��n�qa|�պ�}����ב�T���}ֶ�������Y�6eV�4S�7-������K��SCѺ�9�d��H}8>��w�z�q�������6��j,�����ϥ�
\C��xߺ9{��}�j��dR2���_sm5��2�{�}n�J��D���k�cf���z����_����2����	�]��W8��D1\^Bhgoi?��VVP�S{pc�!]�w�o�����b�O�~׎��}�����nƇY{�Wݏdt�������#,�ȿ�TJ�W�v�ػ|	��,?>�L�&9��>t˩2r9�������k��6�U�/���b�-Ȗ�7H��`�j�u�e{�����jdl�?�?q���'x��!v�u�3��D��%��9��X;$�d+�*$%Vjp)A|��gP|�������%�����'��d��)��ɨd�.�IH3X�d6!L����5WZ~Qjbr���
�0����"�
Փ��ܕA�$�g[�
����RI,(��LN,����u����#BHh�]��R� �"V<i��bx���:�u�$&F.@��x�UM��0�ﯰ̕4�X	��${�"�8��lb��RV�o��$-1m���cϼy�f�xF�����zM��Fؼm�%�h����[� h�H.�U���
�F}�S��{�$��9�/��>��S+U�p�9�8���t
��N+f��:�O�<)�<�-[â�^LG��x4�DHC��C<�0�ThV�j��:;�,[��*����ˋ��]26⣚�{����adH�v��JnS��U>�>�pl�
%1��X,��c�g�T��/���^�t��a���̱>sX!��j�еpQ�`�M�V��"��5}��d�S.c��j0��!ȘՌ����JXw�/��*�1Mp
x�ĠS�dm��;p�q8f�l��Ԅ������9R�h���E(�I�FGI��lM���W�������r~��4Nۯ������n'���4�l�2R��;��?/y��V0l���lS�F�1�4}~fD���v��ީV��`��I����`l��jו�7��j�E�x�TNԂ3�'C��0{|Ì��A"n�Ƽ���������ȸ���󢍓p0���F�����G�0
��� �'���7�����0h�p�ݨ04slx#�n=c,
�5�z)\,<t��6��9j|^���s�Qz}x:f��O����
,7Bc�R�B�xD�3���N/M���$�J����5�^�@G��l%wg!��n|�f�NH�]��R�ȩ�
?v�Z�
��n�z�̇n�������,����?�
�&�
x��Q�n�@��4��"�B�+�ZB*3v�G�>�
i<�c[�Ɩ�u�n�TwR�l��X�@����m	��Y̕�9��sg�'_���
}q�L>���^��&2S@��4������ʏy�	�ԉ��~�Y)ש�$V̙`̧sWx1��Q2�|	N/n���~0>.���`�u%��#�"�En�R�Pߘ��U����I���w���9Oƅ.�<iw9c3ڱW���M��+Ң^e��Y�@'sf�Z�=.�\��k�uѿ�����}�����*!U
D�+�7/ݐ	�.^�����
wL�~���1�śAeN�[�2���y���04�`s����M=�Q�K�.?
����*�ڌ��z�8��E	J[W<R�f�+
s*���)^ɼ<n
�nam���~��Q��'x��"�Hx;�Ar~^Ij^�nFbq����R�ar�����e���QZR��A�qJ�a���������d}Ƌ�ɓ��1&o��$��bhjel`ed�m``e`0�3�CCN��x�340031Q�K�,�L��/Je�:���-��E.o^�������A�_1x��++�x�31���ܜĒ���bn��v�
�M���8�XWE�%��
Ңx�31��T������#�I��xH�ʼnn�>�b
:�	x�340031Qp,(��LN,����+�(`��=�"�a�X\��Ʈۉ3�11���ļ��e�H���{k\�G�O���+??7'���e����^}
��.)���W�Q\������ZT�����~ֆ,5�,9h��7��:���x���8�q��H��Bi�s��C>��/�uvtI����
��+x���8�q��H��gږ�����a]�i�w_��D_7�~��*x���8�q���b�x���cӒ˯���]��<�D��n�x31���T��%�Y��%���6Ezk�ꎘ�&`y�ĒĤ��T�S&������2m�o�?J��>Q�ZQ��W����q��nmIm�ϧ�5eO�AԸe楤1����_ɺ��җ�XB�m�܇(�)M��c���d�"�\��!�WT������%���g�:x���V�x.[\t��C3���"���
2
$�y8��a�y��BZ�>mY��1&,#����4��S	O;Ӭ��<	�=M���i���x�U�����/Qo�V�xW�;Z�/�W��CR3��`��
�H�~\��(+��40000 Siten~��#0A@�W\��G�K����H��"����x����Mi�I֒����'WE��x340031QpL*.)JL.qI,ILJ,N�+�(`8�Ű�oZ^g�ۺ��Q�M6��w)�/��R�<��J�t��9��ϝ��T�g^qIbNXY�v�=�F��D|��_�����2��yx�����.���I|�w[�v�vc}1ɮc?��
�=��dx��R�kAf͚f�c�M{��6Yȏ�Hj��V��"-�fbV6�dg"�<y+�<��͋(�x�PP���x��Ъ��n��C��o�{����^�<��0������y�pS2+†0	���Ph�C	�l
ۙ�sF�:);w�L�gEqUǔ��W��{���{d�z��(a�O��^.-��f�{o��`��7�D�nP6w��l�e�<���sp߇��AIV�hv��F�zv���m��l��bؼM�JU3U���4V�/k� ��4��f55`�R�Y8+ɰ=��O��VO�"�rz�FL��t�?�8��l����BɻNQv�$:�S�/�����Lpm��.x�V��N�V�9tx�J��Ԥ���I���*?ʓi�P�!��_d�0�@�?�i�,��3���=��[��H��Kq	x��$ō�NV��E�6jX�D�'�>�W�f�r�&^K�R���!ܪ�(�����Q.��#y���S�6�޸�u�-��(�Rt�N�G�'��&r��S�Y�����`Z�r����Nh�r�2���8\�$��$��Rw���|�P�÷��Ex�(n�/u|��t+P��ylD�A�_W��7����}x�{��i�D��+emQ2z���7�Mu?��Hc��c�Өx�340031Q�,I-J,�/�+�(`�|}��=�P��/A):�;y�缩�H�x�340031Q��+.I���+�(`����Q�B��;[Wy?(�ۺ:F���'����,A;/���1=vu�Eb�k^ݚe<�,4/�</��r��}�J]3/*
�d.׸b�,�x340031QpL*.)JL.	�,I�+�(`�������:��;1��ض���9#59�3��m3����V'��57NZ��g�u�,?/-3��b^O��f�鲫
y|=�gm��O���(5jk�U�O�g����`���+�ġ�\RsR��8�X��*9�
�k�.���2K��*�ɯ;m2S�v�����μ�b;�2�*�</'?1��Z�1�y�Zŗs=���:F�K�z�:ϼ�Ĝ��%J����Y�y�{Χ�o^����'��$3/���`�ʝ�
�ًܯ���~������TH�=?gޱ��ـ�w�<���p��飘Q�	�Lx��d�d� !�ֶ�♸r/���fkm���G�ul�d՟���%��ZvC+%߷�kQ��������sQjbI�^AF�i̟��<�K���.,�]3}��j�g��Oj[��4�{f�ƅPݞy�%�99`�
�L��lfɺ��Г�by�d[F>����x��$�J|�I֒����'3�Yl��'q�N�ˡ���S�:Y�S�
�Ԅ��9- ���9���'��x�X�{Ӷ��xGOs)��CY)٠�MF
��L���`K�$7���+�w;�=ˇ����{��~�����������V����;�C�i=��E}�:|���0tF���ID����xQt�����k����p���90�z�z��{{��0���Kx����tM�9C��>��eW�Z�ˁ���G��(�#���8���@jM�Gg�G"$y*<�M�[`=��g$�2!prVr��Z6��`�|*�t?�Ͷq��V%�Q�
��,I��}�p}��I����&��R�WE���e�}6�����"��|IYI�'K��T���""%��*�E�/Q�t��}�DpE=E}��Ӧ!�ź�𱄆����Q�$��q�:��/��,���й�IK��5����Tz"4�u�DQ��:D+7�
@A��64nM�sHՍ
�A됥Q�~j���;:zr�n���\�ۄx��.�V*(T�D`���H�RI\Ӡ��S�ֺ�#*�z��n=q��t>@�LC7�+�9���7��?�����AF�:m��B9�:���]��cEĊ���^��G:(Ţ�%����u�&�E4��.�����̭B?�զx7�R����g�ΥU<\�L*�Q��0��ȁ�Aǥ-�[_�^�tp3�m��)��	Ͳʺ̈́��6�e�^d���M���A7VXR�@�t���Y{q���sM���U0meHB�g`������w�k-<��ͫncaL��6&����d��+��2
�+�P�U������O��2�������_�0�W�o��>�C��Z3�!af�ܱv}-��9��-˽԰𶦶��]
�,k\
��~�m��U�U���1��4����I;�_��7�tg����6����S'�l��K������I�a%yIo��Q�X�5���.|����d͡�X�Z}� ��� ����Ec4�yj�Pñ��!L��z��@[3V�X%M��"<��*L�8d?�'՛b�\��7�ټ�{D�Xm}��r�R�!Rv
{%�s�Āv$Uk�5%k�mȴ�]�:
�uj��������@�H�<ps=1>L���jV����AX��:�X� ���iiC���v�zçI����}*�t64uA>]�++��I�:c�Q˩*NЅ�皢�!�,��n_}���Yb3�"ʦN�*����nJ�V�Q���u��à:0`ˡ�[��NA$r>ѭj�[k�m����Κ���ja��)�2S��T��J��	��8�˚�	��ɣGU#��R�U�_�� f�M������v�k����J�[9S��۽"7��r�4�)�vp�����&������˓����F�6�{�x7��"v��3=��:0;�|�{5�]u�:�}���0�Y�����3������UUVm�{u1�kK��_��2���FU6�i�_�7��k�Do\卫��N�@��P־�@^`~���7�����y
5*�Y��.�ԝa��3��_�W��xr"���qI58;�S�.��F���q"�Vjݼ�9ޚ���������?�z}���r2������_~����|����OQ�x�*���l�>����'�~�}�.�ˇ��4��S��v�U�OY�U7nְ*����~�m9�\R2�c����V�E��a��������!ccIv8��o�٭�}�k6�VcTk�7��
��[`p�o<j�~�<�1�`�g\A���׫�e��Y�;m�6���?�Z�Z���Wδ�)�tt��x~�}=�k��t���)��M�֨v������*�ܥy�-���3{�+G�p��_^��As��s���mx��TMlEVb�m����4m�n;��B����V�Tm���"3��ֻ3��#��,�\�悐�r	�����'�\ʩR%����lj�W+�j�{�ޛ��7�����s�1����s��Ɔ�ـ�6ng�%���FX�;�w��|n�6PB��m�z�q9Hhb���/	�m�`Q�r"���#�&�q�3�=��O*�W�r��2�Y���[a�u�-ha�'U#t?V�]��w��p`s�a; �ɬQR�y��~lZ
P�dB������?��F[V;�`�Øcc�-.�'~Xd�	�A˲��%Q��;Ƹ
������*Zҷ��0���9�l�G��=L��Q����y�&��;x�֏��`O�����;(<�'od4B�	oP ~Z~K<[6�?���Y؍���k+5��xt�4�8�=�x��K��^����6k�]�;b��PT�'~E���&�ʬ.�G�q+b-�&�3���%}�n����o^+O�G����@K�^�Z�7-��Tk~�
��M�%/^��f;쮯#�`���������e�*몜���]���^7���4Q�c$ه%�]�b�<m�@�/�����"�7S��SvՐ]��z9wm�|��\n:;.����'g28Lg�0�zf_dr�U&�DB�ߺ���3�����+>\�{�����v�� J+���hJn�z����F;;MD@�
e�<��.��fHF��‘��+�T�:K��y�%/ ����Q�(�*�Ґ:1_����g�ߓo��m��5�]�:��hEB��~w2���Y�����&������冫_I��Z�
Ũ%z���5�H������JW��|���4��بE�9�yf����^€xc̣v���K7��]֞�`���3�W����Y�@R��S�!�5`!L`�<1����4x��js�f�-n�b�ͷ���@�ܺ�x�[i{���l��
C�+���&�b�Qd�Q�؉$;=�R �$a��C�m����=��A�����#����\;3;;|�$Y$�6���'�i0_���lgk�k6�����x�F�G7�2e̍|v,�!g���w����dw4���tr�‰x>���~��O�� ]�s1�3�\>�d<͂8b;Ζ�߻�0΃|QL/^����2t�83u?��(�A�,NY���s�8
<7dY\�g)O�,����G���Y��͏��D����}��Qd��\/gqtMO�8�Q^�EI����Խ�߮/@����3�c^&9��/�����4^�f;	r~�r7�_�<��i����o��`��Q���,�`=�[p�Z��.ܔaT�գ��L�8�^�}�tsh�?�Ҥq��eƮH�����
C�N}0�H�7g�K�N��?����1��ܝ��&�J�4g�Xh������N�eq�l4kA���.�~&�LO{���C�B%l�a�0|�{(B/�̔�b���G�&�c6s�&)�+=�s�`2mZ��ڽ�
G{���
*#�f��0��k카W���L�ك6~aȯ��тk���m���
�͊ȣ���f��H�
G�K�0�K��dw׀P���`���2�vw�
C	�|�����nO&O��'�9N�7
��#V��x�n��鶟/�>}�5��x��Ҷ�<��'��%ِ 
�)ϼ4�ɶ�{q�
���A��Kf��h���2��֛��S�P%�����_N�yut|��
ܫ[��Ѧ����<DT,�<e��&{�����4u#o�(r8츈ؙ$�\rg"��l"Yd�3�^߸�`��=�:bXK�5�Ҽ@�Z���h�e�U�AS�	Q��!����$�ng�l���"��O�x�~������L�x��܁/��G<�c�"�cmaqB��$�g�^��GN���x��&�w��Θ��C���܋�/;��UK�";"�$��7]��rw.�9i�<��Q*��K�@}:�ZRC?H�����m=
RD
�y�r����1��rSQ)��wP�%Hf�m��F:�X�)��>��"f�9��`���ʧ�]����_q�ȹ]OY?�Dr�5r6֏E.'�h�
�M��F>}����D�/��ue0$�K�Fb��y���eZ���{)�A�B��y3ˆ��(�P9��ԄG�S��B�K3�KA6�9�]G���jd�a�#�m��oe��� �.J���]\�-�ğ�h���=��P��A]%�H��h������_����6d�޹�6�QvUq�����t�B?U���ᗱ̮��鐠�Ã�^�P�"�����%�C��3�����O�d~��c�'�;��
Hm��	�mS67�Wp� �i)-�i|)�������2g+=�>�l�]b�-Rv�!D��_c�D3���L;V�p&�"�{*G�� �6��غ���/eO�O���?9<aϏ�v�z
�=��g��ٰx�ފ��=���6L��~/�Կ9�(&���DNf�%-$96�S%�5�iؚҤ�K�;ג�^�SS�4��D�b�����|ũ�Ik�PJ�Z��/�ٟuSˠh�ZbxF%�#���\Z�aH��M|�w��.C
mc_|Qʥ��Nh=�&rS��Y��T�EK%� ֢|V|����U>K�"���.�W�y�����,"��g= oؖR�D�QD>lexxvVPy�e[�l���W'I�D���:DA:Q�7A^M���Cg��">��[\�����̴��HD�ǔ�}�wUBz)	'
.M��75U���*7/��*���۟-���Դ%hO�pg%q�UQ)���3�o����a���L��;6R*��msNO{^$-A���274ީ�"�����OkD��*�~��H9T2�_�*����HQn�I�2��
U�:8>�?=,Ö���Ҕ���pzx�NOY�Ͼ�c"��3z�t}��s5�	lcQ��i�B��h�e�	�l�V����	�.\{�J��t8�a�rz�����)mhk溵�B?!T���x�rb�3�u]�W�A�N'E�e)���7�a���[�D׽�MV�le��}?�N8�	{��PǞ��Fl��R�@����݊f1GQ�0��w�My�e�iE�!;������,7�Kܯr�}�^��+	m��3����1��FB����	��7�j�`�ߚ�>�T��A�"bʫը�֔=ҒY;^ǟ�k�j�S�r*�B�NݫP�L%�R�n��]3(wmB��� �H*W��{ۧ�ҿ�
;8�EqU�ʾ�r�Jl-�ݿ6e��aޒP�B᱅-�z�j�I������2�F�������d�s$ep-΃'��= !\Ƅ������`0I�|"���-�v-rp��	a������1�ѿ��{|3�G��U�&X���p
&7c��C�q_���8�ќi)58�L��s����Dہ���
�i7�y-�qQ#�A�M�:����ö��P�)��B�U�f�Z�Nk��%�:�!�����{7Ź{l�����_8��o�z���_�ON_�����;�
���y����4ˋ�˫�[�;���W_�c��,���H$X�W^����@ ��D�PjZ�\�V��K҇�&��D܋��_�|�\۷�����d��o�ri�(�L5�(�ZRdP����	��O-����^+��",ʆ8��4��F��e���0�Yp�@(�6i�DGLD8D�T�Z���!�l�'M,�Nx$��/��;~%Jԇ�'P�n\gX��5hC8�	��:*�tD'�<���>��x���"_�1�+�!�d����$T9��-Aʷa���c�g�dϢ�.T��KT�[;D�R>S�R�n��3�S�)K��Z0{P���b�J<��|>-�r*�II�cP�૭�P�e2��t	ѵ7D�~�>0�,Չ�����f:
@�M����xioU�?ӟ��P�EN|ί�L"�7]�^�6�逶"|T�U��kz"��>��#�)N���+"�Q' �l�/�4�<[^h�UIV툤��<B1�3���2Z���,s����+D�Ϫ��(�8Ǹ[9�v��â$d[#���\�-�ΈL)��(��rWޑX˖
�t�P�46��I�2M�tM�1·�J�P�*��*Si��eBI���B
+r*ZZF"�.�Y&u��qx�~�r��mm
"�ף�@�a4�D���!H��:���A䎯u�ȋ�0����/F���v��hվ+�b��#"躵��<����i�Ȯ���&����z�c�1Җe���	����p�#ޗ�N������(�}I֠�P�H�&b�T��x8��&�1�l�(�SI��k֌��'%��y"g����P
����aM�0��Q�of��,@t�����@9pWQ�!�4�R��PN 2��A�L��EE���E���G�෭�r�Rg9���G+���Ŧ�v2�޿_�m�T��8���P~��ˣ�r�O��wB�ܶTg��$��G��_���O���
��'��ru���P�8Q��jA6"�\A�=�V��m=�D'�����7uf�M�<}4Ҁ�	i���r������@&ΧE'�p�W��8*A�n����L�Y��,i0E'��|�W=7;p�`H�_�EG���L�V��٩��#��o��ѼY�/a�K�m�T$Ua��蚢F{^\�G�=*V���:3�M�d]�N��ճ�[�2zUT$�1dJ"��=��4jz-� ���z�&Z��c2,�IY5%��t��/Z�iM���V3G�QMгNI�rv8J�����	3��DBDW�a{Ĉ���`&l3ѩL��SMI�F������);zq�ݳ�\�-7g�>�6�Y�>эK!�neg�x(:o|��I9����e��S|6`����V�u��Ӊ�FȕI����6x�-��wh�[���9�
��+��3F���k�@�sz[[�J-��K:�}F��
|�Q�T��7A��k�9���ɮK��a�C�.�\�Ɋ��k�e;��ׇ���w%E�/��
a�K���<�K��8��TctsMk�
�{�碛�X�x�αZ2T�-�(����q�QT�N�T-��&3N+򱨍
��:�?v�����$Tإ�L�VGY$��-܃������UР�u>����iE����V"��$M� ]%dɤ����!9
8r�Ms�I(*Eտ1��� 4J��V��,��v'.�%@MyΣ�;����Q��ج�I�����}b�Ps#{��F1P &7Y�!@���k�}6��¿��Z��+���F`�~�(��ˤ�TK�8#�ۮ9I���:��"����,]:18W��*K�=
�Y���F��R��u᧑�n�"D*��OIf��\L	��8�^��g�}ۻ�B=�&
BM�1�u*[��:�T�"3�T����ٸ�/Z%�E���x��W�sE��M����bR؁���;;!B�pВ��e,��ݝ�;=t�l�a����(Vy�Ճ�'�p�
�^,o���랙��&R�!;�>�^O�˿翚�;�����1*��6�~ݗD����Ht����p�"�~k5x뗰�%,�B�e�7�LȽ��ҧ��K��"�,	"[��@���bIH�]�nd����F�_�s�~O�|��?id3�$�ʜՐp9�n��eP�c/"/f߻�~f�!���M_V���!S�u…ς<�Q0�16��̖7X��y>1Uf����c2�U�1��!1��K}Q�Jຎ}�K�$ZtM�e���������X���Ms\�H�S�,	�<�,�OY�\ �*~1H�,��4�$4,!K	?�h����&}L�<�^��y��<R�͈ʼ�l��� �B�1�|K��_OR�P��-�?�T ���Nl�	��v�f�;njޔGn$$T��iDD!�ݍ�g�C,����AR�/`��X$+���B�$�%p���mNB��VS�u�U����"=�h{���s���dŸ���y��&�q�-p-�d=�
P�Ÿ*���i�4��3�/�U�������ťӅ�������R	ؕF�K���=��?y<�p�-��ĕ��D��D�F��Nܭ:���
(l�
�w݂֭N�7���#������ȩǃ7׬"���:A����P����S��N
{ޜ쨅q����/}�dž�R�vȸ�.}K����
�[&���e�)��*����/`�AV�k&�'���/:(�.����tn��,�����:?�B�
[
���ï����?2� ����?�0(��ơL�����Ibh�W�I.�e��f���X�o��C����Ur��I7�����֝ݭ�ܯk��ϼ�	����c�`�߬�n<���c�i�A����H���?s�-]��D�-@�¹�a(�9‚�_�x<="a:��f���VU|��:ZB3~F�^�y-ԪY+῕S�FO��#�C�(Þz1z\}wp�`ˬ_F�i��XA�yj��Ut&ԏ�O/!+�Z�[�~^�T�zp2��O�['����@ӶaXZ--�]}{�;C�Z�0$�E^>�7�V�Ժ��<���ӯi�Пz݁�Մu�!�R�\2V���n�����֖�{����l��䶷���B�"(�5I�����U3�w�G���
`A#;c�(��D�`�w=��g�m[�Ѕ���Y����q�bz�9�ƟDp��N��S8��i*e�J�aHus�@�V�ws{��GIV�)�^	£�̶c��!�H��t�
�{��OM��`�€�nM��៞��R��?�v��Pz	��G�=<�l���vu{[���M�)�k �u��`��.Ԟ�s{�n�&��g���\��Ƴ��Fڔ��-E��jwQ/%uVu��U�bm�jj-��U��ܾ;�>o�=VHo�m�^<;���
�)��@,��>�Z鵐���u�2e-��r��R��8��v���E4���_4X�]�tu[����3ۙ��]��Gx��d��z���Œ����K!�����̲���
+���}x�;��yC1���n^�nf^IjQbrIf~�Bf^qIbN��na�dE��3�|'�˲r����N��R�l-* 
��R@E�%�Ey�ʈN~ʿx�WI���&0r�<%j���sx�e��JA�t�E�1���1D֠��AT�+�FP��dwb�lv����Z�,���ʾ��he�sX�`�Oy�s>�w�c����B��im`�㒹ZH�h���yЀ�M�u��@�ضaG1���+��;a�
5�{L�Q9�J�Q
Z�+�,����Yb"��0��x�
_g�5�U�yC}ɨ׆�<��l,�&�/�:���)��v�� ��F�{F_(dT�'x�Xĉ�P���y+�e��["���T�Jߐn�bjLh&���	��3�dK1��>w��"�+�:W����m�����]�l��V��v��P�yz?��^R��c1�����dz�&��s�0z�o��V�I�̶0VX���'������~x����q����]QjNjbq�fM��li����x�Vo�6�?��R���V�
�6�4];dM���S���J� Ri�&�}wE�?���X6y�{�{��/�E��%Y�U��y�2���R�)�w�19}��U)g��,��4Z�K�j���o�V��σr^e��:K�J��B��5'��|h�I�	X��y���������1aIʔ���TX��\N،n}�|���8dɂ�L�܎4�]��.��ۡȼ�2�<�|��L�<Z���q;9�dB{�$�31�J�ƤF@�b����l84>Bh�h�3{Pr�L/�8~��4�~4��BFB�����dpi��?���^ok����������ְi�c񊫤����ȿ�d"�B@���܆?�F�E����k�!�Nk�KX(�_�Y����M�*M�G
_ko��ǃ�G�wG�i�4��a�S�+�SgӶ����'��	��� ��`������P/��Ϲ�	q�W�aj�߷�	,J�Y���P�c���GKZ�9ˑ\�"�9S�[���IL[�e�zɢ�_�`eɮc�3p�z�s���MyI�L��=�iH���^2��U�`�Nyʙ�����$���Ah~�&
���־1�U`�I�n��1Ƨ�W���ar̮��A�����|8�O�zpx�ia����AC��0)xó�"��⺈��)Z[1H�1��J���2�S�T�/K&��
XU�D�Osn��%ϰ�B�B
�G�� ɳ�9�쫟dj@Kn`�r���ѯ����Ɣ9���%��n�O-b���a�.�|ʃ�o��G'�="a�֑�!_WvJ<�$9�F�����ݱڥ �(0hnX����x0�Ǔ�ЋD�i�N��G[۶T@�HQ�y�1M��@�f�i��Z�ݲr���#z��#��5FO'�5�Ұ4���Y����v�I��A6�V�?���O�~���vg��s:ݍ2����d�����SY��m�߮�v^cd�7Bl.�t��ɣ���_�o�v��a��	3^��؃�*�1�	q��
mK�C�KMz]���+�: �)7@MD�qOatY�NW���(9�[:J��+Y�u��4�uz���1�\i{
��P|�
+J-�o�o�k!��0��4������2���:�ve!����c�9G�n&@-�����a�a�1ء��
i������Ͳ萑�P��BŔ�&e!<~�����#a���r�r��B���i�?���>Y���k�o��<Ϳ���l��c7hk����e�P�m�Ų"�&,�n`�
+dl�v{mE��^s&N��������2x�}U[oE��ě�".m)-Lҥ�k�S�V��K*�F�iZU�4����ivgV;�8)�,��T��E�Z��R��J��?`v��/�Z���6�9�;�ߟ|�qk�B�Z�P�@\th���sK�	�K8[��%�5=V�	X��1D��
6���!�t��%�.�l��l6m�6A�R�=�H�˭��� (\klI!��V�
���+���墐��ۗ8�+ߧ��:�J���h���	%؁`�:�(�s�ɀ凯}�����@e=p��4��1s����.C<13��3��)��Θ:w1+-v�,�x�=t%#���;�aɁ��Ĺ�
{)��PVi�xVQ԰�PFFR��l�
��o��\����r��"z�KG!���8%�QR�
W�A�/*M��-$B�����V���ӱ�!�~�0uL�/-��<ಡ���5��#�w���c�R�
�UWnqXe�LL�6�*v���b�#\<�=�y��L�C�-*t�\fWwe{�ԍ>$�4�c~Q��Ɩ�P6U��]�<,�46�#hZO�]�S��i�8=�j��lFَG��˟:W�Ao�!⍐�tmIץ���8D�@w]u��C�T~�#�!�6;�G4���*�d$�D��qf����ߖRS?�A��L�!C��ɱD�OqB��56Ө���҅͜D~��R���3`0\�b�x�^�RX�T�\�9�{���Fm���!��#��<&5����dɩX��l!$Fy��=_VSV�5��ȷg�*3��|�_!�)GZ��H�5�qE�ȑ��bD�S_nA��a
�\��Fq7�M@P�Yo���ʮ���͂^3�O!�Z2�h�PBd��c��2,���V�0���~U�����
d0��O�D���\�:�D����v�F�Q���kCw�O~]��\���}������2�a���m�<�ffSLj���Ua�6I��Lݓ�*j	���iW�7�[�/� ��Ł�M�72jŵ`,�q��'�a�_�ጇ��!�5|����}�&����s݃{S�Y�t���a,����6�N��L���L�(} �ߎ��8���} ��7}��4N�f��pq�:�i,NL���r�rJD%��jrC,5.�-�L�;����v���ѥ�C$)�MJ�,~���	����>Q#w3T�嫿X�E�cr�1�5��Dz�.�J��F�v%������J�x�340031Qp.JM,I�+�(`��+�5ͣ��ω�����b?ecQ���_Q5G!�U��ӎ�X�n
)
\�	<>M�f�yx��TAoG�U�G-�8PJ=GVv7�wH+'Ai�⒐j)lv��Qgg�;�8UA���R�R����V\�p��=�ʑ7c;rpR�{�ٙy��y?�oc?�>;�����`��oJͭDH��P9�&�4�q�7�3gV��vJ�n��%�;B�,��x�K�H�|s�*�\ݑ*#e~���B�k͇��z��PJX�I��}Ex,a��c@?(���J��=�x��I���fa��˰Gs���TI��j�ȕ~Zڢ�fB���f�(����6��Q�@	g��\Cyq��U_�}׃kpu��,���'g���w�I�0��~=r���ll܅�ȑ� Q�~|�^��u���j��d�J��e+�.'1D$o���]-ʈ�#�/DEA�u"���$��}�C���`Ѓ�ѳ���o0����[|���Ih�t���PL�3٘`���m"���>XX����������V2��~>=�U�XI�6�2T)�ڪ��K�z���sTz�{?5��I�w�Ù`h[� ��$����̩��?΅qsd�ڲ�ɶ#�Q��nuʝ�c�+�r!�~�4�[Pm�VM�k+*�
@Ls�;C��#��	l��]�����UI�!:���q
�A�]�<�yL(m�[9����u<��D�g��Ep�Ѳ۶�h�4�� ����F�����/�P�Qf+D��˰6=LM��2�<��_NL���˓M��X�S��;��x�Z��3����k�ڛFG3�kn޾{c{�Ѹq�����ʁ�@>�U�V֕N��=Y��!F�s�:��
H�)f�{m�}l|X�p!���j�㣊�)���])�Z��M�S��;�?��G-�����_��u�}[x����
x�340031Qp,(��LN,����+�(`X�bߌi-�:vW��o-{��]r���)?����(�� ���⥷�s�(!���GS����	U뜘��
V�`q��n�O�������PE�%�9`5f���9���ʕ�����o��J�\@���x�3����P2},U�Z��n�!:��+a���lah��ȷB��\���b�XH�]��1x���OhU��n6�.�$��!��4o&Mf�Q�lԪU���@/�����ͼ2�������Zr�*��x/"H����-(z�"x<=������P螖߿�����?�OT�����s��J�[ٵ��Y���l�}��Rݳ�z=�=���?�K{N�ǠI�0�؉[#���)��턉�S��>��.�.<s:��pL'4�y[1�AZ��-P�K�QJ�I��W�<I1og'�?]�:�7U�>�G��G}�q��1�i�"Ӕ��.]~�	eƱ��b
�&��i�Cf}a^zv���1')dJ�4��e��N�L�	N�i ~�k���˻��\�a���n�����K�l��a_X]�E��5��_��}X>��U-z�h�.�[��m�_�?�6��r<�>7����O��e��A�H7����8�0fZ��N���x0�6�j���!a�RlF�fs���]�����K8�_���Q'س�����;�>�P�u�[�7n�Z#EVOW?]\{˕�;o����p�;!R�Z�:����Mh���?�����Z�r�絏��j���bl[�M�n. ;�c@) �'G��dB���FL�`��59  �\I�
�ջ)�Җ��&���u����e!��#�?��(|������hcm�h�z�Q~o��s�oO	����iwǛ��?�{�%�RA=s����5�um�������㰗�R�!���!I�4$b���P*$G��& ̸��Ӹ�&��.=�$K8�3hF�����:r�ّb�P��I�-
"�@0t:T<5:�0�%S����/����f��Kk4b�\GA����6-���j������A���]x�;�|�y�FF�y���;W����0]f�<�$��A�*x������;��(3	���ֶ��.����
��*x�4�������j�B���,�IŒAW���-���O��Z�d&h�^��/k�.��x�31���ܜĒ���b�3��xp�y��u���Py�%
_�x�31��T�����QWs����-~�ش�"?�F�	x�340031Qp,(��LN,����+�(`���_AU��ry�rn5�bA��& Pp���M�Ka�|�����#j�	/gD�z^�Qᕟ����Pè�T��b�Y��5k2�.:=#�=DApenNf^vjQ1ÿ��s��Y��<�@�]j��<��9���x��������!�i�u�ȟ�姲�֑+h������cx�6����/9�24�3v�/X}�+��w����CqrP��K�/�BK)0������Hk��Fx�6����/?�����q���I�Z8��Cq�b�1VB�ki����/���*��H�v,�Dx���4�i�^G_˄��I'���[�S2���'<��9�*x�6����/�p���+�`��g%k?��;�
�Cq��F�׸A8+�0���0�晑�H����Dx����/Ŀ���{I'�^�)����C;'
��,x�6����/��;�E~뚄���h�~�^�CqË��[v�I��N���a��H�s���x�7���������{9�}
+�0��̑,�{��uj"M�e�M�S��c
"�5�=L�=�Gx�7�����l��S
��i5�T��H2�������k(Ǭ%�릿�v�ejQ�]Z�=L������Nx�k�h�ؐ!��Y�W��Z����X`�4m���x�340031Q�K�,�L��/Jeo�嗋w+����Oi�g��?!��=��]}��rS��?�/:�ִB1p����z��|�:OgW�`W�ögj&��d{V�ܳ��j)�|�*TI�����+Ȝ�#I/�g,}%v��j��k�
�tL�@!)3��D��^��t���
��U~jDr~nA~qj�^Vq~�5�Y�N�[�����'K���'g3���������jt�=��{[�����W\��P+}s��9��>x����)���9�Dsx�x����N�0E����l+�4��
���`�8�$�z�x���'M��l�<tt������`~�1�|p��VtTSG�S��ږzu�HX��.VH���j)�QI$���S�Xb�^Аά���tpH'�\�_�7h*��t��
k8���1�9�NEڴ��Odi)��G�|Ga��%���Ep)؋C�4�I��Q���o���(�����9�l0O��m��l{�������
^"+�v�`���f����x�W�n�F}.�b��Jd��/��&M� i��hQ��"W���]����>��{f/���nk�A��\��93|km���]'LCte�v��}Eq�*G���A�������՞�xlz���Y�}���χ{em�s�p�|+	��Fv�x�k���)/]Yo<�j�S8���5Y��7�a���˒~S��;G����Z�E
�IT���V�&F��F�v\qt�Ѧ��m<r^��@b+�+-�^Y�f�=
�1�lEA��9�|���E�r��K�伊���Tǧ��i�X4G�Ϙl����ѩ>�H6�_s�$��{ ��&�Z�J�!<U[1T�ݮ����D�I����e�UY�Q{��s�G���`Nz��2]��CQz�-�s����}OV���Ϡ܌��@���m�C;d#ukmj��0	�!n*'��i�l�N�;t(Z��ų�;\Dcs6v��vS9�^��iO+tT��z@��G�� {�-Z�L�����P�
圃��9�p.�o�c��{0$\���\hgI4
��8P?�ϲ���A�j�
Z�}������.e$��t嫹������|#=��
�	~�G�}W�1X��E���,�x��فk1���B���[���x%���\�&�z�9ȠQ+�2q/�ם��\	��}mN
��L��n��Q�ΟE�N�'�1
�ŚǍ�
�Z۝�~��5,�ud���N:��e@v�B���F�>�.������߹��"�D˿����� xn�y���t�S)W�r@t�A��aB�²���Z�F�p��Q7����1�6����r�0�~�,&��0GvR�^㡼��2M�d{`�D��?�M��+A�NNVSq�\����`�e?Su�8d=����'�"]�y��H�4��j_MC�`V�#j�8����N���Z� ���~���c����œ��;C�bi �Y*3,K)T-i�m��Y�_FC�r��9����w�Zff*�/���M�icm�%6��{T	LR1fюC��99���M��٩�����>��������Ej� �ʍ�S����<�_L�$�bS�8@��Lfߜ���;ؒ��X�"��I^����r[ǿh::Es���!)f�= %�,���
���hxl����1c����ғ8ğL8Fn��v�O��n;���
���6�|5�f��Vʤ[����֬ՆE%��1�1�-��ƨ���,q!��K�)�+�*<�>|��E�>����+�UM<��-a�z�+���4���X>���	�]#%��IjCs��jt�i�lq�p�#�L�������Ǯ6���Z��(l�k40o�-~Ӂ-u�H�FXc��C������+���K���v��C
Ә�m��9x�i1���H��y����/=���"��4�����y���q\a��`�v9��Rt/
g+70f� �ʎ.��ii�˴�>���9dfp�v�ga�<'����R`a�b�%;��	a=Xw��Xt���[a6بbV��/$�K_d��#�(�z�>��ڎ�g�tĩIc+Ń���yz��D��qv�A��SK9�XZK�md/M#M���ò��KJ
���D9�� �~x�uP�JAĠ��GH{�Y��E"��Y$������,3���%���|�^�!��b�@3TUW�����[ܚ���!E��ʀ2labkCG��{kK���3j�����+��	RGV�}	f�2	D�M
q3���Xk^1`D��r�eX�Z�'3������n��h�]��L8ܐ������n
���m)��o����ɞo�C�)�Ԗ%�L���Y�)�<oj8�&�^1ATؒ�s�������&$�9�SU�U:�W����2 �̧뛢�P(#b��,����pXr߂��B��M�d�!���\�
x�31����T��)�����1�h�9���h�8C3����ܜD#���Ԣb����5	�>�,W�qY��f�c��K(������O��{��h~�j�u��o,;U\��_\�����ưv�e^��wu�t6��&�;9MLw?Y�xm��
�@��>E]{�$R����8(�J��Z�5���^��)R����}I�k%����d���	�s!�H6���t7h�z<ٴ�.Vv�[C�;3;P��ޫPNh~�����B��0R{�#��6�\*|�~�"���)�έ�"�m�c�x�_�&k���&������S͵4x��MO�0��ɯR���!!�._�C+��8U��d g&�NK�ׯI�R�8,p����<3��l��SMiM��?�_��׋�'7�*�o�y���>�ò�#��H�sH��K�S��ߝ�
H+�)���݅ �Y�ot4EW�[�ຝ�3�\�o���L�++=E���A�����k��\噍[���q��g�B(1�Bp���b�N{��`-���s�-�dr>��LD"��3���T�gêa:�a��vQ�3-�9�
�QWr|�4��y��R�[�	�sXKH�Q�o�]�6$;b�d��G�,�W���K�[7��a��@f4=����cnQy����~08G��2Xo��/>�����2櫳�[>@��޶�f��w#����x��P=K�P%Mm�.�Jyf�`K��^��Au�ۼ�6�ڔ$-8�������?������X�vqһ\8�{���yz��k�g�~��8QH���C̠@I`\�(����W����C޷;���PJ��<�.�b'`"���]ɟ�`����xoR�c��>�"����B�O�BP�0q�o�C}Y��`���#ޝn�/�kI��y�heZӏ�a�rCc�ވ���=JF	f�4��+� K.��/�3��JG���ѷ��gX����u;,�P�_���>P	�/�\�Y����#E�f�%�[~��k��oe&��x�V�n�6��+fw%�u��ۤH���v[=,6�@K#�]�ԒT��ɿw�%�N��C�H3Ùyo�ÏM��fJ�h�!��u]	�ue����
鷮����f�E�{���m�*7�mTӺ{����ۚ����.�����|l��y��^ʿ{w����:#�
ՒU�Z�}p���j��U�/rw���37�g�4F;��0�V�� ���BN��Ve�M2�
�o
�o�E���P���#�>��RZ�񳼲�~%��h�`-�̣.xg؛ޠ͌l8�8�Tȹ[��i`��3w���x��0n]�}�0`�����f{{Op�es�^o�ן�CD�PI�@ ]��l_,�ҕ�3��J��\�L��&�D����U����a�SXsɤ����\{�h�܃�)�˫GbRg��ڣZ��@1.�scy���}��wa~z��k�����Jf0����~��7��0����}BN*2ͥY,`�NٕF@�r��ۇ;��e�8����U����E(�ټ�����O����2�$*�߱¬׌b�PK����ʏȐ$=�`����Ii���ܷ��r/8�^���Y���U
�b�X&+�}�
�\4�����Nw�k(�k�I�EP��͋ekW���*�OH�J�i��X]�	U�c��/s��v
�i�K���tu5��ޥ$��
��@M��Ry�uj�g�&�d[6�g4]^����2���S���b�&\/VQ"�Z*"����$Y8�,/�!���T�M�+:�#T�;%��8$���nz��d��_�xn�\{oG�8��P:�
'K�`DQd%�C0�G��:O<��	�M�|,���%D��:ۣ�!�
��i�l)���1�
9��T�Gرo/)��g��{lpH��BL��=޾�X���m� >���_S?����h8z�1ٮ������~���z�⑬l߉L�XLS@w�4�P�	Ʋ���#�b�^� ��7�/tͺ��'v��V�Ewi��r��q�]R>%�h�
y�Ҝ�?p�A���II:��~�I�j�ht���E��D��Ł)�5tb$nO#���:9Bt4�<�ɍ��#A��Zb���Qx�5�?K1���W�-^�� ��;,�>�%�}/$o]��>��C��8�s�f�a~������*�$u�Hh��R��,��n	�=�U��3ؐ7��8,`���G��퍂�gNZOӤ�P(t�<�c�uㄸ���������xw�BX�v^�3r؏��4�W�!&�e�+KX��x��X������ld�����h-%��S~�_�nW��D�.x�u��n1�� �'8��e"E�:"?T�*�
"U�ą��ٝdM��j�mZP�πV�
x���
��4;�$�&��c��7���c;;<���m7.4�/�넍C��x}���>4��d2�T(�B�aѐ#�߾x�/�:�ۓɤ�g��@Mf|�|��s*?2�)d�ӡy����1\b�������q
��0�|�?Hq����J�2F2"�TH�|�A�4���bZ&��v]A�o���1�?���Y�W����t��6u���k��K�o��(�b�CZ�B��(������U($��e��f�!�C��:d��t�
��,�?-5+�#y�Ѓ�
ܒ���c�ܖ�-IsT��W0UʵU{p6x%���c�y�I��
�Z�	��
��ϣ��nǘv�Ȏ��ݍ-���I��t��

��}Q���df47k�b���a8v��kvƭzB6�n7P��?�+���f�@}m�|l�Ģ���(��>��|E��c"��r68�<����%��tm���S��/S�}�3½Ux�SQo�0~n~�i���j�1!!u0(e��/�*7�6�Ď�˺���9'i�d�	?$��}��}~�>Or/<��H�[#�	u���}8:<|#��z
3�3��EeA���l�"L�?N�%D�87�M@e"PH��*#�`��Y��i*�K���W�!ܢ�R+8
k�����ג�bD:h����Nm�EZY�,V�%�PZ�H�`ua"������r������3��n7Ӫ
����v�y�E��f+��.�k���u��.?SyA7�wb�Eƭ�_8��L�S��EN<ї9b���1�XZ2""�Ra-\J��.�w�*�P�����hˆ0�.�����l�j+H¬��4O�w��ԪP����+�.��g�*"nץD�щ��ݸ{e�˹�;���k�3�O�^��O?5��I��C`
�ug�&��&�A�҈e�j~�/1�B�3!��?�_2��j��i��"M�\J�z<���_�.�'}��`��3�54���0��>bV�q�l?z�è ��Ɓ�tFB�P�ե�"S9�J�wu��	�b�]%W�"�
k}�sh��N������`eo��:��<9h���!v�
��{�}�J��ax����w�^&6����œ�k�J5��@�.1%ſ�$3?!�`Փ�0{G�V�($����d&�+d�)�d�*���*�)��Y$���(頚S��_b"���p�fE�z����b]���r=u}u=(�8�$՚�T��
�9�)��V�:
*�y�%�v�%P�@�����`�i�0b2Xh�F~RVjr���BbQQb��:�#�
�v(�E��(�ü�)m����oj��F��bx��S�jAfm	i�t�����ذI�Mr��Jjs�c�P���$YܝYw&l���0�;xa�����A��ҋ8�$���b�0���}��|�oO�=^�!���mtH�!�CJ}��r�Acv�-��*��j�/�r�-���%}�=�y4JNC�Cb�,�@`1����]�Xܥd�.�Q�r|�4��;�ܙ������Z�ǣ�U���.`?࣒���o���:�B��^	�^d:�B�t�����.MK��8��x�n8G�Ȏ�'��s�aBE��s����e�ɭ����[�"i�a&�Hl�=�/�K�i|��e�uG[�Om���#���~��n�a�u��k=jKg�v��.�ѡg�ei.'~�(��}\���93�C��|�T��EU�p����,��SU�k�N�>�e&}ʨ용�
��ף(�P�M($ ��u��<]isL�|1��Vď��I����#�C���B�y���_�3����r2�|!>l(%��Q�qx�TQO�0~n~�MbK�HդIe�ֵL���h��Ʌxs�̾P:�>;I�e ��C��|���^�-�ҋ77=؄w�*皟��-w�����~�}��3	L���)�b*F��#r��dz�,�� �H�_���`�s��p!|�����\�6\I�E�m���鴈��j%��*UFJ	���DI�,�Li�!aRI�0FU:A�X*�I鹅�=O�M���
�ɨ����z^e&�"Sr�(��o_����}I�3��@�QE.�y�Dy�`���Q !�%�L�pjH���+�*�"LS�*��S�J���Jc`嶫q���������;qk�rn���%��V����a?��
�sp�v�I4/��e����s���x�IE���i���
U�v_nK�e��v����)���&�V���w��b�2�ؐ1#6e��_�Ҵ�u��=M�3]@����ဘ>G:M�>[�̝��?�ÆFS	�7p�I��;�����p��`���xr��ԇ�P��oauU��pP�ۑzay�\��)�.��\y�3,J�-�n� ��p>������Mdgj��ZP��$���[%�4ý���nJ�%e�?bR*��n��E��&�=�ط[���������X�;�z�V�
7���c�$fv�؋]���]0.����N�Gm	�Q��!,3�{3nF�K��T��K�q���F�ؕ���L�Tcp�)J�I�R��S��e%�/vV�,�_�cWC��x��η�C�`Abqqy~Q���BjnAI���},bҚ
�
��
V
�E�y%iJ����J:
 yMk.(PI���M�KQ�W=9����AA��G�$#�X�.���0G׮�8�(�h°���Ҝ�a���0Ӂ�6_gq`b��Q5��x�Vێ�6}�WL�;��N����ۢi�H�"8Zjd�+�I�k��oόD�fo� |�,r.g�gf��0��@{H�OZy���ݏZY�#=�"Q�Ѩ���"��Ļ�P�Fn����~WfWt���U�ʡ��W�=8��)�-�7#�'�­tHA�R=>:Ti�����$��������K��Ę�O(5}��T����*���`<�Dj[�pb(A�EG›�ӱ�K[i���Ң��.*�,!^xQm���R�h��Un�(�F��"��r`#g�I����{��~\Nώz��Xln~���\�?08Y�nW����s�
ri�2��h,ΐ��肯���z0�y�Pjz\$���D�PT���U$�����/�n�!�s��Zʶ6'8�� �ti@��u�0he�؃�k��腝�棎��,�(���8�GL$�Kzz�����tWq4ec�e;�Ay�XWe�m���ć&�6�R�Ζ;t
�R�"� *�ϖb��!>��"���w��BHLy�Km�V>�-'2���L��G���=0�
uK$�L��|��FA��6�r���G�u�6�ϝ	�vT�J��B�t6�w��z�?r��o׺�Q
�)�Y�-�^ثɈ�)�������A�cM�%�Z���
���r��>�VZG_������� ?IG1w�g����l�.E���޷��ׁ:�HI�N*J0
Z�̓`�l�ԭ�`�I�T�
&b����L�����9v�`^�n0�����<5��D�.;���'��@����yp|�Ɇj�������D;SD�����B��4b����4�K�h\�A��T�E�;y�#<@I��gB�m�-А�	�ӧY�����=��湼7�!�ͫ����o�N#h�A
�2���A�Z:Tn�ܘ�(8}|�S�6i��ŕ������!�L��+V%0�`{[�7ߟy��x׿���p�FS�$�z9_���e���;�E���J_hT�%}��NX��U���-�[�i�_��@�J���1�{C���q[ջ�ߎ+�U�4����C|�S��vL͖��\��e����N�߸!r~����gr$����Vx�;#qHl���g��'��KI��g���%�%���g�&��ong?���"�&;x�m��J1�i�Dž�RQ�83Z��*D]Tq�]:��I�$c[��W�f哸э���Lm�l��ݓ��ܫ�t�t*|�p��܃���mu�
�`i�X�n���F��Q-dɲj�(����=	��J�мd6�[f���
��r-�B�PT�����DQ���#2�ȵ��̉P��e�/�9�u��G%8�
	cm�K��P9;���
�����svo^y�zH>��|��d2i�5��p%�F� ������\?�ڮ[��}��yʃP�G�y��أ�xt<K��7��P'L!t��д�Bg8e���~�?F�}ުa��;Q�ogJA#z������<M��slB�ꨐ��t�|����2ˋ�=kD���N��x�5�?k�0ħ�oLL,��P���Z�P�˪����\�.�@�2��U��t���~�qv����*�k
��v6���`�.`�4�P���-Y��U���
����7о=>�ۜ�Z�qE>M^����1�=ӏ�^��e�JO���ML�V����؄ܹl�Nh��'Q�U&�i�&LTn|P�l
h��N+���
D(�Lq_ВsT���W��V��x�340031Q�,I-J,�/�+�(`�q�9�E��/���l��&4Q�Ox�S]o�@|��X�Hq���%�Ԃ(��֠�8��#�;�L��w�3v�������݇v��b
R�8�W�ɬ֒�Z���Φa�Z�m)��(�dDpkѸR�dQU���;C��O�,���h��b#ҝ�xu|m�yD�(|�l:
'L�c�k���1w�]�J(;ꘔ[��n�)���m�A���H?�!�f�����E��3+��$*��:�*�_Rp�;�C�rɝ��tܖI��"c쌦x�#�t�>��,0�3(H����� T��rH�p3Xʍ0�|m�y+y��$����tat��r����#��B�?��2��E
�(W߿�	�9�/���emg�LRJ��M��dgϷƭ�[�{���[��]�|��G�|0�[�3]ChJK�'&ho@��8]��@��Hn��59�ߩ��=������8{��~&�� ��-0G�}{��H9s'	�p���9��~���f�O�,�R�"� �S��������]����vC��x�5��J1�/^_������� �����=�&��I��z�g�ij`X�SU�G�����U�Iꦑ�����a�Yt���m{�*�g�!o6KqX��3<������Ϝ.���I�P�xy��`��	qO!F����!�'��r	��V�7!f�6�{eiЯDC4L��W��P��B�;�	�5
��:�.Q	LyW�ZJ4ç�>��W��%�
x�UQ�n�@r(�sE���FQkl�
�R��@8U !�������[�;��nʡУ���@�WN�|�KC���̼yo��^��;�Y�D���c*f�eƞ\G�N<�v h����2&�I�Qj`2��<�
�ɛ�OBp3c�aUU�%��<n8h�/���YN�"<��	*�I�V8�ːl{.Y]�=2DBG�D�`ALRS37%&C��$�c&@S�b�inH������Vݱ�wc�L1�3���Wk�y�*$TIA,�R.��d}�W;w����XZ}�q�۞���Si��ԧν˲��Fw	�Y�o�m�p{����j�p؟�v�����f�.Hll����)�F/!�����!P),ʑ�£����_�ƕ��t{#.S?����JA�4L�t~!L�Q��ɞ���\[�}�� �d�x�340031Qp,(��LN,����+�(`�V��zO�O���y\w�{��Y}C�R����⒢Ă��"�ڬ��.�,���үްVpӛ���$���ex�{�Ж�ac_�Q���51Z��\AW���db���o~UfNN�B@iRNf��Ofrj^q��BYjQqf~������_F�y�9���M��v�Xx�TaO�0��_q�*9E��	#�h-�F�vӦ1En��������;�I�"&�u��{�|�{�ޗ�r4��`��	��
A+����R�(��ܻ��(��)U�JӲdz�w����f��XUki��T�q�'��J����E#Ԇi*�Y
\��岤��i��a������2���vbm**P5��	t��]�����e�AU�Q	d�L�9��I<i���xF_��;q{��������c,�
��g�IY�%K=߄_�+2qd����ۑ���e<�]9J"TB�V�����/>��8�~ja?�{<J��'���12�Q8q��C8�����W��Qx������A�#��Hx���x�B�iF������1����f����z L��\&�N��3�f}~�W�3l&���}�`ح>.fQ-•SQ�JW�̽M�Ns��iW�q�Y�dũ0�<Tk���Փع$z~��
9��cԆ�/$ת.MÃ!.���3VP.\�����V��>����>��3�l���J%б�,�m�rtAk�n,��e&�}Xd�4�31�

��
���Vh0)��9����5ZGa�)忹���y�?L+�#�4��e��ݨ�|����7خx�]X�G�L�m"%C��#
��
�4z�Yʒ��x�5�AK1�O���.6YK�P[�V<��lL�h���d]�e��`��i��c�.��ۻ`�Uš���p��h3k�̚9,�z
�"7+ؓU{�)L���]�z��N���6R� �h��N��a�>��
Ƨ�-!<���abr�����w�&��e۷BS'߈:�2�O�_h�D�Ɓ"dk@+$tZyH�Gm �@�e�������x���W0���x�R������2n�O5���W�����ƽh�40000 bins��S�*���İ�:ȳPP#�	���O��)�â=<7D��B��h'y�bx�;�|�y�u����iG�;��-I���y�.s��[��#�*x�������*�B�<��N*�
�!Ʀ{:���Χ
��,x�;�|�y�FF�Y���V_��ۘ��xqIΟ�g�=�9��Wx�u�OkA�)��g/^(HZ�5ioR�B)xp';��N:���͟�^���&��~?�3��i��fvv��>����ï����n?������z'��(�a����R����$K��'Z�A�d���ǔ��r�b��t�I~MJ� �*%8�E��o��=�flP+˜2˿���'���o�q-��PFd��n���1��t�u{2�q{Q��>��8_V;O�V׆y�p$�W%�
��B��0�s�3�r��
@���s�y���K�e�������$ �>��DÊ%pf]�M�y���QC����.rl�Ê�N�)q�o�"B���e��������n5��_1N�T5Ab'%0id�w� ����:���&k1A�Qb����Q��9�ގ��Ա�yEd�1	�22��k7�<����K��rN��6*���5WB���B>kO�B����
�9�f<�O���֟U���=�g�U�fz��ު��=ܙ��U'i��/��~L�<����4x�E��n�0�� Y��סK�T02!Q����	�A��_�%��
Z�'�M�S�-Y>�~�_&?�����/�d+4,�'�Cn,p��DvTC���֚L���b�;��,{� �O+�f�J���J�׽�����O=sW�7��!�r)Т)�H��?&p��gc
�8εQ�j��dn�(���w����V�[!���.��#��I�2��$�ѻ��"�]�g^�x�31��̜�b������~�X��l���T�]��Ն榦
Y���9�S��'�����'�<9S���t2��U�	�rx�kez�4��I�hb�E��ظd�&��U*�%闗���ہe����$3?�X�3/%�"�X�-?''�<�2�'3/���$�_�ZT���
�Aׇ�n�q-*�/��OWP�83����+��x�{��I�&,���41�#��DA�J�X�x�`#��	G���2x���<�e��z�̢���J���"���r}UC�b;.�/(���+V��KI�H-Vp����/�����.FV���/K-*�LI��6�p����>f)�	x�340031Qp,(��LN,����+�(`�b7�=UW�׉�����> Pp���M�KaX4mɳ<s��ݿ
7���ϟ�Qᕟ����p@ubЯ�x�<��C�}�~����ܜ̼�Ԣb����ו�̖ �ښ�A�z8c�g��1x�uT�oE���n�k;�L�����J�ǁd�G��JQEk{lO��qv�M̅�P�O\I�p���\8!�p�H\�O`�a����~���^�K�/J��O�c_���4|��j �E�-�;�4X���d���bl��ܸ�bD����~�8&��(>C�9L��̍�㽐����#�AjtWʫȿt� |y��{R��Y��\���4+
llZش���}o.��Ǹ"���{裶]ǙlN���ה�)̲ɱ)�Z��h��o�6���e;Ab[�SN5�hT���a|@	��,�R̨�@���vIN�N�"�G*�.�Ul%�<w��k�#��v�P7ˇ�:�'��/K"�Ӳ�^D�J5p�D��Q`�F�m�Mgą`GI��"nY�㠊��L����EvF-fV_�{�N���L{�O�瀅�'��&{���SU�A����hpH�׷�I�q,%���܈^#���D#�����X��Y�O)�1gԙ�<2�i�*<�'���Ȅ�<��
��k)��v:D�m[�#��v"y�6������4)�a.�7D���(�B��P���nj5-�]��
��Yx��v�Y0�ax9-�;�0�%���[��ha�#Ϙ#BC����jY�b
9*+p�Z�{&��rԱ�:�3N:�թX�$���mv�N�!�.����eMWvk�W�-ׇ�čQ�X9��L�XI��Y��怜C5�C�m�s���}X,�e���y5��1;Y���sL��F���v�;3��!�m��q�͢%t���� ���{2�Z�ҏ_�N�����b��C稖-+\ˤosÏc�q��\&����63ܛ�������D��Nr�,�M�����p�K��#nk�{-���iSr�n¡��ԩ��N?+�������Ej�[~�&ϸ�Y�צa*�r9��/����,v�g-g|x�̬��.���\_�=z"�.��F>#tfR���I���ÙvX��/�dZ�MlV;�K[�C�N��ʂS�@rv�J@�~tF�6��x����kA���@�&٘n�i/����Mb��$��B�(��2I&fe�Iw&B�������^DO֫x�PЃ��x� �'4":�k��:���|�~���wT���x'�)�ٓ��y�q3R�a[�=�(�$�8`]��kc��~���I=��_�]�妍C�'��	�`xd�F����(R��j+pu�����IU��+i6ߡ�W�3���#�����S��Q���E���嗻�l��/{}�vtC��d<H;�	_oY�i�-V�K�5�$�=�Q�z-}�Ąd�8����j�O�o�rY����Y�g��n�l1�|!���*:,@���3��=Ʊm_�l�P�����1���`[	���=���T�?���@�G�1���d�%õ�͈)#q���wrm�U��q�a�Hǒ�F�!f0�@9�]M�A�h��Ԋ�?ؿ�7o	�\�* �5;���Yjj� �[� X5��*"6�ZZ؟���$��18�� �"�2���oS��}�~����C%�\�V���;<�̙����nJ�<|��P|1�o(��&Rm�J��dx��S�NA	nhÏ��D�Jh������XC
�`�\X������̺36�4��w��O��|��3��[٫����;��0��񸖒���K]�-�m
.S�ܣ!�T���Y��̓++�W)��R�Z[�*��ZG�@��:>g�9ud���PL
,r)0�e��\J� A�Y�!+�
"P�"��D����&{��HK1�3���c�*0H&��*`�h%����d�]�Q�EHqX��Ҋij���M�
	Ʋ����ThPmqP����4� �O![2S�|���n	��KqjԞw�6�CYy�z��24Fz2�߀4e��d�.CH=<
����F8��I��c懶ց*
x��}�2l̺<,V��T�䵱NiѰ�2��L&���3�_釈��!��;ܨ�W��u���U߬�k���L�c�Q/w��h�yr�f�ᑋ�,.�ND:WnQ�Mæ�t�KP~��-0�qh��]�|Z۲�o��j�}�Z�;5�y���ql��=&$�2'>������ԓ
� ���W��ϧ�a.�8H�ަ��\G2Ὢ Mn~��G-L���I�r��.d����������&g{���1t~���ąH#)k�1kL����omu���)�I�z̄�q��@����U\��u�v�x340031Q��+.I���+�(`�[�ŝdۑ0k�什++��z��0�(��,.q�*K���btL�]�}�X��W�fO�*��D2�ګ����r�w��-Y;C�I�y+��x340031QpL*.)JL.	�,I�+�(`Hk�t�L\��cob3���}TãVC�Z���l�<����\�G�[�P*��8i}XF�a���������"�y�>]���4O�V�j�5��oiʅ),JM��j�$RQ���}u��J�Һ��F���rI�I���bq>tr���7�+��,�;�,
�� '���L�G�yn�j�:�B��th����������wq��_ͳٸpCzث�{���Pu�y�%�99`eyR��n�[ena��鯠V�r�x�2���̼t�����?�<����i��g���U���
	��k*�|W�0G���i�M�ƣ:<������2x��"p^p���D��%��9�O���g��NV`\�VZ��������q��+��I���ń�d�Xsq%�$+��g��)�V���+8&�%&�����чQ�&9?775���>��$#���6�����F&�ىy>�8�X+���̜��Ģ�Ԓ�Ē
��_YT�uTJ22�u�J�2�)�E��\
PP�ZX�Y�������Ø����ҢĒ�<���u�f�
����/O��Jyn�eef�W)��`���CM�;43MAC1-3'5>�"���Xl�����X�R���jx��V�oEW���M�jK���k��vp�4U$�6
�p����@�E�zw6޲�c���
Ud�ըWC�P�	�p�	��+�ě��|�q`%[�3������g}o�j����󇐘�	�0;s��矯L��O=߷`#���
k�MBN��C�h������>��iȩO�쩟�I��aU��;}�Ԋ�{$Գw(\0�� lnni�2�T
F�q [�=�j	�	5���g^�9빐����6`�V='�q� �._~���YQ���;U�P6��\��q����W=�ku��e��\xV�?A@�	�R ���0�&��
	O<�b`9����'�����𶉸g�$_8�I%�U�1k7��`>rڦ���劐S�s���!�����R���Л��
mb�_'���<}jC���ۃ�����N���S�'�gŞ�<���#��
����;�ȗ#c�lc��M��\����1}K�*�/��Rq���I+=$S�)�L������+�1<)�\�{�D67��@ś���?f���P˶89�j���幎�њ4����>9�|���w�+���˝X���C\+��?��Y�mT2�=�K�p�O%���{�(&�p�x
�.5��w��ҙy�°�av(���vN�E�77�
��!D��昂Nb!��X�5�

��|��B*J��/Go�0}~lSD5p�J��"�D�|"��Q=����q��{~�1F\�]j#����	
�j�G�0~���W=[��?�+����v�bV�;�w �+�H������E9�ٸ��z�SBT�mf-�\�ldꮦ^��~h*�b<̈́����-����SSfo
V#.�
#L #�pk�Ȋ�%p�y�8#�ǰ�B���)��+���e1v��FM4Ѫc�M��Jx�r$>��GA�:DM��,t"��@ṶjP�8��0'b'�
$���h��J��{@����#)��r��5Ќj�nl�S�N�e����Di9�7!o��:�(��Xg�tfA�?K&
�D��6k��&��)*y�2�cv�i6�d'FE�mF�� �}y�~[Xc�I#_	E(��c�r�t�6�����F��P��xh)�OTC0̓�1���*oa�?����Aޥ-fj��)�r\���ڊ�s(t�I�ê!�Fj�ńs㮬�J
NH���A��? ˱�<o0<&�|���@�1���:����9U��|���1�6�uw��!��P��}T�l&]�X��}O�<^i������%E�Qf��Ap_���ƀ|��Ni_�oq^%O�6��9_Jٮ�x'�o�]�x�
l�|�x)@�R��]P�6	kK�d/y80���0|�yk�SKȢ�ᱛg��:+�5-�@ �O]�d͔>�p�bۼ�f��)9�á�H��V���o-;13�h5>F"H�l��z������un]�Q(t�S�	��o5�U�(�ۗ��U��q���!�vss'�cJ�����y�!��2x�U�Mj�@��'ka�
C(�0-
A�@vF�c�l��:��4� U���X�Ç�Lv!��r��ˤ3�8qm��ޫ��_���h������xf<&�����͛���t���P�5�l	g�!����J�
X�@�
�sSa�=rH�$IW~�>���a?���trC0�����+��:p(���A-�ë��������Cn�,��8Lh�U{ڑi0V�ȲԗXX]F�h��:zⴆO]۲���R���X�2���sv�yX����Q�,ƝG`�y��*6�U�޳j�l/���q�0sgHL&P�O��^|�t�
��o�sg[�0���q��T`��S��m}kx=z��4JG�W���t�����ѫ�Gt�v�z����x�1��)�)��tools��7�	�
platform')�A��B���$�	��x�340031Q����.�M��-��K�+)�+�(`�:��Y�1Ӄi�n1�F�j���Ay���qx�{-�\t�I֒����'k�Yl&2��Zs)�Jr~Jj|Z~NJjHF�U�>+??7'�E?9?� ?/5�D]GA%%��$3/�$3?OӚ�___�?'Ej@qIQirIiQ*X.3MAC1�8>%�H�MM�j���6(�����������FV��V'N�l-������Y���U�IL�����5�QYNO]ٚ�j�G��u\���Px�[.�Al�O�z�Ԕ�D������"�Ĝ���b���b���x���Դ�
. �LS�(.M*.)�P�����(�(�h*(��*��t�k*T���B�LZ!f
V��=�F�!,r� ��x�e��kQ�y�m~HcljQ봍l��z*H%��BOB/Eň�g^�-�M�9y�^�0��?Ay^��"Ҟ<�wx�*��Z��g���~g�G?6^x����n��M�1j#��`'#%�!�dF?��'!l[=�+��O2bW�	�J�	��WF���9;�Y �H�6�"ҒWc>��@��5zWlt"
�F8��C‘��܆+#x2��<h3Յ~NK�R�0wE�T�LHi�����L�s�4�ץ5�X�k���@3�T�K��W߰)H�V��2Eax�rW����m+p#˔�9J���p m�}�o�ݾ�7m+֣O��;����n�ΐ�������z�y>b��>}�4�Y}����>7���J�t���6J�����12ߧ��j�=_|:S�ع2���S����ˮ���.x����y���:���%��yœX�ܔ"}}�2sR�����%�y�
�i
ũE��9�U�)
�E���%�E�
%�
�e�EE�)�
^�yi��zJ�_q����QP�� �q�V7r,��x340031Q�K�,�L��/Jeo�嗋w+����Oi�g��?!��=��]}��rS��?�/:�ִB1p����z��|�:OgW�`W�ögj&��d{V�ܳ��j)�|�*TI�����+Ȝ�/�͚���[Y���/�$�����BRfC������,�=��
{�T4/=:
5"9?� �8�H/�8?�a	��߃��f6x�,�:��߮����
s�8�>�3�O�a�m�󮘸��;�ľ�d��	��s.��'��3u�����r���x�z������[%A�e�6*W"��|ۓ�m�40000 binxǫ�Z������)�O�;<��100644 composer.json�q�oj�ûe�q�G�ǽe�t��32C�
~��HY��U��zY�~ȳ849x��/K�K�/��%����ux�[+�]n�5gjEIj^qf~�d{���c��6;r�a�hC�x�31��̜�b�©r����μZ�zL�j�CsSS����ܜD=�8�@%e!�]G
t��g=ӿq���lx�;�v�}#�JbiI~N~b���dQF���4���̜T
����B5���f�*�e��jRs�S!�0�xϠ�x=u}==�,�(�X�ق1�q�m&��s�V\�'����ix���=N�0@庴RY"@2�H������ڵ�cF�����G`�[t�!`dc��E N@��Jގ�>	��f�BL}�*�Z{&@�{�Y,s-z�4��
W9���
���F9�����s|g���I�b���;�/�@f6q7 ��I��D�*~�����`�%��us+��6o���OOڦ��$�
XO�au��6�_��u�S�Ȍ�1�D�xIM�_��Ye�x�31���ܜĒ���b�{+�{����?��6윐�3�.�x�31��TI^1����O}X����TA��D3�w#�x�31���ļ���,��'�]�!�c�ޫ�BM�*���ss�w<�0�[u�u~��ݍ1���]���x340031Qp�(I�+�����+.I���+�(`�#8C�X�����k^�mzة2�!D}pfI�cRqIQbr	Xm��y�Λw��?��;z-wq�l;�Z��ĒT�ʆK�����}u�ߊ�X�{��FR钚�
Uyi��G'Td
��KtM6Ӑ۸IepenNf^6�����)�����6�XMɱ��5\)�2Q�����>�T�Ѡ��Zm���jb
P���,,;nv�WJ�~���ƛW�A�K-�P1���u+�w8u�	�fNf���{��1w���x�H�����r>�V�W���6#tK—���100644 SiteDelete.php'YCs* cɬEAp𔨹닑���b�Wx�N�����7)ExtensionSymlink.php~�h:l�F�{�'+���\4�0B�[:J�F�?�S�R�".�ْ�9��2��iݨ!n�5��x��Ur�rC��`Abqqy~Q���BjnAI���bҚ
�
��
V
�E�y%iJ����J:
 y&M��MĕS+R�5`J�����Rb�T�c��jr+�stKA�)�+�`եR��Y�kW�X��Z���k׵+-N-���6cr���5��Nl�{�P\��-���RjrF���s��c����c���c�+�g����=q��DN��gz�k�?���O3Sq)(��) dv6~G�`�EfnA~Q�&Э�
�o֓	b��b
J���LTWP��;t�J%GA!�<��f4A�ꦒ�S�BMPp��l�4adc�B��?��Jx�;_��j��Hyy��������JIFf��P`2#��d�N׊�Լ������'����G��+�YE5/��X���"x�5��J1�O҃'�
sl��A���Vz�i�6��B��ԋ��'�
|3�UO3�0�y;�:y�^�����p�9�[�,��A;Ĥi�1*2>Ì�"��d(A��n�����u���9\H�u]��EM&�|�t�!��y�Pͷ��8ų��1aR7z����;�ff��#�ƫ�fJ\~W���V���H��� ���e��’��o$wO��x�340031Q�K�,�L��/Je����+T��%פE{8<��PmQ��������ﮗ��p"+ǭ��l��	U�O:��B�x:���2�=S3�'%۳��e�VK��T�J�\]|]A���Q�J9ȷ��p�D%}��G7��11���<��p�J�v%��5m��'5"9?� �8�H/�8?��F����w��-\��^�ԓ%�
s�\N�I�]������x6rfՌB�}�E��>����+.��
��v��,J�+[�n%���7x�U�1N1E!��bJ@2�"J:�(�F�ݑ=똌=��@��!(���>�!)G������~�ٮ�����oTw���.���$�d@��	\0Nc!04��X@'2�C��wo̟)Q�50жP�N�҅\�ytLh���"�;`\"]x�1�?\����z����W<&_{[Ev��E��r-J
�������6J&ԭ�m�ҨW�ld��7��U,����g�~��_�Cn��J��(x�uS͊A&Aq�^�� �Eذ���\�U���WAݩLj&mz���d��_!�!9�">�7A�z&��M�U�U����?F�
>�ԠL&5H�
�Li!��fphL���ΣR��P:�3�3r��)i/Q��8ͥ�aؾ"!��`J)�ʇX��Y��xؼ����zҎk;��v�g�Gm`���w�Q��A�~g����u��8P��f>R������	��We��1�K���F[h*Ő�<G=�`|�yU(	�}n�scxr�IO0�����,j?�Z'�F�ܢœ�4:��5P���B���h�m���=Eu4���e�r'��j�)�����S�U�,�Z�\��8��%@H�Z���H�J�֜[����2Wb�<�>�ۉ��������s�5��ai���cڀ%��J����J�m�܌ׯ!n2�'�M���j{����]��'
�/%1[�Y���A����K_J�6��ǯ�Y�~{�-���;�G�<wC�	��)�՝����J�t�+.xx��>�c�]�gr�б���3j
�07~b��O��6*�6y�0i*�+o[=���<��M�A��].^�n�*
��ͨ�1L�:.o[���=�鴱�`�(B;��1�
��,��~�e��W�ig+2�/n����/�x�31��̜�b�©r����μZ�zL�j�CsSS����ܜD��];/�̯O�� ���Ϋ�;z2
�B�
��x�;�v�c#�JbiI~N~b���dQF���4���̜T
����B5���f�*�e��jRs�S!�0�xϠ�x=u}==�,�(�X�ق1��5$?;5o�"����L���2OVc2�X܀�N��h1Y�Y�� �0��x�31���ܜĒ���b��e���V��(��\:uzCk�L:�!�x�31��T��B�?����t�5���^��&c/�v^�x�31���ļo3�z5ޘ�,�آ�gz)����+??7'��}��U�\�������}�(�?1�x�340031Qp�(I�+�����+.I���+�(`�#8C�X�����k^�mzة2�!v�n�9�`=}��}L^p�{X2�չc����z�+ss2���gp[��t��^ݯ��z×���̒TǤ⒢���٦�a:o^�u�xV����	��Hj��RK ��`�s�f�
���n]��c�^{��<�J�ԜT�J�H�b-��k\�>LY��u7�ʐ���<H`\5�2'j�Hżb��=�6���)D��I��{o��h�lp���vo51�*�-�N�����R��/x���UeP��R�@�S6���S�^g��v��2[�v�u�
Vݬ���kx�^����*100644 .gitattributes<���S�a�/f����1)���}�lD'ЋEF�!��ve����z���
/{s��%x�Y��z5)��J��x�uS͊A&Aq�^�� �Eذ���\�U����
��NeR3i��=�ݓl�2�+�9!'��'��#V�d��u`�)�������?���Ǩ[�GSB��ɤ����)-�����r�yT
�4J'u~J� �4!�%*7�'��1�W$ċ%L(�R���#;'���?��g����N�����QX�n�]}b��{��_�{:U@�)OV3�9��N`\���|w�V��2
Lf���y�
4��bHL���D��yU(	�}i�skxr�IO0����s�,j?�Z'�F�ܢ���,:��
P���B���h��m���=Eu4��e�r��Ok�)���S�U�,�Z�\��8��%@H�Z���H�9J�c֜[��%��2Wb�<�>ě���������s�5��ai���cڀ%��J����J�m�܌ׯ!n2�'�M���rs����]��'
�Ӓ�-ڬ��ܠ��xꃥ�R�
j��kc����Bcg�N�I5���dL�:h¯�Dug���r���.�R%]��^GE ���h7�a0�����3jJ�09~b�굏���*7y�0i*6,o��|�<��M�A��m�^&o�2
��ͨ�2L�:noS����ɤ1�`�(B;��1�
��0����U���W�yk#3^�w��𦍦x�31���ܜĒ���b�%S�%[�x"d�Nx�m��V��M�x�31��T�sf�,\z{�Z����RZZ/�0�x�31���ļ��?�\Q잺�¢0���:M�*���ss�g��ݽoU̺�����޳���	����
�x�[Ǽ�y��H[ps��1ߛ�$N�4S�y���DՀ^R�g�������|��q�g
�LL\+JR�3��+ss2�
2
�����a'��E�=�T�N=pd<:q�����A��w�vq�0��k}�����Z�9��%�.�9�%�`�,������_�2|}:���ztu��,�J����6x�]��J�@����E�4��b�Z��j-^�⩗�v��nw���X�_�K/��o�㘴��sٟ�������U�2K37n6]h��lad��3�U�h�Z����1e�L[+���p/�%`�pݏ�O��NE�fiA���$/3�qF�*�b���'�	���	<c%jhG�:���F&��|q�Ǐ�s�Q�Z��Ų�
P*�3�Zr��bn�#2���,Jt캚Ϳ�w�؅z�v�2��Y��U%�>pF<|��EFU��A�i`NYNa�0��Ҿוz��˫�]|����S�D%2�%�F�Z�?(=�oc���ho�m��Ռ��2�Ux�mR�JA��%;���Yj̀�����kA�z�1�;5nk�{��I�!�/�{ �\ē���-O��gX�25�}�}U}�����rif�2�����&�%B�Q�":��R!�Tp	�H����4Ů�W���d�A?R=	J!�X$�8b*=N�������_��fu{�Ge�3$�$�X�W淃?�/mH"&q�pؠ	�T��a#$/��ڭM�̘�iN�q�"�0=@�Ǵ�ʸ�;cr��/�@�D:ҏ��j��=?���zB��,�4C����c4��[��1=R�h��}��m����4����0��r���'�'�z��T?S��ה*d<\ڥ<���eV��K�:"^�fkGWpEy�O��o���Zox-V��4�E��
���Vק<�0{���o��F��b'����v�12T8I��i�7����V�4��Cx��R�J1)ct�[��8-2���FН+7NC�3����Hq)n�ƽ? ��?�f�tjK�*7��s�
���r�{}�=���Jo/���+R�q�'��bAp�t�U,B�Č&�`��8;
����5}�J��zM�g�-tdg���
#���O��g&�t<�׭1�F�N���8A�ڜ�l��	�2�(�.��)ݫu��똹�wS�,�����94��?�_��;s��],i\g`^�I���SȺF�5E���%$��8��Eyb�)�����,�����������qj�0���".p!%8]M��i76����$o�H�H	J��v2�w���'���m��oK��:^IpM��E�3���v����@�[62J4�7���4��XE�64N�"���F��/x��S�jAe��4 ][���elؤ�&y�i$�����P4��I��;��L��a��_����'H_��%)MM�3g�=sι�gqzr�lE�՚�^Q��!�@IOs��C�
�O� V��O���q9����6�!�iĀ@�9�Ӑ�b��x���������۴��rmZ�&���P|g&k����k.�Vn(7ωw����75{�@�a���T�
���<�Q��"�k�]rL�´���7�u���pt��d��<�kKln4��D<���)���8��jO8���R�4<S�R�ۺ��=Nl���#"态���j��Q���oA'�;�v���>�ѣ��둽�����q�Fg͌]K���U���v=�b�U��zXɵS�9,3��SF`��
�!3}+���	EHeyMfJ��ֱ �G/!����������_�h�6Cd|H�n-�s��58�,�\TX�Ǔͅ�5%�d~��Q����Ox��η�C�`Abqqy~Q���BjnAI���},bҚ
�
��
V
�E�y%iJ����J:
 yMk.(PI���M�KQ�W=9�E�>A�$#�X׮$�(=�$>%)A]�F!���0GA�d��j1�D�2���]iqjP�.�M��R�KsJ@V�V�&k��FV��������,zL�\�$C��x�340031Qp,(��LN,����+�(`���훽f
k�J+Y�rv0�(u��/).)J,(H-�ͺ���B��ҙ�*��
k7�IX�$"��5��xx�mRM��PŅ2�ƵzdFڔL[ˀ����N���B�&��'�{�}4�2t�(�)�w���+�K?�,^^¹��{��|����ΰ�~�ht�������ԟdQL���)�dJ�R�%+��x0Z�_UV�u|�`�?�p����>&�:X�gp�pi�.\.�9\.�+
�=Q���
e�P�zq�X�-��
�3��iYr3�qI+a����r��A<;;M`}���:b`�3��
K)X��X~�p��t�4Y�u�Hft��D����h.���)�m\k��o�o���7E�4P���zR
#|�i�����B/)�?zskgwst��7�;ikq'�����DQ0?���unt�^�)��e�F�kæK�z��hٺ�`No�`ۊ�luWJC\i_�g��B[��,��\s���HmdE<ۈJ(�?�}0�Q���M�UALm׃Ƿ���Лk�j"T)�8nS;mB;�o&w�Prb����3o�"k�a�S�joUx��+'t��li�r�^��U�3�dgx�6�p�k�Iu?��/�s�F�{�x�340031Q�K�,I,))�L*-I-f��.��5�i�G��[>|�/j����23=/�(��'�S�P͞�\��-��P��sC5T����������^n
É���ⲩד�k$T9>霞U�������p�Lͤ��l��{��[-Ŗ�S�*	rut�u���ƍ�W�
��b�^w+wr��($e�1ľ�;�6��΋���Q�lra�"Ԉ�܂���"���<��k�ޝ��p����{9RO��+��O�f��}�]̡����K����!�䔦g�3HV�)�q;�{�1�ě��SD>AT%3p=z�.��,e�W��o��k<㏏���Nx����i�#�/)|�3�dK}���Q��hb
I�y:��4�<&|�]�B���vMa�‰������\6�嘸3��
i�J�� ��]x�3������f]���#��&(2���K;b�����b�����[��lTwU���l���Ax������0e�I��أ^炟M����4�����D�,x����iC��O�{߹Y�o{$�TVY����:��W����Ox�}WϏE��l�41Jbb���ٙ��1�A+ �HX�(&;5�5=�Tw5U�3����W����x����ſ�?��Uu�����M�x�}��{��o��/76n-�=uf#Y��\:=xdL����?�͓���%�$_:�KJz��$gϞ�}+��t��t��7~m�kSS*J�&W%�������J7��.��Z�LI�SeN~,����L�^	�h �B���IrmN��Z{�A39$'�TZ��xz��=�*G���r��'�y��V儮?�tp�x���?_9|m3b&��-������/���zc��Hí�g�n��n������j6A�U�-z*�|�i	L�d�|�%���9X;A�Ul�ё�r@�)
Qf}%���r/I8��!Z�E �;PF�cS�ݩȭ(�.l�oeJ$�?}����TU�;T��5�ޟ^�	/l?|&�c�h���;4~��8b��M.Y����\90��~�j�Gz��Զ'���@Z��d&��(�n@^��L�I�x#f�O)�Bmh=�ǵJ�	�Ĝ`��(�Ѐ�8�G}2�/���A���2
�gw�j��y�S�\��$�f*���o��uY��pqް�R�:��v�@U�w�䎚'�A�X���@{�?�fam(G�(86{H�($���s�	Z��y�t���_�oBp���jFk�{��K��gF
S��� ��caE�3����ʐ�y�A�p�����"�| g����ع(�s�q���:�b銙t��$�K$�'��%M�M���.D����dq�����R��e�ՐyyYUU )�Ȉi]Rg[lH�a4���
;�'��X\��+׼,*͍>���/����l�hQ��k�����i��T�e_d+XtY&��J	m��zf�5/��^r���r;��v�B+1K�LM^���������ގ�!}CE�0�Ej��gV0�V8\3��^odt�=��*���<춙ͭA�"X��V���q����2����	����s/ ����_]p��z<+14��Rpm—�*�H
���	�҅���
 y=�S�<7��)2W��VxX,�.C����k�lv�7��^~e`���?�`�2�PsL���[m/��D+�y����;q�@�u�#2�F�o"�+yeh�G��\�
x����Ǎ.t��7&��6IL��a��@cາs
c
�$�����mqp�{�LP���A�{�h)-ZDh����*-�|�a7�s�PI�x>q��O�G,:����6}
>�%��B����Q��xm��?5f�V�����bc�f‹[��k]��!�3^�+�x`��9v��"��S�=m�s��a+G7�-�se�)n�lU�.�M��2ŋx�R�h�R���a�l��`y�ٍ.ziᶀ=��y�C��PU�<�;i��^k�{I�p�� ��������c�
#3�)�����Pl�e���I��QB�B������}����GZC��g�#��7��
�Vx.���N0�����j�/�|��h�*�a,�9�u�@?L;��q�,8����V�rG�(X�ˡ7F�%���k��F�;��d�g����B�C��^�;����q��z股�2�!&���T��%�"�x�]��jA���ဣ�R�b�;qr��݈��Ɛ&��rs�s�%��c�H�@�[�[�.��E*�I �gف�77������㛓��;�v���@	����,ZE�@j�Q)h���
�J�9�_��59�Tt>��,��A5��x9<��ɋ����s�֘�zs�<Y�^.Iu9�:`�ڃ7��Bꦇ��S�k-�rM��i�ƻ����J֒���Re-���������0��ZF���I��ܫ��Yv�NYj�c�D/Z��]K�b���K��t8��d0����&��w�=iǃ<���������-d��9:�J���!#��
�_�#:�}~}���P����F_x,�U ˶��A����LP}�U�1�%J��ޝ/��k�^����)�]�x�31��̜�b��ߖ�������Ti���Ч]��榦
Y���9�)�G�Ry���(�<y�ᱟ�O.�b���{x�[�x�q�-C3����������4�j�R��5ol?���m�)g]��8�=l�x�u��j�0��>�
��E�N%���%�С���\]��+'٦o_ɮ�3D������Hh�޳0�3�y�xJ���b���>-�@�-g>�P�Gv�K.|0P-��N�Ȥ�-����\���
ZWG�n�ؒ�e4z3u�[�#n؁~�q��#W0�Ws���7-Uzi��H)s��7��l�r�@����fk�k5����k5�
�Sx��´�Y��3�7?�4'U!7?%��8G/َK&HNU�h�,�����%�*��륤��M�W����g�*��A$�)Lܥ2�T�njQQ~Q|N~:X~2���d]FI9�F?,���41�#��Ď�F�*;�-0H���dx��!�^l��d%fǂ����Ē�<��kY�6�2���G�/x�[/��s����Lw�&���3�"�x�[��y�3FQ�Ă����Ē�<]���<
Mk.�q
d���ax���?K�P�ISS� A���F^��4� �:��T�yy�	�XIR���E�
~�~	G7?Iǂi�������3�6��q�$?g��EM����z4W��Fd&͸��� 孽��kvun'�N�8�a0���R��y!�2d12>x�C78p����Y��!f�}�0�4�nK�7��@p?T���:�L�^�:��	oO�m-p2q��QR����cM�#U����S�q��ޣ84v<��(anB�z�VC�,�u�Ņ��OV��(*�n ��ud-V���U�(
��KKnޙ_�z��x�31���ܜĒ���b�L�v�3�߼�nޟޱv�`1�s��x�31��T��^ŕ�_�4��TKM\,�52��Ȼ��x�340031Qp,(��LN,����+�(`��⩘�RO8D�f�#Ƨ'4R~���s~nnb^
C�}�M^�1�%��Wx�����
���ܜD�=2e��g�ܼ�u����A�5[Ȥ-�2��x�u�MkA�IH��$�nbZ(Mƺfw���"�i����VA*��ݝl���L3b.zӛ�}�\�%��/^r� �)��$�����<��o�������"�{}��b�Gŷ�`9zu"�4�dK�T�4كWs�Gsxj����,st?���ɋ��|<*?�Kp����8_�����0^؀\f>+Ih峉 h�ix�VS�!�>�
^fJ���;j~�g.⾃m�`#tJ1P���}σF��Ih(7�62�XZ��IsQk�!�&�V�?1�l"��Үg�l�s���.񡬬�^<	��	PrW`[MB��ʞ�=
�\������E���ŘGlK��yn\�f�&�D��Z���$f�
`������Cz��7��X�.@%a� ��ay�?N%���	��ҙ�䒜���<UVbW����r,�W/,�We�L-�z3���qx���Z	�
�R�U����Veش+1:a%;2f̎�Y%�6.O�X��Lsv�b��lu��6����AY@�7��v� 6��y�?:z(���#��>X��H��a�p�{�C��u4�,:�D�����!�O���!�Tbr�W��^X�땷��_�pc�	�ix�[�<�eBITPjzfqIj�^AF�
��Ϯ^1��m�$�gjh``fb��ZQ��W������X�SR�`r�B��i5��W?�(���{rb����ζ�ӳv>�i�h͓��c:�Oal�ۘ�n����j���/�)C?h��x���2�uB���-Ӥ����
|�`O�۰t���V�_�����~n�졚�x�{C3������<ϼ�Ĝ�����]�GyV����z���䗯�(��,.�<�v�a�3M���7��,����5��мL���P��8}st�\쳋my�Z����O�'aY��<��J%+�ށ7�1o�=�}5'8�$չ(5�$l��̬�M�e��w,�}��ޱ�{r��P����x"����0������vJl��Sx�[b3�f�K�͟X�$&AI�Jx��T�j�0��+t(8��|@�����1`e��U= &��+ˏ�iL�ꢵF;��x��!IXM(�R����W%��f!�����X�ߏ�eJ~@���;⹳�p�o8����2��cH9�`5�D���s��� ]2��Bm8D�CӼh0�}��;t�R9�4`�1et�7����T��r"_G0
���#�0�F�M)�a_��Q��^_dF��ɠ�	f�Y'��¼>��bB���c�:��S4ƿ^g5GV�e�6Ԣ��xA����y1���]�U��d�w���_mO�$��l�Q�E��icJ��^�V-E4���O�~�ԝ��]W���V݁�q�S7IO�~�ލ=��zF�o9i=����x��UAO�@X�!�W��v� �(��h�cL41$J�Y��3]��٫����/�����htf����*lOm���޼���6������*h�f`Qꄂ
�6v �pIЄ�>�v��!�@���l#��E�	!�x@a�vm��ʜ$#��_-�χ�l�S������X�H)�5�°�i�(�Aޒ�v[�va�:9�S�~�}�����/C|`EU��0B�!72�Q��T�1��گ���h3��`���}�f�Y��Q�ꈦm�e��D�n���0��a,i�=�n�G��$�N��׌��e),(�ȗ�KDYaD�:��#ٓ��4Ƿ�;��Q�V���CfN�i�^�"q���6�]>u�i���`[$b��u}�y;��eT���k�8��s���X�C!J�#q�jw5?K)N�	�P�2�RX2�9I4���)�닋�e�JΗ��*�M.�J�+��fu�(��z�ᕪ(@�#-*$����M5�CU�b#�B�
ft�8!�����j��e�g��2���3Yu��ba?��c̎�V����f�b�bQ����
|6z�r���}�2�[��n�!�u{"?mV�H�C��G�/�@LԷA�?<uv��������׎HQԢ�X��f�J���I���L%���֣�>�������	�����Gv�A���
�S�p���z}$�ӶU���[@��T]no*�h��wZe��6$I��ۃ�yN�9�/+A~M�>��&r1������հ��˲	ņeЩ�i����wmx$[��OΨ ������b�V�r���ϊ4�����̑�U�\:�Q�L0u(>�I����Ñ�N��Bx��S�jA��5mڊ?-<]bwW�MS1iVD�h�


"v��d��ά3�6�-�#���o >�x����ͦ��\�̞��}�9�W?/�1e��M�ڭib�mWhC8���L؟�<|*�Tj� %�!�S$�@D���L�Mx6$I�i_DW�zOʠCT��y���XQ=��p�$�R�#�JܰޥGu1����z���hK׷����ӂ�V�
��z��J�6�y�k��ޱ�+��c�AH=9�M�5�4Pfb�����/�T�粃� G�q��t�N��*t�ָtv5%ZUۘ���V��6%&F�53�}j��)g1����/�y�>z�_l�z�ӷtȴ��$������a�)(c*Y�Aы�u��
���d�B
��m}ƛj�W3k77Q�&�$D��"��Xݫeo@m�#':L��R�mZQ���i�9cu,�!�'�N:Rx���9D���Yw�9;��/bD+G��
'rD��C��0�#K!""��C�K�x׬��;םh�'%Q|1a8D5�P�v��
�5�W^�(�x�}�hIV�r�C6��j�~��~�[��+7�7�
���+�l
�j�T�Wʆ�r)QF�n��@���|�������]��T���j��y��|'e�I��Zr��{s㱳�-(V�ҳb���0JY�S/2�-,�{P���=z��M��B��}4B��X�Ct=��o_Z;E����������~�Nx��RMO1=g�"����J��_4=�-*�R�8���׶�YB����wY�~�����{�f<����f�����0v�䲤��;�pxp�
���%���k8��{���õ�f
az��d�$�G��j�S�k�"�+)�O�Q*�Პ�\����yi4�Z��Zť������&ߍ�'c�o��ho���q@%���h)�oj'Z�%�ғ,ӼBoy�9��n�I&�Uj;β�#\�����&j�FM���w���5��&t���_�/55���7��Ew{���s�E(�=\�z)����@��Z�ُ²�
�9,j-�y��ޅ\�Y!	ج!���H�CGYn���
�y�+�>�N�F��фԞ�R!]�8��M�';���&d۝��l�G��+���z��tU,�N�
3ɣ�"F�:�q�{�4���KlD�s|��מu�m%�Nw����-lc>��+�
����Y�rH��I���I7�5�Y��+nY�eԗ1�}n�)��C���<5Z^>��&��-�S_�^!�]e95��3#qDNS.�%�
�k(�łv/]ht�{�n�6?����Ax�{͹�s�����7�1�eC{��%��x����N1���DO^$�0n�D
���&�x��A����P�M��b_�'�*�<�v�'^�s�Ng��������Gᙧ�P11�ď�\%	g5L
�����]^�S�MTj�<��d�����F�g�U�+5�dBEd
6M�F~3�iS��Cۯ�`��'� ��W��(��t`9�[�F��d�ச��x����z�=��40��pk�i@fb{���
�C�
".��0:���!��e���w���ФJtJY����͜Q��?�y�6��2�[k��k��ۻ��5/��w1–��B�^\'7���_V���U�9;��̤3����_	I��$3�����Q����)�<8�m�Ҳ�
�)�ݳ�x��U[S�6~ƿ�a�6`;�)�CXX.�[��m9�%�$R���#˹9$:��!V��w�>����K����6|Jd9Vl�����
���ww�|�g2'ΈК

D�pˊ�S8��{�AnL�z�ѨkjGWP��9KC76.�_�sWU�68w�<Q�����m�ύ�&␙����,z�R�)�n�;�Z"�L*09��)XB8hY�������H5��=����$�9�E��؅�wQ`n�Wi
7�"�bl��T�����������aU����0TeH����`E�	pY�p��c<k�Hb �Dk�a��'&�l�H54�{/�S*ihbh
[Xn��2�``ܖ�5��!eji��/�������i\*���%OV��VpX26�
�z�cn�-�3�sD�tҟ`곏os�;��vF�闻�����&��K�9�G���(`'�}�%`wR`����ww}#x��	RY&�i��f�Z���m��ov�(��?�;}x���7��
�%()�f+��Q���1��VS�����|9�D���דJ� 3[]�8�#���r�MTJe���#���ض��dtyu;���?o�8!��o�(����8��!���6�s���f��&�M;5/7��������p>�^ϭ�
�"�Q�I}�r$/vR)���c[,
]�d��r��$��<Ѻ���n�T�Ȕ�����M���q�Z���U+��3Q~'�Nj�/�c�T�џ�����u�v�g�T���[��@KBaKֆ:S�u�6!v�P����&<h��[��������b��Lr�z#������%�Dr��)��[��LJ����Qo�i&j>S�A�(��o@����?a?B��Ag�Y���-�XL�}.9�{��Κ�sͪC��\�����߽��
�թհ����\
k:d��Q���j��G���B.���۲q�	/��9|��$��Q��B8��zĦ���q�>|�e�u��ؠU�YW�5����y�^����a���
x��,�E`�:&- ((�/IM.IMQP)I,JO-�OI�/(JMˬP�UP/�,I-�W���Ic�;&V��Y�s+�s�&��z9(�V�(�$�$&%�*@��HIMK,�)�R�����å�`pMfd�?�!����8�\�5wؕ�J22�u��]:ّÍ�kr4���\�9�cYj�j�yOM����Gx��U�oE���8	C!i�,vw��k�C��ĕQ9�P)R�Y�ƣ�κ;�l"5��i$.�#7���s%8�J��B���IP�ʇ����ޛ�����lj�[S���T�rk�%%�]�y�*Md^[>����*8~�C9p*�|�ZJr�dB9��k+ͻ�U���V��pz�]Kt@�F0j��6�$p�CmK�u��"�����Vײ;��2(s�T�s�̑���S韭�ʏ�ƱT��jQ�R'�3;��ӊ�!�¥\7J5, z���T���Qk��������M�����}ϵ��B��C0��6�’���)w�-��K�8e�1
�w]?T�z�Y���+��~�]���,A}�U��f�=ʪ�|ޤjNB�9���/����/$^:I|���|���^�wA�a8��	��J]=�u��
����y������~4�Iz������C��J=��\+��ʩ�Y�	+�%b��SX��RM�m�q�Qjf�FOӷ����F�ڝ��)`rԈ��A�ըo4`��Q�]_o�v�o�����y>#Gy��\Ez��=�0��F�>5:��Xԯ�wP�Q,��v��X�Ӵ���dyD�S
�u�[�h��s��0�����˦1���p u���Q��R
!4�j3}H���>;�o[(Bج�X��M9��
DI�8/�eFE:#Cձ~�Ӏ�R�-��Rč\~n܀s��P8ނ�Y���Ni�l�i`�qcnL��{��M�g�0b����`pr/��bU���ɜ����vlT/���V}m�qwY~���JL\N �D�=0�E�U1�0QS��D2_aj`�lj�iB�@���W@8Xh�(W�iV˃�15��L��0���!�*u��$Рt\N.lO4�Q�9�#b�&��7_����-d#��]��ܥ����^�\v�б�6|z6�WI$�pÁa���>x�]��J�@�i�^zz�"���vw�)���x��ٓM7�6�d����{�'�A���&>� x1���s�>�f6{���f����
�گ��y��ڨTj���ec�:�����.�P1x��#��;�R��<�í����|%�3�Db�a�(�7R(jĨ"LV0����.�2�F�C{b��n�k�K���SSP���?`��C�*L̒�ݔ5�Q�N:�k�e�I��aGۨux?�w�bNp����ܬ��P�w���LUj۽ʤ�(%tTQ�Fp��UO�U����&�F�&����(��Lx�UQAkA�&6ћ`+"�44����THc��SQA��������23�65P��I�Ꟑ�<����W�Bo�lm�s�y�}��73��l���8m��P�N����G`����Ww�¾���}"�F���^�d�F/=�I�A��o*�h�J�3Zrв��c�9�Y6.����
�Pi&l����ֲ�ŷƕ�����	'�B�rn$��!������
S���jZj�.~���^�բ��(�1;���E^��2\�C���s�G�^�����:�o��ꘘioX�T-vGf&�LqԼ1����Z+XqZ��Tq�܇r$A[#����b���\N`�}��L�%Ɂ����1m�
R�j���<����!ʟ��̧7�3ȅ�0����p�%��D��L���h;K�F�r���
'	14����^��4&�12S��d�k�N�=��
�x�340031Qp,(��LN,����+�(`hPޝa���Ͷ_�J]��SB�:���%���f]�gw��f��L�~������$��H#]�7��Lx�mRۊ�Pe�IQ:̛�e:�)��A�6#��#���d�9��Υq��/�@ɧ̣/�����$�0''a�^k�x���i���o�݅�n�Y>�{.?�,c0�a�#8�
�,Qi.�����%�e��/W�f�N{�<jOʯ�Q9�ݽ���V@O��~�zC�V`��
�H���R`�̤\���п,��ay~�Ha�F���r�9�ծ6D�>�s��+h$3)*0���ONO��	j�B"`$ce,9#C���@��X�]ӈ�J�#�!QrA%��0{:TJ�A.�����kϠcU�
Y��p�L�]CI�R��Y�%�G�7�������oow��<�N2�~���<g��Q��Tɂ��#�+˜�:��L�*�4fA	�q�EA�V�2���`���Pj�B�́,�� ʤƞOB1�%u�u�TFH3��P0a��{�
�UbP��r�‰��z��OӔ��Vu�"B&Mj'uh�<���jJj����VAh5�u-7�|�L�޾���N���&�u�Z%0*��M����TQ������:[�|R5�x�31���ܜĒ���b�{�k=y�oYƺ �+�����
��x�31��T�I��/�/X�c��'^�Y�?
�n;�x�340031Qp,(��LN,����+�(`H�;��Odcl��u�zsc��=&@�������~�'C�WiE�e���im����+??7'�a��C��=7/t�-�;&z�c�V�',��A��x�uS[OA�V�
Z�K-$Hq��"mm1��Q�.�	�	ٶ��vw�L�|�7��>�O��
���~������rQ�$s;�o����C�`�p=s��ݕ�\��!��aN�U�V�ip�r�ݗ�� D� ��F��o�e>v���������Np;�=
��p�a��Z����$z���
ݏ��H��X��N�~�AL�C���bʉX�5jZ�J���Em��S=O1
��$���:7�fױ�!����ݴ:�	�	�;��8��4�J(�L�[�E��l��;XC��ˆJ%�l�v�Գ5ۢ�����1�iq*�0��B �o���XR�=�{���E=0E�b6bM�t�1IMg<=98��N�g��Y��l��qϦjEp��!�C��D��3�[)Fѥ&�Iט�&��3L��ʎΚ9%?�����-e]�A��V6WW�6,�yI�Œ]�����ɵ.?�V�n��J�v������{[�k5t�M�?/��4�x���\��'v�n❦�h=�&RGR8b\�N�g��*S��V|���Q���cq���0<
���#)풤����M
�3���	w[�^�l�#-��]Qj=nO�nS�(��i��}ٚ:U�C�v�92�z19�0J��4�ݢ��R�6�����3���=���<ֶu+~)�]�b�jj���++ŻYA�cQ��aH7��X��#�DZt���ZFn�A���5�����M���kx�[�?Ao��gJfQjrI~Q�d>c���ܜĒ���b}��T �������n��5��O��ES�k�>��>�o�t�@u�@uƨ�o��g[�(��fx���7Ao�#����fqƟ�)���+x�Q������2���4�Y��_@�2�4�40000 bin,�����ɇ!8}�qa���~[˹�\J�C�%!�Rat'�H��|"���x��Y[o�F~�~�٦@b�D5����M�6�sA�n�҈ISSv���<�o�!)�J�FK#ι|�~􋵛R�+�٨��KSi�����c?���x�?E>w�n��[]�Z����_�f�T��|�4��t�{��vsB�%���f�	��JotՐ]R�N�4�g��ۆYڛU����l�¶��b�S����>���;O���S�*~E���_j��-�m��Cĕi�킥J_O���	�|�J|ll5�~F��hwUiUA�Q^ڊ5��N�Y���w�&�>��G�[���Z��l4"�̿�|�����i�����I��Vޖz�0U<��W�Z�U�4�m���}�7�ӹ]U拦�Z� C�{�3��O~�'[���L�a�N�F�����-MN��neE�����N�x����"�Nj�Ǥ�U�J�M�#�i�ݡ�Q�׷5�1M�'UwU��|��i���������`K�)�)��k]��K@R�MK�K9̏G��Y~?�l��zv�*
܏����&�́`�a��MK[ڍ�d�}[[׈���|�ξ�ҙ��J~�M�0AL�\`����L�
.� �q�{�ax/�U;�5���WNMXY���|�
D��G/%ο'��[ �mY�ٶ�ϡPE��/B~U��A8_�j��Vx�:�	����ZC�Qt�:�1k+Iq���4��0�8��C-�Y���#��ɵgcd�Xإn@�е�
]�FrbJ�9R�2fj�L)2G��� A��q��Q�Ʉ-('��<�0�b.{��i
�+N�H���.�qD;dLq"$CF.f�-�/؊.���Y��7�=�M�ޕ��#҇�-�@!Xf�؝�v�i",�d(E��
�;f�ox
W�	|�T�Kd�u��R:jF��Y�zcT��h�����4M�`���9T[6�N/�QC�i�n؎�$����V��l2��t�����3�KBּ�
�i��V| ����:z�?��jS�B5����?�$�����x�M����r�a��=-P'�Kv~�
p_��9g~�|r�]V',,_N��m�̾�ug@q��X�b[$��Q�|0w�+��E���et�rW�앋,����B7�?��x�/��\�t�y1�/^�8�X��4E�'x�l'��:�폺�}�&��p*.��H]���Q-��8�t�[�qC�mtņ�K�<��+I��Ap����X��"%_�Vq"�Euv���p&h�K�
c�ɽ�ד�aH�Lo���v:H���w�1z�A��h��F���L��rc����������x��� R�_�Cz#�I��@p�6o��c��vM��9�:�oC��NH��|/:t�����TЧ7��q<��Ň��{DF3�)�Ʊ`�^��3u���}HR'�9���)J1}����L�AC�[("�{�:��Y��W�D[&)?�x�(L��`�%�	�ٰ �ٯ��������� �O���<]��K�V�xe�r$����F�9цZ|��G���N�#�=E�/Y��¥�:V��wP$<-0�t�6V�ϊ3��Fw-tG��I���ap�c�d�P<AOtQ�LU����}'�p_��m0�я*n=�'���Ó;�n�IF�0
?x�n�C�4Ω��Ge��m���w��լ.[T�l�O4�e�/��C )��1�����b�A��W�2\��SJ�t\|��Ю�k���4��Bυ�����8��
$�-�e
�Fu�$C�47p~0�H?���Կ��Ń�+yD���FOX	��;���)>+��"�NmŢ��x�ZU���4�G&��(�a1QUn��†���	���ig�:u
��p�S���s:�G��tc�p�m���=H���s1g8w�.\M��.
GT!�.�&T�E �N���Iă�����p�i��"��_a)����}�U�Sb�l�Q��T��)|(T	��3bs��݁1���N�2K�T��5!>�aX`�_��akȧ�B�pq=���u^�3jҡ��)}�����m%E7K�2_n��W��un���ں�V��é
��lL������X����V���+�����{L&���>܌�D��epߕ�^$;Wb�Ͳ���}�05���¾������O��<�U�(y^6���Qݎ�AZ(}~�=.t�DN�f��j^�Bih�K�r��Ce��&���``��v��j��4z2��Lɾ��kI%��-�(wǬ2���c�R�![�}ܣJt���1��E�kH����0���@ȇ��X(8c�P�e=/�]����f}#)�nذ���?R���M^.N��s���T7�H��OKt�VxuS�!3ƃ5��*�9/�
�b0��{s�Kɧ�������	OV�-�tcr
�W�s�W�<\�ֿ� ����ǽ���|Ј��)��?Z
aSJ��C���5�̈́�?�����7tx{�ۃ��	�O��ɓ����q����8�z�A�̺��p��:�߼�w��΋.�S�`pn��K�
=�i�rir���	�zw��/J�-�Ɵ|���-խ[���U.��#������x�Vn"��iY�U���ݏ�b��g�J�S�����UX$�����Y�< ʘp���~�]�/�~i,D<׹����[(��6��CYi�jI�?�%>~�Ni7>�{]�����w�)������
����KھL�Є|������^�]�C�?�c��+�_x�URMkAe�$:���6B*aAfAV7�hN~�"���N���t
�=���x� �Q� �0O���Sw�^���~�}��ѽg�y�5TN�<��$�vE�N 런ҴTn>�'i݉a������j籀M��,��͟�3��#��̓���z>�?�a&%�aIZ�&(���j.��e<%�b�mlݽ��r<G#�)��t�9-�Dwv�}Iַ#N�1��ă�d�F�M�v�ޠU˺�;^����Z�����r�Af����p�c�-�oζ�(MS�s`4��W#�0@�i���I\�J{xU���k�uӁlE	�pnCV�=4�T�B�����'��u�9�1#h~����.�
X��@m�_��^�ʄh�>�r�þD!!d|&)�
4�
��Н�ʽ/�I"q���F�Qx"�B�I{K22�4&��8��>
?�Q�=��U����
�����_�@�b�x�31���ܜĒ���b����=��s�~��j���\��x�7�x�31��T]�¹3�Y���ިh���:�����x�340031Qp,(��LN,����+�(`Xtr턥r��n���x0�@JiΌg&@���������+�w�ny��7ل5mc.*yCTx����$2�q(;~?��慮��u�Dz��
��.%�E��nx�uS�OA΂�m鶥4 0��n��biU�~0&��m����3�ś���3xЛ^�x4у/��W8�݂h�dvg�ޛ����k�d�t7u��}�bn�='�w���&+�|�cϺnۯz����P��q*%x�'�g��Hz����Cϳ���O����V	e؂��J�,�?�{zx�O�|	���"2�'Ո��b`�Q�&��	ymc&�wє_:�����7�DǓ��h~�m�~W�*�$w�ޤ��}��i���ݘ����!�P��,5��0e�"k�8�R)�

(}`
M�V�ΚZS%:���P��<�1<�Q��Q��|�.�S�SDtf V�H1M�T�Ǔ���Ųԅ���f�*f;6���K�h
��*����b^7����8s[��X'�J,\a�E��f�e�TX=����[�t��
>�jz�ml��oom��_�q&�Y�3�B�r�2���s�W
�_W@�Y�̒�0��kX�\�A��¥)�O4����Zd��>D�$�)0E�<�O��W��pMNOӒ����)MSތ[�,��#�]�\��^b�!��9g��O.���Po��$�E�j�&`/z�8��5{blUҕ���tJp(��k|v��.�u��Np��$�RN�jl���rM-���Gyô�CeC��F*������W]��K��#EgqMZ�?�3�\~�*7")�5��j�c�����:����&�Q
�l���/Z]�)x340031Qp�(I�+�����+.I���+�(`bn���!�{��i�fJ6O�42Į�-3'�G5���g�c~�;_mu}\�t=A���%�E`
?�L�~���*�I,�=!n�R\\R�KsJ���C�\(>]5�&�����;yO�k�������_`5��<�޾�����~�W����)M�D�(��i�O���c�	C�j�>@��=�v�a�3M���7��,����5��мL�05[�����s��.���jf�'U�Y��T\R��1:��yV��JV�o�cޞ{(�I�sQjb	$��df5mr�,۴�c��ӭ���H*]RsR�*w�:�vO��!�`�բ5O�.��8��2$?;5�;WM�̉Z(R1���DϪ��s�a
�BUTwƤ�彏7Uw4h6�V�i����4���,,;nv�WJ�~���ƛW�A
K-�9H|��J�/X������Ae�D���6��O��qx��S�NAE,0�$�!�)l�t[J��?k���H4��n�ݱ�3�̴�1>��0�
�Oa�����햖�^�̜���ߛ��_����܁��!�sν&�":������X@��>�a`(ĀX�XH�Y^�PQ\77��E�˹�F�^�<ӣy,TAN}�q�;?��U;xXe�v�۩��%\���X]D%�pu�(`��.��Y��I���-<�啍`��I`\A�X�
�LT`��{����z�������7�X.<�iLZǟ�j X��kK?S�N"�ñ�"]����(��G�hTr���$����[l����<"R��tIǁ���a�Cd1�8�4Ţ���֝'K-#J�I,I��Xf>�n��,���J`���E
�R�W��:��"�;�d�5�?z�G�/Y+e�� �6){j�"�[��7���'����M\#V3�m�'�ǃ	�|H�1T
��"��gn��Xln��g.Z�p�^T�N�OA�r���̚�"%�z1�0S1���`*(A�Rv�&���J�&!e��޶����׋�8��~�.�t�9o-xPs
�K~g#����P�����m���˫O��jA?_Z.&:'I[���C�\S_r��T�l��^X�xUMgo"=IW	�a�
�Ա%�j�ˬae{?���=���z!)U S�庌���=c�4�3.��u�lBkf�8 �fb2ӯ
W������]x�i�����d��Ȫ*�-m�Cז��|����x42�>�����]I��#��UC&'40000 bin,�����ɇ!8}�qa���~����I��;��L�iD		c�Eo0K�rx��U�r�6��W��Z��宣����d�ũ�ʕ�@pH",��_�#�a���*_"]�ht7fo?o�}�������X<�ʃl�iP����H�Z��ƃ0a�����rp*��V'�K����2��Op@�5>'x
��U����:�{��Vr�}��`�
��7�U�B;�����ok;-���O�L�ո��N���t�cK��Gj�=�B+|�3�������@8��͡W�u^���z�xMB��7p�)��Yq��7���/]��+��G_�@#e|� q��cu�~�����n�*�m��G���#�=9����Bb���CCP/N���:jZ���dj�T�#11M:�U&�#Y�8;N�� �(5^T���bЁM1�r8q�����:m�U���C�	ZtI���~Ż�D!��)�O
}�Q\��	���\G�o�I��Px��#`_��0�GJ*��0??�1��zz &�xT*�Y�����F�w�irv�{�C�[���}P.BCk=aI�1B��Wo�yb�0������c�jf���x��&�~�O�La*�W&��+�F5D�v�Rb�{颺"{���N@��CJ�Z��Ѷ�d�/�z��.��a��p���
%K3���Vrd�=/{p��QpKm���.~���S���Q�������G1sv�B~x���@I�*���L�c��ڝ��&����Y:~ۣ,�,Ż�x����jz�g*�X�O���;	����3]n�=>ey��V�y��è?����8�$/���hp�N�4r�����`�h��6h�1߯=@\~F���[R�1�$�/������m�V��=M=�cG�9��sT�xR�mj��F�*�׎�X��ek��+�=x�URM�1eX��=�iV�r��Af�=�1��,t�S3I��$=c�����E���J��)I���{/����_��>5���q�,�U59��$�|�	M3���FY��yo8ʓ�v
S���u+X��O0WF�?[�&��Grw�ɶ�u=�L��0�|�0'�i�hep
�/��%�b�
�[w�yx���|j*�g�2=sIUG(Ѧ�|_�����x�?f�F\�D#�f3ezo�Ѫy�	S}L�+2=��C�J8:Z�u\^�APXd! ��
���%��t;I�<w%�@\ܿ�p��§�7S$q.��eSs^�X�
F�a$�¹Y�:��r!+er�6��c|�n�n��3��k��va���?&�e����mL܁��ƧV��($ČO%M��w���������8�$.Q�H{
O�]�;�nYAƑƬqܖ��҇��5
�g�"^#1�Ưw3~Cl��s�a��r�h�x�31���ܜĒ���b��8kn�)�u���~��\pPV�{
Ȣx�31��T�V[�W�l�����n>�
�%:Aܛc�x�340031Qp,(��LN,����+�(``d�s�|����go)>�o�����ss�R�4yO;�o�4_LJ�E@ѹ&tD�W~~nN"����3zn^�:[^wL�ǚ��p+���ax�;�wVo�#��fqFS1F..���}x��Ǻ�������D���$5�83?�1���(1�D� ��a�o�G͜���A-���0t�G��Y����
V/�<�J�YG��@��O�O�GW�W�՚Q�۟�>�o���Q����	�	�"��e�p}�|M4�~���S�]!����
(���.��t��ͷ��t�6�[�2�Q���5x�h������$����lxYݻ����1�-�׵7(���`і�!�����aǑ��P�й�I`�����V����8�*5b�𵏅P�h`^���%	��2Lhwx�[�6�u�yL!9���x��U�n�@U�h��"�(���AlC��T����B	!�Ԟ�!�'�8}���f�lٱb�T6�B�?��X"��I��f�x�=�޹�\�M|��e��^-B�!��"�@�P���:�.	�0�+���f�0+P�5��<&��w)�:�-0]��d��+��3o		|�3������R�i���;���IɸZFq�8ȅ�Ҭy`��ҝ��l���:ʇ��F�2�F�?:�_�j(���\�5t��bf7��ew�ڬPB"�����
=B1�U����7(r<LkF=F�r?�4����3$'N������e),*O�ȇ�KDWaD�&��#ٓw�,J��[ȝ��(A+q��\�!3M'´FQ�(3�"��`7DL��ܰ-
1���>���o��2j�RƽpX��7���C,¡�	%q_��P��`A�G˓�2��~
KV=-���871Upmvv�
"�A�r[?�ϕ���������,�!�Y(e�^�1�R���a�C���o1S�P����ա3g��d.��X=w
�d��в�Lݙ�����)�	��g���kKrء�Zl*���R�`����V,��T��#���tC����3y�Y�#�}���������>����M�{�����f�(��P�^G3E�CR���^m��淇Ͼ.���v��F�gR���瑓9`�{��x�*�>o�@��ve�=l���- pvC�.�7�i���{�v��6$I:֛#yNv�ח� ��O�/��6r1��Y��:+���˲�����>֬�,܀��6v4���'�T\�.��L�~*{;�5i�Eu5��H�^-=�(w&�&%i���•�x340031Q�K�,I,))�L*-I-f��.��5�i�G��[>|�/j����23=/�(��'�S�P͞�\��-��P��sC5T����������^n
C��'Vi-�͝�|}Z{sM��/�Pu>�ή~���m��L�I��.�g��Rl�>U�� WG_W�9o��M>�6�s����C���M�@!)3�A� mA�q����N�L?�|[~�Ԉ�܂���"���<���aҦ[�dz0�5�2��	R�BW�����pm�>Wk&֛r݉w�W���w��W�S���W� Y�ijV������o��O�QQ\��p��l_��)��o^�]%&��*'	���,��Ox�3������4&�px��y`�R��d~���~Oϡ��5.�7Dm��^���Bx�3����drE_�M�a\4F��� ��Ӊ�8�x�+�<}O(���so|on��9j���Ax����iC�HH�|����'��œa����kN�Y�{x�uT�n1U\r�‰� .i�mSJ��[E�N�SU%�=���ږ�M��~�8rC��~����n�8$�L<o�{3�?��y��Lޞ�`�ftvQ�.������JP�5Ze6�MU1- ��_��=�^��.d(�`�_��h��=w��ga��C!pƗ���V,H�Aj�hL�X�e8K��J�0;�6��[�"�6�2��v;.�?��	�"�ǼԻ�o��>0��rVf����'z��6�]I���t^K%��9�OK�:�ߏIbN�S"�l�r��Dt�I�*#�֙��q�p�K��]�R``R�C�#\ͥ�a��fs��;�b!}
�#6_n=J�U���":�̴�
+$�|m�q!q��O�-,
���n��~;:x�t��Ճ�FnjB��к������z����6�H�G����H2^_�C~�TJ���2�AzЍYg�BF�~[U/���^}��nmJ0��,ёnZkhߌۤ;��2I���N��'��	�3�]�z�"߃�h9��-b�pH[�q��$$9�����%ڒC��V�i�Tt�<D렉�>u	!��<`4�����u��~�֎����v�Go������Ի�{��c^�S�"�J�P3K�Cֺ6�!?��B`�jȣ�z�E�}�-�}3o�ǬEwL�JR�T��w��26����N�Oλw��|t�oscE\F��5�@mr�I�į����������Rx�B��������\���list, purge and clean�L�z2�@����"�`7�+�CaV�x�31��̜�b�ˏeV��JZ�a��e���׮o640075U�����Id�`��R���b�ac%w�[�����l��zx�ke��8��I�hb�fGK���ix��!��y�3��F�F~�Ă����Ē�<[��r�*�!
Mk.d%�vE�`A&����ux���:�u�K����d]�&�Q�x�31���ܜĒ���bu��S;�x����u�A_��X��x�31��T����w��H��:[ْ�i����k
K�x�340031Qp,(��LN,����+�(`�7Z~�}�)Q�}�sbf�6�8�31���ļ^��"R߶ο�t|���}����������Idh�{���ӀmLrny_��1ˈ��r-\�e��Sx�uT�oE�&���8��v>hH2M\4v�*�ǁ�*"mR*E,��؞d=�쌛�78 �FO\I9�
.���	q�!E�;����݀Xiw��{��9�k�/�.R�}����a%����0��г�u��CUE����dW�q�(|9�����~�8&��(>C�9L6�e���i`i��s���+4�_I� <�~�wMzR��y��\���0+
llXش���}o.��Ǹ"���{��]ǙlN���7Ԓ)̲ɱ��z��d��o�2J��e;$��s�)'���jP��nP�K�3Z:6����	�IN�N�"�T�=B��6����
��R?��uB�*�W�\��J�,�\���: Bv��+'[��x�5Ro�n9#.;j*h�p�bU]��e�O��(�3j1������=e'��B�5�B��q�=�)u^i����n40$W��$�4���Utn$Y#2��*D³����X��YIK��cΨ�,�Ex��4xK����	GyT�V��R*�t��#ڶ,(���x
��G��2�s,2ɦII
s�_�΢T
�C�"J3ִ�|�Q�,�o���9}�@^�A�,�N,c���#��`=R���3�P��h`d�Z��B.�2\F�֒=�b�(Ա���3N%��R�L��chڶّJ8�}�_UE�7��\�2׿JlyX�M\���ʙd����ʝ�
�:�n�T�9�h{�ݣ�����־�Q9���9L>��d�Y$�cZe6rN:o���3��ߖ\7l-�{}(�����ߓE֢�>|=U�0�/BK��Ï�P-[v��I���c�<�m.�����>3�[�����ǵx��Nq�,�C��/��p�+�b#�h�=�܂��ۀ�)�^7�P�o$����<+^
�Hw%vm����2���7L�q��0�O�T<��X��~��V�;ز�Y������2���L�
~km���ܺ�WK��3�
��N�?�]δ|`U�?d"�i�7�Y� |.my�:�+@��N+��$�$TE��?w�x31���T�PF9�����?�Zg�:�����	X�%�$1)�8���;�����l_�):W��ED�kEIj^qf~ö���*=/�/�>rgv�ϔxY��̼��"��9������i�K�L�t�8�������<����;�~��*���mu����!
�3KR���_�7s�A�o9XBLgזO540031Q�������+�(`�4:�p��tǫ�kδ����|��Q�`r� ����u[eê�{�S0C
jPXj�3�`��^dz.<uL��i?=���t��@L
��/.a(��Hҝ������:���

+�J��Cx���t�iB�ȓ�˅��L�훖���+�]�v���O��
��+x�������3��ഷ�A|0����*���ȑ�l�
x340031QpL*.)JL.qNL�H�+�(`��BzN���-���Gn_z:?��!D�sNjbX��4�{-k|dI}��tk��=PE>��%�IY��%�`�S͹#���\���c����JJ��!�r�-�*0_`i�44��'���-��BI��x�[ĸ�qB�H\Da3/s��3Y�k#{�
6�N�X�
�[����-x��='�A���919#u�S�,�d�)h(&��h���椖��hN�dStP���K˷�H-JUH�|���Լ��⒢̼t�d�y
�%���
%�
�6�`}J���Ų�L�,®?y6�U���9ũ
0�l�β�J�IM,Ҙ��Szr�$p'8�3��1x�m�AkA�)	����CSi���
���&MlE�b��(����dd3���jk�w��ճ�~�^<�9?�;��bJ���������KX��vD�-���˫�籘j
G\���{dF����TE��oz�^Yx���8�m�T�8�8���!�
(���0�g%�.J�ăka�nux�&Aƣ30s,e�(0��
ʧ+��ʟ�^�j��7��Ї��sܨ"���{��i���bf��W�m�a�����A�	t�DJf;f|H�ni�#��T������m���b
�!?h�y.��;�fJ����y�c�В�IR>��<~s��H�sT4I�*��L�,Q&���n7�7�����]=���\�`�~%�%�	�Óѡ��C߅{��I(_��'>)�l������tD��WP���S���R�d$�8�B���:�)�Rw�B���@'�'�A|Y@\.��x�;C��a�
k)4�����/��Y��x340031QpL*.)JL.qI,ILJ,N�+�(`�;�"0_����^����*���ޥ(��悇���u�\���|`��Ͽ+P5�y�%�99`e��s0�z٧S/�p��}�����71��yx���� #�<��w�v����0L+�3i��7�m��/��Cx����o�@�u	��I�:na�55r,5	�(�� $�thU���꒜�����H�DLl�?�	$�"&6X�XX�Z�q�GԁΧ{�=�z��|��ҮI:DЦ�h�c���–��&�>#�s&ڗy 8��䮽&=�Դ.#B��������Օ%�5����ݤ���O����SW*���Q����&��B�(���\�$�G�z��h�<]/�z�b�6��|+���Jʅ��	�t���s'w>U�#6
�D�MC��l��DQ���<Yx��<H�p�/@���f�7!	c�<FEts.�Ԣ��9�4S�*�����`t����\�u4���p���ƥJ%aH�ˎ��H�\|С'��Ory��=�F.�1sW횗���b��쿰\��U���}\Ŷ�O�Eqj�09n��X
5�~���N�3�,|�`����FJ�oS%����81?����?y�D/�׼	��%xf�i�/M��x��t;P�������PL�
��/��x340031QpL*.)JL.q�(I�+����+�(`8�z����_��u��\=5�㐠!D�KfqbRN*XY@�7޼���a��u���Pe�ypU�k�	Mo�x�W��m�ɗ��=��<�Ksr���k����zЊ��e�>���e_\!�2�L�����[<?��yq���_���Xx�%TiPjzfqIj�H�e�%�2L�Y�I3��"U\�����
Qfq�]�wb>J���7�9�
�y���ux���t�i�<��������Bh^f^qIbN�^AFìٗ�;|8�u��O���G��ɗ2��O�K��ux���OK1ƙ�E�C��z���]d��A��U����Jv|���ɖ݃��~��z)���^�
�{�g���L&3��\�yy�I�7�kw뿐e7�hF���}k�ъǾ(�2*�%�j�F騢 ��`�9|�	s�B�R]όG|hr��=�D����C�s�+gj$��������(P�l�iG�U��0c$0��N�v]0�_�`DH–��Zr�{�T0b��6#X�jinL0
:�����[C�&T ����u���Ӝ�M'�0��@�y���d�q]���>k�9#�ʖ=��i6���Mk�x�Y<�E�+lQ�ѴA�8\��l׉�=g��2ܜ�%��~np;�i],z&�)'�S�5?5v/�б���'��OI}��D��O	_=����9��Ų|x�W~--��(�7��b��/1���j���r��=o���ϼӆ�����_^�C**Ȉ����X���[����ڷ��O<���ix�}��J�@�)�Ҁg�4���FR�RA���K̎����{)�E
=z�ċ>����4A{p����?��������Y1g�1^oǼwW^Ov�S�����NQ�Yx���A�3B�����_��s��*0��$���G�.���mӀ��!���*K�;�s�)9��I�6��^�ģBf,\cDVc%��Blt���9!�4���v��
�q�3?��
�R
�$l��/�Չ�rAuag��59v\h>��?�x�JJ����	�pкۃL��*��P�q�
�ń����rx��U��c�#W�kEIj^qf~�dFE~���ļ�(=9�Q�ݱ(�475or�Re���Ĥ�T�T���bǤ⒢���)\Փ�YTUJ22�u�SK�sS5�Sa�V)�5�&[��MLT�����IT�+U״�R���~�����+&�敘|�[@�$?=='U#-1�8��k�==ɠ₢̼�4
%�̼�|;��T�2��RS������)�(@]
�Uf+W-b/c����Nx��/��c�#W�kEIj^qf~�fFFF����b׼Ĥ�T�T�\J��cRqIQbr	\-W��kL�����ss!�@��X�'�XM~Ƣ�_������QRT��i��5Y�˔##�X!)55or*�s-W-��.����
x����RmC�JQjaifQj|~^r��W�c�G������gpH�c����������u9S���;�
��=x�[b��v�1��D��\1�%�yř�y��_I8���&��g���8&�%&�9��2Z���g��)���+ )H���Ǵ�� �f�*�x��Ē[�Ă]��Ԓ _CSAOA#�$3��*�8 '�$-�(WC�$#�X׮$��.>%�HS�^A]�S]�JA]]ӚK
 ���N^"�5�M��ķ�|QF|�o1MvÿI���Ox�[j{�d�2��p&Sn׊�Լ��<���_��6dz�0n���e��$���W����f����%�*x8�x�;��z�y�9��)�)�O��ڜ/��U���6����H'����#x��UO��DW
E�WQ$�Z*ԗ���Q�m���t+�.BE��瀚ʚ��Y��g���Ue.�8�F�p�lo|���W�'u&;���b�<��o~��{��?��ݥ���/�Ӟ~�X`�CKh��&�J�F|z�ƜF����{���ތF<�?��WY.�0>��Ȕ��^D8c�|
�U��N\I� "�ry抌�.���v�uĨ@O����G
c/�
��,R^�9HbO���<��~�lj[
�s�>�@�*C;+���_�2�kת������䳗���{yl�HF������ ������J���{'�4�G�@�8�(��AP�:_"[B@#���j\�=��¶�A�/�0����e�ކ��K��Ec��ͳÊ�����i�<��i���;���0_eH�{љm܇�����O'��ߺ��`e�%龳U�%��1Y���=oY�?���!�6���ͯ�V{9K�����c�l�E���f�s�J*Dsg,��L��'�P��8�g�
�{g90!�F5W���v/�X��d��5��k�T4���*�
A�~�-E�!9���/nR�
����P�7[�c�XJ��%�ݷ�=��nd�����O��o�Lw����1 �H�1��#����#aL���tUlFI/E�b���g�vjs��1�ס��fW��_kp�������}��q�w<�c�qJ��220R�����{[��=}:�9�[������3���o:�Ԅ���̩R�'��q�P��4��-7k����j��'Ӑ�
�&�N��S����rm���\��+*�6��P�+QH���0���#��q(5W��r�Ko>VS�W�����
!����8j�z�Ggm7w�o;��k�t�ʧ�^6�֮��g�EB�jy��ְ��x�340031Q��KI��+�(`x��{p�e�[���_���R�W�1�(
(-JO+�<����s�5Uq��3��Lx�#��C���x�[�s�e�5�cRqIQbrIpfI*W���L,����9��@���(=U�V!/�\�-3/%�($��iͥ� �t�D�dV��IƓ�so��8�>��М���'�<M�o�����‡'ˉޝ�G4|r�X�\�ɽҒ���%Nn��<U���ER“gH�i	#n%�̼�|;%=��^2	<@Z�F"6y�L��ݢ���d�'�qj���Z�Z\��������T���ox�;���A��=�-3/%�h��s	���ļ���̒�Ǥ⒢�� g�kF����CK2s����s��<��*R+JR�R�&�09����lnd��$���_2�� ���*�3�u��5�Ē[�IVV��9�%i�E�*%�źv%�E�%�)�E�
�
^�!� �
z
��������&?cU�W����^G!-1�8Jir)��6Ua5%E���֓
�l6�b�d�lɡ3y;������`- ����������Z�Y\R��������38$�1�?�.F��o9�T �����[����W��Y�����KsrRS���F����ͺ4����fY!]=���D��x���ݎ�@ǃ�&;^5a�B=L�,^�.JX�"l��F/��P��X�f:�%�'��c���,^;Ӗ�p�\t�g���s~d�VOq?�����!��!���|ܲ�1���N�F�q}��a}0�M&�Gb����<�}8E�n�Q���(��N񌨊�+�D+�훏���8�^�@�oS���;�+|��bY.C��c��#���NB<!�yz�����E�2!����Z�Sk lJ���b��$
�!��e�[`��m6�B&e{s[\%�!I�=+�mcb��� ���k���)@)@�W�2���Y7t�X�	���rֶ+h	!#l���]k�����!�?Ӈ�Y&���`S;(֢�����̽ԭ��e�s�y:lD[U*����ӓ����\�5z�g/���Uym��A�U����a6U5('�������'(GMS�R�X�.p������2y�	ꌑ�Ϥ���Ȱ�!R�B�
d����wY����I��
�r�<�6,��I�'t�:?鲿d�^c�Ѫ��x�|"DԤԣ�0�/Hˮx�ƒ+�8��ܑ�Z^-'̼���y������r|0a
��"N���px��&tGt�#{�[f^Jj�d������y)1��%�1�I�%E��%@��׌���3�K��d�Xsq%�$+���*�V���+L�aRb�+��ٜ��ƔX�X��`��`e�Y��X��_���R��Y�kW��[��Y��`�����⪠������[����WRbƧ���`��Κk�eV�5�_��MvcU�t@��Q()*Mմ���j���Պq�6��D������gpH�c�55�'_���-.(��+I�P��\�Bf�B^>��+.I��IM�&�f�(�âɓٵ6�a��
P�<�x�340031Q��+.I���+�(`x�j7�{�_nXa��_R�
���B��d�8B��zڊo���J���ތY���
U���d�R��+�oXz���cT`�mb{�/I���x��(�@d�#{L@Nizf�d�k��0ne�)�H�ɉO�HM�P���YOC)-1�8U�Z�V]Ӛ�K
2�4J�2s5T�R�KsJ47����}�&��x����J1Ʃ"bѓ�R�-��
^�]��̓������4Y�lk��WP�Qī�o�A|��g��9�Lf��������na����xy�ӈ�g(,���K�a�kh@��L?Bs�$��0)��2��^�^��)%��y��3ۛ�N-!d�۬�P��X��@��T�@:`�DjT�WC�TE�9�[5��0�%�[{�4)���ap3��5���6�6����Z���Ύ'�]�AHM�����d&�wyݾ�P�1� ���&=��8��X9��RR����(4��bV[Z�r3�T)ڻna��6ڛ0ر4F|�ׅ����I�y0�>�&�*?�*�:��_N��r�P�M�Rϙ�%�+U����L5F�JH��� �Z$�E�"`��\[vp�o�o��6�x340031QpL*.)JL.	�,I�+�(`��^��"�0é�%ß�wS�/�r���9#59�3�l��Zg�w_�ݧuG����;7iÔ��e��A�{���KYݤ�s�����}�����(5j�Ĵ���M��);3�R-cZ^T�KjN*T���g	s�X����ήU[wU��U��W������4;�E�t�O����ڜC+��`����r�S��7�G�������j�އG�>洀���+.I��+[�A�+��C�wia��!�"�EL�*��N�Ǫ���;�5g�����[k�S#����-x�{��iB��+/����Ͽ{���^������5��+/���x��$�T|�������d#���9�X�sJS'�s�CYa��PV=���y;�4\�l�}��x��T�OA�h����?^tqZR�DcL*#pP&VR�vڮ��lfgK!�����y��D�^�����'���ٝR(,�4�f��}��������7���q��,�:��A����2lW���<a;PBJ*���rVw�(a�����6�x`S�Da	�A��J�䙿&,50�-�s�
�� E�*Y�f��6v��[�2v<��ᇺX�=�y�H���v|��Ŝ�;;�e
@!Pu�N*���6���Ɂk�Ns�@�ꓐ[�q(2Z�+>��fT��v䷁�9�%V�}Zԗ)�!�"�i�
���*V1WJ‚\}��#Op�+�l�r]�̧@~�"��Z��h:>7�����E�‰�9m#u0��������b������*��l&'�pPV�xY���|�
�D��ʩĔ��|�FvP��V�}j�n:s�>"��I4r�]��eS�s�"6�@(th����x9��@]�dd�b�P/rd|�Ec��N^"�0hmʟg���6�t�{���:Q�3��uӛr;��n�t��ZaxB��㧲|�����Q����sh|��{(�)�h=����M�(ok����zh�5v�w�M'���S&nv���
�h��].���K-�*��R&vA�"�����c#��ܜ��đ�/Ɩ/��,��.̘s=^S�],�<QhM”�^�;7h�6l�h�P�2f��i���yW�K���T�}�ҙPc���a�Z�r?6ɢG�'��*�ul&r�:p!m�fTpg�{�Γ��8�;$D�`��<}�6]Ok�ҋA�0h�z�PcW�{}RT���h^[����^|�?�������"x��VOoEW�8q���B�0I,�[�v%���FB)U5E�(Lv�����l\���P�q@�ơ_�P�R{�Ή|���{�����o���{�{�7�/�׾�6����'�Dbƞ���-��Iƨ(�d�`��zynyIt�.�_�y�	YL���79F�Pb� 
S.	ɑ#;	�~�~N��f�_�u�ḫ���ى�Knt2����@8I���=�1�:�ӳ��K��L�M|���;�ٽS��Ʀ^+S���$9��S"�qұoɀC���������
���
�\�`��-��7����N�6�~�\�v�@G�BPS��c���߿
4��^4�8!��p�_�AM�5��H�L�R/R���+�BCn�P
b���S@>rj�݂.� 0?�<o�w2��́L���|NNL�����ש&u*�
�Ն�e��F�8���B4h]%B�%$���)¼�7�3|OOwTHw4�y}O×!�a^�T���X"BL���*�橺�\P|�������X���qAK=������Y�Z�;
�1���\��(C�:�YU?]^Qw��`e@OK�o&x5P��z|5�����kKjv*ٲ�F��܊�i��Ҙ�aam��xU�稙��}-<W��(�uJ�����1v��]�Cli���MY�x02ݣC��
yx�d���Zng�a����c���׉D�p��Q�//�:A4�C��A�y�C* ��uכ�LD^��IB��:����6�X��L�6�Uu�2��8�L�1'Ύ'$�4ۗ4��%ߧf0�B۽��W��pxY��d�����vk�r��@j2��z��j�>W/�SJ{<�q2�עZ�3��F����,�F°{om9e,#b�Kn�5��\�@͕�_p�1�
CUE��`���;O��ׇh:c��Q��3�/���|�g���u9�[���A����z�:�%�:���q*��{�w���
'�����s'�b��e�QѾ#���"�p+D�s�eh�2<�9���C�lu��I��N�O�r��`t'"�P��W�Oӧ�Jg���Z�� x��T�n�@UZ�)�ZPK�mjŅ
j��Њ	����GP:�'���	3���a�r������/رg�Cb���
E���9w�=��|����w��{n��2��ś���*i6�kU�G��a�5���� ��tc���1��]K.cdE�^�[���<�8�0�����I��nV���z�6�G1�.G&W�ęt^	��@���ޞP�6�r ؊��c�S����͌R��%������z�#�?zA�#z7J�!3�+�g�&�O��2s�Qvc]c���ꘛK��=GTƪ�Mu(�pC��%��`A�bh���ƺ��x�(ӣ���eՑ�6�&'�?�p��n8�H�2��	�2��̅9�6�=�#��C�2�f�.{k3� �ӳ�C�3syr�>�4{{v�6����B�ď�٤��z+r�(I܃������U]�W��S�=��3�dz�)�eb���n��bQ�R�	��B�ԓ��ٷA�H(9eZgP��ɛ��M��t��mW�C��Z���5� mF�`��2�Q##�Z�(�g� 'g��6r<,u��@��5�p��}-J0�bXj߿g�a����<8t<d���YQ�P��; w\���5i�6<�1�(Q����=���#�g�dF�W0 7����m:���j� �<�#jlrJ¤+7I��%F(<y��S�PV�Y��)��{�M9T�����z���1x�uU�S[U�TJ�i���0�/�$�Rh��j?-�:�L���&y����
���t�(��:��n�w�Sgܹ�Fw]���:��%��ۼ�s������)��D �;�wpmՔ!��V`�AC0��y��%�X[���w��ۥ�[�&�fï��lk7�i͆Æ��|˶�^�-�]0_��
��������X�L۝��Mݴ��‡�&)N�bw0���U�	�-5qq:O�P��Hწ2����>��V(��0��=~:����D����;���;n��;.F����lZL��U�����V���ѥ������0�]�$sl]5\4%('aJ���`X�f(pPU��_Ŭ�;]��2wj�C:��ϵ����ί��|�y����q������>#�\���c]�v娥R8���׻���n���]I�_8n����	ސ��Twb�j��.�lV��f�F�P�s�ٔ������Rw��e�$dդH�+L<c�9��T�܍��xw�,C2�Oz2x.҆�&�l��a��/�c�;�(֯��$L��,!���M�&q�z�tR4�{dc�[��V!�<Zv�5ȃ��M�E��:�6��}����J�0��-q7��0�>��~{�u�&ۣ8|��D$J��Fd������6�ǡ��\��a�d������g�F��ⵥ��חV�V
�ui&��t�u��p�S��%�Z]�h��b=�ٿ
���O��$_�-�����ï������wp�����Hׁ9�����ԗ���5j��`�����Mڙؗ
����?�Is�Yx��"m(ҋ9R7mR��ɿ))�&�*�du�7��i(�^j}�~d�a�/=hm����JU���R���9VU�`+�7�ER-���]f	6�bP;����`q�*��n��jzQ7>�ٴ�d��Y������R0��g�`�\���L/���O�Fr�E�ÅwW�	W��⊒PEÒ4�y��#o4w�	�?�}��`g�n�Y��2$1�����? 0%�?�ěѷ_ ���&.��,@R�%ެf:]�������]�/�k��6Wb�eZ|�w�4�&�"� ĪnW��e��q��A�Ӫ]��=�VDe��.�ʳ�e:�Ӗ6�犴p�����r׬ÙQ����Z�>�X��7x�)/�6�^�c����N�y�߳:L6�C!�֏���/$���
��L��~?Ӆ7gN����2^������8;�yD���e|>��YLemRJ���Y���?������?x�e��J�P����DZ�)-��G(ƢI&'�P�*��d�ɭ��&7��;�����Dp)dp��C��'�j��|?���:����,��u�]��ls����CO�J/����S}s-�ԥ�,S��i8�m����ӂ����H���3�DD�K�!\R��7B�9}���欸����abYy�:-�y��r��O�\�(9��aVq�.���V��%�J*6����v�Q�IS�B��Hv���2�}�w�jZ��f(�$�۞k��{'Rĩ���y~g�-���|/���֟�/��v���4x�[��q�w1Ƙ��Ŗ3�y\g�/���(x��"�U`���D��1��%���K��g��)�V���+8&�%&���7?e�g���'��x��QOKAg�(�F�xhU�'
�($-�$���Q=�2d_����23k
~�!<x�Q�����Q�f��x�\���~�>���Ώ֢��@E�a�����w���Y9N‘R�`V)aR�4J`��\E���^עN!z�u����Ң
���U��Ce��+ͯ���T�����-(
�G
!^�Pq��ҟJsF%���Ԗ�{�#uj˛'�B��OL„���V0	����>71�c@/�
Z���Z��h�U>�f��*l:U��k��6Ln��L�̞�
.��n�}=L&Q}/�yA��B����9,��q����m��nÀ�������0��7���3�F q���`���U粏�M;�b�^^��
�i�zS��Y������zY�_d�2IM��-���67vs�/���ͨx�340031Q�,I-J,�/�+�(`�y��i�pީ�Ϳ�g�,Tا�b6'���x�Vێ�6}��b
����M����M/N�f��fۗn��2m�K�I�q���o�li[�H&gΙ�R�~W��8���|_��ء4�u|�l=�W���/��[Y�DhM�"vpϪ-���������ԫ<?�K�6������@:�"�f��k����>S���jy��h̔�vY�*�Kʊ#%��}QH�%F��
LI� B
VZ6���h-53R�:����	��&�����gUanOg��x��aK��a�
N����*O�b��ix��
�ƭ��3��JZ�������!�@
RXs�1��]��"h��8Do���1Y��	�JV�0x��'8J�����x:�w�p�s,��@�w��񉱝ST��5�Y�6�Q8���v˨�0YHw��=}Ql`S2�x�x����x���BY,f���
z�4�-SX|�F�Jk6�DO��E"(/�3���rd��S+4�q�D����b�m�l�$Z�q�'��t9�A��5S�4J��pMS	Bt� �3�=ғ��]�m��
�#��Uy�)�×���4ǩ���BSl�)pl,ֽ��1%R�w+W��
�ֆ鍝�h=�,L#ζ�6�+B1'����!�BQb���둄�8l�3� ��'���#�A��ei���_�6:�z��O\�B�c��2>����3!��Xc7���"��B)N���ႤUmN1��0�/@7[�gs��37yo8��R?�s�ɶR��T��ل8�&� xkڝ/���V+���P���1$
'u���Qk�&J�Sֆd��o��]�6�]0S�yc��b}>�7g-�zj�ZO;�ygsȷ���S���C���CC�Q^���C��1�"�ns�>�Q�怷Q�q	r����+�XL��I�C^�”Z"_J?+~W��J��{����0����~� �$�v*��z�KŮX�E���CY�6���ZP<,�6IϢƵ�q
��(O��JeA�o�9�WT����������
����!��O��'���x�;%��gC[hIf����b�͌��S�&�p��Mx�}U�nE��!�k�
� �8iVݵ��
�M)"
MQU	�;^��CvwV;�)F���
�� ^��]+D%�[$��o��ڎ�?0��~�;笿���9���P��E�pǡ�yD:.��'���`�\�	���Q�#��P�����oz�?ڷ�p9����,�(��B�#���'�)�<�{ݦ��HQ��8b��m���Y.�/W߮qJ=fE��!ӡ�2o�F�]
h@�����2�it.c�߿����~Rl|�pHx�8�.?*ۗ�����Ū���/�
,�[C�.a��Ԯ ó̡"V����t��b���̪�e����nA�x�Ab�� ���f�LH�gmpr��㓻�ǥ����Q�8y����x4���Eaq6�_(�;���f�~k"��Qtƅ��oY~c,e�z�04�]n�u0?	�l���nz�����+�ʻ;)���V�$KlC�].��'�{��چ�}m]���?����0�����& m0f�,�<)]_@2;
��ȷ�mZ��)f�穵���{�U��n&r*Ϯ����Q��M���0]xk;����k�0�F��&Jׁt��$�;Kݵ�	-I��3@>6��ժ���������ƙq��e�LJ
흉A	�7+��+C�����&�g>5�UVo�Q�+[R�6c�!?O����a9\�w~}�(��S��Qdu�>JN8M��׋�^`\���M��K?y�%��E��k\nY5;q�V�N����˛�]�g�������K���/k�p��t��s���[Jc��V��&�3.��󺒬�a���nh���\���/�'Q��O��g���>��4|��з��U�.�71G��)l��7��5��W�l���N,��`����-��x�340031Qp.JM,I�+�(`��6�+͕=�|�Ҍ��ejM~�cQ���_Q��](�ڔ�gNwn{ȳ�fT�*L� �\��Px��TAOANc(P��p@�+i�]����RL�`*�k겝҉�3ug�bԐ�$s4�����ŋ^<z���7�"��^v:���}o�W�z��t���Q��…TK�/� pY�������\�SS��^M��y໒s_��'��M*I!�-d�zR��$:�4�
$�3���B�bH\I��J�Jځ/j��ꏏtգ���i@��zr�4�5ׇ����JT��>I᫃����;xu�y���P�!�
 0�zٓ�?�R;���V��r�*�;�ު(�|�����F0j��x$,�2�t�e�CG\s���Y��8��u����)y~&�}n�jH���Ri|LՍ���Vs:��gШP�ҤEC�b>�G�(ݰ�<�!E�����
Ŀ�6���Gc1��Y�abx ����R��:�S?�.N:�u�,�*@N���'#�PG��v�Ft�;D=ΰ$)�&�9Z*qO��9���jn��<�V�)-rzA��(�Ђ�p�l��A���Z�;�x,P&�H�*��)Hi�i��B�0�e0�)ʪ5�^@������Fۀ��4���SGD3>�_4��t�&�HT�/�h��A*B��8��Y$
��QAQZ,�3���"u8:�~��cV`c��Fk"0�FS���zo���Q��������뚂;+���\>������J������5u�"��=��p�!�~
W��#L�Yj�m��x�_�~q��m@��lǞw�Q#��{rH}3'�%k�/���d�gs@y֣ث_���� ��0x�m��J�0��C������mׁ��*z�4����M��t4id��<�x��\�9�!!���/Y}�/=����M�DHF�~�0�8�lW�n��戰$'@�$�X�V6��e��E�<��Qi�n�9
"҇��2C1�֕��DՆ��;T���؏��#)
@lT�S��@9Ȉ����-<R��I8a�r˄_��۩U5\�u�ڔ�3igD��ls��Ь�`�h�4.̖Kdࢲ�[���rDc�׳-p�;`9A�Ck`�(4���S�ȮZ�7�S��PS����:?�yDiMY��_QW��J�4���R	Cp7���,��?<�4�^�f9/�ָ��
x340031Qp,(��LN,����+�(`P6^�y즒=���2=ل���
!J���K�K�
R��j?f?�!ͨ�o�����'��|�
U뜘��
Vr+i�d=�S+��M��Dom�*
-�����ĸYEsb�Ҭ�[^,�̶��<{�O��"x�mS]OA
&"�H�.R�ۦ���AC �4��M`�����f>(hH_�d���>���	�'���>tgwϽ��sn����x)jF٩��L�$�N�<<�6�-^�0$P5�����-�1��	����_���!��]��)7@l����[?z��v��.��ڏ��0���؃�u?S�R|�l���ҦZ@@t��Ou��C�M��]*(�(�|"i�Ih�Xz���r�5
O�U�J�)�$�I%�N������2(�0�4!0u
�p8fI4Ώ�KV`�*�锤.EuJ�А��5����
TJ!+Y�N�����&�ݳk\�㦽�#"I�5�&�h(��1��mGz���p��׻��,��P�b��d����6�h��8c@��2g�j
��3��	����4��,C[ac.y;JҸ-L�@ѧ�BQ��Du8��٦8�mµc?r� �6�W�n�-wd�r=p|�G4&~C�N!hV��֓��X�+�
��(�Ԅ� ���Q�S���ا����
/w׬EWS>_E�q��k�Z�:��1����q�E{����s%Ƒk��_NJ�A�?�m���]�E�|w?���eSA�(וֆHIN�~��i��/��C��B�o��m�{��y��)Eu�X�M�kWZ�)���p��̾�Jqy���	SZ�^L�AL�`R�}���G��^�R��*^Ei�E(�T�
n8�����PO2����x��4�G�$ir�=�
QV���f�x��TOoEWR0$i!�_\�������=��!M��􏚞Z�2Y���ݝ�ffWUT�:��H>p���8���7.��tf7�'*F��}�{���o�{�?��鏿�n�1E����_r����C���漽�	�0T؁j`�bE9�,������W�\�K�D�VU��˟�ga򡓇	h����/��(pބ��]�0xQ�~��%bO�m&%�������G&?0��$������I(.@R5UIp������z�"+�D����k�8%��A�8���W�HՂ�o���7�+�ϝ��s�gJK��ӥ�jLƐ��<�
��"R�(��/e�ks˔)�3���ӈ��DW�LY���?.��_A��Z�/���P�]�I��)�U��(A�OU���3��C"q�}v�7��[��֐fW y<.۞��o�j�G(�S��-L��:�4V��4v�ζ�����4��[g两�?����?Kam�dhMϊ-v�M8�풕h���@�´�l�!�扁�D����ζ!gC��p�>���y����}�f�����ADb��WY</�_]�hG���9��Tv��J׃U�w2�n�W����=T�`&	����Z��=�*��RI_9W�W��ut--X#
Ca�+�Ս�Y�+ůL��
�	͜<�}ӏ�09mGf�8N�����(
�-�s~F���`��oZ���~���ruqn��}":�諧.���89���E���'G6�k��>���+����~��r��>��ı{H���x���#[��#�#�3���A�T��
����	>{�͒0�T�������p��G�j�*;F�׾r5����M����x�Uo�6��W��� ��E����z*
�ł44�AK'��D�$7k��w)Ki�����L޽;޽{|�s����� �x��N�ƌf�D�	�8>~G�%��	�3�5

L�p��U�0�|7�!�S�$�n��M�4�����h�Q��˒��vEk�p�p�Js)�E|���h���l��8�Ur-eU2#e���Q&���E!�
BƄ<c%h�U��Zjn��#�$�P׌v����\���� +����e�-zj%
fsІ�~��ik�S`J��hB�ָ��}9�s4��-6�9���qc�l����~���/`+�-��Pp�t&���?���ok�XEy).�0^1�������+�csA�S|��P�
���M�ڵ̟�؊���ýt-����vz\����FU���2�=:m��L��,NN��~�~L����q&s$Xw�¤�+Ũ�:�*�����1Q>��6x�K\�W����^@k�0h�,Gj
�Q8?�^|X�-��=�N&��9<�?t�ǽ�C����?��X���r�4���t����!<�wQ�<Gax�QQ�����t�~�N��TQbƒ�Ӑs[�ǧ�|j��%�jI����+�PIx!}��p�Ob��{f&܂=\!�����1�oY�XC�cm� lc�q}���"pG|��3X��ɰ�Go��E:���!�u�����Ez�.F��/,I+�Q0���{DlUcpl������l�ٍ���CRM��`�խ�<\w��*<Q�W@
/�q���e���/������	����jC
Rt:+�Β�&t�ѕ�*��R�Y�7��@=I���� �r#F��n����ђ�&���j��?��O�:�����荽B�x�7�
�d�ƨm�P���cz��w�uvc�_�x��TOo�0*ڦ�1.=�7�Zڪ��D�"4��v��NN�ǎlw[��\�9#�v�/�W��NҖ͗��ߟ�<�/��m�5�p�d<�`�%���X* ��+*|�	�"��OR��@��:7���c!��^לsb�(�`C8���I9�k�z!�8�"Bc�a���K�P�2Y�Y	W�7$�8���D)L#��j<�i&F��˛U~���J5�f�C�M�P=�gD��D]g�]K�&Em�We���3{Ό�q�lcR��C�Ӓ))
�� ��ϣ�S� *��`��~7�w�s����a�3� �;�o^��wL�̬z��''��!�!�:���㠿�����8�k�)N�^H3�ϥ�x�sZ���V�޲S�y�H����%;�F��jv��d�t5}^�����N#�(EV�->���!%��T��f�R�,Y���!��-�L4A���@
����d6�ђS��dތ�D$K�Р	Y'5i�HP�e|�c:�K��69�x�A*�X�\�YǛP,E۵�E}����ds���d�?��O�Э/5RuˉN�{G�����W���&��N���Q�����y�F�ͺK9m��|Bt����:,����[1u2w����U���Px�K�����d�F�Ų:z?� ];�/H� �xR���2���;
�&� lW�o�T��~Tk��/c(ː�݄h<�BC֠ ��[x����iC�H�F.�<<�������֣g��W��(x����iB�Ȫ	�V��r�*��ny��_��Ċ�
��x�31��̜�b�F�I+�^�s���O�Kw�m�v040075U�����Id�`��R���b�ac%w�[�������_x�3��������QsO�YۉI�w�쪑�G1��b��z&���4!X��Z��x�31���ܜĒ���b��#�F=��x=2X��Rń�N����x�31��T�7'��v�J��~����^l���	x340031Qp,(��LN,����+�(`H]�^ݸv�aO���'�&	gf�01���ļ�bٗ�o%0p�0'��X��Qᕟ����`.�����Ox��{���u����v����ܜ̼�Ԣb�K&��?
��7Q?��+�"�L�:���x����9�t�����I�|���i�MF��-�e��Sx�uT�OG�B���1^�|4���` ��Rc�����H�[��=��3fgp/���JU�S�%=���b��KOU=��z�:�a;��J����>��י���o]�.��n���JgYQ��^K4[€�O[�;�TE��#��ƅ��PR>;C�1☠��y�0�L07��wC�V�<�I�R^C��u�׏z�IO�w�<��Ї�f���
�6���ֽ�m��^��w�Q}Բk8��i�Z4�Y296�/u^�}m��m�BF�p�da'Ht�\`�	��&�Z�ar7��(���ي)-�k�qMք�"��A�az�-*��l[�y�&��k��Y��.��6��I—e!�Ӳz^D�N�q�d�:�#�h��Z�Kgȅ`GM�"nZ������X�S�";�3+ox��^�'��n��:�‰7��}�`�zD�'M�_��;?�:��_GRR���%�Df�]�Hx~�C�	:`6+�c)5y�u�
�{��b	�s8<�(�*��*8�ZJ���~D[���,�A^���TQ�p�E&�0)�b.�E���(�B��P���nj5,s��(g^l�}�}�@^�A���N,#���#��`=R���3�P���cd6�)�B.�\F�֒]�B�԰�f�3��!)[���14m�lK%��ƃ�?\������v.���_!�<(�&n���J�d������
��|7d*�z�������aqk���ԛ1Lޏ�κ�<H>ô�l�r�*qag�69$�-�6n�,Z@+=(��
��Z\�$��j/|=U
0��CS���O�TM[v��I�������$�ו�K}j��<��5��j�n�r�,��!��>1��H�Lll�
��'�[p{�>!��&��$5ؙg�+��Įͳ{�j�?���3�sf�I����k����֪�B[;˳��>�PbVe}�	R��-��=�[�����_:3��H����L��V%�3&��}��6��Җ��Q���4�RI��NBU�lQ����x�6����S䩧V5����e�
_�!�i�gM�3��ഷ�A|0����*����j��7�Fx���4�iB�ȗ�ŷ$Ģ4�?�>r0{��,~bz��W�6S�-x���4�iB���X��ཬ�|Ⱥ�����Gkb�J�
z���vx�k������#40000 Iterator��zy���V���2?�d��;=����S�^^7I�C�F��100644 Uninstall.php��ӧ@�Ê׊��s��4�v&�-J�{x�������V?�זq��i��^k�/�x����3��"��nx����JQ�"c�	!-��M2R���"C��!�ʫ�w��̽���6���.ڷ|�|�^�u���8��}��_�z��+:Ǧ|���P*�H1����Pt1�S��Sh��Gd��z�ys�긷w�����fA��-�Z���#��3N|�Q� �A^-����njj�ԷY;��3BN=��
wE��S?�\�wb(�ڛ��O����GMN�K���(���y�+V��G.z�p���f9΢��|��oh���ɿf����SA	��V�qm�u��@�2&d���z�%]�ew���$��?�����x�340031Q�,I-J,�/�+�(`��>>�~�_��_�#<��w�,�Y���x��V�oEWJ��HE���C'���i�FH1��6��:JJDUG��8��ugf�nU�+�h��@�!���qB���x�]��v��7��~��|��O���~v��\m�!�>#�/��Ͻ�a�V�=���j����v���Ḷ�`�����Ӷ$j;SP��K%�s<�1t�m{�?A�X*��.r�s�
8v8vQ�z�F��uT
y'�;>�l�^[;�޿Y=ع{ϺS�{s������@զ��f%m^߃W���t�9q�5�B��]܁|���!lx������p�	Q|L���l�̈�,E6P�դf�\��|"�kkZ=P�9�P�D�<y��b�BF:�~�V�irCZ*D��+!m���y���b���mϫ��C��E�s1-�~���X����#��_�o�/,����S�-–7�xS��Y�8�0^OJ��ձy4]B}����e����mY�i��+	,��l\�?���&�z��`�gf^m�N�^Ј`g��iu�&����'�_��AH(���̜B�lj	��o_�� �rVj&Z_G���"^��HJ$�Ej�4$M�������PA�E
7���Tj�z	��[�iU�����ُ2��	�4?��h�f��t��u��_|�ywB�^�.4�rr�Q;��<�}�1=�FJ���0|�b�L�">�O�~>�:&>�g��Q�\"��k�"�"���M~��u�ĕ��WXA�<�G
H�������b	
��n�������U�Sf\��1=i6m��T�h֑�!�]Jh6�
Z�i&���
4��),h�Ԓ=@;��~��~�C	�rr
�i�3-����4Ē�Y)m@*'��ϋ���9�'�ST�U��Y*$�{+KK��%����t�$���FǦv;I-��bƉo�&�I���r�Y"����G
��jm%5P�&<�o���?������u�=�	\\4M�AG�-R@eh�N�����xF��h��Q�px�V����W�?]y#��Q�<z�N灝V��U�%�1��1��\�������<��޳���Q�L�bf��Q>�S�����[v��D�7�[�C���h�d�2���sW��Aw�.�̑�R�SF��Գ��>=���*i{��m#=�ZE���ЭF�D��
��3�அo�CR�v͑�0+�:$\m�l��K_pr�[|���TJ��8��p� ��rͪ:$��ly�/i�^�
�lx�{��^w���q�
�3�����fv�l��%�%�����QP��.rIO���l)�=y���ɕ<��+�f����5��4���� 3M&�k��Z�Z��_�YR��9�W�L.W^�Y����1�CX�I�z�C.�͗���
�8���jx�[���q��H�ꈄ�˔$��,3�h�>��m��pO���x�340031Q����.�M��-��K�+)�+�(`�jvN�-���KӜ��n9���������;x�;�|�yB�c�u������&�����'�ubE|}��l�\!�_W��~U�p8�H���2����
����Ǒ
�NlP340031QH��-�/N-��*��c��{��|���E������I6�GW����ͰΗ�#�!Sz����}Y��:�|?9�1L����3g��G��w�~Zֶ	�Ob�X��_x��TOk�@GdE
��xxP��j��Jo�Pp�Z,��3M&��Nf��d�{�E��~��������Lbwk�S&����{o~>�����崖���g�X���=h������z��
؁�8�1Z�օ�,c*��p)�O߽]��p����U���Uu��smq�`ƍZY�	�,ז
�\��K��cR��4�!NK�b��&�@TX�3�qf\���0tz�~ZJ=o�aKiŷ�i�.SQ
Q��hJ�ycz�ag��c7�1�5�c�:d��)�!�����֙dU�pdX���L�JE�E�[���FF��A��d���~#َE�pCH5�u��\a������6t���(�A�f�z:��0���$"���DL
����zY>zz��h�&��/o�_��%_B�gl8J8mm]Yͱ���lr|G�Y�����������
��jr'5��c�y�u5��hDrf��M,!��rS9����&2��*��n4?0O��X��2����xc~A�	�.fyƍH@�Gx�_��4���/R�-ί"�#�
0�"����繒�C��i�O^u��.Ib�d���q�B���� �U��;k�M�vibpVk��ǧ0�:W0g4~zJ�U#��	z�[a|Va�
�O�6���ֲ�^KԔ:��M[)��X�Z�^wB>�ﴔ�b�G��
xq75G�C(,~K���z�b�ח~<\�[�'kݴ<o�������7�F�b��gx����FcC
���������������&����[fEj���BhAJbI�BAbFI�Bf�d}a1_
eSsl����ssK��s���s��R��RҊsS�󋲁f�$��+���\˜"�<+�~x�{��YsC
���������������&����[fEj���BpfI�sQjbI�Br~nnb^�BZbfN�B~�������������B[���Wx�۬�KsC
����������������&����[fEj����W~~nN�����Bf^qIbNNbIf~�BjQQ~����)H��RF;ab�>�x�31���ܜĒ���b�/￾W0��>�]�}]�O=��)���x�31��T��1�RG����z���~f]�
*�	x�340031Qp,(��LN,����+�(`X||A��3���7��Q^{�A�2�����ss�Rα�N�e���Y�z��8��[��h�
���ܜD���~�(��s�����{@W��d�e�3dM��濮|�e�	�քw�6�8���x���8�qB���mNW>����:+�ag�j��i�(C�(x�2����:Y�#m���&O"�+݄ć�M2���l���}T�7ip�>e��n���@x���8�q��H���-v��[~�|t�4���j������*x�����a���C~�$%�6����+h��8�,x���8�q��HӬ�.1�6��bȳ;*�Kz)ˤ��n�#��*x����Z��̛�&��Q[�ԟwv�֒�n%�m�,x���8�q���u�I� ���~'4v�N����D����g��x�uT�oE���n�k;�L׏�q���8P�PY��&�R�E��ۓ�g��qs�$��WR.���k/�\z�.��	�>l7 V��o�c~�k_�����tq�����_0f��K�r�ݜo��k�V[�pw詿Dm���P��S���dW�q�����HB>�#�Qb������0�ߊ3'���B���֎\�I8R^Eޕ
—7���	W�w��?����F���M�T����m��^�W��q}Զ�8�ɪ��R4�Q68��/eQ�-��l�z�p�lb;Hd�\`�	�����a�7�(���%Y�5h�q]r�ɉ|�i����H�> ��-�$��Ρp�z�ٮ�d��V�`g�dI�ra�f��Y�����;���H�m9�8�(ɀ^�-�ulTq�"�)?V��ΨɌ��`7�͉� �v�i���i�qa�q�}�d���+U��_�ߍ���|}���ƒR��̍$jDR�_�ph~ւ��`&#ݣI%q��'�M���
�q�s44a+���ª8�XJ���~Dۦ	��<�B^��Mj(M8�"�h��0�����L�a�P@�cƚ��,�r�Q�L��r�s�,� ��^��h��Qy���F�0ϑk���!��h�LR1��\���=�Bo9�X��i;���TLC��

�2:R	�㱀���k�hxƲ����9�Ub�aqb�MVN'Z�h�R+wV6���)�PMe�����v���}���u3o�0� f'�4� ��*�����]��Jl�H~�rv�c3h	����d���*��E�+��m��W�imZ��.��>��jY�µt�6׽8�G��e2�,\j3ý	�ޮQ�d\���l'��2�����M
g�$a.:1�~��[p}�6%g�&j��5���gť�tWb�ٻH-}��|��i�9��4LŒ�zl�Ӆ�Z������e�/��Y��e�T�;�+��GO�ԥ�\R�c��*8�3iy1g8S�����E�Ӻ��j�si˳�ԩZ�-إ��'a'���eB���mx�+/��,�}�β	�^5̙i���U�]��U����'x�5�������X'������+�v�ۓ_��7����P��0�`�LL�>�Ex��d�d��!"��4�=G/�uղZ)��e]��6��2������cx�;��y�S�����e�Eř�y
�����&[�
HCE���@QjIiQ��2����/��URb�v�	�\�e����Tx�[���q���`�Q�G�n�(���d�*ZM��]
�h	����x�i�����d+�����V��M�[�;ٹ�/�x42g�ߎ���֧��c��(�*[�40000 binw8�Y6���qSN�2��8���~Y��a��U��$k������<�H5-�
��Lx�%�A
�0E�V��
�T!��q'��-��D�LHFq��)<�7Ѵ������3U��m�t�iDݭ&���1h@��2G)��c�N�2;ƍN�%h�^S����n��)X�#�:�ȎB.�����!4c�`�p�hU2��{Tl��\}�?��7��1��xx�URMkA%Dr�R�03�qEpD�ŏ�B`z�kwZz���]�b.=�G<������`M�.⩻�W��{]ߏ~]��|�����RU�C;L�P��0�4,�o�E���A�$7S#7/����c��	����g����H�.<�e�]�F��)��_"LIkZ�J�2��k�z�
V�P1Ά����xx���|j*�g�2sIU$�h��~��8��ޠ=��t-.���d��2{���h�t��.&�����Q���:.�� (,�`pNyߒ�p��$y���K l�߽�p��§�ӷc$q*��eSs^�X�uF�a$�¹Y�u�9�!�BV�䐭oid|�\s���f�����߁���,P�˅�3ۘv�ѵO���/PHh3>�T4�ay3t�����0�$�Q�H;
O�]woYAƑƬqܖ����k�o�"^#1�Ưv����1��-���RK�)a�?�o�M`ȃ(
�=ԍ���w f����W	^W+LQ����5	y�x�31��̜�b������~�X��l���T�]��Ն榦
Y���9��sS�6�\�9l����|��{��[�x�31���ܜĒ���b�����\q;���՜zsɥ'��e�x�31��T��s�kW��s�na#�~#o�����	x340031Qp,(��LN,����+�(`H]�^ݸv�aO���'�&	gf�01���ļ�bS��߄u��
7ۼI�p�/D�W~~nN"Cl������Y[�� �^�,o�R����ܜ̼�Ԣb�K&��?
��7Q?��+�"��y;���x�����-ьƳr�R��2���Z#�+h�S�e��[x�uT�oE���n�k;4$�:[4NҒ���@�C��6)�"Ek{lO��qv�M̅�P�'����N�.\"ĝ�	�~�n@���o��ޛ�-���[�O����Fw%��ڢ��zܢ��d���bl��ܸ�bD����~�8&��(>C�9L7�̍�㽐����#�AjtW*�ȿt� |i���{R��Y��\���0+
llXش���}o.��Ǹ"���{��]��\^���ה�)̲ɱ)Z��d��o�
%�Ͳ�� ��s�)'����P���0ާ�Ve+f�L|���uYv�����E�I��Ȼ�V�ml�繛���yl�넺,—�\�&I_��P.L��{!;���-�Ďz�5Ro�.��%2J�e���*.Z’�%�%vF-fV_񐉽pO�	����g
ƅ/��}�d�D�U���߻ߎ��:}�����R��͍�5"3^��B42�haX���0����sF�E��#������x��L8ʣ*��*κ�R�h�C�ѶeA!2o'�P�<"5�%�c�՛&%5��Һ�p���_*Q昱�e.U���K-��0�͂�˱h�؉�a,�wT�*�G��y�*
��V�"SȥX���՚�3)��Ao�<�0���eʺCӶ͎T��x"���"��l�����Ub˃�l�ƨ[���[�h,gV�lx��)[P��ѣ�w��v�K[�nG��f^�a�A�NΝ��*��s�y�̅�����ڸish��C��T�Cw��=I�{��c�7��@��hi���𡓪e�ײ�����~�6�d���p�����F�q5�k�CΕ%�?��M
�<�0�qG?j�-8��H���u�ĆN�&v�Y�JpG�+�k��]����O�a�뜃ym�i��zb���Z�^�`�bg�rև�̪��2A*�͵��ѣ�r�2��+Bg&ɝ������7���,�D Ӳob��A�\��<"u*W�֗SN+�I�I*�r�ѩx31���T��a//f�����]������W��U1˻$�$&%�2���ejֲ�~��\��3�w�B��V���g��1t^�HL<7�o�w���mW{W�܆�q��KI-b�z���lG6��)=�e~q}9��y�~?�j��n(���g�������%���=w��k�K�-s��۬mh``fb�\������W�Q���ҙ؏!��iy���.�$5�(��*��ynw��*Vuh����RP��R�@�)�t�z��͵[��h?�֣r������2�K�-Z'sM��-;�r��f��΋h��Bx�L�����S	�d���5���_��K�w�gM�
-+����*LJ�rl�O�Ǔ4�E�'���Ձ���wZ�u� ��
x�340031QpL*.)JL.qNL�H�+�(`��BzN���-���Gn_z:?��!D�sNjbX��ɏ��p=:�w��{qs�W+�"��������b��S	e'>����is���3����*
(-J�X�Q�<��|����М��S��_�lD߫x340031QpL*.)JL.qI,ILJ,N�+�(`Л/��~��׾3�2�N�>Y�%��ޥ(��悇���u�\���|`��Ͽ+P5�y�%�99`eN�C/���;7�s��D��7�2/���x��.�]~�F�ɶ̲��Y97_gQ�[uk�1��~x��Q�o1��Fj�$�˵��M]Nj"Q@	AH�СQA��8��g������'�1� �@:V��L,,�
���Q<ؖ��{��Q��ʛE�]"����5
��<@G����:�}F$�L4/��6���M鲚���_�俋F0�����fBbA�?J4���*ܘq��;c���Q{�2��~B�bQ�yux��S�����B��M�d���xw��踞��]
��*�uWR�j\�.�t�elEt� ǩ�݀�T��J����ժ����E=��A��t�L;�y<����p���2�-��
�$�]q���XM�?g��ӌ�G�������FG�D�u	�ѰZ��,�PJ<��5�1�v�A��XSs�r�H4g\�tlc�.�e7
R��-V�����z���6����E�G���fW��&JJKI�U��oTu'�ye�'�0ʦ਑�����l.�:��%�&�K�����C=x���kƄ��*<1͸r��sl2��w[Pї���t:�|Cm�1%�Q�x340031QpL*.)JL.q�(I�+����+�(`0u�{�<��tU���	V�O�B4�d'&夂�Դ<(=vD�[F����>KC���UU.^����������R�H�U�W\���6�뉻*��d��F��z��/������2��F�-P]�uҹ�'V^��i���4(5=��$�ld���m�5s��{Q�w�z�Im(T]penNf^6X�֝����e��?6�־��ƺ!�,4/ɉ�f_^���p��>Ѯ�]r&_���k��x�^������h��vO�ް��1dQ�����+#40000 Iterator��zy���V���2?�d��;Z/�����A�����Ц�)5z,e�I��'x��S�NA
�І�_�\��i�ljc
5��Eh��e�;ێ�ά;�`cL�#���
4}�/�70�ζ�쯝�{�9�ܳǹ/��� VL�Aw(xL��FPݑ^nق3O���^�<�W*�zcݪ�k]vM������ԕq�B1)�ȣ���)�s)N��!g=�h�X1p�@9��BLၖV���b-ĸ��.��T`�S.�q�� �P��鲕�Ra—�7�FD!�Q��J+���v|)[$��R�e5�!!Q;�Р:2��"�3�i�A��B�b��c�l���2���Ԩ=����:6�GYE�z�22F�2
R߀�d������@D}<
����\F8x�M��o懎֡*�Jx���2j�̺<,�G��s��lA�4rV�������dz�#�.fu�pq����S[ݰ_��ͭZ��E�%?&���'��m&\{���,�ta��6�;4jI\O7����H��C����;����m������יk���l�ULc�ZṮY��p�������\��Hne�Ԙ��e�b���d!;o�rQ,&av��:�i�B8�	��iq��<nc�ObT�� o����8s}e�05��mM��3��'/DIy[0�Yc
��6y{��4
^HyD�c&���F�'���n�W�����[x�uQ1N�0,�Ay͖T��<Y'Q Q �� ��/�K�s������<�����H�!+��gv�o�_�EQ��K����}��-��(�Z�����.B�U 5R�`#	o����Ġ7�q�2� �&���sc�Ir�T�AfKA0J$A�kn0�L��<	����Љ��A�"y[��m+r��N1AUG���Y�8l��g��a��(��a�$���H�)��g�T��+562x&' <��n����1�x��	�,'���a˭+U6��������7�=���x�340031Q��KI��+�(`x��������uJ
��_䗺�1�(
(-JO+R�����۰��5���I��-�x�340031Q��+.I���+�(`8�*Y)�ZQ�q��]��l�l��B��d�8B��zڊo���J���ތY���
U���d^�H�je����,�ֻ�Q�9k���*��B��<x��S͊A&��@X<y�X�$�3�φEY#Fc`aA:=5�v{���ds��
:�}ѣ���z�z2�	A�a���������Ow>C��P�Jh|/5��N6Vpb�=A��{�^����k]g
���I	y���4��֙dp����NY��p�eL���t��
`��B�	H��°.��a��9�:˵ET
��:#�)����V0d��M�uaŖz(ș�~'m}A����RaW��TŊ3K�Ѕ'˲\�Q؂�硨���J��Z��r�	��0E��R�&��*�5��1���(V�����H���0EcB~�
S<�1��Nz5�Udc��-��^�I��3�Fm!�R��z?>\yՔ�Q���C�b-0�qЇR�;�ij\�Ԋ�
B�y�]e�10WŖ�ʳ�3)R"K��agju{#H�ˣn7>_6Dn0in�%�z��.���Aj�&�먳�6�{�|L巽���N�ժ�n��*/�C3�FѨ��l0�?��,�om������|���ۭ��~�>L��xx�[���!h;#��}�������D�h����)x�;�{�w�-����¹ЁzAbrvbz����g^Ai�cQzinj^��U�k`�g������V|�����=�Q���x340031QpL*.)JL.	�,I�+�(`��^��"�0é�%ß�wS�/�r���9#59�3�l��Zg�w_�ݧuG����;7iÔ��e��A̋X*����[E�\���+LaQj"��_�,/��X�ϟZ��"*W=S��%5'���v�Ә�|i��y�D�y��|膫*�ɯ;��iv�f�,�vu��9�V4�T����'����]��y���tF�߿���oٳyPu�y�%�99`e��~�6�{��0����ySk��@���g�B��Nݳ֙3ΰXI/�68�ͭ�,�Ď���.x�L��������,^�b�+$�pA���:��`�S/â)��@�_�W]q1�7�8�,�\=P�Y���3&}!�o�z�#����\x��T�kA�&H��M�j��Э����("Ė�Ճ�����$Y�;��Φ)��an�/^,�=��=	�GO��N�6�6K ��{�޷�}����Z�k��S��i���
B<����^'�N8���8@	���v�Ǚ�	P1P��a_!lZ��'��v���*�䙿,61�5�sR�� e�*Y%�a{�6v�ԛ�*v|RL��{�xh�B�*M���_5*�9��7b��R�
�l����}�N3Z�k'��>c�����<��0�8�ڄ�������K���vb��㨋��-$,lFm�mG~K|��1�0Wwв��Z�5Q�눵y�rs�9��{�Qx����l��]�,�@~� �[��p.53�[������‰8m#u06��!����B�V���x��j%��le�R0��N���<0!�dFO�G�
r"=!��&�6��`����������GJ�(L��+��*d-�z��Y���B�=S�����hl�Bu}���B�ȡѱm�������R�6Ъ�9`�o���ϥ�WCA(v�����;p��^�����nlWN��#+������,_f���`\%1u��3j|��{*�*o��~:r��սa+D���w��J-�����- һ�w��٧L�v���9v�
�hc8��rq��3]j�T��(kb�i$F�>0�1.��AH��|d�Q��k�̔I17��5!�&��C��$L�7�s��Ҧ�u	(o\UH�8�3�����T�*J� ���G����ۻ+Q�)w��,~d{R{�Bᑎ��NS.b����䞵W��1���	�:��r��6��Kד�CV�Š�f��=,Ԭ���^_���Y���!�k���Lm��ꔸ����x��V�oEV�&M�J�Z�ʤ�X��z�҆�)�ڂhՆRD �w����̬S�?̝C��Tq@�ơ��?�����'� ���G�P��3��{�}�{o�L�r�ۅ��O�=�~-�D��'�Xt��Œ1*�ϱP0J����~K\����Y^�3!K��Q,:�	��ے��@�jEH�=�n�q����3��^To���ȇjr�j;$[�G$ ^T嬁�DZ��v�B=��"��@h�[^^~���C^Bzx+�u$�A�D��I�XX@<�,���U���X;s��"U�`���Z0��P
�)%~�RT�MP\��K�ex"�\q���[[[n��@�b׬��u�'�^��$���>c1�p�(�!� j��MDԳ��а�$Q,���I�RBN>@��%��F��h��B>��Me�0�E*HT!ΘD���D�o �n��"����_+�+����`�����3�j�n��#/
��4&�hY�Wg��1nvnD@�RӨP�N��h5�B�O�j̻"�hT�]Z<�ʎ��-�,��E�����(I&-F�����J�?}��p�I�"th�ՠAx3Q�=�l�[E�	$�nC��v�Y��(�^Twǖ�r1�h�*��P�&A�7<��)IA�������v"XCc�8�x9�4�?�uH����x]�ȉ��s���qam�
�[&�f�e�)�c�:���h `>@,v��������F��١�G�r�=A��,:�pf-�W�4ȫoƎ�����BL���W��'{�ڵ���d]�Yûc�QA/I�h����Z��-���B�{�W�j�Pb���g\"=Gث��.8M�]Ԑ)�M��������kL����%�o��nت^2��&6�)�^�����V��m|
�:����~*DOk�OF���h$��da5��<�.>�0��_��Y�S�L+���:*�� �b�Ԉ��9;m;��NS�����du��u���m��a_=�8�~80��N�Xhd��m����0��*dF�?f�������Y59>�v�:6B�
��#�[�3���& j�9n��>��N�P��zց�����6�-q�:fZ��rïlD�T�۝-G7Hw�7��2�=�?-�\�X��������%3Aw��Hi��*���z+7o@����!	�zn��mDZQ���Yr��#��D{>��>����d �9̵ͬ�ET7�	4�]�7��q��s�Ϫ.��0��e�s����ȗԓ�7Tk�z6;3�Q�ɳ#�D5;e���,����f�ӣ���x�"V?�t�?߀+^p���lU6E�� @����&��4=���n�1�/���!7b�<���g_���)��hV�Ck�E=�2�[��K�[E�{s,;�>-����5ҋx����N	L�k2�g�u�[AzM��A$��ݩ� Bf2�^$�Ëk���i'��8���9���G����o���V
8���u�\���Z��Rx��TMo�@UZ�)�QڂZ��U�m.H�Q�B#�HH4*(A�6�$�7쮓F�ʅǽ��p����X��
E�w��ٙ7o��/�߿K��s[�)E��W�I�g7�� ׬�G��a�5����$���f#Ơ�m�1�#�]S.#dE�'^O����<�:�0����i��jf���#�>Fm��!�b�\�j\U`��Y% ��:�����ڶ(��
�VD��z}v�7-f��pɢ��	�j�o9�q���?����2��RB=L��̉_�%�8���1N[�i
�kSӳ}GTƪ�Eu���pS��5�`E�"h���Ɩ��x�(��G)v�ݕ}�2�ۃn�k�
���֡xH(�1U�������#ɔ3�p��I0�p9]��Q�_L���+3'��;�����{9?R�G��N�Oo�54
���-�j�-����*6}��G]qcj�L�9�a&vf.���
������T��~i�z�����e �H�R4y4�鲗�a���Y�U�ڢ�n�����n�ich�:�՚�ŏB,v��rv��i#�ò�q�b�\�]��
vZ\�:H0�b��@�g�a��+��d��E��R����@3��%)�6j�g��j>t��h�S����SWSc�7ȭ�\����Q
D%��6� ��i�sP�B���N�kYyd=]�L�ޓ�ʱr��^zʩ���ex�uU�SW,	�`�-0�dbw�$�#EE�Z�E�t����du�/�B����e�������S�mgz��y�zlg�}�	,��l������3����m��ɿ#�˶dm6�6��Ϋ�!9w��ww=�U�-��b���6{�g`[�)mg6�C���Í"�M�ܢ�ySHϰ��}����b�g���o�c�N6��8q��#y\�\Şh�p���S�dv���TD
d�A��`�,t���9��ɣ��6z)yLT�Q�}���w�Ց۰@瞏�bbE(�`V���3��q�u�6�H湆$>�dKP'–���r��r��A���^��l��Kܫ��٬�>�2�k�:�����Y�Հ���1���J�=#�\��ţ]}�Q�dp>ߏow
�fڼ�v�d�x�R�y�i^���Tw�mǍ.�l���f�F�p�s�������C#��L�q`ҲbS$ke&W����1�w�2��K�'�iO������m�gr��O�X�>N(�+i[\o����T����&q�Z�24t����,�?t�/�<Z��L
f@��f��
P�z�m�B
}(��+Ұ,&DNnJ��KL�[�վ�=�:��Q�xp"�G�x�:�<�]!UM��������\�xݕz�ᦞz%��Xj.][<�������J&C]��	|�S�Z��`78.��r	�Z�[�8�ZOj�����'�1�Y��`&O��'�%��÷��(�ֆ7#�}s�ө��<И:�ŀRo^iE�V�a�
P��q�}^æ�PkX3���Ǿˀ���4�NP�Q7[��L�64M	�Pk�Ϛb���|�����on�r�W�Կ���꽖S�!w�~?%;�{���nﭡF��?a�.��`����3�jj�Ua��.P���m)e�\7C�ad����[z�`�R�k�+8�.��\��b�v�J���d��t���-so1(1#d�R�E���u����4���5��WfIR*$��j�J�>��"9r��_�zq��-|zr��֒�@�>Zփ��r_MU�I[4��;M�?.�溥�?
v ⧡�u�`�!G� xݳ���0$�)����_F���;�-�I�,<O��!��zYͰ_�l�4<��ڞ�=H�.���J2y%��_G�ŧ���7���	B�n�:^�x�`�^D6��E۳KՊ���}��7y6�LG5��؛s&})����|Ϯ��T�E�E}�.��c����ŋLa_�nq�5p�fxF��^R�]��dݣ�O+�[x;rd�u��_�ޱa��C;1�?Nw���� h�r��צ��b��N��><}_NuDh�S�5)�Wg��<�=�v����Kx�e�=KA�Y$_'	��B���%��X	"�'��m̚��cwL-V���	b�N������h�)g��gx?��0�:��d��3Z�>�Ж"�aIq9���:)�I}�1gX�����1Y��1�QbeAuyd�+����s���(!Q�Q���t�a���3�6xT�s:�P_2�
�;BN�:6RU�ˌ�3�f�r��F\4�x���j>[��7Oa��1|ϔp���{�g�����I�j�g���*�WL����.�\��5���j^��nl�0��+����՜j��{�2#�7����pK�W�l��6h�[��ץ=��k�,~�<�><�~���:x��"pJp���D��1��%�����*x����$�����8�����@�bBK2s����s��B�S�R+JR�R���K��K@Fm~��èb������Wbg�XZ�_Rn����g�����<�Qd��URifNJHbQzjI@bI����,*�:
*%�źv%`����"Mk.((J-,�,J���KNU�aLr~^ZfziQbIf~�^AF�:v3��x��'ZY�<7�23ɫMR��eȡ&�����������Z�Y\R�6r�N�jP���p��*x�}U[oE��!�k�
� �8iVݵ��HN��-N�\҂�����;dwg53��bd�W��HH ��Tyk����+����ڎ�˗9��|�w_���ȋ�r��Cn�4:a��\c��F�+��`��+U8�
����
�p�-C��n:`yBD�r���;"Q8!�$�O\�s�;�1�}ŏz-%��#E	b�	
a۩�=��\.)���^�������l������@x\Ґ��N{��pD9���X��_���SC{;)6>E8 "e�B�����FJz
L�l��L���Æ	�e�p{ojWP���́&W���]#f������u�=A٦�Ч����!>��#H�#�Y'Q�Y�����n�f,�c��f!�!^R���;p/.
È��"uW����c�k�c�n�3.-ˊ+c)���La$�z���b�a$TK-3v3�]]�_�/�W��I���$Yb��X�	T>��:7�6��k��Y>w���O�pC�;I�i�k�ɪ˓��$���%�z{���Ҡ�b��<���3wς}��s��DN���u��9,�︙eg�/ܔ���Nw����=.i�r*�FL�>a�]�n$Mh���������jF<Ȫ�3�n��&~D��֙�B��c%��7&%�\�VK XO���k�MT1�|j�?Y��F5�lI)3جMD�$
._��p�_�����:S�EG �t?HN8M���gD`?�.�Iء{�ӥ�<�X�!-��5���z9q�T�N����˫�]�{�����__.e�/��A���2ӹ.<�}&�g_Ӛ��zU�j�1
� oj�
$��O�1��M���r!�x�q�K/�|��0@�p� �z��e]�!?�Р�0��EN/�������M��G��wb1ͨ�'�?��*-��x�340031Qp.JM,I�+�(`��y�^�Fb����
�&��4��
J��/���۸�QV��q��"?���Gj�\����g��-x��T�o5�
e�lE�-���h�4ٙ�Te�AQZ~�ХI{�J�dƛq���ؓ-�?���HT���P/\8p�‘C�y��M7A0{l���{����i�ڛ��>���Ri���e�H���|\[=�]��W{rT*
H��HK��Jr:9��e�����.�X۟N㴐j�O3�i4b);�4�HS�(�j|�0w�>4���]��`QA��`;�┾���e��|�u��e�͓��#��Rxoo�v	4�MG�Je��La	�%Yô�?/O�A)��zD��.���0$�6�X��8���}��Յ��h�ӶRk�4��_�t�Z����0��(�m�<۩+ގ+�#0,9�<�)V�8(v h1-�l�b+�qJLm���!�qU���4T�8�E`!����-zx2z^�C���-&ŸA����F)�Ӫ|#����[����J+���ׯ!�Esw���ԭB�5?\Y|�sL�K҅y��[T��5��#�
A�c��y:�l��{y5���YIB��΁�H�a���푮�e���HC+�B]�D�"�BJ[�u��S=�
�ͼ�mz{KG�HXᣓf!�
Ft?$h��]�G�
z��4���A�*��t
k�J>�<F�
�k� ܔo�o~^j�l�.���V�m_��ii#� ����F����:i�L�e�:D�˰7c>����V�W��<]Z2�W��}��؂S���10>���4���yO��3[����[��^��G7ͷo5�l��m�R;UF�r�d3�����E
�
��d��P��pGP��L����O-�fL)&��p��8�?���߽+���ò�?�_��&�Ծ��R����@x�3����C^�X`�v"��3�3'�|���W5%�a|��S�G�����4�{�Z-�?�d��`x��T�n1
j��Q.*S)�&QH��VA�8��{��z7����mST�?��z������&!����3�ޛ�g�׳߯��]�5��Fp�3i0
q�9d�, �
$�
o`B����)'�)���ͤf�CH4�W1�$J-��'&E1vR��^Hk���E#D���R)ԩ���⬅k���f����D)L#��j:�i&F���Ͳ�EE�R��Y�P�m�(��Q$D3�@�%y�YK�&Em�WU���3{ό�i�laR-�C�Ӓ))
4� ��ϣ�S� *��b��n��;z�9�.�q�3� :�o^�apH��,.hGG���1�>���`����m�8��)�w^H3[ϥ�x�sZ���_�𴻑N��SG2�?lׯ��5q{��s��''L���E��^a�4��Rd9��+��R"XL���ޣw.E̒�y�⨐�ъuGt�}�54P�]w�aS�z��;�v$'"�IB�6d�lդ#Acp�kV�-D���8�ir6��Y��buq
feoC��n�,���U���/�+���d�l�����lv%��~��h�7�$�Ws�⫖��ۭ���bР�nWG�WB��:���C���dݦ<햤�|BL�k���_~�컱�u�d�w���K���5x�i�����d+�����V��M�[�;ٹ�/�x42g�ߎ���֧��c��(�*[�40000 binw8�Y6���qSN�2��8���~� ��K�!>��y�&��Ж2��yx�[�����$CONTRIBUTING.md:J*㔁���l
VM���x4�j�@�J���,���'.��Y��a��U��$k������<��)��ix�K�����d7C��k+��Tz�
a2%�*��x_���L{n��ڱ@���Km�W�ߑ�}�ʛ�
�C��4#_���-�(��#��'��.x�e�MJ1���
\��T��V��� 
Ep3i�M'5��$��U�E���^�dF��*!?O�����6zG��ì��Ãq*	d���5.�ҘJ�`��~��:Y��"�	�M}�sQYg�͵kGs���h�T��/aQ��0�RO����IBL���19Y<BIn5qL�<��C;)�Y���l�,X$��
(q�岁��g�hR�x]E��9����Y6ks�M!�+b"yĽ� ���j+���	��jB�3�w�gW�8��K,��ę��JMɔ�LOcmR#���\1�;�C�ǫ��k���E�2���})G�z��TU�O�g�*JR�<w���mw�p���Œ9��'`Y(��l�}sg�ϼ�m}ll��/�Px�u��N�@�������j*.	[��"MQ��
R�`���g�z�����oP�
��
oѵ�&AM�ޝ����׏/ow^�D�
�HYh����/~�����6�k�AZ5P�,�&��(Ms-yr9v��k��+El� g����GJ�h&���
a��h!���\ƨ�F�o�.������^�{�q�`�*�	� ���0ƞ{{�ճ�-���O��At��*�a�%r���~l�N��_��oA���~��jw���p��yB�!f�&��
!v	e)j�v,���u�}�DJQ���?'��+$3NM�1b���sub<���7ꔤ�`�ܟ�N*U�q����g��0���|`#��ˢy��f�u44p�(YZ�"cy��+�7�;���䮫F����rQ���b�)��_�fw�o^D���j�t��?x��#<Sx���{9T'�`���ȩ>��_jyqNjIIj��I�ʓ�9}?�}�x�31���ܜĒ���b���Ƿnz}x��m��Ϸ�>�Jޢx�31��T�~���]d˹.lX��^�K(������	x340031Qp,(��LN,����+�(`�-*���v�D����^b/>�5����s~nnb^
�G�b�T�Iy�R�x���՟�^���9�F�o�+�,u�������m�	DApenNf^vjQ1Í�%��埆�ț��s�p�uFX�9���x���8�q���2�2�s�d��]3��g�^�D_7�OJ�e��5x�uT�oE���n�k;4$�&[4N�*�ǁ��"mR*E,��؞d=�쌛�78 �FO\I9�
.Vo\8!�p�w.�'0�a�������{o��̫�/J��Ͼ����]
���h��w��K���U^�Mv���_����ُ��g�3���V��Q|��4��v�9H��Jy��.�/o�]uO�w?>���f���M�6�T�Լ�m��^�Ww�q}ܶ�8�ͩ��R4�Y696�/eQ�m��m�F�p�la'Hl�\`�	�����ar7�(���%ي5h�q]ք�"'�A�iz�+*��Ul%�<w�����#��v�P��C�J����$�˲ʅiY}�"d��rR�N�0Z#����q!�QR!��[�8��E,)?Q��Ψ���k2��);���2����p�-�<q7��>�AU�'���w��!�N��&�籔��bs#z�ȌW�k���/Z6bc!�f�{<��ǜQgQ�Ȥ�ɫ�0��?G#��+��3��T:���G�mY����;�0��H
e�Xd�II
s��!:-�E���
�>f�i��F9��r��;�i�`��r,Ztv�aK����
��<G�1G�
�D#�ղH�r)V�2z���L
�cP�›-�8L���b��n�дm�#�p:���p9����o,۹�;8`����0��1�+g�)+��;��;�n�T�9�h{�ݣ����bi�����1L>��ɺ�<ПcZe6rN9o���3��ߖ\7m-�{}(��
��Z�'I�b�~�6v(���--x�?rR�l��Z&}�~Ïc�撌_W.�����\�(|<�&zMvȹ�$��\�_���G��#�h�G-���iSr�n¡��ԩ���<+^	�Hw%vm����2���7L�q��0�M�T"��XO�~��^�:ز�Y�����2���L�
~k}���ܺ��%���ЙIGr'm��.g�M>�*˟1ȴ�جv>��<�H���������$�$���x�Ҡx31���T��a//f�����]������W��U1˻$�$&%�2����`�<�����oV�/�\�Q�ZQ��W������!en�~ӿRG_�O����}���-3/%��a��n�/�5��L?��W���A䔦g�1�������p�Ο�7*bwDgWCg��2��J���([_!t���)�+����(����P�W�Q�pXק�A]��5wf~8���	;��c�2�K6��>ҙ�ϓ��;O��N�-���s���x�6����/.aQ!U�i��a��pJ׶�Cq�����Ro-���K��E����HA�(�Ex���4�i����`�7s�g��t(,KI��ܞ�<��_���x�����.2[���c��}�?矹��3��=�
A�4��$x����o�@�uI#�&�C�-K.i�m�I�DJB◀�*X�.ə9��wE*%bb���$vHfEL�`�������A�1�Gԡ7ا��}��ް���:��KD�ᴦ���t�/os��3�s�`��͋�ϙK�a�yS8nMQ�.����7俍~D0�����fL`N�?�5���*ܘq���fFC��{�J����I��E)���aO1/��� �̈�Ë���R��q<�»
��U�뎠X��3�m���˸�s���\P58H�ʭ�و��V%*�����faR�S����t�~X��)�R�&��� �{�q)7A�s9�}-k�%�a_�3���;����~��z$����6]�ё+��l�rj)X���78;(�Y�ydǴ���)���<X�PM������QvB#���r��?ؿ���H��&]\�owi������a頉�dIԘ2�s��38��K�3�5��a:ǵ�5_f�pYU�]&�8.�F��
�ౚ��)���DףR���¤��t[PQ���tr��
��/�����x�K������R70͒[D.�c̷gK`l�o��a����-)%@m�G��$^�I�8�,�\=P�Y���3&}!�o��R �����
x��V�oG��dQH�
�4�@Ե��
Rǡ)��
���6��
�ef���{�VB=T���JU�H=T�C��T���ofw;N���dg����������N=:���ڵ@�v=�Ă���5(��Q�v���Q�
�k��,H�z��:�dY�B���`I�#I�����T��ؓ�����J���ꯡ��_��&F�vB�J="�*g
$<��W���y�eA�yB������?�V��í@֑��!3�&�"`a�8\��RV���t=/�PU�*�/���V
b�m�BbJ����U�uW(�I��Q$��ns��j�\���fՎ�\�I�פ*	�<�,��X�<"�jA1H��,��,�44,!K� �i������ba����[��o#�Tq'��`(k�
�W�3&Q `)�Hj3��"-���_+�+����`����V��N�q��BB囘�D-+��A":�j"�ͮ���Ak*�-T���P(�V�yW��@�ǔ�q8�T]>Q<�ĝ�ݕ+P�L(Z��=k~oj������7��O2���
�[��u�g` Pf�.�O!�5X�{�Ȼ
TQ��7�������#׿�W(&��7	�(�H���MYH��E���f{�ɻ�j�(�q��٦����/���{�ե���q�=wl��WW� �eRj\Ƙ"=)������F�b�:Z?����!n���yT.�����Π����"��y���}~ t�9BP�iI�>��Թd]�vɨKֵ��<�7Z���&�j����2�
j!�Gx5��%��5��K���{ur���‹2E�E���=�ASC�?x�	�{>��d�
���z�%�/mc3�R�5	�Nn�Z����ɓo��B��d.\�F2�MV�Z̓��	O��(��}����:o�2��(��r��ˑ>�������Q����JVhN��Y�Y+����a��Yuur�B� ��l���7�x-V����QK=*Q7�̨����ܱ*/gh��i�z���0]�5Qc�q;g��]@vڅ�5�YzV�{ȳ;�n��m�ymg�u��qR
�t�� �+?�<����	h��Ģ/�/�o��.��-�}GJ�TQn�@�۹9��WIד[|n;���}޿�Β�-V/f�;s^����B2�s[�fV�f_�"����Ԯֿ���8\�9�gE�BM�2�s����ȗ�ә�T{�z>3=�Uڃ�3��D53i.���,���f�ƑC�م�~*���W|���6�l�^�A�D��E��hzNO/bZ_�Ƀn��yt��Ͼ*kSZsѬ�W��z.e���;�d���+��hvL�(����5қx�����N	Lt�d�Ϟ�b���l��H��[�A��dнH����&���n�q:I�{:ߧ��"�_�k�/������`�}�/E
k��ux�;j1�r�+�d9&	n���ܜĘВ̜��L�� ��Uf1D�$??��)�BCs�*^W��B�e�#'�ӛ�^Hnr����B�+�.����^x�}W�S[�\K���s��y֓`�,;�q��86v�3����"=��=��+>�d��U�9��c�d�U7�g�e�Ew]d�d�E�����ޓ��T�{����;��ŗ7��8Py��}l��%€������lC��ͷ7\��6��V�p�ۏ��-:���1I�l���쫉�i��M���]��P0��a�ƅg�B�N�:�)/,$��2��oX�Q�C��8��s)��q+��ų/�����]'�t$�h2hX��9a�>�1����(~}�~�y�7���C��=�
������Þe3�a6��R����.i=z��ۂy�!��i	�7��w��vV�-$tOzЕ���6��s�VQ	�T_K�k���������;;�c���"�g�~�/N����V(�zy
_��f���G�t~kҔ٪��9�#�!u�8?��#0�E����s	Ȭ��PR~R�-
ë�
k�M�"�i0��v
RK�b��|jv��۪we��LX{��P�C���a>9��M��'�)�rr�L�o����^�Y0ݎ]�Pc��֞��%X��V�u�|c�S���PټN[����U ̧p�v<_�a������VM&�׎�h�SҊP#l��zy��f�c2�~1V�7���Wv�9�g*��'��4�����������j�w�P%��N��B0�O��(:Y��G�@>j�:h�VӠ
�F�Q�SPw
��rS��8/�C��S�]�q�w=/�*�1�#.&S�t��A��$�\�������*x4v�BUtD�a��|�T��l�|{���/6l��*�!�`���l)1����l�j�#��i<���1�:�� z��03�S�����*�`�[/U�ٿ�]�o���
��w����$��J��T
Q��d�C9�9
��u�ЋO+�������(�(��4d}��[F�7V�QW�\ {�T���S��Y
�1�|��M�a������˓�Ŗ���]�a6�V����+��h���`99�f�6�9�.Q��6������TS^�{�� `4��a�ljeR���E��U���F#+��~���cɑ(���a
o�\:.��h�6L���WN��I��M0�N���RLށEA���]ٮ��S|O���b-�c@��=k1ލFR
!I��x�k��2Ů骓�>2��鿕imC�u3��|�Z+I��8U��"�s�}%u�{k$�N��Lj@I�&�d��/�`��-]�h�ݩٖ)7�N-r��]8�׏�}.�KW>�FS�K��;[[�J'�j�{�l;�mb�#��ڲz�˘,�P=L*푢�=IA5����z9�Vb�z�|)X��Z�D�>|W�+���*;�:��<��9{X��_LV1YM��X.�Y������+Si�b�8Yh�8��i{�L;��>�WV����NnБ�,����6NQ�nC��BS�k�'�Z��Ѥf#�Y�����.��/@�/�	S����5��Ӡ��yn�d�g��\4=]WaD{Ҹ�c�A��M�`��m^>;��gV�e�*R.�Mu�:��s3�y��M�Τ
?������/x�mxFKM/1L��c���p���'�864{V#)5_���Z����|�z)���Y:ZŷWfxu)�=�_���Vc�������0�Y>H��~\�Fʼn<�%mV���f^r�}��2�:��8��J���:�fe�dz��A=;]�6:�,�.|��b_Sd%_��ٞ��u�_v:��ů.Υi�kDL��qy�;df�V.�p-�&��P�g
o�V>
՚�l)?���^�-
�������c1���x�}U[o�TW��6n�����igf;$N:�M�K[&�U���&1֝:'�Y�s,����"��4		$��u��&�}�����؍s�%����o��ԟ�.n��
�E��!��<���s�g+��$�ff�u!k�0��T�&��=�o^�d��<�+��͕ͦ�&�[*���r�uz{�k�m)Wۊ"�E!Ô��v%� ;�\R<y}�S��=J}�J���h���	%؁`�:�(�s��X�/}�艞yW�����y�p
L|�9{LOI�!���C���n�6𫳦�]�JK;K*�]Ɉ��㎇`Xr��"q.{�^���*m��*�����hC�/���C�����Oo|���R첈.��QH ǻhǣ�`3"�@;g]��̝_T�R侘m�}�d��>���,����#��c4xi���'�%5��Ͱ�yM�#N?�ʒT�/��)eb�eP���3k��o���x���?dZ=R�Q�;�0��,��P7��twC���6�m��s��^�M�-��`���î+r�yM��֬��Q��ya�����]�{9��7B2��ҵ%]��$��9�uU�*%R�K��L���ܜ5��kWv�"��Ì3�ȷ��������AT���2�X˟KT��T;����VU�l�.l����Μ�኿�O��>(��N���Ю߿�
�r����R3�yĜ^��F�V:C�l8���m��c�U텲r��:]#N�|}����'�19�>�h@)�)��;�h9��_-F�Uc�/ꂛ��-XG�A��P�
i��7Dnv���h� Ą�L�#���$�J�Lt�j�
�]��]�R�ظ��%�ruL.6ē Q�"%���1�۩�����h<j�a�
qct}�v��O�뙡��߱���5�f~N�2���'�[�Y��̖��~}�+Øm��発'�U�%�vR|�]_i��?�Ü.b\�`�Ȩ��R��|�rSO�3��:3>����C&s�����{T
L ���w�LefmF�ی��H2.�K-��m�D��I��x4~+*HnbR@�o��;�i�6/�A/p�6�� t��X��X��
䔈J�����X�b\
[l�Bw�;c����m�i���R�!��Ɗ&�}/~���	����>T#W3T��?Y�E�br�1U�u��dz��.�J��J\�v&��e1���x�340031Qp.JM,I�+�(`h�y$��;���uIOf�~�ڒmQ���_Qe�q���f���E~*w
��>�k}&�e��bx��TMo;U�h*>$|�ꦊ:3�̴P4mQ)�O�G-l�T�3N��cc�)Կ�	���x?�
,ذd��-ߵ����fc��{�9�^���g�T�܋�o�ƽDH��P>�$�4�q�;���.�뭔p]/��jI��P	�$��R0�;�X��4פ��H��Zi���Z㮢�V*E,��r*dSK�*=)�;C�œC��T��'mX��(!g`��2�X�:�(�U3�+��x�:+	�++u0K��?d"Z,F%R%�IL��s
��Y*�T]�����ԅ)����]����J�0���8|�ؕ�,/߂�ȑ� Q�~��V��u���j��d�J��e+�:'1D$o�&��]Mʈ�ÇODEA�q"���$��}�EH�`g�,���
&��E���5�o=�	��}m���&�9y�"RI�k���Y�<���q��S��k�JR�I�By�RՅu�ng�
�:�K�x?Ơf�~h\�:�Vi�8	l��8sj%��9r�����b��Hp����A�p��XD�ʨ\C��0u�T��S��
s����"�ȠM�[j`W�r�Xb��j" I3D'�P1N���a�㒇:�	�Mp�;�׷���+o�l�v6Zv�G��&�'���kd���.���e�Bd�k���l ϳ��ؘ��94?��
>�%إξ�m��q��/A�q++�^����4�>3�&���[WW�]�/ϗ�L��Y������s�e��\�1/��%pl@�M1��kC�c��mNR����;>���R))_���ը������)}���XF�����֑w���2M���bx�3����C^�X`�v"��3�3'�|���W5�`���P��jdձ̹
�l=�ͣx�31��̜�b������~�X��l���T�]��Ն榦
Y���9���%Vp�J��
~��q�Â���3G���x����2�kI~~N��;�<zҦx�31���ܜĒ���b�{���ޫ��4-�@���T�-}-�x�31��T�G����k�.���>~��Oֹ7�	x�340031Qp,(��LN,����+�(`x�Re[�ָ5g��9�4��E�M�@�9?771/���B+����#��#��_�n��Qᕟ����p@ubЯ�x�<��C�}�~����ܜ̼�Ԣb�b'��~�^|sz���Kj����e|=���x����9�f��$�<��ou��䘘�MFۛ��f��fx�uT�oEצ���8��v>hH2M\4N�*�ǁd��6)��.��؞d=�쌛�78 �FO\I�p����'ā.��	�~�n@���o��ޛ�5�ڋ��A��g���W.�(�X[^�(��k�V[po�i�D���PUQ4x1:�Uo^(�_'�;�#�	* �ϐgS��s��x/�i`q��s���+�5�_I� |i���|���!�
}0�iV�ش�i�K�M��&\앏qEp��Gm��3ٜ_�o�ES�e�c�R�W�f-�f>d	7�v�D����0jl��
@&w���[]����ұ�v�eM�-r|t��'����ZŶQ��s7�\+=��j�	uY>���٠8L�,�\���: Bv��+'%�Ďx�5Ro�.�a�54��e����.ZĒ�cu^5��Z̬��!{ឰL{)O�'�|��q�=��W�?j�u�	�u�.:?���t�Nֈ�x5�
�����`#:t�lV��Rj�3�,
|��4y
���Hx�QUq�UqƵ�JG;$���-��9x'���`��P�p�E&�4)�a.�6D���(�B��P���nj5-�=/KF9��R�m>��3`B�r4zdvb!M������G�1G�
�D#�ղH�r3��2r���zg���7`�q��OJ�2e�i�fG*�t,��rlU
�X�tywp�\�*��ia6qc�-V�$[�h,�W�lz��)�PM���{���nK�n[��_�a�A�N��A�9�Uf#��v�;3��!�m��q�f�"�߇�� ���d-�@�ǀo��J��h�{�?��Iղe�k��n�q?�q�K2~]9�ԧo�6�F��1-�k�CΕ%�����O��z$a66>�~��m8��
H��;v��f��M�̳��tWb��ٻH-s۟|���9s�L�Sn����'��z��-���Y�Y^(3�������W�G��ȭK{\�ȯ��Tp$w�Z�r������#�L˾��j�si�s�ԩ\Z_�wZ�$&`'�*�?�d�x�31���T��%�Y��%���6Ezk�ꎘ�&`y�ĒĤ��T�l�Ƹ
���:�Z?ݨ����ĵ�$5�83?����gVu�K���mS�W��8Q㖙��Z�p���~%���K_��b	aP�9r�  �4=3�ὓ�i�ܖ*�.���Fy�Ag��2L>x?%|u�!Q�������040031QK-��X� ��A���,f��_/���ӖE��c�2�KL�?�0�3�+͓���#є�m�k���x�6����/�4=Ü1��D������/�đCq�cD#��\N<M�Nx;�����H����x�340031Q��+.I���+�(``:�}/��{��'��N�L���K���'����,A;/���1=vu�Eb�k^ݚe<�,4/ɼk��*˩W�e�W̶d�&Qp7- �x340031QpL*.)JL.	�,I�+�(`Hk�t�L\��cob3���}TãVC�Z���l�<����\�G�[�P*��8i}XF�a���������"�y�R��W�L^%�I=�f���^0�E��P[���2]���"T4>���y�w�㠪\RsR��^l�^��ZWjd�u�=g�"�d�����J��&3�a�y�����)�ӡ�+c`����r�S��r���=�5�f��
�a�R��FwC�y��$�䀕�_1�.�p��O%�W�c�i�_u2	�,$?;��T&���a0�6���`�ڍGu�K�g��+x�{��iBF„�OW�3�ӿջ�bͣ��[�r

�LL��RKR�
2
l�D*j2��.�}R�QZ��݈�PU.�9�PU�S,·N����wŵ}��ug��M<�(�'���6�U�f~�
j5*׊�l˨
��7��x�340031Q����.�M��-��K�+)�+�(`X������B�����w���������x�{-�Ax�I֒����'�8BQ6���~x�3�����n�O5���W�����ƽhˑ��,��1]���*�HH���W9`Գid�Cx�;�|�y�FF}���;��̏4���岂�t�"
b�x�31���ܜĒ���b�:�]��y
*�T��H\�G1��Ϣx�31��T�(/��L�[�+�*�*��O
��ߣ	x340031Qp,(��LN,����+�(`��ԛ'^���wq�&��;�����s~nnb^
ë�'�UĮ�tt���{ۓ3^ATx����$2P��+Fy�?�;��l�t߶�� �27'3/;���!kz�4�u�/�%H��&��`P��{@���x���8�q��H��U~��~�;nj��=Yᴁ�D�Æ
�+x������ȃ���sk�+��Aj���=��f��{x�uT�oE���n�k;4$�&[4N�*�ǁd��6)��.��؞d=�쌛�78 �FO\I�p����'ā.��	�~�n@���o��ޛ�5������gς�1��\�Q��`y��B{m�j�
=
��#v?�*���*7/���;�'�	* �ϐgS��$s��x/�ipq��s�ݕ�*�/]4_�8�ꞔ�~|<W�F6�J�6mx���y�ۄ���1��c��m�q&�S�k�
�h
�lrl�_ʂ�*ڬ��̇�"�f��N��ֹ��F�-��(��nR+���j:>��㺬	�E��N�"�WT�=B��6J�y�&��k�GY�:�.ˇ�:��Iҗe!�Ӳ�^D�N5p�D��Q`�F�mۥ3�B���BF�,�qP�E�XR~��+F��Q����<db/�v�i/e�i�q�ě�y�>n��}"�JU�G���#�!�N��&�є��b��z�ȌWc����Z6b�!�f�{<��ǜQgQ�Ȅ�ɫ�0��?G"��+��3��T:ک�G�mY���;�0䵵mRC�9�iRR�\,m�NgQ*����B��kZ�{^�*�rfᥖ�|��f����h�����0���;*o6��9�<c��Ff�e��)�f,�e�j]�zg���7`�q��OJ�2e�i�fG*�t,��rlU
�X�tywp�\�*��ia6qc�-V��-S4��+wW6=v�ݔ}��s��w��v���}��rtӯ�0� f'��@�i���9�]���lrH~[rwܴY����*Ȣ�h�$Y��)��M�4P�)mZZ���>rR�l��Z&}�~Ïc�ᒌ_W.���
�>��xLM��seI�w���h�7�I�������d�6���M���ZbS�f;�x%�#ݕصy�.R��'�0y�u�œ6���[c=1��z�^�`�bgy�rև�̪n�2A*�����ѣ'r���4�+Bg&ɝ������i7���,��D Ӳoa��A�\��"u*W�֗�V���T�?���x�340031Q����.�M��-��K�+)�+�(`(���y�{2�έ7z��P�|��
�x�31���ܜĒ���b�S���
�K:��p�@m��N���
M�x�31��T������}`�{���rb�'����f��.x�uT�oE���n�k;4$�&[4N�*-J�E>ڤT��(Z�c{����3nb.��=q%��
.�"!N�.\"ā����݀Xiw����7�k�/J��O�c_���4|��j �E�-�;�4X���d���bl��ܸ�bD����~�8&��(>C�9L��̍�㽐����#�AjtWʫȿt� |y��{R��Y��\���4+
llZش���}o.��Ǹ"���{裶]ǙlN���ה�)̲ɱ)�Z��h��o�6���e;Ab[�SN5�hT���a|@	��,�V̨�@���&�91�:M�Г^Q�w	�b�(�繛���yd�넺,—�\�&I_��P.L��{!;���ubG=����m�Έ���
EܲX�A-bI����EvF-fV_񐉽pO�	�����
ƅo!��ɞ���w�
?��u�
�u�66	?���t��kDf�_�hd~�°9`6+��)E?�:��G&=M^���$�9�p�GU\aU�q-���N�?�m˂|d�N�!�=�&5�!�c�ћ&%5����p�R�_*P����e��e��(g^n�͇9m�`^��@�.�N<cɸ���Va#Z���3�P��h`d�Z��Bn�
\F���I�w�Xx��N��T,S���mv�N�!�.����eOWv���[�f7F�b��2Ec%�zgu�c'�Mهj:����{�how��X�w�*G7�j�bv��@��V������e.��&��%w�M�EK�^J���,����I�������
0�-BK��هN��-;\ˤosÏc�q��\�����63�۠������D��9W��~�;��65��H�\|b�
��%��0� mJ��M8��:5�ؙg�+��Įͳw�Z�?���3�s�i�J���ُ�k�B[;˳��>�PfVuc�	R�o����=�[�����_:3��H����L��Ve�G&��}����Җ��S�����2�����P�������5x�4����d��6�=C0�!d�͂� �x9��h!iE��X��]��o�Q,3��x�31���ܜĒ���b��>^����K����L�q�-�2�x�31��T���֋��&�D�\�v�V�>I���

�n��9x�{n��d�4#��fFoI*1o��x�U�����/�4=Ü1��D������/�đCR3�ʿx��4E����.-�CA�40000 Site�^n�f���Q�a2����:?���H%&����<x��d�d��(򒱩?B}���"r�_�j7�-�=Y���t����Kx�;�|�yB��2��O����[|��m��ge�Z'V�׷k�pZd�����ǖU��X��BRfC�Գ�3���8��Չ���b�f&&
���ũEzY�y~O^|Թ�t�oy��8ɦ��
s���u�=dJ�Z�~�/���V���'G3����		8읣��䙹'�fs��P�x�31���ܜĒ���b����Eⶕ�����Kμ�٧�<T�x�31��T��|���Z��ϩ_��s�,4�ɻ�˝�n�Hx�{n��d�4#��fFoI*7p���Ox���4�i���_�%�ݚ�c���s�"�u�ۉ'<�
����,x�;�|�yB�ȣ�q%Or�e��%���A����Z;�٬;�5�k��e�2V&@�����P<�l���?�l�`ubs�p���������Br~nA~qj�^Vq~���{%�u.2]�[��6N�i=�œ��l�u�|i��;������b=��i��ьa"W�w�\}�#����C[x��c�]c�N���Ax�;�|�y�FF�L�⸔Ś���Oqu�hcu��=��2�x�31���ܜĒ���bnV���WZ��4����za�o����x�31��T��w�Z6Kj%+E�
���,ߖ��R�n�	x�{n��d�4#��fFoI*=q���	x�;�|�yB�ț��K%?o55�Z�uw���'&V���z�<a��{y���9�~�.���gb
I�y%)V�vn��v�y�WX�v�������Br~nA~qj�^Vq~C�t��Ms���Ik<��Ee�$���'g3x��rlYz�u���K��YO'�]29�1L$����\�K��"ߧ�uѻ�s�W@OI��Ax�P�����d��PJ�Rv���K�{�D�x�x�}5vZ;w�B2M�әIs�N�2�2)�}4"O�+�<��_�Q�veF����#��x�31��̜�b����6�)���Ҩ�f飲���榦
Y���9�-o��P^��"p�O��;˷)e?�����Qx���z�u��F%F֒�����v��
2
����lM�̔t&s3ɪ��+�p)@�RqenZ~^�~ebnD����d]�F.����x�31���ܜĒ���b����lv�%s=�k�oVK<�ӓ�٢x�31��T���?oI���Ðx6�s�M=n~՞
�	x�340031Qp,(��LN,����+�(``W�[�;��^���{����9�E� Pp���M�Ka��*3��_K�K�D�"��)��I�!*���ss6,���i'd>�c���^�Ϛ5o 
�+ss2�S����<�����ڐ��"�R�����<���x���8�q�������R5�oe�D�(�Ξ������+x����n�~��R��'qҧΆ���/~�+h߉��x�31���T�ͫ��-���}+�vK��9�7z���]K��S��:���.�������o�u;w�"�׊�Լ��<�sҦ�ff�����\�~h�#51��̼��"�S��+Y?�_��OK��͑�9��y%S:D�/7�;9�������.��%�Wz6}��~f���/p��U�����D!,��b�����]Yo�r�7�r\�|YGݛ�_Ic�2�K����Xu+kV~��=���spi��x���4�i���k��
���X�W+g��̾��'<��
����x�����.�isNK۟ϋm�Jpn���d����'x�����.�yף�{.�AA�U�r�xp�U�>��
��@��!x��R�OA϶4��v���|Deh+�&���SMT�ʁ5&V�@�vͶ;S�Ɠ71/��͋ѓ�z�b��DM��A/�@M�ݥ� ��o��xovr�ck�>f�}�~S���ǔ���*����S���f�Ne�Y��A��]�:ӍqQ\00���)���4��ᙯ�c��������4\����m�,8�g�0����M��(�^4-�yĉ�	x؋��l
�YE����2]2ғv]s�wI��p@qS[w	�+閦�f�r�Y�đk&Ce�^+%�H��4m�I2l�]]�Ӟ��)��P��Ģ�YK�c��Qǧ�aC�(hd��M�I��O��z��Ά�;N�Bw���+��n'�@����!��e�0�t��$H갇��<��
�`:��,�V���<%����h
�`8t|������\9
k��m=��Y�S�5R]�Ld��'5���K���T������w�����
J4g�+�!��v)�b������e�<�E���@r��IduWH�y[�ľ����ns^�f%�B�T1�P"�J�&2�C�P�pg0��s�1�����B�Q��H.J|P|�}���=��;x�X��VP�K�4<QU/g���6�_xk��b�[r������H���x��dv�|C�(�Jf�W~~nN��o����9��"
jj
��%�9VV���)�ٙ%��$�'���,*Ń�g�A�L�
55
h:6�I<a
R#��4]x�}ROkAG��ij(搀���]�fc�
-����6�=tu�l^����̬&J�]�9�5�=�x��ů�gp�n��3;��f~o~����(f��ޟ[���lrF���i�]o��p�q��ǀ0��#t#
�(�	�<l�ze�ZF�*^:�
�&�^�1N	���FA�r6Y:�C����$������Z�@Z^4�9�j��𾮋o��Ŵ���GmM���W+��O�|΍��k��O�<�B�YD��23��*'�YҖ��6a�5B):q��2T�`��k��)���������sb��7�m��3�Sˠ�/E̛�������&�$H�����.�����Z��!L2b�uD;��/��d�	;�[|�n�5P��:#d.����	��e1����M�z�(�y���g�6�;��z/����p�1dr����t���zc�j��Y��i4�^SE����z˒:3vM�ҿ�EƝ�K$��D}k+����[)�;c�����m�H��{֞u
��Չ�v��x��տd�
�x�340031Q��+.I���+�(`�q���I�Ϸ){�?~�wF�S��܆e>��%�Pe	�y�_��鱫�/�^���,��Pe�y�H�y�,��|��T�yyPQP$s��0�/)���wx�]�����h:,���"�rm'�XN�ZO#f100644 Create.php$�ot ���S�T?��7��X��`�'��G�l����t��#1�s�&&C�mx��d�d�P�(�{��e9O��-^y��{~��-8�	�*��(x�7�����1r�p<y�rT
��YyBym��`A\X0P<�she��i�����sL���Ex�7�����""Ij�{䉘g��GI���`��/k/R̶�k����6�N�s��W����`x��V�oEW>Hb�!N�8m��4�0v��J=�8ihRڐ6�H*J��wl/Y�.��4U���	$H�H�8A�R	����8�ě�Y%n�*��3�k��߼�>������m�ޣg�y�#�OJfF|�'��ԣ�AL�C�ӎG�٩�0��j�b6ڥ�A�%�]d�у"eE�y�0MdQ��X��v�ad�N�!R���!Â?F�3�(*�:Uz꫊.��@�jeV~�UFs<iYo�p����Fybz4��
�X3<&��i��M���Y�^�W�)q]R��u�d}�P�W�	p�B`gI�
f�1�����(A��aR!%%k+�g��x�݇�g+
�z��#��7
e�"�Vm�d������j�Io�Ǯ$�דΗ�6�����A6�,��Ĉaz�O�z�z�D��eL�j�0�t8T[�ʦ���唙�խ��{Kk�+�;+�7��YYn�_B��n����<( �G԰V9�%%
��D�=꺆N��y��p����E�X:d�Q�r2jͤV�裦3j�"q�(ͯ�b��1W�m�S-�v�b����߆4��P"��Kl�b|�'� ^\�ʮX��x�`*m���%Z��o
���v!�V��H,�f��o��pr��%Vrf�X�>��.�`�lzi���s��M�c��/���F�5CT'�P�L�74*�?w�>�wڲ�1�4���Ǯiu�a0I���:P��NK�$����/�C�j��5�
�.�/%<�e0�m�K�f��f����O$����E��=��^C-��܊��=<�چ�:���8�rd1����SB%GX���+�9ꇧ�}���y<޴�p��
(�����#gy��ā�E��'2ΛJ�|k<��3S���7.d�Id�&�A�w��3��}O�x�)�F.�v�&����񃫡Ϻδ`p�$�6��vx?(��?b8�ZЦ���zh_�u��}ɤ5T�mQ�x���v�#hղo�l����fHs�c�-��l�
8�F3���x��Y>�#�,��6[�n��hr�֯M�h�4�*%��G�&���׎K�˸�i|<������(�'2;:��Du��=,)�HrْМ�������C��3[xu}���Rv������-�9��b�}�8���qUݨܽ�V�@���*/Q�OU[�)xh�l�tK�rJ	A%��āfg��hp )C��ed�q\�ݦ�f�:>�A�*+���
La���?<�=�Yms6(�bb�wއB������0�����iA��AgZ�#y�"M�GLg��x�/GG�	W�ʋ?\ĕl�L�*�^zmF9_7�;Pӭ�ߍ.�}�2���ԤRQ;�/�1�Uw�zdo�!�%�n��4�+֞�ږ �n8�:ݣ��E�1Rl�WI/�	'���(��Ca�叻G�TzlhwA���m	�nΏF\��v�u�9�-P	ܡR�}u��tT[�ў'��c�.Aݚ���:f(S�[���Fo�F��� ��O�p�D�?�x�}SMkA>�PM�Hۭ�2b�$����%1��R���7	���ftwg;�n0	"x�:'�BOB<	B=
��#<{rv�l6�vaٙg��c�y�/�~9�<��v�\��r#�&�;DI�Q��S�3��-���:�]P[�;˓��(�_IE�F���%�
�qu�_�w�=	���ǵ��V�s� ��SQ�{~��>p#W/Z�����=&�-w O�j+*]x��`��՝���;�:!Ƞ'�,���f�"N��M9�$����%Ĉ�å��,�%���W���Ns��8�%̡"�Щ�t�Ǖ�s�T[p#�:������ �9�1�%��0F�g��	\�U�A~cs����)��<N4}�Fa���Wy�U�n�"@�D����N�ۺL����=���A4.�6O���Q�����W�N<�IE$�"ْz��+S���W��TV�J�����o�v�bR�5!Y����7�WPqj�rҢ�m(�d�D��Sme�Q
��ڝg/�

��"�ODg3�����x6{�䀨?���1ap�#ckgu�BE�
A���T�
��n5������Ax���(|C��vbQQbe|njQz��Jr~^Zf���JIFf��]|jEIQb|~AIf~^���F�̔Լ�̴��"[��ĒĤ��T���̲�"=u���E��@%%)#��ʳ��[Y\��k����\%{���a���F���M&׉�o~���	-�;O���x��V�oEVBI'�i�iҢiH�v��Q[D�ء&!��������d�;o��Yvf�U�^�Ј��8���8pF��zC�\8"ofwmlj�{�wg߼����]~\�|�_��9��̉x�����#U�*Ģ>A�F�v�P��̦.K"y�E�lvT(u�?������A	Y�ad)�Ls�-oPZsp�q�l�q�8{�f܇��y"ڰ$�:$�ϼ�2r-n���2#|�0÷=�Y-La�F�ٰb����C�{y9G/[,_���\�Ȉ���
�ū�C��2ޓ�<�w1̽h�]��D^�\Y�V�_,����:8�N3&��q,ǁ� \Ƕ�+�qTl�V#._.Q�F�Q���/vMT��·��mbq�C���:
��.r��(M�>EX5N0†yKV/`�9�F$A&�����5�-�_=�j����e
RA����)��f��e+{��@���0c]��v_�a�PkB��jW��W�8���ױ��������!�vS*�a�ڜ�KpNj�E���*�6�4!i3���H>����h[,�[Ok��N�|��.[]>��	2��BA:���F}��p̓dM̱dz��r:*��}�F}	��V�=X�v����V)`�tB	��py�T����tpa02��]m�섬��Hv?����*�:���?����U|�U����ہ�6�wxb���Y�ձ�7�+�ocƥ.٘Q� �y�����*˙�!/-�|qdhI��{���ɾ}�2��;����bn�	z��H�r�ߔ�0�e�a� gk��y0�t� ���,���p��+?�=R�[b~B��i>�.+��+��E�{��+��*(��Q��j��SZ2LX(�]��A%#<z8�7T���{�璍U9b���/!��vv��X���By$h��>� �:3l�Lb�3�����k������*Q�f�9y#DqC�Pŗ!ˠf��r�u���mنf�!{@�
p�'�;Q�����i�P{��|�.���X2��X1�e0E,Lx�j�)�:="f%;�%�|�a�#�S'%��a��A��P&�rm����߼��*��R�S ��}X����d��	m�B]���g�CŏÃ��L��F'��h��ܒ�d�L¤
ס�F�'fe5�� �WÎ9
#~9,�N�?�L�m���'��F���-!MN�&>��N&!�$���AzR|�Ή'�ı�Q�?:w�5k������t���Mۗ�pr����[c����������~tQ���	+�(��O��G���x�|(����̊+>+�	�2Ň��@tt��P��1�>$�l��L��z��R9���l�l��ST�+Ѣ�]zf4�;\*-���L�]���|�^h��s�k9�99������z\�w13�:��5;+��r�nR��L���{�Ũ֡��7�Tb5N�o�F����sb6:�ů�ٺԑ� z�6i�_��f�Ktbv���B��:Od����a�{�����1��x(^R��u?|u}��`�g�\�\mD�}cS&�'��%�v��E��Bx�[m{�v�Wn-��"�������Ē���\���T]ݢԂ|�l����7��Q��	?x��g��~���^Am����xE&7�8�:9�
%�
�%
E��ř%�E�
�y�%��)
�i
�E��%�y�
�
� )���Ģ����̢�d�=�Ϳ���M��|V�TB�K	���,NUW��QJ�����$=�xt5D��x��f�븡D��? �����g�E���">
�ũ
���9�y����99��
i�E
�
0XN(���X����[PR�7�"�0KIQi��"��}�9-5���� 3MAC%3���D�.#�8 �(17�$�ȿ�$3?OCj����B5��R�~����yv���F1��2��p?>����%x�[d��jC�L�e��0�3y���y�%
A����.�ޞ!�>�!n�A� i[�����b+}��̒��$��\���ܤ�T�����݂�Ē���\=���|�Y����!�
Pi���T]ݢԂ|[��ل7ob�f..�,I�P�P),�,�/���^TB49�]�A݊�;nw(H*JM̶�R@M�!4k���U?���9D7O�$��e����x�;�|�y�8�HI���݃����u���օ�]=Y�q��
�x�31���ܜĒ���b�r1�������x���-Bn&k2�x�31��T�e�pΣ�HP��/z/��hM�F�	x�340031Qp,(��LN,����+�(`�{^��sМ/ꅗ��k[�S�(8���&�0��M�\h|U`��{�NJ'��m�������Idذ�~G��������nzu>kּ�(������N-*f���x��?kC��g��K�c�>^��x���8�q���w��������'q֣�|����}��
��*x���8�q���D��
��s��ەs��2�4M����	a��_x���� #"5���a�v�mZ{o�,ύ<�0���^���6x�{���B�9%Iw�����XAf{���T^����Fx�L������xaw�B#w�򬆦{kt���}.2
ӭ�5�e�����ٓ+�*�!KH�"���|�K�h�'��L�� ����9x��d�k���1�HA���B�\��P�KAK�3��(�,5EAW��"�D�<�$C!Q!751/3/=�4�,.NLOU�LS�P(K-*���S�Q0�3�3��\¸O�K��x�31���ܜĒ���b�W�Λ״'��vs�4�SV��
)��x�31��T��K��١_fl+5�ߣt��=��
���x���8�q����ձ3�Ow,|y�<R�������3�N
�n��Sx��k��n�4#��fFE9&p��`x���8�q��H��� Od����+����]�8��
����+x���8�q��������BIǻ�2�Tl���3�}�D_7��
��*x����9�)��4��|F���E�o*D��MF����,x���8�q��Hքwgh�5).�/��;�	"}��

W�*x���8�q��H�s�Z�I�<�d�-����<��D_7�g�*x���8�q��糔�G�6Q�Ox)8#z�󲔉�n������x�;�|�yB����6�5(�6���y���X_�]��Z,��U>��l�����g��($e�1�/���e~�ѩz3��E��t��340031QH��-�/N-��*��c蓎4�i.�1)c�����lp�$�œ��l1�Y�mk>�~����u�\�	�K�D&G3���4H8��œ�ne*�s�����Px���qx���z�u�0_AF������������dN&%y.(P*��M�ϫԯL��)�3�3��Ŕ	��j���4x�;�|�y�FF��eJ�;~H
�KI���ْtn�5�C��x�31���ܜĒ���b�O���2?��5�PU�9�mw��Тx�31��T���ǯ?v�"�8�"���׬�ی$�x�31���ܜĒ���b��"^]f{�`?�F��}=�'����x�31��T�[͘s
>ܳ3huқ�
��j������x���8�q����Y�֫m>�7�����T?Yf6��
�
0�,x���8�q��H��X���,����f�4�s����J�*x���8�q�����Ǭ9.��v+j�B�4���?��
����*x���8�q����eg��i����)Ա��S�=��
�6"�*x���8�q����Ҝ�7��[u�LS��%Y�e'����	��*x���8�q��H��k����j�UX�B'�:Ǽm��������0x�U�����/�4=Ü1��D������/�đCR3�ʿx��4E����.-�CA�40000 SiteD�z7L�H�L�
��w6��HY�$����cx�y����&100644 .gitignore�B�|��
���q�@p�I�{�&zNuW+�y�"!���<�b�⑴>2D�6
&�
m�S	CA�Y�z�q40000 src�Lo�2�!�)
S��w6Z!�P-.����~x�;�|�y�FF���
��b��ytCαQ�R�2��x�31���ܜĒ���b�W�L͐���r����{W��%�x�31��T�S���oi��>{��Ԑ=+
���Z����lx���8�q��ȼJמ�	�w���ϵ�����4g���g����x���4�i��9I������h*���̤�Ø3������3x��d�d��!"�`�{�����s2������X����5���nx������;��(3	���ֶ��.����
��x�31���ܜĒ���b��}����bbX��b�Ë��s�}���x�31��T鯊线}Y6o�e�x���˂�x�31���ܜĒ���b��*�����8��2��h���oc֢x�31��T���זlS����T;6��'����$���x�;�|�y�FF�����č狥��GL<�,CQ~��֦x�31���ܜĒ���bF��_�u��bG�G�Z�]�֢x�31��T�N��xW
8֋=�M�W�r��j��
����x�;�|�y�FF�ze�"�;�_T3?ڸ�'��!�8
�x�31���ܜĒ���b���M���N�cӞU!pg�m�/�
�\�x�31��T�G��~���C���9�~�j�7��{
����	x�;�|�y�FF���+{'x`κ�{X��mq��'��x�31���ܜĒ���b��W�nv�%:7b��t��,Ko��
ܢx�31��T���_�X?������}Ō)����x��d�dޠ�(�}�s�p�����Ͱ
�öfy�d[F�K����x�[�m�2iq�njEfqIj^�nJ�����8�7ws�gG��/tVkU`���tx�;�|�y�FF��N<=��^�,��U�ԇ�L�T�x�31���ܜĒ���b�YJ��7�޳�e;|^�d���gc�x�31��T�o�do�)��=��fbƢr��9�؍
����x��d�dޠ�(�8��硜e~��n�-}�l�ɮ_�m}�F.�.x�7����]_�pv�nq_���,�E�%�,����7<WV�:R�����=LzHQ���lx�;�|�y�FF���J�fO7%��z��e㎳"���x�31���ܜĒ���b�Hݷ�.?f�����e�lύq���΢x�31��T�;6�-�iw��a��ɱsȭ;�v/�]
���ax�����.r�����S�y]��}�1'���x���Rx�;��eC1��&	���T��<�Ĝ��ĔJ�Ԋ��Լ��ĒĤ���ɎL"���a2�)I�3��L�dU��օI�$Mnd��Ϊ9���B(!�
Y%6�rd3�+@�JIFf���M
�
*�y�%�v�%�%��y���pn��LS�P�4@S�zr��d���\��D&��e����ur���䙒򛃸U9l5����3�3R��lmmJ�JSjj��
&�9y"���:N�52�/�w�.��Dx�eROkAe�i�Hۘ���_cd�&'A��W�X(EňLv'ɘٝufR�"�,�����o��ԓ?����4)����{���?���[;q�w���s	ǎd�`��y���r��c8{�LG5��&��m���M�G�e�ż�?�/X�)RXN;������ڞɩ�B�f�3	�1�.�H��6�r�����h����P�]Y�K��h��e�?���=���`�$��pE�:Z\/��~k�6t	���&��s�(y�]G���{b:+'.��ט�%�Z9
��Jչԧى��%"T�?VS~:.�o�cn�Rw�K̀qi^��'Ԛ^!�����c/g�w���tf�x��V@�!V�Ryu&73[��:��U2[9�e���!G�ͱ���p9{�XX���E�RE������h�zy����<��Ռ.�'���
�z�y�ͽ1�vX<a��#��\A���0��[���Z����S�y�S��6$���6�ˉ֣x
�R5|]zKZQ�+�*Q�4NU+�{�R�� x� ������!N��LƂ�d��Ǯ4Ó+�ߔ4�x�31��̜�b����6�)���Ҩ�f飲���榦
Y���9��f}ڸ{�����G�7y��y�+�R���=x���6�}�0c}f��FYjQqf~^|r~nAbQ�F�G@|�kP������������:�a����P�ř�������Y�ԑ����P�ZX�Y�Z��X����X\�4Cj����|���<%k.Δ�T
Mk�Z.��Œ,L)���*x�u������S�DG]���V��2w�6x9���=}5vZ;w�B2M�әIs�N�2100644 composer.lockKrge��څ��u҃��c��T�}4�l
$��:��+��sJP�1m��x�^�����@=/�+b�{ƺ���U�O���I޷100644 composer.lockB��#���<+��?�?L��=�}4�����\E�k���fj:��bo��*n�mx�;�|�y�FF�x���{+Lx�|e��o��4�x�31���ܜĒ���b���	)��W}��Q���5K�N�C�i�x�31��T�[v��o��m�+�JK8�b�/����x�31���ܜĒ���b��+��V��}�y݃΍��5"}΢x�31��T�'�
߻�b��Ϟ���
/�����fx���8�q��ȑ���/���\����ӗ��~�n�X��+x����9d,��*��?B.��3����
�MF��
s�,x����9�0CY�ƦPܨ���������MF����5x���4�i�T��V3���K?Z���'95��v	�L�@!8�$���k���ѫ�Oh���(]�F���51�Jx��������=�B�u+/�ʕ>q���� ΃A�,x���4�i���Ȁ���9�k��Z�Ɯ�����BG���Yx�r�����h:
�=�2=���
�l�']�8100644 Create.php""Ij�{䉘g��GI���`��/k/R̶�k����6�N�_m�O�sŴJn+��G�IJ&�0���x��d�d��!R0{���o���'uX��}j�Դ�����
��,x��d�d��E���?�@7��7��D��#��=G�N<q��
���Hx�^�����@=�b@�|G�GŰ��}��k�27100644 composer.lockB��#���<+��?�?L��=�}4b1�ʧ@�!��A �N4�%N�mx�;�|�y�FF���~S_�1#��Wu�j������(x�;�|�y�FF�9�7�{�!�y{WZ�տ�I��
q��x�;�z�u��J������(W���U�W&��(Y)(��''3e:.
�x�31���ܜĒ���b�9�Tv����5��$}J������x�31��T�;Q��l�ε��!�ޫh=�(�)
f�x�31���ܜĒ���b���OE���uPY�W�5Es� ���x�31��T�/]?��\uݾ�Ђmk�⨫|�����'x�;�|�y�FF�͒9�*�ߴX�2�d:���W��1L�x�31���ܜĒ���b�M�Z��6+��ujbC��oM_T!���x�31��T�܃�)�6+�4�w��n������(
k��x����9����[�|��V�F+��B.��MF�b��x�����r�}��_O[�k�(�l�u��#‘�H�%2��Lx�;�|�y��Hc�x@}�S�G�
�n����'�0� �o�x�;�z�u�?������j&)�����x�;ʼ�yB�H�%Fv��ߋΆ���jT>ì�rbE|��w�vk���W�ؚ��W�rϟ}&@�����P�be�n��f�lw��~5�u�oW���($�����e��1Ԛ�EY��8���<ӳ����œ��l��T�-Ko��[Zz�y>���C&�2��l���U���J�a%��I�߿���"N���@x�[�|�y����(�g�d�&1�oUܻ>녷���7�K���HبU�f&�x�340031Q�,..M�/I�-�I,I��Ma�c˵u�s"�]�jG��K�,�_-?��0x�[�|�y����(�g�d�&1((i,.?6g�ˑe��v>�٨U�\�-�x�340031Q�,..M�/I�-�I,I��Ma0?��V|���U������d�m��!x�[�|�y����(�g�d�&1,�:]�A`��Z�榿"�U��mԪdcOb�x�340031Q�,..M�/I�-�I,I��Ma��0�d��?���Y�&.5q{z�j�x�[̼�yB��>QFH���'x�[̼�yC?�ȁu��ڮ>�p����ޫ��{�Ѧx�31���ܜĒ���b��ڗ��m���M��}*�مs#>f�x�31��T�u��|{��-�Sw���Fg�9�����
���wx�[̼�yB�H�%Fv��ߋΆ���jT>ì�rc�6#���#x�I�����=���?z�h�	��[��100644 composer.lock�GZ\� ���iU�;��[H�do�Nx�;�z�u�����d'�.'�����jx���1K1�q*{�7(�b��C+�%/���� "�%A�bq�v�4�܏����Eqw�+��j[upk���o�~o?��bN0b���T��� 
����Y�K�堃S�3I��ڔ�|eg�Z�+͆�� �R�0��q
�Ω�Z!�)5�(���[%�?�V}�R]$X��b<�#�B��HqI�$xJ/^k�Z	&��2k@d�b�Z�F�q���,���=��������l=/�ss��?�~�n�w��Y/�q���,������r����U�e����$��@A����x�;�|�y�FF���h}/j�����T��_�u*���)x�;�|�yB�ȎwM������k�~_=��T��
_F�t�+x�;ʼ�yC4��ZF%���m�~�g��+p�LY��Ҙ
���x�����d����0r֐>:׷�=��-��xM��l�.x�;ʼ�yC4��ZF��{RBl?=���ye[�%�=�
��,x�[̼�yC?������KMĴ��]��]f�!"���
�x�31���ܜĒ���b�%���l�9w�
�i|�[V\�pmr�x�31��T�_wM�f�����:�"�V�B���h��x�31���ܜĒ���b��M�6O��}�f4ׂ�
��{u���x�31��T������%�qK�E��/�S�3{9�W��
x�[̼�yC?����r��mXKD&*%� \��?����x�31���ܜĒ���b�#��l]o٩=|�<�J؄�B��x�31��T!�]zrw_/��{���f_����x����U˝y��,"��H���u���+hɥzl��}x��g�k���y�^�Fi ����x�;�|�y�FF��u���0�����TL��
�:�
�x�31���ܜĒ���b���
k�ۇ�.�<[�'�,~ʚ��I�x�31��T��Y)�o}1�0%����ȫ���S��gx���8�q�����75V}~���g��������
����Cx�*��>�6�������0 �����W�$��B
���`�^�x�31���ܜĒ���b�m3X�ny���B���)�
����x�31��T�G��7D�8~J�p��j��e�ѭ
�	x�340031Qp,(��LN,����+�(`P��7��clZr����K���71���ļ�"�W�I���%~���ܗ7>�{
Qᕟ���Ȱa���H;!�y+����|֬yQ\������ZT�����~ֆ,5�,9h��7
�>���x���8�q���:-I�P�-��c��j��s:7Q;��
����>x�{a��d�$#����fYFoI3	���x�������`��
�H�~\��(+����g��D��Mx�eR�n�@U��B%v�`��� -q;qL[$T�ji*��{b�j{,�8	l���a_�	��	|������j�3��9��;}�����R׮7�j5L�0-�lmo�z����XH�pģ��BB�+�SCF��%���>���m����/ߚ"�bwIOY��T€�p�x�,��,3g9�
�0ܐ�H�g�%��mM��������cP���Ј\�=�mV\�$�3���H�w"�U-K�媖�������'&��W4d�s!��P�s��X�27K�tn�^���d�݌%�7�O	��sݝ�%{ޝUK�L��nG�4Y�p��x1'6���3F���}�p�p�"Tl�Z� Wl�Z�,JR,T�]���ˆ��
	2�}�����2�0�b*RJq��)S� x�������Y�'WO��}:��DoOԍ��MIDq�5�S��=x���ά�nH��b���f����@s������Ms#�=�Y�C�e�%G�>*�;�cD�"��O�T��|�P��ض�{r��X�]3:�0�Я�S��,�+��*���T�X;}���T�nO?���X�g���n�n��e�x�31���ܜĒ���b����_�d3٨��M��5�j��PI�x�31��T��J��J|���7γ�0�!
��
���x�4�����-ι�V^���ɷ'W����̓	���\������b�[��|�b�A��Cx�;�|�y�FF��k��RR_����0!��̛Ѓ�8
G�x�31��̜�b�	��\��:�י{�%��xE�gCsSS����ܜD���Wf(�}^��o~��۔2[?d�x�31���ܜĒ���b��g&��/�{u��vLJ<ެ��B�B�x�31��T���7XfO��(�q����[�[O�s��	��Vx���8�q�����!��[�����<�\�D_7���+x���8�q��H��N����+�kN����r�,�߉�n���*x����9�7w���zV�����r����MFɭ@�,x����9�����M$��J��'��W��MF�\��,x����9��̖��/���!��q�w�MF�Z��,x���8�q��H��ڒ5?��oo��t��ڏ}���
��x�31���T�ͫ��-���}+�vK��9�7z���]K��SvMK���x�f}ղ,;W��1C��V���g��1T���[9�f����9n���Q㖙��Z�p���~%���K_��b	aP�9r�  �4=3��
���^��2�o=v��l[����'DApfI*ý��3.�:�H����s�_L040031QK-��X� ��!cW��ǿ��
��*_�Q�&�WĘ����c��;�'_�`ǥ�i�	���f/��p���	x�6����/�]�W��Q!��q��(�dP�Cq#��Td�=��g��Voi���H�A��Ex���4�i�����&V�ʚ���F���d�d�S��'x���4�i��H�[����r^ۘ{�
�n��^4�,�0��*x���4�iB���?�b:�[D�o[�R��[���������*x����SL����~���ۜ�o��D�g��xc�,x���4�iB�������oO�DC�Lz~o]PG����|L�*x����S��i���[��2��P�M��v�g��=U�,x���4�iB��W�ͥ2"Ź1�sD|=�����������Mx��������� >�r�8cu����dk&���ܸD�.x�������ޮ��\/t,���;ѕ:����9S�,x������3
|ֲ�R���Y��Q� ����]
��,x������p����ap�/t*Z
�U�����n�,x��������,4Pq��z��s}F&�d/�������,x������x|�!=�)��
���0�>���W�,x������:���������x�'����ڀ>�,x�������/���u��������������,x�������761��x)G���M��,�ϑ���\P�,x����������v	�ږŎn�����ɱ1:�6�-x������=2��~t�w��ݟSZ���彑���2��,x������w 2��h�T�?)f���V�+�����#�,x����������4�뱷�|��������$�,x������	z��Y�1����:������[���� ��(��?x�eP�N�@�D�(��E�D
�-b@��R��9�	ȍ7�%��AQ%rΕ�n�������J��5�6��ew�μy�=��Gia`/���[k��Rh�Ά\|90���E*�'DT�Q���j��E�#�윂�Fڄ�w����
�:�x�d/�(N�
��m�9
�c{��97;;�vu�	{@��E{2��/-�Ym�U��r:e&�.��{B�?�|��5��sc���N��V���~8�~]Z[.=��.�nm�]��J�I��m��b�a�KJE�^&LQ�uJZ6��61�~�C�3�_��F(c	��a.�N�գ�-����I�5lk�)h;�.$u	�/�O<�%j�k�γ?b* ��5�Rs��3~d���U▼y���s��ˈQ�{u�X�ҧ��J+M^���̑n�)x�[g��v;c�f�e&;y�x�e��J�@E1"�ik�jEP$%	6ݺ(���+�:$c;4�ę)".č?�V��+�;Q�
�_�?�M6vV�wo.g��O�����c"�t�&\-�߆U���uXD%�=0Ѯ��H�`@zT��ˌ�"�n�ku�Jw�;��h�?o�}���j���ŵ�\R�ӌ������V��$�.&S�u��AN{^�=�����d�H�	*%�|��5��.,�y!~M�uLe@R*�4���9,N#R��v�R}&����YiO�Y��LՉ��M�r�)�R���ɻé�QvtO[��0RpX����BC�8��)6<#����?�xv�q���
��Vx�k��b�A�O� 19;1=�X�V!��(�2>7�@C=�89� �8#5''�(]]Ga����5��$���&�(LV���-��OI�PW�T���y=�u~�# ��gx��b��v�uV~�܂���"�������ɯXe�6����)��2�KsrRS�s򓀬J=�����;x49�aB��\s� �x�31���ܜĒ���b��҂,�%U������{����x�31��T��O�ώ������x����S�0
���$x������J�G�:��;[��>ά�/�o�õ��x�31���ܜĒ���b��
�m�o��]uyጮp��,y�עx�31��T��5�懙ϽQ3��~Cj�%��g
J��)x�;�|�y�FF�J�R����~?����=~?5��4�x�31���ܜĒ���b���+�:_z����=�K\&��U�x�31��T�U|��6^u����t6uF�9��M��-x�;�|�y�FF�Ȓ���ջ��	�0.��8�v�$�_��x�31���ܜĒ���b���o4��e��9^3f�0]��,���x�31��T��_��x/��Q�`��J�G.�����Bx�;�|�yB�c�u������&�����'�ubE|}��l�\!�_W��~U�p8�H���2����
����Ǒ
�NlP340031QH��-�/N-��*��c��{��|���E������I6�GW���������		�g��znRb-��.�qr4c���Ѐ�i~+���}��7,XQ��Ax������m�v�u�x,¥;�`��K���W1�+x� ����G\C�����5��*�Jß�[j�	;�.x�;�|�y�FF��2��gM7
�Z_?WS��)7������x�Zmo�F��_��_�˩�"�JZ���&��Z��X
�7/��3ܱ{�󹎝�
�"þ����<3ýyB�2~o9e7��| �\ɋ��Rd�ל0���:+xGDN�Ŧ%M+��YOzA(���UM����r��/�R����MO��О���開Ŋ�������j�D��3�]������U�/�)&�1��B��j��?]����EE�"�eymHh��5�� ��$N�n�z1��4�b�2Ϸ� ��4�����{^����8�˩��<��e	�Y�%.cn6�3�]�0���7[-I��T��t���dr���]!jD�X������pI�m����cU��29�iK�Jѯ7�Z_4��̋�nX��`�>O�G�4�"�:����4��0���z̷�4r}6���w;{�[�]\����AhS �I�����EZ�6)��d�*P	���`��jS�A�N���
'
�;|�u`y�}|��*�"mi{�)���>�_gk��E�޷����YѮ�-BB�}m2~��™�GЭݷ�|z���κ���G�:?Gp����]!Ԣ/r�=8��y���`�c��l���Y�;<�]�E�x?��R�4�a&�֢U��4x���xr�������i��o 6�~0@T����FϗB��p�zb:Xƻ�-���*Q�Bg�ӌ�\�@-�UQ��`|�*�=\�.v�<�L��~}%ZvXY�X[������T�ui�b�ۮ턦c�?�K'Yz�n�̨��2�cꮫ\����N(�&����kŖkkp�!
�I$�fy�f���K��9g>�q��ygAB�0�Y�w�A	g�?(	hbm��d��B����A�يT����
��7׊,��{ ��N+Q^C�U�U�-x1�~�����%9�il3�i�#�%�a`#
��0�]�9}+2�at0�+�rP�YA�vCR�C&l��3�l��&ͣ+�X�(α��yO2��r<�Gg�C�<?�iD
f��:�����Fz���ͼ�����*���>Y�鋗`@���ȯ�=����g4-xM��@P2�A�-dA��Oǰ�ž�4
�*A���D98��bS����a���`1ÂL�+��+��p�;�8;L���`��߆I�>�-"�M7$����e0KJf*TU�U�(�b�j2��~�,6���NJ+�$�7�K8uR�y�I�gIl�i�0�6U�r�<Շ�-=o�����#�*I�}6��IE�g'�oO�s(�n��I�X�����*�|�Zޗ_����-�->�!��7!ބ�%Q�Z7�[3�	�$�:Q�M5b�jh+u0-Ҁ�q�QL�����c�I�g���A
�)�?�5����%�bH�4��`�д#ӳ�-]w�ǻ84�A���~���Ɯ����&<hK`�I,Σ�y�g�	s2�q���<�a��w;��<����gJ���a�=��~��yH�
��g���5�)���E0t��vV�)�H����h+h���y\��x�w66P��;(w�>��u��)
,���m�������ԟ�L@�N���>L�;������)���S|��L�`&��؜�,���‡	�ի
�k�z���?�ꊴ(W�ƶ����G6���cmOӽ���օ�r�ӫY�
�{�t|,��p�;י��({�˩2(%�Ghޏ�“�����8pS��>����Qn]
l?�y�1��N��(֖�O��������чg�dg�uf�������=�.����{kk�sň.%��*����f�^�%�����	v~?�G���h���jz.�1d�ӣ���jS�𳬑y�#�l�R�IR6�d^9�ndT��a����<�q�W�w1e��=��d��l�ɻ'��M��x�k�mq�Ϩ`�����fff`�blhj�b�df`n�fjd�hljll6Y�QB!�09�����2��(-)�� �8%�0�������ps:�q���U� ��x�31���ܜĒ���b�f�ߎQ��M�?.��v�� W~�x�31��T����,�W�|�o�.+������	x�340031Qp,(��LN,����+�(`��=�"�a�X\��Ʈۉ3�11���ļ��57#�k|_i��uA���v�
���ܜD���
gf/U[�%0���eS�M�(������N-*f���x��?kC��g��K�S*=��x���8�q���s�;�#�	r&>�.��I��Y2��
�B��+x���8�q��H��K�^��ۯ�w�>ڟ��-��}�ڰ��*x����9� ���A	����sn?|x�Z�ÑMF߄m�,x���8�q��H�O7�[��M���i��&f糉�n���*x���8�q��HW��32���Ehxp�Y>�|����]�*x����9(�a��,�h߯�ϧ{q$3��MF�*�,x���8�q��ȃʍ���!!e�]M�>�Op�*����t��*x���8�q����--G�f��'#�[/t�+���Ş��n�@
���x����S4���P��8Hٹ�����g�Ԫr�.x����S:�S)�4�l����*�蹲銑g����,x����S�o�#D���^��T�-�t� !בg���Z�,x���4�iB�ȕ��U�tb/�Л���+�����
��*x����S��R��̓yEb)Ԫ� ʺ�g�����,x���4�iB��Bb…3��>۳�t�'.��������"�*x���4�iB���Vw+���;Ev��N��4E�`b�J���*x����S�~rⅡ'j�䧞�ݨV�~��g��,��,x���4�iB��DZ�5�E�nq�[�.����$?1}%��
]�x�31���ܜĒ���b��W���\�ĚջA6��<.�)uD�x�31��T��q��^�8��4+-c�?Lz�)�HA�=��x�}S�nA��ű�h�ϖ��Iv���%BD��r��r�5�{�Q�g`�W��:M���x�h�Y��c���|����p~>��\˕=��q���#�W��
�Uj�
���Ze�z���T�E'�"S��B&)g�x�2t�g������L��H�)��E2��T��r�W�G�s��ͩ*�����UHe�o�L.�D��C�~��yH�1�IJ��
�я4+'X}���/颾��)$ӫ�3����,PƑ2bd�Q��zIl����Ǿ��(�C�r��p�J㻖�pA�zf�*���]k��c
�	T*Ph�-�o�{y؇d�~/lbu�;�u?��4P.\?�Ny�'(��7���=���0�P�K���vb�t^���t�}*��n�0ZBS�T53��1T��|�4i�Jq�y|�X*�Y���\��w1x;�UIȞ�L�LG��H�H��U$��b&ƺ3c�ڂQց#j~ˏ�#������iz�esuҠ,�.1Iz<6�m�6{/��3��GQ�33�W7��_��3Z�R�3x��TMOANk���/m����n��6����MMPl�����83[���^&��7L��z��/0�-m�q/��~<����3��᭠��<�ʈ��gA�W5߸�c������(w��i%�:�	�*ya:�/���Ȳ#����up��U59G�E�
�"5J80T
n�t-5����甑��	�¹0��(#u\��d>�MX�H�+�jZ[f��6|
���6f
�PW�7u�z�( עw��Q��a0��N.�˨T��#�������3�-���a�_-�׳�{�Lz3�*�YR���yM�ҥi]������uM�bj3e$m����TO
�*�
��bshv�'��^�t�`[���
����TxB~
�L��3��/D�Ax2�^�r���i2f6Jel�ZWIU_T1O/��*uӑ��l�b�]�(4�c����SN�����L����*�$��z:�7��c���Ъ�xR��c	y01j'�1–֔�\���:S&�JY9�R�
��s68��G�X* :5�eb�l���LM����cC�'m�Ur�(��c���|�>ܻ
�y�c���ʉ�:���0�d�������ۉ:U�9 �R�3�.d?\~���إ����6g�ٟ�`\�F�{@�Ta[K�r4˓s~�n��z��P*��<W���yc�̟x�!�m��ty�͉*#��4��#�OW��Wlr�*�*����Z[���鑾Q���;#�'����x�k���@�?�����n�OJ�������������U	(��
	�0
���K�|
 =����	R'))
�@�j
�t�i�^R!u�zx�{o��v�y��fLI�g2}���o-�Pͥ�
��K2�J'�7���-����'>E!��<x��b�g�A��n���⒌�R�₢̼�48��Z��Z����R\I�Q��-��OI�PWPי��[�YS�z� ���C�������Wx�볝f����]#��(�Rs�)G�HBclx��f��fC&����b#���
x�{cs�fC��]������&�c�H�O��)I-�H,*J���M,�H+�K.����P�Ь�R@�i�%E��@)u}uME[[��Ĝ�T4� P�ZRZ���Ra�5�^NL�VGA%��$5�hz���5���r\Ɠ59x77r�$	/��x�31���ܜĒ���bKu�o�GrW���z��P�}!�
�(
L�x�31��T����q��V��*=�4���%;L�ŋ&��5x�;�|�y�FF�K��n_�{;+��$����/�_�N��x�31���ܜĒ���b�{K#/yw;�����޲'�3{a�x�31��T�����N��G@5���;�����u����:x�;�|�y�FF�򚳼F��y�a��z�zK������x�31���ܜĒ���b��E:<��M��e��;
U�3���x�31��T����m�m���ߧ�z�s���
��>x�;�|�y�FFV�?]���E�%l�[d�
��x�31���ܜĒ���b�؏3O]9$Z��Njޖ-���_'��x�31��T�/��o���T���'�w$�����;��Bx�5�����/��c���T�.r�ߐ�U��i�2	JK��gV�7�:�Ҥx�J����"x��ʺ�u��F%F֒�����v�����̕t��@��27-?�R��(?9��X�JA	�d�.S#��Ħx�31���ܜĒ���b�E/���9M�;��ˆ�)��N��̢x�31��T�e�_<Y$�d��ݡ�5���q�b���hx�;�|�y�FF���B��f޻�ki�z&Qչ{.��{�x�31���ܜĒ���b�+ܥ�X?�������V����y�x�31��T�	vs2Zwr�}��tz�񭑝���D&��-x�5����G�M�f�g��G͎jεB��[VU|��9z(�%@$�(�-ēsI��x�31���ܜĒ���b�5�V?��8+��w=��{_>��Ȼ!wd�x�31��T���в˻��[ZO6��e��Ⱥ_ϛ
����	x�4�����td:0>�ٍ�G,�N|Q~W�	�4�,8��n�<�7�3M ��a���Dx��������c�����Lt��VԦ�
��x�31���ܜĒ���b��z�V��7pZ�-�.�r0|���
t�x�31��T�d��m�3'���0�۸w�uMq*�|���2x���8�q��ȑ��2�Z�/�r�s�Ḟ���}���3�+x���8�q��H�k�W]�孂^�w:5ҧȬ�}3��
����*x����9"���f����Y�z`2�'��MFҼ�,x���8�q�����4�{N��G,7�:Vjh�P�8��
��O��ex�6����S���C
*�
H'(�0��W�gM��}9���,��%�	`��畑�HE��Ex���4�iB���m�
[��U�Q:�t�|�������
=�*x�����͎�� �Y�Kdt��������H���,x���4�i���k��
���X�W+g��̾��'<��
����tx�6���������v	�ږŎn�����ɑ1`t�v�Z(��_6�eGϴ2(���u�Fx������N��C��һ)�'��ܽ�����=��,x������KAZC��m�y�M��A����)����Ql��lx����Y�!��0�&Q!�o�x�۬��`�;w���BHQfzzj�BIF�BA~AiNbIjp	���T�M-��OQ����槤�p)@�
��k��ZQ���Y\�����Y��i
W��9O!�,��(3%lTJjZbiN��X�BI����%���،�)�l�]��e>]��|x�;�|�y�FF�ʖuek�^j�nPp+�%l�B��
�x�31���ܜĒ���b�h�>���3�p�#2���f�"��x�31��T��3���+�����Q�V���\��bx���8�q�����|y.	���EW��)y�o����}��Hx���4�i���X���2�J�,uG'η�g��N<��S����<x�7������<�?R�ϼ��RB33��`��5�$:j�m��f��l���v�s�o����gx��u<ᰡPFR�K	���&��祪+(L~(-��hN.���&��������x�;��=i��ɓ8�7��e����{�.����\�~�U`
5�x�31���ܜĒ���b�8�TE���#�;�;v����
n�x�31��T���~�g��x3#���GbN���D����fx�4�����-ι�V^���ɷ'W����̓	�����h��~�|����L�Y^�)��x�31���ܜĒ���b��/R��d�>nm����˧75�x�31��T���Z��e�r����K˄{��
���x�;�|�y�FF����|��/��z�|����ׁ;��r�x�31���ܜĒ���b����2����F��j�I�9�u��x�31��T��,��s}��1��
Ys���	���"x�;�|�y�FF��},;N���e���J��a�ꜹ����x�31���ܜĒ���b��G��H3��dm���sŤMN��<_�x�31��T�����W7=��
�#�����&x����������k�@a�vos���
��2�aӦx�31���ܜĒ���bQ��E�.��f�۽�к���m��x�31��T�o6��I*1�9;e��
�?��i��R��	x�340031Qp,(��LN,����+�(`P��7��clZr����K���71���ļ�}gvo�d����z�����~^w�������Id��G{A�^�7Y
/�a��xX�� �27'3/;�������9k��
Yj�Y r�.��o�$@:��x���8�q���LNy�D}��N�G
%=�p�������.
����Ux�4�������i0�G�?	�;c�����	�mѼu^��f +n�N�c)?�_�+�ףx�31��̜�b�d)����T��S����g�������BV~~nN"C��+3��>�\��7����mJ��'�V�rx��U]o�0}ﯸ�R�����mTC�ڪE{��I�ؑ�tk���8P>Z�iy��{�9�\c����� h����qv����-@WK%Kx���C�p40����}�|��E�Ұ �4V�r2c���!�^��^���&��7Зls�O�����g����K�J*$�<�T9�V���ˁR⤗%p��ބ�Ĺ�g��
xK��U�%\�纫B����J�䰤w��*pD��2ր�q�VFt����Jeh�2��O�T��@I߾���,�ϵ0FP����4�2�?��34;�X�k���(�2�+=��Ly�WJY,nP�Z^�xoE�>�ߖ�@R	�p|`��Fݫ�p��k���2m�[x��k��P������f���41�]��$UҞ�ٶ�6�^q�9鼸
%�y�?U������;����%�lN��9Q�v�рQe��k�Do��eZ�_��R�=�D�Ԏ�����+'�3gw�Yp�~����k��3��H�o{Ww��a���=w ���͐^.�W�O�}$h���T�A�}f�F5��-��^#~���Bq�js,,y��?C�x�31���ܜĒ���b�ﶪ3��tZv��?���z�"�C�x�31��TV�a���-e~8�w�β_Y���x�340031Qp.JM,I�+�(`����!!o���>W���i
!��Rs�� ��*�����E]��@�ʏL�����x�;�|�y�FF��֌?�L:ī�a	��������)x������LY�I���E�>��숧赚����ئx�31���ܜĒ���b��Y�?W��rgP��~)�'~j��x�31��T�K'g�1���^Ⱥ�WA1���>�g
��	x�340031Qp,(��LN,����+�(`P��7��clZr����K���71���ļ��3�W$�^����;U�)���D�W~~nN"��1��}�Z�e]6u,� Q\������ZT�����~ֆ,5�,9h��7�:a��x���8�q����	-������5��q�7O5��}��O
B��Ax������xn��p�"�8s��/����H
����Zx�����.�{J��A�|Xm�w����X������x��j�`��Yt�Q�ɓDU&�HJn�[�
z����Gx�]�����h:(�T!�H��k�q�E(W�2}100644 Create.php$�ot ���S�T?��7��X��`�'��G�l����t��#1�s��&)�mx����h�����А�NNM#9��|
�����0x���2lC��vbQQbe|njQz��Jr~^Zf���JIFf��]|jEIQb|~AIf~^��������)�L��V���gB���ex�[���qB�Ȧ~�/�<�
}�������:Tl��Fx��`3�z�-��<�#���x�31���ܜĒ���b��<��NK��vLJI��_��4�x�31��Ta�o���������o��������sx�;�|�y�FF���K�mJ]����/gbȐ��c
��x�31���ܜĒ���b�\���خ���y���kN����x�31��T��)�O�*w����˕{Dܛ��|����Ix���8�q������	��#}:���Ik��<�0}���)��sx���4�i�����t"VK�����P��5�_��'<�����cx��d�d��(bX��陝�޷Ų5ȩ2/�$R4Y��ӫ����x�;��@qs��	#��nRbQ���nnfQQ~��J���J
P�Ԓ䌄��b����&/���P9f����`�BzUf����JIbQzj���Duv(g�Du&��!}���Xx�4�������"G��_��ycA	�	��w���S��
]}Νn
"%9�x�31��̜�b�Ƨg�m\�5CM\E�I��a�

�MM���ssZ�^����yE����w�oS�,n!��x�31���ܜĒ���b���ϧM�Ρ��Md�C���G�=��x�31��T�����E2����aͰ��3�·
T�	x�340031Qp,(��LN,����+�(`P��7��clZr����K���71���ļ�=)��O{^n�k:���y��(D�W~~nN"��c��N<L3f���8r��W����ܜ̼�Ԣb�?��=�6d�yf��A�Ծ�y��=B��x���8�q���s�����d]��d��wR"�e����̠x�31���T�ͫ��-���}+�vK��9�7z���]K��SꞬ`2���{���SnF�b%�%�yř�y����V�:�Y�n:��u�[&$�AԸe楤1����_ɺ��җ�XB�m�܇(�)M��cxÿ-�W��[��u1ۖkho�	Q�Y���\p��x�+���tw�v��_�|�������BXj�
�z�L>�W��9ޘZ�-Y4qӿ�c�2�K~���?�Ԓ~�Q��(��_��Ijn��x�����ޟ+�9����{�AB���~[��
���x�����.bu�ˁezѮy�[ۤ�n}���άx�340031Qp.JM,I�+�(`��~,'9�}�����^����(4��
J��/�����>��חwu�?�+?2%�L�x�31��̜�b�E���|����ne�;�sf���*d����$2���2Cy��?}�k�,ߦ�Yy�����Wx�3�����
��#�So`��ůa����m&��ҽr$~�0�G�ۻ��&~����f`�x�31���ܜĒ���b����V�hk=�؛s�k�J�����x�31��T�s_�_������.���E���x�340031Qp.JM,I�+�(`س��5^ѽ��o9�27ϕ_Z���*(57����Ll�?���A.��c�N� �
��ix�;,�Av�&g}f��FZbNq�������JAbI���BL@Fb��UQi^^f^�����B5��ԳUP��K��I-V�FQP��
2�.[�В�+��Tɒ�����М��<�Y�w�Hm���-��x�� �.����Qqr���B5���+��(�����(��)�d�)�$����#����Ys���\��p�N��a��R�X���g�Z��ce��Z��2"5(��i�5�2��d&.��n\���8M��%8Y�[�6���&�'p�M>�m1���a������ɻ��&籜|��o�os-�^��*|j�����J�r2�5TJr4!����I
��dx�k�y(������`�G6�͓X���ML��������
I���{x�4������|O�]3��ݬ�R�=;����	�1���p����	��Ѱ����x�31��̜�b�E���|����ne�;�sf���*d����$2�v�/SfO��uf�u.T>-�h��x�31���ܜĒ���b�)|��_����1a�(���
���
��x�31��T��e3�nX\����)���M���J�����#x���8�q�����E���	�|�4j��pMnGͪ��n�����x���4�I����3R�,�k�����b�t�O
�|?.MT�
>���Lx�;�|�y�FFI�Mѳ3�z}?M[��'=j�f����x�31���ܜĒ���b����g5���jO��9ˠ0LB
���x�31��T���	�}�y�G6�[<xs�e�	x�340031Qp,(��LN,����+�(`P��7��clZr����K���71���ļ�y�_v��+��ȍ�G�f�/]"Qᕟ���� Ug���8�Gۃ�1	juBW��d�e�3��y<g큟�!K�3Dڥ���>I��Ox������o��]
ř�$��d��ݑ�Hڮ����-x�O��������l�}>�>��Ј�(��,<bӉ�w�0?SX�h���%�|�C
�E����J��-�i[�s��#��	_x��d�d� !��t�Aď��A�s&���{p`���U�����Θq��c���O�140031Qp.JM,I�+�(`���;�2����k6]����E	�W�w�߉65Ji;>gr��#	�rZPݞy�%�99`�='7i�\����C;'�1O�e���FW��&x�O�������O�O���P�w/�@�񆭑,b�3-�$2Su�/�D���$呢`�V�A����
��m�\#E�`��s��$'�
��Fx�k�����dk&��L�9�޲l�Ͷ��>3MA#�4'GA��VAC%-3'U�VA%3���D�.=�Ŀ�$3?OC=L�kjj*Ts)@�JIFf��]|jEIQb<T����Ԣ�Ĝ̪�"+��
h�Mk.��K�D&�Wb���'GZ~Qjbr���7b��m�kX'�1��IFC�V!3/3�
���JM�ɺ�z�cd���I`���x�[m{�z�O��W��73��bH�����x�;�x�q����Q�.+6	�M	z����*��
��x��Umo�H�����B�S���/His4*�頢�N'E�m�q��/fw�֠�wf_�:����Ҩ�3����3���uUO'LJ�S8�s]���*��5��ݍ6��^���Zx�C,�G���#J��k\�
�����t	�"��\�5g�T��p��3<w����o���NP�#eQ�#XSZ��E�s\+��ɒ94�	�� W9�餽��QY����
7-�d\�iuƨf�J>ʵ�-�e�s�`���9�d���)ѻ��.wz�����38�N'�I�5��h-sZ�9���M<;���"\��Ԫ�[YkE
�ͤ8�����uQp�*�ZT�]cbW
?�����*����_�3H�'��&a6�O'�`�‹��_|�N�\�����FK�[盯U��Di�Ơy=��	�-L]cT����:���	��S������F�U��eǟ�9xݓȹ�-��5]��;2�.��P��fG��K�J&h���
bx$�3ڻY����l	��K�!��B�d>���I��R̖{�?�����0��j�bT�%k�쩾��O�>�0��6��~�p�*�o,l^�kB/�f�Hڈ��9��F��4^�	R��}�ߝM��`��}�o
�,!�x?(�����d�$�n����cc��������,T��͌am�7r�����}E��y<YJ5B$�x[>�Wx˭K��wv
�@�͏[�tG������n��f���Ӂ.��:ME�\>�~�������K�
lW;tW��0�%hZ��ў�ГK��ꛔ��1;��8J{ۥ{�#d���"�"4)�(�&��-Tf<��*
k9.�^��bP��ipP�|�|��+nǛ�wo^�Oj	��1��,��i<�4м�A�A��w�>��+H��OjI��7X���4x�;�|�y�FF�����NjJ�8���ң�?:Kr��M�x�31���ܜĒ���bI�|�=,���o�y����k���:��x�31��T��wK�u�=�oܮ�s���t
0��hx���8�q��H0_�s�,S��wl^%X`����n�
)��Jx�F������<��:k8SXu�E{�V���IS100644 Versions.php7�>����wYB�h��4�� �����x�7������!=����oM{p���}��`�<-�o��0a�LDG�\m#�s�)����x�[m��z�2+KIjq�f5�V	9���x�[c�f������`������|���&&�`N�P7�	mo(x�k�n��P��TZ����Y-=�l��gx����g���O�g�,	l��(x�[d��|���<�-""����
x�;�|�y�FF�W��^����9�^��%
5�x�31���ܜĒ���b�IE&�ڋ.rJvS�:��7:6����x�31��T���wt-�>�h�n�Ym�N�m�͉���Bx���8�q���ˏ��c�_���T��t[]w���?
��$x�F������<%W6�F�K�5ɉ��"�V�100644 Versions.php��yR�3o@N$���VTp�� Ѿ���xx�7������!=����oM{p���}��`�����"`��ӆ2�;�o�ٓs��A���bx�e��J�@Ʃ"�EA�6�FR�6��	��J����
e�l�Ŵ)��X���<x�x��ɛ((x�D4���2�|3|���������w�PB�\
���pL�h�OΈܓ��:2�?�
�HX�����1�{��Ph�擣�KԈ��W�*=E�'�y�>��/��rJ�q�w`�/ɯ��4_��p->���즃� e��5��a���\bCh]�S�L
�_�u��EUPN�������0�nuV�P��
:�靣�if��������d�Hzȷ��gc��YA��9����k%RӰ�x!�.KR\�|��s�+�{ �
*�e�%|Ta�F6�UC��6@m]��Z�a+R��y����(�|�\�u����Z�����x�{`|�x�*�riq��W~~nNbI~~Nq�s~^q~NjD,&�$3g�2S�$�ee��Z�X�������������:Y��`�t!�͌,_�p+۬ɽ��a'��	fx��h��dC�8gr~^q�������c���Op|�k���.+a.I��*����=Bũ9iVVH2֓��IN�a�/�,IL�Iݼ����B$�D�&��r�+����a�w;#2u�tx��c��dC1�d�k�������c���Op|����;���ĽB��1q(�[sq&���( )�w�
V��r
f����������.�������7sW1۹{��{�;���:����(g(��;%�$g�槤�V��()��9{8��'e��&g�+l^���
R=���dx�;�|�y�FF��R�"���X��:���M��ئx�31���ܜĒ���b��%&!���?�Yf����kZ�����ɢx�31��T�	&���&:-2\��)}���$u����Vx���8�qB�����l�OgK-C�f�?����`b�*�U
��� x��g�j��KB� ��$1)'U� �$C!-�H�+??7'q�t	O�j. ��LS�PWWP��UИ,(%1Y^�jr��gZ&T���޸�;Jŋ�e�RKJ���Rs@�4&��RPW15�@AO��3��9�?(2>�5�1��T����j�\ �Υi
����M�4���5x�;�|�y�FF��K�X_8X���op32���/7���x�31���ܜĒ���b�u�����L�gI��uZ�y�V?����x�31��T��=�&.d٬6��,��UV���
�����Qx����9���τ
��!��쉗�Su1t�MF�B@��Mx�F������<V8t�~ B��ݕ�)�v4�~�100644 Versions.phpI�96%��6�b:���(彑� f���!x�7������dV}���7�r��!J��u��`�S�W�[52d�ǜ����`�*�s������x�E��J�@�QOI@ԢB�LC 0�[� Իx��6����M�P�|���
�E��M<y6��f.�����
~/�߬�"S��h�P�{��0@���3A#��춼`��Uu0���H9���S�Ź�s`bL��N�Dh�1��*�4�!��KK���ˡmje�/�����x�q�Aqf���wTmz��ҡrZ$�������Bp�@� &i>'Nc��
#���%�_j̕�B�C��y�t`hm�忚�����ǨHR���ע�mQ��������si��"x��fw�n�2+KIjq�f5V>.&��,7O�wff611sD��x8�
u�3x��h7�n��L�('�9L�7b����bx����羁�9�S_K��SAK�9'?/U�$�(=�D�(� ?��$��$�w(K,RH�����8��KR�KRST��ZmJ�JS��&���ج�\�bͩ�v�))�%��y\pQNu�Fu.N�X^iN�?���#BX��L�ӊ3ANS��ON�ɩTHJM�/JUH,)I�Z�����W\��<�Mb�"� cmm4T�s�NU��+(-ѵz�.�c455����
0HJsS�J���uu!�bAFM�( :9�S|�\F C�)?or#�,H���6��'��R��Y�k���Q�|L�
�u��/�6x�uR�kA&���D#5�a��ײew��֓��J�Q*�+*�"��d�]�̤���bK�����U�EeO�'^�?DA��4���������7�����r�^�cR��؍0$�X�i�!%�ЈBH�n
3�2�;�iB�
#��5�9������!��c�(+�O7���B0=�_M��'m�ўPb
��ބb0�G`YG���Pɬ�J`��C{�R��Q̭��Έ�3Y�i��BJBA��/3�OT=� �>�c x�7���Zl1���]<)�lY��9N)N��a�l6
���O����Z��I�b�(�[�\�mg����E�t�)ZjE����mq1+��+�����䥊2�(��Y����p�%��N6���I�ŕ���UK'R,��f��2���8��N��t<�߾�����R���v��a�eG�4
t��Qݶ'[�u�P\���.�B�����vU�Y��4���]��h��%n@
�B���E|��e�y����y�G����/�\�A��3x�;�|�y�FF��G�M�[5�\T�Ӏ�G�S�
w�x�31���ܜĒ���b�_��2����_Z0�͓�a1z�P4�x�31��T;�,S���-M�n�0<���S�4h��Ox���8�q��H��e�涍��.skl�~�q�=��D_7��z��|x�����Z����~�Li����_���5��H�y+��ux�7������W�X�9c^��5pgg]E���`�S�W�[52d�ǜ����`�*�sgs����Ox�R������2�!Q�m�Օsu�&��\2 40000 binU�9���	��O�{]�;�o��	��
9�䝕d�{M�&O��=��$|�x�31��̜�b�=M�7��ϯm"���7l�CsSS����ܜD�����e��IZ#���΅ʧ��G�x�31���ܜĒ���b�X�s�?�M�-{h�`�G��~#Hڢx�31��T�}�5M��ߜ�\���ž��4�L�	x�340031Qp,(��LN,����+�(`P��7��clZr����K���71���ļ�e�Ol�=�Sc���g3�)qL�u�������Id𱲟m��l�eh׌�'#�@W��d�e�3��y<g큟�!K�3Dڥ����=L�x�31���T�s~����l�'�0��B2ߏK&`y�ĒĤ��T��'+��.��k��;$蔛Qn�D�kEIj^qf~ǹ[>���%�9?�f�ה=U㖙��Z�p���~%���K_��b	aP�9r�  �4=3��
���^��2�o=v��l[����'DApfI*O���7s�&:<\��o��t�݆f&&
a�E 7�d0x��4S]�cv;�J��s��2O�B�	��/.a�q����g�>�e߸������jl����qx�[%�_|���Ìr�����%��y�\�ũ
^���9�%��9�1�y�9�1��В̜ɁL�A+��Ԓ�Ē
M=u���<}��̜�b����6Od���O$8�nx��/~\|C3GHjnANbI��*fWZK��x�340031Qp.JM,I�+�(`�Z1Wg�������iE����aQ���_Q5G!�U��ӎ�X�n
)
\�	A�x�31���ܜĒ���b��{'Z�v�9��sCП{��m2V��x�31��Tm���߿>�2~�ˆ=Q�'�r��	x�340031Qp,(��LN,����+�(`P��7��clZr����K���71���ļ��C����.О��r���T��
���ܜD��/��,n�4��x[ƶ�l���� 
�+ss2�S����<�����ڐ��"�R���č=נx�31���T�K}W���9ʞ�y7{ӹ�	��%L��.�%�I�ũ�>�,���L��
����׊�Լ��<�s�<|&wkKjs8~>�ޯ){B��-3/%���Tu��J������S� ns�>DA@Nizf��m	�r�ex�z쬋ٶ\C{�O���̒T��Bu�;�?�1�ƺ\P����&C3���"���
2
�M]Ym7�A��~�ݚ��s<�>����_\°~���{���u����f`(q����(x����!��ז&V�q�������-u��
[�	��hx����RyC"�phIf��UzjI@bI��������&^%k.N �LS�HK�)NUP��U�P)�R�U�H,��**����K����T���眼�W��d�=^	�D�B*�$er�@���j�AL�ʻr�B����L%�+����_x�����.�����k�r�W�>�m�����$��
��ax�[cv�|�R��
��
@�������S���hk���R�X��`���XdeUT����������Pͥ�8!*�l���2sR�խQ�*��LŪ�V�85'���J�sr���`fnA~QIqt,P�j�i�D/�N��Ox��S_O�P[д��h|8�J�M6�M�'�B�	���X�z�]��z�-0
�W�K��&}��D?��ďa���6P�7i�{ϟ���9�?��>kJ�,A	j���=�?H~(d���
vQ�%<o�[,B�Nr������5�A1�!#��K�������\�l�.,�<x��Q������nr�^��<�^��Y�^]9鐯	^��2�5�w�"�-��T�Xm���|�!�F���{n�e)�:z��b�r��"r�`/Y��D,%<`Y,�<`���(^9�A{)N�H�E���k�>'h�H3l#��6PA��s�|�ث��,U���=;?)Bqa(���W�D��cSׅ���Z����:Dy��7PM�#��e)�(j�Pf�AK:��ݼ��+�%mi1g�S4���Xa$c(�4������r���WG���a�+�'J����-W�0�H_y3V�c�.{�
��X�FP�Z
��FwՖO��ԛ*T��CY�d"s�
���hib��6"M.�ɼs�O���2�9�9���
j���U��͍��rۼW���D{3R�q���`��"v^%lvnm� (���KMȗrR틭��e=:���3��D�dmR[�J
k&�j�Mp�{��$�?�B��>lk�L��)��Ԃ/��T�>
?��u�7��t��x�340031Qp.JM,I�+�(`�z[x��5��?:Ql�t�jC�����2��9
a�r�o̞vL�ZtS�Hi��Ld����Lx�[���qB�H�����Ü^����"p�e�N�f��e��dx��TMh$Efg2�L�.�k"A��Mwg���Q2L���VV�ő����L-�UMU�d�r�*�M�(^D�^Og/�W���E����A�>5�}�}��/�O�|�����7���`~,�J�fw����.���o�������a���Ay�Y^ܳ�,Ej�JIO\�<�9w��#��ʙ2����p�p鉳	b�ñ3A8AĚ�J*P2n�TLp?�&�	���c���N�-d��M�DƠ�a�r�cg���#J�u� ��|�x�;-cI�F
�3�l�$�F�c��y�ռuT[�$�2e��,C����.�M�����j�������0`J+7���{Kޓ��2G�>��<+)��Z�Y6�,9�A��r�5�m�6��2�/�f��Sa��c��y��
�}vN^ʪA����~��	�FT)2w��76N���\���C����$��r�>�F�6I����3lͯs�ʨ�YNh�V�ͷ��^?̌����G���џ�S��OV_wE�����#!�s��vH����v?��m'b��1����Z��½ϭ��h��ͼm��5�jb�!]�c@* ��9�Җ"&�+�Ft���ȫb@���<m�?�w�G'�)��5r��wJ%ML���p��F�Q��tף���Z���l����7��������ɧk��A��i���_�y�t�2_[�g����㨗$B�bݥ���B�.��U�B�r4�S�@�S�=��@�:�]Ac�x�iZ��̀����ӎ�\;dc�L�tE���P�D��EU�)�l��`��|�ªY+.�:�C$g���M{���ad���:8��Ӯ`���{LIZ1mF@��_��dST��C�tޱ*f��l��ް��D5:���b>����~x����������~x�;�|�y�FF�Ĥ�²��(-ͼ�$�0��#
��x�31���ܜĒ���b�)_R�p���`&�����K��T�x�31��T��0�'�:*$V~���ߺ��˽{��fx���8�qB����E�Ǐ��X���1�&͉y�̔
B���kx�;�x�q�����"o�9�<���-D�>˲��
g���x�4�������r��Sd+�j�`����f���	��ZL|ρzC_���N�����:�x�31��̜�b�=M�7��ϯm"���7l�C3����ܜD�����e��IZ#���΅ʧ��F����|x�;�|�y�״MG�2^��?:~K�Lj;��1�f&&
���ũEzY�y~O^|Թ�t�oy��8ɦ��
s���u�=dJ�Z�~�/��V���'G3��<:�+{�0׮��{���g�z�zE�;b��
x�3������]��뺱#�xWo`:�+��	���|0�Iz�=�$�rŽ�\��Bx�;�|�y�FF���O)��_�����I���3
��x�31��̜�b�Ƨg�m\�5CM\E�I��a�

�MM���ss��~%Nz뫫�GO�yr�x5o�dyA��x�31���ܜĒ���bi�]��#�����PQV��a�bâx�31��T�O�iǶ��nY�Q�O��3��՗n�	x�340031Qp,(��LN,����+�(`P��7��clZr����K���71���ļ�<ɛ*7��^{t*yCʌ��H�9^���9��.4�-��[h��uI�}
�����ܜ̼�Ԣb�?��=�6d�yf��A�Ծ�y��=D��x���8�q����+�=3��{�;�*�y�	�ĉ�n�9��+x���8�q����D��c�C6ܬc�c�([�2u������x�31���T��%�Y��%���6Ezk�ꎘ�&`y�ĒĤ��T�@�|�a+���X�F-��_�Q�ZQ��W����PyZ^n��e���_�eB�D�[f^Jjé�����/}���%�A���}�������<�7��z����Y�m�������%�?Χ�Q�;�>��ˢ�����d�������BXj�
�z5��N�5�o2U��$�*`
Ę�����ٍS���w�)�r	���g��k���x�����W��������O�r����9
�C�<��*x�����ޟ+�9����{�AB���~[��
���}x�6������Fw�[ ���[Tf?j�����,bP�Dk�z�-r�aT/�9)ρԒ�������x�[%�Z|�KIjq�fU�Vv57����sx�{`��xC)�dfɉ{�6��r�P��x�31���ܜĒ���b�~��;^,;ѧd�v��CY�f��x�31��T��9��g'�U4��]��-�>�x�340031Qp.JM,I�+�(`��~,'9�}�����^����(4��
J��/�����tB���s��*/�����U� ,��x�31��̜�b�E���|����ne�;�sf���*d����$2L=��J���WW㏞���L�j�����٦x�31���ܜĒ���b�tם
?gu�L�4�˾��-�>�x�31��T�Ο�>\��S�m
�</۾<�>\�x�340031Qp.JM,I�+�(`�Wc��0w��k�8���auo��`�!DUPjn~D�'T?��,�>�[��\���{J9����x�;,3Wf�1����l��'�833��9�?���4
~��7x�;�|�y�&F�!r5m��\��0�K���,�.��x�31���ܜĒ���b�Y�%7<�76]���14+���ۢx�31��T�6�_���O,_��n�q9����N��x���8�q��ȕ{%��徫�kv��e���sh�������\x�K�����S��HL��++A���)��gM��ؙ~�e�g�4��t��4ιN�&k��ς�#�Q�BԌ� G�Zx���������V9@���*��)G�� ��,x�K�����Sy����)v5��߮A��cF�gM�o�P�pRx���1��7��%��4�\jAI�
���4:~WJ�[�\��!x���]x�6������Fw�[ ���[Tf?j�����,bsJ��%5���c�\|20@��硽��x�340031Qp.JM,I�+�(`��+�5ͣ��ω�����b?ecQ���_Q����&6��O��� ����^^� X��Yx�3�����a��*���"��

vE@w�	��T|�<k��*Л�/�D#�Nx�x�31��̜�b���n�����) �/�rZ�φ榦
Y���9�S��'�����'�<9S���t2��E���>x�3������J[R��2Ly�����)E�^�� jw�z5U��|}�^�P�W�ީ�����Sx�;�|�y�FF���?�"OzV{��������ݦx�31���ܜĒ���b���g�ɽ�t�+��Ƥ�����o�x�31��T��ME{7?ty���̜ͬ���x���8�q���a���˔��֙Ƙ8s�h�����\���ux��d�d��'�E�r@6�p����rڲ�윸�9�&���mx�k�n�ޠ�ʜ�Z�Y�5^-��x�340031Qp.JM,I�+�(`�Wc��0w��k�8���auo��`�!DUPjn~D��0W��7fO;&b-�)L�4pa&'�����x�;�|�y�FF���ߺS^��|���E�u/u��x�31���ܜĒ���b�7F�,��M������c�\�e�x�31��T�%ׯ+M�S�<��w1�ީ��s
��[x���8�q��H���=�O�~[4\�p�9�N���n�w
6���Ix�;�|�y�FF�e�ի��Y�r�k˒ݣb-�>�%�x�31���ܜĒ���b�v~�"��l�eL��En�l���t�x�31��T���{֖,�߾@��_�ɿ�M�2���Mx�4����d)VFXݲ-��8�=���x9�#5�����	��j�$;�W<���Dx�������бo���=��Z$��W�_����x�31���ܜĒ���b��46�i���|�:��x�c�r���x�31��T�ߞM�ǜo^Z��x����y�y������>x�����\�j��U��M�|�TQ.���H���.x�6����/Qo�V�xW�;Z�/�W��Cq_����mP;c:��n�b�7���H)(f�Dx���4�i������ϝ���im�����P2>f�	��2���>x��d�d��(RU,��_��]Eۿ��5gh�xM��¨
̇��.x�G�����);@ �n53��j�E@�gM�e100644 Listing.php��S#�y��q�?�~�"����d%���Ux��d�d��'b��!O��/�34��5C�L���9�I
����^x�4����dySq�h
�0"��ѵw��$�x9�бo���=��Z$��W�_��o�o��yx����Kk�Z&�����N;�����>x�L�����dx;ʩ�Qr���X��U�x}y �!/yov-�����G���	�q�Bm�(�y�����(5�.	C!��\x�4�����A�4Od����w3��t���	��бo���=��Z$��W�_��j��Bx�������BN�ߗ9e���r>��JF��	��0�x�31��̜�b�=����B>\�Z�pGц'�榦
Y���9�S��'�����'�<9S���t2N�J���x����qB���͕����T?�ߛ������dI�ĺZ�A��,x�3�����b�����?l`һ>|A|��	��6x�wպ%�l�U`���4�D�l��ax�{��i�&U���/">Wm��Sx�����2������>� ���x�31��̜�b���J|����7�qlQh)u>�oh``nj��������0���+q�[_]�?zbΓ3ūyK'=E�x�31���ܜĒ���b��b6��Ϳ�ܳx3+W�����
��x�31��T�M+�e<�M��-�r�ޱs���h���ax�������+ULy�͕o�X�酂�ܦ����x�31���ܜĒ���b��[�TZZg)o�ű���EB�b�z��x�31��T��K.x���p�b�
��/�����	x�340031Qp,(��LN,����+�(`��=�"�a�X\��Ʈۉ3�11���ļ׃QOj&j.�Zv�]F�Ʌ�Ȯ�^���9����^,��|K`��+��˦^�Q\������ZT�����~ֆ,5�,9h��7t�=����[x�������+ULy�͕o�X�酂�ܦ������Ux�;�|�y�u�6E�)�B���N-.����p����׷�n#�,x�;�|�y�FF/�٬��ݳ�^8',��}����
��x�31���ܜĒ���b���FOT�;�M�U>��B�J'���x�31��Tg���ΪWu�	��Q]�Lk�to���%x�;�|�y�FF��J�"‹�Y�.�_�*����6�x�31���ܜĒ���bU�w)�[��sO<�}�0a޽&"��x�31��T��zҞr_>s�ҥ7��Լz��
���	x�340031Qp,(��LN,����+�(`������N�|�Ϝ�n�&�~^
{lb
����y)L�6��|�0g�!��4/�,� *���ss�N����ϝ�o6s�o��Q\������ZT�����~ֆ,5�,9h��7�Y=]�x�31���ܜĒ���b��r{�w�z����3���9�&"B��x�31��T��'�^�r�qFgr���e�������ix�;�|�yB�H�m����b�SD��m��� ?�"��]k��"�u��fp-T<���^����2����
����Ǒ
�NlP340031QH��-�/N-��*��c��{��|���E������I6�GW����ͰΗ�#�!Sz����}Y��:�|?9�1L�d�׽ܻmym�cޜ~��G:Nb��Ax�;�|�y�FF�?!g��stV~�<3���lμ`��]�x�31���ܜĒ���b�3���=V���,r ��9��+I��x�31��T�#�^q�l������7���o�����Dx�;�|�y�FF��!m<�=�6�<���`��f��
5�x�31���ܜĒ���b��>�8�ŝ�i��.��4q�uU4}�x�31��T�9��l<�3e���iU"O���4����
x���8�q��Ⱦ6��m�;C�nQK�����e�D_7Ð
#���]x���4�iB�Ƚ�Ϭ��&�]�ۦf��qhb�J�,
��� x�;�|�y�FF�K�kf��Ki�����/���?oñ��x�31���ܜĒ���b��[fIw��X�=T6�{�\��q
�>�x�31��T�5��-�a����Za!�`���~_؀
����ex���8�q��������sS����0
(p�^����
���[x���4�i���qywҺ'�\�h����6+��'<Բ���zx�^�����=�o��%�F�>6<���zN��100644 composer.lockֱ�E;��a��y�pO�C�[V����9�R��۰'1�;R�4�(D�mx�;�|�y�FF�K�kf��Ki�����/���?oñ���x�;�|�y�FF��'=:�*��߰صbsOة�j��f
Ϧx�31���ܜĒ���b���ӫ
�Ğ\�`��y˥K�'�~���x�31��T#���<��o�|D�=�+�_X��
E���}x���8�qB�ȿ��s��Y��<�@�]j��<�w
Ӧx�31���ܜĒ���b�濲�6�a���}xź���y�x�31��T��o��kW�W��,`LRݾ���,+�>����~x�;�|�y�FF��E���l�O�8�a�β���{�\
��x�31���ܜĒ���b��Aن7�^�������}��o]�x�31��T���=&�0߻[�Bg�����˛
����x���8�q��H���-v��[~�|t�4���j��������cx�;�|�y�FF��g33]�o�`�9+���M��:��
���
x�;�|�y�FF�I���$W����^���Qx��R?�{��x�31���ܜĒ���b�eG'v��e�pn��G�&0��ʐ�L�x�31��T����,�?�z�ri,��w}�Ι��
����x���8�q���9��ɻ�v�=�QSg�q�;=��
��;���x�;�|�y�FF�ӉgC�\V\�9���,7����x�31���ܜĒ���b�9/غ6��ϗ��k��si�N]��
��x�31��T��3w�?�ʹ���5n|�b�ڐ
����Kx���8�q��� c��&�/Vmz82�Vj��3�����
����{x������7������^Sc���W�ߡ��H�(����Lx�{��i��KƦ��e�����	���X��d1Fן
<���x�;�|�y�FF����n��:��4٬�8w�빵��
�x�31���ܜĒ���b��/�d��E�7hX._����^�x�31��T�,�7*��.yT�/n2�R�p�#9���Wx����9���.�~M��#����P,�“�MF������	x���4�i���w.��'-Q}*�<G�Ģ���'<��
���Xx� �����ʠ�`���,?�w�7�Ɵ�R�LS����x�;�t�i�!55��=ڛ�
y�1ro*����Ix�3�����n�O5���W�����ƽhˑ��p��җP��*�*� K�{�]��Cx�;�|�y�FF�EIu��������8)Y�2�Im�����(x�������9`,�j���ڼYx��滧wŶS�x�31���ܜĒ���b�W���̘rĦ��S���_� �,�x�31��T���v�,�u>=!����w�y&�7�����$x���8�q��H�.�̝&�3��;��oɡV}��xU���%x�����85\+��n;[������9���H��
\�.x�������$薢��O]�5�r����k��H�S�,x���4�i��
��,�^*�Ƙ�z�<ܭ��t����
G�*x������q��m��,t6�w��ؘ���H���,x�����EG~���[���B��z���Hň
��,x���4�i���Em��YI���������0���}�*x���4�i���*9s���>�/���>�Vn6��?��x�31���ܜĒ���b��3o��̾'�?���l�!��)�
�x�31��T�ޅ��}"(���x/Қ��e+ȗ����Rx�{��ɼ��Q�'��$3/]� ���������|-�}�Y���'�ɶ���tJ�:x��d�d��(����S�V�����9d��%py��FU��
c�,x��d�d��(b�2��Y���H�O��v���&�0���,x��d�d��(2E-t���:	����W�V��[ONaT��ݦx�31���ܜĒ���b�=^�U�	܌�lxDy��e_ur����x�31��T�/�̽N�Nm}3o�"��n��P܄ ���x�3�����n�O5���W�����ƽhˑ�����8�z�A����ґ�6��X��Cx������1�V��~w�C��n�3��Ӧ�¿���x�31���ܜĒ���ba.a�W�x��u.�y������x�31��T����͕AW�+o�U�sO��/l�x�31���ܜĒ���b��+4��}܌{���]y�}��O��x�31��T�o?o
s�ڣ�q�u��[�n����#��"x�������0����+��2�ן���`�-¦x�31���ܜĒ���b����w��E�(8#�V�y�ZCN�x�31��T��s$�����z1��+����β��
���x�{��ɼ��Q�'��$3/]� ��!G��g�!�K��u�zx���ɶ���a����&x�[&�/�a��N^��-�B&9yJ6����y%v��%��
A�yy�y�
�y
!��
N�V6�05J�֛'�0�(����8x�3�����n�O5���W�����ƽhˑ��_�7�99l�ZeSB"���Sܡ4e�x�31���ܜĒ���b��1����mٗcݟ�Pӗ���x�31��T��ޑ݂,v>��w�ӟ������:����:x�{��ɼ��Q�'��$3/]� ���Z�6nۼ�uW�ܽ�p��鎏֦�mU����)x���ȶA�I� �(5���*9?/-3��(UCӚk�,S(bJ��W~~nN�BqfI��LZ0թ�ɥ%�*�y�%:
*��%@P��r�r+���x�31���ܜĒ���b�-�Sg=���� ��ֿ
�
N���l�x�31��T����=Z�e��9�+�DӬ�T���x����9����͚y����u�1�5:�$��MF�w����Ex�U�����/�4=Ü1��D������/�đCR3�ʿx��4E����.-�CA�40000 Site�cD#��\N<M�Nx;�����Hp�&����x�{(�\x�)�{f�f#���5=����x�3�����n�O5���W�����ƽhˑ����O��)�â=<7D��B���X����Dx�;�|�y�FF����_J��,w�����3[���Ą��x�31���ܜĒ���b�|��o"?</��Nl�jٿ��V*Ѣx�31��T��\��m��k[Ωp�D��~99������Fx������n�O5���W�����ƽhˑ������.x����������!�И�F�_��v7��7'�x�31���ܜĒ���b�	s5x�ڄY<�p.��-Q3��
`�x�31��T�3O�+�x�?+p�/��M�
�������$x�3����9�f��$�<��ou��䘘�M2��ȃ���sk�+��Aj���O���<x����������!�И�F�_��v7��7'�,x�;�|�y�FF}���;��̏4���岂�t�"
b���x�������9"���
Ǭ��{�<1����7x���Nx��'|WxBc��D6a�X����+}���r����ܜĒ���b��\��ԲԜ���"}��~r~^q~N���BqfnANfZfj�ąm�Dj/KL/J�+����ȘâC���߳r1���1Y��U��y���9�%%@�&8�c��.�yk���Vx�4����d�	'i�I%���8�
3��]vޱx9*��1�b+�6!F�0^����a���Dx�;�|�y�FF�蒅��̻�O<Ɉ	y.g�`Y�������wx�;��Ky�1֒�����Z ��^��&
F��������\
Z
��E�e�)
�
A�y��@VAbrvbz�BI�BBV~~nN"������\���Ԃ��̒��J�Hl]�6=.1��%L��.����� #-�(7Aorc*�7��3�g���=	����r&Y���x���t�yB���������
�B�Nr%�^��640031Qp��	�t

��s��Ma���z<����L|9\a̾�N��Xabd�`tI�6��Î:��Y��;xL�@!)3����N����
��V�-}j����{%PK���RS�3�K�
��6_����T�ImW���¼J}Ĭ�d�r1���E��M�=�G{�3�z��R���Rx�;�|�y�FF��oR������l��
����k�+
����x��#|@XS1:8�(55�8#�$VC���+�K�/J,�-)*M���ڰ�m�J�c��m'��P�<�Uv2#���s\\~���9�%%�E�'�*O���0h ��x�31���ܜĒ���b�
L���6�-���m���C�����x�31��T����앵��*����(���_�K��
����}x���8�q����vH�[�K�t�J�lN��l�D_7��A�x�340031QpL*.)JL.qI,ILJ,N�+�(`�s�m}��9^��__��_e^>��ޥ(��悇���u�\���|`��Ͽ+P5�y�%�99`e+��ٹek��o5��bN���&E6��
��x��.?OyC1��nA~Q���P��j/�QB�1660���R0ٖYvr?+���,gX��F��m�42�J4'�f�d�y"�gFv�[��ɍ�&� �%��L A�&�������(��dd���V��ځ'+��O��bۼ��1#e��*�'���A����Tx�;j��t�R����[��ɋxl����gy~�2r������tx�L������H$�nZ��K�?iDsm
��`����-)%@m�G��$^�I�8�,�\=P�Y���3&}!�o�3�"7�\x�{��iBF�*���	Y^ע+��Ό����bh``fb��\��X��W�Q�0iʪ�7	�]4C���L^��!U咚�
Uu��@II�R&���8��[�Θx"Q�2�u�@l�-�$I�n��w/�p��l˨
��4����Ox�[hs�f�������JIFf��]neqa��]A~�fn~y6q�r%���Hnv���������.x��WKoE��ر�rl%r��
��bv�Ύ���H"qC����wz�ݳ�*q���"E��qȕ��Rr��D~��gf^��9x�g�������s����s}g��{`��/�B}O�� �
c5�%cT�_`�`��o��o�"���Y̼��F�	��Y�l����b&�R,���K�Ȗ$�'P�l�X�cW�2������}��yun���>Tc��4���C�Be�jH�K�j�2��W��
�KKK�]}?�Ɛ�M��M_V���!S�:��gA�(X��%?(��
�ly^H�ʌ�0_r�A&�h#m ?SJ������ا�D�N�%�$�\q�;���N
��@�u۬�4��w��%���)���DY� �P�Ex"��&���%d�"��Tr���T, ���1�w�#e܌���6I		+�������$��_�Ѳ��+v�N��ĘN�e�#E����uSf���P�:���w7֞��X����C�hn��X$+��%��J
H�K�hGgۜ�l9�]M��#�2ŕ�Q�F۳��;0c�D?)?n�1(H;�X�M(������g4= ���
��j�C����{Θ�,V�F�:>J��O�*�fOhw�%PW�n,�Nf�@b�����}�<�W2������;q���C�6�@�԰Q@�!�uX�:�H�5��uha�fN=��U���t\'�_"��8��R@�zJu����[���%1��<��O�t��pU���ڳoi�]Z[[E��I��sa��\D��"�!�u���M���ٸ��e�˶�9t��;;��'���΍x������%���+��g�ڵ�LCȪ�@=��-
j�q�j9�6�=�y1��+�&��_�]3�|J,�7|x�!�up��*9�Ӥ)2A�C��=�~]C�?x�	�>%z���A��Uߍv2y�PMH�$h28�i_��O���8���#��R8�
je<NXP�+�G�G$iau�,�h����I�G���e4�a$�
�WC�5k%m`�Գ�����6ʰ�^�S��9؂��(;�~+�?ON�}��΄�����ed�]K}���+���RNdԣ�qu�h�6�L��4��o��zg�]�Yf�Ĵ�+�ǜ�F�Jz[���GV�x�6mS�T�;X����5�]j���J����퐓���zd�h��䘷J�
A@(�']��������3�w-DזŞ�3�(#;k@�sh"oH�@����3˶-T��vo�f��z13ڜu�O"x��N.�S8��ije�J�aHuW�@��U����%Y��w9'#�mǜ�C��2r�����1�L=��j���c��7�?}SJ=οگٽy��Pz��G�=�i��/��꾶�*{��Ӥ �sr��.���{�6�֗�g���\��泫��ڔ֜-E��ZwQ/&uVu��U�jm������V]�Fr���u�X	!���Mz��87�*H���& �� �Z�EHMz݋��x�fm���&m�����[�s]��.���e���z�B���
�ؿ����X_��Bx�{f��j�Q���E[�F�����wx�{&�EbC;'sA~���WL=����\x����qC�sA~��t%f0�N��.�Ub�Z:�K�$:�P���0�x�31���ܜĒ���b�gwn���2o��µֳ}Z��}�#�x�31��T�����_)V_`r�\o��α�x�340031QpL*.)JL.qI,ILJ,N�+�(`0�~P����/�Y��X��6C�z����+��󫯄H7Ί�s)�܉�~�WA�x��$�䀕	յ���1��4�I&��׽[�25#���px��.�G~�I֒����'��E'x���Ex�;jz�t�I֒����'�HCY���Ox�[h��f�I֒����'#d>�>��]x�{f��j�I֒����'Oqm��}Fw+
Q���x�{&�Zb�I֒����'�rC?����~x����q�I֒����'��B����wx�L�����d6��v}�n�4N��
��x}w8�Y6���qSN�2��8��	�lb~�z��r%ّI�ξ!+� ��\x�4����dY���fUH�u�;���D��x9�08�9�<��>����H
`?c���Sx�ۥ�By±��[&�0.eT���q��]L�Y�̙I�8wq�]�x�31���ܜĒ���b�U���p�ѿ�H�Ѯ�?&�d[&Ģx�31��T�]gN��qm͓��-���
���	x�340031Qp,(��LN,����+�(`�>�L��W�0���Y {勉(8���&�0�[�*��=9ן̒��G/�D/f��������Id���o�к7���M{7��ʮwO 
�+ss2�S��n,��.�4�F�D��[�����0=����Ox��j��d�#��fqƍ��%��9śO�oo����\x��������F�k�^i����n��g�K�.x�F������<X�
���Hm?{�����_GY100644 Versions.phph3�	��%�`��UC�� C�x�340031Q��+.I���+�(`��T}6u�
�u�7��=��[D����'�������V|ˬ�W2��~6�f��u�V��мL$��D�U+�
M|dY����r�Y�.�,2���Hx��$�"�A�e�.ˍ�<�m-���Tx�7�����j�o�Q�W�N
���L���`>�ف�5#���-�]1�0��L��Il�vx�{fu�j�d�ͳ��)��l��^x�;�t�iC:��<�ے%�J���!x��k|�x�����~2�����o�����e	����9x�[���qB�H��ܝQ�>�8�ɿ;0��:W�%�j��[x���yZs�ɍ�D����x�ۥ|Qi±��[&�0.eT����y�}V s&G�&�]�
��x�31���ܜĒ���b���.&����pc����l��t��x�31��T��X56��:��|��-���7\2�0p�	x340031Qp,(��LN,����+�(`�>�L��W�0���Y {勉(8���&�0�X��bߢ�w�g�m�2�	D�W~~nN"�Q���
9�_])f�a��yo�nQ\������ZT�p�`��v��!7�&���2�uE]�;Ѧx�31���ܜĒ���b�iK�����r|��FtGө��%%͢x�31��T�5�]�8�
m\ݐ�qr�.��Ԋ$���Ox���<�yC;����;S�X���v�wt��$��YV�
M�x�31���ܜĒ���b������l��8P�i��]�7ߢx�31��T�'�#s�x��Ѥ���+f�
����x���8�qB�����J��j�|�79���ab�*������x�3����C^�X`�v"��3�3'�|���W5
v�{ⓑ�x�w����]ҁ`B��Cx�[���qB��W�I�����y�[n���=i?�a����Dx�U�1k�@�q\E�qa�&�ḕ�О!�Q&$��Ejs�I��iF�trs?B���1���es�9�4��{����W�cz�� ���w/��
���-a�`��,��t܀%o�.���s��@�cj�$�]Q}+�Ç���rC�
���bM�{����P:T��Z\��KS{��ξ�r�d��=�aB��eG��X�J �2P7����Ƨ�t{�rZ�׮m��Kc��@�@,P����]h��Ox�W�i��A8`�MŦ�*9���8��;a�9��������%֋����A��}�l+^�W+6�Ж
�p��L�w�G�Q�8������%��zlOƟ���o�(�����Cx��������L{n��ڱ@���Km�W�ߑ��M���
x�F�����$CONTRIBUTING.md:J*㔁���l
VM���x4��S��8w��IB�9�r�,p����Au�/��Ix�m��N�@��m��@=VSqI�R/�D
(�	R�`���cg�z�����7�r�{ߢ�ҷ��N���ޙ��}���7�gD�
�HY萶�p ~~��
~==oLW���@Z5P�,&�]�(�
-y�9v���F�UP6rX�tt
B�ʵ#$�2�1�	i�@|C�c� Z����Bƨ�F;hu�z�����~�w�eq�`�*�	�"���0ƞ���ճ?��gb���Lb������Xr�.���Û�ipy}1�JF�-Z��q���{n��5@�s�؄�w�b�PQ���z�")�XZ7�'���-��1 
�R2��Z#���>�7�s�eۡ�HjV�9贞j0��6����!7ƵV[m��b4�ܿY��Kc

)J�k�X�z�x��j�����s�(\(>�$�e�N/��B�}�0{��6j>�_�'����&x���4�yB����_H��Sh����^n
������)��g���
c�]w��Ċ~�,���bx�.����$CONTRIBUTING.md�/[<��d��*��ɧn��x��?�x�Eʱ�@��ݧ�(�tw�����D�‘+%myL�/��L���}%�k���u��p.�
Z����qv��8%��X¸��_���ߢ�1KD�Xݛ�Q_�]�\K���.���x�@�������-g�ߎ���֧��c��(�*[���40000 src}�ʛ�
�C��4#_���-�(j�Ox�d�����d6��v}�n�4N��
��x4�F�I����
y9d�P��(��3�o��%�F�>6<���zN��Uܲ���r�S���IU��8��~�-i�rx�3����dY���fUH�u�;���D��x��9�^9в�A��.��kT�q�}q���x�;���$��3g������O6b�f�s�x�31���ܜĒ���b�*������$�+�y�ߦ����8�x�31��T����]m.��f���{a�����
���hx���8�q��ȥ-�+,�5_USB�7:��?}��Qw��%x���4�i����5^�n�*5Z%�+��Og�Z�j�	����Fx�7��������䎮?FN$�a�b⒐w��`>�ف�5#���-�]1�0��L�8��hx�{f5�r���l�X6��>#F=[�x�31���ܜĒ���b�3�A��K��L>�-���Gd�5~�d�x�31��T���8�E�U����i���mk��6:��Nx���8�q��_��/?��?Y��訇��/V�;��
�%
����x��������F�k�^i����n��g�K��x�3����d7C��k+��Tz�
a2%�*��x�憃v�7ʙ��; ,�Q1	Ӧx�31���ܜĒ���b���ӊ��f:)�*w�л���T{�x�31��T��9wd�m{S���+U�d�i�7v�F/�	x�340031Qp,(��LN,����+�(`����2�J���5n��Iq���lb
����y)|1�����:�d�ǣ���X�.D�W~~nN"�Q���
9�_])f�a��yo�nQ\������ZT�p�`��v��!7�&���2�uE]�*�6&���?x��j��d�	!֒�����'�r�M����8x�3����d7C��k+��Tz�
a2%�*��x� �ܕdž�@OAA��aC,M����{x����iC���CNA韧�i��_�<{���
@�x�31���ܜĒ���b���oOFo�u��UoϾ��9���x�31��Ta3�X�iQ�|?�\ޡ���D�t�����Kx�����-ьƳr�R��2���Z#�+h�S���-x����iC�Hzx�z��oG�o����^^�?�Ô��x�31���ܜĒ���b��;-�y?n����13�-V�y���	f�x�31��T���}7���<��(��y�̐9��y���1x����9���VӲ7aQ��:
�����MF
W���%x�F������<]�ڀY�3#�k�q��!C100644 Versions.php
������S��i]���� ��� /% a���x�{��i�ȍ�+��O.��]�_�W�XL|�d1F�5
��%��x�]R=KAm���A��DarD�i�*�P�;�Rds7�,^����h�l�Ӊ� �V���'XYظ&&~�63�f��{���U��~�C�PT
/T�x����1YcAP*�n@7�ݏ��Қ���M���'�tm9[�B桹���Ll��*�!�Pr����h6C.�1��	�B��:R��f\���1�C-��i]�
�l�3.g�Pc1
�����NS�xN܍�aj��r���;b�BP
�:o�����!�<��y��;�:�ߞ/��ynч��<P.�rQ��h���LJ�.�qݮka&����]���;�(T�<l-	v��ٰ��JdnJ��Icj�����m<E����jie�JKa��f�}�
X��D���481N�ʝ|��M�����Jx�;���`�;{rn������@>�z%k.(H�HM�PJ�(������Ң���Mk.���4
��������B5\J2����R�b�J�J2sS]+�SJ2��4��2�J�4��3s�SSJ�����R�K@̢Ԃ��̒��J�b=���l�y���A>
�y)
���E
@�R��RK`��K�&�'f��}R��Y�k�0CS������+��7?���Tf��N �Iū���y�99*9��%��'rHN>�.9�_�}r��kBo�e]m>���x����iC��ԋn��W
��;�~�/�3!�=�1
P�x�31���ܜĒ���b��7f�+��Rm�T�y~�Q]�B�m�4�x�31��T��5�N��'&�I��6��}�[����"��px���8�q��H�'���wS�y-����i����n�.
V��nx���4�i�O��o�����$6���[_l\=��
�o��:x�;�{TwC�S���:W62d���x�����\��!-�g�V���o��߰����f�x�31���ܜĒ���b�Y�J��b4�qh�œ	R՗T�<�¢x�31��T�G��o���L�Y��얡��d�R�Q
_��hx���8�q���y��R؟�-������~*}������fx������{�*٭����ϭHy�2ɟ�� �����qx����iC�H_��
!�jL>�=��4.�|
�|Ӧx�31���ܜĒ���b��51[�^��X �~����%�=�x�31��T��]�C���4lΪu�ߴ��S͐'��Dx���8�q��H����k*n��d\�u�1Ep�D_7�%
F��\x���4�i������4�̋��ר}\k�yc�	��
.���7x�L������*�^�a�[fXN�
{����>��`�S/â)��@�_�W]q1�7�8�,�\=P�Y���3&}!�o�"�"5�\x�7��������/8�A��luZ)��;��`�g詜p�ctyM���$�\_U�L��l��lx��o��bC�����8$�g���x�����\^��%}͟M��u����2C�Q�x�31���ܜĒ���b���'�vI3�_u,]�^y��f�/!H�x�31��T�F���1�5����?�j�c���3��Yx����9��;���{-��o����MF�Q(��sx���4�i������)��\��|��c�V����
t��x�{��iB�H���Oe7�,��>nL������Eן����
x��o��b���Y�r���36���R���x�31���ܜĒ���b�	��4�m~2��RL+�Gl�`
��x�31��T�U~7[K�m?Z9햑�ۛ�lˣ	x340031Qp,(��LN,����+�(`8�{����"��A�.}��x_���(8���&�0���+���j�e:�
>�x�:d1D�W~~nN"þ#S��ϩ��\fꙸ�XN� �27'3/;���������OCn�M�Ϲe�늺#�z=y��x���8�q��H˶�d������2�n�I�7}9��
�'m���:x�p�����/8.aQ!U�i��a��pJ׶40000 Extension	�d���5���_��K�w�gM8�~���	�f#�����v-z�4�E�'���Ձ���wZ�u�@.����lx����iC��5���k� fm�n?��Z��c
:�x�31���ܜĒ���b����'����N�:Ӫ��~S�"rF�x�31��T�}k���嬲�ã�=t3�ׅ�ć����|x���4�i���Ob�b���I{�
x]�6�,������x�3����d��E:�w��pZ�9�9�b5�x�è���V���";Úh!~ ��x�31���ܜĒ���b�dž/_�_�:,XT]��]a�#m��x�31��T�ta�E�>��u�]�r��s��M��
����Nx�i�����d��E:�w��pZ�9�9�b5�x42g�ߎ���֧��c��(�*[�40000 binw8�Y6���qSN�2��8���~�I�dL�Ϧ'#Ç�dɞ^�zm"�2��x�31���ܜĒ���b����;��NKX����[e��x�31��T�k"+�yo_���7��\������eÍ����8x���8�q���&��
�\6Ծ~d�ԟ�"�v��ͤ
��,x���8�q��ȡ��s�c�/�M�{W�`'��s�D_7�\
����0x�L�����S	�d���5���_��K�w�gM|J���(�$�䦞�E"�Χ�4�E�'���Ձ���wZ�u/�#���
x�7�������,^�b�+$�pA���:��`�S/â)��@�_�W]q1�7�L�]���zx��"pB`���D��1��%���K��g��)�V���+8&�%&���7?e�aT�I���M�+��O,-Ɉ/)�
�v��чImvb���"����}x�i�����d��E:�w��pZ�9�9�b5�x42g�ߎ���֧��c��(�*[�40000 binw8�Y6���qSN�2��8���~)�H��5`z�v�}�C�ٚ۷!�3p�x�31���ܜĒ���b��A�X��-}��6_:r��m�٦��l�x�31��T��Kކ�-3�4}"[��q�[������	x�L�����S	�d���5���_��K�w�gM7er�9x��Z�]�>Q��ow�4�E�'���Ձ���wZ�u
�"���cx��������,^�b�+$�pA���:�������'x�uU�sU�b�B��Ҵն�M&�Ii�v��%�@)Zh�c�v�yI7�⾗�@<:^�~/�8��^�;2��o�荃9x��ow�n�e�������'�������C�+�dnvl�o	�9oX�������b�n4t��z�9�$�\�e7=��
iZs��a�B�y�i[\�ے̮X(��Tܑ�#@O~|<x���†nZz�j�ÆO���b��c)t����g‰�.	ũ�>�:�����Xh��]��.أ�3�Qu�����o��#�`�����*P5-&�Ѝ:û���kr�yK[�$sl]\4%�aJ�l��`X�f9(qP���W���;ۤ�*w�lV�Ϸ�9������!|�}��>|�zÃ�eO&�wy�hO�K]�2\��=������vO���*[7�t��d�%�O�Ý���~�j���D 1�MIi�0?<*u��[�CJ�M�d��d�3��i�D?���>K��*���/�g���t�u�31��$p<~�ս�)S\�K@�j���=Sڧ"n"[��N��O�l�pk�]�
���g@�o��E�4�:�U��ؖ)�H��|]����-�;��Ժ�P�;�s�7�>��'�1*�`��
� s���T5�~��?�p��R��-[�k/��ϥ�ON�ūK���]ZYZ.e2ԥy��?�
3%����l.�5�r[����I�m�
|:!�Jn�M�`��~=}'�f��yxt��k�E{��N���f��<�.�Q;�&��i��̧ݩ=�����{Ӝ67����І2��#u�&���}I
T!%�C�U�LC	�R�8
"�x�~{�(XO�jw���N�åR�Z�@Xu�V��4�b��IM�����v
�%�D�A�B�f��
�ж�����e��f��YRf��J$8��J�<>��B9��V��q��M|<=VXko/o.���N�:?(W��*Z��a,b�}�_����x���#���i�f�;�Sȑ�o9Ӟ�Wb��\��<���:�H&U��L\8�[܇��uJܯf6[��j���H�����Jz��r<���A�/����$R$�X��u���� N�8�lV����KՎ���]ޥ���LGM����|�n�@��.��M8��H���~�8��CC�"8��0��e@|�Vً{��٦�蔝��]��d�!q�?�+�x+td�E��a�����Ќ��=xc�D�?���ՙD�H$�sS��G�ߞ���f�B4납b>�tZ̛�{�{�W�|���ax�i�����d��E:�w��pZ�9�9�b5�x42g�ߎ���֧��c��(�*[�40000 bin���2���;
�&� lW�o�T��~a�U
�����S�ʪ���Ĕ:�2�x�31���ܜĒ���b�n��DW�X��������
�6���x�31��T�S����x$�?�	��'�-�9
�
����mx���4�iB�����-�M�J}?U�7������%�4V���1x��V�oEV�&M�J�Z�ʤ�X�x�mi���P��Ѫ
m�2�ۛ�w�3�v��0�A��Tq@�ơ�@%H�7N���fv7�ㄊ=$;;�}�������ߧ�=>v�ቿ&�WI{ҋAkQ,��z���Q�[-��sX��l���j�	Y�,�b!�YN�$�ܖ$��`����{2�0N�;���z{ό�s|Y���W���˽�t҈H@���Y	�c�5킅g]��Q~uu���XyI
�s'�M$�A�D��M�XXD<W,���u���X/��"��a����0H�vQ
�)%~�RT��mP\��&Ѫ<�P��m��N��fp��fu���%��M�p8�%�9���CDY#!�P��h"���/M
K8$�E64	PJ8���ba����[���"��qܣ�h��U�3&Q `)�9T?�~~��Ö��(�[s[]7�t#,�GX�H���3��XH(|Ә��ee�^�18��p���q�U�V� 5�
�*T	UP�q(��D�Ƽ/��F�E��c��8�����iX$�l�%�d�Ũ�X�qB	t��G��\�N<�x@�NMt[4o&
שG�m��@�a��>��VmH�j�8u��>�%uwje/'S�&�~eW(�%��	�0�H�@�gh�,$%��{{���n��D��
���q��Z���z�`��1����@h�;BP���~�~e�\�
]�򉩤lj���sw�<)��q�-ٺ��1������/h��S�x�Jl56��K���{Mr҅���J2E�I���=�A[C�?x�	�>bI�e��W��i^2hҖ1Ӏ�!A��ɭX���?u�-��~ha�g#T+�p�("�I��4b��O$La��B�,�O'���{��\F�t�D^��k�N�h�әc������PN��Y�Y'�����Á%uyn�BKk�A6���}m�7bU8�������Qu�袚���9���z����s��i�7d�9�ݼ=�Uv٩�k�!t�^�g�`��[�1��Ζ7�ڍ��zp{듣o���O�);e2{�Z@��<�J<��ԯ��/�y�#�C.�q��Q~�@ջ��Q�K��$��))���F���_�`��w�G��^.��>����|2��ۂfV��D��`Mj��Z���м�S��;F��s.!�X��z�����>U����v��	c�Z�3S7۳��zT|u\�{���)=����O�C�]��<����6�m�A�Q�D��M��;h:�g�n�1�/���!7b��3��P���)�����pQϥ
Vu���Vu�ޜ��Ե�sv[�Fz�m�|`�����(�"������Ɉs�x�,~��6�9���;����B��g��U0�~�ɯ��+��n(t���{�=�_���x�340031Qp.JM,I�+�(`x���~��G?2o,Y��֯;BT���AT�m\�(���iu���]�#�O.�|!��Z��#x��TOOAOcZ�D1�"�WҰ�@wA���hP��5�l���ݙ�3�5$~�M$~?��p����z�ʹH�ѽ�̼�~��}���ތ'n�N���U.��D�{�G��J��_=H�v�ƕzD�ZN������G�/9�1�Cr�_\��g7���@�M>}VH�P�0�N�/��ėȶ$�$�(�"
�V��Twj �e���~>0ҀٚT�5آ���!�0��*Q�o�$'D��R��Kg����.B�� �T��[���sA,�yݵ֪�0��/� 9��0R���eZ���\�!�T���Gd�M6^�	o��Ր-��F�NG��tKC���D����&����;�UT��M4(^R��6I�Ɉɳ:R���MN^G��j�kW}��R:CPPF�{�X��/�������0�Y�1��j�<\x�v.��|ZX�ڥ`$nT��8CJR�M�a{�T�nAs.�U�����S�<��������Dcn��Cp�A�lzL���w��X`�,# �j�N� �U㯝���PH�`g����27��K5I9�����i0���
l�����	4IԑX�D���H������qU��Li�6�
�%���a8a@�c0��i]*Y�
a��(�k�:�]4��%��vv��2v$��~�4�1�}gqacvyy�z{3��o !Χ,�K��F��!�d:����3�U4|;�0]�Rkd31\Xb� �y�����t�ӈ
AYŝ�Q�F�=ӧ��#�3�e���'y���Q��(����)�Y��qx�uT�n1V\r�‰� .IŦiK�ȭB
'��TU�c�&n��e{��πx�ܐx�al��Ophמ������쏧���'_^Gп�_����|ЃS�p�e��@���~��T��[��$��z�s�2ػ���Ϛ�r�>�9�+����fk7�ݕ+d��[F)tP)(*m�X�F���J��Q�c%T—RG�x*�B��g��;|�=��k-�L)*���&8��
a[�jR)�@7�������j��R	���m|7����=�f3���ńl|���ͤ�a)rf�83�L)��=Lt@�x���2�o��l�PR-7����e�&�@�T��‹RY��_[k\H�iV���ѽ��/B��NO^4]h����!75���4�s��ډ�6|@C�ԣe��:������K2X��� =�Ƭ�!BFo�b[UωixT�s�ی�<F֖%:�M�a
��q���L�)��l�Y�����f���U�z�"�
]���#qQ8��ǣ�&!�!5�hKV�U�������!ZMd���t�ͳF�ΐ)L�y`n^���v�?Z3NaG/v���ގ��%���~/�
�bΘV҅�)X�ֵq˼���B`�jȣ�z�E�۞ۏǬ!l��+`BW���RD��{ol|�z�S8^/�o��r4ا��".#}Ci�P�
��&���N�z8���/�������|x�3�����g�ߎ���֧��c��(�*[����a�U
�����S�ʪ���Ĕ��~���?x����iC��ݓդ��{#'>��)R������*x����iC��9��Y��R�c}*�Vx����

�x�31���ܜĒ���b�i�?$O�*�<���?��٧���x�31��Ts�U�J�3v�
�呑���
��
 �	x340031Qp,(��LN,����+�(`���Zs���ӧ?�.c�P{5)����ss�Rf�>~�V�Bd�I�r��O�h�
���ܜDs�w��O|³���ͮ+<��CW��d�e�3��|�k�߰��F*��k�Sd4=���x�3����9�t�����I�|���i�M2�t���T�n�/l�1��'���e��;x�uT�oE�&���8��v>hH2M\4v�*�ǁ�*"mR*E,��؞d=�쌛�78 �FO\I9�
.Vo\8!�p�w.�'0�a�������{o��̫�/�.R�}����a%����0��г�u��CUE����dW�q�(|9�����~�8&��(>C�9L6̍�㽐����#�Aj��TА%E��Q�5�I���'Cpztì4��aaӆ�ڛ���M��+��:�vg�9
�V�PK�0�&���.���Z��B�(n�-��n�L9a�ؤ=P�2L��%�$[1��c�>�˚�[��>�4-BOzE��#��mcK>�ݤ>p���c�]'�e����>�0I��,�raZV��٩��lQ'v���z�v錸쨩�Q�-�uTu������Qbg�bf�5�����`�Kx�`\8�������y���i�{����\���XJJWѹ�d�ȌW�	��/z֣cA�f�{,�&�9�΢��IOS��a,��'�QWXg\K�t��Ah۲���w�!(���α�$�&%5�E~]tZ8�R)�/�(}�X�2�F9�p����Y0!x9=�;��%b��[��Hq�#Ϙ#BC����jY�b
��p�ZK�L��cP�›-�8L���b��n�дm�#�p:��p9����o,۹�;8`����0��1�+g�-S4��+wV6<v�ݔ-��s��޻G{�ۇ��}��rj3��0� f'��� ��*��s�y�̅�����ڸi�h	��C�T�EwP��$Y�>P�1���R�i}Zz�.�~�jٲõL�67�8�Ǹ�%��\�3ý�>�Q�x\����seI�����S�Y�$��&F���zB�����Sr�n¡�HR���yV�ܑ�J��<{�en��o�<�:ga^���xʭ���da�V/v�e��k9�ËefU�w� ������S�ui�K��3�
��N���]δ�|`U�?c"�i�7�Y� |.my�:�+@��N+��$�$TE���o�x�31���ܜĒ���b�O]��dӧ�<����'S-ug�6�x�31��T�:ϟ���J�>�bzF؆ԛ�[����x�340031Q���/O�M��-��K�+)�+�(`hZ.�R���ObB<4W�x���k���6x�{-�Tx�l����7�`��H�nx�{*�Lx�'F�͟X>�2�]���"x����iC���C�.�Y_�?{|���JN��Y�=��x�31���ܜĒ���b��eܮ�j��Z��gEi���V^M��x�31��T�������0ڦ�m>��gڍ
{͍���;x���8�qB����ٷ�RӔ�7�8�/3T��J�
�x�340031Q���/O�M��-��K�+)�+�(`()�v��6�wVS��8�E^�<�c��I���	x����iC��Δ���.�4z��/^��cx0��A�x�31���ܜĒ���b���7
X~X|yUg�����LF�ˢx�31��T�)�̧,<��ݲ߅ZS݋s����"x�3����9f觝Ԫ{�_���������M2	IA�ܿ�(�GO��(����'�z����_x�!����S&o��)֎�q��8؂5hԊ��ga��H������sx�7�����˚�I�V�i���.~����;ŕ�B��q���W��9��b�B)91��x�340031Q�,I-J,�/�+�(`�+��0_����
�mk�I|��6�	��!x�;ƿ�+WYjQR~qfI���l�l~�A��>����XUJ22�u���J&�f�bMM��W���MK@AO!�# ���ǚK&od�l���Ӡ���Z���	��� �a���D%ĠZ�ZmA/��x�340031Q���/O�M��-��K�+)�+�(`��˫��s�����G�d�7������x�{-<Gx;�JYjQR~qfI���ZvY6?� _G��rL�ܩ��
Jn��y)��3���))�)x��L�`I��\�n�
V>���xJjqIf^bIf~^�6ַ(z�8��/�M�Ii%�T�P��!)��]���jN5d�qzn�L����Rx����iC���&�EW���I�y�ԥD��Ǽ�+Œ,�x�31���ܜĒ���b���E�状3_s���,Z����o�p�x�31��T���e���B����2�NZL���6��Ix���8�qB�H����l�c�s�j]�YF���y������x����iC�Ȟ:���|o�6LWz,�@c�E�8�,)�x�31���ܜĒ���b��)��R�9��M�v����j���
��x�31��T�<��"6+=��\ż,�Y��7����	x340031Qp,(��LN,����+�(`���Zs���ӧ?�.c�P{5)����ss�Rv�/�]�y�V�����^���9�
w�7x��I�-�u1f�� 
�+ss2�S���8�pt�Ω��}_uG 3�2M��;'���,x���4�iB����.N�/�ԍ/�,���~�b���ĉ�<�q���>x�7�����WCI�4ݸ�
r�8Y]����;��4��?�n��aw�n2K��B)���x�340031Q�,I-J,�/�+�(`pR{���↋�fK����}�A%��Kx�[ǿ�gC4�䉌�-�LX&[��O�d�b�uB��	��>x�{�;[c�B&���ܜ̼��<�GY6�s|e��[�qr%���?Ey&�s�N��V��­>�RLy�ny�������
���q�E�Y��%œ���QP��������FrO��<G�P./17YI�д�'���W65]�x�340031Q���/O�M��-��K�+)�+�(`��/�Fz���4����ދId.�9���x��#|�w�7��FƖɦLK6a�`�����B��(�@j�!vNF7����D���ox����iC��G���ɡ���N�w���/ܫ�0�x�31���ܜĒ���b��������xV���tw"{a�x�31��T�P��w�We�T�k�_��
��nx���8�qB�H��}�;\�ʾ�*�;���m�?�x�340031Q���/O�M��-��K�+)�+�(`�H}��o�&�q��4y��rq#��&��x�;̻�w�%&��ļ̴���O���������s��R�J2�&�0K+$��(�%f椦(��+�e� ��K�M)���e��M.f�����S&a4*G���@x����iC��.!��
2���X���,�w�S)�[#�x�31���ܜĒ���b��/,�ӣ���f�����]�x�31��T�`3�=�˼�F�P��Y�ii��
���?x���8�qB�ȔK|���i�Z�̟��1Y]:��<���x�340031Q���/O�M��-��K�+)�+�(`���=����]m�
���	�le+� ��Qx�[��k�{F���D��܂��Լ��ܜ�5���*g��E�s�S��2sR5T
��R�K�����i=y"�?��k����j�2j�Q�L�O+���x����iC��I��I����3�e=ռ�.6��0��w�*x����iC��=����X�Ӛ�&.M󸴖���
f�x�31���ܜĒ���b��a�>�϶T��@��{���6��ˢx�31��T��������5sߐVt��8�
���|x���8�qB����+;��2�&UM�^��k�듯�|
�x�340031Q���/O�M��-��K�+)�+�(`��p��G��1�{6���?�	���l�|x����c���S��0&WZ�x�31���ܜĒ���b���l����o;�)�he�ƚ�p&�x�31��T���Z�>�gjbک�+�Jg5�����x�340031Qp,(��LN,����+�(`���Zs���ӧ?�.c�P{5)����ss�R�b_m:�;�� ��u����R *���ss��o>�4`���[�W�b�2�+Z-{��x����iC�H.���NyG����3,雕��v
��)x����iC�H���3):r�,��&���;9+��}�x�31���ܜĒ���b��K�E�ogɝ�>��/��S�1�s���x�31��T��n��	��`},�5)�DS��2��
|�x�340031Qp,(��LN,����+�(`�7Z~�}�)Q�}�sbf�6�8�31�������6�wY�z�d��h��
���ܜD�����<
��$�պ���i�.+����5x�����S��#�,�+%gɴ�;ܡ�q&�g���K���xx�;�t�i7�Hڕ�F�M̥-���k%-�]�>Y�Q��&��Bx�]R1N1,ҹ�[� )��N��!���ȹ[���d�!R�=tH<�!֗�\y��ٱ��?{Kh�
s�����W��k��;�x����5EQ\�ݨ3Â-�Yd�������1$KA@�
L]�k"�4�qvYj�Qf@���A�$�u��I�u�j��pJ������2�a�̴!����Xu�6�<��V��P� c�ds�!��X�:�R���8o=�TS�*Ge�2ⰻ�#y
)'����贄
e�n���p{#��5T�R"�s����r=������'<��F�u�d�-�vPQ����燚�I��H��p�ϐ�|����t|�������z�qz�n���0�O�����ږ�M��Sx�uSMOSA
A�@>�`�M$}�R�7��DBb���v輙ffJ��-t��I\�0��?��ĕk��K�g���?����9��3����u��Գ^ʙhY:~wJ���G�F�y{�Z���L�LC"Ӕ�t琣�4jLab�b���d�UGa�*���'�+X�Ƌ�0adHj�S�Yf0�@�5��R�Am�h@Ov$m��I���d�%P�Е��R��iL^�,�~to�!���(Ԙ�L�ࡔ)�YI�6������%���f�]�<����h��uɕrYϵ˴-�sa��K��Z^ӻ!@k)��RWd�����.�1U�N��h9BdѲ�3��RWB/������:-�Se�.�N�=#�w�9p��h(
)�	 d:/�Ǩ�†{.z1�P�3�H&����T糩}SR��?m���q�,�DŽ<�ƫ�&�����F���D!5�7��v,M� ��;4'�n��afW��˻2HYn���6b���nN�=��Ey�̨�a�
�b�bx�^u��;Z+���t�����Xr��)b����='7����L6�?�x�fU)�}v�X��S�{��7њ�]�e�D7���I�W���Q)��ܯ�C�|�����G'�(W[d�,E�õ�w'h�e.��_,�L�y#�I��%x���sWgC:���t6UI-��܂��Լ�b} 3>-??)��Kk�b��`�����$x�[ͳ�gC+WJfQjrI~Qf��.օ`f��x�31���ܜĒ���b��Ivbe��I����w\�8o�x�31��T�+=j?֭�qx��C�S��'v��x�340031Qp,(��LN,����+�(`�7Z~�}�)Q�}�sbf�6�8�31���ļ�,�{����n�e�lA�>�N�
���ܜD�����<
��$�պ���i�G+z��� x�i�����d�F�Ų:z?� ];�/H� �x42g�ߎ���֧��c��(�*[�40000 bin���2���;
�&� lW�o�T��~Ы��6&1i`�SDNzk�T˕�܄1!�yx����iC����L9�2m�)��d��O��
��x�31���ܜĒ���b�9��G^����)@�`��5���&+�x�31��TF����
��x}�Ə�2d�����
��x�340031Qp,(��LN,����+�(`�7Z~�}�)Q�}�sbf�6�8�31���ļ�k.l��.|�dS�\���.�������Idh�{���ӀmLrny_��1ˈ�	�.�x31���T�PF9�����?�Zg�:�����	X�%�$1)�8���;�����l_�):W��ED�kEIj^qf~C�;�
|ג�<�X}:fֲ� Y�n��̼��"��nU�նk_X�e�US��PCrJ�3�D.����]��cә�WE���>o���Y���8>09?#)���������s

�LL�+ss2�
2
��]:�1�9-��5�e���}��Q�`r� ����u[eê�{�S0C
jPXj�3�`��^dz.<uL��i?=���t��@L
��/.a�>�����gi����}�.�]�J����Bx���t�iB�s�ǀ�[�e�+m��2={b��������
��Y|�"vGtv��(g��2p��1ei��*��jY�?�Ԏ�h≉�"6���x������%͟Ix�Uu��x,�M����P���q��=x����n1��E�9��*)
�����ʇT�	8U�zvc�k[� ].�[O��o�p�0�w7i� �d읙�o���<�u���^t�_�4���P1�<Z�t��W�Z�P�W�	8�l)�¯t�yQ!r���n�D���LJ0��d
҂�L(UC�>0)8�{u-S�F�g�	�g.T�O�)��Y��P��}��	�ҵ��Kf�O����
u�;�����yhл^aDK�
K��.�ja��#�V̲�0���p`�	-*��,�H�ήXR|�:OM��$CЊ�R��<��;H�@#�124D� Uɱ� ^�*8o�1���m�Bb.]��1��b��зe��������F�G��T*��_j%�@��)�J	�TR
bN$� -���-n=ț��Iq��K����Nx�L{�mp�cA�ڶd6��X�+�Yw�8O{X,K�0�.�Io�h���ݕ��c�/�2�"��)����T��)M�
V��RiK�*�(���bK�5ҧ�p��մ�o�I>�S�6=1��:{e��V̉�I%:9<���H\�h���}��t���C5Zh�K����I��3��e��3��]G��·���/�
Z鮡��$�嫩�66�9F�N3G֑<�����K�2���NE��\�M��qC4��]�]�3�Q
�ڤ�Y�:|~:*�g���Ck���]�FS]�O�}n.],���
��3E).���p��i�r	����ԍ�]��n�t~��N+]��6J��0����|�����o/��_��x������E2+??7'Q!��$5�83?Ϫ(5=��$�hr�5-���x[;]����W¥����ҥ9�\Z�UX]T�r2���@�(���� ;,R�����R���Ϩ5�.k�}غp�n~ɖˆGs�I<�m8%�i��:�ق[U.}f�x�340031Q��KI��+�(`p|r�l�Ξ7��Λ�x�,��׆E�E�`E������uV�����:�1�m�)���`x��v��a5�LPi�BIF�BpnbQ�BpjbQr�Bf^JjEj�����B�F���Mx�7�����*�����i=��Ŀ&(�m��`[�oZG�z�h�z������	8�L
�Gx�������*����Bv͢���9~�ۑ����1��4x��R͊�@Y��@
aY�d�2dً���T6�v�Bw'1��{��}#o���3fn^����S?���~�<����WY����>�a(,�'@pJn��5��@ˡ�p��h���Sl.�vfE�)S��AS&U��W�
�CŜ���E7Bfh�#(�&�ZS���rݣҘky�F2~��h�a҅o�2��MJ�O�'+6�'�;(Ѐ�;e&�F�,T�\�mAzq	�S�.��(�S
�B�րe�L:_���%U�i9'6P��D�كr��A�=MSG�G�-:w�����&m�tO������{�I���yn�GݑK�h�-jf�^�t�&���6��_��*�Ҡ2�7а% )�mX�>��a{��~�x�:Y��8�O�ôM.�,��q�>�zܞ=<�\*K�g��Mnl�2ߤ3�4����`�	|���������D�K��n�֏�����'0��bx��c��tC!�PV~~nN�BqfI�UrQjbI����������Du���x�340031Qp.JM,I�+�(`��6�+͕=�|�Ҍ��ejM~�cQ���_Qe�q���f���E~*w
��>�+q�x�31���ܜĒ���b�Ý�ҧ3�T㪕�-RL��v��C��x�31��T�k���5�8��l���B��.�[����x�340031Qp,(��LN,����+�(`�7Z~�}�)Q�}�sbf�6�8�31���ļ���ݟ��Z<W�i�����[�^CTx����$24ܽ�|�i��?&9����Ře�O��-�x�340031QpL*.)JL.q�(I�+����+�(`8�z����_��u��\=5�㐠!D�KfqbRN*XYAM˃�saG�n��e`�����4T�k\U�⥡�ι�������
+U���PU�y�%�99`e]�z?����[�c郝Z%+^FU�	5QȲ�(��E��n��;���=W�U���Y\�ZVg ڰ�/p��6��dW��h.�U\�����
Vv�����ƛ�9�D?�и��r��мL$'Κ}y�Ç�]׻�D��tə|)�出�&��9x�]R�N�0�e�n)���LUT	�"�Z�0������KE�J�
�+a���z�9�_>���󱳆�+�.
�sZ��\Rq�O`o�M<�
ꪗ���n�\J؜�&
����k������l�2�>�DFU��:�Ȁ\�H��1F���R�v���N.�n@���;/�4z�Le=('��J�t7�CYk�ά0�F�^1F�L-�KG-<I����
Z_R�a��7��CT�^m�8�Wܞ�Ax(P�����,[%C�a�\�v
�ء$g��@,��M-'���P�i�yAy������L������(@���[��]�_���P>��fsa�]v�1�v����z�|�a�����Qx�u��N�0��[P����IL�`B(�
���1T��m�K�(q{�-}	��G�mH+z��aɋ�ſ�����}�"�=Z���{|Ϯ�B����1R4�"t�P
ܠ	s[s���F�x$L�µ���VH�Un��)ʪ�6'�����0Bָ�^�Ag	�SzGH,�+��{�@�ֹ�]mH�׉`d�W٤&�Ӹ�֤+�k֎��P�*i�j8-������O�@�^ȃ��F�b`7��&`�.�¶���S1t�X�#��k��u�21~�������7�!�f�B��Mx�uS=��0��@�+h���(ns�*����$��7�욵=+۹܊"�I���(讣E�!��������f�|DQ�of�ߛ�0�v���Nm�=E�|�������\X�H)�s���`WJ
�7Gȅ�̑h�0��f���x�4������~��Š�8E
V��EÛ#�P���	=����:_�j+H[��Bb8n*2�&R���
Q�2�w��J��A�j�#�gDJ�G�:Sf�����!��j@�R&���WK�[��3P�r'�$�UXs�D�bH;��+����>�aa��IA4���w�1u�u�l�{�D/����-N<��Bt4j� )J)O4W8�� ��E4�C�5h������u�3S�xԞ���H���R���l�C���0?�B��/��&�� �p�%P�ӫc�x�� w�w��mJn�࠱��C8]�ɬ�Z\�|��@�c҆�R��Z�䳄�	l����s��g�m<�cו�Z�y?xp�[]}|���^^��o.��6����r��ּ�x�}��^�;���޾�
J���x�340031Q��+.I���+�(`��[?�>���;Gݐ�_�(E���'�������V|ˬ�W2��~6�f��u�V��мL$��D�U+�
M|dY����r�Y���-��?��x��S͊�@�<�aO޼�2
�����8"���I:�J�n�+�;3�)�Â�͓g���!�Ãՙdw�E�!P����?�r���I7{4���-����I�,^<����0��uBk�u[�����ψ*-�%���"��$U�0�j�;4Y�`��V�R�4u��!�EE�c#̠�>挪�,6���j��A���"�~d�\�KQ(��-�0Pk��6������JeGlaKӣ��r���`EUk<�霙�T4n��'�vv w")�u���EN��i~<v�[�ߚ����ꓧ��5J�oA�����*���Nad	)��u�:z.c�i��e1�?)��j�\#x�rҚ6׳��ᓗЬ�����?�u=�8�u�j����|��C$�;���l��·�z���x�z��d���i�C���ƌ�ۃ�q������q
�	������LX�J?�
2S���`p�L~���;|np�}r��ʟ�0���m��ԭ;m�^�8^-^^,W�Ƿ#�~MG���N��5cX���
x����iC�HH�|����'��œa����kN���x�3����d�F�Ų:z?� ];�/H� �x�Tk��/c(ː�݄h<�BC)���Cx���������z}�̱������#�t%�ޒf��x�31��̜�b����}7e{b��v�Ƴf�榦
Y���9��sS�6�\�9l����|��{s����#x������K�Ŗ軯�
��Q�"ʫȾ��*���	��Lx�ke�d��Τj41Ȣ^�Kl\2�R�K�*�������T
U���@�_P���W���Z�Z����_\�듙�]S��/K-*�LI�`A���@+srҋ�JRS�R<6�p��&v�0r�F/����Ax����iC�H�C�����AE��V�?u~}���x�31���ܜĒ���b��|]K��Ug=/�٤�{��D)+�5�x�31��T�;��Gr��_$��}���5�;���7�x�340031Qp,(��LN,����+�(``d�s�|����go)>�o�����ss�R�ow�����ɮ��ػ�����ATx����$2�q(;~?��慮��u�Dz��
QC.����Qx���:�u�+U��w-5�w��Rh�W�.���F��w���lx��cp�`�VN�����R���9�Pxb�
9"��9���%����Qx�3����d�F�Ų:z?� ];�/H� �x�+�<}O(���so|on��9&M�Cx������g�ߎ���֧��c��(�*[����
}b�x�31���ܜĒ���b��[ݟ��:�b�s7󴣺s|�x�31��T�x�~�ބ-|��-�&s�<��T�x�340031Qp,(��LN,����+�(`г;{����h��Z�:8f/61���ļ^��"R߶ο�t|���}����������Idh�{���ӀmLrny_��1ˈ�e�/�X��x�uT;o�V��A�zP�Mj��f$*��F��R�XA`ԏ�e!P�E��y��K�v(P�8��dH�v�ڥSСC�.FѽK�B/��%@��s�����W�?�9?ʟ�jz��1Z!v0`΀ipg�It���WSA��yb~$�s.|Q�s9̘Ր��P����q�����f�-�/U%^
뙴\oN\�@����>���'3�z���m�.��ޓ��I�A�����@�p�X-�$x)�+6t��t�5�[\�'��K��r�3�mj�<$v��pOjy���xzbwMc�b/Y�W����h
lax$��Z����;o x��1�����'=B�翚�C�'O'uC^\��$	^K�~��N�5����_y.]��#J��Y/S���]�_�8�Ӊ��,y�L^TN(��÷��*�Ǚ�53;���&��Hn�1�6�eAuv>�ơ*�}`v�jR����u��b��u6tp���_:T���	!}K/��M��ˎ50L��%Тqx����\��L���������P�)2mF�a�;�e�u�wT����2����10{�T��	�ږ�����Cn��T6��EjSd���Yٿ"���1]N0�~�"-Uqt֫�o�o��w���S(������Ǎ�C�|k�ߌ�ӫ�â��#�)�;�E��A-�\�
SB�lq�i��6ژ�
����n��o���+Nb���S���8r���~�r\>�Z�I�0���nR�LXW	.���c򼽮�"%e�C���e�؟�����ŠIX��E���rN�Ǚ��^��X�n+����>�A	�J���}�/���7�ө�;aE^��lޯ��.}���5jClY�J�>��"V��O���l���=�+�PX:�mF��(|r��W�����{
�!��8���i؜�QY�F)��a/'�g9����/x�[j��d�#��fqF
N����Ĥ���Yc\� ��<<*���8c&O�2�	JM�,.I-���S$�\�����=�<�,�[f^JjQ�'���`�L�˩��S������8��K�
"��*7ّ[�-#59�3l����`����J�������=L��$x�[ar�d�1.�м�ɂ�J���7���v&��%x��nr�d�#����fqFI0�����ax�����d�ךhE��
j��;�h�+�t�x�����Qx����iC�ȉ�V���O~����)EƷ�����*x����iC���W�*o��`�y;R����K
��'x����iC��v��T��ƛu������-�l	�&��Ox����iC����*��krO�.�$�e[�����%
	�x�31���ܜĒ���b�E�o�MZ�9����Sʇ���x�31��T���7T��]v�t׹�rbv��T�x�340031Qp,(��LN,����+�(`�<��t�����C�çO'ݝ-nb
����y)�ڛE��m�E���o���f=_Qᕟ�����p�~������Zc�?
pO/[�x�31���ܜĒ���b�]9s-�:�Z����\�uo\:�m�x�31��T���
���l�Gj�Z��e?��S��x�340031Qp,(��LN,����+�(`�<��t�����C�çO'ݝ-nb
����y)��ݳ�c68�q.��kۘ *���ss��o>�4`���[�W�b�2�m�/�}��mx��T�OA�hh(?凾�ⴤP�ƘTF�FLDR�vڮ��lfgK!�����y��D�^�����W���ٝR(,�4�f��}����s|��md��⠟9Xwp�*!.�U`%ثQ!�x�v��UX+���
P1P��bO!lZ����'��v�@���3
X�c��9�$�+TA
BU��^�v�-켩�%�x$�Ot����]$%�;���w�jXs���G�5�@��t.���}�#'�n���ɇ}�ן��J�C�ђ]�96�����#��}��1-����ӂ�LY�eQI�A��<V���R���cy�+]Ae#��f>���5�cĒ�G����N&/�.�N��i��qh��D��;�χ&�VλXTd#9�@Yu�e��I�696������I�/>s�J�Q��V�}j�^:s�>"��I4|�]��eS���e"6�@(tb����:�j��g22`1_�9<6ޤ�R�TG'�H1�@;�נu��զ��J�s�قP\#�Qbv�̽nz�����hh\6�c�{����C54��ڳ-�{�w��ݑ��6_�N�6:�I�����5�zh˝�t�t�G���S&:��b�k`d����.WF/o�R��J蟔�]RK�'� ���pFl�07'{� qj:���鋒�ؕY�bn�kR����
�I�2ثv�f�Ѻ��*P�lT$u�0�"O��~U��~�)P:Jbl;�}{,Q�P�&X�v��B��3����6\�F۬�䮵7I�e�}�	�1��h\��N��+���܍A�0h�,OcW��}RPk���h^K����a��?dr����x����iC����9�cT�nvp��<�Ȃ�
��&
�x�31���ܜĒ���b�o+�7�W_�`վ��xzVCl�|�(�x�31��T��:�Ǖ���������賅Ԅ�x�340031Qp,(��LN,����+�(`�<��t�����C�çO'ݝ-nb
����y)*
3���N��6R~�� *���ss��o>�4`���[�W�b�2�X,����ux�<����g2100644 ExtensionUninstall.php�t�
��{��H\R"��/��g�A�!��Rx�m�AKA�Q�\ݐ�Rē�v��2	!Q�ࡓ�:�����:c����1��;v�����#�N]�v��슖л�c�{�}��[�^y������q�@�5�k����ٌz��Ԧ7,�u�Գ9~̍�s����0�D�+7x���-�㬭)�m{���"�&6�+Q�-i���$㳴�麌�3NLU�m����I���%��<x�Pũ���P��E��L�u��׾%�V�(.뉒1�0�l���i���miِ L
�iזm�3��x�S�XoL 8���r���2��Όj��=���b�r.��.ɇ�ؓ!���w�� �Ă����4cD��K|��_˰b�i�]r2#(��X!],�������x��#�*��/�dk�.>���r]���������8�3���RR+JR�3��&r�n>�a��U���x�i�����d��Ȫ*�-m�Cז��|����x42�>�����]I��#��UC&'40000 bin,�����ɇ!8}�qa���~��.���W)��9�-��!�1�R�2�yx����iC�� VYEy_y���Ϲ�
J{�y�&^�x�31���ܜĒ���b��Y�{>9̿Ԥ�w���
��	Q
�x�31��T��s{
����z�_n�_�}�������x�340031Qp,(��LN,����+�(`�=-��fɣ�g���N��/�Ig��(8���&�0�xmey���2�'�G��J����Qᕟ���ȰGơ�����Ζ�=�f+��0f�H��`x�uSKo�@�[����q�>��R�إI�*.�	���J}@��*�*7�8[\�nhÅ�Ոs�'�3N�.\*ĝ_�����X���7�3�}��|(>_<X�<}�;[��A����bU��s7�h��Γ�� ��<>ԉ�:�*���Ӈ��6����Ѓ��QD�����X��	e؁��Y�.>��b2:�՚�60܎���%�r11�t���XQ���?��kx����,�%����G�����)�d<�UU�W�lTަ����g�!�S�Z*?�c��s��kV+�;]�H��M�eP����tJҥ�@
�3E��L���+�mce��/*�Qn۲v-_�Lj8o-��0&�B5���0H�IXNE �I�'�*��8E>�"b2�&F�m��1>�&���.��d�$4_�1����,�fh�n�9���N�H��x8���f��,���c��:qp�Y�r膵�ȶƚ�\q�8�wǿ;|��4ZXZ������qcq͛(g���94z���z\���Y�~]��e�r��F�l`ӿVE�̱)�O*�B��d#y)z��$w�2�H�`K���޻�^e;|�
%w�V�<� O�<��uMát��+�?��Gb�;d�9o����U�U�&a,5��Q��0�+��a.�Ӱ!��eS�.�5���n����"
e"`��Q�Va\��t֫QO�>>7���ml�^ɲ]���e�++#5|y��?��U��{ɡ�"����"�I'��=q��OP[-�C���Z���>��iDt�K����Q
�!X�D�sk\��"x�۫�KoC9��w����p�N.���\�����	����9x�7����+ExtensionUninstall.php�ռ��'��&��;�5N�i>-�Gx�!�����t�
��{��H\R"��/��0���x�31���ܜĒ���b�}=U:�Bn�<��xs��ՙ�
3S�x�31��T�-��_�}�z���f	�����R[�x�340031Qp,(��LN,����+�(`�=-��fɣ�g���N��/�Ig��(8���&�0d�m�K��2��v
�7J>l(�������Id�#�Pv�~F��]g�뎉�X�ƶ/����x�i�����d��Ȫ*�-m�Cז��|����x42�>�����]I��#��UC&'40000 bin,�����ɇ!8}�qa���~U�P,Aa�P�╙
�W����q;0��x�31���ܜĒ���b���?K>�R�;uI��ڧ�W�0*(��x�31��T�-{%'f9>�ܾ����%2_3���Y�x�340031Qp,(��LN,����+�(`�=-��fɣ�g���N��/�Ig��(8���&�0O�f��Nfm��@�pc�S�CTx����$2�q(;~?��慮��u�Dz��
my-����Kx���z�u+��kEIj^qf~^h^f^qIbN�^AF�!���������=�*U����M���#��)x�m�1K�@��jmڈ"�"O�&��Z��;88uѹ�ޅFһ�\�E��Q�7:�O�GG������KJ�o����������u����l�)�=M�m��2����!`��`{�B��#�s��_�;�;�,��G�7x�(O�ܣ�q��D��3%L�9|K��w�����+:��/��|��Jt�:aS7� Z�LH�K���B@��Fj<S:
d��
�M����'�jhoɔ�r�Tj'����˱�刽��(ȔU�1��^��x��߇�?�]X�g��y����:C�Q����\\%�,�J�F��<��0�U�S��h7i:z
�TH��|T7F��==�I]��k|m�_I�r\J�&r��YK�?��&3?�����9x�i�����d��Ȫ*�-m�Cז��|����x42�>�����]I��#��UC&'40000 bin��s]j�����;-ߑ�~���tf*"��7���g�:��o2��yx�3�����,�����ɇ!8}�qa���~P�8�
"���~{�C��5�T�E�Ax����iC���%�
�On	���l�Ɏe��
��(x����iC�H�0��J�=܂���n�w��
�(x����iC���)� ��L��&SU��J��ٞ���x�31���ܜĒ���b��O3�^[̶�}3�e��
Zw���x�31��T���ϯ��7���K��t���=�:�,E�x�340031Qp,(��LN,����+�(`�=-��fɣ�g���N��/�Ig��(8���&�0t�{˶R~��Ç�����+wkD�W~~nN"����3zn^�:[^wL�ǚ���1���x���:�������D�919#�%5'�$U� ��aQr����U���r�ԭ�~Y�Ofq	X�̂�o�ٻ�{m~��O�GVPZ�1�y�����^�'�ϛ?�o��GÍ�s��o3�}x���6�m�x�G�mGu5�/Ψ=ݘ�m�鷆f&&
Ή��>��%z�D�
��a�I�
�C��Hܿ��0��(=��V�W�9�Gm�1�D�[�մ�m���і/��tx����@�
�R�s�U� �n��O��*��T���p�-x���6�m�x��_�'�ޟ���s�]��S�����(8'&g��d��d0��>o;q�w��Sv�]q��g'%!+(-JO�,����Y����Q|����6��c��-9�tx�H�����=&bk�ʢ�}v�k��m�@��(100644 CacheList.php!���>�Q�9[���}ڎo�T�Pj��Vx�7����7�WUwOV�w-��PޖB�+?ë��,�\�� 9���R�~�]E��Ex���v�uc+��kEIj^qf~^h^f^qIbN�^AF��9~�^w�QO�Q�_��t޳��5�����Ex���z�u�����6{?<U�9?'+G�f����!�-x���z�u���v]}��^a�m�i'�+'��l����;��"��x�m��J�@��ҴAO�ȴ�d�͂xh���7�"x�I6v%�m�
X<�^�}	���W/���h�4�4��������gᖄ!���^K�#&xR@�m�#I��PA(DLR�1p�`<�$�Q($u%��~�pph2�#�g�!W��%��I&OVₚ����)qȐ���D`d,+#�u��P_����vTOC�i���,uP^W�Z[o��?3�Ùz�o$�V��aw�q���f��L�VF�����̬� ^߹JvG�<-棪+b.��gYK�y���^�����m�G�{�ie��f��H{�l�X_S���Z���=
��!x4���˥p���n���j��cx��"�,���i�|�c���YOL�a3�,���+.I�ə��&>ٍ]|r�Sf���8���f*)I��v���%�~����E@frIj�������������*
MM��{9e&�r
N~ϩ�Y���(.�x�31���ܜĒ���b�o�{�.��=�:���O՗O���*�A�x�31��T�)o�T�Ur���i~�J�"�ͺ&ٱ
�x�340031Qp,(��LN,����+�(`�=-��fɣ�g���N��/�Ig��(8���&�0�rm:�zm��փ����9�Ž��+??7'�a��C��=7/t�-�;&z�c�Vγ0>�x�31���ܜĒ���b�R�
?�=窏Ϫ�{��x���`a�x�31��T�3^<�����~����f�6�]��ڮx�340031Qp,(��LN,����+�(`�=-��fɣ�g���N��/�Ig��(8���&�0l��U��;Q�o��Ao�s~F(@Tx����$2�q(;~?��慮��u�Dz��
Ǫ/����
x�i�����d��Ȫ*�-m�Cז��|����x42�>�����]I��#��UC&'40000 bin,�����ɇ!8}�qa���~����;3��<�Y��߄V��<	0��yx�3��������4�Y��_@�2�4�����꯭�_�QYfR��p&��r,�Ax����iC���%�
�On	���l�Ɏe��
�x�31���ܜĒ���b��+�1
�<�C�&lM2����C
��x�31��T���f|Li����L6�z&Ћخx�340031Qp,(��LN,����+�(`�L�`Zc�aQ���{p�p;mb
����y)���Ϻ-����Aq�'��Q�^���9�
w�7x��I�-�u1f����,����x����iC��sZ���G��<�f}�"߷̨Ts��
��*x����iC���á�oI�4�tMf�u��l�b
��x�31���ܜĒ���b���Yޒ�W7�O���Z��Ňe+e��x�31��T����+O8h�_#}N���a�Sw��T�x�340031Qp,(��LN,����+�(`�L�`Zc�aQ���{p�p;mb
����y)��v2�p}�\���2���}U3D�W~~nN"C����l�c�s�j]�YF�4ڳ,j���Fx���t�iB�ȡj�?b�߮�]�헟�: O|���O�u�,x���t�iB�˓+���4��"b�yqn)�5�����
����ux�N�����@�r�/kt�.L�4��1`�3!���"��߆s���
��?+
RCn��Y;��\�
��'7g!���� x�}��J1�<m�A�.͂+xݲ�"���K܌hg�d�)���k_D�5�����E{0��0��?_�1|�=ޟ�G��(õ y˴�J���L�/���b\[/i>I`w6I�f�o\_^Ů,�P.ȋ��xޥ��[O1]�6j��M����ǂ�����Ӗ�LSD3���Ųl�����/|�Q�C<(K�C��pF���aX���I1Kϵ�VaX5F��R8��Ç̝c��?m�|RPyS���x�;or�d�e	~�Ă]��Ԓ�Ē
���$2�t
���~x����iC��nJϽ��[�l4���3}Ѽ�*
`�x�31���ܜĒ���b�v9���K_מ{3����|Wn5
*�x�31��T�E:�f|�ߠ�Sl��FEy_�
�x�340031Qp,(��LN,����+�(`�L�`Zc�aQ���{p�p;mb
����y)�z��خ0:�qnk�-���ԶKN^���9�
w�7x��I�-�u1f���,���Tx�����S�1RU���֬�ђ{?+y���g��;���+x���4�i��ȼ��g6��3��n�T?����ȉ���D��Nx�����\�������0���J�}��J��aa�x�31���ܜĒ���b����vw�G�w2N��f�'�����x�31��T�3�M��
z�u��>�*rd�hg�(�
t�x�340031Qp,(��LN,����+�(`�L�`Zc�aQ���{p�p;mb
����y)�';�͹�?�j�,��a"O>�*��������Idh�{���ӀmLrny_��1ˈ�#.�
�'x����yBp��F?o��9��D�Sy�M��
�LL\+JR�3����K��K�
2
�Ɲ���\��qj�C�|t
.�ʼnI9�`����O��qT���$q�zU��<���֌�l��}�w�2ߎ��ONL��H1��mx����~f�!f����������r'����'������x�[j��t�"��,�~��YX7c}Ʋyw����9�D��x���OJ�@ơZ�.��8!��q!HōBVvY�i�����8�H�
n�9@� ��o�R�`2��k,f3����˛��{�����a��A��G�Ե�(�AUSx�9r���JC�2�0��!����:>34B�s�%�h�c�iht��s(P�
2���L�h�(2FL��L���<cؘc�$$�T� �r�"�(*�f�����SӋ�%�Uo
��q�W׹�VkLr��š��@��}� H,ݡ,�%z=fL+I{�N��6�艇��ēx�Զ�G�q7-�{k���KϦ.{��#�6p���NS�,:W�*����d�X��x��ǩ���&�o��Q�z�C%����ث���V���?����]}���D����yx��U��s�##�s~nnb^J��Ȩ��X�^���79�q��kEIj^qf~�KfqbRN�B*H �X.1��I��S�K̝��d���
���R}--0����W���_���6��$��G�93�d���@I~z:P�V���e�k��JIFf��]qj�_bn��:�|����5�&[��)Ü���������W��	1�h���"�ɯy%&���X�
v����̵\�6^�l�gx�[�y�cC2��}L/!��
��ix��/��s�"�d&9N׊�Լ���ɅLYQ�ZZ\
 ���W���_��������P\�X�
��)q(K,R��+��tAQ~IjrIj��JI~z:P����5��L�����ssRa��O�c����b5��D�+��ɲ����B2gl�x�[�y�cC��L� c�x�31���ܜĒ���b��%���
m�:vw҃���
L��x�31��T�//>WȈ�\�oJ�q�m�B�-��x�340031Qp,(��LN,����+�(`�x4xF�e����=�o��T�����s~nnb^
��g�Vw��7���l�8#��oD�W~~nN"C����l�c�s�j]�YF�4-A�	�Fx�[jt�x�#��fqF
NƘ�\:�yxT&�q�xӹ��q.U�̼�ԢO Y1��D`�^Ne�����̼�����\rl�9�P�Ɏ�:l��ٞy ݓ
xX'�p���W�6�����.�
x�340031Q��+.I���+�(`8l����u+���J��ػ��E�[fN*X)�e�Ϗ�r^\}u����'�{	U���Y\�ZV��i����D��+�~e{^��MM�KjZbiNI1X������u׺.�r�!S��P����9�y�`en��ߕ~'��n�WN~��]�W^���Ux�[Ĺ���ƾ �`"��p�kEIj^qf~�5WrNbq��F�������>x����iC�HZnӑ�mf�%��=�{�b\#�b3��Ϧx�31���ܜĒ���b����wJ���:����zw�F���$
��x�31��T�M=e����&$-���o�+�G�J5�x�340031Qp,(��LN,����+�(`�x4xF�e����=�o��T�����s~nnb^
��W�Oo}�˔
LO��_BTx����$24ܽ�|�i��?&9����Ře�O��/_��x������AtѰ]�E�_c�MA�,i��ȑҾ����Tx�7�������1��;�-�)�5CcpLT/��;Y@��h���ޅħ���S<�=%����Gx�{��i�&�Ȳ
z_�
�K�Y�y-b�d[FU�w
n��yx��&�]~�.F�����6�����sx����iC��|�����;G,4�$�2a��Rʦx�31���ܜĒ���b���S-�z�R��2��%�ͪ�W�x�31��T�*�'^�xiܹ �����ߚ��:�x�340031Qp,(��LN,����+�(`g��j�}9<�]J6��=�oL�@�9?771/�aqN���3��mu|�wѴ"��d�
���ܜD�����<
��$�պ���i?�.���]x�[jt�x�#��fqƫ��n�y)�E�@�b�N6�>N��o��2R��=�@2�
xX'�p���W�6�����$��'x31���T��]��+�NX�T��O��k췦���]K��S���x��]o���s�Y����(�V���g��y��$���d0�M�n&X��TWh�|�N�ڥ[q�w��I�q��w��i��|��3��a�TQ憮'(5=��$��a��4�yK�7&$�>�6�Ǖ��pipIMK,�))���8�ȅ��U�j?�~hQ����$����ܜ̼l��e��$�}q��99f�~�]�ܑP�9��(^�x������~�o�'���$c�������!�Z~>�~_Rx�5��a�'Q��(*C�2���e�Z�ݢ�>hW�����PH4g��2,=����^C�]�=�W8�yON;�4d�X�]8Ce��Uދ5g�T\Ux>CM���!h�ƌw�CTd�V���ر���Aa�E����b��xօ��i�^6�g6��.V�Ia��%7�I�3=_�7��r[���_�3�D��`x��β�u������'��v�n[j-�^`�(�ɉEA"��6�m{�ݥ��C�|���Y�M��������8���:�_���ш?L�����D�-3/%��HT�d0Zq�!xF����>����(�Ei@iQz*X��J���9���	�eOy�~_�dGFI���wny�aOU$3�eA�u��y�)"��m��S��%�J�u��mU�<'?c41�i���v纭�aU�ֿ=�)�!5Y����j���wx�[�z�U����3RB�c��ngh�Pk�9��߃"��2Q����3x��U�n�F�
$�P �!�LT�$]�rme[�c��U�Pk��Z��vY�2�Z|�^x��=0�}�}��D�?������fw�������գ�������E؄g.���yR�=��o�㭭O��n��@�{�A1!0�XNIߡ��{�g��I�ת�``�t�fXZ)>%�:�5���P� j��r�q�P��8�3xlo�'إ��="�б]ޯ��O�䜊���r&��q��1Έ�(.��\Ƀ������ﯽ��s��+O��7k�Ul8X�K�	�(���%��J"���J��*��_��]`��/���zX8ܼ����z�ǽ��Q��`w���J奸����
��AA���b2��2�Q0}Č2���aYq��}����4���
^~)œ�y�/���f�?ޏ��wH�<F���=r��ާa�0�ZƝ���a���֎��B|P�n�iڭ�>-�Cϒ��OY��Z�<ZC.���:b.Բ�-F�F&~�*��Y�`��w:��9��Ft
�!�'�s��|�Vm��M�%Fi�����T��oB(����^�_��
%6�pb@��JC��ŰW����TM�im~��s�)�\�_����Yɓ�`t�<؉��IT̘�#y*�����a�u|����'`�QC!q���dW[
PcE�F�T��B��R�	�g-���V|\�h���w?��w�R$�H��n��I�W������7��)����9�x���`�K��Q2(������0<�9��G̴S���l'�y����d��^����Z���g�����j7�\��dN�x�|��C5��FQf�v��}&�h��,=�
�z��V
J�lu\��d��B��ʹr�v�)@���x[{p/��?�� ��'�x�m��OA�C%�;���iH[h*�n��Л�d��1J<��f]fV�Ы�ϕ^<5��jL���U����6��Ĺ̼�o���}/�����Z�h�_��e������a����Te���5�d+�%�T#��y�@�X�۱�uɽ^x`���(㾛�{a�%b�|�I1G�H|!��J$f���e>��� �|���=̚EZ�0'p��2�H��h"n���B���q@�2m�*�7�gĠ+����D
7X6�g���iߓ��yt>�cvg�^3�;y�AKX�>�X���j/N�m�)��jh�^1����FIŵ^��xk���z��$D$�X����Ϥ@Jxl���͠m�I�б'q�.aŞ���Zoz���cxme�:#���w��nb����
:_F�Y����k9���`�U̺AW{;m��]�/w�L��w/1[][�u
���J��Tx�{��Nu�v�Ģ��J�ͻY��[<��
 x�{��Pm�;���YBK2s6�aTgKP)H,�P�UPI,(еKO-	�54�4@���2�rK��r5TJ22�u�J����S2�4���:����5���b����d�ɑ���+8f0�V���g���(L�疘,�-ͨ�9���q�y!�͕<�l'3G���ax��/�D|���Fç��1�I�%E��%��%���r�����x��m��f�1��Fy&�Ǥ⒢���̒���L��z
��,x�[`��fC�X�JAbI����JbA��]zjI�������Z��ce�Y��X��_���R��Y�kW�XT��Y��`���ԩ�`����iͥc�l'/�*J-,�,J���KN��l�/��)����2x��U�n�F��r)�@�čm��"JH&��:6�ص#E� AQ �i�5��6"����?�{+���C�c�^�
Fߡ�^�=�LJ�c�H�7����7{��z������/�*U�n�2N��a�NjSs=m�@��}0]D�
v��ۇ4`�'Qr��C���1�E������G�;Bz�
��'�V�+����Y^]����df�!Q-���Rxh[��4�e��EK�;n{�u���o�__�����̳��fD遮��1G�!����e��X���?��뼋��0�G><q�N	��w�{(�dӺ`�.��{�M�� �M��wlq�vU�T�	C�����r���ұz��D�s Ctp�<Ş�c����ͱ�)m���
��'��p��hOr��c���n[�t�s���J
ve"֑�1�<�;���湔I-V�ĚyiC�qK�X��#9u�[�9�4�l�vER��}��QY�(�'�DL,���7����p�E�X�X6�Z9�Ut�`'���:@P.�Ï��z����~�7���(J��U+�5��$w8�wT[�c�S2�Vy����j��LkG�tPȐ`�D�@i�jv,g-��8w/E��(�qo�0��~�\MG�4-5$�WӽZ�6'U��Ӽ#.W��HN��)������wH �(��0"E|@c��=%��5I�f���$x$���M�����3��A�B<y��M��:�AĿ3���
dS�p����Ht8�C�d��'��Ĺm����Ԣ1FZ?��õ�H��~5�Pam8�I~y	�[f�X�Ϗ���0��F�G*-uG�a�ۗ�J[`T�9Ҭ'38q�?��l��a.,� �q|�/t��^��U�Y^�Y]՝t�Ԯ�2��Vg��@��N�q�?��ˈ��x�[n��`�	vѬ��ܜĒ���bݴ��������=p��pxI`�Q�Q�<�[d����j�9R��y"�0vWl�ŝ��PG6�fYx��TAkA�RQӖ�$��"N��ѓ�Q�I{E��f6�ٍ3�`��?����͋X��?A� ؛G��"�dwgg�)�v�����y��+�j�gʔA�`�t4��G�����X�w���;Q��82�f���mOD�n�;> ��)CdG�kC<C�G�Б�	���W�8��v���䩠�hN����I�����hD$�Ч=�23���T�u�y��ў9����|z������������.R�H$����
��XV�8�e	���2�=}��cمEM%�\	��0��A�適���)]�g�ف�g�[���T�2(��J���DuXU�O+�SA�Z�����N��>��*��8�������Z+B*�U��e�_���xO���H�
��\(i�z���8P`����P����H�mfa�: ���� ��]��K��h�'�G�Z��a��b*I ����$l��z�	:h=~C�˫թ��\�7�{y�.��ˋ�*�A��X��Anvo4]_1��]URT�y���EK�ݻ�^�F.�[��}qQ'��=>2d1�����T@���V�Q���J裑�^;�ٶk��րhk�՘n��,�n��0=�r˥!-M�@ڮ�̽+���4Ԓ���qCf��{�����8x����_e�1���Bhq�B�zbNN��BI�BqenNf^�BjYjQ�BZ~NJj��fc�[�6�i
��y%*%�źvP��
��
�
jj
���� ����rJN��& �XT�X��iͥ�T��K��S'��PqQ�SP��R��BQ��_����������U��������������X��q����20W���X������S �#����"'��Q���x�;��e����,�%�9���RY�Jsr672�d�Qp��/).)J,(H-��
�q�,�zͺ �$C�V���*�8 '�$-�(WC�$#�X׮$�(=�$>%�HS�^�+�1�#�WAOA}r��������5��g���* Su@��(�%��B)M. ��æ*�����4U�z����Ul{9�!&:��z�y�9��Am�4����fY!]��L��
�� x��&�Zx����,�%�9���\X�Jsr6'0�1%$�d(�*�d��2�rK��r5TJ22�u�J��SK�S2�4��C<�=C\����s��R�J�A��̼��"u+$u�\���(�������En���0���r��BIQi���d6V��
�o�!z]|=�<�C�C��@�M�̮�y�.Fe�C����Ux��(2_d�Ff��Ԝ��Ԋ�d
�ɛ��4��s�S��j�5���� 3MA��(3WC�(��4�Ds3+
�Ml��qx����s���F�z�l��kx�;�{�w���F�	l���Cx����iC�ȬlV��]�Z%�X�1�OT:�����*x�����\��1@ϖ�Ƒ���=�Lѩ��G��x�31��̜�b�^.����/�|�޷ZC��'�c�������BV~~nN"C�ܔ�
>{+�{?�=�*�������x�3�����aХ3�A4���-�JA�r2��&a�(Aצi�%���f#FX-���x�31���ܜĒ���b���|��.��׾�s+�#��	��x�31��T�Ez��O�lW�����Y�]�����n
��x�340031Qp,(��LN,����+�(``U�z�O��LiY�y+����`b
����y)��9����/��]�ly3w�F�
D�W~~nN"�m/�-�+)O
	}Ο�eU�+��,,���x�[j��p�#��fqF_��8�&�;g�&g{�M��)�O��f)�ɯ���5���s�=���z�ɱ<�:����i��Yx��ix�h�znn�̼��"O Q1���PZ�>9�Gn�zn/^��p�x�340031Qp,(��LN,����+�(`P6^�y즒=���2=ل���
!J���K�K�
R��j+�Zx#��hd*Y�9Q��iە���В����K��U4'v,��Y�����l�e\.��D��1x�uSMo�@U�s*��CGU$'!��
T�n�$��D��	�R��8�z�޵�B@U�#�ď��B��8	�{��7o�̮�_�u�j�I��Q(�P��F!�pE�>�A����ryJ�Z�EZ�r�)D{�!~��P?�UuȹB�a�C]L:�"?��#sp&s���Cpu2�J�@^�Fa[/O3�Lf*yA�;��󍗌��y|�/9�r&m�Y��� �(q��
BC�Ɖ`�HJ�J�?V+V�'���4*P�T�+�{��#	n���Ab涥�k��(D>*bF����&=�������
<`���'x��O�>���bZ�{}Ӝ���K���8����i��T��G"�4Z�@�����T�4�����Fk��hUi���x�I������v�|�h��MN�����I��o�h�4�H�1[׌!�jykN���N��;ڜ���$�Z�ݘ�ҥu�@A`L#��U�i�rB�W�2��\9.6�e�t҃���o6�Zl{�yj�ҹ�~ {�<�'����Ƃ����.͚s�8]�D�6H�f�r�=��3��L)F����GVfu����ꬪ9�K��|���~�ηY����Ba�F���Z(���C-��|���iPy�z�Qi�:��[Q��-����F�?o��Ux����iC,���[�f�g����Zn�Y����k�x�31���ܜĒ���b����X�3�H�L�6�o��٫�!���x�31��T��=�6O�vo����"x��1�{
i�x�340031Qp,(��LN,����+�(``U�z�O��LiY�y+����`b
����y)��w�dcK���Qj���/���B�
���ܜD���.^�[�WR���?�˪�W��,3��!x�L�����8?�uZ�]��
Z�y�J��Q��100644 FinderPurge.phpv��l��sB*r���N/܆[ӳw6�] �[x�[˺�u��Hê�k����8����I;�ه1��0����x�;���y�cAANfrbIf~���w�:�":
N��%�%E��EVV��!���X�x&�T�,+�+��x�x�31���ܜĒ���b�4��y�+�J_z�&u��է
w��x�31��T����4k�}Xd�P�H���E9��]U�x�340031Qp,(��LN,����+�(``U�z�O��LiY�y+����`b
����y)�ϕ�.�9��wgީ�=�د@Tx����$2t�݉0�T��<�_z}��E��5�+w�x�340031Qp,(��LN,����+�(`0�N�>f9eC�7�ƍ
���!J���K�K�
R��j��D�~��!���)���ej&CՆ�d��L^bܬ�9��`i�͊-/�f[N2O��1x�0����;�{��hJ����4ѓarray(��));��
��t���hx����iC�ȍ)�yo�"?��5����ܩ�i��Ȃ3�*x����iC�H{柃�;X%
�.�]wE��T�[��
O�x�31���ܜĒ���b��GjJ�7���������[~-��x�31��T�9g�*��
��x��G�ʟՕ'�x�340031Qp,(��LN,����+�(``U�z�O��LiY�y+����`b
����y),On/^�(n�e�w,\{����KBTx����$2t�݉0�T��<�_z}��E��5��)�l�x�[�z�e���:F}F`��x��β�u���[f^Jj�'���+�(`x�N���ώ?�X�W=}�d����MC3�ҀҢ�T�R����r^��y�s�q��t���m���~%����rx�[��k���5LS�'�rjr��'��N~ +��_���1F�ɋ��7ϐ�d��[Tqr���d9N
�T]���_�
��d9����	]x�[��e�'��l��
@�RPZ���`���Z����Z�д�R@u�v`
�nr"�0ȜɜJܓ�946�g��>9_h���ɽ"�uD�&�[0�O���-"w'O�:�W�n���[ -�YSy�T)�͵��8�V2���
x���r�e�	n%�̼�|;%=��$x����>Dl�-��fG��]	M�D��^x����n�0�Uh'�\ @�@�a��$�]�B(��K!U7Ek'�����F�I�8���~��CH<O��`'��z��/b����㓟;�~7
<*l�R4��(a�.��o��/[~0��N�C<e8İ�3l�cF��gŊ��	1�(��+�(����J�Z�j#�����x)T�$U�o��S���y��Nq,��~�x΃���[o��h;~�":��
��FYZ���vKh
�Lׇ�u�0U��e�`���p.�q�/�%��M(�[f�su�Q�0);��"��#B�<�^N[!�C	Y!��J�
yw�)@���m��9]�gV`�R�"1�\��z-!��܏����dS�qq�?BJ���_�}��T�I�`#?�6җ�F�ǣҽ­5�K��
�<=k��D麣*-��<q�ˑ��}z��T4���w3��jC<���H���x��<�X�L�Z:4�(R�֦>1���Lđ4Y2xs��8b����avE��%4��Q
�+�dYL�8q]�^B$*��R�b�T��@����X���s{M���au�C�:�\�h�IiHUټ�`���կ�Hx�3u�v	���SvO�M�ە�����/�(J��fx�{$t[h��ɡl�*���ʼn驓Y9���j���	�(x��-�Qh�
'��Mf^Z������ne��Pgg��`uM=%}���5��rq�r�
O�x�31���ܜĒ���b�[�k��ٝt�5s��;�S�O�&
�x�31��T��Im�Y˟�+g�Z�Orm��
Ӯx�340031Qp,(��LN,����+�(`xryѢ��~$�1>#����� Pp���M�KaH(����׳UQ+~����l����+??7'�!�t_H�Hͮ�EOh�cl�Y1�:.��x340031Qp,(��LN,����+�(`���,�m����}ʋg31�%B�:���%���O�<X��C�ύS���>��L��
-����Ƹ��}��*_W
	{?�+��Mr2��yx�����.2y�q����΃�Y4+��X��m9��j�7��Rx�mRۊ�Pe�IQ:̛�e:�)��D�6#��#���d�9��Υq��/�@ɧ̣/�����$�0''a�^k�x���i���o�݅�n�Y>�{.?�,c0�a�#8�
�,Qi.�����%�e��/W�f�N{�<jOʯ�Q9�ݽ���V@O��~�zC�V`��
�H���R`�̤\���п,��ay~�Ha�F���r�9�ծ6D�>�s��+h$3)*0���ONO��	j�B"`$ce,9#C���@��X�]ӈ�J�#�!QrA%��0{:TJ�A.�����kϠcU�
Y��p�L�]CI�R��Y�%�G�7�������oow��<�N2�~���<g��Q��Tɂ��#�+˜�:��L�*�4fA	�q�EA�V�2���`���Pj�B�́,�� ʤƞOB1�%u�u�TFH3��P0a��{�
�UbP��r�‰��z��OӔ��Vu�"B&Mj'uh�<���jJj����VAh5�u-7�|�L�޾���N���&�u�Z%0*��M����TQ������:[��6���x����iC�H�����\��zְ9,���	u�*x�����\����Õ}�#��	d���7�Ǧx�31���ܜĒ���b�m��^����>DZ֍O���q6v�;Xߢx�31��T��vo����rJֺr�~��QQ�N�
��x�340031Qp,(��LN,����+�(``H��fj���յ(�4�&�a��&@��������d���욯��4����Q��+??7'�!�t_H�Hͮ�EOh�cl�Y1��*#l�Lx��i��p�>��9��+=���kx�[�z�e���:�.�f;I�uN���>WR�
�b�2��2Lb��1x�/�����#iteCheckIn.php֕٨���cs%��Z��*�#�����j�x�{Ĵ�i���hvFz�x�31���ܜĒ���b���s*�{����f�[)�`k��L��x�31��T����7~?YZ��u!�w�������!��x�340031Qp,(��LN,����+�(`8�\8蘵���ܠ�3-&�i}e�����ss�R8�^���<�}ᕹ���Io� *���ssRJ��d����_�ta��=�&�3	�,�T��Qx�uT;o�V��AڒEI~4�����D�cY*Kmc���n� �%]I7�xiޫ8�ҭ
1:;ڡ@�h�ұC�.]<t-��/��!9iQ��w��~׿�|�{v�;������hC����;n����]�3G_L�%I�W���|�L��&���Q�0M<�"��K�{Y계�1�I��V#Hͷ*

/��+��T-�*�����"��\7��46�oy]���]�腢o�G�cc����^+�G|�ɹ�Q����l��mQ��B���sl��o����f�ڇ�K��,��4�g�q�2�
�Cܧ/�����'���3�)1�S�K"'���JD�Q���$g��W5�T"�9�����3FmoD��B�(�q:���{�F�h�>R��R���=�,�̮�G�8T�;�I�1�u�oڤ�/���ˡ�P����(�[f�EmF-\r�A�ذ�.����D��:��Ȧŝ��du����9E����8i�\L��ɋmm������{�L�ѲLQ�4]�� ��eba>��mɼ��8��������-N]�st-��5��r~���NНx���"����n�`��q}�П��ڵ�9Lv�9,��<�^`�M]��
����%��Ļ%��[@���ĕ�Ot�6E���y�ߥN�*,����ۘ=y��b�=�!��7�h&�����x�]�|6�d�C���m��B����Ӆ�IXI�G���jV�����B^W�X��h����>[A	�J���}�/�ѯ���L����.�b&����,����V�ز�i�:�|X�I�vm�r��lo�O=����QX:5mΐФ~Ҿ8�ᗨ��"��{��!�/���Bv���R�.�^V������x�[ex�p�KAN~����=�����Vx����iC�ȫp�9�J7u�9�ˣ�ţ���,��*x����iC���n���x���<����&�Ue�x�31���ܜĒ���b�Ƥ��lɷ�w&$�믻ٛ�+N�x�31��T��/��Oe<g�{uw�����{���k>�x�340031Qp,(��LN,����+�(`8�\8蘵���ܠ�3-&�i}e�����ss�Rk�n��tvKʖ���6�2����+??7'�!�t_H�Hͮ�EOh�cl�Y1�o.���
x�=����(�~��"�à����]���r����5>z�4Y��4G��q<�C�o�eHk1��Lx���r�e�oF��ynw��*Vuh����R���<�l�x340031QpL*.)JL.	�,I�+�(`��^��"�0é�%ß�wS�/�r���9?/-3�����/eu���e�.��?�n�c�¢�D�qW~�n���s�˻D��?�^Ⱥ�|=T�KjN*T���g	s�X����ήU[wU��U��W��6}�����fY��}�y��9��'D�*�</'?1�n���ޝ��Y���}��OT���<�Ksr��"�o�X����#�E�̛,fU����V�*�����h�Y��g�֚�������x�����ٗ��-�P�O ���4��w���L�����yx��UMoEVp�:����G�$��v�R(A�$`5J������0�ۓ�w�3�VI���+R��#R�? ��z�Dbf썽��b/�3�>��<ϼ�B�y?�?�ѓ�OU��@L����[�6�^�ICN	R�F�Ae
x9*Z����N�(Z�O ��&CP �
��TJ�\0��D
Y��/�����9�Wj]~2��ԗr~��r�N�W��*�
�}�_F���&��|:�izw���{�t[N̼]!�
|��X�𔵀��'4DP�@�w ���Fj\�������x� �Ko<�~�	�ۅ��sxH��9�e�?g./mw��m� @�17�+hq��gb���r]��I����:������Uq���*&�ֈ�����u�
�8bLj��L�Qk(Sad���c���K��W�.�Tq�
�K���:��c48����r�!J�Ѓ&ₛ��7>�|��P)�L��i^�Sf���4��ZS��<n[�����TޙZ�l��6A�QS�[5$v#
���y�|�|y=��V:�#��t�z
�jnM�|qU�]�X`uءr�-��M�ZS��2��5K>q��
~s+�B�a���8KMA��X��R!c���9lD�m��;�l�j�ן�G��
0��>�԰m7Z�q	��P/��Apx1T�ϧ\}�{��{k�.}�HG� ���D�s��c��cH�h$�	P2�~p�V���˚M���ch���
��v]����:����չv��4+����N�$$7�4�RB!Q�"��)�#_-9�g�0��|;a���^�yG����|Q�-_������r&}���M�xe��획x�v,��y'�ٽwe%���_�����D}�*� �\__h�r�*���7jVw�Q�Z9[/i��.y��$G	�L���4�w��j�{�~���<�e�g�c��缷`k�o��g5@i�u��8��C�y�vo���
�!p۠U�}Z��N�[���`ҧoO��{wU0�J��>^�xt ����S��Yc����#x�;�?�`��d����������

�v
*%�źv@�f9�^m.$�S	�V��0S�u�~��bx�uT�oE�K�4N�SDZH�g��v۩7iB��i�O���E�Q�zloYq~�V券@x���P�.=��*q��\��H��]'n��evg�|��}�X�9��d��s��ڪ)B@���ݦ`p��K�-���m�-Fk���嵫�&�ͅ_��]��5�.�曶�2�-�첀����nH��$����À':n-l覥��>l��8y ���<�1J,��8JfwI(OE��A�T�
f��z`��@��*5�.���
~�u-�;�:+CŴ�C7jo��pX��S����./\�@Wḻ͒uItp֔���)��
��aq���Au��^���{�A���'܀lV�om�vW���߽�������C��
%ZʞL���⡞X�
�2\���=�ݢ��x�'M�g�
U�[bz�7e�)ՙ8��:p�g
��EÐ�ͦB4����S�-�aL�Lb_�2Y�6��4f��p':�O��A��$>���d��}3p�H�ು$��o�xB���d$��kR7&DNnI܉��v�J&b
G�kv��~�Q�-��@"f�:u�9`�B�������9W0xӖ��K锟5�Ay��M'?������N�_^Z]Z)f2T�<L���t�

c�;��L6���
��M�����:�6~8�
��%��&s0yl���W����{����J0��\Ow�5<5=�ձXtQ��t+�t&���ӟu����+$��!�!C�����#E�P��9R7mR��YƗ�Q�*�buh4K�i(��k���#�x�n˕
ֳ���Y�I�T9�+�s�Ҫ�d![y��@/�����[�
�l�Š<E�4l��A�v�_QC/��G�5��/����r��m|[i�`F�(��>>����pj��޺�+d����~�@��*�����,Fg�o���a�'��0`w�njX���r��o:��^�R�\g[���RR(�y4�g�ٿH[�g�8s<���znP�~7�ْn:w �v8E_nT�s�x�_�]&
wH�J&���U�x��I{y٬9g���QE���K���L�t˙[�%]�����m��2p"�M�jQW���l\��7x�)��5K^��'��Su��ww&���nx��x=�5�2!�ǰo|Gfbh�G��2s$�%���T��t��N8ƹ�c!��=��O�;��u�T1�R:M�i�N���h�I�
�Vx�{jr�t��Jfq@NbIZ~Q�����c<��\\
H@%%�(5�$���@�$#�X׮$�(=�$(����l����~yj��������5�A�i
i�9����%����3J��S���J&���*¥�$*J��2y�7�͛_���&�Dt�x�31���ܜĒ���b�0߯2��<}�l�g�"���m�âx�31��T����R}خ���~��kz�W
�
�x�340031Qp,(��LN,����+�(`8�\8蘵���ܠ�3-&�i}e�����ss�RfY<X7��f��Ͼ��g��q���+??7'�A*�q���'��m�`�q��5�6-��x�340031Q�,I-J,�/�+�(`Hoqտ8�8�E�^Ʌ3�z*{
����x����iC��jq��.��L����K��u��
m�x�31���ܜĒ���b�#���{�>���pA���Z�Qw;��x�31��Ts=��^?�m�;�����
]+�G�x�340031Qp,(��LN,����+�(`8�\8蘵���ܠ�3-&�i}e�����ss�R�k���>D�ܻ|Tco�;5g��^���9�R���?�=��X�nˎ?笉�n,K��	x�6����?Pf��6v�5-�S,j���RR��f����`aG���T��ك����_�����Fx����iC�ȉ�E*�z.�O]q�x�ͩ��8cȧ
��*x����iC��p��J/w	_Ww����mu ��
��x�31���ܜĒ���b�[���u���ciu��~E֫�� �x�31��T���C�rkB�˭y!"t�AW�n͡
�x�340031Qp,(��LN,����+�(`8�\8蘵���ܠ�3-&�i}e�����ss�RN	��2,<�U�����PRwbD�W~~nN"�T"�iO>.V�������9k"��+��Yx�S����� 
�O1?£^8�ƈ���2V�A�q�/����zY9p��nd٨
zK��[�@�r
�M-������x#��bx� ������"�à����]���r�������T�.x���r�e�oF��}{d�ot�Y�q��~�:����L�%�x�340031Q�,I-J,�/�+�(`��˞�'a��z��<F�	
竒�<���|x�;%�#�!�e�'�OFf��]IbQzj���l�
�
*%`��Ԓ��Ē���܀Ē���Y��U J� |=���Y,��4j@%5����kr'����f�_�[LV�0���a6y���3�8�&�qj�hZsqM��a)�<�Sj27+�^f��FqiRqI�L ?'5OC�VSS��8���
�ϲ�OV��)GV;9�Kdr&���>.eNk��j�j�[
��px����iC�H�Z�H��=9�.�Sg=4��ɶ�a^�x�31���ܜĒ���b��%WR;�Z��c�v���)k��x�31��T�k���o��ꙟ��u"�t��;�M>��Hx��˛%>���˧�������7�%�;
.�x�340031Qp,(��LN,����+�(`���,�m����}ʋg31�%B�:���%�����_*4�ϴY��	�V��+�^�H�6�$3��㢗�-^��|])$��<���20����x�5��J�@�)xI����L�MbA��<HO٬kwu3��l��ҳF|A�O�3?����u���rڥe���õ$��f�CR�'��)̫�f�ACZ 4�2|�ӵVA��Y���EY�P�]Q�
��7*I���X+`{߷�	��	�)φ�E5.�5IF��ݷ���|!�D��<��LQ�<�@
$4RX`�T�#6��&��4E�}��ɑ���Q���V�¹(%B�������/�c���~x���ȻA�Q��8U�+??7'�$??�8�9?�8?'5Ʊ� '39�$3?o�<�YF5u=$A+�0נ`O?k.$���Lf��lVx���{�w��f������Cx����iC�H��N`��@�d��E��>��,���7�x�31���ܜĒ���b��g_��l]Uϥ?���ͥvRϢx�31��T�ggn��H0��˝f�v.�aK���x�340031Qp,(��LN,����+�(`8�\8蘵���ܠ�3-&�i}e�����ss�R���#�ie��������h��������IdX�&Z���d�}G�m����i߳d�/���tx� ������>�BWs���"!JV�Ƞ�C�������x�340031Q�,I-J,�/�+�(`8�vԶ���~w�<���=\�%}�l��(x�{���{���F�� �{�x�340031Qp,(��LN,����+�(`���,�m����}ʋg31�%B�:���%��ծi��P���VB��Vc-W%HAՆ�d��|c\��ŋW��+��������|��0��x�31���ܜĒ���bNu�l�EK�g�
�tr�n^�
�x�31��T�tƷʡ׌���9Y�Z�wG�ݮx340031Qp,(��LN,����+�(`8�\8蘵���ܠ�3-&�i}e�����ss�R�٬[�����Ag`ӌ-�q�,
^���9�{g=ٶ�Qݦ��qmsu>m��w,��vx��nn�Z��[%��Ŷ�T���Ԗ�k�m��x�31���ܜĒ���b��o���۝��+Y~J��½�fq�x�31��T�9‡�&�g]*�嚱��'�'
(�x340031Qp,(��LN,����+�(`���,�m����}ʋg31�%B�:���%���2�̳m�4W���]��^TNz�MI"J�\x����bh``fb�Z���W�Q��q��/^U���~�W���	?84���x����iC�H������Ϭ��[Q~a���W��*��x�31���ܜĒ���b��
�?'1�=���G��̽V�8���x�31��T�ba�rW/�}Q�;��X���+�
Q�x�340031Qp,(��LN,����+�(`8�\8蘵���ܠ�3-&�i}e�����ss�R���<�k�|X���y�kNV~Qᕟ���Ȱw֓m[�m�+\�6W���ɫP�.����Dx����i©��&j*�?��]�0=h������f&&
���ũEzY�yU�WäM�n��`Rkve��ꅮ0'?9����}��L�7��>��,�?�<ـQGĕoK��"��LZæ�+\�3��5v��	x�3�����/0f�{3�����)g�C��(��~ga�e2w���W�L��R����Bx����iC�Hh��?f����^Xo��q��������x�31���ܜĒ���b�,��^w6�+����:q��F�e�j�x�31��T�~�7�>�θ}��X٢'�b�s<J��'�x�340031Qp,(��LN,����+�(`8�\8蘵���ܠ�3-&�i}e�����ss�RJ����b���e���%ŧ{�����Id�;�ɶ-��6���k���is����a/����Ax���r�e�/��ZC�C��,��~���F#�0�͎�f��A�0x�9����:�q�/����zY9p��Nd�!e�\m!�!��s���U�p������i�Vx���4�i�ʉ�s�Z�x��ʴ�i�J�Ԃ��J����[�W���X����]��1?o��L�r��yx����iC���-:��3X��/]��Dv�r��	�]&�x�31���ܜĒ���b�;��w�tL��C_&F*7b�Ԕ\7�x�31��T�ۉA	�"�$dW�]�V�S��Vǧ
Z�x�340031Qp,(��LN,����+�(`8�\8蘵���ܠ�3-&�i}e�����ss�R���,��l��nʹ��yqv&V^���9�{g=ٶ�Qݦ��qmsu>m��B�.C��8x� �����X�1��h��_�ɏm��~_����h��px��ʴ�i�J�Ԃ��J�������v����[���#�y�ą%OhX���=x��&�Vj�$�dG�՛C�~2q(@�f?�L��	@��|x����iC��.ьsW~,?4�ZjɌ}��:�
֦x�31���ܜĒ���b��a?�hޒ)�Կ(q���z�΢x�31��T�p�>7u��4���P�-���qŀ
�x�340031Qp,(��LN,����+�(`8�\8蘵���ܠ�3-&�i}e�����ss�R<x���U������$^�޹Qᕟ���Ȱw֓m[�m�+\�6W���ɫfq/���;x� ����������zj8�>���h��v����/��sx�(�����eploy.php���/Ai��HDX-�#%��騑�tX�-�$��Bx�m��JQ�~�JQ��FW1�i�үVE��EJ��s�K��Zq �DD/�#�Do�Բ֍�H���?����|�\۠c���-�~�P"�����Q�����y��C@mH9�QM�C�:F�3�v��§��>L�+�ޝI�qʡqF4���5� <�3o
:��
hR��U�� ��[�+UuL�ձ(��U�2T��a�7�"���X�N�60p�$k	��)<���Ү��!�!ưF9�����XEZ+��r��r5¸@U�j��OV��Cɝ2\w�ѽ�2�-O>�p�Y�[�ƄS���S�Z���K��G�.4]$sFn�ca��rn,���d-ða���i��ה��c��L�u�j������
�x�;(�Yt�Vf���Y&۳i�'g�di��dd�ڕ$����E&DZ=����6!=�D!1%EA�1��K	�e��ss��n��n���g^fIfbTT)a������%E���9�'��,�,��1y���\�Is�$�Z�Z�s7��~x����iC�H�7��߽M7/;�S{�5XG%C��Ħx�31���ܜĒ���b��L�Jŵ��Sm��v�c�5��R
�x�31��T��N�?�A:�|��+fLώ�<}k6�O�x�340031Qp,(��LN,����+�(`8�\8蘵���ܠ�3-&�i}e�����ss�R���Ssz@�e]㹷�5}�������Id�;�ɶ-��6���k���is���u/���>x� �����l=��jü���;^�߀�P1����	�8��vx��ʴ�i�J�Ԃ��J�����+?L�,����$O�$��V{�ą%]����\x����iC��{N�s�=%Y�+�T/�{���.�x�31���ܜĒ���buk��?qg]KL�Xx߳1K��(�x�31��TG����?�eV��[�����Ŕ=�˯��x�340031Qp,(��LN,����+�(`8�\8蘵���ܠ�3-&�i}e�����ss�R83WM޳���i�J�
3�w�	�������Id�;�ɶ-��6���k���is���c�/W��x����Ⱥ��RfI�KjAN~�^AF�x��ߪ���߾lW�/85���c���j��x��VQo�6~�~�� 9��0�I�e��%����,Q7�H����HZ�d��U�u�����wd�>iጎ�8�#^�]��wY��r�ON~_�}7<
܄LJ�$�,�/4_d.��"/U��F��*Pf!`D
L��F�Cz�_�?4�B�������+�r�����D\R��� ��/��,T�gr�ۏ8�Y$\�J	D!�Fa��"" H�%U\�1��qX�Y��r���K�y�{;u�R������ZpF��ƽ�ïYQ*��B,��p�f��)�s_(��9ܗJ{�W#�e���*rE����<*�bk�XH%�H9O�S�H�HI�"��+	]��x�@�LW����K?�Du�=�\�"dž�;肮��5��
�5jVd�]a�BT���� ��3^kI?.VQ�Î�������߮?M��@��4T@�%���tD-�n|����"��Ԫ���n�뷮����֩�zvv	�<��T�k�Q�=��A�#n��;*��U��)i�i8ߤ�'KR�޳�������r�;�t�u���D��<��
D?�T��x����H��^�����4�Պ#Ad�)����ʴ�igk�OV�4c�ƱIؐV��R�I�qA��8s���f�0ic�`���+��ƻ'Ǘ�C_�/k�u/�{FY�'wd�O�ƥ�I�xh.\����!$Dq���k���[:i��C����������1&�Xck�������row��&���5�C�߆R����xw~I�I�>#�:GMCZ�
ے0����PI����._e�SU+�m�T��6Q��Z+v37�l$6�y�0����1*s��~�f��lfX��������l6���nR]�z���֐Ɛ��bʖP�ŁqU����
��-�ϻ�{v�_�OAT)ث#�K�E)ӷH���=DŽ��/'Th�1�Dx��Q�N�@��P�R(V�Q@"���HP@AC�DCc��	�κ;)�P��U������O�r����j�;��3{;�8}w�۵c��:!��J5�g]�ؑ#���7m=|�<m����fn|ؔ-"ʍd��5fԥ1�OK��X�F�k���B�d����(�K`�X�d���K�r{�w��Q����:ZK1�?��$�B���X�1�!u1�B�#B���b>�B���2�>k�.Hϵ��Z�Z-L3���滋P��˽_x:���}'�ӷ�N~�[�e�xX�Ko��g�:�n�H�>�GL�X�eR��hA*�Df+�$���ڔ+z565��޳�9�?�2@f�����0?����ؒ�-X�1�E�����+����x�� ~X|�Fn!����Ҝ%Mk. ��~]�x�31���ܜĒ���b�
��%2��C�&r�o�X��b��
��x�31��T�)Ω^Ʊ�6G+/&��ۼ��a	�z��x�340031Qp,(��LN,����+�(``�:��Xlm]�EїR����Xhb
����y)vEVN�`�xiVr�j}��G*!*���ss��z�mˣ�M{������|�0y5o-����px����iC���R��b*��9�v�ݿp��c
I�*x�3�������s]j�����;-ߑ�~;����*���Dav��Q��8��g�Ax����iC��Z܍��D|��'��s]�[$��5�x�31��̜�b��ߖ�������Ti���Ч]��榦
Y���9��sS�6�\�9l����|��{:X�x�31���ܜĒ���b���Z�o��N����I�%o�p��x�31��T�u7��f���p�?%�4�е5�
p�x�340031Qp,(��LN,����+�(`�Sbx��ɕE1�n�w|֗W�����ss�R8����^=1�c������I� *���ssvԊ�9%a:��읗B�8x}�-����^x�;���`�'�KbIbRbqj����\J�p�KQ~����dF.I��̒�����Ң�
���1�E����9�c&Ws�qƸ����'�Ln�T`�������5Ii�i�) '�s%�h������arnPjn~Y*��z�ʛ?rE��"9i���3x��r���S40000 Database����],V�"N|���$i100644 ExtensionInstall.php�.:��)��
�|;�r�����s��k�I�}Z�
�9�v�]�O:ޓA��j�	�?vʶ ?�A� ~�i����<���x���r�E��\K��S^<
��<;��7��gؒg.��Q��Q�ݶK�z&���)�N9�0}g����cM,;t�(����)��j국��� ��e��0L��ٸ��ir��#g�m����f�6w��x���r�e/�HӬ����G�e�9��OI
o�ج�h��k߫x340031QpL*.)JL.qI,ILJ,N�+�(`Ⱥ�R�g�����K���m޾��ޥ(��悇���u�\���|`��Ͽ+P5�y�%�99`e	�F��-4y�_��s�s�R�?R�0hj��1x��.�Z|�Kn�Z.�F�x�{-�Ed�]��Դ�Ҝ+��̒��xM%���e'�ay�������K
4�'��z�\�_4���L/�v�S��Mx�j������}4�=��s�����:��1�9?��='), 2);�H''user' => $credentials[0],���	~p��	Tu��	�>
6�!�
��Lx��e��`�"#�KbIbRbq�5��F��U�ܓ+7_b|Ƹy/s+sp��do�L�y�'��B|�%�źv%�E�%�)�E��
�\��
��3KRT���K��K�R�uT ʋ�R��֓�E&�䅘��W�:�IDy�a��w��&{��l.1abV�SؼL̎����8���zx��!9Wr���FÇ��1�I�%E��%��%�������
��x�340031QpL*.)JL.	�,I�+�(`Љ�0��\��l���0u����7!j����2�K� 
70�:��b���}��3[�l�SX��5�p[~���~C�B��������rI�I���_a���c����][9jz�mR���/���OL���;��TU�V2o�Ԓ6���Pu�y�%�99`e��o���Og��
���ś@���g���
o�`8a�#ZsV��ٺ��?E|�d��5��x�}��J�@���rԃ���@M��M�i��xBL&�B��ݴ
R��C�M|���&M��v	l���ߙ�9~?�:m}�[����̙@j��,t�@�#E����[���>�K$�S��:�Ky���4���<Q�`�7c�"�X�d�`C*�H�����+a)Sd/�ڪZU�5~�C@"�l
��[g`wG����j���
��4��ֳ�w�[RKi��2�����+��!JI@���#�L|E5j���3X5O����'��;���ġ����]��W|":��EO8�q��r����!�X���3̷B�.�^k��7Td���S�57�KamC�f�X7�G�Rd7�H!�Ө��:C�6{�{S���o̱c�cӮ�lL�P	ܐA,����������Hx���5_i�F���ļ���Ԣ������732Me�\���N
T����s�,[��Ҽ��Z
��Լ�M�j.$����XT�Z�`;�M�K,T\R���ҭ�n��:�4�DAa�!��DŽT&?���5Ԍ�(�l�&,b����L��yr��>�zneqaN���~��LlWn.��8�S�s�0/���"jB�yi��E� ��d�O~%�Oc��rx�8��/�*�4�&7�d��@�j.�w]��3����l�L"�� ��5&(?�J��ox��TMkA&�zX�t���Xy[bvW�Ջ -�
6� 5������,&;�̻�AB/�<�݃W/�=�K�{����UPtO3�<����ڛ�wos���0�v�s2L��Ungq��z$��
��*?��*{&pS��.�K�}�4��5C�����?�Ok�F@�(�����^�����q��>�PȢ����3�<��j	��!��[+Sj���.�O]~�<����]K��wYף�,��U(����~��KS7U�?���0e���C/�G��)��L�G݁gZ�1		W�}��8�7,�T`��Uˠ��@�/���c�܈s`w��NE�9u��!3�2H�[��!�b��/���b����jC�
�0T�������H~�/f�O���xl��� �r~^
�غ�*h��A�>Lc�԰,x1�xN1⁼~f��Mm���:��sM�9�1λ�q��xb�ڸ��>AXj��ƥ��vVub��Jk� �Ѯ�(0�sO|#��W����;}�oq����X���6dg�M�h?L���4~������w�!��rx�e��NQ�Nij���i���%im
�j4��@514�i�R���5s/-Սo�ͷ�%/�`ܹӅ+6�ܸ҅s�Vau��/��g_�3/
Z�?�����4]m��dtK�6��\֯
O
΂�n۞S��|��]or[J�&��ClW1ϑ�Ԑʷ�*d��(������r�����*(;�x$�Zd�h�3�P��t08�C��6���a�!k�����'�`-����؏}��ɔN�"��𘉽��%��#i�Jm���w#q�(k�m���F�u�����)�30�~����0��y'
�7KM��l��F63��]���l��Ԧ����X�.oީ�W�j�l�H|J�ʵ�1
b���ߣs�\I�P�ڏUϜ�#�e-��y<(���Jp�e>��cxU|��~�{��/�1����x]Ž�l��<�la�l`%?:�_��������>x����i�?��KxD��R����ss�3K67�82�*@����JIFf��P&u��:R��VL.�Y[�3��^�{��ĥ7�rbg�-�/�̬d����\[�)f�ox����o�!�is7���̜'�s	n��Ÿ�<�~&���܂���Ē�ɂ\�|`�.���i�5��_DI���B5�d!)�b$��
�
*�M��<�S�+�(�@���).)*M*��ߔ��?�,���(�$�\!��g�k~��MB��'�ៜ'��TW���rEIFf��]|zj�W~~nNbDJc��T��]
J�Y��[V�(��jx�UQAkA�&6ћ`+"�44���VHc��SQA��������23�65P��I�Ꟑ�<����W�Bo�lm�s�y�}��73��l���8m��P�N����G`����Ww�¾���}"�F���^�d�F/=�I�A��o*�h�J�3Zrв��c�9�Y6.����
�Pi&l����ֲ�ŷƕ�����	'�B�rn$��!������
S���jZj�.~���^�բ��(�1;���E^��2\�C���s�G�^�����:�o��ꘘioX�T-vGf&�LqԼ1����Z+XqZ��Tq�܇r$A[#����b���\N`�}��L�%Ɂ����1m�
R�j���<����!ʟ��̧7�3ȅ�0����p�%��D��L���h;K�F�r���
'	14����^��4&�12S��d�k�N�@ ��x�340031Qp.JM,I�+�(`�*�egz���������otK�C�����2���o�B�֦<=s�s�C�E�4�*V�>J�T��1x��T�OANcZ�D1��*y%
��E)m�&$
��^$�uw�Nܝ]w�-F
��d�&^M��'.^<h�ţ�}��D@0q/;yo���{3�U쏼�I�ڛ=�l>h�\HH�}�3������TO-�n{��f���bHLA���lɶ�s�H7�@�z�A�d�;L`����Z�th(ڦj�V�±�X5m;��ܛ����G��y�-3Z�jn�2�Bj��3=2
mNl�D���ku�R��&�}ϤL���)7��ȹ+�d䗾���8��up�Q(�`����n�
����hn�4Vku��,n ��v]L�~B�Ͱ��u���r�K4Uq�D�U2c3J�@���CBC�'LOȳ���3���v��Q)|��A��?Cռ�R�t[�jŲ�jt�p)��GF)�B�M�����?,��Q[�Dè����'�WZ�Az\�L_�*i�Si��J�(EG��V��Cm�JTmhI��侮�r��	G��.z2
y�C�OP�\���-��m"��>ӵc�!?��vq��Rݜ�����t��U������VFS�@�R��N�:R���Iq=�(�����
�U�cc�v�2��6�8�f��B�q���X�x�G�|��ϜB")H��@��4�]�/o՚���%��vnWA��m��
��E,|z���:�]����g'�8~h0�0�/�}�G
�圲mc�t���?r��>)/f�#,��QY~��Ux�z�Ф����jx����iC��$��&�ڼ�AƛU��{�}�2"�)x����iC���Gϼ1�����6�4�vTu�n�\�x�31���ܜĒ���b������z����溠��< ��x�31��T�o͛[[�J�s1ٿ�G8�Vǚy�x�340031Qp,(��LN,����+�(`(��z��9�?o����R��'���s~nnb^
�^��.�3���;͌_�Y�5��+??7'�a��C��=7/t�-�;&z�c�V�-�F��'x�uS�OA���Z�myX�-�!\,�
B�À1!֐m;m��eg*ԋ7�d _<���7o=x��w���n� '������������v������\cF�$�f��5��ٶG�Uþ6^��$)�����D���S�F'v!0��iE6<O���w���0uZ���
��-�?��`�[�Bǖ�i,
R�c��M������G:�2�1���C�{��>ȅ�^ۘL�]$�W�5�8𦻯���n$?��{m�n	i	�R8m�]�����;Qd�RF*asU��Rƌ�r�n�$���_6�͢�����*R�Q�L�V!��Ð���,�94�c���\(;�P�18E���f�:)j\�'
���E��"�W	K�*�?h�T{���k�o�Y�VN8�z�x8���Lod.c���p�S�89*:-����j:135�ܜN����hemsiwscm��ꖳQ��П94v���t��V�a�D-Q.�X����^a���ֱ�,�D7�ܥ)�OI4�Rsb�rx��>��,�`ʞY�?�K���pYML���'���O21���4��C�-�\������%��9w1؅��w��=�F"��5�E�Ic��
H���9���>��,6[p(��k|�)�c.�U��NpF��Ɲ+����J��u�f�iˇeT/�6('E|kq�?~�P�.ќ%�܎Сfp��&-�?�3��Bj�4��Z���iD*���QI�۫�b}��4`����Dx�+����Deploy.php��$)��m��9��9U��/��m���;x�;�z�u���x��ߪ���߾lW�/85��d=�Y�}/�x�31���ܜĒ���b��L]��/G4_�7���G��
�_�x�31��T�P��^
HOr�l�4��`vC��
m�x�340031Qp,(��LN,����+�(`(��z��9�?o����R��'���s~nnb^
��	����xoҚ�z�&��CTx����$2�q(;~?��慮��u�Dz��
>�.��#x�3�����,�����ɇ!8}�qa���~[˹�\J�C�%!�Rat'�H�]U�Bx����iC���!�o3Lٯ~�����m�T�K��x�31���ܜĒ���b�f߿�29/�'�J��a��W
�8�x�31��T�]_k^d
Xv@wKݭ�U?�
��	��x�340031Qp,(��LN,����+�(`(��z��9�?o����R��'���s~nnb^
�߾��+b�=Y��}�*��&D�W~~nN"����3zn^�:[^wL�ǚ��v,����5x���z�u?��KjAN~�^AFC�Si���F,Ϗ���~���T����,L�exp�5�x��R�n�@_"CC� ��2r��
Dq�$(hB�Iq�z̭�޵vg�JJZ؊2-R��o@4|-��NJS=��Λ�f�n���v�el
j��O!IFa>*�aq��^��|��-�׶�'k7��4�&7��Y��>7m�}	/���I�b6Ev���N�eeibeɃ��9_+��߼�ws��P��j��N#�Π��W��'翃�;]XB%03ev�0SVC��!`�,9�=�P㤷A��+���%�%�^�gv?�g��CH M��=..��4���Y\=�v_7��a%&Ȧ
"?:�Bi�eZ�J��ӕ2hv!W ��@��0|�)-��t����'I�Ә�_��C�s`	5��H[]�K�Tcɧ�[��܉��fg��@�k�Ny�����Yf
i᝛����L��N^��c�5+���J����x�31���ܜĒ���b��o��8]�������z�v�ک��x�31��T��=Y-�מ?�Fj�f�j�[c��
z�x�340031Qp,(��LN,����+�(`(��z��9�?o����R��'���s~nnb^
CɌ?g��|f��45�F���+??7'�a��C��=7/t�-�;&z�c�V�2,�� x�340031Qp�(I�+�����+.I���+�(`bn���!�{��i�fJ6O�42Į�-3'�G5���g�c~�;_mu}\�t=���9�y�`�v�_�ݰ��Þ^*^�82���)M�Dq�n���-��?��{�Q\�_���BUšy�HʍEO�;�>�q�#�����n�:C�g��:&�%&�������yq�Y��Y���r'ȶ#�u.JM,��P�� ��;W�8X�}Z[y-�J�ԜT�ʝ�ζ�ӳv>�i�h͓��c:�#���N�+�s�tʜ��"�]_O��X>��)�DugL
^�xSuG�f�k���{���T1xm)XXv2��쯔��|���7�*��Z
�b�Izޭ��ñ��B��6e�X��
�x��b��2��>(5=��$�H� ���⇖i��[�[>�e�'�mXjh``fb��ZQ��W������X�SR�`r�B��i5��W?�(���{]cpenNf^6X�̜��O>rv��Ѻ|q�ٔ�vO� !Y��<��J%+�ށ7�1o�=�}>Y��v�KP��%x���r�u«�V�_�����~n�졚�x�{C3������<ϼ�Ĝ����Q<
r�/��/�~�cǦ�j�(�}2�K�*�k�y�LSnl���)f=b��24/d�4�d�N��<��b[�8��a��}��9��1��j���Y�i}ǂߧ[�;�'�0�ʻ���W���Y^���7�?~�L��&,{���;��u�m"l�R�)�D(u;aP/r)�j����5x�Q������2���4�Y��_@�2�4�40000 bin,�����ɇ!8}�qa���~����;3��<�Y��߄V�ݑ�$�x�31���ܜĒ���b�F_6&k�sB9S�#׵�X2�
I�x�31��T/����	�~�u$��M�/z�w5�"<�x�340031Qp,(��LN,����+�(`��=�q�ر��ӱk>Nܜ���y����ss�R:��-��}�����}t�����+??7'�a��C��=7/t�-�;&z�c�V�0U���Ux�۫�Yo�>'WfI�sFjr�g��FN����7�q���~Z���px�,����~�heckIn.php֕٨���cs%��Z��*�#�.�M���Mx����iC�ȫ�C,~r4�X�Ӱv5��A�/[��
L�x�31���ܜĒ���b��[��=R�Y�ʟ���U�����բx�31��T�'4~�	����唫�v�X�`�
��x�340031Qp,(��LN,����+�(`��=�q�ر��ӱk>Nܜ���y����ss�RV<\j��9��~���-J�sE!*���ss��8����s�B���c�=�lh�.����&x�,����~�heckIn.php��Z��*X�5���3�%�.�Z����.x�[�~AyC8��y����2Im~���8�;�>��<��Ē���u&�d���E��8�$U]�Ka�(����
�y���
�i
%�
 I��|����l��Ĥ��b����\�t�W��3�����66���ؒ'g��ʨ���'�����(���iZO��2Y�Sor:g�������6/�d�*H,J�U(.)��KW@6Ba�[fY=��Z
�
�LW���Ev�J�)�.ج��q���/�`��fCA.���d&�	�fS�z�F��+9�'����w����x����iC�H���7��_Zk�*�����m��$�P
s�x�31���ܜĒ���b�'g�~�|ճo���œ��ߨ9`.i�x�31��T��nH_���m�_�G?�t��a��îx�340031Qp,(��LN,����+�(`��=�q�ر��ӱk>Nܜ���y����ss�R��z-.�\:u��c�z!%k�t�
���ܜD�=2e��g�ܼ�u����A�5[P�.&���rx���v�uc�F����l�<�����XYIW�`����˜S~�L�czV/Y��Jx���ܭ�a��(n^ H�)N��ϥ;����+�B��m6�Nf�T��U0�T���ί6����n>���'[�GL��/尜�(�3�P�r�g��Kv�E���-�2��	*gc"����Kx�i�����d��Ȫ*�-m�Cז��|����x42�>�����]I��#��UC&'40000 bin,�����ɇ!8}�qa���~uP�4�ȗ�*�0�%�#�L�6D/y�yx����iC�������t4�������s�T�x�31���ܜĒ���b�׋�z�MHa��xi���LJ��h�x�31��T�����;N׭�Ο���?�/Ɉ
��x�340031Qp,(��LN,����+�(`0ZP�h|}*�rg���'e���s~nnb^
C޶o[���z��Y�D�5%f;9 *���ss\0Y?=�,Sw�x��Q��a�

�+K���x�;�7KC9�[f^Jj�'�����)����Nn�R�\�u�r*D���Ox����u«�9BE�|ۥ7;����V���!��������[f^Jj�'���+�(`8�����2��e�S
�);_N]��4��(=��b[鴀�j����l?�d�����0�[0��wx�L�����?��/���A�#����.�100644 FinderPurge.php���	���C}3\L�t���T�(�!
�x�340031Qp,(��LN,����+�(`��F~���7Y/=o�f�&,/���)?����(�� ��6�>�6Kgf��7���&a=ώ#����rx�]��JA�I��’�Ĉf��ٍa���`c��2,7qt���%Y$����mm;-_���9,-���Nu�9�w�
Ο+��p�<�W:[�Uk�1�L�
�)O�P\�$.ct�X���Yz��c!�Uڿ�� k��6�\�hl��<�g)_��*yWN���x�Uw!�°C�͵�聻*�B]^z\��/M*L	���S����e�B��	���e�8>dAOH�
�O4:Q�H� R~4��WZ�$L('͝?���s���Lo�Y�̏涽?0-���ռE�ٴ��4l-i#k�	S}U�x�31���ܜĒ���b���;>Ĭ{{�/����y�$�t���x�31��T��;�Z�k<\�׻�b����7�����x�340031Qp,(��LN,����+�(`0ZP�h|}*�rg���'e���s~nnb^
C1���ܧ�?���;wm�{�r��+??7'��%q���#�2u�����(֩�()b��Vx����iC�ȗ�y�5_s^	���ODX������x�31���ܜĒ���b�W�W�H4������\��3�#���x�31��T�X��W�//t�.w�ԫ����x�340031Qp,(��LN,����+�(`0ZP�h|}*�rg���'e���s~nnb^
�7�K�kݿY~�Q�S����7f^���9�.����Y���D��ͨF�N�u*z��+x�L�����?�G�ۗ�nu��0U100644 FinderPurge.php���<n�����[^�sa�1���T�� ���)x����iC�Ȃ
�>֓��'74�i8ȣ��.����x�31���ܜĒ���b��a�{�ŭi�RПR�l���F�x�31��T����m���n�ynd���c��
m�x340031Qp,(��LN,����+�(`0ZP�h|}*�rg���'e���s~nnb^
C�%�3W��˘{|��K�o�|���+??7'�a��C��=7/t�-�;&z�c�VQ�/��vx��˛%Ⓒ���e��K��݌j�T��	���yx����u�(�H�����-�~�
��ެ�tr�&�iF�
���ux����iC�Ȣ�[�s_�ԗ�H9��if�a��
�x�31���ܜĒ���b�3�T�6����\�D!���7~X�x�31��T��|��g(��5̞z��j�C��O��vx����iC��{�;5�Ol��y�$�*E͓��
�V3�x�31���ܜĒ���b�:>��S�-o6.�p�*��;x�?�\��x�31��T��١��bD����}pd��ǵ�ы�x�340031Qp,(��LN,����+�(`0ZP�h|}*�rg���'e���s~nnb^
�S�i��,���:xdo^ha��Qᕟ���ȰGơ�����Ζ�=�f+[�*���sx����u+��[f^Jj�'���+�(`����ʧ����ig��u�|�󳸡�����Di@iQz*D��6ym;�͍��S���p�wƍ�0�n'~���7x�[�3�{�s��r�"�[���@�g�x�31���ܜĒ���b%�#��ًJ����V���ܹ�
��x�31��T����e�З�O�(�|��b�-rѹ
��x�340031Qp,(��LN,����+�(`p�v9�����:��vx옽��� Pp���M�Ka8ɺ)�P���G�>w_VnZ�^���+??7'�a����Z[��3�'�V\Rl�t�/����'x����E����3RB�c��ngh�Pk�9��߃"�™"����(x�[h�m�����Bhq�B�zbNN��BI�BqenNf^�BjYjQ�BZ~NJj���̷m2�4��K�J4TJ22�u�j5lm��Pţ
bA2 ��'ksI��*�*$%VjhZs) ��Ң���{8U\���ԭ�PT���&&gh���'i@��(���;���D�xi*$+�@?����2�À�RHJ,N�K�MՀ�[/$9�7��Y��B*�Zi�
x�340031Qp,(��LN,����+�(`���,�m����}ʋg31�%B�:���%���&��0�׵8���lG�Y�}'�+�j��3R��Bn%M���Ǽqj�u�	��h⭭PE�%�9`5���o��U��J!a�g�y<��;����x���ƿ��Q��(�$5�$5E��$�$3YA%>�� '3��ϳ��l�(��Q���fe�"�ɥ�p@�&���%h�$%�jZs�M�`њ<�E}�A ~¢9���P$S�j�J�dwVW�^V�ɻY�'��9��T�"4����)`q�5�R}--�-������T���ܜD$-
i�9��P�0��E��
@1�N~��"��Y����nL�L;k$eM�x�31���ܜĒ���b������܄Z�J���<�\x�
�6
�x�31��T�Ĩ{��˿j�|���UNl���-N�f�x�340031Qp,(��LN,����+�(`p�v9�����:��vx옽��� Pp���M�Kaر�l�"���G�XO~.��|�,�
���ܜD�U�;�jm��X��[�qI���Y�v/R�D��x�}ROKAG�&ݢ)ƪ�S�&�KѤ.�`Dk�-a��M��3۝Yъx�0�^{��C����Ji?C?Hgv7ڄ�=�>�{���G70v癩�>Q0���,�S!;��'�sIXW��2žLz�KU?�<��[�_Y4c�����G��(aR}/-�O�f�ȇ<59��ģ��>���U 9�L>�8C���Uȭ�QINT�(�T�jfU*�m~a��"��<�z���mf<�Va���Sʨ1@�3�v	�
 ?⚣�mZ��Է����q �ͫ�����-�|^kh��Hh�X���L)��Y�;��ũ���|ζ֓-���܈�8bw���	ѬV&=3��s�=6�^e�Z}�;b:Ds�J�D
�a��G=˯�/��l�H��L����S(�z�Cu���~�̩��AP���v.�4�
��Jp�
�Y�I=��9�:5�M,t���@�z��v����q��mA�z�oO�n}wg��bb����^ri�J��3�l�֠�1r�r"� �����ȭ��|��j�(���Q<�~��ȭ�K��;�I�lT�q�M��ML�@�+��2җ&x@J��r���dA�{8=��!_YW���E*��x�;+rAp�WF���T���ܜĒ��������X�sbr�揌�̓���N.c˘���1�k����⛿�%2N�П�ǹ�'���JfIjn���Hc��Uzj�{Q~iA��JrNfj^���d.E�R-*���x�3�����[�%$���ͅ9 U�b���~
�9A?�]+?fS?}w�*��z�s��x�31��̜�b�ԟ�\�=�Z��<�w���,�����T!+??7'���ynJ���=���ܽڞo�~L�x�31����T��)�����1�h�9���h�8C3���T]�B���ݒ�;�����
]�~.~�J���N&�����ܜD#���Ԣb����5	�>�,W�qY��f�c��K(������O��{��h~�j�u��o,;U\��_\�tP_Ⅵ��M�͟����(r��EUqqD�Z�O
Q���2�.�ח����i�a*�x�31���ܜĒ���b�C7'��+��Z��=�E��̫r7� �x�31��T=��\:�l{�����=���;-�x�340031Qp,(��LN,����+�(`p�v9�����:��vx옽��� Pp���M�Ka�NL�4?�)%�hcC��w�3!*���ssV����>c}�n��%ŶOg�e.����Jx����E����3R��V�+�}9��T��J[���oب�P�����4x����I�����������w����-u�fE���{x�*��"����	%��	���
F��3�O
@);
��i�oZqC���jx�3�����UZf�-8}[�`"�d�
�\��~�HPl��onjl��l�P#��Cx����iC���<Ǚ�o�5�?�'���1��
A�x�31��̜�b�3'�{���ڗ�w|�:���oh``nj���������<7�j��Ş��J��mϷJ����x����q����ᵗ�G�m��<��cu/,���eb�*��*�x�31���ܜĒ���bU�#�o�p�a�!�:�W��s�+s�x�31��T�ʕ=�ς�4���\��������x�340031Qp,(��LN,����+�(`p�v9�����:��vx옽��� Pp���M�Ka8�w���ƌ
�[�/�sL�����+??7'��X߆(�p���}?T��??h��C/2���x����E����3R�Mw�]��/��-�H�UG��F�p&/U��5x����E����3Rb���}]`��̺T�y[���m6*�3!�d�
x�340031QpL*.)JL.qNL�H�+�(`��&��~C�8�#�ͅf��u���9'5��H+E�j�����GsE^y�h]9qrT�Ofq�RVjrI1X��ӅS�~��Y��!v����5�ҀҢt����#|5o����������Y��/��A7��px�� �I��ƾ �`�/E�ɛ��&�q�ק$�$*�*$%Vjp)�����lu ��NA��T�����W�VacQ�^�_Z�6'3� '?%UC]G]Gar��rMk�����p�r���(jZO�ϡ&�y����(���=�&��fN1�ɓy�6�qK22�t�������8�#_=�B>���8x�5��J�@Eb�D�Ey�`Rl�Q���(�w"���t2/d�-uS��|��~�[75����w������\�A�jЂKA����r,�w��:�h{���70��Zi,p3�{�FZB�p5�!T��I�X,b�b#]��k�#��WԚ��n6�G��a.�d�w��ya�BNѩ�(�%�D��H�ʷK~Ƅ
pJ��
��Ҭ
��EG�ң� 0<�`;��g���½}�жϟЦ\(4�k��qX~m7���1�u~�'��zM���C9o<n{=��߇nT6��o�esx����#x���"�a�,�d�)h(&��h���椖��hN�dStP���K˷�H-JUH�|���Լ��⒢̼t����T�̒��b��|�v}�>��Sپ0lq$���mx�;+�Ph���[XU'��eL���|�5q�av��_�"������}x�}��J�@��V��R%��P{�
�Z/��c���I��&ew�%�!�<�}�^}�A�ð3���w��y�Fs>�54^�n*B�SS	�T��UyO�j�խf��E=X�Z}�<ܯ ��\1�J��4��#)�X�����v�w�5i*b��,���i�-9R�����M.f3�2KĴO	|GV��KC�L���/�s߉�B��[v�	}+�k�`��h��O�a]�0�����H�3-26XV���^�a�R��.I�*U=�V��-s�� q�>���w��D���G�t�/����ϛ�(h�-x�[�X=!nb�,<�x�31���ܜĒ���b��M�1��/;�t&������a+��x�31��T�8F�m�&���zٹ���1ϑ~Ѫ��x�340031Qp,(��LN,����+�(`p�v9�����:��vx옽��� Pp���M�Ka��Z��ʡ�99��#�"[6�D@Tx����$2��e�������Mv�@-��
x�340031QpL*.)JL.qNL�H�+�(`�~��mnFM���ioM$��{2S����9'5���"wFʇ�;>�0�����{��e�"��������b���3߅Mx8wޙ��
�u\�ce�
UPZ��t�~����U3T��u3��<��%[�E����[x�����\��cɎ^���^Z��צ_sՕ����,x����iC��q�_�u�m�v�V�����.���x�31���ܜĒ���b�}׾�7���:�u�sUj��3�f�x�31��T���w'�Yd��9Dz��7�3e��U�x�340031Qp,(��LN,����+�(`���E]P��4�����*禟�w�M�@�9?771/�aF��+�5�3˜�Xe%�<o��}�
���ܜD����l��n�^���:�6L^
�M,����ix�[e8�hC2��ߜ\Ή���9��E��s�p��>��% �PZ�����9�'�{�h��Ex���r�e�B8��x���r�������D�919#�9'5�H� ����[~��*�$V�O�?rkK�_�*}2�K�
�?_�����[���h_�-�������U&�����>=Z/��_�m��혉�F�P&v�8q�:�Nx�mR�n�@U��DZ�[a�-%�뼐	!�@B��3IF�x,��*Q?�E#�v�(��
b�'�`�x�V\�W��sϹ����w�>C�hW�qaC<,|$�#J���6�ӐQ��:7�G)g<����J% >c����ǀ�8
��#o7��X73H�⽱YՍ|��@���7�Q��4��z��쩨���-l�QŸFӰ�z�=~�`�=y;;���
�d�8@�Na���G�5��Pұ8(�G�Vo�f��N����u�h���_V���ү�}��qZ�)�^��Z��C���h�cW�/Sjie]�<����[:�>�d�^ޒ�j��`r��?�����A`C�ILeQ��$��m�D�)_.Y��WVo�7�8�MB�h�{p�Km
��y�8Rֲ87-t�0�	C�����Ty��<�f=>�s4w^�.U�b�ɋCR\Ir%Q.����*l_xV�XBxN}��K��k�544w
qj�@v�ڳ�)G*'F�NUb��)�Я.
�|��.B���w��A�E�qR�0��F�7�Wx��R]kAŤ�i|�Uh
k�m��I�5iRB��Qi�"(u���lg����PC�(8>��_��g��K��L6���aٹs�9瞽_��\���Y� /�O����q�e&�{�RM�ev�1w��l]��8 �B��T�����G��5O�o�?�*E�#�d��$K����0��N
{�_�u�i�L�^,��K��EQik]��5��Κz��\�������/R�b�	EB�XVZC,"I-��;��~,$'th���]p��P�đ$�`��i���O�.4�"Bs �Ѩ47�kS�#�)�������q�ѳ���Q��;8�*�5�7r@���{�2�Sa3�F��}�o3���]*$�.������D�a�5=6�v�s
"~i�k6�G�Po�u��Y�v�Y��W&�0�Bo�0b1O���Ą�!�)A�%a�'��d��NͲl�3�2��c���lz,�21RV�)��s|�Ak٩��,�Q�����m�6�Y�	 1ɬ|n�꽳qÜur�ő���]���+I	�l�!x��+tGhC.��<���$8���"x�e��JA�Ia���NE�L4zw`�N0�$Fc#�2 ���ea�=v7"B|�}k_���V}}��p�-f~�7�̇~(<}��c���-SÞ�J0f��ZiI�eӲ<F���Fx6���ɕ�©)�K��TQR��o�'}��MD%��P��6����`[	����.,���s[<Ε�sq�9��
�s�[�ށ�QU��M�=orWܿ��h���QĨG4ܙ�5�%�§ҍ���d�0�v���+M��NL�@��$�N�9S�Ք��3��mS蚷Zy��s���$�<�n�C�ӕj�3ž�7�Xn�kХ<��J�k�KD�h�UO�?��5�~�����kx�k�}ûA��M%��@�v�.�u}QjaifQj|~^r�H\�.=�$ �$CCSAOA]?1%73/���(�$�H?9?� ?/5��ČONL�H���OI�
�8z��\
P��S�U�K-W�q����Y��\�E�ť9%@�M�v�E� E5�iPe����)AU�x�31���ܜĒ���b��y�:f����;���;��Υ	P>�x�31��T��֙�6�8t��g+�)����+®x�340031Qp,(��LN,����+�(``�:��Xlm]�EїR����Xhb
����y);
�>��_՟�9�h��FՕ�^���9�{g=ٶ�Qݦ��qmsu>m��K-����$x����iC����#
%v���DRz2����
8�)x����iC��z�B*v�Y��'��Qy�}6a�6��9�x�31���ܜĒ���b���ڹ.
2d=�O�[�Qi�0��-�x�31��T��Sr-Q���姤��)�Y��J��x�340031Qp,(��LN,����+�(``�:��Xlm]�EїR����Xhb
����y)��9��W�|�w������oQ�������Id�;�ɶ-��6���k���is���-.l���Lx�Q����� ?˚Z�� 5癳M��s֩��s��k�I�}Z�
�9�v�]�O:ޓA�����Nҙ��]D��ҵ�����)8�ax�P�����?Bp����4y�x�=moc�S����a1������NS��Y�!����
н1�����q���l�����<%b��`x�����\���Bm���+���2J���M1�x�31���ܜĒ���b�����_]�ى�b��k���x�31��T��&�6y/y���lL^n~�V�x�340031Qp,(��LN,����+�(``�:��Xlm]�EїR����Xhb
����y)ߓVq�E>��iyc^g͝}�J^���9�{g=ٶ�Qݦ��qmsu>m��L.��Zx���r�e��KG��v��{�
>��U/����`&ڸ
����(x�{��Ye�-f��Ĝ��ͷ��٘����\	��
,��1x����iC���*>��P2]t�v�[yҧ�%�a��x�31���ܜĒ���b���w�wWu�x6����iRu
�2;��x�31��T��Rk�5�jh��(w�|�]�Q�{
��x�340031Qp,(��LN,����+�(``�:��Xlm]�EїR����Xhb
����y)K�i6��%������vKI͓:Qᕟ���Ȱw֓m[�m�+\�6W���ɫ�-���	x�8����?�_N�����S��E.c�I�S_i�����Q�\�Pd�{�9��������dx������pk���ρ%�A����%���.x���4�i�������|��1ɹ�׋3a�U�q
����Mx����ก�s�V9�����Ԋ��b�����Ɋ�Œ�XE&`���C\�%_!/�D,������X���X����S���R�ѯ�_R�7Y�]f23�^�2�Ԓ�̜���&�qqm�
b�<��t������
�
%E����q�M���\*���OGA=3�$�(1�$�,u���<�oqj�cAANfrbIf~��JIFf��]:����5��$���&��ځ�u�:/�(?��dr�@��~��L��Z�/�On[����jv5>f|��
x�kplr� &�����Y\"�.�x�31���ܜĒ���b�n���
�'�>ۺi���VS,O�x�31��T�ם�ZڪJ=����Y�RC�S��K�x�340031Qp,(��LN,����+�(``�:��Xlm]�EїR����Xhb
����y))EZ��e;���N_���?��
���ܜD����l��n�^���:�6L^
�,���x����i©4}�����'n_x;M3���m���f&&
���ũEzY�yU�WäM�n��`Rkve��ꅮ0'?9����}��L�7��>��,�?�<ـQG�����rI�t_��7��U=QI^�6=��x����iC�HͲ��D㞺�v^��T���:�)x����iC����qޭ7_���d|���=k�|���x�31���ܜĒ���b�Ф��R~ޗ%~��!k�ue'�L0�x�31��T�ױ	���\�2�UM^w.��7�x�340031Qp,(��LN,����+�(``�:��Xlm]�EїR����Xhb
����y)��>NH?��w�2%�����ϝc>Qᕟ���Ȱw֓m[�m�+\�6W���ɫC
/���ax���r�E��\K��S���x��]o���s�Y�mT�g9ۖ��)ɰ{U�˒ڪ�>Bv+&c���l�Sx�8����?�'�������l��4��&�S_����Nҙ��]D��ҵ����	���"x�4��$�������QU��
Z�_`����C��&�'@��	�����N�x�31���ܜĒ���b�5��Z�+�����Qt9n)q�O�]�x�31��T�K�.���6�嶋����W>oYօX�x�340031Qp,(��LN,����+�(``�:��Xlm]�EїR����Xhb
����y)�$��fͽ�M&/?�_NxˑS�� *���ss��z�mˣ�M{������|�0y5�Z,����
x�6����A�2'w�K�~;���7ǻ.��U�T27�'؜pA�kޡ�X0�ɶ��%��H�Fx�6����A�#��v~�o�i%1��O��~��U��"x'%R�,��W�ya���%��8���%x������s�V9�����Ԋ��b�����Ɋ�Œ�XE&`���C\�%_!/�D,������X���X����S���R�ѯ�_R�7Y�]f23�^�2�Ԓ�̜���&�qqm�
b�<��t������
�
%E����q�M���\*���OGA=3�$�(1�$�,u���<�oqj�cAANfrbIf~��JIFf��]:����5��$���&��ځ�u�:/�(?��dr�@��~�Y̛�K�f��b~�x�31���ܜĒ���b��+�S{Uӛt��W��H�e��x�31��T�����^~�W{�,�_���L�x�340031Qp,(��LN,����+�(``�:��Xlm]�EїR����Xhb
����y)�"���M\}�yOq�S���f�������Id�;�ɶ-��6���k���is����.��0x����iC�ș�ef��I��;�y.��Ġ~-��L��)x����iC�H�G�x�EE�u�3���~�V
����x�31���ܜĒ���b��>ϗW�i�^�����ܪ%o�$��x�31��T�,K��ޛeü@M`�J���_��x�340031Qp,(��LN,����+�(``�:��Xlm]�EїR����Xhb
����y)	��\g�vl+�r��%)��-?Qᕟ���Ȱw֓m[�m�+\�6W���ɫ2H/���
x�E����#40000 Database��8�-OӺyn��~����#��
����"��ݤ�w�-%�ɓ��ƚ��Ux���r�E��\K��S..͞�/�4㩪�����ʅ�7*�3�q�hީd��i���?���4�r�|�q"��?�x340031QpL*.)JL.qI,ILJ,N�+�(`p�2�T�6�#K��3a�|g�3�BԻ���\�t[:ߠ�kuR��w�w��3��$1'�����m��Uݳm�^X�$��2�.,�1�yx���� #�����N�g���s~�_�6�������qx��"�)��.��,\���3+��e��M�e1�l�,��*�L��$̘9فEd�OV6fu.$�Q�d��)����䗧iL~�!Y��Ԅ�Ѵ悳3�43����+5TJ22�u�r+�st� :u r�`Qu#h��B5�CJ2����R�b�J�J2sS]+|�SJ2��4��2�J�4�=��s2S|+�} �(�M�f�&е0�k7sqf1{A]:�1��^x����o�@�u�*Q��!u�Х�4ȱ�$D��R!�K@�V]�.ə]r��TJ��V��Hf&6X�XX�Z�vR �
���ϟ��;�~X~����D����>��G�$�#��#(��y��9�+�/8���[�tY]�ڌ����'��ǟM�7�W���w�
���4W�r!g.��U��k����.Ȯ+J+�]��J+A����Fp�Ie#I�>�[׳m����l5��J���%v�N�c���l��u��\���X1P�)Th�z��ba����(�\�:�0��
��e�Z�O��I��2*������2. ��COT�?AzF�:j;��!LP[�������U����n�V�K��G	]��V�p�w�h�����`�K�lU�h�J��������{ʷ0 �����.�x��Y>NB�K�Ɣ�QEU28k�y���a&	��,�
�g�pM��cvjq\��?�<x���[ڄ�*<7͸r���}zr����/—��P��j�������=x���4�i��	11|
	ѷ���;r��$�Ι�T�
����Ex���4�u�?n����T[�ɇ%���Խ��ssrK��r
r2�K2������ř%���\��%'��p���٬��Ȥlk��R��Y�kR�å��uu����'���,*��y	_)�u�s+�stS�2�R���c��$�u�Lq16���bZ
`���BbQQb�DO�:L�����瓯K�ʦ�TB�1�jT����<ɓ���_R��jx����iC����fƧ�_n���+��8%����x�31���ܜĒ���b���Ӳw֤-�z���`�G����l�x�31��T��J����<yCs��j��Ʒ���Z	�x�340031Qp,(��LN,����+�(``�:��Xlm]�EїR����Xhb
����y)K}�~�Z�� �a�ѹ�o*u�� *���ss��z�mˣ�M{������|�0y5��-c��mx� �����>�.��8T��D���%�/�ǚ��������lx�6����g�H�.��5p�U(�B���{a��UEz�b�#rz��/ϼ
��%w8	��Ix���z�e�!>Q��SP)��,ֵ+�,I����	���7B=!��x����iC��ũ\�<�A�#�i��d~W���9�x�31���ܜĒ���b���O�l�%�uk���6�W�s^��x�31��T��&&�}�}���jKE�wy�������x�340031Qp,(��LN,����+�(`�Sbx��ɕE1�n�w|֗W�����ss�R����|�~�A��s��:T��gATx����$2�dۖGu��
�ǵ���9`�j�/���x����iC�Ȟݦ�~5fZ�j�AEW��q\h�$�x�31���ܜĒ���b�/���;�,����n����?��֢x�31��T�w��_߯>��z?w���/��0�x�340031Qp,(��LN,����+�(`�Sbx��ɕE1�n�w|֗W�����ss�Rvt�o�תj�},"x>�~��jU^���9�{g=ٶ�Qݦ��qmsu>m���3.���x� �����k.I��ć
/H�#���a�����%���x�����(G���|����h}T�X��&��%���~x�����y�?�ɞ2"J���E
y��
^���9�
ř%�y��i��x�31���ܜĒ���b�snK��2��z�������H�>�x�31��T��+�[�v.���LYgs���W��
��x�340031Qp,(��LN,����+�(`�Sbx��ɕE1�n�w|֗W�����ss�R�,��ؘ�	Yq��`ߔ��!*���ss��z�mˣ�M{������|�0y5f�._�x�340031QpL*.)JL.	�,I�+�(`��+51`���*���Κ��,�����yi��E��"�^�{?�[�u�q�zo��t�¢�D�q�=��|�["{�ٴ`e��O���{��\RsR��d>K���*�L��tv��غ�2�*�</'?1�n���ޝ��Y���}��OT���<�Ksr����۲�WGX�Př�3M�<y��*TYH~vjXѪ���;�5g�����[k�S&l���|x���uKkC5�zneqaN���~���^��+�����qx����iC��]��ۦ׷7r>��|Y�����>
��x�31���ܜĒ���b����n�ɓ�}�J���5ej]	��x�31��T��
��S=�dz���C:�].��m�x�340031Qp,(��LN,����+�(`�Sbx��ɕE1�n�w|֗W�����ss�R�}��l�v��ِ�;��:"�Qᕟ���Ȱw֓m[�m�+\�6W���ɫ�1e��Hx���r�e/�����d��]�ؼZÀ��a�͊�f�����x����iC�H����^�S��#3׸���"��.�x�31���ܜĒ���b3��I�뎴��Xn����)_v|/�x�31��T�����|j���J�Z�.8��J�
,�x�340031Qp,(��LN,����+�(`�Sbx��ɕE1�n�w|֗W�����ss�R�,����>o�?��mϦ�Q����+??7'�a�'۶<�۴W�>�m�Χ��W�B1H��)x���r�e�2������TUM�\����m�zSt-'�3)��	����Tx�;�{Gg�>fE��Ԣ���b]u��S
����b]��Ԃ��̒���Ɇ�2k��`(E(Ҝ���YAOa�f��L<Ѭ��~aL?#���x�3�������s]j�����;-ߑ�~L��l�XZ���I�5+�v�ƭy�x�31���ܜĒ���b��o��Dm�es�>$��J?��
@b�x�31��T�fU�#!��V���u�}���
�x�340031Qp,(��LN,����+�(`�Sbx��ɕE1�n�w|֗W�����ss�R~��Vq���gӒn�m�]:~� *���ss��z�mˣ�M{������|�0y5�@/���x���r�e�3�Ȕ�ʐ���&G��>r�ޖ��j��E��;x����iC�����e��'Ծ��r8i^c\U�>�e�x�31���ܜĒ���b#SC�~gg�s;�9�ϊ�(<�o�	�x�31��T��}��ްH5��]_���L�[
��x�340031Qp,(��LN,����+�(`�Sbx��ɕE1�n�w|֗W�����ss�R��}�������]w��y��:� *���ss��z�mˣ�M{������|�0y5�-0���"x�9������[gKS���ov�i��%��]%��#�=b��������7 
mf��@x�6����g.l���j_#���%�{:��~�B����V�1�*��$���L$�q���[x�;�?U�&�ɊlV��8V�7�����x�{j��hC �䇬�����#2YC�f�n��-���Ĺ�z
P��ox����H{C
��@V��'ٲ�'���O��Ƶ�(�tn�&
z��<x����iC��߅�*��j�	Sn?�����K�f#�g
l�x�31���ܜĒ���b�����7�8X[��A�k��6+�x�31��T����ӧ�
�9�R��Q���A�Lw�x�340031Qp,(��LN,����+�(`�Sbx��ɕE1�n�w|֗W�����ss�R.W��,Ӗ�X.�|���OK�S�^���9�{g=ٶ�Qݦ��qmsu>m���V.���x���r�E��\K��S���wne�1���>SyA���E�,6j�����6��_���L��|�q"�����\x���� #ҥ�}�{C�6����^7���(z;���
�	��Ux��"�"���e�F���,��E%�:\
H@=@}�;q��������dG���N�l��?���}2��dKv����&�s1��MV䐒��/.Q�D3l�D3���G#�&R�x�340031QpL*.)JL.	�,I�+�(`����
��Qo��ÄW7��zW����9?/-3����|R��[��;t��R��s��8�¢�D�q=3"c��H�{���Q��L�^-]�*�ԜT�*)I��ZO�|�g�|��c3�LU~y^N~b
X��su��="��l(�Hk�e��Pu�y�%�99`e:�֦63�,�������=TYH~vjXѪ���;�5g�����[k�SIl�j��.x���ɽa;+S-([��x����Dk�,�f����9�ɉ9��%��lX��	���x���IoC�KA~Q��~G���z�m�"X������-x�{ qGbC#'KA~Q��N��LB����nx�����r����\��E���l�ɧ�4y
�8~YjQyQfI����B5�d!)!�X���BIQi��Rb�_��mn�Ǽ9O�$;\����x����iC��߅�*��j�	Sn?�����K�f#�g
l���Ix����iC�H�G��a�o۸�L���t���d
��x�31���ܜĒ���b��9��z���mc`�V%�73�сp��x�31��T���������+��D_^;}���2��a�x�340031Qp,(��LN,����+�(`�Sbx��ɕE1�n�w|֗W�����ss�R��֮���f|$�?�߳)1���I^���9�{g=ٶ�Qݦ��qmsu>m���./<��ix�E����#40000 Database�򍲦=����
[픯��D�#�d�ljz�$�O�Π�^k}����; S���%x�����."��kab՚:��72T/��+��M�Au��fx��g��d�\����y6����O����x�\�����g:H�QϠG��}C�:D]{��100644 Delete.php�x2SL��=캵|�?²#��;���vS�n�d����ye��%&l(���ax���Vg�2��ۼ)L�'80N6��l+�
�@����-x��7�j�!�i�=��W~~nNbLhIf����"�i
 ��Ufq@NbIZ~Q����ʓ����g��)�*@����@�Hh��dd�ڕ$��S2�6G�lg�P)���_x����iC�HY�	�x�[��0���	����A3��
5�x�31���ܜĒ���b+�;����=\��|��i���z%�x�31��TÕ������;�㧍z��._�cˮx�340031Qp,(��LN,����+�(`�Sbx��ɕE1�n�w|֗W�����ss�R�<��\�ڿ�wS��	E�<:!*���ss��z�mˣ�M{������|�0y5�1��x�9�����?ZI��Q�� ~�UH�\���]�=)	2H���v�i,���7 ���Ex�\�����A:NQG�x��#��.
�C�Х�~100644 Create.phpÀok�1L.q2�y����{:#]M����|�w5�}^���L�N(<��9x�[�5KkC� ��d}6�͋��;���
�&x�[e�Le�;���L�̓���&�`mVI�,�-J-�/�,�/�T��R@���߱�1򡪜�ɩ<��C]x��d;N�ɜ�r��
�o����4Y��s3o�HqjN���JZfNj���~rbrF��I��+�m'�I�L�/�{2�$���铫%TX!*�JL��:y��0�j����JiQ���׊�2��;E��	�!x���Ӧ��+_zf�nQjA~qfI~Q��@Va&�t5Y�-L�d[��js�.��~��/�qM>�5e�B�ɷ�&��&N��
e��ۼ�לUM__�-3/E�$#U!'�$��D�$1�K
T b��
9l���8y��:Y�5����vx����iC�Ȇ���4q=���#ᮤ�z��

�x�31���ܜĒ���b�l���?��G�b6+Y��E����x�31��T���'���6�h���uV�OC�[�x�340031Qp,(��LN,����+�(`�Sbx��ɕE1�n�w|֗W�����ss�R*#{���>(>�X?��E�́������Id�;�ɶ-��6���k���is���¬0:��-x�9�����W���O��Ӫ�|��^g���]�P����
1(�w&'}�!��7 �����x���4�i�V���*MU%j%�&�M-ic�P��>�������cx����iC��6���|2�#��ה�޵��ڦx�31���ܜĒ���b�'eg^����7��mUM��v\�1��x�31��T^�����#�Wn^/y�o���Oǡ
��x�340031Qp,(��LN,����+�(`�Sbx��ɕE1�n�w|֗W�����ss�R��3�������NG�~���^���9��Ү�? ��ի����q�?E�2���nx� �������&���#��`�Ǜ֊B��������kx�6����A�@��7a��S��� �P���U`n�$�zt&t���t�"k���L������x�����.�]��M�W{�byˏo�sm�K�l��ex��%�Sp�?���,v��x�31���ܜĒ���b�]��|��;,��)�*�O�~q�,�x�31��T�G�+f8��y�eg�b?�oA�׏<�x�340031Qp,(��LN,����+�(`�Sbx��ɕE1�n�w|֗W�����ss�R��]_:ݮqb�ߔ����?M[���+??7'�aG�ȜS�oh��y)$�o�����0s���ax����iC�����*����Ӓ�	���9�n�
�|
��x�31���ܜĒ���b�K�9*�\�z����7�g+�Ңx�31��T�6_�����䨺3=�՘�β��X�x�340031Qp,(��LN,����+�(`�Sbx��ɕE1�n�w|֗W�����ss�Rz��?V����㓼��N���; *���ssvԊ�9%a:��읗B�8x}��/����x���r�e/�����d��]�ؼZÀ��a�͊�f������x�i�����d��Ȫ*�-m�Cז��|����x42�>�����]I��#��UC&'40000 bin��s]j�����;-ߑ�~/c)GG+v��w��ֿ	8,m�z�2Y�x�31���ܜĒ���b-�S��D^�|�ro�-��ϯ{
_�x�31��T���;�W�->��r���>�hP�z��x�340031Qp,(��LN,����+�(`�Sbx��ɕE1�n�w|֗W�����ss�R�E���{���9}�o��μQ���+??7'�!�{_����r���O[}�ʦ��u�_3%��zx� �����̵q��;�7�0���3l!�������x340031QpL*.)JL.	�,I�+�(``�/����Ow�™ra
;^�;`Q뜟���^ZQ��Q����ĕ���آ�<`�.�¢�D�qbc״Z[K�w4K�VJ���QU咚�
U���2��$��<�Ev͌ߖnzy�*�</'?1�8���*MU%j%�&�M-ic�P��U����V�*�����h�Y��g�֚���Z���Px�B�����g-�+��=��d�Ĵ�ʱ(�{U Install.php�2��5��j���PjV;uc��%�8���x���!�a+KIQi�d]v��Yl|����6�?b��#���?x��V�oUW(I�������Nw��[hAʇ�()RhՄ�4���9^X�u�=ljJ���I�C�T������H+��R�G���ov��6q*aY����oތ�n��8���?;W�lNt�O�z���'��`�ȸgZ|��f�d$~s�ޑ�:ĵ�K;]����do�ff�!:c���5%��d��tʮ�b3`��al��9��qT�-,^�_�2sYt�<�_�(�j&�w��V����"^�.��W����H�p+g�L�B^��r�x��3�}���<�d�E�y�:��P�_BuK���&�	��p)4*�U	��a� ��z��‚yd�Ng>�s�^��G���O�7G��V̖��!c�Z��U�j\�T�}׭:���ݾ�����ȍ�x�OY��%�A�,����1������E�ui�^?����+���!5
u�,���q�1x:��[������B�dP$2�o����&��Fu�L
��jS�3���(���6�.�A�*��$#�5\O2�V�651�	��i�͛��M�r�s�1[�n�O[�ф��GGb��o
\�e$@U"���s
&1�<W�qq'���@,�L�t=(��:;�����$~]�bz�����t�OQ�e�iQ���$�X�045�cSG�{u�6�
�����=vo
̊C�q�n�����b$�5�պ�ң}A›.ng�ŗ٣*�`A��^��h�rߙw�ov�����af��:�4��D�2^%��we�M5����#�b&�X�W�0�yʸ�8�uA��37�uT�Bƭs)���}"ݼ�W�;�3ǂ��|��G¦��V��<��sx"O|]�'�UC��L���1���8��"�M�Ef�?'S�� �f��‚��D"kE��rn(5��"Z�ۚⱲ?�f^8�dC�N�f��58u
���_�I�2K���Ct�'N�Jn��2nHu�F,KLn��j�˾v���e����-_�D����/f/^�����F��a�فz��IkGf>�4���2hȹJ]�"a�p���@	HA���ţk��)�U���5�rM�~j��K;�T����D�J.��s��١�w��O%B����H�ůC�m�Mtk6Iu�?�G��ś��)�`�W��в ïɄ��N���X��'�!�4��`bD��(0M��zMcJ:x^��J6���Ԫ�l����0����n��k�y\VRքos9V/��H����H[��`��{x�[��k�F���T���ܜĒ������T ������X���X�j�EHeXF~q�䏌�0=1�9�X�d�Rˡ�3KRҊ�s���K�3�'/�����rD��ZT�i�SA�2�QV�E��%��Dt'	�d'&���O.��/�+�å��uA���E%��'�q(�4�*�N��+U�	`WZ�26WHj2�$��B�<`�8C�)*5Y\�t�����-nC���{x��7{(�A�i�	S�ffO��j3&�pVm���T���
�8.x��RM��P%cK���U(ܖq�@#Ӆ���0P�
�€��y���ۤ޼4ԭ0���…��w�B�����Ѵ�?��s�9��V{��IKez%Ю�I_�gr�����h�l���j��\��R�ԙ6���_�Kq�zc��)1�P��q��K%�L��/
B}A�:(6��� ��s9���˹�]ods�3�y-�sڽT4AWs�W;���E��Nj����x�v…ښނu1t|�+&�vP�4aS��
��A#�f�aT�����!+@�E��<���F�FF�{ƒ��m�9�P$�J/+�r���}��`��y{��I��1aлK�[KQu�+��A.t�R�3p�I �����Ȣ�)���ԖXj!ءv�zC�>���[z�t}����Co��[s|���c��FW+nz#�%˩�f��L�ŏ�S��(S� {S���{K������a?U}�0S���S�T�W��x�340031Qp,(��LN,����+�(`���,�m����}ʋg31�%B�:���%���>�sm�۾�2�w��
�O�o�b"����x�5�AK1�O���.6Y�P[�V<��lL�h���d]�e��`��i��c�.��ۻ`�Uš���p��h3k�̚9,�z
�"7+ؓU{�)L���]�z��N���6R� �h��N��a�>��
Ƨ�-!<���abr�����w�&��e۷BS'߈:�2�O�_h�D�Ɓ"dk@+$tZyH�Gm �@�e�������x���W1��	x����iC�HЦ�a*��S�D�^��X�0��[a�x�31���ܜĒ���b����+�
:�?w�s���8G����x�31��T�֭�WT�\������u�*4[���x�340031Qp,(��LN,����+�(`HR^�6m�)��5o�:M~'T�p�11���ļ��γ����*�\�s������#^���9����ϯ|���~��W6].�{pS/��O��Rx�uS�oE�&�c�����-I����-��(���*�IhRU�X��c{��fg��\��
5z�7��ʅ#�pɁ+�¿��Z�H�}�>~����拽����W�NoW�F�$%�p6���:�rʒ��H/��.$ɀob���p����8rt:Wɏ��͖ɰ�����QW��)x%��9&������2�N,0��\�Mlcx(��F��;65-=�O��y5��s�F�s���q�+��T���(�~޵lx=�}�OpEy~L�9�~&>%��]���Eq�ʮ���\�mCfv~U��Ȧ�Q�Ex�(�Ou�8��B詥��\�������nSkR8}�R��Sg`�P�]��I�)w��c�kj�tH3^i�uT,�7l�^G�'��m�Ҧ�6����KXQ���'�e:Jf�sIHr�Ɉ'�L}���q8E����6i�\L�
���u�#���4���4�	��ڶMѷ4=�
'���Q<\�m˼��8��Ilo�9�H��kӖ��&�UKw6vCv��#�Jet����Ã'ͽ�`�bk7���d�9�z��c�v,�ru�-�=�SF���
���]�51��Ӂ��ʖ ��ޕ'9��T�%e\%��٧���\OL���n3#�cDy��L���*årsz,���5�ϥ��!�䂻 ����o������|,X
���[p�{��(�uN����}�����@�^���v+�|�dZ�ê���b�c7����N�[bۦ�5��a����复���?z$TW
��P�:7ΐФ��q���רր#‘i{7�i
~.���H�p��5�Ra��?_)����x� �����	؉k`)[��Kֿ-�#�X���ݒn��Sx�;��kC�W~~nN�BqfI��$n��Y&+��
v��?x����iC��,�+��z�J�X�;�pV��W
�)x����iC��A�G&_�5F��s'�N��V��5����x�31���ܜĒ���b��ǝ���tJ[�>�tx������6�x�31��T��%���I335DeTs�.-�#�����x�340031Qp,(��LN,����+�(`(Lsy���ֻ�M{���g?g��(8���&�0Xx^�/�ݻ��Mr����9�F��^���9����ϯ|���~��W6].�{ue/c��^x�;cpI���s�ʓ�q�M��dO,ILJ,N��ȥ<�*g��'��}��i&�ɖ��?rG�����Gx����]C '�KbIbRbqj��ʼp�KQ~��\2�9�7���Ž���x���2�e�r?��ٓ&��+����)��v\��������5�.x��²�E��\K��S^<
��<;��7��gؒg.����QD��QP���o�ö���~L�n���Ō��Oe��`x�D�����g:9�na���p���j
�:�u��9100644 Delete.php�F��.���g�T�=;�fD���M���ex�[���F���T���ܜĒ������T ������X���X<��$'�����I�1f3��2!4���x�]P�J�`%�Y:]\=-m�@[��Ԣ����mL��}7�A��P2�ɗ���&N>�~)m�v�=��{�|�����?�W.S
����h��;'C�²�o�5�$-کV�'dߤZ�H�r�U��#�Zi����1�&j<qe�-��k�&��.:&
lx�(lE���4q����~D���� �������Ɋ�"q�18����V������v��/���q tAӐ#}+l��A�q
��Qm�z]��&�9̣VU�����(�
;�
��I���&��C+��P���C���q$I(l}�r��$#��Yьlc��=��EY|�9��?�T�#�dx�eQOK�0�w�2D��PH�ر�p;(c;��F�FM�Ҥ���#��C����M���5��~���˯��~�����I(	gɵ�n?��S�����IΩ��9����|o�$�#��i'�%�^�ڠ�l�~�e�.��=	m�|
O,��٭�w�it5��'�a9ث
�0z�@.1ب�$ZHXc�T���L[+rL�d2�{�K-sˮe��K�e��꽶4El��4���#�O�DT��7J��p+(���\`�%���j²�M�RU}� e5}�s`�Q�L�1�ZG�G�x��G�?�ʞ�x�31���ܜĒ���b���=UbQ��r��/&�u��O-/�"�x�31��T��F+5Nm�i��
(K�ap��l
���x�340031Qp,(��LN,����+�(`(�p�鷎bM��~]n|��Ӯ01���ļ��&�<����Z��i��Z93����^���9����ϯ|���~��W6].�{(�.��x340031QpL*.)JL.qI,ILJ,N�+�(`Ȕ�vlѻ�,O7��NI�`*1DU�YQ�$�_*eEş3��v�>v��9?/-3����/mW�u/*[8�J�]�ͺ1/��(5j����\�6}pJ˭8�x�j܍mPU0'z��$��]��?s��}�7_����u=C�LyjN*��V��C_*��W�0\5m��k�Ǟ�T����'��M�(����?jk�}X�kN�m
x
U����V�*�����h�Y��g�֚��އ#��x�u�����q:�X��L��}!��L}��>100644 Create.phpk��߱��vy]�<�}�{9��0�Fa>��j���g���s��:n�$�zt&t���t�"k��(%6=4
�+��x�uQMN�@���Q�1OB2mR
����h�F��ѝ?d��ԔN�yD�.�B3�xo�
�
�X�Hx�I�}3����?�?R[�ů�\C���To�
%k"4=����]����C�;	}&w�
�@�D�@���Xw�T�H�r{P�BU�6!�<���W7�����<�]�o2�v�E�kfU�Ϙ�����q��;�G�y
\�͡%dD���RNt+�����FE�X���7�~�][��J�&�K۵�ӽ��Nu�,���4�b]K�3���tjaYf3�1�_��*$!�]?��z%��+|c›i��]�x�OQf��o��Jz\�����M�p�AKԚ*OM6M;�eD=CC4��]���d}�F{�P����.,���L�ŋX�<�o ���l��x����Xq�{���L_�%3H���Lx��e8�p�!a��܂���b[�Ģ��J��z":�;D$�&�ho^.�Z���
8x��j�i��/��B|�%�źv%�E�%�)�E��
�\�_�*g��*�+��(��楨�(�@��45'7��n��{��� �$c���>��5��BR� �I
H@$�`3a���~f^qIbNNbIf~�~qa�~n%�T�!���[�_TRԛXT�X�6IO}�?aI&��z
ꛝ��k[Gʦx�31���ܜĒ���b�g�x�y��;��l����}8y��x�31��T����}/����l�U��f��
��x�340031Qp,(��LN,����+�(`(�p�鷎bM��~]n|��Ӯ01���ļ��w��h�'���hƖ�J9�=!*���ss���ş_�.7)��7�l�\\�En/D��4x�!����#��D.U����ݶ:DE��Cؑ��q�]���x�{��WnC�����<���X�7벚pN�͗2�-�7������Sx��V�oUV(I�iB!.%�;v��n�]�Ђ����H�U��r���xa���\7*i�������R/�	np�8�J�T�np�{���6q*E��{3��|��L��n�:�щ?�W.ڜ t���y���5Nh��l�qϴ���Ͳ�H�֝}ou��[�=s�]o��b3���1o�L�C��3�x�T]x�f�$ʇ����ǥqbq�����s���~�F��th���nDx�RR�xU�j[2���Ez��
fôj��H���w�x�"}@�w!��}U��P2���P
�CU�KހK�U��ZP��
-[$��L��%	��Z�0�|�}'O�"��O�_�	/f�P3��i���*�
.�T�}׭;��Ⴡq|t"7re*���''UЋ�E׬�_ل]��U��E�si�^�������C#I�̀B]*H�]8�C�ٷݦ���
��j&�2UX~U��6���4ˤห6�&���@�u�%ߚ�j�	��"a��zBq�^��)��i�VݢY��t��?vĮ�
�iM��|8:��J�1x:�u�����Y�d�^�'�V��}".M't= ��o��:A�E�-���n�NQ`��I����kZ\�0=!��z>LM=��m��&U�o%/9���~s��m�o���I���}�Z
��gMo��Zvt �"���f����W%��&�"i��x<o\8�N�ͮ��!�_Ws̬7R��5
�?A[N��	��]�``�KK�=��1W�-�Vvp��@7Gݓ!i<�y�dH��"�D�~�ʶ?����u��{,ߧ鑰}��1����q�.$��0^V��j��~���z�T<~$D�N�Mo16~Ng6�SI�����[�ee(�4��Q\���OH�Y��*���5��C�D��)��\��ǎ����|o�K:��(C��
]�Y0�W=rP
Wk.�07����;�Ğ�����kG̺�v���������¹3�٥�3����W3�20qiw�^ly���OK�E�Zh�	K]�J�*�^%��5`�u���/0�8��L�^c�Ўꗆ�g^�z�ϼ�j��':V��ɉ+}g�r�lщ������Th�ӣ8�Ƭ~����W�SR��rp%����G̸"�=K"��(H�me���梍1����C�
N���$����
e�)�<�fLVr�XjdV_gk�MicL��D��F�zQ�-qֆ���+��*e)����Hɍ�gz��!��Ux�e�AkQpV�����`C�V��f�Ƥ��H��*l5��Bi�n�����>�����7���_�K>��oz�EOz�P/�<��(���a��g�X�a��F�7��{��]c�ޞ�t[ʶp��B�oJ_I���n;�[����ނi6��ݒ]_H�%����*Zl(8M=`��(���Ŏ�	�!~��*ȟ:�x$�Zd�h��;�P���:���.����?V_DOϼ�Z�9��'p{���I�X�,_���QnoǦ�m̂��B/9��,�v(��:q7�#�<�x��l
��fRq���0�\l�=_gZB62�i���u�-��]/�ͤ�hy���}��^]��v�\�<>$����1
�xS��.)��Ro?�����]���B����]�]Nj�aj����o��?��,,�N�.�ey�˳�_xR�j�a%7ڏ_�c��۷����kx�����\cЖ�����ƿp���Bؚ���r*�x�31���ܜĒ���b�%�X^��7�C��˟�{E˷\�x�31��T��j��~�U���&���^��ʢ��5�x�340031Qp,(��LN,����+�(`(�p�鷎bM��~]n|��Ӯ01���ļ��Wg�&��������o��.n�������IdH��~�ܤ���V߸��rq�s��1o��!x���2�eC?�Ƚ�O�n��pO�	e�|˴�b�B�n
��\x���������ҷ
ǫ�GO٫eF�jr����&%��x�;p����1Ii����Ԣ�����܂ĢT
����b]����s;Q���{x����iC�HZ����NS!C���g����	�x�31���ܜĒ���bE69
�U�ά=�(�y��,��x�31��T��zAzy
��ܲ���)���}��x�340031Qp,(��LN,����+�(`0�z�w��Q��2n�hl_Y�剉(8���&�0��;�c�WT�\���1�T���W߁������IdH��~�ܤ���V߸��rq�s[
/�l�Mx����BC8��F�@>"����Ex���2�eC?�����%��˵��[h�wP�l��ɋӀ
���x�@�����dreate.php�\0�4�L�i�#7uC:C ���Eȟ����=�	*+�
w���s��p���px���x��q���D��1��%���n��Cd��4]�3
��!/x�u�OKQ�q ��G����̐���@�ܵ�M�y�:�f�\h �q���o-ܶ��-
���g(#Ǣ����p��Ι��W
S'�Y"&�CE]v�IlOm0���e�}��2�
C.��+j�V���41��@��N��1p�ܾ1X��II��vl���QM`i�|�����=�_lЏ"H�\��3>r�9�Wp]s��j��ŀ`4L5g݅4��lD��[(N��4�?$��.��&�J3��
�Ni�D���Ua�n3!8�y*N��hb�l��5��K�\���E�����4�����)�6G�O�,�Ǔ��zp��H�] "�yä�����6L^�q�n4��
�^��\عC��d���x�k.��A�i��I��e�Eř�y
@0�^W�#+??7'Q]s�7WfnA~QIJ���d��q���b�|VPz�L�u�0���O>%$<���)KbQz�䋪2�ř%�V)�%�I�ũV�y�%�99�%tŸ�@Ӛ�V�<��"(3MAC15���RC�81� '5d���B5\%X5Ț�Լ��hu]]�J]�J�X[d��'J�&���&���R�\���I���P��vE�y ŎEE���y�%K5'+H�o���^
,�l����Ex����iC�Hl�����[O��9_{n�S��=��
%�x�31���ܜĒ���b�	�|܁�"|뎙ϗ�[o��`�Cڢx�31��T��?'�_)����u[����v�x�340031Qp,(��LN,����+�(`����G�A��
?H߹ �y��(8���&�0��z������y�"�����l�� *���ss���ş_�.7)��7�l�\\��00�l�Kx�[��CoC��u��x&����x���2�eC?��gԒ-e�*{��έ������,��Ō��7
��x�340031QpL*.)JL.qI,ILJ,N�+�(`Ȕ�vlѻ�,O7��NI�`*1DU�YQ+�˯z�����	�n>?��x	T�sQj"T�M��/7��f��5�l0���U咚�
U��_u�KE�������:�|���3������:��+�s�"�=�~�U|��i3��B�S�V�7p0����9���l�Z�Kck�!��!x�e�MkQ`FMjf-��({'TfF�~�����BE��6�1��d�����2�6mQ(.ܸ��n���,��F�ο EpS��1i������y��zV+�����b ��mm�d�N�\6n�P
��ӡ��x�"�{���8��,�����X�K�Д*�-5`���zNM,ti�i���Iw�`��8���cw1/�����f��_<�*Q���.��z<ix����
��9<M�q�d�7��J�P���z~/Sy�OY8J=�ӨI9�^�<Klc�X,Oj�x���C����i��tf2��G�v���=�[���\4�”�d醢Q��5?�f.�d�^���rm��Rwb�m�Z�~!�k)�K���B��T�V���98��QtK�t�A���1���?����O���}�B�;ƕ�E\��'O��>�9D�%Lz&��ޗʲ�������x����iC�H�i�-oW�^ճA��:{����x�31���ܜĒ���b�M�c�U�e���X�d֞�i}Ƕ7��x�31��T���d�T����vG��iMk�d�P̮x�340031Qp,(��LN,����+�(`x���Pԣ��"��nq�%I�ib
����y)!ي�Y�2k�Z��P}���
���ܜD���}��W��M
{?m��+�.�=��0�l�Zx���w^o���g9W�)���	�kx��g����j��˃�d!��Ŕ*��ґ0 E����uJ���˱����⿅100644 ExtensionRegister.php6NX��Ly�͵IM��yB�Ƒ�U��m��k��&\�@�/|�焥����o��,,�:t�İX�Ć4�y��q��G����x��!9Wr���FÇ��1�����?3����jx��/�D|���Fç��1����rI�����x��m��f�1��Fy&Ƙ�Lg�?\����x�[d��`���F�'��1���B���	x�340031Qp.JM,I�+�(`��(6����ON{�zmZ�t���%5'�ꔫ��y>���;����?�T��TUpfI�cRqIQbr	X핇��L9$��_&!��w��ꭌP�!�٩y`E�݊�5��3s�Z���	|�IeY3�G=v��)x��+�Sp�
F��̒TǤ⒢���;]���	����9x��,�S`���D��1��%�������(�$5�$5EA�$�(=�$>%)��(5-�B�VA���8^}�&���X�&�gq�ϭ,.�A�������[裐�X���X��5B#%5-�4��Jb�����Y�5������\�'��r��aW+��,ֵCw�dG7F��ќ���r�O��e����]R����qx��*�U`�-F��̒TǤ⒢�������D	����x�^����*100644 .gitattributes<���S�a�/f����1)���}�lD'ЋEF�!��ve����z����ؕ׆�	�'��O��`�,=�x�31���ܜĒ���b��6S:,'�.��"�h�p�{�yZ��x�31��T�5�I)�v�KIZ�^��$�F�#���x�31���ļ���gry�}��_�Gr�<�CǦ��Ux����$2x�z#�{ߪ�u?]g���g�3�������
x�7����RS�^��\���a����2�0 %P�J������M�&�^Y̱dJ��G���sx�^����*100644 .gitattributes<���S�a�/f����1)���}�lD'ЋEF�!��ve����z�Q�FL�c"������	�xv�Gw+O�nx�;�t�i��H�'I�	[�4?�08RR�d_�g�-
e�x�31���ܜĒ���b�Z\�ViW-�8�%�Zń�U+�x�31��T�0��	G�\�?�g�zb覆W���I�x�31���ļ��/3�tz}H���G���e��
�
���ܜD�Yodw�[���=���fz�y���x�f�����RS�^��\���a����2�0 %P�J������M�&�^Y̑dH�Z(���e8g���W�n�������yR.躉�#�:��PW���T1%�vx�6������57V,���C����m�`���������_�\u��S��aJ��į�@�Dx�����a�M�6!��	�Vi�}�E����up���'x��WMlE�[�k���i'z�$^o�8j�V��C�ġ)������]��x��vw���'��'��"!�@��
q�=BUR%8#!n̬������k������f��|�����|r���TV-)�*fSD�2�.tt�������$Ր�e٫`�a��P�j�_-�]�x����~���'f��`�` �#5K �C�[�*�`-�U� �  �:�;�	�F��Q�h�����k�?H��V�)���m+�h1�dESL��HT�4���� '��p"��*�Δ���Ô�hEsvq���)�J���x��8���0L��f�D�̼d�.�Gt��U��&�Bk���ĩi��T��0�;�f�_̍`O��t��p����^;�:�q]�4ɶ9=')9u���50JKc�:Y�FY�UU�="��� �
t�y�v���������ݓ�oO�z���w|�Nj�NJr�u��
`�w�Y�pWԢ
)ٌ1$�@^4 M(G2�;&��ؖ~����:dDduKb��-�&ȩ����/J+]U�h�a�T�񥐖+�Sp��F�$;�9���Ty��������sn|��vQ���ql��y=��R"L&�6�LQ�$a+���dbys=y%�����\�_�*�F�����rw��A��M��M��-�P����� ƪN�Qu&�AdU��^io�j�VȮ6�cO>x/�_���˹a<�,d�$s}���m�0�ƽ������/�ZQfl�8	eӚNrҶDm��א�l�a�4>u�I�ߚ��Q���΀ʏ���+��D],�a�ԩl:Ũ�Hu:�tҪ*���������ԌQ�-W�G�I�h��v��,E����јf.�o�[�+K�Kg�6pa��p��G��������H�KQ6��2m����y[�H��y�;WT2�����ůE���
xc>�R -�_�Hۇv�X�Q�.샖;c�4���}�A��,��9����k�`X�;i঵���]�{�����Ba�6��'��8<vh��Z��Ox
�W�dbi3�P�M��s4���D6�P4s��F�D��B�;��B��i+���`�����p�ѳ��h�t_�3���� �P��������f�a�co9<@|�� ~͍�7ɤ�=��6P*��*ӭ��v���#���&Q؍���ԇOg�5�F��#�n�ݖ��
�v+�c�}�)�(�C��,�Q^��S�Y��6x:ę\v�A�����"Sf���,����"p�{6���`5B��+�7�3J�v㘨���PejѤ�.v�ū-��fūqٺ�5�&�k��Ȉ������\�w¼j���z8����|�,U�WM�󪕩���K�Y�[���6S`��m��̑L^e��v������#H=,������v�n�5E��P�b ��{*զiu�F�t��R�?���M���Y�w@�.��݋Ю	��s��t���
��rӾ�x%N��Ov�ꍾ8-w;��x�d�
�
x��>���D�
�L�y�%
.N�A�n�
�
JY�J�\�Ř���SsҬ�ಚ�'8�L~+��y�+?���j��ozZO�h�1�ݑo���"��d��܂��MM��6���un���`���e��9���xr�G���^��5n��x��G�����c��	����
_�.��K�P��.��
��#��5��0�'1�\3��,�k	��*�`6�������D������-
�H
��D�g!��"	��$��� = self::DB_PREFIX��-��"
��>��.�A��!�^w��!�&�3B���x�;�t�i��H�+c�C��_�S�.�E��k\�S�x�31���ܜĒ���b���#}����wx�f���<����
lݢx�31��T�.f��e�x�wO{��D����c�ңx�31���ļ��7&�"�/�g�T�;?�{K��	X�W~~nN"���7�����Y��u��{�?3=P�ݦx�31���ܜĒ���bF�26ƋS&�l?�,��n����W5�x�31��T�^�H.�5�I�]-�[<}~�)� 
R�x�31���ļ����I�M���g�	���N&`^���9�޳���޷*f�O�Y�{x�Y�����x��	x�3�����,�����ɇ!8}�qa���~��x��ONJDv)ɓ,�o�	z���Bx����iC�ȼ"��.n%w}2��vJ�����U��(x����iC��ˁ6\�w{'��8KI/U��.��ڦx�31���ܜĒ���b�T�^y֢߸����.�}�)�gҢx�31��T�;<�^�3j��
��ү{��`=���x�340031Qp,(��LN,����+�(`�S02W:��|Yrnp�s9��wʎ&@�����������I�\�ޫ��WV��4z���+??7'�a��C��=7/t�-�;&z�c�V��,���Zx�۫�G�7�sNjb��FN��6܍<[�Y���Rx�I�����@>��J]Hm�CH�d�M���100644 CachePurge.phpc�[L��go�������Ʊ~�Z� ��Yx�3���*100644 CacheClear.php��J�$��azg�o�ڴ���+��i4�x�31���ܜĒ���b��wSkwժ�u՟�9m�™�-���x�31��T���ݮ�[�ž����1��fs�
e�x�340031Qp,(��LN,����+�(`��;u�?�Y�.O5������ Pp���M�Kax�����X�A	��'�����,��������Id�#�Pv�~F��]g�뎉�X��.x�?��*x�]��n1Ǖ�*J9 A�L�
oP�r�4)KZ�D�)m���'���WkTA	���^x�\�p�@�koڤ{Y����Ž���g��E���±T�R�d���Xhr>
��<�:g��c�:O9�BF8IT)�u��6	�$*�~�^�_���;�g/�W��pBA�e^!�+��D|�T��F���e��[�Fk�ۃ�`�l��r溯���;]�3��B���HI��w�(a��)�:���ڇ�P��68�_q5%�X��,���gu�C��K�����M�'�=���uDzaPǭ8�rHE�&q���JZ�i�V���dNH;/}IS�9�G4ʍT���);sM"��	A�6e�4��n��~��o��v��m�A��<�{�ݝK�d.��
����q�	��O��.K���}g��c&�s��n�`{��_��2�cQ��n&����������q76u(�h~l�x�Ew<k�Y�ϝ�����������xk����3�l`j�ʉpoD��/����q�$�hf�|,���ko#���6)����_K����t�C��'��d5{�64ٖ��Y�?qq5���\x��#�MxC+�sbr��LV)FV+u�\V�͇�8�8�R�KsJl'��U�R@�i*Y�j������8MT�A��g���*�)�+L��ԑ����Be�r�r�#��mx��αJ�@`D�K�����).�XZx���V��9��I���	����|�|_��\8sXX�_
?��y�r������m9����%�o �s(T�0��.�ôMJ^/��{6���M����PM��H��3h�+�Z�����V4�”�����?3�.~�c�v�=
v�Νh�Vv���
��k��p��������6he儍-��EVQ2���9���y8������?>��	�z��x�31���ܜĒ���b��2��U��&�^4����(��*.�x�31��T�h��k�351�}Y}6�Uc�l�x�340031Qp,(��LN,����+�(`��;u�?�Y�.O5������ Pp���M�Ka8�[�/ǖ=Tk���Ƿ�e�8oBTx����$2�q(;~?��慮��u�Dz��
�T.8���Zx�����\������ׄ�}<ϕr��Iڸ��x�31���ܜĒ���b���VM~���1��5�-�nFcp��x�31��T����S��߭ݧ��Linϫo����x�340031Qp,(��LN,����+�(`��;u�?�Y�.O5������ Pp���M�Ka�g^4��/V��K,��y>��TV�BTx����$2�q(;~?��慮��u�Dz��
W[-A���Ox�H�����=W�K����������ƈ�je100644 CacheList.php]O!Ut�����ΓW�j��T��O �
��lx��+�Bp�f��ԜԒ���73M��vIP
2�4T2KRs�'�qHL�̑6�
���h6�$���P�����Y�P�$�Rsr*��T����T��"��D �H!9?/-3��������/QH�KL�IM��,�)ˣn����o�����49�Ç��dG-��76���$x�{!�Lp�f����͋��XC���Ax�{!�οA�}r���*v
�Z. ��k���#x�k�ɳA��5��(=u�Sk���IQ�%5'�$U!1'G!�� �(5E!919#U!-3'�X}�a�P�y,�7����ΰ�O��j3�����5���@̳UP�k�����+�LӀ���UHK�)N��Ʈ`�n�ZT�_d�
"@�d�Cܒ��Y��[l�Q��d_m*H�����Mf^Z��#�G�z2�R�RS� �����������_'�x�31���ܜĒ���b�1Yǭ~���,n���ZzAA��H
V�x�31��T�ݏ��S;�5M���k�j�Ծ
��x�340031Qp,(��LN,����+�(`��;u�?�Y�.O5������ Pp���M�KaHp�\�9��6�)���͒/�������Id�#�Pv�~F��]g�뎉�X��/]���:x����iC�ȧn��ɬUV}[�i��)xE�)*�x�31���ܜĒ���b���g�2��ˋ+���?��u�[����x�31��TcO�sz%��D��N�o�n�j��K�x�340031Qp,(��LN,����+�(`��;u�?�Y�.O5������ Pp���M�Ka(�,v�Ŕ���︴m���^���9�{dʎ���y��ly�1уk��0����ex����iC�ȧn��ɬUV}[�i��)xE�)*���x����iC�H���7?&}�1[�޿�葸��
��x�31���ܜĒ���b��G߶��M88��Ok��X^�*;�x�31��T6�;S�6vO�zj��u[��4�4�.��x�340031Qp,(��LN,����+�(`��;u�?�Y�.O5������ Pp���M�Ka��V��=�k�o������������Id�#�Pv�~F��]g�뎉�X��#/���`x���6�m��H��!e�ͅ�ݙ�U�f�Yy��ϛ�����$�x�m��J�@�iZ[X�<�a�ȶ�Ի��ŋ�Ż��4]H6��z���u/}�Bo>���Sz��6k�
�43����7��m�~�JT]����:j�)0�J�8b�r������V8Mf�%P�h���]f���ԢzؤtK��������e�kӾ��}�=�/�9�\Lf��B�7�Ѧƾ�N�r�Gm;�t�L�<��2����$+*�R,�P��{���!�QJ�m\F��#�Bޥr�E�^�`�1\�0�(�M}�"�aA�~!����H�L=
1����Ŀ�K�u�`H�\��j})_�d���w�(����j��쟑�|R������x����iC��4��ځ<���j�
rz!�>,�E
4�x�31���ܜĒ���b����n\�m�_�r�av>�:��iy�x�31��T�NG�~X�%���!���m|�x�340031Qp,(��LN,����+�(`��;u�?�Y�.O5������ Pp���M�Ka�T�?���$������VNj���/Qᕟ���ȰGơ�����Ζ�=�f+�.v��hx�k�?Ƴ!�e�V����t[�/����J+���g���d%�)�*�`��P\C=919#5� �$C]G�+�1�#>�3�UAOA],��9� �1�a!^�ex�;Ƴ�g�?+�W�c�G��������cY:��!"x�]�1K�@�i�	�],O\
M�mM���L^҃˥$���f��G�9��@�6�<s6m�����yy�_�^-�{�3,��s�W�M;�.P���SH��<�M����~����HXL��TY����!!5��G�j�j��9�S��h��1Z�,�̲3x�m�%�v=�Tl,�ʒW
y�U�Ň��b��,꫹QI��Ev�f	!\n0B��	&'4c.�I,�(| �P*�!�*�D-�GB��䩣�$��;�x����>&rąE�L�K$���i���Ȕ����}���\��27r��T�e��Rx��#|_pC�dG��˙%&��1�o��\�8���\r~^Zf���B��[brI~Q��Uzj�3XXc��ӔԴ�Ҝ���u[;�⒢��<
�������`��_\Y\����39���Pb���D
������Ēu����`�W=u}�����=�N�
P��	4��4�,�ǜ
Mk..���4�3�'�向�����pVjNq��\q����T�yP��!iV��N��!-
��C3l�dG��?9�������0zN�|�u�@B�O6��WA1�##�,U!)55O!%5'�$5E�Z�Z.$�����Fx��/�Xp/���f&a�̼�|;uMk. ���� ��+x�[,��s�K@iQ�d]�n�c/��xN�BjEAfQj�BrbrF�BZfNj���^�ۓ��d�5���@%%5'�$U�VA�T�.=Y(W���Wck����S��Y
���_ZRPZ�kW^�Y�����n�ZT�_d�
"@���K�8%E!�D15��F�D�-��@����
����[<��C�%L)���sx����iC����U=
��,��N�r_B_�����x�31���ܜĒ���b��'VL��L5����"3����e�Ԣx�31��T�;�VN�Y�"k���\�ow�i��
<�x�340031Qp,(��LN,����+�(`��;u�?�Y�.O5������ Pp���M�Ka(��-�Vxk��U�"�MO��m�������Id�#�Pv�~F��]g�뎉�X�h3-����mx����iC��ެC9z<��=���ؚ��co�=�L�x�31���ܜĒ���b�W��'f�[��%9��J��3��ڢx�31��T�
Ofv�ꕴs��3�;����x�340031Qp,(��LN,����+�(`��;u�?�Y�.O5������ Pp���M�KaXX��`�c�N�O��z��_�D�W~~nN"����3zn^�:[^wL�ǚ�b2l�!x��/8Gp/���~&����8x��/��s�K@iQ�d]�n�c/��|JjNjI�BbN�BjEAfQj�BrbrF�BZfNj���^�ۓ/�ɸkZs)@�
T���
X��]z�P� 3M���V!-1�8U�,=��C�.��(���D*�����4E!�$5��F�B���T�!0#l1�֩��X�������q@��~f^Z>ܨZ�Z.�R����?x����iC�Hb��U�)-��ul}LO_?�<
�X�x�31���ܜĒ���b�f��r6>wxir�@*��������2�x�31��TM�P�
�	�t/v�:rou�4[��F�x�340031Qp,(��LN,����+�(`��;u�?�Y�.O5������ Pp���M�Ka�:-�޵��Z�f��wh�c�J]�
���ܜD�=2e��g�ܼ�u����A�5[�&0����x���6�mB��ה6�5W3�WV��(Q��ʻ��|c�<&ғ
���hx�{��c�f����T]��d
Mk.��V,ғױ8��	����x����iC�H�y.��y�-k�
��<s{��y��
��x�31���ܜĒ���b)]�K���𷴽�as/����x�31��T�+�)��!E&;L5�
ĥc���
Ѯx�340031Qp,(��LN,����+�(`�ܾ�G�
��&����>��v���(8���&�0<p�����a����^ۥ��K.�	Qᕟ���ȰGơ�����Ζ�=�f+�[0vl��~x�۫?]�;��\� -<j��x����uB����L�T���:x�����\W�uA�2�����H�bݼ�٨sDŽv�x�31���ܜĒ���b�U3y�I]�����;�����>
.x�x�31��T�3<��ί�͜��aE�Ó��'!�x�340031Qp,(��LN,����+�(`�ܾ�G�
��&����>��v���(8���&�0�`��P%^p�� �秫=^���9�{dʎ���y��ly�1уk��*.P���x����u���SCB�yb��G)m�/���j̰��m��u:�
Q���gx����iC�Ȏ��5���t$��캸&���
�w
�x�31���ܜĒ���b������<*��9~o��t��
[�x�31��T���O�<�]�w�/	��xX��7ӏC�x�340031Qp,(��LN,����+�(`�}X�2g7�%)�O��Z�:0������ss�R^��776�%�W��J�2e��3�!*���ss��8����s�B���c�=�l;-�l��Sx�۫�Yo���2nw#|j�Bx���z�u�����Lu-��x����iC,�0�]���ݕ��U8�/Kp�"
�}�x�31���ܜĒ���b��Wa���3MRU�0�b�v���]�x�31��T�;�=E{y/��Nz��>'c��ܭ��
|�x�340031Qp,(��LN,����+�(`�}X�2g7�%)�O��Z�:0������ss�R>;窗-���.��x�?���V�
���ܜD�=2e��g�ܼ�u����A�5[�,���Nx���z�u���VӇ��ms8*��8�8M���`�1dҀ���jx��/x�/�������&?f�J
����Qx����iC���WSZ7�h��:��n�<��O�;
U�x�31���ܜĒ���b�Z;A&��+Vn`nYu���5�z��<�x�31��T�E[�V^�c��m�A։���H�:� K�x�340031Qp,(��LN,����+�(`�}X�2g7�%)�O��Z�:0������ss�R6ϩN
։sf|���o^���9�{dʎ���y��ly�1уk�a,���x���z�u��H��|��[A3����S]�_�ƐyLѭ
���1x��/��{��ɳY��&&g�*�*�x�%&��UZY���8�D54�'w��1rM�`���R��d��ds3�Ĝ������Լ�ɹ&,`�m�S~����[x����iC����+rbor��Ǹ>3�J���X
��x�31���ܜĒ���b�/s9��[0'Lo�C�5��q~�
���x�31��T71Sak?n&���¦A�&���B�x�340031Qp,(��LN,����+�(`�}X�2g7�%)�O��Z�:0������ss�R���7���)��(�W��sj�-/�
���ܜD�=2e��g�ܼ�u����A�5[�,���x���z�u����/U�M.92�o�Xî��h��!��&��8x��/��s���,g=�3Rlb���K�*���SK�A���\\
P��_�
�PII��9��hh*$+�d���N6d����]���kr��$PV!�(?�D!5/E�K��x�A9kF)&���!x����iC�ȹ��'�&>*8�R*���_%�z�A
*�*x����iC��\�����L���N���7�}���;j�x�31���ܜĒ���b�&�N������5�(��^����5
�q�x�31��T�u�k�|���x�G�+�L?���0�x�340031Qp,(��LN,����+�(`�ș���-�cM��P��&@������� Uxtë;�Y��x���%�
���ܜD�=2e��g�ܼ�u����A�5[-����x�;��]oC9��w��l�y�I9����6�r���
��)x����X�"���89�\2��r&7p�n^�u���
�l��Tx�[��u�)��<���x���Cx��m��t�?��kEIj^qf~�cRqIQbr	W��Lq��XX7d}�2Y�[p�#���r�r�͗�=�����x�31���ܜĒ���b�ۢ���f�^l���ۋ��Av
���x�31��T�e1;K�s�K.�q���;F�Bԡ�x�340031Qp,(��LN,����+�(`�ș���-�cM��P��&@������°����|.xY}e�w�Ʌϋ!*���ss��8����s�B���c�=�l�0Y���Dx����iC���[{��{���\ܽ��{�R��
�x�31���ܜĒ���b���rݭ�Y3"���r�i��8�3V�x�31��T�?�{�4��
�\Y��m��̲M��L�x�340031Qp,(��LN,����+�(`�ș���-�cM��P��&@������°�������~�mλ�����~Qᕟ���ȰGơ�����Ζ�=�f+�,����=x����iC��6�)��~pE���2��猦'���@
E�x�31���ܜĒ���b�9gL�?6�-1����K��l����x�31��T��I*O��_��ǁ�S����TԸˮx�340031Qp,(��LN,����+�(`�e�:&��S!�D��EM�[ob
����y)�]�y�y{d�ټާ�Qh��_�!*���ss��8����s�B���c�=�l0-����Dx�[�v�U�����D���$5�83?�5/1)'U� ���V�#�r�9��%��Re|�q�<&%U���Cx��/�^tC���'{pN���S�^%��@�V!��-1�$����*=�ı� '39�$3?OCӚK
TrS���S��@�t�j}!b����� �pՙi
���EE��p��
jj
��y%`1v����\�
i�E���
�
��@[��5��N.��G]�
2�8=Z��� U=l4�0���&�U 3&o�ҙ�����5/1)'�JA�X]GC��0P˅�W��S�:Y������hP���lx����iC�H�G6�s3������m��{{:�=��x�31���ܜĒ���b�;��t�p.v
p�߰i��>�
?�x�31��T�*��;v]P��:���ڽ�g�)�
�$��x�340031Qp,(��LN,����+�(`�e�:&��S!�D��EM�[ob
����y)�j>���W�kr�􎹒�]q��+??7'�a��C��=7/t�-�;&z�c�V��,s��/x�;�z�u��H�[�(�%���]�a��v�L��nj����C�x�31���ܜĒ���b��j�sB:&�X��9�{��@s�J���x�31��Tʹ�O7��p*ڿ-��{I1m��ڮx�340031Qp,(��LN,����+�(`Xtr턥r��n���x0�@JiΌg&@���������{�q~���bR�-��5�� *���ss��8����s�B���c�=�l[�-?���@x�i�����d��Ȫ*�-m�Cז��|����x42���4�Y��_@�2�4�40000 bin,�����ɇ!8}�qa���~[˹�\J�C�%!�Rat'�H��.����x����iC�W��˦�w溺!ͻ^i��:�x�31���ܜĒ���b�.�i�lr����_-J��8	�=΢x�31��T�~����O\?2���dS�W��f�hD�x�340031Qp,(��LN,����+�(`Xtr턥r��n���x0�@JiΌg&@�������~�'C�WiE�e���im����+??7'�a��C��=7/t�-�;&z�c�V�0r��zx����i��}g���n0�[�]�B�1K� f�
�o��tx��Ʒ�k?3�[�foVm&+(t���nx�E��JBA���A�R4��H;�� ���hS`m�x�ur��57���)lߪUA��3�j��{�Vg��;���y9���tτ��0TLtᔂ)�Uׅf����Z6���v��tݽ24�JP�1�q%�&�0���\
�u|&��INB ں�5�e��>�B�8�q��3���W��mk�> ��4���ּǔ���rj{�L��=
"Ae9>�$udyR(��:���*#>�J��B|�5J֙D��{����n���A�4B��8�1��4ȡ0�gJ[�Jy]�m��kf'�3�l|'�����T�q�{�վv�s:7�H���9�؃������'��̰���-CK(m�.���x�����\��Z��ā-'�T�l�o���x�31���ܜĒ���b�#��=��7,T_>������g3��o�x�31��T��	����4�O˵��� 
�
L�x�340031Qp,(��LN,����+�(`�Q���c�$��7K�g�QHzfb
����y)y�}24y�V�X���_���{ *���ss��8����s�B���c�=�l1v.X���x����iC��ּ�|��WvVdp��\՞_kU4�_V�x�31���ܜĒ���b�OBw�/Y�0���S�
��|'>�x�31��T�~�E�w�R�U~����{&���b���x�340031Qp,(��LN,����+�(`8�ka��[�KY׺�gmkh�*��jb
����y)y�}24y�V�X���_���{ *���ss��8����s�B���c�=�lb&.���{x����iC�ȕSI���޳/������Ŭ�������x�3������^�I4b���ﶮ�U6t��~h��D�F�a��0��e_͌	���f��Rx�uT]kGEn�<�)
����ZQ'�����np�P9��
����j�ٙ�̬�!��_��(C�O_��R��l�T`�ޯs�9�������_n~�c�[v�V�B�R���o��F{���Џ=��@`}�clggF�C�����g?�2�@�B(�iX��Ԡ���P����Rr'���
U���E�樜��!�y)T
��0��
r��Z:�K��E�@Fk?n��O�dߡ��d�����J)��^9T��ۋ�o������[���۵�H�g(���8�}%��o��i����ҡQ�h�ru�1�Ha�^��:��D�H7y�u�THL!�e�U��(�l*�C�����Y@L8K|�`�K,xa�r�uN�V�|��*y���A�,�+Y�N��!E8n��u�ɚә����;�n�Oq�>^r�B9'�
��Z�Ngh8Lq	Ԅ�5�\H>!�Sm�
H}ά@�8��41�k���c��U8*^"��&�!�А���^S/fWS|�n���+Hc&��h]r-�jm�N�����c��5Ҵ�u��'��>|Y�O�?{�������f�|����e3��{���5`N�h�Кt	�<��Ja��.|x=*��,�a>9���w�^`,%=ut�
랐�229M����S����l�l�x�z�7�آ��v��W���f��N5T��g(��g�xͭ�t�9���D�~&��~Oa*y��e�9ɫ
~D7�ٷ^'#/]�*����V]�ԑVΈI�h��}O�	�+�_`����_J/\�j�p�� ��+O�Mʻa�D^�|��
�3ƈ:l�@�e]O�L��6ta���{�ʉ��I�`�n�Nki7d���'���1�FS9���'�8�@�F�C���n?Axj�3rt$&���?9��x�31��̜�b�©r����μZ�zL�j�CsSS����ܜD���#A��S�B�?g�<���O�'��T�x�31���ܜĒ���b�uA�L�;.l�s�� �u���b
8��x�31��T��$�Z-��L�.�/�W���ڻ��>C�x�340031Qp,(��LN,����+�(`��⩘�RO8D�f�#Ƨ'4R~���s~nnb^
ß�u�x�~�͑���F�+�
���ܜD�Yodw�[���=���fz�-W���]x�v������>�^�L�1�x
7�x��l��Y=100644 PluginList.php���]1i�̂m]_؎�����r�?9#��4z�ض�yׄ��U_��"X#�F�0y_Tߥ�r3���x�8�����l?�I��N���G�c��n���E6�B�ABI�L��a�}���� o��Ix����iC�������_~�f�X��P�֌�����x�31���ܜĒ���b���?����Q������}�%�(�x�31��T�$��3c%-t_q�S|t}�#�I�;
^�x�340031Qp,(��LN,����+�(`��⩘�RO8D�f�#Ƨ'4R~���s~nnb^
��"#5��~:է�0�YLo��-^���9�޳���޷*f�O�Y�{x�Y���ĩ,���Gx��²�e����o�N��}v�-O�V�0��>��R�R���)�#��\x����N�0Ƈ�L,Tb8��IE��)�T!�0�nrM��vd;)�x�<;O���;�eA�t>�}����׏�3K#��c�\?B�OF���Nc]l��F�ۨ%D�&����5Ç��D�g��$���Bj�ٌ���4
%���O��_o�r	O�A,��w������jt��N����^7�{�,oW��N{Np�a"Rzp��*@����ԋWk�� $DL���HF(#c��u�ҷИ��Sɻ��}t�3DJ�Nq1�G��rv��
��\5�n���N�>F��l�~�y`[��/�Y�'D)�Ա�x]w.���
��m�U�Ld�_dm%W��77\����gx�]��J�@EI�H\d�
�6�$
�"TD�r�];��8d23Τ5��/����#��?�H���q8�ޗ����c7ܡ3�.��
�'�ԔsP|Q0a?\~r.+%
jP���,Q&E
�Ǥ��L�8��\S�F{�鱷'/p��+�L��~�����9c9�9�8Æ�ڌ�T��&tn^���e����;z�c8U
�zA+R 0��W�jjݮj�V��a��BH�r�
�O^s�-��T�ԨG�k�N��(-��!�R�L��v;�ƻ���7�|���~x����iC�����rM���=�u>����1S�x�31���ܜĒ���b��:�W_�}[)0w�w�8l�(��x�31��T߹mVMQ/�Mo{�Ds]���ֲ��x�340031Qp,(��LN,����+�(`��S/��,+ݹ��̂��Ϳ��*���s~nnb^
��"#5��~:է�0�YLo��-^���9�޳���޷*f�O�Y�{x�Y���;.J���4x�H���-�,��
�i��
P����/�F);
��A�.�F���{`��6������	�N���v���Px�3������^�I4b���ﶮ�U6t��~�W�Q�.�ޙѺ͏r�J�߈����x�31���ܜĒ���b��i2I��׵.���,��~����x�31��T�Z#ï1��We���|3{�=K�%
�x�340031Qp,(��LN,����+�(`p�ֶ��E�r
�g�n���R;nb
����y)>��Ԍ�N\��T�Z��g1���@Tx����$2x�z#�{ߪ�u?]g���g�3�R�.����2x�M�KKQ��i4��$"Dv�#J��bP;!(����e���m��em�CkwA�1�Vm���o�XIgq��y}����q��^�>���9n���\�J�E��\ʏj7�r����H�!��`:|6�7����#/��0�n� Z^�q�6�&"D��D2��td�<�u��A�y�i9��X��l2w}�A��O�P���%��6�s�)m��Ø��DŢ��x;��?�.~�W��M�{F�⩾��H�G\ጮ��2�����5$�bE�qs!�o����	�32�2��@���m�-�0��jz�C��8iS�Hˡ���,j�kpۡ�di�!}b�k���=�K־7=����x����iC�ș6�j�w�#'�[)�{}#v�����
��x�31���ܜĒ���b�C{ɬN����m���¹�a��4�x�31��T�ߋ�v,~2C�|����o�Lr<�
����x�340031Qp,(��LN,����+�(`p�ֶ��E�r
�g�n���R;nb
����y)9���y����௕����#�
���ܜD�Yodw�[���=���fz-��zx����iC�Hݒ�<Z�B-��O�k��8�~
��
�x�31���ܜĒ���b�u��/�'~�JS>���M�o�x�31��T���<I��������ɸ)_��
���x�340031Qp,(��LN,����+�(`01.����s=�J�~��h��w�&@��������Ν�m q���
�Z���^�>�������Id�Fv��U1�~�κ��{�g�'�J,[��bx����_i�}f(�|�����|���sSlTJ22�u��SK��ss�R���P�̼��Mk..���4�⒢��b
�	:
�V�
���
i�9ũ�p��p�d�h����(�$��փ��: �� '?%UhPd&�>d�*�9���~�{����$�����8�����@]���P���Y�KSI$�b|=��Z�M�@Ǔd�d�k�lB|jп� ��������
֌�b
!�W��k2��"'8�A!>y����<"���';KO�'�3َ�s�w�׌�7p�l�Α��X�<�s��4x�ۯ�]i�}fF���6�cv�Gl���Ex����iC��g�(��|¼ے��?ć���	զx�31���ܜĒ���b�ݻ]�^<K���2����c|
��m;�x�31��T���|s�����8|ʲ��t��.�^�x�340031Qp,(��LN,����+�(`��k��)��5���3-Դ�啉(8���&�0䤶s�iH\>~���Vn��� *���ss�g��ݽoU̺�����޳���	<c-����x�3������^�I4b���ﶮ�U6t��~ʿ�wu(@2��&nPp�4�ш�ɦx�31���ܜĒ���b�G9ؗ�4��wr�Ŕ�+T)>X��x�31��T�ś�8�O<8u+W\�o�oJ\Om�
�x�340031Qp,(��LN,����+�(`�,|�K�m��+ړ��k?�E=�Web
����y)9���y����௕����#�
���ܜD�Yodw�[���=���fz�,����tx����Ai�%��w��F��%�*�*��dd�ڥ��8���&��5���y�%��\\
P����Q\RT�_�6AGA�J]SA��V!-1�8U�k�}1ǜ��
����d�ɚ@�R+
r�SR5��� ��+ ����b�����z
��i�Ep�4�"��E�j�:S�V#i�d�t�䓂� i*��)(B���u�&Ĺr0��Z3 �O��Wj����d^��v|ܛ?�mfټ�{c-Y�h5��x����iC��P��~Ն�JM�=>i�:�yb����
��x�31���ܜĒ���b�f۵s�y��v8�h�깣�:

��x�31��T�ɽ}���v�=�ö6���{����x�340031Qp,(��LN,����+�(`�z�w�y��VK.�To�$x�S��(8���&�0䤶s�iH\>~���Vn��� *���ss�g��ݽoU̺�����޳���	z�.H���rx���qDc���k�0o���J����1x����iC�H3���;o}�HpX���o��#�P��x�31���ܜĒ���b���5��-�L'^����B&n���N�x�31��T��/o�	oS(M����>Wh�֛V�P�x�340031Qp,(��LN,����+�(`P��yi|t����n-���ř?֙��s~nnb^
�ٲu�t#�����q�=�B�X3D�W~~nN"���7�����Y��u��{�?3=S\.5��>x�e��������(5�n��{oe�jr!J��i��rZ�.�=T��
�
����2a���b�m�r|�S��}C�.�`��,�� }Ʃp<v@-���=x�m��J1F�tZ�ZE\�)�b��ة�e��\�F�N
�$c������ٹw�ۈo�‡0m��]%���{+��?2fũdZ��!�8�F�+M������O����$
%��G��$�G0@����I�2l�	Y�����8
��0Kͳ{�)�owwm��N��7_ي�p�.���Z�)�6�Ҫ��D�><��t�^D%,s��2W�ms�?�/�:��).lǫ��T�B�
k(-m_+0�{^��!C�	S��ˌ� �t��ZB�^E�-�6'�D�gB���)-�A�C�J�g�2/���ߜ/�Ohu�zNeG���V�(��Qx�UQ�n�0��R�)�!�!�.k�&�$eBC�J��	$$��:7���#�%먴wx�+��� ��?���+�����s������ c���><�*�i>a�9���y���=��<�?�Cň�C"�Ai��^�t,Fo�>	�e�f�(��<�J�^�/8-9�l�P�\���,���|Dm�����2�fs)Y�h\X����+�
P%�*�&J�e�H%9%��j��1S�[�g�V�ʷZQ��mQ�D�P��^���h�W
�ʥP$�.��Z�Ul�o�1���X[˸	�UO��v��fS[�8��ύ�V�׺o;Us
���%I�5(�~�����;�	<q�`�ٙ�"y��S�;�n�YC�߭ͳc�B�X�#?�D�����_�����t�\&j���3\�G%�#���B���"����Jz�ո��|���QJ,en������ђ��^�/n^=�>>Ч��
x����iC���I�	�ք���#(g��������x�31���ܜĒ���b����Oq.�'��!ߩ��5��&G�x�31��T�M�6�ϕ�6�w��퉗����V�x�340031Qp,(��LN,����+�(`��g���;����os֖��*����ss�R¢�-ymS�/�>���_c�j�
���ܜD�Yodw�[���=���fzF�-`���x����Fy�1�͂����O.�K����f�6�6[QjIiQ��6��w��Nn�1���GYX�Wc�=�BHtr?�䓼j�w��3r��*�d�krMv��\@l����DuQ�x���%'d�B�b���9&�����(^1�(���P.��(U;Nj�3x�����2���6�-���@x�3�����8��%38���Ȅ�qG#��2���~(шI���]���v9&�s�����x�31��̜�b�©r����μZ�zL�j�CsSS����ܜD�O[���")tn���Y�M'���Vh�x�31���ܜĒ���b�|����*H�;�8[�Ƅ�\�x�31��T�����k7/XU�zy�m���W�Mבz�x�340031Qp,(��LN,����+�(`xsVu��׷6:���.��'�����ss�R¢�-ymS�/�>���_c�j�
���ܜD�Yodw�[���=���fz?f-C��x�{��[v���7�7O�`B
���?x�3�����D��S�ޏ�	�w��E�=�t��~c�5��,��nj|5�H�q���3�x�31��̜�b�©r����μZ�zL�j�CsSS����ܜD���W�����=�{�c��[v���? B���;x�[/6�k�)�Ă����Ē�<]���Ĕ����̼b�I��
�
��x�31���ܜĒ���b;�=���UB�'����_� �l]�o�x�31��T�K;E��[�S����韶�b�����x�340031Qp,(��LN,����+�(`�xS�.قs�{�/w�|`{�i�nb
����y)�%��Tϰz��[yiф�O�� *���ss�g��ݽoU̺�����޳���	v4.��
�Mx�{��"<AmcW+#�l���8y
��d~}.�XZi^rIf~���\��e�&K�<�\í:yw��<���y'n�˻��[__�3M!Q!9?771/E�<�$C�$#U!���(5�.�����P�X���S���R������������_���Y�79�_v�N~	ng�55��.���&��b1 b> ��;�����F��$��Hx�U��N1�#("����D!��e�ċ��L�x7���BCٮm4Bx�g0��ًG_ŋϠV�����7������ʫ���1�u��?b/�.ʐ)p�Z��6�]�:`ʀKP�]��~��*���#`�ɡ�]��G��l��r*ѱm8kb���H�PFj���KC!!dȏ�}nC��^d�3P�x��-�S�d!��A}y�R���֫�)a�ox�wjS_%��3��q���r(�s�p�K�fǁ�~J��"�P4tG&�M�B�/��{��.-�7,C�Lb����
4���"
��-b<�2`�T���
BU��͙��_Z���ײ�O�7g���D�
<�n.��)R�,F}C�c��`�f.�tl�\T�;���~��F��\��7x�3�����/~���K���#x�&�hMW��~�
lo��œ�"]����8���]�x�31��̜�b�©r����μZ�zL�j�CsSS����ܜD'9C5g���%�7���%z�@��x�31���ܜĒ���b�?)�7.k�}}mN:����0�;��L�x�31��T�U��ξ�֘�Y~�������o�FǮx�340031Qp,(��LN,����+�(`P�_6��M���^�}㏉(8���&�0�K��SQ<��Q�n�EJ>������Id�Fv��U1�~�κ��{�g�'�0o�Fx�k^Ų��q�~ƻ̵\�,`x�x�31��̜�b�©r����μZ�zL�j�CsSS����ܜD����
t�.ܸ׿ ��Ewg�Y�x�31���ܜĒ���b�����s�����	8+M�;�
�x�31��T�Y�.%��m�s�ۿg{��M��ţx�31���ļ��b*�gX=�ѭ��hB�'�]&`^���9�޳���޷*f�O�Y�{x�Y�����Z���fx���t�i��DqQ2ףg��l��Rf�qE+o�v���
��.x�;�t�i�)��p�J�v%��5m��'4�^�b
i�*x�;�t�i����O�̿*��&�vκ�eXe���Ǧx�31���ܜĒ���b��!=��uj����M�M&-k�(��x�31��T���*5�Z�}�,�{RǓ^j_Ƃ��x�31���ļ��g�"s
�_c�֚�/<�K���
���ܜD�Yodw�[���=���fz���j��mx��b��<a��s6��\���6x�7�����|u3#�1�Fuk��u��g{��Xsrc��HS�_g���V85�+J��x�31��̜�b��ߖ�������Ti���Ч]��榦
Y���9�KX8.��v �]|���oKC����Dx�;�6�s#�JbiI~N~b���dQF���4���̜T
����B5���f�*�e��jRs�S!�0�xϠ�x=u}==�,�(�X�ق1��5$?;5o�"����L���2OVc2�9�R�3�KR���,n@gL��h1Y�Y���6y�x�31���ܜĒ���b�f�IO��
��]ز�.���
�z�x�31��T��U3.^}$t�҇���:3��.��0��x�31���ļ�+��l~8���,N�1��P5������Id�#�Pv�~F��]g�뎉�X��O���5x���:�e+��n�"zޭ��ñ��B��6e��
��x�;�t�i����K��%A/��y��<ad��
4�x�31���ܜĒ���b���l4����bj[��[j��&{�F�x�31��T��]ݜ���ۦ�Z[�-���)
%�x�31������6s��������FY����^�
���ܜD�=2e��g�ܼ�u����A�5[M���{x����������CF+T*�Ѩ�d�ƻ�������Rx��UMO�@$��T~Æ���5A l4?�1&z!Q���°mg��� ��:gO����śg��g�љ����d�ݾ����<o�F~U�?(���@��-0�"� �B���ǀK���*�q�S.�*dy��.�	i��S
�EhLV'%iG�nij*�a����
B`� �p�4
ê�7%�R�H��ᛥ��o�'@����_>�������-J6�1���gڥ���h3��`�ƙM�,SB"�����&
=Bq!�`$)�k(r<L�F-F�
�0����!�wJ��
FBò����e��
# J4��ɞ<cf������	m���x�%2�r"M�wK�c�Pdfv]�4�]�5�ۢc�����e���Q=�2>�c|Z�:��=�"
S�P��#8ե׊�����uA�G�I
Kv=)�����]1pff�"�F�|�����	����H�
3���J�F]��j�AV�r��輡�$w4�S����H[�C`�F\.7���8�pg哩�w?DŽ|��&�y옗r-ʛ��bLj��XLl'�q��+�����q�J��Gݐ
�_u{�(%+�����k��y �rԧ��W��8�A|��v�YE��6
��t��RTz�jGW[��_��q��r��_�]�n�_��\����׽���s����/�����#���	�.�h��,*���8�.-UЯR�vld�I�d;A�2��-�Ê���r1�g�ٓ|�*�����ݨ���nv�3|[�u0�9��G��&&����6fj��<�wn�=�R��{��l"�s�;D1�4����F�>�W��Px�;�t�i�)�#�"�
�����?����vIp�x����x�31��̜�b�m�L�*;�������M3�����*d����$2,aM|��ہXv��W�:�-	��3���:x�[�x�q�-C3����������4�6��q)�):��lb��!s�=�����?x��´�Y��3�7?�4'U!7?%��8G/َK&HNU�h�,�����%�*��륤��M�W����g�*��A$�)Lܥ2��dF+9���~XfQIib�G~q���>�b;��(��x�340031Q�K�,I,))�L*-I-f��.��5�i�G��[>|�/j����23=/�(��'�S�P͞�\��-��P��sC5T����������^n
É���ⲩד�k$T9>霞U�������p�Lͤ��l��{��[-Ŗ�S�*	rut�u�S���מ�W�V��٤栦���?��($e�1h��x��{��]�w��6�!�:Ԉ�܂���"���<��k�ޝ��p����{9RO��+��O�f��}�]̡����K����!�%3�+�z���N�G�WK6�Z��@�<��0x�3�����0e�I��أ^炟M����4���z�F���?,W�ԠnwTt���Mn�B��x�31��̜�b�©r����μZ�zL�j�CsSS����ܜD�%���u;�.���S�÷%��x�31���ܜĒ���b��\�'�I|>�*���Wt}�D�VE�x�31��T��s���̛ �B��5���EG͕
�x�31���ļs�rI��B���o����ڋ �`�
���ܜD�=2e��g�ܼ�u����A�5[Y�|��4x�����:#%U���|]ͭ�1����7��d�x�31���ܜĒ���b���.H�)��|a}CΝ�5s_-���x�31��T�Œ��_�-�]"�wmE���[�
�x�31�����
�uƚ�ڹ}�c��[aVᕟ���ȰGơ�����Ζ�=�f+
���:x������x�0�z"o�����6gl�px�;��Sw����e��"���zx�3�����0e�I��أ^炟M����4���z�j�j�x��G�o�<�:�b�x�31���ܜĒ���b}�|��G�O����w�b��� �x�31��T�
��vp�z]]U�;�%����>��
_�x�31���ļ����M+��^��=q}'{�DN�	X�W~~nN"����3zn^�:[^wL�ǚ�Tu���fx���2�e�+��+�wό?���%-�P̲���ٶ0�]��lx��TAkAƀ&lW�h�']�Y�&P[�����"���4����ivw�̤ilK�^��'/z�ſ�?��!:��$�b3��}���~3'��K_��_W�Ц���p��G����!�rph�A���OD�
�����ah�`xAi��
p��6�TV�d�+��j�mo�w)
|dB��1�/��i��˼Y.C62��{�����_�f@��	m���>�;]��at;�[px�O��[��!ܮ7��9�f�`�
K��@78�25�h�wzq>�.悄��j �k�A\���4Ȭ���=e����H��R'�să�D��5��4ġHtZp����˛	�������0�$��|��rM���t��0�@�

�0+�R����ՋK2�+ʓ�|���5e��]̬�s0�Ȱ�P����P��PW�Q��t�D�|�[؞2��ljmgį�~���i�^'�?g,"j�0k�I����)rg:Z�8�����0+���P
?���wZʵ�AU�I2��q����MaՋ����|#D��W-�.A���j��1����U�9��t;t ��w
.����b1Ni��2܎
6�>႗�l�׮�{�JBMyW���XF�.��ܐ�:&�Cb��(��t��x�3�����0e�I��أ^炟M����4���z�>r�}
���h���
�=�����x�31���ܜĒ���b���j��s�����jx;���(�x�31��TY���q=y���,�0i7/���x�31���ļ;���̒�����d�6�g�^��	X�W~~nN"����3zn^�:[^wL�ǚ��y�
��lx�[Ǽ�y��H[ps��1ߛ�$N�4S�y���DՀ^R�g�������|��q�g
�LL\+JR�3��+ss2�
2
�����a'��E�=�T�N=pd<:q�����A��w�vq�0��k}�����Z�9��%�.�9�%�`v�:�vO��!�`�բ5O�.��8?Y�q��H���5x�[�<�eBITPjzfqIj�^AFÒ؂�_٪R��Y��.c�}����������kEIj^qf~L�KjZbiNI1Xc�qȑŧ���$~^�Тp'�ɍ)f�"zޭ��ñ��B��6e�3M��x�7�����8�*5b�𵏅P�h`^�����Yt�7j�:$jQ��\����*�U���ax�;�t�i����_�"��<��`��=W�jd"�ɱ>�x�31���ܜĒ���b�O:Ǿ�)\�xV�]��^s(!X�x�31��T���<\qO�7�����+���u�p�x�31���ļ���S.:���p��>_�}j���	X�W~~nN"����3zn^�:[^wL�ǚ�(����x���2�eB���-Ӥ����
|�`O�۰t��fF�W
���\x�;�t�i��ȯܤ�7?&�-�
�o��$���x�31���ܜĒ���b�kS������.��4Q�R��B�-
��x�31��T�W;Wh�wo�/i�?��<��(�	��x�31���ļ���S.:���p��>_�}j���	X�W~~nN"���7�����Y��u��{�?3=+����)x�;�t�i���?�⩷�����qdz�d�{�u�����x�31���ܜĒ���bNO��Mϕc\$�Z><�&^��
��x�31��T�i�g�
O8ؿ��=�^�<[�BEΆ
|�x�31���ļ����&MYfe�4_��|���W:M�*���ss�g��ݽoU̺�����޳���	7L��x������Əi\ER��l��˺�ubܟb����r����&x�;o~�|�W!���Ҝ�ɿ�����z�3��S"���vr�����l>$��
b�=��zx�;�t�i��e�
��z�<{���^�3�l��}�
8llx�;i�k����.q{%Q��Ax�;�t�i��HŦyK�Ulؾ��*Fl���B	¦x�31���ܜĒ���b��U���=
�p��_<�*+Q��+
�T�x�31��T��DC�Jy5dz�78�=q�n��΢
��x�31���ļ��Il�����x������lVᕟ�����=���}�b�t�u������LO0�հ�x��Xmo۶��_��f�T8v:������H�.�m6�
<Z�m�2��TR/���$��I��[�9<��y���:L�=�g�ǘg[AWk��s^��#����!�{���k��fR&f	���EJ�o?��Q�V*�N&���ceƌ����dr��/������^���#BR���#'�>2N���u��|3���M��t�c�$��\ �&(ƌ3�I��� A2.��bL�7DfV�*mέ��ـ�ǃAƿ�n��m�ӌ3�T��e����*����E.�"b	6|��u� P�	\�JK��1F��a���O�+��2"`w�b)��'Y�Sߒ���$��U�l�b5x�l��ҟgH��ݭ��B����)[�G�?\�X�����q��;���S��4�u�I�V,��S�g�z��y��Ns"�����n�U�ȧ��"���BȩolX�,��mIW� ad�ج��X@	N���FԚ���$Q�@��Ai�T���ޗDƂ+à�E�<��$L��_~��|^��ߑ��Z�q�
֖�/�k�?����߯�o/^�77`Ne���Q�qM z�$]b�[s����W]�4{-HiIƨ+L�:,Z�47�G�<M{,�ʦ���^�z1�c��t�=ݖ �&�W�H*?Fe�
�<��B��a�B���DžՎ��Ue*�h����S
9�ӯe��hh"�A~��3�Β
eTC>���lJtQ~k���1!w�@F>�8W$�Obt@��j�Nt�̓>�+����Q�ĩ$Md<����j9��H��H�7O؛
�ܷ'�K��E�Y��U.�Djâ%U�zNN&*�	r
��:V)��ɍ
Rg�Eu�7b�Q4�81�`t/�>ɂ��4Iw�A�.ѽ>��@��:vx�6
���T�Ux�P���L�%���\󡰙�:���A!0*���Sy��g	M�b*4�j������W"!>XA�CE�kR67�#�5Ό����J��
��̸X�/���g�(e��ȿ��,x0��@�&�uR�e��3�9�_V:�P(A\���dR��S���P%�X|#��������@%���VL���+TĚ�/C3��%�޹�Y�$�Q�V����Ҡ��m-�!E��2ʩ�a�G��Ӓ�,��oeP\�H5��d�/��.8�&��3�j��28�ۮ{	勹�6�h���� 1IU�	V����0��뫇3�	O[���,���Z[ܴ}���H�q�
r�gD�S��,���Q%��!�8�w]����@F�j5���ڋH�L�.wҾ1���B��l�ǫ���V*��/�
�g�zGJ���.w���09�mF�)
,�*틁���(�7�j�vs��c5��Й�U����_G"��,Ŋ�e�n4�t��{Mw�٥�i���d��̮E��9���0����D�[Hd9�쫺
O�H?~�K�!��o�\����;�{1��I��wz��m�8O2�c.	�ڷ�E<��u�q���ݿrMY{1��DR0��Ϝ
2�L����`�#84�`�B4�����p"&F���'��u��5�
��B�~Zg��<�0���G��qe6ٲ �5P�47���Ma�!��!9��HS�m:��Z�;�\=6t�~b�
�$�T�M&��=�i��{�HKߑ�ub�a�(��NT{�nnh[�ɶ�x�R�n4��Se�l���m��L�l�j��AO�T��%�����l���a�iry��¼+��H���"�������o��%�0�c���=�s!�o�}'��	Dk�=4�~�jnOэ��Q© 8��2�㓉�3l�;’y�������ڬ�Ҡ9u�DU�$2h�k��j��>5�7�wr)�����>��D��۷�$o���9��ӌ�%�����{�(n���$XϠr��~p��ޡ���GC!�m�����yp{��Ӽ�}fSp��B��u.ڙ�F�
��y�S�ы{��	%a�q��=Mh��$x�3������4<�HԌ����`'1��[�ϑ�zp`��R՗��0bX����Iܐ�&�l�-x�;i~�d���.q{"Lg�x�31���ܜĒ���b����������;�vjپ�!âx�31��T���J�ֆLJ�ָMhw�I�Sձl�x�31���ļv��V,&��v����;aZZ���&`^���9�޳���޷*f�O�Y�{x�Y���T�H���'x������N�K�5]�ۥ²�L�*:�Z����b��Jx��`��|�VV��ʂ���J�?��1m~���>����fq���
�
���x�3�������F-���^pA����R�*Z��zpR���^�qX�^}���G�ģ|&��x�;i>�x���杂�L�mE�1n��ge���x�31���ܜĒ���b�R����.��p���^��!��x�31��T��W��7�P��3�q]h�h�'ɿ�x�31���ļu�O�'��������T���Ux����$2x�z#�{ߪ�u?]g���g�3�bB���x���2�eB���dL�E����ߢՓ�<� �qj3#����K�2x����j�0�q�@㴃`oK7��fI��(����`(��j��&��)24��C��A/�+Z��a�]v���7�d�v�̆M����$}�l߾�5V�l�Tkk���ɔ�ECФs�������z
	��M��a
��w���
O=�Q�u�'�a�E�(���b�9^Z��	��1����FPT�yR�F��	v!]�z�oՅ���%�;:+��;�,!�	��;$���
g������ʇx��G�ZP�-=�X�~Oy��^o9X�<��u���М{Q���9V3�H����������z��y��=��ft�[��[f}����6k��A�r�~���ñ��9S��9Y,?n[|��.~�JҘ���W`�Wq����^Ya7�
nV/4���R�Jv]��F�&~�&=rf�.:����n����/,�~��eQi�=s��n<S�φ�.E㴱��
�
c��^�u�u�d��ٙY����:�K�VI��O���Q�x�9���d���o6i�/�x�;n��t�dnF��g�&�d�������ZZ\ ZAK!/17U!?M!��$5�83?*�w(K,R(.)��K�
�ON`R@7����dc���Ќq��IUHNL�HŦ?��(�I���Ll����\hƤ��%��(�%攦�6L嗤&���(�@�+�*`1�7 +9����-�ۃ�̲�@s6�bcb�W�����b];$��R�\af��g���@�54!�@�

k���N4��RZR+�`.Ʀ
�ͳ��7��K� )f
U�������
W���_ZRPZ����XP$SKu�ݧi��G�� �����9`�6�KG1NN7��R�b�[q��<�ܓ%�&�KdM~+a<YYDb���܅��t$R2S���B�|����Kx�;�t�i���+|d#�"�YL0lT
y b7�g��1F.'�$x�.s��
�tv<9�jF��(%3��y��)�o�}5�W�Ӓ�Z�k!����ex�}VM�Eծ@d�R$@HQqZb���8YJ��B |I@(���L{ܸ�{��c�{�_��@B�G�	'n�H���zC�%K�r���W��������lK�0�m�),ml�h�_�kk-`�Ah-���Z�LEa!����R����S�EY+����4ɲ�7Tʹhu���3�ҭ�#gm��o�:|�ޓ ���.~~��#9�w����>˶w�^?�w1;�~�ewu�� ��ԛ�8��I��2[宖шb)*��A��ܴw�+-s*l]SN��Qw���,#|~L�<��WA�����t%*'L8���5�m�zg�dr����]�5�EG&�w���T�1f�=\(Ok�2�rg6,b�G��l�h՗�R��^;��d]��������;��{"]H��'�]��91sk��6� �9x$ftB��_AN��
=nU�����@���
��jL��S�|V��$!���$��BHd!��m&c�gRߐ5�=##j�)�u
3�����k�?�^E�2l��(�^��ip�%����x������p���g��H���b
�����Va�Ԏ!�3{g{��ږ����y>O�ĥ�q�L���v��#�\Q�h�~
��(ga�t�6���V>�):�X�є�JoE�$k�<C��j��d���%uy����%�ON�MD_�I�l�N� ��!���0U˞/ʅX��lz�DY�����]3z}�W@~�r?,�����}������'�Gb�lP'[u6��hG�h�(�v�����:��vo���|}$|<�[]�8���Fj�������m���]g����g�<?�A&wX���q�78T?��Mq��VaM`
e_�9�
4K�;��D�G�Ϫ*�,�Vsbh���Ƴ�Ks٭�F���J(��1[�Z������%���@6��p��`�h?�Mj��,頲8���U�+��t&�a�*�n��t1�mk�޼�҅
s>����;}�rx�Jd;sB#��}���-�}b������n�=8x�[��&���]�Kʤ�#㖿�{�ʧ��ƈ}I�^�hD_CtO�G�����w�X:k��x>UT>�j�lS�M�r�\x�G}�>�
��ѝ��7Q{c��u�	���RӺ*��Eĉ�׃��	�0"���{Ns-�4�q����c�S�õ������!�af��=x��i��`�?���'Ks�0rnN�`a������9ِ[b�W	�޼��&/mHc�x�31���ܜĒ���b�N.�O�'^�jL��y�!�$�Y�Y��x�31��T�;>�f�S�O\����!�����g��O�x�31���ļ��9o�x�������ʼ-J�&`^���9�޳���޷*f�O�Y�{x�Y���� ���7x�����"ݸ�������ŋ�@��g��#x�;�t�i������b�FL7+�>nf�εs�e��}�
0�+x�;�t�i��H�Ã�XΖE�K��,pYsD��[�x�31���ܜĒ���b��g���ZrFw���ο����΢x�31��T����wvr�gֽ2!u�}�ݳw�	\�x�31���ļ�C��?�.j=w��@���ݳ�N3������Id�Fv��U1�~�κ��{�g�'�p���%x���2�eB����	�%ԓe'�}+כ�Ɣ�V�qj3#����Mx��o�o���q2'��fCF]��������(�$5�$5EA��� U�VA]ݚkr8���5��9YNpl���t����tx�����:���j�vy��ڐy��н�����x�31���ܜĒ���b���6�X{b�ǖLіX�td���
)�x�31��T��;���{���g�iֵLW���|;�x�31���ļ�e5���;�����{-c��}v��Ux����$2x�z#�{ߪ�u?]g���g�3��h��ox������~��������cY�����D�ݱ�����'x�;ny�x�V&Euuk.. ((�/IM.IMQPIIMK,�))V�UPW���,�T�yk���dd��!��K-Wp�(I�+���JM�,.I-r��khZs�i-�,H�M,�D3.��%�B-9��h~16m�0�ͳ��k{/H/��x�;�t�i���ۢ�5�f�j�s�r��?��pF�x�31���ܜĒ���b����{m0HH���W5늅mz�U	3O�x�31��T��’]�*$��Fx77�j&f���(�x�31���ļ��=:Bo�L^��sa���97cM�*���ss�g��ݽoU̺�����޳���	�����|x�������rŴ�
��;�խ��5C|��J�W���x�;�t�i��������7WK��x�`�2�t�Eq��x�31���ܜĒ���b���[�������E(��S,����x�31��Tˏ�o�t�2�0�a_���>o;�o'�x�31���ļ��S>Ԥ.��M�����?��֚�Ux����$2x�z#�{ߪ�u?]g���g�3���f��xx���r�yB��O>�����9*�6�]�v�}ʡ���)e��.x�;ny�rC
��j�@����7s�k�l����2�G��d�
�w��)x�������Ζ���������]D�������"���x�}VߋE���$T)��,�=��%F�/ШH�7�3=��tO�{v�y�_ؿC�)��'>�� �U���^L\8�����ꫯ�緷�������mG�0�m�),ml�r�/鞵�0� �AYC�W����^R�d)MPB�9�l���d|�e�G*e%:��傼t+��Y�ÿ_��8H���__~zx$G�֕��l{��̓;狣��Qv[��YI����"�<iw�_d���2ZQ��Z�yP�;7\+�eN�ma��y,���r�e��ω�瞢 }�*H:Y�F��D�	'�:�_k
x��ޟ=�=Q�3N��O[ݡ#������'1f��_*Ok�2�r6,c/G��|�h�7�V��^;���e}�������;��{"]H��'�]��9�sk��.� �
<3��Pg��sڔ'	x�%A�]�RZG�B�h�R�ܜ����m�2#m�8z��X�ϣ�A7��:��^��k<��$tf!<�(��?�b)�(����\	Ww�S,�ރ��\�>�9��h���츱e��1q�/�q�L�:k�!�,� ��S#�S��h��r�UN7n�N\l��њ���UMIj�nlq�Fɂ0�I��HF�
蒺��@Z-P�''�&����I�l�N� �����Z��cό��R�Ry�
{�,y����]3y��@���l�H��d���>C{QuM��Gb�,@'[�l��dG�d�(�t!����:��5/��'|�|$|:��.y�J}+Um�ۡ5��]�T��̞���s���+n�;�Ww[u�
5�/"f3D��QXXC�׀rC�|�L���
(1��ЊgU�y�a)91���b�Y��J�k�t�$�JǽR�>f�[�6W6�D��f�z���qS�Z�9KF:�,Ρ�gA�F�#��a�����<�DLx�F��֛ᾅ9c�{7�-�>M9<�$��9�	wb��<�.���skר߽��ugۃ�w�36^� �а*yI���bd\���^6�4��/�w�kFM�;����h���]��������QE�㥄�6>$.6��*U�s��>��[��V�BL��_C�E��mf��}Km��$�B'�2�r�y��)�n�s�����ǭ��{���a�K�ӕ������K�I
I��Jx�;�t�i���.)�'/�Vx5|���0�%Yw
��j�x�31���ܜĒ���b�5R{�z|�Rj�'�xy�A �w�x�31��T�/>z�o�N�t��5�d6��֑g�x�31���ļ�o�kX*'m=s�8� �����~��Ux����$2x�z#�{ߪ�u?]g���g�3���j��lx���r�yB��q�M	[��:5�5􌶱*�m�x΋�}�l�tx�;`��l����<$����'x�3������Ζ���������]D����z��Mg�	�M�[|�[f��J�x�31���ܜĒ���b'��2���~�	LV��n}{W�
��x�31��T�㢽�6�o�M|��^�<ݦ����x�31���ļ��S;5���$i��-��īn&`^���9�޳���޷*f�O�Y�{x�Y���q�^��x���r�yB����37.��d��rVjm�a��s^��>
���x�]�MJ�pġ[�ђJ�&�W���Jĕ#��.�&O��+6P<�P�@׮�l]x���C.Ċ�������0/�|�� �D���"�E�7��Fh�$��H�ս��U��Y���j5m�5~�[ƪ
�1��)���ay�X�2D�Gx1�0�0M��&ِ`�CZ_����V�ߕn�rx�V����`EUZ���i�W�hg|���\�Om�G?6�����GM�;�s~�m�x�y���I(����.x"1	��4F�,��
H��3��j���x��lq�l����%7?e~Ĵ�0���Eb��y���+�S+�S+2�K�5TJ22�u�J*Ru��Ԋ�Ԃ���b��57�
YqL~��ϝZQ����X���y�T$#�P(��x�;�t�i���	��҇����w��q~-��
ڦx�31���ܜĒ���b����iD[�m»���͎�{S�%:�x�31��T�B���|������o��q�֐�x�31���ļ��_��?n9��&Ț����١D�
���ܜD�Yodw�[���=���fzr����x��������� �:��2�-��$G��i�%��J����x�|����*100644 .gitattributes<���S�a�/f����1)�������x�30q��ZK��m�y��\2but�/C�U9'o�u
{40000 src�ͺ@�̴��6��3q{�lJ�P�T5���x�;�t�i������Ѿu��mm�WǺ��fb
I�y�k/}�޺i~h����i��>񞝑�	3	^��\�{�9��Fά�Q�U\��Pc���r�nc�ّ̆j��T\Tx�03�x�31���ܜĒ���b��Ѭ�/��nZS��x�N�WS�i�Rj�x�31��T�F��b�R�++�;�z��1�)�Ca�x�31���ļw��/%�|;�����O�K&`^���9�޳���޷*f�O�Y�{x�Y�����4��_x������k�����u��ó
K��c�`��J
(h�'�ax��R�KAewI��4n��Dz�KMr��hK��Ah�^DJ�f�m�n���H�<=���@�r�E��c=�Pz��cgM+6=��a������υ����S�]�Ta�7~��=�&�!��):�/!�4~L�
>�
J�{lъ��WZ��.Z��vȶYOgת\fNK���3��0
K:s83��]�u�_���B�d�l��X�$�ӞD5��X���1"��]Vc�nD~��w+��J�W\RwB,v�yD���Fհq>��I:&�3c$D X
�������`��3�����C&�S��A2���/*�I2	E�!���\u�&mv,�+:��*����zʼ��A��G��٧5y^wڛV[�ǻ�m�Pz2r�0ϑ�W���̏���o��ռU���B�5yX\��.헻wɘź����!ޘ70�{���޳��*�Bx�m��kA�I@�C~�[�ت<K ��&X�j�%R��)�c�m:��]gf�����CDЃg�����?����[�
f�U����;�yo~�~�޿,���|�O�*p���c�_o�9���|蜦=;�:g�s��O^�?����R��������Ff!�����0�TvQ�D�PH
��Fmˑa�W����k�R��!���^�����Ez�r�1]��p��"�|e�K}kĨ���cPjK�ڬ��;ۜR+�(��L�x������}ڮ��qbw��=�`L�څL�(dw��
3�MO�Xy>}��*3S�4ңJH�jo�K�A��Wl�k�	f��m�0�Fi��|�ph[�޶�b���n���^�f��f3Q���>��H�=��rg����C��SD|�^�Ľx���w=���.��=���Ʃz�ѫ����ʾ���~x�|����*100644 .gitattributes<���S�a�/f����1)���2�Ζ���������]D��40000 bin+�����;��U��'�最^ב�\hSC_KI,��M|x[��@�=b9E�x�31���ܜĒ���b�?�~�X�ᚠ�%�}pغ�k�x�31��T�W�V�WK�8�.�ҝ}����+�6�m�x�31���ļ�}ک��7���O�ԧ�E'�_���+??7'��{���VŬ��:�~�=럙�I����gx���|�yB���e�/��M牬z;�0ر܅k�T/F�&
����[x�|����*100644 .gitattributes<���S�a�/f����1)���2��.��:��Ɂ���)�*40000 bin+�����;��U��'�最^ב�\wweT��D� �[$-U�
m�c6��~��x�}U]�#Ee�I���r�eä��S@�U���AWqX4]�Tw�TW�VU'�yi�/�w�<��?�I��	���:��8k`��s?�=��[�������qG禥�kR������6��TZ��ĘZq���Jq/���I]�_'��b.��\�	�|^K��x��1�ц���!��bFNؕ�d��t����ǯ�]x�r;v��˿�ΰ}x��{ƶ�o�]��u"�Hya5�ڜı�'���5Zio���b�+q�A�>nһ�R��
S�\�3:��u�(1a��1�sgyἓ^�xaj1^��r���5�_c4x�V�f٥ln95��6��D��{���f�e�ɺ��h-��ݙ���;ݝr�F�����t0��~윝_�-�Or�s�$t�M���3%2�ؕ�.�lm����i=@n���ry� �4dW5'��`n�ӂ{�	���U�B��OI�Z@ƦN1AYb&��o�ؾ����A(B7� S��C�*@�9�9��;|D���yz������In1�m�H���;��w��ꂶ�E�8�E�P�~m��#��o��Zz���p�c��`I4ռi {�\ݐ� ��>����a���hMՃ)�(����I�Y2��r��n˝[�W��F%�u�%�F���h��6��(�_%���=|>��Ӱ���r �g���0��I��c�bLؤ�u�$S�XCҸTV����ǿ4
�{��ô�P 49�h�A�Gp�\�0�8	*Ś������W\��*T�����������~����7K@
�Q�@as�@��LGQ�6��H�/ń2��
�TS�"QΦ�Y�M�8���j�g�a�<M���hw����Ƌ!�{�J<)1��gƬѿE�p�GG��e�=E�c��a�tZ�X/�u�xD��2��\z`�	|r�+#FC�7�v<�FV���{[���TA�!+�\���.�꥛�Y����G�b�5zy����v�zc��M <5Դ�J�.x�D�Iv'�4>]�ѨP��QtϩT�J�O$>NA���pҷ�_����/D��x�31���ܜĒ���b���ҩ�ʖ�?�ZL��3��u�h
�x�31��T͝�z�ͳ\>��#��l�1�~3�x�31���ļ��S+�����������ҏ�L�*���ss�g��ݽoU̺�����޳���	�q��nx�������[�T o��ǪϢ�a�b��J�I2��Ux�*��'�����������
��~��nD�$�9
&�M��-l��)x�3�����R�<z��{,��\+!�m󷤸��ze��PIn�"`I_��gh�!�^�Hl�_x�{��GwC/��|�&Z��x�31���ܜĒ���b�G![B'���K]����6I�1a�x�31��T5{���ϔ�V�ϊ�J���2Y����x�31���ļ�`�]��\�9���a��{�G=�
���ܜD�Yodw�[���=���fzgc���ex���|�yB�cĻ��"s70���j�N��?a�T/F�>
��
�cx��o�۰�m��2�ʂT[��Ĝ�T�Ʌ�R������
�v
 VA~^j^����zn~
T�*�I��C�
rJ�3�b�p�����t�œ�$� �U�XT��i�ť*%�źv�%�y�
��'w�hm��s�	��3xl�x�k��/�a#��Ml~#����Ox������ѡ�ɂ�ޣ�B�&$��;����[���:x�ۣ;]w�F������y.o��[ƸY�&;��
l��#x�;�t�i�����nP=�!�|�Q7ɧi�|ѵ���r/��kx�{��N{�/WjEIj^qf~^��H���x�L��[��9ُ�~� _���hv�p��ex������Õ"R�b3hÐ�+����K~�����
��fx�[�=[{����g�B^~^�Bf�BQjr~z^fUj�BIFj����zr~nP6�D]K��<3'G!)U��85Eor"�	����d^��Wyo�|�,��x�������_�O��/j��N�܍���ר|��[x�{��T{�/WjEIj^qf~^��H���x�X�)x�)���*d+�&��eV��(�d��)hi�'��e�JԵ���3sr�RJ�S'��3g�ן��Wg2?�Z"�B.-�����[;u �4',X��,�)M���d&A���ĢJ��l�������T���1�L5B7��x�3�����G�^Th�Sg�(?)��L��z̶r��`d��}ͨ�64�l7}A���px�[��P{�/�zr~nA~^j^���@�k�5�x�31���ܜĒ���b���I�R��k�g��*p�Ѷ0~���
��x�31��T��ŏ+Kg�
�e[�[Y��͔3nk�4�x�31���ļ��5��T=g7�hZ�[�$�ZlVᕟ�����=���}�b�t�u������LOxB��]x���|�yB�c��S��eߙ{oFX\�����S�����6x�;�t�i�����B���+=�
�~#i��Ur��'%�x�31���ܜĒ���b�����]_x]O\��d���qڢx�31��T��g�u�n/�:����G��j�O�)�x�31���ļ���~����)Q9���Ƭ������+??7'��{���VŬ��:�~�=럙�x��zx���|�yB�����oc�N��q-JIO��Ʃ^���
hl�rx�k�{%���s��V!n���Gx�3�����}�lD'ЋEF�!��ve����z�`�$?���pG
$!*;/�m���x�31���ܜĒ���b�F��Q�-#�M��T59i�z���O��x�31��T�������+�!%-���ƬpGu�D��x�31���ļ��ik�/�n�WiЈ��e��L�*���ss�g��ݽoU̺�����޳���	bY��$x���|�yB�O�+� ��:���_Y� }��Ʃ^����*x�{%�"�a��ml��/�)M�Ȧ3Y�]}�
���v��[9&ofי|��e�}v����9���(���(o�\�P�dYN��38�Z&�0�ʓ'/�j7�%��Zk���h�m��p�9 �R2�=�J=�����_���`��XT�X�����[����W�������R��
b䔦g�Y��ى�`��̤�ĢJuMk.��i*%��
jj
�y�S�":p�457o�b]'U��x�;�t�i���%��)�N���O�v\�e��	Q�x�31���ܜĒ���b��U�k���I�m�5+����v��o�x�31��T�,U�J/+���y��ȱ&���!�x�31���ļ�)w�
x$O��{n�|޿(�@j�	X�W~~nN"���7�����Y��u��{�?3=b�Z��x���|�yB�ȣ+��\��S�}FA�0K�ƍS��hz��jx�]��JBQ���{��v!H��R�ZjBP!Xsa=W]﹜s��,�b��	��
=D�hѪEo�F%4����}s��-*%���/$�7�g<\h\��=��K���2O���F�Z-�2�U�.W�N�u����@`�y�o�j��6S�r��@HhqɚZ�Azv�=���&�������,�EԶ#$��N�����si���O�?wCEN1f��M��7M�,@.Ǖ�Jh��'���/�0ŀ�&A|��e���5��a��&s$�̈́�=G�'ޛ1��FC3�i�Bp��1���y+=ľ5A��ͬͤ2�w$���\☬�+����PS�����2x�7������a��c�o?��.�=�_v���Xsrc��O�R��HWd���O9�?}�g�x�31��̜�b�m�L�*;�������M3�����*d����$2���y�g~}�/����v^��ѓ��f�x�31���ܜĒ���b���/V��nֵ`���k��
�x�31��T�;&�-�]�߾��[�d�wP��_�x�31���ļ�S+������d{x�;��i+8ږ��Ux����$2x�z#�{ߪ�u?]g���g�3���f���Lx��bY�<a����"k2��69|�mZ߱��V{���n�G�
���5x�3�����*�Vf-YCS�%^t�@vw��\��O�R��HWd���O9�?}�7���x�31��̜�b�������6i�b��;>�k

�MM���ss�w��3�>�G�T�c;�b���mc���wx�[�x�q�-C3����������4�E7�����Y*��<u«�q��u���Ox�;�t�i����YI���Y��ͽr:s�k�Y�3
5�x�31���ܜĒ���b����re�������K^��9�x�31��T��3'o�q�JJ�|67�+��w
��x�31���ļ���?�LJ�Ց
���B�߃��	X�W~~nN"���7�����Y��u��{�?3=�|���x�"�������;c�������^��(��4���F�5=�|��`x��T�oE���n+LSl�F�����6޵�C>��֕B�$r�!R�d���G]ϸ;�8�r����pC�?�+�R	!f�v�4��ȇ��y���fޯ�駱ok��w�$"Ύ�,�|�U|>������\Y��������-�G�
̀a���@,
���,�(B(?����[��Ib.�|�
�)k���k�>��N%�<��E��=�:���>�ow�N�q轢�^d(�C���L�P��=���=�jT
_RMH��jVq��:
�6z��l�`)�nj#UM�8@�ۈq�J�K���v��QK��vꎶA۲ĨQ��^7�$��I�u[3��/v�P�!��]L��0ٍTx�iG�kKA�i"pH]V��
d�is�cJfa���z��b�]<R�I诃��@�6��o^��u����]C��J�0�C�u�&[@�ghVK�3]+���.�/en�}��#G�K����7�<��tx�.{��V`�gZadVN�g�̝`�Na�ҭ�*��
�G��q�4|��?��w3�"['���QCn��~�V��W�~e�r��V��<��2Ӌg�|E�� �� �%�?)-|��i��ZW?�:���|$��EF��M��L�U�H�=U�G��(�>@�ʑ����7ġa���9�+�tBU ��w�����!��&,,��E��y(c[r����0i��U�WZ��:�<}�muF%�!rv��<31,*��������=0�l�B�r�0#חo���pjC*0�^%~�f�_z*�m�M��-&��i�A/�5(�<n��xÊ�S#�p���Ǘ�p�ਲ਼j���n���Ru���Z]�/������a�]�t:����}P�S$g�/V��de�!��"&��y;�?�rFy&j��s�t���v���˃�zS�p��ǒ��`���5x�[�x��qC7wJfqbRN�nqq�䇼“/phN��).�W�QH�/R(��,V(�,I�,�g�9�GU�Qq���0/�ꚛ�'�#� 
��bx�;�t�i��ȋ��GV�N(�#�µ����Y�
0�x�31���ܜĒ���b��=1��n�-}M�C�FC�ᅻ	�x�31��T�3�s����;͹G�a����|̿ӣx�31���ļ���t��
6���uZ��v&`^���9�޳���޷*f�O�Y�{x�Y���F�����,x�"�������;
��Q>Q��4��̤��~�F�z+��bx�;�t�i��H���ur�O.X�:{�)�K�\O��
��x�31���ܜĒ���b��^�g���������En�Ӧ�
f��x�31��T��o�=�3����C�/L�qg�x�31���ļ�����[s{o~(�_��kƠp哢	X�W~~nN"���7�����Y��u��{�?3=�w����-x�"�������;��ms#�8�Q��vE�1�邏F�S:��x�[�8��q��ɬ�r��
لEj��x�����:�����"�-Đ$xe��l-���
0�x�31���ܜĒ���b�ml��_>#f��7L.�k��[�
���x�31��Tɨ���Y���^���K�	e�'
*�x�31���ļ�E	mֹѶV��>�}��Qx��P/�
���ܜD�Yodw�[���=���fz])���Mx�"�������;�H>,�Р"o�G��.����F�r��4x�[����q�"}Ǣ���Լ��+��?�Ƃ0��zqq�nvj�����Y'�!���Nf՗�,m�&�����Qx�;�t�i��ȟ�S
�[�=�r��>�����E�x�31���ܜĒ���b�l��_�+Np�N��]�p��O��Q�x�31��T��|������ڟ�w�Bé[�ɒ
��x�31���ļ��GY��xL�lp�>���΄&`^���9�޳���޷*f�O�Y�{x�Y�����D��Vx�7����t��b��@��捀�Ax��j�8�(g��.�`��,�� }Ʃp<v���w��wx��TAoE���:.C���󺵻���`qHb#�u�@�D�9D��lֳ�Q�;��8���^9�FBB�#Ti����Pz�TB����:�j:�a���}y�7��'���s����$
�(��W���zcym���cSn��ll��KB`�@1C`l"�B�ӀYV���=���ęX%�~b1N���c4�����>�m�#�	��5�A��]�؂��>R�W��9E�m;z�(�)
�PhI��]�;�d�ej�xO¿��TgU���jAr� t=�x���i�b!�ǔ�@uM�8D�:�2�x'K�w�LT?��^O��+5�m��h1����|�?
Ϧ���"!�ii�"���<�����dС8�U*\�+�u���n!����
�]����l�I�K8pI�n�p�TT���!ə��:P_���������e@�6��qj��	�P1����Vh�9�ky����J�kh9�0�cti�����-G�h:܇V���Б`��Z~쩬�υ
��]Ķ�;�aD/TdkDl�]a��'E���ԍ���z;}�*눰kԐ��o�k�F
nU�Սl��6���]>����$�gDyI�OJ���|��5��N{n,�d�����*pK�-Sh�OSzd����1(G�u�rE	���>z�?0,���ȿ6r|͘M��iVz�?����uӄr�����)a[�n�̿�Kg�֦����	�Da��\ߙNLT��2cчbFv�������P#;Pc��plC�f��_2��n͂zq�#�Y"�rH�j����s�21x_K���ÙH����Jm���^[�ſ|�����aM\�v�br��Ǔ��S�}�TO���]��?�2����7�����H��{O�U$��5L�D��X<���fI���7x�����:���5���g�u����h�����x�31���ܜĒ���b����W�~h{���}��
�E�_U�x�31��T��^�1SkX{��~�����	�m
��x�31���ļ�D-���坞bm3ϔ�t�Ȼ���+??7'��{���VŬ��:�~�=럙�/�9��7x�����y��"�+�Z/<WN�����������x���x��qC�fQ�b�z}}�+��T��Ҝ�����̔T��<�����<��|�ԼĤ�T���b����-�HU��ON+�O��Ю�Ԣ�̴L��T��̜T�b�
)`��E% �r2�KR��&���W�UP�O-I�O,HL�H5�/N-*K-�K.*Q�F1\��8'>;�R��6-`kmLL���Pd3�4&w��N^` ��3~r�����������&�M6��|��CLj���4x�;�t�i���!�Nێu�-o�{Ւf��~��zަx�31���ܜĒ���b��'�;"�l�{�-l�\�s�������x�31��T���ۧ�j(�УsƊ<�;��=�x�31���ļ��z�<��ۺfyk��y&`^���9�޳���޷*f�O�Y�{x�Y���v����
x��ϼ�yB�ƥj�"zޭ��ñ��B��6eԁ
����~x�|����*100644 .gitattributes<���S�a�/f����1)�������x�30q��ZK��m�y��\2but�/C�U9'o�u
{40000 src�,�<=�����;�&b�̷��4C�x�31���ܜĒ���b��o�]����巒J�”���@��x�31��TW���n����{�6�\�U]���A
�x�31���ļ���}L��qZ���֓lw�<9�gVᕟ�����=���}�b�t�u������LO�����0x�|����*100644 .gitattributes<���S�a�/f����1)���}�lD'ЋEF�!��ve����\2but�/C�U9'o�u
{40000 src�ͺ@�̴��6��3q{�lJ�P{!54���<x�^����*100644 .gitattributes<���S�a�/f����1)���}�lD'ЋEF�!��ve����z�ͺ@�̴��6��3q{�lJ�P]�,m���*x�^����*100644 .gitattributes<���S�a�/f����1)���}�lD'ЋEF�!��ve����z^f�c
z{����?�R
�:�(��x�31���ܜĒ���b��'�g��^�6Wj���E�t'	9�x�31��T��LӲ�b��9�>���a{ă`�x�31���ļ���N�[<ɞ�y3ά�Q����+??7'��{���VŬ��:�~�=럙���]���x�[Ǽ�yB�H��n���n�ث�յW�b�c�q�#�v���kx�G����*100644 .gitattributes<���S�a�/f����1)������ؕ׆�	�'��O�����hWx�;Ǵ�i��
#
�w���Tx�[´�i����Ƌ����)���x�n	�3���
Z�x�31���ܜĒ���b�3bګ�(T�KfT+�n��]���
ۢx�31��T���!m��b~�WF�<ؘv�x�f�(�x�31���ļ���v翊�L���{X����v_�
���ܜD����/�8tD�ܒ��b�8�x�340031Qp�(I�+�����+.I���+�(`�#8C�X�����k^�mzة2�!v�n�9�`=}��}L^p�{X2�չc����z�+ss2���gp[��t��^ݯ��z×���̒TǤ⒢���٦�a:o^�u�xV����	��Hj��RK ��`�s�f�
���n]��c�^{��<�J�ԜT�J�H�b-��k\�>LY��u7�ʐ���<H`\5�2'j�Hżb��=�6���)D��I��{o��h�lp���vo51�*�-�N�����R��/x���UeP��R�@�S6����~�W��avL
�d�4n�'�����Kx�4����P�c�_,���\k�r�#涿ݙ�d6�"ݸ�������ŋ�@�����Y��x�uT;oI���w�H|<l鬲5bg�vG���u���u�����=S���QwƁ��“�� B~�_F�O $�tW=�ه�lwW�W_}U����y���ia�a��<��H��Zr���~��h�X���n6Cδ��
�I�/�a��e�r������m�ie���Y�nl�RyC�—,�&�b��9�F���Hub�4�g0W�ޥǻE�aR
FN1jX
�����t�_��nM�v��D^��0A�J�#��L���}���o����K_'�/��g�C(�J
+�y2C�g�L���)2��W�Ą�x\��E��L�%��AR0EDŽ��U����Q&蟍K�4�(@#Sa�NQ�ܠҳ��  5&�KF}ŽB��J�c<�2	���t:	���1SD��p/��W��`C������O�����c�G�ʬ�&��
%�I�R���q6�~\^�:m��U]��.��Vx$_!�Čk�Q�}Y~�ǎ�_Gu�M8�����I����¹O���p�&�E��h�
�i�L�g]؅��,�.�M
1���t�s7$���5�oT?㷹S��m�m�~���Q�B��qƙ�WZ��?.:�}Ѿ���'��
�Uf��^&b9t�B�7�lA�`����HlUJ��M{���v�N�Z�+���
��_R��[�Ώ*L�=xb�v<WT�0�.��HRCuXT(�&U��8����&I��<}�a��,�>�e�����`O��
T�:8)��
��8��D=����]�ͧx�340031Qp,(��LN,����+�(`��e=��U������p�>q���)?����(�� ��6�>�6Kgf��7���&a=��#}�4��dx�mR�n�@P�g�A
ʏ�$D���OA�
E�*$p`m��rv��I(�ʅ��(\��4�'��c>�����|3����Γ�2/[��=��#�a<z���z��F�E!0�I!S�ʔ��2Vj��`��5���.���p~Za���}L�u��'p�pi�.].�9\.�+
��(˽g�2i(u�^�T�.��
g��EY���@�H�r2p�\�/OObX-������`��B
q<��>�!2MVu\#�]"#�af�'�	Fc�j
2F�A7j��ǽ[���߁JW�6\�KaĜ�����4�s�����ݝ���훫?��9��z�K+�B�Q���F/9k�1���,�hsm8tiR�c.�Z4��*���8DƱbr[��R/�/�3�i�-u{,��\�{�|(�
rI<Lj�P.�_��`�y�5ۻ ����^�5�͡;�fUW�R��i�.�X|3�AM�6D������R���ܰ�)rU6���p敓s:j�4R�Y�s�
���Nv��W�z�+��jm]��X(���Jx�[´�i������
˴.��~J�V�|��t�H��x�31���ܜĒ���b����J��?���su��u��]��x�31��T�Slo{�&[q�~�s�o�����&�x�31���ļ���v翊�L���{X����v_�
���ܜD�Iՙ�Z��~�`̰���J���cP��x�340031Qp,(��LN,����+�(`���X�%A<�>zm���7���r���)?����(�� ��6�>�6Kgf��7���&a=�s$��%��5x�mP]kA�B���P4%l�i(��Q�V(�c}���;8�ff�����B~J���?��MV�wf�{ι�ͯb��-m+�/��5|�}�����v?�oR)��*S2Dž�I{JpK�K�1FO�7�F��=�kŒ����>�+ �C�!�"�%��J�?#�"pO)���v��Q!��K@s˷�|���gֲ�@�H8Jr���!�\�WUT��Vbdn
�'Ҍ�G�++��x���+��0�Mm�A��‰)_3�)�<�SsK�����������[Fy��P�z5�{]��g��0AIM0�z�$�O1O�}MTx;s$���C�p8�bkO�a�����U/���xt�O�J9���l̯�c�I�3^���{�����z+�����������+x�K�����d�?�w���!Q�<)�.^o�x4i�b胘0���H:��� �,��z�Lo�2�!�)
S��w6Z!�P�
 =���px�������
��Ȝ[[�K&��o-ב���El��"x����Eq�?�����(4����7x�����i�b胘0���H:��� �,���ո?���:x�[´�i��H
�ĝ�=�ҿ�Vg<��t��R%�ئx�31���ܜĒ���b�b��.ׅ�>�N5H��h�
Z�x�31��T=�{j�z>�����2���v�͝��x�31���ļ���J搷}�vz̷<��	X�W~~nN"C��'����/�1Ɲ���Q-�����$x���tQiC�d]fC>k..(�LӘ��ÞYO_k23��FZfNj�Bf�BrbrF�BFbY�BRj*����X���g�����o�9��/;�
����Fx�3�����j$V@�U��xQZ��2Vk��ˑ�\sˬ�ױփ�p*��)/��MKY�T�x�31��̜�b�©r����μZ�zL�j�CsSS����ܜD�R�����>�|��Cڃ�B�5��9�L�
��Hx�;�v�c#�JbiI~N~b���dQF���4���̜T
����B5���f�*�e��jRs�S!�0�xϠ�x=u}==�,�(�X�ق1��5$?;5o�"����L���2OVc2�X܀�N��h1Y�Y	�%0����bx���1N�0@庴RY"@2�H��ߎ������ߨR�T���<p�.9�lL���	����u���`j��,��Z%�S:�i�t���R�e���C(��Pqi�3�{Dn�,�W�pY�w��+z/w����~�>��<��v�bC��}�@�Y�N#�����\��n�]�v7鯞um�i�������v�]:a?�kz�ߏIY!�90>�@W�����-YӦx�31���ܜĒ���b�\���9E�Ǫ�Q�=𐨩�:��
��x�31��T���\��060�����
�	̣x�31���ļ�	�u+��j��/���q��"��L�*���ss�w<�0�[u�u~��ݍ1���v�<��x�[Ǽ�y�,F��u+�w8u�	�fNf���{��1��ߣx�31��̜�b�©r����μZ�zL�j�CsSS����ܜD��m}O�1ͶQi��o�_3�R?�	��^x�;��ͱ���[%��$?'?1E�v�(�JXf�Ffq|ZfN�\JSS��K�RK3�R�2�\�
�9ũy�t|��gP|�����M�g�b��l���8�6��L��՘��l7�]��3ZLVfVı-��x�31���ܜĒ���b��o�6UpmX׶�� '|�{�m���x�31��T�y���J4/ү�K�"��l�tʥ
8�x�31���ļ��]Kk�V<�wV՝�����	X�W~~nN"C��'����/�1Ɲ���Q/�_�	��x�;���<�|"���[fN�^AFC��|S��G��Lvu�?魡������kEIj^qf~^penNf^6X}��n���n�ث�յW�b�c2���ν�
6D~^�u�C�uz�m��Ps�3KR]RsRK 6�G:k)�$�\�*�X�aʊ���'�.t>h���6x�[´�iB�Ȯ/e��Ϗ&�0��9l��6�~�>�+X���Vx�u��J�@��(�y��e���l���Rp!�mr��Nf��M�vӇ�sB7��k�@pZ�C�s��y>y?}�{s��
�h@�BP�-Lm� w�K�����=����h�2pI� u��a��ǐ`V)�@�}I!���Q���&4O�%�Z��vԧ�����:�X<��/�}1�L΄�-���
mM����c)�����	���d�7�\iJ �U�&�p�a5�5�B@8�_5�u�g�� *mEQ��C�Q��[[
����L�D�.F�nB���
F'��z�ޕ��D�5��-���	�?rׂ\6��*6����mx�[´�iB��t���v6���J�1x�3qZ�Nh�
��Bx�5�1
�@!0{}'�>�h�!k�,l���_5��H�!g��
���f��'78����`�0z����b��Y=� �Z-�b0�������mC�BW�qVZ*��QQ���_��ȟ��3�}�J3�
�0����3�7�;��;5��Mx����/¶�G����(ݥ��=b���
r�x�31���ܜĒ���b�h���,�OMt;�;��yWDF���آx�31��T�
��R[���(Z�)9�-�z����x�31���ļ��ͷc��[[�t�b��5%�&`^���9��;�x��:�:����w�GV�T�	��Bx�;���<�|"���[fN�^AFC��4�_�إt�/��W

�LL\+JR�3��+ss2���gp[��t��^ݯ��z×��Nvv��l�!��ڭ+r��koS����Y�꒚�Z�Q=ҹXK�'��WaǂSV�|�=�v!7�?���"x�kene� ��t����63E�:�+�I�a����EF�
��:��5x�uQOkA'Z��x<�C��`vc)i��@Р�A�X���Kv�df��ml%�/���ͯ��.���f����{����7?o���I�Gݮ]xDez��,1�p�A0�n�z6�ۃ�L��1Z��@D/�|����$Ƥ�(Z,�)�@�)�9����\�3�	�/��-³�qNQi&�!N<���1�d���y�N�9'FJ��G���ژJ&A�DH�(�e�(��Tjf�:�ԑ�2��_om���f���%?Z�NJ�	�a��X_֐.i��1f
�#*~���]5jJ�b�&�!��X�����וOW��>E|m/�W7���&�M�t�aCDC��Ձ
��v��A�߿�U8���?%\��.�B�r����J�b���RoF��V{@�y�j0Ȅc�4s'��Q҅�2�ޱQ��!�j�5d3�Qٚ׵�pܫ���������O�I���%�V�lk��G��n�9��֩�+�������	tl�yx�k�#��6��G��$�����Fx�z������[T!��
�P><m�bu���L40000 bin�w�t�J�:-�/�MV*�w�100644 composer.json�q�oj�ûe�q�G�ǽe�t��3{���Ѳ��l�5N�Nx�)�05���
x����/¶�G����(ݥ��=b���
r�x�31���ܜĒ���b�:��9-.�f�.��L]p�����O�x�31��T���_�uO�d�^:����S��Q��^�x�31���ļ�
�s].i5�b�ڞGtk���M�*���ss�w<�0�[u�u~��ݍ1���{�R��Zx�����xǫ�Z������)�O�;<�‘�p�����Mx�z������[T!��
�P><m�bu���L40000 binxǫ�Z������)�O�;<��100644 composer.json�q�oj�ûe�q�G�ǽe�t��3���³I��>P�Nf�˱.��N7�x�31���ܜĒ���b�I�%/��W}>w��sk���I�x�31��T'�G���8_K��U��	=�
�x�31���ļ�z!��[?��>����:�VmVᕟ����о㉇�ߪC��}�n�qg�>xE�&���Vx�;�t�i���kEIj^qf~^penNf^�^AFC��n���n�ث�յW�b�c2���ν�
6D~^�u�C�uz�m��f&&
��%�.�9�%�`�#���x�O�qv,�0e����o�80F���x�z������[T!��
�P><m�bu���L40000 binxǫ�Z������)�O�;<��100644 composer.json�q�oj�ûe�q�G�ǽe�t��32C�
~��HY��U��zY�~�w�7����zx�[´�i��`��6*��i��m,W���i��`�x�31��̜�b�©r����μZ�zL�j�CsSS����ܜD��|���ďe"�4X'޽�y*�o��Lx�;�v�m�L�ɷ�8'�eZ3�:��x�[´�i�I���5>�C��oIG��xʥ�i�v�]w�
�j��dx����eCW-L���`x�3������b+�D{z���j�6���*��\�8��Yڮ��LBa8Mas{��K(f�Cx�3�����S��U<$��(�F�w%�^�B��\2C�
~��HY��U��zY�~�*wP�Ax�[´�iB������f�Z�Js&�ܞ\�0��q�>�U�x��R�����̢T%+�j�X��27-?�R?9?�8?$�d�g���VR�њXZ����������H�$�䕟���X���S2��(Y_�bW-x(!�kfx�kdld�`�h2���
��fx������I��6Ѵ���Z*��Cf�{�~i�x�31���ܜĒ���b�����285?y����k>\
�K8�x�31��T�WW��mr~��e{��u�!QޚM�x�31���ļ�Í��g]�Ym�sC��_D�T�
���ܜD��O<��Vr�_�{wc�;����B_����Ix��������i����4�F?}b�ɑ����l���x�;_y�rC�.�kEIj^qf~���x~w�	c���)x�[´�i��ȥw1+4��}Q�Mnϖ<�^xÜ�0�x�31��̜�b�©r����μZ�zL�j�CsSS����ܜD�{��l"M~)��^�����C��Nsl�x�31���ܜĒ���b�/l;ܜ
J���Or�;p��y9�x�31��T�-��|-��nꩯݿ,���(U�i�x�31���ļ�_�_�,�K�
&�}�ܪ�a�>->�
���ܜD��O<��Vr�_�{wc�;����S�=���fx�5��J1��	>@����&k�"��[��x���D����K��|�>��P��f�������.��CO��>��ͬ�8�63X�=̋����BX+L�`��u]�
4o�gS�sXJ9���B�ɳ3�;]6��
�8�^�����_�����B����;�m�
M��$��D>�~�	�![Z!���C�>j�J.S���U��WW'��W���$x�[´�i��ȍ͏�46ۯ�:�����k�%r�x�31���ܜĒ���b�D���RK��-/J���/j��v�>�x�31��T��-x�H�0O���a1a#3�q�x�31���ļ�[k=�듓���ʪ;����
���ܜD��O<��Vr�_�{wc�;����������Lx�H�����r>�[�
|_�=�~�����B100644 SiteDelete.php��X��j�63I�Y�������8���4��|x��Ur�rC��`Abqqy~Q���BjnAI���b��
�
��
V
�E�y%i�
��:
 Y&M��MĕS+R�5`
������c�T�c��jr+�stKT��HI�&����b]��Ģ�Ԓ��$�X��]iqjP�p���8��5��6�pb#�O���.`?�8��R�3�ԝ�\C\\C��]����-.�Ӌ$zor-�8�g\��	(m�'~���(KF�2%��!���H�2s�J4���S@}��L�>SPBCf�����؝�W*9

����l��0�	�R7�\oj��RLfs�	##7���	��\x�����!�E� ���<�(E�V!5���Rc�>1IM{uu+�₢̼�4
u�Uu����5����攀tW�&k��+M�a��RP-"%����b]�����]����"��fM�q���801r�#+ۦx�31���ܜĒ���bi��BWnw��;�z��
�3�x�31��T���%~�X5
>}� ��B��w�x�31���ļ�#j���Z����
C�?�,3������Idh����o�!���w7Ƹ3x<
��N���?x�[´�i���bɮs_O/�)J��q�[1�_/�\
��x�31���ܜĒ���b�p�?��6���6��/�[\�x�31��T��2�5vĭZ���Pz���T��x�31���ļ��RA���L��6|�f2��ᆹI&`^���9��;�x��:�:����w�Gn���hx�;�t�iB��v	��t��n_���-�m��v�$S���lx��U�hC������9����⛧��v�����`x�[´�i���t���"�w��x�fV���~��
��*x�[´�i��������-����i|2��c
��(�x�31���ܜĒ���b���_U:z����L��W��г��s�x�31��T�Ck�n���o���4�)K��{��ǣx�31���ļ�C������Zϼ�q�˳_�G��1������Idh����o�!���w7Ƹ3x<
�;���Jx�����rp�n�~�/��u���ݥ�Б���5>��Kx�{Y�p��|Bqj��n��z��r|�~V�~���JfnA~QI�5����7Io��C��bx�[´�i��HŽ�Յ���[0�՗����{��
��x�31���ܜĒ���b����oi�e+�>��N�Yϥ��;�x�31��T�Nj��~�Y;�A�R����}�#��x�31���ļ� ���*A�lZ�]\��*~���&`^���9��;�x��:�:����w�Gf����ix�;�t�i�GƦ�O��u���.E�x$wG�v#�C3��̒T��ĒT�������n��-p
�K�G�:"|��T���BUv�,x���[N���ȹ>�
'n�t/��ux�H�����H>���CX�teT���-��~2��100644 SiteCreate.php�c�8�U.�rj��^\>�󞑆��"����x����k�-��JIFf��]yy������[�Y�jͥ�\�9�
1��Qx�{Yt�`�
������6����.��/Q�-Q��Lf�CH��O@i�=qUf�����L�b}�x��x�tu��܂�"����"	��Ņ9P�
��`S_I���[�&d1��zx�;Yp�`�c��I:���H4s���lx����w�2�����*�v�	 ��dx�[´�i��Ȝ-�$�M>�2ሜ���ۏ�����x�31���ܜĒ���b��!�UW/��P�Ƶ�o��-G�F=�x�31��T�G����_mwI8�<u�b�ۺ�,�
£x�31���ļ����\���^dj�Q���w&`^���9��;�x��:�:����w�Gl(���x�����r�c�8�U.�rj��^\>�󞑆��'m�x�31���ܜĒ���b���ן3�6��{{ �k���cW���x�31��T��Zyc�g��6H���8����[a����x�31���ļ�c�����]�>�ar��ͦ��ɬ&`^���9��;�x��:�:����w�G~y�x�31��̜�b�©r����μZ�zL�j�CsSS����ܜD�-���v�L<�7kg�M����Me�#�%x���MK1@�+"���j��C=*xZX�f��ٙ���{�-h/����{/�����^9�@[��|u3�*�{vD�-�O]��VJo�,mrbdcU!崪r��_���{��ʎ"#��ޣ[��
;1�Gq+v���#s�F���H�児��J6?��;cm=$�����L��m�m�f�����¸��8}��	(|I1ı�a�����n��t��v�x�31���ܜĒ���b�¿&��>��|S}��U�{�>	@�x�31��T�m��Z�8e�fj�H\3�b{��w
�x�31���ļ���3~$L|u��ު�'�V��z"hVᕟ����P:o�o���c�6-�����Z�B>�x340031Qp�(I�+�����+.I���+�(`�V;շ������Ҧ[��xl6���,IuL*.)JL.���}h*�e�|���O�gW)��ލ�ֹ(5�$���#����-���o����G�T���BU�9������.{ݴ��.�$����9�y�`C^q's|z��pkZUȟɬu�o”")3kQ��=/7���9�篫�?Y������1�$Do��[ܼ��h[�
�P��R�@!T��Zp�������Uw��ƴ'mo�ˆ���x�;�t�i������s�ױ<�z��V�h���qn��x������ƾ �`��*[�n�x�;Yp5��ƾ �`��s1�v���ux������ƾ �`�ϵ��E��%
� j�U'&�(�x�340031Q�,I-J,�/�+�(`X������Z�;n=+0����x�340031Qp,(��LN,����+�(`8�1�>����ΦM/�����9,�fQꔟ_R\R�XP�ZV{z:ߟWZV�q�笿o����M!���x�[´�i������������m?i�a)6)>~�
�x�31���ܜĒ���b˼�����8{�UOt�9�h�x�31��T�p�9�|�8�s�V}����wQ�|����x�31���ļ�MvG�se*����,��cb�	X�W~~nN"C�پ��k�	o8ش�rn�cPjE�����Mx���ِ�ģ�W�ZT���W�����i
7mc��vx�[´�i�����{O�m��x�t�
��g�����)x�[´�i�����I�kb>r	�c
u(�u�6k�x�31���ܜĒ���b�K!���6�I5_e��俗�'�\)�x�31��T��8�E�:�3�����[���0����x�31���ļ��ϋ�E6O�h�������b��&`^���9���f���=&��`��ʹ9�A�U9����x�3����re��e�����dY)E{����c�%��Pq�/��!��Tt��|x����;o�u��̜�b���қ9Y}�������Ox��Y*��:������^ZfNj�~rbrF��^YjQqf~^����&�{��T�z�x�31���ܜĒ���b�O����"h ��>�G���ۚ�'H�x�31��T���zc�#.�ߛ:���'w���x�31���ļ���S��?�Q+kr���چosBw��Ux����$2�Λ�[�����M+��8�V�����Vx�]�����r>�9�p�қ�H���:��xs9��100644 SiteDelete.php�gpֿ�[`Щ��Z�((����c�%��Pq�/��!��TO)g��rx�N���p�m<?php���	'.files')�a,����&C�V&6��&,��$��&��&K�@',�p'>��'����'c�G���0x���=�{���v����Y�&�d�d��l�"��x�3������
��K����3Z"��R��z	K����6��b��6�W�Hf�l��x�[+�AdC��DN1F ��Zx�[´�iB�Ȯꍷjd��%-
�%��+�N����f�2Bx�m�͊�@��,8KO{كP�E�5�/Ƌ�'�aՋ�LO�2i��%ݝdrq^A�ճ'�>�o�Q�G�2�+�:!�tu}��W����dz�/�*-<�v�V�n�2�v��XXa<�i��Q�K�H	�D(Hkj�Y�V9�tT[H��iI�;(�F �	*���>�c��8	���#��Db����a�m�Þ�s2^��%��rV�v� �͖�8~^���?9BN�:Д���,}�к�ꌨ0}i��ޥ�EGfG�"��j-��'�r��/CAN&����F(-��+3�*���N����Ǐn�[�:~��X�3z�m"g��Z�E���S�t��w�r�oO���kpFJ�*_�h�2W��K�	��%5�i������\\gr��X�����CeR��v���3ф�A�����[�ց�m��k5	Ɇ;q��='�9'$Aa����k��Ps��2NI�:>[��!���Ʋ�f|?�����%��\���tx��"rId�<�ɋ��&oe�����[��?x�[´�i��H��}Ύ�7$c����M�����@�x�31���ܜĒ���b����bT�ֆ�&�Yv3F��0
U�x�31��T��	�1�QB�;�jV�ݭyV^	��
P�x�31���ļ�>��#LB���w��<uQ���&`^���9���f���=&��`��ʹ9�A�Ub����Sx�;�t�i����.��?�L�ц�:�$�-�>8��#�{@���x��!:MtC�������Y9/3L!m��[x�[´�i��H�{�A�
����/kq\?{�kG�p�x�31���ܜĒ���b��
?�#8KRr>|q�fa�E�!�b�x�31��T�iN;"5�V��t�T��'���
ͣx�31���ļ_S[���m�>��^ڗu�}��>&`^���9���f���=&��`��ʹ9�A�U]!��x�`�����H>6����7O���덂����~�100644 SiteCreate.php�y
5�ʿX�N�q*��:�ᑆA���nT&��2�19'5�2����qG`,P��xx�{��ʾ��q�|F��s�O�e�>Y�Eb�K8�	F��x���ۙ�a+�@�������}�N�p�d�3�;쁌�u��&埼Y�q�'a�ͳD	N^�)����->RE����x�;#1Ql–�O�3n>�\�<ه]JB]?#?7U�,1�(1�D?�(?+5��X}s;�Q��5��Lx�3�����G.��'��X�S�����T�6�\�ν�
�k���G��}��x�31��̜�b�©r����μZ�zL�j�CsSS����ܜD�-���v�L<�7kg�M����Me���x�31���ܜĒ���b�X9�OQ�'���|���M��x�31��T���~��ٴ���:?M/1t+���x�31���ļ�F=э~�ɏV�Z�ɗ����+??7'��t�l��ߵDŽ7lZX97�1(�
#5V��Wx�2����sF��hO�������¯�O���K��$�]ە�a�\�1��?l�x������p�e�9k&�Wl�}x�[*�Dz�m��wOr$^p��#x�[´�iB��������M'�ޯ�4�����i}��
W��Nx�����0������e��`�ۘZ��c������x��"�Kd���'_搞\��3�4�j [n�4&AF Cm�yf -<٘%f�D��L"�ŕyɩ)�i�9)�E�V\�

�9�6/`7d���Ym�O��f��&�q���$5i�x�[��q�����w��.x�!����-�U-�z[�D�����VmC:"{GՑ����J�x������ITp���M�KQ���KU���)����$�Wx�����ͩ����ή��93������8�x�31���ܜĒ���b��כ�F�;X��N�f��-o�� �Y�x�31��T֗���8�]�V��3��M
��#�x�31����.1�,�~��x\hM�j
K\�
&`^���9���f���=&��`��ʹ9�A�U_)N��Dx�3����r�ҳ6&S���*�CHQO`�����K��$�]ە�a�\�1�Z��
�	x����<k�Y���X^p��x��9�l�����M�`?����ȸY�+�k�qQ�ɛE'��<Kt�FqAQf^I���~Yb�~yy��j�~In�����JIFf��]qfI��d%Y�s�Ӌ���o�Sc��PSn�O�[|�<���ux�3����xbc��~j����<���먑�\�&+���%����1���g��E�x�340075U�����Id��IZm��ă�v��T����T��#r�x�31���ܜĒ���b�3�sL僷_����b����pJ(�x�31��TW>��M�~G����}l��._S��
�x�31���ļ��_*�۰�I�H������8�
���ܜD��y�}k��p�ia��Ǡ�*�@%�x�340031Qp�(I�+�����+.I���+�(`����=�q3�i��G?Z�m|^kQ�Y��T\R��\V�q���a]y�}��I�M�	�� �u.JM,I��i�xύr��<*���ȯ1=I�KjN*T����N�O�&�9�/4���Z^�uIepenNf^6Xi��EM���%��
l��D�Iل;vG��{!ȞR�l]�x�����T1�$Do��[ܼ��h[�
�P��R�@!T6iŕ�2�'O�~�Nny}��V�zqo�����8x��!z\t–�
�l�%��y6n��΢���0y.��fV�ˌs
����x������ƾ �`��lFe. ((M��LVP)I,JO-�O�,�F�����dE��X%&�������C�,x��SKOQ�@�1<�0Ї�JqZ,3��H�(�
$b4�,��ҙ�so5j⊸rb���ҝ�Ѕ{��.�����;�>h��Ifr��~�3wެ�L��u�۹�AL��qtc�5���.F�bAc�&D|/��zp����Q�%�ͥ*
�Eh�()d��p��AV�A��Z��L�Ҵ�UW,�(hɬ^ TF���'Սx���S�7`�Jz!,O�꼒�-"D�)Pa�>�,�E��3�A\o�����UV�&������v��tˌ�ծ噿�>|&񝸊���ꆶ��G,�Ӊ9j��4I2��|́Y��pX-*��J�7��>�L
���n ��
��mN��?v�ʳ=.�Ѯ7�g!2���G�ŢS�t�͞ט��(�Z�l:C�T7s��l�
o��1h��W�����kB�k�5����d�xE\��d����C�'�a`�N=�ˁ�-�	���=7F�P���M_�lJ �)�x��o�2������;ԭ�۶�c	�AWU����D�O>��K��[y������პ��I5��l~�� ��!)lN�&� �dQcy9��0�@���`�`��q�	���[��A�:N�x�y��DŽ�L����&�'������Ӗɷ2�����`�x4Y]����r	~�h�*��x��QOOAOi�Ab4^��H�m�+M�H��D
j���Nw��I�3��[�‡�߂��>G���lK�zp.3�����7�O=8�_�
Q"�[����J��߄^c��m�B��)	��^�V���j�l�Dnk�ѸN����.>*�_����w�Ҥ�PVBF�Ϭۨ>q�եi�{��K��oX���~��������ڳ�S4X@NW�L���/�����^g�����6t�wz{�?9��pd�K�3�5��W�~k�H���ÔF��F� �è��=���(��1�L�H�A�!t�XZiS#%uo�)��,+��	݂�u��^��t��lR��~֖��{�Ld3�����ſ��?f+�f�UrGk�\؟@�,e�[A�l}v��d}������K%��'<�Y6WAІ��A�2)��^]�O�N~/��l�&��Qx�mQ�J1����
�Q�83Z(�J�.���]:��$C�郶��Y�~�n��/t:�i��M�{�X����s��	�j�=��޾fC5�mת�Q�X�h�DY��:#JA�5rOA¶���92/�-�98�QEW@�p)��(�QACH@�(J�L>rm�3�"�u4'ٝ���]�Q�'T!a�
)| *eh	��RG�E~��/j"�Q��O�Q�����d6�k޳�j^��@"a���s�xj�nq����n�)B�w���}8z�c��b�K�L�J%h�z��h:t�;b�`~mP�M¨�J��utT�c'H���C� �jDϞI۟��iRx�c��D�4�l��5�ֶYY�X�[c�m�:��Tx�[*�PdC+�柌7�'�攑RI��IU�UP/K-*���+�KNL�HU��|�Sr�?V���\ޓC�r'_d�����P��fE�H��
�j��Z�%+��Fx�3����x9�%�L�8)ړΞ*8*b$ Y��\U��^���i�2�W�ӭ��S��x�340075U�����Id0q缑���R<���O]�^s%�|&��$x���r�y�VFQ.�Ă����Ē�<]���<
Mk�9
,�)x�;�<�e�V��ŌF�%�yř�y�y�%�99�70JƢ�x�31���ܜĒ���b�mݏo�{���1eɓ	7/�^��x�31��TaG��N���}���˾P�{�4�6�x�31���ļ������:fo\����G�W��?4������Id(�7۷�w�1�
�V��qJ��!�g�'x�;ô�i�
#<J��{x����q����g�߾_���"�=�s�R�&�(;�x�31���ܜĒ���byC֟�z�_�����|�u�4�\
ܢx�31��T�ɕ������o��:�`�)
�x�31���ļ��n}9-`392����Y*�zM�*���ssJ����]{Lx����ss�R�����x�;ô�iB�ȉ�^�.'o=�۠�����m��}]��&x��i��`�?��B��g^Ai�AIf~��U��O�k�gp�cP�c�f�L�ɖ��ش��k���8x�T�����-�U-2�z[�D�����VmC:"{G�40000 bin9�%�L�8)ړΞ*8*b$ Y��\�MI��3��w�>T಺"C�x�31���ܜĒ���b��z����m=|��c��Eѯ���x�31��T�B':���>}q��j^�]�PJ�x�31���ļ���S�NԿ>�i�#C����,SM�*���ssJ����]{Lx����ss�R��"��x340031Q�,IuL*.)JL.�+�(`��zPﰮ���>Y�$�&ۄUj��RKR�*V��|mݨp'p�^	�s>�_FR钚�
U)���Ӳ���M?�WvFR\�����
64A�~������ύl�6o}o�
S��l��b��dO){�.L<�V����1�$Do��[ܼ��h[�
��F\k��Ix�O����0100644 ExtensionInstall.php�c��oA��|��ޱ�}�B1˅!��M~��כ�h�vn�V���#	�M�Jx��S�kAf��jӬI��u
����F��!i*i+-F҂��v�n���n����C{�'
ě���/�l��Q�����$�m�����������ث][J+TdQѫձ��[�QN]��%Aq�{��J��nw��G�0�i�7kFE�3jX,��񐉣$�t��9&�HU�祒��=�C��
�禳��K�̝�B�ic0K�qHW�JE*�"�(",����ʈ��ZW���d�8T�s�=�=+mK/�l6u�Zs0�xs�ȃd��rE�)�z��K��2�D�/�!x���)�$��KC0���jEˉ�.h���bÅ��g�M��H0W�dp�IO���&���@m��KՒ��=��a)��Q	7]g�O��7��taE�"�˪�#	#Y�XR
(�j�4&��(�Ў?�O8��	�U���P�]l.Q�	�����U{�Q��v��?>z�nF�;�z�rꞨ�(
��9z����.d� ������Q
>M�:Z�V`�����
MS�x#5�{}p�	����v�Lj{�Qk3���4l��=��&@�(�O��E��e��7�~=ɐ&��H:O.�eA/?pY�=�2���[[[��q��2�j��ԃ�6��Z8���mn��N{� ����"�*�1���抲��6���+צ�"	x�[mG�?ZH��?C�1��ß���po�%IyL�c��3�w4a�l��_����؛`��fx�ۦ�DgC!���~F~n�~YbzQb^�~qrQfAI��*�iB�\
h@�8�$ժ�27'3/[]��:�ek����WPZ�k��Z�X�^���W�Q��M'�P�Β��b];q��bMM������Dc��4��x�3����x��j�>�Zow���NC�7���\�8K�φr�+̃e�h-���z���x�340075U�����Id0��|��}�f��7�e��>��T
��x�31���ܜĒ���b��?�s���i:q�2�o*�	$-�x�31��T�f�+���Kp	^�.s�X�.R��Ңx�31���ļ�&ѐ��s.(�8�DXӈ����og�7x�[��q��^Q��x����q�����!��=�R滲�ZC^^j��)��
��x�31���ܜĒ���b7�S+��;�Y�hE�P�K\k�Ȣx�31��T��^;�O	u��b!��o\�	μ
��x�31���ļ������]��ǐ�c��i����3r��vx�[��q����t��քv�=Wy��;e�͔Ӕ��6����Dx�ۦ}X{C!���~F~n�~YbzQb^�~qrQfAI��*&a�����x����q���'���&��ϛ�MU�������T��x�31���ܜĒ���b�3�'7�n��"�!Ե�N���	~�x�31��T�ɫ��-���^�����ts��e�u
q�x�31���ļ�%��6D��5ə7Q���w}ˏ
ˬx340031Q�K�,�L��/Jeo�嗋w+����Oi�g��?!�|<�]��]۞��ԓ��Y]r�2~����}�P%A��.��z�)_�je�#��$?���I�&@�����p�D�>�yQ��Ef<�s�l�jDr~nA~qj�^Vq~��Z���?�Wg<�61?�l���
s�]9������k�����\5ľ�d��'���&��ϛ�MU������!�cq��lx����qB�ȇMU�G]8fmY�JX���R��Չy}����x������I�M��+��I�E\�i	
��3x�3����x_8�����ư_�$���\3��k�ˆ�{��Tq=�=�B-毜
�x�340075U�����Id�'�-�Q���ۿ�k��^�)�z�
ʮ
bm�5x�;���4�?[Qi���5%"˦x�31���ܜĒ���b��ɷæ�V{Pv�}��m~�-�x�31��T��|�YUy�!qGr�xvWΚ8��
q�x�31���ļ���+�Zr$*5��)�ם����թx�340031Q�������+�(`��c��}/�Sʞ���U51�*���-��u���6��m˜�����jf�Zx���x�q�=lKi�kx���x�qB�Ğ �,�x�340031Q��tv�ve8l{�fROJ�gu�=���b��B��:�����0|=rD��y�dϓ��$e�wv�B�x�-�I
1@�}NQ{!T2��g�T��v F��o/���[�Qn\Z2Y�bFĉؑ�)�X��q��4��J�O�:z���a3���͙_p������~���>d��.|�M)��a�Q���[U(��x���K�1�9E;��"�;Cg҃�&#1�wz�
.��7U�@�DO(Y�H�Ǥ٦�($��1*��4���GQ;1���,�w��1:og�1q�~�Ա��_��6I���<��S_J��P���-Y�L�C�h����w�"5?[�ß�DzV�[I�K_�8�y|`G��x���1j�0E{�b e H�,�KiR���/,bˋ<aٜ>�+�|�{O@�mr>��f�]Ąy�{$c4�ݸ�*�A��0����2Ŕ�(}�8F�?�썾�p���7?��qҧ�mZ�V�d����?��j�1���VT��{�C�е��e�W�|����H+��uA��T꡼�t>�Δ��G��V�x���A
�0�yłGA6i�4"�W6�M����V�ކa�U �\�!�v�B�l}�ڑz�Q���UY�#u"�`�[�d8�F��;�Zѳͥ�;���ܶ�P��u�\A[��N8�FT�]rk�m�x.�
7��I�e�{����uRk�N��2x�m�Ks�@������%�H�4��d*�QQ��]�t�C�F���1��]����+c����-��m�԰��8z�ڶŹ	)ҡ�0玦\�`�:4��̔3�i��"�2����:�?�3�a�)��0s�Z؀X�YF��u�2S!��\�դ!�dř�'��_dQ�%{����	�-��@ՠ�)���BJ&�_�i�����R~��w�����x9��<|�����5��n7��\
�[�z��
]7��q^���ƛ[��Xݐz�ͦA�)
�~r8�������US�,�K�B�	�����*��`mn�zhuc�m�c�'k\E]�׎�A8#^Qu���
P�O�\Mq,�)/��3��I�['��$ʯNG��9��8/��5m�(P76�N�W ����$E�|�dy&(vjN}��z�;4�en��"g����(.�6�l�f( z��厭D���m܇�f�q8�
��*���Ᵹ���JC�a>���F^�zLM��,չ��оRUs����i~��t����Wn
FZRۦ~�V��DF��G���x9�y1%d���+K �W����\485MU�4e;��N�D���ieR��[޴�w�����_�n�e�x��K
�0�}N1{!�Lc> �Ƶg���R5�� ��Kw���CT|����ǡJrC*��2f9$OTL�?
emm��_�h��ܷ"<~/�.z����j�W \`8�h��[%��x��K
�0�}N1�B�|&1P���{�IŶj��`O_ܽ�է4��]��;$I2J ̄�R�X�y�&g��mYf5�|�E�''��7^��{�p�s7��������܅P2\0 �շ&
�x���M
�0@�}N1{A&�-��{1�L�hR��Oo�.|�7Lā9���)&��C�\�1��SY=�I��1o�0Y��l7��!kGh��-�W�������J/��G�;��~}�sI�W�G�Q;t��5���R���[]�򄷴׼T�kI����H��x���Aj�0@ѽN1���F����@�9�F�H6�hO��
Y�����d"gs���BM�HHa�i	��G�d�Դvpdy���6#{�4{b@���IG�n
�-�
��[�I���"w��/p��a�`��zkM�JY{�7�9e���ǺU�G��K�;�y�G�x��K
�0�}N1�B�����!Ɖ�V-2�鋻���)U���K���ƅ*'$72��b�=>u[�Y��	�ޢ�''��ײ��*G�����o��h��S̩#�`@4���%��x���Mj�0�:Ń.�I���RB6Yz�|&&�%���f1�V��N���7�w&?�� �%Y7zۥ���B�Š�(��v�hv���{�b2b7z�LgE��h�e��B���k�}�e�6�8㳢I�m�G��*-�L��T}h7|�/���h�3ݷ2O��3n�5M��{�MK�x���Aj�0E�>�@����%�
�4��{��拘ƒQ&���M�
�y�<��S�|Q`�Y%��1/'p
Ň2�2��Q��'i)�&��9�QR)�&�0��A�vj��{�Jߟ�%�_{�u[�x��W�����G7:7�m���Ӂ���O�V�r�֍��e5��M���_�b~`�RԚx���=j1@�^�p��լ	!M�
����A+��۾B�W|�F�(�&Bo�u)�(n�hD�8;&��A��]ڀ짐���&a�Q�-ϔ</�EG��A�u���=r����>�U_��e��&���ـ�Qŭ�2�������'�[�[�����O��u���8ܹ���*��Q�x���A
�0�y��I6M�/z�
�d��6�6��z����-"�lĒQGm��5��`��[��lb�3e��Ej��� }�RL��āńd2��9	���n��%q����o����Ԇ�e_�����y;m�Vi���5�#U��i�u�ʓ��+�C�x���K
�0@�9ŀKA2�����R<�43ѢM%DAO�^����^�"����l|r�s&�h�1C�Y"�ܧ�b��NUJ���@�:+��(���jgLt�=�e�p��
��Wzl�G�6N�MVE���s!Km�Vi���5�#U�f
G�
�S�~3*�������dJ��x����J�@��}��7ɶ�6���Y�
��,-v��M}zۛgO!3�o�UUh5��A��"r����襟���D�O�ZZ
�G�Rp���IL�c?�x�H>l�*�V�o?����bK�>�gpC�
~����db#[΋��㴹s}{����+��M��9���r�;p��L�7��
��1(�F�3[@������e�s��b!�x���MJ�@F�9E�;�����7���Buu��v�B�u��e/��{�ާ��'L.c3Q���ʼn��G��'0�F7�n��U�G�2>g<�h�g�2�����S��v��gi��+�|��'�_փ.k*�W�{���E=�kLG���*�C�F?�³`=3��N0/�w����=�"kA)�@Rw)<\��}�܁?�!�1P�-ᶕ�P�}�G�b��x����
!��}�]�{R׈���Aݱd�Œ��o{����fj�k��RwVk#��얨Sl����q656��/�*%��"(�ArkY)�A�*�s�Sk���\�\�������?:�<��	�@�h�fkX�w'�<��V����ں�J����!�}��°l�F<�
�&J]�x����J1��ҙ�<f�g�?�$=���b/��ɻ�*�l�R�њK��M}k����)Q��11G���ՀJaZ���|��d�\U���k	��j�ۀӨ���ׇ���^���EW�g�1P�L9�	�խ����cu��#��*]��I�O=�k��?��}�d�N[�x����J�0����)H�4]D�BXXe�Z���-��n��Z�ެ��՜��s��H�nmU��R�k���2\�Av��j8	ղ=F�%�F��2�(�IX+jTz�-7��hjD#��1�B��أ���.7t��<N��kO�*���R4���a�Ɯ�VvQ�v�	'7z�Ñ��I�1��3v	��NyG���dM�cJ���s�F��'�[ ��tpp�~*\Gh��e5c�E�����~�h���6@��̼�H�]�y��x���1N�0F�>��	ٱ3� ����3�ǿ�h���N\�����U��I�%ɎT�/%��Kl~�޵�
�jQ�Ksf��8q9�d���,�“�wzꦍ^�/���z�V�p�0N�y	��n]pn�}��1�:�(��~z���[�+i�Ա���WT��b���N<�x���AJ1E�9E��I*�t���Ƶ��$U�f&�6��xz�+�����u�@�8���D6���r�4!�T�\�V��!���+z;-\��>`�e����$&}�[�<JZ���n	�/�ti�*����|������֚�[[T���st|�Wi�K�eR�
C�}�_Ϝ�{S�o�.}5�['P
�x���K
�0�9E�� ��|DDמ���6-!]��Wp30��t!9�@)q�%*@ޗ���Ȋ�.�u�
0�̠�
L���&���b�������U�?/|�<��.�9�ȇ�,���r��R"����X�N�t�ב������B��x���A
�0E�9ŀKA�&�$""�k�0�L�ئ�BOo{����Z��г��������1�döbD�^T�4��Yk�I&��:O1D!B���a��'DE�X*�*S���I��lti�<Lr(�Π��֚���:��<�����i�p�Bm-[�����H��~�lG��x���KJ1�s��$�t��AD�=C��A�C�<=��+������M�F�Ƙ%���"f'Y'_�pp��5{I-�� ��S	Y��]�%��G�d�}�޺��?����wz�e-_���=�O1 y"���
���b��H�����¹��z;�n�[��ƅO��u=�����GNđx���Mj�0@�N1�E��?;V	!�v�3�H3�4��<���s�,�⃧�\�Ă�K�,��O�1���e�!�ds��U�J�=Z'��8�Ĕ1�Q�6u@.��׹�O�X��O�#���D7���'p}B�|�ao��&��4���|�x����օ���F����蕡��z��CGP�x���M
�0��}O1�R��*"n\�`�LU4�����7^��x��Z�A�H�$#�O�Y��6Ƥ`�V���(�'+D)�G���u�3)��2
R��$��EGK�N�%��ϝ�;��C������u��zl֨�O�r����n%��™��bX�e�T.Kn�s�ɿGn�x���1n�0F�]� б@!Z�eE�%s�fW�_���
TfHN��
��>�E�e�4��)�!13�<h
��udw��Q)�0�T���ZDƤR"��žÃC]�ڱu�u�}�O�����e�z8�m�}Oc�2����Nۺ.fx����N?��
�?�_#�ȶ����?�|I��x���MJ1�9���$y�Kzq3kϐ����NK:a���\�e-���JY�E4��n��kB(E\A�������� ,���B���(�,+�u�)����G�k/����G�N�;��mϟxj/d�3^�Уf�U9�}�PՃq�B�v����lt�VO�mCs�9�A�J
�����O��x��˱N1�=_a��r��A�bAb���>q�K�!������7�;�-ItΓP>2.�L���YP��.��î�ۀ*q!SWK�M�	�1SJ�3U)3s	z�Ͻj�ן�Vx�?=�u+�~h>Ng!�D��	1�˶�c�?j����m7�7�VW�mݯ��;�_��@���Lr�x���;
1��>��d�L+"ZX{�I2��>Yc��W�`����U��E�<K�'�%��1�m�&�j�U�
�`"],Z�t��Ѷx_4�!
�i}�Z����>�pY3Op}��b8ȯN�� �I��w��#�-���8v����h
{8���u��^}�/C�x���;
B1�>��$y��������LP�}x�BW/n����"��*\5LE�16�s�������ՂU�N0
�}��Y�(�v�+���!e�W��+�׊�.�ޠ��t�<e7I?�	�Z\���VkU�q��.T�1.��0����̢�s�FK�x���KJ1�}NQ�r@��tDd6�oP���LwK=�x���;@�U̹�f�LJ�ҩC]
Ϙ�Jn=Y��� )U;��ت����qR�^��t8c�>�e��uw[���f�F��q\�~���B�%�ڦX�9��,�1�$�'zDz}��b���~��E��x���M
�0@�}N1�R���$7]{�i:ѢMK���^����k�L�%�C�sc<Z��1'��*�������,���~��ב��)�D?�u^�[3W8�o�b8ȯNm���쪴#B�E���Nk��i[�?V�1>졫�5 �,K�
|ᱪ�zF�x���MK�0��ޔ]�6�vE��g�$�m�MJ��_o��ŋ�a�e�w>R �f(����R�yn�J���%r�%C��Y��\QrU�51Y�JZ˔�unEa��G�X�C�}������;.i��Sө����pYge���e�w]���θXm�%tCc�c��@�Й����t�4gc���]�=<��q�{�$�Ɖ�ظ}K`�9L�(�j����λŜ�㉙�:L�[�&�Î��;{�g��ƛ����e��&x��14�N��ż��8��������G-�I�x����n1{�J)���6BM����{�� �W��~�r��]��s����m��L)W�6��dgs�m��H�DS(8��O.RyzV�����bx�k��^��������Ӹ�Ӣ���l��[H�C�h�u]/c������q~�uQn�
^Gn�g=G|�x���AJ1�yE�GAz�I:A���ڤ��Id�Wp_��<֡��MJ�
��g*�-c�����8{�i��e�n��$a.�k���p��'F����1%N.v�*>�_�+�wz�e�<�SW{�)E"L!xDBtu��b��P����*?
vRX�npٵ��*��t����G��Y���/M��x���AN�0�~�J+��xc'�z�+oX��´q��"��C��q����DҘ�3�8̑9�9*2�A8r�yr_Ҭv�N:cb��&9e��lM��h�i25rr�k�צR�~����=��˒.�\����=�v����Rz���8���'÷���J��t�_���q���/j�L��x���KjA�}�� ˀ�DBg������(C���K���-�XU!K%���	Jr�Ho�%Dɚ
�ܥ�+���˔(x)"ͷ:����'�3"[)��m/+Lk��g�3��_��4˟n�r
��K�m����<����ys�l��x(�L���d���C��x���K
�0�}N1�R�L>M""nw�
�����A=�x�o�Z�L���.,�8�
�b�����hԃ��
��#sr�1`b���T�$̚�����ٮK�c�4��s�7�N~:�q��;o�����j��2Mck�GU+ta����� �.U}��D��x���;
1�>�H/H����X[y���dw�b���`��כ�N9qdL��|H���2�·��9gT;5Y�v(�W�1`��";08F�2�s9۠�է��k+����Ao�'���煟r\�����0��ƨ�-�ܻ�Q�}��.��<�Q}ՐD�3x�m��n�0��<��Y���`�BJ!iH���فm�S�1	�A��Ŧ��]���}wqu����T=���lCD�BDt3úAR�,�3�I:V	@[7��B�!�1݄�	�FYjd�$Z� 5S���!�0���d��Y�ɨ��:��41�P]�3��dy݁yG�
��y}O�ܲO{/x��{���"��45�P�P"uYr!X|.��Vuǚb�?r���cs��|�;��X�k�
����7�?�$p�]�:�;s�g�9<ͳp5۸+?�Y�\�ρ㽙�*yp�����W�av�^Q�&"|܆��y=ו����8�m�^�\^Z{w�|�}�g���5�V��(�J �*%�wKe��A����z�&��8�W��J�c�/s��{�-�F�/ņ������v?i��M��E��f�+���*�,{ޤ4)�s4��z��wr�u��]�m�k�_��+k��3-���s���9�k��S��*��Kݎd|Hg�f4O����F��F+"�q�>=���h6���it �	�q���q\/� �ݝҿ*v�$p7���v6_y_7&=���@3�X;�^�o��A��%8�uY$���^�X"��)�i��SY��]��&����(kXEYE8��Ñ2x�m��r�0��<�fz�F�3i'"&`b;��7!ď-�2~��P_�i;��;���VI��-H�n#�RL�鲜�<�����Y�pSL�3��Q�1�9Y�ym�f�iP����܅LϘ����}"�I�橝�nn��4-�b�m�c�.465zUe+�/m���(x�퓪�T�
W��Ll8��t��k�R�KT*���i%?�ᩨTyM�~�3+�EW��7�L`,��4X�d������G��LH��Qu�^��+��.��[���F�iq�2L6���$�J:�k���˰��7^0��&�����Na��{߆�Y@N��X��+
������Z�
�d����)�~�������|����!�g�,�����Q
�k�EM�$��.�σ)O�'���z�mDy�g)�,��-B\g��g�#�R�)�5]?8�����u./��Y�>B��{�D�"���
�^��\4�6�z!
�w�}\��h�kU�x�9f�q(��$��CI�N��!�<��JFer���C���4�����31��cڜ˂��U ���;�@��lkpl�ZPն�眪��ch��m�Vp�i���/����3x�m����@��<�T�h%2����⢻
��zfAp}��P^,�I��_u�薂s`���r��6�&�����qFM�#D���JK?K�g��!�Q�2y�["Ƹ�[��%���13M)~�a��ز4�a�L�#�ZFtn�*���F����~���ȍ���C��E�V�˙��b�#�L��D�UU�M]Rr�B.�|=7����G^�c�~y7�'��yW���ǹs����K?t6�x��+@C�R�qܙ�Dn�T��i3��g�X��.���O��Y��]I�.��ո�o��«'a\��3��ڴ�q9{���ru��_��n��zszS�lL0�.�@�P<8����L�ho=�~X���q���1~=�����f�&�t�M'3���̋Hn�&Q�=�GA�ez��Ϳ�/�s�o�+�L�G+W������W7��{L�w�rP�	�2-V@^��:������ݬ��q�эyu�̋m\[^�׻���ݭ�6�%�
8�(q���v����U�Q��UQ���Y��4�λ�M\�O�7A�["�f^k}S���f�����Ɣ������* ���� � M
ʦ�+"���'�|

�3�FHEq]!��_șF$II�X_��co�
O(:�3x�mR�r�0������"x��0Ǝ��$vs���a!�ȇ�cm�ɭ{۝ݽ�-pE���1R�K)��:A���~ � �VG�h
�>�GĜ�1�%��pQ�A{�-��>���.��>��A(w��"�;a�f�4H4�-����Ho|��B�/�0߀C0"�?�� ��b�ijc�imfC��J�N޾W��ŗ?��Ī���
|~G���%X�+����0Β��,p�#�a��:Z���E��Y�����������A�|Vu�w�MF>�NW�Խԩ{9�O9*s;L�t����E�&�:���ƥ}=�n�	
plG�E:�.Gb����9,_��6*Dd.�i􌗯�M�
mLh�Tݢ�Q��2I���xLټ�#�F�//�,�� Iov���ڡ�>^m�D:͟��������[����Tϳl�o�dk���Sѹa��+w�t)'2eBV�	=L���hQ'�5#(���E��b�Vgx�����'s�g�͊.7OYTM;�u��MvN\�0.�C╇��_������6Ȭ�%������)��A�|r0�V
8(�Hj���]
j-l���_D[�[փ����|���{��k-�Q����}�4x�m��r�0��y
��ғ ���t"ll���$ؾH`b@X���bu��]v�b��sfv�h%@�[�ʹ6Y��	D(��@�·Vn�L�F���4Gĵ f�ȇ��s��#�k�H@����C�"��2/��y�����ڈ�:"���(T�����2�M�]uY���o��q0zC��!42Yץ�B�i��>��D[]�R��&��V�EW��o��4����	l�iL�_6�?n�w~�S�(]��YYYe9�s���W[E���l~����lZ�\�0F$���g+�r�+3
t�5�\o��_��w�C�� Tx3���Y�^���M�V"���u������:A�x_�W�'g�.���u���{o�"i	��0����3)�I�]��i}<�"w�c������G	٪d��M:��a�`t�b��xͽ�N��eP	F�����j����i5�
p���6u����Do��\/X�����8.�@/xa��6~tlz�g�Vf�R�{[���_l���ؙ��Oۥ��z������r�\�<�>����Č�P�m_U@�s/:
� ���5x��������\0�+a"��eG����A׷�Th	�R���+�8`
� ����@p�3x�m�K��0���BUY��BRI*�~L�Č�N�e�#� �P.����˿믺�_tK��lh�	1MӰ�01R��+3����:��\�`��zj��`L�ϙM!N�TנNQ���<��6�%X� �4l�"�!ʰm��[L3
���
�4���גL|a���5�ا��o@74,�F�4�iJ��5��	r�(�Ҵ�u����:�Oo��Ċ��y>����
؅;p\�':�?\
��n�:��9��ݯ��/*���flG(�wǙ�����R]x���*�J
����U!����=��f�|��̙)P��ͬ
���n�t^�'��N��S�2E]�7�!j����6��������&�Jj;:����:���
e�љ�ps����
��ipA(�~r�Q>�o�
%��k^B#���+��1|�mm&K����]��) ��^[�9��F�^o?���L���/�n2˖;Q,�^��>�c�z�hj�y^9(��L��A?cR+m<�:Vg����a4��]�̗ג��Dk��*�o/�����S~0Q0�
U{X/�i m
nm[WD�mի9#rL�
�#{�Z!��2�s�>��4Ȉ$���s6�x���#t_�4x�m�͎�0��<��.�N0�Fj��L��	�c�	`&4y��P_��V�wu��w���Q
41=�-��Z��
	5RS�(��c`���f������̴l�C�Z�ڎ
�E2�>$eN� �De�x�IUb=P����45��2
�:J5Ɛ�[���A������y?�_�.y�V����i�UWU����R�,�\)�҈����{�e1�O�?gy��<�?ƛ-V>8����_
{�x��=�n�k^i;�y�m�4^�z�]���+w��� �mV� �Iz�&�MhfS�̷��5�2s,j�p�EҖI�CQ�yB�:��+i�A�[x���H�5�2��I��8!~�;^ߞ�<Ǧ��-�U�be��xiX�2���Y'
��ý�.�Ϸ�����T�o��U�����6�I�=X�]h��o�����J5��cC���,.��[36�Bv��E�"�{�m���/��
���![�1�Q���м����}��h���R��,L�S/8�w/�C,��sz�oƙ��-O�%
%����iٵ���f��Sv��)h������4M�:Q�R���R���2����)4�ϴ�*J������;������G�z� 
�hϟn����
����0x���˒�@E�|EWeiMxCS�I�7:�GTܵM��H��_'�]V��s���q `�N���^���dN)"+�j�A<Ȫ*`�0h �8�4$@A�T��x
"���$c�(̫*"�̠i����u`�:JIG���4�kK�^%^�y��8��}�Ǒ�ߺ���/�1lw�؍���
�u�ڿz0��C�
S��hۛ"(ۇ�W�u�+V����0�m���[��D7�S�g�ֻp;�dw���,�q9�w�hph$��RȖ�E.��w�ӻ�?�ٍqʳN7f%x�XX2=�ؾv�8�_�l;�te�������K�^ꂦխ����N9Wy9�P��zndQn��t����ip�M�Awtt��W$�o�٣9��1B�7�(jTv�n�m#&��΂��-�d��k(G]	�L�C�0��Mcs'��zb�����s�~������HW�s�s�>���&Ϲm�MN��c�#L�k�{�S6�d����N�z?W7�O���m9gb��z}e�kU\N��W��ק�^�HI�_�ӝ�=����lP5�����)�SeL(��n��0x���Ko�@�������R�3Xj��1�86�쀙��y��>N���]��I�HW�WB!�2Ld���T�9���-�$�rTI�R����0iL��&	V�*\L/c��i�(F��0�m87W�i�q
6q����S�*����	x(J��\�Xp�1iSU�0����ڬ�3��9�a��Y;�j[�z8�/��1k��骊��0��j^�At�km��)���	׍�Vf%趪g���3 \w�=�Ժ�OG��N����^��4����̝�%�V�7�Vexy"[�<>��T��~q���c�w�
���ʾn�tabkҠ4��|���,ֳh��x>�}�$�=R��v	�mW�'i��V᩟γ[���ȳ& N�l���8yU;���݊�1�R��{q��{p4w�]�g��^�-m��SS�+r"�f�L��|:��G�6�<�B�ZrJ������b{A������s��^
���[I�oS�1@#2�)DZ��,�p�x�a��(ʞ��؎������)�x���j��m��_-l�K<4ͥ���`�M��d�/x���ˎ�@E�|EKYZ�4Z�D�a���î��i���|}�<vY�v�\U�J��+�$eX���D�H�@H&cY�Y,`^��H�Zr����L2QHE\d�$8�	�<Y�i��h�#��`W`����E�]G��V}��������Y��x�繄5M���6���|�f�6.�V6+W}��/��;c�TU[�jj��qH���H��ӵfͥ!|�����6f3����_΁ɱϏ\��	�sJ��[�:��%��ls_�nO��q��W��e?g~�y����i�Ta��5k��Y<z�����j!_,	IV��eG����h�0P��|8M��#B�N�}@G"	w��{ʃ�V�0:�*��6��O�}�,7�W��,#��wX��Xz��~�=E�tU:s$Ĵ�9A�9�ҹ�%6�����&�H���9��~C�ȁ�~?�N(���:�̶uv��0��p;���W3L��W%��'Z��M�zDK_�v;�vw��<�a�k����bmV���r���s������ʔ�/��
�S��ږ]{�M_h���e��'�p?��A�x���;�0�=�Ȏ��I�03q7q�
�V���+0��Ig�r��|��"4�јjb�|A�
5�Q�Թ�.5�J&�
ւw4��L��@�#�����[�מ����Ao�'��"�:>��X��5CL@�����"�Tu�	�<S���M��DJ�x���;N1���bz$H2y��Ԝa����X�NO��-��y2�Jњ���^Z�u�d�1L&9��Ytr��w����Q'��sH�I�*d��(�k��	�g�o?��M���y�+�w�O�j6��$J)�h���@�K�p�
U�Qϵ�w�׊42?,U��->�h���ZY;F_�.�;�T��x���j!л_1�c�8�N	!r�7�:#]Z�`�B�!���;��UArq�(K�)p�D.E�D�!�<٤�%�+wmr�j^�
�K)3�,��zWh"�jx�[�s���r����>uk]~���8�ޅD�[o��[���B5o>�k�W��~[�m��v�}lF۞x���MJ1F�9E���N�=���B\y�JRa��gH2�xz�+��x�}�3�QK�T46H�hq	�Y����5:�|\H�M\�s�#��G�\4A�r �d���v}�BA�yj^��
�?g�<��z������,����E#P!
�JIs�?Rqg�|
���J&�����A�VHuL����S=O�#�:�/�S�x����N1�{?�J� d��y!DCCC���=���l���#E�rf���h̀�#�	^���	�)F�9J�B��΢5.��9?�J�z�v���4�*c[����(�k,��kT��L�O��^ƚ}����Ԥ�R
R���:�wΜ�c�R��JLk��y��VkNb��T)v!nޠ�)��9�~`�}��y([���q�G�Km燫�oe0�0���qb���/��oS�x���AJ1E�9E�KA*Iw:5��ƍ ���T�f�ɔ��ޞ+����<"�Ɋ��r��^��i�L�Gg3�ʘ4�<�)���:�m�.�4υS��	�������/���#s���+�0<˝^t��&OM�6x7E€���﫪��jh:�;�+�-��
��
G:�~�7��G�[��0�?
P��/x���O��@��|�Izic��3M�退��"+��fd*����v��z�;�^^�ę1`Y&� 1UM�t����h�4�4�jAM]Vu�J9�F"#�R�n"bҽ��
D��ӽ�4V���eȦDqh� ���jO�Az�?�V��@�ѣ�"CL���oO�R�i�����oٮ�`�/A�1~]��w.	��{�1��s�tݧ�,Rf�Kt���(��Zkw{����k)e�^%�������q�+n�k�aꍪ���N*�MKκ�B��!�)b��N.����q��P�Y��W���8V?>g؛Mh�}bA�:�^QL�C�˼�u��3��њ�I#��N#��L��8/����bjX����G�C�I�Qf�E��.��
�4;��I�]�I��<n���}$�K���2��A	��5)��kXb��q��&iCm%Џȱy)+F"z�~,o����mh{�K+"��]��s
�=&>]j)�fy�����dl(�|�8'���d�*��[��,���������m*}���z$����
(�-��l?������,�x���Mj!@ὧ(�2,m-���rJb��F�Er�9B�����`�Ld�QǤѺ��	����)%�:+%N?�-�9oD* ����r֐����
ŝ����>�:��O��?\n.��o��p�K�
h�(�#<��X�^kY��W�'��)�{��c�9��5!��-q��'����x�_�XSƕx����	�@@�b�� ;��� �X�dg�A�	����6l�J����{�L��d�p�D̾�M�"dQC2�i�1��-J5�6��ɫ��5^��6�5FL�H-~��y)�a��d���w�;��t}s�Mֲ��k��Ti����VX�p�񶜻�z<g�.9�\�G�LT�x����N�0��y��QZ'm~�B�g<���?�mZ�^$xzZ���\�#��F$0���umȡ�|v��h��c��@&�V��QaI���m��M��b�k0���t��<.�|���}�/��tN�<��FU!~�ځu�4��'hDZ�yb���>���;���)�]fZ7JȔ+!>�.rd^�K]��X��2�i�2��Ph���0�]�]�ʠ��0g�"��l|{-~��i��x���K
�0@�9ŀKAf�iэ;1�3�����9���VE�G���b��G�)��c��Qv���	͝�L
,���T�}<Dd��gGVH;U+9e�K��u��'~I�2l��V��&�I��#�b��	��yKk�_mV������
�
EŔx����M�0��bؕlj�$��HHܨ`bOv#9v�8J�.�{���G�{�0�5��J��Ahb�3��4e$keIN�[�p� �����d{)G���b��}����r����P��^����T��G�KN��S�j�
:'1��,s����e> ���J��~�<�ۜ�Ю�)4
��N�	x�[s>��'�^��<R�}
T��<�hR�x���;
1�>��d&��
�hc�!&�,�#k��������c�6�@�8����H�O�X�HX�9�U����#��t�ւĹ�Ζ�K���ݗ.�6�n��8���V�4�a�vb���""�M^�����m�#Gp�oꨳLj���E��x���Aj1��_!�1P$�ki!��[!�
5��W	!�/�	=�a|�ANm���I�/��-2��(
��
I�2��[�T���h$Y��&j�(#_(�(�-�ݿ��q_�>�e�[��𾔫���G�Lqf��;$�P�e���hOp�Op[nWu��ac�f�;I	�x���Mj�0F�:�@����X��$�m1�Ɖ��<^4�������=>m"c,��=!#���O=I��G�#"�'7YbN<��+a(\��R
��>�r��;û��׶/����>>��/Z�4��"��ž���l����<WU��mNHߒ��1�u��r�&�rS��׼�BMg�x���A
�0E�9ŀKAf&iӀ��[1M�XlI�BOo�.?�=���B�!Yd��bt܄!��)o�WL]��ro�Rt��.���r�r��������l�U���Y�&G��s�~�â���,7��z41��X��W�Y���i{yJ��{�H)�6_��I��x���;N�0����(���[B�����y
N����rF3�X����B$NjJp>�D�*f��yc4xzu�>qr�M�Yk�VJH�
��hi��U`s����Ȗ8��Ț�l�:�c\[����..���S��Q���NJ�,��Y���A��Sj�^���邾At�m`=�[���=�t���V���q&��{8�RG���*�mn�dܧ/x�nZ�x���;
1��"� ��o"�,k!n��y�E�Cxzz�+X�C�{�
 �"�ڨu!b)�E���4���Pq"���Yi�•5l"z�E�$c/�ϕ�5����Gx��_h��ҞK+������`iǁ�X�mɁ����k�^��}Y�C��x���I
1@�}NQ{A:Ce\{�JR�F������\}���
sRś���ͷ�H|�.�RT.蝸S�6c�I��Y&D=+vT0�D�x5i���t8�D
��+�v��a�5�x�x�AZ���=l&=M"-��c��8��O�yi�����F��x���AN�0��}Oa�%J�6-�����c{ѦU�NO�#����KϪt�����<DM�D}@Mc��{&u%em6�R���q�K�����B�#���#��شVx���;|��O��jy�Y������8xt޹&�˒��u��[��V�/��)��n@7�y^�s9�撋n�&	����s�†6�wW�
��ߡ�{�m�c��x���K
1D�9E�KA��L@�9���4�d$f6���#Ńz�[J ���U�ֺ�9[�(��u �hIz�hk��j#�#)���u@hE�&�,{c��ߖS[+����T�G���?ҡ�~4���F�K�R�e�K��?[��!,5���x��k�*I��x���Mj�0F�:�@��2��B]�#kL�e�IHo_/z�����'��v�`4�b�6���!�`�TJ.3��:��S���(�9�h0��9�!9^��y������h~*�
�����I��Ϲmw�>9;i�|�FT�ݪ��.�+�. 
��^�0��q�S-��ֶ��A��n]��;@Q�x���;
1��>��d&�d7"bcm����=�z˿��VE���`�]�>c���/(��Kb,���P���ܠ�11r�A�N%�{��d�}o
�
�
�v[*�k
3\�cx8ȯNm��]v��#�#�zO�EFTi���5���
1������uyH�ݗ4��'F��x���]J�0�߳�ɤ�i�"�q
�d���&>�z{]�o���yV�G��2GT֙��`�I!ie�J~
,ŝ��(�4io��N�4;v�fV�t����m:�~8��O��|��_
�W@�(�^����G��O8!|~sk92<ƨD���k9���q\oN��h��ձnW���B�;�__[��x���A
�0�yłGA�d7MDįl�
ZS�(�{{�ކ���D����^2c4蜦��!y.�:�r�G�X(J����3[m�`29-cfNC�^��k��$�\7���Ņ{�ާT�+h
��ȏp�0��.S������ZW��}Pꜥm�+D�&�n��o�L��x���KJ1��}NQ�R��"�U*�j&0��j����������!Ri-%ǥe��k6W���zj�1s6ꆋ�@#�:f�>�iۈ6�c�X-Rr.��d��\�G�A��?|uGY����&�T�:��6Z�gݻ��T/Ɔ��5��*>y^��� �-���°�r.�S��Sq�x���K
1�}N��R�d�^���� 3�LD��#xwE�zc��:o
Z���er�td31�.��c�C��B��fﬖd��iL��B��;5|�km�.<�u��/��4ao嵣:A�ht0v0��JJ��S�������@�@u���h|�*�L���	LL�x���Mj!F���`��A�n�B�J��0��V�n�^������f�:Z&.E��3R�ʂ�-��YS2eYW$���M�r06�ݴ?c�ΣEtֺ��)#��}���Vn�Ox����Q���`6\�����G���b�
�Sj��w��~?��	�e�,_<f�m�t�$���QRn�x���Kj�0�>���B����R��+Ԑ8Dž��-z�Y�f�D!I��s\�`Y�X�p�Ջ�Ė8����O#B/�r�˚Ue�>S�6]���:<��z^����2G�y[���J�eA��hs�K�B>�C����M�֯)�[����Qm�_\�LV�x���AO� ��s�d�-��=x�:�tK��
Ӭ��˚�/r���G"h�M�7MG�D%F��HH��6���*U�ℑ<�hjmƺ�P�J`Y�U+�Z�DFٕ�T.<�OQ���#�wtQlg�h��l�J�r�
����l����q�0#[�έ�#!�� ��B��'�"z=���ØsK�����x��Y�"�ؔi"�+���L���W�$�^Zز#�<m"ۉ��-�]H�����
fݦ_Ji=�h�j��L���7���3�P��۞�˯�7��ר��x���Aj!E��� �@����!�\�Ԓi2��5��~\���|��}̐��@�lօp�î7W�foBٓ��	��4�
��6��|D��Jq�{��%��CAE����&|���'�8~?R;�m�[��]��j��!�7�{�8�~��a
�	G�K�m�O���j?�B��z57SO�x����j�0�
A��`{�X*��(��6/�}s��6��
7�T�f�!�2��Ĕ��R�svb��9���!�(�~BI	=�G�nbc�JA�YƐ��5������>��~N+�V_����HH#^Wx��Zsٵ���/͛���#sW���Y�ߵ/p\����84}(�j~ÝO��3x�m��r�0E�|��f��XBDU2�	��m��&�I ��+Bؐ�g&3����>ݽ��$�@`�����bK`�Sh!D�u�3.� ,���**y�����T������DH9GF�Z&1�Dj1��㩝�'���ڐ
 K9�R��ٶmj�Q�R�iy��Ң�yQ���~>�9���C� u����R\���
�E)y�uχ�:6���f�P��<|��9��'���D+
�j7q�:��]N�{��ÕX��`q�rrs�t�6q�Ք���\�d��}L/r��n�l1�1��n�.h�f^�KJ�:.7#�\^��?�7:-�����1��

t�~H�z�N�$7k4>;�qx����S�l�����e�}'���j�v��6��ڎ�q�X*7
��n�1zW�e���Y̍I/�u��xfŠѽ�6�50����@Y\g�o�)u|<�FK��H�Fb���{�����l���;�݉���1?F��հ~��&m�l���Z��/�ay��Σ͈wy-��7{�S��v��̼��Ĵ��&ˀ��
���:���,󌪲���T5���=TwS�2״��+����_MP7UUJ��Y՞3x�mR�r�@��S���aX�*;e@H[+B2�
� D�4l2_�Nr�^�-gPJc��FcI6�#�%2C��8���L�&Ԅ��K2&�!#�S�jD�aXITDq�hT�u���'�!�D��%G*�,J����JE(��*��M+�*%%�H�4�l�c������g�~ISTI�����
�*�K�2�v�E౬8����M�����\���<|������7�w�+s�Ͽ04�LӲMskm��Ԋ���^�4S׽��4�u�EjN�C��%����ڊ��˚���a�E:&$�p�E|�ri���^�q���f��X�n�-��V�8�,&\���S�F��%�4%r��T�8�/�ޠ��~8`n���X��_�ˍ�٫R�f�i y#��ۿב��n��p��7�R�u��4ý˜�V���*�q-Φ��N]�H�����Y���R`߻&˺�r�M��ߘ��q4I=k��k{�v�L����}_����A���Q�Q<v�O�퉍adz�*�axm��F���Ox2;��:sV�������<�];ִ�� �U��*r�VUވ	#mǙ(��COΜ�� �XQ�4]]W���*�k�����3x�mRێ�0|�+,�1ڂ17K۪���%6�dߌm���!���X�����v��h�3�$���`��l��:�e3�s�#]�-!�D��5D�J�#��̤�:c#�f��a���f������M�Qlq�YnN1f:Vns:Yfbۥه�5ҩc-A()���Ù<x��o��d%�\q�@�؁v��@���r)��L5�2�\Ւ7��(Ա�>�#�h�~ON���+�F���n�?w
h��4�`��`��E�M0w�'k�#�|�͢ȟ4t�w�gb�\���ex��T�P�"�\�w�[m�j�ɍ��0�'��^F�>+g��L���#o�ѡ�Džx�@�AՋ���/9��+3�܋M_�];}�����o=��U�����eV�ۥ�I���i�i&�4��{���ʸժ!�?P���!��a�g�EW�o���l"�>�;
���.���n�H|<��F�Uן�C��tD'�fm���^����m;V��.��[_�w1��?�{z��;���ͺ�����>	t	����X5Wg��}��f9�4p�p�K�/�2Jc]��Y�|�b�����+K ���� 2A.�8��$���V�9Q��:D��U^����R����vMSK�V�E;ITQW /J�^���3x�mRɒ�0����q*A�Q�$�w�gl�H,F�ac}��wzݯ��d�@T79�"�f2��(�2�O4-hi:�5���H@u(�X�4єd?�Rg���'O�鍌3™�X��&I����	�qqn&8͞[��AM¦��K߳K^�_�{��@���fi�^���6B�R����
	x�4k���Ő|y
�c�ۼ/s��8S?X�����_��>�����[癩m;�mo�mX����3�^_�.��v7N{�1�%�=v��얙Nx��AW�Ťxяl����u����,>����8���Å�O���_�tL2��Z(Bh�M�Fl�P���T��!�!��ߵq`�x�X��xPW]nҬ<t���&�L|^NN6��bq�E}ڞTQWˍoz3mt�=����k�qn����\K�_�Q]��'��,�Ҿ��s�*��"_�ŏc�V��
���Ӣ*�a��́-���Ә��2ڏ��8�/�Ύ�dעE��%z��C��V_��6�9�����Fk5U�t6]y�oLY�.g��t�c`����w�Uӈ�ʦ�{�3*���H'��M�ΥT�����@?�m�I��_9�s����O��Q�3x�m��n�H��<EI��ҡ(�����"`(�K|���C��\؎�_h^l��ԋ>�s�}����
唺0���'�J�Im�M��Y�鑔�e�BA��X:RHlA���\�Z4�(P��'=��4M��_<!����Yc�`����y���6v��965Ġ��B���E�����w����C�MZ×�w�]l�]lR�F&1MCvMSj
E���}m;}���(�qH�|Њ�8�z�?��=G�hã����w�z��Ϙ����_M>�ݞ�~B����ů�e1�̿%�{�D6�a�:������x%�&�ܢ�n�J>l"sZ�Q���b�)J���!(=+��/v�g���l+k��ֲ��K+��ټ&l�ہ_h
��T>v�(~Y_�������{og�q�<c�<qVĻ�&߃�5���oc��nͮ���OA �dz�=,�>�<y�h�B�I��mr��R��L%�}���4�����.��ʙ�#��o��Җ��2��}����5������Y�B����V7NRլx
���(ح���[LEu�f�o�}b�g.�?'f�A�������g����F��Tu]S�u��1������S��=�P�-*[�!�Q���K�3x�u�K��:���
Kw�1�Xj�
	�����4Y�`	�`�׷��];��>�h3�RJ��J�(M!���Έ��$ͨ��M5:��fy�S�#���a̖�L8�a�R����1��cr���ƶ��	̈�r$��g�;$Äjp=\��\W�R�&_�_֪oJ�|���i[�
L�&�B̠�s�'��a�=�a��Ҵ���[QW-�P+�B���K����� rO������R�u����:3[�8xz�ٻ'���u�U��v�ǂ)	L����2&���z�W������cE�}w��r��"����-�K���̚'MW$��8��3@���>��`�j���T���p~q���%+�cwP^�nJ�8U�x4ac5�w�l�G�:��`�c��D�h�;�\f2��%�<j�{'vغl^c?�	$k�Na~�jD�B�q�E�0_��&������AK���h��~���D󌠶Emg'o��g��*Z���n�j���i�o��n�[�b[WdͰl�(�g�ݚ�75�zg�._
�u����h��nj��	:]U��-��2y���ֶuŇ���<�|н�����:o�	�Qw]��?2O�F�����f���2x�m�ˎ�@E�|EKY���yK�(�f0��`�]C7oܸ���ʏ�I�]J��[��+��R@ !��Dy�cSE*u���JM=հ�3jhR�9=	��`�����fh�jf"�@&6
�p,���f?�,�V��� �Bd!�:�6i�PBsÆDƒ(��	���h���{�.�.m�߀jjH�
9@��Rƺ��r�Wb>����8�����~y�9+��R���x~����r�;�.	��I6q���u���[yȜ�t7	����W��놹�.�c�����>�[J��&�͌�-�8K���4��b:7�a�eGn��37bG'݉��ކ$c�qVB_�/qy������e�ٷn�FVj�ǚ6K�0L���V�7��a�У�s��9',TˏB����M�;]�(������Q���!۠|�.��z���j���|���8��H@���л����f�c'�墎��<�^A�ł���~����`��kܱ����ٚ5
i�&�ޒ�f�-��+������Z|��1/As}\�,�*���9���̼��IK�
��m��^��j6�9�@�X�b�X{Qr�����k]������cQ�U[��/6����5x�m�͎�8��<��YFU�l��G
!���:�0B�1&?� �B�bC�hf�ww��g�D#�NT
A�2S��N(�Ak:E�&u��F�0�H�ij&�B��:�a�A�h���
���VUUQ(�*C��h���h*a�c��Ź��)m�_�>/�I�7�%����a�O��T�L����Ȳ���k)�-�rL���嬫�?�R���u
��Vt�P��k,��u���s3���?�$p��2M�6͝����q��"�J
o
���[�3W��l�읨:�[��b)��
�Y����|za�Z5_�����j�F�w?��(g��{�\���-�D=k%Љ�����e-��Ks��[���a7��)�߫���#7o�"�������誘I��7�">޷{���Y�_�*��3���k.��)�����C��%�&\M���y�H@19qN���V�z������q���T�8Zۨtd����S(��k����H�����{�ò'K5�hd�;k�<���IO��:dX�vu�.JC����QC���]ߗ�Õ������c҆�n�k�Y?�A�?�B@��+�5{�&�Яˁ������+:����ZIZ���<��q(�L��uK�	6��kـ	��&�^�oNII�3x�u�[��:����#�	6�`�=��\�$3d 	ɛ
&�pI$a~}���ֳ_��ַ���z%%�HF�ԶMIS�g�$f�ˤc�p�J�;ҁڕ+��CJ�-�r[��i#��-DJ(������?|.%�<O)�>�RCb�)�H�F�I.���П[B>T�P�&_ǟ�v�;Q�^�Ӷ�@�R���@7�ah�n]�T`Q�� �צU�Z��OE������8�/?ǝ-�W.B��Wo�g�|
h�ѹ�˘������6���]����M�?�<�g���E�ٛ����8hy[!
ĥ�P����h��l���b��(w��[�	`X�š���bO�r��Ap߱��	e�|ێ���Lj������y7;��r^'�n�x/��0*;
����d�D�}v&n"K���s�^�����檜�+��wѫ�ok�7
\�G� �p9z�Y)p���\d�%���L�i��h�>\>J��Ϲ�N��0�Rsk���<ޮhy��N�4h���]e��%�ב�W��,Т�g��a�����oG7��ߝ�^�oL[Ku��:TP�6Ȯ�@D@���m[W�o۪������/���U�iڬᢒ ���	�߹�ȁ�-�2x�m�K��@������Қ��t�UIj���k��𒇢�>�IUV9���sW�t
,G���G2�i`���P��a.�*ռ��CT���������1��+
��B����*WY$V�J���B�U1�:�5�tS�J��.U���/y���	�G?��ڥE���_H�0��������$��H��ݼя�j���I�]��g�?oI��i�^�Ȝ9n����\'0����KHB���a��al̍��%D����]2uu#�{�47�5<�r�_cNf�c�++��5�z|ekU��.琸G�yg��0�N�x�I�kmj��vI�Ǩ�O+����l	ŧSpxƊ��籧�Ɨ�-w�۶ t�A��-����]e��u�ہ��n�o
@�A7,❕^D=xft�K��B�3AG�B�F��e�C��x\��WM���)�P��܊�zճ��E��}�O��j�l9Y>�)�%�X��D^Ҝ�~�3����IR�4]����P���F�涗\����o���Y�<;Ė�>���\�������V���,���1i	M���5p���7�7U���*r�UUގc�]�Xf��_N%i��u�t(�����
ȝ���x���AJ1F�}NQ�R�JU'�Af��oP����Ӊd�.<��\��ot�����Ŋg�1%�i��fI<A,��>��
��UCɡ,�aW�YD�f�E���1�[�K?���վ�}���c���*�3���uVQzd��r�m�O���0�^����J�ߕ���Qp?אK֒-x�m��n�@D�|E�Qb�44H�hCc���X��f_M�~��hN�[=UI%U�R
`�����P�r�`�KX�(ā(�1�y�.!��oi�A�<B��X�� �1!q��@���2�ЧU�*�K`�e�Ѳ/�/����?����EK,9�	������d�z�KY�����I֧C�����I�%��K�NL��Lb+���r0`��PUUSGu��u��j����
�F�5'E�N���F�R#Nە��2{��Jn�Ru�</�<���}��ׁVr�D�۱��Ł�q3��!��B�#�58���2@#+v
��̺͛v�ݱwo�����D�Ը.�N��2>.|�J#䆋fkw��Pj�~A��ʦ~W5㺙�5v,;�P�b�i��?c4n����\R��6P�VN����$��Y_`DY��c=O�)���-�4�	��,$q6o[m��C�ܰ���Ȝ��g���n���GŌ�ܫ�<�K�h��cM~B�?pz��8�x�rf�?���Ϗ1.-������#{��{�<9�o���P�,x�m��r�0D�|��ĒYU�LE8X�ml��X$�06_?��ӷ��}z�e�TG(��X:C��&� �*g&�	Lb�\�5p��0�Uq�[��F�uh�c]皞qf@%�e!Z�"n�7]ǚ�T�V����0L����	D*���RJ�ZJ�O�K#Zv�<��R}�5��_���wl�z��-�y4 �C������S�{NHh�~uFw�K����Mm����fyĝ�n�''
��FtHd���!K�Q+��a���u"n���F��.���c��m��3����T��(��BZ�e�0m�nW?�聨6+���<|�� �
z[*���PM��9���DY�%��( M0q���Ƈ��{�֩���~>���vؕ�ƶ�;f�{p\N�J��f�pMn���I��-�/4��+a��<�,�^�\Z��T�t�r�9��DN~�+�z�$���JjNc%U�6aN��:�?��ʋ2����d9��ˬޯ�܄���߯
x%��P�9s����)�Œ���ؽ|�s���/9��x���Aj�0E�:�@�����&��M�Y�#yLMl��
%9}�+t�y���mSףOe@�R$e�9+F���l}0�lZ�W�Dap�(�A8��$��6�ȄX�����V��q���I����9O�Y�}9
���5e��5��j>�KG���i�Wx�֥�O˾k�_:M�	�tK(�x340031Q�K�,I,))�L*-I-f��.��5�i�G��[>|�/j�����
3J�6��d�x�qw��j
<��i'�"��L��/Je(����W��fr�m�V�}PU��~�>��z�)�ٌ<��O�Θy���{�"B������y:��x���Z	yi=����y&��0f�u�^@��x:���2�=S3�'%۳��e�VK��T�J�\]|]AVr<H�}��E�?c���gn�V�x1)3��չ�7�.~}u�vۇ����\�5"9?� �8�H/�8?��u�Z�c��"s.<7є_���0'?9�A�W��A�ʠ;&x�w^�΁*,N.JM�+��/�+�Kg�|i��.�S�'�]���*�}�%3dI���˱0?b'����\dT*{��x�31���ܜĒ���b�Vɇ�Ek,��Y�!z�l����d��x�31��T�/�J׏��,Z9Q������o5�K9�	x340031Qp,(��LN,����+�(`�*�kj�p���O�)W�\�dق�&@���������q��=�ש�u�s�K"��O#D�W~~nN"�B1װ'_f�>;��Mg���D�����9�y٩E��sO�Mԯ(�[9c�����;Ω=צx�31���ܜĒ���b�Y�J�/�^�s�]��1�c��#2Ǣx�31��T����//d��Z�*�ws��Ş
�x340031Qp��K�L/-JL�I�+�(`(ږr�ˏ)�j㼳wB��k��8jb
.�%�I�ũ�S�ek��\�+�׼a��t�M�׊�Լ��<����y˒�툙Y�bA�|�������<��Z�2�'�]
y�ӭ�? 
�3KR
b/n�d{��Q�o�;O=��kqrXjȊb�sO���>}vVL�z��s���'@�	��/.a�y�eF�E���}��=Y�Ii+5�f(�x340031QpL*.)JL.q�(I�+����+�(`� ���b1O��3:�͌t�>�_i��Y����
VVߚ�|�'�F��]�
�>N6|U�W%�a����7˞_�_6Y�i`�1T�g^qIbNذGz!�/8�Y�qڣ�R �߯���2���ȯ�����ǟ��+b�"������<KR�K�&F65�nЮ��0q�ə.;!��"PӂR�3���F���}��C�[�s�-/b���^��������+kv��=�F�c��r�B��>1B���e"���+���gϜ�(�\�q��d9�
�#��3x�:��������P�K�o�-�gnT!tQ�~'��7����ƭٞ���`Y&�'-�!�x�31���ܜĒ���b��I_����!P�/�w��N��x�31��T��2R�O�u��/d}�b��!Q�=
{�x340031QpL*.)JL.	�,I�+�(`xj|�I��k�C��ڎ5g�k�B�:��e��A�Z�����7X���ÝGs�(��&B�]rl����g�/}��:���T�KjN*Tղ��r�%,�:�3>�[���k�4LU~y^N~b
�qa7���8�)��B�w��B�ߠ�\+
�J��"��|.on}t[Y��ۏ?#��m^U�W\���V�(<�rY��_w-}1��]�/�Pe>��%�y�`e��>��o�_#\�A��ǝ�
e�D��x�31���ܜĒ���b]1+	6���?���W9�LHy 
��x�31��T9���RA�+n94a擽�����p
�x�31���ܜĒ���b��~&��WV+��|X�^��B
��E�x�31��T�F��ų��n=�;W���qi����x�31���ܜĒ���b��3W��Y�v.۝���O��3�5<(��x�31��T�����r�Q\?_���H��	�CĦx�31���ܜĒ���b�}Ƕט<���޳�^����U�6 )��x�31��T݊��7���w��t���I���y��x�340031Q��+.I���+�(`����e�`,Q*��ڔ����C�2���G���Z
�dέ�:�_��kʞ���	�*��D2�ɥ����މ����|�.�;p,<�x�31���ܜĒ���b�eK9��s+��^����������?�x�31��T�I��
�'�(��[}v9�z/�!��
P�x�31���ܜĒ���b����k;�}��=�T<i��ɒ���x�31��T��υWVN�?���{~�]&����;�x�31���ܜĒ���b�_w����fEv�g3��E��/_��x�31��T��=��Q!�;�|\w,�;y{e.�[�	x340031Qp,(��LN,����+�(``���o�ĬW�;��>�n��;�&@������T5�b�-��הo��m���ATx����$2,s
{�e��I�t�^M��Q\������ZT�9�T�D�����3v��
���:�<�x�31���ܜĒ���bw�u�n/i]�)�����������x�31��T�
��Vbz�V�On��#�ԋ&�
x�340031QpL*.)JL.qI,ILJ,N�+�(`X5ٹ��C�ݗg/c�S1�!D�KQ~X���3�l��7�F�����U�ZQ�_TVձ��ʷ��}�^��@��w۞@Uy��$�䀕�+o4��?�ω۩��ʮ�,��5�B
�x�340031Qp.JM,I�+�(`0n
�8c��uӕ��K�����gQ���_Q���t���Fѯ/0��X�r��.,�x�31���ܜĒ���bfi�i?x�WV��Z��E�k�%�	�x�31��T��;n�\�>�uٓIR�N��$�	x340031Qp,(��LN,����+�(`���%Y�û�ٯ�ŷ�+��21���ļ�pE�{k�$7[�����‹eE!*���ss���=�2�ى�m:��&��(������N-*f��{*o�~EY����f�L�`��;�x�31���ܜĒ���b��lKvw]����Kj���_����x�31��T�%�n��%�jؖU	x5;d)����x�31���ܜĒ���b��{&�w���D��چ5�(U�x�31��T���%8t61uJ�eM}Є�����
�x�31���ܜĒ���b����:��q[�Iv��U}�%P�
��x�31��T��}����6<�{�i=��z�
ܬx�340031Qp.JM,I�+�(`0n
�8c��uӕ��K�����gQ���_Q��5��X��}�s��=ߴ�ʋgy�Ʀx�31���ܜĒ���b#��@��_���|&�p�T��8��x�31��T�C�Y��?R�})�ix�Ӈ�X����x�31���ܜĒ���b�}�WDo�i�~�M����6�W":8�x�31��T�
ٌ}�/�[]+^���\���h�/��	x�340031QpL*.)JL.qI,ILJ,N�+�(`���ۺ��\�s�4_�k��:j�!D�KQ~X��ց8��%fN{��w9)g{��-LMi.D��Է��slH������N�s+g�A�x��$�䀕^]��V�o|�ӷ���o_�N��mCp�x�31���ܜĒ���b�x'�?	�3���8ɹq���Ңx�31��T���+��<�;7�I��W�5z���
�	x340031Qp,(��LN,����+�(`ଓ�˸��g�$��;7��X���s~nnb^
C�D)��_��>�Ya�-k9!*���ss���=�2�ى�m:��&��(������N-*f��{*o�~EY����f�L�`��l9��x�340031Qp.JM,I�+�(`�~�sa����]
rM���Z�!DUPjn~DU�S{O�ѥ-�uV��,�̾&f}@��x�31���ܜĒ���b�su��t�n�ztu��}�Wf���x�31��T��3�5o���#���VDy����+ͅ
��x�31���ܜĒ���b����O�,�Q�S�Z�V��g��G��x�31��T�YI��e�u��N��~t�w;�A����x�340031Qp.JM,I�+�(`0n
�8c��uӕ��K�����gQ���_Q%yt�sG}.��¡
9�=~Yg���x�31��̜�bQ_��:�O&�|U|3�@���.���*d����$20�^Z`�_}��J���{!���w��x�31���ܜĒ���b��t��G��/�{V����_�G�x�31��T��9{U;�h=���w��k^�.��Q�x�340031Qp.JM,I�+�(`���=�o�g�K�\��\<zIV
�UA���eUiN�=uF����Yu���w2���yÒ��x�31���ܜĒ���b}��>�_e'��=2h^Ut��#��`�x�31��T��j�Xb���J�閴n��_[������	x�340031Qp,(��LN,����+�(`x�Z z�Ս�~�����Hh���bb
����y)��S������:�O�
�����^���9��\Þ|���D�6�i�W��?@W��d�e�3D�=�7Q��,o�]|3�B�r��;��x�31���ܜĒ���b�W�����vスK�F;
�|�x�31��T��K�=sվw[n'����5%����	x340031Qp,(��LN,����+�(`�XzQxO�ז"?��|��k�7 Pp���M�Kap0�`��U��qa�%CY�5�
���ܜD��b�aO��t}v"i��4ë�~� 
�+ss2�S��"�ʛ�_Q��r�.�B!S9�w�9�x�31���ܜĒ���b�Isw�+�q��w�Х������c�]�x�31��T��:WS�l�ܰ-$5�������x�340031Qp.JM,I�+�(`���N����{?L��jQ���_Q�}xm���S�&�=$�=A��-A�x�31��̜�bQ_��:�O&�|U|3�@���.���*d����$2=YQ�fK�
��m�;��}���;�z_�x�340031Q�����I4�+-N-*�+.�a����3�����m���]|���Y�1�ⓥ/5\8�B�K���וt���BYF~qI1�Z�W3�g�yb\&�1}F�#��*�x�340031QH,HL�H�K��Kc�l�}�g\M���O:M,:��2="R�x�31���ܜĒ���b�����W�'�?/���׭ՎK��x�31��T}�I*��5�W��縿���3n��
�x�340031Qp.JM,I�+�(`��{����z{�S�뾹'-��D9
!��Rs�� �Bý��x|��ߤ��d�'h�,}P�x�31���ܜĒ���bŞV;��R����2:�nlz�"
ۢx�31��T���ߙt�E�sQ�o]��d�6
��x�340031Qp.JM,I�+�(`8|�8��oC̚XΉK[ٶW[�xjQ���_Q��H��M��Ҫ.���>s;*���x�31���ܜĒ���b�����>�ڟ��Q�m����}�$��x�31��T���[�Ė:�'5; }d#���W͒
[�x�340031Qp���KM.	��N��+�(`��p'���f�e_�؟�_�����'1/�41=�;��t�����w�R�V���z��L����<�����h�=k���b���8�W�t3��
x�340031Qp,(��LN,����+�(`0����-�0sa��]QE����N��%�%E��E`��[�(G����*Y��a�6T�sbrF*Xу�ѧ&�ʻ�;>mB��O��ˇB��d��\*�,c��LY%{j�ݳ���v�Z�^<�x�31���ܜĒ���b�V]2�K��Y��W\UXr+�%��x�31��T���8��n�2����Գ�=�k�S6�x�31���ܜĒ���b���M�'�VJ�6VO(�Ǻ���^�3�x�31��Tq���=Wx��]��a�j]�d��\��	x�340031Qp,(��LN,����+�(`�XzQxO�ז"?��|��k�7 Pp���M�Ka�����Y�F��L��s�f�pEBTx����$2�ᬱ�;%?��ĺ�!���N�Q\������ZT�9�T�D�����3v��
���͋;7�x�31���T�3:��[ϭ�����NX���f&&
�yi��E�I9�z����U���	��պ|sD��	Ĭ�����E�����.س����ik'�HCT�$�$&%�2<K��b�pp}��3�6G�&_�Q�ZQ��W����:�o��Z��"��C&/�R�Z�Q㖙��Z� ��t֢��s�>f��.!����'1/�41=�a���_T�9#�H��?�Vך���B�䔦g�1��v~���pɊEW#VT�]n�(�,IePb���ޫ�cs���/����LXjș��@9�ޟ��m�Y1q�N�eg�^"�1&,#������ԯ6�Y�y��̚�k�{$_<JY��x�340031Qp��L,�+�(`�z!�T~5ǚ����Z� ��҂��ȹ(5�$�����
1kb9'.me�^m��)TUPjn~Dվ>�"E�7\^�K���{3�����-��	�@x�;�|�yB�H��Mm��+eN�kX�ҿ'�c��Y�i3޽}ƺ�i�2��=wOnl���fh``fb����[�_�Z��U���P!a��S/6�4=�G/g��i۸Dt�9���n�^����-]����B��:�5�kMD�9E�[sd}T|屝��E[�	�B3��|x�kdndސ�(ⲓ����KQ/�
\3������
���	x�[���qB����[έ�-7ں�Kb����u�9�ۡx�340031Q�,..M�/I�-�I,I��Ma�p�[��r�H���}��7M�@�<�(;-'������c�
r\X����icښ��s�~"�x�31���ܜĒ���b>��:�[��\����n������=�x�31��T��?f�����!Eh��@��u�;�ފ���x���8�q��H�hѤ����\��
V�8�*tM�u��	�x340031QpL*.)JL.	�,I�+�(`xj|�I��k�C��ڎ5g�k�B�:g�&g{恕�޼`_��u�&�����,_����e��A̛����~��U�3�˺�/
SX����ީ�l������O�^k�zG�AU���BU�j:ꓳ���z�	�,��w�{�U��W��&����dukI�*���.�ͻW��T����'���E�:�����C��w�7�n5��@�y��$�䀕}=}� ����}��I��و��%U�Y\���V��j���_����r/V����S�����TH�}�(����K_tS��Y2��+�1+��U�x�340031Qp��L,�+�(`���[T��Y�������I�cQ�\��X�
Vu��q��߆�5�����m��x��*(57��j�q��Ǜ.���U]�}�v��-��x�31���ܜĒ���b3�X�F�y-�X�]�=G��u�c��x�31��T��3�,�<g,^��Z���YeaL�[k�	x�340031Qp,(��LN,����+�(`�XzQxO�ז"?��|��k�7 Pp���M�KaP��n��˹�uV���䬴
�
���ܜD�xQ��K�\��|��x��­�[� �27'3/;���!r��ey+g��!2��}w89�
x340031QpL*.)JL.qNL�H�+�(`��=�[ݥ[��5����S�?-
!��sR�����vRYi�۽t�������\lU�Y\⟔��\RVz{��E�ˋ7�pfںE;�EgTi@iQ:��#Ƣ:�7$����N(�|�hU�B6�@��x340031QpL*.)JL.qI,ILJ,N�+�(`�n�}���{�T5k=oBԻ���i��y_b��z�~��r�',�B�x��$�䀕�����߸��ٜ�N��<;�˺��-t�x�340031Q��KI��+�(`���b/��!4,2��e���S��B����Y��f�3o�Ԗ�ݹok8n�x���H��x�340031Qp��L,�+�(`����{�co��+=�n<gQ�\��X�
Vu�bSP���3�6M���*�S~�TUPjn~DՂ�~���zzM��'��~qH�6�0{�x�31��̜�b��!�����o.<gpXK�H������T!+??7'���Ɋ�7[�U�o���K�s�g�'!?�
x�340031QH��+��I�MNL�H�+�(�-)�a�Rp(i��9����5�#�[>��B4d����$����0�Y�U࿙����l����.>�ć��I����.�\��%W��J�XM�@�,#����!-4��>�ᚉ�
�zx���Zhj	�>ߢ
x�340031QH,HL�H�K��Kc�l�}�g\M���O:M,:��2=f����8�4ۨ����'����V�cs7��4Ti^zf^D��ԗ�-��۲���ڤFCoUp�J׭�^ub�uf�ȹH�$�Y~g�M+C��x�31���ܜĒ���b�
��&Ǯ��8�ݿl[��܎��>�x�31��T��,�]\�ݖ���g�J�V��cv�	x�340031Qp,(��LN,����+�(`�XzQxO�ז"?��|��k�7 Pp���M�Ka0�����&۳Ǚ
鿙g����Qᕟ���Ȑxl_�ғW����7��qqQ\�XDApenNf^vjQ1C��Sy�+��V���7C(d*�fS=�x31���T�{��lI��^y�_w"��
��C3����ҢĤ�T����������NΌj]�9"��bV~^^jr	������K���wEq崵k�!*\K��S�m[k���/ͧL6z^|���t�׊�Լ��<��S�J.��2Yx�:�2��̼��"�'��|5�/�1x�]x���>�y饉�{$���j�qF*��i��֔�N�$ �4=3���������KV,���Z�r+DApfI*�4�N�\�33��I�9|)��LXjș��@ɼ���C��
<�߷l���bLXF~q	ßȤ��Z�Lb5<\\�{�`[<7ޚ�x340031QpL*.)JL.	�,I�+�(`xj|�I��k�C��ڎ5g�k�B�:g�&g{恕�޼`_��u�&�����,_����e��A�kxz�r�����f�OQ�|w\�'�>LaQj"��vnU�:/kF�4�WO�(�CU���BU�j:ꓳ���z�	�,��w�{�U��W��&����dukI�*���.�ͻW��T����'����q�����pF�W˓W�66~�����+.I��+�<kۚ$��m/�N/[�9�����Pe>��%�y�`e�:�vL�
K����?;[a�TYH~v*$Ծo~�mx���/��w��,�g���>��x�340031Qp��L,�+�(`����{�co��+=�n<gQ�\��X�
V5�E,c�	�;�'7��/���*(57��j�Q?�Ks=�&tr��Mr�8�60��x�31���ܜĒ���b�i7�̝$�(�(��L�7ek=���~�x�31��T�i>�:����*Z��Д�=���T �	x340031Qp,(��LN,����+�(``�Y$�k������K�>�U
W���s~nnb^
CaF��Uy�ӿ�,_�i��s��
���ܜD�Fm�vYܪ��X�}N��g���9�y٩E�7����y�6�ݿ��w�[�k�=V�x�340031Q�����I,���)�M��-��K�+)�+�(`��z�����c�����iW<v?0�ԕV���Z�_�
����d�Q�T�]z�ײ�<
j�*]�x�31���ܜĒ���b���]��xN1��Ѧ�l��}[>��W�x�31��T��W�6{66{oY�r����|��ѣ	x�340031Qp,(��LN,����+�(`�XzQxO�ז"?��|��k�7 Pp���M�KaX�6�����=���u��l�:��+??7'��{���Nt�x��4��q��u���9�y٩E�7����y�6�ݿ��w�[�tK@-�x�340031Q��KI��+�(`�Q��i��^��;T���9�ʆxC���Ң�T�"ÕE��UC������eF��9�#ǣx�340031Q�N��+�(`�"[S�V�=�g�s��9��N��
"�x�340031Q��+.I���+�(`�1S���Z&���];'(���,.4�(��,.q�*k)�/��~��#Ӕ*�G�&2��C���e"�'�N�w��Ђt�3�_Rd�?	�|-$�x�31���ܜĒ���b���w��
_��G}]�5z.�=��z@�x�31��T���E6LӪ*<��\����z�
����x�31���ܜĒ���b�s�v:}\�]B��Q���1#�x�31��T�b�=��"l��.�4�1E��
��x�31���ܜĒ���b���ϫ��,����}r�뚤�}�x�31��T�?;�n��n�U�
;��1�Y�x�340031Q�K�,I,))�L*-I-f��.��5�i�G��[>|�/j�����
3J��z犘�-����,�r���S+fe����2�yo���Ս�z39�6I+��>�*gG?wWw��q��qbk>7��p�vx9�s��B�:�� O��O?�R+!/��S�=�ė������ROgW�`W�ögj&��d{V�ܳ��j)�|�*TI�����+���[�'�o�1��Vf��GFj/&e�1�^����$~IAY{�joC%�r2Ԉ�܂���"���<���I���x�!t�O�Y�{����'g385>T�y��F��E�{��2�m�
���RS�3�K�
��6_����T�ImW���¼J}�e�E����/x{�0�IF��^�Ԇ�l¬~�x�31���ܜĒ���b��9ON�Բc#[�W�ċ��J�!�N�x�31��T�9[��4��X��ƋI�8=�����O]�	x�340031Qp,(��LN,����+�(`H�P0�[�6�].��ŶN
M�11���ļ���?�6*Ց���ͣ��=0I�������Id��A�ȧ���7+-��rx}�b>DApenNf^vjQ1C�M�%*+|���|��D���w@'?d�x31���T�{��lI��^y�_w"��
��C3����ҢĤ�T����������NΌj]�9"��bV~^^jr	������K���wEq崵k�!*\K��S�m[k���/ͧL6z^|���t�׊�Լ��<�Y�.m���s\���w����]�Q㖙��Z�P$z���*���r�Jً��u�@�$楗&��2�;�{m޾�iO��<׭��tm JrJ�3��r¦�fo81����7)|�(�,Iex|�E���j�i�]��4xH-�LXjș��@ɼ���C��
<�߷l���bLXF~q	Cin$G�ٜ]�o�W�[���t�VqĞg�x�340031QpL*.)JL.q�(I�+����+�(`� ���b1O��3:�͌t�>�_i��Y����
VfX��K�AI��R�,��MA5�Z��\��$���y��v���⒟�L&[v&AUy��$�䀕y��q�4=�{|U�<��wn,��GU�	5�ꥷՂ��?�X�(���	�M�@��$�(�$��abdSc���	w�����/5-(5=��l��2�E_��d5�D'��h6a#�
T]penNf^6X�g�i{c�I��9괅m���eYPe�y�H�Hg;(<��v��Kv�L�R��eU��x�340031Q��KI��+�(`��������$���;/���o�E�E�`E�&��7�:}���C��i��6�*"x�x�340031Q��+.I���+�(`x���t�w+.�ҍ|gOf-9q���'�������oxS��n��SnI�X�et�,4/ɼoru�j��R���>݉�Nڳ���/F�x�340031Qp��L,�+�(`0����G��G�G{���:jQ�\��X�
V�9�>�cZ�R���2}n�޻�*(57��*��!���;�J-LG�TeN�}��.Ҧx�31���ܜĒ���b���颕��	t���x�z����x�31��T�be/���[��zJ�:-~����	x340031Qp,(��LN,����+�(`H�P0�[�6�].��ŶN
M�11���ļmm1����S0
8����V�� *���ssL_-���eq�ZH��c�9�W�AW��d�e�3T�d\����
O��w�JT��nq�=ĥx�340031Q(��N��+�(`���a�U���~�Ж+���*�=ףx�340031Q�N��+�(`8�z���o�O�7
�K��+��
˦x�31���ܜĒ���b��7��=�H8��O�P��˪�Ÿ��Ӣx�31��T�/��̯�V�dI<w��/g!ƶ
�x�340031Q�,..M�/I�-�I,I��Ma�s�]ʤӶ�oo�3F�^~#7������r�ˋ�]>�� �e�e����6����?9�#լx�340031Q((���-J-,M-.ѫ��aX���Ѧ�WjssJ�m�SvLj�Ԧx�31���ܜĒ���b��}��U����/�T�…��k+.��x�31��TV&����G9߮e�sځ��S3��.�x�340031Qp��L,�+�(`����{�co��+=�n<gQ�\��X�
V�.�*fב%�p�BTd���#��&PUA���eU���_����5��۞�o���!��H-Ħx�31���ܜĒ���b���%�v�*�����{�ts�s�j�x�31��T��+S���;�u{l�loש���[�?
9�x�31���ܜĒ���b�M�om���n���V4��R��WH�x�31��T��վ�g�X_�zK��E�����W����x�31���ܜĒ���b��R�;_���|��z�W���x�31��T�KW~m�\[���8����t��(N�x�340031Qp��L,�+�(``H-�m��Mf�q5y۪xoyAfC�"��ĒT�*v�V1��,��k�"sV�1�7��
J��/��Zpԏ���_O�	���}��/�_�\(|�x�31���ܜĒ���b��.������H3�f�y��vI�x�31��T�s�]���szU��%\��?�ə��x�340031Qp��L,�+�(``H-�m��Mf�q5y۪xoyAfC�"��ĒT�*#�#����.r���FU�ݻ�T����
J��/��Zpԏ���_O�	���}��/�_��,��x�31���ܜĒ���b��E��6>X.|ĭ5��:ʌ'�/;k�x�31��T��~�a�6	;yw��Y�~�q.���x�340031Qp��L,�+�(``H-�m��Mf�q5y۪xoyAfC�"��ĒT�*is�o7V�����H���'�PUA���eU���_����5��۞�o���!�F:*V�x�31���ܜĒ���b��I?���fY�>~��v���/�^i¢x�31��T�;:F%�_˱HH۬Z��m�:.a��x�31���ܜĒ���b�1�k�r��+��~��[��F-�x�31��T��������&���O�T��Y��:ߦx�31���ܜĒ���b��yK����Sr����'��2����x�31��T���V�|\��z�t7��^��X����x�340031Qp��L,�+�(`�]�x]�چ]^u�l_��C�"��ĒT�*is�o7V�����H���'�PUA���eU)\���,��Wŗ�g?�ȟ��*��x�31���ܜĒ���b�k˳uר�Y��J�����G��x�31��T�U,�NŬ��ͮ}��St��ןÄ
��x�31���ܜĒ���b�`u���4d8W�ʋ	�m_�]W�
��x�31��T��ɳ��}�غɼ$���$�-��/��x�31���T�ͫ��-���}+�vK��9�7z���]K��Sl�͏2k�[�d�����~�S����ĵ�$5�83?���<�F��L'��#g���q&��-3/%���Tu��J������S� ns�>DA@Nizf�rF��Ao�-�������W��C��%�%'�B6�Jݮ��~���_������(����P�W�Q���:���2Q�������|1&,#���Ꭷ��b}�9/�v�N�8�qm�x�340031QpL*.)JL.qI,ILJ,N�+�(`���^߰�	��6���E��F�d0��w)�/��R�<��J�t��9��ϝ��T�g^qIbNXY˽3l�Z��[r�wWVx�3���/��x�340031QpL*.)JL.	�,I�+�(`�X��U���Պ�r�����8����9#59�3��m3����V'��57NZ��g�u�,?/-3��b�A~�Y6�-�4WH�ث���;`
�R���Y��8W:�sv�ɱ�E��Ew�U咚�
U%ٟ°�F_�J��gK��/�8� \UAN~%X�d��#�<7O5t{�y!�v:4xeLU~y^N~b
X�N����l;�}���fK�>B�y��$�䀕���)�;�#�M1��gJ��j�2���̼t���׃�{*w�O*<f/r�n��=S��B�S!��{��e9O��-^y��{~��-8�	5$���x�31���ܜĒ���b�e�ڹ8�m�`�LSp	��JǢx�31��T��G�W�?<p��uڨ�^�yY�,�C�x�31���ܜĒ���b�O['��j1�pO^|�Ŝ���/�y
�w�x�31��T�'��~!�/Rݽ����
���x�6����/d�+����H9�-�S
FɄ/�Cq���� �Pq&ԗ�O�����H�3��x�31���ܜĒ���b�0C���N��ZR�qj���:%U�
+�x�31��T�����6̬�߭�Vx}��w��&�~��$x�6����/V��d�J��VL��o�rk�Cq�!+>��z�s����k����H��˦x�31���ܜĒ���b�㛡���7��f)�J%w�n��Ȣx�31��T��O?Ήb;����K��|�����x�31���ܜĒ���b��9v��3��/��6����/�x�31��T�����?�1ͣ dN�Fq�LOk�c
��x�31���ܜĒ���b��s~e�t�u&����o��!?ݢx�31��T��q�?��,�0R|�b�+�1B��
g�x�340031Q�,..M�/I�-�I,I��Ma�s�]ʤӶ�oo�3F�^~#7������r�ˋ�������{rq��*	���A/�")�x�340031Q((���-J-,M-.ѫ��a�^S��*�AeΤ,o���]7O¦x�31���ܜĒ���b����5��(~P�]�%�śe=��
��x�31��T�?w�Z�`��粋�O{Ǩ��H�x�31��T���
�=T	��ic�?]��v�w|��O'�x�31���ܜĒ���b��^�,:Zz�$CM�K�i�.Do�%Rw�x�31��T��>��}Xe��PQb���%�0J�x�31���ܜĒ���b���v�P�_��9��uN�=���x�340031Q�,..M�/I�-�I,I��Ma�p�[��r�H���}��7M�@�<�(;-'�������=��g9?|��;��ÿW��|#y�x�340031Q��KI��-���ԫ��a����]�&_&��Mח�BT���������ծ��hS�+���9��6ԩ;���"��x�31���ܜĒ���b���y�VFw���%6�6U���o�
âx�31��T�A���K�F��&���X�
���x�31���ܜĒ���b��1�$�e�6Mym~�źcf�/�
�f�x�31��T��+^q��a13������`����~x�O�����8yT���O�`��tY+��ө�L.��W~�W7�<:���7�n���
���Y�fΞ��Lp�h��Q.�$ܦx�31���ܜĒ���b��LU|z�}����S��%.	�c��x�31��T��go�n����r��{�YI�e\��:x���<�y���K�;^�sV5��4����9h�O #�!��x�340031Q�,..M�/I�-�I,I��Ma�p�[��r�H���}��7M�@�<�(;-'���a�m����g�o���r� ��v���"�x�340031Q��KI���-���ԫ��a����]�&_&��Mח�B����������ծ��hS�+���9��6ԩ;���#�x�31���ܜĒ���b�b��S9�t�j���5�5?e��
`�x�31��T�z��O/2�n�6���3�8a�&����ux�4�����~�W7�<:���7�n���
�,cG~��P�3R���orWW�Ajy���9x�;�|�y�FFn+�����><�K)��u�Y������cx�;�|�y�FF�쥚
BS���t쨹��5��B)k������
x�;�|�y�8c�Y�y��s���y�}�����߄fh���($�����e��1TH�d�ԋ�6M��˙�z�6.]aN~r6C�۩,��wK���o��=���~��ZF�z�~����;����u��뾚��oS�8���"x�;�<�yB��E��"�lͩyK��1�do^��^��۔:�h�j�Nx�;�<�yB��Eʌ���Ax����� ���_���P�ɩ
�c��Zɵ�-�kx�����<l�iм͠	ҹ�⦊��.��=|��x���<�yC'�H��']?�غ�*[$��-�.�M��>x���<�yC'��٥"���>�w^]�ٮe������gx���<�yC'��Qn�=J��~���X��d]0{��'����x���<�yC'�ȗ���V��%y��F��
�(��S��9x���<�yC'��w�-
�_�~��� �a�������bx���<�yC'�H�Q���	��2/������ct�
���x���<�yC'���w�s~�	os�b�-�2&|�	��4x���<�yC'�H����;�1�+�>yh�ouI:���2��x���<�yC'�Ȟ����͓�uAʧ`~�z�����Ex���<�yC'�H�b��3��,�s�cE��Y��h���Mx���<�yC'�ȷ;q�q[��{^�97�Y��˪_�B���Mx���<�yC'�HZ�e�,������t-��@a��(�-���Mx���<�yC'�H��+�‰Z5�gh���Xn��
��vx���<�yC'�H�S�R���Z,a{���p�c��"P��x���<�yC'�ȇ�]	����s?�{O (��hr3�����Hx���<�yC'���_\76�t�,ɰ\a�B�\��'+�����yx���<�yC'��f�b�u�x�d�\;�-��	�O��
f��,x�;�|�y�FF�dw������?<�(<��#�����+x�;�|�y�FF�z�~����;����u��뾚��o�(W��*x�5���������B��%[��ɱ�:֓+�`��y]�:nyZ2�[���o��nx��������p�󎙨�(���e���w3�C�ox���������	��k����8E�������x������_X�������>�j�����4��Dx�;�|�y�FF�rN����Y�_yl�}x���u����~x�;�|�y�FF��NA_�jk����yoU����(
��|x��������z6�5��I��8�|�:�����6x�L�����8���{��o	4!�1/3Q9s�$�L�\I��k�w��1��=���2&�
��w��}N�ON'�ɵsg4�C�!��[x�;�|�y�FF���]�z��n�[������
���x�5����Uә�� #+�%��y#c�+�dk�b)<9]i(?���l���D�Dx�;�|�yB����.��̾-�ޟd�j�~o�������ox�L������59?��O���J6A<N�kma���R��v�d`Q@�36o�}4��c�2�MA[�+���<�E/�bJ��Ix�4�����59?��O���J6A<N�kma��k�y��m�M���o�i��;{c��Hx�;�|�y�FF�m:����'�+2#��M5�]��
��qx�;�|�y�FF�L���}m���ũ9~�a�5m�_M��}��x������3���@c��&����D��x'��Ex�����������/�f�m�ԓ��h�C^��px�;�|�y�FF��U&v�t�e}="���\�%�w�
���Qx�;�|�y�FF&�Sv�m��g�2��YF`k�>�s7��zx�;�|�y�FF��݅��~N�or/�= �Q�8��~��#x�;�|�y�FF���\�_N?��3�Ŷ��^����

���Lx�;�|�y�FF�g֫�o�2]0�`٩`)An;E�W��ux�;�|�y�FF����'��tHl8�-���`~�L!�2
n��ux�;�|�y�&Fa�P��	zs�c8&���2��o
f��x�;�|�y�FF�['<�i�v[@�G�Yݒ�Yrś
���x�������}��|���o��I��������7x�;�|�y�FF����GZ�相N��5�M�����6���`x�;�|�y���Z��\󺅖�՟�Uδ�5cj�F�JFʢ���x�;�|�y�FF�س��s2��n\u4���f�S�}���5x�;�|�y�FF�K�/��x�z�~��L�9f�����~x�������$7]V��p��Aٜ�8B���O��+���x�;�|�y�FF���"=�ro��n�ܘ8���Y��8�~x�;�|�y�FF��+ۂ�k��-�y/���|�6�
��x�;�|�y�FF��U&v�t�e}="���\�%�w�
���nx������ħG�3��
��˚�`��

�+x���<�yC'�ȼd��/�Z(��(����}��U����Ox���8�q�����k;�jΥ�>�١����g�v�j����{x���8�q��H��.�~�t���t��\).1��
��
.���'x���8�q��Ȣfϯ��Nd<Ƙ�hSV�ml����n�t
>���Sx���8�q���!6u�=3~���afY�,�]u�}���@����x���8�q��HNδ�?&�1;|GP�澀u����n��
����+x���8�q��H����37�ص����\���n������Wx���8�q���� ��������^X�����D_7�����4x�3������H�R�I��-��@r��,�+T�-�����~�#�%l�X<W<���vx���8�qB��tݏ;��{�e�"&坪9�"l���jx���8�qB����V��8�ͥ�??�/��|��<U�
6�*x���8�q���L��gڟ��1v�M�pz������I?��jx���8�q���ja���m_�j����V0��
��
G���yx����qB��\rw��U�se5|�ڱ����5�;�a����%x����q�|����;����\�?\��~�f������Qx����q�|�����R�+���^2a���嘉�=�a��,x����q�����{Uyz�sB�gF�.�`5Q�<�(
��Vx�6����-ۇ�zn.��U�SiZ���XP:�,s̨��~(����!�����H�<��Dx����qB�i��W�R��/<����8w^~une��(䔦g�1��v~���pɊEW#VT�]n�8%��Q�Kx������S������-���,����U��Hw[�wx�3������Ղ�Z,A�w]�q�%��-�,��4P�;5�	у�=I?�g&>����HG��8x�K�����;z����}b�6�Z��-�
��?�OPx)����+��8E%�_%��{��4V���$"�#$����e�My�B&#N��x�K�����;�`znR�\��<�@�ї�OP1���ЮG�W�zLx"��T	ؑ�4`��ɭ�_�FI�0�N!L�"u��ux������S������-���,����U��Hw[��ax�K�����;8Je#>1-���aN�z��OP�Ղ�Z,A�w]�q�%��-�,��4P�;5�	у�=I?�g&>�����!��Zx����;�u
��ŝޯ��(�-��O���s��x����q��H��Ok�ΘuF��;�WrG��D�5���+x�3�����*��v���5�
Fu�)�Y��ɑ�4V���$"�#$����e�My��H��yx�6����;z����}b�6�Z��-�
��?�OP�!�Y��'d�|m��u�i0X��HŊ���>x����y��M�i����էW����4)ڞ���$��kx�X�����y9Koowa�1�}�*����+P&�6T40000 Site·�ε�#dY�蕲�Q<�R��4���<�?�|����GY_��&���x���x�q�1��kGN�=��M����=?E�O���x����y��M�i����էW����4)ڞ���g"�-x���x�q�1�iG�p$�]�otK6�!�C�rN����Tx���x�q�1���Ɵ�M������!
!����'x���x�q�1�
�ޑ��8�K�l�ӷK/c����
����&x������H�E5�mǪp�4��ؠl/���� V���!x�;�x�q�6��?N���ni��dcʛ{%�\���2���Jx�;�x�q����Eo�yzl����of����ʉ�3�
e���Sx��˴�i�V#}'��W�J�"mޯyT�R�k��������x�6����g����䡏|�ۃ��Xm"��{:Z��NTh*�°G+�ڀT��t˹c�Fx��˴�i����ǥ��[ן���ڟ��\�Uщ�/���*x����g��Ek�S�c��N�J[���{�����Vx�7����g��Ek�S�c��N�J[���{�U��5���9D��џg��'�����x�]�����g:�	5I���cle�}X��X�100644 Delete.php���Ll�4ƯK��8�6�_H��a���piI�;=b��<���'�7&���1x�7�����hY8#8vE7�l�%�t���a�R���c]x�~v~�z�lV�'����2x���4�iB����(^����E�7�k�R��N�X:�;�m
��`x���4�iB���S�G3ee�&��.���Q�X:�;��
��\x�)�����Export.phpX�*Lӳ���#���X3Ƴ���Nz+���*x���8�q����kG�n+\�vo�z��zΉ�n������Vx����9�f�F�9��f����'�+��:�MF͏U�Zx���8�q���ja���m_�j����V0��
��
G���yx���8�q����	�-&yK?G0n�;�h�Jn��
5���%x���8�q����K�zw���s4cgCF۟艾n����Qx���8�q���r�,ۮ��Hw�y|����r���n�G
%���}x���8�q������b���늕���7�+̟��f�������lx�'����[Dump.php��}w���c=���I�Ω�v�z'?�����#x�[ȸ�qB����3����TU���"?m��*u�h
W���sx���8�q���e1�����4�_�1��~.���D_7�����x���8�q��H���tgίQo[�p�Ӽ]�r���D_7�p����Kx����9�$��㑖v��i��@r�MF������yx���8�q�������}	o�L��]\|���U�}���
J�,x���8�q���n"_z���4'��ʄ[3>����2��
�;>���x������@&�߯��� �w|���&�+hא7���Lx���8�q���t�f�#Ϫ7���d�}��7C�+r���%)��
x��d�d��(�>�s�V�5��e�,���P69�QҀ
����ix�5����%�
��^�ސQ�r��ń�۷�94!H#�U$�Ƶew�C�-�x)���x�[���qB����^�5zw�@�ӹ`�ܨL��m���.x�[���qB�Ⱥ@�/�45�Z��N�ʎ^�)�Z�8����Wx�3����C��0�+h�I�kOM�W5<C�!�Lj`��m$��k�R	���Cx�[���qB�H�(�
%�5Q���Ư��S��f��
��jx�[���qB��R�}�	����f&�,yxxn�����
���4x�[ĸ�q�����aîgWZ���_�%2^A�q�n)�6y��Gx�����.rxu�[���5O�^�3�}U;���
|��mx�����.���[z��N?�=����(����
���x�����.�����>KW���\c7Hk}�
��Y��x�{�����}.��<�����9F�{-�ι���\�[���c,c�zo��Q��r100644 Versions.php�p���&�^,�+�0eiΊ�40000 Vhost�?G�3���Q}*&o0��Si��6���'x�7����� %�ްol3�h�u�B��h�}��p��b�=���2���Z�)�9H���Fx�kdndޠ�(�}�FEF�'�0����z,J��l���QI��-x�]�����h:����<��{�0?�<(�100644 Create.phpQ.U��b�N*�z�x)j�y�V���`�zO���[�����"�b�N��s��*O��x��d�dޠ�(b��A�l�`‰�q���y�l�l�������Fx�s�����?��Tn�J^��Ӯ:�[�f땑S�;���Ԙ�)�6�a@O`ȑ100644 Install.php9���n`��^!�6�HQ���=8�x��j�GK"S�%/��T}�1P��/x��d�d��("�e��+3/�c�#�?����b���
O��/x�^�����;g��18b�x�<�[{~+��d100644 CheckIn.php�9 �4�~�������h1�S�:H�ۙ���Šv,-;�K��=L��'Q��x��d�d�`/r�RA�}���;�����j�Í�f��:
#�,x��d�d� !�cn�9~�h[�V��T���mԉe�P��Wx��d�d� !"ɘ����"���ͬ��:�%kS6��2�^���Ox���8�qB�H��Sy�+��V���7C(d*���
���wx���8�q��H�#��G�NM�6u����c斉�n�����"x���8�q�����/{���p���T��)v��D_7�M&��Mx���8�q��Ȫ�Z_�"��k$�}���]
�R.7��
��8��xx���8�q����-���
O�}��0��䧤O}��1H��,x���8�q��H��"�b�f<�l��5����D_7���Vx���8�q�������x��wR͙�=���n����� x���8�q����"�^��UW�_2�zh�z�v�VA��Kx���8�qB�H��Sy�+��V���7C(d*���
��Sx���8�q��ȅT�ǚ�"3�3�w�]�=�>��D_7����}x���8�q����T���
��m���&O�^�j���>���5x�^�����@=x<kL�5gS.l�%�=^a100644 composer.lockR��v�d`Q@�36o�}4�d�M�OS�F��O�c�fȡ ���"x������O|� ��N˶��t� �ٝ��3
���Mx���������k"����;�w��P9��	ˈ
���xx�;�|�y�FF��0��KN������>g��Od�\���lx�������$7]V��p��Aٜ�8B���O��+����-x�������B������F�q�S��~x�LI�+x�;�|�y�FF�ϳ*�U9~9��h��K�_�i��
A��Ux�;�|�y�FF��
\I7wg�6��^ɖp
�'H��Sx��������(�+�U��S��XȜ���~��mx�*���� �L!�4��.�Ǣ��L��jz
/�]�100644 c�($�b���&x�kdndސ�(�'2�Ū���'�X
�*������Ox�kdnd����ǔ������D!y��
C!���qx�kdnd����G�Q��e��&UM�jϕ/����	�^?�����D!y��
X�#��;x�$����&�H-�Ʀ��am�3�����W��'�Ӯ����nx�kdnd���(2;��tU��[��5�a�s
�OOe��
B�`x�K�����/%��D��z�$KC~�#�e.�Cq�Z��H��p+�Z
���4�W��}-���j'|�?�#��
�p"���9x�3������;�723�X�r���*1F���4�W��}-���j'|�?�#��
��D��{x�3�����m��[%����+9�F�8���4�W��}-���j'|�?�#��
c�f��x�_�����&Connect!뗣�u�����!����1|� 3��ҵ�`����]�CP�Ū��g'LanguageW@J����Z�3nE��-A<����&*��nx�����u�Ʀ��am�3�����W����" ��\x������Ϛ���^�U<r��!�I��_
/��x�kdndޠ�(��h��OO��ݙ^]�_fvm�dKF��
���1x���8�q���;��Ks��s?���?)�(S�D_7�_���\x����9���4���~�W%�V�?�}��MF�Ko��	x����9:%������ɒ�_�;&�הǑMF����6x���8�q���O�a�~����R�^��7#�Im����
���ax���8�q����'}.��1�ʧ�%DM9s߶�q��;�
���x���8�q��H��K��B�gjj���}�}H�e�������6x���8�q���0�ݵ�����
�˦��Z�\i�������Xx���8�q����-���
O�}��0��䧤O}��1H��Vx���8�q������]ϴr�'�?X�np�J|����
���Vx���8�q���z�5�3[=rœ���_	<��up����_�+x���8�q��H�����Z����oa�N����+r��x���8�q������K�$l9�������d�’��n�y���x���8�q��H
K�ۨ���b&'6�\?}�s�D_7��h��x�{��i����k�?���Y��t���E��5�
���Fx�+,�+�ɤ�s�s:gsՃ�ŝ�[���
���Jx���4�i����c
4��Ȋ��5�g�'<�n
H��qx������!+>��z�s����k����H�(��~x����/�{��g�ԩ�u�d8�D[�r[ؑC�с|��x�6����/d�+����H9�-�S
FɄ/�Cq|
�,~�#�$�V��~F��H��$��x��d�dޠ�(r�g�C-o�z^�:z��?~No�d[F�����?x��d�dޠ�(2=4X�i�|�k�R��ȉZ}��m}��	��Yx��d�dޠ�(�{����\�^���-�dVyY-;ٖ��zl�Xx��d�dޠ�(�kw�{P�"�e�����o枾��d[Fɖ���<x�����.�!�"˅���=ܴ��-){-��}��bx�����.rD���ß��]�k��&�9���;
(�Lx�����.�$�c�<3dc�ǻw?��\��˺�x��O�F�w���r����S%8��u��n�S�"�L�:ߌ������{�i;TwZ��7�k����Ų���WE�p���,.����;�+��{{���~���|��B�</����ʷ/M�����,V��E�&q������3��I�{�1�����g��8�<�5�
py��%S�L�Y�w��˻���
;a���ތ��@����J3X̅��s���k3�^F��B�㒳".��J�ϪE��Y*yR
��D�x!E	;��ES�c�h����9�</0�ͬ�����!��R��
͵���<��Ś�^›j'#���S0���g�ET���m���|�eZ�DR�\=���y�'��)�������M?��f��Mo�"�z��j�E�1�<:
Q)�͏��G�L����_[�xW�<#�$�c����\���W�T}��\�1�YDje�<ׯ������H��� ��n��e%s�[�7,�3�ٔK�@��<�Ӝ��,�D %�$bf�;,�R�'���	/�
�.9Ă0MB1��l3��0���>�A�@&���WY64r=tI�������������;�ި��'�t}ck�3���:V��Zc�Ws]���C�N�'X���!u��
@ .�颒�jҷ�-D��b�o�*p�y��g"��R�S��/�KCiZ�PIjP6��.�P�v���K
���Xw�r��4���u�a�A�
��u�;�v�KS/����E�
�g�w���~���e/p�(�T)V�!��y2�p}�q2�������O�/�v����>_�`�����#m�$������ƽ�e���C}Dٺ����4��ި/�@�!ڵeԐQ��u���m[Qm0��Ϧ�I+�W��@xk�i�;��Co�x�<��Үp��dj)�l���)�(��Y���,~�x���&�~��B,e���l�����t�gWeA�3�d�?�OF��WQ�mSJ��x���\p�i#�P��wDP���
q?ƊC����?�{!��W^>B�ډ2ϱ�}
��/�U�r:�,Ϳ�dD��v`�Y���|�����s;�OK�%Nל]hH��Rg��g�>_O9��Iѕ�/t)"�
���'$��"�,���ً�j�;�k��>MAau ��R��c�hGҡJ�ut��ɗx�UW��y��fNG1�bž�
4�3$�J{��8�lW��/�̡��J�
�znUX��2���q$���.��AE�P\�>+��S��
"4O3>�Ϡ"�wH[���R����!�Aן�
�# .�ch- �J܆[���Ǚ�Ͳ����$Q`U0�ql�=�Я,�������S�]�!�VI��b�"k���d	���G������s���;>�/B��5�C���al�v��Fs��u����Fh���#�KG6�87m16
j�!����q)p�m�ew���y)�^o_i2�>6BO�MN��w>j���X/h?�$�:@��]uH�� ~����m�]�[f�kMB��hsn݋5�v�|
�J�MƾӛK��|���=7����l.��Lsu஗��o)�@oG�l�`!ɪ�d0%�p���C�������N-��hZ�%t]�P�5�x��
 #˜�vf��̬5�V��bE�.(<J�ou�*����N��>��(JIkarG'|g��c�0@��̀�=r4]��	�"�%<\؁ߕya04R�OSf(�ZG
	���
rG���P\�P8�����b;\5�Y�%tX�pJV;�#��E�78HC�"ô�G���
y�vR-�pE�!�l���V�}I>�`��si��\��w8��J����[��Ȑ����i��G�?��{;��t�A{K!��Z�,��΍�>��N�Ȩ�Kn��ΝZt�@ܩ���yW�E�_+q'�&aCq�?c�P9x�V]}�?�v���RU0ˤR�+��4[ݹ���;���t� H�M..p8t)�~�pp��V_(O!����ᇿ
Y)+t��.�{�mƲQ�O�`�γ��
�S�����S�s��	Y
�ܠ�}�F�6�X�%O�0��
.W�B����X����m���B��x��Ci�_�ɦ�(E��t�W=��b��a]��QB���*��
��3�*}��t��+�M�8l4џ�A�ɶ���
��u�ƕ.��1j�AO?�5��;t�����`���2q��P|��5X���\%q�ՒgY,�j�vh�ny�ğy1��5�;�
�kǭ@��|�a?_ڣjw cSqk���p��R tWaPkx�?tn4gN%1ptКX@.[����O}��z������>g�Ł��Q�S����b{��TwX�uid��Sxv�r!��&��x]d�Q7Tк�M3W]w���ɏ����.���
��l�yS?|ե"v�a�"�z�/pδ|	,e�������-�Z��[��
'�#�n)ͦ�����0m�-�-#�����n{��}'���� a|���({�i�P
0$�6�[��t|B�'��W�S"^;�ف[�r��[�.j�\m��i���ֆlkg���>6%��Ҁu7^�R�[��/��6�\�:�/ch����F�5���7���a�e7O���7�����xz+�S�:y��sz#�4�G���#�_{��={veOpX��,�����!�G�y�Ǫd)|�Ϡ�m�\��o��E.��i���I�}���_�ިn�
x�;�~�}�4#��f�uJ)����&x�;��f��͏��x7gH>ab���+S����n>x�;�~�}�4#��f�uJ)��nx�;�~�}�4#��f�uJ)���Ux�[b��fC&7�Kin��|�B<wq�qx�[bs�z���b��y
B���x��d�@f���{�1n��)�$䝟_�㜟���\����7y�� D�'1/�41=�;�$*�O�̃(��+;9���cNfb1H��Xޙ��{9������)��mx�{ �Qz�$��R�?6[�3:�油x�Ymo�F����B))Ò��ۍ;=n���A|�)j%���*w[��~�=�o\Rt�4��������Z�:Ý��a�R�ڔ�|��pw,~�c??y����Og��")ث����%Ŕ]f�I�ًw�,^(�
�����_
�z����=�M���y�ެ'Xc�f}�}��D�~<���G�,�y��� ���B,�D	��𾟊B
�2%S�ҤE�&9�b]���|%d�D��a�S$K.W	޼�P^�0h�\B���;����Ng-9��,g����(x����b�VW������x���[N
�����=g+��2_gkE����a�<iA����L�ÉTe�*z0���ū���ä�����<��ԝg�
�d��d!�Χõ*���S֕��,�M�{��!HF�D�3�c��	2��|&y�f�¯���2��"�`��
!n�Y	O��M��"��x��\��3��)��z�l8d�R�4���
w����Ԝ�B�-ه�L�>^�>]缌��������<��B4��8	\�Z={l)�Ƿ��y2�(����>�<V�3���㪡P�AU�k�>�O�NĢ����Zɑѳ�\�g�$���t�.8%J>�$��Qrq����/�
�.�2��`������o|m��$�ĕ�Z��]J�e��NP�u!�L�7U��	
���}��
��7����MB���Q4V����ZdR�����H�^#%Ŕ���7�\E���G\�e���8��SR6i6+�`	���6���xoo��s	N��x�nQ$0KU���Y^O�uV��^�#pHw��;�}�
�:s�6LsB���Vh�L��l�Q)�ځK�s�A�ҵT � ��	�^��8��M��H`^:�i�-8R1�L.�:��_%ו1�J�k85ש��4Vj��	v��|�^���w�r��ݚN6�f�A�,�@q,�8lX��pl����a�KY�8�ɖtfJI�����}�K��$�\
o2o�
U`m�a��5�
��^V�ā�z�ҝ�1�*�&�,{{C��C�����Q=Dz�<x��\�x�R[�!����gJ2�2�5�^9,��dyB�0����k'`&Q�g��-�Ғ�H�&G�&B-�@(�V;���]�h^\W�Hi'
U���-�Y��
A����d:uum\$��bm���V�F��z{r~|��|sr1><??|_�������+�o�x�4�8�uF��;�̀��/\E��U�s��l3����"���[wD)�H_��|[ ��r4zwx��x��
�ԷA��H��Ljr�)� ��p W%�mG���M�(.U�-�k�.��u�.q����+�;�[(Gm
i�������t;[%j�-N���@)����
H�����ѦA����<��$�����c��Qc��Lk��X]Uu�;n�C���_b����Ѹ�?�<9=�{�� ^��
I��f,�2u��$ep�x#��Ǔt��y.&�wD=�Ȱ��%�JW�X�Ǣ@�\U7F����>?�;W5m�-�����I�ۗN�J�)�����̹���g3W��`��T�����}���GSK��OPC�3�=A�S7FS�c:U��5fm@F.��cc��A�ͭ�
�]���������G'����>]cmz-���
�I�A�m��y�'x����mb{/�S
��JR�:u�5��Q��5��M>���5�M����"�qhQ���1�ޅX�B�V�l�1�R�'�Vú���}�
<�K}uzo�;��e�,Kol�o��Sr�{bxw�k�����d�/QR<�����BUu�1<��tC�(Q�Qtu�@̖��.����U�Ά�u:b�i���w���5~D���H�l��U�"�Y�ýΪO�}�j��B�-ɞ��5�I���`KQ� e]?��(��E!�M���p�Z�Y�����P�D�|��~������0�yO�>�q��(�a��]�&x�J3<⬍n�/�}<TJ��	��lU��ڧif����T{"T]T�FT��1ڗrL� �m�;�
}�U!\��iU"��]A���=a����@26AAsS�����<��!d	��u��*̈́��&���S'^����z�Î�,!�z��v�{�B2Yzj.O��S3Q4_щ�\sJ��6�O�Ů
�?�4�'{7�k��єD�peL:wY��h�)I���\��*(SY8�.��^ ��\8������~��w��Z>n�H��ƺH|��	}G��v���
���??�8�|?6w�M��4��%�ϋ��S�R�~��6M�u����%��u+|��#:�i���
��L�}1k���5L�����fI�1z��O��ͯ�c]M�������@��a��A�1�{c���=������~;��QA0����*�zh��s�'!_/���
��U�	26�u�
�T-��'�գ.!d>n�^U��{;��uL!�jo���O�j+~o{�`5�?��m��}�.�́�+U6�z��Τ�j�r0Yg��F�4�8��a�JW�[��Ι�zk�,���4Q����r������<��p�a�/.��ߏ/����Jz���s��]*�\�_�l��	N��Qڌ��'���W����9�&�pL�Qh�gFdy|[%�^X�c��f�G8�t4��P	f2l*�}=ξM�)�����r����Q%
�1����>�#`�#1�F6E���0%��f�3��r��p+���;�nag��{���jU���Ȍ��nA��<�T�%}���T{���x�e���iVB�U��s)��x�?{9	SM_��p�ϞN/vġ/�^�)���5+x�
	��F�VLm>sU�:o�z�O;�|��A�R��ǾL�W�a�Z�xy�t,�3�1�g�����MuV�8B�f0U����e,e@>w>�ڨ�)��Ox����uC!�PV~~nNbI~~N�nAbzj���������BV�ɱ�<����	���x���>�c�c����ܜĒ���b݂���b��X
9 L�Ʌ���cYy6?fY/rB��Ix������y�s&�ɞ�r��0	nnb�o6��x�[kw�F�L~���V6�@�g�	MJB��
�O9�(��V#K�$�����EIvB��~X�b�f�y﷙���b��>z�!��a��΢�x�g��^_<}���ǟ'o�Y��7A��2�E���q4?������@�fE��///��0Hd�W��(����sǁ8\�aL����Bfy�&���Y��?x` N�b�<��|�[���H�8w�a��)P���(fR�A�&Q�"O�Y(E&iiv
�Í�$��|�˛
�ɞ���9<�����2���|�&��H�����bY��_'��&�����,
P~ۂ�e�]�g��M$|Ҝ��f걓�E��0�\�H/�8
�B^2�b�,/� ,ȑ�/�R�xdxXJ�HE��E�j����y�/�LP�L��P�]di!�B�E�h0�g�݋ ��F��H�P{X���]���6jy��려J(b[$˘�k`�@�b��:TT�d�LBꈀ�O��2�=�-�ZTrk˙a���n1�������e�6��`rkl��i�z���B�a)-�y�b���	eq��B�=(c��iA�c��=���z��e�Ko����m�*�jh[[�v�~������ɝ:b�_v&EǠ���g2��������,�p&�.�h����j$���b$E���$�qҁ�'�9r�(��E�Kx�Y���6�����ƃ�Ln��$���>\|�~fc�dM2E:Ai�E0�!A�K�b��s5�p�r�����0g�R�5��B�Z��$�A���BY����z��vcD�$(`}�רp✀c��@��y*�0��R���b�
�d�k�%�=��4ǩ`Ԛ�����`;�T_|��ݶ�����t,ρ�᪩�_.��V�������ݷ+�~�T:�`�ï0��2�G��j�;��G"򎁠[�}%��|��^�a��7��"��|�`iE��um|V��__u4ZD��������)�Otu�kR��2�if�l�l��lȲ�X��Tf��n�gR���T^
��.H*l���Q�Ȅ@ku�F�S��u���w/#�,��������������w*���U��EVE�#��Y����Xh��j��ƪ	?�j&���8���۷P����Ub�[�63Ebx��2��~SH ��#��d�����c��2�d���V�gA~d��V#�����5�G d�P���]K��a�W3����Qn%T���V5d	�Ne��2�[:j�Ʃ��Ҭ[A?ox)�<�%<��ő
�h7�W�y�:��#��U�f�i����dw|`��V��4����l0��2h7��9
QK49��[�<��ԏX�!�enm
���Y����*AW�~��r�eR�qz�봨>�l�_��2z����Z�z��ɂb�!��� qEI.�����^�@
VLz�q#J��r�"I}��6i�Vk��_k��ڷ5Q5�K���>4$V�0�ngدR�j)Q����{�2c)�U(r��^5�T;���?Joٰ*X��}n��"_�,�\?f��p���I�i
���+�u� � ĽU�ő.yֻ�u��2�3�9~�,�>�]&�)���*�Ea5W�����0%����/~>�N'���9un?��/ً(n�Ǜ�v�-����x�~%;:�W����4n�'��y��/���W)$��u�#w��:b	'�0�
�?࿕D665��	��W�	�����_|�7�Y�L�U*[tכl�S(GKAՇr�c	DE益����(A��M4�ڄ��d�߮JĤ����X�r+K	A�V�»������A8�c9Y��	���7���譱"LQ𢱃r�i~t��;�ql���,R�8�k�~�$��b��A�5KNiזH7�h<]m��Jݫ�LS�6���20�IW#u�)���4rO���Z��Ja埂8�y�Z���Zze�m唤}��Q�R�Ω��c���M�}�F�O�")Z�c���L�I$��0[�����GV���J��傽Z�&��2�h��	h�cq���en�^a�]�`D	�YqMbK�����>��:�T��@H*n����6�ՙ�+V�ш�Qn���b��pb^FL'�y����ޏ������tyen
����	�ֺw���-c�W�6�fM��#DȌ��z�M�4�^Y���Z�d����^'�fb؈��d�8!25����u��}�>
�c��FL��G;
�F�mc��R�2u����/�:�n
�7��`�����s��-db�A69Nuf��Gi r��M��,��`�<2[���y�6�9�]�p���<�$���3#Y'P]��k��wEN�|�{|DH,����-*tv�����/�QwzBp`�"Y�-��ԧ*�T��/Ҕ:���"Dy�U��j�Ѵ6u�f̍~^Q��2�G�9N]��3Rs<���c��X�, z|����P��ɚ�����V%�}�O
��~���9�g.��V[�C�r��b�JVy6����ǣ��{�������k�x�<��WX�S:�T��^���co�k�C�G�M���r�B���,�{��M��T���T�чUKI
_�������B����K�h���ZxV9�%��okZ=�٩UGi��7��ho��
�[;Y�Y4�����X�P���������i�P7e�͐�H�V�jTvo+���%�T���ޚ>�dU�]�=
�@��œ�}�+7�][r��
OwC(�7����=�x��^�k�Z1���9�͇v���\�������M�%}G�AxL��ÝJ�<T}X��\f8r��^�(��;/��;��r>�1�m��b1���ƛG	nrM�4T+;�К�to�x�roj�v	b{Ǻt�g����q�ɛW���(=8�)�%L[��.2�.E{]̑���:CvL����=�&��pu��zA¦���&4l��O�A�&<�Kæ������^P߀�b0
�\#��&ǒ��>�6��"
�C
���#�#�s��@��Q�1�5c͛&Uj�����f��*�;d���!a�;T���J����;���d�nn��C�k�e[�����
��W"k(���(�����	D��5*8v��o�N�ɖ�\�qq�8iO����eV��x�g@�].���h&$��b�T�����t�nBWB��qR �8h�R�"�7[.��"��ҟdj/�v�j��A@])���+�Պt��%��oe�Zx<��1��f�>u"
׫$;�q��͊���찫��#,���[�נp��ȅ�s�w�$.�fP�V���%�AN�?%�栮�$]_��	{�8��ys�h�AO�G{�J��GG�
�y+����u�8f�K7i�ʯb�} �Y��67y��|n�-���z�})qE��'j�� �"=Q؜����)� �̚$}��~�oB ���t�h��Ӈ�ǂ �|J����_;���}(�L[]�QYh��6�P[I���->��.s1�/6�͕%�M�w�[Vrzs0ڂ��|�-���"3�L	R^�c��j��"��b[	��M�����	��`I'��iBT+q��ŕ�:�yJ�T�q��9�U�D�q�;����im���t��;�L�Z��;�=9�:3tGI/Ǫ9O�K���TRL|�f2,��_w
�2;�+b��	+�bֺ�ɾ�C\ΰ\�����ۦ�p"d8K�I׾'�>�t�ZG����o���r�_Z_g����4=� ]�pE*'�i/稙�#��{�uSt<����|mD�l�mV��]�"��9�V�e��ܵ�N��a�
ū�� �b��AV�ld�Z�i����+���I�J�t�\
����D���);��9����QU qy�V3ܽ�|����[�"�9�ʣ���9�|�h�^W�F*��^������eq�9��n>��wq��Pj:KZ�C~�橈i�Qf�FV���f"k��2!c�B�q�������q;ñ��+�j�j@e]&��˼TV7��)��r������[\I�d������E���Cx����2{������ײj�&g��M.d����)������������N-RH,V(�HU(H,.NMQ(-N-�<�Cb�-�̌\�g+�p�$���ħdYO>` 9Y���>���D�.#�ؿ�$3?OCl����B5�P�`���	�4M�5�����nD�D�JIFf���!��J�m6�߯��N+��x���=!{C��Bl�/�)�F����x����(i����&����m����49O�g�I���œ/�NV����,�6y����C�I��'[*hN��,)�;�KX|���DD'�W0˻*��D&��M.���|J���w*L�,)ul�[x�{�}.kC?�f-��j+���4x���=5s���8�,�'�3ZON0�����p�E��jÿ:��x�Z[s�6~��QK*cJn7��ql�^۝q&M���ng�#S$d1�m�M���w�&QnR�}ZM&���s�A��|g���{¾�D����B?:.�1�x����;��o�s�3�<̔�ba��d9K9;~���!�Z�����P�Ì��&��G�~�$i���k�]�e7\�Dd���ې]?z�0^%zQ̆�X���LC-D��߃HdJ����L/8��LdI�L�BF�I��h!W�?����%Wy�7�k��c��K089O4��S(��W˹�V�*�t|�兞I���g�o@�2��T|ƞW���~këBU�O�C�=,[��LNB�B�H���B(���:y��2��P)v�)�)�w�g�b�a����2�t������0}y�^K�GZ1-�Z-�$�6 &n!��	%IOned��Rhl�1�}�Ђ�F{k�y�E$��'W��>LK�%�c����۾^$ʞO��c�Kأ�B�~be�Y��A�p����W�D�$�r��bN:�s�yEnh�'�u�@^��)u�qj����D���e��6{���"M7W��[����^�=��9��۳7�'��޹9��Gzu43?��H��Y*�>̤��ć��2�����kQ�.��G��xW/_�<���U����!�1K�,�,L%�U���\�R�xq�b�V�������;���#Ha�)��2$O�5L�Y�H!ތl.��x�߆�p5do�&b��kDơ��Ps9���+Op�$����.��l�DɢBi0]������
T.�L�}�5z����2-��ɣ�`���}�����@����?���0^��e��q1�:L����N�DcD]w(��b�3P�Lhf�����{-n0TB�{�
^"�"�de͗Hk�<T'�!Yd��z�oN�.N����v����sv��=�sﲾGi�ا�L�X�{I2��5�E+�IR~�W���L��ӃI��!�؞�zG짣^�9Ȧ�\fG��I�&� rQ[r��	X��$��=?6Uɰ���y�����w<*4��5)�'T�"���).�?o�=%�r{	�(��7߾�W\��kz�`�(���0�S0�"6�y�:��z�ö[�fY�}�����렡�A(�h}��DMQ����n���.OQ���.����M*��w�U��p%�G��g���@LuȨ��߇�m��ξ(�ҡī)�NY��p�ȡ0>��B0�u���{:��a�/�o��7>���@�#�����(�y!�vp@[��!���wl��dL���l��y��4U&�ܖ$��[��R�B��<^�<�H��g����؊�>5��Q�*�1�e�ٷ̳�f%���Ixۯ�S����6�B8��OT d�����b3��P<�5��5�5{�!hS�B!�R*n��a��
᭐1�m�$3ﳃ$���$;���%CH%/�u!3�g�s�4��B�2(.b��{3

y5z�tx�������|J�O_���M"EF	ў���Cn��Mb��f�y�о���c�-���Y9�"Q;�xZ�z,nx����}ɗH4S[۪�G��L��FF=H\(���r�a�\�B],G�R�vc�v�pT���'�v�%��S��;]��Hqh7H��dH��Tv��9�BD�QXh��0��J>�ƭ{�kV��V20�T"k�́�qM�G�o��K)�=�d��� Ϛ.؈�����b)�Yװj0�IAr�����E�$��g�X6�����%�`�%�'w� *)p�o���,5(�?�
ijk�ȷ^>��&|M����.�v�R53�F���'����F��h����*;?�鑗
7[��N��V�!���y���q=��5 ���-�j <W�oZl_�鑼��jO��g��[���i`b?��q�Pϑ�TKA<s�T/��~�r�~*y�����-n�1�#6�	9'��!	m��fk�lq���d}k=q����*���ιA�i#`�J,B�QaT���{A�a���Сfs��T�߈�@2��g���7�NhY`FL�ѧq`ߌa���;����%'��=`Ӂ��,2�j�z���2��[��Z���
���ܵ^�/�D���/�?��1zn��k�sx�N��������o�
�2͝B��ਮ�˜�~����L%z�>�K��f�_���wP�4�njb��T#����͆n�6�3	��{�a&��Ko��Kd�������D���Ì�M�Y#���`�,�Ұ#�2 {oY���s��V7Ydx�5���哕�'FRWV�t}s�G��稹��[��r擵]!�hM�׭�R��B��Ɯ�Pxۜw��+�5�_���mNSY�몺Ϭ�Ю�ü���O�?�W���[�,p%��ϜQ�m��P
:�ljm�xuw��)��)��i��=�3�UTg��JZ����J�C`i5�����b��V�`�֎]뉌wp��N4q��qk��p�'�����u !���B�^c(�
b���E���X�f$�آE�Ƹ�������V�B����g�*p�
U��<ECJ��m0֫56Ȝ��c_~�ڸ����
��%��n���%�}˳og�����d	�>3�����-����y�,�#�j����ĵ4�
_c���Ȏ$�!]��O,4bYU�S.�6n��r��VVfn0��uzO�_n����[s|I—ڢ 59<P�<Lq]�����޺�L׭��:�z����y���c�Q��/*�oI���I���+;
�oLj��`1,�8EQ�}t��������7����+v��r|�KR��.�$#����SO_�D�,��oL_�(�J�7��(��S���3?�8g���W���i3�PT�̛�k�ڃ���?��I�(��'��h'��I�8pp$]���Y�
�1���d\�n�@���tV�0�}DX��Jr�Ş0�j��1�{FV+��2�`V����4�Aw9��9n��^u����Č��}�.GbB��F�_,(#M�h��G�i�Ɖؾ�F#p���W�Ks�a�$����ǝ�q����;x�I���O�E��
����!"Your new Joomla sit�@��L�z��m��<&�I��� :�K����x��W�o��lU�#&�$���d�+*�pl�%J�"W�� j�m��pw(���Y�̒fPW=��59��)�k[�R�@�r�=�^{��{3�$%��<�;3o����7�O������%u���vBF%S���Z��
�M�&#u��!#
&�럒6��}�"�Y��Vv�9�Կ/�c��c�`�4�'�zJ�VWz[�����!�������2���|<ޠ�����I[Ecʛ�ɻLءH�\�Lm��u��…�F�[)T7����Z������!'v�Go�g�I$���**�0��L�5�o��G��k���u֪z=�:g���M�`N������ѺO���l�j1_nV�j�ө&��B}�Ԓ�Y�`��&
�B���
�.���>��CЕ.�B��fR`��gظH /� |���5B���W�w%�v�8�A#O�4dV'���	9��0�Ȃ�Ţ��������G
7��n�8�T6j��h��		�oS/b�b�����E�P@��:_S��r�E�x$	oh�:J�](ډ��R.�,�A�m ��GO�E�#�ĸ<�3(�nr
��;h<Գ��(֡�":���*d����3�1	�T�_�u��d�Z��� ��`�*o�Ȅ+c��:�+IO���7�csu0��l�|��!�IlE��U�,�*����T�XX=���$>m�
�V䓓G�<��}J��s�����Ѣ�}v���oB4�
d���PF�#M���s�˜|U�\W����Gc��Q����m�O��f�W\px�E�#9n#Ϩm�@
H��C7��K�<��M[u�g�
9�~9RM(QzG/] _��B���{�&�M����Hz=�%��%j��/&����9* @�3�铤�B���	Flٯ�[����#�M)�r�C����C�wxx@pF��My���^���n�k�wҎ+0��^�|���#�￧�.�(A@]l��ʶ���B�%�O�{�C�l6܆kk)w=6$�
Wg��ܭ*d+T�ǡ�.�:*�6��ba�5�t�1�4��tms�Ś��YDQ
ٓ�������h���T-�;U�|�+�'
�>�?8�����{C�A#��`��U
��g�n�
�m��awC4A�x�/�x�Q)��p��)�)H���6�r�K���󗗐��DD7��
өX���z�ҝ	�w|�SG�d����>xhH��U��̫?M�V^�:r��dfԗS�W��B���8��r����������Z��?g�����ju�e�5�2+�-�[%b!h��㪓�i�ړ\�A��B*�&���]Ur��8��>ʮ�?�ﯗ��X�3���W��{�BX.���O��Or5��U��JO�LF�On���ԇ�{E��1{
��q��K�Х"�q�,���g�{�ۚ�Z�rd�&�,�w��N�'ꍙy�,3��6Ȳ�_��<�岀�o�M�l�[��o^���S�4I\8�>��>@ط��ɳ���s���,^Iگ'~ZȾ���yBYHʾ|���{i`l��΍u\XH����_�ԏ����!�VggT*we�I�
;�c��\C~�znaR��!�� ��3ff'���Rϳ���*�^�ҳ��,�'�Y��\f��SH=���߮�ϯ��m�g�F��|�XO�-�՟x�A��V�C��Q�^/n$�MAϛ��p�8_m��M�]����s���,���ކ"(ȓ\��CD�(�+62?7��z�>�23�,�,��t���(x�;�}�{�ͻ�ܘ&��l���5�FVm��|3� 3�0�Sx�e�Mo�@��b>��q�ԱCB&RU�()-$�"=T�r��@J���Y��z�(T=p�8'@�/�A��p�g.�q>H�����ygv�˓���]	�HM�$]�]�~�����%awH@�v���q���]gt5��w*���
lκ��^Ɍ��@�B��e%xź��O�O���J�ء�OA�)L$`� ���b�b��b��gl�q�#����iPI���_2>TemU�YP�ō7���[�
}NڋknG����ϋ�C������-����!��)YP�Va�!�M�qX[�)Q����ˏ��~�`�8����a�ǘ�	�1"��y� |�;Z��}��0fbWՖ���,�l�4�^=;�dԳ-�B��o���\>57*E	aJ�~mnq�e�1�-Z�e�2�n:��oh�jmR=�<���ȵf3��X��F�I�WϿ��Nٍ?��l��K<��,/��MN]������;N��e��#�H�E��g���.���5�[rE>I�$������Tx�;�?�}�S���Y&;�l����4�GF`s�H�0��
|��~x�;��oC�������t����4�5����@_?-���D�(57�,U!�"��$3/]!��XG!75%3QG!/?%U!1/E�,5/%�H!-3'�nBAbqqIFQ��RQ��nQ���!5Nk�OH.�S)H,�����&�%>7?�h8�\NfRQbQ&P��<�t%amk�U��
"Ȟ�9m�a;i���\��L]݂�Դ�
��J ��W+JI{����$*�(d}\�������^Z���>YQNns�H�0��im��Bx��W�oI�'�����8v�q�3�y,N�{�DZ7���7�*^%�O'=]�]՞�h�_XJ\��EB�����8pBH�		��8N��3�����=~ߣ�7[����)u���Hܴ�d�cT2��+�M�Q��Ԭ2r�*�c�¤Y��Cr�<aqG�	>��?r�Npn���������P[���-,��|��M#@"9�!�m�����P�Wd��F�@6|r�ɛL���J�L�o���#�‚/��R��-f��b������Čp��ՔU"�G�
ỵ,�|g5p�h9����y5��p~@�bA���{6ڍ(��m��#j��7I�M��j̑��Q�^�"�h�P�L��*�ͣ��"�<��<y��@�Cl~h9`����b�9�Fe����A0P0-`|��r�r
�o>~�AʬB}[fu����A��ǹ$����,(w�mj�>S��_>T X*����RY��p��! �ܾ�@��}&��x�kV9?��c��=�UК�/SI�lr�EU�l�V����������<�r������
�@]Օ��(S0!	Q����n��b��y�	>aڐP�8~�b�^ɒ�y���gе�:f�8����۾C=�B�t�(�����%d~�y��E��hc5W6ȑ�I�ڤ�Ar1�UY�Aɨ�kj��_|�L<��1����
2ҡ�:b�MK܀�p��D�lܰ'�4�+�u�]�u�X$�
�A�:
xa�Lx�aTlhmHw���R����60u�m�����'��V�Iz(tA�b"��ҡ���?�
V�ts.�$zv����]�_���HQ�]֪�D���}�557��/��.�j<H�z�2��V��! rt��0�}3���+����d��8���zڴ�bQs����ݝ�;=�D!��c4�l�nA�]����C����1��	fV.���D����ױ��K���,�:��=�����/��Tl��ld������77�6n����N�����9�O���B����ZBK�$X���,57��S�0�t*4X��;�Ї��-����i��0�0�� l��X��0A���v�C=�Fӆ�*�.3
��k����2ܜ�p
����/I�p�rx�zu0; �L�e.��|�%������*T�}N�s�#���~#��%�d9�/s�m��� �FfM}4rm����iY���?�-U?~%A��A���O�DR���YbH-�^V��?{��O��%Y�Dn=R�P"�I�{����\����pvY5O��L�z��U�M]F�3�I�O̫_���$5�r�@���"��f5�N�DZ�~�����?��:qE]M��ѹ���W�;������h�U2��/KQ�K��t;�1
�h��On�ݩ��4q�YXn�Hv�����
.z���;��w	]�i�K- 1-p���ږ��ҙ�:it�6B���k��Z���m�h)ʨ�\
��x��y�9��(���	��RF2�ء]��S��v25}4��I�꫱���8��}���l��m�;��Yb��Y��J`30������Uatn�\�D,�2I���Z�hWl��ž�B��
��(ꇣ��Ãۘ��(�f�_2�k�	2-�n�[&C�Ɋzk��{���{��à�����%�9�sv�R����t���O��ZT������~w�1p�n�	�;E2�Ù�Q?�^�����-�i��g�u�u��dDō�n��*w���b����Ѐp=����̅`�^�l�?O���������
At��K��ҕВZ���=�T��L��VdjB�7�u�EA�a�<�B�N��imv�d�H[[�E�Dx-2Nf�%�YS�g�3����y����f{R��/��h#mDw��|�o�P�c���膤c��52aKT��4��%��0u���
��C���yS]O^P��<;r��W����b��L�,q_��Z8S���63���Vx�;��t�n���"�Y�x�j�N��1�ux�e��o�P�� �qڨI�""]���Q	$$p
R*�D*!�J_���؎�_be����?��eb��
�#N0�vw������ʻ��ϥ��.aW��ߤ۸�pS���<��_/�ؼ`߲�������h{Tt�gr6�u�Z�<�+SW�glذ� �ģ�8s�g��G��)�>����X��uq�w=���9;f\�������S��E�a>[^}�5ڱ���.���_	˕Ty7��0T��tlI�����c*L��t0�� <H�,�acf�ڜ�}w��jO�N�qN1�������|œc.�N�p���"���,W^dG��1/��������W��p����Q��S+Ұ�5}��ךxZ%�[w��-��F;��_���_J��ȽNkj	����7�Jʑdt�P�S�2���sQ�ũ�i(y/-9�u��<�M׶�c��a7���$�9Q������s�̉|"��?��
�2x���w,p�;���r����y���L��Q�H�KOUH��IU
�)$+�d�*$��(��M~�)����/�d.	���b����<
u�IꚚ
�\
H@�)PYL��E:,��QhQ�^Bc���7�35�l�>x�����Zf���#>^��Ux���7�s�W|JR|AQjZf�f6)S�͚��	i�(x�a���I�=�J�#Joomla\Util�H ���`�8(�jT	new ArrayInput(��!L��
);�%$?	$command_�O}
}
/���Xx��h�f���i��h���Ē�=%M����=<K��2�KsrRSJ�3��J2RR�s3��sSl2����TJ22�u�3KR�JR�Kl��P��&���nn���؄'l�/x��!�T|���Y$l�cx�{��m�W��<��)
!�x����e�	���l'X&��ڬ��)h*��x�[��u�G���"J���E
y��
^���9�
ř%�K��lN��bi����gx���w�oC���������T�%��6��yi�v�9��YR+R�7'�1�Y�˄�4����$����W�������[P���Y��R�X��4�^B~��H�0%]���Px����o���~f^Z��dN!�Ԋ���	B|�`��2��M2��E�~"��!x�;������JQjn~Yj|Z~NJjQ���BbQQb��P��'�&���&8WH�]P� �$C?75%3Q�\^~Jj|n~JiNj1%9�IE�E�@��Լ��"�Sr'�
+a:�]X!.�i�g���&&g(h�{�1XA�֬F1,�"5YC�(WA�(
��Zir���b�;��TQ���hx����oC���������T��J����x��Vmo�H���A��JやNJ��zU?P�W�(l�q�����n	(�vf�'Nz�W�Cb�g��g��?N�4�����X�K���7W�����w8��g/�R�L�%�Ơ4����l&�o�:C�Z�O����al�c�6,������+���bF2���#�Gm���||TȻ��F\p��q���_�2��R�t�c%��P���1�J�	0��1��\n�^~�y�ehrFO.�0�+��2"x�y�Ax��%�N�+��n�W%��V�7�%���a�((�X0c� �(4s	�/��	K��7��ZY�-��ƥ:��,����'���s`�^y|�����cmFws4��e�$KQ�
ak������*�''�!:�ܞ]�}1����;��t }�rs�r�@[����|�U|!�����-��k/5�BKș&R��>���֬�
t�7_�ˤJ۸��r�����vf�˽!n%�W��u/ws���I��x�a�*m�*��!�\si�`����ݝR�/i�hV�,��q���0�����p���k��I†�fm,.`�ek(������
k��-�{W���m�iOE�sᶝPr���.
$\��.��8p>Fm��Quga��;u����,��Fs�vĿ�!{,j
�k%��=��mA\����gL/dq
%
`|b'/��g���jN�(Dc��0��?;�Q�2������o�Wɇ[�	͜��Q����Ŏ^چL)n�w��؄�Ӛ-�?��_q�ZZ�RO_�l���ڗA�8�Ѐ}�P��O���u�>�]�ټ۸��R��X5s_h-����&j���S�$3�P��Q6���,�Gm�lᚕ��vن��x��Y�v۸�-?�U
ʕ%;�ɶv���xw�u�6�\-DBc��e��������Ӗ'1Ebn�|���(�';ý��G�2Y��l�;g���z����dn���39g�<cB).a" ��xqr�����Z'G��b�h30\���(�w:��0�y�M����䚧*�������%�B=�&_���R��RF��{ߗBI0e*S��LH�,"Jf��I��B-�%���s�0yV��Y1p�c���m����N�8y���R,q(���"~*�LۿO����=��D�̷1��4r��V5Y�?���i6a��N'J�����S��4�e)'�Fs(R'���˄^{��͈��� ��S��sX��,8Q�� s\I
S�f�\4Q\�P�	������X<�s쏯YJ&0����A��Eݱ�
��=�՝�)��|k���F�>eY��5�2�ڔ�4e˵Zs���}�����뀘� 1 d��1�2�4�8Rʒ�N�6X�������*�4>�߭��3$v1
1K!���J���z��^�a�^@jy��|�פ{•���L�1��h%(��ǂ�&�W��J@�E�\�ƠȢ�����GGN/ޟ�_�|q�$�/�앷r
E	`΀�k�J$��P��-!a ����)���0�W6�4+����,�vwZ�^���<����5�xn1���Oߜ?)�힒���/�S������!��/��m�#�`����
��¶�������l�7��4���N�!>�I
�IW��2�Is쎼�F)�0$����q1��^I����,��!'��'�?����g�]<����7o߽��|�'���7�y��*��L�H�ή7�/�������Wz\�h��h}ȗ�������)൘�J9���Ɨ
NVs��1:�;���{�U#n��R��T8a�m����ފ<��8azN��CǩY:�z��܄�D
k)Hu�l���e6|W#��Kj"�
��A�F�S�р_�H&1_���|ʃq�!�'qhz��˝i��'ZB�e���>Ԣ��E�����(��j�A�[�]q6�����r%ǂ��o|nmP	��z��[�ѻjDI !z���i��6�*�4xVht�1�ý+̭�N�mٓ/C}��B��(�t�V�f��|��9�
7�.��v���@^���w�F�8+��?�Ն�r>XU�X8{��R��q�
�[�Ԡ���'���8J3�iPްQ�.��F���̹�Z�Mi��F!k7d�2�n�|&�ł�+�M���!��D�?[�@+�����E�w�.���;��ާ��|��=z�N>�/{�aࡊZ�uc�hJ����<zNG��Kk���Xd1�g��#7~Dv�. >�I�|�����o�a�t�l��k^�4lA���;�x��w���q�8����wG�R��F_�]u<����V�n���z�Nl�ȵ�h��9��*%�kt[	�J@�n_f�8�.�?o
88^t�gH��y5�(�E��0�����bdR�2(�i�8^�?���8V#O�R���܍�X�h��׭�L���~�k�`��	�������C�bg�U���L�����a�q(�'�æ:9�~Eن�X���Q���u?���G׏Z��h$}��2mGjM�B�z�h�4uxp�>�;P�)C���϶�^G��ЗWQ6S����-�d3�^QN���f��AéE!^Z�Z����+X���WTu����ľ��l:ڇz��
~l.+%�inM�\�HXV������Q�`�3����T`�M�K������)������4�}r8WV�o�`K�7�)g�-We2E�0}�|�a�
W���-Zq���_x4�R�MRVy
��؁B�T�Xhm���c$�Po�*%��ِ�_7��
O�p�R����/���_�@tg�&�������2��m�v�������&���b���9�=1kN����A1Gi�5���:5Q�$)r��%���8O�=r��1-���U[W�������
C}a�Qj��d���w�OP���v*3�~yS뵧�����_����]��ll1�*?�Ɋ�($���o�A�V��~p�?�����J��(2_2��3dv����qÞ��O
m�8�t�h��8�����u�o�HD��c�=��[X���{���|/��[���y� 6����*'��ë�[y\c��Pݛ�/"E8m��bl=�,�2[Mx�c�*�.�aXoG�>rvl3�����q!g�(UX_k���,�֥0e�
8֛`�U�����r��x��Vmo�6������R��i1`��duSH��k^�/Z�e.��T��ߑz�l�ɂb� Q��GϽ���~Oig��߁}x�t�X�0{g��3��
��z�\�pA��Th "�[��8���Fxc��`�\.����w���hC����?�sf3\��|��Q���.8*��^�3��fA(���R&�)���C)�D*s��,(�DH�B�A�L�M�fF��:A�S���5��,��w�����A~H�����=gq�z~�oV�\���H���T6�"�L��8KP�
�sa��#�W�|N�s�y�ϙ��������k�RmIS�P���Gh �Dk�U4��Y�����p%i�>��m���R��Q��L����S%


��Gk���UJ�H
'@�"+/����*�����������DF�g�uY��B��,fbCv_�HxO�
C�f�g��U]hR^
MRL���(q9qf���o�LC�@��]xc��DN��C��Ny	Ay�eP�N��4G���^��	�߀�:�'���ʮ]m�>��-�g)ڴ���:S���c�uq� w���i*��?��į��ͪ�a��P<��@�5�%�Kƍ���\�4RQ��4��Ж=��iC=ߩ|��zf���)���8n!����)>^��ܝ_�?��3�)�P�S�,�;�q-O��p����/a��t�@$�Gʦ�/Q�N��y�QȻK���Zd�� �#
�_G�w��nRݿ�4Uxq�ݧ��{�-�^G��ϧ�eBi��m�Z�1�}[�z�-�()��|���1���eU��"oh3,B�"۴2D��4b�ZUHA�j�vU��b���r�١�ɔ���B.hx��es�~�3N��i���˾_S��,�\��K�\g/�t\�@O�xu0s��6�4xw�D4�7�PϞ_���~ǜz=*�!�����'���phÜ�x&�WӫZ�{�L���\|��f��Ǚ���Q�j�ri�b�QYA��0��R-�S����J&^�����
���9k��>d�?��@\Nm=�}�H��t��j����u�7��)sI�k�3�p���
km��"�6�O$�v�䊴�Q;�MW��$�`��m�1H�^۴�]�jl�)���yro_��ց�i�2��>�;D�x�E�s;Y���͇bk4�_�k�Vlϯ�0��=4��`9�K�@�莕��k��O�^4Y	��Nx��k��`�89�Qj�#knnb^�䉌ړ;�Cx�'1U��
���x��W�n�6�;z��Lr�I�a�c{��KЭY����e��B�I��{��ޞd��%�n�M@"��#��<��XQ�� ��:��J����VO��v���ї�����"����@�^�|�)����I��1Š�_.�=�&z���[��}�����9��r�c�̏�-U�I{G�A�����,�I/�y�7)sN��\7��L
-1��T`2"�`�e�2
�R3#�
��G� 9�����2ק~��9&x}��9'QT���KE0�g��*�I���T���\��y���'��C������X'kx��ŏ]�4��UƉ�p.�!�}k��jh����BIC3C�0+Efl�`E��3��7�ӱ��,@�������]��)ՙb�]8��x�߆�3���"�gϿ�~��e����w#M|�%�)��\a5 �|��A�rKM&��e=�kE�}�R[WM�k���&�-a����%�nȜi�s��
<>1��v��e+����B�aqױ�rHt��dž�-otZO�ȸ�E�s�	�Ű_�"�v��Lsh�
>��s�j�uA36[	O�U�#�ED��	�m���W&��'�a(Y3��
66�V�p.�5�����L�bVh�?�L�m���u�Wt�N
d���\[�
ĸ9�M���3[��~K�����\���������ia+�~��-L�?�Ž�<͐t2O�dd���1��
�_iRҞ�W���ϵ�l0�:������-��D�n�Im������sy�#b*U&%B
�{q{��{��v	}K�������!lh$�K7�)^l�U��i��� h��95��Lu�
'y~�t�
�t�T)��/�l�SH��k�cgyz4�{�k�T[�+jJ%N걻���F�����$��Lo��c˲�(��ǟ���h��Й�i�����	�X��=�0A�l��!8�y@��’xf�t�f,.�s����̹���j��Jq�dD��v�|o�.�Y T��X�'E��(�����R���&f�SD�\'�%���M~�,��h�fGl�9F��>��A�v܌�M*�C��-�\�vV� ^�z�6���$c��f���Ձ#�[��ݱ	.�x���z�f莠����
d�
�2ۙķr�Z�����X�v+��C�m��
����n��j��Y�v�>1��qǖ��5�ܳ��PO犜�O#�Y4�]�2P�f�|�m��Ν��f�`	�3�0�����7t�I�`�4��&mۭ^�'�f�w�Q�!@&�]7˳=�Mx|&���_7��	�vs�.�v�A��,Ŗ���яҪ�̪I�R�~���/��.�$�NY�j��&����,T���-m�x�Α�ߖRٯ��nԒXE/�ZwS�DqU�]�d��X��/x�[!{�{C5#�GjNAjQLHbR�䃌���1V��d�8N�aJb��&OeR	)d��$�䤦(䔦y�ϲ�3�Cy�E9U�54����@� 19;1=�X�V!��(�2>;��XC����,��83?��,1�4E-Bqr~nRf^*PmZi^r	P��J���J��B�dF>�z�PA$kj�M)�/GX��X�3W�p��P\�����i�P;S��^]GA=�QEc	0�A�K-W�z��J~iIAi	�*]����E05�@�$�
�o�P٢�<�&����d�|����[x�[!{^z�1��)�R�����y)1Pzr���6��ɊL�`���LY6?f?�"����x�E��J�@�I��n�(�ǐ����.�eS�r�M�+�C2mC��03�� nĥ��W��,�+�1���b�e��s�y��^��|Tv6��qI�ʑ�W�E)��@��D-����!ΡO\��<����!mg.3a�g��>��)�0�]2��'QiJU����(�d���M�@.�A1�	��k�7u�5Y̕��l��#@b��&�r��az�0��k�R���1�8��p3��F�1�Zv�wJE~i5+� ��r8��!^�\�,|�*�|/lK�mv�f��V'�/����I\�&T ��RS���ؑ?Zo늲Y�'�˚+c�t.o׭_�����x�;/�Dv�F���T���ܜĒ��������XLhIf�柌���i
 ��Uf1D�DC�$#�X׮$�(=�$>%�HSs��l���MjQQ~�]P^!9?771/E���/Q��-�I�M�+IMQH�/�ڮ`b�����i�ť��RKJ���b�\��ϱ4�@���x��Y�r��ϧ@Mv��Eθ�J�C�J#�m���6ckp$-�V�p&�Ѿ^���X앴T����Ź}�
�i�J:�G�:��6�&�˕"�y���=����_��������9��d�$4�%_�#F���l:$�J�d<����~1���i���y%~�QDɛlo�K�OnX*���7�CK_�4����U6b=�Y�uD��,�"��Z���#�E�)�4`$e��\�tRF�NL�L&ޜl>>7l�{�c?��)��;�t2���f���'"f�rgq�)�w�.�5�;�?�Y�X�m@s�(��~��L!��*��dm����τPR�4IXz�����eQ)�[�����L��(P�ΧzW�"~�IC�����oohJ���vi���T((���x(R}����"$��R�����LSm<.�l�s�V\�'�&���B��T��p����� ��c����r���\��O_�fnY�Dżj�=�������e�G�aԓ\���/��f^06|�X�)�2f���I�:�hD�5]2QQ�'`�
�xH���%�t�&YpP�`w�ㅘ�4%M�������s=[1���H�t:��N#*@I�Ȓ)����$s*�0&.x
z<!��b�A}A&�	�9�(�i�<��;�V�;�GZ'r2�@蔂���|g��$Z�$ʖ��B��-�:TT-�����Q"bZ�(����5�N)�'`{m��aE%�^Q���W���"��vSfl$D4^f(���+�!ja������_�I��!��;_�4�6�W92u($)[�;���&��N%�`�U60���*�r85� t��M�	_�z�'$,�3�O�@,c�+<�>�![�,R�:�?^}��9CBȠ�#E���Ն���)�|��P�3"
@����c�����2Yb2˅R)�\YBc�pHt�X+$�t��hօ�rB�G�s�N��_��t��C���5B"(
�@�)ъp�`*�c��Mj�G��!��,*�<�B=�e����T:a��Ϝ�-q`�O��;BB?���Z�!�Pg6�ܮ�yEn5���X�D���	S�!#1�EU�W3�Q�$���Pİ�ڸ(�9	�<[�Pa,��z�
��̯��hz��ze��/�\�]���ln�.�j��_E25�8�d��LԷ�gQ�CQ�l<�a�������ޟ�=}Ѣ�;S�`B�6nj~Sԗ�Xy���zU����btw�%v���p�j�PjT�q�E���D�>�_��/t��w�}TX?MC��f8�<kSA�7�vߤↇ�2������>D�<����-s�=�)��5ŏ��v�i�ݱ S̯����>���ȁ��N9��<�^:�����Ik<������h2�(����<�J��c
&�)��=fi*҉��v6�g���jOFyr<24�nY��LeiL��m��d�dIV"��ȍ�{\��
R��KCo0L�DW�M��U�^�l@؜��̝
�X	S�
p�g��E�,��VɴWû�:�O�fE-�!n�TP\fx�͝T*��}�wT��`qF9���+�|�,�z�)��s�[<؈
=T{q?a����23���MS��C�5����$��ۜg�5`�>L+Q��8�}Ҕ[/cm$���N/Z&y��B�~�@�����I��g;�/$e�_<P����o�`ł�t�mˇ�}��&�a�b�{6W��/�WP+����x���$ ��2�,J%e�|&��k�;�x��Ȑ*
2cvK>�_��B|T};��>tB�����\�ؒ��{ps�A�J�vWzM)vpi%�g�&��b�t��V��J���#CI_��ۈ�'��^���
��ϝy��&5g�[�ٮ�e�Bf�-W��I�|���U%J&�
ӒH�+����&;�����xfF�j��
��ަz���
ڶ{X<�3�^�[��U�m���j�+�c��Uǻ�}�ۄncRW��n�h�oB�C�Q_��u���
Mb&K3(��`�EbO�e��vI�����5�=��s�a�����iD����I7X��i������8�S�ٿ�IY��F�X���v�K�S61�w������ū��g�.�N//ނ`oT@�?g����#�U���a�J��x`��vr�ӽ�U������%��~�K�+�p��h��66P8wJ�dw� B������9���<����H�e=*U%�Bu�Kn=�=�OY��`�3�o����	$�ayp��֯8�~�W��h�4$�	�k��i�dk����*�
���3\�S�ݷ�J_�'}S%�[JƶӬ"�1S_-�X�_J�z�L�#���������`L>�@�����>sn� �Rw(���h�wN��`��K���)���>ճ}K*f�ɥ9R���D)��Ƅ���nmdq8"Fc��w�m�|��Z��Pc����Ut��Q+$Wff�qG�^Y@P������'}��yއ�;˿52���>I��+���s���2��/JAqUB%��y���-����#����=�ANٮm���u��Ů���_f�7yWLy��֗�[zWի��5i�-��=�!�^�!���6)��|YW��9�dx��R�kA&�l	���b_���`��9��J�"=؛�N������23�6�%z�l���^<
B��/лg��L6���93o��7�.}�}?�+\,��
o����(	)���r7�;��i�raU?Ƚ�r���|�eR�(<Q�Z�s�S�+_)�T�ʠ!Q=#]�xȾ�dX���^���'�m.`�DYi�f�v���I�譙��9]�q���b
���&��\��Q�	0E(�\ʼ�|����g�J�R_�~П���QM�è���8�h�(ʙ_FR��_�:0Z����=�r��Z�4ڶ<@�,NT�a�E���ϯ��$Rr`��%�Ao�Bc���
��*��M8;�S�f�Cc�n�D�*�L(灶���fy��‚�z���\4v�"�D�ʘ���:<U@% 5r�a|���׸F��\�@z�FvP�k)�7%�]U"lmM�玣�,;��!H���xB���H?\��A�caѶ�*k��ݷ�zv^�1q=X�@s�\��+��=;5Ob"���w���e
iZ�M�#3�A��z:-����Ү�v�N��=�+(��&x�;���i�-��$�����C��
x�{�t�e�-�d&y�В̜��LI��i
 ��Uf�W~~nN���JIFf��]IbQzjI|Jf���䛂�aJ6�EE�Ev!@y����ļ 3/�D!3� '575�$5E!-�Hb����>DOL���5�(J-)-ʛ� /�y�9AD�5 ��x�Xms�F�l~ņ�#�A�I��)N\C��8��q�q��0J�;��L[���IBB�0��e_�}v�g�<o<|؂��<b��'�s�w�>�҅LJ��A�o�~�lRxR!�.�l�8y��q������`�X���S"�Z~�Dx���d�$i«b�kpf�{�p�0
�������g%^'r^L��>1���d,��AĨ`hʌq�sQHM�0�
�$g"��/Q�A�EÌ�<ĝ�ȫ#߳��2���<m�
A��2�1�T�9�����)�y���T>C�Ow�s�K�[�������g�oI���B�0���'��B��B��u����Ն�����9�$�$���5��x�t��$�d��<L�7�dK�%][�4Rq��,�.8�N�2fh!�4�V����y"��0�M�}}[���)�N��[�:k,��!���㳷�����Ӌ�h�f�����3�8�Ѱ$L$TC����r����z��Ɂzx�=�ee�<�3!v{5��%�idʰ���{�3�f�4R�l�����.��
�h�����9�"�	�3�"#������Tm�aDfa�J���}��s�-+��Qw����n
kx�����Ξ��qNg ���S�e؁i&�v	�H�)�R���O��4���D:w����$;W�<�<��%Snr���ȧH��n+�B��������_]�O�/ǣ`x�D��]a7L����
�
I|
��KA'Q-������&bw��uw���]LC�$8ždߒ�����Ud��$����X	݊k���n�2�iƮu���u��`㹠�~ݴ�t�5�B���5k�o�U����-+������Ꟈ���5Ϧn��V� V�+ե�N�1q��S�xHx!롴�ۃǘ�J���&�Ϧ�p(�B�y�ltz�s=m���6�?��ʧ���4�>j�-����z}��ڞ�����}}�) 6�"�L�$Kقpc���T�� �<�d��G�f����Q^�ۭ
d�'9�l�,��!(#㛈hb�]7�N��0Mb�;��
��V{�V��z�&Nd�)�m��4�>�n}7�Β�4�������b��Ʋσ8��A�U��+/��h��E[��,� Pp����>�/ (�X���;�ǚu�7u����לA�v�$j�L�:2kQ�r�)Vcx/���X�<&=�X���

�}�0Pؒs�:p�;_
—?1Ӂ���[)WF�W'�b�iX!�Ds��΃���ٝ T򴶟��z�m-id*cm�m	0~��jD$�S�`�_-~�Z��&��lI�jf�"3�h�/Qm�π^��8dU�Kf�[��q�+�6*�[Tg������ti�f
�o�V��3�Ͷ{��ֽӌ�U�i�n�|ٞ��ZTl��|���&�т㘓R�;�3��ͨ_}J�P�`�&�{D(�"rE48~��VH5��3fDe'$�~}�)�Gqg��/S���r��Ɏ��huj�?M85@Cpf���@��n���岞I�hT��\vi�Vg��{]�w&+�u�n/t�x�8x��T�jAF,�����+��n�R/$i��	(��@������d�uf�i���
^��
B�|	��"���lRDD����̜��;g�+�˳oo]�n?�q��NrS��i�9'F��;u��
P��R�4vb�0j&�erΉgS�=F(��k�a6C�j§�,������,�^kW)���^TQ	"b3��GE�����t���Ji��>�=S�O]��m���P\���T�1�Q�+mZs�3�持OyT7u�ƙ��1������՟g���z-0�!:��+��{�4!��쬖��WkB�MWu�H1j��n��kw:ۻ�v���o��a���}�����:(�!��r��$9�ZM~,?J�V��y��eU���\36lQb���a�z�R
0�0-�v���ޏ�1�Q9�_F��$��$�ĈQ�Y�C2�4���Dϖ)�w]��8l��F"�Y��t�o�t�A���/�x�"w\�߃�?�JzTA���^���c�DE*�P�
��3�!��.���8:6N�D�|�L�+O�8A��=�!�3x�p�Rш����)�q_�e@ޘ��h;�m3���_��3!����vʈj��;��3X��4w�S�z�X"i��=!�.�'�"}��rH��1�ɻ�'((=gཱ����
��qAhؼ�
[T0cC���Q��z?�
Bj��߂�����5#nbYC1=i��iiB�_�h�`��)����PMv�����R�l֣��!5����ud���7��߈��+����ץ_EfYk�kx�{��^u�{�ŏ��$�f��x��V�n�F}��bj�!i�TҼɉ]�V
�����aE/5���ŲS��;ˋL���4-D�{f朹Q�ʴ�����(r�����D��`�)��M�q�!պT��(�tjA(���Of��~X��k��9�̒T�=���oސ��%")��q��+`<���X���Ǔ\˂H,��@WG�U��,$��9����O�o�]�p���%e���k~����Y#�B�NB��B��F�K�2-�#�
��JF'��Ϛ�ӽ(H��:�x0�p�XĂ?ڣRp�z>���9�(c�z��m>�:��>m-�['Le�M�)�l��&�%u��l��;^k�0gJm�0�S�)\k�GW�X�#U�t�U��
��'���%�R�
QE��C)�|��#�T��R
���b�C�5���Yb$�^���I��x�A��tO����Kjס�1V,o���Ȣ����v`/'y���N����N���ϓ���j�����޽a2A
uX�(�j��U*L�AQ_c�)���T-�*jLw�����Dg9���d�B�_Ms-��ς���`����07�QӇ�#�rz6��_L�h缎�*�m0��$���P>e�Zܪ��U(�Z�ӌ[�"��zïTҠX�����04��{��=��%{�z�҄��Z���0��n}���'�Sx�Bt53�(��3j���Xe14�CB7����:t;<�u)��6,��urױ�Mlo��R����+�ejn�b�Ixf�}�ng(Q��z�͂^�O5���M�*�u��Q������l�6Tדm����[~�vq��o~�G�8E
�/���(O9.�f�|1���]Uʌ���
#�Q��Q<��/�����;�+Bske���Ȳ����M�3���6����T�%p\���p�_�Ӈ딶��D�� ґ���}qSg�ʹ������_�;C��?�Ux�}SM��P��ٖA7�wBKRI��E��X�#��v����67&4_��J;�R������"�W���Υ�i��>B�rs8��sn~���c"�0��5;K|bo�����V5m����o��#����n�r��d�����ȇ��ѳa����E�QDMp|��q��r\�56���0uu���i�%�eR_RV����2s�0]�P�E� ^��N,�u�퐎�Dj~N��� ��{������h�Ŋt-hw����J�=����0$�B��%�3oOfv��M�&O(w�C�B��v�^��{�Ǎ��;�}&ʦС͍U��s����5i��܁�\�^�
��\�0]a� sC��Sr�/TI�x-U�u�wB]uS�z�'��;�(�&����(/��,�c$��C��U�7Y[L��5Ҏ�ѝ���TJ�ZI)qY|8*KS@��F��Р��'�`��y1��$��+��M��`�H�,]H�����}�3g��|�d�^V�ѹ7�G͗Ш��?��Zpt���r���K:,��*������I���I���.�^_c9�1i����%��	�$x�{'z��<Fv�ĒĤ���L�a�bq)�-���lǤ�0ًٖ/"�j��P�\Ȫ�y?�!�ɩlR �
%�
0E
�i
�
ř%�'������N&��d�j�G��ꦨk���kZsqM^Ʈ�V�X��i=��C�3�jȗ4��9�;x�eS]kA%��t
�JA��&��4Y+UaSS�V�m��2ٽI���,3��|�o(�
�?�7�/�g�Imp���{ι瞙?3?��W�n�xw��\����MqL#��
`��.�>JE���{f*��+��J04�3[�BS��L�4��3���3�|"�VZ�(BYs�d����b�����k�ς��Y2nv�6D�j�j�0�lމI���P#����V��d᜘o�Y�r��^ҏφ(��G���}����(�F 0��m)�����,-�u��I��vKâs�۫ow׶W�-@i�2��j��|�}5S�oL�6��Gߧ*��d�ShE�-Y�~ �'w~���ӥ
�����B�GE�-$�4��쥘&���c$�XrX4"?sz1��nD�͜h��[�V�R�DڍO!�����0щCs�Mk�I�fʴƕ&<@�\��eZ���Hا��&!U�>W�h!Ki���;�86f�;oa�ڒئ�n�:�?���H���L���/�r�\3�yo"�b�3?s+���Zr��n���>�Q�sӜ�'%��Q��QUK�-I$E��
R�B0�̉�p~p[�CL&Ř��^.e�2����6E��Xx��%q���ƾ ��K_kb�����������ĩnʾ�U�99�
�I9��
>�ɩyũ:
e�Eř�y
Fz��m&�1~�J�I,.Vp)�/�|��n�(���е+N-�K�M�POI,ILJ,N�J�V��Ϧ ҧP���P�Y��^�U3ٛm��@nU� ��G'�`WO7���`�����U'o�vVrN���/Q3"UA�XO���(��
Ȝ,�#̫��R�Z\�S��i�5y#���:.�Z��R��Zx�(����A�|!��*�x)��J�J
��	�=;�g� �
���+x�[���{�|�ɗ���s������R�KB�S�&{35�&C�J�"7�t��C�<���"���ܜĒ�����%̻'?`����*���_����JO�K-J,Iۡ��%�vF�L3s�?�'x��R�jAf��B�zc�����iR��&RJE[i����������L:?����X�oo|��A��o}��I�)ѹ��w���/�ί�B����d,���-��']�.�7�Br�}"q]�x%��[�w��枇I�z�eHx�B[�S�'�X�~9��軗 �B�h��]��Gs��"L�JS`���8;F��r֤%
�E�m���F�E��8 Ps�&�D���;v_�/Z��L1�$B�`8f��lq9!6DC�8)̇` 4��P[�z�}C�|d�;.������]_����	����I��M�#[S�
������kp5�t�{�mf��^��9�p0mI�)�H��;���3���)�q�����j]E���x��s$�0��7Ҍt9��57�� ��˔�JS:l'&�\�����Iw��p��Q{ǭB� �R!��0T� �Ǚf�(>����{�S��� &X;x���	��:P��4r<Q�3���.)���~�ZI�T'��j_u��H��نHB�I%zT�Up���w���_<�����+=��>!B�Љ�W�W�[�)�@��x��Y�{�F���T��[����R��8ul���)=*�J�J�]١����ݕ�^��>��;/;�ٙ���?h�!�`{��9�x֋����U��4�����[X�Z�sB9Xt
7�r��}���s!��i����BM4)5��ul�!Ϟ��p\ׂ�`�cp���pGw<
��퐀~z�,�8w�"�4mo��yK�����{�(�P���@,���c[.p/`6F|�;�c+��:8�֒p�™�k6��f���%nptj	kbqrtpp��r�ѕ��=J��	Ω�yNa3�|�;͕/p���!)�WB�"+چ�
��U�kq��u�|�N9t'\0��V�<|2�sCk�i����f�F�~�� '��á����'�-��\�K>�MFșk�%�)�|%J����:\�"��.�h�D��f��\X"�r|����K���'�,NJ�v��yX�ˈ5]i��X�'�G~���Y�,%ô&�峀�~�A4s�#fM-�HP�-�:�Ċ��|�b��|'��K1ӈ��	qc��+O	���b�4"��0��M����S:fjB>��[C���4
\7?��N�C��?��ߞ����Fq`�9%3+p��������:��A�@�՚p>�C�#��o	�`���q	fWF`����l4��nC.�M#���$��W�fχ��`�o���P"I,����/�U��l��e�����L�S1�㹡bE���Z�R(Vl��b�Z��'[Of��ƴ`��2�W���ӂ���|chh&
����'���)w�\�̝�=�˸n�ʽ�ֈs�>8޼!P��Jo�����.�n������^O''�= lՄ[J���K)���Q,-�;��4�9w��9Ny�}d�R����ҜM>;�L�Pu��:dj�zj�,�G�"�hy6�7N�њ{�C���9	�m긩e9$��m�8.c�?����T�I%k�1��f� ��IlơY1�1@�̬����{��;T�
����[��
����餖��cZ��,�FRF5F�̠��q�T3RU����������_%ڧ�+���+3Ԥ�5�|Ăy�@�=�Ů��?�D�1R��YT� ��uz���g�c|5�:�!�|��Xd�>�x�`��u&��M���X�Œ9X<�V���p@7�ج�Fq�<5���U,�d�(Փ��m�E�7�`�>���a������3^�u���;MHA�6���
˒5�^px�+Q]�%���fQ��P�M�F�[I�L��26���Ղ3�:�S�����6,yz��,��5@Ueu���à	F˚.��N[���\���d��
|�᭥�I�8J��Kv�T+�n�5���Ĭ���&2�����fDVK�y_QKp4� �R頭&q��֌]�J���	�uhס�M�7i>>#�u��~�������9j�ƿ�/2Z4A�N�
�1�v��A�hW~�f�q�l y/K�a`VѾE�VD��A�"3�'|A��fs-%c�<n�լ����!�7W�1F��."���4���:m�wm�S_��Wia�ק��8��su>a+�̰ۘ�	�sT	e�*U"G5N����Q�р����j#�LaP3"F�����غ�V��~���x*7�r�UY�����Q�#v�>P9Nm�N����qx_}��|!(xx�R�E��N�����qy3����|T�����L�w0��|%-��7W��L^��ʼn�Z:�'��̭L�бn�����6¦]�Jy3�����ތ�WuUbԞn�[��z�x�F��	�&��3`H�gngf�\�'c �l���h�3JIQ^�G?6{fN2����n�%�k���;�a��<�UŔt����T7xE{����&9U��`��$���l�9j�'�.��Y�p����.�H�}E�����ޡ��}�v���M���Q��Wxj<-�b��F-�TN6k��/���b����T�ϩ��j@��Q6%`=M�%a�m�ujAH`����~�J�K�0j.b����a|��f��]�˯�	��i���^��5�wo������m|$`��/�϶k�<F�vu�\��+8�n��Xe� zb��.Wm_��m�#uח�1�R
̵�!+��%>���Ѱ\a�|%��Đ����H�芺�U-li�+g�!��:ںtݧ�H����Q	"e�j�0�3a�-�w���b��z��11�D|�o@:��S���Ib�ab����X�w.�<s��
�`�"��/�jE����l��x�XmS�8�L~�:cj����ͅ�]J�)
\_�R:�p�D�#{$�����oW�m96�\�sf������G�#[d����ٝ���:*�Ht�%{;;��>�v'o��-J1�S�/�F�._�$Zh�����j5���@0�5�����.��'	%�5<#��y��2�x*��`�-7[[N��E~=�����4]&T�i���~�
��+�T�`$�"<�	Qi.cF$�R�u*�@���t�TF���J�ՑU����\�J�w:�j��k�>i���w�Y*�PA�
&t��Dd��2�O�fr����<Ӏ���<_��[r�kt̞<�������j|������)N�Rd�p�[k&�p�t�u�L5�5��Y.b�@g|�KA�a�0��h�I�%|�G�\�w����>��F�-�oDѝЪE<��k�b�
�Q��
:g�3e
�K�C	���:�G5Ph��/L�F���}:y��)^z֭[aM�f@�-�o�,a��-V^�<4>Z]���������m��k:�L��p
����G�
)4�3�-�<I��[�|̏�	cce�<`&2�+{��+tC1�b���=C#��j�x�Q�dJS���'�g��fBDv�6�i:Ǚ�b^����zE����:o���U��(�-)�p[�8�,��?	8n	=�A�$H
%?ă��by!�"ta�l�6����B̙�L��v=�E�����`+r�>���u�,7�Lr�gQ�,OD�!ǹ��ȶ
{���O�]�k�@����|�J2�ԁ�
"�Cp����1��9�lV�w�:��WC��JI�"�%B�Й�ٔj6�킩�x
���l5ÅK�c��ea���XHU�z���q�߱m�6퀩*�[	����T�.�
��ŀ��b��$�s�R��+�'&��3j�w�,�n[�K(�7"G�x|U�4%���
޾��$,�q��
.d�;I��L^BQ��hĕ7[�J�Q�<^��@4����ϗY�Na�!�q�I���2_��5�I�4m�q_��� �Υ ;6l����~�]�����	h���Oq�ۤ8��ڔSCC�g,�&%v/Ge(�Gp��V���
-���f.�I\r@��"e�>��<��3��o+�3�?����vL�ٙ��2lں�v��?�a؝z#�)��<я��4��_\�aO
������e�;2�������P��oiE2VR'�$������a�6:�����%�22�z~�MK�z�v+�Xu��$X-�4��T&LX�]�Tv�	X[FA���"-_���-����s���#����(���Ϝ�L*��âzI�k<*�1Φ�4��Ю��*Άp��"l�̨�([�TWB����'j�g:��ۤJ�V�>�+������nϛ(Fe���1���f�T�=�L�"F���zY��fi�S��~���@n�~�2�Oo\���K��>ѿ~�)���P}i���Mob���V0e��.�$�S�	z}������U�t!%�z7������u�9�8���:�U]{�P]�U��
�2Â
�p14?JLnp��v~�3b7&�pMo`�%ٌ��
M`S�Z4���7*Ø
�&4c��K�˗٦�\���u��݈P�<��19V�}�_d�o!��x����C}��Df^Ai���zbAbrF����JJjNjI�d/�Tq�d^zf^���槜���9&��M.��K+�*�%��nn�y�
"��vx����C}�/�d{n��<�5� ��x��W[o�DV��l���I�.m3
���vڔ
�ZPC/zy!a�xg��xm�3�E��O��~��#ށg$*��3�7�ݤ
����9�o�s���?�}q��o����_]9��E�@�59�=�{����x[0�B6k;��R@-A��Y�=>�>eF��Xĥdη�:}�Xn��rc���d�"�R����=��מc��~���Y�K���+�n-�uڲ��:U�0.�K��MeI�Ϲ3򇞙,�ֲCK�;��?*��-H�w|<Z&7o^#5�J�'�A���p�N�(�B�!�%�`Gy�يK�ĦA�՘
��s���������4X��a�eP�*݊�_�;�[G-OՈZ@c?j����s�F���E%O6X�A�01܀����dgϾ����~��7JV�P�c�/n/\Y(��p���4&a�v�&ួJ�r}
\��d�rB���,.�V�9̍�`{n��������	���:e�a�R�*	���^�奐���@�BN�D%�"YW���%��亵
�����\�	��(qpUP[�u`6��-/z
�=Q7R���9�s�+]�￸������{�{�d��wX��>j��ǁ����E�'e����T�A�'j��V�0�8��1}J��*�$��<s�P��=5ϩ�@�0|�6E"��,�z��0�Z|�H*MOo����W �b�E׳rb��v>�Տ[�j���uC�-LKo�"��lZ���ڪ@�A �P�)�+R�/�;���t��am��*�<|�P>��%���Kނ
�n*J���U�h,C]�\��0���G�l��êG��j<�U�R�十|�e����oE4�K`,�:y~x�Ծ�����8���#��5�����-�r����D~orn���<^�I����6���S�p���4��>M:|�/i��
v��""g���l}6��E��H������̋��mfڹ�{ؗ���n�y<�yW@78�<ו��;Š��a��"�<犙���bLa�駓�I�"1�Jml�eS#3����X�(�-��-~-Ϧ�\���-jQ�lmW�v�hٛ�M:���ƳP :l�V�F֢�K���:��7u���SS&���U`Nyj7Xch��Ӊmb5j:#���H��h�[����$d��ȥ�R�Ag\�K���N��Z�dw*�\������il�I�i#=��Q����Zj
�-�w0R�IOU�#84T�&t���V����@Q&��РM;w�ǎ�՘V�!!�
�B�O��Q�Q�
5�/��i����I�&�'U��B�*�-]�R]�A�	��X*�?pQp�X�\���R14�0Z~��kh�Gs�|�	�^Lc���GC'�ġ�����\��t��'���������X^�e�(��K���	���	������-f���`�Ԣ��0�p�)Z���"H�E;�}dp"�0Q�#�H�;-�zB>�ƹa�;��FB�tg�"@�� ��������*F�L.���$�g��)��n���t�,S�@���3p��x�ix���������`�3w������p3���dd��0�`��Wx����Ac�D.������Ӹv2M��3��»|����d>~6��t��x���qYnC
�f��\��y�)
�
�y8����3R�5���@U��z^zf^���BM
\�z���������8n	&M���b�op��B�S�I�\�):9V�}�"O��*��\��%�`���r��x�� ����j�����-�5��1�x��Q]��@%����R��.Y&YM�.�$��PuED�1�4�rfRA)��p�� >��G��h�iv�*:���9�s�3�t��M�և��+F��a���z���!m����u
�W	*fpP� f�0�B�4�8�
Gg.�Dž�yf�(OB&���}�pc��|�Ն���I�e�y�B��Zē�Mْ��^���xP-PA`�GѾ|V0��Pn��)������qwA����t�&S�k��TŶų�T�mӄ���\N4ɶtu�G�װE�=�*]�R�ano���M-���#���b�
YKh����E|��C����_��VI�����&O����M~�⛍�����u"���6|�|q`��^��@L˔e�&Z�8�<���S��;�!�b1x����d��Ԉ*��2�A��S�ՠ����̭�9�D�}�f�xn�u����9��ax��U�kGƿ�x�6Iqہdj$v7�զ�6��jH��LB �Z펼�W;��Y9��S!Ph�[�_�K��C9��C��+z��=�ͬ~��&P�0�hg����{�b>�vs惟�33��̺|2���l#�˰+�tg��ty6��F��#E��Į�P�0��!
(�>�,��[�Bĕ�ʳ�m��_죘2�D�'Bh�($\�	j�
4�9İյ̝�}Ge2m�����M���G9���#����)֭[�+����tE�N*Y��U���n��6	1�E	���@*�j���0a� 4��{�F<a:�D^��i���G��]��=A��:i�����G-*�j��<ͭK>���f>/�^�A��狜{�]X[PKS�������h�5�_Ӥ��2o�\Ůˈ�
rE@xe�Y[Eʼn��1m��ɇ��_X)d�]�v� \�"܁kY�[�\Z���Nb��!���q��ᗇ-�1��9�'@ut����]7L�Ԏ1Je��1�t��SȔK��D�����h$>�6�C)j��͊�@U}��x�\��DG�~�H$ږY�5N.”Up��*�<.\�OhZF:��F���c���#�
V�h�#����	��p�0��FP�y寗��u'���԰e�xE6���C�ft:�����<����9�f�S6D�ߍ���!�����C�渷z�^�F��T��E�6���41�zIG�Q*ƝRA.��3ݙ��>�Ԧd~om@+ېl�j �ԓmO�YR&B�̦+�v�c��!����=�q��9��L����\O�x�p��	�27�w��Ϲ|�_�6��.e:��Ņ��Slj�XW���:�)�;�2��H�/�V�P��0T�ٽ-ѥ�5@
�<ӛ��/��5"`�X����ñ2pk4�C�J_%�|
u��	4��Y��V
D�-]mՀx׆ji9�g{_:NլU�-ժ
��F��sv��ۧ��9�tq��uN-��O؅w��5�W��r����ӥ7�=��e��l�vx��&�\h�,��5l\�T��$�
x����J�@�!USZP�XE�����z)T���A,xdM6�b�	ٍ�z��Ӿ���^�y�
|u7��/�i���q�e�iG�}e�ڋ���^�����M>Rƻ�t�E�0�J��!~^����$c?�N��
[N7LH�O�] ���5@F�0,@��)��,M�(^AL�G�,������]�>*m�F̵'�}��a��@�;K���O	�Ô��C���6��Ţ�����3@3FnL7J3���	5MRL�o�ujK��-ġ���k��:m�"F�1�]8&�e覐����!&7��h��9�Y��WҊ�ɕ�	4`�X�,V�ki,佚���k���B���ȿ��߈��l�x�[.tYp���6ƅ�Dc��x�;&���c6��Ҕ|��\�4��̼�k..$�� -3'5a�{��j��g�5kB����~x����Vq��ɇ��n�ƒ�A�<��x���Ԣ�!��I_s�/F���Ҕ|��
\��	�s��̹��1ܡ�W�HN��?���f>^�U��$ex�u��J�@ǩ�ilKE)-Z��D6�&�x�>A{�R��tk��b��"">��cXD�3xӣ�J@�70��Z�.�av����	w��c<x��Ǹ�k��˝ܑ��:��0M�9�Z�M�|9ک�z�����X���(T���.�"�i0���Z2�D��D�D�]�֜�#.�<+j�P"1L_it�蘱�1$�t���=�l�} 	���X
/�"�$�˲.S`����J`��R)����"c�����
j�QH7SE�H���I��0�K��W�%]�^����Q�X����ȳ4I��\?���,���4Bp�#��Hp"��\�C2��`a��נ�M:Nn�P�]���oFd���h*,C5b�ϴ�3�`�-,}䭿�l�Mx�kQhRؐ��9�c;�-��gx����a����0	Y���e٘<�l�x����aC����l�'���x���x�a����S2��������@QjIiQ�BZfNj|zjI|r~^Ij^I�de��ɯ�8'���N6���)+7�N�cr�l�䛲“?�JO旓�����'���\/g�D&���)x����fC���B��_	`�<A�c���g
���x�;��aC8��(>��S��9&�$�x����JQ���I��d�'0�!�… ��l�͹:�f���;��hU�z� ���������:����?�.����J
���)��x�P̨yc�!�K]oB�N%喀�纄[m��(�ɕ��:Y�c���!@�Zc2��1�J��3b|
�ˀ8`{Bb-Q��t_��8K�5[��&<p��E��K�j���x���-�6T$,�%�ϭd'�*��C:����
�H���97��~�
�`�2
�86M�6rZ�a�:d�R��oR+����F�iB_���C�w���"����ԗ�X^�� D�,�g�Yc|����(�/����o�ix����Zc�7����9��<��o�ux�뒼 �a
��y���xd0�_��x������8Y�I��9?771/erc�d-&��9L���O�-T����R���̜T�VA]?�$Y?� 19#�h�Dvaau=��̒T �������>ٝ��8��4%_!�(%�,k�VV��0 J�r'o���ؐ���W���K9Dl������0B��X75/1)'5E��ոl'�喝�¥0��G��(��$��DӚ�k�6���<��W��ex��l�ܐ��k=���d��A�ٛ}8�X�3��+�2x����J�@�I/j֝Z��[���V�.�bq%J��nT��L�`2�3��M��+�c"}�D�n|�X[/z6����9/�u����?T���mǶՏ���W�䳢�K�T,�б��¶�c�]�����c��V�5�/�S���ᢎ�� �*��9�]�	��t���x%ɉ�%y����xq�a�&����@��l��:y����WD��"0�;6"t�'���B�����Fv����X@#&`�N��qn!w��PKE^A>":�p9�p�M�r�1@%�4��QY����|�"���P��-�#�SX�4hsOw��P6 �ڟ�� ���I�w�Rf�O��L�wPN>����ӷ��{Q��I�:x���mk�0�_˟��l��v;Fai�eY`-��P��(�VE�Jr�l��<��c�븻�碌��WqiM<�:z	E^xg�o�lzЄk#�c��A?��$9�6�o�s��kk�����r1Q��{�sŻ8^�V���.��Jf��}�R)�rB>��[��J�p%;��glG�K���(�E�q��CT����P[���Ѐ�d\��W`�4�#
�ҡY?�<9�`W4%p�������`tsq���i�&J|2�0�~zLd9��8�H��`�C)��n8P�[�8<�&�C0��`�(����C(����m��Si,tA<
�"�t1��ףo��`���lA��;MIR=1hHdXj���:�BR�v}�*Bir�.7��S[
hKjA�"DH�X���)QjX����'F�U~�\
=E#���&����X5��T"�.Zg�C-�g��T�������
u_Y/(�:/(���

�5��j�]�bE?�a'�۝���
���U�sZ����#�-x�mRMo�0��WD9���I�6�\m������ۤK�,	E�㿏�@)Z.X���{6�i�L]zDT�yD��C	t~���D��x��i)r�.V�?ޒ�t�W
p��ԡ�Ʌ#9*�t�H��\ʄ�4�x$�ρ�v�ܓU�D���Ф�ҒN �D蓰�C����PWh�2u���S�'����Q�iI�R�q�,;��]�j��{��dG��m$����Ct���uJ�=@@1!F�=��肔)�?�UU�Ӷ���Q���O)l�꤆�0��)��QW�=�z�3Z�!]�n����j�d�h��B����:�,Bj���:�p6�hs3c't�n��nB7�f����|o�^x���z�u�����dE��'h���x��[s�6���+0ڇ�mK�Ҵ���&����i���� `s�ے����=)�FQ�%�j�<$�p�9�w@���?��s��X���W�����2,�#���_��(�H��P(��6��(��^�2E]%�M����b�Ţ���(Ns����J����,�bzrr!J��YZ�|��'A�O01|V�ܘ�B���oa�FQ�\�r,?f!3���B$"A�fe�2�P�v��V�4)ER����\���؄X��c{�w\���~�(c�
+V��g�_:O´QGY����Z�Wg�y���G�xL���1WլV����L?�",׊��Y����ay9��`��23dx��j���\H����c�K�Ha[$�	��`˵��-lK/�'�9Z���BAX���f=�aY8^R)�@���@e>4�Io�f���
p�Y�j�Q.�;�-�:����[c�]�ܤQ��,�]w.��Y�S �/
��h͡s�ڈYQ�_��z�h#��N1U�RlQ��
k��E~~�ݼ��ϕ$E�O�*D����1���h�9[��s��&Q�'��B.�bu(m|s�*�o�f�L����c��N�Wo^�8��v��"��jY����q�_�V��.m 
��YY�^ߥq�&�i�F�\2.�?@:ҡӷ?��s�jm�u�V����M��Um��*\M4¹"=���Cxpw��,K�-�bX3=��2�I��m���%�**s!N�I�{�	+������3�L-w����ߋ�KE�L��m,��V�Q�Ѻɗ��k�?�Q��5�z͖R
���t�88`�K�cF���I*l�<��O8[���̕�E?�
a��c��1�
�)sQ��䌗�Ͻ�c��]�t^�����32b�(s TU�&�>�@F��O"�I��K�� �5LIk�ݡ�B�w����b
x���o��*�ҋ�5:��-�*��������,��_� pWNq���V�J~Y�ˮ�U�'�C\E���d��:��ne1#��H� 1�[<���u��8��E�)��J�mXe�>�G��#�ю�khk����-ֿ�R�/t�r#��Y�x�-T�. ���_^�9��u^��C�Vr�2_��4�^��^��FQ��	h�e�
�[P�E'�G�@2Oc�G�(b��2��~r�U�`�o�nX�HЩZy��n:��Y�5�����]k�j�b�
�T�1K�rݝ�m�Ē,n���{��|�
Q-��\��UKb�k�r!���a~�:m�"k��됾K���=<
���([���I v&,�#��A�yT 5�w�19K�
Vz{�ZO\v�"S�����ϊr?��p@7�ҶcE���%(F�P���Qk�cU�L�����Wz��VR[�*��tJ'�+�1�#�4!�]�ɇ
2[E�rRgb[�8�9ܖ�c�a̱i��X��͏ �lU�	@{+r0�<x�XGy���P�5����ڶq��%W��ݴv��@�������ݖ��ˡ��J�%:LQ�ϊ�~
y
�^��mm���Pz\}ʀ�
�oC��n�����*��e��a*CK�R��?��Q�clUմ6@զ�	�����Lm{j��CU�0ɵx4E���XNyX�Z�G���l�Q>��kV�M+�t��L���]̎a�~U��zkp0S<�
���s1�N��=��V*R+s>dE�iq5X�h:��p�7���3^S�c"���eFζ0^���^����>��ߩf޺��b�k���B�]�=�}�O�3�^^��>e���4wz��I�����x�F��M�:������·^\��*��ib��M	�
��`��3���=��&ed\�q)⣥�!{Q�G|��m̥g�XԦ�eN�kzb�J��������7��l趷&3����N(U��t`R��¤o�?��_�}����ٓJ�H�͇��?;B�2'�4=��^[��0~4�]����v��NM�3J�O-�Pp�(.��?:?Gzz�]��p�	f���L,��~�SN|�;� 𣍩'v�%y�]�@ܾ��(���I �OMo��f��?������-�5�عf�"�Xz�@."�9���6b�
:����K��@�QωS�L��s�����HQz._/���mPI03Kɥ�̕�[�	�e{�>&��+�so%f���睻��M�w�r]�0��?�>2�4������Ss?A�T�'��-ӹN�K�o3�;P��:��ψ7��0[}�S�y�p�δ�v�cA�or�"�`��幞�&�t\�6��xWk�8ت�3����@�ρ O��k�+*}X*���) -@��.s���H
V�r�����F�:���x)�/��մ5@���R��Ί"����a���@�#�R��R�®�y�$ҦB��-}1�>�E��J,vdP��J{kp0SP�*U%���P��JW2��o�}�`�~MƆGձ��y�o�*�/{c<P�!��́�*��Oe0
l�ao�Q�?o���Ə�Նx��X�ĵlOR�㔘���������"XR��W
6t�[��Y���k���ʱr��T����A�j��:O��Rd��W;����Ͱ�X����?�3��[?���m՚�փg��T��/�^��j�m���&+����a�uY��S:�!(��Ymٝ��\�Ej���m'�dI������s�p,��&�:Ё��{��m����� r����c�lN�G�C-N\�w����u��X��Pwu�mo�f����-g�M� �_�u�72���!�sޥ��]%{0��r˓"j�D�����?C�y�@�AT��ra�-
ʍ
�@���l�F�0ޙ����<�.�>�^䋅����/�/���{p�C�+¯��V?���P꫻f�4W}���7
��/,*�
�fȿ-E����+�C<
�RU�|�1�S�;&�!�Z�P�
��
:�� ^�+���� �ү5��F�T	ރ�˛�+ �S����A�^��:�����~V��[c�}T�W"�������r�%�X���ij$�}�v�O]b���ҩA��r����c��U�?O���Qm�L�7A/�
Pj)����:�R���kL�W�~��������ef̵�ˑ�����W�:\&�8��j��MgqV,u�=	s>��{Eg��9�٦�	ψA-�<K�Px�T���T����w�ֳZ����I�bCݘW�����M:�&ɐ�X)�ix0�S$!��ij{���V�"V���W:���_��q-��BY4�@�XBL:V�D/>��?<����.x����oTEdz��G����@�m����̝�;wk�?�EP�B�޹s��nK5b�1�H�y1� ʓ1�G6c�	���"�$&>hP#��{�n[B����N�̹�s���緣�9��{���u��0�1q$���,�Z�4����"{�h�7C2�YpL���
�:�Ą2�x�8X`ۣT�1恝�`�~�.�*|Х��!�^��cE>4�p��KS��|��\�q��wÉ�Z�l�f7"ݘ�ƼDD�0�+���N
H��;8������Ώ-��p���$��.���<+k
NA<�
�����Z8�J��J3\��OV_���O8/T
�y�)� ��?�V�gW�iO5��T�+kg�"p�Ƚ;�.����M)�����t�F��=��t�-xf��%��H'��#9�f��ͬ���l���J�"�ۭ+�z�8U*�.e'���xs_�|�2��}��j���cp�����]�dQ7��܍��%�u3�``|1�ɷ-�B�X�}U/4��|gKN�Ǖ'���K�`\q�S��r�2:Օ�B���e0�h�����k��GnD�o	��^c}�X��{�Е ��Sw���?�h��������o�HJ�;�Ho�3�7}����r��H���RJ�<�Qf�X�ͦ��:�	�mJ���ma�L޶:���A���}�6�%��I>�uN�$�xn��$��D����R��B�"�������&v�r�m�:�I���_?Xu졡͡���O�e��t훁�h�[ς�N@o}��ln���
dzld�Tr&]�Y�H��ӿgjױoU��É�>q�,w�����'~�c���֎=���
lݾn��W�w<ϳ�͈���LA��KB�k
�)����I9Y��{F���A>}�s�[ߺ;�x��b�~��,�򞮂+L��\ϙG�kC��#�G��v�`XO�N��Aß>)61T�c��1s���}�-�/�jw7�"�E�:g
LH��L1�LɨE$�R/!)��4������U�U
����+�u�Fp`�f��L�SuY#���H�W�˱�pi#�}�"F	�E\��#��S���r�+,�Y��A�De*K�,���
�N�d9>�'��10�Y��i�%�a�Ѝtd�$t��ե�gy�_�ٙW�X�$�;����i��w_�yxft����ȶڿ�u�گhM$�kl�`�@^����<i����3�' �DEI+|P���G1	<���
E�ߌ�`l���B�p��
�"L�����5;lՅ"t�_�𩂢�6��c�t�春�#���ޫ?j^�D�n�=+*Q��yU^�Ƿ&t��#y$��f����^x���KlEǵy�ͫ�n
m��$�
�=����!UEjQSE�T�3�3`�N�8��.HE"̹�(qL�	D�Π�ĥ�@�7$.�Y�v���Fڃ������73�����Ngg�����ʪYo;�Q(��������9ؑ�~7�f23��owgWW�ʖDyU���Cf�D̘�e���%S�O��"�i�9ČB"h�*�!��5�}����^�9l��D��o��nW%��͜�;�i��3}|��Xv�_*��b0\,,����A�s��=f�J�EQL��c�
��/��D���S��by��jv\w3(�'*��'��	�������r�d'�LGb�
�0[g��;���O}� 	�Ϩ�!#d�����R@�$�:u�WזU��²�b6��Je-KE�wR��VV�1�_4����pf�\M�8�W���M�<�=Tk�fKXnqk�����	`/6i�x9����3džw�y��1��Fӈ2�@I�|�����0P�1?���L�СPEV�CY0��sF���6競�|	��ٿ-f�T�߶��qsrl4E�Ǡ�=�b�$�L %`��r$��Ei��n]��ND����ߦ���s*�&�Or����r��A�p�7fN�>sc�o�);��!Mk̘�Au�	0�/À��X�q�
Э���D���6��i�>�7�(K��gn�L6�5�=�J��p#�!ͩ� �iA|���^<�%���ѯS����=��Gm�;W���&�7_�n/��}��x�y�Lc-�0�c@��H��4qU�]ñ�x�����E����7r}=���-�5�>�C?|>�Z�.�{�i:�n ��s�֒k�C�K�)( 
����Ս���3�u�3��6>���C���Ŋ�0ތk7U�t�#����В���.\y|���iW�1Ha���]��mJ�	\�T����Ja��ZY[�����L�����~���7�As�-���<� �y�BnH-w����[*�JK�+�hhS�F��[aJ�/ŘڏX�;!��&J�qde�8��f���
�N}��e�^���ԘI�d �
��d���*�V���u$�o�NQ���x��Xms�F��b�a"ɵ%;���B�0v��N�0�8��BRu'���ދ@o`wZ}q�r{{�����m<����nv�G?�v;�^�vρW��>~� ��$䜆H8�k��z7�.�s!��-�KW(�R�(��Q�6�џ,\�\�3���4�,
�{`»F�h�eb�N\?Zx_�hEϿ�Q�#4e% �|F!�I<J�BB�3%��k6C��<&H�ՌzZ�H��4�~@8���5�8���D�Zcc;�I�`;(���)
�,
}!I�Q?�-�E�������o�
zE�л�GJ����TĩؓrS�;f|l����
��N��.�j?I�g�f��h��v���/?^��g+�r�<6v�M�E�9b�DK�FC4�-h��Oc�0��(��;�Щ�x�� 7hÎ[���$�R�W�h��^��@�?gBE��O9�qk�0�#��nM���R@d;ْ����M�IBm��ݾ�Bk��F�iBJd�YG�{`��i�z��&�G��eq���=���̺R2� ,���39�E�w�h��0���~�*�G΀��h���(��+&4,ddv�4�r1U g��E?tϮ�2�ӐH��Q�H�v��, KzyRx'?b�d�e�g!�	�R�|�`�B���S�ѽm׶!J7Ժ��ދ鱡���� lN�Y��ƿߤ��-���;+�양.�A���*��?��ݫ�Sǟ�.��*b�f�E�����?;���%u�x^v5��ci)�x�H�Ppui�L%���a�4^�Ay���$�k����7UӤk��bʬ��msН���^IT\�n�[��!��}��y�.ɨ6n;�(\�dʷ	
g:�.�������^��Y b�C0���G�(�"��<p���V�e���1G�פ���awEz[-��`Y5�\��,���.���Uz<)J�fX��1�h�4��n���)X^�&	A(��{���[����M�>Vq���'�w�� s��w5�ǵ6ir��rY.�l:̃�C��)z�E��R�l=F0%�/X;�ph�
���%��^������|W�T�Wf�$����1@�9N��>�KGU�ը�9�:L�9�����b������)�>�!UY2��ZǗg���sk#�i�
���4IY0�&	��%��������+�7��{O�e����y��6���1*�4d��]h�h�t��U4�P�0��AU&N��G� �ɛ��=�J�h6msm *aT��S�����z�2��1KY�Wk6&.�X�ܫ��*g9��3���a��>˼�W�q�:��{�[��=۩#3��F���(;�[:P��l�L�Rx�]�ٺ�vL��L߬
���[75lt4=w�R�aF
�M(�Z�2|�j�4W�� �U_>K�`ݩ�e�4��ɞ�d�6A���a��d�(%얅�����f"�vJm�Y�M��,���Tm���(�▝資
�I#�2�9cEeա��`kS�0��E,̄!{:�Np�l��?tT�{V�����Dj'�"�:����;UbK3N�\��@�!��Zs�v$���[�W@m�gC����j��Z&L��R]��xGr�Y��G]Je�3v�.�$i��4Q�*��;�M�n42C�*<��m�#���he�a��(��]��1nS�a(g.�s�Y�Ϝ��F���\x�i��]__�/��.�JWM��@��j5�nl���H_�0�M��1���Y�k��v.�U�*U�1nuo���U$#��4x����@g�~�̼�Ģ��J��9�t��M�u�M�c55'���#�rD���x��Vmo�6��_q}�l1����6}I�4
�t�1%�m�����o�)�J�]1�D���=��!�\�J�h�ʆr�}�Y��dw\�{Y������Z���o5f����▹�Bh�4ϻ�W�	��u^��m��q,/Ӣ|���
=�B-�\b�&�]@�Csz���
�Z� X���2�5HS�kY��	x�Le;�G硔��@����Э��_��j�������%{"��݃��w�\L�g�pvt��xց����Sb����OЇ�n��Qz��W�-<?G>����Aj���Y�Pċ2�-�4�`~���R�KU�8����v������k�VH�E�D�,^c�Yh�b��8.��(D���v��H��*!,�ֶ�eZ�N�+N�,Բu�B�JaJ��t�D)���Y�QH����Uj%=�ء8�J*kE��X�m)ᑄbܕ�cN:�h��ƺ�>�{�����b�/_#���2w�d�B�+ZZx��J��$��vi�+V.�e~���7�_p.=�=w�Otj���:�SOa2��7�9���� t�dD����'�������z���nO{L^��i./!���͐"1�����Z*�#�k��h�)�}x1;����AD�
��f-��#���`d��6�{���;�1���0�U����I�T�m���F��M	�ڰC��!�KQGو8\N&4z�כ<��V����H&X��He냭a-u�8`�+K���o���ˣ^��R�2H�,p�j��׷���P#퍃��GzK��>(�]�hQ5�hwۮ[�a���:F��ʇ��-�
x[]T�l�O�Nn�8��z�P锺3P[r#Y�6��$�����G�2�>��m�sb'�ݔiL�P[�Z��b��}JT��C?�ӓ��O?g�}Ƃ�F�I�C�v\�
�j4%�}��o��V��S�Ea�$��]9��{�>�VdC#�d�lH�l�w"Et���6�ȭ��=E�>��Ȓ����6��)�% ӽ"�#8>���]��討Od�
(��+�F�(G	��U�)@�8|sz���ٻ���W��b�I�M$`I��qd��f�с=����]���N�Atc���p�J�r�gY[Е,zs7I����1/:��s���v��볓�O×N�_��^�p��*{��D����G.p$�r�!6_/�
�2�p�dT-�{�9I'��+!
|�Mߋ��n��q^�`��n�ۃDc�U��{>�yxF�~�3�-�&��x���)���f�_a�+(��7�)|��e�<� ��$x�;%�ZlC��g^qIbNNbIf~�.�,�d�•�����hk�g�ُ��pPjaifQjnj^I1���{f�䛌2<
@
�y)
�z��9ڙ�hn��x��Z�rۺ��S`&�τ2�_�3���N��Iz��X	I8��%��ԇ�uw��Hw:f�ID��ؿ����_}~ws{���/���ɷ��,^�l%R�b�X�Bd��̬|MŖg�=�ٛE�b<K�qYH�gK�$�)KT&NdƢ�ۊBK��L��J�+��%[��q�s˥�ݴo�J1��ژ\_����Y��A�6g*�I�Q*��� ��U*��4gOOOl��^I+�����^P���Z��0;!2fv��� 9/��6��w0�����76�_؛a8���"�O�	�?���$	�G����.�\��"�4�Rf��4%��'#2��7w������,��sf��b1/��r�Q��(�(
�,��+
�l�`������o^���L�3|��*6jK�+ku�V�D_��W�n�c=)���oP��E�H�K��`�)���N���`ZsDa˘W�b`��Z��
�+��-�j�盔��%/S���t��R0P\Q�DhZ{2���Ct�0:=Z����ʧ��hT�p�ôé_��&/�m�K��7K���&�NË^j^�������O�pt�w�d��>�^}�������|w{����
�V*�p�-/$_�x([�O���m�e��*��
�N,
�L�Ȣ
��Xq�~�D�8S/�0�w������˹Yk2�d
ȑ۵�F3���ׅ"�F�^�F�J�I-oԩ>��YVn����8,�P�Ѱ�#h�<�\�t����^������
/����Tf�t��b������= �0�
�{+c\"��Vs
�_xѱ�U��x�,-�L���$������3Y���s�pr�_
�Š~�!�UQ�ذ�2r#l}�>��v��E8����cG�F��o���
:���$�A�kT��˴A�\�T�P�I�%��\��3����x��.�L<�͟c܍��^���}y���ۅ��,C-Աx��JUE^�iu9�2WB�-Ly(fc�=�/�F���i��f����"ȁYC�N��~�9y�{�!Y<��@�^\�|\�%�z����>8"y�) �G�<+y�DՏCui��?�d����J�I�5��ƋUIL��Q/����1�=��CE��Ã$��9!,~�4��� ь/��9s�?_
{��p��D5�z���Կ�\{�K�VN…+f�6��|b�k۳�m���}�zK��(*f�0y6:^�+X(CI�1[y%R���YK�^loڕw�
�#0�A"�ls��R�L��v�+x��g�@��]H#ҨB�gk�UY�P�/IK��)��A���p(�9��M�����b���a1�<��$E��_��	:faW1c��,,�4*/��u��C��:{��ݕ��xY�Q{��[T��jn5u�tU&��+f������%v�KX�۩ⱦt�%�=q+b��Y�k�� �T 3p�\˔��/�q~מǁ�C��IP�]/P���a��trҋQM.j��b��U�q�ە�9-�L��l H/}Lj}�{9�Aت��j��y�*�������im�-�D�Ze���u��|ԙ	h�/�ie�4��z�ZH���J �x��H^"وz	�.�}�2�5\� _��l>�4ǰ�<㨕�\[���D\j�6�ޢ�UP���C�qky!_i�4���~εfPe��T�`Ϣ_ˢ��D� 7q^�O"�T)vZ+Ē����g+g�}|ZDž̍_n�5����ml���6E����|V����	T
�(��s_����Ct���W�,�Ӊ�6�T��-��V�[�v�j>x~Ŏ��g��g婞x�j�[�����.�m��s>��)��`��n��7A��B�_2�Ɂ`b�,4Q�C=ˁZ�A�����?D!�{�y
g��$l�EA�ź��O���K�&����ؘ7��s�+�b�
�W�)Ȼ�*��1{	�0 �r���Z v���BHEn�ן�1'P��8&*������0i~�a��N!�x�kÇ-Ã`h\$6��~>t�Lp�E�C�d��y���R�m͋m麸��b�XԛLCF`�nq�$��rQ�{�����2��T����:q${tŁ�V:���b�.��\I��Of`]��2�#nL�@	��Ԩ���ޭڬ��nVh4G����9�>Ě�
r&tz��;Od��(��~~��EE�J��0�N������;a����b��[&����b%�1DN�T*��ND(����_%�H6 +Ȳ2vUf8'^[g��1q�]kHm�2�d߳�CM��ͺkr<��(.�'ܡ�nw|��E)�������㌆��V
� 8j��<�x�x}�g�U�����������G��m��Pa0Kw�)\�p���_?�5�*s��xV��J}X!A���'l�
���څ�y/b�U���{�j%c|	 #d�'�`��U�$�qp띑��78U��4	�`��"�t�E�B�qoVy��������
�д'�ΦTJ�	l�I��`П"6f�����`pl��^/0��6�=ڕ}�����D��Z;�>����f?��C����(N���)y��$�9��
l5���mQ�I����%��\��96�����=Ȅ��`����?���w��T����D���t��a�	��E��Ʊ�aΘ~A&O�F�~������13�Zȕ_FA�nE�x�A)���b
�ֵOX�;q�7$4{lQ�x]/���Ķ�����ž�	��]6��[�Qr$߶������2�uy�7!��@��u�.�J�p/���6���g���{��,ϵ��W�,5���IT�g0�H/8��RX���
\��.�G��XU�XŠ��BI�� �,	M��79��ȗ���a�r��!T���Ki��cE��i������MbS/n�j[����'�gκ�zX�am9t�KoQ_HY�ߜ�g�Ԕ��*�S[�-�?��؟�mp��9��T�����Fa��*����(�@uv�C�V6.d�@�8����$_��@1`"�Z�*-�����"�\�J�O �f�J��O��t�M���y��=�Z�@P��+�:s�1oj0�����3A���߿1�},�����h#J���6K�uAW:�SJ<��'��Z���WP>d5���Ơ�Vl�x�k�濡�q�+��!�d�x���?+`Cc��������������������h)8����(�*x����$*�(���(d�)g��Ze��$��($�(�V���g��E��ss�2śK��#ml�x����oC��o�T'����x����oC#��������������b�y�x6+2MU�]캛x�X�o�6����� ����I�e��k�J�!	RZ�b���T\���zX��v��D����q9/����D�K�n�z�~��x~�1޾���9��p�(W@x
oY1�)��iA8׺�'��bi�q�GV~��;;��?Y�xY�p
���}��R1��At����/��y5�QL��ȉ"W��q"��J&$�9��p�YBrP��	IK��r��'�'U%��g���c'�E�^�a�>*E�Ͳ�_��Rp��gz��S^V��N�MU��o`9������R�o��pVi���}�1�*�Z�|��.�5˷��;)�K�&3�%I4$9Q
���D�'My��{z�yx�Rh�h��#���-" QnoQyC�u��ڞ�D#6�˩Z��*��!���J�1��S�<�BZ�z*�gq�$�FC�݄C0�cT�-�"��K���"&3�'��'p��;g�y�9S�#��5�B���3W`쯬� 0�_��:?}}��*Q0�KL{D�D�)`2'�i�`^����8�w��9,0[!�HEA�cGVEǞ���~���Ue�Ǝ;��M���\o�z�7:C�J�* �л�r��-��Nu4ktܮ"Z;^Й8F�u_��8Y�e�\Q(��	TI�1��x�jQ��G|�a�m�Aj���ҕ��]�M �aX��"���a�R�Hf.�4#U�=�&�;�aC���}�wDz�^#�bB�a�$Kih���Ǎ�/��$��H,�q��BkGcZk��K��h����Bꤪ�������_�Ȧ&7��b���
���#��W`�mSX���͸뱃�y�PGm�����H�Jɸ���;5�����&��GK�D|-Y���\���G�F�ZS���'��
�!ͪf�1N�>���1"W�_P��;�p��]:l�/jG\]Xl^���i��Ǹ�v�Z�w��X��݊��[���k�:!u�Y�D1yhhE3d����hz��k��~��-ǩ��Y�#DC�]��)n=����Za��Lk���⮕_���Z�q�т�h~4�s.��� �#�ũ��JT��o�߃��Ym�8N�ιi�nI^Q�=�'TR�ߏ\�fK{TÜ�hn4�����䮷8�w��l��jU�Ӵ/�/"%Y1N�k]�3���
��|>��{-Z>�P`�ceNǘ�ib?r��D�$�38�
���W1��۩/��9ïJ���.�nܜ�4��)6>�614Y��Ϛ�ᅐ��e�
�s��)W*�A{og����k�����P`g��:x��0s���/����%®�Lܧv-긘$����߼`�Z%:u���k۰F�z6���3�6b���U{L[�lJ�4}���ܸ�B�~�� ©
.��1<b<GN�+�f�4�{W�F~�#-�h��]�~�t�g��~�Z���އ�NH���&s���[C���oE������B�̙�v��xb�U`�H;��h���{��-h\-vM�����̵��}�}�]o>��;M����Q�鬨K����BF���+x�ۥ���*#�5��>F��ތV��0�M�e�L�I,.Vp��K�L/-JLʙ��IY >,�`��W��c͵��M&���xWC�$#�X��h�e�VE�j.4����S�Y�V!5�8��>���
�'�r)I���L?�/)ajj�M��=y-���DN��k9�٠�r�Ø�\��(n��W����VH�/RH��OJ�Q(N-)��K/�BQ�������Ԣ�̔TM55��b�
�c��!��O>�);�5'�$�Dl�J^bnj,ȓV��lv����6x�ۥ<[jC9��L�̛S�B�<9���Sx�ۥ�Kj�!��0&��r��2jOne�4y�o�s~^ZfziQbRN��#L�*��`![��Ҝ��q\�����2mN�
e���x�ZmW�F���)q+��m�͞=q�.�5'i(���G�c[E֨������3i$�������y�s_�{����e�~�m�}��t�E��zth�1��Ǿ��'����?؉X	;	)y"Y���E���9;�����K���px{{;Pzb�p����(����k�(�v�_a��2���g2	�n�SlH�=*(."�̯�X
bJ�X���H�+s�1��,�Da3)�,�,㩐���N��L̜T$'��>W+89���7{��䒳�j.�5ͧ"�*w��4W�� [�+�=��q�x67���&Wt��pv�>%�y����J�,�0'm�b�&/�P�<My���oUCGaH�ƉTA3NڛI�����P<T|ƺz�X҄y�X�e���=o����<�:ۜՍ��<	��c-�pH<���l59+ ���U�H��h��/����{%��H�ⴌ���0�R��j�12G�,`�M�r%�H�A�V\-�l�x������o^u�����b@�Wq�\ӯ5��BGX(f��C)N����p��m�@�n8x�$��h`Jt��M�)Wb�=��x���H�Z�P�
P�a���F�\�C��a���JkGO�B\��Po�t.jgE�1�y<c`(\>bNQ�(ҙ�KB��Kю�X ٌC8d�4U��ׯ@7���j�鼄~W"#-nHp��J�P�bu�m�LM*�yF��5Th#Fx'������C2�ߟ��-�i�u�:H���8��9��	H�p�EF�)&D����`x��R��V�/��au��:�G�7\�#7�o�"tF���H��٥l�3��z�C�jB�m�K0�Y��kiyn�vk������Oo�g�G�#��i��F�����/m��#�`��!��
k<'RK+������C@L<w+��]+CD��(�ݙ �@��1����⾖��֍H�m������}�g���v���l���{�y��/U�1J�4��)����)pkhOWA�[q��^�����GN%Lm3o��W{{lĒ7���<KX���#4D�]��ݶ��z.�8*y���%�DB��dVd��,��}g'�nTIa�c�d��f	��e/yx�ªќՅ�h�e2�.��0}ib���u�k�
>��N�z؁��w��m�JӺ�n�,~H��(��
d@FG
و+X<kɥ���e	�e�38U���Bn��fH�sߣ��%B��͓و}-��[v�?I��aE�;��͸�c��Kǐ���gM�7l�
g�f����yB�;��R�-x[��]-�?ґʢ�_�c�SO�oT3u~ho�C���R�(�vy��l��&	��V�%�1�T"v�y�Ka+�ΥȭÝ�>���j��n��#H�}`eekQ;�`�^�������W*��̳+�֠Rf�{M��~>>{��||���|;n�I����&�S�X*���-G=�v�%��=ԾAʵc!4*g�q�x�n�t�b�66���'�̇���z�rO��������+oEF5p�����!��Lj�to��9���R1���}�)h�0���P�`鲘ld�Oa��2���.K��9\W5�i'4��H���(����t����E�q��0��[d�^d�2�l��JJX�֗R��#CV��Sp3�G���c�3�ss��<�Ga$�|W��<�}����nM�������E^iF5Q�9j�f|��
w"�{|����o���iS�n�*Jr��=f�:J�
�����䬼�h�ӝ*���ĵQ��Dj��톌z��y�I\�{Gj%r�Or;�B;I�m'�b���Ƌ�\K�WSsS�M!׌o�a�$J���@�x<�k��1g�C�?�pg$�ظ���� ��ȭ�����Kp�r�~�G���?/�����=%"������=H������.o�@���������-^��=�հx�Vd�ꥲ�޾SkO��}��a~ s�9��6{���*��S���n⎄.��K���jvl�L��=v���hoU�՜�T��9V�E�]�ш�Uk��,'�ή�^���DY�6��|t%�n+y��]�sjȠ��6׌�+`�<��uP�f[cQ��ʡ���h�.y�$�pI��ÛI�*�Ie���u9��s���[~��M�e"�m=�b�nьD�s�2�����l�<Ч�,�*.�WS�i2]�������
��B���^�u�g�J+���m��)����"�N���Ӄ�����go���p]�Q7\��iIs�B��F��<�+7�u�<��ע��״�hgո����
��+��t�+i��\��c�G��+M�RXA�f�{T��,�&��%��Y���a@�'��ʵgϞ�(n۔�i��%�lKc�8Y3
����4�y��&���Z�\�w��Ɲ+����\dK�EX��(V
�����_�gS��e��ب�ӌ�C}'^i�]J���#>tgw�n�N�(����:�sb���>;1�̛2�q+53]MT
ЗX�$T=4�N�
���䰐�� :�=�V��F�"�/�9�yxU}X-����i���_�vE�ia��
��&�j���.\�)�6�)ָJiNJ�xZ�l�
{��HC�-�^��O�֩ZX�a�JuO�Z�7��ramٸͯ��uz4#�,��6Q��s�d�ڎ��O9��"���kJu���W�v��U���#\�����օ����-��j�T�\�)�7AHjG2����f�+�r��l�t��"N�6�_���
��$�6yc[BS�9^��m��~��bT>�M��q��Q��5b[(�\��q��+%d��zh�Ov�!uU֊�j�D �?!��5y���L�2�����#��6�TuO�P�+��b[oO�.���S�����_���8�X�����3�sQ�&��x�6d_��U6 ![��C�-�jh�}��V5�[�QJF�pڜŝ�����A���%��4PK(Ĕ����{��.jMQ����Y�Z!����C6v
��Ȏ�g\�T�2G'S-7X�;��2��
or/�u��{����l��vQ��\�P�����o��bL_�4�������&�|�m��qrr��
Yz'�3}�𽢎C�)� W;����/�:���$R�O��.���Mz0�-6�&D��*ǚ�͑j�|���ˊ^���Gx�k��1���d��<��s~nnb^J���l��69���ݿ�$3?ė���QR39'��X�%�81)'U!��$5/�X�1���(1���/jઞ<�]b�{&[]������T
�T��U
�uM.���r�0���ss�J�'Oc�<�:���JIFf��]I~zzN�FZbNq��5�dCI�₢̼�4
%�̼�|;�;T�2��RS������)�(@��[��i=��c-��a��J�6x�uSAOA��,���%䵖�hA11��`"Q$���h3�Nۉۙ��lA�G�I�.ތ��<y1ވgo�z��L٥Eq����}�}�틵�c�{bX��BI�ϣ��e�.��r���0����ϱ�ޚyyؓ����S趢\2�%Ԅ��a>����J��w=��H`������d��A�����:&��&�n�N�U�ʨ@�!���"u�pUԸ��y�S�
���va�y�<�^�ܠ�x�uM#����"�5Q��Fp��j��7�j�JaQs�55u�t�ES@;��6���?�ct�s��#��	m(hK�x��y�A}ھԆ��Vz6!E;y���)X���,<K!��_�����4�dz�8��g�y�}���oG�8f*��2���u ���8���q(>�_�xx>���� q�'��!<x��ǾTf��l����f��E�5�;՛	]�� �d�ԗ�r�;���\e0e�X
���w����T
�AwrN��o��T�G���uh�I���
���D��sa���.'R�TGO2G��X.]�7��̬t�O�k���43�ի�gp$1z�|���:{	2P�RG����m��Ń�nL&RY6S	�W���җqr�~���`/�;�o>�h#�u|�N"L��3�Ll���1�;ԥ�v1�'���Uʝ��R�s�Pv�]�/˓���x�k�i��`��9��1��b��;'B�
�Zx��Ʊ�k��riq��W~~nNbI~~Nq�s~^q~NjD,&�$3g�.Sc}f���ge�Y�4�P)��,ֵ+I,JO-�O�,��T��R@*��%�%�v�E�%�J6�EE�Ev!@}
����y)
@f^~�BfnANjnj^Ij�BZ~�U
&6� =jEv1yJ��\(�����Y��j'�3�Fm��x���q�c��k�dK�.�Լ�ǘ�@��L�K�J'_fv�J��M"���mx�[͵�kC�k��x�.�Լ�o�Ԁ�͢���%E��W�8��߱�E����x��%}Nv�!����^���9�1�%�9����X�3�4@<+��b������*��%�%�v�E�%�J6�EE�Ev!��
����y)
@f^~�BfnANjnj^Ij�BZ~��}���<%Mk..$P�ZRZ�g
�EH����ݼ�͟�9���x�Zms۸�l�
ģ9J�M:wɴ�ƾ8������M�Sw4I�)�%A��]�{���D�Τ�/�+v�X�>����9]��ӧ��){&�]&��u�~�����G��?�^��d�cv��<q�x<e�r9�;���g��R�0V����5�#�Flm�O��(�켘`����]v#�\&1��߷�֖�8�jQL�0Y��dq�$Q^��&q�@�Y�1�,�qːG,O�,,i�K�dw�lo�|)�c�byul�\��?oo��s�7%��߶�4K����\q�#��V���Ƴ���ԋ�)��Y��)nEX(q�,��b?W��笇�ѿC�����J̈���^R��P�&S�i
}r�aRĪo����������,�����W&�\�O"�i����o�ǣ��R��0_�"�\ZV��K�Ȓ�Ŋ]]@x���P���~y6�Cߎ��q���.q��V*F����~\��$;$\�b��Kf�h���^N�m�93��,f(�*&��|��Mx.`��޼v�v�>�
ؕ��1DMy&`Wd���\(��q2�s�0��]�=���}?<{���&|�8��.[m��ڱ��I�r��Ӈ�HZ����������&���7B#�9�k@�r).�P�%��ph�Ȑw�"SR�LݥB��Ւ�@�h�_�N?��ۊ�
���$@1L����ptn�W���.nN�^�X�!��/+���&�%yAɠT�T���t����@��`WLA�T�ջw@���5g�:B�'!@�s͆�
��It���Wq��^���aa�g��F'����Vn�����tt�q4�ZO4V9ލ�|�F�1�oμ}��>�N+�#>���06^����<��9�"���]��SB��=I�N뀥�מ��IP;�h��]�f]4R�T��Ĵ�S��V?;)ȩ��XS�p�����3E~�c�ȩ`y��	�Ȫ�E?gI���4_SB�H�q��G'g�O�����>��?�7;6&�fޠiyN��66��;5��w��1Ӟ??�<~�$�g�_//�܂�k�0g�E|'��k}��"�7C����cM��g�����sj�߃C���d���
������}�����<k���O������N�RLe��}���N>:zKF���q�!�4�mR�CGzԼ�OS$��q#+p8����k�9��8��P���Ѻ�t�@�FYY*]KP�$_��1r�\�}MWCfZC�4�:�&n�V��:�>L�8�t��_�s��Pr��Uʨ�����CF��v|~zt����{o#(�~{�.31nR�hz�3@�9�t��;H�L�VK��NCCM��'�_G��e��g�ۥ�E
=��2�"���Ӳ(!1�׳����E��$V �ʹ�u�4�1
�et��jʀ�HҊamdn\21"�Ri2}����+�20�3���bW�a9�"+F�M�gE\�X�ܫ���jŶf���Z����:sZ��j2��kC�J��o�u͛\��J�������WWV��_� ��<i}�C�6�@�T�Y:
�;w]ߤ�[I{6��!�� ���Fj�kV�r�&���v�-�y���
tHJ̌���Z�s�l��X7�YWAy>��0�%N_W���od,թKt�Cg�nn��VX/Dx��v�V��2����h������ɸΐ�ʼn2ۖU������G�{�2�V*�����	�P<�"��1�W���$��9Ob�mIH�Ј��Q-�V��uQ
�b��-雎���\N�� d&|6��B�6$�#�;�F�N����k%�[QY�Jp*s���]]s�o��,��=&d=����5٦B����۷�/l��w��R&@���D���֚�m�����
�4�fEUm���F�f5;�ܕ�8+u�\󆽛1�rK��ܚN���;�4}�N7�O���:GH@�X�(�u����zt|�}�薣׊�f��K#����:Ŕ������l�_(	ÇWw��ܦ-��2R�4�K���ZG�A��~���G"`��Z`��N������ʒD�r5�LH-'�h��im��$�Z+����v"O	��f�W�3�Eۄ�O�2Uw6�����ۛ�]����km����}MRa|
K�8��˼Z3�)5I[G{��	cN��I�8���w�A���Z�j�JAt���}M���@���.��fr��(!�es�yM�r��;)u�^��zO��{���P'�2�谸FB��Mv��x^ l[�&a9�E�S�݆�o����wQ�Q�l
��N�ƻh���I�G4�x�\�H�F�H6;�Ebn�`����A�[_�n�}����
Y3�-��p�z!U�+Q6m�F:���og��3�wW�lH�͗F�+��AB����*�$&�{d��-�!���4�ԝ~=G{#P�#��Z��qLi�,K���"+|�?{��2��,���v�����^�n��3OL�*����&�X~�Ým�����ڔ1����Ү��ݫ�r���-�1^l��X ���k���wf�5
���Ѷ��iՂ#�%T����Q�Qh��Jg�x@)-��j��^o�H�R��8�S�l-�z��67|�|By��U�,�;�a&SdS�/&	����ĭvÍu
���)T��E�^/"�߄Qw�Scd�������2Oz���*�J?���Ӕ�v�G�s�k �o���9�5�pN{u���phͿl`l�b\6@r��ĭ-{�.�]4��a���?�U�o,�6�����D:�B�KPQ�h�3X��xd�+k��V�����vRU���a
5��FZA�k�p�ٛw��˳��?�Ώ.��T5�1��6�d�y[�=�E�.�co�;��x<�g�xwU�Y���p�m��������`x�{��a�����mL�_�U�H�ql�~x�{���!�q�I��r%J:�5x�(��@�1��	��	J�N
@-1.5'��
���F�����}Rkl6x�;k�QgC��fv�cL"���<x��RMO1��� ������*�*���D�q�am�z\���;���a�<��{o���|��f3��)�q�4B0�N୐�h�KXR=�b� �E��'cL�w:�BB����V���d���X�Q�ͤ��	�uJ�ﺡ�k��=�V$";���4����
`M< c��>��`��4v����Φ��&b�	4Z_ȕ�2�X0
ElOC���&�F��"ݻ�"�@�4���a2�E�D0���ܘ�$�j������Zb���pj�no�]j�KX�{�]������=��8=�1�
�,~T��OKև��?ٍp��g������1p�W�[o���Y�z4�uBKf�{ �%���U���	����B��lS지~�=��{^T��hAR�
ve�j�ec��k���t�d{����Q���/C������-�;���8u5Y�n�|�:ج��s�^�,H!�d�7��s9�n=P��x�Vms�F�l~ņ�9)�-��̐���d�DZ]��#�a�w��������$�P}@ho���{�>���֫Wx��*}��vn������z�3��y$�4��pi �S��$�p��C�	��ڴ�j-�˦uM�m���?8���I�e6A�yz�6BIx�l���A�x+�<�4c�h�)�H"�Tb�7b%�BSfJ��s�#������t�A�Ta�~D�V�"�7i�'�+�ѱ���b�����o+��p�~\̔|��TI.m�<�ifG�w -�3D}��2�EϿ%p�Y��_kj��}.�D6�D&�h���n�H��8����+�-����@�2�M��QlB��
�jeyl�f���!����m�y�5��g�5;��苞F�p{�)	&�wTϼ�g�YN���p٘gH�lIDө�n��� V�"���u"�$٦��z�N�K��?��.�{g��l�%�\ƨ"Q���Q2ܡ��9۰�����ہ�ݞ\��\�O�=���'`�����n���}����	�ētG�@gRR�a�Pe�D=���SŽv��qfy��wPԍux�(P��x^�S>�n|����`u�s�T&��eo�i��w���Yo������jm�b
"�f6�����(����3^�D��+��x��i�Z-A�%��2����b�ĤZH;سDˆ����$��4���Ґ���֦B�Nۉ���8S8�p*땍+ٚ�M����u�7x��42P#���U��i���L��0hB�˗�b��l�@Ht�(�b�
�N������U��ed�7y-O�D�3�@|qt�(1|��۶��>J��q
����+���F�0�uW�s5���-������ȜxQ�M`-���#��kt�c�fw�U�HqM��c�ؒOt��p�=S��r�/L��z}D"�M��(ʱ��"��{rg��&B��
���Z��r��O����wPX�S�@�K����| �DL{�6[�]dG��H����n'�T=4U��nF*{�a��,�u}�G�d�,�c�{�)Y
5�M��@t����1]?hH,�;gmt�Hw3�Y�h�����)��]BL�ND�p�iG7ה����1/�1B��g�朓���~j��l��G��Z?��8_^���?�58be�w���(Zz���=�2VS�6��
�!:���u3B>�t��2��It�Hp�w�T&��~��xnV��TH���c�ꩾ���=4M84�Z��C�_a���\��[���ѥ�U~�H(?���Zϕv��=�H�lu$Q��oƳ��A�W�Fw���D5�� e�jn3-���Ty��
����_x�{(�\j���K�B�w�sn��q�U1��!x�[.�Jj���Ԣ�Ԣ��Y:8K�Y��x�XmS�8�L~Ŷ�;���]�҆;��+����7a+��#��L�-��ve+qB��u�ؒv���N���z���@��*�Df�����`{s�)4�g�	Ȉ	8`Bk.40�0��'�o_�6���Iۭ�l6k;��Ԭ�$P�ol���$a���q��:\r�c)`��Y����B�$6Qv��N�iŒ��.�7)�D(c��D&������
8(�J��Q�Rl�u�p�`�򬛫���7x�eAğU*��0�������T
.�|��H3sf�����>�r�����?'p������X;��a~�{��b���b?�d�S'9�{��Ґ�4�
U��	��A�A�W��p1J0*+�O����!T3�VWǙ�=�ǓLq)�O.m50��h�K+
54[5Q�;,s?�V�f��>�����K�"K���\S��v��7:�9�?�\^������A�D�q����M8ոi"l�p�b1��~����L�7Ñl��kЁ�S�z��wj�6�-��8����:�B����DNjHb����zE�%s&�ڴ��o����gv���H�+d���	՘Ҥ+���̾+�N�w�K!.3�ݞp���_��0��0V��d1���N����
��bʒ���t[����Z��$�d���M��2�	^�[.�0�����<@<-��M�`���0�����&S6�	�W�E�Z-���q������n������DJ�@���d�#޻
����N1����e�Xf"l�wګ�]_+�{��
'�bM%��'��_�OP
%kcm5V=K��a�N�Q(�ڠǘ���I��پY����D�,����-�?Ή^Ux�).p1��	�n�DLi�ڽ�ݗ��__��v����d0<}����΃��'Q��"�
��W�d�����[ۏ�|���*��vWE�S9D��T��3���a�D9�I�,B�`����U����pj���9�GU�1̮iCb%j�g����қrቘ�t�\��v��V�83|�΀�=�$�⋍cY��f�x���p�b�OTȰ��T�EM���V���i��l�(�x���xOO��'�G���I��8
��{���u���{��×��ɾG�Uz��]�\U\g	��b���Я.��A"5_7k�S��`����T�@����(�>��CN��]��]��Ɔ;���R�B��� V��X��s�K�h
>}B��}=�}qɒ8�������F�q3��VH6�l���U���]x��
��O��YM��#\
:���{��Wd���k'�ox_��P[m��N�}f"�F)׺�s
�&�bWe���d!6s<"]`��ߪ���i�Į[������X���"�F��|�ɍaU(p�Z�p��|��3�~�┦��1T�Ad��t��_l���Ũ}��0�}���SW�Fj��m��3~�A��dɐu��e'X��5!"��Y�ؗc�,�͠��<��\P�N&��_����/hqOZ�n�Vw���k��`�x?�ҵ���>�n5�x�ݺ��I���;��%��5�׾�`�?K„+��j�7��U˛�ͿB�?���wx����Cq����e&��/����h�	
��x�Y�w�F�9�+&�D΀���w$vKm��4��ӻWzT����jWq��{g��V �%��������Ό^|�.ҭ��'[�~�$�U��сy���vw��&~=�^%� �WA�9�9����8bp���n��i�ݾ��l	�C+f�!�G�ϰG�~N��(��|�k�Z����0��YkW�/=��X���$Y��'�2
D�D�}nN��'(�,�@,L�8��IO�l� ci�C�dWH���K��yU�(2��\����@〳�[[9g0�ZΒ��~N����8��\�DZ`�)?����T��w8�qQ_ɧJ
�6<a�L��s8����G��)�,����_[��zx�`��i�h	������AH)��z�-��,l"��\����9L��`NԧY�JVdvg
5�k��$�1��^[�(��,��7��a
��\��Ē$��?�1�I�p'{Ve,�^)eZV�O�[�Gz���ۂ-�`Y��1�<���h����QH��4ȐB����.�_�bj�П�i�s&�`���1fG��S��>���I��=P
c`k����t�B�WV2T��Spkog��8���U��b���7�ޞ�{�뛽��fA��q�̯�Y2Y�M��Y|-�F��q�a\ �&9���2�Y1̮�y��ŐsBe���������2���$�Ɨ0\c.�|T6��`����0���$烷�}eZ���	4��D�gGer����
4����Z�D�4`�B� ˂+
m��X��IYoZ�Xa�7'ozV9�Hx�\�?�ߘ��*�5e6���c�?��R��͝e�et��`�t�Ȝִ9�B�{�&(��<�H��{ݳ���3��xp6���~
��YvՂs	ʐS$S�B�f0M0�	ȋ�VH�H��0���[�k��F�<��~��ˊ��>�I.�/=fk���;�R+@=�5Ħ�n���f���S�".�l��	[��ʗ鿹����o~n���y��Z�b�ך��ͽڎ�/��L�Fi��ۄ�����5��Lg�f(8�Z�S�\�<��J��Z�M��/�M���$m��"���o�8��ؘ�l8����H��oM~�?9���Y���@bX�m�{�dh��t�p4֐#$��AW,PdѢd��e��EH�V�R�+�j$*��g�>zg��ٿ6Ho�k��U�4V�G��"K.!f�0��1�.��q�T5b,�1E�r�
[��-�eY�u�ѳж�ù�&1���:������1��#*
n��=,�,p��pĸ|���Ն��V�)vD���ETãJ�
'�W��{A��%;"И5��A���F؆E���?F#�����Ӓ�1��w�ml��������Z$\�ms|�bco;�'J�{��Ѓ���W�Kg5:h�k2�X]#b�f�����@�f@��q����O2��,�0
�P�2����ٺ5y��m8
?��1�-��U�]�?����h8,m�0V3h����0�V0�@��q�j�9=��m���y��*�m馶W�Y2�i���Qcchh(�<J�~Mno?i!�Z�&	&���9tɷ�H+q 8��8��r�SWVCxN-�o]"��Q������@���κ��N��y��_�4��m�{�6����!�#E�b��&Ѭ�1��L���\�N�o�=U8������R��
�ԯ����'�:�*eKa��4�!��!q�d��@Ǧ6H_0xes�[�9H���Z�
7�TAĵ�_�N_w�sv�m�r�CӵQ8��6|n��p������1��I*�S/3;?���l,u.�f�H8�w4�눡o���5
�a�ÚQs?c�s6��x���^�맽5a*oΌ�<�aW�m�e5d��R���U�2�{I�U�_��A(��e�a6���M8�d�Tf�����ޞ�W_�c#�S�����-y9�Z��nt�Y9�w�m�����/����z��m>�w����,�K�}�⾻ā2&ᥴx�Q-�^�ʍ�J��MD}UC ǟj�����t'IS��HM1�;8-�Ɇ��"��i�$�����,�k|z9|_��ej�&-TE q�(�^�dH��?MB@�}��|K�f�&�¼ĺ�hZ!3�n�
3R����꒦�V��uk��K����`N�+[`����T̖\�z-�#��U����ԺI�v�o3+��M��[�C�
!d��=J.��<ۀ}�-�\��n�0����O���Њ�Rޗ�>ˋ�S�|bS�**�K)��YuSi��
�~�Y'�LP<,�1}l�i�t��9�jy��f?�{������=x�R@�O�5:ki.1��ì!/7��d�.Bq�v�r"/Z�ˉ���Bu�����w�_��uN�A6�|��F�/Yb�
x�؉G,��b&�B�cU�g�+�t]6��a���g�؍���\���)5l-���J�1w���z��iFU��+g�m�A��[�ʉ cZu��X�](ZQ��T�+W�lCh��-V`l���3������ܓ{m���K�H�P��x�]V�L�f��l-���eW�Mbt��Ց��H�R#�$����	 ]��
�m�FL��-�T�޷A��F�ĿOM�
�$� J��gT��{��J� �Jw�4oj4�PC�=���
Z��nqZ�m3���E�)Y���>RR�t��-��W�H���M^/Nh�iq�2�2�R� �_8�U��=z�"�b��wS���I�2�T%��s]2�(Ժ��A��%O[��ƺ���)�y]�"l�P�cA�Te�Sn�n����\���<x�[�y�c���%�7�yǴYHap�	<��^x�[�y�u�|��2�r�\
@0�Q\ir���J<�CU�'ש�����x�[��c�1��R<������(�۩kN�V�I�/JML�P�H,*J��O�LK�(NN�K�,�P)H,���QKi�����kj*8+�d��$����hVs)��%ed��q*��Y��2�)&��x�[�y�c�1��R<�����r�Y��(�۩o�W�f��	��	�x�;��uC����2b�HIlf��d�<M@r�,���B��+�N>+/9�SQu�nQ����&��ܡ�1�����WR|��(�L�W����Ôd��n%��˕���SJ�@3&��+O�P��\�l7y����}J<�(�O>/�5Y[E	�_5!��Ax�{���k�*yo��Ԓ�̼�Ĝ�b[��Ҽ��<
��ĒM�j..$��>��(�RCӚ�k��R��Rʚ�%E��*PU�Ņ9:
�ʼn�9���
��@ks�S'T��D10:h$�f��ӕt'�*�)����Ym
wV����L��z�����U�2sRA.CU����mJ�RxS���zx���1�s�7E7==�Ĝ��DC#uu;uM55.4�����Z�Y\R��R�X�������X��W\�����b4�ǽ�x�Yms�H����9�W�!N�UWe�w�`����l�]�\�<��FH#��-����id�!w��,���t?�Lw���t��<~����B��e�R��;柴�/���`�{����e��� �s��,H�l�f1g'���_J�vnnn��z��p�V��(����V��q�.���3�|�}�Y����h&$�wv���H.��~(V��XŁ"��N(�\@��Ș\r�H�0�Y.�,�,��#)�;�?��M���oN+�W'Z��V��ի(����n�s6�[-DrG/S��D�ÇIZȫ~�w��ƫ��D�l=~`�E*a��M�($i��9�(����8���?�e��~��o���]!i|����X�~'�"�8�s6��o��<���]u�?�W�E_�Yk�0U�^���!�6��eR�$��p�[^}��NHJ>g�"	���ZD�E�}��VM�d@B��0��ۖ\F��A����r.�>�[(pu�ﭧ��1f�K��Y�|�{�"Q���L�1�p��T�5&�ƈ_[��{i�]sooË
D��n�}���`z~q>�0���Q.���h��E��ҫ-��"߬���<,$���ZE�[4k	�m����t;��R�`>��ۍr��g��\�'lKN�Q�n;^�
A��M���,Yo�/�?n!Y�Jc�NS`(�{vt��\%�,�I2]�E�׿Js�O����y�.t�)�5 �67���������$�3�A˳,��X$�Ep�K-Z��tu�
�2UK��aeHY� 2�@��q�[�t���N�
�o@��&�X��hv��^,��Jœ/�"�$TA�J���֭�84`�U�$m�+;��O�L�l�y�&��n�Z}�u�qz�M:=R��4m��cJ�=�H{l�97�*=�R��(Cfo?'7���fA��Iq���
�c�5 
�<���-�����b�[��ȍ��P�JgYy�����~�o�5 	e��^z�NO
��w�-wza�q������迱h��v��R?�۩�[���C��yR'LՉ��sI���ȩ�m�@��ғ�L�0��N$:;�!�gT��:�ߣ�A��Bɼ��S0h��x��9�t
utX�_��ǓQr1�'>� ]5`��uȗ���1�[ݿ�ݞfk^rp�s��6q�_�N�4u�S�{5<9MOΆ�q��`�jx6����8�5��+dp+��c2.�js6�<�2��rRk>k��˙p#����y��|������LU	R�ʟd1J�b�Yę��4��1�$9d�Hj�}�*_����2�)��vI0]N��f ��ziuۚ�/f���R���˚��:xx�l���>t2ٷ��Y���t8l�$�T%ȭZ��>�R�W�������J$m�b�H���L���٪N�4
�)Ҳ�<���{��B��#���k
<��$N��-H�+�K���ݩ�a��1��~�m��n��D$Dn��$"dEM5e��✥��Ж�ڻ��F�7K�ʠ+1�(3<g���.��m��@�_˨q�p~�$��"�b8*�S@��Q�Pΰ�ưFH��#�5�W��Q��lMV��ThB��A���L���G�X�t
��LC�΋^eH
����;oG��j"�W`�<C�W�P��O��Κ���	(s�[�.���d==�x{y6�^�qjJ�=,��0���O9d������~�d�Ke|*j����������h������Ѥ���0�d���18X��_���nm���Uf���C���e�W⫖��m-0�V�����cJ"��螬��x0z?}��L&��7�G���bD	��ֶ�2�ꛅ8UP�T�t����ڱ�G�n��A�iF1C����S���1:{*�8�P9^�;Uv5�`Ȃ�cZ��9s��f�4f��hY��bi\\G�s�\�^�Go��Q}�)��-��5�Z��0��>��Ƿ�H��h2<=U0���
&h�^s�F�ZO��WT��zW�zg��Dk �R����1���{���
��m²�m-(����n�?h�6�7�RY�H�n{h.:�(;���^��{=<of�uSs:l~�֎�uc+obO�
V0�ܹuW�{0���/x;��FY�(�8v�=�Q��qZ�7����yUQ_C�ͤX̀D$�31'vZ��Qo�7,�r@9,�Q�
����1��F��
�V�`�h�<Eۣ:,!��n��i^f"���37T�I�0�k>GK��p�<y�<��J21�X�r�U�X�6w�����N��Q�#_,x�A���߅��Sy����"��n�����j8����c��&��1
�?:�T��I�}��qr��Z��'�)��+�(�c�GG8�i9����RYU���^���Z��L��7�P"�]g�-�
������}�Y�ی��9a
b[��_!G`��hp�RJ8�э��k@�����0�mPR���1�•uJ��Z�HQ��f�Mѩ�Q�S����)9XUx��`U�
=-I�[��9�Z�(C��ɠ�~%�F�1IO��3!>�_)Uf�m���Z�?Iyb�C�A�Ë�jtiy%��q���-���~���2�_巖�(�u
�[�ũWe�o}���C>��^#yt!�����Ka*�-2M!	����U%~�-��+��7�Z:m%?������.X�����s��ןb�Q�#��掛X�5U$��,��۪�ڪI]�ܶ��B�{��ܔo��Բο��s��z���Y˻ό��G:h����ġn�l�6WPխ�Nα,�i�l��kF��I�k��HPiʡb��C^ΡOQ}g��b�O�{�E�j-g!�l�"}>S��8�ƑJՌ���@�A�ֲ�F6\��iJ�Z^��������E`zP�
P�R�gCl6�R{T��a&5._�����X�v`�H��ː,V
t74x��!vj���m����=[l�*x���~�m�s�ͦ�2&J
l�Ax����u��ݬ�d${K�T�Xx��T�n�@U���Q���F��&T��E�F�D�"$PS�`�5�'�+g�����EH��Y"��-[~�
�+�0��I��7~�{�=��;������;���Wa�"xC�/2+��3�>���d�O+=�.��v�m��Bq�0�c���`@J�P�L��@݋*ϲ�Q�<\sh���S2�C����Uk@�	j���1�Z������(���;�;{��Cp��H{�hu:����S8��a�4# �9V�D�ԐB�/~xPa�[k���X>�ZcEL�� }����χ8D��|������xj1G��&�zi}�o(�5D�2-��T ��#ٴÏ��>���I)�MlE<�c~���5��K�y%ǿ,_�ݥ�u�e�Ct�1�!o��l��������NM-F�?���#Rkyb������wN�]�
��WD� IK0K���e�R��7��ʡ��L�	4�nu}��Y}�$�ON�|HXdX��e:_U��:����0a�p�j���R*�A�q��\�W#K
��@�nd�}@�g����Xƀ:�
�Q?a�Đ��6����nZ�Or��9����b�?dsm���n.�|d���-.��J�y��>�lQ)N�$�0!�/�g�ĹA�4z6�X\9UN��,�V�E�zx��SMOT1��+2.�F7J�&��#]<`Q�@�!n&��{�7�N;�}�,�l�Į�O�'����x���I��]��9���~[�u�ˣ���ܟ�-f`�d�.-�,o�0�8xh?�;��+#K�u��~�=%
$RR��fR�EB��ݨb��ʒF����ѻ���B	�ħȮT�5("h0J���O�����ja	5�VJd���4��;Q���+O��+sErP]�{F1��'-B5YHd�=��ԡ����j?E�(3���Cƹ�]�M�&λ�A
f��h�^������	�{v8=�[����Ǜ�o�W7���ۃ�e}�Ϝ@Òc߿^�����^e�t��� g
v�H�l�㸙3�֩������5UtuO�6�FJ��E�[ݗ��vZ�p��M�陚��;)SH5�Ի�*�b�e��������S�B���`�\ �n
8$��gR��
+kH,9)v;�"%~�ĕ07������s�>�4�7�{�[^RA3Pv���y�/�Q�2�3�Ê_筼�xVb��NT"��2us�@�q494��y�����[c��/=���&L!
�;��9.>�}�����{����d��8�dx�m��n�@�U���B��jiC	�#Ձ�P���"��[E����"g��I�R���3ހ�=x
v�'j��Ż���:���gg�V�x!��K����|��,в,/"R�*ջ�g�<S�|	C��T�i]�k���}3����p˔�"��.��Qd*�[q7�k��e{�坫���G'��>����T�E�\3���O�"��S+;]Z�'\i���X���Z_�
��PS!�nǴρ�[ټ[���e��Q]{[تC�
{�l�)����_$�ц&؁�zn��nY�qh�x<aʩe��tP]�it�%�����p1+LW�6�dQ�3<���G�0�5��8Qng"�9����Q �8F"�A7D`� �+�K3��}�?�����^���^~q��3 �Ĝ;�!�8����cd���W7P|���?v�J�!�7�5-J5�h��ɔK��O��N{gƊr��]�D�������9؍B>Q�8�<B7�҈��6\�r���{h6G�
y�,�T�J+j�wi��w��#�Ax�]��J�@���XS����F%
^�qUkA�����J��N�@f&N&(��u����p+��]��3�I�Tg5�s��?�h>N=�dr�����,�[��sY���}����@�,j	�E���ȅaj0��r���9P�Hϯռp�s��kHF�ћ?��u"����)�Y�/�<��&I. �Z��j��n�k��`�8��e��q����/���y�=�:TH�j���h�N\S�#~XM�Y
��XH�����Q*�S����nS�¦��$��'���KL7��){��Hf���D,��]�N�+����RA����4R�h<lǾ������Ik����6���}"�*Ί�g�+#_亁^���¸�O���VӲs�z��*~e|�iW�'�F�el�x�[.~Sl���Zl��"��l�0x�[.�Ct����,O�!����qx���'�!�i2#��d_&v�В̜�	L�,™i
 ��Uf�W~~nN���7��*��%�%�v�E�%�J6�EE�Ev!��
����y)
@f^~�BfnANjnj^Ij�BZ~��}���<%Mk..$P�ZRZ�g
�EH�$(�n>Ͷ�D�7��5�x��Rϋ1��\�EXD�ۡ�Lq�ڂ�n�YE�/B7;M���dL2]�vY�{P�7x���X�&�ջIg:�x1�I����w���槇�G�ۿ+��D7�cE���f{W�?���P�^ςι^�w���ZMM�l�%V�P�}/���a��
Q���oJU�xc. �CX)Z.A_Jn��`�B���U�+�}�|�q���K, @��B��,j��L������e�^�z��d�C���1%R�3���R�_�:��Z�����90XK^g/�^Z:aq�R��3���� 	,��$H���r����XB)t�{mX,�p0����;FTb�'k)�d~���emO���uH��a!�����!	�+ӹ����\���q\,�զ���!��24C��S��G�4�y�~��]������;��h	���)��{"��W����f�7D�X��~W^�!�f���{o��keo�GгI�&"����F��a
�f��S3s��t6����\��r�x��U?�
�x��(� ���U83MA#�$3��*��+??7'�d�v�z��Ғ��]��̒T
%�Ԣ��"����b����ļ 3/�D!3� '575�$5E!-�Hb����>DOL���5�(J-)-ʳ���"����K�K6��r��f26�/�)x�}RMK�0��n0P�"���0-LE��9"�(~^�M����.��S��!�D=���ɟ!�i��{H�~�y��I�>S(���	��B�F���569�r J69��1��.��ы�W�6�S��Ay���%l�j]�T�̲��[Gk���B~?�IBׇ�Ħn"`P� 88�LA�E�}�]<�ѳv��@����=2�Z�i�L	AuB>��_E�
 �T(�5�aA�	 �����9���m��сeH������j�ӈ(2�V��.���F�S}D6���R�����_
e� A��9�5(a_�!,2��΅�Ͷh�1i�:-zӄ��.k��7�?�`�[B'm�"��N:9��c���<�0LS�����;_?<�5�zm(=��^��~������6��aY
�[��H���p�f�������dx�k��ޠ��PZ��:و����:Ȥ(SH��QH�(�,JMQHNL�HUH��I-V�|�y'X�3Pt���de6U�v6��ؤ�����JQjqiN����JIFf��]|J�GHH��:X���5\y-���S���d[��X�P\]f��\���BZb[q�&�	�sYeu�mR����\A�H{f^:�G)
�%���6�@gL^ƪ�n����o�`�
�e�
I��y
)�9�%�)6�`�0_�r�r=�k㹶x��Z����+D�T�Աzpmr�x�	�����l�싕6��'�{g�}���~ �wgF���wf���I�6�[[d�<��`��Rv�'߈�G��B��c�!y�/M��1=!�'���䜻3�������2����R=xL��|�[��:�#�w��F3�G��>�b��Gvb�Ӊ%.�\F����/��:��}G�o[�'|Pe�D.�L��e:D�Qh1��\��
�76<�e"0�ɛL������q�76"���ʝ��
��<����H꿯=��9Hݿ;�I a��N"��c�0�L�Qb����M^0�Bn:�����i&J��”��lr024-��m,��ǜ/��v#�gR&���K9(^[�7�\�K����ğ��%���5#�s�ǘ
d	W�Q��	;M��{A����0.�b�m�%�O�̐�`����Y�N�%���i<܈�MGͷ4�C.$�m��9�\�N�Dݠf���Qc�����у;8\��6Gׂ �	��&sБ̹ÐJQ��ԍ���DH~�"�<�,�!V��FO���T�f�������ՕK.�_xm?��:�`5(�/�h�J�l�\�i�����[	J�𙶭C�(<����K�!r�+��q�ws!�������xz|r<�ғDvj-���Pl��+�J��	��tp�V0�B��}ϔr��ԩ���¬��ɝ�ޝZ�ӻ;��I�j%��5����E�l�|:8:�Fń��pL!�Fo	t��ۀwڝ63�2��o���n�IfS�r��'%L']_�h��DZž���(� �:]�y���*Jki�9dD�=1����o����{v���?�������Y,��K���k(dtu}������o??|���A��r�Ѷ�-?��ȓ�e$J䧀�W*Q}{��|~��(��gWN��N?l{�wQT�8R�dz����Mۏ��� �:�b�rI��q�)�p����܄�DK!H����
V4y6�W"�d+��"�vc�Q�Dȓ�Q�]1�\p�,z�K�;�cP4���*~S��j\�f��Y�5����/a�7)�Ȣ���C��j�M9+S�K.C�J�k2���VA�Crn�J���3��ń���|���I6P���G�a=��Wz�o$�2mK�$�U]�īP��X9��MF:^E��/˔֒�H��|��>x&��j�Z���1U<5kɬ�6��ƪvo��S(h!s�F%��7-Gr�p*&ᅣA=X�-T��\��A�"��I��GgF}�Ÿ��.��J,�n܉���6��)��4�5Dy�JE�mc�c��Zz�f��~ߠ�Rbi\�E�=��d�v�yu�2($t�{pi����/Y��-����|�D�O�.�������^<�
��Lv�'���݋�Op8D)غ��tT%�b�~�}�ZO���ԋ\��,C��'��=�I7!�A"�Ƴ6�N�lN&��0���q|n������KL�u6��+�����ܯ�z`��psP�61Ж��؟x����RU�PS�h��Dl��ƌ��$1\nUrcԯ�m��\�{I����
~�M4]�p�`����ϐ��yU�ȍE�n��&߫جT(E�7�2��_����D�B\��Mkȓg%���0>뗵����~��E{&W����J5й��Be�g��+��L��=U|R�v���ݘn�0ܳ+�#�jUɌ�J��T*^x�͏�랢E��j��SǷLG��!�k�ZU�^�e��a,jw�CZ6�`�ĥME��?�]�&����z�DA3��ڲY���9|�$Gë�v*Fͺ��ڔ���Ey���icO���Y�ƞR]T
mA�R��
?�@�>Fu�I(F$,+���n/)Q��P����`��lH��DU�Z_Q�Kbt�B�\������9Ѓb�����2MA�0}e�8��0<�U �j�Z\-�*����/�*(�<�^X�@�+v4�֏a-]��Hv=��\�J�5^��ݽ�Vo��DžJ���Erv�C�\��ղ�n�RoNN��/�M���u��T�q|8��w�W���Y
OC��^������d����鸆�>;�l�'/A��W�'r~t�^H�j��j��^����VVܗ)BW��+a�ľ���p?b��F?�]��p�MmzM�����J5�]�ʡ=W	����n@�H�������t|rX�hs��b�ݽ�4���YK�8���X�P���
��D�3n`�9g!n�&gP):������ר&D�,ˏ���֍H-fF��^
��SB'�i!TĒK�\%�V"�R�ҹ�v.���NEtʗӭ�tJ�����o�^׷H��ma��ܭ��|%n_h|�5�O����I&���ӞS�\��i�m nj۞ܩL9s�`g}Zū������W
ɴ��k:��VF�5	��f�w�7���,v�`"6(���['�f���o2��+3�j�l\h����n [��*PJ��<y?�A����L���j�x�y�:{w���3ӧJuG�i)�g�;T����]���5�8e�,6H K�pB/Ɉp��֣������s��$�c�;�%�3~�H�J5^��C��Y���ڡ�cG����{��A��}�a[\s �������f�G�M�y���WJ�����e�^��SW�v��N$�X_uR�Gh�vs�S���Ѣ��H���&�"}c!��Z̧MX�v[y{�9�z�ǟ}�“"|���v�>RLީ�{�_��%�$	�Su��DW_�)9.�����_{���a�f��-^Ҽk����6mj�9��������նD2NMQ9�vc�]���v?.3
��@=�P������[q�)��x��5��kuU�/<e��VyVի8\s�V�sh;��WD14k�k���o�תq�/�)�k�婢��5��EQ[��-p4��;�����f=Z���Fx�{��sC���^��-�
9M%��x�5��I�>����!��
��
>��f'���s����>"��"b�b#�`1Ͻ�x�XmW۸�\~Ŕͩ��ޞ�����4\B{?6k%Q�۱(-��wF�m�Nh�=w�sG͛f��t��yk��Iz���\>����o���S����x����,��8��e�`��˽�s)Ӿ�������L�����=xp�|�a������H�w�e�'1l�6͂���q��|q����$Q��$	���
�X$��4�@�~��<�C�"d,M�Iv�����؏�H}�yS��k6�Eh೵��`0���I|K�i�X��J���_�0e���G�=���q��#��:�,���?�f�J�����K�7t����Z�2W��{�Ctg�B����'����/k�m���Ó���`p|�w6
�'����v���l�)��E�<[�|�<$�湏�	�n�&����÷��J5��rn:=��d®�������T�I6`�0��<dj0e��o�~Bf<��!O��Y"Y �'}�i֢�M�pi��0|XF�L-4W�p��[{G�5�K���8�������"c.>:�O�}��)����[S(�«ߟ1�ߌKJ�_��6�����{4y�䜋�n��&��7�D|�[A�j�v
�ŧ�+�|�(�:�Rm��7LW��:�yr���CR1=qU�T�ĩ3�'��nE��dl�11w:��x��Q-�[��a������a��9՜��"¢W����6��u5��ȟ�x��+}'�M&����@���7?�����}zxд���cL�kV�J� ��Ӄ�P$�K%�`�}�i��I4�ς9�刞̟@2E�j@��L%9|,����O���]2q'��XR�j������-�O#몁������`�X��̭�Chq*���/h%���!�(�y{Zt����E�0����{�nԢ�"0ZJ�S�]��\5�"+�B��)+�ڙ����Q���.�
9V�
_��1��^R��
�#�|v5�/A}
;�������ɞV0_�We�Y�ߎ�_�XցYƫs�M��RJ��H�����#��u��)�4���T�P�bv����P�TR*�~��
W�鶴��,"�G�&7�5�� ����R�"e
�5�{�Y�)�eA��"�a���;.�d-b)>u/[�pq�e0�X�������Yp�4w����]��M��W��2i9=�UW�a-�?*��kUe,my���܉:�V���[��j��9j�S}�M�4��0,��q΂+�/:�Q��ǵ�I�D�@(�L#��\f�t�5���Zs�� �����y8|5��;��1�n����=�B�s��h�no��do8��.y�`��{�P`�����qͲk{���
?���M:yQ�m�?�!0wl1	;M��%n�>�A<�~ϖ�.��@z�	��N��V���e�>!j�o\ը�����|��Id�`�Z1��s�DKZ�H��|oa�R*�z�k���S�!�Ry[цG�T���b;�o��et�)� �(o���Po��/KQ�"�ݽ��cw�9����A��B��C�c
�d(�I�I﹧�W�K�Wd���A�lo��.b�<���ɤ���.��f�l�=T�
�ҟ�;U��N1{
Η�Ί4DψUI�Z�2b֝B]C�n�謊��Q�{��t���۝��(Ǭ�m���n\��?�����/��c�?�\e��m�?C0ꍺ�w���8�8�ZtXJ}�a��E5�1=Ҍ��A��뢜6�o5�D�y���i�۔�8��ɲ';��o]\���*�U����2��҃Z\*A{��H�ջ�|�^�}��o���~��������;y�ENi���Es��7�����G�Q+�r"�sԮp9
m�[�>�B����k�k ��J�0V�e�߮
���4&/ᅦ�A�E�Y`1.ÆD��K��M�/���
#�C�����n����U�a�Yj&�)����}�>�XIU�Nf�VI͚���Ѕ��cDn�ʿqƨ6�N���	ym�����:��ȗL`���U,F��7�_�4[x�Gb��{����v�4:�:f�`�ᙈ�8��5��&�n"�e���^�5�@MTȥG>ދd+�G�G��@��'��F�	E�Z��īWBA\�ׁ��±k�n��A�5[V��v�(�C΍e@e��@[
S�*�Y������%Dќ
�M������ܿ�dҿ˂�/ܦ��F�j-����N�գ\x�d" G�2����Ƶ��v/��"O���W[���f���/�{������ R�
^��|�Ѝ�L�䆮�$�+��J�v�W0i�ʭ++N��T�uz���ܗ;)�Лj|]?Zp�/x����<��\�u���U���\-]�jW
�8�g��N�-U���?^�T���x��n���̼y6s��	���y�	^����&x�U�OK�0��Щ���E����Ca�D<͋"�ڸ��ii��!��`x���g����u攼<��e��:3v��t̄>n��;�S�[ݞ�AJ|Ϥp�黢—�6
C>����e�R��7���M�Bsųq�O�'fn�LH�S��$z���_��4�jǜy�X$l�������ձb�&0�y�����U3tM�h"3YC΀Oiκk���(1A3�m*���.�F���LA5�ر�4$Ѽ�Bl�N�i�6��m(�ټ�ۤ�;�r��dXI���B��CT'��;f;�]���N;]c���
��bx�k�<j�a-K��o���L��M��X6_d�b��{��w��
�kx�UN�
�@$v��_X�`R�M*
i쬵H0��݆�=,D�%���wD��BE�j�0��u��&DF�B�]1&�Hc�(}<�`����p��;L㮬���R�
e^)N؆�.y����
+�8ʐ�8�>{� cJ[��ZP��h�
V�$���4�:=�%��o�Q<���ۅ�[�<��H���x��Vmo�F��b*E��D��D�4���K�S�RY���m�]ww}4w�w�6`���{gg�y�g�O?�˴��7��"��)�X�Fo�nσ�v�\���G�%0$Bk*4Ô��B��}�wiL�	��z���x9>g��F��8'0��(��Bނ/Ti&\���@�6%ₙe6�#�
��rʼn����E$��J"�%��)XD8h��������H���A�)Ȋ���p3�0�Bv�lF�h
�RmIS��ߚ��:40L�7о����(��
{O��Wj����F�Ơ
1X���&���T��c�9��ɔ-{/T�a���aB��.�f�4ߢܥD��TL,�lN4�{��D���0n�Ͳ.jL�?�8�„,�n%�B
(5t*e��MHƍ�"���롩<�*Py+nLY�$Q�kAM���SjU�My���]�r���y�?�����p�2�:���v��X��A����ҮBu��5ET^0�-S���Q����v9���m�7���i�W�%���s?Ь�?�F"��Y�.�H��0�O%`Y���)����Jf�vJ���G�"]Ɲ�w\�4XJm��DO��6�$Cn`Ƹ�n5��u� �DR�� $��z����LG��t�- ���8W�|+K�}a�(���W�$�r5��0�Y����0;d��VD�u*}t��[k�:��s	k�x�x�;��>���GjP�o�ͦ'I���^)�>>�rV|��D��8gg>�C��F��l6�d������8���ǗI1�݅q�O�����K��4;�U
�av�;S	��A����v���b�0Ac�	���=̦��]��N���a�S��Өxނ���ߛ������.����������;�#����N��:�;c��Rد��k�LD<��
`�㿘Z��<�H��5�My�7�/���-��x��UQo�6~�~�50j)���XP����Aڵh1g�i�d3�H���xm�{��(KΜu@��E�����?��or/<;��~�d�S|�1'����^����!�~��wr��cBk���g����ͯ#�7���0�n�#S.���̟�b�����)�OŊl��/T�K�F�u��?9�3����Q$��N�,eF�T����Z�D*0��	)x�RвP��\jn��Q���
�t�&��e���YFG��z0�� M��V��?O+��.K����(L�0ya��[aP%,‰�
�[������.�L�*A7�n�}<V���͝��"2��r%�02�Ũ
̚�O��w�z��'KC�=��'��z�����~X�ըFwZ�~����J@�RM���G�|��\���
[��}�{�F��B�sM�6.��o�g�`��8�6�}�w�S����34�3�����c\$2�QQ���x�*x_3E|bf�Ô�S��4����J]�ጲݠZY��f��Z��7W���8{���js�$�*n0�i-4.ְ��.�$K��4��s��L)��[��4�c�ds��v9<�X�9�,��L��W>��9e�R����黓z�\��6�]�r�E=@S�r�Ué{jnݓݻ�����*��ةH�h�L�Q�R�#�݄1v��0�96��U'�*9�G{!�[��	�@�a�ఖ�9Y*��+�Ԛ�ORO��B�k�/��W�U���性�r6��T�P'uU���T%��$��K�l�aC}B�X@�0�M)t��F��2���c/�S�ۈ~G��;%���q���%!�A��*x$]_���6���Cf'����3��xf���HG}�'��22��/�+�j˧�t��I����eX��Wb�7�U�uq�B׷�G�1�|��H�x��Y�o�F��bS�%�����]��ō��=�
�$�!�5�S\vw)[(ҿ�f�A�M�*�D΋3�y-O����AB�L�4`�7��1U����5O$���A&�ݮ�<���u��(w��2I3u�C4˔�:b*%9K�8
��xBؓb�B��v����>����|��<	�0!�ؐ8�W*�T"JV��D�G.E>]��^ήɔx/���ڊ�����}����lDޠ�C�HJUD�8[E	YD������S�
���-�`nd�Ql]�
[2���9�&f.��_AZ����'\���L�6�[��(i{�c��D�`�@jQ��@�E�����H-xPf��!�d�%���|��)�@�����g�_{#2��+^jA�Z$W����(����bdD�w����Vwi�H�� (��:�Ud�J�6N�LK�v2�n%�,1��!J>���,,*�9�`*	�V�����{�*��G�y%lD� 
��%�
���)`����!�\��bTH������`���)I�89�=�!����d:�Z���m��԰�j�6օxץjbwv�ܦ�m>�`��ӹE�3��F�+�r�@`^F�L�˙_;��y����MwbN�M֖�,ˆ��kΠ_��	r�⼰�ۂcS_�B].�̼��v�qŔ�zL~Q-�|�H̒�}���
��T|�
T��f��>�fW��׳������q�����S��R�5|�Fv��N�O���5ӈxoH��o�Ъ���ؾ�}A�U~����Z�C�AV�6ZwT��f�V���bm���� ��o�-,ؒf����^S�TH�!����#�Jr���(��1�������=�n��:�n��:o���ײ�:�s��y�7��E�E�8_3�b~~}d.��`a����^� dw�cF�?����1���'~��%@�JwN��gi=�t��i�O;�^�`����y$1�]bw���{ػ#��D�Cne���5憭 ,�3|;j�6�(y���(Y0�,�S�TK�hSf4|κ�`)�p��,y���6R��I�PC�z?�`T����4��=�b��4���p�K��5�:I/����N7
���.�hg}0d��3t7l�7��d�WR�3,�I�N\U�k�q�~e9x�+&ۚ��g�[Xr�4KB%y`[�m�D­�xcC���=ݺ�8�0S�t�CÓGK&U�/ݖ<��L��J�x�eZ�*Ӝ=�����
��T��
�ϭ��J��F��msw�����+,
KK�w�Y@�C����l��Ʉg��A��|��������]R���~Հ%�D
BRQ��8NO�
}Xb�[8@�wcdÒ~�z��|U��ktu��e(VkĈ�u��Y�~)����Ϣ����
ڃs�A[�$c�F|�R�����m
 ��'R�'^a�8��ġ��e]O�]�`�-8�,ᄇ��7·V�[��YJ`��O�Ѿ�ڭ΍�c��Q]Kh�
�T6�$N�S�j��[�^���?GD��5V����~x�(��Ɖ/SX���N����G=���Yٳ�ȏrL��/	p�!ZI�X��1�O&FՙǬ֞�N&�-t+��
�-��$�ԫ�h�\�pcMiw9��m
H�1�~>��N���o.a���zl�,�&^S Jf��aol��w�S��������_���%�3��D�L�k|��
D� �L4e2dqL��<P�j���IΞXࣺT�Q<��AT��`�9�h8�mO��IW5�i�80�WOr��4L�J�� ��[+鶁�9���w�j]uU�W@���ݽ]w�z�w%S�|o�.�|�i[W1�����7y>��tb'o��W�_���_�t�&��ly��1X?���;a��Ű�h���e~ɫ�:��l��2[@�
{�|w�\��M��{�\>��H�n�$�:l��QÖ�h���\��Ə���;�)��a}:";��@�е�ә�T$��M;�@���mxFoh�<_
y/Z�gi�j���,'w�x��u���Ϸ������
#�{��L�Ѹ��Yegu�腰ck�֑���"?lk=�6�����r5�B���\�w��{h?��\E;:����ov=ϝΒG��t
aO�t������U�"4 -��`bD�U��|�Co�v�?/��/��x��b��~�8#����f)�[r6����x��W�N�F�M�b����R��q��8уwRU��ؓx{����&�;޽�^;؎��#�����7�̮�dq�nm�`~E� �,��������	<���Dpxp��+x�,�$�9��F��|>�u!�9�Aa?a!������_�$\��3;�
w(���R���(-Θ���t��ih!U�B�� W�B��€�� %r"H̄bZ��?�x�����{2ssl��=M)��+�q�����C:���2�����}���<˵�?��<%�TN�F9%�_�s�i�9��\
{�-��@)x�Y"�5�H��Di�� ���2)4�#ؤ��A^��췥ٛuKI��P�Z�i�CP��l�Kt��A19��hT�Q�1צ��Z���;T�ߓ��C��QT���'�EJV`�:%�.��Ĩœx
DVo��%AU�v"s96hg{I���hty�LJ�˓���_�/��N�aГ����@ĦS4A&���O"&	`*N�4KpӢ��ߏD0n�o��;4E�P9
:µ��ְ�#T�ê�������ه��j�c��,�{]g� e�����]�_|���ק���V�_���y�t�ј�F*6v����4�~M(��WV��$��6;l2�
�V��XUq��J���.?SLM���N�g�`�[U�`��hr[�7�dY^-+��M��"�~�1�����T9n9[��id��ߘ^��L� a
g��$E��:]6����A-C5?l_pk(=>��s�a���U?����G���)Kp��Li�a�K1�s���90��>D�D�I*�����W	T���¼�� �ݱoJTy�	wc��m���]���p�ݐ�I{�?�—/�0��A����N;5Z��-��k�܊��F�ʖ��;�Kr9!���B�\^�_���m���2�t�$��:�6x�S�U����Ǭ���>I�Ą��Ȇ�ﯮ���4*�S�fP�üȼ ��(��������͔�2{�!��}r��ؔ=Q*w��n����"c0v،��MHom���>6'7g�u�����!ݼ��������W"Vkߎ�=��$f��Z�IΒ��"�����wAYn�����O�ر�j����&c&��|妻�&�|؆��\�G�m�E9E���*��ɆͲc�q]G-�}mW��r+m��2�Y��C�F���QbL4:���G�5�͢��V����O��V��$��i���u�7�+���Ƨ�����sk��)�����J��������s������
�h�� �����}Jr'�-�J�1u
ss+S���RH{��s�,�Sݣ,8�Ry�d��]8kA�"ԨN�*�
��Ts�
�,�|x�eR�n1V"���
7�D����[u��DAڪ����Z�	�������4=T=qET�p�xx��'�7��"|�=����o�����7��7�\�<h�&y��pOp%R�{�Qo;N�L���Bx&D�R-D��*6|*�VZ�<G��O�u�64��+��S�4�^N�(x�4͓z�wo������P��/�%Dgx��\S�>��d�f��9J�(��&�X��	B�> ���t4�weR<̐k��P��y�ˇ2EG��w���xo-�f�;�f����%��h�n�E	��<Oو���Ac��i*�a��Wǧ8�/(�=W�>W��?��k �HdQ�8c<<�vl��YH���͙�o�6��B[!A�\Z��CN�EӴ��lB�ο��R;1�2>%(���X��i7�/s�a,
G��̯��c6����I�������r�����XR�P���T虯�G�@`
JZV����3�f%Z�Rޥs������xx�����{���Dï\.�%�I�ũ�\�����(�V���+8&�%&���pUO�㗘��)�7*d��0Y�YI��$#U�8�$5F�X�B}�>��dV���쬓�؅����P)J-.�)Q�UP)��,ֵ�O�HM.-I
��(.(��+I�Pr	�PpqqtrvU�tSp��	VHP-NPҁi-I,JO-�OI�Դ�ې������[PR����m�3{�ļ���'�VP-�Sp-*�/�2�1Mց9Xs���z�\��w}������B��jq�1n�:j��B5\Va�:
vhM��!+�b
LU-���^����@x����οA�i�
��W~~nNbLhIf�fa�O�™i
 ��Uf1D�dr#�r�J~iIAi��]yQfI���MjQQ~�]HFf�Br~nnb^����_���[�����W�����_�1F��F�'&OIӚ�K	����Y��j�N��%�%��Y�3,f8���^x����k�B��W=x����R�KB�S�&�3��&C�J�"�t9��C </�o��%�%�v�E�%�9y19����P����S�R�KR�fjl�c]��Q*Ǹ�x�Xmo9�~Ŵ���(@Z�tMh�$��K�6M+��-�	{]��=ʵ��7��i����x��1{/�I��lo7`^f���v���7�x���+���8���Iʕb\A�Gp�O������O�.���l6kk���L'��gx�mm��E�›j�kpj�w�/&U.8<k���֖�x��I5lgb�S�i�j!
~oe�+����=a��\�<KP���J�r-��w
�N�*S�9Y��>�l�=�����r͞7�b�n>>��Rp�������6�}y[Mq�9��1*�3�Fg}�y�I1�
��6Ym׮B+-Ӳd�ϊT)8����1�Y3>R�I��C�/
���B�L�4�19�DQMQ͵�Q���:ŤRk����l�X���J��+�h�Jt~�P86��ԓ\�z��3~a:�nFv�<����<�쐩L���qd� ���I34$��VgZN����KG#��(��wD��&wE;�*�
�&�,�n�C�������㋣�
��%��KF�D�$I��Mb#C�FQ�oQ<�_�I�C� "������#�
~�Uv�{���
_ae�ݠq�c�Q�\i�6&�A�E,��	��j�,2�}fY�Yl�-*�9!��T841^�q_uxn��'J%��n���~Y"^�T��#�J��r��/r�m��N�V�"���sՂ?@���a��
�-�}�>y���ol8�8�TJ6�?#�*ahlb�����`]�.)�BkH���
�b��t��K�V���۰��|���I��Qiq,�2�r�.
Q�f��X8��?\�R�MK=�����k�fѮ���=l��zgM�a��u�����m�4���N�T��H�%./a�ZS op��#��$���
�v��,�����eG����}����qK��U�2Q֞V�*)qc�.�*옦9c��֎�ӑbUJ�8��(�a8]B7y �'*�27YmԌ�>ۓo�M��P��������m��4^�<a��z$[Q��)t����v4	*���.�Lժ�N��Ĵ���"���X����/7?F��HL�$�8n��&N�*�%��q\ѹ^��{����)��H�Y]�VQ���^�����ʈ���Ł~P�W{LJ!{��ǧG�{��&�@�d��vk��\'HඝM
Z�C�C$j[E���y1������9��{�Ѝ*��x�wZ�B�h��K���<��F�G��Nsn����?�9�	����1�-g�E!��,�̃�O7�fr��Õ��޷��rv��z��K��SB������
�b\t�gx�	�b�
"�%�r�e9��t	�4bU��γ���4J��h�F�3�z��*�}�~d��R���yD�ot�	kn�~�ubj�{�x��^�h�6��M_��}�zެ5Mo)�e�+���
�/�m��Y#�-��L������E�[F�@�}$J���,Zo�Xh�������5y���è�P+%Y�n���g��v�zM��w�7�b��׊�7��8��N#B_�9ϊj��_ޏ�k�D����[�I��v��肩�@<�o�h!��Z���å�5b�9f�03]=��)H��n��w�J Jz�
�~x�ۡڣ�A�i�Fy�В̜��Lߙ�3�4@<+��b���ܜD
����b]��Ģ�Ԓ���"M��9�R����B��
����y)
@f^~�BfnANjnj^Ij�BZ~��$}���<%Mk..$P�ZRZ�g
��,¶�~b4���x�ۡ�]u�:#�gI�5��xF��a���S����x��XYs�6~�~�6c�RF"7�f�8�c����z�;2DA"j`	P����$%^�U;�&�.���[�՛�γg
xo]�Fl쩍��
��-���:��/�Ax��¥�\�C8g�����nφ��T�u��tj+���T��~��(C76>���8��>&��0��d�Î��
𛍍T�)/خ���|���e���
.�2(��K���%>HG.���B2%�[��4�T��|X���O��� @�W�����hĒ��m0�V��\�W�0V�G\�h�j{��|B�O�s��D�'��[��)z�7�*"��7��"ɳ��|T�DJ؏(Q�LQ>��W���#����F1w5�p��8�h�e�$�b!�n7����n*����u^K��1XMk���u�=V���J7bƙM+1�8��Fڣ;:i̐�1�3��HŘ!ZmE��4/���i�	E��v�%�}��4�n�r���a����Ã�b�����	�=L:�M����$������v��7d�`�v�����a
��D;��}Lk�I���փ
FC;�7���`�*�m�!٘c��X�l�]�c�|Zc��P�:$I?Mu$������GA����r������Ga��5g�
���c���S䬬�t�����1�J�����������A�DT�i�hOޟt~;��.���`_p6C�to�2n�	��	���T�C����4��u��ʮ#B� :'Eh�=�Izu
B_���~,���o4o�'tf$����tG�Z>�L�6-ø��ô��I'ϐEȘl��Fp+bd)l(�<{	�{���8G�\����3Ww�e�Q7V�Y��`��6��.���&Ӗ�g��f=�Mw�S���囖a�jD�I{�Og؇d�LJ�׊D(�G?�Z9;�Oy������4�8��ÙK�,��ι5-=�X�"��.laǁT�6���͕��� 4�r��1�����㛐�i��d����^f�S�Q2��4K$�����kY��l�f���M�ӧ���+����S���n�("�}�/�z��Ն�錥7sMy|�g��6��OL(�p��������*�8�;&�l]c��D�W����KG=/p]�sYSK}�S9�Ui�ۘ�S�1�>K*�4�h�`jy}�v��WމY�O��R싵���f�-����\Ŭ�����E�5�Z�U���\����0oTk#F�<`�:�E\A��']������:�ͥ�����ɵ5U�Q�
���(Ɋ��ʌH7Y�IJ*�
3���Qt��$�~�Y:�v�%9-׵VFT���X�H�\[��͡p�֑:3g��'p
j��@�!�HVS:p,�V�.�-��ř
��e����W1x�$�1D��ʋs�O�<_"*[���1;٭^�|�X�Pe�q-M��7�E��:D��˩���j9����U3�n�qU��UT�\��L6�y�V��϶ũ|�蔖��:53'�%��&	C_��ƮԒ9��
�ח�~���߷-Ƕ��;���2��de-�a�'�sK�;[+y�8�fRGp�C��.��,x'/pW��>�Ur�r͐�y?9�lI
�g=5m+�q�Q�S�\�Y���K�.�U:76,�����o�Z�
m�M�֐�n��cs۫�4�,��՘�&WѶ!��W�
N��ܭp�X$Z5ȹDs�ËN�v�m��JJ�h#���XlZF��4j����J��������r�͋�w����O��˼�u�Ⱥ0��>�'CS��/5�~� 8՟���*��Q"=P����mkuS̀f=���#+�=�|x�UMo�0��WY7hmw���a]�֡�!��Qb����rڠ�%ٮ� A7�b���#E>Ҟ`sé�Ls`�(��/9jϓ"�Rk�=�V&h(�@�@�BC��B�AAlD`L���z��J�Ku.Fi��;Y��w�g��r�sQ�3H�b���DnH�Lix�uSʿT<� �z�?F@>��pF�2	��OO�2�&U~����]����E	ì9��c�i&���u���f�����z0>���p0<��z�i|1�k�)��@B0t��9���d
�[zCN/|�~��:�"��۪�k�K�Y��k�L���uT�1p-�F��
�T���	(����_��hNL3�$L�I�\��ppi!12|M� �R��4��:��xt�&�
vu�m��%��Ī1l[L›�2�q?.����k5ڄB���$JS�ͻ/ԸSٝ
X7�����u�_�p�R��LQ�o��ه P�!�������VY�7��U�47oj�mҋr�p��=C�g���|�݄�����\J��w��wc�S9_��K�*��%��Y�Qh�&�Y-�=�</h�I��
�5�s������ͦݡ���~g��R��)p��Lv�+�F�_�Y�5��^��qz����[5M��Y@{��ϣ�V�{��}˩V`�P��j̖�מ����t|_��uwrL��ì�����ew��Jx�;���C6#�gpp�k�����F~;;w��P�xW���g���
H�7x�u��N�0��y�Q����XY!!@ݜő�ST�����%�6Ҽ;���^TK�|�柋Ǒf�S����X�(2�F��ҫvU�r�JS�a��F��,l{'Z;���t_r�x'�Br�iW�A��^[�>�/�v�Hĭ��n;ȏb����V36	��4
���bx�-;a���7Fw�W[�B��a$�0V8S~R8�����6ͨu�c�rL�$�@!G�����6�M��;��%i[ _��Vf�� ӺBf2 xDRS*�nzu3<χ�l��/· ��َ��
�?���{3���d�bE��3�0(�Gx�1"?~�����b̻ܔ��pL�9A���W'h�����>�.��]׍��裷2Ja���*�6a��W�E��%�A׆ĝ	
v�~}��8W�Z����"���
�U9����wx��Ξ.<�״�?�g��m8�������
���x��Vmo�6�l��KkT�g[i���=�[�lH�-E�(�զ%�f"�I�u����v�ۀ�����sw���M�H�~�݄6��t%�|�g��g�:>~
]^��;� ���
�%������=pZ�}�_.�=m'z�j���,�5��E|eqL�}6C\�|�R1��U�X���q��"����wB$1�B��
W�DB�^P�$%2P�4�i!W��7���Qp{��$���̐�`�kn��M�8w��H�H�\W�W�N3]\S���ej��$	]
yA��H@��*-���8����ΙB�q��F4���T�;��B�4�Ę��&8Ӫ[ܠ%���?����=bj��V�=�L���ޝ��Jw�H�3�!"��P��i�f�EH�`�MB���{2�z��� �����:/E�[�vG&:�}�-
��k(*����a��8��D�lA��D��y�!Ù!)�ʭ��V�}qM$�����	
��Xg�T^���1�I"�>��6�,���`nΘ(K=�Y'��>NYGϫ��N�c���)�P93�n�z0n��߿9�pz5���8��ν-@��p)��1w��	�7�4��zH
u������7�)
X>�}J�_��t@ˌ��<l�����0Ni���h�{�ٵǖ�|U��B�;2ؐuH��_U0�/i�˔O�ޕ��!�2@�'�u�ܺ��L���Q&���hTIl��MK���Y�Ӹy���nB�`g�>���I�@�G�
����Xߎ�0h��·g�\���a<��i̡��"d�r��}�.1�k�+���t�y,f�A���"�����|yu:�����ۋ�(�,E�]�V��R�'x�ǘd�y���~�����'���>ϑ��zijw[g�e��g�魹m齦�[kA୅b6��e��s72��z�6��S�+ֈ�S�Zo�T�[5��z��z;C��3�X,ml����/��Y�mfK�xz�(2l��g�-6�tOc"/<Map}�������->Vd{������(6I^l~�������+BPbu��������+<Qas�������+9JTdiz�������"2JXix�������'9Mcu��������5KZp�������		#	1	G	\	p		�	�	�	�	�	�	�

!
6
G
X
i
|
�
�
�
�
�
�
�'BSdw�������&6GXj�������


.
<
M
_
|
�
�
�
�
�
�
"<O`x�������.9FRev�������(7BTdq~�������
!-AQ`v����eu�;���&=z_K/c)GG+v��w��ֿ	8,m�9n�Cc���Ox���:�[c��CNc��z�~��5�%��*�Kd���(�
[�ߩ�	L��,�ﶠy��z*N��H֛fd�F�"p�0�O|� ��N˶��t� �ٝ�a�&59a���Z4fC�4iV?s �x0D�2��0d�a>������fT�e�:��i����A͋1�@?��h�e�=%q!���f��������|��E���VH�9}kq��{C�₂U�*OU��+\�5(}n�B��=�E�	u��4bU-�\�2*�t&Ȼ�"Y��D��u�O��̣�s�/9��H{���ͣtD�!��.X���v���늠U���(�vє�l�æm� �	�
I&�n��&�� .T����D�F`H!5�D���"d�O ΢��ה��h#�7F��/~W��X-9&2�P��6L�]�Ji�u�В�^X��Q���:�z��dy��bӉ�w�0?SX�h���%x;ʩ�Qr���X��U!Bnۦ���X8��41����2\��++ف�[` �������E�2�yQ���G.�6�zlb�?Q��r���L �
0:3�G�Ē��N��d�x��\��V ���V�6���v�io��u�hQ�R�?�ڃ��!��T���:���K�� �tH>�0Z0d�hR?Qd�����Cq<%�l�J֡ܙ�.ؔ�C�g����W�z�j�o_�،85x��+8j��h�m���%>Қ���A%�ˢ'�\r'l޵�V�W���6#tK—�����	�c�q��-�f9d�a�)��}ՇD`��e���-룕K
Nv�d���u{3&���en��4k���?��d~=��
�y}����,d�AS]%�O�Pl?�%�`IU˝y��,"��H���u��W��f�O�Sv�"9��n�vb��s�$a��s•�tFc�O3�isWU�s^_4�&v���l'CX�1��`���HR>X=A3 ��i7����}�%�I� ��%�7�k�p={�ԅ9�+�œ�_�c�Bd�^���ס�N$���nT&��2�19'5�2��
�c��~V���d�D��Q�W����Ѡ���+�};],VaJ 13�a��T��L�r�����ΔA��t M�&y_�r����ӻ���?	I�~���JW�j�=�R4?i`�ǺU,���k#9
���dby�dQ��ps�Ф���b�_N�����S��E.c�I��.��:��Ɂ���)�*���.�{͵���b0�����CZ�
�b?�_Vp��I�G�wpE.7�=��i�z6�ߩ�F��Y������&f���Ӿ��8 Yѝu	�8�ۣ�A�^��$�
��/�oule�}A�,"5e_�)S�	�U��@u�
�J6v[|�0�֞$kl��{���0�ߎ#���"fZ�l
ڹپҵ1[a�w�!���:�;��&����<�V��9������v�j�A��ic�r�����R=^eI=��f�?��
h�����[
L�y��u��5\1Qsy1s\I��k�w��1��=���2&^)e!B|*u�_O��A��L�i��rZ�.�=T��
�
��z���o�C��sB�@�}H�6��L
�?d?bA=0��v��o��}5�	���4)�)�9�rjF%��~n��5�y���k��uVd$�Hf0�0i�׷ϭ�=�‘��*l��i�p*�=�7pR	��P���f3F�|�x�SM߈;n�U�O\J��oY�3-s����C?_;W�����ѳ�����@ܔ*����ʞ?;�d?�>fU_��"X#�F�0y_TߥY���������R�܅xaw�B#w�򬆦{kt��r�7gf�᫇�1L;z�1��1��Qy#S*U{8�!���o�A}@�E�Dz�O�W��_�s�����h�d�������ڠ�!Ly]��VW���^���p�dq��Ñ�Ղ�Z,A�w]�q�%��-�,�yek�]�)g4D��
*�w�v��-��>]�mU�:�>�j���ZYl�m�54!�:4u����C���fn��[#���U��FTż��ڳR�UE�;��Rgzi�y$^�h�xz��:��8~M�I����H���$e�=j^7�ΕUz���"�d�
��{л�0����
9�䝕d�{M�&O��=��փ��)�]~7=#�Ɂe�ל�j�A��Y�zk���4HQ��[��_-8,j�@#��Ǡm	�|�i��}9�7w���zV�����r���	؉k`)[��Kֿ-�#�X�S�5�
r�9r��5>2f�5|=���5�߽��F��#��pP5��+���.aQ!U�i��a��pJ׶6\㌠��7��Љo��qi>��e}�}&���� �b�\@��Jv����w^��Ɋ�s#JP�.��j�I
B���~�jp7�95�UlǷe�W����!N��LƂ�d��Ǯ4��<�?R�ϼ��RB33��-S�1M�ț�O�t��b��Ex�*����q�Wձ~���HL��++A���)��j��m�=�0� d�5��"�E�.�-L'�'b�=`���Taz���x$�
��ʹ��bM]��|�349���i�k$�㜓�q����
���vi�����qjM�Я�l��|��	�(%��ơ����\���w�U	'�_E%r�S��Q�ɡȋ
	/"�
@iT��nb2%��/�	9s�I�l������'ȡ��	I!���"1\D*����	IA�ܿ�(�GO��(����'	JK��gV�7�:�Ҥx	K����6��b��6�W�	Qt��`���_̺tfg�\�	[������sQ#B��kt�M�	iQ��c��x�冩��[��R	p���^4o�s�����ɑ	z��Y�1����:������[	��ٱJ�*[���~M�0��	�8�U�U��
�־�-�6f	��{�Mz"�h`QW�#�	�d���5���_��K�w	���~��@\���2<~�_�I	�`����&l[F�J=�5��	�d����&`��[��vd
��8APn��1�"�)��gk
��;A��M���Ff-�5��
`�7�i����C
հfK"�
e(���1]�h�����ό
h13��
��&�9:�
v�{ⓑ�x�w����]ҁ`
~��įĈ}4��1����U�
�bu�Mc��`ar'/�ٍd
�2�i�،\��pO��Z��
��Q>Q��4��̤��~
��gW#6	^r��
�/E_
�6�-�Y��D���uFl#s�7�;��4޻�qgM�6��v}�n�4N��
��ฺVcm�J!�3-$/� �ڜ�q�֙Ji;q�*
4*
�03u�5��Pt:C�C�!rj��^dv��E��?�����s��p�@���QP��E�egB�����sRHH��Q��q4����/f�H��`�QSZTm�jLE��>�۩mq�֤� �FL[�+]^��w��.�Nmc⨏�R�)b���u
��ŝޯ��(�-���AW��&ȗ�Pp�H�S����GlxC�;��[��q6����è�,�k��7�Z�q�zU�$��jK$ݳ��W1��_�P�!�*k,�/��i����էW����4)ڞ��ðR�rWڎ�=BZS�N�������Y�{���s3��׭4bd�o�
[���?��N����ڜ�Qs��t�
��N�r\A�}6�}�
-4�.��p�V����VC-Q�W���غ
yDp�ɯ����C�_��
c[��ǩ&~~ y�Q��)ip�^�'��S����3?	3Oṧc��>
+��D�6�7V�j���������:�W��//l�ߺ�d�ܵ�,͜Y��]J�ƭwB�8�*�";�]�qRѺ�~1���y|���t��J�@���m"Y�������q�޴��	�08�9�<��>����H
`?��"G��_��ycA	
!��Y��7ZPݘ{�ָ
+�����"ǫ��Mj�
AM9`ŋb�+6���h��
F�m��Xg�����MrN��
_M�N��V��U+��
h�����g$���o
}@
��ͦ���h&$�]ӘV+�
�tç?�  �w�,�8K�@�a
������S��i]���� �
��#�So`��ůa����m&
�Ơ����/���AD�u�
�۟�h�=�a��(0�$�
�s��|e�ݶ�a���M�}
�-�Pka��_1C+�ܹ
�9A?�]+?fS?}w�*��z
�=�2=���
�l�']�8!��ז&V�q��������)��6Y��u��j,e�?���|}���J�d���"AtѰ]�E�_c�MA�,i�H�,A�~:fE�G�o1���?AK��$�]ە�a�\�1�N�\Q^
�u���t�M��Yd��w��<��A��}�b\M�N�@��,'VG�%�aХ3�A4���-�JA�r2��>z�N$P��I��k@���?�=K/�~�NI�y�K���!VF<��hқ#�#�����mI���x-P|AP>�m
aW�������2��#�`�������y��]��d�H���;��p���_�q�(ُ�ŝ���凮�����L.)����E���:����s]j�����;-�����8bO�%y{/�6�.|��j�e�#6V�m�l��2Oz�C���Ͷ���Z��H��p+�Z
��̐��-ղ��A�K�
U�|��;�0��?J���1���>	��%u�+�6�iQJW��m�,�V��tc�J�TU��zQҶ�S�ƂOo:ja%�E���V80�b"�[>���	~��C��br�ٶ50;
��X����;R�v�e�)�������Y;�9�92͡�$�A�
�|̆$E$�;}[��E�J�a�,���ߟ;���(Tֻ��5O0�f�(�r@�B�`Г���>C�f�Ty�Eȷ�.hw�A��`B� ~z޻���pe��u��լ��?�P��>Վ��m�Y���.�Z��n? �N]_����1@ϖ�Ƒ���=�Lѩ�������Q
�a�!;�3a���ᕖ�i��
��m��Ԕ�ɽ����•L=%I�V�Ѧ�5A�!Eݒ�>��b��4�ͤ6�p�O$�/�uk��duh�%@O�ٍ#q����Ԙ�)�6�a@O`ȑ�������og��`K����雿ޏb0�D�#�S��]��뺱#�xWo`:�+�[��B�:���h�*��4'w�?��c��I��.���
sF���V�12$ο���P2},U�Z��n�!:�b9j��T�։p���G�b��V�R�&�vЇ����N�v�-���-�f'���3�|�O\ y�H3Tb��b2�,f���=�B�u+/�ʕ>q���X��!H���k�f��ǝ	�������J{�����z7w����?z�h�	��[����IEC�b����v�.�Q|3�M�O+�̖���oL�	���W5(��n;�?��[s�5��E%pZ�ն
|WSB����T����C�Y!�*�������5?�B^��+}]���Kg�\>a�-Am�c���-�.��o�����/o�B��\a�8nXN`��['c��
�*�^<�t6B��R�D�=�9�2j?@�c�d��w��t@J��9urR�$�~��ܞ�5��x`UZf�-8}[�`"�d�
�\^._���A���x?�g�#U�3�t62B9��.�)h3�	��%�`��UCkt������^�k�o���~�N�[����L�4��N�%��"�I�Lf,�]�*�i8���A�#����g���r�b�da��F�������2T�����8�a�,��<��L�$:�:��>�u(iWG�u��s�~�"��=�*|Q'�$M�o�%
@���I|?r��v���K̥J*h���	8��r��9�""Ij�{䉘g��GI�-��w���蟓H��v��6%]2�Z�M�dӸ(�>�b�>u��o,I�xD�8@���jA��ʼ��uJ?q���C.�i��X�a��a`GK]OT$���D3���Q��hP��ݮ�k��=��#
���k�ɫh����U�W���	��{�t��L�IDi�������"���W�^~Ύr�{Q��3o��_I�QFW3C����^hA���@y?�n92��}w���c=���I�Ω�v��M�H��L����p�����h���ݤ��W��Q�E�v��<l_��3q�N��>/a�~�>��v�f`�� �,��q���TϺ�>��[�*|��}O���e��TuA�<���U^�1����� �s[%��D��z�$KC~�#�e.A�4Od����w3��t��BC,V�9���)N+�9Ժ�F*���@�y�ٿ�k��wl�*��Mg�+X�D�j!��X�%�)߬D����X&���Rg���cV�
��g�*݅�����{9�}
+�0�����t��7�ž��`{�%����8e7�#��i1�	L3��j\%�T%c��\/��۔ �Q\
�>E���왦�)��5�]�aZ����p�kc�3IB���x�r�ү�?�KGt1;}競-��S���{��)�E{>+G�0���G�e��jP��3I/Ú�M�,g���s�m�u��2�N�>}�հq���s�x]�[k{j��˃�d!��Ŕ*���v�2�f���(`�P���޸�z(��ڶ?�)�r�K���,y/�Ϊ��3�,Vo�S���KEtR�_cpQ��L�L�2�2����3ZM�<-�6��9��sm���X�˨;�
��~Upg%̗��!W�����W��	��_���=�㖃�j�†����Cjđ����}Gθ�!�a��z��FU�Թ�%�bz���抝E���L��H0�h��?�q%�ͨ��1����r{p�qG/�zA�d���\��Sab�j��j�&�o
���f�t��nF�����_R���K@�����,)k�F�N(���i����^=�����;�J1��a�s<��Z�:�Va	��ST���`T�M�c�`����s�?�l�i0�����Y�$ 1�fK��#��y���јr���W�~�R%���
���j�8k�����){%n�=3���O�Cx�9,�5�5�Tϒ��h\�<�?ߪp�����s�`X?[�w�������0��2E6W�h���N�"z���
���	%~e����]�4���l�H��m��+
RCn��Y;��\�
?�^��B;@�	�%�q@O��)�~����X " 3��[a���KHhF<�.����DZ�zbV_��!M<pʑ����kŕ.�?f-������"���wu�Mz+���!��j�K"��e�C��`�FG����w�C�"��<��#�l�8�-�U��E���(���|V��S�Rl�������;9M�D4��g�V�TP�SKl,����m�6�	nS�9,@
�aԶ�҉�_�ӿ���͌�a/�st��4�9�bt�G�FE��N�����CL���Պ~ޅ���#�M���)�	\����#�_�e��N�LRY��5�U6g�%�0YśC�m��U�l��Nj�x0�4���Nj���`�m��9xsn?���\PfF#֗���l8&�|P�
�7������i��4**[Dc�������bS�[RvI�%m�j�������AQ_gj@�s�\��֝2EV�[$����-��(�MI��3��w�>T���Med�R�/0K��Q~1~�Uw )0D�pw�o~L�G�q�H���,�_�p�z?�T@���2e7�1�t�J@��GWHd�:
�om!y���쯡�b�e��H�
��+�{�^n�f���Q�a2����:?�g��18b�x�<�[{~+��d
�m���#e�5 ,Lȃo3���׳��3��֋s(j�7\��>��-��[�h.�M򖣥�gZ��M�(шI���]���v9&�s�3ɬ�1ͦ����֢$=�Z���;��Ɛ��#�Dm�#c��W�LA �Q���7�<v�>r��WF��LwY��3�zV"�F̻��.aٮd��ʩ�Gf�_Y�O��ȥ���d�؎k� Q椶63�љ��G�'��t5�H��z�&{�(d8hH8��fqK��ؙA�d�!wcoҔWtJ���Y�w���YJ����W�+�z�[�xn��p�"�8s��/����/BMb\Zs4��`bܔ-�u����=Jr)��O�{}�ѡ�ɂ�ޣ�B�&$��;�IIb����o~�h�'P!�� Ĝg�T 8d��qpP��k����O#�R.��/��y0T�Rй`�JW�Ո~Sl���en��F>�����������V9@���*��)GM�*�L�j�Q��j @t�����"�*�K��N0-��W�6�O9=�(<�Qt�6�)�n��*�yx����42@1Q�����i�--�q�|Yuk��-\�2�G@#�h!�Z��MZ���
맵N)J��a��f��$݆����Yd�ۨb��!�DKem2�qŰ�ܑ@K�;����	*�"x��8U�����ŃL!Z��~;cA���=�K\`H&~��Q~�,k^p���w�%�v���Ӏ��2b
A�ez�J��/1t�%�*���mY�Y�����\E�k���fj:��bo�cq��*�����F�H�����!�И�F�_��v7��G�ۗ�nu��0U��4��~7�	����\u�Q�
��Bfmxţ�%^���)��S6>�F}6A�
��&���G�ar�U`��u#��1��j8�-��;������Km�8��S6p/@�u<�@�gNXPz���!"��"�q��G�PAg�]�{+�7�WUwOV�w-��PޖB7%�ب��)��UK�_�w@���'O�Rq��J�k�e$�T!��
�P><m�bu���LjM�Uo��j�榠Z��l���-U�
�ݒ��cZ m*U��P+�`�����s�p7�`�2��
�_Bj��)|���{�Owti��n�
Y}>f�Zl���(�b�&C�~nzn�����M1�6@��}��Mg�	�M�[|�[f������>��D�DO��a������BL�kW�w9H]�г'������C_���(�FUδ��<�q�2�����!��G��v���)_G���,@��qYm���4�<��R^��VY�p�&q��&�Z_����%Yv���⾈j%_�"�y�>�L����4�o)r�4Y�<G��晢V`��w���rb�0 ��^������CF+T*�Ѩ�d�ƻ�B������F�q�S��~x���c�K�<��q7�.��zQ���~Ҫ���Ev)��V4~j�p�U�o��Ǔv��ؙ~�e�g�4��t�I��pRbV�Ӄs�<Lg3~�,����r����KPh�����U��h�"�I��[6���k�ߓn��(� �7K�">'�Pl.b����*doMv��v)�o�	�]��
�`��Z". �-�'�AÇ`�Ƕ���!@/�K^�(n-XxG�4�7v04,���8�o5���o0�4DG7C��k+��Tz�
a2%�*�:���������x�'�;Đsc��+}9?�y�ij�ZOϡ��5.�7Dm��^S������i�LHB���U��5���9D��џg�a��*���"��

vE@w�sB��ˣٗf���|���:qw�$ �{ͧ'����K��3<���_�.aU��V�`?1����~��N�i�W㮀
&����ه�����է��C�nj=���	�TZ���m�$F�`,c�|N'�e3���픙��yg�Fѿ2�U!��R1�����E!�!�8V-.�J^ڂ�n	C�\�c�`�	��j��z��}:혬n�$�zt&t���t�"k�p�n�~�/��u���ݥ��~����ȝ��-"D�7��m��[����yȏ"i�O2�h���{�pK&���[��\}(g���	���C}3\L�t���BR��+Ɓ8ԉުk�gh��e�^6��Q�:��L��kV\��>B����™V����az�~>��h%��smd�9N(���U�A��~&Eu�5��^��~��ٮ`kxM�~�f�4m��[]�sH��
�d76lK7KXs��h��ndqK:�|K�L�T*�V�-�!I�l)G6�G~�+U�ӳh�D�/�[z���Lg�cZ�>��"X�/�~a��o�yT�Y��qH�?��r�6ȑ�C&��5s���
*�R���c]x�~v~�z�lV�0���d���
��<+.4�i�`�G�Cp>n���zb�u?��\���m.�Ѐ�����*����94ś���"x'%R�,��W�ya��4'�W0*�!D��P����J]Hm�CH�d�M��� 1H�����\��E� ���Q���	�@�,�!�#�� �7] ,�-�CEz��yV  (�wƜ���Yv�@��Q�\ %�ްol3�h�u�B��h�} 3:",�t��=�*�s4s� 8Ќ�{�--�' �n���X
 S�G!Q
�:��l���z a`�̏��?D��a��F�� a�)�:��?�l
�&�: jw�z5U��|}�^�P�W�� �J�/�'��1E���}� �fz�7�,��~G��� � ���_���P�ɩ
�c��Z� �lo��ۈ�	=�6Ǘ
^ ����[���ꍌ�y�	� ����m
����c
�L��D� �ܕdž�@OAA��aC ��q��F�g��L7��7!(�#C����pUO�!����1z�ެ;g�b
!뗣�u�����!����1|!:.�0��mqگ?�֒!;�k�]f�x��z!�n�U}!H#�U$�Ƶew�C�-�x!L�k��ۀ�%z1.o��!N��YK���ǠOQ׍��!i��U�c��@I��Oɜ�]!u����=�ħ�7f��<N!��6�wlfh�~�H(�ď'�!��>H�]!9�3@h�����!�o1:N�������[u��!���+{�-C��E�)/h�p!��:�y�/BY�&�eҔp!��_�2�J��ӳG����!ǁ���9(U�vp\ +�!���>�Q�9[���}ڎo!�Wo2�?�yݘV=t!�	���(�I�C����!�/
&�\#��`Z���=���"�b�J���{2���'��"dD3�bN$�L�b�xf�"OL���2?5��&v
���"O�+�<��_�Q�veF��"X�r�/y�6�`�t�Ý���"\@ح�H��8�>硆�Rn�E"l�=?�@��da�3��(h��"l�?�N��fݳj0qV"}�,��^�b�T�to*"�D��9�$����#�P"��ce-����6l�B���."�<���(,&'Ym�(D(�%8b"���Ã��+4^��V�� "���f����Y�z`2�'�#6�lu5d���@G�1&z`#k��.l���j\>@�fx##`H�G�����W�O�#%U���|]ͭ�1����7�#0��vN'����Jъ�S#G1���Ԅ2�/Ћ��Y_ #S3�)��"?	1�v.`Q��#T;]4E&SO��Vd�,#]M����|�w5�}^��#d7r��L�7α�'�gu	S#uろ�DB�5�!��y��w+#��Td�=��g��Voi�#��4�/�3��]�L�һ
=�#�H�����|E��s�#�
 �%�GhEEU�fC��@�#�5��H���A�J[�p#��>x�cmyS�T����w#��V��J��'���DK�%$䘄�TOx@��.3ج&��-$ �@B
f���Z�Y��Ѡ$,F�^O�[������}�0��$B8W�)?��&� ڮ���X$e��'�v}����/��$�=v�R�Mq�KP.�J��
 $�����3_�f@h��ӯ$�ot ���S�T?��7��X$�:`O

;U�;ix7Lg
$�.0�:
۰	;^�krJ@1�D$�d/��Pk2�+�HzS,A%z��9)7���q4nxgE%�d��ZSm��-�P ��ނ%Ļ�G\��^�R,��:%A�e�6*W"��|ۓ�m�%K�Q�`�"4N�Vѣ��ު%%P�J������M�&�^Y�%W6�F�K�5ɉ��"�V�%\ ��A��n�e��a�.%qW��?��q(D�Hj�Fp%�a|��S�G�����4�{�Z%͟Ix�Uu��x,�M��%�*���C5��L�9���-��%�أaYP�h��WL�a��%��#�=b�������&q���
�E��^���bb&5�8�*�r��sU�ֻb�
&>�����p]�_��$�YDd&?4]��#��g�YJf���&R}|�3ű�i�F�/�5si��&^�-�ԫ"VD��� |&^���FL�?c��E�MrN�&a�$6
�n
4\�2�YG&a�(Aצi�%���f#FX-�&bk�ʢ�}v�k��m�@��(&o��)֎�q��8؂5hԊ�&{��r��/�n�aVʦ��&�W�K���ċW������#'p�v�[׾XV����T 0�'��e�^�J6��J�@/�'�8��͔/X��)��E�$�S';g���k�aa��I�j'V�=#f�IQ�BT'�����'YCs* cɬEAp𔨹�'��E[�pn�c��\�s��}�'��8̵HlVB�^Q�Q�g
�'���TWYO#�Ӗ�
b��d�'�F=�����`���>�E�S�'�ڎ��:�j��V���sG�L�'ע�M
��&c�6��-wv�4'��G�;0DB|�}!fM{4�m(\v���A�dh���GQ](*ܘ>ã(.���Ƿܺ�Y(=���<�{a�%[?\�
��(?_�+^�,�y��7��Iak�7(D~���-�wEYBm��h)�(G���|����h}T�X��&(M}ĸ�/c�g,�R��v��(N�
���Volk�CK��u�(i�H[�Z����v�Ĉ(�T!�H��k�q�E(W�2}(��8�~۩R`k,j"ٴ˦(��w��
�u�Ĭĸ�(�gdPSiTr4� 5(Bp\�(�a��,�h߯�ϧ{q$3�(�袷�e.0�}���eho�(�"�!.tM.F1��883�X(�g�����H�@v����X(�ǜ}A6GN��� <*$u$(��!~�9um�s�����̪e),���g	�z���J�S),�'��q��09)U�q`�B-ыmA�G	6�)2c�i��R�13�ڂ`X�27H)U�s��
�ht��+���8�)VFXݲ-��8�=���)W�v^)�#�Y������)f��^�Br��R��+)g�IL��&�����>��H�)n��l>�r���<��P-)�.|�sx�	!%���G�W�)���m
��(L���ƕ)��[�����SXW=p�m��	)��g7jD��H��͏v�)�+Y�q}[1��B,cN�k��)�H��5`z�v�}�C�ٚ۷)Á!��|�8��RNXV�)˗�1!o"/�ﻯlEW��v)�h�l������8�t�|)�%�{ǂ�%���~U��I)��á�`D~���T-
9.)�jd���5ДTp��rY�{�)�?naT��u�`��V<h�"�)�v��r]��`'{�$ۙ:**����40{��1���غ*��y`������I��7*2�	��N'2a�$�����x�*2��B���޵�;�Ϯ�*2�bG�HM�I�qs�3�G*d+Ղ7&�S��K*��ɦ*fe;1u;rÁ�nN�C��*rⷂ�
�A8M[�a� *v��T�q�t|�j{u.�L{*���=lx�C\B��M�9*�!KH�"���|�K�h�'��L*�����xhɪ�o}:r�*��v���5�
Fu�)�Y���*�LE�Pi�'�e�6���IJ*���e�u<P��W ,F=��*��1�b+�6!F�0^����*�.�IAo�����i��n*܁���G��+�+&�P*�Vf-YCS�%^t�@vw*�^�a�[fXN�
{����>*�WlFY�����X��a�*�����i=��Ŀ&(�m*��γer���u8��0��+��
�������(�~�d��+_=�t��$ɾ��c
��+#�d���1h����R�A"��+(����ט9_���1�Z1ɽ	++9��7�� 2PƧ���+I�>8t�
��ˋ�9�8|�+R:���]�6���|E/20�+~fF��/��Pf�Wy��+�G�s�_ݱ�
�'� 3uZ�+�<}O(���so|on��9+�����;��U��'�最^�+�(�6+��Y��o�sA^�+�8�Ϭ-i���xQ��x�+�?Yޑ��9���=��B�+�����V��M�[�;ٹ�/,��xI�;%yB�ݢ�dM�, F��W���԰Z۔� A�,!;5<�>9c�pVMT�N��,$�肠-�H��$��I�԰_,$�SQ�Ao�W�+�� b�,D��{�&U49�b����,N���H<2H�B��$�],XE$�Ț��#Z���OE��,\L�O8�����vB�p�C,_0)�x[�v�'�V'Doi��,cG~��P�3R���orWW�A,n��'�B������L
h �,r�<��\�]t�+�ĶOB,���"�rm'�XN�ZO#f,�l��v�\�K&��K1�[,��1]���*�HH���W9`�,�����]���[
�� �[�,,�%��N��ӣ"�Y��VE,��O���I��,�Vz+��,�����ɇ!8}�qa�,��K�5�5�dl5���,����QA�MX���7��-q���ģ�?2r��,�-r����›;���_��-��.j�Hv靛�s��4-:&��B�wzB�d�-ag~5�fB�y`ژ�.o��-cȯSR��oC���a��bN-d�ާ�{���0L���g��t-j?ϴ���/��¡%-q��yiO6k��N�m!���/-rt\*��t&���J��v�O-xt����M���ƒ-3�-��=�FBptSN_�o��Џ�-����Z��W�Q-g4��3�-���O��Z�d&h�^��/k-�OF���b=�%I#�-�+��=��d�Ĵ�ʱ(-ι�V^���ɷ'W�����-ۇ�zn.��U�SiZ���XP:-�!�(�QY�}��:�v�.^*Q"#K�Ph�00,j�j�.�1f��ٶe�ԋ��hR�&.l���j_#���%..�&_.Lރ�d]$6�E�b.2
ӭ�5�e������.8Q1%-
Xx��2V��.ܞ.;����M����o�Z�g�3.>���G[#�x�z����.Bgy�١'��t��윜�!!.gv'
Et
1����Ŕ	��b�.o
�&�J�"�X~
�n�PN.u"J/��0ڈt�u���g��.��aE�
��;-���9P.��l.���ٱ@3;	{��R?.� ����M�ViJ���l.��<�����9F�{-�ι.��}��y:Yp?T��^G�� .�"k6�an����9���.�䙼�f�:�CP��C���.�`��,�� }Ʃp<v.�ֹ�|�g/Q��Y�$l+�L.��Lk��У	��ş玈�.��b�%$=f̓���ذ�/uu���Y1����9�pcg/¶�G����(ݥ��=b�/,⸒]Ve�XM�k/�Z/0f�{3�����)g�C��(/<I�$׮�q{��A�}u��/F�
�Ji��5K�^|"�S/G�L7��SlL�0��r���/Oo<]���/(荳!��/P��~�E ��E���Ig7D�/~���K���#x�&�hMW/���+�!B��um��/�+b�{ƺ���U�O���I޷/Ϣ=��d�I2�� ��|�/���Σ݋��5�F�0oQ����cg�v�`�,�0{��(�~ؘ�n����Dd0�j"�L��D�����0��NQ��<�"�a7-0<ԑi�~%�k��2t�0A�'�&{��N����
0I�A.R.n i�Fk�����0R�}A3ו�wCO4��q�h0e�I��أ^炟M����4�0������e��`�ۘZ��c0�Hil�C����e�p�Eg0�i��[YL��D(�iÀ�0��;�a�:f#��㟲�?.`0��_�����)��'�%��0�</�-8��&�oRM6��0ѷNGL�DL�3}��70�f��X�����O��G^���0��'c�V�w.�Fd&w1BN�Ǐe�^�'����G1�s�kx�
���%r��)1r�p<y�rT
��YyBym1˅!��M~��כ�h�vn1;b[�V9��v��3��G�V1j8�;Jܱ�t�//����8�1t��5̹��]�%��r1z�
-�t�$�j[��R|�1�f���}�׼x�!���y1�r�?%U�-�N��|#��1���O����M��2�?��w�1�V��~w�C��n�3��Ӧ��1�e�/r4/����!��*�1���ЮG�W�zLx"��T	�1�im�H�7f�*��_�)41����m׌RЊ\�ؒ���O1Ƚ5l�(u+zD���M��1�ň�M%ʝ��q���`�1���p����	��Ѱ2��w�rC���zq�ݮ%��2#1Π�ĥo4�qe�7��{:2&T�IC.�r/��Y��>�J&2/B4�H�u.Y<��p$x�20��m/~���@�ŝ�I/�24O��H�-����"Go�NV\251�CCθ�Cg�]���n2C�
~��HY��U��zY�~�2OhQ���i�T �u��^2T`]�yXR�Cy��$��"2^y�����ih�g�����2a���b�m�r|�S��}C2}�� l���s	L�=g42�Ӝ�&���R�Knu ����2�P�=�I
c:
���j.&2����
��.ˁ��u�:O,2іu�}V0�bց������d2�A{���q�v��^S&2G3
|ֲ�R���Y��Q� 3I�.t�r�=��:���L3UG^�g�5���8T�:�ɇ3\���<����7��3��=D�,XP|�(.2�">�3�Rј����#�g�)
�N�N3�K|�QW95��=��^��3��;��➿a��K��G3�+e�ׂ��cҎ%�,Z�*3���@c��&����D�3�����X�.�
�!gn'3��k�ˆ�{��Tq=�=�B-�4���P��8Hٹ����4,���
�2��Pj�[J,�[j�4-P2�}T:�~[�oa�43v{�J��dz(��[2_�4F	�hZo@Ds�ޓ�1J�4����_�c��j�)��D�4���y�8�&�.}�~4�0n�ۉ��Vz¯�	h4����^��ab�@��64�,8��n�<�7�3M ��4��b��dR�״����LZ5���[�q�N�"M���5�q���g��ģ�3"ٶ50\k``�jd���3�.άu�57dO�k0�B��Y�%��X�U59?��O���J6A<N�kma5[q�t���`���d�5\��0�I'u��h)qs)U��5�;���b�
-�B�G�5���	�����
^���"
�=5�l���tJ�E~#(�7�^g5�d4�Q2?q>
[?f��05���^���h�4(��~��5�2�=��8�{��%�lW��5�R1]x���Y}cMw�e5�yS%�@���7���Nt�5���ޗ`}��b�T^zh/6��A�z�m=����KRy6(]O�2�n���ԛ�+�;n6�o���K�%�yy�i�U6NX��Ly�͵IM��yB��6.�j�Da5>�|2@Ù�-�6L��}�ć2Ú!w:���6Qo���WP�Sޮo�ٞ�iA�6Q�)2���LJ�0���x��B56Ubx�NK��1ɘ>�Ԣ	6X�2�$�C�`}#��U�4B6x�wպ%�l�U`���46� �K�mY�q��%7�i�6�b��)I�1,~8nB���4�6�B�ABI�L��a�}��6����7O���덂����~�6�G�(�^����@u�ɟ�te6�r���8L8'���<�*4�6߽�9�E��;�C�R�ޒ��16�B���]��i!����6��������4�0T�G��:7wE��T���;����RS7R�y�1S����;�s�'�7t�e"=��
�S
��7n���T��~N�uVD�7���a��GKO��x�7�>����wYB�h��47.<�J���nǥ�i����7Vu��<���c_�l����7er�9x��Z�]�>Q��ow7}'c��h�|A����-�<'7���^�t
�Ds|�Gfoo7��ĉ"�Cf{���ľ7���)4��߃`Cs�ˡ��(7����	��*>w�6X=7��K&,��S2�BJ�)Ů�>7�Fs��Hêe�u��-�7�\�� lsxC�·�JKO7�P�����{!� ٿJ�8��
%��@Hk��89l8!�:U�,�Y���R��82�D�%�o D�ʹ��e&85\+��n;[������9�8EN� ���j����#��p�8I�Ou����<ch:I���8Je#>1-���aN�z�8��%38���Ȅ�qG#��2�8����ы���,ʨ��~M8�MLѫ�l%G�
(��88�	�j3<[�R�͗SE<�*L8�歷B�w�u
י.���8��9�=���a�V�&7b��8��Uy�S&��4�kX(B�8�m!nLl03�uf��i�"L8�K������m�|���G8�~���	�f#�����v-z8�x�0@��V�N�Rs8�;�'ۚ5���v�S>!8�*5b�𵏅P�h`^��9'I�i�m�et%KN�"M�9
��WB@(M�z��kM9!��6�i�^�c���p96�[yL?*�؅龾��U��9P�&���5���IB�ɬٝ�9T���[�DHP��C�x�9U��p�~~���Щ
{^9�
W7���:VP	F�O��J9�na���p���j
�:�u��99���n`��^!�6�HQ��9�24�3v�/X}�+��w���9�a>=�w����g���s9�%�L�8)ړΞ*8*b$ Y9�)%�l �����+�\���9���Az3���?/
�9�˫Φi{��(ۇ�
$:�<=zKLvSKp�n�d�k?:'�s�;�PX3�q�hHay
:J*㔁���l
VM���:�������� fp��|��:%yϫ�T��]��[��N��:%������ɒ�_�;&�ה�:'�	#g���Ay(*��xA:1��Mpx��:.;�(i��:6�/-��ᢃO'��{G�:9�ȴ��y�3��]�Ө:D��@���zt�Q註:H�ۙ���Šv,-;�K�:M>d�it�(t��Q*h�wD:�S)�4�l����*�蹲�:�1��$��C&r���mX:���m�'�@��D$ES~/:��D��.[En=���˅�:��V�M�r�l!�T��_�j:驶7z��=�Юb�eK�:�j�	�aQT|�ֺѭ�_g;��(3	���ֶ��.��;��t�K!�w���o|B3�;.�8�d�R�Є��";;g;S{�c�3��������G�U;T"&�,9���|�z��T�;mo��j�T��{�V��1;;��RH9�N�(��a���;�����ZK;�4\,��e}\1�;����a�9>���T�/"75;�?��х��s��
�A$��Z;���4�q �ó+8H�;�L}6�d/���le�e�GB�;����*���Dav��Q��8;�e,�A�U�+�ƞ��"G��</V`����D���t��P[(t<��s<uDa[��41b"<|BD�NT��%���O�</���'P�K��p<�
cd<8�oɰ��ڄ��>#�<C�!�Lj`��m$��k�R<O��
�]�S�ʲR�9���/<R��Y�I{J=s��F��0<g�5�#�Ѹ�y�#����<l�iм͠	ҹ�⦊��.�<wI�F-߇6�'‚d�0��_,<���y���ƥ�N�D ��]�<�{���B��Xxa0�j��<�Cg\�	O��-& ~��t<�۰����"@��h�mQ��<���*GI�d���p����E<���S�a�/f����1)�=	};����F�������=*d�=�E	y�B-���=/H`9���l��F`�R%�_=2��~t�w��ݟSZ����=4����:����em0f�G={7�(��4����#I��=|��.�>Syi#/���d=�x|ia��t��"A-��X�=�#�AZ'�pƐ��f��%�R=�-K�Կ��kވ�>��S^=�����1��F���Q{��=��	�50Q�h�ю�g�22=�T�r΀���@����u=�P'�q��]5e>F�]~�=���4n��3X�~���i�K=���ڐ�
=%��y�`=�zO����Sr��W��W>j5���G95Zۄ�k�(>\��J�6���L�.�#>z�4Y��4G��q<�C�o>�靰����IJ$J��A�>?V���ԍ{�W�ԃ>�>F�.>bf����ܫ�
�->I[�Lf�Z��*�=w��>n$��۱��fC�O���	>�T�S��!A�X;�(\X�>�.��8T��D���%�/�ǚ>�}v�诀�3��_mP���&>��A)�A��rN$�1�}��S>�N�"��Ò�d�\���>����0V�jc]%j���y>�M���^�h�G(VYVyv>��n��.�i�2nd@��-�>׏K��M]�ʰm�^A�h��>�NP��q˝�C�1^���b�>�Z}/��>_��t/��\�ɮ>�|%b�	�Ya���)r�0>�ف�5#���-�]1�0�?J�t'h��n缾�]�10?9c�R�E�h�%�YG}Oe�P?O�A���=�5�
�֏�HT?ZI��Q�� ~�UH�\�?e�=
�H�;�Q��
yvl?j�V��o�%%kP6:[C�O?��v/���b��"P��� �?�����q���I�Z8�?�iCbNJni�x��k�W��?Ƀ���<
=w]P����?�;�kS'�׺�a�?��-7�X�r��%��`L��?�9���e�iF�Bq��?����6�T��0f�n~V6��?��0�8��~1�ۤ2T�i?�w+��'rxep�LL�|�@��m�=#�|g�@c����c�������&_7+@}�S��_��j�o+`R�L*@ �n53��j�E@�gM�e@#�ȉw������-{
2�@1X�qDI��W9v��@@��F�Rz�����/�|r@B��X��HR	��a�	�@e>|�3#'A ÿjx��@f�A�~�����~�'X�(@���Ï�8W�[��^@�N��wp���)=]�"K@�lV�Ej3�Ȓ͘�H��"0�@�t\c�˩,����Q�@�r�/kt�.L�4�@֙6E^��3�D&�g<@�u�G����W�M�x��{@��b����,�&�H�����F�A$e\>��pd��Vc2x���A(x�K�c�-ޫi�p蔼�A,(ʉ࿖A�^U���@(A.��q�t#��k�I��:��A[ ��@�7��'���W�A[+9״-�|��5�ڏG�&�A[���u�0�S��k��=\��A\X0P<�she��i����Ais^d�)���EA�<:��A��(i1��!P!S:=�$DA����l�N��-����ZɊ�A�
����pY����p��A�y#���	�k�k��フA�s������z7�;u��A��͇�����������V�A��V����|�7H,�p�QB1&C8��t������J�Bp����4y�x�=mocB
�ch�1��AQ<l>��yBPL>C�T�z�����Bcz�B&�\M�68�D�9@y��M�B0P�U�$ɝ�c��Q���B:0��Z�Ap��V1�ci�B<!�y�zA�s�f��)��.BH����� }�̎A�PB[<�%�+����َ��,e�B\^M�%,�h��M�ԝVBwՆR��Qc����Cкh�B{�b������%P���B�`^7agI�+�鎷e(�:B��#���<+��?�?L��=B��p��,�G���<����yB������2�_�#Q�<B�|`��|�$��&�)����B��&Ṃ���������uCn���
[��2ګ�[�C
�E����J��-�i[C!J0[��o8��F�@�ޑ�gC@�.H\�^�=��!��tCS�����&�a��pL�aaQCf�'�r����;���iZe7C����.*����n�tC�$��,e��V��5Q�e�C���]Jߓ�n���P;�C��xk�i�b�+uKY&C�K��8�o�!C|U�C�(������X�ʚ�m�~D1Y��̈t����/6�FD|�y���j�)(ICm�b D+T���M�
`,�<�d���D3�ܽ;���������*BD8�ՙ5a����T��G�ѳD<n����4R�Z
��i�%DB}�c�a����/��ADV��Jp����S	5O��RD`[�i
~������i���ODa�;�Ħi-�wF2| �,xDkw��
�S!w����3
�Dk�#�j[��[g,$=74�Dx��s�Mʼtޅ�F�6��i�D�z7L�H�L�
��w6D��S�ޏ�	�w��E�=�t�D�œ�U�>4��$V�wm)D�<�
��Z�~pEi�55'D�/��em6]��~�lj2�eD��<
ݍ��!�".eN�-D�6
&�
m�S	CA�Y�z�qD���2A�h�����. �dD־N_j�X��>c)Fk-T3D��J�ʩ�e�U=��LD�|`;he���t@��n7�*E����Ym>�J�Ʈ<�M5E�^ɸ�n�4��#Ms��E_����?H�F��y�-�E0_�|h�2��z�xi�UE0��J�����?A��EFʶߵ��H�Y�d�y�Q�EG~���[���B��z�EW��/��~��o��}�a�E��h��&��3Ќ�!ME����}���.����E�#��P�s\�\�;D�&��E�e�ᆪ�
����T }b�1KE�Z�|�)�z�ۇ%�ЎY��Eȟ����=�	*+�
w�Eʴ����}�:.u9��%�<Eңx��z����A��yE�+i�\�f1Qn�
:��F���{ل�1�ߚ�SwH�F�{��\�ǡ�@Mbwo��'-F��R����&,���o���F5;N8-T�5Rq4yF0���"n4���r�C��F0�1T��ݖY���vy"�7)F8X����L"G1����kF��+�w��(<���-�M~�F��̔G����W�u�!Y��)F�Gt�h5�:�f7U�
TF�U#�3B߇�O�S��R��F���(��J�)c9vKƺ8VF�/�
1�9���*a�Vz�G�}���5!%[��=���SǭG��<@U���J�G��^G.��'��X�S�����T�6�G0.�@��b<��cMaP��B�G1��b��z&���4!X�G7���^�	��f��͜G:�g/�ۤ��i��$�ס�Gc-Z���
����:�7\�GcnVC�T}�(�\�>0���~qGc�h<���K�����E���Gj���):7ro7�&�3i�Glh�7�tj�ya�{�����Gm����.��ɂo�Go��u���Ws�q���.Gq����
Mf3�b�rY� bGs����֊eo��o���4�GvZ�:{Q�g��|�:�<��- G�[��V���Z��f�|5\�G�݆B�<����w��xvFG��z��[b�e��!3�a�
LG���\x�mU0��F�GOq��G���3� u0\�n+L"(�s�G��߄k�)՞�(Z���>G�u�wͲ�U�ZW*���:G�^Th�Sg�(?)��L��G�w���B%l�+����G�St�@���LM�c�)��u�vH�E5�mǪp�4��ؠl/HrZ��#Э;״2���U��H$�nZ��K�?iDsm
H.�
,@�zᚱ+���HN�"��≢5��}^��He�'���%�^�܂KG�ѱH~~+��#���
IKǤ	[�qH���_�{<ד$��Lj��x)�H�O��UX���OEٮ�WJ~H�'�� �]������.H��m53�F�Ϻ�L�c�`�H�_�'�ū!#����$�fH��%"t4j�&��HOtuSH�n�7r��N��8e�=���H�F$���G
�Zo9�ȎH��X���I�ۈ�25��H�QϠG��}C�:D]{��I6��a���W��޽���R��I("%�h�c��U�,�'3I<&
>�����O�'0�zIOr�
���\a�L�5$ޯs3{IZ��vm$��]M�x�j���Ia�����b�Mw�,�
��_6I�7�(M4�w����%��)I�h�����P�Q�{��I�����������w���I�V��MA��xP����XI��ۑ����5�\�%ޏ�t�I�96%��6�b:���(�I�6���?O�sh�+47Ǧ���I�i��܄�͆ �㕆�,I��8�(�
N���DPd�PS�QI�Q�lFd%U"��ؗ�I��	<�4M�%�yˆ&!I����M�	p.&`p�Cn`�J����Uk�*�a��:�.K�)J4���g230tpRB�[��J��������3�p���J�
�٘X�N%)|0!I�J$�i�L��7wRrRYw(�J4���
�C`�<�[�xGJ77P
�|�
��3Y��HJl٥Psm\��X�ʠ�+J�r!}�}Q���Z�qFg\5J���īA4M`�
W�aJ�{iy*��h;��Ԃ$"*J����i�yz�t&
nޥwJ�G�:��;[��>ά�/�o�J�p�v�W6�d|�S�3��vJŃ���'��~fe#��יJ̰��,5�pf��U[�CJ�ꥲ��Q�� 9:�ڈXM*J���rfW>%ӯ���zB	J���:��\{����7B�J������!7�+���ԒA�+J�������T������Y�K�*�נ�M�w��ޕU0�K6!&
\��[^[�J ���KAZC��m�y�M��A����)KbF���R	�ѵ�w�&?q±Kn�{�y��Iv��c�UN�
�Krge��څ��u҃��c��TK�b����@P�y
�t��K�����\��E�ߌ
�;�iIK�H���6��;i�0ze�:�K�ER�)-4�$��*d|��hK�x�u�eS���N��N�)K�]��e)3�klZ,�vhWSkK�]`w�GAVD~i�2z���Y�K�=
��PCa>��A��G�L
�s$���6�պ�=U<¿L?�K"7#]f얥�G�W��L6���>o?r*��2!��L:?�>��u9U����QY���0LKw��*��;GF��3-rLR�M�j��Hc�#$�^%�F�LY�I���E�>��숧赚��Ln��. ���Ĝ���p��~L����~���ۜ�o��DL�2&2ݑ��ʎ&`��\�y�L�$���Ӵ(����g�w
L�Q�	<�����\�{0�*�t�L�����cFP��s8ffTCGL�T��Iv�D��/R���t�DL�Fz+�&�*SФ���5M�/~L��l�XZ���I�5+�v�L�TC�0�g�fq	e�cv�M+�fV�W�r	˒Tp�+�9yM,�s��s"O[�w ���M5=,��=����j����LM5~�k�o�۵*��f���{��M<7�%)?m6�h�=
�d-9M���x���+	/V�J�j��M�J���w�U@�$8�^z	�M��:�Z�5���)�i�ωGM�Ho�P3�;:����?�.M�D⽡�䲁�_m>��㽥N
�\�n� V���g�b��F�N 27"���cmSZCw
��#AN>�RO�ԃ�Po��ZGՍ&NO�����Q�ճ��J��R0NQG�x��#��.
�C��~NX�8?��?��QZ�/r{Np
��Տ�q����QX�{ӅNq��N�.�7±\�u!�NuW+�y�"!���<�b��N���f�=O�����]��!N���������s�_���N��
��}߁J�Kg�ڨ��N��C��һ)�'��ܽ�N�}z6\{'������
���2N�	&��oa�{X��{~��yN��Р
�� �ܳ?���nSO+~����Vg�n��vXj���O&�m��֒Ī�:ޱOfOkt ���F�:".����O��a(J�I�	��a)\
Ǒ��P�й�I`�����V�P��D\򰜴1�ZfJ��P�Ω����?�����z�P|J���W\�^|��7��P�ǵ��äJ=_����q�hP3T��s�z�|a��8q��
�PM
�υ֢������j�PPZ-�浲�-#��!A���PY������q
	
.b:�P[ފp���}��7�@ߓPf��6v�5-�S,j���P�Dk�z�-r�aT/�9)ρԒP�;5�	у�=I?�g&>����P�|\.5���8������+�*P�*Y:�0�lCDi���7�,k=P�!�Y̶��FV��@�E+�g�P�8�
"���~{�C��5�P�?���w8��HyRnj�5��Qo�V�xW�;Z�/�W�Q#��g
z����VJ}�Q.U��b�N*�z�x)j�y�V�QCy&U�_��HV���il�W�QMZ�up��v,
��No�QZG�T�b���C�VQg‡�U�����EO�FQm�YbLW$�SP_�-MVQ�%��n]���d�~~Q�V�QoM���aQ���
UQ���]������("=<��Q��',�Zi�`�����B��RS�^��\���a����2R��v�d`Q@�36oRP�$�R�<��ѥD�_���R70͒[D.�c̷gK`l�oR�W�S\}Z��&|�V�|�wyR�<z��{,��\+!�m󷤸R��h��T$�'~Xx����R��mV$U+��pZ
МAz�`vR��.�a!o"q�{����"\�\R��D��u�y��X�K�&�R�e�]�~��	��퟾U�K�R���]�T��*Ke��B��R虘�p��.�g�O!�R��M"y�)@E��c�S�\&�yk�ߴ��#��S��pW
���������.SP�j58��೪P5���S��U<$��(�F�w%�^�BS'0��(	��n\T��k~wS6%���7�K[�X�&�Iz��nSL��Y\�x:�H(�Db�&ST;*NL�� �
���^��S^��.����}�Z e�S_��	X�o㆕u9S9�v��Sb�%��)�/>H��k(�SuD���WPUD�T4�n�^�S|V�������y���ӧ�S���f{�-�y4!
�OQ�y[S�����kD�ʮH�;���S�� �v
�=Gic-�<�m�S��G�B�.i�\���J��S�&�w?Sk?a���P�K�Y�S�J̴��($l����FI��<S�q$��gT�?�YCADgS�{�r��H��4�"�PB��S�DG]���V��2w�6x9S�9��3�����0��BkS�L
�R� )_篦�A����AS��gD'�����S}h�(S���r.�n
��{�	3��/T&a��iR�\�n�d
�1&�ET27�'؜pA�kޡ�X0�ɶT6 %���$��C�]$���3Tk!�Uji�i}�Y�@{���Tk��/c(ː�݄h<�BCTx
���ښ��ӡ��W�nTz�A��ի�B�!���HCp�T����|O�O5 	�+83�T�
E�<z�}��$d[]�ɞT��sP����|`�1Lph�T�m�U��k�L���V��TT���V���O�ԣ�#��@T�=����MPI;2&�s1_\T�}���k]�#۸i<wT�b��$.��x;k42aڵT�08��*�B��&�Erw�iT�ҟo���c/���<�$U]�����};i���;U��-��$I��xg����U���PgbFI�����S1U$�O��1t��_��Z�F ��U,0Uw� ��&��#>�n�U-2��,g�_�d��<P�UG7��
�u2�X�?�~'�ئ�UWKíX�S��b��K�(1�U[�iեN�5�L
	��[Ug��6m�:�;�������7Usu�s��N
�a1}&����U|��9z(�%@$�(�-ēsU}��F�$Z,�kG�u�b��U��d1&t�rv�4��'
� U�����>�9�	0 �\��U�ƣ9���3��]�m��2U�ⳑkG�KU)�UD��:�U�����{�'������L�Uә�� #+�%��y#cU��k�i|���p�S��	�JWU�P,Aa�P�╙
�W����qU��^���i�2�W�ӭ��U��U�d��ˉ����)Zx�U�9���	��O�{]�;�o�U��C�fJ�)���Vr�Q�}=
�0�CqM �V*U��D��1U�U���oV11S����tp񕇷�,tz�V1in\�$R��q�	���'�bgV8t�~ B��ݕ�)�v4�~�V8� �h��6���s���VM�y����aS:N>D`��VZ*¤�[<{O�X~��z�V�}�D�a0hIɾ�Hy4@�V��d�J��VL��o�rkV���$"�#$����e�My�V�r��a��hi�u�P5Q�l�DV�t��F�m�ԺЬ�a�׃�V��ә�����u�c]��N�V��y20ށzMύ��Џ�8V�I��%g�-�po{$Ĉa}�V�Xc�^��j/�d�ܳ]2?�4Vٝ��XIJj�x���)�V��w>���6<(S�DMΊ��V��-8@�職8	{5�F�HW�lݩ7<�
�޽�Tb�sW��	l���J�7�W!�|�`�6�-m�� �r�W%�L�-��2�A@u�k{yA�W;���t�7��
��頞�ZW@J����Z�3nE��-A<WCI�4ݸ�
r�8Y]��WQ}X�J��ff�����+=WgT���M�
^y���O:"�Wg�B�+ ���Y5�)�, �W�-_Fs��<N"�I����W�uA�2�����H�bݼ�٨sW���O��Ӫ�|��^g�W�K����������ƈ�jeW�E�Z��Ω�&��#�	W�n�8�:}��
�X*�W���K5��kӌ}܅S,$h.W��������O�r����9
�CX5w�KE	�%�R%‰�/j�j*X^E�y�K�f���R�-�8.��Xd-�F�#g8�$*�/��uXm�Q9�S��`y�r�s�X�*Lӳ���#���X3Ƴ�X��m�����g�y���X�S����X3
"O���|R�X����٫��Ys|���X�����)�h>z��;�~�~�X�p%����Γ�(ȩ�ԉ=/�X�
���Hm?{�����_GYX�FZE�^����ќ���1X�� �I��}'��ճ��X�1��h��_�ɏm��~_�Y��"#��FSAj:��2Y�]Ou�S�nջҞ�Y���fUH�u�;���D��Y�z�f���au�?8*|:��Y���ZK�_qք/-Y-����X�H��kI�^��Y@��h���ޅħ���S<YS�~�����1Ȅ����YtST>j���<�Hŭ��Yt�7j�:$jQ��\����Y��a��U��$k������<Y�M�x͒x�14����N�Y��n�/xvn����T��Y���gC��K�ɳ�?�D��Yˆ-�/�mr���kE�;>Y�MmS�,\�X��9s�)�DY��	��$�z^�jԐ�VY��HG\�w��Rd,�
�l�}Y�GZN���nҘ1�F�6&>��Y���F.3L�~*SJ�]m<Y��#��eFo��7>�6�aY�+��e�ã ��L����-Z+,����W|������Z��P�_sQ���|��Z/�����A�����ЦZ8{��ά�P��fn��Z8J"�i�;�>yzy�q7_�UZYu�#9��8�>�^1O�
�Z�Ńބ�� ]��–;��sZ��<�W2:gLm��B@Z�x`��Mi԰��}�Zh��x�Z�
-��*�U�N��]r�Z��Z�k�~̡w��z��<�g;Z����~�Li����_���5Z�I�[��p+��D�
���e,TZ��6���-��1/Ȣ�G�Z�W��DH�%��PlN�Z��NTh*�°G+�ڀT[G��z�+w���㡼�� s�[v��ʑF�m���Xht�[�?�����(����?,[ۭ@>�O���{�Q(�[$"�L��UW��P�Y]��[5�~��*��؏4`��j�[;IA���g�(U����[@=o�L7X�Z�����}U[Q��ů��r�Wo��;��[T\�Sv図k12K��� [t��U����h\T�:��j�[� 	���I��Øf�f�uZ��[���wG���驼�ޗ�C�[�s4��i2��p���p���[�G���[y�����b��
[�]���v�U+�.z����H[�oZG�z�h�z������	8[���6>���0_����-[Ň�Z#���|F��Mj�R&�[�%$���ͅ9 U�b�[˹�\J�C�%!�Rat'�H�[���C�܍"���zk�`��[�5+��t�o�4ntZ�}+�[���i��h�Ǽ��cٹ��\����#�wˁ���s\�1=���/NSe���_w\-�nf=W~���b'+���\C�����5��*�Jß\j�
�[��rO@�֌H�w\�w��.�OVP�8d��_\��6jgCz�̠�;���u \�j��U��M�|�TQ.��\�i[[�nR�*IgE0د\�Mʱ��F�\{Z6]�
\�� Q+�s��%|�Y
�a��\�ҟ�&Ll�/�ƕJx���\��\�X�6u�63G
��9{\��?���i��
U��sK�$]\
��ߧwFwA�,�Z�]'�Zۓ3SQ�xQ��])�k�[��e�¡W�>`�2];�M8>
�/0�������#]E\�OOv�U�e�6[v���]O!Ut�����ΓW�j��]W�e��vFC��5���<.]_�pv�nq_���,�E�%]�ڀY�3#�k�q��!C]���V3rg���= �Vu.( ]�˅��Ď;ƪf 'q�n��]����)���HI�^��k��]�0�`i����bAó!P5]�,��P9*�-C�c���]��&�ڹ����'��q[!]����u.B����m)i�]����˽�O�����^�<n���z鉡���ď^!��x��ߌ�Vэ�d`�^0�;�o��)(VM�����D^?>ߴ>#7��l�Fy4���V�^Xq�
��X�j�}Y�o0��e^f�c
z{����?�R
�^i��9����'�@�Še~��^}3#�!���X��Mx?^��%}͟M��u����2C�^��fHs~�Lȏ�=����<^�Jb=�`���PԨ�K7�^�X`�v"��3�3'�|��^�tN�)0���P�x}^Ø�`���нzT��~��*�^�N�c/�@�|���_��uZ_`��m�x��
vA��
_;�{�^E�L�Y��8FpK_"�cި 4
��YN}�o:�_-�Ha�J[���S�M��_/@�$Ő^�Jt7!n�x_8�����ư_�$�_8ȼ�tS���—�E'G6���_DB#�`pa�j��8�	��-�_X�������>�j����_Yh�����˾p>֋�Ҿ�_`��z
^�����:s���!_��8��D}�M�Q~[��
�_�1'���_T3�g�i#����_��x��L���eoV	�.2�_�|M�
��4D@�Ǵ�$_�7�99l�ZeSB"���S�_����mP;c:��n�b�7�_�m��t&:��<�o��_ά�?�� )�'-_�z���_�U��E#�9�K��_H��Z�`��n��� -�i���`��ɭ�_�FI�0�N!`L�-8��6���H��y`�h!)���2=����4%`+no�2�.'�{��ښ3�`6��r=y3��L�ci�I�*`;FE�s�\#�3�v��z�d`Dy�^i�ն@���jt`N¦N�]`B�73#�x	�`P2?�8)
{�-2�D���O`P��?�e~��3U�"�m`^;B�i~I���#p�*`l�RJ8r�rN�D�[N��'`s�g��Z����G�3�H`�V@��8����RJ��k�`�r��,� Yn4y#}N�$[`�^l6N�k�@�q�6�ob`�j�q��v�����1hxu�`�����C
q+aV��ki6�`�q]���b�Gr
�SP��`�6E��A�v����d���w�`��V��q!a"����`�I��͔��mV�[��-^�`�9�O�}��"�"@�q`��y]�:nyZ2�[�`���'^��+�xܪ���wa*3�u��IH���u�B�Q
�a0�_���wr`��NZ��4�aZ��ꂓ��B�ƣfa]Le}v2yj'AB	�c̃�ab�x��"�i�Cb�[8aq[O�#;��|��/n^>4:axD�O��+'h~�8���y�a�G��SZ١�0�*)r$2a��Sc��[�Z���[����a�U
�����S�ʪ���Ĕa�M�6!��	�Vi�}�Eaƾv����ꞐvA�r^u�a�����Mv<�Ѭ��)[�b�Ϲ��`@� �M����b�7Q���Ⱥ+R�Nk����b#�����N�|�R�4�`{�Eb+�S�U�$�����"�+�b1�ʧ@�!��A �Nb:��]�3�Ui�I�aY���bM�i]8-�
�!�׶A	�bc��~j����<����but�/C�U9'o�u
{bz��!��n`Ed���<�_b|L �q�Y�w��˓�u�b�����?l`һ>|A|��	b�o��˽�π��]�ho��{(b���b��8��\��RRN�cنc��l�6^���;|sec�������^��(��4���cA��A9���U�.Fc8&C8�j	��[1�V%p)���c@�~��0� ݙ��u9��cm[��#=��S_�!���,E�co�AT��_�+��v���RL�c��_ϩ�mbV�Բ�s~�c���.�γZ��f�b1}$6c�t��#��f�~��l�c��k_y͐��I�a?�dc�5��,��nj|5�H�q��cЖ�����ƿp���Bؚ��c�6�x��%��tIϔ2~i f�c�[L��go��������d��=Z{t3�4Ȳ����Ckdܨw���h��"Ĉ�yd.<'t��T�ӵv��r��d
/�e����Al]dd,��*��?B.��3����
d@��1���x�H���C�C�d_� �|�w�*�?���#dk�b)<9]i(?���l��dp+�Re
�T#�i���N�drP(*��#�e�����
�du�Th|����p*��,��dz�s�a�XŤ*�z�t��d{��c�X9^�����䷡��d��ߊ.�=�X��G�]��d�_��v�ױ�HW�i�:�d�w/����b��ȥ�k��tmd�+����H9�-�S
FɄ/d�7
�bde�VL_��U�d�Z�X���
'����x(�d�8;��8���Ws�d�ljz�$�O��^k}��e��e�����dY)E{e�p���&�Dm�]��Ucle3�rtM^��Kq����BjeQ�7���f],W��H�eQ��|r�0�oFS%-�
V��em�Ldm�83t,��<3�e����K�|2����D��e��PIn�"`I_��gh�!�e�[g{����I���m4`̘�fڃM.a�-����ˇ����f*�n�?cy�ǥ�|e�9׫�f.���%�R%��@����fB��~2Ҵ�,�݉r
��\�fI&��~[�J��iTQ�B��fQ���8�5�?�B�o��qs5fUm��1���p�HHG$��59f`O2�	51��-�*�vRfe�Kz�G�Y���4���Ufg���Ny�P�^ں�xd!�fm��b�6�g���D3|�f�W�Hv�x����_�g�f����^wJA�a�;+?Z��f�Q����K�=[���3�[f�L��^�\��gk@�a��%f�=����3��3,�ȩ�f��C��װ��~)�@�M�g��f��{����܅�����f�(i�8�0��1�g�Mt�:f�x�Q��#u���c#�V�Tf��2�478rc�*b�Sm��Wf�E�u쌧En���Ik*���f觝Ԫ{�_��������g���?����b� =g���Q	O�3����{d�gE��1�j�T�~WQ0N��4�gK��K��sI�B>�#�]ga�e2w���W�L��R��gd�(��M�-E�Ն�Sm�%gz�,-@���������<�g�E/�Q�3P�8Q.t��.$g�Wv'b�į�����

"��g���Z���I�QQ�J�<Eg��Fe�B=�f;C�TE6�g�ؗ���?����{]�Og�~�7���S}��g�9R�th���r>������g�ߎ���֧��c��(�*[�g�[�Ț�'.���v���p@hl�d1�3&"A��h�+���9'�?J��s(�hUK%��"p�2]ky�_�h�Tb�������*�Fm>h!:��U�I�ަ}�}֝syh9ڗ�<)m���	"7�8*hJ������Izp�?�50‚hSC_KI,��M|x[��@�hY8#8vE7�l�%�t���hq��:����3ך$i���ht����9�U�����_Wh��D�F�a��0��e_͌	h�o���	��иS�hˌh���X����#!��|r�v�h�j��C_1��*w��~�U�bh��vO�ް��1dQ���h�
�n�T�kJ�WX���Wh��Ux��:p�&��'Ԏ��iUL�X`.�]@�U��4�i�Ƣ�8a˃�KdcWHti�Ñ����<�uo&}fi%gm����.^&A�;
���)iD��������_�k����iJ*@O�~$L��8��l�PO��i[���頵V��-�ޣ.!�i���^|i���48��}��i����2c/���
�.%u0�i�ﬣ?ȫ�#u]IKl��ii�b胘0���H:��� �,i�����Q�\�Pd�{�9i�@YlR�79F�����bݛi�O�<�nc
�n��&a�I	i٧I︰o���_��i彎�-c\ה�̢fw�-��i��M��&}?$jTa�EC\�i�������nۛ��fcj�$E��Hz/��5�TvP �j6#} Z&v&1�oD�x��Y�jM����oX����D$j$V@�U��xQZ��2Vk���j-N�����
:�]~���5�j3^�pN�0U�$�<{:��j9Б�Qqޚ<�&�$i/*j^>���D�H��
�Ѻ�&�Lj���	�/s��ܧ�h'�j���/&���VX61�ej����(.�!����O�F�8j�?0Fn:�(DH��F,	�j��O�w��`E�`�'<j��M�;"��'V�,�3w�2!j�J�耉��si�z0�9Rj֩����W��)
���j׾>�p<��i$�'����`�j�-���
�=�N1�i�tj�o�Q�W�N
���L�j�d��W�A���L�8k	c����E�	
�����kX���0gX�6t������k,�Fu��Hb
��	���Ωbk.I��ć
/H�#���a�k2���x�ei�{��<�cw�kA�^��(G־���/g2�w=kF�J��p�J��O0J�m��kL���oU���$0�9�pkRv���%ڦ?�> =�@t�vkc�dm�L�&�K��],j�kd:�C(�HyR?�Dž)iAk�6.r�4e|x'�D����vk�) ����|خf��;k�_�ޙ����T5�}v�ekɹh
9��{��`��nW�o�k����}>��I�Osbk˗xݧ��rKH�J�m��k�W�h����%~:��D��~@k��߱��vy]�<�}�{9��k�y��m�M���o�i��k��5�׬r2G2Jq���1�k�����u��ó
K��c�`l��M}[�5�CO�)��R��l
�b�f}�/����su�P�<�l"�L��Aһ��E���(l/�x�~j[p�����t��l1r�+%k��s�6�ހl=��jü���;^�߀�P1�l>F�r�
��b��	�4��l?�I��N���G�c��n�lb~�z��r%ّI�ξ!+le�n+0��x}���%�lkpk��C�?��R�e�)i�>ill�}����6��/<�;]��l^�G��T���d�=�lNjč(�|�R�5�7�;мl��F\�8��ø��;cl�*<�}y0O�p��`�l��S
��i5�T��H2���l�gf�J�N�%x+��#v
m�+�Bnĥ6�/���l
mٷ	�]%�"��Q�5!'m@���a��[0�Uu`�
mH�p���mL��lxmT�����_��=N+��m_�^��<���gV�d�m[�m|��|��Xr�S��Kk�m��X���H�U�W�_�K�6em��K"`��i'&��qhP��3m���o��A��n�@;G��˝m��u�ϑ�_�G�:�M"�X�Tm��[%����+9�F�8��m�Cd��"�6_G�3,e��m�O�sŴJn+��G�IJmѼu^��f +n�N�c)?�_�m�v�u�x,¥;�`��K��m�>�,�e{.�s��1ŷMn%y�14L��	ZCl�on�$��E���c�d���Y9�n�ݶ.�786N��R�2w*_n)�<�I��ɪ�f�QJ�Fn-͝!1\T!k�x~�Q`�$nH˽Z���cN�-��1$�:ZnS�Dę}�i���-�x�nb˫1�]ɮ� 7���ϒ��n~��#0A@�W\��G�K��n��Xc��yy��	(�P+��n���14�frva�O �*��n��X��Ȋ�O拑M�t6�n�O5���W�����ƽh�n��$�#0��E\P���,
�n�~��R��'qҧΆ���/~�n��o$�59�y:,I�0�n�&�"SzZ���`
����#o��2#�Q��g	�7X��o#E�X���b��ȱ��oo2��G��%��]@�
�B�oH��!��pb.��k۱`���o���s����2T_~{��t��o�W	���t�~Etfy�WO�o��B�fv�ښm42�G�o�h
b@ٻi1m�s=o��`�o��
���Zm�XH8��o�Q����7�(�H��vO��o�P��|K���p��y����p��IRxW�7Z7����[�p��җP��*�*� K�{p���\2��7&�[
D�p�VqڙӪ�X!��c	
�p.�!@M��6G�fr�G��^pF@�L	S��5H�-�pR���^�qX�^}���G�ģp]���=���#�ӈ���-p`��R՗��0bX����Iܐpg���`>/1V�,=Q�kp|��u�V�"��=��~�p��CAXU��\Nw��~��,�p��ܹ	_�-Ԑe��D���p��=��ǒ�9t�򃎒�p�Ü���ap�/t*Z
�U�p�T�A�����WAv�p�i�$�q���5�
���p�Z�G禽]ӆ��\<�Qp�b3��ÅfzT��~��q��v�8�Pm�d���qfD��F�*��羖�L�	zqh^4�������G�!Xqs\��{�Z�)e��	�_m��qx
�-i��n���1�Ndz�`q�:&	+;��q�#�E�c;q�gK�3�_o��l_䨙��:�q�0���9~��(P{�)���q���?�CU�H���
�ָm�q�Bm�(�y�����(5�.q�V��8���A�����q�р��
��,Mۚkߣ�q�+'��O����%/�0�˟q�4ҕ���'��PzY�aR�r���a`HkcJי�g�r�?9#��4z�ض�yׄr�ѽ{���[�=�)E��r7�G�W�Xu��B� H�FrBuxݷ2��g��`�޳rE_�M�a\4F��� ��Ӊ�8rP��K�/�BK)0����rdE�:�,�]�n@-�t�g�r�*�&4�7Ы[��b}H�r�d�
NnՁ���T�/*�8�r��J�y��`���]r�����JNί2�L@r#�rֻ�tLv����}�SL?r��W��@;-B�+���r�}��_O[�k�(�l�u��#�s	:H�o��QW����n�d�s@=���n�$^�/S�-�EEs�"�ZE��_�_!��s���`	,`p�KH�V
Sns50��a-�;1�<�c�P�sB�e,�*4R�
F���sJ��%5���c�\|20@stX��-�ڏ��'�e�,)s��J�5�<�k)7�8���s�������t������r(s�Y�{�@d����g_��i)cs��S�*���İ�:ȳPP#s�@��%2�,;�Hz`�R�sˬ�ױփ�p*��)/��MKs�ZN3�g6X���h!�s���3�DC7~.�>1�-t(���$���[�\@�q��t0��;��P���;!�YG�t>$�	<C�o�k�<��>���tQ��d1����+K���*k5tV4�X�n�x��<������tc����ъ�t�vQ�'�I�td:0>�ٍ�G,�N|Q~W�tqt��@x�XK��=)ajq�tv��ڶ�:�o	g���l?t��r��EӘ7ZQ�>t��8�kbM�11j�}��P<5t�4>��P��j���"��t�T��ze�'N�߆���{�t�v�Z(��_6�eGϴ2(u$T�������f���(�Gu,���F������#�8�u/
׵��]����|�S6#`u0R�4>���辙����Wu1v�XhSn=�*V�M�*�>u4K��"K�w;�l��+Zu=xN7��{ǚ~~�3�1ruP�4�ȗ�*�0�%�#�L�umYn�l���gy���ޗ�u��M}�}�����y�lARezu��T�����|C_g^�u����ȹ;i`�Yb�N̟u���s)�N�F�1Of�u����Ö��c�����fu�=he/���?�fے�De�u��f8٩3�öh��o�ZRu��;���ޥso0
��*(v+���ZB��YM�~������vE��-*��J#܉(g��M�vK���:؇6�0:HS�vb�5Z�l�%��I�_����v��%q^)���y������t�v��J_8�x����U����6v��l��sB*r���N/܆[�v�3�4s�2��<�
�(v�+Б��&���B��:G�v������B�;"h�u &�v�8:zC�#�	�m��hT}w	�;�A�Rs��>Kâх�w Z��߾����+������w"�퓏���d�宴F��w�//�h�Ev�=!��h���w 2��h�T�?)f���V�+�w",Q��Q-c3�roL�Ĥi�w.y$Q�c���1�*-�Ռ�w8�Y6���qSN�2��8��w:�LIQ�PbS@s��ywX���"{�.��P�_zwweT��D� �[$-U�
mw|�
2ߟfJ�J
z�e�|�w��|?��w���
�>9Mw�f�t�R�BF�R^հ�#\w��e��t}�Ͼ$���/}{w��_���IFǺ��H:�g�}w���w��3�Mh��m}qZF�x��)m�g!Y`Wq1X>M�Kx<kL�5gS.l�%�=^ax֡���� w��kQ`g��x)����+��8E%�_%��{x.��ےWg�Z+�|�I�x1��d����|bxr�hx3+C�SB�Dz)�r�s�xJ�
X�ȁt��a.����o\xKU��T�'�h�jD4�xM��� ]\6MJ1�Ë(c�xSm1 X�� O�MC�E�xm�d��q��=���B�x{[���4w������4���x|�!=�)��
���0�>�x�9��Uo�Ԁ�t���3x����c�8��3�I�=��x�V�,h�98�`���]�+�ux���_%<�%e!Yp�,
�x������j~9��bSXw�(�x�u�P|{�G��$��ʤ�+�xǫ�Z������)�O�;<��x��$�L�V��t$��8�x�z�c8	����ӋL��	;x��NqyN��)����c �0%y1�����'^|�h�PN�Jy �!/yov-�����G��y@(=�z��K����U�c��yKdbb�1�;�*�|V1�
XyMc�d�r�����GZ��ySq�h
�0"��ѵw��$yT���O�`��tY+��өyYPt�lS���z��bR��LyY�&7n�!�H��������ykUvӻ�o9;�3��'��yoE�]^�ObK�GW���y��v���ҁ�0p�_DV��qy��"�+�Z/<WN����y�(�J�̹�%{ϟ\Aՙ�2y��U��D���:0�%�:%(b�y��m�S�3�I������Y�y�;���R��{q�d	���y��j�W
>��F �DP��yy�0?��1,�D��_�8��/�y����)v5��߮A��cFy�u?��`�a���IЃ�{j�y��Ģ��gܺ�.�Kw����z����#��o��}������z	���3����	s���z���4`'#����xj�z�����3��Y�	Ǖ�ηڔzW�V5��iH&�E��R%Jz`���̴�O/�Em�����zd�	�ne�L��c�e]�� zs�/N�x���A|�)DJ�z�_a�{j�a<WOS�9��z����}b�6�Z��-�
��?z���(YƤk4
�
s��dz� �b��gY��U��%R�<�z�WB~rT�)��A�q�CQ�z�r<�zxH{�E�0v'��D+z�'_E�r~G�~1v���~U{Ǒ����a�Ǽ�����{��')ط�'��l5	~t{"}^���~����@Ɔ��;5{08�l�uc���o�|l�Ռ!�{5�v�z�Qn��2!�,-�{<�K7�}�c/�P����̦��{=	��隴7&�t6�G���{@�^]	��'�u+��D���{abY0��d]Ł���]��i{r��A	�����_�ݾ։{x1cxAb�"�| 5;����
{�����H�߮�@�!�+i{��m{�-v,�Z�l0�c�8p{��uj"M�e�M�S��c
"�5{�d�s�Lf�eCh��"�1�{�[T�c3N۩Y���f��k�{����m�ި�L�&@&#��{���Ѳ��l�5N�Nx�){�3���o���s��u7�ͥ�{��mh|�>ݖ�4���E{�������d��FCԦ{����"���9��7+��s|*"}�x��9���i��˘m�|�hڱ�P
�[-K��|
�,~�#�$�V��~F|A�N1gF�� �|�����@�)y{n�ԁ�3a�|#��d,Y;搇�*��cjY|3�U�~C�o��V9�$m��|;Į�h��9���Bo�Q�mI|<a�y��33�kY1&�$D$|J���(�$�䦞�E"�Χ|RÈ�zm�#s��])~Ǡ|WJ�&�������ylm߱w|^�o�'����;���{A�2|d-6?y�>DͤZ9[*�|hw��^���2 N� ��P�|nG�Lw^�S�!`����H{|o�<�1�u���I<#0ֽ|u3#�1�Fuk��u��g{|yҬ�e�-�X�	�|��_>ty	�e�)�Q�܋X|�Tƞ�#Բ;(�B5|�4@�b��d� �C��|��^^�D�KGS�D�5�|�s��t���\�X<�~|�<���t����D�Ѱ�]p|�4[x
�o��#YVϖ��a|�$"ΘV�N��y��R}ٜ�����P�z��F��	}201�\���zj��웬�9}5vZ;w�B2M�әIs�N�2}>:ݨ�����퐬y��}g(���l8�$7�H��k}p�y��AF�[P��򦆲}�>�?�X��ћ8�Id}�ʛ�
�C��4#_���-�(}�@l,��X��&SB�}�B}�m�8����,�9�����}�[�F�=�Cd�!��>k�Z}�agC	�Z턤�)�t��}�lD'ЋEF�!��ve��~��\=L�&A�}�ۓ+�_�~�����3uXG���S�O~���D�6���צ'�0��~W�x�R�gA�<��{{�,�~�)	N��L�߽�b�!jx�~'?YY��c�����ok{�~3���w�6Z�&=�J+��]�~>��?\��a�Ţ���rd%~OI�1��t���hV�e�%�~d� ʌ�l�ؓ���wcEf~�i�Y�l@��xZ ��X�"~��p*#���fN�,��~�Z�#a*|0�!�(��3~�Y��oz�x�G�[�~�h:l�F�{�'+���\4~ɒ^�+�a@�V����z�*#~��E�:�H~����2��~߯�7}�!�>O�3~*�Ad�~�W7�<:���7�n��~�2�

΁��TR�F2m�~���-�Uo8�iL�S
~��p�6)��0�ts��]���ν�
�k���G�����hK����۔!�E'�BP7�"FT���5�Ǻ�����C�.U�׈�OȚ���|i��M0�Љ����'EN�+�kZ�g:2�N
+�U�rx�>b���E�e���
�f�K�r��L�$&��m-5��"J|�h�	�8r��0ލ�c1��u2��@%�N�`B:����Vt;�ݟ�I�n�8��e���Ȫ*�-m�Cז��|����4r��C;�_�o�{����ϊ��DV����&_�w��.���EO:���]u���E�l��o��X�0#��S����W� u`8���
U{*����<�?�|����GY_�����WK�ӆ��м�:������_y��|$3���#�h2�t�ن�"�S��s�b+�D{z���j�6���*�l���'_j�ͻ����lZ�t�F�7M�M�R�՛P�瀪e�w]?�ObQw�q�\fÀ�&���#��`�Ǜ֊B�����Jo���s^cb�7�j����q����x�@�#������y�
��O�-xD��:�Ôb���`Y?���K������*�����O��e]*ޒ����߃��P��4l�K�~\6h_���y�����'�%i��a߀����d�V�$��?[O��F��G��G#o@�x@�`E���M0;	�Hl�Y��T9�|sHu?ԩ��I��X�^�ʁ ���N|6����r�A� �(�Q����d�F�P��"�7���֏�\�A�O��ư+@�J�Z�9Y��
)&U4�>�0��RP�B���HaF�J[;�V6���N&5�R�G������Z_-/�O��JE��;a����jO�����|=L#pzX�ft�j�j�x��G�o�<�:�up��8�>�ru�Z�c���!�I���^{���YZu9���n�
�T�9���)���p�T��F
n/;��]���ig��
A��>����M=H����̲9^I���H%{�CC$�\z��q��[��xҲ
��R<��vX
O���vh^��8�9��˞��l���S�JF������uIV��<DT��o��}*����(y�YHbh�<�9��ح�>�9�.�3"�т}�k�H��IR�RlH�=����^d�۪ouf�=�{[� 
������ס\�3X�E�-%"vB����)�L�k��8�C�a�kBւ�!���p�ւD���%)N{I���눌Q���QɖL}���g�'���'��w���S��
]}Νn
"%�y�'E����M<N��e}�����I�3�(�)�ݾ��肗�6�V�!0����'��%F%��[�B��ċA	SהbW���w����\U��7#�����m����_��p�C�$���V�HR[�$f�䜊�J6��-�%I��):�lR\es��~2�9#˄�"�Ⱦ�3:���,^�b�+$�pA���:�ȓ�����R�^�Z�^��!�)��
�kwE��Y+N�%?�T����K���$T�%��l��@�4�e�v����/��c���T�.r�ߐ�U��i�=��?b��@Ǣ�%����˃>�BWs���"!JV�Ƞ�C�D8]��|�AX/�C����M�9l�vO�l�c���ՃO��G&p���q��~g���l�TM�r:b"c^��U{h��b�>E�h]=)4����뾃�S	�M~�vm;1���e��]����q��2KO��η����%�k�g��Ã��	��k����8E����]��L�渏��2B�jȆ��i�e�
�m�ߛ�;D����A�Z�mC���$������ex�,��~b�}�k���gl���#�Bu�ȼ3uT���}+����Z��)#q.���l���I˟�ϳ~R׉�P��#5�����	��j�$;�W�'�6��3��H��\&F~҉�(��FVE	�6Ahpגּ��G��� 
xÎYb����7�U�i)}�K��1��?�3}�rv�+��A�zF�o4��}�ݔ��T�*����S$Ʉ�+�b��6B�
Ҏ}vsz8���tM�S�i7lA� �uC�o����I��;��L�iD		c���Zcg�[sǀh6�V�5鄸�L���>h���й̸ŗ���,��0�\M�����ͅ�����+*�W�m�yxI��8��⢵���ܗ{zZ/v;V֝��Ԙ#��xQ��Mo}ܧ�"iq��D	˒�%����!�h8����2�A_Ob��ı<<��z��x{�y�1����c�y����f����;�I �����wr�9`{��h�v�K�˅ ��K�!>��y�&��Ѕ=��Զ�OU�ȻI��t,R�KOm��'�pa;�ā��ͅi����mW��-@9�:����Ek�S�c��N�J[�����?��w]qFY�$J�����qj���p3��тy���p�i���O�x�|N&L�Ю���B`���
2Y2�a%C�����[:��~hl�H²�~|J���m��� ,	pb%������
Q�`�x%��X(H���7�$Rw�<�e{}|�c@�!Q�m�Օsu�&��\2 �+���pr�'�Kt��֐u_Sʆ0����+��2�ן���`�2��5��j���PjV;uc�9��O�9뾍�|D���ׯ�=�����w�Kk-�;�3��?(��.�ǘG&�ql��Ԇ?�^d��"1@4������@���H1Rr�~�w��ϯX�I�T��$fh9�T�K�x�I��+9���\��K�m5�c�%��Pq�/��!��T�o|c�#g��[ӭ��C"#��H�
�^Q��ij �״�A��`��/:	d쳻rSކ�
KĿ:�"s)���Vh�1jІ�4��V?��y8e}d��������7�_"�.�������p�󎙨�(���e���w3��gy�6�Ş�K��'[ԫ�LWՇ!@g�5:����������H1�ba�՗vu*#��8�-OӺyn��~����,�դ��+��ep6��E&�*�B�<��N*�
�!Ʀ{:�:!����n�^iC�����F�Ų:z?� ];�/H� �WHtR-�#��}r�X���h"�׎K-Ը��8
�=�i��p7�q6ѝ��Օ+ڇk�3�r��C�A�{Y���r�_efiƽ���ή���tF��I��G?tT*��v�O��t{s�����{�_|G�Ԅ���Y>ݯX��e����B���.Ω͵a�i}�U�<�-�����H3�z�E�qMݱ\GK�Ň����zj8�>���h��v�ʿx��4E����.-�CA�����?�m��-�u�pW�����1Oܣ��hML�s���Ո�dz�Lь�3"GK�=υ�[>��<g�7����t�
᫱��uxM
�k
�5�ֈF���+�u,/�x�'﬈K�z��6,��51�Ơ֯8r�S������-���,����U�[�
|_�=�~�����B�e�-�f�W�j�Ʀ�R>��y@�4HQ�!���A�?�Q5{���vS�n�d����ye��P��6^W8D0��)f��6ш�>��k�~���3��@޼���d�CNa�%�Ot�8��ٞ�������������
H|��9|31�\��ۺ����񙓳�v�44���k�8�ښ��JxyE)вo
�R� 1)����ƭٞ���`Y&��[�a��W�n�3���ۈ�!�E�8x�"��c�?���
9�p#��'1(��)�����p���+�`��g%k?��;�
��Z`�~�N]ٝ�H�|�¦q�U��"�)п������8*�fHEW��v>��G~��O�^�X1)#�Y��Y#����}�4>�n�D͂ݔ��������!v?��^�)����쉤4Ti���,�6��EfZ/⫉��+|� ?۷S^������xaaΚN���#��Q��|ۉ��H}`����;Nm���-�㷄ɸ6�}�H$9ۮ�篕����tf*"��7���g�:�����
#�뉭-%�1�Vj�橊�{'#���rg]��Y�P!��A���t�5����ut���/n.<��d�W4ە-MB	J��$��,�'e.�?��/.����*t���+��G�[�B�QQJٝm�r�L�3�}�JQH|��.��I8A�j>�8@ns47pG���N�s��<�#-|&abn��x��F����n�����NW�-�+�}=动�,�6N8-�]�
fr�Ϙ�����������.�i�%���ω[��aK�����,�C���5r5�ʋǦNe�y3��_���(��V��Ik��L��؅)����C	�1j�I�,z��+��浲���P%:����G�#�q7�i�%&���t��L���<�lg�H6{_Y�L�q�O���Z��M���o��R
�rxa��C��%��f�SaX�gֆx����Y�Q�W!�:�
O7 R�I��r���X���1�]�!��b���3�kl��o�M�槃s(T<�o
�0zn�T^��m�I�y����t�������Щ@e���W�x����p�(
�j��E
���c��-���9sϫl������|�t7��Ӄy���0��Uܐ�L�<��>_s���H��c�1xhEf����y���e��¨�M�m��8��������>i���뚅G?�^��ǝu��Q�qDZw�BF�����C
*�
H'(�0��W��F�����PW�my�s���ܦ���R���4�
,�'G4������o���/��m�V��Ze�_�̭[�Xwлړ�~��e�G�>:���F7f�-��+��T�\��j}B����<�@�
����	b�ms�JyM��K_�z���nz��$.i���j���w3st@�v��G�\�{�*��a1MH�j���*E�����-�).�5q)?��ꌘY\�����LAǙK�*-��ul�<���̽
F��sp���^��~��+qש��gᆓ���L��*����V��2�v���E��ļo;��N�Ӳq����Bњ+��>��PO���Y�VB���
�T�����6�=C0�!d�͂� ��Gk�f.�fIy��G�����
J���L���(e���$����lxYݻ����7jk<(k�u="]�\�Y�=>dhඐdb7h���s��c�=Y
@��b�E8�8����ʍ?+`�W�&�"h�YM�?r٘�n�nX�Fd����g�Lo�2�!�)
S��w6Z!�P�`���?�)E�Z�ʹ�l]�aSO�#��� �db�C�f�f]���#��&(2���K;b�gpֿ�[`Щ��Z�((��@��捀�Ax��j�8�(g���.�~M��#����P,�“�á�q؀T��'��J�����Of���`i�OdV?�nD���ҷ
ǫ�GO٫eF�jr������edK5D��H����L5P��n�t�EC����Jx��.T<����(d����x�s[�\�=�t�ӎY3�7�bh�H*CS`���t����FϳfO�:�57V,���C����m�`��R]{�����l7��"b��1P�]�2�ϻT|0\��IP��@d�^�� Ts&�4�&�l	0Spi�b�1VB�ki����/���*����2�j;��ۄ��뎸���PB�6(:�e��Gߎ��D]��"�v}A^RO����x
�P���<plW��/��	�5�4�����z"����	�{�PE��1�+�W��6�P�J��1�=�׹��8~��SUi@q��DS��$9Ïd�M�OS�F��O�c�f�!��%���H�v��;��Hu�j�-�@�CcZ��@���$X��� �'�8��U.I׃("ɏ�%L~J;f
��0#�����E.�V> �܁����>vр�W^�Q$��^r���ɛ򄸱mJU�aщ�t����찧&E'[�K�Z��۽����#O{0�P���n�]��ԏ�@�m˯܊W��Ѳa#����5���3�"�\�+Ϫ�b����LhX!��g|w˺��	5I���cle�}X��X���EV�@�,�]ӄ`N�xu��SP)ֳ䔂y*ZL�d�'�lc^���X���n�q�/P��E��`�V�~��yd�Ð4%�B�1�a*Y�:34e��>�h����˸��Y����?Ww�z�ߧ;�<x;7_���H�����I@�� !�I3�O~��|�o������y��UQY��7�^�5�p��ZL|ρzC_���N�����\\ `[ۇa����E4Q�,̐b�Ԝ�5n/ڍ�8��^紂m���]d�Ý:�Z��1��1;���VӲ7aQ��:
�������x�mcQ��^.'B[g���
/d�c%Gң=�[G�RP�.��u,�I�P���0�^[tu�j����@�Z\��dv�VX=%�
�����r>��a�efɑ��w��&�_MP{|�V�P� � %/��w>w&$sT��#3=����[%V�1704;�R5�&�]26t�-t����+7;�?G�3���Q}*&o0��SiܑJR���%sP��^����N,Ml��"���,�m#
IM��Y��}�+x�`��4̊>8��p��:ݧ�6]�)��Zy��x*#���.�T��=�(����*��o��L�^qW9S����g����[�tgk�����%��pR,{�N��2�[��K��I��6Ѵ���Z*��Cf�{��,��qƟԬR���_��GqQ8�9���0c;��q���;z΅�ΰ��n���Z���8]}�S��P���{��4G+
OR3��x��
�����Bu��<��g��(�a��'��G�l����t��#1�+}����ۑ�r]P[��ܒ/[<��d��*��ɧn��7��v�Ж$gv!�Q�F�t�?4���L��e���7=$��HH��Q'��]J�
�4�H��7���������<����m�N�G���O^ak��|���r4K+��������:�؈�ߒ��R�`�D)UB��c�VH����s\B�����k����-�����K����]�J��a5D�͒��1�%睛�؝|~ǛN֒�`"���
�#�9�+6�����L{n��ڱ@���Km�W�ߒ�*�~27��u��WT�uN�m��ʀ�J���US�\���	d����zdrӣ��ޮ��\/t,���;ѕ:�-S҅���#��vUm��ɓ
-+����*LJ�rl�O�Ǔ(�����{Ra	7cd$J츓,W�Ek2�kw��ѰJV�Ď�0CY�ƦPܨ���������So�<g0k�aDyx��x���y�G'@�� ?ݎ�?�j���_�cY��S�
�@Ȓ��w���3�$)���uj�)x������L�;>,�LZ�0�j��A&��e����E�][�KE�	/���Q��������<��zy���V���2?�d���dW���@Fd�30�����q�G�=46P��"�w��hd�����y���{ya���.��=D�"$� �p�������d���cW����k����?/O%����P?���??�
�-	��d�T�����'O��o��,L�l���.1� ��&U���3,`Yy78E�~�Ww;�&�5}�=���4�!!!�<�CeJ3]p<�y�`�.��x@��_yT��~B�Z�+��޴]��|���4���~�W%�V�?�}���fyP�م�Q��_:|����ܾe�my�	
�M�/�۔�{��?��c�y��/����Dӈ2~q���R�@��%i5f*_�^:���ϔ�)_��WB~��"^O�!f��^p�\�I�UY珢_�e����{FyD�V�7��R�5�-4��d�� 6f��*פ�
$/���J�7��76Dg�������?q@|l�<�����}�#`5�?Lo��Bxg�S~��4�6��:j�OW�x��⟟m>�d��7���{+���5�S{�g��vP���.���c�k4�{M��;�Z��#��(�GWԕ����4~67�JDqD{�se��[��ɴT9�
槜H���S���2I�9?ʂ���/"�Y���^���_�Ȝ��s�
u��ͺ@�̴��6��3q{�lJ�P���`�uFD�]c-��ך�Ѡ�'?y���'ގ^�`f�^��uM!�aX�S1�#�@�%�����X�57��h3.��/��g��H� �B�x��LˆGn�!8d�)=�Dh���%�kG��,��)��-�*�"�������:i�j��LPHf2f�}�M�~�v+�yu��AS��H���;�d�2�G�E������/�������Z�Gg1e!�s��C���DX@#\��n�p�Y��6�e�E����Z����^ז�S��[�ǣ([��ʏS���2���i�Ɨ�j�m9�h��Ŵ`>�2�h@h�@��w	��m��k��&\�@�/|�焥��F7Bw�" WD�������"��&kDڞ+��ڵ�f�Bz��js<~R]��o�s5OeM�򍲦=����
[픯��D���!�i�u�ȟ�姲�֗Z�#��/���|�m1/x�8!c
��]�Oj5�Gm){}�+�;���E
hX��-�����~�#�%l�X<�8��Yڮ��LBa8Mas{���9��i�sV[�0��q�߮��US�]Ea�iY�H*�(�_�]�lr��v��i�P�u}�g�R�Ņ�_r�B���h�jL�˨q�&����-��wXc�b.��kf��V2���+��Q]l4P���Q}����	���� �Pq&ԗ�O������u??���8�%�i��j�O��OQ���O|I_���P�}����ư]w���6�ǩ�ڛ��1��;�-�)�5CcpLT/��Rnenkgg�%��̥����i�sGe�ТV�hxM����UEz�b�#rz��/ϼ
�'*�O��������SC��,���^�I ��}e��s�0��q�J
J�\ډA�z��I7��v~M��4l�J	`�O�������m{�r����Z S�f'�����1&{0����:
��9�zG��d�;1>���$ԫ(��8�:��<ߘ�՛�0�ǃ'����g?��R��̓yEb)Ԫ� ʺ�����B��%[��ɱ�:֘�A�D���#�����g�+�f�A-b�˘ �4�	Ha/'^�Be�qH�DWəD�Oh�A��zV�o}����M�m"�[>aMb�:q�lܙR/�A��Jc�9v���Gs{s��RH�^��A�6
UЧ�:��cp����s[h�YGf�p�1��g���:���*���_$���o_hpڳ�G�ُ�����|�Y��(��=����q�@���"�1��:Y�[s�c�_�����S�^^7I�C�F�����.:���|��C.��Q��3����4�뱷�|�������&���OԖf;���NM1��_+'��xCφ��(qGLV`����Òb��p��*6��B�8��Y^���=6=�N6o}9���F)@�"�M�9���.����1t�IW��э�\�16qL���5�o�^�K�d�y��j���8ஜ<��.�M����ψ�W�X�9c^��5pgg]E��b�+- r�K��M���k>W���^�.�"͉C�{"����~��G)��9Ʊ�ꚛB�D�Z���R�Ӝytl?���ӧ@�Ê׊��s��4�v��O�O���P�w/�@�񆭚�ҵ�`����]�CP�Ū���e�=\6�^�q����t������/��Rս��C+��n���a������.F��͌^�5A��!R��YPD����pc�	'i�I%���8�
3��]vޛ����LO!�o���e��#�b
���w�U�R�?�.�W����N���­ӛ4wAm�S��?�]UrΝ�5 ��5�L'X��Uk�Co�Q�0;)�)����M�(&�\�\�t����bsV0Z^����b���vr�(�gN�F"\A#�d��zj'FR��?V�m0'˛l���
�>GsNݧ�����uI%9�_ ��e
Lb�T��Z�#�1�A��L�;�x��#��33l3f>�R�C"�N�Q��&9l��d���j��Qj4=��F�׸A8+�0���0�晛�l\���x�^�ifz+瘛���	�����
��^Q$	t�Pr�M��Cˍ��#�,1�Ž�2jr�w��Eh�q�F	�DF��O����JXϭ� VE�؛��;�VuQ�i�7�<(����N��7�RH]�@���6;�?�ǹ6E$lj:͜C_i���h|�9�Վ���W�C���lx��[�%�Q
�)�Erߦ��
^�;�טO.dm�G��/��
E��1qܜQ��!`�g���p��R<����W}�Rf
�3�a[�\�^J4��G'�~w��!����^�񶤘yj�աĚϬ��]g�,����Q3I-J���ߜ�b�=���2���Z�)�����"�-Đ$xe��l-����Dr�q��(՝�~��[�Γ�D��!K��=�+���<�������	Iw�圶^OE��M��~U����ڜ�}�#RM�G1��"/�Ų}ܜ��D֍����Vɲo�r��N$��[;�
��tg�Z-��o����],V�"N|���$i�ʠ�`���,?�w�7�Ɵ�R��x�]�M���HA7�S#��S��8w��IB�9�r�,p����T2��3!lҴ�- ���W���mG7����iN�Q��4Rr�'dw�V�H�!��(ȭ��fq�-OI�Н1��Q\{朆溗����y�-�K���%3d����f�k�9�NB�c��훹�G?f#�9Z�U�y�Jpk�"lj����몝l�e�05-$wr�>�WB��vit-2��
��>���t7oÝ��9��N>^j�ܪ$D@�%���������ޒ���N�R�2,��B��N�!��Y���/�f��o7~F���x)�B#q���eaP�:�ic�|�0oy���r(�E\�Dx,����@��jl{f4���Ֆ���h���i�b��6�,�y�s�^�-�'~ui��ljzC����T�(�N2�W|�kUI�d����c7�À��:�da�뫾Ӟq����/{.b�(_��\�g�rNu�DFt���3B`��2�yE�Q�7�o^��9/oiI���y�O��,��ӜѾg�9�}��|���o��I������̱G�3ـW9Y�	��Y����;3��<�Y��߄V�ݞ��@7��L�.a1���e	As����������Mi�u���,4Pq��z��s}F&�d/���WP&��~���T��w�:ТT��$��b��W!�"�:@��8���V+-������@l������87�X���W��*�ȋH��'��>��b������9}�P.��|;���б#-����Ÿf�F�9��f����'�+��:�n�����V^x�љ4����՟~��������cY�����D�ݟ�XՀ�*�f
�`�z[c�p�r��򓧸���FE��v��P�|����K���WK�h��h��[��.�xz�5�tIr\`�/s��w�m�_�[�M�bi�]��M7]{�\SIn���m�)�0�O�ڔl0i�L�8_E���
��Ȝ[[�K&��o-נ$��t�WED�vw�~��F�b�&�øOp�ߢ�}*
C�#;e��,����:t��D;>Ӎ�.v�FY�A�&7Ł�lA�1�3��N��z��Z}�5Ph@�e��:��OL����?CH%oN��?g���O{����%��LG��F���?,W�ԠnwTt���Mn�M^��	�S}YR�HʥD���P����
1(�w&'}�!��k.�K��b�hZ.����r+�?e(a��UX�\Q��͠x#���ɰ�s���#��-�{��!q���Zec��$뉾ƻ�������0���J�}��J����:xۧ/�zl=�Y��6���M��F|��L�/~ho��Nҝ���ɶ���������0�GA��(r3�:�U��EV��E��b�,�1�aNS�7�K�.����ZrF�X��G�9�^9в�A��.��kT�q١C^ުF
"�ҙɜ�t�5��u��|Ay�B�~���&��|AB���a�c�&���*�M�����y��sr	{�iN�K�����N
�����t;D������ܒ��<8QLrrM~\�+c���Y:Y~[mN{K�A�&����
��K����3Z"��R�$7]V��p��Aٜ�8B���O�'\yW�$c���	��
s_p̢*�uy� ��%h�׸��,/lv���OeA�v�•;̢.���,�'�m���O�1MaI�7ˆ?�A:߸���`�ǣB]�`�;m[=:���m�c���UJ�b~]�m��cyU&���cbN�|%����P~��Ϣf����:�z�]�^K@��pk���ρ%�A���vh�8��}E��݀i!ݢ\������tvL@�Z|����
/{s��%x�Y��z����'N��
ٯ�'!�J��A��1�o_�x�i���kfQ�ɢ��>x��To���
Xfߏ
�����n7ً�q�n�ioo�S��$)��m��9��9U��/��6���[a�n��jl=]{ߢ�粖�ξ'{a����E�76��J��~�������������ڞ+�H.~6�T�km�*)�ɭ����ڬ�a�g�dul���w@�ܮU�7e���^8���K�>B����X���O����sT��=��D532�b�������=p-�N֨r9ƒ�����ˤ<rc����n��'�������l��4��&�0Q�B҄_��L�ХM�C�Y�?v;#:�� �������g�O[��W��11��ܑ�ڬ8�UP}�N��=Q��a[��?��٣]�.+ы9U��L�4���'�^�=u2�Hb�m�Ȕ*���j�ڳK�Q�|�oljl&<�ߣlk������A��5x[����o�G�(�p����,c6X���BF��O�z��$�V��s�Ǡo�����m�#��!yS�ݘ趆��p�q[ԩKTɡ�s�䗛X��G�'p����d��B��c���H�uZʱ��X�_�a�A��F�]�����W�b��j>I���E��
ڲm��"1)�j{n7��g.���G����@R+D���r���Qc�@����2�뜆C��U5BX��-w���q1[��]p��zd��^:ȷ5��A�d��"U?���L�)�����v��C�
��H�������:��4���D\$z����9������f˄��G���Dd�X�<��f�83s��g��J�X�4l��)�%�k�x���!R���/��A\G��i����{'�������TO�j����MQ`�1G��U�K�8I]�*�p���}!���Wz��2'w�K�~;���7ǻ.��Kg��P9H��L2p9�����M����0\�ŝ�@y-/j�q���ڇ�Q�H����I?��|�@��fE0y��1�U�`=�����-%X�;ؚWA '���³I��>P�Nf�˱.���'�i/�4����^h����4�eyU�{�u���6ٍ��+1��������ĥ�:�|�K4�>
�Jq��cɎ^���^Z��צ_sՕԥʑ�s#�T8k/�Y
��N����
н1�����q���l���O�R��HWd���O9�?}ͥ�0�E����YI���Ť�mg��e9&�@ve�6�1݉�XF:����k"����;�w��P9��	������/ms��Gf�v7���)�_�.�I��U=
�,�6��*����Bv͢���9~�ۦMvEΟP+@��3Ӽ�.Z�M�9���{k�j�_��7�E�T��8Z��S�^��:��\�ul����A��2�U�s�'eRP���A8�)��'�|�Ŏ�ܺ�M�i�9\{?L��[�T o��ǪϢ�a�b����Õ}�#��	d���7��4��?�n��aw�n2K���	K�O %ۯ��ѯ�c��~��.�K��fV�ST�Y�X��ő��
�λ���6��:h���a1������NS��Y��)+r��S�9��ݽ�������1M��­|������Ȱە�(��t	昦"�
@��[%��Ŷ�T���Ԗ�k��>DA�0R�(f DQPQX���[O:�O���Hr7�;�尦�����Hq�R��"�.�j�*���tD�fis	�	)�4n�}�:�R�/���&'�>`§��4r���P��X�}K7�(��I皗1UTj��)F���4&�px��y`�R��d~��Fso)�m:�>\Q�$���K�����C�簶?��P��f�K���|r4���rC��`�c �O$�7�Vm=�HV�o��s�yu��T�=w�#�<��F������Ro-���K��E������;���Z!wm�O���	���_B�~�}m��|\��Q�b�f�V#z�g������+-F۠Zʯ�0�3�&-�ǧ����夒p�����2����9�R��۰'1�;R�����.�ϷΥ��g>mW�.0�� z}P�@�I�Ռxp�0�Fa>��j���g���s�2Oo�\S|
qYg��5+�.Ҩ@k�����6=m����5�W��}-���j'|�?�#��
�b@�|G�GŰ��}��k�27�h| ��>*���B�������j�	�?vʶ ?�A� ~�i����%;$���C����I���4t0M��� ������,���ɻ�d���z!��Vv	�ȅ�c���εC�׺<���bA���(�g����0u�����Y�{�3����/?K���t�DǤ���
Aʤg=��(
�:�]�,����|+*ᱍl��$g�k�F��hO�������¯�O�cD#��\N<M�Nx;����f��7�;�/$�([д����g*kUc��c
�*`���so$�h��ȩ�Id���
VH
G���qD(84{�K��F��3��8�y
5�ʿX�N�q*��:��}BM�8�k��क़̭�|���yR�3o@N$���VTp�����hY Rf1zm�)�ǩ��)�Ξ�b�1�4;ta�HF��(�+�U��S��XȜ�ީ���Q�m7R��0'��SmZi��3��^>	�އѸ����ˣ�Ь�0�a�9ιl�\���0��$Wݲ���-
���k�܇�*O�d�FhT9�s�y���v(i�c5���1SAwD
�MZ����ȸ��p5L_��["��A�Uoo"�e�z7�"'�K��@�9��Q�����;Wn�`jJ�[y��[\ӉG$�;���b�����A��:�NمuQQV�r��rY��2A�٪R}M3rO�OMbS��R�w�SYZ��ś�Z^��J�'�W��?�[)��5�-}7����Ll�4ƯK��8�6�_H��E:�w��pZ�9�9�b5��Cy�� �ӛ���nP\x�Ҫ�}9���,��%�	`��番��CX�teT���-��~2�⪵�4
�F�D�WG�AҤta��ħG�3��
��˚�`����6l�T���%��8ԪLj�*�h�a-{�s=嚪ҧ�D����^Ŋ���2Dk9��k^�K!W%R3����>Ҫ�f������`][����l|��P�77�\� �/�
��д�8�bw|�L��Y�/�D=��e3���O��P� ��$�!���v�o� �YDNMm�Mq Y��ݫ#S@�a��_���A��v�'�����Z�%D���ɞ@�.�s1V#��~ī�Q� V�<�,���<����e�KykI�V��)�Tw���a��g�%.(�[?o���M-�"s��K4����k�I�}Z�
�9�v�]�O:ޫnd�̓P:߭��Q6�-[;ȶ�o��s�&X�lu��~&SAQe�x��DZOQ��k�Oj����z}�̱������#�t%��{p;�<�g�ws�i'�v6���P����N���6)�U�t����0r֐>:׷�=��-��΅��af��ru������}Z���܉��#��Y����_�m���>���,��[ѿ��2�,{�h��X�G�H�u>[�Ӿ0Q�%�I��B���.�H���v�0ij��@������˅?A�K�?bd���.db��%�(iA�W���@�$�U�s�•�6�e��!�BU���bHɛ�I�@�i:���������dD��W��-�4*`bϗ:�]9�`�����7H�ޝ} Sp�N�������
�M�@��^g��I�
�Q�T��͌�(��������B'J���I�V�TLK��ʩ���sS�K;���l�״
��cp���K�xې���H���!2��#F��n!D�9���P������֍���%F(:�"��1�s�����uDǗO
�*��ήÿ.J�������8�K�6Z��dr���	�A�[��G�Ë��Mq����K�
X����/�Jw�h�x�O1?£^8�ƈ���2V�^qo��,B��fh���.[d�a
���i�٪��K`
�N�a�u	���e�[�ǖ~�C�c�_,���\k�r�#涿ݙ�uZ�]��
Z�y�J��Q����,�Pt̰g��b&˚��׭��,�����z�}�n�V5h���
9��-V,�,]`�ɖ��b.��vI[H����ǃ��0:���:?��� �_ԉ������+,>ԏ7ڦ�	ktȭġ(f��v3�i�G‰�䖭�H�'pxv��8����V��&w��cN��
��Ms��Y���:К��\�|�yS'�:a��C%]���8�z�A����ґ�6ͭռ��'��&��;�5N��d�@rL���?o*G�m"���U3�n?�9e�T�A�����ؕ׆�	�'��O����UF��^f۷���YQ�&b����sp���G�?�{u��M�f�g��G͎jεB��Q�)(z��e�
k[��iֈ�R�4C�дE���E�(�~�=z��v�u��n�F�*���m��R��χ����^q����[�|��V�F+��B.���򱻔M�0�ny�k��}����s�HS��+��u��ٟ�:{xG��i�֬���vj^�
���Q?��a�3�T�����&+l~�ıC����@jV�dZ����'�;���$>��/`G�$��`�+�".��p�7�X$Qʏ�d��(�/8qMm����1�%#�?�ɓ��l��w=Ĉ��W�q���iy*�]�&�L�w�1�_6�|��̎�������0L����J�������R�����޿!���������hǯ��<��Cːk����+n4Cد�
<��L�Q��\�0f��%�ٵ.�8`�!�"q��z���rG�h�>�ݟK̋��:7��0c��*��w��pBe�p�6���10ep�mܵ�Վė�i���#��6/|�IBგ�@��7a��S��� �P����f����q�F���������{zrM�V�ӎ�?+�*O�!:r"A��떰E5���MX2[��ȦD�ݰGZ\� ���iU�;��WL�	(�� �����	�Zg�����
�ЍK�`���d��r9���RᲷ�bk��gKY9�Ot:=Gg������k���_8R�s�,nCs��[�u���w�2�:�?�l��밤�[Ե��G^z�m�W*���/�Y>7���GF.~L��찳:k8SXu�E{�V���IS���4�Y��_@�2�4���j�B���,�IŒAW��Z�H�m��{yx�*�x�x�<u��>�Gj
�#x6���d�q��3�ɐ	��-�D�w���5S�򧞓f�.pKԿ�!��Kc��=W��V�M�>P�@�r�yS�@�af�6�zݽʱ[Z
H@��ka���J%`�h�?A�	�
��oBz��K��,X�n�O("�J���@��9���Ȗ^@��Dʰ!����9g
�ۼ��9�	�s��frœ�5�P�%Y�S�"��S�q9o?F��H��<xLW�����B��o���A�V��`��:7���\�`�����@N��ߢ��B�.����~��a���P$
BZ����[s�b�����A�[��=f�
$G)��Ȳ(���9	��qf����o��9`,�j���ڼYx��滧w�:f��D�}��7b�m[A�xh}�E�=O*"���%�di9b��N�K�5]�ۥ²�L�*:�Z�W�b~K����P%X�m�t?��fqMB?W��,�?��u�|r�s�ND�1{��ni����z�t۞1���(%v��8�������-)%@m�G��$^�I���ĉf/m,��n'�,{�@����o-O�Z���}�в��H���+��.��w��f��]%�i�P8����T��Ƶ�Ćh����/L2g�߹\��gڵ+�G5���[*"�-����;o�{6s؊ʑ����%��
!F���+�W}�FZ�z�l
$��:��+��sJ�"WK�M	G�o*�(���ǻc�4mOG�F��3s��Ϳ+���7�H|�C���AE�o�f��n�RHk1ٕ�i�NR��-s���ݚ{p�v�������;�<���;�pA�0�Ya�njJHF��)�Qû�6��n_)�Es��"8��m�����Ԝ;߱K���Jx@)�i���N���Z�����DwRR��y�B���:Y���l|eS,^C�
�&
�R��Ҙ�����%�� 8��7z'��ׂ�Z��r�>+|��r���[{��.�������?��`fd���xJ�`L���J1z5���a%��tđ����y[[$6���3��G.�& f��pN��ߐMߓND���`��{����7��6]�^Ռ�S�� �|{t�jL�C|���>����r:6�S�e}bnԍ���� lQ�y7�=Ԕ�u��5�
��o��F\�c�7���b@L+/ִt!�c�.0�%��'1�Ic�����zeŒ�X(�#�T��M9.R�.'���mz�'�Z%��� >�r�8cu����dk&����͚y����u�1�5:�$����jA�)��L�ͤ�h����ٶ�u؝�B
א8g;*�t"��B�뚟����q�R2�>8���	``�/�cM�cYZ~�{����&��a��j�t�"Y��5��Ζ���������]D�����opٷ���w$I�䦠�-�5�Rn�U_e�g�_^�5��r�D���o��!iT���7������^Sc���W�ߡ�;���L���Kl#����1�>r�}
���h���
�=��K� }?iQ�}�u;�&hᔵ_|(L�T[�[��
$i3���]ӯ8�]LDp(��MH���\'4,�.�d�Th�a���\�֠!S*Κ�S�½�$y-���S�(|����\C�A�o=�L�Nj=�|�k���yvN^���񅍌��{����E韀m�����=e�Vd���P�ʶ���x�#,���9
�A�,Kx����M�]��|��D�8�y�Ka"�j�R�P�l�X �K�Y	��
Ylڴ��I���g�M����ƅ��ν��]���Qu��W(
������J���_�O��/j��N�܍�gIt�~������Ȯ��ݻ��n��Ԉ��壝u��ra��p<�t�
��{��H\R"��/�����>S!��
�������\����h��~�|����L�Y^���T�zvȉ�q��P'����=��f����`aG���T��ك���p_Q�f7�$q߆3�z_	��A�yI!�O�;�ܛQ�Id_��!��=�]���_)�I�&���;�BRj0��xa��чg>��fA�����0�'K��)�=?%n�G�K\�dkx޷�i0�G�?	�;c�����Ie�x�U�YS7�tSү�7�V&P�=#�P����;���;疗�(�F�@p��Sġ̷Ja\�|�6f��h���J4�Q�FL�c"������	�xv·t�}{b�i(%�mҡ���|�7�a��&4~�������^�@��4�82!�<�i�X���5���g�u����h����?��� ��hCP8�v���(xht�#Vy���H�Rc?���U��P��slܒ�=���NJ���7<WV�:R������q�|mMn�L�۹dKk�������<�YZ��}�$������J�[~q��
�c����;�7to��b?���_8�����-���C�&�_,�`e�%W�\d��勘�	Œ��l��L�¹d�L��z�Y˄�q��m/��g�dr��5�%��rń�ō�4���j��Ÿ}��5��*���Tn��@J����%?�XS��?�&z���r��|\�c�i�Ѭm
�$��<�)�J�һ�������X�N���Ѓ8�#������M[=;��WxO=.GN���{��o	4!�1/3Q9s�$��̈́�t���;S����_���S�a�D,a�\�h�.�ӯ�5�,m���`4Feg��?��5�θKͥ�=���$��6���PJ�Rv���K�{�D�x���W��tm҈�1� �u����/k/R̶�k����6�N�5C=��j��:���ͣ\�Ϲ�jKeհg�V���6DL���{�-t�Ć3:�`�e�Q����;v���5י!տx�d���''90U�Ɂd��t�Ew�˄�p�G��/L��o�"���n�}vJ��?x=��������[޻ʟw�����t�Fm���h�`&�����M*�@��i�����L�?��v�`�J�����c-��%�!�9"6���9Ӑa�/XM)٪�%*g-i���G��Һ/�JZ�v�*|N��)_%�wY�G�Q��Umo�p���N��af��Ѳkicy&h�np�{��}P`/8qA�#u��J#;����a�f��>�}S��e9-(�;ߪ����$�����*̠U��4��˿�x����ҭ*�c}���&�VYx��z�"�Ξ9��f�zTY�غ�l�j��	Lt��j"�43&*��w	�n�����ۢy沐���GRP��5�.ĝ/���ܺ�@�E��Y0�͔���#%_���6<Rw�;��>O�%�h?���i�X֬�5�8�L�MV��)�T��-�~�Y���1���������p[>�0����<� #P��H^��rQ?T�SDѻ'C�t�"��Jr$�N�8��1c��wPs;��(��~FʻO�?S��s'�P4�΍z�v��dV}���7�r��!J��u�k(Ǭ%�릿�v�ejQ�]Z�tV�A�q��)�+2��v��~�xk1hBx����d���ٻ�W���������<M��&����2Kw+̾�Q5^�-͌ɻ�d��t���}-��c��,���;�
GaJ���si$�{����X�+4��S& �9軻EPj��`�.������M3��dT=��z��	ԶU�O""��Ʀ��am�3�����W�㝞'�*�����}����*?4�\F�C�z��VT��؁R��љ;5j���s�6����\{������ϻ�	|=��ob��~�TP�JՔ׼3NZ}�2	Y#�6�}5~�@v��h��Њ�w~��H���⨞K�
���߯A0E�<Y�!+>��z�s����k���/���u���������J�%��[�1�#��,l!3�kUɽ6���Au%O��&c{��~0��M؍��"��(�8R��4E_!G{�����wҢ���5@?N|6*Q&
Rrԥ�A�7���d�d5�q��Y���mY��Y�fΞ��Lp�h��Q.��g��2�o�-@}�<�� ���*�{���*��(�ݹ�+�)�(6��U�����SKT:�(��?
��AJm�b�
{�8 U�G̃�zC�63霣�d�8"6�0��+�ʖO�G�Խ8��㳒��mU���QQ��<��@uci��bɆEˁ0�n�1�C7�h���(;��'�L�H!�P,ek�`o�F�Sڈ0��}�T����ʭ秂A�4���|�Z(���e8g���W�n����m{'���t��3�'f��dY���/8�A��luZ)��;��ȃ���sk�+��Aj��󽄯�]�%��0���}�	���/Ai��HDX-�#%��騽�䶴�~��^��,�P�����lZS,X�Ȟ��0�4�e����j�gH������枽�����O:Yw'�X�]��u����B$�5m���0��c���>����K�^�G0�rOc���|ӽ�hG8{:��W�n�jRnǺ���2��W�̴t+�w[޲�@. ���]'r��|R��볔�M��/��dwi'�������#�@���~Yv�He7���W����j*�?��:k�.ZL�w�0)žBB�$��?־�<j��/�T��&gR���,9���z,�T�D�\��٬?:̊𾕩{>��k)/Z�|mu����rŴ�
��;�խ��5C|�Ĕs�O�J��#v5Ia�s��wa�nۀ0�q�,x �j*p\�̻��3��x��[v�q�G��Lr�0ӭ�*{p��������(�
��f
cHl]�L�
�R�s�U� �n��O��*�����`����-MJ�ヿ?�w���!Q�<)�.^o�Ly���<SE�e�TU
3��R!M���F�Rf�iǿX��G%E��`����{|#�b��-ZxD�l�m���v�β�d��g��y���f~���ȿo��,,�:t�İX�Ć4�y��t��B���ƥ8�FE��x���*�r�k����^GN�;e�����_vSG?��g�g�wv��ybM�L3[1��0�&��~��Z��ā-'�T�l�oͿ��{ʬ:�f�r/���ǿ�Z��*X�5���3�%�$薢��O]�5�r����k�K&s��Q�ư�_�z8�$�j��;����W�_��%�R�\#�����G��H�3N�Vc<`�
�On8\1�<Cv�6� ��G�������D�9 �4�~�������h1�A{�4���������S��A�C�aZ
��՚S��U+4�NM�3Dw
�?#
P5p���V0�2��H��з�����?lbJ���	��NL�o���ͫ@2��"�LyM
&��B
������Q�A�����e#����]1i�̂m]_؎������(���w�޴O_M���3��~�?��CQ�M�0~s����꙱9��\��R�H�����31*c{W���iF�	�%��������(��
ߗ+���zEӹ��H��V��
����"��ݤ�w�-%��$�<�����'��qha��ٹ�u�h*L�~+���<��&�3mRvr-e�������L�%)K��t�6|��5�%w�-c�����ZD��*�AE��;SK�Ъ�"�:
�/ݒF8iPΙ�9z�n�d��4M]�{=�vWC���z��B�OwJ�9..B�z4V�g�S��N��h�L��e���j��X��L��}!��L}��>�`�$?���pG
$!*;/��h�p �k�y�"�B�w�"3�j�@�J���,���'.�mM&�)V�u�$� L�PM����bS�oK�.Ɲ��i��N����q��gPW���s��������׷U��+�K�,��������v	�ږŎn���������_ڭ��7��2�s��J���]1��Dp$��J�������nY�]��0����6|Yg�Ơ������?EU�4�������}H���t룷*&��T�J�iI�0�k���
������(�@d��Q4Z�����'O���O���Mkz݇���>�|��} �-�9�.,��,�<=�����;�&b�̷���%C�/ᢅ��s��Bɻ�ݖ�<���vj��-�1oŁ��4�O��kN��Ҥ��eTr��Y��y��F4x�(����ar�Kr�
�5��~6�NU��I�b�C̠۬��ו��3e�{��]���r�Noj�Pn�n�;������:	
��‘�o2J������)2O�6—�2��*������[d�¨�S�i�?����_k��¬������(�^B��X j�­����V����|f�����·Ī��Mw�����PO"]��·�ε�#dY�蕲�Q<�R½��e=�Y">��EV5�����{��T��h�:�o�i<��ِ�np��s'����m���]�;-�uvW�(�f�55��m�MN;,���b�&�<�f��lS]�=f.�s`>j\�����l�}>�>��Ј�(��"Ps}k�=���]7Q��^�x�# �m~5\4C	\+ڍ�Ž�ǥ�Pj��.ܺ>V�]H�!e�\m!�!��s���U�p��,rüٗPT9~���΂��-GEO�O�i-N�
�"����-L��~^�ܙ�¯��>@<��3!���"��߆s���
�=�|��dkI{t�9_�9��%�?��CX	tdl��B�3X4�'��@R�L
��~
HX�P?s�z��@�p��"��@D�u�Ё����B6�{���s��]�&�C�W�^m �����#i|NQ]��la׌���z�id�W�}
��>��ޟ��W� 6�Àok�1L.q2�y���É1�i%^{#��!bԆ�Ë��[v�I��N���aÏ��/�vBT��dp�#C�e�Õ"R�b3hÐ�+����K~æy)"P�+L����~gqU?rè���V���";Úh!ë��,�\�� 9���Rës��UM_|���n7��+a���3PHN�\�]	����{8���	'>����Bv��)�lR�!M��re����q5=�`P��$I���ݮTm5g��Yt��&
�ڄkk0Q1T�s�v�-(��$wq�<���3*|��3,��`Tu5
�s��r�V��?>�����u��coj0��?J^�6=�ʿ�{
g�A�K�Gh��"2'��>������F�u�=E�>&��VC��$V��Ĉ���;��E�ǀ�.#��+ģ2��fZ/�}X��K�(��^ģ�'[h`FH��7p
O��ĩW,�M
�6�n9bQ6��ĭ-�à=�s�u	M?��Ŀ���{I'�^�)�����{H7��'�����)�[�˂U��a<u���ds�*���m��
�I��?Q�
�c������.wH�ȭyq�k��*AZ݈�$�"ޭ�{}�o;p��$��+ULy�͕o�X�酂�ܦ����1�����w�ҺuZ��A1/�WIѮ�/�)*�
�=��{��D�7qI�[dK�dљ^�Ku��t o"�=�L��vE�|��utB��
)4�{�(.���A�3��|�ŕ�B��q���W��9��bŖHD��ޝ
���Գ���CţQ6��UB[��V�>�bdzŴ�Ď���M�F'ьŷ}r���K������L)��xw�g$㶋���]� ������А�NNM#9���m���QK	цS�j|ڼ��-ьƳr�R��2���Z#�^�L�1�x
7�x��l��Y=�ey�!����G�<<F�Ɗ�����M��b���F���Ǝ�Z4WB�@g���%C��4�Əi\ER��l��˺�ubܟbƭ8T���'��!���pJA�I��j�>�Zow���NC�7���1��==�G���u%قZ���qnNՆ�K�J�!s�c�g�&e�T���U!�YK��Q7y�82��,ޱA�v��~B��;u���0n����]��<�1�?Dt�6NZ��U6KƁ�J��p@��i��-/���Qj��z�zG ���_�r�[_�J���q�3��&ꔶ+��]l���xJ��t��5U��c�8�U.�rj��^\>���{�[g٫W��`4�a�U�4Ǘh��"�)N�#���UI�7Iǝ0'A0�%��G�Ǜ��`�+ǟK�a���7,�v0zjK���Ǻ����g��Ej���������íE�_�puvv�����	n�}���m�f	�M���7���$GLP�� ����τ
��!��쉗�Su1t��T�a/@�n��]a
|�=��tt��3���8�h�E�Ҙ>���ƃw'eb��_U�qtzQ	��<�|��L�eݔT*wa��˜��"l�I�jlF�sv��bg�|%�,˝�q�/����zY9p��w�t�J�:-�/�MV*�w�ȑ0Jw��3c��m�-
��Qȓ����c1�/��ot�k��ȗ�����?c��;���r3�vȣ�	�+z��v���!�5�ȩ��
}n�͎-��UȳU
�!�����0�.g8�p��a���7`�D>��t����a(3��}Ջ���.H���ЩŤ��Q����� ��U��r$��ҏ���s�<�ua^@3��U��t��d�Õ30W����R�;0?�mR��8���7���:9Ɗ��!��U�t����P�yBÎ�L��y����
Fj�e"Մ<�����P�.��=|J��U"�:a?!OO��p��u�A(D	
UtGQA�'~t�ɃR係�U��;��ɵɈ��ցS�<?P~kʅPHqIɨLX~X�8�1�"T�>������|��T��h��Ȳ�m��ҋ��
d�ų;~#�ex�J2����m�nof���9��$���M=��U��Da[��3�_okP$9��B:���4=Ü1��D������/���4��.�Ǣ��L��jz
/�]��E0��L�7@����H0�I&�=�p�N���JO
�C�S��*�ه��E�eT��qZc�W��Fx��g�NQWkC��`v��ꏌ�L)<���̧�e��g�m��V�;�B����`�i�A1�>O`�����k>���sښA�Ձ���{{�y����zT'<���{��gN>|"�иf͑qDʃI!���Pu-�O�®
[aʅ���hC�x&�P���g�nl6ʩs��R��4�Wv�*�f���ʯ�����6-w���	K��ʺ�e�b� `�p&�%��2�Oʿ�wu(@2��&nPp�4�ш�8�4�cy�BV�1bB���RO��5qsN���4��1��b�C�/o�oX��S��O_Ix�Id[�AM5�*�@Ln�/D��Ls͏�i�T��M��}���P�Ǒ=C:�;�x���TZ�P2Mu�Šs�tCO1-�P�\jAI�
���4:~WJ�[�\�a5<PM�S8Dd"�u0�a�T���!�i����xهq�kU��\C�=���ļ
.H֛�z|��HFz3��Õ��O��{��g�ԩ�u�d8�D[�r[�˗��0*:K^1ᜯ�7F�˚Z�� 5癳M��s֩��˚�I�V�i���.~��˧i鴑��$D��g5���-�V˪�(�M���,�z�.X~��Ė�f4�䭍2JCx���B�v��#�,�+%gɴ�;ܡ�q&��p�˷��f[���f+����L��u��|_����[��D�%���� "�]���I��
ر�E�� � S����W���C��/���ǯ�����_�3�}��K�����+�� {�c'���/>p��"ہ��V�wC�m�Z�',
m�-�M*;�fc�y�3���%�5RW{�s���kL��HYz��E��K>��{�EĬ�}�E�4aS�ӹV���^doW�]�6��E@FI�}�'�a2̆{
�Y��3:"���]���̛�n�";�-S�a�4�=�+�̧s��$�Ng5������2̨��~(����!���̳�8�MZy�?�O�-�)̵q��;�7�0���3l!̶r��`d��}ͨ�64�l7����d��}���j�FO���l�(����h����w,���{�1m�A�Pcp� f:�:��a���C~�$%�6������\������b�[��|�b�x��j�GK"S�%/��T��mw�N���+�L����+���,�0����a8����5�'�!y���_�t��;�\�a��]�}��o`�)�����f��;�'��}��:� ����vC��K����憬"�
��v��-Y�/r1�|�G��Ў�͆f
�b1����t}z�L>�͎�� �Y�Kdt������ͤ��X�&Q5XM��L�6�ͩ����ή��93����ͳ�J�0`eH�tZ��8=g��;�c��@a��Y��S*�T���D{f��g���s7�
�ԗIhG�Kr��]�a���„�V��AK7�O��.��-1ǖ����"hYui:���m��:�v�l'V&<Fn�[���M��h�"��G|ㄯ�����*Ѩb����Р���xQ�${��Y�7-T�Z�[s��oj���#P����ٖ��!-�g�V���o��߰���5Йi�\Ii�'©�&�;83��@,y�m�����|�<��D	H�,�Q���k^��>�C,0}s�m>�k���p\���F�P~ij�H���˸�뿼�M1G1O�7~{�#\��?�M�E^�/	Jrz�Vc��'/�;�N0�^�ܳ�!P�8� c���Y�#m���&O"�+݄ć�[:J�F�?�S�R�".�ْ�9Έ߹6����»~��3�ΗW�%a�p�du!�$Z�rα-O�,.��:�ձI�/�60wιN�&k��ς�#�Q�B�ο�v�*眉=/�F�YV@�g��5���K�8��\��v*��$Nl=U*��\,��s&	���8��k��G�/�WU���	���U���o^p.������HPl��onjl��l�P�S�axe��S�큣�p����[���c,c�zo��Q��r�`���P��jdձ̹
�l�bn�������=�"v6C��^�q&����1��Ի���a��~ץ�>��R�dqg�g��πX[l\�_^^o��MᲹυ'�򟦕�j�&�dn��ffϳ��]�l��я�šQ�0������3|iN?�3)1��%������V�� �h=E�\$]c���{L]ө|�1q�rk��-7��YL3��@��;B�8�'�޷�L�zDc:(E��z׎I�
l��,Hv�����4�yn�"1�#L�G��<MB`xt>��Ҥ�0���0�Y󭵩��.��'�6J��2��3�*0P�GT����=-�k�|f�J�aX�p��&��@{��I�Ɂ�L��P�kT�HF��0~��~���DL���e�)��ic�v�=�@W���f�
R� �#��Cq�D�C�g,_~%�G����.���w�y_�%�K�D}�9;��Мb�@R�VN�(	�oK� Ы��6&1i`�SDNzk�T˕���L����C���K`�E�����Pb��a"%����K:Z�S�����;����(���I��߱�
�A��<�Vnh����E�c��en?�s��̛�&��Q[�ԟwv�֒�6c`�,��'f�۫
���8K�φr�+̃e�h-����[0���
�a�K��$�,v�[oW��tIru��DF ����z�R�·�BT���;���|H\�3 �����q��tю%���T����80]0�rsѡt �Iv���у<�5�Fѫ1|�3?T�vӛ*Ld6_���Ѷ��<Ċ�q��S)�QH�P�'r5��w=�rLpPx
�i�Ʃ\�{��F���%��|�Ȁ(�EӐ��%.��FZ��|��˖?�{(�ì�Cا'��������/�f�m�ԓ��h�+���@�j�1Ь�R��)���߾�$�~˾��Q���{�e��'�ϳP���7K ��U�>�X�K��#�G�(x!_-��9�Ջ6n�cR��G��N�~d�׽�'�!kd)���[�wI�	��3%��}O!C+m�h����B���p��Q�:=�u��E���{��BdiI�6I��viv~	d�ʫ����M8Ҍvv�@>	��������BҎ�Տo�A���k�Ί�o�ҕ�]uV�6
Ue��`0��Ҧ���$p�P�gQEc6(��ҴE�� �ڟ%)(M[Uɨ�ҹ�?:�&��5����۝0ҽr$~�0�G�ۻ��&~����ə�5�q��=�����r��Sd+�j�`����f����`��)�{`�j���E��,���"��h[iħ�Pmc*�ʅ��eHej��d�� �W"�0��\�)��� =c�k����T��Tn�J^��Ӯ:�[�f����-�$jm�ƿ�Q�G�Z�
lo��œ�"]����8��;u�y�(�2�7(��c}��$"˔p���'�7R�ų�F�/x�.�ط���>��!�1�}�*����+P&�6T�A��[��h�n�5��J+��F�I����
y9d�P��(�KY�й�ܽ���ۍ��V?�זq��i��^k�/�x�ak��e�ߏХ[��,�u�f��Ωmw2����";g��z|�+��9@��i��[Ӌ�4���MB��
�m�qӝ"��Sख़	�%���^Ӭd�߀y�^8��7��Z�Ӹ�7�K<S�7hv)~��"�OӺ���@d��F!)�5
l{8��ӿ�	�y,��(��dD��C��~�B����V�1�*��$���"S1�z�ُ��n�����gZ�X	�MV�8��ݧ�J|��iy$�b��Ǧe������ƯVdۙ����b�H
��e�us��wf6�/�= ���O��O��)�â=<7D��B���6�܏f���^�tw��QRL��a��c�o?��.�=�_v��dc��,! ]���o�rJ�Ԍ8&���L@��Q��S?ȹԌ������d,���ԡa�v(�N=�i�j���4F���b�����[��lTwU�����t#(owM�g|�'h��f\����xE#ђ�S�c��h"��T���`Q����{���J�$��azg�o�ڴ���퀞sХU��ת�K1����pq����|�'�������U������a����j���[�ޟ��	���v�?������
��<$�پ�����'Z���t4S]dR���۩z�/��3m0�i��oB&��.i�;�723�X�r���*1F��D\�8���!��~%d^R���S�W�[52d�ǜ����`�*�Z5�9v�9'���������dм=��h��^7�m[^�eqj?�nD{�4�|w�Հgoz5妆�ϫYzX��ՠ`����."
����I&@�տ�٫�R�t�+�I�/�-տ�d��E30+땚	>��J����T�o{�պ���`�y8��K�3�o	�[��Ё�Mܧ��(5�n��{oe�jr!J��s
��.o0Z���ͦ�ሡ�Ɔ�;2���5*��)��9�x�eM������-��WC�Q|F��v��-�׵7(���`і�!�����S_�*��;���~�бf�h��V�A����
��m�\#E�`��cf�A�r5��bu��,	n֔B1�'t,��� �[ b֕٨���cs%��Z��*�#֧k,A�$>;��[�,�)�u��֮���b�������?8ֱ�E;��a��y�pO�C��ƮplD�9�N���f��/���vx��'x��s�����c�����Lt��VԦ�#B6dCv��P�
Zr�c߁�v����p@�IB`�۲�N��b�~rⅡ'j�䧞�ݨV�~�׌ʦHvmf��ۃz�vl�וC�H�U<�1qBc"��מ?�p���d<��p��׫��&SS��H��rd�G����q[�a����REe���&������p$�
��9i0�}b����P�K�o�-�gnT!tQ��h!iE��X��]��o�Q,�Q��Y��p�U��%v���:�}�Sy�:7�'�)q���"ݸ�������ŋ�@��/\w���LRDmK
ɷ̮��3��ഷ�A|0����*����5Ȩ��	e4-+�Dd�ȩ�v�C����gk��a�$�[��N�_��Ȏ"2F�۾i�j��g詜p�ctyM���$�\_U�o|=����w�\Y���1�q�oj�ûe�q�G�ǽe�t؂� ��3��9ۑ�Kv�ؒҀ�B��g�
�]C�W(ؔ#n�bY�6ݹ���ofoؙ
3�&i
�s���#\\�q؜�L��۷�@���d���sث��B�z:�aXge�=���د3t�ܸ/v3=�Hu�˼�س���Q�?���9�'�r��t���T�n�/l�1��'��L^��q�
1k��٫ �pa�΄�aL������j�1��챏�bt7\͔������*��l�%��*��^��J���^�0`ͥ�䣒�vnA�S(
�SڊGP
��'��b�R'��V��ht��ߡ����$�s[�K?i�X;6��u�`T�ٗ��-�P�O ���4��w�٨
zK��[�@�r
�M-��ٯ�2u,�=�<����4bٿ�J[���,�0p���T���4��y�u�q�'���K�T
�١3��5����}?D��Hۺ�W����*����Oev��0�\\���T�`[�Z���9��q�F�bZf<���V��;��|���da�,��o&l�[���E�!��{Y0
/xj���u���Y?�D/�6�g+!�k�{ѫL-W;�PGl{#(�nڌ��al{�=�p[79|�fڑ6m�ἹR�b��ei&GڭH>Scba�f��j~��ݸd��I�܂���Hv6~�R����*�$�l��e�I���5���d���ï������OH�d�������𭻁���Nq#T1ko�2��SMk'ϖ/Z\C(F�t�*�ƞ�+�=o����Y�R>@�H�.��5p�U(�B���P\[k/�޴�l;�g@|\�n�aR`�Y:���o��>��npM�U��lLzy������w��}N�ON'�ɵsg4�CےŢ�ws��C��+V�8v	X۱���t8w�y���4~�;ʤ�тR\&�������Ew����P')U�P��-�L���3���7�뽂�$���QSSGZr��.Vr��扗m�,2t��<���F��
O�9�,�	�EPD����Ǐ���<-�o��0a�LDG�\m#�<G�_f�Ĝyll>@m~���I!�3X���l��5���n�X��Jc!���h�^��s�Z�Ա�
�u�1.�[.3Z�t1�>ɩr\���A�n��~慙��:�k0�+$��ܢ�d����/\mX��dmܲ���r�S���IU��8���¯Y�/�"I��|K���˧��i���ᛎ��jl��5��Z�x�sE�Iz�w�O��(Q���8�[�� {���y���Js�(s���L�P�����C�{k��)�-��D�u�!�g�-��(��aO…�q�1�"g��@
��8~PC�Qy��/+��k<&�=g踅az����9"���
Ǭ��{�<1�>��4N�	}E	���2rm��Bbn���'��&���,���=s�F�~ �%b-�@:ܒ7k�][�NT{7�z0zc�)��HU�p�b�m!Mb�ٕ|�N윑;���fuL3Wd
1�~�-�tJ�d�s�2�K�-8S���NT�{�dJ$�"�mv5�B�>��݃��FeN��ӳJ~/0>Yee�ݔ�u�bE�)N|G�׌(=W��ݪ=�_��i!:2�m[��ݶ��d�JA��2�8���x�	M9ydB���!TB9~k�q��0�+h�I�kOM��lA�F���k��r�E�g�0�ekı!5���Z%�zO���[�����"�b�N��{�*٭����ϭHy�2ɟ�}�I
/ô��S�-��ށ�P��'�Җ^0*ݱeH/�ޑf\����LU��9ԗ�ޟ+�9����{�AB���~[ޥY����PD�Ḛ��ô�V�ި���I��1�0�/����i/ޭ�:~A�u`�׽]�&?$Yh�޲R<Y4�"���l����QB���佱T
HGe\U�����t���1֏�+���SV�<���hҚ��$c���P���� �:��2�-��$G��i�%��ى��H�s
�A��Day���F�k�^i����n������_�\u��S��aJ��l����✃f��lu���8�F�
796]���7AQڳ7�_���6o�6�v��?�/�g��|6��^�ݹwW,���}	����,Uڽ��v1>�߈�,s0e�x���z΀Tߙ��_�*[��)�?�F�]6߷A�G�IA���+�+R�R߻���K���?*��l\B�<��>@��9��5Ft�*&���)��,��3�h���gKb��X��j�63I�Y������	��&���5W����F���k."��;[I�;�[4��}���^���_�C��� ���V��g~�tc^�'⬤�"��� &�:��0LŮ�"�à����]���r����*
��2+z�8��T;$4�/��/g￶�X�iؤ�O������A|Y�`�9����J�����Qbsڷ�6#�\�^3��w�X�`��í�߽޽��[C�]]��;;W���"b}�Xp�dp�7��ƒ��>��q*�Gsl�e�ޥ�Ʉ}�c�AI��S�y��3�TTvP�E4�/�DJp��x��ONJDv)ɓ,�o�	��,�ᓙf,^�i��s��[ʑ�nػ_f�_��:�U��W}9���˼���47J�
���Bm���+���2J���!�Y��'d�|m��u�i0X�#��v~�o�i%1��O��~���0o�y��8`
b�J�ֈ����E>�K�NmVq^���� ��o�H>,�Р"o�G��.�����R����F�Y�'=`͂��X��~r0��
/��E��u>�]��=	*'��[�cA�� ��e0�g�p+=O�?=c��w���m���ȿ�'�O->q�t��p��L��a.�a÷��X�s�)|��1@t�,;�Ӣl?�{N\��� �Q��L��������v�d��5Dt������w��v���o3�&9M����
p�v�T~�B�ljḊ��(��r�Kxс8(�i�����uJ���˱����⿅�O3��2��
q��iO����.T��Aܩ��H�9d�N���?���a�8(��X�����R�Tw�1؉�/Y�BD5�]�T�U�ōO�e��?ͨ�<b��g[N_�UG׬ů��	�m�|O�]3��ݬ�R�=;����෴�l�.�v�1+����|0�Iz�=�$�rŽ��$F��t�`�G�F���M^�����U�Od<�ō�qo���s�ZO��⫢����ӻXϭ���SZ���{���3��h�/��pgi�X��T|�<k��*Л�/�D#��761��x)G���M��,����yR.躉�#�:��PW�֎I��Zƍ!�mk�S%2����䎮?FN$�a�b⒐w�$}���9�(�j�S�v�k���)ˇ�oBʹd��%���4���+Ӽ���_ZJ��[��$_kq��0Ȗ>8��,��յ�&�¨�R�>���K�)�E�^�
�Gj���JH9��1��=뗍j�OS �y�W��
�b���-�uwM��<��_QcohbS�C��OX��+
m�nf)���L��k�ږ���r�<���UQ�vŅ�����<��{�0?�<(���+sB0��pWN�P�������v�G.��~#�"���"ە\{+�f���H���W:���'A(�E��,6��j���`g�M��"��'o�����)ò�G�V��(�*�1��Ӓ��݅F��F�>���]�W��Q!��q��(�dP�S5|��HV��R�����%)�%e�
����m[�:[܍�'	|6	[j�ܕ㟨+�N���EK
�i#�̨� ��X����Ep��:دN⧇<�`��a$�H�&M�/�ͥ\�`�*�X��I��!�Í��d��?�ِYO�O��Z�$�N�莄�@7Z�c�sr�};�i�gh���v�����h�z�C���՗䩧V5����e�
_�!�i�\֗펑��qd}_�������&S34��Q�Pq��|���>��ꌾ��U���E�|�<��`뗝�YO�QC�����Ӣ���b�4��}�����o�+�26R.�Rg%I�Aj�^	��@�+h6G�EpE��Lc5�������W��,��p�ą�wC氖�����z�2S�y��@o0&���_|��3-�$2Su�/�D���$��9��YW�f$�#��'Ы~�F��.���g�T�=;�fD��H��gdH�I�C{΍�Dܐ��S�~h�n^v;�O�Ѫ�����V���k9 ����ڏ���[gKS���ov�i��%��b$�ퟦ$��@I>F5�b�o�#D���^��T�-�t� !��u��g��������K�O��r�\Q�C����#H؀�1���ں	ԡ]�g��Sr�������đ��s�Eu_C8��U����"��|iz;T����
1 r8�b������lah��ȷB��\���b�0z��oh|F�!choA�_l�Q�`znR�\��<�@�ї�i��(+��A�
+��"�+��s�t�����I�|���i�u�9i��\�Nc��R�]��憃v�7ʙ��; ,�Q�h$�!��눭�q���⛲��CK�)�wZ���S�漀#$�>�G�,�rȧVo������L<�1Ym�=���$9����*$���q�;�L��F����̖��/���!��q�w�e�_�B��oD��ʅNR*�S�a��8�"�פC�8e����_6ԣ��-�}�]������,+`���		���,Gu��q��m��,t6�w��ؘ��TŲ�j��"2,PY�^�c��!=����oM{p���}�1RU���֬�ђ{?+y���K��Y�Q	a�qd>��dwM��+r��k���t���h|H�o���%ٍ���a��y�}�\�
�USQ�U@v���	^Fl��Z��L�@i�dl�^C<:gy�J,�s�	��d)��HS�_g���V85�+J�Ui��z��/��3�P`�@��M9
�w�a亏T��"������=�1%3ɮa���tn*�A>�����@������7����P��0�`�L�$�g��[[�݂l��v���5��tV'��՝�A�x��D���^��E�#�OX@��m�������љ�nlA`�v�����
��o-*�a&��>	��:�K�<+��a��}�$�V��^����LR�Ǜ���_q	ī�`t�D
��)�{��X^X1J��Ii+�D`C��(���Bm.f�3���ʿ,,�Mo/�7ǞR�‹(�����k�@a�vos���
��2��;���{-��o�����V��`��F��c�����1�vWO&��f-�V����X'������+�v����A)�2,!�#=��lK��6�736�.}��$y�#�g�N
��([������Z��SX��xp9i��]�~��^��^�I4b���ﶮ�U6t��f��"Rs�ex�v��7Ɵ饃�cb�-��H/3~�{�"��$~�-J9w�h��QB�����u�%Èc��-bL��r��x�0�z"o�������)v�G�?t�o����0��voe~u4R<*��	��Hc�Cn@�;���*(�R�����Jj[��J=-ѱ����L'W�4�	#�K�Y���W
�"�1-���H��H���c:�����c�ܾ��Mo!�6�f��$�<��ou��䘘��m��h<�T�ߔ/���.��o�P�pRx���1��7��%��T8�����1}�>0��=�>�8x�"�@rI�\6�s���7S|�b^}��1�# �����2���=��×4�[���9h�T�<|�8�
\a�w���v�y����44��+�>���S|<m��9Ԫ-�2���)��4��|F���E�o*D��!詨ś���f���{��[�4='���x0�6�t��<��9��tل��g�?;h�d?]�q��"UF���ޮR�_�}������٨h��c�RsH뉒��=%�|;X���(�E�%,06���tg�[ޥJ�U�=��	(�	��mD��]띛�gJZ�WK3
�'ݟ���ʮ9���a�B�n
��]�Ϛ���^�U<r��!�I���0.N���bfȂ{%���Fw�[ ���[Tf?j������݆�5.4uk��!�d���k������&��|�k�Dcz�K�䌒��q�M
�V�/�c����`��
�H�~\��(+���2�9�>��&+c���y��H
��>�����]I��#��UC&'�qF�r��c�����r��*�z���&)݈>���7�6�H�ݽ��_L��b��[�4�e?�o�B;���:���o�HL٪G\&�[��!�M���)��0U4�r�ݛ˷���%�����AF�pz����u1�Z��g��
�bù��/���A�#����.������Y�l���<*�
$u{�q���H��N��ַ�]�&�:�ny���ӽN�#�HT�E�eK�D�
��s?��Y���C`�T��g�TvTt�o��%�F�>6<���zN��황w����ܭ?��6�V���,%?�?����t���`�����w��οi0������߽O��fHpT���'iI;��S#�y��q�?�~�"�����c�2�MA[�+���<�E/��
/U��+�/�粲���nU��W��a#V�3<6�p	�o���[�E�m��Wd�(���i����4�F?}b���./���^�/Q���^�)s�;�@��H;���U�
Y'\��e�+���@��}
Ov
=��ui$���<�qc�o��T��bo#�e�$i}y���3 ��������k�WT�CaR��\o���*�2"��tݿ�d����@5��:$
u���j����i���Y���~%P�t�r�
Mc�&(�q�b~*�aJ���?
�E]0�Q'��<h���|�<�!
�`�"Z����q���F�%(B�
,�U%8� ���A	����sn?|x�Z���!f����������r'���(ˍ$ű;r0�<�iG�ߘ�+2~��`��~r����e�P��B+�(m�zD2� `��/�ZI>�j�����;�{�G� O$l�k�7D��+ea��?�+Z�L�c�Pj�>JsK[��x�ގ8"5��}�Fwb�t�ךhE��
j��;�h�+�t�؏�k�J�`H4�r1K5ﮗ�"��/,f"@
��U͚�n$���#������x�\B���tnsTweTU�k�P���q�Ԛ���\A��:<���Ð���l��@	C�������m�#~"�-���D���4��㷯�+��c�W7����[E�����T@�a�	e��g�Au��#������IH���AN�YFΏy�%g��R��(K�z�|���r�'���o�H�}�
�~�V�>N81qvҋ�4��f�BE�
�A�}g�^xd�����L�qBj��U{w^i�����*���,&�심��x
��<��A���Q�a9�z[�D�����VmC:"{G��͊`��O���RP�2��
��4;�=}���$� ��N�D?�@UVYo��5�����	m��K��||�<U7d��[�
��^�ސQ�r��ń�۷���piI�;=b��<���)��-(�s�h}ˁlD�����,1z3_:ۙ�gX����Y�P\糰8~��.��9�?��^��KCZ���m��fB��b�eH{R_���`��k�&o;�0�%�䓿0���v"���/O��bγ��4<�HԌ����`'1��[���Pq$ѧyH���8c��.�xZ~�_載���6Ur����){6�11U�0�3:"���p-����Op^�7ˢ��i���X���O`?��(����{���G�̞Us�.�S@�Q����o��]
ř�$��d����.:��)��
�|;�r�����EHxfƷM���#�|�8̗n�G��=�6 �a}�"8e	�@�h�I�pg���
$�5*'C�zo������
�_�<��t�ې`�f�uI�"rܮRA�y�zЪ��i4\KZI���B�3A³K_���������.9=���4�m�w���
�wI�^��y�#ʿ��sA�Ǵ0k�kL$ʳ�))�l����=�	�����C��$��㑖v��i��@r�N
*�Gc���v�������@&�߯��� �w|���&��Z���8�Q��7m��@�ޏ$�[`���Z�_�ot}c���,X
�hL&у��+V��7�.�z7� j��zR�L��F�,�e��p�y��TeY|ǖ����Q^�k��=���6P�B�~����0�����
����\7���B��&��j�@�
v�)���,'���nekX�?*�	%�����n���D-����	����p���&�^,�+�0eiΊ��u�?�?�x�Pr؜���x�_@.�֛����@"�*�󄙣1����l��U�]�`��B�>1M(f�j�U̇�
�Y�������g���Z/��V�᝞̹o ���n�󚶬bH&���v�I�<����<t�"`����O��X��)�;�3_�PS.��Ⲓ�� c�4=����y��0;ʣHO�N���q,{��9wO�z�QIa��	�l��G���e�잵!=-�VU�O"�ć������m�;�)�P��z�R�?$8ʟ��I�[���a;y �;ɀm�l5�4��~>�l!;s9������p�K�t��"+
ʲ\�	=JB�����s�Z(�2
�@6�!�_�x�~��E��q8�_�Z��	�3gƠ�V.��M�C^NG�5��t�P�{D��n�)�1�T��J�XV��7������PH���i�_p�؈�͗+��ڈB�\i,�*D����5�$:j�m��f��l���v��`ftWc���Z��Y�����x�Y���s�9�}����� 6�+�p�+'W���Ʃ�P���0=m`(K`Z�"�XWr�7N��
r��2�.�-�����lj�y��[�:��v��^JƧ3+\g����L�z��K����mz����]�g��-�lظ���t�⬦�Up9}d�_��\��{,Z�Dh���?lh}H�D��d���j�xr4�4���ml@����u7-H`K��{.G؃��
���-#rD��������^I��^�(7VWc�ZY{�'��|t��r��	hm(�K�o}���$�b�[����um=�бo���=��Z$��W�_��ҳ6&S���*�CHQO`���չŷ�&p�����],z\��� %l�9���š�և��;�E~뚄���h�~�^��y�B-�a3B
�]W�b^����lS�4��]��������2���;
�&� lW�o�T����8��y�yK�I�~{&��d:NV��_kb���&+���%����1���g��VMB���-duANSv�1I�[��M�՘��#�r��p�e�!�8�������]
@�m[؅�û8��1�C	�u�y�y����sP0^�@���v������߻��I��'�����*2�$���s������nx���0�{�x+�'��j�]]���H�R�I��-��@r��,��Y���PY���Z�x��S����#�m�<�h�wL(V�o�����M$��J��'��W���E�0��4�/b9��-<��^}^�׮�p)�oC��:�/���c1&��T�h��&���#���	ʼ-�����[����X�����;Y�]��q�S���B�=r,�r������܀zU�6��BN�ߗ9e���r>��JF��SϾ�&oJ+��&�����c�z
�Y�	?Y؞�|ܾ?"�g��!�ȋr��	��6�e��~�m
 �v�)��h,F�3��v�1h�|�q�";?"���k1����-e��l��:JY��u�|�_I�ܞʣ��@�P��z6�5��I��8ί�|�:���%�4<���@i��C��꯭�_�QYfR��p&�����䡏|�ۃ��Xm"�����Nҙ��]D��ҵ��D�տ���vo�q���6�z@.H��/��wD^b�"&��T��%���p|��,�\=P�Y���3&}!�o�\0�4�L�i�#7uC:C ���a���
V�o��2j�
�$㶖�h�!�w7�^��n�,��E�lb�+.C��)"��'Ll�m�n�@��Vݩ��fs1����d	[��^��T]�}C�=��ZeM辢�ݷ����ԝ��_*<�Be<�b|4�H%��fr�&~��m�J8t�	
�c��W$LNc���m�{�H��r��
����6����=�fi��e�����q�e6�R�yI�K$B�U�L���.�
�,hN����x�30q��ZK��m�y�B�|��
���q�@p�I�{��C�k�X�Ҟ�J����Y�p�(�%��A#�1�VԖЇ��(q~�h��~�D+���Y_�(�d2�njS1	���}7�:���I�dL�Ϧ'#Ç�dɞ^�zm�`z�K�¨$�Yr(���r���i;ą_�4E�-}1=eIѻ�������ׄ�}<ϕr��I�����pN�<��ʉ>iø{��l�3����t�Ǜ&V�
��w�nʕ���jl� �$�Ǔ�E��E/j����oA:���ku�ж���&�ξX�@���j�vy��ڐy��н����;��z�ne/a	xq�5���uR*���9���zl�ߩ���V��4\�«�������r���VU_����-�cA�ʭbd{��9�p�қ�H���:��xs9��DSN7�	*��.rP�+�E�'���Ձ���wZ�u�K�Ŗ軯�
��Q�"ʫȾ�S�~8u/0�V���%�*�_��eF�뽙D��m-0��c��oA��|��ޱ�}�mb���`�p�PO]�2�p���W*M��r�H�6g���ڭG�Ҡ��<��V\.��ݣ��ʀ|�k��r��Y4��Z[��(��m����;[��$�����~�i����]�@1O��e=<�++�L��&�D.U����ݶ:DE��Cؑ�EI]�+�1t���Ijw�I�C�C�Qң��濻�/�K��\��NS�K7��EgO�^�A�R�ܵ�K�w.��\�mŽ�'�f�H�Mm�8jF	���T#YȌ��sQZ,��+��Le_�H���qqoa�+5����6�5��L<��%�^X������	�
3�+k�
B�������"`��ӆ2�;�o����z��l`Th���+��F2�]��{��`]lB�����ܜ��.���<n�����[^�sa�1����녇��ٓQ���3k��ZYm0����h���W�p���QsO�YۉI�w����8����bRL�c���2E���+E
��xa�	~uDƚ؞a�����N�M�1�$[�D9�&2�ck�NGJH][��]uO�2��V�J��1��tq�(.t,�9��\%ճ@Gۃ�Ġn��=)	2H���v�i,���K��i`ϻ�ˤ�Oh�#�Vʀ��a��jA��;�&�W�Q�.�ޙѺ͏r�J�߈�Yb�nP��1�spm�p�_�\_6���N���YP<�k;*P�d+��+��֜g0?�V3��o��.���W)��9�-��!�1����i���B��8���69���smZ��g4�s��?�����u���>���z ���3��v��Z�W�E㟙nS�=���~{�
J���jXl]�<&���-Ȫ_hE`!����V��&��'��$^Pژ��M�������N��Ѩ)��;��Q��%TV���I+hٳ�g<�>��.����f���L+��`1�M�1?Y�~O8������E��O�h�Ř�#<��<�8�	( �9&F<��MHK�S/â)��@�_�W]q1�7�Z��R2ƍ� ����R���\�Wq>���7���6_�f�_oHs
�LY��,^Q�(:�nZ���T,�ʅ$:L�v3��Bar(f���6��$��i���[��2��P�M��v���qb[�Kwӄ��K������F-���^pA����R�*Z��@�qV�24�B�ޤtD��]�`ˈ���wY G��d����������a��T������}�0�9$t�b��>W���+#���=ʼn�8��ir��ܙM��.D-�[		k���}�f�GOװ8̯��O��*}g���|N0\u�&���ex�'���A����]�h�M,��$Ex�z�
���s����I\Aꤳ��G�$Z}�I����n�]S���0"Z�&�b\�60G�f�dI�J[R��2Ly�����)E�^�a�\xs�:�l-yҢ�t�=��h\��SЍ=��%�K�����j�3���-�g�3�tl�g�ke{
)#;�AHmL�Ae��q�n������v���$�����\7X�0ޕ�8��ɹ�ms#�8�Q��vE�1���Ʒ|4�=�G���a.Ճ��.�=V�,�*������=!�8PDp�� = �B��R�8��e��^��>>��q������+��$�bW�=E����r8�o�Q���JQ����c�S�~����7���\���T��E�{��[�?��Q2��m>',�ھ{���#0a�G�k����� ���U9��$�B�F�$��V�����1�V����#�)����l���}T�7ip�>e��n��<u�|��m�P^�+�	���0��bf�,����,�`��]��\�����
����&��� �դ�.�-��Ai��>a'��x2SL��=캵|�?²#���v��9ݴ%�R�m"'�U��U
fEWw��h��}5��k�gh�IafU�Е�\ap��p��s��ihj��Gj����h�/gXv�Նϣ6���ϯ�n�֭ҟ܈|�T����70|/���u4�Q_��?��iԉJ�a��WE�
rx��q��GwҘ�XC���<2�s���|����T�G%�Y�i�y����m���qo�"m6 ��!P��)�q�g 삋׽e�$-��X��0'��N��Nc��(�qF�:9�
��x�?�sfv�����6�V�a�6��xȼoi4�����Ĉ40{��;'����#��P��Ѡ���H�U����k�$�%���{��R�%���Z�o�\�mrĒꞤ)	�Z��U�
2��a�ɀ�
K��� ��~�p�
�L�^E���%c����{��6!�ؘ���{%����D��1Z2�Mȹ�]��J{l`�0+ˮ�`�t���F"�݆`��,��v��"K�V�#�`�l���ݷ��O�N���K�аq�:�1=�I�H@j��h�����ŭ�5^X��(B�P�=b�{�5mO�w�nd����N<��~z�b~���.˘I���t:�6ͱP�Z�l&��1����܉�u/�O�e�)�9mł�@T�BY�H�W�����T�n�1��Z�5��~I�`�ik��b��?��?�x@����t��#�pҔ^��@6U���v��{%�Af~��Ck�x�#�:Ԑ��hA�`yP�3��)����s��%(�U��߃+η�M0^�s™���s��t���&Q4�K�̀���b�?�g�1s����Ʉg7��bB�֪#���7�1v$2��p�،n9z,r1?d�������_k���/bm��Z˼��&^)!zP�d�7�i-ʸGF�m
�|{g\��#
h����+���WM�b����Y��B�_ig���mހ���ao�u�.�TF.B0
��%]��:z��	�1�<����)Gv�c���?~N[�cM����r<X���`Ŋ�eL�Fw$A{���k�����>��)���N��f#��Ÿ'WZE$��e��r���h̝\
���A9bu�MD?5�-��E#j��QKՀ]��,�rր��R��R[�y��$��g�z���"������"���F��/iF����0�����L3��I�k6<
=d����)����ː�pEri�;ҟ��~�Z?y�����/&вW�R
�Y��'�;=Xr�E ��6}9(pNuhT���)�)����A�-Qȩ�{��kv��w;!�H��e߂�Y�};Hw�M��h��v�]�m�p!T��K�Š
J�ޮf�R�G���
��18[����C=�B4#�F(	��XbkU�_|kL_�yz�`�"!�ܵ����؆�{����M=�7�X�ĝ-/�J$�Ѡ��P�:<�4�zoPe3�*G��q���e��/$p>^�q�������}/wٹ�i��C���
+u��l�~�yw�m����5�1��Go,y�>��0KH��F�	�Zm�M9����!�^�x��|�Z+I��P��<bz�����'����tQ�K���Y�����o�2�^��^���D��R�aI�~N�q	�@��a��X �l7�07w����Yι]u�wB��_!TDY�m���%P�ݛ�Ӏ��NuB#5��F@,�Ó�ް�E�d��rH�]�K	�+�j�Cţq��ry��~���M��u��n)nd��)a0(1V��
Z�a4�̓7��)��~�8�
6K���f�\�E���r�7k��B,�ѷ����Q�:��[����h,4�=�I���bM�4�4��;�ɶ��}�tY�n�;u!1��R+���v��
|PnX���1�tG�?8Iܟ`����\%�)�P�jI2� ���!Eb#�آ_V�ʇ�
�"���Y�I�,��G%jK/è�N[����s�?r_S�6&p8i�6>�1�gj���,�>�4����ۡ83�)w ���[�J�k�K�v�v��-��kw�MVn�eQ$;w9|uW�B���cv��;��k�]��
�5!D�
8a3ʉ��5�H�O~7��B�*�
!�Qd�^���~�$��{�0�9�N�b��o�%��ҽ5f�s�y�ǫ���ٛ'���U���D���ˆ�>$�7H�zڤ~g����Ƽ��͐������/19���11GZ**bMd�	@�Lti�������V�)�E�֗��o�k,�1�
�	�v���W�K6�|��E������$�����֮�_��/���%ϭRܓ$|�\k6�����,�k��i\W��E
[^�5N�0���KNm*/ˈ�9|~ӋZ����'9O
��%�~�Ӑ��B[D�BO�ܓˢ������"�Y�$Q�]ͪ
�0f.�I3�	)&
O�0,q*�+����'��u���;�<���p[�4��8�.2����ħ�Ö�P~��q)�]*��.���QD׵NH#��ՙH^�o�뒖�3��Vg��<��e���
��J�-E~��dn�ԣ¹�GХ�����=�3�XӢ�>
��S��(�ۚYw���̹]�?����J�Y�	�S;б��٣���,�H�p�$qغ�^{<�0�-����!u)7�:�_'�6��h�-߀b㍳�wl�EQf;#.�2m�E���2`��E�����l���;��]%Z�8d��(R�yO�L��z!B�v��g�X<�Ш��Z��<��7�ta�{��KI=1%�R�
�v�چ}q�X+��]Nqt4��/��k�`ƺ�e�%4�{�sK��a�I��1w����6���M���ssj���imqzJg�~�7��ق|�ۜA�R�WYG�%��-E9(�5��J6������_����
)V厠��-�]���u&0�lr�먃,Y,w3:�#�"�ʇ��+��}�f����>�ʏM6��LX�k�k�����6&ڍLi�gG�7��<�p�� ��`�J�.���;꯯�3�4Mf�����ͪ�T�T|�UF}y��j�a�'4�M%+�w*����pb��֎4Ħ��^�q���?�8��_ަiL.��-ER�jZ��TR�G����% �|0Ɠ�Fk,l�̹� �_���f���{\S{}��Xu2�t��ݨ�+��WBU�h�ߎ��R�F�|��>�SzWl!���p̚fJ���1�0M�@�m��M9PĦ�L�����V{�����]� �މ>�l���S�֮P�V�?�?v��k*yYg�M_�P�Ћ�U�*��xh;N�r���w
�	�*[�Qo����oc;}o�-u�<�L��X�Y�z��^�詄�h	4��r������T9f�6�Kd�������t�0FSm�>"�պ��K�����䈑3��4��.�K��y��Z"l��� �J���P�G.�d
~Xw�i�ds6ҥ���y�#eaű-/����3;��Hڛ�����i�����<�(�%��t���	��/����q�6^H|�+n

�N����u���"�u[L�k��9��2�ҝ�����"��$��1o�D��k��I��5�p���E������1�x^V�_��y�x�u��h|��)��<�O�ύ��<���w.	y�e��$?�%z���LzE轰�୕C�x�<��/{%���^���,3���t��W�!P�?�D��Q�)�U)�Q�z��E�h�\TJ[��-�×�cb��8����_g��J�Q
E�n�c=�ş\E��3H�ס�jXW���N'���h�YP��t�:����S zs�NL�3�+MQH��|����.�s&���a
yh���q�PA#�6���=ӕ� ��B�j��+�򇴲�|\���]C����q�dj�r�,�6�.�VK�May�?e~{N
�e����T��X�`r����
�~�b�7��X�f��K=�a���iǞ���Z�m�I�NC%��&9
�?L�4p��4���<"m�9sj�O�1�Ƅ�m���#������gx�ΔlTY�����"=�5300�j�D2�hi���ō�!q���|���.��h�\&��pUp���-�b�Ƃ�܂A�����&��n5��zOr������?��|�"l�����*d��U����q�37DUvʻ��~��(~�X�]%W�):��.�
��NXC��{W=�#��H]�C���``����<C&e��7G��҂(b����V�Ƿ�b0+F�D�Mm�)�M_�%Xb�+��9�[��0��F(�}TZ�<n��G�,ɂ�(ng_�H����U[{����\@H�����@x_z��-�܍Y��)��7ݔ%���P�-�?B�xg��['C\[���_��G�5�,`4�#�����A�ldR\�=�
=>$$3������!x,�L�0�����5<4g?`��r�0ɮ���)-Ÿ�z�g<�ӥ]�[�ڷ}�u�� ��fLjd�v~���l
Ð)0"�w����ˑ�]=�vsx�ad�H��v��k�Q�K��.y0�9�36`��y�V�jV�P����7�κV�y)�Y.��2�
2���]M�vu4��I�'c������*^���8�!qH����\���X�{:!��1�.�}��k��8>ȟvm��e��U7,u��໯OKж:ڗ`�i�m��s�������t~����K�������S",�<Z���b�<���
}z���FPo�����0�ƱG%�>a`��;�E���q3N͖lwK��y�>�l!1l��w��
r�3���ǥ��SsO���EX�mC�s�G�爁�N_����G�kG�^x�b�'���
���4�w���TS4$
B,N�M�LkGY|�BaLI�kO���V�'�O����7��4�q��Y�2�C�ˠ�5D?����1���iz`���FDo�3�",�|��Q��Y�6=�x�b�g�U�2���������*%�RC7�J�<�
�QP�)���$!+py�sB!e���5>�wc|��T�AH��D����4�݂}
�

x�|C��v��#1���~ha�	s�>uʪ�m�M�6G��,=���Q5ȼ"��֝7�pw�0{�,j���b����Q���|��'����{sVX�?�Յi��ܽ8�����J�4Fc@Ҕ
�l�|�brY�j#����&A��Ko��j��=����A�>3��k��m����_`m��Ȗ��uw���A��E��&w�!K���d�MQ�YǮHfS�Ց�/A�.��u~�Wì�*ʚf"�C]��:��y~m�8����L����0�-c��s�ƥ]	m�~E�~�����]�_�O�D���FC1�^�- FJ�j�|v�&�P�(ߎ&"�D��cm9u�[��m�(x�Fk�l$�:ȁn��m��ZC�\qN�׈4!b4���b�7o�_��<��1"1��qMP{
���PNj����E��
s���F����|b
+O0(1����Kp��L
/I���%F�"v ��![ݶ�����b�nʓK���A+�I�<B8ۏ�0�Pg�F�hhi��}9��$�����^c7P&��*>�q�,ޕ5`�;��6$R�2�J�N~��V���>ɽHM
�,A���fF��v�9���`�;�����`2��}�c���\�Ԁ4˴�(w灙��\t٢�%���r�|��)��.͖-�(����X���*��!�p(�6K�i��-&�e��3�T99=KM��SX�i܈��m�e��F���)���6t�gT;6�s��}�1�2g+����P��������=H'`�z<��*���8˞u��G�y�����/��H؏���q��`�?�Xf�
~}�s(���ގ�a
,Ƿ�;��xߑ�V�ѡ�&��ng��aɍ�#vE{���%���uP�|s�%��oi�(�Av-����'Q�ߣ]�/"�Z͠S��Ţv�u��W�-O:~�UL�Xj���Bʉ��K���<��f�s�IC��T�jq[x�Մ���+���ZYK3���ㅲ�h��L1��`__VE�z;�U��R�'�D0���Ǣh��NJ�VM�1���p��uv��\�pjq�+��o$"
��;X�1q�8'�Z�+|,1�Gѝ����_wif;�v�l���,{�gE��g�V����
��W�2��C��Cr��j��Q��"n�:o�a���\���s?d���D)���v���$��:
@2�a�!�pY��z�\.(^��b��2�̙uBz��	!`
Lf
[UO��=�&���hpc��Tِ=:B�\�C*�7Ia����b�_��{��~��J��tR�֧
�͹Q4�������<G5��	�@#��ꡍ���hg��\�e�%���9(3v:�E�6G~`κFnC��F
�~m�n�E5�\"��A�=���'���g�t��c��ӂ�9��0:�V-��C���E��t�V��y|�>BP�Z�иK+�6P3��� Ov�gy�?q����W�A`������2���u��k�P����⠒���'�
B���;C|�yI�S6y�վ�Y�`�@g��"�E6���7�AHï���bL��h�h�c+���P��� ����'���-�.t�*%�~�t�Ɣ�T�G�1i�ףlb�,Tl��,,/%��B���<>�U�����7'P"��>�m��UD~�o)�#��H�v�‘��MV��?L�YMR�ݶ���!t�|&6Wބ���c�ơ>��S��
�������~|"��Y�f�U����2*��v��k���?�2(���h"�h�P��z��y��ńjQ���8��J=1���\1�v4<'#���'���P,���\�7G�l����3>r������`"auyq���y_E�s��(u���pH�|���+��r����E��3��5�D��N��h�N،[�\`���D�.�5����gz�d%��I�8����{���Q�$����
1~4�Z��A�TK܇��(�2��V"�@��ԧ�O�8��МLa>U�j4Ǚ��G��Z�7�qD�)��/�[h�$?:.wW����R7p3o @��Y�|�㞻�j�ERH�+���מ��Kה��
�.1�ƭA���xT��&`�@�򹀂v#=�yJ~�KKWRz�Mf�Ζ�B���1�##�b�v��xq�Z'%
?8�M�P��	�aO�	��o�Pq�!��¯<J�
D�u>Xd΢E�����b����ZLw�5�
���F,�/��Ek|�W����w���0�6?!��ů��Y,,\9���B��JX�Ͷf�UF��,�';W�#MZU��A0li��H���+4:���������߿`ݔ�O��+���.��x b|�_՚/�+�R�5/ޥĪ���>HL^%+��j��U%"g�
J%�ݲ�^ ���I��	Zo��5��0͉���ګ��A�܅ux������]d�����ѥ�j�нy'��vdJ����.�Ti$ә�mPA��_O�.���_&��߸?gl=��\�\��p���*��mۅ!Y����8�c�c��@˳�P��StyΠ�EE����]��<(�6�`��E���Ӟ3�J�-��3�=�*�[n�
������5̝�>�
����uSC§�G~Gv�A��WܑX��#6�)�+\�0������Y�g��Q��Uf��\ۻ���;
l����J��M�Y����]�.sÅ9����ʬ��W$�[-�2l3���;�6'�eF%���1�ǫ�:�ߔ�K��X������|�FOa�K@�--j��6N��? �N�s:Z���h�jV#=�
������Ȭ\Ǭ�~���ߵ8=jY�����:j�Bk��k�P�-���F�<��qZ�<��*ɚ�#P�dt����Z��X������*�cSe���HD)�+s�b�-G��������[YtYc�\\<c�J|���<��U��f�qe�a��wvn���ȑ����ְ�R�h�n��1�T$��^f���ʻ�d�[��A��4_Hd�݄�&y)WN7=�5Hw�z�c��~Ef�6��Y�Ȗ*�$�AUG�˒}�h�o#qXn	�4W�qWHn�RZ������\����[���E���ɍz?�a��$��
��c��%��O�m�cZO��{�O�f�-�������h��ҷ��!c2�x�+�ߨ�2c
�g�J��%�D�7�V�W���i�$V�(�l�v	�â�Q���e���_�N�>x��C�_,y˂��Qk"��3�7!���.�
�3R��}�v�z(hѫ;���Ru�
<���I��7�VT�O�G�h���(<h�ZM/G��\r���ehN[�)2t��R�X��|p�VAU�����>��Zv���q<
B�Hb�={X̌��з�czx\��gK��������"�؝���ş�$Ԥ&8�7u*��6���U6�ίY��E+�c����"!�\�����9ųDP��.�N(+w�}x�O�1%�;�,췱��W	�t쉅��a���s.Vk�L+|["u�FM���w���M���=Ͽ� �ċ�m��
ۋ���pzٳ�%Ł���0)��$'��AI.&̵.s�hW߲B�)��l��s�$�"3�_*l�g��K��`����U�B)�/��pn�$Y�0jɪBm1�$��G��W�la��1YQy1~�G ̪2���+�8'���D��_q��NU�	^�=ҙL��[�����a�Z|w2����Ʊ�1�>;��ϩDk��4
�Z1J�s�R�")��&V���1�4bVJ��{��KKH��)3�[VSQ���`k]�����:IZmY�]��(�S��k�M�(���o4Q���|�3��DI�	�
��dG�o�w���1���o�XT���y'��~��X��t���f�� �ic:� �h��Wt.�ըN��i��"��9�cMs&�+34��T��B�OI�7��X��0�z$����4&E&���6D�S>���̜n	K��3Cl/G�m�vc�uy"ֺ$�
Ռ���݇�1�����Z�A|�;���g����z�-�Pa��l�ֽC��Vv�vLs`�S�˪v?I���h��7Ÿ�Y��t�4�GT}!�N�kx< �2g�F"O��޾hҭn�^����ܫV�e�-��9�i�*��M�����h{�
$@\@����#�J��Њ�Þ	��]��P�^Gj,}�k�V��dPz+?�B�x�
�=m��z���d�s��~�=�A��_4�s0A�zŹ��*F1;=�K�}��R����2lF��0��8ܻ�[1 �!B���#�L!�90�fC��K��DM�C�q�$v��L���~f+NL2�w�	u���=�TQ��u�[8k��R�x$O5��Øt�~+��S��  `}�S�JxF�+[7y'���)�,�e͍��ثr�t*�b�N�8��Úy��-��Cf���1�̟�t�y7�b?�$�u ��N��9�r��pqY� �H�_�f����#1.�Hj��n�����L�)XՍ�L��鑒�"p���E�_#��B�B͹�Ҙ��Φl��dx�~�����~ x~�1V[2̼����G��o��$�˅��)q}��5փpF�'ʷ`���z���k��F��
�wNG�M;#I�8]�.�D��%l���f.�VB�l�Dz�����-�͒1c�U�ޤ�<�D$�S�f��j��(�ۦ�I��gX�>	��f�p���=�ϡó��+7� �6|@^,
G(�0u��;����f�q�)�/��ЫM�4lIx�.��,M"�C��F�|�$��r������e6m�EV}�Wݛ���#�^��#紬]����ey�\�HH妡�%p<5"γ�b-J�66Ǹz�w�4�����u���kC�R�-C�F_F�A�?�D�	��9�*�}1� �w��GG�T�7��)g��aQX�}�=��M�0q��ۻϑF��z��^�U奺f�KFˁtFH%#�K	�U|oWb?��h��D�[�N�1�rl��Áţ@K���KTە����eu���z3ؾ�MWe�~1b��'��������;y�^�
h���#��U���8���o���!�+�w�o�ȳ3*:q�U�To�S�A*P%	A�&)�qĤ�02����Y,(�{�bԘo\ׁ��{��/�c��#A̔�.���y�h5�D�g��t}(�b'l9���X�IH2����N�ӹ���:���.�K
�HӐ�H�Jq��ՙu�[(˞��TߐMO�C��B*�sX�r;ח�&��ĭ�:��D\�����%�\P9\0�
�׊Z�U:�@q ��t�9&��ɥ��W�
�'6��?��ꈤ�.�����:����{��GHB=������Zq�.Fv+�<04��r�<���,_x�s�A��K�X��R�F�p-��ۘQS�����Z���(����n�TJ��
�������0��/���xd�F���^9w����ݿ���8Ž�`
��y���?�|�.�[Ӑ��'��U2���W)�
�"��1O���9K��r2�y��By\�����o�K��?�F�,��>Op��@S*Rt�.#z��N�6�p�Fq*���}�}��`hyA���ݿ�ՙ�,�čJ����)��
�*>���f9����ˁ�g4^��p��Os���'!.-3Z�1=���P0��"��ON,�H����ɡ��u�/��}v.�l�ޞ�D��Z25Ή��v��FM��d3zڐ+��C.��%/q�����s�?.T'`l���#��ڶ\$>@��ov�QV�)-:�0�6H�U'�3~Mj�m���5��GI�4���-��^�#Q)��ڹ{ps�%����[���	q�r��li�6�a��Tw�nh�@��;~����&lƚ�Y#!�^t�w�h�2Lf-;'�ʇ���/hA^�WB�=��>b�A���5n9���[OΎh�(���B1�x^�
_����z2���v<V��������5�RO����� m���=e��V�UD�s1!!�(0f���j&�~��#����pz��}#v����
��a�(Z�0|^�]} �׈rޭ�>
�܆���,�_�L�|+��!�{1m���v�e���Z��gn��j@��'�4�E�맡0�����v�G|k�$keO�u-�%��#��|��)�jǀ�E9#�n�AcdNb�8����H�#	5�2����ӷȱp��3�|�:�d(��ƕ�g8.�~�M�O
�-��d*�	�����Z**�J�j0�����P��[4O�V���I��t]���{u&ҍ"1�|̵���E�h��	��4֬]�)�@�l�1�*�q2��Y��>������0O��!��_�r�v����/����ΰ�\�q��	�R�$�R�*�����M�E[��6)*���Q,57&��o*����*`�,���~��Η�"n��q]�SB��l��Ja�Z?�fy�.]��	N��N��(���29%8C�V']Ҷ��&<�ux�6�*.�+s?���"��X|�J[�xu���HC�����k���4��)ˏ��FU�i5��F=�<�E��2�;�s���ku�U�Ȃզx�L5
��]6,]x6�&��p��y,6�D>$8S�j��i'Յ�
�t�����X�[3�â]d/3��O�⵲�ܲ�$\6����/��O�)���#�dxGyo��%�q�ۭv=�9I�E1��#����q�x,,�D��5� [��F���٢	���'ޮ^�{�5������G�l"CH����2��J�h�d
��hH,��]U�1��a�`-z�ZjظŠ<�3#Q�������8=]�B���Pȟ�_=d'A-�o	~�&�
j<�
_�HQi��k3�*Ko�a����42�C�=��_H��_���8:��02!/�)�����_zۻ���&%��q���\�*<���Vyb"Ұ�/O�XM��v�:ǥ:�T��?Z<)��+gۋ`�Q<=��ʴ{����F����t�XK9��
ޏ&h�xu�B���A�{!Ad��PXA��[����Oح��\
����ܤg�;�vi�XG�媖=��5"hh~N�v�C��k��J�oKzܕQAp.���rOĒ�Xp-���p��k���~u�~���nH{>X�/q��� ��wux^�dQ�E�u(\7�ʙCC)yR�FВo�\�פ�^�Gվ��Un�`�l8�{�z����
7e-�:7�6K}�V
�qfW7� r��qr�8A�� <x=W�u��2��vㆹ-��=���
o�Y7��\LB��O�@{Q��-�n�޷�?KL�Ł�V�П�f�W����`Y9�ڙ���0[�f2`��J�#�X?�EL���jH4ؔm��S�8;|�E���T;���UF*!,Չ�t�GG]{�
�q�,A�a�����U.��� �Øj
E0R ;Ȝ�Y��`q�f��:����O�,5�[p�2m���Q�i����t8�����y+F<~�\�t����wy+B�VN� ���5b_��EJ^���\S��0�ݒU�2]���d��KQ�x1��ϫr�˟/���y�4'�&�c���o��ii��	|)_�kV㎝���<y6��̛��J�N��H�����Kwѽ����w����QR�I���#���D/K$3�i�=�;�>�ёeOd4�.G�לE�5�4��Z��.'��z�29��:�.������,��j��s�=N���c�E&���~�H_h+иRƒ�KN�-X#���FL���=�g�<)*��wWے��f��b���2^/�!ӓ�υ�ݷ�w��� �.`P%7?#y�C!���26��g��~ϞH����|A%�w���ԝ�z��yO��E
v���J�/��1�/�h�s���
��:�SL��n>�{R�
�����O[K�V!�I/'gF�ؒX���aݩeͩ���\%���Z^���X!��*D?�m��k�ל��@NH���;"o�y��2gN������4xF�^j�X�ڸF�'�?�p�E�[��'�1��?�X���9]_�k�B�[
��hk���T�4����rIL�F��@�}܀���?�ٞx��\wvZ�iG� ����~�Z�b�j��\���W����}��/H������:ذd	Z1�k���}�:��u&b�G���JĤ���Q�c�`�O�h�}	�c�v²��ª-��6���Q�R�)��tI�a������'A�W��@a�0��2�}��,m�����Q�:��A^/M'`|�IfV(�I7�,V�O��
U�+���Vw��z��
�R��\`Y�D�H@�K*�Պȩ
�g
v�Q@DC�H�]�ͮ�K�q
��SdY���!��D��{pN��4���@�}`�w{�&	A�r?g���1n�Q��G
q
����&�1� ���n;�q�mRW�8��T��y�}�	��:AN�+\��AjnF�`��J�`�>yN�"��E#S�^p�F�{�R��=�l�T@�޼B}�9�uz��$���ƾ��!�n�@B�LO�{J(iG�tĈE�v��3��O�r�p�s�,���J#���~��	5��_
i��8͟_ډ�۞�[�NcT�����⼣m�|'��/���%�wU�7����L~gPd+�i9#�Ĥ�%��
>Yk��XU;e<�!H^��8i��98q�y���$��H�j��}�߉g/�2��8�=�yAMxV�8�O}h1�����*
`�E�9��'a�u��/��Y�X���t\�	�u	�Ag���9aj���p߆Ӷ�$ ����E��<����� �~���w��;������a�#�|�{�~E��)-n��s��y	��#�c,�5�O��`��14�٩#/�q�[6
�V�d���&>�)-'�/٪!J��P�>��2n����m�\�%<P���'?��
G�oȃ��λ�c1�������R'b�����T�`5V�����Z�O��J�#�3�
(E4��5��������?�B�%k�;`<�1u�p�QaAru�V�4�t�[�v�:jv5
�๾��K��*vO@�S�M�]�kƪ•UQ[�W�?d�f��u�U��~.ۧ����'�ꢎ��ë�\�ꜵ�J��r�;l7Ϙ�8Y����9=Ɛ����қVC�ZԾ8Oo�7�/�2�\��p�p�"��մH��4��#������kM֖�$��`$��dGV�y��*t�)���׍��^!Ϫä�Q��D��9]H�g��݊�~�#�=S<�r��>�H�8e��1�+9f&�v
��/1��N�Pp}^{g9cC�"���g훺�3��[^\}w����gh��KG�N�FW�XM
Ky����"o5^y3_���n��V���Ei"�q9߫G��}�9�L��4�2��0���9��>
HBXx�a�߬����2�)(�@��QS��O�)F�>��E��5~h�ʾ�˄��xll���;�Mܪ�N��]�$F/
)�n��8�<�ns6d�^K-�ھ�̤j�»_r&|~�8�0eʃ��L�9� ]2�]��+Aa�]dT6���+Li�����H�z���_���i@b)lFǢs%O�'AJKXx^�MZ̤S�,n&64�jP��{_��8si���Η'���I0Z
S��ܭ��uQ4�KG�He�_X�;`�ҏ
�:��8�N���v�3c9��s/���t�i�4j���#'�>M�/�h�*k�ٖc=*A�ϊê�,���¥x�4��{n��/LE-�s�I��g��ý�����Å�pf��M����2��.�9%]�D�:�
+y���~v"'�'��dJ
O��Oװ�/��Y�I���_���'����D3�L_�5�+�nlL9mR��^n��=���.F>�Ԫ�F�l$���:�b�!D�'M_��Q�4��2MP�s�B��Ř�LۚX�"�۶U������w��/
�b�_��i�JI��=9O�VT˯ˇ��ok����Flyȕ�Y�t���ARc���w�6b5�.�vn��os<�-�$����v��T͸=zA�D�Ww�0�v��Db��v!rݰKM�o��H��^��N�$h�//�Ç�xJ-�q���Nj����z
���ɢ4$l���-��u����yk�1ڌ+�=j���
��4���+�XeLv�5�nR�?���Bp�.X��CX	����%f;zfb0�
^�6�2����-e�@���^3�n<��N��*$�@��͒�p�b�4�)�Y��Z�C�V��Ā1}�bh�Mv���=�H5|�=�`L�hK��gi�5�����zPí��0n|��l����^�� �ǤO��)�{���s+Ӑ�O���;&>@�{+�ѵn��/Yq�gt�dd�/gy9e�1e�iV��Q��ẉꏔʎ'��Ky}�!L�7G�'��\*O\����� ��9�9uS�W9���57g�;����m���MI��ߙ@���$��ƀ���'�wT����Z�O�?%���,b�/�<nf�VS����C޼�%"�<度������ǚ@�j��b�&���M�յ�jᘼ�/*b̟&2�)���<`�*<*���7[v�٠��+%�2���ET���F��}���\]G���	^���̠�>�t	g���5Z�M6+C\�i0����,����O�ѻ�?Djz˟�ŋ��������%�K��9c�^��At�֫Mv���ǵ�l��K���_���b	��Ff9�o^�R��?2bq-SH2��N�?D�����N̸��M"o·���v[�;�-^��WR����2r�^�CW�H�I�vk\���qE�r�P��S�|j���X�W�'U��ؓ%�Y�4���gɩɪ��W2���.7/���&�̰�y	8`k�s�1�[��	}B�����k���K`��sJ܀�e�	�|!�S���O����57�T�p��-ՠ�,ꓸMN
;�S���\W�PBK���X�FD
ٯ�H��C�sR�%�L��f$�0S/�$k�1���l�hZ6���e��'��B�f䊤�M��0�g��;/�f��pޟnv)�v�<u������Q�D��1yRq�I=e��ȸDY��}�,md
9
4ъ�V���o��b��F��Rƥ�+���iQݧ�����ͦ4��i���I�6o���X��|�m��W���Xv3S���"��:6�JE#�hc�1A^1C瑝lï�쾕��(�6��8qy\U�b66�ҵ:��gFf$�m2�_�R��5����o�C}�C�,��;hɆ|��,�%}�.�8����TX6��\��vX�vJސ��K~���c�iZ������ss����aI����u�,����'��6���I�鎛���&#F@5��8����N	;܀�wL��W���x������� @~j�N >�>���:������@?Ƃ���ߓ��9-�?�]O-U=��,&ik�ڏ��8�����rxt-@KH&�QF��2n�K䪃��/����#1�\g$�X*�'ہ��8u<	T����.�*8暋��NJ�,]jC����M���{�jL�YD�!�^�q�j|�[��D�7b)�ۍ֍{/\��t(����j��i��(�HG0�u0p=XMQ
)����-��_f˷O�=pA*�ᖁb�y*o��cnA0������Zabyaamhs�֟$D)�5�~���r��
b4��jK�E��������S�5c_�4(�K��� 
��/�;�HJ�����|���l��"�vQX	���kW���c}5KxB2��d�6�2���+Z�p��B_)���rܹ;/)^P��KJ�ﳧ���;V��R0�Dj@�����6=�cg�e��'P�AC��F.���N�Tv�$��E�W�r�;�I�?`A��b�i�T��S�#ZK{�QԞ���5MgZ��k��7�b,cktr�ߡ;��+}�a�[�!y��91��<�N�FRI�O�뒶��<���6�����"a�폛_-�wۤ�~��o������I3��y�j�ˋP�a�v1dᾌZQ�]r]�s� ��2�˻��V�'�7d����|��j�`{~��Ku����w�UU��y-�Q�x��KH\v��1����xIƭ��ftD�|z$yT2�+�Ew���|�p
F�Od)�l�9�E`�<�#	L����!˒,s30����[&X���A��n�w�%
��β�Ff���r��|��-�_r]&�6�ew���]]1M�scDW�!e5R>3�9(

Ո�'[lSW@2�xѥD�f�mXv����q��tFH���E	�ѡX_��H�:E��2��ک�d
�����S�2+t8P�7k�o���#���`S�Au#�l�Ժ�&"N�8���y���	��-,��+������ү~�i8"����j5�e��u����aO���\�¬{�����1[��L���e��#��jBꁘ�eo�\9䲰���;Y%�0A��Y��b%�<�Tq�F�n9�V\H�����i^�$���/f��?��t`��5#�$�/O����$�vZF3��j�Әw*��z�g
�����Ǝ{_�x>Se��w�X�qmZ�s����0��Gź�Z8�f���Q�5
$��rg+*�\_[��v����K�4b����d����J��w
�؊^-�ߎl��}��Y���{Q0����0��Q��ס��>��F�@�&��;��r�܉h��/�]�Fr1j:��m��Sx�9Z9(��	�
@�n���-�[�
wV
���	���.�$�m&
�i��I��	Z�	jv��
�
�wm	���lq	�<�ma��q	 �
��[��&����`�\����
;@��
�y
ޡ�\"�V����O�6��=�l�

I�x����a�����*
��|��	�-�	����M�Cpn4�y6��OIfcTPJbǘ!�+Q��
�I���v+	��
Ms
-��oo�	hTڨKD��a�o��wS҉+�I�4ޙ	ʌ�������{�
�f�	�]�|+�	�q%"�����<	]�`;�u=bQc�x+
�E
P�
;v��	��
�h���o�	����KI
B�	�w���~1J2?3���
g�����G���f	�����/tP
C�|��	��	�~���~��H��8
������-B�
KP.v
�x'�=	��
��Zb)X�p	��f	~���
m!Xb�
5
'	�$f�'���]��[�	 �T=ɶ��P��nZ�	ڥ�A��0���}WMO
�.
K�0��C�	����*�e֮
XRǣ��v�	�N��	c���΁4E(�`�&5�$	��	ZL?r�
M=	�XX��a
�GDz	��e;%7&^M���~i�
cw���.��vl��f)�_
dI	{;AX9�
-��Byf��ڍ�^9'��"�	�1���&]�n���›R���	�
UR$
yo	
��|j��+��Y_�I�^
X}d���a<����6' ��X	H6
W_���	��s�۵1��
S���	���	1��Է
ܘ
Gh�6�
�=T$l�	��
�(�T	L�
�a�1d	��	��/��I��D��	�ڷߍP���̩.�b/�$
.]����
 ��
�fV
�?	��D��Y�	��`�	[����R	��������BE.������r�
��	�
�=!F�$sKys
Zt
�	��
؝
A��f����0w��l���e.	����
^J�@G?	�w$
+���	��[���`	��
�0:�	������8	�B	s�B��R�sN)�	|��h�
�H	z����ե��n�S�	:�r���	�
����
5C	q(�Oʐ
$�|�K�	r
a�
����	��n��"�;E����?B	��s���	�]��
��<� Gf�P
��	���	���8��H,
-��y*������$8
K�S��
/����S#�	��*���
7���2��rA
�vRq
�	��
�@D�
�����]	*Gb
|	+v�A��i
�
8��n[���
Y1'3�9*m
@�
��
 �-34 W�	*�
ԇ!��8IĤw�	CJ�2|�o
�
��	�	٩�Hx�
���
{�-_4fz	kF����
h0
�#ը�N����<e]	K�{K����eN���0<�	�y*+]2OUˍ	��i���	1��
��no
>4�}�,�� 	�M:��&+�Md	�� ����*��oJ"x&���"���	l	k�L(�
	�G�
�9��
�k	nM��	�	q�
�	�����f<
�>2��q
�O	9��,nX���a�zO-	��U�f	�
b5
qf	s�@�J�$�3	�#&4��@�	r�
L�
��<B"	��xƔ��	P��	�,
H	݊
/���8'	˫�#H
��Y�߸�s��	���(�~���	w� 	�C,i������

��	��T	IJ�	�
�����~�:9��.>(#� �	�\�}	u	~t�
|,��	�k.�~�E�	p�\���
�I
/\	צ�F��A!��ۊ���	�v����
��*FrE	�T��#$
0�	El�P	&(5/l	~b�:{	
��h��%�"v�
#���
	pW�
����	p�	��K+A��آ
%�Qd�/_(w
�x	��W	��	cO.Wd���	���M����	Cu�x�
L	/N\�	��	� N���	��6lj
_&L<��]+=�܀~0	���tF,�b����{\dK�X&4jg?��5	
��y
��	�2�R·�x
)aK	�AҮG	g.�[��	����	�W
�.	�	�
:�
d,U�
��	��
W�	sR>�#Q�	G��_�z(���(�<�0�[�	�l'��j	C�1=$�,	
��
�n�	M�!	.	/&ZQ���~��kh���T
Ih
6=
�
~�	6B
W���������g�n.��r��@$�
D�-n|�
���[���lU��	0�
݊	���z	��b��a�m	n��	�
��I	�> ���r
��BY�{	1kj���a
W��	�Z�%'�	�������n9�N��	l:�2��~	N�,�
X�vj�O׸	�6~�	Ɏ�S��-�N�n�	�	o]
s�@�	�b	E��\M=��v
b
N�e��/
�C	D�%"�'�M
��7��R*n��	�0it�q�*^=�4f	�j���	�(2��&�zo	����Nz	��z�		�
`�	��%R�	���c	tzIY3�8���9ƒ
D�q��	V�B	w%N%�F��^�
���N!�F
����E`l2�
Z�)<0�~#$�$��\H�]C�=��!swY�	��ܲ�	� �5�O/
��c$�����WLZ�j��)��5
+�i��
A��)	�	m5[\V�p���
�v�		���
L�Ki��ғ�����
@\~��5<�	B^�����
?��|	-��	�A$
���	[�U8�	�d	9�	��
OW��
�	q�
L����Ey	ϵT�"w���.7	n�\�nn��t	z�^��.
�����I5r�
��
�3
J_	�"{�p�
�_^
z�
�=�p�����
c�{a�ZjY��	�-P�	�Q��	�9�8�Ao�����v��:,S	*��}-�c���-��A!	|�S	?;W�@	Hz��.���P4)	Eq{
.�
�L|��B	�x#��-��D��<�O��.�
e�
s	s'3m�5��Y
:��	��	�(�Ƒ�yO���
a5.�b���9(3������=��3��U����2Y&..	��	x�7���	�q�K�(�
H�"�	�9�
a-	�?��h	\��	8z	�i'
�S
����
5	t�O�	�l���
J�D
6��J��
jfPP�6�<k��9Y m�
�"�x�s

6	e�
Q+�.R��G��}l��	��	
�|
���{�0
9}�I
G�	� �	*p�X�1j��
�>�V	��m
-.
=(
�d'�	���4��
X�ӝ���~�
��"�Z�
HU}� 4
;��I�	L(
q3H�	�_ٕ�)
�>����\$q`�	��A���`	����>����
�Llm!
��@���j.
�M�O5U
X"J;{o��
�S	Q=`�Vt�<�G	�*�M?�
�!�	*�)����	 i8�n�
�6
@�&��(
6D��
��	[G�v��	t�	l	`���9W�P��	K>4{�`i��4	����� ����%�]Ӆ�J>�����	�y���;��T4 ��w��m
�}3�	�	�X&���p��	�H��+�����x�	�����VA�
�z����Lj~�^
%�z�	bSP��Rk�%	u�,7�4�\��(�
�X6xY�������O	��D�=�=B�-
�r	���DU
�
���	��t�a
J�{���	Y�	d�	Ge���}���e�r��	�0J�
�N�u�P�� T
r%M
<�=@�2p�
5n
?GK���0�V�5��
c�Չ
�;
��Yg��'p	��������r�x	�p��m�
���k-���
��:v�M����
��n��_���
8d��
����j����
� W
�
2v�4Q���	r)
�K
����	Y0��,	�(
'/	+@CQ	w	��
N��&�˜��
���N
\�
0L�d??
	)

)(�s�	�	A�ӿ�T>�
i����
-S������s�9�	�?(M��l�?�(���	
B�T�	\	�u
"��-��	�7[Ap�k�
~��
�=
��	C�O]M��-
D�2��5gcqg���Y��%��w8o��)��:�'	�>�Ϡ����
,xL�	'u@��
1=
BD�%�׈
7s5	�d��ʺ�	�i�[���D�Zu`	6�
r�������W!�
���Q,�l%����1
�@a��5<
�N
�������D�g�zG>���N	
�=��u�
�r�k�0
�	�*�	f">��*�L3��	v$
�*t�ʂ�S	!5E*	�	�5|�� 6T���P	wP��-	�9��%�
5���	/}nv�-]S�
 ��W\|X�NU��U#
N�4�/0BXAr
����1<���<���Z�
��?��"���:�7���	�=�=A	��
/
��	�m�
2��)
Ax��8�;��
?�	�Q*�	��?f��
G9	ևH~Gz��'1F�f���	0e;���	4�8�J���W:�
*�
a�
=�	
�	�.�V
k\��	`������
ٯ��jC<3�ͫ�*CL�H~�m��+��ةl�z��
 r
�h� ��H	o�׫�U����	�^��	nxʼn���1
�	ˀ3
�)
t��p?��	8
@�e'�	0�`����4�N�(F]��	=$t
�&tq́�&
�� ���0���w^��[�	��I�	y��'Q�#"7������+�;�S�g�i�'��]lH
�o�
�X	��@lr���4	�P�����	������5��	$=��pPl
�M����
~�
��N��d�	��J�˖O�
T��k�*AR
�w	��"��6]���=���I�e��0�a]	�+��T2+{�WV�3�

2�}
)��u�@	�+�g����?�	f�^A
�	�|�g�#3
�v�����	�/	��\��+
`����"��V	Q�	�0
"	���0	xj-l�
a��FM��T)��2)�X
*#	y8
$�F�w� �O���	��
�0�6N��	�_��R`w��	P�
J�A��^
�/>Fj���rA�
��	����Q	{e�C!	��
�C$d����
<[	�J��k+	����
[��K���@F	v��	��	g���Y�	�����
��	�����	��
��Z"
�P)�:��	��
�����0y�v	{�	�	Y^(F�
�*�^����8q	��t)�d��
`n	�	rYK	�?w�Xg��	���9�nM�x�	�
�;����	��)]a��u�����v	}��+
��5��j��� �/Vh�3�+��-
�	1��U
Զ��H�A��e	�	>
�;K�	�{m�@����*�`��	&���	f��!	�jNt�
B�	)�+��}�I
��R0���ENy����v��mN�
�	v+�~F���r�����
aX��
�xJ
zX7+�
3C�7	�	�
����		s|�1�Q�Y��$	�7�	���-lD
ebu9r�,+��	h)Y		9mw�	��	ZX>�|��	


�	�|3b�	��'�pC)�9��	h�
:��'�g�s���R�
dt�0�4	
��\E���Q��LOE�#�&<��� �վ
��	�p��	��	���=�
#X�=ej�4h���d����¹	Z������������
DS
>�	�_
�	B�X[��
G���i`5��_T�d e��\
"A
?p	���
)�d���>b#w=

	�z�[
��	��|�	�'B�As >� Db�
!	G�~�	�����'���{	�
U~
%�	?��R
|�
�
��i�f�
C
�	�����
/-.e�����3�J9���q�L�g߇
��n��7
�_ m
+�L9����1	�C�n ���>X !
Y\MVX��
����a��*s
e�
�nJ	�f�`dz'������;+�(m�P
L�P	��?�*���y
8;�6�;�5\
�:?w
*��U
d�hӐ���,�54��ׁVzr�
H��	��O�$
�	M0
�� 	Aa	��j
;�S��E��
=����x8��[��{�R>���L[��O;��|	����������C#��M�-
�	K�+.�K�Z&?
Y.�+U?��f���1����Y�i����	4^}�v[
��ku
թ�X���I=�ƽ	��	��������	�/�p	PM���)���e
���		�	��	v�G�	y�
)?�	�T��0X����
ۇ�!�
��e	D~3i
L{
:�����V
��&P�]m�lj��U�	{�	�����%ؖ�B��So� ��ӯ�m	K�*;�
H,;
"l	]e?�\#.�f G�3sVO4��
?
�'���	�J
��(^::���sA
��
�d�`(zƛ	�h	��H8����	��Z
d�Fq�8�7�l�y
��(�g?l;���
��	o3/�
�
D�)7����e�
j�
���	`�	��MoӦ����t
b`���}%y_y	x��Q�\�+Ky/U	��
5���
���
�H�ɋ��<�Sy
8�GA�X��)�
.�	��	�|	A�PC(
v�	[���!v�
[�1�\	jL�
�(�	�

a��	��
+P��
��j�
6���	�!�O�tk�	�����q��	}h�	�	�v��P
۷<����~%�>�|��Kf�'��]���=�	�	N��(�	��	�����^�
�	��
���^h�	uw	8��S	�q��2���'�/�	�A
V���	+�q�/a�
K��U	��	��
AO�\
I�
q�	~7	��1
�“}pH	�Pm�)2.��	����9I��<�~}�����8
9���~��[�-zÿ��T�D�=D�)�M�<��
�^V�
�����
����z��=4	�/	�"֫Վ	O�
)�aL��k��	�>�5�h	�B
�����q%���ag?�
;�w/

"%
��|�S
"	����
u]��m�
G�-	�/�u	OaG��:�N�	��	��\�	{��D	|�����?��	��������qh��}��!B��R�3	�
&���	Tib
��.J
&a���|mp��7����^	�7q��	��\�F��͠L9�kF9\��
x+������	ʻx[���ٸ����]��	Kn�L�	�����uX	����t�5U�
E�>	y7t
MHJ�	��	z�
�	k�v\�����"��B�y
0�A��65���0�}
<�	�-@����!KR	�A(
-�
7+�I	r����

3��(<&	v���	�j�	g�.��fRh	�+Z����
=��8	�UW
hK�^X
e	Z�	/�)^<�
S�4��4 �
Y�	�<^	�[�O����	���	7	u��i?�)A�P��	��~C�W	��lBy
0"
wXX*
�s�?rJ��	t	��������� /i
F�
#�ZNd
�%OV:2<�`z��Y���	
1�Eώv� r�+�d	D/3p���^	�-!��	f3��
`�
�|
�%܊�?UHB����c�	g�N�<��0nF�[
x�(�_{v	����	�dֵ������qA��n�/�;
��y�G�
r@	�(�
v2�p�4:q	�#�*	��*����	d���I�	��/}�V%�ٕ	MP��#�
�D�f	�I���C�����@�63	.���jq#����
=�y �6È	�r����&	�+	��.�[	�pYP	b(�2��5�	8b	�SOq�M�	��֗I���1�?)	������	�'
�Z%�
z

	��	�N�:E�H�L�;H�
7�b>�
7�
?�,�	��_��K
p�V��}�������!������+
H�CF�`��	.�	���2/H9n�	�	��ڈ	q?i��)
d�
_�j#��3��9m�	�"TN:	�z
Z���	�xV��s
�d�����
}r���_4Ob	��H�AH��,J[5�"x�	�����;�	�#��
_�
9�	�\��G���
��Y3	���
:~	���!<����-�!t�	�[�S2�	:=�gc�
!@
Y��A) �
���W�u�
���	�s|M3��I��uY@	��	��ސ���6��R�t>	M��3�n���Z}����j�
f��%	���p�p	�^�
6�ߊ
l�ҳ#\��C���mԃ�B?�s[S��+�CeS�>N�*
߿Џ�s
 w�X̪F�
O,	�	���;��+b&�	 �	�0�C
����2�y�
��z +7�����	���*�`�
M	�3
�t
�%�����r	��	�v��ԇ��
p��	��	�5�U��9�.
d�	}
�}�]&�9���s���2���	�����
��.
?�E�	��	Z-N�	խ6�a)�	�>2��gȾ�N
�I��
-|��
ߔs��)
`�m[g
Փ���7#�	�=	��Ju	��U{
������k4��7�E���`c.��	�� �Y���5�dWV
0���
*N	�E)��	��
�z	G;�C|`��O	���v��	���T�b	9�,�_�/�K�����	��,�	?-��,���^	N�x�u"��c��
!�z�.�5	
M�w�	�����Z!��	x;� {	�k��ٿ]���I�
A).~M	����[.)�XM5sd�-�t�	�b��>�����9��Top�n�+�	o����ЫB�,�	�
��r~���1¼z
2Gg�Ҵ�T�/a	h�~x���~9��Ɩ
2β	|]M	>���B	e
w
2�
m�SF�W	j��	}=@�����c
�?|	4��	\3Z���<�	�`n�;��5��ܮ�z�{`�+��} p4	�Tm'���v�
K��-�
����	�2
v��h�NM���qG
d�zi���[�c]U`�I�����S�	B�JZ�	���0��	X{	�	]�˚2
Ż
�F����P�ޝ
4���f$�"�2	Q�j	tdm
�k	.��q�RA	a�
`Ct3|���-(wM�(�
�ݹ�0>]2����k�
\@���J���i	L��0��[��	�f@c�����w&l���$	���.�	Rn	�`�]
O}�O�Z?���`*������#

�4�lm�����
���)�1GK�W.P�����	��	)i�ʲ��f
!9���E0�h}r�	3
�	gy	�	\,���
�	�BJ��A��1���_�~�q�v��	��[��+�
K�FFT5��a`Mm�F@��y9
A����	��#s��I0�"/!�
�����
gL/��T
�	��ȑ%�S�׀��?�s��	v�S)|	����l�	�,	�M	����	��,	��	��x����7T�O
�Q�F�6	]$G�.	0�	O�.<#��Y?	D�BF��c������
���
�I	������8�%	��	LoM�	p-	A�
z�J.-
ڔ�K��=_+
U�'	��	�
/�	\�	Y�ed"d	�o��O`��r	��/�)G�@rH	��!�ս#
.�E�'���
7Z�f�������3	j��(�
o����jA�����
L�
�e��v�	|�
���	^5B�
v��"
�rlE�	��	�)	��	b���	x&gR������h;5�	f�	v�
C��)��K������i	/1	Q�fMX�	w���+��Upw�
k��	tL٪~R"%w��	��;�
##0�b
��_�
	y�n��>��Q�s�K�l�
ڿ��
Z�Ŕ��
oJT����l�pw�m}l�N
M�D	����
O�	�LY�R��O
N�0	��gT�	�>���,(Ki-�+�i�
��	
�	���J�g��1�k!e��j�
�T �����>�}	g���	F.
��;k
m�_E�	�4�V|��0N	
l	������	��
cL�u�[�3r	b���;�C�
�	�w	HM8�	d�?�x
C�a���Q�1�=
P�	��ׇzD
�m	���	B�	5/�{k�>�R�����Zu�Zo�	c$	��o��C	�Iz���	:m��	��A?+�	�	P�
R	�P�
�P	�t4
n��x6��U	��	���ޜ	}
�pe�x��,
�<�
����.h/�	�.$����	S
:���~
��4��	�Q@$
Dw��\��	H�f�
C?
�
��

��U	��ԙ�25��G�'a
�y����

�O	�M�yd?G�����9���	RB����
��mfK�xz�(2l��g�-6�hvP���9ν���LOj���yx��KJ1�a�Y���T��H5"��o塁T�	iEWo����?�}���9�%
�m���9!)�-m�c~��\t��YOo�:�eeWH)�?v@�IP�S������[��Z[�q����+��km���`Qq]y��%,�9��?���)A���5Aԋn��e~XrU�x���J�0D]�).�?�D܋�&lI��oo�
\�3yGc�A��H-�#�kv��V(�4�����T��H�)Tb�Zy�E��q�K䰦|q�%V%�'oc�[�F�#o��t\���Xw�:����Vk��B�H)��=ƿE1A�Jz����ӵ��O�A_��~_��i�Q~���N�o��1n�EW
x+)JMU03g01��̜�b�©r����μZ�zL�j�CsSS����ܜD��"}^3��
_�&���i�L�[W�F�x+)JMU0�`01���ܜĒ���b�cL���Ո>4�wട�_�cgm4x+)JMU06a01��T���טf�<4u?c����P���+��x+)JMU03g01���ļ��o�'娄��>~`ݤ�Zs��ATx����$2��x�a����B߻c��	�x�W{o�6߿�n%��d+���4M��%݆��Z��L
$����wG=�8m�
H,��~��<��~:8����<�{��^��P�+�Ɖ�9��=����0ďçp!&�	����ޥ�Y���'��1y����3�����,
���켑��,c�{1�3x]���
W:�����A\��T��$����$�"cF�Lw߇�Z�)�T`!R�!�@�B�ϥN�T+��z�-���\�"'���\,��٭A�Ѱg�^�9\��+�ϥ��4�"/��?Qq���g��r.WZ�5���!=�G�˪��'W�ᓓ�6����Tm�)�&/�4D��\!u�1��\hò�U��������޿=�'W����9�-�M�10�����u�����c�4.w�p�)�Yb�0�AС���m�$����Xs�f�u���>B�RAI\���:TiN��N�)`�\�=i�h[f$���BO�� F,����Y�F����{�eA5�,6�]مNELE������T�h�)R����"��O��[�]��pm�@���
��G9S�+�ڻ9�n��i�A�g�4ϊ8��R����ȷZ{�w�Xb{�f�L�Ķ������~{oa��~HaC]��k�2-!��
�d��Y&\q{���>��Vl2f���{=JQ]�Y+l>���]#$�ޜ�{�k�g�y~y�����ή���������}�	d�6 #�
�v�L��ۦ@k�4���t@�U�9k�a[��w6'��aa�k-m��)Y��}i��F����5�fWǭ_Ǖ��8�M�:
���B�XL�Ä���}-DBOEV���:(��j����x���(MS~�i�nev:9��:8H&�D�%���e!p��ې���s����<iʚ�v�kg	U�I��Z�7��#�}n�q��1t�JP�7�p[<���W�"�8�#!!�0�e�)|�Y[�t,�0+���(ĈO	�9SaB�/�9�q���5]q@�~\3��y4,�'U�/�,���.�V���Y���<���JPl(Z�^bY�rr6E�W��!倞���tkCg+��>�ʃ�p&P��m�P�����J���/�
GmB(mtZ?T����n#�Ed���E�"3�z���x��\A!ȦV^b���b�1��[	����q�k5�	[���*�C���W6@}�1@>���3a�:�?T�y0�'�O�T��,	׃���,r�<1 �T%����;��;[�dv�RW�Yf-O8�RB6�AMC\�c>��i�4w	(*�&��p8؇ӓ�����]vʬ��\�W|ܬp�3�y��[���<�e��r�x���~J���$��������-���)�E�-������a�Ǧ͹��(�f�ݖ|�S��
l@ڢ{t\��W�J3��
�ѫ�*ۖOR���t�ɑ�j,�K���	w���^a���nCԚ�n��M��ԓl
r*6[�n�qG��cp����;-P
�fQfЛ�#1�I��},��U�/���9��(�����S��q��`��-z��Z�"�����-���(d��d���̰M��N����6*�8��4�85���z��J��x+)JMU017b040031Qp�(I�+�����+.I���+�(`�#8C�X�����k^�mzة2��n�9�`=}��}L^p�{X2�չc����z�+ss2���gp[��t��^ݯ��z×���̒TǤ⒢���٦�a:o^�u�xV����	��Hj��RK ��`�s�f�
���n]��c�^{��<�J�ԜT�J�H�b-��k\�>LY��u7�ʐ���<H`\5�2'j�Hżb��=�6���)D��I��{o��h�lp���vo51����,,;nv�WJ�~���ƛW�A
K-�A1��JwwLY{����Y���l=��a+T]10dBR`�m>����A�yn�B
~��٧fl�q��Lx+)JMU0�`01���ܜĒ���bߐ/W�O-a�Uk�Fɯj��TbS�x+)JMU06a01��T�|.u��k%Ҧ4�\�g�r�"��x+)JMU063f040031QpL*.)JL.q�(I�+����+�(`�S�sG�fݚ�3{��N�X]\��Y����
VvT��ѐA�L���u��kj��*s̓��6K�h�J�c��"��z��U^T�g^qIbNذs<�+�T�y�\7�uԧ�bTen�P{F��u۹2Q2v��m5��׿����gIjQbI~���蜘�=�q�q����>ܴjZPjzf1P���Oh������8�%��:U\�����
Vƶ�["_�c��,��7��*U�����n�p��W[��p�}�o}���ݓ8x+)JMU027b01���T��%�Y��%���6Ezk�ꎘ�y�ĒĤ��T�S&������2m�o�?J��>Q�ZQ��W���� ��nԲ��xܑ7Z,�k��5C��-3/%���Tu��J������S� ns�>DA@NizfC����Ϙ��v��w��}��	� 8�$����J��G�G���i��O������(����P�W�Q� �{���a�����Z�i�"Mw�1a��%�х�J�xڙf���I�p�h�\m�nEx+)JMU0�4b040031Q�K�,�L��/Je����+T��%פE{8<��P
U��������ﮗ�°��|��a����sm4o����C�x:���2�=S3�'%۳��e�VK��T�J�\]|]A�dIz�<�`�+��V�^�V8�cb
I�yb��B���t2H��]���v����ũEzY�y7
��g=<�;�o�:���r��,AW������r�L�W�2W��`Ngdz�3�fB�+.JfX�ț�b�\�iߺ'�s_��7�s<x+)JMU015f040031Q�K�,I,))�L*-I-f��.��5�i�G��[>|�/j��Iefz^~Q*�OF�^��=/�&-�[�á��j�*gG?wWw����[�<;��Nj���'���nSS������Vj%�xJ・�r�˜}םzU�������p�Lͤ��l��{��[-Ŗ�S�*	rut�uYٮ��i�ͺc~Z3�*[V]/ceb
I�y�S������ȆV'6(�A�H��-�/N-��*��cx���I���;193�}�U����0'?9����}��L�7��>��,�?��� �4=3��A�*L�g��ۙ�[��%�\W�"�	jTq206�3�K�
��6_����T�ImW���¼J}Ĭ�d�,5V���z����γ)��
ᾲ�x+)JMU041g040031Qp,(��LN,����+�(`�b7�=UW�׉�����> Pp���M�Ka��7�l돟b�E�I�u8%BTx����$2P��+Fy�?�;��l�t߶�� �27'3/;���!kz�4�u�/�%H��&��`P�G�8�x�Smo�0�k�+���Z�v�E����I�@B0��R�$����e��ҡ�w��2�tQ�\|~���8W��p��'�yk
ϥ���T
{�n����/�YyU� �F�1/��_�g0�Jhm-jB�p!�\!��N�*�W�/��u�D��;~%�� �L7R)_�ܯ������XI����gA�a���j󤠚� ��pD�n�~Aڒ�bJ\�PMZB����ґYzj��S�:R$JxYvz�5˒�'	��.��m:��#&����T*�v�8�_�e�a��[@eq�ߦ���J�~�[�Z����������4j磮��I�x��~�V���
i\�ކ(w��֥κ��a2�;��[Q�ъb��6�t}%����W���E�p�05(v�����'8E�"����)���O珃�߾��oĎ�\['�:���4g�_���^�ϱ�oZo�����Ex�UQo�6�k�+���A$�ٰaN��M
4��I��f0h�d��H���xE����d+i�=T�L����㢔8��_�;��.�A��7�=�=��Z�eavN�/OFpxp�3D�z�#�˂	8gBk���W����7��˜z�$��*6n#hF.~�S��/K�fAk�_߇�Qi.������i#.�)�E��*�(eU2#e���(�BK�"�
L��2!OY	Z6*EPXK͍Tk
��U�kF;��hw'>���j;�p��r)�v����؝��1w�LT9<����X'��y9����kwo�4�(Vר(��dZ�
7��ΘA��"�KӅ�L���評4�� oDj,�XΗ�ȡ�:c����gA���M���]�&�%�0��N��Z�8�Sԩ�=?ڬX'0��F��6�
�-�ߴ�F�Q�PL�E0:r�<��^(0m�O)�!����3`(9_���ֹw���&i��}���G��1�x��b�U�d˜�m��W9/q�\:Z��aj�f�q5�Z�fm
%W pw׍��Ʒ)z2u��0y�v!
�a#�1|��}�2��7j	�;�ܻ~Ve�̷�9�a�_�?9�18�k����{l&I�"�h�p
�0�>X6L��qAM�v+i�d\,!���Xê@�J�n5�e�&��N�t�8�V����u�G���Z&+\�r��B��:�27+��$�
�2i"��¦Ra��S��y��9͖2!�Y�0炦�|6�}7?���]]����OO/�.�nn���WזGB3�|3f�p	�*.���JH��<j�9��t�S?��w���p.��:b�JR}���YS��.�����mǮ1=���w꽞�KH�H����[vWD��(F��_w�њB]t�\XG�9�Z�&+E-^�pw���a7��E��.����v�r��I����>�I��7�Oj�
lV�A�@y�m�O�x�j/۹e��(�؆fe�Y��=�C��.�h+��å�u�ɱ�q��a7�KĻ�J�,[CAc�^��z�`�MN��Va�~jޫ�<��ĝ�ۃ��͖�7��F+�ք�.�yZ"G�����x�]_s�6��~
����R�R�$����2�v<��S��m^(QGRv�K��.HPQtd�NBu��I\�.�]�Q^D���~��O���$�S�D��]`Ϯ�JK��jy�����j	]�EBqF+�H��bUj˲�7�k�.4��]7��IM��ם�/��EI5�Z�j���U]/�����q1_-'Ey9M�xjZFD�,6V���y��l��y��46��|͚f���%]�I4���9����ꌬ7
uz\,j���+R]� �B��e�~���\34#?�$NiھN_��-V	Lk���ß� ����*���A�iYe��mM��~<�Q6b�m}��;�eVK���U��ݎ�Y}��&����ji��嚪Ɏ.J���^���k�L˴C;
�u�(t���B�]���0����k=�?�$���-�,3�����@��Bg�}:�x�\F�qA�Qj���P�yT���r��Ax�ó��Ğ��q
ɳ�$��V'F^�D-�[�U�b\9�����^��#QUOE����%`���E��07k�����4�i
��ɭ��@�,��
�6a�.��?�:ij's6\�8����i��s��ƋW/%zxc����%�	�
��777�v�Q��aS�_2�	��2["�����Xh� �W`�ʔ�T�;P�u���
��D����)�e%�o��MQ&j���K�6�y���x��@z�h+�&4X���j�\�{�UՊY�Nt}̙����͆���a�%��f1�8u֬/�i[���wf'�b�_�批a6�����"U���bq�KBU䛫7��2u�M܉s��J�j�2eY$�R�s�I�؍����C�2�|φ}fQ368���˔4�n�L�BɄEꐎ���T���\I[돆�$q�E��'ֻ����o���<���!������A��]#�o���dMfC[�f������5�G��݅�gP�\x���o��w���b�>�q���^nv��l*b�v�y�Nܾ�&@�kd� ��Iz�X�֒���al��wt?�<~HL+�9��^�	_g�.��p���˜΁bM�Ьw{1W�KA��料�
�\�>�qe�1�]�ށF��F�(�.9�A%�᭹Ć�ؐ��Fפ4��|٨�ԮW���\����EQj�
�
�~A�2�?�e?�Y��5Tž>!s��=������!!��f���__��`����"i�i]e|���*�FZs#�IU�	�4�؝=>=a�d�w�W�7}�~�et���i�p�J�V�IƼ��5x�.r��o�K�v�m�X�ܽi��|�Zd��A��S���HC�E�o��%�
����T~�xT�+\�0Q��t�kd�h5h�`��x�FT��J�i�ȗ�w|�<�0��H���
y����ͳ�Eν��י�AZIq�?e���$���"ip��ݡ[����%��ة�ܴū
z"3���K�h���`-U8��:���{��4�gi��s-S�
Y�.2�rj���"�Jީ�NA��"m8��a��c�����8·;�j�/JL�t3�7���ީ�`u��6gtI�6d�٪$q��I�ȝy��al%3"S3�l+p��Og��$f�ž/JB�LG�9���<���N�@��=P���\ovI����<U�A�㱭��/��L�h(5s���OI���Wd�c�Js�];���a��.�)�H��	%�$ȯBH�pa�&�EEY��O���_�eI߂
�� o��f������7�r��W�@31z�p>5B��0�$ɣG~H���Żb��Q�M�O���EM��L!N��'��ﰳ�u���A*ۀ�ۦ}f�N<��5?Ru�̘-a����5�í��Â)��a(��fS׉��tI�~�i�$�%Q�qK�ݒ�<�f�Ԋ�[ç�#e�J���逎��zc���F;!|����˂�
�	a`._��_Z�����^�zL�����@�<i�C��7��A�6�0�|�w�xQQ��e�,w`<ń�8y���<y�~�X$�yg$R�<��z�KZ���Sr	��]���oa���䌒�-?e4�j�ƕ^{�1���C�h ��!Je�:|��o6�9�
y�k���{#΢{�r#ނ�M�ΧŢ��dn�Ǎba��e�>�X�?��{@��ύKX"�૫���
DB�a�љ	[%�A䧖�(�ԷBϞ���q\�[�8�%�92�F١�#�*��n����v/(EVAdK1i�K�������8?ٚ����1N�Ҧ]%*EK�J�+�o_>��)RLo��?���Qզ��v�U&}�}@P��w�c�
Y1�̓'�'S��V�K#�m�S�i���sc���<�c�G\�vM�0���KӲ��؊��pȆ;Ċ]���]�s
q��Ea��nx@G#���Zîhxş~���+q��N���4���L�M?մ�W�b��?��Ї��:�1�b;J��c�|;���݅�׫��A��9ꢾ����xz=�Q+��zs��粏����ݙ/Q�
���
�Юm��d6�=�DԷ�`6� u=�cǞ�&�gD�Kr��$����A�c3Bχttd�w��ƈ����o�ͺbď�Q؝ ����G�
b�4�4��)�'쬂�x�W4�w�8{�6�ζ�T����|#�	E������&	�=�H�g��$-�ȣ����Ax7�v�~���I�R��1�ă(2uM�I�����.]v�@���=��#�]�!�'��p.3�¿��=ż(;�B��� ��.�҈J���$�L�QA�4
S��+-�3��O��z��|����嫲�w�*&�Q��Ͳ��w��3�����sT�b����@ih�~L�8����ؚŰu�&�5�E����}|�44;P:x��pR�;t�h�-����IH:��`� ����~�@ih���Ѭ�߇�}��%9��׻�b�D��Q�b8�=������,�U���H����9��m �&`D�~�m;���c?��y�����OH����A[�J�4�6��� �`�B��[����A�cB���}�c� ��b�b�YL�������%؃�2*�����Y����xUObL�aoO0�{6�����sAo�����cF�?�|_CS7|�~���n2f���7n[���~���k�`	�v�vɣJ���@
0��Y #<x!��7�B$��̚Xq�5�$Bek��6i�GB�b�ĺE����)�!��I��- �
$�ݕ>�.�U8��F$�RApsۍ�E�cJ3�����ϐ��3�̚�@{vxn�8Hʻ��O�>�Td��m�f��tRg�$��>I=Ƕ|��6!��"�})̚Qu�x0�lP����!	s�E�eP<$T��x��;:��vp��r}H�Nm��;5j��4$Z{v���x�X���Uy��i�
#����-��_B˲(�0�"��,t.�xP�!o�����d��"wh�s`�=�)Ձ�(��[I��:K �[1vl�9(���\w�s�A�^�53�;q�Blc=��}�o��O�">�ӊE�sJ~~s�
7�4k>�@~<�W�
��Ԣ[(��F%" s޲��<dz]�	B�3�9�n�6��i=���n��W�B��>���0U-�j��V�ʵnU��;�H�D�z-�On��$SnX�yvf�'�E�䓻%s9�r�:ZW����mK���K I���vǐ7óɌ���Z��5v#��)�?I-�I��SFG�#�c꜇�t+V!�~HG��<XGe79���<�Z�a��b58�>q��^o����F���;��PK
��?(��7�K��$7	����o~����6J�A4�楙�߾'V���G�;�h�]��8Q�j2�2�Vn9
�X̺�PȰژ,��+�<��3���v��B#<넌�#��xiW�U95�#.Zb�
�;q!»]�iGk5�b������PRS�_��v�|57�^_�V��x_;�_양�䒕⭡�KJK�ra�h)�x�1]z{��Z��=^A"�94Y�E�@���=��Ͳ��>/h��.��A�����',
�������x+)JMU014f040031Q�K�,I,))�L*-I-f��.��5�i�G��[>|�/j�����
3J�*C޽y��Ó�`�D���[�W"�����_��P�׳�V7������$
�<�������B�<�BC<��rS����Oi|p�<_W��S/�J}<�]��]۞��ԓ��Y]r�2~����}�P%A��.�� s��
7gdXmc�A���y[ޢ3!NO��cxu��M��__��a���&��?B�H��-�/N-��*��c`�<�����;��Ȝ�M4�Wj�+��O�f�;>��U���廃�\��çM*�*,N�r^qF~�^A^:��K3��w��<��
�_�W���(�a^����
��Y-MI��z������x+)JMU06a01��T�l��΅�B�޵b�7z_75�/ox��Ɏ�@E��+jou��H�(`0��mvU`\f*�q��.������ӓ��ۺ�F�B���0�2�AU �J�̣L�p�$��"�5�2�
Ҹ1Ҍ@D���"YAXVy^��I�H��%�P��.�e�A�tF�A�{=|m?QW

o-��{��?�@(�3M��
�r/��t$�s��ʡ*���1,{��@��]=�|�����4tݘ�:^T�5N8�^�f��Q�$e�*F=]�u��D��%����sq�������,�V�ʰ�2�Лn���� <ǜ���+ǧ޾|��9`O��'��ޟ¶M�%[WgS�ou{�N9!�iH�)mzwۣϤZ��"?#`=���=�G�$��x7ˇ~��c�n��m�ك'b�K�a������ڛ�[1��i�a�2ӟ���Mӳ�	�������	u���J����V�C|��x�K2N�K
iُ�c�'3FsT���4����P�;��bcwCke�m4�o�S2��x
5�ٹ'v4b�2$!f�D�}|p�#�Ow�U�5��)�R1�mݵ�K"L:�`��*Q�#�>=���`lA��+v%�˻�%;�p3*x�VmO9��sU�lI(��jJåtQA�F��Nj��Y�k�l/�R�{�/�qBxS��zמ�g��=I�^�z����n>�_>�
;�����Z��6{�o�׀������83��p�(W@���l�R�~� �i�w��|��v�ũnT�R��un���,M	�	���[݄K*�[[�*�(�p�Ι��V"��!��h!R~7��@�S!A�($�����L(H�Ŵ���Y����$�*'(q�0=�s�Fn�-0��,����3�ޚ�;?:љ�F�a��*�T��g���V��՛(-I�=�$%J��|��tJ��z�Gjs����)%�����9�{#&�TF~�ai��u�9���!��b�KvI4��6�0�4jY$:�s�%H�/-���o�r�
�q:��"9.G��&���&����>�N�?�������@�^����;kv���[��%5&S%a�A�Ԍ�2f*��s���悔Șpb����!Iu!�[���P1��}¯_���2�K�S���q�8c��0c���$�A�# �~l�K�����tk�î�nv���nv��N9o��
���3�>�|5��f���u���l�� >�{'q���Y/�v._��·�y�?e�*���[�n�M�ef�|G*�U�bB�z���6��}��Sͮ�����l.ge����Yީ����`R/֛t�|�~���������l�\o�i����|)�?u���}~$r�ѧx8>������Y%�O!��zO��񿃣O�ó��|v�n�vЭ;=˒��8w���D�n4�A��M��:1�Rd�,��q1şFM�����``S��fjl$���_��L��m�A��C㫄�朊^�pc�o��׎����O|��;�9\�q>>��{�r�J<���*��0��U�w�Y���ps6��!7�|,f�K�E��R�eA��zƶ绚٧՟��Ђz��o/dKq�y�Y��`�Rf�h�������_��<P���t��<��=�ܖ�g�^��=`�lm?XE˴��\�l��o+Jx�Yo{�F���S>S�\lJ��I�&�C(�z��=W�׶@���!%��7��Z�l9�_��jwfv�7=��)����<�1[f;��w�>���%�Ky�x������6~=���� �gA"K�΢�4fp���~���Y�۽���H���0�R��(�3�Ν�_Q�*��<���q�	<��ɻ;w�E$�������4]ŁL�X���0MD���Sr� �4�� ��<d�Y��H���wwv�`�D�g%��&�߫^p|�`�xg'F��y�\��,MX"큓$��X�=I$�s����gN3���ԁ�\��Q|ꮡ���2��a'��A� Y2П
ɃPW���QȠ��0
V�v���B�	�]��ћ~zp@JQ�0K]���T�P�4��3!:(
s�����x�)V�v��I5R���)��Y�ਈ��<��	����%ߡ�Ē$T쿘1��(��I�,t� �,�]��"��_po��I6AkK�"�UIJ���$$�:�<Z���H��,�H��sv�ۦ\F�<�/~��ɗ�b�W(�gp�i�z��y�D�#��W��Xتb�l0�i��
���i�������:��xsU9�����??L����'���f��1���y���j���)O�%��
�ʓ+ɄD��:p�HR�~��s!���U�(f]9�E�%�Be�-��۴At��e��y�J
�B�
c	ƣ��NF��p�o���Q�$�$?�~^�W��\�Z搤?�:��P�7PL-
�0�
��;578.
��|��(�Ԑ�f5�5�yy�rP�����W��+�a���X[E�I=V����\:ֹ��z���f���]B��6�Ո~k��f}!�'
i���6��cxyz�����F�d6=h��9�8W��y2-)�Y�^L@^�B�D2�G�^�+�����[�X9��Η51�}`a.��,fkhF䚻�V+@3U5Ķ�^P+��׃}�@��‹�a�>X00�ߴ�Eh�J�!�i�&)ͻB��Vq���f��FnJH�V#�B��2���K�l9)ӹ�Ĩc�/�������+8������'�h�J�GMNfӖsc��@ܭ(tMe�+���3�9��Mٻ}P+���+��$*>���g�!�g��[��ʵr�U&/������<�&�<���]�x�'�U�����B�Фw$�hڠ֣�������(��Kl�k+���f��p��A�S��	#ؒ� \�C!�q���8��,�2lV|���x
��םh_3,�%�G�oB�)�
����`�>�)Ʈ��9�����v��N+.b.(�
����xq��M��<A�Հ�L�����H�<����!�[{����E�6\���Z�u�]Z�к]8�>�䀆�VlHLwkJ��#l����UESUV֝��q��
f�(�.�c�̻�I�U��D���y�	���l�J� MFb2�����Bא@;/p��7��l��'Lѱ��9��%�Vc�$�X'��LN{�Zk(�ȩ���IT	8�Ҭ<�څ�]h?B��)�d�-J�����^���θ=��ލ�_�[4�k�f1��j�{=�Pm�7z�Q��p�d�Ӽ�҃���n~�[A�j��t�6��qؘK�C��\�TT�����~c8x�������)���� ��?�hfA��Հ���~-��b�#���f��+�Ydc���p�ͱ���*�8nӌ=7>�jp�=�`��Ƶ�>�y���6p&s���������0�B|e)�b��κ��:Nn�eG�$���v�>�]OQ:�\���p�&I�H��o���7p�x唂�A�Օ%�
ŵ�FQR��Q
[3N�==���a#x~��QpO�5)h#����_f��xb�[)�W;�R�E��Ԇ��t�o����X�����0eBgv�-�+UD�D��.�]gP�홶��%�FԷ�г��У�x�//
ϓwIz��\i(W#�\.Ǒ.x�+���/���ܷT�>P��hS��$�"�VH�7k�F��m%�U���'��z  ��U@�X`�\�g4��h[�&���Q�ܮxb^����^/"�+��I5��ǿ�n�A�/�347?�UL%�ζ��JSV�h:���5�TW�Њ�JhW��ʊ�<���9�>g(�
�Y<�8	�n�����ʳNb(�y>E��c{)[�����Ȫc7��[�
dݳ4G�M�P��U?}�QT�:3��x}��F�[��p+ͪދ��ƥ3lw�2�
笾{GWm��Nئ���u��f^k����^7aj��:��*�|���t�RU�
h���7G�*���ZT�-i��(i��B���)���$T��%&�[�c��޵�\2�F����v.�4�8�n�e���5)'+��&B''x�:{��vg��C*�&-{m���T�ہ�v�����%�.OU��V�Z6�ͧ�\(�v{�k��B����똈�Js�>+	Ԓ_�,/3F,�D�Y�[E?�3�>�JZ^�dq|ZD
)�E������LĞ$�X�Rk��2�nW#vcU��Z�Z�޹�?�M�x�Tmo�0�k�+NS��S�6
�u�c�6
�`�S��M���cG�����w�N����O��s�<��D�	��8>��<���F�o�/����qV[��Z��ᅡm{/�R�\�%W֢���nD6�g�oO��R��A��X,�.\t�V��"�l4>�BJ�ń��<o�=+���n�
Pw�F�8.-&�Dg��Zg�;��]�;�VVS)3m��	WZ��K��0	��\[�Y~/����n.W�����,#��kY̅:���ݑgb^Nz��l���C�Z�rO��(s4����Py�F�{��U�/�υ�A��,�R��7'$QM$��^ƺS)���u���h�F;LNaV���g2 �w�U:z+v����E���g�<(;���Y�z����;���GeM_e��ҕ���:
I���L
�lS?��W�
[
A��rۥ�0��` l)���KSւ�L������W���V��F�S��;ÅT��1���$!�B��J�,��Q�xY��˄pp�+cFj�h¥Z@��
�`�TßV�x3�Ă�P�yN�ǃ��ΐN�F�l;���s�ˍ���.-�+�C�j|W��\��TrL�'B!��}�bކx�-[E,�]�H���X%�x��,�[� ��s�f�|J���%k�b@�lC�=��[�p~�)J��0���~�
-}^�aq�p�������KCS��O*���0<�m�ݰx�Vms�F�W�+6�����i3C)���cS��#�Ü#�4w�`�����¨N��v�}�E$�ӫ�o~x�>^ŵ΋5x�2�W�fe��7p�<x��./�����Bk&4�"�)_/"G��mpW�ĽNg�ٴ�=hf<��u��g��"&���4�o�W�4�^�����rp�!�p�J�@�;�R�#�H��{+�BKte)���R�@�D���F�{���j�_3�xr����0�������VK4���R�{:��`��c'ff��0�DԷ߯s��[
�!+�R2c�<±o���3��$ӽٕ��D��Xm��vg�5�(��B�&ߨ�[|b%
a���,ɒ�$��������0+��}��hfΰ$��Eb��;�Z*��3(n�:�cV= -���a�]w�A:�)k�8ͽ�D��-o
��]O�F���t|~6<�v�؂�V�:�k�`s�j)�
��;;�<��`p�*0�;���oW���~$���4S8���4�}���W4�O���Ģ��l�!�ٰi�32{�����f��cw,HswG��	�fiEwcȖ\`��OF���&���6uJ~~2N?�?/Gߒ����/>o��6BP�����0�5�CID˅4_��l�#6gw�����=�4N�Y)��60�H�/�,+.��u�fΡ�9J�A�O�H�ޚIK@�2�k#�
�֎�¹GZ#�!1���[݆OT����r�8�V�j�khP�\,���A�))�Pk�5��z�9<�ݖ�� ��D;�����_���H��:��ʦ�l�]�\�!�c]������#�v} �}?h7��_c�\��ŴzYŠ� ���/����ٞ��iL=���ɺѱ�yk���8�_<<B�'P����Gk�X�����4n�o;�ۯR���b�vU:�;�q����hI�	���=5Dc�Տx8T7��a�:�c�읗r|�P��X���fa�7��!xB���s�E�+Dr
�t��a�&<��&0��L�5��Y��uJ��:�q�ι:�D��9h!��W�JCZr���Y��:�����d~=���۵��~��:�Ѕ�pry~6�\���?q�M�ݪp�o
�)�O՞3Ȑ���Hq��
�2җ��I�+z7�x7����M���
�`<�-?[�Kɑ���9����k6,�刜���-��
��]�~�{��z�����ߖ�5 >(>��W$�4b��,�}��8�L�g
��T`<Jb	2��[���@#�6Rl)�R1�(ݴ
���e��x�W�r�6��&�\�t�5Jm�J�kd7�L��@d�!	FQ�{wP�r�P�A�7�={�R9�'ϟ����oŴhD{{
؃�Ds%��f�W}��׆LJ�/�?=�S9e9��\k�k`�.E6J9�ޝ�L�):Q4��Bc7œ�����}���_�_�����̭��g���9<�C�ig�G�fZ��Dfэ�Yʌ��^�~��\K,e"�)���2	KA�R%/�F�9Ə��e\wN�!�z.̕[���HR�5�mD��|(��w��ś���y��\@>�}�iE�)��Q�������~��VI��A� ��I��ϵ������#NuJ�>m�A���/E̔b�]��x�I�'�¿�4�'�;h�D~
M��nw04��|!�L^Ae�MY��4�%�c�Ɇ1� �eno҆n��mX�";��W
��ua�Qn�����"�"����A�??[ԴR̭C����
��1S%g��\
�x��X�8šg�c&R>��ɿ�\��.��
w_��+�A*HE�AN�!Z�훳�����R��p<0E=C�v��4h���H���M�l�O����\s�<ٽ���`�_u�k�=9O��RQ1�a�v/C�t��Ē�7o���!�]���\O9ʗ�v�f���K��n+�{�!��#�`�qj�gn��!QI�g���[Dzrt��3�C��+�f^p+NJ�;PE�,����E�f��鵑0(߉T�zQ����GS,�W8��P0,�RZ_�@Yd
�"����oDΪ���ma��X�%����� ?��bFБ�<��2����Y�����w��i���L�#f�0p�L���|10
�	�2��'���E����8DN+�!z�X���h��rgU��v���E.&�:����kL���B�Fx�O����X�k�gE�ڞ,c���sR�t��GA��i�$#�k��n�(�8��N�B������J��o8RHiT���c�".�X���/Q5�B���֤���ƾk/Qn��8�B�Έ�q>�S�?�CK�.�Z��K�9�Ya�~���C��_�na�{�5����nh]V{�`@Es��,�X����2	g�ͅ=UW��}��X΃�rl��VhC���h!Y5�$�SP��L	c���6�8���	��a?��ԣ�-�@�L΢*��X��Enlr�S�&7��re�<Ș��6�!����>��т����9�1f�)}���}׊�{�n-�y0)u��j��p�?�����_���c�����`�@qL.T���{����Ep<<Ư��H�-�ܲ���z,�VN�
�l��c�m|V��wU;%D-�R�U�����qOx�VaO9��sU�lI�^U)��R�� J��E'5U�,�k�l/����ۻo�H�q��y�f<�Y"f�fow����,�^>ݭ-;����N��X����58l����;h�NDL8���
����
�㏃��Y��],m:��V�(a��
��K�|�+p�V��J���Ύ��_��p,]1�N$��!҄h!�oG�+��B��)D��"����(H�	Ŵ�w���+���������zr��&n�3�1�a�
�TTN��%}o!��'�:�DO��	o3I���1�#�/�|lu�lP��ҒD�`%D);��9�ϩ�T�]�(m�ѐ4��͜_s����䡴J�Qp�M3�i:#:�cߚ�"G\��1g9�����ԤQ�<��_A#B���B�%��l*�{��&���"��V�I����,z��(<
G���ỖG�z!J���Y�o��ت)G�.a��p2U�g���a,��]ni��렁����™�V�7@��\r��#<�bn?>�n�t(EF��+�e���a��FICPD@���7$�MiY�5v�Á�n�/�䉆^9a��l+�`Xn%Ӳ��}s�7	f�D�⛣�4���^-@�^>�.ܼ鼅�U�ڇ��~UZy㷆=)��H������,��N�m�V��`��c��}�����/��{���	-m�q�ɼ��4�28�:�����׳'�*��>Q9������x���ً8��M�������������8<}^-�'�Z���/1������Yڶ�,k���t>�Y��(��UTL_�wP�Ulꦸ���i���.���Khu����E�y��g���?��ˠa�7uK��]}2�9~���6�������%������/��_���O}�Z4osQ�0�|zE��	5�Z�|��{�U�`��?�0��i���ܶ6]P�>��񸘩�X��4�|��,�:�7�36Ƣᙳ[����h���[ق�^�G�ڜ'�GsU2�b�����\��5�_J��^�]o�O�ڼ{��	l+��~���_we��	��Q�x+)JMU043d040031QpL*.)JL.qI,ILJ,N�+�(`X5ٹ��C�ݗg/c�S1�T�KQ~X���3�l��7�F�����U�ZQ�_TVu;���L(â�9>U�����O[U�W\���V�9�Ƅ�RJ'K?�ݰ2�s׃X�"�CJx+)JMU04�d040031Q��+.I���+�(`����e�`,Q*��ڔ�����2���G�2)�F	��w�w4����Z�9>;	�,4/ɼ'�^O�{'ҟ�S�����3);-jx+)JMU064g040031QpL*.)JL.	�,I�+�(`xj|�I��k�C��ڎ5g�k�B�:��e��A�Z�����7X���ÝGs�(��&B�]rl����g�/}��:���T�KjN*Tղ��r�%,�:�3>�[���k�4LU~y^N~b
�qF�N&�=�
0��Eڼ_�@�bT�kEA~Q	XUD����ͭ�n+��~��g���롪<�Ksr���g^.k=����/f^�����'��$3/��F!�E���l�|Oh�4G4%�%`�+x+)JMU025d040031Qp��K�L/-JL�I�+�(`(ږr�ˏ)�j㼳wB��k��8jb
.�%�I�ũ����t(��|�݄-
�7'�,h�(q�(I�+���c�K�N���s��U;v�Z����& �4=3����g�-�7;�+g�(�H<�q�oDApfI*��[��,�l��77��2����
���R�@V��{*�?��۰�b��k���Θ�D8bLXF~q	���-3
.�����t���KJ[1�m�x+)JMU020c040031Qp,(��LN,����+�(`0����-�0sa��]QE��P�N��%�%E��E`��[�(G����*Y��a�6T�sbrF*Xу�ѧ&�ʻ�;>mB��O��ˇB��d�ը|�nK2gK�u+l��-�s��&,����̴4���7����t��g�W-�E�v��hO�x+)JMU041g040031Qp,(��LN,����+�(`����L�Ӕ4�Î�IN�P�obb
����y)��a{�?�7�_s�s۝���YCTx����$2x-`����ѦWc��SN�u�|�!
�+ss2�S����~�!���[/�1)�T��a�=�x+)JMU0�`01���ܜĒ���b�G5v��6�5�n��<#�_n�<WIPx+)JMU014f040031Q�K�,I,))�L*-I-f��.��5�i�G��[>|�/j�����
3J�*C޽y��Ó�`�D���[�W"�����_��P�׳�V7������$
�<�������B�<�BC<��rS����Oi|p�<_W��S/�J}<�]��]۞��ԓ��Y]r�2~����}�P%A��.�� s��
7gdXmc�A���y[ޢ3!NO��cxu��M��__��a���&��?B�H��-�/N-��*��c`�<�����;��Ȝ�M4�Wj�+��O�f�;>��U���廃�\��çM*�*,N�r^qF~�^A^:��K3��w��<��
�_�W���(�!Q��ù�q�^xI��71�~T�^壘x�Rێ�F�3_QZ�!�3c.C����x}cl�K�@7nMӴo�aw�o���J�:��s�Si]UT�c�H�1h��4CGX�2k����C;u��qt�pH�l�#��33R3ɆIb�D�L#K��=��}�d�����+�*ϵ��bT��!��j?��-��^��}M��oІj�j�	/���J�vJ%�?7r��4��o1
Ɠ��%ēq�n���;��t|�\w�n� ��K�/x6�}��[2��t�c��[�H/�^^�~�
l��wb�Ǣ�>$=൉���HkZ���%Cr��|K��{�lB����j������>��XO�:O�w|��:��[��ߛÇ���x2�~q:��i�$�����V��h��|[�8�K������{�-�q:��Q[�p�ǜ��|�n� �Z�S��;� Zd
���X���!J�]��z_��c3����R�}�3k�GlF6>y�pv�DӰh�Ŭo
+f�������y$�gv�Fc3'�iz�ζ}������7/���FN�;~��M��������Ο�7޴!ѕOW��������
���w*����޸��U��5��ϒ���%d5n���Cb����R�T�T�?�2����3*���o�wDU}��*{i9N)�)|�O��5�B>?����w>e�%OW&i���ԉ�-�E7���$Q�C��d
���.9t�8��x�*��8# pack-refs with: peeled fully-peeled sorted 
9564e19aca37e1e5e47b2ba6f3fdeb8f3586537b refs/remotes/origin/1.4
fd3cdf388a09142820a13926463c9eed4d48184b refs/remotes/origin/1.5
099bae7bd54d0f7a1322b968601c511357e123ee refs/remotes/origin/1.6
7237a3478a57ad581175fedef74201c62048f846 refs/remotes/origin/master
213be16ba85d668378c0837a21ccf5126ea7557d refs/tags/v1.0.0
^c024c2fc6a887fdd033bc2de03d8f057f25fdc07
8b520dd672786100b91c15d543d2de25e47f8466 refs/tags/v1.1.0
^db07bc1b87a21ce54f48c964b6bb9902c4f406d3
2a06a7c679609fbf10f9c0b19a49f3fc8aa29537 refs/tags/v1.2.0
^656dae4c646dcf380c33741a2c0585803c339607
0a6528f697960f315d9268f6a1e1e719c2f7cf8c refs/tags/v1.3.0
^c0ea99b13913851fdb5c161413f71a9652b648c6
914e2c4d6c9be322acb6f02ceb6d06230a494d8b refs/tags/v1.3.1
^b9e0c0a2139f5bdebbca9f778780a5b0f38174e3
d9735b974b3f69f0583b36fdccfd75b1026054b8 refs/tags/v1.3.2
^7a649e09be6e6515a74cc1d863f2655d04af8c20
02962b386a9dd8689b6d8d1403079ea8253ed29a refs/tags/v1.3.3
^68f00de56e1fef8f54dd6b4af95758f2e0fbe157
134f5424bab918c7441833df17a3c751e8da681f refs/tags/v1.4.0
^bc1ee2a89e054ba40aff9681dfaf413045b43c59
e357f7b91f0df162c5e2c72de675774d9be73cee refs/tags/v1.4.1
^788939a31e1ff9556fe412d480eb74a280ff3310
c79768ecdb2284294ef8238ea7b855498e1b3749 refs/tags/v1.4.10
^2c2002468df257898ff2bcd4b05adb94f42041d1
58ec8d465a45f2055ea2f7f6ced19cab9f14d631 refs/tags/v1.4.11
^9564e19aca37e1e5e47b2ba6f3fdeb8f3586537b
a57cea408aed6603453079bef731b95514be603d refs/tags/v1.4.2
^f4748295222b190dcab25cae093d4a42838da20c
a6ff740344b51166697309f209299d346e8d7d06 refs/tags/v1.4.3
^318166c217ae9c7d04e1d7bc789421a11d9ae579
c73cfc31bf3f447492364e1e5afd9455364bc681 refs/tags/v1.4.4
^5f38c8bc917453908badc297b045274736ace1d0
0341535d25d3064f9a506c143f1611b525d86049 refs/tags/v1.4.5
^cb4c73cd8fa4698e54f506e94da7d60f7dced4f8
9b35201fe5a117d935b74c275880e7556be9436f refs/tags/v1.4.6
^cf850527a9f29fa695d86aea26f3646ee7d26666
c340ad7081ca22b99d401a44c175c4d0818dc1a2 refs/tags/v1.4.7
^e575d2e49967f8919ab4c18199e34bf44f88fe72
60b11b5e066c364eb46b118b40f171d036f96f62 refs/tags/v1.4.8
^e427097c36095b6a1fd6dc95e39fa82bc24e9bad
99f490182871474c56608aa4d5dbc39262bac570 refs/tags/v1.4.9
^011b10bcc544c2164660482135e54413ffa4048e
7385b44a14a335fa3cc36b2937e6389f0b10c7f4 refs/tags/v1.5.0
^c0417ba834c0b5b315f4a61b8bd6f7eaebd553fb
5e21bdc27883f5df8cfa1156d18d7fa76460cdfe refs/tags/v1.5.1
^06a9d8d2e715b19cc81f08daa0da214c795d801a
18ecafa1c61162c365abdd48960dc3c52bc4107b refs/tags/v1.5.2
^c25986ec7982e2a0463478d02804d6191cea91db
1cc9f4cc55f2c5688622b849bbdc185b3685ff1e refs/tags/v1.5.3
^2911032c1dba27dcedc0b802717fe9ade6301239
fc060e129b93ebe74ebf4dda31bc245bd0440c39 refs/tags/v1.5.4
^2e6f0ab91826fd4af822a0587e0dc36ef3f5504e
6b96362e72a634657c781027de447f809d89c476 refs/tags/v1.5.5
897df5340c3e0ee5956e8744cd82dd94fb868fe0 refs/tags/v1.5.6
^d8107da25379000fae3a378627b5297f711da0ce
a2c5efda9e2ba2482e7e36f654b91e6b6dad2a29 refs/tags/v1.5.7
^165354fdf7ff6054db4dc2fa0b63dd60b092a880
3de31507d0c9da901019c60a1d3d25c1a479d960 refs/tags/v1.5.8
^fd3cdf388a09142820a13926463c9eed4d48184b
e87695f496c7f2d90a85a96f2d2ac261260401b1 refs/tags/v1.5.9
099bae7bd54d0f7a1322b968601c511357e123ee refs/tags/v1.6.0
a2370ccb863fcb413adfb8acfca260d9c7a3425d refs/tags/v2.0.0
^ca83492105e6efe35075062deb4f95c2ae0d5b61
5002eccea9d81993e2cf3f089bb9c19b807ad716 refs/tags/v2.0.1
^93ea6864f2d2f683fa940879c815adb07b79611c
cb4964125ba1414d35802add40174c6eb12f44a0 refs/tags/v2.0.2
^f38499a331f8f8907f9a6c95061d9955f45dfe60
7237a3478a57ad581175fedef74201c62048f846 refs/tags/v2.0.3
0000000000000000000000000000000000000000 7237a3478a57ad581175fedef74201c62048f846 Matt Saladna <msaladna@apisnetworks.com> 1700409308 -0500	clone: from https://github.com/joomlatools/joomlatools-console.git
0000000000000000000000000000000000000000 08315dbd8218aaa9baa21ebe3f746e8256209e27 Matt Saladna <msaladna@apisnetworks.com> 1700586948 -0500	fetch origin: storing head
0000000000000000000000000000000000000000 e100b9577d3984fda3cbbcb704b78734374afb0d Matt Saladna <msaladna@apisnetworks.com> 1700586948 -0500	fetch origin: storing head
0000000000000000000000000000000000000000 4834a3fba9a8951087775843178ea6f62def8b92 Matt Saladna <msaladna@apisnetworks.com> 1700586948 -0500	fetch origin: storing head
7237a3478a57ad581175fedef74201c62048f846 5d3c5bd7bb846b1153dc73842af6b249d99b5282 Matt Saladna <msaladna@apisnetworks.com> 1700586993 -0500	update by push
5d3c5bd7bb846b1153dc73842af6b249d99b5282 c5821f2f7d819c93574130d021aedf7871198da0 Matt Saladna <msaladna@apisnetworks.com> 1700788319 -0500	update by push
0000000000000000000000000000000000000000 7237a3478a57ad581175fedef74201c62048f846 Matt Saladna <msaladna@apisnetworks.com> 1700409308 -0500	clone: from https://github.com/joomlatools/joomlatools-console.git
7237a3478a57ad581175fedef74201c62048f846 5d3c5bd7bb846b1153dc73842af6b249d99b5282 Matt Saladna <msaladna@apisnetworks.com> 1700586990 -0500	commit: Require Composer dependencies against PHP 7.3 to preserve commitment
5d3c5bd7bb846b1153dc73842af6b249d99b5282 c5821f2f7d819c93574130d021aedf7871198da0 Matt Saladna <msaladna@apisnetworks.com> 1700788315 -0500	commit: Replace eval() with AST parser.
0000000000000000000000000000000000000000 7237a3478a57ad581175fedef74201c62048f846 Matt Saladna <msaladna@apisnetworks.com> 1700409308 -0500	clone: from https://github.com/joomlatools/joomlatools-console.git
7237a3478a57ad581175fedef74201c62048f846 5d3c5bd7bb846b1153dc73842af6b249d99b5282 Matt Saladna <msaladna@apisnetworks.com> 1700586990 -0500	commit: Require Composer dependencies against PHP 7.3 to preserve commitment
5d3c5bd7bb846b1153dc73842af6b249d99b5282 c5821f2f7d819c93574130d021aedf7871198da0 Matt Saladna <msaladna@apisnetworks.com> 1700788315 -0500	commit: Replace eval() with AST parser.
DIRC/eZ/��ēeZ/��ē���#<���S�a�/f����1)�.gitattributeseZ/��ēeZ/��ēu����(D~���-�wEYBm��h)�.github/issue_template.mdeZ/��ēeZ/��ē���uR��M"y�)@E��c� .github/workflows/index-wiki.ymleZ/��ēeZ/��ē�����o��s�&X�lu��~&SAQe".github/workflows/pull-request.ymleZ/��ēeZ/��ē���%vK���:؇6�0:HS�
.gitignoreeZ/��ēeZ/��ē���e:J*㔁���l
VM���CONTRIBUTING.mdeZ/��ēeZ/��ē���>i�=�|��dkI{t�9_�9��%LICENSEeZ/��ēeZ/��ē����~�W7�<:���7�n��	README.mdeZ/��ēeZ/��ēH���V8� �h��6���s���bin/.files/joomla2.users.sqleZ/���eZ/���H��R�u�A(D	
UtGQA�'~t�bin/.files/joomla3.users.sqleZ/���eZ/���u����i���^|i���48��}��bin/.files/vhosts/apache.confe_i�
2�Pe_i�
2�P�����k�p={�ԅ9�+�œ
bin/joomlae];�)� �e];�)� �������}5�	���4)�)
composer.jsone];�)� �e];�)� �	n����anǐ�%����R~EO7W��s
composer.lockeZ/���eZ/������&��Ҙ�����%�� 8��7z'�screenshot.pngeZ/���eZ/���H��#ʙg�+�f�A-b�˘ �4'src/Joomlatools/Console/Application.phpe_i����e_i����u���	�r�d�
NnՁ���T�/*�8�0src/Joomlatools/Console/Command/Configurable.phpeZ/���eZ/��������Cy�� �ӛ���nP\x��=src/Joomlatools/Console/Command/Database/AbstractDatabase.phpeZ/���eZ/������I(=���<�{a�%[?\�
��1src/Joomlatools/Console/Command/Database/Drop.phpeZ/���eZ/������"�npM�U��lLzy�����3src/Joomlatools/Console/Command/Database/Export.phpe_�$4��+e_�$4�(��� �i�ؐ�"�u󝰩l��]Fr4src/Joomlatools/Console/Command/Database/Install.phpeZ/���eZ/����������P�K�o�-�gnT!tQ?src/Joomlatools/Console/Command/Extension/AbstractExtension.phpeZ/���eZ/������&�.T��Aܩ��H�9d�N��5src/Joomlatools/Console/Command/Extension/Install.phpeZ/���eZ/���H��BD<n����4R�Z
��i�%?src/Joomlatools/Console/Command/Extension/Iterator/Iterator.phpeZ/���eZ/������"B����ƭٞ���`Y&6src/Joomlatools/Console/Command/Extension/Register.phpeZ/���eZ/������"����''90U�Ɂd��t�Ew5src/Joomlatools/Console/Command/Extension/Symlink.phpe_���l�e_���l�u����*
�03u�5��Pt2src/Joomlatools/Console/Command/Plugin/Install.phpe_�%أe_�%��u��������p��,���_kb2src/Joomlatools/Console/Command/Plugin/ListAll.phpe_��Ec"e_��Ec"u������`뗝�YO�QC����4src/Joomlatools/Console/Command/Plugin/Uninstall.phpeZ/���eZ/������
:�2S�y��@o0&���_|�5src/Joomlatools/Console/Command/Site/AbstractSite.phpeZ/��I2eZ/��I2���.];�M8>
�/0�������#2src/Joomlatools/Console/Command/Site/Configure.phpeZ/��I2eZ/��I2���(�U�ƣ9���3��]�m��2/src/Joomlatools/Console/Command/Site/Create.phpeZ/��I2eZ/��I2����T��8Z��S�^��:�/src/Joomlatools/Console/Command/Site/Delete.phpe];�)� �e];�)� ����5N2/B4�H�u.Y<��p$x�1src/Joomlatools/Console/Command/Site/Download.phpeZ/��I2eZ/��I2���
�X�*Lӳ���#���X3Ƴ�/src/Joomlatools/Console/Command/Site/Export.phpeZ/��I2eZ/��I2�����v���늠U���(�0src/Joomlatools/Console/Command/Site/Install.phpe_�L��]e_�L��z�����q8_��M���dQ�0src/Joomlatools/Console/Command/Site/Listing.phpeZ/��I2eZ/��I2u���E�g�m��V�;�B����`,src/Joomlatools/Console/Command/Versions.phpeZ/��I2eZ/��I2����3�Rј����#�g�)
�N�N0src/Joomlatools/Console/Command/Vhost/Create.phpeZ/��I2eZ/��I2������
/U��+�/�粲���nU0src/Joomlatools/Console/Command/Vhost/Remove.phpeZ/��I2eZ/��I2H��>�P2},U�Z��n�!:�.src/Joomlatools/Console/Joomla/Application.phpeZ/��I2eZ/��I2H��	!���T#YȌ��sQZ,��+/src/Joomlatools/Console/Joomla/Bootstrapper.phpeZ/��I2eZ/��I2H��_�[ʑ�nػ_f�_��:�U(src/Joomlatools/Console/Joomla/Cache.phpe_��!XU�e_��!gH��S$�+�b7`Fq�;�[Xl�'src/Joomlatools/Console/Joomla/Util.phpe_��'��e_��'�~�H���hؿ��
����9���G�1src/Joomlatools/Console/Joomla/VersionSniffer.phpeZ/��I2eZ/��I2u���
�Q��q4����/f�H��=src/Joomlatools/Console/Symlinkers/joomlatools-components.phpeZ/��I2eZ/��I2u���
�S�����kD�ʮH�;���<src/Joomlatools/Console/Symlinkers/joomlatools-framework.phpTREE:47 3
Q*�mg�Q2��������Hbin4 1
���2���=��×4�[�.files3 1
M�,g���s�m�u��2�vhosts1 0
&a�$6
�n
4\�2�YGsrc32 1
a�@Η^��J�44��,?!Joomlatools32 1
�|>�:�&�E�y����Console32 3
kAc�Cq}K}�K�53�Joomla5 0
J��i�<�(���B�-~LqCommand24 5
ewV���4/W��	�ܹҖ;Site8 0
��3�9V<j�w�������B��Vhost2 0
�˄�p�G��/L��o�"�Plugin3 0
E��L��وOy��txa�(�N�Database4 0
�3'��@t~�� ��cL��Extension5 1
c�`�	��j��z��}:혬Iterator1 0
�Y��}�+x�`��4̊>8�Symlinkers2 0
�-�����~�#�%l�X<.github3 1
yT���O�`��tY+��өworkflows2 0
��L����C���K`�E���Y;�-u̞��bU�۱��7237a3478a57ad581175fedef74201c62048f846		branch 'master' of https://github.com/apisnetworks/joomlatools-console
9564e19aca37e1e5e47b2ba6f3fdeb8f3586537b	not-for-merge	branch '1.4' of https://github.com/apisnetworks/joomlatools-console
08315dbd8218aaa9baa21ebe3f746e8256209e27	not-for-merge	branch 'feature/13-site_update' of https://github.com/apisnetworks/joomlatools-console
e100b9577d3984fda3cbbcb704b78734374afb0d	not-for-merge	branch 'feature/14-composer' of https://github.com/apisnetworks/joomlatools-console
4834a3fba9a8951087775843178ea6f62def8b92	not-for-merge	branch 'feature/47-url' of https://github.com/apisnetworks/joomlatools-console
7237a3478a57ad581175fedef74201c62048f846
Replace eval() with AST parser.
plugin:list-all does not extend AbstractSite, infer $target_dir from CWD
Remove non-specific "type" property from site:list
Verify runtime  path is writeable falling back to system temp directory.
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# On branch master
# Your branch is up to date with 'origin/master'.
#
# Changes to be committed:
#	modified:   src/Joomlatools/Console/Command/Database/Install.php
#	modified:   src/Joomlatools/Console/Command/Plugin/ListAll.php
#	modified:   src/Joomlatools/Console/Command/Site/Listing.php
#	modified:   src/Joomlatools/Console/Joomla/Util.php
#	new file:   src/Joomlatools/Console/Joomla/VersionSniffer.php
#
# Untracked files:
#	.idea/
#
* text=auto

bin/joomla text eol=lf<!--
### Are you in the right place?

* Do you have a feature request?
* Do you have general technical questions?

Then join us in our Gitter chat (http://gitter.im/joomlatools/dev) or on the mailing list (https://groups.google.com/forum/#!forum/joomlatools-dev) to get help or discuss your ideas.

* Do you have a bug report?
* Did we discuss your idea or feature requests and agree to create a ticket for it?

Please go ahead.
-->

### Describe your environment

  * OS: _____
  * Joomla version: _____
  * Joomlatools Console version: _____
  * Are you working on the Joomlatools Vagrant: yes/no
  * Are you working on the Joomlatools Server: yes/no

### Describe the problem:

#### Steps to reproduce:

  1. _____
  2. _____

#### Observed Results:

  * What happened?  This could be a description, log output, etc.

#### Expected Results:

  * What did you expect to happen?

#### Relevant Code:

  ```
  // TODO(you): code here to reproduce the problem
  ```

name: Index Wiki

on:
  gollum:
  workflow_dispatch:

jobs:
  index:

    name: Create Wiki Filesystem Index
    runs-on: ubuntu-latest

    steps:
      - name: Checkout wiki code from Github
        uses: actions/checkout@v3
        with:
          repository: ${{github.repository}}.wiki
          fetch-depth: 0

      - name: Create index
        run: |
          git ls-files -z | xargs -0 -n1 -I{} -- git log -1 --format="{},%h,%aI,%aN,%aE" {} | \
          jq -Rs 'split("\n")[:-1] | map({ 
            file: (. | split(",")[0]),
            hash: (. | split(",")[1]),
            author_date: (. | split(",")[2]),
            author_name: (. | split(",")[3]),
            author_email: (. | split(",")[4]),
          })' > _Index.json

      - name: Commit index
        uses: stefanzweifel/git-auto-commit-action@v4
        with:
          commit_message: Update Wiki Index

name: Create a pull request

on:
  create:

jobs:
  pull-request:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2


      - name:  Only run on branches whose names start with feature/ or hotfix/
        if: startsWith(github.ref, 'refs/heads/feature') || startsWith(github.ref, 'refs/heads/hotfix')
        shell: bash
        run: echo "ISSUE_ID=$(echo $GITHUB_REF | grep -o -E '[0-9]+' | head -1 | sed -e 's/^0\+//')" >> $GITHUB_ENV


      - name: Get issue data
        uses: octokit/request-action@v2.x
        if: ${{ env.ISSUE_ID }}
        id: issue
        with:
          route: GET /repos/${{ github.repository }}/issues/${{ env.ISSUE_ID }}
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}


      - name: Gather PR data
        if: ${{ steps.issue.outputs.data }}
        id: pr_data
        shell: bash
        run: |
          echo "::set-output name=title::$(echo $json_var | jq '.title' --raw-output )"
          echo "::set-output name=body::Closes #$(echo $json_var | jq '.number' --raw-output)"
          echo "::set-output name=assignee::$(echo $json_var | jq '[.assignees[].login] | join(",")' --raw-output --compact-output)"
          echo "::set-output name=label::$(echo $json_var | jq '[.labels[].name] | join(",")' --raw-output --compact-output)"
          echo "::set-output name=milestone::$(echo $json_var | jq '[.milestone.title] | join(",")' --raw-output --compact-output)"
        env:
          json_var: ${{ steps.issue.outputs.data }}


      - name: Create pull request
        if: ${{ steps.issue.outputs.data }}
        uses: repo-sync/pull-request@v2
        with:
          pr_title: ${{ steps.pr_data.outputs.title }}
          pr_body: ${{ steps.pr_data.outputs.body }}
          pr_assignee: ${{ steps.pr_data.outputs.assignee }}
          pr_label: ${{ steps.pr_data.outputs.label }}
          pr_milestone: ${{ steps.pr_data.outputs.milestone }}
          github_token: ${{ secrets.GITHUB_TOKEN }}/vendor/
/bin/.files/cache
/plugins/*Please read [Contributing to Joomlatools Projects](http://developer.joomlatools.com/contribute.html)
Mozilla Public License, version 2.0

1. Definitions

1.1. “Contributor”

     means each individual or legal entity that creates, contributes to the
     creation of, or owns Covered Software.

1.2. “Contributor Version”

     means the combination of the Contributions of others (if any) used by a
     Contributor and that particular Contributor’s Contribution.

1.3. “Contribution”

     means Covered Software of a particular Contributor.

1.4. “Covered Software”

     means Source Code Form to which the initial Contributor has attached the
     notice in Exhibit A, the Executable Form of such Source Code Form, and
     Modifications of such Source Code Form, in each case including portions
     thereof.

1.5. “Incompatible With Secondary Licenses”
     means

     a. that the initial Contributor has attached the notice described in
        Exhibit B to the Covered Software; or

     b. that the Covered Software was made available under the terms of version
        1.1 or earlier of the License, but not also under the terms of a
        Secondary License.

1.6. “Executable Form”

     means any form of the work other than Source Code Form.

1.7. “Larger Work”

     means a work that combines Covered Software with other material, in a separate
     file or files, that is not Covered Software.

1.8. “License”

     means this document.

1.9. “Licensable”

     means having the right to grant, to the maximum extent possible, whether at the
     time of the initial grant or subsequently, any and all of the rights conveyed by
     this License.

1.10. “Modifications”

     means any of the following:

     a. any file in Source Code Form that results from an addition to, deletion
        from, or modification of the contents of Covered Software; or

     b. any new file in Source Code Form that contains any Covered Software.

1.11. “Patent Claims” of a Contributor

      means any patent claim(s), including without limitation, method, process,
      and apparatus claims, in any patent Licensable by such Contributor that
      would be infringed, but for the grant of the License, by the making,
      using, selling, offering for sale, having made, import, or transfer of
      either its Contributions or its Contributor Version.

1.12. “Secondary License”

      means either the GNU General Public License, Version 2.0, the GNU Lesser
      General Public License, Version 2.1, the GNU Affero General Public
      License, Version 3.0, or any later versions of those licenses.

1.13. “Source Code Form”

      means the form of the work preferred for making modifications.

1.14. “You” (or “Your”)

      means an individual or a legal entity exercising rights under this
      License. For legal entities, “You” includes any entity that controls, is
      controlled by, or is under common control with You. For purposes of this
      definition, “control” means (a) the power, direct or indirect, to cause
      the direction or management of such entity, whether by contract or
      otherwise, or (b) ownership of more than fifty percent (50%) of the
      outstanding shares or beneficial ownership of such entity.


2. License Grants and Conditions

2.1. Grants

     Each Contributor hereby grants You a world-wide, royalty-free,
     non-exclusive license:

     a. under intellectual property rights (other than patent or trademark)
        Licensable by such Contributor to use, reproduce, make available,
        modify, display, perform, distribute, and otherwise exploit its
        Contributions, either on an unmodified basis, with Modifications, or as
        part of a Larger Work; and

     b. under Patent Claims of such Contributor to make, use, sell, offer for
        sale, have made, import, and otherwise transfer either its Contributions
        or its Contributor Version.

2.2. Effective Date

     The licenses granted in Section 2.1 with respect to any Contribution become
     effective for each Contribution on the date the Contributor first distributes
     such Contribution.

2.3. Limitations on Grant Scope

     The licenses granted in this Section 2 are the only rights granted under this
     License. No additional rights or licenses will be implied from the distribution
     or licensing of Covered Software under this License. Notwithstanding Section
     2.1(b) above, no patent license is granted by a Contributor:

     a. for any code that a Contributor has removed from Covered Software; or

     b. for infringements caused by: (i) Your and any other third party’s
        modifications of Covered Software, or (ii) the combination of its
        Contributions with other software (except as part of its Contributor
        Version); or

     c. under Patent Claims infringed by Covered Software in the absence of its
        Contributions.

     This License does not grant any rights in the trademarks, service marks, or
     logos of any Contributor (except as may be necessary to comply with the
     notice requirements in Section 3.4).

2.4. Subsequent Licenses

     No Contributor makes additional grants as a result of Your choice to
     distribute the Covered Software under a subsequent version of this License
     (see Section 10.2) or under the terms of a Secondary License (if permitted
     under the terms of Section 3.3).

2.5. Representation

     Each Contributor represents that the Contributor believes its Contributions
     are its original creation(s) or it has sufficient rights to grant the
     rights to its Contributions conveyed by this License.

2.6. Fair Use

     This License is not intended to limit any rights You have under applicable
     copyright doctrines of fair use, fair dealing, or other equivalents.

2.7. Conditions

     Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in
     Section 2.1.


3. Responsibilities

3.1. Distribution of Source Form

     All distribution of Covered Software in Source Code Form, including any
     Modifications that You create or to which You contribute, must be under the
     terms of this License. You must inform recipients that the Source Code Form
     of the Covered Software is governed by the terms of this License, and how
     they can obtain a copy of this License. You may not attempt to alter or
     restrict the recipients’ rights in the Source Code Form.

3.2. Distribution of Executable Form

     If You distribute Covered Software in Executable Form then:

     a. such Covered Software must also be made available in Source Code Form,
        as described in Section 3.1, and You must inform recipients of the
        Executable Form how they can obtain a copy of such Source Code Form by
        reasonable means in a timely manner, at a charge no more than the cost
        of distribution to the recipient; and

     b. You may distribute such Executable Form under the terms of this License,
        or sublicense it under different terms, provided that the license for
        the Executable Form does not attempt to limit or alter the recipients’
        rights in the Source Code Form under this License.

3.3. Distribution of a Larger Work

     You may create and distribute a Larger Work under terms of Your choice,
     provided that You also comply with the requirements of this License for the
     Covered Software. If the Larger Work is a combination of Covered Software
     with a work governed by one or more Secondary Licenses, and the Covered
     Software is not Incompatible With Secondary Licenses, this License permits
     You to additionally distribute such Covered Software under the terms of
     such Secondary License(s), so that the recipient of the Larger Work may, at
     their option, further distribute the Covered Software under the terms of
     either this License or such Secondary License(s).

3.4. Notices

     You may not remove or alter the substance of any license notices (including
     copyright notices, patent notices, disclaimers of warranty, or limitations
     of liability) contained within the Source Code Form of the Covered
     Software, except that You may alter any license notices to the extent
     required to remedy known factual inaccuracies.

3.5. Application of Additional Terms

     You may choose to offer, and to charge a fee for, warranty, support,
     indemnity or liability obligations to one or more recipients of Covered
     Software. However, You may do so only on Your own behalf, and not on behalf
     of any Contributor. You must make it absolutely clear that any such
     warranty, support, indemnity, or liability obligation is offered by You
     alone, and You hereby agree to indemnify every Contributor for any
     liability incurred by such Contributor as a result of warranty, support,
     indemnity or liability terms You offer. You may include additional
     disclaimers of warranty and limitations of liability specific to any
     jurisdiction.

4. Inability to Comply Due to Statute or Regulation

   If it is impossible for You to comply with any of the terms of this License
   with respect to some or all of the Covered Software due to statute, judicial
   order, or regulation then You must: (a) comply with the terms of this License
   to the maximum extent possible; and (b) describe the limitations and the code
   they affect. Such description must be placed in a text file included with all
   distributions of the Covered Software under this License. Except to the
   extent prohibited by statute or regulation, such description must be
   sufficiently detailed for a recipient of ordinary skill to be able to
   understand it.

5. Termination

5.1. The rights granted under this License will terminate automatically if You
     fail to comply with any of its terms. However, if You become compliant,
     then the rights granted under this License from a particular Contributor
     are reinstated (a) provisionally, unless and until such Contributor
     explicitly and finally terminates Your grants, and (b) on an ongoing basis,
     if such Contributor fails to notify You of the non-compliance by some
     reasonable means prior to 60 days after You have come back into compliance.
     Moreover, Your grants from a particular Contributor are reinstated on an
     ongoing basis if such Contributor notifies You of the non-compliance by
     some reasonable means, this is the first time You have received notice of
     non-compliance with this License from such Contributor, and You become
     compliant prior to 30 days after Your receipt of the notice.

5.2. If You initiate litigation against any entity by asserting a patent
     infringement claim (excluding declaratory judgment actions, counter-claims,
     and cross-claims) alleging that a Contributor Version directly or
     indirectly infringes any patent, then the rights granted to You by any and
     all Contributors for the Covered Software under Section 2.1 of this License
     shall terminate.

5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user
     license agreements (excluding distributors and resellers) which have been
     validly granted by You or Your distributors under this License prior to
     termination shall survive termination.

6. Disclaimer of Warranty

   Covered Software is provided under this License on an “as is” basis, without
   warranty of any kind, either expressed, implied, or statutory, including,
   without limitation, warranties that the Covered Software is free of defects,
   merchantable, fit for a particular purpose or non-infringing. The entire
   risk as to the quality and performance of the Covered Software is with You.
   Should any Covered Software prove defective in any respect, You (not any
   Contributor) assume the cost of any necessary servicing, repair, or
   correction. This disclaimer of warranty constitutes an essential part of this
   License. No use of  any Covered Software is authorized under this License
   except under this disclaimer.

7. Limitation of Liability

   Under no circumstances and under no legal theory, whether tort (including
   negligence), contract, or otherwise, shall any Contributor, or anyone who
   distributes Covered Software as permitted above, be liable to You for any
   direct, indirect, special, incidental, or consequential damages of any
   character including, without limitation, damages for lost profits, loss of
   goodwill, work stoppage, computer failure or malfunction, or any and all
   other commercial damages or losses, even if such party shall have been
   informed of the possibility of such damages. This limitation of liability
   shall not apply to liability for death or personal injury resulting from such
   party’s negligence to the extent applicable law prohibits such limitation.
   Some jurisdictions do not allow the exclusion or limitation of incidental or
   consequential damages, so this exclusion and limitation may not apply to You.

8. Litigation

   Any litigation relating to this License may be brought only in the courts of
   a jurisdiction where the defendant maintains its principal place of business
   and such litigation shall be governed by laws of that jurisdiction, without
   reference to its conflict-of-law provisions. Nothing in this Section shall
   prevent a party’s ability to bring cross-claims or counter-claims.

9. Miscellaneous

   This License represents the complete agreement concerning the subject matter
   hereof. If any provision of this License is held to be unenforceable, such
   provision shall be reformed only to the extent necessary to make it
   enforceable. Any law or regulation which provides that the language of a
   contract shall be construed against the drafter shall not be used to construe
   this License against a Contributor.


10. Versions of the License

10.1. New Versions

      Mozilla Foundation is the license steward. Except as provided in Section
      10.3, no one other than the license steward has the right to modify or
      publish new versions of this License. Each version will be given a
      distinguishing version number.

10.2. Effect of New Versions

      You may distribute the Covered Software under the terms of the version of
      the License under which You originally received the Covered Software, or
      under the terms of any subsequent version published by the license
      steward.

10.3. Modified Versions

      If you create software not governed by this License, and you want to
      create a new license for such software, you may create and use a modified
      version of this License if you rename the license and remove any
      references to the name of the license steward (except to note that such
      modified license differs from this License).

10.4. Distributing Source Code Form that is Incompatible With Secondary Licenses
      If You choose to distribute Source Code Form that is Incompatible With
      Secondary Licenses under the terms of this version of the License, the
      notice described in Exhibit B of this License must be attached.

Exhibit A - Source Code Form License Notice

      This Source Code Form is subject to the
      terms of the Mozilla Public License, v.
      2.0. If a copy of the MPL was not
      distributed with this file, You can
      obtain one at
      http://mozilla.org/MPL/2.0/.

If it is not possible or desirable to put the notice in a particular file, then
You may include the notice in a location (such as a LICENSE file in a relevant
directory) where a recipient would be likely to look for such a notice.

You may add additional accurate notices of copyright ownership.

Exhibit B - “Incompatible With Secondary Licenses” Notice

      This Source Code Form is “Incompatible
      With Secondary Licenses”, as defined by
      the Mozilla Public License, v. 2.0.

![Screenshot](/screenshot.png?raw=true)

Joomlatools Console
=====================

[Joomlatools Console](https://www.joomlatools.com/developer/tools/console/) simplifies the management of Joomla sites. It is designed to work on Linux and MacOS. Windows users can use it in [Joomlatools Server](https://github.com/joomlatools/joomlatools-server).

## Requirements

* PHP7.3 or newer
* Linux, MacOS, or [Joomlatools Server](https://github.com/joomlatools/joomlatools-server)
* Composer
* Joomla versions 3.5 and 4.x

## Installation

1. Install using Composer:

 `$ composer global require joomlatools/console`

1. Tell your system where to find the executable by adding the composer directory to your PATH. Add the following line to your shell configuration file called either .profile, .bash_profile, .bash_aliases, or .bashrc. This file is located in your home folder.

 `$ export PATH="$PATH:~/.composer/vendor/bin"`
 
 For Ubuntu 19+ you may find you should use:

`export PATH="$PATH:$HOME/.config/composer/vendor/bin"`

1. Verify the installation

 `$ joomla --version`

1. To create a new site with the latest Joomla version, run:

  ```shell
     joomla site:create testsite
  ```

   The newly installed site will be available at /var/www/testsite and testsite.test after that. The default Super User's name and password is set to: `admin` / `admin`.

   By default, the web server root is set to _/var/www_. You can pass _--www=/my/server/path_ to commands for custom values. You can choose the Joomla version or the sample data to be installed:

   ```shell
     joomla site:create testsite --release=4.0 --sample-data=blog
   ```

1. For other available options, run:

  `$ joomla --list`

1. Read our [documentation pages](https://www.joomlatools.com/developer/tools/console/) to learn more about using the tool.

## Development

To setup the tool for development:

1. Clone the repository:

```
git clone git@github.com:joomlatools/joomlatools-console.git
```
    
1. Fetch the dependencies:

```
composer install
```
   
1. Now you can execute the tool with:

```
bin/joomla list
```

1. Happy coding!

## Contributing

Joomlatools Console is an open source, community-driven project. Contributions are welcome from everyone.
We have [contributing guidelines](CONTRIBUTING.md) to help you get started.

## Contributors

See the list of [contributors](https://github.com/joomlatools/joomlatools-console/contributors).

## License

Joomlatools Console is free and open-source software licensed under the [MPLv2 license](LICENSE.txt).

## Community

Keep track of development and community news.

* Follow [@joomlatoolsdev on Twitter](https://twitter.com/joomlatoolsdev)
* Join [joomlatools/dev on Gitter](http://gitter.im/joomlatools/dev)
* Read the [Joomlatools Developer Blog](https://www.joomlatools.com/developer/blog/)
* Subscribe to the [Joomlatools Developer Newsletter](https://www.joomlatools.com/developer/newsletter/)

[Joomlatools Console]: https://www.joomlatools.com/developer/tools/console/
INSERT INTO `j_users` (`id`, `name`, `username`, `email`, `password`, `block`, `sendEmail`, `registerDate`, `lastvisitDate`, `activation`, `params`, `lastResetTime`, `resetCount`)
VALUES
	(970, 'Super User', 'admin', 'admin@example.com', 'e8d876703ae04a3fe6c4868ff296fb9f:99SknoS4CFHGWhkOtk8cNTIDXR0bSUvN', 0, 1, NOW(), NOW(), '0', '', NOW(), 0),
	(971, 'User', 'user', 'user@example.com', '92b46d92fc58eb86e92a8c796febeb34:fXySsDEWvyiIg0ifkftgTkrXzmviMvC3', 0, 0, NOW(), NOW(), '', '{\"admin_style\":\"\",\"admin_language\":\"\",\"language\":\"\",\"editor\":\"\",\"helpsite\":\"\",\"timezone\":\"\"}', NOW(), 0),
	(972, 'Manager', 'manager', 'manager@example.com', '770b271ae81867018860e471d51781c9:8CqzT83QhW5AJACYBqDqoHJJE21l8r8Y', 0, 0, NOW(), NOW(), '', '{\"admin_style\":\"\",\"admin_language\":\"\",\"language\":\"\",\"editor\":\"\",\"helpsite\":\"\",\"timezone\":\"\"}', NOW(), 0);

INSERT INTO `j_user_usergroup_map` (`user_id`, `group_id`)
VALUES
	(970, 8),
	(971, 2),
	(972, 6);
INSERT INTO `j_users` (`id`, `name`, `username`, `email`, `password`, `block`, `sendEmail`, `registerDate`, `lastvisitDate`, `activation`, `params`, `lastResetTime`, `resetCount`)
VALUES
	(951, 'Super User', 'admin', 'admin@example.com', '871b1a6d54b378b5547a945ea1a8bd18:3UgsAngDFq7D0FRmyiWey4qgV8n5PpEJ', 0, 1, NOW(), NOW(), '0', '{\"admin_style\":\"\",\"admin_language\":\"\",\"language\":\"\",\"editor\":\"\",\"helpsite\":\"\",\"timezone\":\"\"}', NOW(), 0),
	(952, 'User', 'user', 'user@example.com', '931d334de664be1135bed97fd9bb7b62:ZzvicSTnh9dr1Ln36G3MgkC9WSa9J4PW', 0, 0, NOW(), NOW(), '', '{\"admin_style\":\"\",\"admin_language\":\"\",\"language\":\"\",\"editor\":\"\",\"helpsite\":\"\",\"timezone\":\"\"}', NOW(), 0),
	(953, 'Manager', 'manager', 'manager@example.com', 'e0f025cc620a663e172c8b25911e5c4e:44wqdHQWhDPcrRg5koGsWJ9Zlhr9WC5x', 0, 0, NOW(), NOW(), '', '{\"admin_style\":\"\",\"admin_language\":\"\",\"language\":\"\",\"editor\":\"\",\"helpsite\":\"\",\"timezone\":\"\"}', NOW(), 0);

INSERT INTO `j_user_usergroup_map` (`user_id`, `group_id`)
VALUES
	(951, 8),
	(952, 2),
	(953, 6);
<VirtualHost *:%http_port%>
    ServerAdmin webmaster@%site%.test
    DocumentRoot %root%
    ServerName %site%.test
    ServerAlias www.%site%.test %site%.dev www.%site%.dev
 
    <Directory %root%>
       Options Indexes FollowSymLinks
       AllowOverride All
       Require all granted
    </Directory>

    ErrorLog  /var/log/apache2/%site%.test_error.log
    CustomLog /var/log/apache2/%site%.test_access.log combined
</VirtualHost>
<?php
/**
 * @copyright	Copyright (C) 2007 - 2015 Johan Janssens and Timble CVBA. (http://www.timble.net)
 * @license		Mozilla Public License, version 2.0
 * @link		http://github.com/joomlatools/joomlatools-console for the canonical source repository
 */

if (version_compare(PHP_VERSION, '7.3.0', '<'))
{
	echo "This command requires at least PHP version 7.3.0 to run. Exiting.";
	exit(1);
} 

$dirs = explode(DIRECTORY_SEPARATOR, __DIR__);
for ($i = count($dirs); $i >= 0; $i--)
{
	$dir = implode(DIRECTORY_SEPARATOR, array_slice($dirs, 0, $i));
	$autoload = $dir . DIRECTORY_SEPARATOR . 'autoload.php';
	$vendored = $dir . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php';

	if (file_exists($vendored))
	{
		require $vendored;
		break;
	}
	else if (file_exists($autoload))
	{
		require $autoload;
		break;
	}
}

$application = new Joomlatools\Console\Application();
$application->run();
�PNG


IHDR0�89#ziCCPICC ProfileX��Y�WU߶^�$��������F��*�
"]"��JHY�(b��A��" 
o���q�}���u��s�5�:k�=��
�WDD��а�(Cn'gn�[������Ot�����?Ǐg�3?���������dce������]|L����Q�`�����?�o�����.������
�R�s��q(��Ѕ���������	����2�#����|BC�a;�l�����-��?�{y�������9*�0{[xf�/v�$A�	�D�([Ȱ�>���N��u��gH�W�A1�z��e�W��`?�b�t�����l��
1>��-�O���y��O>���K ��'6*�o۟�h@	h=`��> $�,Pj@�`	�3p>�~C�]Ńpd�<p���4����n���]�L�Y�
,��`l�`� ,D�H�	@b�,�i@��d9C�P�B)P�C��y��
�B��hz-B��W�'��B�#8�)�2Ba��CE "I���BD9�qq1�x��E, ��H��#�<H	�2Ri�tA�#��i�\d)�yه��|�\@n �P	ō�@���P�(T$*
���D��n��POP��M���fG��U��h't:��.E7�o��g���?0#F��1�8c�0ɘ|L
�3���,c��X,V����zac�Y�
�e�m��=v�O�E!Ka@�BFq����� ��G�}-N�����q�qM�>�c�{�>%�R�R�Ҏ2��8e9��;��)���x^�
�O�×�;��=*:*Q*]*7�X�B��TCT/��A���C($�F	o��$jIjcj_�t�*��3ԟip44�4�4I4�4]4�i6hq�����^�i�U���s��DQ�hI%�/W�t�t�t�t'��F�IHI��C� 5����c��������'�7�������ƌ!���1>c������ǔ�t�i�i���Y�ُ9���y��'7�>K0KK7�<+�U�՚5�����=��[.�5���vQv�d�F�	�mNC��
�Q�
NFN-� ��A�U.�����6�7�6ww9��&;�O,�y�I�}^!^{����|�|�|�|%|#|��\��)�m�/p��e�v���W�������ڄ^�5�#����`D�E�EjD�D�
���U���b�bd��iq���x�x������D�D�Ģ$����	�n��R�R.RER����C���_��ɘȜ��*+*�#[%�T� g �.�#�%/&�'_+�\��`���0��[QI1J�����R�Ҝ2���r��}���J�J�ʞ��j��5�/jj�j��V��;�tdY�W�K�������F�Ƃ&���f�����V��Gm� ��ڟu�u�tn������!��r�&����+����l*&��L����9�}�[�7M�LRM�L�LmM+M��D͢���&�g�_[X�Yt[Kc˳��VBV�V��1�V�U�ldlRl�ْl=l/��ӱ;m��^�>�~ā�͡�a�Qϱ�q�I�)��3�3ٹ��������z����[�۳�BG�>pguq������D{:z^��e����m�]���S���[���W��_ݿ�%@=�l�j�f`i�Y�\I�
2
��	��|��J��F6��>!���y.r3�4�9�>�C7ωX�����8�����x���bBX�D�hbN��$��ɨd�����)��ک�Ӡ4ﴑt����k9Ny<����'�O|�p��;�q����L�̶,ꬨ��l��S�S�S�9r99����y�y�y��}��d
��'O+��=�9v�Y�fQK1�8�x���ٛ%�%�%��y�{P*_ZWFY[�PnV�S�_q��We`�l�NUG5{uN�N�o�L�V�:���������
��ll(m�4�5~hrh�wA�Bk3ks^��aZlZ�Z�Z[/�_:݆h�m[��vy�]���ĕ��y��3�s���g�L��t)w]�.p���F�M�f�������^�ޑ>���$o]���`8=H9xr��v����������W�N�OǬ�&�޹����=�{�������w\y����Û
7)<�1�8y���)����#Ӄ3�3�O��}j������3�g������>_y�b�e��W�^�_���Η�a��V�mǂ�����Ē�ҫe��w��~�?����#���ٕ�U�թ5׵���Y����?��E��Ħ����ï��X�]�.�}d�j�͏��;��,�-{�{�~:����������Ӄׇ���^Q^Q$|!���z�	���`.D�7��@����$���A��Pk�!L96���O�����$�Q+Ә�zc�Αz������X�Y��E8�8;�vy�x��-	�f͋(��ېЗl�:�q��gUHP�U�S)T�8b�^��S�F��Ξ��~�����q�ɠd�e�d�i�lC�U���t�w�r��<�2����q�ٽ���	�How3_%?^��N�b�8�ZPe�r�U�B8S�Nēȶ��h���/��q��n	b	?Ǔ*��)ʩ��'iu�!�t��Ϡ9I�I̢�&���rs���,�<=s�a�Hq��+%��*J�2ʓ++OT�Wߨ��]�ۨ�<�ٰ����O��WZ޵.^Zn�j'^��H�����u�
�M�n��^�>�[���	�巇�VFP��1�;�wE�)��y�3.<��a���G��6&�GM�LCӏfj�D>՟e���lt��y���/�^%��{�1�&�����b�������K>�}T]�[Y[\�_w���X�t�s��M���V���o׿���y����d��A��!�]������gH?�6*͋��q��a�)�)�q͔�xF�U������E�h��*i���!�цI���y�e��[{
Gg"W �3�9��
���� ��0��(Z��ߓؖ�*�)�!�"�AnI~^aNqFiR��ʰj�Z�f��b�L�xm{]]=i}v����Q�q�I�����١�S�f�X+kJ�G6�������:09�;���`����ˎk���Q���a��<S�D�f��������{� 0�D�#?�f
	
��	sG�7GF|�̌��v��S+;g�<�)�#�(q1))��ܖ���"52
�֘����X�q��/O�g�f�<ٕ�ş5�}�Y2�/7"O(o>�l�Q�A��!g�,5{��?���ҹ�R��oe7�*�*~Wޮ:V�]���ө��?:_��ߨ؄mz��ċ�-,-��}���\/�]�k����ܩq����G]m׳ox�T��u������s�%ӏ�_�,�MR�~:rn�ο��B�0g�F�ވ[H29�A��݅a��c�a-�}��8
\
��P�N��T�T�����>�}Z�Y�+�](�OR6=}-�8�-FS�WL!L�E,�,�����l��ٯpq��L�b��mν“���;��η�_s�9�x!F�¶�_E�EeEg�"�i�;%,%�H����������i�5�]�˖�QpW�W,W�Wz���U�WUU�Q:���K��j8ilh�k���Gu�u�����e��K
8
.�v�u�w���4�r���Q�%�}1���6�KQ�j+�U��gk��6Z6Wmyl�� �������Վx�$�'G�;���
.�.i.��������M=����>�!�Q���2�����g�_Q߳���|�&��k0���[ȴ��b�qPg0Spj�R�QH{()41�m�A��p:�q�G�D\��DDދ�ʎ�m������=��W�;�5�7�9!>a6Q.�(�k�?�@�>��`
W�kJ`�����*�	�uU��@���ZXq�:0��NŠ��`֋��<d	C��hZB |}X��!:O?a=g��DV"ǐ_Pl(CT,���D�Ê�=�AbT0����-��P)�)�R��Xp�f�gJe��)<'>?DEOD5L`#�f��+�ihfh�i����f:!��i�ރ�;C�(�C�f&�Q�HV^�gl�F����\���ܟx�x��B}�<��E<E��B�%r$k����d�d?˽��0�xS��%�V�Kp
�Q�x��^kO�FWD�@?� ���+�����y�E��i�Z�n�Wv8{
�x��}u�wMpv'x�y�zm�p�j�9���
�F����6\1�L�g��]�c��IObJvOiI=L<�x�+�m�s��)�_y+��E5%��&����=����
?.P_i5mKh����pC������m��0�h���O�?Λ^~j�l�竽7e���o?�\�_��8�ܴɿU���{����{�:��D��? �x@@(�� ��`<_ JHҁ<�4����"L�R� ���
w�"�m�';�V�WQ��,p��D��[�V�m��SHQ�R�08+\
n�R�2��-^��G�IUC���I�C-A]F����Y���] z��I4�K��+y�2�/����?�T�ڱѲͰ�sxsJq�Y�v��>~6A
�}����E~��$4$=�r�{e�����'��*��jO�!
AM-�S:��YC��9SF3�R�'V�ֆ6�}v;��	N.hW+���_=L<��~�X������s�D��
爈�|-S�+�#a0�99,�n_z��A�VY���r��x�+�N��*�)-+?QY�QkR/��D}�����m���w�_����{�w��� �������U�}S�����L<�v�y�ˢ��o����%|H^IX;������&y���췝m�r;V��{?���>h�G�1���_�;������%pq@G��p��Cwa�I�PE� 
=��p��FF!��P8���_F�Gs�]���gF�#��ˇ
�va(L(�)Vp���2���M�%���D�H�D� PKS_�ᢩ��m"���<H8ߎX���0I3m2_gIe5fcf�`��L���6�Q������R6�M+�X���6�ɒ�G+X+�+�T�U����W4C�~�d��z�M���h�<k`n;oo�0�����6�n���C���/0D6
��	�
?��c�_�h���/�`>ِ%�=�c����0�hѓ�A%�Jc˶+�+Ug���5�Wkx��Ly�������+�ﮞ�
����ۋ�[�ji��[r�h����ɼ����ҳ�s�^��y��ͅ�%���3W�ֶ6N}���x3�����{��?����wro�g���}��ۿ��
���M�=x@q`uP~�P�0���O����d�~CJ�����7A���.:<�o8<��������������u"��t��,�)�3���DžP���"�4´RD:�}�I�F�1�uV"�;���s��G�7��
����P�p�Ⱥ��x��
�=iM����
f��J�*$U+��#�MM�8��Wzx}Uo��6�&�fs&!K9+UkU9[~;j�m��C�MN��a.��Jnln�G���<�=��|��|�}v|���3��`��t;�,$,T?�5�S���H�(ި��Θ�X���q���	Z���I�V)���Բ4�t���c���Ndd��t�4̒��9Euj'g)w"�f~}��¨�GϘi+��,>�[�^�TN���DU���^�^�P;W7]?u~��m�z�n3�"uK+�%�#�
�-�8w�u�]Ϳ��5v�͍�n�����O�A��@�`������3c1w����#�ۺ��A�x��̉�G֓ʏy��S���3��\{Z6���g���������5���m�B�b�R�r̻�Y�>V�\X�\�[�x�����M���o:��wW~�j8p�G�١�0�!2�~�'0�]�E6ΙRO�_�z@袮�)�� &�ő�R��N3װt���=g��I���������k�#�*D-,#b/�,V'>&�*E�V�q�M������F�@�MEE�F�|$M�H�Q�V���q�	����nv5的���q�}7�kQfI�R��Z?��`m�eOe?����z��K�����ۏ���Y�$�9�J�Np�,�}�ӟ�m@}�'���&�&�9�2���ߊ���|u*Z)�cLi�^�׸�x�����D�$DRG�k
:�3�5
�֙�~������~�'�O���*�>��Ô�)w8�$߿@���p�tϙ⢨b۳
%,%�ޕ��u�����t�R�f�ީ���QWU_p>��dcfS����̋�-��N����.���^��H�,�zV����$v������n��`��{C��F��
���u����u��'�eMf<Μ*�n�y�dk���\���/�^��۾9�va���n�#z5mct��.�����]�/�A@=�z��|�~��/!,��0���iTXtXML:com.adobe.xmp<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="XMP Core 5.4.0">
   <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
      <rdf:Description rdf:about=""
            xmlns:exif="http://ns.adobe.com/exif/1.0/">
         <exif:PixelXDimension>816</exif:PixelXDimension>
         <exif:PixelYDimension>418</exif:PixelYDimension>
      </rdf:Description>
   </rdf:RDF>
</x:xmpmeta>
�go�@IDATx�\UU�%��G
I��y��S���E��?��j8E�;��:ic�fLFo��J�$������YTh(x�xER1o� G�?{�s8{s_/���x����<��}p=�Yk�[���knn.�H�H�H�H�H�H�Z'p�n �#     ':0N<�	�	�	�	�	\��\�CDI�H�H�H�H���8I�H$@$@$@$@$p��s�
$    p��$�#	�	�	�	�	��5O��5?D4�H�H�H�H�H�I����$@$@$@$@$@�<:0��@     ':0N<�	�	�	�	�	\��\�CDI�H�H�H�H���8I�H$@$@$@$@$p��s�
$    p��$�#	�	�	�	�	��5O�����Bai�KR���ؾ��[u�u�O|��ݲ��Ԍ�w6����8_g:�}nGhh|��b�q;�{n�ޘ�Q��̄i��ݦ|��Z,ɪ�>u���{�*�Yɇ��_7�*�Z+[x�U��by-�U�   �둀��.�'��rT���ˁi9�i|=���=�c��?`¢�Ѹ����ng�L݋���a��(܄�G��{�cz8��V��៱��u�2Ԃ;���E�h�e/©}���/����8�	s�D�ێk�NS[���
Zx�2����3���ϼs��^�U��	�r�ZܢG[<~�_����Ċ��^�Uo�z��}��{��#�N��Q���80�sJ��V��}���j����o�]�.ռ���Wf5�[�	�	�	\K�K����%l���x���G�p^���^+�?�g��c,?T_����(*.����PX�.��V�%yy���1X��y?��S�����~��٬V��Î�3�m��:
@�S���J���>�3�&M'Nfb�?w����)��<3�z�k�f�nM��{	����b|_'+���B00��-9�y)�mG`�d�Q�EQ�&a�����F��"1�5���AݢZ�R�ٳO<�(¿W]�E]}�`�;�,   ��:0Ξ�=��b�y�Ch���Ië����HF/t�; A�S�������g먗��;P��S,_�E銧�4TG�kǦA�ɩ�7��#�-��80�9k���$ʂQɈ��nAC�����ns�i�b���ŸX����qtg6�>���{>ތI�%��+��
�ϩc��û��0�6�>^J��2N�8��Go�^��x��4��S	���Τ�˜!�n��lK�*DQ���oZŇs�ߏ�F��̠����3��KP(�[H���0�-8��爢D.�����wH�������Fn‘��xkF/��ݖl@�����04����U�:�7�ޅ��m��$���VmǤ�y*)��a"/��I�K5{1�y��غ��-�rr%���yq`T)��xN���
�7��٢H�+�M5�E��/�bDd4����#���v�_IW�>SE:?���2ڏ.�ԟĹ�/tn�m�_ƓK�{��%l�8���{i.�NL��@��S�$��^��gL��j��?�=q��Q\�i��&__��?�c�'}�~�/G�d��x������(._��Y�-�SF#vMf���.�xB$@$@$p]�VIU�t���/�{��m���h��7j��(s~�N�xu������H�w
��]����w�2���_Cp���ђ����z=o�"h>W�e��^x�A��m�nU�IZ�8em���,/+R&ʚh�zW�t{V1�y�Cpo-��{��h�Lh��'�����(���'�wh!��^���B�p^����[M�kn��O}���c��������͍d����T~M}���L��6�x�yP!]�r�}1��,�/�=]5��nͥ�ҭ�ezRW64��q�h��łٓ۩�K��b\��Z�!�0c��Ge����K��.����Ȼ��"?p@;tQ��,����[ˌl1੨V�\���{�����}z���$�"Ѫ��Te��O«�/��:@�|_��/O�'�B�<}[~ڄCʽ6s���m����r�4B[���`�o�]-�>��;vP��^h۾�Kq�NVՖ~�V�3oE��5)�‘��nyJ$@$@$p�Л��p8���1�I3�mρh����O��d.z5C�&&X�f��ÿ��u.�;%G]P�Ύ�e�h���K���#x9B�d�@
�����x��a,h3c�Q�R�	�hq���l�Z6-����:����l��
��H�Z�����F�;|���sU�����_�����/=ٻ�N<�-�܆ޒ}oW?�pNJ�r�㳤}�M�Fh�}��]�Hʭh,K�
5k���9�����A<��*�.g'��? ]Nz��g�2�v���iL�M,���Vx�d6��-�~�W6�S7�:t=��[����Db>އ�?�б��_C�ߴ���S(U�y�|*�S�-\˺z?���҇'�]�b�+QM�v�nY�����׎�῵G��8��=đ� ���iݾ�Q�"��k���bd'�g��Z7t<B&�{�a�]ؽ��wz�jz��������\�����ݖ
k�7�+�[ލ�R1���K�Ϳ�3�V&#��@4���"���Ь�j�Dž�������└����]ȓ/oG?o��>^��������T�sA+�lPݲ��uY�   ���@���l�&-P��;�חV�;��s��Ӌp�6i���^}eKРa��T��1ߖ>*R���L6<�����~û��WY��t|���${X*�0���.�8{�.����w�Ⳅ�������hѾ�n��)�l�S��p��v��m�s��?�%��g,��8�>���3�b�s�Ѧ\R�f�H��O����Ή#��r�|�q�yQ�s�+0��j*�
Y̆ή牗+��Z�ԡ��村9t��Vmۉ����B�o�/�T�v2���}8��P�5�HQ3�?�_�Xu`n�%��Ut񲲥��d�Sk�@M�T�A��}�a�;荻�B�T>}
oG}�u�W�cj|�9�
������ڝ#���0��?"�G����|�m>�=�.f�U�Eut�rr�W�%k�O�ѐ��������۩�v�~�h��a>&��.d�K
��g"   �\��(�O:b�����IQ��s����(yg�*��˄۵�h9����/�+�ҵ�13�%*m�+-���w���l�|�>��,a���}����=�qj��Qm�=0I�����(�ϋx�]�fW�Z�j�w�+�k\j�'��O=Գ�%�d��|uV�f�������wS������͊�H��1�PL��S��r�2��F�{��$zݫ-ӫ�G�;S���@fi�����R"59�y��qT~v��po'cq��V�������eh�:+}:	�D��ҥgp���,�S�Y�dWM��#�qp�3�O<�N�]�y5��yz�Eb�xs�Z,����ǀ�wHt��n�u����g���$Q�4��ev`o�&}=��`Pp��!��ڢ���K�u�4�?�,x �L[���;ig�g}�H��B�M�WtA��<�I��mX��5(S��0�	�	�	��s�Ue'SV�X�l�o��C�ebj���l�3�=�g�%���e��/?wɿ�hY/˰�%5f�䧰�ver.x�e(|�w�_O<��s�o�ѡ�8ݠ#�eɗ���ퟬs�4<�=�d%�P!9&��u2�م��V��79�F5����ݫ��0!��j�ό��E�j�q���>�A��7w��ѶU0�YY[e,�@�8
|�BOّ���}�s|��Z�U?c�3��%�(�s�g��>��t�[�-Ѥc3��ь|�� �V��y*C��]��Xly�Lb�=jGAV6��Ԛz�_��`��C;U��m��>��8�9۷�ث�UR���g���r����_��ޡl˺u810-h����V�%{���h�W����a�?O΋��z�����-Du�~����p8v`���V�2�M$@$@$p��y��cߋ���V��K����4W���{�7�>�����	--!�H6��ć)��_��EjJ������;�ʿl�ܓ�=��~���0·)Zv��r^���{l8�n���<����jU�	d��r�J<�W���Y�e�2�6~t�崞�2�Ȩ���.V�����w�d�������i�q4Hi�%�ݱ��qm(���q���t�R!�C�S��Ԅ���hk.�g?H�E��<w�>�
Sg�'����K�b҇y)'eLoE��%.��̚z\�n�<�
�%J�&{�ݒ�3cN(�L~nKg?c�jkO��	}��T�z�E�Bq�������V�Òy�Ж֝2�Ҳ��Y�>��C$��sW�.�r	;����;\�rG�f�U�9^��8P�p��qܮ�%��(�l}9{�N��u��Q�l��@M˜�ȱV����H�H�H�#pK�~�~��բ�Ϳwh,�;^dYx�,Y����m��DF8��h�f���#���s����(�R�3��.�.�|/ o�+#�Hs���y����ZvlIIB��NE!��*Vw�t��
����`�%&�ᝎ(�[v�����2	ΓG	��G	W�<ˬ��^y+,Z�a�į��/�:x�w���Lz?�
�|����S;y�i	>{z-�w��RD��ɺt��W��c��Q��9��׸�F����$Ȅ;��Q���Y�e�|Tl��9D-M3��sQ�N64,:�o���๦�[[}F�u�j�LW&H�H�H��+�L`X�����o��c۱6]~=��Ox��_Vz^����c���J���L���:�Q|��_��9e2�҅�N��l���l_9w�<2���܁٣�};�!�y�C�ǻN��iף�+}�5�����RE��Ȯ�>��Z0�u)�H�H�H� `�\��Ft��ݚȻUd���HM܏��kJ�^��YY1%˗�b���K8�-+i
	�	�	�	���@�̍0��	�	�	�	�	�$����&��n�	�	�	�	�	\��\��C�H�H�H�H�H�����9�K(��]�����~���;O�Qc��=�ؔuؙU'G[L<F	G���oߍ���ih�Xuu�Z#c�h�m��<d�j��D�h܍�<ɺ^�q�^�]y��3�)4��{�쭶W^9%�	�	��ME��L�����ܕQzhT�F�Z��;��aã-���]CkmAYQ�ᣙ1e3����7a�����+��&̌�ݨ��դ���Z�����2�<���N�C=
�G]�o��^0�H�H�n�r
��3S_�݉YT�sFDaI�^��9Ӑ�`�g�W07)n��c������ٻ�z�*�e�P�xo�j�+R/)a6��o����+��&̌�ݨ�f=��UM�P�T���8[�_p��&O嵶37_�.��y��H�H�H�F"���a��!h��j���Æ���Ů�=��:&	YX=}<��^��9r"V�gɋ�iH��*�+���"�6�_�A��>�&�Ew|P�3c�5����Eӣ\�O���(5�agR�Ī�-1	H9s�,ZsK��g`MB���j�G��%�#�.�YY���:4�ȄYd��cM�2�9��&i"`���UiNfY�:ezi�bOF�w�x���|E����)mc���4$�:�Wr����հ�̪0~�]�Fe�*:ct����8%.
?���R��g��P���J_�ɑ�nIz�u��N��p�Wf��>��5v�v|g����`r�o�έOI�H�H�j@��c�m"�薵�w���H�K�qU���~�)�[��s&��o�fR$>��6�H�6
�w��#zf�~�~Y�֭�9����
�j�l[�u��ڣK����ҳ�lnG��DL����
��u�$LW��֪x�e��!�+���1o�nG��G�6d/y��M���"a���{イ��W��Nϓ����ヘ�����hЗ��hi�pK|=o6�nʃ�G�����pa�	�&M¼��q
]�����c煦��x'Z�:���X�&���5|�L0��$*'��j�cfU?���0٨�L���ct����8�s�E��4��d���1F��ІdL�6y�Cey��}]���۩��X$���)/
�'�C���"W�UHFvz0�Y$@$@$@�$P1p��_�/�����B�6俱HIĬ%�/R��\��������w/:�%v����Ob�J9I�eMA��X�V��[):������p��C���[D�
e�/�tR&������f��“R�
�w�5��a�����;�bC����>���}=��ixi�$�O��]ð<~(R��T�{�wc~R�dj�P�
�N���x)i=��1��p�ݥwҹ&�>����eR�D�\�P�-:�K��7�akQ�BG�k��U�O��w���mFf�1�D�AG�b��<�4�C�{�,3��5?͒���
>�I5�w��ߟ�ck4>V<����d;K����}�,�IW��DٿWe�A�c���퇝%�7"kF�?yF�~�Q�YF$@$@$P�i8=*i11��Gѱu(�'$�k@<��%��*$�ruL>~�S�c��[pD�w��i�~���yɴ 3�ʩ�uV�8�JGr_���3G!e��Pp:_�Z��i�����v�Vf��GΡ���+1���X��=ar9��.ݳ�����(^��&�r8��J�#
|��N�l���)�HNަdD�΂������.�S�a��P|L�T^�RO��j��̪2~���i�Q������1R*���q�<sɬ�4���du@s����\����߉
K3<�i�o�k�E�vrȖ���_�9۩5�A$@$@$P��"t��Y�@l?]V��ݕ����7)뜔���Y���Q��e�(N���,�m1��s*2��8(��K#����R��qa��\���8iYvY�S���(,‚�}0_1�|��b�8/(��7xbV`�ۓ
���W���\js#��x��v���0��Xm����!��,�:��CO"π'��<�S���N��&�];I�=Ap�\��Yfe}�ĬJ��a�]&��*����R�&wO�J��dlݨ{8݋��=�ԡ����[cp_W��m�,�}7��\
p�CB;qg��NgI�H�H�jL����I[��cbѹy#ty~���ϭ��̏7H��&́�lF���R��ϗè�J
�7�Lz:z1����YPp�4�E@W��b�9�F�M0�f�؈�Rs�DZ-��01af�ڭH\8�؃��{�4ǎ�	�!ֹ�^["���abT��oS7��ԷE�c091�"�`��}T�9td��`���\���n�U��Yjͳgģ8p�.��[���V�éq��Ui�<����2W���1�9ƽ��n�ƶ����L��]߮1H	�Eޯ23	s�W���9�<܃F�2S��QݨI�
�3�>�F!qF��x$  �9��3��� �@�8�?�6C��g^�˒*kR~�,���=�QHLՖZ�-�Xu�~Y��[��@qG�TR�8��Ҕ���z\8&�W����i#�`��	��q,$�;w���?��c��H�03�;��ذ��3����eR����3po���?I�W��c	x'�S�"Z�8�bìL}�6ҢG�,�P,��4! 8\��p�R֏IR��-V�/V��N"l&-�NX�X��q�<���b�O�U\�ij|q��)����o�a4}�-��U��iھ	eM�{��L�[����`x�ݟc�޿e藹���˸c�t��͐ZQ�<�he�7�j'ʨ)s����Y�����Ƨ��.Y畿/v�*�H�H�H��n�ׯ߯������)�`�3��eXU�3}��;�B2�rN(m�ج��H�.�<ɨ���Դ�lhUxi�꺵2e�fq$Q��z�k&�,�B�j(����z=��뀧-Uʪij>~U2�C����AnY5�YSf��q��C��t#��T��7,ı�Lmթ�R��gA���h�l[�x����,�g�\����2K�ڪP��+3hWA3H�H�H��L�RfLB|�b����+h�}�Ǣ��zo2y���i�RJ�j�  ��B�:��]˻��ܓ��Y�u��^�	�	�	\U�:0ղF��L�4-�Kp|W*���K��V& �+H��5@E�xַ�d�,�̕�fe�&<%  �\Y��M     �q	x~
ٍ�_��H�H�H�H�H�:&@�:<�N$@$@$@$@7:07ۈ��$@$@$@$@$p�sM'    �����m��_    ��	Ё�����	�	�	�	���F���6��/	�	�	�	�	\��\ǃG�I�H�H�H�H�f#@�fq��H�H�H�H��ct`���$@$@$@$@$p��s��8�K$@$@$@$@�1:0����t    ��Ё��F��%    ����x�h:	�	�	�	�	�l��l#��	�	�	�	��uL��u<x4�H�H�H�H�n6t`n�gI�H�H�H�H�:&@�:<�N$@$@$@$@7/�7�
Kc\�Jſ���'ݪ[Ю��x�[=�]g�WQ���

��ڗb�q;�{n�EcfF-o�2�}�w�J���k�$�n��aP[�n��d%BV~��Lj�l�}Vފ�`VQsH�H�H��G�L������Q�z.�y�l<��A�u�8��W�̏�;��	��G�2$N���ú�e2�^T�NW_Y)e����Ţ�3�^�S�6ⳗ_���o1 �)pf��зׅ�0�H5�E��ݠ��.��q`���1s�q�}��;����%X�ߛ�*���-z�ųᷡ�ŋ�q�N���^�_�������W����P<�z����c�?�ԪkeK]�g�~���ơ�O����U�R��]
}�`V�%	�	�	���D�p	٥Kj�۾��\��D;���cy(�\����!������nGQa���p��,.:�������V`G�Ӹ��f� �ͩ�eM: ��(Ό�����L,���r�X�K��VP��gf����j�������Y9��}�Al��#�v��ݍ��GbL�Z����v��Ll��苢lM�,��n.R�.9"1�yՒ^��ֺl�Z�R�ٳO<�(ªUW�y,WE_-��9^�	�	�	\�#0�N�=�be./�y�Ch���Ië����HF/t�; A)�)����ss��r���^F�{�@�O�|�2�����^��/
��$ʂQɈ��nA�sΚM�)�)��
�8󋥿Ÿ��o5L�̆���=`�Ǜ1i��rz�A�9u}x�}�߆���K�'/�Ď#�{�v앫�Wz!nH3�G*o	����L�.�y����϶D�B5h���P|8���nD��j���:�����Fis�pf=�'�Q��E��!�?������MQ�/��	GB����W�v[������|P\ м.��Wy���<z�ƷE��O��Z����d�ʆ���>&�/���8[�fb�Ϸ`��yȕ�_��;��*�����A���S=[�ze��F����^��l�ƾ�؞�s��.�+���g�H�G��!QF��e���8�V��-�m��xr�|�:���cG�s��w/��Љ	��zʟ��k_`����"W���5�'.�;�>���䋢����x������e�h�l{���YC��e��˷ ?��e=�c�hĮɬ�w�eOH�H�H��K�O=�i�E+
�������y�j�o�H=Q�ޝb��xu�5��2b���l}qO�e��U���O^~P,k۪�[�6I+��Mx_4��eE�D�J�*�n�*F=�z���=�v4S&��O���K�L�O`���;
���O�K�~��8/���~��&͵H��O}���c��������͍d����T~M}���L��6�x�yP!]�r�}1�3P�3^�{>��j86��ݚK�[��0lh�E�
��)���'�S�����	�F�!�0c��Ge�����&S��K���#�.���]T��ˀ���Og�$��2#[�x*��8/��?��.A�F2>u��1��H�j�<U٦��狻�P���-��S��Ii��@qO–�6�P�r�
Ĝ熫uy7����/̓�V�F�.��ۼ-nWK��2���Y�2�m��['�jK�P�ܙ���ך�y��L7�<%  �Y	���yh;�Q?8C�4C�����+�΢�y������`������^��ֹp��QtA�:�&�v+�W*A��'�řr��YkQ�`�\ w����K'�q�7m��z���o퍮w�B]Y�*�KN�~�+��*�N�.=��5G�6���d���O-ر��,i~ӹx_��s�$�r+��a�P�6�ߟ��a?ᙏ�#�
�r��$^��(��z��g�2�����iL�M,���Vx�d6��-�~�W6�S7�:t=��[����Db>އ�?�б��_C�ߴ���S(U�y�|*�S�-\˺z?���҇'�]�b�+QM�v�nY�Yi$˟>��[{�.މӏX�C�J�n:���?��Od�~�][���<�,�R놎AȤ}�1�\����^}G~M�R���]��0s���۲a
�t�˻1X*�w�rI����|�c��dD���^�(�|�DYLh������V�}a�JF{qJJ�Q^�.�ɗ���7�|��S���J/��M>~.h��
�[v9Z��eOH�H�H�nN�w`�����@�O��__Z�t`�;O/�Ƀڤ)B6��e,A��k��^�1ߖgm�n�.��G}��x�����d?�#�}����ۊS��3��E�8��{\�Ⱶ{f��p��v��m�s��?�%��g,��8�>���3�b�s�*HT"R����?�P�7g�F"�����d�~W`(��T"��
�]�/W ʻ��CYO�;#r�xǭ(ڶO�e7L���J_\���dn��9�ppW��Zi*��fhR�����"�KT����e��_�.�'F<�����N%���'�6��޸;*T�I�ӧ�v�wX�}E<v���Cڀ��A[9�j�?��9rqn	�?:�Z�#�xtj.�/�'��ۃ�b�[[TG�-� �{�yQ���T
��/;~>���:`hq�$5��0pa2�|Хer�3�	�	�	��k�Ze�'�;��a�s�@'qR�t�6�p:/J�ٳ�o�2�v�3��֑��+���"�+��赫L���0����Fzxr��E���Һ+F��5��J��Z�IFq/�����W2Jk�:+L3�L{�W�󻏩NGL���f�{$B�D(&H��)�I9uR��y�����t��Ֆ�UУ�)��i ��V�g�e)��{���8*?��v�����}wIl��<˻x^[�ժ�ҧ�0IK�!]:q��k������ɮ��$G���t�ܟxV����'�jj��y�d�Azs�Z,����ǀ�wHt��n�u����g���$�4��ev`o�&}=%�2�r��!��ڢ���K�u�4�?�,x �L[���;ig�g}�H��B�M�Wt�@������s�6���È�)�q�H�H�H�H�9�2��)+p|�M6�סA�21�c���Z6ʏ�dz�o��2�����H����eXwȒ�c��d�A]}.�F'��B��+ц
�11����q��.�xD����ɹ85����Ж��^���9xH�҅xëe3<3.�;�Eܪe�1�O;��_��	G�JT�Hfem��T���4�>=eGNJ�����j��W��A�܎W�Dh���=0�%;���o%�D���ԊG3�j�<[A���<t��c�������}zԎ��l�5�5�Կ��ړ-�v�B=�2�C?|�prs�o+�i�W٫�06J����>�K_?�t��Cٖu�pb`Z4��Jf~�B-�sL��@��݅?���<9/:��ے�Wܷ�Q�Q��A���Q�؁mؒs[��tL`6	�	�	��MF@��mw�}(Z�gHNX%/4�i��E_�:�o�}���7zZZB�K���SJ	�pA�Ԕ��1n����D�sy�U�Պ:�r��.uUx,(�4�(2;"7����de�
l��8�z��#�ږ>�XQ��SU�'u��<�,O[���@Jk-����kC��F��EM�۔�I���&�#�ۚ���i��0�ݶ�c����_��o0u�f|�遘�a^�I�/nE��%.��̚z\�n�<�
�%J�&{�ݒ�3cN�z&?7����1O����Ʉ��v*B=ۢ�Y�8x��dl���|+��a�<ghK�N�niYU�,s����!Nڊ�+K�x���[�o�k�.�`�#B�b�*d�/SF�n�W�8nWg��Ke�I������=a'�d�]��p�~��eNC�X+fnrxJ$@$@$p���_�~���jр���;4�/�,<����ZZ�6�Cq��Vp�y�
�h}WGԗ�E�6�9�Q*��v���D\��F]�TO�ӵ�ؒ��t�!��

�U����Ы)!+�1�TKL��;Q��3��"'ݍ�e�'�#��,y�YY+��VX��/š+i�Y/#�.3Z��A����/|�Z�j'/2-�gO���U�Hy:Y�.��?#},7�4*�3�������2{��p��=*?�W�>k��l����_<���iy.��Ɇ�E��́�<��rk��H�nY-���d	�	�	��uE�Ё	��V��[���xl;֦˯�7C��tB��Jϋ�}�z엕^UIW��	���A�2���_��+�;�L�U���ة=�M^r)�WΝ9��;��-w`�(mߎjH~���񮓫d���J�g�,꣭�T��5���O1��j�_
   �&:0ׄ�7��w�&�nY�w�,R�#+�ڂҤWF=jVVL��X5u���k�JZC$@$@$@$p#�s#�"�@$@$@$@$@7	��m�I`��$@$@$@$@$@�6:0���:     7��z��J�|ש-*�dz��}����k�<z�76evf�����C��+�~��wc��jZ'V�jAL�H_؇�Ǯ�}U�52���&�p�<��<z�kr��l   ��	T��3}=����~=4*q#�WV������ш�O����
�Q?jb���U�����	c�UOQ�ᣙ1UoP˚W[�bnM�u�.�P2���2   ���)<'[�tL}a���v'faP���%U{E��LCn����_�ܤ�AH2�AZjJʿg�
꩕����Ξ;V+1�W��I	���,�y+H����R^]�]_m}JGj��@]�.d��e$@$@$@$p=Љ��0~�4�i5���a��y�bW՞�k������>Qv/�9�ҳ�E�ʿ4$M�t��E�LyZ��� Um��Eݢ;>�艙1y�W[Eߢ�Q.}�'f�'���J_�ɑ�`T&S������B��/k�&��4���R�\2�2'�Y�c�!=#
���2��Ǿ��i�����,{tp�.id���Ui�q���)��rkl�:v�C�f���g�M������!:}P��s����`��]��J��ȄYd��cM�2�<����l�E�4�W�>��8Tf�	�	�	���E��c�m�ϣ[�b��8�"	/��U)����X0o2Ι�ֿ��H|0#m�;�8mVﰣG��T�����[�s�������ض�{!�G�R����gh�܎�?	�N��I���+���,&�c�
ơ
ɘ6m6�F���/c���4�Ԧ��7K7�ǣ�R�H,[<!^�H��y�w#8b>�/]�����^&���&���c߁����c煦��x'Z��Y���e6aޤI��p5��!LR��y�:v�yv /�|�m,\���\Wc��>d/y��M���"��9�|�W�T�O_&Z�����-=���b�>�{�H�13�>��x��Agx�M$@$@$@7����s�K��0|�\(��7)�����H��+1?1a��Eg��C�X=�I�_)')@��)K���Rb+EG�a�V<�#_~��{~���C��E�N���A��_6��l!�XxR�A�.��7��4þ'C��Re��$�t��,�og�F�r�O�KI���,y�n����$���	�w-��	���ܻ���6#3�Kвe���[��z`BeY�8>g~م��+�4�QXf�vc~Ri�]�=�X���A��>}fH4G��"E	���+e��\�ቧrC�Oi����ě���j؇���v�p4+�I$@$@$@76���yzT�b&b�c�PDOHD׀x<9K&�UH>��|�$��v9��H�81�0��/���./��7㨜�IPg�#���q$%|P>����z
�e�^p:_��Z%��|�&�u4�6�27W,6�i�N$)�/����%5і��5��J����e�ݥ����s�v!�+�����yL���V���L|�Q:��aJ⧘"u�6%#:v֡�ع�3<���JL�d$G�h�G�\�2��Yfc}��ۧ��)�(���.�ӐT�u7���B   ��	�:0J��/�������e����]ɭa�K��/L�Z�lEDg�Q(8�L�
�\Q����M��b�+S$�YqP$�F(�#�K��0]
d�AzV���Ki�J{qR�t��Qr��X�~;�hO�}��a��>��� J�g�؉���k�!i}�J�^�y��s�&Q�-Qq�1D���Zga�#���T^�J�UP>��>Xb1[���<
	1+0��i�ɴ�;,�<������ڵ�=�RH������N�25c�I$@$@$@7-�{`,c�&m
f��E����yy����ϭ1�̏7�/�^6alf3b�V�Ne~�FeUR�����8�E�DF"�fA��3��]eӋ�?�-WUI�ر��]c�0&�cf&a�l�7����Hk抍8-��\��H�Eu*&&,�L�
�=#��C�pwq�'}W���6X-64W<>�Ƹ�j��t�Fz&'& >�?
�|��G�HO���L�0L�:����
��L�d�+��?� >�,ͱ#|�{�ULq&��e:z:�O�K��j���N�gdz�1�H�H�H�H�f"�9sf7v��.�A�!�߳��eI��(��I�I������$�F�Eyi1V��_���V�%P�%�;�$�4e"q���	3��+�D-Eڈ0���B/"C&�J�Kw��>f=�2�X5�q3�V!m^����k��>�F�\;Q���*��d����m�0a f,wXcdž����(�}q����,���i����$�fr�	„ŋ����3���̄c��~L���lq�v�|�c	x'�S�"Z,O���Li-�3�>D͙
[S�2)N�g�:�fL���s���xU�g}F\x�RA��Y
�<�Z��i��#;�d�q�)	�	�	�	܄n�ׯ߯������)�`�3��eXU'4}��;�B2��6»Z�-�Y�2��]n9�Q�K@�N,6ZCZ��n�Z��_��XZ����Ѻ2�z팕�ũ�K
m5�]��,���V
E]9*;�@IDAT�<�by�r�5�Y��=�,z���Y�b+   ��	T�IH�ςX�u��^�ײ�a��X��h���ë�a�K)��Y@$@$@$@$@$@�!�y	����ccݮ*9=s?~�#Zz��TLW��\I�	�	�	�	�	�@	T���V#     �:'�)du��
H�H�H�H�H�H���T�[�	�	�	�	�	����jI�H�H�H�H��O�r`��/�G3c���     �)T���I�e�P�xo��*��H�H�H�H�H�:"P��%j2V�e!+K��u�tX�Ӷ������(s)�1I��HM�U���Yc�����!�O�@zz��NE��HI�X|���З��9ڣ��f�H;͆�� 5]9�����v�$    ����������}�M��yW�8�$X�6��7O��4H�D�0���).�^���+�`���ف�t��ݷ�pa2Rs1��r�q��F�x�[����Q�
-[���4y���ۖb�a/�����'	�	�	�	�	��
E��	M|���g~م��/!*j�8(�Ғ��'A�AOB	��b�ʱ�-X"W���3Wb~�|d�b���n9O�ܹI�̗�˘�$���	���e:��S>%bSt&m-��/?D��|x�
U#>��D$@$@$@$@$p����>JC���$~�.�Z�4QuX�|���&��}��X0��`���b����ӈ����2�
��A6x��#��Y�����݌�r��X����g �E$@$@$@$@$@�+�80���q��#�&a��|��x���*�I"G"#C�z�$�u�G.6F�J��ϫQ+W}��G��,�}�h���뇨�In�
p^"BJ2C��D$@$@$@$@$p#��c����G�G����	�袳)�`j_�|0_
�Hie�J�x!�a�(������\��ዑi��j��ĄE���\zyB$@$@$@$@$p��M$�M&��fǨ)ZۼM�X��S$kɲ-���ϱ�%��v��X�މC���K�0�ʜ����"a�@�X�fdž��)��/��q�;�$��H�H�H�H�H��#p�,�57W}ܗ�w��:}=��Jus��bEp��(<���첕��a�X&�z0j%�ve���2��${j
�!����UyM$@$@$@$@$pC��X'"cq��|/�iOr�f�y,�%)_@pSyL����7�%���D$@$@$@$@$@W�@E?%3	�G�((���$/{�5�~��Cf�8t:L�K�Af�	�	�	�	�	Ԇ@�Lm��-	�	�	�	�	�	�!�<����h     0 @��H�H�H�H�H��-t`���5$@$@$@$@$@nx&j�"|43�A���Bf��`    ��T|
�
Ơe�P�xo�����W�@
#    ���Aƌ��dde!K����#�*s�D�Jw�g�!ib��5��~��k������������`����t�IY�4��k�&�"ڬ��b{F���<��ҏT�[�Xc�Qj��7��2'V+���*�UH�H�H�H�H�jN�^``�_ϝ;WABL�J�!�
lHF¢/�6]Ѻ0�~o�Ҕx�)ځę�8n���=��E��~K�3��-K�v�n���û_A�{FM������ͽ�nޛ�Z/={܃Ki�a�Q��p6�wvE��t,X��vmC�7[p�|$���3:^܍�i��ۂ;1h�#�㛉ON�P�{oxN$@$@$@$@$Pt��Y�@O3�{�1t�,UoJJ�z��&������$比��[��
��!���#�0i+�Ǒ/?D�=�E��P��O5Ӈ75Y9�'㥤����x85�ݭ�OZ���pL�H�y��$�~��u�c���;�bC����C:��XQ3�Z+~�	�	�	�	�	�%����27W�m����,ڂ#E���%����	���1�r�̈P����E�e…_�5�M|�k��
]�|\gO������|{~>r���Ƶ�YQsH�H�H�H�H��f/NځN:��l�I%r�S+9d+�Ug��8�h�祽⶘K3���5�'Ά�J��‹%ë�b�[�Q-‚�}0��J-��j�t	�		�	�	�	�	�@]��ğ�����5	c"a�X1ff��Z����K�b؄9��͈�3Z]�����Z�X��Jē��Ĩ���ߦn��\���	� �V��HLLX��ҿ*%2�Ԏ�H�H�H�H�H�jE@ǁf=�26��f��O#n`����$�ma���T��B^�B�M�Gq��%���ä�bǙ�U�j�O��KEI���w%��k`�K�S`F�;�MD)>J�|���EAᘱ�S,N����Ph1��tX�	�	�	�	�	�@���_�~�����j0[mnX�ci�ڊ1gM�6k;�@&Ҳ˯�rVr-��
��厇�_�L��+����K3l�`��!-S]�[�$@$@$@$@$@��*u`���։�X�n��$oOr�fIT��H�H�H�H�H��l�7hQ���$�yx�,A+�L& �яrTxI$@$@$@$@$��q`d��s��'+�G$@$@$@$@$@U ����
mY�H�H�H�H�H��*:0W7��	�	�	�	�	Ԇ�UZBV����x����R5{}R�*{�Y�2Y�H�H�H�H�H��"p�80��0[�Ie{.n�sc�g�
	�	�	�	�	\�����A��_��L�(a&     (G���1#>!YY�R�����H���9���YiH���G�,������u2�hb�rju.|<�+ƌɋ֔�!�M���c�,-kR�!�a皤��8�[c��kG��k����1'FJ�v�iH��j5-�ҟ4$�(���TW�"���R�5^YH����5�Ҝ̲�u�t���:<�	�	�	�	�	�u`b>ƨ�`ڐ�i��a�!ot� o�G$>��6�H�6
�w��#zf��Ҳukq@�4y���ۖb�a/���bl����kb�$-�ۑ�4��'!y�)t2	�EZ�����-��X�)�=E���b�4�K��I���M}�¿E+�]k_�4n�i65F�6�P�
�
d
�e��!�+���1o�nG��G�6�i��/f�0o�$�[����
&     �j�q`�x���=�:vRR�06����K�0��g<��))x�ɷ�e†�ȧl�):����H��|�!Rw�ëm(�ɭn���A��t���B�“"��c�pxr�O�KIK0}�r��Epw+���K,���a��$<9cu�big/�r�Ѳ�ɴ�yA"��Ν�	��\pP��񾞒+Β�D�_v!i�K���LM!?I�H�H�H�H��H@g4�	����Ę|�$��v9���x+�����
�o�Q9�k��q3"�6UH�B�(����`���t��$Z���\�%_�D[��DV���2wS�*5W��w���T���^=��t���2���.��9tV.2�Gi�4ʆ)��b���mJFt�,y�'	�	�	�	�	�@U	���;���I��w��Q�ח�U"׾0�J,d+E�Ug��L��w�R�K{�m1�f:��g5'�����uģ�ai\��)�c��'R˿Ԛ��Φc���ڵ�)s/N(�Ś�x;N�d�(eEX0��{�J�ύC�\�&c�DT�x��n��Y��0�cPx     ��	�,!�Ď�E����1��X�33	sd�{��$j�a�f6#v�hu�T���+�VY���8 �O�A/"&2�6
N��V��*�^�1g��RG�@^暍8-5�|c�[#���n��ZȠ��>X0���L#}F23Wh�F.H@�բ:*a���ё�����(��=vU�2P�y�fOI�H�H�H�H�*!�<T�6�ɗqǪ���!���y��O�����GE 15B-�K[��)��}X֒�K��J*)v�I^�R&l��q�0#\݃sO�R���-n.$�"��^%j�ر,�4����e���Rb����#PtZ	Ř�B��dc�{�u��n2���3�)ecg�E„���8\t(Ɏ
[��	����1JY?&IYB�8S;�'	�	�	�	�	�@��ү_�_sssuk��67,ı�LmŘ��D.l�v��L�e{X3嬧-��
��^�~%2+a��Ъ��2�uk���z���)=�P����ٷ4�[�T%}d*��l6yZ�[��
n�P��P�n����$@$@$@$@$p3�ԁ�"0���8ڵϤ��=�q���np)_T���
*����6�^y�0��e�jj���4��I�H�H�H�H�%pu�JX���R�&�+�J0�
�qf������f?��=ޜ<�V΋��.dV�K�J$@$@$@$@75����Ԍ�y     �+D@�)dWH:Ő	�	�	�	�	��$@�
¤(     ��%���U[=鶘x����7%{}RҮ܎�쓹���_R���ճ��I�H�H�H�H��u�t�?�lmԧ���:0���l��?���H�H�H��?{��u�۠���8JG�QF1�h��\h�܄F��i-����!����˩�DR*��N�ũ�@<'�F,ښ*��L�ꐨ�� R#&hF!����p�.��~���^�e�>��^��~7	�	�H�c�	�YKI�/^��c�JC��J:/�+��	�	�	�	�@��F���B�/+C��W��õ���Dl-u�Y`NW�#ֵ�/ݽ%j��ؘ�Yy}6[J�{{����(\g���ϻ�>2ZiWjA��`��7�^dE��
�t�v�{�v�.ݍ�(�ZW�����g��?
{�)2E�텛aq��nNl-�G��V��2�.Ln-�0�H�H�H�H�H�.7�LT��@ծ|�]��]U�0u��0�p���	-���v-�j����e���dԢ �F����3����X���`�N�73�"�r���p6��]����b��#G����r�+�Z2�C1�ւ��L��a�ftc}պ�m�+�sq�A��{��LE]�8��LC��Z��,F������K���LJB�m�� [�0�	�	�	�	�	\n����\-Z��0.UU��Ь��&3&�ն���.��B`v�-�B�#i<����Hd0N��J�B�e�oU%�88���m)Xe��X����G��
YҮ�}�C��ex,X��lĆ��U�LEY������L�Y��f�w�8dT�]da�<"S��Ā��(u�~~��0{P�)�g     ��C�Mf*��@�ʺ�K/>�C%φSG�Ep�=�gx
���
:h�6���I���vT�b���9q搼�X�6�4g�#�ĝ�\LLSe6|^g�<�^c����M4j�`M���:ez���X�	�	�	�	�	�7��8#�����\t�,y��ι��:;�����†OBqhz���C�8���Έ��5hp[K�9��t�-�1N+wM�IS;��ѯ3*3�W��Mr�ұ�Ό͜�e1I(:X�N/s.��X�w$@$@$@$@$@���ƊCG�����p�Į3#]F���w�N܄E+�a�jaJ_����K�Mq`���ɠExⳘ#���w��ɬ؇cRiZ�3�
G�QYv_�:Z�a?]�X�|T��bݾ�r���1�#�?�M��Z��c����n0���l���������ѓ��*���h]�e	�	�	�	�	��J���V,�K�ooMFpL��ٳ-�Ψ3����ѡ�)	Uj-WX�#6ii�Y���&Ǖ�(y�#>�D�j+/�/2���bE�]�ML0V���s�-���f9f�w��b�4+��l�ʙ��ń"#7��J(�u���Ͽ��sz��`+ssE�C�Y��1լ-��HUeJ{��`qt��FU�{�+kc�H�H�H�H�H����7�͛�����=)���a�q�b���oK�0&Ǭ�T��>�V��J����Җ�᪺j*^΋�?r�����`�=��Co�w�q�hݦ�,����
˂�ᡚ��
��
���,��\�vxI$@$@$@$@$�n#0NauV�Ls��*`���ѻ!��O/��|�ղ��e�I�E"�y�r�cB�~D��PYՀ���Y���r�΋�F]�U�<(�"     �~!�Χ���Y�X����2�6�>2���ꋧF��}�m��j�+/��9��w������H���     �r��Bv�TaO$@$@$@$@$@$����yn�R     ��\
��H�H�H�H�H�O���>�ֿ��Q	�<�.;�(���TA�*A�$@$@$@$@$@�"pME`"�7bӺ�^�����
Ţ%������+1WR�^)��$@$@$@$@$p����qSf p��+���;��@�.Z���E��z�B-V%    �란F���B�/+C��W��õ*mx"��:��,0'�������ގ��~lL��`ʑ~�cy��hX����g	�f6����z����Ga�����8l�v���Z���v�7��7no�[�ۘ�6髞Jc}�jl�8��awa2��H�H�H�H�H�'�:0QY�#:8U��vm&vU
�ԩ�T�p�*�RNh9���k��P�D�`��(�Ə�����5J6���;��0c�L����+��(�m��&K���_Ć
�(�Q��csn<�*����̢��Ǧ��|�b���t����������vnC�mi�??�ӂ҂$%$!��� 	�b__���<�D��EfR27l�g���H�H�H�H�H��80<8W���|,�KEa�q��x�z�"L���,Eva!V-}A\ h��vE"(�'� ���[���h�&΀3�"�]R����l�}ނ�/�ʵfXe]�!�1�K��Ç�h��v\�o�=s%�C�z[
V���E���G���1Ê��0|���@���)3�軞>�1⟝�����֎�H�H�H�H�H�n�B6cd�]e�ץ���Pɳ��g���`��� y^���}8)�CGŇN %Ti�}�PE7�,��^����U�eF�����UU;�j1Bl�-�
�h#P�m
����N1{�f�om�k=�Uyu��F�&�
�I�{�iJ��hL$@$@$@$@$@=$�Ɓ�gd���i"fg'Q�r�����*��骳c;+Cq�]�Ɇ�^q[�m��B��&)��n����X����4ڏ�����geȘa�:�pF���;��d;�F��t�5ϰl�8/�(�	B�EɎEiY�X��VOE�ΌeHD����X0g1L�T�2��a"    �p3�̊CG�����p�Į3#�d���]5�¢��0j�0�/W�xY�Rԣ=Vj�C�Ĉ���E��-{P/��nЫ@b�F�]�K��h�8
Z�'>�9U9�f�pL*M{Q��7�a;}V�5�%�^�!Hߺ\�:�^���,$�]��q�D�$���g���-	�	�	�	�	�x�D`�ԥ?Ƿ�&#8&E��`,����Ό_n��_G�"�$T-��l@\aL�H�������&Ǖ�$e�6���5���H�� �Pd#.m"�V�GJn�CLv�HHs���G|n���V^�_�:��dE�]�ML0V��k~�(�E�5�d@/b��)��M!뭞�ih~�0�����L!˵گy$    ��ơ7�_55��\���v�,V��1g-�F�$���Ns��uZ�z��Oǐ������;�v�ӊ ��O�bU�u���^���7��ex|�0}����R�F#|{�W���멕HV��01�����A,oH�H�H�H�H�ЭsY�?7R�f��T�������z��賲?d�N�&    �L��I�C�Ռ%�*��n���#���G8ºo��ř}��J#    �j�L檙ǎI�H�H�H�H��'n�Bv=�H[H�H�H�H�H��t`��'I;H�H�H�H�H� �������}w$��JH@���ruRO����ae�	�	�	�	�@��_��0�GF��g�
X����3�W#�T���j��6Q&	�	�	�	�	���u`j�d;J���-�m�ly��T?�ٍ؞�ٍ�>_m��4�	�	�	�	���!��3��
�4?@ݷ���6�ZM�O�	mx"^]�	Ei���Z�Z`0�#+>�䮾�^���YR�?~��Z(b+wdb�
���6
����7���w`i�
TLؔ�$�J���xj;-Vo�ǢY:�36,J��U����"!+˂��X����H.�
;�����X��O!�l�&l�dB�Oa׌��y�:�l�G��+�`�d}y�%��[r��H$@$@$@$@���q��ˠ_��5J|X��^�1g���WS�yi9���k��P�D�`]�iM���SkAZR&j4�#���FiP����Z����lr,���q�aL�ш�w��a� �Q86��#Ы9I	�,:�i�)A���qcZPZ����$���$!�zFe��hq^�v�c��L���S����"��5>9b��P�+�ڱ��݁qm��<-�K�^d&%!S��z�z&�R    x\F`ĕ��	�f>�G"�q��Pr�z�|�4��m)K��]$�0�l
�F�0M��4bCl�$D��@���bP�(���H�*�4@`����\g(A5�[$*g��dK�!v#�����ax1�v\ܮ@L�g.�����0�D%�h���g��L�i�FO��EKy��[Xh�S�q��	j$E�����y�!rm{	F*�%�u��#(�(Vq�e�H$@$@$@$@7����u�pRn����4C1�{���p�����.�t~���Z4��(;�I�q�#��Iq`N}�hF�]��8�R^S��y�ᬛ��=��0#�ա��D�"PXZ����x䁇��V�M3��ٓ�S1F�����K�R{�ډ��^�����v+^�dA�v�企2�B�ݜm�NxM$@$@$@$@7e,�!�pAF�ˢm����>��)Q`�:ෝ���X�
Uǔ|I�t�z���2�1�94?�3�M4�c#o��,g��_#�?z?����ɐ�	�F�!٢�Ģ�,F���gD�[�N�6;ۋ�x�Y��8��hR$%5�����yt���}gF��h�11+�`�b��H�e6L$@$@$@$@$p�p�qC��]�������0j�0�/W�qY�Rk�A�@惈�D���{�� ލ`�_'�s-B�0G� G��q_YJ�[��^\�'�g!ܠW��Y��d���Y����,Y�
A���Δg=�8t��YQȊ
�^/{Ĭ3#]dzNժ��c����Z����^��v����������ѓY���G��y$    �돀�LS��?Z���Jjnr\I���9�ut(rJB��Z��*!�T��t��x�$R-SZ��Y�.���-�x�#>�D-��׶~���N��^u�W��وK������(h����+�eY�1����c��լ�b��g�ҟ��[��"v��L�7���-o�c�|�v�y��͵����`D���Q�7���8�5O$@$@$@$@7�ơ7�_555��[�F�$�����zY(�{;-Α�!��1�M/�����7�;�,u~�����2��F�Y;��˗�|]�+���Q�Vt	v�Ď�R;�k�lci��}��kw�k%
�;L̳��y���H�H�H�H��3}w`z����n����� �5����K$@$@$@$@$p#p9�����d�_e}�sV[��jVh�+     ���#�+�s�ܪ�     �L��_!�,��$@$@$@$@$@$���[J&    ���ف�=T���ZS	�	�	�	�	��
I���X��"�7$\M$@$@$@$@$py	�SS�nP�̭�/�S�4    �A	�t`"�bY��t�v��*��11DŤ
O�V5Oɷ��ފ�`J�nG�ݯ���nSw��`¦�RUE��t�]�6
�-��^�G��͉Pg�)e����z��lAV��[�X�H�H�H�H�H�Z#�ҁ7~�l:Y���]��>,��j/̘3S�ǫ)���r9k�bۡ̉L�:ŷњ�
�ZҒ2Q����܍���97�^�IJ@f�Q��cS�LK��q>��awf
��B7g1"E��k|0r�0{�>#0V�c����b     �k��K⾠�^3T���x�5�������i&��R�"����� ��0
��B1JZ��� �،�);T�uk�����>i_}�0���ڎ��M�g�l�i\Y���yHN,�,
�F�Z��u���&    �80����u�pR.����4C1�{���p�Ӻ8���I�k�w����'NÑ���?g���(���1���U��"e'Ά����Fz+���+Q���\�O���&    :��;)m��+.��8��I���
��t�шKsV�o��
Uǔ|I�t���&��O�و��ޏl���*Q��t1-�1N+�M�u��84��H�H�H�H�H��7Լ�2��V�è�”�\��e�K�%ʔ3D$�Bz����d��f�ԋ��,��0Ñ��뜋���)��pF������z�~>��Δ[�,     �J\F`��eNXK3�:�jnr\I���9�ut(rJB���
�+T�#�H+��5"�FId�IZ� �Y.<�W������Z9)���v-�uP�lR��mQe�X�ڟ[�,Ǭ�=[���e1<�	�	�	�	�	(ߘ7o޿jjjz��D5��I�1+,�vi�F|�c��ꐫGH�tq�K��ŰvᢦFc��*�`��s�\�隥50�<,��t��     ��A��Lo�3$bn���d�1�H��F"�	�	�	�	�	܀\N!���f,Y�WY��[�>>@M/"*�]7
$    0��#�+��#6`�QQ     ��C��_!�:j�W     ��-     0��GEEI�H�H�H�H���     0��GEEI�H�H�H�H���     0��GEEI�H�H�H�H���     0��GEEI�H�H�H�H���     0��GEEI�H�H�H�H���     0��GEEI�H�H�H�H���     0��GEEI�H�H�H�H���     0��GEEI�H�H�H�H���     0�<i:f��Gx�+���1|��v��t׷p��8y�]v?]�eƍ�/+�ř���X�oa�?x��M8�����rg5Wg��\����|����q�O3���ߐW�?�M
�����EU|3��PV�?}u'��t�{�ޮ���0�	�	�	D�I�s1��Q��Z�1�ix�? qX\�����ׁ[�+7>�H�����2;�xhw�?
?MðVM[P���⚗;��|w�
�|�	Ü�-���=��ϟ�.�]<0cpv/2}3^tܟߋ�O��D�}�l��S_�c��Ѓq�̩Ƶ��'/݁��Ռ��g/�Vv�x윉�i��|�"���0�j_���R܄��/�}�g��B���z�x��)���Kҥ��3ߟa��1���{jR��]��.�Y�
cK   �k���)d_}��^�ᛯ�-����H���x�͒�{�?��>�x�}��҂��6465⫦sh8�h�依���y9󏽨�G�D���~?�л�ֱ�����+/
F�"�l[�ȩ�q�=�,Ό��Og���k8p�I�������kfݷ��jL�=
��7ct'�~��Cؓq7�-��<v;�~�9Q#�ժG�>��`Ş~��(�m�:���>��F��+G$F��Yrg_�Zw�uI���{���cш�[���"X�H�����	�	�	��@%���d@ӹ/Ѥ��%��x㔋�<�؋x��|L�´�d)2��U<�d����q|����;����o�hÎ�.��E�_�NS[��U�
��}K�Vth����?�� :	O��M�
İ/�5G�Vӏpsk�ƙ�$�6��1�g��9g�_߇�4	���?d���S��G�`ޫA�^�Px{)���8}�~�>�����F̂ѸI��O�1R獳�G�t�~2i?��/Σq�0�F݄�����E�;����q:F�4�<a���P]��������(J���!G_}%�����'���'��D�D��r7�+Lg��¤�����dh^q��Z|��-�
�&L�X�O�=��#$=[��uW�H�E��#��ZK�5za���_`��kQ#�OM�UJ��O�����־d�;]���jJ<�"��wbY�X��؟��Hz�#�_I��=SE:×c�D[NnƳ��"~��>�9�ȿ�[WaO�0��w�o�2�01&령I�/A�����)�8 wS�o�ϣs���I4x��D
?ہ��L�'����gx+g9�?|���YC�Sa��_ue�-���.�i����m�*�   �I�cƕE�c�ъ�奘��7��k
>\�P��n5�]�����bn{ ���;��!�m��ۜe��^��ֈ��ۡ����P4��;�]� �Y��	���0�^֨�{�ε��ˏʚp��M�O�����oa�2���^�
�2P?mÑ}�Q[���?~#u��p8/���M����0r�=R4�{�z?Z7:q�5�u�0ƓLqZF�܄��4��Z���	:��)�%}m�i� ��Z�?��_�ῶ.���ߍ�c���o:��I]a8L���QC0�)n�i�'��KS}�D�a���H����C�������+ܤ�y_�ȟ��$�T�r��<�[���O�<��̓.Z?�����>�������?\�O����1��H��8S�lo�xݤ��P���~�,�8"N�/'�+X_�鬲)��|�?�D�;|�H���e�?&�?�/Z�3�O�ԡ�S�qN�1M�2S���[
�.�f��&l��K�N�:��H�H�H�&�n��}�4Db��Ѩ�������Ag�Z\��#}��X���=�����:
_~!g��s[��}<��}}��(�����w ��3�L����C�˭
5�6`ҭ:|u��5���\�����aַ5Pgֵ���ͧ��Gk`���~�q�	�~r�N��I֝�����T˹6��L�!��F��_I$�����Z� ��JD.�~�C�~�B�S������$?��}�2�[�JK�WCK=����WC�^2��y�"������ԅ�o,܉�Uۤi��ļ�	��Èi#[P��)L���D��R坧�2<��E봮���A��Il���0�F<1
����8�e�s�H�?��W'��/��&�0�o�qd�"��ޭ�5�׍}"�_��VOz"S<Kwi�0LJ d��)�<���p�]}G~_߳6�K`�K�3;�n���݁]�Q�`t�nǣR1x��K��ʱ��z�d��)�B/4J����|[��zh8�����o�1E��6;:�w��a��A�3�xn�|��P�wS��|1nHo�N���jU�$@$@$@7&��;0��كF�E�?^��e@�Ӂ9���߈3�탦PY�]�������*�w�o(��N�mw���d�Wc�fd>�zz��G؂s�N㫖s8���sV.漨80��0v�X���}4�tݼ]�Ā�p��v�4zp`PW��Og D"(���u}b�[0�'wbœ�]$*�юH�ɿ�V��})�D.:���΋�]�ͣ�ِ֦�l�ޚ��j
D
/y꣼I�;+r���o����x�G�a���Қ��Nڱ�<�
Ǐ��U+�$R4Sθ/�:0��ͪ��x�k���־\_x�io��>��z*� ��}ʪ���[<yn��!R����v���4���C�?��D�~{����͗yx�d<��!��:F�U�?�[���i�]tQ�v����U�E��mѐ��U��?���[�b�Lq�$
��E���p�Zo��C���L$@$@$@$�:V�1��3uk���ƭ�(��х�yQ�ΝS~+�� �<3��wM�_�Q�n
��v��G�gC?F~�(��ٯ�=O���.>�<�}���"j�����y�t7��*Žp��pS��P�J���ω3w�d�������T�#*�f�YS�D(��J�P���|qF�
�;����>M�K?�ڙ�ܹd���j�L%R�8�J$��I��]3����:�s��VZ�N����iZ����G"XJ��g���{��d�����#�qr�K�x��[�y}��鼸�E� �n�߰a��{X���D�F��Q��!rs)�����/F~�VE`��&���HbeR���!��w�'�5V`�ڵ�w�����m՛�ړv���	����@̖��56�d�Y �)}~�!�UŲ>�)�q�H�H�H�H�9��1�3�[�Y�Q����?e`ڂ�E/c�,��}b
>�8��4~Щe���*���Gʜx���m�R�p`<���p��SΚ����,
�4τ���u{!k.�a�m��.�n2�<q?ᦰ���k�E�hY�a�vt�}>��*�J8^�F�'�3p��yQ�m�������wn���m7]�����*�R]$��?܏_���������?l�'�~�-<�j��\�Z�ӆ��S�B�8��6Z�xr��o+�}��0�ϵ��\�,v������Ō�-��U�oxڛ��o?��ڕ.�T���e�kC�꟦�̾Z|�a�E_e����S�����%�1M^�ҝ�m��ر��b��\I�{[Ԓ�S�~O������R�+�ō��;P���o����w���?�LN�*o�S��M$@$@$p�p��v{�u/��?#?k�@�0�O'�\Y���7(�#��.�o�>�t8/��ޱ�����`��4�[��E���°a>$�D���`����իꫥn���;�v���]�N�Nb�#r#����WF��M���o�_�=����J�%��Sŵ2PW��W�j�,�.��ڞZZ���e:9�N�m�6�r��)�ߌ�d���Dm#���DZd-̓7����Ƴioci�;x6e�i��&�5Kl�,<#��71!P�E������~���L����
m����v��/���7����Oꙧ�ڕ}2�ﳞ�P׺(��8x���g���o����2��-�9̲g����=3�g�J8� 2�ۦx�
�r3��ނ���@IDAT�J9"4[vnE����	IJ����j���l�U��$�C��k�Nc��|T�&����S��eNE�|I����%	�	�	���#�y����
��M���8��mm�Y���ɸXu�k^���4��E_�{�u�sG�}_۹vi��g!�Gs_�j��B3J]�p�v�Y��9S��!�QV�`�%>�������8pO��� �V>%+��.���]+w��X�]�T��3���ט|�c�V�'?�n����L��L�����?8�W)"��d3gJȫ���i��̝:���vO�x*��Hܢ�;�|/�{6�!Y(1��$"
,4r]4�V#�5��;��~pp]Ӟ{��y�������   �E��39(3|5�[�7q��G�[��zz#$�x�[1�k��F|�c'>��^=I����ޏ�:�������VvȼB7C��\<f�M.e�ʗg/���~��o#-Z�J�Hu������N��<w!p�߳�z���z�tѧ�W�?E�K`�[�X�H�H�H��$�с�6U�����f���Ud�^�9��|���k��Ȼ��X�̘��K��O�M8�--�
	�	�	�	���@���i	�	�	�	�	� z����A3I�H�H�H�H��mt`���C�H�H�H�H�H���i�����c�v���ƈ(|V�O=�W�Z�ya����;aoY�3�_�ƨ<� w�]�Q����az2�
��>�&�n�⠛ž�|����a�?�ǧ���I��
={`�5Q��x^&P	   �����D-�w]l�ݝ�G� fYHw�.�|���X�$������;
��\����hDFF��y7V|xy<bV��N}H���\d>ѧֽ�p���+��#�7bӺ��4�s�K�����?d�P�Y$@$@$@$pU����1*�>�:e��2��ʑ�,y=�"���k�1��6��4w�g�R�	��./�Hu�'�9+
u�+��6D��:�8�|��r���ց���=f��2��x�s�/��e�Æ���Buf�	�	�	��U!�&cĊ�0�۰���6d��#=�v�!֌�e��-y"���Q��Dl--���?̉����"��<{����Q��ߏ���;~���i�z�ֶJ�#Z�s{�5���Q��D�x�JU{̱��>*����O��-~z� m6[J��p3,}��[�
�t�v��~���q�S�6��:��Ga���T�k���l���5�U�)k��cA�ɮ����S�K��G8h腅0ܞՃ��=�4�r�g�<P�z�2�*ϫ�	Nnd��g��X���Y�݅ɭ������]O����ϝ���t�<�	�	�	��&�ځ��f1�䁿�s
8�ŌU��E_j�}�3�c��>���M8^M�Ą�C�Y���`Nd
֩~���q�NjQ���]��>,��j/̘3�M������ƴ�� I	I��f-HB��_[�.Wuoc��_D�E��^ڿ�
�oX�7ޭQ�V�������Q�M��N~c1�G]�8��LC��Z��,F�2��(+>>��%e�Fc��Q�6���xzU ')�EG�M	��e�\�hx�9������xh�|���.��ҕԳ"�9�T� t�b��W�_S����k���K��{�Y��X}�Jk[��R�"�kÆ|���ȽLxzF�<��y?�"3)	��3k�얧X���_�m�g���3�H�H�H����ņ�<�U�4�Dg@YUR�ۍ@aR�0Ug-F�L��
}A���3�M�0An��,Ev�\��� ha�綬J��4��k�x$2'�z
%w|��΀������Ҋ��0��"�1ϟ��	�2S����@��B���Xb���e#����
�/0}g	�c�q��NTe�j�2��F���p��{B1J&�m��;�yDYJ(<���d�P}�0��n;.�Z ��3�=r�-�XgV{��pv
||����Zq�-S���z�
K”��H$D�����]w���Y�;�l���b�G�[���g��H#�����GP�Qs;��xzz��;�;��ՙ�hCF�{=;����Ů	�$@$@$@$0�	�v`Į� X�����1m�D��,�,M��y�w�:>�C%džSG�pB�����2(��~�>��ˡ�)>t)�JG�0ˑ'����A�Jm�ʚ{�v.���˳��W����Ik
̆�����CGHd�I��h�;IN�w�!*mI7�,��~�RW�ʪs�����e�Z��_'�A�ݥ+�g1���r#�X�	�{���j��ݳL�#re�k�#ԩ�.���fzu��F�&�
���{�iJ�㉪�t���.z�Ϯu�m�v��'��X1�H�H�H���b�μTL{p��H��mo h�]Jn��}�9W� �1Fq.�*�Ce�Q.Ȍ!�mѪ�E�#�Ή�"��-
aX�X��F�!Y
�Ģ�,FZv�j�q��.�{+F�Pu���$��3���5b���#��H�Y�<{��+eFS"�ꃏ��	�NO���g�.EO�	i⼠���hdEmA\w_|��nd6�)^Õ�]�$S����v)ٙ� ���ለY�2�dHu���=��pN�tݟ"��6�@O�2��	�	�	�	h���c�ݲ�bM�>f8f>��=�QW�gc���_���he:�Z-L��թSֿ�SY�:�؇c��L{Q��7�a;}V�j�7K�hC��uy���#��+i
F�F�Q<)���`�)j��뮛�ZrP�E$ɢ~���R�W�[��A�h��,����91k#�uZ��F4�.����]�<�KWVO��͉��H��-^�2L��tc{d6�C�!1"!!F��w)<�X����e+GO�#`�Ź�y��n�m�
������%	�	�	�	h�#0g���q�x�@{�ԕ�s��뱱ʯ�R���0��ENI�ZTkـ8u���2�#[ii��(���q%ymɊ����`�L	FKy>�(�eY�1���Ȑ�����U+꽻�M��eo�Vǀ�_ʁ�Ǚ㏕��"�b��G�ZW�4�'�YS�V4kD⍒Hgc\Pt��F\�Dd�����`GYvtVk�$יo?75+�'
.8G�j���3"=
�Q��%)F���\��;��A|v:���p�;��Df�o���K1�\��H��/�;��gg�힑L1�g4��1I��\�r��Kݿ�zO�)r����IOO2�e<�	�	�	��@'�y����}d%�p+|�ðZ���ss����1
�#�ڱ�V�ap�
KE�)O��:J��^���{�,Vu�Z��GE�Dn���꨸SZ<K�������M�Vo@��0y�0B�G���]e���w��zz��e$@$@$@$0t��f��ބWc��ʚ�͹&���������Eت�εxO$@$@$@$@$@}"�z
Y;Q�q�vw�\�=����w�Ԍώ� Y�^r7mXL$@$@$@$@$@=$�m��rX�H�H�H�H�H����믐�{��H�H�H�H�H�zO�L	�	�	�	�	��U"����s ��˗���3F% d�`�g\��ӌB���*Y!��M�g�1d�e�Mb��hav���SW�\�L$@$@$@$@7$���0��%sb��~o('�{Ĕ_�sM80/�G�%���/>���0�GF�`gj�[���	�	�	�	�	�@�p�.��8/^؛��=�y�	�y��60DŽ�����$�6P�_e=I7g��nte�EhM��Y�b�';YF$@$@$@$@72��8'hP�+
�T�>.KqGN~�j�c��Lؔ�$��iA����,�Z�ޘ�E�t�v6,J����h��yK,��ps�:Ѭ�z�����}�Geaӊ{�h���Ƃ�-�����1��I�}��;�ǚR�r�)Y�P�K�u�jyk/nlP�Zy'�Y�+
E+��i�|�����Z��H�H�H�H�H��\į_p�:�/��=���\��F���@NR2��" 4��R��ƴ�� I	I��f-HBr�C��X���A�ш�w��a��ѱp�e�{���\nݴ[�ĈԤ��@0�3�P���9�a�R�Iu^|j-HK�D��>M�Ym�ކ���PR��5/ \�u�+ᯩ����y�C�H�H�H�H����K��{��jC�{�b]3�>ɮ>|ށFhm�Q+���+G+���P�7f��g$�Sf*΍$�CTo��¸ddg�BD�
i�M�(Fvv��R4㼳�C^e�j�2�!9�H�� �.�)��F��� �،�);�V���ن:�
KBy����`��E	Qx��aചg    ��	��Bfk� F�`��zY��ƉQ�d�I��`�m�–�:TV���G
����L��^Ysb���P��/��F��lW��>wx#�5���O�5)�
|'�I1��'�܄�E[ri�Z\��?>���4�o��mmxE$@$@$@$@$п\:0o���9�{7��Ɓ��S���T���J������YhH�$�K#
b���~�+�e1q(�'�N���t�B���
U�'�ĝq$6�5�&����h���q�9e�L$@$@$@$@$pY��B��l�l�6xr"`0� 1k�b�$�T��ZdzX�3�
G�Q�=�W�Y7�a0�K��Xg2�v��4�o�,zц }��6��)�g���ވ1ʬ7��]��1�.�����HJ�^k����Z?H���`&ks�C9��@�0
^�2L���
�H�H�H�H�H�zA�eFi�z�c��� 8z
��v����%[��~~��)�h)�GqD*��&"k�|��;*�`����+�eY�1���|�L�I�M�U+M��N�*����_ʁ�>M��cen��>��%{:�k�o�9���"�h�,��%��]\Pt�͝
�i0��u/I1Pf��\��;��A|v:��h��     ��!�y����ƭt�D8|��ǩr+*:Ms�H��e4�4��`�v���������w/��J��1���N��O����4�d     O�u`<5f	�	�	�	�	�	\I��\I
�	�	�	�	�	�	���b5     ��O���ԀH�H�H�H�H������	�	�	�	�	\}�80z����ϊ��k*�M���}dD2 61!�#f@<-*I$@$@$@$00��&|�F�]2�u�G4V"m�B�9>���������.����|xy<"�+q0o',���΂�X��Y����ȗ=lR]}m�}��׆��<2��;S�O�]�H�H�H�H��w��j�y�,BZ�_dȹ�\zF�	�3n�:pY�t'Ӝ���ѕ��(����g�}�,<�/,x}���~��j�ԍ4�/�.f.	�	�	�	�	�@�	�t`so��K#�X�Ŋ�b��8/C�n0�`C|�\+M���t4�zlX6V-Vo�ǢY:G�Ɔ�E�x|u���(l����2�d�ND4V�?
�o���QYش�4�lh����B��1UyOc�ɓ��vo>bM�j������P�����Z`��{!+�:n�iW�y�C��hc%��e[`6;B/�鯮^��)6e<�@��iA����l�m�xg�2�(���h�
� ��ɼ9��T�nx.
[a���9/H�H�H�H�H� �r
����2�� �O��.1�!�Vkk�c}�z�ֶ��P�W~�"6l�G���ø1-(-�ARB�w}�Y���\��7�||(�j�-@Άm�j<�*�ێW���p�(��_�6�<
t�;3
{k�����Z2�ւ��L��a�Fڏmm��<���yk+�?�Y�q�'})�Y=�csn<�*����̢��Ǧ#*�CI�B׼�ph�.{%�5Ux�9q^$�];U���#�D$@$@$@$@�#%��5Y��R���������`�cPl-F�$bC�@Р��V��Ɋ��0�D%��@\<FJ&`�L#�Sց���-�Xgo�m��=�2�M��
���Ʊ�8���!��h5V�wE#�HI�2�pO����%��(K��lٷ���HO����P�����_�Շ�;Ј��E ��3Ȱ`UX��� ��Dj5�(a!
%��];O<�f [�	�	�	�	���M��#:&�ȟ�h2� b�S�6b�S!(NGA��z�t�F�p��,)[���h�r�Q��e�:5�ߺ�ٮ�#&�.�>���s�+�5:B�&M���y\GN�>��`��Sb-�N��8L8��rіt3����-uu��:�(,F��@nd�7a�qkC�����*�$@$@$@$@$p�p�8��Dj��%�m�K��k�?��q:�a�bq^Q�d��[�(-��(D�iX��Ӳ�{Gr%�Y��I�ZY�}HrDM0�W܋ޤ&�F'��5�Ӯ������l�:�6I�֟Zֈ��ޏl���N�x�&���F�����-�S�Fݵs
q��Y�3	�	�	�	�	\/\���!��oDBT8�#L��#���O���,�{]#Bb��݉��Y9j�7K�hC��uy� ����+2��Z��7b�P����
�����>Y��A����1�#�?{:}L��(���F�n��0�LQ0h���XK����D���{��!)�b��Y7�a0�#1k#֙��:Yʑt
*[��e��<��<��R    �	���ԜƠ���R�V�*w��[d�6���5�����OJ^,�_�1&x��m�14�F1�Ӹ\E5�2�<�R���h"�+ssE�!�,��I�=j��W��U93�Pd䆢�^	����V\_�!r�JYpo/�#��(��˃��Y�v�YS�V4kD⍒�V��E�����Z9)�����:D���8Jֽ$Ũ���Sp�5��N���n�مt֧�[^�	�	�	�	��uI����WMM�K�z|��rX+\�}r�z�ʘ�S�X�� �H��Bٚ��� ��s�餕H����|��U'Z��T�^��k�����I�H�H�H�H�j��\
�.g�	���o���
��/{���"�j\Cn��4��H�H�H�H�H�'p��ɓ���/��.
=}�#����{�����\�O�F�	�	�	�	�(��̍�i'	�	�	�	�	�(\��F��v�	�	�	�	�	(t`�㢲$@$@$@$@$pc�f
�^��57n��/.\R�p݌�e�^��.'W�Y�l���#*�	4|�ç.�e�J��qw�е����'{࿟}{[؊H�H�H�������Wo��%�Z7cDc%��/D^������������L����xD�W�`�NX����3.�Y_-뎧+�WCOWz��ё��
�=x�\
�9��P,2NP���{Ph�|��ٕsH�H�H�H`�p�W�΋�`�r�"{G�E��{0�O�Xpܔt�%
OeJsV�FW8����%�dvdz����g=��E([������E]�v�i�	�YKI�/��֧��~��Z6"   �k��K�0�6���o�X�b�a�XP��Ѧ���MO"P�����x+�0�r�!>H���PZ�M�l9%w�/S6��Geaӊ{�h���Ƃ�-�Ok��y��r�$���G$���G�)U-7�ґ�Q�__[��}/DcE���^��b���?��ҹ	[7�P��S�{�vl�}7i��N+��}�ľUf�}��,b]!���T�ka��մ�`���T+Vo�ǢY�O�*ކ�E�x|u��3�X4���� #tR��zV�i(~ㆵ��:=�v����>�4L�wG���,�3@c-
�F"���S�^�%fB�gk�⨗���3��v�l���sϳ��]���X�V,��ŕT_^�h���v�+�H$@$@$@$��E���R��?mƺ�X���5��c<�*����̢��Ǧ#j�c}�z��ʰ�����Elؐ��x,S�W�������Q�M�����b����q؝�������Y�E%�	��RkAZR&j��0J#�Ƕ�vJ�x��5>9b�=�g�ʽv�������̵ȷ�F��x�D�;��t�ٸ��e0-���]��>,��j/̘3S��aܘ�� )!	�����IHqt���@�
� g�6Ⱦ�h�jn=�)�>۾ꩌۣ�^G�8/U��vm&vU
�ԩ�^��3at�g�A�N7=yF�Nm�[OϽ�w�O�'�x�iq^Z�"3)	���>�0�Qs��H�H�H�H�z@��K2R
,���c~dR2rQ�5�Z���Ep����4Bk;.Cs`�=sQg-F�9e����ˣrmFF���Oe���6;{O)#�f�W3���V��*s��$K���0<,��7bCl��X������Yd*����C�w\WoK��
�����G[����L�H5��k惢-p��Pr�^g�+���P�7f��g����4ڻq�So��¸ddg�BD�
�灵K������l�G=%���j�R�/����Ќ��yx<þ�I�:�z�Nu]����������ԇ�S\3��)q��#0;����H�H�H�H��H�>k�E���&��*C"�?��`#�?�g��$����6�uK]*���o���z��S�R���u*P���)i���P%z�d�j�I��)�Ap�?IX�����Jٹ�jG{-F� �}�;��4�$^�>��ˡ#��C'�:T�H(ܶ҇��N�Wb\8U��e��·�xv��ܻ����S1Fl����_a��ٺR�]^��Ȏ�]��<O�]��l��]��)+�^�d���F��yk�e�c�L���H�H�H�H�zH��x�K�
�N��YPZ�ن��we .��ޏl7�0ů��z���.�w�pL�ꐧ�"��<&�Jl��1N+՚�q��[�Y2���1�����A�{ �^��֯��pA���"�#��~���҈�� $�A�X�����
\TU��)o""ꨁ�b�9Z���B)�	i�Xh��u���R��O�Uw�\6�]YK$�dSKm)�Ԝ
M�R_�TTD��s����;À/�s>f�=/�y��9w8�=��K�����zڝ��]�I�Ѷ���.�y���[��'�7����R��>���6*/���j�h���}ɪ��
��!��������Ѵ�1ְ���`L�	0&�������&s9�#`4��C�3(�i/r>نRr&-MB�A/
���c~��>�^�� !rF�0�N�����zz#:�ѽ�/n3�4�J��s2e]ƿ�#Hyyd�<�G�Aup�30��zt=�G��̤��	�J��mߦ,���̒E���9��B��#ȫ�E�'��E�L�8���؞h�ն�.뙃�yU������
�:?�l���~N;l���8D������DH}I���%W�'�_bvJ��:(�y��Y�f~0���8`L�	0&�~�g`�N���`�̤?����Ƌ뤳i{"i�H�K5��b˞: �o��C��!j�bD�}��	!�;��i��N
���;��ffZ��ڋ�q��;��]1��r�1{R��S᭸0,NCU����A�)���uj�����1xdR�¨1�e[�:q��,)�����yφ��l@�L���U���|DqgV������&^t���_a�P�iMnx���ȬֶM�s����}}"B��џ��i�h+{�l�VΦ���F9HY����y���u���ٗ\�����#��~��XB�Ƴ/2�dL�	0&���n>|�/EEE�Eut�<�k[T��GN��z1
̂h�	�r����F&!w�0zls�%l1V�Uj[AO��Q�㑽:?�L��̶0v%�L�ۧ��Rs�o==e��Ud���z�6EO���y�
Y��m����4�/��=�cm���6���`L�	0&�K@y�,�� %����;5�����3v!&��"P����t�{#>��G�j(�15�L��!��nG{
Lh��"U��L]�z׎*j�b.�h�޶M�S��+4���ڝ�hJ_�2C��VINcL�	0&���'кO�>�w��y��s~�v�zx���"|��Ͼ�4G��/�r��e������-��
��j�f�K7Dc��L�	0&����4��]]U�6&��`L�	0&���6姐i��T&��`L�	0&���5!��5�Ε2&��`L�	0&�
���4&�ϢsEv�(c����hz�u�_O��7���s��R��e���F��L�	0&��`�@@�)d��c�uo��*�‘�c��L\���c��+�AE-�nM�P?�<U{0!d"�|�<Q��سbL6b��
6�j��QD5I7"-����bG���`�j~K�V9�>|�wxhp��Y��&���)�.GZ�`���eq���:���ف�L��B!�Ŧ���:ӓ�aL�	0&�������c�-9/�{�ba�g�Z�a�7|�'�.}"�}�U���EON6�Bڎ�����v^���IQҡ���"⯦
�>GAMOG������T�c��0p�[����nr���r$���`z�f9��˽�֜���o��2�:QFͯ��Ҏ�J����\li���L�	0&��h�����J3/UX=c6��I֭X���H�Lkb�2+�����b%������M@v�.J�B���u�X�mBJ�8����z:O��s=����53�ʛeΗeʙ�?ݩ��y��"5���H��g�>:	ٻv��W��cG��H�!X��f�s��5Yٲ�FH��#gc�I��[3�uj髦�ē�ef���,335��̈QLN����T��.tBo��{����.��ʱqY
&
A�Up�q`P�In�6�+�qsg�j��p�	k2SiY���#7;�#�&]D�;K;���a."�A5���E�ji���!buASϺl|��`L�	0&���o��^��x
�'LE���!U�5i��V��Y�X�6Aaӱ2ވ���t�Rd�m��l����X�,YET�[gx���/� R_t�s]g:��.>^����K�"�t
A#�#%��V�E�>k�����1صIS�J��|�����a_����BWsM�n{��r���*}�腚߯�ƣn8tI���ǡG�,�5K�m�I��7n��9BMO�S0�ꂭKbՎb��HۦRj�׋b���Q"��3S�b��V��z�.W�����̗���b/��G�p4s��dZ���AT��bB�pdK:��]�-G�ѯ_�D�yQ�{�2w.6��Шy�/|7-��X$M�O�	g-A���f�FTք����`L�	0&��@�(:00%b�*�}iyQ�-NC����؆�O ��8�o<��Е�a;��a(�YGwٓ�{�����8��"G�l/9E6�έ�||t�<����q3��
	e͢|P��n����X�d���f;����ɋ�ㄨ��
�lвb�P�1|��GZ^tl���+�[ρ0���^Lt�sg��`�EDF�pbOeT�<E(\;���@b�Z��BН<�j1쮂�#�13T�-�"�X+�%���?\-g#"�LjD)ֿ��&V�P��v;��0j�����HŴ��H�m�cЃ��0o<�32��I}7��h�
M�x��1K���R1~�FIi�WS�S��L�	0&��`�J@ف�*2�`�}�L�G��|x�0b����zc�Dx��%%(<RfU�v�4���~�l�Ј��#G��t��mzC�"��Ӧ!1y-!KD�U�̑�^g<Y�g�,��ҧ��b�T�N�B޾����hC�7���&T�bN�ji�H,��)	W�S�S0�<#�C
��ޖ.9�᧧v�a��q
�e����9�ǸZ�*e���,.���H��̔ۡ:Q�9����lO��8�ߒ���y������S8}^��[䢰�'��H'�����`L�	0&��@���)-�ل�r���!�;��b\����C�y�l_��"��Ye�Ss�8���uT�s��Ҧ�yy�4
,{�{�;�U^.;=Ͱ�Z�i�l���S�J��#��:��E¦�qYL3X�D��hZ�kX��}E�ҍ��0s�dс��(���G17r)9z�G��葸�M�P��N�_��B�6���nJA�4��S�JɊqj���D���-���L��P�#�#��d���)?':2y�RP�)�W�#��Yz������ܶ�<�J�`L�	0&��@c(��^�5�������EJ#��"�m����&! ��	I�1߲9_�.6��� !rF�0�7��������c����	3��:D$�*՗�}��-��D�����0��F��Ɠ�Z�?��YN$��.�ވN��p��m�N�Q_WN��l��`sD��$!�x������l�3~�C=mjq�d�'��k+iFȀً�"fU�z�e��^���?�:�9����GD"6:|�Ki(Gڼ(e�o�R��Xev���L�r�7�
^��i?T�zzg�T,�����z����\D}P��E���9���T''K,�A�,zH1�?�a�[]OY�2O�
9�	0&��`L@���L�)�w����g.Z^�o�(�]���'�f�ļ�Psj-�쩫#��x�8D�Y�(��O���|�y>�CJV
f�(�|���bzZ�_���8zOH��j���R13�#}f�S�2�w�_'FKD f���N{w�x���6$C���2���9�Țj�ʼn�|u
%)1s��;ґ�p�EC�q��Z�f��z<�t���[���Ƽ,����U�`�:ỉ 4���~f�[��b��PT�E�&�v�OEhr���i0'R'�H��z;)ƿ���i?�<��嚖���T��l(�cTlZF�訿��y�,�µ��otVgE����w��*��&��`L�	0�F�i���)���렮mQq"9�N����d��0�H�qe�G����0�lF�xd����)01�-�]I��Y����AhK+N�#��-e�W��]����D<Wc��Y0��7p�^��]\-�u}P��v;X��	�k�L�ڐC��kuEu4cg�Z�M�}ל][Ou����`L�	0&�8�L�D5!�!������q���
h�H.��`L�	0&���������mg�6����w:޻r�U�`L�	0&���~\30�ք	0&��`L�	0�똀�SȮc�Y5&��`L�	0&�n\�ܸmϖ3&��`L�	0�G��+�d��CP��
��C�W�)�v}u������4Wh��:Z�A�XW�9]A��l�l���L�	0&���
E�*n�����]߲�g�6��ʭ�z?<�'Q��4��-u���;b����r�.��gS�pȔ�q?�w�ny�m��q���S�q[z�e^1��#��&���{�W�p�O8��Zc������+d���/�{i�p�\�؞xn\{Ԑ�o�٨����)����zҙuaL�	0&��h�m�V�X{�n��o7�t�	|����y��:�7t�Ά8U#��R��A6���2.Sle���
sh���A��y�%Z���<0aQ�K���ﶕG�ٻǚ�^x�yr^�/���`ϱ_���z�*�8S�c�yi�PZ��T=M����l��~-`͘`L�	0����P)<�G��á2K��wk���X)vg^���h��m��<��(�!���V7\<P����G#Ț����/���.x��)�_���G�n;�Y]
�0�}p��򠳺��'��Nn����1�;?�S���J�:>�'tA'󊦊ç�q�R�Ҵd<�
�:�ީ����4�v.�?����ኜ���$=[!������<���Û�a�ex�f	���x�݌9��w�|�r6IomT�rP���/��t,�{�OJ�S�J������Ϡ�k�x�Y�HZLJ���p��%Ԝ<�7��ڼ;<NUëW�u��#zQ_8��0�h�Ae?��7ٮ1�D�o�B��p��7:�]Zi*�\�K�ނZ��V���Ꟛ}^�8�gL�	0&���5 �����
���!�PIҪ6x���H�0C�0�R��o�:�<T_�Eq���ޭ���w���5�QR-��i�\���wcO����c����?��伜3;tw��7��M�P�iotGw�JlL*�g�/��7�1�)1�v�#O��r��%�gTW��\+MC�o�y�*9�O��ᬧ<�΂� �n�{�㫜jt!='=&ʻ�}{Z�y�����jg
z=����}g�9�8
J~Jʰ%�_�9�����Թ�����1���[
����p��&r^���6v{�F��3ߗb��?���
~���˾(�����ˣQ��-u?}Q�!��EA���8*�@w�O{��YR�R;s���ڜ�ؗH�z�i\Z<5����6��!`L�	0&�����->���ތ�.�G��^鏚�������K���!DŽ�b���5'�A1*��94��Wy�dˇt���^�DI{R�e;lz�����Ġ�<p��	*sR�{�\6`lot��Ӆpl�U4(m�!>��e�>ݬ�<W����ip.��V�icu�2j|I�e|9��i��
o$N�h�9��V�Ji��?��T֧���?:.�/@��:�3x��J�G����p��rl)B���l�T�[��C�h�����CT�����
���ɕ�E4��q�?�0ꂠ�e�U�7�y�u����p��+����=���@��k��Ƅ�P���p�$iq���J�j����/��������S]O5�8�	0&��`׊@��eظ��hVIJ�帩���؀N�ª�+Px��jkqh[	L����cƒ��z,�<D�%���'9\�ir�zw��~�}�γ,'�����C��Kg/�d��︈����S���o_��o)F,�z��Q]�H�HU�)f�h6���ȁ��J8AD),<wԒ�m�&i���S�z��Ϋ�_$���dX�9�@�V\D}ϙ����϶���S�X3�]Z�V?�K��]�0,�\Tr^?�|S&ח�x�Qn�4[G���ُ���G�Z�o���PfPO�B3{�A��Y�(�%��Ӿ.Km�ض���?�Բ�b3&��`L�jP�jh0��qg��p�S���[Jqsx/$�W���`��~��$����iiP�4ȴ����'��h'��b6�
���K��Z�����~lQ�)��#�K�.}0t\7�I˨�՟D&�j��}�!3���%�ӗ��~�D�S�Tmڋ�3 q��Nn�ߑ:r^.��Ҭ���s>�F��:gC�lݖfO�
.�|u2�QNh����5N�Rr�.�|�;���	4���]�8m��ѯ�F_��;�)�4e�k�k�U��A��$ч�ah���g��v`�a�[J9~�җ�	�Zr^[A�z�
<����?��׃p�x�L�	0&����F:�*�X_��_���[�Kn7����/O��U'���(�Kk��8���h�M:�=��/�,-�:�xl�E=t�o��c}�1��m�^x�1�Z�
ȅ�鎁z7�Qy���1��Ā,����7��\@1�� s�Ӵd�QNOk���.�^��I�.	v�ˈi�EЄnГ�V�C��Ab0ڱ?����oH��뉫�=0�vx�l	�Ë\Թ�+�ȓ�w��ptkK��g@IDAT��^��;����4� �L�b�ӻ[zt\NM���@�H�t5�:�����϶8��йw���@g�_����y����<&'�RA1f?{5�$�ZMQ�~�՗��O�zPU�S����y���)L�	0&���r=�<N{L�A[+�8T��na����M��#nh�eo�e��9G�Y�]�O?������9ŴlHΗ��Atz�7��Cr���E4[s˗yabL'<���������� C�/N)�%d_Kw���4d�ħ����t��t���g����(��n��m���RZ=m�;�=�-�1_��#Q�v���e#s��1��n�g��� ����J�H�\(��RΗi6��L����FuGXKv��1PC����i������!Ⱥ��
{�?UX��?���KҖ���S:���,
�>?�Li�JV�V�I%���鸜%�(o!d��|k�Y���.�%*��~Z�C�F�j�O-=eK�yַ�Ϙ`L�	0&p5�4|��_��h��_7��G�'�U8t���R�����2�h�xr]hEw��\%�)���ɛfl��#x/���q�[�Zi�R���i6��hl�H6��!=��gǁ���3�չ8S�:�c��O4BWW�5�
۬��%!C���6(_���{�L�Z����V
3&��`L��h9̵c�53&��`L�	0&p�h���DoV�	0&��`L�	0��;07`���L�	0&��`L��`������`L�	0&�n@�܀��&3&��`L�	0��J����r�7`L�	0&���	�s6:���`L�	0&�Z*v`Zj˱�L�	0&��`L�$��
��l2`L�	0&��h�؁i�-�z3&��`L�	0��;07`���L�	0&��`L��`������`L�	0&�n@�܀��&3&��`L�	0��J����r�7`L�	0&���	�s6:���`L�	0&�Z*v`Zj˱�L�	0&��`L�$��
��l2`L�	0&��h�؁i�-�z3&��`L�	0��;07`���L�	0&��`L��`������`L�	0&�n@�܀��&3&��`L�	0��J�MK�N�B��K����!�p�Mv=z�y3.�ڎ�m��Сw���ҹ-�n��3W��Xϛ1p`7xJ��8����ܒM�[��R�_S��~un�&~��Wƶ~�=qo_w\��� 7�rK�L]��6I�g��6Lo���8�	0&��h�4���0��9˙�V�S�B��O��2[\��kx{�G@�?`�����R|����q_��'�v.�s��hkմ�[�������^3���X����V��O���K/�?q;��ہţ&a����H9	�}z�;�@����ևȁq҃QcfQ��³�܎;o����݁���5�<�'�����ݦ}�d�m���N����||��x��E�exln��m�E���M��J����Ƕ��������Κ�z��Q_��n�dL�	0&��'�K�.]��^���O��z?�(��Ru�5���}�H�������(GUu.U����\T�K��g����r��(�����?�<�W�V?��Jq��nyQo�Z�ܾ���}ș����u:���OT�y�4%'8�Tf�����?���vJ=���ض�.Lx�?�|�6,|wR����*EƟ����+4�"*�Lڍ����*qv�<#��j�9W�~�&�r���sO=�Ψ��W�y!,W��&0��r|��`L�	�T�y
-��ΣZ��)t�|]�9^�mL�<=<���I"���?��ק,�O�>"_�wtGE�j�]��^�b�Us���=�ejc?ʑf�:��Le�W<�؍�,b�?i0Z����-9�pK���h����W��ո(�7�-�1�܇��m���N�ZHS9w�_��y�����~�����'/���c�K�8@ga�݅��К��5h��s�1��#��,|���V��M[���F��"��cy�P�����}m
*��T���b,xl7N��y�gQ"�?�G���5�~������B�Ϥ8��w�'�CVlA�݇'C<Q]N��.���8`���6�V���}�>�w��0��b��Z��u��l��(�rC��g�1�b�߰�GI�����~Aþ��CM!]-�(KKj�W����۶,�f=��/B�3I���dL�Y���k���\L߀�t��^�Ut���"�M{m�o����'$atx�?	4�y�s̘���t����Q�Py�8*=���U'7"��x��T���cs�d�|�6z{�%�$'#҈˗oBIncӆỌɈ��i�iU��`L�	0�I@sF�"�N�lEE~6��+9/r.�v�1�w�%�oً�7}��i��s냑��x?n�wh�x�rg��DM/-i��᯷�+�z��
�YϮml�ȃ�r�z�ޏ����J��r�l�8y�Cn5Z��Fн�R�{G݌b@{���/�i�~��w�Bq)Й��?���hv^�����^�Ѿ�<S���!�w�?�(+�O���%����>�����^�i
x���S�#
�e9��1�逊���_J���aۻwaH'J��ʼL��ö:/���A��Az,��[r^�K�i&�F���ԏ4�<�{��FC��Kh��I�.����`o��Rk,
��56��(JC�4-]t�h��+9/�p0���o`;j�+�|�	�}�٪uK��v��[k/�6�A�|����1<������C�`�즙�#墯�Ģ)㤼����ǃ�K�@���le-�:����`	��;qet1��;})Ð[�.��g�B�/������Ku���`L�	��F��H�������;���B����Ϊ�Ÿ����}����'����D�Sy�,}���R�낣r�c�򎼿�bw:��+�y����LYBY��h3�N�Qt��o�ǥ�8���M=��v�7���{AZYgM#�kN�/��ubǚ&Xu��tB�q/E�1�[J��Q��ŧ�?�7ڡ��e���D3)������u� �`!���g?z�	Rv��4�|Ϸ�����C����%����R����D�'�h0[��nD�ˋ6��6�~|�-��w�|�fb>�	!2��Zdy=~���Ne������rYX�u�;����d�SdàW�x-���ߌ{o�SF�h��g>�G�苢�}(}̀���T�$�P�j{�U�#Y���vU]����,�B@[� h�~��mڏ��8����j?�;�w�|z#���[2Q<z0��܆Q�1��S�տ��ץ#�WZ�I�B/T�,�:t�.�~T��'���KNI����G1]���qGĿ���8�ÿ��M�ܔ����Ҧ�i�P(O[Y��&��`L��$�xƼ;۽}g��>�l@�Ł9��L\�Ӈ�ASm����������Dx���`��a����|�^Uk����i�MX���p��Ǿ^�O��0�m����]?�s��(��T	V.n�3�V���o|����b͠��Y=����9�S�~�ށS�6�(f�:�gZ�wJJߙ{����
NJ΋�.��\S��(�l�b6�FXܬQ�'5ek)�=ȡ�V��~&���_
G�d�54�N��r�ņ�+h׊�u@���i��sI������!��u)h�K(�����
R��{;�Bhw�9��(s�Y��56ʗ��.�3����FO:�2��{��_�o�Oǘ�=�[:�K���y�],ml�����Ė}#9/"��fC�W��?��[���A�Qh�?!�>@�~�{b�i�90&��`L�:VuE����d��q9)"\</�.,΋�++��i��n^gFg3pWHO�#��l�����O�}'���
������&��I
�An�����?�+D
F̆X�2�goť��4#�Kh�ֵg 整B�e�t�����_�;!9�#:JŪ�i��	���I3O�N���b�玀;��tw�!/�kP��w�.v��̺\��<h)��q��\��t�ݫ_w<ٻw�Js+��� ��xA^��u���4|hK�!]:u'/�B)�4ؕ���d�2Y�%�'�5�v�}$�U=-΋�.b�1_`٠N��?՝f�:�(?lԘ�iJ?�]7��]�4�h�_7��ўr`�q_��4WFY�|%9$�C^�Wutϝ�{�K
�WV:imKڒ�\�W4]�[�1��WUYNK΂�_�y�{l(����~L�	0&������&q:���f������Ѧ���"o�?@�Nꋓ�qɫ��4���Ϭ�o},����2���h���g�j~��W����qx�C����e{�rUhυ��ن�<0o�q��~|wL%�A��"���@{9�%`y�0���R�`w�u�g��=f�E�[��$b��
�>���^�4�uP�d:*+�R�D���݇�gkQ�Q���v��G:�_�F��7�a��Z�e�����o�]о)��]%X����@�)��w7e��Xz,v�����c��Z���
�rQ%�v��f�J�h�)	U�e��x��~8��?|_�R�W�U��BS��=�&�?u��M�u�͕�޸�F�sy�d�ןH)�'�������1�󢢰Z}���,9J��8r-N��;����G3&��`7��۶ �^�O���� n���O�\ڋ��X���9T_�{�>�6;/U8�q>>Ȩ�\Y)������,wQ^�"�n��m�����F�f��`�Oz�U=��T��]��i}����+-9�]G�37��ms�}�V�ܚ��?ӳ��Ţ�}��b��r��b�����r��5oF7�kʴ2[���Z���:�7~>�C��§��L텙��'��%^]�%���W���WV�uR�QdÒ���/Z�G0�"��lN!�zR�O5�������:�h�M��?�S����7��B?�[��TZ�>л�����h�
r��ٍ�6t�P]|+�X��ds�%G9�Y���{�i:i��[�ev~
�:)�;\*�Z��'�֣��c�ȑ҆{����Z��\�WEk�Wxؼ'��nLG�dr-�\M�(B�Mbf#��`L�	0��G��Ç�RT$�ث�㱸�<�Qq�[�Xo3��Q���>�xd�����u��?<hu��ەg>�+��]-�(�i��#��a�k�bwF*��pV�ɬavkL���Ц�
������?��5�?cw1�6�F��bz��Tz����,�Q)��X��~��R���g�{�2�ܪC�s��w��������O��E�5�t���e}�IO'4���JΑ�v�O�45uĻl��.Zi���A/qٷo3����F�ȡ���)�\e��H9i�-F��:����pP�)�6�>-٪iM`�*��`L�	0�E@Ӂ�2�zѽ�V�x�|�MwOo���>t<.˫���M8H+��	����܇~�*���%�]X/�*�xcګ��^rI�WΟ���M{��Mݱ0F,%4��b�!l��]'�H�n@���Y;��h��N: 
�il�ծO��f�5��3&��`�'M�T��Ҫ_x7�;�=�[�땖!+� rK�/��ꆘ�:�b��/�a����p^_Z�6L�	0&��`��Z�m`L�	0&��`7�6�� 0�L&��`L�	0&��o�\����1&��`L�	0&`C������h��
lj�C�T���+�4$m������ң�6�"��HE�s������}��.���h�;at���!#���o����_�J6_ѶU���w�%�9�	0&����:0#�'��x��Gb���;0�	�cz+
�q�Us`�<Q���C�����c�?�W8��[�_�
W�iS��&k]$�d�A�٘=�����iM�.t����ա)�i�~��%W�p&��`�KȌщ���Ÿ@�N��.S���b��S���$�Mߎs��#5.�O�xO^��{�\�dj�B,�����"
u�;�};;,=g�5�p5�6�j�@�K-�'�w����
/������kZ����Ҷ.T��ԧi�u֗\a�e�`L�	X�80F̘9�~܀���زl	>������T��݅
�3��z�o]D֓S��+�LHM�����E�� yr�쭙Ȓ����ֲ��)��E�#f/ϴ��-O���E�L9�M=s�5#�M���]����ቱ�������44�ٻ��,�̕b�2+�l�.d,��W{l��kBJ���%Y���:�ٙ�A�,A�5&V�� s���E�N���si�
�R��}z�$[3��mO��ױV�g�Z;�)�md�d����O�8�'�eK}+u��74mPa6ə�HBK��5y�]Z̴�����PAI����z}.^��Y_R��	L�	0&�A@ف��#	9���TV�c�����8�p��E�Wc钥�u�=�}mT����Уv/R��ņ��5�%?D=�K@
኱*}����Wa�Q7:�N��~i��K�Zd�J���YH�r�G�B�T_��6z��8�s�̚�%�6�$��ǜ���L��4
�*��߿���v����.���g�w�Ʋe��*"�&m:��
�2+K��!(l:V�ͥ_]��|�����mBt�G�	
‘-�;w	�qG�~Ar�n�����F#*��B
�z���V}�\�j����s�}>������H7�B���H����ԕ&�sY�J�v�r4e�Mmd�d]�%�Q�Ye*&�ԇW���˖b�vљ�m�4Qa�ՙ��l��WK��5yj2s�S�Pl[��	{����/Y9�`L�	0�&P�S���Ǹ��C�7�)X�Ć���uH��.S�&!�޽h	��1�A'�G�::����A����~@5툘[�:�R��ѨP��na������&���1�6����Xq�r�@�A�4l�ݵB���{Q
ZΝُ��됺�&Cٗ�f��kPaN�ow�SS��S���1ݷ��F�+?L.Y0��=X,�r`߷�w�!���‡��P���ǧ-��32��ZV��%�.�'�����5�[�ʥ�l�k���`���p��D�����B>��#RI�ˌ�(0e�y���
��b*u���NCH8͖yT�g+өQ{�:�fʎ����t�$+l;��l�z�bM���Z@3i�g쀼��\ �Ժ����]�0��<��눮�pMk��b���#�oR��V���۲��/Y��`L�	0�&Pv`H`bdL�	���X����)�-�lr�:O�\>��S��-	�q����n�ٯ���ߍ<���8N��4�\��慉2�`����oڴ��a��)/-A�y����l{����n�-1F�IY�9�T�#Q�Pb�MiњH��ۦ�=�1��1�%%(<RfM^�8
4ܶ�Љ�?���.��T4��\�t����
uZ����
���U��6�Ȩ��Y5�Ҥ���R=eG�������y1h����ېW٦Nq�Qe	�{?U��l�):k4����!,0H��
��U�9��,T�-�X��t�V״��BW���j9��V�����>��d����`L�	�@@Ձ�6�X��
Ŷ	�a5B��)b]�F��?/��5W�����\�v�u�h*���tF���
�u��	c�y�ª�$J�S��G%�/���æ�q3�D���ckX���=V�t��Ni<��UX:�>$s�16����K�j}f��&�o�ןJhp���I�>C�J�\\�A�,���8V(%���fMj�}��K�J�N&�p�:GOw��'�;b��.�|čٮ!Ӭ��}P���p�u��gfMԸ��y�=��E#�z�j�Ҭ<5t��V

��4��	�>��?�5*����Y��KV�|��`L�!�=0���4eb��X���~7I��()r(P-C�G[�N���\�N��E��eN9���V���z�;q����_@tD"�z��:GY��m0mzэ�����̙���$�G�@y�7�;.ϒXp�3a��IxRn���`�%j�:�5�����FiC}�'�PJ�OZ���^r���c�͆�aac1r�h<zgP�,Z �7�
^���45z�S�b�M9���C�����
V��}�jj��IN�	�b(5|�m��lq�C3fLÿ�qғ��dZMu�*���T8h� ��(-]�Ҝ��yj颕f�SAڍ��;a-�p�}I
G1&��h�[δ�#{�M��;��h��o�k�h�K�_��X/���eC�0�d�IIŦe��!�$��b���5�5��#��9HY����y�Ҟ��#W�4!ƸŠ��!�
��e׊t���nA�䔄"F�� ���I�/��N
��%=����F��"���@7��x�zΜň�Y�t�aAN2�-쉤�#1/-TJ��-{̇�U]#搼p��)���	��'"4n�ɑ�%���g��;q̅
��+Xᘋ�6�koƯ��g��-�Ӳ���xE�kd��41H�C{s��LK	��2kYfy���r�����H�Rf&�/�ב�Ń�pM+�T�}��аmי���;QWR���K�\8�	0&���n>|�/EE�3+	��(��eXNH4gI\����t�)o>����a4��T`7`�J�
h܁���յ�L9Һ5��h�#�k[T�0��z��9Ȩ#LjfX\чf~��V�)G^��&9Y�>W��|���ʍʤ�-��^�S&`bf[�Rۛ������z��ZChcm��lRK����L+MP�'�/i��$&��`�p�LMJ���X8�=},=.8]h&���
G7�E���i¹�@s0$`WZ
�����^�Z�WB�Z]�[<_���"7r_j^�,�	0&�n`�K�l�$O��9spx����;tq���YH����'3��$��
��t���'�J�l>�$�����ܗ��$KcL�	0������
���`L�	0&���uF@�)dי��`L�	0&��`L@`��`L�	0&��`-�@�>}�����Zt׌�1:�F���{�_��}G/\Q]�h}:#b�D�л�_������\QP6af���ؐ�ؑ{Ц�;�:��O�Zmy��r��P�Ƶru�֡�6�T	O��op�M42&���6�둔��^{g�(��D蕰҄���X2�a��=���}��4`yv��|Y�g���9�0�1��޹�q2LMl@��4��SY�����DQM�/2q9ƺ��/*�H�5Ys�����\�BFNSm���Z9����X�=+6Y����ɚ7w}��"1#&
G<��:my��S4�*D:�V�J�6�L�#�EO�÷��\O�kL���	0&���
��%oD֜0�����뀈���c��΋�S���M���j�0üm�]��Ըp��”��Y�Z�;9_�[���oK0`أ�?��G��hJ}]�D��ne����RK/=^ީ����:�,5i!J:6��"8i����O�m�/J��,;B1��#-��\����':�V�J�:�����Dzins�>5�j���`L�������HϯB���A/.\4c$P�o��颋H���\��?R"d��h��6!%� ��;$��yR��\��LX����]r������\*��̌50I��"35���!+��ͺ�B�"z�~*�7aQ��d��~Wv�~���;.���d��H�3U�̈%Y�vʠ�9?�̺go�D��n�'����y֫GN�a��LkY�zybd]�#wrM��dC�Hl����!0Z�4�>Cl
���Ip�dg�"�Y�M��L�)���
O.˖�N��]����J���3�-��5��E�����,3S�/󩿈��&�Pi#Q4	ٻv��W��cG�M���Iuퟛ���:JQ�S����z}��]G�k)�o���?u�}�l�7Y~'r�5#ю�Be%���?�m�fֈk���wGiM�]��r��_�Ъ���՗�����dkf&�fo��D}���j�W�G��™��`L�	\c���iA�{(�?�n�a4�2�����rޟ��{�2w.6��Шy�/���:#���}��f���3��:��)�����FTn_��ep���2^�ꂭKbՎb��HilA/Μ�`��̊ǒ�y
�����༛�>D����z����N�<�Iа�\=5.]hX_�U�[���|�
��a��Au���뎺�K�Zd�J���YH�r�G�B���S���QM�Ehz��G�TX�Y�,�ҷz}E;�a钥�.��eq6�{�m,[���"*X�%��*S1�������eK�z�HT�"W��'�:�L`��n|D]^����K�"�t
A#�#E8�Zi�*�_g⽥i�W�����Ւ����>BLh��l�ܹK��;���u=5YSI��4Xk^G6
+
�§G��O�r_�����wb�̚�%t��D[�k�\�����YR#����Xj#�K��{�p�5Қ`�z���Z�Z�h[r|O�_�	g-AQ;�yQ�L���s�wW�՗D��X꣺D��>��	0&����%���̬PA2nx�F��p-�R�}��
��CzOe0$wB�ޒ�ZM���KMK�T)[�bkn�s�µ��b*��X�Gi�UН�~B�oqt�>xѮ�0�	���?�]XK��H�[��c���X�_��y���NZ��{?��刘[�:�R��ѨP��na���������p��M�Fc0.V���=�w
�6i�e��
<)
[������4��gY�F]�T��J�C2):5lB��*��(E�.dP��#���A2��-fشP�S�g7?�Od��n�G}i��:�`��>
�Z#m��NZ@l���ߌ��sM��H���0j�ө�/�*�Ȩ�ֶڬI�J}����A�:B�zeď�Z95����2j�sg�#��O���.D}�QяK�nj��6
�!*�0���`nw5�J?��O��z���A��S�V�B*mkx"�悪�ljVе���;o�TD0N�5��)�s��]���<C�W��`�/�V�|��`L��cհc��8������MG�8����h�<Ŀ��/J�K�������E��sw�$��(Sy�D��^^j�-fy��(�Ab̭�qmI	
��a��#�w+b'���L����iT�U��(����k��_��x���/ى�t����{��Ds��|�Fߌ
sD��R�]�d;D��]����ُ���^S�=��C�&�W!r�X_���U�Xmdk1��V���Y�~;`&�*;r�\B_bk�ZiR�l��7\��H�����,u��-8�
�?��O��|m*^G��68\�iڐ�����1'e5搌�鈊]��5ԏ����9�w�6�J׻9�J���h����z�5��ҵb��}�Z�,}p�	�=0��l��O[�D���2O1�Ⅾ��K�l�~���`L�	0�kO�����F����%`R����G������AZ�9��)��ڲP���?VID=yR��:��{���UX:�>$ۏ�F�F��xf\���G����Q/7�Ҟ�����z��%V�viq��Xo[���,�ۢ���Y^&H��6/&�%�
��B�(�=���QI��b��y�a�
�K���	���"){���Z�l�	
f6�-�����]�N~�p�F�=�=(Vެ��f����R����
o�ן�7���HO��yY��,���S���sdæ�q�Y�1�q30��~�8|��h#�N:�f6m�q����Z�@o���s�ʗz�ɋ�T�w4���:���J��^�C��~w�,ǑC�:z���'E鑸�M��O��ŋbZ�`L�	0��D@u�Z�9m�;�n3s�:bM��!�|����l���P��_�����&յ��O��>/LZ���^(%$-�|��M߂V����
�/�aڋ�C�ڿ3�H���r+��'"�h�1�i����yF�v�4�:�v���?�DGDP�z��:GY��m0mzэ�������S��p��R�?	�#0b����&sQ��鈙��Ii"^�P�m�&	�J�2(0�:����g����w��Ē��yU�������]�S����#=�\��V��bM�J⩟�����e�I�>d/p�4��F$̒�h�6h]�ZiR�.}��ߕb�ڶ��o�7a�!)/���ȵ�]-f9Y{��A�,z`�΀�����^���?��>L�	0&��"30��5�Ҭ$o,��Ą!%K���!�e��!�@J���<ҜV+��4�����=�ȓrh}T�3֝�ҒI&�ә��'�f�ļ�P��Zl�#�a������P����Á���=�5�RF��"�M�� ����\b%�kk �j��GWr��t����B�}�G��i=9,n1h�d��+m$$['~��s��K~sz'Qs#�Z&��<2��Z�*�h�R���e߾r�j���!3k-փ�N0s��,�Ly�Z�������dJiV�
��3����#9�r�̴4�}/�n��_B�����GrӒr8��2k�f}�צޞ��udQ]�[���
>�J�\(b�1
b	YZ�|��)��c�һGL�׻�o��
�z�)j�[�k�k��Li��S᭸0,NCU����A�)1c[�����X�v(挎��(+���rٿ	��b֌|��`L�
�i���5�
�a1z�r`*��~K�Ej[���h��*���@)�8SNs,e�`��lؤd����JS��q����ֵ�l�F�].Z�(2��D٫c�c�L�lcW�/&s�JӪ��4�5q���mU��I��ٮ�f�t4�Ե-]�&4�����H׶6md5X�z�J�
h�Z�]���)�"��;g��
���Y�����Ug���ECW��A��LL�	0&�����L������%`H��4z�xz"��&��ve�b�L�)��XN)�D�@�oĘ�g�s��ę�`L�	�p������ϟo�f��L�	'~A�[��/k
v���	Zi6��	\+��	 ���_�A�����r���eL�	0�kJ�g`�)~��	0&��`L�	0��h�S�#��2&��`L�	0&���;0�I�e1&��`L�	0&pE	ܰ{`���4:w����<�;j�'�	�
��;r6AJ�����?	A�?a߉�cl��3"vJ$
�����jw�4k}.\�vpQ����'�i���
��ь���;�;q����]_�z�B't�g��vr[k��p���p��j>���ٴ���L�	\Y
30z$e�"״F��V�����X��m�Z��{�0f\���{����<q3���׌�%�j���+�G����11�~�yK��"�&+�I~TTF
�V�n�3�v�JSը����R�3�'`x��/�.�ׯ~�_�ٵ���߉澎�l�����z?<�v^'�mc�#,&���_/�1ٹ�X>�^ݘp��l�n��	0�C@�E�x-y#�������^D�GT��nX���|i1��+��T�T���P���텨��&-DI�B���y���t�;����\~Qz�e�y�½fAH��'�n}�����]+͑\G�W�����J��6�o�F��Oҵ���;Q��;��ב�o�M�4w}6����T��R�K��Lٶ��V���O/��F���*��i\�	0�@@����g�@�Sو=
����#���x���$]Dޟ�ҍ�r�H�����袱f�T�����J?j�X�_�¿��V8���!>)B� )UU�Us��Hbg/Oǘ�����r�Y�g�.��O�G����.(��K-��{j��/���,�~K��G����4=~t\Z\th������G'a医QU^��"��0�z�������یq�!��[�c(N�(�U]��*Q�0Ħ`��J-4����UJ/�����Rz���7��z4l#C,V.��`��L���6"g�ұF�Q���{�r�xrY6�ts����?S�������V��̌��\���&H�o՘�m��������TOv�O����?��B[���;�t��c������F�f�T��t��m��)_�U��(��Ϋ{���6��L]+d����N�c]R*�Q{�
��ۓ�<:�/����z>��
�w_}WCJ�jŴ�b$;�g��xD�7Y(��~�3�c�{��B&٨�{]�z�i�;���߉����u40
7.�����~���A�7K��R�-�k��S�� �ؤ5�rw�z�?R��l���bhO��r]���ǰ��2�,�n��m��l��M$������Ԝ�F��'|=��X�v�?L����Ps�~�|gDA���Vwx���W�6��ҽ'�,�.򈠟�q�^8�v)芥p��)��L�	�	(,!��\��Jᏹ[?A��ۻਪ+�Ka	bfKP�,X��v*�:B)��	hit&�L�q��FK[�`%���ؒ	�Sh��Y���  ��1���Y�羟�˾�����;�}?��s�ι��s�}/���W��t�S@�K�>�.Z����0&�KS�ހ~H�1�w,s�����Gצ~ʵ|7���1�����J,ZT����:�m;��}۰�������;�QS�Xi��1	��I�rT�7!a�4d���M��#
�Y��d��"4�J@\L��Kd�mª����
�.e.����i�K��७E��(*߈��Sb��%�|��4�ʢ���DC���X���Q^^��F9�
L���
��t�C����\�?��yx/7��QNmT�(��a���|%�ng
r�'�ջ�4O��ݸd0b�#�U����qD��]�۪~���K=H�kD�Պ�۫PJ�F�KF�]k����4�	��:���U�r€cF~!x�C�B�=n�#�gF�OSf)�$�Q��q	1�\���3H�4���T��xz��s���A�>�	��?��Im��W�_�.0���Jx6!�|AY���G�|����n��@�)1�3L���D���{߄cs#���Q|����S~J���J�K��">*>�����u�Տ<n��p]{Eߞ���`��s{/���ߡ�m@ܐ�ʍ��#�GW�
��7�
رύ��~#�A-���_ӳ���
)uL>=���@��!���Q����È�#�iE�!	oΚ�At��`&J���`��h(�}v�40d�UO
:��X��8�U�ٜe��.CN�D<W�6aّ3y2��Fc�5�����=~2��
�#�e��8o=݊A��F0>,(�<�,3&мc��fcuMfl�'�AII!�c�������i�I���h�����p22^&��������N;�]V�=���v� �����v�\�=V���2wmN�ߏ�+L��-
����/��6�Գ�&m8��%�%��y���6�$�i�)�!����'�BQ:˄d��`S�m��z�%���`��ń�bk\���[�h9�5e���Z'?^�ڃN��I�m���O���ڂ
O��"�E�Pơ�<���|O5�e���򃓟��^hا�o��l\;�(�'394���C�_k��YĈ�ޙ�f~�i�
Ϲ�����t�#�B�,����q�L8��s:�v��Z��5/��]1�B�G��ྡ1H|�^����m
ع�<�.;'U�&�v�n|������y��]C��z"��r��'gY�s�ZQML�t��c�࣋�PĶTvE��(9�����g�{��3%u@>U��Q  ��g�f���f�ꑍ㛽n��fp\h>�4���
jIDATV�
'�=:�^�6^�Bj;�
�|3�·�/
���J�v�ƅH�|��L��m5<`\=�����PW��ڿ2)�|�|��j���̏]ۘ��Oj'PA^<�x�=�c��ҵXH�6�W"���)hHlEċ[�$�|J�v���4eW�K�8����9�8� o�J��QmP��S�Woy�A�x4�}�@����C�m������(~����ۢ�]�������߳K-�9j�6D���B�.�"J=h��f�I�1�"�}�x�4�{�=M>ݬ�����9�-y�4:	���N(M�%%�O./�~��dz��h�y4|��㵽��ʮ�y}�#��z�m����
�C�x*w�!�~�ՃLTu!>M���Ǖ��M;S��,�A�_!.bc1�x0�іKה��t���m�b��RG:z�yd� ��8O�Q��v����
ݒRw
�+q��1v���E���uf�g�D�EY����2'��Έ��+�Nq�Ѿ���C��VxH
>\�4�ug�m����n7�Rk��,��ġ�oӕe�4
^ZP�=��1q�*�Iw�v���}�S�qt}/;|��lG>(��L��K{��hI)!�!��Z���#Gbvv>��vJ���^|
�˭���C/�a���h�^V>3���'N�Le�K����A���Ӧi��Ak
��� N�;����T�G�`��� ��3�������l�e�ߺpE'�T���ŷy:���|Bjυ�c
�!	a�i�=}U��p�&rݣB���Zy|;ӶOE*��?ݲk�k9�A�烇� z�<�gl_�Rʋ���DՃ�P86��Y^Z޳p�nϋZߚ���K#+U�S�	~L�d���v,ً�^<��_l�B�n��;{|_��I����"b���Y(�`u�NZe3�"�)w�d��}:�f,~w6mZ��Ҷΰ��-/�ɾ��:�{1`���L�Z�
���T���L~����Ya��w�1�f�xn:�f�K˰�F�3�n�J���T���B�45E�f8v�=5�M~	��ӑn5�'�}�6z/(3�X�TK:J_��Eg&��}�D�![,�M���'�[Z�܌T��S򪅺@/��)G+��0y�Sj��v��C�߬,F���5y��bi�QX�x���w^����A��g4`��8N�|i(��m�D��A���z��ouڄ��l��y0�,X��d��.�;i�|dYLH���
���B�,^���q�k��n�_vm������9��y�2���t���lB�gi��[�o\�4L�4O=ʶ��N-�b>[e�3�*�=0��DO�r��E�L7���>�Q�6���Z�*3fڂ�H�&�,�0��!#�?�/�CoƺPUP�W���Ik��`�0XyGՏaq!���X�}ҋ'^A�ex�|^�����4�~��9մC�͇�a�$%�M���Y��	<[6��a1&dП�k+r���
��ca�.�vߏ�[^A���f��iOn��ҕu�k��/� ��S���#_	��ě�i(�HC��c��[��`�[���R���0����݇���t�i��iĀ�	 M����BV!���z�I[>�
�o����[��\X�L�����������~ϟ���	
�6�����sI�d���ڧZ*��m˔� y\�����EH�>�����BʈS��ۭ��J�:Tq����~�n����V��	�Z���c���	^{�$���˰|�,������2C�{%�%6$a^E�tꢯ�J��9p�g�-/�gg<��X�_b�V�ˮ��YOq��h�s[��׏�6!c�g�9�=2S��`����!�>M�]Qg����MNz:��iEa:�~S*y����9N㣏{ᗏ�#�ޕo7嵶Q~�M���5�f�:;R���P$��6)݃�_���/����a��M�-�H�!���� � i9
JU�б���b�)Kl�L$��@��!Ѕ���lll�\2Za�Z���9X��Ml�*��e�l�hڛƙZ���H3})�r3lv߻a�[�#��dF1�,G����E��	u�bO�V%���f��R���I>Z��@�f$H�����A3"ԃ~{������Eo{&Z9��_��p}�9��~7ߔ��s�z�O����y��-/�k.:�3b�}�Pm-�_�J_1��#�g{<}��蔧���։�/�H���/�]m�1G��
�A+)����Ì�"iا�5���I�̦����C�#��ò8:1��N
O���/1'�E/�_�I�i��`�/�[��=������W�zP��GK���đ�ldh��:(�-��.(h��He���h�J��@����ҥK�H��z�86*
QQ�p��u��N�0-vv��Kz��j����c��vꏲ�k�$��\9�����;���x���sרJ0*��@@  D�2�@@  ��@@  �S��N!/���@@  "F@0C&*��@@  w
��)�E���@@  �@��&b�D��@@  ��@�N!�?56���Mn�IEND�B`�<?php
namespace Joomlatools\Console;

use Symfony\Component\Console\Input;
use Symfony\Component\Console\Output;

class Application extends \Symfony\Component\Console\Application
{
    /**
     * joomlatools/console version
     *
     * @var string
     */
    const VERSION = '2.0.3';

    /**
     * Application name
     *
     * @var string
     */
    const NAME = 'Joomla Console tools';

    /**
     * The path to the plugin directory
     * 
     * @var string
     */
    protected $_plugin_path;

    /**
     * Reference to the Output\ConsoleOutput object
     */
    protected $_output;

    /**
     * Reference to the Input\ArgvInput object
     */
    protected $_input;

    /**
     * List of installed plugins
     */
    protected $_plugins;

    /**
     * @inheritdoc
     */
    public function __construct($name = 'UNKNOWN', $version = 'UNKNOWN')
    {
        parent::__construct(self::NAME, self::VERSION);
    }

    /**
     * Runs the current application.
     *
     * @param InputInterface  $input  An Input instance
     * @param OutputInterface $output An Output instance
     *
     * @return int 0 if everything went fine, or an error code
     *
     * @throws \Exception When doRun returns Exception
     */
    public function run(Input\InputInterface $input = null, Output\OutputInterface $output = null)
    {
        if (null === $input) {
            $input = new Input\ArgvInput();
        }

        if (null === $output) {
            $output = new Output\ConsoleOutput();
        }

        $this->_input  = $input;
        $this->_output = $output;

        $this->configureIO($this->_input, $this->_output);

        $this->_setup();

        $this->_loadPlugins();

        $this->_loadExtraCommands();

        parent::run($this->_input, $this->_output);
    }

    /**
     * Get the home directory path
     *
     * @return string Path to the Joomlatools Console home directory
     */
    public function getConsoleHome()
    {
        $home       = getenv('HOME');
        $customHome = getenv('JOOMLATOOLS_CONSOLE_HOME');

        if (!empty($customHome)) {
            $home = $customHome;
        }

        return rtrim($home, '/') . '/.joomlatools/console';
    }

    /**
     * Get the plugin path
     *
     * @return string Path to the plugins directory
     */
    public function getPluginPath()
    {
        if (empty($this->_plugin_path)) {
            $this->_plugin_path = $this->getConsoleHome() . '/plugins';
        }

        return $this->_plugin_path;
    }

    /**
     * Gets the default commands that should always be available.
     *
     * @return Command[] An array of default Command instances
     */
    protected function getDefaultCommands()
    {
        $commands = parent::getDefaultCommands();

        $commands = array_merge($commands, array(
            new Command\Database\Install(),
            new Command\Database\Drop(),
            new Command\Database\Export(),

            new Command\Extension\Install(),
            new Command\Extension\Register(),
            new Command\Extension\Symlink(),

            new Command\Plugin\ListAll(),
            new Command\Plugin\Install(),
            new Command\Plugin\Uninstall(),

            new Command\Site\Configure(),
            new Command\Site\Create(),
            new Command\Site\Delete(),
            new Command\Site\Download(),
            new Command\Site\Export(),
            new Command\Site\Install(),
            new Command\Site\Listing(),

            new Command\Vhost\Create(),
            new Command\Vhost\Remove(),

            new Command\Versions()
        ));

        return $commands;
    }

    /**
     * Get the list of installed plugin packages.
     *
     * @return array Array of package names as key and their version as value
     */
    public function getPlugins()
    {
        if (!$this->_plugins) {

            $manifest = $this->getPluginPath() . '/composer.json';

            if (!file_exists($manifest)) {
                return array();
            }

            $contents = file_get_contents($manifest);

            if ($contents === false) {
                return array();
            }

            $data = json_decode($contents);

            if (!isset($data->require)) {
                return array();
            }

            $this->_plugins = array();

            foreach ($data->require as $package => $version)
            {
                $file = $this->getPluginPath() . '/vendor/' . $package . '/composer.json';

                if (file_exists($file))
                {
                    $json     = file_get_contents($file);
                    $manifest = json_decode($json);

                    if (is_null($manifest)) {
                        continue;
                    }

                    if (isset($manifest->type) && $manifest->type == 'joomlatools-console-plugin') {
                        $this->_plugins[$package] = $version;
                    }
                }
            }
        }

        return $this->_plugins;
    }

    /**
     * Loads extra commands from the ~/.joomlatools/console/commands/ folder 
     * 
     * Each PHP file in the folder is included and if the class in the file extends the base Symfony command
     * it's instantiated and added to the app. 
     *
     * @return void
     */
    protected function _loadExtraCommands()
    {
        $path = $this->getConsoleHome().'/commands';

        if (\is_dir($path)) 
        {
            $iterator = new \DirectoryIterator($path);

            foreach ($iterator as $file)
            {
                if ($file->getExtension() == 'php') 
                {
                    require $file->getPathname();

                    $className  = $file->getBasename('.php');

                    if (\class_exists($className)) 
                    {
                        $reflection = new \ReflectionClass($className);
    
                        if (!$reflection->isSubclassOf('\Symfony\Component\Console\Command\Command')) {
                            continue;
                        }
                        
                        $command = new $className();
    
                        if (!$command instanceof \Symfony\Component\Console\Command\Command) {
                            continue;
                        }
    
                        $this->add($command);
                    }
                }
            }
        }
    }

    /**
     * Set up environment
     */
    protected function _setup()
    {
        $home = $this->getConsoleHome();

        if (!file_exists($home))
        {
            $result = @mkdir($home, 0775, true);

            if (!$result) {
                $this->_output->writeln(sprintf('<error>Unable to create home directory: %s. Please check write permissions.</error>', $home));
            }
        }

        // Handle legacy plugin directory
        if (is_writable($home) && !file_exists($this->getPluginPath()))
        {
            $old = realpath(dirname(__FILE__) . '/../../../plugins/');

            if (file_exists($old))
            {
                $this->_output->writeln('<comment>Moving legacy plugin directory to ~/.joomlatools/console/plugins.</comment>');

                $cmd = sprintf('mv %s %s', escapeshellarg($old), escapeshellarg($this->getPluginPath()));
                exec($cmd);
            }
        }
    }

    /**
     * Loads plugins into the application.
     */
    protected function _loadPlugins()
    {
        $autoloader = $this->getPluginPath() . '/vendor/autoload.php';

        if (file_exists($autoloader)) {
            require_once $autoloader;
        }

        $plugins = $this->getPlugins();

        $classes = array();
        foreach ($plugins as $package => $version)
        {
            $path        = $this->getPluginPath() . '/vendor/' . $package;
            $directories = glob($path.'/*/Console/Command', GLOB_ONLYDIR);

            foreach ($directories as $directory)
            {
                $vendor   = substr($directory, strlen($path) + 1, strlen('/Console/Command') * -1);
                $iterator = new \DirectoryIterator($directory);

                foreach ($iterator as $file)
                {
                    if ($file->getExtension() == 'php') {
                        $classes[] = sprintf('%s\Console\Command\%s', $vendor, $file->getBasename('.php'));
                    }
                }
            }
        }

        foreach ($classes as $class)
        {
            if (class_exists($class))
            {
                $command = new $class();

                if (!$command instanceof \Symfony\Component\Console\Command\Command) {
                    continue;
                }

                $name = $command->getName();

                if(!$this->has($name)) {
                    $this->add($command);
                }
                else $this->_output->writeln("<fg=yellow;options=bold>Notice:</fg=yellow;options=bold> The '$class' command wants to register the '$name' command but it already exists, ignoring.");
            }
        }
    }
}
<?php
/**
 * @copyright	Copyright (C) 2007 - 2015 Johan Janssens and Timble CVBA. (http://www.timble.net)
 * @license		Mozilla Public License, version 2.0
 * @link		http://github.com/joomlatools/joomlatools-console for the canonical source repository
 */

namespace Joomlatools\Console\Command\Database;

use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

use Joomlatools\Console\Command\Site\AbstractSite;

abstract class AbstractDatabase extends AbstractSite
{
    protected $target_db;
    protected $target_db_prefix = 'sites_';

    protected $mysql;

    protected function configure()
    {
        parent::configure();

        $this->addOption(
            'mysql-login',
            'L',
            InputOption::VALUE_REQUIRED,
            "MySQL credentials in the form of user:password",
            'root:root'
        )
        ->addOption(
            'mysql-host',
            'H',
            InputOption::VALUE_REQUIRED,
            "MySQL host",
            'localhost'
        )
        ->addOption(
            'mysql-port',
            'P',
            InputOption::VALUE_REQUIRED,
            "MySQL port",
            3306
        )
        ->addOption(
            'mysql-db-prefix',
            null,
            InputOption::VALUE_REQUIRED,
            sprintf("MySQL database name prefix. Defaults to `%s`", $this->target_db_prefix),
            $this->target_db_prefix
        )
        ->addOption(
            'mysql-database',
            'db',
            InputOption::VALUE_REQUIRED,
            "MySQL database name. If set, the --mysql-db-prefix option will be ignored."
        )
        ->addOption(
            'mysql-driver',
            null,
            InputOption::VALUE_REQUIRED,
            "MySQL driver",
            'mysqli'
        )
        ;
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        parent::execute($input, $output);

        $db_name = $input->getOption('mysql-database');
        if (empty($db_name))
        {
            $this->target_db_prefix = $input->getOption('mysql-db-prefix');
            $this->target_db        = $this->target_db_prefix.$this->site;
        }
        else
        {
            $this->target_db_prefix = '';
            $this->target_db        = $db_name;
        }
        
        $credentials = explode(':', $input->getOption('mysql-login'), 2);

        $this->mysql = (object) array(
            'user'     => $credentials[0],
            'password' => $credentials[1],
            'host'     => $input->getOption('mysql-host'),
            'port'     => (int) $input->getOption('mysql-port'),
            'driver'   => strtolower($input->getOption('mysql-driver'))
        );

        if (!in_array($this->mysql->driver, array('mysql', 'mysqli'))) {
            throw new \RuntimeException(sprintf('Invalid MySQL driver %s', $this->mysql->driver));
        }

        return 0;
    }

    protected function _backupDatabase($target_file)
    {
        $this->_executeMysqldump(sprintf("--skip-dump-date --skip-extended-insert --no-tablespaces %s > %s", $this->target_db, $target_file));
    }

    protected function _executePDO($query, $database = null) {
        $database = $database ?: $this->target_db;
        $connectionString = "mysql:host={$this->mysql->host}:{$this->mysql->port};dbname={$database};charset=utf8mb4";
        $pdoDB = new \PDO($connectionString, $this->mysql->user, $this->mysql->password);
        $pdoDB->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);

        return $pdoDB->query($query);
    }

    protected function _executeSQL($query, $database = '')
    {
        return $this->_executeMysqlWithCredentials(function($path) use($query, $database) {
            return "echo '$query' | mysql --defaults-extra-file=$path $database";
        });
    }

    protected function _executeMysql($command)
    {
        return $this->_executeMysqlWithCredentials(function($path) use($command) {
            return "mysql --defaults-extra-file=$path $command";
        });
    }
    
    protected function _executeMysqldump($command)
    {
        return $this->_executeMysqlWithCredentials(function($path) use($command) {
            return "mysqldump --defaults-extra-file=$path $command";
        });
    }

    /**
     * Write a temporary --defaults-extra-file file and execute a Mysql command given from the callback
     *
     * @param callable $callback Receives a single string with the path to the --defaults-extra-file path
     * @return void
     */
    private function _executeMysqlWithCredentials(callable $callback)
    {
        try {
            $file = tmpfile();
            $path = stream_get_meta_data($file)['uri'];

            $contents = <<<STR
[client]
user={$this->mysql->user}
password={$this->mysql->password}
host={$this->mysql->host}
port={$this->mysql->port}
STR;

            fwrite($file, $contents);


            return exec($callback($path));
        }
        finally {
            if (\is_resource($file)) {
                \fclose($file);
            }
        }
    }

    protected function _promptDatabaseDetails(InputInterface $input, OutputInterface $output)
    {
        $this->mysql->user     = $this->_ask($input, $output, 'MySQL user', $this->mysql->user, true);
        $this->mysql->password = $this->_ask($input, $output, 'MySQL password', $this->mysql->password, true, true);
        $this->mysql->host     = $this->_ask($input, $output, 'MySQL host', $this->mysql->host, true);
        $this->mysql->port     = (int) $this->_ask($input, $output, 'MySQL port', $this->mysql->port, true);
        $this->mysql->driver   = $this->_ask($input, $output, 'MySQL driver', array('mysqli', 'mysql'), true);

        $output->writeln('Choose the database name. We will attempt to create it if it does not exist.');
        $this->target_db       = $this->_ask($input, $output, 'MySQL database', $this->target_db, true);

        $input->setOption('mysql-login', $this->mysql->user . ':' . $this->mysql->password);
        $input->setOption('mysql-host', $this->mysql->host);
        $input->setOption('mysql-port', $this->mysql->port);
        $input->setOption('mysql-database', $this->target_db);
        $input->setOption('mysql-driver', $this->mysql->driver);
    }
}
<?php
/**
 * @copyright	Copyright (C) 2007 - 2015 Johan Janssens and Timble CVBA. (http://www.timble.net)
 * @license		Mozilla Public License, version 2.0
 * @link		http://github.com/joomlatools/joomlatools-console for the canonical source repository
 */

namespace Joomlatools\Console\Command\Database;

use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

class Drop extends AbstractDatabase
{
    protected function configure()
    {
        parent::configure();

        $this
            ->setName('database:drop')
            ->setDescription('Drop the site\'s database');
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        parent::execute($input, $output);

        $result = $this->_executeSQL(sprintf("DROP DATABASE IF EXISTS `%s`", $this->target_db));

        if (!empty($result)) {
            throw new \RuntimeException(sprintf('Cannot drop database %s. Error: %s', $this->target_db, $result));
        }

        return 0;
    }
}<?php
/**
 * Joomlatools Console backup plugin - https://github.com/joomlatools/joomlatools-console-backup
 *
 * @copyright	Copyright (C) 2011 - 2013 Johan Janssens and Timble CVBA. (http://www.timble.net)
 * @license		GNU GPLv3 <http://www.gnu.org/licenses/gpl.html>
 * @link		http://github.com/joomlatools/joomlatools-console-backup for the canonical source repository
 */

namespace Joomlatools\Console\Command\Database;

use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;


/**
 * Backup plugin class.
 *
 * @author  Steven Rombauts <https://github.com/stevenrombauts>
 * @package Joomlatools\Console
 */
class Export extends AbstractDatabase
{
    protected function configure()  
    {
        parent::configure();

        $this->setName('database:export')
            ->addOption(
                'folder',
                null,
                InputOption::VALUE_REQUIRED,
                "Target folder where the backup should be stored. Defaults to site folder",
                null
            )
            ->addOption(
                'filename',
                null,
                InputOption::VALUE_REQUIRED,
                "File name for the backup. Defaults to sitename_date.format",
                null
            )
            ->addOption(
                'per-table',
                null,
                InputOption::VALUE_NONE,
                "If set, each table will be exported into a separate file",
            )
            ->setDescription('Export the database of a site');
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        parent::execute($input, $output);

        $this->check();

        $folder = $input->getOption('folder') ?? $this->target_dir;

        if (!\is_dir($folder)) {
            @mkdir($folder, 0755, true);

            if (!\is_dir($folder)) {
                throw new \RuntimeException("Folder $folder doesn't exist.");
            }
        }

        if ($input->getOption('per-table')) 
        {
            $statement = $this->_executePDO('show tables');

            while (($table = $statement->fetchColumn()) !== false) {
                
                $this->_executeMysqldump(sprintf("--skip-dump-date --skip-comments --skip-extended-insert --no-tablespaces %s %s > %s", $this->target_db, $table, $folder.'/'.$table.'.sql'));
            }

        } else {
            $path = $folder.'/'.($input->getOption('filename') ?? $this->site.'_database_'.date('Y-m-d').'.sql');

            $this->_backupDatabase($path);
        }

        return 0;
    }

    public function check()
    {
        if (!file_exists($this->target_dir)) {
            throw new \RuntimeException(sprintf('The site %s does not exist', $this->site));
        }

        $result = $this->_executeSQL(sprintf("SHOW DATABASES LIKE \"%s\"", $this->target_db));

        if (empty($result)) {
            throw new \RuntimeException(sprintf('Database %s does not exist', $this->target_db));
        }

    }
}<?php
/**
 * @copyright	Copyright (C) 2007 - 2015 Johan Janssens and Timble CVBA. (http://www.timble.net)
 * @license		Mozilla Public License, version 2.0
 * @link		http://github.com/joomlatools/joomlatools-console for the canonical source repository
 */

namespace Joomlatools\Console\Command\Database;

use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

use Joomlatools\Console\Joomla\Util;

class Install extends AbstractDatabase
{
    /**
     * Sample data to install
     *
     * @var string
     */
    protected $sample_data;

    /**
     * Flag to drop database if it exists
     *
     * @var boolean
     */
    protected $drop = false;

    /**
     * Flag to skip checking if database exists
     *
     * @var boolean
     */
    protected $skip_check = false;

    /**
     * Flag to use an already existent database
     *
     * @var boolean
     */
    protected $skip_create_statement = false;

    protected function configure()
    {
        parent::configure();

        $this
            ->setName('database:install')
            ->setDescription('Install the Joomla database')
            ->addOption(
                'sample-data',
                null,
                InputOption::VALUE_REQUIRED,
                'Sample data to install (default|blog|brochure|learn|testing). Ignored if custom dump files are given using --sql-dumps.'
            )
            ->addOption(
                'sql-dumps',
                null,
                InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY,
                'Full path to SQL dump file to import. If not set, the command will use the default Joomla installation files.',
                array()
            )
            ->addOption(
                'drop',
                'd',
                InputOption::VALUE_NONE,
                'Drop database if it already exists'
            )
            ->addOption(
                'skip-exists-check',
                'e',
                InputOption::VALUE_NONE,
                'Do not check if database already exists or not.'
            )
            ->addOption(
                'skip-create-statement',
                null,
                InputOption::VALUE_NONE,
                'Do not run the "CREATE IF NOT EXISTS <db>" query. Use this if the user does not have CREATE privileges on the database.'
            )
        ;
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        parent::execute($input, $output);

        $this->drop                  = $input->getOption('drop');
        $this->skip_check            = $input->getOption('skip-exists-check');
        $this->skip_create_statement = $input->getOption('skip-create-statement');

        $this->check($input, $output);

        if ($this->drop) {
            $this->_executeSQL(sprintf("DROP DATABASE IF EXISTS `%s`", $this->target_db));
        }

        if (!$this->skip_create_statement)
        {
            $result = $this->_executeSQL(sprintf("CREATE DATABASE IF NOT EXISTS `%s` CHARACTER SET utf8", $this->target_db));

            if (!empty($result)) {
                throw new \RuntimeException(sprintf('Cannot create database %s. Error: %s', $this->target_db, $result));
            }
        }

        $imports = $this->_getSQLFiles($input, $output);

        foreach($imports as $import)
        {
            $tmp      = tempnam('/tmp', 'dump');
            $contents = file_get_contents($import);
            $contents = str_replace('#__', 'j_', $contents);

            file_put_contents($tmp, $contents);

            $result = $this->_executeMysql(sprintf("%s < %s", $this->target_db, $tmp));

            unlink($tmp);

            if (!empty($result)) {
                throw new \RuntimeException(sprintf('Cannot import database "%s". Error: %s', basename($import), $result));
            }
        }

        // Fix the #__schemas table for Joomla CMS 2.5+
        $path = $this->target_dir . '/administrator/components/com_admin/sql/updates/mysql/';
        if (is_dir($path))
        {
            $updates = glob("$path/*.sql");

            if (count($updates))
            {
                natsort($updates);

                $schema = substr(basename(array_pop($updates)), 0, -4);
                $schema = preg_replace('/[^a-z0-9\.\-\_]/i', '', $schema);

                $version = Util::getJoomlaVersion($this->target_dir);

                $executeQuery = function($sql) {
                    $this->_executeMysql(sprintf("%s -e %s", $this->target_db, escapeshellarg($sql)));
                };

                $executeQuery("REPLACE INTO j_schemas (extension_id, version_id) VALUES (700, '$schema');");
                $executeQuery("UPDATE j_extensions SET manifest_cache = '{\"version\": \"{$version->release}\"}' WHERE manifest_cache = '';");
            }
        }

        return 0;
    }

    public function check(InputInterface $input, OutputInterface $output)
    {
        if (!file_exists($this->target_dir)) {
            throw new \RuntimeException(sprintf('Site %s not found', $this->site));
        }

        if ($this->drop === false && !($this->skip_check === true || $this->skip_create_statement === true ))
        {
            $result = $this->_executeSQL(sprintf("SHOW DATABASES LIKE \"%s\"", $this->target_db));

            if (!empty($result)) {
                throw new \RuntimeException(sprintf('A database with name %s already exists', $this->target_db));
            }
        }

        $sample_data = $input->getOption('sample-data');
        if ($sample_data)
        {
            if (!in_array($sample_data, array('default', 'blog', 'brochure', 'testing', 'learn'))) {
                throw new \RuntimeException(sprintf('Unknown sample data "%s"', $this->sample_data));
            }

            $version = Util::getJoomlaVersion($this->target_dir);

            if($version !== false && $version->release)
            {
                if (in_array($sample_data, array('testing', 'learn')) && $version->major < 3) {
                    throw new \RuntimeException(sprintf('%s does not support sample data %s', $version->release, $sample_data));
                }
            }
        }
    }

    protected function _getSQLFiles(InputInterface $input, OutputInterface $output)
    {
        $dumps = $input->getOption('sql-dumps');

        if (count($dumps) > 0)
        {
            foreach ($dumps as $dump)
            {
                if (!file_exists($dump)) {
                    throw new \RuntimeException(sprintf('Can not find SQL dump file %s', $dump));
                }
            }

            return $dumps;
        }

        $version = Util::getJoomlaVersion($this->target_dir);
        $imports = $this->_getInstallFiles($input->getOption('sample-data'));

        if ($version !== false)
        {
            $users = 'joomla3.users.sql';
            if($version->major < 3) {
                $users = 'joomla2.users.sql';
            }
            $path = Util::getTemplatePath();

            $imports[] = $path.'/'.$users;
        }

        foreach ($imports as $import)
        {
            if (!file_exists($import)) {
                throw new \RuntimeException(sprintf('Can not find SQL dump file %s', $import));
            }
        }

        return $imports;
    }

    protected function _getInstallFiles($sample_data = false)
    {
        $files = array();

        $path = $this->target_dir.'/_installation/sql/mysql/';

        if (!file_exists($path)) {
            $path = $this->target_dir.'/installation/sql/mysql/';
        }

        $version = Util::getJoomlaVersion($this->target_dir);

        if (version_compare($version->release, '4.0.0-alpha12', '>') &&
            file_exists($path . "base.sql"))
        {
            $files[] = $path . "base.sql";
            $files[] = $path . "extensions.sql";
            $files[] = $path . "supports.sql";

        }else{
            $files[] = $path.'joomla.sql';
        }

        if ($sample_data)
        {
            $type      = $sample_data == 'default' ? 'data' : $sample_data;
            $sample_db = $path . 'sample_' . $type . '.sql';

            if (file_exists($sample_db)){
                $files[] = $sample_db;
            }
        }

        return $files;
    }
}<?php
/**
 * @copyright	Copyright (C) 2007 - 2014 Johan Janssens and Timble CVBA. (http://www.timble.net)
 * @license		Mozilla Public License, version 2.0
 * @link		http://github.com/joomlatools/joomlatools-console for the canonical source repository
 */

namespace Joomlatools\Console\Command\Extension;

use Joomlatools\Console\Command\Configurable;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

use Joomlatools\Console\Joomla\Bootstrapper;

abstract class AbstractExtension extends Configurable
{
    /**
     * Extension name
     *
     * @var string
     */
    protected $extension;

    protected $typeMap = array(
        'com_' => 'component',
        'mod_' => 'module',
        'plg_' => 'plugin',
        'pkg_' => 'package',
        'lib_' => 'library',
        'tpl_' => 'template',
        'lng_' => 'language'
    );

    protected $exceptions = array(
        'module' => array(
            'require' => array(
                'model' => '/components/com_modules/models/module.php'
            ),
            'model' => '\\ModulesModelModule',
            'table' => array(
                'type' => 'module',
                'prefix' => 'JTable'
            ),
        ),
        'template' => array(
            'require' => array(
                'model' => '/components/com_templates/models/style.php',
                'table' => '/components/com_templates/tables/style.php'
            ),
            'model' => 'TemplatesModelStyle',
            'table' => array(
                'type' => 'Style',
                'prefix' => 'TemplatesTable'
            ),
        ));

    protected function configure()
    {
        $this->addArgument(
                'site',
                InputArgument::REQUIRED,
                'Alphanumeric site name. Also used in the site URL with .test domain'
            )->addArgument(
                'extension',
                InputArgument::REQUIRED,
                'Extension name'
            )->addOption(
                'www',
                null,
                InputOption::VALUE_REQUIRED,
                "Web server root",
                '/var/www'
            );
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $this->site       = $input->getArgument('site');
        $this->www        = $input->getOption('www');
        $this->target_dir = $this->www.'/'.$this->site;
        $this->extension = $input->getArgument('extension');

        return 0;
    }

    protected function check(InputInterface $input, OutputInterface $output)
    {
        if (!file_exists($this->target_dir)) {
            throw new \RuntimeException(sprintf('Site not found: %s', $this->site));
        }
    }

    protected function toggle($enable = false)
    {
        Bootstrapper::getApplication($this->target_dir);

        $dbo   = \JFactory::getDbo();
        $query = \JFactory::getDbo()->getQuery(true)
            ->select('extension_id')
            ->from('#__extensions')
            ->where($dbo->quoteName('element') ." = " . $dbo->quote($this->extension));

        $dbo->setQuery($query);
        $extension = $dbo->loadResult('extension_id');

        if (!$extension) {
            throw new \RuntimeException("$this->extension does not exist");
        }

        $table = \JTable::getInstance('Extension');
        $table->load($extension);

        if ($table->protected == 1) {
            throw new \RuntimeException("Cannot disable core component $this->extension");
        }

        $table->enabled = (int) $enable;

        if (!$table->store()) {
            throw new \RuntimeException("Failed to update row: " . $table->getError());
        }
    }
}<?php
/**
 * @copyright	Copyright (C) 2007 - 2015 Johan Janssens and Timble CVBA. (http://www.timble.net)
 * @license		Mozilla Public License, version 2.0
 * @link		http://github.com/joomlatools/joomlatools-console for the canonical source repository
 */

namespace Joomlatools\Console\Command\Extension;

use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

use Joomlatools\Console\Command\Site\AbstractSite;
use Joomlatools\Console\Joomla\Bootstrapper;
use Joomlatools\Console\Joomla\Util;

class Install extends AbstractSite
{
    protected $extensions          = array();
    protected $composer_extensions = array();

    protected function configure()
    {
        parent::configure();

        $this
            ->setName('extension:install')
            ->setDescription('Install extensions into a site using the discover method')
            ->setHelp(<<<EOL
After copying or symlinking your extension code into the Joomla application, you can use this command to
have Joomla automatically find the extension files and install it:

    <info>joomla extension:install testsite com_foobar</info>

The extension argument should match the element name (<comment>com_foobar</comment>) as defined in your extension XML manifest.

For more information about Joomla's discover method, refer to the official documentation: https://docs.joomla.org/Help34:Extensions_Extension_Manager_Discover

Alternatively simply pass in the Composer packages you would like to install: provide these in the format (vendor/package:[commit || [operator version]) 
EOL
            )
            ->addArgument(
                'extension',
                InputArgument::REQUIRED | InputArgument::IS_ARRAY,
                'A list of extensions to install to the site using discover install. Use \'all\' to install all discovered extensions.'
            );
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        parent::execute($input, $output);

        $extensions = (array) $input->getArgument('extension');

        $this->composer_extensions = array_filter(array_map(function($x){
            if(strpos($x, '/') !== false){
                return $x;
            }
        }, $extensions));

        if(count($this->composer_extensions)) {
            $extensions = array_diff($extensions, $this->composer_extensions);
        }

        $this->extensions = $extensions;

        $this->check($input, $output);

        if (count($this->extensions)) {
            $this->installFiles($input, $output);
        }

        if (count($this->composer_extensions)) {
            $this->installPackages($input, $output);
        }

        return 0;
    }

    public function check(InputInterface $input, OutputInterface $output)
    {
        if (!file_exists($this->target_dir)) {
            throw new \RuntimeException(sprintf('Site not found: %s', $this->site));
        }

        if (count($this->composer_extensions))
        {
            $result = shell_exec('composer -v > /dev/null 2>&1 || { echo "false"; }');

            if (trim($result) == 'false')
            {
                $output->writeln('<error>You need Composer installed globally. See: https://getcomposer.org/doc/00-intro.md#globally</error>');
                exit();
            }
        }
    }

    public function installPackages(InputInterface $input, OutputInterface $output)
    {
        if ($output->getVerbosity() >= OutputInterface::VERBOSITY_VERBOSE) {
            $output->writeln("Installing Composer packages ..");
        }

        $packages = array_map('escapeshellarg', $this->composer_extensions);
        $command  = sprintf('composer --no-interaction --no-progress require %s --working-dir=%s', implode(' ', $packages), escapeshellarg($this->target_dir));

        passthru($command, $result);

        if ((int) $result) {
            throw new \RuntimeException('Failed to install Composer packages');
        }
    }

    public function installFiles(InputInterface $input, OutputInterface $output)
    {
        if (Util::isJoomla4($this->target_dir)) {
            Util::executeJ4CliCommand($this->target_dir, 'extension:discover');
            $result = Util::executeJ4CliCommand($this->target_dir, 'extension:discover:list | less');
            $verbosity = $output->getVerbosity() >= OutputInterface::VERBOSITY_VERBOSE ? '-vvv' : '';

            $results = [];
            foreach (explode("\n", $result) as $row) {
                if (!\preg_match('#[0-9]+#', $row)) continue; # skip table headers etc

                $data = preg_split('#\s+#', trim($row));

                $results[$data[0]] = $data[1];
            }

            if (isset($results['plg_system_joomlatools']) && (\in_array('all', $this->extensions) || \in_array('joomlatools-framework', $this->extensions))) {
                $result = Util::executeJ4CliCommand($this->target_dir, "extension:discover:install $verbosity --eid={$results['plg_system_joomlatools']}");
                
                unset($results['plg_system_joomlatools']);

                $output->writeln("<info>Joomlatools Framework install: $result</info>\n");
            }

            foreach ($results as $extension => $extension_id) {
                if (\in_array('all', $this->extensions) || \in_array(substr($extension, 4), $this->extensions) || \in_array($extension, $this->extensions)) {
                    $result = Util::executeJ4CliCommand($this->target_dir, "extension:discover:install $verbosity --eid=$extension_id", );

                    $output->writeln("<info>$result</info>\n");
                }
            }
            
            return;
        }

        $app = Bootstrapper::getApplication($this->target_dir);
        $db  = \JFactory::getDbo();

        // Output buffer is used as a guard against Joomla including ._ files when searching for adapters
        // See: http://kadin.sdf-us.org/weblog/technology/software/deleting-dot-underscore-files.html
        ob_start();

        $installer = $app->getInstaller();
        $installer->discover();

        require_once JPATH_ADMINISTRATOR . '/components/com_installer/models/discover.php';

        $model = new \InstallerModelDiscover();
        $model->discover();

        // Trigger the populateState() method in the model
        $model->getState('list.limit');
        // then override the default limit to 999
        $model->setState('list.limit', 999);

        $results = $model->getItems();

        ob_end_clean();

        $install = array();
        $plugins = array();

        foreach ($this->extensions as $extension)
        {
            foreach ($results as $result)
            {
                $included = false;

                if (($result->element === 'joomlatools' && $result->type === 'plugin' && $result->folder === 'system')
                    && ($extension == 'all' || $extension == 'joomlatools-framework' || $extension == $result->element)
                )
                {
                    array_unshift($install, $result);
                    $included = true;
                }
                elseif ($extension == 'all' || in_array($extension, array($result->element, substr($result->element, 4))))
                {
                    $install[] = $result;
                    $included  = true;
                }

                if ($result->type == 'plugin' && $included) {
                    $plugins[] = $result->extension_id;
                }

                if ($included && $output->getVerbosity() >= OutputInterface::VERBOSITY_VERBOSE) {
                    $output->writeln("Queued $result->name for installation.");
                }
            }
        }

        foreach ($install as $extension)
        {
            if ($output->getVerbosity() >= OutputInterface::VERBOSITY_VERBOSE) {
                $output->writeln("Installing $extension->element ..");
            }

            try {
                $installer->discover_install($extension->extension_id);
            }
            catch (\Exception $e) {
                $output->writeln("<info>Caught exception whilst installing $extension->type $extension->element: " . $e->getMessage() . "</info>\n");
            }

            if (in_array($extension->extension_id, $plugins))
            {
                if ($output->getVerbosity() >= OutputInterface::VERBOSITY_VERBOSE) {
                    $output->writeln("Enabling plugin `$extension->element` (ID #$extension->extension_id) ..");
                }

                $sql = "UPDATE `#__extensions` SET `enabled` = 1 WHERE `extension_id` = '$extension->extension_id'";

                $db->setQuery($sql);
                $db->execute();

                if ($extension->element === 'joomlatools' && $extension->type === 'plugin' && $extension->folder === 'system')
                {
                    $path = JPATH_PLUGINS . '/system/joomlatools/joomlatools.php';

                    if (!file_exists($path)) {
                        return;
                    }

                    require_once $path;

                    if (class_exists('\PlgSystemJoomlatools'))
                    {
                        $dispatcher = \JEventDispatcher::getInstance();
                        new \PlgSystemJoomlatools($dispatcher, (array)\JPLuginHelper::getPLugin('system', 'joomlatools'));
                    }

                    if ($output->getVerbosity() >= OutputInterface::VERBOSITY_VERBOSE) {
                        $output->writeln("Initialised new PlgSystemJoomlatools instance");
                    }
                }
            }
        }
    }
}<?php
/**
 * @copyright	Copyright (C) 2007 - 2015 Johan Janssens and Timble CVBA. (http://www.timble.net)
 * @license		Mozilla Public License, version 2.0
 * @link		http://github.com/joomlatools/joomlatools-console for the canonical source repository
 */

namespace Joomlatools\Console\Command\Extension\Iterator;

use Joomlatools\Console\Command\Extension\Symlink;
use Joomlatools\Console\Joomla\Util;
use Symfony\Component\Console\Output\OutputInterface;

class Iterator extends \RecursiveIteratorIterator
{
    protected $source;
    protected $target;

    protected $_output;

    /**
     * @param string $source Source dir (usually from an IDE workspace)
     * @param string $target Target dir (usually where a joomla installation resides)
     */
    public function __construct($source, $target)
    {
        $this->source = $source;
        $this->target = $target;

        parent::__construct(new \RecursiveDirectoryIterator($source));
    }

    public function callHasChildren()
    {
        $filename = $this->getFilename();
        if ($filename[0] == '.') {
            return false;
        }

        $source = $this->key();

        $target = str_replace($this->source, '', $source);
        $target = str_replace('/site', '', $target);
        $target = Util::buildTargetPath($target, $this->target);

        if (is_link($target)) {
            unlink($target);
        }

        if (!is_dir($target))
        {
            $this->createLink($source, $target);
            return false;
        }

        return parent::callHasChildren();
    }

    public function createLink($source, $target)
    {
        if (!file_exists($target))
        {
            $source = Symlink::buildSymlinkPath($source, $target);

            if (!is_null($this->_output) && $this->_output->getVerbosity() >= OutputInterface::VERBOSITY_VERBOSE) {
                $this->_output->writeln(" * creating link: `$target` -> `$source`");
            }

            `ln -sf $source $target`;
        }
    }

    public function setOutput(OutputInterface $output)
    {
        $this->_output = $output;
    }
}<?php
/**
 * @copyright    Copyright (C) 2007 - 2015 Johan Janssens and Timble CVBA. (http://www.timble.net)
 * @license        Mozilla Public License, version 2.0
 * @link        http://github.com/joomlatools/joomlatools-console for the canonical source repository
 */

namespace Joomlatools\Console\Command\Extension;

use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

use Joomlatools\Console\Joomla\Bootstrapper;
use Joomlatools\Console\Joomla\Util;

class Register extends AbstractExtension
{
    /**
     * type of extension
     *
     * @var string
     */
    protected $type = '';

    protected function configure()
    {
        parent::configure();

        $this
            ->setName('extension:register')
            ->setDescription('Register an extension with the `#__extensions` table.')
            ->setHelp(<<<EOL
You can register your extension in the extensions table without the need for a complete install package containing a valid XML manifest file.

    <info>joomla extension:register testsite com_foobar</info>

The type of extension that gets registered is based on the first 4 characters of the extension argument you pass in. Example:

* com_ => component
* mod_ => module
* plg_ => plugin (the plg_ will get stripped from the element field)
* lib_ => library
* pkg_ => package
* tpl_ => template (the tpl_ will get stripped from the name and element field)
* lng_ => language

This example registers an extension of the ‘plugin’ type:

    <info>joomla extension:register testsite plg_foobar</info>

You can use naming without the type prefixes by adding a type argument to the end of the command:

    <info>joomla extension:register testsite foobar package</info>

In all cases, if the type is not specified or recognized then the default value, component, will be used.

When registering a plugin type you can use the <comment>--folder</comment> option to specify the plugin group that will get registered with the record. This defaults to <comment>system</comment>. Example:

    <info>joomla extension:register testsite foobar plugin --folder=content</info>

For a language type extension, you should use the <comment>--element</comment> option to ensure your language files can be loaded correctly:

    <info>joomla extension:register testsite spanglish language --element=en-GB</info>

When registering a module type extension, you can use the <comment>--position</comment> option to ensure your module displays where you would like it to. A record gets added to the <comment>#_modules</comment> table:

    <info>joomla extension:register testsite mod_foobar --position=debug</info>
EOL
            )
            ->addArgument(
                'type',
                InputArgument::OPTIONAL,
                'Type of extension being registered.')
            ->addOption(
                'folder',
                null,
                InputOption::VALUE_REQUIRED,
                'Specifically for the Plugin typed extension, default "system"'
            )->addOption(
                'enabled',
                null,
                InputOption::VALUE_OPTIONAL,
                'Enabled or not, default is "1"',
                1
            )->addOption(
                'client_id',
                null,
                InputOption::VALUE_REQUIRED,
                '"0" for Site, "1" for Administrator'
            )->addOption(
                'element',
                null,
                InputOption::VALUE_REQUIRED,
                "Provide the element name for languages"
            )->addOption(
                'position',
                null,
                InputOption::VALUE_REQUIRED,
                "Provide the position the module should appear"
            );
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        parent::execute($input, $output);

        if (Util::isJoomla4($this->target_dir)) {
            $output->write("<error>This command is not implemented for Joomla 4</error>\n");

            return 1;
        }

        $type = false;

        // passed in type argument
        $forceType = $input->getArgument('type');

        // Try to load the type based on naming convention if we aren't passing a 'type' argument
        if (!$forceType)
        {
            $prefix = substr($this->extension, 0, 4);
            $type = isset($this->typeMap[$prefix]) ? $this->typeMap[$prefix] : false;
        }

        // only allow ones that exist.
        if (in_array($forceType, $this->typeMap)) {
            $type = $forceType;
        }

        // set the type.
        if (!$type)
        {
            $output->writeln("<comment>'{$type}' is not allowed as an extension type. Changing to 'component'</comment>");
            $this->type = 'component';
        }
        else $this->type = $type;

        $this->check($input, $output);
        $this->register($input, $output);

        return 0;
    }

    public function register(InputInterface $input, OutputInterface $output)
    {
        $app = Bootstrapper::getApplication($this->target_dir);

        ob_start();

        // build the record.
        $data = new \JObject;
        $data->name = $this->extension;
        $data->type = $this->type;
        $data->element = $this->extension;
        $data->client_id = $input->getOption('client_id');
        $data->enabled = $input->getOption('enabled');
        $data->position = $input->getOption('position');

        $element = $input->getOption('element');
        if(strlen($element)){
            $data->element = $element;
        }

        // special case for plugin, naming and folder.
        if($this->type == 'plugin')
        {
            // set the default folder for plugins only.
            $data->folder = $input->getOption('folder') ? $input->getOption('folder') : 'system';

            // special case for the plugins only.
            if(substr($data->element, 0, 4) == 'plg_') {
                $data->element = substr($data->element, 4);
            }
        }

        if($this->type == 'template')
        {
            if(substr($data->name, 0, 4) == 'tpl_') {
                $data->name = substr($data->name, 4);
                $data->element = substr($data->element, 4);
            }
        }

        //need to be sure that a prefix is provided for components and modules
        if(($this->type == "component" || $this->type == "module") && (strpos($data->element, '_') === false))
        {
            $prefix = array_search($this->type, $this->typeMap);
            $data->element = $prefix . $this->extension;
        }

        // get the #__extensions model and table
        require_once JPATH_ADMINISTRATOR . '/components/com_installer/models/extension.php';

        $model = new \InstallerModel();
        $table = $model->getTable('extension', 'JTable');

        // restrict on same name and type
        $unique = array('name' => $data->name, 'type' => $data->type);

        // does the extension exist?
        if (!$table->load($unique))
        {
            if ($table->save($data->getProperties()))
            {
                if(array_key_exists($this->type, $this->exceptions)){
                    $this->handleExceptions($output, $app, $data, $this->type);
                }

                $output->writeln("<info>Your extension registered as a '{$this->type}', with extension_id: {$table->extension_id}</info>");
            } else {
                $output->writeln("<info>" . $table->getError() . "</info>");
            }
        }
        else $output->writeln("<error>{$this->extension} {$this->type}: That extension already exists.</error>");

        ob_end_clean();
    }

    public function handleExceptions(OutputInterface $output, $app, $data, $extension)
    {
        $data->title = $this->extension;
        $data->published = $data->enabled;

        if($extension == "module"){
            $data->module = $this->extension;
        }

        if($extension == "template")
        {
            $data->template = $this->extension;
            $data->home = 1;
        }

        $exception = $this->exceptions[$this->type];

        foreach($exception['require'] AS $require){
            require_once JPATH_ADMINISTRATOR . $require;
        }

        $model = new $exception['model'];
        $exception_table = $model->getTable($exception['table']['type'], $exception['table']['prefix']);

        if(!$exception_table->save($data->getProperties()))
        {
            $output->writeln("<info>" . $exception_table->getError() . "</info>");
            die();
        }
    }
}<?php
/**
 * @copyright	Copyright (C) 2007 - 2015 Johan Janssens and Timble CVBA. (http://www.timble.net)
 * @license		Mozilla Public License, version 2.0
 * @link		http://github.com/joomlatools/joomlatools-console for the canonical source repository
 */

namespace Joomlatools\Console\Command\Extension;

use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\Output;
use Symfony\Component\Console\Output\OutputInterface;

use Joomlatools\Console\Command\Site\AbstractSite;
use Joomlatools\Console\Command\Extension\Iterator\Iterator;

class Symlink extends AbstractSite
{
    protected $symlink  = array();
    protected $projects = array();

    protected static $_symlinkers   = array();

    protected static $_dependencies = array(
        'joomlatools-pages'     => array('joomlatools-framework'),
        'pages'                 => array('joomlatools-framework'),
        'docman'                => array('joomlatools-framework'),
        'fileman'               => array('joomlatools-framework'),
        'leadman'               => array('joomlatools-framework', 'joomlatools-framework-ckeditor'),
        'logman'                => array('joomlatools-framework'),
        'textman'               => array('joomlatools-framework', 'joomlatools-framework-ckeditor')
    );

    protected static $_relative     = false;

    public static function registerDependencies($project, array $dependencies)
    {
        static::$_dependencies[$project] = $dependencies;
    }

    public static function registerSymlinker($symlinker)
    {
        array_unshift(static::$_symlinkers, $symlinker);
    }

    protected function configure()
    {
        parent::configure();

        $this
            ->setName('extension:symlink')
            ->setDescription('Symlink projects into a site')
            ->setHelp(<<<EOL
This command will symlink the directories from the <comment>--projects-dir</comment> directory into the given site. This is ideal for testing your custom extensions while you are working on them.
Your source code should resemble the Joomla directory structure for symlinking to work well. For example, the directory structure of your component should look like this:

* administrator/components/com_foobar
* components/com_foobar
* media/com_foobar

To symlink <comment>com_foobar</comment> into your tesite:

    <info>joomla extension:symlink testsite com_foobar</info>

You can now use the <comment>extension:register</comment> or <comment>extension:install</comment> commands to make your component available to Joomla.

Note that you can use the <comment>site:create</comment> command to both create a new site and symlink your projects into it using the <comment>--symlink</comment> flag.
EOL
            )
            ->addArgument(
                'symlink',
                InputArgument::REQUIRED | InputArgument::IS_ARRAY,
                'A list of directories to symlink from projects directory. Use \'all\' to symlink every directory.'
            )
            ->addOption(
                'projects-dir',
                null,
                InputOption::VALUE_REQUIRED,
                'Directory where your custom projects reside',
                sprintf('%s/Projects', trim(`echo ~`))
            )
            ->addOption(
                'relative',
                'r',
                InputOption::VALUE_NONE,
                'Use relative paths to the site root instead of absolute paths.'
            );
    }

    protected function initialize(InputInterface $input, OutputInterface $output)
    {
        parent::initialize($input, $output);

        $path = dirname(dirname(dirname(__FILE__))).'/Symlinkers';

        if (file_exists($path))
        {
            foreach (glob($path.'/*.php') as $symlinker) {
                require_once $symlinker;
            }
        }
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        parent::execute($input, $output);

        $this->symlink = $input->getArgument('symlink');

        if (count($this->symlink) == 1 && $this->symlink[0] == 'all')
        {
            $this->symlink = array();
            $source = $input->getOption('projects-dir') . '/*';

            foreach(glob($source, GLOB_ONLYDIR) as $directory) {
                $this->symlink[] = basename($directory);
            }
        }

        $this->projects = array();
        foreach ($this->symlink as $symlink)
        {
            $this->projects[] = $symlink;
            $this->projects   = array_unique(array_merge($this->projects, $this->_getDependencies($symlink)));
        }

        static::$_relative = $input->getOption('relative') === true;

        $this->check($input, $output);
        $this->symlinkProjects($input, $output);

        return 0;
    }

    public function check(InputInterface $input, OutputInterface $output)
    {
        if (!file_exists($this->target_dir)) {
            throw new \RuntimeException(sprintf('Site not found: %s', $this->site));
        }

        $project_dir = $input->getOption('projects-dir');
        foreach ($this->projects as $project)
        {
            $root =  $project_dir . '/' . $project;

            if (!is_dir($root)) {
                throw new \RuntimeException(sprintf('`%s` could not be found in %s', $project, $project_dir));
            }
        }
    }

    public function symlinkProjects(InputInterface $input, OutputInterface $output)
    {
        $project_directory = $input->getOption('projects-dir');

        foreach ($this->projects as $project)
        {
            $result = false;
            $root   = $project_directory.'/'.$project;

            if (!is_dir($root)) {
                continue;
            }

            foreach (static::$_symlinkers as $symlinker)
            {
                $result = call_user_func($symlinker, $root, $this->target_dir, $project, $this->projects, $output);

                if ($result === true) {
                    break;
                }
            }

            if (!$result) {
                $this->_symlink($root, $this->target_dir, $output);
            }
        }
    }

    /**
     * Default symlinker
     *
     * @param $project
     * @param $destination
     * @param $name
     * @param $projects
     * @return bool
     */
    protected function _symlink($project, $destination, OutputInterface $output)
    {
        if (is_dir($project.'/code')) {
            $project .= '/code';
        }

        $iterator = new Iterator($project, $destination);
        $iterator->setOutput($output);

        if ($output->getVerbosity() >= OutputInterface::VERBOSITY_VERBOSE) {
            $output->writeln("Symlinking `$project` into `$destination`");
        }

        while ($iterator->valid()) {
            $iterator->next();
        }

        return true;
    }

    /**
     * Look for the dependencies of the dependency
     *
     * @param  string $project      The directory name of Project
     * @return array                An array of dependencies
     */
    protected function _getDependencies($project)
    {
        $projects     = array();
        $dependencies = static::$_dependencies;

        if(array_key_exists($project, $dependencies) && is_array($dependencies[$project]))
        {
            $projects = $dependencies[$project];

            foreach ($projects as $dependency) {
                $projects = array_merge($projects, $this->_getDependencies($dependency));
            }
        }

        return $projects;
    }

    public static function buildSymlinkPath($source, $target)
    {
        $source = realpath($source);

        if (static::$_relative === true)
        {
            $separator = DIRECTORY_SEPARATOR;
            $from      = is_dir($target) ? $target : dirname($target);

            // In some cases a path that has been concatenated from
            // different strings contains double forward slashes.
            // Make sure to replace these so we don't get incorrect paths:
            $from   = str_replace($separator.$separator, $separator, $from);
            $source = str_replace($separator.$separator, $separator, $source);

            $partsFrom = explode($separator, rtrim($from, $separator));
            $partsTo   = explode($separator, rtrim($source, $separator));

            while(count($partsFrom) && count($partsTo) && ($partsFrom[0] == $partsTo[0]))
            {
                array_shift($partsFrom);
                array_shift($partsTo);
            }

            $prefix = str_repeat(sprintf('..%s', $separator), count($partsFrom));
            $suffix = implode($separator, $partsTo);

            $source = $prefix . $suffix;
        }

        return $source;
    }
}<?php
/**
 * @copyright	Copyright (C) 2007 - 2015 Johan Janssens and Timble CVBA. (http://www.timble.net)
 * @license		Mozilla Public License, version 2.0
 * @link		http://github.com/joomlatools/joomlatools-console for the canonical source repository
 */

namespace Joomlatools\Console\Command\Plugin;

use Joomlatools\Console\Command\Configurable;
use Symfony\Component\Console\Helper\Table;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

use Joomlatools\Console\Joomla\Util;

class ListAll extends Configurable
{
    protected function configure()
    {
        $this->setName('plugin:list')
             ->setDescription('List installed plugins');
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        if (Util::isJoomla4(getcwd() ?: dirname(__FILE__))) {
            $output->write("<error>This command is not implemented for Joomla 4</error>\n");

            return 1;
        }

        $plugins = $this->getApplication()->getPlugins();

        $packages = array_keys($plugins);
        $versions = array_values($plugins);

        $combine = function($a, $b) {
            return array($a, $b);
        };

        $rows = array_map($combine, $packages, $versions);

        $headers = array('Plugin package', 'Version');

        $table = new Table($output);

        $table->setHeaders($headers)
            ->setRows($rows)
            ->render($output);

        return 0;
    }
}<?php
/**
 * @copyright	Copyright (C) 2007 - 2015 Johan Janssens and Timble CVBA. (http://www.timble.net)
 * @license		Mozilla Public License, version 2.0
 * @link		http://github.com/joomlatools/joomlatools-console for the canonical source repository
 */

namespace Joomlatools\Console\Command\Plugin;

use Joomlatools\Console\Command\Configurable;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

use Joomlatools\Console\Joomla\Util;

class Install extends Configurable
{
    protected function configure()
    {
        $this->setName('plugin:install')
             ->setDescription('Install plugin')
            ->setHelp(<<<EOF
You can install plugins into the Joomla Console to add new commands or extend the symlinking logic. Plugins are installed using Composer and must be available on Packagist.
You then pass their package name to this command. In the case of our example, the package name is <comment>joomlatools/console-backup</comment>:

  <info>joomla plugin:install joomlatools/console-backup</info>

You can specify a specific version or branch by appending the version number to the package name. Version constraints follow Composer’s convention:

  <info>joomla plugin:install joomlatools/console-backup:dev-develop</info>

Refer to the online documentation at the following URL on how to write your own plugins: http://developer.joomlatools.com/tools/console/plugins.html#creating-custom-plugins
EOF
            )
             ->addArgument(
                 'package',
                 InputArgument::REQUIRED,
                 'The Composer package name and version. Example: vendor/foo-bar:1.*'
             );
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        if (Util::isJoomla4($this->target_dir)) {
            $output->write("<error>This command is not implemented for Joomla 4</error>\n");

            return;
        }

        $result = shell_exec('command -v composer >/dev/null 2>&1 || { echo "false"; }');

        if (trim($result) == 'false')
        {
            $output->writeln('<error>Composer was not found. It is either not installed or globally available</error>');
            return 99;
        }

        $plugin_path = $this->getApplication()->getPluginPath();

        if (!file_exists($plugin_path)) {
            `mkdir -p $plugin_path`;
        }

        $package = $input->getArgument('package');

        if (strpos($package, ':') === false)
        {
            $name    = $package;
            $version = '';
        }
        else list($name, $version) = explode(':', $package);

        exec("composer show --no-interaction --all $name $version 2>&1", $result, $code);

        if ($code === 1)
        {
            $output->writeln("<error>The $package plugin you are attempting to install cannot be found</error>");
            return 99;
        }

        $type = '';

        foreach ($result as $line => $content)
        {
            $content = trim($content);

            if (strpos($content, 'type') === 0) {
                $parts = explode(':', $content);

                if (count($parts) > 1)
                {
                    $type = trim($parts[1]);
                    break;
                }
            }
        }

        if ($type != 'joomlatools-console-plugin')
        {
            $output->writeln("<comment>$package is not a Joomla console plugin</comment>");
            $output->writeln('<error>Plugin not installed</error>');
            return 99;
        }

        passthru("composer --no-interaction --no-progress --working-dir=$plugin_path require $package");

        return 0;
    }
}
<?php
/**
 * @copyright	Copyright (C) 2007 - 2015 Johan Janssens and Timble CVBA. (http://www.timble.net)
 * @license		Mozilla Public License, version 2.0
 * @link		http://github.com/joomlatools/joomlatools-console for the canonical source repository
 */

namespace Joomlatools\Console\Command\Plugin;

use Joomlatools\Console\Command\Configurable;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

use Joomlatools\Console\Joomla\Util;

class Uninstall extends Configurable
{
    protected function configure()
    {
        $this->setName('plugin:uninstall')
             ->setDescription('Used for uninstalling plugins')
             ->addArgument(
                 'package',
                 InputArgument::REQUIRED,
                 'The composer package containing the plugin to uninstall'
             );
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        if (Util::isJoomla4($this->target_dir)) {
            $output->write("<error>This command is not implemented for Joomla 4</error>\n");

            return;
        }

        $plugins = $this->getApplication()->getPlugins();
        $path    = $this->getApplication()->getPluginPath();

        $package = $input->getArgument('package');

        $result = `command -v composer >/dev/null 2>&1 || { echo >&2 "false"; }`;

        if ($result == 'false')
        {
            $output->writeln('<error>Composer was not found. It is either not installed or globally available.</error>');
            return 99;
        }

        if (!array_key_exists($package, $plugins))
        {
            $output->writeln('<error>Error:</error>The package "' . $package . '" is not installed');
            return 99;
        }

        passthru("composer --no-interaction --working-dir=$path remove $package");

        return 0;
    }
}
<?php
/**
 * @copyright	Copyright (C) 2007 - 2015 Johan Janssens and Timble CVBA. (http://www.timble.net)
 * @license		Mozilla Public License, version 2.0
 * @link		http://github.com/joomlatools/joomlatools-console for the canonical source repository
 */

namespace Joomlatools\Console\Command\Site;

use Joomlatools\Console\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Question;
use Joomlatools\Console\Joomla\Util;

abstract class AbstractSite extends Command\Configurable
{
    protected $site;
    protected $www;

    protected $target_dir;

    protected static $files;

    protected $_config = null;

    protected function configure()
    {
        if (empty(self::$files)) {
            self::$files = Util::getTemplatePath() . '/bin/.files';
        }

        $this->addArgument(
            'site',
            InputArgument::REQUIRED,
            'Alphanumeric site name. Also used in the site URL with .test domain'
        )->addOption(
            'www',
            null,
            InputOption::VALUE_REQUIRED,
            "Web server root",
            '/var/www'
        )
        ->addOption(
            'use-webroot-dir',
            null,
            InputOption::VALUE_NONE,
            "Uses directory specified with --www as the site install dir"
         )
        ;
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $this->site       = $input->getArgument('site');
        $this->www        = $input->getOption('www');

        if ($input->getOption('use-webroot-dir')) {
            $this->target_dir = $this->www;
        } else {
            $this->target_dir = $this->www.'/'.$this->site;
        }

        return 0;
    }

    /**
     * Prompt user to fill in a value
     *
     * @param InputInterface $input
     * @param OutputInterface $output
     * @param $label    string          The description of the value
     * @param $default  string|array    The default value. If array given, question will be multiple-choice and the first item will be default. Can also be empty.
     * @param bool $required
     * @param bool $hidden  Hide user input (useful for passwords)
     *
     * @return string   Answer
     */
    protected function _ask(InputInterface $input, OutputInterface $output, $label, $default = '', $required = false, $hidden = false)
    {
        $helper  = $this->getHelper('question');
        $text    = $label;

        if (is_array($default)) {
            $defaultValue = $default[0];
        }
        else $defaultValue = $default;

        if (!empty($defaultValue)) {
            $text .= ' [default: <info>' . $defaultValue . '</info>]';
        }

        $text .= ': ';

        if (is_array($default)) {
            $question = new Question\ChoiceQuestion($text, $default, 0);
        }
        else $question = new Question\Question($text, $default);

        if ($hidden === true) {
            $question->setHidden(true);
        }

        $answer = $helper->ask($input, $output, $question);

        if ($required && empty($answer)) {
            return $this->_ask($input, $output, $label, $default, $hidden);
        }

        return $answer;
    }
}
<?php
/**
 * @copyright	Copyright (C) 2007 - 2015 Johan Janssens and Timble CVBA. (http://www.timble.net)
 * @license		Mozilla Public License, version 2.0
 * @link		http://github.com/joomlatools/joomlatools-console for the canonical source repository
 */

namespace Joomlatools\Console\Command\Site;

use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Yaml\Yaml;

use Joomlatools\Console\Command\Database\AbstractDatabase;

class Configure extends AbstractDatabase
{
    /**
     * Flag to keep track of whether we still need to
     * prompt the database settings in interactive mode
     *
     * @var bool
     */
    protected $_skip_database_prompt = false;

    /**
     * List of default values
     *
     * @var array
     */
    protected $_default_values = array();

	/**
	 * Additional options read from file
	 *
	 * @var array
	 */
    protected $_extra_options = array();

    protected function configure()
    {
        parent::configure();

        $this
            ->setName('site:configure')
            ->setDescription('Configure a Joomla site')
            ->addOption(
                'overwrite',
                null,
                InputOption::VALUE_NONE,
                'Overwrite configuration.php or .env file if it already exists'
            )
            ->addOption(
                'interactive',
                null,
                InputOption::VALUE_NONE,
                'Prompt for configuration details'
            )
	        ->addOption(
	        	'options',
		        null,
		        InputOption::VALUE_REQUIRED,
		        "A YAML file consisting of serialized parameters to override JConfig"
	        )
        ;
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        parent::execute($input, $output);

        $random = function($length) {
            $charset ='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
            $string  = '';
            $count   = strlen($charset);

            while ($length--) {
                $string .= $charset[mt_rand(0, $count-1)];
            }

            return $string;
        };

        $this->_default_values = array(
            'log_path' => $this->target_dir . '/logs/',
            'tmp_path' => $this->target_dir . '/tmp/',
            'sitename' => $this->site,
            'key'      => $random(16),
            'env'      => 'development'
        );

        if ($input->getOption('interactive')) {
            $this->_promptDetails($input, $output);
        }

        $options = $input->getOption('options');
        if ($options !== null)
        {
            if (!file_exists($options)) {
                throw new \Exception(sprintf('Additional option file \'%s\' does not exist', $options));
            }

            $contents = file_get_contents($options);

            try {
                $this->_extra_options = Yaml::parse($contents);
            }
            catch (\Exception $ex) {
                throw new \Exception(sprintf('Unable to parse YAML file %s', $options));
            }
        }

        $this->check($input, $output);
        $this->_configureJoomlaCMS();

        return 0;
    }

    protected function _configureJoomlaCMS()
    {
        $source = $this->target_dir.'/_installation/configuration.php-dist';
        if (!file_exists($source)) {
            $source = $this->target_dir.'/installation/configuration.php-dist';
        }

        $target   = $this->target_dir.'/configuration.php';

        $contents = file_get_contents($source);
        $replace  = function($name, $value, &$contents) {
            $pattern = sprintf('#\$%s\s*=\s*(["\']?).*?\1(?=[;\1])#', $name);
            $match   = preg_match($pattern, $contents);
            $value   = is_numeric($value) ? $value : "'" . str_replace("'", "\\'", $value) . "'";

            if(!$match)
            {
                $pattern 	 = "/^\s*}\s*$/m";
                $replacement = sprintf("\tpublic \$%s = %s;\n}", $name, $value);
            }
            else $replacement = sprintf("\$%s = %s", $name, $value);

            $contents = preg_replace($pattern, $replacement, $contents);
        };
        $remove   = function($name, &$contents) {
            $pattern  = sprintf('#public\s+\$%s\s*=\s*(["\']?).*?\1(?=[;\1])\s*;#', $name);
            $contents = preg_replace($pattern, '', $contents);
        };

        $replacements = array(
            'db'        => $this->target_db,
            'user'      => $this->mysql->user,
            'password'  => $this->mysql->password,
            'host'      => $this->mysql->host,
            'dbprefix'  => 'j_',
            'dbtype'    => $this->mysql->driver,

            'mailer'   => 'smtp',
            'mailfrom' => 'admin@example.com',
            'fromname' => $this->site,
            'smtpauth' => '0',
            'smtpuser' => '',
            'smtppass' => '',
            'smtphost' => 'localhost',
            'smtpsecure' => 'none',
            'smtpport' => '1025',

            'sef'       => '1',
            'sef_rewrite'   => '1',
            'unicodeslugs'  => '1',

            'debug'     => '1',
            'lifetime'  => '600',
            'tmp_path'  => $this->_default_values['tmp_path'],
            'log_path'  => $this->_default_values['log_path'],
            'sitename'  => $this->_default_values['sitename'],

            'secret'    => $this->_default_values['key']
        );

	    if ($this->mysql->port != $this->getDefaultPort()) {
	    	$replacements['host'] .= ':' . $this->mysql->port;
        }

        $configuration = array_merge($replacements, $this->_extra_options);
        foreach($configuration as $key => $value) {
            $replace($key, $value, $contents);
        }

        $remove('root_user', $contents);

        file_put_contents($target, $contents);
        chmod($target, 0664);

        if (file_exists($this->target_dir.'/installation')) {
            `mv $this->target_dir/installation $this->target_dir/_installation`;
        }
    }

	/**
	 * Get default port for MySQL
	 *
	 * @return string
	 */
    protected function getDefaultPort()
    {
	    $driver = $this->mysql->driver;
	    $key    = $driver . '.default_port';
	    $port   = ini_get($key);

	    if ($port) {
	    	return $port;
	    }

	    return ini_get('mysqli.default_port');
    }

    public function check(InputInterface $input, OutputInterface $output)
    {
        if (!file_exists($this->target_dir)) {
            throw new \RuntimeException(sprintf('Site %s not found', $this->site));
        }

        if (!$input->getOption('overwrite'))
        {
            $file = 'configuration.php';

            if (file_exists($this->target_dir . '/' . $file)) {
                throw new \RuntimeException(sprintf('Site %s is already configured', $this->site));
            }
        }
    }

    /**
     * Tell the object to skip the database prompts
     * in interactive mode or not.
     *
     * @param $value bool
     */
    public function skipDatabasePrompt($value = true)
    {
        $this->_skip_database_prompt = $value;
    }

    protected function _promptDetails(InputInterface $input, OutputInterface $output)
    {
        if (!$this->_skip_database_prompt) {
            $this->_promptDatabaseDetails($input, $output);
        }

        $this->_default_values['sitename'] = $this->_ask($input, $output, 'Site Name', $this->_default_values['sitename'], true);

        $this->_default_values['tmp_path'] = $this->_ask($input, $output, 'Temporary path', $this->_default_values['tmp_path'], true);
        $this->_default_values['log_path'] = $this->_ask($input, $output, 'Log path', $this->_default_values['log_path'], true);
        $this->_default_values['key']      = $this->_ask($input, $output, 'Secret Key', $this->_default_values['key'], true);
    }
}
<?php
/**
 * @copyright	Copyright (C) 2007 - 2015 Johan Janssens and Timble CVBA. (http://www.timble.net)
 * @license		Mozilla Public License, version 2.0
 * @link		http://github.com/joomlatools/joomlatools-console for the canonical source repository
 */

namespace Joomlatools\Console\Command\Site;

use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

use Joomlatools\Console\Command\Database;
use Joomlatools\Console\Command\Vhost;

class Create extends Database\AbstractDatabase
{
    /**
     * Clear cache before fetching versions
     *
     * @var bool
     */
    protected $clear_cache = false;

    /**
     * Joomla version to install
     *
     * @var string
     */
    protected $version;

    protected function configure()
    {
        parent::configure();

        $this
            ->setName('site:create')
            ->setDescription('Create a new Joomla site from scratch')
            ->setHelp(<<<EOF
To create a site with the latest Joomla version, run:

    <info>joomla site:create foobar</info>

The newly installed site will be available at <comment>/var/www/foobar</comment> and <comment>foobar.test</comment> after that. You can login into your fresh Joomla installation using these credentials: admin/admin.
By default, the web server root is set to <comment>/var/www</comment>. You can pass <comment>–www=/my/server/path</comment> to commands for custom values.

You can choose the Joomla version or the sample data to be installed. A more elaborate example:

    <info>joomla site:create testsite --release=2.5 --sample-data=blog</info>
EOF
    )
            ->addOption(
                'release',
                null,
                InputOption::VALUE_REQUIRED,
                "Joomla version. Can be a release number (2, 3.2, ..) or branch name. Run `joomla versions` for a full list.\nUse \"none\" for an empty virtual host.",
                'latest'
            )
            ->addOption(
                'sample-data',
                null,
                InputOption::VALUE_REQUIRED,
                'Sample data to install (default|blog|brochure|learn|testing)'
            )
            ->addOption(
                'symlink',
                null,
                InputOption::VALUE_REQUIRED,
                'A comma separated list of directories to symlink from the projects directory. Use \'all\' to symlink every folder.'
            )
            ->addOption(
                'repo',
                null,
                InputOption::VALUE_REQUIRED,
                'Alternative Git repository to use. Also accepts a gzipped tar archive instead of a Git repository.'
            )
            ->addOption(
                'clear-cache',
                null,
                InputOption::VALUE_NONE,
                'Update the list of available tags and branches from the Joomla repository'
            )
            ->addOption(
                'projects-dir',
                null,
                InputOption::VALUE_REQUIRED,
                'Directory where your custom projects reside',
                sprintf('%s/Projects', trim(`echo ~`))
            )
            ->addOption(
                'http-port',
                null,
                InputOption::VALUE_REQUIRED,
                'The HTTP port the virtual host should listen to',
                80
            )
            ->addOption(
                'ssl-port',
                null,
                InputOption::VALUE_REQUIRED,
                'The port on which the server will listen for SSL requests',
                443
            )
            ->addOption(
                'interactive',
                null,
                InputOption::VALUE_NONE,
                'Prompt for configuration details'
            )
            ->addOption(
                'options',
                null,
                InputOption::VALUE_REQUIRED,
                "A YAML file consisting of serialized parameters to override JConfig."
            )
            ->addOption(
                'clone',
                null,
                InputOption::VALUE_OPTIONAL,
                'Clone the Git repository instead of creating a copy in the target directory. Use --clone=shallow for a shallow clone or leave empty.',
                true
            )
            ->addOption(
                'skip-create-statement',
                null,
                InputOption::VALUE_NONE,
                'Do not run the "CREATE IF NOT EXISTS <db>" query. Use this if the user does not have CREATE privileges on the database.'
            )
            ->addOption(
                'vhost', 
                null,
                InputOption::VALUE_NEGATABLE,
                'Create an Apache vhost for the site',
                true
            )
            ->addOption(
                'vhost-template',
                null,
                InputOption::VALUE_REQUIRED,
                'Custom file to use as the Apache vhost configuration. Make sure to include HTTP and SSL directives if you need both.',
                null
            )
            ->addOption(
                'vhost-folder',
                null,
                InputOption::VALUE_REQUIRED,
                'The Apache2 vhost folder',
                null
            )
            ->addOption(
                'vhost-filename',
                null,
                InputOption::VALUE_OPTIONAL,
                'The Apache2 vhost file name',
                null,
            )
            ->addOption(
                'vhost-restart-command',
                null,
                InputOption::VALUE_OPTIONAL,
                'The full command for restarting Apache2',
                null
            )
            ->addOption(
                'chown',
                null,
                InputOption::VALUE_OPTIONAL,
                'Change file owner as the passed user'
            )
            ;
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        parent::execute($input, $output);

        $this->version = $input->getOption('release');

        $this->check($input, $output);

        $this->download($input, $output);

        if ($input->getOption('vhost')) {
            $this->addVirtualHost($input, $output);
        }

        if (!file_exists($this->target_dir)) {
            `mkdir -p $this->target_dir`;
        }

        if ($this->version != 'none')
        {
            $arguments = array(
                'site:install',
                'site'   => $this->site,
                '--www'  => $this->www
            );

            $optionalArgs = array('sample-data', 'symlink', 'projects-dir', 'interactive', 'mysql-login', 'mysql-db-prefix', 'mysql-host', 'mysql-port', 'mysql-database', 'options', 'skip-create-statement', 'use-webroot-dir');
            foreach ($optionalArgs as $optionalArg)
            {
                $value = $input->getOption($optionalArg);
                if (!empty($value)) {
                    $arguments['--' . $optionalArg] = $value;
                }
            }

            $command = new Install();
            $command->setApplication($this->getApplication());
            $command->run(new ArrayInput($arguments), $output);
        }

        if ($input->hasOption('chown')) {
            $user = $input->getOption('chown');
            `chown -R $user:$user $this->target_dir`;
        }

        /*
         * Run all site:create:* commands after site creation
         */
        try {
            $commands = $this->getApplication()->all('site:create');
            
            foreach ($commands as $command) {
                $arguments = array(
                    $command->getName(),
                    'site'   => $this->site,
                    '--www'  => $this->www
                );
                $command->setApplication($this->getApplication());
                $command->run(new ArrayInput($arguments), $output);
            }
        }
        catch (\Symfony\Component\Console\Exception\NamespaceNotFoundException $e) {}
        catch (\Symfony\Component\Console\Exception\CommandNotFoundException $e) {}
        

        return 0;
    }

    public function check(InputInterface $input, OutputInterface $output)
    {
        if (file_exists($this->target_dir) && !is_dir($this->target_dir)) {
            throw new \RuntimeException(sprintf('A file named \'%s\' already exists', $this->site));
        }

        if (is_dir($this->target_dir) && count(scandir($this->target_dir)) > 2) {
            throw new \RuntimeException(sprintf('Site directory \'%s\' is not empty.', $this->site));
        }
    }

    public function download(InputInterface $input, OutputInterface $output)
    {
        $arguments = array(
            'site:download',
            'site'          => $this->site,
            '--release'     => $input->getOption('release'),
            '--clear-cache' => $input->getOption('clear-cache'),
            '--www'         => $this->www,
            '--use-webroot-dir' => $input->getOption('use-webroot-dir')
        );

        if ($input->hasParameterOption('--clone')) {
            $arguments['--clone'] = $input->getOption('clone');
        }

        $repo = $input->getOption('repo');
        if (!empty($repo)) {
            $arguments['--repo'] = $repo;
        }

        $command = new Download();
        $command->run(new ArrayInput($arguments), $output);
    }

    public function addVirtualHost(InputInterface $input, OutputInterface $output)
    {
        $command_input = array(
            'vhost:create',
            'site'          => $this->site,
            '--http-port'   => $input->getOption('http-port'),
            '--ssl-port'    => $input->getOption('ssl-port'),
            '--www'         => $input->getOption('www'),
            '--use-webroot-dir' => $input->getOption('use-webroot-dir'),
        );

        foreach (array('template', 'folder', 'filename', 'restart-command') as $vhostkey) {
            if ($input->getOption('vhost-'.$vhostkey) !== null) {
                $command_input['--'.$vhostkey] = $input->getOption('vhost-'.$vhostkey);
            }
        }

        $command = new Vhost\Create();
        $command->run(new ArrayInput($command_input), $output);
    }
}
<?php
/**
 * @copyright	Copyright (C) 2007 - 2015 Johan Janssens and Timble CVBA. (http://www.timble.net)
 * @license		Mozilla Public License, version 2.0
 * @link		http://github.com/joomlatools/joomlatools-console for the canonical source repository
 */

namespace Joomlatools\Console\Command\Site;

use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Output\OutputInterface;

use Joomlatools\Console\Command\Database;
use Joomlatools\Console\Command\Vhost;

class Delete extends Database\AbstractDatabase
{
    protected function configure()
    {
        parent::configure();

        $this
            ->setName('site:delete')
            ->setDescription('Delete a site')
            ->addOption(
                'skip-database',
                null,
                InputOption::VALUE_NONE,
                'Leave the database intact'
            )
            ->addOption(
                'skip-vhost',
                null,
                InputOption::VALUE_NONE,
                'Leave the virtual host intact'
            )
        ;
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        parent::execute($input, $output);

        $this->check($input, $output);
        $this->deleteDirectory($input, $output);
        $this->deleteVirtualHost($input, $output);
        $this->deleteDatabase($input, $output);

        return 0;
    }

    public function check(InputInterface $input, OutputInterface $output)
    {
        if (getcwd() === $this->target_dir && getcwd() !== $this->www) {
            throw new \RuntimeException('You are currently in the directory you are trying to delete. Aborting');
        }
    }

    public function deleteDirectory(InputInterface $input, OutputInterface $output)
    {
        `rm -rf $this->target_dir`;
    }

    public function deleteDatabase(InputInterface $input, OutputInterface $output)
    {
        if ($input->getOption('skip-database')) {
            return;
        }

        $arguments = array(
            'database:drop',
            'site' => $this->site
        );

        $optionalArgs = array('mysql-login', 'mysql-db-prefix', 'mysql-host', 'mysql-port', 'mysql-database');
        foreach ($optionalArgs as $optionalArg)
        {
            $value = $input->getOption($optionalArg);
            if (!empty($value)) {
                $arguments['--' . $optionalArg] = $value;
            }
        }

        $command = new Database\Drop();
        $command->run(new ArrayInput($arguments), $output);
    }

    public function deleteVirtualHost(InputInterface $input, OutputInterface $output)
    {
        if ($input->getOption('skip-vhost')) {
            return;
        }

        $command_input = new ArrayInput(array(
            'vhost:remove',
            'site' => $this->site
        ));

        $command = new Vhost\Remove();
        $command->run($command_input, $output);
    }
}
<?php
/**
 * Joomlatools Console backup plugin - https://github.com/joomlatools/joomlatools-console-backup
 *
 * @copyright	Copyright (C) 2011 - 2013 Johan Janssens and Timble CVBA. (http://www.timble.net)
 * @license		GNU GPLv3 <http://www.gnu.org/licenses/gpl.html>
 * @link		http://github.com/joomlatools/joomlatools-console-backup for the canonical source repository
 */

namespace Joomlatools\Console\Command\Site;

use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

use Joomlatools\Console\Command\Database\AbstractDatabase;

/**
 * Backup plugin class.
 *
 * @author  Steven Rombauts <https://github.com/stevenrombauts>
 * @package Joomlatools\Console
 */
class Export extends AbstractDatabase
{
    protected function configure()
    {
        parent::configure();

        $this->setName('site:export')
            ->addOption(
                'folder',
                null,
                InputOption::VALUE_REQUIRED,
                "Target folder where the backup should be stored. Defaults to site folder",
                null
            )
            ->addOption(
                'filename',
                null,
                InputOption::VALUE_REQUIRED,
                "File name for the backup. Defaults to sitename_date.format",
                null
            )
            ->addOption(
                'include-database',
                null,
                InputOption::VALUE_NEGATABLE,
                'Includes the database contents in the backup',
                true
            )
            ->setDescription('Export site files and database');
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        parent::execute($input, $output);

        $this->check();

        $dbPath = $this->target_dir.'/database.sql';

        if ($input->getOption('include-database')) {
            $this->_backupDatabase($dbPath);
        }

        $this->backupFiles($input, $output); 

        if ($input->getOption('include-database') && \is_file($dbPath)) {
            \unlink($dbPath);
        }

        return 0;
    }

    public function backupFiles(InputInterface $input, OutputInterface $output)
    {
        $path = $input->getOption('folder') ?? $this->target_dir;
        $path .= '/'.($input->getOption('filename') ?? $this->site.'_export_'.date('Y-m-d').'.tar.gz');

        if (\is_file($path)) {
            \unlink($path);
        }

        exec(sprintf("cd %s && tar -czvf %s *", $this->target_dir, $path));
    }

    public function check()
    {
        if (!file_exists($this->target_dir)) {
            throw new \RuntimeException(sprintf('The site %s does not exist', $this->site));
        }
    }
}<?php
/**
 * @copyright	Copyright (C) 2007 - 2015 Johan Janssens and Timble CVBA. (http://www.timble.net)
 * @license		Mozilla Public License, version 2.0
 * @link		http://github.com/joomlatools/joomlatools-console for the canonical source repository
 */

namespace Joomlatools\Console\Command\Site;

use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

use Joomlatools\Console\Command;
use Joomlatools\Console\Command\Database;

class Install extends Database\AbstractDatabase
{
    /**
     * Projects to symlink
     *
     * @var array
     */
    protected $symlink = array();

    protected function configure()
    {
        parent::configure();

        $this
            ->setName('site:install')
            ->setDescription('Install an existing Joomla codebase. Sets up configuration and installs the database.')
            ->addOption(
                'sample-data',
                null,
                InputOption::VALUE_REQUIRED,
                'Sample data to install (default|blog|brochure|learn|testing)'
            )
            ->addOption(
                'overwrite',
                null,
                InputOption::VALUE_NONE,
                'Overwrite configuration.php if it already exists'
            )
            ->addOption(
                'drop',
                'd',
                InputOption::VALUE_NONE,
                'Drop database if it already exists'
            )
            ->addOption(
                'symlink',
                null,
                InputOption::VALUE_REQUIRED,
                'A comma separated list of directories to symlink from the projects directory. Use \'all\' to symlink every folder.'
            )
            ->addOption(
                'projects-dir',
                null,
                InputOption::VALUE_REQUIRED,
                'Directory where your custom projects reside',
                sprintf('%s/Projects', trim(`echo ~`))
            )
            ->addOption(
                'interactive',
                null,
                InputOption::VALUE_NONE,
                'Prompt for configuration details'
            )
            ->addOption(
                'skip-exists-check',
                'e',
                InputOption::VALUE_NONE,
                'Do not check if database already exists or not.'
            )
            ->addOption(
                'skip-create-statement',
                null,
                InputOption::VALUE_NONE,
                'Do not run the "CREATE IF NOT EXISTS <db>" query. Use this if the user does not have CREATE privileges on the database.'
            )
            ->addOption(
                'options',
                null,
                InputOption::VALUE_REQUIRED,
                "A YAML file consisting of serialized parameters to override JConfig."
            );
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        parent::execute($input, $output);

        if ($input->getOption('interactive')) {
            $this->_promptDatabaseDetails($input, $output);
        }

        $this->symlink = $input->getOption('symlink');
        if (is_string($this->symlink)) {
            $this->symlink = explode(',', $this->symlink);
        }

        $this->check($input, $output);

        $this->importdb($input, $output);

        $this->createConfig($input, $output);

        if ($this->symlink)
        {
            $this->symlinkProjects($input, $output);
            $this->installExtensions($input, $output);
        }

        $output->writeln("Your new Joomla site has been created.");
        $output->writeln("It was installed using the domain name <info>$this->site.test</info>.");
        $output->writeln("You can login using the following username and password combination: <info>admin</info>/<info>admin</info>.");


        return 0;
    }

    public function check(InputInterface $input, OutputInterface $output)
    {
        if (!file_exists($this->target_dir)) {
            throw new \RuntimeException(sprintf('The site %s does not exist!', $this->site));
        }
    }

    public function importdb(InputInterface $input, OutputInterface $output)
    {
        $arguments = array(
            'site:database:install',
            'site'   => $this->site,
            '--www'  => $this->www
        );

        $optionalArgs = array('sample-data', 'drop', 'mysql-login', 'mysql-db-prefix', 'mysql-host', 'mysql-port', 'mysql-database', 'skip-exists-check', 'skip-create-statement', 'www', 'use-webroot-dir');
        foreach ($optionalArgs as $optionalArg)
        {
            $value = $input->getOption($optionalArg);
            if (!empty($value)) {
                $arguments['--' . $optionalArg] = $value;
            }
        }

        if ($input->getOption('interactive')) {
            $arguments['--skip-exists-check'] = true;
        }

        $command = new Database\Install();
        $command->run(new ArrayInput($arguments), $output);
    }

    public function createConfig(InputInterface $input, OutputInterface $output)
    {
        $arguments = array(
            'site:configure',
            'site'   => $this->site,
            '--www'  => $this->www
        );

        $optionalArgs = array('overwrite', 'mysql-login', 'mysql-db-prefix', 'mysql-host', 'mysql-port', 'mysql-database', 'mysql-driver', 'interactive', 'options', 'www', 'use-webroot-dir');
        foreach ($optionalArgs as $optionalArg)
        {
            $value = $input->getOption($optionalArg);
            if (!empty($value)) {
                $arguments['--' . $optionalArg] = $value;
            }
        }

        $command = new Configure();
        $command->setApplication($this->getApplication());
        $command->skipDatabasePrompt();
        $command->run(new ArrayInput($arguments), $output);
    }

    public function symlinkProjects(InputInterface $input, OutputInterface $output)
    {
        $symlink_input = new ArrayInput(array(
            'site:symlink',
            'site'    => $input->getArgument('site'),
            'symlink' => $this->symlink,
            '--www'   => $this->www,
            '--projects-dir' => $input->getOption('projects-dir')
        ));
        $symlink = new Command\Extension\Symlink();

        $symlink->run($symlink_input, $output);
    }

    public function installExtensions(InputInterface $input, OutputInterface $output)
    {
        $extension_input = new ArrayInput(array(
            'extension:install',
            'site'      => $input->getArgument('site'),
            'extension' => $this->symlink,
            '--www'     => $this->www
        ));
        $installer = new Command\Extension\Install();

        $installer->run($extension_input, $output);
    }
}
<?php
/**
 * @copyright	Copyright (C) 2007 - 2016 Johan Janssens and Timble CVBA. (http://www.timble.net)
 * @license		Mozilla Public License, version 2.0
 * @link		http://github.com/joomlatools/joomlatools-console for the canonical source repository
 */

namespace Joomlatools\Console\Command\Site;

use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

use Joomlatools\Console\Command\Database;
use Joomlatools\Console\Joomla\Util;

class Listing extends Database\AbstractDatabase
{
    protected function configure()
    {
        $this
            ->setName('site:list')
            ->setDescription('List Joomla sites')
            ->addOption(
                'format',
                null,
                InputOption::VALUE_OPTIONAL,
                'The output format (txt or json)',
                'txt'
            )
            ->addOption(
                'www',
                null,
                InputOption::VALUE_REQUIRED,
                "Web server root",
                '/var/www'
            )
            ->setHelp('List Joomla sites running on this server');
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        define('_JEXEC', true);
        define('JPATH_BASE', true);
        define('JPATH_PLATFORM', true);

        $docroot = $input->getOption('www');

        if (!file_exists($docroot)) {
            throw new \RuntimeException(sprintf('Web server root \'%s\' does not exist.', $docroot));
        }

        $dir = new \DirectoryIterator($docroot);
        $sites = array();

        foreach ($dir as $fileinfo)
        {
            if ($fileinfo->isDir() && !$fileinfo->isDot())
            {
                $version = Util::getJoomlaVersion($fileinfo->getPathname());

                if ($version !== false)
                {
                    $sites[] = (object) array(
                        'name'    => $fileinfo->getFilename(),
                        'docroot' => $docroot . '/' . $fileinfo->getFilename() . '/',
                        'version' => $version->release
                    );
                }
            }
        }

        if (!in_array($input->getOption('format'), array('txt', 'json'))) {
            throw new \InvalidArgumentException(sprintf('Unsupported format "%s".', $input->getOption('format')));
        }

        switch ($input->getOption('format'))
        {
            case 'json':
                $result = new \stdClass();
                $result->command = $input->getArgument('command');
                $result->data    = $sites;

                $options = (version_compare(PHP_VERSION,'5.4.0') >= 0 ? JSON_PRETTY_PRINT : 0);
                $string  = json_encode($result, $options);
                break;
            case 'txt':
            default:
                $lines = array();
                foreach ($sites as $i => $site) {
                    $lines[] = sprintf("<info>%s. %s</info> (%s)", ($i+1), $site->name, $site->version);
                }

                $string = implode("\n", $lines);
                break;
        }

        $output->writeln($string);

        return 0;
    }
}<?php
/**
 * @copyright	Copyright (C) 2007 - 2015 Johan Janssens and Timble CVBA. (http://www.timble.net)
 * @license		Mozilla Public License, version 2.0
 * @link		http://github.com/joomlatools/joomlatools-console for the canonical source repository
 */

namespace Joomlatools\Console\Command\Site;

use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

use Joomlatools\Console\Command\Versions;
use Joomlatools\Console\Joomla\Util;

class Download extends AbstractSite
{
    /**
     * Joomla version to install
     *
     * @var string
     */
    protected $version;

    /**
     * Available Joomla versions
     *
     * @var Versions
     */
    protected $versions;

    /**
     * @var OutputInterface
     */
    protected $output = null;

    /**
     * @var InputInterface
     */
    protected $input = null;

    protected function configure()
    {
        parent::configure();

        $this
            ->setName('site:download')
            ->setDescription('Download and extract the given Joomla version')
            ->addOption(
                'release',
                null,
                InputOption::VALUE_REQUIRED,
                "Joomla version. Can be a release number (2, 3.2, ..) or branch name. Run `joomla versions` for a full list.\nUse \"none\" for an empty virtual host.",
                'latest'
            )
            ->addOption(
                'refresh',
                null,
                InputOption::VALUE_NONE,
                'Update the list of available tags and branches from the Joomla repository'
            )
            ->addOption(
                'clear-cache',
                null,
                InputOption::VALUE_NONE,
                'Clear the downloaded files cache'
            )
            ->addOption(
                'repo',
                null,
                InputOption::VALUE_REQUIRED,
                'Alternative Git repository to clone. Also accepts a gzipped tar archive instead of a Git repository.'
            )
            ->addOption(
                'clone',
                null,
                InputOption::VALUE_OPTIONAL,
                'Clone the Git repository instead of creating a copy in the target directory. Use --clone=shallow for a shallow clone or leave empty.',
                true
            )
            ->addOption(
                'chown',
                null,
                InputOption::VALUE_OPTIONAL,
                'Change file owner as the passed user'
            )
        ;
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $this->output = $output;
        $this->input  = $input;

        parent::execute($input, $output);

        $this->check($input, $output);

        $this->versions = new Versions();

        $repo = $input->getOption('repo');

        if (empty($repo)) {
            $repo = Versions::REPO_JOOMLA_CMS;
        }

        $this->versions->setRepository($repo);

        if ($input->getOption('refresh')) {
            $this->versions->refresh();
        }

        if ($input->getOption('clear-cache')) {
            $this->versions->clearcache($output);
        }

        $this->setVersion($input->getOption('release'));

        if (strtolower($this->version) == 'none') {
            return 0;
        }

        if ($input->hasParameterOption('--clone')) {
            $this->_setupClone();
        }
        else $this->_setupCopy();


        $directory = $this->target_dir;
        if (file_exists($directory.'/htaccess.txt')) {
            `cp $directory/htaccess.txt $directory/.htaccess`;
        }

        return 0;
    }

    public function check(InputInterface $input, OutputInterface $output)
    {
        if (count(glob("$this->target_dir/*", GLOB_NOSORT)) !== 0) {
            throw new \RuntimeException(sprintf('Target directory %s is not empty', $this->target_dir));
        }
    }

    public function setVersion($version)
    {
        if (!$this->versions->isGitRepository())
        {
            $this->version = 'current';
            return;
        }

        if ($version == 'none')
        {
            $this->version = $version;
            return;
        }

        $result = strtolower($version);

        if (strtolower($version) === 'latest') {
            $result = $this->versions->getLatestRelease();
        }
        else
        {
            $length = strlen($version);
            $format = is_numeric($version) || preg_match('/^v?\d(\.\d+)?$/im', $version);

            if (substr($version, 0, 1) == 'v') {
                $length--;
            }

            if ( ($length == 1 || $length == 3) && $format)
            {
                $result = $this->versions->getLatestRelease($version);

                if($result == '0.0.0') {
                    $result = $version.($length == 1 ? '.0.0' : '.0');
                }
            }
        }

        if (!$this->versions->isBranch($result))
        {
            $isTag = $this->versions->isTag($result);

            if (!$isTag)
            {
                $original = $result;
                if (substr($original, 0, 1) == 'v') {
                    $result = substr($original, 1);
                }
                else $result = 'v' . $original;

                if (!$this->versions->isTag($result)) {
                    throw new \RuntimeException(sprintf('Failed to find tag or branch "%s". Please refresh the version list first: `joomla versions --refresh`', $original));
                }
            }
        }

        $this->version = $result;
    }

    protected function _setupCopy()
    {
        $tarball = $this->_getTarball();

        if (!$this->_isValidTarball($tarball))
        {
            if (file_exists($tarball)) {
                unlink($tarball);
            }

            throw new \RuntimeException(sprintf('Downloaded tar archive "%s" could not be verified. A common cause is an interrupted download: check your internet connection and try again.', basename($tarball)));
        }

        if (!file_exists($this->target_dir)) {
            `mkdir -p $this->target_dir`;
        }

        if (!$this->versions->isBranch($this->version) && \version_compare($this->version, '4.0.0', '>=')) {
            `cd $this->target_dir; tar xzf $tarball`;    
        } else {
            `cd $this->target_dir; tar xzf $tarball --strip 1`;
        }

        if ($this->versions->isBranch($this->version)) {
            unlink($tarball);
        }
    }

    protected function _setupClone()
    {
        if (!$this->versions->isGitRepository()) {
            throw new \RuntimeException(sprintf('The --clone flag requires a valid Git repository'));
        }

        $this->_clone($this->target_dir, $this->version);
    }

    protected function _getTarball()
    {
        $tar   = $this->version.'.tar.gz';
        // Replace forward slashes with a dash, otherwise the path looks like it contains more subdirectories
        $tar = str_replace('/', '-', $tar);

        $cache = $this->versions->getCacheDirectory().'/'.$tar;

        $repository = $this->versions->getRepository();

        if ($this->versions->isGitRepository())
        {

            if (file_exists($cache) && !$this->versions->isBranch($this->version)) {
                return $cache;
            }

            if ($repository === 'https://github.com/joomla/joomla-cms' && !$this->versions->isBranch($this->version)
                && \version_compare($this->version, '4.0.0', '>=')) {
                $result = $this->_downloadJoomlaRelease($cache);           
            } else {
                $scheme    = strtolower(parse_url($repository, PHP_URL_SCHEME));
                $isGitHub  = strtolower(parse_url($repository, PHP_URL_HOST)) == 'github.com';
                $extension = substr($repository, -4);
    
                if (in_array($scheme, array('http', 'https')) && $isGitHub && $extension != '.git') {
                    $result = $this->_downloadFromGitHub($cache);
                }
                else
                {
                    $directory = $this->versions->getCacheDirectory() . '/source';
    
                    if ($this->_clone($directory)) {
                        $result = $this->_archive($directory, $cache);
                    }
                }
            }
        }
        else $result = $this->_download($cache);

        if (!$result) {
            throw new \RuntimeException(sprintf('Failed to download source files for Joomla %s', $this->version));
        }

        return $cache;
    }

    protected function _downloadJoomlaRelease($target)
    {
		$url = $this->versions->getRepository();

        $url .= "/releases/download/{$this->version}/Joomla_{$this->version}-Stable-Full_Package.tar.gz";
        
        $this->output->writeln("<info>Downloading $url - this could take a few minutes ..</info>");

        $opts = array(
            'http' => array('method' => 'GET',
            'max_redirects' => '20')
        );
     
     $context = stream_context_create($opts);
        $bytes = file_put_contents($target, fopen($url, 'r', false, $context));

        return (bool) $bytes;
    }

    /**
     * Downloads codebase from GitHub via HTTP
     *
     * @param $target
     * @return bool
     */
    protected function _downloadFromGitHub($target)
    {
		$url = $this->versions->getRepository();

        if ($this->versions->isBranch($this->version)) {
            $url .= '/tarball/' . $this->version;
        }
        else $url .= '/archive/'.$this->version.'.tar.gz';

        $this->output->writeln("<info>Downloading $url - this could take a few minutes ..</info>");

        $bytes = file_put_contents($target, fopen($url, 'r'));

        return (bool) $bytes;
    }

    /**
     * Downloads codebase via HTTP
     *
     * @param $target
     * @return bool
     */
    protected function _download($target)
    {
        $url  = $this->versions->getRepository();

        $this->output->writeln("<info>Downloading $url - this could take a few minutes ..</info>");

        $bytes = file_put_contents($target, fopen($url, 'r'));

        return (bool) $bytes;
    }

    /**
     * Clone Git repository to $target directory
     *
     * @param $target Target directory
     * @param $tag    Tag or branch to check out
     * @return bool
     */
    protected function _clone($directory, $tag = false)
    {
        $repository = $this->versions->getRepository();

        if (!file_exists($directory))
        {
            $this->output->writeln("<info>Cloning $repository - this could take a few minutes ..</info>");

            $option = strtolower($this->input->getOption('clone'));
            $args   = $option == 'shallow' ? '--depth 1' : '';

            if (is_string($tag)) {
                $args .= sprintf(' --branch %s', escapeshellarg($tag));
            }

            $command = sprintf("git clone %s --recursive %s %s", $args, escapeshellarg($repository), escapeshellarg($directory));

            exec($command, $result, $exit_code);

            if ($exit_code > 0) {
                return false;
            }
        }

        if ($this->versions->isBranch($this->version))
        {
            $this->output->writeln("<info>Fetching latest changes from $repository - this could take a few minutes ..</info>");

            exec(sprintf("git --git-dir %s fetch", escapeshellarg("$directory/.git")), $result, $exit_code);

            if ($exit_code > 0) {
                return false;
            }
        }
        
        return true;
    }

    /**
     * Create tarball from cloned Git repository.
     *
     * @param $source   Git repository
     * @param $filename Output filename
     * @return bool
     */
    protected function _archive($source, $filename)
    {
        $repository = $this->versions->getRepository();

        $this->output->writeln("<info>Creating $this->version archive for $repository ..</info>");

        if (substr($filename, -3) == '.gz') {
            $filename = substr($filename, 0, -3);
        }

        `git --git-dir "$source/.git" archive --prefix=base/ $this->version >"$filename"`;

        // Make sure to include submodules
        if (file_exists("$source/.gitmodules"))
        {
            exec("cd $source && (git submodule foreach) | while read entering path; do echo \$path; done", $result, $return_var);

            if (is_array($result))
            {
                foreach ($result as $module)
                {
                    $module = trim($module, "'");
                    $path   = "$source/$module";

                    $cmd = "cd $path && git archive --prefix=base/$module/ HEAD > /tmp/$module.tar && tar --concatenate --file=\"$filename\" /tmp/$module.tar";
                    exec($cmd);

                    @unlink("/tmp/$module.tar");
                }
            }
        }

        `gzip $filename`;

        return (bool) @filesize("$filename.gz");
    }

    /**
     * Validate the given gzipped tarball
     *
     * @param $file
     * @return bool
     */
    protected function _isValidTarball($file)
    {
        if (!file_exists($file)) {
            return false;
        }

        $commands = array(
            "gunzip -t $file",
            "tar -tzf $file >/dev/null"
        );

        foreach ($commands as $command)
        {
            exec($command, $result, $returnVal);

            if ($returnVal != 0) {
                return false;
            }
        }

        return true;
    }
}
<?php
/**
 * @copyright	Copyright (C) 2007 - 2015 Johan Janssens and Timble CVBA. (http://www.timble.net)
 * @license		Mozilla Public License, version 2.0
 * @link		http://github.com/joomlatools/joomlatools-console for the canonical source repository
 */

namespace Joomlatools\Console\Command;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Helper\Table;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

use Symfony\Component\Console\Helper\TableHelper;
use Joomlatools\Console\Joomla\Util;

class Versions extends Command
{
    const REPO_JOOMLA_CMS = 'https://github.com/joomla/joomla-cms';

    /**
     * Cache file
     *
     * @var string
     */
    protected static $file;

    /**
     * Git repository to use
     *
     * @var string
     */
    protected $repository = self::REPO_JOOMLA_CMS;

    protected function configure()
    {
        if (!self::$file) {
            self::$file = Util::getWritablePath() . '/cache/' . md5($this->repository) . '/.versions';
        }

        $this
            ->setName('versions')
            ->setDescription('Show available versions in Joomla Git repository')
            ->addOption(
                'refresh',
                null,
                InputOption::VALUE_NONE,
                'Refresh the versions cache'
            )
            ->addOption(
                'clear-cache',
                null,
                InputOption::VALUE_NONE,
                'Clear the downloaded files cache'
            )
            ->addOption(
                'repo',
                null,
                InputOption::VALUE_REQUIRED,
                'Alternative Git repository to clone. Also accepts a gzipped tar archive instead of a Git repository.',
                $this->repository
            );
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $this->setRepository($input->getOption('repo'));

        if ($input->getOption('refresh')) {
            $this->refresh();
        }

        if ($input->getOption('clear-cache')) {
            $this->clearcache($output);
        }

        $list = $this->_getVersions();

        foreach($list as $ref => $versions)
        {
            $chunks = array_chunk($versions, 4);
            $header = $ref === 'heads' ? "Branches" : "Releases";

            $table = new Table($output);

            $table->setHeaders(array($header))
                ->setRows($chunks)
                ->setStyle('compact')
                ->render($output);
        }

        return 0;
    }

    public function setRepository($repository)
    {
        $this->repository = $repository;

        self::$file = Util::getWritablePath() . '/cache/' . md5($this->repository) . '/.versions';
    }

    public function getRepository()
    {
        return $this->repository;
    }

    /**
     * Check if the repository is a valid Git repository.
     *
     * @return bool
     */
    public function isGitRepository()
    {
        $cmd = "GIT_SSH_COMMAND=\"ssh -oBatchMode=yes\" GIT_ASKPASS=/bin/echo git ls-remote $this->repository 2>&1";
        exec($cmd, $output, $returnVal);

        return $returnVal === 0;
    }

    public function getCacheDirectory()
    {
        $cachedir = dirname(self::$file);

        if (!file_exists($cachedir)) {
            mkdir($cachedir, 0755, true);
        }

        return $cachedir;
    }

    public function clearcache(OutputInterface $output)
    {
        $cachedir = $this->getCacheDirectory();

        if(!empty($cachedir) && file_exists($cachedir))
        {
            `rm -rf $cachedir/*.tar.gz`;

            $output->writeln("<info>Downloaded version cache has been cleared.</info>");
        }
    }

    public function refresh()
    {
        if (file_exists(self::$file)) {
            unlink(self::$file);
        }

        $cmd = "GIT_SSH_COMMAND=\"ssh -oBatchMode=yes\" GIT_ASKPASS=/bin/echo git ls-remote $this->repository 2>&1 | grep -E 'refs/(tags|heads)' | grep -v '{}'";
        exec($cmd, $refs, $returnVal);

        if ($returnVal != 0) {
            $refs = array();
        }

        $versions = array('tags' => array(), 'heads' => array());
        $pattern  = '/^[a-z0-9]+\s+refs\/(heads|tags)\/([a-z0-9\.\-_\/]+)$/im';

        foreach($refs as $ref)
        {
            if(preg_match($pattern, $ref, $matches))
            {
                $type = isset($versions[$matches[1]]) ? $versions[$matches[1]] : array();

                if($matches[1] == 'tags')
                {
                    if($matches[2] == '1.7.3' || !preg_match('/^v?\d\.\d+/m', $matches[2])) {
                        continue;
                    }
                }

                $type[] = $matches[2];
                $versions[$matches[1]] = $type;
            }
        }

        if (!file_exists(dirname(self::$file))) {
            mkdir(dirname(self::$file), 0755, true);
        }

        file_put_contents(self::$file, json_encode($versions));
    }

    protected function _getVersions()
    {
        if (!file_exists(self::$file)) {
            $this->refresh();
        }

        $list = json_decode(file_get_contents(self::$file), true);

        if (is_null($list))
        {
            $this->refresh();
            $list = json_decode(file_get_contents(self::$file), true);
        }

        $list = array_reverse($list, true);

        return $list;
    }

    public function getLatestRelease($prefix = null)
    {
        $latest   = '0.0.0';

        if (!$this->isGitRepository()) {
            return 'current';
        }

        $versions = $this->_getVersions();

        if (!isset($versions['tags'])) {
            return 'master';
        }

        $major = $prefix;
        if (!is_null($major) && substr($major, 0, 1) == 'v') {
            $major = substr($major, 1);
        }

        foreach($versions['tags'] as $version)
        {
            if(!preg_match('/v?\d\.\d+\.\d+.*/im', $version) || preg_match('#(?:alpha|beta|rc)#i', $version)) {
                continue;
            }

            $compare = $version;
            if (substr($compare, 0, 1) == 'v') {
                $compare = substr($compare, 1);
            }

            if(!is_null($major) && substr($compare, 0, strlen($major)) != $major) {
                continue;
            }

            if(version_compare($latest, strtolower($compare), '<')) {
                $latest = $version;
            }
        }

        if ($latest == '0.0.0') {
            $latest = 'master';
        }

        return $latest;
    }

    public function isBranch($version)
    {
        $versions = $this->_getVersions();

        return in_array($version, $versions['heads']);
    }

    public function isTag($version)
    {
        $versions = $this->_getVersions();

        return in_array($version, $versions['tags']);
    }
}
<?php
/**
 * @copyright	Copyright (C) 2007 - 2015 Johan Janssens and Timble CVBA. (http://www.timble.net)
 * @license		Mozilla Public License, version 2.0
 * @link		http://github.com/joomlatools/joomlatools-console for the canonical source repository
 */

namespace Joomlatools\Console\Command\Vhost;

use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

use Joomlatools\Console\Command\Site\AbstractSite;

class Create extends AbstractSite
{
    protected function configure()
    {
        parent::configure();

        $this
            ->setName('vhost:create')
            ->setDescription('Creates a new Apache2 virtual host')
            ->addOption(
                'http-port',
                null,
                InputOption::VALUE_REQUIRED,
                'The HTTP port the virtual host should listen to',
                80
            )
            ->addOption(
                'ssl-port',
                null,
                InputOption::VALUE_REQUIRED,
                'The HTTPS port the virtual host should listen to',
                443
            )
            ->addOption(
                'template',
                null,
                InputOption::VALUE_REQUIRED,
                'Custom file to use as the Apache vhost configuration. Make sure to include HTTP and SSL directives if you need both.',
                null
            )
            ->addOption('folder',
                null,
                InputOption::VALUE_REQUIRED,
                'The Apache2 vhost folder',
                '/etc/apache2/sites-enabled'
            )
            ->addOption('filename',
                null,
                InputOption::VALUE_OPTIONAL,
                'The Apache2 vhost file name',
                null,
            )
            ->addOption('restart-command',
                null,
                InputOption::VALUE_OPTIONAL,
                'The full command for restarting Apache2',
                null
            )
        ;
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        parent::execute($input, $output);

        if (!file_exists($this->target_dir)) {
            throw new \RuntimeException(sprintf('Site not found: %s', $this->site));
        }

        $target = $this->_getVhostPath($input);

        $variables = $this->_getVariables($input);

        if (!is_dir(dirname($target))) {
            mkdir(dirname($target), 0755, true);
        }

        if (is_dir(dirname($target)))
        {
            $template = $this->_getTemplate($input);
            $template = str_replace(array_keys($variables), array_values($variables), $template);

            file_put_contents($target, $template);

            if ($command = $input->getOption('restart-command')) {
                `$command`;
            }
        }

        return 0;
    }

    protected function _getVhostPath($input) 
    {
        $folder = str_replace('[site]', $this->site, $input->getOption('folder'));
        $file = $input->getOption('filename') ?? $input->getArgument('site').'.conf';

        return $folder.'/'.$file;
    }

    protected function _getVariables(InputInterface $input)
    {
        $documentroot = $this->target_dir;

        $variables = array(
            '%site%'       => $input->getArgument('site'),
            '%root%'       => $documentroot,
            '%http_port%'  => $input->getOption('http-port'),
            '%ssl_port%'  => $input->getOption('ssl-port'),
        );

        return $variables;
    }

    protected function _getTemplate(InputInterface $input)
    {
        if ($template = $input->getOption('template'))
        {
            if (file_exists($template))
            {
                $file = basename($template);
                $path = dirname($template);
            }
            else throw new \Exception(sprintf('Template file %s does not exist.', $template));
        }
        else
        {
            $path = realpath(__DIR__.'/../../../../../bin/.files/vhosts');

            $file = 'apache.conf';
        }

        $template = file_get_contents(sprintf('%s/%s', $path, $file));

        return $template;
    }
}
<?php
/**
 * @copyright	Copyright (C) 2007 - 2015 Johan Janssens and Timble CVBA. (http://www.timble.net)
 * @license		Mozilla Public License, version 2.0
 * @link		http://github.com/joomlatools/joomlatools-console for the canonical source repository
 */

namespace Joomlatools\Console\Command\Vhost;

use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

use Joomlatools\Console\Command\Site\AbstractSite;

class Remove extends AbstractSite
{
    protected function configure()
    {
        parent::configure();

        $this
            ->setName('vhost:remove')
            ->setDescription('Removes the Apache2 virtual host')
            ->addOption('folder',
                null,
                InputOption::VALUE_REQUIRED,
                'The Apache2 vhost folder',
                '/etc/apache2/sites-enabled'
            )
            ->addOption('filename',
                null,
                InputOption::VALUE_OPTIONAL,
                'The Apache2 vhost file name',
                null,
            )
            ->addOption('restart-command',
                null,
                InputOption::VALUE_OPTIONAL,
                'The full command for restarting Apache2',
                null
            )
        ;
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        parent::execute($input, $output);

        $file = $this->_getVhostPath($input);

        if (is_file($file))
        {
            $this->_runWithOrWithoutSudo("rm -f $file");

            if ($command = $input->getOption('restart-command')) {
                $this->_runWithOrWithoutSudo($command);
            }
        }

        return 0;
    }

    protected function _getVhostPath($input) 
    {
        $folder = str_replace('[site]', $this->site, $input->getOption('folder'));
        $file = $input->getOption('filename') ?? $input->getArgument('site').'.conf';

        return $folder.'/'.$file;
    }

    protected function _runWithOrWithoutSudo($command) 
    {
        $hasSudo = `which sudo`;

        if ($hasSudo) {
            `sudo $command`;
        } else {
            `$command`;
        }
    }
}<?php
/**
 * @copyright	Copyright (C) 2007 - 2015 Johan Janssens and Timble CVBA. (http://www.timble.net)
 * @license		Mozilla Public License, version 2.0
 * @link		http://github.com/joomlatools/joomlatools-console for the canonical source repository
 */

namespace Joomlatools\Console\Command;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Yaml\Yaml;

class Configurable extends Command
{
    protected $_config = null;


    public function addArgument($name, $mode = null, $description = '', $default = null)
    {
        if ($mode != InputOption::VALUE_NONE) {
            $default = $this->_getConfigOverride($name) ?? $default;
        }

        return parent::addArgument($name, $mode, $description, $default);
    }

    public function addOption($name, $shortcut = null, $mode = null, $description = '', $default = null)
    {
        if ($mode != InputOption::VALUE_NONE) {
            $default = $this->_getConfigOverride($name) ?? $default;
        }

        return parent::addOption($name, $shortcut, $mode, $description, $default);
    }

    protected function _getConfigOverride($name)
    {
        $override = null;

        if (is_null($this->_config))
        {
            $file = sprintf('%s/.joomlatools/console/config.yaml', trim(`echo ~`));

            if (file_exists($file)) 
            {
                $file_contents = \file_get_contents($file);
                $env = $_ENV;
                
                // Replace longest keys first
                uksort($env, function($a, $b){
                    return strlen($b) - strlen($a);
                });
                
                // Replace environment variables in the file
                foreach ($env as $key => $value) {
                    $file_contents = \str_replace('$'.$key, $value, $file_contents);
                }

                $this->_config = Yaml::parse($file_contents);
            } else {
                $this->_config = false;
            }
        }

        $config = $this->_config;

        if (is_array($config))
        {
            if ($command = $this->getName())
            {
                if (isset($config[$command][$name])) {
                    $override = $config[$command][$name];
                }
            }

            // Look for global settings

            if (is_null($override) && isset($config['globals'][$name])) {
                $override = $config['globals'][$name];
            }
        }

        return $override;
    }
}<?php
/**
 * @copyright	Copyright (C) 2007 - 2015 Johan Janssens and Timble CVBA. (http://www.timble.net)
 * @license		Mozilla Public License, version 2.0
 * @link		http://github.com/joomlatools/joomlatools-console for the canonical source repository
 */

namespace Joomlatools\Console\Joomla;

use \JApplicationCli as JApplicationCli;
use \JDispatcher as JDispatcher;
use \JFactory as JFactory;
use \JInstaller as JInstaller;
use \JMenu as JMenu;
use \JPluginHelper as JPluginHelper;
use \JSession as JSession;

/**
 * Application extending Joomla CLI class.
 *
 * @author  Steven Rombauts <https://github.com/stevenrombauts>
 * @package Joomlatools\Composer
 */
class Application extends JApplicationCli
{
    protected $_clientId     = Bootstrapper::CLI;
    protected $_application  = null;
    protected $_messageQueue = array();
    protected $_options      = array();

    /**
     * Class constructor.
     *
     * @param   array  $options     An array of configuration settings.
     * @param   mixed  $input       An optional argument to provide dependency injection for the application's
     *                              input object.
     * @param   mixed  $config      An optional argument to provide dependency injection for the application's
     *                              config object.
     * @param   mixed  $dispatcher  An optional argument to provide dependency injection for the application's
     *                              event dispatcher.
     * @return  void
     *
     * @see JApplicationCli
     */
    public function __construct($options = array(), JInputCli $input = null, JRegistry $config = null, JDispatcher $dispatcher = null)
    {
        $this->_options = $options;

        parent::__construct($input, $config, $dispatcher);

        if (isset($this->_options['client_id'])) {
            $this->_clientId = $this->_options['client_id'];
        }

        $this->_initialize();
    }

    /**
     * Initialise the application.
     *
     * Loads the necessary Joomla libraries to make sure
     * the Joomla application can run and sets up the JFactory properties.
     *
     * @param   array  $options  An optional associative array of configuration settings.
     * @return  void
     */
    protected function _initialize()
    {
        // Load dependencies
        jimport('joomla.application.component.helper');
        jimport('joomla.application.menu');

        jimport('joomla.environment.uri');

        jimport('joomla.event.dispatcher');

        jimport('joomla.utilities.utility');
        jimport('joomla.utilities.arrayhelper');

        jimport('joomla.application.module.helper');

        // Tell JFactory where to find the current application object
        JFactory::$application = $this;

        // Start a new session and tell JFactory where to find it if we're on Joomla 3
        if(version_compare(JVERSION, '3.0.0', '>=')) {
            JFactory::$session = $this->_startSession();
        }

        // Load plugins
        JPluginHelper::importPlugin('system');

        // Load required languages
        $lang = JFactory::getLanguage();
        $lang->load('lib_joomla', JPATH_ADMINISTRATOR, null, true);
        $lang->load('com_installer', JPATH_ADMINISTRATOR, null, true);

        // Instiantiate the Joomla application object if we
        // need either admin or site
        $name = $this->getName();
        if (in_array($name, array('administrator', 'site'))) {
            $this->_application = \JApplicationCms::getInstance($name);
        }
    }

    /**
     * Authenticates the Joomla user.
     *
     * This method will load the default user object and change its guest status to logged in.
     * It will then simply copy all the properties defined by key in the $credentials argument
     * onto this JUser object, allowing you to completely overwrite the user information.
     *
     * @param array $credentials    Associative array containing user object properties.
     *
     * @return void
     */
    public function authenticate($credentials)
    {
        $user = JFactory::getUser();
        $user->guest = 0;

        foreach($credentials as $key => $value) {
            $user->$key = $value;
        }

        // Push the JUser object into the session otherwise getUser() always returns a new instance of JUser.
        JFactory::getSession()->set('user', $user);
    }

    /**
     * Checks if this Joomla installation has a certain element installed.
     *
     * @param string $element   The name of the element
     * @param string $type      The type of extension
     *
     * @return bool
     */
    public function hasExtension($element, $type = 'component')
    {
        $db = JFactory::getDbo();
        $sql = "SELECT `extension_id`, `state` FROM `#__extensions`"
            ." WHERE `element` = ".$db->quote($element)." AND `type` = ".$db->quote($type);

        $extension = $db->setQuery($sql)->loadObject();

        return ($extension && $extension->state != -1);
    }

    /**
     * Installs an extension from the given path.
     *
     * @param string $path Path to the extracted installation package.
     *
     * @return bool
     */
    public function install($path)
    {
        $installer = $this->getInstaller();

        return $installer->install($path);
    }

    /**
     * Updates an existing extension from the given path.
     *
     * @param string $path Path to the extracted installation package.
     *
     * @return bool
     */
    public function update($path)
    {
        $installer = $this->getInstaller();

        return $installer->update($path);
    }

    /**
     * Retrieves value from the Joomla configuration.
     *
     * @param string $varname   Name of the configuration property
     * @param mixed  $default   Default value
     *
     * @return mixed
     */
    public function getCfg($varname, $default = null)
    {
        return JFactory::getConfig()->get($varname, $default);
    }

    /**
     * Enqueue flash message.
     *
     * @param string $msg   The message
     * @param string $type  Type of message (can be message/notice/error)
     *
     * @return void
     */
    public function enqueueMessage($msg, $type = 'message')
    {
        $this->_messageQueue[] = array('message' => $msg, 'type' => strtolower($type));
    }

    /**
     * Return all currently enqueued flash messages.
     *
     * @return array
     */
    public function getMessageQueue()
    {
        return $this->_messageQueue;
    }

    /**
     * Get the JInstaller object.
     *
     * @return JInstaller
     */
    public function getInstaller()
    {
        // @TODO keep one instance available per install package
        // instead of instantiating a new object each time.
        // Re-using the same instance for multiple installations will fail.
        return new JInstaller();
    }

    public function getPath()
    {
        return JPATH_ROOT;
    }

    /**
     * Get the current template name.
     * Always return 'system' as template.
     *
     * @return string
     */
    public function getTemplate()
    {
        return 'system';
    }

    /**
     * Gets the client id of the current running application.
     *
     * @return  integer  A client identifier.
     */
    public function getClientId()
    {
        return $this->_clientId;
    }

    /**
     * Get the current application name.
     *
     * @return string
     */
    public function getName()
    {
        $name = '';

        switch ($this->_clientId)
        {
            case Bootstrapper::SITE:
                $name = 'site';
                break;
            case Bootstrapper::ADMIN:
                $name = 'administrator';
                break;
            default:
                $name = 'cli';
                break;
        }

        return $name;
    }

    /**
     * Checks if interface is site or not.
     *
     * @return  bool
     */
    public function isSite()
    {
        return $this->_clientId == Bootstrapper::SITE;
    }

    /**
     * Checks if interface is admin or not.
     *
     * @return  bool
     */
    public function isAdmin()
    {
        return $this->_clientId == Bootstrapper::ADMIN;
    }

    /**
     * @param $identifier
     * @return bool
     */
    public function isClient($identifier)
    {
        return $this->getName() === $identifier;
    }

    /**
     * Determine if we are using a secure (SSL) connection.
     *
     * @return  boolean  True if using SSL, false if not.
     */
    public function isSSLConnection()
    {
        return false;
    }

    /**
     * Stub for flushAssets() method.
     */
    public function flushAssets()
    {
    }

    /**
     * Return a reference to the JRouter object.
     *
     * @param   string  $name     The name of the application.
     * @param   array   $options  An optional associative array of configuration settings.
     *
     * @return  JRouter
     */
    public static function getRouter($name = null, array $options = array())
    {
        if (!isset($name))
        {
            $app  = \JFactory::getApplication();
            $name = $app->getName();
        }

        try
        {
            $router = \JRouter::getInstance($name, $options);
        }
        catch (\Exception $e)
        {
            return null;
        }

        return $router;
    }

    /**
     * Method to load a PHP configuration class file based on convention and return the instantiated data object.  You
     * will extend this method in child classes to provide configuration data from whatever data source is relevant
     * for your specific application.
     * Additionally injects the root_user into the configuration.
     *
     * @param   string  $file   The path and filename of the configuration file. If not provided, configuration.php
     *                          in JPATH_BASE will be used.
     * @param   string  $class  The class name to instantiate.
     *
     * @return  mixed   Either an array or object to be loaded into the configuration object.
     *
     * @since   11.1
     */
    protected function fetchConfigurationData($file = '', $class = 'JConfig')
    {
        $config = parent::fetchConfigurationData($file, $class);

        // Inject the root user configuration
        if(isset($this->_options['root_user']))
        {
            $root_user = isset($this->_options['root_user']) ? $this->_options['root_user'] : 'root';

            if (is_array($config)) {
                $config['root_user'] = $root_user;
            }
            elseif (is_object($config)) {
                $config->root_user = $root_user;
            }
        }

        return $config;
    }

    /**
     * Creates a new Joomla session.
     *
     * @return JSession
     */
    protected function _startSession()
    {
        $name     = md5($this->getCfg('secret') . get_class($this));
        $lifetime = $this->getCfg('lifetime') * 60 ;
        $handler  = $this->getCfg('session_handler', 'none');

        $options = array(
            'name' => $name,
            'expire' => $lifetime
        );

        $session = JSession::getInstance($handler, $options);
        $session->initialise($this->input, $this->dispatcher);

        if ($session->getState() == 'expired') {
            $session->restart();
        } else {
            $session->start();
        }

        return $session;
    }

    /**
     * Load an object or array into the application configuration object.
     *
     * @param   mixed  $data  Either an array or object to be loaded into the configuration object.
     *
     * @return  Application  Instance of $this
     */
    public function loadConfiguration($data)
    {
        parent::loadConfiguration($data);

        JFactory::$config = $this->config;

        return $this;
    }

    /**
     * Gets a user state.
     *
     * @param   string  $key      The path of the state.
     * @param   mixed   $default  Optional default value, returned if the internal value is null.
     *
     * @return  mixed  The user state or null.
     *
     * @since   11.1
     */
    public function getUserState($key, $default = null)
    {
        $session = JFactory::getSession();
        $registry = $session->get('registry');

        if (!is_null($registry))
        {
            return $registry->get($key, $default);
        }

        return $default;
    }

    /**
     * Sets the value of a user state variable.
     *
     * @param   string  $key    The path of the state.
     * @param   string  $value  The value of the variable.
     *
     * @return  mixed  The previous state, if one existed.
     *
     * @since   11.1
     */
    public function setUserState($key, $value)
    {
        $session = JFactory::getSession();
        $registry = $session->get('registry');

        if (!is_null($registry))
        {
            return $registry->set($key, $value);
        }

        return null;
    }

    /**
     * Gets the value of a user state variable.
     *
     * @param   string  $key      The key of the user state variable.
     * @param   string  $request  The name of the variable passed in a request.
     * @param   string  $default  The default value for the variable if not found. Optional.
     * @param   string  $type     Filter for the variable, for valid values see {@link JFilterInput::clean()}. Optional.
     *
     * @return  The request user state.
     *
     * @since   11.1
     */
    public function getUserStateFromRequest($key, $request, $default = null, $type = 'none')
    {
        $cur_state = $this->getUserState($key, $default);
        $new_state = \JRequest::getVar($request, null, 'default', $type);

        // Save the new value only if it was set in this request.
        if ($new_state !== null)
        {
            $this->setUserState($key, $new_state);
        }
        else
        {
            $new_state = $cur_state;
        }

        return $new_state;
    }
    
    /**
     * Just a stub to catch anything that calls $app->redirect(), expecting us to be JApplication,
     * rather than JApplicationCLI, such as installer code run via extension:install, so it doesn't
     * drop dead from a fatal PHP error.
     * 
     * @param   string   $url    does nothing
     * @param   boolean  $moved  does nothing
     * 
     * @return  void
     */
    public function redirect($url, $moved = false)
    {
		/**
		 * Throw an exception, to short circuit whatever code called us, as the J! redirect()
		 * would usually close() and go no further, so we don't want to just return.
		 * We can then catch this exception in (for instance) ExtensionInstallFile, and
		 * go about our business.
		 */
    	throw new \RuntimeException(sprintf('Application tried to redirect to %s', $url));
    }

    /**
     * Returns the application JMenu object.
     *
     * @param   string  $name     The name of the application/client.
     * @param   array   $options  An optional associative array of configuration settings.
     *
     * @return  JMenu
     */
    public function getMenu($name = null, $options = array())
    {
        if (!isset($name))
        {
            $app = JFactory::getApplication();
            $name = $app->getName();
        }

        try
        {
            if (!class_exists('JMenu' . ucfirst($name))) {
                jimport('cms.menu.'.strtolower($name));
            }

            $menu = JMenu::getInstance($name, $options);
        }
        catch (Exception $e) {
            return null;
        }

        return $menu;
    }

    /**
     * Forward m
     *
     * @param $method
     * @param $args
     * @return mixed
     * @throws Exception
     */
    public function __call($method, $args)
    {
        if (!method_exists($this, $method) && is_object($this->_application)) {
            return call_user_func_array(array($this->_application, $method), $args);
        }

        return parent::__call($method, $args);
    }
}<?php
/**
 * @copyright	Copyright (C) 2007 - 2015 Johan Janssens and Timble CVBA. (http://www.timble.net)
 * @license		Mozilla Public License, version 2.0
 * @link		http://github.com/joomlatools/joomlatools-console for the canonical source repository
 */

namespace Joomlatools\Console\Joomla;

class Bootstrapper
{
    const SITE  = 0;
    const ADMIN = 1;
    const CLI   = 2;

    protected static $_application;

    /**
     * Returns a Joomla application with a root user logged in
     *
     * @param string $base Base path for the Joomla installation
     * @param int    $client_id Application client id to spoof. Defaults to admin.
     *
     * @return Application
     */
    public static function getApplication($base, $client_id = self::ADMIN)
    {
        $_SERVER['SERVER_PORT'] = 80;

        if (!self::$_application)
        {
            self::bootstrap($base);

            $options = array(
                'root_user' => 'root',
                'client_id' => $client_id
            );

            self::$_application = new Application($options);

            $credentials = array(
                'name'      => 'root',
                'username'  => 'root',
                'groups'    => array(8),
                'email'     => 'root@localhost.home'
            );

            self::$_application->authenticate($credentials);

            // If there are no marks in JProfiler debug plugin performs a division by zero using count($marks)
            \JProfiler::getInstance('Application')->mark('Hello world');
        }

        return self::$_application;
    }

    /**
     * Load the Joomla application files
     *
     * @param $base
     */
    public static function bootstrap($base)
    {
        if (!class_exists('\\JApplicationCli'))
        {
            $_SERVER['HTTP_HOST'] = 'localhost';
            $_SERVER['HTTP_USER_AGENT'] = 'joomlatools-console/' . \Joomlatools\Console\Application::VERSION;

            if (!defined('_JEXEC')) {
                define('_JEXEC', 1);
            }

            if (!defined('DS')) {
                define('DS', DIRECTORY_SEPARATOR);
            }

            define('JPATH_BASE', realpath($base));

            require_once JPATH_BASE . '/includes/defines.php';
            require_once JPATH_BASE . '/includes/framework.php';
        }
    }
} <?php
/**
 * @copyright	Copyright (C) 2007 - 2015 Johan Janssens and Timble CVBA. (http://www.timble.net)
 * @license		Mozilla Public License, version 2.0
 * @link		http://github.com/joomlatools/joomlatools-console for the canonical source repository
 */

namespace Joomlatools\Console\Joomla;

class Cache
{
    public static function getGroups($client)
    {
        if (!self::_isBootstrapped()) {
            throw new \RuntimeException('Joomla application has not been bootstrapped');
        }

        $options = array(
            'cachebase' => $client ? JPATH_ADMINISTRATOR . '/cache' : JPATH_CACHE
        );

        return \JCache::getInstance('', $options)->getAll();
    }

    public static function clear($client, array $group = array())
    {
        if (!self::_isBootstrapped()) {
            throw new \RuntimeException('Joomla application has not been bootstrapped');
        }

        $group = array_filter($group);

        $options = array(
            'cachebase' => $client ? JPATH_ADMINISTRATOR . '/cache' : JPATH_CACHE
        );

        $cache = \JCache::getInstance('', $options);

        if (!count($group)) {
            $group = $cache->getAll();
        }

        $cleared = array();

        foreach($group as $item)
        {
            $cache_item = isset($item->group) ? $item->group : $item;
            $result = $cache->clean($cache_item);

            if($result) {
                $cleared[] = $cache_item;
            }
        }

        return $cleared;
    }

    public static function purge()
    {
        if (!self::_isBootstrapped()) {
            throw new \RuntimeException('Joomla application has not been bootstrapped');
        }

        \JFactory::getCache()->gc();

        return true;
    }

    protected static function _isBootstrapped()
    {
        return class_exists('JFactory') && defined('JPATH_BASE');
    }
}<?php
/**
 * @copyright	Copyright (C) 2007 - 2015 Johan Janssens and Timble CVBA. (http://www.timble.net)
 * @license		Mozilla Public License, version 2.0
 * @link		http://github.com/joomlatools/joomlatools-console for the canonical source repository
 */

namespace Joomlatools\Console\Joomla;

class Util
{
    const VERSION_LOCATIONS = [
        '/libraries/cms/version/version.php',
        '/libraries/src/Version.php', // 3.8+
        '/libraries/joomla/version.php'
    ];

    protected static $_versions  = array();

    public static function executeCommand(string $command): string
    {
        exec($command, $output, $code);
        if (count($output) === 0) {
            $outputError = $code;
        } else {
            $outputError = implode(PHP_EOL, $output);
        }

        if ($code !== 0) {
            throw new \RuntimeException(
                "Command failed. The exit code: ".
                $outputError."<br>The last line of output: ".
                $command
            );
        }

        return implode(PHP_EOL, $output);
    }

    public static function isJoomla4($base): bool
    {
        return static::getJoomlaVersion($base)->major >= 4;
    }

    public static function executeJ4CliCommand($base, $command): string
    {
        return static::executeCommand(PHP_BINARY . " " . escapeshellarg($base . "/cli/joomla.php") . $command);
    }

    /**
     * Retrieve the Joomla version.
     *
     * Returns an object with properties type and release.
     * Returns FALSE if unable to find correct version.
     *
     * @param string $base Base path for the Joomla installation
     * @return stdclass|boolean
     */
    public static function getJoomlaVersion($base)
    {
        $key = md5($base);

        if (!isset(self::$_versions[$key]))
        {
            self::$_versions[$key] = false;
            foreach (self::VERSION_LOCATIONS as $file)
            {
                $path = $base . $file;

                if (file_exists($path))
                {
                    self::$_versions[$key] = VersionSniffer::fromFile($path);

                    break;
                }
            }
        }

	    return self::$_versions[$key];
    }

    /**
     * Builds the full path for a given path inside a Joomla project.
     *
     * @param string $path The original relative path to the file/directory
     * @param string $base The root directory of the Joomla installation
     * @return string Target path
     */
    public static function buildTargetPath($path, $base = '')
    {
        if (!empty($base) && substr($base, -1) == '/') {
            $base = substr($base, 0, -1);
        }

        $path = str_replace($base, '', $path);

        if (substr($path, 0, 1) != '/') {
            $path = '/'.$path;
        }

        return $base.$path;
    }

    /**
     * Return a writable path
     *
     * @return string
     */
    public static function getWritablePath()
    {
        $path = \Phar::running();

        $templatePath = self::getTemplatePath();
        if (!empty($path) || !is_writable($templatePath)) {
            return sys_get_temp_dir() . '/.joomla';
        }

        return $templatePath;
    }

    /**
     * Get template directory path
     *
     * @return string
     */
    public static function getTemplatePath()
    {
        $path = \Phar::running();

        if (!empty($path)) {
            return $path . DIRECTORY_SEPARATOR . 'bin' . DIRECTORY_SEPARATOR . '.files';
        }

        $root = dirname(dirname(dirname(dirname(__DIR__))));

        return realpath($root .DIRECTORY_SEPARATOR . 'bin' . DIRECTORY_SEPARATOR . '.files');
    }
}<?php
    /**
     * @copyright      Copyright (C) 2007 - 2015 Johan Janssens and Timble CVBA. (http://www.timble.net)
     * @license        Mozilla Public License, version 2.0
     * @link           http://github.com/joomlatools/joomlatools-console for the canonical source repository
     */

    namespace Joomlatools\Console\Joomla;

    use PhpParser\Node;
    use PhpParser\Node\Stmt\Const_;
    use PhpParser\Node\Stmt\Expression;
    use PhpParser\NodeFinder;
    use PhpParser\NodeVisitorAbstract;

    class VersionSniffer
    {
        public $release = 'unknown';

        public $major;
        public $minor;
        public $patch;
        public $extra;

        private function __construct(string $code)
        {
            $parser = (new \PhpParser\ParserFactory)->create(\PhpParser\ParserFactory::PREFER_PHP7);

            $ast = $parser->parse($code);

            $nodeFinder = new NodeFinder;
            $nodes = $nodeFinder->find($ast, function (Node $node) {
                return $node instanceof Node\Const_ || $node instanceof Node\Stmt\PropertyProperty;
            });
            foreach ($nodes as $node) {
                $value = $node instanceof Node\Stmt\PropertyProperty ? $node->default : $node->value;
                switch ((string)$node->name) {
                    case 'RELEASE':
                        // v3.5 <= version < 4.0
                        [$major, $minor] = explode('.', $value->value);
                        $this->major = (int)$major;
                        $this->minor = (int)$minor;
                        break;
                    case 'MAJOR_VERSION':
                        $this->major = (int)$value->value;
                        break;
                    case 'MINOR_VERSION':
                        $this->minor = (int)$value->value;
                        break;
                    case 'PATCH_VERSION':
                    case 'DEV_LEVEL':
                        $this->patch = (int)$value->value;
                        break;
                    case 'EXTRA_VERSION':
                    case 'BUILD':
                        $this->extra = $value->value;
                        break;
                }
            }
            $this->release = $this->version();
        }

        public static function fromFile(string $file): self
        {
            if (!is_file($file)) {
                throw new \RuntimeException("File {$file} not found");
            }

            return new static(file_get_contents($file));
        }

        public function version(): string
        {
            if (empty($this->major)) {
                return 'unknown';
            }

            return rtrim(
                implode('.', [$this->major, $this->minor, $this->patch]) . '-' . $this->extra,
                '-'
            );
        }

        public function major(): ?int
        {
            return $this->major;
        }

        public function minor(): ?int
        {
            return $this->minor;
        }

        public function patch(): ?int
        {
            return $this->patch;
        }

        public function extra(): ?string
        {
            return $this->extra;
        }
    }<?php
/**
 * @copyright	Copyright (C) 2007 - 2015 Johan Janssens and Timble CVBA. (http://www.timble.net)
 * @license		Mozilla Public License, version 2.0
 * @link		http://github.com/joomlatools/joomlatools-console for the canonical source repository
 */

use Joomlatools\Console\Command\Extension;
use Joomlatools\Console\Joomla\Util;
use Symfony\Component\Console\Output\OutputInterface;

/**
 * Koowa components custom symlinker
 */
Extension\Symlink::registerSymlinker(function($project, $destination, $name, $projects, OutputInterface $output) {
    if (!is_file($project.'/composer.json')) {
        return false;
    }

    $manifest = json_decode(file_get_contents($project.'/composer.json'));

    if (!isset($manifest->extra) || !isset($manifest->extra->{'joomlatools-component'})) {
        return false;
    }

    $component   = $manifest->extra->{'joomlatools-component'};
    $code_folder = Util::buildTargetPath('/libraries/joomlatools-components', $destination);

    if ($output->getVerbosity() >= OutputInterface::VERBOSITY_VERBOSE) {
        $output->writeln("Symlinking `$component` into `$destination`");
    }

    $dirs = array(
        $code_folder,
        Util::buildTargetPath('/media/koowa', $destination)
    );

    foreach ($dirs as $dir)
    {
        if (!is_dir($dir))
        {
            if ($output->getVerbosity() >= OutputInterface::VERBOSITY_VERBOSE) {
                $output->writeln(" * creating empty directory `$dir`");
            }

            mkdir($dir, 0755, true);
        }
    }

    $from = $project;

    if (is_dir($project.'/code')) {
        $from = $project.'/code';
    }

    $code_destination = $code_folder.'/'.$component;

    if (!file_exists($code_destination))
    {
        $project = Extension\Symlink::buildSymlinkPath($project, $code_destination);

        if ($output->getVerbosity() >= OutputInterface::VERBOSITY_VERBOSE) {
            $output->writeln(" * creating link `$code_destination` -> $project");
        }

        `ln -sf $from $code_destination`;
    }

    // Media folder always has com_ prefix
    if (substr($component, 0, 4) !== 'com_') {
        $component = 'com_'.$component;
    }

    // Special treatment for media files
    $media = $project.'/resources/assets';
    $target = Util::buildTargetPath('/media/koowa/'.$component, $destination);

    if (is_dir($media) && !file_exists($target))
    {
        $media = Extension\Symlink::buildSymlinkPath($media, $target);

        if ($output->getVerbosity() >= OutputInterface::VERBOSITY_VERBOSE) {
            $output->writeln(" * creating link `$target` -> $media");
        }

        `ln -sf $media $target`;
    }

    return true;
});<?php
/**
 * @copyright	Copyright (C) 2007 - 2015 Johan Janssens and Timble CVBA. (http://www.timble.net)
 * @license		Mozilla Public License, version 2.0
 * @link		http://github.com/joomlatools/joomlatools-console for the canonical source repository
 */

use Joomlatools\Console\Command\Extension;
use Joomlatools\Console\Joomla\Util;
use Symfony\Component\Console\Output\OutputInterface;

/**
 * Joomlatools Framework custom symlinker
 */
Extension\Symlink::registerSymlinker(function($project, $destination, $name, $projects, OutputInterface $output) {
    if (!is_file($project.'/composer.json')) {
        return false;
    }

    $manifest = json_decode(file_get_contents($project.'/composer.json'));

    if (!isset($manifest->name) || $manifest->name != 'joomlatools/framework') {
        return false;
    }

    // build the folders to symlink into
    $dirs = array(
        Util::buildTargetPath('/media/koowa', $destination),
        Util::buildTargetPath('/libraries/joomlatools-components', $destination)
    );

    foreach ($dirs as $dir)
    {
        if (!is_dir($dir))
        {
            if ($output->getVerbosity() >= OutputInterface::VERBOSITY_VERBOSE) {
                $output->writeln(" * creating empty directory `$dir`");
            }

            mkdir($dir, 0755, true);
        }
    }

    /*
     * Special treatment for media files
     */
    $media = array(
        $project.'/code/libraries/joomlatools/component/koowa/resources/assets' => Util::buildTargetPath('/media/koowa/com_koowa', $destination),
        $project.'/code/libraries/joomlatools/library/resources/assets' => Util::buildTargetPath('/media/koowa/framework', $destination),
    );

    foreach ($media as $from => $to)
    {
        if (is_dir($from) && !file_exists($to))
        {
            $from = Extension\Symlink::buildSymlinkPath($from, $to);

            if ($output->getVerbosity() >= OutputInterface::VERBOSITY_VERBOSE) {
                $output->writeln(" * creating link `$to` -> $from");
            }

            `ln -sf $from $to`;
        }
    }

    // Component assets
    $results = glob($project.'/code/libraries/joomlatools-components/*/resources/assets', GLOB_ONLYDIR);

    foreach ($results as $from)
    {
        $component = preg_replace('#^.*?joomlatools-components/([^/]+)/resources/assets#', '$1', $from);
        $to    = Util::buildTargetPath('/media/koowa/com_'.$component, $destination);

        if (!$component || is_link($to)) {
            continue;
        }

        if ($output->getVerbosity() >= OutputInterface::VERBOSITY_VERBOSE) {
            $output->writeln(" * creating link `$to` -> $from");
        }

        `ln -sf $from $to`;
    }

    // Let the default symlinker handle the rest
    return false;
});Copyright (c) 2018-present Fabien Potencier

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

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Polyfill\Php73;

/**
 * @author Gabriel Caruso <carusogabriel34@gmail.com>
 * @author Ion Bazan <ion.bazan@gmail.com>
 *
 * @internal
 */
final class Php73
{
    public static $startAt = 1533462603;

    /**
     * @param bool $asNum
     *
     * @return array|float|int
     */
    public static function hrtime($asNum = false)
    {
        $ns = microtime(false);
        $s = substr($ns, 11) - self::$startAt;
        $ns = 1E9 * (float) $ns;

        if ($asNum) {
            $ns += $s * 1E9;

            return \PHP_INT_SIZE === 4 ? $ns : (int) $ns;
        }

        return [$s, (int) $ns];
    }
}
Symfony Polyfill / Php73
========================

This component provides functions added to PHP 7.3 core:

- [`array_key_first`](https://php.net/array_key_first)
- [`array_key_last`](https://php.net/array_key_last)
- [`hrtime`](https://php.net/function.hrtime)
- [`is_countable`](https://php.net/is_countable)
- [`JsonException`](https://php.net/JsonException)

More information can be found in the
[main Polyfill README](https://github.com/symfony/polyfill/blob/main/README.md).

License
=======

This library is released under the [MIT license](LICENSE).
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

if (\PHP_VERSION_ID < 70300) {
    class JsonException extends Exception
    {
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

use Symfony\Polyfill\Php73 as p;

if (\PHP_VERSION_ID >= 70300) {
    return;
}

if (!function_exists('is_countable')) {
    function is_countable($value) { return is_array($value) || $value instanceof Countable || $value instanceof ResourceBundle || $value instanceof SimpleXmlElement; }
}
if (!function_exists('hrtime')) {
    require_once __DIR__.'/Php73.php';
    p\Php73::$startAt = (int) microtime(true);
    function hrtime($as_number = false) { return p\Php73::hrtime($as_number); }
}
if (!function_exists('array_key_first')) {
    function array_key_first(array $array) { foreach ($array as $key => $value) { return $key; } }
}
if (!function_exists('array_key_last')) {
    function array_key_last(array $array) { return key(array_slice($array, -1, 1, true)); }
}
{
    "name": "symfony/polyfill-php73",
    "type": "library",
    "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions",
    "keywords": ["polyfill", "shim", "compatibility", "portable"],
    "homepage": "https://symfony.com",
    "license": "MIT",
    "authors": [
        {
            "name": "Nicolas Grekas",
            "email": "p@tchwork.com"
        },
        {
            "name": "Symfony Community",
            "homepage": "https://symfony.com/contributors"
        }
    ],
    "require": {
        "php": ">=7.1"
    },
    "autoload": {
        "psr-4": { "Symfony\\Polyfill\\Php73\\": "" },
        "files": [ "bootstrap.php" ],
        "classmap": [ "Resources/stubs" ]
    },
    "minimum-stability": "dev",
    "extra": {
        "branch-alias": {
            "dev-main": "1.28-dev"
        },
        "thanks": {
            "name": "symfony/polyfill",
            "url": "https://github.com/symfony/polyfill"
        }
    }
}
Copyright (c) 2020-present Fabien Potencier

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

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Polyfill\Php80;

/**
 * @author Ion Bazan <ion.bazan@gmail.com>
 * @author Nico Oelgart <nicoswd@gmail.com>
 * @author Nicolas Grekas <p@tchwork.com>
 *
 * @internal
 */
final class Php80
{
    public static function fdiv(float $dividend, float $divisor): float
    {
        return @($dividend / $divisor);
    }

    public static function get_debug_type($value): string
    {
        switch (true) {
            case null === $value: return 'null';
            case \is_bool($value): return 'bool';
            case \is_string($value): return 'string';
            case \is_array($value): return 'array';
            case \is_int($value): return 'int';
            case \is_float($value): return 'float';
            case \is_object($value): break;
            case $value instanceof \__PHP_Incomplete_Class: return '__PHP_Incomplete_Class';
            default:
                if (null === $type = @get_resource_type($value)) {
                    return 'unknown';
                }

                if ('Unknown' === $type) {
                    $type = 'closed';
                }

                return "resource ($type)";
        }

        $class = \get_class($value);

        if (false === strpos($class, '@')) {
            return $class;
        }

        return (get_parent_class($class) ?: key(class_implements($class)) ?: 'class').'@anonymous';
    }

    public static function get_resource_id($res): int
    {
        if (!\is_resource($res) && null === @get_resource_type($res)) {
            throw new \TypeError(sprintf('Argument 1 passed to get_resource_id() must be of the type resource, %s given', get_debug_type($res)));
        }

        return (int) $res;
    }

    public static function preg_last_error_msg(): string
    {
        switch (preg_last_error()) {
            case \PREG_INTERNAL_ERROR:
                return 'Internal error';
            case \PREG_BAD_UTF8_ERROR:
                return 'Malformed UTF-8 characters, possibly incorrectly encoded';
            case \PREG_BAD_UTF8_OFFSET_ERROR:
                return 'The offset did not correspond to the beginning of a valid UTF-8 code point';
            case \PREG_BACKTRACK_LIMIT_ERROR:
                return 'Backtrack limit exhausted';
            case \PREG_RECURSION_LIMIT_ERROR:
                return 'Recursion limit exhausted';
            case \PREG_JIT_STACKLIMIT_ERROR:
                return 'JIT stack limit exhausted';
            case \PREG_NO_ERROR:
                return 'No error';
            default:
                return 'Unknown error';
        }
    }

    public static function str_contains(string $haystack, string $needle): bool
    {
        return '' === $needle || false !== strpos($haystack, $needle);
    }

    public static function str_starts_with(string $haystack, string $needle): bool
    {
        return 0 === strncmp($haystack, $needle, \strlen($needle));
    }

    public static function str_ends_with(string $haystack, string $needle): bool
    {
        if ('' === $needle || $needle === $haystack) {
            return true;
        }

        if ('' === $haystack) {
            return false;
        }

        $needleLength = \strlen($needle);

        return $needleLength <= \strlen($haystack) && 0 === substr_compare($haystack, $needle, -$needleLength);
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Polyfill\Php80;

/**
 * @author Fedonyuk Anton <info@ensostudio.ru>
 *
 * @internal
 */
class PhpToken implements \Stringable
{
    /**
     * @var int
     */
    public $id;

    /**
     * @var string
     */
    public $text;

    /**
     * @var int
     */
    public $line;

    /**
     * @var int
     */
    public $pos;

    public function __construct(int $id, string $text, int $line = -1, int $position = -1)
    {
        $this->id = $id;
        $this->text = $text;
        $this->line = $line;
        $this->pos = $position;
    }

    public function getTokenName(): ?string
    {
        if ('UNKNOWN' === $name = token_name($this->id)) {
            $name = \strlen($this->text) > 1 || \ord($this->text) < 32 ? null : $this->text;
        }

        return $name;
    }

    /**
     * @param int|string|array $kind
     */
    public function is($kind): bool
    {
        foreach ((array) $kind as $value) {
            if (\in_array($value, [$this->id, $this->text], true)) {
                return true;
            }
        }

        return false;
    }

    public function isIgnorable(): bool
    {
        return \in_array($this->id, [\T_WHITESPACE, \T_COMMENT, \T_DOC_COMMENT, \T_OPEN_TAG], true);
    }

    public function __toString(): string
    {
        return (string) $this->text;
    }

    /**
     * @return static[]
     */
    public static function tokenize(string $code, int $flags = 0): array
    {
        $line = 1;
        $position = 0;
        $tokens = token_get_all($code, $flags);
        foreach ($tokens as $index => $token) {
            if (\is_string($token)) {
                $id = \ord($token);
                $text = $token;
            } else {
                [$id, $text, $line] = $token;
            }
            $tokens[$index] = new static($id, $text, $line, $position);
            $position += \strlen($text);
        }

        return $tokens;
    }
}
Symfony Polyfill / Php80
========================

This component provides features added to PHP 8.0 core:

- [`Stringable`](https://php.net/stringable) interface
- [`fdiv`](https://php.net/fdiv)
- [`ValueError`](https://php.net/valueerror) class
- [`UnhandledMatchError`](https://php.net/unhandledmatcherror) class
- `FILTER_VALIDATE_BOOL` constant
- [`get_debug_type`](https://php.net/get_debug_type)
- [`PhpToken`](https://php.net/phptoken) class
- [`preg_last_error_msg`](https://php.net/preg_last_error_msg)
- [`str_contains`](https://php.net/str_contains)
- [`str_starts_with`](https://php.net/str_starts_with)
- [`str_ends_with`](https://php.net/str_ends_with)
- [`get_resource_id`](https://php.net/get_resource_id)

More information can be found in the
[main Polyfill README](https://github.com/symfony/polyfill/blob/main/README.md).

License
=======

This library is released under the [MIT license](LICENSE).
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

#[Attribute(Attribute::TARGET_CLASS)]
final class Attribute
{
    public const TARGET_CLASS = 1;
    public const TARGET_FUNCTION = 2;
    public const TARGET_METHOD = 4;
    public const TARGET_PROPERTY = 8;
    public const TARGET_CLASS_CONSTANT = 16;
    public const TARGET_PARAMETER = 32;
    public const TARGET_ALL = 63;
    public const IS_REPEATABLE = 64;

    /** @var int */
    public $flags;

    public function __construct(int $flags = self::TARGET_ALL)
    {
        $this->flags = $flags;
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

if (\PHP_VERSION_ID < 80000 && extension_loaded('tokenizer')) {
    class PhpToken extends Symfony\Polyfill\Php80\PhpToken
    {
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

if (\PHP_VERSION_ID < 80000) {
    interface Stringable
    {
        /**
         * @return string
         */
        public function __toString();
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

if (\PHP_VERSION_ID < 80000) {
    class UnhandledMatchError extends Error
    {
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

if (\PHP_VERSION_ID < 80000) {
    class ValueError extends Error
    {
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

use Symfony\Polyfill\Php80 as p;

if (\PHP_VERSION_ID >= 80000) {
    return;
}

if (!defined('FILTER_VALIDATE_BOOL') && defined('FILTER_VALIDATE_BOOLEAN')) {
    define('FILTER_VALIDATE_BOOL', \FILTER_VALIDATE_BOOLEAN);
}

if (!function_exists('fdiv')) {
    function fdiv(float $num1, float $num2): float { return p\Php80::fdiv($num1, $num2); }
}
if (!function_exists('preg_last_error_msg')) {
    function preg_last_error_msg(): string { return p\Php80::preg_last_error_msg(); }
}
if (!function_exists('str_contains')) {
    function str_contains(?string $haystack, ?string $needle): bool { return p\Php80::str_contains($haystack ?? '', $needle ?? ''); }
}
if (!function_exists('str_starts_with')) {
    function str_starts_with(?string $haystack, ?string $needle): bool { return p\Php80::str_starts_with($haystack ?? '', $needle ?? ''); }
}
if (!function_exists('str_ends_with')) {
    function str_ends_with(?string $haystack, ?string $needle): bool { return p\Php80::str_ends_with($haystack ?? '', $needle ?? ''); }
}
if (!function_exists('get_debug_type')) {
    function get_debug_type($value): string { return p\Php80::get_debug_type($value); }
}
if (!function_exists('get_resource_id')) {
    function get_resource_id($resource): int { return p\Php80::get_resource_id($resource); }
}
{
    "name": "symfony/polyfill-php80",
    "type": "library",
    "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions",
    "keywords": ["polyfill", "shim", "compatibility", "portable"],
    "homepage": "https://symfony.com",
    "license": "MIT",
    "authors": [
        {
            "name": "Ion Bazan",
            "email": "ion.bazan@gmail.com"
        },
        {
            "name": "Nicolas Grekas",
            "email": "p@tchwork.com"
        },
        {
            "name": "Symfony Community",
            "homepage": "https://symfony.com/contributors"
        }
    ],
    "require": {
        "php": ">=7.1"
    },
    "autoload": {
        "psr-4": { "Symfony\\Polyfill\\Php80\\": "" },
        "files": [ "bootstrap.php" ],
        "classmap": [ "Resources/stubs" ]
    },
    "minimum-stability": "dev",
    "extra": {
        "branch-alias": {
            "dev-main": "1.28-dev"
        },
        "thanks": {
            "name": "symfony/polyfill",
            "url": "https://github.com/symfony/polyfill"
        }
    }
}
Copyright (c) 2015-present Fabien Potencier

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

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Polyfill\Mbstring;

/**
 * Partial mbstring implementation in PHP, iconv based, UTF-8 centric.
 *
 * Implemented:
 * - mb_chr                  - Returns a specific character from its Unicode code point
 * - mb_convert_encoding     - Convert character encoding
 * - mb_convert_variables    - Convert character code in variable(s)
 * - mb_decode_mimeheader    - Decode string in MIME header field
 * - mb_encode_mimeheader    - Encode string for MIME header XXX NATIVE IMPLEMENTATION IS REALLY BUGGED
 * - mb_decode_numericentity - Decode HTML numeric string reference to character
 * - mb_encode_numericentity - Encode character to HTML numeric string reference
 * - mb_convert_case         - Perform case folding on a string
 * - mb_detect_encoding      - Detect character encoding
 * - mb_get_info             - Get internal settings of mbstring
 * - mb_http_input           - Detect HTTP input character encoding
 * - mb_http_output          - Set/Get HTTP output character encoding
 * - mb_internal_encoding    - Set/Get internal character encoding
 * - mb_list_encodings       - Returns an array of all supported encodings
 * - mb_ord                  - Returns the Unicode code point of a character
 * - mb_output_handler       - Callback function converts character encoding in output buffer
 * - mb_scrub                - Replaces ill-formed byte sequences with substitute characters
 * - mb_strlen               - Get string length
 * - mb_strpos               - Find position of first occurrence of string in a string
 * - mb_strrpos              - Find position of last occurrence of a string in a string
 * - mb_str_split            - Convert a string to an array
 * - mb_strtolower           - Make a string lowercase
 * - mb_strtoupper           - Make a string uppercase
 * - mb_substitute_character - Set/Get substitution character
 * - mb_substr               - Get part of string
 * - mb_stripos              - Finds position of first occurrence of a string within another, case insensitive
 * - mb_stristr              - Finds first occurrence of a string within another, case insensitive
 * - mb_strrchr              - Finds the last occurrence of a character in a string within another
 * - mb_strrichr             - Finds the last occurrence of a character in a string within another, case insensitive
 * - mb_strripos             - Finds position of last occurrence of a string within another, case insensitive
 * - mb_strstr               - Finds first occurrence of a string within another
 * - mb_strwidth             - Return width of string
 * - mb_substr_count         - Count the number of substring occurrences
 *
 * Not implemented:
 * - mb_convert_kana         - Convert "kana" one from another ("zen-kaku", "han-kaku" and more)
 * - mb_ereg_*               - Regular expression with multibyte support
 * - mb_parse_str            - Parse GET/POST/COOKIE data and set global variable
 * - mb_preferred_mime_name  - Get MIME charset string
 * - mb_regex_encoding       - Returns current encoding for multibyte regex as string
 * - mb_regex_set_options    - Set/Get the default options for mbregex functions
 * - mb_send_mail            - Send encoded mail
 * - mb_split                - Split multibyte string using regular expression
 * - mb_strcut               - Get part of string
 * - mb_strimwidth           - Get truncated string with specified width
 *
 * @author Nicolas Grekas <p@tchwork.com>
 *
 * @internal
 */
final class Mbstring
{
    public const MB_CASE_FOLD = \PHP_INT_MAX;

    private const SIMPLE_CASE_FOLD = [
        ['µ', 'ſ', "\xCD\x85", 'ς', "\xCF\x90", "\xCF\x91", "\xCF\x95", "\xCF\x96", "\xCF\xB0", "\xCF\xB1", "\xCF\xB5", "\xE1\xBA\x9B", "\xE1\xBE\xBE"],
        ['μ', 's', 'ι',        'σ', 'β',        'θ',        'φ',        'π',        'κ',        'ρ',        'ε',        "\xE1\xB9\xA1", 'ι'],
    ];

    private static $encodingList = ['ASCII', 'UTF-8'];
    private static $language = 'neutral';
    private static $internalEncoding = 'UTF-8';

    public static function mb_convert_encoding($s, $toEncoding, $fromEncoding = null)
    {
        if (\is_array($fromEncoding) || (null !== $fromEncoding && false !== strpos($fromEncoding, ','))) {
            $fromEncoding = self::mb_detect_encoding($s, $fromEncoding);
        } else {
            $fromEncoding = self::getEncoding($fromEncoding);
        }

        $toEncoding = self::getEncoding($toEncoding);

        if ('BASE64' === $fromEncoding) {
            $s = base64_decode($s);
            $fromEncoding = $toEncoding;
        }

        if ('BASE64' === $toEncoding) {
            return base64_encode($s);
        }

        if ('HTML-ENTITIES' === $toEncoding || 'HTML' === $toEncoding) {
            if ('HTML-ENTITIES' === $fromEncoding || 'HTML' === $fromEncoding) {
                $fromEncoding = 'Windows-1252';
            }
            if ('UTF-8' !== $fromEncoding) {
                $s = iconv($fromEncoding, 'UTF-8//IGNORE', $s);
            }

            return preg_replace_callback('/[\x80-\xFF]+/', [__CLASS__, 'html_encoding_callback'], $s);
        }

        if ('HTML-ENTITIES' === $fromEncoding) {
            $s = html_entity_decode($s, \ENT_COMPAT, 'UTF-8');
            $fromEncoding = 'UTF-8';
        }

        return iconv($fromEncoding, $toEncoding.'//IGNORE', $s);
    }

    public static function mb_convert_variables($toEncoding, $fromEncoding, &...$vars)
    {
        $ok = true;
        array_walk_recursive($vars, function (&$v) use (&$ok, $toEncoding, $fromEncoding) {
            if (false === $v = self::mb_convert_encoding($v, $toEncoding, $fromEncoding)) {
                $ok = false;
            }
        });

        return $ok ? $fromEncoding : false;
    }

    public static function mb_decode_mimeheader($s)
    {
        return iconv_mime_decode($s, 2, self::$internalEncoding);
    }

    public static function mb_encode_mimeheader($s, $charset = null, $transferEncoding = null, $linefeed = null, $indent = null)
    {
        trigger_error('mb_encode_mimeheader() is bugged. Please use iconv_mime_encode() instead', \E_USER_WARNING);
    }

    public static function mb_decode_numericentity($s, $convmap, $encoding = null)
    {
        if (null !== $s && !\is_scalar($s) && !(\is_object($s) && method_exists($s, '__toString'))) {
            trigger_error('mb_decode_numericentity() expects parameter 1 to be string, '.\gettype($s).' given', \E_USER_WARNING);

            return null;
        }

        if (!\is_array($convmap) || (80000 > \PHP_VERSION_ID && !$convmap)) {
            return false;
        }

        if (null !== $encoding && !\is_scalar($encoding)) {
            trigger_error('mb_decode_numericentity() expects parameter 3 to be string, '.\gettype($s).' given', \E_USER_WARNING);

            return '';  // Instead of null (cf. mb_encode_numericentity).
        }

        $s = (string) $s;
        if ('' === $s) {
            return '';
        }

        $encoding = self::getEncoding($encoding);

        if ('UTF-8' === $encoding) {
            $encoding = null;
            if (!preg_match('//u', $s)) {
                $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s);
            }
        } else {
            $s = iconv($encoding, 'UTF-8//IGNORE', $s);
        }

        $cnt = floor(\count($convmap) / 4) * 4;

        for ($i = 0; $i < $cnt; $i += 4) {
            // collector_decode_htmlnumericentity ignores $convmap[$i + 3]
            $convmap[$i] += $convmap[$i + 2];
            $convmap[$i + 1] += $convmap[$i + 2];
        }

        $s = preg_replace_callback('/&#(?:0*([0-9]+)|x0*([0-9a-fA-F]+))(?!&);?/', function (array $m) use ($cnt, $convmap) {
            $c = isset($m[2]) ? (int) hexdec($m[2]) : $m[1];
            for ($i = 0; $i < $cnt; $i += 4) {
                if ($c >= $convmap[$i] && $c <= $convmap[$i + 1]) {
                    return self::mb_chr($c - $convmap[$i + 2]);
                }
            }

            return $m[0];
        }, $s);

        if (null === $encoding) {
            return $s;
        }

        return iconv('UTF-8', $encoding.'//IGNORE', $s);
    }

    public static function mb_encode_numericentity($s, $convmap, $encoding = null, $is_hex = false)
    {
        if (null !== $s && !\is_scalar($s) && !(\is_object($s) && method_exists($s, '__toString'))) {
            trigger_error('mb_encode_numericentity() expects parameter 1 to be string, '.\gettype($s).' given', \E_USER_WARNING);

            return null;
        }

        if (!\is_array($convmap) || (80000 > \PHP_VERSION_ID && !$convmap)) {
            return false;
        }

        if (null !== $encoding && !\is_scalar($encoding)) {
            trigger_error('mb_encode_numericentity() expects parameter 3 to be string, '.\gettype($s).' given', \E_USER_WARNING);

            return null;  // Instead of '' (cf. mb_decode_numericentity).
        }

        if (null !== $is_hex && !\is_scalar($is_hex)) {
            trigger_error('mb_encode_numericentity() expects parameter 4 to be boolean, '.\gettype($s).' given', \E_USER_WARNING);

            return null;
        }

        $s = (string) $s;
        if ('' === $s) {
            return '';
        }

        $encoding = self::getEncoding($encoding);

        if ('UTF-8' === $encoding) {
            $encoding = null;
            if (!preg_match('//u', $s)) {
                $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s);
            }
        } else {
            $s = iconv($encoding, 'UTF-8//IGNORE', $s);
        }

        static $ulenMask = ["\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4];

        $cnt = floor(\count($convmap) / 4) * 4;
        $i = 0;
        $len = \strlen($s);
        $result = '';

        while ($i < $len) {
            $ulen = $s[$i] < "\x80" ? 1 : $ulenMask[$s[$i] & "\xF0"];
            $uchr = substr($s, $i, $ulen);
            $i += $ulen;
            $c = self::mb_ord($uchr);

            for ($j = 0; $j < $cnt; $j += 4) {
                if ($c >= $convmap[$j] && $c <= $convmap[$j + 1]) {
                    $cOffset = ($c + $convmap[$j + 2]) & $convmap[$j + 3];
                    $result .= $is_hex ? sprintf('&#x%X;', $cOffset) : '&#'.$cOffset.';';
                    continue 2;
                }
            }
            $result .= $uchr;
        }

        if (null === $encoding) {
            return $result;
        }

        return iconv('UTF-8', $encoding.'//IGNORE', $result);
    }

    public static function mb_convert_case($s, $mode, $encoding = null)
    {
        $s = (string) $s;
        if ('' === $s) {
            return '';
        }

        $encoding = self::getEncoding($encoding);

        if ('UTF-8' === $encoding) {
            $encoding = null;
            if (!preg_match('//u', $s)) {
                $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s);
            }
        } else {
            $s = iconv($encoding, 'UTF-8//IGNORE', $s);
        }

        if (\MB_CASE_TITLE == $mode) {
            static $titleRegexp = null;
            if (null === $titleRegexp) {
                $titleRegexp = self::getData('titleCaseRegexp');
            }
            $s = preg_replace_callback($titleRegexp, [__CLASS__, 'title_case'], $s);
        } else {
            if (\MB_CASE_UPPER == $mode) {
                static $upper = null;
                if (null === $upper) {
                    $upper = self::getData('upperCase');
                }
                $map = $upper;
            } else {
                if (self::MB_CASE_FOLD === $mode) {
                    static $caseFolding = null;
                    if (null === $caseFolding) {
                        $caseFolding = self::getData('caseFolding');
                    }
                    $s = strtr($s, $caseFolding);
                }

                static $lower = null;
                if (null === $lower) {
                    $lower = self::getData('lowerCase');
                }
                $map = $lower;
            }

            static $ulenMask = ["\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4];

            $i = 0;
            $len = \strlen($s);

            while ($i < $len) {
                $ulen = $s[$i] < "\x80" ? 1 : $ulenMask[$s[$i] & "\xF0"];
                $uchr = substr($s, $i, $ulen);
                $i += $ulen;

                if (isset($map[$uchr])) {
                    $uchr = $map[$uchr];
                    $nlen = \strlen($uchr);

                    if ($nlen == $ulen) {
                        $nlen = $i;
                        do {
                            $s[--$nlen] = $uchr[--$ulen];
                        } while ($ulen);
                    } else {
                        $s = substr_replace($s, $uchr, $i - $ulen, $ulen);
                        $len += $nlen - $ulen;
                        $i += $nlen - $ulen;
                    }
                }
            }
        }

        if (null === $encoding) {
            return $s;
        }

        return iconv('UTF-8', $encoding.'//IGNORE', $s);
    }

    public static function mb_internal_encoding($encoding = null)
    {
        if (null === $encoding) {
            return self::$internalEncoding;
        }

        $normalizedEncoding = self::getEncoding($encoding);

        if ('UTF-8' === $normalizedEncoding || false !== @iconv($normalizedEncoding, $normalizedEncoding, ' ')) {
            self::$internalEncoding = $normalizedEncoding;

            return true;
        }

        if (80000 > \PHP_VERSION_ID) {
            return false;
        }

        throw new \ValueError(sprintf('Argument #1 ($encoding) must be a valid encoding, "%s" given', $encoding));
    }

    public static function mb_language($lang = null)
    {
        if (null === $lang) {
            return self::$language;
        }

        switch ($normalizedLang = strtolower($lang)) {
            case 'uni':
            case 'neutral':
                self::$language = $normalizedLang;

                return true;
        }

        if (80000 > \PHP_VERSION_ID) {
            return false;
        }

        throw new \ValueError(sprintf('Argument #1 ($language) must be a valid language, "%s" given', $lang));
    }

    public static function mb_list_encodings()
    {
        return ['UTF-8'];
    }

    public static function mb_encoding_aliases($encoding)
    {
        switch (strtoupper($encoding)) {
            case 'UTF8':
            case 'UTF-8':
                return ['utf8'];
        }

        return false;
    }

    public static function mb_check_encoding($var = null, $encoding = null)
    {
        if (PHP_VERSION_ID < 70200 && \is_array($var)) {
            trigger_error('mb_check_encoding() expects parameter 1 to be string, array given', \E_USER_WARNING);

            return null;
        }

        if (null === $encoding) {
            if (null === $var) {
                return false;
            }
            $encoding = self::$internalEncoding;
        }

        if (!\is_array($var)) {
            return self::mb_detect_encoding($var, [$encoding]) || false !== @iconv($encoding, $encoding, $var);
        }

        foreach ($var as $key => $value) {
            if (!self::mb_check_encoding($key, $encoding)) {
                return false;
            }
            if (!self::mb_check_encoding($value, $encoding)) {
                return false;
            }
        }

        return true;

    }

    public static function mb_detect_encoding($str, $encodingList = null, $strict = false)
    {
        if (null === $encodingList) {
            $encodingList = self::$encodingList;
        } else {
            if (!\is_array($encodingList)) {
                $encodingList = array_map('trim', explode(',', $encodingList));
            }
            $encodingList = array_map('strtoupper', $encodingList);
        }

        foreach ($encodingList as $enc) {
            switch ($enc) {
                case 'ASCII':
                    if (!preg_match('/[\x80-\xFF]/', $str)) {
                        return $enc;
                    }
                    break;

                case 'UTF8':
                case 'UTF-8':
                    if (preg_match('//u', $str)) {
                        return 'UTF-8';
                    }
                    break;

                default:
                    if (0 === strncmp($enc, 'ISO-8859-', 9)) {
                        return $enc;
                    }
            }
        }

        return false;
    }

    public static function mb_detect_order($encodingList = null)
    {
        if (null === $encodingList) {
            return self::$encodingList;
        }

        if (!\is_array($encodingList)) {
            $encodingList = array_map('trim', explode(',', $encodingList));
        }
        $encodingList = array_map('strtoupper', $encodingList);

        foreach ($encodingList as $enc) {
            switch ($enc) {
                default:
                    if (strncmp($enc, 'ISO-8859-', 9)) {
                        return false;
                    }
                    // no break
                case 'ASCII':
                case 'UTF8':
                case 'UTF-8':
            }
        }

        self::$encodingList = $encodingList;

        return true;
    }

    public static function mb_strlen($s, $encoding = null)
    {
        $encoding = self::getEncoding($encoding);
        if ('CP850' === $encoding || 'ASCII' === $encoding) {
            return \strlen($s);
        }

        return @iconv_strlen($s, $encoding);
    }

    public static function mb_strpos($haystack, $needle, $offset = 0, $encoding = null)
    {
        $encoding = self::getEncoding($encoding);
        if ('CP850' === $encoding || 'ASCII' === $encoding) {
            return strpos($haystack, $needle, $offset);
        }

        $needle = (string) $needle;
        if ('' === $needle) {
            if (80000 > \PHP_VERSION_ID) {
                trigger_error(__METHOD__.': Empty delimiter', \E_USER_WARNING);

                return false;
            }

            return 0;
        }

        return iconv_strpos($haystack, $needle, $offset, $encoding);
    }

    public static function mb_strrpos($haystack, $needle, $offset = 0, $encoding = null)
    {
        $encoding = self::getEncoding($encoding);
        if ('CP850' === $encoding || 'ASCII' === $encoding) {
            return strrpos($haystack, $needle, $offset);
        }

        if ($offset != (int) $offset) {
            $offset = 0;
        } elseif ($offset = (int) $offset) {
            if ($offset < 0) {
                if (0 > $offset += self::mb_strlen($needle)) {
                    $haystack = self::mb_substr($haystack, 0, $offset, $encoding);
                }
                $offset = 0;
            } else {
                $haystack = self::mb_substr($haystack, $offset, 2147483647, $encoding);
            }
        }

        $pos = '' !== $needle || 80000 > \PHP_VERSION_ID
            ? iconv_strrpos($haystack, $needle, $encoding)
            : self::mb_strlen($haystack, $encoding);

        return false !== $pos ? $offset + $pos : false;
    }

    public static function mb_str_split($string, $split_length = 1, $encoding = null)
    {
        if (null !== $string && !\is_scalar($string) && !(\is_object($string) && method_exists($string, '__toString'))) {
            trigger_error('mb_str_split() expects parameter 1 to be string, '.\gettype($string).' given', \E_USER_WARNING);

            return null;
        }

        if (1 > $split_length = (int) $split_length) {
            if (80000 > \PHP_VERSION_ID) {
                trigger_error('The length of each segment must be greater than zero', \E_USER_WARNING);

                return false;
            }

            throw new \ValueError('Argument #2 ($length) must be greater than 0');
        }

        if (null === $encoding) {
            $encoding = mb_internal_encoding();
        }

        if ('UTF-8' === $encoding = self::getEncoding($encoding)) {
            $rx = '/(';
            while (65535 < $split_length) {
                $rx .= '.{65535}';
                $split_length -= 65535;
            }
            $rx .= '.{'.$split_length.'})/us';

            return preg_split($rx, $string, -1, \PREG_SPLIT_DELIM_CAPTURE | \PREG_SPLIT_NO_EMPTY);
        }

        $result = [];
        $length = mb_strlen($string, $encoding);

        for ($i = 0; $i < $length; $i += $split_length) {
            $result[] = mb_substr($string, $i, $split_length, $encoding);
        }

        return $result;
    }

    public static function mb_strtolower($s, $encoding = null)
    {
        return self::mb_convert_case($s, \MB_CASE_LOWER, $encoding);
    }

    public static function mb_strtoupper($s, $encoding = null)
    {
        return self::mb_convert_case($s, \MB_CASE_UPPER, $encoding);
    }

    public static function mb_substitute_character($c = null)
    {
        if (null === $c) {
            return 'none';
        }
        if (0 === strcasecmp($c, 'none')) {
            return true;
        }
        if (80000 > \PHP_VERSION_ID) {
            return false;
        }
        if (\is_int($c) || 'long' === $c || 'entity' === $c) {
            return false;
        }

        throw new \ValueError('Argument #1 ($substitute_character) must be "none", "long", "entity" or a valid codepoint');
    }

    public static function mb_substr($s, $start, $length = null, $encoding = null)
    {
        $encoding = self::getEncoding($encoding);
        if ('CP850' === $encoding || 'ASCII' === $encoding) {
            return (string) substr($s, $start, null === $length ? 2147483647 : $length);
        }

        if ($start < 0) {
            $start = iconv_strlen($s, $encoding) + $start;
            if ($start < 0) {
                $start = 0;
            }
        }

        if (null === $length) {
            $length = 2147483647;
        } elseif ($length < 0) {
            $length = iconv_strlen($s, $encoding) + $length - $start;
            if ($length < 0) {
                return '';
            }
        }

        return (string) iconv_substr($s, $start, $length, $encoding);
    }

    public static function mb_stripos($haystack, $needle, $offset = 0, $encoding = null)
    {
        [$haystack, $needle] = str_replace(self::SIMPLE_CASE_FOLD[0], self::SIMPLE_CASE_FOLD[1], [
            self::mb_convert_case($haystack, \MB_CASE_LOWER, $encoding),
            self::mb_convert_case($needle, \MB_CASE_LOWER, $encoding),
        ]);

        return self::mb_strpos($haystack, $needle, $offset, $encoding);
    }

    public static function mb_stristr($haystack, $needle, $part = false, $encoding = null)
    {
        $pos = self::mb_stripos($haystack, $needle, 0, $encoding);

        return self::getSubpart($pos, $part, $haystack, $encoding);
    }

    public static function mb_strrchr($haystack, $needle, $part = false, $encoding = null)
    {
        $encoding = self::getEncoding($encoding);
        if ('CP850' === $encoding || 'ASCII' === $encoding) {
            $pos = strrpos($haystack, $needle);
        } else {
            $needle = self::mb_substr($needle, 0, 1, $encoding);
            $pos = iconv_strrpos($haystack, $needle, $encoding);
        }

        return self::getSubpart($pos, $part, $haystack, $encoding);
    }

    public static function mb_strrichr($haystack, $needle, $part = false, $encoding = null)
    {
        $needle = self::mb_substr($needle, 0, 1, $encoding);
        $pos = self::mb_strripos($haystack, $needle, $encoding);

        return self::getSubpart($pos, $part, $haystack, $encoding);
    }

    public static function mb_strripos($haystack, $needle, $offset = 0, $encoding = null)
    {
        $haystack = self::mb_convert_case($haystack, \MB_CASE_LOWER, $encoding);
        $needle = self::mb_convert_case($needle, \MB_CASE_LOWER, $encoding);

        $haystack = str_replace(self::SIMPLE_CASE_FOLD[0], self::SIMPLE_CASE_FOLD[1], $haystack);
        $needle = str_replace(self::SIMPLE_CASE_FOLD[0], self::SIMPLE_CASE_FOLD[1], $needle);

        return self::mb_strrpos($haystack, $needle, $offset, $encoding);
    }

    public static function mb_strstr($haystack, $needle, $part = false, $encoding = null)
    {
        $pos = strpos($haystack, $needle);
        if (false === $pos) {
            return false;
        }
        if ($part) {
            return substr($haystack, 0, $pos);
        }

        return substr($haystack, $pos);
    }

    public static function mb_get_info($type = 'all')
    {
        $info = [
            'internal_encoding' => self::$internalEncoding,
            'http_output' => 'pass',
            'http_output_conv_mimetypes' => '^(text/|application/xhtml\+xml)',
            'func_overload' => 0,
            'func_overload_list' => 'no overload',
            'mail_charset' => 'UTF-8',
            'mail_header_encoding' => 'BASE64',
            'mail_body_encoding' => 'BASE64',
            'illegal_chars' => 0,
            'encoding_translation' => 'Off',
            'language' => self::$language,
            'detect_order' => self::$encodingList,
            'substitute_character' => 'none',
            'strict_detection' => 'Off',
        ];

        if ('all' === $type) {
            return $info;
        }
        if (isset($info[$type])) {
            return $info[$type];
        }

        return false;
    }

    public static function mb_http_input($type = '')
    {
        return false;
    }

    public static function mb_http_output($encoding = null)
    {
        return null !== $encoding ? 'pass' === $encoding : 'pass';
    }

    public static function mb_strwidth($s, $encoding = null)
    {
        $encoding = self::getEncoding($encoding);

        if ('UTF-8' !== $encoding) {
            $s = iconv($encoding, 'UTF-8//IGNORE', $s);
        }

        $s = preg_replace('/[\x{1100}-\x{115F}\x{2329}\x{232A}\x{2E80}-\x{303E}\x{3040}-\x{A4CF}\x{AC00}-\x{D7A3}\x{F900}-\x{FAFF}\x{FE10}-\x{FE19}\x{FE30}-\x{FE6F}\x{FF00}-\x{FF60}\x{FFE0}-\x{FFE6}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}]/u', '', $s, -1, $wide);

        return ($wide << 1) + iconv_strlen($s, 'UTF-8');
    }

    public static function mb_substr_count($haystack, $needle, $encoding = null)
    {
        return substr_count($haystack, $needle);
    }

    public static function mb_output_handler($contents, $status)
    {
        return $contents;
    }

    public static function mb_chr($code, $encoding = null)
    {
        if (0x80 > $code %= 0x200000) {
            $s = \chr($code);
        } elseif (0x800 > $code) {
            $s = \chr(0xC0 | $code >> 6).\chr(0x80 | $code & 0x3F);
        } elseif (0x10000 > $code) {
            $s = \chr(0xE0 | $code >> 12).\chr(0x80 | $code >> 6 & 0x3F).\chr(0x80 | $code & 0x3F);
        } else {
            $s = \chr(0xF0 | $code >> 18).\chr(0x80 | $code >> 12 & 0x3F).\chr(0x80 | $code >> 6 & 0x3F).\chr(0x80 | $code & 0x3F);
        }

        if ('UTF-8' !== $encoding = self::getEncoding($encoding)) {
            $s = mb_convert_encoding($s, $encoding, 'UTF-8');
        }

        return $s;
    }

    public static function mb_ord($s, $encoding = null)
    {
        if ('UTF-8' !== $encoding = self::getEncoding($encoding)) {
            $s = mb_convert_encoding($s, 'UTF-8', $encoding);
        }

        if (1 === \strlen($s)) {
            return \ord($s);
        }

        $code = ($s = unpack('C*', substr($s, 0, 4))) ? $s[1] : 0;
        if (0xF0 <= $code) {
            return (($code - 0xF0) << 18) + (($s[2] - 0x80) << 12) + (($s[3] - 0x80) << 6) + $s[4] - 0x80;
        }
        if (0xE0 <= $code) {
            return (($code - 0xE0) << 12) + (($s[2] - 0x80) << 6) + $s[3] - 0x80;
        }
        if (0xC0 <= $code) {
            return (($code - 0xC0) << 6) + $s[2] - 0x80;
        }

        return $code;
    }

    public static function mb_str_pad(string $string, int $length, string $pad_string = ' ', int $pad_type = \STR_PAD_RIGHT, string $encoding = null): string
    {
        if (!\in_array($pad_type, [\STR_PAD_RIGHT, \STR_PAD_LEFT, \STR_PAD_BOTH], true)) {
            throw new \ValueError('mb_str_pad(): Argument #4 ($pad_type) must be STR_PAD_LEFT, STR_PAD_RIGHT, or STR_PAD_BOTH');
        }

        if (null === $encoding) {
            $encoding = self::mb_internal_encoding();
        }

        try {
            $validEncoding = @self::mb_check_encoding('', $encoding);
        } catch (\ValueError $e) {
            throw new \ValueError(sprintf('mb_str_pad(): Argument #5 ($encoding) must be a valid encoding, "%s" given', $encoding));
        }

        // BC for PHP 7.3 and lower
        if (!$validEncoding) {
            throw new \ValueError(sprintf('mb_str_pad(): Argument #5 ($encoding) must be a valid encoding, "%s" given', $encoding));
        }

        if (self::mb_strlen($pad_string, $encoding) <= 0) {
            throw new \ValueError('mb_str_pad(): Argument #3 ($pad_string) must be a non-empty string');
        }

        $paddingRequired = $length - self::mb_strlen($string, $encoding);

        if ($paddingRequired < 1) {
            return $string;
        }

        switch ($pad_type) {
            case \STR_PAD_LEFT:
                return self::mb_substr(str_repeat($pad_string, $paddingRequired), 0, $paddingRequired, $encoding).$string;
            case \STR_PAD_RIGHT:
                return $string.self::mb_substr(str_repeat($pad_string, $paddingRequired), 0, $paddingRequired, $encoding);
            default:
                $leftPaddingLength = floor($paddingRequired / 2);
                $rightPaddingLength = $paddingRequired - $leftPaddingLength;

                return self::mb_substr(str_repeat($pad_string, $leftPaddingLength), 0, $leftPaddingLength, $encoding).$string.self::mb_substr(str_repeat($pad_string, $rightPaddingLength), 0, $rightPaddingLength, $encoding);
        }
    }

    private static function getSubpart($pos, $part, $haystack, $encoding)
    {
        if (false === $pos) {
            return false;
        }
        if ($part) {
            return self::mb_substr($haystack, 0, $pos, $encoding);
        }

        return self::mb_substr($haystack, $pos, null, $encoding);
    }

    private static function html_encoding_callback(array $m)
    {
        $i = 1;
        $entities = '';
        $m = unpack('C*', htmlentities($m[0], \ENT_COMPAT, 'UTF-8'));

        while (isset($m[$i])) {
            if (0x80 > $m[$i]) {
                $entities .= \chr($m[$i++]);
                continue;
            }
            if (0xF0 <= $m[$i]) {
                $c = (($m[$i++] - 0xF0) << 18) + (($m[$i++] - 0x80) << 12) + (($m[$i++] - 0x80) << 6) + $m[$i++] - 0x80;
            } elseif (0xE0 <= $m[$i]) {
                $c = (($m[$i++] - 0xE0) << 12) + (($m[$i++] - 0x80) << 6) + $m[$i++] - 0x80;
            } else {
                $c = (($m[$i++] - 0xC0) << 6) + $m[$i++] - 0x80;
            }

            $entities .= '&#'.$c.';';
        }

        return $entities;
    }

    private static function title_case(array $s)
    {
        return self::mb_convert_case($s[1], \MB_CASE_UPPER, 'UTF-8').self::mb_convert_case($s[2], \MB_CASE_LOWER, 'UTF-8');
    }

    private static function getData($file)
    {
        if (file_exists($file = __DIR__.'/Resources/unidata/'.$file.'.php')) {
            return require $file;
        }

        return false;
    }

    private static function getEncoding($encoding)
    {
        if (null === $encoding) {
            return self::$internalEncoding;
        }

        if ('UTF-8' === $encoding) {
            return 'UTF-8';
        }

        $encoding = strtoupper($encoding);

        if ('8BIT' === $encoding || 'BINARY' === $encoding) {
            return 'CP850';
        }

        if ('UTF8' === $encoding) {
            return 'UTF-8';
        }

        return $encoding;
    }
}
Symfony Polyfill / Mbstring
===========================

This component provides a partial, native PHP implementation for the
[Mbstring](https://php.net/mbstring) extension.

More information can be found in the
[main Polyfill README](https://github.com/symfony/polyfill/blob/main/README.md).

License
=======

This library is released under the [MIT license](LICENSE).
<?php

return [
    'İ' => 'i̇',
    'µ' => 'μ',
    'ſ' => 's',
    'ͅ' => 'ι',
    'ς' => 'σ',
    'ϐ' => 'β',
    'ϑ' => 'θ',
    'ϕ' => 'φ',
    'ϖ' => 'π',
    'ϰ' => 'κ',
    'ϱ' => 'ρ',
    'ϵ' => 'ε',
    'ẛ' => 'ṡ',
    'ι' => 'ι',
    'ß' => 'ss',
    'ʼn' => 'ʼn',
    'ǰ' => 'ǰ',
    'ΐ' => 'ΐ',
    'ΰ' => 'ΰ',
    'և' => 'եւ',
    'ẖ' => 'ẖ',
    'ẗ' => 'ẗ',
    'ẘ' => 'ẘ',
    'ẙ' => 'ẙ',
    'ẚ' => 'aʾ',
    'ẞ' => 'ss',
    'ὐ' => 'ὐ',
    'ὒ' => 'ὒ',
    'ὔ' => 'ὔ',
    'ὖ' => 'ὖ',
    'ᾀ' => 'ἀι',
    'ᾁ' => 'ἁι',
    'ᾂ' => 'ἂι',
    'ᾃ' => 'ἃι',
    'ᾄ' => 'ἄι',
    'ᾅ' => 'ἅι',
    'ᾆ' => 'ἆι',
    'ᾇ' => 'ἇι',
    'ᾈ' => 'ἀι',
    'ᾉ' => 'ἁι',
    'ᾊ' => 'ἂι',
    'ᾋ' => 'ἃι',
    'ᾌ' => 'ἄι',
    'ᾍ' => 'ἅι',
    'ᾎ' => 'ἆι',
    'ᾏ' => 'ἇι',
    'ᾐ' => 'ἠι',
    'ᾑ' => 'ἡι',
    'ᾒ' => 'ἢι',
    'ᾓ' => 'ἣι',
    'ᾔ' => 'ἤι',
    'ᾕ' => 'ἥι',
    'ᾖ' => 'ἦι',
    'ᾗ' => 'ἧι',
    'ᾘ' => 'ἠι',
    'ᾙ' => 'ἡι',
    'ᾚ' => 'ἢι',
    'ᾛ' => 'ἣι',
    'ᾜ' => 'ἤι',
    'ᾝ' => 'ἥι',
    'ᾞ' => 'ἦι',
    'ᾟ' => 'ἧι',
    'ᾠ' => 'ὠι',
    'ᾡ' => 'ὡι',
    'ᾢ' => 'ὢι',
    'ᾣ' => 'ὣι',
    'ᾤ' => 'ὤι',
    'ᾥ' => 'ὥι',
    'ᾦ' => 'ὦι',
    'ᾧ' => 'ὧι',
    'ᾨ' => 'ὠι',
    'ᾩ' => 'ὡι',
    'ᾪ' => 'ὢι',
    'ᾫ' => 'ὣι',
    'ᾬ' => 'ὤι',
    'ᾭ' => 'ὥι',
    'ᾮ' => 'ὦι',
    'ᾯ' => 'ὧι',
    'ᾲ' => 'ὰι',
    'ᾳ' => 'αι',
    'ᾴ' => 'άι',
    'ᾶ' => 'ᾶ',
    'ᾷ' => 'ᾶι',
    'ᾼ' => 'αι',
    'ῂ' => 'ὴι',
    'ῃ' => 'ηι',
    'ῄ' => 'ήι',
    'ῆ' => 'ῆ',
    'ῇ' => 'ῆι',
    'ῌ' => 'ηι',
    'ῒ' => 'ῒ',
    'ῖ' => 'ῖ',
    'ῗ' => 'ῗ',
    'ῢ' => 'ῢ',
    'ῤ' => 'ῤ',
    'ῦ' => 'ῦ',
    'ῧ' => 'ῧ',
    'ῲ' => 'ὼι',
    'ῳ' => 'ωι',
    'ῴ' => 'ώι',
    'ῶ' => 'ῶ',
    'ῷ' => 'ῶι',
    'ῼ' => 'ωι',
    'ff' => 'ff',
    'fi' => 'fi',
    'fl' => 'fl',
    'ffi' => 'ffi',
    'ffl' => 'ffl',
    'ſt' => 'st',
    'st' => 'st',
    'ﬓ' => 'մն',
    'ﬔ' => 'մե',
    'ﬕ' => 'մի',
    'ﬖ' => 'վն',
    'ﬗ' => 'մխ',
];
<?php

return array (
  'A' => 'a',
  'B' => 'b',
  'C' => 'c',
  'D' => 'd',
  'E' => 'e',
  'F' => 'f',
  'G' => 'g',
  'H' => 'h',
  'I' => 'i',
  'J' => 'j',
  'K' => 'k',
  'L' => 'l',
  'M' => 'm',
  'N' => 'n',
  'O' => 'o',
  'P' => 'p',
  'Q' => 'q',
  'R' => 'r',
  'S' => 's',
  'T' => 't',
  'U' => 'u',
  'V' => 'v',
  'W' => 'w',
  'X' => 'x',
  'Y' => 'y',
  'Z' => 'z',
  'À' => 'à',
  'Á' => 'á',
  'Â' => 'â',
  'Ã' => 'ã',
  'Ä' => 'ä',
  'Å' => 'å',
  'Æ' => 'æ',
  'Ç' => 'ç',
  'È' => 'è',
  'É' => 'é',
  'Ê' => 'ê',
  'Ë' => 'ë',
  'Ì' => 'ì',
  'Í' => 'í',
  'Î' => 'î',
  'Ï' => 'ï',
  'Ð' => 'ð',
  'Ñ' => 'ñ',
  'Ò' => 'ò',
  'Ó' => 'ó',
  'Ô' => 'ô',
  'Õ' => 'õ',
  'Ö' => 'ö',
  'Ø' => 'ø',
  'Ù' => 'ù',
  'Ú' => 'ú',
  'Û' => 'û',
  'Ü' => 'ü',
  'Ý' => 'ý',
  'Þ' => 'þ',
  'Ā' => 'ā',
  'Ă' => 'ă',
  'Ą' => 'ą',
  'Ć' => 'ć',
  'Ĉ' => 'ĉ',
  'Ċ' => 'ċ',
  'Č' => 'č',
  'Ď' => 'ď',
  'Đ' => 'đ',
  'Ē' => 'ē',
  'Ĕ' => 'ĕ',
  'Ė' => 'ė',
  'Ę' => 'ę',
  'Ě' => 'ě',
  'Ĝ' => 'ĝ',
  'Ğ' => 'ğ',
  'Ġ' => 'ġ',
  'Ģ' => 'ģ',
  'Ĥ' => 'ĥ',
  'Ħ' => 'ħ',
  'Ĩ' => 'ĩ',
  'Ī' => 'ī',
  'Ĭ' => 'ĭ',
  'Į' => 'į',
  'İ' => 'i̇',
  'IJ' => 'ij',
  'Ĵ' => 'ĵ',
  'Ķ' => 'ķ',
  'Ĺ' => 'ĺ',
  'Ļ' => 'ļ',
  'Ľ' => 'ľ',
  'Ŀ' => 'ŀ',
  'Ł' => 'ł',
  'Ń' => 'ń',
  'Ņ' => 'ņ',
  'Ň' => 'ň',
  'Ŋ' => 'ŋ',
  'Ō' => 'ō',
  'Ŏ' => 'ŏ',
  'Ő' => 'ő',
  'Œ' => 'œ',
  'Ŕ' => 'ŕ',
  'Ŗ' => 'ŗ',
  'Ř' => 'ř',
  'Ś' => 'ś',
  'Ŝ' => 'ŝ',
  'Ş' => 'ş',
  'Š' => 'š',
  'Ţ' => 'ţ',
  'Ť' => 'ť',
  'Ŧ' => 'ŧ',
  'Ũ' => 'ũ',
  'Ū' => 'ū',
  'Ŭ' => 'ŭ',
  'Ů' => 'ů',
  'Ű' => 'ű',
  'Ų' => 'ų',
  'Ŵ' => 'ŵ',
  'Ŷ' => 'ŷ',
  'Ÿ' => 'ÿ',
  'Ź' => 'ź',
  'Ż' => 'ż',
  'Ž' => 'ž',
  'Ɓ' => 'ɓ',
  'Ƃ' => 'ƃ',
  'Ƅ' => 'ƅ',
  'Ɔ' => 'ɔ',
  'Ƈ' => 'ƈ',
  'Ɖ' => 'ɖ',
  'Ɗ' => 'ɗ',
  'Ƌ' => 'ƌ',
  'Ǝ' => 'ǝ',
  'Ə' => 'ə',
  'Ɛ' => 'ɛ',
  'Ƒ' => 'ƒ',
  'Ɠ' => 'ɠ',
  'Ɣ' => 'ɣ',
  'Ɩ' => 'ɩ',
  'Ɨ' => 'ɨ',
  'Ƙ' => 'ƙ',
  'Ɯ' => 'ɯ',
  'Ɲ' => 'ɲ',
  'Ɵ' => 'ɵ',
  'Ơ' => 'ơ',
  'Ƣ' => 'ƣ',
  'Ƥ' => 'ƥ',
  'Ʀ' => 'ʀ',
  'Ƨ' => 'ƨ',
  'Ʃ' => 'ʃ',
  'Ƭ' => 'ƭ',
  'Ʈ' => 'ʈ',
  'Ư' => 'ư',
  'Ʊ' => 'ʊ',
  'Ʋ' => 'ʋ',
  'Ƴ' => 'ƴ',
  'Ƶ' => 'ƶ',
  'Ʒ' => 'ʒ',
  'Ƹ' => 'ƹ',
  'Ƽ' => 'ƽ',
  'DŽ' => 'dž',
  'Dž' => 'dž',
  'LJ' => 'lj',
  'Lj' => 'lj',
  'NJ' => 'nj',
  'Nj' => 'nj',
  'Ǎ' => 'ǎ',
  'Ǐ' => 'ǐ',
  'Ǒ' => 'ǒ',
  'Ǔ' => 'ǔ',
  'Ǖ' => 'ǖ',
  'Ǘ' => 'ǘ',
  'Ǚ' => 'ǚ',
  'Ǜ' => 'ǜ',
  'Ǟ' => 'ǟ',
  'Ǡ' => 'ǡ',
  'Ǣ' => 'ǣ',
  'Ǥ' => 'ǥ',
  'Ǧ' => 'ǧ',
  'Ǩ' => 'ǩ',
  'Ǫ' => 'ǫ',
  'Ǭ' => 'ǭ',
  'Ǯ' => 'ǯ',
  'DZ' => 'dz',
  'Dz' => 'dz',
  'Ǵ' => 'ǵ',
  'Ƕ' => 'ƕ',
  'Ƿ' => 'ƿ',
  'Ǹ' => 'ǹ',
  'Ǻ' => 'ǻ',
  'Ǽ' => 'ǽ',
  'Ǿ' => 'ǿ',
  'Ȁ' => 'ȁ',
  'Ȃ' => 'ȃ',
  'Ȅ' => 'ȅ',
  'Ȇ' => 'ȇ',
  'Ȉ' => 'ȉ',
  'Ȋ' => 'ȋ',
  'Ȍ' => 'ȍ',
  'Ȏ' => 'ȏ',
  'Ȑ' => 'ȑ',
  'Ȓ' => 'ȓ',
  'Ȕ' => 'ȕ',
  'Ȗ' => 'ȗ',
  'Ș' => 'ș',
  'Ț' => 'ț',
  'Ȝ' => 'ȝ',
  'Ȟ' => 'ȟ',
  'Ƞ' => 'ƞ',
  'Ȣ' => 'ȣ',
  'Ȥ' => 'ȥ',
  'Ȧ' => 'ȧ',
  'Ȩ' => 'ȩ',
  'Ȫ' => 'ȫ',
  'Ȭ' => 'ȭ',
  'Ȯ' => 'ȯ',
  'Ȱ' => 'ȱ',
  'Ȳ' => 'ȳ',
  'Ⱥ' => 'ⱥ',
  'Ȼ' => 'ȼ',
  'Ƚ' => 'ƚ',
  'Ⱦ' => 'ⱦ',
  'Ɂ' => 'ɂ',
  'Ƀ' => 'ƀ',
  'Ʉ' => 'ʉ',
  'Ʌ' => 'ʌ',
  'Ɇ' => 'ɇ',
  'Ɉ' => 'ɉ',
  'Ɋ' => 'ɋ',
  'Ɍ' => 'ɍ',
  'Ɏ' => 'ɏ',
  'Ͱ' => 'ͱ',
  'Ͳ' => 'ͳ',
  'Ͷ' => 'ͷ',
  'Ϳ' => 'ϳ',
  'Ά' => 'ά',
  'Έ' => 'έ',
  'Ή' => 'ή',
  'Ί' => 'ί',
  'Ό' => 'ό',
  'Ύ' => 'ύ',
  'Ώ' => 'ώ',
  'Α' => 'α',
  'Β' => 'β',
  'Γ' => 'γ',
  'Δ' => 'δ',
  'Ε' => 'ε',
  'Ζ' => 'ζ',
  'Η' => 'η',
  'Θ' => 'θ',
  'Ι' => 'ι',
  'Κ' => 'κ',
  'Λ' => 'λ',
  'Μ' => 'μ',
  'Ν' => 'ν',
  'Ξ' => 'ξ',
  'Ο' => 'ο',
  'Π' => 'π',
  'Ρ' => 'ρ',
  'Σ' => 'σ',
  'Τ' => 'τ',
  'Υ' => 'υ',
  'Φ' => 'φ',
  'Χ' => 'χ',
  'Ψ' => 'ψ',
  'Ω' => 'ω',
  'Ϊ' => 'ϊ',
  'Ϋ' => 'ϋ',
  'Ϗ' => 'ϗ',
  'Ϙ' => 'ϙ',
  'Ϛ' => 'ϛ',
  'Ϝ' => 'ϝ',
  'Ϟ' => 'ϟ',
  'Ϡ' => 'ϡ',
  'Ϣ' => 'ϣ',
  'Ϥ' => 'ϥ',
  'Ϧ' => 'ϧ',
  'Ϩ' => 'ϩ',
  'Ϫ' => 'ϫ',
  'Ϭ' => 'ϭ',
  'Ϯ' => 'ϯ',
  'ϴ' => 'θ',
  'Ϸ' => 'ϸ',
  'Ϲ' => 'ϲ',
  'Ϻ' => 'ϻ',
  'Ͻ' => 'ͻ',
  'Ͼ' => 'ͼ',
  'Ͽ' => 'ͽ',
  'Ѐ' => 'ѐ',
  'Ё' => 'ё',
  'Ђ' => 'ђ',
  'Ѓ' => 'ѓ',
  'Є' => 'є',
  'Ѕ' => 'ѕ',
  'І' => 'і',
  'Ї' => 'ї',
  'Ј' => 'ј',
  'Љ' => 'љ',
  'Њ' => 'њ',
  'Ћ' => 'ћ',
  'Ќ' => 'ќ',
  'Ѝ' => 'ѝ',
  'Ў' => 'ў',
  'Џ' => 'џ',
  'А' => 'а',
  'Б' => 'б',
  'В' => 'в',
  'Г' => 'г',
  'Д' => 'д',
  'Е' => 'е',
  'Ж' => 'ж',
  'З' => 'з',
  'И' => 'и',
  'Й' => 'й',
  'К' => 'к',
  'Л' => 'л',
  'М' => 'м',
  'Н' => 'н',
  'О' => 'о',
  'П' => 'п',
  'Р' => 'р',
  'С' => 'с',
  'Т' => 'т',
  'У' => 'у',
  'Ф' => 'ф',
  'Х' => 'х',
  'Ц' => 'ц',
  'Ч' => 'ч',
  'Ш' => 'ш',
  'Щ' => 'щ',
  'Ъ' => 'ъ',
  'Ы' => 'ы',
  'Ь' => 'ь',
  'Э' => 'э',
  'Ю' => 'ю',
  'Я' => 'я',
  'Ѡ' => 'ѡ',
  'Ѣ' => 'ѣ',
  'Ѥ' => 'ѥ',
  'Ѧ' => 'ѧ',
  'Ѩ' => 'ѩ',
  'Ѫ' => 'ѫ',
  'Ѭ' => 'ѭ',
  'Ѯ' => 'ѯ',
  'Ѱ' => 'ѱ',
  'Ѳ' => 'ѳ',
  'Ѵ' => 'ѵ',
  'Ѷ' => 'ѷ',
  'Ѹ' => 'ѹ',
  'Ѻ' => 'ѻ',
  'Ѽ' => 'ѽ',
  'Ѿ' => 'ѿ',
  'Ҁ' => 'ҁ',
  'Ҋ' => 'ҋ',
  'Ҍ' => 'ҍ',
  'Ҏ' => 'ҏ',
  'Ґ' => 'ґ',
  'Ғ' => 'ғ',
  'Ҕ' => 'ҕ',
  'Җ' => 'җ',
  'Ҙ' => 'ҙ',
  'Қ' => 'қ',
  'Ҝ' => 'ҝ',
  'Ҟ' => 'ҟ',
  'Ҡ' => 'ҡ',
  'Ң' => 'ң',
  'Ҥ' => 'ҥ',
  'Ҧ' => 'ҧ',
  'Ҩ' => 'ҩ',
  'Ҫ' => 'ҫ',
  'Ҭ' => 'ҭ',
  'Ү' => 'ү',
  'Ұ' => 'ұ',
  'Ҳ' => 'ҳ',
  'Ҵ' => 'ҵ',
  'Ҷ' => 'ҷ',
  'Ҹ' => 'ҹ',
  'Һ' => 'һ',
  'Ҽ' => 'ҽ',
  'Ҿ' => 'ҿ',
  'Ӏ' => 'ӏ',
  'Ӂ' => 'ӂ',
  'Ӄ' => 'ӄ',
  'Ӆ' => 'ӆ',
  'Ӈ' => 'ӈ',
  'Ӊ' => 'ӊ',
  'Ӌ' => 'ӌ',
  'Ӎ' => 'ӎ',
  'Ӑ' => 'ӑ',
  'Ӓ' => 'ӓ',
  'Ӕ' => 'ӕ',
  'Ӗ' => 'ӗ',
  'Ә' => 'ә',
  'Ӛ' => 'ӛ',
  'Ӝ' => 'ӝ',
  'Ӟ' => 'ӟ',
  'Ӡ' => 'ӡ',
  'Ӣ' => 'ӣ',
  'Ӥ' => 'ӥ',
  'Ӧ' => 'ӧ',
  'Ө' => 'ө',
  'Ӫ' => 'ӫ',
  'Ӭ' => 'ӭ',
  'Ӯ' => 'ӯ',
  'Ӱ' => 'ӱ',
  'Ӳ' => 'ӳ',
  'Ӵ' => 'ӵ',
  'Ӷ' => 'ӷ',
  'Ӹ' => 'ӹ',
  'Ӻ' => 'ӻ',
  'Ӽ' => 'ӽ',
  'Ӿ' => 'ӿ',
  'Ԁ' => 'ԁ',
  'Ԃ' => 'ԃ',
  'Ԅ' => 'ԅ',
  'Ԇ' => 'ԇ',
  'Ԉ' => 'ԉ',
  'Ԋ' => 'ԋ',
  'Ԍ' => 'ԍ',
  'Ԏ' => 'ԏ',
  'Ԑ' => 'ԑ',
  'Ԓ' => 'ԓ',
  'Ԕ' => 'ԕ',
  'Ԗ' => 'ԗ',
  'Ԙ' => 'ԙ',
  'Ԛ' => 'ԛ',
  'Ԝ' => 'ԝ',
  'Ԟ' => 'ԟ',
  'Ԡ' => 'ԡ',
  'Ԣ' => 'ԣ',
  'Ԥ' => 'ԥ',
  'Ԧ' => 'ԧ',
  'Ԩ' => 'ԩ',
  'Ԫ' => 'ԫ',
  'Ԭ' => 'ԭ',
  'Ԯ' => 'ԯ',
  'Ա' => 'ա',
  'Բ' => 'բ',
  'Գ' => 'գ',
  'Դ' => 'դ',
  'Ե' => 'ե',
  'Զ' => 'զ',
  'Է' => 'է',
  'Ը' => 'ը',
  'Թ' => 'թ',
  'Ժ' => 'ժ',
  'Ի' => 'ի',
  'Լ' => 'լ',
  'Խ' => 'խ',
  'Ծ' => 'ծ',
  'Կ' => 'կ',
  'Հ' => 'հ',
  'Ձ' => 'ձ',
  'Ղ' => 'ղ',
  'Ճ' => 'ճ',
  'Մ' => 'մ',
  'Յ' => 'յ',
  'Ն' => 'ն',
  'Շ' => 'շ',
  'Ո' => 'ո',
  'Չ' => 'չ',
  'Պ' => 'պ',
  'Ջ' => 'ջ',
  'Ռ' => 'ռ',
  'Ս' => 'ս',
  'Վ' => 'վ',
  'Տ' => 'տ',
  'Ր' => 'ր',
  'Ց' => 'ց',
  'Ւ' => 'ւ',
  'Փ' => 'փ',
  'Ք' => 'ք',
  'Օ' => 'օ',
  'Ֆ' => 'ֆ',
  'Ⴀ' => 'ⴀ',
  'Ⴁ' => 'ⴁ',
  'Ⴂ' => 'ⴂ',
  'Ⴃ' => 'ⴃ',
  'Ⴄ' => 'ⴄ',
  'Ⴅ' => 'ⴅ',
  'Ⴆ' => 'ⴆ',
  'Ⴇ' => 'ⴇ',
  'Ⴈ' => 'ⴈ',
  'Ⴉ' => 'ⴉ',
  'Ⴊ' => 'ⴊ',
  'Ⴋ' => 'ⴋ',
  'Ⴌ' => 'ⴌ',
  'Ⴍ' => 'ⴍ',
  'Ⴎ' => 'ⴎ',
  'Ⴏ' => 'ⴏ',
  'Ⴐ' => 'ⴐ',
  'Ⴑ' => 'ⴑ',
  'Ⴒ' => 'ⴒ',
  'Ⴓ' => 'ⴓ',
  'Ⴔ' => 'ⴔ',
  'Ⴕ' => 'ⴕ',
  'Ⴖ' => 'ⴖ',
  'Ⴗ' => 'ⴗ',
  'Ⴘ' => 'ⴘ',
  'Ⴙ' => 'ⴙ',
  'Ⴚ' => 'ⴚ',
  'Ⴛ' => 'ⴛ',
  'Ⴜ' => 'ⴜ',
  'Ⴝ' => 'ⴝ',
  'Ⴞ' => 'ⴞ',
  'Ⴟ' => 'ⴟ',
  'Ⴠ' => 'ⴠ',
  'Ⴡ' => 'ⴡ',
  'Ⴢ' => 'ⴢ',
  'Ⴣ' => 'ⴣ',
  'Ⴤ' => 'ⴤ',
  'Ⴥ' => 'ⴥ',
  'Ⴧ' => 'ⴧ',
  'Ⴭ' => 'ⴭ',
  'Ꭰ' => 'ꭰ',
  'Ꭱ' => 'ꭱ',
  'Ꭲ' => 'ꭲ',
  'Ꭳ' => 'ꭳ',
  'Ꭴ' => 'ꭴ',
  'Ꭵ' => 'ꭵ',
  'Ꭶ' => 'ꭶ',
  'Ꭷ' => 'ꭷ',
  'Ꭸ' => 'ꭸ',
  'Ꭹ' => 'ꭹ',
  'Ꭺ' => 'ꭺ',
  'Ꭻ' => 'ꭻ',
  'Ꭼ' => 'ꭼ',
  'Ꭽ' => 'ꭽ',
  'Ꭾ' => 'ꭾ',
  'Ꭿ' => 'ꭿ',
  'Ꮀ' => 'ꮀ',
  'Ꮁ' => 'ꮁ',
  'Ꮂ' => 'ꮂ',
  'Ꮃ' => 'ꮃ',
  'Ꮄ' => 'ꮄ',
  'Ꮅ' => 'ꮅ',
  'Ꮆ' => 'ꮆ',
  'Ꮇ' => 'ꮇ',
  'Ꮈ' => 'ꮈ',
  'Ꮉ' => 'ꮉ',
  'Ꮊ' => 'ꮊ',
  'Ꮋ' => 'ꮋ',
  'Ꮌ' => 'ꮌ',
  'Ꮍ' => 'ꮍ',
  'Ꮎ' => 'ꮎ',
  'Ꮏ' => 'ꮏ',
  'Ꮐ' => 'ꮐ',
  'Ꮑ' => 'ꮑ',
  'Ꮒ' => 'ꮒ',
  'Ꮓ' => 'ꮓ',
  'Ꮔ' => 'ꮔ',
  'Ꮕ' => 'ꮕ',
  'Ꮖ' => 'ꮖ',
  'Ꮗ' => 'ꮗ',
  'Ꮘ' => 'ꮘ',
  'Ꮙ' => 'ꮙ',
  'Ꮚ' => 'ꮚ',
  'Ꮛ' => 'ꮛ',
  'Ꮜ' => 'ꮜ',
  'Ꮝ' => 'ꮝ',
  'Ꮞ' => 'ꮞ',
  'Ꮟ' => 'ꮟ',
  'Ꮠ' => 'ꮠ',
  'Ꮡ' => 'ꮡ',
  'Ꮢ' => 'ꮢ',
  'Ꮣ' => 'ꮣ',
  'Ꮤ' => 'ꮤ',
  'Ꮥ' => 'ꮥ',
  'Ꮦ' => 'ꮦ',
  'Ꮧ' => 'ꮧ',
  'Ꮨ' => 'ꮨ',
  'Ꮩ' => 'ꮩ',
  'Ꮪ' => 'ꮪ',
  'Ꮫ' => 'ꮫ',
  'Ꮬ' => 'ꮬ',
  'Ꮭ' => 'ꮭ',
  'Ꮮ' => 'ꮮ',
  'Ꮯ' => 'ꮯ',
  'Ꮰ' => 'ꮰ',
  'Ꮱ' => 'ꮱ',
  'Ꮲ' => 'ꮲ',
  'Ꮳ' => 'ꮳ',
  'Ꮴ' => 'ꮴ',
  'Ꮵ' => 'ꮵ',
  'Ꮶ' => 'ꮶ',
  'Ꮷ' => 'ꮷ',
  'Ꮸ' => 'ꮸ',
  'Ꮹ' => 'ꮹ',
  'Ꮺ' => 'ꮺ',
  'Ꮻ' => 'ꮻ',
  'Ꮼ' => 'ꮼ',
  'Ꮽ' => 'ꮽ',
  'Ꮾ' => 'ꮾ',
  'Ꮿ' => 'ꮿ',
  'Ᏸ' => 'ᏸ',
  'Ᏹ' => 'ᏹ',
  'Ᏺ' => 'ᏺ',
  'Ᏻ' => 'ᏻ',
  'Ᏼ' => 'ᏼ',
  'Ᏽ' => 'ᏽ',
  'Ა' => 'ა',
  'Ბ' => 'ბ',
  'Გ' => 'გ',
  'Დ' => 'დ',
  'Ე' => 'ე',
  'Ვ' => 'ვ',
  'Ზ' => 'ზ',
  'Თ' => 'თ',
  'Ი' => 'ი',
  'Კ' => 'კ',
  'Ლ' => 'ლ',
  'Მ' => 'მ',
  'Ნ' => 'ნ',
  'Ო' => 'ო',
  'Პ' => 'პ',
  'Ჟ' => 'ჟ',
  'Რ' => 'რ',
  'Ს' => 'ს',
  'Ტ' => 'ტ',
  'Უ' => 'უ',
  'Ფ' => 'ფ',
  'Ქ' => 'ქ',
  'Ღ' => 'ღ',
  'Ყ' => 'ყ',
  'Შ' => 'შ',
  'Ჩ' => 'ჩ',
  'Ც' => 'ც',
  'Ძ' => 'ძ',
  'Წ' => 'წ',
  'Ჭ' => 'ჭ',
  'Ხ' => 'ხ',
  'Ჯ' => 'ჯ',
  'Ჰ' => 'ჰ',
  'Ჱ' => 'ჱ',
  'Ჲ' => 'ჲ',
  'Ჳ' => 'ჳ',
  'Ჴ' => 'ჴ',
  'Ჵ' => 'ჵ',
  'Ჶ' => 'ჶ',
  'Ჷ' => 'ჷ',
  'Ჸ' => 'ჸ',
  'Ჹ' => 'ჹ',
  'Ჺ' => 'ჺ',
  'Ჽ' => 'ჽ',
  'Ჾ' => 'ჾ',
  'Ჿ' => 'ჿ',
  'Ḁ' => 'ḁ',
  'Ḃ' => 'ḃ',
  'Ḅ' => 'ḅ',
  'Ḇ' => 'ḇ',
  'Ḉ' => 'ḉ',
  'Ḋ' => 'ḋ',
  'Ḍ' => 'ḍ',
  'Ḏ' => 'ḏ',
  'Ḑ' => 'ḑ',
  'Ḓ' => 'ḓ',
  'Ḕ' => 'ḕ',
  'Ḗ' => 'ḗ',
  'Ḙ' => 'ḙ',
  'Ḛ' => 'ḛ',
  'Ḝ' => 'ḝ',
  'Ḟ' => 'ḟ',
  'Ḡ' => 'ḡ',
  'Ḣ' => 'ḣ',
  'Ḥ' => 'ḥ',
  'Ḧ' => 'ḧ',
  'Ḩ' => 'ḩ',
  'Ḫ' => 'ḫ',
  'Ḭ' => 'ḭ',
  'Ḯ' => 'ḯ',
  'Ḱ' => 'ḱ',
  'Ḳ' => 'ḳ',
  'Ḵ' => 'ḵ',
  'Ḷ' => 'ḷ',
  'Ḹ' => 'ḹ',
  'Ḻ' => 'ḻ',
  'Ḽ' => 'ḽ',
  'Ḿ' => 'ḿ',
  'Ṁ' => 'ṁ',
  'Ṃ' => 'ṃ',
  'Ṅ' => 'ṅ',
  'Ṇ' => 'ṇ',
  'Ṉ' => 'ṉ',
  'Ṋ' => 'ṋ',
  'Ṍ' => 'ṍ',
  'Ṏ' => 'ṏ',
  'Ṑ' => 'ṑ',
  'Ṓ' => 'ṓ',
  'Ṕ' => 'ṕ',
  'Ṗ' => 'ṗ',
  'Ṙ' => 'ṙ',
  'Ṛ' => 'ṛ',
  'Ṝ' => 'ṝ',
  'Ṟ' => 'ṟ',
  'Ṡ' => 'ṡ',
  'Ṣ' => 'ṣ',
  'Ṥ' => 'ṥ',
  'Ṧ' => 'ṧ',
  'Ṩ' => 'ṩ',
  'Ṫ' => 'ṫ',
  'Ṭ' => 'ṭ',
  'Ṯ' => 'ṯ',
  'Ṱ' => 'ṱ',
  'Ṳ' => 'ṳ',
  'Ṵ' => 'ṵ',
  'Ṷ' => 'ṷ',
  'Ṹ' => 'ṹ',
  'Ṻ' => 'ṻ',
  'Ṽ' => 'ṽ',
  'Ṿ' => 'ṿ',
  'Ẁ' => 'ẁ',
  'Ẃ' => 'ẃ',
  'Ẅ' => 'ẅ',
  'Ẇ' => 'ẇ',
  'Ẉ' => 'ẉ',
  'Ẋ' => 'ẋ',
  'Ẍ' => 'ẍ',
  'Ẏ' => 'ẏ',
  'Ẑ' => 'ẑ',
  'Ẓ' => 'ẓ',
  'Ẕ' => 'ẕ',
  'ẞ' => 'ß',
  'Ạ' => 'ạ',
  'Ả' => 'ả',
  'Ấ' => 'ấ',
  'Ầ' => 'ầ',
  'Ẩ' => 'ẩ',
  'Ẫ' => 'ẫ',
  'Ậ' => 'ậ',
  'Ắ' => 'ắ',
  'Ằ' => 'ằ',
  'Ẳ' => 'ẳ',
  'Ẵ' => 'ẵ',
  'Ặ' => 'ặ',
  'Ẹ' => 'ẹ',
  'Ẻ' => 'ẻ',
  'Ẽ' => 'ẽ',
  'Ế' => 'ế',
  'Ề' => 'ề',
  'Ể' => 'ể',
  'Ễ' => 'ễ',
  'Ệ' => 'ệ',
  'Ỉ' => 'ỉ',
  'Ị' => 'ị',
  'Ọ' => 'ọ',
  'Ỏ' => 'ỏ',
  'Ố' => 'ố',
  'Ồ' => 'ồ',
  'Ổ' => 'ổ',
  'Ỗ' => 'ỗ',
  'Ộ' => 'ộ',
  'Ớ' => 'ớ',
  'Ờ' => 'ờ',
  'Ở' => 'ở',
  'Ỡ' => 'ỡ',
  'Ợ' => 'ợ',
  'Ụ' => 'ụ',
  'Ủ' => 'ủ',
  'Ứ' => 'ứ',
  'Ừ' => 'ừ',
  'Ử' => 'ử',
  'Ữ' => 'ữ',
  'Ự' => 'ự',
  'Ỳ' => 'ỳ',
  'Ỵ' => 'ỵ',
  'Ỷ' => 'ỷ',
  'Ỹ' => 'ỹ',
  'Ỻ' => 'ỻ',
  'Ỽ' => 'ỽ',
  'Ỿ' => 'ỿ',
  'Ἀ' => 'ἀ',
  'Ἁ' => 'ἁ',
  'Ἂ' => 'ἂ',
  'Ἃ' => 'ἃ',
  'Ἄ' => 'ἄ',
  'Ἅ' => 'ἅ',
  'Ἆ' => 'ἆ',
  'Ἇ' => 'ἇ',
  'Ἐ' => 'ἐ',
  'Ἑ' => 'ἑ',
  'Ἒ' => 'ἒ',
  'Ἓ' => 'ἓ',
  'Ἔ' => 'ἔ',
  'Ἕ' => 'ἕ',
  'Ἠ' => 'ἠ',
  'Ἡ' => 'ἡ',
  'Ἢ' => 'ἢ',
  'Ἣ' => 'ἣ',
  'Ἤ' => 'ἤ',
  'Ἥ' => 'ἥ',
  'Ἦ' => 'ἦ',
  'Ἧ' => 'ἧ',
  'Ἰ' => 'ἰ',
  'Ἱ' => 'ἱ',
  'Ἲ' => 'ἲ',
  'Ἳ' => 'ἳ',
  'Ἴ' => 'ἴ',
  'Ἵ' => 'ἵ',
  'Ἶ' => 'ἶ',
  'Ἷ' => 'ἷ',
  'Ὀ' => 'ὀ',
  'Ὁ' => 'ὁ',
  'Ὂ' => 'ὂ',
  'Ὃ' => 'ὃ',
  'Ὄ' => 'ὄ',
  'Ὅ' => 'ὅ',
  'Ὑ' => 'ὑ',
  'Ὓ' => 'ὓ',
  'Ὕ' => 'ὕ',
  'Ὗ' => 'ὗ',
  'Ὠ' => 'ὠ',
  'Ὡ' => 'ὡ',
  'Ὢ' => 'ὢ',
  'Ὣ' => 'ὣ',
  'Ὤ' => 'ὤ',
  'Ὥ' => 'ὥ',
  'Ὦ' => 'ὦ',
  'Ὧ' => 'ὧ',
  'ᾈ' => 'ᾀ',
  'ᾉ' => 'ᾁ',
  'ᾊ' => 'ᾂ',
  'ᾋ' => 'ᾃ',
  'ᾌ' => 'ᾄ',
  'ᾍ' => 'ᾅ',
  'ᾎ' => 'ᾆ',
  'ᾏ' => 'ᾇ',
  'ᾘ' => 'ᾐ',
  'ᾙ' => 'ᾑ',
  'ᾚ' => 'ᾒ',
  'ᾛ' => 'ᾓ',
  'ᾜ' => 'ᾔ',
  'ᾝ' => 'ᾕ',
  'ᾞ' => 'ᾖ',
  'ᾟ' => 'ᾗ',
  'ᾨ' => 'ᾠ',
  'ᾩ' => 'ᾡ',
  'ᾪ' => 'ᾢ',
  'ᾫ' => 'ᾣ',
  'ᾬ' => 'ᾤ',
  'ᾭ' => 'ᾥ',
  'ᾮ' => 'ᾦ',
  'ᾯ' => 'ᾧ',
  'Ᾰ' => 'ᾰ',
  'Ᾱ' => 'ᾱ',
  'Ὰ' => 'ὰ',
  'Ά' => 'ά',
  'ᾼ' => 'ᾳ',
  'Ὲ' => 'ὲ',
  'Έ' => 'έ',
  'Ὴ' => 'ὴ',
  'Ή' => 'ή',
  'ῌ' => 'ῃ',
  'Ῐ' => 'ῐ',
  'Ῑ' => 'ῑ',
  'Ὶ' => 'ὶ',
  'Ί' => 'ί',
  'Ῠ' => 'ῠ',
  'Ῡ' => 'ῡ',
  'Ὺ' => 'ὺ',
  'Ύ' => 'ύ',
  'Ῥ' => 'ῥ',
  'Ὸ' => 'ὸ',
  'Ό' => 'ό',
  'Ὼ' => 'ὼ',
  'Ώ' => 'ώ',
  'ῼ' => 'ῳ',
  'Ω' => 'ω',
  'K' => 'k',
  'Å' => 'å',
  'Ⅎ' => 'ⅎ',
  'Ⅰ' => 'ⅰ',
  'Ⅱ' => 'ⅱ',
  'Ⅲ' => 'ⅲ',
  'Ⅳ' => 'ⅳ',
  'Ⅴ' => 'ⅴ',
  'Ⅵ' => 'ⅵ',
  'Ⅶ' => 'ⅶ',
  'Ⅷ' => 'ⅷ',
  'Ⅸ' => 'ⅸ',
  'Ⅹ' => 'ⅹ',
  'Ⅺ' => 'ⅺ',
  'Ⅻ' => 'ⅻ',
  'Ⅼ' => 'ⅼ',
  'Ⅽ' => 'ⅽ',
  'Ⅾ' => 'ⅾ',
  'Ⅿ' => 'ⅿ',
  'Ↄ' => 'ↄ',
  'Ⓐ' => 'ⓐ',
  'Ⓑ' => 'ⓑ',
  'Ⓒ' => 'ⓒ',
  'Ⓓ' => 'ⓓ',
  'Ⓔ' => 'ⓔ',
  'Ⓕ' => 'ⓕ',
  'Ⓖ' => 'ⓖ',
  'Ⓗ' => 'ⓗ',
  'Ⓘ' => 'ⓘ',
  'Ⓙ' => 'ⓙ',
  'Ⓚ' => 'ⓚ',
  'Ⓛ' => 'ⓛ',
  'Ⓜ' => 'ⓜ',
  'Ⓝ' => 'ⓝ',
  'Ⓞ' => 'ⓞ',
  'Ⓟ' => 'ⓟ',
  'Ⓠ' => 'ⓠ',
  'Ⓡ' => 'ⓡ',
  'Ⓢ' => 'ⓢ',
  'Ⓣ' => 'ⓣ',
  'Ⓤ' => 'ⓤ',
  'Ⓥ' => 'ⓥ',
  'Ⓦ' => 'ⓦ',
  'Ⓧ' => 'ⓧ',
  'Ⓨ' => 'ⓨ',
  'Ⓩ' => 'ⓩ',
  'Ⰰ' => 'ⰰ',
  'Ⰱ' => 'ⰱ',
  'Ⰲ' => 'ⰲ',
  'Ⰳ' => 'ⰳ',
  'Ⰴ' => 'ⰴ',
  'Ⰵ' => 'ⰵ',
  'Ⰶ' => 'ⰶ',
  'Ⰷ' => 'ⰷ',
  'Ⰸ' => 'ⰸ',
  'Ⰹ' => 'ⰹ',
  'Ⰺ' => 'ⰺ',
  'Ⰻ' => 'ⰻ',
  'Ⰼ' => 'ⰼ',
  'Ⰽ' => 'ⰽ',
  'Ⰾ' => 'ⰾ',
  'Ⰿ' => 'ⰿ',
  'Ⱀ' => 'ⱀ',
  'Ⱁ' => 'ⱁ',
  'Ⱂ' => 'ⱂ',
  'Ⱃ' => 'ⱃ',
  'Ⱄ' => 'ⱄ',
  'Ⱅ' => 'ⱅ',
  'Ⱆ' => 'ⱆ',
  'Ⱇ' => 'ⱇ',
  'Ⱈ' => 'ⱈ',
  'Ⱉ' => 'ⱉ',
  'Ⱊ' => 'ⱊ',
  'Ⱋ' => 'ⱋ',
  'Ⱌ' => 'ⱌ',
  'Ⱍ' => 'ⱍ',
  'Ⱎ' => 'ⱎ',
  'Ⱏ' => 'ⱏ',
  'Ⱐ' => 'ⱐ',
  'Ⱑ' => 'ⱑ',
  'Ⱒ' => 'ⱒ',
  'Ⱓ' => 'ⱓ',
  'Ⱔ' => 'ⱔ',
  'Ⱕ' => 'ⱕ',
  'Ⱖ' => 'ⱖ',
  'Ⱗ' => 'ⱗ',
  'Ⱘ' => 'ⱘ',
  'Ⱙ' => 'ⱙ',
  'Ⱚ' => 'ⱚ',
  'Ⱛ' => 'ⱛ',
  'Ⱜ' => 'ⱜ',
  'Ⱝ' => 'ⱝ',
  'Ⱞ' => 'ⱞ',
  'Ⱡ' => 'ⱡ',
  'Ɫ' => 'ɫ',
  'Ᵽ' => 'ᵽ',
  'Ɽ' => 'ɽ',
  'Ⱨ' => 'ⱨ',
  'Ⱪ' => 'ⱪ',
  'Ⱬ' => 'ⱬ',
  'Ɑ' => 'ɑ',
  'Ɱ' => 'ɱ',
  'Ɐ' => 'ɐ',
  'Ɒ' => 'ɒ',
  'Ⱳ' => 'ⱳ',
  'Ⱶ' => 'ⱶ',
  'Ȿ' => 'ȿ',
  'Ɀ' => 'ɀ',
  'Ⲁ' => 'ⲁ',
  'Ⲃ' => 'ⲃ',
  'Ⲅ' => 'ⲅ',
  'Ⲇ' => 'ⲇ',
  'Ⲉ' => 'ⲉ',
  'Ⲋ' => 'ⲋ',
  'Ⲍ' => 'ⲍ',
  'Ⲏ' => 'ⲏ',
  'Ⲑ' => 'ⲑ',
  'Ⲓ' => 'ⲓ',
  'Ⲕ' => 'ⲕ',
  'Ⲗ' => 'ⲗ',
  'Ⲙ' => 'ⲙ',
  'Ⲛ' => 'ⲛ',
  'Ⲝ' => 'ⲝ',
  'Ⲟ' => 'ⲟ',
  'Ⲡ' => 'ⲡ',
  'Ⲣ' => 'ⲣ',
  'Ⲥ' => 'ⲥ',
  'Ⲧ' => 'ⲧ',
  'Ⲩ' => 'ⲩ',
  'Ⲫ' => 'ⲫ',
  'Ⲭ' => 'ⲭ',
  'Ⲯ' => 'ⲯ',
  'Ⲱ' => 'ⲱ',
  'Ⲳ' => 'ⲳ',
  'Ⲵ' => 'ⲵ',
  'Ⲷ' => 'ⲷ',
  'Ⲹ' => 'ⲹ',
  'Ⲻ' => 'ⲻ',
  'Ⲽ' => 'ⲽ',
  'Ⲿ' => 'ⲿ',
  'Ⳁ' => 'ⳁ',
  'Ⳃ' => 'ⳃ',
  'Ⳅ' => 'ⳅ',
  'Ⳇ' => 'ⳇ',
  'Ⳉ' => 'ⳉ',
  'Ⳋ' => 'ⳋ',
  'Ⳍ' => 'ⳍ',
  'Ⳏ' => 'ⳏ',
  'Ⳑ' => 'ⳑ',
  'Ⳓ' => 'ⳓ',
  'Ⳕ' => 'ⳕ',
  'Ⳗ' => 'ⳗ',
  'Ⳙ' => 'ⳙ',
  'Ⳛ' => 'ⳛ',
  'Ⳝ' => 'ⳝ',
  'Ⳟ' => 'ⳟ',
  'Ⳡ' => 'ⳡ',
  'Ⳣ' => 'ⳣ',
  'Ⳬ' => 'ⳬ',
  'Ⳮ' => 'ⳮ',
  'Ⳳ' => 'ⳳ',
  'Ꙁ' => 'ꙁ',
  'Ꙃ' => 'ꙃ',
  'Ꙅ' => 'ꙅ',
  'Ꙇ' => 'ꙇ',
  'Ꙉ' => 'ꙉ',
  'Ꙋ' => 'ꙋ',
  'Ꙍ' => 'ꙍ',
  'Ꙏ' => 'ꙏ',
  'Ꙑ' => 'ꙑ',
  'Ꙓ' => 'ꙓ',
  'Ꙕ' => 'ꙕ',
  'Ꙗ' => 'ꙗ',
  'Ꙙ' => 'ꙙ',
  'Ꙛ' => 'ꙛ',
  'Ꙝ' => 'ꙝ',
  'Ꙟ' => 'ꙟ',
  'Ꙡ' => 'ꙡ',
  'Ꙣ' => 'ꙣ',
  'Ꙥ' => 'ꙥ',
  'Ꙧ' => 'ꙧ',
  'Ꙩ' => 'ꙩ',
  'Ꙫ' => 'ꙫ',
  'Ꙭ' => 'ꙭ',
  'Ꚁ' => 'ꚁ',
  'Ꚃ' => 'ꚃ',
  'Ꚅ' => 'ꚅ',
  'Ꚇ' => 'ꚇ',
  'Ꚉ' => 'ꚉ',
  'Ꚋ' => 'ꚋ',
  'Ꚍ' => 'ꚍ',
  'Ꚏ' => 'ꚏ',
  'Ꚑ' => 'ꚑ',
  'Ꚓ' => 'ꚓ',
  'Ꚕ' => 'ꚕ',
  'Ꚗ' => 'ꚗ',
  'Ꚙ' => 'ꚙ',
  'Ꚛ' => 'ꚛ',
  'Ꜣ' => 'ꜣ',
  'Ꜥ' => 'ꜥ',
  'Ꜧ' => 'ꜧ',
  'Ꜩ' => 'ꜩ',
  'Ꜫ' => 'ꜫ',
  'Ꜭ' => 'ꜭ',
  'Ꜯ' => 'ꜯ',
  'Ꜳ' => 'ꜳ',
  'Ꜵ' => 'ꜵ',
  'Ꜷ' => 'ꜷ',
  'Ꜹ' => 'ꜹ',
  'Ꜻ' => 'ꜻ',
  'Ꜽ' => 'ꜽ',
  'Ꜿ' => 'ꜿ',
  'Ꝁ' => 'ꝁ',
  'Ꝃ' => 'ꝃ',
  'Ꝅ' => 'ꝅ',
  'Ꝇ' => 'ꝇ',
  'Ꝉ' => 'ꝉ',
  'Ꝋ' => 'ꝋ',
  'Ꝍ' => 'ꝍ',
  'Ꝏ' => 'ꝏ',
  'Ꝑ' => 'ꝑ',
  'Ꝓ' => 'ꝓ',
  'Ꝕ' => 'ꝕ',
  'Ꝗ' => 'ꝗ',
  'Ꝙ' => 'ꝙ',
  'Ꝛ' => 'ꝛ',
  'Ꝝ' => 'ꝝ',
  'Ꝟ' => 'ꝟ',
  'Ꝡ' => 'ꝡ',
  'Ꝣ' => 'ꝣ',
  'Ꝥ' => 'ꝥ',
  'Ꝧ' => 'ꝧ',
  'Ꝩ' => 'ꝩ',
  'Ꝫ' => 'ꝫ',
  'Ꝭ' => 'ꝭ',
  'Ꝯ' => 'ꝯ',
  'Ꝺ' => 'ꝺ',
  'Ꝼ' => 'ꝼ',
  'Ᵹ' => 'ᵹ',
  'Ꝿ' => 'ꝿ',
  'Ꞁ' => 'ꞁ',
  'Ꞃ' => 'ꞃ',
  'Ꞅ' => 'ꞅ',
  'Ꞇ' => 'ꞇ',
  'Ꞌ' => 'ꞌ',
  'Ɥ' => 'ɥ',
  'Ꞑ' => 'ꞑ',
  'Ꞓ' => 'ꞓ',
  'Ꞗ' => 'ꞗ',
  'Ꞙ' => 'ꞙ',
  'Ꞛ' => 'ꞛ',
  'Ꞝ' => 'ꞝ',
  'Ꞟ' => 'ꞟ',
  'Ꞡ' => 'ꞡ',
  'Ꞣ' => 'ꞣ',
  'Ꞥ' => 'ꞥ',
  'Ꞧ' => 'ꞧ',
  'Ꞩ' => 'ꞩ',
  'Ɦ' => 'ɦ',
  'Ɜ' => 'ɜ',
  'Ɡ' => 'ɡ',
  'Ɬ' => 'ɬ',
  'Ɪ' => 'ɪ',
  'Ʞ' => 'ʞ',
  'Ʇ' => 'ʇ',
  'Ʝ' => 'ʝ',
  'Ꭓ' => 'ꭓ',
  'Ꞵ' => 'ꞵ',
  'Ꞷ' => 'ꞷ',
  'Ꞹ' => 'ꞹ',
  'Ꞻ' => 'ꞻ',
  'Ꞽ' => 'ꞽ',
  'Ꞿ' => 'ꞿ',
  'Ꟃ' => 'ꟃ',
  'Ꞔ' => 'ꞔ',
  'Ʂ' => 'ʂ',
  'Ᶎ' => 'ᶎ',
  'Ꟈ' => 'ꟈ',
  'Ꟊ' => 'ꟊ',
  'Ꟶ' => 'ꟶ',
  'A' => 'a',
  'B' => 'b',
  'C' => 'c',
  'D' => 'd',
  'E' => 'e',
  'F' => 'f',
  'G' => 'g',
  'H' => 'h',
  'I' => 'i',
  'J' => 'j',
  'K' => 'k',
  'L' => 'l',
  'M' => 'm',
  'N' => 'n',
  'O' => 'o',
  'P' => 'p',
  'Q' => 'q',
  'R' => 'r',
  'S' => 's',
  'T' => 't',
  'U' => 'u',
  'V' => 'v',
  'W' => 'w',
  'X' => 'x',
  'Y' => 'y',
  'Z' => 'z',
  '𐐀' => '𐐨',
  '𐐁' => '𐐩',
  '𐐂' => '𐐪',
  '𐐃' => '𐐫',
  '𐐄' => '𐐬',
  '𐐅' => '𐐭',
  '𐐆' => '𐐮',
  '𐐇' => '𐐯',
  '𐐈' => '𐐰',
  '𐐉' => '𐐱',
  '𐐊' => '𐐲',
  '𐐋' => '𐐳',
  '𐐌' => '𐐴',
  '𐐍' => '𐐵',
  '𐐎' => '𐐶',
  '𐐏' => '𐐷',
  '𐐐' => '𐐸',
  '𐐑' => '𐐹',
  '𐐒' => '𐐺',
  '𐐓' => '𐐻',
  '𐐔' => '𐐼',
  '𐐕' => '𐐽',
  '𐐖' => '𐐾',
  '𐐗' => '𐐿',
  '𐐘' => '𐑀',
  '𐐙' => '𐑁',
  '𐐚' => '𐑂',
  '𐐛' => '𐑃',
  '𐐜' => '𐑄',
  '𐐝' => '𐑅',
  '𐐞' => '𐑆',
  '𐐟' => '𐑇',
  '𐐠' => '𐑈',
  '𐐡' => '𐑉',
  '𐐢' => '𐑊',
  '𐐣' => '𐑋',
  '𐐤' => '𐑌',
  '𐐥' => '𐑍',
  '𐐦' => '𐑎',
  '𐐧' => '𐑏',
  '𐒰' => '𐓘',
  '𐒱' => '𐓙',
  '𐒲' => '𐓚',
  '𐒳' => '𐓛',
  '𐒴' => '𐓜',
  '𐒵' => '𐓝',
  '𐒶' => '𐓞',
  '𐒷' => '𐓟',
  '𐒸' => '𐓠',
  '𐒹' => '𐓡',
  '𐒺' => '𐓢',
  '𐒻' => '𐓣',
  '𐒼' => '𐓤',
  '𐒽' => '𐓥',
  '𐒾' => '𐓦',
  '𐒿' => '𐓧',
  '𐓀' => '𐓨',
  '𐓁' => '𐓩',
  '𐓂' => '𐓪',
  '𐓃' => '𐓫',
  '𐓄' => '𐓬',
  '𐓅' => '𐓭',
  '𐓆' => '𐓮',
  '𐓇' => '𐓯',
  '𐓈' => '𐓰',
  '𐓉' => '𐓱',
  '𐓊' => '𐓲',
  '𐓋' => '𐓳',
  '𐓌' => '𐓴',
  '𐓍' => '𐓵',
  '𐓎' => '𐓶',
  '𐓏' => '𐓷',
  '𐓐' => '𐓸',
  '𐓑' => '𐓹',
  '𐓒' => '𐓺',
  '𐓓' => '𐓻',
  '𐲀' => '𐳀',
  '𐲁' => '𐳁',
  '𐲂' => '𐳂',
  '𐲃' => '𐳃',
  '𐲄' => '𐳄',
  '𐲅' => '𐳅',
  '𐲆' => '𐳆',
  '𐲇' => '𐳇',
  '𐲈' => '𐳈',
  '𐲉' => '𐳉',
  '𐲊' => '𐳊',
  '𐲋' => '𐳋',
  '𐲌' => '𐳌',
  '𐲍' => '𐳍',
  '𐲎' => '𐳎',
  '𐲏' => '𐳏',
  '𐲐' => '𐳐',
  '𐲑' => '𐳑',
  '𐲒' => '𐳒',
  '𐲓' => '𐳓',
  '𐲔' => '𐳔',
  '𐲕' => '𐳕',
  '𐲖' => '𐳖',
  '𐲗' => '𐳗',
  '𐲘' => '𐳘',
  '𐲙' => '𐳙',
  '𐲚' => '𐳚',
  '𐲛' => '𐳛',
  '𐲜' => '𐳜',
  '𐲝' => '𐳝',
  '𐲞' => '𐳞',
  '𐲟' => '𐳟',
  '𐲠' => '𐳠',
  '𐲡' => '𐳡',
  '𐲢' => '𐳢',
  '𐲣' => '𐳣',
  '𐲤' => '𐳤',
  '𐲥' => '𐳥',
  '𐲦' => '𐳦',
  '𐲧' => '𐳧',
  '𐲨' => '𐳨',
  '𐲩' => '𐳩',
  '𐲪' => '𐳪',
  '𐲫' => '𐳫',
  '𐲬' => '𐳬',
  '𐲭' => '𐳭',
  '𐲮' => '𐳮',
  '𐲯' => '𐳯',
  '𐲰' => '𐳰',
  '𐲱' => '𐳱',
  '𐲲' => '𐳲',
  '𑢠' => '𑣀',
  '𑢡' => '𑣁',
  '𑢢' => '𑣂',
  '𑢣' => '𑣃',
  '𑢤' => '𑣄',
  '𑢥' => '𑣅',
  '𑢦' => '𑣆',
  '𑢧' => '𑣇',
  '𑢨' => '𑣈',
  '𑢩' => '𑣉',
  '𑢪' => '𑣊',
  '𑢫' => '𑣋',
  '𑢬' => '𑣌',
  '𑢭' => '𑣍',
  '𑢮' => '𑣎',
  '𑢯' => '𑣏',
  '𑢰' => '𑣐',
  '𑢱' => '𑣑',
  '𑢲' => '𑣒',
  '𑢳' => '𑣓',
  '𑢴' => '𑣔',
  '𑢵' => '𑣕',
  '𑢶' => '𑣖',
  '𑢷' => '𑣗',
  '𑢸' => '𑣘',
  '𑢹' => '𑣙',
  '𑢺' => '𑣚',
  '𑢻' => '𑣛',
  '𑢼' => '𑣜',
  '𑢽' => '𑣝',
  '𑢾' => '𑣞',
  '𑢿' => '𑣟',
  '𖹀' => '𖹠',
  '𖹁' => '𖹡',
  '𖹂' => '𖹢',
  '𖹃' => '𖹣',
  '𖹄' => '𖹤',
  '𖹅' => '𖹥',
  '𖹆' => '𖹦',
  '𖹇' => '𖹧',
  '𖹈' => '𖹨',
  '𖹉' => '𖹩',
  '𖹊' => '𖹪',
  '𖹋' => '𖹫',
  '𖹌' => '𖹬',
  '𖹍' => '𖹭',
  '𖹎' => '𖹮',
  '𖹏' => '𖹯',
  '𖹐' => '𖹰',
  '𖹑' => '𖹱',
  '𖹒' => '𖹲',
  '𖹓' => '𖹳',
  '𖹔' => '𖹴',
  '𖹕' => '𖹵',
  '𖹖' => '𖹶',
  '𖹗' => '𖹷',
  '𖹘' => '𖹸',
  '𖹙' => '𖹹',
  '𖹚' => '𖹺',
  '𖹛' => '𖹻',
  '𖹜' => '𖹼',
  '𖹝' => '𖹽',
  '𖹞' => '𖹾',
  '𖹟' => '𖹿',
  '𞤀' => '𞤢',
  '𞤁' => '𞤣',
  '𞤂' => '𞤤',
  '𞤃' => '𞤥',
  '𞤄' => '𞤦',
  '𞤅' => '𞤧',
  '𞤆' => '𞤨',
  '𞤇' => '𞤩',
  '𞤈' => '𞤪',
  '𞤉' => '𞤫',
  '𞤊' => '𞤬',
  '𞤋' => '𞤭',
  '𞤌' => '𞤮',
  '𞤍' => '𞤯',
  '𞤎' => '𞤰',
  '𞤏' => '𞤱',
  '𞤐' => '𞤲',
  '𞤑' => '𞤳',
  '𞤒' => '𞤴',
  '𞤓' => '𞤵',
  '𞤔' => '𞤶',
  '𞤕' => '𞤷',
  '𞤖' => '𞤸',
  '𞤗' => '𞤹',
  '𞤘' => '𞤺',
  '𞤙' => '𞤻',
  '𞤚' => '𞤼',
  '𞤛' => '𞤽',
  '𞤜' => '𞤾',
  '𞤝' => '𞤿',
  '𞤞' => '𞥀',
  '𞤟' => '𞥁',
  '𞤠' => '𞥂',
  '𞤡' => '𞥃',
);
<?php

// from Case_Ignorable in https://unicode.org/Public/UNIDATA/DerivedCoreProperties.txt

return '/(?<![\x{0027}\x{002E}\x{003A}\x{005E}\x{0060}\x{00A8}\x{00AD}\x{00AF}\x{00B4}\x{00B7}\x{00B8}\x{02B0}-\x{02C1}\x{02C2}-\x{02C5}\x{02C6}-\x{02D1}\x{02D2}-\x{02DF}\x{02E0}-\x{02E4}\x{02E5}-\x{02EB}\x{02EC}\x{02ED}\x{02EE}\x{02EF}-\x{02FF}\x{0300}-\x{036F}\x{0374}\x{0375}\x{037A}\x{0384}-\x{0385}\x{0387}\x{0483}-\x{0487}\x{0488}-\x{0489}\x{0559}\x{0591}-\x{05BD}\x{05BF}\x{05C1}-\x{05C2}\x{05C4}-\x{05C5}\x{05C7}\x{05F4}\x{0600}-\x{0605}\x{0610}-\x{061A}\x{061C}\x{0640}\x{064B}-\x{065F}\x{0670}\x{06D6}-\x{06DC}\x{06DD}\x{06DF}-\x{06E4}\x{06E5}-\x{06E6}\x{06E7}-\x{06E8}\x{06EA}-\x{06ED}\x{070F}\x{0711}\x{0730}-\x{074A}\x{07A6}-\x{07B0}\x{07EB}-\x{07F3}\x{07F4}-\x{07F5}\x{07FA}\x{07FD}\x{0816}-\x{0819}\x{081A}\x{081B}-\x{0823}\x{0824}\x{0825}-\x{0827}\x{0828}\x{0829}-\x{082D}\x{0859}-\x{085B}\x{08D3}-\x{08E1}\x{08E2}\x{08E3}-\x{0902}\x{093A}\x{093C}\x{0941}-\x{0948}\x{094D}\x{0951}-\x{0957}\x{0962}-\x{0963}\x{0971}\x{0981}\x{09BC}\x{09C1}-\x{09C4}\x{09CD}\x{09E2}-\x{09E3}\x{09FE}\x{0A01}-\x{0A02}\x{0A3C}\x{0A41}-\x{0A42}\x{0A47}-\x{0A48}\x{0A4B}-\x{0A4D}\x{0A51}\x{0A70}-\x{0A71}\x{0A75}\x{0A81}-\x{0A82}\x{0ABC}\x{0AC1}-\x{0AC5}\x{0AC7}-\x{0AC8}\x{0ACD}\x{0AE2}-\x{0AE3}\x{0AFA}-\x{0AFF}\x{0B01}\x{0B3C}\x{0B3F}\x{0B41}-\x{0B44}\x{0B4D}\x{0B56}\x{0B62}-\x{0B63}\x{0B82}\x{0BC0}\x{0BCD}\x{0C00}\x{0C04}\x{0C3E}-\x{0C40}\x{0C46}-\x{0C48}\x{0C4A}-\x{0C4D}\x{0C55}-\x{0C56}\x{0C62}-\x{0C63}\x{0C81}\x{0CBC}\x{0CBF}\x{0CC6}\x{0CCC}-\x{0CCD}\x{0CE2}-\x{0CE3}\x{0D00}-\x{0D01}\x{0D3B}-\x{0D3C}\x{0D41}-\x{0D44}\x{0D4D}\x{0D62}-\x{0D63}\x{0DCA}\x{0DD2}-\x{0DD4}\x{0DD6}\x{0E31}\x{0E34}-\x{0E3A}\x{0E46}\x{0E47}-\x{0E4E}\x{0EB1}\x{0EB4}-\x{0EB9}\x{0EBB}-\x{0EBC}\x{0EC6}\x{0EC8}-\x{0ECD}\x{0F18}-\x{0F19}\x{0F35}\x{0F37}\x{0F39}\x{0F71}-\x{0F7E}\x{0F80}-\x{0F84}\x{0F86}-\x{0F87}\x{0F8D}-\x{0F97}\x{0F99}-\x{0FBC}\x{0FC6}\x{102D}-\x{1030}\x{1032}-\x{1037}\x{1039}-\x{103A}\x{103D}-\x{103E}\x{1058}-\x{1059}\x{105E}-\x{1060}\x{1071}-\x{1074}\x{1082}\x{1085}-\x{1086}\x{108D}\x{109D}\x{10FC}\x{135D}-\x{135F}\x{1712}-\x{1714}\x{1732}-\x{1734}\x{1752}-\x{1753}\x{1772}-\x{1773}\x{17B4}-\x{17B5}\x{17B7}-\x{17BD}\x{17C6}\x{17C9}-\x{17D3}\x{17D7}\x{17DD}\x{180B}-\x{180D}\x{180E}\x{1843}\x{1885}-\x{1886}\x{18A9}\x{1920}-\x{1922}\x{1927}-\x{1928}\x{1932}\x{1939}-\x{193B}\x{1A17}-\x{1A18}\x{1A1B}\x{1A56}\x{1A58}-\x{1A5E}\x{1A60}\x{1A62}\x{1A65}-\x{1A6C}\x{1A73}-\x{1A7C}\x{1A7F}\x{1AA7}\x{1AB0}-\x{1ABD}\x{1ABE}\x{1B00}-\x{1B03}\x{1B34}\x{1B36}-\x{1B3A}\x{1B3C}\x{1B42}\x{1B6B}-\x{1B73}\x{1B80}-\x{1B81}\x{1BA2}-\x{1BA5}\x{1BA8}-\x{1BA9}\x{1BAB}-\x{1BAD}\x{1BE6}\x{1BE8}-\x{1BE9}\x{1BED}\x{1BEF}-\x{1BF1}\x{1C2C}-\x{1C33}\x{1C36}-\x{1C37}\x{1C78}-\x{1C7D}\x{1CD0}-\x{1CD2}\x{1CD4}-\x{1CE0}\x{1CE2}-\x{1CE8}\x{1CED}\x{1CF4}\x{1CF8}-\x{1CF9}\x{1D2C}-\x{1D6A}\x{1D78}\x{1D9B}-\x{1DBF}\x{1DC0}-\x{1DF9}\x{1DFB}-\x{1DFF}\x{1FBD}\x{1FBF}-\x{1FC1}\x{1FCD}-\x{1FCF}\x{1FDD}-\x{1FDF}\x{1FED}-\x{1FEF}\x{1FFD}-\x{1FFE}\x{200B}-\x{200F}\x{2018}\x{2019}\x{2024}\x{2027}\x{202A}-\x{202E}\x{2060}-\x{2064}\x{2066}-\x{206F}\x{2071}\x{207F}\x{2090}-\x{209C}\x{20D0}-\x{20DC}\x{20DD}-\x{20E0}\x{20E1}\x{20E2}-\x{20E4}\x{20E5}-\x{20F0}\x{2C7C}-\x{2C7D}\x{2CEF}-\x{2CF1}\x{2D6F}\x{2D7F}\x{2DE0}-\x{2DFF}\x{2E2F}\x{3005}\x{302A}-\x{302D}\x{3031}-\x{3035}\x{303B}\x{3099}-\x{309A}\x{309B}-\x{309C}\x{309D}-\x{309E}\x{30FC}-\x{30FE}\x{A015}\x{A4F8}-\x{A4FD}\x{A60C}\x{A66F}\x{A670}-\x{A672}\x{A674}-\x{A67D}\x{A67F}\x{A69C}-\x{A69D}\x{A69E}-\x{A69F}\x{A6F0}-\x{A6F1}\x{A700}-\x{A716}\x{A717}-\x{A71F}\x{A720}-\x{A721}\x{A770}\x{A788}\x{A789}-\x{A78A}\x{A7F8}-\x{A7F9}\x{A802}\x{A806}\x{A80B}\x{A825}-\x{A826}\x{A8C4}-\x{A8C5}\x{A8E0}-\x{A8F1}\x{A8FF}\x{A926}-\x{A92D}\x{A947}-\x{A951}\x{A980}-\x{A982}\x{A9B3}\x{A9B6}-\x{A9B9}\x{A9BC}\x{A9CF}\x{A9E5}\x{A9E6}\x{AA29}-\x{AA2E}\x{AA31}-\x{AA32}\x{AA35}-\x{AA36}\x{AA43}\x{AA4C}\x{AA70}\x{AA7C}\x{AAB0}\x{AAB2}-\x{AAB4}\x{AAB7}-\x{AAB8}\x{AABE}-\x{AABF}\x{AAC1}\x{AADD}\x{AAEC}-\x{AAED}\x{AAF3}-\x{AAF4}\x{AAF6}\x{AB5B}\x{AB5C}-\x{AB5F}\x{ABE5}\x{ABE8}\x{ABED}\x{FB1E}\x{FBB2}-\x{FBC1}\x{FE00}-\x{FE0F}\x{FE13}\x{FE20}-\x{FE2F}\x{FE52}\x{FE55}\x{FEFF}\x{FF07}\x{FF0E}\x{FF1A}\x{FF3E}\x{FF40}\x{FF70}\x{FF9E}-\x{FF9F}\x{FFE3}\x{FFF9}-\x{FFFB}\x{101FD}\x{102E0}\x{10376}-\x{1037A}\x{10A01}-\x{10A03}\x{10A05}-\x{10A06}\x{10A0C}-\x{10A0F}\x{10A38}-\x{10A3A}\x{10A3F}\x{10AE5}-\x{10AE6}\x{10D24}-\x{10D27}\x{10F46}-\x{10F50}\x{11001}\x{11038}-\x{11046}\x{1107F}-\x{11081}\x{110B3}-\x{110B6}\x{110B9}-\x{110BA}\x{110BD}\x{110CD}\x{11100}-\x{11102}\x{11127}-\x{1112B}\x{1112D}-\x{11134}\x{11173}\x{11180}-\x{11181}\x{111B6}-\x{111BE}\x{111C9}-\x{111CC}\x{1122F}-\x{11231}\x{11234}\x{11236}-\x{11237}\x{1123E}\x{112DF}\x{112E3}-\x{112EA}\x{11300}-\x{11301}\x{1133B}-\x{1133C}\x{11340}\x{11366}-\x{1136C}\x{11370}-\x{11374}\x{11438}-\x{1143F}\x{11442}-\x{11444}\x{11446}\x{1145E}\x{114B3}-\x{114B8}\x{114BA}\x{114BF}-\x{114C0}\x{114C2}-\x{114C3}\x{115B2}-\x{115B5}\x{115BC}-\x{115BD}\x{115BF}-\x{115C0}\x{115DC}-\x{115DD}\x{11633}-\x{1163A}\x{1163D}\x{1163F}-\x{11640}\x{116AB}\x{116AD}\x{116B0}-\x{116B5}\x{116B7}\x{1171D}-\x{1171F}\x{11722}-\x{11725}\x{11727}-\x{1172B}\x{1182F}-\x{11837}\x{11839}-\x{1183A}\x{11A01}-\x{11A0A}\x{11A33}-\x{11A38}\x{11A3B}-\x{11A3E}\x{11A47}\x{11A51}-\x{11A56}\x{11A59}-\x{11A5B}\x{11A8A}-\x{11A96}\x{11A98}-\x{11A99}\x{11C30}-\x{11C36}\x{11C38}-\x{11C3D}\x{11C3F}\x{11C92}-\x{11CA7}\x{11CAA}-\x{11CB0}\x{11CB2}-\x{11CB3}\x{11CB5}-\x{11CB6}\x{11D31}-\x{11D36}\x{11D3A}\x{11D3C}-\x{11D3D}\x{11D3F}-\x{11D45}\x{11D47}\x{11D90}-\x{11D91}\x{11D95}\x{11D97}\x{11EF3}-\x{11EF4}\x{16AF0}-\x{16AF4}\x{16B30}-\x{16B36}\x{16B40}-\x{16B43}\x{16F8F}-\x{16F92}\x{16F93}-\x{16F9F}\x{16FE0}-\x{16FE1}\x{1BC9D}-\x{1BC9E}\x{1BCA0}-\x{1BCA3}\x{1D167}-\x{1D169}\x{1D173}-\x{1D17A}\x{1D17B}-\x{1D182}\x{1D185}-\x{1D18B}\x{1D1AA}-\x{1D1AD}\x{1D242}-\x{1D244}\x{1DA00}-\x{1DA36}\x{1DA3B}-\x{1DA6C}\x{1DA75}\x{1DA84}\x{1DA9B}-\x{1DA9F}\x{1DAA1}-\x{1DAAF}\x{1E000}-\x{1E006}\x{1E008}-\x{1E018}\x{1E01B}-\x{1E021}\x{1E023}-\x{1E024}\x{1E026}-\x{1E02A}\x{1E8D0}-\x{1E8D6}\x{1E944}-\x{1E94A}\x{1F3FB}-\x{1F3FF}\x{E0001}\x{E0020}-\x{E007F}\x{E0100}-\x{E01EF}])(\pL)(\pL*+)/u';
<?php

return array (
  'a' => 'A',
  'b' => 'B',
  'c' => 'C',
  'd' => 'D',
  'e' => 'E',
  'f' => 'F',
  'g' => 'G',
  'h' => 'H',
  'i' => 'I',
  'j' => 'J',
  'k' => 'K',
  'l' => 'L',
  'm' => 'M',
  'n' => 'N',
  'o' => 'O',
  'p' => 'P',
  'q' => 'Q',
  'r' => 'R',
  's' => 'S',
  't' => 'T',
  'u' => 'U',
  'v' => 'V',
  'w' => 'W',
  'x' => 'X',
  'y' => 'Y',
  'z' => 'Z',
  'µ' => 'Μ',
  'à' => 'À',
  'á' => 'Á',
  'â' => 'Â',
  'ã' => 'Ã',
  'ä' => 'Ä',
  'å' => 'Å',
  'æ' => 'Æ',
  'ç' => 'Ç',
  'è' => 'È',
  'é' => 'É',
  'ê' => 'Ê',
  'ë' => 'Ë',
  'ì' => 'Ì',
  'í' => 'Í',
  'î' => 'Î',
  'ï' => 'Ï',
  'ð' => 'Ð',
  'ñ' => 'Ñ',
  'ò' => 'Ò',
  'ó' => 'Ó',
  'ô' => 'Ô',
  'õ' => 'Õ',
  'ö' => 'Ö',
  'ø' => 'Ø',
  'ù' => 'Ù',
  'ú' => 'Ú',
  'û' => 'Û',
  'ü' => 'Ü',
  'ý' => 'Ý',
  'þ' => 'Þ',
  'ÿ' => 'Ÿ',
  'ā' => 'Ā',
  'ă' => 'Ă',
  'ą' => 'Ą',
  'ć' => 'Ć',
  'ĉ' => 'Ĉ',
  'ċ' => 'Ċ',
  'č' => 'Č',
  'ď' => 'Ď',
  'đ' => 'Đ',
  'ē' => 'Ē',
  'ĕ' => 'Ĕ',
  'ė' => 'Ė',
  'ę' => 'Ę',
  'ě' => 'Ě',
  'ĝ' => 'Ĝ',
  'ğ' => 'Ğ',
  'ġ' => 'Ġ',
  'ģ' => 'Ģ',
  'ĥ' => 'Ĥ',
  'ħ' => 'Ħ',
  'ĩ' => 'Ĩ',
  'ī' => 'Ī',
  'ĭ' => 'Ĭ',
  'į' => 'Į',
  'ı' => 'I',
  'ij' => 'IJ',
  'ĵ' => 'Ĵ',
  'ķ' => 'Ķ',
  'ĺ' => 'Ĺ',
  'ļ' => 'Ļ',
  'ľ' => 'Ľ',
  'ŀ' => 'Ŀ',
  'ł' => 'Ł',
  'ń' => 'Ń',
  'ņ' => 'Ņ',
  'ň' => 'Ň',
  'ŋ' => 'Ŋ',
  'ō' => 'Ō',
  'ŏ' => 'Ŏ',
  'ő' => 'Ő',
  'œ' => 'Œ',
  'ŕ' => 'Ŕ',
  'ŗ' => 'Ŗ',
  'ř' => 'Ř',
  'ś' => 'Ś',
  'ŝ' => 'Ŝ',
  'ş' => 'Ş',
  'š' => 'Š',
  'ţ' => 'Ţ',
  'ť' => 'Ť',
  'ŧ' => 'Ŧ',
  'ũ' => 'Ũ',
  'ū' => 'Ū',
  'ŭ' => 'Ŭ',
  'ů' => 'Ů',
  'ű' => 'Ű',
  'ų' => 'Ų',
  'ŵ' => 'Ŵ',
  'ŷ' => 'Ŷ',
  'ź' => 'Ź',
  'ż' => 'Ż',
  'ž' => 'Ž',
  'ſ' => 'S',
  'ƀ' => 'Ƀ',
  'ƃ' => 'Ƃ',
  'ƅ' => 'Ƅ',
  'ƈ' => 'Ƈ',
  'ƌ' => 'Ƌ',
  'ƒ' => 'Ƒ',
  'ƕ' => 'Ƕ',
  'ƙ' => 'Ƙ',
  'ƚ' => 'Ƚ',
  'ƞ' => 'Ƞ',
  'ơ' => 'Ơ',
  'ƣ' => 'Ƣ',
  'ƥ' => 'Ƥ',
  'ƨ' => 'Ƨ',
  'ƭ' => 'Ƭ',
  'ư' => 'Ư',
  'ƴ' => 'Ƴ',
  'ƶ' => 'Ƶ',
  'ƹ' => 'Ƹ',
  'ƽ' => 'Ƽ',
  'ƿ' => 'Ƿ',
  'Dž' => 'DŽ',
  'dž' => 'DŽ',
  'Lj' => 'LJ',
  'lj' => 'LJ',
  'Nj' => 'NJ',
  'nj' => 'NJ',
  'ǎ' => 'Ǎ',
  'ǐ' => 'Ǐ',
  'ǒ' => 'Ǒ',
  'ǔ' => 'Ǔ',
  'ǖ' => 'Ǖ',
  'ǘ' => 'Ǘ',
  'ǚ' => 'Ǚ',
  'ǜ' => 'Ǜ',
  'ǝ' => 'Ǝ',
  'ǟ' => 'Ǟ',
  'ǡ' => 'Ǡ',
  'ǣ' => 'Ǣ',
  'ǥ' => 'Ǥ',
  'ǧ' => 'Ǧ',
  'ǩ' => 'Ǩ',
  'ǫ' => 'Ǫ',
  'ǭ' => 'Ǭ',
  'ǯ' => 'Ǯ',
  'Dz' => 'DZ',
  'dz' => 'DZ',
  'ǵ' => 'Ǵ',
  'ǹ' => 'Ǹ',
  'ǻ' => 'Ǻ',
  'ǽ' => 'Ǽ',
  'ǿ' => 'Ǿ',
  'ȁ' => 'Ȁ',
  'ȃ' => 'Ȃ',
  'ȅ' => 'Ȅ',
  'ȇ' => 'Ȇ',
  'ȉ' => 'Ȉ',
  'ȋ' => 'Ȋ',
  'ȍ' => 'Ȍ',
  'ȏ' => 'Ȏ',
  'ȑ' => 'Ȑ',
  'ȓ' => 'Ȓ',
  'ȕ' => 'Ȕ',
  'ȗ' => 'Ȗ',
  'ș' => 'Ș',
  'ț' => 'Ț',
  'ȝ' => 'Ȝ',
  'ȟ' => 'Ȟ',
  'ȣ' => 'Ȣ',
  'ȥ' => 'Ȥ',
  'ȧ' => 'Ȧ',
  'ȩ' => 'Ȩ',
  'ȫ' => 'Ȫ',
  'ȭ' => 'Ȭ',
  'ȯ' => 'Ȯ',
  'ȱ' => 'Ȱ',
  'ȳ' => 'Ȳ',
  'ȼ' => 'Ȼ',
  'ȿ' => 'Ȿ',
  'ɀ' => 'Ɀ',
  'ɂ' => 'Ɂ',
  'ɇ' => 'Ɇ',
  'ɉ' => 'Ɉ',
  'ɋ' => 'Ɋ',
  'ɍ' => 'Ɍ',
  'ɏ' => 'Ɏ',
  'ɐ' => 'Ɐ',
  'ɑ' => 'Ɑ',
  'ɒ' => 'Ɒ',
  'ɓ' => 'Ɓ',
  'ɔ' => 'Ɔ',
  'ɖ' => 'Ɖ',
  'ɗ' => 'Ɗ',
  'ə' => 'Ə',
  'ɛ' => 'Ɛ',
  'ɜ' => 'Ɜ',
  'ɠ' => 'Ɠ',
  'ɡ' => 'Ɡ',
  'ɣ' => 'Ɣ',
  'ɥ' => 'Ɥ',
  'ɦ' => 'Ɦ',
  'ɨ' => 'Ɨ',
  'ɩ' => 'Ɩ',
  'ɪ' => 'Ɪ',
  'ɫ' => 'Ɫ',
  'ɬ' => 'Ɬ',
  'ɯ' => 'Ɯ',
  'ɱ' => 'Ɱ',
  'ɲ' => 'Ɲ',
  'ɵ' => 'Ɵ',
  'ɽ' => 'Ɽ',
  'ʀ' => 'Ʀ',
  'ʂ' => 'Ʂ',
  'ʃ' => 'Ʃ',
  'ʇ' => 'Ʇ',
  'ʈ' => 'Ʈ',
  'ʉ' => 'Ʉ',
  'ʊ' => 'Ʊ',
  'ʋ' => 'Ʋ',
  'ʌ' => 'Ʌ',
  'ʒ' => 'Ʒ',
  'ʝ' => 'Ʝ',
  'ʞ' => 'Ʞ',
  'ͅ' => 'Ι',
  'ͱ' => 'Ͱ',
  'ͳ' => 'Ͳ',
  'ͷ' => 'Ͷ',
  'ͻ' => 'Ͻ',
  'ͼ' => 'Ͼ',
  'ͽ' => 'Ͽ',
  'ά' => 'Ά',
  'έ' => 'Έ',
  'ή' => 'Ή',
  'ί' => 'Ί',
  'α' => 'Α',
  'β' => 'Β',
  'γ' => 'Γ',
  'δ' => 'Δ',
  'ε' => 'Ε',
  'ζ' => 'Ζ',
  'η' => 'Η',
  'θ' => 'Θ',
  'ι' => 'Ι',
  'κ' => 'Κ',
  'λ' => 'Λ',
  'μ' => 'Μ',
  'ν' => 'Ν',
  'ξ' => 'Ξ',
  'ο' => 'Ο',
  'π' => 'Π',
  'ρ' => 'Ρ',
  'ς' => 'Σ',
  'σ' => 'Σ',
  'τ' => 'Τ',
  'υ' => 'Υ',
  'φ' => 'Φ',
  'χ' => 'Χ',
  'ψ' => 'Ψ',
  'ω' => 'Ω',
  'ϊ' => 'Ϊ',
  'ϋ' => 'Ϋ',
  'ό' => 'Ό',
  'ύ' => 'Ύ',
  'ώ' => 'Ώ',
  'ϐ' => 'Β',
  'ϑ' => 'Θ',
  'ϕ' => 'Φ',
  'ϖ' => 'Π',
  'ϗ' => 'Ϗ',
  'ϙ' => 'Ϙ',
  'ϛ' => 'Ϛ',
  'ϝ' => 'Ϝ',
  'ϟ' => 'Ϟ',
  'ϡ' => 'Ϡ',
  'ϣ' => 'Ϣ',
  'ϥ' => 'Ϥ',
  'ϧ' => 'Ϧ',
  'ϩ' => 'Ϩ',
  'ϫ' => 'Ϫ',
  'ϭ' => 'Ϭ',
  'ϯ' => 'Ϯ',
  'ϰ' => 'Κ',
  'ϱ' => 'Ρ',
  'ϲ' => 'Ϲ',
  'ϳ' => 'Ϳ',
  'ϵ' => 'Ε',
  'ϸ' => 'Ϸ',
  'ϻ' => 'Ϻ',
  'а' => 'А',
  'б' => 'Б',
  'в' => 'В',
  'г' => 'Г',
  'д' => 'Д',
  'е' => 'Е',
  'ж' => 'Ж',
  'з' => 'З',
  'и' => 'И',
  'й' => 'Й',
  'к' => 'К',
  'л' => 'Л',
  'м' => 'М',
  'н' => 'Н',
  'о' => 'О',
  'п' => 'П',
  'р' => 'Р',
  'с' => 'С',
  'т' => 'Т',
  'у' => 'У',
  'ф' => 'Ф',
  'х' => 'Х',
  'ц' => 'Ц',
  'ч' => 'Ч',
  'ш' => 'Ш',
  'щ' => 'Щ',
  'ъ' => 'Ъ',
  'ы' => 'Ы',
  'ь' => 'Ь',
  'э' => 'Э',
  'ю' => 'Ю',
  'я' => 'Я',
  'ѐ' => 'Ѐ',
  'ё' => 'Ё',
  'ђ' => 'Ђ',
  'ѓ' => 'Ѓ',
  'є' => 'Є',
  'ѕ' => 'Ѕ',
  'і' => 'І',
  'ї' => 'Ї',
  'ј' => 'Ј',
  'љ' => 'Љ',
  'њ' => 'Њ',
  'ћ' => 'Ћ',
  'ќ' => 'Ќ',
  'ѝ' => 'Ѝ',
  'ў' => 'Ў',
  'џ' => 'Џ',
  'ѡ' => 'Ѡ',
  'ѣ' => 'Ѣ',
  'ѥ' => 'Ѥ',
  'ѧ' => 'Ѧ',
  'ѩ' => 'Ѩ',
  'ѫ' => 'Ѫ',
  'ѭ' => 'Ѭ',
  'ѯ' => 'Ѯ',
  'ѱ' => 'Ѱ',
  'ѳ' => 'Ѳ',
  'ѵ' => 'Ѵ',
  'ѷ' => 'Ѷ',
  'ѹ' => 'Ѹ',
  'ѻ' => 'Ѻ',
  'ѽ' => 'Ѽ',
  'ѿ' => 'Ѿ',
  'ҁ' => 'Ҁ',
  'ҋ' => 'Ҋ',
  'ҍ' => 'Ҍ',
  'ҏ' => 'Ҏ',
  'ґ' => 'Ґ',
  'ғ' => 'Ғ',
  'ҕ' => 'Ҕ',
  'җ' => 'Җ',
  'ҙ' => 'Ҙ',
  'қ' => 'Қ',
  'ҝ' => 'Ҝ',
  'ҟ' => 'Ҟ',
  'ҡ' => 'Ҡ',
  'ң' => 'Ң',
  'ҥ' => 'Ҥ',
  'ҧ' => 'Ҧ',
  'ҩ' => 'Ҩ',
  'ҫ' => 'Ҫ',
  'ҭ' => 'Ҭ',
  'ү' => 'Ү',
  'ұ' => 'Ұ',
  'ҳ' => 'Ҳ',
  'ҵ' => 'Ҵ',
  'ҷ' => 'Ҷ',
  'ҹ' => 'Ҹ',
  'һ' => 'Һ',
  'ҽ' => 'Ҽ',
  'ҿ' => 'Ҿ',
  'ӂ' => 'Ӂ',
  'ӄ' => 'Ӄ',
  'ӆ' => 'Ӆ',
  'ӈ' => 'Ӈ',
  'ӊ' => 'Ӊ',
  'ӌ' => 'Ӌ',
  'ӎ' => 'Ӎ',
  'ӏ' => 'Ӏ',
  'ӑ' => 'Ӑ',
  'ӓ' => 'Ӓ',
  'ӕ' => 'Ӕ',
  'ӗ' => 'Ӗ',
  'ә' => 'Ә',
  'ӛ' => 'Ӛ',
  'ӝ' => 'Ӝ',
  'ӟ' => 'Ӟ',
  'ӡ' => 'Ӡ',
  'ӣ' => 'Ӣ',
  'ӥ' => 'Ӥ',
  'ӧ' => 'Ӧ',
  'ө' => 'Ө',
  'ӫ' => 'Ӫ',
  'ӭ' => 'Ӭ',
  'ӯ' => 'Ӯ',
  'ӱ' => 'Ӱ',
  'ӳ' => 'Ӳ',
  'ӵ' => 'Ӵ',
  'ӷ' => 'Ӷ',
  'ӹ' => 'Ӹ',
  'ӻ' => 'Ӻ',
  'ӽ' => 'Ӽ',
  'ӿ' => 'Ӿ',
  'ԁ' => 'Ԁ',
  'ԃ' => 'Ԃ',
  'ԅ' => 'Ԅ',
  'ԇ' => 'Ԇ',
  'ԉ' => 'Ԉ',
  'ԋ' => 'Ԋ',
  'ԍ' => 'Ԍ',
  'ԏ' => 'Ԏ',
  'ԑ' => 'Ԑ',
  'ԓ' => 'Ԓ',
  'ԕ' => 'Ԕ',
  'ԗ' => 'Ԗ',
  'ԙ' => 'Ԙ',
  'ԛ' => 'Ԛ',
  'ԝ' => 'Ԝ',
  'ԟ' => 'Ԟ',
  'ԡ' => 'Ԡ',
  'ԣ' => 'Ԣ',
  'ԥ' => 'Ԥ',
  'ԧ' => 'Ԧ',
  'ԩ' => 'Ԩ',
  'ԫ' => 'Ԫ',
  'ԭ' => 'Ԭ',
  'ԯ' => 'Ԯ',
  'ա' => 'Ա',
  'բ' => 'Բ',
  'գ' => 'Գ',
  'դ' => 'Դ',
  'ե' => 'Ե',
  'զ' => 'Զ',
  'է' => 'Է',
  'ը' => 'Ը',
  'թ' => 'Թ',
  'ժ' => 'Ժ',
  'ի' => 'Ի',
  'լ' => 'Լ',
  'խ' => 'Խ',
  'ծ' => 'Ծ',
  'կ' => 'Կ',
  'հ' => 'Հ',
  'ձ' => 'Ձ',
  'ղ' => 'Ղ',
  'ճ' => 'Ճ',
  'մ' => 'Մ',
  'յ' => 'Յ',
  'ն' => 'Ն',
  'շ' => 'Շ',
  'ո' => 'Ո',
  'չ' => 'Չ',
  'պ' => 'Պ',
  'ջ' => 'Ջ',
  'ռ' => 'Ռ',
  'ս' => 'Ս',
  'վ' => 'Վ',
  'տ' => 'Տ',
  'ր' => 'Ր',
  'ց' => 'Ց',
  'ւ' => 'Ւ',
  'փ' => 'Փ',
  'ք' => 'Ք',
  'օ' => 'Օ',
  'ֆ' => 'Ֆ',
  'ა' => 'Ა',
  'ბ' => 'Ბ',
  'გ' => 'Გ',
  'დ' => 'Დ',
  'ე' => 'Ე',
  'ვ' => 'Ვ',
  'ზ' => 'Ზ',
  'თ' => 'Თ',
  'ი' => 'Ი',
  'კ' => 'Კ',
  'ლ' => 'Ლ',
  'მ' => 'Მ',
  'ნ' => 'Ნ',
  'ო' => 'Ო',
  'პ' => 'Პ',
  'ჟ' => 'Ჟ',
  'რ' => 'Რ',
  'ს' => 'Ს',
  'ტ' => 'Ტ',
  'უ' => 'Უ',
  'ფ' => 'Ფ',
  'ქ' => 'Ქ',
  'ღ' => 'Ღ',
  'ყ' => 'Ყ',
  'შ' => 'Შ',
  'ჩ' => 'Ჩ',
  'ც' => 'Ც',
  'ძ' => 'Ძ',
  'წ' => 'Წ',
  'ჭ' => 'Ჭ',
  'ხ' => 'Ხ',
  'ჯ' => 'Ჯ',
  'ჰ' => 'Ჰ',
  'ჱ' => 'Ჱ',
  'ჲ' => 'Ჲ',
  'ჳ' => 'Ჳ',
  'ჴ' => 'Ჴ',
  'ჵ' => 'Ჵ',
  'ჶ' => 'Ჶ',
  'ჷ' => 'Ჷ',
  'ჸ' => 'Ჸ',
  'ჹ' => 'Ჹ',
  'ჺ' => 'Ჺ',
  'ჽ' => 'Ჽ',
  'ჾ' => 'Ჾ',
  'ჿ' => 'Ჿ',
  'ᏸ' => 'Ᏸ',
  'ᏹ' => 'Ᏹ',
  'ᏺ' => 'Ᏺ',
  'ᏻ' => 'Ᏻ',
  'ᏼ' => 'Ᏼ',
  'ᏽ' => 'Ᏽ',
  'ᲀ' => 'В',
  'ᲁ' => 'Д',
  'ᲂ' => 'О',
  'ᲃ' => 'С',
  'ᲄ' => 'Т',
  'ᲅ' => 'Т',
  'ᲆ' => 'Ъ',
  'ᲇ' => 'Ѣ',
  'ᲈ' => 'Ꙋ',
  'ᵹ' => 'Ᵹ',
  'ᵽ' => 'Ᵽ',
  'ᶎ' => 'Ᶎ',
  'ḁ' => 'Ḁ',
  'ḃ' => 'Ḃ',
  'ḅ' => 'Ḅ',
  'ḇ' => 'Ḇ',
  'ḉ' => 'Ḉ',
  'ḋ' => 'Ḋ',
  'ḍ' => 'Ḍ',
  'ḏ' => 'Ḏ',
  'ḑ' => 'Ḑ',
  'ḓ' => 'Ḓ',
  'ḕ' => 'Ḕ',
  'ḗ' => 'Ḗ',
  'ḙ' => 'Ḙ',
  'ḛ' => 'Ḛ',
  'ḝ' => 'Ḝ',
  'ḟ' => 'Ḟ',
  'ḡ' => 'Ḡ',
  'ḣ' => 'Ḣ',
  'ḥ' => 'Ḥ',
  'ḧ' => 'Ḧ',
  'ḩ' => 'Ḩ',
  'ḫ' => 'Ḫ',
  'ḭ' => 'Ḭ',
  'ḯ' => 'Ḯ',
  'ḱ' => 'Ḱ',
  'ḳ' => 'Ḳ',
  'ḵ' => 'Ḵ',
  'ḷ' => 'Ḷ',
  'ḹ' => 'Ḹ',
  'ḻ' => 'Ḻ',
  'ḽ' => 'Ḽ',
  'ḿ' => 'Ḿ',
  'ṁ' => 'Ṁ',
  'ṃ' => 'Ṃ',
  'ṅ' => 'Ṅ',
  'ṇ' => 'Ṇ',
  'ṉ' => 'Ṉ',
  'ṋ' => 'Ṋ',
  'ṍ' => 'Ṍ',
  'ṏ' => 'Ṏ',
  'ṑ' => 'Ṑ',
  'ṓ' => 'Ṓ',
  'ṕ' => 'Ṕ',
  'ṗ' => 'Ṗ',
  'ṙ' => 'Ṙ',
  'ṛ' => 'Ṛ',
  'ṝ' => 'Ṝ',
  'ṟ' => 'Ṟ',
  'ṡ' => 'Ṡ',
  'ṣ' => 'Ṣ',
  'ṥ' => 'Ṥ',
  'ṧ' => 'Ṧ',
  'ṩ' => 'Ṩ',
  'ṫ' => 'Ṫ',
  'ṭ' => 'Ṭ',
  'ṯ' => 'Ṯ',
  'ṱ' => 'Ṱ',
  'ṳ' => 'Ṳ',
  'ṵ' => 'Ṵ',
  'ṷ' => 'Ṷ',
  'ṹ' => 'Ṹ',
  'ṻ' => 'Ṻ',
  'ṽ' => 'Ṽ',
  'ṿ' => 'Ṿ',
  'ẁ' => 'Ẁ',
  'ẃ' => 'Ẃ',
  'ẅ' => 'Ẅ',
  'ẇ' => 'Ẇ',
  'ẉ' => 'Ẉ',
  'ẋ' => 'Ẋ',
  'ẍ' => 'Ẍ',
  'ẏ' => 'Ẏ',
  'ẑ' => 'Ẑ',
  'ẓ' => 'Ẓ',
  'ẕ' => 'Ẕ',
  'ẛ' => 'Ṡ',
  'ạ' => 'Ạ',
  'ả' => 'Ả',
  'ấ' => 'Ấ',
  'ầ' => 'Ầ',
  'ẩ' => 'Ẩ',
  'ẫ' => 'Ẫ',
  'ậ' => 'Ậ',
  'ắ' => 'Ắ',
  'ằ' => 'Ằ',
  'ẳ' => 'Ẳ',
  'ẵ' => 'Ẵ',
  'ặ' => 'Ặ',
  'ẹ' => 'Ẹ',
  'ẻ' => 'Ẻ',
  'ẽ' => 'Ẽ',
  'ế' => 'Ế',
  'ề' => 'Ề',
  'ể' => 'Ể',
  'ễ' => 'Ễ',
  'ệ' => 'Ệ',
  'ỉ' => 'Ỉ',
  'ị' => 'Ị',
  'ọ' => 'Ọ',
  'ỏ' => 'Ỏ',
  'ố' => 'Ố',
  'ồ' => 'Ồ',
  'ổ' => 'Ổ',
  'ỗ' => 'Ỗ',
  'ộ' => 'Ộ',
  'ớ' => 'Ớ',
  'ờ' => 'Ờ',
  'ở' => 'Ở',
  'ỡ' => 'Ỡ',
  'ợ' => 'Ợ',
  'ụ' => 'Ụ',
  'ủ' => 'Ủ',
  'ứ' => 'Ứ',
  'ừ' => 'Ừ',
  'ử' => 'Ử',
  'ữ' => 'Ữ',
  'ự' => 'Ự',
  'ỳ' => 'Ỳ',
  'ỵ' => 'Ỵ',
  'ỷ' => 'Ỷ',
  'ỹ' => 'Ỹ',
  'ỻ' => 'Ỻ',
  'ỽ' => 'Ỽ',
  'ỿ' => 'Ỿ',
  'ἀ' => 'Ἀ',
  'ἁ' => 'Ἁ',
  'ἂ' => 'Ἂ',
  'ἃ' => 'Ἃ',
  'ἄ' => 'Ἄ',
  'ἅ' => 'Ἅ',
  'ἆ' => 'Ἆ',
  'ἇ' => 'Ἇ',
  'ἐ' => 'Ἐ',
  'ἑ' => 'Ἑ',
  'ἒ' => 'Ἒ',
  'ἓ' => 'Ἓ',
  'ἔ' => 'Ἔ',
  'ἕ' => 'Ἕ',
  'ἠ' => 'Ἠ',
  'ἡ' => 'Ἡ',
  'ἢ' => 'Ἢ',
  'ἣ' => 'Ἣ',
  'ἤ' => 'Ἤ',
  'ἥ' => 'Ἥ',
  'ἦ' => 'Ἦ',
  'ἧ' => 'Ἧ',
  'ἰ' => 'Ἰ',
  'ἱ' => 'Ἱ',
  'ἲ' => 'Ἲ',
  'ἳ' => 'Ἳ',
  'ἴ' => 'Ἴ',
  'ἵ' => 'Ἵ',
  'ἶ' => 'Ἶ',
  'ἷ' => 'Ἷ',
  'ὀ' => 'Ὀ',
  'ὁ' => 'Ὁ',
  'ὂ' => 'Ὂ',
  'ὃ' => 'Ὃ',
  'ὄ' => 'Ὄ',
  'ὅ' => 'Ὅ',
  'ὑ' => 'Ὑ',
  'ὓ' => 'Ὓ',
  'ὕ' => 'Ὕ',
  'ὗ' => 'Ὗ',
  'ὠ' => 'Ὠ',
  'ὡ' => 'Ὡ',
  'ὢ' => 'Ὢ',
  'ὣ' => 'Ὣ',
  'ὤ' => 'Ὤ',
  'ὥ' => 'Ὥ',
  'ὦ' => 'Ὦ',
  'ὧ' => 'Ὧ',
  'ὰ' => 'Ὰ',
  'ά' => 'Ά',
  'ὲ' => 'Ὲ',
  'έ' => 'Έ',
  'ὴ' => 'Ὴ',
  'ή' => 'Ή',
  'ὶ' => 'Ὶ',
  'ί' => 'Ί',
  'ὸ' => 'Ὸ',
  'ό' => 'Ό',
  'ὺ' => 'Ὺ',
  'ύ' => 'Ύ',
  'ὼ' => 'Ὼ',
  'ώ' => 'Ώ',
  'ᾀ' => 'ἈΙ',
  'ᾁ' => 'ἉΙ',
  'ᾂ' => 'ἊΙ',
  'ᾃ' => 'ἋΙ',
  'ᾄ' => 'ἌΙ',
  'ᾅ' => 'ἍΙ',
  'ᾆ' => 'ἎΙ',
  'ᾇ' => 'ἏΙ',
  'ᾐ' => 'ἨΙ',
  'ᾑ' => 'ἩΙ',
  'ᾒ' => 'ἪΙ',
  'ᾓ' => 'ἫΙ',
  'ᾔ' => 'ἬΙ',
  'ᾕ' => 'ἭΙ',
  'ᾖ' => 'ἮΙ',
  'ᾗ' => 'ἯΙ',
  'ᾠ' => 'ὨΙ',
  'ᾡ' => 'ὩΙ',
  'ᾢ' => 'ὪΙ',
  'ᾣ' => 'ὫΙ',
  'ᾤ' => 'ὬΙ',
  'ᾥ' => 'ὭΙ',
  'ᾦ' => 'ὮΙ',
  'ᾧ' => 'ὯΙ',
  'ᾰ' => 'Ᾰ',
  'ᾱ' => 'Ᾱ',
  'ᾳ' => 'ΑΙ',
  'ι' => 'Ι',
  'ῃ' => 'ΗΙ',
  'ῐ' => 'Ῐ',
  'ῑ' => 'Ῑ',
  'ῠ' => 'Ῠ',
  'ῡ' => 'Ῡ',
  'ῥ' => 'Ῥ',
  'ῳ' => 'ΩΙ',
  'ⅎ' => 'Ⅎ',
  'ⅰ' => 'Ⅰ',
  'ⅱ' => 'Ⅱ',
  'ⅲ' => 'Ⅲ',
  'ⅳ' => 'Ⅳ',
  'ⅴ' => 'Ⅴ',
  'ⅵ' => 'Ⅵ',
  'ⅶ' => 'Ⅶ',
  'ⅷ' => 'Ⅷ',
  'ⅸ' => 'Ⅸ',
  'ⅹ' => 'Ⅹ',
  'ⅺ' => 'Ⅺ',
  'ⅻ' => 'Ⅻ',
  'ⅼ' => 'Ⅼ',
  'ⅽ' => 'Ⅽ',
  'ⅾ' => 'Ⅾ',
  'ⅿ' => 'Ⅿ',
  'ↄ' => 'Ↄ',
  'ⓐ' => 'Ⓐ',
  'ⓑ' => 'Ⓑ',
  'ⓒ' => 'Ⓒ',
  'ⓓ' => 'Ⓓ',
  'ⓔ' => 'Ⓔ',
  'ⓕ' => 'Ⓕ',
  'ⓖ' => 'Ⓖ',
  'ⓗ' => 'Ⓗ',
  'ⓘ' => 'Ⓘ',
  'ⓙ' => 'Ⓙ',
  'ⓚ' => 'Ⓚ',
  'ⓛ' => 'Ⓛ',
  'ⓜ' => 'Ⓜ',
  'ⓝ' => 'Ⓝ',
  'ⓞ' => 'Ⓞ',
  'ⓟ' => 'Ⓟ',
  'ⓠ' => 'Ⓠ',
  'ⓡ' => 'Ⓡ',
  'ⓢ' => 'Ⓢ',
  'ⓣ' => 'Ⓣ',
  'ⓤ' => 'Ⓤ',
  'ⓥ' => 'Ⓥ',
  'ⓦ' => 'Ⓦ',
  'ⓧ' => 'Ⓧ',
  'ⓨ' => 'Ⓨ',
  'ⓩ' => 'Ⓩ',
  'ⰰ' => 'Ⰰ',
  'ⰱ' => 'Ⰱ',
  'ⰲ' => 'Ⰲ',
  'ⰳ' => 'Ⰳ',
  'ⰴ' => 'Ⰴ',
  'ⰵ' => 'Ⰵ',
  'ⰶ' => 'Ⰶ',
  'ⰷ' => 'Ⰷ',
  'ⰸ' => 'Ⰸ',
  'ⰹ' => 'Ⰹ',
  'ⰺ' => 'Ⰺ',
  'ⰻ' => 'Ⰻ',
  'ⰼ' => 'Ⰼ',
  'ⰽ' => 'Ⰽ',
  'ⰾ' => 'Ⰾ',
  'ⰿ' => 'Ⰿ',
  'ⱀ' => 'Ⱀ',
  'ⱁ' => 'Ⱁ',
  'ⱂ' => 'Ⱂ',
  'ⱃ' => 'Ⱃ',
  'ⱄ' => 'Ⱄ',
  'ⱅ' => 'Ⱅ',
  'ⱆ' => 'Ⱆ',
  'ⱇ' => 'Ⱇ',
  'ⱈ' => 'Ⱈ',
  'ⱉ' => 'Ⱉ',
  'ⱊ' => 'Ⱊ',
  'ⱋ' => 'Ⱋ',
  'ⱌ' => 'Ⱌ',
  'ⱍ' => 'Ⱍ',
  'ⱎ' => 'Ⱎ',
  'ⱏ' => 'Ⱏ',
  'ⱐ' => 'Ⱐ',
  'ⱑ' => 'Ⱑ',
  'ⱒ' => 'Ⱒ',
  'ⱓ' => 'Ⱓ',
  'ⱔ' => 'Ⱔ',
  'ⱕ' => 'Ⱕ',
  'ⱖ' => 'Ⱖ',
  'ⱗ' => 'Ⱗ',
  'ⱘ' => 'Ⱘ',
  'ⱙ' => 'Ⱙ',
  'ⱚ' => 'Ⱚ',
  'ⱛ' => 'Ⱛ',
  'ⱜ' => 'Ⱜ',
  'ⱝ' => 'Ⱝ',
  'ⱞ' => 'Ⱞ',
  'ⱡ' => 'Ⱡ',
  'ⱥ' => 'Ⱥ',
  'ⱦ' => 'Ⱦ',
  'ⱨ' => 'Ⱨ',
  'ⱪ' => 'Ⱪ',
  'ⱬ' => 'Ⱬ',
  'ⱳ' => 'Ⱳ',
  'ⱶ' => 'Ⱶ',
  'ⲁ' => 'Ⲁ',
  'ⲃ' => 'Ⲃ',
  'ⲅ' => 'Ⲅ',
  'ⲇ' => 'Ⲇ',
  'ⲉ' => 'Ⲉ',
  'ⲋ' => 'Ⲋ',
  'ⲍ' => 'Ⲍ',
  'ⲏ' => 'Ⲏ',
  'ⲑ' => 'Ⲑ',
  'ⲓ' => 'Ⲓ',
  'ⲕ' => 'Ⲕ',
  'ⲗ' => 'Ⲗ',
  'ⲙ' => 'Ⲙ',
  'ⲛ' => 'Ⲛ',
  'ⲝ' => 'Ⲝ',
  'ⲟ' => 'Ⲟ',
  'ⲡ' => 'Ⲡ',
  'ⲣ' => 'Ⲣ',
  'ⲥ' => 'Ⲥ',
  'ⲧ' => 'Ⲧ',
  'ⲩ' => 'Ⲩ',
  'ⲫ' => 'Ⲫ',
  'ⲭ' => 'Ⲭ',
  'ⲯ' => 'Ⲯ',
  'ⲱ' => 'Ⲱ',
  'ⲳ' => 'Ⲳ',
  'ⲵ' => 'Ⲵ',
  'ⲷ' => 'Ⲷ',
  'ⲹ' => 'Ⲹ',
  'ⲻ' => 'Ⲻ',
  'ⲽ' => 'Ⲽ',
  'ⲿ' => 'Ⲿ',
  'ⳁ' => 'Ⳁ',
  'ⳃ' => 'Ⳃ',
  'ⳅ' => 'Ⳅ',
  'ⳇ' => 'Ⳇ',
  'ⳉ' => 'Ⳉ',
  'ⳋ' => 'Ⳋ',
  'ⳍ' => 'Ⳍ',
  'ⳏ' => 'Ⳏ',
  'ⳑ' => 'Ⳑ',
  'ⳓ' => 'Ⳓ',
  'ⳕ' => 'Ⳕ',
  'ⳗ' => 'Ⳗ',
  'ⳙ' => 'Ⳙ',
  'ⳛ' => 'Ⳛ',
  'ⳝ' => 'Ⳝ',
  'ⳟ' => 'Ⳟ',
  'ⳡ' => 'Ⳡ',
  'ⳣ' => 'Ⳣ',
  'ⳬ' => 'Ⳬ',
  'ⳮ' => 'Ⳮ',
  'ⳳ' => 'Ⳳ',
  'ⴀ' => 'Ⴀ',
  'ⴁ' => 'Ⴁ',
  'ⴂ' => 'Ⴂ',
  'ⴃ' => 'Ⴃ',
  'ⴄ' => 'Ⴄ',
  'ⴅ' => 'Ⴅ',
  'ⴆ' => 'Ⴆ',
  'ⴇ' => 'Ⴇ',
  'ⴈ' => 'Ⴈ',
  'ⴉ' => 'Ⴉ',
  'ⴊ' => 'Ⴊ',
  'ⴋ' => 'Ⴋ',
  'ⴌ' => 'Ⴌ',
  'ⴍ' => 'Ⴍ',
  'ⴎ' => 'Ⴎ',
  'ⴏ' => 'Ⴏ',
  'ⴐ' => 'Ⴐ',
  'ⴑ' => 'Ⴑ',
  'ⴒ' => 'Ⴒ',
  'ⴓ' => 'Ⴓ',
  'ⴔ' => 'Ⴔ',
  'ⴕ' => 'Ⴕ',
  'ⴖ' => 'Ⴖ',
  'ⴗ' => 'Ⴗ',
  'ⴘ' => 'Ⴘ',
  'ⴙ' => 'Ⴙ',
  'ⴚ' => 'Ⴚ',
  'ⴛ' => 'Ⴛ',
  'ⴜ' => 'Ⴜ',
  'ⴝ' => 'Ⴝ',
  'ⴞ' => 'Ⴞ',
  'ⴟ' => 'Ⴟ',
  'ⴠ' => 'Ⴠ',
  'ⴡ' => 'Ⴡ',
  'ⴢ' => 'Ⴢ',
  'ⴣ' => 'Ⴣ',
  'ⴤ' => 'Ⴤ',
  'ⴥ' => 'Ⴥ',
  'ⴧ' => 'Ⴧ',
  'ⴭ' => 'Ⴭ',
  'ꙁ' => 'Ꙁ',
  'ꙃ' => 'Ꙃ',
  'ꙅ' => 'Ꙅ',
  'ꙇ' => 'Ꙇ',
  'ꙉ' => 'Ꙉ',
  'ꙋ' => 'Ꙋ',
  'ꙍ' => 'Ꙍ',
  'ꙏ' => 'Ꙏ',
  'ꙑ' => 'Ꙑ',
  'ꙓ' => 'Ꙓ',
  'ꙕ' => 'Ꙕ',
  'ꙗ' => 'Ꙗ',
  'ꙙ' => 'Ꙙ',
  'ꙛ' => 'Ꙛ',
  'ꙝ' => 'Ꙝ',
  'ꙟ' => 'Ꙟ',
  'ꙡ' => 'Ꙡ',
  'ꙣ' => 'Ꙣ',
  'ꙥ' => 'Ꙥ',
  'ꙧ' => 'Ꙧ',
  'ꙩ' => 'Ꙩ',
  'ꙫ' => 'Ꙫ',
  'ꙭ' => 'Ꙭ',
  'ꚁ' => 'Ꚁ',
  'ꚃ' => 'Ꚃ',
  'ꚅ' => 'Ꚅ',
  'ꚇ' => 'Ꚇ',
  'ꚉ' => 'Ꚉ',
  'ꚋ' => 'Ꚋ',
  'ꚍ' => 'Ꚍ',
  'ꚏ' => 'Ꚏ',
  'ꚑ' => 'Ꚑ',
  'ꚓ' => 'Ꚓ',
  'ꚕ' => 'Ꚕ',
  'ꚗ' => 'Ꚗ',
  'ꚙ' => 'Ꚙ',
  'ꚛ' => 'Ꚛ',
  'ꜣ' => 'Ꜣ',
  'ꜥ' => 'Ꜥ',
  'ꜧ' => 'Ꜧ',
  'ꜩ' => 'Ꜩ',
  'ꜫ' => 'Ꜫ',
  'ꜭ' => 'Ꜭ',
  'ꜯ' => 'Ꜯ',
  'ꜳ' => 'Ꜳ',
  'ꜵ' => 'Ꜵ',
  'ꜷ' => 'Ꜷ',
  'ꜹ' => 'Ꜹ',
  'ꜻ' => 'Ꜻ',
  'ꜽ' => 'Ꜽ',
  'ꜿ' => 'Ꜿ',
  'ꝁ' => 'Ꝁ',
  'ꝃ' => 'Ꝃ',
  'ꝅ' => 'Ꝅ',
  'ꝇ' => 'Ꝇ',
  'ꝉ' => 'Ꝉ',
  'ꝋ' => 'Ꝋ',
  'ꝍ' => 'Ꝍ',
  'ꝏ' => 'Ꝏ',
  'ꝑ' => 'Ꝑ',
  'ꝓ' => 'Ꝓ',
  'ꝕ' => 'Ꝕ',
  'ꝗ' => 'Ꝗ',
  'ꝙ' => 'Ꝙ',
  'ꝛ' => 'Ꝛ',
  'ꝝ' => 'Ꝝ',
  'ꝟ' => 'Ꝟ',
  'ꝡ' => 'Ꝡ',
  'ꝣ' => 'Ꝣ',
  'ꝥ' => 'Ꝥ',
  'ꝧ' => 'Ꝧ',
  'ꝩ' => 'Ꝩ',
  'ꝫ' => 'Ꝫ',
  'ꝭ' => 'Ꝭ',
  'ꝯ' => 'Ꝯ',
  'ꝺ' => 'Ꝺ',
  'ꝼ' => 'Ꝼ',
  'ꝿ' => 'Ꝿ',
  'ꞁ' => 'Ꞁ',
  'ꞃ' => 'Ꞃ',
  'ꞅ' => 'Ꞅ',
  'ꞇ' => 'Ꞇ',
  'ꞌ' => 'Ꞌ',
  'ꞑ' => 'Ꞑ',
  'ꞓ' => 'Ꞓ',
  'ꞔ' => 'Ꞔ',
  'ꞗ' => 'Ꞗ',
  'ꞙ' => 'Ꞙ',
  'ꞛ' => 'Ꞛ',
  'ꞝ' => 'Ꞝ',
  'ꞟ' => 'Ꞟ',
  'ꞡ' => 'Ꞡ',
  'ꞣ' => 'Ꞣ',
  'ꞥ' => 'Ꞥ',
  'ꞧ' => 'Ꞧ',
  'ꞩ' => 'Ꞩ',
  'ꞵ' => 'Ꞵ',
  'ꞷ' => 'Ꞷ',
  'ꞹ' => 'Ꞹ',
  'ꞻ' => 'Ꞻ',
  'ꞽ' => 'Ꞽ',
  'ꞿ' => 'Ꞿ',
  'ꟃ' => 'Ꟃ',
  'ꟈ' => 'Ꟈ',
  'ꟊ' => 'Ꟊ',
  'ꟶ' => 'Ꟶ',
  'ꭓ' => 'Ꭓ',
  'ꭰ' => 'Ꭰ',
  'ꭱ' => 'Ꭱ',
  'ꭲ' => 'Ꭲ',
  'ꭳ' => 'Ꭳ',
  'ꭴ' => 'Ꭴ',
  'ꭵ' => 'Ꭵ',
  'ꭶ' => 'Ꭶ',
  'ꭷ' => 'Ꭷ',
  'ꭸ' => 'Ꭸ',
  'ꭹ' => 'Ꭹ',
  'ꭺ' => 'Ꭺ',
  'ꭻ' => 'Ꭻ',
  'ꭼ' => 'Ꭼ',
  'ꭽ' => 'Ꭽ',
  'ꭾ' => 'Ꭾ',
  'ꭿ' => 'Ꭿ',
  'ꮀ' => 'Ꮀ',
  'ꮁ' => 'Ꮁ',
  'ꮂ' => 'Ꮂ',
  'ꮃ' => 'Ꮃ',
  'ꮄ' => 'Ꮄ',
  'ꮅ' => 'Ꮅ',
  'ꮆ' => 'Ꮆ',
  'ꮇ' => 'Ꮇ',
  'ꮈ' => 'Ꮈ',
  'ꮉ' => 'Ꮉ',
  'ꮊ' => 'Ꮊ',
  'ꮋ' => 'Ꮋ',
  'ꮌ' => 'Ꮌ',
  'ꮍ' => 'Ꮍ',
  'ꮎ' => 'Ꮎ',
  'ꮏ' => 'Ꮏ',
  'ꮐ' => 'Ꮐ',
  'ꮑ' => 'Ꮑ',
  'ꮒ' => 'Ꮒ',
  'ꮓ' => 'Ꮓ',
  'ꮔ' => 'Ꮔ',
  'ꮕ' => 'Ꮕ',
  'ꮖ' => 'Ꮖ',
  'ꮗ' => 'Ꮗ',
  'ꮘ' => 'Ꮘ',
  'ꮙ' => 'Ꮙ',
  'ꮚ' => 'Ꮚ',
  'ꮛ' => 'Ꮛ',
  'ꮜ' => 'Ꮜ',
  'ꮝ' => 'Ꮝ',
  'ꮞ' => 'Ꮞ',
  'ꮟ' => 'Ꮟ',
  'ꮠ' => 'Ꮠ',
  'ꮡ' => 'Ꮡ',
  'ꮢ' => 'Ꮢ',
  'ꮣ' => 'Ꮣ',
  'ꮤ' => 'Ꮤ',
  'ꮥ' => 'Ꮥ',
  'ꮦ' => 'Ꮦ',
  'ꮧ' => 'Ꮧ',
  'ꮨ' => 'Ꮨ',
  'ꮩ' => 'Ꮩ',
  'ꮪ' => 'Ꮪ',
  'ꮫ' => 'Ꮫ',
  'ꮬ' => 'Ꮬ',
  'ꮭ' => 'Ꮭ',
  'ꮮ' => 'Ꮮ',
  'ꮯ' => 'Ꮯ',
  'ꮰ' => 'Ꮰ',
  'ꮱ' => 'Ꮱ',
  'ꮲ' => 'Ꮲ',
  'ꮳ' => 'Ꮳ',
  'ꮴ' => 'Ꮴ',
  'ꮵ' => 'Ꮵ',
  'ꮶ' => 'Ꮶ',
  'ꮷ' => 'Ꮷ',
  'ꮸ' => 'Ꮸ',
  'ꮹ' => 'Ꮹ',
  'ꮺ' => 'Ꮺ',
  'ꮻ' => 'Ꮻ',
  'ꮼ' => 'Ꮼ',
  'ꮽ' => 'Ꮽ',
  'ꮾ' => 'Ꮾ',
  'ꮿ' => 'Ꮿ',
  'a' => 'A',
  'b' => 'B',
  'c' => 'C',
  'd' => 'D',
  'e' => 'E',
  'f' => 'F',
  'g' => 'G',
  'h' => 'H',
  'i' => 'I',
  'j' => 'J',
  'k' => 'K',
  'l' => 'L',
  'm' => 'M',
  'n' => 'N',
  'o' => 'O',
  'p' => 'P',
  'q' => 'Q',
  'r' => 'R',
  's' => 'S',
  't' => 'T',
  'u' => 'U',
  'v' => 'V',
  'w' => 'W',
  'x' => 'X',
  'y' => 'Y',
  'z' => 'Z',
  '𐐨' => '𐐀',
  '𐐩' => '𐐁',
  '𐐪' => '𐐂',
  '𐐫' => '𐐃',
  '𐐬' => '𐐄',
  '𐐭' => '𐐅',
  '𐐮' => '𐐆',
  '𐐯' => '𐐇',
  '𐐰' => '𐐈',
  '𐐱' => '𐐉',
  '𐐲' => '𐐊',
  '𐐳' => '𐐋',
  '𐐴' => '𐐌',
  '𐐵' => '𐐍',
  '𐐶' => '𐐎',
  '𐐷' => '𐐏',
  '𐐸' => '𐐐',
  '𐐹' => '𐐑',
  '𐐺' => '𐐒',
  '𐐻' => '𐐓',
  '𐐼' => '𐐔',
  '𐐽' => '𐐕',
  '𐐾' => '𐐖',
  '𐐿' => '𐐗',
  '𐑀' => '𐐘',
  '𐑁' => '𐐙',
  '𐑂' => '𐐚',
  '𐑃' => '𐐛',
  '𐑄' => '𐐜',
  '𐑅' => '𐐝',
  '𐑆' => '𐐞',
  '𐑇' => '𐐟',
  '𐑈' => '𐐠',
  '𐑉' => '𐐡',
  '𐑊' => '𐐢',
  '𐑋' => '𐐣',
  '𐑌' => '𐐤',
  '𐑍' => '𐐥',
  '𐑎' => '𐐦',
  '𐑏' => '𐐧',
  '𐓘' => '𐒰',
  '𐓙' => '𐒱',
  '𐓚' => '𐒲',
  '𐓛' => '𐒳',
  '𐓜' => '𐒴',
  '𐓝' => '𐒵',
  '𐓞' => '𐒶',
  '𐓟' => '𐒷',
  '𐓠' => '𐒸',
  '𐓡' => '𐒹',
  '𐓢' => '𐒺',
  '𐓣' => '𐒻',
  '𐓤' => '𐒼',
  '𐓥' => '𐒽',
  '𐓦' => '𐒾',
  '𐓧' => '𐒿',
  '𐓨' => '𐓀',
  '𐓩' => '𐓁',
  '𐓪' => '𐓂',
  '𐓫' => '𐓃',
  '𐓬' => '𐓄',
  '𐓭' => '𐓅',
  '𐓮' => '𐓆',
  '𐓯' => '𐓇',
  '𐓰' => '𐓈',
  '𐓱' => '𐓉',
  '𐓲' => '𐓊',
  '𐓳' => '𐓋',
  '𐓴' => '𐓌',
  '𐓵' => '𐓍',
  '𐓶' => '𐓎',
  '𐓷' => '𐓏',
  '𐓸' => '𐓐',
  '𐓹' => '𐓑',
  '𐓺' => '𐓒',
  '𐓻' => '𐓓',
  '𐳀' => '𐲀',
  '𐳁' => '𐲁',
  '𐳂' => '𐲂',
  '𐳃' => '𐲃',
  '𐳄' => '𐲄',
  '𐳅' => '𐲅',
  '𐳆' => '𐲆',
  '𐳇' => '𐲇',
  '𐳈' => '𐲈',
  '𐳉' => '𐲉',
  '𐳊' => '𐲊',
  '𐳋' => '𐲋',
  '𐳌' => '𐲌',
  '𐳍' => '𐲍',
  '𐳎' => '𐲎',
  '𐳏' => '𐲏',
  '𐳐' => '𐲐',
  '𐳑' => '𐲑',
  '𐳒' => '𐲒',
  '𐳓' => '𐲓',
  '𐳔' => '𐲔',
  '𐳕' => '𐲕',
  '𐳖' => '𐲖',
  '𐳗' => '𐲗',
  '𐳘' => '𐲘',
  '𐳙' => '𐲙',
  '𐳚' => '𐲚',
  '𐳛' => '𐲛',
  '𐳜' => '𐲜',
  '𐳝' => '𐲝',
  '𐳞' => '𐲞',
  '𐳟' => '𐲟',
  '𐳠' => '𐲠',
  '𐳡' => '𐲡',
  '𐳢' => '𐲢',
  '𐳣' => '𐲣',
  '𐳤' => '𐲤',
  '𐳥' => '𐲥',
  '𐳦' => '𐲦',
  '𐳧' => '𐲧',
  '𐳨' => '𐲨',
  '𐳩' => '𐲩',
  '𐳪' => '𐲪',
  '𐳫' => '𐲫',
  '𐳬' => '𐲬',
  '𐳭' => '𐲭',
  '𐳮' => '𐲮',
  '𐳯' => '𐲯',
  '𐳰' => '𐲰',
  '𐳱' => '𐲱',
  '𐳲' => '𐲲',
  '𑣀' => '𑢠',
  '𑣁' => '𑢡',
  '𑣂' => '𑢢',
  '𑣃' => '𑢣',
  '𑣄' => '𑢤',
  '𑣅' => '𑢥',
  '𑣆' => '𑢦',
  '𑣇' => '𑢧',
  '𑣈' => '𑢨',
  '𑣉' => '𑢩',
  '𑣊' => '𑢪',
  '𑣋' => '𑢫',
  '𑣌' => '𑢬',
  '𑣍' => '𑢭',
  '𑣎' => '𑢮',
  '𑣏' => '𑢯',
  '𑣐' => '𑢰',
  '𑣑' => '𑢱',
  '𑣒' => '𑢲',
  '𑣓' => '𑢳',
  '𑣔' => '𑢴',
  '𑣕' => '𑢵',
  '𑣖' => '𑢶',
  '𑣗' => '𑢷',
  '𑣘' => '𑢸',
  '𑣙' => '𑢹',
  '𑣚' => '𑢺',
  '𑣛' => '𑢻',
  '𑣜' => '𑢼',
  '𑣝' => '𑢽',
  '𑣞' => '𑢾',
  '𑣟' => '𑢿',
  '𖹠' => '𖹀',
  '𖹡' => '𖹁',
  '𖹢' => '𖹂',
  '𖹣' => '𖹃',
  '𖹤' => '𖹄',
  '𖹥' => '𖹅',
  '𖹦' => '𖹆',
  '𖹧' => '𖹇',
  '𖹨' => '𖹈',
  '𖹩' => '𖹉',
  '𖹪' => '𖹊',
  '𖹫' => '𖹋',
  '𖹬' => '𖹌',
  '𖹭' => '𖹍',
  '𖹮' => '𖹎',
  '𖹯' => '𖹏',
  '𖹰' => '𖹐',
  '𖹱' => '𖹑',
  '𖹲' => '𖹒',
  '𖹳' => '𖹓',
  '𖹴' => '𖹔',
  '𖹵' => '𖹕',
  '𖹶' => '𖹖',
  '𖹷' => '𖹗',
  '𖹸' => '𖹘',
  '𖹹' => '𖹙',
  '𖹺' => '𖹚',
  '𖹻' => '𖹛',
  '𖹼' => '𖹜',
  '𖹽' => '𖹝',
  '𖹾' => '𖹞',
  '𖹿' => '𖹟',
  '𞤢' => '𞤀',
  '𞤣' => '𞤁',
  '𞤤' => '𞤂',
  '𞤥' => '𞤃',
  '𞤦' => '𞤄',
  '𞤧' => '𞤅',
  '𞤨' => '𞤆',
  '𞤩' => '𞤇',
  '𞤪' => '𞤈',
  '𞤫' => '𞤉',
  '𞤬' => '𞤊',
  '𞤭' => '𞤋',
  '𞤮' => '𞤌',
  '𞤯' => '𞤍',
  '𞤰' => '𞤎',
  '𞤱' => '𞤏',
  '𞤲' => '𞤐',
  '𞤳' => '𞤑',
  '𞤴' => '𞤒',
  '𞤵' => '𞤓',
  '𞤶' => '𞤔',
  '𞤷' => '𞤕',
  '𞤸' => '𞤖',
  '𞤹' => '𞤗',
  '𞤺' => '𞤘',
  '𞤻' => '𞤙',
  '𞤼' => '𞤚',
  '𞤽' => '𞤛',
  '𞤾' => '𞤜',
  '𞤿' => '𞤝',
  '𞥀' => '𞤞',
  '𞥁' => '𞤟',
  '𞥂' => '𞤠',
  '𞥃' => '𞤡',
  'ß' => 'SS',
  'ff' => 'FF',
  'fi' => 'FI',
  'fl' => 'FL',
  'ffi' => 'FFI',
  'ffl' => 'FFL',
  'ſt' => 'ST',
  'st' => 'ST',
  'և' => 'ԵՒ',
  'ﬓ' => 'ՄՆ',
  'ﬔ' => 'ՄԵ',
  'ﬕ' => 'ՄԻ',
  'ﬖ' => 'ՎՆ',
  'ﬗ' => 'ՄԽ',
  'ʼn' => 'ʼN',
  'ΐ' => 'Ϊ́',
  'ΰ' => 'Ϋ́',
  'ǰ' => 'J̌',
  'ẖ' => 'H̱',
  'ẗ' => 'T̈',
  'ẘ' => 'W̊',
  'ẙ' => 'Y̊',
  'ẚ' => 'Aʾ',
  'ὐ' => 'Υ̓',
  'ὒ' => 'Υ̓̀',
  'ὔ' => 'Υ̓́',
  'ὖ' => 'Υ̓͂',
  'ᾶ' => 'Α͂',
  'ῆ' => 'Η͂',
  'ῒ' => 'Ϊ̀',
  'ΐ' => 'Ϊ́',
  'ῖ' => 'Ι͂',
  'ῗ' => 'Ϊ͂',
  'ῢ' => 'Ϋ̀',
  'ΰ' => 'Ϋ́',
  'ῤ' => 'Ρ̓',
  'ῦ' => 'Υ͂',
  'ῧ' => 'Ϋ͂',
  'ῶ' => 'Ω͂',
  'ᾈ' => 'ἈΙ',
  'ᾉ' => 'ἉΙ',
  'ᾊ' => 'ἊΙ',
  'ᾋ' => 'ἋΙ',
  'ᾌ' => 'ἌΙ',
  'ᾍ' => 'ἍΙ',
  'ᾎ' => 'ἎΙ',
  'ᾏ' => 'ἏΙ',
  'ᾘ' => 'ἨΙ',
  'ᾙ' => 'ἩΙ',
  'ᾚ' => 'ἪΙ',
  'ᾛ' => 'ἫΙ',
  'ᾜ' => 'ἬΙ',
  'ᾝ' => 'ἭΙ',
  'ᾞ' => 'ἮΙ',
  'ᾟ' => 'ἯΙ',
  'ᾨ' => 'ὨΙ',
  'ᾩ' => 'ὩΙ',
  'ᾪ' => 'ὪΙ',
  'ᾫ' => 'ὫΙ',
  'ᾬ' => 'ὬΙ',
  'ᾭ' => 'ὭΙ',
  'ᾮ' => 'ὮΙ',
  'ᾯ' => 'ὯΙ',
  'ᾼ' => 'ΑΙ',
  'ῌ' => 'ΗΙ',
  'ῼ' => 'ΩΙ',
  'ᾲ' => 'ᾺΙ',
  'ᾴ' => 'ΆΙ',
  'ῂ' => 'ῊΙ',
  'ῄ' => 'ΉΙ',
  'ῲ' => 'ῺΙ',
  'ῴ' => 'ΏΙ',
  'ᾷ' => 'Α͂Ι',
  'ῇ' => 'Η͂Ι',
  'ῷ' => 'Ω͂Ι',
);
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

use Symfony\Polyfill\Mbstring as p;

if (\PHP_VERSION_ID >= 80000) {
    return require __DIR__.'/bootstrap80.php';
}

if (!function_exists('mb_convert_encoding')) {
    function mb_convert_encoding($string, $to_encoding, $from_encoding = null) { return p\Mbstring::mb_convert_encoding($string, $to_encoding, $from_encoding); }
}
if (!function_exists('mb_decode_mimeheader')) {
    function mb_decode_mimeheader($string) { return p\Mbstring::mb_decode_mimeheader($string); }
}
if (!function_exists('mb_encode_mimeheader')) {
    function mb_encode_mimeheader($string, $charset = null, $transfer_encoding = null, $newline = "\r\n", $indent = 0) { return p\Mbstring::mb_encode_mimeheader($string, $charset, $transfer_encoding, $newline, $indent); }
}
if (!function_exists('mb_decode_numericentity')) {
    function mb_decode_numericentity($string, $map, $encoding = null) { return p\Mbstring::mb_decode_numericentity($string, $map, $encoding); }
}
if (!function_exists('mb_encode_numericentity')) {
    function mb_encode_numericentity($string, $map, $encoding = null, $hex = false) { return p\Mbstring::mb_encode_numericentity($string, $map, $encoding, $hex); }
}
if (!function_exists('mb_convert_case')) {
    function mb_convert_case($string, $mode, $encoding = null) { return p\Mbstring::mb_convert_case($string, $mode, $encoding); }
}
if (!function_exists('mb_internal_encoding')) {
    function mb_internal_encoding($encoding = null) { return p\Mbstring::mb_internal_encoding($encoding); }
}
if (!function_exists('mb_language')) {
    function mb_language($language = null) { return p\Mbstring::mb_language($language); }
}
if (!function_exists('mb_list_encodings')) {
    function mb_list_encodings() { return p\Mbstring::mb_list_encodings(); }
}
if (!function_exists('mb_encoding_aliases')) {
    function mb_encoding_aliases($encoding) { return p\Mbstring::mb_encoding_aliases($encoding); }
}
if (!function_exists('mb_check_encoding')) {
    function mb_check_encoding($value = null, $encoding = null) { return p\Mbstring::mb_check_encoding($value, $encoding); }
}
if (!function_exists('mb_detect_encoding')) {
    function mb_detect_encoding($string, $encodings = null, $strict = false) { return p\Mbstring::mb_detect_encoding($string, $encodings, $strict); }
}
if (!function_exists('mb_detect_order')) {
    function mb_detect_order($encoding = null) { return p\Mbstring::mb_detect_order($encoding); }
}
if (!function_exists('mb_parse_str')) {
    function mb_parse_str($string, &$result = []) { parse_str($string, $result); return (bool) $result; }
}
if (!function_exists('mb_strlen')) {
    function mb_strlen($string, $encoding = null) { return p\Mbstring::mb_strlen($string, $encoding); }
}
if (!function_exists('mb_strpos')) {
    function mb_strpos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_strpos($haystack, $needle, $offset, $encoding); }
}
if (!function_exists('mb_strtolower')) {
    function mb_strtolower($string, $encoding = null) { return p\Mbstring::mb_strtolower($string, $encoding); }
}
if (!function_exists('mb_strtoupper')) {
    function mb_strtoupper($string, $encoding = null) { return p\Mbstring::mb_strtoupper($string, $encoding); }
}
if (!function_exists('mb_substitute_character')) {
    function mb_substitute_character($substitute_character = null) { return p\Mbstring::mb_substitute_character($substitute_character); }
}
if (!function_exists('mb_substr')) {
    function mb_substr($string, $start, $length = 2147483647, $encoding = null) { return p\Mbstring::mb_substr($string, $start, $length, $encoding); }
}
if (!function_exists('mb_stripos')) {
    function mb_stripos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_stripos($haystack, $needle, $offset, $encoding); }
}
if (!function_exists('mb_stristr')) {
    function mb_stristr($haystack, $needle, $before_needle = false, $encoding = null) { return p\Mbstring::mb_stristr($haystack, $needle, $before_needle, $encoding); }
}
if (!function_exists('mb_strrchr')) {
    function mb_strrchr($haystack, $needle, $before_needle = false, $encoding = null) { return p\Mbstring::mb_strrchr($haystack, $needle, $before_needle, $encoding); }
}
if (!function_exists('mb_strrichr')) {
    function mb_strrichr($haystack, $needle, $before_needle = false, $encoding = null) { return p\Mbstring::mb_strrichr($haystack, $needle, $before_needle, $encoding); }
}
if (!function_exists('mb_strripos')) {
    function mb_strripos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_strripos($haystack, $needle, $offset, $encoding); }
}
if (!function_exists('mb_strrpos')) {
    function mb_strrpos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_strrpos($haystack, $needle, $offset, $encoding); }
}
if (!function_exists('mb_strstr')) {
    function mb_strstr($haystack, $needle, $before_needle = false, $encoding = null) { return p\Mbstring::mb_strstr($haystack, $needle, $before_needle, $encoding); }
}
if (!function_exists('mb_get_info')) {
    function mb_get_info($type = 'all') { return p\Mbstring::mb_get_info($type); }
}
if (!function_exists('mb_http_output')) {
    function mb_http_output($encoding = null) { return p\Mbstring::mb_http_output($encoding); }
}
if (!function_exists('mb_strwidth')) {
    function mb_strwidth($string, $encoding = null) { return p\Mbstring::mb_strwidth($string, $encoding); }
}
if (!function_exists('mb_substr_count')) {
    function mb_substr_count($haystack, $needle, $encoding = null) { return p\Mbstring::mb_substr_count($haystack, $needle, $encoding); }
}
if (!function_exists('mb_output_handler')) {
    function mb_output_handler($string, $status) { return p\Mbstring::mb_output_handler($string, $status); }
}
if (!function_exists('mb_http_input')) {
    function mb_http_input($type = null) { return p\Mbstring::mb_http_input($type); }
}

if (!function_exists('mb_convert_variables')) {
    function mb_convert_variables($to_encoding, $from_encoding, &...$vars) { return p\Mbstring::mb_convert_variables($to_encoding, $from_encoding, ...$vars); }
}

if (!function_exists('mb_ord')) {
    function mb_ord($string, $encoding = null) { return p\Mbstring::mb_ord($string, $encoding); }
}
if (!function_exists('mb_chr')) {
    function mb_chr($codepoint, $encoding = null) { return p\Mbstring::mb_chr($codepoint, $encoding); }
}
if (!function_exists('mb_scrub')) {
    function mb_scrub($string, $encoding = null) { $encoding = null === $encoding ? mb_internal_encoding() : $encoding; return mb_convert_encoding($string, $encoding, $encoding); }
}
if (!function_exists('mb_str_split')) {
    function mb_str_split($string, $length = 1, $encoding = null) { return p\Mbstring::mb_str_split($string, $length, $encoding); }
}

if (!function_exists('mb_str_pad')) {
    function mb_str_pad(string $string, int $length, string $pad_string = ' ', int $pad_type = STR_PAD_RIGHT, ?string $encoding = null): string { return p\Mbstring::mb_str_pad($string, $length, $pad_string, $pad_type, $encoding); }
}

if (extension_loaded('mbstring')) {
    return;
}

if (!defined('MB_CASE_UPPER')) {
    define('MB_CASE_UPPER', 0);
}
if (!defined('MB_CASE_LOWER')) {
    define('MB_CASE_LOWER', 1);
}
if (!defined('MB_CASE_TITLE')) {
    define('MB_CASE_TITLE', 2);
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

use Symfony\Polyfill\Mbstring as p;

if (!function_exists('mb_convert_encoding')) {
    function mb_convert_encoding(array|string|null $string, ?string $to_encoding, array|string|null $from_encoding = null): array|string|false { return p\Mbstring::mb_convert_encoding($string ?? '', (string) $to_encoding, $from_encoding); }
}
if (!function_exists('mb_decode_mimeheader')) {
    function mb_decode_mimeheader(?string $string): string { return p\Mbstring::mb_decode_mimeheader((string) $string); }
}
if (!function_exists('mb_encode_mimeheader')) {
    function mb_encode_mimeheader(?string $string, ?string $charset = null, ?string $transfer_encoding = null, ?string $newline = "\r\n", ?int $indent = 0): string { return p\Mbstring::mb_encode_mimeheader((string) $string, $charset, $transfer_encoding, (string) $newline, (int) $indent); }
}
if (!function_exists('mb_decode_numericentity')) {
    function mb_decode_numericentity(?string $string, array $map, ?string $encoding = null): string { return p\Mbstring::mb_decode_numericentity((string) $string, $map, $encoding); }
}
if (!function_exists('mb_encode_numericentity')) {
    function mb_encode_numericentity(?string $string, array $map, ?string $encoding = null, ?bool $hex = false): string { return p\Mbstring::mb_encode_numericentity((string) $string, $map, $encoding, (bool) $hex); }
}
if (!function_exists('mb_convert_case')) {
    function mb_convert_case(?string $string, ?int $mode, ?string $encoding = null): string { return p\Mbstring::mb_convert_case((string) $string, (int) $mode, $encoding); }
}
if (!function_exists('mb_internal_encoding')) {
    function mb_internal_encoding(?string $encoding = null): string|bool { return p\Mbstring::mb_internal_encoding($encoding); }
}
if (!function_exists('mb_language')) {
    function mb_language(?string $language = null): string|bool { return p\Mbstring::mb_language($language); }
}
if (!function_exists('mb_list_encodings')) {
    function mb_list_encodings(): array { return p\Mbstring::mb_list_encodings(); }
}
if (!function_exists('mb_encoding_aliases')) {
    function mb_encoding_aliases(?string $encoding): array { return p\Mbstring::mb_encoding_aliases((string) $encoding); }
}
if (!function_exists('mb_check_encoding')) {
    function mb_check_encoding(array|string|null $value = null, ?string $encoding = null): bool { return p\Mbstring::mb_check_encoding($value, $encoding); }
}
if (!function_exists('mb_detect_encoding')) {
    function mb_detect_encoding(?string $string, array|string|null $encodings = null, ?bool $strict = false): string|false { return p\Mbstring::mb_detect_encoding((string) $string, $encodings, (bool) $strict); }
}
if (!function_exists('mb_detect_order')) {
    function mb_detect_order(array|string|null $encoding = null): array|bool { return p\Mbstring::mb_detect_order($encoding); }
}
if (!function_exists('mb_parse_str')) {
    function mb_parse_str(?string $string, &$result = []): bool { parse_str((string) $string, $result); return (bool) $result; }
}
if (!function_exists('mb_strlen')) {
    function mb_strlen(?string $string, ?string $encoding = null): int { return p\Mbstring::mb_strlen((string) $string, $encoding); }
}
if (!function_exists('mb_strpos')) {
    function mb_strpos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null): int|false { return p\Mbstring::mb_strpos((string) $haystack, (string) $needle, (int) $offset, $encoding); }
}
if (!function_exists('mb_strtolower')) {
    function mb_strtolower(?string $string, ?string $encoding = null): string { return p\Mbstring::mb_strtolower((string) $string, $encoding); }
}
if (!function_exists('mb_strtoupper')) {
    function mb_strtoupper(?string $string, ?string $encoding = null): string { return p\Mbstring::mb_strtoupper((string) $string, $encoding); }
}
if (!function_exists('mb_substitute_character')) {
    function mb_substitute_character(string|int|null $substitute_character = null): string|int|bool { return p\Mbstring::mb_substitute_character($substitute_character); }
}
if (!function_exists('mb_substr')) {
    function mb_substr(?string $string, ?int $start, ?int $length = null, ?string $encoding = null): string { return p\Mbstring::mb_substr((string) $string, (int) $start, $length, $encoding); }
}
if (!function_exists('mb_stripos')) {
    function mb_stripos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null): int|false { return p\Mbstring::mb_stripos((string) $haystack, (string) $needle, (int) $offset, $encoding); }
}
if (!function_exists('mb_stristr')) {
    function mb_stristr(?string $haystack, ?string $needle, ?bool $before_needle = false, ?string $encoding = null): string|false { return p\Mbstring::mb_stristr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); }
}
if (!function_exists('mb_strrchr')) {
    function mb_strrchr(?string $haystack, ?string $needle, ?bool $before_needle = false, ?string $encoding = null): string|false { return p\Mbstring::mb_strrchr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); }
}
if (!function_exists('mb_strrichr')) {
    function mb_strrichr(?string $haystack, ?string $needle, ?bool $before_needle = false, ?string $encoding = null): string|false { return p\Mbstring::mb_strrichr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); }
}
if (!function_exists('mb_strripos')) {
    function mb_strripos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null): int|false { return p\Mbstring::mb_strripos((string) $haystack, (string) $needle, (int) $offset, $encoding); }
}
if (!function_exists('mb_strrpos')) {
    function mb_strrpos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null): int|false { return p\Mbstring::mb_strrpos((string) $haystack, (string) $needle, (int) $offset, $encoding); }
}
if (!function_exists('mb_strstr')) {
    function mb_strstr(?string $haystack, ?string $needle, ?bool $before_needle = false, ?string $encoding = null): string|false { return p\Mbstring::mb_strstr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); }
}
if (!function_exists('mb_get_info')) {
    function mb_get_info(?string $type = 'all'): array|string|int|false { return p\Mbstring::mb_get_info((string) $type); }
}
if (!function_exists('mb_http_output')) {
    function mb_http_output(?string $encoding = null): string|bool { return p\Mbstring::mb_http_output($encoding); }
}
if (!function_exists('mb_strwidth')) {
    function mb_strwidth(?string $string, ?string $encoding = null): int { return p\Mbstring::mb_strwidth((string) $string, $encoding); }
}
if (!function_exists('mb_substr_count')) {
    function mb_substr_count(?string $haystack, ?string $needle, ?string $encoding = null): int { return p\Mbstring::mb_substr_count((string) $haystack, (string) $needle, $encoding); }
}
if (!function_exists('mb_output_handler')) {
    function mb_output_handler(?string $string, ?int $status): string { return p\Mbstring::mb_output_handler((string) $string, (int) $status); }
}
if (!function_exists('mb_http_input')) {
    function mb_http_input(?string $type = null): array|string|false { return p\Mbstring::mb_http_input($type); }
}

if (!function_exists('mb_convert_variables')) {
    function mb_convert_variables(?string $to_encoding, array|string|null $from_encoding, mixed &$var, mixed &...$vars): string|false { return p\Mbstring::mb_convert_variables((string) $to_encoding, $from_encoding ?? '', $var, ...$vars); }
}

if (!function_exists('mb_ord')) {
    function mb_ord(?string $string, ?string $encoding = null): int|false { return p\Mbstring::mb_ord((string) $string, $encoding); }
}
if (!function_exists('mb_chr')) {
    function mb_chr(?int $codepoint, ?string $encoding = null): string|false { return p\Mbstring::mb_chr((int) $codepoint, $encoding); }
}
if (!function_exists('mb_scrub')) {
    function mb_scrub(?string $string, ?string $encoding = null): string { $encoding ??= mb_internal_encoding(); return mb_convert_encoding((string) $string, $encoding, $encoding); }
}
if (!function_exists('mb_str_split')) {
    function mb_str_split(?string $string, ?int $length = 1, ?string $encoding = null): array { return p\Mbstring::mb_str_split((string) $string, (int) $length, $encoding); }
}

if (!function_exists('mb_str_pad')) {
    function mb_str_pad(string $string, int $length, string $pad_string = ' ', int $pad_type = STR_PAD_RIGHT, ?string $encoding = null): string { return p\Mbstring::mb_str_pad($string, $length, $pad_string, $pad_type, $encoding); }
}

if (extension_loaded('mbstring')) {
    return;
}

if (!defined('MB_CASE_UPPER')) {
    define('MB_CASE_UPPER', 0);
}
if (!defined('MB_CASE_LOWER')) {
    define('MB_CASE_LOWER', 1);
}
if (!defined('MB_CASE_TITLE')) {
    define('MB_CASE_TITLE', 2);
}
{
    "name": "symfony/polyfill-mbstring",
    "type": "library",
    "description": "Symfony polyfill for the Mbstring extension",
    "keywords": ["polyfill", "shim", "compatibility", "portable", "mbstring"],
    "homepage": "https://symfony.com",
    "license": "MIT",
    "authors": [
        {
            "name": "Nicolas Grekas",
            "email": "p@tchwork.com"
        },
        {
            "name": "Symfony Community",
            "homepage": "https://symfony.com/contributors"
        }
    ],
    "require": {
        "php": ">=7.1"
    },
    "provide": {
        "ext-mbstring": "*"
    },
    "autoload": {
        "psr-4": { "Symfony\\Polyfill\\Mbstring\\": "" },
        "files": [ "bootstrap.php" ]
    },
    "suggest": {
        "ext-mbstring": "For best performance"
    },
    "minimum-stability": "dev",
    "extra": {
        "branch-alias": {
            "dev-main": "1.28-dev"
        },
        "thanks": {
            "name": "symfony/polyfill",
            "url": "https://github.com/symfony/polyfill"
        }
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Polyfill\Intl\Grapheme;

\define('SYMFONY_GRAPHEME_CLUSTER_RX', ((float) \PCRE_VERSION < 10 ? (float) \PCRE_VERSION >= 8.32 : (float) \PCRE_VERSION >= 10.39) ? '\X' : Grapheme::GRAPHEME_CLUSTER_RX);

/**
 * Partial intl implementation in pure PHP.
 *
 * Implemented:
 * - grapheme_extract  - Extract a sequence of grapheme clusters from a text buffer, which must be encoded in UTF-8
 * - grapheme_stripos  - Find position (in grapheme units) of first occurrence of a case-insensitive string
 * - grapheme_stristr  - Returns part of haystack string from the first occurrence of case-insensitive needle to the end of haystack
 * - grapheme_strlen   - Get string length in grapheme units
 * - grapheme_strpos   - Find position (in grapheme units) of first occurrence of a string
 * - grapheme_strripos - Find position (in grapheme units) of last occurrence of a case-insensitive string
 * - grapheme_strrpos  - Find position (in grapheme units) of last occurrence of a string
 * - grapheme_strstr   - Returns part of haystack string from the first occurrence of needle to the end of haystack
 * - grapheme_substr   - Return part of a string
 *
 * @author Nicolas Grekas <p@tchwork.com>
 *
 * @internal
 */
final class Grapheme
{
    // (CRLF|([ZWNJ-ZWJ]|T+|L*(LV?V+|LV|LVT)T*|L+|[^Control])[Extend]*|[Control])
    // This regular expression is a work around for http://bugs.exim.org/1279
    public const GRAPHEME_CLUSTER_RX = '(?:\r\n|(?:[ -~\x{200C}\x{200D}]|[ᆨ-ᇹ]+|[ᄀ-ᅟ]*(?:[가개갸걔거게겨계고과괘괴교구궈궤귀규그긔기까깨꺄꺠꺼께껴꼐꼬꽈꽤꾀꾜꾸꿔꿰뀌뀨끄끠끼나내냐냬너네녀녜노놔놰뇌뇨누눠눼뉘뉴느늬니다대댜댸더데뎌뎨도돠돼되됴두둬뒈뒤듀드듸디따때땨떄떠떼뗘뗴또똬뙈뙤뚀뚜뚸뛔뛰뜌뜨띄띠라래랴럐러레려례로롸뢔뢰료루뤄뤠뤼류르릐리마매먀먜머메며몌모뫄뫠뫼묘무뭐뭬뮈뮤므믜미바배뱌뱨버베벼볘보봐봬뵈뵤부붜붸뷔뷰브븨비빠빼뺘뺴뻐뻬뼈뼤뽀뽜뽸뾔뾰뿌뿨쀄쀠쀼쁘쁴삐사새샤섀서세셔셰소솨쇄쇠쇼수숴쉐쉬슈스싀시싸쌔쌰썌써쎄쎠쎼쏘쏴쐐쐬쑈쑤쒀쒜쒸쓔쓰씌씨아애야얘어에여예오와왜외요우워웨위유으의이자재쟈쟤저제져졔조좌좨죄죠주줘줴쥐쥬즈즤지짜째쨔쨰쩌쩨쪄쪠쪼쫘쫴쬐쬬쭈쭤쮀쮜쮸쯔쯰찌차채챠챼처체쳐쳬초촤쵀최쵸추춰췌취츄츠츼치카캐캬컈커케켜켸코콰쾌쾨쿄쿠쿼퀘퀴큐크킈키타태탸턔터테텨톄토톼퇘퇴툐투퉈퉤튀튜트틔티파패퍄퍠퍼페펴폐포퐈퐤푀표푸풔풰퓌퓨프픠피하해햐햬허헤혀혜호화홰회효후훠훼휘휴흐희히]?[ᅠ-ᆢ]+|[가-힣])[ᆨ-ᇹ]*|[ᄀ-ᅟ]+|[^\p{Cc}\p{Cf}\p{Zl}\p{Zp}])[\p{Mn}\p{Me}\x{09BE}\x{09D7}\x{0B3E}\x{0B57}\x{0BBE}\x{0BD7}\x{0CC2}\x{0CD5}\x{0CD6}\x{0D3E}\x{0D57}\x{0DCF}\x{0DDF}\x{200C}\x{200D}\x{1D165}\x{1D16E}-\x{1D172}]*|[\p{Cc}\p{Cf}\p{Zl}\p{Zp}])';

    private const CASE_FOLD = [
        ['µ', 'ſ', "\xCD\x85", 'ς', "\xCF\x90", "\xCF\x91", "\xCF\x95", "\xCF\x96", "\xCF\xB0", "\xCF\xB1", "\xCF\xB5", "\xE1\xBA\x9B", "\xE1\xBE\xBE"],
        ['μ', 's', 'ι',        'σ', 'β',        'θ',        'φ',        'π',        'κ',        'ρ',        'ε',        "\xE1\xB9\xA1", 'ι'],
    ];

    public static function grapheme_extract($s, $size, $type = \GRAPHEME_EXTR_COUNT, $start = 0, &$next = 0)
    {
        if (0 > $start) {
            $start = \strlen($s) + $start;
        }

        if (!\is_scalar($s)) {
            $hasError = false;
            set_error_handler(function () use (&$hasError) { $hasError = true; });
            $next = substr($s, $start);
            restore_error_handler();
            if ($hasError) {
                substr($s, $start);
                $s = '';
            } else {
                $s = $next;
            }
        } else {
            $s = substr($s, $start);
        }
        $size = (int) $size;
        $type = (int) $type;
        $start = (int) $start;

        if (\GRAPHEME_EXTR_COUNT !== $type && \GRAPHEME_EXTR_MAXBYTES !== $type && \GRAPHEME_EXTR_MAXCHARS !== $type) {
            if (80000 > \PHP_VERSION_ID) {
                return false;
            }

            throw new \ValueError('grapheme_extract(): Argument #3 ($type) must be one of GRAPHEME_EXTR_COUNT, GRAPHEME_EXTR_MAXBYTES, or GRAPHEME_EXTR_MAXCHARS');
        }

        if (!isset($s[0]) || 0 > $size || 0 > $start) {
            return false;
        }
        if (0 === $size) {
            return '';
        }

        $next = $start;

        $s = preg_split('/('.SYMFONY_GRAPHEME_CLUSTER_RX.')/u', "\r\n".$s, $size + 1, \PREG_SPLIT_NO_EMPTY | \PREG_SPLIT_DELIM_CAPTURE);

        if (!isset($s[1])) {
            return false;
        }

        $i = 1;
        $ret = '';

        do {
            if (\GRAPHEME_EXTR_COUNT === $type) {
                --$size;
            } elseif (\GRAPHEME_EXTR_MAXBYTES === $type) {
                $size -= \strlen($s[$i]);
            } else {
                $size -= iconv_strlen($s[$i], 'UTF-8//IGNORE');
            }

            if ($size >= 0) {
                $ret .= $s[$i];
            }
        } while (isset($s[++$i]) && $size > 0);

        $next += \strlen($ret);

        return $ret;
    }

    public static function grapheme_strlen($s)
    {
        preg_replace('/'.SYMFONY_GRAPHEME_CLUSTER_RX.'/u', '', $s, -1, $len);

        return 0 === $len && '' !== $s ? null : $len;
    }

    public static function grapheme_substr($s, $start, $len = null)
    {
        if (null === $len) {
            $len = 2147483647;
        }

        preg_match_all('/'.SYMFONY_GRAPHEME_CLUSTER_RX.'/u', $s, $s);

        $slen = \count($s[0]);
        $start = (int) $start;

        if (0 > $start) {
            $start += $slen;
        }
        if (0 > $start) {
            if (\PHP_VERSION_ID < 80000) {
                return false;
            }

            $start = 0;
        }
        if ($start >= $slen) {
            return \PHP_VERSION_ID >= 80000 ? '' : false;
        }

        $rem = $slen - $start;

        if (0 > $len) {
            $len += $rem;
        }
        if (0 === $len) {
            return '';
        }
        if (0 > $len) {
            return \PHP_VERSION_ID >= 80000 ? '' : false;
        }
        if ($len > $rem) {
            $len = $rem;
        }

        return implode('', \array_slice($s[0], $start, $len));
    }

    public static function grapheme_strpos($s, $needle, $offset = 0)
    {
        return self::grapheme_position($s, $needle, $offset, 0);
    }

    public static function grapheme_stripos($s, $needle, $offset = 0)
    {
        return self::grapheme_position($s, $needle, $offset, 1);
    }

    public static function grapheme_strrpos($s, $needle, $offset = 0)
    {
        return self::grapheme_position($s, $needle, $offset, 2);
    }

    public static function grapheme_strripos($s, $needle, $offset = 0)
    {
        return self::grapheme_position($s, $needle, $offset, 3);
    }

    public static function grapheme_stristr($s, $needle, $beforeNeedle = false)
    {
        return mb_stristr($s, $needle, $beforeNeedle, 'UTF-8');
    }

    public static function grapheme_strstr($s, $needle, $beforeNeedle = false)
    {
        return mb_strstr($s, $needle, $beforeNeedle, 'UTF-8');
    }

    private static function grapheme_position($s, $needle, $offset, $mode)
    {
        $needle = (string) $needle;
        if (80000 > \PHP_VERSION_ID && !preg_match('/./us', $needle)) {
            return false;
        }
        $s = (string) $s;
        if (!preg_match('/./us', $s)) {
            return false;
        }
        if ($offset > 0) {
            $s = self::grapheme_substr($s, $offset);
        } elseif ($offset < 0) {
            if (2 > $mode) {
                $offset += self::grapheme_strlen($s);
                $s = self::grapheme_substr($s, $offset);
                if (0 > $offset) {
                    $offset = 0;
                }
            } elseif (0 > $offset += self::grapheme_strlen($needle)) {
                $s = self::grapheme_substr($s, 0, $offset);
                $offset = 0;
            } else {
                $offset = 0;
            }
        }

        // As UTF-8 is self-synchronizing, and we have ensured the strings are valid UTF-8,
        // we can use normal binary string functions here. For case-insensitive searches,
        // case fold the strings first.
        $caseInsensitive = $mode & 1;
        $reverse = $mode & 2;
        if ($caseInsensitive) {
            // Use the same case folding mode as mbstring does for mb_stripos().
            // Stick to SIMPLE case folding to avoid changing the length of the string, which
            // might result in offsets being shifted.
            $mode = \defined('MB_CASE_FOLD_SIMPLE') ? \MB_CASE_FOLD_SIMPLE : \MB_CASE_LOWER;
            $s = mb_convert_case($s, $mode, 'UTF-8');
            $needle = mb_convert_case($needle, $mode, 'UTF-8');

            if (!\defined('MB_CASE_FOLD_SIMPLE')) {
                $s = str_replace(self::CASE_FOLD[0], self::CASE_FOLD[1], $s);
                $needle = str_replace(self::CASE_FOLD[0], self::CASE_FOLD[1], $needle);
            }
        }
        if ($reverse) {
            $needlePos = strrpos($s, $needle);
        } else {
            $needlePos = strpos($s, $needle);
        }

        return false !== $needlePos ? self::grapheme_strlen(substr($s, 0, $needlePos)) + $offset : false;
    }
}
Copyright (c) 2015-present Fabien Potencier

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.
Symfony Polyfill / Intl: Grapheme
=================================

This component provides a partial, native PHP implementation of the
[Grapheme functions](https://php.net/intl.grapheme) from the
[Intl](https://php.net/intl) extension.

- [`grapheme_extract`](https://php.net/grapheme_extract): Extract a sequence of grapheme
  clusters from a text buffer, which must be encoded in UTF-8
- [`grapheme_stripos`](https://php.net/grapheme_stripos): Find position (in grapheme units)
  of first occurrence of a case-insensitive string
- [`grapheme_stristr`](https://php.net/grapheme_stristr): Returns part of haystack string
  from the first occurrence of case-insensitive needle to the end of haystack
- [`grapheme_strlen`](https://php.net/grapheme_strlen): Get string length in grapheme units
- [`grapheme_strpos`](https://php.net/grapheme_strpos): Find position (in grapheme units)
  of first occurrence of a string
- [`grapheme_strripos`](https://php.net/grapheme_strripos): Find position (in grapheme units)
  of last occurrence of a case-insensitive string
- [`grapheme_strrpos`](https://php.net/grapheme_strrpos): Find position (in grapheme units)
  of last occurrence of a string
- [`grapheme_strstr`](https://php.net/grapheme_strstr): Returns part of haystack string from
  the first occurrence of needle to the end of haystack
- [`grapheme_substr`](https://php.net/grapheme_substr): Return part of a string

More information can be found in the
[main Polyfill README](https://github.com/symfony/polyfill/blob/main/README.md).

License
=======

This library is released under the [MIT license](LICENSE).
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

use Symfony\Polyfill\Intl\Grapheme as p;

if (extension_loaded('intl')) {
    return;
}

if (\PHP_VERSION_ID >= 80000) {
    return require __DIR__.'/bootstrap80.php';
}

if (!defined('GRAPHEME_EXTR_COUNT')) {
    define('GRAPHEME_EXTR_COUNT', 0);
}
if (!defined('GRAPHEME_EXTR_MAXBYTES')) {
    define('GRAPHEME_EXTR_MAXBYTES', 1);
}
if (!defined('GRAPHEME_EXTR_MAXCHARS')) {
    define('GRAPHEME_EXTR_MAXCHARS', 2);
}

if (!function_exists('grapheme_extract')) {
    function grapheme_extract($haystack, $size, $type = 0, $start = 0, &$next = 0) { return p\Grapheme::grapheme_extract($haystack, $size, $type, $start, $next); }
}
if (!function_exists('grapheme_stripos')) {
    function grapheme_stripos($haystack, $needle, $offset = 0) { return p\Grapheme::grapheme_stripos($haystack, $needle, $offset); }
}
if (!function_exists('grapheme_stristr')) {
    function grapheme_stristr($haystack, $needle, $beforeNeedle = false) { return p\Grapheme::grapheme_stristr($haystack, $needle, $beforeNeedle); }
}
if (!function_exists('grapheme_strlen')) {
    function grapheme_strlen($input) { return p\Grapheme::grapheme_strlen($input); }
}
if (!function_exists('grapheme_strpos')) {
    function grapheme_strpos($haystack, $needle, $offset = 0) { return p\Grapheme::grapheme_strpos($haystack, $needle, $offset); }
}
if (!function_exists('grapheme_strripos')) {
    function grapheme_strripos($haystack, $needle, $offset = 0) { return p\Grapheme::grapheme_strripos($haystack, $needle, $offset); }
}
if (!function_exists('grapheme_strrpos')) {
    function grapheme_strrpos($haystack, $needle, $offset = 0) { return p\Grapheme::grapheme_strrpos($haystack, $needle, $offset); }
}
if (!function_exists('grapheme_strstr')) {
    function grapheme_strstr($haystack, $needle, $beforeNeedle = false) { return p\Grapheme::grapheme_strstr($haystack, $needle, $beforeNeedle); }
}
if (!function_exists('grapheme_substr')) {
    function grapheme_substr($string, $offset, $length = null) { return p\Grapheme::grapheme_substr($string, $offset, $length); }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

use Symfony\Polyfill\Intl\Grapheme as p;

if (!defined('GRAPHEME_EXTR_COUNT')) {
    define('GRAPHEME_EXTR_COUNT', 0);
}
if (!defined('GRAPHEME_EXTR_MAXBYTES')) {
    define('GRAPHEME_EXTR_MAXBYTES', 1);
}
if (!defined('GRAPHEME_EXTR_MAXCHARS')) {
    define('GRAPHEME_EXTR_MAXCHARS', 2);
}

if (!function_exists('grapheme_extract')) {
    function grapheme_extract(?string $haystack, ?int $size, ?int $type = GRAPHEME_EXTR_COUNT, ?int $offset = 0, &$next = null): string|false { return p\Grapheme::grapheme_extract((string) $haystack, (int) $size, (int) $type, (int) $offset, $next); }
}
if (!function_exists('grapheme_stripos')) {
    function grapheme_stripos(?string $haystack, ?string $needle, ?int $offset = 0): int|false { return p\Grapheme::grapheme_stripos((string) $haystack, (string) $needle, (int) $offset); }
}
if (!function_exists('grapheme_stristr')) {
    function grapheme_stristr(?string $haystack, ?string $needle, ?bool $beforeNeedle = false): string|false { return p\Grapheme::grapheme_stristr((string) $haystack, (string) $needle, (bool) $beforeNeedle); }
}
if (!function_exists('grapheme_strlen')) {
    function grapheme_strlen(?string $string): int|false|null { return p\Grapheme::grapheme_strlen((string) $string); }
}
if (!function_exists('grapheme_strpos')) {
    function grapheme_strpos(?string $haystack, ?string $needle, ?int $offset = 0): int|false { return p\Grapheme::grapheme_strpos((string) $haystack, (string) $needle, (int) $offset); }
}
if (!function_exists('grapheme_strripos')) {
    function grapheme_strripos(?string $haystack, ?string $needle, ?int $offset = 0): int|false { return p\Grapheme::grapheme_strripos((string) $haystack, (string) $needle, (int) $offset); }
}
if (!function_exists('grapheme_strrpos')) {
    function grapheme_strrpos(?string $haystack, ?string $needle, ?int $offset = 0): int|false { return p\Grapheme::grapheme_strrpos((string) $haystack, (string) $needle, (int) $offset); }
}
if (!function_exists('grapheme_strstr')) {
    function grapheme_strstr(?string $haystack, ?string $needle, ?bool $beforeNeedle = false): string|false { return p\Grapheme::grapheme_strstr((string) $haystack, (string) $needle, (bool) $beforeNeedle); }
}
if (!function_exists('grapheme_substr')) {
    function grapheme_substr(?string $string, ?int $offset, ?int $length = null): string|false { return p\Grapheme::grapheme_substr((string) $string, (int) $offset, $length); }
}
{
    "name": "symfony/polyfill-intl-grapheme",
    "type": "library",
    "description": "Symfony polyfill for intl's grapheme_* functions",
    "keywords": ["polyfill", "shim", "compatibility", "portable", "intl", "grapheme"],
    "homepage": "https://symfony.com",
    "license": "MIT",
    "authors": [
        {
            "name": "Nicolas Grekas",
            "email": "p@tchwork.com"
        },
        {
            "name": "Symfony Community",
            "homepage": "https://symfony.com/contributors"
        }
    ],
    "require": {
        "php": ">=7.1"
    },
    "autoload": {
        "psr-4": { "Symfony\\Polyfill\\Intl\\Grapheme\\": "" },
        "files": [ "bootstrap.php" ]
    },
    "suggest": {
        "ext-intl": "For best performance"
    },
    "minimum-stability": "dev",
    "extra": {
        "branch-alias": {
            "dev-main": "1.28-dev"
        },
        "thanks": {
            "name": "symfony/polyfill",
            "url": "https://github.com/symfony/polyfill"
        }
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Polyfill\Ctype;

/**
 * Ctype implementation through regex.
 *
 * @internal
 *
 * @author Gert de Pagter <BackEndTea@gmail.com>
 */
final class Ctype
{
    /**
     * Returns TRUE if every character in text is either a letter or a digit, FALSE otherwise.
     *
     * @see https://php.net/ctype-alnum
     *
     * @param mixed $text
     *
     * @return bool
     */
    public static function ctype_alnum($text)
    {
        $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__);

        return \is_string($text) && '' !== $text && !preg_match('/[^A-Za-z0-9]/', $text);
    }

    /**
     * Returns TRUE if every character in text is a letter, FALSE otherwise.
     *
     * @see https://php.net/ctype-alpha
     *
     * @param mixed $text
     *
     * @return bool
     */
    public static function ctype_alpha($text)
    {
        $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__);

        return \is_string($text) && '' !== $text && !preg_match('/[^A-Za-z]/', $text);
    }

    /**
     * Returns TRUE if every character in text is a control character from the current locale, FALSE otherwise.
     *
     * @see https://php.net/ctype-cntrl
     *
     * @param mixed $text
     *
     * @return bool
     */
    public static function ctype_cntrl($text)
    {
        $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__);

        return \is_string($text) && '' !== $text && !preg_match('/[^\x00-\x1f\x7f]/', $text);
    }

    /**
     * Returns TRUE if every character in the string text is a decimal digit, FALSE otherwise.
     *
     * @see https://php.net/ctype-digit
     *
     * @param mixed $text
     *
     * @return bool
     */
    public static function ctype_digit($text)
    {
        $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__);

        return \is_string($text) && '' !== $text && !preg_match('/[^0-9]/', $text);
    }

    /**
     * Returns TRUE if every character in text is printable and actually creates visible output (no white space), FALSE otherwise.
     *
     * @see https://php.net/ctype-graph
     *
     * @param mixed $text
     *
     * @return bool
     */
    public static function ctype_graph($text)
    {
        $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__);

        return \is_string($text) && '' !== $text && !preg_match('/[^!-~]/', $text);
    }

    /**
     * Returns TRUE if every character in text is a lowercase letter.
     *
     * @see https://php.net/ctype-lower
     *
     * @param mixed $text
     *
     * @return bool
     */
    public static function ctype_lower($text)
    {
        $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__);

        return \is_string($text) && '' !== $text && !preg_match('/[^a-z]/', $text);
    }

    /**
     * Returns TRUE if every character in text will actually create output (including blanks). Returns FALSE if text contains control characters or characters that do not have any output or control function at all.
     *
     * @see https://php.net/ctype-print
     *
     * @param mixed $text
     *
     * @return bool
     */
    public static function ctype_print($text)
    {
        $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__);

        return \is_string($text) && '' !== $text && !preg_match('/[^ -~]/', $text);
    }

    /**
     * Returns TRUE if every character in text is printable, but neither letter, digit or blank, FALSE otherwise.
     *
     * @see https://php.net/ctype-punct
     *
     * @param mixed $text
     *
     * @return bool
     */
    public static function ctype_punct($text)
    {
        $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__);

        return \is_string($text) && '' !== $text && !preg_match('/[^!-\/\:-@\[-`\{-~]/', $text);
    }

    /**
     * Returns TRUE if every character in text creates some sort of white space, FALSE otherwise. Besides the blank character this also includes tab, vertical tab, line feed, carriage return and form feed characters.
     *
     * @see https://php.net/ctype-space
     *
     * @param mixed $text
     *
     * @return bool
     */
    public static function ctype_space($text)
    {
        $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__);

        return \is_string($text) && '' !== $text && !preg_match('/[^\s]/', $text);
    }

    /**
     * Returns TRUE if every character in text is an uppercase letter.
     *
     * @see https://php.net/ctype-upper
     *
     * @param mixed $text
     *
     * @return bool
     */
    public static function ctype_upper($text)
    {
        $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__);

        return \is_string($text) && '' !== $text && !preg_match('/[^A-Z]/', $text);
    }

    /**
     * Returns TRUE if every character in text is a hexadecimal 'digit', that is a decimal digit or a character from [A-Fa-f] , FALSE otherwise.
     *
     * @see https://php.net/ctype-xdigit
     *
     * @param mixed $text
     *
     * @return bool
     */
    public static function ctype_xdigit($text)
    {
        $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__);

        return \is_string($text) && '' !== $text && !preg_match('/[^A-Fa-f0-9]/', $text);
    }

    /**
     * Converts integers to their char versions according to normal ctype behaviour, if needed.
     *
     * If an integer between -128 and 255 inclusive is provided,
     * it is interpreted as the ASCII value of a single character
     * (negative values have 256 added in order to allow characters in the Extended ASCII range).
     * Any other integer is interpreted as a string containing the decimal digits of the integer.
     *
     * @param mixed  $int
     * @param string $function
     *
     * @return mixed
     */
    private static function convert_int_to_char_for_ctype($int, $function)
    {
        if (!\is_int($int)) {
            return $int;
        }

        if ($int < -128 || $int > 255) {
            return (string) $int;
        }

        if (\PHP_VERSION_ID >= 80100) {
            @trigger_error($function.'(): Argument of type int will be interpreted as string in the future', \E_USER_DEPRECATED);
        }

        if ($int < 0) {
            $int += 256;
        }

        return \chr($int);
    }
}
Copyright (c) 2018-present Fabien Potencier

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.
Symfony Polyfill / Ctype
========================

This component provides `ctype_*` functions to users who run php versions without the ctype extension.

More information can be found in the
[main Polyfill README](https://github.com/symfony/polyfill/blob/main/README.md).

License
=======

This library is released under the [MIT license](LICENSE).
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

use Symfony\Polyfill\Ctype as p;

if (\PHP_VERSION_ID >= 80000) {
    return require __DIR__.'/bootstrap80.php';
}

if (!function_exists('ctype_alnum')) {
    function ctype_alnum($text) { return p\Ctype::ctype_alnum($text); }
}
if (!function_exists('ctype_alpha')) {
    function ctype_alpha($text) { return p\Ctype::ctype_alpha($text); }
}
if (!function_exists('ctype_cntrl')) {
    function ctype_cntrl($text) { return p\Ctype::ctype_cntrl($text); }
}
if (!function_exists('ctype_digit')) {
    function ctype_digit($text) { return p\Ctype::ctype_digit($text); }
}
if (!function_exists('ctype_graph')) {
    function ctype_graph($text) { return p\Ctype::ctype_graph($text); }
}
if (!function_exists('ctype_lower')) {
    function ctype_lower($text) { return p\Ctype::ctype_lower($text); }
}
if (!function_exists('ctype_print')) {
    function ctype_print($text) { return p\Ctype::ctype_print($text); }
}
if (!function_exists('ctype_punct')) {
    function ctype_punct($text) { return p\Ctype::ctype_punct($text); }
}
if (!function_exists('ctype_space')) {
    function ctype_space($text) { return p\Ctype::ctype_space($text); }
}
if (!function_exists('ctype_upper')) {
    function ctype_upper($text) { return p\Ctype::ctype_upper($text); }
}
if (!function_exists('ctype_xdigit')) {
    function ctype_xdigit($text) { return p\Ctype::ctype_xdigit($text); }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

use Symfony\Polyfill\Ctype as p;

if (!function_exists('ctype_alnum')) {
    function ctype_alnum(mixed $text): bool { return p\Ctype::ctype_alnum($text); }
}
if (!function_exists('ctype_alpha')) {
    function ctype_alpha(mixed $text): bool { return p\Ctype::ctype_alpha($text); }
}
if (!function_exists('ctype_cntrl')) {
    function ctype_cntrl(mixed $text): bool { return p\Ctype::ctype_cntrl($text); }
}
if (!function_exists('ctype_digit')) {
    function ctype_digit(mixed $text): bool { return p\Ctype::ctype_digit($text); }
}
if (!function_exists('ctype_graph')) {
    function ctype_graph(mixed $text): bool { return p\Ctype::ctype_graph($text); }
}
if (!function_exists('ctype_lower')) {
    function ctype_lower(mixed $text): bool { return p\Ctype::ctype_lower($text); }
}
if (!function_exists('ctype_print')) {
    function ctype_print(mixed $text): bool { return p\Ctype::ctype_print($text); }
}
if (!function_exists('ctype_punct')) {
    function ctype_punct(mixed $text): bool { return p\Ctype::ctype_punct($text); }
}
if (!function_exists('ctype_space')) {
    function ctype_space(mixed $text): bool { return p\Ctype::ctype_space($text); }
}
if (!function_exists('ctype_upper')) {
    function ctype_upper(mixed $text): bool { return p\Ctype::ctype_upper($text); }
}
if (!function_exists('ctype_xdigit')) {
    function ctype_xdigit(mixed $text): bool { return p\Ctype::ctype_xdigit($text); }
}
{
    "name": "symfony/polyfill-ctype",
    "type": "library",
    "description": "Symfony polyfill for ctype functions",
    "keywords": ["polyfill", "compatibility", "portable", "ctype"],
    "homepage": "https://symfony.com",
    "license": "MIT",
    "authors": [
        {
            "name": "Gert de Pagter",
            "email": "BackEndTea@gmail.com"
        },
        {
            "name": "Symfony Community",
            "homepage": "https://symfony.com/contributors"
        }
    ],
    "require": {
        "php": ">=7.1"
    },
    "provide": {
        "ext-ctype": "*"
    },
    "autoload": {
        "psr-4": { "Symfony\\Polyfill\\Ctype\\": "" },
        "files": [ "bootstrap.php" ]
    },
    "suggest": {
        "ext-ctype": "For best performance"
    },
    "minimum-stability": "dev",
    "extra": {
        "branch-alias": {
            "dev-main": "1.28-dev"
        },
        "thanks": {
            "name": "symfony/polyfill",
            "url": "https://github.com/symfony/polyfill"
        }
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\String;

use Symfony\Component\String\Exception\ExceptionInterface;
use Symfony\Component\String\Exception\InvalidArgumentException;
use Symfony\Component\String\Exception\RuntimeException;

/**
 * Represents a string of abstract characters.
 *
 * Unicode defines 3 types of "characters" (bytes, code points and grapheme clusters).
 * This class is the abstract type to use as a type-hint when the logic you want to
 * implement doesn't care about the exact variant it deals with.
 *
 * @author Nicolas Grekas <p@tchwork.com>
 * @author Hugo Hamon <hugohamon@neuf.fr>
 *
 * @throws ExceptionInterface
 */
abstract class AbstractString implements \Stringable, \JsonSerializable
{
    public const PREG_PATTERN_ORDER = \PREG_PATTERN_ORDER;
    public const PREG_SET_ORDER = \PREG_SET_ORDER;
    public const PREG_OFFSET_CAPTURE = \PREG_OFFSET_CAPTURE;
    public const PREG_UNMATCHED_AS_NULL = \PREG_UNMATCHED_AS_NULL;

    public const PREG_SPLIT = 0;
    public const PREG_SPLIT_NO_EMPTY = \PREG_SPLIT_NO_EMPTY;
    public const PREG_SPLIT_DELIM_CAPTURE = \PREG_SPLIT_DELIM_CAPTURE;
    public const PREG_SPLIT_OFFSET_CAPTURE = \PREG_SPLIT_OFFSET_CAPTURE;

    protected $string = '';
    protected $ignoreCase = false;

    abstract public function __construct(string $string = '');

    /**
     * Unwraps instances of AbstractString back to strings.
     *
     * @return string[]|array
     */
    public static function unwrap(array $values): array
    {
        foreach ($values as $k => $v) {
            if ($v instanceof self) {
                $values[$k] = $v->__toString();
            } elseif (\is_array($v) && $values[$k] !== $v = static::unwrap($v)) {
                $values[$k] = $v;
            }
        }

        return $values;
    }

    /**
     * Wraps (and normalizes) strings in instances of AbstractString.
     *
     * @return static[]|array
     */
    public static function wrap(array $values): array
    {
        $i = 0;
        $keys = null;

        foreach ($values as $k => $v) {
            if (\is_string($k) && '' !== $k && $k !== $j = (string) new static($k)) {
                $keys = $keys ?? array_keys($values);
                $keys[$i] = $j;
            }

            if (\is_string($v)) {
                $values[$k] = new static($v);
            } elseif (\is_array($v) && $values[$k] !== $v = static::wrap($v)) {
                $values[$k] = $v;
            }

            ++$i;
        }

        return null !== $keys ? array_combine($keys, $values) : $values;
    }

    /**
     * @param string|string[] $needle
     *
     * @return static
     */
    public function after($needle, bool $includeNeedle = false, int $offset = 0): self
    {
        $str = clone $this;
        $i = \PHP_INT_MAX;

        foreach ((array) $needle as $n) {
            $n = (string) $n;
            $j = $this->indexOf($n, $offset);

            if (null !== $j && $j < $i) {
                $i = $j;
                $str->string = $n;
            }
        }

        if (\PHP_INT_MAX === $i) {
            return $str;
        }

        if (!$includeNeedle) {
            $i += $str->length();
        }

        return $this->slice($i);
    }

    /**
     * @param string|string[] $needle
     *
     * @return static
     */
    public function afterLast($needle, bool $includeNeedle = false, int $offset = 0): self
    {
        $str = clone $this;
        $i = null;

        foreach ((array) $needle as $n) {
            $n = (string) $n;
            $j = $this->indexOfLast($n, $offset);

            if (null !== $j && $j >= $i) {
                $i = $offset = $j;
                $str->string = $n;
            }
        }

        if (null === $i) {
            return $str;
        }

        if (!$includeNeedle) {
            $i += $str->length();
        }

        return $this->slice($i);
    }

    /**
     * @return static
     */
    abstract public function append(string ...$suffix): self;

    /**
     * @param string|string[] $needle
     *
     * @return static
     */
    public function before($needle, bool $includeNeedle = false, int $offset = 0): self
    {
        $str = clone $this;
        $i = \PHP_INT_MAX;

        foreach ((array) $needle as $n) {
            $n = (string) $n;
            $j = $this->indexOf($n, $offset);

            if (null !== $j && $j < $i) {
                $i = $j;
                $str->string = $n;
            }
        }

        if (\PHP_INT_MAX === $i) {
            return $str;
        }

        if ($includeNeedle) {
            $i += $str->length();
        }

        return $this->slice(0, $i);
    }

    /**
     * @param string|string[] $needle
     *
     * @return static
     */
    public function beforeLast($needle, bool $includeNeedle = false, int $offset = 0): self
    {
        $str = clone $this;
        $i = null;

        foreach ((array) $needle as $n) {
            $n = (string) $n;
            $j = $this->indexOfLast($n, $offset);

            if (null !== $j && $j >= $i) {
                $i = $offset = $j;
                $str->string = $n;
            }
        }

        if (null === $i) {
            return $str;
        }

        if ($includeNeedle) {
            $i += $str->length();
        }

        return $this->slice(0, $i);
    }

    /**
     * @return int[]
     */
    public function bytesAt(int $offset): array
    {
        $str = $this->slice($offset, 1);

        return '' === $str->string ? [] : array_values(unpack('C*', $str->string));
    }

    /**
     * @return static
     */
    abstract public function camel(): self;

    /**
     * @return static[]
     */
    abstract public function chunk(int $length = 1): array;

    /**
     * @return static
     */
    public function collapseWhitespace(): self
    {
        $str = clone $this;
        $str->string = trim(preg_replace("/(?:[ \n\r\t\x0C]{2,}+|[\n\r\t\x0C])/", ' ', $str->string), " \n\r\t\x0C");

        return $str;
    }

    /**
     * @param string|string[] $needle
     */
    public function containsAny($needle): bool
    {
        return null !== $this->indexOf($needle);
    }

    /**
     * @param string|string[] $suffix
     */
    public function endsWith($suffix): bool
    {
        if (!\is_array($suffix) && !$suffix instanceof \Traversable) {
            throw new \TypeError(sprintf('Method "%s()" must be overridden by class "%s" to deal with non-iterable values.', __FUNCTION__, static::class));
        }

        foreach ($suffix as $s) {
            if ($this->endsWith((string) $s)) {
                return true;
            }
        }

        return false;
    }

    /**
     * @return static
     */
    public function ensureEnd(string $suffix): self
    {
        if (!$this->endsWith($suffix)) {
            return $this->append($suffix);
        }

        $suffix = preg_quote($suffix);
        $regex = '{('.$suffix.')(?:'.$suffix.')++$}D';

        return $this->replaceMatches($regex.($this->ignoreCase ? 'i' : ''), '$1');
    }

    /**
     * @return static
     */
    public function ensureStart(string $prefix): self
    {
        $prefix = new static($prefix);

        if (!$this->startsWith($prefix)) {
            return $this->prepend($prefix);
        }

        $str = clone $this;
        $i = $prefixLen = $prefix->length();

        while ($this->indexOf($prefix, $i) === $i) {
            $str = $str->slice($prefixLen);
            $i += $prefixLen;
        }

        return $str;
    }

    /**
     * @param string|string[] $string
     */
    public function equalsTo($string): bool
    {
        if (!\is_array($string) && !$string instanceof \Traversable) {
            throw new \TypeError(sprintf('Method "%s()" must be overridden by class "%s" to deal with non-iterable values.', __FUNCTION__, static::class));
        }

        foreach ($string as $s) {
            if ($this->equalsTo((string) $s)) {
                return true;
            }
        }

        return false;
    }

    /**
     * @return static
     */
    abstract public function folded(): self;

    /**
     * @return static
     */
    public function ignoreCase(): self
    {
        $str = clone $this;
        $str->ignoreCase = true;

        return $str;
    }

    /**
     * @param string|string[] $needle
     */
    public function indexOf($needle, int $offset = 0): ?int
    {
        if (!\is_array($needle) && !$needle instanceof \Traversable) {
            throw new \TypeError(sprintf('Method "%s()" must be overridden by class "%s" to deal with non-iterable values.', __FUNCTION__, static::class));
        }

        $i = \PHP_INT_MAX;

        foreach ($needle as $n) {
            $j = $this->indexOf((string) $n, $offset);

            if (null !== $j && $j < $i) {
                $i = $j;
            }
        }

        return \PHP_INT_MAX === $i ? null : $i;
    }

    /**
     * @param string|string[] $needle
     */
    public function indexOfLast($needle, int $offset = 0): ?int
    {
        if (!\is_array($needle) && !$needle instanceof \Traversable) {
            throw new \TypeError(sprintf('Method "%s()" must be overridden by class "%s" to deal with non-iterable values.', __FUNCTION__, static::class));
        }

        $i = null;

        foreach ($needle as $n) {
            $j = $this->indexOfLast((string) $n, $offset);

            if (null !== $j && $j >= $i) {
                $i = $offset = $j;
            }
        }

        return $i;
    }

    public function isEmpty(): bool
    {
        return '' === $this->string;
    }

    /**
     * @return static
     */
    abstract public function join(array $strings, string $lastGlue = null): self;

    public function jsonSerialize(): string
    {
        return $this->string;
    }

    abstract public function length(): int;

    /**
     * @return static
     */
    abstract public function lower(): self;

    /**
     * Matches the string using a regular expression.
     *
     * Pass PREG_PATTERN_ORDER or PREG_SET_ORDER as $flags to get all occurrences matching the regular expression.
     *
     * @return array All matches in a multi-dimensional array ordered according to flags
     */
    abstract public function match(string $regexp, int $flags = 0, int $offset = 0): array;

    /**
     * @return static
     */
    abstract public function padBoth(int $length, string $padStr = ' '): self;

    /**
     * @return static
     */
    abstract public function padEnd(int $length, string $padStr = ' '): self;

    /**
     * @return static
     */
    abstract public function padStart(int $length, string $padStr = ' '): self;

    /**
     * @return static
     */
    abstract public function prepend(string ...$prefix): self;

    /**
     * @return static
     */
    public function repeat(int $multiplier): self
    {
        if (0 > $multiplier) {
            throw new InvalidArgumentException(sprintf('Multiplier must be positive, %d given.', $multiplier));
        }

        $str = clone $this;
        $str->string = str_repeat($str->string, $multiplier);

        return $str;
    }

    /**
     * @return static
     */
    abstract public function replace(string $from, string $to): self;

    /**
     * @param string|callable $to
     *
     * @return static
     */
    abstract public function replaceMatches(string $fromRegexp, $to): self;

    /**
     * @return static
     */
    abstract public function reverse(): self;

    /**
     * @return static
     */
    abstract public function slice(int $start = 0, int $length = null): self;

    /**
     * @return static
     */
    abstract public function snake(): self;

    /**
     * @return static
     */
    abstract public function splice(string $replacement, int $start = 0, int $length = null): self;

    /**
     * @return static[]
     */
    public function split(string $delimiter, int $limit = null, int $flags = null): array
    {
        if (null === $flags) {
            throw new \TypeError('Split behavior when $flags is null must be implemented by child classes.');
        }

        if ($this->ignoreCase) {
            $delimiter .= 'i';
        }

        set_error_handler(static function ($t, $m) { throw new InvalidArgumentException($m); });

        try {
            if (false === $chunks = preg_split($delimiter, $this->string, $limit, $flags)) {
                $lastError = preg_last_error();

                foreach (get_defined_constants(true)['pcre'] as $k => $v) {
                    if ($lastError === $v && '_ERROR' === substr($k, -6)) {
                        throw new RuntimeException('Splitting failed with '.$k.'.');
                    }
                }

                throw new RuntimeException('Splitting failed with unknown error code.');
            }
        } finally {
            restore_error_handler();
        }

        $str = clone $this;

        if (self::PREG_SPLIT_OFFSET_CAPTURE & $flags) {
            foreach ($chunks as &$chunk) {
                $str->string = $chunk[0];
                $chunk[0] = clone $str;
            }
        } else {
            foreach ($chunks as &$chunk) {
                $str->string = $chunk;
                $chunk = clone $str;
            }
        }

        return $chunks;
    }

    /**
     * @param string|string[] $prefix
     */
    public function startsWith($prefix): bool
    {
        if (!\is_array($prefix) && !$prefix instanceof \Traversable) {
            throw new \TypeError(sprintf('Method "%s()" must be overridden by class "%s" to deal with non-iterable values.', __FUNCTION__, static::class));
        }

        foreach ($prefix as $prefix) {
            if ($this->startsWith((string) $prefix)) {
                return true;
            }
        }

        return false;
    }

    /**
     * @return static
     */
    abstract public function title(bool $allWords = false): self;

    public function toByteString(string $toEncoding = null): ByteString
    {
        $b = new ByteString();

        $toEncoding = \in_array($toEncoding, ['utf8', 'utf-8', 'UTF8'], true) ? 'UTF-8' : $toEncoding;

        if (null === $toEncoding || $toEncoding === $fromEncoding = $this instanceof AbstractUnicodeString || preg_match('//u', $b->string) ? 'UTF-8' : 'Windows-1252') {
            $b->string = $this->string;

            return $b;
        }

        set_error_handler(static function ($t, $m) { throw new InvalidArgumentException($m); });

        try {
            try {
                $b->string = mb_convert_encoding($this->string, $toEncoding, 'UTF-8');
            } catch (InvalidArgumentException|\ValueError $e) {
                if (!\function_exists('iconv')) {
                    if ($e instanceof \ValueError) {
                        throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e);
                    }
                    throw $e;
                }

                $b->string = iconv('UTF-8', $toEncoding, $this->string);
            }
        } finally {
            restore_error_handler();
        }

        return $b;
    }

    public function toCodePointString(): CodePointString
    {
        return new CodePointString($this->string);
    }

    public function toString(): string
    {
        return $this->string;
    }

    public function toUnicodeString(): UnicodeString
    {
        return new UnicodeString($this->string);
    }

    /**
     * @return static
     */
    abstract public function trim(string $chars = " \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}"): self;

    /**
     * @return static
     */
    abstract public function trimEnd(string $chars = " \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}"): self;

    /**
     * @param string|string[] $prefix
     *
     * @return static
     */
    public function trimPrefix($prefix): self
    {
        if (\is_array($prefix) || $prefix instanceof \Traversable) {
            foreach ($prefix as $s) {
                $t = $this->trimPrefix($s);

                if ($t->string !== $this->string) {
                    return $t;
                }
            }

            return clone $this;
        }

        $str = clone $this;

        if ($prefix instanceof self) {
            $prefix = $prefix->string;
        } else {
            $prefix = (string) $prefix;
        }

        if ('' !== $prefix && \strlen($this->string) >= \strlen($prefix) && 0 === substr_compare($this->string, $prefix, 0, \strlen($prefix), $this->ignoreCase)) {
            $str->string = substr($this->string, \strlen($prefix));
        }

        return $str;
    }

    /**
     * @return static
     */
    abstract public function trimStart(string $chars = " \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}"): self;

    /**
     * @param string|string[] $suffix
     *
     * @return static
     */
    public function trimSuffix($suffix): self
    {
        if (\is_array($suffix) || $suffix instanceof \Traversable) {
            foreach ($suffix as $s) {
                $t = $this->trimSuffix($s);

                if ($t->string !== $this->string) {
                    return $t;
                }
            }

            return clone $this;
        }

        $str = clone $this;

        if ($suffix instanceof self) {
            $suffix = $suffix->string;
        } else {
            $suffix = (string) $suffix;
        }

        if ('' !== $suffix && \strlen($this->string) >= \strlen($suffix) && 0 === substr_compare($this->string, $suffix, -\strlen($suffix), null, $this->ignoreCase)) {
            $str->string = substr($this->string, 0, -\strlen($suffix));
        }

        return $str;
    }

    /**
     * @return static
     */
    public function truncate(int $length, string $ellipsis = '', bool $cut = true): self
    {
        $stringLength = $this->length();

        if ($stringLength <= $length) {
            return clone $this;
        }

        $ellipsisLength = '' !== $ellipsis ? (new static($ellipsis))->length() : 0;

        if ($length < $ellipsisLength) {
            $ellipsisLength = 0;
        }

        if (!$cut) {
            if (null === $length = $this->indexOf([' ', "\r", "\n", "\t"], ($length ?: 1) - 1)) {
                return clone $this;
            }

            $length += $ellipsisLength;
        }

        $str = $this->slice(0, $length - $ellipsisLength);

        return $ellipsisLength ? $str->trimEnd()->append($ellipsis) : $str;
    }

    /**
     * @return static
     */
    abstract public function upper(): self;

    /**
     * Returns the printable length on a terminal.
     */
    abstract public function width(bool $ignoreAnsiDecoration = true): int;

    /**
     * @return static
     */
    public function wordwrap(int $width = 75, string $break = "\n", bool $cut = false): self
    {
        $lines = '' !== $break ? $this->split($break) : [clone $this];
        $chars = [];
        $mask = '';

        if (1 === \count($lines) && '' === $lines[0]->string) {
            return $lines[0];
        }

        foreach ($lines as $i => $line) {
            if ($i) {
                $chars[] = $break;
                $mask .= '#';
            }

            foreach ($line->chunk() as $char) {
                $chars[] = $char->string;
                $mask .= ' ' === $char->string ? ' ' : '?';
            }
        }

        $string = '';
        $j = 0;
        $b = $i = -1;
        $mask = wordwrap($mask, $width, '#', $cut);

        while (false !== $b = strpos($mask, '#', $b + 1)) {
            for (++$i; $i < $b; ++$i) {
                $string .= $chars[$j];
                unset($chars[$j++]);
            }

            if ($break === $chars[$j] || ' ' === $chars[$j]) {
                unset($chars[$j++]);
            }

            $string .= $break;
        }

        $str = clone $this;
        $str->string = $string.implode('', $chars);

        return $str;
    }

    public function __sleep(): array
    {
        return ['string'];
    }

    public function __clone()
    {
        $this->ignoreCase = false;
    }

    public function __toString(): string
    {
        return $this->string;
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\String;

use Symfony\Component\String\Exception\ExceptionInterface;
use Symfony\Component\String\Exception\InvalidArgumentException;
use Symfony\Component\String\Exception\RuntimeException;

/**
 * Represents a string of abstract Unicode characters.
 *
 * Unicode defines 3 types of "characters" (bytes, code points and grapheme clusters).
 * This class is the abstract type to use as a type-hint when the logic you want to
 * implement is Unicode-aware but doesn't care about code points vs grapheme clusters.
 *
 * @author Nicolas Grekas <p@tchwork.com>
 *
 * @throws ExceptionInterface
 */
abstract class AbstractUnicodeString extends AbstractString
{
    public const NFC = \Normalizer::NFC;
    public const NFD = \Normalizer::NFD;
    public const NFKC = \Normalizer::NFKC;
    public const NFKD = \Normalizer::NFKD;

    // all ASCII letters sorted by typical frequency of occurrence
    private const ASCII = "\x20\x65\x69\x61\x73\x6E\x74\x72\x6F\x6C\x75\x64\x5D\x5B\x63\x6D\x70\x27\x0A\x67\x7C\x68\x76\x2E\x66\x62\x2C\x3A\x3D\x2D\x71\x31\x30\x43\x32\x2A\x79\x78\x29\x28\x4C\x39\x41\x53\x2F\x50\x22\x45\x6A\x4D\x49\x6B\x33\x3E\x35\x54\x3C\x44\x34\x7D\x42\x7B\x38\x46\x77\x52\x36\x37\x55\x47\x4E\x3B\x4A\x7A\x56\x23\x48\x4F\x57\x5F\x26\x21\x4B\x3F\x58\x51\x25\x59\x5C\x09\x5A\x2B\x7E\x5E\x24\x40\x60\x7F\x00\x01\x02\x03\x04\x05\x06\x07\x08\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F";

    // the subset of folded case mappings that is not in lower case mappings
    private const FOLD_FROM = ['İ', 'µ', 'ſ', "\xCD\x85", 'ς', 'ϐ', 'ϑ', 'ϕ', 'ϖ', 'ϰ', 'ϱ', 'ϵ', 'ẛ', "\xE1\xBE\xBE", 'ß', 'ʼn', 'ǰ', 'ΐ', 'ΰ', 'և', 'ẖ', 'ẗ', 'ẘ', 'ẙ', 'ẚ', 'ẞ', 'ὐ', 'ὒ', 'ὔ', 'ὖ', 'ᾀ', 'ᾁ', 'ᾂ', 'ᾃ', 'ᾄ', 'ᾅ', 'ᾆ', 'ᾇ', 'ᾈ', 'ᾉ', 'ᾊ', 'ᾋ', 'ᾌ', 'ᾍ', 'ᾎ', 'ᾏ', 'ᾐ', 'ᾑ', 'ᾒ', 'ᾓ', 'ᾔ', 'ᾕ', 'ᾖ', 'ᾗ', 'ᾘ', 'ᾙ', 'ᾚ', 'ᾛ', 'ᾜ', 'ᾝ', 'ᾞ', 'ᾟ', 'ᾠ', 'ᾡ', 'ᾢ', 'ᾣ', 'ᾤ', 'ᾥ', 'ᾦ', 'ᾧ', 'ᾨ', 'ᾩ', 'ᾪ', 'ᾫ', 'ᾬ', 'ᾭ', 'ᾮ', 'ᾯ', 'ᾲ', 'ᾳ', 'ᾴ', 'ᾶ', 'ᾷ', 'ᾼ', 'ῂ', 'ῃ', 'ῄ', 'ῆ', 'ῇ', 'ῌ', 'ῒ', 'ῖ', 'ῗ', 'ῢ', 'ῤ', 'ῦ', 'ῧ', 'ῲ', 'ῳ', 'ῴ', 'ῶ', 'ῷ', 'ῼ', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'ſt', 'st', 'ﬓ', 'ﬔ', 'ﬕ', 'ﬖ', 'ﬗ'];
    private const FOLD_TO = ['i̇', 'μ', 's', 'ι', 'σ', 'β', 'θ', 'φ', 'π', 'κ', 'ρ', 'ε', 'ṡ', 'ι', 'ss', 'ʼn', 'ǰ', 'ΐ', 'ΰ', 'եւ', 'ẖ', 'ẗ', 'ẘ', 'ẙ', 'aʾ', 'ss', 'ὐ', 'ὒ', 'ὔ', 'ὖ', 'ἀι', 'ἁι', 'ἂι', 'ἃι', 'ἄι', 'ἅι', 'ἆι', 'ἇι', 'ἀι', 'ἁι', 'ἂι', 'ἃι', 'ἄι', 'ἅι', 'ἆι', 'ἇι', 'ἠι', 'ἡι', 'ἢι', 'ἣι', 'ἤι', 'ἥι', 'ἦι', 'ἧι', 'ἠι', 'ἡι', 'ἢι', 'ἣι', 'ἤι', 'ἥι', 'ἦι', 'ἧι', 'ὠι', 'ὡι', 'ὢι', 'ὣι', 'ὤι', 'ὥι', 'ὦι', 'ὧι', 'ὠι', 'ὡι', 'ὢι', 'ὣι', 'ὤι', 'ὥι', 'ὦι', 'ὧι', 'ὰι', 'αι', 'άι', 'ᾶ', 'ᾶι', 'αι', 'ὴι', 'ηι', 'ήι', 'ῆ', 'ῆι', 'ηι', 'ῒ', 'ῖ', 'ῗ', 'ῢ', 'ῤ', 'ῦ', 'ῧ', 'ὼι', 'ωι', 'ώι', 'ῶ', 'ῶι', 'ωι', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'st', 'st', 'մն', 'մե', 'մի', 'վն', 'մխ'];

    // the subset of upper case mappings that map one code point to many code points
    private const UPPER_FROM = ['ß', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'ſt', 'st', 'և', 'ﬓ', 'ﬔ', 'ﬕ', 'ﬖ', 'ﬗ', 'ʼn', 'ΐ', 'ΰ', 'ǰ', 'ẖ', 'ẗ', 'ẘ', 'ẙ', 'ẚ', 'ὐ', 'ὒ', 'ὔ', 'ὖ', 'ᾶ', 'ῆ', 'ῒ', 'ΐ', 'ῖ', 'ῗ', 'ῢ', 'ΰ', 'ῤ', 'ῦ', 'ῧ', 'ῶ'];
    private const UPPER_TO = ['SS', 'FF', 'FI', 'FL', 'FFI', 'FFL', 'ST', 'ST', 'ԵՒ', 'ՄՆ', 'ՄԵ', 'ՄԻ', 'ՎՆ', 'ՄԽ', 'ʼN', 'Ϊ́', 'Ϋ́', 'J̌', 'H̱', 'T̈', 'W̊', 'Y̊', 'Aʾ', 'Υ̓', 'Υ̓̀', 'Υ̓́', 'Υ̓͂', 'Α͂', 'Η͂', 'Ϊ̀', 'Ϊ́', 'Ι͂', 'Ϊ͂', 'Ϋ̀', 'Ϋ́', 'Ρ̓', 'Υ͂', 'Ϋ͂', 'Ω͂'];

    // the subset of https://github.com/unicode-org/cldr/blob/master/common/transforms/Latin-ASCII.xml that is not in NFKD
    private const TRANSLIT_FROM = ['Æ', 'Ð', 'Ø', 'Þ', 'ß', 'æ', 'ð', 'ø', 'þ', 'Đ', 'đ', 'Ħ', 'ħ', 'ı', 'ĸ', 'Ŀ', 'ŀ', 'Ł', 'ł', 'ʼn', 'Ŋ', 'ŋ', 'Œ', 'œ', 'Ŧ', 'ŧ', 'ƀ', 'Ɓ', 'Ƃ', 'ƃ', 'Ƈ', 'ƈ', 'Ɖ', 'Ɗ', 'Ƌ', 'ƌ', 'Ɛ', 'Ƒ', 'ƒ', 'Ɠ', 'ƕ', 'Ɩ', 'Ɨ', 'Ƙ', 'ƙ', 'ƚ', 'Ɲ', 'ƞ', 'Ƣ', 'ƣ', 'Ƥ', 'ƥ', 'ƫ', 'Ƭ', 'ƭ', 'Ʈ', 'Ʋ', 'Ƴ', 'ƴ', 'Ƶ', 'ƶ', 'DŽ', 'Dž', 'dž', 'Ǥ', 'ǥ', 'ȡ', 'Ȥ', 'ȥ', 'ȴ', 'ȵ', 'ȶ', 'ȷ', 'ȸ', 'ȹ', 'Ⱥ', 'Ȼ', 'ȼ', 'Ƚ', 'Ⱦ', 'ȿ', 'ɀ', 'Ƀ', 'Ʉ', 'Ɇ', 'ɇ', 'Ɉ', 'ɉ', 'Ɍ', 'ɍ', 'Ɏ', 'ɏ', 'ɓ', 'ɕ', 'ɖ', 'ɗ', 'ɛ', 'ɟ', 'ɠ', 'ɡ', 'ɢ', 'ɦ', 'ɧ', 'ɨ', 'ɪ', 'ɫ', 'ɬ', 'ɭ', 'ɱ', 'ɲ', 'ɳ', 'ɴ', 'ɶ', 'ɼ', 'ɽ', 'ɾ', 'ʀ', 'ʂ', 'ʈ', 'ʉ', 'ʋ', 'ʏ', 'ʐ', 'ʑ', 'ʙ', 'ʛ', 'ʜ', 'ʝ', 'ʟ', 'ʠ', 'ʣ', 'ʥ', 'ʦ', 'ʪ', 'ʫ', 'ᴀ', 'ᴁ', 'ᴃ', 'ᴄ', 'ᴅ', 'ᴆ', 'ᴇ', 'ᴊ', 'ᴋ', 'ᴌ', 'ᴍ', 'ᴏ', 'ᴘ', 'ᴛ', 'ᴜ', 'ᴠ', 'ᴡ', 'ᴢ', 'ᵫ', 'ᵬ', 'ᵭ', 'ᵮ', 'ᵯ', 'ᵰ', 'ᵱ', 'ᵲ', 'ᵳ', 'ᵴ', 'ᵵ', 'ᵶ', 'ᵺ', 'ᵻ', 'ᵽ', 'ᵾ', 'ᶀ', 'ᶁ', 'ᶂ', 'ᶃ', 'ᶄ', 'ᶅ', 'ᶆ', 'ᶇ', 'ᶈ', 'ᶉ', 'ᶊ', 'ᶌ', 'ᶍ', 'ᶎ', 'ᶏ', 'ᶑ', 'ᶒ', 'ᶓ', 'ᶖ', 'ᶙ', 'ẚ', 'ẜ', 'ẝ', 'ẞ', 'Ỻ', 'ỻ', 'Ỽ', 'ỽ', 'Ỿ', 'ỿ', '©', '®', '₠', '₢', '₣', '₤', '₧', '₺', '₹', 'ℌ', '℞', '㎧', '㎮', '㏆', '㏗', '㏞', '㏟', '¼', '½', '¾', '⅓', '⅔', '⅕', '⅖', '⅗', '⅘', '⅙', '⅚', '⅛', '⅜', '⅝', '⅞', '⅟', '〇', '‘', '’', '‚', '‛', '“', '”', '„', '‟', '′', '″', '〝', '〞', '«', '»', '‹', '›', '‐', '‑', '‒', '–', '—', '―', '︱', '︲', '﹘', '‖', '⁄', '⁅', '⁆', '⁎', '、', '。', '〈', '〉', '《', '》', '〔', '〕', '〘', '〙', '〚', '〛', '︑', '︒', '︹', '︺', '︽', '︾', '︿', '﹀', '﹑', '﹝', '﹞', '⦅', '⦆', '。', '、', '×', '÷', '−', '∕', '∖', '∣', '∥', '≪', '≫', '⦅', '⦆'];
    private const TRANSLIT_TO = ['AE', 'D', 'O', 'TH', 'ss', 'ae', 'd', 'o', 'th', 'D', 'd', 'H', 'h', 'i', 'q', 'L', 'l', 'L', 'l', '\'n', 'N', 'n', 'OE', 'oe', 'T', 't', 'b', 'B', 'B', 'b', 'C', 'c', 'D', 'D', 'D', 'd', 'E', 'F', 'f', 'G', 'hv', 'I', 'I', 'K', 'k', 'l', 'N', 'n', 'OI', 'oi', 'P', 'p', 't', 'T', 't', 'T', 'V', 'Y', 'y', 'Z', 'z', 'DZ', 'Dz', 'dz', 'G', 'g', 'd', 'Z', 'z', 'l', 'n', 't', 'j', 'db', 'qp', 'A', 'C', 'c', 'L', 'T', 's', 'z', 'B', 'U', 'E', 'e', 'J', 'j', 'R', 'r', 'Y', 'y', 'b', 'c', 'd', 'd', 'e', 'j', 'g', 'g', 'G', 'h', 'h', 'i', 'I', 'l', 'l', 'l', 'm', 'n', 'n', 'N', 'OE', 'r', 'r', 'r', 'R', 's', 't', 'u', 'v', 'Y', 'z', 'z', 'B', 'G', 'H', 'j', 'L', 'q', 'dz', 'dz', 'ts', 'ls', 'lz', 'A', 'AE', 'B', 'C', 'D', 'D', 'E', 'J', 'K', 'L', 'M', 'O', 'P', 'T', 'U', 'V', 'W', 'Z', 'ue', 'b', 'd', 'f', 'm', 'n', 'p', 'r', 'r', 's', 't', 'z', 'th', 'I', 'p', 'U', 'b', 'd', 'f', 'g', 'k', 'l', 'm', 'n', 'p', 'r', 's', 'v', 'x', 'z', 'a', 'd', 'e', 'e', 'i', 'u', 'a', 's', 's', 'SS', 'LL', 'll', 'V', 'v', 'Y', 'y', '(C)', '(R)', 'CE', 'Cr', 'Fr.', 'L.', 'Pts', 'TL', 'Rs', 'x', 'Rx', 'm/s', 'rad/s', 'C/kg', 'pH', 'V/m', 'A/m', ' 1/4', ' 1/2', ' 3/4', ' 1/3', ' 2/3', ' 1/5', ' 2/5', ' 3/5', ' 4/5', ' 1/6', ' 5/6', ' 1/8', ' 3/8', ' 5/8', ' 7/8', ' 1/', '0', '\'', '\'', ',', '\'', '"', '"', ',,', '"', '\'', '"', '"', '"', '<<', '>>', '<', '>', '-', '-', '-', '-', '-', '-', '-', '-', '-', '||', '/', '[', ']', '*', ',', '.', '<', '>', '<<', '>>', '[', ']', '[', ']', '[', ']', ',', '.', '[', ']', '<<', '>>', '<', '>', ',', '[', ']', '((', '))', '.', ',', '*', '/', '-', '/', '\\', '|', '||', '<<', '>>', '((', '))'];

    private static $transliterators = [];
    private static $tableZero;
    private static $tableWide;

    /**
     * @return static
     */
    public static function fromCodePoints(int ...$codes): self
    {
        $string = '';

        foreach ($codes as $code) {
            if (0x80 > $code %= 0x200000) {
                $string .= \chr($code);
            } elseif (0x800 > $code) {
                $string .= \chr(0xC0 | $code >> 6).\chr(0x80 | $code & 0x3F);
            } elseif (0x10000 > $code) {
                $string .= \chr(0xE0 | $code >> 12).\chr(0x80 | $code >> 6 & 0x3F).\chr(0x80 | $code & 0x3F);
            } else {
                $string .= \chr(0xF0 | $code >> 18).\chr(0x80 | $code >> 12 & 0x3F).\chr(0x80 | $code >> 6 & 0x3F).\chr(0x80 | $code & 0x3F);
            }
        }

        return new static($string);
    }

    /**
     * Generic UTF-8 to ASCII transliteration.
     *
     * Install the intl extension for best results.
     *
     * @param string[]|\Transliterator[]|\Closure[] $rules See "*-Latin" rules from Transliterator::listIDs()
     */
    public function ascii(array $rules = []): self
    {
        $str = clone $this;
        $s = $str->string;
        $str->string = '';

        array_unshift($rules, 'nfd');
        $rules[] = 'latin-ascii';

        if (\function_exists('transliterator_transliterate')) {
            $rules[] = 'any-latin/bgn';
        }

        $rules[] = 'nfkd';
        $rules[] = '[:nonspacing mark:] remove';

        while (\strlen($s) - 1 > $i = strspn($s, self::ASCII)) {
            if (0 < --$i) {
                $str->string .= substr($s, 0, $i);
                $s = substr($s, $i);
            }

            if (!$rule = array_shift($rules)) {
                $rules = []; // An empty rule interrupts the next ones
            }

            if ($rule instanceof \Transliterator) {
                $s = $rule->transliterate($s);
            } elseif ($rule instanceof \Closure) {
                $s = $rule($s);
            } elseif ($rule) {
                if ('nfd' === $rule = strtolower($rule)) {
                    normalizer_is_normalized($s, self::NFD) ?: $s = normalizer_normalize($s, self::NFD);
                } elseif ('nfkd' === $rule) {
                    normalizer_is_normalized($s, self::NFKD) ?: $s = normalizer_normalize($s, self::NFKD);
                } elseif ('[:nonspacing mark:] remove' === $rule) {
                    $s = preg_replace('/\p{Mn}++/u', '', $s);
                } elseif ('latin-ascii' === $rule) {
                    $s = str_replace(self::TRANSLIT_FROM, self::TRANSLIT_TO, $s);
                } elseif ('de-ascii' === $rule) {
                    $s = preg_replace("/([AUO])\u{0308}(?=\p{Ll})/u", '$1e', $s);
                    $s = str_replace(["a\u{0308}", "o\u{0308}", "u\u{0308}", "A\u{0308}", "O\u{0308}", "U\u{0308}"], ['ae', 'oe', 'ue', 'AE', 'OE', 'UE'], $s);
                } elseif (\function_exists('transliterator_transliterate')) {
                    if (null === $transliterator = self::$transliterators[$rule] ?? self::$transliterators[$rule] = \Transliterator::create($rule)) {
                        if ('any-latin/bgn' === $rule) {
                            $rule = 'any-latin';
                            $transliterator = self::$transliterators[$rule] ?? self::$transliterators[$rule] = \Transliterator::create($rule);
                        }

                        if (null === $transliterator) {
                            throw new InvalidArgumentException(sprintf('Unknown transliteration rule "%s".', $rule));
                        }

                        self::$transliterators['any-latin/bgn'] = $transliterator;
                    }

                    $s = $transliterator->transliterate($s);
                }
            } elseif (!\function_exists('iconv')) {
                $s = preg_replace('/[^\x00-\x7F]/u', '?', $s);
            } else {
                $s = @preg_replace_callback('/[^\x00-\x7F]/u', static function ($c) {
                    $c = (string) iconv('UTF-8', 'ASCII//TRANSLIT', $c[0]);

                    if ('' === $c && '' === iconv('UTF-8', 'ASCII//TRANSLIT', '²')) {
                        throw new \LogicException(sprintf('"%s" requires a translit-able iconv implementation, try installing "gnu-libiconv" if you\'re using Alpine Linux.', static::class));
                    }

                    return 1 < \strlen($c) ? ltrim($c, '\'`"^~') : ('' !== $c ? $c : '?');
                }, $s);
            }
        }

        $str->string .= $s;

        return $str;
    }

    public function camel(): parent
    {
        $str = clone $this;
        $str->string = str_replace(' ', '', preg_replace_callback('/\b.(?![A-Z]{2,})/u', static function ($m) use (&$i) {
            return 1 === ++$i ? ('İ' === $m[0] ? 'i̇' : mb_strtolower($m[0], 'UTF-8')) : mb_convert_case($m[0], \MB_CASE_TITLE, 'UTF-8');
        }, preg_replace('/[^\pL0-9]++/u', ' ', $this->string)));

        return $str;
    }

    /**
     * @return int[]
     */
    public function codePointsAt(int $offset): array
    {
        $str = $this->slice($offset, 1);

        if ('' === $str->string) {
            return [];
        }

        $codePoints = [];

        foreach (preg_split('//u', $str->string, -1, \PREG_SPLIT_NO_EMPTY) as $c) {
            $codePoints[] = mb_ord($c, 'UTF-8');
        }

        return $codePoints;
    }

    public function folded(bool $compat = true): parent
    {
        $str = clone $this;

        if (!$compat || \PHP_VERSION_ID < 70300 || !\defined('Normalizer::NFKC_CF')) {
            $str->string = normalizer_normalize($str->string, $compat ? \Normalizer::NFKC : \Normalizer::NFC);
            $str->string = mb_strtolower(str_replace(self::FOLD_FROM, self::FOLD_TO, $this->string), 'UTF-8');
        } else {
            $str->string = normalizer_normalize($str->string, \Normalizer::NFKC_CF);
        }

        return $str;
    }

    public function join(array $strings, string $lastGlue = null): parent
    {
        $str = clone $this;

        $tail = null !== $lastGlue && 1 < \count($strings) ? $lastGlue.array_pop($strings) : '';
        $str->string = implode($this->string, $strings).$tail;

        if (!preg_match('//u', $str->string)) {
            throw new InvalidArgumentException('Invalid UTF-8 string.');
        }

        return $str;
    }

    public function lower(): parent
    {
        $str = clone $this;
        $str->string = mb_strtolower(str_replace('İ', 'i̇', $str->string), 'UTF-8');

        return $str;
    }

    public function match(string $regexp, int $flags = 0, int $offset = 0): array
    {
        $match = ((\PREG_PATTERN_ORDER | \PREG_SET_ORDER) & $flags) ? 'preg_match_all' : 'preg_match';

        if ($this->ignoreCase) {
            $regexp .= 'i';
        }

        set_error_handler(static function ($t, $m) { throw new InvalidArgumentException($m); });

        try {
            if (false === $match($regexp.'u', $this->string, $matches, $flags | \PREG_UNMATCHED_AS_NULL, $offset)) {
                $lastError = preg_last_error();

                foreach (get_defined_constants(true)['pcre'] as $k => $v) {
                    if ($lastError === $v && '_ERROR' === substr($k, -6)) {
                        throw new RuntimeException('Matching failed with '.$k.'.');
                    }
                }

                throw new RuntimeException('Matching failed with unknown error code.');
            }
        } finally {
            restore_error_handler();
        }

        return $matches;
    }

    /**
     * @return static
     */
    public function normalize(int $form = self::NFC): self
    {
        if (!\in_array($form, [self::NFC, self::NFD, self::NFKC, self::NFKD])) {
            throw new InvalidArgumentException('Unsupported normalization form.');
        }

        $str = clone $this;
        normalizer_is_normalized($str->string, $form) ?: $str->string = normalizer_normalize($str->string, $form);

        return $str;
    }

    public function padBoth(int $length, string $padStr = ' '): parent
    {
        if ('' === $padStr || !preg_match('//u', $padStr)) {
            throw new InvalidArgumentException('Invalid UTF-8 string.');
        }

        $pad = clone $this;
        $pad->string = $padStr;

        return $this->pad($length, $pad, \STR_PAD_BOTH);
    }

    public function padEnd(int $length, string $padStr = ' '): parent
    {
        if ('' === $padStr || !preg_match('//u', $padStr)) {
            throw new InvalidArgumentException('Invalid UTF-8 string.');
        }

        $pad = clone $this;
        $pad->string = $padStr;

        return $this->pad($length, $pad, \STR_PAD_RIGHT);
    }

    public function padStart(int $length, string $padStr = ' '): parent
    {
        if ('' === $padStr || !preg_match('//u', $padStr)) {
            throw new InvalidArgumentException('Invalid UTF-8 string.');
        }

        $pad = clone $this;
        $pad->string = $padStr;

        return $this->pad($length, $pad, \STR_PAD_LEFT);
    }

    public function replaceMatches(string $fromRegexp, $to): parent
    {
        if ($this->ignoreCase) {
            $fromRegexp .= 'i';
        }

        if (\is_array($to) || $to instanceof \Closure) {
            if (!\is_callable($to)) {
                throw new \TypeError(sprintf('Argument 2 passed to "%s::replaceMatches()" must be callable, array given.', static::class));
            }

            $replace = 'preg_replace_callback';
            $to = static function (array $m) use ($to): string {
                $to = $to($m);

                if ('' !== $to && (!\is_string($to) || !preg_match('//u', $to))) {
                    throw new InvalidArgumentException('Replace callback must return a valid UTF-8 string.');
                }

                return $to;
            };
        } elseif ('' !== $to && !preg_match('//u', $to)) {
            throw new InvalidArgumentException('Invalid UTF-8 string.');
        } else {
            $replace = 'preg_replace';
        }

        set_error_handler(static function ($t, $m) { throw new InvalidArgumentException($m); });

        try {
            if (null === $string = $replace($fromRegexp.'u', $to, $this->string)) {
                $lastError = preg_last_error();

                foreach (get_defined_constants(true)['pcre'] as $k => $v) {
                    if ($lastError === $v && '_ERROR' === substr($k, -6)) {
                        throw new RuntimeException('Matching failed with '.$k.'.');
                    }
                }

                throw new RuntimeException('Matching failed with unknown error code.');
            }
        } finally {
            restore_error_handler();
        }

        $str = clone $this;
        $str->string = $string;

        return $str;
    }

    public function reverse(): parent
    {
        $str = clone $this;
        $str->string = implode('', array_reverse(preg_split('/(\X)/u', $str->string, -1, \PREG_SPLIT_DELIM_CAPTURE | \PREG_SPLIT_NO_EMPTY)));

        return $str;
    }

    public function snake(): parent
    {
        $str = $this->camel();
        $str->string = mb_strtolower(preg_replace(['/(\p{Lu}+)(\p{Lu}\p{Ll})/u', '/([\p{Ll}0-9])(\p{Lu})/u'], '\1_\2', $str->string), 'UTF-8');

        return $str;
    }

    public function title(bool $allWords = false): parent
    {
        $str = clone $this;

        $limit = $allWords ? -1 : 1;

        $str->string = preg_replace_callback('/\b./u', static function (array $m): string {
            return mb_convert_case($m[0], \MB_CASE_TITLE, 'UTF-8');
        }, $str->string, $limit);

        return $str;
    }

    public function trim(string $chars = " \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}"): parent
    {
        if (" \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}" !== $chars && !preg_match('//u', $chars)) {
            throw new InvalidArgumentException('Invalid UTF-8 chars.');
        }
        $chars = preg_quote($chars);

        $str = clone $this;
        $str->string = preg_replace("{^[$chars]++|[$chars]++$}uD", '', $str->string);

        return $str;
    }

    public function trimEnd(string $chars = " \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}"): parent
    {
        if (" \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}" !== $chars && !preg_match('//u', $chars)) {
            throw new InvalidArgumentException('Invalid UTF-8 chars.');
        }
        $chars = preg_quote($chars);

        $str = clone $this;
        $str->string = preg_replace("{[$chars]++$}uD", '', $str->string);

        return $str;
    }

    public function trimPrefix($prefix): parent
    {
        if (!$this->ignoreCase) {
            return parent::trimPrefix($prefix);
        }

        $str = clone $this;

        if ($prefix instanceof \Traversable) {
            $prefix = iterator_to_array($prefix, false);
        } elseif ($prefix instanceof parent) {
            $prefix = $prefix->string;
        }

        $prefix = implode('|', array_map('preg_quote', (array) $prefix));
        $str->string = preg_replace("{^(?:$prefix)}iuD", '', $this->string);

        return $str;
    }

    public function trimStart(string $chars = " \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}"): parent
    {
        if (" \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}" !== $chars && !preg_match('//u', $chars)) {
            throw new InvalidArgumentException('Invalid UTF-8 chars.');
        }
        $chars = preg_quote($chars);

        $str = clone $this;
        $str->string = preg_replace("{^[$chars]++}uD", '', $str->string);

        return $str;
    }

    public function trimSuffix($suffix): parent
    {
        if (!$this->ignoreCase) {
            return parent::trimSuffix($suffix);
        }

        $str = clone $this;

        if ($suffix instanceof \Traversable) {
            $suffix = iterator_to_array($suffix, false);
        } elseif ($suffix instanceof parent) {
            $suffix = $suffix->string;
        }

        $suffix = implode('|', array_map('preg_quote', (array) $suffix));
        $str->string = preg_replace("{(?:$suffix)$}iuD", '', $this->string);

        return $str;
    }

    public function upper(): parent
    {
        $str = clone $this;
        $str->string = mb_strtoupper($str->string, 'UTF-8');

        if (\PHP_VERSION_ID < 70300) {
            $str->string = str_replace(self::UPPER_FROM, self::UPPER_TO, $str->string);
        }

        return $str;
    }

    public function width(bool $ignoreAnsiDecoration = true): int
    {
        $width = 0;
        $s = str_replace(["\x00", "\x05", "\x07"], '', $this->string);

        if (false !== strpos($s, "\r")) {
            $s = str_replace(["\r\n", "\r"], "\n", $s);
        }

        if (!$ignoreAnsiDecoration) {
            $s = preg_replace('/[\p{Cc}\x7F]++/u', '', $s);
        }

        foreach (explode("\n", $s) as $s) {
            if ($ignoreAnsiDecoration) {
                $s = preg_replace('/(?:\x1B(?:
                    \[ [\x30-\x3F]*+ [\x20-\x2F]*+ [\x40-\x7E]
                    | [P\]X^_] .*? \x1B\\\\
                    | [\x41-\x7E]
                )|[\p{Cc}\x7F]++)/xu', '', $s);
            }

            $lineWidth = $this->wcswidth($s);

            if ($lineWidth > $width) {
                $width = $lineWidth;
            }
        }

        return $width;
    }

    /**
     * @return static
     */
    private function pad(int $len, self $pad, int $type): parent
    {
        $sLen = $this->length();

        if ($len <= $sLen) {
            return clone $this;
        }

        $padLen = $pad->length();
        $freeLen = $len - $sLen;
        $len = $freeLen % $padLen;

        switch ($type) {
            case \STR_PAD_RIGHT:
                return $this->append(str_repeat($pad->string, intdiv($freeLen, $padLen)).($len ? $pad->slice(0, $len) : ''));

            case \STR_PAD_LEFT:
                return $this->prepend(str_repeat($pad->string, intdiv($freeLen, $padLen)).($len ? $pad->slice(0, $len) : ''));

            case \STR_PAD_BOTH:
                $freeLen /= 2;

                $rightLen = ceil($freeLen);
                $len = $rightLen % $padLen;
                $str = $this->append(str_repeat($pad->string, intdiv($rightLen, $padLen)).($len ? $pad->slice(0, $len) : ''));

                $leftLen = floor($freeLen);
                $len = $leftLen % $padLen;

                return $str->prepend(str_repeat($pad->string, intdiv($leftLen, $padLen)).($len ? $pad->slice(0, $len) : ''));

            default:
                throw new InvalidArgumentException('Invalid padding type.');
        }
    }

    /**
     * Based on https://github.com/jquast/wcwidth, a Python implementation of https://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c.
     */
    private function wcswidth(string $string): int
    {
        $width = 0;

        foreach (preg_split('//u', $string, -1, \PREG_SPLIT_NO_EMPTY) as $c) {
            $codePoint = mb_ord($c, 'UTF-8');

            if (0 === $codePoint // NULL
                || 0x034F === $codePoint // COMBINING GRAPHEME JOINER
                || (0x200B <= $codePoint && 0x200F >= $codePoint) // ZERO WIDTH SPACE to RIGHT-TO-LEFT MARK
                || 0x2028 === $codePoint // LINE SEPARATOR
                || 0x2029 === $codePoint // PARAGRAPH SEPARATOR
                || (0x202A <= $codePoint && 0x202E >= $codePoint) // LEFT-TO-RIGHT EMBEDDING to RIGHT-TO-LEFT OVERRIDE
                || (0x2060 <= $codePoint && 0x2063 >= $codePoint) // WORD JOINER to INVISIBLE SEPARATOR
            ) {
                continue;
            }

            // Non printable characters
            if (32 > $codePoint // C0 control characters
                || (0x07F <= $codePoint && 0x0A0 > $codePoint) // C1 control characters and DEL
            ) {
                return -1;
            }

            if (null === self::$tableZero) {
                self::$tableZero = require __DIR__.'/Resources/data/wcswidth_table_zero.php';
            }

            if ($codePoint >= self::$tableZero[0][0] && $codePoint <= self::$tableZero[$ubound = \count(self::$tableZero) - 1][1]) {
                $lbound = 0;
                while ($ubound >= $lbound) {
                    $mid = floor(($lbound + $ubound) / 2);

                    if ($codePoint > self::$tableZero[$mid][1]) {
                        $lbound = $mid + 1;
                    } elseif ($codePoint < self::$tableZero[$mid][0]) {
                        $ubound = $mid - 1;
                    } else {
                        continue 2;
                    }
                }
            }

            if (null === self::$tableWide) {
                self::$tableWide = require __DIR__.'/Resources/data/wcswidth_table_wide.php';
            }

            if ($codePoint >= self::$tableWide[0][0] && $codePoint <= self::$tableWide[$ubound = \count(self::$tableWide) - 1][1]) {
                $lbound = 0;
                while ($ubound >= $lbound) {
                    $mid = floor(($lbound + $ubound) / 2);

                    if ($codePoint > self::$tableWide[$mid][1]) {
                        $lbound = $mid + 1;
                    } elseif ($codePoint < self::$tableWide[$mid][0]) {
                        $ubound = $mid - 1;
                    } else {
                        $width += 2;

                        continue 2;
                    }
                }
            }

            ++$width;
        }

        return $width;
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\String;

use Symfony\Component\String\Exception\ExceptionInterface;
use Symfony\Component\String\Exception\InvalidArgumentException;
use Symfony\Component\String\Exception\RuntimeException;

/**
 * Represents a binary-safe string of bytes.
 *
 * @author Nicolas Grekas <p@tchwork.com>
 * @author Hugo Hamon <hugohamon@neuf.fr>
 *
 * @throws ExceptionInterface
 */
class ByteString extends AbstractString
{
    private const ALPHABET_ALPHANUMERIC = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';

    public function __construct(string $string = '')
    {
        $this->string = $string;
    }

    /*
     * The following method was derived from code of the Hack Standard Library (v4.40 - 2020-05-03)
     *
     * https://github.com/hhvm/hsl/blob/80a42c02f036f72a42f0415e80d6b847f4bf62d5/src/random/private.php#L16
     *
     * Code subject to the MIT license (https://github.com/hhvm/hsl/blob/master/LICENSE).
     *
     * Copyright (c) 2004-2020, Facebook, Inc. (https://www.facebook.com/)
     */

    public static function fromRandom(int $length = 16, string $alphabet = null): self
    {
        if ($length <= 0) {
            throw new InvalidArgumentException(sprintf('A strictly positive length is expected, "%d" given.', $length));
        }

        $alphabet = $alphabet ?? self::ALPHABET_ALPHANUMERIC;
        $alphabetSize = \strlen($alphabet);
        $bits = (int) ceil(log($alphabetSize, 2.0));
        if ($bits <= 0 || $bits > 56) {
            throw new InvalidArgumentException('The length of the alphabet must in the [2^1, 2^56] range.');
        }

        $ret = '';
        while ($length > 0) {
            $urandomLength = (int) ceil(2 * $length * $bits / 8.0);
            $data = random_bytes($urandomLength);
            $unpackedData = 0;
            $unpackedBits = 0;
            for ($i = 0; $i < $urandomLength && $length > 0; ++$i) {
                // Unpack 8 bits
                $unpackedData = ($unpackedData << 8) | \ord($data[$i]);
                $unpackedBits += 8;

                // While we have enough bits to select a character from the alphabet, keep
                // consuming the random data
                for (; $unpackedBits >= $bits && $length > 0; $unpackedBits -= $bits) {
                    $index = ($unpackedData & ((1 << $bits) - 1));
                    $unpackedData >>= $bits;
                    // Unfortunately, the alphabet size is not necessarily a power of two.
                    // Worst case, it is 2^k + 1, which means we need (k+1) bits and we
                    // have around a 50% chance of missing as k gets larger
                    if ($index < $alphabetSize) {
                        $ret .= $alphabet[$index];
                        --$length;
                    }
                }
            }
        }

        return new static($ret);
    }

    public function bytesAt(int $offset): array
    {
        $str = $this->string[$offset] ?? '';

        return '' === $str ? [] : [\ord($str)];
    }

    public function append(string ...$suffix): parent
    {
        $str = clone $this;
        $str->string .= 1 >= \count($suffix) ? ($suffix[0] ?? '') : implode('', $suffix);

        return $str;
    }

    public function camel(): parent
    {
        $str = clone $this;

        $parts = explode(' ', trim(ucwords(preg_replace('/[^a-zA-Z0-9\x7f-\xff]++/', ' ', $this->string))));
        $parts[0] = 1 !== \strlen($parts[0]) && ctype_upper($parts[0]) ? $parts[0] : lcfirst($parts[0]);
        $str->string = implode('', $parts);

        return $str;
    }

    public function chunk(int $length = 1): array
    {
        if (1 > $length) {
            throw new InvalidArgumentException('The chunk length must be greater than zero.');
        }

        if ('' === $this->string) {
            return [];
        }

        $str = clone $this;
        $chunks = [];

        foreach (str_split($this->string, $length) as $chunk) {
            $str->string = $chunk;
            $chunks[] = clone $str;
        }

        return $chunks;
    }

    public function endsWith($suffix): bool
    {
        if ($suffix instanceof parent) {
            $suffix = $suffix->string;
        } elseif (\is_array($suffix) || $suffix instanceof \Traversable) {
            return parent::endsWith($suffix);
        } else {
            $suffix = (string) $suffix;
        }

        return '' !== $suffix && \strlen($this->string) >= \strlen($suffix) && 0 === substr_compare($this->string, $suffix, -\strlen($suffix), null, $this->ignoreCase);
    }

    public function equalsTo($string): bool
    {
        if ($string instanceof parent) {
            $string = $string->string;
        } elseif (\is_array($string) || $string instanceof \Traversable) {
            return parent::equalsTo($string);
        } else {
            $string = (string) $string;
        }

        if ('' !== $string && $this->ignoreCase) {
            return 0 === strcasecmp($string, $this->string);
        }

        return $string === $this->string;
    }

    public function folded(): parent
    {
        $str = clone $this;
        $str->string = strtolower($str->string);

        return $str;
    }

    public function indexOf($needle, int $offset = 0): ?int
    {
        if ($needle instanceof parent) {
            $needle = $needle->string;
        } elseif (\is_array($needle) || $needle instanceof \Traversable) {
            return parent::indexOf($needle, $offset);
        } else {
            $needle = (string) $needle;
        }

        if ('' === $needle) {
            return null;
        }

        $i = $this->ignoreCase ? stripos($this->string, $needle, $offset) : strpos($this->string, $needle, $offset);

        return false === $i ? null : $i;
    }

    public function indexOfLast($needle, int $offset = 0): ?int
    {
        if ($needle instanceof parent) {
            $needle = $needle->string;
        } elseif (\is_array($needle) || $needle instanceof \Traversable) {
            return parent::indexOfLast($needle, $offset);
        } else {
            $needle = (string) $needle;
        }

        if ('' === $needle) {
            return null;
        }

        $i = $this->ignoreCase ? strripos($this->string, $needle, $offset) : strrpos($this->string, $needle, $offset);

        return false === $i ? null : $i;
    }

    public function isUtf8(): bool
    {
        return '' === $this->string || preg_match('//u', $this->string);
    }

    public function join(array $strings, string $lastGlue = null): parent
    {
        $str = clone $this;

        $tail = null !== $lastGlue && 1 < \count($strings) ? $lastGlue.array_pop($strings) : '';
        $str->string = implode($this->string, $strings).$tail;

        return $str;
    }

    public function length(): int
    {
        return \strlen($this->string);
    }

    public function lower(): parent
    {
        $str = clone $this;
        $str->string = strtolower($str->string);

        return $str;
    }

    public function match(string $regexp, int $flags = 0, int $offset = 0): array
    {
        $match = ((\PREG_PATTERN_ORDER | \PREG_SET_ORDER) & $flags) ? 'preg_match_all' : 'preg_match';

        if ($this->ignoreCase) {
            $regexp .= 'i';
        }

        set_error_handler(static function ($t, $m) { throw new InvalidArgumentException($m); });

        try {
            if (false === $match($regexp, $this->string, $matches, $flags | \PREG_UNMATCHED_AS_NULL, $offset)) {
                $lastError = preg_last_error();

                foreach (get_defined_constants(true)['pcre'] as $k => $v) {
                    if ($lastError === $v && '_ERROR' === substr($k, -6)) {
                        throw new RuntimeException('Matching failed with '.$k.'.');
                    }
                }

                throw new RuntimeException('Matching failed with unknown error code.');
            }
        } finally {
            restore_error_handler();
        }

        return $matches;
    }

    public function padBoth(int $length, string $padStr = ' '): parent
    {
        $str = clone $this;
        $str->string = str_pad($this->string, $length, $padStr, \STR_PAD_BOTH);

        return $str;
    }

    public function padEnd(int $length, string $padStr = ' '): parent
    {
        $str = clone $this;
        $str->string = str_pad($this->string, $length, $padStr, \STR_PAD_RIGHT);

        return $str;
    }

    public function padStart(int $length, string $padStr = ' '): parent
    {
        $str = clone $this;
        $str->string = str_pad($this->string, $length, $padStr, \STR_PAD_LEFT);

        return $str;
    }

    public function prepend(string ...$prefix): parent
    {
        $str = clone $this;
        $str->string = (1 >= \count($prefix) ? ($prefix[0] ?? '') : implode('', $prefix)).$str->string;

        return $str;
    }

    public function replace(string $from, string $to): parent
    {
        $str = clone $this;

        if ('' !== $from) {
            $str->string = $this->ignoreCase ? str_ireplace($from, $to, $this->string) : str_replace($from, $to, $this->string);
        }

        return $str;
    }

    public function replaceMatches(string $fromRegexp, $to): parent
    {
        if ($this->ignoreCase) {
            $fromRegexp .= 'i';
        }

        if (\is_array($to)) {
            if (!\is_callable($to)) {
                throw new \TypeError(sprintf('Argument 2 passed to "%s::replaceMatches()" must be callable, array given.', static::class));
            }

            $replace = 'preg_replace_callback';
        } else {
            $replace = $to instanceof \Closure ? 'preg_replace_callback' : 'preg_replace';
        }

        set_error_handler(static function ($t, $m) { throw new InvalidArgumentException($m); });

        try {
            if (null === $string = $replace($fromRegexp, $to, $this->string)) {
                $lastError = preg_last_error();

                foreach (get_defined_constants(true)['pcre'] as $k => $v) {
                    if ($lastError === $v && '_ERROR' === substr($k, -6)) {
                        throw new RuntimeException('Matching failed with '.$k.'.');
                    }
                }

                throw new RuntimeException('Matching failed with unknown error code.');
            }
        } finally {
            restore_error_handler();
        }

        $str = clone $this;
        $str->string = $string;

        return $str;
    }

    public function reverse(): parent
    {
        $str = clone $this;
        $str->string = strrev($str->string);

        return $str;
    }

    public function slice(int $start = 0, int $length = null): parent
    {
        $str = clone $this;
        $str->string = (string) substr($this->string, $start, $length ?? \PHP_INT_MAX);

        return $str;
    }

    public function snake(): parent
    {
        $str = $this->camel();
        $str->string = strtolower(preg_replace(['/([A-Z]+)([A-Z][a-z])/', '/([a-z\d])([A-Z])/'], '\1_\2', $str->string));

        return $str;
    }

    public function splice(string $replacement, int $start = 0, int $length = null): parent
    {
        $str = clone $this;
        $str->string = substr_replace($this->string, $replacement, $start, $length ?? \PHP_INT_MAX);

        return $str;
    }

    public function split(string $delimiter, int $limit = null, int $flags = null): array
    {
        if (1 > $limit = $limit ?? \PHP_INT_MAX) {
            throw new InvalidArgumentException('Split limit must be a positive integer.');
        }

        if ('' === $delimiter) {
            throw new InvalidArgumentException('Split delimiter is empty.');
        }

        if (null !== $flags) {
            return parent::split($delimiter, $limit, $flags);
        }

        $str = clone $this;
        $chunks = $this->ignoreCase
            ? preg_split('{'.preg_quote($delimiter).'}iD', $this->string, $limit)
            : explode($delimiter, $this->string, $limit);

        foreach ($chunks as &$chunk) {
            $str->string = $chunk;
            $chunk = clone $str;
        }

        return $chunks;
    }

    public function startsWith($prefix): bool
    {
        if ($prefix instanceof parent) {
            $prefix = $prefix->string;
        } elseif (!\is_string($prefix)) {
            return parent::startsWith($prefix);
        }

        return '' !== $prefix && 0 === ($this->ignoreCase ? strncasecmp($this->string, $prefix, \strlen($prefix)) : strncmp($this->string, $prefix, \strlen($prefix)));
    }

    public function title(bool $allWords = false): parent
    {
        $str = clone $this;
        $str->string = $allWords ? ucwords($str->string) : ucfirst($str->string);

        return $str;
    }

    public function toUnicodeString(string $fromEncoding = null): UnicodeString
    {
        return new UnicodeString($this->toCodePointString($fromEncoding)->string);
    }

    public function toCodePointString(string $fromEncoding = null): CodePointString
    {
        $u = new CodePointString();

        if (\in_array($fromEncoding, [null, 'utf8', 'utf-8', 'UTF8', 'UTF-8'], true) && preg_match('//u', $this->string)) {
            $u->string = $this->string;

            return $u;
        }

        set_error_handler(static function ($t, $m) { throw new InvalidArgumentException($m); });

        try {
            try {
                $validEncoding = false !== mb_detect_encoding($this->string, $fromEncoding ?? 'Windows-1252', true);
            } catch (InvalidArgumentException $e) {
                if (!\function_exists('iconv')) {
                    throw $e;
                }

                $u->string = iconv($fromEncoding ?? 'Windows-1252', 'UTF-8', $this->string);

                return $u;
            }
        } finally {
            restore_error_handler();
        }

        if (!$validEncoding) {
            throw new InvalidArgumentException(sprintf('Invalid "%s" string.', $fromEncoding ?? 'Windows-1252'));
        }

        $u->string = mb_convert_encoding($this->string, 'UTF-8', $fromEncoding ?? 'Windows-1252');

        return $u;
    }

    public function trim(string $chars = " \t\n\r\0\x0B\x0C"): parent
    {
        $str = clone $this;
        $str->string = trim($str->string, $chars);

        return $str;
    }

    public function trimEnd(string $chars = " \t\n\r\0\x0B\x0C"): parent
    {
        $str = clone $this;
        $str->string = rtrim($str->string, $chars);

        return $str;
    }

    public function trimStart(string $chars = " \t\n\r\0\x0B\x0C"): parent
    {
        $str = clone $this;
        $str->string = ltrim($str->string, $chars);

        return $str;
    }

    public function upper(): parent
    {
        $str = clone $this;
        $str->string = strtoupper($str->string);

        return $str;
    }

    public function width(bool $ignoreAnsiDecoration = true): int
    {
        $string = preg_match('//u', $this->string) ? $this->string : preg_replace('/[\x80-\xFF]/', '?', $this->string);

        return (new CodePointString($string))->width($ignoreAnsiDecoration);
    }
}
CHANGELOG
=========

5.4
---

 * Add `trimSuffix()` and `trimPrefix()` methods

5.3
---

 * Made `AsciiSlugger` fallback to parent locale's symbolsMap

5.2.0
-----

 * added a `FrenchInflector` class

5.1.0
-----

 * added the `AbstractString::reverse()` method
 * made `AbstractString::width()` follow POSIX.1-2001
 * added `LazyString` which provides memoizing stringable objects
 * The component is not marked as `@experimental` anymore
 * added the `s()` helper method to get either an `UnicodeString` or `ByteString` instance,
   depending of the input string UTF-8 compliancy
 * added `$cut` parameter to `Symfony\Component\String\AbstractString::truncate()`
 * added `AbstractString::containsAny()`
 * allow passing a string of custom characters to `ByteString::fromRandom()`

5.0.0
-----

 * added the component as experimental
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\String;

use Symfony\Component\String\Exception\ExceptionInterface;
use Symfony\Component\String\Exception\InvalidArgumentException;

/**
 * Represents a string of Unicode code points encoded as UTF-8.
 *
 * @author Nicolas Grekas <p@tchwork.com>
 * @author Hugo Hamon <hugohamon@neuf.fr>
 *
 * @throws ExceptionInterface
 */
class CodePointString extends AbstractUnicodeString
{
    public function __construct(string $string = '')
    {
        if ('' !== $string && !preg_match('//u', $string)) {
            throw new InvalidArgumentException('Invalid UTF-8 string.');
        }

        $this->string = $string;
    }

    public function append(string ...$suffix): AbstractString
    {
        $str = clone $this;
        $str->string .= 1 >= \count($suffix) ? ($suffix[0] ?? '') : implode('', $suffix);

        if (!preg_match('//u', $str->string)) {
            throw new InvalidArgumentException('Invalid UTF-8 string.');
        }

        return $str;
    }

    public function chunk(int $length = 1): array
    {
        if (1 > $length) {
            throw new InvalidArgumentException('The chunk length must be greater than zero.');
        }

        if ('' === $this->string) {
            return [];
        }

        $rx = '/(';
        while (65535 < $length) {
            $rx .= '.{65535}';
            $length -= 65535;
        }
        $rx .= '.{'.$length.'})/us';

        $str = clone $this;
        $chunks = [];

        foreach (preg_split($rx, $this->string, -1, \PREG_SPLIT_DELIM_CAPTURE | \PREG_SPLIT_NO_EMPTY) as $chunk) {
            $str->string = $chunk;
            $chunks[] = clone $str;
        }

        return $chunks;
    }

    public function codePointsAt(int $offset): array
    {
        $str = $offset ? $this->slice($offset, 1) : $this;

        return '' === $str->string ? [] : [mb_ord($str->string, 'UTF-8')];
    }

    public function endsWith($suffix): bool
    {
        if ($suffix instanceof AbstractString) {
            $suffix = $suffix->string;
        } elseif (\is_array($suffix) || $suffix instanceof \Traversable) {
            return parent::endsWith($suffix);
        } else {
            $suffix = (string) $suffix;
        }

        if ('' === $suffix || !preg_match('//u', $suffix)) {
            return false;
        }

        if ($this->ignoreCase) {
            return preg_match('{'.preg_quote($suffix).'$}iuD', $this->string);
        }

        return \strlen($this->string) >= \strlen($suffix) && 0 === substr_compare($this->string, $suffix, -\strlen($suffix));
    }

    public function equalsTo($string): bool
    {
        if ($string instanceof AbstractString) {
            $string = $string->string;
        } elseif (\is_array($string) || $string instanceof \Traversable) {
            return parent::equalsTo($string);
        } else {
            $string = (string) $string;
        }

        if ('' !== $string && $this->ignoreCase) {
            return \strlen($string) === \strlen($this->string) && 0 === mb_stripos($this->string, $string, 0, 'UTF-8');
        }

        return $string === $this->string;
    }

    public function indexOf($needle, int $offset = 0): ?int
    {
        if ($needle instanceof AbstractString) {
            $needle = $needle->string;
        } elseif (\is_array($needle) || $needle instanceof \Traversable) {
            return parent::indexOf($needle, $offset);
        } else {
            $needle = (string) $needle;
        }

        if ('' === $needle) {
            return null;
        }

        $i = $this->ignoreCase ? mb_stripos($this->string, $needle, $offset, 'UTF-8') : mb_strpos($this->string, $needle, $offset, 'UTF-8');

        return false === $i ? null : $i;
    }

    public function indexOfLast($needle, int $offset = 0): ?int
    {
        if ($needle instanceof AbstractString) {
            $needle = $needle->string;
        } elseif (\is_array($needle) || $needle instanceof \Traversable) {
            return parent::indexOfLast($needle, $offset);
        } else {
            $needle = (string) $needle;
        }

        if ('' === $needle) {
            return null;
        }

        $i = $this->ignoreCase ? mb_strripos($this->string, $needle, $offset, 'UTF-8') : mb_strrpos($this->string, $needle, $offset, 'UTF-8');

        return false === $i ? null : $i;
    }

    public function length(): int
    {
        return mb_strlen($this->string, 'UTF-8');
    }

    public function prepend(string ...$prefix): AbstractString
    {
        $str = clone $this;
        $str->string = (1 >= \count($prefix) ? ($prefix[0] ?? '') : implode('', $prefix)).$this->string;

        if (!preg_match('//u', $str->string)) {
            throw new InvalidArgumentException('Invalid UTF-8 string.');
        }

        return $str;
    }

    public function replace(string $from, string $to): AbstractString
    {
        $str = clone $this;

        if ('' === $from || !preg_match('//u', $from)) {
            return $str;
        }

        if ('' !== $to && !preg_match('//u', $to)) {
            throw new InvalidArgumentException('Invalid UTF-8 string.');
        }

        if ($this->ignoreCase) {
            $str->string = implode($to, preg_split('{'.preg_quote($from).'}iuD', $this->string));
        } else {
            $str->string = str_replace($from, $to, $this->string);
        }

        return $str;
    }

    public function slice(int $start = 0, int $length = null): AbstractString
    {
        $str = clone $this;
        $str->string = mb_substr($this->string, $start, $length, 'UTF-8');

        return $str;
    }

    public function splice(string $replacement, int $start = 0, int $length = null): AbstractString
    {
        if (!preg_match('//u', $replacement)) {
            throw new InvalidArgumentException('Invalid UTF-8 string.');
        }

        $str = clone $this;
        $start = $start ? \strlen(mb_substr($this->string, 0, $start, 'UTF-8')) : 0;
        $length = $length ? \strlen(mb_substr($this->string, $start, $length, 'UTF-8')) : $length;
        $str->string = substr_replace($this->string, $replacement, $start, $length ?? \PHP_INT_MAX);

        return $str;
    }

    public function split(string $delimiter, int $limit = null, int $flags = null): array
    {
        if (1 > $limit = $limit ?? \PHP_INT_MAX) {
            throw new InvalidArgumentException('Split limit must be a positive integer.');
        }

        if ('' === $delimiter) {
            throw new InvalidArgumentException('Split delimiter is empty.');
        }

        if (null !== $flags) {
            return parent::split($delimiter.'u', $limit, $flags);
        }

        if (!preg_match('//u', $delimiter)) {
            throw new InvalidArgumentException('Split delimiter is not a valid UTF-8 string.');
        }

        $str = clone $this;
        $chunks = $this->ignoreCase
            ? preg_split('{'.preg_quote($delimiter).'}iuD', $this->string, $limit)
            : explode($delimiter, $this->string, $limit);

        foreach ($chunks as &$chunk) {
            $str->string = $chunk;
            $chunk = clone $str;
        }

        return $chunks;
    }

    public function startsWith($prefix): bool
    {
        if ($prefix instanceof AbstractString) {
            $prefix = $prefix->string;
        } elseif (\is_array($prefix) || $prefix instanceof \Traversable) {
            return parent::startsWith($prefix);
        } else {
            $prefix = (string) $prefix;
        }

        if ('' === $prefix || !preg_match('//u', $prefix)) {
            return false;
        }

        if ($this->ignoreCase) {
            return 0 === mb_stripos($this->string, $prefix, 0, 'UTF-8');
        }

        return 0 === strncmp($this->string, $prefix, \strlen($prefix));
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\String\Exception;

interface ExceptionInterface extends \Throwable
{
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\String\Exception;

class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface
{
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\String\Exception;

class RuntimeException extends \RuntimeException implements ExceptionInterface
{
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\String\Inflector;

final class EnglishInflector implements InflectorInterface
{
    /**
     * Map English plural to singular suffixes.
     *
     * @see http://english-zone.com/spelling/plurals.html
     */
    private const PLURAL_MAP = [
        // First entry: plural suffix, reversed
        // Second entry: length of plural suffix
        // Third entry: Whether the suffix may succeed a vocal
        // Fourth entry: Whether the suffix may succeed a consonant
        // Fifth entry: singular suffix, normal

        // bacteria (bacterium), criteria (criterion), phenomena (phenomenon)
        ['a', 1, true, true, ['on', 'um']],

        // nebulae (nebula)
        ['ea', 2, true, true, 'a'],

        // services (service)
        ['secivres', 8, true, true, 'service'],

        // mice (mouse), lice (louse)
        ['eci', 3, false, true, 'ouse'],

        // geese (goose)
        ['esee', 4, false, true, 'oose'],

        // fungi (fungus), alumni (alumnus), syllabi (syllabus), radii (radius)
        ['i', 1, true, true, 'us'],

        // men (man), women (woman)
        ['nem', 3, true, true, 'man'],

        // children (child)
        ['nerdlihc', 8, true, true, 'child'],

        // oxen (ox)
        ['nexo', 4, false, false, 'ox'],

        // indices (index), appendices (appendix), prices (price)
        ['seci', 4, false, true, ['ex', 'ix', 'ice']],

        // codes (code)
        ['sedoc', 5, false, true, 'code'],

        // selfies (selfie)
        ['seifles', 7, true, true, 'selfie'],

        // zombies (zombie)
        ['seibmoz', 7, true, true, 'zombie'],

        // movies (movie)
        ['seivom', 6, true, true, 'movie'],

        // names (name)
        ['seman', 5, true, false, 'name'],

        // conspectuses (conspectus), prospectuses (prospectus)
        ['sesutcep', 8, true, true, 'pectus'],

        // feet (foot)
        ['teef', 4, true, true, 'foot'],

        // geese (goose)
        ['eseeg', 5, true, true, 'goose'],

        // teeth (tooth)
        ['hteet', 5, true, true, 'tooth'],

        // news (news)
        ['swen', 4, true, true, 'news'],

        // series (series)
        ['seires', 6, true, true, 'series'],

        // babies (baby)
        ['sei', 3, false, true, 'y'],

        // accesses (access), addresses (address), kisses (kiss)
        ['sess', 4, true, false, 'ss'],

        // statuses (status)
        ['sesutats', 8, true, true, 'status'],

        // analyses (analysis), ellipses (ellipsis), fungi (fungus),
        // neuroses (neurosis), theses (thesis), emphases (emphasis),
        // oases (oasis), crises (crisis), houses (house), bases (base),
        // atlases (atlas)
        ['ses', 3, true, true, ['s', 'se', 'sis']],

        // objectives (objective), alternative (alternatives)
        ['sevit', 5, true, true, 'tive'],

        // drives (drive)
        ['sevird', 6, false, true, 'drive'],

        // lives (life), wives (wife)
        ['sevi', 4, false, true, 'ife'],

        // moves (move)
        ['sevom', 5, true, true, 'move'],

        // hooves (hoof), dwarves (dwarf), elves (elf), leaves (leaf), caves (cave), staves (staff)
        ['sev', 3, true, true, ['f', 've', 'ff']],

        // axes (axis), axes (ax), axes (axe)
        ['sexa', 4, false, false, ['ax', 'axe', 'axis']],

        // indexes (index), matrixes (matrix)
        ['sex', 3, true, false, 'x'],

        // quizzes (quiz)
        ['sezz', 4, true, false, 'z'],

        // bureaus (bureau)
        ['suae', 4, false, true, 'eau'],

        // fees (fee), trees (tree), employees (employee)
        ['see', 3, true, true, 'ee'],

        // edges (edge)
        ['segd', 4, true, true, 'dge'],

        // roses (rose), garages (garage), cassettes (cassette),
        // waltzes (waltz), heroes (hero), bushes (bush), arches (arch),
        // shoes (shoe)
        ['se', 2, true, true, ['', 'e']],

         // status (status)
        ['sutats', 6, true, true, 'status'],

        // tags (tag)
        ['s', 1, true, true, ''],

        // chateaux (chateau)
        ['xuae', 4, false, true, 'eau'],

        // people (person)
        ['elpoep', 6, true, true, 'person'],
    ];

    /**
     * Map English singular to plural suffixes.
     *
     * @see http://english-zone.com/spelling/plurals.html
     */
    private const SINGULAR_MAP = [
        // First entry: singular suffix, reversed
        // Second entry: length of singular suffix
        // Third entry: Whether the suffix may succeed a vocal
        // Fourth entry: Whether the suffix may succeed a consonant
        // Fifth entry: plural suffix, normal

        // criterion (criteria)
        ['airetirc', 8, false, false, 'criterion'],

        // nebulae (nebula)
        ['aluben', 6, false, false, 'nebulae'],

        // children (child)
        ['dlihc', 5, true, true, 'children'],

        // prices (price)
        ['eci', 3, false, true, 'ices'],

        // services (service)
        ['ecivres', 7, true, true, 'services'],

        // lives (life), wives (wife)
        ['efi', 3, false, true, 'ives'],

        // selfies (selfie)
        ['eifles', 6, true, true, 'selfies'],

        // movies (movie)
        ['eivom', 5, true, true, 'movies'],

        // lice (louse)
        ['esuol', 5, false, true, 'lice'],

        // mice (mouse)
        ['esuom', 5, false, true, 'mice'],

        // geese (goose)
        ['esoo', 4, false, true, 'eese'],

        // houses (house), bases (base)
        ['es', 2, true, true, 'ses'],

        // geese (goose)
        ['esoog', 5, true, true, 'geese'],

        // caves (cave)
        ['ev', 2, true, true, 'ves'],

        // drives (drive)
        ['evird', 5, false, true, 'drives'],

        // objectives (objective), alternative (alternatives)
        ['evit', 4, true, true, 'tives'],

        // moves (move)
        ['evom', 4, true, true, 'moves'],

        // staves (staff)
        ['ffats', 5, true, true, 'staves'],

        // hooves (hoof), dwarves (dwarf), elves (elf), leaves (leaf)
        ['ff', 2, true, true, 'ffs'],

        // hooves (hoof), dwarves (dwarf), elves (elf), leaves (leaf)
        ['f', 1, true, true, ['fs', 'ves']],

        // arches (arch)
        ['hc', 2, true, true, 'ches'],

        // bushes (bush)
        ['hs', 2, true, true, 'shes'],

        // teeth (tooth)
        ['htoot', 5, true, true, 'teeth'],

        // bacteria (bacterium), criteria (criterion), phenomena (phenomenon)
        ['mu', 2, true, true, 'a'],

        // men (man), women (woman)
        ['nam', 3, true, true, 'men'],

        // people (person)
        ['nosrep', 6, true, true, ['persons', 'people']],

        // bacteria (bacterium), criteria (criterion), phenomena (phenomenon)
        ['noi', 3, true, true, 'ions'],

        // coupon (coupons)
        ['nop', 3, true, true, 'pons'],

        // seasons (season), treasons (treason), poisons (poison), lessons (lesson)
        ['nos', 3, true, true, 'sons'],

        // bacteria (bacterium), criteria (criterion), phenomena (phenomenon)
        ['no', 2, true, true, 'a'],

        // echoes (echo)
        ['ohce', 4, true, true, 'echoes'],

        // heroes (hero)
        ['oreh', 4, true, true, 'heroes'],

        // atlases (atlas)
        ['salta', 5, true, true, 'atlases'],

        // irises (iris)
        ['siri', 4, true, true, 'irises'],

        // analyses (analysis), ellipses (ellipsis), neuroses (neurosis)
        // theses (thesis), emphases (emphasis), oases (oasis),
        // crises (crisis)
        ['sis', 3, true, true, 'ses'],

        // accesses (access), addresses (address), kisses (kiss)
        ['ss', 2, true, false, 'sses'],

        // syllabi (syllabus)
        ['suballys', 8, true, true, 'syllabi'],

        // buses (bus)
        ['sub', 3, true, true, 'buses'],

        // circuses (circus)
        ['suc', 3, true, true, 'cuses'],

        // status (status)
        ['sutats', 6, true, true, ['status', 'statuses']],

        // conspectuses (conspectus), prospectuses (prospectus)
        ['sutcep', 6, true, true, 'pectuses'],

        // fungi (fungus), alumni (alumnus), syllabi (syllabus), radii (radius)
        ['su', 2, true, true, 'i'],

        // news (news)
        ['swen', 4, true, true, 'news'],

        // feet (foot)
        ['toof', 4, true, true, 'feet'],

        // chateaux (chateau), bureaus (bureau)
        ['uae', 3, false, true, ['eaus', 'eaux']],

        // oxen (ox)
        ['xo', 2, false, false, 'oxen'],

        // hoaxes (hoax)
        ['xaoh', 4, true, false, 'hoaxes'],

        // indices (index)
        ['xedni', 5, false, true, ['indicies', 'indexes']],

        // boxes (box)
        ['xo', 2, false, true, 'oxes'],

        // indexes (index), matrixes (matrix)
        ['x', 1, true, false, ['cies', 'xes']],

        // appendices (appendix)
        ['xi', 2, false, true, 'ices'],

        // babies (baby)
        ['y', 1, false, true, 'ies'],

        // quizzes (quiz)
        ['ziuq', 4, true, false, 'quizzes'],

        // waltzes (waltz)
        ['z', 1, true, true, 'zes'],
    ];

    /**
     * A list of words which should not be inflected, reversed.
     */
    private const UNINFLECTED = [
        '',

        // data
        'atad',

        // deer
        'reed',

        // feedback
        'kcabdeef',

        // fish
        'hsif',

        // info
        'ofni',

        // moose
        'esoom',

        // series
        'seires',

        // sheep
        'peehs',

        // species
        'seiceps',
    ];

    /**
     * {@inheritdoc}
     */
    public function singularize(string $plural): array
    {
        $pluralRev = strrev($plural);
        $lowerPluralRev = strtolower($pluralRev);
        $pluralLength = \strlen($lowerPluralRev);

        // Check if the word is one which is not inflected, return early if so
        if (\in_array($lowerPluralRev, self::UNINFLECTED, true)) {
            return [$plural];
        }

        // The outer loop iterates over the entries of the plural table
        // The inner loop $j iterates over the characters of the plural suffix
        // in the plural table to compare them with the characters of the actual
        // given plural suffix
        foreach (self::PLURAL_MAP as $map) {
            $suffix = $map[0];
            $suffixLength = $map[1];
            $j = 0;

            // Compare characters in the plural table and of the suffix of the
            // given plural one by one
            while ($suffix[$j] === $lowerPluralRev[$j]) {
                // Let $j point to the next character
                ++$j;

                // Successfully compared the last character
                // Add an entry with the singular suffix to the singular array
                if ($j === $suffixLength) {
                    // Is there any character preceding the suffix in the plural string?
                    if ($j < $pluralLength) {
                        $nextIsVocal = false !== strpos('aeiou', $lowerPluralRev[$j]);

                        if (!$map[2] && $nextIsVocal) {
                            // suffix may not succeed a vocal but next char is one
                            break;
                        }

                        if (!$map[3] && !$nextIsVocal) {
                            // suffix may not succeed a consonant but next char is one
                            break;
                        }
                    }

                    $newBase = substr($plural, 0, $pluralLength - $suffixLength);
                    $newSuffix = $map[4];

                    // Check whether the first character in the plural suffix
                    // is uppercased. If yes, uppercase the first character in
                    // the singular suffix too
                    $firstUpper = ctype_upper($pluralRev[$j - 1]);

                    if (\is_array($newSuffix)) {
                        $singulars = [];

                        foreach ($newSuffix as $newSuffixEntry) {
                            $singulars[] = $newBase.($firstUpper ? ucfirst($newSuffixEntry) : $newSuffixEntry);
                        }

                        return $singulars;
                    }

                    return [$newBase.($firstUpper ? ucfirst($newSuffix) : $newSuffix)];
                }

                // Suffix is longer than word
                if ($j === $pluralLength) {
                    break;
                }
            }
        }

        // Assume that plural and singular is identical
        return [$plural];
    }

    /**
     * {@inheritdoc}
     */
    public function pluralize(string $singular): array
    {
        $singularRev = strrev($singular);
        $lowerSingularRev = strtolower($singularRev);
        $singularLength = \strlen($lowerSingularRev);

        // Check if the word is one which is not inflected, return early if so
        if (\in_array($lowerSingularRev, self::UNINFLECTED, true)) {
            return [$singular];
        }

        // The outer loop iterates over the entries of the singular table
        // The inner loop $j iterates over the characters of the singular suffix
        // in the singular table to compare them with the characters of the actual
        // given singular suffix
        foreach (self::SINGULAR_MAP as $map) {
            $suffix = $map[0];
            $suffixLength = $map[1];
            $j = 0;

            // Compare characters in the singular table and of the suffix of the
            // given plural one by one

            while ($suffix[$j] === $lowerSingularRev[$j]) {
                // Let $j point to the next character
                ++$j;

                // Successfully compared the last character
                // Add an entry with the plural suffix to the plural array
                if ($j === $suffixLength) {
                    // Is there any character preceding the suffix in the plural string?
                    if ($j < $singularLength) {
                        $nextIsVocal = false !== strpos('aeiou', $lowerSingularRev[$j]);

                        if (!$map[2] && $nextIsVocal) {
                            // suffix may not succeed a vocal but next char is one
                            break;
                        }

                        if (!$map[3] && !$nextIsVocal) {
                            // suffix may not succeed a consonant but next char is one
                            break;
                        }
                    }

                    $newBase = substr($singular, 0, $singularLength - $suffixLength);
                    $newSuffix = $map[4];

                    // Check whether the first character in the singular suffix
                    // is uppercased. If yes, uppercase the first character in
                    // the singular suffix too
                    $firstUpper = ctype_upper($singularRev[$j - 1]);

                    if (\is_array($newSuffix)) {
                        $plurals = [];

                        foreach ($newSuffix as $newSuffixEntry) {
                            $plurals[] = $newBase.($firstUpper ? ucfirst($newSuffixEntry) : $newSuffixEntry);
                        }

                        return $plurals;
                    }

                    return [$newBase.($firstUpper ? ucfirst($newSuffix) : $newSuffix)];
                }

                // Suffix is longer than word
                if ($j === $singularLength) {
                    break;
                }
            }
        }

        // Assume that plural is singular with a trailing `s`
        return [$singular.'s'];
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\String\Inflector;

/**
 * French inflector.
 *
 * This class does only inflect nouns; not adjectives nor composed words like "soixante-dix".
 */
final class FrenchInflector implements InflectorInterface
{
    /**
     * A list of all rules for pluralise.
     *
     * @see https://la-conjugaison.nouvelobs.com/regles/grammaire/le-pluriel-des-noms-121.php
     */
    private const PLURALIZE_REGEXP = [
        // First entry: regexp
        // Second entry: replacement

        // Words finishing with "s", "x" or "z" are invariables
        // Les mots finissant par "s", "x" ou "z" sont invariables
        ['/(s|x|z)$/i', '\1'],

        // Words finishing with "eau" are pluralized with a "x"
        // Les mots finissant par "eau" prennent tous un "x" au pluriel
        ['/(eau)$/i', '\1x'],

        // Words finishing with "au" are pluralized with a "x" excepted "landau"
        // Les mots finissant par "au" prennent un "x" au pluriel sauf "landau"
        ['/^(landau)$/i', '\1s'],
        ['/(au)$/i', '\1x'],

        // Words finishing with "eu" are pluralized with a "x" excepted "pneu", "bleu", "émeu"
        // Les mots finissant en "eu" prennent un "x" au pluriel sauf "pneu", "bleu", "émeu"
        ['/^(pneu|bleu|émeu)$/i', '\1s'],
        ['/(eu)$/i', '\1x'],

        // Words finishing with "al" are pluralized with a "aux" excepted
        // Les mots finissant en "al" se terminent en "aux" sauf
        ['/^(bal|carnaval|caracal|chacal|choral|corral|étal|festival|récital|val)$/i', '\1s'],
        ['/al$/i', '\1aux'],

        // Aspirail, bail, corail, émail, fermail, soupirail, travail, vantail et vitrail font leur pluriel en -aux
        ['/^(aspir|b|cor|ém|ferm|soupir|trav|vant|vitr)ail$/i', '\1aux'],

        // Bijou, caillou, chou, genou, hibou, joujou et pou qui prennent un x au pluriel
        ['/^(bij|caill|ch|gen|hib|jouj|p)ou$/i', '\1oux'],

        // Invariable words
        ['/^(cinquante|soixante|mille)$/i', '\1'],

        // French titles
        ['/^(mon|ma)(sieur|dame|demoiselle|seigneur)$/', 'mes\2s'],
        ['/^(Mon|Ma)(sieur|dame|demoiselle|seigneur)$/', 'Mes\2s'],
    ];

    /**
     * A list of all rules for singularize.
     */
    private const SINGULARIZE_REGEXP = [
        // First entry: regexp
        // Second entry: replacement

        // Aspirail, bail, corail, émail, fermail, soupirail, travail, vantail et vitrail font leur pluriel en -aux
        ['/((aspir|b|cor|ém|ferm|soupir|trav|vant|vitr))aux$/i', '\1ail'],

        // Words finishing with "eau" are pluralized with a "x"
        // Les mots finissant par "eau" prennent tous un "x" au pluriel
        ['/(eau)x$/i', '\1'],

        // Words finishing with "al" are pluralized with a "aux" expected
        // Les mots finissant en "al" se terminent en "aux" sauf
        ['/(amir|anim|arsen|boc|can|capit|capor|chev|crist|génér|hopit|hôpit|idé|journ|littor|loc|m|mét|minér|princip|radic|termin)aux$/i', '\1al'],

        // Words finishing with "au" are pluralized with a "x" excepted "landau"
        // Les mots finissant par "au" prennent un "x" au pluriel sauf "landau"
        ['/(au)x$/i', '\1'],

        // Words finishing with "eu" are pluralized with a "x" excepted "pneu", "bleu", "émeu"
        // Les mots finissant en "eu" prennent un "x" au pluriel sauf "pneu", "bleu", "émeu"
        ['/(eu)x$/i', '\1'],

        //  Words finishing with "ou" are pluralized with a "s" excepted bijou, caillou, chou, genou, hibou, joujou, pou
        // Les mots finissant par "ou" prennent un "s" sauf bijou, caillou, chou, genou, hibou, joujou, pou
        ['/(bij|caill|ch|gen|hib|jouj|p)oux$/i', '\1ou'],

        // French titles
        ['/^mes(dame|demoiselle)s$/', 'ma\1'],
        ['/^Mes(dame|demoiselle)s$/', 'Ma\1'],
        ['/^mes(sieur|seigneur)s$/', 'mon\1'],
        ['/^Mes(sieur|seigneur)s$/', 'Mon\1'],

        // Default rule
        ['/s$/i', ''],
    ];

    /**
     * A list of words which should not be inflected.
     * This list is only used by singularize.
     */
    private const UNINFLECTED = '/^(abcès|accès|abus|albatros|anchois|anglais|autobus|bois|brebis|carquois|cas|chas|colis|concours|corps|cours|cyprès|décès|devis|discours|dos|embarras|engrais|entrelacs|excès|fils|fois|gâchis|gars|glas|héros|intrus|jars|jus|kermès|lacis|legs|lilas|marais|mars|matelas|mépris|mets|mois|mors|obus|os|palais|paradis|parcours|pardessus|pays|plusieurs|poids|pois|pouls|printemps|processus|progrès|puits|pus|rabais|radis|recors|recours|refus|relais|remords|remous|rictus|rhinocéros|repas|rubis|sans|sas|secours|sens|souris|succès|talus|tapis|tas|taudis|temps|tiers|univers|velours|verglas|vernis|virus)$/i';

    /**
     * {@inheritdoc}
     */
    public function singularize(string $plural): array
    {
        if ($this->isInflectedWord($plural)) {
            return [$plural];
        }

        foreach (self::SINGULARIZE_REGEXP as $rule) {
            [$regexp, $replace] = $rule;

            if (1 === preg_match($regexp, $plural)) {
                return [preg_replace($regexp, $replace, $plural)];
            }
        }

        return [$plural];
    }

    /**
     * {@inheritdoc}
     */
    public function pluralize(string $singular): array
    {
        if ($this->isInflectedWord($singular)) {
            return [$singular];
        }

        foreach (self::PLURALIZE_REGEXP as $rule) {
            [$regexp, $replace] = $rule;

            if (1 === preg_match($regexp, $singular)) {
                return [preg_replace($regexp, $replace, $singular)];
            }
        }

        return [$singular.'s'];
    }

    private function isInflectedWord(string $word): bool
    {
        return 1 === preg_match(self::UNINFLECTED, $word);
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\String\Inflector;

interface InflectorInterface
{
    /**
     * Returns the singular forms of a string.
     *
     * If the method can't determine the form with certainty, several possible singulars are returned.
     *
     * @return string[]
     */
    public function singularize(string $plural): array;

    /**
     * Returns the plural forms of a string.
     *
     * If the method can't determine the form with certainty, several possible plurals are returned.
     *
     * @return string[]
     */
    public function pluralize(string $singular): array;
}
Copyright (c) 2019-present Fabien Potencier

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

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\String;

/**
 * A string whose value is computed lazily by a callback.
 *
 * @author Nicolas Grekas <p@tchwork.com>
 */
class LazyString implements \Stringable, \JsonSerializable
{
    private $value;

    /**
     * @param callable|array $callback A callable or a [Closure, method] lazy-callable
     *
     * @return static
     */
    public static function fromCallable($callback, ...$arguments): self
    {
        if (!\is_callable($callback) && !(\is_array($callback) && isset($callback[0]) && $callback[0] instanceof \Closure && 2 >= \count($callback))) {
            throw new \TypeError(sprintf('Argument 1 passed to "%s()" must be a callable or a [Closure, method] lazy-callable, "%s" given.', __METHOD__, get_debug_type($callback)));
        }

        $lazyString = new static();
        $lazyString->value = static function () use (&$callback, &$arguments, &$value): string {
            if (null !== $arguments) {
                if (!\is_callable($callback)) {
                    $callback[0] = $callback[0]();
                    $callback[1] = $callback[1] ?? '__invoke';
                }
                $value = $callback(...$arguments);
                $callback = self::getPrettyName($callback);
                $arguments = null;
            }

            return $value ?? '';
        };

        return $lazyString;
    }

    /**
     * @param string|int|float|bool|\Stringable $value
     *
     * @return static
     */
    public static function fromStringable($value): self
    {
        if (!self::isStringable($value)) {
            throw new \TypeError(sprintf('Argument 1 passed to "%s()" must be a scalar or a stringable object, "%s" given.', __METHOD__, get_debug_type($value)));
        }

        if (\is_object($value)) {
            return static::fromCallable([$value, '__toString']);
        }

        $lazyString = new static();
        $lazyString->value = (string) $value;

        return $lazyString;
    }

    /**
     * Tells whether the provided value can be cast to string.
     */
    final public static function isStringable($value): bool
    {
        return \is_string($value) || $value instanceof self || (\is_object($value) ? method_exists($value, '__toString') : \is_scalar($value));
    }

    /**
     * Casts scalars and stringable objects to strings.
     *
     * @param object|string|int|float|bool $value
     *
     * @throws \TypeError When the provided value is not stringable
     */
    final public static function resolve($value): string
    {
        return $value;
    }

    /**
     * @return string
     */
    public function __toString()
    {
        if (\is_string($this->value)) {
            return $this->value;
        }

        try {
            return $this->value = ($this->value)();
        } catch (\Throwable $e) {
            if (\TypeError::class === \get_class($e) && __FILE__ === $e->getFile()) {
                $type = explode(', ', $e->getMessage());
                $type = substr(array_pop($type), 0, -\strlen(' returned'));
                $r = new \ReflectionFunction($this->value);
                $callback = $r->getStaticVariables()['callback'];

                $e = new \TypeError(sprintf('Return value of %s() passed to %s::fromCallable() must be of the type string, %s returned.', $callback, static::class, $type));
            }

            if (\PHP_VERSION_ID < 70400) {
                // leverage the ErrorHandler component with graceful fallback when it's not available
                return trigger_error($e, \E_USER_ERROR);
            }

            throw $e;
        }
    }

    public function __sleep(): array
    {
        $this->__toString();

        return ['value'];
    }

    public function jsonSerialize(): string
    {
        return $this->__toString();
    }

    private function __construct()
    {
    }

    private static function getPrettyName(callable $callback): string
    {
        if (\is_string($callback)) {
            return $callback;
        }

        if (\is_array($callback)) {
            $class = \is_object($callback[0]) ? get_debug_type($callback[0]) : $callback[0];
            $method = $callback[1];
        } elseif ($callback instanceof \Closure) {
            $r = new \ReflectionFunction($callback);

            if (false !== strpos($r->name, '{closure}') || !$class = \PHP_VERSION_ID >= 80111 ? $r->getClosureCalledClass() : $r->getClosureScopeClass()) {
                return $r->name;
            }

            $class = $class->name;
            $method = $r->name;
        } else {
            $class = get_debug_type($callback);
            $method = '__invoke';
        }

        return $class.'::'.$method;
    }
}
String Component
================

The String component provides an object-oriented API to strings and deals
with bytes, UTF-8 code points and grapheme clusters in a unified way.

Resources
---------

 * [Documentation](https://symfony.com/doc/current/components/string.html)
 * [Contributing](https://symfony.com/doc/current/contributing/index.html)
 * [Report issues](https://github.com/symfony/symfony/issues) and
   [send Pull Requests](https://github.com/symfony/symfony/pulls)
   in the [main Symfony repository](https://github.com/symfony/symfony)
<?php

/*
 * This file has been auto-generated by the Symfony String Component for internal use.
 *
 * Unicode version: 15.1.0
 * Date: 2023-09-13T11:47:12+00:00
 */

return [
    [
        4352,
        4447,
    ],
    [
        8986,
        8987,
    ],
    [
        9001,
        9001,
    ],
    [
        9002,
        9002,
    ],
    [
        9193,
        9196,
    ],
    [
        9200,
        9200,
    ],
    [
        9203,
        9203,
    ],
    [
        9725,
        9726,
    ],
    [
        9748,
        9749,
    ],
    [
        9800,
        9811,
    ],
    [
        9855,
        9855,
    ],
    [
        9875,
        9875,
    ],
    [
        9889,
        9889,
    ],
    [
        9898,
        9899,
    ],
    [
        9917,
        9918,
    ],
    [
        9924,
        9925,
    ],
    [
        9934,
        9934,
    ],
    [
        9940,
        9940,
    ],
    [
        9962,
        9962,
    ],
    [
        9970,
        9971,
    ],
    [
        9973,
        9973,
    ],
    [
        9978,
        9978,
    ],
    [
        9981,
        9981,
    ],
    [
        9989,
        9989,
    ],
    [
        9994,
        9995,
    ],
    [
        10024,
        10024,
    ],
    [
        10060,
        10060,
    ],
    [
        10062,
        10062,
    ],
    [
        10067,
        10069,
    ],
    [
        10071,
        10071,
    ],
    [
        10133,
        10135,
    ],
    [
        10160,
        10160,
    ],
    [
        10175,
        10175,
    ],
    [
        11035,
        11036,
    ],
    [
        11088,
        11088,
    ],
    [
        11093,
        11093,
    ],
    [
        11904,
        11929,
    ],
    [
        11931,
        12019,
    ],
    [
        12032,
        12245,
    ],
    [
        12272,
        12287,
    ],
    [
        12288,
        12288,
    ],
    [
        12289,
        12291,
    ],
    [
        12292,
        12292,
    ],
    [
        12293,
        12293,
    ],
    [
        12294,
        12294,
    ],
    [
        12295,
        12295,
    ],
    [
        12296,
        12296,
    ],
    [
        12297,
        12297,
    ],
    [
        12298,
        12298,
    ],
    [
        12299,
        12299,
    ],
    [
        12300,
        12300,
    ],
    [
        12301,
        12301,
    ],
    [
        12302,
        12302,
    ],
    [
        12303,
        12303,
    ],
    [
        12304,
        12304,
    ],
    [
        12305,
        12305,
    ],
    [
        12306,
        12307,
    ],
    [
        12308,
        12308,
    ],
    [
        12309,
        12309,
    ],
    [
        12310,
        12310,
    ],
    [
        12311,
        12311,
    ],
    [
        12312,
        12312,
    ],
    [
        12313,
        12313,
    ],
    [
        12314,
        12314,
    ],
    [
        12315,
        12315,
    ],
    [
        12316,
        12316,
    ],
    [
        12317,
        12317,
    ],
    [
        12318,
        12319,
    ],
    [
        12320,
        12320,
    ],
    [
        12321,
        12329,
    ],
    [
        12330,
        12333,
    ],
    [
        12334,
        12335,
    ],
    [
        12336,
        12336,
    ],
    [
        12337,
        12341,
    ],
    [
        12342,
        12343,
    ],
    [
        12344,
        12346,
    ],
    [
        12347,
        12347,
    ],
    [
        12348,
        12348,
    ],
    [
        12349,
        12349,
    ],
    [
        12350,
        12350,
    ],
    [
        12353,
        12438,
    ],
    [
        12441,
        12442,
    ],
    [
        12443,
        12444,
    ],
    [
        12445,
        12446,
    ],
    [
        12447,
        12447,
    ],
    [
        12448,
        12448,
    ],
    [
        12449,
        12538,
    ],
    [
        12539,
        12539,
    ],
    [
        12540,
        12542,
    ],
    [
        12543,
        12543,
    ],
    [
        12549,
        12591,
    ],
    [
        12593,
        12686,
    ],
    [
        12688,
        12689,
    ],
    [
        12690,
        12693,
    ],
    [
        12694,
        12703,
    ],
    [
        12704,
        12735,
    ],
    [
        12736,
        12771,
    ],
    [
        12783,
        12783,
    ],
    [
        12784,
        12799,
    ],
    [
        12800,
        12830,
    ],
    [
        12832,
        12841,
    ],
    [
        12842,
        12871,
    ],
    [
        12880,
        12880,
    ],
    [
        12881,
        12895,
    ],
    [
        12896,
        12927,
    ],
    [
        12928,
        12937,
    ],
    [
        12938,
        12976,
    ],
    [
        12977,
        12991,
    ],
    [
        12992,
        13055,
    ],
    [
        13056,
        13311,
    ],
    [
        13312,
        19903,
    ],
    [
        19968,
        40959,
    ],
    [
        40960,
        40980,
    ],
    [
        40981,
        40981,
    ],
    [
        40982,
        42124,
    ],
    [
        42128,
        42182,
    ],
    [
        43360,
        43388,
    ],
    [
        44032,
        55203,
    ],
    [
        63744,
        64109,
    ],
    [
        64110,
        64111,
    ],
    [
        64112,
        64217,
    ],
    [
        64218,
        64255,
    ],
    [
        65040,
        65046,
    ],
    [
        65047,
        65047,
    ],
    [
        65048,
        65048,
    ],
    [
        65049,
        65049,
    ],
    [
        65072,
        65072,
    ],
    [
        65073,
        65074,
    ],
    [
        65075,
        65076,
    ],
    [
        65077,
        65077,
    ],
    [
        65078,
        65078,
    ],
    [
        65079,
        65079,
    ],
    [
        65080,
        65080,
    ],
    [
        65081,
        65081,
    ],
    [
        65082,
        65082,
    ],
    [
        65083,
        65083,
    ],
    [
        65084,
        65084,
    ],
    [
        65085,
        65085,
    ],
    [
        65086,
        65086,
    ],
    [
        65087,
        65087,
    ],
    [
        65088,
        65088,
    ],
    [
        65089,
        65089,
    ],
    [
        65090,
        65090,
    ],
    [
        65091,
        65091,
    ],
    [
        65092,
        65092,
    ],
    [
        65093,
        65094,
    ],
    [
        65095,
        65095,
    ],
    [
        65096,
        65096,
    ],
    [
        65097,
        65100,
    ],
    [
        65101,
        65103,
    ],
    [
        65104,
        65106,
    ],
    [
        65108,
        65111,
    ],
    [
        65112,
        65112,
    ],
    [
        65113,
        65113,
    ],
    [
        65114,
        65114,
    ],
    [
        65115,
        65115,
    ],
    [
        65116,
        65116,
    ],
    [
        65117,
        65117,
    ],
    [
        65118,
        65118,
    ],
    [
        65119,
        65121,
    ],
    [
        65122,
        65122,
    ],
    [
        65123,
        65123,
    ],
    [
        65124,
        65126,
    ],
    [
        65128,
        65128,
    ],
    [
        65129,
        65129,
    ],
    [
        65130,
        65131,
    ],
    [
        65281,
        65283,
    ],
    [
        65284,
        65284,
    ],
    [
        65285,
        65287,
    ],
    [
        65288,
        65288,
    ],
    [
        65289,
        65289,
    ],
    [
        65290,
        65290,
    ],
    [
        65291,
        65291,
    ],
    [
        65292,
        65292,
    ],
    [
        65293,
        65293,
    ],
    [
        65294,
        65295,
    ],
    [
        65296,
        65305,
    ],
    [
        65306,
        65307,
    ],
    [
        65308,
        65310,
    ],
    [
        65311,
        65312,
    ],
    [
        65313,
        65338,
    ],
    [
        65339,
        65339,
    ],
    [
        65340,
        65340,
    ],
    [
        65341,
        65341,
    ],
    [
        65342,
        65342,
    ],
    [
        65343,
        65343,
    ],
    [
        65344,
        65344,
    ],
    [
        65345,
        65370,
    ],
    [
        65371,
        65371,
    ],
    [
        65372,
        65372,
    ],
    [
        65373,
        65373,
    ],
    [
        65374,
        65374,
    ],
    [
        65375,
        65375,
    ],
    [
        65376,
        65376,
    ],
    [
        65504,
        65505,
    ],
    [
        65506,
        65506,
    ],
    [
        65507,
        65507,
    ],
    [
        65508,
        65508,
    ],
    [
        65509,
        65510,
    ],
    [
        94176,
        94177,
    ],
    [
        94178,
        94178,
    ],
    [
        94179,
        94179,
    ],
    [
        94180,
        94180,
    ],
    [
        94192,
        94193,
    ],
    [
        94208,
        100343,
    ],
    [
        100352,
        101119,
    ],
    [
        101120,
        101589,
    ],
    [
        101632,
        101640,
    ],
    [
        110576,
        110579,
    ],
    [
        110581,
        110587,
    ],
    [
        110589,
        110590,
    ],
    [
        110592,
        110847,
    ],
    [
        110848,
        110882,
    ],
    [
        110898,
        110898,
    ],
    [
        110928,
        110930,
    ],
    [
        110933,
        110933,
    ],
    [
        110948,
        110951,
    ],
    [
        110960,
        111355,
    ],
    [
        126980,
        126980,
    ],
    [
        127183,
        127183,
    ],
    [
        127374,
        127374,
    ],
    [
        127377,
        127386,
    ],
    [
        127488,
        127490,
    ],
    [
        127504,
        127547,
    ],
    [
        127552,
        127560,
    ],
    [
        127568,
        127569,
    ],
    [
        127584,
        127589,
    ],
    [
        127744,
        127776,
    ],
    [
        127789,
        127797,
    ],
    [
        127799,
        127868,
    ],
    [
        127870,
        127891,
    ],
    [
        127904,
        127946,
    ],
    [
        127951,
        127955,
    ],
    [
        127968,
        127984,
    ],
    [
        127988,
        127988,
    ],
    [
        127992,
        127994,
    ],
    [
        127995,
        127999,
    ],
    [
        128000,
        128062,
    ],
    [
        128064,
        128064,
    ],
    [
        128066,
        128252,
    ],
    [
        128255,
        128317,
    ],
    [
        128331,
        128334,
    ],
    [
        128336,
        128359,
    ],
    [
        128378,
        128378,
    ],
    [
        128405,
        128406,
    ],
    [
        128420,
        128420,
    ],
    [
        128507,
        128511,
    ],
    [
        128512,
        128591,
    ],
    [
        128640,
        128709,
    ],
    [
        128716,
        128716,
    ],
    [
        128720,
        128722,
    ],
    [
        128725,
        128727,
    ],
    [
        128732,
        128735,
    ],
    [
        128747,
        128748,
    ],
    [
        128756,
        128764,
    ],
    [
        128992,
        129003,
    ],
    [
        129008,
        129008,
    ],
    [
        129292,
        129338,
    ],
    [
        129340,
        129349,
    ],
    [
        129351,
        129535,
    ],
    [
        129648,
        129660,
    ],
    [
        129664,
        129672,
    ],
    [
        129680,
        129725,
    ],
    [
        129727,
        129733,
    ],
    [
        129742,
        129755,
    ],
    [
        129760,
        129768,
    ],
    [
        129776,
        129784,
    ],
    [
        131072,
        173791,
    ],
    [
        173792,
        173823,
    ],
    [
        173824,
        177977,
    ],
    [
        177978,
        177983,
    ],
    [
        177984,
        178205,
    ],
    [
        178206,
        178207,
    ],
    [
        178208,
        183969,
    ],
    [
        183970,
        183983,
    ],
    [
        183984,
        191456,
    ],
    [
        191457,
        191471,
    ],
    [
        191472,
        192093,
    ],
    [
        192094,
        194559,
    ],
    [
        194560,
        195101,
    ],
    [
        195102,
        195103,
    ],
    [
        195104,
        196605,
    ],
    [
        196608,
        201546,
    ],
    [
        201547,
        201551,
    ],
    [
        201552,
        205743,
    ],
    [
        205744,
        262141,
    ],
];
<?php

/*
 * This file has been auto-generated by the Symfony String Component for internal use.
 *
 * Unicode version: 15.1.0
 * Date: 2023-09-13T11:47:13+00:00
 */

return [
    [
        768,
        879,
    ],
    [
        1155,
        1159,
    ],
    [
        1160,
        1161,
    ],
    [
        1425,
        1469,
    ],
    [
        1471,
        1471,
    ],
    [
        1473,
        1474,
    ],
    [
        1476,
        1477,
    ],
    [
        1479,
        1479,
    ],
    [
        1552,
        1562,
    ],
    [
        1611,
        1631,
    ],
    [
        1648,
        1648,
    ],
    [
        1750,
        1756,
    ],
    [
        1759,
        1764,
    ],
    [
        1767,
        1768,
    ],
    [
        1770,
        1773,
    ],
    [
        1809,
        1809,
    ],
    [
        1840,
        1866,
    ],
    [
        1958,
        1968,
    ],
    [
        2027,
        2035,
    ],
    [
        2045,
        2045,
    ],
    [
        2070,
        2073,
    ],
    [
        2075,
        2083,
    ],
    [
        2085,
        2087,
    ],
    [
        2089,
        2093,
    ],
    [
        2137,
        2139,
    ],
    [
        2200,
        2207,
    ],
    [
        2250,
        2273,
    ],
    [
        2275,
        2306,
    ],
    [
        2362,
        2362,
    ],
    [
        2364,
        2364,
    ],
    [
        2369,
        2376,
    ],
    [
        2381,
        2381,
    ],
    [
        2385,
        2391,
    ],
    [
        2402,
        2403,
    ],
    [
        2433,
        2433,
    ],
    [
        2492,
        2492,
    ],
    [
        2497,
        2500,
    ],
    [
        2509,
        2509,
    ],
    [
        2530,
        2531,
    ],
    [
        2558,
        2558,
    ],
    [
        2561,
        2562,
    ],
    [
        2620,
        2620,
    ],
    [
        2625,
        2626,
    ],
    [
        2631,
        2632,
    ],
    [
        2635,
        2637,
    ],
    [
        2641,
        2641,
    ],
    [
        2672,
        2673,
    ],
    [
        2677,
        2677,
    ],
    [
        2689,
        2690,
    ],
    [
        2748,
        2748,
    ],
    [
        2753,
        2757,
    ],
    [
        2759,
        2760,
    ],
    [
        2765,
        2765,
    ],
    [
        2786,
        2787,
    ],
    [
        2810,
        2815,
    ],
    [
        2817,
        2817,
    ],
    [
        2876,
        2876,
    ],
    [
        2879,
        2879,
    ],
    [
        2881,
        2884,
    ],
    [
        2893,
        2893,
    ],
    [
        2901,
        2902,
    ],
    [
        2914,
        2915,
    ],
    [
        2946,
        2946,
    ],
    [
        3008,
        3008,
    ],
    [
        3021,
        3021,
    ],
    [
        3072,
        3072,
    ],
    [
        3076,
        3076,
    ],
    [
        3132,
        3132,
    ],
    [
        3134,
        3136,
    ],
    [
        3142,
        3144,
    ],
    [
        3146,
        3149,
    ],
    [
        3157,
        3158,
    ],
    [
        3170,
        3171,
    ],
    [
        3201,
        3201,
    ],
    [
        3260,
        3260,
    ],
    [
        3263,
        3263,
    ],
    [
        3270,
        3270,
    ],
    [
        3276,
        3277,
    ],
    [
        3298,
        3299,
    ],
    [
        3328,
        3329,
    ],
    [
        3387,
        3388,
    ],
    [
        3393,
        3396,
    ],
    [
        3405,
        3405,
    ],
    [
        3426,
        3427,
    ],
    [
        3457,
        3457,
    ],
    [
        3530,
        3530,
    ],
    [
        3538,
        3540,
    ],
    [
        3542,
        3542,
    ],
    [
        3633,
        3633,
    ],
    [
        3636,
        3642,
    ],
    [
        3655,
        3662,
    ],
    [
        3761,
        3761,
    ],
    [
        3764,
        3772,
    ],
    [
        3784,
        3790,
    ],
    [
        3864,
        3865,
    ],
    [
        3893,
        3893,
    ],
    [
        3895,
        3895,
    ],
    [
        3897,
        3897,
    ],
    [
        3953,
        3966,
    ],
    [
        3968,
        3972,
    ],
    [
        3974,
        3975,
    ],
    [
        3981,
        3991,
    ],
    [
        3993,
        4028,
    ],
    [
        4038,
        4038,
    ],
    [
        4141,
        4144,
    ],
    [
        4146,
        4151,
    ],
    [
        4153,
        4154,
    ],
    [
        4157,
        4158,
    ],
    [
        4184,
        4185,
    ],
    [
        4190,
        4192,
    ],
    [
        4209,
        4212,
    ],
    [
        4226,
        4226,
    ],
    [
        4229,
        4230,
    ],
    [
        4237,
        4237,
    ],
    [
        4253,
        4253,
    ],
    [
        4957,
        4959,
    ],
    [
        5906,
        5908,
    ],
    [
        5938,
        5939,
    ],
    [
        5970,
        5971,
    ],
    [
        6002,
        6003,
    ],
    [
        6068,
        6069,
    ],
    [
        6071,
        6077,
    ],
    [
        6086,
        6086,
    ],
    [
        6089,
        6099,
    ],
    [
        6109,
        6109,
    ],
    [
        6155,
        6157,
    ],
    [
        6159,
        6159,
    ],
    [
        6277,
        6278,
    ],
    [
        6313,
        6313,
    ],
    [
        6432,
        6434,
    ],
    [
        6439,
        6440,
    ],
    [
        6450,
        6450,
    ],
    [
        6457,
        6459,
    ],
    [
        6679,
        6680,
    ],
    [
        6683,
        6683,
    ],
    [
        6742,
        6742,
    ],
    [
        6744,
        6750,
    ],
    [
        6752,
        6752,
    ],
    [
        6754,
        6754,
    ],
    [
        6757,
        6764,
    ],
    [
        6771,
        6780,
    ],
    [
        6783,
        6783,
    ],
    [
        6832,
        6845,
    ],
    [
        6846,
        6846,
    ],
    [
        6847,
        6862,
    ],
    [
        6912,
        6915,
    ],
    [
        6964,
        6964,
    ],
    [
        6966,
        6970,
    ],
    [
        6972,
        6972,
    ],
    [
        6978,
        6978,
    ],
    [
        7019,
        7027,
    ],
    [
        7040,
        7041,
    ],
    [
        7074,
        7077,
    ],
    [
        7080,
        7081,
    ],
    [
        7083,
        7085,
    ],
    [
        7142,
        7142,
    ],
    [
        7144,
        7145,
    ],
    [
        7149,
        7149,
    ],
    [
        7151,
        7153,
    ],
    [
        7212,
        7219,
    ],
    [
        7222,
        7223,
    ],
    [
        7376,
        7378,
    ],
    [
        7380,
        7392,
    ],
    [
        7394,
        7400,
    ],
    [
        7405,
        7405,
    ],
    [
        7412,
        7412,
    ],
    [
        7416,
        7417,
    ],
    [
        7616,
        7679,
    ],
    [
        8400,
        8412,
    ],
    [
        8413,
        8416,
    ],
    [
        8417,
        8417,
    ],
    [
        8418,
        8420,
    ],
    [
        8421,
        8432,
    ],
    [
        11503,
        11505,
    ],
    [
        11647,
        11647,
    ],
    [
        11744,
        11775,
    ],
    [
        12330,
        12333,
    ],
    [
        12441,
        12442,
    ],
    [
        42607,
        42607,
    ],
    [
        42608,
        42610,
    ],
    [
        42612,
        42621,
    ],
    [
        42654,
        42655,
    ],
    [
        42736,
        42737,
    ],
    [
        43010,
        43010,
    ],
    [
        43014,
        43014,
    ],
    [
        43019,
        43019,
    ],
    [
        43045,
        43046,
    ],
    [
        43052,
        43052,
    ],
    [
        43204,
        43205,
    ],
    [
        43232,
        43249,
    ],
    [
        43263,
        43263,
    ],
    [
        43302,
        43309,
    ],
    [
        43335,
        43345,
    ],
    [
        43392,
        43394,
    ],
    [
        43443,
        43443,
    ],
    [
        43446,
        43449,
    ],
    [
        43452,
        43453,
    ],
    [
        43493,
        43493,
    ],
    [
        43561,
        43566,
    ],
    [
        43569,
        43570,
    ],
    [
        43573,
        43574,
    ],
    [
        43587,
        43587,
    ],
    [
        43596,
        43596,
    ],
    [
        43644,
        43644,
    ],
    [
        43696,
        43696,
    ],
    [
        43698,
        43700,
    ],
    [
        43703,
        43704,
    ],
    [
        43710,
        43711,
    ],
    [
        43713,
        43713,
    ],
    [
        43756,
        43757,
    ],
    [
        43766,
        43766,
    ],
    [
        44005,
        44005,
    ],
    [
        44008,
        44008,
    ],
    [
        44013,
        44013,
    ],
    [
        64286,
        64286,
    ],
    [
        65024,
        65039,
    ],
    [
        65056,
        65071,
    ],
    [
        66045,
        66045,
    ],
    [
        66272,
        66272,
    ],
    [
        66422,
        66426,
    ],
    [
        68097,
        68099,
    ],
    [
        68101,
        68102,
    ],
    [
        68108,
        68111,
    ],
    [
        68152,
        68154,
    ],
    [
        68159,
        68159,
    ],
    [
        68325,
        68326,
    ],
    [
        68900,
        68903,
    ],
    [
        69291,
        69292,
    ],
    [
        69373,
        69375,
    ],
    [
        69446,
        69456,
    ],
    [
        69506,
        69509,
    ],
    [
        69633,
        69633,
    ],
    [
        69688,
        69702,
    ],
    [
        69744,
        69744,
    ],
    [
        69747,
        69748,
    ],
    [
        69759,
        69761,
    ],
    [
        69811,
        69814,
    ],
    [
        69817,
        69818,
    ],
    [
        69826,
        69826,
    ],
    [
        69888,
        69890,
    ],
    [
        69927,
        69931,
    ],
    [
        69933,
        69940,
    ],
    [
        70003,
        70003,
    ],
    [
        70016,
        70017,
    ],
    [
        70070,
        70078,
    ],
    [
        70089,
        70092,
    ],
    [
        70095,
        70095,
    ],
    [
        70191,
        70193,
    ],
    [
        70196,
        70196,
    ],
    [
        70198,
        70199,
    ],
    [
        70206,
        70206,
    ],
    [
        70209,
        70209,
    ],
    [
        70367,
        70367,
    ],
    [
        70371,
        70378,
    ],
    [
        70400,
        70401,
    ],
    [
        70459,
        70460,
    ],
    [
        70464,
        70464,
    ],
    [
        70502,
        70508,
    ],
    [
        70512,
        70516,
    ],
    [
        70712,
        70719,
    ],
    [
        70722,
        70724,
    ],
    [
        70726,
        70726,
    ],
    [
        70750,
        70750,
    ],
    [
        70835,
        70840,
    ],
    [
        70842,
        70842,
    ],
    [
        70847,
        70848,
    ],
    [
        70850,
        70851,
    ],
    [
        71090,
        71093,
    ],
    [
        71100,
        71101,
    ],
    [
        71103,
        71104,
    ],
    [
        71132,
        71133,
    ],
    [
        71219,
        71226,
    ],
    [
        71229,
        71229,
    ],
    [
        71231,
        71232,
    ],
    [
        71339,
        71339,
    ],
    [
        71341,
        71341,
    ],
    [
        71344,
        71349,
    ],
    [
        71351,
        71351,
    ],
    [
        71453,
        71455,
    ],
    [
        71458,
        71461,
    ],
    [
        71463,
        71467,
    ],
    [
        71727,
        71735,
    ],
    [
        71737,
        71738,
    ],
    [
        71995,
        71996,
    ],
    [
        71998,
        71998,
    ],
    [
        72003,
        72003,
    ],
    [
        72148,
        72151,
    ],
    [
        72154,
        72155,
    ],
    [
        72160,
        72160,
    ],
    [
        72193,
        72202,
    ],
    [
        72243,
        72248,
    ],
    [
        72251,
        72254,
    ],
    [
        72263,
        72263,
    ],
    [
        72273,
        72278,
    ],
    [
        72281,
        72283,
    ],
    [
        72330,
        72342,
    ],
    [
        72344,
        72345,
    ],
    [
        72752,
        72758,
    ],
    [
        72760,
        72765,
    ],
    [
        72767,
        72767,
    ],
    [
        72850,
        72871,
    ],
    [
        72874,
        72880,
    ],
    [
        72882,
        72883,
    ],
    [
        72885,
        72886,
    ],
    [
        73009,
        73014,
    ],
    [
        73018,
        73018,
    ],
    [
        73020,
        73021,
    ],
    [
        73023,
        73029,
    ],
    [
        73031,
        73031,
    ],
    [
        73104,
        73105,
    ],
    [
        73109,
        73109,
    ],
    [
        73111,
        73111,
    ],
    [
        73459,
        73460,
    ],
    [
        73472,
        73473,
    ],
    [
        73526,
        73530,
    ],
    [
        73536,
        73536,
    ],
    [
        73538,
        73538,
    ],
    [
        78912,
        78912,
    ],
    [
        78919,
        78933,
    ],
    [
        92912,
        92916,
    ],
    [
        92976,
        92982,
    ],
    [
        94031,
        94031,
    ],
    [
        94095,
        94098,
    ],
    [
        94180,
        94180,
    ],
    [
        113821,
        113822,
    ],
    [
        118528,
        118573,
    ],
    [
        118576,
        118598,
    ],
    [
        119143,
        119145,
    ],
    [
        119163,
        119170,
    ],
    [
        119173,
        119179,
    ],
    [
        119210,
        119213,
    ],
    [
        119362,
        119364,
    ],
    [
        121344,
        121398,
    ],
    [
        121403,
        121452,
    ],
    [
        121461,
        121461,
    ],
    [
        121476,
        121476,
    ],
    [
        121499,
        121503,
    ],
    [
        121505,
        121519,
    ],
    [
        122880,
        122886,
    ],
    [
        122888,
        122904,
    ],
    [
        122907,
        122913,
    ],
    [
        122915,
        122916,
    ],
    [
        122918,
        122922,
    ],
    [
        123023,
        123023,
    ],
    [
        123184,
        123190,
    ],
    [
        123566,
        123566,
    ],
    [
        123628,
        123631,
    ],
    [
        124140,
        124143,
    ],
    [
        125136,
        125142,
    ],
    [
        125252,
        125258,
    ],
    [
        917760,
        917999,
    ],
];
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\String;

if (!\function_exists(u::class)) {
    function u(?string $string = ''): UnicodeString
    {
        return new UnicodeString($string ?? '');
    }
}

if (!\function_exists(b::class)) {
    function b(?string $string = ''): ByteString
    {
        return new ByteString($string ?? '');
    }
}

if (!\function_exists(s::class)) {
    /**
     * @return UnicodeString|ByteString
     */
    function s(?string $string = ''): AbstractString
    {
        $string = $string ?? '';

        return preg_match('//u', $string) ? new UnicodeString($string) : new ByteString($string);
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\String\Slugger;

use Symfony\Component\String\AbstractUnicodeString;
use Symfony\Component\String\UnicodeString;
use Symfony\Contracts\Translation\LocaleAwareInterface;

if (!interface_exists(LocaleAwareInterface::class)) {
    throw new \LogicException('You cannot use the "Symfony\Component\String\Slugger\AsciiSlugger" as the "symfony/translation-contracts" package is not installed. Try running "composer require symfony/translation-contracts".');
}

/**
 * @author Titouan Galopin <galopintitouan@gmail.com>
 */
class AsciiSlugger implements SluggerInterface, LocaleAwareInterface
{
    private const LOCALE_TO_TRANSLITERATOR_ID = [
        'am' => 'Amharic-Latin',
        'ar' => 'Arabic-Latin',
        'az' => 'Azerbaijani-Latin',
        'be' => 'Belarusian-Latin',
        'bg' => 'Bulgarian-Latin',
        'bn' => 'Bengali-Latin',
        'de' => 'de-ASCII',
        'el' => 'Greek-Latin',
        'fa' => 'Persian-Latin',
        'he' => 'Hebrew-Latin',
        'hy' => 'Armenian-Latin',
        'ka' => 'Georgian-Latin',
        'kk' => 'Kazakh-Latin',
        'ky' => 'Kirghiz-Latin',
        'ko' => 'Korean-Latin',
        'mk' => 'Macedonian-Latin',
        'mn' => 'Mongolian-Latin',
        'or' => 'Oriya-Latin',
        'ps' => 'Pashto-Latin',
        'ru' => 'Russian-Latin',
        'sr' => 'Serbian-Latin',
        'sr_Cyrl' => 'Serbian-Latin',
        'th' => 'Thai-Latin',
        'tk' => 'Turkmen-Latin',
        'uk' => 'Ukrainian-Latin',
        'uz' => 'Uzbek-Latin',
        'zh' => 'Han-Latin',
    ];

    private $defaultLocale;
    private $symbolsMap = [
        'en' => ['@' => 'at', '&' => 'and'],
    ];

    /**
     * Cache of transliterators per locale.
     *
     * @var \Transliterator[]
     */
    private $transliterators = [];

    /**
     * @param array|\Closure|null $symbolsMap
     */
    public function __construct(string $defaultLocale = null, $symbolsMap = null)
    {
        if (null !== $symbolsMap && !\is_array($symbolsMap) && !$symbolsMap instanceof \Closure) {
            throw new \TypeError(sprintf('Argument 2 passed to "%s()" must be array, Closure or null, "%s" given.', __METHOD__, \gettype($symbolsMap)));
        }

        $this->defaultLocale = $defaultLocale;
        $this->symbolsMap = $symbolsMap ?? $this->symbolsMap;
    }

    /**
     * {@inheritdoc}
     */
    public function setLocale($locale)
    {
        $this->defaultLocale = $locale;
    }

    /**
     * {@inheritdoc}
     */
    public function getLocale()
    {
        return $this->defaultLocale;
    }

    /**
     * {@inheritdoc}
     */
    public function slug(string $string, string $separator = '-', string $locale = null): AbstractUnicodeString
    {
        $locale = $locale ?? $this->defaultLocale;

        $transliterator = [];
        if ($locale && ('de' === $locale || 0 === strpos($locale, 'de_'))) {
            // Use the shortcut for German in UnicodeString::ascii() if possible (faster and no requirement on intl)
            $transliterator = ['de-ASCII'];
        } elseif (\function_exists('transliterator_transliterate') && $locale) {
            $transliterator = (array) $this->createTransliterator($locale);
        }

        if ($this->symbolsMap instanceof \Closure) {
            // If the symbols map is passed as a closure, there is no need to fallback to the parent locale
            // as the closure can just provide substitutions for all locales of interest.
            $symbolsMap = $this->symbolsMap;
            array_unshift($transliterator, static function ($s) use ($symbolsMap, $locale) {
                return $symbolsMap($s, $locale);
            });
        }

        $unicodeString = (new UnicodeString($string))->ascii($transliterator);

        if (\is_array($this->symbolsMap)) {
            $map = null;
            if (isset($this->symbolsMap[$locale])) {
                $map = $this->symbolsMap[$locale];
            } else {
                $parent = self::getParentLocale($locale);
                if ($parent && isset($this->symbolsMap[$parent])) {
                    $map = $this->symbolsMap[$parent];
                }
            }
            if ($map) {
                foreach ($map as $char => $replace) {
                    $unicodeString = $unicodeString->replace($char, ' '.$replace.' ');
                }
            }
        }

        return $unicodeString
            ->replaceMatches('/[^A-Za-z0-9]++/', $separator)
            ->trim($separator)
        ;
    }

    private function createTransliterator(string $locale): ?\Transliterator
    {
        if (\array_key_exists($locale, $this->transliterators)) {
            return $this->transliterators[$locale];
        }

        // Exact locale supported, cache and return
        if ($id = self::LOCALE_TO_TRANSLITERATOR_ID[$locale] ?? null) {
            return $this->transliterators[$locale] = \Transliterator::create($id.'/BGN') ?? \Transliterator::create($id);
        }

        // Locale not supported and no parent, fallback to any-latin
        if (!$parent = self::getParentLocale($locale)) {
            return $this->transliterators[$locale] = null;
        }

        // Try to use the parent locale (ie. try "de" for "de_AT") and cache both locales
        if ($id = self::LOCALE_TO_TRANSLITERATOR_ID[$parent] ?? null) {
            $transliterator = \Transliterator::create($id.'/BGN') ?? \Transliterator::create($id);
        }

        return $this->transliterators[$locale] = $this->transliterators[$parent] = $transliterator ?? null;
    }

    private static function getParentLocale(?string $locale): ?string
    {
        if (!$locale) {
            return null;
        }
        if (false === $str = strrchr($locale, '_')) {
            // no parent locale
            return null;
        }

        return substr($locale, 0, -\strlen($str));
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\String\Slugger;

use Symfony\Component\String\AbstractUnicodeString;

/**
 * Creates a URL-friendly slug from a given string.
 *
 * @author Titouan Galopin <galopintitouan@gmail.com>
 */
interface SluggerInterface
{
    /**
     * Creates a slug for the given string and locale, using appropriate transliteration when needed.
     */
    public function slug(string $string, string $separator = '-', string $locale = null): AbstractUnicodeString;
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\String;

use Symfony\Component\String\Exception\ExceptionInterface;
use Symfony\Component\String\Exception\InvalidArgumentException;

/**
 * Represents a string of Unicode grapheme clusters encoded as UTF-8.
 *
 * A letter followed by combining characters (accents typically) form what Unicode defines
 * as a grapheme cluster: a character as humans mean it in written texts. This class knows
 * about the concept and won't split a letter apart from its combining accents. It also
 * ensures all string comparisons happen on their canonically-composed representation,
 * ignoring e.g. the order in which accents are listed when a letter has many of them.
 *
 * @see https://unicode.org/reports/tr15/
 *
 * @author Nicolas Grekas <p@tchwork.com>
 * @author Hugo Hamon <hugohamon@neuf.fr>
 *
 * @throws ExceptionInterface
 */
class UnicodeString extends AbstractUnicodeString
{
    public function __construct(string $string = '')
    {
        $this->string = normalizer_is_normalized($string) ? $string : normalizer_normalize($string);

        if (false === $this->string) {
            throw new InvalidArgumentException('Invalid UTF-8 string.');
        }
    }

    public function append(string ...$suffix): AbstractString
    {
        $str = clone $this;
        $str->string = $this->string.(1 >= \count($suffix) ? ($suffix[0] ?? '') : implode('', $suffix));
        normalizer_is_normalized($str->string) ?: $str->string = normalizer_normalize($str->string);

        if (false === $str->string) {
            throw new InvalidArgumentException('Invalid UTF-8 string.');
        }

        return $str;
    }

    public function chunk(int $length = 1): array
    {
        if (1 > $length) {
            throw new InvalidArgumentException('The chunk length must be greater than zero.');
        }

        if ('' === $this->string) {
            return [];
        }

        $rx = '/(';
        while (65535 < $length) {
            $rx .= '\X{65535}';
            $length -= 65535;
        }
        $rx .= '\X{'.$length.'})/u';

        $str = clone $this;
        $chunks = [];

        foreach (preg_split($rx, $this->string, -1, \PREG_SPLIT_DELIM_CAPTURE | \PREG_SPLIT_NO_EMPTY) as $chunk) {
            $str->string = $chunk;
            $chunks[] = clone $str;
        }

        return $chunks;
    }

    public function endsWith($suffix): bool
    {
        if ($suffix instanceof AbstractString) {
            $suffix = $suffix->string;
        } elseif (\is_array($suffix) || $suffix instanceof \Traversable) {
            return parent::endsWith($suffix);
        } else {
            $suffix = (string) $suffix;
        }

        $form = null === $this->ignoreCase ? \Normalizer::NFD : \Normalizer::NFC;
        normalizer_is_normalized($suffix, $form) ?: $suffix = normalizer_normalize($suffix, $form);

        if ('' === $suffix || false === $suffix) {
            return false;
        }

        if ($this->ignoreCase) {
            return 0 === mb_stripos(grapheme_extract($this->string, \strlen($suffix), \GRAPHEME_EXTR_MAXBYTES, \strlen($this->string) - \strlen($suffix)), $suffix, 0, 'UTF-8');
        }

        return $suffix === grapheme_extract($this->string, \strlen($suffix), \GRAPHEME_EXTR_MAXBYTES, \strlen($this->string) - \strlen($suffix));
    }

    public function equalsTo($string): bool
    {
        if ($string instanceof AbstractString) {
            $string = $string->string;
        } elseif (\is_array($string) || $string instanceof \Traversable) {
            return parent::equalsTo($string);
        } else {
            $string = (string) $string;
        }

        $form = null === $this->ignoreCase ? \Normalizer::NFD : \Normalizer::NFC;
        normalizer_is_normalized($string, $form) ?: $string = normalizer_normalize($string, $form);

        if ('' !== $string && false !== $string && $this->ignoreCase) {
            return \strlen($string) === \strlen($this->string) && 0 === mb_stripos($this->string, $string, 0, 'UTF-8');
        }

        return $string === $this->string;
    }

    public function indexOf($needle, int $offset = 0): ?int
    {
        if ($needle instanceof AbstractString) {
            $needle = $needle->string;
        } elseif (\is_array($needle) || $needle instanceof \Traversable) {
            return parent::indexOf($needle, $offset);
        } else {
            $needle = (string) $needle;
        }

        $form = null === $this->ignoreCase ? \Normalizer::NFD : \Normalizer::NFC;
        normalizer_is_normalized($needle, $form) ?: $needle = normalizer_normalize($needle, $form);

        if ('' === $needle || false === $needle) {
            return null;
        }

        try {
            $i = $this->ignoreCase ? grapheme_stripos($this->string, $needle, $offset) : grapheme_strpos($this->string, $needle, $offset);
        } catch (\ValueError $e) {
            return null;
        }

        return false === $i ? null : $i;
    }

    public function indexOfLast($needle, int $offset = 0): ?int
    {
        if ($needle instanceof AbstractString) {
            $needle = $needle->string;
        } elseif (\is_array($needle) || $needle instanceof \Traversable) {
            return parent::indexOfLast($needle, $offset);
        } else {
            $needle = (string) $needle;
        }

        $form = null === $this->ignoreCase ? \Normalizer::NFD : \Normalizer::NFC;
        normalizer_is_normalized($needle, $form) ?: $needle = normalizer_normalize($needle, $form);

        if ('' === $needle || false === $needle) {
            return null;
        }

        $string = $this->string;

        if (0 > $offset) {
            // workaround https://bugs.php.net/74264
            if (0 > $offset += grapheme_strlen($needle)) {
                $string = grapheme_substr($string, 0, $offset);
            }
            $offset = 0;
        }

        $i = $this->ignoreCase ? grapheme_strripos($string, $needle, $offset) : grapheme_strrpos($string, $needle, $offset);

        return false === $i ? null : $i;
    }

    public function join(array $strings, string $lastGlue = null): AbstractString
    {
        $str = parent::join($strings, $lastGlue);
        normalizer_is_normalized($str->string) ?: $str->string = normalizer_normalize($str->string);

        return $str;
    }

    public function length(): int
    {
        return grapheme_strlen($this->string);
    }

    /**
     * @return static
     */
    public function normalize(int $form = self::NFC): parent
    {
        $str = clone $this;

        if (\in_array($form, [self::NFC, self::NFKC], true)) {
            normalizer_is_normalized($str->string, $form) ?: $str->string = normalizer_normalize($str->string, $form);
        } elseif (!\in_array($form, [self::NFD, self::NFKD], true)) {
            throw new InvalidArgumentException('Unsupported normalization form.');
        } elseif (!normalizer_is_normalized($str->string, $form)) {
            $str->string = normalizer_normalize($str->string, $form);
            $str->ignoreCase = null;
        }

        return $str;
    }

    public function prepend(string ...$prefix): AbstractString
    {
        $str = clone $this;
        $str->string = (1 >= \count($prefix) ? ($prefix[0] ?? '') : implode('', $prefix)).$this->string;
        normalizer_is_normalized($str->string) ?: $str->string = normalizer_normalize($str->string);

        if (false === $str->string) {
            throw new InvalidArgumentException('Invalid UTF-8 string.');
        }

        return $str;
    }

    public function replace(string $from, string $to): AbstractString
    {
        $str = clone $this;
        normalizer_is_normalized($from) ?: $from = normalizer_normalize($from);

        if ('' !== $from && false !== $from) {
            $tail = $str->string;
            $result = '';
            $indexOf = $this->ignoreCase ? 'grapheme_stripos' : 'grapheme_strpos';

            while ('' !== $tail && false !== $i = $indexOf($tail, $from)) {
                $slice = grapheme_substr($tail, 0, $i);
                $result .= $slice.$to;
                $tail = substr($tail, \strlen($slice) + \strlen($from));
            }

            $str->string = $result.$tail;
            normalizer_is_normalized($str->string) ?: $str->string = normalizer_normalize($str->string);

            if (false === $str->string) {
                throw new InvalidArgumentException('Invalid UTF-8 string.');
            }
        }

        return $str;
    }

    public function replaceMatches(string $fromRegexp, $to): AbstractString
    {
        $str = parent::replaceMatches($fromRegexp, $to);
        normalizer_is_normalized($str->string) ?: $str->string = normalizer_normalize($str->string);

        return $str;
    }

    public function slice(int $start = 0, int $length = null): AbstractString
    {
        $str = clone $this;

        if (\PHP_VERSION_ID < 80000 && 0 > $start && grapheme_strlen($this->string) < -$start) {
            $start = 0;
        }
        $str->string = (string) grapheme_substr($this->string, $start, $length ?? 2147483647);

        return $str;
    }

    public function splice(string $replacement, int $start = 0, int $length = null): AbstractString
    {
        $str = clone $this;

        if (\PHP_VERSION_ID < 80000 && 0 > $start && grapheme_strlen($this->string) < -$start) {
            $start = 0;
        }
        $start = $start ? \strlen(grapheme_substr($this->string, 0, $start)) : 0;
        $length = $length ? \strlen(grapheme_substr($this->string, $start, $length ?? 2147483647)) : $length;
        $str->string = substr_replace($this->string, $replacement, $start, $length ?? 2147483647);
        normalizer_is_normalized($str->string) ?: $str->string = normalizer_normalize($str->string);

        if (false === $str->string) {
            throw new InvalidArgumentException('Invalid UTF-8 string.');
        }

        return $str;
    }

    public function split(string $delimiter, int $limit = null, int $flags = null): array
    {
        if (1 > $limit = $limit ?? 2147483647) {
            throw new InvalidArgumentException('Split limit must be a positive integer.');
        }

        if ('' === $delimiter) {
            throw new InvalidArgumentException('Split delimiter is empty.');
        }

        if (null !== $flags) {
            return parent::split($delimiter.'u', $limit, $flags);
        }

        normalizer_is_normalized($delimiter) ?: $delimiter = normalizer_normalize($delimiter);

        if (false === $delimiter) {
            throw new InvalidArgumentException('Split delimiter is not a valid UTF-8 string.');
        }

        $str = clone $this;
        $tail = $this->string;
        $chunks = [];
        $indexOf = $this->ignoreCase ? 'grapheme_stripos' : 'grapheme_strpos';

        while (1 < $limit && false !== $i = $indexOf($tail, $delimiter)) {
            $str->string = grapheme_substr($tail, 0, $i);
            $chunks[] = clone $str;
            $tail = substr($tail, \strlen($str->string) + \strlen($delimiter));
            --$limit;
        }

        $str->string = $tail;
        $chunks[] = clone $str;

        return $chunks;
    }

    public function startsWith($prefix): bool
    {
        if ($prefix instanceof AbstractString) {
            $prefix = $prefix->string;
        } elseif (\is_array($prefix) || $prefix instanceof \Traversable) {
            return parent::startsWith($prefix);
        } else {
            $prefix = (string) $prefix;
        }

        $form = null === $this->ignoreCase ? \Normalizer::NFD : \Normalizer::NFC;
        normalizer_is_normalized($prefix, $form) ?: $prefix = normalizer_normalize($prefix, $form);

        if ('' === $prefix || false === $prefix) {
            return false;
        }

        if ($this->ignoreCase) {
            return 0 === mb_stripos(grapheme_extract($this->string, \strlen($prefix), \GRAPHEME_EXTR_MAXBYTES), $prefix, 0, 'UTF-8');
        }

        return $prefix === grapheme_extract($this->string, \strlen($prefix), \GRAPHEME_EXTR_MAXBYTES);
    }

    public function __wakeup()
    {
        if (!\is_string($this->string)) {
            throw new \BadMethodCallException('Cannot unserialize '.__CLASS__);
        }

        normalizer_is_normalized($this->string) ?: $this->string = normalizer_normalize($this->string);
    }

    public function __clone()
    {
        if (null === $this->ignoreCase) {
            normalizer_is_normalized($this->string) ?: $this->string = normalizer_normalize($this->string);
        }

        $this->ignoreCase = false;
    }
}
{
    "name": "symfony/string",
    "type": "library",
    "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way",
    "keywords": ["string", "utf8", "utf-8", "grapheme", "i18n", "unicode"],
    "homepage": "https://symfony.com",
    "license": "MIT",
    "authors": [
        {
            "name": "Nicolas Grekas",
            "email": "p@tchwork.com"
        },
        {
            "name": "Symfony Community",
            "homepage": "https://symfony.com/contributors"
        }
    ],
    "require": {
        "php": ">=7.2.5",
        "symfony/polyfill-ctype": "~1.8",
        "symfony/polyfill-intl-grapheme": "~1.0",
        "symfony/polyfill-intl-normalizer": "~1.0",
        "symfony/polyfill-mbstring": "~1.0",
        "symfony/polyfill-php80": "~1.15"
    },
    "require-dev": {
        "symfony/error-handler": "^4.4|^5.0|^6.0",
        "symfony/http-client": "^4.4|^5.0|^6.0",
        "symfony/translation-contracts": "^1.1|^2",
        "symfony/var-exporter": "^4.4|^5.0|^6.0"
    },
    "conflict": {
        "symfony/translation-contracts": ">=3.0"
    },
    "autoload": {
        "psr-4": { "Symfony\\Component\\String\\": "" },
        "files": [ "Resources/functions.php" ],
        "exclude-from-classmap": [
            "/Tests/"
        ]
    },
    "minimum-stability": "dev"
}
vendor/
composer.lock
phpunit.xml
CHANGELOG
=========

The changelog is maintained for all Symfony contracts at the following URL:
https://github.com/symfony/contracts/blob/main/CHANGELOG.md
Copyright (c) 2020-2022 Fabien Potencier

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.
Symfony Deprecation Contracts
=============================

A generic function and convention to trigger deprecation notices.

This package provides a single global function named `trigger_deprecation()` that triggers silenced deprecation notices.

By using a custom PHP error handler such as the one provided by the Symfony ErrorHandler component,
the triggered deprecations can be caught and logged for later discovery, both on dev and prod environments.

The function requires at least 3 arguments:
 - the name of the Composer package that is triggering the deprecation
 - the version of the package that introduced the deprecation
 - the message of the deprecation
 - more arguments can be provided: they will be inserted in the message using `printf()` formatting

Example:
```php
trigger_deprecation('symfony/blockchain', '8.9', 'Using "%s" is deprecated, use "%s" instead.', 'bitcoin', 'fabcoin');
```

This will generate the following message:
`Since symfony/blockchain 8.9: Using "bitcoin" is deprecated, use "fabcoin" instead.`

While not necessarily recommended, the deprecation notices can be completely ignored by declaring an empty
`function trigger_deprecation() {}` in your application.
{
    "name": "symfony/deprecation-contracts",
    "type": "library",
    "description": "A generic function and convention to trigger deprecation notices",
    "homepage": "https://symfony.com",
    "license": "MIT",
    "authors": [
        {
            "name": "Nicolas Grekas",
            "email": "p@tchwork.com"
        },
        {
            "name": "Symfony Community",
            "homepage": "https://symfony.com/contributors"
        }
    ],
    "require": {
        "php": ">=7.1"
    },
    "autoload": {
        "files": [
            "function.php"
        ]
    },
    "minimum-stability": "dev",
    "extra": {
        "branch-alias": {
            "dev-main": "2.5-dev"
        },
        "thanks": {
            "name": "symfony/contracts",
            "url": "https://github.com/symfony/contracts"
        }
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

if (!function_exists('trigger_deprecation')) {
    /**
     * Triggers a silenced deprecation notice.
     *
     * @param string $package The name of the Composer package that is triggering the deprecation
     * @param string $version The version of the package that introduced the deprecation
     * @param string $message The message of the deprecation
     * @param mixed  ...$args Values to insert in the message using printf() formatting
     *
     * @author Nicolas Grekas <p@tchwork.com>
     */
    function trigger_deprecation(string $package, string $version, string $message, ...$args): void
    {
        @trigger_error(($package || $version ? "Since $package $version: " : '').($args ? vsprintf($message, $args) : $message), \E_USER_DEPRECATED);
    }
}
vendor/
composer.lock
phpunit.xml
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Contracts\Service\Attribute;

/**
 * A required dependency.
 *
 * This attribute indicates that a property holds a required dependency. The annotated property or method should be
 * considered during the instantiation process of the containing class.
 *
 * @author Alexander M. Turek <me@derrabus.de>
 */
#[\Attribute(\Attribute::TARGET_METHOD | \Attribute::TARGET_PROPERTY)]
final class Required
{
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Contracts\Service\Attribute;

use Symfony\Contracts\Service\ServiceSubscriberTrait;

/**
 * Use with {@see ServiceSubscriberTrait} to mark a method's return type
 * as a subscribed service.
 *
 * @author Kevin Bond <kevinbond@gmail.com>
 */
#[\Attribute(\Attribute::TARGET_METHOD)]
final class SubscribedService
{
    /**
     * @param string|null $key The key to use for the service
     *                         If null, use "ClassName::methodName"
     */
    public function __construct(
        public ?string $key = null
    ) {
    }
}
CHANGELOG
=========

The changelog is maintained for all Symfony contracts at the following URL:
https://github.com/symfony/contracts/blob/main/CHANGELOG.md
Copyright (c) 2018-2022 Fabien Potencier

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.
Symfony Service Contracts
=========================

A set of abstractions extracted out of the Symfony components.

Can be used to build on semantics that the Symfony components proved useful - and
that already have battle tested implementations.

See https://github.com/symfony/contracts/blob/main/README.md for more information.
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Contracts\Service;

/**
 * Provides a way to reset an object to its initial state.
 *
 * When calling the "reset()" method on an object, it should be put back to its
 * initial state. This usually means clearing any internal buffers and forwarding
 * the call to internal dependencies. All properties of the object should be put
 * back to the same state it had when it was first ready to use.
 *
 * This method could be called, for example, to recycle objects that are used as
 * services, so that they can be used to handle several requests in the same
 * process loop (note that we advise making your services stateless instead of
 * implementing this interface when possible.)
 */
interface ResetInterface
{
    public function reset();
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Contracts\Service;

use Psr\Container\ContainerExceptionInterface;
use Psr\Container\NotFoundExceptionInterface;

// Help opcache.preload discover always-needed symbols
class_exists(ContainerExceptionInterface::class);
class_exists(NotFoundExceptionInterface::class);

/**
 * A trait to help implement ServiceProviderInterface.
 *
 * @author Robin Chalas <robin.chalas@gmail.com>
 * @author Nicolas Grekas <p@tchwork.com>
 */
trait ServiceLocatorTrait
{
    private $factories;
    private $loading = [];
    private $providedTypes;

    /**
     * @param callable[] $factories
     */
    public function __construct(array $factories)
    {
        $this->factories = $factories;
    }

    /**
     * {@inheritdoc}
     *
     * @return bool
     */
    public function has(string $id)
    {
        return isset($this->factories[$id]);
    }

    /**
     * {@inheritdoc}
     *
     * @return mixed
     */
    public function get(string $id)
    {
        if (!isset($this->factories[$id])) {
            throw $this->createNotFoundException($id);
        }

        if (isset($this->loading[$id])) {
            $ids = array_values($this->loading);
            $ids = \array_slice($this->loading, array_search($id, $ids));
            $ids[] = $id;

            throw $this->createCircularReferenceException($id, $ids);
        }

        $this->loading[$id] = $id;
        try {
            return $this->factories[$id]($this);
        } finally {
            unset($this->loading[$id]);
        }
    }

    /**
     * {@inheritdoc}
     */
    public function getProvidedServices(): array
    {
        if (null === $this->providedTypes) {
            $this->providedTypes = [];

            foreach ($this->factories as $name => $factory) {
                if (!\is_callable($factory)) {
                    $this->providedTypes[$name] = '?';
                } else {
                    $type = (new \ReflectionFunction($factory))->getReturnType();

                    $this->providedTypes[$name] = $type ? ($type->allowsNull() ? '?' : '').($type instanceof \ReflectionNamedType ? $type->getName() : $type) : '?';
                }
            }
        }

        return $this->providedTypes;
    }

    private function createNotFoundException(string $id): NotFoundExceptionInterface
    {
        if (!$alternatives = array_keys($this->factories)) {
            $message = 'is empty...';
        } else {
            $last = array_pop($alternatives);
            if ($alternatives) {
                $message = sprintf('only knows about the "%s" and "%s" services.', implode('", "', $alternatives), $last);
            } else {
                $message = sprintf('only knows about the "%s" service.', $last);
            }
        }

        if ($this->loading) {
            $message = sprintf('The service "%s" has a dependency on a non-existent service "%s". This locator %s', end($this->loading), $id, $message);
        } else {
            $message = sprintf('Service "%s" not found: the current service locator %s', $id, $message);
        }

        return new class($message) extends \InvalidArgumentException implements NotFoundExceptionInterface {
        };
    }

    private function createCircularReferenceException(string $id, array $path): ContainerExceptionInterface
    {
        return new class(sprintf('Circular reference detected for service "%s", path: "%s".', $id, implode(' -> ', $path))) extends \RuntimeException implements ContainerExceptionInterface {
        };
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Contracts\Service;

use Psr\Container\ContainerInterface;

/**
 * A ServiceProviderInterface exposes the identifiers and the types of services provided by a container.
 *
 * @author Nicolas Grekas <p@tchwork.com>
 * @author Mateusz Sip <mateusz.sip@gmail.com>
 */
interface ServiceProviderInterface extends ContainerInterface
{
    /**
     * Returns an associative array of service types keyed by the identifiers provided by the current container.
     *
     * Examples:
     *
     *  * ['logger' => 'Psr\Log\LoggerInterface'] means the object provides a service named "logger" that implements Psr\Log\LoggerInterface
     *  * ['foo' => '?'] means the container provides service name "foo" of unspecified type
     *  * ['bar' => '?Bar\Baz'] means the container provides a service "bar" of type Bar\Baz|null
     *
     * @return string[] The provided service types, keyed by service names
     */
    public function getProvidedServices(): array;
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Contracts\Service;

/**
 * A ServiceSubscriber exposes its dependencies via the static {@link getSubscribedServices} method.
 *
 * The getSubscribedServices method returns an array of service types required by such instances,
 * optionally keyed by the service names used internally. Service types that start with an interrogation
 * mark "?" are optional, while the other ones are mandatory service dependencies.
 *
 * The injected service locators SHOULD NOT allow access to any other services not specified by the method.
 *
 * It is expected that ServiceSubscriber instances consume PSR-11-based service locators internally.
 * This interface does not dictate any injection method for these service locators, although constructor
 * injection is recommended.
 *
 * @author Nicolas Grekas <p@tchwork.com>
 */
interface ServiceSubscriberInterface
{
    /**
     * Returns an array of service types required by such instances, optionally keyed by the service names used internally.
     *
     * For mandatory dependencies:
     *
     *  * ['logger' => 'Psr\Log\LoggerInterface'] means the objects use the "logger" name
     *    internally to fetch a service which must implement Psr\Log\LoggerInterface.
     *  * ['loggers' => 'Psr\Log\LoggerInterface[]'] means the objects use the "loggers" name
     *    internally to fetch an iterable of Psr\Log\LoggerInterface instances.
     *  * ['Psr\Log\LoggerInterface'] is a shortcut for
     *  * ['Psr\Log\LoggerInterface' => 'Psr\Log\LoggerInterface']
     *
     * otherwise:
     *
     *  * ['logger' => '?Psr\Log\LoggerInterface'] denotes an optional dependency
     *  * ['loggers' => '?Psr\Log\LoggerInterface[]'] denotes an optional iterable dependency
     *  * ['?Psr\Log\LoggerInterface'] is a shortcut for
     *  * ['Psr\Log\LoggerInterface' => '?Psr\Log\LoggerInterface']
     *
     * @return string[] The required service types, optionally keyed by service names
     */
    public static function getSubscribedServices();
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Contracts\Service;

use Psr\Container\ContainerInterface;
use Symfony\Contracts\Service\Attribute\SubscribedService;

/**
 * Implementation of ServiceSubscriberInterface that determines subscribed services from
 * method return types. Service ids are available as "ClassName::methodName".
 *
 * @author Kevin Bond <kevinbond@gmail.com>
 */
trait ServiceSubscriberTrait
{
    /** @var ContainerInterface */
    protected $container;

    /**
     * {@inheritdoc}
     */
    public static function getSubscribedServices(): array
    {
        $services = method_exists(get_parent_class(self::class) ?: '', __FUNCTION__) ? parent::getSubscribedServices() : [];
        $attributeOptIn = false;

        if (\PHP_VERSION_ID >= 80000) {
            foreach ((new \ReflectionClass(self::class))->getMethods() as $method) {
                if (self::class !== $method->getDeclaringClass()->name) {
                    continue;
                }

                if (!$attribute = $method->getAttributes(SubscribedService::class)[0] ?? null) {
                    continue;
                }

                if ($method->isStatic() || $method->isAbstract() || $method->isGenerator() || $method->isInternal() || $method->getNumberOfRequiredParameters()) {
                    throw new \LogicException(sprintf('Cannot use "%s" on method "%s::%s()" (can only be used on non-static, non-abstract methods with no parameters).', SubscribedService::class, self::class, $method->name));
                }

                if (!$returnType = $method->getReturnType()) {
                    throw new \LogicException(sprintf('Cannot use "%s" on methods without a return type in "%s::%s()".', SubscribedService::class, $method->name, self::class));
                }

                $serviceId = $returnType instanceof \ReflectionNamedType ? $returnType->getName() : (string) $returnType;

                if ($returnType->allowsNull()) {
                    $serviceId = '?'.$serviceId;
                }

                $services[$attribute->newInstance()->key ?? self::class.'::'.$method->name] = $serviceId;
                $attributeOptIn = true;
            }
        }

        if (!$attributeOptIn) {
            foreach ((new \ReflectionClass(self::class))->getMethods() as $method) {
                if ($method->isStatic() || $method->isAbstract() || $method->isGenerator() || $method->isInternal() || $method->getNumberOfRequiredParameters()) {
                    continue;
                }

                if (self::class !== $method->getDeclaringClass()->name) {
                    continue;
                }

                if (!($returnType = $method->getReturnType()) instanceof \ReflectionNamedType) {
                    continue;
                }

                if ($returnType->isBuiltin()) {
                    continue;
                }

                if (\PHP_VERSION_ID >= 80000) {
                    trigger_deprecation('symfony/service-contracts', '2.5', 'Using "%s" in "%s" without using the "%s" attribute on any method is deprecated.', ServiceSubscriberTrait::class, self::class, SubscribedService::class);
                }

                $services[self::class.'::'.$method->name] = '?'.($returnType instanceof \ReflectionNamedType ? $returnType->getName() : $returnType);
            }
        }

        return $services;
    }

    /**
     * @required
     *
     * @return ContainerInterface|null
     */
    public function setContainer(ContainerInterface $container)
    {
        $this->container = $container;

        if (method_exists(get_parent_class(self::class) ?: '', __FUNCTION__)) {
            return parent::setContainer($container);
        }

        return null;
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Contracts\Service\Test;

use PHPUnit\Framework\TestCase;
use Psr\Container\ContainerInterface;
use Symfony\Contracts\Service\ServiceLocatorTrait;

abstract class ServiceLocatorTest extends TestCase
{
    /**
     * @return ContainerInterface
     */
    protected function getServiceLocator(array $factories)
    {
        return new class($factories) implements ContainerInterface {
            use ServiceLocatorTrait;
        };
    }

    public function testHas()
    {
        $locator = $this->getServiceLocator([
            'foo' => function () { return 'bar'; },
            'bar' => function () { return 'baz'; },
            function () { return 'dummy'; },
        ]);

        $this->assertTrue($locator->has('foo'));
        $this->assertTrue($locator->has('bar'));
        $this->assertFalse($locator->has('dummy'));
    }

    public function testGet()
    {
        $locator = $this->getServiceLocator([
            'foo' => function () { return 'bar'; },
            'bar' => function () { return 'baz'; },
        ]);

        $this->assertSame('bar', $locator->get('foo'));
        $this->assertSame('baz', $locator->get('bar'));
    }

    public function testGetDoesNotMemoize()
    {
        $i = 0;
        $locator = $this->getServiceLocator([
            'foo' => function () use (&$i) {
                ++$i;

                return 'bar';
            },
        ]);

        $this->assertSame('bar', $locator->get('foo'));
        $this->assertSame('bar', $locator->get('foo'));
        $this->assertSame(2, $i);
    }

    public function testThrowsOnUndefinedInternalService()
    {
        if (!$this->getExpectedException()) {
            $this->expectException(\Psr\Container\NotFoundExceptionInterface::class);
            $this->expectExceptionMessage('The service "foo" has a dependency on a non-existent service "bar". This locator only knows about the "foo" service.');
        }
        $locator = $this->getServiceLocator([
            'foo' => function () use (&$locator) { return $locator->get('bar'); },
        ]);

        $locator->get('foo');
    }

    public function testThrowsOnCircularReference()
    {
        $this->expectException(\Psr\Container\ContainerExceptionInterface::class);
        $this->expectExceptionMessage('Circular reference detected for service "bar", path: "bar -> baz -> bar".');
        $locator = $this->getServiceLocator([
            'foo' => function () use (&$locator) { return $locator->get('bar'); },
            'bar' => function () use (&$locator) { return $locator->get('baz'); },
            'baz' => function () use (&$locator) { return $locator->get('bar'); },
        ]);

        $locator->get('foo');
    }
}
{
    "name": "symfony/service-contracts",
    "type": "library",
    "description": "Generic abstractions related to writing services",
    "keywords": ["abstractions", "contracts", "decoupling", "interfaces", "interoperability", "standards"],
    "homepage": "https://symfony.com",
    "license": "MIT",
    "authors": [
        {
            "name": "Nicolas Grekas",
            "email": "p@tchwork.com"
        },
        {
            "name": "Symfony Community",
            "homepage": "https://symfony.com/contributors"
        }
    ],
    "require": {
        "php": ">=7.2.5",
        "psr/container": "^1.1",
        "symfony/deprecation-contracts": "^2.1|^3"
    },
    "conflict": {
        "ext-psr": "<1.1|>=2"
    },
    "suggest": {
        "symfony/service-implementation": ""
    },
    "autoload": {
        "psr-4": { "Symfony\\Contracts\\Service\\": "" }
    },
    "minimum-stability": "dev",
    "extra": {
        "branch-alias": {
            "dev-main": "2.5-dev"
        },
        "thanks": {
            "name": "symfony/contracts",
            "url": "https://github.com/symfony/contracts"
        }
    }
}
Copyright (c) 2015-present Fabien Potencier

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

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Polyfill\Intl\Normalizer;

/**
 * Normalizer is a PHP fallback implementation of the Normalizer class provided by the intl extension.
 *
 * It has been validated with Unicode 6.3 Normalization Conformance Test.
 * See http://www.unicode.org/reports/tr15/ for detailed info about Unicode normalizations.
 *
 * @author Nicolas Grekas <p@tchwork.com>
 *
 * @internal
 */
class Normalizer
{
    public const FORM_D = \Normalizer::FORM_D;
    public const FORM_KD = \Normalizer::FORM_KD;
    public const FORM_C = \Normalizer::FORM_C;
    public const FORM_KC = \Normalizer::FORM_KC;
    public const NFD = \Normalizer::NFD;
    public const NFKD = \Normalizer::NFKD;
    public const NFC = \Normalizer::NFC;
    public const NFKC = \Normalizer::NFKC;

    private static $C;
    private static $D;
    private static $KD;
    private static $cC;
    private static $ulenMask = ["\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4];
    private static $ASCII = "\x20\x65\x69\x61\x73\x6E\x74\x72\x6F\x6C\x75\x64\x5D\x5B\x63\x6D\x70\x27\x0A\x67\x7C\x68\x76\x2E\x66\x62\x2C\x3A\x3D\x2D\x71\x31\x30\x43\x32\x2A\x79\x78\x29\x28\x4C\x39\x41\x53\x2F\x50\x22\x45\x6A\x4D\x49\x6B\x33\x3E\x35\x54\x3C\x44\x34\x7D\x42\x7B\x38\x46\x77\x52\x36\x37\x55\x47\x4E\x3B\x4A\x7A\x56\x23\x48\x4F\x57\x5F\x26\x21\x4B\x3F\x58\x51\x25\x59\x5C\x09\x5A\x2B\x7E\x5E\x24\x40\x60\x7F\x00\x01\x02\x03\x04\x05\x06\x07\x08\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F";

    public static function isNormalized(string $s, int $form = self::FORM_C)
    {
        if (!\in_array($form, [self::NFD, self::NFKD, self::NFC, self::NFKC])) {
            return false;
        }
        if (!isset($s[strspn($s, self::$ASCII)])) {
            return true;
        }
        if (self::NFC == $form && preg_match('//u', $s) && !preg_match('/[^\x00-\x{2FF}]/u', $s)) {
            return true;
        }

        return self::normalize($s, $form) === $s;
    }

    public static function normalize(string $s, int $form = self::FORM_C)
    {
        if (!preg_match('//u', $s)) {
            return false;
        }

        switch ($form) {
            case self::NFC: $C = true; $K = false; break;
            case self::NFD: $C = false; $K = false; break;
            case self::NFKC: $C = true; $K = true; break;
            case self::NFKD: $C = false; $K = true; break;
            default:
                if (\defined('Normalizer::NONE') && \Normalizer::NONE == $form) {
                    return $s;
                }

                if (80000 > \PHP_VERSION_ID) {
                    return false;
                }

                throw new \ValueError('normalizer_normalize(): Argument #2 ($form) must be a a valid normalization form');
        }

        if ('' === $s) {
            return '';
        }

        if ($K && null === self::$KD) {
            self::$KD = self::getData('compatibilityDecomposition');
        }

        if (null === self::$D) {
            self::$D = self::getData('canonicalDecomposition');
            self::$cC = self::getData('combiningClass');
        }

        if (null !== $mbEncoding = (2 /* MB_OVERLOAD_STRING */ & (int) \ini_get('mbstring.func_overload')) ? mb_internal_encoding() : null) {
            mb_internal_encoding('8bit');
        }

        $r = self::decompose($s, $K);

        if ($C) {
            if (null === self::$C) {
                self::$C = self::getData('canonicalComposition');
            }

            $r = self::recompose($r);
        }
        if (null !== $mbEncoding) {
            mb_internal_encoding($mbEncoding);
        }

        return $r;
    }

    private static function recompose($s)
    {
        $ASCII = self::$ASCII;
        $compMap = self::$C;
        $combClass = self::$cC;
        $ulenMask = self::$ulenMask;

        $result = $tail = '';

        $i = $s[0] < "\x80" ? 1 : $ulenMask[$s[0] & "\xF0"];
        $len = \strlen($s);

        $lastUchr = substr($s, 0, $i);
        $lastUcls = isset($combClass[$lastUchr]) ? 256 : 0;

        while ($i < $len) {
            if ($s[$i] < "\x80") {
                // ASCII chars

                if ($tail) {
                    $lastUchr .= $tail;
                    $tail = '';
                }

                if ($j = strspn($s, $ASCII, $i + 1)) {
                    $lastUchr .= substr($s, $i, $j);
                    $i += $j;
                }

                $result .= $lastUchr;
                $lastUchr = $s[$i];
                $lastUcls = 0;
                ++$i;
                continue;
            }

            $ulen = $ulenMask[$s[$i] & "\xF0"];
            $uchr = substr($s, $i, $ulen);

            if ($lastUchr < "\xE1\x84\x80" || "\xE1\x84\x92" < $lastUchr
                || $uchr < "\xE1\x85\xA1" || "\xE1\x85\xB5" < $uchr
                || $lastUcls) {
                // Table lookup and combining chars composition

                $ucls = $combClass[$uchr] ?? 0;

                if (isset($compMap[$lastUchr.$uchr]) && (!$lastUcls || $lastUcls < $ucls)) {
                    $lastUchr = $compMap[$lastUchr.$uchr];
                } elseif ($lastUcls = $ucls) {
                    $tail .= $uchr;
                } else {
                    if ($tail) {
                        $lastUchr .= $tail;
                        $tail = '';
                    }

                    $result .= $lastUchr;
                    $lastUchr = $uchr;
                }
            } else {
                // Hangul chars

                $L = \ord($lastUchr[2]) - 0x80;
                $V = \ord($uchr[2]) - 0xA1;
                $T = 0;

                $uchr = substr($s, $i + $ulen, 3);

                if ("\xE1\x86\xA7" <= $uchr && $uchr <= "\xE1\x87\x82") {
                    $T = \ord($uchr[2]) - 0xA7;
                    0 > $T && $T += 0x40;
                    $ulen += 3;
                }

                $L = 0xAC00 + ($L * 21 + $V) * 28 + $T;
                $lastUchr = \chr(0xE0 | $L >> 12).\chr(0x80 | $L >> 6 & 0x3F).\chr(0x80 | $L & 0x3F);
            }

            $i += $ulen;
        }

        return $result.$lastUchr.$tail;
    }

    private static function decompose($s, $c)
    {
        $result = '';

        $ASCII = self::$ASCII;
        $decompMap = self::$D;
        $combClass = self::$cC;
        $ulenMask = self::$ulenMask;
        if ($c) {
            $compatMap = self::$KD;
        }

        $c = [];
        $i = 0;
        $len = \strlen($s);

        while ($i < $len) {
            if ($s[$i] < "\x80") {
                // ASCII chars

                if ($c) {
                    ksort($c);
                    $result .= implode('', $c);
                    $c = [];
                }

                $j = 1 + strspn($s, $ASCII, $i + 1);
                $result .= substr($s, $i, $j);
                $i += $j;
                continue;
            }

            $ulen = $ulenMask[$s[$i] & "\xF0"];
            $uchr = substr($s, $i, $ulen);
            $i += $ulen;

            if ($uchr < "\xEA\xB0\x80" || "\xED\x9E\xA3" < $uchr) {
                // Table lookup

                if ($uchr !== $j = $compatMap[$uchr] ?? ($decompMap[$uchr] ?? $uchr)) {
                    $uchr = $j;

                    $j = \strlen($uchr);
                    $ulen = $uchr[0] < "\x80" ? 1 : $ulenMask[$uchr[0] & "\xF0"];

                    if ($ulen != $j) {
                        // Put trailing chars in $s

                        $j -= $ulen;
                        $i -= $j;

                        if (0 > $i) {
                            $s = str_repeat(' ', -$i).$s;
                            $len -= $i;
                            $i = 0;
                        }

                        while ($j--) {
                            $s[$i + $j] = $uchr[$ulen + $j];
                        }

                        $uchr = substr($uchr, 0, $ulen);
                    }
                }
                if (isset($combClass[$uchr])) {
                    // Combining chars, for sorting

                    if (!isset($c[$combClass[$uchr]])) {
                        $c[$combClass[$uchr]] = '';
                    }
                    $c[$combClass[$uchr]] .= $uchr;
                    continue;
                }
            } else {
                // Hangul chars

                $uchr = unpack('C*', $uchr);
                $j = (($uchr[1] - 224) << 12) + (($uchr[2] - 128) << 6) + $uchr[3] - 0xAC80;

                $uchr = "\xE1\x84".\chr(0x80 + (int) ($j / 588))
                       ."\xE1\x85".\chr(0xA1 + (int) (($j % 588) / 28));

                if ($j %= 28) {
                    $uchr .= $j < 25
                        ? ("\xE1\x86".\chr(0xA7 + $j))
                        : ("\xE1\x87".\chr(0x67 + $j));
                }
            }
            if ($c) {
                ksort($c);
                $result .= implode('', $c);
                $c = [];
            }

            $result .= $uchr;
        }

        if ($c) {
            ksort($c);
            $result .= implode('', $c);
        }

        return $result;
    }

    private static function getData($file)
    {
        if (file_exists($file = __DIR__.'/Resources/unidata/'.$file.'.php')) {
            return require $file;
        }

        return false;
    }
}
Symfony Polyfill / Intl: Normalizer
===================================

This component provides a fallback implementation for the
[`Normalizer`](https://php.net/Normalizer) class provided
by the [Intl](https://php.net/intl) extension.

More information can be found in the
[main Polyfill README](https://github.com/symfony/polyfill/blob/main/README.md).

License
=======

This library is released under the [MIT license](LICENSE).
<?php

class Normalizer extends Symfony\Polyfill\Intl\Normalizer\Normalizer
{
    /**
     * @deprecated since ICU 56 and removed in PHP 8
     */
    public const NONE = 2;
    public const FORM_D = 4;
    public const FORM_KD = 8;
    public const FORM_C = 16;
    public const FORM_KC = 32;
    public const NFD = 4;
    public const NFKD = 8;
    public const NFC = 16;
    public const NFKC = 32;
}
<?php

return array (
  'À' => 'À',
  'Á' => 'Á',
  'Â' => 'Â',
  'Ã' => 'Ã',
  'Ä' => 'Ä',
  'Å' => 'Å',
  'Ç' => 'Ç',
  'È' => 'È',
  'É' => 'É',
  'Ê' => 'Ê',
  'Ë' => 'Ë',
  'Ì' => 'Ì',
  'Í' => 'Í',
  'Î' => 'Î',
  'Ï' => 'Ï',
  'Ñ' => 'Ñ',
  'Ò' => 'Ò',
  'Ó' => 'Ó',
  'Ô' => 'Ô',
  'Õ' => 'Õ',
  'Ö' => 'Ö',
  'Ù' => 'Ù',
  'Ú' => 'Ú',
  'Û' => 'Û',
  'Ü' => 'Ü',
  'Ý' => 'Ý',
  'à' => 'à',
  'á' => 'á',
  'â' => 'â',
  'ã' => 'ã',
  'ä' => 'ä',
  'å' => 'å',
  'ç' => 'ç',
  'è' => 'è',
  'é' => 'é',
  'ê' => 'ê',
  'ë' => 'ë',
  'ì' => 'ì',
  'í' => 'í',
  'î' => 'î',
  'ï' => 'ï',
  'ñ' => 'ñ',
  'ò' => 'ò',
  'ó' => 'ó',
  'ô' => 'ô',
  'õ' => 'õ',
  'ö' => 'ö',
  'ù' => 'ù',
  'ú' => 'ú',
  'û' => 'û',
  'ü' => 'ü',
  'ý' => 'ý',
  'ÿ' => 'ÿ',
  'Ā' => 'Ā',
  'ā' => 'ā',
  'Ă' => 'Ă',
  'ă' => 'ă',
  'Ą' => 'Ą',
  'ą' => 'ą',
  'Ć' => 'Ć',
  'ć' => 'ć',
  'Ĉ' => 'Ĉ',
  'ĉ' => 'ĉ',
  'Ċ' => 'Ċ',
  'ċ' => 'ċ',
  'Č' => 'Č',
  'č' => 'č',
  'Ď' => 'Ď',
  'ď' => 'ď',
  'Ē' => 'Ē',
  'ē' => 'ē',
  'Ĕ' => 'Ĕ',
  'ĕ' => 'ĕ',
  'Ė' => 'Ė',
  'ė' => 'ė',
  'Ę' => 'Ę',
  'ę' => 'ę',
  'Ě' => 'Ě',
  'ě' => 'ě',
  'Ĝ' => 'Ĝ',
  'ĝ' => 'ĝ',
  'Ğ' => 'Ğ',
  'ğ' => 'ğ',
  'Ġ' => 'Ġ',
  'ġ' => 'ġ',
  'Ģ' => 'Ģ',
  'ģ' => 'ģ',
  'Ĥ' => 'Ĥ',
  'ĥ' => 'ĥ',
  'Ĩ' => 'Ĩ',
  'ĩ' => 'ĩ',
  'Ī' => 'Ī',
  'ī' => 'ī',
  'Ĭ' => 'Ĭ',
  'ĭ' => 'ĭ',
  'Į' => 'Į',
  'į' => 'į',
  'İ' => 'İ',
  'Ĵ' => 'Ĵ',
  'ĵ' => 'ĵ',
  'Ķ' => 'Ķ',
  'ķ' => 'ķ',
  'Ĺ' => 'Ĺ',
  'ĺ' => 'ĺ',
  'Ļ' => 'Ļ',
  'ļ' => 'ļ',
  'Ľ' => 'Ľ',
  'ľ' => 'ľ',
  'Ń' => 'Ń',
  'ń' => 'ń',
  'Ņ' => 'Ņ',
  'ņ' => 'ņ',
  'Ň' => 'Ň',
  'ň' => 'ň',
  'Ō' => 'Ō',
  'ō' => 'ō',
  'Ŏ' => 'Ŏ',
  'ŏ' => 'ŏ',
  'Ő' => 'Ő',
  'ő' => 'ő',
  'Ŕ' => 'Ŕ',
  'ŕ' => 'ŕ',
  'Ŗ' => 'Ŗ',
  'ŗ' => 'ŗ',
  'Ř' => 'Ř',
  'ř' => 'ř',
  'Ś' => 'Ś',
  'ś' => 'ś',
  'Ŝ' => 'Ŝ',
  'ŝ' => 'ŝ',
  'Ş' => 'Ş',
  'ş' => 'ş',
  'Š' => 'Š',
  'š' => 'š',
  'Ţ' => 'Ţ',
  'ţ' => 'ţ',
  'Ť' => 'Ť',
  'ť' => 'ť',
  'Ũ' => 'Ũ',
  'ũ' => 'ũ',
  'Ū' => 'Ū',
  'ū' => 'ū',
  'Ŭ' => 'Ŭ',
  'ŭ' => 'ŭ',
  'Ů' => 'Ů',
  'ů' => 'ů',
  'Ű' => 'Ű',
  'ű' => 'ű',
  'Ų' => 'Ų',
  'ų' => 'ų',
  'Ŵ' => 'Ŵ',
  'ŵ' => 'ŵ',
  'Ŷ' => 'Ŷ',
  'ŷ' => 'ŷ',
  'Ÿ' => 'Ÿ',
  'Ź' => 'Ź',
  'ź' => 'ź',
  'Ż' => 'Ż',
  'ż' => 'ż',
  'Ž' => 'Ž',
  'ž' => 'ž',
  'Ơ' => 'Ơ',
  'ơ' => 'ơ',
  'Ư' => 'Ư',
  'ư' => 'ư',
  'Ǎ' => 'Ǎ',
  'ǎ' => 'ǎ',
  'Ǐ' => 'Ǐ',
  'ǐ' => 'ǐ',
  'Ǒ' => 'Ǒ',
  'ǒ' => 'ǒ',
  'Ǔ' => 'Ǔ',
  'ǔ' => 'ǔ',
  'Ǖ' => 'Ǖ',
  'ǖ' => 'ǖ',
  'Ǘ' => 'Ǘ',
  'ǘ' => 'ǘ',
  'Ǚ' => 'Ǚ',
  'ǚ' => 'ǚ',
  'Ǜ' => 'Ǜ',
  'ǜ' => 'ǜ',
  'Ǟ' => 'Ǟ',
  'ǟ' => 'ǟ',
  'Ǡ' => 'Ǡ',
  'ǡ' => 'ǡ',
  'Ǣ' => 'Ǣ',
  'ǣ' => 'ǣ',
  'Ǧ' => 'Ǧ',
  'ǧ' => 'ǧ',
  'Ǩ' => 'Ǩ',
  'ǩ' => 'ǩ',
  'Ǫ' => 'Ǫ',
  'ǫ' => 'ǫ',
  'Ǭ' => 'Ǭ',
  'ǭ' => 'ǭ',
  'Ǯ' => 'Ǯ',
  'ǯ' => 'ǯ',
  'ǰ' => 'ǰ',
  'Ǵ' => 'Ǵ',
  'ǵ' => 'ǵ',
  'Ǹ' => 'Ǹ',
  'ǹ' => 'ǹ',
  'Ǻ' => 'Ǻ',
  'ǻ' => 'ǻ',
  'Ǽ' => 'Ǽ',
  'ǽ' => 'ǽ',
  'Ǿ' => 'Ǿ',
  'ǿ' => 'ǿ',
  'Ȁ' => 'Ȁ',
  'ȁ' => 'ȁ',
  'Ȃ' => 'Ȃ',
  'ȃ' => 'ȃ',
  'Ȅ' => 'Ȅ',
  'ȅ' => 'ȅ',
  'Ȇ' => 'Ȇ',
  'ȇ' => 'ȇ',
  'Ȉ' => 'Ȉ',
  'ȉ' => 'ȉ',
  'Ȋ' => 'Ȋ',
  'ȋ' => 'ȋ',
  'Ȍ' => 'Ȍ',
  'ȍ' => 'ȍ',
  'Ȏ' => 'Ȏ',
  'ȏ' => 'ȏ',
  'Ȑ' => 'Ȑ',
  'ȑ' => 'ȑ',
  'Ȓ' => 'Ȓ',
  'ȓ' => 'ȓ',
  'Ȕ' => 'Ȕ',
  'ȕ' => 'ȕ',
  'Ȗ' => 'Ȗ',
  'ȗ' => 'ȗ',
  'Ș' => 'Ș',
  'ș' => 'ș',
  'Ț' => 'Ț',
  'ț' => 'ț',
  'Ȟ' => 'Ȟ',
  'ȟ' => 'ȟ',
  'Ȧ' => 'Ȧ',
  'ȧ' => 'ȧ',
  'Ȩ' => 'Ȩ',
  'ȩ' => 'ȩ',
  'Ȫ' => 'Ȫ',
  'ȫ' => 'ȫ',
  'Ȭ' => 'Ȭ',
  'ȭ' => 'ȭ',
  'Ȯ' => 'Ȯ',
  'ȯ' => 'ȯ',
  'Ȱ' => 'Ȱ',
  'ȱ' => 'ȱ',
  'Ȳ' => 'Ȳ',
  'ȳ' => 'ȳ',
  '΅' => '΅',
  'Ά' => 'Ά',
  'Έ' => 'Έ',
  'Ή' => 'Ή',
  'Ί' => 'Ί',
  'Ό' => 'Ό',
  'Ύ' => 'Ύ',
  'Ώ' => 'Ώ',
  'ΐ' => 'ΐ',
  'Ϊ' => 'Ϊ',
  'Ϋ' => 'Ϋ',
  'ά' => 'ά',
  'έ' => 'έ',
  'ή' => 'ή',
  'ί' => 'ί',
  'ΰ' => 'ΰ',
  'ϊ' => 'ϊ',
  'ϋ' => 'ϋ',
  'ό' => 'ό',
  'ύ' => 'ύ',
  'ώ' => 'ώ',
  'ϓ' => 'ϓ',
  'ϔ' => 'ϔ',
  'Ѐ' => 'Ѐ',
  'Ё' => 'Ё',
  'Ѓ' => 'Ѓ',
  'Ї' => 'Ї',
  'Ќ' => 'Ќ',
  'Ѝ' => 'Ѝ',
  'Ў' => 'Ў',
  'Й' => 'Й',
  'й' => 'й',
  'ѐ' => 'ѐ',
  'ё' => 'ё',
  'ѓ' => 'ѓ',
  'ї' => 'ї',
  'ќ' => 'ќ',
  'ѝ' => 'ѝ',
  'ў' => 'ў',
  'Ѷ' => 'Ѷ',
  'ѷ' => 'ѷ',
  'Ӂ' => 'Ӂ',
  'ӂ' => 'ӂ',
  'Ӑ' => 'Ӑ',
  'ӑ' => 'ӑ',
  'Ӓ' => 'Ӓ',
  'ӓ' => 'ӓ',
  'Ӗ' => 'Ӗ',
  'ӗ' => 'ӗ',
  'Ӛ' => 'Ӛ',
  'ӛ' => 'ӛ',
  'Ӝ' => 'Ӝ',
  'ӝ' => 'ӝ',
  'Ӟ' => 'Ӟ',
  'ӟ' => 'ӟ',
  'Ӣ' => 'Ӣ',
  'ӣ' => 'ӣ',
  'Ӥ' => 'Ӥ',
  'ӥ' => 'ӥ',
  'Ӧ' => 'Ӧ',
  'ӧ' => 'ӧ',
  'Ӫ' => 'Ӫ',
  'ӫ' => 'ӫ',
  'Ӭ' => 'Ӭ',
  'ӭ' => 'ӭ',
  'Ӯ' => 'Ӯ',
  'ӯ' => 'ӯ',
  'Ӱ' => 'Ӱ',
  'ӱ' => 'ӱ',
  'Ӳ' => 'Ӳ',
  'ӳ' => 'ӳ',
  'Ӵ' => 'Ӵ',
  'ӵ' => 'ӵ',
  'Ӹ' => 'Ӹ',
  'ӹ' => 'ӹ',
  'آ' => 'آ',
  'أ' => 'أ',
  'ؤ' => 'ؤ',
  'إ' => 'إ',
  'ئ' => 'ئ',
  'ۀ' => 'ۀ',
  'ۂ' => 'ۂ',
  'ۓ' => 'ۓ',
  'ऩ' => 'ऩ',
  'ऱ' => 'ऱ',
  'ऴ' => 'ऴ',
  'ো' => 'ো',
  'ৌ' => 'ৌ',
  'ୈ' => 'ୈ',
  'ୋ' => 'ୋ',
  'ୌ' => 'ୌ',
  'ஔ' => 'ஔ',
  'ொ' => 'ொ',
  'ோ' => 'ோ',
  'ௌ' => 'ௌ',
  'ై' => 'ై',
  'ೀ' => 'ೀ',
  'ೇ' => 'ೇ',
  'ೈ' => 'ೈ',
  'ೊ' => 'ೊ',
  'ೋ' => 'ೋ',
  'ൊ' => 'ൊ',
  'ോ' => 'ോ',
  'ൌ' => 'ൌ',
  'ේ' => 'ේ',
  'ො' => 'ො',
  'ෝ' => 'ෝ',
  'ෞ' => 'ෞ',
  'ဦ' => 'ဦ',
  'ᬆ' => 'ᬆ',
  'ᬈ' => 'ᬈ',
  'ᬊ' => 'ᬊ',
  'ᬌ' => 'ᬌ',
  'ᬎ' => 'ᬎ',
  'ᬒ' => 'ᬒ',
  'ᬻ' => 'ᬻ',
  'ᬽ' => 'ᬽ',
  'ᭀ' => 'ᭀ',
  'ᭁ' => 'ᭁ',
  'ᭃ' => 'ᭃ',
  'Ḁ' => 'Ḁ',
  'ḁ' => 'ḁ',
  'Ḃ' => 'Ḃ',
  'ḃ' => 'ḃ',
  'Ḅ' => 'Ḅ',
  'ḅ' => 'ḅ',
  'Ḇ' => 'Ḇ',
  'ḇ' => 'ḇ',
  'Ḉ' => 'Ḉ',
  'ḉ' => 'ḉ',
  'Ḋ' => 'Ḋ',
  'ḋ' => 'ḋ',
  'Ḍ' => 'Ḍ',
  'ḍ' => 'ḍ',
  'Ḏ' => 'Ḏ',
  'ḏ' => 'ḏ',
  'Ḑ' => 'Ḑ',
  'ḑ' => 'ḑ',
  'Ḓ' => 'Ḓ',
  'ḓ' => 'ḓ',
  'Ḕ' => 'Ḕ',
  'ḕ' => 'ḕ',
  'Ḗ' => 'Ḗ',
  'ḗ' => 'ḗ',
  'Ḙ' => 'Ḙ',
  'ḙ' => 'ḙ',
  'Ḛ' => 'Ḛ',
  'ḛ' => 'ḛ',
  'Ḝ' => 'Ḝ',
  'ḝ' => 'ḝ',
  'Ḟ' => 'Ḟ',
  'ḟ' => 'ḟ',
  'Ḡ' => 'Ḡ',
  'ḡ' => 'ḡ',
  'Ḣ' => 'Ḣ',
  'ḣ' => 'ḣ',
  'Ḥ' => 'Ḥ',
  'ḥ' => 'ḥ',
  'Ḧ' => 'Ḧ',
  'ḧ' => 'ḧ',
  'Ḩ' => 'Ḩ',
  'ḩ' => 'ḩ',
  'Ḫ' => 'Ḫ',
  'ḫ' => 'ḫ',
  'Ḭ' => 'Ḭ',
  'ḭ' => 'ḭ',
  'Ḯ' => 'Ḯ',
  'ḯ' => 'ḯ',
  'Ḱ' => 'Ḱ',
  'ḱ' => 'ḱ',
  'Ḳ' => 'Ḳ',
  'ḳ' => 'ḳ',
  'Ḵ' => 'Ḵ',
  'ḵ' => 'ḵ',
  'Ḷ' => 'Ḷ',
  'ḷ' => 'ḷ',
  'Ḹ' => 'Ḹ',
  'ḹ' => 'ḹ',
  'Ḻ' => 'Ḻ',
  'ḻ' => 'ḻ',
  'Ḽ' => 'Ḽ',
  'ḽ' => 'ḽ',
  'Ḿ' => 'Ḿ',
  'ḿ' => 'ḿ',
  'Ṁ' => 'Ṁ',
  'ṁ' => 'ṁ',
  'Ṃ' => 'Ṃ',
  'ṃ' => 'ṃ',
  'Ṅ' => 'Ṅ',
  'ṅ' => 'ṅ',
  'Ṇ' => 'Ṇ',
  'ṇ' => 'ṇ',
  'Ṉ' => 'Ṉ',
  'ṉ' => 'ṉ',
  'Ṋ' => 'Ṋ',
  'ṋ' => 'ṋ',
  'Ṍ' => 'Ṍ',
  'ṍ' => 'ṍ',
  'Ṏ' => 'Ṏ',
  'ṏ' => 'ṏ',
  'Ṑ' => 'Ṑ',
  'ṑ' => 'ṑ',
  'Ṓ' => 'Ṓ',
  'ṓ' => 'ṓ',
  'Ṕ' => 'Ṕ',
  'ṕ' => 'ṕ',
  'Ṗ' => 'Ṗ',
  'ṗ' => 'ṗ',
  'Ṙ' => 'Ṙ',
  'ṙ' => 'ṙ',
  'Ṛ' => 'Ṛ',
  'ṛ' => 'ṛ',
  'Ṝ' => 'Ṝ',
  'ṝ' => 'ṝ',
  'Ṟ' => 'Ṟ',
  'ṟ' => 'ṟ',
  'Ṡ' => 'Ṡ',
  'ṡ' => 'ṡ',
  'Ṣ' => 'Ṣ',
  'ṣ' => 'ṣ',
  'Ṥ' => 'Ṥ',
  'ṥ' => 'ṥ',
  'Ṧ' => 'Ṧ',
  'ṧ' => 'ṧ',
  'Ṩ' => 'Ṩ',
  'ṩ' => 'ṩ',
  'Ṫ' => 'Ṫ',
  'ṫ' => 'ṫ',
  'Ṭ' => 'Ṭ',
  'ṭ' => 'ṭ',
  'Ṯ' => 'Ṯ',
  'ṯ' => 'ṯ',
  'Ṱ' => 'Ṱ',
  'ṱ' => 'ṱ',
  'Ṳ' => 'Ṳ',
  'ṳ' => 'ṳ',
  'Ṵ' => 'Ṵ',
  'ṵ' => 'ṵ',
  'Ṷ' => 'Ṷ',
  'ṷ' => 'ṷ',
  'Ṹ' => 'Ṹ',
  'ṹ' => 'ṹ',
  'Ṻ' => 'Ṻ',
  'ṻ' => 'ṻ',
  'Ṽ' => 'Ṽ',
  'ṽ' => 'ṽ',
  'Ṿ' => 'Ṿ',
  'ṿ' => 'ṿ',
  'Ẁ' => 'Ẁ',
  'ẁ' => 'ẁ',
  'Ẃ' => 'Ẃ',
  'ẃ' => 'ẃ',
  'Ẅ' => 'Ẅ',
  'ẅ' => 'ẅ',
  'Ẇ' => 'Ẇ',
  'ẇ' => 'ẇ',
  'Ẉ' => 'Ẉ',
  'ẉ' => 'ẉ',
  'Ẋ' => 'Ẋ',
  'ẋ' => 'ẋ',
  'Ẍ' => 'Ẍ',
  'ẍ' => 'ẍ',
  'Ẏ' => 'Ẏ',
  'ẏ' => 'ẏ',
  'Ẑ' => 'Ẑ',
  'ẑ' => 'ẑ',
  'Ẓ' => 'Ẓ',
  'ẓ' => 'ẓ',
  'Ẕ' => 'Ẕ',
  'ẕ' => 'ẕ',
  'ẖ' => 'ẖ',
  'ẗ' => 'ẗ',
  'ẘ' => 'ẘ',
  'ẙ' => 'ẙ',
  'ẛ' => 'ẛ',
  'Ạ' => 'Ạ',
  'ạ' => 'ạ',
  'Ả' => 'Ả',
  'ả' => 'ả',
  'Ấ' => 'Ấ',
  'ấ' => 'ấ',
  'Ầ' => 'Ầ',
  'ầ' => 'ầ',
  'Ẩ' => 'Ẩ',
  'ẩ' => 'ẩ',
  'Ẫ' => 'Ẫ',
  'ẫ' => 'ẫ',
  'Ậ' => 'Ậ',
  'ậ' => 'ậ',
  'Ắ' => 'Ắ',
  'ắ' => 'ắ',
  'Ằ' => 'Ằ',
  'ằ' => 'ằ',
  'Ẳ' => 'Ẳ',
  'ẳ' => 'ẳ',
  'Ẵ' => 'Ẵ',
  'ẵ' => 'ẵ',
  'Ặ' => 'Ặ',
  'ặ' => 'ặ',
  'Ẹ' => 'Ẹ',
  'ẹ' => 'ẹ',
  'Ẻ' => 'Ẻ',
  'ẻ' => 'ẻ',
  'Ẽ' => 'Ẽ',
  'ẽ' => 'ẽ',
  'Ế' => 'Ế',
  'ế' => 'ế',
  'Ề' => 'Ề',
  'ề' => 'ề',
  'Ể' => 'Ể',
  'ể' => 'ể',
  'Ễ' => 'Ễ',
  'ễ' => 'ễ',
  'Ệ' => 'Ệ',
  'ệ' => 'ệ',
  'Ỉ' => 'Ỉ',
  'ỉ' => 'ỉ',
  'Ị' => 'Ị',
  'ị' => 'ị',
  'Ọ' => 'Ọ',
  'ọ' => 'ọ',
  'Ỏ' => 'Ỏ',
  'ỏ' => 'ỏ',
  'Ố' => 'Ố',
  'ố' => 'ố',
  'Ồ' => 'Ồ',
  'ồ' => 'ồ',
  'Ổ' => 'Ổ',
  'ổ' => 'ổ',
  'Ỗ' => 'Ỗ',
  'ỗ' => 'ỗ',
  'Ộ' => 'Ộ',
  'ộ' => 'ộ',
  'Ớ' => 'Ớ',
  'ớ' => 'ớ',
  'Ờ' => 'Ờ',
  'ờ' => 'ờ',
  'Ở' => 'Ở',
  'ở' => 'ở',
  'Ỡ' => 'Ỡ',
  'ỡ' => 'ỡ',
  'Ợ' => 'Ợ',
  'ợ' => 'ợ',
  'Ụ' => 'Ụ',
  'ụ' => 'ụ',
  'Ủ' => 'Ủ',
  'ủ' => 'ủ',
  'Ứ' => 'Ứ',
  'ứ' => 'ứ',
  'Ừ' => 'Ừ',
  'ừ' => 'ừ',
  'Ử' => 'Ử',
  'ử' => 'ử',
  'Ữ' => 'Ữ',
  'ữ' => 'ữ',
  'Ự' => 'Ự',
  'ự' => 'ự',
  'Ỳ' => 'Ỳ',
  'ỳ' => 'ỳ',
  'Ỵ' => 'Ỵ',
  'ỵ' => 'ỵ',
  'Ỷ' => 'Ỷ',
  'ỷ' => 'ỷ',
  'Ỹ' => 'Ỹ',
  'ỹ' => 'ỹ',
  'ἀ' => 'ἀ',
  'ἁ' => 'ἁ',
  'ἂ' => 'ἂ',
  'ἃ' => 'ἃ',
  'ἄ' => 'ἄ',
  'ἅ' => 'ἅ',
  'ἆ' => 'ἆ',
  'ἇ' => 'ἇ',
  'Ἀ' => 'Ἀ',
  'Ἁ' => 'Ἁ',
  'Ἂ' => 'Ἂ',
  'Ἃ' => 'Ἃ',
  'Ἄ' => 'Ἄ',
  'Ἅ' => 'Ἅ',
  'Ἆ' => 'Ἆ',
  'Ἇ' => 'Ἇ',
  'ἐ' => 'ἐ',
  'ἑ' => 'ἑ',
  'ἒ' => 'ἒ',
  'ἓ' => 'ἓ',
  'ἔ' => 'ἔ',
  'ἕ' => 'ἕ',
  'Ἐ' => 'Ἐ',
  'Ἑ' => 'Ἑ',
  'Ἒ' => 'Ἒ',
  'Ἓ' => 'Ἓ',
  'Ἔ' => 'Ἔ',
  'Ἕ' => 'Ἕ',
  'ἠ' => 'ἠ',
  'ἡ' => 'ἡ',
  'ἢ' => 'ἢ',
  'ἣ' => 'ἣ',
  'ἤ' => 'ἤ',
  'ἥ' => 'ἥ',
  'ἦ' => 'ἦ',
  'ἧ' => 'ἧ',
  'Ἠ' => 'Ἠ',
  'Ἡ' => 'Ἡ',
  'Ἢ' => 'Ἢ',
  'Ἣ' => 'Ἣ',
  'Ἤ' => 'Ἤ',
  'Ἥ' => 'Ἥ',
  'Ἦ' => 'Ἦ',
  'Ἧ' => 'Ἧ',
  'ἰ' => 'ἰ',
  'ἱ' => 'ἱ',
  'ἲ' => 'ἲ',
  'ἳ' => 'ἳ',
  'ἴ' => 'ἴ',
  'ἵ' => 'ἵ',
  'ἶ' => 'ἶ',
  'ἷ' => 'ἷ',
  'Ἰ' => 'Ἰ',
  'Ἱ' => 'Ἱ',
  'Ἲ' => 'Ἲ',
  'Ἳ' => 'Ἳ',
  'Ἴ' => 'Ἴ',
  'Ἵ' => 'Ἵ',
  'Ἶ' => 'Ἶ',
  'Ἷ' => 'Ἷ',
  'ὀ' => 'ὀ',
  'ὁ' => 'ὁ',
  'ὂ' => 'ὂ',
  'ὃ' => 'ὃ',
  'ὄ' => 'ὄ',
  'ὅ' => 'ὅ',
  'Ὀ' => 'Ὀ',
  'Ὁ' => 'Ὁ',
  'Ὂ' => 'Ὂ',
  'Ὃ' => 'Ὃ',
  'Ὄ' => 'Ὄ',
  'Ὅ' => 'Ὅ',
  'ὐ' => 'ὐ',
  'ὑ' => 'ὑ',
  'ὒ' => 'ὒ',
  'ὓ' => 'ὓ',
  'ὔ' => 'ὔ',
  'ὕ' => 'ὕ',
  'ὖ' => 'ὖ',
  'ὗ' => 'ὗ',
  'Ὑ' => 'Ὑ',
  'Ὓ' => 'Ὓ',
  'Ὕ' => 'Ὕ',
  'Ὗ' => 'Ὗ',
  'ὠ' => 'ὠ',
  'ὡ' => 'ὡ',
  'ὢ' => 'ὢ',
  'ὣ' => 'ὣ',
  'ὤ' => 'ὤ',
  'ὥ' => 'ὥ',
  'ὦ' => 'ὦ',
  'ὧ' => 'ὧ',
  'Ὠ' => 'Ὠ',
  'Ὡ' => 'Ὡ',
  'Ὢ' => 'Ὢ',
  'Ὣ' => 'Ὣ',
  'Ὤ' => 'Ὤ',
  'Ὥ' => 'Ὥ',
  'Ὦ' => 'Ὦ',
  'Ὧ' => 'Ὧ',
  'ὰ' => 'ὰ',
  'ὲ' => 'ὲ',
  'ὴ' => 'ὴ',
  'ὶ' => 'ὶ',
  'ὸ' => 'ὸ',
  'ὺ' => 'ὺ',
  'ὼ' => 'ὼ',
  'ᾀ' => 'ᾀ',
  'ᾁ' => 'ᾁ',
  'ᾂ' => 'ᾂ',
  'ᾃ' => 'ᾃ',
  'ᾄ' => 'ᾄ',
  'ᾅ' => 'ᾅ',
  'ᾆ' => 'ᾆ',
  'ᾇ' => 'ᾇ',
  'ᾈ' => 'ᾈ',
  'ᾉ' => 'ᾉ',
  'ᾊ' => 'ᾊ',
  'ᾋ' => 'ᾋ',
  'ᾌ' => 'ᾌ',
  'ᾍ' => 'ᾍ',
  'ᾎ' => 'ᾎ',
  'ᾏ' => 'ᾏ',
  'ᾐ' => 'ᾐ',
  'ᾑ' => 'ᾑ',
  'ᾒ' => 'ᾒ',
  'ᾓ' => 'ᾓ',
  'ᾔ' => 'ᾔ',
  'ᾕ' => 'ᾕ',
  'ᾖ' => 'ᾖ',
  'ᾗ' => 'ᾗ',
  'ᾘ' => 'ᾘ',
  'ᾙ' => 'ᾙ',
  'ᾚ' => 'ᾚ',
  'ᾛ' => 'ᾛ',
  'ᾜ' => 'ᾜ',
  'ᾝ' => 'ᾝ',
  'ᾞ' => 'ᾞ',
  'ᾟ' => 'ᾟ',
  'ᾠ' => 'ᾠ',
  'ᾡ' => 'ᾡ',
  'ᾢ' => 'ᾢ',
  'ᾣ' => 'ᾣ',
  'ᾤ' => 'ᾤ',
  'ᾥ' => 'ᾥ',
  'ᾦ' => 'ᾦ',
  'ᾧ' => 'ᾧ',
  'ᾨ' => 'ᾨ',
  'ᾩ' => 'ᾩ',
  'ᾪ' => 'ᾪ',
  'ᾫ' => 'ᾫ',
  'ᾬ' => 'ᾬ',
  'ᾭ' => 'ᾭ',
  'ᾮ' => 'ᾮ',
  'ᾯ' => 'ᾯ',
  'ᾰ' => 'ᾰ',
  'ᾱ' => 'ᾱ',
  'ᾲ' => 'ᾲ',
  'ᾳ' => 'ᾳ',
  'ᾴ' => 'ᾴ',
  'ᾶ' => 'ᾶ',
  'ᾷ' => 'ᾷ',
  'Ᾰ' => 'Ᾰ',
  'Ᾱ' => 'Ᾱ',
  'Ὰ' => 'Ὰ',
  'ᾼ' => 'ᾼ',
  '῁' => '῁',
  'ῂ' => 'ῂ',
  'ῃ' => 'ῃ',
  'ῄ' => 'ῄ',
  'ῆ' => 'ῆ',
  'ῇ' => 'ῇ',
  'Ὲ' => 'Ὲ',
  'Ὴ' => 'Ὴ',
  'ῌ' => 'ῌ',
  '῍' => '῍',
  '῎' => '῎',
  '῏' => '῏',
  'ῐ' => 'ῐ',
  'ῑ' => 'ῑ',
  'ῒ' => 'ῒ',
  'ῖ' => 'ῖ',
  'ῗ' => 'ῗ',
  'Ῐ' => 'Ῐ',
  'Ῑ' => 'Ῑ',
  'Ὶ' => 'Ὶ',
  '῝' => '῝',
  '῞' => '῞',
  '῟' => '῟',
  'ῠ' => 'ῠ',
  'ῡ' => 'ῡ',
  'ῢ' => 'ῢ',
  'ῤ' => 'ῤ',
  'ῥ' => 'ῥ',
  'ῦ' => 'ῦ',
  'ῧ' => 'ῧ',
  'Ῠ' => 'Ῠ',
  'Ῡ' => 'Ῡ',
  'Ὺ' => 'Ὺ',
  'Ῥ' => 'Ῥ',
  '῭' => '῭',
  'ῲ' => 'ῲ',
  'ῳ' => 'ῳ',
  'ῴ' => 'ῴ',
  'ῶ' => 'ῶ',
  'ῷ' => 'ῷ',
  'Ὸ' => 'Ὸ',
  'Ὼ' => 'Ὼ',
  'ῼ' => 'ῼ',
  '↚' => '↚',
  '↛' => '↛',
  '↮' => '↮',
  '⇍' => '⇍',
  '⇎' => '⇎',
  '⇏' => '⇏',
  '∄' => '∄',
  '∉' => '∉',
  '∌' => '∌',
  '∤' => '∤',
  '∦' => '∦',
  '≁' => '≁',
  '≄' => '≄',
  '≇' => '≇',
  '≉' => '≉',
  '≠' => '≠',
  '≢' => '≢',
  '≭' => '≭',
  '≮' => '≮',
  '≯' => '≯',
  '≰' => '≰',
  '≱' => '≱',
  '≴' => '≴',
  '≵' => '≵',
  '≸' => '≸',
  '≹' => '≹',
  '⊀' => '⊀',
  '⊁' => '⊁',
  '⊄' => '⊄',
  '⊅' => '⊅',
  '⊈' => '⊈',
  '⊉' => '⊉',
  '⊬' => '⊬',
  '⊭' => '⊭',
  '⊮' => '⊮',
  '⊯' => '⊯',
  '⋠' => '⋠',
  '⋡' => '⋡',
  '⋢' => '⋢',
  '⋣' => '⋣',
  '⋪' => '⋪',
  '⋫' => '⋫',
  '⋬' => '⋬',
  '⋭' => '⋭',
  'が' => 'が',
  'ぎ' => 'ぎ',
  'ぐ' => 'ぐ',
  'げ' => 'げ',
  'ご' => 'ご',
  'ざ' => 'ざ',
  'じ' => 'じ',
  'ず' => 'ず',
  'ぜ' => 'ぜ',
  'ぞ' => 'ぞ',
  'だ' => 'だ',
  'ぢ' => 'ぢ',
  'づ' => 'づ',
  'で' => 'で',
  'ど' => 'ど',
  'ば' => 'ば',
  'ぱ' => 'ぱ',
  'び' => 'び',
  'ぴ' => 'ぴ',
  'ぶ' => 'ぶ',
  'ぷ' => 'ぷ',
  'べ' => 'べ',
  'ぺ' => 'ぺ',
  'ぼ' => 'ぼ',
  'ぽ' => 'ぽ',
  'ゔ' => 'ゔ',
  'ゞ' => 'ゞ',
  'ガ' => 'ガ',
  'ギ' => 'ギ',
  'グ' => 'グ',
  'ゲ' => 'ゲ',
  'ゴ' => 'ゴ',
  'ザ' => 'ザ',
  'ジ' => 'ジ',
  'ズ' => 'ズ',
  'ゼ' => 'ゼ',
  'ゾ' => 'ゾ',
  'ダ' => 'ダ',
  'ヂ' => 'ヂ',
  'ヅ' => 'ヅ',
  'デ' => 'デ',
  'ド' => 'ド',
  'バ' => 'バ',
  'パ' => 'パ',
  'ビ' => 'ビ',
  'ピ' => 'ピ',
  'ブ' => 'ブ',
  'プ' => 'プ',
  'ベ' => 'ベ',
  'ペ' => 'ペ',
  'ボ' => 'ボ',
  'ポ' => 'ポ',
  'ヴ' => 'ヴ',
  'ヷ' => 'ヷ',
  'ヸ' => 'ヸ',
  'ヹ' => 'ヹ',
  'ヺ' => 'ヺ',
  'ヾ' => 'ヾ',
  '𑂚' => '𑂚',
  '𑂜' => '𑂜',
  '𑂫' => '𑂫',
  '𑄮' => '𑄮',
  '𑄯' => '𑄯',
  '𑍋' => '𑍋',
  '𑍌' => '𑍌',
  '𑒻' => '𑒻',
  '𑒼' => '𑒼',
  '𑒾' => '𑒾',
  '𑖺' => '𑖺',
  '𑖻' => '𑖻',
  '𑤸' => '𑤸',
);
<?php

return array (
  'À' => 'À',
  'Á' => 'Á',
  'Â' => 'Â',
  'Ã' => 'Ã',
  'Ä' => 'Ä',
  'Å' => 'Å',
  'Ç' => 'Ç',
  'È' => 'È',
  'É' => 'É',
  'Ê' => 'Ê',
  'Ë' => 'Ë',
  'Ì' => 'Ì',
  'Í' => 'Í',
  'Î' => 'Î',
  'Ï' => 'Ï',
  'Ñ' => 'Ñ',
  'Ò' => 'Ò',
  'Ó' => 'Ó',
  'Ô' => 'Ô',
  'Õ' => 'Õ',
  'Ö' => 'Ö',
  'Ù' => 'Ù',
  'Ú' => 'Ú',
  'Û' => 'Û',
  'Ü' => 'Ü',
  'Ý' => 'Ý',
  'à' => 'à',
  'á' => 'á',
  'â' => 'â',
  'ã' => 'ã',
  'ä' => 'ä',
  'å' => 'å',
  'ç' => 'ç',
  'è' => 'è',
  'é' => 'é',
  'ê' => 'ê',
  'ë' => 'ë',
  'ì' => 'ì',
  'í' => 'í',
  'î' => 'î',
  'ï' => 'ï',
  'ñ' => 'ñ',
  'ò' => 'ò',
  'ó' => 'ó',
  'ô' => 'ô',
  'õ' => 'õ',
  'ö' => 'ö',
  'ù' => 'ù',
  'ú' => 'ú',
  'û' => 'û',
  'ü' => 'ü',
  'ý' => 'ý',
  'ÿ' => 'ÿ',
  'Ā' => 'Ā',
  'ā' => 'ā',
  'Ă' => 'Ă',
  'ă' => 'ă',
  'Ą' => 'Ą',
  'ą' => 'ą',
  'Ć' => 'Ć',
  'ć' => 'ć',
  'Ĉ' => 'Ĉ',
  'ĉ' => 'ĉ',
  'Ċ' => 'Ċ',
  'ċ' => 'ċ',
  'Č' => 'Č',
  'č' => 'č',
  'Ď' => 'Ď',
  'ď' => 'ď',
  'Ē' => 'Ē',
  'ē' => 'ē',
  'Ĕ' => 'Ĕ',
  'ĕ' => 'ĕ',
  'Ė' => 'Ė',
  'ė' => 'ė',
  'Ę' => 'Ę',
  'ę' => 'ę',
  'Ě' => 'Ě',
  'ě' => 'ě',
  'Ĝ' => 'Ĝ',
  'ĝ' => 'ĝ',
  'Ğ' => 'Ğ',
  'ğ' => 'ğ',
  'Ġ' => 'Ġ',
  'ġ' => 'ġ',
  'Ģ' => 'Ģ',
  'ģ' => 'ģ',
  'Ĥ' => 'Ĥ',
  'ĥ' => 'ĥ',
  'Ĩ' => 'Ĩ',
  'ĩ' => 'ĩ',
  'Ī' => 'Ī',
  'ī' => 'ī',
  'Ĭ' => 'Ĭ',
  'ĭ' => 'ĭ',
  'Į' => 'Į',
  'į' => 'į',
  'İ' => 'İ',
  'Ĵ' => 'Ĵ',
  'ĵ' => 'ĵ',
  'Ķ' => 'Ķ',
  'ķ' => 'ķ',
  'Ĺ' => 'Ĺ',
  'ĺ' => 'ĺ',
  'Ļ' => 'Ļ',
  'ļ' => 'ļ',
  'Ľ' => 'Ľ',
  'ľ' => 'ľ',
  'Ń' => 'Ń',
  'ń' => 'ń',
  'Ņ' => 'Ņ',
  'ņ' => 'ņ',
  'Ň' => 'Ň',
  'ň' => 'ň',
  'Ō' => 'Ō',
  'ō' => 'ō',
  'Ŏ' => 'Ŏ',
  'ŏ' => 'ŏ',
  'Ő' => 'Ő',
  'ő' => 'ő',
  'Ŕ' => 'Ŕ',
  'ŕ' => 'ŕ',
  'Ŗ' => 'Ŗ',
  'ŗ' => 'ŗ',
  'Ř' => 'Ř',
  'ř' => 'ř',
  'Ś' => 'Ś',
  'ś' => 'ś',
  'Ŝ' => 'Ŝ',
  'ŝ' => 'ŝ',
  'Ş' => 'Ş',
  'ş' => 'ş',
  'Š' => 'Š',
  'š' => 'š',
  'Ţ' => 'Ţ',
  'ţ' => 'ţ',
  'Ť' => 'Ť',
  'ť' => 'ť',
  'Ũ' => 'Ũ',
  'ũ' => 'ũ',
  'Ū' => 'Ū',
  'ū' => 'ū',
  'Ŭ' => 'Ŭ',
  'ŭ' => 'ŭ',
  'Ů' => 'Ů',
  'ů' => 'ů',
  'Ű' => 'Ű',
  'ű' => 'ű',
  'Ų' => 'Ų',
  'ų' => 'ų',
  'Ŵ' => 'Ŵ',
  'ŵ' => 'ŵ',
  'Ŷ' => 'Ŷ',
  'ŷ' => 'ŷ',
  'Ÿ' => 'Ÿ',
  'Ź' => 'Ź',
  'ź' => 'ź',
  'Ż' => 'Ż',
  'ż' => 'ż',
  'Ž' => 'Ž',
  'ž' => 'ž',
  'Ơ' => 'Ơ',
  'ơ' => 'ơ',
  'Ư' => 'Ư',
  'ư' => 'ư',
  'Ǎ' => 'Ǎ',
  'ǎ' => 'ǎ',
  'Ǐ' => 'Ǐ',
  'ǐ' => 'ǐ',
  'Ǒ' => 'Ǒ',
  'ǒ' => 'ǒ',
  'Ǔ' => 'Ǔ',
  'ǔ' => 'ǔ',
  'Ǖ' => 'Ǖ',
  'ǖ' => 'ǖ',
  'Ǘ' => 'Ǘ',
  'ǘ' => 'ǘ',
  'Ǚ' => 'Ǚ',
  'ǚ' => 'ǚ',
  'Ǜ' => 'Ǜ',
  'ǜ' => 'ǜ',
  'Ǟ' => 'Ǟ',
  'ǟ' => 'ǟ',
  'Ǡ' => 'Ǡ',
  'ǡ' => 'ǡ',
  'Ǣ' => 'Ǣ',
  'ǣ' => 'ǣ',
  'Ǧ' => 'Ǧ',
  'ǧ' => 'ǧ',
  'Ǩ' => 'Ǩ',
  'ǩ' => 'ǩ',
  'Ǫ' => 'Ǫ',
  'ǫ' => 'ǫ',
  'Ǭ' => 'Ǭ',
  'ǭ' => 'ǭ',
  'Ǯ' => 'Ǯ',
  'ǯ' => 'ǯ',
  'ǰ' => 'ǰ',
  'Ǵ' => 'Ǵ',
  'ǵ' => 'ǵ',
  'Ǹ' => 'Ǹ',
  'ǹ' => 'ǹ',
  'Ǻ' => 'Ǻ',
  'ǻ' => 'ǻ',
  'Ǽ' => 'Ǽ',
  'ǽ' => 'ǽ',
  'Ǿ' => 'Ǿ',
  'ǿ' => 'ǿ',
  'Ȁ' => 'Ȁ',
  'ȁ' => 'ȁ',
  'Ȃ' => 'Ȃ',
  'ȃ' => 'ȃ',
  'Ȅ' => 'Ȅ',
  'ȅ' => 'ȅ',
  'Ȇ' => 'Ȇ',
  'ȇ' => 'ȇ',
  'Ȉ' => 'Ȉ',
  'ȉ' => 'ȉ',
  'Ȋ' => 'Ȋ',
  'ȋ' => 'ȋ',
  'Ȍ' => 'Ȍ',
  'ȍ' => 'ȍ',
  'Ȏ' => 'Ȏ',
  'ȏ' => 'ȏ',
  'Ȑ' => 'Ȑ',
  'ȑ' => 'ȑ',
  'Ȓ' => 'Ȓ',
  'ȓ' => 'ȓ',
  'Ȕ' => 'Ȕ',
  'ȕ' => 'ȕ',
  'Ȗ' => 'Ȗ',
  'ȗ' => 'ȗ',
  'Ș' => 'Ș',
  'ș' => 'ș',
  'Ț' => 'Ț',
  'ț' => 'ț',
  'Ȟ' => 'Ȟ',
  'ȟ' => 'ȟ',
  'Ȧ' => 'Ȧ',
  'ȧ' => 'ȧ',
  'Ȩ' => 'Ȩ',
  'ȩ' => 'ȩ',
  'Ȫ' => 'Ȫ',
  'ȫ' => 'ȫ',
  'Ȭ' => 'Ȭ',
  'ȭ' => 'ȭ',
  'Ȯ' => 'Ȯ',
  'ȯ' => 'ȯ',
  'Ȱ' => 'Ȱ',
  'ȱ' => 'ȱ',
  'Ȳ' => 'Ȳ',
  'ȳ' => 'ȳ',
  '̀' => '̀',
  '́' => '́',
  '̓' => '̓',
  '̈́' => '̈́',
  'ʹ' => 'ʹ',
  ';' => ';',
  '΅' => '΅',
  'Ά' => 'Ά',
  '·' => '·',
  'Έ' => 'Έ',
  'Ή' => 'Ή',
  'Ί' => 'Ί',
  'Ό' => 'Ό',
  'Ύ' => 'Ύ',
  'Ώ' => 'Ώ',
  'ΐ' => 'ΐ',
  'Ϊ' => 'Ϊ',
  'Ϋ' => 'Ϋ',
  'ά' => 'ά',
  'έ' => 'έ',
  'ή' => 'ή',
  'ί' => 'ί',
  'ΰ' => 'ΰ',
  'ϊ' => 'ϊ',
  'ϋ' => 'ϋ',
  'ό' => 'ό',
  'ύ' => 'ύ',
  'ώ' => 'ώ',
  'ϓ' => 'ϓ',
  'ϔ' => 'ϔ',
  'Ѐ' => 'Ѐ',
  'Ё' => 'Ё',
  'Ѓ' => 'Ѓ',
  'Ї' => 'Ї',
  'Ќ' => 'Ќ',
  'Ѝ' => 'Ѝ',
  'Ў' => 'Ў',
  'Й' => 'Й',
  'й' => 'й',
  'ѐ' => 'ѐ',
  'ё' => 'ё',
  'ѓ' => 'ѓ',
  'ї' => 'ї',
  'ќ' => 'ќ',
  'ѝ' => 'ѝ',
  'ў' => 'ў',
  'Ѷ' => 'Ѷ',
  'ѷ' => 'ѷ',
  'Ӂ' => 'Ӂ',
  'ӂ' => 'ӂ',
  'Ӑ' => 'Ӑ',
  'ӑ' => 'ӑ',
  'Ӓ' => 'Ӓ',
  'ӓ' => 'ӓ',
  'Ӗ' => 'Ӗ',
  'ӗ' => 'ӗ',
  'Ӛ' => 'Ӛ',
  'ӛ' => 'ӛ',
  'Ӝ' => 'Ӝ',
  'ӝ' => 'ӝ',
  'Ӟ' => 'Ӟ',
  'ӟ' => 'ӟ',
  'Ӣ' => 'Ӣ',
  'ӣ' => 'ӣ',
  'Ӥ' => 'Ӥ',
  'ӥ' => 'ӥ',
  'Ӧ' => 'Ӧ',
  'ӧ' => 'ӧ',
  'Ӫ' => 'Ӫ',
  'ӫ' => 'ӫ',
  'Ӭ' => 'Ӭ',
  'ӭ' => 'ӭ',
  'Ӯ' => 'Ӯ',
  'ӯ' => 'ӯ',
  'Ӱ' => 'Ӱ',
  'ӱ' => 'ӱ',
  'Ӳ' => 'Ӳ',
  'ӳ' => 'ӳ',
  'Ӵ' => 'Ӵ',
  'ӵ' => 'ӵ',
  'Ӹ' => 'Ӹ',
  'ӹ' => 'ӹ',
  'آ' => 'آ',
  'أ' => 'أ',
  'ؤ' => 'ؤ',
  'إ' => 'إ',
  'ئ' => 'ئ',
  'ۀ' => 'ۀ',
  'ۂ' => 'ۂ',
  'ۓ' => 'ۓ',
  'ऩ' => 'ऩ',
  'ऱ' => 'ऱ',
  'ऴ' => 'ऴ',
  'क़' => 'क़',
  'ख़' => 'ख़',
  'ग़' => 'ग़',
  'ज़' => 'ज़',
  'ड़' => 'ड़',
  'ढ़' => 'ढ़',
  'फ़' => 'फ़',
  'य़' => 'य़',
  'ো' => 'ো',
  'ৌ' => 'ৌ',
  'ড়' => 'ড়',
  'ঢ়' => 'ঢ়',
  'য়' => 'য়',
  'ਲ਼' => 'ਲ਼',
  'ਸ਼' => 'ਸ਼',
  'ਖ਼' => 'ਖ਼',
  'ਗ਼' => 'ਗ਼',
  'ਜ਼' => 'ਜ਼',
  'ਫ਼' => 'ਫ਼',
  'ୈ' => 'ୈ',
  'ୋ' => 'ୋ',
  'ୌ' => 'ୌ',
  'ଡ଼' => 'ଡ଼',
  'ଢ଼' => 'ଢ଼',
  'ஔ' => 'ஔ',
  'ொ' => 'ொ',
  'ோ' => 'ோ',
  'ௌ' => 'ௌ',
  'ై' => 'ై',
  'ೀ' => 'ೀ',
  'ೇ' => 'ೇ',
  'ೈ' => 'ೈ',
  'ೊ' => 'ೊ',
  'ೋ' => 'ೋ',
  'ൊ' => 'ൊ',
  'ോ' => 'ോ',
  'ൌ' => 'ൌ',
  'ේ' => 'ේ',
  'ො' => 'ො',
  'ෝ' => 'ෝ',
  'ෞ' => 'ෞ',
  'གྷ' => 'གྷ',
  'ཌྷ' => 'ཌྷ',
  'དྷ' => 'དྷ',
  'བྷ' => 'བྷ',
  'ཛྷ' => 'ཛྷ',
  'ཀྵ' => 'ཀྵ',
  'ཱི' => 'ཱི',
  'ཱུ' => 'ཱུ',
  'ྲྀ' => 'ྲྀ',
  'ླྀ' => 'ླྀ',
  'ཱྀ' => 'ཱྀ',
  'ྒྷ' => 'ྒྷ',
  'ྜྷ' => 'ྜྷ',
  'ྡྷ' => 'ྡྷ',
  'ྦྷ' => 'ྦྷ',
  'ྫྷ' => 'ྫྷ',
  'ྐྵ' => 'ྐྵ',
  'ဦ' => 'ဦ',
  'ᬆ' => 'ᬆ',
  'ᬈ' => 'ᬈ',
  'ᬊ' => 'ᬊ',
  'ᬌ' => 'ᬌ',
  'ᬎ' => 'ᬎ',
  'ᬒ' => 'ᬒ',
  'ᬻ' => 'ᬻ',
  'ᬽ' => 'ᬽ',
  'ᭀ' => 'ᭀ',
  'ᭁ' => 'ᭁ',
  'ᭃ' => 'ᭃ',
  'Ḁ' => 'Ḁ',
  'ḁ' => 'ḁ',
  'Ḃ' => 'Ḃ',
  'ḃ' => 'ḃ',
  'Ḅ' => 'Ḅ',
  'ḅ' => 'ḅ',
  'Ḇ' => 'Ḇ',
  'ḇ' => 'ḇ',
  'Ḉ' => 'Ḉ',
  'ḉ' => 'ḉ',
  'Ḋ' => 'Ḋ',
  'ḋ' => 'ḋ',
  'Ḍ' => 'Ḍ',
  'ḍ' => 'ḍ',
  'Ḏ' => 'Ḏ',
  'ḏ' => 'ḏ',
  'Ḑ' => 'Ḑ',
  'ḑ' => 'ḑ',
  'Ḓ' => 'Ḓ',
  'ḓ' => 'ḓ',
  'Ḕ' => 'Ḕ',
  'ḕ' => 'ḕ',
  'Ḗ' => 'Ḗ',
  'ḗ' => 'ḗ',
  'Ḙ' => 'Ḙ',
  'ḙ' => 'ḙ',
  'Ḛ' => 'Ḛ',
  'ḛ' => 'ḛ',
  'Ḝ' => 'Ḝ',
  'ḝ' => 'ḝ',
  'Ḟ' => 'Ḟ',
  'ḟ' => 'ḟ',
  'Ḡ' => 'Ḡ',
  'ḡ' => 'ḡ',
  'Ḣ' => 'Ḣ',
  'ḣ' => 'ḣ',
  'Ḥ' => 'Ḥ',
  'ḥ' => 'ḥ',
  'Ḧ' => 'Ḧ',
  'ḧ' => 'ḧ',
  'Ḩ' => 'Ḩ',
  'ḩ' => 'ḩ',
  'Ḫ' => 'Ḫ',
  'ḫ' => 'ḫ',
  'Ḭ' => 'Ḭ',
  'ḭ' => 'ḭ',
  'Ḯ' => 'Ḯ',
  'ḯ' => 'ḯ',
  'Ḱ' => 'Ḱ',
  'ḱ' => 'ḱ',
  'Ḳ' => 'Ḳ',
  'ḳ' => 'ḳ',
  'Ḵ' => 'Ḵ',
  'ḵ' => 'ḵ',
  'Ḷ' => 'Ḷ',
  'ḷ' => 'ḷ',
  'Ḹ' => 'Ḹ',
  'ḹ' => 'ḹ',
  'Ḻ' => 'Ḻ',
  'ḻ' => 'ḻ',
  'Ḽ' => 'Ḽ',
  'ḽ' => 'ḽ',
  'Ḿ' => 'Ḿ',
  'ḿ' => 'ḿ',
  'Ṁ' => 'Ṁ',
  'ṁ' => 'ṁ',
  'Ṃ' => 'Ṃ',
  'ṃ' => 'ṃ',
  'Ṅ' => 'Ṅ',
  'ṅ' => 'ṅ',
  'Ṇ' => 'Ṇ',
  'ṇ' => 'ṇ',
  'Ṉ' => 'Ṉ',
  'ṉ' => 'ṉ',
  'Ṋ' => 'Ṋ',
  'ṋ' => 'ṋ',
  'Ṍ' => 'Ṍ',
  'ṍ' => 'ṍ',
  'Ṏ' => 'Ṏ',
  'ṏ' => 'ṏ',
  'Ṑ' => 'Ṑ',
  'ṑ' => 'ṑ',
  'Ṓ' => 'Ṓ',
  'ṓ' => 'ṓ',
  'Ṕ' => 'Ṕ',
  'ṕ' => 'ṕ',
  'Ṗ' => 'Ṗ',
  'ṗ' => 'ṗ',
  'Ṙ' => 'Ṙ',
  'ṙ' => 'ṙ',
  'Ṛ' => 'Ṛ',
  'ṛ' => 'ṛ',
  'Ṝ' => 'Ṝ',
  'ṝ' => 'ṝ',
  'Ṟ' => 'Ṟ',
  'ṟ' => 'ṟ',
  'Ṡ' => 'Ṡ',
  'ṡ' => 'ṡ',
  'Ṣ' => 'Ṣ',
  'ṣ' => 'ṣ',
  'Ṥ' => 'Ṥ',
  'ṥ' => 'ṥ',
  'Ṧ' => 'Ṧ',
  'ṧ' => 'ṧ',
  'Ṩ' => 'Ṩ',
  'ṩ' => 'ṩ',
  'Ṫ' => 'Ṫ',
  'ṫ' => 'ṫ',
  'Ṭ' => 'Ṭ',
  'ṭ' => 'ṭ',
  'Ṯ' => 'Ṯ',
  'ṯ' => 'ṯ',
  'Ṱ' => 'Ṱ',
  'ṱ' => 'ṱ',
  'Ṳ' => 'Ṳ',
  'ṳ' => 'ṳ',
  'Ṵ' => 'Ṵ',
  'ṵ' => 'ṵ',
  'Ṷ' => 'Ṷ',
  'ṷ' => 'ṷ',
  'Ṹ' => 'Ṹ',
  'ṹ' => 'ṹ',
  'Ṻ' => 'Ṻ',
  'ṻ' => 'ṻ',
  'Ṽ' => 'Ṽ',
  'ṽ' => 'ṽ',
  'Ṿ' => 'Ṿ',
  'ṿ' => 'ṿ',
  'Ẁ' => 'Ẁ',
  'ẁ' => 'ẁ',
  'Ẃ' => 'Ẃ',
  'ẃ' => 'ẃ',
  'Ẅ' => 'Ẅ',
  'ẅ' => 'ẅ',
  'Ẇ' => 'Ẇ',
  'ẇ' => 'ẇ',
  'Ẉ' => 'Ẉ',
  'ẉ' => 'ẉ',
  'Ẋ' => 'Ẋ',
  'ẋ' => 'ẋ',
  'Ẍ' => 'Ẍ',
  'ẍ' => 'ẍ',
  'Ẏ' => 'Ẏ',
  'ẏ' => 'ẏ',
  'Ẑ' => 'Ẑ',
  'ẑ' => 'ẑ',
  'Ẓ' => 'Ẓ',
  'ẓ' => 'ẓ',
  'Ẕ' => 'Ẕ',
  'ẕ' => 'ẕ',
  'ẖ' => 'ẖ',
  'ẗ' => 'ẗ',
  'ẘ' => 'ẘ',
  'ẙ' => 'ẙ',
  'ẛ' => 'ẛ',
  'Ạ' => 'Ạ',
  'ạ' => 'ạ',
  'Ả' => 'Ả',
  'ả' => 'ả',
  'Ấ' => 'Ấ',
  'ấ' => 'ấ',
  'Ầ' => 'Ầ',
  'ầ' => 'ầ',
  'Ẩ' => 'Ẩ',
  'ẩ' => 'ẩ',
  'Ẫ' => 'Ẫ',
  'ẫ' => 'ẫ',
  'Ậ' => 'Ậ',
  'ậ' => 'ậ',
  'Ắ' => 'Ắ',
  'ắ' => 'ắ',
  'Ằ' => 'Ằ',
  'ằ' => 'ằ',
  'Ẳ' => 'Ẳ',
  'ẳ' => 'ẳ',
  'Ẵ' => 'Ẵ',
  'ẵ' => 'ẵ',
  'Ặ' => 'Ặ',
  'ặ' => 'ặ',
  'Ẹ' => 'Ẹ',
  'ẹ' => 'ẹ',
  'Ẻ' => 'Ẻ',
  'ẻ' => 'ẻ',
  'Ẽ' => 'Ẽ',
  'ẽ' => 'ẽ',
  'Ế' => 'Ế',
  'ế' => 'ế',
  'Ề' => 'Ề',
  'ề' => 'ề',
  'Ể' => 'Ể',
  'ể' => 'ể',
  'Ễ' => 'Ễ',
  'ễ' => 'ễ',
  'Ệ' => 'Ệ',
  'ệ' => 'ệ',
  'Ỉ' => 'Ỉ',
  'ỉ' => 'ỉ',
  'Ị' => 'Ị',
  'ị' => 'ị',
  'Ọ' => 'Ọ',
  'ọ' => 'ọ',
  'Ỏ' => 'Ỏ',
  'ỏ' => 'ỏ',
  'Ố' => 'Ố',
  'ố' => 'ố',
  'Ồ' => 'Ồ',
  'ồ' => 'ồ',
  'Ổ' => 'Ổ',
  'ổ' => 'ổ',
  'Ỗ' => 'Ỗ',
  'ỗ' => 'ỗ',
  'Ộ' => 'Ộ',
  'ộ' => 'ộ',
  'Ớ' => 'Ớ',
  'ớ' => 'ớ',
  'Ờ' => 'Ờ',
  'ờ' => 'ờ',
  'Ở' => 'Ở',
  'ở' => 'ở',
  'Ỡ' => 'Ỡ',
  'ỡ' => 'ỡ',
  'Ợ' => 'Ợ',
  'ợ' => 'ợ',
  'Ụ' => 'Ụ',
  'ụ' => 'ụ',
  'Ủ' => 'Ủ',
  'ủ' => 'ủ',
  'Ứ' => 'Ứ',
  'ứ' => 'ứ',
  'Ừ' => 'Ừ',
  'ừ' => 'ừ',
  'Ử' => 'Ử',
  'ử' => 'ử',
  'Ữ' => 'Ữ',
  'ữ' => 'ữ',
  'Ự' => 'Ự',
  'ự' => 'ự',
  'Ỳ' => 'Ỳ',
  'ỳ' => 'ỳ',
  'Ỵ' => 'Ỵ',
  'ỵ' => 'ỵ',
  'Ỷ' => 'Ỷ',
  'ỷ' => 'ỷ',
  'Ỹ' => 'Ỹ',
  'ỹ' => 'ỹ',
  'ἀ' => 'ἀ',
  'ἁ' => 'ἁ',
  'ἂ' => 'ἂ',
  'ἃ' => 'ἃ',
  'ἄ' => 'ἄ',
  'ἅ' => 'ἅ',
  'ἆ' => 'ἆ',
  'ἇ' => 'ἇ',
  'Ἀ' => 'Ἀ',
  'Ἁ' => 'Ἁ',
  'Ἂ' => 'Ἂ',
  'Ἃ' => 'Ἃ',
  'Ἄ' => 'Ἄ',
  'Ἅ' => 'Ἅ',
  'Ἆ' => 'Ἆ',
  'Ἇ' => 'Ἇ',
  'ἐ' => 'ἐ',
  'ἑ' => 'ἑ',
  'ἒ' => 'ἒ',
  'ἓ' => 'ἓ',
  'ἔ' => 'ἔ',
  'ἕ' => 'ἕ',
  'Ἐ' => 'Ἐ',
  'Ἑ' => 'Ἑ',
  'Ἒ' => 'Ἒ',
  'Ἓ' => 'Ἓ',
  'Ἔ' => 'Ἔ',
  'Ἕ' => 'Ἕ',
  'ἠ' => 'ἠ',
  'ἡ' => 'ἡ',
  'ἢ' => 'ἢ',
  'ἣ' => 'ἣ',
  'ἤ' => 'ἤ',
  'ἥ' => 'ἥ',
  'ἦ' => 'ἦ',
  'ἧ' => 'ἧ',
  'Ἠ' => 'Ἠ',
  'Ἡ' => 'Ἡ',
  'Ἢ' => 'Ἢ',
  'Ἣ' => 'Ἣ',
  'Ἤ' => 'Ἤ',
  'Ἥ' => 'Ἥ',
  'Ἦ' => 'Ἦ',
  'Ἧ' => 'Ἧ',
  'ἰ' => 'ἰ',
  'ἱ' => 'ἱ',
  'ἲ' => 'ἲ',
  'ἳ' => 'ἳ',
  'ἴ' => 'ἴ',
  'ἵ' => 'ἵ',
  'ἶ' => 'ἶ',
  'ἷ' => 'ἷ',
  'Ἰ' => 'Ἰ',
  'Ἱ' => 'Ἱ',
  'Ἲ' => 'Ἲ',
  'Ἳ' => 'Ἳ',
  'Ἴ' => 'Ἴ',
  'Ἵ' => 'Ἵ',
  'Ἶ' => 'Ἶ',
  'Ἷ' => 'Ἷ',
  'ὀ' => 'ὀ',
  'ὁ' => 'ὁ',
  'ὂ' => 'ὂ',
  'ὃ' => 'ὃ',
  'ὄ' => 'ὄ',
  'ὅ' => 'ὅ',
  'Ὀ' => 'Ὀ',
  'Ὁ' => 'Ὁ',
  'Ὂ' => 'Ὂ',
  'Ὃ' => 'Ὃ',
  'Ὄ' => 'Ὄ',
  'Ὅ' => 'Ὅ',
  'ὐ' => 'ὐ',
  'ὑ' => 'ὑ',
  'ὒ' => 'ὒ',
  'ὓ' => 'ὓ',
  'ὔ' => 'ὔ',
  'ὕ' => 'ὕ',
  'ὖ' => 'ὖ',
  'ὗ' => 'ὗ',
  'Ὑ' => 'Ὑ',
  'Ὓ' => 'Ὓ',
  'Ὕ' => 'Ὕ',
  'Ὗ' => 'Ὗ',
  'ὠ' => 'ὠ',
  'ὡ' => 'ὡ',
  'ὢ' => 'ὢ',
  'ὣ' => 'ὣ',
  'ὤ' => 'ὤ',
  'ὥ' => 'ὥ',
  'ὦ' => 'ὦ',
  'ὧ' => 'ὧ',
  'Ὠ' => 'Ὠ',
  'Ὡ' => 'Ὡ',
  'Ὢ' => 'Ὢ',
  'Ὣ' => 'Ὣ',
  'Ὤ' => 'Ὤ',
  'Ὥ' => 'Ὥ',
  'Ὦ' => 'Ὦ',
  'Ὧ' => 'Ὧ',
  'ὰ' => 'ὰ',
  'ά' => 'ά',
  'ὲ' => 'ὲ',
  'έ' => 'έ',
  'ὴ' => 'ὴ',
  'ή' => 'ή',
  'ὶ' => 'ὶ',
  'ί' => 'ί',
  'ὸ' => 'ὸ',
  'ό' => 'ό',
  'ὺ' => 'ὺ',
  'ύ' => 'ύ',
  'ὼ' => 'ὼ',
  'ώ' => 'ώ',
  'ᾀ' => 'ᾀ',
  'ᾁ' => 'ᾁ',
  'ᾂ' => 'ᾂ',
  'ᾃ' => 'ᾃ',
  'ᾄ' => 'ᾄ',
  'ᾅ' => 'ᾅ',
  'ᾆ' => 'ᾆ',
  'ᾇ' => 'ᾇ',
  'ᾈ' => 'ᾈ',
  'ᾉ' => 'ᾉ',
  'ᾊ' => 'ᾊ',
  'ᾋ' => 'ᾋ',
  'ᾌ' => 'ᾌ',
  'ᾍ' => 'ᾍ',
  'ᾎ' => 'ᾎ',
  'ᾏ' => 'ᾏ',
  'ᾐ' => 'ᾐ',
  'ᾑ' => 'ᾑ',
  'ᾒ' => 'ᾒ',
  'ᾓ' => 'ᾓ',
  'ᾔ' => 'ᾔ',
  'ᾕ' => 'ᾕ',
  'ᾖ' => 'ᾖ',
  'ᾗ' => 'ᾗ',
  'ᾘ' => 'ᾘ',
  'ᾙ' => 'ᾙ',
  'ᾚ' => 'ᾚ',
  'ᾛ' => 'ᾛ',
  'ᾜ' => 'ᾜ',
  'ᾝ' => 'ᾝ',
  'ᾞ' => 'ᾞ',
  'ᾟ' => 'ᾟ',
  'ᾠ' => 'ᾠ',
  'ᾡ' => 'ᾡ',
  'ᾢ' => 'ᾢ',
  'ᾣ' => 'ᾣ',
  'ᾤ' => 'ᾤ',
  'ᾥ' => 'ᾥ',
  'ᾦ' => 'ᾦ',
  'ᾧ' => 'ᾧ',
  'ᾨ' => 'ᾨ',
  'ᾩ' => 'ᾩ',
  'ᾪ' => 'ᾪ',
  'ᾫ' => 'ᾫ',
  'ᾬ' => 'ᾬ',
  'ᾭ' => 'ᾭ',
  'ᾮ' => 'ᾮ',
  'ᾯ' => 'ᾯ',
  'ᾰ' => 'ᾰ',
  'ᾱ' => 'ᾱ',
  'ᾲ' => 'ᾲ',
  'ᾳ' => 'ᾳ',
  'ᾴ' => 'ᾴ',
  'ᾶ' => 'ᾶ',
  'ᾷ' => 'ᾷ',
  'Ᾰ' => 'Ᾰ',
  'Ᾱ' => 'Ᾱ',
  'Ὰ' => 'Ὰ',
  'Ά' => 'Ά',
  'ᾼ' => 'ᾼ',
  'ι' => 'ι',
  '῁' => '῁',
  'ῂ' => 'ῂ',
  'ῃ' => 'ῃ',
  'ῄ' => 'ῄ',
  'ῆ' => 'ῆ',
  'ῇ' => 'ῇ',
  'Ὲ' => 'Ὲ',
  'Έ' => 'Έ',
  'Ὴ' => 'Ὴ',
  'Ή' => 'Ή',
  'ῌ' => 'ῌ',
  '῍' => '῍',
  '῎' => '῎',
  '῏' => '῏',
  'ῐ' => 'ῐ',
  'ῑ' => 'ῑ',
  'ῒ' => 'ῒ',
  'ΐ' => 'ΐ',
  'ῖ' => 'ῖ',
  'ῗ' => 'ῗ',
  'Ῐ' => 'Ῐ',
  'Ῑ' => 'Ῑ',
  'Ὶ' => 'Ὶ',
  'Ί' => 'Ί',
  '῝' => '῝',
  '῞' => '῞',
  '῟' => '῟',
  'ῠ' => 'ῠ',
  'ῡ' => 'ῡ',
  'ῢ' => 'ῢ',
  'ΰ' => 'ΰ',
  'ῤ' => 'ῤ',
  'ῥ' => 'ῥ',
  'ῦ' => 'ῦ',
  'ῧ' => 'ῧ',
  'Ῠ' => 'Ῠ',
  'Ῡ' => 'Ῡ',
  'Ὺ' => 'Ὺ',
  'Ύ' => 'Ύ',
  'Ῥ' => 'Ῥ',
  '῭' => '῭',
  '΅' => '΅',
  '`' => '`',
  'ῲ' => 'ῲ',
  'ῳ' => 'ῳ',
  'ῴ' => 'ῴ',
  'ῶ' => 'ῶ',
  'ῷ' => 'ῷ',
  'Ὸ' => 'Ὸ',
  'Ό' => 'Ό',
  'Ὼ' => 'Ὼ',
  'Ώ' => 'Ώ',
  'ῼ' => 'ῼ',
  '´' => '´',
  ' ' => ' ',
  ' ' => ' ',
  'Ω' => 'Ω',
  'K' => 'K',
  'Å' => 'Å',
  '↚' => '↚',
  '↛' => '↛',
  '↮' => '↮',
  '⇍' => '⇍',
  '⇎' => '⇎',
  '⇏' => '⇏',
  '∄' => '∄',
  '∉' => '∉',
  '∌' => '∌',
  '∤' => '∤',
  '∦' => '∦',
  '≁' => '≁',
  '≄' => '≄',
  '≇' => '≇',
  '≉' => '≉',
  '≠' => '≠',
  '≢' => '≢',
  '≭' => '≭',
  '≮' => '≮',
  '≯' => '≯',
  '≰' => '≰',
  '≱' => '≱',
  '≴' => '≴',
  '≵' => '≵',
  '≸' => '≸',
  '≹' => '≹',
  '⊀' => '⊀',
  '⊁' => '⊁',
  '⊄' => '⊄',
  '⊅' => '⊅',
  '⊈' => '⊈',
  '⊉' => '⊉',
  '⊬' => '⊬',
  '⊭' => '⊭',
  '⊮' => '⊮',
  '⊯' => '⊯',
  '⋠' => '⋠',
  '⋡' => '⋡',
  '⋢' => '⋢',
  '⋣' => '⋣',
  '⋪' => '⋪',
  '⋫' => '⋫',
  '⋬' => '⋬',
  '⋭' => '⋭',
  '〈' => '〈',
  '〉' => '〉',
  '⫝̸' => '⫝̸',
  'が' => 'が',
  'ぎ' => 'ぎ',
  'ぐ' => 'ぐ',
  'げ' => 'げ',
  'ご' => 'ご',
  'ざ' => 'ざ',
  'じ' => 'じ',
  'ず' => 'ず',
  'ぜ' => 'ぜ',
  'ぞ' => 'ぞ',
  'だ' => 'だ',
  'ぢ' => 'ぢ',
  'づ' => 'づ',
  'で' => 'で',
  'ど' => 'ど',
  'ば' => 'ば',
  'ぱ' => 'ぱ',
  'び' => 'び',
  'ぴ' => 'ぴ',
  'ぶ' => 'ぶ',
  'ぷ' => 'ぷ',
  'べ' => 'べ',
  'ぺ' => 'ぺ',
  'ぼ' => 'ぼ',
  'ぽ' => 'ぽ',
  'ゔ' => 'ゔ',
  'ゞ' => 'ゞ',
  'ガ' => 'ガ',
  'ギ' => 'ギ',
  'グ' => 'グ',
  'ゲ' => 'ゲ',
  'ゴ' => 'ゴ',
  'ザ' => 'ザ',
  'ジ' => 'ジ',
  'ズ' => 'ズ',
  'ゼ' => 'ゼ',
  'ゾ' => 'ゾ',
  'ダ' => 'ダ',
  'ヂ' => 'ヂ',
  'ヅ' => 'ヅ',
  'デ' => 'デ',
  'ド' => 'ド',
  'バ' => 'バ',
  'パ' => 'パ',
  'ビ' => 'ビ',
  'ピ' => 'ピ',
  'ブ' => 'ブ',
  'プ' => 'プ',
  'ベ' => 'ベ',
  'ペ' => 'ペ',
  'ボ' => 'ボ',
  'ポ' => 'ポ',
  'ヴ' => 'ヴ',
  'ヷ' => 'ヷ',
  'ヸ' => 'ヸ',
  'ヹ' => 'ヹ',
  'ヺ' => 'ヺ',
  'ヾ' => 'ヾ',
  '豈' => '豈',
  '更' => '更',
  '車' => '車',
  '賈' => '賈',
  '滑' => '滑',
  '串' => '串',
  '句' => '句',
  '龜' => '龜',
  '龜' => '龜',
  '契' => '契',
  '金' => '金',
  '喇' => '喇',
  '奈' => '奈',
  '懶' => '懶',
  '癩' => '癩',
  '羅' => '羅',
  '蘿' => '蘿',
  '螺' => '螺',
  '裸' => '裸',
  '邏' => '邏',
  '樂' => '樂',
  '洛' => '洛',
  '烙' => '烙',
  '珞' => '珞',
  '落' => '落',
  '酪' => '酪',
  '駱' => '駱',
  '亂' => '亂',
  '卵' => '卵',
  '欄' => '欄',
  '爛' => '爛',
  '蘭' => '蘭',
  '鸞' => '鸞',
  '嵐' => '嵐',
  '濫' => '濫',
  '藍' => '藍',
  '襤' => '襤',
  '拉' => '拉',
  '臘' => '臘',
  '蠟' => '蠟',
  '廊' => '廊',
  '朗' => '朗',
  '浪' => '浪',
  '狼' => '狼',
  '郎' => '郎',
  '來' => '來',
  '冷' => '冷',
  '勞' => '勞',
  '擄' => '擄',
  '櫓' => '櫓',
  '爐' => '爐',
  '盧' => '盧',
  '老' => '老',
  '蘆' => '蘆',
  '虜' => '虜',
  '路' => '路',
  '露' => '露',
  '魯' => '魯',
  '鷺' => '鷺',
  '碌' => '碌',
  '祿' => '祿',
  '綠' => '綠',
  '菉' => '菉',
  '錄' => '錄',
  '鹿' => '鹿',
  '論' => '論',
  '壟' => '壟',
  '弄' => '弄',
  '籠' => '籠',
  '聾' => '聾',
  '牢' => '牢',
  '磊' => '磊',
  '賂' => '賂',
  '雷' => '雷',
  '壘' => '壘',
  '屢' => '屢',
  '樓' => '樓',
  '淚' => '淚',
  '漏' => '漏',
  '累' => '累',
  '縷' => '縷',
  '陋' => '陋',
  '勒' => '勒',
  '肋' => '肋',
  '凜' => '凜',
  '凌' => '凌',
  '稜' => '稜',
  '綾' => '綾',
  '菱' => '菱',
  '陵' => '陵',
  '讀' => '讀',
  '拏' => '拏',
  '樂' => '樂',
  '諾' => '諾',
  '丹' => '丹',
  '寧' => '寧',
  '怒' => '怒',
  '率' => '率',
  '異' => '異',
  '北' => '北',
  '磻' => '磻',
  '便' => '便',
  '復' => '復',
  '不' => '不',
  '泌' => '泌',
  '數' => '數',
  '索' => '索',
  '參' => '參',
  '塞' => '塞',
  '省' => '省',
  '葉' => '葉',
  '說' => '說',
  '殺' => '殺',
  '辰' => '辰',
  '沈' => '沈',
  '拾' => '拾',
  '若' => '若',
  '掠' => '掠',
  '略' => '略',
  '亮' => '亮',
  '兩' => '兩',
  '凉' => '凉',
  '梁' => '梁',
  '糧' => '糧',
  '良' => '良',
  '諒' => '諒',
  '量' => '量',
  '勵' => '勵',
  '呂' => '呂',
  '女' => '女',
  '廬' => '廬',
  '旅' => '旅',
  '濾' => '濾',
  '礪' => '礪',
  '閭' => '閭',
  '驪' => '驪',
  '麗' => '麗',
  '黎' => '黎',
  '力' => '力',
  '曆' => '曆',
  '歷' => '歷',
  '轢' => '轢',
  '年' => '年',
  '憐' => '憐',
  '戀' => '戀',
  '撚' => '撚',
  '漣' => '漣',
  '煉' => '煉',
  '璉' => '璉',
  '秊' => '秊',
  '練' => '練',
  '聯' => '聯',
  '輦' => '輦',
  '蓮' => '蓮',
  '連' => '連',
  '鍊' => '鍊',
  '列' => '列',
  '劣' => '劣',
  '咽' => '咽',
  '烈' => '烈',
  '裂' => '裂',
  '說' => '說',
  '廉' => '廉',
  '念' => '念',
  '捻' => '捻',
  '殮' => '殮',
  '簾' => '簾',
  '獵' => '獵',
  '令' => '令',
  '囹' => '囹',
  '寧' => '寧',
  '嶺' => '嶺',
  '怜' => '怜',
  '玲' => '玲',
  '瑩' => '瑩',
  '羚' => '羚',
  '聆' => '聆',
  '鈴' => '鈴',
  '零' => '零',
  '靈' => '靈',
  '領' => '領',
  '例' => '例',
  '禮' => '禮',
  '醴' => '醴',
  '隸' => '隸',
  '惡' => '惡',
  '了' => '了',
  '僚' => '僚',
  '寮' => '寮',
  '尿' => '尿',
  '料' => '料',
  '樂' => '樂',
  '燎' => '燎',
  '療' => '療',
  '蓼' => '蓼',
  '遼' => '遼',
  '龍' => '龍',
  '暈' => '暈',
  '阮' => '阮',
  '劉' => '劉',
  '杻' => '杻',
  '柳' => '柳',
  '流' => '流',
  '溜' => '溜',
  '琉' => '琉',
  '留' => '留',
  '硫' => '硫',
  '紐' => '紐',
  '類' => '類',
  '六' => '六',
  '戮' => '戮',
  '陸' => '陸',
  '倫' => '倫',
  '崙' => '崙',
  '淪' => '淪',
  '輪' => '輪',
  '律' => '律',
  '慄' => '慄',
  '栗' => '栗',
  '率' => '率',
  '隆' => '隆',
  '利' => '利',
  '吏' => '吏',
  '履' => '履',
  '易' => '易',
  '李' => '李',
  '梨' => '梨',
  '泥' => '泥',
  '理' => '理',
  '痢' => '痢',
  '罹' => '罹',
  '裏' => '裏',
  '裡' => '裡',
  '里' => '里',
  '離' => '離',
  '匿' => '匿',
  '溺' => '溺',
  '吝' => '吝',
  '燐' => '燐',
  '璘' => '璘',
  '藺' => '藺',
  '隣' => '隣',
  '鱗' => '鱗',
  '麟' => '麟',
  '林' => '林',
  '淋' => '淋',
  '臨' => '臨',
  '立' => '立',
  '笠' => '笠',
  '粒' => '粒',
  '狀' => '狀',
  '炙' => '炙',
  '識' => '識',
  '什' => '什',
  '茶' => '茶',
  '刺' => '刺',
  '切' => '切',
  '度' => '度',
  '拓' => '拓',
  '糖' => '糖',
  '宅' => '宅',
  '洞' => '洞',
  '暴' => '暴',
  '輻' => '輻',
  '行' => '行',
  '降' => '降',
  '見' => '見',
  '廓' => '廓',
  '兀' => '兀',
  '嗀' => '嗀',
  '塚' => '塚',
  '晴' => '晴',
  '凞' => '凞',
  '猪' => '猪',
  '益' => '益',
  '礼' => '礼',
  '神' => '神',
  '祥' => '祥',
  '福' => '福',
  '靖' => '靖',
  '精' => '精',
  '羽' => '羽',
  '蘒' => '蘒',
  '諸' => '諸',
  '逸' => '逸',
  '都' => '都',
  '飯' => '飯',
  '飼' => '飼',
  '館' => '館',
  '鶴' => '鶴',
  '郞' => '郞',
  '隷' => '隷',
  '侮' => '侮',
  '僧' => '僧',
  '免' => '免',
  '勉' => '勉',
  '勤' => '勤',
  '卑' => '卑',
  '喝' => '喝',
  '嘆' => '嘆',
  '器' => '器',
  '塀' => '塀',
  '墨' => '墨',
  '層' => '層',
  '屮' => '屮',
  '悔' => '悔',
  '慨' => '慨',
  '憎' => '憎',
  '懲' => '懲',
  '敏' => '敏',
  '既' => '既',
  '暑' => '暑',
  '梅' => '梅',
  '海' => '海',
  '渚' => '渚',
  '漢' => '漢',
  '煮' => '煮',
  '爫' => '爫',
  '琢' => '琢',
  '碑' => '碑',
  '社' => '社',
  '祉' => '祉',
  '祈' => '祈',
  '祐' => '祐',
  '祖' => '祖',
  '祝' => '祝',
  '禍' => '禍',
  '禎' => '禎',
  '穀' => '穀',
  '突' => '突',
  '節' => '節',
  '練' => '練',
  '縉' => '縉',
  '繁' => '繁',
  '署' => '署',
  '者' => '者',
  '臭' => '臭',
  '艹' => '艹',
  '艹' => '艹',
  '著' => '著',
  '褐' => '褐',
  '視' => '視',
  '謁' => '謁',
  '謹' => '謹',
  '賓' => '賓',
  '贈' => '贈',
  '辶' => '辶',
  '逸' => '逸',
  '難' => '難',
  '響' => '響',
  '頻' => '頻',
  '恵' => '恵',
  '𤋮' => '𤋮',
  '舘' => '舘',
  '並' => '並',
  '况' => '况',
  '全' => '全',
  '侀' => '侀',
  '充' => '充',
  '冀' => '冀',
  '勇' => '勇',
  '勺' => '勺',
  '喝' => '喝',
  '啕' => '啕',
  '喙' => '喙',
  '嗢' => '嗢',
  '塚' => '塚',
  '墳' => '墳',
  '奄' => '奄',
  '奔' => '奔',
  '婢' => '婢',
  '嬨' => '嬨',
  '廒' => '廒',
  '廙' => '廙',
  '彩' => '彩',
  '徭' => '徭',
  '惘' => '惘',
  '慎' => '慎',
  '愈' => '愈',
  '憎' => '憎',
  '慠' => '慠',
  '懲' => '懲',
  '戴' => '戴',
  '揄' => '揄',
  '搜' => '搜',
  '摒' => '摒',
  '敖' => '敖',
  '晴' => '晴',
  '朗' => '朗',
  '望' => '望',
  '杖' => '杖',
  '歹' => '歹',
  '殺' => '殺',
  '流' => '流',
  '滛' => '滛',
  '滋' => '滋',
  '漢' => '漢',
  '瀞' => '瀞',
  '煮' => '煮',
  '瞧' => '瞧',
  '爵' => '爵',
  '犯' => '犯',
  '猪' => '猪',
  '瑱' => '瑱',
  '甆' => '甆',
  '画' => '画',
  '瘝' => '瘝',
  '瘟' => '瘟',
  '益' => '益',
  '盛' => '盛',
  '直' => '直',
  '睊' => '睊',
  '着' => '着',
  '磌' => '磌',
  '窱' => '窱',
  '節' => '節',
  '类' => '类',
  '絛' => '絛',
  '練' => '練',
  '缾' => '缾',
  '者' => '者',
  '荒' => '荒',
  '華' => '華',
  '蝹' => '蝹',
  '襁' => '襁',
  '覆' => '覆',
  '視' => '視',
  '調' => '調',
  '諸' => '諸',
  '請' => '請',
  '謁' => '謁',
  '諾' => '諾',
  '諭' => '諭',
  '謹' => '謹',
  '變' => '變',
  '贈' => '贈',
  '輸' => '輸',
  '遲' => '遲',
  '醙' => '醙',
  '鉶' => '鉶',
  '陼' => '陼',
  '難' => '難',
  '靖' => '靖',
  '韛' => '韛',
  '響' => '響',
  '頋' => '頋',
  '頻' => '頻',
  '鬒' => '鬒',
  '龜' => '龜',
  '𢡊' => '𢡊',
  '𢡄' => '𢡄',
  '𣏕' => '𣏕',
  '㮝' => '㮝',
  '䀘' => '䀘',
  '䀹' => '䀹',
  '𥉉' => '𥉉',
  '𥳐' => '𥳐',
  '𧻓' => '𧻓',
  '齃' => '齃',
  '龎' => '龎',
  'יִ' => 'יִ',
  'ײַ' => 'ײַ',
  'שׁ' => 'שׁ',
  'שׂ' => 'שׂ',
  'שּׁ' => 'שּׁ',
  'שּׂ' => 'שּׂ',
  'אַ' => 'אַ',
  'אָ' => 'אָ',
  'אּ' => 'אּ',
  'בּ' => 'בּ',
  'גּ' => 'גּ',
  'דּ' => 'דּ',
  'הּ' => 'הּ',
  'וּ' => 'וּ',
  'זּ' => 'זּ',
  'טּ' => 'טּ',
  'יּ' => 'יּ',
  'ךּ' => 'ךּ',
  'כּ' => 'כּ',
  'לּ' => 'לּ',
  'מּ' => 'מּ',
  'נּ' => 'נּ',
  'סּ' => 'סּ',
  'ףּ' => 'ףּ',
  'פּ' => 'פּ',
  'צּ' => 'צּ',
  'קּ' => 'קּ',
  'רּ' => 'רּ',
  'שּ' => 'שּ',
  'תּ' => 'תּ',
  'וֹ' => 'וֹ',
  'בֿ' => 'בֿ',
  'כֿ' => 'כֿ',
  'פֿ' => 'פֿ',
  '𑂚' => '𑂚',
  '𑂜' => '𑂜',
  '𑂫' => '𑂫',
  '𑄮' => '𑄮',
  '𑄯' => '𑄯',
  '𑍋' => '𑍋',
  '𑍌' => '𑍌',
  '𑒻' => '𑒻',
  '𑒼' => '𑒼',
  '𑒾' => '𑒾',
  '𑖺' => '𑖺',
  '𑖻' => '𑖻',
  '𑤸' => '𑤸',
  '𝅗𝅥' => '𝅗𝅥',
  '𝅘𝅥' => '𝅘𝅥',
  '𝅘𝅥𝅮' => '𝅘𝅥𝅮',
  '𝅘𝅥𝅯' => '𝅘𝅥𝅯',
  '𝅘𝅥𝅰' => '𝅘𝅥𝅰',
  '𝅘𝅥𝅱' => '𝅘𝅥𝅱',
  '𝅘𝅥𝅲' => '𝅘𝅥𝅲',
  '𝆹𝅥' => '𝆹𝅥',
  '𝆺𝅥' => '𝆺𝅥',
  '𝆹𝅥𝅮' => '𝆹𝅥𝅮',
  '𝆺𝅥𝅮' => '𝆺𝅥𝅮',
  '𝆹𝅥𝅯' => '𝆹𝅥𝅯',
  '𝆺𝅥𝅯' => '𝆺𝅥𝅯',
  '丽' => '丽',
  '丸' => '丸',
  '乁' => '乁',
  '𠄢' => '𠄢',
  '你' => '你',
  '侮' => '侮',
  '侻' => '侻',
  '倂' => '倂',
  '偺' => '偺',
  '備' => '備',
  '僧' => '僧',
  '像' => '像',
  '㒞' => '㒞',
  '𠘺' => '𠘺',
  '免' => '免',
  '兔' => '兔',
  '兤' => '兤',
  '具' => '具',
  '𠔜' => '𠔜',
  '㒹' => '㒹',
  '內' => '內',
  '再' => '再',
  '𠕋' => '𠕋',
  '冗' => '冗',
  '冤' => '冤',
  '仌' => '仌',
  '冬' => '冬',
  '况' => '况',
  '𩇟' => '𩇟',
  '凵' => '凵',
  '刃' => '刃',
  '㓟' => '㓟',
  '刻' => '刻',
  '剆' => '剆',
  '割' => '割',
  '剷' => '剷',
  '㔕' => '㔕',
  '勇' => '勇',
  '勉' => '勉',
  '勤' => '勤',
  '勺' => '勺',
  '包' => '包',
  '匆' => '匆',
  '北' => '北',
  '卉' => '卉',
  '卑' => '卑',
  '博' => '博',
  '即' => '即',
  '卽' => '卽',
  '卿' => '卿',
  '卿' => '卿',
  '卿' => '卿',
  '𠨬' => '𠨬',
  '灰' => '灰',
  '及' => '及',
  '叟' => '叟',
  '𠭣' => '𠭣',
  '叫' => '叫',
  '叱' => '叱',
  '吆' => '吆',
  '咞' => '咞',
  '吸' => '吸',
  '呈' => '呈',
  '周' => '周',
  '咢' => '咢',
  '哶' => '哶',
  '唐' => '唐',
  '啓' => '啓',
  '啣' => '啣',
  '善' => '善',
  '善' => '善',
  '喙' => '喙',
  '喫' => '喫',
  '喳' => '喳',
  '嗂' => '嗂',
  '圖' => '圖',
  '嘆' => '嘆',
  '圗' => '圗',
  '噑' => '噑',
  '噴' => '噴',
  '切' => '切',
  '壮' => '壮',
  '城' => '城',
  '埴' => '埴',
  '堍' => '堍',
  '型' => '型',
  '堲' => '堲',
  '報' => '報',
  '墬' => '墬',
  '𡓤' => '𡓤',
  '売' => '売',
  '壷' => '壷',
  '夆' => '夆',
  '多' => '多',
  '夢' => '夢',
  '奢' => '奢',
  '𡚨' => '𡚨',
  '𡛪' => '𡛪',
  '姬' => '姬',
  '娛' => '娛',
  '娧' => '娧',
  '姘' => '姘',
  '婦' => '婦',
  '㛮' => '㛮',
  '㛼' => '㛼',
  '嬈' => '嬈',
  '嬾' => '嬾',
  '嬾' => '嬾',
  '𡧈' => '𡧈',
  '寃' => '寃',
  '寘' => '寘',
  '寧' => '寧',
  '寳' => '寳',
  '𡬘' => '𡬘',
  '寿' => '寿',
  '将' => '将',
  '当' => '当',
  '尢' => '尢',
  '㞁' => '㞁',
  '屠' => '屠',
  '屮' => '屮',
  '峀' => '峀',
  '岍' => '岍',
  '𡷤' => '𡷤',
  '嵃' => '嵃',
  '𡷦' => '𡷦',
  '嵮' => '嵮',
  '嵫' => '嵫',
  '嵼' => '嵼',
  '巡' => '巡',
  '巢' => '巢',
  '㠯' => '㠯',
  '巽' => '巽',
  '帨' => '帨',
  '帽' => '帽',
  '幩' => '幩',
  '㡢' => '㡢',
  '𢆃' => '𢆃',
  '㡼' => '㡼',
  '庰' => '庰',
  '庳' => '庳',
  '庶' => '庶',
  '廊' => '廊',
  '𪎒' => '𪎒',
  '廾' => '廾',
  '𢌱' => '𢌱',
  '𢌱' => '𢌱',
  '舁' => '舁',
  '弢' => '弢',
  '弢' => '弢',
  '㣇' => '㣇',
  '𣊸' => '𣊸',
  '𦇚' => '𦇚',
  '形' => '形',
  '彫' => '彫',
  '㣣' => '㣣',
  '徚' => '徚',
  '忍' => '忍',
  '志' => '志',
  '忹' => '忹',
  '悁' => '悁',
  '㤺' => '㤺',
  '㤜' => '㤜',
  '悔' => '悔',
  '𢛔' => '𢛔',
  '惇' => '惇',
  '慈' => '慈',
  '慌' => '慌',
  '慎' => '慎',
  '慌' => '慌',
  '慺' => '慺',
  '憎' => '憎',
  '憲' => '憲',
  '憤' => '憤',
  '憯' => '憯',
  '懞' => '懞',
  '懲' => '懲',
  '懶' => '懶',
  '成' => '成',
  '戛' => '戛',
  '扝' => '扝',
  '抱' => '抱',
  '拔' => '拔',
  '捐' => '捐',
  '𢬌' => '𢬌',
  '挽' => '挽',
  '拼' => '拼',
  '捨' => '捨',
  '掃' => '掃',
  '揤' => '揤',
  '𢯱' => '𢯱',
  '搢' => '搢',
  '揅' => '揅',
  '掩' => '掩',
  '㨮' => '㨮',
  '摩' => '摩',
  '摾' => '摾',
  '撝' => '撝',
  '摷' => '摷',
  '㩬' => '㩬',
  '敏' => '敏',
  '敬' => '敬',
  '𣀊' => '𣀊',
  '旣' => '旣',
  '書' => '書',
  '晉' => '晉',
  '㬙' => '㬙',
  '暑' => '暑',
  '㬈' => '㬈',
  '㫤' => '㫤',
  '冒' => '冒',
  '冕' => '冕',
  '最' => '最',
  '暜' => '暜',
  '肭' => '肭',
  '䏙' => '䏙',
  '朗' => '朗',
  '望' => '望',
  '朡' => '朡',
  '杞' => '杞',
  '杓' => '杓',
  '𣏃' => '𣏃',
  '㭉' => '㭉',
  '柺' => '柺',
  '枅' => '枅',
  '桒' => '桒',
  '梅' => '梅',
  '𣑭' => '𣑭',
  '梎' => '梎',
  '栟' => '栟',
  '椔' => '椔',
  '㮝' => '㮝',
  '楂' => '楂',
  '榣' => '榣',
  '槪' => '槪',
  '檨' => '檨',
  '𣚣' => '𣚣',
  '櫛' => '櫛',
  '㰘' => '㰘',
  '次' => '次',
  '𣢧' => '𣢧',
  '歔' => '歔',
  '㱎' => '㱎',
  '歲' => '歲',
  '殟' => '殟',
  '殺' => '殺',
  '殻' => '殻',
  '𣪍' => '𣪍',
  '𡴋' => '𡴋',
  '𣫺' => '𣫺',
  '汎' => '汎',
  '𣲼' => '𣲼',
  '沿' => '沿',
  '泍' => '泍',
  '汧' => '汧',
  '洖' => '洖',
  '派' => '派',
  '海' => '海',
  '流' => '流',
  '浩' => '浩',
  '浸' => '浸',
  '涅' => '涅',
  '𣴞' => '𣴞',
  '洴' => '洴',
  '港' => '港',
  '湮' => '湮',
  '㴳' => '㴳',
  '滋' => '滋',
  '滇' => '滇',
  '𣻑' => '𣻑',
  '淹' => '淹',
  '潮' => '潮',
  '𣽞' => '𣽞',
  '𣾎' => '𣾎',
  '濆' => '濆',
  '瀹' => '瀹',
  '瀞' => '瀞',
  '瀛' => '瀛',
  '㶖' => '㶖',
  '灊' => '灊',
  '災' => '災',
  '灷' => '灷',
  '炭' => '炭',
  '𠔥' => '𠔥',
  '煅' => '煅',
  '𤉣' => '𤉣',
  '熜' => '熜',
  '𤎫' => '𤎫',
  '爨' => '爨',
  '爵' => '爵',
  '牐' => '牐',
  '𤘈' => '𤘈',
  '犀' => '犀',
  '犕' => '犕',
  '𤜵' => '𤜵',
  '𤠔' => '𤠔',
  '獺' => '獺',
  '王' => '王',
  '㺬' => '㺬',
  '玥' => '玥',
  '㺸' => '㺸',
  '㺸' => '㺸',
  '瑇' => '瑇',
  '瑜' => '瑜',
  '瑱' => '瑱',
  '璅' => '璅',
  '瓊' => '瓊',
  '㼛' => '㼛',
  '甤' => '甤',
  '𤰶' => '𤰶',
  '甾' => '甾',
  '𤲒' => '𤲒',
  '異' => '異',
  '𢆟' => '𢆟',
  '瘐' => '瘐',
  '𤾡' => '𤾡',
  '𤾸' => '𤾸',
  '𥁄' => '𥁄',
  '㿼' => '㿼',
  '䀈' => '䀈',
  '直' => '直',
  '𥃳' => '𥃳',
  '𥃲' => '𥃲',
  '𥄙' => '𥄙',
  '𥄳' => '𥄳',
  '眞' => '眞',
  '真' => '真',
  '真' => '真',
  '睊' => '睊',
  '䀹' => '䀹',
  '瞋' => '瞋',
  '䁆' => '䁆',
  '䂖' => '䂖',
  '𥐝' => '𥐝',
  '硎' => '硎',
  '碌' => '碌',
  '磌' => '磌',
  '䃣' => '䃣',
  '𥘦' => '𥘦',
  '祖' => '祖',
  '𥚚' => '𥚚',
  '𥛅' => '𥛅',
  '福' => '福',
  '秫' => '秫',
  '䄯' => '䄯',
  '穀' => '穀',
  '穊' => '穊',
  '穏' => '穏',
  '𥥼' => '𥥼',
  '𥪧' => '𥪧',
  '𥪧' => '𥪧',
  '竮' => '竮',
  '䈂' => '䈂',
  '𥮫' => '𥮫',
  '篆' => '篆',
  '築' => '築',
  '䈧' => '䈧',
  '𥲀' => '𥲀',
  '糒' => '糒',
  '䊠' => '䊠',
  '糨' => '糨',
  '糣' => '糣',
  '紀' => '紀',
  '𥾆' => '𥾆',
  '絣' => '絣',
  '䌁' => '䌁',
  '緇' => '緇',
  '縂' => '縂',
  '繅' => '繅',
  '䌴' => '䌴',
  '𦈨' => '𦈨',
  '𦉇' => '𦉇',
  '䍙' => '䍙',
  '𦋙' => '𦋙',
  '罺' => '罺',
  '𦌾' => '𦌾',
  '羕' => '羕',
  '翺' => '翺',
  '者' => '者',
  '𦓚' => '𦓚',
  '𦔣' => '𦔣',
  '聠' => '聠',
  '𦖨' => '𦖨',
  '聰' => '聰',
  '𣍟' => '𣍟',
  '䏕' => '䏕',
  '育' => '育',
  '脃' => '脃',
  '䐋' => '䐋',
  '脾' => '脾',
  '媵' => '媵',
  '𦞧' => '𦞧',
  '𦞵' => '𦞵',
  '𣎓' => '𣎓',
  '𣎜' => '𣎜',
  '舁' => '舁',
  '舄' => '舄',
  '辞' => '辞',
  '䑫' => '䑫',
  '芑' => '芑',
  '芋' => '芋',
  '芝' => '芝',
  '劳' => '劳',
  '花' => '花',
  '芳' => '芳',
  '芽' => '芽',
  '苦' => '苦',
  '𦬼' => '𦬼',
  '若' => '若',
  '茝' => '茝',
  '荣' => '荣',
  '莭' => '莭',
  '茣' => '茣',
  '莽' => '莽',
  '菧' => '菧',
  '著' => '著',
  '荓' => '荓',
  '菊' => '菊',
  '菌' => '菌',
  '菜' => '菜',
  '𦰶' => '𦰶',
  '𦵫' => '𦵫',
  '𦳕' => '𦳕',
  '䔫' => '䔫',
  '蓱' => '蓱',
  '蓳' => '蓳',
  '蔖' => '蔖',
  '𧏊' => '𧏊',
  '蕤' => '蕤',
  '𦼬' => '𦼬',
  '䕝' => '䕝',
  '䕡' => '䕡',
  '𦾱' => '𦾱',
  '𧃒' => '𧃒',
  '䕫' => '䕫',
  '虐' => '虐',
  '虜' => '虜',
  '虧' => '虧',
  '虩' => '虩',
  '蚩' => '蚩',
  '蚈' => '蚈',
  '蜎' => '蜎',
  '蛢' => '蛢',
  '蝹' => '蝹',
  '蜨' => '蜨',
  '蝫' => '蝫',
  '螆' => '螆',
  '䗗' => '䗗',
  '蟡' => '蟡',
  '蠁' => '蠁',
  '䗹' => '䗹',
  '衠' => '衠',
  '衣' => '衣',
  '𧙧' => '𧙧',
  '裗' => '裗',
  '裞' => '裞',
  '䘵' => '䘵',
  '裺' => '裺',
  '㒻' => '㒻',
  '𧢮' => '𧢮',
  '𧥦' => '𧥦',
  '䚾' => '䚾',
  '䛇' => '䛇',
  '誠' => '誠',
  '諭' => '諭',
  '變' => '變',
  '豕' => '豕',
  '𧲨' => '𧲨',
  '貫' => '貫',
  '賁' => '賁',
  '贛' => '贛',
  '起' => '起',
  '𧼯' => '𧼯',
  '𠠄' => '𠠄',
  '跋' => '跋',
  '趼' => '趼',
  '跰' => '跰',
  '𠣞' => '𠣞',
  '軔' => '軔',
  '輸' => '輸',
  '𨗒' => '𨗒',
  '𨗭' => '𨗭',
  '邔' => '邔',
  '郱' => '郱',
  '鄑' => '鄑',
  '𨜮' => '𨜮',
  '鄛' => '鄛',
  '鈸' => '鈸',
  '鋗' => '鋗',
  '鋘' => '鋘',
  '鉼' => '鉼',
  '鏹' => '鏹',
  '鐕' => '鐕',
  '𨯺' => '𨯺',
  '開' => '開',
  '䦕' => '䦕',
  '閷' => '閷',
  '𨵷' => '𨵷',
  '䧦' => '䧦',
  '雃' => '雃',
  '嶲' => '嶲',
  '霣' => '霣',
  '𩅅' => '𩅅',
  '𩈚' => '𩈚',
  '䩮' => '䩮',
  '䩶' => '䩶',
  '韠' => '韠',
  '𩐊' => '𩐊',
  '䪲' => '䪲',
  '𩒖' => '𩒖',
  '頋' => '頋',
  '頋' => '頋',
  '頩' => '頩',
  '𩖶' => '𩖶',
  '飢' => '飢',
  '䬳' => '䬳',
  '餩' => '餩',
  '馧' => '馧',
  '駂' => '駂',
  '駾' => '駾',
  '䯎' => '䯎',
  '𩬰' => '𩬰',
  '鬒' => '鬒',
  '鱀' => '鱀',
  '鳽' => '鳽',
  '䳎' => '䳎',
  '䳭' => '䳭',
  '鵧' => '鵧',
  '𪃎' => '𪃎',
  '䳸' => '䳸',
  '𪄅' => '𪄅',
  '𪈎' => '𪈎',
  '𪊑' => '𪊑',
  '麻' => '麻',
  '䵖' => '䵖',
  '黹' => '黹',
  '黾' => '黾',
  '鼅' => '鼅',
  '鼏' => '鼏',
  '鼖' => '鼖',
  '鼻' => '鼻',
  '𪘀' => '𪘀',
);
<?php

return array (
  '̀' => 230,
  '́' => 230,
  '̂' => 230,
  '̃' => 230,
  '̄' => 230,
  '̅' => 230,
  '̆' => 230,
  '̇' => 230,
  '̈' => 230,
  '̉' => 230,
  '̊' => 230,
  '̋' => 230,
  '̌' => 230,
  '̍' => 230,
  '̎' => 230,
  '̏' => 230,
  '̐' => 230,
  '̑' => 230,
  '̒' => 230,
  '̓' => 230,
  '̔' => 230,
  '̕' => 232,
  '̖' => 220,
  '̗' => 220,
  '̘' => 220,
  '̙' => 220,
  '̚' => 232,
  '̛' => 216,
  '̜' => 220,
  '̝' => 220,
  '̞' => 220,
  '̟' => 220,
  '̠' => 220,
  '̡' => 202,
  '̢' => 202,
  '̣' => 220,
  '̤' => 220,
  '̥' => 220,
  '̦' => 220,
  '̧' => 202,
  '̨' => 202,
  '̩' => 220,
  '̪' => 220,
  '̫' => 220,
  '̬' => 220,
  '̭' => 220,
  '̮' => 220,
  '̯' => 220,
  '̰' => 220,
  '̱' => 220,
  '̲' => 220,
  '̳' => 220,
  '̴' => 1,
  '̵' => 1,
  '̶' => 1,
  '̷' => 1,
  '̸' => 1,
  '̹' => 220,
  '̺' => 220,
  '̻' => 220,
  '̼' => 220,
  '̽' => 230,
  '̾' => 230,
  '̿' => 230,
  '̀' => 230,
  '́' => 230,
  '͂' => 230,
  '̓' => 230,
  '̈́' => 230,
  'ͅ' => 240,
  '͆' => 230,
  '͇' => 220,
  '͈' => 220,
  '͉' => 220,
  '͊' => 230,
  '͋' => 230,
  '͌' => 230,
  '͍' => 220,
  '͎' => 220,
  '͐' => 230,
  '͑' => 230,
  '͒' => 230,
  '͓' => 220,
  '͔' => 220,
  '͕' => 220,
  '͖' => 220,
  '͗' => 230,
  '͘' => 232,
  '͙' => 220,
  '͚' => 220,
  '͛' => 230,
  '͜' => 233,
  '͝' => 234,
  '͞' => 234,
  '͟' => 233,
  '͠' => 234,
  '͡' => 234,
  '͢' => 233,
  'ͣ' => 230,
  'ͤ' => 230,
  'ͥ' => 230,
  'ͦ' => 230,
  'ͧ' => 230,
  'ͨ' => 230,
  'ͩ' => 230,
  'ͪ' => 230,
  'ͫ' => 230,
  'ͬ' => 230,
  'ͭ' => 230,
  'ͮ' => 230,
  'ͯ' => 230,
  '҃' => 230,
  '҄' => 230,
  '҅' => 230,
  '҆' => 230,
  '҇' => 230,
  '֑' => 220,
  '֒' => 230,
  '֓' => 230,
  '֔' => 230,
  '֕' => 230,
  '֖' => 220,
  '֗' => 230,
  '֘' => 230,
  '֙' => 230,
  '֚' => 222,
  '֛' => 220,
  '֜' => 230,
  '֝' => 230,
  '֞' => 230,
  '֟' => 230,
  '֠' => 230,
  '֡' => 230,
  '֢' => 220,
  '֣' => 220,
  '֤' => 220,
  '֥' => 220,
  '֦' => 220,
  '֧' => 220,
  '֨' => 230,
  '֩' => 230,
  '֪' => 220,
  '֫' => 230,
  '֬' => 230,
  '֭' => 222,
  '֮' => 228,
  '֯' => 230,
  'ְ' => 10,
  'ֱ' => 11,
  'ֲ' => 12,
  'ֳ' => 13,
  'ִ' => 14,
  'ֵ' => 15,
  'ֶ' => 16,
  'ַ' => 17,
  'ָ' => 18,
  'ֹ' => 19,
  'ֺ' => 19,
  'ֻ' => 20,
  'ּ' => 21,
  'ֽ' => 22,
  'ֿ' => 23,
  'ׁ' => 24,
  'ׂ' => 25,
  'ׄ' => 230,
  'ׅ' => 220,
  'ׇ' => 18,
  'ؐ' => 230,
  'ؑ' => 230,
  'ؒ' => 230,
  'ؓ' => 230,
  'ؔ' => 230,
  'ؕ' => 230,
  'ؖ' => 230,
  'ؗ' => 230,
  'ؘ' => 30,
  'ؙ' => 31,
  'ؚ' => 32,
  'ً' => 27,
  'ٌ' => 28,
  'ٍ' => 29,
  'َ' => 30,
  'ُ' => 31,
  'ِ' => 32,
  'ّ' => 33,
  'ْ' => 34,
  'ٓ' => 230,
  'ٔ' => 230,
  'ٕ' => 220,
  'ٖ' => 220,
  'ٗ' => 230,
  '٘' => 230,
  'ٙ' => 230,
  'ٚ' => 230,
  'ٛ' => 230,
  'ٜ' => 220,
  'ٝ' => 230,
  'ٞ' => 230,
  'ٟ' => 220,
  'ٰ' => 35,
  'ۖ' => 230,
  'ۗ' => 230,
  'ۘ' => 230,
  'ۙ' => 230,
  'ۚ' => 230,
  'ۛ' => 230,
  'ۜ' => 230,
  '۟' => 230,
  '۠' => 230,
  'ۡ' => 230,
  'ۢ' => 230,
  'ۣ' => 220,
  'ۤ' => 230,
  'ۧ' => 230,
  'ۨ' => 230,
  '۪' => 220,
  '۫' => 230,
  '۬' => 230,
  'ۭ' => 220,
  'ܑ' => 36,
  'ܰ' => 230,
  'ܱ' => 220,
  'ܲ' => 230,
  'ܳ' => 230,
  'ܴ' => 220,
  'ܵ' => 230,
  'ܶ' => 230,
  'ܷ' => 220,
  'ܸ' => 220,
  'ܹ' => 220,
  'ܺ' => 230,
  'ܻ' => 220,
  'ܼ' => 220,
  'ܽ' => 230,
  'ܾ' => 220,
  'ܿ' => 230,
  '݀' => 230,
  '݁' => 230,
  '݂' => 220,
  '݃' => 230,
  '݄' => 220,
  '݅' => 230,
  '݆' => 220,
  '݇' => 230,
  '݈' => 220,
  '݉' => 230,
  '݊' => 230,
  '߫' => 230,
  '߬' => 230,
  '߭' => 230,
  '߮' => 230,
  '߯' => 230,
  '߰' => 230,
  '߱' => 230,
  '߲' => 220,
  '߳' => 230,
  '߽' => 220,
  'ࠖ' => 230,
  'ࠗ' => 230,
  '࠘' => 230,
  '࠙' => 230,
  'ࠛ' => 230,
  'ࠜ' => 230,
  'ࠝ' => 230,
  'ࠞ' => 230,
  'ࠟ' => 230,
  'ࠠ' => 230,
  'ࠡ' => 230,
  'ࠢ' => 230,
  'ࠣ' => 230,
  'ࠥ' => 230,
  'ࠦ' => 230,
  'ࠧ' => 230,
  'ࠩ' => 230,
  'ࠪ' => 230,
  'ࠫ' => 230,
  'ࠬ' => 230,
  '࠭' => 230,
  '࡙' => 220,
  '࡚' => 220,
  '࡛' => 220,
  '࣓' => 220,
  'ࣔ' => 230,
  'ࣕ' => 230,
  'ࣖ' => 230,
  'ࣗ' => 230,
  'ࣘ' => 230,
  'ࣙ' => 230,
  'ࣚ' => 230,
  'ࣛ' => 230,
  'ࣜ' => 230,
  'ࣝ' => 230,
  'ࣞ' => 230,
  'ࣟ' => 230,
  '࣠' => 230,
  '࣡' => 230,
  'ࣣ' => 220,
  'ࣤ' => 230,
  'ࣥ' => 230,
  'ࣦ' => 220,
  'ࣧ' => 230,
  'ࣨ' => 230,
  'ࣩ' => 220,
  '࣪' => 230,
  '࣫' => 230,
  '࣬' => 230,
  '࣭' => 220,
  '࣮' => 220,
  '࣯' => 220,
  'ࣰ' => 27,
  'ࣱ' => 28,
  'ࣲ' => 29,
  'ࣳ' => 230,
  'ࣴ' => 230,
  'ࣵ' => 230,
  'ࣶ' => 220,
  'ࣷ' => 230,
  'ࣸ' => 230,
  'ࣹ' => 220,
  'ࣺ' => 220,
  'ࣻ' => 230,
  'ࣼ' => 230,
  'ࣽ' => 230,
  'ࣾ' => 230,
  'ࣿ' => 230,
  '़' => 7,
  '्' => 9,
  '॑' => 230,
  '॒' => 220,
  '॓' => 230,
  '॔' => 230,
  '়' => 7,
  '্' => 9,
  '৾' => 230,
  '਼' => 7,
  '੍' => 9,
  '઼' => 7,
  '્' => 9,
  '଼' => 7,
  '୍' => 9,
  '்' => 9,
  '్' => 9,
  'ౕ' => 84,
  'ౖ' => 91,
  '಼' => 7,
  '್' => 9,
  '഻' => 9,
  '഼' => 9,
  '്' => 9,
  '්' => 9,
  'ุ' => 103,
  'ู' => 103,
  'ฺ' => 9,
  '่' => 107,
  '้' => 107,
  '๊' => 107,
  '๋' => 107,
  'ຸ' => 118,
  'ູ' => 118,
  '຺' => 9,
  '່' => 122,
  '້' => 122,
  '໊' => 122,
  '໋' => 122,
  '༘' => 220,
  '༙' => 220,
  '༵' => 220,
  '༷' => 220,
  '༹' => 216,
  'ཱ' => 129,
  'ི' => 130,
  'ུ' => 132,
  'ེ' => 130,
  'ཻ' => 130,
  'ོ' => 130,
  'ཽ' => 130,
  'ྀ' => 130,
  'ྂ' => 230,
  'ྃ' => 230,
  '྄' => 9,
  '྆' => 230,
  '྇' => 230,
  '࿆' => 220,
  '့' => 7,
  '္' => 9,
  '်' => 9,
  'ႍ' => 220,
  '፝' => 230,
  '፞' => 230,
  '፟' => 230,
  '᜔' => 9,
  '᜴' => 9,
  '្' => 9,
  '៝' => 230,
  'ᢩ' => 228,
  '᤹' => 222,
  '᤺' => 230,
  '᤻' => 220,
  'ᨗ' => 230,
  'ᨘ' => 220,
  '᩠' => 9,
  '᩵' => 230,
  '᩶' => 230,
  '᩷' => 230,
  '᩸' => 230,
  '᩹' => 230,
  '᩺' => 230,
  '᩻' => 230,
  '᩼' => 230,
  '᩿' => 220,
  '᪰' => 230,
  '᪱' => 230,
  '᪲' => 230,
  '᪳' => 230,
  '᪴' => 230,
  '᪵' => 220,
  '᪶' => 220,
  '᪷' => 220,
  '᪸' => 220,
  '᪹' => 220,
  '᪺' => 220,
  '᪻' => 230,
  '᪼' => 230,
  '᪽' => 220,
  'ᪿ' => 220,
  'ᫀ' => 220,
  '᬴' => 7,
  '᭄' => 9,
  '᭫' => 230,
  '᭬' => 220,
  '᭭' => 230,
  '᭮' => 230,
  '᭯' => 230,
  '᭰' => 230,
  '᭱' => 230,
  '᭲' => 230,
  '᭳' => 230,
  '᮪' => 9,
  '᮫' => 9,
  '᯦' => 7,
  '᯲' => 9,
  '᯳' => 9,
  '᰷' => 7,
  '᳐' => 230,
  '᳑' => 230,
  '᳒' => 230,
  '᳔' => 1,
  '᳕' => 220,
  '᳖' => 220,
  '᳗' => 220,
  '᳘' => 220,
  '᳙' => 220,
  '᳚' => 230,
  '᳛' => 230,
  '᳜' => 220,
  '᳝' => 220,
  '᳞' => 220,
  '᳟' => 220,
  '᳠' => 230,
  '᳢' => 1,
  '᳣' => 1,
  '᳤' => 1,
  '᳥' => 1,
  '᳦' => 1,
  '᳧' => 1,
  '᳨' => 1,
  '᳭' => 220,
  '᳴' => 230,
  '᳸' => 230,
  '᳹' => 230,
  '᷀' => 230,
  '᷁' => 230,
  '᷂' => 220,
  '᷃' => 230,
  '᷄' => 230,
  '᷅' => 230,
  '᷆' => 230,
  '᷇' => 230,
  '᷈' => 230,
  '᷉' => 230,
  '᷊' => 220,
  '᷋' => 230,
  '᷌' => 230,
  '᷍' => 234,
  '᷎' => 214,
  '᷏' => 220,
  '᷐' => 202,
  '᷑' => 230,
  '᷒' => 230,
  'ᷓ' => 230,
  'ᷔ' => 230,
  'ᷕ' => 230,
  'ᷖ' => 230,
  'ᷗ' => 230,
  'ᷘ' => 230,
  'ᷙ' => 230,
  'ᷚ' => 230,
  'ᷛ' => 230,
  'ᷜ' => 230,
  'ᷝ' => 230,
  'ᷞ' => 230,
  'ᷟ' => 230,
  'ᷠ' => 230,
  'ᷡ' => 230,
  'ᷢ' => 230,
  'ᷣ' => 230,
  'ᷤ' => 230,
  'ᷥ' => 230,
  'ᷦ' => 230,
  'ᷧ' => 230,
  'ᷨ' => 230,
  'ᷩ' => 230,
  'ᷪ' => 230,
  'ᷫ' => 230,
  'ᷬ' => 230,
  'ᷭ' => 230,
  'ᷮ' => 230,
  'ᷯ' => 230,
  'ᷰ' => 230,
  'ᷱ' => 230,
  'ᷲ' => 230,
  'ᷳ' => 230,
  'ᷴ' => 230,
  '᷵' => 230,
  '᷶' => 232,
  '᷷' => 228,
  '᷸' => 228,
  '᷹' => 220,
  '᷻' => 230,
  '᷼' => 233,
  '᷽' => 220,
  '᷾' => 230,
  '᷿' => 220,
  '⃐' => 230,
  '⃑' => 230,
  '⃒' => 1,
  '⃓' => 1,
  '⃔' => 230,
  '⃕' => 230,
  '⃖' => 230,
  '⃗' => 230,
  '⃘' => 1,
  '⃙' => 1,
  '⃚' => 1,
  '⃛' => 230,
  '⃜' => 230,
  '⃡' => 230,
  '⃥' => 1,
  '⃦' => 1,
  '⃧' => 230,
  '⃨' => 220,
  '⃩' => 230,
  '⃪' => 1,
  '⃫' => 1,
  '⃬' => 220,
  '⃭' => 220,
  '⃮' => 220,
  '⃯' => 220,
  '⃰' => 230,
  '⳯' => 230,
  '⳰' => 230,
  '⳱' => 230,
  '⵿' => 9,
  'ⷠ' => 230,
  'ⷡ' => 230,
  'ⷢ' => 230,
  'ⷣ' => 230,
  'ⷤ' => 230,
  'ⷥ' => 230,
  'ⷦ' => 230,
  'ⷧ' => 230,
  'ⷨ' => 230,
  'ⷩ' => 230,
  'ⷪ' => 230,
  'ⷫ' => 230,
  'ⷬ' => 230,
  'ⷭ' => 230,
  'ⷮ' => 230,
  'ⷯ' => 230,
  'ⷰ' => 230,
  'ⷱ' => 230,
  'ⷲ' => 230,
  'ⷳ' => 230,
  'ⷴ' => 230,
  'ⷵ' => 230,
  'ⷶ' => 230,
  'ⷷ' => 230,
  'ⷸ' => 230,
  'ⷹ' => 230,
  'ⷺ' => 230,
  'ⷻ' => 230,
  'ⷼ' => 230,
  'ⷽ' => 230,
  'ⷾ' => 230,
  'ⷿ' => 230,
  '〪' => 218,
  '〫' => 228,
  '〬' => 232,
  '〭' => 222,
  '〮' => 224,
  '〯' => 224,
  '゙' => 8,
  '゚' => 8,
  '꙯' => 230,
  'ꙴ' => 230,
  'ꙵ' => 230,
  'ꙶ' => 230,
  'ꙷ' => 230,
  'ꙸ' => 230,
  'ꙹ' => 230,
  'ꙺ' => 230,
  'ꙻ' => 230,
  '꙼' => 230,
  '꙽' => 230,
  'ꚞ' => 230,
  'ꚟ' => 230,
  '꛰' => 230,
  '꛱' => 230,
  '꠆' => 9,
  '꠬' => 9,
  '꣄' => 9,
  '꣠' => 230,
  '꣡' => 230,
  '꣢' => 230,
  '꣣' => 230,
  '꣤' => 230,
  '꣥' => 230,
  '꣦' => 230,
  '꣧' => 230,
  '꣨' => 230,
  '꣩' => 230,
  '꣪' => 230,
  '꣫' => 230,
  '꣬' => 230,
  '꣭' => 230,
  '꣮' => 230,
  '꣯' => 230,
  '꣰' => 230,
  '꣱' => 230,
  '꤫' => 220,
  '꤬' => 220,
  '꤭' => 220,
  '꥓' => 9,
  '꦳' => 7,
  '꧀' => 9,
  'ꪰ' => 230,
  'ꪲ' => 230,
  'ꪳ' => 230,
  'ꪴ' => 220,
  'ꪷ' => 230,
  'ꪸ' => 230,
  'ꪾ' => 230,
  '꪿' => 230,
  '꫁' => 230,
  '꫶' => 9,
  '꯭' => 9,
  'ﬞ' => 26,
  '︠' => 230,
  '︡' => 230,
  '︢' => 230,
  '︣' => 230,
  '︤' => 230,
  '︥' => 230,
  '︦' => 230,
  '︧' => 220,
  '︨' => 220,
  '︩' => 220,
  '︪' => 220,
  '︫' => 220,
  '︬' => 220,
  '︭' => 220,
  '︮' => 230,
  '︯' => 230,
  '𐇽' => 220,
  '𐋠' => 220,
  '𐍶' => 230,
  '𐍷' => 230,
  '𐍸' => 230,
  '𐍹' => 230,
  '𐍺' => 230,
  '𐨍' => 220,
  '𐨏' => 230,
  '𐨸' => 230,
  '𐨹' => 1,
  '𐨺' => 220,
  '𐨿' => 9,
  '𐫥' => 230,
  '𐫦' => 220,
  '𐴤' => 230,
  '𐴥' => 230,
  '𐴦' => 230,
  '𐴧' => 230,
  '𐺫' => 230,
  '𐺬' => 230,
  '𐽆' => 220,
  '𐽇' => 220,
  '𐽈' => 230,
  '𐽉' => 230,
  '𐽊' => 230,
  '𐽋' => 220,
  '𐽌' => 230,
  '𐽍' => 220,
  '𐽎' => 220,
  '𐽏' => 220,
  '𐽐' => 220,
  '𑁆' => 9,
  '𑁿' => 9,
  '𑂹' => 9,
  '𑂺' => 7,
  '𑄀' => 230,
  '𑄁' => 230,
  '𑄂' => 230,
  '𑄳' => 9,
  '𑄴' => 9,
  '𑅳' => 7,
  '𑇀' => 9,
  '𑇊' => 7,
  '𑈵' => 9,
  '𑈶' => 7,
  '𑋩' => 7,
  '𑋪' => 9,
  '𑌻' => 7,
  '𑌼' => 7,
  '𑍍' => 9,
  '𑍦' => 230,
  '𑍧' => 230,
  '𑍨' => 230,
  '𑍩' => 230,
  '𑍪' => 230,
  '𑍫' => 230,
  '𑍬' => 230,
  '𑍰' => 230,
  '𑍱' => 230,
  '𑍲' => 230,
  '𑍳' => 230,
  '𑍴' => 230,
  '𑑂' => 9,
  '𑑆' => 7,
  '𑑞' => 230,
  '𑓂' => 9,
  '𑓃' => 7,
  '𑖿' => 9,
  '𑗀' => 7,
  '𑘿' => 9,
  '𑚶' => 9,
  '𑚷' => 7,
  '𑜫' => 9,
  '𑠹' => 9,
  '𑠺' => 7,
  '𑤽' => 9,
  '𑤾' => 9,
  '𑥃' => 7,
  '𑧠' => 9,
  '𑨴' => 9,
  '𑩇' => 9,
  '𑪙' => 9,
  '𑰿' => 9,
  '𑵂' => 7,
  '𑵄' => 9,
  '𑵅' => 9,
  '𑶗' => 9,
  '𖫰' => 1,
  '𖫱' => 1,
  '𖫲' => 1,
  '𖫳' => 1,
  '𖫴' => 1,
  '𖬰' => 230,
  '𖬱' => 230,
  '𖬲' => 230,
  '𖬳' => 230,
  '𖬴' => 230,
  '𖬵' => 230,
  '𖬶' => 230,
  '𖿰' => 6,
  '𖿱' => 6,
  '𛲞' => 1,
  '𝅥' => 216,
  '𝅦' => 216,
  '𝅧' => 1,
  '𝅨' => 1,
  '𝅩' => 1,
  '𝅭' => 226,
  '𝅮' => 216,
  '𝅯' => 216,
  '𝅰' => 216,
  '𝅱' => 216,
  '𝅲' => 216,
  '𝅻' => 220,
  '𝅼' => 220,
  '𝅽' => 220,
  '𝅾' => 220,
  '𝅿' => 220,
  '𝆀' => 220,
  '𝆁' => 220,
  '𝆂' => 220,
  '𝆅' => 230,
  '𝆆' => 230,
  '𝆇' => 230,
  '𝆈' => 230,
  '𝆉' => 230,
  '𝆊' => 220,
  '𝆋' => 220,
  '𝆪' => 230,
  '𝆫' => 230,
  '𝆬' => 230,
  '𝆭' => 230,
  '𝉂' => 230,
  '𝉃' => 230,
  '𝉄' => 230,
  '𞀀' => 230,
  '𞀁' => 230,
  '𞀂' => 230,
  '𞀃' => 230,
  '𞀄' => 230,
  '𞀅' => 230,
  '𞀆' => 230,
  '𞀈' => 230,
  '𞀉' => 230,
  '𞀊' => 230,
  '𞀋' => 230,
  '𞀌' => 230,
  '𞀍' => 230,
  '𞀎' => 230,
  '𞀏' => 230,
  '𞀐' => 230,
  '𞀑' => 230,
  '𞀒' => 230,
  '𞀓' => 230,
  '𞀔' => 230,
  '𞀕' => 230,
  '𞀖' => 230,
  '𞀗' => 230,
  '𞀘' => 230,
  '𞀛' => 230,
  '𞀜' => 230,
  '𞀝' => 230,
  '𞀞' => 230,
  '𞀟' => 230,
  '𞀠' => 230,
  '𞀡' => 230,
  '𞀣' => 230,
  '𞀤' => 230,
  '𞀦' => 230,
  '𞀧' => 230,
  '𞀨' => 230,
  '𞀩' => 230,
  '𞀪' => 230,
  '𞄰' => 230,
  '𞄱' => 230,
  '𞄲' => 230,
  '𞄳' => 230,
  '𞄴' => 230,
  '𞄵' => 230,
  '𞄶' => 230,
  '𞋬' => 230,
  '𞋭' => 230,
  '𞋮' => 230,
  '𞋯' => 230,
  '𞣐' => 220,
  '𞣑' => 220,
  '𞣒' => 220,
  '𞣓' => 220,
  '𞣔' => 220,
  '𞣕' => 220,
  '𞣖' => 220,
  '𞥄' => 230,
  '𞥅' => 230,
  '𞥆' => 230,
  '𞥇' => 230,
  '𞥈' => 230,
  '𞥉' => 230,
  '𞥊' => 7,
);
<?php

return array (
  ' ' => ' ',
  '¨' => ' ̈',
  'ª' => 'a',
  '¯' => ' ̄',
  '²' => '2',
  '³' => '3',
  '´' => ' ́',
  'µ' => 'μ',
  '¸' => ' ̧',
  '¹' => '1',
  'º' => 'o',
  '¼' => '1⁄4',
  '½' => '1⁄2',
  '¾' => '3⁄4',
  'IJ' => 'IJ',
  'ij' => 'ij',
  'Ŀ' => 'L·',
  'ŀ' => 'l·',
  'ʼn' => 'ʼn',
  'ſ' => 's',
  'DŽ' => 'DŽ',
  'Dž' => 'Dž',
  'dž' => 'dž',
  'LJ' => 'LJ',
  'Lj' => 'Lj',
  'lj' => 'lj',
  'NJ' => 'NJ',
  'Nj' => 'Nj',
  'nj' => 'nj',
  'DZ' => 'DZ',
  'Dz' => 'Dz',
  'dz' => 'dz',
  'ʰ' => 'h',
  'ʱ' => 'ɦ',
  'ʲ' => 'j',
  'ʳ' => 'r',
  'ʴ' => 'ɹ',
  'ʵ' => 'ɻ',
  'ʶ' => 'ʁ',
  'ʷ' => 'w',
  'ʸ' => 'y',
  '˘' => ' ̆',
  '˙' => ' ̇',
  '˚' => ' ̊',
  '˛' => ' ̨',
  '˜' => ' ̃',
  '˝' => ' ̋',
  'ˠ' => 'ɣ',
  'ˡ' => 'l',
  'ˢ' => 's',
  'ˣ' => 'x',
  'ˤ' => 'ʕ',
  'ͺ' => ' ͅ',
  '΄' => ' ́',
  '΅' => ' ̈́',
  'ϐ' => 'β',
  'ϑ' => 'θ',
  'ϒ' => 'Υ',
  'ϓ' => 'Ύ',
  'ϔ' => 'Ϋ',
  'ϕ' => 'φ',
  'ϖ' => 'π',
  'ϰ' => 'κ',
  'ϱ' => 'ρ',
  'ϲ' => 'ς',
  'ϴ' => 'Θ',
  'ϵ' => 'ε',
  'Ϲ' => 'Σ',
  'և' => 'եւ',
  'ٵ' => 'اٴ',
  'ٶ' => 'وٴ',
  'ٷ' => 'ۇٴ',
  'ٸ' => 'يٴ',
  'ำ' => 'ํา',
  'ຳ' => 'ໍາ',
  'ໜ' => 'ຫນ',
  'ໝ' => 'ຫມ',
  '༌' => '་',
  'ཷ' => 'ྲཱྀ',
  'ཹ' => 'ླཱྀ',
  'ჼ' => 'ნ',
  'ᴬ' => 'A',
  'ᴭ' => 'Æ',
  'ᴮ' => 'B',
  'ᴰ' => 'D',
  'ᴱ' => 'E',
  'ᴲ' => 'Ǝ',
  'ᴳ' => 'G',
  'ᴴ' => 'H',
  'ᴵ' => 'I',
  'ᴶ' => 'J',
  'ᴷ' => 'K',
  'ᴸ' => 'L',
  'ᴹ' => 'M',
  'ᴺ' => 'N',
  'ᴼ' => 'O',
  'ᴽ' => 'Ȣ',
  'ᴾ' => 'P',
  'ᴿ' => 'R',
  'ᵀ' => 'T',
  'ᵁ' => 'U',
  'ᵂ' => 'W',
  'ᵃ' => 'a',
  'ᵄ' => 'ɐ',
  'ᵅ' => 'ɑ',
  'ᵆ' => 'ᴂ',
  'ᵇ' => 'b',
  'ᵈ' => 'd',
  'ᵉ' => 'e',
  'ᵊ' => 'ə',
  'ᵋ' => 'ɛ',
  'ᵌ' => 'ɜ',
  'ᵍ' => 'g',
  'ᵏ' => 'k',
  'ᵐ' => 'm',
  'ᵑ' => 'ŋ',
  'ᵒ' => 'o',
  'ᵓ' => 'ɔ',
  'ᵔ' => 'ᴖ',
  'ᵕ' => 'ᴗ',
  'ᵖ' => 'p',
  'ᵗ' => 't',
  'ᵘ' => 'u',
  'ᵙ' => 'ᴝ',
  'ᵚ' => 'ɯ',
  'ᵛ' => 'v',
  'ᵜ' => 'ᴥ',
  'ᵝ' => 'β',
  'ᵞ' => 'γ',
  'ᵟ' => 'δ',
  'ᵠ' => 'φ',
  'ᵡ' => 'χ',
  'ᵢ' => 'i',
  'ᵣ' => 'r',
  'ᵤ' => 'u',
  'ᵥ' => 'v',
  'ᵦ' => 'β',
  'ᵧ' => 'γ',
  'ᵨ' => 'ρ',
  'ᵩ' => 'φ',
  'ᵪ' => 'χ',
  'ᵸ' => 'н',
  'ᶛ' => 'ɒ',
  'ᶜ' => 'c',
  'ᶝ' => 'ɕ',
  'ᶞ' => 'ð',
  'ᶟ' => 'ɜ',
  'ᶠ' => 'f',
  'ᶡ' => 'ɟ',
  'ᶢ' => 'ɡ',
  'ᶣ' => 'ɥ',
  'ᶤ' => 'ɨ',
  'ᶥ' => 'ɩ',
  'ᶦ' => 'ɪ',
  'ᶧ' => 'ᵻ',
  'ᶨ' => 'ʝ',
  'ᶩ' => 'ɭ',
  'ᶪ' => 'ᶅ',
  'ᶫ' => 'ʟ',
  'ᶬ' => 'ɱ',
  'ᶭ' => 'ɰ',
  'ᶮ' => 'ɲ',
  'ᶯ' => 'ɳ',
  'ᶰ' => 'ɴ',
  'ᶱ' => 'ɵ',
  'ᶲ' => 'ɸ',
  'ᶳ' => 'ʂ',
  'ᶴ' => 'ʃ',
  'ᶵ' => 'ƫ',
  'ᶶ' => 'ʉ',
  'ᶷ' => 'ʊ',
  'ᶸ' => 'ᴜ',
  'ᶹ' => 'ʋ',
  'ᶺ' => 'ʌ',
  'ᶻ' => 'z',
  'ᶼ' => 'ʐ',
  'ᶽ' => 'ʑ',
  'ᶾ' => 'ʒ',
  'ᶿ' => 'θ',
  'ẚ' => 'aʾ',
  'ẛ' => 'ṡ',
  '᾽' => ' ̓',
  '᾿' => ' ̓',
  '῀' => ' ͂',
  '῁' => ' ̈͂',
  '῍' => ' ̓̀',
  '῎' => ' ̓́',
  '῏' => ' ̓͂',
  '῝' => ' ̔̀',
  '῞' => ' ̔́',
  '῟' => ' ̔͂',
  '῭' => ' ̈̀',
  '΅' => ' ̈́',
  '´' => ' ́',
  '῾' => ' ̔',
  ' ' => ' ',
  ' ' => ' ',
  ' ' => ' ',
  ' ' => ' ',
  ' ' => ' ',
  ' ' => ' ',
  ' ' => ' ',
  ' ' => ' ',
  ' ' => ' ',
  ' ' => ' ',
  ' ' => ' ',
  '‑' => '‐',
  '‗' => ' ̳',
  '․' => '.',
  '‥' => '..',
  '…' => '...',
  ' ' => ' ',
  '″' => '′′',
  '‴' => '′′′',
  '‶' => '‵‵',
  '‷' => '‵‵‵',
  '‼' => '!!',
  '‾' => ' ̅',
  '⁇' => '??',
  '⁈' => '?!',
  '⁉' => '!?',
  '⁗' => '′′′′',
  ' ' => ' ',
  '⁰' => '0',
  'ⁱ' => 'i',
  '⁴' => '4',
  '⁵' => '5',
  '⁶' => '6',
  '⁷' => '7',
  '⁸' => '8',
  '⁹' => '9',
  '⁺' => '+',
  '⁻' => '−',
  '⁼' => '=',
  '⁽' => '(',
  '⁾' => ')',
  'ⁿ' => 'n',
  '₀' => '0',
  '₁' => '1',
  '₂' => '2',
  '₃' => '3',
  '₄' => '4',
  '₅' => '5',
  '₆' => '6',
  '₇' => '7',
  '₈' => '8',
  '₉' => '9',
  '₊' => '+',
  '₋' => '−',
  '₌' => '=',
  '₍' => '(',
  '₎' => ')',
  'ₐ' => 'a',
  'ₑ' => 'e',
  'ₒ' => 'o',
  'ₓ' => 'x',
  'ₔ' => 'ə',
  'ₕ' => 'h',
  'ₖ' => 'k',
  'ₗ' => 'l',
  'ₘ' => 'm',
  'ₙ' => 'n',
  'ₚ' => 'p',
  'ₛ' => 's',
  'ₜ' => 't',
  '₨' => 'Rs',
  '℀' => 'a/c',
  '℁' => 'a/s',
  'ℂ' => 'C',
  '℃' => '°C',
  '℅' => 'c/o',
  '℆' => 'c/u',
  'ℇ' => 'Ɛ',
  '℉' => '°F',
  'ℊ' => 'g',
  'ℋ' => 'H',
  'ℌ' => 'H',
  'ℍ' => 'H',
  'ℎ' => 'h',
  'ℏ' => 'ħ',
  'ℐ' => 'I',
  'ℑ' => 'I',
  'ℒ' => 'L',
  'ℓ' => 'l',
  'ℕ' => 'N',
  '№' => 'No',
  'ℙ' => 'P',
  'ℚ' => 'Q',
  'ℛ' => 'R',
  'ℜ' => 'R',
  'ℝ' => 'R',
  '℠' => 'SM',
  '℡' => 'TEL',
  '™' => 'TM',
  'ℤ' => 'Z',
  'ℨ' => 'Z',
  'ℬ' => 'B',
  'ℭ' => 'C',
  'ℯ' => 'e',
  'ℰ' => 'E',
  'ℱ' => 'F',
  'ℳ' => 'M',
  'ℴ' => 'o',
  'ℵ' => 'א',
  'ℶ' => 'ב',
  'ℷ' => 'ג',
  'ℸ' => 'ד',
  'ℹ' => 'i',
  '℻' => 'FAX',
  'ℼ' => 'π',
  'ℽ' => 'γ',
  'ℾ' => 'Γ',
  'ℿ' => 'Π',
  '⅀' => '∑',
  'ⅅ' => 'D',
  'ⅆ' => 'd',
  'ⅇ' => 'e',
  'ⅈ' => 'i',
  'ⅉ' => 'j',
  '⅐' => '1⁄7',
  '⅑' => '1⁄9',
  '⅒' => '1⁄10',
  '⅓' => '1⁄3',
  '⅔' => '2⁄3',
  '⅕' => '1⁄5',
  '⅖' => '2⁄5',
  '⅗' => '3⁄5',
  '⅘' => '4⁄5',
  '⅙' => '1⁄6',
  '⅚' => '5⁄6',
  '⅛' => '1⁄8',
  '⅜' => '3⁄8',
  '⅝' => '5⁄8',
  '⅞' => '7⁄8',
  '⅟' => '1⁄',
  'Ⅰ' => 'I',
  'Ⅱ' => 'II',
  'Ⅲ' => 'III',
  'Ⅳ' => 'IV',
  'Ⅴ' => 'V',
  'Ⅵ' => 'VI',
  'Ⅶ' => 'VII',
  'Ⅷ' => 'VIII',
  'Ⅸ' => 'IX',
  'Ⅹ' => 'X',
  'Ⅺ' => 'XI',
  'Ⅻ' => 'XII',
  'Ⅼ' => 'L',
  'Ⅽ' => 'C',
  'Ⅾ' => 'D',
  'Ⅿ' => 'M',
  'ⅰ' => 'i',
  'ⅱ' => 'ii',
  'ⅲ' => 'iii',
  'ⅳ' => 'iv',
  'ⅴ' => 'v',
  'ⅵ' => 'vi',
  'ⅶ' => 'vii',
  'ⅷ' => 'viii',
  'ⅸ' => 'ix',
  'ⅹ' => 'x',
  'ⅺ' => 'xi',
  'ⅻ' => 'xii',
  'ⅼ' => 'l',
  'ⅽ' => 'c',
  'ⅾ' => 'd',
  'ⅿ' => 'm',
  '↉' => '0⁄3',
  '∬' => '∫∫',
  '∭' => '∫∫∫',
  '∯' => '∮∮',
  '∰' => '∮∮∮',
  '①' => '1',
  '②' => '2',
  '③' => '3',
  '④' => '4',
  '⑤' => '5',
  '⑥' => '6',
  '⑦' => '7',
  '⑧' => '8',
  '⑨' => '9',
  '⑩' => '10',
  '⑪' => '11',
  '⑫' => '12',
  '⑬' => '13',
  '⑭' => '14',
  '⑮' => '15',
  '⑯' => '16',
  '⑰' => '17',
  '⑱' => '18',
  '⑲' => '19',
  '⑳' => '20',
  '⑴' => '(1)',
  '⑵' => '(2)',
  '⑶' => '(3)',
  '⑷' => '(4)',
  '⑸' => '(5)',
  '⑹' => '(6)',
  '⑺' => '(7)',
  '⑻' => '(8)',
  '⑼' => '(9)',
  '⑽' => '(10)',
  '⑾' => '(11)',
  '⑿' => '(12)',
  '⒀' => '(13)',
  '⒁' => '(14)',
  '⒂' => '(15)',
  '⒃' => '(16)',
  '⒄' => '(17)',
  '⒅' => '(18)',
  '⒆' => '(19)',
  '⒇' => '(20)',
  '⒈' => '1.',
  '⒉' => '2.',
  '⒊' => '3.',
  '⒋' => '4.',
  '⒌' => '5.',
  '⒍' => '6.',
  '⒎' => '7.',
  '⒏' => '8.',
  '⒐' => '9.',
  '⒑' => '10.',
  '⒒' => '11.',
  '⒓' => '12.',
  '⒔' => '13.',
  '⒕' => '14.',
  '⒖' => '15.',
  '⒗' => '16.',
  '⒘' => '17.',
  '⒙' => '18.',
  '⒚' => '19.',
  '⒛' => '20.',
  '⒜' => '(a)',
  '⒝' => '(b)',
  '⒞' => '(c)',
  '⒟' => '(d)',
  '⒠' => '(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',
  'Ⓕ' => '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',
  'ⓕ' => 'f',
  'ⓖ' => 'g',
  'ⓗ' => 'h',
  'ⓘ' => 'i',
  'ⓙ' => 'j',
  'ⓚ' => 'k',
  'ⓛ' => 'l',
  'ⓜ' => 'm',
  'ⓝ' => 'n',
  'ⓞ' => 'o',
  'ⓟ' => 'p',
  'ⓠ' => 'q',
  'ⓡ' => 'r',
  'ⓢ' => 's',
  'ⓣ' => 't',
  'ⓤ' => 'u',
  'ⓥ' => 'v',
  'ⓦ' => 'w',
  'ⓧ' => 'x',
  'ⓨ' => 'y',
  'ⓩ' => 'z',
  '⓪' => '0',
  '⨌' => '∫∫∫∫',
  '⩴' => '::=',
  '⩵' => '==',
  '⩶' => '===',
  'ⱼ' => 'j',
  'ⱽ' => 'V',
  'ⵯ' => 'ⵡ',
  '⺟' => '母',
  '⻳' => '龟',
  '⼀' => '一',
  '⼁' => '丨',
  '⼂' => '丶',
  '⼃' => '丿',
  '⼄' => '乙',
  '⼅' => '亅',
  '⼆' => '二',
  '⼇' => '亠',
  '⼈' => '人',
  '⼉' => '儿',
  '⼊' => '入',
  '⼋' => '八',
  '⼌' => '冂',
  '⼍' => '冖',
  '⼎' => '冫',
  '⼏' => '几',
  '⼐' => '凵',
  '⼑' => '刀',
  '⼒' => '力',
  '⼓' => '勹',
  '⼔' => '匕',
  '⼕' => '匚',
  '⼖' => '匸',
  '⼗' => '十',
  '⼘' => '卜',
  '⼙' => '卩',
  '⼚' => '厂',
  '⼛' => '厶',
  '⼜' => '又',
  '⼝' => '口',
  '⼞' => '囗',
  '⼟' => '土',
  '⼠' => '士',
  '⼡' => '夂',
  '⼢' => '夊',
  '⼣' => '夕',
  '⼤' => '大',
  '⼥' => '女',
  '⼦' => '子',
  '⼧' => '宀',
  '⼨' => '寸',
  '⼩' => '小',
  '⼪' => '尢',
  '⼫' => '尸',
  '⼬' => '屮',
  '⼭' => '山',
  '⼮' => '巛',
  '⼯' => '工',
  '⼰' => '己',
  '⼱' => '巾',
  '⼲' => '干',
  '⼳' => '幺',
  '⼴' => '广',
  '⼵' => '廴',
  '⼶' => '廾',
  '⼷' => '弋',
  '⼸' => '弓',
  '⼹' => '彐',
  '⼺' => '彡',
  '⼻' => '彳',
  '⼼' => '心',
  '⼽' => '戈',
  '⼾' => '戶',
  '⼿' => '手',
  '⽀' => '支',
  '⽁' => '攴',
  '⽂' => '文',
  '⽃' => '斗',
  '⽄' => '斤',
  '⽅' => '方',
  '⽆' => '无',
  '⽇' => '日',
  '⽈' => '曰',
  '⽉' => '月',
  '⽊' => '木',
  '⽋' => '欠',
  '⽌' => '止',
  '⽍' => '歹',
  '⽎' => '殳',
  '⽏' => '毋',
  '⽐' => '比',
  '⽑' => '毛',
  '⽒' => '氏',
  '⽓' => '气',
  '⽔' => '水',
  '⽕' => '火',
  '⽖' => '爪',
  '⽗' => '父',
  '⽘' => '爻',
  '⽙' => '爿',
  '⽚' => '片',
  '⽛' => '牙',
  '⽜' => '牛',
  '⽝' => '犬',
  '⽞' => '玄',
  '⽟' => '玉',
  '⽠' => '瓜',
  '⽡' => '瓦',
  '⽢' => '甘',
  '⽣' => '生',
  '⽤' => '用',
  '⽥' => '田',
  '⽦' => '疋',
  '⽧' => '疒',
  '⽨' => '癶',
  '⽩' => '白',
  '⽪' => '皮',
  '⽫' => '皿',
  '⽬' => '目',
  '⽭' => '矛',
  '⽮' => '矢',
  '⽯' => '石',
  '⽰' => '示',
  '⽱' => '禸',
  '⽲' => '禾',
  '⽳' => '穴',
  '⽴' => '立',
  '⽵' => '竹',
  '⽶' => '米',
  '⽷' => '糸',
  '⽸' => '缶',
  '⽹' => '网',
  '⽺' => '羊',
  '⽻' => '羽',
  '⽼' => '老',
  '⽽' => '而',
  '⽾' => '耒',
  '⽿' => '耳',
  '⾀' => '聿',
  '⾁' => '肉',
  '⾂' => '臣',
  '⾃' => '自',
  '⾄' => '至',
  '⾅' => '臼',
  '⾆' => '舌',
  '⾇' => '舛',
  '⾈' => '舟',
  '⾉' => '艮',
  '⾊' => '色',
  '⾋' => '艸',
  '⾌' => '虍',
  '⾍' => '虫',
  '⾎' => '血',
  '⾏' => '行',
  '⾐' => '衣',
  '⾑' => '襾',
  '⾒' => '見',
  '⾓' => '角',
  '⾔' => '言',
  '⾕' => '谷',
  '⾖' => '豆',
  '⾗' => '豕',
  '⾘' => '豸',
  '⾙' => '貝',
  '⾚' => '赤',
  '⾛' => '走',
  '⾜' => '足',
  '⾝' => '身',
  '⾞' => '車',
  '⾟' => '辛',
  '⾠' => '辰',
  '⾡' => '辵',
  '⾢' => '邑',
  '⾣' => '酉',
  '⾤' => '釆',
  '⾥' => '里',
  '⾦' => '金',
  '⾧' => '長',
  '⾨' => '門',
  '⾩' => '阜',
  '⾪' => '隶',
  '⾫' => '隹',
  '⾬' => '雨',
  '⾭' => '靑',
  '⾮' => '非',
  '⾯' => '面',
  '⾰' => '革',
  '⾱' => '韋',
  '⾲' => '韭',
  '⾳' => '音',
  '⾴' => '頁',
  '⾵' => '風',
  '⾶' => '飛',
  '⾷' => '食',
  '⾸' => '首',
  '⾹' => '香',
  '⾺' => '馬',
  '⾻' => '骨',
  '⾼' => '高',
  '⾽' => '髟',
  '⾾' => '鬥',
  '⾿' => '鬯',
  '⿀' => '鬲',
  '⿁' => '鬼',
  '⿂' => '魚',
  '⿃' => '鳥',
  '⿄' => '鹵',
  '⿅' => '鹿',
  '⿆' => '麥',
  '⿇' => '麻',
  '⿈' => '黃',
  '⿉' => '黍',
  '⿊' => '黑',
  '⿋' => '黹',
  '⿌' => '黽',
  '⿍' => '鼎',
  '⿎' => '鼓',
  '⿏' => '鼠',
  '⿐' => '鼻',
  '⿑' => '齊',
  '⿒' => '齒',
  '⿓' => '龍',
  '⿔' => '龜',
  '⿕' => '龠',
  ' ' => ' ',
  '〶' => '〒',
  '〸' => '十',
  '〹' => '卄',
  '〺' => '卅',
  '゛' => ' ゙',
  '゜' => ' ゚',
  'ゟ' => 'より',
  'ヿ' => 'コト',
  'ㄱ' => 'ᄀ',
  'ㄲ' => 'ᄁ',
  'ㄳ' => 'ᆪ',
  'ㄴ' => 'ᄂ',
  'ㄵ' => 'ᆬ',
  'ㄶ' => 'ᆭ',
  'ㄷ' => 'ᄃ',
  'ㄸ' => 'ᄄ',
  'ㄹ' => 'ᄅ',
  'ㄺ' => 'ᆰ',
  'ㄻ' => 'ᆱ',
  'ㄼ' => 'ᆲ',
  'ㄽ' => 'ᆳ',
  'ㄾ' => 'ᆴ',
  'ㄿ' => 'ᆵ',
  'ㅀ' => 'ᄚ',
  'ㅁ' => 'ᄆ',
  'ㅂ' => 'ᄇ',
  'ㅃ' => 'ᄈ',
  'ㅄ' => 'ᄡ',
  'ㅅ' => 'ᄉ',
  'ㅆ' => 'ᄊ',
  'ㅇ' => 'ᄋ',
  'ㅈ' => 'ᄌ',
  'ㅉ' => 'ᄍ',
  'ㅊ' => 'ᄎ',
  'ㅋ' => 'ᄏ',
  'ㅌ' => 'ᄐ',
  'ㅍ' => 'ᄑ',
  'ㅎ' => 'ᄒ',
  'ㅏ' => 'ᅡ',
  'ㅐ' => 'ᅢ',
  'ㅑ' => 'ᅣ',
  'ㅒ' => 'ᅤ',
  'ㅓ' => 'ᅥ',
  'ㅔ' => 'ᅦ',
  'ㅕ' => 'ᅧ',
  'ㅖ' => 'ᅨ',
  'ㅗ' => 'ᅩ',
  'ㅘ' => 'ᅪ',
  'ㅙ' => 'ᅫ',
  'ㅚ' => 'ᅬ',
  'ㅛ' => 'ᅭ',
  'ㅜ' => 'ᅮ',
  'ㅝ' => 'ᅯ',
  'ㅞ' => 'ᅰ',
  'ㅟ' => 'ᅱ',
  'ㅠ' => 'ᅲ',
  'ㅡ' => 'ᅳ',
  'ㅢ' => 'ᅴ',
  'ㅣ' => 'ᅵ',
  'ㅤ' => 'ᅠ',
  'ㅥ' => 'ᄔ',
  'ㅦ' => 'ᄕ',
  'ㅧ' => 'ᇇ',
  'ㅨ' => 'ᇈ',
  'ㅩ' => 'ᇌ',
  'ㅪ' => 'ᇎ',
  'ㅫ' => 'ᇓ',
  'ㅬ' => 'ᇗ',
  'ㅭ' => 'ᇙ',
  'ㅮ' => 'ᄜ',
  'ㅯ' => 'ᇝ',
  'ㅰ' => 'ᇟ',
  'ㅱ' => 'ᄝ',
  'ㅲ' => 'ᄞ',
  'ㅳ' => 'ᄠ',
  'ㅴ' => 'ᄢ',
  'ㅵ' => 'ᄣ',
  'ㅶ' => 'ᄧ',
  'ㅷ' => 'ᄩ',
  'ㅸ' => 'ᄫ',
  'ㅹ' => 'ᄬ',
  'ㅺ' => 'ᄭ',
  'ㅻ' => 'ᄮ',
  'ㅼ' => 'ᄯ',
  'ㅽ' => 'ᄲ',
  'ㅾ' => 'ᄶ',
  'ㅿ' => 'ᅀ',
  'ㆀ' => 'ᅇ',
  'ㆁ' => 'ᅌ',
  'ㆂ' => 'ᇱ',
  'ㆃ' => 'ᇲ',
  'ㆄ' => 'ᅗ',
  'ㆅ' => 'ᅘ',
  'ㆆ' => 'ᅙ',
  'ㆇ' => 'ᆄ',
  'ㆈ' => 'ᆅ',
  'ㆉ' => 'ᆈ',
  'ㆊ' => 'ᆑ',
  'ㆋ' => 'ᆒ',
  'ㆌ' => 'ᆔ',
  'ㆍ' => 'ᆞ',
  'ㆎ' => 'ᆡ',
  '㆒' => '一',
  '㆓' => '二',
  '㆔' => '三',
  '㆕' => '四',
  '㆖' => '上',
  '㆗' => '中',
  '㆘' => '下',
  '㆙' => '甲',
  '㆚' => '乙',
  '㆛' => '丙',
  '㆜' => '丁',
  '㆝' => '天',
  '㆞' => '地',
  '㆟' => '人',
  '㈀' => '(ᄀ)',
  '㈁' => '(ᄂ)',
  '㈂' => '(ᄃ)',
  '㈃' => '(ᄅ)',
  '㈄' => '(ᄆ)',
  '㈅' => '(ᄇ)',
  '㈆' => '(ᄉ)',
  '㈇' => '(ᄋ)',
  '㈈' => '(ᄌ)',
  '㈉' => '(ᄎ)',
  '㈊' => '(ᄏ)',
  '㈋' => '(ᄐ)',
  '㈌' => '(ᄑ)',
  '㈍' => '(ᄒ)',
  '㈎' => '(가)',
  '㈏' => '(나)',
  '㈐' => '(다)',
  '㈑' => '(라)',
  '㈒' => '(마)',
  '㈓' => '(바)',
  '㈔' => '(사)',
  '㈕' => '(아)',
  '㈖' => '(자)',
  '㈗' => '(차)',
  '㈘' => '(카)',
  '㈙' => '(타)',
  '㈚' => '(파)',
  '㈛' => '(하)',
  '㈜' => '(주)',
  '㈝' => '(오전)',
  '㈞' => '(오후)',
  '㈠' => '(一)',
  '㈡' => '(二)',
  '㈢' => '(三)',
  '㈣' => '(四)',
  '㈤' => '(五)',
  '㈥' => '(六)',
  '㈦' => '(七)',
  '㈧' => '(八)',
  '㈨' => '(九)',
  '㈩' => '(十)',
  '㈪' => '(月)',
  '㈫' => '(火)',
  '㈬' => '(水)',
  '㈭' => '(木)',
  '㈮' => '(金)',
  '㈯' => '(土)',
  '㈰' => '(日)',
  '㈱' => '(株)',
  '㈲' => '(有)',
  '㈳' => '(社)',
  '㈴' => '(名)',
  '㈵' => '(特)',
  '㈶' => '(財)',
  '㈷' => '(祝)',
  '㈸' => '(労)',
  '㈹' => '(代)',
  '㈺' => '(呼)',
  '㈻' => '(学)',
  '㈼' => '(監)',
  '㈽' => '(企)',
  '㈾' => '(資)',
  '㈿' => '(協)',
  '㉀' => '(祭)',
  '㉁' => '(休)',
  '㉂' => '(自)',
  '㉃' => '(至)',
  '㉄' => '問',
  '㉅' => '幼',
  '㉆' => '文',
  '㉇' => '箏',
  '㉐' => 'PTE',
  '㉑' => '21',
  '㉒' => '22',
  '㉓' => '23',
  '㉔' => '24',
  '㉕' => '25',
  '㉖' => '26',
  '㉗' => '27',
  '㉘' => '28',
  '㉙' => '29',
  '㉚' => '30',
  '㉛' => '31',
  '㉜' => '32',
  '㉝' => '33',
  '㉞' => '34',
  '㉟' => '35',
  '㉠' => 'ᄀ',
  '㉡' => 'ᄂ',
  '㉢' => 'ᄃ',
  '㉣' => 'ᄅ',
  '㉤' => 'ᄆ',
  '㉥' => 'ᄇ',
  '㉦' => 'ᄉ',
  '㉧' => 'ᄋ',
  '㉨' => 'ᄌ',
  '㉩' => 'ᄎ',
  '㉪' => 'ᄏ',
  '㉫' => 'ᄐ',
  '㉬' => 'ᄑ',
  '㉭' => 'ᄒ',
  '㉮' => '가',
  '㉯' => '나',
  '㉰' => '다',
  '㉱' => '라',
  '㉲' => '마',
  '㉳' => '바',
  '㉴' => '사',
  '㉵' => '아',
  '㉶' => '자',
  '㉷' => '차',
  '㉸' => '카',
  '㉹' => '타',
  '㉺' => '파',
  '㉻' => '하',
  '㉼' => '참고',
  '㉽' => '주의',
  '㉾' => '우',
  '㊀' => '一',
  '㊁' => '二',
  '㊂' => '三',
  '㊃' => '四',
  '㊄' => '五',
  '㊅' => '六',
  '㊆' => '七',
  '㊇' => '八',
  '㊈' => '九',
  '㊉' => '十',
  '㊊' => '月',
  '㊋' => '火',
  '㊌' => '水',
  '㊍' => '木',
  '㊎' => '金',
  '㊏' => '土',
  '㊐' => '日',
  '㊑' => '株',
  '㊒' => '有',
  '㊓' => '社',
  '㊔' => '名',
  '㊕' => '特',
  '㊖' => '財',
  '㊗' => '祝',
  '㊘' => '労',
  '㊙' => '秘',
  '㊚' => '男',
  '㊛' => '女',
  '㊜' => '適',
  '㊝' => '優',
  '㊞' => '印',
  '㊟' => '注',
  '㊠' => '項',
  '㊡' => '休',
  '㊢' => '写',
  '㊣' => '正',
  '㊤' => '上',
  '㊥' => '中',
  '㊦' => '下',
  '㊧' => '左',
  '㊨' => '右',
  '㊩' => '医',
  '㊪' => '宗',
  '㊫' => '学',
  '㊬' => '監',
  '㊭' => '企',
  '㊮' => '資',
  '㊯' => '協',
  '㊰' => '夜',
  '㊱' => '36',
  '㊲' => '37',
  '㊳' => '38',
  '㊴' => '39',
  '㊵' => '40',
  '㊶' => '41',
  '㊷' => '42',
  '㊸' => '43',
  '㊹' => '44',
  '㊺' => '45',
  '㊻' => '46',
  '㊼' => '47',
  '㊽' => '48',
  '㊾' => '49',
  '㊿' => '50',
  '㋀' => '1月',
  '㋁' => '2月',
  '㋂' => '3月',
  '㋃' => '4月',
  '㋄' => '5月',
  '㋅' => '6月',
  '㋆' => '7月',
  '㋇' => '8月',
  '㋈' => '9月',
  '㋉' => '10月',
  '㋊' => '11月',
  '㋋' => '12月',
  '㋌' => 'Hg',
  '㋍' => 'erg',
  '㋎' => 'eV',
  '㋏' => 'LTD',
  '㋐' => 'ア',
  '㋑' => 'イ',
  '㋒' => 'ウ',
  '㋓' => 'エ',
  '㋔' => 'オ',
  '㋕' => 'カ',
  '㋖' => 'キ',
  '㋗' => 'ク',
  '㋘' => 'ケ',
  '㋙' => 'コ',
  '㋚' => 'サ',
  '㋛' => 'シ',
  '㋜' => 'ス',
  '㋝' => 'セ',
  '㋞' => 'ソ',
  '㋟' => 'タ',
  '㋠' => 'チ',
  '㋡' => 'ツ',
  '㋢' => 'テ',
  '㋣' => 'ト',
  '㋤' => 'ナ',
  '㋥' => 'ニ',
  '㋦' => 'ヌ',
  '㋧' => 'ネ',
  '㋨' => 'ノ',
  '㋩' => 'ハ',
  '㋪' => 'ヒ',
  '㋫' => 'フ',
  '㋬' => 'ヘ',
  '㋭' => 'ホ',
  '㋮' => 'マ',
  '㋯' => 'ミ',
  '㋰' => 'ム',
  '㋱' => 'メ',
  '㋲' => 'モ',
  '㋳' => 'ヤ',
  '㋴' => 'ユ',
  '㋵' => 'ヨ',
  '㋶' => 'ラ',
  '㋷' => 'リ',
  '㋸' => 'ル',
  '㋹' => 'レ',
  '㋺' => 'ロ',
  '㋻' => 'ワ',
  '㋼' => 'ヰ',
  '㋽' => 'ヱ',
  '㋾' => 'ヲ',
  '㋿' => '令和',
  '㌀' => 'アパート',
  '㌁' => 'アルファ',
  '㌂' => 'アンペア',
  '㌃' => 'アール',
  '㌄' => 'イニング',
  '㌅' => 'インチ',
  '㌆' => 'ウォン',
  '㌇' => 'エスクード',
  '㌈' => 'エーカー',
  '㌉' => 'オンス',
  '㌊' => 'オーム',
  '㌋' => 'カイリ',
  '㌌' => 'カラット',
  '㌍' => 'カロリー',
  '㌎' => 'ガロン',
  '㌏' => 'ガンマ',
  '㌐' => 'ギガ',
  '㌑' => 'ギニー',
  '㌒' => 'キュリー',
  '㌓' => 'ギルダー',
  '㌔' => 'キロ',
  '㌕' => 'キログラム',
  '㌖' => 'キロメートル',
  '㌗' => 'キロワット',
  '㌘' => 'グラム',
  '㌙' => 'グラムトン',
  '㌚' => 'クルゼイロ',
  '㌛' => 'クローネ',
  '㌜' => 'ケース',
  '㌝' => 'コルナ',
  '㌞' => 'コーポ',
  '㌟' => 'サイクル',
  '㌠' => 'サンチーム',
  '㌡' => 'シリング',
  '㌢' => 'センチ',
  '㌣' => 'セント',
  '㌤' => 'ダース',
  '㌥' => 'デシ',
  '㌦' => 'ドル',
  '㌧' => 'トン',
  '㌨' => 'ナノ',
  '㌩' => 'ノット',
  '㌪' => 'ハイツ',
  '㌫' => 'パーセント',
  '㌬' => 'パーツ',
  '㌭' => 'バーレル',
  '㌮' => 'ピアストル',
  '㌯' => 'ピクル',
  '㌰' => 'ピコ',
  '㌱' => 'ビル',
  '㌲' => 'ファラッド',
  '㌳' => 'フィート',
  '㌴' => 'ブッシェル',
  '㌵' => 'フラン',
  '㌶' => 'ヘクタール',
  '㌷' => 'ペソ',
  '㌸' => 'ペニヒ',
  '㌹' => 'ヘルツ',
  '㌺' => 'ペンス',
  '㌻' => 'ページ',
  '㌼' => 'ベータ',
  '㌽' => 'ポイント',
  '㌾' => 'ボルト',
  '㌿' => 'ホン',
  '㍀' => 'ポンド',
  '㍁' => 'ホール',
  '㍂' => 'ホーン',
  '㍃' => 'マイクロ',
  '㍄' => 'マイル',
  '㍅' => 'マッハ',
  '㍆' => 'マルク',
  '㍇' => 'マンション',
  '㍈' => 'ミクロン',
  '㍉' => 'ミリ',
  '㍊' => 'ミリバール',
  '㍋' => 'メガ',
  '㍌' => 'メガトン',
  '㍍' => 'メートル',
  '㍎' => 'ヤード',
  '㍏' => 'ヤール',
  '㍐' => 'ユアン',
  '㍑' => 'リットル',
  '㍒' => 'リラ',
  '㍓' => 'ルピー',
  '㍔' => 'ルーブル',
  '㍕' => 'レム',
  '㍖' => 'レントゲン',
  '㍗' => 'ワット',
  '㍘' => '0点',
  '㍙' => '1点',
  '㍚' => '2点',
  '㍛' => '3点',
  '㍜' => '4点',
  '㍝' => '5点',
  '㍞' => '6点',
  '㍟' => '7点',
  '㍠' => '8点',
  '㍡' => '9点',
  '㍢' => '10点',
  '㍣' => '11点',
  '㍤' => '12点',
  '㍥' => '13点',
  '㍦' => '14点',
  '㍧' => '15点',
  '㍨' => '16点',
  '㍩' => '17点',
  '㍪' => '18点',
  '㍫' => '19点',
  '㍬' => '20点',
  '㍭' => '21点',
  '㍮' => '22点',
  '㍯' => '23点',
  '㍰' => '24点',
  '㍱' => 'hPa',
  '㍲' => 'da',
  '㍳' => 'AU',
  '㍴' => 'bar',
  '㍵' => 'oV',
  '㍶' => 'pc',
  '㍷' => 'dm',
  '㍸' => 'dm2',
  '㍹' => 'dm3',
  '㍺' => 'IU',
  '㍻' => '平成',
  '㍼' => '昭和',
  '㍽' => '大正',
  '㍾' => '明治',
  '㍿' => '株式会社',
  '㎀' => 'pA',
  '㎁' => 'nA',
  '㎂' => 'μA',
  '㎃' => 'mA',
  '㎄' => 'kA',
  '㎅' => 'KB',
  '㎆' => 'MB',
  '㎇' => 'GB',
  '㎈' => 'cal',
  '㎉' => 'kcal',
  '㎊' => 'pF',
  '㎋' => 'nF',
  '㎌' => 'μF',
  '㎍' => 'μg',
  '㎎' => 'mg',
  '㎏' => 'kg',
  '㎐' => 'Hz',
  '㎑' => 'kHz',
  '㎒' => 'MHz',
  '㎓' => 'GHz',
  '㎔' => 'THz',
  '㎕' => 'μl',
  '㎖' => 'ml',
  '㎗' => 'dl',
  '㎘' => 'kl',
  '㎙' => 'fm',
  '㎚' => 'nm',
  '㎛' => 'μm',
  '㎜' => 'mm',
  '㎝' => 'cm',
  '㎞' => 'km',
  '㎟' => 'mm2',
  '㎠' => 'cm2',
  '㎡' => 'm2',
  '㎢' => 'km2',
  '㎣' => 'mm3',
  '㎤' => 'cm3',
  '㎥' => 'm3',
  '㎦' => 'km3',
  '㎧' => 'm∕s',
  '㎨' => 'm∕s2',
  '㎩' => 'Pa',
  '㎪' => 'kPa',
  '㎫' => 'MPa',
  '㎬' => 'GPa',
  '㎭' => 'rad',
  '㎮' => 'rad∕s',
  '㎯' => 'rad∕s2',
  '㎰' => 'ps',
  '㎱' => 'ns',
  '㎲' => 'μs',
  '㎳' => 'ms',
  '㎴' => 'pV',
  '㎵' => 'nV',
  '㎶' => 'μV',
  '㎷' => 'mV',
  '㎸' => 'kV',
  '㎹' => 'MV',
  '㎺' => 'pW',
  '㎻' => 'nW',
  '㎼' => 'μW',
  '㎽' => 'mW',
  '㎾' => 'kW',
  '㎿' => 'MW',
  '㏀' => 'kΩ',
  '㏁' => 'MΩ',
  '㏂' => 'a.m.',
  '㏃' => 'Bq',
  '㏄' => 'cc',
  '㏅' => 'cd',
  '㏆' => 'C∕kg',
  '㏇' => 'Co.',
  '㏈' => 'dB',
  '㏉' => 'Gy',
  '㏊' => 'ha',
  '㏋' => 'HP',
  '㏌' => 'in',
  '㏍' => 'KK',
  '㏎' => 'KM',
  '㏏' => 'kt',
  '㏐' => 'lm',
  '㏑' => 'ln',
  '㏒' => 'log',
  '㏓' => 'lx',
  '㏔' => 'mb',
  '㏕' => 'mil',
  '㏖' => 'mol',
  '㏗' => 'PH',
  '㏘' => 'p.m.',
  '㏙' => 'PPM',
  '㏚' => 'PR',
  '㏛' => 'sr',
  '㏜' => 'Sv',
  '㏝' => 'Wb',
  '㏞' => 'V∕m',
  '㏟' => 'A∕m',
  '㏠' => '1日',
  '㏡' => '2日',
  '㏢' => '3日',
  '㏣' => '4日',
  '㏤' => '5日',
  '㏥' => '6日',
  '㏦' => '7日',
  '㏧' => '8日',
  '㏨' => '9日',
  '㏩' => '10日',
  '㏪' => '11日',
  '㏫' => '12日',
  '㏬' => '13日',
  '㏭' => '14日',
  '㏮' => '15日',
  '㏯' => '16日',
  '㏰' => '17日',
  '㏱' => '18日',
  '㏲' => '19日',
  '㏳' => '20日',
  '㏴' => '21日',
  '㏵' => '22日',
  '㏶' => '23日',
  '㏷' => '24日',
  '㏸' => '25日',
  '㏹' => '26日',
  '㏺' => '27日',
  '㏻' => '28日',
  '㏼' => '29日',
  '㏽' => '30日',
  '㏾' => '31日',
  '㏿' => 'gal',
  'ꚜ' => 'ъ',
  'ꚝ' => 'ь',
  'ꝰ' => 'ꝯ',
  'ꟸ' => 'Ħ',
  'ꟹ' => 'œ',
  'ꭜ' => 'ꜧ',
  'ꭝ' => 'ꬷ',
  'ꭞ' => 'ɫ',
  'ꭟ' => 'ꭒ',
  'ꭩ' => 'ʍ',
  'ff' => 'ff',
  'fi' => 'fi',
  'fl' => 'fl',
  'ffi' => 'ffi',
  'ffl' => 'ffl',
  'ſt' => 'st',
  'st' => 'st',
  'ﬓ' => 'մն',
  'ﬔ' => 'մե',
  'ﬕ' => 'մի',
  'ﬖ' => 'վն',
  'ﬗ' => 'մխ',
  'ﬠ' => 'ע',
  'ﬡ' => 'א',
  'ﬢ' => 'ד',
  'ﬣ' => 'ה',
  'ﬤ' => 'כ',
  'ﬥ' => 'ל',
  'ﬦ' => 'ם',
  'ﬧ' => 'ר',
  'ﬨ' => 'ת',
  '﬩' => '+',
  'ﭏ' => 'אל',
  'ﭐ' => 'ٱ',
  'ﭑ' => 'ٱ',
  'ﭒ' => 'ٻ',
  'ﭓ' => 'ٻ',
  'ﭔ' => 'ٻ',
  'ﭕ' => 'ٻ',
  'ﭖ' => 'پ',
  'ﭗ' => 'پ',
  'ﭘ' => 'پ',
  'ﭙ' => 'پ',
  'ﭚ' => 'ڀ',
  'ﭛ' => 'ڀ',
  'ﭜ' => 'ڀ',
  'ﭝ' => 'ڀ',
  'ﭞ' => 'ٺ',
  'ﭟ' => 'ٺ',
  'ﭠ' => 'ٺ',
  'ﭡ' => 'ٺ',
  'ﭢ' => 'ٿ',
  'ﭣ' => 'ٿ',
  'ﭤ' => 'ٿ',
  'ﭥ' => 'ٿ',
  'ﭦ' => 'ٹ',
  'ﭧ' => 'ٹ',
  'ﭨ' => 'ٹ',
  'ﭩ' => 'ٹ',
  'ﭪ' => 'ڤ',
  'ﭫ' => 'ڤ',
  'ﭬ' => 'ڤ',
  'ﭭ' => 'ڤ',
  'ﭮ' => 'ڦ',
  'ﭯ' => 'ڦ',
  'ﭰ' => 'ڦ',
  'ﭱ' => 'ڦ',
  'ﭲ' => 'ڄ',
  'ﭳ' => 'ڄ',
  'ﭴ' => 'ڄ',
  'ﭵ' => 'ڄ',
  'ﭶ' => 'ڃ',
  'ﭷ' => 'ڃ',
  'ﭸ' => 'ڃ',
  'ﭹ' => 'ڃ',
  'ﭺ' => 'چ',
  'ﭻ' => 'چ',
  'ﭼ' => 'چ',
  'ﭽ' => 'چ',
  'ﭾ' => 'ڇ',
  'ﭿ' => 'ڇ',
  'ﮀ' => 'ڇ',
  'ﮁ' => 'ڇ',
  'ﮂ' => 'ڍ',
  'ﮃ' => 'ڍ',
  'ﮄ' => 'ڌ',
  'ﮅ' => 'ڌ',
  'ﮆ' => 'ڎ',
  'ﮇ' => 'ڎ',
  'ﮈ' => 'ڈ',
  'ﮉ' => 'ڈ',
  'ﮊ' => 'ژ',
  'ﮋ' => 'ژ',
  'ﮌ' => 'ڑ',
  'ﮍ' => 'ڑ',
  'ﮎ' => 'ک',
  'ﮏ' => 'ک',
  'ﮐ' => 'ک',
  'ﮑ' => 'ک',
  'ﮒ' => 'گ',
  'ﮓ' => 'گ',
  'ﮔ' => 'گ',
  'ﮕ' => 'گ',
  'ﮖ' => 'ڳ',
  'ﮗ' => 'ڳ',
  'ﮘ' => 'ڳ',
  'ﮙ' => 'ڳ',
  'ﮚ' => 'ڱ',
  'ﮛ' => 'ڱ',
  'ﮜ' => 'ڱ',
  'ﮝ' => 'ڱ',
  'ﮞ' => 'ں',
  'ﮟ' => 'ں',
  'ﮠ' => 'ڻ',
  'ﮡ' => 'ڻ',
  'ﮢ' => 'ڻ',
  'ﮣ' => 'ڻ',
  'ﮤ' => 'ۀ',
  'ﮥ' => 'ۀ',
  'ﮦ' => 'ہ',
  'ﮧ' => 'ہ',
  'ﮨ' => 'ہ',
  'ﮩ' => 'ہ',
  'ﮪ' => 'ھ',
  'ﮫ' => 'ھ',
  'ﮬ' => 'ھ',
  'ﮭ' => 'ھ',
  'ﮮ' => 'ے',
  'ﮯ' => 'ے',
  'ﮰ' => 'ۓ',
  'ﮱ' => 'ۓ',
  'ﯓ' => 'ڭ',
  'ﯔ' => 'ڭ',
  'ﯕ' => 'ڭ',
  'ﯖ' => 'ڭ',
  'ﯗ' => 'ۇ',
  'ﯘ' => 'ۇ',
  'ﯙ' => 'ۆ',
  'ﯚ' => 'ۆ',
  'ﯛ' => 'ۈ',
  'ﯜ' => 'ۈ',
  'ﯝ' => 'ۇٴ',
  'ﯞ' => 'ۋ',
  'ﯟ' => 'ۋ',
  'ﯠ' => 'ۅ',
  'ﯡ' => 'ۅ',
  'ﯢ' => 'ۉ',
  'ﯣ' => 'ۉ',
  'ﯤ' => 'ې',
  'ﯥ' => 'ې',
  'ﯦ' => 'ې',
  'ﯧ' => 'ې',
  'ﯨ' => 'ى',
  'ﯩ' => 'ى',
  'ﯪ' => 'ئا',
  'ﯫ' => 'ئا',
  'ﯬ' => 'ئە',
  'ﯭ' => 'ئە',
  'ﯮ' => 'ئو',
  'ﯯ' => 'ئو',
  'ﯰ' => 'ئۇ',
  'ﯱ' => 'ئۇ',
  'ﯲ' => 'ئۆ',
  'ﯳ' => 'ئۆ',
  'ﯴ' => 'ئۈ',
  'ﯵ' => 'ئۈ',
  'ﯶ' => 'ئې',
  'ﯷ' => 'ئې',
  'ﯸ' => 'ئې',
  'ﯹ' => 'ئى',
  'ﯺ' => 'ئى',
  'ﯻ' => 'ئى',
  'ﯼ' => 'ی',
  'ﯽ' => 'ی',
  'ﯾ' => 'ی',
  'ﯿ' => 'ی',
  'ﰀ' => 'ئج',
  'ﰁ' => 'ئح',
  'ﰂ' => 'ئم',
  'ﰃ' => 'ئى',
  'ﰄ' => 'ئي',
  'ﰅ' => 'بج',
  'ﰆ' => 'بح',
  'ﰇ' => 'بخ',
  'ﰈ' => 'بم',
  'ﰉ' => 'بى',
  'ﰊ' => 'بي',
  'ﰋ' => 'تج',
  'ﰌ' => 'تح',
  'ﰍ' => 'تخ',
  'ﰎ' => 'تم',
  'ﰏ' => 'تى',
  'ﰐ' => 'تي',
  'ﰑ' => 'ثج',
  'ﰒ' => 'ثم',
  'ﰓ' => 'ثى',
  'ﰔ' => 'ثي',
  'ﰕ' => 'جح',
  'ﰖ' => 'جم',
  'ﰗ' => 'حج',
  'ﰘ' => 'حم',
  'ﰙ' => 'خج',
  'ﰚ' => 'خح',
  'ﰛ' => 'خم',
  'ﰜ' => 'سج',
  'ﰝ' => 'سح',
  'ﰞ' => 'سخ',
  'ﰟ' => 'سم',
  'ﰠ' => 'صح',
  'ﰡ' => 'صم',
  'ﰢ' => 'ضج',
  'ﰣ' => 'ضح',
  'ﰤ' => 'ضخ',
  'ﰥ' => 'ضم',
  'ﰦ' => 'طح',
  'ﰧ' => 'طم',
  'ﰨ' => 'ظم',
  'ﰩ' => 'عج',
  'ﰪ' => 'عم',
  'ﰫ' => 'غج',
  'ﰬ' => 'غم',
  'ﰭ' => 'فج',
  'ﰮ' => 'فح',
  'ﰯ' => 'فخ',
  'ﰰ' => 'فم',
  'ﰱ' => 'فى',
  'ﰲ' => 'في',
  'ﰳ' => 'قح',
  'ﰴ' => 'قم',
  'ﰵ' => 'قى',
  'ﰶ' => 'قي',
  'ﰷ' => 'كا',
  'ﰸ' => 'كج',
  'ﰹ' => 'كح',
  'ﰺ' => 'كخ',
  'ﰻ' => 'كل',
  'ﰼ' => 'كم',
  'ﰽ' => 'كى',
  'ﰾ' => 'كي',
  'ﰿ' => 'لج',
  'ﱀ' => 'لح',
  'ﱁ' => 'لخ',
  'ﱂ' => 'لم',
  'ﱃ' => 'لى',
  'ﱄ' => 'لي',
  'ﱅ' => 'مج',
  'ﱆ' => 'مح',
  'ﱇ' => 'مخ',
  'ﱈ' => 'مم',
  'ﱉ' => 'مى',
  'ﱊ' => 'مي',
  'ﱋ' => 'نج',
  'ﱌ' => 'نح',
  'ﱍ' => 'نخ',
  'ﱎ' => 'نم',
  'ﱏ' => 'نى',
  'ﱐ' => 'ني',
  'ﱑ' => 'هج',
  'ﱒ' => 'هم',
  'ﱓ' => 'هى',
  'ﱔ' => 'هي',
  'ﱕ' => 'يج',
  'ﱖ' => 'يح',
  'ﱗ' => 'يخ',
  'ﱘ' => 'يم',
  'ﱙ' => 'يى',
  'ﱚ' => 'يي',
  'ﱛ' => 'ذٰ',
  'ﱜ' => 'رٰ',
  'ﱝ' => 'ىٰ',
  'ﱞ' => ' ٌّ',
  'ﱟ' => ' ٍّ',
  'ﱠ' => ' َّ',
  'ﱡ' => ' ُّ',
  'ﱢ' => ' ِّ',
  'ﱣ' => ' ّٰ',
  'ﱤ' => 'ئر',
  'ﱥ' => 'ئز',
  'ﱦ' => 'ئم',
  'ﱧ' => 'ئن',
  'ﱨ' => 'ئى',
  'ﱩ' => 'ئي',
  'ﱪ' => 'بر',
  'ﱫ' => 'بز',
  'ﱬ' => 'بم',
  'ﱭ' => 'بن',
  'ﱮ' => 'بى',
  'ﱯ' => 'بي',
  'ﱰ' => 'تر',
  'ﱱ' => 'تز',
  'ﱲ' => 'تم',
  'ﱳ' => 'تن',
  'ﱴ' => 'تى',
  'ﱵ' => 'تي',
  'ﱶ' => 'ثر',
  'ﱷ' => 'ثز',
  'ﱸ' => 'ثم',
  'ﱹ' => 'ثن',
  'ﱺ' => 'ثى',
  'ﱻ' => 'ثي',
  'ﱼ' => 'فى',
  'ﱽ' => 'في',
  'ﱾ' => 'قى',
  'ﱿ' => 'قي',
  'ﲀ' => 'كا',
  'ﲁ' => 'كل',
  'ﲂ' => 'كم',
  'ﲃ' => 'كى',
  'ﲄ' => 'كي',
  'ﲅ' => 'لم',
  'ﲆ' => 'لى',
  'ﲇ' => 'لي',
  'ﲈ' => 'ما',
  'ﲉ' => 'مم',
  'ﲊ' => 'نر',
  'ﲋ' => 'نز',
  'ﲌ' => 'نم',
  'ﲍ' => 'نن',
  'ﲎ' => 'نى',
  'ﲏ' => 'ني',
  'ﲐ' => 'ىٰ',
  'ﲑ' => 'ير',
  'ﲒ' => 'يز',
  'ﲓ' => 'يم',
  'ﲔ' => 'ين',
  'ﲕ' => 'يى',
  'ﲖ' => 'يي',
  'ﲗ' => 'ئج',
  'ﲘ' => 'ئح',
  'ﲙ' => 'ئخ',
  'ﲚ' => 'ئم',
  'ﲛ' => 'ئه',
  'ﲜ' => 'بج',
  'ﲝ' => 'بح',
  'ﲞ' => 'بخ',
  'ﲟ' => 'بم',
  'ﲠ' => 'به',
  'ﲡ' => 'تج',
  'ﲢ' => 'تح',
  'ﲣ' => 'تخ',
  'ﲤ' => 'تم',
  'ﲥ' => 'ته',
  'ﲦ' => 'ثم',
  'ﲧ' => 'جح',
  'ﲨ' => 'جم',
  'ﲩ' => 'حج',
  'ﲪ' => 'حم',
  'ﲫ' => 'خج',
  'ﲬ' => 'خم',
  'ﲭ' => 'سج',
  'ﲮ' => 'سح',
  'ﲯ' => 'سخ',
  'ﲰ' => 'سم',
  'ﲱ' => 'صح',
  'ﲲ' => 'صخ',
  'ﲳ' => 'صم',
  'ﲴ' => 'ضج',
  'ﲵ' => 'ضح',
  'ﲶ' => 'ضخ',
  'ﲷ' => 'ضم',
  'ﲸ' => 'طح',
  'ﲹ' => 'ظم',
  'ﲺ' => 'عج',
  'ﲻ' => 'عم',
  'ﲼ' => 'غج',
  'ﲽ' => 'غم',
  'ﲾ' => 'فج',
  'ﲿ' => 'فح',
  'ﳀ' => 'فخ',
  'ﳁ' => 'فم',
  'ﳂ' => 'قح',
  'ﳃ' => 'قم',
  'ﳄ' => 'كج',
  'ﳅ' => 'كح',
  'ﳆ' => 'كخ',
  'ﳇ' => 'كل',
  'ﳈ' => 'كم',
  'ﳉ' => 'لج',
  'ﳊ' => 'لح',
  'ﳋ' => 'لخ',
  'ﳌ' => 'لم',
  'ﳍ' => 'له',
  'ﳎ' => 'مج',
  'ﳏ' => 'مح',
  'ﳐ' => 'مخ',
  'ﳑ' => 'مم',
  'ﳒ' => 'نج',
  'ﳓ' => 'نح',
  'ﳔ' => 'نخ',
  'ﳕ' => 'نم',
  'ﳖ' => 'نه',
  'ﳗ' => 'هج',
  'ﳘ' => 'هم',
  'ﳙ' => 'هٰ',
  'ﳚ' => 'يج',
  'ﳛ' => 'يح',
  'ﳜ' => 'يخ',
  'ﳝ' => 'يم',
  'ﳞ' => 'يه',
  'ﳟ' => 'ئم',
  'ﳠ' => 'ئه',
  'ﳡ' => 'بم',
  'ﳢ' => 'به',
  'ﳣ' => 'تم',
  'ﳤ' => 'ته',
  'ﳥ' => 'ثم',
  'ﳦ' => 'ثه',
  'ﳧ' => 'سم',
  'ﳨ' => 'سه',
  'ﳩ' => 'شم',
  'ﳪ' => 'شه',
  'ﳫ' => 'كل',
  'ﳬ' => 'كم',
  'ﳭ' => 'لم',
  'ﳮ' => 'نم',
  'ﳯ' => 'نه',
  'ﳰ' => 'يم',
  'ﳱ' => 'يه',
  'ﳲ' => 'ـَّ',
  'ﳳ' => 'ـُّ',
  'ﳴ' => 'ـِّ',
  'ﳵ' => 'طى',
  'ﳶ' => 'طي',
  'ﳷ' => 'عى',
  'ﳸ' => 'عي',
  'ﳹ' => 'غى',
  'ﳺ' => 'غي',
  'ﳻ' => 'سى',
  'ﳼ' => 'سي',
  'ﳽ' => 'شى',
  'ﳾ' => 'شي',
  'ﳿ' => 'حى',
  'ﴀ' => 'حي',
  'ﴁ' => 'جى',
  'ﴂ' => 'جي',
  'ﴃ' => 'خى',
  'ﴄ' => 'خي',
  'ﴅ' => 'صى',
  'ﴆ' => 'صي',
  'ﴇ' => 'ضى',
  'ﴈ' => 'ضي',
  'ﴉ' => 'شج',
  'ﴊ' => 'شح',
  'ﴋ' => 'شخ',
  'ﴌ' => 'شم',
  'ﴍ' => 'شر',
  'ﴎ' => 'سر',
  'ﴏ' => 'صر',
  'ﴐ' => 'ضر',
  'ﴑ' => 'طى',
  'ﴒ' => 'طي',
  'ﴓ' => 'عى',
  'ﴔ' => 'عي',
  'ﴕ' => 'غى',
  'ﴖ' => 'غي',
  'ﴗ' => 'سى',
  'ﴘ' => 'سي',
  'ﴙ' => 'شى',
  'ﴚ' => 'شي',
  'ﴛ' => 'حى',
  'ﴜ' => 'حي',
  'ﴝ' => 'جى',
  'ﴞ' => 'جي',
  'ﴟ' => 'خى',
  'ﴠ' => 'خي',
  'ﴡ' => 'صى',
  'ﴢ' => 'صي',
  'ﴣ' => 'ضى',
  'ﴤ' => 'ضي',
  'ﴥ' => 'شج',
  'ﴦ' => 'شح',
  'ﴧ' => 'شخ',
  'ﴨ' => 'شم',
  'ﴩ' => 'شر',
  'ﴪ' => 'سر',
  'ﴫ' => 'صر',
  'ﴬ' => 'ضر',
  'ﴭ' => 'شج',
  'ﴮ' => 'شح',
  'ﴯ' => 'شخ',
  'ﴰ' => 'شم',
  'ﴱ' => 'سه',
  'ﴲ' => 'شه',
  'ﴳ' => 'طم',
  'ﴴ' => 'سج',
  'ﴵ' => 'سح',
  'ﴶ' => 'سخ',
  'ﴷ' => 'شج',
  'ﴸ' => 'شح',
  'ﴹ' => 'شخ',
  'ﴺ' => 'طم',
  'ﴻ' => 'ظم',
  'ﴼ' => 'اً',
  'ﴽ' => 'اً',
  'ﵐ' => 'تجم',
  'ﵑ' => 'تحج',
  'ﵒ' => 'تحج',
  'ﵓ' => 'تحم',
  'ﵔ' => 'تخم',
  'ﵕ' => 'تمج',
  'ﵖ' => 'تمح',
  'ﵗ' => 'تمخ',
  'ﵘ' => 'جمح',
  'ﵙ' => 'جمح',
  'ﵚ' => 'حمي',
  'ﵛ' => 'حمى',
  'ﵜ' => 'سحج',
  'ﵝ' => 'سجح',
  'ﵞ' => 'سجى',
  'ﵟ' => 'سمح',
  'ﵠ' => 'سمح',
  'ﵡ' => 'سمج',
  'ﵢ' => 'سمم',
  'ﵣ' => 'سمم',
  'ﵤ' => 'صحح',
  'ﵥ' => 'صحح',
  'ﵦ' => 'صمم',
  'ﵧ' => 'شحم',
  'ﵨ' => 'شحم',
  'ﵩ' => 'شجي',
  'ﵪ' => 'شمخ',
  'ﵫ' => 'شمخ',
  'ﵬ' => 'شمم',
  'ﵭ' => 'شمم',
  'ﵮ' => 'ضحى',
  'ﵯ' => 'ضخم',
  'ﵰ' => 'ضخم',
  'ﵱ' => 'طمح',
  'ﵲ' => 'طمح',
  'ﵳ' => 'طمم',
  'ﵴ' => 'طمي',
  'ﵵ' => 'عجم',
  'ﵶ' => 'عمم',
  'ﵷ' => 'عمم',
  'ﵸ' => 'عمى',
  'ﵹ' => 'غمم',
  'ﵺ' => 'غمي',
  'ﵻ' => 'غمى',
  'ﵼ' => 'فخم',
  'ﵽ' => 'فخم',
  'ﵾ' => 'قمح',
  'ﵿ' => 'قمم',
  'ﶀ' => 'لحم',
  'ﶁ' => 'لحي',
  'ﶂ' => 'لحى',
  'ﶃ' => 'لجج',
  'ﶄ' => 'لجج',
  'ﶅ' => 'لخم',
  'ﶆ' => 'لخم',
  'ﶇ' => 'لمح',
  'ﶈ' => 'لمح',
  'ﶉ' => 'محج',
  'ﶊ' => 'محم',
  'ﶋ' => 'محي',
  'ﶌ' => 'مجح',
  'ﶍ' => 'مجم',
  'ﶎ' => 'مخج',
  'ﶏ' => 'مخم',
  'ﶒ' => 'مجخ',
  'ﶓ' => 'همج',
  'ﶔ' => 'همم',
  'ﶕ' => 'نحم',
  'ﶖ' => 'نحى',
  'ﶗ' => 'نجم',
  'ﶘ' => 'نجم',
  'ﶙ' => 'نجى',
  'ﶚ' => 'نمي',
  'ﶛ' => 'نمى',
  'ﶜ' => 'يمم',
  'ﶝ' => 'يمم',
  'ﶞ' => 'بخي',
  'ﶟ' => 'تجي',
  'ﶠ' => 'تجى',
  'ﶡ' => 'تخي',
  'ﶢ' => 'تخى',
  'ﶣ' => 'تمي',
  'ﶤ' => 'تمى',
  'ﶥ' => 'جمي',
  'ﶦ' => 'جحى',
  'ﶧ' => 'جمى',
  'ﶨ' => 'سخى',
  'ﶩ' => 'صحي',
  'ﶪ' => 'شحي',
  'ﶫ' => 'ضحي',
  'ﶬ' => 'لجي',
  'ﶭ' => 'لمي',
  'ﶮ' => 'يحي',
  'ﶯ' => 'يجي',
  'ﶰ' => 'يمي',
  'ﶱ' => 'ممي',
  'ﶲ' => 'قمي',
  'ﶳ' => 'نحي',
  'ﶴ' => 'قمح',
  'ﶵ' => 'لحم',
  'ﶶ' => 'عمي',
  'ﶷ' => 'كمي',
  'ﶸ' => 'نجح',
  'ﶹ' => 'مخي',
  'ﶺ' => 'لجم',
  'ﶻ' => 'كمم',
  'ﶼ' => 'لجم',
  'ﶽ' => 'نجح',
  'ﶾ' => 'جحي',
  'ﶿ' => 'حجي',
  'ﷀ' => 'مجي',
  'ﷁ' => 'فمي',
  'ﷂ' => 'بحي',
  'ﷃ' => 'كمم',
  'ﷄ' => 'عجم',
  'ﷅ' => 'صمم',
  'ﷆ' => 'سخي',
  'ﷇ' => 'نجي',
  'ﷰ' => 'صلے',
  'ﷱ' => 'قلے',
  'ﷲ' => 'الله',
  'ﷳ' => 'اكبر',
  'ﷴ' => 'محمد',
  'ﷵ' => 'صلعم',
  'ﷶ' => 'رسول',
  'ﷷ' => 'عليه',
  'ﷸ' => 'وسلم',
  'ﷹ' => 'صلى',
  'ﷺ' => 'صلى الله عليه وسلم',
  'ﷻ' => 'جل جلاله',
  '﷼' => 'ریال',
  '︐' => ',',
  '︑' => '、',
  '︒' => '。',
  '︓' => ':',
  '︔' => ';',
  '︕' => '!',
  '︖' => '?',
  '︗' => '〖',
  '︘' => '〗',
  '︙' => '...',
  '︰' => '..',
  '︱' => '—',
  '︲' => '–',
  '︳' => '_',
  '︴' => '_',
  '︵' => '(',
  '︶' => ')',
  '︷' => '{',
  '︸' => '}',
  '︹' => '〔',
  '︺' => '〕',
  '︻' => '【',
  '︼' => '】',
  '︽' => '《',
  '︾' => '》',
  '︿' => '〈',
  '﹀' => '〉',
  '﹁' => '「',
  '﹂' => '」',
  '﹃' => '『',
  '﹄' => '』',
  '﹇' => '[',
  '﹈' => ']',
  '﹉' => ' ̅',
  '﹊' => ' ̅',
  '﹋' => ' ̅',
  '﹌' => ' ̅',
  '﹍' => '_',
  '﹎' => '_',
  '﹏' => '_',
  '﹐' => ',',
  '﹑' => '、',
  '﹒' => '.',
  '﹔' => ';',
  '﹕' => ':',
  '﹖' => '?',
  '﹗' => '!',
  '﹘' => '—',
  '﹙' => '(',
  '﹚' => ')',
  '﹛' => '{',
  '﹜' => '}',
  '﹝' => '〔',
  '﹞' => '〕',
  '﹟' => '#',
  '﹠' => '&',
  '﹡' => '*',
  '﹢' => '+',
  '﹣' => '-',
  '﹤' => '<',
  '﹥' => '>',
  '﹦' => '=',
  '﹨' => '\\',
  '﹩' => '$',
  '﹪' => '%',
  '﹫' => '@',
  'ﹰ' => ' ً',
  'ﹱ' => 'ـً',
  'ﹲ' => ' ٌ',
  'ﹴ' => ' ٍ',
  'ﹶ' => ' َ',
  'ﹷ' => 'ـَ',
  'ﹸ' => ' ُ',
  'ﹹ' => 'ـُ',
  'ﹺ' => ' ِ',
  'ﹻ' => 'ـِ',
  'ﹼ' => ' ّ',
  'ﹽ' => 'ـّ',
  'ﹾ' => ' ْ',
  'ﹿ' => 'ـْ',
  'ﺀ' => 'ء',
  'ﺁ' => 'آ',
  'ﺂ' => 'آ',
  'ﺃ' => 'أ',
  'ﺄ' => 'أ',
  'ﺅ' => 'ؤ',
  'ﺆ' => 'ؤ',
  'ﺇ' => 'إ',
  'ﺈ' => 'إ',
  'ﺉ' => 'ئ',
  'ﺊ' => 'ئ',
  'ﺋ' => 'ئ',
  'ﺌ' => 'ئ',
  'ﺍ' => 'ا',
  'ﺎ' => 'ا',
  'ﺏ' => 'ب',
  'ﺐ' => 'ب',
  'ﺑ' => 'ب',
  'ﺒ' => 'ب',
  'ﺓ' => 'ة',
  'ﺔ' => 'ة',
  'ﺕ' => 'ت',
  'ﺖ' => 'ت',
  'ﺗ' => 'ت',
  'ﺘ' => 'ت',
  'ﺙ' => 'ث',
  'ﺚ' => 'ث',
  'ﺛ' => 'ث',
  'ﺜ' => 'ث',
  'ﺝ' => 'ج',
  'ﺞ' => 'ج',
  'ﺟ' => 'ج',
  'ﺠ' => 'ج',
  'ﺡ' => 'ح',
  'ﺢ' => 'ح',
  'ﺣ' => 'ح',
  'ﺤ' => 'ح',
  'ﺥ' => 'خ',
  'ﺦ' => 'خ',
  'ﺧ' => 'خ',
  'ﺨ' => 'خ',
  'ﺩ' => 'د',
  'ﺪ' => 'د',
  'ﺫ' => 'ذ',
  'ﺬ' => 'ذ',
  'ﺭ' => 'ر',
  'ﺮ' => 'ر',
  'ﺯ' => 'ز',
  'ﺰ' => 'ز',
  'ﺱ' => 'س',
  'ﺲ' => 'س',
  'ﺳ' => 'س',
  'ﺴ' => 'س',
  'ﺵ' => 'ش',
  'ﺶ' => 'ش',
  'ﺷ' => 'ش',
  'ﺸ' => 'ش',
  'ﺹ' => 'ص',
  'ﺺ' => 'ص',
  'ﺻ' => 'ص',
  'ﺼ' => 'ص',
  'ﺽ' => 'ض',
  'ﺾ' => 'ض',
  'ﺿ' => 'ض',
  'ﻀ' => 'ض',
  'ﻁ' => 'ط',
  'ﻂ' => 'ط',
  'ﻃ' => 'ط',
  'ﻄ' => 'ط',
  'ﻅ' => 'ظ',
  'ﻆ' => 'ظ',
  'ﻇ' => 'ظ',
  'ﻈ' => 'ظ',
  'ﻉ' => 'ع',
  'ﻊ' => 'ع',
  'ﻋ' => 'ع',
  'ﻌ' => 'ع',
  'ﻍ' => 'غ',
  'ﻎ' => 'غ',
  'ﻏ' => 'غ',
  'ﻐ' => 'غ',
  'ﻑ' => 'ف',
  'ﻒ' => 'ف',
  'ﻓ' => 'ف',
  'ﻔ' => 'ف',
  'ﻕ' => 'ق',
  'ﻖ' => 'ق',
  'ﻗ' => 'ق',
  'ﻘ' => 'ق',
  'ﻙ' => 'ك',
  'ﻚ' => 'ك',
  'ﻛ' => 'ك',
  'ﻜ' => 'ك',
  'ﻝ' => 'ل',
  'ﻞ' => 'ل',
  'ﻟ' => 'ل',
  'ﻠ' => 'ل',
  'ﻡ' => 'م',
  'ﻢ' => 'م',
  'ﻣ' => 'م',
  'ﻤ' => 'م',
  'ﻥ' => 'ن',
  'ﻦ' => 'ن',
  'ﻧ' => 'ن',
  'ﻨ' => 'ن',
  'ﻩ' => 'ه',
  'ﻪ' => 'ه',
  'ﻫ' => 'ه',
  'ﻬ' => 'ه',
  'ﻭ' => 'و',
  'ﻮ' => 'و',
  'ﻯ' => 'ى',
  'ﻰ' => 'ى',
  'ﻱ' => 'ي',
  'ﻲ' => 'ي',
  'ﻳ' => 'ي',
  'ﻴ' => 'ي',
  'ﻵ' => 'لآ',
  'ﻶ' => 'لآ',
  'ﻷ' => 'لأ',
  'ﻸ' => 'لأ',
  'ﻹ' => 'لإ',
  'ﻺ' => 'لإ',
  'ﻻ' => 'لا',
  'ﻼ' => 'لا',
  '!' => '!',
  '"' => '"',
  '#' => '#',
  '$' => '$',
  '%' => '%',
  '&' => '&',
  ''' => '\'',
  '(' => '(',
  ')' => ')',
  '*' => '*',
  '+' => '+',
  ',' => ',',
  '-' => '-',
  '.' => '.',
  '/' => '/',
  '0' => '0',
  '1' => '1',
  '2' => '2',
  '3' => '3',
  '4' => '4',
  '5' => '5',
  '6' => '6',
  '7' => '7',
  '8' => '8',
  '9' => '9',
  ':' => ':',
  ';' => ';',
  '<' => '<',
  '=' => '=',
  '>' => '>',
  '?' => '?',
  '@' => '@',
  'A' => 'A',
  'B' => 'B',
  'C' => 'C',
  'D' => 'D',
  'E' => 'E',
  'F' => 'F',
  'G' => 'G',
  'H' => 'H',
  'I' => 'I',
  'J' => 'J',
  'K' => 'K',
  'L' => 'L',
  'M' => 'M',
  'N' => 'N',
  'O' => 'O',
  'P' => 'P',
  'Q' => 'Q',
  'R' => 'R',
  'S' => 'S',
  'T' => 'T',
  'U' => 'U',
  'V' => 'V',
  'W' => 'W',
  'X' => 'X',
  'Y' => 'Y',
  'Z' => 'Z',
  '[' => '[',
  '\' => '\\',
  ']' => ']',
  '^' => '^',
  '_' => '_',
  '`' => '`',
  'a' => 'a',
  'b' => 'b',
  'c' => 'c',
  'd' => 'd',
  'e' => 'e',
  'f' => 'f',
  'g' => 'g',
  'h' => 'h',
  'i' => 'i',
  'j' => 'j',
  'k' => 'k',
  'l' => 'l',
  'm' => 'm',
  'n' => 'n',
  'o' => 'o',
  'p' => 'p',
  'q' => 'q',
  'r' => 'r',
  's' => 's',
  't' => 't',
  'u' => 'u',
  'v' => 'v',
  'w' => 'w',
  'x' => 'x',
  'y' => 'y',
  'z' => 'z',
  '{' => '{',
  '|' => '|',
  '}' => '}',
  '~' => '~',
  '⦅' => '⦅',
  '⦆' => '⦆',
  '。' => '。',
  '「' => '「',
  '」' => '」',
  '、' => '、',
  '・' => '・',
  'ヲ' => 'ヲ',
  'ァ' => 'ァ',
  'ィ' => 'ィ',
  'ゥ' => 'ゥ',
  'ェ' => 'ェ',
  'ォ' => 'ォ',
  'ャ' => 'ャ',
  'ュ' => 'ュ',
  'ョ' => 'ョ',
  'ッ' => 'ッ',
  'ー' => 'ー',
  'ア' => 'ア',
  'イ' => 'イ',
  'ウ' => 'ウ',
  'エ' => 'エ',
  'オ' => 'オ',
  'カ' => 'カ',
  'キ' => 'キ',
  'ク' => 'ク',
  'ケ' => 'ケ',
  'コ' => 'コ',
  'サ' => 'サ',
  'シ' => 'シ',
  'ス' => 'ス',
  'セ' => 'セ',
  'ソ' => 'ソ',
  'タ' => 'タ',
  'チ' => 'チ',
  'ツ' => 'ツ',
  'テ' => 'テ',
  'ト' => 'ト',
  'ナ' => 'ナ',
  'ニ' => 'ニ',
  'ヌ' => 'ヌ',
  'ネ' => 'ネ',
  'ノ' => 'ノ',
  'ハ' => 'ハ',
  'ヒ' => 'ヒ',
  'フ' => 'フ',
  'ヘ' => 'ヘ',
  'ホ' => 'ホ',
  'マ' => 'マ',
  'ミ' => 'ミ',
  'ム' => 'ム',
  'メ' => 'メ',
  'モ' => 'モ',
  'ヤ' => 'ヤ',
  'ユ' => 'ユ',
  'ヨ' => 'ヨ',
  'ラ' => 'ラ',
  'リ' => 'リ',
  'ル' => 'ル',
  'レ' => 'レ',
  'ロ' => 'ロ',
  'ワ' => 'ワ',
  'ン' => 'ン',
  '゙' => '゙',
  '゚' => '゚',
  'ᅠ' => 'ᅠ',
  'ᄀ' => 'ᄀ',
  'ᄁ' => 'ᄁ',
  'ᆪ' => 'ᆪ',
  'ᄂ' => 'ᄂ',
  'ᆬ' => 'ᆬ',
  'ᆭ' => 'ᆭ',
  'ᄃ' => 'ᄃ',
  'ᄄ' => 'ᄄ',
  'ᄅ' => 'ᄅ',
  'ᆰ' => 'ᆰ',
  'ᆱ' => 'ᆱ',
  'ᆲ' => 'ᆲ',
  'ᆳ' => 'ᆳ',
  'ᆴ' => 'ᆴ',
  'ᆵ' => 'ᆵ',
  'ᄚ' => 'ᄚ',
  'ᄆ' => 'ᄆ',
  'ᄇ' => 'ᄇ',
  'ᄈ' => 'ᄈ',
  'ᄡ' => 'ᄡ',
  'ᄉ' => 'ᄉ',
  'ᄊ' => 'ᄊ',
  'ᄋ' => 'ᄋ',
  'ᄌ' => 'ᄌ',
  'ᄍ' => 'ᄍ',
  'ᄎ' => 'ᄎ',
  'ᄏ' => 'ᄏ',
  'ᄐ' => 'ᄐ',
  'ᄑ' => 'ᄑ',
  'ᄒ' => 'ᄒ',
  'ᅡ' => 'ᅡ',
  'ᅢ' => 'ᅢ',
  'ᅣ' => 'ᅣ',
  'ᅤ' => 'ᅤ',
  'ᅥ' => 'ᅥ',
  'ᅦ' => 'ᅦ',
  'ᅧ' => 'ᅧ',
  'ᅨ' => 'ᅨ',
  'ᅩ' => 'ᅩ',
  'ᅪ' => 'ᅪ',
  'ᅫ' => 'ᅫ',
  'ᅬ' => 'ᅬ',
  'ᅭ' => 'ᅭ',
  'ᅮ' => 'ᅮ',
  'ᅯ' => 'ᅯ',
  'ᅰ' => 'ᅰ',
  'ᅱ' => 'ᅱ',
  'ᅲ' => 'ᅲ',
  'ᅳ' => 'ᅳ',
  'ᅴ' => 'ᅴ',
  'ᅵ' => 'ᅵ',
  '¢' => '¢',
  '£' => '£',
  '¬' => '¬',
  ' ̄' => ' ̄',
  '¦' => '¦',
  '¥' => '¥',
  '₩' => '₩',
  '│' => '│',
  '←' => '←',
  '↑' => '↑',
  '→' => '→',
  '↓' => '↓',
  '■' => '■',
  '○' => '○',
  '𝐀' => 'A',
  '𝐁' => 'B',
  '𝐂' => 'C',
  '𝐃' => 'D',
  '𝐄' => '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',
  '𝐟' => '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',
  '𝐹' => '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',
  '𝑓' => 'f',
  '𝑔' => 'g',
  '𝑖' => 'i',
  '𝑗' => 'j',
  '𝑘' => 'k',
  '𝑙' => 'l',
  '𝑚' => 'm',
  '𝑛' => 'n',
  '𝑜' => 'o',
  '𝑝' => 'p',
  '𝑞' => 'q',
  '𝑟' => 'r',
  '𝑠' => 's',
  '𝑡' => 't',
  '𝑢' => 'u',
  '𝑣' => 'v',
  '𝑤' => 'w',
  '𝑥' => 'x',
  '𝑦' => 'y',
  '𝑧' => 'z',
  '𝑨' => 'A',
  '𝑩' => 'B',
  '𝑪' => 'C',
  '𝑫' => 'D',
  '𝑬' => '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',
  '𝒇' => 'f',
  '𝒈' => 'g',
  '𝒉' => 'h',
  '𝒊' => 'i',
  '𝒋' => 'j',
  '𝒌' => 'k',
  '𝒍' => 'l',
  '𝒎' => 'm',
  '𝒏' => 'n',
  '𝒐' => 'o',
  '𝒑' => 'p',
  '𝒒' => 'q',
  '𝒓' => 'r',
  '𝒔' => 's',
  '𝒕' => 't',
  '𝒖' => 'u',
  '𝒗' => 'v',
  '𝒘' => 'w',
  '𝒙' => 'x',
  '𝒚' => 'y',
  '𝒛' => 'z',
  '𝒜' => 'A',
  '𝒞' => 'C',
  '𝒟' => 'D',
  '𝒢' => 'G',
  '𝒥' => 'J',
  '𝒦' => 'K',
  '𝒩' => 'N',
  '𝒪' => 'O',
  '𝒫' => 'P',
  '𝒬' => 'Q',
  '𝒮' => 'S',
  '𝒯' => 'T',
  '𝒰' => 'U',
  '𝒱' => 'V',
  '𝒲' => 'W',
  '𝒳' => 'X',
  '𝒴' => 'Y',
  '𝒵' => 'Z',
  '𝒶' => 'a',
  '𝒷' => 'b',
  '𝒸' => 'c',
  '𝒹' => 'd',
  '𝒻' => 'f',
  '𝒽' => 'h',
  '𝒾' => 'i',
  '𝒿' => 'j',
  '𝓀' => 'k',
  '𝓁' => 'l',
  '𝓂' => 'm',
  '𝓃' => 'n',
  '𝓅' => 'p',
  '𝓆' => 'q',
  '𝓇' => 'r',
  '𝓈' => 's',
  '𝓉' => 't',
  '𝓊' => 'u',
  '𝓋' => 'v',
  '𝓌' => 'w',
  '𝓍' => 'x',
  '𝓎' => 'y',
  '𝓏' => 'z',
  '𝓐' => 'A',
  '𝓑' => 'B',
  '𝓒' => 'C',
  '𝓓' => 'D',
  '𝓔' => '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',
  '𝓯' => 'f',
  '𝓰' => 'g',
  '𝓱' => 'h',
  '𝓲' => 'i',
  '𝓳' => 'j',
  '𝓴' => 'k',
  '𝓵' => 'l',
  '𝓶' => 'm',
  '𝓷' => 'n',
  '𝓸' => 'o',
  '𝓹' => 'p',
  '𝓺' => 'q',
  '𝓻' => 'r',
  '𝓼' => 's',
  '𝓽' => 't',
  '𝓾' => 'u',
  '𝓿' => 'v',
  '𝔀' => 'w',
  '𝔁' => 'x',
  '𝔂' => 'y',
  '𝔃' => 'z',
  '𝔄' => 'A',
  '𝔅' => 'B',
  '𝔇' => 'D',
  '𝔈' => 'E',
  '𝔉' => 'F',
  '𝔊' => 'G',
  '𝔍' => 'J',
  '𝔎' => 'K',
  '𝔏' => 'L',
  '𝔐' => 'M',
  '𝔑' => 'N',
  '𝔒' => 'O',
  '𝔓' => 'P',
  '𝔔' => 'Q',
  '𝔖' => 'S',
  '𝔗' => 'T',
  '𝔘' => 'U',
  '𝔙' => 'V',
  '𝔚' => 'W',
  '𝔛' => 'X',
  '𝔜' => 'Y',
  '𝔞' => 'a',
  '𝔟' => 'b',
  '𝔠' => 'c',
  '𝔡' => 'd',
  '𝔢' => 'e',
  '𝔣' => 'f',
  '𝔤' => 'g',
  '𝔥' => 'h',
  '𝔦' => 'i',
  '𝔧' => 'j',
  '𝔨' => 'k',
  '𝔩' => 'l',
  '𝔪' => 'm',
  '𝔫' => 'n',
  '𝔬' => 'o',
  '𝔭' => 'p',
  '𝔮' => 'q',
  '𝔯' => 'r',
  '𝔰' => 's',
  '𝔱' => 't',
  '𝔲' => 'u',
  '𝔳' => 'v',
  '𝔴' => 'w',
  '𝔵' => 'x',
  '𝔶' => 'y',
  '𝔷' => 'z',
  '𝔸' => 'A',
  '𝔹' => 'B',
  '𝔻' => 'D',
  '𝔼' => 'E',
  '𝔽' => 'F',
  '𝔾' => 'G',
  '𝕀' => 'I',
  '𝕁' => 'J',
  '𝕂' => 'K',
  '𝕃' => 'L',
  '𝕄' => 'M',
  '𝕆' => 'O',
  '𝕊' => 'S',
  '𝕋' => 'T',
  '𝕌' => 'U',
  '𝕍' => 'V',
  '𝕎' => 'W',
  '𝕏' => 'X',
  '𝕐' => 'Y',
  '𝕒' => 'a',
  '𝕓' => 'b',
  '𝕔' => 'c',
  '𝕕' => 'd',
  '𝕖' => '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',
  '𝕱' => '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',
  '𝖋' => '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',
  '𝖥' => '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',
  '𝖿' => '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',
  '𝗙' => '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',
  '𝗳' => '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',
  '𝘍' => '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',
  '𝘧' => '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',
  '𝙁' => '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',
  '𝙛' => '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',
  '𝙵' => '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',
  '𝚏' => 'f',
  '𝚐' => 'g',
  '𝚑' => 'h',
  '𝚒' => 'i',
  '𝚓' => 'j',
  '𝚔' => 'k',
  '𝚕' => 'l',
  '𝚖' => 'm',
  '𝚗' => 'n',
  '𝚘' => 'o',
  '𝚙' => 'p',
  '𝚚' => 'q',
  '𝚛' => 'r',
  '𝚜' => 's',
  '𝚝' => 't',
  '𝚞' => 'u',
  '𝚟' => 'v',
  '𝚠' => 'w',
  '𝚡' => 'x',
  '𝚢' => 'y',
  '𝚣' => 'z',
  '𝚤' => 'ı',
  '𝚥' => 'ȷ',
  '𝚨' => 'Α',
  '𝚩' => 'Β',
  '𝚪' => 'Γ',
  '𝚫' => 'Δ',
  '𝚬' => 'Ε',
  '𝚭' => 'Ζ',
  '𝚮' => 'Η',
  '𝚯' => 'Θ',
  '𝚰' => 'Ι',
  '𝚱' => 'Κ',
  '𝚲' => 'Λ',
  '𝚳' => 'Μ',
  '𝚴' => 'Ν',
  '𝚵' => 'Ξ',
  '𝚶' => 'Ο',
  '𝚷' => 'Π',
  '𝚸' => 'Ρ',
  '𝚹' => 'Θ',
  '𝚺' => 'Σ',
  '𝚻' => 'Τ',
  '𝚼' => 'Υ',
  '𝚽' => 'Φ',
  '𝚾' => 'Χ',
  '𝚿' => 'Ψ',
  '𝛀' => 'Ω',
  '𝛁' => '∇',
  '𝛂' => 'α',
  '𝛃' => 'β',
  '𝛄' => 'γ',
  '𝛅' => 'δ',
  '𝛆' => 'ε',
  '𝛇' => 'ζ',
  '𝛈' => 'η',
  '𝛉' => 'θ',
  '𝛊' => 'ι',
  '𝛋' => 'κ',
  '𝛌' => 'λ',
  '𝛍' => 'μ',
  '𝛎' => 'ν',
  '𝛏' => 'ξ',
  '𝛐' => 'ο',
  '𝛑' => 'π',
  '𝛒' => 'ρ',
  '𝛓' => 'ς',
  '𝛔' => 'σ',
  '𝛕' => 'τ',
  '𝛖' => 'υ',
  '𝛗' => 'φ',
  '𝛘' => 'χ',
  '𝛙' => 'ψ',
  '𝛚' => 'ω',
  '𝛛' => '∂',
  '𝛜' => 'ε',
  '𝛝' => 'θ',
  '𝛞' => 'κ',
  '𝛟' => 'φ',
  '𝛠' => 'ρ',
  '𝛡' => 'π',
  '𝛢' => 'Α',
  '𝛣' => 'Β',
  '𝛤' => 'Γ',
  '𝛥' => 'Δ',
  '𝛦' => 'Ε',
  '𝛧' => 'Ζ',
  '𝛨' => 'Η',
  '𝛩' => 'Θ',
  '𝛪' => 'Ι',
  '𝛫' => 'Κ',
  '𝛬' => 'Λ',
  '𝛭' => 'Μ',
  '𝛮' => 'Ν',
  '𝛯' => 'Ξ',
  '𝛰' => 'Ο',
  '𝛱' => 'Π',
  '𝛲' => 'Ρ',
  '𝛳' => 'Θ',
  '𝛴' => 'Σ',
  '𝛵' => 'Τ',
  '𝛶' => 'Υ',
  '𝛷' => 'Φ',
  '𝛸' => 'Χ',
  '𝛹' => 'Ψ',
  '𝛺' => 'Ω',
  '𝛻' => '∇',
  '𝛼' => 'α',
  '𝛽' => 'β',
  '𝛾' => 'γ',
  '𝛿' => 'δ',
  '𝜀' => 'ε',
  '𝜁' => 'ζ',
  '𝜂' => 'η',
  '𝜃' => 'θ',
  '𝜄' => 'ι',
  '𝜅' => 'κ',
  '𝜆' => 'λ',
  '𝜇' => 'μ',
  '𝜈' => 'ν',
  '𝜉' => 'ξ',
  '𝜊' => 'ο',
  '𝜋' => 'π',
  '𝜌' => 'ρ',
  '𝜍' => 'ς',
  '𝜎' => 'σ',
  '𝜏' => 'τ',
  '𝜐' => 'υ',
  '𝜑' => 'φ',
  '𝜒' => 'χ',
  '𝜓' => 'ψ',
  '𝜔' => 'ω',
  '𝜕' => '∂',
  '𝜖' => 'ε',
  '𝜗' => 'θ',
  '𝜘' => 'κ',
  '𝜙' => 'φ',
  '𝜚' => 'ρ',
  '𝜛' => 'π',
  '𝜜' => 'Α',
  '𝜝' => 'Β',
  '𝜞' => 'Γ',
  '𝜟' => 'Δ',
  '𝜠' => 'Ε',
  '𝜡' => 'Ζ',
  '𝜢' => 'Η',
  '𝜣' => 'Θ',
  '𝜤' => 'Ι',
  '𝜥' => 'Κ',
  '𝜦' => 'Λ',
  '𝜧' => 'Μ',
  '𝜨' => 'Ν',
  '𝜩' => 'Ξ',
  '𝜪' => 'Ο',
  '𝜫' => 'Π',
  '𝜬' => 'Ρ',
  '𝜭' => 'Θ',
  '𝜮' => 'Σ',
  '𝜯' => 'Τ',
  '𝜰' => 'Υ',
  '𝜱' => 'Φ',
  '𝜲' => 'Χ',
  '𝜳' => 'Ψ',
  '𝜴' => 'Ω',
  '𝜵' => '∇',
  '𝜶' => 'α',
  '𝜷' => 'β',
  '𝜸' => 'γ',
  '𝜹' => 'δ',
  '𝜺' => 'ε',
  '𝜻' => 'ζ',
  '𝜼' => 'η',
  '𝜽' => 'θ',
  '𝜾' => 'ι',
  '𝜿' => 'κ',
  '𝝀' => 'λ',
  '𝝁' => 'μ',
  '𝝂' => 'ν',
  '𝝃' => 'ξ',
  '𝝄' => 'ο',
  '𝝅' => 'π',
  '𝝆' => 'ρ',
  '𝝇' => 'ς',
  '𝝈' => 'σ',
  '𝝉' => 'τ',
  '𝝊' => 'υ',
  '𝝋' => 'φ',
  '𝝌' => 'χ',
  '𝝍' => 'ψ',
  '𝝎' => 'ω',
  '𝝏' => '∂',
  '𝝐' => 'ε',
  '𝝑' => 'θ',
  '𝝒' => 'κ',
  '𝝓' => 'φ',
  '𝝔' => 'ρ',
  '𝝕' => 'π',
  '𝝖' => 'Α',
  '𝝗' => 'Β',
  '𝝘' => 'Γ',
  '𝝙' => 'Δ',
  '𝝚' => 'Ε',
  '𝝛' => 'Ζ',
  '𝝜' => 'Η',
  '𝝝' => 'Θ',
  '𝝞' => 'Ι',
  '𝝟' => 'Κ',
  '𝝠' => 'Λ',
  '𝝡' => 'Μ',
  '𝝢' => 'Ν',
  '𝝣' => 'Ξ',
  '𝝤' => 'Ο',
  '𝝥' => 'Π',
  '𝝦' => 'Ρ',
  '𝝧' => 'Θ',
  '𝝨' => 'Σ',
  '𝝩' => 'Τ',
  '𝝪' => 'Υ',
  '𝝫' => 'Φ',
  '𝝬' => 'Χ',
  '𝝭' => 'Ψ',
  '𝝮' => 'Ω',
  '𝝯' => '∇',
  '𝝰' => 'α',
  '𝝱' => 'β',
  '𝝲' => 'γ',
  '𝝳' => 'δ',
  '𝝴' => 'ε',
  '𝝵' => 'ζ',
  '𝝶' => 'η',
  '𝝷' => 'θ',
  '𝝸' => 'ι',
  '𝝹' => 'κ',
  '𝝺' => 'λ',
  '𝝻' => 'μ',
  '𝝼' => 'ν',
  '𝝽' => 'ξ',
  '𝝾' => 'ο',
  '𝝿' => 'π',
  '𝞀' => 'ρ',
  '𝞁' => 'ς',
  '𝞂' => 'σ',
  '𝞃' => 'τ',
  '𝞄' => 'υ',
  '𝞅' => 'φ',
  '𝞆' => 'χ',
  '𝞇' => 'ψ',
  '𝞈' => 'ω',
  '𝞉' => '∂',
  '𝞊' => 'ε',
  '𝞋' => 'θ',
  '𝞌' => 'κ',
  '𝞍' => 'φ',
  '𝞎' => 'ρ',
  '𝞏' => 'π',
  '𝞐' => 'Α',
  '𝞑' => 'Β',
  '𝞒' => 'Γ',
  '𝞓' => 'Δ',
  '𝞔' => 'Ε',
  '𝞕' => 'Ζ',
  '𝞖' => 'Η',
  '𝞗' => 'Θ',
  '𝞘' => 'Ι',
  '𝞙' => 'Κ',
  '𝞚' => 'Λ',
  '𝞛' => 'Μ',
  '𝞜' => 'Ν',
  '𝞝' => 'Ξ',
  '𝞞' => 'Ο',
  '𝞟' => 'Π',
  '𝞠' => 'Ρ',
  '𝞡' => 'Θ',
  '𝞢' => 'Σ',
  '𝞣' => 'Τ',
  '𝞤' => 'Υ',
  '𝞥' => 'Φ',
  '𝞦' => 'Χ',
  '𝞧' => 'Ψ',
  '𝞨' => 'Ω',
  '𝞩' => '∇',
  '𝞪' => 'α',
  '𝞫' => 'β',
  '𝞬' => 'γ',
  '𝞭' => 'δ',
  '𝞮' => 'ε',
  '𝞯' => 'ζ',
  '𝞰' => 'η',
  '𝞱' => 'θ',
  '𝞲' => 'ι',
  '𝞳' => 'κ',
  '𝞴' => 'λ',
  '𝞵' => 'μ',
  '𝞶' => 'ν',
  '𝞷' => 'ξ',
  '𝞸' => 'ο',
  '𝞹' => 'π',
  '𝞺' => 'ρ',
  '𝞻' => 'ς',
  '𝞼' => 'σ',
  '𝞽' => 'τ',
  '𝞾' => 'υ',
  '𝞿' => 'φ',
  '𝟀' => 'χ',
  '𝟁' => 'ψ',
  '𝟂' => 'ω',
  '𝟃' => '∂',
  '𝟄' => 'ε',
  '𝟅' => 'θ',
  '𝟆' => 'κ',
  '𝟇' => 'φ',
  '𝟈' => 'ρ',
  '𝟉' => 'π',
  '𝟊' => 'Ϝ',
  '𝟋' => 'ϝ',
  '𝟎' => '0',
  '𝟏' => '1',
  '𝟐' => '2',
  '𝟑' => '3',
  '𝟒' => '4',
  '𝟓' => '5',
  '𝟔' => '6',
  '𝟕' => '7',
  '𝟖' => '8',
  '𝟗' => '9',
  '𝟘' => '0',
  '𝟙' => '1',
  '𝟚' => '2',
  '𝟛' => '3',
  '𝟜' => '4',
  '𝟝' => '5',
  '𝟞' => '6',
  '𝟟' => '7',
  '𝟠' => '8',
  '𝟡' => '9',
  '𝟢' => '0',
  '𝟣' => '1',
  '𝟤' => '2',
  '𝟥' => '3',
  '𝟦' => '4',
  '𝟧' => '5',
  '𝟨' => '6',
  '𝟩' => '7',
  '𝟪' => '8',
  '𝟫' => '9',
  '𝟬' => '0',
  '𝟭' => '1',
  '𝟮' => '2',
  '𝟯' => '3',
  '𝟰' => '4',
  '𝟱' => '5',
  '𝟲' => '6',
  '𝟳' => '7',
  '𝟴' => '8',
  '𝟵' => '9',
  '𝟶' => '0',
  '𝟷' => '1',
  '𝟸' => '2',
  '𝟹' => '3',
  '𝟺' => '4',
  '𝟻' => '5',
  '𝟼' => '6',
  '𝟽' => '7',
  '𝟾' => '8',
  '𝟿' => '9',
  '𞸀' => 'ا',
  '𞸁' => 'ب',
  '𞸂' => 'ج',
  '𞸃' => 'د',
  '𞸅' => 'و',
  '𞸆' => 'ز',
  '𞸇' => 'ح',
  '𞸈' => 'ط',
  '𞸉' => 'ي',
  '𞸊' => 'ك',
  '𞸋' => 'ل',
  '𞸌' => 'م',
  '𞸍' => 'ن',
  '𞸎' => 'س',
  '𞸏' => 'ع',
  '𞸐' => 'ف',
  '𞸑' => 'ص',
  '𞸒' => 'ق',
  '𞸓' => 'ر',
  '𞸔' => 'ش',
  '𞸕' => 'ت',
  '𞸖' => 'ث',
  '𞸗' => 'خ',
  '𞸘' => 'ذ',
  '𞸙' => 'ض',
  '𞸚' => 'ظ',
  '𞸛' => 'غ',
  '𞸜' => 'ٮ',
  '𞸝' => 'ں',
  '𞸞' => 'ڡ',
  '𞸟' => 'ٯ',
  '𞸡' => 'ب',
  '𞸢' => 'ج',
  '𞸤' => 'ه',
  '𞸧' => 'ح',
  '𞸩' => 'ي',
  '𞸪' => 'ك',
  '𞸫' => 'ل',
  '𞸬' => 'م',
  '𞸭' => 'ن',
  '𞸮' => 'س',
  '𞸯' => 'ع',
  '𞸰' => 'ف',
  '𞸱' => 'ص',
  '𞸲' => 'ق',
  '𞸴' => 'ش',
  '𞸵' => 'ت',
  '𞸶' => 'ث',
  '𞸷' => 'خ',
  '𞸹' => 'ض',
  '𞸻' => 'غ',
  '𞹂' => 'ج',
  '𞹇' => 'ح',
  '𞹉' => 'ي',
  '𞹋' => 'ل',
  '𞹍' => 'ن',
  '𞹎' => 'س',
  '𞹏' => 'ع',
  '𞹑' => 'ص',
  '𞹒' => 'ق',
  '𞹔' => 'ش',
  '𞹗' => 'خ',
  '𞹙' => 'ض',
  '𞹛' => 'غ',
  '𞹝' => 'ں',
  '𞹟' => 'ٯ',
  '𞹡' => 'ب',
  '𞹢' => 'ج',
  '𞹤' => 'ه',
  '𞹧' => 'ح',
  '𞹨' => 'ط',
  '𞹩' => 'ي',
  '𞹪' => 'ك',
  '𞹬' => 'م',
  '𞹭' => 'ن',
  '𞹮' => 'س',
  '𞹯' => 'ع',
  '𞹰' => 'ف',
  '𞹱' => 'ص',
  '𞹲' => 'ق',
  '𞹴' => 'ش',
  '𞹵' => 'ت',
  '𞹶' => 'ث',
  '𞹷' => 'خ',
  '𞹹' => 'ض',
  '𞹺' => 'ظ',
  '𞹻' => 'غ',
  '𞹼' => 'ٮ',
  '𞹾' => 'ڡ',
  '𞺀' => 'ا',
  '𞺁' => 'ب',
  '𞺂' => 'ج',
  '𞺃' => 'د',
  '𞺄' => 'ه',
  '𞺅' => 'و',
  '𞺆' => 'ز',
  '𞺇' => 'ح',
  '𞺈' => 'ط',
  '𞺉' => 'ي',
  '𞺋' => 'ل',
  '𞺌' => 'م',
  '𞺍' => 'ن',
  '𞺎' => 'س',
  '𞺏' => 'ع',
  '𞺐' => 'ف',
  '𞺑' => 'ص',
  '𞺒' => 'ق',
  '𞺓' => 'ر',
  '𞺔' => 'ش',
  '𞺕' => 'ت',
  '𞺖' => 'ث',
  '𞺗' => 'خ',
  '𞺘' => 'ذ',
  '𞺙' => 'ض',
  '𞺚' => 'ظ',
  '𞺛' => 'غ',
  '𞺡' => 'ب',
  '𞺢' => 'ج',
  '𞺣' => 'د',
  '𞺥' => 'و',
  '𞺦' => 'ز',
  '𞺧' => 'ح',
  '𞺨' => 'ط',
  '𞺩' => 'ي',
  '𞺫' => 'ل',
  '𞺬' => 'م',
  '𞺭' => 'ن',
  '𞺮' => 'س',
  '𞺯' => 'ع',
  '𞺰' => 'ف',
  '𞺱' => 'ص',
  '𞺲' => 'ق',
  '𞺳' => 'ر',
  '𞺴' => 'ش',
  '𞺵' => 'ت',
  '𞺶' => 'ث',
  '𞺷' => 'خ',
  '𞺸' => 'ذ',
  '𞺹' => 'ض',
  '𞺺' => 'ظ',
  '𞺻' => 'غ',
  '🄀' => '0.',
  '🄁' => '0,',
  '🄂' => '1,',
  '🄃' => '2,',
  '🄄' => '3,',
  '🄅' => '4,',
  '🄆' => '5,',
  '🄇' => '6,',
  '🄈' => '7,',
  '🄉' => '8,',
  '🄊' => '9,',
  '🄐' => '(A)',
  '🄑' => '(B)',
  '🄒' => '(C)',
  '🄓' => '(D)',
  '🄔' => '(E)',
  '🄕' => '(F)',
  '🄖' => '(G)',
  '🄗' => '(H)',
  '🄘' => '(I)',
  '🄙' => '(J)',
  '🄚' => '(K)',
  '🄛' => '(L)',
  '🄜' => '(M)',
  '🄝' => '(N)',
  '🄞' => '(O)',
  '🄟' => '(P)',
  '🄠' => '(Q)',
  '🄡' => '(R)',
  '🄢' => '(S)',
  '🄣' => '(T)',
  '🄤' => '(U)',
  '🄥' => '(V)',
  '🄦' => '(W)',
  '🄧' => '(X)',
  '🄨' => '(Y)',
  '🄩' => '(Z)',
  '🄪' => '〔S〕',
  '🄫' => 'C',
  '🄬' => 'R',
  '🄭' => 'CD',
  '🄮' => 'WZ',
  '🄰' => 'A',
  '🄱' => 'B',
  '🄲' => 'C',
  '🄳' => 'D',
  '🄴' => 'E',
  '🄵' => 'F',
  '🄶' => 'G',
  '🄷' => 'H',
  '🄸' => 'I',
  '🄹' => 'J',
  '🄺' => 'K',
  '🄻' => 'L',
  '🄼' => 'M',
  '🄽' => 'N',
  '🄾' => 'O',
  '🄿' => 'P',
  '🅀' => 'Q',
  '🅁' => 'R',
  '🅂' => 'S',
  '🅃' => 'T',
  '🅄' => 'U',
  '🅅' => 'V',
  '🅆' => 'W',
  '🅇' => 'X',
  '🅈' => 'Y',
  '🅉' => 'Z',
  '🅊' => 'HV',
  '🅋' => 'MV',
  '🅌' => 'SD',
  '🅍' => 'SS',
  '🅎' => 'PPV',
  '🅏' => 'WC',
  '🅪' => 'MC',
  '🅫' => 'MD',
  '🅬' => 'MR',
  '🆐' => 'DJ',
  '🈀' => 'ほか',
  '🈁' => 'ココ',
  '🈂' => 'サ',
  '🈐' => '手',
  '🈑' => '字',
  '🈒' => '双',
  '🈓' => 'デ',
  '🈔' => '二',
  '🈕' => '多',
  '🈖' => '解',
  '🈗' => '天',
  '🈘' => '交',
  '🈙' => '映',
  '🈚' => '無',
  '🈛' => '料',
  '🈜' => '前',
  '🈝' => '後',
  '🈞' => '再',
  '🈟' => '新',
  '🈠' => '初',
  '🈡' => '終',
  '🈢' => '生',
  '🈣' => '販',
  '🈤' => '声',
  '🈥' => '吹',
  '🈦' => '演',
  '🈧' => '投',
  '🈨' => '捕',
  '🈩' => '一',
  '🈪' => '三',
  '🈫' => '遊',
  '🈬' => '左',
  '🈭' => '中',
  '🈮' => '右',
  '🈯' => '指',
  '🈰' => '走',
  '🈱' => '打',
  '🈲' => '禁',
  '🈳' => '空',
  '🈴' => '合',
  '🈵' => '満',
  '🈶' => '有',
  '🈷' => '月',
  '🈸' => '申',
  '🈹' => '割',
  '🈺' => '営',
  '🈻' => '配',
  '🉀' => '〔本〕',
  '🉁' => '〔三〕',
  '🉂' => '〔二〕',
  '🉃' => '〔安〕',
  '🉄' => '〔点〕',
  '🉅' => '〔打〕',
  '🉆' => '〔盗〕',
  '🉇' => '〔勝〕',
  '🉈' => '〔敗〕',
  '🉐' => '得',
  '🉑' => '可',
  '🯰' => '0',
  '🯱' => '1',
  '🯲' => '2',
  '🯳' => '3',
  '🯴' => '4',
  '🯵' => '5',
  '🯶' => '6',
  '🯷' => '7',
  '🯸' => '8',
  '🯹' => '9',
);
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

use Symfony\Polyfill\Intl\Normalizer as p;

if (\PHP_VERSION_ID >= 80000) {
    return require __DIR__.'/bootstrap80.php';
}

if (!function_exists('normalizer_is_normalized')) {
    function normalizer_is_normalized($string, $form = p\Normalizer::FORM_C) { return p\Normalizer::isNormalized($string, $form); }
}
if (!function_exists('normalizer_normalize')) {
    function normalizer_normalize($string, $form = p\Normalizer::FORM_C) { return p\Normalizer::normalize($string, $form); }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

use Symfony\Polyfill\Intl\Normalizer as p;

if (!function_exists('normalizer_is_normalized')) {
    function normalizer_is_normalized(?string $string, ?int $form = p\Normalizer::FORM_C): bool { return p\Normalizer::isNormalized((string) $string, (int) $form); }
}
if (!function_exists('normalizer_normalize')) {
    function normalizer_normalize(?string $string, ?int $form = p\Normalizer::FORM_C): string|false { return p\Normalizer::normalize((string) $string, (int) $form); }
}
{
    "name": "symfony/polyfill-intl-normalizer",
    "type": "library",
    "description": "Symfony polyfill for intl's Normalizer class and related functions",
    "keywords": ["polyfill", "shim", "compatibility", "portable", "intl", "normalizer"],
    "homepage": "https://symfony.com",
    "license": "MIT",
    "authors": [
        {
            "name": "Nicolas Grekas",
            "email": "p@tchwork.com"
        },
        {
            "name": "Symfony Community",
            "homepage": "https://symfony.com/contributors"
        }
    ],
    "require": {
        "php": ">=7.1"
    },
    "autoload": {
        "psr-4": { "Symfony\\Polyfill\\Intl\\Normalizer\\": "" },
        "files": [ "bootstrap.php" ],
        "classmap": [ "Resources/stubs" ]
    },
    "suggest": {
        "ext-intl": "For best performance"
    },
    "minimum-stability": "dev",
    "extra": {
        "branch-alias": {
            "dev-main": "1.28-dev"
        },
        "thanks": {
            "name": "symfony/polyfill",
            "url": "https://github.com/symfony/polyfill"
        }
    }
}
CHANGELOG
=========

4.4.0
-----

 * Added support for parsing the inline notation spanning multiple lines.
 * Added support to dump `null` as `~` by using the `Yaml::DUMP_NULL_AS_TILDE` flag.
 * deprecated accepting STDIN implicitly when using the `lint:yaml` command, use `lint:yaml -` (append a dash) instead to make it explicit.

4.3.0
-----

 * Using a mapping inside a multi-line string is deprecated and will throw a `ParseException` in 5.0.

4.2.0
-----

 * added support for multiple files or directories in `LintCommand`

4.0.0
-----

 * The behavior of the non-specific tag `!` is changed and now forces
   non-evaluating your values.
 * complex mappings will throw a `ParseException`
 * support for the comma as a group separator for floats has been dropped, use
   the underscore instead
 * support for the `!!php/object` tag has been dropped, use the `!php/object`
   tag instead
 * duplicate mapping keys throw a `ParseException`
 * non-string mapping keys throw a `ParseException`, use the `Yaml::PARSE_KEYS_AS_STRINGS`
   flag to cast them to strings
 * `%` at the beginning of an unquoted string throw a `ParseException`
 * mappings with a colon (`:`) that is not followed by a whitespace throw a
   `ParseException`
 * the `Dumper::setIndentation()` method has been removed
 * being able to pass boolean options to the `Yaml::parse()`, `Yaml::dump()`,
   `Parser::parse()`, and `Dumper::dump()` methods to configure the behavior of
   the parser and dumper is no longer supported, pass bitmask flags instead
 * the constructor arguments of the `Parser` class have been removed
 * the `Inline` class is internal and no longer part of the BC promise
 * removed support for the `!str` tag, use the `!!str` tag instead
 * added support for tagged scalars.

   ```yml
   Yaml::parse('!foo bar', Yaml::PARSE_CUSTOM_TAGS);
   // returns TaggedValue('foo', 'bar');
   ```

3.4.0
-----

 * added support for parsing YAML files using the `Yaml::parseFile()` or `Parser::parseFile()` method

 * the `Dumper`, `Parser`, and `Yaml` classes are marked as final

 * Deprecated the `!php/object:` tag which will be replaced by the
   `!php/object` tag (without the colon) in 4.0.

 * Deprecated the `!php/const:` tag which will be replaced by the
   `!php/const` tag (without the colon) in 4.0.

 * Support for the `!str` tag is deprecated, use the `!!str` tag instead.

 * Deprecated using the non-specific tag `!` as its behavior will change in 4.0.
   It will force non-evaluating your values in 4.0. Use plain integers or `!!float` instead.

3.3.0
-----

 * Starting an unquoted string with a question mark followed by a space is
   deprecated and will throw a `ParseException` in Symfony 4.0.

 * Deprecated support for implicitly parsing non-string mapping keys as strings.
   Mapping keys that are no strings will lead to a `ParseException` in Symfony
   4.0. Use quotes to opt-in for keys to be parsed as strings.

   Before:

   ```php
   $yaml = <<<YAML
   null: null key
   true: boolean true
   2.0: float key
   YAML;

   Yaml::parse($yaml);
   ```

   After:

   ```php

   $yaml = <<<YAML
   "null": null key
   "true": boolean true
   "2.0": float key
   YAML;

   Yaml::parse($yaml);
   ```

 * Omitted mapping values will be parsed as `null`.

 * Omitting the key of a mapping is deprecated and will throw a `ParseException` in Symfony 4.0.

 * Added support for dumping empty PHP arrays as YAML sequences:

   ```php
   Yaml::dump([], 0, 0, Yaml::DUMP_EMPTY_ARRAY_AS_SEQUENCE);
   ```

3.2.0
-----

 * Mappings with a colon (`:`) that is not followed by a whitespace are deprecated
   when the mapping key is not quoted and will lead to a `ParseException` in
   Symfony 4.0 (e.g. `foo:bar` must be `foo: bar`).

 * Added support for parsing PHP constants:

   ```php
   Yaml::parse('!php/const:PHP_INT_MAX', Yaml::PARSE_CONSTANT);
   ```

 * Support for silently ignoring duplicate mapping keys in YAML has been
   deprecated and will lead to a `ParseException` in Symfony 4.0.

3.1.0
-----

 * Added support to dump `stdClass` and `ArrayAccess` objects as YAML mappings
   through the `Yaml::DUMP_OBJECT_AS_MAP` flag.

 * Strings that are not UTF-8 encoded will be dumped as base64 encoded binary
   data.

 * Added support for dumping multi line strings as literal blocks.

 * Added support for parsing base64 encoded binary data when they are tagged
   with the `!!binary` tag.

 * Added support for parsing timestamps as `\DateTime` objects:

   ```php
   Yaml::parse('2001-12-15 21:59:43.10 -5', Yaml::PARSE_DATETIME);
   ```

 * `\DateTime` and `\DateTimeImmutable` objects are dumped as YAML timestamps.

 * Deprecated usage of `%` at the beginning of an unquoted string.

 * Added support for customizing the YAML parser behavior through an optional bit field:

   ```php
   Yaml::parse('{ "foo": "bar", "fiz": "cat" }', Yaml::PARSE_EXCEPTION_ON_INVALID_TYPE | Yaml::PARSE_OBJECT | Yaml::PARSE_OBJECT_FOR_MAP);
   ```

 * Added support for customizing the dumped YAML string through an optional bit field:

   ```php
   Yaml::dump(['foo' => new A(), 'bar' => 1], 0, 0, Yaml::DUMP_EXCEPTION_ON_INVALID_TYPE | Yaml::DUMP_OBJECT);
   ```

3.0.0
-----

 * Yaml::parse() now throws an exception when a blackslash is not escaped
   in double-quoted strings

2.8.0
-----

 * Deprecated usage of a colon in an unquoted mapping value
 * Deprecated usage of @, \`, | and > at the beginning of an unquoted string
 * When surrounding strings with double-quotes, you must now escape `\` characters. Not
   escaping those characters (when surrounded by double-quotes) is deprecated.

   Before:

   ```yml
   class: "Foo\Var"
   ```

   After:

   ```yml
   class: "Foo\\Var"
   ```

2.1.0
-----

 * Yaml::parse() does not evaluate loaded files as PHP files by default
   anymore (call Yaml::enablePhpParsing() to get back the old behavior)
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Yaml\Command;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Exception\InvalidArgumentException;
use Symfony\Component\Console\Exception\RuntimeException;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;
use Symfony\Component\Yaml\Exception\ParseException;
use Symfony\Component\Yaml\Parser;
use Symfony\Component\Yaml\Yaml;

/**
 * Validates YAML files syntax and outputs encountered errors.
 *
 * @author Grégoire Pineau <lyrixx@lyrixx.info>
 * @author Robin Chalas <robin.chalas@gmail.com>
 */
class LintCommand extends Command
{
    protected static $defaultName = 'lint:yaml';

    private $parser;
    private $format;
    private $displayCorrectFiles;
    private $directoryIteratorProvider;
    private $isReadableProvider;

    public function __construct(string $name = null, callable $directoryIteratorProvider = null, callable $isReadableProvider = null)
    {
        parent::__construct($name);

        $this->directoryIteratorProvider = $directoryIteratorProvider;
        $this->isReadableProvider = $isReadableProvider;
    }

    /**
     * {@inheritdoc}
     */
    protected function configure()
    {
        $this
            ->setDescription('Lint a file and outputs encountered errors')
            ->addArgument('filename', InputArgument::IS_ARRAY, 'A file, a directory or "-" for reading from STDIN')
            ->addOption('format', null, InputOption::VALUE_REQUIRED, 'The output format', 'txt')
            ->addOption('parse-tags', null, InputOption::VALUE_NONE, 'Parse custom tags')
            ->setHelp(<<<EOF
The <info>%command.name%</info> command lints a YAML file and outputs to STDOUT
the first encountered syntax error.

You can validates YAML contents passed from STDIN:

  <info>cat filename | php %command.full_name% -</info>

You can also validate the syntax of a file:

  <info>php %command.full_name% filename</info>

Or of a whole directory:

  <info>php %command.full_name% dirname</info>
  <info>php %command.full_name% dirname --format=json</info>

EOF
            )
        ;
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $io = new SymfonyStyle($input, $output);
        $filenames = (array) $input->getArgument('filename');
        $this->format = $input->getOption('format');
        $this->displayCorrectFiles = $output->isVerbose();
        $flags = $input->getOption('parse-tags') ? Yaml::PARSE_CUSTOM_TAGS : 0;

        if (['-'] === $filenames) {
            return $this->display($io, [$this->validate(file_get_contents('php://stdin'), $flags)]);
        }

        // @deprecated to be removed in 5.0
        if (!$filenames) {
            if (0 === ftell(\STDIN)) {
                @trigger_error('Piping content from STDIN to the "lint:yaml" command without passing the dash symbol "-" as argument is deprecated since Symfony 4.4.', \E_USER_DEPRECATED);

                return $this->display($io, [$this->validate(file_get_contents('php://stdin'), $flags)]);
            }

            throw new RuntimeException('Please provide a filename or pipe file content to STDIN.');
        }

        $filesInfo = [];
        foreach ($filenames as $filename) {
            if (!$this->isReadable($filename)) {
                throw new RuntimeException(sprintf('File or directory "%s" is not readable.', $filename));
            }

            foreach ($this->getFiles($filename) as $file) {
                $filesInfo[] = $this->validate(file_get_contents($file), $flags, $file);
            }
        }

        return $this->display($io, $filesInfo);
    }

    private function validate(string $content, int $flags, string $file = null)
    {
        $prevErrorHandler = set_error_handler(function ($level, $message, $file, $line) use (&$prevErrorHandler) {
            if (\E_USER_DEPRECATED === $level) {
                throw new ParseException($message, $this->getParser()->getRealCurrentLineNb() + 1);
            }

            return $prevErrorHandler ? $prevErrorHandler($level, $message, $file, $line) : false;
        });

        try {
            $this->getParser()->parse($content, Yaml::PARSE_CONSTANT | $flags);
        } catch (ParseException $e) {
            return ['file' => $file, 'line' => $e->getParsedLine(), 'valid' => false, 'message' => $e->getMessage()];
        } finally {
            restore_error_handler();
        }

        return ['file' => $file, 'valid' => true];
    }

    private function display(SymfonyStyle $io, array $files): int
    {
        switch ($this->format) {
            case 'txt':
                return $this->displayTxt($io, $files);
            case 'json':
                return $this->displayJson($io, $files);
            default:
                throw new InvalidArgumentException(sprintf('The format "%s" is not supported.', $this->format));
        }
    }

    private function displayTxt(SymfonyStyle $io, array $filesInfo): int
    {
        $countFiles = \count($filesInfo);
        $erroredFiles = 0;
        $suggestTagOption = false;

        foreach ($filesInfo as $info) {
            if ($info['valid'] && $this->displayCorrectFiles) {
                $io->comment('<info>OK</info>'.($info['file'] ? sprintf(' in %s', $info['file']) : ''));
            } elseif (!$info['valid']) {
                ++$erroredFiles;
                $io->text('<error> ERROR </error>'.($info['file'] ? sprintf(' in %s', $info['file']) : ''));
                $io->text(sprintf('<error> >> %s</error>', $info['message']));

                if (false !== strpos($info['message'], 'PARSE_CUSTOM_TAGS')) {
                    $suggestTagOption = true;
                }
            }
        }

        if (0 === $erroredFiles) {
            $io->success(sprintf('All %d YAML files contain valid syntax.', $countFiles));
        } else {
            $io->warning(sprintf('%d YAML files have valid syntax and %d contain errors.%s', $countFiles - $erroredFiles, $erroredFiles, $suggestTagOption ? ' Use the --parse-tags option if you want parse custom tags.' : ''));
        }

        return min($erroredFiles, 1);
    }

    private function displayJson(SymfonyStyle $io, array $filesInfo): int
    {
        $errors = 0;

        array_walk($filesInfo, function (&$v) use (&$errors) {
            $v['file'] = (string) $v['file'];
            if (!$v['valid']) {
                ++$errors;
            }

            if (isset($v['message']) && false !== strpos($v['message'], 'PARSE_CUSTOM_TAGS')) {
                $v['message'] .= ' Use the --parse-tags option if you want parse custom tags.';
            }
        });

        $io->writeln(json_encode($filesInfo, \JSON_PRETTY_PRINT | \JSON_UNESCAPED_SLASHES));

        return min($errors, 1);
    }

    private function getFiles(string $fileOrDirectory): iterable
    {
        if (is_file($fileOrDirectory)) {
            yield new \SplFileInfo($fileOrDirectory);

            return;
        }

        foreach ($this->getDirectoryIterator($fileOrDirectory) as $file) {
            if (!\in_array($file->getExtension(), ['yml', 'yaml'])) {
                continue;
            }

            yield $file;
        }
    }

    private function getParser(): Parser
    {
        if (!$this->parser) {
            $this->parser = new Parser();
        }

        return $this->parser;
    }

    private function getDirectoryIterator(string $directory): iterable
    {
        $default = function ($directory) {
            return new \RecursiveIteratorIterator(
                new \RecursiveDirectoryIterator($directory, \FilesystemIterator::SKIP_DOTS | \FilesystemIterator::FOLLOW_SYMLINKS),
                \RecursiveIteratorIterator::LEAVES_ONLY
            );
        };

        if (null !== $this->directoryIteratorProvider) {
            return ($this->directoryIteratorProvider)($directory, $default);
        }

        return $default($directory);
    }

    private function isReadable(string $fileOrDirectory): bool
    {
        $default = function ($fileOrDirectory) {
            return is_readable($fileOrDirectory);
        };

        if (null !== $this->isReadableProvider) {
            return ($this->isReadableProvider)($fileOrDirectory, $default);
        }

        return $default($fileOrDirectory);
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Yaml;

use Symfony\Component\Yaml\Tag\TaggedValue;

/**
 * Dumper dumps PHP variables to YAML strings.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @final
 */
class Dumper
{
    /**
     * The amount of spaces to use for indentation of nested nodes.
     *
     * @var int
     */
    protected $indentation;

    public function __construct(int $indentation = 4)
    {
        if ($indentation < 1) {
            throw new \InvalidArgumentException('The indentation must be greater than zero.');
        }

        $this->indentation = $indentation;
    }

    /**
     * Dumps a PHP value to YAML.
     *
     * @param mixed $input  The PHP value
     * @param int   $inline The level where you switch to inline YAML
     * @param int   $indent The level of indentation (used internally)
     * @param int   $flags  A bit field of Yaml::DUMP_* constants to customize the dumped YAML string
     *
     * @return string The YAML representation of the PHP value
     */
    public function dump($input, int $inline = 0, int $indent = 0, int $flags = 0): string
    {
        $output = '';
        $prefix = $indent ? str_repeat(' ', $indent) : '';
        $dumpObjectAsInlineMap = true;

        if (Yaml::DUMP_OBJECT_AS_MAP & $flags && ($input instanceof \ArrayObject || $input instanceof \stdClass)) {
            $dumpObjectAsInlineMap = empty((array) $input);
        }

        if ($inline <= 0 || (!\is_array($input) && !$input instanceof TaggedValue && $dumpObjectAsInlineMap) || empty($input)) {
            $output .= $prefix.Inline::dump($input, $flags);
        } else {
            $dumpAsMap = Inline::isHash($input);

            foreach ($input as $key => $value) {
                if ('' !== $output && "\n" !== $output[-1]) {
                    $output .= "\n";
                }

                if (Yaml::DUMP_MULTI_LINE_LITERAL_BLOCK & $flags && \is_string($value) && false !== strpos($value, "\n") && false === strpos($value, "\r")) {
                    // If the first line starts with a space character, the spec requires a blockIndicationIndicator
                    // http://www.yaml.org/spec/1.2/spec.html#id2793979
                    $blockIndentationIndicator = (' ' === substr($value, 0, 1)) ? (string) $this->indentation : '';

                    if (isset($value[-2]) && "\n" === $value[-2] && "\n" === $value[-1]) {
                        $blockChompingIndicator = '+';
                    } elseif ("\n" === $value[-1]) {
                        $blockChompingIndicator = '';
                    } else {
                        $blockChompingIndicator = '-';
                    }

                    $output .= sprintf('%s%s%s |%s%s', $prefix, $dumpAsMap ? Inline::dump($key, $flags).':' : '-', '', $blockIndentationIndicator, $blockChompingIndicator);

                    foreach (explode("\n", $value) as $row) {
                        if ('' === $row) {
                            $output .= "\n";
                        } else {
                            $output .= sprintf("\n%s%s%s", $prefix, str_repeat(' ', $this->indentation), $row);
                        }
                    }

                    continue;
                }

                if ($value instanceof TaggedValue) {
                    $output .= sprintf('%s%s !%s', $prefix, $dumpAsMap ? Inline::dump($key, $flags).':' : '-', $value->getTag());

                    if (Yaml::DUMP_MULTI_LINE_LITERAL_BLOCK & $flags && \is_string($value->getValue()) && false !== strpos($value->getValue(), "\n") && false === strpos($value->getValue(), "\r\n")) {
                        // If the first line starts with a space character, the spec requires a blockIndicationIndicator
                        // http://www.yaml.org/spec/1.2/spec.html#id2793979
                        $blockIndentationIndicator = (' ' === substr($value->getValue(), 0, 1)) ? (string) $this->indentation : '';
                        $output .= sprintf(' |%s', $blockIndentationIndicator);

                        foreach (explode("\n", $value->getValue()) as $row) {
                            $output .= sprintf("\n%s%s%s", $prefix, str_repeat(' ', $this->indentation), $row);
                        }

                        continue;
                    }

                    if ($inline - 1 <= 0 || null === $value->getValue() || \is_scalar($value->getValue())) {
                        $output .= ' '.$this->dump($value->getValue(), $inline - 1, 0, $flags)."\n";
                    } else {
                        $output .= "\n";
                        $output .= $this->dump($value->getValue(), $inline - 1, $dumpAsMap ? $indent + $this->indentation : $indent + 2, $flags);
                    }

                    continue;
                }

                $dumpObjectAsInlineMap = true;

                if (Yaml::DUMP_OBJECT_AS_MAP & $flags && ($value instanceof \ArrayObject || $value instanceof \stdClass)) {
                    $dumpObjectAsInlineMap = empty((array) $value);
                }

                $willBeInlined = $inline - 1 <= 0 || !\is_array($value) && $dumpObjectAsInlineMap || empty($value);

                $output .= sprintf('%s%s%s%s',
                    $prefix,
                    $dumpAsMap ? Inline::dump($key, $flags).':' : '-',
                    $willBeInlined ? ' ' : "\n",
                    $this->dump($value, $inline - 1, $willBeInlined ? 0 : $indent + $this->indentation, $flags)
                ).($willBeInlined ? "\n" : '');
            }
        }

        return $output;
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Yaml;

/**
 * Escaper encapsulates escaping rules for single and double-quoted
 * YAML strings.
 *
 * @author Matthew Lewinski <matthew@lewinski.org>
 *
 * @internal
 */
class Escaper
{
    // Characters that would cause a dumped string to require double quoting.
    public const REGEX_CHARACTER_TO_ESCAPE = "[\\x00-\\x1f]|\x7f|\xc2\x85|\xc2\xa0|\xe2\x80\xa8|\xe2\x80\xa9";

    // Mapping arrays for escaping a double quoted string. The backslash is
    // first to ensure proper escaping because str_replace operates iteratively
    // on the input arrays. This ordering of the characters avoids the use of strtr,
    // which performs more slowly.
    private const ESCAPEES = ['\\', '\\\\', '\\"', '"',
                                     "\x00",  "\x01",  "\x02",  "\x03",  "\x04",  "\x05",  "\x06",  "\x07",
                                     "\x08",  "\x09",  "\x0a",  "\x0b",  "\x0c",  "\x0d",  "\x0e",  "\x0f",
                                     "\x10",  "\x11",  "\x12",  "\x13",  "\x14",  "\x15",  "\x16",  "\x17",
                                     "\x18",  "\x19",  "\x1a",  "\x1b",  "\x1c",  "\x1d",  "\x1e",  "\x1f",
                                     "\x7f",
                                     "\xc2\x85", "\xc2\xa0", "\xe2\x80\xa8", "\xe2\x80\xa9",
                               ];
    private const ESCAPED = ['\\\\', '\\"', '\\\\', '\\"',
                                     '\\0',   '\\x01', '\\x02', '\\x03', '\\x04', '\\x05', '\\x06', '\\a',
                                     '\\b',   '\\t',   '\\n',   '\\v',   '\\f',   '\\r',   '\\x0e', '\\x0f',
                                     '\\x10', '\\x11', '\\x12', '\\x13', '\\x14', '\\x15', '\\x16', '\\x17',
                                     '\\x18', '\\x19', '\\x1a', '\\e',   '\\x1c', '\\x1d', '\\x1e', '\\x1f',
                                     '\\x7f',
                                     '\\N', '\\_', '\\L', '\\P',
                              ];

    /**
     * Determines if a PHP value would require double quoting in YAML.
     *
     * @param string $value A PHP value
     *
     * @return bool True if the value would require double quotes
     */
    public static function requiresDoubleQuoting(string $value): bool
    {
        return 0 < preg_match('/'.self::REGEX_CHARACTER_TO_ESCAPE.'/u', $value);
    }

    /**
     * Escapes and surrounds a PHP value with double quotes.
     *
     * @param string $value A PHP value
     *
     * @return string The quoted, escaped string
     */
    public static function escapeWithDoubleQuotes(string $value): string
    {
        return sprintf('"%s"', str_replace(self::ESCAPEES, self::ESCAPED, $value));
    }

    /**
     * Determines if a PHP value would require single quoting in YAML.
     *
     * @param string $value A PHP value
     *
     * @return bool True if the value would require single quotes
     */
    public static function requiresSingleQuoting(string $value): bool
    {
        // Determines if a PHP value is entirely composed of a value that would
        // require single quoting in YAML.
        if (\in_array(strtolower($value), ['null', '~', 'true', 'false', 'y', 'n', 'yes', 'no', 'on', 'off'])) {
            return true;
        }

        // Determines if the PHP value contains any single characters that would
        // cause it to require single quoting in YAML.
        return 0 < preg_match('/[ \s \' " \: \{ \} \[ \] , & \* \# \?] | \A[ \- ? | < > = ! % @ ` \p{Zs}]/xu', $value);
    }

    /**
     * Escapes and surrounds a PHP value with single quotes.
     *
     * @param string $value A PHP value
     *
     * @return string The quoted, escaped string
     */
    public static function escapeWithSingleQuotes(string $value): string
    {
        return sprintf("'%s'", str_replace('\'', '\'\'', $value));
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Yaml\Exception;

/**
 * Exception class thrown when an error occurs during dumping.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class DumpException extends RuntimeException
{
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Yaml\Exception;

/**
 * Exception interface for all exceptions thrown by the component.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
interface ExceptionInterface extends \Throwable
{
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Yaml\Exception;

/**
 * Exception class thrown when an error occurs during parsing.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class ParseException extends RuntimeException
{
    private $parsedFile;
    private $parsedLine;
    private $snippet;
    private $rawMessage;

    /**
     * @param string      $message    The error message
     * @param int         $parsedLine The line where the error occurred
     * @param string|null $snippet    The snippet of code near the problem
     * @param string|null $parsedFile The file name where the error occurred
     */
    public function __construct(string $message, int $parsedLine = -1, string $snippet = null, string $parsedFile = null, \Throwable $previous = null)
    {
        $this->parsedFile = $parsedFile;
        $this->parsedLine = $parsedLine;
        $this->snippet = $snippet;
        $this->rawMessage = $message;

        $this->updateRepr();

        parent::__construct($this->message, 0, $previous);
    }

    /**
     * Gets the snippet of code near the error.
     *
     * @return string The snippet of code
     */
    public function getSnippet()
    {
        return $this->snippet;
    }

    /**
     * Sets the snippet of code near the error.
     *
     * @param string $snippet The code snippet
     */
    public function setSnippet($snippet)
    {
        $this->snippet = $snippet;

        $this->updateRepr();
    }

    /**
     * Gets the filename where the error occurred.
     *
     * This method returns null if a string is parsed.
     *
     * @return string The filename
     */
    public function getParsedFile()
    {
        return $this->parsedFile;
    }

    /**
     * Sets the filename where the error occurred.
     *
     * @param string $parsedFile The filename
     */
    public function setParsedFile($parsedFile)
    {
        $this->parsedFile = $parsedFile;

        $this->updateRepr();
    }

    /**
     * Gets the line where the error occurred.
     *
     * @return int The file line
     */
    public function getParsedLine()
    {
        return $this->parsedLine;
    }

    /**
     * Sets the line where the error occurred.
     *
     * @param int $parsedLine The file line
     */
    public function setParsedLine($parsedLine)
    {
        $this->parsedLine = $parsedLine;

        $this->updateRepr();
    }

    private function updateRepr()
    {
        $this->message = $this->rawMessage;

        $dot = false;
        if ('.' === substr($this->message, -1)) {
            $this->message = substr($this->message, 0, -1);
            $dot = true;
        }

        if (null !== $this->parsedFile) {
            $this->message .= sprintf(' in %s', json_encode($this->parsedFile, \JSON_UNESCAPED_SLASHES | \JSON_UNESCAPED_UNICODE));
        }

        if ($this->parsedLine >= 0) {
            $this->message .= sprintf(' at line %d', $this->parsedLine);
        }

        if ($this->snippet) {
            $this->message .= sprintf(' (near "%s")', $this->snippet);
        }

        if ($dot) {
            $this->message .= '.';
        }
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Yaml\Exception;

/**
 * Exception class thrown when an error occurs during parsing.
 *
 * @author Romain Neutron <imprec@gmail.com>
 */
class RuntimeException extends \RuntimeException implements ExceptionInterface
{
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Yaml;

use Symfony\Component\Yaml\Exception\DumpException;
use Symfony\Component\Yaml\Exception\ParseException;
use Symfony\Component\Yaml\Tag\TaggedValue;

/**
 * Inline implements a YAML parser/dumper for the YAML inline syntax.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @internal
 */
class Inline
{
    public const REGEX_QUOTED_STRING = '(?:"([^"\\\\]*+(?:\\\\.[^"\\\\]*+)*+)"|\'([^\']*+(?:\'\'[^\']*+)*+)\')';

    public static $parsedLineNumber = -1;
    public static $parsedFilename;

    private static $exceptionOnInvalidType = false;
    private static $objectSupport = false;
    private static $objectForMap = false;
    private static $constantSupport = false;

    public static function initialize(int $flags, int $parsedLineNumber = null, string $parsedFilename = null)
    {
        self::$exceptionOnInvalidType = (bool) (Yaml::PARSE_EXCEPTION_ON_INVALID_TYPE & $flags);
        self::$objectSupport = (bool) (Yaml::PARSE_OBJECT & $flags);
        self::$objectForMap = (bool) (Yaml::PARSE_OBJECT_FOR_MAP & $flags);
        self::$constantSupport = (bool) (Yaml::PARSE_CONSTANT & $flags);
        self::$parsedFilename = $parsedFilename;

        if (null !== $parsedLineNumber) {
            self::$parsedLineNumber = $parsedLineNumber;
        }
    }

    /**
     * Converts a YAML string to a PHP value.
     *
     * @param string $value      A YAML string
     * @param int    $flags      A bit field of PARSE_* constants to customize the YAML parser behavior
     * @param array  $references Mapping of variable names to values
     *
     * @return mixed A PHP value
     *
     * @throws ParseException
     */
    public static function parse(string $value = null, int $flags = 0, array &$references = [])
    {
        self::initialize($flags);

        $value = trim($value);

        if ('' === $value) {
            return '';
        }

        if (2 /* MB_OVERLOAD_STRING */ & (int) \ini_get('mbstring.func_overload')) {
            $mbEncoding = mb_internal_encoding();
            mb_internal_encoding('ASCII');
        }

        try {
            $i = 0;
            $tag = self::parseTag($value, $i, $flags);
            switch ($value[$i]) {
                case '[':
                    $result = self::parseSequence($value, $flags, $i, $references);
                    ++$i;
                    break;
                case '{':
                    $result = self::parseMapping($value, $flags, $i, $references);
                    ++$i;
                    break;
                default:
                    $result = self::parseScalar($value, $flags, null, $i, null === $tag, $references);
            }

            // some comments are allowed at the end
            if (preg_replace('/\s*#.*$/A', '', substr($value, $i))) {
                throw new ParseException(sprintf('Unexpected characters near "%s".', substr($value, $i)), self::$parsedLineNumber + 1, $value, self::$parsedFilename);
            }

            if (null !== $tag && '' !== $tag) {
                return new TaggedValue($tag, $result);
            }

            return $result;
        } finally {
            if (isset($mbEncoding)) {
                mb_internal_encoding($mbEncoding);
            }
        }
    }

    /**
     * Dumps a given PHP variable to a YAML string.
     *
     * @param mixed $value The PHP variable to convert
     * @param int   $flags A bit field of Yaml::DUMP_* constants to customize the dumped YAML string
     *
     * @return string The YAML string representing the PHP value
     *
     * @throws DumpException When trying to dump PHP resource
     */
    public static function dump($value, int $flags = 0): string
    {
        switch (true) {
            case \is_resource($value):
                if (Yaml::DUMP_EXCEPTION_ON_INVALID_TYPE & $flags) {
                    throw new DumpException(sprintf('Unable to dump PHP resources in a YAML file ("%s").', get_resource_type($value)));
                }

                return self::dumpNull($flags);
            case $value instanceof \DateTimeInterface:
                return $value->format('c');
            case $value instanceof \UnitEnum:
                return sprintf('!php/const %s::%s', \get_class($value), $value->name);
            case \is_object($value):
                if ($value instanceof TaggedValue) {
                    return '!'.$value->getTag().' '.self::dump($value->getValue(), $flags);
                }

                if (Yaml::DUMP_OBJECT & $flags) {
                    return '!php/object '.self::dump(serialize($value));
                }

                if (Yaml::DUMP_OBJECT_AS_MAP & $flags && ($value instanceof \stdClass || $value instanceof \ArrayObject)) {
                    $output = [];

                    foreach ($value as $key => $val) {
                        $output[] = sprintf('%s: %s', self::dump($key, $flags), self::dump($val, $flags));
                    }

                    return sprintf('{ %s }', implode(', ', $output));
                }

                if (Yaml::DUMP_EXCEPTION_ON_INVALID_TYPE & $flags) {
                    throw new DumpException('Object support when dumping a YAML file has been disabled.');
                }

                return self::dumpNull($flags);
            case \is_array($value):
                return self::dumpArray($value, $flags);
            case null === $value:
                return self::dumpNull($flags);
            case true === $value:
                return 'true';
            case false === $value:
                return 'false';
            case \is_int($value):
                return $value;
            case is_numeric($value) && false === strpbrk($value, "\f\n\r\t\v"):
                $locale = setlocale(\LC_NUMERIC, 0);
                if (false !== $locale) {
                    setlocale(\LC_NUMERIC, 'C');
                }
                if (\is_float($value)) {
                    $repr = (string) $value;
                    if (is_infinite($value)) {
                        $repr = str_ireplace('INF', '.Inf', $repr);
                    } elseif (floor($value) == $value && $repr == $value) {
                        // Preserve float data type since storing a whole number will result in integer value.
                        $repr = '!!float '.$repr;
                    }
                } else {
                    $repr = \is_string($value) ? "'$value'" : (string) $value;
                }
                if (false !== $locale) {
                    setlocale(\LC_NUMERIC, $locale);
                }

                return $repr;
            case '' == $value:
                return "''";
            case self::isBinaryString($value):
                return '!!binary '.base64_encode($value);
            case Escaper::requiresDoubleQuoting($value):
                return Escaper::escapeWithDoubleQuotes($value);
            case Escaper::requiresSingleQuoting($value):
            case Parser::preg_match('{^[0-9]+[_0-9]*$}', $value):
            case Parser::preg_match(self::getHexRegex(), $value):
            case Parser::preg_match(self::getTimestampRegex(), $value):
                return Escaper::escapeWithSingleQuotes($value);
            default:
                return $value;
        }
    }

    /**
     * Check if given array is hash or just normal indexed array.
     *
     * @param array|\ArrayObject|\stdClass $value The PHP array or array-like object to check
     *
     * @return bool true if value is hash array, false otherwise
     */
    public static function isHash($value): bool
    {
        if ($value instanceof \stdClass || $value instanceof \ArrayObject) {
            return true;
        }

        $expectedKey = 0;

        foreach ($value as $key => $val) {
            if ($key !== $expectedKey++) {
                return true;
            }
        }

        return false;
    }

    /**
     * Dumps a PHP array to a YAML string.
     *
     * @param array $value The PHP array to dump
     * @param int   $flags A bit field of Yaml::DUMP_* constants to customize the dumped YAML string
     *
     * @return string The YAML string representing the PHP array
     */
    private static function dumpArray(array $value, int $flags): string
    {
        // array
        if (($value || Yaml::DUMP_EMPTY_ARRAY_AS_SEQUENCE & $flags) && !self::isHash($value)) {
            $output = [];
            foreach ($value as $val) {
                $output[] = self::dump($val, $flags);
            }

            return sprintf('[%s]', implode(', ', $output));
        }

        // hash
        $output = [];
        foreach ($value as $key => $val) {
            $output[] = sprintf('%s: %s', self::dump($key, $flags), self::dump($val, $flags));
        }

        return sprintf('{ %s }', implode(', ', $output));
    }

    private static function dumpNull(int $flags): string
    {
        if (Yaml::DUMP_NULL_AS_TILDE & $flags) {
            return '~';
        }

        return 'null';
    }

    /**
     * Parses a YAML scalar.
     *
     * @return mixed
     *
     * @throws ParseException When malformed inline YAML string is parsed
     */
    public static function parseScalar(string $scalar, int $flags = 0, array $delimiters = null, int &$i = 0, bool $evaluate = true, array &$references = [], bool &$isQuoted = null)
    {
        if (\in_array($scalar[$i], ['"', "'"])) {
            // quoted scalar
            $isQuoted = true;
            $output = self::parseQuotedScalar($scalar, $i);

            if (null !== $delimiters) {
                $tmp = ltrim(substr($scalar, $i), " \n");
                if ('' === $tmp) {
                    throw new ParseException(sprintf('Unexpected end of line, expected one of "%s".', implode('', $delimiters)), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);
                }
                if (!\in_array($tmp[0], $delimiters)) {
                    throw new ParseException(sprintf('Unexpected characters (%s).', substr($scalar, $i)), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);
                }
            }
        } else {
            // "normal" string
            $isQuoted = false;

            if (!$delimiters) {
                $output = substr($scalar, $i);
                $i += \strlen($output);

                // remove comments
                if (Parser::preg_match('/[ \t]+#/', $output, $match, \PREG_OFFSET_CAPTURE)) {
                    $output = substr($output, 0, $match[0][1]);
                }
            } elseif (Parser::preg_match('/^(.*?)('.implode('|', $delimiters).')/', substr($scalar, $i), $match)) {
                $output = $match[1];
                $i += \strlen($output);
                $output = trim($output);
            } else {
                throw new ParseException(sprintf('Malformed inline YAML string: "%s".', $scalar), self::$parsedLineNumber + 1, null, self::$parsedFilename);
            }

            // a non-quoted string cannot start with @ or ` (reserved) nor with a scalar indicator (| or >)
            if ($output && ('@' === $output[0] || '`' === $output[0] || '|' === $output[0] || '>' === $output[0] || '%' === $output[0])) {
                throw new ParseException(sprintf('The reserved indicator "%s" cannot start a plain scalar; you need to quote the scalar.', $output[0]), self::$parsedLineNumber + 1, $output, self::$parsedFilename);
            }

            if ($evaluate) {
                $output = self::evaluateScalar($output, $flags, $references, $isQuoted);
            }
        }

        return $output;
    }

    /**
     * Parses a YAML quoted scalar.
     *
     * @throws ParseException When malformed inline YAML string is parsed
     */
    private static function parseQuotedScalar(string $scalar, int &$i = 0): string
    {
        if (!Parser::preg_match('/'.self::REGEX_QUOTED_STRING.'/Au', substr($scalar, $i), $match)) {
            throw new ParseException(sprintf('Malformed inline YAML string: "%s".', substr($scalar, $i)), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);
        }

        $output = substr($match[0], 1, \strlen($match[0]) - 2);

        $unescaper = new Unescaper();
        if ('"' == $scalar[$i]) {
            $output = $unescaper->unescapeDoubleQuotedString($output);
        } else {
            $output = $unescaper->unescapeSingleQuotedString($output);
        }

        $i += \strlen($match[0]);

        return $output;
    }

    /**
     * Parses a YAML sequence.
     *
     * @throws ParseException When malformed inline YAML string is parsed
     */
    private static function parseSequence(string $sequence, int $flags, int &$i = 0, array &$references = []): array
    {
        $output = [];
        $len = \strlen($sequence);
        ++$i;

        // [foo, bar, ...]
        while ($i < $len) {
            if (']' === $sequence[$i]) {
                return $output;
            }
            if (',' === $sequence[$i] || ' ' === $sequence[$i]) {
                ++$i;

                continue;
            }

            $tag = self::parseTag($sequence, $i, $flags);
            switch ($sequence[$i]) {
                case '[':
                    // nested sequence
                    $value = self::parseSequence($sequence, $flags, $i, $references);
                    break;
                case '{':
                    // nested mapping
                    $value = self::parseMapping($sequence, $flags, $i, $references);
                    break;
                default:
                    $value = self::parseScalar($sequence, $flags, [',', ']'], $i, null === $tag, $references, $isQuoted);

                    // the value can be an array if a reference has been resolved to an array var
                    if (\is_string($value) && !$isQuoted && false !== strpos($value, ': ')) {
                        // embedded mapping?
                        try {
                            $pos = 0;
                            $value = self::parseMapping('{'.$value.'}', $flags, $pos, $references);
                        } catch (\InvalidArgumentException $e) {
                            // no, it's not
                        }
                    }

                    if (!$isQuoted && \is_string($value) && '' !== $value && '&' === $value[0] && Parser::preg_match(Parser::REFERENCE_PATTERN, $value, $matches)) {
                        $references[$matches['ref']] = $matches['value'];
                        $value = $matches['value'];
                    }

                    --$i;
            }

            if (null !== $tag && '' !== $tag) {
                $value = new TaggedValue($tag, $value);
            }

            $output[] = $value;

            ++$i;
        }

        throw new ParseException(sprintf('Malformed inline YAML string: "%s".', $sequence), self::$parsedLineNumber + 1, null, self::$parsedFilename);
    }

    /**
     * Parses a YAML mapping.
     *
     * @return array|\stdClass
     *
     * @throws ParseException When malformed inline YAML string is parsed
     */
    private static function parseMapping(string $mapping, int $flags, int &$i = 0, array &$references = [])
    {
        $output = [];
        $len = \strlen($mapping);
        ++$i;
        $allowOverwrite = false;

        // {foo: bar, bar:foo, ...}
        while ($i < $len) {
            switch ($mapping[$i]) {
                case ' ':
                case ',':
                case "\n":
                    ++$i;
                    continue 2;
                case '}':
                    if (self::$objectForMap) {
                        return (object) $output;
                    }

                    return $output;
            }

            // key
            $offsetBeforeKeyParsing = $i;
            $isKeyQuoted = \in_array($mapping[$i], ['"', "'"], true);
            $key = self::parseScalar($mapping, $flags, [':', ' '], $i, false);

            if ($offsetBeforeKeyParsing === $i) {
                throw new ParseException('Missing mapping key.', self::$parsedLineNumber + 1, $mapping);
            }

            if ('!php/const' === $key) {
                $key .= ' '.self::parseScalar($mapping, $flags, [':'], $i, false);
                $key = self::evaluateScalar($key, $flags);
            }

            if (false === $i = strpos($mapping, ':', $i)) {
                break;
            }

            if (!$isKeyQuoted) {
                $evaluatedKey = self::evaluateScalar($key, $flags, $references);

                if ('' !== $key && $evaluatedKey !== $key && !\is_string($evaluatedKey) && !\is_int($evaluatedKey)) {
                    throw new ParseException('Implicit casting of incompatible mapping keys to strings is not supported. Quote your evaluable mapping keys instead.', self::$parsedLineNumber + 1, $mapping);
                }
            }

            if (!$isKeyQuoted && (!isset($mapping[$i + 1]) || !\in_array($mapping[$i + 1], [' ', ',', '[', ']', '{', '}', "\n"], true))) {
                throw new ParseException('Colons must be followed by a space or an indication character (i.e. " ", ",", "[", "]", "{", "}").', self::$parsedLineNumber + 1, $mapping);
            }

            if ('<<' === $key) {
                $allowOverwrite = true;
            }

            while ($i < $len) {
                if (':' === $mapping[$i] || ' ' === $mapping[$i] || "\n" === $mapping[$i]) {
                    ++$i;

                    continue;
                }

                $tag = self::parseTag($mapping, $i, $flags);
                switch ($mapping[$i]) {
                    case '[':
                        // nested sequence
                        $value = self::parseSequence($mapping, $flags, $i, $references);
                        // Spec: Keys MUST be unique; first one wins.
                        // Parser cannot abort this mapping earlier, since lines
                        // are processed sequentially.
                        // But overwriting is allowed when a merge node is used in current block.
                        if ('<<' === $key) {
                            foreach ($value as $parsedValue) {
                                $output += $parsedValue;
                            }
                        } elseif ($allowOverwrite || !isset($output[$key])) {
                            if (null !== $tag) {
                                $output[$key] = new TaggedValue($tag, $value);
                            } else {
                                $output[$key] = $value;
                            }
                        } elseif (isset($output[$key])) {
                            throw new ParseException(sprintf('Duplicate key "%s" detected.', $key), self::$parsedLineNumber + 1, $mapping);
                        }
                        break;
                    case '{':
                        // nested mapping
                        $value = self::parseMapping($mapping, $flags, $i, $references);
                        // Spec: Keys MUST be unique; first one wins.
                        // Parser cannot abort this mapping earlier, since lines
                        // are processed sequentially.
                        // But overwriting is allowed when a merge node is used in current block.
                        if ('<<' === $key) {
                            $output += $value;
                        } elseif ($allowOverwrite || !isset($output[$key])) {
                            if (null !== $tag) {
                                $output[$key] = new TaggedValue($tag, $value);
                            } else {
                                $output[$key] = $value;
                            }
                        } elseif (isset($output[$key])) {
                            throw new ParseException(sprintf('Duplicate key "%s" detected.', $key), self::$parsedLineNumber + 1, $mapping);
                        }
                        break;
                    default:
                        $value = self::parseScalar($mapping, $flags, [',', '}', "\n"], $i, null === $tag, $references, $isValueQuoted);
                        // Spec: Keys MUST be unique; first one wins.
                        // Parser cannot abort this mapping earlier, since lines
                        // are processed sequentially.
                        // But overwriting is allowed when a merge node is used in current block.
                        if ('<<' === $key) {
                            $output += $value;
                        } elseif ($allowOverwrite || !isset($output[$key])) {
                            if (!$isValueQuoted && \is_string($value) && '' !== $value && '&' === $value[0] && Parser::preg_match(Parser::REFERENCE_PATTERN, $value, $matches)) {
                                $references[$matches['ref']] = $matches['value'];
                                $value = $matches['value'];
                            }

                            if (null !== $tag) {
                                $output[$key] = new TaggedValue($tag, $value);
                            } else {
                                $output[$key] = $value;
                            }
                        } elseif (isset($output[$key])) {
                            throw new ParseException(sprintf('Duplicate key "%s" detected.', $key), self::$parsedLineNumber + 1, $mapping);
                        }
                        --$i;
                }
                ++$i;

                continue 2;
            }
        }

        throw new ParseException(sprintf('Malformed inline YAML string: "%s".', $mapping), self::$parsedLineNumber + 1, null, self::$parsedFilename);
    }

    /**
     * Evaluates scalars and replaces magic values.
     *
     * @return mixed The evaluated YAML string
     *
     * @throws ParseException when object parsing support was disabled and the parser detected a PHP object or when a reference could not be resolved
     */
    private static function evaluateScalar(string $scalar, int $flags, array &$references = [], bool &$isQuotedString = null)
    {
        $isQuotedString = false;
        $scalar = trim($scalar);
        $scalarLower = strtolower($scalar);

        if (0 === strpos($scalar, '*')) {
            if (false !== $pos = strpos($scalar, '#')) {
                $value = substr($scalar, 1, $pos - 2);
            } else {
                $value = substr($scalar, 1);
            }

            // an unquoted *
            if (false === $value || '' === $value) {
                throw new ParseException('A reference must contain at least one character.', self::$parsedLineNumber + 1, $value, self::$parsedFilename);
            }

            if (!\array_key_exists($value, $references)) {
                throw new ParseException(sprintf('Reference "%s" does not exist.', $value), self::$parsedLineNumber + 1, $value, self::$parsedFilename);
            }

            return $references[$value];
        }

        switch (true) {
            case 'null' === $scalarLower:
            case '' === $scalar:
            case '~' === $scalar:
                return null;
            case 'true' === $scalarLower:
                return true;
            case 'false' === $scalarLower:
                return false;
            case '!' === $scalar[0]:
                switch (true) {
                    case 0 === strpos($scalar, '!!str '):
                        $s = (string) substr($scalar, 6);

                        if (\in_array($s[0] ?? '', ['"', "'"], true)) {
                            $isQuotedString = true;
                            $s = self::parseQuotedScalar($s);
                        }

                        return $s;
                    case 0 === strpos($scalar, '! '):
                        return substr($scalar, 2);
                    case 0 === strpos($scalar, '!php/object'):
                        if (self::$objectSupport) {
                            if (!isset($scalar[12])) {
                                return false;
                            }

                            return unserialize(self::parseScalar(substr($scalar, 12)));
                        }

                        if (self::$exceptionOnInvalidType) {
                            throw new ParseException('Object support when parsing a YAML file has been disabled.', self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);
                        }

                        return null;
                    case 0 === strpos($scalar, '!php/const'):
                        if (self::$constantSupport) {
                            if (!isset($scalar[11])) {
                                return '';
                            }

                            $i = 0;
                            if (\defined($const = self::parseScalar(substr($scalar, 11), 0, null, $i, false))) {
                                return \constant($const);
                            }

                            throw new ParseException(sprintf('The constant "%s" is not defined.', $const), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);
                        }
                        if (self::$exceptionOnInvalidType) {
                            throw new ParseException(sprintf('The string "%s" could not be parsed as a constant. Did you forget to pass the "Yaml::PARSE_CONSTANT" flag to the parser?', $scalar), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);
                        }

                        return null;
                    case 0 === strpos($scalar, '!!float '):
                        return (float) substr($scalar, 8);
                    case 0 === strpos($scalar, '!!binary '):
                        return self::evaluateBinaryScalar(substr($scalar, 9));
                    default:
                        throw new ParseException(sprintf('The string "%s" could not be parsed as it uses an unsupported built-in tag.', $scalar), self::$parsedLineNumber, $scalar, self::$parsedFilename);
                }

            // Optimize for returning strings.
            // no break
            case '+' === $scalar[0] || '-' === $scalar[0] || '.' === $scalar[0] || is_numeric($scalar[0]):
                if (Parser::preg_match('{^[+-]?[0-9][0-9_]*$}', $scalar)) {
                    $scalar = str_replace('_', '', $scalar);
                }

                switch (true) {
                    case ctype_digit($scalar):
                        if (preg_match('/^0[0-7]+$/', $scalar)) {
                            return octdec($scalar);
                        }

                        $cast = (int) $scalar;

                        return ($scalar === (string) $cast) ? $cast : $scalar;
                    case '-' === $scalar[0] && ctype_digit(substr($scalar, 1)):
                        if (preg_match('/^-0[0-7]+$/', $scalar)) {
                            return -octdec(substr($scalar, 1));
                        }

                        $cast = (int) $scalar;

                        return ($scalar === (string) $cast) ? $cast : $scalar;
                    case is_numeric($scalar):
                    case Parser::preg_match(self::getHexRegex(), $scalar):
                        $scalar = str_replace('_', '', $scalar);

                        return '0x' === $scalar[0].$scalar[1] ? hexdec($scalar) : (float) $scalar;
                    case '.inf' === $scalarLower:
                    case '.nan' === $scalarLower:
                        return -log(0);
                    case '-.inf' === $scalarLower:
                        return log(0);
                    case Parser::preg_match('/^(-|\+)?[0-9][0-9_]*(\.[0-9_]+)?$/', $scalar):
                        return (float) str_replace('_', '', $scalar);
                    case Parser::preg_match(self::getTimestampRegex(), $scalar):
                        // When no timezone is provided in the parsed date, YAML spec says we must assume UTC.
                        $time = new \DateTime($scalar, new \DateTimeZone('UTC'));

                        if (Yaml::PARSE_DATETIME & $flags) {
                            return $time;
                        }

                        try {
                            if (false !== $scalar = $time->getTimestamp()) {
                                return $scalar;
                            }
                        } catch (\ValueError $e) {
                            // no-op
                        }

                        return $time->format('U');
                }
        }

        return (string) $scalar;
    }

    private static function parseTag(string $value, int &$i, int $flags): ?string
    {
        if ('!' !== $value[$i]) {
            return null;
        }

        $tagLength = strcspn($value, " \t\n[]{},", $i + 1);
        $tag = substr($value, $i + 1, $tagLength);

        $nextOffset = $i + $tagLength + 1;
        $nextOffset += strspn($value, ' ', $nextOffset);

        if ('' === $tag && (!isset($value[$nextOffset]) || \in_array($value[$nextOffset], [']', '}', ','], true))) {
            throw new ParseException('Using the unquoted scalar value "!" is not supported. You must quote it.', self::$parsedLineNumber + 1, $value, self::$parsedFilename);
        }

        // Is followed by a scalar and is a built-in tag
        if ('' !== $tag && (!isset($value[$nextOffset]) || !\in_array($value[$nextOffset], ['[', '{'], true)) && ('!' === $tag[0] || 'str' === $tag || 'php/const' === $tag || 'php/object' === $tag)) {
            // Manage in {@link self::evaluateScalar()}
            return null;
        }

        $i = $nextOffset;

        // Built-in tags
        if ('' !== $tag && '!' === $tag[0]) {
            throw new ParseException(sprintf('The built-in tag "!%s" is not implemented.', $tag), self::$parsedLineNumber + 1, $value, self::$parsedFilename);
        }

        if ('' !== $tag && !isset($value[$i])) {
            throw new ParseException(sprintf('Missing value for tag "%s".', $tag), self::$parsedLineNumber + 1, $value, self::$parsedFilename);
        }

        if ('' === $tag || Yaml::PARSE_CUSTOM_TAGS & $flags) {
            return $tag;
        }

        throw new ParseException(sprintf('Tags support is not enabled. Enable the "Yaml::PARSE_CUSTOM_TAGS" flag to use "!%s".', $tag), self::$parsedLineNumber + 1, $value, self::$parsedFilename);
    }

    public static function evaluateBinaryScalar(string $scalar): string
    {
        $parsedBinaryData = self::parseScalar(preg_replace('/\s/', '', $scalar));

        if (0 !== (\strlen($parsedBinaryData) % 4)) {
            throw new ParseException(sprintf('The normalized base64 encoded data (data without whitespace characters) length must be a multiple of four (%d bytes given).', \strlen($parsedBinaryData)), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);
        }

        if (!Parser::preg_match('#^[A-Z0-9+/]+={0,2}$#i', $parsedBinaryData)) {
            throw new ParseException(sprintf('The base64 encoded data (%s) contains invalid characters.', $parsedBinaryData), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);
        }

        return base64_decode($parsedBinaryData, true);
    }

    private static function isBinaryString(string $value)
    {
        return !preg_match('//u', $value) || preg_match('/[^\x00\x07-\x0d\x1B\x20-\xff]/', $value);
    }

    /**
     * Gets a regex that matches a YAML date.
     *
     * @return string The regular expression
     *
     * @see http://www.yaml.org/spec/1.2/spec.html#id2761573
     */
    private static function getTimestampRegex(): string
    {
        return <<<EOF
        ~^
        (?P<year>[0-9][0-9][0-9][0-9])
        -(?P<month>[0-9][0-9]?)
        -(?P<day>[0-9][0-9]?)
        (?:(?:[Tt]|[ \t]+)
        (?P<hour>[0-9][0-9]?)
        :(?P<minute>[0-9][0-9])
        :(?P<second>[0-9][0-9])
        (?:\.(?P<fraction>[0-9]*))?
        (?:[ \t]*(?P<tz>Z|(?P<tz_sign>[-+])(?P<tz_hour>[0-9][0-9]?)
        (?::(?P<tz_minute>[0-9][0-9]))?))?)?
        $~x
EOF;
    }

    /**
     * Gets a regex that matches a YAML number in hexadecimal notation.
     */
    private static function getHexRegex(): string
    {
        return '~^0x[0-9a-f_]++$~i';
    }
}
Copyright (c) 2004-2022 Fabien Potencier

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

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Yaml;

use Symfony\Component\Yaml\Exception\ParseException;
use Symfony\Component\Yaml\Tag\TaggedValue;

/**
 * Parser parses YAML strings to convert them to PHP arrays.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @final
 */
class Parser
{
    public const TAG_PATTERN = '(?P<tag>![\w!.\/:-]+)';
    public const BLOCK_SCALAR_HEADER_PATTERN = '(?P<separator>\||>)(?P<modifiers>\+|\-|\d+|\+\d+|\-\d+|\d+\+|\d+\-)?(?P<comments> +#.*)?';
    public const REFERENCE_PATTERN = '#^&(?P<ref>[^ ]++) *+(?P<value>.*)#u';

    private $filename;
    private $offset = 0;
    private $totalNumberOfLines;
    private $lines = [];
    private $currentLineNb = -1;
    private $currentLine = '';
    private $refs = [];
    private $skippedLineNumbers = [];
    private $locallySkippedLineNumbers = [];
    private $refsBeingParsed = [];

    /**
     * Parses a YAML file into a PHP value.
     *
     * @param string $filename The path to the YAML file to be parsed
     * @param int    $flags    A bit field of PARSE_* constants to customize the YAML parser behavior
     *
     * @return mixed The YAML converted to a PHP value
     *
     * @throws ParseException If the file could not be read or the YAML is not valid
     */
    public function parseFile(string $filename, int $flags = 0)
    {
        if (!is_file($filename)) {
            throw new ParseException(sprintf('File "%s" does not exist.', $filename));
        }

        if (!is_readable($filename)) {
            throw new ParseException(sprintf('File "%s" cannot be read.', $filename));
        }

        $this->filename = $filename;

        try {
            return $this->parse(file_get_contents($filename), $flags);
        } finally {
            $this->filename = null;
        }
    }

    /**
     * Parses a YAML string to a PHP value.
     *
     * @param string $value A YAML string
     * @param int    $flags A bit field of PARSE_* constants to customize the YAML parser behavior
     *
     * @return mixed A PHP value
     *
     * @throws ParseException If the YAML is not valid
     */
    public function parse(string $value, int $flags = 0)
    {
        if (false === preg_match('//u', $value)) {
            throw new ParseException('The YAML value does not appear to be valid UTF-8.', -1, null, $this->filename);
        }

        $this->refs = [];

        $mbEncoding = null;

        if (2 /* MB_OVERLOAD_STRING */ & (int) \ini_get('mbstring.func_overload')) {
            $mbEncoding = mb_internal_encoding();
            mb_internal_encoding('UTF-8');
        }

        try {
            $data = $this->doParse($value, $flags);
        } finally {
            if (null !== $mbEncoding) {
                mb_internal_encoding($mbEncoding);
            }
            $this->refsBeingParsed = [];
            $this->offset = 0;
            $this->lines = [];
            $this->currentLine = '';
            $this->refs = [];
            $this->skippedLineNumbers = [];
            $this->locallySkippedLineNumbers = [];
            $this->totalNumberOfLines = null;
        }

        return $data;
    }

    private function doParse(string $value, int $flags)
    {
        $this->currentLineNb = -1;
        $this->currentLine = '';
        $value = $this->cleanup($value);
        $this->lines = explode("\n", $value);
        $this->locallySkippedLineNumbers = [];

        if (null === $this->totalNumberOfLines) {
            $this->totalNumberOfLines = \count($this->lines);
        }

        if (!$this->moveToNextLine()) {
            return null;
        }

        $data = [];
        $context = null;
        $allowOverwrite = false;

        while ($this->isCurrentLineEmpty()) {
            if (!$this->moveToNextLine()) {
                return null;
            }
        }

        // Resolves the tag and returns if end of the document
        if (null !== ($tag = $this->getLineTag($this->currentLine, $flags, false)) && !$this->moveToNextLine()) {
            return new TaggedValue($tag, '');
        }

        do {
            if ($this->isCurrentLineEmpty()) {
                continue;
            }

            // tab?
            if ("\t" === $this->currentLine[0]) {
                throw new ParseException('A YAML file cannot contain tabs as indentation.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
            }

            Inline::initialize($flags, $this->getRealCurrentLineNb(), $this->filename);

            $isRef = $mergeNode = false;
            if ('-' === $this->currentLine[0] && self::preg_match('#^\-((?P<leadspaces>\s+)(?P<value>.+))?$#u', rtrim($this->currentLine), $values)) {
                if ($context && 'mapping' == $context) {
                    throw new ParseException('You cannot define a sequence item when in a mapping.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
                }
                $context = 'sequence';

                if (isset($values['value']) && '&' === $values['value'][0] && self::preg_match(self::REFERENCE_PATTERN, $values['value'], $matches)) {
                    $isRef = $matches['ref'];
                    $this->refsBeingParsed[] = $isRef;
                    $values['value'] = $matches['value'];
                }

                if (isset($values['value'][1]) && '?' === $values['value'][0] && ' ' === $values['value'][1]) {
                    throw new ParseException('Complex mappings are not supported.', $this->getRealCurrentLineNb() + 1, $this->currentLine);
                }

                // array
                if (isset($values['value']) && 0 === strpos(ltrim($values['value'], ' '), '-')) {
                    // Inline first child
                    $currentLineNumber = $this->getRealCurrentLineNb();

                    $sequenceIndentation = \strlen($values['leadspaces']) + 1;
                    $sequenceYaml = substr($this->currentLine, $sequenceIndentation);
                    $sequenceYaml .= "\n".$this->getNextEmbedBlock($sequenceIndentation, true);

                    $data[] = $this->parseBlock($currentLineNumber, rtrim($sequenceYaml), $flags);
                } elseif (!isset($values['value']) || '' == trim($values['value'], ' ') || 0 === strpos(ltrim($values['value'], ' '), '#')) {
                    $data[] = $this->parseBlock($this->getRealCurrentLineNb() + 1, $this->getNextEmbedBlock(null, true) ?? '', $flags);
                } elseif (null !== $subTag = $this->getLineTag(ltrim($values['value'], ' '), $flags)) {
                    $data[] = new TaggedValue(
                        $subTag,
                        $this->parseBlock($this->getRealCurrentLineNb() + 1, $this->getNextEmbedBlock(null, true), $flags)
                    );
                } else {
                    if (
                        isset($values['leadspaces'])
                        && (
                            '!' === $values['value'][0]
                            || self::preg_match('#^(?P<key>'.Inline::REGEX_QUOTED_STRING.'|[^ \'"\{\[].*?) *\:(\s+(?P<value>.+?))?\s*$#u', $this->trimTag($values['value']), $matches)
                        )
                    ) {
                        // this is a compact notation element, add to next block and parse
                        $block = $values['value'];
                        if ($this->isNextLineIndented()) {
                            $block .= "\n".$this->getNextEmbedBlock($this->getCurrentLineIndentation() + \strlen($values['leadspaces']) + 1);
                        }

                        $data[] = $this->parseBlock($this->getRealCurrentLineNb(), $block, $flags);
                    } else {
                        $data[] = $this->parseValue($values['value'], $flags, $context);
                    }
                }
                if ($isRef) {
                    $this->refs[$isRef] = end($data);
                    array_pop($this->refsBeingParsed);
                }
            } elseif (
                self::preg_match('#^(?P<key>(?:![^\s]++\s++)?(?:'.Inline::REGEX_QUOTED_STRING.'|(?:!?!php/const:)?[^ \'"\[\{!].*?)) *\:(( |\t)++(?P<value>.+))?$#u', rtrim($this->currentLine), $values)
                && (false === strpos($values['key'], ' #') || \in_array($values['key'][0], ['"', "'"]))
            ) {
                if ($context && 'sequence' == $context) {
                    throw new ParseException('You cannot define a mapping item when in a sequence.', $this->currentLineNb + 1, $this->currentLine, $this->filename);
                }
                $context = 'mapping';

                try {
                    $key = Inline::parseScalar($values['key']);
                } catch (ParseException $e) {
                    $e->setParsedLine($this->getRealCurrentLineNb() + 1);
                    $e->setSnippet($this->currentLine);

                    throw $e;
                }

                if (!\is_string($key) && !\is_int($key)) {
                    throw new ParseException((is_numeric($key) ? 'Numeric' : 'Non-string').' keys are not supported. Quote your evaluable mapping keys instead.', $this->getRealCurrentLineNb() + 1, $this->currentLine);
                }

                // Convert float keys to strings, to avoid being converted to integers by PHP
                if (\is_float($key)) {
                    $key = (string) $key;
                }

                if ('<<' === $key && (!isset($values['value']) || '&' !== $values['value'][0] || !self::preg_match('#^&(?P<ref>[^ ]+)#u', $values['value'], $refMatches))) {
                    $mergeNode = true;
                    $allowOverwrite = true;
                    if (isset($values['value'][0]) && '*' === $values['value'][0]) {
                        $refName = substr(rtrim($values['value']), 1);
                        if (!\array_key_exists($refName, $this->refs)) {
                            if (false !== $pos = array_search($refName, $this->refsBeingParsed, true)) {
                                throw new ParseException(sprintf('Circular reference [%s] detected for reference "%s".', implode(', ', array_merge(\array_slice($this->refsBeingParsed, $pos), [$refName])), $refName), $this->currentLineNb + 1, $this->currentLine, $this->filename);
                            }

                            throw new ParseException(sprintf('Reference "%s" does not exist.', $refName), $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
                        }

                        $refValue = $this->refs[$refName];

                        if (Yaml::PARSE_OBJECT_FOR_MAP & $flags && $refValue instanceof \stdClass) {
                            $refValue = (array) $refValue;
                        }

                        if (!\is_array($refValue)) {
                            throw new ParseException('YAML merge keys used with a scalar value instead of an array.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
                        }

                        $data += $refValue; // array union
                    } else {
                        if (isset($values['value']) && '' !== $values['value']) {
                            $value = $values['value'];
                        } else {
                            $value = $this->getNextEmbedBlock();
                        }
                        $parsed = $this->parseBlock($this->getRealCurrentLineNb() + 1, $value, $flags);

                        if (Yaml::PARSE_OBJECT_FOR_MAP & $flags && $parsed instanceof \stdClass) {
                            $parsed = (array) $parsed;
                        }

                        if (!\is_array($parsed)) {
                            throw new ParseException('YAML merge keys used with a scalar value instead of an array.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
                        }

                        if (isset($parsed[0])) {
                            // If the value associated with the merge key is a sequence, then this sequence is expected to contain mapping nodes
                            // and each of these nodes is merged in turn according to its order in the sequence. Keys in mapping nodes earlier
                            // in the sequence override keys specified in later mapping nodes.
                            foreach ($parsed as $parsedItem) {
                                if (Yaml::PARSE_OBJECT_FOR_MAP & $flags && $parsedItem instanceof \stdClass) {
                                    $parsedItem = (array) $parsedItem;
                                }

                                if (!\is_array($parsedItem)) {
                                    throw new ParseException('Merge items must be arrays.', $this->getRealCurrentLineNb() + 1, $parsedItem, $this->filename);
                                }

                                $data += $parsedItem; // array union
                            }
                        } else {
                            // If the value associated with the key is a single mapping node, each of its key/value pairs is inserted into the
                            // current mapping, unless the key already exists in it.
                            $data += $parsed; // array union
                        }
                    }
                } elseif ('<<' !== $key && isset($values['value']) && '&' === $values['value'][0] && self::preg_match(self::REFERENCE_PATTERN, $values['value'], $matches)) {
                    $isRef = $matches['ref'];
                    $this->refsBeingParsed[] = $isRef;
                    $values['value'] = $matches['value'];
                }

                $subTag = null;
                if ($mergeNode) {
                    // Merge keys
                } elseif (!isset($values['value']) || '' === $values['value'] || 0 === strpos($values['value'], '#') || (null !== $subTag = $this->getLineTag($values['value'], $flags)) || '<<' === $key) {
                    // hash
                    // if next line is less indented or equal, then it means that the current value is null
                    if (!$this->isNextLineIndented() && !$this->isNextLineUnIndentedCollection()) {
                        // Spec: Keys MUST be unique; first one wins.
                        // But overwriting is allowed when a merge node is used in current block.
                        if ($allowOverwrite || !isset($data[$key])) {
                            if (null !== $subTag) {
                                $data[$key] = new TaggedValue($subTag, '');
                            } else {
                                $data[$key] = null;
                            }
                        } else {
                            throw new ParseException(sprintf('Duplicate key "%s" detected.', $key), $this->getRealCurrentLineNb() + 1, $this->currentLine);
                        }
                    } else {
                        // remember the parsed line number here in case we need it to provide some contexts in error messages below
                        $realCurrentLineNbKey = $this->getRealCurrentLineNb();
                        $value = $this->parseBlock($this->getRealCurrentLineNb() + 1, $this->getNextEmbedBlock(), $flags);
                        if ('<<' === $key) {
                            $this->refs[$refMatches['ref']] = $value;

                            if (Yaml::PARSE_OBJECT_FOR_MAP & $flags && $value instanceof \stdClass) {
                                $value = (array) $value;
                            }

                            $data += $value;
                        } elseif ($allowOverwrite || !isset($data[$key])) {
                            // Spec: Keys MUST be unique; first one wins.
                            // But overwriting is allowed when a merge node is used in current block.
                            if (null !== $subTag) {
                                $data[$key] = new TaggedValue($subTag, $value);
                            } else {
                                $data[$key] = $value;
                            }
                        } else {
                            throw new ParseException(sprintf('Duplicate key "%s" detected.', $key), $realCurrentLineNbKey + 1, $this->currentLine);
                        }
                    }
                } else {
                    $value = $this->parseValue(rtrim($values['value']), $flags, $context);
                    // Spec: Keys MUST be unique; first one wins.
                    // But overwriting is allowed when a merge node is used in current block.
                    if ($allowOverwrite || !isset($data[$key])) {
                        $data[$key] = $value;
                    } else {
                        throw new ParseException(sprintf('Duplicate key "%s" detected.', $key), $this->getRealCurrentLineNb() + 1, $this->currentLine);
                    }
                }
                if ($isRef) {
                    $this->refs[$isRef] = $data[$key];
                    array_pop($this->refsBeingParsed);
                }
            } elseif ('"' === $this->currentLine[0] || "'" === $this->currentLine[0]) {
                if (null !== $context) {
                    throw new ParseException('Unable to parse.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
                }

                try {
                    return Inline::parse($this->lexInlineQuotedString(), $flags, $this->refs);
                } catch (ParseException $e) {
                    $e->setParsedLine($this->getRealCurrentLineNb() + 1);
                    $e->setSnippet($this->currentLine);

                    throw $e;
                }
            } elseif ('{' === $this->currentLine[0]) {
                if (null !== $context) {
                    throw new ParseException('Unable to parse.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
                }

                try {
                    $parsedMapping = Inline::parse($this->lexInlineMapping(), $flags, $this->refs);

                    while ($this->moveToNextLine()) {
                        if (!$this->isCurrentLineEmpty()) {
                            throw new ParseException('Unable to parse.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
                        }
                    }

                    return $parsedMapping;
                } catch (ParseException $e) {
                    $e->setParsedLine($this->getRealCurrentLineNb() + 1);
                    $e->setSnippet($this->currentLine);

                    throw $e;
                }
            } elseif ('[' === $this->currentLine[0]) {
                if (null !== $context) {
                    throw new ParseException('Unable to parse.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
                }

                try {
                    $parsedSequence = Inline::parse($this->lexInlineSequence(), $flags, $this->refs);

                    while ($this->moveToNextLine()) {
                        if (!$this->isCurrentLineEmpty()) {
                            throw new ParseException('Unable to parse.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
                        }
                    }

                    return $parsedSequence;
                } catch (ParseException $e) {
                    $e->setParsedLine($this->getRealCurrentLineNb() + 1);
                    $e->setSnippet($this->currentLine);

                    throw $e;
                }
            } else {
                // multiple documents are not supported
                if ('---' === $this->currentLine) {
                    throw new ParseException('Multiple documents are not supported.', $this->currentLineNb + 1, $this->currentLine, $this->filename);
                }

                if ($deprecatedUsage = (isset($this->currentLine[1]) && '?' === $this->currentLine[0] && ' ' === $this->currentLine[1])) {
                    throw new ParseException('Complex mappings are not supported.', $this->getRealCurrentLineNb() + 1, $this->currentLine);
                }

                // 1-liner optionally followed by newline(s)
                if (\is_string($value) && $this->lines[0] === trim($value)) {
                    try {
                        $value = Inline::parse($this->lines[0], $flags, $this->refs);
                    } catch (ParseException $e) {
                        $e->setParsedLine($this->getRealCurrentLineNb() + 1);
                        $e->setSnippet($this->currentLine);

                        throw $e;
                    }

                    return $value;
                }

                // try to parse the value as a multi-line string as a last resort
                if (0 === $this->currentLineNb) {
                    $previousLineWasNewline = false;
                    $previousLineWasTerminatedWithBackslash = false;
                    $value = '';

                    foreach ($this->lines as $line) {
                        if ('' !== ltrim($line) && '#' === ltrim($line)[0]) {
                            continue;
                        }
                        // If the indentation is not consistent at offset 0, it is to be considered as a ParseError
                        if (0 === $this->offset && !$deprecatedUsage && isset($line[0]) && ' ' === $line[0]) {
                            throw new ParseException('Unable to parse.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
                        }

                        if (false !== strpos($line, ': ')) {
                            @trigger_error('Support for mapping keys in multi-line blocks is deprecated since Symfony 4.3 and will throw a ParseException in 5.0.', \E_USER_DEPRECATED);
                        }

                        if ('' === trim($line)) {
                            $value .= "\n";
                        } elseif (!$previousLineWasNewline && !$previousLineWasTerminatedWithBackslash) {
                            $value .= ' ';
                        }

                        if ('' !== trim($line) && '\\' === substr($line, -1)) {
                            $value .= ltrim(substr($line, 0, -1));
                        } elseif ('' !== trim($line)) {
                            $value .= trim($line);
                        }

                        if ('' === trim($line)) {
                            $previousLineWasNewline = true;
                            $previousLineWasTerminatedWithBackslash = false;
                        } elseif ('\\' === substr($line, -1)) {
                            $previousLineWasNewline = false;
                            $previousLineWasTerminatedWithBackslash = true;
                        } else {
                            $previousLineWasNewline = false;
                            $previousLineWasTerminatedWithBackslash = false;
                        }
                    }

                    try {
                        return Inline::parse(trim($value));
                    } catch (ParseException $e) {
                        // fall-through to the ParseException thrown below
                    }
                }

                throw new ParseException('Unable to parse.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
            }
        } while ($this->moveToNextLine());

        if (null !== $tag) {
            $data = new TaggedValue($tag, $data);
        }

        if (Yaml::PARSE_OBJECT_FOR_MAP & $flags && !\is_object($data) && 'mapping' === $context) {
            $object = new \stdClass();

            foreach ($data as $key => $value) {
                $object->$key = $value;
            }

            $data = $object;
        }

        return empty($data) ? null : $data;
    }

    private function parseBlock(int $offset, string $yaml, int $flags)
    {
        $skippedLineNumbers = $this->skippedLineNumbers;

        foreach ($this->locallySkippedLineNumbers as $lineNumber) {
            if ($lineNumber < $offset) {
                continue;
            }

            $skippedLineNumbers[] = $lineNumber;
        }

        $parser = new self();
        $parser->offset = $offset;
        $parser->totalNumberOfLines = $this->totalNumberOfLines;
        $parser->skippedLineNumbers = $skippedLineNumbers;
        $parser->refs = &$this->refs;
        $parser->refsBeingParsed = $this->refsBeingParsed;

        return $parser->doParse($yaml, $flags);
    }

    /**
     * Returns the current line number (takes the offset into account).
     *
     * @internal
     *
     * @return int The current line number
     */
    public function getRealCurrentLineNb(): int
    {
        $realCurrentLineNumber = $this->currentLineNb + $this->offset;

        foreach ($this->skippedLineNumbers as $skippedLineNumber) {
            if ($skippedLineNumber > $realCurrentLineNumber) {
                break;
            }

            ++$realCurrentLineNumber;
        }

        return $realCurrentLineNumber;
    }

    /**
     * Returns the current line indentation.
     *
     * @return int The current line indentation
     */
    private function getCurrentLineIndentation(): int
    {
        return \strlen($this->currentLine) - \strlen(ltrim($this->currentLine, ' '));
    }

    /**
     * Returns the next embed block of YAML.
     *
     * @param int|null $indentation The indent level at which the block is to be read, or null for default
     * @param bool     $inSequence  True if the enclosing data structure is a sequence
     *
     * @return string A YAML string
     *
     * @throws ParseException When indentation problem are detected
     */
    private function getNextEmbedBlock(int $indentation = null, bool $inSequence = false): string
    {
        $oldLineIndentation = $this->getCurrentLineIndentation();

        if (!$this->moveToNextLine()) {
            return '';
        }

        if (null === $indentation) {
            $newIndent = null;
            $movements = 0;

            do {
                $EOF = false;

                // empty and comment-like lines do not influence the indentation depth
                if ($this->isCurrentLineEmpty() || $this->isCurrentLineComment()) {
                    $EOF = !$this->moveToNextLine();

                    if (!$EOF) {
                        ++$movements;
                    }
                } else {
                    $newIndent = $this->getCurrentLineIndentation();
                }
            } while (!$EOF && null === $newIndent);

            for ($i = 0; $i < $movements; ++$i) {
                $this->moveToPreviousLine();
            }

            $unindentedEmbedBlock = $this->isStringUnIndentedCollectionItem();

            if (!$this->isCurrentLineEmpty() && 0 === $newIndent && !$unindentedEmbedBlock) {
                throw new ParseException('Indentation problem.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
            }
        } else {
            $newIndent = $indentation;
        }

        $data = [];

        if ($this->getCurrentLineIndentation() >= $newIndent) {
            $data[] = substr($this->currentLine, $newIndent ?? 0);
        } elseif ($this->isCurrentLineEmpty() || $this->isCurrentLineComment()) {
            $data[] = $this->currentLine;
        } else {
            $this->moveToPreviousLine();

            return '';
        }

        if ($inSequence && $oldLineIndentation === $newIndent && isset($data[0][0]) && '-' === $data[0][0]) {
            // the previous line contained a dash but no item content, this line is a sequence item with the same indentation
            // and therefore no nested list or mapping
            $this->moveToPreviousLine();

            return '';
        }

        $isItUnindentedCollection = $this->isStringUnIndentedCollectionItem();
        $isItComment = $this->isCurrentLineComment();

        while ($this->moveToNextLine()) {
            if ($isItComment && !$isItUnindentedCollection) {
                $isItUnindentedCollection = $this->isStringUnIndentedCollectionItem();
                $isItComment = $this->isCurrentLineComment();
            }

            $indent = $this->getCurrentLineIndentation();

            if ($isItUnindentedCollection && !$this->isCurrentLineEmpty() && !$this->isStringUnIndentedCollectionItem() && $newIndent === $indent) {
                $this->moveToPreviousLine();
                break;
            }

            if ($this->isCurrentLineBlank()) {
                $data[] = substr($this->currentLine, $newIndent);
                continue;
            }

            if ($indent >= $newIndent) {
                $data[] = substr($this->currentLine, $newIndent);
            } elseif ($this->isCurrentLineComment()) {
                $data[] = $this->currentLine;
            } elseif (0 == $indent) {
                $this->moveToPreviousLine();

                break;
            } else {
                throw new ParseException('Indentation problem.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
            }
        }

        return implode("\n", $data);
    }

    private function hasMoreLines(): bool
    {
        return (\count($this->lines) - 1) > $this->currentLineNb;
    }

    /**
     * Moves the parser to the next line.
     */
    private function moveToNextLine(): bool
    {
        if ($this->currentLineNb >= \count($this->lines) - 1) {
            return false;
        }

        $this->currentLine = $this->lines[++$this->currentLineNb];

        return true;
    }

    /**
     * Moves the parser to the previous line.
     */
    private function moveToPreviousLine(): bool
    {
        if ($this->currentLineNb < 1) {
            return false;
        }

        $this->currentLine = $this->lines[--$this->currentLineNb];

        return true;
    }

    /**
     * Parses a YAML value.
     *
     * @param string $value   A YAML value
     * @param int    $flags   A bit field of PARSE_* constants to customize the YAML parser behavior
     * @param string $context The parser context (either sequence or mapping)
     *
     * @return mixed A PHP value
     *
     * @throws ParseException When reference does not exist
     */
    private function parseValue(string $value, int $flags, string $context)
    {
        if (0 === strpos($value, '*')) {
            if (false !== $pos = strpos($value, '#')) {
                $value = substr($value, 1, $pos - 2);
            } else {
                $value = substr($value, 1);
            }

            if (!\array_key_exists($value, $this->refs)) {
                if (false !== $pos = array_search($value, $this->refsBeingParsed, true)) {
                    throw new ParseException(sprintf('Circular reference [%s] detected for reference "%s".', implode(', ', array_merge(\array_slice($this->refsBeingParsed, $pos), [$value])), $value), $this->currentLineNb + 1, $this->currentLine, $this->filename);
                }

                throw new ParseException(sprintf('Reference "%s" does not exist.', $value), $this->currentLineNb + 1, $this->currentLine, $this->filename);
            }

            return $this->refs[$value];
        }

        if (\in_array($value[0], ['!', '|', '>'], true) && self::preg_match('/^(?:'.self::TAG_PATTERN.' +)?'.self::BLOCK_SCALAR_HEADER_PATTERN.'$/', $value, $matches)) {
            $modifiers = $matches['modifiers'] ?? '';

            $data = $this->parseBlockScalar($matches['separator'], preg_replace('#\d+#', '', $modifiers), abs((int) $modifiers));

            if ('' !== $matches['tag'] && '!' !== $matches['tag']) {
                if ('!!binary' === $matches['tag']) {
                    return Inline::evaluateBinaryScalar($data);
                }

                return new TaggedValue(substr($matches['tag'], 1), $data);
            }

            return $data;
        }

        try {
            if ('' !== $value && '{' === $value[0]) {
                $cursor = \strlen(rtrim($this->currentLine)) - \strlen(rtrim($value));

                return Inline::parse($this->lexInlineMapping($cursor), $flags, $this->refs);
            } elseif ('' !== $value && '[' === $value[0]) {
                $cursor = \strlen(rtrim($this->currentLine)) - \strlen(rtrim($value));

                return Inline::parse($this->lexInlineSequence($cursor), $flags, $this->refs);
            }

            switch ($value[0] ?? '') {
                case '"':
                case "'":
                    $cursor = \strlen(rtrim($this->currentLine)) - \strlen(rtrim($value));
                    $parsedValue = Inline::parse($this->lexInlineQuotedString($cursor), $flags, $this->refs);

                    if (isset($this->currentLine[$cursor]) && preg_replace('/\s*(#.*)?$/A', '', substr($this->currentLine, $cursor))) {
                        throw new ParseException(sprintf('Unexpected characters near "%s".', substr($this->currentLine, $cursor)));
                    }

                    return $parsedValue;
                default:
                    $lines = [];

                    while ($this->moveToNextLine()) {
                        // unquoted strings end before the first unindented line
                        if (0 === $this->getCurrentLineIndentation()) {
                            $this->moveToPreviousLine();

                            break;
                        }

                        $lines[] = trim($this->currentLine);
                    }

                    for ($i = 0, $linesCount = \count($lines), $previousLineBlank = false; $i < $linesCount; ++$i) {
                        if ('' === $lines[$i]) {
                            $value .= "\n";
                            $previousLineBlank = true;
                        } elseif ($previousLineBlank) {
                            $value .= $lines[$i];
                            $previousLineBlank = false;
                        } else {
                            $value .= ' '.$lines[$i];
                            $previousLineBlank = false;
                        }
                    }

                    Inline::$parsedLineNumber = $this->getRealCurrentLineNb();

                    $parsedValue = Inline::parse($value, $flags, $this->refs);

                    if ('mapping' === $context && \is_string($parsedValue) && '"' !== $value[0] && "'" !== $value[0] && '[' !== $value[0] && '{' !== $value[0] && '!' !== $value[0] && false !== strpos($parsedValue, ': ')) {
                        throw new ParseException('A colon cannot be used in an unquoted mapping value.', $this->getRealCurrentLineNb() + 1, $value, $this->filename);
                    }

                    return $parsedValue;
            }
        } catch (ParseException $e) {
            $e->setParsedLine($this->getRealCurrentLineNb() + 1);
            $e->setSnippet($this->currentLine);

            throw $e;
        }
    }

    /**
     * Parses a block scalar.
     *
     * @param string $style       The style indicator that was used to begin this block scalar (| or >)
     * @param string $chomping    The chomping indicator that was used to begin this block scalar (+ or -)
     * @param int    $indentation The indentation indicator that was used to begin this block scalar
     */
    private function parseBlockScalar(string $style, string $chomping = '', int $indentation = 0): string
    {
        $notEOF = $this->moveToNextLine();
        if (!$notEOF) {
            return '';
        }

        $isCurrentLineBlank = $this->isCurrentLineBlank();
        $blockLines = [];

        // leading blank lines are consumed before determining indentation
        while ($notEOF && $isCurrentLineBlank) {
            // newline only if not EOF
            if ($notEOF = $this->moveToNextLine()) {
                $blockLines[] = '';
                $isCurrentLineBlank = $this->isCurrentLineBlank();
            }
        }

        // determine indentation if not specified
        if (0 === $indentation) {
            $currentLineLength = \strlen($this->currentLine);

            for ($i = 0; $i < $currentLineLength && ' ' === $this->currentLine[$i]; ++$i) {
                ++$indentation;
            }
        }

        if ($indentation > 0) {
            $pattern = sprintf('/^ {%d}(.*)$/', $indentation);

            while (
                $notEOF && (
                    $isCurrentLineBlank ||
                    self::preg_match($pattern, $this->currentLine, $matches)
                )
            ) {
                if ($isCurrentLineBlank && \strlen($this->currentLine) > $indentation) {
                    $blockLines[] = substr($this->currentLine, $indentation);
                } elseif ($isCurrentLineBlank) {
                    $blockLines[] = '';
                } else {
                    $blockLines[] = $matches[1];
                }

                // newline only if not EOF
                if ($notEOF = $this->moveToNextLine()) {
                    $isCurrentLineBlank = $this->isCurrentLineBlank();
                }
            }
        } elseif ($notEOF) {
            $blockLines[] = '';
        }

        if ($notEOF) {
            $blockLines[] = '';
            $this->moveToPreviousLine();
        } elseif (!$notEOF && !$this->isCurrentLineLastLineInDocument()) {
            $blockLines[] = '';
        }

        // folded style
        if ('>' === $style) {
            $text = '';
            $previousLineIndented = false;
            $previousLineBlank = false;

            for ($i = 0, $blockLinesCount = \count($blockLines); $i < $blockLinesCount; ++$i) {
                if ('' === $blockLines[$i]) {
                    $text .= "\n";
                    $previousLineIndented = false;
                    $previousLineBlank = true;
                } elseif (' ' === $blockLines[$i][0]) {
                    $text .= "\n".$blockLines[$i];
                    $previousLineIndented = true;
                    $previousLineBlank = false;
                } elseif ($previousLineIndented) {
                    $text .= "\n".$blockLines[$i];
                    $previousLineIndented = false;
                    $previousLineBlank = false;
                } elseif ($previousLineBlank || 0 === $i) {
                    $text .= $blockLines[$i];
                    $previousLineIndented = false;
                    $previousLineBlank = false;
                } else {
                    $text .= ' '.$blockLines[$i];
                    $previousLineIndented = false;
                    $previousLineBlank = false;
                }
            }
        } else {
            $text = implode("\n", $blockLines);
        }

        // deal with trailing newlines
        if ('' === $chomping) {
            $text = preg_replace('/\n+$/', "\n", $text);
        } elseif ('-' === $chomping) {
            $text = preg_replace('/\n+$/', '', $text);
        }

        return $text;
    }

    /**
     * Returns true if the next line is indented.
     *
     * @return bool Returns true if the next line is indented, false otherwise
     */
    private function isNextLineIndented(): bool
    {
        $currentIndentation = $this->getCurrentLineIndentation();
        $movements = 0;

        do {
            $EOF = !$this->moveToNextLine();

            if (!$EOF) {
                ++$movements;
            }
        } while (!$EOF && ($this->isCurrentLineEmpty() || $this->isCurrentLineComment()));

        if ($EOF) {
            return false;
        }

        $ret = $this->getCurrentLineIndentation() > $currentIndentation;

        for ($i = 0; $i < $movements; ++$i) {
            $this->moveToPreviousLine();
        }

        return $ret;
    }

    /**
     * Returns true if the current line is blank or if it is a comment line.
     *
     * @return bool Returns true if the current line is empty or if it is a comment line, false otherwise
     */
    private function isCurrentLineEmpty(): bool
    {
        return $this->isCurrentLineBlank() || $this->isCurrentLineComment();
    }

    /**
     * Returns true if the current line is blank.
     *
     * @return bool Returns true if the current line is blank, false otherwise
     */
    private function isCurrentLineBlank(): bool
    {
        return '' == trim($this->currentLine, ' ');
    }

    /**
     * Returns true if the current line is a comment line.
     *
     * @return bool Returns true if the current line is a comment line, false otherwise
     */
    private function isCurrentLineComment(): bool
    {
        // checking explicitly the first char of the trim is faster than loops or strpos
        $ltrimmedLine = ltrim($this->currentLine, ' ');

        return '' !== $ltrimmedLine && '#' === $ltrimmedLine[0];
    }

    private function isCurrentLineLastLineInDocument(): bool
    {
        return ($this->offset + $this->currentLineNb) >= ($this->totalNumberOfLines - 1);
    }

    /**
     * Cleanups a YAML string to be parsed.
     *
     * @param string $value The input YAML string
     *
     * @return string A cleaned up YAML string
     */
    private function cleanup(string $value): string
    {
        $value = str_replace(["\r\n", "\r"], "\n", $value);

        // strip YAML header
        $count = 0;
        $value = preg_replace('#^\%YAML[: ][\d\.]+.*\n#u', '', $value, -1, $count);
        $this->offset += $count;

        // remove leading comments
        $trimmedValue = preg_replace('#^(\#.*?\n)+#s', '', $value, -1, $count);
        if (1 === $count) {
            // items have been removed, update the offset
            $this->offset += substr_count($value, "\n") - substr_count($trimmedValue, "\n");
            $value = $trimmedValue;
        }

        // remove start of the document marker (---)
        $trimmedValue = preg_replace('#^\-\-\-.*?\n#s', '', $value, -1, $count);
        if (1 === $count) {
            // items have been removed, update the offset
            $this->offset += substr_count($value, "\n") - substr_count($trimmedValue, "\n");
            $value = $trimmedValue;

            // remove end of the document marker (...)
            $value = preg_replace('#\.\.\.\s*$#', '', $value);
        }

        return $value;
    }

    /**
     * Returns true if the next line starts unindented collection.
     *
     * @return bool Returns true if the next line starts unindented collection, false otherwise
     */
    private function isNextLineUnIndentedCollection(): bool
    {
        $currentIndentation = $this->getCurrentLineIndentation();
        $movements = 0;

        do {
            $EOF = !$this->moveToNextLine();

            if (!$EOF) {
                ++$movements;
            }
        } while (!$EOF && ($this->isCurrentLineEmpty() || $this->isCurrentLineComment()));

        if ($EOF) {
            return false;
        }

        $ret = $this->getCurrentLineIndentation() === $currentIndentation && $this->isStringUnIndentedCollectionItem();

        for ($i = 0; $i < $movements; ++$i) {
            $this->moveToPreviousLine();
        }

        return $ret;
    }

    /**
     * Returns true if the string is un-indented collection item.
     *
     * @return bool Returns true if the string is un-indented collection item, false otherwise
     */
    private function isStringUnIndentedCollectionItem(): bool
    {
        return '-' === rtrim($this->currentLine) || 0 === strpos($this->currentLine, '- ');
    }

    /**
     * A local wrapper for "preg_match" which will throw a ParseException if there
     * is an internal error in the PCRE engine.
     *
     * This avoids us needing to check for "false" every time PCRE is used
     * in the YAML engine
     *
     * @throws ParseException on a PCRE internal error
     *
     * @see preg_last_error()
     *
     * @internal
     */
    public static function preg_match(string $pattern, string $subject, array &$matches = null, int $flags = 0, int $offset = 0): int
    {
        if (false === $ret = preg_match($pattern, $subject, $matches, $flags, $offset)) {
            switch (preg_last_error()) {
                case \PREG_INTERNAL_ERROR:
                    $error = 'Internal PCRE error.';
                    break;
                case \PREG_BACKTRACK_LIMIT_ERROR:
                    $error = 'pcre.backtrack_limit reached.';
                    break;
                case \PREG_RECURSION_LIMIT_ERROR:
                    $error = 'pcre.recursion_limit reached.';
                    break;
                case \PREG_BAD_UTF8_ERROR:
                    $error = 'Malformed UTF-8 data.';
                    break;
                case \PREG_BAD_UTF8_OFFSET_ERROR:
                    $error = 'Offset doesn\'t correspond to the begin of a valid UTF-8 code point.';
                    break;
                default:
                    $error = 'Error.';
            }

            throw new ParseException($error);
        }

        return $ret;
    }

    /**
     * Trim the tag on top of the value.
     *
     * Prevent values such as "!foo {quz: bar}" to be considered as
     * a mapping block.
     */
    private function trimTag(string $value): string
    {
        if ('!' === $value[0]) {
            return ltrim(substr($value, 1, strcspn($value, " \r\n", 1)), ' ');
        }

        return $value;
    }

    private function getLineTag(string $value, int $flags, bool $nextLineCheck = true): ?string
    {
        if ('' === $value || '!' !== $value[0] || 1 !== self::preg_match('/^'.self::TAG_PATTERN.' *( +#.*)?$/', $value, $matches)) {
            return null;
        }

        if ($nextLineCheck && !$this->isNextLineIndented()) {
            return null;
        }

        $tag = substr($matches['tag'], 1);

        // Built-in tags
        if ($tag && '!' === $tag[0]) {
            throw new ParseException(sprintf('The built-in tag "!%s" is not implemented.', $tag), $this->getRealCurrentLineNb() + 1, $value, $this->filename);
        }

        if (Yaml::PARSE_CUSTOM_TAGS & $flags) {
            return $tag;
        }

        throw new ParseException(sprintf('Tags support is not enabled. You must use the flag "Yaml::PARSE_CUSTOM_TAGS" to use "%s".', $matches['tag']), $this->getRealCurrentLineNb() + 1, $value, $this->filename);
    }

    private function lexInlineQuotedString(int &$cursor = 0): string
    {
        $quotation = $this->currentLine[$cursor];
        $value = $quotation;
        ++$cursor;

        $previousLineWasNewline = true;
        $previousLineWasTerminatedWithBackslash = false;
        $lineNumber = 0;

        do {
            if (++$lineNumber > 1) {
                $cursor += strspn($this->currentLine, ' ', $cursor);
            }

            if ($this->isCurrentLineBlank()) {
                $value .= "\n";
            } elseif (!$previousLineWasNewline && !$previousLineWasTerminatedWithBackslash) {
                $value .= ' ';
            }

            for (; \strlen($this->currentLine) > $cursor; ++$cursor) {
                switch ($this->currentLine[$cursor]) {
                    case '\\':
                        if ("'" === $quotation) {
                            $value .= '\\';
                        } elseif (isset($this->currentLine[++$cursor])) {
                            $value .= '\\'.$this->currentLine[$cursor];
                        }

                        break;
                    case $quotation:
                        ++$cursor;

                        if ("'" === $quotation && isset($this->currentLine[$cursor]) && "'" === $this->currentLine[$cursor]) {
                            $value .= "''";
                            break;
                        }

                        return $value.$quotation;
                    default:
                        $value .= $this->currentLine[$cursor];
                }
            }

            if ($this->isCurrentLineBlank()) {
                $previousLineWasNewline = true;
                $previousLineWasTerminatedWithBackslash = false;
            } elseif ('\\' === $this->currentLine[-1]) {
                $previousLineWasNewline = false;
                $previousLineWasTerminatedWithBackslash = true;
            } else {
                $previousLineWasNewline = false;
                $previousLineWasTerminatedWithBackslash = false;
            }

            if ($this->hasMoreLines()) {
                $cursor = 0;
            }
        } while ($this->moveToNextLine());

        throw new ParseException('Malformed inline YAML string.');
    }

    private function lexUnquotedString(int &$cursor): string
    {
        $offset = $cursor;
        $cursor += strcspn($this->currentLine, '[]{},: ', $cursor);

        if ($cursor === $offset) {
            throw new ParseException('Malformed unquoted YAML string.');
        }

        return substr($this->currentLine, $offset, $cursor - $offset);
    }

    private function lexInlineMapping(int &$cursor = 0): string
    {
        return $this->lexInlineStructure($cursor, '}');
    }

    private function lexInlineSequence(int &$cursor = 0): string
    {
        return $this->lexInlineStructure($cursor, ']');
    }

    private function lexInlineStructure(int &$cursor, string $closingTag): string
    {
        $value = $this->currentLine[$cursor];
        ++$cursor;

        do {
            $this->consumeWhitespaces($cursor);

            while (isset($this->currentLine[$cursor])) {
                switch ($this->currentLine[$cursor]) {
                    case '"':
                    case "'":
                        $value .= $this->lexInlineQuotedString($cursor);
                        break;
                    case ':':
                    case ',':
                        $value .= $this->currentLine[$cursor];
                        ++$cursor;
                        break;
                    case '{':
                        $value .= $this->lexInlineMapping($cursor);
                        break;
                    case '[':
                        $value .= $this->lexInlineSequence($cursor);
                        break;
                    case $closingTag:
                        $value .= $this->currentLine[$cursor];
                        ++$cursor;

                        return $value;
                    case '#':
                        break 2;
                    default:
                        $value .= $this->lexUnquotedString($cursor);
                }

                if ($this->consumeWhitespaces($cursor)) {
                    $value .= ' ';
                }
            }

            if ($this->hasMoreLines()) {
                $cursor = 0;
            }
        } while ($this->moveToNextLine());

        throw new ParseException('Malformed inline YAML string.');
    }

    private function consumeWhitespaces(int &$cursor): bool
    {
        $whitespacesConsumed = 0;

        do {
            $whitespaceOnlyTokenLength = strspn($this->currentLine, ' ', $cursor);
            $whitespacesConsumed += $whitespaceOnlyTokenLength;
            $cursor += $whitespaceOnlyTokenLength;

            if (isset($this->currentLine[$cursor])) {
                return 0 < $whitespacesConsumed;
            }

            if ($this->hasMoreLines()) {
                $cursor = 0;
            }
        } while ($this->moveToNextLine());

        return 0 < $whitespacesConsumed;
    }
}
Yaml Component
==============

The Yaml component loads and dumps YAML files.

Resources
---------

 * [Documentation](https://symfony.com/doc/current/components/yaml.html)
 * [Contributing](https://symfony.com/doc/current/contributing/index.html)
 * [Report issues](https://github.com/symfony/symfony/issues) and
   [send Pull Requests](https://github.com/symfony/symfony/pulls)
   in the [main Symfony repository](https://github.com/symfony/symfony)
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Yaml\Tag;

/**
 * @author Nicolas Grekas <p@tchwork.com>
 * @author Guilhem N. <egetick@gmail.com>
 */
final class TaggedValue
{
    private $tag;
    private $value;

    public function __construct(string $tag, $value)
    {
        $this->tag = $tag;
        $this->value = $value;
    }

    public function getTag(): string
    {
        return $this->tag;
    }

    public function getValue()
    {
        return $this->value;
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Yaml;

use Symfony\Component\Yaml\Exception\ParseException;

/**
 * Unescaper encapsulates unescaping rules for single and double-quoted
 * YAML strings.
 *
 * @author Matthew Lewinski <matthew@lewinski.org>
 *
 * @internal
 */
class Unescaper
{
    /**
     * Regex fragment that matches an escaped character in a double quoted string.
     */
    public const REGEX_ESCAPED_CHARACTER = '\\\\(x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|U[0-9a-fA-F]{8}|.)';

    /**
     * Unescapes a single quoted string.
     *
     * @param string $value A single quoted string
     *
     * @return string The unescaped string
     */
    public function unescapeSingleQuotedString(string $value): string
    {
        return str_replace('\'\'', '\'', $value);
    }

    /**
     * Unescapes a double quoted string.
     *
     * @param string $value A double quoted string
     *
     * @return string The unescaped string
     */
    public function unescapeDoubleQuotedString(string $value): string
    {
        $callback = function ($match) {
            return $this->unescapeCharacter($match[0]);
        };

        // evaluate the string
        return preg_replace_callback('/'.self::REGEX_ESCAPED_CHARACTER.'/u', $callback, $value);
    }

    /**
     * Unescapes a character that was found in a double-quoted string.
     *
     * @param string $value An escaped character
     *
     * @return string The unescaped character
     */
    private function unescapeCharacter(string $value): string
    {
        switch ($value[1]) {
            case '0':
                return "\x0";
            case 'a':
                return "\x7";
            case 'b':
                return "\x8";
            case 't':
                return "\t";
            case "\t":
                return "\t";
            case 'n':
                return "\n";
            case 'v':
                return "\xB";
            case 'f':
                return "\xC";
            case 'r':
                return "\r";
            case 'e':
                return "\x1B";
            case ' ':
                return ' ';
            case '"':
                return '"';
            case '/':
                return '/';
            case '\\':
                return '\\';
            case 'N':
                // U+0085 NEXT LINE
                return "\xC2\x85";
            case '_':
                // U+00A0 NO-BREAK SPACE
                return "\xC2\xA0";
            case 'L':
                // U+2028 LINE SEPARATOR
                return "\xE2\x80\xA8";
            case 'P':
                // U+2029 PARAGRAPH SEPARATOR
                return "\xE2\x80\xA9";
            case 'x':
                return self::utf8chr(hexdec(substr($value, 2, 2)));
            case 'u':
                return self::utf8chr(hexdec(substr($value, 2, 4)));
            case 'U':
                return self::utf8chr(hexdec(substr($value, 2, 8)));
            default:
                throw new ParseException(sprintf('Found unknown escape character "%s".', $value));
        }
    }

    /**
     * Get the UTF-8 character for the given code point.
     */
    private static function utf8chr(int $c): string
    {
        if (0x80 > $c %= 0x200000) {
            return \chr($c);
        }
        if (0x800 > $c) {
            return \chr(0xC0 | $c >> 6).\chr(0x80 | $c & 0x3F);
        }
        if (0x10000 > $c) {
            return \chr(0xE0 | $c >> 12).\chr(0x80 | $c >> 6 & 0x3F).\chr(0x80 | $c & 0x3F);
        }

        return \chr(0xF0 | $c >> 18).\chr(0x80 | $c >> 12 & 0x3F).\chr(0x80 | $c >> 6 & 0x3F).\chr(0x80 | $c & 0x3F);
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Yaml;

use Symfony\Component\Yaml\Exception\ParseException;

/**
 * Yaml offers convenience methods to load and dump YAML.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @final
 */
class Yaml
{
    public const DUMP_OBJECT = 1;
    public const PARSE_EXCEPTION_ON_INVALID_TYPE = 2;
    public const PARSE_OBJECT = 4;
    public const PARSE_OBJECT_FOR_MAP = 8;
    public const DUMP_EXCEPTION_ON_INVALID_TYPE = 16;
    public const PARSE_DATETIME = 32;
    public const DUMP_OBJECT_AS_MAP = 64;
    public const DUMP_MULTI_LINE_LITERAL_BLOCK = 128;
    public const PARSE_CONSTANT = 256;
    public const PARSE_CUSTOM_TAGS = 512;
    public const DUMP_EMPTY_ARRAY_AS_SEQUENCE = 1024;
    public const DUMP_NULL_AS_TILDE = 2048;

    /**
     * Parses a YAML file into a PHP value.
     *
     * Usage:
     *
     *     $array = Yaml::parseFile('config.yml');
     *     print_r($array);
     *
     * @param string $filename The path to the YAML file to be parsed
     * @param int    $flags    A bit field of PARSE_* constants to customize the YAML parser behavior
     *
     * @return mixed The YAML converted to a PHP value
     *
     * @throws ParseException If the file could not be read or the YAML is not valid
     */
    public static function parseFile(string $filename, int $flags = 0)
    {
        $yaml = new Parser();

        return $yaml->parseFile($filename, $flags);
    }

    /**
     * Parses YAML into a PHP value.
     *
     *  Usage:
     *  <code>
     *   $array = Yaml::parse(file_get_contents('config.yml'));
     *   print_r($array);
     *  </code>
     *
     * @param string $input A string containing YAML
     * @param int    $flags A bit field of PARSE_* constants to customize the YAML parser behavior
     *
     * @return mixed The YAML converted to a PHP value
     *
     * @throws ParseException If the YAML is not valid
     */
    public static function parse(string $input, int $flags = 0)
    {
        $yaml = new Parser();

        return $yaml->parse($input, $flags);
    }

    /**
     * Dumps a PHP value to a YAML string.
     *
     * The dump method, when supplied with an array, will do its best
     * to convert the array into friendly YAML.
     *
     * @param mixed $input  The PHP value
     * @param int   $inline The level where you switch to inline YAML
     * @param int   $indent The amount of spaces to use for indentation of nested nodes
     * @param int   $flags  A bit field of DUMP_* constants to customize the dumped YAML string
     *
     * @return string A YAML string representing the original PHP value
     */
    public static function dump($input, int $inline = 2, int $indent = 4, int $flags = 0): string
    {
        $yaml = new Dumper($indent);

        return $yaml->dump($input, $inline, 0, $flags);
    }
}
{
    "name": "symfony/yaml",
    "type": "library",
    "description": "Loads and dumps YAML files",
    "keywords": [],
    "homepage": "https://symfony.com",
    "license": "MIT",
    "authors": [
        {
            "name": "Fabien Potencier",
            "email": "fabien@symfony.com"
        },
        {
            "name": "Symfony Community",
            "homepage": "https://symfony.com/contributors"
        }
    ],
    "require": {
        "php": ">=7.1.3",
        "symfony/polyfill-ctype": "~1.8"
    },
    "require-dev": {
        "symfony/console": "^3.4|^4.0|^5.0"
    },
    "conflict": {
        "symfony/console": "<3.4"
    },
    "suggest": {
        "symfony/console": "For validating YAML files using the lint command"
    },
    "autoload": {
        "psr-4": { "Symfony\\Component\\Yaml\\": "" },
        "exclude-from-classmap": [
            "/Tests/"
        ]
    },
    "minimum-stability": "dev"
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Command\CompleteCommand;
use Symfony\Component\Console\Command\DumpCompletionCommand;
use Symfony\Component\Console\Command\HelpCommand;
use Symfony\Component\Console\Command\LazyCommand;
use Symfony\Component\Console\Command\ListCommand;
use Symfony\Component\Console\Command\SignalableCommandInterface;
use Symfony\Component\Console\CommandLoader\CommandLoaderInterface;
use Symfony\Component\Console\Completion\CompletionInput;
use Symfony\Component\Console\Completion\CompletionSuggestions;
use Symfony\Component\Console\Event\ConsoleCommandEvent;
use Symfony\Component\Console\Event\ConsoleErrorEvent;
use Symfony\Component\Console\Event\ConsoleSignalEvent;
use Symfony\Component\Console\Event\ConsoleTerminateEvent;
use Symfony\Component\Console\Exception\CommandNotFoundException;
use Symfony\Component\Console\Exception\ExceptionInterface;
use Symfony\Component\Console\Exception\LogicException;
use Symfony\Component\Console\Exception\NamespaceNotFoundException;
use Symfony\Component\Console\Exception\RuntimeException;
use Symfony\Component\Console\Formatter\OutputFormatter;
use Symfony\Component\Console\Helper\DebugFormatterHelper;
use Symfony\Component\Console\Helper\FormatterHelper;
use Symfony\Component\Console\Helper\Helper;
use Symfony\Component\Console\Helper\HelperSet;
use Symfony\Component\Console\Helper\ProcessHelper;
use Symfony\Component\Console\Helper\QuestionHelper;
use Symfony\Component\Console\Input\ArgvInput;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputAwareInterface;
use Symfony\Component\Console\Input\InputDefinition;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\ConsoleOutput;
use Symfony\Component\Console\Output\ConsoleOutputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\SignalRegistry\SignalRegistry;
use Symfony\Component\Console\Style\SymfonyStyle;
use Symfony\Component\ErrorHandler\ErrorHandler;
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
use Symfony\Contracts\Service\ResetInterface;

/**
 * An Application is the container for a collection of commands.
 *
 * It is the main entry point of a Console application.
 *
 * This class is optimized for a standard CLI environment.
 *
 * Usage:
 *
 *     $app = new Application('myapp', '1.0 (stable)');
 *     $app->add(new SimpleCommand());
 *     $app->run();
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class Application implements ResetInterface
{
    private $commands = [];
    private $wantHelps = false;
    private $runningCommand;
    private $name;
    private $version;
    private $commandLoader;
    private $catchExceptions = true;
    private $autoExit = true;
    private $definition;
    private $helperSet;
    private $dispatcher;
    private $terminal;
    private $defaultCommand;
    private $singleCommand = false;
    private $initialized;
    private $signalRegistry;
    private $signalsToDispatchEvent = [];

    public function __construct(string $name = 'UNKNOWN', string $version = 'UNKNOWN')
    {
        $this->name = $name;
        $this->version = $version;
        $this->terminal = new Terminal();
        $this->defaultCommand = 'list';
        if (\defined('SIGINT') && SignalRegistry::isSupported()) {
            $this->signalRegistry = new SignalRegistry();
            $this->signalsToDispatchEvent = [\SIGINT, \SIGTERM, \SIGUSR1, \SIGUSR2];
        }
    }

    /**
     * @final
     */
    public function setDispatcher(EventDispatcherInterface $dispatcher)
    {
        $this->dispatcher = $dispatcher;
    }

    public function setCommandLoader(CommandLoaderInterface $commandLoader)
    {
        $this->commandLoader = $commandLoader;
    }

    public function getSignalRegistry(): SignalRegistry
    {
        if (!$this->signalRegistry) {
            throw new RuntimeException('Signals are not supported. Make sure that the `pcntl` extension is installed and that "pcntl_*" functions are not disabled by your php.ini\'s "disable_functions" directive.');
        }

        return $this->signalRegistry;
    }

    public function setSignalsToDispatchEvent(int ...$signalsToDispatchEvent)
    {
        $this->signalsToDispatchEvent = $signalsToDispatchEvent;
    }

    /**
     * Runs the current application.
     *
     * @return int 0 if everything went fine, or an error code
     *
     * @throws \Exception When running fails. Bypass this when {@link setCatchExceptions()}.
     */
    public function run(InputInterface $input = null, OutputInterface $output = null)
    {
        if (\function_exists('putenv')) {
            @putenv('LINES='.$this->terminal->getHeight());
            @putenv('COLUMNS='.$this->terminal->getWidth());
        }

        if (null === $input) {
            $input = new ArgvInput();
        }

        if (null === $output) {
            $output = new ConsoleOutput();
        }

        $renderException = function (\Throwable $e) use ($output) {
            if ($output instanceof ConsoleOutputInterface) {
                $this->renderThrowable($e, $output->getErrorOutput());
            } else {
                $this->renderThrowable($e, $output);
            }
        };
        if ($phpHandler = set_exception_handler($renderException)) {
            restore_exception_handler();
            if (!\is_array($phpHandler) || !$phpHandler[0] instanceof ErrorHandler) {
                $errorHandler = true;
            } elseif ($errorHandler = $phpHandler[0]->setExceptionHandler($renderException)) {
                $phpHandler[0]->setExceptionHandler($errorHandler);
            }
        }

        $this->configureIO($input, $output);

        try {
            $exitCode = $this->doRun($input, $output);
        } catch (\Exception $e) {
            if (!$this->catchExceptions) {
                throw $e;
            }

            $renderException($e);

            $exitCode = $e->getCode();
            if (is_numeric($exitCode)) {
                $exitCode = (int) $exitCode;
                if ($exitCode <= 0) {
                    $exitCode = 1;
                }
            } else {
                $exitCode = 1;
            }
        } finally {
            // if the exception handler changed, keep it
            // otherwise, unregister $renderException
            if (!$phpHandler) {
                if (set_exception_handler($renderException) === $renderException) {
                    restore_exception_handler();
                }
                restore_exception_handler();
            } elseif (!$errorHandler) {
                $finalHandler = $phpHandler[0]->setExceptionHandler(null);
                if ($finalHandler !== $renderException) {
                    $phpHandler[0]->setExceptionHandler($finalHandler);
                }
            }
        }

        if ($this->autoExit) {
            if ($exitCode > 255) {
                $exitCode = 255;
            }

            exit($exitCode);
        }

        return $exitCode;
    }

    /**
     * Runs the current application.
     *
     * @return int 0 if everything went fine, or an error code
     */
    public function doRun(InputInterface $input, OutputInterface $output)
    {
        if (true === $input->hasParameterOption(['--version', '-V'], true)) {
            $output->writeln($this->getLongVersion());

            return 0;
        }

        try {
            // Makes ArgvInput::getFirstArgument() able to distinguish an option from an argument.
            $input->bind($this->getDefinition());
        } catch (ExceptionInterface $e) {
            // Errors must be ignored, full binding/validation happens later when the command is known.
        }

        $name = $this->getCommandName($input);
        if (true === $input->hasParameterOption(['--help', '-h'], true)) {
            if (!$name) {
                $name = 'help';
                $input = new ArrayInput(['command_name' => $this->defaultCommand]);
            } else {
                $this->wantHelps = true;
            }
        }

        if (!$name) {
            $name = $this->defaultCommand;
            $definition = $this->getDefinition();
            $definition->setArguments(array_merge(
                $definition->getArguments(),
                [
                    'command' => new InputArgument('command', InputArgument::OPTIONAL, $definition->getArgument('command')->getDescription(), $name),
                ]
            ));
        }

        try {
            $this->runningCommand = null;
            // the command name MUST be the first element of the input
            $command = $this->find($name);
        } catch (\Throwable $e) {
            if (!($e instanceof CommandNotFoundException && !$e instanceof NamespaceNotFoundException) || 1 !== \count($alternatives = $e->getAlternatives()) || !$input->isInteractive()) {
                if (null !== $this->dispatcher) {
                    $event = new ConsoleErrorEvent($input, $output, $e);
                    $this->dispatcher->dispatch($event, ConsoleEvents::ERROR);

                    if (0 === $event->getExitCode()) {
                        return 0;
                    }

                    $e = $event->getError();
                }

                throw $e;
            }

            $alternative = $alternatives[0];

            $style = new SymfonyStyle($input, $output);
            $output->writeln('');
            $formattedBlock = (new FormatterHelper())->formatBlock(sprintf('Command "%s" is not defined.', $name), 'error', true);
            $output->writeln($formattedBlock);
            if (!$style->confirm(sprintf('Do you want to run "%s" instead? ', $alternative), false)) {
                if (null !== $this->dispatcher) {
                    $event = new ConsoleErrorEvent($input, $output, $e);
                    $this->dispatcher->dispatch($event, ConsoleEvents::ERROR);

                    return $event->getExitCode();
                }

                return 1;
            }

            $command = $this->find($alternative);
        }

        if ($command instanceof LazyCommand) {
            $command = $command->getCommand();
        }

        $this->runningCommand = $command;
        $exitCode = $this->doRunCommand($command, $input, $output);
        $this->runningCommand = null;

        return $exitCode;
    }

    /**
     * {@inheritdoc}
     */
    public function reset()
    {
    }

    public function setHelperSet(HelperSet $helperSet)
    {
        $this->helperSet = $helperSet;
    }

    /**
     * Get the helper set associated with the command.
     *
     * @return HelperSet
     */
    public function getHelperSet()
    {
        if (!$this->helperSet) {
            $this->helperSet = $this->getDefaultHelperSet();
        }

        return $this->helperSet;
    }

    public function setDefinition(InputDefinition $definition)
    {
        $this->definition = $definition;
    }

    /**
     * Gets the InputDefinition related to this Application.
     *
     * @return InputDefinition
     */
    public function getDefinition()
    {
        if (!$this->definition) {
            $this->definition = $this->getDefaultInputDefinition();
        }

        if ($this->singleCommand) {
            $inputDefinition = $this->definition;
            $inputDefinition->setArguments();

            return $inputDefinition;
        }

        return $this->definition;
    }

    /**
     * Adds suggestions to $suggestions for the current completion input (e.g. option or argument).
     */
    public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void
    {
        if (
            CompletionInput::TYPE_ARGUMENT_VALUE === $input->getCompletionType()
            && 'command' === $input->getCompletionName()
        ) {
            $commandNames = [];
            foreach ($this->all() as $name => $command) {
                // skip hidden commands and aliased commands as they already get added below
                if ($command->isHidden() || $command->getName() !== $name) {
                    continue;
                }
                $commandNames[] = $command->getName();
                foreach ($command->getAliases() as $name) {
                    $commandNames[] = $name;
                }
            }
            $suggestions->suggestValues(array_filter($commandNames));

            return;
        }

        if (CompletionInput::TYPE_OPTION_NAME === $input->getCompletionType()) {
            $suggestions->suggestOptions($this->getDefinition()->getOptions());

            return;
        }
    }

    /**
     * Gets the help message.
     *
     * @return string
     */
    public function getHelp()
    {
        return $this->getLongVersion();
    }

    /**
     * Gets whether to catch exceptions or not during commands execution.
     *
     * @return bool
     */
    public function areExceptionsCaught()
    {
        return $this->catchExceptions;
    }

    /**
     * Sets whether to catch exceptions or not during commands execution.
     */
    public function setCatchExceptions(bool $boolean)
    {
        $this->catchExceptions = $boolean;
    }

    /**
     * Gets whether to automatically exit after a command execution or not.
     *
     * @return bool
     */
    public function isAutoExitEnabled()
    {
        return $this->autoExit;
    }

    /**
     * Sets whether to automatically exit after a command execution or not.
     */
    public function setAutoExit(bool $boolean)
    {
        $this->autoExit = $boolean;
    }

    /**
     * Gets the name of the application.
     *
     * @return string
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * Sets the application name.
     **/
    public function setName(string $name)
    {
        $this->name = $name;
    }

    /**
     * Gets the application version.
     *
     * @return string
     */
    public function getVersion()
    {
        return $this->version;
    }

    /**
     * Sets the application version.
     */
    public function setVersion(string $version)
    {
        $this->version = $version;
    }

    /**
     * Returns the long version of the application.
     *
     * @return string
     */
    public function getLongVersion()
    {
        if ('UNKNOWN' !== $this->getName()) {
            if ('UNKNOWN' !== $this->getVersion()) {
                return sprintf('%s <info>%s</info>', $this->getName(), $this->getVersion());
            }

            return $this->getName();
        }

        return 'Console Tool';
    }

    /**
     * Registers a new command.
     *
     * @return Command
     */
    public function register(string $name)
    {
        return $this->add(new Command($name));
    }

    /**
     * Adds an array of command objects.
     *
     * If a Command is not enabled it will not be added.
     *
     * @param Command[] $commands An array of commands
     */
    public function addCommands(array $commands)
    {
        foreach ($commands as $command) {
            $this->add($command);
        }
    }

    /**
     * Adds a command object.
     *
     * If a command with the same name already exists, it will be overridden.
     * If the command is not enabled it will not be added.
     *
     * @return Command|null
     */
    public function add(Command $command)
    {
        $this->init();

        $command->setApplication($this);

        if (!$command->isEnabled()) {
            $command->setApplication(null);

            return null;
        }

        if (!$command instanceof LazyCommand) {
            // Will throw if the command is not correctly initialized.
            $command->getDefinition();
        }

        if (!$command->getName()) {
            throw new LogicException(sprintf('The command defined in "%s" cannot have an empty name.', get_debug_type($command)));
        }

        $this->commands[$command->getName()] = $command;

        foreach ($command->getAliases() as $alias) {
            $this->commands[$alias] = $command;
        }

        return $command;
    }

    /**
     * Returns a registered command by name or alias.
     *
     * @return Command
     *
     * @throws CommandNotFoundException When given command name does not exist
     */
    public function get(string $name)
    {
        $this->init();

        if (!$this->has($name)) {
            throw new CommandNotFoundException(sprintf('The command "%s" does not exist.', $name));
        }

        // When the command has a different name than the one used at the command loader level
        if (!isset($this->commands[$name])) {
            throw new CommandNotFoundException(sprintf('The "%s" command cannot be found because it is registered under multiple names. Make sure you don\'t set a different name via constructor or "setName()".', $name));
        }

        $command = $this->commands[$name];

        if ($this->wantHelps) {
            $this->wantHelps = false;

            $helpCommand = $this->get('help');
            $helpCommand->setCommand($command);

            return $helpCommand;
        }

        return $command;
    }

    /**
     * Returns true if the command exists, false otherwise.
     *
     * @return bool
     */
    public function has(string $name)
    {
        $this->init();

        return isset($this->commands[$name]) || ($this->commandLoader && $this->commandLoader->has($name) && $this->add($this->commandLoader->get($name)));
    }

    /**
     * Returns an array of all unique namespaces used by currently registered commands.
     *
     * It does not return the global namespace which always exists.
     *
     * @return string[]
     */
    public function getNamespaces()
    {
        $namespaces = [];
        foreach ($this->all() as $command) {
            if ($command->isHidden()) {
                continue;
            }

            $namespaces[] = $this->extractAllNamespaces($command->getName());

            foreach ($command->getAliases() as $alias) {
                $namespaces[] = $this->extractAllNamespaces($alias);
            }
        }

        return array_values(array_unique(array_filter(array_merge([], ...$namespaces))));
    }

    /**
     * Finds a registered namespace by a name or an abbreviation.
     *
     * @return string
     *
     * @throws NamespaceNotFoundException When namespace is incorrect or ambiguous
     */
    public function findNamespace(string $namespace)
    {
        $allNamespaces = $this->getNamespaces();
        $expr = implode('[^:]*:', array_map('preg_quote', explode(':', $namespace))).'[^:]*';
        $namespaces = preg_grep('{^'.$expr.'}', $allNamespaces);

        if (empty($namespaces)) {
            $message = sprintf('There are no commands defined in the "%s" namespace.', $namespace);

            if ($alternatives = $this->findAlternatives($namespace, $allNamespaces)) {
                if (1 == \count($alternatives)) {
                    $message .= "\n\nDid you mean this?\n    ";
                } else {
                    $message .= "\n\nDid you mean one of these?\n    ";
                }

                $message .= implode("\n    ", $alternatives);
            }

            throw new NamespaceNotFoundException($message, $alternatives);
        }

        $exact = \in_array($namespace, $namespaces, true);
        if (\count($namespaces) > 1 && !$exact) {
            throw new NamespaceNotFoundException(sprintf("The namespace \"%s\" is ambiguous.\nDid you mean one of these?\n%s.", $namespace, $this->getAbbreviationSuggestions(array_values($namespaces))), array_values($namespaces));
        }

        return $exact ? $namespace : reset($namespaces);
    }

    /**
     * Finds a command by name or alias.
     *
     * Contrary to get, this command tries to find the best
     * match if you give it an abbreviation of a name or alias.
     *
     * @return Command
     *
     * @throws CommandNotFoundException When command name is incorrect or ambiguous
     */
    public function find(string $name)
    {
        $this->init();

        $aliases = [];

        foreach ($this->commands as $command) {
            foreach ($command->getAliases() as $alias) {
                if (!$this->has($alias)) {
                    $this->commands[$alias] = $command;
                }
            }
        }

        if ($this->has($name)) {
            return $this->get($name);
        }

        $allCommands = $this->commandLoader ? array_merge($this->commandLoader->getNames(), array_keys($this->commands)) : array_keys($this->commands);
        $expr = implode('[^:]*:', array_map('preg_quote', explode(':', $name))).'[^:]*';
        $commands = preg_grep('{^'.$expr.'}', $allCommands);

        if (empty($commands)) {
            $commands = preg_grep('{^'.$expr.'}i', $allCommands);
        }

        // if no commands matched or we just matched namespaces
        if (empty($commands) || \count(preg_grep('{^'.$expr.'$}i', $commands)) < 1) {
            if (false !== $pos = strrpos($name, ':')) {
                // check if a namespace exists and contains commands
                $this->findNamespace(substr($name, 0, $pos));
            }

            $message = sprintf('Command "%s" is not defined.', $name);

            if ($alternatives = $this->findAlternatives($name, $allCommands)) {
                // remove hidden commands
                $alternatives = array_filter($alternatives, function ($name) {
                    return !$this->get($name)->isHidden();
                });

                if (1 == \count($alternatives)) {
                    $message .= "\n\nDid you mean this?\n    ";
                } else {
                    $message .= "\n\nDid you mean one of these?\n    ";
                }
                $message .= implode("\n    ", $alternatives);
            }

            throw new CommandNotFoundException($message, array_values($alternatives));
        }

        // filter out aliases for commands which are already on the list
        if (\count($commands) > 1) {
            $commandList = $this->commandLoader ? array_merge(array_flip($this->commandLoader->getNames()), $this->commands) : $this->commands;
            $commands = array_unique(array_filter($commands, function ($nameOrAlias) use (&$commandList, $commands, &$aliases) {
                if (!$commandList[$nameOrAlias] instanceof Command) {
                    $commandList[$nameOrAlias] = $this->commandLoader->get($nameOrAlias);
                }

                $commandName = $commandList[$nameOrAlias]->getName();

                $aliases[$nameOrAlias] = $commandName;

                return $commandName === $nameOrAlias || !\in_array($commandName, $commands);
            }));
        }

        if (\count($commands) > 1) {
            $usableWidth = $this->terminal->getWidth() - 10;
            $abbrevs = array_values($commands);
            $maxLen = 0;
            foreach ($abbrevs as $abbrev) {
                $maxLen = max(Helper::width($abbrev), $maxLen);
            }
            $abbrevs = array_map(function ($cmd) use ($commandList, $usableWidth, $maxLen, &$commands) {
                if ($commandList[$cmd]->isHidden()) {
                    unset($commands[array_search($cmd, $commands)]);

                    return false;
                }

                $abbrev = str_pad($cmd, $maxLen, ' ').' '.$commandList[$cmd]->getDescription();

                return Helper::width($abbrev) > $usableWidth ? Helper::substr($abbrev, 0, $usableWidth - 3).'...' : $abbrev;
            }, array_values($commands));

            if (\count($commands) > 1) {
                $suggestions = $this->getAbbreviationSuggestions(array_filter($abbrevs));

                throw new CommandNotFoundException(sprintf("Command \"%s\" is ambiguous.\nDid you mean one of these?\n%s.", $name, $suggestions), array_values($commands));
            }
        }

        $command = $this->get(reset($commands));

        if ($command->isHidden()) {
            throw new CommandNotFoundException(sprintf('The command "%s" does not exist.', $name));
        }

        return $command;
    }

    /**
     * Gets the commands (registered in the given namespace if provided).
     *
     * The array keys are the full names and the values the command instances.
     *
     * @return Command[]
     */
    public function all(string $namespace = null)
    {
        $this->init();

        if (null === $namespace) {
            if (!$this->commandLoader) {
                return $this->commands;
            }

            $commands = $this->commands;
            foreach ($this->commandLoader->getNames() as $name) {
                if (!isset($commands[$name]) && $this->has($name)) {
                    $commands[$name] = $this->get($name);
                }
            }

            return $commands;
        }

        $commands = [];
        foreach ($this->commands as $name => $command) {
            if ($namespace === $this->extractNamespace($name, substr_count($namespace, ':') + 1)) {
                $commands[$name] = $command;
            }
        }

        if ($this->commandLoader) {
            foreach ($this->commandLoader->getNames() as $name) {
                if (!isset($commands[$name]) && $namespace === $this->extractNamespace($name, substr_count($namespace, ':') + 1) && $this->has($name)) {
                    $commands[$name] = $this->get($name);
                }
            }
        }

        return $commands;
    }

    /**
     * Returns an array of possible abbreviations given a set of names.
     *
     * @return string[][]
     */
    public static function getAbbreviations(array $names)
    {
        $abbrevs = [];
        foreach ($names as $name) {
            for ($len = \strlen($name); $len > 0; --$len) {
                $abbrev = substr($name, 0, $len);
                $abbrevs[$abbrev][] = $name;
            }
        }

        return $abbrevs;
    }

    public function renderThrowable(\Throwable $e, OutputInterface $output): void
    {
        $output->writeln('', OutputInterface::VERBOSITY_QUIET);

        $this->doRenderThrowable($e, $output);

        if (null !== $this->runningCommand) {
            $output->writeln(sprintf('<info>%s</info>', OutputFormatter::escape(sprintf($this->runningCommand->getSynopsis(), $this->getName()))), OutputInterface::VERBOSITY_QUIET);
            $output->writeln('', OutputInterface::VERBOSITY_QUIET);
        }
    }

    protected function doRenderThrowable(\Throwable $e, OutputInterface $output): void
    {
        do {
            $message = trim($e->getMessage());
            if ('' === $message || OutputInterface::VERBOSITY_VERBOSE <= $output->getVerbosity()) {
                $class = get_debug_type($e);
                $title = sprintf('  [%s%s]  ', $class, 0 !== ($code = $e->getCode()) ? ' ('.$code.')' : '');
                $len = Helper::width($title);
            } else {
                $len = 0;
            }

            if (str_contains($message, "@anonymous\0")) {
                $message = preg_replace_callback('/[a-zA-Z_\x7f-\xff][\\\\a-zA-Z0-9_\x7f-\xff]*+@anonymous\x00.*?\.php(?:0x?|:[0-9]++\$)[0-9a-fA-F]++/', function ($m) {
                    return class_exists($m[0], false) ? (get_parent_class($m[0]) ?: key(class_implements($m[0])) ?: 'class').'@anonymous' : $m[0];
                }, $message);
            }

            $width = $this->terminal->getWidth() ? $this->terminal->getWidth() - 1 : \PHP_INT_MAX;
            $lines = [];
            foreach ('' !== $message ? preg_split('/\r?\n/', $message) : [] as $line) {
                foreach ($this->splitStringByWidth($line, $width - 4) as $line) {
                    // pre-format lines to get the right string length
                    $lineLength = Helper::width($line) + 4;
                    $lines[] = [$line, $lineLength];

                    $len = max($lineLength, $len);
                }
            }

            $messages = [];
            if (!$e instanceof ExceptionInterface || OutputInterface::VERBOSITY_VERBOSE <= $output->getVerbosity()) {
                $messages[] = sprintf('<comment>%s</comment>', OutputFormatter::escape(sprintf('In %s line %s:', basename($e->getFile()) ?: 'n/a', $e->getLine() ?: 'n/a')));
            }
            $messages[] = $emptyLine = sprintf('<error>%s</error>', str_repeat(' ', $len));
            if ('' === $message || OutputInterface::VERBOSITY_VERBOSE <= $output->getVerbosity()) {
                $messages[] = sprintf('<error>%s%s</error>', $title, str_repeat(' ', max(0, $len - Helper::width($title))));
            }
            foreach ($lines as $line) {
                $messages[] = sprintf('<error>  %s  %s</error>', OutputFormatter::escape($line[0]), str_repeat(' ', $len - $line[1]));
            }
            $messages[] = $emptyLine;
            $messages[] = '';

            $output->writeln($messages, OutputInterface::VERBOSITY_QUIET);

            if (OutputInterface::VERBOSITY_VERBOSE <= $output->getVerbosity()) {
                $output->writeln('<comment>Exception trace:</comment>', OutputInterface::VERBOSITY_QUIET);

                // exception related properties
                $trace = $e->getTrace();

                array_unshift($trace, [
                    'function' => '',
                    'file' => $e->getFile() ?: 'n/a',
                    'line' => $e->getLine() ?: 'n/a',
                    'args' => [],
                ]);

                for ($i = 0, $count = \count($trace); $i < $count; ++$i) {
                    $class = $trace[$i]['class'] ?? '';
                    $type = $trace[$i]['type'] ?? '';
                    $function = $trace[$i]['function'] ?? '';
                    $file = $trace[$i]['file'] ?? 'n/a';
                    $line = $trace[$i]['line'] ?? 'n/a';

                    $output->writeln(sprintf(' %s%s at <info>%s:%s</info>', $class, $function ? $type.$function.'()' : '', $file, $line), OutputInterface::VERBOSITY_QUIET);
                }

                $output->writeln('', OutputInterface::VERBOSITY_QUIET);
            }
        } while ($e = $e->getPrevious());
    }

    /**
     * Configures the input and output instances based on the user arguments and options.
     */
    protected function configureIO(InputInterface $input, OutputInterface $output)
    {
        if (true === $input->hasParameterOption(['--ansi'], true)) {
            $output->setDecorated(true);
        } elseif (true === $input->hasParameterOption(['--no-ansi'], true)) {
            $output->setDecorated(false);
        }

        if (true === $input->hasParameterOption(['--no-interaction', '-n'], true)) {
            $input->setInteractive(false);
        }

        switch ($shellVerbosity = (int) getenv('SHELL_VERBOSITY')) {
            case -1:
                $output->setVerbosity(OutputInterface::VERBOSITY_QUIET);
                break;
            case 1:
                $output->setVerbosity(OutputInterface::VERBOSITY_VERBOSE);
                break;
            case 2:
                $output->setVerbosity(OutputInterface::VERBOSITY_VERY_VERBOSE);
                break;
            case 3:
                $output->setVerbosity(OutputInterface::VERBOSITY_DEBUG);
                break;
            default:
                $shellVerbosity = 0;
                break;
        }

        if (true === $input->hasParameterOption(['--quiet', '-q'], true)) {
            $output->setVerbosity(OutputInterface::VERBOSITY_QUIET);
            $shellVerbosity = -1;
        } else {
            if ($input->hasParameterOption('-vvv', true) || $input->hasParameterOption('--verbose=3', true) || 3 === $input->getParameterOption('--verbose', false, true)) {
                $output->setVerbosity(OutputInterface::VERBOSITY_DEBUG);
                $shellVerbosity = 3;
            } elseif ($input->hasParameterOption('-vv', true) || $input->hasParameterOption('--verbose=2', true) || 2 === $input->getParameterOption('--verbose', false, true)) {
                $output->setVerbosity(OutputInterface::VERBOSITY_VERY_VERBOSE);
                $shellVerbosity = 2;
            } elseif ($input->hasParameterOption('-v', true) || $input->hasParameterOption('--verbose=1', true) || $input->hasParameterOption('--verbose', true) || $input->getParameterOption('--verbose', false, true)) {
                $output->setVerbosity(OutputInterface::VERBOSITY_VERBOSE);
                $shellVerbosity = 1;
            }
        }

        if (-1 === $shellVerbosity) {
            $input->setInteractive(false);
        }

        if (\function_exists('putenv')) {
            @putenv('SHELL_VERBOSITY='.$shellVerbosity);
        }
        $_ENV['SHELL_VERBOSITY'] = $shellVerbosity;
        $_SERVER['SHELL_VERBOSITY'] = $shellVerbosity;
    }

    /**
     * Runs the current command.
     *
     * If an event dispatcher has been attached to the application,
     * events are also dispatched during the life-cycle of the command.
     *
     * @return int 0 if everything went fine, or an error code
     */
    protected function doRunCommand(Command $command, InputInterface $input, OutputInterface $output)
    {
        foreach ($command->getHelperSet() as $helper) {
            if ($helper instanceof InputAwareInterface) {
                $helper->setInput($input);
            }
        }

        if ($this->signalsToDispatchEvent) {
            $commandSignals = $command instanceof SignalableCommandInterface ? $command->getSubscribedSignals() : [];

            if ($commandSignals || null !== $this->dispatcher) {
                if (!$this->signalRegistry) {
                    throw new RuntimeException('Unable to subscribe to signal events. Make sure that the `pcntl` extension is installed and that "pcntl_*" functions are not disabled by your php.ini\'s "disable_functions" directive.');
                }

                if (Terminal::hasSttyAvailable()) {
                    $sttyMode = shell_exec('stty -g');

                    foreach ([\SIGINT, \SIGTERM] as $signal) {
                        $this->signalRegistry->register($signal, static function () use ($sttyMode) {
                            shell_exec('stty '.$sttyMode);
                        });
                    }
                }
            }

            if (null !== $this->dispatcher) {
                foreach ($this->signalsToDispatchEvent as $signal) {
                    $event = new ConsoleSignalEvent($command, $input, $output, $signal);

                    $this->signalRegistry->register($signal, function ($signal, $hasNext) use ($event) {
                        $this->dispatcher->dispatch($event, ConsoleEvents::SIGNAL);

                        // No more handlers, we try to simulate PHP default behavior
                        if (!$hasNext) {
                            if (!\in_array($signal, [\SIGUSR1, \SIGUSR2], true)) {
                                exit(0);
                            }
                        }
                    });
                }
            }

            foreach ($commandSignals as $signal) {
                $this->signalRegistry->register($signal, [$command, 'handleSignal']);
            }
        }

        if (null === $this->dispatcher) {
            return $command->run($input, $output);
        }

        // bind before the console.command event, so the listeners have access to input options/arguments
        try {
            $command->mergeApplicationDefinition();
            $input->bind($command->getDefinition());
        } catch (ExceptionInterface $e) {
            // ignore invalid options/arguments for now, to allow the event listeners to customize the InputDefinition
        }

        $event = new ConsoleCommandEvent($command, $input, $output);
        $e = null;

        try {
            $this->dispatcher->dispatch($event, ConsoleEvents::COMMAND);

            if ($event->commandShouldRun()) {
                $exitCode = $command->run($input, $output);
            } else {
                $exitCode = ConsoleCommandEvent::RETURN_CODE_DISABLED;
            }
        } catch (\Throwable $e) {
            $event = new ConsoleErrorEvent($input, $output, $e, $command);
            $this->dispatcher->dispatch($event, ConsoleEvents::ERROR);
            $e = $event->getError();

            if (0 === $exitCode = $event->getExitCode()) {
                $e = null;
            }
        }

        $event = new ConsoleTerminateEvent($command, $input, $output, $exitCode);
        $this->dispatcher->dispatch($event, ConsoleEvents::TERMINATE);

        if (null !== $e) {
            throw $e;
        }

        return $event->getExitCode();
    }

    /**
     * Gets the name of the command based on input.
     *
     * @return string|null
     */
    protected function getCommandName(InputInterface $input)
    {
        return $this->singleCommand ? $this->defaultCommand : $input->getFirstArgument();
    }

    /**
     * Gets the default input definition.
     *
     * @return InputDefinition
     */
    protected function getDefaultInputDefinition()
    {
        return new InputDefinition([
            new InputArgument('command', InputArgument::REQUIRED, 'The command to execute'),
            new InputOption('--help', '-h', InputOption::VALUE_NONE, 'Display help for the given command. When no command is given display help for the <info>'.$this->defaultCommand.'</info> command'),
            new InputOption('--quiet', '-q', InputOption::VALUE_NONE, 'Do not output any message'),
            new InputOption('--verbose', '-v|vv|vvv', InputOption::VALUE_NONE, 'Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug'),
            new InputOption('--version', '-V', InputOption::VALUE_NONE, 'Display this application version'),
            new InputOption('--ansi', '', InputOption::VALUE_NEGATABLE, 'Force (or disable --no-ansi) ANSI output', null),
            new InputOption('--no-interaction', '-n', InputOption::VALUE_NONE, 'Do not ask any interactive question'),
        ]);
    }

    /**
     * Gets the default commands that should always be available.
     *
     * @return Command[]
     */
    protected function getDefaultCommands()
    {
        return [new HelpCommand(), new ListCommand(), new CompleteCommand(), new DumpCompletionCommand()];
    }

    /**
     * Gets the default helper set with the helpers that should always be available.
     *
     * @return HelperSet
     */
    protected function getDefaultHelperSet()
    {
        return new HelperSet([
            new FormatterHelper(),
            new DebugFormatterHelper(),
            new ProcessHelper(),
            new QuestionHelper(),
        ]);
    }

    /**
     * Returns abbreviated suggestions in string format.
     */
    private function getAbbreviationSuggestions(array $abbrevs): string
    {
        return '    '.implode("\n    ", $abbrevs);
    }

    /**
     * Returns the namespace part of the command name.
     *
     * This method is not part of public API and should not be used directly.
     *
     * @return string
     */
    public function extractNamespace(string $name, int $limit = null)
    {
        $parts = explode(':', $name, -1);

        return implode(':', null === $limit ? $parts : \array_slice($parts, 0, $limit));
    }

    /**
     * Finds alternative of $name among $collection,
     * if nothing is found in $collection, try in $abbrevs.
     *
     * @return string[]
     */
    private function findAlternatives(string $name, iterable $collection): array
    {
        $threshold = 1e3;
        $alternatives = [];

        $collectionParts = [];
        foreach ($collection as $item) {
            $collectionParts[$item] = explode(':', $item);
        }

        foreach (explode(':', $name) as $i => $subname) {
            foreach ($collectionParts as $collectionName => $parts) {
                $exists = isset($alternatives[$collectionName]);
                if (!isset($parts[$i]) && $exists) {
                    $alternatives[$collectionName] += $threshold;
                    continue;
                } elseif (!isset($parts[$i])) {
                    continue;
                }

                $lev = levenshtein($subname, $parts[$i]);
                if ($lev <= \strlen($subname) / 3 || '' !== $subname && str_contains($parts[$i], $subname)) {
                    $alternatives[$collectionName] = $exists ? $alternatives[$collectionName] + $lev : $lev;
                } elseif ($exists) {
                    $alternatives[$collectionName] += $threshold;
                }
            }
        }

        foreach ($collection as $item) {
            $lev = levenshtein($name, $item);
            if ($lev <= \strlen($name) / 3 || str_contains($item, $name)) {
                $alternatives[$item] = isset($alternatives[$item]) ? $alternatives[$item] - $lev : $lev;
            }
        }

        $alternatives = array_filter($alternatives, function ($lev) use ($threshold) { return $lev < 2 * $threshold; });
        ksort($alternatives, \SORT_NATURAL | \SORT_FLAG_CASE);

        return array_keys($alternatives);
    }

    /**
     * Sets the default Command name.
     *
     * @return $this
     */
    public function setDefaultCommand(string $commandName, bool $isSingleCommand = false)
    {
        $this->defaultCommand = explode('|', ltrim($commandName, '|'))[0];

        if ($isSingleCommand) {
            // Ensure the command exist
            $this->find($commandName);

            $this->singleCommand = true;
        }

        return $this;
    }

    /**
     * @internal
     */
    public function isSingleCommand(): bool
    {
        return $this->singleCommand;
    }

    private function splitStringByWidth(string $string, int $width): array
    {
        // str_split is not suitable for multi-byte characters, we should use preg_split to get char array properly.
        // additionally, array_slice() is not enough as some character has doubled width.
        // we need a function to split string not by character count but by string width
        if (false === $encoding = mb_detect_encoding($string, null, true)) {
            return str_split($string, $width);
        }

        $utf8String = mb_convert_encoding($string, 'utf8', $encoding);
        $lines = [];
        $line = '';

        $offset = 0;
        while (preg_match('/.{1,10000}/u', $utf8String, $m, 0, $offset)) {
            $offset += \strlen($m[0]);

            foreach (preg_split('//u', $m[0]) as $char) {
                // test if $char could be appended to current line
                if (mb_strwidth($line.$char, 'utf8') <= $width) {
                    $line .= $char;
                    continue;
                }
                // if not, push current line to array and make new line
                $lines[] = str_pad($line, $width);
                $line = $char;
            }
        }

        $lines[] = \count($lines) ? str_pad($line, $width) : $line;

        mb_convert_variables($encoding, 'utf8', $lines);

        return $lines;
    }

    /**
     * Returns all namespaces of the command name.
     *
     * @return string[]
     */
    private function extractAllNamespaces(string $name): array
    {
        // -1 as third argument is needed to skip the command short name when exploding
        $parts = explode(':', $name, -1);
        $namespaces = [];

        foreach ($parts as $part) {
            if (\count($namespaces)) {
                $namespaces[] = end($namespaces).':'.$part;
            } else {
                $namespaces[] = $part;
            }
        }

        return $namespaces;
    }

    private function init()
    {
        if ($this->initialized) {
            return;
        }
        $this->initialized = true;

        foreach ($this->getDefaultCommands() as $command) {
            $this->add($command);
        }
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Attribute;

/**
 * Service tag to autoconfigure commands.
 */
#[\Attribute(\Attribute::TARGET_CLASS)]
class AsCommand
{
    public function __construct(
        public string $name,
        public ?string $description = null,
        array $aliases = [],
        bool $hidden = false,
    ) {
        if (!$hidden && !$aliases) {
            return;
        }

        $name = explode('|', $name);
        $name = array_merge($name, $aliases);

        if ($hidden && '' !== $name[0]) {
            array_unshift($name, '');
        }

        $this->name = implode('|', $name);
    }
}
CHANGELOG
=========

5.4
---

 * Add `TesterTrait::assertCommandIsSuccessful()` to test command
 * Deprecate `HelperSet::setCommand()` and `getCommand()` without replacement

5.3
---

 * Add `GithubActionReporter` to render annotations in a Github Action
 * Add `InputOption::VALUE_NEGATABLE` flag to handle `--foo`/`--no-foo` options
 * Add the `Command::$defaultDescription` static property and the `description` attribute
   on the `console.command` tag to allow the `list` command to instantiate commands lazily
 * Add option `--short` to the `list` command
 * Add support for bright colors
 * Add `#[AsCommand]` attribute for declaring commands on PHP 8
 * Add `Helper::width()` and `Helper::length()`
 * The `--ansi` and `--no-ansi` options now default to `null`.

5.2.0
-----

 * Added `SingleCommandApplication::setAutoExit()` to allow testing via `CommandTester`
 * added support for multiline responses to questions through `Question::setMultiline()`
   and `Question::isMultiline()`
 * Added `SignalRegistry` class to stack signals handlers
 * Added support for signals:
    * Added `Application::getSignalRegistry()` and `Application::setSignalsToDispatchEvent()` methods
    * Added `SignalableCommandInterface` interface
 * Added `TableCellStyle` class to customize table cell
 * Removed `php ` prefix invocation from help messages.

5.1.0
-----

 * `Command::setHidden()` is final since Symfony 5.1
 * Add `SingleCommandApplication`
 * Add `Cursor` class

5.0.0
-----

 * removed support for finding hidden commands using an abbreviation, use the full name instead
 * removed `TableStyle::setCrossingChar()` method in favor of `TableStyle::setDefaultCrossingChar()`
 * removed `TableStyle::setHorizontalBorderChar()` method in favor of `TableStyle::setDefaultCrossingChars()`
 * removed `TableStyle::getHorizontalBorderChar()` method in favor of `TableStyle::getBorderChars()`
 * removed `TableStyle::setVerticalBorderChar()` method in favor of `TableStyle::setVerticalBorderChars()`
 * removed `TableStyle::getVerticalBorderChar()` method in favor of `TableStyle::getBorderChars()`
 * removed support for returning `null` from `Command::execute()`, return `0` instead
 * `ProcessHelper::run()` accepts only `array|Symfony\Component\Process\Process` for its `command` argument
 * `Application::setDispatcher` accepts only `Symfony\Contracts\EventDispatcher\EventDispatcherInterface`
   for its `dispatcher` argument
 * renamed `Application::renderException()` and `Application::doRenderException()`
   to `renderThrowable()` and `doRenderThrowable()` respectively.

4.4.0
-----

 * deprecated finding hidden commands using an abbreviation, use the full name instead
 * added `Question::setTrimmable` default to true to allow the answer to be trimmed
 * added method `minSecondsBetweenRedraws()` and `maxSecondsBetweenRedraws()` on `ProgressBar`
 * `Application` implements `ResetInterface`
 * marked all dispatched event classes as `@final`
 * added support for displaying table horizontally
 * deprecated returning `null` from `Command::execute()`, return `0` instead
 * Deprecated the `Application::renderException()` and `Application::doRenderException()` methods,
   use `renderThrowable()` and `doRenderThrowable()` instead.
 * added support for the `NO_COLOR` env var (https://no-color.org/)

4.3.0
-----

 * added support for hyperlinks
 * added `ProgressBar::iterate()` method that simplify updating the progress bar when iterating
 * added `Question::setAutocompleterCallback()` to provide a callback function
   that dynamically generates suggestions as the user types

4.2.0
-----

 * allowed passing commands as `[$process, 'ENV_VAR' => 'value']` to
   `ProcessHelper::run()` to pass environment variables
 * deprecated passing a command as a string to `ProcessHelper::run()`,
   pass it the command as an array of its arguments instead
 * made the `ProcessHelper` class final
 * added `WrappableOutputFormatterInterface::formatAndWrap()` (implemented in `OutputFormatter`)
 * added `capture_stderr_separately` option to `CommandTester::execute()`

4.1.0
-----

 * added option to run suggested command if command is not found and only 1 alternative is available
 * added option to modify console output and print multiple modifiable sections
 * added support for iterable messages in output `write` and `writeln` methods

4.0.0
-----

 * `OutputFormatter` throws an exception when unknown options are used
 * removed `QuestionHelper::setInputStream()/getInputStream()`
 * removed `Application::getTerminalWidth()/getTerminalHeight()` and
   `Application::setTerminalDimensions()/getTerminalDimensions()`
 * removed `ConsoleExceptionEvent`
 * removed `ConsoleEvents::EXCEPTION`

3.4.0
-----

 * added `SHELL_VERBOSITY` env var to control verbosity
 * added `CommandLoaderInterface`, `FactoryCommandLoader` and PSR-11
   `ContainerCommandLoader` for commands lazy-loading
 * added a case-insensitive command name matching fallback
 * added static `Command::$defaultName/getDefaultName()`, allowing for
   commands to be registered at compile time in the application command loader.
   Setting the `$defaultName` property avoids the need for filling the `command`
   attribute on the `console.command` tag when using `AddConsoleCommandPass`.

3.3.0
-----

 * added `ExceptionListener`
 * added `AddConsoleCommandPass` (originally in FrameworkBundle)
 * [BC BREAK] `Input::getOption()` no longer returns the default value for options
   with value optional explicitly passed empty
 * added console.error event to catch exceptions thrown by other listeners
 * deprecated console.exception event in favor of console.error
 * added ability to handle `CommandNotFoundException` through the
   `console.error` event
 * deprecated default validation in `SymfonyQuestionHelper::ask`

3.2.0
------

 * added `setInputs()` method to CommandTester for ease testing of commands expecting inputs
 * added `setStream()` and `getStream()` methods to Input (implement StreamableInputInterface)
 * added StreamableInputInterface
 * added LockableTrait

3.1.0
-----

 * added truncate method to FormatterHelper
 * added setColumnWidth(s) method to Table

2.8.3
-----

 * remove readline support from the question helper as it caused issues

2.8.0
-----

 * use readline for user input in the question helper when available to allow
   the use of arrow keys

2.6.0
-----

 * added a Process helper
 * added a DebugFormatter helper

2.5.0
-----

 * deprecated the dialog helper (use the question helper instead)
 * deprecated TableHelper in favor of Table
 * deprecated ProgressHelper in favor of ProgressBar
 * added ConsoleLogger
 * added a question helper
 * added a way to set the process name of a command
 * added a way to set a default command instead of `ListCommand`

2.4.0
-----

 * added a way to force terminal dimensions
 * added a convenient method to detect verbosity level
 * [BC BREAK] made descriptors use output instead of returning a string

2.3.0
-----

 * added multiselect support to the select dialog helper
 * added Table Helper for tabular data rendering
 * added support for events in `Application`
 * added a way to normalize EOLs in `ApplicationTester::getDisplay()` and `CommandTester::getDisplay()`
 * added a way to set the progress bar progress via the `setCurrent` method
 * added support for multiple InputOption shortcuts, written as `'-a|-b|-c'`
 * added two additional verbosity levels, VERBOSITY_VERY_VERBOSE and VERBOSITY_DEBUG

2.2.0
-----

 * added support for colorization on Windows via ConEmu
 * add a method to Dialog Helper to ask for a question and hide the response
 * added support for interactive selections in console (DialogHelper::select())
 * added support for autocompletion as you type in Dialog Helper

2.1.0
-----

 * added ConsoleOutputInterface
 * added the possibility to disable a command (Command::isEnabled())
 * added suggestions when a command does not exist
 * added a --raw option to the list command
 * added support for STDERR in the console output class (errors are now sent
   to STDERR)
 * made the defaults (helper set, commands, input definition) in Application
   more easily customizable
 * added support for the shell even if readline is not available
 * added support for process isolation in Symfony shell via
   `--process-isolation` switch
 * added support for `--`, which disables options parsing after that point
   (tokens will be parsed as arguments)
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\CI;

use Symfony\Component\Console\Output\OutputInterface;

/**
 * Utility class for Github actions.
 *
 * @author Maxime Steinhausser <maxime.steinhausser@gmail.com>
 */
class GithubActionReporter
{
    private $output;

    /**
     * @see https://github.com/actions/toolkit/blob/5e5e1b7aacba68a53836a34db4a288c3c1c1585b/packages/core/src/command.ts#L80-L85
     */
    private const ESCAPED_DATA = [
        '%' => '%25',
        "\r" => '%0D',
        "\n" => '%0A',
    ];

    /**
     * @see https://github.com/actions/toolkit/blob/5e5e1b7aacba68a53836a34db4a288c3c1c1585b/packages/core/src/command.ts#L87-L94
     */
    private const ESCAPED_PROPERTIES = [
        '%' => '%25',
        "\r" => '%0D',
        "\n" => '%0A',
        ':' => '%3A',
        ',' => '%2C',
    ];

    public function __construct(OutputInterface $output)
    {
        $this->output = $output;
    }

    public static function isGithubActionEnvironment(): bool
    {
        return false !== getenv('GITHUB_ACTIONS');
    }

    /**
     * Output an error using the Github annotations format.
     *
     * @see https://docs.github.com/en/free-pro-team@latest/actions/reference/workflow-commands-for-github-actions#setting-an-error-message
     */
    public function error(string $message, string $file = null, int $line = null, int $col = null): void
    {
        $this->log('error', $message, $file, $line, $col);
    }

    /**
     * Output a warning using the Github annotations format.
     *
     * @see https://docs.github.com/en/free-pro-team@latest/actions/reference/workflow-commands-for-github-actions#setting-a-warning-message
     */
    public function warning(string $message, string $file = null, int $line = null, int $col = null): void
    {
        $this->log('warning', $message, $file, $line, $col);
    }

    /**
     * Output a debug log using the Github annotations format.
     *
     * @see https://docs.github.com/en/free-pro-team@latest/actions/reference/workflow-commands-for-github-actions#setting-a-debug-message
     */
    public function debug(string $message, string $file = null, int $line = null, int $col = null): void
    {
        $this->log('debug', $message, $file, $line, $col);
    }

    private function log(string $type, string $message, string $file = null, int $line = null, int $col = null): void
    {
        // Some values must be encoded.
        $message = strtr($message, self::ESCAPED_DATA);

        if (!$file) {
            // No file provided, output the message solely:
            $this->output->writeln(sprintf('::%s::%s', $type, $message));

            return;
        }

        $this->output->writeln(sprintf('::%s file=%s,line=%s,col=%s::%s', $type, strtr($file, self::ESCAPED_PROPERTIES), strtr($line ?? 1, self::ESCAPED_PROPERTIES), strtr($col ?? 0, self::ESCAPED_PROPERTIES), $message));
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console;

use Symfony\Component\Console\Exception\InvalidArgumentException;

/**
 * @author Fabien Potencier <fabien@symfony.com>
 */
final class Color
{
    private const COLORS = [
        'black' => 0,
        'red' => 1,
        'green' => 2,
        'yellow' => 3,
        'blue' => 4,
        'magenta' => 5,
        'cyan' => 6,
        'white' => 7,
        'default' => 9,
    ];

    private const BRIGHT_COLORS = [
        'gray' => 0,
        'bright-red' => 1,
        'bright-green' => 2,
        'bright-yellow' => 3,
        'bright-blue' => 4,
        'bright-magenta' => 5,
        'bright-cyan' => 6,
        'bright-white' => 7,
    ];

    private const AVAILABLE_OPTIONS = [
        'bold' => ['set' => 1, 'unset' => 22],
        'underscore' => ['set' => 4, 'unset' => 24],
        'blink' => ['set' => 5, 'unset' => 25],
        'reverse' => ['set' => 7, 'unset' => 27],
        'conceal' => ['set' => 8, 'unset' => 28],
    ];

    private $foreground;
    private $background;
    private $options = [];

    public function __construct(string $foreground = '', string $background = '', array $options = [])
    {
        $this->foreground = $this->parseColor($foreground);
        $this->background = $this->parseColor($background, true);

        foreach ($options as $option) {
            if (!isset(self::AVAILABLE_OPTIONS[$option])) {
                throw new InvalidArgumentException(sprintf('Invalid option specified: "%s". Expected one of (%s).', $option, implode(', ', array_keys(self::AVAILABLE_OPTIONS))));
            }

            $this->options[$option] = self::AVAILABLE_OPTIONS[$option];
        }
    }

    public function apply(string $text): string
    {
        return $this->set().$text.$this->unset();
    }

    public function set(): string
    {
        $setCodes = [];
        if ('' !== $this->foreground) {
            $setCodes[] = $this->foreground;
        }
        if ('' !== $this->background) {
            $setCodes[] = $this->background;
        }
        foreach ($this->options as $option) {
            $setCodes[] = $option['set'];
        }
        if (0 === \count($setCodes)) {
            return '';
        }

        return sprintf("\033[%sm", implode(';', $setCodes));
    }

    public function unset(): string
    {
        $unsetCodes = [];
        if ('' !== $this->foreground) {
            $unsetCodes[] = 39;
        }
        if ('' !== $this->background) {
            $unsetCodes[] = 49;
        }
        foreach ($this->options as $option) {
            $unsetCodes[] = $option['unset'];
        }
        if (0 === \count($unsetCodes)) {
            return '';
        }

        return sprintf("\033[%sm", implode(';', $unsetCodes));
    }

    private function parseColor(string $color, bool $background = false): string
    {
        if ('' === $color) {
            return '';
        }

        if ('#' === $color[0]) {
            $color = substr($color, 1);

            if (3 === \strlen($color)) {
                $color = $color[0].$color[0].$color[1].$color[1].$color[2].$color[2];
            }

            if (6 !== \strlen($color)) {
                throw new InvalidArgumentException(sprintf('Invalid "%s" color.', $color));
            }

            return ($background ? '4' : '3').$this->convertHexColorToAnsi(hexdec($color));
        }

        if (isset(self::COLORS[$color])) {
            return ($background ? '4' : '3').self::COLORS[$color];
        }

        if (isset(self::BRIGHT_COLORS[$color])) {
            return ($background ? '10' : '9').self::BRIGHT_COLORS[$color];
        }

        throw new InvalidArgumentException(sprintf('Invalid "%s" color; expected one of (%s).', $color, implode(', ', array_merge(array_keys(self::COLORS), array_keys(self::BRIGHT_COLORS)))));
    }

    private function convertHexColorToAnsi(int $color): string
    {
        $r = ($color >> 16) & 255;
        $g = ($color >> 8) & 255;
        $b = $color & 255;

        // see https://github.com/termstandard/colors/ for more information about true color support
        if ('truecolor' !== getenv('COLORTERM')) {
            return (string) $this->degradeHexColorToAnsi($r, $g, $b);
        }

        return sprintf('8;2;%d;%d;%d', $r, $g, $b);
    }

    private function degradeHexColorToAnsi(int $r, int $g, int $b): int
    {
        if (0 === round($this->getSaturation($r, $g, $b) / 50)) {
            return 0;
        }

        return (round($b / 255) << 2) | (round($g / 255) << 1) | round($r / 255);
    }

    private function getSaturation(int $r, int $g, int $b): int
    {
        $r = $r / 255;
        $g = $g / 255;
        $b = $b / 255;
        $v = max($r, $g, $b);

        if (0 === $diff = $v - min($r, $g, $b)) {
            return 0;
        }

        return (int) $diff * 100 / $v;
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Command;

use Symfony\Component\Console\Application;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Completion\CompletionInput;
use Symfony\Component\Console\Completion\CompletionSuggestions;
use Symfony\Component\Console\Exception\ExceptionInterface;
use Symfony\Component\Console\Exception\InvalidArgumentException;
use Symfony\Component\Console\Exception\LogicException;
use Symfony\Component\Console\Helper\HelperSet;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputDefinition;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

/**
 * Base class for all commands.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class Command
{
    // see https://tldp.org/LDP/abs/html/exitcodes.html
    public const SUCCESS = 0;
    public const FAILURE = 1;
    public const INVALID = 2;

    /**
     * @var string|null The default command name
     */
    protected static $defaultName;

    /**
     * @var string|null The default command description
     */
    protected static $defaultDescription;

    private $application;
    private $name;
    private $processTitle;
    private $aliases = [];
    private $definition;
    private $hidden = false;
    private $help = '';
    private $description = '';
    private $fullDefinition;
    private $ignoreValidationErrors = false;
    private $code;
    private $synopsis = [];
    private $usages = [];
    private $helperSet;

    /**
     * @return string|null
     */
    public static function getDefaultName()
    {
        $class = static::class;

        if (\PHP_VERSION_ID >= 80000 && $attribute = (new \ReflectionClass($class))->getAttributes(AsCommand::class)) {
            return $attribute[0]->newInstance()->name;
        }

        $r = new \ReflectionProperty($class, 'defaultName');

        return $class === $r->class ? static::$defaultName : null;
    }

    public static function getDefaultDescription(): ?string
    {
        $class = static::class;

        if (\PHP_VERSION_ID >= 80000 && $attribute = (new \ReflectionClass($class))->getAttributes(AsCommand::class)) {
            return $attribute[0]->newInstance()->description;
        }

        $r = new \ReflectionProperty($class, 'defaultDescription');

        return $class === $r->class ? static::$defaultDescription : null;
    }

    /**
     * @param string|null $name The name of the command; passing null means it must be set in configure()
     *
     * @throws LogicException When the command name is empty
     */
    public function __construct(string $name = null)
    {
        $this->definition = new InputDefinition();

        if (null === $name && null !== $name = static::getDefaultName()) {
            $aliases = explode('|', $name);

            if ('' === $name = array_shift($aliases)) {
                $this->setHidden(true);
                $name = array_shift($aliases);
            }

            $this->setAliases($aliases);
        }

        if (null !== $name) {
            $this->setName($name);
        }

        if ('' === $this->description) {
            $this->setDescription(static::getDefaultDescription() ?? '');
        }

        $this->configure();
    }

    /**
     * Ignores validation errors.
     *
     * This is mainly useful for the help command.
     */
    public function ignoreValidationErrors()
    {
        $this->ignoreValidationErrors = true;
    }

    public function setApplication(Application $application = null)
    {
        $this->application = $application;
        if ($application) {
            $this->setHelperSet($application->getHelperSet());
        } else {
            $this->helperSet = null;
        }

        $this->fullDefinition = null;
    }

    public function setHelperSet(HelperSet $helperSet)
    {
        $this->helperSet = $helperSet;
    }

    /**
     * Gets the helper set.
     *
     * @return HelperSet|null
     */
    public function getHelperSet()
    {
        return $this->helperSet;
    }

    /**
     * Gets the application instance for this command.
     *
     * @return Application|null
     */
    public function getApplication()
    {
        return $this->application;
    }

    /**
     * Checks whether the command is enabled or not in the current environment.
     *
     * Override this to check for x or y and return false if the command cannot
     * run properly under the current conditions.
     *
     * @return bool
     */
    public function isEnabled()
    {
        return true;
    }

    /**
     * Configures the current command.
     */
    protected function configure()
    {
    }

    /**
     * Executes the current command.
     *
     * This method is not abstract because you can use this class
     * as a concrete class. In this case, instead of defining the
     * execute() method, you set the code to execute by passing
     * a Closure to the setCode() method.
     *
     * @return int 0 if everything went fine, or an exit code
     *
     * @throws LogicException When this abstract method is not implemented
     *
     * @see setCode()
     */
    protected function execute(InputInterface $input, OutputInterface $output)
    {
        throw new LogicException('You must override the execute() method in the concrete command class.');
    }

    /**
     * Interacts with the user.
     *
     * This method is executed before the InputDefinition is validated.
     * This means that this is the only place where the command can
     * interactively ask for values of missing required arguments.
     */
    protected function interact(InputInterface $input, OutputInterface $output)
    {
    }

    /**
     * Initializes the command after the input has been bound and before the input
     * is validated.
     *
     * This is mainly useful when a lot of commands extends one main command
     * where some things need to be initialized based on the input arguments and options.
     *
     * @see InputInterface::bind()
     * @see InputInterface::validate()
     */
    protected function initialize(InputInterface $input, OutputInterface $output)
    {
    }

    /**
     * Runs the command.
     *
     * The code to execute is either defined directly with the
     * setCode() method or by overriding the execute() method
     * in a sub-class.
     *
     * @return int The command exit code
     *
     * @throws ExceptionInterface When input binding fails. Bypass this by calling {@link ignoreValidationErrors()}.
     *
     * @see setCode()
     * @see execute()
     */
    public function run(InputInterface $input, OutputInterface $output)
    {
        // add the application arguments and options
        $this->mergeApplicationDefinition();

        // bind the input against the command specific arguments/options
        try {
            $input->bind($this->getDefinition());
        } catch (ExceptionInterface $e) {
            if (!$this->ignoreValidationErrors) {
                throw $e;
            }
        }

        $this->initialize($input, $output);

        if (null !== $this->processTitle) {
            if (\function_exists('cli_set_process_title')) {
                if (!@cli_set_process_title($this->processTitle)) {
                    if ('Darwin' === \PHP_OS) {
                        $output->writeln('<comment>Running "cli_set_process_title" as an unprivileged user is not supported on MacOS.</comment>', OutputInterface::VERBOSITY_VERY_VERBOSE);
                    } else {
                        cli_set_process_title($this->processTitle);
                    }
                }
            } elseif (\function_exists('setproctitle')) {
                setproctitle($this->processTitle);
            } elseif (OutputInterface::VERBOSITY_VERY_VERBOSE === $output->getVerbosity()) {
                $output->writeln('<comment>Install the proctitle PECL to be able to change the process title.</comment>');
            }
        }

        if ($input->isInteractive()) {
            $this->interact($input, $output);
        }

        // The command name argument is often omitted when a command is executed directly with its run() method.
        // It would fail the validation if we didn't make sure the command argument is present,
        // since it's required by the application.
        if ($input->hasArgument('command') && null === $input->getArgument('command')) {
            $input->setArgument('command', $this->getName());
        }

        $input->validate();

        if ($this->code) {
            $statusCode = ($this->code)($input, $output);
        } else {
            $statusCode = $this->execute($input, $output);

            if (!\is_int($statusCode)) {
                throw new \TypeError(sprintf('Return value of "%s::execute()" must be of the type int, "%s" returned.', static::class, get_debug_type($statusCode)));
            }
        }

        return is_numeric($statusCode) ? (int) $statusCode : 0;
    }

    /**
     * Adds suggestions to $suggestions for the current completion input (e.g. option or argument).
     */
    public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void
    {
    }

    /**
     * Sets the code to execute when running this command.
     *
     * If this method is used, it overrides the code defined
     * in the execute() method.
     *
     * @param callable $code A callable(InputInterface $input, OutputInterface $output)
     *
     * @return $this
     *
     * @throws InvalidArgumentException
     *
     * @see execute()
     */
    public function setCode(callable $code)
    {
        if ($code instanceof \Closure) {
            $r = new \ReflectionFunction($code);
            if (null === $r->getClosureThis()) {
                set_error_handler(static function () {});
                try {
                    if ($c = \Closure::bind($code, $this)) {
                        $code = $c;
                    }
                } finally {
                    restore_error_handler();
                }
            }
        }

        $this->code = $code;

        return $this;
    }

    /**
     * Merges the application definition with the command definition.
     *
     * This method is not part of public API and should not be used directly.
     *
     * @param bool $mergeArgs Whether to merge or not the Application definition arguments to Command definition arguments
     *
     * @internal
     */
    public function mergeApplicationDefinition(bool $mergeArgs = true)
    {
        if (null === $this->application) {
            return;
        }

        $this->fullDefinition = new InputDefinition();
        $this->fullDefinition->setOptions($this->definition->getOptions());
        $this->fullDefinition->addOptions($this->application->getDefinition()->getOptions());

        if ($mergeArgs) {
            $this->fullDefinition->setArguments($this->application->getDefinition()->getArguments());
            $this->fullDefinition->addArguments($this->definition->getArguments());
        } else {
            $this->fullDefinition->setArguments($this->definition->getArguments());
        }
    }

    /**
     * Sets an array of argument and option instances.
     *
     * @param array|InputDefinition $definition An array of argument and option instances or a definition instance
     *
     * @return $this
     */
    public function setDefinition($definition)
    {
        if ($definition instanceof InputDefinition) {
            $this->definition = $definition;
        } else {
            $this->definition->setDefinition($definition);
        }

        $this->fullDefinition = null;

        return $this;
    }

    /**
     * Gets the InputDefinition attached to this Command.
     *
     * @return InputDefinition
     */
    public function getDefinition()
    {
        return $this->fullDefinition ?? $this->getNativeDefinition();
    }

    /**
     * Gets the InputDefinition to be used to create representations of this Command.
     *
     * Can be overridden to provide the original command representation when it would otherwise
     * be changed by merging with the application InputDefinition.
     *
     * This method is not part of public API and should not be used directly.
     *
     * @return InputDefinition
     */
    public function getNativeDefinition()
    {
        if (null === $this->definition) {
            throw new LogicException(sprintf('Command class "%s" is not correctly initialized. You probably forgot to call the parent constructor.', static::class));
        }

        return $this->definition;
    }

    /**
     * Adds an argument.
     *
     * @param int|null $mode    The argument mode: InputArgument::REQUIRED or InputArgument::OPTIONAL
     * @param mixed    $default The default value (for InputArgument::OPTIONAL mode only)
     *
     * @return $this
     *
     * @throws InvalidArgumentException When argument mode is not valid
     */
    public function addArgument(string $name, int $mode = null, string $description = '', $default = null)
    {
        $this->definition->addArgument(new InputArgument($name, $mode, $description, $default));
        if (null !== $this->fullDefinition) {
            $this->fullDefinition->addArgument(new InputArgument($name, $mode, $description, $default));
        }

        return $this;
    }

    /**
     * Adds an option.
     *
     * @param string|array|null $shortcut The shortcuts, can be null, a string of shortcuts delimited by | or an array of shortcuts
     * @param int|null          $mode     The option mode: One of the InputOption::VALUE_* constants
     * @param mixed             $default  The default value (must be null for InputOption::VALUE_NONE)
     *
     * @return $this
     *
     * @throws InvalidArgumentException If option mode is invalid or incompatible
     */
    public function addOption(string $name, $shortcut = null, int $mode = null, string $description = '', $default = null)
    {
        $this->definition->addOption(new InputOption($name, $shortcut, $mode, $description, $default));
        if (null !== $this->fullDefinition) {
            $this->fullDefinition->addOption(new InputOption($name, $shortcut, $mode, $description, $default));
        }

        return $this;
    }

    /**
     * Sets the name of the command.
     *
     * This method can set both the namespace and the name if
     * you separate them by a colon (:)
     *
     *     $command->setName('foo:bar');
     *
     * @return $this
     *
     * @throws InvalidArgumentException When the name is invalid
     */
    public function setName(string $name)
    {
        $this->validateName($name);

        $this->name = $name;

        return $this;
    }

    /**
     * Sets the process title of the command.
     *
     * This feature should be used only when creating a long process command,
     * like a daemon.
     *
     * @return $this
     */
    public function setProcessTitle(string $title)
    {
        $this->processTitle = $title;

        return $this;
    }

    /**
     * Returns the command name.
     *
     * @return string|null
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * @param bool $hidden Whether or not the command should be hidden from the list of commands
     *                     The default value will be true in Symfony 6.0
     *
     * @return $this
     *
     * @final since Symfony 5.1
     */
    public function setHidden(bool $hidden /* = true */)
    {
        $this->hidden = $hidden;

        return $this;
    }

    /**
     * @return bool whether the command should be publicly shown or not
     */
    public function isHidden()
    {
        return $this->hidden;
    }

    /**
     * Sets the description for the command.
     *
     * @return $this
     */
    public function setDescription(string $description)
    {
        $this->description = $description;

        return $this;
    }

    /**
     * Returns the description for the command.
     *
     * @return string
     */
    public function getDescription()
    {
        return $this->description;
    }

    /**
     * Sets the help for the command.
     *
     * @return $this
     */
    public function setHelp(string $help)
    {
        $this->help = $help;

        return $this;
    }

    /**
     * Returns the help for the command.
     *
     * @return string
     */
    public function getHelp()
    {
        return $this->help;
    }

    /**
     * Returns the processed help for the command replacing the %command.name% and
     * %command.full_name% patterns with the real values dynamically.
     *
     * @return string
     */
    public function getProcessedHelp()
    {
        $name = $this->name;
        $isSingleCommand = $this->application && $this->application->isSingleCommand();

        $placeholders = [
            '%command.name%',
            '%command.full_name%',
        ];
        $replacements = [
            $name,
            $isSingleCommand ? $_SERVER['PHP_SELF'] : $_SERVER['PHP_SELF'].' '.$name,
        ];

        return str_replace($placeholders, $replacements, $this->getHelp() ?: $this->getDescription());
    }

    /**
     * Sets the aliases for the command.
     *
     * @param string[] $aliases An array of aliases for the command
     *
     * @return $this
     *
     * @throws InvalidArgumentException When an alias is invalid
     */
    public function setAliases(iterable $aliases)
    {
        $list = [];

        foreach ($aliases as $alias) {
            $this->validateName($alias);
            $list[] = $alias;
        }

        $this->aliases = \is_array($aliases) ? $aliases : $list;

        return $this;
    }

    /**
     * Returns the aliases for the command.
     *
     * @return array
     */
    public function getAliases()
    {
        return $this->aliases;
    }

    /**
     * Returns the synopsis for the command.
     *
     * @param bool $short Whether to show the short version of the synopsis (with options folded) or not
     *
     * @return string
     */
    public function getSynopsis(bool $short = false)
    {
        $key = $short ? 'short' : 'long';

        if (!isset($this->synopsis[$key])) {
            $this->synopsis[$key] = trim(sprintf('%s %s', $this->name, $this->definition->getSynopsis($short)));
        }

        return $this->synopsis[$key];
    }

    /**
     * Add a command usage example, it'll be prefixed with the command name.
     *
     * @return $this
     */
    public function addUsage(string $usage)
    {
        if (!str_starts_with($usage, $this->name)) {
            $usage = sprintf('%s %s', $this->name, $usage);
        }

        $this->usages[] = $usage;

        return $this;
    }

    /**
     * Returns alternative usages of the command.
     *
     * @return array
     */
    public function getUsages()
    {
        return $this->usages;
    }

    /**
     * Gets a helper instance by name.
     *
     * @return mixed
     *
     * @throws LogicException           if no HelperSet is defined
     * @throws InvalidArgumentException if the helper is not defined
     */
    public function getHelper(string $name)
    {
        if (null === $this->helperSet) {
            throw new LogicException(sprintf('Cannot retrieve helper "%s" because there is no HelperSet defined. Did you forget to add your command to the application or to set the application on the command using the setApplication() method? You can also set the HelperSet directly using the setHelperSet() method.', $name));
        }

        return $this->helperSet->get($name);
    }

    /**
     * Validates a command name.
     *
     * It must be non-empty and parts can optionally be separated by ":".
     *
     * @throws InvalidArgumentException When the name is invalid
     */
    private function validateName(string $name)
    {
        if (!preg_match('/^[^\:]++(\:[^\:]++)*$/', $name)) {
            throw new InvalidArgumentException(sprintf('Command name "%s" is invalid.', $name));
        }
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Command;

use Symfony\Component\Console\Completion\CompletionInput;
use Symfony\Component\Console\Completion\CompletionSuggestions;
use Symfony\Component\Console\Completion\Output\BashCompletionOutput;
use Symfony\Component\Console\Completion\Output\CompletionOutputInterface;
use Symfony\Component\Console\Exception\CommandNotFoundException;
use Symfony\Component\Console\Exception\ExceptionInterface;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

/**
 * Responsible for providing the values to the shell completion.
 *
 * @author Wouter de Jong <wouter@wouterj.nl>
 */
final class CompleteCommand extends Command
{
    protected static $defaultName = '|_complete';
    protected static $defaultDescription = 'Internal command to provide shell completion suggestions';

    private $completionOutputs;

    private $isDebug = false;

    /**
     * @param array<string, class-string<CompletionOutputInterface>> $completionOutputs A list of additional completion outputs, with shell name as key and FQCN as value
     */
    public function __construct(array $completionOutputs = [])
    {
        // must be set before the parent constructor, as the property value is used in configure()
        $this->completionOutputs = $completionOutputs + ['bash' => BashCompletionOutput::class];

        parent::__construct();
    }

    protected function configure(): void
    {
        $this
            ->addOption('shell', 's', InputOption::VALUE_REQUIRED, 'The shell type ("'.implode('", "', array_keys($this->completionOutputs)).'")')
            ->addOption('input', 'i', InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'An array of input tokens (e.g. COMP_WORDS or argv)')
            ->addOption('current', 'c', InputOption::VALUE_REQUIRED, 'The index of the "input" array that the cursor is in (e.g. COMP_CWORD)')
            ->addOption('symfony', 'S', InputOption::VALUE_REQUIRED, 'The version of the completion script')
        ;
    }

    protected function initialize(InputInterface $input, OutputInterface $output)
    {
        $this->isDebug = filter_var(getenv('SYMFONY_COMPLETION_DEBUG'), \FILTER_VALIDATE_BOOLEAN);
    }

    protected function execute(InputInterface $input, OutputInterface $output): int
    {
        try {
            // uncomment when a bugfix or BC break has been introduced in the shell completion scripts
            // $version = $input->getOption('symfony');
            // if ($version && version_compare($version, 'x.y', '>=')) {
            //    $message = sprintf('Completion script version is not supported ("%s" given, ">=x.y" required).', $version);
            //    $this->log($message);

            //    $output->writeln($message.' Install the Symfony completion script again by using the "completion" command.');

            //    return 126;
            // }

            $shell = $input->getOption('shell');
            if (!$shell) {
                throw new \RuntimeException('The "--shell" option must be set.');
            }

            if (!$completionOutput = $this->completionOutputs[$shell] ?? false) {
                throw new \RuntimeException(sprintf('Shell completion is not supported for your shell: "%s" (supported: "%s").', $shell, implode('", "', array_keys($this->completionOutputs))));
            }

            $completionInput = $this->createCompletionInput($input);
            $suggestions = new CompletionSuggestions();

            $this->log([
                '',
                '<comment>'.date('Y-m-d H:i:s').'</>',
                '<info>Input:</> <comment>("|" indicates the cursor position)</>',
                '  '.(string) $completionInput,
                '<info>Command:</>',
                '  '.(string) implode(' ', $_SERVER['argv']),
                '<info>Messages:</>',
            ]);

            $command = $this->findCommand($completionInput, $output);
            if (null === $command) {
                $this->log('  No command found, completing using the Application class.');

                $this->getApplication()->complete($completionInput, $suggestions);
            } elseif (
                $completionInput->mustSuggestArgumentValuesFor('command')
                && $command->getName() !== $completionInput->getCompletionValue()
                && !\in_array($completionInput->getCompletionValue(), $command->getAliases(), true)
            ) {
                $this->log('  No command found, completing using the Application class.');

                // expand shortcut names ("cache:cl<TAB>") into their full name ("cache:clear")
                $suggestions->suggestValues(array_filter(array_merge([$command->getName()], $command->getAliases())));
            } else {
                $command->mergeApplicationDefinition();
                $completionInput->bind($command->getDefinition());

                if (CompletionInput::TYPE_OPTION_NAME === $completionInput->getCompletionType()) {
                    $this->log('  Completing option names for the <comment>'.\get_class($command instanceof LazyCommand ? $command->getCommand() : $command).'</> command.');

                    $suggestions->suggestOptions($command->getDefinition()->getOptions());
                } else {
                    $this->log([
                        '  Completing using the <comment>'.\get_class($command instanceof LazyCommand ? $command->getCommand() : $command).'</> class.',
                        '  Completing <comment>'.$completionInput->getCompletionType().'</> for <comment>'.$completionInput->getCompletionName().'</>',
                    ]);
                    if (null !== $compval = $completionInput->getCompletionValue()) {
                        $this->log('  Current value: <comment>'.$compval.'</>');
                    }

                    $command->complete($completionInput, $suggestions);
                }
            }

            /** @var CompletionOutputInterface $completionOutput */
            $completionOutput = new $completionOutput();

            $this->log('<info>Suggestions:</>');
            if ($options = $suggestions->getOptionSuggestions()) {
                $this->log('  --'.implode(' --', array_map(function ($o) { return $o->getName(); }, $options)));
            } elseif ($values = $suggestions->getValueSuggestions()) {
                $this->log('  '.implode(' ', $values));
            } else {
                $this->log('  <comment>No suggestions were provided</>');
            }

            $completionOutput->write($suggestions, $output);
        } catch (\Throwable $e) {
            $this->log([
                '<error>Error!</error>',
                (string) $e,
            ]);

            if ($output->isDebug()) {
                throw $e;
            }

            return 2;
        }

        return 0;
    }

    private function createCompletionInput(InputInterface $input): CompletionInput
    {
        $currentIndex = $input->getOption('current');
        if (!$currentIndex || !ctype_digit($currentIndex)) {
            throw new \RuntimeException('The "--current" option must be set and it must be an integer.');
        }

        $completionInput = CompletionInput::fromTokens($input->getOption('input'), (int) $currentIndex);

        try {
            $completionInput->bind($this->getApplication()->getDefinition());
        } catch (ExceptionInterface $e) {
        }

        return $completionInput;
    }

    private function findCommand(CompletionInput $completionInput, OutputInterface $output): ?Command
    {
        try {
            $inputName = $completionInput->getFirstArgument();
            if (null === $inputName) {
                return null;
            }

            return $this->getApplication()->find($inputName);
        } catch (CommandNotFoundException $e) {
        }

        return null;
    }

    private function log($messages): void
    {
        if (!$this->isDebug) {
            return;
        }

        $commandName = basename($_SERVER['argv'][0]);
        file_put_contents(sys_get_temp_dir().'/sf_'.$commandName.'.log', implode(\PHP_EOL, (array) $messages).\PHP_EOL, \FILE_APPEND);
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Command;

use Symfony\Component\Console\Completion\CompletionInput;
use Symfony\Component\Console\Completion\CompletionSuggestions;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\ConsoleOutputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Process\Process;

/**
 * Dumps the completion script for the current shell.
 *
 * @author Wouter de Jong <wouter@wouterj.nl>
 */
final class DumpCompletionCommand extends Command
{
    protected static $defaultName = 'completion';
    protected static $defaultDescription = 'Dump the shell completion script';

    public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void
    {
        if ($input->mustSuggestArgumentValuesFor('shell')) {
            $suggestions->suggestValues($this->getSupportedShells());
        }
    }

    protected function configure()
    {
        $fullCommand = $_SERVER['PHP_SELF'];
        $commandName = basename($fullCommand);
        $fullCommand = @realpath($fullCommand) ?: $fullCommand;

        $this
            ->setHelp(<<<EOH
The <info>%command.name%</> command dumps the shell completion script required
to use shell autocompletion (currently only bash completion is supported).

<comment>Static installation
-------------------</>

Dump the script to a global completion file and restart your shell:

    <info>%command.full_name% bash | sudo tee /etc/bash_completion.d/{$commandName}</>

Or dump the script to a local file and source it:

    <info>%command.full_name% bash > completion.sh</>

    <comment># source the file whenever you use the project</>
    <info>source completion.sh</>

    <comment># or add this line at the end of your "~/.bashrc" file:</>
    <info>source /path/to/completion.sh</>

<comment>Dynamic installation
--------------------</>

Add this to the end of your shell configuration file (e.g. <info>"~/.bashrc"</>):

    <info>eval "$({$fullCommand} completion bash)"</>
EOH
            )
            ->addArgument('shell', InputArgument::OPTIONAL, 'The shell type (e.g. "bash"), the value of the "$SHELL" env var will be used if this is not given')
            ->addOption('debug', null, InputOption::VALUE_NONE, 'Tail the completion debug log')
        ;
    }

    protected function execute(InputInterface $input, OutputInterface $output): int
    {
        $commandName = basename($_SERVER['argv'][0]);

        if ($input->getOption('debug')) {
            $this->tailDebugLog($commandName, $output);

            return 0;
        }

        $shell = $input->getArgument('shell') ?? self::guessShell();
        $completionFile = __DIR__.'/../Resources/completion.'.$shell;
        if (!file_exists($completionFile)) {
            $supportedShells = $this->getSupportedShells();

            if ($output instanceof ConsoleOutputInterface) {
                $output = $output->getErrorOutput();
            }
            if ($shell) {
                $output->writeln(sprintf('<error>Detected shell "%s", which is not supported by Symfony shell completion (supported shells: "%s").</>', $shell, implode('", "', $supportedShells)));
            } else {
                $output->writeln(sprintf('<error>Shell not detected, Symfony shell completion only supports "%s").</>', implode('", "', $supportedShells)));
            }

            return 2;
        }

        $output->write(str_replace(['{{ COMMAND_NAME }}', '{{ VERSION }}'], [$commandName, $this->getApplication()->getVersion()], file_get_contents($completionFile)));

        return 0;
    }

    private static function guessShell(): string
    {
        return basename($_SERVER['SHELL'] ?? '');
    }

    private function tailDebugLog(string $commandName, OutputInterface $output): void
    {
        $debugFile = sys_get_temp_dir().'/sf_'.$commandName.'.log';
        if (!file_exists($debugFile)) {
            touch($debugFile);
        }
        $process = new Process(['tail', '-f', $debugFile], null, null, null, 0);
        $process->run(function (string $type, string $line) use ($output): void {
            $output->write($line);
        });
    }

    /**
     * @return string[]
     */
    private function getSupportedShells(): array
    {
        $shells = [];

        foreach (new \DirectoryIterator(__DIR__.'/../Resources/') as $file) {
            if (str_starts_with($file->getBasename(), 'completion.') && $file->isFile()) {
                $shells[] = $file->getExtension();
            }
        }

        return $shells;
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Command;

use Symfony\Component\Console\Completion\CompletionInput;
use Symfony\Component\Console\Completion\CompletionSuggestions;
use Symfony\Component\Console\Descriptor\ApplicationDescription;
use Symfony\Component\Console\Helper\DescriptorHelper;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

/**
 * HelpCommand displays the help for a given command.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class HelpCommand extends Command
{
    private $command;

    /**
     * {@inheritdoc}
     */
    protected function configure()
    {
        $this->ignoreValidationErrors();

        $this
            ->setName('help')
            ->setDefinition([
                new InputArgument('command_name', InputArgument::OPTIONAL, 'The command name', 'help'),
                new InputOption('format', null, InputOption::VALUE_REQUIRED, 'The output format (txt, xml, json, or md)', 'txt'),
                new InputOption('raw', null, InputOption::VALUE_NONE, 'To output raw command help'),
            ])
            ->setDescription('Display help for a command')
            ->setHelp(<<<'EOF'
The <info>%command.name%</info> command displays help for a given command:

  <info>%command.full_name% list</info>

You can also output the help in other formats by using the <comment>--format</comment> option:

  <info>%command.full_name% --format=xml list</info>

To display the list of available commands, please use the <info>list</info> command.
EOF
            )
        ;
    }

    public function setCommand(Command $command)
    {
        $this->command = $command;
    }

    /**
     * {@inheritdoc}
     */
    protected function execute(InputInterface $input, OutputInterface $output)
    {
        if (null === $this->command) {
            $this->command = $this->getApplication()->find($input->getArgument('command_name'));
        }

        $helper = new DescriptorHelper();
        $helper->describe($output, $this->command, [
            'format' => $input->getOption('format'),
            'raw_text' => $input->getOption('raw'),
        ]);

        $this->command = null;

        return 0;
    }

    public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void
    {
        if ($input->mustSuggestArgumentValuesFor('command_name')) {
            $descriptor = new ApplicationDescription($this->getApplication());
            $suggestions->suggestValues(array_keys($descriptor->getCommands()));

            return;
        }

        if ($input->mustSuggestOptionValuesFor('format')) {
            $helper = new DescriptorHelper();
            $suggestions->suggestValues($helper->getFormats());
        }
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Command;

use Symfony\Component\Console\Application;
use Symfony\Component\Console\Completion\CompletionInput;
use Symfony\Component\Console\Completion\CompletionSuggestions;
use Symfony\Component\Console\Helper\HelperSet;
use Symfony\Component\Console\Input\InputDefinition;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

/**
 * @author Nicolas Grekas <p@tchwork.com>
 */
final class LazyCommand extends Command
{
    private $command;
    private $isEnabled;

    public function __construct(string $name, array $aliases, string $description, bool $isHidden, \Closure $commandFactory, ?bool $isEnabled = true)
    {
        $this->setName($name)
            ->setAliases($aliases)
            ->setHidden($isHidden)
            ->setDescription($description);

        $this->command = $commandFactory;
        $this->isEnabled = $isEnabled;
    }

    public function ignoreValidationErrors(): void
    {
        $this->getCommand()->ignoreValidationErrors();
    }

    public function setApplication(Application $application = null): void
    {
        if ($this->command instanceof parent) {
            $this->command->setApplication($application);
        }

        parent::setApplication($application);
    }

    public function setHelperSet(HelperSet $helperSet): void
    {
        if ($this->command instanceof parent) {
            $this->command->setHelperSet($helperSet);
        }

        parent::setHelperSet($helperSet);
    }

    public function isEnabled(): bool
    {
        return $this->isEnabled ?? $this->getCommand()->isEnabled();
    }

    public function run(InputInterface $input, OutputInterface $output): int
    {
        return $this->getCommand()->run($input, $output);
    }

    public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void
    {
        $this->getCommand()->complete($input, $suggestions);
    }

    /**
     * @return $this
     */
    public function setCode(callable $code): self
    {
        $this->getCommand()->setCode($code);

        return $this;
    }

    /**
     * @internal
     */
    public function mergeApplicationDefinition(bool $mergeArgs = true): void
    {
        $this->getCommand()->mergeApplicationDefinition($mergeArgs);
    }

    /**
     * @return $this
     */
    public function setDefinition($definition): self
    {
        $this->getCommand()->setDefinition($definition);

        return $this;
    }

    public function getDefinition(): InputDefinition
    {
        return $this->getCommand()->getDefinition();
    }

    public function getNativeDefinition(): InputDefinition
    {
        return $this->getCommand()->getNativeDefinition();
    }

    /**
     * @return $this
     */
    public function addArgument(string $name, int $mode = null, string $description = '', $default = null): self
    {
        $this->getCommand()->addArgument($name, $mode, $description, $default);

        return $this;
    }

    /**
     * @return $this
     */
    public function addOption(string $name, $shortcut = null, int $mode = null, string $description = '', $default = null): self
    {
        $this->getCommand()->addOption($name, $shortcut, $mode, $description, $default);

        return $this;
    }

    /**
     * @return $this
     */
    public function setProcessTitle(string $title): self
    {
        $this->getCommand()->setProcessTitle($title);

        return $this;
    }

    /**
     * @return $this
     */
    public function setHelp(string $help): self
    {
        $this->getCommand()->setHelp($help);

        return $this;
    }

    public function getHelp(): string
    {
        return $this->getCommand()->getHelp();
    }

    public function getProcessedHelp(): string
    {
        return $this->getCommand()->getProcessedHelp();
    }

    public function getSynopsis(bool $short = false): string
    {
        return $this->getCommand()->getSynopsis($short);
    }

    /**
     * @return $this
     */
    public function addUsage(string $usage): self
    {
        $this->getCommand()->addUsage($usage);

        return $this;
    }

    public function getUsages(): array
    {
        return $this->getCommand()->getUsages();
    }

    /**
     * @return mixed
     */
    public function getHelper(string $name)
    {
        return $this->getCommand()->getHelper($name);
    }

    public function getCommand(): parent
    {
        if (!$this->command instanceof \Closure) {
            return $this->command;
        }

        $command = $this->command = ($this->command)();
        $command->setApplication($this->getApplication());

        if (null !== $this->getHelperSet()) {
            $command->setHelperSet($this->getHelperSet());
        }

        $command->setName($this->getName())
            ->setAliases($this->getAliases())
            ->setHidden($this->isHidden())
            ->setDescription($this->getDescription());

        // Will throw if the command is not correctly initialized.
        $command->getDefinition();

        return $command;
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Command;

use Symfony\Component\Console\Completion\CompletionInput;
use Symfony\Component\Console\Completion\CompletionSuggestions;
use Symfony\Component\Console\Descriptor\ApplicationDescription;
use Symfony\Component\Console\Helper\DescriptorHelper;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

/**
 * ListCommand displays the list of all available commands for the application.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class ListCommand extends Command
{
    /**
     * {@inheritdoc}
     */
    protected function configure()
    {
        $this
            ->setName('list')
            ->setDefinition([
                new InputArgument('namespace', InputArgument::OPTIONAL, 'The namespace name'),
                new InputOption('raw', null, InputOption::VALUE_NONE, 'To output raw command list'),
                new InputOption('format', null, InputOption::VALUE_REQUIRED, 'The output format (txt, xml, json, or md)', 'txt'),
                new InputOption('short', null, InputOption::VALUE_NONE, 'To skip describing commands\' arguments'),
            ])
            ->setDescription('List commands')
            ->setHelp(<<<'EOF'
The <info>%command.name%</info> command lists all commands:

  <info>%command.full_name%</info>

You can also display the commands for a specific namespace:

  <info>%command.full_name% test</info>

You can also output the information in other formats by using the <comment>--format</comment> option:

  <info>%command.full_name% --format=xml</info>

It's also possible to get raw list of commands (useful for embedding command runner):

  <info>%command.full_name% --raw</info>
EOF
            )
        ;
    }

    /**
     * {@inheritdoc}
     */
    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $helper = new DescriptorHelper();
        $helper->describe($output, $this->getApplication(), [
            'format' => $input->getOption('format'),
            'raw_text' => $input->getOption('raw'),
            'namespace' => $input->getArgument('namespace'),
            'short' => $input->getOption('short'),
        ]);

        return 0;
    }

    public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void
    {
        if ($input->mustSuggestArgumentValuesFor('namespace')) {
            $descriptor = new ApplicationDescription($this->getApplication());
            $suggestions->suggestValues(array_keys($descriptor->getNamespaces()));

            return;
        }

        if ($input->mustSuggestOptionValuesFor('format')) {
            $helper = new DescriptorHelper();
            $suggestions->suggestValues($helper->getFormats());
        }
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Command;

use Symfony\Component\Console\Exception\LogicException;
use Symfony\Component\Lock\LockFactory;
use Symfony\Component\Lock\LockInterface;
use Symfony\Component\Lock\Store\FlockStore;
use Symfony\Component\Lock\Store\SemaphoreStore;

/**
 * Basic lock feature for commands.
 *
 * @author Geoffrey Brier <geoffrey.brier@gmail.com>
 */
trait LockableTrait
{
    /** @var LockInterface|null */
    private $lock;

    /**
     * Locks a command.
     */
    private function lock(string $name = null, bool $blocking = false): bool
    {
        if (!class_exists(SemaphoreStore::class)) {
            throw new LogicException('To enable the locking feature you must install the symfony/lock component.');
        }

        if (null !== $this->lock) {
            throw new LogicException('A lock is already in place.');
        }

        if (SemaphoreStore::isSupported()) {
            $store = new SemaphoreStore();
        } else {
            $store = new FlockStore();
        }

        $this->lock = (new LockFactory($store))->createLock($name ?: $this->getName());
        if (!$this->lock->acquire($blocking)) {
            $this->lock = null;

            return false;
        }

        return true;
    }

    /**
     * Releases the command lock if there is one.
     */
    private function release()
    {
        if ($this->lock) {
            $this->lock->release();
            $this->lock = null;
        }
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Command;

/**
 * Interface for command reacting to signal.
 *
 * @author Grégoire Pineau <lyrixx@lyrix.info>
 */
interface SignalableCommandInterface
{
    /**
     * Returns the list of signals to subscribe.
     */
    public function getSubscribedSignals(): array;

    /**
     * The method will be called when the application is signaled.
     */
    public function handleSignal(int $signal): void;
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\CommandLoader;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Exception\CommandNotFoundException;

/**
 * @author Robin Chalas <robin.chalas@gmail.com>
 */
interface CommandLoaderInterface
{
    /**
     * Loads a command.
     *
     * @return Command
     *
     * @throws CommandNotFoundException
     */
    public function get(string $name);

    /**
     * Checks if a command exists.
     *
     * @return bool
     */
    public function has(string $name);

    /**
     * @return string[]
     */
    public function getNames();
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\CommandLoader;

use Psr\Container\ContainerInterface;
use Symfony\Component\Console\Exception\CommandNotFoundException;

/**
 * Loads commands from a PSR-11 container.
 *
 * @author Robin Chalas <robin.chalas@gmail.com>
 */
class ContainerCommandLoader implements CommandLoaderInterface
{
    private $container;
    private $commandMap;

    /**
     * @param array $commandMap An array with command names as keys and service ids as values
     */
    public function __construct(ContainerInterface $container, array $commandMap)
    {
        $this->container = $container;
        $this->commandMap = $commandMap;
    }

    /**
     * {@inheritdoc}
     */
    public function get(string $name)
    {
        if (!$this->has($name)) {
            throw new CommandNotFoundException(sprintf('Command "%s" does not exist.', $name));
        }

        return $this->container->get($this->commandMap[$name]);
    }

    /**
     * {@inheritdoc}
     */
    public function has(string $name)
    {
        return isset($this->commandMap[$name]) && $this->container->has($this->commandMap[$name]);
    }

    /**
     * {@inheritdoc}
     */
    public function getNames()
    {
        return array_keys($this->commandMap);
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\CommandLoader;

use Symfony\Component\Console\Exception\CommandNotFoundException;

/**
 * A simple command loader using factories to instantiate commands lazily.
 *
 * @author Maxime Steinhausser <maxime.steinhausser@gmail.com>
 */
class FactoryCommandLoader implements CommandLoaderInterface
{
    private $factories;

    /**
     * @param callable[] $factories Indexed by command names
     */
    public function __construct(array $factories)
    {
        $this->factories = $factories;
    }

    /**
     * {@inheritdoc}
     */
    public function has(string $name)
    {
        return isset($this->factories[$name]);
    }

    /**
     * {@inheritdoc}
     */
    public function get(string $name)
    {
        if (!isset($this->factories[$name])) {
            throw new CommandNotFoundException(sprintf('Command "%s" does not exist.', $name));
        }

        $factory = $this->factories[$name];

        return $factory();
    }

    /**
     * {@inheritdoc}
     */
    public function getNames()
    {
        return array_keys($this->factories);
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Completion;

use Symfony\Component\Console\Exception\RuntimeException;
use Symfony\Component\Console\Input\ArgvInput;
use Symfony\Component\Console\Input\InputDefinition;
use Symfony\Component\Console\Input\InputOption;

/**
 * An input specialized for shell completion.
 *
 * This input allows unfinished option names or values and exposes what kind of
 * completion is expected.
 *
 * @author Wouter de Jong <wouter@wouterj.nl>
 */
final class CompletionInput extends ArgvInput
{
    public const TYPE_ARGUMENT_VALUE = 'argument_value';
    public const TYPE_OPTION_VALUE = 'option_value';
    public const TYPE_OPTION_NAME = 'option_name';
    public const TYPE_NONE = 'none';

    private $tokens;
    private $currentIndex;
    private $completionType;
    private $completionName = null;
    private $completionValue = '';

    /**
     * Converts a terminal string into tokens.
     *
     * This is required for shell completions without COMP_WORDS support.
     */
    public static function fromString(string $inputStr, int $currentIndex): self
    {
        preg_match_all('/(?<=^|\s)([\'"]?)(.+?)(?<!\\\\)\1(?=$|\s)/', $inputStr, $tokens);

        return self::fromTokens($tokens[0], $currentIndex);
    }

    /**
     * Create an input based on an COMP_WORDS token list.
     *
     * @param string[] $tokens       the set of split tokens (e.g. COMP_WORDS or argv)
     * @param          $currentIndex the index of the cursor (e.g. COMP_CWORD)
     */
    public static function fromTokens(array $tokens, int $currentIndex): self
    {
        $input = new self($tokens);
        $input->tokens = $tokens;
        $input->currentIndex = $currentIndex;

        return $input;
    }

    /**
     * {@inheritdoc}
     */
    public function bind(InputDefinition $definition): void
    {
        parent::bind($definition);

        $relevantToken = $this->getRelevantToken();
        if ('-' === $relevantToken[0]) {
            // the current token is an input option: complete either option name or option value
            [$optionToken, $optionValue] = explode('=', $relevantToken, 2) + ['', ''];

            $option = $this->getOptionFromToken($optionToken);
            if (null === $option && !$this->isCursorFree()) {
                $this->completionType = self::TYPE_OPTION_NAME;
                $this->completionValue = $relevantToken;

                return;
            }

            if (null !== $option && $option->acceptValue()) {
                $this->completionType = self::TYPE_OPTION_VALUE;
                $this->completionName = $option->getName();
                $this->completionValue = $optionValue ?: (!str_starts_with($optionToken, '--') ? substr($optionToken, 2) : '');

                return;
            }
        }

        $previousToken = $this->tokens[$this->currentIndex - 1];
        if ('-' === $previousToken[0] && '' !== trim($previousToken, '-')) {
            // check if previous option accepted a value
            $previousOption = $this->getOptionFromToken($previousToken);
            if (null !== $previousOption && $previousOption->acceptValue()) {
                $this->completionType = self::TYPE_OPTION_VALUE;
                $this->completionName = $previousOption->getName();
                $this->completionValue = $relevantToken;

                return;
            }
        }

        // complete argument value
        $this->completionType = self::TYPE_ARGUMENT_VALUE;

        foreach ($this->definition->getArguments() as $argumentName => $argument) {
            if (!isset($this->arguments[$argumentName])) {
                break;
            }

            $argumentValue = $this->arguments[$argumentName];
            $this->completionName = $argumentName;
            if (\is_array($argumentValue)) {
                $this->completionValue = $argumentValue ? $argumentValue[array_key_last($argumentValue)] : null;
            } else {
                $this->completionValue = $argumentValue;
            }
        }

        if ($this->currentIndex >= \count($this->tokens)) {
            if (!isset($this->arguments[$argumentName]) || $this->definition->getArgument($argumentName)->isArray()) {
                $this->completionName = $argumentName;
                $this->completionValue = '';
            } else {
                // we've reached the end
                $this->completionType = self::TYPE_NONE;
                $this->completionName = null;
                $this->completionValue = '';
            }
        }
    }

    /**
     * Returns the type of completion required.
     *
     * TYPE_ARGUMENT_VALUE when completing the value of an input argument
     * TYPE_OPTION_VALUE   when completing the value of an input option
     * TYPE_OPTION_NAME    when completing the name of an input option
     * TYPE_NONE           when nothing should be completed
     *
     * @return string One of self::TYPE_* constants. TYPE_OPTION_NAME and TYPE_NONE are already implemented by the Console component
     */
    public function getCompletionType(): string
    {
        return $this->completionType;
    }

    /**
     * The name of the input option or argument when completing a value.
     *
     * @return string|null returns null when completing an option name
     */
    public function getCompletionName(): ?string
    {
        return $this->completionName;
    }

    /**
     * The value already typed by the user (or empty string).
     */
    public function getCompletionValue(): string
    {
        return $this->completionValue;
    }

    public function mustSuggestOptionValuesFor(string $optionName): bool
    {
        return self::TYPE_OPTION_VALUE === $this->getCompletionType() && $optionName === $this->getCompletionName();
    }

    public function mustSuggestArgumentValuesFor(string $argumentName): bool
    {
        return self::TYPE_ARGUMENT_VALUE === $this->getCompletionType() && $argumentName === $this->getCompletionName();
    }

    protected function parseToken(string $token, bool $parseOptions): bool
    {
        try {
            return parent::parseToken($token, $parseOptions);
        } catch (RuntimeException $e) {
            // suppress errors, completed input is almost never valid
        }

        return $parseOptions;
    }

    private function getOptionFromToken(string $optionToken): ?InputOption
    {
        $optionName = ltrim($optionToken, '-');
        if (!$optionName) {
            return null;
        }

        if ('-' === ($optionToken[1] ?? ' ')) {
            // long option name
            return $this->definition->hasOption($optionName) ? $this->definition->getOption($optionName) : null;
        }

        // short option name
        return $this->definition->hasShortcut($optionName[0]) ? $this->definition->getOptionForShortcut($optionName[0]) : null;
    }

    /**
     * The token of the cursor, or the last token if the cursor is at the end of the input.
     */
    private function getRelevantToken(): string
    {
        return $this->tokens[$this->isCursorFree() ? $this->currentIndex - 1 : $this->currentIndex];
    }

    /**
     * Whether the cursor is "free" (i.e. at the end of the input preceded by a space).
     */
    private function isCursorFree(): bool
    {
        $nrOfTokens = \count($this->tokens);
        if ($this->currentIndex > $nrOfTokens) {
            throw new \LogicException('Current index is invalid, it must be the number of input tokens or one more.');
        }

        return $this->currentIndex >= $nrOfTokens;
    }

    public function __toString()
    {
        $str = '';
        foreach ($this->tokens as $i => $token) {
            $str .= $token;

            if ($this->currentIndex === $i) {
                $str .= '|';
            }

            $str .= ' ';
        }

        if ($this->currentIndex > $i) {
            $str .= '|';
        }

        return rtrim($str);
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Completion;

use Symfony\Component\Console\Input\InputOption;

/**
 * Stores all completion suggestions for the current input.
 *
 * @author Wouter de Jong <wouter@wouterj.nl>
 */
final class CompletionSuggestions
{
    private $valueSuggestions = [];
    private $optionSuggestions = [];

    /**
     * Add a suggested value for an input option or argument.
     *
     * @param string|Suggestion $value
     *
     * @return $this
     */
    public function suggestValue($value): self
    {
        $this->valueSuggestions[] = !$value instanceof Suggestion ? new Suggestion($value) : $value;

        return $this;
    }

    /**
     * Add multiple suggested values at once for an input option or argument.
     *
     * @param list<string|Suggestion> $values
     *
     * @return $this
     */
    public function suggestValues(array $values): self
    {
        foreach ($values as $value) {
            $this->suggestValue($value);
        }

        return $this;
    }

    /**
     * Add a suggestion for an input option name.
     *
     * @return $this
     */
    public function suggestOption(InputOption $option): self
    {
        $this->optionSuggestions[] = $option;

        return $this;
    }

    /**
     * Add multiple suggestions for input option names at once.
     *
     * @param InputOption[] $options
     *
     * @return $this
     */
    public function suggestOptions(array $options): self
    {
        foreach ($options as $option) {
            $this->suggestOption($option);
        }

        return $this;
    }

    /**
     * @return InputOption[]
     */
    public function getOptionSuggestions(): array
    {
        return $this->optionSuggestions;
    }

    /**
     * @return Suggestion[]
     */
    public function getValueSuggestions(): array
    {
        return $this->valueSuggestions;
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Completion\Output;

use Symfony\Component\Console\Completion\CompletionSuggestions;
use Symfony\Component\Console\Output\OutputInterface;

/**
 * @author Wouter de Jong <wouter@wouterj.nl>
 */
class BashCompletionOutput implements CompletionOutputInterface
{
    public function write(CompletionSuggestions $suggestions, OutputInterface $output): void
    {
        $values = $suggestions->getValueSuggestions();
        foreach ($suggestions->getOptionSuggestions() as $option) {
            $values[] = '--'.$option->getName();
            if ($option->isNegatable()) {
                $values[] = '--no-'.$option->getName();
            }
        }
        $output->writeln(implode("\n", $values));
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Completion\Output;

use Symfony\Component\Console\Completion\CompletionSuggestions;
use Symfony\Component\Console\Output\OutputInterface;

/**
 * Transforms the {@see CompletionSuggestions} object into output readable by the shell completion.
 *
 * @author Wouter de Jong <wouter@wouterj.nl>
 */
interface CompletionOutputInterface
{
    public function write(CompletionSuggestions $suggestions, OutputInterface $output): void;
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Completion;

/**
 * Represents a single suggested value.
 *
 * @author Wouter de Jong <wouter@wouterj.nl>
 */
class Suggestion
{
    private $value;

    public function __construct(string $value)
    {
        $this->value = $value;
    }

    public function getValue(): string
    {
        return $this->value;
    }

    public function __toString(): string
    {
        return $this->getValue();
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console;

use Symfony\Component\Console\Event\ConsoleCommandEvent;
use Symfony\Component\Console\Event\ConsoleErrorEvent;
use Symfony\Component\Console\Event\ConsoleSignalEvent;
use Symfony\Component\Console\Event\ConsoleTerminateEvent;

/**
 * Contains all events dispatched by an Application.
 *
 * @author Francesco Levorato <git@flevour.net>
 */
final class ConsoleEvents
{
    /**
     * The COMMAND event allows you to attach listeners before any command is
     * executed by the console. It also allows you to modify the command, input and output
     * before they are handed to the command.
     *
     * @Event("Symfony\Component\Console\Event\ConsoleCommandEvent")
     */
    public const COMMAND = 'console.command';

    /**
     * The SIGNAL event allows you to perform some actions
     * after the command execution was interrupted.
     *
     * @Event("Symfony\Component\Console\Event\ConsoleSignalEvent")
     */
    public const SIGNAL = 'console.signal';

    /**
     * The TERMINATE event allows you to attach listeners after a command is
     * executed by the console.
     *
     * @Event("Symfony\Component\Console\Event\ConsoleTerminateEvent")
     */
    public const TERMINATE = 'console.terminate';

    /**
     * The ERROR event occurs when an uncaught exception or error appears.
     *
     * This event allows you to deal with the exception/error or
     * to modify the thrown exception.
     *
     * @Event("Symfony\Component\Console\Event\ConsoleErrorEvent")
     */
    public const ERROR = 'console.error';

    /**
     * Event aliases.
     *
     * These aliases can be consumed by RegisterListenersPass.
     */
    public const ALIASES = [
        ConsoleCommandEvent::class => self::COMMAND,
        ConsoleErrorEvent::class => self::ERROR,
        ConsoleSignalEvent::class => self::SIGNAL,
        ConsoleTerminateEvent::class => self::TERMINATE,
    ];
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console;

use Symfony\Component\Console\Output\OutputInterface;

/**
 * @author Pierre du Plessis <pdples@gmail.com>
 */
final class Cursor
{
    private $output;
    private $input;

    /**
     * @param resource|null $input
     */
    public function __construct(OutputInterface $output, $input = null)
    {
        $this->output = $output;
        $this->input = $input ?? (\defined('STDIN') ? \STDIN : fopen('php://input', 'r+'));
    }

    /**
     * @return $this
     */
    public function moveUp(int $lines = 1): self
    {
        $this->output->write(sprintf("\x1b[%dA", $lines));

        return $this;
    }

    /**
     * @return $this
     */
    public function moveDown(int $lines = 1): self
    {
        $this->output->write(sprintf("\x1b[%dB", $lines));

        return $this;
    }

    /**
     * @return $this
     */
    public function moveRight(int $columns = 1): self
    {
        $this->output->write(sprintf("\x1b[%dC", $columns));

        return $this;
    }

    /**
     * @return $this
     */
    public function moveLeft(int $columns = 1): self
    {
        $this->output->write(sprintf("\x1b[%dD", $columns));

        return $this;
    }

    /**
     * @return $this
     */
    public function moveToColumn(int $column): self
    {
        $this->output->write(sprintf("\x1b[%dG", $column));

        return $this;
    }

    /**
     * @return $this
     */
    public function moveToPosition(int $column, int $row): self
    {
        $this->output->write(sprintf("\x1b[%d;%dH", $row + 1, $column));

        return $this;
    }

    /**
     * @return $this
     */
    public function savePosition(): self
    {
        $this->output->write("\x1b7");

        return $this;
    }

    /**
     * @return $this
     */
    public function restorePosition(): self
    {
        $this->output->write("\x1b8");

        return $this;
    }

    /**
     * @return $this
     */
    public function hide(): self
    {
        $this->output->write("\x1b[?25l");

        return $this;
    }

    /**
     * @return $this
     */
    public function show(): self
    {
        $this->output->write("\x1b[?25h\x1b[?0c");

        return $this;
    }

    /**
     * Clears all the output from the current line.
     *
     * @return $this
     */
    public function clearLine(): self
    {
        $this->output->write("\x1b[2K");

        return $this;
    }

    /**
     * Clears all the output from the current line after the current position.
     */
    public function clearLineAfter(): self
    {
        $this->output->write("\x1b[K");

        return $this;
    }

    /**
     * Clears all the output from the cursors' current position to the end of the screen.
     *
     * @return $this
     */
    public function clearOutput(): self
    {
        $this->output->write("\x1b[0J");

        return $this;
    }

    /**
     * Clears the entire screen.
     *
     * @return $this
     */
    public function clearScreen(): self
    {
        $this->output->write("\x1b[2J");

        return $this;
    }

    /**
     * Returns the current cursor position as x,y coordinates.
     */
    public function getCurrentPosition(): array
    {
        static $isTtySupported;

        if (null === $isTtySupported && \function_exists('proc_open')) {
            $isTtySupported = (bool) @proc_open('echo 1 >/dev/null', [['file', '/dev/tty', 'r'], ['file', '/dev/tty', 'w'], ['file', '/dev/tty', 'w']], $pipes);
        }

        if (!$isTtySupported) {
            return [1, 1];
        }

        $sttyMode = shell_exec('stty -g');
        shell_exec('stty -icanon -echo');

        @fwrite($this->input, "\033[6n");

        $code = trim(fread($this->input, 1024));

        shell_exec(sprintf('stty %s', $sttyMode));

        sscanf($code, "\033[%d;%dR", $row, $col);

        return [$col, $row];
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\DependencyInjection;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Command\LazyCommand;
use Symfony\Component\Console\CommandLoader\ContainerCommandLoader;
use Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\Compiler\ServiceLocatorTagPass;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\DependencyInjection\TypedReference;

/**
 * Registers console commands.
 *
 * @author Grégoire Pineau <lyrixx@lyrixx.info>
 */
class AddConsoleCommandPass implements CompilerPassInterface
{
    private $commandLoaderServiceId;
    private $commandTag;
    private $noPreloadTag;
    private $privateTagName;

    public function __construct(string $commandLoaderServiceId = 'console.command_loader', string $commandTag = 'console.command', string $noPreloadTag = 'container.no_preload', string $privateTagName = 'container.private')
    {
        if (0 < \func_num_args()) {
            trigger_deprecation('symfony/console', '5.3', 'Configuring "%s" is deprecated.', __CLASS__);
        }

        $this->commandLoaderServiceId = $commandLoaderServiceId;
        $this->commandTag = $commandTag;
        $this->noPreloadTag = $noPreloadTag;
        $this->privateTagName = $privateTagName;
    }

    public function process(ContainerBuilder $container)
    {
        $commandServices = $container->findTaggedServiceIds($this->commandTag, true);
        $lazyCommandMap = [];
        $lazyCommandRefs = [];
        $serviceIds = [];

        foreach ($commandServices as $id => $tags) {
            $definition = $container->getDefinition($id);
            $definition->addTag($this->noPreloadTag);
            $class = $container->getParameterBag()->resolveValue($definition->getClass());

            if (isset($tags[0]['command'])) {
                $aliases = $tags[0]['command'];
            } else {
                if (!$r = $container->getReflectionClass($class)) {
                    throw new InvalidArgumentException(sprintf('Class "%s" used for service "%s" cannot be found.', $class, $id));
                }
                if (!$r->isSubclassOf(Command::class)) {
                    throw new InvalidArgumentException(sprintf('The service "%s" tagged "%s" must be a subclass of "%s".', $id, $this->commandTag, Command::class));
                }
                $aliases = str_replace('%', '%%', $class::getDefaultName() ?? '');
            }

            $aliases = explode('|', $aliases ?? '');
            $commandName = array_shift($aliases);

            if ($isHidden = '' === $commandName) {
                $commandName = array_shift($aliases);
            }

            if (null === $commandName) {
                if (!$definition->isPublic() || $definition->isPrivate() || $definition->hasTag($this->privateTagName)) {
                    $commandId = 'console.command.public_alias.'.$id;
                    $container->setAlias($commandId, $id)->setPublic(true);
                    $id = $commandId;
                }
                $serviceIds[] = $id;

                continue;
            }

            $description = $tags[0]['description'] ?? null;

            unset($tags[0]);
            $lazyCommandMap[$commandName] = $id;
            $lazyCommandRefs[$id] = new TypedReference($id, $class);

            foreach ($aliases as $alias) {
                $lazyCommandMap[$alias] = $id;
            }

            foreach ($tags as $tag) {
                if (isset($tag['command'])) {
                    $aliases[] = $tag['command'];
                    $lazyCommandMap[$tag['command']] = $id;
                }

                $description = $description ?? $tag['description'] ?? null;
            }

            $definition->addMethodCall('setName', [$commandName]);

            if ($aliases) {
                $definition->addMethodCall('setAliases', [$aliases]);
            }

            if ($isHidden) {
                $definition->addMethodCall('setHidden', [true]);
            }

            if (!$description) {
                if (!$r = $container->getReflectionClass($class)) {
                    throw new InvalidArgumentException(sprintf('Class "%s" used for service "%s" cannot be found.', $class, $id));
                }
                if (!$r->isSubclassOf(Command::class)) {
                    throw new InvalidArgumentException(sprintf('The service "%s" tagged "%s" must be a subclass of "%s".', $id, $this->commandTag, Command::class));
                }
                $description = str_replace('%', '%%', $class::getDefaultDescription() ?? '');
            }

            if ($description) {
                $definition->addMethodCall('setDescription', [$description]);

                $container->register('.'.$id.'.lazy', LazyCommand::class)
                    ->setArguments([$commandName, $aliases, $description, $isHidden, new ServiceClosureArgument($lazyCommandRefs[$id])]);

                $lazyCommandRefs[$id] = new Reference('.'.$id.'.lazy');
            }
        }

        $container
            ->register($this->commandLoaderServiceId, ContainerCommandLoader::class)
            ->setPublic(true)
            ->addTag($this->noPreloadTag)
            ->setArguments([ServiceLocatorTagPass::register($container, $lazyCommandRefs), $lazyCommandMap]);

        $container->setParameter('console.command.ids', $serviceIds);
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Descriptor;

use Symfony\Component\Console\Application;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Exception\CommandNotFoundException;

/**
 * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
 *
 * @internal
 */
class ApplicationDescription
{
    public const GLOBAL_NAMESPACE = '_global';

    private $application;
    private $namespace;
    private $showHidden;

    /**
     * @var array
     */
    private $namespaces;

    /**
     * @var array<string, Command>
     */
    private $commands;

    /**
     * @var array<string, Command>
     */
    private $aliases;

    public function __construct(Application $application, string $namespace = null, bool $showHidden = false)
    {
        $this->application = $application;
        $this->namespace = $namespace;
        $this->showHidden = $showHidden;
    }

    public function getNamespaces(): array
    {
        if (null === $this->namespaces) {
            $this->inspectApplication();
        }

        return $this->namespaces;
    }

    /**
     * @return Command[]
     */
    public function getCommands(): array
    {
        if (null === $this->commands) {
            $this->inspectApplication();
        }

        return $this->commands;
    }

    /**
     * @throws CommandNotFoundException
     */
    public function getCommand(string $name): Command
    {
        if (!isset($this->commands[$name]) && !isset($this->aliases[$name])) {
            throw new CommandNotFoundException(sprintf('Command "%s" does not exist.', $name));
        }

        return $this->commands[$name] ?? $this->aliases[$name];
    }

    private function inspectApplication()
    {
        $this->commands = [];
        $this->namespaces = [];

        $all = $this->application->all($this->namespace ? $this->application->findNamespace($this->namespace) : null);
        foreach ($this->sortCommands($all) as $namespace => $commands) {
            $names = [];

            /** @var Command $command */
            foreach ($commands as $name => $command) {
                if (!$command->getName() || (!$this->showHidden && $command->isHidden())) {
                    continue;
                }

                if ($command->getName() === $name) {
                    $this->commands[$name] = $command;
                } else {
                    $this->aliases[$name] = $command;
                }

                $names[] = $name;
            }

            $this->namespaces[$namespace] = ['id' => $namespace, 'commands' => $names];
        }
    }

    private function sortCommands(array $commands): array
    {
        $namespacedCommands = [];
        $globalCommands = [];
        $sortedCommands = [];
        foreach ($commands as $name => $command) {
            $key = $this->application->extractNamespace($name, 1);
            if (\in_array($key, ['', self::GLOBAL_NAMESPACE], true)) {
                $globalCommands[$name] = $command;
            } else {
                $namespacedCommands[$key][$name] = $command;
            }
        }

        if ($globalCommands) {
            ksort($globalCommands);
            $sortedCommands[self::GLOBAL_NAMESPACE] = $globalCommands;
        }

        if ($namespacedCommands) {
            ksort($namespacedCommands, \SORT_STRING);
            foreach ($namespacedCommands as $key => $commandsSet) {
                ksort($commandsSet);
                $sortedCommands[$key] = $commandsSet;
            }
        }

        return $sortedCommands;
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Descriptor;

use Symfony\Component\Console\Application;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Exception\InvalidArgumentException;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputDefinition;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

/**
 * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
 *
 * @internal
 */
abstract class Descriptor implements DescriptorInterface
{
    /**
     * @var OutputInterface
     */
    protected $output;

    /**
     * {@inheritdoc}
     */
    public function describe(OutputInterface $output, object $object, array $options = [])
    {
        $this->output = $output;

        switch (true) {
            case $object instanceof InputArgument:
                $this->describeInputArgument($object, $options);
                break;
            case $object instanceof InputOption:
                $this->describeInputOption($object, $options);
                break;
            case $object instanceof InputDefinition:
                $this->describeInputDefinition($object, $options);
                break;
            case $object instanceof Command:
                $this->describeCommand($object, $options);
                break;
            case $object instanceof Application:
                $this->describeApplication($object, $options);
                break;
            default:
                throw new InvalidArgumentException(sprintf('Object of type "%s" is not describable.', get_debug_type($object)));
        }
    }

    /**
     * Writes content to output.
     */
    protected function write(string $content, bool $decorated = false)
    {
        $this->output->write($content, false, $decorated ? OutputInterface::OUTPUT_NORMAL : OutputInterface::OUTPUT_RAW);
    }

    /**
     * Describes an InputArgument instance.
     */
    abstract protected function describeInputArgument(InputArgument $argument, array $options = []);

    /**
     * Describes an InputOption instance.
     */
    abstract protected function describeInputOption(InputOption $option, array $options = []);

    /**
     * Describes an InputDefinition instance.
     */
    abstract protected function describeInputDefinition(InputDefinition $definition, array $options = []);

    /**
     * Describes a Command instance.
     */
    abstract protected function describeCommand(Command $command, array $options = []);

    /**
     * Describes an Application instance.
     */
    abstract protected function describeApplication(Application $application, array $options = []);
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Descriptor;

use Symfony\Component\Console\Output\OutputInterface;

/**
 * Descriptor interface.
 *
 * @author Jean-François Simon <contact@jfsimon.fr>
 */
interface DescriptorInterface
{
    public function describe(OutputInterface $output, object $object, array $options = []);
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Descriptor;

use Symfony\Component\Console\Application;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputDefinition;
use Symfony\Component\Console\Input\InputOption;

/**
 * JSON descriptor.
 *
 * @author Jean-François Simon <contact@jfsimon.fr>
 *
 * @internal
 */
class JsonDescriptor extends Descriptor
{
    /**
     * {@inheritdoc}
     */
    protected function describeInputArgument(InputArgument $argument, array $options = [])
    {
        $this->writeData($this->getInputArgumentData($argument), $options);
    }

    /**
     * {@inheritdoc}
     */
    protected function describeInputOption(InputOption $option, array $options = [])
    {
        $this->writeData($this->getInputOptionData($option), $options);
        if ($option->isNegatable()) {
            $this->writeData($this->getInputOptionData($option, true), $options);
        }
    }

    /**
     * {@inheritdoc}
     */
    protected function describeInputDefinition(InputDefinition $definition, array $options = [])
    {
        $this->writeData($this->getInputDefinitionData($definition), $options);
    }

    /**
     * {@inheritdoc}
     */
    protected function describeCommand(Command $command, array $options = [])
    {
        $this->writeData($this->getCommandData($command, $options['short'] ?? false), $options);
    }

    /**
     * {@inheritdoc}
     */
    protected function describeApplication(Application $application, array $options = [])
    {
        $describedNamespace = $options['namespace'] ?? null;
        $description = new ApplicationDescription($application, $describedNamespace, true);
        $commands = [];

        foreach ($description->getCommands() as $command) {
            $commands[] = $this->getCommandData($command, $options['short'] ?? false);
        }

        $data = [];
        if ('UNKNOWN' !== $application->getName()) {
            $data['application']['name'] = $application->getName();
            if ('UNKNOWN' !== $application->getVersion()) {
                $data['application']['version'] = $application->getVersion();
            }
        }

        $data['commands'] = $commands;

        if ($describedNamespace) {
            $data['namespace'] = $describedNamespace;
        } else {
            $data['namespaces'] = array_values($description->getNamespaces());
        }

        $this->writeData($data, $options);
    }

    /**
     * Writes data as json.
     */
    private function writeData(array $data, array $options)
    {
        $flags = $options['json_encoding'] ?? 0;

        $this->write(json_encode($data, $flags));
    }

    private function getInputArgumentData(InputArgument $argument): array
    {
        return [
            'name' => $argument->getName(),
            'is_required' => $argument->isRequired(),
            'is_array' => $argument->isArray(),
            'description' => preg_replace('/\s*[\r\n]\s*/', ' ', $argument->getDescription()),
            'default' => \INF === $argument->getDefault() ? 'INF' : $argument->getDefault(),
        ];
    }

    private function getInputOptionData(InputOption $option, bool $negated = false): array
    {
        return $negated ? [
            'name' => '--no-'.$option->getName(),
            'shortcut' => '',
            'accept_value' => false,
            'is_value_required' => false,
            'is_multiple' => false,
            'description' => 'Negate the "--'.$option->getName().'" option',
            'default' => false,
        ] : [
            'name' => '--'.$option->getName(),
            'shortcut' => $option->getShortcut() ? '-'.str_replace('|', '|-', $option->getShortcut()) : '',
            'accept_value' => $option->acceptValue(),
            'is_value_required' => $option->isValueRequired(),
            'is_multiple' => $option->isArray(),
            'description' => preg_replace('/\s*[\r\n]\s*/', ' ', $option->getDescription()),
            'default' => \INF === $option->getDefault() ? 'INF' : $option->getDefault(),
        ];
    }

    private function getInputDefinitionData(InputDefinition $definition): array
    {
        $inputArguments = [];
        foreach ($definition->getArguments() as $name => $argument) {
            $inputArguments[$name] = $this->getInputArgumentData($argument);
        }

        $inputOptions = [];
        foreach ($definition->getOptions() as $name => $option) {
            $inputOptions[$name] = $this->getInputOptionData($option);
            if ($option->isNegatable()) {
                $inputOptions['no-'.$name] = $this->getInputOptionData($option, true);
            }
        }

        return ['arguments' => $inputArguments, 'options' => $inputOptions];
    }

    private function getCommandData(Command $command, bool $short = false): array
    {
        $data = [
            'name' => $command->getName(),
            'description' => $command->getDescription(),
        ];

        if ($short) {
            $data += [
                'usage' => $command->getAliases(),
            ];
        } else {
            $command->mergeApplicationDefinition(false);

            $data += [
                'usage' => array_merge([$command->getSynopsis()], $command->getUsages(), $command->getAliases()),
                'help' => $command->getProcessedHelp(),
                'definition' => $this->getInputDefinitionData($command->getDefinition()),
            ];
        }

        $data['hidden'] = $command->isHidden();

        return $data;
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Descriptor;

use Symfony\Component\Console\Application;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Helper\Helper;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputDefinition;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

/**
 * Markdown descriptor.
 *
 * @author Jean-François Simon <contact@jfsimon.fr>
 *
 * @internal
 */
class MarkdownDescriptor extends Descriptor
{
    /**
     * {@inheritdoc}
     */
    public function describe(OutputInterface $output, object $object, array $options = [])
    {
        $decorated = $output->isDecorated();
        $output->setDecorated(false);

        parent::describe($output, $object, $options);

        $output->setDecorated($decorated);
    }

    /**
     * {@inheritdoc}
     */
    protected function write(string $content, bool $decorated = true)
    {
        parent::write($content, $decorated);
    }

    /**
     * {@inheritdoc}
     */
    protected function describeInputArgument(InputArgument $argument, array $options = [])
    {
        $this->write(
            '#### `'.($argument->getName() ?: '<none>')."`\n\n"
            .($argument->getDescription() ? preg_replace('/\s*[\r\n]\s*/', "\n", $argument->getDescription())."\n\n" : '')
            .'* Is required: '.($argument->isRequired() ? 'yes' : 'no')."\n"
            .'* Is array: '.($argument->isArray() ? 'yes' : 'no')."\n"
            .'* Default: `'.str_replace("\n", '', var_export($argument->getDefault(), true)).'`'
        );
    }

    /**
     * {@inheritdoc}
     */
    protected function describeInputOption(InputOption $option, array $options = [])
    {
        $name = '--'.$option->getName();
        if ($option->isNegatable()) {
            $name .= '|--no-'.$option->getName();
        }
        if ($option->getShortcut()) {
            $name .= '|-'.str_replace('|', '|-', $option->getShortcut()).'';
        }

        $this->write(
            '#### `'.$name.'`'."\n\n"
            .($option->getDescription() ? preg_replace('/\s*[\r\n]\s*/', "\n", $option->getDescription())."\n\n" : '')
            .'* Accept value: '.($option->acceptValue() ? 'yes' : 'no')."\n"
            .'* Is value required: '.($option->isValueRequired() ? 'yes' : 'no')."\n"
            .'* Is multiple: '.($option->isArray() ? 'yes' : 'no')."\n"
            .'* Is negatable: '.($option->isNegatable() ? 'yes' : 'no')."\n"
            .'* Default: `'.str_replace("\n", '', var_export($option->getDefault(), true)).'`'
        );
    }

    /**
     * {@inheritdoc}
     */
    protected function describeInputDefinition(InputDefinition $definition, array $options = [])
    {
        if ($showArguments = \count($definition->getArguments()) > 0) {
            $this->write('### Arguments');
            foreach ($definition->getArguments() as $argument) {
                $this->write("\n\n");
                if (null !== $describeInputArgument = $this->describeInputArgument($argument)) {
                    $this->write($describeInputArgument);
                }
            }
        }

        if (\count($definition->getOptions()) > 0) {
            if ($showArguments) {
                $this->write("\n\n");
            }

            $this->write('### Options');
            foreach ($definition->getOptions() as $option) {
                $this->write("\n\n");
                if (null !== $describeInputOption = $this->describeInputOption($option)) {
                    $this->write($describeInputOption);
                }
            }
        }
    }

    /**
     * {@inheritdoc}
     */
    protected function describeCommand(Command $command, array $options = [])
    {
        if ($options['short'] ?? false) {
            $this->write(
                '`'.$command->getName()."`\n"
                .str_repeat('-', Helper::width($command->getName()) + 2)."\n\n"
                .($command->getDescription() ? $command->getDescription()."\n\n" : '')
                .'### Usage'."\n\n"
                .array_reduce($command->getAliases(), function ($carry, $usage) {
                    return $carry.'* `'.$usage.'`'."\n";
                })
            );

            return;
        }

        $command->mergeApplicationDefinition(false);

        $this->write(
            '`'.$command->getName()."`\n"
            .str_repeat('-', Helper::width($command->getName()) + 2)."\n\n"
            .($command->getDescription() ? $command->getDescription()."\n\n" : '')
            .'### Usage'."\n\n"
            .array_reduce(array_merge([$command->getSynopsis()], $command->getAliases(), $command->getUsages()), function ($carry, $usage) {
                return $carry.'* `'.$usage.'`'."\n";
            })
        );

        if ($help = $command->getProcessedHelp()) {
            $this->write("\n");
            $this->write($help);
        }

        $definition = $command->getDefinition();
        if ($definition->getOptions() || $definition->getArguments()) {
            $this->write("\n\n");
            $this->describeInputDefinition($definition);
        }
    }

    /**
     * {@inheritdoc}
     */
    protected function describeApplication(Application $application, array $options = [])
    {
        $describedNamespace = $options['namespace'] ?? null;
        $description = new ApplicationDescription($application, $describedNamespace);
        $title = $this->getApplicationTitle($application);

        $this->write($title."\n".str_repeat('=', Helper::width($title)));

        foreach ($description->getNamespaces() as $namespace) {
            if (ApplicationDescription::GLOBAL_NAMESPACE !== $namespace['id']) {
                $this->write("\n\n");
                $this->write('**'.$namespace['id'].':**');
            }

            $this->write("\n\n");
            $this->write(implode("\n", array_map(function ($commandName) use ($description) {
                return sprintf('* [`%s`](#%s)', $commandName, str_replace(':', '', $description->getCommand($commandName)->getName()));
            }, $namespace['commands'])));
        }

        foreach ($description->getCommands() as $command) {
            $this->write("\n\n");
            if (null !== $describeCommand = $this->describeCommand($command, $options)) {
                $this->write($describeCommand);
            }
        }
    }

    private function getApplicationTitle(Application $application): string
    {
        if ('UNKNOWN' !== $application->getName()) {
            if ('UNKNOWN' !== $application->getVersion()) {
                return sprintf('%s %s', $application->getName(), $application->getVersion());
            }

            return $application->getName();
        }

        return 'Console Tool';
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Descriptor;

use Symfony\Component\Console\Application;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Formatter\OutputFormatter;
use Symfony\Component\Console\Helper\Helper;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputDefinition;
use Symfony\Component\Console\Input\InputOption;

/**
 * Text descriptor.
 *
 * @author Jean-François Simon <contact@jfsimon.fr>
 *
 * @internal
 */
class TextDescriptor extends Descriptor
{
    /**
     * {@inheritdoc}
     */
    protected function describeInputArgument(InputArgument $argument, array $options = [])
    {
        if (null !== $argument->getDefault() && (!\is_array($argument->getDefault()) || \count($argument->getDefault()))) {
            $default = sprintf('<comment> [default: %s]</comment>', $this->formatDefaultValue($argument->getDefault()));
        } else {
            $default = '';
        }

        $totalWidth = $options['total_width'] ?? Helper::width($argument->getName());
        $spacingWidth = $totalWidth - \strlen($argument->getName());

        $this->writeText(sprintf('  <info>%s</info>  %s%s%s',
            $argument->getName(),
            str_repeat(' ', $spacingWidth),
            // + 4 = 2 spaces before <info>, 2 spaces after </info>
            preg_replace('/\s*[\r\n]\s*/', "\n".str_repeat(' ', $totalWidth + 4), $argument->getDescription()),
            $default
        ), $options);
    }

    /**
     * {@inheritdoc}
     */
    protected function describeInputOption(InputOption $option, array $options = [])
    {
        if ($option->acceptValue() && null !== $option->getDefault() && (!\is_array($option->getDefault()) || \count($option->getDefault()))) {
            $default = sprintf('<comment> [default: %s]</comment>', $this->formatDefaultValue($option->getDefault()));
        } else {
            $default = '';
        }

        $value = '';
        if ($option->acceptValue()) {
            $value = '='.strtoupper($option->getName());

            if ($option->isValueOptional()) {
                $value = '['.$value.']';
            }
        }

        $totalWidth = $options['total_width'] ?? $this->calculateTotalWidthForOptions([$option]);
        $synopsis = sprintf('%s%s',
            $option->getShortcut() ? sprintf('-%s, ', $option->getShortcut()) : '    ',
            sprintf($option->isNegatable() ? '--%1$s|--no-%1$s' : '--%1$s%2$s', $option->getName(), $value)
        );

        $spacingWidth = $totalWidth - Helper::width($synopsis);

        $this->writeText(sprintf('  <info>%s</info>  %s%s%s%s',
            $synopsis,
            str_repeat(' ', $spacingWidth),
            // + 4 = 2 spaces before <info>, 2 spaces after </info>
            preg_replace('/\s*[\r\n]\s*/', "\n".str_repeat(' ', $totalWidth + 4), $option->getDescription()),
            $default,
            $option->isArray() ? '<comment> (multiple values allowed)</comment>' : ''
        ), $options);
    }

    /**
     * {@inheritdoc}
     */
    protected function describeInputDefinition(InputDefinition $definition, array $options = [])
    {
        $totalWidth = $this->calculateTotalWidthForOptions($definition->getOptions());
        foreach ($definition->getArguments() as $argument) {
            $totalWidth = max($totalWidth, Helper::width($argument->getName()));
        }

        if ($definition->getArguments()) {
            $this->writeText('<comment>Arguments:</comment>', $options);
            $this->writeText("\n");
            foreach ($definition->getArguments() as $argument) {
                $this->describeInputArgument($argument, array_merge($options, ['total_width' => $totalWidth]));
                $this->writeText("\n");
            }
        }

        if ($definition->getArguments() && $definition->getOptions()) {
            $this->writeText("\n");
        }

        if ($definition->getOptions()) {
            $laterOptions = [];

            $this->writeText('<comment>Options:</comment>', $options);
            foreach ($definition->getOptions() as $option) {
                if (\strlen($option->getShortcut() ?? '') > 1) {
                    $laterOptions[] = $option;
                    continue;
                }
                $this->writeText("\n");
                $this->describeInputOption($option, array_merge($options, ['total_width' => $totalWidth]));
            }
            foreach ($laterOptions as $option) {
                $this->writeText("\n");
                $this->describeInputOption($option, array_merge($options, ['total_width' => $totalWidth]));
            }
        }
    }

    /**
     * {@inheritdoc}
     */
    protected function describeCommand(Command $command, array $options = [])
    {
        $command->mergeApplicationDefinition(false);

        if ($description = $command->getDescription()) {
            $this->writeText('<comment>Description:</comment>', $options);
            $this->writeText("\n");
            $this->writeText('  '.$description);
            $this->writeText("\n\n");
        }

        $this->writeText('<comment>Usage:</comment>', $options);
        foreach (array_merge([$command->getSynopsis(true)], $command->getAliases(), $command->getUsages()) as $usage) {
            $this->writeText("\n");
            $this->writeText('  '.OutputFormatter::escape($usage), $options);
        }
        $this->writeText("\n");

        $definition = $command->getDefinition();
        if ($definition->getOptions() || $definition->getArguments()) {
            $this->writeText("\n");
            $this->describeInputDefinition($definition, $options);
            $this->writeText("\n");
        }

        $help = $command->getProcessedHelp();
        if ($help && $help !== $description) {
            $this->writeText("\n");
            $this->writeText('<comment>Help:</comment>', $options);
            $this->writeText("\n");
            $this->writeText('  '.str_replace("\n", "\n  ", $help), $options);
            $this->writeText("\n");
        }
    }

    /**
     * {@inheritdoc}
     */
    protected function describeApplication(Application $application, array $options = [])
    {
        $describedNamespace = $options['namespace'] ?? null;
        $description = new ApplicationDescription($application, $describedNamespace);

        if (isset($options['raw_text']) && $options['raw_text']) {
            $width = $this->getColumnWidth($description->getCommands());

            foreach ($description->getCommands() as $command) {
                $this->writeText(sprintf("%-{$width}s %s", $command->getName(), $command->getDescription()), $options);
                $this->writeText("\n");
            }
        } else {
            if ('' != $help = $application->getHelp()) {
                $this->writeText("$help\n\n", $options);
            }

            $this->writeText("<comment>Usage:</comment>\n", $options);
            $this->writeText("  command [options] [arguments]\n\n", $options);

            $this->describeInputDefinition(new InputDefinition($application->getDefinition()->getOptions()), $options);

            $this->writeText("\n");
            $this->writeText("\n");

            $commands = $description->getCommands();
            $namespaces = $description->getNamespaces();
            if ($describedNamespace && $namespaces) {
                // make sure all alias commands are included when describing a specific namespace
                $describedNamespaceInfo = reset($namespaces);
                foreach ($describedNamespaceInfo['commands'] as $name) {
                    $commands[$name] = $description->getCommand($name);
                }
            }

            // calculate max. width based on available commands per namespace
            $width = $this->getColumnWidth(array_merge(...array_values(array_map(function ($namespace) use ($commands) {
                return array_intersect($namespace['commands'], array_keys($commands));
            }, array_values($namespaces)))));

            if ($describedNamespace) {
                $this->writeText(sprintf('<comment>Available commands for the "%s" namespace:</comment>', $describedNamespace), $options);
            } else {
                $this->writeText('<comment>Available commands:</comment>', $options);
            }

            foreach ($namespaces as $namespace) {
                $namespace['commands'] = array_filter($namespace['commands'], function ($name) use ($commands) {
                    return isset($commands[$name]);
                });

                if (!$namespace['commands']) {
                    continue;
                }

                if (!$describedNamespace && ApplicationDescription::GLOBAL_NAMESPACE !== $namespace['id']) {
                    $this->writeText("\n");
                    $this->writeText(' <comment>'.$namespace['id'].'</comment>', $options);
                }

                foreach ($namespace['commands'] as $name) {
                    $this->writeText("\n");
                    $spacingWidth = $width - Helper::width($name);
                    $command = $commands[$name];
                    $commandAliases = $name === $command->getName() ? $this->getCommandAliasesText($command) : '';
                    $this->writeText(sprintf('  <info>%s</info>%s%s', $name, str_repeat(' ', $spacingWidth), $commandAliases.$command->getDescription()), $options);
                }
            }

            $this->writeText("\n");
        }
    }

    /**
     * {@inheritdoc}
     */
    private function writeText(string $content, array $options = [])
    {
        $this->write(
            isset($options['raw_text']) && $options['raw_text'] ? strip_tags($content) : $content,
            isset($options['raw_output']) ? !$options['raw_output'] : true
        );
    }

    /**
     * Formats command aliases to show them in the command description.
     */
    private function getCommandAliasesText(Command $command): string
    {
        $text = '';
        $aliases = $command->getAliases();

        if ($aliases) {
            $text = '['.implode('|', $aliases).'] ';
        }

        return $text;
    }

    /**
     * Formats input option/argument default value.
     *
     * @param mixed $default
     */
    private function formatDefaultValue($default): string
    {
        if (\INF === $default) {
            return 'INF';
        }

        if (\is_string($default)) {
            $default = OutputFormatter::escape($default);
        } elseif (\is_array($default)) {
            foreach ($default as $key => $value) {
                if (\is_string($value)) {
                    $default[$key] = OutputFormatter::escape($value);
                }
            }
        }

        return str_replace('\\\\', '\\', json_encode($default, \JSON_UNESCAPED_SLASHES | \JSON_UNESCAPED_UNICODE));
    }

    /**
     * @param array<Command|string> $commands
     */
    private function getColumnWidth(array $commands): int
    {
        $widths = [];

        foreach ($commands as $command) {
            if ($command instanceof Command) {
                $widths[] = Helper::width($command->getName());
                foreach ($command->getAliases() as $alias) {
                    $widths[] = Helper::width($alias);
                }
            } else {
                $widths[] = Helper::width($command);
            }
        }

        return $widths ? max($widths) + 2 : 0;
    }

    /**
     * @param InputOption[] $options
     */
    private function calculateTotalWidthForOptions(array $options): int
    {
        $totalWidth = 0;
        foreach ($options as $option) {
            // "-" + shortcut + ", --" + name
            $nameLength = 1 + max(Helper::width($option->getShortcut()), 1) + 4 + Helper::width($option->getName());
            if ($option->isNegatable()) {
                $nameLength += 6 + Helper::width($option->getName()); // |--no- + name
            } elseif ($option->acceptValue()) {
                $valueLength = 1 + Helper::width($option->getName()); // = + value
                $valueLength += $option->isValueOptional() ? 2 : 0; // [ + ]

                $nameLength += $valueLength;
            }
            $totalWidth = max($totalWidth, $nameLength);
        }

        return $totalWidth;
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Descriptor;

use Symfony\Component\Console\Application;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputDefinition;
use Symfony\Component\Console\Input\InputOption;

/**
 * XML descriptor.
 *
 * @author Jean-François Simon <contact@jfsimon.fr>
 *
 * @internal
 */
class XmlDescriptor extends Descriptor
{
    public function getInputDefinitionDocument(InputDefinition $definition): \DOMDocument
    {
        $dom = new \DOMDocument('1.0', 'UTF-8');
        $dom->appendChild($definitionXML = $dom->createElement('definition'));

        $definitionXML->appendChild($argumentsXML = $dom->createElement('arguments'));
        foreach ($definition->getArguments() as $argument) {
            $this->appendDocument($argumentsXML, $this->getInputArgumentDocument($argument));
        }

        $definitionXML->appendChild($optionsXML = $dom->createElement('options'));
        foreach ($definition->getOptions() as $option) {
            $this->appendDocument($optionsXML, $this->getInputOptionDocument($option));
        }

        return $dom;
    }

    public function getCommandDocument(Command $command, bool $short = false): \DOMDocument
    {
        $dom = new \DOMDocument('1.0', 'UTF-8');
        $dom->appendChild($commandXML = $dom->createElement('command'));

        $commandXML->setAttribute('id', $command->getName());
        $commandXML->setAttribute('name', $command->getName());
        $commandXML->setAttribute('hidden', $command->isHidden() ? 1 : 0);

        $commandXML->appendChild($usagesXML = $dom->createElement('usages'));

        $commandXML->appendChild($descriptionXML = $dom->createElement('description'));
        $descriptionXML->appendChild($dom->createTextNode(str_replace("\n", "\n ", $command->getDescription())));

        if ($short) {
            foreach ($command->getAliases() as $usage) {
                $usagesXML->appendChild($dom->createElement('usage', $usage));
            }
        } else {
            $command->mergeApplicationDefinition(false);

            foreach (array_merge([$command->getSynopsis()], $command->getAliases(), $command->getUsages()) as $usage) {
                $usagesXML->appendChild($dom->createElement('usage', $usage));
            }

            $commandXML->appendChild($helpXML = $dom->createElement('help'));
            $helpXML->appendChild($dom->createTextNode(str_replace("\n", "\n ", $command->getProcessedHelp())));

            $definitionXML = $this->getInputDefinitionDocument($command->getDefinition());
            $this->appendDocument($commandXML, $definitionXML->getElementsByTagName('definition')->item(0));
        }

        return $dom;
    }

    public function getApplicationDocument(Application $application, string $namespace = null, bool $short = false): \DOMDocument
    {
        $dom = new \DOMDocument('1.0', 'UTF-8');
        $dom->appendChild($rootXml = $dom->createElement('symfony'));

        if ('UNKNOWN' !== $application->getName()) {
            $rootXml->setAttribute('name', $application->getName());
            if ('UNKNOWN' !== $application->getVersion()) {
                $rootXml->setAttribute('version', $application->getVersion());
            }
        }

        $rootXml->appendChild($commandsXML = $dom->createElement('commands'));

        $description = new ApplicationDescription($application, $namespace, true);

        if ($namespace) {
            $commandsXML->setAttribute('namespace', $namespace);
        }

        foreach ($description->getCommands() as $command) {
            $this->appendDocument($commandsXML, $this->getCommandDocument($command, $short));
        }

        if (!$namespace) {
            $rootXml->appendChild($namespacesXML = $dom->createElement('namespaces'));

            foreach ($description->getNamespaces() as $namespaceDescription) {
                $namespacesXML->appendChild($namespaceArrayXML = $dom->createElement('namespace'));
                $namespaceArrayXML->setAttribute('id', $namespaceDescription['id']);

                foreach ($namespaceDescription['commands'] as $name) {
                    $namespaceArrayXML->appendChild($commandXML = $dom->createElement('command'));
                    $commandXML->appendChild($dom->createTextNode($name));
                }
            }
        }

        return $dom;
    }

    /**
     * {@inheritdoc}
     */
    protected function describeInputArgument(InputArgument $argument, array $options = [])
    {
        $this->writeDocument($this->getInputArgumentDocument($argument));
    }

    /**
     * {@inheritdoc}
     */
    protected function describeInputOption(InputOption $option, array $options = [])
    {
        $this->writeDocument($this->getInputOptionDocument($option));
    }

    /**
     * {@inheritdoc}
     */
    protected function describeInputDefinition(InputDefinition $definition, array $options = [])
    {
        $this->writeDocument($this->getInputDefinitionDocument($definition));
    }

    /**
     * {@inheritdoc}
     */
    protected function describeCommand(Command $command, array $options = [])
    {
        $this->writeDocument($this->getCommandDocument($command, $options['short'] ?? false));
    }

    /**
     * {@inheritdoc}
     */
    protected function describeApplication(Application $application, array $options = [])
    {
        $this->writeDocument($this->getApplicationDocument($application, $options['namespace'] ?? null, $options['short'] ?? false));
    }

    /**
     * Appends document children to parent node.
     */
    private function appendDocument(\DOMNode $parentNode, \DOMNode $importedParent)
    {
        foreach ($importedParent->childNodes as $childNode) {
            $parentNode->appendChild($parentNode->ownerDocument->importNode($childNode, true));
        }
    }

    /**
     * Writes DOM document.
     */
    private function writeDocument(\DOMDocument $dom)
    {
        $dom->formatOutput = true;
        $this->write($dom->saveXML());
    }

    private function getInputArgumentDocument(InputArgument $argument): \DOMDocument
    {
        $dom = new \DOMDocument('1.0', 'UTF-8');

        $dom->appendChild($objectXML = $dom->createElement('argument'));
        $objectXML->setAttribute('name', $argument->getName());
        $objectXML->setAttribute('is_required', $argument->isRequired() ? 1 : 0);
        $objectXML->setAttribute('is_array', $argument->isArray() ? 1 : 0);
        $objectXML->appendChild($descriptionXML = $dom->createElement('description'));
        $descriptionXML->appendChild($dom->createTextNode($argument->getDescription()));

        $objectXML->appendChild($defaultsXML = $dom->createElement('defaults'));
        $defaults = \is_array($argument->getDefault()) ? $argument->getDefault() : (\is_bool($argument->getDefault()) ? [var_export($argument->getDefault(), true)] : ($argument->getDefault() ? [$argument->getDefault()] : []));
        foreach ($defaults as $default) {
            $defaultsXML->appendChild($defaultXML = $dom->createElement('default'));
            $defaultXML->appendChild($dom->createTextNode($default));
        }

        return $dom;
    }

    private function getInputOptionDocument(InputOption $option): \DOMDocument
    {
        $dom = new \DOMDocument('1.0', 'UTF-8');

        $dom->appendChild($objectXML = $dom->createElement('option'));
        $objectXML->setAttribute('name', '--'.$option->getName());
        $pos = strpos($option->getShortcut() ?? '', '|');
        if (false !== $pos) {
            $objectXML->setAttribute('shortcut', '-'.substr($option->getShortcut(), 0, $pos));
            $objectXML->setAttribute('shortcuts', '-'.str_replace('|', '|-', $option->getShortcut()));
        } else {
            $objectXML->setAttribute('shortcut', $option->getShortcut() ? '-'.$option->getShortcut() : '');
        }
        $objectXML->setAttribute('accept_value', $option->acceptValue() ? 1 : 0);
        $objectXML->setAttribute('is_value_required', $option->isValueRequired() ? 1 : 0);
        $objectXML->setAttribute('is_multiple', $option->isArray() ? 1 : 0);
        $objectXML->appendChild($descriptionXML = $dom->createElement('description'));
        $descriptionXML->appendChild($dom->createTextNode($option->getDescription()));

        if ($option->acceptValue()) {
            $defaults = \is_array($option->getDefault()) ? $option->getDefault() : (\is_bool($option->getDefault()) ? [var_export($option->getDefault(), true)] : ($option->getDefault() ? [$option->getDefault()] : []));
            $objectXML->appendChild($defaultsXML = $dom->createElement('defaults'));

            if (!empty($defaults)) {
                foreach ($defaults as $default) {
                    $defaultsXML->appendChild($defaultXML = $dom->createElement('default'));
                    $defaultXML->appendChild($dom->createTextNode($default));
                }
            }
        }

        if ($option->isNegatable()) {
            $dom->appendChild($objectXML = $dom->createElement('option'));
            $objectXML->setAttribute('name', '--no-'.$option->getName());
            $objectXML->setAttribute('shortcut', '');
            $objectXML->setAttribute('accept_value', 0);
            $objectXML->setAttribute('is_value_required', 0);
            $objectXML->setAttribute('is_multiple', 0);
            $objectXML->appendChild($descriptionXML = $dom->createElement('description'));
            $descriptionXML->appendChild($dom->createTextNode('Negate the "--'.$option->getName().'" option'));
        }

        return $dom;
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Event;

/**
 * Allows to do things before the command is executed, like skipping the command or changing the input.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
final class ConsoleCommandEvent extends ConsoleEvent
{
    /**
     * The return code for skipped commands, this will also be passed into the terminate event.
     */
    public const RETURN_CODE_DISABLED = 113;

    /**
     * Indicates if the command should be run or skipped.
     */
    private $commandShouldRun = true;

    /**
     * Disables the command, so it won't be run.
     */
    public function disableCommand(): bool
    {
        return $this->commandShouldRun = false;
    }

    public function enableCommand(): bool
    {
        return $this->commandShouldRun = true;
    }

    /**
     * Returns true if the command is runnable, false otherwise.
     */
    public function commandShouldRun(): bool
    {
        return $this->commandShouldRun;
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Event;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

/**
 * Allows to handle throwables thrown while running a command.
 *
 * @author Wouter de Jong <wouter@wouterj.nl>
 */
final class ConsoleErrorEvent extends ConsoleEvent
{
    private $error;
    private $exitCode;

    public function __construct(InputInterface $input, OutputInterface $output, \Throwable $error, Command $command = null)
    {
        parent::__construct($command, $input, $output);

        $this->error = $error;
    }

    public function getError(): \Throwable
    {
        return $this->error;
    }

    public function setError(\Throwable $error): void
    {
        $this->error = $error;
    }

    public function setExitCode(int $exitCode): void
    {
        $this->exitCode = $exitCode;

        $r = new \ReflectionProperty($this->error, 'code');
        $r->setAccessible(true);
        $r->setValue($this->error, $this->exitCode);
    }

    public function getExitCode(): int
    {
        return $this->exitCode ?? (\is_int($this->error->getCode()) && 0 !== $this->error->getCode() ? $this->error->getCode() : 1);
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Event;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Contracts\EventDispatcher\Event;

/**
 * Allows to inspect input and output of a command.
 *
 * @author Francesco Levorato <git@flevour.net>
 */
class ConsoleEvent extends Event
{
    protected $command;

    private $input;
    private $output;

    public function __construct(?Command $command, InputInterface $input, OutputInterface $output)
    {
        $this->command = $command;
        $this->input = $input;
        $this->output = $output;
    }

    /**
     * Gets the command that is executed.
     *
     * @return Command|null
     */
    public function getCommand()
    {
        return $this->command;
    }

    /**
     * Gets the input instance.
     *
     * @return InputInterface
     */
    public function getInput()
    {
        return $this->input;
    }

    /**
     * Gets the output instance.
     *
     * @return OutputInterface
     */
    public function getOutput()
    {
        return $this->output;
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Event;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

/**
 * @author marie <marie@users.noreply.github.com>
 */
final class ConsoleSignalEvent extends ConsoleEvent
{
    private $handlingSignal;

    public function __construct(Command $command, InputInterface $input, OutputInterface $output, int $handlingSignal)
    {
        parent::__construct($command, $input, $output);
        $this->handlingSignal = $handlingSignal;
    }

    public function getHandlingSignal(): int
    {
        return $this->handlingSignal;
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Event;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

/**
 * Allows to manipulate the exit code of a command after its execution.
 *
 * @author Francesco Levorato <git@flevour.net>
 */
final class ConsoleTerminateEvent extends ConsoleEvent
{
    private $exitCode;

    public function __construct(Command $command, InputInterface $input, OutputInterface $output, int $exitCode)
    {
        parent::__construct($command, $input, $output);

        $this->setExitCode($exitCode);
    }

    public function setExitCode(int $exitCode): void
    {
        $this->exitCode = $exitCode;
    }

    public function getExitCode(): int
    {
        return $this->exitCode;
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\EventListener;

use Psr\Log\LoggerInterface;
use Symfony\Component\Console\ConsoleEvents;
use Symfony\Component\Console\Event\ConsoleErrorEvent;
use Symfony\Component\Console\Event\ConsoleEvent;
use Symfony\Component\Console\Event\ConsoleTerminateEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

/**
 * @author James Halsall <james.t.halsall@googlemail.com>
 * @author Robin Chalas <robin.chalas@gmail.com>
 */
class ErrorListener implements EventSubscriberInterface
{
    private $logger;

    public function __construct(LoggerInterface $logger = null)
    {
        $this->logger = $logger;
    }

    public function onConsoleError(ConsoleErrorEvent $event)
    {
        if (null === $this->logger) {
            return;
        }

        $error = $event->getError();

        if (!$inputString = $this->getInputString($event)) {
            $this->logger->critical('An error occurred while using the console. Message: "{message}"', ['exception' => $error, 'message' => $error->getMessage()]);

            return;
        }

        $this->logger->critical('Error thrown while running command "{command}". Message: "{message}"', ['exception' => $error, 'command' => $inputString, 'message' => $error->getMessage()]);
    }

    public function onConsoleTerminate(ConsoleTerminateEvent $event)
    {
        if (null === $this->logger) {
            return;
        }

        $exitCode = $event->getExitCode();

        if (0 === $exitCode) {
            return;
        }

        if (!$inputString = $this->getInputString($event)) {
            $this->logger->debug('The console exited with code "{code}"', ['code' => $exitCode]);

            return;
        }

        $this->logger->debug('Command "{command}" exited with code "{code}"', ['command' => $inputString, 'code' => $exitCode]);
    }

    public static function getSubscribedEvents()
    {
        return [
            ConsoleEvents::ERROR => ['onConsoleError', -128],
            ConsoleEvents::TERMINATE => ['onConsoleTerminate', -128],
        ];
    }

    private static function getInputString(ConsoleEvent $event): ?string
    {
        $commandName = $event->getCommand() ? $event->getCommand()->getName() : null;
        $input = $event->getInput();

        if (method_exists($input, '__toString')) {
            if ($commandName) {
                return str_replace(["'$commandName'", "\"$commandName\""], $commandName, (string) $input);
            }

            return (string) $input;
        }

        return $commandName;
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Exception;

/**
 * Represents an incorrect command name typed in the console.
 *
 * @author Jérôme Tamarelle <jerome@tamarelle.net>
 */
class CommandNotFoundException extends \InvalidArgumentException implements ExceptionInterface
{
    private $alternatives;

    /**
     * @param string          $message      Exception message to throw
     * @param string[]        $alternatives List of similar defined names
     * @param int             $code         Exception code
     * @param \Throwable|null $previous     Previous exception used for the exception chaining
     */
    public function __construct(string $message, array $alternatives = [], int $code = 0, \Throwable $previous = null)
    {
        parent::__construct($message, $code, $previous);

        $this->alternatives = $alternatives;
    }

    /**
     * @return string[]
     */
    public function getAlternatives()
    {
        return $this->alternatives;
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Exception;

/**
 * ExceptionInterface.
 *
 * @author Jérôme Tamarelle <jerome@tamarelle.net>
 */
interface ExceptionInterface extends \Throwable
{
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Exception;

/**
 * @author Jérôme Tamarelle <jerome@tamarelle.net>
 */
class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface
{
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Exception;

/**
 * Represents an incorrect option name or value typed in the console.
 *
 * @author Jérôme Tamarelle <jerome@tamarelle.net>
 */
class InvalidOptionException extends \InvalidArgumentException implements ExceptionInterface
{
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Exception;

/**
 * @author Jérôme Tamarelle <jerome@tamarelle.net>
 */
class LogicException extends \LogicException implements ExceptionInterface
{
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Exception;

/**
 * Represents failure to read input from stdin.
 *
 * @author Gabriel Ostrolucký <gabriel.ostrolucky@gmail.com>
 */
class MissingInputException extends RuntimeException implements ExceptionInterface
{
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Exception;

/**
 * Represents an incorrect namespace typed in the console.
 *
 * @author Pierre du Plessis <pdples@gmail.com>
 */
class NamespaceNotFoundException extends CommandNotFoundException
{
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Exception;

/**
 * @author Jérôme Tamarelle <jerome@tamarelle.net>
 */
class RuntimeException extends \RuntimeException implements ExceptionInterface
{
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Formatter;

/**
 * @author Tien Xuan Vo <tien.xuan.vo@gmail.com>
 */
final class NullOutputFormatter implements OutputFormatterInterface
{
    private $style;

    /**
     * {@inheritdoc}
     */
    public function format(?string $message): ?string
    {
        return null;
    }

    /**
     * {@inheritdoc}
     */
    public function getStyle(string $name): OutputFormatterStyleInterface
    {
        // to comply with the interface we must return a OutputFormatterStyleInterface
        return $this->style ?? $this->style = new NullOutputFormatterStyle();
    }

    /**
     * {@inheritdoc}
     */
    public function hasStyle(string $name): bool
    {
        return false;
    }

    /**
     * {@inheritdoc}
     */
    public function isDecorated(): bool
    {
        return false;
    }

    /**
     * {@inheritdoc}
     */
    public function setDecorated(bool $decorated): void
    {
        // do nothing
    }

    /**
     * {@inheritdoc}
     */
    public function setStyle(string $name, OutputFormatterStyleInterface $style): void
    {
        // do nothing
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Formatter;

/**
 * @author Tien Xuan Vo <tien.xuan.vo@gmail.com>
 */
final class NullOutputFormatterStyle implements OutputFormatterStyleInterface
{
    /**
     * {@inheritdoc}
     */
    public function apply(string $text): string
    {
        return $text;
    }

    /**
     * {@inheritdoc}
     */
    public function setBackground(string $color = null): void
    {
        // do nothing
    }

    /**
     * {@inheritdoc}
     */
    public function setForeground(string $color = null): void
    {
        // do nothing
    }

    /**
     * {@inheritdoc}
     */
    public function setOption(string $option): void
    {
        // do nothing
    }

    /**
     * {@inheritdoc}
     */
    public function setOptions(array $options): void
    {
        // do nothing
    }

    /**
     * {@inheritdoc}
     */
    public function unsetOption(string $option): void
    {
        // do nothing
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Formatter;

use Symfony\Component\Console\Exception\InvalidArgumentException;

use function Symfony\Component\String\b;

/**
 * Formatter class for console output.
 *
 * @author Konstantin Kudryashov <ever.zet@gmail.com>
 * @author Roland Franssen <franssen.roland@gmail.com>
 */
class OutputFormatter implements WrappableOutputFormatterInterface
{
    private $decorated;
    private $styles = [];
    private $styleStack;

    public function __clone()
    {
        $this->styleStack = clone $this->styleStack;
        foreach ($this->styles as $key => $value) {
            $this->styles[$key] = clone $value;
        }
    }

    /**
     * Escapes "<" and ">" special chars in given text.
     *
     * @return string
     */
    public static function escape(string $text)
    {
        $text = preg_replace('/([^\\\\]|^)([<>])/', '$1\\\\$2', $text);

        return self::escapeTrailingBackslash($text);
    }

    /**
     * Escapes trailing "\" in given text.
     *
     * @internal
     */
    public static function escapeTrailingBackslash(string $text): string
    {
        if (str_ends_with($text, '\\')) {
            $len = \strlen($text);
            $text = rtrim($text, '\\');
            $text = str_replace("\0", '', $text);
            $text .= str_repeat("\0", $len - \strlen($text));
        }

        return $text;
    }

    /**
     * Initializes console output formatter.
     *
     * @param OutputFormatterStyleInterface[] $styles Array of "name => FormatterStyle" instances
     */
    public function __construct(bool $decorated = false, array $styles = [])
    {
        $this->decorated = $decorated;

        $this->setStyle('error', new OutputFormatterStyle('white', 'red'));
        $this->setStyle('info', new OutputFormatterStyle('green'));
        $this->setStyle('comment', new OutputFormatterStyle('yellow'));
        $this->setStyle('question', new OutputFormatterStyle('black', 'cyan'));

        foreach ($styles as $name => $style) {
            $this->setStyle($name, $style);
        }

        $this->styleStack = new OutputFormatterStyleStack();
    }

    /**
     * {@inheritdoc}
     */
    public function setDecorated(bool $decorated)
    {
        $this->decorated = $decorated;
    }

    /**
     * {@inheritdoc}
     */
    public function isDecorated()
    {
        return $this->decorated;
    }

    /**
     * {@inheritdoc}
     */
    public function setStyle(string $name, OutputFormatterStyleInterface $style)
    {
        $this->styles[strtolower($name)] = $style;
    }

    /**
     * {@inheritdoc}
     */
    public function hasStyle(string $name)
    {
        return isset($this->styles[strtolower($name)]);
    }

    /**
     * {@inheritdoc}
     */
    public function getStyle(string $name)
    {
        if (!$this->hasStyle($name)) {
            throw new InvalidArgumentException(sprintf('Undefined style: "%s".', $name));
        }

        return $this->styles[strtolower($name)];
    }

    /**
     * {@inheritdoc}
     */
    public function format(?string $message)
    {
        return $this->formatAndWrap($message, 0);
    }

    /**
     * {@inheritdoc}
     */
    public function formatAndWrap(?string $message, int $width)
    {
        if (null === $message) {
            return '';
        }

        $offset = 0;
        $output = '';
        $openTagRegex = '[a-z](?:[^\\\\<>]*+ | \\\\.)*';
        $closeTagRegex = '[a-z][^<>]*+';
        $currentLineLength = 0;
        preg_match_all("#<(($openTagRegex) | /($closeTagRegex)?)>#ix", $message, $matches, \PREG_OFFSET_CAPTURE);
        foreach ($matches[0] as $i => $match) {
            $pos = $match[1];
            $text = $match[0];

            if (0 != $pos && '\\' == $message[$pos - 1]) {
                continue;
            }

            // add the text up to the next tag
            $output .= $this->applyCurrentStyle(substr($message, $offset, $pos - $offset), $output, $width, $currentLineLength);
            $offset = $pos + \strlen($text);

            // opening tag?
            if ($open = '/' != $text[1]) {
                $tag = $matches[1][$i][0];
            } else {
                $tag = $matches[3][$i][0] ?? '';
            }

            if (!$open && !$tag) {
                // </>
                $this->styleStack->pop();
            } elseif (null === $style = $this->createStyleFromString($tag)) {
                $output .= $this->applyCurrentStyle($text, $output, $width, $currentLineLength);
            } elseif ($open) {
                $this->styleStack->push($style);
            } else {
                $this->styleStack->pop($style);
            }
        }

        $output .= $this->applyCurrentStyle(substr($message, $offset), $output, $width, $currentLineLength);

        return strtr($output, ["\0" => '\\', '\\<' => '<', '\\>' => '>']);
    }

    /**
     * @return OutputFormatterStyleStack
     */
    public function getStyleStack()
    {
        return $this->styleStack;
    }

    /**
     * Tries to create new style instance from string.
     */
    private function createStyleFromString(string $string): ?OutputFormatterStyleInterface
    {
        if (isset($this->styles[$string])) {
            return $this->styles[$string];
        }

        if (!preg_match_all('/([^=]+)=([^;]+)(;|$)/', $string, $matches, \PREG_SET_ORDER)) {
            return null;
        }

        $style = new OutputFormatterStyle();
        foreach ($matches as $match) {
            array_shift($match);
            $match[0] = strtolower($match[0]);

            if ('fg' == $match[0]) {
                $style->setForeground(strtolower($match[1]));
            } elseif ('bg' == $match[0]) {
                $style->setBackground(strtolower($match[1]));
            } elseif ('href' === $match[0]) {
                $url = preg_replace('{\\\\([<>])}', '$1', $match[1]);
                $style->setHref($url);
            } elseif ('options' === $match[0]) {
                preg_match_all('([^,;]+)', strtolower($match[1]), $options);
                $options = array_shift($options);
                foreach ($options as $option) {
                    $style->setOption($option);
                }
            } else {
                return null;
            }
        }

        return $style;
    }

    /**
     * Applies current style from stack to text, if must be applied.
     */
    private function applyCurrentStyle(string $text, string $current, int $width, int &$currentLineLength): string
    {
        if ('' === $text) {
            return '';
        }

        if (!$width) {
            return $this->isDecorated() ? $this->styleStack->getCurrent()->apply($text) : $text;
        }

        if (!$currentLineLength && '' !== $current) {
            $text = ltrim($text);
        }

        if ($currentLineLength) {
            $prefix = substr($text, 0, $i = $width - $currentLineLength)."\n";
            $text = substr($text, $i);
        } else {
            $prefix = '';
        }

        preg_match('~(\\n)$~', $text, $matches);
        $text = $prefix.$this->addLineBreaks($text, $width);
        $text = rtrim($text, "\n").($matches[1] ?? '');

        if (!$currentLineLength && '' !== $current && "\n" !== substr($current, -1)) {
            $text = "\n".$text;
        }

        $lines = explode("\n", $text);

        foreach ($lines as $line) {
            $currentLineLength += \strlen($line);
            if ($width <= $currentLineLength) {
                $currentLineLength = 0;
            }
        }

        if ($this->isDecorated()) {
            foreach ($lines as $i => $line) {
                $lines[$i] = $this->styleStack->getCurrent()->apply($line);
            }
        }

        return implode("\n", $lines);
    }

    private function addLineBreaks(string $text, int $width): string
    {
        $encoding = mb_detect_encoding($text, null, true) ?: 'UTF-8';

        return b($text)->toCodePointString($encoding)->wordwrap($width, "\n", true)->toByteString($encoding);
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Formatter;

/**
 * Formatter interface for console output.
 *
 * @author Konstantin Kudryashov <ever.zet@gmail.com>
 */
interface OutputFormatterInterface
{
    /**
     * Sets the decorated flag.
     */
    public function setDecorated(bool $decorated);

    /**
     * Whether the output will decorate messages.
     *
     * @return bool
     */
    public function isDecorated();

    /**
     * Sets a new style.
     */
    public function setStyle(string $name, OutputFormatterStyleInterface $style);

    /**
     * Checks if output formatter has style with specified name.
     *
     * @return bool
     */
    public function hasStyle(string $name);

    /**
     * Gets style options from style with specified name.
     *
     * @return OutputFormatterStyleInterface
     *
     * @throws \InvalidArgumentException When style isn't defined
     */
    public function getStyle(string $name);

    /**
     * Formats a message according to the given styles.
     *
     * @return string|null
     */
    public function format(?string $message);
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Formatter;

use Symfony\Component\Console\Color;

/**
 * Formatter style class for defining styles.
 *
 * @author Konstantin Kudryashov <ever.zet@gmail.com>
 */
class OutputFormatterStyle implements OutputFormatterStyleInterface
{
    private $color;
    private $foreground;
    private $background;
    private $options;
    private $href;
    private $handlesHrefGracefully;

    /**
     * Initializes output formatter style.
     *
     * @param string|null $foreground The style foreground color name
     * @param string|null $background The style background color name
     */
    public function __construct(string $foreground = null, string $background = null, array $options = [])
    {
        $this->color = new Color($this->foreground = $foreground ?: '', $this->background = $background ?: '', $this->options = $options);
    }

    /**
     * {@inheritdoc}
     */
    public function setForeground(string $color = null)
    {
        $this->color = new Color($this->foreground = $color ?: '', $this->background, $this->options);
    }

    /**
     * {@inheritdoc}
     */
    public function setBackground(string $color = null)
    {
        $this->color = new Color($this->foreground, $this->background = $color ?: '', $this->options);
    }

    public function setHref(string $url): void
    {
        $this->href = $url;
    }

    /**
     * {@inheritdoc}
     */
    public function setOption(string $option)
    {
        $this->options[] = $option;
        $this->color = new Color($this->foreground, $this->background, $this->options);
    }

    /**
     * {@inheritdoc}
     */
    public function unsetOption(string $option)
    {
        $pos = array_search($option, $this->options);
        if (false !== $pos) {
            unset($this->options[$pos]);
        }

        $this->color = new Color($this->foreground, $this->background, $this->options);
    }

    /**
     * {@inheritdoc}
     */
    public function setOptions(array $options)
    {
        $this->color = new Color($this->foreground, $this->background, $this->options = $options);
    }

    /**
     * {@inheritdoc}
     */
    public function apply(string $text)
    {
        if (null === $this->handlesHrefGracefully) {
            $this->handlesHrefGracefully = 'JetBrains-JediTerm' !== getenv('TERMINAL_EMULATOR')
                && (!getenv('KONSOLE_VERSION') || (int) getenv('KONSOLE_VERSION') > 201100)
                && !isset($_SERVER['IDEA_INITIAL_DIRECTORY']);
        }

        if (null !== $this->href && $this->handlesHrefGracefully) {
            $text = "\033]8;;$this->href\033\\$text\033]8;;\033\\";
        }

        return $this->color->apply($text);
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Formatter;

/**
 * Formatter style interface for defining styles.
 *
 * @author Konstantin Kudryashov <ever.zet@gmail.com>
 */
interface OutputFormatterStyleInterface
{
    /**
     * Sets style foreground color.
     */
    public function setForeground(string $color = null);

    /**
     * Sets style background color.
     */
    public function setBackground(string $color = null);

    /**
     * Sets some specific style option.
     */
    public function setOption(string $option);

    /**
     * Unsets some specific style option.
     */
    public function unsetOption(string $option);

    /**
     * Sets multiple style options at once.
     */
    public function setOptions(array $options);

    /**
     * Applies the style to a given text.
     *
     * @return string
     */
    public function apply(string $text);
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Formatter;

use Symfony\Component\Console\Exception\InvalidArgumentException;
use Symfony\Contracts\Service\ResetInterface;

/**
 * @author Jean-François Simon <contact@jfsimon.fr>
 */
class OutputFormatterStyleStack implements ResetInterface
{
    /**
     * @var OutputFormatterStyleInterface[]
     */
    private $styles;

    private $emptyStyle;

    public function __construct(OutputFormatterStyleInterface $emptyStyle = null)
    {
        $this->emptyStyle = $emptyStyle ?? new OutputFormatterStyle();
        $this->reset();
    }

    /**
     * Resets stack (ie. empty internal arrays).
     */
    public function reset()
    {
        $this->styles = [];
    }

    /**
     * Pushes a style in the stack.
     */
    public function push(OutputFormatterStyleInterface $style)
    {
        $this->styles[] = $style;
    }

    /**
     * Pops a style from the stack.
     *
     * @return OutputFormatterStyleInterface
     *
     * @throws InvalidArgumentException When style tags incorrectly nested
     */
    public function pop(OutputFormatterStyleInterface $style = null)
    {
        if (empty($this->styles)) {
            return $this->emptyStyle;
        }

        if (null === $style) {
            return array_pop($this->styles);
        }

        foreach (array_reverse($this->styles, true) as $index => $stackedStyle) {
            if ($style->apply('') === $stackedStyle->apply('')) {
                $this->styles = \array_slice($this->styles, 0, $index);

                return $stackedStyle;
            }
        }

        throw new InvalidArgumentException('Incorrectly nested style tag found.');
    }

    /**
     * Computes current style with stacks top codes.
     *
     * @return OutputFormatterStyle
     */
    public function getCurrent()
    {
        if (empty($this->styles)) {
            return $this->emptyStyle;
        }

        return $this->styles[\count($this->styles) - 1];
    }

    /**
     * @return $this
     */
    public function setEmptyStyle(OutputFormatterStyleInterface $emptyStyle)
    {
        $this->emptyStyle = $emptyStyle;

        return $this;
    }

    /**
     * @return OutputFormatterStyleInterface
     */
    public function getEmptyStyle()
    {
        return $this->emptyStyle;
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Formatter;

/**
 * Formatter interface for console output that supports word wrapping.
 *
 * @author Roland Franssen <franssen.roland@gmail.com>
 */
interface WrappableOutputFormatterInterface extends OutputFormatterInterface
{
    /**
     * Formats a message according to the given styles, wrapping at `$width` (0 means no wrapping).
     */
    public function formatAndWrap(?string $message, int $width);
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Helper;

/**
 * Helps outputting debug information when running an external program from a command.
 *
 * An external program can be a Process, an HTTP request, or anything else.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class DebugFormatterHelper extends Helper
{
    private const COLORS = ['black', 'red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'white', 'default'];
    private $started = [];
    private $count = -1;

    /**
     * Starts a debug formatting session.
     *
     * @return string
     */
    public function start(string $id, string $message, string $prefix = 'RUN')
    {
        $this->started[$id] = ['border' => ++$this->count % \count(self::COLORS)];

        return sprintf("%s<bg=blue;fg=white> %s </> <fg=blue>%s</>\n", $this->getBorder($id), $prefix, $message);
    }

    /**
     * Adds progress to a formatting session.
     *
     * @return string
     */
    public function progress(string $id, string $buffer, bool $error = false, string $prefix = 'OUT', string $errorPrefix = 'ERR')
    {
        $message = '';

        if ($error) {
            if (isset($this->started[$id]['out'])) {
                $message .= "\n";
                unset($this->started[$id]['out']);
            }
            if (!isset($this->started[$id]['err'])) {
                $message .= sprintf('%s<bg=red;fg=white> %s </> ', $this->getBorder($id), $errorPrefix);
                $this->started[$id]['err'] = true;
            }

            $message .= str_replace("\n", sprintf("\n%s<bg=red;fg=white> %s </> ", $this->getBorder($id), $errorPrefix), $buffer);
        } else {
            if (isset($this->started[$id]['err'])) {
                $message .= "\n";
                unset($this->started[$id]['err']);
            }
            if (!isset($this->started[$id]['out'])) {
                $message .= sprintf('%s<bg=green;fg=white> %s </> ', $this->getBorder($id), $prefix);
                $this->started[$id]['out'] = true;
            }

            $message .= str_replace("\n", sprintf("\n%s<bg=green;fg=white> %s </> ", $this->getBorder($id), $prefix), $buffer);
        }

        return $message;
    }

    /**
     * Stops a formatting session.
     *
     * @return string
     */
    public function stop(string $id, string $message, bool $successful, string $prefix = 'RES')
    {
        $trailingEOL = isset($this->started[$id]['out']) || isset($this->started[$id]['err']) ? "\n" : '';

        if ($successful) {
            return sprintf("%s%s<bg=green;fg=white> %s </> <fg=green>%s</>\n", $trailingEOL, $this->getBorder($id), $prefix, $message);
        }

        $message = sprintf("%s%s<bg=red;fg=white> %s </> <fg=red>%s</>\n", $trailingEOL, $this->getBorder($id), $prefix, $message);

        unset($this->started[$id]['out'], $this->started[$id]['err']);

        return $message;
    }

    private function getBorder(string $id): string
    {
        return sprintf('<bg=%s> </>', self::COLORS[$this->started[$id]['border']]);
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'debug_formatter';
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Helper;

use Symfony\Component\Console\Descriptor\DescriptorInterface;
use Symfony\Component\Console\Descriptor\JsonDescriptor;
use Symfony\Component\Console\Descriptor\MarkdownDescriptor;
use Symfony\Component\Console\Descriptor\TextDescriptor;
use Symfony\Component\Console\Descriptor\XmlDescriptor;
use Symfony\Component\Console\Exception\InvalidArgumentException;
use Symfony\Component\Console\Output\OutputInterface;

/**
 * This class adds helper method to describe objects in various formats.
 *
 * @author Jean-François Simon <contact@jfsimon.fr>
 */
class DescriptorHelper extends Helper
{
    /**
     * @var DescriptorInterface[]
     */
    private $descriptors = [];

    public function __construct()
    {
        $this
            ->register('txt', new TextDescriptor())
            ->register('xml', new XmlDescriptor())
            ->register('json', new JsonDescriptor())
            ->register('md', new MarkdownDescriptor())
        ;
    }

    /**
     * Describes an object if supported.
     *
     * Available options are:
     * * format: string, the output format name
     * * raw_text: boolean, sets output type as raw
     *
     * @throws InvalidArgumentException when the given format is not supported
     */
    public function describe(OutputInterface $output, ?object $object, array $options = [])
    {
        $options = array_merge([
            'raw_text' => false,
            'format' => 'txt',
        ], $options);

        if (!isset($this->descriptors[$options['format']])) {
            throw new InvalidArgumentException(sprintf('Unsupported format "%s".', $options['format']));
        }

        $descriptor = $this->descriptors[$options['format']];
        $descriptor->describe($output, $object, $options);
    }

    /**
     * Registers a descriptor.
     *
     * @return $this
     */
    public function register(string $format, DescriptorInterface $descriptor)
    {
        $this->descriptors[$format] = $descriptor;

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'descriptor';
    }

    public function getFormats(): array
    {
        return array_keys($this->descriptors);
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Helper;

use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\VarDumper\Cloner\ClonerInterface;
use Symfony\Component\VarDumper\Cloner\VarCloner;
use Symfony\Component\VarDumper\Dumper\CliDumper;

/**
 * @author Roland Franssen <franssen.roland@gmail.com>
 */
final class Dumper
{
    private $output;
    private $dumper;
    private $cloner;
    private $handler;

    public function __construct(OutputInterface $output, CliDumper $dumper = null, ClonerInterface $cloner = null)
    {
        $this->output = $output;
        $this->dumper = $dumper;
        $this->cloner = $cloner;

        if (class_exists(CliDumper::class)) {
            $this->handler = function ($var): string {
                $dumper = $this->dumper ?? $this->dumper = new CliDumper(null, null, CliDumper::DUMP_LIGHT_ARRAY | CliDumper::DUMP_COMMA_SEPARATOR);
                $dumper->setColors($this->output->isDecorated());

                return rtrim($dumper->dump(($this->cloner ?? $this->cloner = new VarCloner())->cloneVar($var)->withRefHandles(false), true));
            };
        } else {
            $this->handler = function ($var): string {
                switch (true) {
                    case null === $var:
                        return 'null';
                    case true === $var:
                        return 'true';
                    case false === $var:
                        return 'false';
                    case \is_string($var):
                        return '"'.$var.'"';
                    default:
                        return rtrim(print_r($var, true));
                }
            };
        }
    }

    public function __invoke($var): string
    {
        return ($this->handler)($var);
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Helper;

use Symfony\Component\Console\Formatter\OutputFormatter;

/**
 * The Formatter class provides helpers to format messages.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class FormatterHelper extends Helper
{
    /**
     * Formats a message within a section.
     *
     * @return string
     */
    public function formatSection(string $section, string $message, string $style = 'info')
    {
        return sprintf('<%s>[%s]</%s> %s', $style, $section, $style, $message);
    }

    /**
     * Formats a message as a block of text.
     *
     * @param string|array $messages The message to write in the block
     *
     * @return string
     */
    public function formatBlock($messages, string $style, bool $large = false)
    {
        if (!\is_array($messages)) {
            $messages = [$messages];
        }

        $len = 0;
        $lines = [];
        foreach ($messages as $message) {
            $message = OutputFormatter::escape($message);
            $lines[] = sprintf($large ? '  %s  ' : ' %s ', $message);
            $len = max(self::width($message) + ($large ? 4 : 2), $len);
        }

        $messages = $large ? [str_repeat(' ', $len)] : [];
        for ($i = 0; isset($lines[$i]); ++$i) {
            $messages[] = $lines[$i].str_repeat(' ', $len - self::width($lines[$i]));
        }
        if ($large) {
            $messages[] = str_repeat(' ', $len);
        }

        for ($i = 0; isset($messages[$i]); ++$i) {
            $messages[$i] = sprintf('<%s>%s</%s>', $style, $messages[$i], $style);
        }

        return implode("\n", $messages);
    }

    /**
     * Truncates a message to the given length.
     *
     * @return string
     */
    public function truncate(string $message, int $length, string $suffix = '...')
    {
        $computedLength = $length - self::width($suffix);

        if ($computedLength > self::width($message)) {
            return $message;
        }

        return self::substr($message, 0, $length).$suffix;
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'formatter';
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Helper;

use Symfony\Component\Console\Formatter\OutputFormatterInterface;
use Symfony\Component\String\UnicodeString;

/**
 * Helper is the base class for all helper classes.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
abstract class Helper implements HelperInterface
{
    protected $helperSet = null;

    /**
     * {@inheritdoc}
     */
    public function setHelperSet(HelperSet $helperSet = null)
    {
        $this->helperSet = $helperSet;
    }

    /**
     * {@inheritdoc}
     */
    public function getHelperSet()
    {
        return $this->helperSet;
    }

    /**
     * Returns the length of a string, using mb_strwidth if it is available.
     *
     * @deprecated since Symfony 5.3
     *
     * @return int
     */
    public static function strlen(?string $string)
    {
        trigger_deprecation('symfony/console', '5.3', 'Method "%s()" is deprecated and will be removed in Symfony 6.0. Use Helper::width() or Helper::length() instead.', __METHOD__);

        return self::width($string);
    }

    /**
     * Returns the width of a string, using mb_strwidth if it is available.
     * The width is how many characters positions the string will use.
     */
    public static function width(?string $string): int
    {
        $string ?? $string = '';

        if (preg_match('//u', $string)) {
            return (new UnicodeString($string))->width(false);
        }

        if (false === $encoding = mb_detect_encoding($string, null, true)) {
            return \strlen($string);
        }

        return mb_strwidth($string, $encoding);
    }

    /**
     * Returns the length of a string, using mb_strlen if it is available.
     * The length is related to how many bytes the string will use.
     */
    public static function length(?string $string): int
    {
        $string ?? $string = '';

        if (preg_match('//u', $string)) {
            return (new UnicodeString($string))->length();
        }

        if (false === $encoding = mb_detect_encoding($string, null, true)) {
            return \strlen($string);
        }

        return mb_strlen($string, $encoding);
    }

    /**
     * Returns the subset of a string, using mb_substr if it is available.
     *
     * @return string
     */
    public static function substr(?string $string, int $from, int $length = null)
    {
        $string ?? $string = '';

        if (false === $encoding = mb_detect_encoding($string, null, true)) {
            return substr($string, $from, $length);
        }

        return mb_substr($string, $from, $length, $encoding);
    }

    public static function formatTime($secs)
    {
        static $timeFormats = [
            [0, '< 1 sec'],
            [1, '1 sec'],
            [2, 'secs', 1],
            [60, '1 min'],
            [120, 'mins', 60],
            [3600, '1 hr'],
            [7200, 'hrs', 3600],
            [86400, '1 day'],
            [172800, 'days', 86400],
        ];

        foreach ($timeFormats as $index => $format) {
            if ($secs >= $format[0]) {
                if ((isset($timeFormats[$index + 1]) && $secs < $timeFormats[$index + 1][0])
                    || $index == \count($timeFormats) - 1
                ) {
                    if (2 == \count($format)) {
                        return $format[1];
                    }

                    return floor($secs / $format[2]).' '.$format[1];
                }
            }
        }
    }

    public static function formatMemory(int $memory)
    {
        if ($memory >= 1024 * 1024 * 1024) {
            return sprintf('%.1f GiB', $memory / 1024 / 1024 / 1024);
        }

        if ($memory >= 1024 * 1024) {
            return sprintf('%.1f MiB', $memory / 1024 / 1024);
        }

        if ($memory >= 1024) {
            return sprintf('%d KiB', $memory / 1024);
        }

        return sprintf('%d B', $memory);
    }

    /**
     * @deprecated since Symfony 5.3
     */
    public static function strlenWithoutDecoration(OutputFormatterInterface $formatter, ?string $string)
    {
        trigger_deprecation('symfony/console', '5.3', 'Method "%s()" is deprecated and will be removed in Symfony 6.0. Use Helper::removeDecoration() instead.', __METHOD__);

        return self::width(self::removeDecoration($formatter, $string));
    }

    public static function removeDecoration(OutputFormatterInterface $formatter, ?string $string)
    {
        $isDecorated = $formatter->isDecorated();
        $formatter->setDecorated(false);
        // remove <...> formatting
        $string = $formatter->format($string ?? '');
        // remove already formatted characters
        $string = preg_replace("/\033\[[^m]*m/", '', $string ?? '');
        // remove terminal hyperlinks
        $string = preg_replace('/\\033]8;[^;]*;[^\\033]*\\033\\\\/', '', $string ?? '');
        $formatter->setDecorated($isDecorated);

        return $string;
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Helper;

/**
 * HelperInterface is the interface all helpers must implement.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
interface HelperInterface
{
    /**
     * Sets the helper set associated with this helper.
     */
    public function setHelperSet(HelperSet $helperSet = null);

    /**
     * Gets the helper set associated with this helper.
     *
     * @return HelperSet|null
     */
    public function getHelperSet();

    /**
     * Returns the canonical name of this helper.
     *
     * @return string
     */
    public function getName();
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Helper;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Exception\InvalidArgumentException;

/**
 * HelperSet represents a set of helpers to be used with a command.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @implements \IteratorAggregate<string, Helper>
 */
class HelperSet implements \IteratorAggregate
{
    /** @var array<string, Helper> */
    private $helpers = [];
    private $command;

    /**
     * @param Helper[] $helpers An array of helper
     */
    public function __construct(array $helpers = [])
    {
        foreach ($helpers as $alias => $helper) {
            $this->set($helper, \is_int($alias) ? null : $alias);
        }
    }

    public function set(HelperInterface $helper, string $alias = null)
    {
        $this->helpers[$helper->getName()] = $helper;
        if (null !== $alias) {
            $this->helpers[$alias] = $helper;
        }

        $helper->setHelperSet($this);
    }

    /**
     * Returns true if the helper if defined.
     *
     * @return bool
     */
    public function has(string $name)
    {
        return isset($this->helpers[$name]);
    }

    /**
     * Gets a helper value.
     *
     * @return HelperInterface
     *
     * @throws InvalidArgumentException if the helper is not defined
     */
    public function get(string $name)
    {
        if (!$this->has($name)) {
            throw new InvalidArgumentException(sprintf('The helper "%s" is not defined.', $name));
        }

        return $this->helpers[$name];
    }

    /**
     * @deprecated since Symfony 5.4
     */
    public function setCommand(Command $command = null)
    {
        trigger_deprecation('symfony/console', '5.4', 'Method "%s()" is deprecated.', __METHOD__);

        $this->command = $command;
    }

    /**
     * Gets the command associated with this helper set.
     *
     * @return Command
     *
     * @deprecated since Symfony 5.4
     */
    public function getCommand()
    {
        trigger_deprecation('symfony/console', '5.4', 'Method "%s()" is deprecated.', __METHOD__);

        return $this->command;
    }

    /**
     * @return \Traversable<string, Helper>
     */
    #[\ReturnTypeWillChange]
    public function getIterator()
    {
        return new \ArrayIterator($this->helpers);
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Helper;

use Symfony\Component\Console\Input\InputAwareInterface;
use Symfony\Component\Console\Input\InputInterface;

/**
 * An implementation of InputAwareInterface for Helpers.
 *
 * @author Wouter J <waldio.webdesign@gmail.com>
 */
abstract class InputAwareHelper extends Helper implements InputAwareInterface
{
    protected $input;

    /**
     * {@inheritdoc}
     */
    public function setInput(InputInterface $input)
    {
        $this->input = $input;
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Helper;

use Symfony\Component\Console\Output\ConsoleOutputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Process\Exception\ProcessFailedException;
use Symfony\Component\Process\Process;

/**
 * The ProcessHelper class provides helpers to run external processes.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @final
 */
class ProcessHelper extends Helper
{
    /**
     * Runs an external process.
     *
     * @param array|Process $cmd      An instance of Process or an array of the command and arguments
     * @param callable|null $callback A PHP callback to run whenever there is some
     *                                output available on STDOUT or STDERR
     */
    public function run(OutputInterface $output, $cmd, string $error = null, callable $callback = null, int $verbosity = OutputInterface::VERBOSITY_VERY_VERBOSE): Process
    {
        if (!class_exists(Process::class)) {
            throw new \LogicException('The ProcessHelper cannot be run as the Process component is not installed. Try running "compose require symfony/process".');
        }

        if ($output instanceof ConsoleOutputInterface) {
            $output = $output->getErrorOutput();
        }

        $formatter = $this->getHelperSet()->get('debug_formatter');

        if ($cmd instanceof Process) {
            $cmd = [$cmd];
        }

        if (!\is_array($cmd)) {
            throw new \TypeError(sprintf('The "command" argument of "%s()" must be an array or a "%s" instance, "%s" given.', __METHOD__, Process::class, get_debug_type($cmd)));
        }

        if (\is_string($cmd[0] ?? null)) {
            $process = new Process($cmd);
            $cmd = [];
        } elseif (($cmd[0] ?? null) instanceof Process) {
            $process = $cmd[0];
            unset($cmd[0]);
        } else {
            throw new \InvalidArgumentException(sprintf('Invalid command provided to "%s()": the command should be an array whose first element is either the path to the binary to run or a "Process" object.', __METHOD__));
        }

        if ($verbosity <= $output->getVerbosity()) {
            $output->write($formatter->start(spl_object_hash($process), $this->escapeString($process->getCommandLine())));
        }

        if ($output->isDebug()) {
            $callback = $this->wrapCallback($output, $process, $callback);
        }

        $process->run($callback, $cmd);

        if ($verbosity <= $output->getVerbosity()) {
            $message = $process->isSuccessful() ? 'Command ran successfully' : sprintf('%s Command did not run successfully', $process->getExitCode());
            $output->write($formatter->stop(spl_object_hash($process), $message, $process->isSuccessful()));
        }

        if (!$process->isSuccessful() && null !== $error) {
            $output->writeln(sprintf('<error>%s</error>', $this->escapeString($error)));
        }

        return $process;
    }

    /**
     * Runs the process.
     *
     * This is identical to run() except that an exception is thrown if the process
     * exits with a non-zero exit code.
     *
     * @param array|Process $cmd      An instance of Process or a command to run
     * @param callable|null $callback A PHP callback to run whenever there is some
     *                                output available on STDOUT or STDERR
     *
     * @throws ProcessFailedException
     *
     * @see run()
     */
    public function mustRun(OutputInterface $output, $cmd, string $error = null, callable $callback = null): Process
    {
        $process = $this->run($output, $cmd, $error, $callback);

        if (!$process->isSuccessful()) {
            throw new ProcessFailedException($process);
        }

        return $process;
    }

    /**
     * Wraps a Process callback to add debugging output.
     */
    public function wrapCallback(OutputInterface $output, Process $process, callable $callback = null): callable
    {
        if ($output instanceof ConsoleOutputInterface) {
            $output = $output->getErrorOutput();
        }

        $formatter = $this->getHelperSet()->get('debug_formatter');

        return function ($type, $buffer) use ($output, $process, $callback, $formatter) {
            $output->write($formatter->progress(spl_object_hash($process), $this->escapeString($buffer), Process::ERR === $type));

            if (null !== $callback) {
                $callback($type, $buffer);
            }
        };
    }

    private function escapeString(string $str): string
    {
        return str_replace('<', '\\<', $str);
    }

    /**
     * {@inheritdoc}
     */
    public function getName(): string
    {
        return 'process';
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Helper;

use Symfony\Component\Console\Cursor;
use Symfony\Component\Console\Exception\LogicException;
use Symfony\Component\Console\Output\ConsoleOutputInterface;
use Symfony\Component\Console\Output\ConsoleSectionOutput;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Terminal;

/**
 * The ProgressBar provides helpers to display progress output.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Chris Jones <leeked@gmail.com>
 */
final class ProgressBar
{
    public const FORMAT_VERBOSE = 'verbose';
    public const FORMAT_VERY_VERBOSE = 'very_verbose';
    public const FORMAT_DEBUG = 'debug';
    public const FORMAT_NORMAL = 'normal';

    private const FORMAT_VERBOSE_NOMAX = 'verbose_nomax';
    private const FORMAT_VERY_VERBOSE_NOMAX = 'very_verbose_nomax';
    private const FORMAT_DEBUG_NOMAX = 'debug_nomax';
    private const FORMAT_NORMAL_NOMAX = 'normal_nomax';

    private $barWidth = 28;
    private $barChar;
    private $emptyBarChar = '-';
    private $progressChar = '>';
    private $format;
    private $internalFormat;
    private $redrawFreq = 1;
    private $writeCount;
    private $lastWriteTime;
    private $minSecondsBetweenRedraws = 0;
    private $maxSecondsBetweenRedraws = 1;
    private $output;
    private $step = 0;
    private $max;
    private $startTime;
    private $stepWidth;
    private $percent = 0.0;
    private $messages = [];
    private $overwrite = true;
    private $terminal;
    private $previousMessage;
    private $cursor;

    private static $formatters;
    private static $formats;

    /**
     * @param int $max Maximum steps (0 if unknown)
     */
    public function __construct(OutputInterface $output, int $max = 0, float $minSecondsBetweenRedraws = 1 / 25)
    {
        if ($output instanceof ConsoleOutputInterface) {
            $output = $output->getErrorOutput();
        }

        $this->output = $output;
        $this->setMaxSteps($max);
        $this->terminal = new Terminal();

        if (0 < $minSecondsBetweenRedraws) {
            $this->redrawFreq = null;
            $this->minSecondsBetweenRedraws = $minSecondsBetweenRedraws;
        }

        if (!$this->output->isDecorated()) {
            // disable overwrite when output does not support ANSI codes.
            $this->overwrite = false;

            // set a reasonable redraw frequency so output isn't flooded
            $this->redrawFreq = null;
        }

        $this->startTime = time();
        $this->cursor = new Cursor($output);
    }

    /**
     * Sets a placeholder formatter for a given name.
     *
     * This method also allow you to override an existing placeholder.
     *
     * @param string   $name     The placeholder name (including the delimiter char like %)
     * @param callable $callable A PHP callable
     */
    public static function setPlaceholderFormatterDefinition(string $name, callable $callable): void
    {
        if (!self::$formatters) {
            self::$formatters = self::initPlaceholderFormatters();
        }

        self::$formatters[$name] = $callable;
    }

    /**
     * Gets the placeholder formatter for a given name.
     *
     * @param string $name The placeholder name (including the delimiter char like %)
     */
    public static function getPlaceholderFormatterDefinition(string $name): ?callable
    {
        if (!self::$formatters) {
            self::$formatters = self::initPlaceholderFormatters();
        }

        return self::$formatters[$name] ?? null;
    }

    /**
     * Sets a format for a given name.
     *
     * This method also allow you to override an existing format.
     *
     * @param string $name   The format name
     * @param string $format A format string
     */
    public static function setFormatDefinition(string $name, string $format): void
    {
        if (!self::$formats) {
            self::$formats = self::initFormats();
        }

        self::$formats[$name] = $format;
    }

    /**
     * Gets the format for a given name.
     *
     * @param string $name The format name
     */
    public static function getFormatDefinition(string $name): ?string
    {
        if (!self::$formats) {
            self::$formats = self::initFormats();
        }

        return self::$formats[$name] ?? null;
    }

    /**
     * Associates a text with a named placeholder.
     *
     * The text is displayed when the progress bar is rendered but only
     * when the corresponding placeholder is part of the custom format line
     * (by wrapping the name with %).
     *
     * @param string $message The text to associate with the placeholder
     * @param string $name    The name of the placeholder
     */
    public function setMessage(string $message, string $name = 'message')
    {
        $this->messages[$name] = $message;
    }

    public function getMessage(string $name = 'message')
    {
        return $this->messages[$name];
    }

    public function getStartTime(): int
    {
        return $this->startTime;
    }

    public function getMaxSteps(): int
    {
        return $this->max;
    }

    public function getProgress(): int
    {
        return $this->step;
    }

    private function getStepWidth(): int
    {
        return $this->stepWidth;
    }

    public function getProgressPercent(): float
    {
        return $this->percent;
    }

    public function getBarOffset(): float
    {
        return floor($this->max ? $this->percent * $this->barWidth : (null === $this->redrawFreq ? (int) (min(5, $this->barWidth / 15) * $this->writeCount) : $this->step) % $this->barWidth);
    }

    public function getEstimated(): float
    {
        if (!$this->step) {
            return 0;
        }

        return round((time() - $this->startTime) / $this->step * $this->max);
    }

    public function getRemaining(): float
    {
        if (!$this->step) {
            return 0;
        }

        return round((time() - $this->startTime) / $this->step * ($this->max - $this->step));
    }

    public function setBarWidth(int $size)
    {
        $this->barWidth = max(1, $size);
    }

    public function getBarWidth(): int
    {
        return $this->barWidth;
    }

    public function setBarCharacter(string $char)
    {
        $this->barChar = $char;
    }

    public function getBarCharacter(): string
    {
        return $this->barChar ?? ($this->max ? '=' : $this->emptyBarChar);
    }

    public function setEmptyBarCharacter(string $char)
    {
        $this->emptyBarChar = $char;
    }

    public function getEmptyBarCharacter(): string
    {
        return $this->emptyBarChar;
    }

    public function setProgressCharacter(string $char)
    {
        $this->progressChar = $char;
    }

    public function getProgressCharacter(): string
    {
        return $this->progressChar;
    }

    public function setFormat(string $format)
    {
        $this->format = null;
        $this->internalFormat = $format;
    }

    /**
     * Sets the redraw frequency.
     *
     * @param int|null $freq The frequency in steps
     */
    public function setRedrawFrequency(?int $freq)
    {
        $this->redrawFreq = null !== $freq ? max(1, $freq) : null;
    }

    public function minSecondsBetweenRedraws(float $seconds): void
    {
        $this->minSecondsBetweenRedraws = $seconds;
    }

    public function maxSecondsBetweenRedraws(float $seconds): void
    {
        $this->maxSecondsBetweenRedraws = $seconds;
    }

    /**
     * Returns an iterator that will automatically update the progress bar when iterated.
     *
     * @param int|null $max Number of steps to complete the bar (0 if indeterminate), if null it will be inferred from $iterable
     */
    public function iterate(iterable $iterable, int $max = null): iterable
    {
        $this->start($max ?? (is_countable($iterable) ? \count($iterable) : 0));

        foreach ($iterable as $key => $value) {
            yield $key => $value;

            $this->advance();
        }

        $this->finish();
    }

    /**
     * Starts the progress output.
     *
     * @param int|null $max Number of steps to complete the bar (0 if indeterminate), null to leave unchanged
     */
    public function start(int $max = null)
    {
        $this->startTime = time();
        $this->step = 0;
        $this->percent = 0.0;

        if (null !== $max) {
            $this->setMaxSteps($max);
        }

        $this->display();
    }

    /**
     * Advances the progress output X steps.
     *
     * @param int $step Number of steps to advance
     */
    public function advance(int $step = 1)
    {
        $this->setProgress($this->step + $step);
    }

    /**
     * Sets whether to overwrite the progressbar, false for new line.
     */
    public function setOverwrite(bool $overwrite)
    {
        $this->overwrite = $overwrite;
    }

    public function setProgress(int $step)
    {
        if ($this->max && $step > $this->max) {
            $this->max = $step;
        } elseif ($step < 0) {
            $step = 0;
        }

        $redrawFreq = $this->redrawFreq ?? (($this->max ?: 10) / 10);
        $prevPeriod = (int) ($this->step / $redrawFreq);
        $currPeriod = (int) ($step / $redrawFreq);
        $this->step = $step;
        $this->percent = $this->max ? (float) $this->step / $this->max : 0;
        $timeInterval = microtime(true) - $this->lastWriteTime;

        // Draw regardless of other limits
        if ($this->max === $step) {
            $this->display();

            return;
        }

        // Throttling
        if ($timeInterval < $this->minSecondsBetweenRedraws) {
            return;
        }

        // Draw each step period, but not too late
        if ($prevPeriod !== $currPeriod || $timeInterval >= $this->maxSecondsBetweenRedraws) {
            $this->display();
        }
    }

    public function setMaxSteps(int $max)
    {
        $this->format = null;
        $this->max = max(0, $max);
        $this->stepWidth = $this->max ? Helper::width((string) $this->max) : 4;
    }

    /**
     * Finishes the progress output.
     */
    public function finish(): void
    {
        if (!$this->max) {
            $this->max = $this->step;
        }

        if ($this->step === $this->max && !$this->overwrite) {
            // prevent double 100% output
            return;
        }

        $this->setProgress($this->max);
    }

    /**
     * Outputs the current progress string.
     */
    public function display(): void
    {
        if (OutputInterface::VERBOSITY_QUIET === $this->output->getVerbosity()) {
            return;
        }

        if (null === $this->format) {
            $this->setRealFormat($this->internalFormat ?: $this->determineBestFormat());
        }

        $this->overwrite($this->buildLine());
    }

    /**
     * Removes the progress bar from the current line.
     *
     * This is useful if you wish to write some output
     * while a progress bar is running.
     * Call display() to show the progress bar again.
     */
    public function clear(): void
    {
        if (!$this->overwrite) {
            return;
        }

        if (null === $this->format) {
            $this->setRealFormat($this->internalFormat ?: $this->determineBestFormat());
        }

        $this->overwrite('');
    }

    private function setRealFormat(string $format)
    {
        // try to use the _nomax variant if available
        if (!$this->max && null !== self::getFormatDefinition($format.'_nomax')) {
            $this->format = self::getFormatDefinition($format.'_nomax');
        } elseif (null !== self::getFormatDefinition($format)) {
            $this->format = self::getFormatDefinition($format);
        } else {
            $this->format = $format;
        }
    }

    /**
     * Overwrites a previous message to the output.
     */
    private function overwrite(string $message): void
    {
        if ($this->previousMessage === $message) {
            return;
        }

        $originalMessage = $message;

        if ($this->overwrite) {
            if (null !== $this->previousMessage) {
                if ($this->output instanceof ConsoleSectionOutput) {
                    $messageLines = explode("\n", $this->previousMessage);
                    $lineCount = \count($messageLines);
                    foreach ($messageLines as $messageLine) {
                        $messageLineLength = Helper::width(Helper::removeDecoration($this->output->getFormatter(), $messageLine));
                        if ($messageLineLength > $this->terminal->getWidth()) {
                            $lineCount += floor($messageLineLength / $this->terminal->getWidth());
                        }
                    }
                    $this->output->clear($lineCount);
                } else {
                    $lineCount = substr_count($this->previousMessage, "\n");
                    for ($i = 0; $i < $lineCount; ++$i) {
                        $this->cursor->moveToColumn(1);
                        $this->cursor->clearLine();
                        $this->cursor->moveUp();
                    }

                    $this->cursor->moveToColumn(1);
                    $this->cursor->clearLine();
                }
            }
        } elseif ($this->step > 0) {
            $message = \PHP_EOL.$message;
        }

        $this->previousMessage = $originalMessage;
        $this->lastWriteTime = microtime(true);

        $this->output->write($message);
        ++$this->writeCount;
    }

    private function determineBestFormat(): string
    {
        switch ($this->output->getVerbosity()) {
            // OutputInterface::VERBOSITY_QUIET: display is disabled anyway
            case OutputInterface::VERBOSITY_VERBOSE:
                return $this->max ? self::FORMAT_VERBOSE : self::FORMAT_VERBOSE_NOMAX;
            case OutputInterface::VERBOSITY_VERY_VERBOSE:
                return $this->max ? self::FORMAT_VERY_VERBOSE : self::FORMAT_VERY_VERBOSE_NOMAX;
            case OutputInterface::VERBOSITY_DEBUG:
                return $this->max ? self::FORMAT_DEBUG : self::FORMAT_DEBUG_NOMAX;
            default:
                return $this->max ? self::FORMAT_NORMAL : self::FORMAT_NORMAL_NOMAX;
        }
    }

    private static function initPlaceholderFormatters(): array
    {
        return [
            'bar' => function (self $bar, OutputInterface $output) {
                $completeBars = $bar->getBarOffset();
                $display = str_repeat($bar->getBarCharacter(), $completeBars);
                if ($completeBars < $bar->getBarWidth()) {
                    $emptyBars = $bar->getBarWidth() - $completeBars - Helper::length(Helper::removeDecoration($output->getFormatter(), $bar->getProgressCharacter()));
                    $display .= $bar->getProgressCharacter().str_repeat($bar->getEmptyBarCharacter(), $emptyBars);
                }

                return $display;
            },
            'elapsed' => function (self $bar) {
                return Helper::formatTime(time() - $bar->getStartTime());
            },
            'remaining' => function (self $bar) {
                if (!$bar->getMaxSteps()) {
                    throw new LogicException('Unable to display the remaining time if the maximum number of steps is not set.');
                }

                return Helper::formatTime($bar->getRemaining());
            },
            'estimated' => function (self $bar) {
                if (!$bar->getMaxSteps()) {
                    throw new LogicException('Unable to display the estimated time if the maximum number of steps is not set.');
                }

                return Helper::formatTime($bar->getEstimated());
            },
            'memory' => function (self $bar) {
                return Helper::formatMemory(memory_get_usage(true));
            },
            'current' => function (self $bar) {
                return str_pad($bar->getProgress(), $bar->getStepWidth(), ' ', \STR_PAD_LEFT);
            },
            'max' => function (self $bar) {
                return $bar->getMaxSteps();
            },
            'percent' => function (self $bar) {
                return floor($bar->getProgressPercent() * 100);
            },
        ];
    }

    private static function initFormats(): array
    {
        return [
            self::FORMAT_NORMAL => ' %current%/%max% [%bar%] %percent:3s%%',
            self::FORMAT_NORMAL_NOMAX => ' %current% [%bar%]',

            self::FORMAT_VERBOSE => ' %current%/%max% [%bar%] %percent:3s%% %elapsed:6s%',
            self::FORMAT_VERBOSE_NOMAX => ' %current% [%bar%] %elapsed:6s%',

            self::FORMAT_VERY_VERBOSE => ' %current%/%max% [%bar%] %percent:3s%% %elapsed:6s%/%estimated:-6s%',
            self::FORMAT_VERY_VERBOSE_NOMAX => ' %current% [%bar%] %elapsed:6s%',

            self::FORMAT_DEBUG => ' %current%/%max% [%bar%] %percent:3s%% %elapsed:6s%/%estimated:-6s% %memory:6s%',
            self::FORMAT_DEBUG_NOMAX => ' %current% [%bar%] %elapsed:6s% %memory:6s%',
        ];
    }

    private function buildLine(): string
    {
        $regex = "{%([a-z\-_]+)(?:\:([^%]+))?%}i";
        $callback = function ($matches) {
            if ($formatter = $this::getPlaceholderFormatterDefinition($matches[1])) {
                $text = $formatter($this, $this->output);
            } elseif (isset($this->messages[$matches[1]])) {
                $text = $this->messages[$matches[1]];
            } else {
                return $matches[0];
            }

            if (isset($matches[2])) {
                $text = sprintf('%'.$matches[2], $text);
            }

            return $text;
        };
        $line = preg_replace_callback($regex, $callback, $this->format);

        // gets string length for each sub line with multiline format
        $linesLength = array_map(function ($subLine) {
            return Helper::width(Helper::removeDecoration($this->output->getFormatter(), rtrim($subLine, "\r")));
        }, explode("\n", $line));

        $linesWidth = max($linesLength);

        $terminalWidth = $this->terminal->getWidth();
        if ($linesWidth <= $terminalWidth) {
            return $line;
        }

        $this->setBarWidth($this->barWidth - $linesWidth + $terminalWidth);

        return preg_replace_callback($regex, $callback, $this->format);
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Helper;

use Symfony\Component\Console\Exception\InvalidArgumentException;
use Symfony\Component\Console\Exception\LogicException;
use Symfony\Component\Console\Output\OutputInterface;

/**
 * @author Kevin Bond <kevinbond@gmail.com>
 */
class ProgressIndicator
{
    private const FORMATS = [
        'normal' => ' %indicator% %message%',
        'normal_no_ansi' => ' %message%',

        'verbose' => ' %indicator% %message% (%elapsed:6s%)',
        'verbose_no_ansi' => ' %message% (%elapsed:6s%)',

        'very_verbose' => ' %indicator% %message% (%elapsed:6s%, %memory:6s%)',
        'very_verbose_no_ansi' => ' %message% (%elapsed:6s%, %memory:6s%)',
    ];

    private $output;
    private $startTime;
    private $format;
    private $message;
    private $indicatorValues;
    private $indicatorCurrent;
    private $indicatorChangeInterval;
    private $indicatorUpdateTime;
    private $started = false;

    /**
     * @var array<string, callable>
     */
    private static $formatters;

    /**
     * @param int        $indicatorChangeInterval Change interval in milliseconds
     * @param array|null $indicatorValues         Animated indicator characters
     */
    public function __construct(OutputInterface $output, string $format = null, int $indicatorChangeInterval = 100, array $indicatorValues = null)
    {
        $this->output = $output;

        if (null === $format) {
            $format = $this->determineBestFormat();
        }

        if (null === $indicatorValues) {
            $indicatorValues = ['-', '\\', '|', '/'];
        }

        $indicatorValues = array_values($indicatorValues);

        if (2 > \count($indicatorValues)) {
            throw new InvalidArgumentException('Must have at least 2 indicator value characters.');
        }

        $this->format = self::getFormatDefinition($format);
        $this->indicatorChangeInterval = $indicatorChangeInterval;
        $this->indicatorValues = $indicatorValues;
        $this->startTime = time();
    }

    /**
     * Sets the current indicator message.
     */
    public function setMessage(?string $message)
    {
        $this->message = $message;

        $this->display();
    }

    /**
     * Starts the indicator output.
     */
    public function start(string $message)
    {
        if ($this->started) {
            throw new LogicException('Progress indicator already started.');
        }

        $this->message = $message;
        $this->started = true;
        $this->startTime = time();
        $this->indicatorUpdateTime = $this->getCurrentTimeInMilliseconds() + $this->indicatorChangeInterval;
        $this->indicatorCurrent = 0;

        $this->display();
    }

    /**
     * Advances the indicator.
     */
    public function advance()
    {
        if (!$this->started) {
            throw new LogicException('Progress indicator has not yet been started.');
        }

        if (!$this->output->isDecorated()) {
            return;
        }

        $currentTime = $this->getCurrentTimeInMilliseconds();

        if ($currentTime < $this->indicatorUpdateTime) {
            return;
        }

        $this->indicatorUpdateTime = $currentTime + $this->indicatorChangeInterval;
        ++$this->indicatorCurrent;

        $this->display();
    }

    /**
     * Finish the indicator with message.
     *
     * @param $message
     */
    public function finish(string $message)
    {
        if (!$this->started) {
            throw new LogicException('Progress indicator has not yet been started.');
        }

        $this->message = $message;
        $this->display();
        $this->output->writeln('');
        $this->started = false;
    }

    /**
     * Gets the format for a given name.
     *
     * @return string|null
     */
    public static function getFormatDefinition(string $name)
    {
        return self::FORMATS[$name] ?? null;
    }

    /**
     * Sets a placeholder formatter for a given name.
     *
     * This method also allow you to override an existing placeholder.
     */
    public static function setPlaceholderFormatterDefinition(string $name, callable $callable)
    {
        if (!self::$formatters) {
            self::$formatters = self::initPlaceholderFormatters();
        }

        self::$formatters[$name] = $callable;
    }

    /**
     * Gets the placeholder formatter for a given name (including the delimiter char like %).
     *
     * @return callable|null
     */
    public static function getPlaceholderFormatterDefinition(string $name)
    {
        if (!self::$formatters) {
            self::$formatters = self::initPlaceholderFormatters();
        }

        return self::$formatters[$name] ?? null;
    }

    private function display()
    {
        if (OutputInterface::VERBOSITY_QUIET === $this->output->getVerbosity()) {
            return;
        }

        $this->overwrite(preg_replace_callback("{%([a-z\-_]+)(?:\:([^%]+))?%}i", function ($matches) {
            if ($formatter = self::getPlaceholderFormatterDefinition($matches[1])) {
                return $formatter($this);
            }

            return $matches[0];
        }, $this->format ?? ''));
    }

    private function determineBestFormat(): string
    {
        switch ($this->output->getVerbosity()) {
            // OutputInterface::VERBOSITY_QUIET: display is disabled anyway
            case OutputInterface::VERBOSITY_VERBOSE:
                return $this->output->isDecorated() ? 'verbose' : 'verbose_no_ansi';
            case OutputInterface::VERBOSITY_VERY_VERBOSE:
            case OutputInterface::VERBOSITY_DEBUG:
                return $this->output->isDecorated() ? 'very_verbose' : 'very_verbose_no_ansi';
            default:
                return $this->output->isDecorated() ? 'normal' : 'normal_no_ansi';
        }
    }

    /**
     * Overwrites a previous message to the output.
     */
    private function overwrite(string $message)
    {
        if ($this->output->isDecorated()) {
            $this->output->write("\x0D\x1B[2K");
            $this->output->write($message);
        } else {
            $this->output->writeln($message);
        }
    }

    private function getCurrentTimeInMilliseconds(): float
    {
        return round(microtime(true) * 1000);
    }

    private static function initPlaceholderFormatters(): array
    {
        return [
            'indicator' => function (self $indicator) {
                return $indicator->indicatorValues[$indicator->indicatorCurrent % \count($indicator->indicatorValues)];
            },
            'message' => function (self $indicator) {
                return $indicator->message;
            },
            'elapsed' => function (self $indicator) {
                return Helper::formatTime(time() - $indicator->startTime);
            },
            'memory' => function () {
                return Helper::formatMemory(memory_get_usage(true));
            },
        ];
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Helper;

use Symfony\Component\Console\Cursor;
use Symfony\Component\Console\Exception\MissingInputException;
use Symfony\Component\Console\Exception\RuntimeException;
use Symfony\Component\Console\Formatter\OutputFormatter;
use Symfony\Component\Console\Formatter\OutputFormatterStyle;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\StreamableInputInterface;
use Symfony\Component\Console\Output\ConsoleOutputInterface;
use Symfony\Component\Console\Output\ConsoleSectionOutput;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Question\ChoiceQuestion;
use Symfony\Component\Console\Question\Question;
use Symfony\Component\Console\Terminal;

use function Symfony\Component\String\s;

/**
 * The QuestionHelper class provides helpers to interact with the user.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class QuestionHelper extends Helper
{
    /**
     * @var resource|null
     */
    private $inputStream;

    private static $stty = true;
    private static $stdinIsInteractive;

    /**
     * Asks a question to the user.
     *
     * @return mixed The user answer
     *
     * @throws RuntimeException If there is no data to read in the input stream
     */
    public function ask(InputInterface $input, OutputInterface $output, Question $question)
    {
        if ($output instanceof ConsoleOutputInterface) {
            $output = $output->getErrorOutput();
        }

        if (!$input->isInteractive()) {
            return $this->getDefaultAnswer($question);
        }

        if ($input instanceof StreamableInputInterface && $stream = $input->getStream()) {
            $this->inputStream = $stream;
        }

        try {
            if (!$question->getValidator()) {
                return $this->doAsk($output, $question);
            }

            $interviewer = function () use ($output, $question) {
                return $this->doAsk($output, $question);
            };

            return $this->validateAttempts($interviewer, $output, $question);
        } catch (MissingInputException $exception) {
            $input->setInteractive(false);

            if (null === $fallbackOutput = $this->getDefaultAnswer($question)) {
                throw $exception;
            }

            return $fallbackOutput;
        }
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'question';
    }

    /**
     * Prevents usage of stty.
     */
    public static function disableStty()
    {
        self::$stty = false;
    }

    /**
     * Asks the question to the user.
     *
     * @return mixed
     *
     * @throws RuntimeException In case the fallback is deactivated and the response cannot be hidden
     */
    private function doAsk(OutputInterface $output, Question $question)
    {
        $this->writePrompt($output, $question);

        $inputStream = $this->inputStream ?: \STDIN;
        $autocomplete = $question->getAutocompleterCallback();

        if (null === $autocomplete || !self::$stty || !Terminal::hasSttyAvailable()) {
            $ret = false;
            if ($question->isHidden()) {
                try {
                    $hiddenResponse = $this->getHiddenResponse($output, $inputStream, $question->isTrimmable());
                    $ret = $question->isTrimmable() ? trim($hiddenResponse) : $hiddenResponse;
                } catch (RuntimeException $e) {
                    if (!$question->isHiddenFallback()) {
                        throw $e;
                    }
                }
            }

            if (false === $ret) {
                $isBlocked = stream_get_meta_data($inputStream)['blocked'] ?? true;

                if (!$isBlocked) {
                    stream_set_blocking($inputStream, true);
                }

                $ret = $this->readInput($inputStream, $question);

                if (!$isBlocked) {
                    stream_set_blocking($inputStream, false);
                }

                if (false === $ret) {
                    throw new MissingInputException('Aborted.');
                }
                if ($question->isTrimmable()) {
                    $ret = trim($ret);
                }
            }
        } else {
            $autocomplete = $this->autocomplete($output, $question, $inputStream, $autocomplete);
            $ret = $question->isTrimmable() ? trim($autocomplete) : $autocomplete;
        }

        if ($output instanceof ConsoleSectionOutput) {
            $output->addContent($ret);
        }

        $ret = \strlen($ret) > 0 ? $ret : $question->getDefault();

        if ($normalizer = $question->getNormalizer()) {
            return $normalizer($ret);
        }

        return $ret;
    }

    /**
     * @return mixed
     */
    private function getDefaultAnswer(Question $question)
    {
        $default = $question->getDefault();

        if (null === $default) {
            return $default;
        }

        if ($validator = $question->getValidator()) {
            return \call_user_func($question->getValidator(), $default);
        } elseif ($question instanceof ChoiceQuestion) {
            $choices = $question->getChoices();

            if (!$question->isMultiselect()) {
                return $choices[$default] ?? $default;
            }

            $default = explode(',', $default);
            foreach ($default as $k => $v) {
                $v = $question->isTrimmable() ? trim($v) : $v;
                $default[$k] = $choices[$v] ?? $v;
            }
        }

        return $default;
    }

    /**
     * Outputs the question prompt.
     */
    protected function writePrompt(OutputInterface $output, Question $question)
    {
        $message = $question->getQuestion();

        if ($question instanceof ChoiceQuestion) {
            $output->writeln(array_merge([
                $question->getQuestion(),
            ], $this->formatChoiceQuestionChoices($question, 'info')));

            $message = $question->getPrompt();
        }

        $output->write($message);
    }

    /**
     * @return string[]
     */
    protected function formatChoiceQuestionChoices(ChoiceQuestion $question, string $tag)
    {
        $messages = [];

        $maxWidth = max(array_map([__CLASS__, 'width'], array_keys($choices = $question->getChoices())));

        foreach ($choices as $key => $value) {
            $padding = str_repeat(' ', $maxWidth - self::width($key));

            $messages[] = sprintf("  [<$tag>%s$padding</$tag>] %s", $key, $value);
        }

        return $messages;
    }

    /**
     * Outputs an error message.
     */
    protected function writeError(OutputInterface $output, \Exception $error)
    {
        if (null !== $this->getHelperSet() && $this->getHelperSet()->has('formatter')) {
            $message = $this->getHelperSet()->get('formatter')->formatBlock($error->getMessage(), 'error');
        } else {
            $message = '<error>'.$error->getMessage().'</error>';
        }

        $output->writeln($message);
    }

    /**
     * Autocompletes a question.
     *
     * @param resource $inputStream
     */
    private function autocomplete(OutputInterface $output, Question $question, $inputStream, callable $autocomplete): string
    {
        $cursor = new Cursor($output, $inputStream);

        $fullChoice = '';
        $ret = '';

        $i = 0;
        $ofs = -1;
        $matches = $autocomplete($ret);
        $numMatches = \count($matches);

        $sttyMode = shell_exec('stty -g');
        $isStdin = 'php://stdin' === (stream_get_meta_data($inputStream)['uri'] ?? null);
        $r = [$inputStream];
        $w = [];

        // Disable icanon (so we can fread each keypress) and echo (we'll do echoing here instead)
        shell_exec('stty -icanon -echo');

        // Add highlighted text style
        $output->getFormatter()->setStyle('hl', new OutputFormatterStyle('black', 'white'));

        // Read a keypress
        while (!feof($inputStream)) {
            while ($isStdin && 0 === @stream_select($r, $w, $w, 0, 100)) {
                // Give signal handlers a chance to run
                $r = [$inputStream];
            }
            $c = fread($inputStream, 1);

            // as opposed to fgets(), fread() returns an empty string when the stream content is empty, not false.
            if (false === $c || ('' === $ret && '' === $c && null === $question->getDefault())) {
                shell_exec('stty '.$sttyMode);
                throw new MissingInputException('Aborted.');
            } elseif ("\177" === $c) { // Backspace Character
                if (0 === $numMatches && 0 !== $i) {
                    --$i;
                    $cursor->moveLeft(s($fullChoice)->slice(-1)->width(false));

                    $fullChoice = self::substr($fullChoice, 0, $i);
                }

                if (0 === $i) {
                    $ofs = -1;
                    $matches = $autocomplete($ret);
                    $numMatches = \count($matches);
                } else {
                    $numMatches = 0;
                }

                // Pop the last character off the end of our string
                $ret = self::substr($ret, 0, $i);
            } elseif ("\033" === $c) {
                // Did we read an escape sequence?
                $c .= fread($inputStream, 2);

                // A = Up Arrow. B = Down Arrow
                if (isset($c[2]) && ('A' === $c[2] || 'B' === $c[2])) {
                    if ('A' === $c[2] && -1 === $ofs) {
                        $ofs = 0;
                    }

                    if (0 === $numMatches) {
                        continue;
                    }

                    $ofs += ('A' === $c[2]) ? -1 : 1;
                    $ofs = ($numMatches + $ofs) % $numMatches;
                }
            } elseif (\ord($c) < 32) {
                if ("\t" === $c || "\n" === $c) {
                    if ($numMatches > 0 && -1 !== $ofs) {
                        $ret = (string) $matches[$ofs];
                        // Echo out remaining chars for current match
                        $remainingCharacters = substr($ret, \strlen(trim($this->mostRecentlyEnteredValue($fullChoice))));
                        $output->write($remainingCharacters);
                        $fullChoice .= $remainingCharacters;
                        $i = (false === $encoding = mb_detect_encoding($fullChoice, null, true)) ? \strlen($fullChoice) : mb_strlen($fullChoice, $encoding);

                        $matches = array_filter(
                            $autocomplete($ret),
                            function ($match) use ($ret) {
                                return '' === $ret || str_starts_with($match, $ret);
                            }
                        );
                        $numMatches = \count($matches);
                        $ofs = -1;
                    }

                    if ("\n" === $c) {
                        $output->write($c);
                        break;
                    }

                    $numMatches = 0;
                }

                continue;
            } else {
                if ("\x80" <= $c) {
                    $c .= fread($inputStream, ["\xC0" => 1, "\xD0" => 1, "\xE0" => 2, "\xF0" => 3][$c & "\xF0"]);
                }

                $output->write($c);
                $ret .= $c;
                $fullChoice .= $c;
                ++$i;

                $tempRet = $ret;

                if ($question instanceof ChoiceQuestion && $question->isMultiselect()) {
                    $tempRet = $this->mostRecentlyEnteredValue($fullChoice);
                }

                $numMatches = 0;
                $ofs = 0;

                foreach ($autocomplete($ret) as $value) {
                    // If typed characters match the beginning chunk of value (e.g. [AcmeDe]moBundle)
                    if (str_starts_with($value, $tempRet)) {
                        $matches[$numMatches++] = $value;
                    }
                }
            }

            $cursor->clearLineAfter();

            if ($numMatches > 0 && -1 !== $ofs) {
                $cursor->savePosition();
                // Write highlighted text, complete the partially entered response
                $charactersEntered = \strlen(trim($this->mostRecentlyEnteredValue($fullChoice)));
                $output->write('<hl>'.OutputFormatter::escapeTrailingBackslash(substr($matches[$ofs], $charactersEntered)).'</hl>');
                $cursor->restorePosition();
            }
        }

        // Reset stty so it behaves normally again
        shell_exec('stty '.$sttyMode);

        return $fullChoice;
    }

    private function mostRecentlyEnteredValue(string $entered): string
    {
        // Determine the most recent value that the user entered
        if (!str_contains($entered, ',')) {
            return $entered;
        }

        $choices = explode(',', $entered);
        if ('' !== $lastChoice = trim($choices[\count($choices) - 1])) {
            return $lastChoice;
        }

        return $entered;
    }

    /**
     * Gets a hidden response from user.
     *
     * @param resource $inputStream The handler resource
     * @param bool     $trimmable   Is the answer trimmable
     *
     * @throws RuntimeException In case the fallback is deactivated and the response cannot be hidden
     */
    private function getHiddenResponse(OutputInterface $output, $inputStream, bool $trimmable = true): string
    {
        if ('\\' === \DIRECTORY_SEPARATOR) {
            $exe = __DIR__.'/../Resources/bin/hiddeninput.exe';

            // handle code running from a phar
            if ('phar:' === substr(__FILE__, 0, 5)) {
                $tmpExe = sys_get_temp_dir().'/hiddeninput.exe';
                copy($exe, $tmpExe);
                $exe = $tmpExe;
            }

            $sExec = shell_exec('"'.$exe.'"');
            $value = $trimmable ? rtrim($sExec) : $sExec;
            $output->writeln('');

            if (isset($tmpExe)) {
                unlink($tmpExe);
            }

            return $value;
        }

        if (self::$stty && Terminal::hasSttyAvailable()) {
            $sttyMode = shell_exec('stty -g');
            shell_exec('stty -echo');
        } elseif ($this->isInteractiveInput($inputStream)) {
            throw new RuntimeException('Unable to hide the response.');
        }

        $value = fgets($inputStream, 4096);

        if (self::$stty && Terminal::hasSttyAvailable()) {
            shell_exec('stty '.$sttyMode);
        }

        if (false === $value) {
            throw new MissingInputException('Aborted.');
        }
        if ($trimmable) {
            $value = trim($value);
        }
        $output->writeln('');

        return $value;
    }

    /**
     * Validates an attempt.
     *
     * @param callable $interviewer A callable that will ask for a question and return the result
     *
     * @return mixed The validated response
     *
     * @throws \Exception In case the max number of attempts has been reached and no valid response has been given
     */
    private function validateAttempts(callable $interviewer, OutputInterface $output, Question $question)
    {
        $error = null;
        $attempts = $question->getMaxAttempts();

        while (null === $attempts || $attempts--) {
            if (null !== $error) {
                $this->writeError($output, $error);
            }

            try {
                return $question->getValidator()($interviewer());
            } catch (RuntimeException $e) {
                throw $e;
            } catch (\Exception $error) {
            }
        }

        throw $error;
    }

    private function isInteractiveInput($inputStream): bool
    {
        if ('php://stdin' !== (stream_get_meta_data($inputStream)['uri'] ?? null)) {
            return false;
        }

        if (null !== self::$stdinIsInteractive) {
            return self::$stdinIsInteractive;
        }

        if (\function_exists('stream_isatty')) {
            return self::$stdinIsInteractive = @stream_isatty(fopen('php://stdin', 'r'));
        }

        if (\function_exists('posix_isatty')) {
            return self::$stdinIsInteractive = @posix_isatty(fopen('php://stdin', 'r'));
        }

        if (!\function_exists('shell_exec')) {
            return self::$stdinIsInteractive = true;
        }

        return self::$stdinIsInteractive = (bool) shell_exec('stty 2> '.('\\' === \DIRECTORY_SEPARATOR ? 'NUL' : '/dev/null'));
    }

    /**
     * Reads one or more lines of input and returns what is read.
     *
     * @param resource $inputStream The handler resource
     * @param Question $question    The question being asked
     *
     * @return string|false The input received, false in case input could not be read
     */
    private function readInput($inputStream, Question $question)
    {
        if (!$question->isMultiline()) {
            $cp = $this->setIOCodepage();
            $ret = fgets($inputStream, 4096);

            return $this->resetIOCodepage($cp, $ret);
        }

        $multiLineStreamReader = $this->cloneInputStream($inputStream);
        if (null === $multiLineStreamReader) {
            return false;
        }

        $ret = '';
        $cp = $this->setIOCodepage();
        while (false !== ($char = fgetc($multiLineStreamReader))) {
            if (\PHP_EOL === "{$ret}{$char}") {
                break;
            }
            $ret .= $char;
        }

        return $this->resetIOCodepage($cp, $ret);
    }

    /**
     * Sets console I/O to the host code page.
     *
     * @return int Previous code page in IBM/EBCDIC format
     */
    private function setIOCodepage(): int
    {
        if (\function_exists('sapi_windows_cp_set')) {
            $cp = sapi_windows_cp_get();
            sapi_windows_cp_set(sapi_windows_cp_get('oem'));

            return $cp;
        }

        return 0;
    }

    /**
     * Sets console I/O to the specified code page and converts the user input.
     *
     * @param string|false $input
     *
     * @return string|false
     */
    private function resetIOCodepage(int $cp, $input)
    {
        if (0 !== $cp) {
            sapi_windows_cp_set($cp);

            if (false !== $input && '' !== $input) {
                $input = sapi_windows_cp_conv(sapi_windows_cp_get('oem'), $cp, $input);
            }
        }

        return $input;
    }

    /**
     * Clones an input stream in order to act on one instance of the same
     * stream without affecting the other instance.
     *
     * @param resource $inputStream The handler resource
     *
     * @return resource|null The cloned resource, null in case it could not be cloned
     */
    private function cloneInputStream($inputStream)
    {
        $streamMetaData = stream_get_meta_data($inputStream);
        $seekable = $streamMetaData['seekable'] ?? false;
        $mode = $streamMetaData['mode'] ?? 'rb';
        $uri = $streamMetaData['uri'] ?? null;

        if (null === $uri) {
            return null;
        }

        $cloneStream = fopen($uri, $mode);

        // For seekable and writable streams, add all the same data to the
        // cloned stream and then seek to the same offset.
        if (true === $seekable && !\in_array($mode, ['r', 'rb', 'rt'])) {
            $offset = ftell($inputStream);
            rewind($inputStream);
            stream_copy_to_stream($inputStream, $cloneStream);
            fseek($inputStream, $offset);
            fseek($cloneStream, $offset);
        }

        return $cloneStream;
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Helper;

use Symfony\Component\Console\Formatter\OutputFormatter;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Question\ChoiceQuestion;
use Symfony\Component\Console\Question\ConfirmationQuestion;
use Symfony\Component\Console\Question\Question;
use Symfony\Component\Console\Style\SymfonyStyle;

/**
 * Symfony Style Guide compliant question helper.
 *
 * @author Kevin Bond <kevinbond@gmail.com>
 */
class SymfonyQuestionHelper extends QuestionHelper
{
    /**
     * {@inheritdoc}
     */
    protected function writePrompt(OutputInterface $output, Question $question)
    {
        $text = OutputFormatter::escapeTrailingBackslash($question->getQuestion());
        $default = $question->getDefault();

        if ($question->isMultiline()) {
            $text .= sprintf(' (press %s to continue)', $this->getEofShortcut());
        }

        switch (true) {
            case null === $default:
                $text = sprintf(' <info>%s</info>:', $text);

                break;

            case $question instanceof ConfirmationQuestion:
                $text = sprintf(' <info>%s (yes/no)</info> [<comment>%s</comment>]:', $text, $default ? 'yes' : 'no');

                break;

            case $question instanceof ChoiceQuestion && $question->isMultiselect():
                $choices = $question->getChoices();
                $default = explode(',', $default);

                foreach ($default as $key => $value) {
                    $default[$key] = $choices[trim($value)];
                }

                $text = sprintf(' <info>%s</info> [<comment>%s</comment>]:', $text, OutputFormatter::escape(implode(', ', $default)));

                break;

            case $question instanceof ChoiceQuestion:
                $choices = $question->getChoices();
                $text = sprintf(' <info>%s</info> [<comment>%s</comment>]:', $text, OutputFormatter::escape($choices[$default] ?? $default));

                break;

            default:
                $text = sprintf(' <info>%s</info> [<comment>%s</comment>]:', $text, OutputFormatter::escape($default));
        }

        $output->writeln($text);

        $prompt = ' > ';

        if ($question instanceof ChoiceQuestion) {
            $output->writeln($this->formatChoiceQuestionChoices($question, 'comment'));

            $prompt = $question->getPrompt();
        }

        $output->write($prompt);
    }

    /**
     * {@inheritdoc}
     */
    protected function writeError(OutputInterface $output, \Exception $error)
    {
        if ($output instanceof SymfonyStyle) {
            $output->newLine();
            $output->error($error->getMessage());

            return;
        }

        parent::writeError($output, $error);
    }

    private function getEofShortcut(): string
    {
        if ('Windows' === \PHP_OS_FAMILY) {
            return '<comment>Ctrl+Z</comment> then <comment>Enter</comment>';
        }

        return '<comment>Ctrl+D</comment>';
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Helper;

use Symfony\Component\Console\Exception\InvalidArgumentException;
use Symfony\Component\Console\Exception\RuntimeException;
use Symfony\Component\Console\Formatter\OutputFormatter;
use Symfony\Component\Console\Formatter\WrappableOutputFormatterInterface;
use Symfony\Component\Console\Output\ConsoleSectionOutput;
use Symfony\Component\Console\Output\OutputInterface;

/**
 * Provides helpers to display a table.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Саша Стаменковић <umpirsky@gmail.com>
 * @author Abdellatif Ait boudad <a.aitboudad@gmail.com>
 * @author Max Grigorian <maxakawizard@gmail.com>
 * @author Dany Maillard <danymaillard93b@gmail.com>
 */
class Table
{
    private const SEPARATOR_TOP = 0;
    private const SEPARATOR_TOP_BOTTOM = 1;
    private const SEPARATOR_MID = 2;
    private const SEPARATOR_BOTTOM = 3;
    private const BORDER_OUTSIDE = 0;
    private const BORDER_INSIDE = 1;

    private $headerTitle;
    private $footerTitle;

    /**
     * Table headers.
     */
    private $headers = [];

    /**
     * Table rows.
     */
    private $rows = [];
    private $horizontal = false;

    /**
     * Column widths cache.
     */
    private $effectiveColumnWidths = [];

    /**
     * Number of columns cache.
     *
     * @var int
     */
    private $numberOfColumns;

    /**
     * @var OutputInterface
     */
    private $output;

    /**
     * @var TableStyle
     */
    private $style;

    /**
     * @var array
     */
    private $columnStyles = [];

    /**
     * User set column widths.
     *
     * @var array
     */
    private $columnWidths = [];
    private $columnMaxWidths = [];

    /**
     * @var array<string, TableStyle>|null
     */
    private static $styles;

    private $rendered = false;

    public function __construct(OutputInterface $output)
    {
        $this->output = $output;

        if (!self::$styles) {
            self::$styles = self::initStyles();
        }

        $this->setStyle('default');
    }

    /**
     * Sets a style definition.
     */
    public static function setStyleDefinition(string $name, TableStyle $style)
    {
        if (!self::$styles) {
            self::$styles = self::initStyles();
        }

        self::$styles[$name] = $style;
    }

    /**
     * Gets a style definition by name.
     *
     * @return TableStyle
     */
    public static function getStyleDefinition(string $name)
    {
        if (!self::$styles) {
            self::$styles = self::initStyles();
        }

        if (isset(self::$styles[$name])) {
            return self::$styles[$name];
        }

        throw new InvalidArgumentException(sprintf('Style "%s" is not defined.', $name));
    }

    /**
     * Sets table style.
     *
     * @param TableStyle|string $name The style name or a TableStyle instance
     *
     * @return $this
     */
    public function setStyle($name)
    {
        $this->style = $this->resolveStyle($name);

        return $this;
    }

    /**
     * Gets the current table style.
     *
     * @return TableStyle
     */
    public function getStyle()
    {
        return $this->style;
    }

    /**
     * Sets table column style.
     *
     * @param TableStyle|string $name The style name or a TableStyle instance
     *
     * @return $this
     */
    public function setColumnStyle(int $columnIndex, $name)
    {
        $this->columnStyles[$columnIndex] = $this->resolveStyle($name);

        return $this;
    }

    /**
     * Gets the current style for a column.
     *
     * If style was not set, it returns the global table style.
     *
     * @return TableStyle
     */
    public function getColumnStyle(int $columnIndex)
    {
        return $this->columnStyles[$columnIndex] ?? $this->getStyle();
    }

    /**
     * Sets the minimum width of a column.
     *
     * @return $this
     */
    public function setColumnWidth(int $columnIndex, int $width)
    {
        $this->columnWidths[$columnIndex] = $width;

        return $this;
    }

    /**
     * Sets the minimum width of all columns.
     *
     * @return $this
     */
    public function setColumnWidths(array $widths)
    {
        $this->columnWidths = [];
        foreach ($widths as $index => $width) {
            $this->setColumnWidth($index, $width);
        }

        return $this;
    }

    /**
     * Sets the maximum width of a column.
     *
     * Any cell within this column which contents exceeds the specified width will be wrapped into multiple lines, while
     * formatted strings are preserved.
     *
     * @return $this
     */
    public function setColumnMaxWidth(int $columnIndex, int $width): self
    {
        if (!$this->output->getFormatter() instanceof WrappableOutputFormatterInterface) {
            throw new \LogicException(sprintf('Setting a maximum column width is only supported when using a "%s" formatter, got "%s".', WrappableOutputFormatterInterface::class, get_debug_type($this->output->getFormatter())));
        }

        $this->columnMaxWidths[$columnIndex] = $width;

        return $this;
    }

    /**
     * @return $this
     */
    public function setHeaders(array $headers)
    {
        $headers = array_values($headers);
        if (!empty($headers) && !\is_array($headers[0])) {
            $headers = [$headers];
        }

        $this->headers = $headers;

        return $this;
    }

    public function setRows(array $rows)
    {
        $this->rows = [];

        return $this->addRows($rows);
    }

    /**
     * @return $this
     */
    public function addRows(array $rows)
    {
        foreach ($rows as $row) {
            $this->addRow($row);
        }

        return $this;
    }

    /**
     * @return $this
     */
    public function addRow($row)
    {
        if ($row instanceof TableSeparator) {
            $this->rows[] = $row;

            return $this;
        }

        if (!\is_array($row)) {
            throw new InvalidArgumentException('A row must be an array or a TableSeparator instance.');
        }

        $this->rows[] = array_values($row);

        return $this;
    }

    /**
     * Adds a row to the table, and re-renders the table.
     *
     * @return $this
     */
    public function appendRow($row): self
    {
        if (!$this->output instanceof ConsoleSectionOutput) {
            throw new RuntimeException(sprintf('Output should be an instance of "%s" when calling "%s".', ConsoleSectionOutput::class, __METHOD__));
        }

        if ($this->rendered) {
            $this->output->clear($this->calculateRowCount());
        }

        $this->addRow($row);
        $this->render();

        return $this;
    }

    /**
     * @return $this
     */
    public function setRow($column, array $row)
    {
        $this->rows[$column] = $row;

        return $this;
    }

    /**
     * @return $this
     */
    public function setHeaderTitle(?string $title): self
    {
        $this->headerTitle = $title;

        return $this;
    }

    /**
     * @return $this
     */
    public function setFooterTitle(?string $title): self
    {
        $this->footerTitle = $title;

        return $this;
    }

    /**
     * @return $this
     */
    public function setHorizontal(bool $horizontal = true): self
    {
        $this->horizontal = $horizontal;

        return $this;
    }

    /**
     * Renders table to output.
     *
     * Example:
     *
     *     +---------------+-----------------------+------------------+
     *     | ISBN          | Title                 | Author           |
     *     +---------------+-----------------------+------------------+
     *     | 99921-58-10-7 | Divine Comedy         | Dante Alighieri  |
     *     | 9971-5-0210-0 | A Tale of Two Cities  | Charles Dickens  |
     *     | 960-425-059-0 | The Lord of the Rings | J. R. R. Tolkien |
     *     +---------------+-----------------------+------------------+
     */
    public function render()
    {
        $divider = new TableSeparator();
        if ($this->horizontal) {
            $rows = [];
            foreach ($this->headers[0] ?? [] as $i => $header) {
                $rows[$i] = [$header];
                foreach ($this->rows as $row) {
                    if ($row instanceof TableSeparator) {
                        continue;
                    }
                    if (isset($row[$i])) {
                        $rows[$i][] = $row[$i];
                    } elseif ($rows[$i][0] instanceof TableCell && $rows[$i][0]->getColspan() >= 2) {
                        // Noop, there is a "title"
                    } else {
                        $rows[$i][] = null;
                    }
                }
            }
        } else {
            $rows = array_merge($this->headers, [$divider], $this->rows);
        }

        $this->calculateNumberOfColumns($rows);

        $rowGroups = $this->buildTableRows($rows);
        $this->calculateColumnsWidth($rowGroups);

        $isHeader = !$this->horizontal;
        $isFirstRow = $this->horizontal;
        $hasTitle = (bool) $this->headerTitle;

        foreach ($rowGroups as $rowGroup) {
            $isHeaderSeparatorRendered = false;

            foreach ($rowGroup as $row) {
                if ($divider === $row) {
                    $isHeader = false;
                    $isFirstRow = true;

                    continue;
                }

                if ($row instanceof TableSeparator) {
                    $this->renderRowSeparator();

                    continue;
                }

                if (!$row) {
                    continue;
                }

                if ($isHeader && !$isHeaderSeparatorRendered) {
                    $this->renderRowSeparator(
                        $isHeader ? self::SEPARATOR_TOP : self::SEPARATOR_TOP_BOTTOM,
                        $hasTitle ? $this->headerTitle : null,
                        $hasTitle ? $this->style->getHeaderTitleFormat() : null
                    );
                    $hasTitle = false;
                    $isHeaderSeparatorRendered = true;
                }

                if ($isFirstRow) {
                    $this->renderRowSeparator(
                        $isHeader ? self::SEPARATOR_TOP : self::SEPARATOR_TOP_BOTTOM,
                        $hasTitle ? $this->headerTitle : null,
                        $hasTitle ? $this->style->getHeaderTitleFormat() : null
                    );
                    $isFirstRow = false;
                    $hasTitle = false;
                }

                if ($this->horizontal) {
                    $this->renderRow($row, $this->style->getCellRowFormat(), $this->style->getCellHeaderFormat());
                } else {
                    $this->renderRow($row, $isHeader ? $this->style->getCellHeaderFormat() : $this->style->getCellRowFormat());
                }
            }
        }
        $this->renderRowSeparator(self::SEPARATOR_BOTTOM, $this->footerTitle, $this->style->getFooterTitleFormat());

        $this->cleanup();
        $this->rendered = true;
    }

    /**
     * Renders horizontal header separator.
     *
     * Example:
     *
     *     +-----+-----------+-------+
     */
    private function renderRowSeparator(int $type = self::SEPARATOR_MID, string $title = null, string $titleFormat = null)
    {
        if (0 === $count = $this->numberOfColumns) {
            return;
        }

        $borders = $this->style->getBorderChars();
        if (!$borders[0] && !$borders[2] && !$this->style->getCrossingChar()) {
            return;
        }

        $crossings = $this->style->getCrossingChars();
        if (self::SEPARATOR_MID === $type) {
            [$horizontal, $leftChar, $midChar, $rightChar] = [$borders[2], $crossings[8], $crossings[0], $crossings[4]];
        } elseif (self::SEPARATOR_TOP === $type) {
            [$horizontal, $leftChar, $midChar, $rightChar] = [$borders[0], $crossings[1], $crossings[2], $crossings[3]];
        } elseif (self::SEPARATOR_TOP_BOTTOM === $type) {
            [$horizontal, $leftChar, $midChar, $rightChar] = [$borders[0], $crossings[9], $crossings[10], $crossings[11]];
        } else {
            [$horizontal, $leftChar, $midChar, $rightChar] = [$borders[0], $crossings[7], $crossings[6], $crossings[5]];
        }

        $markup = $leftChar;
        for ($column = 0; $column < $count; ++$column) {
            $markup .= str_repeat($horizontal, $this->effectiveColumnWidths[$column]);
            $markup .= $column === $count - 1 ? $rightChar : $midChar;
        }

        if (null !== $title) {
            $titleLength = Helper::width(Helper::removeDecoration($formatter = $this->output->getFormatter(), $formattedTitle = sprintf($titleFormat, $title)));
            $markupLength = Helper::width($markup);
            if ($titleLength > $limit = $markupLength - 4) {
                $titleLength = $limit;
                $formatLength = Helper::width(Helper::removeDecoration($formatter, sprintf($titleFormat, '')));
                $formattedTitle = sprintf($titleFormat, Helper::substr($title, 0, $limit - $formatLength - 3).'...');
            }

            $titleStart = intdiv($markupLength - $titleLength, 2);
            if (false === mb_detect_encoding($markup, null, true)) {
                $markup = substr_replace($markup, $formattedTitle, $titleStart, $titleLength);
            } else {
                $markup = mb_substr($markup, 0, $titleStart).$formattedTitle.mb_substr($markup, $titleStart + $titleLength);
            }
        }

        $this->output->writeln(sprintf($this->style->getBorderFormat(), $markup));
    }

    /**
     * Renders vertical column separator.
     */
    private function renderColumnSeparator(int $type = self::BORDER_OUTSIDE): string
    {
        $borders = $this->style->getBorderChars();

        return sprintf($this->style->getBorderFormat(), self::BORDER_OUTSIDE === $type ? $borders[1] : $borders[3]);
    }

    /**
     * Renders table row.
     *
     * Example:
     *
     *     | 9971-5-0210-0 | A Tale of Two Cities  | Charles Dickens  |
     */
    private function renderRow(array $row, string $cellFormat, string $firstCellFormat = null)
    {
        $rowContent = $this->renderColumnSeparator(self::BORDER_OUTSIDE);
        $columns = $this->getRowColumns($row);
        $last = \count($columns) - 1;
        foreach ($columns as $i => $column) {
            if ($firstCellFormat && 0 === $i) {
                $rowContent .= $this->renderCell($row, $column, $firstCellFormat);
            } else {
                $rowContent .= $this->renderCell($row, $column, $cellFormat);
            }
            $rowContent .= $this->renderColumnSeparator($last === $i ? self::BORDER_OUTSIDE : self::BORDER_INSIDE);
        }
        $this->output->writeln($rowContent);
    }

    /**
     * Renders table cell with padding.
     */
    private function renderCell(array $row, int $column, string $cellFormat): string
    {
        $cell = $row[$column] ?? '';
        $width = $this->effectiveColumnWidths[$column];
        if ($cell instanceof TableCell && $cell->getColspan() > 1) {
            // add the width of the following columns(numbers of colspan).
            foreach (range($column + 1, $column + $cell->getColspan() - 1) as $nextColumn) {
                $width += $this->getColumnSeparatorWidth() + $this->effectiveColumnWidths[$nextColumn];
            }
        }

        // str_pad won't work properly with multi-byte strings, we need to fix the padding
        if (false !== $encoding = mb_detect_encoding($cell, null, true)) {
            $width += \strlen($cell) - mb_strwidth($cell, $encoding);
        }

        $style = $this->getColumnStyle($column);

        if ($cell instanceof TableSeparator) {
            return sprintf($style->getBorderFormat(), str_repeat($style->getBorderChars()[2], $width));
        }

        $width += Helper::length($cell) - Helper::length(Helper::removeDecoration($this->output->getFormatter(), $cell));
        $content = sprintf($style->getCellRowContentFormat(), $cell);

        $padType = $style->getPadType();
        if ($cell instanceof TableCell && $cell->getStyle() instanceof TableCellStyle) {
            $isNotStyledByTag = !preg_match('/^<(\w+|(\w+=[\w,]+;?)*)>.+<\/(\w+|(\w+=\w+;?)*)?>$/', $cell);
            if ($isNotStyledByTag) {
                $cellFormat = $cell->getStyle()->getCellFormat();
                if (!\is_string($cellFormat)) {
                    $tag = http_build_query($cell->getStyle()->getTagOptions(), '', ';');
                    $cellFormat = '<'.$tag.'>%s</>';
                }

                if (strstr($content, '</>')) {
                    $content = str_replace('</>', '', $content);
                    $width -= 3;
                }
                if (strstr($content, '<fg=default;bg=default>')) {
                    $content = str_replace('<fg=default;bg=default>', '', $content);
                    $width -= \strlen('<fg=default;bg=default>');
                }
            }

            $padType = $cell->getStyle()->getPadByAlign();
        }

        return sprintf($cellFormat, str_pad($content, $width, $style->getPaddingChar(), $padType));
    }

    /**
     * Calculate number of columns for this table.
     */
    private function calculateNumberOfColumns(array $rows)
    {
        $columns = [0];
        foreach ($rows as $row) {
            if ($row instanceof TableSeparator) {
                continue;
            }

            $columns[] = $this->getNumberOfColumns($row);
        }

        $this->numberOfColumns = max($columns);
    }

    private function buildTableRows(array $rows): TableRows
    {
        /** @var WrappableOutputFormatterInterface $formatter */
        $formatter = $this->output->getFormatter();
        $unmergedRows = [];
        for ($rowKey = 0; $rowKey < \count($rows); ++$rowKey) {
            $rows = $this->fillNextRows($rows, $rowKey);

            // Remove any new line breaks and replace it with a new line
            foreach ($rows[$rowKey] as $column => $cell) {
                $colspan = $cell instanceof TableCell ? $cell->getColspan() : 1;

                if (isset($this->columnMaxWidths[$column]) && Helper::width(Helper::removeDecoration($formatter, $cell)) > $this->columnMaxWidths[$column]) {
                    $cell = $formatter->formatAndWrap($cell, $this->columnMaxWidths[$column] * $colspan);
                }
                if (!strstr($cell ?? '', "\n")) {
                    continue;
                }
                $escaped = implode("\n", array_map([OutputFormatter::class, 'escapeTrailingBackslash'], explode("\n", $cell)));
                $cell = $cell instanceof TableCell ? new TableCell($escaped, ['colspan' => $cell->getColspan()]) : $escaped;
                $lines = explode("\n", str_replace("\n", "<fg=default;bg=default></>\n", $cell));
                foreach ($lines as $lineKey => $line) {
                    if ($colspan > 1) {
                        $line = new TableCell($line, ['colspan' => $colspan]);
                    }
                    if (0 === $lineKey) {
                        $rows[$rowKey][$column] = $line;
                    } else {
                        if (!\array_key_exists($rowKey, $unmergedRows) || !\array_key_exists($lineKey, $unmergedRows[$rowKey])) {
                            $unmergedRows[$rowKey][$lineKey] = $this->copyRow($rows, $rowKey);
                        }
                        $unmergedRows[$rowKey][$lineKey][$column] = $line;
                    }
                }
            }
        }

        return new TableRows(function () use ($rows, $unmergedRows): \Traversable {
            foreach ($rows as $rowKey => $row) {
                $rowGroup = [$row instanceof TableSeparator ? $row : $this->fillCells($row)];

                if (isset($unmergedRows[$rowKey])) {
                    foreach ($unmergedRows[$rowKey] as $row) {
                        $rowGroup[] = $row instanceof TableSeparator ? $row : $this->fillCells($row);
                    }
                }
                yield $rowGroup;
            }
        });
    }

    private function calculateRowCount(): int
    {
        $numberOfRows = \count(iterator_to_array($this->buildTableRows(array_merge($this->headers, [new TableSeparator()], $this->rows))));

        if ($this->headers) {
            ++$numberOfRows; // Add row for header separator
        }

        if (\count($this->rows) > 0) {
            ++$numberOfRows; // Add row for footer separator
        }

        return $numberOfRows;
    }

    /**
     * fill rows that contains rowspan > 1.
     *
     * @throws InvalidArgumentException
     */
    private function fillNextRows(array $rows, int $line): array
    {
        $unmergedRows = [];
        foreach ($rows[$line] as $column => $cell) {
            if (null !== $cell && !$cell instanceof TableCell && !\is_scalar($cell) && !(\is_object($cell) && method_exists($cell, '__toString'))) {
                throw new InvalidArgumentException(sprintf('A cell must be a TableCell, a scalar or an object implementing "__toString()", "%s" given.', get_debug_type($cell)));
            }
            if ($cell instanceof TableCell && $cell->getRowspan() > 1) {
                $nbLines = $cell->getRowspan() - 1;
                $lines = [$cell];
                if (strstr($cell, "\n")) {
                    $lines = explode("\n", str_replace("\n", "<fg=default;bg=default>\n</>", $cell));
                    $nbLines = \count($lines) > $nbLines ? substr_count($cell, "\n") : $nbLines;

                    $rows[$line][$column] = new TableCell($lines[0], ['colspan' => $cell->getColspan(), 'style' => $cell->getStyle()]);
                    unset($lines[0]);
                }

                // create a two dimensional array (rowspan x colspan)
                $unmergedRows = array_replace_recursive(array_fill($line + 1, $nbLines, []), $unmergedRows);
                foreach ($unmergedRows as $unmergedRowKey => $unmergedRow) {
                    $value = $lines[$unmergedRowKey - $line] ?? '';
                    $unmergedRows[$unmergedRowKey][$column] = new TableCell($value, ['colspan' => $cell->getColspan(), 'style' => $cell->getStyle()]);
                    if ($nbLines === $unmergedRowKey - $line) {
                        break;
                    }
                }
            }
        }

        foreach ($unmergedRows as $unmergedRowKey => $unmergedRow) {
            // we need to know if $unmergedRow will be merged or inserted into $rows
            if (isset($rows[$unmergedRowKey]) && \is_array($rows[$unmergedRowKey]) && ($this->getNumberOfColumns($rows[$unmergedRowKey]) + $this->getNumberOfColumns($unmergedRows[$unmergedRowKey]) <= $this->numberOfColumns)) {
                foreach ($unmergedRow as $cellKey => $cell) {
                    // insert cell into row at cellKey position
                    array_splice($rows[$unmergedRowKey], $cellKey, 0, [$cell]);
                }
            } else {
                $row = $this->copyRow($rows, $unmergedRowKey - 1);
                foreach ($unmergedRow as $column => $cell) {
                    if (!empty($cell)) {
                        $row[$column] = $unmergedRow[$column];
                    }
                }
                array_splice($rows, $unmergedRowKey, 0, [$row]);
            }
        }

        return $rows;
    }

    /**
     * fill cells for a row that contains colspan > 1.
     */
    private function fillCells(iterable $row)
    {
        $newRow = [];

        foreach ($row as $column => $cell) {
            $newRow[] = $cell;
            if ($cell instanceof TableCell && $cell->getColspan() > 1) {
                foreach (range($column + 1, $column + $cell->getColspan() - 1) as $position) {
                    // insert empty value at column position
                    $newRow[] = '';
                }
            }
        }

        return $newRow ?: $row;
    }

    private function copyRow(array $rows, int $line): array
    {
        $row = $rows[$line];
        foreach ($row as $cellKey => $cellValue) {
            $row[$cellKey] = '';
            if ($cellValue instanceof TableCell) {
                $row[$cellKey] = new TableCell('', ['colspan' => $cellValue->getColspan()]);
            }
        }

        return $row;
    }

    /**
     * Gets number of columns by row.
     */
    private function getNumberOfColumns(array $row): int
    {
        $columns = \count($row);
        foreach ($row as $column) {
            $columns += $column instanceof TableCell ? ($column->getColspan() - 1) : 0;
        }

        return $columns;
    }

    /**
     * Gets list of columns for the given row.
     */
    private function getRowColumns(array $row): array
    {
        $columns = range(0, $this->numberOfColumns - 1);
        foreach ($row as $cellKey => $cell) {
            if ($cell instanceof TableCell && $cell->getColspan() > 1) {
                // exclude grouped columns.
                $columns = array_diff($columns, range($cellKey + 1, $cellKey + $cell->getColspan() - 1));
            }
        }

        return $columns;
    }

    /**
     * Calculates columns widths.
     */
    private function calculateColumnsWidth(iterable $groups)
    {
        for ($column = 0; $column < $this->numberOfColumns; ++$column) {
            $lengths = [];
            foreach ($groups as $group) {
                foreach ($group as $row) {
                    if ($row instanceof TableSeparator) {
                        continue;
                    }

                    foreach ($row as $i => $cell) {
                        if ($cell instanceof TableCell) {
                            $textContent = Helper::removeDecoration($this->output->getFormatter(), $cell);
                            $textLength = Helper::width($textContent);
                            if ($textLength > 0) {
                                $contentColumns = mb_str_split($textContent, ceil($textLength / $cell->getColspan()));
                                foreach ($contentColumns as $position => $content) {
                                    $row[$i + $position] = $content;
                                }
                            }
                        }
                    }

                    $lengths[] = $this->getCellWidth($row, $column);
                }
            }

            $this->effectiveColumnWidths[$column] = max($lengths) + Helper::width($this->style->getCellRowContentFormat()) - 2;
        }
    }

    private function getColumnSeparatorWidth(): int
    {
        return Helper::width(sprintf($this->style->getBorderFormat(), $this->style->getBorderChars()[3]));
    }

    private function getCellWidth(array $row, int $column): int
    {
        $cellWidth = 0;

        if (isset($row[$column])) {
            $cell = $row[$column];
            $cellWidth = Helper::width(Helper::removeDecoration($this->output->getFormatter(), $cell));
        }

        $columnWidth = $this->columnWidths[$column] ?? 0;
        $cellWidth = max($cellWidth, $columnWidth);

        return isset($this->columnMaxWidths[$column]) ? min($this->columnMaxWidths[$column], $cellWidth) : $cellWidth;
    }

    /**
     * Called after rendering to cleanup cache data.
     */
    private function cleanup()
    {
        $this->effectiveColumnWidths = [];
        $this->numberOfColumns = null;
    }

    /**
     * @return array<string, TableStyle>
     */
    private static function initStyles(): array
    {
        $borderless = new TableStyle();
        $borderless
            ->setHorizontalBorderChars('=')
            ->setVerticalBorderChars(' ')
            ->setDefaultCrossingChar(' ')
        ;

        $compact = new TableStyle();
        $compact
            ->setHorizontalBorderChars('')
            ->setVerticalBorderChars('')
            ->setDefaultCrossingChar('')
            ->setCellRowContentFormat('%s ')
        ;

        $styleGuide = new TableStyle();
        $styleGuide
            ->setHorizontalBorderChars('-')
            ->setVerticalBorderChars(' ')
            ->setDefaultCrossingChar(' ')
            ->setCellHeaderFormat('%s')
        ;

        $box = (new TableStyle())
            ->setHorizontalBorderChars('─')
            ->setVerticalBorderChars('│')
            ->setCrossingChars('┼', '┌', '┬', '┐', '┤', '┘', '┴', '└', '├')
        ;

        $boxDouble = (new TableStyle())
            ->setHorizontalBorderChars('═', '─')
            ->setVerticalBorderChars('║', '│')
            ->setCrossingChars('┼', '╔', '╤', '╗', '╢', '╝', '╧', '╚', '╟', '╠', '╪', '╣')
        ;

        return [
            'default' => new TableStyle(),
            'borderless' => $borderless,
            'compact' => $compact,
            'symfony-style-guide' => $styleGuide,
            'box' => $box,
            'box-double' => $boxDouble,
        ];
    }

    private function resolveStyle($name): TableStyle
    {
        if ($name instanceof TableStyle) {
            return $name;
        }

        if (isset(self::$styles[$name])) {
            return self::$styles[$name];
        }

        throw new InvalidArgumentException(sprintf('Style "%s" is not defined.', $name));
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Helper;

use Symfony\Component\Console\Exception\InvalidArgumentException;

/**
 * @author Abdellatif Ait boudad <a.aitboudad@gmail.com>
 */
class TableCell
{
    private $value;
    private $options = [
        'rowspan' => 1,
        'colspan' => 1,
        'style' => null,
    ];

    public function __construct(string $value = '', array $options = [])
    {
        $this->value = $value;

        // check option names
        if ($diff = array_diff(array_keys($options), array_keys($this->options))) {
            throw new InvalidArgumentException(sprintf('The TableCell does not support the following options: \'%s\'.', implode('\', \'', $diff)));
        }

        if (isset($options['style']) && !$options['style'] instanceof TableCellStyle) {
            throw new InvalidArgumentException('The style option must be an instance of "TableCellStyle".');
        }

        $this->options = array_merge($this->options, $options);
    }

    /**
     * Returns the cell value.
     *
     * @return string
     */
    public function __toString()
    {
        return $this->value;
    }

    /**
     * Gets number of colspan.
     *
     * @return int
     */
    public function getColspan()
    {
        return (int) $this->options['colspan'];
    }

    /**
     * Gets number of rowspan.
     *
     * @return int
     */
    public function getRowspan()
    {
        return (int) $this->options['rowspan'];
    }

    public function getStyle(): ?TableCellStyle
    {
        return $this->options['style'];
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Helper;

use Symfony\Component\Console\Exception\InvalidArgumentException;

/**
 * @author Yewhen Khoptynskyi <khoptynskyi@gmail.com>
 */
class TableCellStyle
{
    public const DEFAULT_ALIGN = 'left';

    private const TAG_OPTIONS = [
        'fg',
        'bg',
        'options',
    ];

    private const ALIGN_MAP = [
        'left' => \STR_PAD_RIGHT,
        'center' => \STR_PAD_BOTH,
        'right' => \STR_PAD_LEFT,
    ];

    private $options = [
        'fg' => 'default',
        'bg' => 'default',
        'options' => null,
        'align' => self::DEFAULT_ALIGN,
        'cellFormat' => null,
    ];

    public function __construct(array $options = [])
    {
        if ($diff = array_diff(array_keys($options), array_keys($this->options))) {
            throw new InvalidArgumentException(sprintf('The TableCellStyle does not support the following options: \'%s\'.', implode('\', \'', $diff)));
        }

        if (isset($options['align']) && !\array_key_exists($options['align'], self::ALIGN_MAP)) {
            throw new InvalidArgumentException(sprintf('Wrong align value. Value must be following: \'%s\'.', implode('\', \'', array_keys(self::ALIGN_MAP))));
        }

        $this->options = array_merge($this->options, $options);
    }

    public function getOptions(): array
    {
        return $this->options;
    }

    /**
     * Gets options we need for tag for example fg, bg.
     *
     * @return string[]
     */
    public function getTagOptions()
    {
        return array_filter(
            $this->getOptions(),
            function ($key) {
                return \in_array($key, self::TAG_OPTIONS) && isset($this->options[$key]);
            },
            \ARRAY_FILTER_USE_KEY
        );
    }

    /**
     * @return int
     */
    public function getPadByAlign()
    {
        return self::ALIGN_MAP[$this->getOptions()['align']];
    }

    public function getCellFormat(): ?string
    {
        return $this->getOptions()['cellFormat'];
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Helper;

/**
 * @internal
 */
class TableRows implements \IteratorAggregate
{
    private $generator;

    public function __construct(\Closure $generator)
    {
        $this->generator = $generator;
    }

    public function getIterator(): \Traversable
    {
        return ($this->generator)();
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Helper;

/**
 * Marks a row as being a separator.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class TableSeparator extends TableCell
{
    public function __construct(array $options = [])
    {
        parent::__construct('', $options);
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Helper;

use Symfony\Component\Console\Exception\InvalidArgumentException;
use Symfony\Component\Console\Exception\LogicException;

/**
 * Defines the styles for a Table.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Саша Стаменковић <umpirsky@gmail.com>
 * @author Dany Maillard <danymaillard93b@gmail.com>
 */
class TableStyle
{
    private $paddingChar = ' ';
    private $horizontalOutsideBorderChar = '-';
    private $horizontalInsideBorderChar = '-';
    private $verticalOutsideBorderChar = '|';
    private $verticalInsideBorderChar = '|';
    private $crossingChar = '+';
    private $crossingTopRightChar = '+';
    private $crossingTopMidChar = '+';
    private $crossingTopLeftChar = '+';
    private $crossingMidRightChar = '+';
    private $crossingBottomRightChar = '+';
    private $crossingBottomMidChar = '+';
    private $crossingBottomLeftChar = '+';
    private $crossingMidLeftChar = '+';
    private $crossingTopLeftBottomChar = '+';
    private $crossingTopMidBottomChar = '+';
    private $crossingTopRightBottomChar = '+';
    private $headerTitleFormat = '<fg=black;bg=white;options=bold> %s </>';
    private $footerTitleFormat = '<fg=black;bg=white;options=bold> %s </>';
    private $cellHeaderFormat = '<info>%s</info>';
    private $cellRowFormat = '%s';
    private $cellRowContentFormat = ' %s ';
    private $borderFormat = '%s';
    private $padType = \STR_PAD_RIGHT;

    /**
     * Sets padding character, used for cell padding.
     *
     * @return $this
     */
    public function setPaddingChar(string $paddingChar)
    {
        if (!$paddingChar) {
            throw new LogicException('The padding char must not be empty.');
        }

        $this->paddingChar = $paddingChar;

        return $this;
    }

    /**
     * Gets padding character, used for cell padding.
     *
     * @return string
     */
    public function getPaddingChar()
    {
        return $this->paddingChar;
    }

    /**
     * Sets horizontal border characters.
     *
     * <code>
     * ╔═══════════════╤══════════════════════════╤══════════════════╗
     * 1 ISBN          2 Title                    │ Author           ║
     * ╠═══════════════╪══════════════════════════╪══════════════════╣
     * ║ 99921-58-10-7 │ Divine Comedy            │ Dante Alighieri  ║
     * ║ 9971-5-0210-0 │ A Tale of Two Cities     │ Charles Dickens  ║
     * ║ 960-425-059-0 │ The Lord of the Rings    │ J. R. R. Tolkien ║
     * ║ 80-902734-1-6 │ And Then There Were None │ Agatha Christie  ║
     * ╚═══════════════╧══════════════════════════╧══════════════════╝
     * </code>
     *
     * @return $this
     */
    public function setHorizontalBorderChars(string $outside, string $inside = null): self
    {
        $this->horizontalOutsideBorderChar = $outside;
        $this->horizontalInsideBorderChar = $inside ?? $outside;

        return $this;
    }

    /**
     * Sets vertical border characters.
     *
     * <code>
     * ╔═══════════════╤══════════════════════════╤══════════════════╗
     * ║ ISBN          │ Title                    │ Author           ║
     * ╠═══════1═══════╪══════════════════════════╪══════════════════╣
     * ║ 99921-58-10-7 │ Divine Comedy            │ Dante Alighieri  ║
     * ║ 9971-5-0210-0 │ A Tale of Two Cities     │ Charles Dickens  ║
     * ╟───────2───────┼──────────────────────────┼──────────────────╢
     * ║ 960-425-059-0 │ The Lord of the Rings    │ J. R. R. Tolkien ║
     * ║ 80-902734-1-6 │ And Then There Were None │ Agatha Christie  ║
     * ╚═══════════════╧══════════════════════════╧══════════════════╝
     * </code>
     *
     * @return $this
     */
    public function setVerticalBorderChars(string $outside, string $inside = null): self
    {
        $this->verticalOutsideBorderChar = $outside;
        $this->verticalInsideBorderChar = $inside ?? $outside;

        return $this;
    }

    /**
     * Gets border characters.
     *
     * @internal
     */
    public function getBorderChars(): array
    {
        return [
            $this->horizontalOutsideBorderChar,
            $this->verticalOutsideBorderChar,
            $this->horizontalInsideBorderChar,
            $this->verticalInsideBorderChar,
        ];
    }

    /**
     * Sets crossing characters.
     *
     * Example:
     * <code>
     * 1═══════════════2══════════════════════════2══════════════════3
     * ║ ISBN          │ Title                    │ Author           ║
     * 8'══════════════0'═════════════════════════0'═════════════════4'
     * ║ 99921-58-10-7 │ Divine Comedy            │ Dante Alighieri  ║
     * ║ 9971-5-0210-0 │ A Tale of Two Cities     │ Charles Dickens  ║
     * 8───────────────0──────────────────────────0──────────────────4
     * ║ 960-425-059-0 │ The Lord of the Rings    │ J. R. R. Tolkien ║
     * ║ 80-902734-1-6 │ And Then There Were None │ Agatha Christie  ║
     * 7═══════════════6══════════════════════════6══════════════════5
     * </code>
     *
     * @param string      $cross          Crossing char (see #0 of example)
     * @param string      $topLeft        Top left char (see #1 of example)
     * @param string      $topMid         Top mid char (see #2 of example)
     * @param string      $topRight       Top right char (see #3 of example)
     * @param string      $midRight       Mid right char (see #4 of example)
     * @param string      $bottomRight    Bottom right char (see #5 of example)
     * @param string      $bottomMid      Bottom mid char (see #6 of example)
     * @param string      $bottomLeft     Bottom left char (see #7 of example)
     * @param string      $midLeft        Mid left char (see #8 of example)
     * @param string|null $topLeftBottom  Top left bottom char (see #8' of example), equals to $midLeft if null
     * @param string|null $topMidBottom   Top mid bottom char (see #0' of example), equals to $cross if null
     * @param string|null $topRightBottom Top right bottom char (see #4' of example), equals to $midRight if null
     *
     * @return $this
     */
    public function setCrossingChars(string $cross, string $topLeft, string $topMid, string $topRight, string $midRight, string $bottomRight, string $bottomMid, string $bottomLeft, string $midLeft, string $topLeftBottom = null, string $topMidBottom = null, string $topRightBottom = null): self
    {
        $this->crossingChar = $cross;
        $this->crossingTopLeftChar = $topLeft;
        $this->crossingTopMidChar = $topMid;
        $this->crossingTopRightChar = $topRight;
        $this->crossingMidRightChar = $midRight;
        $this->crossingBottomRightChar = $bottomRight;
        $this->crossingBottomMidChar = $bottomMid;
        $this->crossingBottomLeftChar = $bottomLeft;
        $this->crossingMidLeftChar = $midLeft;
        $this->crossingTopLeftBottomChar = $topLeftBottom ?? $midLeft;
        $this->crossingTopMidBottomChar = $topMidBottom ?? $cross;
        $this->crossingTopRightBottomChar = $topRightBottom ?? $midRight;

        return $this;
    }

    /**
     * Sets default crossing character used for each cross.
     *
     * @see {@link setCrossingChars()} for setting each crossing individually.
     */
    public function setDefaultCrossingChar(string $char): self
    {
        return $this->setCrossingChars($char, $char, $char, $char, $char, $char, $char, $char, $char);
    }

    /**
     * Gets crossing character.
     *
     * @return string
     */
    public function getCrossingChar()
    {
        return $this->crossingChar;
    }

    /**
     * Gets crossing characters.
     *
     * @internal
     */
    public function getCrossingChars(): array
    {
        return [
            $this->crossingChar,
            $this->crossingTopLeftChar,
            $this->crossingTopMidChar,
            $this->crossingTopRightChar,
            $this->crossingMidRightChar,
            $this->crossingBottomRightChar,
            $this->crossingBottomMidChar,
            $this->crossingBottomLeftChar,
            $this->crossingMidLeftChar,
            $this->crossingTopLeftBottomChar,
            $this->crossingTopMidBottomChar,
            $this->crossingTopRightBottomChar,
        ];
    }

    /**
     * Sets header cell format.
     *
     * @return $this
     */
    public function setCellHeaderFormat(string $cellHeaderFormat)
    {
        $this->cellHeaderFormat = $cellHeaderFormat;

        return $this;
    }

    /**
     * Gets header cell format.
     *
     * @return string
     */
    public function getCellHeaderFormat()
    {
        return $this->cellHeaderFormat;
    }

    /**
     * Sets row cell format.
     *
     * @return $this
     */
    public function setCellRowFormat(string $cellRowFormat)
    {
        $this->cellRowFormat = $cellRowFormat;

        return $this;
    }

    /**
     * Gets row cell format.
     *
     * @return string
     */
    public function getCellRowFormat()
    {
        return $this->cellRowFormat;
    }

    /**
     * Sets row cell content format.
     *
     * @return $this
     */
    public function setCellRowContentFormat(string $cellRowContentFormat)
    {
        $this->cellRowContentFormat = $cellRowContentFormat;

        return $this;
    }

    /**
     * Gets row cell content format.
     *
     * @return string
     */
    public function getCellRowContentFormat()
    {
        return $this->cellRowContentFormat;
    }

    /**
     * Sets table border format.
     *
     * @return $this
     */
    public function setBorderFormat(string $borderFormat)
    {
        $this->borderFormat = $borderFormat;

        return $this;
    }

    /**
     * Gets table border format.
     *
     * @return string
     */
    public function getBorderFormat()
    {
        return $this->borderFormat;
    }

    /**
     * Sets cell padding type.
     *
     * @return $this
     */
    public function setPadType(int $padType)
    {
        if (!\in_array($padType, [\STR_PAD_LEFT, \STR_PAD_RIGHT, \STR_PAD_BOTH], true)) {
            throw new InvalidArgumentException('Invalid padding type. Expected one of (STR_PAD_LEFT, STR_PAD_RIGHT, STR_PAD_BOTH).');
        }

        $this->padType = $padType;

        return $this;
    }

    /**
     * Gets cell padding type.
     *
     * @return int
     */
    public function getPadType()
    {
        return $this->padType;
    }

    public function getHeaderTitleFormat(): string
    {
        return $this->headerTitleFormat;
    }

    /**
     * @return $this
     */
    public function setHeaderTitleFormat(string $format): self
    {
        $this->headerTitleFormat = $format;

        return $this;
    }

    public function getFooterTitleFormat(): string
    {
        return $this->footerTitleFormat;
    }

    /**
     * @return $this
     */
    public function setFooterTitleFormat(string $format): self
    {
        $this->footerTitleFormat = $format;

        return $this;
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Input;

use Symfony\Component\Console\Exception\RuntimeException;

/**
 * ArgvInput represents an input coming from the CLI arguments.
 *
 * Usage:
 *
 *     $input = new ArgvInput();
 *
 * By default, the `$_SERVER['argv']` array is used for the input values.
 *
 * This can be overridden by explicitly passing the input values in the constructor:
 *
 *     $input = new ArgvInput($_SERVER['argv']);
 *
 * If you pass it yourself, don't forget that the first element of the array
 * is the name of the running application.
 *
 * When passing an argument to the constructor, be sure that it respects
 * the same rules as the argv one. It's almost always better to use the
 * `StringInput` when you want to provide your own input.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @see http://www.gnu.org/software/libc/manual/html_node/Argument-Syntax.html
 * @see http://www.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap12.html#tag_12_02
 */
class ArgvInput extends Input
{
    private $tokens;
    private $parsed;

    public function __construct(array $argv = null, InputDefinition $definition = null)
    {
        $argv = $argv ?? $_SERVER['argv'] ?? [];

        // strip the application name
        array_shift($argv);

        $this->tokens = $argv;

        parent::__construct($definition);
    }

    protected function setTokens(array $tokens)
    {
        $this->tokens = $tokens;
    }

    /**
     * {@inheritdoc}
     */
    protected function parse()
    {
        $parseOptions = true;
        $this->parsed = $this->tokens;
        while (null !== $token = array_shift($this->parsed)) {
            $parseOptions = $this->parseToken($token, $parseOptions);
        }
    }

    protected function parseToken(string $token, bool $parseOptions): bool
    {
        if ($parseOptions && '' == $token) {
            $this->parseArgument($token);
        } elseif ($parseOptions && '--' == $token) {
            return false;
        } elseif ($parseOptions && str_starts_with($token, '--')) {
            $this->parseLongOption($token);
        } elseif ($parseOptions && '-' === $token[0] && '-' !== $token) {
            $this->parseShortOption($token);
        } else {
            $this->parseArgument($token);
        }

        return $parseOptions;
    }

    /**
     * Parses a short option.
     */
    private function parseShortOption(string $token)
    {
        $name = substr($token, 1);

        if (\strlen($name) > 1) {
            if ($this->definition->hasShortcut($name[0]) && $this->definition->getOptionForShortcut($name[0])->acceptValue()) {
                // an option with a value (with no space)
                $this->addShortOption($name[0], substr($name, 1));
            } else {
                $this->parseShortOptionSet($name);
            }
        } else {
            $this->addShortOption($name, null);
        }
    }

    /**
     * Parses a short option set.
     *
     * @throws RuntimeException When option given doesn't exist
     */
    private function parseShortOptionSet(string $name)
    {
        $len = \strlen($name);
        for ($i = 0; $i < $len; ++$i) {
            if (!$this->definition->hasShortcut($name[$i])) {
                $encoding = mb_detect_encoding($name, null, true);
                throw new RuntimeException(sprintf('The "-%s" option does not exist.', false === $encoding ? $name[$i] : mb_substr($name, $i, 1, $encoding)));
            }

            $option = $this->definition->getOptionForShortcut($name[$i]);
            if ($option->acceptValue()) {
                $this->addLongOption($option->getName(), $i === $len - 1 ? null : substr($name, $i + 1));

                break;
            } else {
                $this->addLongOption($option->getName(), null);
            }
        }
    }

    /**
     * Parses a long option.
     */
    private function parseLongOption(string $token)
    {
        $name = substr($token, 2);

        if (false !== $pos = strpos($name, '=')) {
            if ('' === $value = substr($name, $pos + 1)) {
                array_unshift($this->parsed, $value);
            }
            $this->addLongOption(substr($name, 0, $pos), $value);
        } else {
            $this->addLongOption($name, null);
        }
    }

    /**
     * Parses an argument.
     *
     * @throws RuntimeException When too many arguments are given
     */
    private function parseArgument(string $token)
    {
        $c = \count($this->arguments);

        // if input is expecting another argument, add it
        if ($this->definition->hasArgument($c)) {
            $arg = $this->definition->getArgument($c);
            $this->arguments[$arg->getName()] = $arg->isArray() ? [$token] : $token;

        // if last argument isArray(), append token to last argument
        } elseif ($this->definition->hasArgument($c - 1) && $this->definition->getArgument($c - 1)->isArray()) {
            $arg = $this->definition->getArgument($c - 1);
            $this->arguments[$arg->getName()][] = $token;

        // unexpected argument
        } else {
            $all = $this->definition->getArguments();
            $symfonyCommandName = null;
            if (($inputArgument = $all[$key = array_key_first($all)] ?? null) && 'command' === $inputArgument->getName()) {
                $symfonyCommandName = $this->arguments['command'] ?? null;
                unset($all[$key]);
            }

            if (\count($all)) {
                if ($symfonyCommandName) {
                    $message = sprintf('Too many arguments to "%s" command, expected arguments "%s".', $symfonyCommandName, implode('" "', array_keys($all)));
                } else {
                    $message = sprintf('Too many arguments, expected arguments "%s".', implode('" "', array_keys($all)));
                }
            } elseif ($symfonyCommandName) {
                $message = sprintf('No arguments expected for "%s" command, got "%s".', $symfonyCommandName, $token);
            } else {
                $message = sprintf('No arguments expected, got "%s".', $token);
            }

            throw new RuntimeException($message);
        }
    }

    /**
     * Adds a short option value.
     *
     * @throws RuntimeException When option given doesn't exist
     */
    private function addShortOption(string $shortcut, $value)
    {
        if (!$this->definition->hasShortcut($shortcut)) {
            throw new RuntimeException(sprintf('The "-%s" option does not exist.', $shortcut));
        }

        $this->addLongOption($this->definition->getOptionForShortcut($shortcut)->getName(), $value);
    }

    /**
     * Adds a long option value.
     *
     * @throws RuntimeException When option given doesn't exist
     */
    private function addLongOption(string $name, $value)
    {
        if (!$this->definition->hasOption($name)) {
            if (!$this->definition->hasNegation($name)) {
                throw new RuntimeException(sprintf('The "--%s" option does not exist.', $name));
            }

            $optionName = $this->definition->negationToName($name);
            if (null !== $value) {
                throw new RuntimeException(sprintf('The "--%s" option does not accept a value.', $name));
            }
            $this->options[$optionName] = false;

            return;
        }

        $option = $this->definition->getOption($name);

        if (null !== $value && !$option->acceptValue()) {
            throw new RuntimeException(sprintf('The "--%s" option does not accept a value.', $name));
        }

        if (\in_array($value, ['', null], true) && $option->acceptValue() && \count($this->parsed)) {
            // if option accepts an optional or mandatory argument
            // let's see if there is one provided
            $next = array_shift($this->parsed);
            if ((isset($next[0]) && '-' !== $next[0]) || \in_array($next, ['', null], true)) {
                $value = $next;
            } else {
                array_unshift($this->parsed, $next);
            }
        }

        if (null === $value) {
            if ($option->isValueRequired()) {
                throw new RuntimeException(sprintf('The "--%s" option requires a value.', $name));
            }

            if (!$option->isArray() && !$option->isValueOptional()) {
                $value = true;
            }
        }

        if ($option->isArray()) {
            $this->options[$name][] = $value;
        } else {
            $this->options[$name] = $value;
        }
    }

    /**
     * {@inheritdoc}
     */
    public function getFirstArgument()
    {
        $isOption = false;
        foreach ($this->tokens as $i => $token) {
            if ($token && '-' === $token[0]) {
                if (str_contains($token, '=') || !isset($this->tokens[$i + 1])) {
                    continue;
                }

                // If it's a long option, consider that everything after "--" is the option name.
                // Otherwise, use the last char (if it's a short option set, only the last one can take a value with space separator)
                $name = '-' === $token[1] ? substr($token, 2) : substr($token, -1);
                if (!isset($this->options[$name]) && !$this->definition->hasShortcut($name)) {
                    // noop
                } elseif ((isset($this->options[$name]) || isset($this->options[$name = $this->definition->shortcutToName($name)])) && $this->tokens[$i + 1] === $this->options[$name]) {
                    $isOption = true;
                }

                continue;
            }

            if ($isOption) {
                $isOption = false;
                continue;
            }

            return $token;
        }

        return null;
    }

    /**
     * {@inheritdoc}
     */
    public function hasParameterOption($values, bool $onlyParams = false)
    {
        $values = (array) $values;

        foreach ($this->tokens as $token) {
            if ($onlyParams && '--' === $token) {
                return false;
            }
            foreach ($values as $value) {
                // Options with values:
                //   For long options, test for '--option=' at beginning
                //   For short options, test for '-o' at beginning
                $leading = str_starts_with($value, '--') ? $value.'=' : $value;
                if ($token === $value || '' !== $leading && str_starts_with($token, $leading)) {
                    return true;
                }
            }
        }

        return false;
    }

    /**
     * {@inheritdoc}
     */
    public function getParameterOption($values, $default = false, bool $onlyParams = false)
    {
        $values = (array) $values;
        $tokens = $this->tokens;

        while (0 < \count($tokens)) {
            $token = array_shift($tokens);
            if ($onlyParams && '--' === $token) {
                return $default;
            }

            foreach ($values as $value) {
                if ($token === $value) {
                    return array_shift($tokens);
                }
                // Options with values:
                //   For long options, test for '--option=' at beginning
                //   For short options, test for '-o' at beginning
                $leading = str_starts_with($value, '--') ? $value.'=' : $value;
                if ('' !== $leading && str_starts_with($token, $leading)) {
                    return substr($token, \strlen($leading));
                }
            }
        }

        return $default;
    }

    /**
     * Returns a stringified representation of the args passed to the command.
     *
     * @return string
     */
    public function __toString()
    {
        $tokens = array_map(function ($token) {
            if (preg_match('{^(-[^=]+=)(.+)}', $token, $match)) {
                return $match[1].$this->escapeToken($match[2]);
            }

            if ($token && '-' !== $token[0]) {
                return $this->escapeToken($token);
            }

            return $token;
        }, $this->tokens);

        return implode(' ', $tokens);
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Input;

use Symfony\Component\Console\Exception\InvalidArgumentException;
use Symfony\Component\Console\Exception\InvalidOptionException;

/**
 * ArrayInput represents an input provided as an array.
 *
 * Usage:
 *
 *     $input = new ArrayInput(['command' => 'foo:bar', 'foo' => 'bar', '--bar' => 'foobar']);
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class ArrayInput extends Input
{
    private $parameters;

    public function __construct(array $parameters, InputDefinition $definition = null)
    {
        $this->parameters = $parameters;

        parent::__construct($definition);
    }

    /**
     * {@inheritdoc}
     */
    public function getFirstArgument()
    {
        foreach ($this->parameters as $param => $value) {
            if ($param && \is_string($param) && '-' === $param[0]) {
                continue;
            }

            return $value;
        }

        return null;
    }

    /**
     * {@inheritdoc}
     */
    public function hasParameterOption($values, bool $onlyParams = false)
    {
        $values = (array) $values;

        foreach ($this->parameters as $k => $v) {
            if (!\is_int($k)) {
                $v = $k;
            }

            if ($onlyParams && '--' === $v) {
                return false;
            }

            if (\in_array($v, $values)) {
                return true;
            }
        }

        return false;
    }

    /**
     * {@inheritdoc}
     */
    public function getParameterOption($values, $default = false, bool $onlyParams = false)
    {
        $values = (array) $values;

        foreach ($this->parameters as $k => $v) {
            if ($onlyParams && ('--' === $k || (\is_int($k) && '--' === $v))) {
                return $default;
            }

            if (\is_int($k)) {
                if (\in_array($v, $values)) {
                    return true;
                }
            } elseif (\in_array($k, $values)) {
                return $v;
            }
        }

        return $default;
    }

    /**
     * Returns a stringified representation of the args passed to the command.
     *
     * @return string
     */
    public function __toString()
    {
        $params = [];
        foreach ($this->parameters as $param => $val) {
            if ($param && \is_string($param) && '-' === $param[0]) {
                $glue = ('-' === $param[1]) ? '=' : ' ';
                if (\is_array($val)) {
                    foreach ($val as $v) {
                        $params[] = $param.('' != $v ? $glue.$this->escapeToken($v) : '');
                    }
                } else {
                    $params[] = $param.('' != $val ? $glue.$this->escapeToken($val) : '');
                }
            } else {
                $params[] = \is_array($val) ? implode(' ', array_map([$this, 'escapeToken'], $val)) : $this->escapeToken($val);
            }
        }

        return implode(' ', $params);
    }

    /**
     * {@inheritdoc}
     */
    protected function parse()
    {
        foreach ($this->parameters as $key => $value) {
            if ('--' === $key) {
                return;
            }
            if (str_starts_with($key, '--')) {
                $this->addLongOption(substr($key, 2), $value);
            } elseif (str_starts_with($key, '-')) {
                $this->addShortOption(substr($key, 1), $value);
            } else {
                $this->addArgument($key, $value);
            }
        }
    }

    /**
     * Adds a short option value.
     *
     * @throws InvalidOptionException When option given doesn't exist
     */
    private function addShortOption(string $shortcut, $value)
    {
        if (!$this->definition->hasShortcut($shortcut)) {
            throw new InvalidOptionException(sprintf('The "-%s" option does not exist.', $shortcut));
        }

        $this->addLongOption($this->definition->getOptionForShortcut($shortcut)->getName(), $value);
    }

    /**
     * Adds a long option value.
     *
     * @throws InvalidOptionException When option given doesn't exist
     * @throws InvalidOptionException When a required value is missing
     */
    private function addLongOption(string $name, $value)
    {
        if (!$this->definition->hasOption($name)) {
            if (!$this->definition->hasNegation($name)) {
                throw new InvalidOptionException(sprintf('The "--%s" option does not exist.', $name));
            }

            $optionName = $this->definition->negationToName($name);
            $this->options[$optionName] = false;

            return;
        }

        $option = $this->definition->getOption($name);

        if (null === $value) {
            if ($option->isValueRequired()) {
                throw new InvalidOptionException(sprintf('The "--%s" option requires a value.', $name));
            }

            if (!$option->isValueOptional()) {
                $value = true;
            }
        }

        $this->options[$name] = $value;
    }

    /**
     * Adds an argument value.
     *
     * @param string|int $name  The argument name
     * @param mixed      $value The value for the argument
     *
     * @throws InvalidArgumentException When argument given doesn't exist
     */
    private function addArgument($name, $value)
    {
        if (!$this->definition->hasArgument($name)) {
            throw new InvalidArgumentException(sprintf('The "%s" argument does not exist.', $name));
        }

        $this->arguments[$name] = $value;
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Input;

use Symfony\Component\Console\Exception\InvalidArgumentException;
use Symfony\Component\Console\Exception\RuntimeException;

/**
 * Input is the base class for all concrete Input classes.
 *
 * Three concrete classes are provided by default:
 *
 *  * `ArgvInput`: The input comes from the CLI arguments (argv)
 *  * `StringInput`: The input is provided as a string
 *  * `ArrayInput`: The input is provided as an array
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
abstract class Input implements InputInterface, StreamableInputInterface
{
    protected $definition;
    protected $stream;
    protected $options = [];
    protected $arguments = [];
    protected $interactive = true;

    public function __construct(InputDefinition $definition = null)
    {
        if (null === $definition) {
            $this->definition = new InputDefinition();
        } else {
            $this->bind($definition);
            $this->validate();
        }
    }

    /**
     * {@inheritdoc}
     */
    public function bind(InputDefinition $definition)
    {
        $this->arguments = [];
        $this->options = [];
        $this->definition = $definition;

        $this->parse();
    }

    /**
     * Processes command line arguments.
     */
    abstract protected function parse();

    /**
     * {@inheritdoc}
     */
    public function validate()
    {
        $definition = $this->definition;
        $givenArguments = $this->arguments;

        $missingArguments = array_filter(array_keys($definition->getArguments()), function ($argument) use ($definition, $givenArguments) {
            return !\array_key_exists($argument, $givenArguments) && $definition->getArgument($argument)->isRequired();
        });

        if (\count($missingArguments) > 0) {
            throw new RuntimeException(sprintf('Not enough arguments (missing: "%s").', implode(', ', $missingArguments)));
        }
    }

    /**
     * {@inheritdoc}
     */
    public function isInteractive()
    {
        return $this->interactive;
    }

    /**
     * {@inheritdoc}
     */
    public function setInteractive(bool $interactive)
    {
        $this->interactive = $interactive;
    }

    /**
     * {@inheritdoc}
     */
    public function getArguments()
    {
        return array_merge($this->definition->getArgumentDefaults(), $this->arguments);
    }

    /**
     * {@inheritdoc}
     */
    public function getArgument(string $name)
    {
        if (!$this->definition->hasArgument($name)) {
            throw new InvalidArgumentException(sprintf('The "%s" argument does not exist.', $name));
        }

        return $this->arguments[$name] ?? $this->definition->getArgument($name)->getDefault();
    }

    /**
     * {@inheritdoc}
     */
    public function setArgument(string $name, $value)
    {
        if (!$this->definition->hasArgument($name)) {
            throw new InvalidArgumentException(sprintf('The "%s" argument does not exist.', $name));
        }

        $this->arguments[$name] = $value;
    }

    /**
     * {@inheritdoc}
     */
    public function hasArgument(string $name)
    {
        return $this->definition->hasArgument($name);
    }

    /**
     * {@inheritdoc}
     */
    public function getOptions()
    {
        return array_merge($this->definition->getOptionDefaults(), $this->options);
    }

    /**
     * {@inheritdoc}
     */
    public function getOption(string $name)
    {
        if ($this->definition->hasNegation($name)) {
            if (null === $value = $this->getOption($this->definition->negationToName($name))) {
                return $value;
            }

            return !$value;
        }

        if (!$this->definition->hasOption($name)) {
            throw new InvalidArgumentException(sprintf('The "%s" option does not exist.', $name));
        }

        return \array_key_exists($name, $this->options) ? $this->options[$name] : $this->definition->getOption($name)->getDefault();
    }

    /**
     * {@inheritdoc}
     */
    public function setOption(string $name, $value)
    {
        if ($this->definition->hasNegation($name)) {
            $this->options[$this->definition->negationToName($name)] = !$value;

            return;
        } elseif (!$this->definition->hasOption($name)) {
            throw new InvalidArgumentException(sprintf('The "%s" option does not exist.', $name));
        }

        $this->options[$name] = $value;
    }

    /**
     * {@inheritdoc}
     */
    public function hasOption(string $name)
    {
        return $this->definition->hasOption($name) || $this->definition->hasNegation($name);
    }

    /**
     * Escapes a token through escapeshellarg if it contains unsafe chars.
     *
     * @return string
     */
    public function escapeToken(string $token)
    {
        return preg_match('{^[\w-]+$}', $token) ? $token : escapeshellarg($token);
    }

    /**
     * {@inheritdoc}
     */
    public function setStream($stream)
    {
        $this->stream = $stream;
    }

    /**
     * {@inheritdoc}
     */
    public function getStream()
    {
        return $this->stream;
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Input;

use Symfony\Component\Console\Exception\InvalidArgumentException;
use Symfony\Component\Console\Exception\LogicException;

/**
 * Represents a command line argument.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class InputArgument
{
    public const REQUIRED = 1;
    public const OPTIONAL = 2;
    public const IS_ARRAY = 4;

    private $name;
    private $mode;
    private $default;
    private $description;

    /**
     * @param string                           $name        The argument name
     * @param int|null                         $mode        The argument mode: a bit mask of self::REQUIRED, self::OPTIONAL and self::IS_ARRAY
     * @param string                           $description A description text
     * @param string|bool|int|float|array|null $default     The default value (for self::OPTIONAL mode only)
     *
     * @throws InvalidArgumentException When argument mode is not valid
     */
    public function __construct(string $name, int $mode = null, string $description = '', $default = null)
    {
        if (null === $mode) {
            $mode = self::OPTIONAL;
        } elseif ($mode > 7 || $mode < 1) {
            throw new InvalidArgumentException(sprintf('Argument mode "%s" is not valid.', $mode));
        }

        $this->name = $name;
        $this->mode = $mode;
        $this->description = $description;

        $this->setDefault($default);
    }

    /**
     * Returns the argument name.
     *
     * @return string
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * Returns true if the argument is required.
     *
     * @return bool true if parameter mode is self::REQUIRED, false otherwise
     */
    public function isRequired()
    {
        return self::REQUIRED === (self::REQUIRED & $this->mode);
    }

    /**
     * Returns true if the argument can take multiple values.
     *
     * @return bool true if mode is self::IS_ARRAY, false otherwise
     */
    public function isArray()
    {
        return self::IS_ARRAY === (self::IS_ARRAY & $this->mode);
    }

    /**
     * Sets the default value.
     *
     * @param string|bool|int|float|array|null $default
     *
     * @throws LogicException When incorrect default value is given
     */
    public function setDefault($default = null)
    {
        if ($this->isRequired() && null !== $default) {
            throw new LogicException('Cannot set a default value except for InputArgument::OPTIONAL mode.');
        }

        if ($this->isArray()) {
            if (null === $default) {
                $default = [];
            } elseif (!\is_array($default)) {
                throw new LogicException('A default value for an array argument must be an array.');
            }
        }

        $this->default = $default;
    }

    /**
     * Returns the default value.
     *
     * @return string|bool|int|float|array|null
     */
    public function getDefault()
    {
        return $this->default;
    }

    /**
     * Returns the description text.
     *
     * @return string
     */
    public function getDescription()
    {
        return $this->description;
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Input;

/**
 * InputAwareInterface should be implemented by classes that depends on the
 * Console Input.
 *
 * @author Wouter J <waldio.webdesign@gmail.com>
 */
interface InputAwareInterface
{
    /**
     * Sets the Console Input.
     */
    public function setInput(InputInterface $input);
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Input;

use Symfony\Component\Console\Exception\InvalidArgumentException;
use Symfony\Component\Console\Exception\LogicException;

/**
 * A InputDefinition represents a set of valid command line arguments and options.
 *
 * Usage:
 *
 *     $definition = new InputDefinition([
 *         new InputArgument('name', InputArgument::REQUIRED),
 *         new InputOption('foo', 'f', InputOption::VALUE_REQUIRED),
 *     ]);
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class InputDefinition
{
    private $arguments;
    private $requiredCount;
    private $lastArrayArgument;
    private $lastOptionalArgument;
    private $options;
    private $negations;
    private $shortcuts;

    /**
     * @param array $definition An array of InputArgument and InputOption instance
     */
    public function __construct(array $definition = [])
    {
        $this->setDefinition($definition);
    }

    /**
     * Sets the definition of the input.
     */
    public function setDefinition(array $definition)
    {
        $arguments = [];
        $options = [];
        foreach ($definition as $item) {
            if ($item instanceof InputOption) {
                $options[] = $item;
            } else {
                $arguments[] = $item;
            }
        }

        $this->setArguments($arguments);
        $this->setOptions($options);
    }

    /**
     * Sets the InputArgument objects.
     *
     * @param InputArgument[] $arguments An array of InputArgument objects
     */
    public function setArguments(array $arguments = [])
    {
        $this->arguments = [];
        $this->requiredCount = 0;
        $this->lastOptionalArgument = null;
        $this->lastArrayArgument = null;
        $this->addArguments($arguments);
    }

    /**
     * Adds an array of InputArgument objects.
     *
     * @param InputArgument[] $arguments An array of InputArgument objects
     */
    public function addArguments(?array $arguments = [])
    {
        if (null !== $arguments) {
            foreach ($arguments as $argument) {
                $this->addArgument($argument);
            }
        }
    }

    /**
     * @throws LogicException When incorrect argument is given
     */
    public function addArgument(InputArgument $argument)
    {
        if (isset($this->arguments[$argument->getName()])) {
            throw new LogicException(sprintf('An argument with name "%s" already exists.', $argument->getName()));
        }

        if (null !== $this->lastArrayArgument) {
            throw new LogicException(sprintf('Cannot add a required argument "%s" after an array argument "%s".', $argument->getName(), $this->lastArrayArgument->getName()));
        }

        if ($argument->isRequired() && null !== $this->lastOptionalArgument) {
            throw new LogicException(sprintf('Cannot add a required argument "%s" after an optional one "%s".', $argument->getName(), $this->lastOptionalArgument->getName()));
        }

        if ($argument->isArray()) {
            $this->lastArrayArgument = $argument;
        }

        if ($argument->isRequired()) {
            ++$this->requiredCount;
        } else {
            $this->lastOptionalArgument = $argument;
        }

        $this->arguments[$argument->getName()] = $argument;
    }

    /**
     * Returns an InputArgument by name or by position.
     *
     * @param string|int $name The InputArgument name or position
     *
     * @return InputArgument
     *
     * @throws InvalidArgumentException When argument given doesn't exist
     */
    public function getArgument($name)
    {
        if (!$this->hasArgument($name)) {
            throw new InvalidArgumentException(sprintf('The "%s" argument does not exist.', $name));
        }

        $arguments = \is_int($name) ? array_values($this->arguments) : $this->arguments;

        return $arguments[$name];
    }

    /**
     * Returns true if an InputArgument object exists by name or position.
     *
     * @param string|int $name The InputArgument name or position
     *
     * @return bool
     */
    public function hasArgument($name)
    {
        $arguments = \is_int($name) ? array_values($this->arguments) : $this->arguments;

        return isset($arguments[$name]);
    }

    /**
     * Gets the array of InputArgument objects.
     *
     * @return InputArgument[]
     */
    public function getArguments()
    {
        return $this->arguments;
    }

    /**
     * Returns the number of InputArguments.
     *
     * @return int
     */
    public function getArgumentCount()
    {
        return null !== $this->lastArrayArgument ? \PHP_INT_MAX : \count($this->arguments);
    }

    /**
     * Returns the number of required InputArguments.
     *
     * @return int
     */
    public function getArgumentRequiredCount()
    {
        return $this->requiredCount;
    }

    /**
     * @return array<string|bool|int|float|array|null>
     */
    public function getArgumentDefaults()
    {
        $values = [];
        foreach ($this->arguments as $argument) {
            $values[$argument->getName()] = $argument->getDefault();
        }

        return $values;
    }

    /**
     * Sets the InputOption objects.
     *
     * @param InputOption[] $options An array of InputOption objects
     */
    public function setOptions(array $options = [])
    {
        $this->options = [];
        $this->shortcuts = [];
        $this->negations = [];
        $this->addOptions($options);
    }

    /**
     * Adds an array of InputOption objects.
     *
     * @param InputOption[] $options An array of InputOption objects
     */
    public function addOptions(array $options = [])
    {
        foreach ($options as $option) {
            $this->addOption($option);
        }
    }

    /**
     * @throws LogicException When option given already exist
     */
    public function addOption(InputOption $option)
    {
        if (isset($this->options[$option->getName()]) && !$option->equals($this->options[$option->getName()])) {
            throw new LogicException(sprintf('An option named "%s" already exists.', $option->getName()));
        }
        if (isset($this->negations[$option->getName()])) {
            throw new LogicException(sprintf('An option named "%s" already exists.', $option->getName()));
        }

        if ($option->getShortcut()) {
            foreach (explode('|', $option->getShortcut()) as $shortcut) {
                if (isset($this->shortcuts[$shortcut]) && !$option->equals($this->options[$this->shortcuts[$shortcut]])) {
                    throw new LogicException(sprintf('An option with shortcut "%s" already exists.', $shortcut));
                }
            }
        }

        $this->options[$option->getName()] = $option;
        if ($option->getShortcut()) {
            foreach (explode('|', $option->getShortcut()) as $shortcut) {
                $this->shortcuts[$shortcut] = $option->getName();
            }
        }

        if ($option->isNegatable()) {
            $negatedName = 'no-'.$option->getName();
            if (isset($this->options[$negatedName])) {
                throw new LogicException(sprintf('An option named "%s" already exists.', $negatedName));
            }
            $this->negations[$negatedName] = $option->getName();
        }
    }

    /**
     * Returns an InputOption by name.
     *
     * @return InputOption
     *
     * @throws InvalidArgumentException When option given doesn't exist
     */
    public function getOption(string $name)
    {
        if (!$this->hasOption($name)) {
            throw new InvalidArgumentException(sprintf('The "--%s" option does not exist.', $name));
        }

        return $this->options[$name];
    }

    /**
     * Returns true if an InputOption object exists by name.
     *
     * This method can't be used to check if the user included the option when
     * executing the command (use getOption() instead).
     *
     * @return bool
     */
    public function hasOption(string $name)
    {
        return isset($this->options[$name]);
    }

    /**
     * Gets the array of InputOption objects.
     *
     * @return InputOption[]
     */
    public function getOptions()
    {
        return $this->options;
    }

    /**
     * Returns true if an InputOption object exists by shortcut.
     *
     * @return bool
     */
    public function hasShortcut(string $name)
    {
        return isset($this->shortcuts[$name]);
    }

    /**
     * Returns true if an InputOption object exists by negated name.
     */
    public function hasNegation(string $name): bool
    {
        return isset($this->negations[$name]);
    }

    /**
     * Gets an InputOption by shortcut.
     *
     * @return InputOption
     */
    public function getOptionForShortcut(string $shortcut)
    {
        return $this->getOption($this->shortcutToName($shortcut));
    }

    /**
     * @return array<string|bool|int|float|array|null>
     */
    public function getOptionDefaults()
    {
        $values = [];
        foreach ($this->options as $option) {
            $values[$option->getName()] = $option->getDefault();
        }

        return $values;
    }

    /**
     * Returns the InputOption name given a shortcut.
     *
     * @throws InvalidArgumentException When option given does not exist
     *
     * @internal
     */
    public function shortcutToName(string $shortcut): string
    {
        if (!isset($this->shortcuts[$shortcut])) {
            throw new InvalidArgumentException(sprintf('The "-%s" option does not exist.', $shortcut));
        }

        return $this->shortcuts[$shortcut];
    }

    /**
     * Returns the InputOption name given a negation.
     *
     * @throws InvalidArgumentException When option given does not exist
     *
     * @internal
     */
    public function negationToName(string $negation): string
    {
        if (!isset($this->negations[$negation])) {
            throw new InvalidArgumentException(sprintf('The "--%s" option does not exist.', $negation));
        }

        return $this->negations[$negation];
    }

    /**
     * Gets the synopsis.
     *
     * @return string
     */
    public function getSynopsis(bool $short = false)
    {
        $elements = [];

        if ($short && $this->getOptions()) {
            $elements[] = '[options]';
        } elseif (!$short) {
            foreach ($this->getOptions() as $option) {
                $value = '';
                if ($option->acceptValue()) {
                    $value = sprintf(
                        ' %s%s%s',
                        $option->isValueOptional() ? '[' : '',
                        strtoupper($option->getName()),
                        $option->isValueOptional() ? ']' : ''
                    );
                }

                $shortcut = $option->getShortcut() ? sprintf('-%s|', $option->getShortcut()) : '';
                $negation = $option->isNegatable() ? sprintf('|--no-%s', $option->getName()) : '';
                $elements[] = sprintf('[%s--%s%s%s]', $shortcut, $option->getName(), $value, $negation);
            }
        }

        if (\count($elements) && $this->getArguments()) {
            $elements[] = '[--]';
        }

        $tail = '';
        foreach ($this->getArguments() as $argument) {
            $element = '<'.$argument->getName().'>';
            if ($argument->isArray()) {
                $element .= '...';
            }

            if (!$argument->isRequired()) {
                $element = '['.$element;
                $tail .= ']';
            }

            $elements[] = $element;
        }

        return implode(' ', $elements).$tail;
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Input;

use Symfony\Component\Console\Exception\InvalidArgumentException;
use Symfony\Component\Console\Exception\RuntimeException;

/**
 * InputInterface is the interface implemented by all input classes.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
interface InputInterface
{
    /**
     * Returns the first argument from the raw parameters (not parsed).
     *
     * @return string|null
     */
    public function getFirstArgument();

    /**
     * Returns true if the raw parameters (not parsed) contain a value.
     *
     * This method is to be used to introspect the input parameters
     * before they have been validated. It must be used carefully.
     * Does not necessarily return the correct result for short options
     * when multiple flags are combined in the same option.
     *
     * @param string|array $values     The values to look for in the raw parameters (can be an array)
     * @param bool         $onlyParams Only check real parameters, skip those following an end of options (--) signal
     *
     * @return bool
     */
    public function hasParameterOption($values, bool $onlyParams = false);

    /**
     * Returns the value of a raw option (not parsed).
     *
     * This method is to be used to introspect the input parameters
     * before they have been validated. It must be used carefully.
     * Does not necessarily return the correct result for short options
     * when multiple flags are combined in the same option.
     *
     * @param string|array                     $values     The value(s) to look for in the raw parameters (can be an array)
     * @param string|bool|int|float|array|null $default    The default value to return if no result is found
     * @param bool                             $onlyParams Only check real parameters, skip those following an end of options (--) signal
     *
     * @return mixed
     */
    public function getParameterOption($values, $default = false, bool $onlyParams = false);

    /**
     * Binds the current Input instance with the given arguments and options.
     *
     * @throws RuntimeException
     */
    public function bind(InputDefinition $definition);

    /**
     * Validates the input.
     *
     * @throws RuntimeException When not enough arguments are given
     */
    public function validate();

    /**
     * Returns all the given arguments merged with the default values.
     *
     * @return array<string|bool|int|float|array|null>
     */
    public function getArguments();

    /**
     * Returns the argument value for a given argument name.
     *
     * @return mixed
     *
     * @throws InvalidArgumentException When argument given doesn't exist
     */
    public function getArgument(string $name);

    /**
     * Sets an argument value by name.
     *
     * @param mixed $value The argument value
     *
     * @throws InvalidArgumentException When argument given doesn't exist
     */
    public function setArgument(string $name, $value);

    /**
     * Returns true if an InputArgument object exists by name or position.
     *
     * @return bool
     */
    public function hasArgument(string $name);

    /**
     * Returns all the given options merged with the default values.
     *
     * @return array<string|bool|int|float|array|null>
     */
    public function getOptions();

    /**
     * Returns the option value for a given option name.
     *
     * @return mixed
     *
     * @throws InvalidArgumentException When option given doesn't exist
     */
    public function getOption(string $name);

    /**
     * Sets an option value by name.
     *
     * @param mixed $value The option value
     *
     * @throws InvalidArgumentException When option given doesn't exist
     */
    public function setOption(string $name, $value);

    /**
     * Returns true if an InputOption object exists by name.
     *
     * @return bool
     */
    public function hasOption(string $name);

    /**
     * Is this input means interactive?
     *
     * @return bool
     */
    public function isInteractive();

    /**
     * Sets the input interactivity.
     */
    public function setInteractive(bool $interactive);
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Input;

use Symfony\Component\Console\Exception\InvalidArgumentException;
use Symfony\Component\Console\Exception\LogicException;

/**
 * Represents a command line option.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class InputOption
{
    /**
     * Do not accept input for the option (e.g. --yell). This is the default behavior of options.
     */
    public const VALUE_NONE = 1;

    /**
     * A value must be passed when the option is used (e.g. --iterations=5 or -i5).
     */
    public const VALUE_REQUIRED = 2;

    /**
     * The option may or may not have a value (e.g. --yell or --yell=loud).
     */
    public const VALUE_OPTIONAL = 4;

    /**
     * The option accepts multiple values (e.g. --dir=/foo --dir=/bar).
     */
    public const VALUE_IS_ARRAY = 8;

    /**
     * The option may have either positive or negative value (e.g. --ansi or --no-ansi).
     */
    public const VALUE_NEGATABLE = 16;

    private $name;
    private $shortcut;
    private $mode;
    private $default;
    private $description;

    /**
     * @param string|array|null                $shortcut The shortcuts, can be null, a string of shortcuts delimited by | or an array of shortcuts
     * @param int|null                         $mode     The option mode: One of the VALUE_* constants
     * @param string|bool|int|float|array|null $default  The default value (must be null for self::VALUE_NONE)
     *
     * @throws InvalidArgumentException If option mode is invalid or incompatible
     */
    public function __construct(string $name, $shortcut = null, int $mode = null, string $description = '', $default = null)
    {
        if (str_starts_with($name, '--')) {
            $name = substr($name, 2);
        }

        if (empty($name)) {
            throw new InvalidArgumentException('An option name cannot be empty.');
        }

        if (empty($shortcut)) {
            $shortcut = null;
        }

        if (null !== $shortcut) {
            if (\is_array($shortcut)) {
                $shortcut = implode('|', $shortcut);
            }
            $shortcuts = preg_split('{(\|)-?}', ltrim($shortcut, '-'));
            $shortcuts = array_filter($shortcuts);
            $shortcut = implode('|', $shortcuts);

            if (empty($shortcut)) {
                throw new InvalidArgumentException('An option shortcut cannot be empty.');
            }
        }

        if (null === $mode) {
            $mode = self::VALUE_NONE;
        } elseif ($mode >= (self::VALUE_NEGATABLE << 1) || $mode < 1) {
            throw new InvalidArgumentException(sprintf('Option mode "%s" is not valid.', $mode));
        }

        $this->name = $name;
        $this->shortcut = $shortcut;
        $this->mode = $mode;
        $this->description = $description;

        if ($this->isArray() && !$this->acceptValue()) {
            throw new InvalidArgumentException('Impossible to have an option mode VALUE_IS_ARRAY if the option does not accept a value.');
        }
        if ($this->isNegatable() && $this->acceptValue()) {
            throw new InvalidArgumentException('Impossible to have an option mode VALUE_NEGATABLE if the option also accepts a value.');
        }

        $this->setDefault($default);
    }

    /**
     * Returns the option shortcut.
     *
     * @return string|null
     */
    public function getShortcut()
    {
        return $this->shortcut;
    }

    /**
     * Returns the option name.
     *
     * @return string
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * Returns true if the option accepts a value.
     *
     * @return bool true if value mode is not self::VALUE_NONE, false otherwise
     */
    public function acceptValue()
    {
        return $this->isValueRequired() || $this->isValueOptional();
    }

    /**
     * Returns true if the option requires a value.
     *
     * @return bool true if value mode is self::VALUE_REQUIRED, false otherwise
     */
    public function isValueRequired()
    {
        return self::VALUE_REQUIRED === (self::VALUE_REQUIRED & $this->mode);
    }

    /**
     * Returns true if the option takes an optional value.
     *
     * @return bool true if value mode is self::VALUE_OPTIONAL, false otherwise
     */
    public function isValueOptional()
    {
        return self::VALUE_OPTIONAL === (self::VALUE_OPTIONAL & $this->mode);
    }

    /**
     * Returns true if the option can take multiple values.
     *
     * @return bool true if mode is self::VALUE_IS_ARRAY, false otherwise
     */
    public function isArray()
    {
        return self::VALUE_IS_ARRAY === (self::VALUE_IS_ARRAY & $this->mode);
    }

    public function isNegatable(): bool
    {
        return self::VALUE_NEGATABLE === (self::VALUE_NEGATABLE & $this->mode);
    }

    /**
     * @param string|bool|int|float|array|null $default
     */
    public function setDefault($default = null)
    {
        if (self::VALUE_NONE === (self::VALUE_NONE & $this->mode) && null !== $default) {
            throw new LogicException('Cannot set a default value when using InputOption::VALUE_NONE mode.');
        }

        if ($this->isArray()) {
            if (null === $default) {
                $default = [];
            } elseif (!\is_array($default)) {
                throw new LogicException('A default value for an array option must be an array.');
            }
        }

        $this->default = $this->acceptValue() || $this->isNegatable() ? $default : false;
    }

    /**
     * Returns the default value.
     *
     * @return string|bool|int|float|array|null
     */
    public function getDefault()
    {
        return $this->default;
    }

    /**
     * Returns the description text.
     *
     * @return string
     */
    public function getDescription()
    {
        return $this->description;
    }

    /**
     * Checks whether the given option equals this one.
     *
     * @return bool
     */
    public function equals(self $option)
    {
        return $option->getName() === $this->getName()
            && $option->getShortcut() === $this->getShortcut()
            && $option->getDefault() === $this->getDefault()
            && $option->isNegatable() === $this->isNegatable()
            && $option->isArray() === $this->isArray()
            && $option->isValueRequired() === $this->isValueRequired()
            && $option->isValueOptional() === $this->isValueOptional()
        ;
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Input;

/**
 * StreamableInputInterface is the interface implemented by all input classes
 * that have an input stream.
 *
 * @author Robin Chalas <robin.chalas@gmail.com>
 */
interface StreamableInputInterface extends InputInterface
{
    /**
     * Sets the input stream to read from when interacting with the user.
     *
     * This is mainly useful for testing purpose.
     *
     * @param resource $stream The input stream
     */
    public function setStream($stream);

    /**
     * Returns the input stream.
     *
     * @return resource|null
     */
    public function getStream();
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Input;

use Symfony\Component\Console\Exception\InvalidArgumentException;

/**
 * StringInput represents an input provided as a string.
 *
 * Usage:
 *
 *     $input = new StringInput('foo --bar="foobar"');
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class StringInput extends ArgvInput
{
    public const REGEX_STRING = '([^\s]+?)(?:\s|(?<!\\\\)"|(?<!\\\\)\'|$)';
    public const REGEX_UNQUOTED_STRING = '([^\s\\\\]+?)';
    public const REGEX_QUOTED_STRING = '(?:"([^"\\\\]*(?:\\\\.[^"\\\\]*)*)"|\'([^\'\\\\]*(?:\\\\.[^\'\\\\]*)*)\')';

    /**
     * @param string $input A string representing the parameters from the CLI
     */
    public function __construct(string $input)
    {
        parent::__construct([]);

        $this->setTokens($this->tokenize($input));
    }

    /**
     * Tokenizes a string.
     *
     * @throws InvalidArgumentException When unable to parse input (should never happen)
     */
    private function tokenize(string $input): array
    {
        $tokens = [];
        $length = \strlen($input);
        $cursor = 0;
        $token = null;
        while ($cursor < $length) {
            if ('\\' === $input[$cursor]) {
                $token .= $input[++$cursor] ?? '';
                ++$cursor;
                continue;
            }

            if (preg_match('/\s+/A', $input, $match, 0, $cursor)) {
                if (null !== $token) {
                    $tokens[] = $token;
                    $token = null;
                }
            } elseif (preg_match('/([^="\'\s]+?)(=?)('.self::REGEX_QUOTED_STRING.'+)/A', $input, $match, 0, $cursor)) {
                $token .= $match[1].$match[2].stripcslashes(str_replace(['"\'', '\'"', '\'\'', '""'], '', substr($match[3], 1, -1)));
            } elseif (preg_match('/'.self::REGEX_QUOTED_STRING.'/A', $input, $match, 0, $cursor)) {
                $token .= stripcslashes(substr($match[0], 1, -1));
            } elseif (preg_match('/'.self::REGEX_UNQUOTED_STRING.'/A', $input, $match, 0, $cursor)) {
                $token .= $match[1];
            } else {
                // should never happen
                throw new InvalidArgumentException(sprintf('Unable to parse input near "... %s ...".', substr($input, $cursor, 10)));
            }

            $cursor += \strlen($match[0]);
        }

        if (null !== $token) {
            $tokens[] = $token;
        }

        return $tokens;
    }
}
Copyright (c) 2004-present Fabien Potencier

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

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Logger;

use Psr\Log\AbstractLogger;
use Psr\Log\InvalidArgumentException;
use Psr\Log\LogLevel;
use Symfony\Component\Console\Output\ConsoleOutputInterface;
use Symfony\Component\Console\Output\OutputInterface;

/**
 * PSR-3 compliant console logger.
 *
 * @author Kévin Dunglas <dunglas@gmail.com>
 *
 * @see https://www.php-fig.org/psr/psr-3/
 */
class ConsoleLogger extends AbstractLogger
{
    public const INFO = 'info';
    public const ERROR = 'error';

    private $output;
    private $verbosityLevelMap = [
        LogLevel::EMERGENCY => OutputInterface::VERBOSITY_NORMAL,
        LogLevel::ALERT => OutputInterface::VERBOSITY_NORMAL,
        LogLevel::CRITICAL => OutputInterface::VERBOSITY_NORMAL,
        LogLevel::ERROR => OutputInterface::VERBOSITY_NORMAL,
        LogLevel::WARNING => OutputInterface::VERBOSITY_NORMAL,
        LogLevel::NOTICE => OutputInterface::VERBOSITY_VERBOSE,
        LogLevel::INFO => OutputInterface::VERBOSITY_VERY_VERBOSE,
        LogLevel::DEBUG => OutputInterface::VERBOSITY_DEBUG,
    ];
    private $formatLevelMap = [
        LogLevel::EMERGENCY => self::ERROR,
        LogLevel::ALERT => self::ERROR,
        LogLevel::CRITICAL => self::ERROR,
        LogLevel::ERROR => self::ERROR,
        LogLevel::WARNING => self::INFO,
        LogLevel::NOTICE => self::INFO,
        LogLevel::INFO => self::INFO,
        LogLevel::DEBUG => self::INFO,
    ];
    private $errored = false;

    public function __construct(OutputInterface $output, array $verbosityLevelMap = [], array $formatLevelMap = [])
    {
        $this->output = $output;
        $this->verbosityLevelMap = $verbosityLevelMap + $this->verbosityLevelMap;
        $this->formatLevelMap = $formatLevelMap + $this->formatLevelMap;
    }

    /**
     * {@inheritdoc}
     *
     * @return void
     */
    public function log($level, $message, array $context = [])
    {
        if (!isset($this->verbosityLevelMap[$level])) {
            throw new InvalidArgumentException(sprintf('The log level "%s" does not exist.', $level));
        }

        $output = $this->output;

        // Write to the error output if necessary and available
        if (self::ERROR === $this->formatLevelMap[$level]) {
            if ($this->output instanceof ConsoleOutputInterface) {
                $output = $output->getErrorOutput();
            }
            $this->errored = true;
        }

        // the if condition check isn't necessary -- it's the same one that $output will do internally anyway.
        // We only do it for efficiency here as the message formatting is relatively expensive.
        if ($output->getVerbosity() >= $this->verbosityLevelMap[$level]) {
            $output->writeln(sprintf('<%1$s>[%2$s] %3$s</%1$s>', $this->formatLevelMap[$level], $level, $this->interpolate($message, $context)), $this->verbosityLevelMap[$level]);
        }
    }

    /**
     * Returns true when any messages have been logged at error levels.
     *
     * @return bool
     */
    public function hasErrored()
    {
        return $this->errored;
    }

    /**
     * Interpolates context values into the message placeholders.
     *
     * @author PHP Framework Interoperability Group
     */
    private function interpolate(string $message, array $context): string
    {
        if (!str_contains($message, '{')) {
            return $message;
        }

        $replacements = [];
        foreach ($context as $key => $val) {
            if (null === $val || \is_scalar($val) || (\is_object($val) && method_exists($val, '__toString'))) {
                $replacements["{{$key}}"] = $val;
            } elseif ($val instanceof \DateTimeInterface) {
                $replacements["{{$key}}"] = $val->format(\DateTime::RFC3339);
            } elseif (\is_object($val)) {
                $replacements["{{$key}}"] = '[object '.\get_class($val).']';
            } else {
                $replacements["{{$key}}"] = '['.\gettype($val).']';
            }
        }

        return strtr($message, $replacements);
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Output;

/**
 * @author Jean-François Simon <contact@jfsimon.fr>
 */
class BufferedOutput extends Output
{
    private $buffer = '';

    /**
     * Empties buffer and returns its content.
     *
     * @return string
     */
    public function fetch()
    {
        $content = $this->buffer;
        $this->buffer = '';

        return $content;
    }

    /**
     * {@inheritdoc}
     */
    protected function doWrite(string $message, bool $newline)
    {
        $this->buffer .= $message;

        if ($newline) {
            $this->buffer .= \PHP_EOL;
        }
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Output;

use Symfony\Component\Console\Formatter\OutputFormatterInterface;

/**
 * ConsoleOutput is the default class for all CLI output. It uses STDOUT and STDERR.
 *
 * This class is a convenient wrapper around `StreamOutput` for both STDOUT and STDERR.
 *
 *     $output = new ConsoleOutput();
 *
 * This is equivalent to:
 *
 *     $output = new StreamOutput(fopen('php://stdout', 'w'));
 *     $stdErr = new StreamOutput(fopen('php://stderr', 'w'));
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class ConsoleOutput extends StreamOutput implements ConsoleOutputInterface
{
    private $stderr;
    private $consoleSectionOutputs = [];

    /**
     * @param int                           $verbosity The verbosity level (one of the VERBOSITY constants in OutputInterface)
     * @param bool|null                     $decorated Whether to decorate messages (null for auto-guessing)
     * @param OutputFormatterInterface|null $formatter Output formatter instance (null to use default OutputFormatter)
     */
    public function __construct(int $verbosity = self::VERBOSITY_NORMAL, bool $decorated = null, OutputFormatterInterface $formatter = null)
    {
        parent::__construct($this->openOutputStream(), $verbosity, $decorated, $formatter);

        if (null === $formatter) {
            // for BC reasons, stdErr has it own Formatter only when user don't inject a specific formatter.
            $this->stderr = new StreamOutput($this->openErrorStream(), $verbosity, $decorated);

            return;
        }

        $actualDecorated = $this->isDecorated();
        $this->stderr = new StreamOutput($this->openErrorStream(), $verbosity, $decorated, $this->getFormatter());

        if (null === $decorated) {
            $this->setDecorated($actualDecorated && $this->stderr->isDecorated());
        }
    }

    /**
     * Creates a new output section.
     */
    public function section(): ConsoleSectionOutput
    {
        return new ConsoleSectionOutput($this->getStream(), $this->consoleSectionOutputs, $this->getVerbosity(), $this->isDecorated(), $this->getFormatter());
    }

    /**
     * {@inheritdoc}
     */
    public function setDecorated(bool $decorated)
    {
        parent::setDecorated($decorated);
        $this->stderr->setDecorated($decorated);
    }

    /**
     * {@inheritdoc}
     */
    public function setFormatter(OutputFormatterInterface $formatter)
    {
        parent::setFormatter($formatter);
        $this->stderr->setFormatter($formatter);
    }

    /**
     * {@inheritdoc}
     */
    public function setVerbosity(int $level)
    {
        parent::setVerbosity($level);
        $this->stderr->setVerbosity($level);
    }

    /**
     * {@inheritdoc}
     */
    public function getErrorOutput()
    {
        return $this->stderr;
    }

    /**
     * {@inheritdoc}
     */
    public function setErrorOutput(OutputInterface $error)
    {
        $this->stderr = $error;
    }

    /**
     * Returns true if current environment supports writing console output to
     * STDOUT.
     *
     * @return bool
     */
    protected function hasStdoutSupport()
    {
        return false === $this->isRunningOS400();
    }

    /**
     * Returns true if current environment supports writing console output to
     * STDERR.
     *
     * @return bool
     */
    protected function hasStderrSupport()
    {
        return false === $this->isRunningOS400();
    }

    /**
     * Checks if current executing environment is IBM iSeries (OS400), which
     * doesn't properly convert character-encodings between ASCII to EBCDIC.
     */
    private function isRunningOS400(): bool
    {
        $checks = [
            \function_exists('php_uname') ? php_uname('s') : '',
            getenv('OSTYPE'),
            \PHP_OS,
        ];

        return false !== stripos(implode(';', $checks), 'OS400');
    }

    /**
     * @return resource
     */
    private function openOutputStream()
    {
        if (!$this->hasStdoutSupport()) {
            return fopen('php://output', 'w');
        }

        // Use STDOUT when possible to prevent from opening too many file descriptors
        return \defined('STDOUT') ? \STDOUT : (@fopen('php://stdout', 'w') ?: fopen('php://output', 'w'));
    }

    /**
     * @return resource
     */
    private function openErrorStream()
    {
        if (!$this->hasStderrSupport()) {
            return fopen('php://output', 'w');
        }

        // Use STDERR when possible to prevent from opening too many file descriptors
        return \defined('STDERR') ? \STDERR : (@fopen('php://stderr', 'w') ?: fopen('php://output', 'w'));
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Output;

/**
 * ConsoleOutputInterface is the interface implemented by ConsoleOutput class.
 * This adds information about stderr and section output stream.
 *
 * @author Dariusz Górecki <darek.krk@gmail.com>
 */
interface ConsoleOutputInterface extends OutputInterface
{
    /**
     * Gets the OutputInterface for errors.
     *
     * @return OutputInterface
     */
    public function getErrorOutput();

    public function setErrorOutput(OutputInterface $error);

    public function section(): ConsoleSectionOutput;
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Output;

use Symfony\Component\Console\Formatter\OutputFormatterInterface;
use Symfony\Component\Console\Helper\Helper;
use Symfony\Component\Console\Terminal;

/**
 * @author Pierre du Plessis <pdples@gmail.com>
 * @author Gabriel Ostrolucký <gabriel.ostrolucky@gmail.com>
 */
class ConsoleSectionOutput extends StreamOutput
{
    private $content = [];
    private $lines = 0;
    private $sections;
    private $terminal;

    /**
     * @param resource               $stream
     * @param ConsoleSectionOutput[] $sections
     */
    public function __construct($stream, array &$sections, int $verbosity, bool $decorated, OutputFormatterInterface $formatter)
    {
        parent::__construct($stream, $verbosity, $decorated, $formatter);
        array_unshift($sections, $this);
        $this->sections = &$sections;
        $this->terminal = new Terminal();
    }

    /**
     * Clears previous output for this section.
     *
     * @param int $lines Number of lines to clear. If null, then the entire output of this section is cleared
     */
    public function clear(int $lines = null)
    {
        if (empty($this->content) || !$this->isDecorated()) {
            return;
        }

        if ($lines) {
            array_splice($this->content, -($lines * 2)); // Multiply lines by 2 to cater for each new line added between content
        } else {
            $lines = $this->lines;
            $this->content = [];
        }

        $this->lines -= $lines;

        parent::doWrite($this->popStreamContentUntilCurrentSection($lines), false);
    }

    /**
     * Overwrites the previous output with a new message.
     *
     * @param array|string $message
     */
    public function overwrite($message)
    {
        $this->clear();
        $this->writeln($message);
    }

    public function getContent(): string
    {
        return implode('', $this->content);
    }

    /**
     * @internal
     */
    public function addContent(string $input)
    {
        foreach (explode(\PHP_EOL, $input) as $lineContent) {
            $this->lines += ceil($this->getDisplayLength($lineContent) / $this->terminal->getWidth()) ?: 1;
            $this->content[] = $lineContent;
            $this->content[] = \PHP_EOL;
        }
    }

    /**
     * {@inheritdoc}
     */
    protected function doWrite(string $message, bool $newline)
    {
        if (!$this->isDecorated()) {
            parent::doWrite($message, $newline);

            return;
        }

        $erasedContent = $this->popStreamContentUntilCurrentSection();

        $this->addContent($message);

        parent::doWrite($message, true);
        parent::doWrite($erasedContent, false);
    }

    /**
     * At initial stage, cursor is at the end of stream output. This method makes cursor crawl upwards until it hits
     * current section. Then it erases content it crawled through. Optionally, it erases part of current section too.
     */
    private function popStreamContentUntilCurrentSection(int $numberOfLinesToClearFromCurrentSection = 0): string
    {
        $numberOfLinesToClear = $numberOfLinesToClearFromCurrentSection;
        $erasedContent = [];

        foreach ($this->sections as $section) {
            if ($section === $this) {
                break;
            }

            $numberOfLinesToClear += $section->lines;
            $erasedContent[] = $section->getContent();
        }

        if ($numberOfLinesToClear > 0) {
            // move cursor up n lines
            parent::doWrite(sprintf("\x1b[%dA", $numberOfLinesToClear), false);
            // erase to end of screen
            parent::doWrite("\x1b[0J", false);
        }

        return implode('', array_reverse($erasedContent));
    }

    private function getDisplayLength(string $text): int
    {
        return Helper::width(Helper::removeDecoration($this->getFormatter(), str_replace("\t", '        ', $text)));
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Output;

use Symfony\Component\Console\Formatter\NullOutputFormatter;
use Symfony\Component\Console\Formatter\OutputFormatterInterface;

/**
 * NullOutput suppresses all output.
 *
 *     $output = new NullOutput();
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Tobias Schultze <http://tobion.de>
 */
class NullOutput implements OutputInterface
{
    private $formatter;

    /**
     * {@inheritdoc}
     */
    public function setFormatter(OutputFormatterInterface $formatter)
    {
        // do nothing
    }

    /**
     * {@inheritdoc}
     */
    public function getFormatter()
    {
        if ($this->formatter) {
            return $this->formatter;
        }
        // to comply with the interface we must return a OutputFormatterInterface
        return $this->formatter = new NullOutputFormatter();
    }

    /**
     * {@inheritdoc}
     */
    public function setDecorated(bool $decorated)
    {
        // do nothing
    }

    /**
     * {@inheritdoc}
     */
    public function isDecorated()
    {
        return false;
    }

    /**
     * {@inheritdoc}
     */
    public function setVerbosity(int $level)
    {
        // do nothing
    }

    /**
     * {@inheritdoc}
     */
    public function getVerbosity()
    {
        return self::VERBOSITY_QUIET;
    }

    /**
     * {@inheritdoc}
     */
    public function isQuiet()
    {
        return true;
    }

    /**
     * {@inheritdoc}
     */
    public function isVerbose()
    {
        return false;
    }

    /**
     * {@inheritdoc}
     */
    public function isVeryVerbose()
    {
        return false;
    }

    /**
     * {@inheritdoc}
     */
    public function isDebug()
    {
        return false;
    }

    /**
     * {@inheritdoc}
     */
    public function writeln($messages, int $options = self::OUTPUT_NORMAL)
    {
        // do nothing
    }

    /**
     * {@inheritdoc}
     */
    public function write($messages, bool $newline = false, int $options = self::OUTPUT_NORMAL)
    {
        // do nothing
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Output;

use Symfony\Component\Console\Formatter\OutputFormatter;
use Symfony\Component\Console\Formatter\OutputFormatterInterface;

/**
 * Base class for output classes.
 *
 * There are five levels of verbosity:
 *
 *  * normal: no option passed (normal output)
 *  * verbose: -v (more output)
 *  * very verbose: -vv (highly extended output)
 *  * debug: -vvv (all debug output)
 *  * quiet: -q (no output)
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
abstract class Output implements OutputInterface
{
    private $verbosity;
    private $formatter;

    /**
     * @param int|null                      $verbosity The verbosity level (one of the VERBOSITY constants in OutputInterface)
     * @param bool                          $decorated Whether to decorate messages
     * @param OutputFormatterInterface|null $formatter Output formatter instance (null to use default OutputFormatter)
     */
    public function __construct(?int $verbosity = self::VERBOSITY_NORMAL, bool $decorated = false, OutputFormatterInterface $formatter = null)
    {
        $this->verbosity = $verbosity ?? self::VERBOSITY_NORMAL;
        $this->formatter = $formatter ?? new OutputFormatter();
        $this->formatter->setDecorated($decorated);
    }

    /**
     * {@inheritdoc}
     */
    public function setFormatter(OutputFormatterInterface $formatter)
    {
        $this->formatter = $formatter;
    }

    /**
     * {@inheritdoc}
     */
    public function getFormatter()
    {
        return $this->formatter;
    }

    /**
     * {@inheritdoc}
     */
    public function setDecorated(bool $decorated)
    {
        $this->formatter->setDecorated($decorated);
    }

    /**
     * {@inheritdoc}
     */
    public function isDecorated()
    {
        return $this->formatter->isDecorated();
    }

    /**
     * {@inheritdoc}
     */
    public function setVerbosity(int $level)
    {
        $this->verbosity = $level;
    }

    /**
     * {@inheritdoc}
     */
    public function getVerbosity()
    {
        return $this->verbosity;
    }

    /**
     * {@inheritdoc}
     */
    public function isQuiet()
    {
        return self::VERBOSITY_QUIET === $this->verbosity;
    }

    /**
     * {@inheritdoc}
     */
    public function isVerbose()
    {
        return self::VERBOSITY_VERBOSE <= $this->verbosity;
    }

    /**
     * {@inheritdoc}
     */
    public function isVeryVerbose()
    {
        return self::VERBOSITY_VERY_VERBOSE <= $this->verbosity;
    }

    /**
     * {@inheritdoc}
     */
    public function isDebug()
    {
        return self::VERBOSITY_DEBUG <= $this->verbosity;
    }

    /**
     * {@inheritdoc}
     */
    public function writeln($messages, int $options = self::OUTPUT_NORMAL)
    {
        $this->write($messages, true, $options);
    }

    /**
     * {@inheritdoc}
     */
    public function write($messages, bool $newline = false, int $options = self::OUTPUT_NORMAL)
    {
        if (!is_iterable($messages)) {
            $messages = [$messages];
        }

        $types = self::OUTPUT_NORMAL | self::OUTPUT_RAW | self::OUTPUT_PLAIN;
        $type = $types & $options ?: self::OUTPUT_NORMAL;

        $verbosities = self::VERBOSITY_QUIET | self::VERBOSITY_NORMAL | self::VERBOSITY_VERBOSE | self::VERBOSITY_VERY_VERBOSE | self::VERBOSITY_DEBUG;
        $verbosity = $verbosities & $options ?: self::VERBOSITY_NORMAL;

        if ($verbosity > $this->getVerbosity()) {
            return;
        }

        foreach ($messages as $message) {
            switch ($type) {
                case OutputInterface::OUTPUT_NORMAL:
                    $message = $this->formatter->format($message);
                    break;
                case OutputInterface::OUTPUT_RAW:
                    break;
                case OutputInterface::OUTPUT_PLAIN:
                    $message = strip_tags($this->formatter->format($message));
                    break;
            }

            $this->doWrite($message ?? '', $newline);
        }
    }

    /**
     * Writes a message to the output.
     */
    abstract protected function doWrite(string $message, bool $newline);
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Output;

use Symfony\Component\Console\Formatter\OutputFormatterInterface;

/**
 * OutputInterface is the interface implemented by all Output classes.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
interface OutputInterface
{
    public const VERBOSITY_QUIET = 16;
    public const VERBOSITY_NORMAL = 32;
    public const VERBOSITY_VERBOSE = 64;
    public const VERBOSITY_VERY_VERBOSE = 128;
    public const VERBOSITY_DEBUG = 256;

    public const OUTPUT_NORMAL = 1;
    public const OUTPUT_RAW = 2;
    public const OUTPUT_PLAIN = 4;

    /**
     * Writes a message to the output.
     *
     * @param string|iterable $messages The message as an iterable of strings or a single string
     * @param bool            $newline  Whether to add a newline
     * @param int             $options  A bitmask of options (one of the OUTPUT or VERBOSITY constants), 0 is considered the same as self::OUTPUT_NORMAL | self::VERBOSITY_NORMAL
     */
    public function write($messages, bool $newline = false, int $options = 0);

    /**
     * Writes a message to the output and adds a newline at the end.
     *
     * @param string|iterable $messages The message as an iterable of strings or a single string
     * @param int             $options  A bitmask of options (one of the OUTPUT or VERBOSITY constants), 0 is considered the same as self::OUTPUT_NORMAL | self::VERBOSITY_NORMAL
     */
    public function writeln($messages, int $options = 0);

    /**
     * Sets the verbosity of the output.
     */
    public function setVerbosity(int $level);

    /**
     * Gets the current verbosity of the output.
     *
     * @return int
     */
    public function getVerbosity();

    /**
     * Returns whether verbosity is quiet (-q).
     *
     * @return bool
     */
    public function isQuiet();

    /**
     * Returns whether verbosity is verbose (-v).
     *
     * @return bool
     */
    public function isVerbose();

    /**
     * Returns whether verbosity is very verbose (-vv).
     *
     * @return bool
     */
    public function isVeryVerbose();

    /**
     * Returns whether verbosity is debug (-vvv).
     *
     * @return bool
     */
    public function isDebug();

    /**
     * Sets the decorated flag.
     */
    public function setDecorated(bool $decorated);

    /**
     * Gets the decorated flag.
     *
     * @return bool
     */
    public function isDecorated();

    public function setFormatter(OutputFormatterInterface $formatter);

    /**
     * Returns current output formatter instance.
     *
     * @return OutputFormatterInterface
     */
    public function getFormatter();
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Output;

use Symfony\Component\Console\Exception\InvalidArgumentException;
use Symfony\Component\Console\Formatter\OutputFormatterInterface;

/**
 * StreamOutput writes the output to a given stream.
 *
 * Usage:
 *
 *     $output = new StreamOutput(fopen('php://stdout', 'w'));
 *
 * As `StreamOutput` can use any stream, you can also use a file:
 *
 *     $output = new StreamOutput(fopen('/path/to/output.log', 'a', false));
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class StreamOutput extends Output
{
    private $stream;

    /**
     * @param resource                      $stream    A stream resource
     * @param int                           $verbosity The verbosity level (one of the VERBOSITY constants in OutputInterface)
     * @param bool|null                     $decorated Whether to decorate messages (null for auto-guessing)
     * @param OutputFormatterInterface|null $formatter Output formatter instance (null to use default OutputFormatter)
     *
     * @throws InvalidArgumentException When first argument is not a real stream
     */
    public function __construct($stream, int $verbosity = self::VERBOSITY_NORMAL, bool $decorated = null, OutputFormatterInterface $formatter = null)
    {
        if (!\is_resource($stream) || 'stream' !== get_resource_type($stream)) {
            throw new InvalidArgumentException('The StreamOutput class needs a stream as its first argument.');
        }

        $this->stream = $stream;

        if (null === $decorated) {
            $decorated = $this->hasColorSupport();
        }

        parent::__construct($verbosity, $decorated, $formatter);
    }

    /**
     * Gets the stream attached to this StreamOutput instance.
     *
     * @return resource
     */
    public function getStream()
    {
        return $this->stream;
    }

    /**
     * {@inheritdoc}
     */
    protected function doWrite(string $message, bool $newline)
    {
        if ($newline) {
            $message .= \PHP_EOL;
        }

        @fwrite($this->stream, $message);

        fflush($this->stream);
    }

    /**
     * Returns true if the stream supports colorization.
     *
     * Colorization is disabled if not supported by the stream:
     *
     * This is tricky on Windows, because Cygwin, Msys2 etc emulate pseudo
     * terminals via named pipes, so we can only check the environment.
     *
     * Reference: Composer\XdebugHandler\Process::supportsColor
     * https://github.com/composer/xdebug-handler
     *
     * @return bool true if the stream supports colorization, false otherwise
     */
    protected function hasColorSupport()
    {
        // Follow https://no-color.org/
        if (isset($_SERVER['NO_COLOR']) || false !== getenv('NO_COLOR')) {
            return false;
        }

        if ('Hyper' === getenv('TERM_PROGRAM')) {
            return true;
        }

        if (\DIRECTORY_SEPARATOR === '\\') {
            return (\function_exists('sapi_windows_vt100_support')
                && @sapi_windows_vt100_support($this->stream))
                || false !== getenv('ANSICON')
                || 'ON' === getenv('ConEmuANSI')
                || 'xterm' === getenv('TERM');
        }

        return stream_isatty($this->stream);
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Output;

use Symfony\Component\Console\Exception\InvalidArgumentException;
use Symfony\Component\Console\Formatter\OutputFormatterInterface;

/**
 * A BufferedOutput that keeps only the last N chars.
 *
 * @author Jérémy Derussé <jeremy@derusse.com>
 */
class TrimmedBufferOutput extends Output
{
    private $maxLength;
    private $buffer = '';

    public function __construct(int $maxLength, ?int $verbosity = self::VERBOSITY_NORMAL, bool $decorated = false, OutputFormatterInterface $formatter = null)
    {
        if ($maxLength <= 0) {
            throw new InvalidArgumentException(sprintf('"%s()" expects a strictly positive maxLength. Got %d.', __METHOD__, $maxLength));
        }

        parent::__construct($verbosity, $decorated, $formatter);
        $this->maxLength = $maxLength;
    }

    /**
     * Empties buffer and returns its content.
     *
     * @return string
     */
    public function fetch()
    {
        $content = $this->buffer;
        $this->buffer = '';

        return $content;
    }

    /**
     * {@inheritdoc}
     */
    protected function doWrite(string $message, bool $newline)
    {
        $this->buffer .= $message;

        if ($newline) {
            $this->buffer .= \PHP_EOL;
        }

        $this->buffer = substr($this->buffer, 0 - $this->maxLength);
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Question;

use Symfony\Component\Console\Exception\InvalidArgumentException;

/**
 * Represents a choice question.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class ChoiceQuestion extends Question
{
    private $choices;
    private $multiselect = false;
    private $prompt = ' > ';
    private $errorMessage = 'Value "%s" is invalid';

    /**
     * @param string $question The question to ask to the user
     * @param array  $choices  The list of available choices
     * @param mixed  $default  The default answer to return
     */
    public function __construct(string $question, array $choices, $default = null)
    {
        if (!$choices) {
            throw new \LogicException('Choice question must have at least 1 choice available.');
        }

        parent::__construct($question, $default);

        $this->choices = $choices;
        $this->setValidator($this->getDefaultValidator());
        $this->setAutocompleterValues($choices);
    }

    /**
     * Returns available choices.
     *
     * @return array
     */
    public function getChoices()
    {
        return $this->choices;
    }

    /**
     * Sets multiselect option.
     *
     * When multiselect is set to true, multiple choices can be answered.
     *
     * @return $this
     */
    public function setMultiselect(bool $multiselect)
    {
        $this->multiselect = $multiselect;
        $this->setValidator($this->getDefaultValidator());

        return $this;
    }

    /**
     * Returns whether the choices are multiselect.
     *
     * @return bool
     */
    public function isMultiselect()
    {
        return $this->multiselect;
    }

    /**
     * Gets the prompt for choices.
     *
     * @return string
     */
    public function getPrompt()
    {
        return $this->prompt;
    }

    /**
     * Sets the prompt for choices.
     *
     * @return $this
     */
    public function setPrompt(string $prompt)
    {
        $this->prompt = $prompt;

        return $this;
    }

    /**
     * Sets the error message for invalid values.
     *
     * The error message has a string placeholder (%s) for the invalid value.
     *
     * @return $this
     */
    public function setErrorMessage(string $errorMessage)
    {
        $this->errorMessage = $errorMessage;
        $this->setValidator($this->getDefaultValidator());

        return $this;
    }

    private function getDefaultValidator(): callable
    {
        $choices = $this->choices;
        $errorMessage = $this->errorMessage;
        $multiselect = $this->multiselect;
        $isAssoc = $this->isAssoc($choices);

        return function ($selected) use ($choices, $errorMessage, $multiselect, $isAssoc) {
            if ($multiselect) {
                // Check for a separated comma values
                if (!preg_match('/^[^,]+(?:,[^,]+)*$/', (string) $selected, $matches)) {
                    throw new InvalidArgumentException(sprintf($errorMessage, $selected));
                }

                $selectedChoices = explode(',', (string) $selected);
            } else {
                $selectedChoices = [$selected];
            }

            if ($this->isTrimmable()) {
                foreach ($selectedChoices as $k => $v) {
                    $selectedChoices[$k] = trim((string) $v);
                }
            }

            $multiselectChoices = [];
            foreach ($selectedChoices as $value) {
                $results = [];
                foreach ($choices as $key => $choice) {
                    if ($choice === $value) {
                        $results[] = $key;
                    }
                }

                if (\count($results) > 1) {
                    throw new InvalidArgumentException(sprintf('The provided answer is ambiguous. Value should be one of "%s".', implode('" or "', $results)));
                }

                $result = array_search($value, $choices);

                if (!$isAssoc) {
                    if (false !== $result) {
                        $result = $choices[$result];
                    } elseif (isset($choices[$value])) {
                        $result = $choices[$value];
                    }
                } elseif (false === $result && isset($choices[$value])) {
                    $result = $value;
                }

                if (false === $result) {
                    throw new InvalidArgumentException(sprintf($errorMessage, $value));
                }

                // For associative choices, consistently return the key as string:
                $multiselectChoices[] = $isAssoc ? (string) $result : $result;
            }

            if ($multiselect) {
                return $multiselectChoices;
            }

            return current($multiselectChoices);
        };
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Question;

/**
 * Represents a yes/no question.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class ConfirmationQuestion extends Question
{
    private $trueAnswerRegex;

    /**
     * @param string $question        The question to ask to the user
     * @param bool   $default         The default answer to return, true or false
     * @param string $trueAnswerRegex A regex to match the "yes" answer
     */
    public function __construct(string $question, bool $default = true, string $trueAnswerRegex = '/^y/i')
    {
        parent::__construct($question, $default);

        $this->trueAnswerRegex = $trueAnswerRegex;
        $this->setNormalizer($this->getDefaultNormalizer());
    }

    /**
     * Returns the default answer normalizer.
     */
    private function getDefaultNormalizer(): callable
    {
        $default = $this->getDefault();
        $regex = $this->trueAnswerRegex;

        return function ($answer) use ($default, $regex) {
            if (\is_bool($answer)) {
                return $answer;
            }

            $answerIsTrue = (bool) preg_match($regex, $answer);
            if (false === $default) {
                return $answer && $answerIsTrue;
            }

            return '' === $answer || $answerIsTrue;
        };
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Question;

use Symfony\Component\Console\Exception\InvalidArgumentException;
use Symfony\Component\Console\Exception\LogicException;

/**
 * Represents a Question.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class Question
{
    private $question;
    private $attempts;
    private $hidden = false;
    private $hiddenFallback = true;
    private $autocompleterCallback;
    private $validator;
    private $default;
    private $normalizer;
    private $trimmable = true;
    private $multiline = false;

    /**
     * @param string                     $question The question to ask to the user
     * @param string|bool|int|float|null $default  The default answer to return if the user enters nothing
     */
    public function __construct(string $question, $default = null)
    {
        $this->question = $question;
        $this->default = $default;
    }

    /**
     * Returns the question.
     *
     * @return string
     */
    public function getQuestion()
    {
        return $this->question;
    }

    /**
     * Returns the default answer.
     *
     * @return string|bool|int|float|null
     */
    public function getDefault()
    {
        return $this->default;
    }

    /**
     * Returns whether the user response accepts newline characters.
     */
    public function isMultiline(): bool
    {
        return $this->multiline;
    }

    /**
     * Sets whether the user response should accept newline characters.
     *
     * @return $this
     */
    public function setMultiline(bool $multiline): self
    {
        $this->multiline = $multiline;

        return $this;
    }

    /**
     * Returns whether the user response must be hidden.
     *
     * @return bool
     */
    public function isHidden()
    {
        return $this->hidden;
    }

    /**
     * Sets whether the user response must be hidden or not.
     *
     * @return $this
     *
     * @throws LogicException In case the autocompleter is also used
     */
    public function setHidden(bool $hidden)
    {
        if ($this->autocompleterCallback) {
            throw new LogicException('A hidden question cannot use the autocompleter.');
        }

        $this->hidden = $hidden;

        return $this;
    }

    /**
     * In case the response cannot be hidden, whether to fallback on non-hidden question or not.
     *
     * @return bool
     */
    public function isHiddenFallback()
    {
        return $this->hiddenFallback;
    }

    /**
     * Sets whether to fallback on non-hidden question if the response cannot be hidden.
     *
     * @return $this
     */
    public function setHiddenFallback(bool $fallback)
    {
        $this->hiddenFallback = $fallback;

        return $this;
    }

    /**
     * Gets values for the autocompleter.
     *
     * @return iterable|null
     */
    public function getAutocompleterValues()
    {
        $callback = $this->getAutocompleterCallback();

        return $callback ? $callback('') : null;
    }

    /**
     * Sets values for the autocompleter.
     *
     * @return $this
     *
     * @throws LogicException
     */
    public function setAutocompleterValues(?iterable $values)
    {
        if (\is_array($values)) {
            $values = $this->isAssoc($values) ? array_merge(array_keys($values), array_values($values)) : array_values($values);

            $callback = static function () use ($values) {
                return $values;
            };
        } elseif ($values instanceof \Traversable) {
            $valueCache = null;
            $callback = static function () use ($values, &$valueCache) {
                return $valueCache ?? $valueCache = iterator_to_array($values, false);
            };
        } else {
            $callback = null;
        }

        return $this->setAutocompleterCallback($callback);
    }

    /**
     * Gets the callback function used for the autocompleter.
     */
    public function getAutocompleterCallback(): ?callable
    {
        return $this->autocompleterCallback;
    }

    /**
     * Sets the callback function used for the autocompleter.
     *
     * The callback is passed the user input as argument and should return an iterable of corresponding suggestions.
     *
     * @return $this
     */
    public function setAutocompleterCallback(callable $callback = null): self
    {
        if ($this->hidden && null !== $callback) {
            throw new LogicException('A hidden question cannot use the autocompleter.');
        }

        $this->autocompleterCallback = $callback;

        return $this;
    }

    /**
     * Sets a validator for the question.
     *
     * @return $this
     */
    public function setValidator(callable $validator = null)
    {
        $this->validator = $validator;

        return $this;
    }

    /**
     * Gets the validator for the question.
     *
     * @return callable|null
     */
    public function getValidator()
    {
        return $this->validator;
    }

    /**
     * Sets the maximum number of attempts.
     *
     * Null means an unlimited number of attempts.
     *
     * @return $this
     *
     * @throws InvalidArgumentException in case the number of attempts is invalid
     */
    public function setMaxAttempts(?int $attempts)
    {
        if (null !== $attempts && $attempts < 1) {
            throw new InvalidArgumentException('Maximum number of attempts must be a positive value.');
        }

        $this->attempts = $attempts;

        return $this;
    }

    /**
     * Gets the maximum number of attempts.
     *
     * Null means an unlimited number of attempts.
     *
     * @return int|null
     */
    public function getMaxAttempts()
    {
        return $this->attempts;
    }

    /**
     * Sets a normalizer for the response.
     *
     * The normalizer can be a callable (a string), a closure or a class implementing __invoke.
     *
     * @return $this
     */
    public function setNormalizer(callable $normalizer)
    {
        $this->normalizer = $normalizer;

        return $this;
    }

    /**
     * Gets the normalizer for the response.
     *
     * The normalizer can ba a callable (a string), a closure or a class implementing __invoke.
     *
     * @return callable|null
     */
    public function getNormalizer()
    {
        return $this->normalizer;
    }

    protected function isAssoc(array $array)
    {
        return (bool) \count(array_filter(array_keys($array), 'is_string'));
    }

    public function isTrimmable(): bool
    {
        return $this->trimmable;
    }

    /**
     * @return $this
     */
    public function setTrimmable(bool $trimmable): self
    {
        $this->trimmable = $trimmable;

        return $this;
    }
}
Console Component
=================

The Console component eases the creation of beautiful and testable command line
interfaces.

Sponsor
-------

The Console component for Symfony 5.4/6.0 is [backed][1] by [Les-Tilleuls.coop][2].

Les-Tilleuls.coop is a team of 50+ Symfony experts who can help you design, develop and
fix your projects. We provide a wide range of professional services including development,
consulting, coaching, training and audits. We also are highly skilled in JS, Go and DevOps.
We are a worker cooperative!

Help Symfony by [sponsoring][3] its development!

Resources
---------

 * [Documentation](https://symfony.com/doc/current/components/console.html)
 * [Contributing](https://symfony.com/doc/current/contributing/index.html)
 * [Report issues](https://github.com/symfony/symfony/issues) and
   [send Pull Requests](https://github.com/symfony/symfony/pulls)
   in the [main Symfony repository](https://github.com/symfony/symfony)

Credits
-------

`Resources/bin/hiddeninput.exe` is a third party binary provided within this
component. Find sources and license at https://github.com/Seldaek/hidden-input.

[1]: https://symfony.com/backers
[2]: https://les-tilleuls.coop
[3]: https://symfony.com/sponsor
MZ����@���	�!�L�!This program cannot be run in DOS mode.

$�,�;�B�;�B�;�B�2�מ:�B�2��-�B�2�ƞ9�B�2�ў?�B�a9�8�B�;�C��B�2�Ȟ:�B�2�֞:�B�2�Ӟ:�B�Rich;�B�PEL�MoO�	
8 @`?�@��"P@ Pp!8!@ �.text	
 `.rdata�	 
@@.data�0@�.rsrc @@@.reloc�P"@Bj$��@�xj�� @�e���E�PV� @�EЃ�PV� @�M�X @�e��E�P�5H @�L @YY�5\ @�E�P�5` @�D @YY��P @�M���M�T @3��H�;
0@u���h�@��l3@�$40@�5h3@�40@h$0@h(0@h 0@�� @���00@��}j�Y�jh"@�3ۉ]�d��p�]俀3@SVW�0 @;�t;�u3�F�u��h��4 @��3�F�|3@;�u
j�\Y�;�|3@��u,�5|3@h� @h� @�YY��t�E����������5<0@�|3@;�uh� @h� @�lYY�|3@9]�uSW�8 @9�3@th�3@�Y��t
SjS��3@�$0@�
� @��5$0@�5(0@�5 0@�������80@9,0@u7P�� @�E��	�M�PQ�YYËe�E�80@3�9,0@uP�h @9<0@u�� @�E������80@�øMZf9@t3��M�<@��@�8PEu��H��t��uՃ��v�3�9����xtv�3�9������j�,0@�p @j��l @YY��3@��3@�� @�
t3@��� @�
p3@��� @��x3@�V��=0@uh�@�� @Y�g�=0@�u	j��� @Y3���{�����U���(�H1@�
D1@�@1@�<1@�581@�=41@f�`1@f�
T1@f�01@f�,1@f�%(1@f�-$1@��X1@�E�L1@�E�P1@�E�\1@������0@�P1@�L0@�@0@	��D0@�0@������0@������ @��0@j�?Yj�  @h!@�$ @�=�0@uj�Yh	��( @P�, @�Ë�U��E��8csm�u*�xu$�@= �t=!�t="�t=@�u��3�]�hH@�  @3��%� @jh("@�b�5�3@�5� @��Y�E��u�u�� @Y�gj�Y�e��5�3@�։E�5�3@��YY�E�E�P�E�P�u�5l @��YP�U�E�u�֣�3@�u�փ���3@�E������	�E���j�YË�U��u�N��������YH]Ë�V��!@��!@W��;�s���t�Ѓ�;�r�_^Ë�V�"@�"@W��;�s���t�Ѓ�;�r�_^�%� @���̋�U��M�MZf9t3�]ËA<��8PEu�3ҹf9H�‹�]�����������̋�U��E�H<��ASV�q3�W�D��v�}�H;�r	�X�;�r
B��(;�r�3�_^[]������������̋�U��j�hH"@he@d�P��SVW�0@1E�3�P�E�d��e��E�h@�*�������tU�E-@Ph@�P�������t;�@$���Ѓ��E������M�d�
Y_^[��]ËE��3�=��‹�Ëe��E�����3��M�d�
Y_^[��]��%� @�%� @��he@d�5�D$�l$�l$+�SVW�0@1E�3�P�e�u��E��E������E��E�d�ËM�d�
Y__^[��]Q�U��u�u�u�uh�@h0@����]�Vhh3�V������t
VVVVV����^�3��U����0@�e��e�SW�N�@����;�t
��t	�У0@�`V�E�P�< @�u�3u�� @3� @3� @3�E�P� @�E�3E�3�;�u�O�@����u����50@�։50@^_[��%t @�%x @�%| @�%� @�%� @�%� @�%� @�%� @�%� @Pd�5�D$+d$SVW�(��0@3�P�E�u��E������E�d�ËM�d�
Y__^[��]QËM�3���������M�%T @�T$�B�J�3�����J�3�����l"@�s����#�#�#�)r)b)H)4))�(�(�(�(�(�(�)�#�$%�%&d&�&�$('�'�'�'�'(((6(�'H(Z(t(�('''�'�'l'^'R'F'>'>(0'�'�)�@W@�@�MoOl�!�@0@�0@bad allocationH0@�!@RSDSь���J�!���LZc:\users\seld\documents\visual studio 2010\Projects\hiddeninp\Release\hiddeninp.pdbe������������@@�����������:@������������@�@�����@"�d"@�"�# $#�&D H#(h �#�#�#�)r)b)H)4))�(�(�(�(�(�(�)�#�$%�%&d&�&�$('�'�'�'�'(((6(�'H(Z(t(�('''�'�'l'^'R'F'>'>(0'�'�)�GetConsoleMode�SetConsoleMode;GetStdHandleKERNEL32.dll??$?6DU?$char_traits@D@std@@V?$allocator@D@1@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@0@@Z�?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@AJ?cin@std@@3V?$basic_istream@DU?$char_traits@D@std@@@1@A�??$getline@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@YAAAV?$basic_istream@DU?$char_traits@D@std@@@0@AAV10@AAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@0@@Z??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAV01@AAV01@@Z@Z_??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ{??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ�?endl@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@1@AAV21@@ZMSVCP90.dll_amsg_exit�__getmainargs,_cexit|_exitf_XcptFilter�exit�__initenv_initterm_initterm_e<_configthreadlocale�__setusermatherr_adjust_fdiv�__p__commode�__p__fmodej_encode_pointer�__set_app_typeK_crt_debugger_hookC?terminate@@YAXXZMSVCR90.dll�_unlock�__dllonexitv_lock_onexit`_decode_pointers_except_handler4_common_invoke_watson?_controlfp_s�InterlockedExchange!Sleep�InterlockedCompareExchange-TerminateProcess�GetCurrentProcess>UnhandledExceptionFilterSetUnhandledExceptionFilter�IsDebuggerPresentTQueryPerformanceCounterfGetTickCount�GetCurrentThreadId�GetCurrentProcessIdOGetSystemTimeAsFileTimes__CxxFrameHandler3N�@���D������������$!@ �8�P�h�	�	��@(��CV�(4VS_VERSION_INFO���StringFileInfob040904b0�QFileDescriptionReads from stdin without leaking info to the terminal and outputs back to stdout6FileVersion1, 0, 0, 08InternalNamehiddeninputPLegalCopyrightJordi Boggiano - 2012HOriginalFilenamehiddeninput.exe:
ProductNameHidden Input:ProductVersion1, 0, 0, 0DVarFileInfo$Translation	�<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel>
      </requestedPrivileges>
    </security>
  </trustInfo>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.21022.8" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    </dependentAssembly>
  </dependency>
</assembly>PAPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDING@00!0/080F0L0T0^0d0n0{0�0�0�0�0�0�0�0�0�0�0�0�0�01#1-1@1J1O1T1v1{1�1�1�1�1�1�1�1�1�1�1�1�1�1�12"2*23292A2M2_2j2p2�2�2�2�2�2�2�2�2�2�2�2333%303N3T3Z3`3f3l3s3z3�3�3�3�3�3�3�3�3�3�3�3�3�3�3�3�34444%4;4B4�4�4�4�4�4�4�4�4�4�45!5^5c5�5�5�5H6M6_6}6�6�677
7*7w7|7�7�7�7�78
88=8E8P8V8\8b8h8n8t8z8�8�8�89 $�0�0�01 1t1x12 2@2\2`2h2t200# This file is part of the Symfony package.
#
# (c) Fabien Potencier <fabien@symfony.com>
#
# For the full copyright and license information, please view
# https://symfony.com/doc/current/contributing/code/license.html

_sf_{{ COMMAND_NAME }}() {
    # Use newline as only separator to allow space in completion values
    IFS=$'\n'
    local sf_cmd="${COMP_WORDS[0]}"

    # for an alias, get the real script behind it
    sf_cmd_type=$(type -t $sf_cmd)
    if [[ $sf_cmd_type == "alias" ]]; then
        sf_cmd=$(alias $sf_cmd | sed -E "s/alias $sf_cmd='(.*)'/\1/")
    elif [[ $sf_cmd_type == "file" ]]; then
        sf_cmd=$(type -p $sf_cmd)
    fi

    if [[ $sf_cmd_type != "function" && ! -x $sf_cmd ]]; then
        return 1
    fi

    local cur prev words cword
    _get_comp_words_by_ref -n := cur prev words cword

    local completecmd=("$sf_cmd" "_complete" "--no-interaction" "-sbash" "-c$cword" "-S{{ VERSION }}")
    for w in ${words[@]}; do
        w=$(printf -- '%b' "$w")
        # remove quotes from typed values
        quote="${w:0:1}"
        if [ "$quote" == \' ]; then
            w="${w%\'}"
            w="${w#\'}"
        elif [ "$quote" == \" ]; then
            w="${w%\"}"
            w="${w#\"}"
        fi
        # empty values are ignored
        if [ ! -z "$w" ]; then
            completecmd+=("-i$w")
        fi
    done

    local sfcomplete
    if sfcomplete=$(${completecmd[@]} 2>&1); then
        local quote suggestions
        quote=${cur:0:1}

        # Use single quotes by default if suggestions contains backslash (FQCN)
        if [ "$quote" == '' ] && [[ "$sfcomplete" =~ \\ ]]; then
            quote=\'
        fi

        if [ "$quote" == \' ]; then
            # single quotes: no additional escaping (does not accept ' in values)
            suggestions=$(for s in $sfcomplete; do printf $'%q%q%q\n' "$quote" "$s" "$quote"; done)
        elif [ "$quote" == \" ]; then
            # double quotes: double escaping for \ $ ` "
            suggestions=$(for s in $sfcomplete; do
                s=${s//\\/\\\\}
                s=${s//\$/\\\$}
                s=${s//\`/\\\`}
                s=${s//\"/\\\"}
                printf $'%q%q%q\n' "$quote" "$s" "$quote";
            done)
        else
            # no quotes: double escaping
            suggestions=$(for s in $sfcomplete; do printf $'%q\n' $(printf '%q' "$s"); done)
        fi
        COMPREPLY=($(IFS=$'\n' compgen -W "$suggestions" -- $(printf -- "%q" "$cur")))
        __ltrim_colon_completions "$cur"
    else
        if [[ "$sfcomplete" != *"Command \"_complete\" is not defined."* ]]; then
            >&2 echo
            >&2 echo $sfcomplete
        fi

        return 1
    fi
}

complete -F _sf_{{ COMMAND_NAME }} {{ COMMAND_NAME }}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\SignalRegistry;

final class SignalRegistry
{
    private $signalHandlers = [];

    public function __construct()
    {
        if (\function_exists('pcntl_async_signals')) {
            pcntl_async_signals(true);
        }
    }

    public function register(int $signal, callable $signalHandler): void
    {
        if (!isset($this->signalHandlers[$signal])) {
            $previousCallback = pcntl_signal_get_handler($signal);

            if (\is_callable($previousCallback)) {
                $this->signalHandlers[$signal][] = $previousCallback;
            }
        }

        $this->signalHandlers[$signal][] = $signalHandler;

        pcntl_signal($signal, [$this, 'handle']);
    }

    public static function isSupported(): bool
    {
        if (!\function_exists('pcntl_signal')) {
            return false;
        }

        if (\in_array('pcntl_signal', explode(',', \ini_get('disable_functions')))) {
            return false;
        }

        return true;
    }

    /**
     * @internal
     */
    public function handle(int $signal): void
    {
        $count = \count($this->signalHandlers[$signal]);

        foreach ($this->signalHandlers[$signal] as $i => $signalHandler) {
            $hasNext = $i !== $count - 1;
            $signalHandler($signal, $hasNext);
        }
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

/**
 * @author Grégoire Pineau <lyrixx@lyrixx.info>
 */
class SingleCommandApplication extends Command
{
    private $version = 'UNKNOWN';
    private $autoExit = true;
    private $running = false;

    /**
     * @return $this
     */
    public function setVersion(string $version): self
    {
        $this->version = $version;

        return $this;
    }

    /**
     * @final
     *
     * @return $this
     */
    public function setAutoExit(bool $autoExit): self
    {
        $this->autoExit = $autoExit;

        return $this;
    }

    public function run(InputInterface $input = null, OutputInterface $output = null): int
    {
        if ($this->running) {
            return parent::run($input, $output);
        }

        // We use the command name as the application name
        $application = new Application($this->getName() ?: 'UNKNOWN', $this->version);
        $application->setAutoExit($this->autoExit);
        // Fix the usage of the command displayed with "--help"
        $this->setName($_SERVER['argv'][0]);
        $application->add($this);
        $application->setDefaultCommand($this->getName(), true);

        $this->running = true;
        try {
            $ret = $application->run($input, $output);
        } finally {
            $this->running = false;
        }

        return $ret ?? 1;
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Style;

use Symfony\Component\Console\Formatter\OutputFormatterInterface;
use Symfony\Component\Console\Helper\ProgressBar;
use Symfony\Component\Console\Output\ConsoleOutputInterface;
use Symfony\Component\Console\Output\OutputInterface;

/**
 * Decorates output to add console style guide helpers.
 *
 * @author Kevin Bond <kevinbond@gmail.com>
 */
abstract class OutputStyle implements OutputInterface, StyleInterface
{
    private $output;

    public function __construct(OutputInterface $output)
    {
        $this->output = $output;
    }

    /**
     * {@inheritdoc}
     */
    public function newLine(int $count = 1)
    {
        $this->output->write(str_repeat(\PHP_EOL, $count));
    }

    /**
     * @return ProgressBar
     */
    public function createProgressBar(int $max = 0)
    {
        return new ProgressBar($this->output, $max);
    }

    /**
     * {@inheritdoc}
     */
    public function write($messages, bool $newline = false, int $type = self::OUTPUT_NORMAL)
    {
        $this->output->write($messages, $newline, $type);
    }

    /**
     * {@inheritdoc}
     */
    public function writeln($messages, int $type = self::OUTPUT_NORMAL)
    {
        $this->output->writeln($messages, $type);
    }

    /**
     * {@inheritdoc}
     */
    public function setVerbosity(int $level)
    {
        $this->output->setVerbosity($level);
    }

    /**
     * {@inheritdoc}
     */
    public function getVerbosity()
    {
        return $this->output->getVerbosity();
    }

    /**
     * {@inheritdoc}
     */
    public function setDecorated(bool $decorated)
    {
        $this->output->setDecorated($decorated);
    }

    /**
     * {@inheritdoc}
     */
    public function isDecorated()
    {
        return $this->output->isDecorated();
    }

    /**
     * {@inheritdoc}
     */
    public function setFormatter(OutputFormatterInterface $formatter)
    {
        $this->output->setFormatter($formatter);
    }

    /**
     * {@inheritdoc}
     */
    public function getFormatter()
    {
        return $this->output->getFormatter();
    }

    /**
     * {@inheritdoc}
     */
    public function isQuiet()
    {
        return $this->output->isQuiet();
    }

    /**
     * {@inheritdoc}
     */
    public function isVerbose()
    {
        return $this->output->isVerbose();
    }

    /**
     * {@inheritdoc}
     */
    public function isVeryVerbose()
    {
        return $this->output->isVeryVerbose();
    }

    /**
     * {@inheritdoc}
     */
    public function isDebug()
    {
        return $this->output->isDebug();
    }

    protected function getErrorOutput()
    {
        if (!$this->output instanceof ConsoleOutputInterface) {
            return $this->output;
        }

        return $this->output->getErrorOutput();
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Style;

/**
 * Output style helpers.
 *
 * @author Kevin Bond <kevinbond@gmail.com>
 */
interface StyleInterface
{
    /**
     * Formats a command title.
     */
    public function title(string $message);

    /**
     * Formats a section title.
     */
    public function section(string $message);

    /**
     * Formats a list.
     */
    public function listing(array $elements);

    /**
     * Formats informational text.
     *
     * @param string|array $message
     */
    public function text($message);

    /**
     * Formats a success result bar.
     *
     * @param string|array $message
     */
    public function success($message);

    /**
     * Formats an error result bar.
     *
     * @param string|array $message
     */
    public function error($message);

    /**
     * Formats an warning result bar.
     *
     * @param string|array $message
     */
    public function warning($message);

    /**
     * Formats a note admonition.
     *
     * @param string|array $message
     */
    public function note($message);

    /**
     * Formats a caution admonition.
     *
     * @param string|array $message
     */
    public function caution($message);

    /**
     * Formats a table.
     */
    public function table(array $headers, array $rows);

    /**
     * Asks a question.
     *
     * @return mixed
     */
    public function ask(string $question, string $default = null, callable $validator = null);

    /**
     * Asks a question with the user input hidden.
     *
     * @return mixed
     */
    public function askHidden(string $question, callable $validator = null);

    /**
     * Asks for confirmation.
     *
     * @return bool
     */
    public function confirm(string $question, bool $default = true);

    /**
     * Asks a choice question.
     *
     * @param string|int|null $default
     *
     * @return mixed
     */
    public function choice(string $question, array $choices, $default = null);

    /**
     * Add newline(s).
     */
    public function newLine(int $count = 1);

    /**
     * Starts the progress output.
     */
    public function progressStart(int $max = 0);

    /**
     * Advances the progress output X steps.
     */
    public function progressAdvance(int $step = 1);

    /**
     * Finishes the progress output.
     */
    public function progressFinish();
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Style;

use Symfony\Component\Console\Exception\InvalidArgumentException;
use Symfony\Component\Console\Exception\RuntimeException;
use Symfony\Component\Console\Formatter\OutputFormatter;
use Symfony\Component\Console\Helper\Helper;
use Symfony\Component\Console\Helper\ProgressBar;
use Symfony\Component\Console\Helper\SymfonyQuestionHelper;
use Symfony\Component\Console\Helper\Table;
use Symfony\Component\Console\Helper\TableCell;
use Symfony\Component\Console\Helper\TableSeparator;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\ConsoleOutputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Output\TrimmedBufferOutput;
use Symfony\Component\Console\Question\ChoiceQuestion;
use Symfony\Component\Console\Question\ConfirmationQuestion;
use Symfony\Component\Console\Question\Question;
use Symfony\Component\Console\Terminal;

/**
 * Output decorator helpers for the Symfony Style Guide.
 *
 * @author Kevin Bond <kevinbond@gmail.com>
 */
class SymfonyStyle extends OutputStyle
{
    public const MAX_LINE_LENGTH = 120;

    private $input;
    private $output;
    private $questionHelper;
    private $progressBar;
    private $lineLength;
    private $bufferedOutput;

    public function __construct(InputInterface $input, OutputInterface $output)
    {
        $this->input = $input;
        $this->bufferedOutput = new TrimmedBufferOutput(\DIRECTORY_SEPARATOR === '\\' ? 4 : 2, $output->getVerbosity(), false, clone $output->getFormatter());
        // Windows cmd wraps lines as soon as the terminal width is reached, whether there are following chars or not.
        $width = (new Terminal())->getWidth() ?: self::MAX_LINE_LENGTH;
        $this->lineLength = min($width - (int) (\DIRECTORY_SEPARATOR === '\\'), self::MAX_LINE_LENGTH);

        parent::__construct($this->output = $output);
    }

    /**
     * Formats a message as a block of text.
     *
     * @param string|array $messages The message to write in the block
     */
    public function block($messages, string $type = null, string $style = null, string $prefix = ' ', bool $padding = false, bool $escape = true)
    {
        $messages = \is_array($messages) ? array_values($messages) : [$messages];

        $this->autoPrependBlock();
        $this->writeln($this->createBlock($messages, $type, $style, $prefix, $padding, $escape));
        $this->newLine();
    }

    /**
     * {@inheritdoc}
     */
    public function title(string $message)
    {
        $this->autoPrependBlock();
        $this->writeln([
            sprintf('<comment>%s</>', OutputFormatter::escapeTrailingBackslash($message)),
            sprintf('<comment>%s</>', str_repeat('=', Helper::width(Helper::removeDecoration($this->getFormatter(), $message)))),
        ]);
        $this->newLine();
    }

    /**
     * {@inheritdoc}
     */
    public function section(string $message)
    {
        $this->autoPrependBlock();
        $this->writeln([
            sprintf('<comment>%s</>', OutputFormatter::escapeTrailingBackslash($message)),
            sprintf('<comment>%s</>', str_repeat('-', Helper::width(Helper::removeDecoration($this->getFormatter(), $message)))),
        ]);
        $this->newLine();
    }

    /**
     * {@inheritdoc}
     */
    public function listing(array $elements)
    {
        $this->autoPrependText();
        $elements = array_map(function ($element) {
            return sprintf(' * %s', $element);
        }, $elements);

        $this->writeln($elements);
        $this->newLine();
    }

    /**
     * {@inheritdoc}
     */
    public function text($message)
    {
        $this->autoPrependText();

        $messages = \is_array($message) ? array_values($message) : [$message];
        foreach ($messages as $message) {
            $this->writeln(sprintf(' %s', $message));
        }
    }

    /**
     * Formats a command comment.
     *
     * @param string|array $message
     */
    public function comment($message)
    {
        $this->block($message, null, null, '<fg=default;bg=default> // </>', false, false);
    }

    /**
     * {@inheritdoc}
     */
    public function success($message)
    {
        $this->block($message, 'OK', 'fg=black;bg=green', ' ', true);
    }

    /**
     * {@inheritdoc}
     */
    public function error($message)
    {
        $this->block($message, 'ERROR', 'fg=white;bg=red', ' ', true);
    }

    /**
     * {@inheritdoc}
     */
    public function warning($message)
    {
        $this->block($message, 'WARNING', 'fg=black;bg=yellow', ' ', true);
    }

    /**
     * {@inheritdoc}
     */
    public function note($message)
    {
        $this->block($message, 'NOTE', 'fg=yellow', ' ! ');
    }

    /**
     * Formats an info message.
     *
     * @param string|array $message
     */
    public function info($message)
    {
        $this->block($message, 'INFO', 'fg=green', ' ', true);
    }

    /**
     * {@inheritdoc}
     */
    public function caution($message)
    {
        $this->block($message, 'CAUTION', 'fg=white;bg=red', ' ! ', true);
    }

    /**
     * {@inheritdoc}
     */
    public function table(array $headers, array $rows)
    {
        $this->createTable()
            ->setHeaders($headers)
            ->setRows($rows)
            ->render()
        ;

        $this->newLine();
    }

    /**
     * Formats a horizontal table.
     */
    public function horizontalTable(array $headers, array $rows)
    {
        $this->createTable()
            ->setHorizontal(true)
            ->setHeaders($headers)
            ->setRows($rows)
            ->render()
        ;

        $this->newLine();
    }

    /**
     * Formats a list of key/value horizontally.
     *
     * Each row can be one of:
     * * 'A title'
     * * ['key' => 'value']
     * * new TableSeparator()
     *
     * @param string|array|TableSeparator ...$list
     */
    public function definitionList(...$list)
    {
        $headers = [];
        $row = [];
        foreach ($list as $value) {
            if ($value instanceof TableSeparator) {
                $headers[] = $value;
                $row[] = $value;
                continue;
            }
            if (\is_string($value)) {
                $headers[] = new TableCell($value, ['colspan' => 2]);
                $row[] = null;
                continue;
            }
            if (!\is_array($value)) {
                throw new InvalidArgumentException('Value should be an array, string, or an instance of TableSeparator.');
            }
            $headers[] = key($value);
            $row[] = current($value);
        }

        $this->horizontalTable($headers, [$row]);
    }

    /**
     * {@inheritdoc}
     */
    public function ask(string $question, string $default = null, callable $validator = null)
    {
        $question = new Question($question, $default);
        $question->setValidator($validator);

        return $this->askQuestion($question);
    }

    /**
     * {@inheritdoc}
     */
    public function askHidden(string $question, callable $validator = null)
    {
        $question = new Question($question);

        $question->setHidden(true);
        $question->setValidator($validator);

        return $this->askQuestion($question);
    }

    /**
     * {@inheritdoc}
     */
    public function confirm(string $question, bool $default = true)
    {
        return $this->askQuestion(new ConfirmationQuestion($question, $default));
    }

    /**
     * {@inheritdoc}
     */
    public function choice(string $question, array $choices, $default = null)
    {
        if (null !== $default) {
            $values = array_flip($choices);
            $default = $values[$default] ?? $default;
        }

        return $this->askQuestion(new ChoiceQuestion($question, $choices, $default));
    }

    /**
     * {@inheritdoc}
     */
    public function progressStart(int $max = 0)
    {
        $this->progressBar = $this->createProgressBar($max);
        $this->progressBar->start();
    }

    /**
     * {@inheritdoc}
     */
    public function progressAdvance(int $step = 1)
    {
        $this->getProgressBar()->advance($step);
    }

    /**
     * {@inheritdoc}
     */
    public function progressFinish()
    {
        $this->getProgressBar()->finish();
        $this->newLine(2);
        $this->progressBar = null;
    }

    /**
     * {@inheritdoc}
     */
    public function createProgressBar(int $max = 0)
    {
        $progressBar = parent::createProgressBar($max);

        if ('\\' !== \DIRECTORY_SEPARATOR || 'Hyper' === getenv('TERM_PROGRAM')) {
            $progressBar->setEmptyBarCharacter('░'); // light shade character \u2591
            $progressBar->setProgressCharacter('');
            $progressBar->setBarCharacter('▓'); // dark shade character \u2593
        }

        return $progressBar;
    }

    /**
     * @see ProgressBar::iterate()
     */
    public function progressIterate(iterable $iterable, int $max = null): iterable
    {
        yield from $this->createProgressBar()->iterate($iterable, $max);

        $this->newLine(2);
    }

    /**
     * @return mixed
     */
    public function askQuestion(Question $question)
    {
        if ($this->input->isInteractive()) {
            $this->autoPrependBlock();
        }

        if (!$this->questionHelper) {
            $this->questionHelper = new SymfonyQuestionHelper();
        }

        $answer = $this->questionHelper->ask($this->input, $this, $question);

        if ($this->input->isInteractive()) {
            $this->newLine();
            $this->bufferedOutput->write("\n");
        }

        return $answer;
    }

    /**
     * {@inheritdoc}
     */
    public function writeln($messages, int $type = self::OUTPUT_NORMAL)
    {
        if (!is_iterable($messages)) {
            $messages = [$messages];
        }

        foreach ($messages as $message) {
            parent::writeln($message, $type);
            $this->writeBuffer($message, true, $type);
        }
    }

    /**
     * {@inheritdoc}
     */
    public function write($messages, bool $newline = false, int $type = self::OUTPUT_NORMAL)
    {
        if (!is_iterable($messages)) {
            $messages = [$messages];
        }

        foreach ($messages as $message) {
            parent::write($message, $newline, $type);
            $this->writeBuffer($message, $newline, $type);
        }
    }

    /**
     * {@inheritdoc}
     */
    public function newLine(int $count = 1)
    {
        parent::newLine($count);
        $this->bufferedOutput->write(str_repeat("\n", $count));
    }

    /**
     * Returns a new instance which makes use of stderr if available.
     *
     * @return self
     */
    public function getErrorStyle()
    {
        return new self($this->input, $this->getErrorOutput());
    }

    public function createTable(): Table
    {
        $output = $this->output instanceof ConsoleOutputInterface ? $this->output->section() : $this->output;
        $style = clone Table::getStyleDefinition('symfony-style-guide');
        $style->setCellHeaderFormat('<info>%s</info>');

        return (new Table($output))->setStyle($style);
    }

    private function getProgressBar(): ProgressBar
    {
        if (!$this->progressBar) {
            throw new RuntimeException('The ProgressBar is not started.');
        }

        return $this->progressBar;
    }

    private function autoPrependBlock(): void
    {
        $chars = substr(str_replace(\PHP_EOL, "\n", $this->bufferedOutput->fetch()), -2);

        if (!isset($chars[0])) {
            $this->newLine(); // empty history, so we should start with a new line.

            return;
        }
        // Prepend new line for each non LF chars (This means no blank line was output before)
        $this->newLine(2 - substr_count($chars, "\n"));
    }

    private function autoPrependText(): void
    {
        $fetched = $this->bufferedOutput->fetch();
        // Prepend new line if last char isn't EOL:
        if (!str_ends_with($fetched, "\n")) {
            $this->newLine();
        }
    }

    private function writeBuffer(string $message, bool $newLine, int $type): void
    {
        // We need to know if the last chars are PHP_EOL
        $this->bufferedOutput->write($message, $newLine, $type);
    }

    private function createBlock(iterable $messages, string $type = null, string $style = null, string $prefix = ' ', bool $padding = false, bool $escape = false): array
    {
        $indentLength = 0;
        $prefixLength = Helper::width(Helper::removeDecoration($this->getFormatter(), $prefix));
        $lines = [];

        if (null !== $type) {
            $type = sprintf('[%s] ', $type);
            $indentLength = \strlen($type);
            $lineIndentation = str_repeat(' ', $indentLength);
        }

        // wrap and add newlines for each element
        foreach ($messages as $key => $message) {
            if ($escape) {
                $message = OutputFormatter::escape($message);
            }

            $decorationLength = Helper::width($message) - Helper::width(Helper::removeDecoration($this->getFormatter(), $message));
            $messageLineLength = min($this->lineLength - $prefixLength - $indentLength + $decorationLength, $this->lineLength);
            $messageLines = explode(\PHP_EOL, wordwrap($message, $messageLineLength, \PHP_EOL, true));
            foreach ($messageLines as $messageLine) {
                $lines[] = $messageLine;
            }

            if (\count($messages) > 1 && $key < \count($messages) - 1) {
                $lines[] = '';
            }
        }

        $firstLineIndex = 0;
        if ($padding && $this->isDecorated()) {
            $firstLineIndex = 1;
            array_unshift($lines, '');
            $lines[] = '';
        }

        foreach ($lines as $i => &$line) {
            if (null !== $type) {
                $line = $firstLineIndex === $i ? $type.$line : $lineIndentation.$line;
            }

            $line = $prefix.$line;
            $line .= str_repeat(' ', max($this->lineLength - Helper::width(Helper::removeDecoration($this->getFormatter(), $line)), 0));

            if ($style) {
                $line = sprintf('<%s>%s</>', $style, $line);
            }
        }

        return $lines;
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console;

class Terminal
{
    private static $width;
    private static $height;
    private static $stty;

    /**
     * Gets the terminal width.
     *
     * @return int
     */
    public function getWidth()
    {
        $width = getenv('COLUMNS');
        if (false !== $width) {
            return (int) trim($width);
        }

        if (null === self::$width) {
            self::initDimensions();
        }

        return self::$width ?: 80;
    }

    /**
     * Gets the terminal height.
     *
     * @return int
     */
    public function getHeight()
    {
        $height = getenv('LINES');
        if (false !== $height) {
            return (int) trim($height);
        }

        if (null === self::$height) {
            self::initDimensions();
        }

        return self::$height ?: 50;
    }

    /**
     * @internal
     */
    public static function hasSttyAvailable(): bool
    {
        if (null !== self::$stty) {
            return self::$stty;
        }

        // skip check if shell_exec function is disabled
        if (!\function_exists('shell_exec')) {
            return false;
        }

        return self::$stty = (bool) shell_exec('stty 2> '.('\\' === \DIRECTORY_SEPARATOR ? 'NUL' : '/dev/null'));
    }

    private static function initDimensions()
    {
        if ('\\' === \DIRECTORY_SEPARATOR) {
            $ansicon = getenv('ANSICON');
            if (false !== $ansicon && preg_match('/^(\d+)x(\d+)(?: \((\d+)x(\d+)\))?$/', trim($ansicon), $matches)) {
                // extract [w, H] from "wxh (WxH)"
                // or [w, h] from "wxh"
                self::$width = (int) $matches[1];
                self::$height = isset($matches[4]) ? (int) $matches[4] : (int) $matches[2];
            } elseif (!self::hasVt100Support() && self::hasSttyAvailable()) {
                // only use stty on Windows if the terminal does not support vt100 (e.g. Windows 7 + git-bash)
                // testing for stty in a Windows 10 vt100-enabled console will implicitly disable vt100 support on STDOUT
                self::initDimensionsUsingStty();
            } elseif (null !== $dimensions = self::getConsoleMode()) {
                // extract [w, h] from "wxh"
                self::$width = (int) $dimensions[0];
                self::$height = (int) $dimensions[1];
            }
        } else {
            self::initDimensionsUsingStty();
        }
    }

    /**
     * Returns whether STDOUT has vt100 support (some Windows 10+ configurations).
     */
    private static function hasVt100Support(): bool
    {
        return \function_exists('sapi_windows_vt100_support') && sapi_windows_vt100_support(fopen('php://stdout', 'w'));
    }

    /**
     * Initializes dimensions using the output of an stty columns line.
     */
    private static function initDimensionsUsingStty()
    {
        if ($sttyString = self::getSttyColumns()) {
            if (preg_match('/rows.(\d+);.columns.(\d+);/i', $sttyString, $matches)) {
                // extract [w, h] from "rows h; columns w;"
                self::$width = (int) $matches[2];
                self::$height = (int) $matches[1];
            } elseif (preg_match('/;.(\d+).rows;.(\d+).columns/i', $sttyString, $matches)) {
                // extract [w, h] from "; h rows; w columns"
                self::$width = (int) $matches[2];
                self::$height = (int) $matches[1];
            }
        }
    }

    /**
     * Runs and parses mode CON if it's available, suppressing any error output.
     *
     * @return int[]|null An array composed of the width and the height or null if it could not be parsed
     */
    private static function getConsoleMode(): ?array
    {
        $info = self::readFromProcess('mode CON');

        if (null === $info || !preg_match('/--------+\r?\n.+?(\d+)\r?\n.+?(\d+)\r?\n/', $info, $matches)) {
            return null;
        }

        return [(int) $matches[2], (int) $matches[1]];
    }

    /**
     * Runs and parses stty -a if it's available, suppressing any error output.
     */
    private static function getSttyColumns(): ?string
    {
        return self::readFromProcess('stty -a | grep columns');
    }

    private static function readFromProcess(string $command): ?string
    {
        if (!\function_exists('proc_open')) {
            return null;
        }

        $descriptorspec = [
            1 => ['pipe', 'w'],
            2 => ['pipe', 'w'],
        ];

        $cp = \function_exists('sapi_windows_cp_set') ? sapi_windows_cp_get() : 0;

        $process = proc_open($command, $descriptorspec, $pipes, null, null, ['suppress_errors' => true]);
        if (!\is_resource($process)) {
            return null;
        }

        $info = stream_get_contents($pipes[1]);
        fclose($pipes[1]);
        fclose($pipes[2]);
        proc_close($process);

        if ($cp) {
            sapi_windows_cp_set($cp);
        }

        return $info;
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Tester;

use Symfony\Component\Console\Application;
use Symfony\Component\Console\Input\ArrayInput;

/**
 * Eases the testing of console applications.
 *
 * When testing an application, don't forget to disable the auto exit flag:
 *
 *     $application = new Application();
 *     $application->setAutoExit(false);
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class ApplicationTester
{
    use TesterTrait;

    private $application;

    public function __construct(Application $application)
    {
        $this->application = $application;
    }

    /**
     * Executes the application.
     *
     * Available options:
     *
     *  * interactive:               Sets the input interactive flag
     *  * decorated:                 Sets the output decorated flag
     *  * verbosity:                 Sets the output verbosity flag
     *  * capture_stderr_separately: Make output of stdOut and stdErr separately available
     *
     * @return int The command exit code
     */
    public function run(array $input, array $options = [])
    {
        $prevShellVerbosity = getenv('SHELL_VERBOSITY');

        try {
            $this->input = new ArrayInput($input);
            if (isset($options['interactive'])) {
                $this->input->setInteractive($options['interactive']);
            }

            if ($this->inputs) {
                $this->input->setStream(self::createStream($this->inputs));
            }

            $this->initOutput($options);

            return $this->statusCode = $this->application->run($this->input, $this->output);
        } finally {
            // SHELL_VERBOSITY is set by Application::configureIO so we need to unset/reset it
            // to its previous value to avoid one test's verbosity to spread to the following tests
            if (false === $prevShellVerbosity) {
                if (\function_exists('putenv')) {
                    @putenv('SHELL_VERBOSITY');
                }
                unset($_ENV['SHELL_VERBOSITY']);
                unset($_SERVER['SHELL_VERBOSITY']);
            } else {
                if (\function_exists('putenv')) {
                    @putenv('SHELL_VERBOSITY='.$prevShellVerbosity);
                }
                $_ENV['SHELL_VERBOSITY'] = $prevShellVerbosity;
                $_SERVER['SHELL_VERBOSITY'] = $prevShellVerbosity;
            }
        }
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Tester;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Completion\CompletionInput;
use Symfony\Component\Console\Completion\CompletionSuggestions;

/**
 * Eases the testing of command completion.
 *
 * @author Jérôme Tamarelle <jerome@tamarelle.net>
 */
class CommandCompletionTester
{
    private $command;

    public function __construct(Command $command)
    {
        $this->command = $command;
    }

    /**
     * Create completion suggestions from input tokens.
     */
    public function complete(array $input): array
    {
        $currentIndex = \count($input);
        if ('' === end($input)) {
            array_pop($input);
        }
        array_unshift($input, $this->command->getName());

        $completionInput = CompletionInput::fromTokens($input, $currentIndex);
        $completionInput->bind($this->command->getDefinition());
        $suggestions = new CompletionSuggestions();

        $this->command->complete($completionInput, $suggestions);

        $options = [];
        foreach ($suggestions->getOptionSuggestions() as $option) {
            $options[] = '--'.$option->getName();
        }

        return array_map('strval', array_merge($options, $suggestions->getValueSuggestions()));
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Tester;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\ArrayInput;

/**
 * Eases the testing of console commands.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Robin Chalas <robin.chalas@gmail.com>
 */
class CommandTester
{
    use TesterTrait;

    private $command;

    public function __construct(Command $command)
    {
        $this->command = $command;
    }

    /**
     * Executes the command.
     *
     * Available execution options:
     *
     *  * interactive:               Sets the input interactive flag
     *  * decorated:                 Sets the output decorated flag
     *  * verbosity:                 Sets the output verbosity flag
     *  * capture_stderr_separately: Make output of stdOut and stdErr separately available
     *
     * @param array $input   An array of command arguments and options
     * @param array $options An array of execution options
     *
     * @return int The command exit code
     */
    public function execute(array $input, array $options = [])
    {
        // set the command name automatically if the application requires
        // this argument and no command name was passed
        if (!isset($input['command'])
            && (null !== $application = $this->command->getApplication())
            && $application->getDefinition()->hasArgument('command')
        ) {
            $input = array_merge(['command' => $this->command->getName()], $input);
        }

        $this->input = new ArrayInput($input);
        // Use an in-memory input stream even if no inputs are set so that QuestionHelper::ask() does not rely on the blocking STDIN.
        $this->input->setStream(self::createStream($this->inputs));

        if (isset($options['interactive'])) {
            $this->input->setInteractive($options['interactive']);
        }

        if (!isset($options['decorated'])) {
            $options['decorated'] = false;
        }

        $this->initOutput($options);

        return $this->statusCode = $this->command->run($this->input, $this->output);
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Tester\Constraint;

use PHPUnit\Framework\Constraint\Constraint;
use Symfony\Component\Console\Command\Command;

final class CommandIsSuccessful extends Constraint
{
    /**
     * {@inheritdoc}
     */
    public function toString(): string
    {
        return 'is successful';
    }

    /**
     * {@inheritdoc}
     */
    protected function matches($other): bool
    {
        return Command::SUCCESS === $other;
    }

    /**
     * {@inheritdoc}
     */
    protected function failureDescription($other): string
    {
        return 'the command '.$this->toString();
    }

    /**
     * {@inheritdoc}
     */
    protected function additionalFailureDescription($other): string
    {
        $mapping = [
            Command::FAILURE => 'Command failed.',
            Command::INVALID => 'Command was invalid.',
        ];

        return $mapping[$other] ?? sprintf('Command returned exit status %d.', $other);
    }
}
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Tester;

use PHPUnit\Framework\Assert;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\ConsoleOutput;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Output\StreamOutput;
use Symfony\Component\Console\Tester\Constraint\CommandIsSuccessful;

/**
 * @author Amrouche Hamza <hamza.simperfit@gmail.com>
 */
trait TesterTrait
{
    /** @var StreamOutput */
    private $output;
    private $inputs = [];
    private $captureStreamsIndependently = false;
    /** @var InputInterface */
    private $input;
    /** @var int */
    private $statusCode;

    /**
     * Gets the display returned by the last execution of the command or application.
     *
     * @return string
     *
     * @throws \RuntimeException If it's called before the execute method
     */
    public function getDisplay(bool $normalize = false)
    {
        if (null === $this->output) {
            throw new \RuntimeException('Output not initialized, did you execute the command before requesting the display?');
        }

        rewind($this->output->getStream());

        $display = stream_get_contents($this->output->getStream());

        if ($normalize) {
            $display = str_replace(\PHP_EOL, "\n", $display);
        }

        return $display;
    }

    /**
     * Gets the output written to STDERR by the application.
     *
     * @param bool $normalize Whether to normalize end of lines to \n or not
     *
     * @return string
     */
    public function getErrorOutput(bool $normalize = false)
    {
        if (!$this->captureStreamsIndependently) {
            throw new \LogicException('The error output is not available when the tester is run without "capture_stderr_separately" option set.');
        }

        rewind($this->output->getErrorOutput()->getStream());

        $display = stream_get_contents($this->output->getErrorOutput()->getStream());

        if ($normalize) {
            $display = str_replace(\PHP_EOL, "\n", $display);
        }

        return $display;
    }

    /**
     * Gets the input instance used by the last execution of the command or application.
     *
     * @return InputInterface
     */
    public function getInput()
    {
        return $this->input;
    }

    /**
     * Gets the output instance used by the last execution of the command or application.
     *
     * @return OutputInterface
     */
    public function getOutput()
    {
        return $this->output;
    }

    /**
     * Gets the status code returned by the last execution of the command or application.
     *
     * @return int
     *
     * @throws \RuntimeException If it's called before the execute method
     */
    public function getStatusCode()
    {
        if (null === $this->statusCode) {
            throw new \RuntimeException('Status code not initialized, did you execute the command before requesting the status code?');
        }

        return $this->statusCode;
    }

    public function assertCommandIsSuccessful(string $message = ''): void
    {
        Assert::assertThat($this->statusCode, new CommandIsSuccessful(), $message);
    }

    /**
     * Sets the user inputs.
     *
     * @param array $inputs An array of strings representing each input
     *                      passed to the command input stream
     *
     * @return $this
     */
    public function setInputs(array $inputs)
    {
        $this->inputs = $inputs;

        return $this;
    }

    /**
     * Initializes the output property.
     *
     * Available options:
     *
     *  * decorated:                 Sets the output decorated flag
     *  * verbosity:                 Sets the output verbosity flag
     *  * capture_stderr_separately: Make output of stdOut and stdErr separately available
     */
    private function initOutput(array $options)
    {
        $this->captureStreamsIndependently = \array_key_exists('capture_stderr_separately', $options) && $options['capture_stderr_separately'];
        if (!$this->captureStreamsIndependently) {
            $this->output = new StreamOutput(fopen('php://memory', 'w', false));
            if (isset($options['decorated'])) {
                $this->output->setDecorated($options['decorated']);
            }
            if (isset($options['verbosity'])) {
                $this->output->setVerbosity($options['verbosity']);
            }
        } else {
            $this->output = new ConsoleOutput(
                $options['verbosity'] ?? ConsoleOutput::VERBOSITY_NORMAL,
                $options['decorated'] ?? null
            );

            $errorOutput = new StreamOutput(fopen('php://memory', 'w', false));
            $errorOutput->setFormatter($this->output->getFormatter());
            $errorOutput->setVerbosity($this->output->getVerbosity());
            $errorOutput->setDecorated($this->output->isDecorated());

            $reflectedOutput = new \ReflectionObject($this->output);
            $strErrProperty = $reflectedOutput->getProperty('stderr');
            $strErrProperty->setAccessible(true);
            $strErrProperty->setValue($this->output, $errorOutput);

            $reflectedParent = $reflectedOutput->getParentClass();
            $streamProperty = $reflectedParent->getProperty('stream');
            $streamProperty->setAccessible(true);
            $streamProperty->setValue($this->output, fopen('php://memory', 'w', false));
        }
    }

    /**
     * @return resource
     */
    private static function createStream(array $inputs)
    {
        $stream = fopen('php://memory', 'r+', false);

        foreach ($inputs as $input) {
            fwrite($stream, $input.\PHP_EOL);
        }

        rewind($stream);

        return $stream;
    }
}
{
    "name": "symfony/console",
    "type": "library",
    "description": "Eases the creation of beautiful and testable command line interfaces",
    "keywords": ["console", "cli", "command-line", "terminal"],
    "homepage": "https://symfony.com",
    "license": "MIT",
    "authors": [
        {
            "name": "Fabien Potencier",
            "email": "fabien@symfony.com"
        },
        {
            "name": "Symfony Community",
            "homepage": "https://symfony.com/contributors"
        }
    ],
    "require": {
        "php": ">=7.2.5",
        "symfony/deprecation-contracts": "^2.1|^3",
        "symfony/polyfill-mbstring": "~1.0",
        "symfony/polyfill-php73": "^1.9",
        "symfony/polyfill-php80": "^1.16",
        "symfony/service-contracts": "^1.1|^2|^3",
        "symfony/string": "^5.1|^6.0"
    },
    "require-dev": {
        "symfony/config": "^4.4|^5.0|^6.0",
        "symfony/event-dispatcher": "^4.4|^5.0|^6.0",
        "symfony/dependency-injection": "^4.4|^5.0|^6.0",
        "symfony/lock": "^4.4|^5.0|^6.0",
        "symfony/process": "^4.4|^5.0|^6.0",
        "symfony/var-dumper": "^4.4|^5.0|^6.0",
        "psr/log": "^1|^2"
    },
    "provide": {
        "psr/log-implementation": "1.0|2.0"
    },
    "suggest": {
        "symfony/event-dispatcher": "",
        "symfony/lock": "",
        "symfony/process": "",
        "psr/log": "For using the console logger"
    },
    "conflict": {
        "psr/log": ">=3",
        "symfony/dependency-injection": "<4.4",
        "symfony/dotenv": "<5.1",
        "symfony/event-dispatcher": "<4.4",
        "symfony/lock": "<4.4",
        "symfony/process": "<4.4"
    },
    "autoload": {
        "psr-4": { "Symfony\\Component\\Console\\": "" },
        "exclude-from-classmap": [
            "/Tests/"
        ]
    },
    "minimum-stability": "dev"
}
{
    "packages": [
        {
            "name": "nikic/php-parser",
            "version": "v4.17.1",
            "version_normalized": "4.17.1.0",
            "source": {
                "type": "git",
                "url": "https://github.com/nikic/PHP-Parser.git",
                "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d"
            },
            "dist": {
                "type": "zip",
                "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d",
                "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d",
                "shasum": ""
            },
            "require": {
                "ext-tokenizer": "*",
                "php": ">=7.0"
            },
            "require-dev": {
                "ircmaxell/php-yacc": "^0.0.7",
                "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0"
            },
            "time": "2023-08-13T19:53:39+00:00",
            "bin": [
                "bin/php-parse"
            ],
            "type": "library",
            "extra": {
                "branch-alias": {
                    "dev-master": "4.9-dev"
                }
            },
            "installation-source": "dist",
            "autoload": {
                "psr-4": {
                    "PhpParser\\": "lib/PhpParser"
                }
            },
            "notification-url": "https://packagist.org/downloads/",
            "license": [
                "BSD-3-Clause"
            ],
            "authors": [
                {
                    "name": "Nikita Popov"
                }
            ],
            "description": "A PHP parser written in PHP",
            "keywords": [
                "parser",
                "php"
            ],
            "support": {
                "issues": "https://github.com/nikic/PHP-Parser/issues",
                "source": "https://github.com/nikic/PHP-Parser/tree/v4.17.1"
            },
            "install-path": "../nikic/php-parser"
        },
        {
            "name": "psr/container",
            "version": "1.1.1",
            "version_normalized": "1.1.1.0",
            "source": {
                "type": "git",
                "url": "https://github.com/php-fig/container.git",
                "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf"
            },
            "dist": {
                "type": "zip",
                "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf",
                "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf",
                "shasum": ""
            },
            "require": {
                "php": ">=7.2.0"
            },
            "time": "2021-03-05T17:36:06+00:00",
            "type": "library",
            "installation-source": "dist",
            "autoload": {
                "psr-4": {
                    "Psr\\Container\\": "src/"
                }
            },
            "notification-url": "https://packagist.org/downloads/",
            "license": [
                "MIT"
            ],
            "authors": [
                {
                    "name": "PHP-FIG",
                    "homepage": "https://www.php-fig.org/"
                }
            ],
            "description": "Common Container Interface (PHP FIG PSR-11)",
            "homepage": "https://github.com/php-fig/container",
            "keywords": [
                "PSR-11",
                "container",
                "container-interface",
                "container-interop",
                "psr"
            ],
            "support": {
                "issues": "https://github.com/php-fig/container/issues",
                "source": "https://github.com/php-fig/container/tree/1.1.1"
            },
            "install-path": "../psr/container"
        },
        {
            "name": "symfony/console",
            "version": "v5.4.31",
            "version_normalized": "5.4.31.0",
            "source": {
                "type": "git",
                "url": "https://github.com/symfony/console.git",
                "reference": "11ac5f154e0e5c4c77af83ad11ead9165280b92a"
            },
            "dist": {
                "type": "zip",
                "url": "https://api.github.com/repos/symfony/console/zipball/11ac5f154e0e5c4c77af83ad11ead9165280b92a",
                "reference": "11ac5f154e0e5c4c77af83ad11ead9165280b92a",
                "shasum": ""
            },
            "require": {
                "php": ">=7.2.5",
                "symfony/deprecation-contracts": "^2.1|^3",
                "symfony/polyfill-mbstring": "~1.0",
                "symfony/polyfill-php73": "^1.9",
                "symfony/polyfill-php80": "^1.16",
                "symfony/service-contracts": "^1.1|^2|^3",
                "symfony/string": "^5.1|^6.0"
            },
            "conflict": {
                "psr/log": ">=3",
                "symfony/dependency-injection": "<4.4",
                "symfony/dotenv": "<5.1",
                "symfony/event-dispatcher": "<4.4",
                "symfony/lock": "<4.4",
                "symfony/process": "<4.4"
            },
            "provide": {
                "psr/log-implementation": "1.0|2.0"
            },
            "require-dev": {
                "psr/log": "^1|^2",
                "symfony/config": "^4.4|^5.0|^6.0",
                "symfony/dependency-injection": "^4.4|^5.0|^6.0",
                "symfony/event-dispatcher": "^4.4|^5.0|^6.0",
                "symfony/lock": "^4.4|^5.0|^6.0",
                "symfony/process": "^4.4|^5.0|^6.0",
                "symfony/var-dumper": "^4.4|^5.0|^6.0"
            },
            "suggest": {
                "psr/log": "For using the console logger",
                "symfony/event-dispatcher": "",
                "symfony/lock": "",
                "symfony/process": ""
            },
            "time": "2023-10-31T07:58:33+00:00",
            "type": "library",
            "installation-source": "dist",
            "autoload": {
                "psr-4": {
                    "Symfony\\Component\\Console\\": ""
                },
                "exclude-from-classmap": [
                    "/Tests/"
                ]
            },
            "notification-url": "https://packagist.org/downloads/",
            "license": [
                "MIT"
            ],
            "authors": [
                {
                    "name": "Fabien Potencier",
                    "email": "fabien@symfony.com"
                },
                {
                    "name": "Symfony Community",
                    "homepage": "https://symfony.com/contributors"
                }
            ],
            "description": "Eases the creation of beautiful and testable command line interfaces",
            "homepage": "https://symfony.com",
            "keywords": [
                "cli",
                "command-line",
                "console",
                "terminal"
            ],
            "support": {
                "source": "https://github.com/symfony/console/tree/v5.4.31"
            },
            "funding": [
                {
                    "url": "https://symfony.com/sponsor",
                    "type": "custom"
                },
                {
                    "url": "https://github.com/fabpot",
                    "type": "github"
                },
                {
                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
                    "type": "tidelift"
                }
            ],
            "install-path": "../symfony/console"
        },
        {
            "name": "symfony/deprecation-contracts",
            "version": "v2.5.2",
            "version_normalized": "2.5.2.0",
            "source": {
                "type": "git",
                "url": "https://github.com/symfony/deprecation-contracts.git",
                "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66"
            },
            "dist": {
                "type": "zip",
                "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66",
                "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66",
                "shasum": ""
            },
            "require": {
                "php": ">=7.1"
            },
            "time": "2022-01-02T09:53:40+00:00",
            "type": "library",
            "extra": {
                "branch-alias": {
                    "dev-main": "2.5-dev"
                },
                "thanks": {
                    "name": "symfony/contracts",
                    "url": "https://github.com/symfony/contracts"
                }
            },
            "installation-source": "dist",
            "autoload": {
                "files": [
                    "function.php"
                ]
            },
            "notification-url": "https://packagist.org/downloads/",
            "license": [
                "MIT"
            ],
            "authors": [
                {
                    "name": "Nicolas Grekas",
                    "email": "p@tchwork.com"
                },
                {
                    "name": "Symfony Community",
                    "homepage": "https://symfony.com/contributors"
                }
            ],
            "description": "A generic function and convention to trigger deprecation notices",
            "homepage": "https://symfony.com",
            "support": {
                "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.2"
            },
            "funding": [
                {
                    "url": "https://symfony.com/sponsor",
                    "type": "custom"
                },
                {
                    "url": "https://github.com/fabpot",
                    "type": "github"
                },
                {
                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
                    "type": "tidelift"
                }
            ],
            "install-path": "../symfony/deprecation-contracts"
        },
        {
            "name": "symfony/polyfill-ctype",
            "version": "v1.28.0",
            "version_normalized": "1.28.0.0",
            "source": {
                "type": "git",
                "url": "https://github.com/symfony/polyfill-ctype.git",
                "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb"
            },
            "dist": {
                "type": "zip",
                "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb",
                "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb",
                "shasum": ""
            },
            "require": {
                "php": ">=7.1"
            },
            "provide": {
                "ext-ctype": "*"
            },
            "suggest": {
                "ext-ctype": "For best performance"
            },
            "time": "2023-01-26T09:26:14+00:00",
            "type": "library",
            "extra": {
                "branch-alias": {
                    "dev-main": "1.28-dev"
                },
                "thanks": {
                    "name": "symfony/polyfill",
                    "url": "https://github.com/symfony/polyfill"
                }
            },
            "installation-source": "dist",
            "autoload": {
                "files": [
                    "bootstrap.php"
                ],
                "psr-4": {
                    "Symfony\\Polyfill\\Ctype\\": ""
                }
            },
            "notification-url": "https://packagist.org/downloads/",
            "license": [
                "MIT"
            ],
            "authors": [
                {
                    "name": "Gert de Pagter",
                    "email": "BackEndTea@gmail.com"
                },
                {
                    "name": "Symfony Community",
                    "homepage": "https://symfony.com/contributors"
                }
            ],
            "description": "Symfony polyfill for ctype functions",
            "homepage": "https://symfony.com",
            "keywords": [
                "compatibility",
                "ctype",
                "polyfill",
                "portable"
            ],
            "support": {
                "source": "https://github.com/symfony/polyfill-ctype/tree/v1.28.0"
            },
            "funding": [
                {
                    "url": "https://symfony.com/sponsor",
                    "type": "custom"
                },
                {
                    "url": "https://github.com/fabpot",
                    "type": "github"
                },
                {
                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
                    "type": "tidelift"
                }
            ],
            "install-path": "../symfony/polyfill-ctype"
        },
        {
            "name": "symfony/polyfill-intl-grapheme",
            "version": "v1.28.0",
            "version_normalized": "1.28.0.0",
            "source": {
                "type": "git",
                "url": "https://github.com/symfony/polyfill-intl-grapheme.git",
                "reference": "875e90aeea2777b6f135677f618529449334a612"
            },
            "dist": {
                "type": "zip",
                "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/875e90aeea2777b6f135677f618529449334a612",
                "reference": "875e90aeea2777b6f135677f618529449334a612",
                "shasum": ""
            },
            "require": {
                "php": ">=7.1"
            },
            "suggest": {
                "ext-intl": "For best performance"
            },
            "time": "2023-01-26T09:26:14+00:00",
            "type": "library",
            "extra": {
                "branch-alias": {
                    "dev-main": "1.28-dev"
                },
                "thanks": {
                    "name": "symfony/polyfill",
                    "url": "https://github.com/symfony/polyfill"
                }
            },
            "installation-source": "dist",
            "autoload": {
                "files": [
                    "bootstrap.php"
                ],
                "psr-4": {
                    "Symfony\\Polyfill\\Intl\\Grapheme\\": ""
                }
            },
            "notification-url": "https://packagist.org/downloads/",
            "license": [
                "MIT"
            ],
            "authors": [
                {
                    "name": "Nicolas Grekas",
                    "email": "p@tchwork.com"
                },
                {
                    "name": "Symfony Community",
                    "homepage": "https://symfony.com/contributors"
                }
            ],
            "description": "Symfony polyfill for intl's grapheme_* functions",
            "homepage": "https://symfony.com",
            "keywords": [
                "compatibility",
                "grapheme",
                "intl",
                "polyfill",
                "portable",
                "shim"
            ],
            "support": {
                "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.28.0"
            },
            "funding": [
                {
                    "url": "https://symfony.com/sponsor",
                    "type": "custom"
                },
                {
                    "url": "https://github.com/fabpot",
                    "type": "github"
                },
                {
                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
                    "type": "tidelift"
                }
            ],
            "install-path": "../symfony/polyfill-intl-grapheme"
        },
        {
            "name": "symfony/polyfill-intl-normalizer",
            "version": "v1.28.0",
            "version_normalized": "1.28.0.0",
            "source": {
                "type": "git",
                "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
                "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92"
            },
            "dist": {
                "type": "zip",
                "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92",
                "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92",
                "shasum": ""
            },
            "require": {
                "php": ">=7.1"
            },
            "suggest": {
                "ext-intl": "For best performance"
            },
            "time": "2023-01-26T09:26:14+00:00",
            "type": "library",
            "extra": {
                "branch-alias": {
                    "dev-main": "1.28-dev"
                },
                "thanks": {
                    "name": "symfony/polyfill",
                    "url": "https://github.com/symfony/polyfill"
                }
            },
            "installation-source": "dist",
            "autoload": {
                "files": [
                    "bootstrap.php"
                ],
                "psr-4": {
                    "Symfony\\Polyfill\\Intl\\Normalizer\\": ""
                },
                "classmap": [
                    "Resources/stubs"
                ]
            },
            "notification-url": "https://packagist.org/downloads/",
            "license": [
                "MIT"
            ],
            "authors": [
                {
                    "name": "Nicolas Grekas",
                    "email": "p@tchwork.com"
                },
                {
                    "name": "Symfony Community",
                    "homepage": "https://symfony.com/contributors"
                }
            ],
            "description": "Symfony polyfill for intl's Normalizer class and related functions",
            "homepage": "https://symfony.com",
            "keywords": [
                "compatibility",
                "intl",
                "normalizer",
                "polyfill",
                "portable",
                "shim"
            ],
            "support": {
                "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.28.0"
            },
            "funding": [
                {
                    "url": "https://symfony.com/sponsor",
                    "type": "custom"
                },
                {
                    "url": "https://github.com/fabpot",
                    "type": "github"
                },
                {
                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
                    "type": "tidelift"
                }
            ],
            "install-path": "../symfony/polyfill-intl-normalizer"
        },
        {
            "name": "symfony/polyfill-mbstring",
            "version": "v1.28.0",
            "version_normalized": "1.28.0.0",
            "source": {
                "type": "git",
                "url": "https://github.com/symfony/polyfill-mbstring.git",
                "reference": "42292d99c55abe617799667f454222c54c60e229"
            },
            "dist": {
                "type": "zip",
                "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229",
                "reference": "42292d99c55abe617799667f454222c54c60e229",
                "shasum": ""
            },
            "require": {
                "php": ">=7.1"
            },
            "provide": {
                "ext-mbstring": "*"
            },
            "suggest": {
                "ext-mbstring": "For best performance"
            },
            "time": "2023-07-28T09:04:16+00:00",
            "type": "library",
            "extra": {
                "branch-alias": {
                    "dev-main": "1.28-dev"
                },
                "thanks": {
                    "name": "symfony/polyfill",
                    "url": "https://github.com/symfony/polyfill"
                }
            },
            "installation-source": "dist",
            "autoload": {
                "files": [
                    "bootstrap.php"
                ],
                "psr-4": {
                    "Symfony\\Polyfill\\Mbstring\\": ""
                }
            },
            "notification-url": "https://packagist.org/downloads/",
            "license": [
                "MIT"
            ],
            "authors": [
                {
                    "name": "Nicolas Grekas",
                    "email": "p@tchwork.com"
                },
                {
                    "name": "Symfony Community",
                    "homepage": "https://symfony.com/contributors"
                }
            ],
            "description": "Symfony polyfill for the Mbstring extension",
            "homepage": "https://symfony.com",
            "keywords": [
                "compatibility",
                "mbstring",
                "polyfill",
                "portable",
                "shim"
            ],
            "support": {
                "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.28.0"
            },
            "funding": [
                {
                    "url": "https://symfony.com/sponsor",
                    "type": "custom"
                },
                {
                    "url": "https://github.com/fabpot",
                    "type": "github"
                },
                {
                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
                    "type": "tidelift"
                }
            ],
            "install-path": "../symfony/polyfill-mbstring"
        },
        {
            "name": "symfony/polyfill-php73",
            "version": "v1.28.0",
            "version_normalized": "1.28.0.0",
            "source": {
                "type": "git",
                "url": "https://github.com/symfony/polyfill-php73.git",
                "reference": "fe2f306d1d9d346a7fee353d0d5012e401e984b5"
            },
            "dist": {
                "type": "zip",
                "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fe2f306d1d9d346a7fee353d0d5012e401e984b5",
                "reference": "fe2f306d1d9d346a7fee353d0d5012e401e984b5",
                "shasum": ""
            },
            "require": {
                "php": ">=7.1"
            },
            "time": "2023-01-26T09:26:14+00:00",
            "type": "library",
            "extra": {
                "branch-alias": {
                    "dev-main": "1.28-dev"
                },
                "thanks": {
                    "name": "symfony/polyfill",
                    "url": "https://github.com/symfony/polyfill"
                }
            },
            "installation-source": "dist",
            "autoload": {
                "files": [
                    "bootstrap.php"
                ],
                "psr-4": {
                    "Symfony\\Polyfill\\Php73\\": ""
                },
                "classmap": [
                    "Resources/stubs"
                ]
            },
            "notification-url": "https://packagist.org/downloads/",
            "license": [
                "MIT"
            ],
            "authors": [
                {
                    "name": "Nicolas Grekas",
                    "email": "p@tchwork.com"
                },
                {
                    "name": "Symfony Community",
                    "homepage": "https://symfony.com/contributors"
                }
            ],
            "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions",
            "homepage": "https://symfony.com",
            "keywords": [
                "compatibility",
                "polyfill",
                "portable",
                "shim"
            ],
            "support": {
                "source": "https://github.com/symfony/polyfill-php73/tree/v1.28.0"
            },
            "funding": [
                {
                    "url": "https://symfony.com/sponsor",
                    "type": "custom"
                },
                {
                    "url": "https://github.com/fabpot",
                    "type": "github"
                },
                {
                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
                    "type": "tidelift"
                }
            ],
            "install-path": "../symfony/polyfill-php73"
        },
        {
            "name": "symfony/polyfill-php80",
            "version": "v1.28.0",
            "version_normalized": "1.28.0.0",
            "source": {
                "type": "git",
                "url": "https://github.com/symfony/polyfill-php80.git",
                "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5"
            },
            "dist": {
                "type": "zip",
                "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/6caa57379c4aec19c0a12a38b59b26487dcfe4b5",
                "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5",
                "shasum": ""
            },
            "require": {
                "php": ">=7.1"
            },
            "time": "2023-01-26T09:26:14+00:00",
            "type": "library",
            "extra": {
                "branch-alias": {
                    "dev-main": "1.28-dev"
                },
                "thanks": {
                    "name": "symfony/polyfill",
                    "url": "https://github.com/symfony/polyfill"
                }
            },
            "installation-source": "dist",
            "autoload": {
                "files": [
                    "bootstrap.php"
                ],
                "psr-4": {
                    "Symfony\\Polyfill\\Php80\\": ""
                },
                "classmap": [
                    "Resources/stubs"
                ]
            },
            "notification-url": "https://packagist.org/downloads/",
            "license": [
                "MIT"
            ],
            "authors": [
                {
                    "name": "Ion Bazan",
                    "email": "ion.bazan@gmail.com"
                },
                {
                    "name": "Nicolas Grekas",
                    "email": "p@tchwork.com"
                },
                {
                    "name": "Symfony Community",
                    "homepage": "https://symfony.com/contributors"
                }
            ],
            "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions",
            "homepage": "https://symfony.com",
            "keywords": [
                "compatibility",
                "polyfill",
                "portable",
                "shim"
            ],
            "support": {
                "source": "https://github.com/symfony/polyfill-php80/tree/v1.28.0"
            },
            "funding": [
                {
                    "url": "https://symfony.com/sponsor",
                    "type": "custom"
                },
                {
                    "url": "https://github.com/fabpot",
                    "type": "github"
                },
                {
                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
                    "type": "tidelift"
                }
            ],
            "install-path": "../symfony/polyfill-php80"
        },
        {
            "name": "symfony/service-contracts",
            "version": "v2.5.2",
            "version_normalized": "2.5.2.0",
            "source": {
                "type": "git",
                "url": "https://github.com/symfony/service-contracts.git",
                "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c"
            },
            "dist": {
                "type": "zip",
                "url": "https://api.github.com/repos/symfony/service-contracts/zipball/4b426aac47d6427cc1a1d0f7e2ac724627f5966c",
                "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c",
                "shasum": ""
            },
            "require": {
                "php": ">=7.2.5",
                "psr/container": "^1.1",
                "symfony/deprecation-contracts": "^2.1|^3"
            },
            "conflict": {
                "ext-psr": "<1.1|>=2"
            },
            "suggest": {
                "symfony/service-implementation": ""
            },
            "time": "2022-05-30T19:17:29+00:00",
            "type": "library",
            "extra": {
                "branch-alias": {
                    "dev-main": "2.5-dev"
                },
                "thanks": {
                    "name": "symfony/contracts",
                    "url": "https://github.com/symfony/contracts"
                }
            },
            "installation-source": "dist",
            "autoload": {
                "psr-4": {
                    "Symfony\\Contracts\\Service\\": ""
                }
            },
            "notification-url": "https://packagist.org/downloads/",
            "license": [
                "MIT"
            ],
            "authors": [
                {
                    "name": "Nicolas Grekas",
                    "email": "p@tchwork.com"
                },
                {
                    "name": "Symfony Community",
                    "homepage": "https://symfony.com/contributors"
                }
            ],
            "description": "Generic abstractions related to writing services",
            "homepage": "https://symfony.com",
            "keywords": [
                "abstractions",
                "contracts",
                "decoupling",
                "interfaces",
                "interoperability",
                "standards"
            ],
            "support": {
                "source": "https://github.com/symfony/service-contracts/tree/v2.5.2"
            },
            "funding": [
                {
                    "url": "https://symfony.com/sponsor",
                    "type": "custom"
                },
                {
                    "url": "https://github.com/fabpot",
                    "type": "github"
                },
                {
                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
                    "type": "tidelift"
                }
            ],
            "install-path": "../symfony/service-contracts"
        },
        {
            "name": "symfony/string",
            "version": "v5.4.31",
            "version_normalized": "5.4.31.0",
            "source": {
                "type": "git",
                "url": "https://github.com/symfony/string.git",
                "reference": "2765096c03f39ddf54f6af532166e42aaa05b24b"
            },
            "dist": {
                "type": "zip",
                "url": "https://api.github.com/repos/symfony/string/zipball/2765096c03f39ddf54f6af532166e42aaa05b24b",
                "reference": "2765096c03f39ddf54f6af532166e42aaa05b24b",
                "shasum": ""
            },
            "require": {
                "php": ">=7.2.5",
                "symfony/polyfill-ctype": "~1.8",
                "symfony/polyfill-intl-grapheme": "~1.0",
                "symfony/polyfill-intl-normalizer": "~1.0",
                "symfony/polyfill-mbstring": "~1.0",
                "symfony/polyfill-php80": "~1.15"
            },
            "conflict": {
                "symfony/translation-contracts": ">=3.0"
            },
            "require-dev": {
                "symfony/error-handler": "^4.4|^5.0|^6.0",
                "symfony/http-client": "^4.4|^5.0|^6.0",
                "symfony/translation-contracts": "^1.1|^2",
                "symfony/var-exporter": "^4.4|^5.0|^6.0"
            },
            "time": "2023-11-09T08:19:44+00:00",
            "type": "library",
            "installation-source": "dist",
            "autoload": {
                "files": [
                    "Resources/functions.php"
                ],
                "psr-4": {
                    "Symfony\\Component\\String\\": ""
                },
                "exclude-from-classmap": [
                    "/Tests/"
                ]
            },
            "notification-url": "https://packagist.org/downloads/",
            "license": [
                "MIT"
            ],
            "authors": [
                {
                    "name": "Nicolas Grekas",
                    "email": "p@tchwork.com"
                },
                {
                    "name": "Symfony Community",
                    "homepage": "https://symfony.com/contributors"
                }
            ],
            "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way",
            "homepage": "https://symfony.com",
            "keywords": [
                "grapheme",
                "i18n",
                "string",
                "unicode",
                "utf-8",
                "utf8"
            ],
            "support": {
                "source": "https://github.com/symfony/string/tree/v5.4.31"
            },
            "funding": [
                {
                    "url": "https://symfony.com/sponsor",
                    "type": "custom"
                },
                {
                    "url": "https://github.com/fabpot",
                    "type": "github"
                },
                {
                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
                    "type": "tidelift"
                }
            ],
            "install-path": "../symfony/string"
        },
        {
            "name": "symfony/yaml",
            "version": "v4.4.45",
            "version_normalized": "4.4.45.0",
            "source": {
                "type": "git",
                "url": "https://github.com/symfony/yaml.git",
                "reference": "aeccc4dc52a9e634f1d1eebeb21eacfdcff1053d"
            },
            "dist": {
                "type": "zip",
                "url": "https://api.github.com/repos/symfony/yaml/zipball/aeccc4dc52a9e634f1d1eebeb21eacfdcff1053d",
                "reference": "aeccc4dc52a9e634f1d1eebeb21eacfdcff1053d",
                "shasum": ""
            },
            "require": {
                "php": ">=7.1.3",
                "symfony/polyfill-ctype": "~1.8"
            },
            "conflict": {
                "symfony/console": "<3.4"
            },
            "require-dev": {
                "symfony/console": "^3.4|^4.0|^5.0"
            },
            "suggest": {
                "symfony/console": "For validating YAML files using the lint command"
            },
            "time": "2022-08-02T15:47:23+00:00",
            "type": "library",
            "installation-source": "dist",
            "autoload": {
                "psr-4": {
                    "Symfony\\Component\\Yaml\\": ""
                },
                "exclude-from-classmap": [
                    "/Tests/"
                ]
            },
            "notification-url": "https://packagist.org/downloads/",
            "license": [
                "MIT"
            ],
            "authors": [
                {
                    "name": "Fabien Potencier",
                    "email": "fabien@symfony.com"
                },
                {
                    "name": "Symfony Community",
                    "homepage": "https://symfony.com/contributors"
                }
            ],
            "description": "Loads and dumps YAML files",
            "homepage": "https://symfony.com",
            "support": {
                "source": "https://github.com/symfony/yaml/tree/v4.4.45"
            },
            "funding": [
                {
                    "url": "https://symfony.com/sponsor",
                    "type": "custom"
                },
                {
                    "url": "https://github.com/fabpot",
                    "type": "github"
                },
                {
                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
                    "type": "tidelift"
                }
            ],
            "install-path": "../symfony/yaml"
        }
    ],
    "dev": true,
    "dev-package-names": []
}
<?php return array(
    'root' => array(
        'name' => 'joomlatools/console',
        'pretty_version' => 'dev-master',
        'version' => 'dev-master',
        'reference' => '5d3c5bd7bb846b1153dc73842af6b249d99b5282',
        'type' => 'project',
        'install_path' => __DIR__ . '/../../',
        'aliases' => array(),
        'dev' => true,
    ),
    'versions' => array(
        'joomlatools/console' => array(
            'pretty_version' => 'dev-master',
            'version' => 'dev-master',
            'reference' => '5d3c5bd7bb846b1153dc73842af6b249d99b5282',
            'type' => 'project',
            'install_path' => __DIR__ . '/../../',
            'aliases' => array(),
            'dev_requirement' => false,
        ),
        'nikic/php-parser' => array(
            'pretty_version' => 'v4.17.1',
            'version' => '4.17.1.0',
            'reference' => 'a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d',
            'type' => 'library',
            'install_path' => __DIR__ . '/../nikic/php-parser',
            'aliases' => array(),
            'dev_requirement' => false,
        ),
        'psr/container' => array(
            'pretty_version' => '1.1.1',
            'version' => '1.1.1.0',
            'reference' => '8622567409010282b7aeebe4bb841fe98b58dcaf',
            'type' => 'library',
            'install_path' => __DIR__ . '/../psr/container',
            'aliases' => array(),
            'dev_requirement' => false,
        ),
        'psr/log-implementation' => array(
            'dev_requirement' => false,
            'provided' => array(
                0 => '1.0|2.0',
            ),
        ),
        'symfony/console' => array(
            'pretty_version' => 'v5.4.31',
            'version' => '5.4.31.0',
            'reference' => '11ac5f154e0e5c4c77af83ad11ead9165280b92a',
            'type' => 'library',
            'install_path' => __DIR__ . '/../symfony/console',
            'aliases' => array(),
            'dev_requirement' => false,
        ),
        'symfony/deprecation-contracts' => array(
            'pretty_version' => 'v2.5.2',
            'version' => '2.5.2.0',
            'reference' => 'e8b495ea28c1d97b5e0c121748d6f9b53d075c66',
            'type' => 'library',
            'install_path' => __DIR__ . '/../symfony/deprecation-contracts',
            'aliases' => array(),
            'dev_requirement' => false,
        ),
        'symfony/polyfill-ctype' => array(
            'pretty_version' => 'v1.28.0',
            'version' => '1.28.0.0',
            'reference' => 'ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb',
            'type' => 'library',
            'install_path' => __DIR__ . '/../symfony/polyfill-ctype',
            'aliases' => array(),
            'dev_requirement' => false,
        ),
        'symfony/polyfill-intl-grapheme' => array(
            'pretty_version' => 'v1.28.0',
            'version' => '1.28.0.0',
            'reference' => '875e90aeea2777b6f135677f618529449334a612',
            'type' => 'library',
            'install_path' => __DIR__ . '/../symfony/polyfill-intl-grapheme',
            'aliases' => array(),
            'dev_requirement' => false,
        ),
        'symfony/polyfill-intl-normalizer' => array(
            'pretty_version' => 'v1.28.0',
            'version' => '1.28.0.0',
            'reference' => '8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92',
            'type' => 'library',
            'install_path' => __DIR__ . '/../symfony/polyfill-intl-normalizer',
            'aliases' => array(),
            'dev_requirement' => false,
        ),
        'symfony/polyfill-mbstring' => array(
            'pretty_version' => 'v1.28.0',
            'version' => '1.28.0.0',
            'reference' => '42292d99c55abe617799667f454222c54c60e229',
            'type' => 'library',
            'install_path' => __DIR__ . '/../symfony/polyfill-mbstring',
            'aliases' => array(),
            'dev_requirement' => false,
        ),
        'symfony/polyfill-php73' => array(
            'pretty_version' => 'v1.28.0',
            'version' => '1.28.0.0',
            'reference' => 'fe2f306d1d9d346a7fee353d0d5012e401e984b5',
            'type' => 'library',
            'install_path' => __DIR__ . '/../symfony/polyfill-php73',
            'aliases' => array(),
            'dev_requirement' => false,
        ),
        'symfony/polyfill-php80' => array(
            'pretty_version' => 'v1.28.0',
            'version' => '1.28.0.0',
            'reference' => '6caa57379c4aec19c0a12a38b59b26487dcfe4b5',
            'type' => 'library',
            'install_path' => __DIR__ . '/../symfony/polyfill-php80',
            'aliases' => array(),
            'dev_requirement' => false,
        ),
        'symfony/service-contracts' => array(
            'pretty_version' => 'v2.5.2',
            'version' => '2.5.2.0',
            'reference' => '4b426aac47d6427cc1a1d0f7e2ac724627f5966c',
            'type' => 'library',
            'install_path' => __DIR__ . '/../symfony/service-contracts',
            'aliases' => array(),
            'dev_requirement' => false,
        ),
        'symfony/string' => array(
            'pretty_version' => 'v5.4.31',
            'version' => '5.4.31.0',
            'reference' => '2765096c03f39ddf54f6af532166e42aaa05b24b',
            'type' => 'library',
            'install_path' => __DIR__ . '/../symfony/string',
            'aliases' => array(),
            'dev_requirement' => false,
        ),
        'symfony/yaml' => array(
            'pretty_version' => 'v4.4.45',
            'version' => '4.4.45.0',
            'reference' => 'aeccc4dc52a9e634f1d1eebeb21eacfdcff1053d',
            'type' => 'library',
            'install_path' => __DIR__ . '/../symfony/yaml',
            'aliases' => array(),
            'dev_requirement' => false,
        ),
    ),
);
<?php

/*
 * This file is part of Composer.
 *
 * (c) Nils Adermann <naderman@naderman.de>
 *     Jordi Boggiano <j.boggiano@seld.be>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Composer;

use Composer\Autoload\ClassLoader;
use Composer\Semver\VersionParser;

/**
 * This class is copied in every Composer installed project and available to all
 *
 * See also https://getcomposer.org/doc/07-runtime.md#installed-versions
 *
 * To require its presence, you can require `composer-runtime-api ^2.0`
 *
 * @final
 */
class InstalledVersions
{
    /**
     * @var mixed[]|null
     * @psalm-var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}|array{}|null
     */
    private static $installed;

    /**
     * @var bool|null
     */
    private static $canGetVendors;

    /**
     * @var array[]
     * @psalm-var array<string, array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
     */
    private static $installedByVendor = array();

    /**
     * Returns a list of all package names which are present, either by being installed, replaced or provided
     *
     * @return string[]
     * @psalm-return list<string>
     */
    public static function getInstalledPackages()
    {
        $packages = array();
        foreach (self::getInstalled() as $installed) {
            $packages[] = array_keys($installed['versions']);
        }

        if (1 === \count($packages)) {
            return $packages[0];
        }

        return array_keys(array_flip(\call_user_func_array('array_merge', $packages)));
    }

    /**
     * Returns a list of all package names with a specific type e.g. 'library'
     *
     * @param  string   $type
     * @return string[]
     * @psalm-return list<string>
     */
    public static function getInstalledPackagesByType($type)
    {
        $packagesByType = array();

        foreach (self::getInstalled() as $installed) {
            foreach ($installed['versions'] as $name => $package) {
                if (isset($package['type']) && $package['type'] === $type) {
                    $packagesByType[] = $name;
                }
            }
        }

        return $packagesByType;
    }

    /**
     * Checks whether the given package is installed
     *
     * This also returns true if the package name is provided or replaced by another package
     *
     * @param  string $packageName
     * @param  bool   $includeDevRequirements
     * @return bool
     */
    public static function isInstalled($packageName, $includeDevRequirements = true)
    {
        foreach (self::getInstalled() as $installed) {
            if (isset($installed['versions'][$packageName])) {
                return $includeDevRequirements || empty($installed['versions'][$packageName]['dev_requirement']);
            }
        }

        return false;
    }

    /**
     * Checks whether the given package satisfies a version constraint
     *
     * e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call:
     *
     *   Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3')
     *
     * @param  VersionParser $parser      Install composer/semver to have access to this class and functionality
     * @param  string        $packageName
     * @param  string|null   $constraint  A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package
     * @return bool
     */
    public static function satisfies(VersionParser $parser, $packageName, $constraint)
    {
        $constraint = $parser->parseConstraints($constraint);
        $provided = $parser->parseConstraints(self::getVersionRanges($packageName));

        return $provided->matches($constraint);
    }

    /**
     * Returns a version constraint representing all the range(s) which are installed for a given package
     *
     * It is easier to use this via isInstalled() with the $constraint argument if you need to check
     * whether a given version of a package is installed, and not just whether it exists
     *
     * @param  string $packageName
     * @return string Version constraint usable with composer/semver
     */
    public static function getVersionRanges($packageName)
    {
        foreach (self::getInstalled() as $installed) {
            if (!isset($installed['versions'][$packageName])) {
                continue;
            }

            $ranges = array();
            if (isset($installed['versions'][$packageName]['pretty_version'])) {
                $ranges[] = $installed['versions'][$packageName]['pretty_version'];
            }
            if (array_key_exists('aliases', $installed['versions'][$packageName])) {
                $ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']);
            }
            if (array_key_exists('replaced', $installed['versions'][$packageName])) {
                $ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']);
            }
            if (array_key_exists('provided', $installed['versions'][$packageName])) {
                $ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']);
            }

            return implode(' || ', $ranges);
        }

        throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
    }

    /**
     * @param  string      $packageName
     * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present
     */
    public static function getVersion($packageName)
    {
        foreach (self::getInstalled() as $installed) {
            if (!isset($installed['versions'][$packageName])) {
                continue;
            }

            if (!isset($installed['versions'][$packageName]['version'])) {
                return null;
            }

            return $installed['versions'][$packageName]['version'];
        }

        throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
    }

    /**
     * @param  string      $packageName
     * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present
     */
    public static function getPrettyVersion($packageName)
    {
        foreach (self::getInstalled() as $installed) {
            if (!isset($installed['versions'][$packageName])) {
                continue;
            }

            if (!isset($installed['versions'][$packageName]['pretty_version'])) {
                return null;
            }

            return $installed['versions'][$packageName]['pretty_version'];
        }

        throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
    }

    /**
     * @param  string      $packageName
     * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference
     */
    public static function getReference($packageName)
    {
        foreach (self::getInstalled() as $installed) {
            if (!isset($installed['versions'][$packageName])) {
                continue;
            }

            if (!isset($installed['versions'][$packageName]['reference'])) {
                return null;
            }

            return $installed['versions'][$packageName]['reference'];
        }

        throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
    }

    /**
     * @param  string      $packageName
     * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path.
     */
    public static function getInstallPath($packageName)
    {
        foreach (self::getInstalled() as $installed) {
            if (!isset($installed['versions'][$packageName])) {
                continue;
            }

            return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null;
        }

        throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
    }

    /**
     * @return array
     * @psalm-return array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}
     */
    public static function getRootPackage()
    {
        $installed = self::getInstalled();

        return $installed[0]['root'];
    }

    /**
     * Returns the raw installed.php data for custom implementations
     *
     * @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect.
     * @return array[]
     * @psalm-return array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}
     */
    public static function getRawData()
    {
        @trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED);

        if (null === self::$installed) {
            // only require the installed.php file if this file is loaded from its dumped location,
            // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
            if (substr(__DIR__, -8, 1) !== 'C') {
                self::$installed = include __DIR__ . '/installed.php';
            } else {
                self::$installed = array();
            }
        }

        return self::$installed;
    }

    /**
     * Returns the raw data of all installed.php which are currently loaded for custom implementations
     *
     * @return array[]
     * @psalm-return list<array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
     */
    public static function getAllRawData()
    {
        return self::getInstalled();
    }

    /**
     * Lets you reload the static array from another file
     *
     * This is only useful for complex integrations in which a project needs to use
     * this class but then also needs to execute another project's autoloader in process,
     * and wants to ensure both projects have access to their version of installed.php.
     *
     * A typical case would be PHPUnit, where it would need to make sure it reads all
     * the data it needs from this class, then call reload() with
     * `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure
     * the project in which it runs can then also use this class safely, without
     * interference between PHPUnit's dependencies and the project's dependencies.
     *
     * @param  array[] $data A vendor/composer/installed.php data set
     * @return void
     *
     * @psalm-param array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $data
     */
    public static function reload($data)
    {
        self::$installed = $data;
        self::$installedByVendor = array();
    }

    /**
     * @return array[]
     * @psalm-return list<array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
     */
    private static function getInstalled()
    {
        if (null === self::$canGetVendors) {
            self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders');
        }

        $installed = array();

        if (self::$canGetVendors) {
            foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) {
                if (isset(self::$installedByVendor[$vendorDir])) {
                    $installed[] = self::$installedByVendor[$vendorDir];
                } elseif (is_file($vendorDir.'/composer/installed.php')) {
                    $installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php';
                    if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) {
                        self::$installed = $installed[count($installed) - 1];
                    }
                }
            }
        }

        if (null === self::$installed) {
            // only require the installed.php file if this file is loaded from its dumped location,
            // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
            if (substr(__DIR__, -8, 1) !== 'C') {
                self::$installed = require __DIR__ . '/installed.php';
            } else {
                self::$installed = array();
            }
        }
        $installed[] = self::$installed;

        return $installed;
    }
}
<?php

// autoload_namespaces.php @generated by Composer

$vendorDir = dirname(__DIR__);
$baseDir = dirname($vendorDir);

return array(
    'Joomlatools\\' => array($baseDir . '/src'),
);
<?php

// autoload_psr4.php @generated by Composer

$vendorDir = dirname(__DIR__);
$baseDir = dirname($vendorDir);

return array(
    'Symfony\\Polyfill\\Php80\\' => array($vendorDir . '/symfony/polyfill-php80'),
    'Symfony\\Polyfill\\Php73\\' => array($vendorDir . '/symfony/polyfill-php73'),
    'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'),
    'Symfony\\Polyfill\\Intl\\Normalizer\\' => array($vendorDir . '/symfony/polyfill-intl-normalizer'),
    'Symfony\\Polyfill\\Intl\\Grapheme\\' => array($vendorDir . '/symfony/polyfill-intl-grapheme'),
    'Symfony\\Polyfill\\Ctype\\' => array($vendorDir . '/symfony/polyfill-ctype'),
    'Symfony\\Contracts\\Service\\' => array($vendorDir . '/symfony/service-contracts'),
    'Symfony\\Component\\Yaml\\' => array($vendorDir . '/symfony/yaml'),
    'Symfony\\Component\\String\\' => array($vendorDir . '/symfony/string'),
    'Symfony\\Component\\Console\\' => array($vendorDir . '/symfony/console'),
    'Psr\\Container\\' => array($vendorDir . '/psr/container/src'),
    'PhpParser\\' => array($vendorDir . '/nikic/php-parser/lib/PhpParser'),
);
<?php

// autoload_classmap.php @generated by Composer

$vendorDir = dirname(__DIR__);
$baseDir = dirname($vendorDir);

return array(
    'Attribute' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Attribute.php',
    'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php',
    'JsonException' => $vendorDir . '/symfony/polyfill-php73/Resources/stubs/JsonException.php',
    'Normalizer' => $vendorDir . '/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php',
    'PhpToken' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php',
    'Stringable' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Stringable.php',
    'UnhandledMatchError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php',
    'ValueError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/ValueError.php',
);
<?php

// autoload_files.php @generated by Composer

$vendorDir = dirname(__DIR__);
$baseDir = dirname($vendorDir);

return array(
    '6e3fae29631ef280660b3cdad06f25a8' => $vendorDir . '/symfony/deprecation-contracts/function.php',
    '320cde22f66dd4f5d3fd621d3e88b98f' => $vendorDir . '/symfony/polyfill-ctype/bootstrap.php',
    '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php',
    'a4a119a56e50fbb293281d9a48007e0e' => $vendorDir . '/symfony/polyfill-php80/bootstrap.php',
    '8825ede83f2f289127722d4e842cf7e8' => $vendorDir . '/symfony/polyfill-intl-grapheme/bootstrap.php',
    'e69f7f6ee287b969198c3c9d6777bd38' => $vendorDir . '/symfony/polyfill-intl-normalizer/bootstrap.php',
    '0d59ee240a4cd96ddbb4ff164fccea4d' => $vendorDir . '/symfony/polyfill-php73/bootstrap.php',
    'b6b991a57620e2fb6b2f66f03fe9ddc2' => $vendorDir . '/symfony/string/Resources/functions.php',
);
<?php

// autoload_static.php @generated by Composer

namespace Composer\Autoload;

class ComposerStaticInita52b37ede49cae90e42da03aa86fa4c5
{
    public static $files = array (
        '6e3fae29631ef280660b3cdad06f25a8' => __DIR__ . '/..' . '/symfony/deprecation-contracts/function.php',
        '320cde22f66dd4f5d3fd621d3e88b98f' => __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php',
        '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',
        'a4a119a56e50fbb293281d9a48007e0e' => __DIR__ . '/..' . '/symfony/polyfill-php80/bootstrap.php',
        '8825ede83f2f289127722d4e842cf7e8' => __DIR__ . '/..' . '/symfony/polyfill-intl-grapheme/bootstrap.php',
        'e69f7f6ee287b969198c3c9d6777bd38' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/bootstrap.php',
        '0d59ee240a4cd96ddbb4ff164fccea4d' => __DIR__ . '/..' . '/symfony/polyfill-php73/bootstrap.php',
        'b6b991a57620e2fb6b2f66f03fe9ddc2' => __DIR__ . '/..' . '/symfony/string/Resources/functions.php',
    );

    public static $prefixLengthsPsr4 = array (
        'S' => 
        array (
            'Symfony\\Polyfill\\Php80\\' => 23,
            'Symfony\\Polyfill\\Php73\\' => 23,
            'Symfony\\Polyfill\\Mbstring\\' => 26,
            'Symfony\\Polyfill\\Intl\\Normalizer\\' => 33,
            'Symfony\\Polyfill\\Intl\\Grapheme\\' => 31,
            'Symfony\\Polyfill\\Ctype\\' => 23,
            'Symfony\\Contracts\\Service\\' => 26,
            'Symfony\\Component\\Yaml\\' => 23,
            'Symfony\\Component\\String\\' => 25,
            'Symfony\\Component\\Console\\' => 26,
        ),
        'P' => 
        array (
            'Psr\\Container\\' => 14,
            'PhpParser\\' => 10,
        ),
    );

    public static $prefixDirsPsr4 = array (
        'Symfony\\Polyfill\\Php80\\' => 
        array (
            0 => __DIR__ . '/..' . '/symfony/polyfill-php80',
        ),
        'Symfony\\Polyfill\\Php73\\' => 
        array (
            0 => __DIR__ . '/..' . '/symfony/polyfill-php73',
        ),
        'Symfony\\Polyfill\\Mbstring\\' => 
        array (
            0 => __DIR__ . '/..' . '/symfony/polyfill-mbstring',
        ),
        'Symfony\\Polyfill\\Intl\\Normalizer\\' => 
        array (
            0 => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer',
        ),
        'Symfony\\Polyfill\\Intl\\Grapheme\\' => 
        array (
            0 => __DIR__ . '/..' . '/symfony/polyfill-intl-grapheme',
        ),
        'Symfony\\Polyfill\\Ctype\\' => 
        array (
            0 => __DIR__ . '/..' . '/symfony/polyfill-ctype',
        ),
        'Symfony\\Contracts\\Service\\' => 
        array (
            0 => __DIR__ . '/..' . '/symfony/service-contracts',
        ),
        'Symfony\\Component\\Yaml\\' => 
        array (
            0 => __DIR__ . '/..' . '/symfony/yaml',
        ),
        'Symfony\\Component\\String\\' => 
        array (
            0 => __DIR__ . '/..' . '/symfony/string',
        ),
        'Symfony\\Component\\Console\\' => 
        array (
            0 => __DIR__ . '/..' . '/symfony/console',
        ),
        'Psr\\Container\\' => 
        array (
            0 => __DIR__ . '/..' . '/psr/container/src',
        ),
        'PhpParser\\' => 
        array (
            0 => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser',
        ),
    );

    public static $prefixesPsr0 = array (
        'J' => 
        array (
            'Joomlatools\\' => 
            array (
                0 => __DIR__ . '/../..' . '/src',
            ),
        ),
    );

    public static $classMap = array (
        'Attribute' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Attribute.php',
        'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php',
        'JsonException' => __DIR__ . '/..' . '/symfony/polyfill-php73/Resources/stubs/JsonException.php',
        'Normalizer' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php',
        'PhpToken' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php',
        'Stringable' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Stringable.php',
        'UnhandledMatchError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php',
        'ValueError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/ValueError.php',
    );

    public static function getInitializer(ClassLoader $loader)
    {
        return \Closure::bind(function () use ($loader) {
            $loader->prefixLengthsPsr4 = ComposerStaticInita52b37ede49cae90e42da03aa86fa4c5::$prefixLengthsPsr4;
            $loader->prefixDirsPsr4 = ComposerStaticInita52b37ede49cae90e42da03aa86fa4c5::$prefixDirsPsr4;
            $loader->prefixesPsr0 = ComposerStaticInita52b37ede49cae90e42da03aa86fa4c5::$prefixesPsr0;
            $loader->classMap = ComposerStaticInita52b37ede49cae90e42da03aa86fa4c5::$classMap;

        }, null, ClassLoader::class);
    }
}
<?php

// platform_check.php @generated by Composer

$issues = array();

if (!(PHP_VERSION_ID >= 70300)) {
    $issues[] = 'Your Composer dependencies require a PHP version ">= 7.3.0". You are running ' . PHP_VERSION . '.';
}

if ($issues) {
    if (!headers_sent()) {
        header('HTTP/1.1 500 Internal Server Error');
    }
    if (!ini_get('display_errors')) {
        if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') {
            fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL);
        } elseif (!headers_sent()) {
            echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL;
        }
    }
    trigger_error(
        'Composer detected issues in your platform: ' . implode(' ', $issues),
        E_USER_ERROR
    );
}
<?php

// autoload_real.php @generated by Composer

class ComposerAutoloaderInita52b37ede49cae90e42da03aa86fa4c5
{
    private static $loader;

    public static function loadClassLoader($class)
    {
        if ('Composer\Autoload\ClassLoader' === $class) {
            require __DIR__ . '/ClassLoader.php';
        }
    }

    /**
     * @return \Composer\Autoload\ClassLoader
     */
    public static function getLoader()
    {
        if (null !== self::$loader) {
            return self::$loader;
        }

        require __DIR__ . '/platform_check.php';

        spl_autoload_register(array('ComposerAutoloaderInita52b37ede49cae90e42da03aa86fa4c5', 'loadClassLoader'), true, true);
        self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__));
        spl_autoload_unregister(array('ComposerAutoloaderInita52b37ede49cae90e42da03aa86fa4c5', 'loadClassLoader'));

        require __DIR__ . '/autoload_static.php';
        call_user_func(\Composer\Autoload\ComposerStaticInita52b37ede49cae90e42da03aa86fa4c5::getInitializer($loader));

        $loader->register(true);

        $includeFiles = \Composer\Autoload\ComposerStaticInita52b37ede49cae90e42da03aa86fa4c5::$files;
        foreach ($includeFiles as $fileIdentifier => $file) {
            composerRequirea52b37ede49cae90e42da03aa86fa4c5($fileIdentifier, $file);
        }

        return $loader;
    }
}

/**
 * @param string $fileIdentifier
 * @param string $file
 * @return void
 */
function composerRequirea52b37ede49cae90e42da03aa86fa4c5($fileIdentifier, $file)
{
    if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
        $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;

        require $file;
    }
}
<?php

/*
 * This file is part of Composer.
 *
 * (c) Nils Adermann <naderman@naderman.de>
 *     Jordi Boggiano <j.boggiano@seld.be>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Composer\Autoload;

/**
 * ClassLoader implements a PSR-0, PSR-4 and classmap class loader.
 *
 *     $loader = new \Composer\Autoload\ClassLoader();
 *
 *     // register classes with namespaces
 *     $loader->add('Symfony\Component', __DIR__.'/component');
 *     $loader->add('Symfony',           __DIR__.'/framework');
 *
 *     // activate the autoloader
 *     $loader->register();
 *
 *     // to enable searching the include path (eg. for PEAR packages)
 *     $loader->setUseIncludePath(true);
 *
 * In this example, if you try to use a class in the Symfony\Component
 * namespace or one of its children (Symfony\Component\Console for instance),
 * the autoloader will first look for the class under the component/
 * directory, and it will then fallback to the framework/ directory if not
 * found before giving up.
 *
 * This class is loosely based on the Symfony UniversalClassLoader.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Jordi Boggiano <j.boggiano@seld.be>
 * @see    https://www.php-fig.org/psr/psr-0/
 * @see    https://www.php-fig.org/psr/psr-4/
 */
class ClassLoader
{
    /** @var ?string */
    private $vendorDir;

    // PSR-4
    /**
     * @var array[]
     * @psalm-var array<string, array<string, int>>
     */
    private $prefixLengthsPsr4 = array();
    /**
     * @var array[]
     * @psalm-var array<string, array<int, string>>
     */
    private $prefixDirsPsr4 = array();
    /**
     * @var array[]
     * @psalm-var array<string, string>
     */
    private $fallbackDirsPsr4 = array();

    // PSR-0
    /**
     * @var array[]
     * @psalm-var array<string, array<string, string[]>>
     */
    private $prefixesPsr0 = array();
    /**
     * @var array[]
     * @psalm-var array<string, string>
     */
    private $fallbackDirsPsr0 = array();

    /** @var bool */
    private $useIncludePath = false;

    /**
     * @var string[]
     * @psalm-var array<string, string>
     */
    private $classMap = array();

    /** @var bool */
    private $classMapAuthoritative = false;

    /**
     * @var bool[]
     * @psalm-var array<string, bool>
     */
    private $missingClasses = array();

    /** @var ?string */
    private $apcuPrefix;

    /**
     * @var self[]
     */
    private static $registeredLoaders = array();

    /**
     * @param ?string $vendorDir
     */
    public function __construct($vendorDir = null)
    {
        $this->vendorDir = $vendorDir;
    }

    /**
     * @return string[]
     */
    public function getPrefixes()
    {
        if (!empty($this->prefixesPsr0)) {
            return call_user_func_array('array_merge', array_values($this->prefixesPsr0));
        }

        return array();
    }

    /**
     * @return array[]
     * @psalm-return array<string, array<int, string>>
     */
    public function getPrefixesPsr4()
    {
        return $this->prefixDirsPsr4;
    }

    /**
     * @return array[]
     * @psalm-return array<string, string>
     */
    public function getFallbackDirs()
    {
        return $this->fallbackDirsPsr0;
    }

    /**
     * @return array[]
     * @psalm-return array<string, string>
     */
    public function getFallbackDirsPsr4()
    {
        return $this->fallbackDirsPsr4;
    }

    /**
     * @return string[] Array of classname => path
     * @psalm-return array<string, string>
     */
    public function getClassMap()
    {
        return $this->classMap;
    }

    /**
     * @param string[] $classMap Class to filename map
     * @psalm-param array<string, string> $classMap
     *
     * @return void
     */
    public function addClassMap(array $classMap)
    {
        if ($this->classMap) {
            $this->classMap = array_merge($this->classMap, $classMap);
        } else {
            $this->classMap = $classMap;
        }
    }

    /**
     * Registers a set of PSR-0 directories for a given prefix, either
     * appending or prepending to the ones previously set for this prefix.
     *
     * @param string          $prefix  The prefix
     * @param string[]|string $paths   The PSR-0 root directories
     * @param bool            $prepend Whether to prepend the directories
     *
     * @return void
     */
    public function add($prefix, $paths, $prepend = false)
    {
        if (!$prefix) {
            if ($prepend) {
                $this->fallbackDirsPsr0 = array_merge(
                    (array) $paths,
                    $this->fallbackDirsPsr0
                );
            } else {
                $this->fallbackDirsPsr0 = array_merge(
                    $this->fallbackDirsPsr0,
                    (array) $paths
                );
            }

            return;
        }

        $first = $prefix[0];
        if (!isset($this->prefixesPsr0[$first][$prefix])) {
            $this->prefixesPsr0[$first][$prefix] = (array) $paths;

            return;
        }
        if ($prepend) {
            $this->prefixesPsr0[$first][$prefix] = array_merge(
                (array) $paths,
                $this->prefixesPsr0[$first][$prefix]
            );
        } else {
            $this->prefixesPsr0[$first][$prefix] = array_merge(
                $this->prefixesPsr0[$first][$prefix],
                (array) $paths
            );
        }
    }

    /**
     * Registers a set of PSR-4 directories for a given namespace, either
     * appending or prepending to the ones previously set for this namespace.
     *
     * @param string          $prefix  The prefix/namespace, with trailing '\\'
     * @param string[]|string $paths   The PSR-4 base directories
     * @param bool            $prepend Whether to prepend the directories
     *
     * @throws \InvalidArgumentException
     *
     * @return void
     */
    public function addPsr4($prefix, $paths, $prepend = false)
    {
        if (!$prefix) {
            // Register directories for the root namespace.
            if ($prepend) {
                $this->fallbackDirsPsr4 = array_merge(
                    (array) $paths,
                    $this->fallbackDirsPsr4
                );
            } else {
                $this->fallbackDirsPsr4 = array_merge(
                    $this->fallbackDirsPsr4,
                    (array) $paths
                );
            }
        } elseif (!isset($this->prefixDirsPsr4[$prefix])) {
            // Register directories for a new namespace.
            $length = strlen($prefix);
            if ('\\' !== $prefix[$length - 1]) {
                throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
            }
            $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
            $this->prefixDirsPsr4[$prefix] = (array) $paths;
        } elseif ($prepend) {
            // Prepend directories for an already registered namespace.
            $this->prefixDirsPsr4[$prefix] = array_merge(
                (array) $paths,
                $this->prefixDirsPsr4[$prefix]
            );
        } else {
            // Append directories for an already registered namespace.
            $this->prefixDirsPsr4[$prefix] = array_merge(
                $this->prefixDirsPsr4[$prefix],
                (array) $paths
            );
        }
    }

    /**
     * Registers a set of PSR-0 directories for a given prefix,
     * replacing any others previously set for this prefix.
     *
     * @param string          $prefix The prefix
     * @param string[]|string $paths  The PSR-0 base directories
     *
     * @return void
     */
    public function set($prefix, $paths)
    {
        if (!$prefix) {
            $this->fallbackDirsPsr0 = (array) $paths;
        } else {
            $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;
        }
    }

    /**
     * Registers a set of PSR-4 directories for a given namespace,
     * replacing any others previously set for this namespace.
     *
     * @param string          $prefix The prefix/namespace, with trailing '\\'
     * @param string[]|string $paths  The PSR-4 base directories
     *
     * @throws \InvalidArgumentException
     *
     * @return void
     */
    public function setPsr4($prefix, $paths)
    {
        if (!$prefix) {
            $this->fallbackDirsPsr4 = (array) $paths;
        } else {
            $length = strlen($prefix);
            if ('\\' !== $prefix[$length - 1]) {
                throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
            }
            $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
            $this->prefixDirsPsr4[$prefix] = (array) $paths;
        }
    }

    /**
     * Turns on searching the include path for class files.
     *
     * @param bool $useIncludePath
     *
     * @return void
     */
    public function setUseIncludePath($useIncludePath)
    {
        $this->useIncludePath = $useIncludePath;
    }

    /**
     * Can be used to check if the autoloader uses the include path to check
     * for classes.
     *
     * @return bool
     */
    public function getUseIncludePath()
    {
        return $this->useIncludePath;
    }

    /**
     * Turns off searching the prefix and fallback directories for classes
     * that have not been registered with the class map.
     *
     * @param bool $classMapAuthoritative
     *
     * @return void
     */
    public function setClassMapAuthoritative($classMapAuthoritative)
    {
        $this->classMapAuthoritative = $classMapAuthoritative;
    }

    /**
     * Should class lookup fail if not found in the current class map?
     *
     * @return bool
     */
    public function isClassMapAuthoritative()
    {
        return $this->classMapAuthoritative;
    }

    /**
     * APCu prefix to use to cache found/not-found classes, if the extension is enabled.
     *
     * @param string|null $apcuPrefix
     *
     * @return void
     */
    public function setApcuPrefix($apcuPrefix)
    {
        $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null;
    }

    /**
     * The APCu prefix in use, or null if APCu caching is not enabled.
     *
     * @return string|null
     */
    public function getApcuPrefix()
    {
        return $this->apcuPrefix;
    }

    /**
     * Registers this instance as an autoloader.
     *
     * @param bool $prepend Whether to prepend the autoloader or not
     *
     * @return void
     */
    public function register($prepend = false)
    {
        spl_autoload_register(array($this, 'loadClass'), true, $prepend);

        if (null === $this->vendorDir) {
            return;
        }

        if ($prepend) {
            self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders;
        } else {
            unset(self::$registeredLoaders[$this->vendorDir]);
            self::$registeredLoaders[$this->vendorDir] = $this;
        }
    }

    /**
     * Unregisters this instance as an autoloader.
     *
     * @return void
     */
    public function unregister()
    {
        spl_autoload_unregister(array($this, 'loadClass'));

        if (null !== $this->vendorDir) {
            unset(self::$registeredLoaders[$this->vendorDir]);
        }
    }

    /**
     * Loads the given class or interface.
     *
     * @param  string    $class The name of the class
     * @return true|null True if loaded, null otherwise
     */
    public function loadClass($class)
    {
        if ($file = $this->findFile($class)) {
            includeFile($file);

            return true;
        }

        return null;
    }

    /**
     * Finds the path to the file where the class is defined.
     *
     * @param string $class The name of the class
     *
     * @return string|false The path if found, false otherwise
     */
    public function findFile($class)
    {
        // class map lookup
        if (isset($this->classMap[$class])) {
            return $this->classMap[$class];
        }
        if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {
            return false;
        }
        if (null !== $this->apcuPrefix) {
            $file = apcu_fetch($this->apcuPrefix.$class, $hit);
            if ($hit) {
                return $file;
            }
        }

        $file = $this->findFileWithExtension($class, '.php');

        // Search for Hack files if we are running on HHVM
        if (false === $file && defined('HHVM_VERSION')) {
            $file = $this->findFileWithExtension($class, '.hh');
        }

        if (null !== $this->apcuPrefix) {
            apcu_add($this->apcuPrefix.$class, $file);
        }

        if (false === $file) {
            // Remember that this class does not exist.
            $this->missingClasses[$class] = true;
        }

        return $file;
    }

    /**
     * Returns the currently registered loaders indexed by their corresponding vendor directories.
     *
     * @return self[]
     */
    public static function getRegisteredLoaders()
    {
        return self::$registeredLoaders;
    }

    /**
     * @param  string       $class
     * @param  string       $ext
     * @return string|false
     */
    private function findFileWithExtension($class, $ext)
    {
        // PSR-4 lookup
        $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;

        $first = $class[0];
        if (isset($this->prefixLengthsPsr4[$first])) {
            $subPath = $class;
            while (false !== $lastPos = strrpos($subPath, '\\')) {
                $subPath = substr($subPath, 0, $lastPos);
                $search = $subPath . '\\';
                if (isset($this->prefixDirsPsr4[$search])) {
                    $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1);
                    foreach ($this->prefixDirsPsr4[$search] as $dir) {
                        if (file_exists($file = $dir . $pathEnd)) {
                            return $file;
                        }
                    }
                }
            }
        }

        // PSR-4 fallback dirs
        foreach ($this->fallbackDirsPsr4 as $dir) {
            if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
                return $file;
            }
        }

        // PSR-0 lookup
        if (false !== $pos = strrpos($class, '\\')) {
            // namespaced class name
            $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
                . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
        } else {
            // PEAR-like class name
            $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
        }

        if (isset($this->prefixesPsr0[$first])) {
            foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
                if (0 === strpos($class, $prefix)) {
                    foreach ($dirs as $dir) {
                        if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
                            return $file;
                        }
                    }
                }
            }
        }

        // PSR-0 fallback dirs
        foreach ($this->fallbackDirsPsr0 as $dir) {
            if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
                return $file;
            }
        }

        // PSR-0 include paths.
        if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
            return $file;
        }

        return false;
    }
}

/**
 * Scope isolated include.
 *
 * Prevents access to $this/self from included files.
 *
 * @param  string $file
 * @return void
 * @private
 */
function includeFile($file)
{
    include $file;
}

Copyright (c) Nils Adermann, Jordi Boggiano

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.

composer.lock
composer.phar
/vendor/
The MIT License (MIT)

Copyright (c) 2013-2016 container-interop
Copyright (c) 2016 PHP Framework Interoperability Group

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.
Container interface
==============

This repository holds all interfaces related to [PSR-11 (Container Interface)][psr-url].

Note that this is not a Container implementation of its own. It is merely abstractions that describe the components of a Dependency Injection Container.

The installable [package][package-url] and [implementations][implementation-url] are listed on Packagist.

[psr-url]: https://www.php-fig.org/psr/psr-11/
[package-url]: https://packagist.org/packages/psr/container
[implementation-url]: https://packagist.org/providers/psr/container-implementation

{
    "name": "psr/container",
    "type": "library",
    "description": "Common Container Interface (PHP FIG PSR-11)",
    "keywords": ["psr", "psr-11", "container", "container-interop", "container-interface"],
    "homepage": "https://github.com/php-fig/container",
    "license": "MIT",
    "authors": [
        {
            "name": "PHP-FIG",
            "homepage": "https://www.php-fig.org/"
        }
    ],
    "require": {
        "php": ">=7.2.0"
    },
    "autoload": {
        "psr-4": {
            "Psr\\Container\\": "src/"
        }
    }
}
<?php

namespace Psr\Container;

/**
 * Base interface representing a generic exception in a container.
 */
interface ContainerExceptionInterface
{
}
<?php

declare(strict_types=1);

namespace Psr\Container;

/**
 * Describes the interface of a container that exposes methods to read its entries.
 */
interface ContainerInterface
{
    /**
     * Finds an entry of the container by its identifier and returns it.
     *
     * @param string $id Identifier of the entry to look for.
     *
     * @throws NotFoundExceptionInterface  No entry was found for **this** identifier.
     * @throws ContainerExceptionInterface Error while retrieving the entry.
     *
     * @return mixed Entry.
     */
    public function get(string $id);

    /**
     * Returns true if the container can return an entry for the given identifier.
     * Returns false otherwise.
     *
     * `has($id)` returning true does not mean that `get($id)` will not throw an exception.
     * It does however mean that `get($id)` will not throw a `NotFoundExceptionInterface`.
     *
     * @param string $id Identifier of the entry to look for.
     *
     * @return bool
     */
    public function has(string $id);
}
<?php

namespace Psr\Container;

/**
 * No entry was found in the container.
 */
interface NotFoundExceptionInterface extends ContainerExceptionInterface
{
}
<?php

// autoload.php @generated by Composer

if (PHP_VERSION_ID < 50600) {
    echo 'Composer 2.3.0 dropped support for autoloading on PHP <5.6 and you are running '.PHP_VERSION.', please upgrade PHP or use Composer 2.2 LTS via "composer self-update --2.2". Aborting.'.PHP_EOL;
    exit(1);
}

require_once __DIR__ . '/composer/autoload_real.php';

return ComposerAutoloaderInita52b37ede49cae90e42da03aa86fa4c5::getLoader();
#!/usr/bin/env php
<?php

/**
 * Proxy PHP file generated by Composer
 *
 * This file includes the referenced bin path (../nikic/php-parser/bin/php-parse)
 * using a stream wrapper to prevent the shebang from being output on PHP<8
 *
 * @generated
 */

namespace Composer;

$GLOBALS['_composer_bin_dir'] = __DIR__;
$GLOBALS['_composer_autoload_path'] = __DIR__ . '/..'.'/autoload.php';

if (PHP_VERSION_ID < 80000) {
    if (!class_exists('Composer\BinProxyWrapper')) {
        /**
         * @internal
         */
        final class BinProxyWrapper
        {
            private $handle;
            private $position;
            private $realpath;

            public function stream_open($path, $mode, $options, &$opened_path)
            {
                // get rid of phpvfscomposer:// prefix for __FILE__ & __DIR__ resolution
                $opened_path = substr($path, 17);
                $this->realpath = realpath($opened_path) ?: $opened_path;
                $opened_path = $this->realpath;
                $this->handle = fopen($this->realpath, $mode);
                $this->position = 0;

                return (bool) $this->handle;
            }

            public function stream_read($count)
            {
                $data = fread($this->handle, $count);

                if ($this->position === 0) {
                    $data = preg_replace('{^#!.*\r?\n}', '', $data);
                }

                $this->position += strlen($data);

                return $data;
            }

            public function stream_cast($castAs)
            {
                return $this->handle;
            }

            public function stream_close()
            {
                fclose($this->handle);
            }

            public function stream_lock($operation)
            {
                return $operation ? flock($this->handle, $operation) : true;
            }

            public function stream_seek($offset, $whence)
            {
                if (0 === fseek($this->handle, $offset, $whence)) {
                    $this->position = ftell($this->handle);
                    return true;
                }

                return false;
            }

            public function stream_tell()
            {
                return $this->position;
            }

            public function stream_eof()
            {
                return feof($this->handle);
            }

            public function stream_stat()
            {
                return array();
            }

            public function stream_set_option($option, $arg1, $arg2)
            {
                return true;
            }

            public function url_stat($path, $flags)
            {
                $path = substr($path, 17);
                if (file_exists($path)) {
                    return stat($path);
                }

                return false;
            }
        }
    }

    if (
        (function_exists('stream_get_wrappers') && in_array('phpvfscomposer', stream_get_wrappers(), true))
        || (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper'))
    ) {
        include("phpvfscomposer://" . __DIR__ . '/..'.'/nikic/php-parser/bin/php-parse');
        exit(0);
    }
}

include __DIR__ . '/..'.'/nikic/php-parser/bin/php-parse';
BSD 3-Clause License

Copyright (c) 2011, Nikita Popov
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.
PHP Parser
==========

[![Coverage Status](https://coveralls.io/repos/github/nikic/PHP-Parser/badge.svg?branch=master)](https://coveralls.io/github/nikic/PHP-Parser?branch=master)

This is a PHP 5.2 to PHP 8.2 parser written in PHP. Its purpose is to simplify static code analysis and
manipulation.

[**Documentation for version 4.x**][doc_4_x] (stable; for running on PHP >= 7.0; for parsing PHP 5.2 to PHP 8.2).

[Documentation for version 3.x][doc_3_x] (unsupported; for running on PHP >= 5.5; for parsing PHP 5.2 to PHP 7.2).

Features
--------

The main features provided by this library are:

 * Parsing PHP 5, PHP 7, and PHP 8 code into an abstract syntax tree (AST).
   * Invalid code can be parsed into a partial AST.
   * The AST contains accurate location information.
 * Dumping the AST in human-readable form.
 * Converting an AST back to PHP code.
   * Experimental: Formatting can be preserved for partially changed ASTs.
 * Infrastructure to traverse and modify ASTs.
 * Resolution of namespaced names.
 * Evaluation of constant expressions.
 * Builders to simplify AST construction for code generation.
 * Converting an AST into JSON and back.

Quick Start
-----------

Install the library using [composer](https://getcomposer.org):

    php composer.phar require nikic/php-parser

Parse some PHP code into an AST and dump the result in human-readable form:

```php
<?php
use PhpParser\Error;
use PhpParser\NodeDumper;
use PhpParser\ParserFactory;

$code = <<<'CODE'
<?php

function test($foo)
{
    var_dump($foo);
}
CODE;

$parser = (new ParserFactory)->create(ParserFactory::PREFER_PHP7);
try {
    $ast = $parser->parse($code);
} catch (Error $error) {
    echo "Parse error: {$error->getMessage()}\n";
    return;
}

$dumper = new NodeDumper;
echo $dumper->dump($ast) . "\n";
```

This dumps an AST looking something like this:

```
array(
    0: Stmt_Function(
        byRef: false
        name: Identifier(
            name: test
        )
        params: array(
            0: Param(
                type: null
                byRef: false
                variadic: false
                var: Expr_Variable(
                    name: foo
                )
                default: null
            )
        )
        returnType: null
        stmts: array(
            0: Stmt_Expression(
                expr: Expr_FuncCall(
                    name: Name(
                        parts: array(
                            0: var_dump
                        )
                    )
                    args: array(
                        0: Arg(
                            value: Expr_Variable(
                                name: foo
                            )
                            byRef: false
                            unpack: false
                        )
                    )
                )
            )
        )
    )
)
```

Let's traverse the AST and perform some kind of modification. For example, drop all function bodies:

```php
use PhpParser\Node;
use PhpParser\Node\Stmt\Function_;
use PhpParser\NodeTraverser;
use PhpParser\NodeVisitorAbstract;

$traverser = new NodeTraverser();
$traverser->addVisitor(new class extends NodeVisitorAbstract {
    public function enterNode(Node $node) {
        if ($node instanceof Function_) {
            // Clean out the function body
            $node->stmts = [];
        }
    }
});

$ast = $traverser->traverse($ast);
echo $dumper->dump($ast) . "\n";
```

This gives us an AST where the `Function_::$stmts` are empty:

```
array(
    0: Stmt_Function(
        byRef: false
        name: Identifier(
            name: test
        )
        params: array(
            0: Param(
                type: null
                byRef: false
                variadic: false
                var: Expr_Variable(
                    name: foo
                )
                default: null
            )
        )
        returnType: null
        stmts: array(
        )
    )
)
```

Finally, we can convert the new AST back to PHP code:

```php
use PhpParser\PrettyPrinter;

$prettyPrinter = new PrettyPrinter\Standard;
echo $prettyPrinter->prettyPrintFile($ast);
```

This gives us our original code, minus the `var_dump()` call inside the function:

```php
<?php

function test($foo)
{
}
```

For a more comprehensive introduction, see the documentation.

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

 1. [Introduction](doc/0_Introduction.markdown)
 2. [Usage of basic components](doc/2_Usage_of_basic_components.markdown)

Component documentation:

 * [Walking the AST](doc/component/Walking_the_AST.markdown)
   * Node visitors
   * Modifying the AST from a visitor
   * Short-circuiting traversals
   * Interleaved visitors
   * Simple node finding API
   * Parent and sibling references
 * [Name resolution](doc/component/Name_resolution.markdown)
   * Name resolver options
   * Name resolution context
 * [Pretty printing](doc/component/Pretty_printing.markdown)
   * Converting AST back to PHP code
   * Customizing formatting
   * Formatting-preserving code transformations
 * [AST builders](doc/component/AST_builders.markdown)
   * Fluent builders for AST nodes
 * [Lexer](doc/component/Lexer.markdown)
   * Lexer options
   * Token and file positions for nodes
   * Custom attributes
 * [Error handling](doc/component/Error_handling.markdown)
   * Column information for errors
   * Error recovery (parsing of syntactically incorrect code)
 * [Constant expression evaluation](doc/component/Constant_expression_evaluation.markdown)
   * Evaluating constant/property/etc initializers
   * Handling errors and unsupported expressions
 * [JSON representation](doc/component/JSON_representation.markdown)
   * JSON encoding and decoding of ASTs
 * [Performance](doc/component/Performance.markdown)
   * Disabling Xdebug
   * Reusing objects
   * Garbage collection impact
 * [Frequently asked questions](doc/component/FAQ.markdown)
   * Parent and sibling references

 [doc_3_x]: https://github.com/nikic/PHP-Parser/tree/3.x/doc
 [doc_4_x]: https://github.com/nikic/PHP-Parser/tree/4.x/doc
#!/usr/bin/env php
<?php

foreach ([__DIR__ . '/../../../autoload.php', __DIR__ . '/../vendor/autoload.php'] as $file) {
    if (file_exists($file)) {
        require $file;
        break;
    }
}

ini_set('xdebug.max_nesting_level', 3000);

// Disable Xdebug var_dump() output truncation
ini_set('xdebug.var_display_max_children', -1);
ini_set('xdebug.var_display_max_data', -1);
ini_set('xdebug.var_display_max_depth', -1);

list($operations, $files, $attributes) = parseArgs($argv);

/* Dump nodes by default */
if (empty($operations)) {
    $operations[] = 'dump';
}

if (empty($files)) {
    showHelp("Must specify at least one file.");
}

$lexer = new PhpParser\Lexer\Emulative(['usedAttributes' => [
    'startLine', 'endLine', 'startFilePos', 'endFilePos', 'comments'
]]);
$parser = (new PhpParser\ParserFactory)->create(
    PhpParser\ParserFactory::PREFER_PHP7,
    $lexer
);
$dumper = new PhpParser\NodeDumper([
    'dumpComments' => true,
    'dumpPositions' => $attributes['with-positions'],
]);
$prettyPrinter = new PhpParser\PrettyPrinter\Standard;

$traverser = new PhpParser\NodeTraverser();
$traverser->addVisitor(new PhpParser\NodeVisitor\NameResolver);

foreach ($files as $file) {
    if (strpos($file, '<?php') === 0) {
        $code = $file;
        fwrite(STDERR, "====> Code $code\n");
    } else {
        if (!file_exists($file)) {
            fwrite(STDERR, "File $file does not exist.\n");
            exit(1);
        }

        $code = file_get_contents($file);
        fwrite(STDERR, "====> File $file:\n");
    }

    if ($attributes['with-recovery']) {
        $errorHandler = new PhpParser\ErrorHandler\Collecting;
        $stmts = $parser->parse($code, $errorHandler);
        foreach ($errorHandler->getErrors() as $error) {
            $message = formatErrorMessage($error, $code, $attributes['with-column-info']);
            fwrite(STDERR, $message . "\n");
        }
        if (null === $stmts) {
            continue;
        }
    } else {
        try {
            $stmts = $parser->parse($code);
        } catch (PhpParser\Error $error) {
            $message = formatErrorMessage($error, $code, $attributes['with-column-info']);
            fwrite(STDERR, $message . "\n");
            exit(1);
        }
    }

    foreach ($operations as $operation) {
        if ('dump' === $operation) {
            fwrite(STDERR, "==> Node dump:\n");
            echo $dumper->dump($stmts, $code), "\n";
        } elseif ('pretty-print' === $operation) {
            fwrite(STDERR, "==> Pretty print:\n");
            echo $prettyPrinter->prettyPrintFile($stmts), "\n";
        } elseif ('json-dump' === $operation) {
            fwrite(STDERR, "==> JSON dump:\n");
            echo json_encode($stmts, JSON_PRETTY_PRINT), "\n";
        } elseif ('var-dump' === $operation) {
            fwrite(STDERR, "==> var_dump():\n");
            var_dump($stmts);
        } elseif ('resolve-names' === $operation) {
            fwrite(STDERR, "==> Resolved names.\n");
            $stmts = $traverser->traverse($stmts);
        }
    }
}

function formatErrorMessage(PhpParser\Error $e, $code, $withColumnInfo) {
    if ($withColumnInfo && $e->hasColumnInfo()) {
        return $e->getMessageWithColumnInfo($code);
    } else {
        return $e->getMessage();
    }
}

function showHelp($error = '') {
    if ($error) {
        fwrite(STDERR, $error . "\n\n");
    }
    fwrite($error ? STDERR : STDOUT, <<<OUTPUT
Usage: php-parse [operations] file1.php [file2.php ...]
   or: php-parse [operations] "<?php code"
Turn PHP source code into an abstract syntax tree.

Operations is a list of the following options (--dump by default):

    -d, --dump              Dump nodes using NodeDumper
    -p, --pretty-print      Pretty print file using PrettyPrinter\Standard
    -j, --json-dump         Print json_encode() result
        --var-dump          var_dump() nodes (for exact structure)
    -N, --resolve-names     Resolve names using NodeVisitor\NameResolver
    -c, --with-column-info  Show column-numbers for errors (if available)
    -P, --with-positions    Show positions in node dumps
    -r, --with-recovery     Use parsing with error recovery
    -h, --help              Display this page

Example:
    php-parse -d -p -N -d file.php

    Dumps nodes, pretty prints them, then resolves names and dumps them again.


OUTPUT
    );
    exit($error ? 1 : 0);
}

function parseArgs($args) {
    $operations = [];
    $files = [];
    $attributes = [
        'with-column-info' => false,
        'with-positions' => false,
        'with-recovery' => false,
    ];

    array_shift($args);
    $parseOptions = true;
    foreach ($args as $arg) {
        if (!$parseOptions) {
            $files[] = $arg;
            continue;
        }

        switch ($arg) {
            case '--dump':
            case '-d':
                $operations[] = 'dump';
                break;
            case '--pretty-print':
            case '-p':
                $operations[] = 'pretty-print';
                break;
            case '--json-dump':
            case '-j':
                $operations[] = 'json-dump';
                break;
            case '--var-dump':
                $operations[] = 'var-dump';
                break;
            case '--resolve-names':
            case '-N';
                $operations[] = 'resolve-names';
                break;
            case '--with-column-info':
            case '-c';
                $attributes['with-column-info'] = true;
                break;
            case '--with-positions':
            case '-P':
                $attributes['with-positions'] = true;
                break;
            case '--with-recovery':
            case '-r':
                $attributes['with-recovery'] = true;
                break;
            case '--help':
            case '-h';
                showHelp();
                break;
            case '--':
                $parseOptions = false;
                break;
            default:
                if ($arg[0] === '-') {
                    showHelp("Invalid operation $arg.");
                } else {
                    $files[] = $arg;
                }
        }
    }

    return [$operations, $files, $attributes];
}
{
    "name": "nikic/php-parser",
    "type": "library",
    "description": "A PHP parser written in PHP",
    "keywords": [
        "php",
        "parser"
    ],
    "license": "BSD-3-Clause",
    "authors": [
        {
            "name": "Nikita Popov"
        }
    ],
    "require": {
        "php": ">=7.0",
        "ext-tokenizer": "*"
    },
    "require-dev": {
        "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0",
        "ircmaxell/php-yacc": "^0.0.7"
    },
    "extra": {
        "branch-alias": {
            "dev-master": "4.9-dev"
        }
    },
    "autoload": {
        "psr-4": {
            "PhpParser\\": "lib/PhpParser"
        }
    },
    "autoload-dev": {
        "psr-4": {
            "PhpParser\\": "test/PhpParser/"
        }
    },
    "bin": [
        "bin/php-parse"
    ]
}
What do all those files mean?
=============================

 * `php5.y`:             PHP 5 grammar written in a pseudo language
 * `php7.y`:             PHP 7 grammar written in a pseudo language
 * `tokens.y`:           Tokens definition shared between PHP 5 and PHP 7 grammars
 * `parser.template`:    A `kmyacc` parser prototype file for PHP
 * `tokens.template`:    A `kmyacc` prototype file for the `Tokens` class
 * `rebuildParsers.php`: Preprocesses the grammar and builds the parser using `kmyacc`

.phpy pseudo language
=====================

The `.y` file is a normal grammar in `kmyacc` (`yacc`) style, with some transformations
applied to it:

 * Nodes are created using the syntax `Name[..., ...]`. This is transformed into
   `new Name(..., ..., attributes())`
 * Some function-like constructs are resolved (see `rebuildParsers.php` for a list)

Building the parser
===================

Run `php grammar/rebuildParsers.php` to rebuild the parsers. Additional options:

 * The `KMYACC` environment variable can be used to specify an alternative `kmyacc` binary.
   By default the `phpyacc` dev dependency will be used. To use the original `kmyacc`, you
   need to compile [moriyoshi's fork](https://github.com/moriyoshi/kmyacc-forked).
 * The `--debug` option enables emission of debug symbols and creates the `y.output` file.
 * The `--keep-tmp-grammar` option preserves the preprocessed grammar file.
<?php
$meta #
#semval($) $this->semValue
#semval($,%t) $this->semValue
#semval(%n) $stackPos-(%l-%n)
#semval(%n,%t) $stackPos-(%l-%n)

namespace PhpParser\Parser;

use PhpParser\Error;
use PhpParser\Node;
use PhpParser\Node\Expr;
use PhpParser\Node\Name;
use PhpParser\Node\Scalar;
use PhpParser\Node\Stmt;
#include;

/* This is an automatically GENERATED file, which should not be manually edited.
 * Instead edit one of the following:
 *  * the grammar files grammar/php5.y or grammar/php7.y
 *  * the skeleton file grammar/parser.template
 *  * the preprocessing script grammar/rebuildParsers.php
 */
class #(-p) extends \PhpParser\ParserAbstract
{
    protected $tokenToSymbolMapSize = #(YYMAXLEX);
    protected $actionTableSize = #(YYLAST);
    protected $gotoTableSize = #(YYGLAST);

    protected $invalidSymbol = #(YYBADCH);
    protected $errorSymbol = #(YYINTERRTOK);
    protected $defaultAction = #(YYDEFAULT);
    protected $unexpectedTokenRule = #(YYUNEXPECTED);

    protected $YY2TBLSTATE = #(YY2TBLSTATE);
    protected $numNonLeafStates = #(YYNLSTATES);

    protected $symbolToName = array(
        #listvar terminals
    );

    protected $tokenToSymbol = array(
        #listvar yytranslate
    );

    protected $action = array(
        #listvar yyaction
    );

    protected $actionCheck = array(
        #listvar yycheck
    );

    protected $actionBase = array(
        #listvar yybase
    );

    protected $actionDefault = array(
        #listvar yydefault
    );

    protected $goto = array(
        #listvar yygoto
    );

    protected $gotoCheck = array(
        #listvar yygcheck
    );

    protected $gotoBase = array(
        #listvar yygbase
    );

    protected $gotoDefault = array(
        #listvar yygdefault
    );

    protected $ruleToNonTerminal = array(
        #listvar yylhs
    );

    protected $ruleToLength = array(
        #listvar yylen
    );
#if -t

    protected $productions = array(
        #production-strings;
    );
#endif

    protected function initReduceCallbacks() {
        $this->reduceCallbacks = [
#reduce
            %n => function ($stackPos) {
                %b
            },
#noact
            %n => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
#endreduce
        ];
    }
}
#tailcode;
%pure_parser
%expect 6

%tokens

%%

start:
    top_statement_list                                      { $$ = $this->handleNamespaces($1); }
;

top_statement_list_ex:
      top_statement_list_ex top_statement                   { pushNormalizing($1, $2); }
    | /* empty */                                           { init(); }
;

top_statement_list:
      top_statement_list_ex
          { makeZeroLengthNop($nop, $this->lookaheadStartAttributes);
            if ($nop !== null) { $1[] = $nop; } $$ = $1; }
;

ampersand:
      T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG
    | T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG
;

reserved_non_modifiers:
      T_INCLUDE | T_INCLUDE_ONCE | T_EVAL | T_REQUIRE | T_REQUIRE_ONCE | T_LOGICAL_OR | T_LOGICAL_XOR | T_LOGICAL_AND
    | T_INSTANCEOF | T_NEW | T_CLONE | T_EXIT | T_IF | T_ELSEIF | T_ELSE | T_ENDIF | T_ECHO | T_DO | T_WHILE
    | T_ENDWHILE | T_FOR | T_ENDFOR | T_FOREACH | T_ENDFOREACH | T_DECLARE | T_ENDDECLARE | T_AS | T_TRY | T_CATCH
    | T_FINALLY | T_THROW | T_USE | T_INSTEADOF | T_GLOBAL | T_VAR | T_UNSET | T_ISSET | T_EMPTY | T_CONTINUE | T_GOTO
    | T_FUNCTION | T_CONST | T_RETURN | T_PRINT | T_YIELD | T_LIST | T_SWITCH | T_ENDSWITCH | T_CASE | T_DEFAULT
    | T_BREAK | T_ARRAY | T_CALLABLE | T_EXTENDS | T_IMPLEMENTS | T_NAMESPACE | T_TRAIT | T_INTERFACE | T_CLASS
    | T_CLASS_C | T_TRAIT_C | T_FUNC_C | T_METHOD_C | T_LINE | T_FILE | T_DIR | T_NS_C | T_HALT_COMPILER | T_FN
    | T_MATCH
;

semi_reserved:
      reserved_non_modifiers
    | T_STATIC | T_ABSTRACT | T_FINAL | T_PRIVATE | T_PROTECTED | T_PUBLIC
;

identifier_ex:
      T_STRING                                              { $$ = Node\Identifier[$1]; }
    | semi_reserved                                         { $$ = Node\Identifier[$1]; }
;

identifier:
      T_STRING                                              { $$ = Node\Identifier[$1]; }
;

reserved_non_modifiers_identifier:
      reserved_non_modifiers                                { $$ = Node\Identifier[$1]; }
;

namespace_name:
      T_STRING                                              { $$ = Name[$1]; }
    | T_NAME_QUALIFIED                                      { $$ = Name[$1]; }
;

legacy_namespace_name:
      namespace_name                                        { $$ = $1; }
    | T_NAME_FULLY_QUALIFIED                                { $$ = Name[substr($1, 1)]; }
;

plain_variable:
      T_VARIABLE                                            { $$ = Expr\Variable[parseVar($1)]; }
;

top_statement:
      statement                                             { $$ = $1; }
    | function_declaration_statement                        { $$ = $1; }
    | class_declaration_statement                           { $$ = $1; }
    | T_HALT_COMPILER
          { $$ = Stmt\HaltCompiler[$this->lexer->handleHaltCompiler()]; }
    | T_NAMESPACE namespace_name ';'
          { $$ = Stmt\Namespace_[$2, null];
            $$->setAttribute('kind', Stmt\Namespace_::KIND_SEMICOLON);
            $this->checkNamespace($$); }
    | T_NAMESPACE namespace_name '{' top_statement_list '}'
          { $$ = Stmt\Namespace_[$2, $4];
            $$->setAttribute('kind', Stmt\Namespace_::KIND_BRACED);
            $this->checkNamespace($$); }
    | T_NAMESPACE '{' top_statement_list '}'
          { $$ = Stmt\Namespace_[null, $3];
            $$->setAttribute('kind', Stmt\Namespace_::KIND_BRACED);
            $this->checkNamespace($$); }
    | T_USE use_declarations ';'                            { $$ = Stmt\Use_[$2, Stmt\Use_::TYPE_NORMAL]; }
    | T_USE use_type use_declarations ';'                   { $$ = Stmt\Use_[$3, $2]; }
    | group_use_declaration ';'                             { $$ = $1; }
    | T_CONST constant_declaration_list ';'                 { $$ = Stmt\Const_[$2]; }
;

use_type:
      T_FUNCTION                                            { $$ = Stmt\Use_::TYPE_FUNCTION; }
    | T_CONST                                               { $$ = Stmt\Use_::TYPE_CONSTANT; }
;

group_use_declaration:
      T_USE use_type legacy_namespace_name T_NS_SEPARATOR '{' unprefixed_use_declarations '}'
          { $$ = Stmt\GroupUse[$3, $6, $2]; }
    | T_USE legacy_namespace_name T_NS_SEPARATOR '{' inline_use_declarations '}'
          { $$ = Stmt\GroupUse[$2, $5, Stmt\Use_::TYPE_UNKNOWN]; }
;

unprefixed_use_declarations:
      unprefixed_use_declarations ',' unprefixed_use_declaration
          { push($1, $3); }
    | unprefixed_use_declaration                            { init($1); }
;

use_declarations:
      use_declarations ',' use_declaration                  { push($1, $3); }
    | use_declaration                                       { init($1); }
;

inline_use_declarations:
      inline_use_declarations ',' inline_use_declaration    { push($1, $3); }
    | inline_use_declaration                                { init($1); }
;

unprefixed_use_declaration:
      namespace_name
          { $$ = Stmt\UseUse[$1, null, Stmt\Use_::TYPE_UNKNOWN]; $this->checkUseUse($$, #1); }
    | namespace_name T_AS identifier
          { $$ = Stmt\UseUse[$1, $3, Stmt\Use_::TYPE_UNKNOWN]; $this->checkUseUse($$, #3); }
;

use_declaration:
      legacy_namespace_name
          { $$ = Stmt\UseUse[$1, null, Stmt\Use_::TYPE_UNKNOWN]; $this->checkUseUse($$, #1); }
    | legacy_namespace_name T_AS identifier
          { $$ = Stmt\UseUse[$1, $3, Stmt\Use_::TYPE_UNKNOWN]; $this->checkUseUse($$, #3); }
;

inline_use_declaration:
      unprefixed_use_declaration                            { $$ = $1; $$->type = Stmt\Use_::TYPE_NORMAL; }
    | use_type unprefixed_use_declaration                   { $$ = $2; $$->type = $1; }
;

constant_declaration_list:
      constant_declaration_list ',' constant_declaration    { push($1, $3); }
    | constant_declaration                                  { init($1); }
;

constant_declaration:
    identifier '=' static_scalar                            { $$ = Node\Const_[$1, $3]; }
;

class_const_list:
      class_const_list ',' class_const                      { push($1, $3); }
    | class_const                                           { init($1); }
;

class_const:
    identifier_ex '=' static_scalar                         { $$ = Node\Const_[$1, $3]; }
;

inner_statement_list_ex:
      inner_statement_list_ex inner_statement               { pushNormalizing($1, $2); }
    | /* empty */                                           { init(); }
;

inner_statement_list:
      inner_statement_list_ex
          { makeZeroLengthNop($nop, $this->lookaheadStartAttributes);
            if ($nop !== null) { $1[] = $nop; } $$ = $1; }
;

inner_statement:
      statement                                             { $$ = $1; }
    | function_declaration_statement                        { $$ = $1; }
    | class_declaration_statement                           { $$ = $1; }
    | T_HALT_COMPILER
          { throw new Error('__HALT_COMPILER() can only be used from the outermost scope', attributes()); }
;

non_empty_statement:
      '{' inner_statement_list '}'
    {
        if ($2) {
            $$ = $2; prependLeadingComments($$);
        } else {
            makeNop($$, $this->startAttributeStack[#1], $this->endAttributes);
            if (null === $$) { $$ = array(); }
        }
    }
    | T_IF parentheses_expr statement elseif_list else_single
          { $$ = Stmt\If_[$2, ['stmts' => toArray($3), 'elseifs' => $4, 'else' => $5]]; }
    | T_IF parentheses_expr ':' inner_statement_list new_elseif_list new_else_single T_ENDIF ';'
          { $$ = Stmt\If_[$2, ['stmts' => $4, 'elseifs' => $5, 'else' => $6]]; }
    | T_WHILE parentheses_expr while_statement              { $$ = Stmt\While_[$2, $3]; }
    | T_DO statement T_WHILE parentheses_expr ';'           { $$ = Stmt\Do_   [$4, toArray($2)]; }
    | T_FOR '(' for_expr ';'  for_expr ';' for_expr ')' for_statement
          { $$ = Stmt\For_[['init' => $3, 'cond' => $5, 'loop' => $7, 'stmts' => $9]]; }
    | T_SWITCH parentheses_expr switch_case_list            { $$ = Stmt\Switch_[$2, $3]; }
    | T_BREAK ';'                                           { $$ = Stmt\Break_[null]; }
    | T_BREAK expr ';'                                      { $$ = Stmt\Break_[$2]; }
    | T_CONTINUE ';'                                        { $$ = Stmt\Continue_[null]; }
    | T_CONTINUE expr ';'                                   { $$ = Stmt\Continue_[$2]; }
    | T_RETURN ';'                                          { $$ = Stmt\Return_[null]; }
    | T_RETURN expr ';'                                     { $$ = Stmt\Return_[$2]; }
    | T_GLOBAL global_var_list ';'                          { $$ = Stmt\Global_[$2]; }
    | T_STATIC static_var_list ';'                          { $$ = Stmt\Static_[$2]; }
    | T_ECHO expr_list ';'                                  { $$ = Stmt\Echo_[$2]; }
    | T_INLINE_HTML                                         { $$ = Stmt\InlineHTML[$1]; }
    | yield_expr ';'                                        { $$ = Stmt\Expression[$1]; }
    | expr ';'                                              { $$ = Stmt\Expression[$1]; }
    | T_UNSET '(' variables_list ')' ';'                    { $$ = Stmt\Unset_[$3]; }
    | T_FOREACH '(' expr T_AS foreach_variable ')' foreach_statement
          { $$ = Stmt\Foreach_[$3, $5[0], ['keyVar' => null, 'byRef' => $5[1], 'stmts' => $7]]; }
    | T_FOREACH '(' expr T_AS variable T_DOUBLE_ARROW foreach_variable ')' foreach_statement
          { $$ = Stmt\Foreach_[$3, $7[0], ['keyVar' => $5, 'byRef' => $7[1], 'stmts' => $9]]; }
    | T_DECLARE '(' declare_list ')' declare_statement      { $$ = Stmt\Declare_[$3, $5]; }
    | T_TRY '{' inner_statement_list '}' catches optional_finally
          { $$ = Stmt\TryCatch[$3, $5, $6]; $this->checkTryCatch($$); }
    | T_THROW expr ';'                                      { $$ = Stmt\Throw_[$2]; }
    | T_GOTO identifier ';'                                 { $$ = Stmt\Goto_[$2]; }
    | identifier ':'                                        { $$ = Stmt\Label[$1]; }
    | expr error                                            { $$ = Stmt\Expression[$1]; }
    | error                                                 { $$ = array(); /* means: no statement */ }
;

statement:
      non_empty_statement                                   { $$ = $1; }
    | ';'
          { makeNop($$, $this->startAttributeStack[#1], $this->endAttributes);
            if ($$ === null) $$ = array(); /* means: no statement */ }
;

catches:
      /* empty */                                           { init(); }
    | catches catch                                         { push($1, $2); }
;

catch:
    T_CATCH '(' name plain_variable ')' '{' inner_statement_list '}'
        { $$ = Stmt\Catch_[array($3), $4, $7]; }
;

optional_finally:
      /* empty */                                           { $$ = null; }
    | T_FINALLY '{' inner_statement_list '}'                { $$ = Stmt\Finally_[$3]; }
;

variables_list:
      variable                                              { init($1); }
    | variables_list ',' variable                           { push($1, $3); }
;

optional_ref:
      /* empty */                                           { $$ = false; }
    | ampersand                                             { $$ = true; }
;

optional_arg_ref:
      /* empty */                                           { $$ = false; }
    | T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG                 { $$ = true; }
;

optional_ellipsis:
      /* empty */                                           { $$ = false; }
    | T_ELLIPSIS                                            { $$ = true; }
;

identifier_maybe_readonly:
      identifier                                            { $$ = $1; }
    | T_READONLY                                            { $$ = Node\Identifier[$1]; }
;

function_declaration_statement:
    T_FUNCTION optional_ref identifier_maybe_readonly '(' parameter_list ')' optional_return_type '{' inner_statement_list '}'
        { $$ = Stmt\Function_[$3, ['byRef' => $2, 'params' => $5, 'returnType' => $7, 'stmts' => $9]]; }
;

class_declaration_statement:
      class_entry_type identifier extends_from implements_list '{' class_statement_list '}'
          { $$ = Stmt\Class_[$2, ['type' => $1, 'extends' => $3, 'implements' => $4, 'stmts' => $6]];
            $this->checkClass($$, #2); }
    | T_INTERFACE identifier interface_extends_list '{' class_statement_list '}'
          { $$ = Stmt\Interface_[$2, ['extends' => $3, 'stmts' => $5]];
            $this->checkInterface($$, #2); }
    | T_TRAIT identifier '{' class_statement_list '}'
          { $$ = Stmt\Trait_[$2, ['stmts' => $4]]; }
;

class_entry_type:
      T_CLASS                                               { $$ = 0; }
    | T_ABSTRACT T_CLASS                                    { $$ = Stmt\Class_::MODIFIER_ABSTRACT; }
    | T_FINAL T_CLASS                                       { $$ = Stmt\Class_::MODIFIER_FINAL; }
;

extends_from:
      /* empty */                                           { $$ = null; }
    | T_EXTENDS class_name                                  { $$ = $2; }
;

interface_extends_list:
      /* empty */                                           { $$ = array(); }
    | T_EXTENDS class_name_list                             { $$ = $2; }
;

implements_list:
      /* empty */                                           { $$ = array(); }
    | T_IMPLEMENTS class_name_list                          { $$ = $2; }
;

class_name_list:
      class_name                                            { init($1); }
    | class_name_list ',' class_name                        { push($1, $3); }
;

for_statement:
      statement                                             { $$ = toArray($1); }
    | ':' inner_statement_list T_ENDFOR ';'                 { $$ = $2; }
;

foreach_statement:
      statement                                             { $$ = toArray($1); }
    | ':' inner_statement_list T_ENDFOREACH ';'             { $$ = $2; }
;

declare_statement:
      non_empty_statement                                   { $$ = toArray($1); }
    | ';'                                                   { $$ = null; }
    | ':' inner_statement_list T_ENDDECLARE ';'             { $$ = $2; }
;

declare_list:
      declare_list_element                                  { init($1); }
    | declare_list ',' declare_list_element                 { push($1, $3); }
;

declare_list_element:
      identifier '=' static_scalar                          { $$ = Stmt\DeclareDeclare[$1, $3]; }
;

switch_case_list:
      '{' case_list '}'                                     { $$ = $2; }
    | '{' ';' case_list '}'                                 { $$ = $3; }
    | ':' case_list T_ENDSWITCH ';'                         { $$ = $2; }
    | ':' ';' case_list T_ENDSWITCH ';'                     { $$ = $3; }
;

case_list:
      /* empty */                                           { init(); }
    | case_list case                                        { push($1, $2); }
;

case:
      T_CASE expr case_separator inner_statement_list_ex    { $$ = Stmt\Case_[$2, $4]; }
    | T_DEFAULT case_separator inner_statement_list_ex      { $$ = Stmt\Case_[null, $3]; }
;

case_separator:
      ':'
    | ';'
;

while_statement:
      statement                                             { $$ = toArray($1); }
    | ':' inner_statement_list T_ENDWHILE ';'               { $$ = $2; }
;

elseif_list:
      /* empty */                                           { init(); }
    | elseif_list elseif                                    { push($1, $2); }
;

elseif:
      T_ELSEIF parentheses_expr statement                   { $$ = Stmt\ElseIf_[$2, toArray($3)]; }
;

new_elseif_list:
      /* empty */                                           { init(); }
    | new_elseif_list new_elseif                            { push($1, $2); }
;

new_elseif:
     T_ELSEIF parentheses_expr ':' inner_statement_list     { $$ = Stmt\ElseIf_[$2, $4]; }
;

else_single:
      /* empty */                                           { $$ = null; }
    | T_ELSE statement                                      { $$ = Stmt\Else_[toArray($2)]; }
;

new_else_single:
      /* empty */                                           { $$ = null; }
    | T_ELSE ':' inner_statement_list                       { $$ = Stmt\Else_[$3]; }
;

foreach_variable:
      variable                                              { $$ = array($1, false); }
    | ampersand variable                                    { $$ = array($2, true); }
    | list_expr                                             { $$ = array($1, false); }
;

parameter_list:
      non_empty_parameter_list                              { $$ = $1; }
    | /* empty */                                           { $$ = array(); }
;

non_empty_parameter_list:
      parameter                                             { init($1); }
    | non_empty_parameter_list ',' parameter                { push($1, $3); }
;

parameter:
      optional_param_type optional_arg_ref optional_ellipsis plain_variable
          { $$ = Node\Param[$4, null, $1, $2, $3]; $this->checkParam($$); }
    | optional_param_type optional_arg_ref optional_ellipsis plain_variable '=' static_scalar
          { $$ = Node\Param[$4, $6, $1, $2, $3]; $this->checkParam($$); }
;

type:
      name                                                  { $$ = $1; }
    | T_ARRAY                                               { $$ = Node\Identifier['array']; }
    | T_CALLABLE                                            { $$ = Node\Identifier['callable']; }
;

optional_param_type:
      /* empty */                                           { $$ = null; }
    | type                                                  { $$ = $1; }
;

optional_return_type:
      /* empty */                                           { $$ = null; }
    | ':' type                                              { $$ = $2; }
;

argument_list:
      '(' ')'                                               { $$ = array(); }
    | '(' non_empty_argument_list ')'                       { $$ = $2; }
    | '(' yield_expr ')'                                    { $$ = array(Node\Arg[$2, false, false]); }
;

non_empty_argument_list:
      argument                                              { init($1); }
    | non_empty_argument_list ',' argument                  { push($1, $3); }
;

argument:
      expr                                                  { $$ = Node\Arg[$1, false, false]; }
    | ampersand variable                                    { $$ = Node\Arg[$2, true, false]; }
    | T_ELLIPSIS expr                                       { $$ = Node\Arg[$2, false, true]; }
;

global_var_list:
      global_var_list ',' global_var                        { push($1, $3); }
    | global_var                                            { init($1); }
;

global_var:
      plain_variable                                        { $$ = $1; }
    | '$' variable                                          { $$ = Expr\Variable[$2]; }
    | '$' '{' expr '}'                                      { $$ = Expr\Variable[$3]; }
;

static_var_list:
      static_var_list ',' static_var                        { push($1, $3); }
    | static_var                                            { init($1); }
;

static_var:
      plain_variable                                        { $$ = Stmt\StaticVar[$1, null]; }
    | plain_variable '=' static_scalar                      { $$ = Stmt\StaticVar[$1, $3]; }
;

class_statement_list_ex:
      class_statement_list_ex class_statement               { if ($2 !== null) { push($1, $2); } }
    | /* empty */                                           { init(); }
;

class_statement_list:
      class_statement_list_ex
          { makeZeroLengthNop($nop, $this->lookaheadStartAttributes);
            if ($nop !== null) { $1[] = $nop; } $$ = $1; }
;

class_statement:
      variable_modifiers property_declaration_list ';'
          { $$ = Stmt\Property[$1, $2]; $this->checkProperty($$, #1); }
    | T_CONST class_const_list ';'                          { $$ = Stmt\ClassConst[$2, 0]; }
    | method_modifiers T_FUNCTION optional_ref identifier_ex '(' parameter_list ')' optional_return_type method_body
          { $$ = Stmt\ClassMethod[$4, ['type' => $1, 'byRef' => $3, 'params' => $6, 'returnType' => $8, 'stmts' => $9]];
            $this->checkClassMethod($$, #1); }
    | T_USE class_name_list trait_adaptations               { $$ = Stmt\TraitUse[$2, $3]; }
;

trait_adaptations:
      ';'                                                   { $$ = array(); }
    | '{' trait_adaptation_list '}'                         { $$ = $2; }
;

trait_adaptation_list:
      /* empty */                                           { init(); }
    | trait_adaptation_list trait_adaptation                { push($1, $2); }
;

trait_adaptation:
      trait_method_reference_fully_qualified T_INSTEADOF class_name_list ';'
          { $$ = Stmt\TraitUseAdaptation\Precedence[$1[0], $1[1], $3]; }
    | trait_method_reference T_AS member_modifier identifier_ex ';'
          { $$ = Stmt\TraitUseAdaptation\Alias[$1[0], $1[1], $3, $4]; }
    | trait_method_reference T_AS member_modifier ';'
          { $$ = Stmt\TraitUseAdaptation\Alias[$1[0], $1[1], $3, null]; }
    | trait_method_reference T_AS identifier ';'
          { $$ = Stmt\TraitUseAdaptation\Alias[$1[0], $1[1], null, $3]; }
    | trait_method_reference T_AS reserved_non_modifiers_identifier ';'
          { $$ = Stmt\TraitUseAdaptation\Alias[$1[0], $1[1], null, $3]; }
;

trait_method_reference_fully_qualified:
      name T_PAAMAYIM_NEKUDOTAYIM identifier_ex             { $$ = array($1, $3); }
;
trait_method_reference:
      trait_method_reference_fully_qualified                { $$ = $1; }
    | identifier_ex                                         { $$ = array(null, $1); }
;

method_body:
      ';' /* abstract method */                             { $$ = null; }
    | '{' inner_statement_list '}'                          { $$ = $2; }
;

variable_modifiers:
      non_empty_member_modifiers                            { $$ = $1; }
    | T_VAR                                                 { $$ = 0; }
;

method_modifiers:
      /* empty */                                           { $$ = 0; }
    | non_empty_member_modifiers                            { $$ = $1; }
;

non_empty_member_modifiers:
      member_modifier                                       { $$ = $1; }
    | non_empty_member_modifiers member_modifier            { $this->checkModifier($1, $2, #2); $$ = $1 | $2; }
;

member_modifier:
      T_PUBLIC                                              { $$ = Stmt\Class_::MODIFIER_PUBLIC; }
    | T_PROTECTED                                           { $$ = Stmt\Class_::MODIFIER_PROTECTED; }
    | T_PRIVATE                                             { $$ = Stmt\Class_::MODIFIER_PRIVATE; }
    | T_STATIC                                              { $$ = Stmt\Class_::MODIFIER_STATIC; }
    | T_ABSTRACT                                            { $$ = Stmt\Class_::MODIFIER_ABSTRACT; }
    | T_FINAL                                               { $$ = Stmt\Class_::MODIFIER_FINAL; }
;

property_declaration_list:
      property_declaration                                  { init($1); }
    | property_declaration_list ',' property_declaration    { push($1, $3); }
;

property_decl_name:
      T_VARIABLE                                            { $$ = Node\VarLikeIdentifier[parseVar($1)]; }
;

property_declaration:
      property_decl_name                                    { $$ = Stmt\PropertyProperty[$1, null]; }
    | property_decl_name '=' static_scalar                  { $$ = Stmt\PropertyProperty[$1, $3]; }
;

expr_list:
      expr_list ',' expr                                    { push($1, $3); }
    | expr                                                  { init($1); }
;

for_expr:
      /* empty */                                           { $$ = array(); }
    | expr_list                                             { $$ = $1; }
;

expr:
      variable                                              { $$ = $1; }
    | list_expr '=' expr                                    { $$ = Expr\Assign[$1, $3]; }
    | variable '=' expr                                     { $$ = Expr\Assign[$1, $3]; }
    | variable '=' ampersand variable                       { $$ = Expr\AssignRef[$1, $4]; }
    | variable '=' ampersand new_expr                       { $$ = Expr\AssignRef[$1, $4]; }
    | new_expr                                              { $$ = $1; }
    | T_CLONE expr                                          { $$ = Expr\Clone_[$2]; }
    | variable T_PLUS_EQUAL expr                            { $$ = Expr\AssignOp\Plus      [$1, $3]; }
    | variable T_MINUS_EQUAL expr                           { $$ = Expr\AssignOp\Minus     [$1, $3]; }
    | variable T_MUL_EQUAL expr                             { $$ = Expr\AssignOp\Mul       [$1, $3]; }
    | variable T_DIV_EQUAL expr                             { $$ = Expr\AssignOp\Div       [$1, $3]; }
    | variable T_CONCAT_EQUAL expr                          { $$ = Expr\AssignOp\Concat    [$1, $3]; }
    | variable T_MOD_EQUAL expr                             { $$ = Expr\AssignOp\Mod       [$1, $3]; }
    | variable T_AND_EQUAL expr                             { $$ = Expr\AssignOp\BitwiseAnd[$1, $3]; }
    | variable T_OR_EQUAL expr                              { $$ = Expr\AssignOp\BitwiseOr [$1, $3]; }
    | variable T_XOR_EQUAL expr                             { $$ = Expr\AssignOp\BitwiseXor[$1, $3]; }
    | variable T_SL_EQUAL expr                              { $$ = Expr\AssignOp\ShiftLeft [$1, $3]; }
    | variable T_SR_EQUAL expr                              { $$ = Expr\AssignOp\ShiftRight[$1, $3]; }
    | variable T_POW_EQUAL expr                             { $$ = Expr\AssignOp\Pow       [$1, $3]; }
    | variable T_COALESCE_EQUAL expr                        { $$ = Expr\AssignOp\Coalesce  [$1, $3]; }
    | variable T_INC                                        { $$ = Expr\PostInc[$1]; }
    | T_INC variable                                        { $$ = Expr\PreInc [$2]; }
    | variable T_DEC                                        { $$ = Expr\PostDec[$1]; }
    | T_DEC variable                                        { $$ = Expr\PreDec [$2]; }
    | expr T_BOOLEAN_OR expr                                { $$ = Expr\BinaryOp\BooleanOr [$1, $3]; }
    | expr T_BOOLEAN_AND expr                               { $$ = Expr\BinaryOp\BooleanAnd[$1, $3]; }
    | expr T_LOGICAL_OR expr                                { $$ = Expr\BinaryOp\LogicalOr [$1, $3]; }
    | expr T_LOGICAL_AND expr                               { $$ = Expr\BinaryOp\LogicalAnd[$1, $3]; }
    | expr T_LOGICAL_XOR expr                               { $$ = Expr\BinaryOp\LogicalXor[$1, $3]; }
    | expr '|' expr                                         { $$ = Expr\BinaryOp\BitwiseOr [$1, $3]; }
    | expr T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG expr   { $$ = Expr\BinaryOp\BitwiseAnd[$1, $3]; }
    | expr T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG expr       { $$ = Expr\BinaryOp\BitwiseAnd[$1, $3]; }
    | expr '^' expr                                         { $$ = Expr\BinaryOp\BitwiseXor[$1, $3]; }
    | expr '.' expr                                         { $$ = Expr\BinaryOp\Concat    [$1, $3]; }
    | expr '+' expr                                         { $$ = Expr\BinaryOp\Plus      [$1, $3]; }
    | expr '-' expr                                         { $$ = Expr\BinaryOp\Minus     [$1, $3]; }
    | expr '*' expr                                         { $$ = Expr\BinaryOp\Mul       [$1, $3]; }
    | expr '/' expr                                         { $$ = Expr\BinaryOp\Div       [$1, $3]; }
    | expr '%' expr                                         { $$ = Expr\BinaryOp\Mod       [$1, $3]; }
    | expr T_SL expr                                        { $$ = Expr\BinaryOp\ShiftLeft [$1, $3]; }
    | expr T_SR expr                                        { $$ = Expr\BinaryOp\ShiftRight[$1, $3]; }
    | expr T_POW expr                                       { $$ = Expr\BinaryOp\Pow       [$1, $3]; }
    | '+' expr %prec T_INC                                  { $$ = Expr\UnaryPlus [$2]; }
    | '-' expr %prec T_INC                                  { $$ = Expr\UnaryMinus[$2]; }
    | '!' expr                                              { $$ = Expr\BooleanNot[$2]; }
    | '~' expr                                              { $$ = Expr\BitwiseNot[$2]; }
    | expr T_IS_IDENTICAL expr                              { $$ = Expr\BinaryOp\Identical     [$1, $3]; }
    | expr T_IS_NOT_IDENTICAL expr                          { $$ = Expr\BinaryOp\NotIdentical  [$1, $3]; }
    | expr T_IS_EQUAL expr                                  { $$ = Expr\BinaryOp\Equal         [$1, $3]; }
    | expr T_IS_NOT_EQUAL expr                              { $$ = Expr\BinaryOp\NotEqual      [$1, $3]; }
    | expr T_SPACESHIP expr                                 { $$ = Expr\BinaryOp\Spaceship     [$1, $3]; }
    | expr '<' expr                                         { $$ = Expr\BinaryOp\Smaller       [$1, $3]; }
    | expr T_IS_SMALLER_OR_EQUAL expr                       { $$ = Expr\BinaryOp\SmallerOrEqual[$1, $3]; }
    | expr '>' expr                                         { $$ = Expr\BinaryOp\Greater       [$1, $3]; }
    | expr T_IS_GREATER_OR_EQUAL expr                       { $$ = Expr\BinaryOp\GreaterOrEqual[$1, $3]; }
    | expr T_INSTANCEOF class_name_reference                { $$ = Expr\Instanceof_[$1, $3]; }
    | parentheses_expr                                      { $$ = $1; }
    /* we need a separate '(' new_expr ')' rule to avoid problems caused by a s/r conflict */
    | '(' new_expr ')'                                      { $$ = $2; }
    | expr '?' expr ':' expr                                { $$ = Expr\Ternary[$1, $3,   $5]; }
    | expr '?' ':' expr                                     { $$ = Expr\Ternary[$1, null, $4]; }
    | expr T_COALESCE expr                                  { $$ = Expr\BinaryOp\Coalesce[$1, $3]; }
    | T_ISSET '(' variables_list ')'                        { $$ = Expr\Isset_[$3]; }
    | T_EMPTY '(' expr ')'                                  { $$ = Expr\Empty_[$3]; }
    | T_INCLUDE expr                                        { $$ = Expr\Include_[$2, Expr\Include_::TYPE_INCLUDE]; }
    | T_INCLUDE_ONCE expr                                   { $$ = Expr\Include_[$2, Expr\Include_::TYPE_INCLUDE_ONCE]; }
    | T_EVAL parentheses_expr                               { $$ = Expr\Eval_[$2]; }
    | T_REQUIRE expr                                        { $$ = Expr\Include_[$2, Expr\Include_::TYPE_REQUIRE]; }
    | T_REQUIRE_ONCE expr                                   { $$ = Expr\Include_[$2, Expr\Include_::TYPE_REQUIRE_ONCE]; }
    | T_INT_CAST expr                                       { $$ = Expr\Cast\Int_    [$2]; }
    | T_DOUBLE_CAST expr
          { $attrs = attributes();
            $attrs['kind'] = $this->getFloatCastKind($1);
            $$ = new Expr\Cast\Double($2, $attrs); }
    | T_STRING_CAST expr                                    { $$ = Expr\Cast\String_ [$2]; }
    | T_ARRAY_CAST expr                                     { $$ = Expr\Cast\Array_  [$2]; }
    | T_OBJECT_CAST expr                                    { $$ = Expr\Cast\Object_ [$2]; }
    | T_BOOL_CAST expr                                      { $$ = Expr\Cast\Bool_   [$2]; }
    | T_UNSET_CAST expr                                     { $$ = Expr\Cast\Unset_  [$2]; }
    | T_EXIT exit_expr
          { $attrs = attributes();
            $attrs['kind'] = strtolower($1) === 'exit' ? Expr\Exit_::KIND_EXIT : Expr\Exit_::KIND_DIE;
            $$ = new Expr\Exit_($2, $attrs); }
    | '@' expr                                              { $$ = Expr\ErrorSuppress[$2]; }
    | scalar                                                { $$ = $1; }
    | array_expr                                            { $$ = $1; }
    | scalar_dereference                                    { $$ = $1; }
    | '`' backticks_expr '`'                                { $$ = Expr\ShellExec[$2]; }
    | T_PRINT expr                                          { $$ = Expr\Print_[$2]; }
    | T_YIELD                                               { $$ = Expr\Yield_[null, null]; }
    | T_YIELD_FROM expr                                     { $$ = Expr\YieldFrom[$2]; }
    | T_FUNCTION optional_ref '(' parameter_list ')' lexical_vars optional_return_type
      '{' inner_statement_list '}'
          { $$ = Expr\Closure[['static' => false, 'byRef' => $2, 'params' => $4, 'uses' => $6, 'returnType' => $7, 'stmts' => $9]]; }
    | T_STATIC T_FUNCTION optional_ref '(' parameter_list ')' lexical_vars optional_return_type
      '{' inner_statement_list '}'
          { $$ = Expr\Closure[['static' => true, 'byRef' => $3, 'params' => $5, 'uses' => $7, 'returnType' => $8, 'stmts' => $10]]; }
;

parentheses_expr:
      '(' expr ')'                                          { $$ = $2; }
    | '(' yield_expr ')'                                    { $$ = $2; }
;

yield_expr:
      T_YIELD expr                                          { $$ = Expr\Yield_[$2, null]; }
    | T_YIELD expr T_DOUBLE_ARROW expr                      { $$ = Expr\Yield_[$4, $2]; }
;

array_expr:
      T_ARRAY '(' array_pair_list ')'
          { $attrs = attributes(); $attrs['kind'] = Expr\Array_::KIND_LONG;
            $$ = new Expr\Array_($3, $attrs); }
    | '[' array_pair_list ']'
          { $attrs = attributes(); $attrs['kind'] = Expr\Array_::KIND_SHORT;
            $$ = new Expr\Array_($2, $attrs); }
;

scalar_dereference:
      array_expr '[' dim_offset ']'                         { $$ = Expr\ArrayDimFetch[$1, $3]; }
    | T_CONSTANT_ENCAPSED_STRING '[' dim_offset ']'         { $$ = Expr\ArrayDimFetch[Scalar\String_::fromString($1, attributes()), $3]; }
    | constant '[' dim_offset ']'                           { $$ = Expr\ArrayDimFetch[$1, $3]; }
    | scalar_dereference '[' dim_offset ']'                 { $$ = Expr\ArrayDimFetch[$1, $3]; }
    /* alternative array syntax missing intentionally */
;

anonymous_class:
      T_CLASS ctor_arguments extends_from implements_list '{' class_statement_list '}'
          { $$ = array(Stmt\Class_[null, ['type' => 0, 'extends' => $3, 'implements' => $4, 'stmts' => $6]], $2);
            $this->checkClass($$[0], -1); }
;

new_expr:
      T_NEW class_name_reference ctor_arguments             { $$ = Expr\New_[$2, $3]; }
    | T_NEW anonymous_class
          { list($class, $ctorArgs) = $2; $$ = Expr\New_[$class, $ctorArgs]; }
;

lexical_vars:
      /* empty */                                           { $$ = array(); }
    | T_USE '(' lexical_var_list ')'                        { $$ = $3; }
;

lexical_var_list:
      lexical_var                                           { init($1); }
    | lexical_var_list ',' lexical_var                      { push($1, $3); }
;

lexical_var:
      optional_ref plain_variable                           { $$ = Expr\ClosureUse[$2, $1]; }
;

name_readonly:
      T_READONLY                                            { $$ = Name[$1]; }
;

function_call:
      name argument_list                                    { $$ = Expr\FuncCall[$1, $2]; }
    | name_readonly argument_list                           { $$ = Expr\FuncCall[$1, $2]; }
    | class_name_or_var T_PAAMAYIM_NEKUDOTAYIM identifier_ex argument_list
          { $$ = Expr\StaticCall[$1, $3, $4]; }
    | class_name_or_var T_PAAMAYIM_NEKUDOTAYIM '{' expr '}' argument_list
          { $$ = Expr\StaticCall[$1, $4, $6]; }
    | static_property argument_list
          { $$ = $this->fixupPhp5StaticPropCall($1, $2, attributes()); }
    | variable_without_objects argument_list
          { $$ = Expr\FuncCall[$1, $2]; }
    | function_call '[' dim_offset ']'                      { $$ = Expr\ArrayDimFetch[$1, $3]; }
      /* alternative array syntax missing intentionally */
;

class_name:
      T_STATIC                                              { $$ = Name[$1]; }
    | name                                                  { $$ = $1; }
;

name:
      T_STRING                                              { $$ = Name[$1]; }
    | T_NAME_QUALIFIED                                      { $$ = Name[$1]; }
    | T_NAME_FULLY_QUALIFIED                                { $$ = Name\FullyQualified[substr($1, 1)]; }
    | T_NAME_RELATIVE                                       { $$ = Name\Relative[substr($1, 10)]; }
;

class_name_reference:
      class_name                                            { $$ = $1; }
    | dynamic_class_name_reference                          { $$ = $1; }
;

dynamic_class_name_reference:
      object_access_for_dcnr                                { $$ = $1; }
    | base_variable                                         { $$ = $1; }
;

class_name_or_var:
      class_name                                            { $$ = $1; }
    | reference_variable                                    { $$ = $1; }
;

object_access_for_dcnr:
      base_variable T_OBJECT_OPERATOR object_property
          { $$ = Expr\PropertyFetch[$1, $3]; }
    | object_access_for_dcnr T_OBJECT_OPERATOR object_property
          { $$ = Expr\PropertyFetch[$1, $3]; }
    | object_access_for_dcnr '[' dim_offset ']'             { $$ = Expr\ArrayDimFetch[$1, $3]; }
    | object_access_for_dcnr '{' expr '}'                   { $$ = Expr\ArrayDimFetch[$1, $3]; }
;

exit_expr:
      /* empty */                                           { $$ = null; }
    | '(' ')'                                               { $$ = null; }
    | parentheses_expr                                      { $$ = $1; }
;

backticks_expr:
      /* empty */                                           { $$ = array(); }
    | T_ENCAPSED_AND_WHITESPACE
          { $$ = array(Scalar\EncapsedStringPart[Scalar\String_::parseEscapeSequences($1, '`', false)]); }
    | encaps_list                                           { parseEncapsed($1, '`', false); $$ = $1; }
;

ctor_arguments:
      /* empty */                                           { $$ = array(); }
    | argument_list                                         { $$ = $1; }
;

common_scalar:
      T_LNUMBER                                             { $$ = $this->parseLNumber($1, attributes(), true); }
    | T_DNUMBER                                             { $$ = Scalar\DNumber::fromString($1, attributes()); }
    | T_CONSTANT_ENCAPSED_STRING                            { $$ = Scalar\String_::fromString($1, attributes(), false); }
    | T_LINE                                                { $$ = Scalar\MagicConst\Line[]; }
    | T_FILE                                                { $$ = Scalar\MagicConst\File[]; }
    | T_DIR                                                 { $$ = Scalar\MagicConst\Dir[]; }
    | T_CLASS_C                                             { $$ = Scalar\MagicConst\Class_[]; }
    | T_TRAIT_C                                             { $$ = Scalar\MagicConst\Trait_[]; }
    | T_METHOD_C                                            { $$ = Scalar\MagicConst\Method[]; }
    | T_FUNC_C                                              { $$ = Scalar\MagicConst\Function_[]; }
    | T_NS_C                                                { $$ = Scalar\MagicConst\Namespace_[]; }
    | T_START_HEREDOC T_ENCAPSED_AND_WHITESPACE T_END_HEREDOC
          { $$ = $this->parseDocString($1, $2, $3, attributes(), stackAttributes(#3), false); }
    | T_START_HEREDOC T_END_HEREDOC
          { $$ = $this->parseDocString($1, '', $2, attributes(), stackAttributes(#2), false); }
;

static_scalar:
      common_scalar                                         { $$ = $1; }
    | class_name T_PAAMAYIM_NEKUDOTAYIM identifier_ex       { $$ = Expr\ClassConstFetch[$1, $3]; }
    | name                                                  { $$ = Expr\ConstFetch[$1]; }
    | T_ARRAY '(' static_array_pair_list ')'                { $$ = Expr\Array_[$3]; }
    | '[' static_array_pair_list ']'                        { $$ = Expr\Array_[$2]; }
    | static_operation                                      { $$ = $1; }
;

static_operation:
      static_scalar T_BOOLEAN_OR static_scalar              { $$ = Expr\BinaryOp\BooleanOr [$1, $3]; }
    | static_scalar T_BOOLEAN_AND static_scalar             { $$ = Expr\BinaryOp\BooleanAnd[$1, $3]; }
    | static_scalar T_LOGICAL_OR static_scalar              { $$ = Expr\BinaryOp\LogicalOr [$1, $3]; }
    | static_scalar T_LOGICAL_AND static_scalar             { $$ = Expr\BinaryOp\LogicalAnd[$1, $3]; }
    | static_scalar T_LOGICAL_XOR static_scalar             { $$ = Expr\BinaryOp\LogicalXor[$1, $3]; }
    | static_scalar '|' static_scalar                       { $$ = Expr\BinaryOp\BitwiseOr [$1, $3]; }
    | static_scalar T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG static_scalar
          { $$ = Expr\BinaryOp\BitwiseAnd[$1, $3]; }
    | static_scalar T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG static_scalar
          { $$ = Expr\BinaryOp\BitwiseAnd[$1, $3]; }
    | static_scalar '^' static_scalar                       { $$ = Expr\BinaryOp\BitwiseXor[$1, $3]; }
    | static_scalar '.' static_scalar                       { $$ = Expr\BinaryOp\Concat    [$1, $3]; }
    | static_scalar '+' static_scalar                       { $$ = Expr\BinaryOp\Plus      [$1, $3]; }
    | static_scalar '-' static_scalar                       { $$ = Expr\BinaryOp\Minus     [$1, $3]; }
    | static_scalar '*' static_scalar                       { $$ = Expr\BinaryOp\Mul       [$1, $3]; }
    | static_scalar '/' static_scalar                       { $$ = Expr\BinaryOp\Div       [$1, $3]; }
    | static_scalar '%' static_scalar                       { $$ = Expr\BinaryOp\Mod       [$1, $3]; }
    | static_scalar T_SL static_scalar                      { $$ = Expr\BinaryOp\ShiftLeft [$1, $3]; }
    | static_scalar T_SR static_scalar                      { $$ = Expr\BinaryOp\ShiftRight[$1, $3]; }
    | static_scalar T_POW static_scalar                     { $$ = Expr\BinaryOp\Pow       [$1, $3]; }
    | '+' static_scalar %prec T_INC                         { $$ = Expr\UnaryPlus [$2]; }
    | '-' static_scalar %prec T_INC                         { $$ = Expr\UnaryMinus[$2]; }
    | '!' static_scalar                                     { $$ = Expr\BooleanNot[$2]; }
    | '~' static_scalar                                     { $$ = Expr\BitwiseNot[$2]; }
    | static_scalar T_IS_IDENTICAL static_scalar            { $$ = Expr\BinaryOp\Identical     [$1, $3]; }
    | static_scalar T_IS_NOT_IDENTICAL static_scalar        { $$ = Expr\BinaryOp\NotIdentical  [$1, $3]; }
    | static_scalar T_IS_EQUAL static_scalar                { $$ = Expr\BinaryOp\Equal         [$1, $3]; }
    | static_scalar T_IS_NOT_EQUAL static_scalar            { $$ = Expr\BinaryOp\NotEqual      [$1, $3]; }
    | static_scalar '<' static_scalar                       { $$ = Expr\BinaryOp\Smaller       [$1, $3]; }
    | static_scalar T_IS_SMALLER_OR_EQUAL static_scalar     { $$ = Expr\BinaryOp\SmallerOrEqual[$1, $3]; }
    | static_scalar '>' static_scalar                       { $$ = Expr\BinaryOp\Greater       [$1, $3]; }
    | static_scalar T_IS_GREATER_OR_EQUAL static_scalar     { $$ = Expr\BinaryOp\GreaterOrEqual[$1, $3]; }
    | static_scalar '?' static_scalar ':' static_scalar     { $$ = Expr\Ternary[$1, $3,   $5]; }
    | static_scalar '?' ':' static_scalar                   { $$ = Expr\Ternary[$1, null, $4]; }
    | static_scalar '[' static_scalar ']'                   { $$ = Expr\ArrayDimFetch[$1, $3]; }
    | '(' static_scalar ')'                                 { $$ = $2; }
;

constant:
      name                                                  { $$ = Expr\ConstFetch[$1]; }
    | class_name_or_var T_PAAMAYIM_NEKUDOTAYIM identifier_ex
          { $$ = Expr\ClassConstFetch[$1, $3]; }
;

scalar:
      common_scalar                                         { $$ = $1; }
    | constant                                              { $$ = $1; }
    | '"' encaps_list '"'
          { $attrs = attributes(); $attrs['kind'] = Scalar\String_::KIND_DOUBLE_QUOTED;
            parseEncapsed($2, '"', true); $$ = new Scalar\Encapsed($2, $attrs); }
    | T_START_HEREDOC encaps_list T_END_HEREDOC
          { $$ = $this->parseDocString($1, $2, $3, attributes(), stackAttributes(#3), true); }
;

static_array_pair_list:
      /* empty */                                           { $$ = array(); }
    | non_empty_static_array_pair_list optional_comma       { $$ = $1; }
;

optional_comma:
      /* empty */
    | ','
;

non_empty_static_array_pair_list:
      non_empty_static_array_pair_list ',' static_array_pair { push($1, $3); }
    | static_array_pair                                      { init($1); }
;

static_array_pair:
      static_scalar T_DOUBLE_ARROW static_scalar            { $$ = Expr\ArrayItem[$3, $1,   false]; }
    | static_scalar                                         { $$ = Expr\ArrayItem[$1, null, false]; }
;

variable:
      object_access                                         { $$ = $1; }
    | base_variable                                         { $$ = $1; }
    | function_call                                         { $$ = $1; }
    | new_expr_array_deref                                  { $$ = $1; }
;

new_expr_array_deref:
      '(' new_expr ')' '[' dim_offset ']'                   { $$ = Expr\ArrayDimFetch[$2, $5]; }
    | new_expr_array_deref '[' dim_offset ']'               { $$ = Expr\ArrayDimFetch[$1, $3]; }
      /* alternative array syntax missing intentionally */
;

object_access:
      variable_or_new_expr T_OBJECT_OPERATOR object_property
          { $$ = Expr\PropertyFetch[$1, $3]; }
    | variable_or_new_expr T_OBJECT_OPERATOR object_property argument_list
          { $$ = Expr\MethodCall[$1, $3, $4]; }
    | object_access argument_list                           { $$ = Expr\FuncCall[$1, $2]; }
    | object_access '[' dim_offset ']'                      { $$ = Expr\ArrayDimFetch[$1, $3]; }
    | object_access '{' expr '}'                            { $$ = Expr\ArrayDimFetch[$1, $3]; }
;

variable_or_new_expr:
      variable                                              { $$ = $1; }
    | '(' new_expr ')'                                      { $$ = $2; }
;

variable_without_objects:
      reference_variable                                    { $$ = $1; }
    | '$' variable_without_objects                          { $$ = Expr\Variable[$2]; }
;

base_variable:
      variable_without_objects                              { $$ = $1; }
    | static_property                                       { $$ = $1; }
;

static_property:
      class_name_or_var T_PAAMAYIM_NEKUDOTAYIM '$' reference_variable
          { $$ = Expr\StaticPropertyFetch[$1, $4]; }
    | static_property_with_arrays                           { $$ = $1; }
;

static_property_simple_name:
      T_VARIABLE
          { $var = parseVar($1); $$ = \is_string($var) ? Node\VarLikeIdentifier[$var] : $var; }
;

static_property_with_arrays:
      class_name_or_var T_PAAMAYIM_NEKUDOTAYIM static_property_simple_name
          { $$ = Expr\StaticPropertyFetch[$1, $3]; }
    | class_name_or_var T_PAAMAYIM_NEKUDOTAYIM '$' '{' expr '}'
          { $$ = Expr\StaticPropertyFetch[$1, $5]; }
    | static_property_with_arrays '[' dim_offset ']'        { $$ = Expr\ArrayDimFetch[$1, $3]; }
    | static_property_with_arrays '{' expr '}'              { $$ = Expr\ArrayDimFetch[$1, $3]; }
;

reference_variable:
      reference_variable '[' dim_offset ']'                 { $$ = Expr\ArrayDimFetch[$1, $3]; }
    | reference_variable '{' expr '}'                       { $$ = Expr\ArrayDimFetch[$1, $3]; }
    | plain_variable                                        { $$ = $1; }
    | '$' '{' expr '}'                                      { $$ = Expr\Variable[$3]; }
;

dim_offset:
      /* empty */                                           { $$ = null; }
    | expr                                                  { $$ = $1; }
;

object_property:
      identifier                                            { $$ = $1; }
    | '{' expr '}'                                          { $$ = $2; }
    | variable_without_objects                              { $$ = $1; }
    | error                                                 { $$ = Expr\Error[]; $this->errorState = 2; }
;

list_expr:
      T_LIST '(' list_expr_elements ')'                     { $$ = Expr\List_[$3]; }
;

list_expr_elements:
      list_expr_elements ',' list_expr_element              { push($1, $3); }
    | list_expr_element                                     { init($1); }
;

list_expr_element:
      variable                                              { $$ = Expr\ArrayItem[$1, null, false]; }
    | list_expr                                             { $$ = Expr\ArrayItem[$1, null, false]; }
    | /* empty */                                           { $$ = null; }
;

array_pair_list:
      /* empty */                                           { $$ = array(); }
    | non_empty_array_pair_list optional_comma              { $$ = $1; }
;

non_empty_array_pair_list:
      non_empty_array_pair_list ',' array_pair              { push($1, $3); }
    | array_pair                                            { init($1); }
;

array_pair:
      expr T_DOUBLE_ARROW expr                              { $$ = Expr\ArrayItem[$3, $1,   false]; }
    | expr                                                  { $$ = Expr\ArrayItem[$1, null, false]; }
    | expr T_DOUBLE_ARROW ampersand variable                { $$ = Expr\ArrayItem[$4, $1,   true]; }
    | ampersand variable                                    { $$ = Expr\ArrayItem[$2, null, true]; }
    | T_ELLIPSIS expr                                       { $$ = new Expr\ArrayItem($2, null, false, attributes(), true); }
;

encaps_list:
      encaps_list encaps_var                                { push($1, $2); }
    | encaps_list encaps_string_part                        { push($1, $2); }
    | encaps_var                                            { init($1); }
    | encaps_string_part encaps_var                         { init($1, $2); }
;

encaps_string_part:
      T_ENCAPSED_AND_WHITESPACE                             { $$ = Scalar\EncapsedStringPart[$1]; }
;

encaps_str_varname:
      T_STRING_VARNAME                                      { $$ = Expr\Variable[$1]; }
;

encaps_var:
      plain_variable                                        { $$ = $1; }
    | plain_variable '[' encaps_var_offset ']'              { $$ = Expr\ArrayDimFetch[$1, $3]; }
    | plain_variable T_OBJECT_OPERATOR identifier           { $$ = Expr\PropertyFetch[$1, $3]; }
    | T_DOLLAR_OPEN_CURLY_BRACES expr '}'                   { $$ = Expr\Variable[$2]; }
    | T_DOLLAR_OPEN_CURLY_BRACES T_STRING_VARNAME '}'       { $$ = Expr\Variable[$2]; }
    | T_DOLLAR_OPEN_CURLY_BRACES encaps_str_varname '[' expr ']' '}'
          { $$ = Expr\ArrayDimFetch[$2, $4]; }
    | T_CURLY_OPEN variable '}'                             { $$ = $2; }
;

encaps_var_offset:
      T_STRING                                              { $$ = Scalar\String_[$1]; }
    | T_NUM_STRING                                          { $$ = $this->parseNumString($1, attributes()); }
    | plain_variable                                        { $$ = $1; }
;

%%
%pure_parser
%expect 2

%tokens

%%

start:
    top_statement_list                                      { $$ = $this->handleNamespaces($1); }
;

top_statement_list_ex:
      top_statement_list_ex top_statement                   { pushNormalizing($1, $2); }
    | /* empty */                                           { init(); }
;

top_statement_list:
      top_statement_list_ex
          { makeZeroLengthNop($nop, $this->lookaheadStartAttributes);
            if ($nop !== null) { $1[] = $nop; } $$ = $1; }
;

ampersand:
      T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG
    | T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG
;

reserved_non_modifiers:
      T_INCLUDE | T_INCLUDE_ONCE | T_EVAL | T_REQUIRE | T_REQUIRE_ONCE | T_LOGICAL_OR | T_LOGICAL_XOR | T_LOGICAL_AND
    | T_INSTANCEOF | T_NEW | T_CLONE | T_EXIT | T_IF | T_ELSEIF | T_ELSE | T_ENDIF | T_ECHO | T_DO | T_WHILE
    | T_ENDWHILE | T_FOR | T_ENDFOR | T_FOREACH | T_ENDFOREACH | T_DECLARE | T_ENDDECLARE | T_AS | T_TRY | T_CATCH
    | T_FINALLY | T_THROW | T_USE | T_INSTEADOF | T_GLOBAL | T_VAR | T_UNSET | T_ISSET | T_EMPTY | T_CONTINUE | T_GOTO
    | T_FUNCTION | T_CONST | T_RETURN | T_PRINT | T_YIELD | T_LIST | T_SWITCH | T_ENDSWITCH | T_CASE | T_DEFAULT
    | T_BREAK | T_ARRAY | T_CALLABLE | T_EXTENDS | T_IMPLEMENTS | T_NAMESPACE | T_TRAIT | T_INTERFACE | T_CLASS
    | T_CLASS_C | T_TRAIT_C | T_FUNC_C | T_METHOD_C | T_LINE | T_FILE | T_DIR | T_NS_C | T_HALT_COMPILER | T_FN
    | T_MATCH | T_ENUM
;

semi_reserved:
      reserved_non_modifiers
    | T_STATIC | T_ABSTRACT | T_FINAL | T_PRIVATE | T_PROTECTED | T_PUBLIC | T_READONLY
;

identifier_maybe_reserved:
      T_STRING                                              { $$ = Node\Identifier[$1]; }
    | semi_reserved                                         { $$ = Node\Identifier[$1]; }
;

identifier_not_reserved:
      T_STRING                                              { $$ = Node\Identifier[$1]; }
;

reserved_non_modifiers_identifier:
      reserved_non_modifiers                                { $$ = Node\Identifier[$1]; }
;

namespace_declaration_name:
      T_STRING                                              { $$ = Name[$1]; }
    | semi_reserved                                         { $$ = Name[$1]; }
    | T_NAME_QUALIFIED                                      { $$ = Name[$1]; }
;

namespace_name:
      T_STRING                                              { $$ = Name[$1]; }
    | T_NAME_QUALIFIED                                      { $$ = Name[$1]; }
;

legacy_namespace_name:
      namespace_name                                        { $$ = $1; }
    | T_NAME_FULLY_QUALIFIED                                { $$ = Name[substr($1, 1)]; }
;

plain_variable:
      T_VARIABLE                                            { $$ = Expr\Variable[parseVar($1)]; }
;

semi:
      ';'                                                   { /* nothing */ }
    | error                                                 { /* nothing */ }
;

no_comma:
      /* empty */ { /* nothing */ }
    | ',' { $this->emitError(new Error('A trailing comma is not allowed here', attributes())); }
;

optional_comma:
      /* empty */
    | ','
;

attribute_decl:
      class_name                                            { $$ = Node\Attribute[$1, []]; }
    | class_name argument_list                              { $$ = Node\Attribute[$1, $2]; }
;

attribute_group:
      attribute_decl                                        { init($1); }
    | attribute_group ',' attribute_decl                    { push($1, $3); }
;

attribute:
      T_ATTRIBUTE attribute_group optional_comma ']'        { $$ = Node\AttributeGroup[$2]; }
;

attributes:
      attribute                                             { init($1); }
    | attributes attribute                                  { push($1, $2); }
;

optional_attributes:
      /* empty */                                           { $$ = []; }
    | attributes                                            { $$ = $1; }
;

top_statement:
      statement                                             { $$ = $1; }
    | function_declaration_statement                        { $$ = $1; }
    | class_declaration_statement                           { $$ = $1; }
    | T_HALT_COMPILER
          { $$ = Stmt\HaltCompiler[$this->lexer->handleHaltCompiler()]; }
    | T_NAMESPACE namespace_declaration_name semi
          { $$ = Stmt\Namespace_[$2, null];
            $$->setAttribute('kind', Stmt\Namespace_::KIND_SEMICOLON);
            $this->checkNamespace($$); }
    | T_NAMESPACE namespace_declaration_name '{' top_statement_list '}'
          { $$ = Stmt\Namespace_[$2, $4];
            $$->setAttribute('kind', Stmt\Namespace_::KIND_BRACED);
            $this->checkNamespace($$); }
    | T_NAMESPACE '{' top_statement_list '}'
          { $$ = Stmt\Namespace_[null, $3];
            $$->setAttribute('kind', Stmt\Namespace_::KIND_BRACED);
            $this->checkNamespace($$); }
    | T_USE use_declarations semi                           { $$ = Stmt\Use_[$2, Stmt\Use_::TYPE_NORMAL]; }
    | T_USE use_type use_declarations semi                  { $$ = Stmt\Use_[$3, $2]; }
    | group_use_declaration semi                            { $$ = $1; }
    | T_CONST constant_declaration_list semi                { $$ = Stmt\Const_[$2]; }
;

use_type:
      T_FUNCTION                                            { $$ = Stmt\Use_::TYPE_FUNCTION; }
    | T_CONST                                               { $$ = Stmt\Use_::TYPE_CONSTANT; }
;

group_use_declaration:
      T_USE use_type legacy_namespace_name T_NS_SEPARATOR '{' unprefixed_use_declarations '}'
          { $$ = Stmt\GroupUse[$3, $6, $2]; }
    | T_USE legacy_namespace_name T_NS_SEPARATOR '{' inline_use_declarations '}'
          { $$ = Stmt\GroupUse[$2, $5, Stmt\Use_::TYPE_UNKNOWN]; }
;

unprefixed_use_declarations:
      non_empty_unprefixed_use_declarations optional_comma  { $$ = $1; }
;

non_empty_unprefixed_use_declarations:
      non_empty_unprefixed_use_declarations ',' unprefixed_use_declaration
          { push($1, $3); }
    | unprefixed_use_declaration                            { init($1); }
;

use_declarations:
      non_empty_use_declarations no_comma                   { $$ = $1; }
;

non_empty_use_declarations:
      non_empty_use_declarations ',' use_declaration        { push($1, $3); }
    | use_declaration                                       { init($1); }
;

inline_use_declarations:
      non_empty_inline_use_declarations optional_comma      { $$ = $1; }
;

non_empty_inline_use_declarations:
      non_empty_inline_use_declarations ',' inline_use_declaration
          { push($1, $3); }
    | inline_use_declaration                                { init($1); }
;

unprefixed_use_declaration:
      namespace_name
          { $$ = Stmt\UseUse[$1, null, Stmt\Use_::TYPE_UNKNOWN]; $this->checkUseUse($$, #1); }
    | namespace_name T_AS identifier_not_reserved
          { $$ = Stmt\UseUse[$1, $3, Stmt\Use_::TYPE_UNKNOWN]; $this->checkUseUse($$, #3); }
;

use_declaration:
      legacy_namespace_name
          { $$ = Stmt\UseUse[$1, null, Stmt\Use_::TYPE_UNKNOWN]; $this->checkUseUse($$, #1); }
    | legacy_namespace_name T_AS identifier_not_reserved
          { $$ = Stmt\UseUse[$1, $3, Stmt\Use_::TYPE_UNKNOWN]; $this->checkUseUse($$, #3); }
;

inline_use_declaration:
      unprefixed_use_declaration                            { $$ = $1; $$->type = Stmt\Use_::TYPE_NORMAL; }
    | use_type unprefixed_use_declaration                   { $$ = $2; $$->type = $1; }
;

constant_declaration_list:
      non_empty_constant_declaration_list no_comma          { $$ = $1; }
;

non_empty_constant_declaration_list:
      non_empty_constant_declaration_list ',' constant_declaration
          { push($1, $3); }
    | constant_declaration                                  { init($1); }
;

constant_declaration:
    identifier_not_reserved '=' expr                        { $$ = Node\Const_[$1, $3]; }
;

class_const_list:
      non_empty_class_const_list no_comma                   { $$ = $1; }
;

non_empty_class_const_list:
      non_empty_class_const_list ',' class_const            { push($1, $3); }
    | class_const                                           { init($1); }
;

class_const:
      T_STRING '=' expr
          { $$ = Node\Const_[new Node\Identifier($1, stackAttributes(#1)), $3]; }
    | semi_reserved '=' expr
          { $$ = Node\Const_[new Node\Identifier($1, stackAttributes(#1)), $3]; }
;

inner_statement_list_ex:
      inner_statement_list_ex inner_statement               { pushNormalizing($1, $2); }
    | /* empty */                                           { init(); }
;

inner_statement_list:
      inner_statement_list_ex
          { makeZeroLengthNop($nop, $this->lookaheadStartAttributes);
            if ($nop !== null) { $1[] = $nop; } $$ = $1; }
;

inner_statement:
      statement                                             { $$ = $1; }
    | function_declaration_statement                        { $$ = $1; }
    | class_declaration_statement                           { $$ = $1; }
    | T_HALT_COMPILER
          { throw new Error('__HALT_COMPILER() can only be used from the outermost scope', attributes()); }
;

non_empty_statement:
      '{' inner_statement_list '}'
    {
        if ($2) {
            $$ = $2; prependLeadingComments($$);
        } else {
            makeNop($$, $this->startAttributeStack[#1], $this->endAttributes);
            if (null === $$) { $$ = array(); }
        }
    }
    | T_IF '(' expr ')' statement elseif_list else_single
          { $$ = Stmt\If_[$3, ['stmts' => toArray($5), 'elseifs' => $6, 'else' => $7]]; }
    | T_IF '(' expr ')' ':' inner_statement_list new_elseif_list new_else_single T_ENDIF ';'
          { $$ = Stmt\If_[$3, ['stmts' => $6, 'elseifs' => $7, 'else' => $8]]; }
    | T_WHILE '(' expr ')' while_statement                  { $$ = Stmt\While_[$3, $5]; }
    | T_DO statement T_WHILE '(' expr ')' ';'               { $$ = Stmt\Do_   [$5, toArray($2)]; }
    | T_FOR '(' for_expr ';'  for_expr ';' for_expr ')' for_statement
          { $$ = Stmt\For_[['init' => $3, 'cond' => $5, 'loop' => $7, 'stmts' => $9]]; }
    | T_SWITCH '(' expr ')' switch_case_list                { $$ = Stmt\Switch_[$3, $5]; }
    | T_BREAK optional_expr semi                            { $$ = Stmt\Break_[$2]; }
    | T_CONTINUE optional_expr semi                         { $$ = Stmt\Continue_[$2]; }
    | T_RETURN optional_expr semi                           { $$ = Stmt\Return_[$2]; }
    | T_GLOBAL global_var_list semi                         { $$ = Stmt\Global_[$2]; }
    | T_STATIC static_var_list semi                         { $$ = Stmt\Static_[$2]; }
    | T_ECHO expr_list_forbid_comma semi                    { $$ = Stmt\Echo_[$2]; }
    | T_INLINE_HTML                                         { $$ = Stmt\InlineHTML[$1]; }
    | expr semi {
        $e = $1;
        if ($e instanceof Expr\Throw_) {
            // For backwards-compatibility reasons, convert throw in statement position into
            // Stmt\Throw_ rather than Stmt\Expression(Expr\Throw_).
            $$ = Stmt\Throw_[$e->expr];
        } else {
            $$ = Stmt\Expression[$e];
        }
    }
    | T_UNSET '(' variables_list ')' semi                   { $$ = Stmt\Unset_[$3]; }
    | T_FOREACH '(' expr T_AS foreach_variable ')' foreach_statement
          { $$ = Stmt\Foreach_[$3, $5[0], ['keyVar' => null, 'byRef' => $5[1], 'stmts' => $7]]; }
    | T_FOREACH '(' expr T_AS variable T_DOUBLE_ARROW foreach_variable ')' foreach_statement
          { $$ = Stmt\Foreach_[$3, $7[0], ['keyVar' => $5, 'byRef' => $7[1], 'stmts' => $9]]; }
    | T_FOREACH '(' expr error ')' foreach_statement
          { $$ = Stmt\Foreach_[$3, new Expr\Error(stackAttributes(#4)), ['stmts' => $6]]; }
    | T_DECLARE '(' declare_list ')' declare_statement      { $$ = Stmt\Declare_[$3, $5]; }
    | T_TRY '{' inner_statement_list '}' catches optional_finally
          { $$ = Stmt\TryCatch[$3, $5, $6]; $this->checkTryCatch($$); }
    | T_GOTO identifier_not_reserved semi                   { $$ = Stmt\Goto_[$2]; }
    | identifier_not_reserved ':'                           { $$ = Stmt\Label[$1]; }
    | error                                                 { $$ = array(); /* means: no statement */ }
;

statement:
      non_empty_statement                                   { $$ = $1; }
    | ';'
          { makeNop($$, $this->startAttributeStack[#1], $this->endAttributes);
            if ($$ === null) $$ = array(); /* means: no statement */ }
;

catches:
      /* empty */                                           { init(); }
    | catches catch                                         { push($1, $2); }
;

name_union:
      name                                                  { init($1); }
    | name_union '|' name                                   { push($1, $3); }
;

catch:
    T_CATCH '(' name_union optional_plain_variable ')' '{' inner_statement_list '}'
        { $$ = Stmt\Catch_[$3, $4, $7]; }
;

optional_finally:
      /* empty */                                           { $$ = null; }
    | T_FINALLY '{' inner_statement_list '}'                { $$ = Stmt\Finally_[$3]; }
;

variables_list:
      non_empty_variables_list optional_comma               { $$ = $1; }
;

non_empty_variables_list:
      variable                                              { init($1); }
    | non_empty_variables_list ',' variable                 { push($1, $3); }
;

optional_ref:
      /* empty */                                           { $$ = false; }
    | ampersand                                             { $$ = true; }
;

optional_arg_ref:
      /* empty */                                           { $$ = false; }
    | T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG                 { $$ = true; }
;

optional_ellipsis:
      /* empty */                                           { $$ = false; }
    | T_ELLIPSIS                                            { $$ = true; }
;

block_or_error:
      '{' inner_statement_list '}'                          { $$ = $2; }
    | error                                                 { $$ = []; }
;

identifier_maybe_readonly:
      identifier_not_reserved                               { $$ = $1; }
    | T_READONLY                                            { $$ = Node\Identifier[$1]; }
;

function_declaration_statement:
      T_FUNCTION optional_ref identifier_maybe_readonly '(' parameter_list ')' optional_return_type block_or_error
          { $$ = Stmt\Function_[$3, ['byRef' => $2, 'params' => $5, 'returnType' => $7, 'stmts' => $8, 'attrGroups' => []]]; }
    | attributes T_FUNCTION optional_ref identifier_maybe_readonly '(' parameter_list ')' optional_return_type block_or_error
          { $$ = Stmt\Function_[$4, ['byRef' => $3, 'params' => $6, 'returnType' => $8, 'stmts' => $9, 'attrGroups' => $1]]; }
;

class_declaration_statement:
      class_entry_type identifier_not_reserved extends_from implements_list '{' class_statement_list '}'
          { $$ = Stmt\Class_[$2, ['type' => $1, 'extends' => $3, 'implements' => $4, 'stmts' => $6, 'attrGroups' => []]];
            $this->checkClass($$, #2); }
    | attributes class_entry_type identifier_not_reserved extends_from implements_list '{' class_statement_list '}'
          { $$ = Stmt\Class_[$3, ['type' => $2, 'extends' => $4, 'implements' => $5, 'stmts' => $7, 'attrGroups' => $1]];
            $this->checkClass($$, #3); }
    | optional_attributes T_INTERFACE identifier_not_reserved interface_extends_list '{' class_statement_list '}'
          { $$ = Stmt\Interface_[$3, ['extends' => $4, 'stmts' => $6, 'attrGroups' => $1]];
            $this->checkInterface($$, #3); }
    | optional_attributes T_TRAIT identifier_not_reserved '{' class_statement_list '}'
          { $$ = Stmt\Trait_[$3, ['stmts' => $5, 'attrGroups' => $1]]; }
    | optional_attributes T_ENUM identifier_not_reserved enum_scalar_type implements_list '{' class_statement_list '}'
          { $$ = Stmt\Enum_[$3, ['scalarType' => $4, 'implements' => $5, 'stmts' => $7, 'attrGroups' => $1]];
            $this->checkEnum($$, #3); }
;

enum_scalar_type:
      /* empty */                                           { $$ = null; }
    | ':' type                                              { $$ = $2; }

enum_case_expr:
      /* empty */                                           { $$ = null; }
    | '=' expr                                              { $$ = $2; }
;

class_entry_type:
      T_CLASS                                               { $$ = 0; }
    | class_modifiers T_CLASS                               { $$ = $1; }
;

class_modifiers:
      class_modifier                                        { $$ = $1; }
    | class_modifiers class_modifier                        { $this->checkClassModifier($1, $2, #2); $$ = $1 | $2; }
;

class_modifier:
      T_ABSTRACT                                            { $$ = Stmt\Class_::MODIFIER_ABSTRACT; }
    | T_FINAL                                               { $$ = Stmt\Class_::MODIFIER_FINAL; }
    | T_READONLY                                            { $$ = Stmt\Class_::MODIFIER_READONLY; }
;

extends_from:
      /* empty */                                           { $$ = null; }
    | T_EXTENDS class_name                                  { $$ = $2; }
;

interface_extends_list:
      /* empty */                                           { $$ = array(); }
    | T_EXTENDS class_name_list                             { $$ = $2; }
;

implements_list:
      /* empty */                                           { $$ = array(); }
    | T_IMPLEMENTS class_name_list                          { $$ = $2; }
;

class_name_list:
      non_empty_class_name_list no_comma                    { $$ = $1; }
;

non_empty_class_name_list:
      class_name                                            { init($1); }
    | non_empty_class_name_list ',' class_name              { push($1, $3); }
;

for_statement:
      statement                                             { $$ = toArray($1); }
    | ':' inner_statement_list T_ENDFOR ';'                 { $$ = $2; }
;

foreach_statement:
      statement                                             { $$ = toArray($1); }
    | ':' inner_statement_list T_ENDFOREACH ';'             { $$ = $2; }
;

declare_statement:
      non_empty_statement                                   { $$ = toArray($1); }
    | ';'                                                   { $$ = null; }
    | ':' inner_statement_list T_ENDDECLARE ';'             { $$ = $2; }
;

declare_list:
      non_empty_declare_list no_comma                       { $$ = $1; }
;

non_empty_declare_list:
      declare_list_element                                  { init($1); }
    | non_empty_declare_list ',' declare_list_element       { push($1, $3); }
;

declare_list_element:
      identifier_not_reserved '=' expr                      { $$ = Stmt\DeclareDeclare[$1, $3]; }
;

switch_case_list:
      '{' case_list '}'                                     { $$ = $2; }
    | '{' ';' case_list '}'                                 { $$ = $3; }
    | ':' case_list T_ENDSWITCH ';'                         { $$ = $2; }
    | ':' ';' case_list T_ENDSWITCH ';'                     { $$ = $3; }
;

case_list:
      /* empty */                                           { init(); }
    | case_list case                                        { push($1, $2); }
;

case:
      T_CASE expr case_separator inner_statement_list_ex    { $$ = Stmt\Case_[$2, $4]; }
    | T_DEFAULT case_separator inner_statement_list_ex      { $$ = Stmt\Case_[null, $3]; }
;

case_separator:
      ':'
    | ';'
;

match:
      T_MATCH '(' expr ')' '{' match_arm_list '}'           { $$ = Expr\Match_[$3, $6]; }
;

match_arm_list:
      /* empty */                                           { $$ = []; }
    | non_empty_match_arm_list optional_comma               { $$ = $1; }
;

non_empty_match_arm_list:
      match_arm                                             { init($1); }
    | non_empty_match_arm_list ',' match_arm                { push($1, $3); }
;

match_arm:
      expr_list_allow_comma T_DOUBLE_ARROW expr             { $$ = Node\MatchArm[$1, $3]; }
    | T_DEFAULT optional_comma T_DOUBLE_ARROW expr          { $$ = Node\MatchArm[null, $4]; }
;

while_statement:
      statement                                             { $$ = toArray($1); }
    | ':' inner_statement_list T_ENDWHILE ';'               { $$ = $2; }
;

elseif_list:
      /* empty */                                           { init(); }
    | elseif_list elseif                                    { push($1, $2); }
;

elseif:
      T_ELSEIF '(' expr ')' statement                       { $$ = Stmt\ElseIf_[$3, toArray($5)]; }
;

new_elseif_list:
      /* empty */                                           { init(); }
    | new_elseif_list new_elseif                            { push($1, $2); }
;

new_elseif:
     T_ELSEIF '(' expr ')' ':' inner_statement_list
         { $$ = Stmt\ElseIf_[$3, $6]; $this->fixupAlternativeElse($$); }
;

else_single:
      /* empty */                                           { $$ = null; }
    | T_ELSE statement                                      { $$ = Stmt\Else_[toArray($2)]; }
;

new_else_single:
      /* empty */                                           { $$ = null; }
    | T_ELSE ':' inner_statement_list
          { $$ = Stmt\Else_[$3]; $this->fixupAlternativeElse($$); }
;

foreach_variable:
      variable                                              { $$ = array($1, false); }
    | ampersand variable                                    { $$ = array($2, true); }
    | list_expr                                             { $$ = array($1, false); }
    | array_short_syntax                                    { $$ = array($1, false); }
;

parameter_list:
      non_empty_parameter_list optional_comma               { $$ = $1; }
    | /* empty */                                           { $$ = array(); }
;

non_empty_parameter_list:
      parameter                                             { init($1); }
    | non_empty_parameter_list ',' parameter                { push($1, $3); }
;

optional_property_modifiers:
      /* empty */               { $$ = 0; }
    | optional_property_modifiers property_modifier
          { $this->checkModifier($1, $2, #2); $$ = $1 | $2; }
;

property_modifier:
      T_PUBLIC                  { $$ = Stmt\Class_::MODIFIER_PUBLIC; }
    | T_PROTECTED               { $$ = Stmt\Class_::MODIFIER_PROTECTED; }
    | T_PRIVATE                 { $$ = Stmt\Class_::MODIFIER_PRIVATE; }
    | T_READONLY                { $$ = Stmt\Class_::MODIFIER_READONLY; }
;

parameter:
      optional_attributes optional_property_modifiers optional_type_without_static
      optional_arg_ref optional_ellipsis plain_variable
          { $$ = new Node\Param($6, null, $3, $4, $5, attributes(), $2, $1);
            $this->checkParam($$); }
    | optional_attributes optional_property_modifiers optional_type_without_static
      optional_arg_ref optional_ellipsis plain_variable '=' expr
          { $$ = new Node\Param($6, $8, $3, $4, $5, attributes(), $2, $1);
            $this->checkParam($$); }
    | optional_attributes optional_property_modifiers optional_type_without_static
      optional_arg_ref optional_ellipsis error
          { $$ = new Node\Param(Expr\Error[], null, $3, $4, $5, attributes(), $2, $1); }
;

type_expr:
      type                                                  { $$ = $1; }
    | '?' type                                              { $$ = Node\NullableType[$2]; }
    | union_type                                            { $$ = Node\UnionType[$1]; }
    | intersection_type                                     { $$ = $1; }
;

type:
      type_without_static                                   { $$ = $1; }
    | T_STATIC                                              { $$ = Node\Name['static']; }
;

type_without_static:
      name                                                  { $$ = $this->handleBuiltinTypes($1); }
    | T_ARRAY                                               { $$ = Node\Identifier['array']; }
    | T_CALLABLE                                            { $$ = Node\Identifier['callable']; }
;

union_type_element:
                type { $$ = $1; }
        |        '(' intersection_type ')' { $$ = $2; }
;

union_type:
      union_type_element '|' union_type_element             { init($1, $3); }
    | union_type '|' union_type_element                     { push($1, $3); }
;

union_type_without_static_element:
                type_without_static { $$ = $1; }
        |        '(' intersection_type_without_static ')' { $$ = $2; }
;

union_type_without_static:
      union_type_without_static_element '|' union_type_without_static_element   { init($1, $3); }
    | union_type_without_static '|' union_type_without_static_element           { push($1, $3); }
;

intersection_type_list:
      type T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG type   { init($1, $3); }
    | intersection_type_list T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG type
          { push($1, $3); }
;

intersection_type:
      intersection_type_list { $$ = Node\IntersectionType[$1]; }
;

intersection_type_without_static_list:
      type_without_static T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG type_without_static
          { init($1, $3); }
    | intersection_type_without_static_list T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG type_without_static
          { push($1, $3); }
;

intersection_type_without_static:
      intersection_type_without_static_list { $$ = Node\IntersectionType[$1]; }
;

type_expr_without_static:
      type_without_static                                   { $$ = $1; }
    | '?' type_without_static                               { $$ = Node\NullableType[$2]; }
    | union_type_without_static                             { $$ = Node\UnionType[$1]; }
    | intersection_type_without_static                      { $$ = $1; }
;

optional_type_without_static:
      /* empty */                                           { $$ = null; }
    | type_expr_without_static                              { $$ = $1; }
;

optional_return_type:
      /* empty */                                           { $$ = null; }
    | ':' type_expr                                         { $$ = $2; }
    | ':' error                                             { $$ = null; }
;

argument_list:
      '(' ')'                                               { $$ = array(); }
    | '(' non_empty_argument_list optional_comma ')'        { $$ = $2; }
    | '(' variadic_placeholder ')'                          { init($2); }
;

variadic_placeholder:
      T_ELLIPSIS                                            { $$ = Node\VariadicPlaceholder[]; }
;

non_empty_argument_list:
      argument                                              { init($1); }
    | non_empty_argument_list ',' argument                  { push($1, $3); }
;

argument:
      expr                                                  { $$ = Node\Arg[$1, false, false]; }
    | ampersand variable                                    { $$ = Node\Arg[$2, true, false]; }
    | T_ELLIPSIS expr                                       { $$ = Node\Arg[$2, false, true]; }
    | identifier_maybe_reserved ':' expr
          { $$ = new Node\Arg($3, false, false, attributes(), $1); }
;

global_var_list:
      non_empty_global_var_list no_comma                    { $$ = $1; }
;

non_empty_global_var_list:
      non_empty_global_var_list ',' global_var              { push($1, $3); }
    | global_var                                            { init($1); }
;

global_var:
      simple_variable                                       { $$ = $1; }
;

static_var_list:
      non_empty_static_var_list no_comma                    { $$ = $1; }
;

non_empty_static_var_list:
      non_empty_static_var_list ',' static_var              { push($1, $3); }
    | static_var                                            { init($1); }
;

static_var:
      plain_variable                                        { $$ = Stmt\StaticVar[$1, null]; }
    | plain_variable '=' expr                               { $$ = Stmt\StaticVar[$1, $3]; }
;

class_statement_list_ex:
      class_statement_list_ex class_statement               { if ($2 !== null) { push($1, $2); } }
    | /* empty */                                           { init(); }
;

class_statement_list:
      class_statement_list_ex
          { makeZeroLengthNop($nop, $this->lookaheadStartAttributes);
            if ($nop !== null) { $1[] = $nop; } $$ = $1; }
;

class_statement:
      optional_attributes variable_modifiers optional_type_without_static property_declaration_list semi
          { $$ = new Stmt\Property($2, $4, attributes(), $3, $1);
            $this->checkProperty($$, #2); }
    | optional_attributes method_modifiers T_CONST class_const_list semi
          { $$ = new Stmt\ClassConst($4, $2, attributes(), $1);
            $this->checkClassConst($$, #2); }
    | optional_attributes method_modifiers T_CONST type_expr class_const_list semi
          { $$ = new Stmt\ClassConst($5, $2, attributes(), $1, $4);
            $this->checkClassConst($$, #2); }
    | optional_attributes method_modifiers T_FUNCTION optional_ref identifier_maybe_reserved '(' parameter_list ')'
      optional_return_type method_body
          { $$ = Stmt\ClassMethod[$5, ['type' => $2, 'byRef' => $4, 'params' => $7, 'returnType' => $9, 'stmts' => $10, 'attrGroups' => $1]];
            $this->checkClassMethod($$, #2); }
    | T_USE class_name_list trait_adaptations               { $$ = Stmt\TraitUse[$2, $3]; }
    | optional_attributes T_CASE identifier_maybe_reserved enum_case_expr semi
         { $$ = Stmt\EnumCase[$3, $4, $1]; }
    | error                                                 { $$ = null; /* will be skipped */ }
;

trait_adaptations:
      ';'                                                   { $$ = array(); }
    | '{' trait_adaptation_list '}'                         { $$ = $2; }
;

trait_adaptation_list:
      /* empty */                                           { init(); }
    | trait_adaptation_list trait_adaptation                { push($1, $2); }
;

trait_adaptation:
      trait_method_reference_fully_qualified T_INSTEADOF class_name_list ';'
          { $$ = Stmt\TraitUseAdaptation\Precedence[$1[0], $1[1], $3]; }
    | trait_method_reference T_AS member_modifier identifier_maybe_reserved ';'
          { $$ = Stmt\TraitUseAdaptation\Alias[$1[0], $1[1], $3, $4]; }
    | trait_method_reference T_AS member_modifier ';'
          { $$ = Stmt\TraitUseAdaptation\Alias[$1[0], $1[1], $3, null]; }
    | trait_method_reference T_AS identifier_not_reserved ';'
          { $$ = Stmt\TraitUseAdaptation\Alias[$1[0], $1[1], null, $3]; }
    | trait_method_reference T_AS reserved_non_modifiers_identifier ';'
          { $$ = Stmt\TraitUseAdaptation\Alias[$1[0], $1[1], null, $3]; }
;

trait_method_reference_fully_qualified:
      name T_PAAMAYIM_NEKUDOTAYIM identifier_maybe_reserved { $$ = array($1, $3); }
;
trait_method_reference:
      trait_method_reference_fully_qualified                { $$ = $1; }
    | identifier_maybe_reserved                             { $$ = array(null, $1); }
;

method_body:
      ';' /* abstract method */                             { $$ = null; }
    | block_or_error                                        { $$ = $1; }
;

variable_modifiers:
      non_empty_member_modifiers                            { $$ = $1; }
    | T_VAR                                                 { $$ = 0; }
;

method_modifiers:
      /* empty */                                           { $$ = 0; }
    | non_empty_member_modifiers                            { $$ = $1; }
;

non_empty_member_modifiers:
      member_modifier                                       { $$ = $1; }
    | non_empty_member_modifiers member_modifier            { $this->checkModifier($1, $2, #2); $$ = $1 | $2; }
;

member_modifier:
      T_PUBLIC                                              { $$ = Stmt\Class_::MODIFIER_PUBLIC; }
    | T_PROTECTED                                           { $$ = Stmt\Class_::MODIFIER_PROTECTED; }
    | T_PRIVATE                                             { $$ = Stmt\Class_::MODIFIER_PRIVATE; }
    | T_STATIC                                              { $$ = Stmt\Class_::MODIFIER_STATIC; }
    | T_ABSTRACT                                            { $$ = Stmt\Class_::MODIFIER_ABSTRACT; }
    | T_FINAL                                               { $$ = Stmt\Class_::MODIFIER_FINAL; }
    | T_READONLY                                            { $$ = Stmt\Class_::MODIFIER_READONLY; }
;

property_declaration_list:
      non_empty_property_declaration_list no_comma          { $$ = $1; }
;

non_empty_property_declaration_list:
      property_declaration                                  { init($1); }
    | non_empty_property_declaration_list ',' property_declaration
          { push($1, $3); }
;

property_decl_name:
      T_VARIABLE                                            { $$ = Node\VarLikeIdentifier[parseVar($1)]; }
;

property_declaration:
      property_decl_name                                    { $$ = Stmt\PropertyProperty[$1, null]; }
    | property_decl_name '=' expr                           { $$ = Stmt\PropertyProperty[$1, $3]; }
;

expr_list_forbid_comma:
      non_empty_expr_list no_comma                          { $$ = $1; }
;

expr_list_allow_comma:
      non_empty_expr_list optional_comma                    { $$ = $1; }
;

non_empty_expr_list:
      non_empty_expr_list ',' expr                          { push($1, $3); }
    | expr                                                  { init($1); }
;

for_expr:
      /* empty */                                           { $$ = array(); }
    | expr_list_forbid_comma                                { $$ = $1; }
;

expr:
      variable                                              { $$ = $1; }
    | list_expr '=' expr                                    { $$ = Expr\Assign[$1, $3]; }
    | array_short_syntax '=' expr                           { $$ = Expr\Assign[$1, $3]; }
    | variable '=' expr                                     { $$ = Expr\Assign[$1, $3]; }
    | variable '=' ampersand variable                       { $$ = Expr\AssignRef[$1, $4]; }
    | new_expr                                              { $$ = $1; }
    | match                                                 { $$ = $1; }
    | T_CLONE expr                                          { $$ = Expr\Clone_[$2]; }
    | variable T_PLUS_EQUAL expr                            { $$ = Expr\AssignOp\Plus      [$1, $3]; }
    | variable T_MINUS_EQUAL expr                           { $$ = Expr\AssignOp\Minus     [$1, $3]; }
    | variable T_MUL_EQUAL expr                             { $$ = Expr\AssignOp\Mul       [$1, $3]; }
    | variable T_DIV_EQUAL expr                             { $$ = Expr\AssignOp\Div       [$1, $3]; }
    | variable T_CONCAT_EQUAL expr                          { $$ = Expr\AssignOp\Concat    [$1, $3]; }
    | variable T_MOD_EQUAL expr                             { $$ = Expr\AssignOp\Mod       [$1, $3]; }
    | variable T_AND_EQUAL expr                             { $$ = Expr\AssignOp\BitwiseAnd[$1, $3]; }
    | variable T_OR_EQUAL expr                              { $$ = Expr\AssignOp\BitwiseOr [$1, $3]; }
    | variable T_XOR_EQUAL expr                             { $$ = Expr\AssignOp\BitwiseXor[$1, $3]; }
    | variable T_SL_EQUAL expr                              { $$ = Expr\AssignOp\ShiftLeft [$1, $3]; }
    | variable T_SR_EQUAL expr                              { $$ = Expr\AssignOp\ShiftRight[$1, $3]; }
    | variable T_POW_EQUAL expr                             { $$ = Expr\AssignOp\Pow       [$1, $3]; }
    | variable T_COALESCE_EQUAL expr                        { $$ = Expr\AssignOp\Coalesce  [$1, $3]; }
    | variable T_INC                                        { $$ = Expr\PostInc[$1]; }
    | T_INC variable                                        { $$ = Expr\PreInc [$2]; }
    | variable T_DEC                                        { $$ = Expr\PostDec[$1]; }
    | T_DEC variable                                        { $$ = Expr\PreDec [$2]; }
    | expr T_BOOLEAN_OR expr                                { $$ = Expr\BinaryOp\BooleanOr [$1, $3]; }
    | expr T_BOOLEAN_AND expr                               { $$ = Expr\BinaryOp\BooleanAnd[$1, $3]; }
    | expr T_LOGICAL_OR expr                                { $$ = Expr\BinaryOp\LogicalOr [$1, $3]; }
    | expr T_LOGICAL_AND expr                               { $$ = Expr\BinaryOp\LogicalAnd[$1, $3]; }
    | expr T_LOGICAL_XOR expr                               { $$ = Expr\BinaryOp\LogicalXor[$1, $3]; }
    | expr '|' expr                                         { $$ = Expr\BinaryOp\BitwiseOr [$1, $3]; }
    | expr T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG expr   { $$ = Expr\BinaryOp\BitwiseAnd[$1, $3]; }
    | expr T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG expr       { $$ = Expr\BinaryOp\BitwiseAnd[$1, $3]; }
    | expr '^' expr                                         { $$ = Expr\BinaryOp\BitwiseXor[$1, $3]; }
    | expr '.' expr                                         { $$ = Expr\BinaryOp\Concat    [$1, $3]; }
    | expr '+' expr                                         { $$ = Expr\BinaryOp\Plus      [$1, $3]; }
    | expr '-' expr                                         { $$ = Expr\BinaryOp\Minus     [$1, $3]; }
    | expr '*' expr                                         { $$ = Expr\BinaryOp\Mul       [$1, $3]; }
    | expr '/' expr                                         { $$ = Expr\BinaryOp\Div       [$1, $3]; }
    | expr '%' expr                                         { $$ = Expr\BinaryOp\Mod       [$1, $3]; }
    | expr T_SL expr                                        { $$ = Expr\BinaryOp\ShiftLeft [$1, $3]; }
    | expr T_SR expr                                        { $$ = Expr\BinaryOp\ShiftRight[$1, $3]; }
    | expr T_POW expr                                       { $$ = Expr\BinaryOp\Pow       [$1, $3]; }
    | '+' expr %prec T_INC                                  { $$ = Expr\UnaryPlus [$2]; }
    | '-' expr %prec T_INC                                  { $$ = Expr\UnaryMinus[$2]; }
    | '!' expr                                              { $$ = Expr\BooleanNot[$2]; }
    | '~' expr                                              { $$ = Expr\BitwiseNot[$2]; }
    | expr T_IS_IDENTICAL expr                              { $$ = Expr\BinaryOp\Identical     [$1, $3]; }
    | expr T_IS_NOT_IDENTICAL expr                          { $$ = Expr\BinaryOp\NotIdentical  [$1, $3]; }
    | expr T_IS_EQUAL expr                                  { $$ = Expr\BinaryOp\Equal         [$1, $3]; }
    | expr T_IS_NOT_EQUAL expr                              { $$ = Expr\BinaryOp\NotEqual      [$1, $3]; }
    | expr T_SPACESHIP expr                                 { $$ = Expr\BinaryOp\Spaceship     [$1, $3]; }
    | expr '<' expr                                         { $$ = Expr\BinaryOp\Smaller       [$1, $3]; }
    | expr T_IS_SMALLER_OR_EQUAL expr                       { $$ = Expr\BinaryOp\SmallerOrEqual[$1, $3]; }
    | expr '>' expr                                         { $$ = Expr\BinaryOp\Greater       [$1, $3]; }
    | expr T_IS_GREATER_OR_EQUAL expr                       { $$ = Expr\BinaryOp\GreaterOrEqual[$1, $3]; }
    | expr T_INSTANCEOF class_name_reference                { $$ = Expr\Instanceof_[$1, $3]; }
    | '(' expr ')'                                          { $$ = $2; }
    | expr '?' expr ':' expr                                { $$ = Expr\Ternary[$1, $3,   $5]; }
    | expr '?' ':' expr                                     { $$ = Expr\Ternary[$1, null, $4]; }
    | expr T_COALESCE expr                                  { $$ = Expr\BinaryOp\Coalesce[$1, $3]; }
    | T_ISSET '(' expr_list_allow_comma ')'                 { $$ = Expr\Isset_[$3]; }
    | T_EMPTY '(' expr ')'                                  { $$ = Expr\Empty_[$3]; }
    | T_INCLUDE expr                                        { $$ = Expr\Include_[$2, Expr\Include_::TYPE_INCLUDE]; }
    | T_INCLUDE_ONCE expr                                   { $$ = Expr\Include_[$2, Expr\Include_::TYPE_INCLUDE_ONCE]; }
    | T_EVAL '(' expr ')'                                   { $$ = Expr\Eval_[$3]; }
    | T_REQUIRE expr                                        { $$ = Expr\Include_[$2, Expr\Include_::TYPE_REQUIRE]; }
    | T_REQUIRE_ONCE expr                                   { $$ = Expr\Include_[$2, Expr\Include_::TYPE_REQUIRE_ONCE]; }
    | T_INT_CAST expr                                       { $$ = Expr\Cast\Int_    [$2]; }
    | T_DOUBLE_CAST expr
          { $attrs = attributes();
            $attrs['kind'] = $this->getFloatCastKind($1);
            $$ = new Expr\Cast\Double($2, $attrs); }
    | T_STRING_CAST expr                                    { $$ = Expr\Cast\String_ [$2]; }
    | T_ARRAY_CAST expr                                     { $$ = Expr\Cast\Array_  [$2]; }
    | T_OBJECT_CAST expr                                    { $$ = Expr\Cast\Object_ [$2]; }
    | T_BOOL_CAST expr                                      { $$ = Expr\Cast\Bool_   [$2]; }
    | T_UNSET_CAST expr                                     { $$ = Expr\Cast\Unset_  [$2]; }
    | T_EXIT exit_expr
          { $attrs = attributes();
            $attrs['kind'] = strtolower($1) === 'exit' ? Expr\Exit_::KIND_EXIT : Expr\Exit_::KIND_DIE;
            $$ = new Expr\Exit_($2, $attrs); }
    | '@' expr                                              { $$ = Expr\ErrorSuppress[$2]; }
    | scalar                                                { $$ = $1; }
    | '`' backticks_expr '`'                                { $$ = Expr\ShellExec[$2]; }
    | T_PRINT expr                                          { $$ = Expr\Print_[$2]; }
    | T_YIELD                                               { $$ = Expr\Yield_[null, null]; }
    | T_YIELD expr                                          { $$ = Expr\Yield_[$2, null]; }
    | T_YIELD expr T_DOUBLE_ARROW expr                      { $$ = Expr\Yield_[$4, $2]; }
    | T_YIELD_FROM expr                                     { $$ = Expr\YieldFrom[$2]; }
    | T_THROW expr                                          { $$ = Expr\Throw_[$2]; }

    | T_FN optional_ref '(' parameter_list ')' optional_return_type T_DOUBLE_ARROW expr %prec T_THROW
          { $$ = Expr\ArrowFunction[['static' => false, 'byRef' => $2, 'params' => $4, 'returnType' => $6, 'expr' => $8, 'attrGroups' => []]]; }
    | T_STATIC T_FN optional_ref '(' parameter_list ')' optional_return_type T_DOUBLE_ARROW expr %prec T_THROW
          { $$ = Expr\ArrowFunction[['static' => true, 'byRef' => $3, 'params' => $5, 'returnType' => $7, 'expr' => $9, 'attrGroups' => []]]; }
    | T_FUNCTION optional_ref '(' parameter_list ')' lexical_vars optional_return_type block_or_error
          { $$ = Expr\Closure[['static' => false, 'byRef' => $2, 'params' => $4, 'uses' => $6, 'returnType' => $7, 'stmts' => $8, 'attrGroups' => []]]; }
    | T_STATIC T_FUNCTION optional_ref '(' parameter_list ')' lexical_vars optional_return_type       block_or_error
          { $$ = Expr\Closure[['static' => true, 'byRef' => $3, 'params' => $5, 'uses' => $7, 'returnType' => $8, 'stmts' => $9, 'attrGroups' => []]]; }

    | attributes T_FN optional_ref '(' parameter_list ')' optional_return_type T_DOUBLE_ARROW expr %prec T_THROW
          { $$ = Expr\ArrowFunction[['static' => false, 'byRef' => $3, 'params' => $5, 'returnType' => $7, 'expr' => $9, 'attrGroups' => $1]]; }
    | attributes T_STATIC T_FN optional_ref '(' parameter_list ')' optional_return_type T_DOUBLE_ARROW expr %prec T_THROW
          { $$ = Expr\ArrowFunction[['static' => true, 'byRef' => $4, 'params' => $6, 'returnType' => $8, 'expr' => $10, 'attrGroups' => $1]]; }
    | attributes T_FUNCTION optional_ref '(' parameter_list ')' lexical_vars optional_return_type block_or_error
          { $$ = Expr\Closure[['static' => false, 'byRef' => $3, 'params' => $5, 'uses' => $7, 'returnType' => $8, 'stmts' => $9, 'attrGroups' => $1]]; }
    | attributes T_STATIC T_FUNCTION optional_ref '(' parameter_list ')' lexical_vars optional_return_type       block_or_error
          { $$ = Expr\Closure[['static' => true, 'byRef' => $4, 'params' => $6, 'uses' => $8, 'returnType' => $9, 'stmts' => $10, 'attrGroups' => $1]]; }
;

anonymous_class:
      optional_attributes class_entry_type ctor_arguments extends_from implements_list '{' class_statement_list '}'
          { $$ = array(Stmt\Class_[null, ['type' => $2, 'extends' => $4, 'implements' => $5, 'stmts' => $7, 'attrGroups' => $1]], $3);
            $this->checkClass($$[0], -1); }
;

new_expr:
      T_NEW class_name_reference ctor_arguments             { $$ = Expr\New_[$2, $3]; }
    | T_NEW anonymous_class
          { list($class, $ctorArgs) = $2; $$ = Expr\New_[$class, $ctorArgs]; }
;

lexical_vars:
      /* empty */                                           { $$ = array(); }
    | T_USE '(' lexical_var_list ')'                        { $$ = $3; }
;

lexical_var_list:
      non_empty_lexical_var_list optional_comma             { $$ = $1; }
;

non_empty_lexical_var_list:
      lexical_var                                           { init($1); }
    | non_empty_lexical_var_list ',' lexical_var            { push($1, $3); }
;

lexical_var:
      optional_ref plain_variable                           { $$ = Expr\ClosureUse[$2, $1]; }
;

name_readonly:
      T_READONLY                                            { $$ = Name[$1]; }
;

function_call:
      name argument_list                                    { $$ = Expr\FuncCall[$1, $2]; }
    | name_readonly argument_list                           { $$ = Expr\FuncCall[$1, $2]; }
    | callable_expr argument_list                           { $$ = Expr\FuncCall[$1, $2]; }
    | class_name_or_var T_PAAMAYIM_NEKUDOTAYIM member_name argument_list
          { $$ = Expr\StaticCall[$1, $3, $4]; }
;

class_name:
      T_STATIC                                              { $$ = Name[$1]; }
    | name                                                  { $$ = $1; }
;

name:
      T_STRING                                              { $$ = Name[$1]; }
    | T_NAME_QUALIFIED                                      { $$ = Name[$1]; }
    | T_NAME_FULLY_QUALIFIED                                { $$ = Name\FullyQualified[substr($1, 1)]; }
    | T_NAME_RELATIVE                                       { $$ = Name\Relative[substr($1, 10)]; }
;

class_name_reference:
      class_name                                            { $$ = $1; }
    | new_variable                                          { $$ = $1; }
    | '(' expr ')'                                          { $$ = $2; }
    | error                                                 { $$ = Expr\Error[]; $this->errorState = 2; }
;

class_name_or_var:
      class_name                                            { $$ = $1; }
    | fully_dereferencable                                  { $$ = $1; }
;

exit_expr:
      /* empty */                                           { $$ = null; }
    | '(' optional_expr ')'                                 { $$ = $2; }
;

backticks_expr:
      /* empty */                                           { $$ = array(); }
    | T_ENCAPSED_AND_WHITESPACE
          { $$ = array(Scalar\EncapsedStringPart[Scalar\String_::parseEscapeSequences($1, '`')]); }
    | encaps_list                                           { parseEncapsed($1, '`', true); $$ = $1; }
;

ctor_arguments:
      /* empty */                                           { $$ = array(); }
    | argument_list                                         { $$ = $1; }
;

constant:
      name                                                  { $$ = Expr\ConstFetch[$1]; }
    | T_LINE                                                { $$ = Scalar\MagicConst\Line[]; }
    | T_FILE                                                { $$ = Scalar\MagicConst\File[]; }
    | T_DIR                                                 { $$ = Scalar\MagicConst\Dir[]; }
    | T_CLASS_C                                             { $$ = Scalar\MagicConst\Class_[]; }
    | T_TRAIT_C                                             { $$ = Scalar\MagicConst\Trait_[]; }
    | T_METHOD_C                                            { $$ = Scalar\MagicConst\Method[]; }
    | T_FUNC_C                                              { $$ = Scalar\MagicConst\Function_[]; }
    | T_NS_C                                                { $$ = Scalar\MagicConst\Namespace_[]; }
;

class_constant:
      class_name_or_var T_PAAMAYIM_NEKUDOTAYIM identifier_maybe_reserved
          { $$ = Expr\ClassConstFetch[$1, $3]; }
    | class_name_or_var T_PAAMAYIM_NEKUDOTAYIM '{' expr '}'
          { $$ = Expr\ClassConstFetch[$1, $4]; }
    /* We interpret an isolated FOO:: as an unfinished class constant fetch. It could also be
       an unfinished static property fetch or unfinished scoped call. */
    | class_name_or_var T_PAAMAYIM_NEKUDOTAYIM error
          { $$ = Expr\ClassConstFetch[$1, new Expr\Error(stackAttributes(#3))]; $this->errorState = 2; }
;

array_short_syntax:
      '[' array_pair_list ']'
          { $attrs = attributes(); $attrs['kind'] = Expr\Array_::KIND_SHORT;
            $$ = new Expr\Array_($2, $attrs); }
;

dereferencable_scalar:
      T_ARRAY '(' array_pair_list ')'
          { $attrs = attributes(); $attrs['kind'] = Expr\Array_::KIND_LONG;
            $$ = new Expr\Array_($3, $attrs); }
    | array_short_syntax                                    { $$ = $1; }
    | T_CONSTANT_ENCAPSED_STRING                            { $$ = Scalar\String_::fromString($1, attributes()); }
    | '"' encaps_list '"'
          { $attrs = attributes(); $attrs['kind'] = Scalar\String_::KIND_DOUBLE_QUOTED;
            parseEncapsed($2, '"', true); $$ = new Scalar\Encapsed($2, $attrs); }
;

scalar:
      T_LNUMBER                                             { $$ = $this->parseLNumber($1, attributes()); }
    | T_DNUMBER                                             { $$ = Scalar\DNumber::fromString($1, attributes()); }
    | dereferencable_scalar                                 { $$ = $1; }
    | constant                                              { $$ = $1; }
    | class_constant                                        { $$ = $1; }
    | T_START_HEREDOC T_ENCAPSED_AND_WHITESPACE T_END_HEREDOC
          { $$ = $this->parseDocString($1, $2, $3, attributes(), stackAttributes(#3), true); }
    | T_START_HEREDOC T_END_HEREDOC
          { $$ = $this->parseDocString($1, '', $2, attributes(), stackAttributes(#2), true); }
    | T_START_HEREDOC encaps_list T_END_HEREDOC
          { $$ = $this->parseDocString($1, $2, $3, attributes(), stackAttributes(#3), true); }
;

optional_expr:
      /* empty */                                           { $$ = null; }
    | expr                                                  { $$ = $1; }
;

fully_dereferencable:
      variable                                              { $$ = $1; }
    | '(' expr ')'                                          { $$ = $2; }
    | dereferencable_scalar                                 { $$ = $1; }
    | class_constant                                        { $$ = $1; }
;

array_object_dereferencable:
      fully_dereferencable                                  { $$ = $1; }
    | constant                                              { $$ = $1; }
;

callable_expr:
      callable_variable                                     { $$ = $1; }
    | '(' expr ')'                                          { $$ = $2; }
    | dereferencable_scalar                                 { $$ = $1; }
;

callable_variable:
      simple_variable                                       { $$ = $1; }
    | array_object_dereferencable '[' optional_expr ']'     { $$ = Expr\ArrayDimFetch[$1, $3]; }
    | array_object_dereferencable '{' expr '}'              { $$ = Expr\ArrayDimFetch[$1, $3]; }
    | function_call                                         { $$ = $1; }
    | array_object_dereferencable T_OBJECT_OPERATOR property_name argument_list
          { $$ = Expr\MethodCall[$1, $3, $4]; }
    | array_object_dereferencable T_NULLSAFE_OBJECT_OPERATOR property_name argument_list
          { $$ = Expr\NullsafeMethodCall[$1, $3, $4]; }
;

optional_plain_variable:
      /* empty */                                           { $$ = null; }
    | plain_variable                                        { $$ = $1; }
;

variable:
      callable_variable                                     { $$ = $1; }
    | static_member                                         { $$ = $1; }
    | array_object_dereferencable T_OBJECT_OPERATOR property_name
          { $$ = Expr\PropertyFetch[$1, $3]; }
    | array_object_dereferencable T_NULLSAFE_OBJECT_OPERATOR property_name
          { $$ = Expr\NullsafePropertyFetch[$1, $3]; }
;

simple_variable:
      plain_variable                                        { $$ = $1; }
    | '$' '{' expr '}'                                      { $$ = Expr\Variable[$3]; }
    | '$' simple_variable                                   { $$ = Expr\Variable[$2]; }
    | '$' error                                             { $$ = Expr\Variable[Expr\Error[]]; $this->errorState = 2; }
;

static_member_prop_name:
      simple_variable
          { $var = $1->name; $$ = \is_string($var) ? Node\VarLikeIdentifier[$var] : $var; }
;

static_member:
      class_name_or_var T_PAAMAYIM_NEKUDOTAYIM static_member_prop_name
          { $$ = Expr\StaticPropertyFetch[$1, $3]; }
;

new_variable:
      simple_variable                                       { $$ = $1; }
    | new_variable '[' optional_expr ']'                    { $$ = Expr\ArrayDimFetch[$1, $3]; }
    | new_variable '{' expr '}'                             { $$ = Expr\ArrayDimFetch[$1, $3]; }
    | new_variable T_OBJECT_OPERATOR property_name          { $$ = Expr\PropertyFetch[$1, $3]; }
    | new_variable T_NULLSAFE_OBJECT_OPERATOR property_name { $$ = Expr\NullsafePropertyFetch[$1, $3]; }
    | class_name T_PAAMAYIM_NEKUDOTAYIM static_member_prop_name
          { $$ = Expr\StaticPropertyFetch[$1, $3]; }
    | new_variable T_PAAMAYIM_NEKUDOTAYIM static_member_prop_name
          { $$ = Expr\StaticPropertyFetch[$1, $3]; }
;

member_name:
      identifier_maybe_reserved                             { $$ = $1; }
    | '{' expr '}'                                          { $$ = $2; }
    | simple_variable                                       { $$ = $1; }
;

property_name:
      identifier_not_reserved                               { $$ = $1; }
    | '{' expr '}'                                          { $$ = $2; }
    | simple_variable                                       { $$ = $1; }
    | error                                                 { $$ = Expr\Error[]; $this->errorState = 2; }
;

list_expr:
      T_LIST '(' inner_array_pair_list ')'                  { $$ = Expr\List_[$3]; }
;

array_pair_list:
      inner_array_pair_list
          { $$ = $1; $end = count($$)-1; if ($$[$end] === null) array_pop($$); }
;

comma_or_error:
      ','
    | error
          { /* do nothing -- prevent default action of $$=$1. See #551. */ }
;

inner_array_pair_list:
      inner_array_pair_list comma_or_error array_pair       { push($1, $3); }
    | array_pair                                            { init($1); }
;

array_pair:
      expr                                                  { $$ = Expr\ArrayItem[$1, null, false]; }
    | ampersand variable                                    { $$ = Expr\ArrayItem[$2, null, true]; }
    | list_expr                                             { $$ = Expr\ArrayItem[$1, null, false]; }
    | expr T_DOUBLE_ARROW expr                              { $$ = Expr\ArrayItem[$3, $1,   false]; }
    | expr T_DOUBLE_ARROW ampersand variable                { $$ = Expr\ArrayItem[$4, $1,   true]; }
    | expr T_DOUBLE_ARROW list_expr                         { $$ = Expr\ArrayItem[$3, $1,   false]; }
    | T_ELLIPSIS expr                                       { $$ = new Expr\ArrayItem($2, null, false, attributes(), true); }
    | /* empty */                                           { $$ = null; }
;

encaps_list:
      encaps_list encaps_var                                { push($1, $2); }
    | encaps_list encaps_string_part                        { push($1, $2); }
    | encaps_var                                            { init($1); }
    | encaps_string_part encaps_var                         { init($1, $2); }
;

encaps_string_part:
      T_ENCAPSED_AND_WHITESPACE                             { $$ = Scalar\EncapsedStringPart[$1]; }
;

encaps_str_varname:
      T_STRING_VARNAME                                      { $$ = Expr\Variable[$1]; }
;

encaps_var:
      plain_variable                                        { $$ = $1; }
    | plain_variable '[' encaps_var_offset ']'              { $$ = Expr\ArrayDimFetch[$1, $3]; }
    | plain_variable T_OBJECT_OPERATOR identifier_not_reserved
          { $$ = Expr\PropertyFetch[$1, $3]; }
    | plain_variable T_NULLSAFE_OBJECT_OPERATOR identifier_not_reserved
          { $$ = Expr\NullsafePropertyFetch[$1, $3]; }
    | T_DOLLAR_OPEN_CURLY_BRACES expr '}'                   { $$ = Expr\Variable[$2]; }
    | T_DOLLAR_OPEN_CURLY_BRACES T_STRING_VARNAME '}'       { $$ = Expr\Variable[$2]; }
    | T_DOLLAR_OPEN_CURLY_BRACES encaps_str_varname '[' expr ']' '}'
          { $$ = Expr\ArrayDimFetch[$2, $4]; }
    | T_CURLY_OPEN variable '}'                             { $$ = $2; }
;

encaps_var_offset:
      T_STRING                                              { $$ = Scalar\String_[$1]; }
    | T_NUM_STRING                                          { $$ = $this->parseNumString($1, attributes()); }
    | '-' T_NUM_STRING                                      { $$ = $this->parseNumString('-' . $2, attributes()); }
    | plain_variable                                        { $$ = $1; }
;

%%
<?php

///////////////////////////////
/// Utility regex constants ///
///////////////////////////////

const LIB = '(?(DEFINE)
    (?<singleQuotedString>\'[^\\\\\']*+(?:\\\\.[^\\\\\']*+)*+\')
    (?<doubleQuotedString>"[^\\\\"]*+(?:\\\\.[^\\\\"]*+)*+")
    (?<string>(?&singleQuotedString)|(?&doubleQuotedString))
    (?<comment>/\*[^*]*+(?:\*(?!/)[^*]*+)*+\*/)
    (?<code>\{[^\'"/{}]*+(?:(?:(?&string)|(?&comment)|(?&code)|/)[^\'"/{}]*+)*+})
)';

const PARAMS = '\[(?<params>[^[\]]*+(?:\[(?&params)\][^[\]]*+)*+)\]';
const ARGS   = '\((?<args>[^()]*+(?:\((?&args)\)[^()]*+)*+)\)';

///////////////////////////////
/// Preprocessing functions ///
///////////////////////////////

function preprocessGrammar($code) {
    $code = resolveNodes($code);
    $code = resolveMacros($code);
    $code = resolveStackAccess($code);

    return $code;
}

function resolveNodes($code) {
    return preg_replace_callback(
        '~\b(?<name>[A-Z][a-zA-Z_\\\\]++)\s*' . PARAMS . '~',
        function($matches) {
            // recurse
            $matches['params'] = resolveNodes($matches['params']);

            $params = magicSplit(
                '(?:' . PARAMS . '|' . ARGS . ')(*SKIP)(*FAIL)|,',
                $matches['params']
            );

            $paramCode = '';
            foreach ($params as $param) {
                $paramCode .= $param . ', ';
            }

            return 'new ' . $matches['name'] . '(' . $paramCode . 'attributes())';
        },
        $code
    );
}

function resolveMacros($code) {
    return preg_replace_callback(
        '~\b(?<!::|->)(?!array\()(?<name>[a-z][A-Za-z]++)' . ARGS . '~',
        function($matches) {
            // recurse
            $matches['args'] = resolveMacros($matches['args']);

            $name = $matches['name'];
            $args = magicSplit(
                '(?:' . PARAMS . '|' . ARGS . ')(*SKIP)(*FAIL)|,',
                $matches['args']
            );

            if ('attributes' === $name) {
                assertArgs(0, $args, $name);
                return '$this->startAttributeStack[#1] + $this->endAttributes';
            }

            if ('stackAttributes' === $name) {
                assertArgs(1, $args, $name);
                return '$this->startAttributeStack[' . $args[0] . ']'
                       . ' + $this->endAttributeStack[' . $args[0] . ']';
            }

            if ('init' === $name) {
                return '$$ = array(' . implode(', ', $args) . ')';
            }

            if ('push' === $name) {
                assertArgs(2, $args, $name);

                return $args[0] . '[] = ' . $args[1] . '; $$ = ' . $args[0];
            }

            if ('pushNormalizing' === $name) {
                assertArgs(2, $args, $name);

                return 'if (is_array(' . $args[1] . ')) { $$ = array_merge(' . $args[0] . ', ' . $args[1] . '); }'
                       . ' else { ' . $args[0] . '[] = ' . $args[1] . '; $$ = ' . $args[0] . '; }';
            }

            if ('toArray' == $name) {
                assertArgs(1, $args, $name);

                return 'is_array(' . $args[0] . ') ? ' . $args[0] . ' : array(' . $args[0] . ')';
            }

            if ('parseVar' === $name) {
                assertArgs(1, $args, $name);

                return 'substr(' . $args[0] . ', 1)';
            }

            if ('parseEncapsed' === $name) {
                assertArgs(3, $args, $name);

                return 'foreach (' . $args[0] . ' as $s) { if ($s instanceof Node\Scalar\EncapsedStringPart) {'
                       . ' $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, ' . $args[1] . ', ' . $args[2] . '); } }';
            }

            if ('makeNop' === $name) {
                assertArgs(3, $args, $name);

                return '$startAttributes = ' . $args[1] . ';'
                       . ' if (isset($startAttributes[\'comments\']))'
                       . ' { ' . $args[0] . ' = new Stmt\Nop($startAttributes + ' . $args[2] . '); }'
                       . ' else { ' . $args[0] . ' = null; }';
            }

            if ('makeZeroLengthNop' == $name) {
                assertArgs(2, $args, $name);

                return '$startAttributes = ' . $args[1] . ';'
                       . ' if (isset($startAttributes[\'comments\']))'
                       . ' { ' . $args[0] . ' = new Stmt\Nop($this->createCommentNopAttributes($startAttributes[\'comments\'])); }'
                       . ' else { ' . $args[0] . ' = null; }';
            }

            if ('prependLeadingComments' === $name) {
                assertArgs(1, $args, $name);

                return '$attrs = $this->startAttributeStack[#1]; $stmts = ' . $args[0] . '; '
                       . 'if (!empty($attrs[\'comments\'])) {'
                       . '$stmts[0]->setAttribute(\'comments\', '
                       . 'array_merge($attrs[\'comments\'], $stmts[0]->getAttribute(\'comments\', []))); }';
            }

            return $matches[0];
        },
        $code
    );
}

function assertArgs($num, $args, $name) {
    if ($num != count($args)) {
        die('Wrong argument count for ' . $name . '().');
    }
}

function resolveStackAccess($code) {
    $code = preg_replace('/\$\d+/', '$this->semStack[$0]', $code);
    $code = preg_replace('/#(\d+)/', '$$1', $code);
    return $code;
}

function removeTrailingWhitespace($code) {
    $lines = explode("\n", $code);
    $lines = array_map('rtrim', $lines);
    return implode("\n", $lines);
}

//////////////////////////////
/// Regex helper functions ///
//////////////////////////////

function regex($regex) {
    return '~' . LIB . '(?:' . str_replace('~', '\~', $regex) . ')~';
}

function magicSplit($regex, $string) {
    $pieces = preg_split(regex('(?:(?&string)|(?&comment)|(?&code))(*SKIP)(*FAIL)|' . $regex), $string);

    foreach ($pieces as &$piece) {
        $piece = trim($piece);
    }

    if ($pieces === ['']) {
        return [];
    }

    return $pieces;
}
<?php

require __DIR__ . '/phpyLang.php';

$grammarFileToName = [
    __DIR__ . '/php5.y' => 'Php5',
    __DIR__ . '/php7.y' => 'Php7',
];

$tokensFile     = __DIR__ . '/tokens.y';
$tokensTemplate = __DIR__ . '/tokens.template';
$skeletonFile   = __DIR__ . '/parser.template';
$tmpGrammarFile = __DIR__ . '/tmp_parser.phpy';
$tmpResultFile  = __DIR__ . '/tmp_parser.php';
$resultDir = __DIR__ . '/../lib/PhpParser/Parser';
$tokensResultsFile = $resultDir . '/Tokens.php';

$kmyacc = getenv('KMYACC');
if (!$kmyacc) {
    // Use phpyacc from dev dependencies by default.
    $kmyacc = __DIR__ . '/../vendor/bin/phpyacc';
}

$options = array_flip($argv);
$optionDebug = isset($options['--debug']);
$optionKeepTmpGrammar = isset($options['--keep-tmp-grammar']);

///////////////////
/// Main script ///
///////////////////

$tokens = file_get_contents($tokensFile);

foreach ($grammarFileToName as $grammarFile => $name) {
    echo "Building temporary $name grammar file.\n";

    $grammarCode = file_get_contents($grammarFile);
    $grammarCode = str_replace('%tokens', $tokens, $grammarCode);
    $grammarCode = preprocessGrammar($grammarCode);

    file_put_contents($tmpGrammarFile, $grammarCode);

    $additionalArgs = $optionDebug ? '-t -v' : '';

    echo "Building $name parser.\n";
    $output = execCmd("$kmyacc $additionalArgs -m $skeletonFile -p $name $tmpGrammarFile");

    $resultCode = file_get_contents($tmpResultFile);
    $resultCode = removeTrailingWhitespace($resultCode);

    ensureDirExists($resultDir);
    file_put_contents("$resultDir/$name.php", $resultCode);
    unlink($tmpResultFile);

    echo "Building token definition.\n";
    $output = execCmd("$kmyacc -m $tokensTemplate $tmpGrammarFile");
    rename($tmpResultFile, $tokensResultsFile);

    if (!$optionKeepTmpGrammar) {
        unlink($tmpGrammarFile);
    }
}

////////////////////////////////
/// Utility helper functions ///
////////////////////////////////

function ensureDirExists($dir) {
    if (!is_dir($dir)) {
        mkdir($dir, 0777, true);
    }
}

function execCmd($cmd) {
    $output = trim(shell_exec("$cmd 2>&1"));
    if ($output !== "") {
        echo "> " . $cmd . "\n";
        echo $output;
    }
    return $output;
}
<?php
$meta #
#semval($) $this->semValue
#semval($,%t) $this->semValue
#semval(%n) $this->stackPos-(%l-%n)
#semval(%n,%t) $this->stackPos-(%l-%n)

namespace PhpParser\Parser;
#include;

/* GENERATED file based on grammar/tokens.y */
final class Tokens
{
#tokenval
    const %s = %n;
#endtokenval
}
/* We currently rely on the token ID mapping to be the same between PHP 5 and PHP 7 - so the same lexer can be used for
 * both. This is enforced by sharing this token file. */

%right T_THROW
%left T_INCLUDE T_INCLUDE_ONCE T_EVAL T_REQUIRE T_REQUIRE_ONCE
%left ','
%left T_LOGICAL_OR
%left T_LOGICAL_XOR
%left T_LOGICAL_AND
%right T_PRINT
%right T_YIELD
%right T_DOUBLE_ARROW
%right T_YIELD_FROM
%left '=' T_PLUS_EQUAL T_MINUS_EQUAL T_MUL_EQUAL T_DIV_EQUAL T_CONCAT_EQUAL T_MOD_EQUAL T_AND_EQUAL T_OR_EQUAL T_XOR_EQUAL T_SL_EQUAL T_SR_EQUAL T_POW_EQUAL T_COALESCE_EQUAL
%left '?' ':'
%right T_COALESCE
%left T_BOOLEAN_OR
%left T_BOOLEAN_AND
%left '|'
%left '^'
%left T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG
%nonassoc T_IS_EQUAL T_IS_NOT_EQUAL T_IS_IDENTICAL T_IS_NOT_IDENTICAL T_SPACESHIP
%nonassoc '<' T_IS_SMALLER_OR_EQUAL '>' T_IS_GREATER_OR_EQUAL
%left T_SL T_SR
%left '+' '-' '.'
%left '*' '/' '%'
%right '!'
%nonassoc T_INSTANCEOF
%right '~' T_INC T_DEC T_INT_CAST T_DOUBLE_CAST T_STRING_CAST T_ARRAY_CAST T_OBJECT_CAST T_BOOL_CAST T_UNSET_CAST '@'
%right T_POW
%right '['
%nonassoc T_NEW T_CLONE
%token T_EXIT
%token T_IF
%left T_ELSEIF
%left T_ELSE
%left T_ENDIF
%token T_LNUMBER
%token T_DNUMBER
%token T_STRING
%token T_STRING_VARNAME
%token T_VARIABLE
%token T_NUM_STRING
%token T_INLINE_HTML
%token T_ENCAPSED_AND_WHITESPACE
%token T_CONSTANT_ENCAPSED_STRING
%token T_ECHO
%token T_DO
%token T_WHILE
%token T_ENDWHILE
%token T_FOR
%token T_ENDFOR
%token T_FOREACH
%token T_ENDFOREACH
%token T_DECLARE
%token T_ENDDECLARE
%token T_AS
%token T_SWITCH
%token T_MATCH
%token T_ENDSWITCH
%token T_CASE
%token T_DEFAULT
%token T_BREAK
%token T_CONTINUE
%token T_GOTO
%token T_FUNCTION
%token T_FN
%token T_CONST
%token T_RETURN
%token T_TRY
%token T_CATCH
%token T_FINALLY
%token T_THROW
%token T_USE
%token T_INSTEADOF
%token T_GLOBAL
%right T_STATIC T_ABSTRACT T_FINAL T_PRIVATE T_PROTECTED T_PUBLIC T_READONLY
%token T_VAR
%token T_UNSET
%token T_ISSET
%token T_EMPTY
%token T_HALT_COMPILER
%token T_CLASS
%token T_TRAIT
%token T_INTERFACE
%token T_ENUM
%token T_EXTENDS
%token T_IMPLEMENTS
%token T_OBJECT_OPERATOR
%token T_NULLSAFE_OBJECT_OPERATOR
%token T_DOUBLE_ARROW
%token T_LIST
%token T_ARRAY
%token T_CALLABLE
%token T_CLASS_C
%token T_TRAIT_C
%token T_METHOD_C
%token T_FUNC_C
%token T_LINE
%token T_FILE
%token T_START_HEREDOC
%token T_END_HEREDOC
%token T_DOLLAR_OPEN_CURLY_BRACES
%token T_CURLY_OPEN
%token T_PAAMAYIM_NEKUDOTAYIM
%token T_NAMESPACE
%token T_NS_C
%token T_DIR
%token T_NS_SEPARATOR
%token T_ELLIPSIS
%token T_NAME_FULLY_QUALIFIED
%token T_NAME_QUALIFIED
%token T_NAME_RELATIVE
%token T_ATTRIBUTE
%token T_ENUM
<?php declare(strict_types=1);

namespace PhpParser;

interface Builder
{
    /**
     * Returns the built node.
     *
     * @return Node The built node
     */
    public function getNode() : Node;
}
<?php

declare(strict_types=1);

namespace PhpParser\Builder;

use PhpParser;
use PhpParser\BuilderHelpers;
use PhpParser\Node;
use PhpParser\Node\Const_;
use PhpParser\Node\Identifier;
use PhpParser\Node\Stmt;

class ClassConst implements PhpParser\Builder
{
    protected $flags = 0;
    protected $attributes = [];
    protected $constants = [];

    /** @var Node\AttributeGroup[] */
    protected $attributeGroups = [];
    /** @var Identifier|Node\Name|Node\ComplexType */
    protected $type;

    /**
     * Creates a class constant builder
     *
     * @param string|Identifier                          $name  Name
     * @param Node\Expr|bool|null|int|float|string|array $value Value
     */
    public function __construct($name, $value) {
        $this->constants = [new Const_($name, BuilderHelpers::normalizeValue($value))];
    }

    /**
     * Add another constant to const group
     *
     * @param string|Identifier                          $name  Name
     * @param Node\Expr|bool|null|int|float|string|array $value Value
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function addConst($name, $value) {
        $this->constants[] = new Const_($name, BuilderHelpers::normalizeValue($value));

        return $this;
    }

    /**
     * Makes the constant public.
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function makePublic() {
        $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PUBLIC);

        return $this;
    }

    /**
     * Makes the constant protected.
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function makeProtected() {
        $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PROTECTED);

        return $this;
    }

    /**
     * Makes the constant private.
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function makePrivate() {
        $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PRIVATE);

        return $this;
    }

    /**
     * Makes the constant final.
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function makeFinal() {
        $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_FINAL);

        return $this;
    }

    /**
     * Sets doc comment for the constant.
     *
     * @param PhpParser\Comment\Doc|string $docComment Doc comment to set
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function setDocComment($docComment) {
        $this->attributes = [
            'comments' => [BuilderHelpers::normalizeDocComment($docComment)]
        ];

        return $this;
    }

    /**
     * Adds an attribute group.
     *
     * @param Node\Attribute|Node\AttributeGroup $attribute
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function addAttribute($attribute) {
        $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute);

        return $this;
    }

    /**
     * Sets the constant type.
     *
     * @param string|Node\Name|Identifier|Node\ComplexType $type
     *
     * @return $this
     */
    public function setType($type) {
        $this->type = BuilderHelpers::normalizeType($type);

        return $this;
    }

    /**
     * Returns the built class node.
     *
     * @return Stmt\ClassConst The built constant node
     */
    public function getNode(): PhpParser\Node {
        return new Stmt\ClassConst(
            $this->constants,
            $this->flags,
            $this->attributes,
            $this->attributeGroups,
            $this->type
        );
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Builder;

use PhpParser;
use PhpParser\BuilderHelpers;
use PhpParser\Node;
use PhpParser\Node\Name;
use PhpParser\Node\Stmt;

class Class_ extends Declaration
{
    protected $name;

    protected $extends = null;
    protected $implements = [];
    protected $flags = 0;

    protected $uses = [];
    protected $constants = [];
    protected $properties = [];
    protected $methods = [];

    /** @var Node\AttributeGroup[] */
    protected $attributeGroups = [];

    /**
     * Creates a class builder.
     *
     * @param string $name Name of the class
     */
    public function __construct(string $name) {
        $this->name = $name;
    }

    /**
     * Extends a class.
     *
     * @param Name|string $class Name of class to extend
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function extend($class) {
        $this->extends = BuilderHelpers::normalizeName($class);

        return $this;
    }

    /**
     * Implements one or more interfaces.
     *
     * @param Name|string ...$interfaces Names of interfaces to implement
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function implement(...$interfaces) {
        foreach ($interfaces as $interface) {
            $this->implements[] = BuilderHelpers::normalizeName($interface);
        }

        return $this;
    }

    /**
     * Makes the class abstract.
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function makeAbstract() {
        $this->flags = BuilderHelpers::addClassModifier($this->flags, Stmt\Class_::MODIFIER_ABSTRACT);

        return $this;
    }

    /**
     * Makes the class final.
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function makeFinal() {
        $this->flags = BuilderHelpers::addClassModifier($this->flags, Stmt\Class_::MODIFIER_FINAL);

        return $this;
    }

    public function makeReadonly() {
        $this->flags = BuilderHelpers::addClassModifier($this->flags, Stmt\Class_::MODIFIER_READONLY);

        return $this;
    }

    /**
     * Adds a statement.
     *
     * @param Stmt|PhpParser\Builder $stmt The statement to add
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function addStmt($stmt) {
        $stmt = BuilderHelpers::normalizeNode($stmt);

        $targets = [
            Stmt\TraitUse::class    => &$this->uses,
            Stmt\ClassConst::class  => &$this->constants,
            Stmt\Property::class    => &$this->properties,
            Stmt\ClassMethod::class => &$this->methods,
        ];

        $class = \get_class($stmt);
        if (!isset($targets[$class])) {
            throw new \LogicException(sprintf('Unexpected node of type "%s"', $stmt->getType()));
        }

        $targets[$class][] = $stmt;

        return $this;
    }

    /**
     * Adds an attribute group.
     *
     * @param Node\Attribute|Node\AttributeGroup $attribute
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function addAttribute($attribute) {
        $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute);

        return $this;
    }

    /**
     * Returns the built class node.
     *
     * @return Stmt\Class_ The built class node
     */
    public function getNode() : PhpParser\Node {
        return new Stmt\Class_($this->name, [
            'flags' => $this->flags,
            'extends' => $this->extends,
            'implements' => $this->implements,
            'stmts' => array_merge($this->uses, $this->constants, $this->properties, $this->methods),
            'attrGroups' => $this->attributeGroups,
        ], $this->attributes);
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Builder;

use PhpParser;
use PhpParser\BuilderHelpers;

abstract class Declaration implements PhpParser\Builder
{
    protected $attributes = [];

    abstract public function addStmt($stmt);

    /**
     * Adds multiple statements.
     *
     * @param array $stmts The statements to add
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function addStmts(array $stmts) {
        foreach ($stmts as $stmt) {
            $this->addStmt($stmt);
        }

        return $this;
    }

    /**
     * Sets doc comment for the declaration.
     *
     * @param PhpParser\Comment\Doc|string $docComment Doc comment to set
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function setDocComment($docComment) {
        $this->attributes['comments'] = [
            BuilderHelpers::normalizeDocComment($docComment)
        ];

        return $this;
    }
}
<?php

declare(strict_types=1);

namespace PhpParser\Builder;

use PhpParser;
use PhpParser\BuilderHelpers;
use PhpParser\Node;
use PhpParser\Node\Identifier;
use PhpParser\Node\Stmt;

class EnumCase implements PhpParser\Builder
{
    protected $name;
    protected $value = null;
    protected $attributes = [];

    /** @var Node\AttributeGroup[] */
    protected $attributeGroups = [];

    /**
     * Creates an enum case builder.
     *
     * @param string|Identifier $name  Name
     */
    public function __construct($name) {
        $this->name = $name;
    }

    /**
     * Sets the value.
     *
     * @param Node\Expr|string|int $value
     *
     * @return $this
     */
    public function setValue($value) {
        $this->value = BuilderHelpers::normalizeValue($value);

        return $this;
    }

    /**
     * Sets doc comment for the constant.
     *
     * @param PhpParser\Comment\Doc|string $docComment Doc comment to set
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function setDocComment($docComment) {
        $this->attributes = [
            'comments' => [BuilderHelpers::normalizeDocComment($docComment)]
        ];

        return $this;
    }

    /**
     * Adds an attribute group.
     *
     * @param Node\Attribute|Node\AttributeGroup $attribute
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function addAttribute($attribute) {
        $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute);

        return $this;
    }

    /**
     * Returns the built enum case node.
     *
     * @return Stmt\EnumCase The built constant node
     */
    public function getNode(): PhpParser\Node {
        return new Stmt\EnumCase(
            $this->name,
            $this->value,
            $this->attributeGroups,
            $this->attributes
        );
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Builder;

use PhpParser;
use PhpParser\BuilderHelpers;
use PhpParser\Node;
use PhpParser\Node\Identifier;
use PhpParser\Node\Name;
use PhpParser\Node\Stmt;

class Enum_ extends Declaration
{
    protected $name;
    protected $scalarType = null;

    protected $implements = [];

    protected $uses = [];
    protected $enumCases = [];
    protected $constants = [];
    protected $methods = [];

    /** @var Node\AttributeGroup[] */
    protected $attributeGroups = [];

    /**
     * Creates an enum builder.
     *
     * @param string $name Name of the enum
     */
    public function __construct(string $name) {
        $this->name = $name;
    }

    /**
     * Sets the scalar type.
     *
     * @param string|Identifier $type
     *
     * @return $this
     */
    public function setScalarType($scalarType) {
        $this->scalarType = BuilderHelpers::normalizeType($scalarType);

        return $this;
    }

    /**
     * Implements one or more interfaces.
     *
     * @param Name|string ...$interfaces Names of interfaces to implement
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function implement(...$interfaces) {
        foreach ($interfaces as $interface) {
            $this->implements[] = BuilderHelpers::normalizeName($interface);
        }

        return $this;
    }

    /**
     * Adds a statement.
     *
     * @param Stmt|PhpParser\Builder $stmt The statement to add
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function addStmt($stmt) {
        $stmt = BuilderHelpers::normalizeNode($stmt);

        $targets = [
            Stmt\TraitUse::class    => &$this->uses,
            Stmt\EnumCase::class    => &$this->enumCases,
            Stmt\ClassConst::class  => &$this->constants,
            Stmt\ClassMethod::class => &$this->methods,
        ];

        $class = \get_class($stmt);
        if (!isset($targets[$class])) {
            throw new \LogicException(sprintf('Unexpected node of type "%s"', $stmt->getType()));
        }

        $targets[$class][] = $stmt;

        return $this;
    }

    /**
     * Adds an attribute group.
     *
     * @param Node\Attribute|Node\AttributeGroup $attribute
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function addAttribute($attribute) {
        $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute);

        return $this;
    }

    /**
     * Returns the built class node.
     *
     * @return Stmt\Enum_ The built enum node
     */
    public function getNode() : PhpParser\Node {
        return new Stmt\Enum_($this->name, [
            'scalarType' => $this->scalarType,
            'implements' => $this->implements,
            'stmts' => array_merge($this->uses, $this->enumCases, $this->constants, $this->methods),
            'attrGroups' => $this->attributeGroups,
        ], $this->attributes);
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Builder;

use PhpParser\BuilderHelpers;
use PhpParser\Node;

abstract class FunctionLike extends Declaration
{
    protected $returnByRef = false;
    protected $params = [];

    /** @var string|Node\Name|Node\NullableType|null */
    protected $returnType = null;

    /**
     * Make the function return by reference.
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function makeReturnByRef() {
        $this->returnByRef = true;

        return $this;
    }

    /**
     * Adds a parameter.
     *
     * @param Node\Param|Param $param The parameter to add
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function addParam($param) {
        $param = BuilderHelpers::normalizeNode($param);

        if (!$param instanceof Node\Param) {
            throw new \LogicException(sprintf('Expected parameter node, got "%s"', $param->getType()));
        }

        $this->params[] = $param;

        return $this;
    }

    /**
     * Adds multiple parameters.
     *
     * @param array $params The parameters to add
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function addParams(array $params) {
        foreach ($params as $param) {
            $this->addParam($param);
        }

        return $this;
    }

    /**
     * Sets the return type for PHP 7.
     *
     * @param string|Node\Name|Node\Identifier|Node\ComplexType $type
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function setReturnType($type) {
        $this->returnType = BuilderHelpers::normalizeType($type);

        return $this;
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Builder;

use PhpParser;
use PhpParser\BuilderHelpers;
use PhpParser\Node;
use PhpParser\Node\Stmt;

class Function_ extends FunctionLike
{
    protected $name;
    protected $stmts = [];

    /** @var Node\AttributeGroup[] */
    protected $attributeGroups = [];

    /**
     * Creates a function builder.
     *
     * @param string $name Name of the function
     */
    public function __construct(string $name) {
        $this->name = $name;
    }

    /**
     * Adds a statement.
     *
     * @param Node|PhpParser\Builder $stmt The statement to add
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function addStmt($stmt) {
        $this->stmts[] = BuilderHelpers::normalizeStmt($stmt);

        return $this;
    }

    /**
     * Adds an attribute group.
     *
     * @param Node\Attribute|Node\AttributeGroup $attribute
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function addAttribute($attribute) {
        $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute);

        return $this;
    }

    /**
     * Returns the built function node.
     *
     * @return Stmt\Function_ The built function node
     */
    public function getNode() : Node {
        return new Stmt\Function_($this->name, [
            'byRef'      => $this->returnByRef,
            'params'     => $this->params,
            'returnType' => $this->returnType,
            'stmts'      => $this->stmts,
            'attrGroups' => $this->attributeGroups,
        ], $this->attributes);
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Builder;

use PhpParser;
use PhpParser\BuilderHelpers;
use PhpParser\Node;
use PhpParser\Node\Name;
use PhpParser\Node\Stmt;

class Interface_ extends Declaration
{
    protected $name;
    protected $extends = [];
    protected $constants = [];
    protected $methods = [];

    /** @var Node\AttributeGroup[] */
    protected $attributeGroups = [];

    /**
     * Creates an interface builder.
     *
     * @param string $name Name of the interface
     */
    public function __construct(string $name) {
        $this->name = $name;
    }

    /**
     * Extends one or more interfaces.
     *
     * @param Name|string ...$interfaces Names of interfaces to extend
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function extend(...$interfaces) {
        foreach ($interfaces as $interface) {
            $this->extends[] = BuilderHelpers::normalizeName($interface);
        }

        return $this;
    }

    /**
     * Adds a statement.
     *
     * @param Stmt|PhpParser\Builder $stmt The statement to add
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function addStmt($stmt) {
        $stmt = BuilderHelpers::normalizeNode($stmt);

        if ($stmt instanceof Stmt\ClassConst) {
            $this->constants[] = $stmt;
        } elseif ($stmt instanceof Stmt\ClassMethod) {
            // we erase all statements in the body of an interface method
            $stmt->stmts = null;
            $this->methods[] = $stmt;
        } else {
            throw new \LogicException(sprintf('Unexpected node of type "%s"', $stmt->getType()));
        }

        return $this;
    }

    /**
     * Adds an attribute group.
     *
     * @param Node\Attribute|Node\AttributeGroup $attribute
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function addAttribute($attribute) {
        $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute);

        return $this;
    }

    /**
     * Returns the built interface node.
     *
     * @return Stmt\Interface_ The built interface node
     */
    public function getNode() : PhpParser\Node {
        return new Stmt\Interface_($this->name, [
            'extends' => $this->extends,
            'stmts' => array_merge($this->constants, $this->methods),
            'attrGroups' => $this->attributeGroups,
        ], $this->attributes);
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Builder;

use PhpParser;
use PhpParser\BuilderHelpers;
use PhpParser\Node;
use PhpParser\Node\Stmt;

class Method extends FunctionLike
{
    protected $name;
    protected $flags = 0;

    /** @var array|null */
    protected $stmts = [];

    /** @var Node\AttributeGroup[] */
    protected $attributeGroups = [];

    /**
     * Creates a method builder.
     *
     * @param string $name Name of the method
     */
    public function __construct(string $name) {
        $this->name = $name;
    }

    /**
     * Makes the method public.
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function makePublic() {
        $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PUBLIC);

        return $this;
    }

    /**
     * Makes the method protected.
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function makeProtected() {
        $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PROTECTED);

        return $this;
    }

    /**
     * Makes the method private.
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function makePrivate() {
        $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PRIVATE);

        return $this;
    }

    /**
     * Makes the method static.
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function makeStatic() {
        $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_STATIC);

        return $this;
    }

    /**
     * Makes the method abstract.
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function makeAbstract() {
        if (!empty($this->stmts)) {
            throw new \LogicException('Cannot make method with statements abstract');
        }

        $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_ABSTRACT);
        $this->stmts = null; // abstract methods don't have statements

        return $this;
    }

    /**
     * Makes the method final.
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function makeFinal() {
        $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_FINAL);

        return $this;
    }

    /**
     * Adds a statement.
     *
     * @param Node|PhpParser\Builder $stmt The statement to add
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function addStmt($stmt) {
        if (null === $this->stmts) {
            throw new \LogicException('Cannot add statements to an abstract method');
        }

        $this->stmts[] = BuilderHelpers::normalizeStmt($stmt);

        return $this;
    }

    /**
     * Adds an attribute group.
     *
     * @param Node\Attribute|Node\AttributeGroup $attribute
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function addAttribute($attribute) {
        $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute);

        return $this;
    }

    /**
     * Returns the built method node.
     *
     * @return Stmt\ClassMethod The built method node
     */
    public function getNode() : Node {
        return new Stmt\ClassMethod($this->name, [
            'flags'      => $this->flags,
            'byRef'      => $this->returnByRef,
            'params'     => $this->params,
            'returnType' => $this->returnType,
            'stmts'      => $this->stmts,
            'attrGroups' => $this->attributeGroups,
        ], $this->attributes);
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Builder;

use PhpParser;
use PhpParser\BuilderHelpers;
use PhpParser\Node;
use PhpParser\Node\Stmt;

class Namespace_ extends Declaration
{
    private $name;
    private $stmts = [];

    /**
     * Creates a namespace builder.
     *
     * @param Node\Name|string|null $name Name of the namespace
     */
    public function __construct($name) {
        $this->name = null !== $name ? BuilderHelpers::normalizeName($name) : null;
    }

    /**
     * Adds a statement.
     *
     * @param Node|PhpParser\Builder $stmt The statement to add
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function addStmt($stmt) {
        $this->stmts[] = BuilderHelpers::normalizeStmt($stmt);

        return $this;
    }

    /**
     * Returns the built node.
     *
     * @return Stmt\Namespace_ The built node
     */
    public function getNode() : Node {
        return new Stmt\Namespace_($this->name, $this->stmts, $this->attributes);
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Builder;

use PhpParser;
use PhpParser\BuilderHelpers;
use PhpParser\Node;

class Param implements PhpParser\Builder
{
    protected $name;

    protected $default = null;

    /** @var Node\Identifier|Node\Name|Node\NullableType|null */
    protected $type = null;

    protected $byRef = false;

    protected $variadic = false;

    protected $flags = 0;

    /** @var Node\AttributeGroup[] */
    protected $attributeGroups = [];

    /**
     * Creates a parameter builder.
     *
     * @param string $name Name of the parameter
     */
    public function __construct(string $name) {
        $this->name = $name;
    }

    /**
     * Sets default value for the parameter.
     *
     * @param mixed $value Default value to use
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function setDefault($value) {
        $this->default = BuilderHelpers::normalizeValue($value);

        return $this;
    }

    /**
     * Sets type for the parameter.
     *
     * @param string|Node\Name|Node\Identifier|Node\ComplexType $type Parameter type
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function setType($type) {
        $this->type = BuilderHelpers::normalizeType($type);
        if ($this->type == 'void') {
            throw new \LogicException('Parameter type cannot be void');
        }

        return $this;
    }

    /**
     * Sets type for the parameter.
     *
     * @param string|Node\Name|Node\Identifier|Node\ComplexType $type Parameter type
     *
     * @return $this The builder instance (for fluid interface)
     *
     * @deprecated Use setType() instead
     */
    public function setTypeHint($type) {
        return $this->setType($type);
    }

    /**
     * Make the parameter accept the value by reference.
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function makeByRef() {
        $this->byRef = true;

        return $this;
    }

    /**
     * Make the parameter variadic
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function makeVariadic() {
        $this->variadic = true;

        return $this;
    }

    /**
     * Makes the (promoted) parameter public.
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function makePublic() {
        $this->flags = BuilderHelpers::addModifier($this->flags, Node\Stmt\Class_::MODIFIER_PUBLIC);

        return $this;
    }

    /**
     * Makes the (promoted) parameter protected.
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function makeProtected() {
        $this->flags = BuilderHelpers::addModifier($this->flags, Node\Stmt\Class_::MODIFIER_PROTECTED);

        return $this;
    }

    /**
     * Makes the (promoted) parameter private.
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function makePrivate() {
        $this->flags = BuilderHelpers::addModifier($this->flags, Node\Stmt\Class_::MODIFIER_PRIVATE);

        return $this;
    }

    /**
     * Makes the (promoted) parameter readonly.
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function makeReadonly() {
        $this->flags = BuilderHelpers::addModifier($this->flags, Node\Stmt\Class_::MODIFIER_READONLY);

        return $this;
    }

    /**
     * Adds an attribute group.
     *
     * @param Node\Attribute|Node\AttributeGroup $attribute
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function addAttribute($attribute) {
        $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute);

        return $this;
    }

    /**
     * Returns the built parameter node.
     *
     * @return Node\Param The built parameter node
     */
    public function getNode() : Node {
        return new Node\Param(
            new Node\Expr\Variable($this->name),
            $this->default, $this->type, $this->byRef, $this->variadic, [], $this->flags, $this->attributeGroups
        );
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Builder;

use PhpParser;
use PhpParser\BuilderHelpers;
use PhpParser\Node;
use PhpParser\Node\Identifier;
use PhpParser\Node\Name;
use PhpParser\Node\Stmt;
use PhpParser\Node\ComplexType;

class Property implements PhpParser\Builder
{
    protected $name;

    protected $flags = 0;
    protected $default = null;
    protected $attributes = [];

    /** @var null|Identifier|Name|NullableType */
    protected $type;

    /** @var Node\AttributeGroup[] */
    protected $attributeGroups = [];

    /**
     * Creates a property builder.
     *
     * @param string $name Name of the property
     */
    public function __construct(string $name) {
        $this->name = $name;
    }

    /**
     * Makes the property public.
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function makePublic() {
        $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PUBLIC);

        return $this;
    }

    /**
     * Makes the property protected.
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function makeProtected() {
        $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PROTECTED);

        return $this;
    }

    /**
     * Makes the property private.
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function makePrivate() {
        $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PRIVATE);

        return $this;
    }

    /**
     * Makes the property static.
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function makeStatic() {
        $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_STATIC);

        return $this;
    }

    /**
     * Makes the property readonly.
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function makeReadonly() {
        $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_READONLY);

        return $this;
    }

    /**
     * Sets default value for the property.
     *
     * @param mixed $value Default value to use
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function setDefault($value) {
        $this->default = BuilderHelpers::normalizeValue($value);

        return $this;
    }

    /**
     * Sets doc comment for the property.
     *
     * @param PhpParser\Comment\Doc|string $docComment Doc comment to set
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function setDocComment($docComment) {
        $this->attributes = [
            'comments' => [BuilderHelpers::normalizeDocComment($docComment)]
        ];

        return $this;
    }

    /**
     * Sets the property type for PHP 7.4+.
     *
     * @param string|Name|Identifier|ComplexType $type
     *
     * @return $this
     */
    public function setType($type) {
        $this->type = BuilderHelpers::normalizeType($type);

        return $this;
    }

    /**
     * Adds an attribute group.
     *
     * @param Node\Attribute|Node\AttributeGroup $attribute
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function addAttribute($attribute) {
        $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute);

        return $this;
    }

    /**
     * Returns the built class node.
     *
     * @return Stmt\Property The built property node
     */
    public function getNode() : PhpParser\Node {
        return new Stmt\Property(
            $this->flags !== 0 ? $this->flags : Stmt\Class_::MODIFIER_PUBLIC,
            [
                new Stmt\PropertyProperty($this->name, $this->default)
            ],
            $this->attributes,
            $this->type,
            $this->attributeGroups
        );
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Builder;

use PhpParser\Builder;
use PhpParser\BuilderHelpers;
use PhpParser\Node;
use PhpParser\Node\Stmt;

class TraitUse implements Builder
{
    protected $traits = [];
    protected $adaptations = [];

    /**
     * Creates a trait use builder.
     *
     * @param Node\Name|string ...$traits Names of used traits
     */
    public function __construct(...$traits) {
        foreach ($traits as $trait) {
            $this->and($trait);
        }
    }

    /**
     * Adds used trait.
     *
     * @param Node\Name|string $trait Trait name
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function and($trait) {
        $this->traits[] = BuilderHelpers::normalizeName($trait);
        return $this;
    }

    /**
     * Adds trait adaptation.
     *
     * @param Stmt\TraitUseAdaptation|Builder\TraitUseAdaptation $adaptation Trait adaptation
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function with($adaptation) {
        $adaptation = BuilderHelpers::normalizeNode($adaptation);

        if (!$adaptation instanceof Stmt\TraitUseAdaptation) {
            throw new \LogicException('Adaptation must have type TraitUseAdaptation');
        }

        $this->adaptations[] = $adaptation;
        return $this;
    }

    /**
     * Returns the built node.
     *
     * @return Node The built node
     */
    public function getNode() : Node {
        return new Stmt\TraitUse($this->traits, $this->adaptations);
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Builder;

use PhpParser\Builder;
use PhpParser\BuilderHelpers;
use PhpParser\Node;
use PhpParser\Node\Stmt;

class TraitUseAdaptation implements Builder
{
    const TYPE_UNDEFINED  = 0;
    const TYPE_ALIAS      = 1;
    const TYPE_PRECEDENCE = 2;

    /** @var int Type of building adaptation */
    protected $type;

    protected $trait;
    protected $method;

    protected $modifier = null;
    protected $alias = null;

    protected $insteadof = [];

    /**
     * Creates a trait use adaptation builder.
     *
     * @param Node\Name|string|null  $trait  Name of adaptated trait
     * @param Node\Identifier|string $method Name of adaptated method
     */
    public function __construct($trait, $method) {
        $this->type = self::TYPE_UNDEFINED;

        $this->trait = is_null($trait)? null: BuilderHelpers::normalizeName($trait);
        $this->method = BuilderHelpers::normalizeIdentifier($method);
    }

    /**
     * Sets alias of method.
     *
     * @param Node\Identifier|string $alias Alias for adaptated method
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function as($alias) {
        if ($this->type === self::TYPE_UNDEFINED) {
            $this->type = self::TYPE_ALIAS;
        }

        if ($this->type !== self::TYPE_ALIAS) {
            throw new \LogicException('Cannot set alias for not alias adaptation buider');
        }

        $this->alias = $alias;
        return $this;
    }

    /**
     * Sets adaptated method public.
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function makePublic() {
        $this->setModifier(Stmt\Class_::MODIFIER_PUBLIC);
        return $this;
    }

    /**
     * Sets adaptated method protected.
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function makeProtected() {
        $this->setModifier(Stmt\Class_::MODIFIER_PROTECTED);
        return $this;
    }

    /**
     * Sets adaptated method private.
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function makePrivate() {
        $this->setModifier(Stmt\Class_::MODIFIER_PRIVATE);
        return $this;
    }

    /**
     * Adds overwritten traits.
     *
     * @param Node\Name|string ...$traits Traits for overwrite
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function insteadof(...$traits) {
        if ($this->type === self::TYPE_UNDEFINED) {
            if (is_null($this->trait)) {
                throw new \LogicException('Precedence adaptation must have trait');
            }

            $this->type = self::TYPE_PRECEDENCE;
        }

        if ($this->type !== self::TYPE_PRECEDENCE) {
            throw new \LogicException('Cannot add overwritten traits for not precedence adaptation buider');
        }

        foreach ($traits as $trait) {
            $this->insteadof[] = BuilderHelpers::normalizeName($trait);
        }

        return $this;
    }

    protected function setModifier(int $modifier) {
        if ($this->type === self::TYPE_UNDEFINED) {
            $this->type = self::TYPE_ALIAS;
        }

        if ($this->type !== self::TYPE_ALIAS) {
            throw new \LogicException('Cannot set access modifier for not alias adaptation buider');
        }

        if (is_null($this->modifier)) {
            $this->modifier = $modifier;
        } else {
            throw new \LogicException('Multiple access type modifiers are not allowed');
        }
    }

    /**
     * Returns the built node.
     *
     * @return Node The built node
     */
    public function getNode() : Node {
        switch ($this->type) {
            case self::TYPE_ALIAS:
                return new Stmt\TraitUseAdaptation\Alias($this->trait, $this->method, $this->modifier, $this->alias);
            case self::TYPE_PRECEDENCE:
                return new Stmt\TraitUseAdaptation\Precedence($this->trait, $this->method, $this->insteadof);
            default:
                throw new \LogicException('Type of adaptation is not defined');
        }
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Builder;

use PhpParser;
use PhpParser\BuilderHelpers;
use PhpParser\Node;
use PhpParser\Node\Stmt;

class Trait_ extends Declaration
{
    protected $name;
    protected $uses = [];
    protected $properties = [];
    protected $methods = [];

    /** @var Node\AttributeGroup[] */
    protected $attributeGroups = [];

    /**
     * Creates an interface builder.
     *
     * @param string $name Name of the interface
     */
    public function __construct(string $name) {
        $this->name = $name;
    }

    /**
     * Adds a statement.
     *
     * @param Stmt|PhpParser\Builder $stmt The statement to add
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function addStmt($stmt) {
        $stmt = BuilderHelpers::normalizeNode($stmt);

        if ($stmt instanceof Stmt\Property) {
            $this->properties[] = $stmt;
        } elseif ($stmt instanceof Stmt\ClassMethod) {
            $this->methods[] = $stmt;
        } elseif ($stmt instanceof Stmt\TraitUse) {
            $this->uses[] = $stmt;
        } else {
            throw new \LogicException(sprintf('Unexpected node of type "%s"', $stmt->getType()));
        }

        return $this;
    }

    /**
     * Adds an attribute group.
     *
     * @param Node\Attribute|Node\AttributeGroup $attribute
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function addAttribute($attribute) {
        $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute);

        return $this;
    }

    /**
     * Returns the built trait node.
     *
     * @return Stmt\Trait_ The built interface node
     */
    public function getNode() : PhpParser\Node {
        return new Stmt\Trait_(
            $this->name, [
                'stmts' => array_merge($this->uses, $this->properties, $this->methods),
                'attrGroups' => $this->attributeGroups,
            ], $this->attributes
        );
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Builder;

use PhpParser\Builder;
use PhpParser\BuilderHelpers;
use PhpParser\Node;
use PhpParser\Node\Stmt;

class Use_ implements Builder
{
    protected $name;
    protected $type;
    protected $alias = null;

    /**
     * Creates a name use (alias) builder.
     *
     * @param Node\Name|string $name Name of the entity (namespace, class, function, constant) to alias
     * @param int              $type One of the Stmt\Use_::TYPE_* constants
     */
    public function __construct($name, int $type) {
        $this->name = BuilderHelpers::normalizeName($name);
        $this->type = $type;
    }

    /**
     * Sets alias for used name.
     *
     * @param string $alias Alias to use (last component of full name by default)
     *
     * @return $this The builder instance (for fluid interface)
     */
    public function as(string $alias) {
        $this->alias = $alias;
        return $this;
    }

    /**
     * Returns the built node.
     *
     * @return Stmt\Use_ The built node
     */
    public function getNode() : Node {
        return new Stmt\Use_([
            new Stmt\UseUse($this->name, $this->alias)
        ], $this->type);
    }
}
<?php declare(strict_types=1);

namespace PhpParser;

use PhpParser\Node\Arg;
use PhpParser\Node\Expr;
use PhpParser\Node\Expr\BinaryOp\Concat;
use PhpParser\Node\Identifier;
use PhpParser\Node\Name;
use PhpParser\Node\Scalar\String_;
use PhpParser\Node\Stmt\Use_;

class BuilderFactory
{
    /**
     * Creates an attribute node.
     *
     * @param string|Name $name Name of the attribute
     * @param array       $args Attribute named arguments
     *
     * @return Node\Attribute
     */
    public function attribute($name, array $args = []) : Node\Attribute {
        return new Node\Attribute(
            BuilderHelpers::normalizeName($name),
            $this->args($args)
        );
    }

    /**
     * Creates a namespace builder.
     *
     * @param null|string|Node\Name $name Name of the namespace
     *
     * @return Builder\Namespace_ The created namespace builder
     */
    public function namespace($name) : Builder\Namespace_ {
        return new Builder\Namespace_($name);
    }

    /**
     * Creates a class builder.
     *
     * @param string $name Name of the class
     *
     * @return Builder\Class_ The created class builder
     */
    public function class(string $name) : Builder\Class_ {
        return new Builder\Class_($name);
    }

    /**
     * Creates an interface builder.
     *
     * @param string $name Name of the interface
     *
     * @return Builder\Interface_ The created interface builder
     */
    public function interface(string $name) : Builder\Interface_ {
        return new Builder\Interface_($name);
    }

    /**
     * Creates a trait builder.
     *
     * @param string $name Name of the trait
     *
     * @return Builder\Trait_ The created trait builder
     */
    public function trait(string $name) : Builder\Trait_ {
        return new Builder\Trait_($name);
    }

    /**
     * Creates an enum builder.
     *
     * @param string $name Name of the enum
     *
     * @return Builder\Enum_ The created enum builder
     */
    public function enum(string $name) : Builder\Enum_ {
        return new Builder\Enum_($name);
    }

    /**
     * Creates a trait use builder.
     *
     * @param Node\Name|string ...$traits Trait names
     *
     * @return Builder\TraitUse The create trait use builder
     */
    public function useTrait(...$traits) : Builder\TraitUse {
        return new Builder\TraitUse(...$traits);
    }

    /**
     * Creates a trait use adaptation builder.
     *
     * @param Node\Name|string|null  $trait  Trait name
     * @param Node\Identifier|string $method Method name
     *
     * @return Builder\TraitUseAdaptation The create trait use adaptation builder
     */
    public function traitUseAdaptation($trait, $method = null) : Builder\TraitUseAdaptation {
        if ($method === null) {
            $method = $trait;
            $trait = null;
        }

        return new Builder\TraitUseAdaptation($trait, $method);
    }

    /**
     * Creates a method builder.
     *
     * @param string $name Name of the method
     *
     * @return Builder\Method The created method builder
     */
    public function method(string $name) : Builder\Method {
        return new Builder\Method($name);
    }

    /**
     * Creates a parameter builder.
     *
     * @param string $name Name of the parameter
     *
     * @return Builder\Param The created parameter builder
     */
    public function param(string $name) : Builder\Param {
        return new Builder\Param($name);
    }

    /**
     * Creates a property builder.
     *
     * @param string $name Name of the property
     *
     * @return Builder\Property The created property builder
     */
    public function property(string $name) : Builder\Property {
        return new Builder\Property($name);
    }

    /**
     * Creates a function builder.
     *
     * @param string $name Name of the function
     *
     * @return Builder\Function_ The created function builder
     */
    public function function(string $name) : Builder\Function_ {
        return new Builder\Function_($name);
    }

    /**
     * Creates a namespace/class use builder.
     *
     * @param Node\Name|string $name Name of the entity (namespace or class) to alias
     *
     * @return Builder\Use_ The created use builder
     */
    public function use($name) : Builder\Use_ {
        return new Builder\Use_($name, Use_::TYPE_NORMAL);
    }

    /**
     * Creates a function use builder.
     *
     * @param Node\Name|string $name Name of the function to alias
     *
     * @return Builder\Use_ The created use function builder
     */
    public function useFunction($name) : Builder\Use_ {
        return new Builder\Use_($name, Use_::TYPE_FUNCTION);
    }

    /**
     * Creates a constant use builder.
     *
     * @param Node\Name|string $name Name of the const to alias
     *
     * @return Builder\Use_ The created use const builder
     */
    public function useConst($name) : Builder\Use_ {
        return new Builder\Use_($name, Use_::TYPE_CONSTANT);
    }

    /**
     * Creates a class constant builder.
     *
     * @param string|Identifier                          $name  Name
     * @param Node\Expr|bool|null|int|float|string|array $value Value
     *
     * @return Builder\ClassConst The created use const builder
     */
    public function classConst($name, $value) : Builder\ClassConst {
        return new Builder\ClassConst($name, $value);
    }

    /**
     * Creates an enum case builder.
     *
     * @param string|Identifier $name  Name
     *
     * @return Builder\EnumCase The created use const builder
     */
    public function enumCase($name) : Builder\EnumCase {
        return new Builder\EnumCase($name);
    }

    /**
     * Creates node a for a literal value.
     *
     * @param Expr|bool|null|int|float|string|array $value $value
     *
     * @return Expr
     */
    public function val($value) : Expr {
        return BuilderHelpers::normalizeValue($value);
    }

    /**
     * Creates variable node.
     *
     * @param string|Expr $name Name
     *
     * @return Expr\Variable
     */
    public function var($name) : Expr\Variable {
        if (!\is_string($name) && !$name instanceof Expr) {
            throw new \LogicException('Variable name must be string or Expr');
        }

        return new Expr\Variable($name);
    }

    /**
     * Normalizes an argument list.
     *
     * Creates Arg nodes for all arguments and converts literal values to expressions.
     *
     * @param array $args List of arguments to normalize
     *
     * @return Arg[]
     */
    public function args(array $args) : array {
        $normalizedArgs = [];
        foreach ($args as $key => $arg) {
            if (!($arg instanceof Arg)) {
                $arg = new Arg(BuilderHelpers::normalizeValue($arg));
            }
            if (\is_string($key)) {
                $arg->name = BuilderHelpers::normalizeIdentifier($key);
            }
            $normalizedArgs[] = $arg;
        }
        return $normalizedArgs;
    }

    /**
     * Creates a function call node.
     *
     * @param string|Name|Expr $name Function name
     * @param array            $args Function arguments
     *
     * @return Expr\FuncCall
     */
    public function funcCall($name, array $args = []) : Expr\FuncCall {
        return new Expr\FuncCall(
            BuilderHelpers::normalizeNameOrExpr($name),
            $this->args($args)
        );
    }

    /**
     * Creates a method call node.
     *
     * @param Expr                   $var  Variable the method is called on
     * @param string|Identifier|Expr $name Method name
     * @param array                  $args Method arguments
     *
     * @return Expr\MethodCall
     */
    public function methodCall(Expr $var, $name, array $args = []) : Expr\MethodCall {
        return new Expr\MethodCall(
            $var,
            BuilderHelpers::normalizeIdentifierOrExpr($name),
            $this->args($args)
        );
    }

    /**
     * Creates a static method call node.
     *
     * @param string|Name|Expr       $class Class name
     * @param string|Identifier|Expr $name  Method name
     * @param array                  $args  Method arguments
     *
     * @return Expr\StaticCall
     */
    public function staticCall($class, $name, array $args = []) : Expr\StaticCall {
        return new Expr\StaticCall(
            BuilderHelpers::normalizeNameOrExpr($class),
            BuilderHelpers::normalizeIdentifierOrExpr($name),
            $this->args($args)
        );
    }

    /**
     * Creates an object creation node.
     *
     * @param string|Name|Expr $class Class name
     * @param array            $args  Constructor arguments
     *
     * @return Expr\New_
     */
    public function new($class, array $args = []) : Expr\New_ {
        return new Expr\New_(
            BuilderHelpers::normalizeNameOrExpr($class),
            $this->args($args)
        );
    }

    /**
     * Creates a constant fetch node.
     *
     * @param string|Name $name Constant name
     *
     * @return Expr\ConstFetch
     */
    public function constFetch($name) : Expr\ConstFetch {
        return new Expr\ConstFetch(BuilderHelpers::normalizeName($name));
    }

    /**
     * Creates a property fetch node.
     *
     * @param Expr                   $var  Variable holding object
     * @param string|Identifier|Expr $name Property name
     *
     * @return Expr\PropertyFetch
     */
    public function propertyFetch(Expr $var, $name) : Expr\PropertyFetch {
        return new Expr\PropertyFetch($var, BuilderHelpers::normalizeIdentifierOrExpr($name));
    }

    /**
     * Creates a class constant fetch node.
     *
     * @param string|Name|Expr $class Class name
     * @param string|Identifier|Expr $name  Constant name
     *
     * @return Expr\ClassConstFetch
     */
    public function classConstFetch($class, $name): Expr\ClassConstFetch {
        return new Expr\ClassConstFetch(
            BuilderHelpers::normalizeNameOrExpr($class),
            BuilderHelpers::normalizeIdentifierOrExpr($name)
        );
    }

    /**
     * Creates nested Concat nodes from a list of expressions.
     *
     * @param Expr|string ...$exprs Expressions or literal strings
     *
     * @return Concat
     */
    public function concat(...$exprs) : Concat {
        $numExprs = count($exprs);
        if ($numExprs < 2) {
            throw new \LogicException('Expected at least two expressions');
        }

        $lastConcat = $this->normalizeStringExpr($exprs[0]);
        for ($i = 1; $i < $numExprs; $i++) {
            $lastConcat = new Concat($lastConcat, $this->normalizeStringExpr($exprs[$i]));
        }
        return $lastConcat;
    }

    /**
     * @param string|Expr $expr
     * @return Expr
     */
    private function normalizeStringExpr($expr) : Expr {
        if ($expr instanceof Expr) {
            return $expr;
        }

        if (\is_string($expr)) {
            return new String_($expr);
        }

        throw new \LogicException('Expected string or Expr');
    }
}
<?php declare(strict_types=1);

namespace PhpParser;

use PhpParser\Node\ComplexType;
use PhpParser\Node\Expr;
use PhpParser\Node\Identifier;
use PhpParser\Node\Name;
use PhpParser\Node\NullableType;
use PhpParser\Node\Scalar;
use PhpParser\Node\Stmt;

/**
 * This class defines helpers used in the implementation of builders. Don't use it directly.
 *
 * @internal
 */
final class BuilderHelpers
{
    /**
     * Normalizes a node: Converts builder objects to nodes.
     *
     * @param Node|Builder $node The node to normalize
     *
     * @return Node The normalized node
     */
    public static function normalizeNode($node) : Node {
        if ($node instanceof Builder) {
            return $node->getNode();
        }

        if ($node instanceof Node) {
            return $node;
        }

        throw new \LogicException('Expected node or builder object');
    }

    /**
     * Normalizes a node to a statement.
     *
     * Expressions are wrapped in a Stmt\Expression node.
     *
     * @param Node|Builder $node The node to normalize
     *
     * @return Stmt The normalized statement node
     */
    public static function normalizeStmt($node) : Stmt {
        $node = self::normalizeNode($node);
        if ($node instanceof Stmt) {
            return $node;
        }

        if ($node instanceof Expr) {
            return new Stmt\Expression($node);
        }

        throw new \LogicException('Expected statement or expression node');
    }

    /**
     * Normalizes strings to Identifier.
     *
     * @param string|Identifier $name The identifier to normalize
     *
     * @return Identifier The normalized identifier
     */
    public static function normalizeIdentifier($name) : Identifier {
        if ($name instanceof Identifier) {
            return $name;
        }

        if (\is_string($name)) {
            return new Identifier($name);
        }

        throw new \LogicException('Expected string or instance of Node\Identifier');
    }

    /**
     * Normalizes strings to Identifier, also allowing expressions.
     *
     * @param string|Identifier|Expr $name The identifier to normalize
     *
     * @return Identifier|Expr The normalized identifier or expression
     */
    public static function normalizeIdentifierOrExpr($name) {
        if ($name instanceof Identifier || $name instanceof Expr) {
            return $name;
        }

        if (\is_string($name)) {
            return new Identifier($name);
        }

        throw new \LogicException('Expected string or instance of Node\Identifier or Node\Expr');
    }

    /**
     * Normalizes a name: Converts string names to Name nodes.
     *
     * @param Name|string $name The name to normalize
     *
     * @return Name The normalized name
     */
    public static function normalizeName($name) : Name {
        if ($name instanceof Name) {
            return $name;
        }

        if (is_string($name)) {
            if (!$name) {
                throw new \LogicException('Name cannot be empty');
            }

            if ($name[0] === '\\') {
                return new Name\FullyQualified(substr($name, 1));
            }

            if (0 === strpos($name, 'namespace\\')) {
                return new Name\Relative(substr($name, strlen('namespace\\')));
            }

            return new Name($name);
        }

        throw new \LogicException('Name must be a string or an instance of Node\Name');
    }

    /**
     * Normalizes a name: Converts string names to Name nodes, while also allowing expressions.
     *
     * @param Expr|Name|string $name The name to normalize
     *
     * @return Name|Expr The normalized name or expression
     */
    public static function normalizeNameOrExpr($name) {
        if ($name instanceof Expr) {
            return $name;
        }

        if (!is_string($name) && !($name instanceof Name)) {
            throw new \LogicException(
                'Name must be a string or an instance of Node\Name or Node\Expr'
            );
        }

        return self::normalizeName($name);
    }

    /**
     * Normalizes a type: Converts plain-text type names into proper AST representation.
     *
     * In particular, builtin types become Identifiers, custom types become Names and nullables
     * are wrapped in NullableType nodes.
     *
     * @param string|Name|Identifier|ComplexType $type The type to normalize
     *
     * @return Name|Identifier|ComplexType The normalized type
     */
    public static function normalizeType($type) {
        if (!is_string($type)) {
            if (
                !$type instanceof Name && !$type instanceof Identifier &&
                !$type instanceof ComplexType
            ) {
                throw new \LogicException(
                    'Type must be a string, or an instance of Name, Identifier or ComplexType'
                );
            }
            return $type;
        }

        $nullable = false;
        if (strlen($type) > 0 && $type[0] === '?') {
            $nullable = true;
            $type = substr($type, 1);
        }

        $builtinTypes = [
            'array',
            'callable',
            'bool',
            'int',
            'float',
            'string',
            'iterable',
            'void',
            'object',
            'null',
            'false',
            'mixed',
            'never',
            'true',
        ];

        $lowerType = strtolower($type);
        if (in_array($lowerType, $builtinTypes)) {
            $type = new Identifier($lowerType);
        } else {
            $type = self::normalizeName($type);
        }

        $notNullableTypes = [
            'void', 'mixed', 'never',
        ];
        if ($nullable && in_array((string) $type, $notNullableTypes)) {
            throw new \LogicException(sprintf('%s type cannot be nullable', $type));
        }

        return $nullable ? new NullableType($type) : $type;
    }

    /**
     * Normalizes a value: Converts nulls, booleans, integers,
     * floats, strings and arrays into their respective nodes
     *
     * @param Node\Expr|bool|null|int|float|string|array $value The value to normalize
     *
     * @return Expr The normalized value
     */
    public static function normalizeValue($value) : Expr {
        if ($value instanceof Node\Expr) {
            return $value;
        }

        if (is_null($value)) {
            return new Expr\ConstFetch(
                new Name('null')
            );
        }

        if (is_bool($value)) {
            return new Expr\ConstFetch(
                new Name($value ? 'true' : 'false')
            );
        }

        if (is_int($value)) {
            return new Scalar\LNumber($value);
        }

        if (is_float($value)) {
            return new Scalar\DNumber($value);
        }

        if (is_string($value)) {
            return new Scalar\String_($value);
        }

        if (is_array($value)) {
            $items = [];
            $lastKey = -1;
            foreach ($value as $itemKey => $itemValue) {
                // for consecutive, numeric keys don't generate keys
                if (null !== $lastKey && ++$lastKey === $itemKey) {
                    $items[] = new Expr\ArrayItem(
                        self::normalizeValue($itemValue)
                    );
                } else {
                    $lastKey = null;
                    $items[] = new Expr\ArrayItem(
                        self::normalizeValue($itemValue),
                        self::normalizeValue($itemKey)
                    );
                }
            }

            return new Expr\Array_($items);
        }

        throw new \LogicException('Invalid value');
    }

    /**
     * Normalizes a doc comment: Converts plain strings to PhpParser\Comment\Doc.
     *
     * @param Comment\Doc|string $docComment The doc comment to normalize
     *
     * @return Comment\Doc The normalized doc comment
     */
    public static function normalizeDocComment($docComment) : Comment\Doc {
        if ($docComment instanceof Comment\Doc) {
            return $docComment;
        }

        if (is_string($docComment)) {
            return new Comment\Doc($docComment);
        }

        throw new \LogicException('Doc comment must be a string or an instance of PhpParser\Comment\Doc');
    }

    /**
     * Normalizes a attribute: Converts attribute to the Attribute Group if needed.
     *
     * @param Node\Attribute|Node\AttributeGroup $attribute
     *
     * @return Node\AttributeGroup The Attribute Group
     */
    public static function normalizeAttribute($attribute) : Node\AttributeGroup
    {
        if ($attribute instanceof Node\AttributeGroup) {
            return $attribute;
        }

        if (!($attribute instanceof Node\Attribute)) {
            throw new \LogicException('Attribute must be an instance of PhpParser\Node\Attribute or PhpParser\Node\AttributeGroup');
        }

        return new Node\AttributeGroup([$attribute]);
    }

    /**
     * Adds a modifier and returns new modifier bitmask.
     *
     * @param int $modifiers Existing modifiers
     * @param int $modifier  Modifier to set
     *
     * @return int New modifiers
     */
    public static function addModifier(int $modifiers, int $modifier) : int {
        Stmt\Class_::verifyModifier($modifiers, $modifier);
        return $modifiers | $modifier;
    }

    /**
     * Adds a modifier and returns new modifier bitmask.
     * @return int New modifiers
     */
    public static function addClassModifier(int $existingModifiers, int $modifierToSet) : int {
        Stmt\Class_::verifyClassModifier($existingModifiers, $modifierToSet);
        return $existingModifiers | $modifierToSet;
    }
}
<?php declare(strict_types=1);

namespace PhpParser;

class Comment implements \JsonSerializable
{
    protected $text;
    protected $startLine;
    protected $startFilePos;
    protected $startTokenPos;
    protected $endLine;
    protected $endFilePos;
    protected $endTokenPos;

    /**
     * Constructs a comment node.
     *
     * @param string $text          Comment text (including comment delimiters like /*)
     * @param int    $startLine     Line number the comment started on
     * @param int    $startFilePos  File offset the comment started on
     * @param int    $startTokenPos Token offset the comment started on
     */
    public function __construct(
        string $text,
        int $startLine = -1, int $startFilePos = -1, int $startTokenPos = -1,
        int $endLine = -1, int $endFilePos = -1, int $endTokenPos = -1
    ) {
        $this->text = $text;
        $this->startLine = $startLine;
        $this->startFilePos = $startFilePos;
        $this->startTokenPos = $startTokenPos;
        $this->endLine = $endLine;
        $this->endFilePos = $endFilePos;
        $this->endTokenPos = $endTokenPos;
    }

    /**
     * Gets the comment text.
     *
     * @return string The comment text (including comment delimiters like /*)
     */
    public function getText() : string {
        return $this->text;
    }

    /**
     * Gets the line number the comment started on.
     *
     * @return int Line number (or -1 if not available)
     */
    public function getStartLine() : int {
        return $this->startLine;
    }

    /**
     * Gets the file offset the comment started on.
     *
     * @return int File offset (or -1 if not available)
     */
    public function getStartFilePos() : int {
        return $this->startFilePos;
    }

    /**
     * Gets the token offset the comment started on.
     *
     * @return int Token offset (or -1 if not available)
     */
    public function getStartTokenPos() : int {
        return $this->startTokenPos;
    }

    /**
     * Gets the line number the comment ends on.
     *
     * @return int Line number (or -1 if not available)
     */
    public function getEndLine() : int {
        return $this->endLine;
    }

    /**
     * Gets the file offset the comment ends on.
     *
     * @return int File offset (or -1 if not available)
     */
    public function getEndFilePos() : int {
        return $this->endFilePos;
    }

    /**
     * Gets the token offset the comment ends on.
     *
     * @return int Token offset (or -1 if not available)
     */
    public function getEndTokenPos() : int {
        return $this->endTokenPos;
    }

    /**
     * Gets the line number the comment started on.
     *
     * @deprecated Use getStartLine() instead
     *
     * @return int Line number
     */
    public function getLine() : int {
        return $this->startLine;
    }

    /**
     * Gets the file offset the comment started on.
     *
     * @deprecated Use getStartFilePos() instead
     *
     * @return int File offset
     */
    public function getFilePos() : int {
        return $this->startFilePos;
    }

    /**
     * Gets the token offset the comment started on.
     *
     * @deprecated Use getStartTokenPos() instead
     *
     * @return int Token offset
     */
    public function getTokenPos() : int {
        return $this->startTokenPos;
    }

    /**
     * Gets the comment text.
     *
     * @return string The comment text (including comment delimiters like /*)
     */
    public function __toString() : string {
        return $this->text;
    }

    /**
     * Gets the reformatted comment text.
     *
     * "Reformatted" here means that we try to clean up the whitespace at the
     * starts of the lines. This is necessary because we receive the comments
     * without trailing whitespace on the first line, but with trailing whitespace
     * on all subsequent lines.
     *
     * @return mixed|string
     */
    public function getReformattedText() {
        $text = trim($this->text);
        $newlinePos = strpos($text, "\n");
        if (false === $newlinePos) {
            // Single line comments don't need further processing
            return $text;
        } elseif (preg_match('((*BSR_ANYCRLF)(*ANYCRLF)^.*(?:\R\s+\*.*)+$)', $text)) {
            // Multi line comment of the type
            //
            //     /*
            //      * Some text.
            //      * Some more text.
            //      */
            //
            // is handled by replacing the whitespace sequences before the * by a single space
            return preg_replace('(^\s+\*)m', ' *', $this->text);
        } elseif (preg_match('(^/\*\*?\s*[\r\n])', $text) && preg_match('(\n(\s*)\*/$)', $text, $matches)) {
            // Multi line comment of the type
            //
            //    /*
            //        Some text.
            //        Some more text.
            //    */
            //
            // is handled by removing the whitespace sequence on the line before the closing
            // */ on all lines. So if the last line is "    */", then "    " is removed at the
            // start of all lines.
            return preg_replace('(^' . preg_quote($matches[1]) . ')m', '', $text);
        } elseif (preg_match('(^/\*\*?\s*(?!\s))', $text, $matches)) {
            // Multi line comment of the type
            //
            //     /* Some text.
            //        Some more text.
            //          Indented text.
            //        Even more text. */
            //
            // is handled by removing the difference between the shortest whitespace prefix on all
            // lines and the length of the "/* " opening sequence.
            $prefixLen = $this->getShortestWhitespacePrefixLen(substr($text, $newlinePos + 1));
            $removeLen = $prefixLen - strlen($matches[0]);
            return preg_replace('(^\s{' . $removeLen . '})m', '', $text);
        }

        // No idea how to format this comment, so simply return as is
        return $text;
    }

    /**
     * Get length of shortest whitespace prefix (at the start of a line).
     *
     * If there is a line with no prefix whitespace, 0 is a valid return value.
     *
     * @param string $str String to check
     * @return int Length in characters. Tabs count as single characters.
     */
    private function getShortestWhitespacePrefixLen(string $str) : int {
        $lines = explode("\n", $str);
        $shortestPrefixLen = \INF;
        foreach ($lines as $line) {
            preg_match('(^\s*)', $line, $matches);
            $prefixLen = strlen($matches[0]);
            if ($prefixLen < $shortestPrefixLen) {
                $shortestPrefixLen = $prefixLen;
            }
        }
        return $shortestPrefixLen;
    }

    /**
     * @return       array
     * @psalm-return array{nodeType:string, text:mixed, line:mixed, filePos:mixed}
     */
    public function jsonSerialize() : array {
        // Technically not a node, but we make it look like one anyway
        $type = $this instanceof Comment\Doc ? 'Comment_Doc' : 'Comment';
        return [
            'nodeType' => $type,
            'text' => $this->text,
            // TODO: Rename these to include "start".
            'line' => $this->startLine,
            'filePos' => $this->startFilePos,
            'tokenPos' => $this->startTokenPos,
            'endLine' => $this->endLine,
            'endFilePos' => $this->endFilePos,
            'endTokenPos' => $this->endTokenPos,
        ];
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Comment;

class Doc extends \PhpParser\Comment
{
}
<?php

namespace PhpParser;

class ConstExprEvaluationException extends \Exception
{}
<?php

namespace PhpParser;

use function array_merge;
use PhpParser\Node\Expr;
use PhpParser\Node\Scalar;

/**
 * Evaluates constant expressions.
 *
 * This evaluator is able to evaluate all constant expressions (as defined by PHP), which can be
 * evaluated without further context. If a subexpression is not of this type, a user-provided
 * fallback evaluator is invoked. To support all constant expressions that are also supported by
 * PHP (and not already handled by this class), the fallback evaluator must be able to handle the
 * following node types:
 *
 *  * All Scalar\MagicConst\* nodes.
 *  * Expr\ConstFetch nodes. Only null/false/true are already handled by this class.
 *  * Expr\ClassConstFetch nodes.
 *
 * The fallback evaluator should throw ConstExprEvaluationException for nodes it cannot evaluate.
 *
 * The evaluation is dependent on runtime configuration in two respects: Firstly, floating
 * point to string conversions are affected by the precision ini setting. Secondly, they are also
 * affected by the LC_NUMERIC locale.
 */
class ConstExprEvaluator
{
    private $fallbackEvaluator;

    /**
     * Create a constant expression evaluator.
     *
     * The provided fallback evaluator is invoked whenever a subexpression cannot be evaluated. See
     * class doc comment for more information.
     *
     * @param callable|null $fallbackEvaluator To call if subexpression cannot be evaluated
     */
    public function __construct(callable $fallbackEvaluator = null) {
        $this->fallbackEvaluator = $fallbackEvaluator ?? function(Expr $expr) {
            throw new ConstExprEvaluationException(
                "Expression of type {$expr->getType()} cannot be evaluated"
            );
        };
    }

    /**
     * Silently evaluates a constant expression into a PHP value.
     *
     * Thrown Errors, warnings or notices will be converted into a ConstExprEvaluationException.
     * The original source of the exception is available through getPrevious().
     *
     * If some part of the expression cannot be evaluated, the fallback evaluator passed to the
     * constructor will be invoked. By default, if no fallback is provided, an exception of type
     * ConstExprEvaluationException is thrown.
     *
     * See class doc comment for caveats and limitations.
     *
     * @param Expr $expr Constant expression to evaluate
     * @return mixed Result of evaluation
     *
     * @throws ConstExprEvaluationException if the expression cannot be evaluated or an error occurred
     */
    public function evaluateSilently(Expr $expr) {
        set_error_handler(function($num, $str, $file, $line) {
            throw new \ErrorException($str, 0, $num, $file, $line);
        });

        try {
            return $this->evaluate($expr);
        } catch (\Throwable $e) {
            if (!$e instanceof ConstExprEvaluationException) {
                $e = new ConstExprEvaluationException(
                    "An error occurred during constant expression evaluation", 0, $e);
            }
            throw $e;
        } finally {
            restore_error_handler();
        }
    }

    /**
     * Directly evaluates a constant expression into a PHP value.
     *
     * May generate Error exceptions, warnings or notices. Use evaluateSilently() to convert these
     * into a ConstExprEvaluationException.
     *
     * If some part of the expression cannot be evaluated, the fallback evaluator passed to the
     * constructor will be invoked. By default, if no fallback is provided, an exception of type
     * ConstExprEvaluationException is thrown.
     *
     * See class doc comment for caveats and limitations.
     *
     * @param Expr $expr Constant expression to evaluate
     * @return mixed Result of evaluation
     *
     * @throws ConstExprEvaluationException if the expression cannot be evaluated
     */
    public function evaluateDirectly(Expr $expr) {
        return $this->evaluate($expr);
    }

    private function evaluate(Expr $expr) {
        if ($expr instanceof Scalar\LNumber
            || $expr instanceof Scalar\DNumber
            || $expr instanceof Scalar\String_
        ) {
            return $expr->value;
        }

        if ($expr instanceof Expr\Array_) {
            return $this->evaluateArray($expr);
        }

        // Unary operators
        if ($expr instanceof Expr\UnaryPlus) {
            return +$this->evaluate($expr->expr);
        }
        if ($expr instanceof Expr\UnaryMinus) {
            return -$this->evaluate($expr->expr);
        }
        if ($expr instanceof Expr\BooleanNot) {
            return !$this->evaluate($expr->expr);
        }
        if ($expr instanceof Expr\BitwiseNot) {
            return ~$this->evaluate($expr->expr);
        }

        if ($expr instanceof Expr\BinaryOp) {
            return $this->evaluateBinaryOp($expr);
        }

        if ($expr instanceof Expr\Ternary) {
            return $this->evaluateTernary($expr);
        }

        if ($expr instanceof Expr\ArrayDimFetch && null !== $expr->dim) {
            return $this->evaluate($expr->var)[$this->evaluate($expr->dim)];
        }

        if ($expr instanceof Expr\ConstFetch) {
            return $this->evaluateConstFetch($expr);
        }

        return ($this->fallbackEvaluator)($expr);
    }

    private function evaluateArray(Expr\Array_ $expr) {
        $array = [];
        foreach ($expr->items as $item) {
            if (null !== $item->key) {
                $array[$this->evaluate($item->key)] = $this->evaluate($item->value);
            } elseif ($item->unpack) {
                $array = array_merge($array, $this->evaluate($item->value));
            } else {
                $array[] = $this->evaluate($item->value);
            }
        }
        return $array;
    }

    private function evaluateTernary(Expr\Ternary $expr) {
        if (null === $expr->if) {
            return $this->evaluate($expr->cond) ?: $this->evaluate($expr->else);
        }

        return $this->evaluate($expr->cond)
            ? $this->evaluate($expr->if)
            : $this->evaluate($expr->else);
    }

    private function evaluateBinaryOp(Expr\BinaryOp $expr) {
        if ($expr instanceof Expr\BinaryOp\Coalesce
            && $expr->left instanceof Expr\ArrayDimFetch
        ) {
            // This needs to be special cased to respect BP_VAR_IS fetch semantics
            return $this->evaluate($expr->left->var)[$this->evaluate($expr->left->dim)]
                ?? $this->evaluate($expr->right);
        }

        // The evaluate() calls are repeated in each branch, because some of the operators are
        // short-circuiting and evaluating the RHS in advance may be illegal in that case
        $l = $expr->left;
        $r = $expr->right;
        switch ($expr->getOperatorSigil()) {
            case '&':   return $this->evaluate($l) &   $this->evaluate($r);
            case '|':   return $this->evaluate($l) |   $this->evaluate($r);
            case '^':   return $this->evaluate($l) ^   $this->evaluate($r);
            case '&&':  return $this->evaluate($l) &&  $this->evaluate($r);
            case '||':  return $this->evaluate($l) ||  $this->evaluate($r);
            case '??':  return $this->evaluate($l) ??  $this->evaluate($r);
            case '.':   return $this->evaluate($l) .   $this->evaluate($r);
            case '/':   return $this->evaluate($l) /   $this->evaluate($r);
            case '==':  return $this->evaluate($l) ==  $this->evaluate($r);
            case '>':   return $this->evaluate($l) >   $this->evaluate($r);
            case '>=':  return $this->evaluate($l) >=  $this->evaluate($r);
            case '===': return $this->evaluate($l) === $this->evaluate($r);
            case 'and': return $this->evaluate($l) and $this->evaluate($r);
            case 'or':  return $this->evaluate($l) or  $this->evaluate($r);
            case 'xor': return $this->evaluate($l) xor $this->evaluate($r);
            case '-':   return $this->evaluate($l) -   $this->evaluate($r);
            case '%':   return $this->evaluate($l) %   $this->evaluate($r);
            case '*':   return $this->evaluate($l) *   $this->evaluate($r);
            case '!=':  return $this->evaluate($l) !=  $this->evaluate($r);
            case '!==': return $this->evaluate($l) !== $this->evaluate($r);
            case '+':   return $this->evaluate($l) +   $this->evaluate($r);
            case '**':  return $this->evaluate($l) **  $this->evaluate($r);
            case '<<':  return $this->evaluate($l) <<  $this->evaluate($r);
            case '>>':  return $this->evaluate($l) >>  $this->evaluate($r);
            case '<':   return $this->evaluate($l) <   $this->evaluate($r);
            case '<=':  return $this->evaluate($l) <=  $this->evaluate($r);
            case '<=>': return $this->evaluate($l) <=> $this->evaluate($r);
        }

        throw new \Exception('Should not happen');
    }

    private function evaluateConstFetch(Expr\ConstFetch $expr) {
        $name = $expr->name->toLowerString();
        switch ($name) {
            case 'null': return null;
            case 'false': return false;
            case 'true': return true;
        }

        return ($this->fallbackEvaluator)($expr);
    }
}
<?php declare(strict_types=1);

namespace PhpParser;

class Error extends \RuntimeException
{
    protected $rawMessage;
    protected $attributes;

    /**
     * Creates an Exception signifying a parse error.
     *
     * @param string    $message    Error message
     * @param array|int $attributes Attributes of node/token where error occurred
     *                              (or start line of error -- deprecated)
     */
    public function __construct(string $message, $attributes = []) {
        $this->rawMessage = $message;
        if (is_array($attributes)) {
            $this->attributes = $attributes;
        } else {
            $this->attributes = ['startLine' => $attributes];
        }
        $this->updateMessage();
    }

    /**
     * Gets the error message
     *
     * @return string Error message
     */
    public function getRawMessage() : string {
        return $this->rawMessage;
    }

    /**
     * Gets the line the error starts in.
     *
     * @return int Error start line
     */
    public function getStartLine() : int {
        return $this->attributes['startLine'] ?? -1;
    }

    /**
     * Gets the line the error ends in.
     *
     * @return int Error end line
     */
    public function getEndLine() : int {
        return $this->attributes['endLine'] ?? -1;
    }

    /**
     * Gets the attributes of the node/token the error occurred at.
     *
     * @return array
     */
    public function getAttributes() : array {
        return $this->attributes;
    }

    /**
     * Sets the attributes of the node/token the error occurred at.
     *
     * @param array $attributes
     */
    public function setAttributes(array $attributes) {
        $this->attributes = $attributes;
        $this->updateMessage();
    }

    /**
     * Sets the line of the PHP file the error occurred in.
     *
     * @param string $message Error message
     */
    public function setRawMessage(string $message) {
        $this->rawMessage = $message;
        $this->updateMessage();
    }

    /**
     * Sets the line the error starts in.
     *
     * @param int $line Error start line
     */
    public function setStartLine(int $line) {
        $this->attributes['startLine'] = $line;
        $this->updateMessage();
    }

    /**
     * Returns whether the error has start and end column information.
     *
     * For column information enable the startFilePos and endFilePos in the lexer options.
     *
     * @return bool
     */
    public function hasColumnInfo() : bool {
        return isset($this->attributes['startFilePos'], $this->attributes['endFilePos']);
    }

    /**
     * Gets the start column (1-based) into the line where the error started.
     *
     * @param string $code Source code of the file
     * @return int
     */
    public function getStartColumn(string $code) : int {
        if (!$this->hasColumnInfo()) {
            throw new \RuntimeException('Error does not have column information');
        }

        return $this->toColumn($code, $this->attributes['startFilePos']);
    }

    /**
     * Gets the end column (1-based) into the line where the error ended.
     *
     * @param string $code Source code of the file
     * @return int
     */
    public function getEndColumn(string $code) : int {
        if (!$this->hasColumnInfo()) {
            throw new \RuntimeException('Error does not have column information');
        }

        return $this->toColumn($code, $this->attributes['endFilePos']);
    }

    /**
     * Formats message including line and column information.
     *
     * @param string $code Source code associated with the error, for calculation of the columns
     *
     * @return string Formatted message
     */
    public function getMessageWithColumnInfo(string $code) : string {
        return sprintf(
            '%s from %d:%d to %d:%d', $this->getRawMessage(),
            $this->getStartLine(), $this->getStartColumn($code),
            $this->getEndLine(), $this->getEndColumn($code)
        );
    }

    /**
     * Converts a file offset into a column.
     *
     * @param string $code Source code that $pos indexes into
     * @param int    $pos  0-based position in $code
     *
     * @return int 1-based column (relative to start of line)
     */
    private function toColumn(string $code, int $pos) : int {
        if ($pos > strlen($code)) {
            throw new \RuntimeException('Invalid position information');
        }

        $lineStartPos = strrpos($code, "\n", $pos - strlen($code));
        if (false === $lineStartPos) {
            $lineStartPos = -1;
        }

        return $pos - $lineStartPos;
    }

    /**
     * Updates the exception message after a change to rawMessage or rawLine.
     */
    protected function updateMessage() {
        $this->message = $this->rawMessage;

        if (-1 === $this->getStartLine()) {
            $this->message .= ' on unknown line';
        } else {
            $this->message .= ' on line ' . $this->getStartLine();
        }
    }
}
<?php declare(strict_types=1);

namespace PhpParser;

interface ErrorHandler
{
    /**
     * Handle an error generated during lexing, parsing or some other operation.
     *
     * @param Error $error The error that needs to be handled
     */
    public function handleError(Error $error);
}
<?php declare(strict_types=1);

namespace PhpParser\ErrorHandler;

use PhpParser\Error;
use PhpParser\ErrorHandler;

/**
 * Error handler that collects all errors into an array.
 *
 * This allows graceful handling of errors.
 */
class Collecting implements ErrorHandler
{
    /** @var Error[] Collected errors */
    private $errors = [];

    public function handleError(Error $error) {
        $this->errors[] = $error;
    }

    /**
     * Get collected errors.
     *
     * @return Error[]
     */
    public function getErrors() : array {
        return $this->errors;
    }

    /**
     * Check whether there are any errors.
     *
     * @return bool
     */
    public function hasErrors() : bool {
        return !empty($this->errors);
    }

    /**
     * Reset/clear collected errors.
     */
    public function clearErrors() {
        $this->errors = [];
    }
}
<?php declare(strict_types=1);

namespace PhpParser\ErrorHandler;

use PhpParser\Error;
use PhpParser\ErrorHandler;

/**
 * Error handler that handles all errors by throwing them.
 *
 * This is the default strategy used by all components.
 */
class Throwing implements ErrorHandler
{
    public function handleError(Error $error) {
        throw $error;
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Internal;

/**
 * @internal
 */
class DiffElem
{
    const TYPE_KEEP = 0;
    const TYPE_REMOVE = 1;
    const TYPE_ADD = 2;
    const TYPE_REPLACE = 3;

    /** @var int One of the TYPE_* constants */
    public $type;
    /** @var mixed Is null for add operations */
    public $old;
    /** @var mixed Is null for remove operations */
    public $new;

    public function __construct(int $type, $old, $new) {
        $this->type = $type;
        $this->old = $old;
        $this->new = $new;
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Internal;

/**
 * Implements the Myers diff algorithm.
 *
 * Myers, Eugene W. "An O (ND) difference algorithm and its variations."
 * Algorithmica 1.1 (1986): 251-266.
 *
 * @internal
 */
class Differ
{
    private $isEqual;

    /**
     * Create differ over the given equality relation.
     *
     * @param callable $isEqual Equality relation with signature function($a, $b) : bool
     */
    public function __construct(callable $isEqual) {
        $this->isEqual = $isEqual;
    }

    /**
     * Calculate diff (edit script) from $old to $new.
     *
     * @param array $old Original array
     * @param array $new New array
     *
     * @return DiffElem[] Diff (edit script)
     */
    public function diff(array $old, array $new) {
        list($trace, $x, $y) = $this->calculateTrace($old, $new);
        return $this->extractDiff($trace, $x, $y, $old, $new);
    }

    /**
     * Calculate diff, including "replace" operations.
     *
     * If a sequence of remove operations is followed by the same number of add operations, these
     * will be coalesced into replace operations.
     *
     * @param array $old Original array
     * @param array $new New array
     *
     * @return DiffElem[] Diff (edit script), including replace operations
     */
    public function diffWithReplacements(array $old, array $new) {
        return $this->coalesceReplacements($this->diff($old, $new));
    }

    private function calculateTrace(array $a, array $b) {
        $n = \count($a);
        $m = \count($b);
        $max = $n + $m;
        $v = [1 => 0];
        $trace = [];
        for ($d = 0; $d <= $max; $d++) {
            $trace[] = $v;
            for ($k = -$d; $k <= $d; $k += 2) {
                if ($k === -$d || ($k !== $d && $v[$k-1] < $v[$k+1])) {
                    $x = $v[$k+1];
                } else {
                    $x = $v[$k-1] + 1;
                }

                $y = $x - $k;
                while ($x < $n && $y < $m && ($this->isEqual)($a[$x], $b[$y])) {
                    $x++;
                    $y++;
                }

                $v[$k] = $x;
                if ($x >= $n && $y >= $m) {
                    return [$trace, $x, $y];
                }
            }
        }
        throw new \Exception('Should not happen');
    }

    private function extractDiff(array $trace, int $x, int $y, array $a, array $b) {
        $result = [];
        for ($d = \count($trace) - 1; $d >= 0; $d--) {
            $v = $trace[$d];
            $k = $x - $y;

            if ($k === -$d || ($k !== $d && $v[$k-1] < $v[$k+1])) {
                $prevK = $k + 1;
            } else {
                $prevK = $k - 1;
            }

            $prevX = $v[$prevK];
            $prevY = $prevX - $prevK;

            while ($x > $prevX && $y > $prevY) {
                $result[] = new DiffElem(DiffElem::TYPE_KEEP, $a[$x-1], $b[$y-1]);
                $x--;
                $y--;
            }

            if ($d === 0) {
                break;
            }

            while ($x > $prevX) {
                $result[] = new DiffElem(DiffElem::TYPE_REMOVE, $a[$x-1], null);
                $x--;
            }

            while ($y > $prevY) {
                $result[] = new DiffElem(DiffElem::TYPE_ADD, null, $b[$y-1]);
                $y--;
            }
        }
        return array_reverse($result);
    }

    /**
     * Coalesce equal-length sequences of remove+add into a replace operation.
     *
     * @param DiffElem[] $diff
     * @return DiffElem[]
     */
    private function coalesceReplacements(array $diff) {
        $newDiff = [];
        $c = \count($diff);
        for ($i = 0; $i < $c; $i++) {
            $diffType = $diff[$i]->type;
            if ($diffType !== DiffElem::TYPE_REMOVE) {
                $newDiff[] = $diff[$i];
                continue;
            }

            $j = $i;
            while ($j < $c && $diff[$j]->type === DiffElem::TYPE_REMOVE) {
                $j++;
            }

            $k = $j;
            while ($k < $c && $diff[$k]->type === DiffElem::TYPE_ADD) {
                $k++;
            }

            if ($j - $i === $k - $j) {
                $len = $j - $i;
                for ($n = 0; $n < $len; $n++) {
                    $newDiff[] = new DiffElem(
                        DiffElem::TYPE_REPLACE, $diff[$i + $n]->old, $diff[$j + $n]->new
                    );
                }
            } else {
                for (; $i < $k; $i++) {
                    $newDiff[] = $diff[$i];
                }
            }
            $i = $k - 1;
        }
        return $newDiff;
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Internal;

use PhpParser\Node;
use PhpParser\Node\Expr;

/**
 * This node is used internally by the format-preserving pretty printer to print anonymous classes.
 *
 * The normal anonymous class structure violates assumptions about the order of token offsets.
 * Namely, the constructor arguments are part of the Expr\New_ node and follow the class node, even
 * though they are actually interleaved with them. This special node type is used temporarily to
 * restore a sane token offset order.
 *
 * @internal
 */
class PrintableNewAnonClassNode extends Expr
{
    /** @var Node\AttributeGroup[] PHP attribute groups */
    public $attrGroups;
    /** @var int Modifiers */
    public $flags;
    /** @var Node\Arg[] Arguments */
    public $args;
    /** @var null|Node\Name Name of extended class */
    public $extends;
    /** @var Node\Name[] Names of implemented interfaces */
    public $implements;
    /** @var Node\Stmt[] Statements */
    public $stmts;

    public function __construct(
        array $attrGroups, int $flags, array $args, Node\Name $extends = null, array $implements,
        array $stmts, array $attributes
    ) {
        parent::__construct($attributes);
        $this->attrGroups = $attrGroups;
        $this->flags = $flags;
        $this->args = $args;
        $this->extends = $extends;
        $this->implements = $implements;
        $this->stmts = $stmts;
    }

    public static function fromNewNode(Expr\New_ $newNode) {
        $class = $newNode->class;
        assert($class instanceof Node\Stmt\Class_);
        // We don't assert that $class->name is null here, to allow consumers to assign unique names
        // to anonymous classes for their own purposes. We simplify ignore the name here.
        return new self(
            $class->attrGroups, $class->flags, $newNode->args, $class->extends, $class->implements,
            $class->stmts, $newNode->getAttributes()
        );
    }

    public function getType() : string {
        return 'Expr_PrintableNewAnonClass';
    }

    public function getSubNodeNames() : array {
        return ['attrGroups', 'flags', 'args', 'extends', 'implements', 'stmts'];
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Internal;

/**
 * Provides operations on token streams, for use by pretty printer.
 *
 * @internal
 */
class TokenStream
{
    /** @var array Tokens (in token_get_all format) */
    private $tokens;
    /** @var int[] Map from position to indentation */
    private $indentMap;

    /**
     * Create token stream instance.
     *
     * @param array $tokens Tokens in token_get_all() format
     */
    public function __construct(array $tokens) {
        $this->tokens = $tokens;
        $this->indentMap = $this->calcIndentMap();
    }

    /**
     * Whether the given position is immediately surrounded by parenthesis.
     *
     * @param int $startPos Start position
     * @param int $endPos   End position
     *
     * @return bool
     */
    public function haveParens(int $startPos, int $endPos) : bool {
        return $this->haveTokenImmediatelyBefore($startPos, '(')
            && $this->haveTokenImmediatelyAfter($endPos, ')');
    }

    /**
     * Whether the given position is immediately surrounded by braces.
     *
     * @param int $startPos Start position
     * @param int $endPos   End position
     *
     * @return bool
     */
    public function haveBraces(int $startPos, int $endPos) : bool {
        return ($this->haveTokenImmediatelyBefore($startPos, '{')
                || $this->haveTokenImmediatelyBefore($startPos, T_CURLY_OPEN))
            && $this->haveTokenImmediatelyAfter($endPos, '}');
    }

    /**
     * Check whether the position is directly preceded by a certain token type.
     *
     * During this check whitespace and comments are skipped.
     *
     * @param int        $pos               Position before which the token should occur
     * @param int|string $expectedTokenType Token to check for
     *
     * @return bool Whether the expected token was found
     */
    public function haveTokenImmediatelyBefore(int $pos, $expectedTokenType) : bool {
        $tokens = $this->tokens;
        $pos--;
        for (; $pos >= 0; $pos--) {
            $tokenType = $tokens[$pos][0];
            if ($tokenType === $expectedTokenType) {
                return true;
            }
            if ($tokenType !== \T_WHITESPACE
                && $tokenType !== \T_COMMENT && $tokenType !== \T_DOC_COMMENT) {
                break;
            }
        }
        return false;
    }

    /**
     * Check whether the position is directly followed by a certain token type.
     *
     * During this check whitespace and comments are skipped.
     *
     * @param int        $pos               Position after which the token should occur
     * @param int|string $expectedTokenType Token to check for
     *
     * @return bool Whether the expected token was found
     */
    public function haveTokenImmediatelyAfter(int $pos, $expectedTokenType) : bool {
        $tokens = $this->tokens;
        $pos++;
        for (; $pos < \count($tokens); $pos++) {
            $tokenType = $tokens[$pos][0];
            if ($tokenType === $expectedTokenType) {
                return true;
            }
            if ($tokenType !== \T_WHITESPACE
                && $tokenType !== \T_COMMENT && $tokenType !== \T_DOC_COMMENT) {
                break;
            }
        }
        return false;
    }

    public function skipLeft(int $pos, $skipTokenType) {
        $tokens = $this->tokens;

        $pos = $this->skipLeftWhitespace($pos);
        if ($skipTokenType === \T_WHITESPACE) {
            return $pos;
        }

        if ($tokens[$pos][0] !== $skipTokenType) {
            // Shouldn't happen. The skip token MUST be there
            throw new \Exception('Encountered unexpected token');
        }
        $pos--;

        return $this->skipLeftWhitespace($pos);
    }

    public function skipRight(int $pos, $skipTokenType) {
        $tokens = $this->tokens;

        $pos = $this->skipRightWhitespace($pos);
        if ($skipTokenType === \T_WHITESPACE) {
            return $pos;
        }

        if ($tokens[$pos][0] !== $skipTokenType) {
            // Shouldn't happen. The skip token MUST be there
            throw new \Exception('Encountered unexpected token');
        }
        $pos++;

        return $this->skipRightWhitespace($pos);
    }

    /**
     * Return first non-whitespace token position smaller or equal to passed position.
     *
     * @param int $pos Token position
     * @return int Non-whitespace token position
     */
    public function skipLeftWhitespace(int $pos) {
        $tokens = $this->tokens;
        for (; $pos >= 0; $pos--) {
            $type = $tokens[$pos][0];
            if ($type !== \T_WHITESPACE && $type !== \T_COMMENT && $type !== \T_DOC_COMMENT) {
                break;
            }
        }
        return $pos;
    }

    /**
     * Return first non-whitespace position greater or equal to passed position.
     *
     * @param int $pos Token position
     * @return int Non-whitespace token position
     */
    public function skipRightWhitespace(int $pos) {
        $tokens = $this->tokens;
        for ($count = \count($tokens); $pos < $count; $pos++) {
            $type = $tokens[$pos][0];
            if ($type !== \T_WHITESPACE && $type !== \T_COMMENT && $type !== \T_DOC_COMMENT) {
                break;
            }
        }
        return $pos;
    }

    public function findRight(int $pos, $findTokenType) {
        $tokens = $this->tokens;
        for ($count = \count($tokens); $pos < $count; $pos++) {
            $type = $tokens[$pos][0];
            if ($type === $findTokenType) {
                return $pos;
            }
        }
        return -1;
    }

    /**
     * Whether the given position range contains a certain token type.
     *
     * @param int $startPos Starting position (inclusive)
     * @param int $endPos Ending position (exclusive)
     * @param int|string $tokenType Token type to look for
     * @return bool Whether the token occurs in the given range
     */
    public function haveTokenInRange(int $startPos, int $endPos, $tokenType) {
        $tokens = $this->tokens;
        for ($pos = $startPos; $pos < $endPos; $pos++) {
            if ($tokens[$pos][0] === $tokenType) {
                return true;
            }
        }
        return false;
    }

    public function haveBracesInRange(int $startPos, int $endPos) {
        return $this->haveTokenInRange($startPos, $endPos, '{')
            || $this->haveTokenInRange($startPos, $endPos, T_CURLY_OPEN)
            || $this->haveTokenInRange($startPos, $endPos, '}');
    }

    public function haveTagInRange(int $startPos, int $endPos): bool {
        return $this->haveTokenInRange($startPos, $endPos, \T_OPEN_TAG)
            || $this->haveTokenInRange($startPos, $endPos, \T_CLOSE_TAG);
    }

    /**
     * Get indentation before token position.
     *
     * @param int $pos Token position
     *
     * @return int Indentation depth (in spaces)
     */
    public function getIndentationBefore(int $pos) : int {
        return $this->indentMap[$pos];
    }

    /**
     * Get the code corresponding to a token offset range, optionally adjusted for indentation.
     *
     * @param int $from   Token start position (inclusive)
     * @param int $to     Token end position (exclusive)
     * @param int $indent By how much the code should be indented (can be negative as well)
     *
     * @return string Code corresponding to token range, adjusted for indentation
     */
    public function getTokenCode(int $from, int $to, int $indent) : string {
        $tokens = $this->tokens;
        $result = '';
        for ($pos = $from; $pos < $to; $pos++) {
            $token = $tokens[$pos];
            if (\is_array($token)) {
                $type = $token[0];
                $content = $token[1];
                if ($type === \T_CONSTANT_ENCAPSED_STRING || $type === \T_ENCAPSED_AND_WHITESPACE) {
                    $result .= $content;
                } else {
                    // TODO Handle non-space indentation
                    if ($indent < 0) {
                        $result .= str_replace("\n" . str_repeat(" ", -$indent), "\n", $content);
                    } elseif ($indent > 0) {
                        $result .= str_replace("\n", "\n" . str_repeat(" ", $indent), $content);
                    } else {
                        $result .= $content;
                    }
                }
            } else {
                $result .= $token;
            }
        }
        return $result;
    }

    /**
     * Precalculate the indentation at every token position.
     *
     * @return int[] Token position to indentation map
     */
    private function calcIndentMap() {
        $indentMap = [];
        $indent = 0;
        foreach ($this->tokens as $token) {
            $indentMap[] = $indent;

            if ($token[0] === \T_WHITESPACE) {
                $content = $token[1];
                $newlinePos = \strrpos($content, "\n");
                if (false !== $newlinePos) {
                    $indent = \strlen($content) - $newlinePos - 1;
                }
            }
        }

        // Add a sentinel for one past end of the file
        $indentMap[] = $indent;

        return $indentMap;
    }
}
<?php declare(strict_types=1);

namespace PhpParser;

class JsonDecoder
{
    /** @var \ReflectionClass[] Node type to reflection class map */
    private $reflectionClassCache;

    public function decode(string $json) {
        $value = json_decode($json, true);
        if (json_last_error()) {
            throw new \RuntimeException('JSON decoding error: ' . json_last_error_msg());
        }

        return $this->decodeRecursive($value);
    }

    private function decodeRecursive($value) {
        if (\is_array($value)) {
            if (isset($value['nodeType'])) {
                if ($value['nodeType'] === 'Comment' || $value['nodeType'] === 'Comment_Doc') {
                    return $this->decodeComment($value);
                }
                return $this->decodeNode($value);
            }
            return $this->decodeArray($value);
        }
        return $value;
    }

    private function decodeArray(array $array) : array {
        $decodedArray = [];
        foreach ($array as $key => $value) {
            $decodedArray[$key] = $this->decodeRecursive($value);
        }
        return $decodedArray;
    }

    private function decodeNode(array $value) : Node {
        $nodeType = $value['nodeType'];
        if (!\is_string($nodeType)) {
            throw new \RuntimeException('Node type must be a string');
        }

        $reflectionClass = $this->reflectionClassFromNodeType($nodeType);
        /** @var Node $node */
        $node = $reflectionClass->newInstanceWithoutConstructor();

        if (isset($value['attributes'])) {
            if (!\is_array($value['attributes'])) {
                throw new \RuntimeException('Attributes must be an array');
            }

            $node->setAttributes($this->decodeArray($value['attributes']));
        }

        foreach ($value as $name => $subNode) {
            if ($name === 'nodeType' || $name === 'attributes') {
                continue;
            }

            $node->$name = $this->decodeRecursive($subNode);
        }

        return $node;
    }

    private function decodeComment(array $value) : Comment {
        $className = $value['nodeType'] === 'Comment' ? Comment::class : Comment\Doc::class;
        if (!isset($value['text'])) {
            throw new \RuntimeException('Comment must have text');
        }

        return new $className(
            $value['text'],
            $value['line'] ?? -1, $value['filePos'] ?? -1, $value['tokenPos'] ?? -1,
            $value['endLine'] ?? -1, $value['endFilePos'] ?? -1, $value['endTokenPos'] ?? -1
        );
    }

    private function reflectionClassFromNodeType(string $nodeType) : \ReflectionClass {
        if (!isset($this->reflectionClassCache[$nodeType])) {
            $className = $this->classNameFromNodeType($nodeType);
            $this->reflectionClassCache[$nodeType] = new \ReflectionClass($className);
        }
        return $this->reflectionClassCache[$nodeType];
    }

    private function classNameFromNodeType(string $nodeType) : string {
        $className = 'PhpParser\\Node\\' . strtr($nodeType, '_', '\\');
        if (class_exists($className)) {
            return $className;
        }

        $className .= '_';
        if (class_exists($className)) {
            return $className;
        }

        throw new \RuntimeException("Unknown node type \"$nodeType\"");
    }
}
<?php declare(strict_types=1);

namespace PhpParser;

use PhpParser\Parser\Tokens;

class Lexer
{
    protected $code;
    protected $tokens;
    protected $pos;
    protected $line;
    protected $filePos;
    protected $prevCloseTagHasNewline;

    protected $tokenMap;
    protected $dropTokens;
    protected $identifierTokens;

    private $attributeStartLineUsed;
    private $attributeEndLineUsed;
    private $attributeStartTokenPosUsed;
    private $attributeEndTokenPosUsed;
    private $attributeStartFilePosUsed;
    private $attributeEndFilePosUsed;
    private $attributeCommentsUsed;

    /**
     * Creates a Lexer.
     *
     * @param array $options Options array. Currently only the 'usedAttributes' option is supported,
     *                       which is an array of attributes to add to the AST nodes. Possible
     *                       attributes are: 'comments', 'startLine', 'endLine', 'startTokenPos',
     *                       'endTokenPos', 'startFilePos', 'endFilePos'. The option defaults to the
     *                       first three. For more info see getNextToken() docs.
     */
    public function __construct(array $options = []) {
        // Create Map from internal tokens to PhpParser tokens.
        $this->defineCompatibilityTokens();
        $this->tokenMap = $this->createTokenMap();
        $this->identifierTokens = $this->createIdentifierTokenMap();

        // map of tokens to drop while lexing (the map is only used for isset lookup,
        // that's why the value is simply set to 1; the value is never actually used.)
        $this->dropTokens = array_fill_keys(
            [\T_WHITESPACE, \T_OPEN_TAG, \T_COMMENT, \T_DOC_COMMENT, \T_BAD_CHARACTER], 1
        );

        $defaultAttributes = ['comments', 'startLine', 'endLine'];
        $usedAttributes = array_fill_keys($options['usedAttributes'] ?? $defaultAttributes, true);

        // Create individual boolean properties to make these checks faster.
        $this->attributeStartLineUsed = isset($usedAttributes['startLine']);
        $this->attributeEndLineUsed = isset($usedAttributes['endLine']);
        $this->attributeStartTokenPosUsed = isset($usedAttributes['startTokenPos']);
        $this->attributeEndTokenPosUsed = isset($usedAttributes['endTokenPos']);
        $this->attributeStartFilePosUsed = isset($usedAttributes['startFilePos']);
        $this->attributeEndFilePosUsed = isset($usedAttributes['endFilePos']);
        $this->attributeCommentsUsed = isset($usedAttributes['comments']);
    }

    /**
     * Initializes the lexer for lexing the provided source code.
     *
     * This function does not throw if lexing errors occur. Instead, errors may be retrieved using
     * the getErrors() method.
     *
     * @param string $code The source code to lex
     * @param ErrorHandler|null $errorHandler Error handler to use for lexing errors. Defaults to
     *                                        ErrorHandler\Throwing
     */
    public function startLexing(string $code, ErrorHandler $errorHandler = null) {
        if (null === $errorHandler) {
            $errorHandler = new ErrorHandler\Throwing();
        }

        $this->code = $code; // keep the code around for __halt_compiler() handling
        $this->pos  = -1;
        $this->line =  1;
        $this->filePos = 0;

        // If inline HTML occurs without preceding code, treat it as if it had a leading newline.
        // This ensures proper composability, because having a newline is the "safe" assumption.
        $this->prevCloseTagHasNewline = true;

        $scream = ini_set('xdebug.scream', '0');

        $this->tokens = @token_get_all($code);
        $this->postprocessTokens($errorHandler);

        if (false !== $scream) {
            ini_set('xdebug.scream', $scream);
        }
    }

    private function handleInvalidCharacterRange($start, $end, $line, ErrorHandler $errorHandler) {
        $tokens = [];
        for ($i = $start; $i < $end; $i++) {
            $chr = $this->code[$i];
            if ($chr === "\0") {
                // PHP cuts error message after null byte, so need special case
                $errorMsg = 'Unexpected null byte';
            } else {
                $errorMsg = sprintf(
                    'Unexpected character "%s" (ASCII %d)', $chr, ord($chr)
                );
            }

            $tokens[] = [\T_BAD_CHARACTER, $chr, $line];
            $errorHandler->handleError(new Error($errorMsg, [
                'startLine' => $line,
                'endLine' => $line,
                'startFilePos' => $i,
                'endFilePos' => $i,
            ]));
        }
        return $tokens;
    }

    /**
     * Check whether comment token is unterminated.
     *
     * @return bool
     */
    private function isUnterminatedComment($token) : bool {
        return ($token[0] === \T_COMMENT || $token[0] === \T_DOC_COMMENT)
            && substr($token[1], 0, 2) === '/*'
            && substr($token[1], -2) !== '*/';
    }

    protected function postprocessTokens(ErrorHandler $errorHandler) {
        // PHP's error handling for token_get_all() is rather bad, so if we want detailed
        // error information we need to compute it ourselves. Invalid character errors are
        // detected by finding "gaps" in the token array. Unterminated comments are detected
        // by checking if a trailing comment has a "*/" at the end.
        //
        // Additionally, we perform a number of canonicalizations here:
        //  * Use the PHP 8.0 comment format, which does not include trailing whitespace anymore.
        //  * Use PHP 8.0 T_NAME_* tokens.
        //  * Use PHP 8.1 T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG and
        //    T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG tokens used to disambiguate intersection types.

        $filePos = 0;
        $line = 1;
        $numTokens = \count($this->tokens);
        for ($i = 0; $i < $numTokens; $i++) {
            $token = $this->tokens[$i];

            // Since PHP 7.4 invalid characters are represented by a T_BAD_CHARACTER token.
            // In this case we only need to emit an error.
            if ($token[0] === \T_BAD_CHARACTER) {
                $this->handleInvalidCharacterRange($filePos, $filePos + 1, $line, $errorHandler);
            }

            if ($token[0] === \T_COMMENT && substr($token[1], 0, 2) !== '/*'
                    && preg_match('/(\r\n|\n|\r)$/D', $token[1], $matches)) {
                $trailingNewline = $matches[0];
                $token[1] = substr($token[1], 0, -strlen($trailingNewline));
                $this->tokens[$i] = $token;
                if (isset($this->tokens[$i + 1]) && $this->tokens[$i + 1][0] === \T_WHITESPACE) {
                    // Move trailing newline into following T_WHITESPACE token, if it already exists.
                    $this->tokens[$i + 1][1] = $trailingNewline . $this->tokens[$i + 1][1];
                    $this->tokens[$i + 1][2]--;
                } else {
                    // Otherwise, we need to create a new T_WHITESPACE token.
                    array_splice($this->tokens, $i + 1, 0, [
                        [\T_WHITESPACE, $trailingNewline, $line],
                    ]);
                    $numTokens++;
                }
            }

            // Emulate PHP 8 T_NAME_* tokens, by combining sequences of T_NS_SEPARATOR and T_STRING
            // into a single token.
            if (\is_array($token)
                    && ($token[0] === \T_NS_SEPARATOR || isset($this->identifierTokens[$token[0]]))) {
                $lastWasSeparator = $token[0] === \T_NS_SEPARATOR;
                $text = $token[1];
                for ($j = $i + 1; isset($this->tokens[$j]); $j++) {
                    if ($lastWasSeparator) {
                        if (!isset($this->identifierTokens[$this->tokens[$j][0]])) {
                            break;
                        }
                        $lastWasSeparator = false;
                    } else {
                        if ($this->tokens[$j][0] !== \T_NS_SEPARATOR) {
                            break;
                        }
                        $lastWasSeparator = true;
                    }
                    $text .= $this->tokens[$j][1];
                }
                if ($lastWasSeparator) {
                    // Trailing separator is not part of the name.
                    $j--;
                    $text = substr($text, 0, -1);
                }
                if ($j > $i + 1) {
                    if ($token[0] === \T_NS_SEPARATOR) {
                        $type = \T_NAME_FULLY_QUALIFIED;
                    } else if ($token[0] === \T_NAMESPACE) {
                        $type = \T_NAME_RELATIVE;
                    } else {
                        $type = \T_NAME_QUALIFIED;
                    }
                    $token = [$type, $text, $line];
                    array_splice($this->tokens, $i, $j - $i, [$token]);
                    $numTokens -= $j - $i - 1;
                }
            }

            if ($token === '&') {
                $next = $i + 1;
                while (isset($this->tokens[$next]) && $this->tokens[$next][0] === \T_WHITESPACE) {
                    $next++;
                }
                $followedByVarOrVarArg = isset($this->tokens[$next]) &&
                    ($this->tokens[$next][0] === \T_VARIABLE || $this->tokens[$next][0] === \T_ELLIPSIS);
                $this->tokens[$i] = $token = [
                    $followedByVarOrVarArg
                        ? \T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG
                        : \T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG,
                    '&',
                    $line,
                ];
            }

            $tokenValue = \is_string($token) ? $token : $token[1];
            $tokenLen = \strlen($tokenValue);

            if (substr($this->code, $filePos, $tokenLen) !== $tokenValue) {
                // Something is missing, must be an invalid character
                $nextFilePos = strpos($this->code, $tokenValue, $filePos);
                $badCharTokens = $this->handleInvalidCharacterRange(
                    $filePos, $nextFilePos, $line, $errorHandler);
                $filePos = (int) $nextFilePos;

                array_splice($this->tokens, $i, 0, $badCharTokens);
                $numTokens += \count($badCharTokens);
                $i += \count($badCharTokens);
            }

            $filePos += $tokenLen;
            $line += substr_count($tokenValue, "\n");
        }

        if ($filePos !== \strlen($this->code)) {
            if (substr($this->code, $filePos, 2) === '/*') {
                // Unlike PHP, HHVM will drop unterminated comments entirely
                $comment = substr($this->code, $filePos);
                $errorHandler->handleError(new Error('Unterminated comment', [
                    'startLine' => $line,
                    'endLine' => $line + substr_count($comment, "\n"),
                    'startFilePos' => $filePos,
                    'endFilePos' => $filePos + \strlen($comment),
                ]));

                // Emulate the PHP behavior
                $isDocComment = isset($comment[3]) && $comment[3] === '*';
                $this->tokens[] = [$isDocComment ? \T_DOC_COMMENT : \T_COMMENT, $comment, $line];
            } else {
                // Invalid characters at the end of the input
                $badCharTokens = $this->handleInvalidCharacterRange(
                    $filePos, \strlen($this->code), $line, $errorHandler);
                $this->tokens = array_merge($this->tokens, $badCharTokens);
            }
            return;
        }

        if (count($this->tokens) > 0) {
            // Check for unterminated comment
            $lastToken = $this->tokens[count($this->tokens) - 1];
            if ($this->isUnterminatedComment($lastToken)) {
                $errorHandler->handleError(new Error('Unterminated comment', [
                    'startLine' => $line - substr_count($lastToken[1], "\n"),
                    'endLine' => $line,
                    'startFilePos' => $filePos - \strlen($lastToken[1]),
                    'endFilePos' => $filePos,
                ]));
            }
        }
    }

    /**
     * Fetches the next token.
     *
     * The available attributes are determined by the 'usedAttributes' option, which can
     * be specified in the constructor. The following attributes are supported:
     *
     *  * 'comments'      => Array of PhpParser\Comment or PhpParser\Comment\Doc instances,
     *                       representing all comments that occurred between the previous
     *                       non-discarded token and the current one.
     *  * 'startLine'     => Line in which the node starts.
     *  * 'endLine'       => Line in which the node ends.
     *  * 'startTokenPos' => Offset into the token array of the first token in the node.
     *  * 'endTokenPos'   => Offset into the token array of the last token in the node.
     *  * 'startFilePos'  => Offset into the code string of the first character that is part of the node.
     *  * 'endFilePos'    => Offset into the code string of the last character that is part of the node.
     *
     * @param mixed $value           Variable to store token content in
     * @param mixed $startAttributes Variable to store start attributes in
     * @param mixed $endAttributes   Variable to store end attributes in
     *
     * @return int Token id
     */
    public function getNextToken(&$value = null, &$startAttributes = null, &$endAttributes = null) : int {
        $startAttributes = [];
        $endAttributes   = [];

        while (1) {
            if (isset($this->tokens[++$this->pos])) {
                $token = $this->tokens[$this->pos];
            } else {
                // EOF token with ID 0
                $token = "\0";
            }

            if ($this->attributeStartLineUsed) {
                $startAttributes['startLine'] = $this->line;
            }
            if ($this->attributeStartTokenPosUsed) {
                $startAttributes['startTokenPos'] = $this->pos;
            }
            if ($this->attributeStartFilePosUsed) {
                $startAttributes['startFilePos'] = $this->filePos;
            }

            if (\is_string($token)) {
                $value = $token;
                if (isset($token[1])) {
                    // bug in token_get_all
                    $this->filePos += 2;
                    $id = ord('"');
                } else {
                    $this->filePos += 1;
                    $id = ord($token);
                }
            } elseif (!isset($this->dropTokens[$token[0]])) {
                $value = $token[1];
                $id = $this->tokenMap[$token[0]];
                if (\T_CLOSE_TAG === $token[0]) {
                    $this->prevCloseTagHasNewline = false !== strpos($token[1], "\n")
                        || false !== strpos($token[1], "\r");
                } elseif (\T_INLINE_HTML === $token[0]) {
                    $startAttributes['hasLeadingNewline'] = $this->prevCloseTagHasNewline;
                }

                $this->line += substr_count($value, "\n");
                $this->filePos += \strlen($value);
            } else {
                $origLine = $this->line;
                $origFilePos = $this->filePos;
                $this->line += substr_count($token[1], "\n");
                $this->filePos += \strlen($token[1]);

                if (\T_COMMENT === $token[0] || \T_DOC_COMMENT === $token[0]) {
                    if ($this->attributeCommentsUsed) {
                        $comment = \T_DOC_COMMENT === $token[0]
                            ? new Comment\Doc($token[1],
                                $origLine, $origFilePos, $this->pos,
                                $this->line, $this->filePos - 1, $this->pos)
                            : new Comment($token[1],
                                $origLine, $origFilePos, $this->pos,
                                $this->line, $this->filePos - 1, $this->pos);
                        $startAttributes['comments'][] = $comment;
                    }
                }
                continue;
            }

            if ($this->attributeEndLineUsed) {
                $endAttributes['endLine'] = $this->line;
            }
            if ($this->attributeEndTokenPosUsed) {
                $endAttributes['endTokenPos'] = $this->pos;
            }
            if ($this->attributeEndFilePosUsed) {
                $endAttributes['endFilePos'] = $this->filePos - 1;
            }

            return $id;
        }

        throw new \RuntimeException('Reached end of lexer loop');
    }

    /**
     * Returns the token array for current code.
     *
     * The token array is in the same format as provided by the
     * token_get_all() function and does not discard tokens (i.e.
     * whitespace and comments are included). The token position
     * attributes are against this token array.
     *
     * @return array Array of tokens in token_get_all() format
     */
    public function getTokens() : array {
        return $this->tokens;
    }

    /**
     * Handles __halt_compiler() by returning the text after it.
     *
     * @return string Remaining text
     */
    public function handleHaltCompiler() : string {
        // text after T_HALT_COMPILER, still including ();
        $textAfter = substr($this->code, $this->filePos);

        // ensure that it is followed by ();
        // this simplifies the situation, by not allowing any comments
        // in between of the tokens.
        if (!preg_match('~^\s*\(\s*\)\s*(?:;|\?>\r?\n?)~', $textAfter, $matches)) {
            throw new Error('__HALT_COMPILER must be followed by "();"');
        }

        // prevent the lexer from returning any further tokens
        $this->pos = count($this->tokens);

        // return with (); removed
        return substr($textAfter, strlen($matches[0]));
    }

    private function defineCompatibilityTokens() {
        static $compatTokensDefined = false;
        if ($compatTokensDefined) {
            return;
        }

        $compatTokens = [
            // PHP 7.4
            'T_BAD_CHARACTER',
            'T_FN',
            'T_COALESCE_EQUAL',
            // PHP 8.0
            'T_NAME_QUALIFIED',
            'T_NAME_FULLY_QUALIFIED',
            'T_NAME_RELATIVE',
            'T_MATCH',
            'T_NULLSAFE_OBJECT_OPERATOR',
            'T_ATTRIBUTE',
            // PHP 8.1
            'T_ENUM',
            'T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG',
            'T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG',
            'T_READONLY',
        ];

        // PHP-Parser might be used together with another library that also emulates some or all
        // of these tokens. Perform a sanity-check that all already defined tokens have been
        // assigned a unique ID.
        $usedTokenIds = [];
        foreach ($compatTokens as $token) {
            if (\defined($token)) {
                $tokenId = \constant($token);
                $clashingToken = $usedTokenIds[$tokenId] ?? null;
                if ($clashingToken !== null) {
                    throw new \Error(sprintf(
                        'Token %s has same ID as token %s, ' .
                        'you may be using a library with broken token emulation',
                        $token, $clashingToken
                    ));
                }
                $usedTokenIds[$tokenId] = $token;
            }
        }

        // Now define any tokens that have not yet been emulated. Try to assign IDs from -1
        // downwards, but skip any IDs that may already be in use.
        $newTokenId = -1;
        foreach ($compatTokens as $token) {
            if (!\defined($token)) {
                while (isset($usedTokenIds[$newTokenId])) {
                    $newTokenId--;
                }
                \define($token, $newTokenId);
                $newTokenId--;
            }
        }

        $compatTokensDefined = true;
    }

    /**
     * Creates the token map.
     *
     * The token map maps the PHP internal token identifiers
     * to the identifiers used by the Parser. Additionally it
     * maps T_OPEN_TAG_WITH_ECHO to T_ECHO and T_CLOSE_TAG to ';'.
     *
     * @return array The token map
     */
    protected function createTokenMap() : array {
        $tokenMap = [];

        // 256 is the minimum possible token number, as everything below
        // it is an ASCII value
        for ($i = 256; $i < 1000; ++$i) {
            if (\T_DOUBLE_COLON === $i) {
                // T_DOUBLE_COLON is equivalent to T_PAAMAYIM_NEKUDOTAYIM
                $tokenMap[$i] = Tokens::T_PAAMAYIM_NEKUDOTAYIM;
            } elseif(\T_OPEN_TAG_WITH_ECHO === $i) {
                // T_OPEN_TAG_WITH_ECHO with dropped T_OPEN_TAG results in T_ECHO
                $tokenMap[$i] = Tokens::T_ECHO;
            } elseif(\T_CLOSE_TAG === $i) {
                // T_CLOSE_TAG is equivalent to ';'
                $tokenMap[$i] = ord(';');
            } elseif ('UNKNOWN' !== $name = token_name($i)) {
                if ('T_HASHBANG' === $name) {
                    // HHVM uses a special token for #! hashbang lines
                    $tokenMap[$i] = Tokens::T_INLINE_HTML;
                } elseif (defined($name = Tokens::class . '::' . $name)) {
                    // Other tokens can be mapped directly
                    $tokenMap[$i] = constant($name);
                }
            }
        }

        // HHVM uses a special token for numbers that overflow to double
        if (defined('T_ONUMBER')) {
            $tokenMap[\T_ONUMBER] = Tokens::T_DNUMBER;
        }
        // HHVM also has a separate token for the __COMPILER_HALT_OFFSET__ constant
        if (defined('T_COMPILER_HALT_OFFSET')) {
            $tokenMap[\T_COMPILER_HALT_OFFSET] = Tokens::T_STRING;
        }

        // Assign tokens for which we define compatibility constants, as token_name() does not know them.
        $tokenMap[\T_FN] = Tokens::T_FN;
        $tokenMap[\T_COALESCE_EQUAL] = Tokens::T_COALESCE_EQUAL;
        $tokenMap[\T_NAME_QUALIFIED] = Tokens::T_NAME_QUALIFIED;
        $tokenMap[\T_NAME_FULLY_QUALIFIED] = Tokens::T_NAME_FULLY_QUALIFIED;
        $tokenMap[\T_NAME_RELATIVE] = Tokens::T_NAME_RELATIVE;
        $tokenMap[\T_MATCH] = Tokens::T_MATCH;
        $tokenMap[\T_NULLSAFE_OBJECT_OPERATOR] = Tokens::T_NULLSAFE_OBJECT_OPERATOR;
        $tokenMap[\T_ATTRIBUTE] = Tokens::T_ATTRIBUTE;
        $tokenMap[\T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG] = Tokens::T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG;
        $tokenMap[\T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG] = Tokens::T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG;
        $tokenMap[\T_ENUM] = Tokens::T_ENUM;
        $tokenMap[\T_READONLY] = Tokens::T_READONLY;

        return $tokenMap;
    }

    private function createIdentifierTokenMap(): array {
        // Based on semi_reserved production.
        return array_fill_keys([
            \T_STRING,
            \T_STATIC, \T_ABSTRACT, \T_FINAL, \T_PRIVATE, \T_PROTECTED, \T_PUBLIC, \T_READONLY,
            \T_INCLUDE, \T_INCLUDE_ONCE, \T_EVAL, \T_REQUIRE, \T_REQUIRE_ONCE, \T_LOGICAL_OR, \T_LOGICAL_XOR, \T_LOGICAL_AND,
            \T_INSTANCEOF, \T_NEW, \T_CLONE, \T_EXIT, \T_IF, \T_ELSEIF, \T_ELSE, \T_ENDIF, \T_ECHO, \T_DO, \T_WHILE,
            \T_ENDWHILE, \T_FOR, \T_ENDFOR, \T_FOREACH, \T_ENDFOREACH, \T_DECLARE, \T_ENDDECLARE, \T_AS, \T_TRY, \T_CATCH,
            \T_FINALLY, \T_THROW, \T_USE, \T_INSTEADOF, \T_GLOBAL, \T_VAR, \T_UNSET, \T_ISSET, \T_EMPTY, \T_CONTINUE, \T_GOTO,
            \T_FUNCTION, \T_CONST, \T_RETURN, \T_PRINT, \T_YIELD, \T_LIST, \T_SWITCH, \T_ENDSWITCH, \T_CASE, \T_DEFAULT,
            \T_BREAK, \T_ARRAY, \T_CALLABLE, \T_EXTENDS, \T_IMPLEMENTS, \T_NAMESPACE, \T_TRAIT, \T_INTERFACE, \T_CLASS,
            \T_CLASS_C, \T_TRAIT_C, \T_FUNC_C, \T_METHOD_C, \T_LINE, \T_FILE, \T_DIR, \T_NS_C, \T_HALT_COMPILER, \T_FN,
            \T_MATCH,
        ], true);
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Lexer;

use PhpParser\Error;
use PhpParser\ErrorHandler;
use PhpParser\Lexer;
use PhpParser\Lexer\TokenEmulator\AttributeEmulator;
use PhpParser\Lexer\TokenEmulator\EnumTokenEmulator;
use PhpParser\Lexer\TokenEmulator\CoaleseEqualTokenEmulator;
use PhpParser\Lexer\TokenEmulator\ExplicitOctalEmulator;
use PhpParser\Lexer\TokenEmulator\FlexibleDocStringEmulator;
use PhpParser\Lexer\TokenEmulator\FnTokenEmulator;
use PhpParser\Lexer\TokenEmulator\MatchTokenEmulator;
use PhpParser\Lexer\TokenEmulator\NullsafeTokenEmulator;
use PhpParser\Lexer\TokenEmulator\NumericLiteralSeparatorEmulator;
use PhpParser\Lexer\TokenEmulator\ReadonlyFunctionTokenEmulator;
use PhpParser\Lexer\TokenEmulator\ReadonlyTokenEmulator;
use PhpParser\Lexer\TokenEmulator\ReverseEmulator;
use PhpParser\Lexer\TokenEmulator\TokenEmulator;

class Emulative extends Lexer
{
    const PHP_7_3 = '7.3dev';
    const PHP_7_4 = '7.4dev';
    const PHP_8_0 = '8.0dev';
    const PHP_8_1 = '8.1dev';
    const PHP_8_2 = '8.2dev';

    /** @var mixed[] Patches used to reverse changes introduced in the code */
    private $patches = [];

    /** @var TokenEmulator[] */
    private $emulators = [];

    /** @var string */
    private $targetPhpVersion;

    /**
     * @param mixed[] $options Lexer options. In addition to the usual options,
     *                         accepts a 'phpVersion' string that specifies the
     *                         version to emulate. Defaults to newest supported.
     */
    public function __construct(array $options = [])
    {
        $this->targetPhpVersion = $options['phpVersion'] ?? Emulative::PHP_8_2;
        unset($options['phpVersion']);

        parent::__construct($options);

        $emulators = [
            new FlexibleDocStringEmulator(),
            new FnTokenEmulator(),
            new MatchTokenEmulator(),
            new CoaleseEqualTokenEmulator(),
            new NumericLiteralSeparatorEmulator(),
            new NullsafeTokenEmulator(),
            new AttributeEmulator(),
            new EnumTokenEmulator(),
            new ReadonlyTokenEmulator(),
            new ExplicitOctalEmulator(),
            new ReadonlyFunctionTokenEmulator(),
        ];

        // Collect emulators that are relevant for the PHP version we're running
        // and the PHP version we're targeting for emulation.
        foreach ($emulators as $emulator) {
            $emulatorPhpVersion = $emulator->getPhpVersion();
            if ($this->isForwardEmulationNeeded($emulatorPhpVersion)) {
                $this->emulators[] = $emulator;
            } else if ($this->isReverseEmulationNeeded($emulatorPhpVersion)) {
                $this->emulators[] = new ReverseEmulator($emulator);
            }
        }
    }

    public function startLexing(string $code, ErrorHandler $errorHandler = null) {
        $emulators = array_filter($this->emulators, function($emulator) use($code) {
            return $emulator->isEmulationNeeded($code);
        });

        if (empty($emulators)) {
            // Nothing to emulate, yay
            parent::startLexing($code, $errorHandler);
            return;
        }

        $this->patches = [];
        foreach ($emulators as $emulator) {
            $code = $emulator->preprocessCode($code, $this->patches);
        }

        $collector = new ErrorHandler\Collecting();
        parent::startLexing($code, $collector);
        $this->sortPatches();
        $this->fixupTokens();

        $errors = $collector->getErrors();
        if (!empty($errors)) {
            $this->fixupErrors($errors);
            foreach ($errors as $error) {
                $errorHandler->handleError($error);
            }
        }

        foreach ($emulators as $emulator) {
            $this->tokens = $emulator->emulate($code, $this->tokens);
        }
    }

    private function isForwardEmulationNeeded(string $emulatorPhpVersion): bool {
        return version_compare(\PHP_VERSION, $emulatorPhpVersion, '<')
            && version_compare($this->targetPhpVersion, $emulatorPhpVersion, '>=');
    }

    private function isReverseEmulationNeeded(string $emulatorPhpVersion): bool {
        return version_compare(\PHP_VERSION, $emulatorPhpVersion, '>=')
            && version_compare($this->targetPhpVersion, $emulatorPhpVersion, '<');
    }

    private function sortPatches()
    {
        // Patches may be contributed by different emulators.
        // Make sure they are sorted by increasing patch position.
        usort($this->patches, function($p1, $p2) {
            return $p1[0] <=> $p2[0];
        });
    }

    private function fixupTokens()
    {
        if (\count($this->patches) === 0) {
            return;
        }

        // Load first patch
        $patchIdx = 0;

        list($patchPos, $patchType, $patchText) = $this->patches[$patchIdx];

        // We use a manual loop over the tokens, because we modify the array on the fly
        $pos = 0;
        for ($i = 0, $c = \count($this->tokens); $i < $c; $i++) {
            $token = $this->tokens[$i];
            if (\is_string($token)) {
                if ($patchPos === $pos) {
                    // Only support replacement for string tokens.
                    assert($patchType === 'replace');
                    $this->tokens[$i] = $patchText;

                    // Fetch the next patch
                    $patchIdx++;
                    if ($patchIdx >= \count($this->patches)) {
                        // No more patches, we're done
                        return;
                    }
                    list($patchPos, $patchType, $patchText) = $this->patches[$patchIdx];
                }

                $pos += \strlen($token);
                continue;
            }

            $len = \strlen($token[1]);
            $posDelta = 0;
            while ($patchPos >= $pos && $patchPos < $pos + $len) {
                $patchTextLen = \strlen($patchText);
                if ($patchType === 'remove') {
                    if ($patchPos === $pos && $patchTextLen === $len) {
                        // Remove token entirely
                        array_splice($this->tokens, $i, 1, []);
                        $i--;
                        $c--;
                    } else {
                        // Remove from token string
                        $this->tokens[$i][1] = substr_replace(
                            $token[1], '', $patchPos - $pos + $posDelta, $patchTextLen
                        );
                        $posDelta -= $patchTextLen;
                    }
                } elseif ($patchType === 'add') {
                    // Insert into the token string
                    $this->tokens[$i][1] = substr_replace(
                        $token[1], $patchText, $patchPos - $pos + $posDelta, 0
                    );
                    $posDelta += $patchTextLen;
                } else if ($patchType === 'replace') {
                    // Replace inside the token string
                    $this->tokens[$i][1] = substr_replace(
                        $token[1], $patchText, $patchPos - $pos + $posDelta, $patchTextLen
                    );
                } else {
                    assert(false);
                }

                // Fetch the next patch
                $patchIdx++;
                if ($patchIdx >= \count($this->patches)) {
                    // No more patches, we're done
                    return;
                }

                list($patchPos, $patchType, $patchText) = $this->patches[$patchIdx];

                // Multiple patches may apply to the same token. Reload the current one to check
                // If the new patch applies
                $token = $this->tokens[$i];
            }

            $pos += $len;
        }

        // A patch did not apply
        assert(false);
    }

    /**
     * Fixup line and position information in errors.
     *
     * @param Error[] $errors
     */
    private function fixupErrors(array $errors) {
        foreach ($errors as $error) {
            $attrs = $error->getAttributes();

            $posDelta = 0;
            $lineDelta = 0;
            foreach ($this->patches as $patch) {
                list($patchPos, $patchType, $patchText) = $patch;
                if ($patchPos >= $attrs['startFilePos']) {
                    // No longer relevant
                    break;
                }

                if ($patchType === 'add') {
                    $posDelta += strlen($patchText);
                    $lineDelta += substr_count($patchText, "\n");
                } else if ($patchType === 'remove') {
                    $posDelta -= strlen($patchText);
                    $lineDelta -= substr_count($patchText, "\n");
                }
            }

            $attrs['startFilePos'] += $posDelta;
            $attrs['endFilePos'] += $posDelta;
            $attrs['startLine'] += $lineDelta;
            $attrs['endLine'] += $lineDelta;
            $error->setAttributes($attrs);
        }
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Lexer\TokenEmulator;

use PhpParser\Lexer\Emulative;

final class AttributeEmulator extends TokenEmulator
{
    public function getPhpVersion(): string
    {
        return Emulative::PHP_8_0;
    }

    public function isEmulationNeeded(string $code) : bool
    {
        return strpos($code, '#[') !== false;
    }

    public function emulate(string $code, array $tokens): array
    {
        // We need to manually iterate and manage a count because we'll change
        // the tokens array on the way.
        $line = 1;
        for ($i = 0, $c = count($tokens); $i < $c; ++$i) {
            if ($tokens[$i] === '#' && isset($tokens[$i + 1]) && $tokens[$i + 1] === '[') {
                array_splice($tokens, $i, 2, [
                    [\T_ATTRIBUTE, '#[', $line]
                ]);
                $c--;
                continue;
            }
            if (\is_array($tokens[$i])) {
                $line += substr_count($tokens[$i][1], "\n");
            }
        }

        return $tokens;
    }

    public function reverseEmulate(string $code, array $tokens): array
    {
        // TODO
        return $tokens;
    }

    public function preprocessCode(string $code, array &$patches): string {
        $pos = 0;
        while (false !== $pos = strpos($code, '#[', $pos)) {
            // Replace #[ with %[
            $code[$pos] = '%';
            $patches[] = [$pos, 'replace', '#'];
            $pos += 2;
        }
        return $code;
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Lexer\TokenEmulator;

use PhpParser\Lexer\Emulative;

final class CoaleseEqualTokenEmulator extends TokenEmulator
{
    public function getPhpVersion(): string
    {
        return Emulative::PHP_7_4;
    }

    public function isEmulationNeeded(string $code): bool
    {
        return strpos($code, '??=') !== false;
    }

    public function emulate(string $code, array $tokens): array
    {
        // We need to manually iterate and manage a count because we'll change
        // the tokens array on the way
        $line = 1;
        for ($i = 0, $c = count($tokens); $i < $c; ++$i) {
            if (isset($tokens[$i + 1])) {
                if ($tokens[$i][0] === T_COALESCE && $tokens[$i + 1] === '=') {
                    array_splice($tokens, $i, 2, [
                        [\T_COALESCE_EQUAL, '??=', $line]
                    ]);
                    $c--;
                    continue;
                }
            }
            if (\is_array($tokens[$i])) {
                $line += substr_count($tokens[$i][1], "\n");
            }
        }

        return $tokens;
    }

    public function reverseEmulate(string $code, array $tokens): array
    {
        // ??= was not valid code previously, don't bother.
        return $tokens;
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Lexer\TokenEmulator;

use PhpParser\Lexer\Emulative;

final class EnumTokenEmulator extends KeywordEmulator
{
    public function getPhpVersion(): string
    {
        return Emulative::PHP_8_1;
    }

    public function getKeywordString(): string
    {
        return 'enum';
    }

    public function getKeywordToken(): int
    {
        return \T_ENUM;
    }

    protected function isKeywordContext(array $tokens, int $pos): bool
    {
        return parent::isKeywordContext($tokens, $pos)
            && isset($tokens[$pos + 2])
            && $tokens[$pos + 1][0] === \T_WHITESPACE
            && $tokens[$pos + 2][0] === \T_STRING;
    }
}<?php declare(strict_types=1);

namespace PhpParser\Lexer\TokenEmulator;

use PhpParser\Lexer\Emulative;

class ExplicitOctalEmulator extends TokenEmulator {
    public function getPhpVersion(): string {
        return Emulative::PHP_8_1;
    }

    public function isEmulationNeeded(string $code): bool {
        return strpos($code, '0o') !== false || strpos($code, '0O') !== false;
    }

    public function emulate(string $code, array $tokens): array {
        for ($i = 0, $c = count($tokens); $i < $c; ++$i) {
            if ($tokens[$i][0] == \T_LNUMBER && $tokens[$i][1] === '0' &&
                isset($tokens[$i + 1]) && $tokens[$i + 1][0] == \T_STRING &&
                preg_match('/[oO][0-7]+(?:_[0-7]+)*/', $tokens[$i + 1][1])
            ) {
                $tokenKind = $this->resolveIntegerOrFloatToken($tokens[$i + 1][1]);
                array_splice($tokens, $i, 2, [
                    [$tokenKind, '0' . $tokens[$i + 1][1], $tokens[$i][2]],
                ]);
                $c--;
            }
        }
        return $tokens;
    }

    private function resolveIntegerOrFloatToken(string $str): int
    {
        $str = substr($str, 1);
        $str = str_replace('_', '', $str);
        $num = octdec($str);
        return is_float($num) ? \T_DNUMBER : \T_LNUMBER;
    }

    public function reverseEmulate(string $code, array $tokens): array {
        // Explicit octals were not legal code previously, don't bother.
        return $tokens;
    }
}<?php declare(strict_types=1);

namespace PhpParser\Lexer\TokenEmulator;

use PhpParser\Lexer\Emulative;

final class FlexibleDocStringEmulator extends TokenEmulator
{
    const FLEXIBLE_DOC_STRING_REGEX = <<<'REGEX'
/<<<[ \t]*(['"]?)([a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*)\1\r?\n
(?:.*\r?\n)*?
(?<indentation>\h*)\2(?![a-zA-Z0-9_\x80-\xff])(?<separator>(?:;?[\r\n])?)/x
REGEX;

    public function getPhpVersion(): string
    {
        return Emulative::PHP_7_3;
    }

    public function isEmulationNeeded(string $code) : bool
    {
        return strpos($code, '<<<') !== false;
    }

    public function emulate(string $code, array $tokens): array
    {
        // Handled by preprocessing + fixup.
        return $tokens;
    }

    public function reverseEmulate(string $code, array $tokens): array
    {
        // Not supported.
        return $tokens;
    }

    public function preprocessCode(string $code, array &$patches): string {
        if (!preg_match_all(self::FLEXIBLE_DOC_STRING_REGEX, $code, $matches, PREG_SET_ORDER|PREG_OFFSET_CAPTURE)) {
            // No heredoc/nowdoc found
            return $code;
        }

        // Keep track of how much we need to adjust string offsets due to the modifications we
        // already made
        $posDelta = 0;
        foreach ($matches as $match) {
            $indentation = $match['indentation'][0];
            $indentationStart = $match['indentation'][1];

            $separator = $match['separator'][0];
            $separatorStart = $match['separator'][1];

            if ($indentation === '' && $separator !== '') {
                // Ordinary heredoc/nowdoc
                continue;
            }

            if ($indentation !== '') {
                // Remove indentation
                $indentationLen = strlen($indentation);
                $code = substr_replace($code, '', $indentationStart + $posDelta, $indentationLen);
                $patches[] = [$indentationStart + $posDelta, 'add', $indentation];
                $posDelta -= $indentationLen;
            }

            if ($separator === '') {
                // Insert newline as separator
                $code = substr_replace($code, "\n", $separatorStart + $posDelta, 0);
                $patches[] = [$separatorStart + $posDelta, 'remove', "\n"];
                $posDelta += 1;
            }
        }

        return $code;
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Lexer\TokenEmulator;

use PhpParser\Lexer\Emulative;

final class FnTokenEmulator extends KeywordEmulator
{
    public function getPhpVersion(): string
    {
        return Emulative::PHP_7_4;
    }

    public function getKeywordString(): string
    {
        return 'fn';
    }

    public function getKeywordToken(): int
    {
        return \T_FN;
    }
}<?php declare(strict_types=1);

namespace PhpParser\Lexer\TokenEmulator;

abstract class KeywordEmulator extends TokenEmulator
{
    abstract function getKeywordString(): string;
    abstract function getKeywordToken(): int;

    public function isEmulationNeeded(string $code): bool
    {
        return strpos(strtolower($code), $this->getKeywordString()) !== false;
    }

    protected function isKeywordContext(array $tokens, int $pos): bool
    {
        $previousNonSpaceToken = $this->getPreviousNonSpaceToken($tokens, $pos);
        return $previousNonSpaceToken === null || $previousNonSpaceToken[0] !== \T_OBJECT_OPERATOR;
    }

    public function emulate(string $code, array $tokens): array
    {
        $keywordString = $this->getKeywordString();
        foreach ($tokens as $i => $token) {
            if ($token[0] === T_STRING && strtolower($token[1]) === $keywordString
                    && $this->isKeywordContext($tokens, $i)) {
                $tokens[$i][0] = $this->getKeywordToken();
            }
        }

        return $tokens;
    }

    /**
     * @param mixed[] $tokens
     * @return array|string|null
     */
    private function getPreviousNonSpaceToken(array $tokens, int $start)
    {
        for ($i = $start - 1; $i >= 0; --$i) {
            if ($tokens[$i][0] === T_WHITESPACE) {
                continue;
            }

            return $tokens[$i];
        }

        return null;
    }

    public function reverseEmulate(string $code, array $tokens): array
    {
        $keywordToken = $this->getKeywordToken();
        foreach ($tokens as $i => $token) {
            if ($token[0] === $keywordToken) {
                $tokens[$i][0] = \T_STRING;
            }
        }

        return $tokens;
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Lexer\TokenEmulator;

use PhpParser\Lexer\Emulative;

final class MatchTokenEmulator extends KeywordEmulator
{
    public function getPhpVersion(): string
    {
        return Emulative::PHP_8_0;
    }

    public function getKeywordString(): string
    {
        return 'match';
    }

    public function getKeywordToken(): int
    {
        return \T_MATCH;
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Lexer\TokenEmulator;

use PhpParser\Lexer\Emulative;

final class NullsafeTokenEmulator extends TokenEmulator
{
    public function getPhpVersion(): string
    {
        return Emulative::PHP_8_0;
    }

    public function isEmulationNeeded(string $code): bool
    {
        return strpos($code, '?->') !== false;
    }

    public function emulate(string $code, array $tokens): array
    {
        // We need to manually iterate and manage a count because we'll change
        // the tokens array on the way
        $line = 1;
        for ($i = 0, $c = count($tokens); $i < $c; ++$i) {
            if ($tokens[$i] === '?' && isset($tokens[$i + 1]) && $tokens[$i + 1][0] === \T_OBJECT_OPERATOR) {
                array_splice($tokens, $i, 2, [
                    [\T_NULLSAFE_OBJECT_OPERATOR, '?->', $line]
                ]);
                $c--;
                continue;
            }

            // Handle ?-> inside encapsed string.
            if ($tokens[$i][0] === \T_ENCAPSED_AND_WHITESPACE && isset($tokens[$i - 1])
                && $tokens[$i - 1][0] === \T_VARIABLE
                && preg_match('/^\?->([a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*)/', $tokens[$i][1], $matches)
            ) {
                $replacement = [
                    [\T_NULLSAFE_OBJECT_OPERATOR, '?->', $line],
                    [\T_STRING, $matches[1], $line],
                ];
                if (\strlen($matches[0]) !== \strlen($tokens[$i][1])) {
                    $replacement[] = [
                        \T_ENCAPSED_AND_WHITESPACE,
                        \substr($tokens[$i][1], \strlen($matches[0])),
                        $line
                    ];
                }
                array_splice($tokens, $i, 1, $replacement);
                $c += \count($replacement) - 1;
                continue;
            }

            if (\is_array($tokens[$i])) {
                $line += substr_count($tokens[$i][1], "\n");
            }
        }

        return $tokens;
    }

    public function reverseEmulate(string $code, array $tokens): array
    {
        // ?-> was not valid code previously, don't bother.
        return $tokens;
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Lexer\TokenEmulator;

use PhpParser\Lexer\Emulative;

final class NumericLiteralSeparatorEmulator extends TokenEmulator
{
    const BIN = '(?:0b[01]+(?:_[01]+)*)';
    const HEX = '(?:0x[0-9a-f]+(?:_[0-9a-f]+)*)';
    const DEC = '(?:[0-9]+(?:_[0-9]+)*)';
    const SIMPLE_FLOAT = '(?:' . self::DEC . '\.' . self::DEC . '?|\.' . self::DEC . ')';
    const EXP = '(?:e[+-]?' . self::DEC . ')';
    const FLOAT = '(?:' . self::SIMPLE_FLOAT . self::EXP . '?|' . self::DEC . self::EXP . ')';
    const NUMBER = '~' . self::FLOAT . '|' . self::BIN . '|' . self::HEX . '|' . self::DEC . '~iA';

    public function getPhpVersion(): string
    {
        return Emulative::PHP_7_4;
    }

    public function isEmulationNeeded(string $code) : bool
    {
        return preg_match('~[0-9]_[0-9]~', $code)
            || preg_match('~0x[0-9a-f]+_[0-9a-f]~i', $code);
    }

    public function emulate(string $code, array $tokens): array
    {
        // We need to manually iterate and manage a count because we'll change
        // the tokens array on the way
        $codeOffset = 0;
        for ($i = 0, $c = count($tokens); $i < $c; ++$i) {
            $token = $tokens[$i];
            $tokenLen = \strlen(\is_array($token) ? $token[1] : $token);

            if ($token[0] !== T_LNUMBER && $token[0] !== T_DNUMBER) {
                $codeOffset += $tokenLen;
                continue;
            }

            $res = preg_match(self::NUMBER, $code, $matches, 0, $codeOffset);
            assert($res, "No number at number token position");

            $match = $matches[0];
            $matchLen = \strlen($match);
            if ($matchLen === $tokenLen) {
                // Original token already holds the full number.
                $codeOffset += $tokenLen;
                continue;
            }

            $tokenKind = $this->resolveIntegerOrFloatToken($match);
            $newTokens = [[$tokenKind, $match, $token[2]]];

            $numTokens = 1;
            $len = $tokenLen;
            while ($matchLen > $len) {
                $nextToken = $tokens[$i + $numTokens];
                $nextTokenText = \is_array($nextToken) ? $nextToken[1] : $nextToken;
                $nextTokenLen = \strlen($nextTokenText);

                $numTokens++;
                if ($matchLen < $len + $nextTokenLen) {
                    // Split trailing characters into a partial token.
                    assert(is_array($nextToken), "Partial token should be an array token");
                    $partialText = substr($nextTokenText, $matchLen - $len);
                    $newTokens[] = [$nextToken[0], $partialText, $nextToken[2]];
                    break;
                }

                $len += $nextTokenLen;
            }

            array_splice($tokens, $i, $numTokens, $newTokens);
            $c -= $numTokens - \count($newTokens);
            $codeOffset += $matchLen;
        }

        return $tokens;
    }

    private function resolveIntegerOrFloatToken(string $str): int
    {
        $str = str_replace('_', '', $str);

        if (stripos($str, '0b') === 0) {
            $num = bindec($str);
        } elseif (stripos($str, '0x') === 0) {
            $num = hexdec($str);
        } elseif (stripos($str, '0') === 0 && ctype_digit($str)) {
            $num = octdec($str);
        } else {
            $num = +$str;
        }

        return is_float($num) ? T_DNUMBER : T_LNUMBER;
    }

    public function reverseEmulate(string $code, array $tokens): array
    {
        // Numeric separators were not legal code previously, don't bother.
        return $tokens;
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Lexer\TokenEmulator;

use PhpParser\Lexer\Emulative;

/*
 * In PHP 8.1, "readonly(" was special cased in the lexer in order to support functions with
 * name readonly. In PHP 8.2, this may conflict with readonly properties having a DNF type. For
 * this reason, PHP 8.2 instead treats this as T_READONLY and then handles it specially in the
 * parser. This emulator only exists to handle this special case, which is skipped by the
 * PHP 8.1 ReadonlyTokenEmulator.
 */
class ReadonlyFunctionTokenEmulator extends KeywordEmulator {
    public function getKeywordString(): string {
        return 'readonly';
    }

    public function getKeywordToken(): int {
        return \T_READONLY;
    }

    public function getPhpVersion(): string {
        return Emulative::PHP_8_2;
    }

    public function reverseEmulate(string $code, array $tokens): array {
        // Don't bother
        return $tokens;
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Lexer\TokenEmulator;

use PhpParser\Lexer\Emulative;

final class ReadonlyTokenEmulator extends KeywordEmulator
{
    public function getPhpVersion(): string
    {
        return Emulative::PHP_8_1;
    }

    public function getKeywordString(): string
    {
        return 'readonly';
    }

    public function getKeywordToken(): int
    {
        return \T_READONLY;
    }

    protected function isKeywordContext(array $tokens, int $pos): bool
    {
        if (!parent::isKeywordContext($tokens, $pos)) {
            return false;
        }
        // Support "function readonly("
        return !(isset($tokens[$pos + 1]) &&
                 ($tokens[$pos + 1][0] === '(' ||
                  ($tokens[$pos + 1][0] === \T_WHITESPACE &&
                   isset($tokens[$pos + 2]) &&
                   $tokens[$pos + 2][0] === '(')));
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Lexer\TokenEmulator;

/**
 * Reverses emulation direction of the inner emulator.
 */
final class ReverseEmulator extends TokenEmulator
{
    /** @var TokenEmulator Inner emulator */
    private $emulator;

    public function __construct(TokenEmulator $emulator) {
        $this->emulator = $emulator;
    }

    public function getPhpVersion(): string {
        return $this->emulator->getPhpVersion();
    }

    public function isEmulationNeeded(string $code): bool {
        return $this->emulator->isEmulationNeeded($code);
    }

    public function emulate(string $code, array $tokens): array {
        return $this->emulator->reverseEmulate($code, $tokens);
    }

    public function reverseEmulate(string $code, array $tokens): array {
        return $this->emulator->emulate($code, $tokens);
    }

    public function preprocessCode(string $code, array &$patches): string {
        return $code;
    }
}<?php declare(strict_types=1);

namespace PhpParser\Lexer\TokenEmulator;

/** @internal */
abstract class TokenEmulator
{
    abstract public function getPhpVersion(): string;

    abstract public function isEmulationNeeded(string $code): bool;

    /**
     * @return array Modified Tokens
     */
    abstract public function emulate(string $code, array $tokens): array;

    /**
     * @return array Modified Tokens
     */
    abstract public function reverseEmulate(string $code, array $tokens): array;

    public function preprocessCode(string $code, array &$patches): string {
        return $code;
    }
}
<?php declare(strict_types=1);

namespace PhpParser;

use PhpParser\Node\Name;
use PhpParser\Node\Name\FullyQualified;
use PhpParser\Node\Stmt;

class NameContext
{
    /** @var null|Name Current namespace */
    protected $namespace;

    /** @var Name[][] Map of format [aliasType => [aliasName => originalName]] */
    protected $aliases = [];

    /** @var Name[][] Same as $aliases but preserving original case */
    protected $origAliases = [];

    /** @var ErrorHandler Error handler */
    protected $errorHandler;

    /**
     * Create a name context.
     *
     * @param ErrorHandler $errorHandler Error handling used to report errors
     */
    public function __construct(ErrorHandler $errorHandler) {
        $this->errorHandler = $errorHandler;
    }

    /**
     * Start a new namespace.
     *
     * This also resets the alias table.
     *
     * @param Name|null $namespace Null is the global namespace
     */
    public function startNamespace(Name $namespace = null) {
        $this->namespace = $namespace;
        $this->origAliases = $this->aliases = [
            Stmt\Use_::TYPE_NORMAL   => [],
            Stmt\Use_::TYPE_FUNCTION => [],
            Stmt\Use_::TYPE_CONSTANT => [],
        ];
    }

    /**
     * Add an alias / import.
     *
     * @param Name   $name        Original name
     * @param string $aliasName   Aliased name
     * @param int    $type        One of Stmt\Use_::TYPE_*
     * @param array  $errorAttrs Attributes to use to report an error
     */
    public function addAlias(Name $name, string $aliasName, int $type, array $errorAttrs = []) {
        // Constant names are case sensitive, everything else case insensitive
        if ($type === Stmt\Use_::TYPE_CONSTANT) {
            $aliasLookupName = $aliasName;
        } else {
            $aliasLookupName = strtolower($aliasName);
        }

        if (isset($this->aliases[$type][$aliasLookupName])) {
            $typeStringMap = [
                Stmt\Use_::TYPE_NORMAL   => '',
                Stmt\Use_::TYPE_FUNCTION => 'function ',
                Stmt\Use_::TYPE_CONSTANT => 'const ',
            ];

            $this->errorHandler->handleError(new Error(
                sprintf(
                    'Cannot use %s%s as %s because the name is already in use',
                    $typeStringMap[$type], $name, $aliasName
                ),
                $errorAttrs
            ));
            return;
        }

        $this->aliases[$type][$aliasLookupName] = $name;
        $this->origAliases[$type][$aliasName] = $name;
    }

    /**
     * Get current namespace.
     *
     * @return null|Name Namespace (or null if global namespace)
     */
    public function getNamespace() {
        return $this->namespace;
    }

    /**
     * Get resolved name.
     *
     * @param Name $name Name to resolve
     * @param int  $type One of Stmt\Use_::TYPE_{FUNCTION|CONSTANT}
     *
     * @return null|Name Resolved name, or null if static resolution is not possible
     */
    public function getResolvedName(Name $name, int $type) {
        // don't resolve special class names
        if ($type === Stmt\Use_::TYPE_NORMAL && $name->isSpecialClassName()) {
            if (!$name->isUnqualified()) {
                $this->errorHandler->handleError(new Error(
                    sprintf("'\\%s' is an invalid class name", $name->toString()),
                    $name->getAttributes()
                ));
            }
            return $name;
        }

        // fully qualified names are already resolved
        if ($name->isFullyQualified()) {
            return $name;
        }

        // Try to resolve aliases
        if (null !== $resolvedName = $this->resolveAlias($name, $type)) {
            return $resolvedName;
        }

        if ($type !== Stmt\Use_::TYPE_NORMAL && $name->isUnqualified()) {
            if (null === $this->namespace) {
                // outside of a namespace unaliased unqualified is same as fully qualified
                return new FullyQualified($name, $name->getAttributes());
            }

            // Cannot resolve statically
            return null;
        }

        // if no alias exists prepend current namespace
        return FullyQualified::concat($this->namespace, $name, $name->getAttributes());
    }

    /**
     * Get resolved class name.
     *
     * @param Name $name Class ame to resolve
     *
     * @return Name Resolved name
     */
    public function getResolvedClassName(Name $name) : Name {
        return $this->getResolvedName($name, Stmt\Use_::TYPE_NORMAL);
    }

    /**
     * Get possible ways of writing a fully qualified name (e.g., by making use of aliases).
     *
     * @param string $name Fully-qualified name (without leading namespace separator)
     * @param int    $type One of Stmt\Use_::TYPE_*
     *
     * @return Name[] Possible representations of the name
     */
    public function getPossibleNames(string $name, int $type) : array {
        $lcName = strtolower($name);

        if ($type === Stmt\Use_::TYPE_NORMAL) {
            // self, parent and static must always be unqualified
            if ($lcName === "self" || $lcName === "parent" || $lcName === "static") {
                return [new Name($name)];
            }
        }

        // Collect possible ways to write this name, starting with the fully-qualified name
        $possibleNames = [new FullyQualified($name)];

        if (null !== $nsRelativeName = $this->getNamespaceRelativeName($name, $lcName, $type)) {
            // Make sure there is no alias that makes the normally namespace-relative name
            // into something else
            if (null === $this->resolveAlias($nsRelativeName, $type)) {
                $possibleNames[] = $nsRelativeName;
            }
        }

        // Check for relevant namespace use statements
        foreach ($this->origAliases[Stmt\Use_::TYPE_NORMAL] as $alias => $orig) {
            $lcOrig = $orig->toLowerString();
            if (0 === strpos($lcName, $lcOrig . '\\')) {
                $possibleNames[] = new Name($alias . substr($name, strlen($lcOrig)));
            }
        }

        // Check for relevant type-specific use statements
        foreach ($this->origAliases[$type] as $alias => $orig) {
            if ($type === Stmt\Use_::TYPE_CONSTANT) {
                // Constants are are complicated-sensitive
                $normalizedOrig = $this->normalizeConstName($orig->toString());
                if ($normalizedOrig === $this->normalizeConstName($name)) {
                    $possibleNames[] = new Name($alias);
                }
            } else {
                // Everything else is case-insensitive
                if ($orig->toLowerString() === $lcName) {
                    $possibleNames[] = new Name($alias);
                }
            }
        }

        return $possibleNames;
    }

    /**
     * Get shortest representation of this fully-qualified name.
     *
     * @param string $name Fully-qualified name (without leading namespace separator)
     * @param int    $type One of Stmt\Use_::TYPE_*
     *
     * @return Name Shortest representation
     */
    public function getShortName(string $name, int $type) : Name {
        $possibleNames = $this->getPossibleNames($name, $type);

        // Find shortest name
        $shortestName = null;
        $shortestLength = \INF;
        foreach ($possibleNames as $possibleName) {
            $length = strlen($possibleName->toCodeString());
            if ($length < $shortestLength) {
                $shortestName = $possibleName;
                $shortestLength = $length;
            }
        }

       return $shortestName;
    }

    private function resolveAlias(Name $name, $type) {
        $firstPart = $name->getFirst();

        if ($name->isQualified()) {
            // resolve aliases for qualified names, always against class alias table
            $checkName = strtolower($firstPart);
            if (isset($this->aliases[Stmt\Use_::TYPE_NORMAL][$checkName])) {
                $alias = $this->aliases[Stmt\Use_::TYPE_NORMAL][$checkName];
                return FullyQualified::concat($alias, $name->slice(1), $name->getAttributes());
            }
        } elseif ($name->isUnqualified()) {
            // constant aliases are case-sensitive, function aliases case-insensitive
            $checkName = $type === Stmt\Use_::TYPE_CONSTANT ? $firstPart : strtolower($firstPart);
            if (isset($this->aliases[$type][$checkName])) {
                // resolve unqualified aliases
                return new FullyQualified($this->aliases[$type][$checkName], $name->getAttributes());
            }
        }

        // No applicable aliases
        return null;
    }

    private function getNamespaceRelativeName(string $name, string $lcName, int $type) {
        if (null === $this->namespace) {
            return new Name($name);
        }

        if ($type === Stmt\Use_::TYPE_CONSTANT) {
            // The constants true/false/null always resolve to the global symbols, even inside a
            // namespace, so they may be used without qualification
            if ($lcName === "true" || $lcName === "false" || $lcName === "null") {
                return new Name($name);
            }
        }

        $namespacePrefix = strtolower($this->namespace . '\\');
        if (0 === strpos($lcName, $namespacePrefix)) {
            return new Name(substr($name, strlen($namespacePrefix)));
        }

        return null;
    }

    private function normalizeConstName(string $name) {
        $nsSep = strrpos($name, '\\');
        if (false === $nsSep) {
            return $name;
        }

        // Constants have case-insensitive namespace and case-sensitive short-name
        $ns = substr($name, 0, $nsSep);
        $shortName = substr($name, $nsSep + 1);
        return strtolower($ns) . '\\' . $shortName;
    }
}
<?php declare(strict_types=1);

namespace PhpParser;

interface Node
{
    /**
     * Gets the type of the node.
     *
     * @return string Type of the node
     */
    public function getType() : string;

    /**
     * Gets the names of the sub nodes.
     *
     * @return array Names of sub nodes
     */
    public function getSubNodeNames() : array;

    /**
     * Gets line the node started in (alias of getStartLine).
     *
     * @return int Start line (or -1 if not available)
     */
    public function getLine() : int;

    /**
     * Gets line the node started in.
     *
     * Requires the 'startLine' attribute to be enabled in the lexer (enabled by default).
     *
     * @return int Start line (or -1 if not available)
     */
    public function getStartLine() : int;

    /**
     * Gets the line the node ended in.
     *
     * Requires the 'endLine' attribute to be enabled in the lexer (enabled by default).
     *
     * @return int End line (or -1 if not available)
     */
    public function getEndLine() : int;

    /**
     * Gets the token offset of the first token that is part of this node.
     *
     * The offset is an index into the array returned by Lexer::getTokens().
     *
     * Requires the 'startTokenPos' attribute to be enabled in the lexer (DISABLED by default).
     *
     * @return int Token start position (or -1 if not available)
     */
    public function getStartTokenPos() : int;

    /**
     * Gets the token offset of the last token that is part of this node.
     *
     * The offset is an index into the array returned by Lexer::getTokens().
     *
     * Requires the 'endTokenPos' attribute to be enabled in the lexer (DISABLED by default).
     *
     * @return int Token end position (or -1 if not available)
     */
    public function getEndTokenPos() : int;

    /**
     * Gets the file offset of the first character that is part of this node.
     *
     * Requires the 'startFilePos' attribute to be enabled in the lexer (DISABLED by default).
     *
     * @return int File start position (or -1 if not available)
     */
    public function getStartFilePos() : int;

    /**
     * Gets the file offset of the last character that is part of this node.
     *
     * Requires the 'endFilePos' attribute to be enabled in the lexer (DISABLED by default).
     *
     * @return int File end position (or -1 if not available)
     */
    public function getEndFilePos() : int;

    /**
     * Gets all comments directly preceding this node.
     *
     * The comments are also available through the "comments" attribute.
     *
     * @return Comment[]
     */
    public function getComments() : array;

    /**
     * Gets the doc comment of the node.
     *
     * @return null|Comment\Doc Doc comment object or null
     */
    public function getDocComment();

    /**
     * Sets the doc comment of the node.
     *
     * This will either replace an existing doc comment or add it to the comments array.
     *
     * @param Comment\Doc $docComment Doc comment to set
     */
    public function setDocComment(Comment\Doc $docComment);

    /**
     * Sets an attribute on a node.
     *
     * @param string $key
     * @param mixed  $value
     */
    public function setAttribute(string $key, $value);

    /**
     * Returns whether an attribute exists.
     *
     * @param string $key
     *
     * @return bool
     */
    public function hasAttribute(string $key) : bool;

    /**
     * Returns the value of an attribute.
     *
     * @param string $key
     * @param mixed  $default
     *
     * @return mixed
     */
    public function getAttribute(string $key, $default = null);

    /**
     * Returns all the attributes of this node.
     *
     * @return array
     */
    public function getAttributes() : array;

    /**
     * Replaces all the attributes of this node.
     *
     * @param array $attributes
     */
    public function setAttributes(array $attributes);
}
<?php declare(strict_types=1);

namespace PhpParser\Node;

use PhpParser\Node\VariadicPlaceholder;
use PhpParser\NodeAbstract;

class Arg extends NodeAbstract
{
    /** @var Identifier|null Parameter name (for named parameters) */
    public $name;
    /** @var Expr Value to pass */
    public $value;
    /** @var bool Whether to pass by ref */
    public $byRef;
    /** @var bool Whether to unpack the argument */
    public $unpack;

    /**
     * Constructs a function call argument node.
     *
     * @param Expr  $value      Value to pass
     * @param bool  $byRef      Whether to pass by ref
     * @param bool  $unpack     Whether to unpack the argument
     * @param array $attributes Additional attributes
     * @param Identifier|null $name Parameter name (for named parameters)
     */
    public function __construct(
        Expr $value, bool $byRef = false, bool $unpack = false, array $attributes = [],
        Identifier $name = null
    ) {
        $this->attributes = $attributes;
        $this->name = $name;
        $this->value = $value;
        $this->byRef = $byRef;
        $this->unpack = $unpack;
    }

    public function getSubNodeNames() : array {
        return ['name', 'value', 'byRef', 'unpack'];
    }
    
    public function getType() : string {
        return 'Arg';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node;

use PhpParser\Node;
use PhpParser\NodeAbstract;

class Attribute extends NodeAbstract
{
    /** @var Name Attribute name */
    public $name;

    /** @var Arg[] Attribute arguments */
    public $args;

    /**
     * @param Node\Name $name       Attribute name
     * @param Arg[]     $args       Attribute arguments
     * @param array     $attributes Additional node attributes
     */
    public function __construct(Name $name, array $args = [], array $attributes = []) {
        $this->attributes = $attributes;
        $this->name = $name;
        $this->args = $args;
    }

    public function getSubNodeNames() : array {
        return ['name', 'args'];
    }

    public function getType() : string {
        return 'Attribute';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node;

use PhpParser\Node;
use PhpParser\NodeAbstract;

class AttributeGroup extends NodeAbstract
{
    /** @var Attribute[] Attributes */
    public $attrs;

    /**
     * @param Attribute[] $attrs PHP attributes
     * @param array $attributes Additional node attributes
     */
    public function __construct(array $attrs, array $attributes = []) {
        $this->attributes = $attributes;
        $this->attrs = $attrs;
    }

    public function getSubNodeNames() : array {
        return ['attrs'];
    }

    public function getType() : string {
        return 'AttributeGroup';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node;

use PhpParser\NodeAbstract;

/**
 * This is a base class for complex types, including nullable types and union types.
 *
 * It does not provide any shared behavior and exists only for type-checking purposes.
 */
abstract class ComplexType extends NodeAbstract
{
}
<?php declare(strict_types=1);

namespace PhpParser\Node;

use PhpParser\NodeAbstract;

class Const_ extends NodeAbstract
{
    /** @var Identifier Name */
    public $name;
    /** @var Expr Value */
    public $value;

    /** @var Name|null Namespaced name (if using NameResolver) */
    public $namespacedName;

    /**
     * Constructs a const node for use in class const and const statements.
     *
     * @param string|Identifier $name       Name
     * @param Expr              $value      Value
     * @param array             $attributes Additional attributes
     */
    public function __construct($name, Expr $value, array $attributes = []) {
        $this->attributes = $attributes;
        $this->name = \is_string($name) ? new Identifier($name) : $name;
        $this->value = $value;
    }

    public function getSubNodeNames() : array {
        return ['name', 'value'];
    }

    public function getType() : string {
        return 'Const';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node;

use PhpParser\NodeAbstract;

abstract class Expr extends NodeAbstract
{
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;

class ArrayDimFetch extends Expr
{
    /** @var Expr Variable */
    public $var;
    /** @var null|Expr Array index / dim */
    public $dim;

    /**
     * Constructs an array index fetch node.
     *
     * @param Expr      $var        Variable
     * @param null|Expr $dim        Array index / dim
     * @param array     $attributes Additional attributes
     */
    public function __construct(Expr $var, Expr $dim = null, array $attributes = []) {
        $this->attributes = $attributes;
        $this->var = $var;
        $this->dim = $dim;
    }

    public function getSubNodeNames() : array {
        return ['var', 'dim'];
    }
    
    public function getType() : string {
        return 'Expr_ArrayDimFetch';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;

class ArrayItem extends Expr
{
    /** @var null|Expr Key */
    public $key;
    /** @var Expr Value */
    public $value;
    /** @var bool Whether to assign by reference */
    public $byRef;
    /** @var bool Whether to unpack the argument */
    public $unpack;

    /**
     * Constructs an array item node.
     *
     * @param Expr      $value      Value
     * @param null|Expr $key        Key
     * @param bool      $byRef      Whether to assign by reference
     * @param array     $attributes Additional attributes
     */
    public function __construct(Expr $value, Expr $key = null, bool $byRef = false, array $attributes = [], bool $unpack = false) {
        $this->attributes = $attributes;
        $this->key = $key;
        $this->value = $value;
        $this->byRef = $byRef;
        $this->unpack = $unpack;
    }

    public function getSubNodeNames() : array {
        return ['key', 'value', 'byRef', 'unpack'];
    }

    public function getType() : string {
        return 'Expr_ArrayItem';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;

class Array_ extends Expr
{
    // For use in "kind" attribute
    const KIND_LONG = 1;  // array() syntax
    const KIND_SHORT = 2; // [] syntax

    /** @var (ArrayItem|null)[] Items */
    public $items;

    /**
     * Constructs an array node.
     *
     * @param (ArrayItem|null)[] $items      Items of the array
     * @param array       $attributes Additional attributes
     */
    public function __construct(array $items = [], array $attributes = []) {
        $this->attributes = $attributes;
        $this->items = $items;
    }

    public function getSubNodeNames() : array {
        return ['items'];
    }
    
    public function getType() : string {
        return 'Expr_Array';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr;

use PhpParser\Node;
use PhpParser\Node\Expr;
use PhpParser\Node\FunctionLike;

class ArrowFunction extends Expr implements FunctionLike
{
    /** @var bool */
    public $static;

    /** @var bool */
    public $byRef;

    /** @var Node\Param[] */
    public $params = [];

    /** @var null|Node\Identifier|Node\Name|Node\ComplexType */
    public $returnType;

    /** @var Expr */
    public $expr;
    /** @var Node\AttributeGroup[] */
    public $attrGroups;

    /**
     * @param array $subNodes   Array of the following optional subnodes:
     *                          'static'     => false   : Whether the closure is static
     *                          'byRef'      => false   : Whether to return by reference
     *                          'params'     => array() : Parameters
     *                          'returnType' => null    : Return type
     *                          'expr'       => Expr    : Expression body
     *                          'attrGroups' => array() : PHP attribute groups
     * @param array $attributes Additional attributes
     */
    public function __construct(array $subNodes = [], array $attributes = []) {
        $this->attributes = $attributes;
        $this->static = $subNodes['static'] ?? false;
        $this->byRef = $subNodes['byRef'] ?? false;
        $this->params = $subNodes['params'] ?? [];
        $returnType = $subNodes['returnType'] ?? null;
        $this->returnType = \is_string($returnType) ? new Node\Identifier($returnType) : $returnType;
        $this->expr = $subNodes['expr'];
        $this->attrGroups = $subNodes['attrGroups'] ?? [];
    }

    public function getSubNodeNames() : array {
        return ['attrGroups', 'static', 'byRef', 'params', 'returnType', 'expr'];
    }

    public function returnsByRef() : bool {
        return $this->byRef;
    }

    public function getParams() : array {
        return $this->params;
    }

    public function getReturnType() {
        return $this->returnType;
    }

    public function getAttrGroups() : array {
        return $this->attrGroups;
    }

    /**
     * @return Node\Stmt\Return_[]
     */
    public function getStmts() : array {
        return [new Node\Stmt\Return_($this->expr)];
    }

    public function getType() : string {
        return 'Expr_ArrowFunction';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;

class Assign extends Expr
{
    /** @var Expr Variable */
    public $var;
    /** @var Expr Expression */
    public $expr;

    /**
     * Constructs an assignment node.
     *
     * @param Expr  $var        Variable
     * @param Expr  $expr       Expression
     * @param array $attributes Additional attributes
     */
    public function __construct(Expr $var, Expr $expr, array $attributes = []) {
        $this->attributes = $attributes;
        $this->var = $var;
        $this->expr = $expr;
    }

    public function getSubNodeNames() : array {
        return ['var', 'expr'];
    }
    
    public function getType() : string {
        return 'Expr_Assign';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;

abstract class AssignOp extends Expr
{
    /** @var Expr Variable */
    public $var;
    /** @var Expr Expression */
    public $expr;

    /**
     * Constructs a compound assignment operation node.
     *
     * @param Expr  $var        Variable
     * @param Expr  $expr       Expression
     * @param array $attributes Additional attributes
     */
    public function __construct(Expr $var, Expr $expr, array $attributes = []) {
        $this->attributes = $attributes;
        $this->var = $var;
        $this->expr = $expr;
    }

    public function getSubNodeNames() : array {
        return ['var', 'expr'];
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr\AssignOp;

use PhpParser\Node\Expr\AssignOp;

class BitwiseAnd extends AssignOp
{
    public function getType() : string {
        return 'Expr_AssignOp_BitwiseAnd';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr\AssignOp;

use PhpParser\Node\Expr\AssignOp;

class BitwiseOr extends AssignOp
{
    public function getType() : string {
        return 'Expr_AssignOp_BitwiseOr';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr\AssignOp;

use PhpParser\Node\Expr\AssignOp;

class BitwiseXor extends AssignOp
{
    public function getType() : string {
        return 'Expr_AssignOp_BitwiseXor';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr\AssignOp;

use PhpParser\Node\Expr\AssignOp;

class Coalesce extends AssignOp
{
    public function getType() : string {
        return 'Expr_AssignOp_Coalesce';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr\AssignOp;

use PhpParser\Node\Expr\AssignOp;

class Concat extends AssignOp
{
    public function getType() : string {
        return 'Expr_AssignOp_Concat';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr\AssignOp;

use PhpParser\Node\Expr\AssignOp;

class Div extends AssignOp
{
    public function getType() : string {
        return 'Expr_AssignOp_Div';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr\AssignOp;

use PhpParser\Node\Expr\AssignOp;

class Minus extends AssignOp
{
    public function getType() : string {
        return 'Expr_AssignOp_Minus';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr\AssignOp;

use PhpParser\Node\Expr\AssignOp;

class Mod extends AssignOp
{
    public function getType() : string {
        return 'Expr_AssignOp_Mod';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr\AssignOp;

use PhpParser\Node\Expr\AssignOp;

class Mul extends AssignOp
{
    public function getType() : string {
        return 'Expr_AssignOp_Mul';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr\AssignOp;

use PhpParser\Node\Expr\AssignOp;

class Plus extends AssignOp
{
    public function getType() : string {
        return 'Expr_AssignOp_Plus';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr\AssignOp;

use PhpParser\Node\Expr\AssignOp;

class Pow extends AssignOp
{
    public function getType() : string {
        return 'Expr_AssignOp_Pow';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr\AssignOp;

use PhpParser\Node\Expr\AssignOp;

class ShiftLeft extends AssignOp
{
    public function getType() : string {
        return 'Expr_AssignOp_ShiftLeft';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr\AssignOp;

use PhpParser\Node\Expr\AssignOp;

class ShiftRight extends AssignOp
{
    public function getType() : string {
        return 'Expr_AssignOp_ShiftRight';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;

class AssignRef extends Expr
{
    /** @var Expr Variable reference is assigned to */
    public $var;
    /** @var Expr Variable which is referenced */
    public $expr;

    /**
     * Constructs an assignment node.
     *
     * @param Expr  $var        Variable
     * @param Expr  $expr       Expression
     * @param array $attributes Additional attributes
     */
    public function __construct(Expr $var, Expr $expr, array $attributes = []) {
        $this->attributes = $attributes;
        $this->var = $var;
        $this->expr = $expr;
    }

    public function getSubNodeNames() : array {
        return ['var', 'expr'];
    }
    
    public function getType() : string {
        return 'Expr_AssignRef';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;

abstract class BinaryOp extends Expr
{
    /** @var Expr The left hand side expression */
    public $left;
    /** @var Expr The right hand side expression */
    public $right;

    /**
     * Constructs a binary operator node.
     *
     * @param Expr  $left       The left hand side expression
     * @param Expr  $right      The right hand side expression
     * @param array $attributes Additional attributes
     */
    public function __construct(Expr $left, Expr $right, array $attributes = []) {
        $this->attributes = $attributes;
        $this->left = $left;
        $this->right = $right;
    }

    public function getSubNodeNames() : array {
        return ['left', 'right'];
    }

    /**
     * Get the operator sigil for this binary operation.
     *
     * In the case there are multiple possible sigils for an operator, this method does not
     * necessarily return the one used in the parsed code.
     *
     * @return string
     */
    abstract public function getOperatorSigil() : string;
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr\BinaryOp;

use PhpParser\Node\Expr\BinaryOp;

class BitwiseAnd extends BinaryOp
{
    public function getOperatorSigil() : string {
        return '&';
    }
    
    public function getType() : string {
        return 'Expr_BinaryOp_BitwiseAnd';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr\BinaryOp;

use PhpParser\Node\Expr\BinaryOp;

class BitwiseOr extends BinaryOp
{
    public function getOperatorSigil() : string {
        return '|';
    }
    
    public function getType() : string {
        return 'Expr_BinaryOp_BitwiseOr';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr\BinaryOp;

use PhpParser\Node\Expr\BinaryOp;

class BitwiseXor extends BinaryOp
{
    public function getOperatorSigil() : string {
        return '^';
    }
    
    public function getType() : string {
        return 'Expr_BinaryOp_BitwiseXor';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr\BinaryOp;

use PhpParser\Node\Expr\BinaryOp;

class BooleanAnd extends BinaryOp
{
    public function getOperatorSigil() : string {
        return '&&';
    }
    
    public function getType() : string {
        return 'Expr_BinaryOp_BooleanAnd';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr\BinaryOp;

use PhpParser\Node\Expr\BinaryOp;

class BooleanOr extends BinaryOp
{
    public function getOperatorSigil() : string {
        return '||';
    }
    
    public function getType() : string {
        return 'Expr_BinaryOp_BooleanOr';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr\BinaryOp;

use PhpParser\Node\Expr\BinaryOp;

class Coalesce extends BinaryOp
{
    public function getOperatorSigil() : string {
        return '??';
    }
    
    public function getType() : string {
        return 'Expr_BinaryOp_Coalesce';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr\BinaryOp;

use PhpParser\Node\Expr\BinaryOp;

class Concat extends BinaryOp
{
    public function getOperatorSigil() : string {
        return '.';
    }
    
    public function getType() : string {
        return 'Expr_BinaryOp_Concat';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr\BinaryOp;

use PhpParser\Node\Expr\BinaryOp;

class Div extends BinaryOp
{
    public function getOperatorSigil() : string {
        return '/';
    }
    
    public function getType() : string {
        return 'Expr_BinaryOp_Div';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr\BinaryOp;

use PhpParser\Node\Expr\BinaryOp;

class Equal extends BinaryOp
{
    public function getOperatorSigil() : string {
        return '==';
    }
    
    public function getType() : string {
        return 'Expr_BinaryOp_Equal';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr\BinaryOp;

use PhpParser\Node\Expr\BinaryOp;

class Greater extends BinaryOp
{
    public function getOperatorSigil() : string {
        return '>';
    }
    
    public function getType() : string {
        return 'Expr_BinaryOp_Greater';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr\BinaryOp;

use PhpParser\Node\Expr\BinaryOp;

class GreaterOrEqual extends BinaryOp
{
    public function getOperatorSigil() : string {
        return '>=';
    }
    
    public function getType() : string {
        return 'Expr_BinaryOp_GreaterOrEqual';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr\BinaryOp;

use PhpParser\Node\Expr\BinaryOp;

class Identical extends BinaryOp
{
    public function getOperatorSigil() : string {
        return '===';
    }
    
    public function getType() : string {
        return 'Expr_BinaryOp_Identical';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr\BinaryOp;

use PhpParser\Node\Expr\BinaryOp;

class LogicalAnd extends BinaryOp
{
    public function getOperatorSigil() : string {
        return 'and';
    }
    
    public function getType() : string {
        return 'Expr_BinaryOp_LogicalAnd';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr\BinaryOp;

use PhpParser\Node\Expr\BinaryOp;

class LogicalOr extends BinaryOp
{
    public function getOperatorSigil() : string {
        return 'or';
    }
    
    public function getType() : string {
        return 'Expr_BinaryOp_LogicalOr';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr\BinaryOp;

use PhpParser\Node\Expr\BinaryOp;

class LogicalXor extends BinaryOp
{
    public function getOperatorSigil() : string {
        return 'xor';
    }
    
    public function getType() : string {
        return 'Expr_BinaryOp_LogicalXor';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr\BinaryOp;

use PhpParser\Node\Expr\BinaryOp;

class Minus extends BinaryOp
{
    public function getOperatorSigil() : string {
        return '-';
    }
    
    public function getType() : string {
        return 'Expr_BinaryOp_Minus';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr\BinaryOp;

use PhpParser\Node\Expr\BinaryOp;

class Mod extends BinaryOp
{
    public function getOperatorSigil() : string {
        return '%';
    }
    
    public function getType() : string {
        return 'Expr_BinaryOp_Mod';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr\BinaryOp;

use PhpParser\Node\Expr\BinaryOp;

class Mul extends BinaryOp
{
    public function getOperatorSigil() : string {
        return '*';
    }
    
    public function getType() : string {
        return 'Expr_BinaryOp_Mul';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr\BinaryOp;

use PhpParser\Node\Expr\BinaryOp;

class NotEqual extends BinaryOp
{
    public function getOperatorSigil() : string {
        return '!=';
    }
    
    public function getType() : string {
        return 'Expr_BinaryOp_NotEqual';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr\BinaryOp;

use PhpParser\Node\Expr\BinaryOp;

class NotIdentical extends BinaryOp
{
    public function getOperatorSigil() : string {
        return '!==';
    }
    
    public function getType() : string {
        return 'Expr_BinaryOp_NotIdentical';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr\BinaryOp;

use PhpParser\Node\Expr\BinaryOp;

class Plus extends BinaryOp
{
    public function getOperatorSigil() : string {
        return '+';
    }
    
    public function getType() : string {
        return 'Expr_BinaryOp_Plus';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr\BinaryOp;

use PhpParser\Node\Expr\BinaryOp;

class Pow extends BinaryOp
{
    public function getOperatorSigil() : string {
        return '**';
    }
    
    public function getType() : string {
        return 'Expr_BinaryOp_Pow';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr\BinaryOp;

use PhpParser\Node\Expr\BinaryOp;

class ShiftLeft extends BinaryOp
{
    public function getOperatorSigil() : string {
        return '<<';
    }
    
    public function getType() : string {
        return 'Expr_BinaryOp_ShiftLeft';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr\BinaryOp;

use PhpParser\Node\Expr\BinaryOp;

class ShiftRight extends BinaryOp
{
    public function getOperatorSigil() : string {
        return '>>';
    }
    
    public function getType() : string {
        return 'Expr_BinaryOp_ShiftRight';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr\BinaryOp;

use PhpParser\Node\Expr\BinaryOp;

class Smaller extends BinaryOp
{
    public function getOperatorSigil() : string {
        return '<';
    }
    
    public function getType() : string {
        return 'Expr_BinaryOp_Smaller';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr\BinaryOp;

use PhpParser\Node\Expr\BinaryOp;

class SmallerOrEqual extends BinaryOp
{
    public function getOperatorSigil() : string {
        return '<=';
    }
    
    public function getType() : string {
        return 'Expr_BinaryOp_SmallerOrEqual';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr\BinaryOp;

use PhpParser\Node\Expr\BinaryOp;

class Spaceship extends BinaryOp
{
    public function getOperatorSigil() : string {
        return '<=>';
    }
    
    public function getType() : string {
        return 'Expr_BinaryOp_Spaceship';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;

class BitwiseNot extends Expr
{
    /** @var Expr Expression */
    public $expr;

    /**
     * Constructs a bitwise not node.
     *
     * @param Expr  $expr       Expression
     * @param array $attributes Additional attributes
     */
    public function __construct(Expr $expr, array $attributes = []) {
        $this->attributes = $attributes;
        $this->expr = $expr;
    }

    public function getSubNodeNames() : array {
        return ['expr'];
    }
    
    public function getType() : string {
        return 'Expr_BitwiseNot';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;

class BooleanNot extends Expr
{
    /** @var Expr Expression */
    public $expr;

    /**
     * Constructs a boolean not node.
     *
     * @param Expr $expr       Expression
     * @param array               $attributes Additional attributes
     */
    public function __construct(Expr $expr, array $attributes = []) {
        $this->attributes = $attributes;
        $this->expr = $expr;
    }

    public function getSubNodeNames() : array {
        return ['expr'];
    }
    
    public function getType() : string {
        return 'Expr_BooleanNot';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr;

use PhpParser\Node\Arg;
use PhpParser\Node\Expr;
use PhpParser\Node\VariadicPlaceholder;

abstract class CallLike extends Expr {
    /**
     * Return raw arguments, which may be actual Args, or VariadicPlaceholders for first-class
     * callables.
     *
     * @return array<Arg|VariadicPlaceholder>
     */
    abstract public function getRawArgs(): array;

    /**
     * Returns whether this call expression is actually a first class callable.
     */
    public function isFirstClassCallable(): bool {
        foreach ($this->getRawArgs() as $arg) {
            if ($arg instanceof VariadicPlaceholder) {
                return true;
            }
        }
        return false;
    }

    /**
     * Assert that this is not a first-class callable and return only ordinary Args.
     *
     * @return Arg[]
     */
    public function getArgs(): array {
        assert(!$this->isFirstClassCallable());
        return $this->getRawArgs();
    }
}<?php declare(strict_types=1);

namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;

abstract class Cast extends Expr
{
    /** @var Expr Expression */
    public $expr;

    /**
     * Constructs a cast node.
     *
     * @param Expr  $expr       Expression
     * @param array $attributes Additional attributes
     */
    public function __construct(Expr $expr, array $attributes = []) {
        $this->attributes = $attributes;
        $this->expr = $expr;
    }

    public function getSubNodeNames() : array {
        return ['expr'];
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr\Cast;

use PhpParser\Node\Expr\Cast;

class Array_ extends Cast
{
    public function getType() : string {
        return 'Expr_Cast_Array';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr\Cast;

use PhpParser\Node\Expr\Cast;

class Bool_ extends Cast
{
    public function getType() : string {
        return 'Expr_Cast_Bool';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr\Cast;

use PhpParser\Node\Expr\Cast;

class Double extends Cast
{
    // For use in "kind" attribute
    const KIND_DOUBLE = 1; // "double" syntax
    const KIND_FLOAT = 2;  // "float" syntax
    const KIND_REAL = 3; // "real" syntax

    public function getType() : string {
        return 'Expr_Cast_Double';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr\Cast;

use PhpParser\Node\Expr\Cast;

class Int_ extends Cast
{
    public function getType() : string {
        return 'Expr_Cast_Int';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr\Cast;

use PhpParser\Node\Expr\Cast;

class Object_ extends Cast
{
    public function getType() : string {
        return 'Expr_Cast_Object';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr\Cast;

use PhpParser\Node\Expr\Cast;

class String_ extends Cast
{
    public function getType() : string {
        return 'Expr_Cast_String';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr\Cast;

use PhpParser\Node\Expr\Cast;

class Unset_ extends Cast
{
    public function getType() : string {
        return 'Expr_Cast_Unset';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;
use PhpParser\Node\Identifier;
use PhpParser\Node\Name;

class ClassConstFetch extends Expr
{
    /** @var Name|Expr Class name */
    public $class;
    /** @var Identifier|Expr|Error Constant name */
    public $name;

    /**
     * Constructs a class const fetch node.
     *
     * @param Name|Expr                    $class      Class name
     * @param string|Identifier|Expr|Error $name       Constant name
     * @param array                        $attributes Additional attributes
     */
    public function __construct($class, $name, array $attributes = []) {
        $this->attributes = $attributes;
        $this->class = $class;
        $this->name = \is_string($name) ? new Identifier($name) : $name;
    }

    public function getSubNodeNames() : array {
        return ['class', 'name'];
    }

    public function getType() : string {
        return 'Expr_ClassConstFetch';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;

class Clone_ extends Expr
{
    /** @var Expr Expression */
    public $expr;

    /**
     * Constructs a clone node.
     *
     * @param Expr  $expr       Expression
     * @param array $attributes Additional attributes
     */
    public function __construct(Expr $expr, array $attributes = []) {
        $this->attributes = $attributes;
        $this->expr = $expr;
    }

    public function getSubNodeNames() : array {
        return ['expr'];
    }
    
    public function getType() : string {
        return 'Expr_Clone';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr;

use PhpParser\Node;
use PhpParser\Node\Expr;
use PhpParser\Node\FunctionLike;

class Closure extends Expr implements FunctionLike
{
    /** @var bool Whether the closure is static */
    public $static;
    /** @var bool Whether to return by reference */
    public $byRef;
    /** @var Node\Param[] Parameters */
    public $params;
    /** @var ClosureUse[] use()s */
    public $uses;
    /** @var null|Node\Identifier|Node\Name|Node\ComplexType Return type */
    public $returnType;
    /** @var Node\Stmt[] Statements */
    public $stmts;
    /** @var Node\AttributeGroup[] PHP attribute groups */
    public $attrGroups;

    /**
     * Constructs a lambda function node.
     *
     * @param array $subNodes   Array of the following optional subnodes:
     *                          'static'     => false  : Whether the closure is static
     *                          'byRef'      => false  : Whether to return by reference
     *                          'params'     => array(): Parameters
     *                          'uses'       => array(): use()s
     *                          'returnType' => null   : Return type
     *                          'stmts'      => array(): Statements
     *                          'attrGroups' => array(): PHP attributes groups
     * @param array $attributes Additional attributes
     */
    public function __construct(array $subNodes = [], array $attributes = []) {
        $this->attributes = $attributes;
        $this->static = $subNodes['static'] ?? false;
        $this->byRef = $subNodes['byRef'] ?? false;
        $this->params = $subNodes['params'] ?? [];
        $this->uses = $subNodes['uses'] ?? [];
        $returnType = $subNodes['returnType'] ?? null;
        $this->returnType = \is_string($returnType) ? new Node\Identifier($returnType) : $returnType;
        $this->stmts = $subNodes['stmts'] ?? [];
        $this->attrGroups = $subNodes['attrGroups'] ?? [];
    }

    public function getSubNodeNames() : array {
        return ['attrGroups', 'static', 'byRef', 'params', 'uses', 'returnType', 'stmts'];
    }

    public function returnsByRef() : bool {
        return $this->byRef;
    }

    public function getParams() : array {
        return $this->params;
    }

    public function getReturnType() {
        return $this->returnType;
    }

    /** @return Node\Stmt[] */
    public function getStmts() : array {
        return $this->stmts;
    }

    public function getAttrGroups() : array {
        return $this->attrGroups;
    }

    public function getType() : string {
        return 'Expr_Closure';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;

class ClosureUse extends Expr
{
    /** @var Expr\Variable Variable to use */
    public $var;
    /** @var bool Whether to use by reference */
    public $byRef;

    /**
     * Constructs a closure use node.
     *
     * @param Expr\Variable $var        Variable to use
     * @param bool          $byRef      Whether to use by reference
     * @param array         $attributes Additional attributes
     */
    public function __construct(Expr\Variable $var, bool $byRef = false, array $attributes = []) {
        $this->attributes = $attributes;
        $this->var = $var;
        $this->byRef = $byRef;
    }

    public function getSubNodeNames() : array {
        return ['var', 'byRef'];
    }
    
    public function getType() : string {
        return 'Expr_ClosureUse';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;
use PhpParser\Node\Name;

class ConstFetch extends Expr
{
    /** @var Name Constant name */
    public $name;

    /**
     * Constructs a const fetch node.
     *
     * @param Name  $name       Constant name
     * @param array $attributes Additional attributes
     */
    public function __construct(Name $name, array $attributes = []) {
        $this->attributes = $attributes;
        $this->name = $name;
    }

    public function getSubNodeNames() : array {
        return ['name'];
    }
    
    public function getType() : string {
        return 'Expr_ConstFetch';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;

class Empty_ extends Expr
{
    /** @var Expr Expression */
    public $expr;

    /**
     * Constructs an empty() node.
     *
     * @param Expr  $expr       Expression
     * @param array $attributes Additional attributes
     */
    public function __construct(Expr $expr, array $attributes = []) {
        $this->attributes = $attributes;
        $this->expr = $expr;
    }

    public function getSubNodeNames() : array {
        return ['expr'];
    }
    
    public function getType() : string {
        return 'Expr_Empty';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;

/**
 * Error node used during parsing with error recovery.
 *
 * An error node may be placed at a position where an expression is required, but an error occurred.
 * Error nodes will not be present if the parser is run in throwOnError mode (the default).
 */
class Error extends Expr
{
    /**
     * Constructs an error node.
     *
     * @param array $attributes Additional attributes
     */
    public function __construct(array $attributes = []) {
        $this->attributes = $attributes;
    }

    public function getSubNodeNames() : array {
        return [];
    }
    
    public function getType() : string {
        return 'Expr_Error';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;

class ErrorSuppress extends Expr
{
    /** @var Expr Expression */
    public $expr;

    /**
     * Constructs an error suppress node.
     *
     * @param Expr  $expr       Expression
     * @param array $attributes Additional attributes
     */
    public function __construct(Expr $expr, array $attributes = []) {
        $this->attributes = $attributes;
        $this->expr = $expr;
    }

    public function getSubNodeNames() : array {
        return ['expr'];
    }
    
    public function getType() : string {
        return 'Expr_ErrorSuppress';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;

class Eval_ extends Expr
{
    /** @var Expr Expression */
    public $expr;

    /**
     * Constructs an eval() node.
     *
     * @param Expr  $expr       Expression
     * @param array $attributes Additional attributes
     */
    public function __construct(Expr $expr, array $attributes = []) {
        $this->attributes = $attributes;
        $this->expr = $expr;
    }

    public function getSubNodeNames() : array {
        return ['expr'];
    }
    
    public function getType() : string {
        return 'Expr_Eval';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;

class Exit_ extends Expr
{
    /* For use in "kind" attribute */
    const KIND_EXIT = 1;
    const KIND_DIE = 2;

    /** @var null|Expr Expression */
    public $expr;

    /**
     * Constructs an exit() node.
     *
     * @param null|Expr $expr       Expression
     * @param array                    $attributes Additional attributes
     */
    public function __construct(Expr $expr = null, array $attributes = []) {
        $this->attributes = $attributes;
        $this->expr = $expr;
    }

    public function getSubNodeNames() : array {
        return ['expr'];
    }
    
    public function getType() : string {
        return 'Expr_Exit';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr;

use PhpParser\Node;
use PhpParser\Node\Expr;

class FuncCall extends CallLike
{
    /** @var Node\Name|Expr Function name */
    public $name;
    /** @var array<Node\Arg|Node\VariadicPlaceholder> Arguments */
    public $args;

    /**
     * Constructs a function call node.
     *
     * @param Node\Name|Expr                           $name       Function name
     * @param array<Node\Arg|Node\VariadicPlaceholder> $args       Arguments
     * @param array                                    $attributes Additional attributes
     */
    public function __construct($name, array $args = [], array $attributes = []) {
        $this->attributes = $attributes;
        $this->name = $name;
        $this->args = $args;
    }

    public function getSubNodeNames() : array {
        return ['name', 'args'];
    }
    
    public function getType() : string {
        return 'Expr_FuncCall';
    }

    public function getRawArgs(): array {
        return $this->args;
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;

class Include_ extends Expr
{
    const TYPE_INCLUDE      = 1;
    const TYPE_INCLUDE_ONCE = 2;
    const TYPE_REQUIRE      = 3;
    const TYPE_REQUIRE_ONCE = 4;

    /** @var Expr Expression */
    public $expr;
    /** @var int Type of include */
    public $type;

    /**
     * Constructs an include node.
     *
     * @param Expr  $expr       Expression
     * @param int   $type       Type of include
     * @param array $attributes Additional attributes
     */
    public function __construct(Expr $expr, int $type, array $attributes = []) {
        $this->attributes = $attributes;
        $this->expr = $expr;
        $this->type = $type;
    }

    public function getSubNodeNames() : array {
        return ['expr', 'type'];
    }
    
    public function getType() : string {
        return 'Expr_Include';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;
use PhpParser\Node\Name;

class Instanceof_ extends Expr
{
    /** @var Expr Expression */
    public $expr;
    /** @var Name|Expr Class name */
    public $class;

    /**
     * Constructs an instanceof check node.
     *
     * @param Expr      $expr       Expression
     * @param Name|Expr $class      Class name
     * @param array     $attributes Additional attributes
     */
    public function __construct(Expr $expr, $class, array $attributes = []) {
        $this->attributes = $attributes;
        $this->expr = $expr;
        $this->class = $class;
    }

    public function getSubNodeNames() : array {
        return ['expr', 'class'];
    }
    
    public function getType() : string {
        return 'Expr_Instanceof';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;

class Isset_ extends Expr
{
    /** @var Expr[] Variables */
    public $vars;

    /**
     * Constructs an array node.
     *
     * @param Expr[] $vars       Variables
     * @param array  $attributes Additional attributes
     */
    public function __construct(array $vars, array $attributes = []) {
        $this->attributes = $attributes;
        $this->vars = $vars;
    }

    public function getSubNodeNames() : array {
        return ['vars'];
    }
    
    public function getType() : string {
        return 'Expr_Isset';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;

class List_ extends Expr
{
    /** @var (ArrayItem|null)[] List of items to assign to */
    public $items;

    /**
     * Constructs a list() destructuring node.
     *
     * @param (ArrayItem|null)[] $items      List of items to assign to
     * @param array              $attributes Additional attributes
     */
    public function __construct(array $items, array $attributes = []) {
        $this->attributes = $attributes;
        $this->items = $items;
    }

    public function getSubNodeNames() : array {
        return ['items'];
    }
    
    public function getType() : string {
        return 'Expr_List';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr;

use PhpParser\Node;
use PhpParser\Node\MatchArm;

class Match_ extends Node\Expr
{
    /** @var Node\Expr */
    public $cond;
    /** @var MatchArm[] */
    public $arms;

    /**
     * @param MatchArm[] $arms
     */
    public function __construct(Node\Expr $cond, array $arms = [], array $attributes = []) {
        $this->attributes = $attributes;
        $this->cond = $cond;
        $this->arms = $arms;
    }

    public function getSubNodeNames() : array {
        return ['cond', 'arms'];
    }

    public function getType() : string {
        return 'Expr_Match';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr;

use PhpParser\Node\Arg;
use PhpParser\Node\Expr;
use PhpParser\Node\Identifier;
use PhpParser\Node\VariadicPlaceholder;

class MethodCall extends CallLike
{
    /** @var Expr Variable holding object */
    public $var;
    /** @var Identifier|Expr Method name */
    public $name;
    /** @var array<Arg|VariadicPlaceholder> Arguments */
    public $args;

    /**
     * Constructs a function call node.
     *
     * @param Expr                           $var        Variable holding object
     * @param string|Identifier|Expr         $name       Method name
     * @param array<Arg|VariadicPlaceholder> $args       Arguments
     * @param array                          $attributes Additional attributes
     */
    public function __construct(Expr $var, $name, array $args = [], array $attributes = []) {
        $this->attributes = $attributes;
        $this->var = $var;
        $this->name = \is_string($name) ? new Identifier($name) : $name;
        $this->args = $args;
    }

    public function getSubNodeNames() : array {
        return ['var', 'name', 'args'];
    }
    
    public function getType() : string {
        return 'Expr_MethodCall';
    }

    public function getRawArgs(): array {
        return $this->args;
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr;

use PhpParser\Node;
use PhpParser\Node\Arg;
use PhpParser\Node\Expr;
use PhpParser\Node\VariadicPlaceholder;

class New_ extends CallLike
{
    /** @var Node\Name|Expr|Node\Stmt\Class_ Class name */
    public $class;
    /** @var array<Arg|VariadicPlaceholder> Arguments */
    public $args;

    /**
     * Constructs a function call node.
     *
     * @param Node\Name|Expr|Node\Stmt\Class_ $class      Class name (or class node for anonymous classes)
     * @param array<Arg|VariadicPlaceholder>  $args       Arguments
     * @param array                           $attributes Additional attributes
     */
    public function __construct($class, array $args = [], array $attributes = []) {
        $this->attributes = $attributes;
        $this->class = $class;
        $this->args = $args;
    }

    public function getSubNodeNames() : array {
        return ['class', 'args'];
    }
    
    public function getType() : string {
        return 'Expr_New';
    }

    public function getRawArgs(): array {
        return $this->args;
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr;

use PhpParser\Node\Arg;
use PhpParser\Node\Expr;
use PhpParser\Node\Identifier;
use PhpParser\Node\VariadicPlaceholder;

class NullsafeMethodCall extends CallLike
{
    /** @var Expr Variable holding object */
    public $var;
    /** @var Identifier|Expr Method name */
    public $name;
    /** @var array<Arg|VariadicPlaceholder> Arguments */
    public $args;

    /**
     * Constructs a nullsafe method call node.
     *
     * @param Expr                           $var        Variable holding object
     * @param string|Identifier|Expr         $name       Method name
     * @param array<Arg|VariadicPlaceholder> $args       Arguments
     * @param array                          $attributes Additional attributes
     */
    public function __construct(Expr $var, $name, array $args = [], array $attributes = []) {
        $this->attributes = $attributes;
        $this->var = $var;
        $this->name = \is_string($name) ? new Identifier($name) : $name;
        $this->args = $args;
    }

    public function getSubNodeNames() : array {
        return ['var', 'name', 'args'];
    }
    
    public function getType() : string {
        return 'Expr_NullsafeMethodCall';
    }

    public function getRawArgs(): array {
        return $this->args;
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;
use PhpParser\Node\Identifier;

class NullsafePropertyFetch extends Expr
{
    /** @var Expr Variable holding object */
    public $var;
    /** @var Identifier|Expr Property name */
    public $name;

    /**
     * Constructs a nullsafe property fetch node.
     *
     * @param Expr                   $var        Variable holding object
     * @param string|Identifier|Expr $name       Property name
     * @param array                  $attributes Additional attributes
     */
    public function __construct(Expr $var, $name, array $attributes = []) {
        $this->attributes = $attributes;
        $this->var = $var;
        $this->name = \is_string($name) ? new Identifier($name) : $name;
    }

    public function getSubNodeNames() : array {
        return ['var', 'name'];
    }
    
    public function getType() : string {
        return 'Expr_NullsafePropertyFetch';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;

class PostDec extends Expr
{
    /** @var Expr Variable */
    public $var;

    /**
     * Constructs a post decrement node.
     *
     * @param Expr  $var        Variable
     * @param array $attributes Additional attributes
     */
    public function __construct(Expr $var, array $attributes = []) {
        $this->attributes = $attributes;
        $this->var = $var;
    }

    public function getSubNodeNames() : array {
        return ['var'];
    }
    
    public function getType() : string {
        return 'Expr_PostDec';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;

class PostInc extends Expr
{
    /** @var Expr Variable */
    public $var;

    /**
     * Constructs a post increment node.
     *
     * @param Expr  $var        Variable
     * @param array $attributes Additional attributes
     */
    public function __construct(Expr $var, array $attributes = []) {
        $this->attributes = $attributes;
        $this->var = $var;
    }

    public function getSubNodeNames() : array {
        return ['var'];
    }
    
    public function getType() : string {
        return 'Expr_PostInc';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;

class PreDec extends Expr
{
    /** @var Expr Variable */
    public $var;

    /**
     * Constructs a pre decrement node.
     *
     * @param Expr  $var        Variable
     * @param array $attributes Additional attributes
     */
    public function __construct(Expr $var, array $attributes = []) {
        $this->attributes = $attributes;
        $this->var = $var;
    }

    public function getSubNodeNames() : array {
        return ['var'];
    }

    public function getType() : string {
        return 'Expr_PreDec';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;

class PreInc extends Expr
{
    /** @var Expr Variable */
    public $var;

    /**
     * Constructs a pre increment node.
     *
     * @param Expr  $var        Variable
     * @param array $attributes Additional attributes
     */
    public function __construct(Expr $var, array $attributes = []) {
        $this->attributes = $attributes;
        $this->var = $var;
    }

    public function getSubNodeNames() : array {
        return ['var'];
    }
    
    public function getType() : string {
        return 'Expr_PreInc';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;

class Print_ extends Expr
{
    /** @var Expr Expression */
    public $expr;

    /**
     * Constructs an print() node.
     *
     * @param Expr  $expr       Expression
     * @param array $attributes Additional attributes
     */
    public function __construct(Expr $expr, array $attributes = []) {
        $this->attributes = $attributes;
        $this->expr = $expr;
    }

    public function getSubNodeNames() : array {
        return ['expr'];
    }
    
    public function getType() : string {
        return 'Expr_Print';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;
use PhpParser\Node\Identifier;

class PropertyFetch extends Expr
{
    /** @var Expr Variable holding object */
    public $var;
    /** @var Identifier|Expr Property name */
    public $name;

    /**
     * Constructs a function call node.
     *
     * @param Expr                   $var        Variable holding object
     * @param string|Identifier|Expr $name       Property name
     * @param array                  $attributes Additional attributes
     */
    public function __construct(Expr $var, $name, array $attributes = []) {
        $this->attributes = $attributes;
        $this->var = $var;
        $this->name = \is_string($name) ? new Identifier($name) : $name;
    }

    public function getSubNodeNames() : array {
        return ['var', 'name'];
    }
    
    public function getType() : string {
        return 'Expr_PropertyFetch';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;

class ShellExec extends Expr
{
    /** @var array Encapsed string array */
    public $parts;

    /**
     * Constructs a shell exec (backtick) node.
     *
     * @param array $parts      Encapsed string array
     * @param array $attributes Additional attributes
     */
    public function __construct(array $parts, array $attributes = []) {
        $this->attributes = $attributes;
        $this->parts = $parts;
    }

    public function getSubNodeNames() : array {
        return ['parts'];
    }
    
    public function getType() : string {
        return 'Expr_ShellExec';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr;

use PhpParser\Node;
use PhpParser\Node\Arg;
use PhpParser\Node\Expr;
use PhpParser\Node\Identifier;
use PhpParser\Node\VariadicPlaceholder;

class StaticCall extends CallLike
{
    /** @var Node\Name|Expr Class name */
    public $class;
    /** @var Identifier|Expr Method name */
    public $name;
    /** @var array<Arg|VariadicPlaceholder> Arguments */
    public $args;

    /**
     * Constructs a static method call node.
     *
     * @param Node\Name|Expr                 $class      Class name
     * @param string|Identifier|Expr         $name       Method name
     * @param array<Arg|VariadicPlaceholder> $args       Arguments
     * @param array                          $attributes Additional attributes
     */
    public function __construct($class, $name, array $args = [], array $attributes = []) {
        $this->attributes = $attributes;
        $this->class = $class;
        $this->name = \is_string($name) ? new Identifier($name) : $name;
        $this->args = $args;
    }

    public function getSubNodeNames() : array {
        return ['class', 'name', 'args'];
    }
    
    public function getType() : string {
        return 'Expr_StaticCall';
    }

    public function getRawArgs(): array {
        return $this->args;
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;
use PhpParser\Node\Name;
use PhpParser\Node\VarLikeIdentifier;

class StaticPropertyFetch extends Expr
{
    /** @var Name|Expr Class name */
    public $class;
    /** @var VarLikeIdentifier|Expr Property name */
    public $name;

    /**
     * Constructs a static property fetch node.
     *
     * @param Name|Expr                     $class      Class name
     * @param string|VarLikeIdentifier|Expr $name       Property name
     * @param array                         $attributes Additional attributes
     */
    public function __construct($class, $name, array $attributes = []) {
        $this->attributes = $attributes;
        $this->class = $class;
        $this->name = \is_string($name) ? new VarLikeIdentifier($name) : $name;
    }

    public function getSubNodeNames() : array {
        return ['class', 'name'];
    }
    
    public function getType() : string {
        return 'Expr_StaticPropertyFetch';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;

class Ternary extends Expr
{
    /** @var Expr Condition */
    public $cond;
    /** @var null|Expr Expression for true */
    public $if;
    /** @var Expr Expression for false */
    public $else;

    /**
     * Constructs a ternary operator node.
     *
     * @param Expr      $cond       Condition
     * @param null|Expr $if         Expression for true
     * @param Expr      $else       Expression for false
     * @param array                    $attributes Additional attributes
     */
    public function __construct(Expr $cond, $if, Expr $else, array $attributes = []) {
        $this->attributes = $attributes;
        $this->cond = $cond;
        $this->if = $if;
        $this->else = $else;
    }

    public function getSubNodeNames() : array {
        return ['cond', 'if', 'else'];
    }
    
    public function getType() : string {
        return 'Expr_Ternary';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr;

use PhpParser\Node;

class Throw_ extends Node\Expr
{
    /** @var Node\Expr Expression */
    public $expr;

    /**
     * Constructs a throw expression node.
     *
     * @param Node\Expr $expr       Expression
     * @param array     $attributes Additional attributes
     */
    public function __construct(Node\Expr $expr, array $attributes = []) {
        $this->attributes = $attributes;
        $this->expr = $expr;
    }

    public function getSubNodeNames() : array {
        return ['expr'];
    }

    public function getType() : string {
        return 'Expr_Throw';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;

class UnaryMinus extends Expr
{
    /** @var Expr Expression */
    public $expr;

    /**
     * Constructs a unary minus node.
     *
     * @param Expr  $expr       Expression
     * @param array $attributes Additional attributes
     */
    public function __construct(Expr $expr, array $attributes = []) {
        $this->attributes = $attributes;
        $this->expr = $expr;
    }

    public function getSubNodeNames() : array {
        return ['expr'];
    }
    
    public function getType() : string {
        return 'Expr_UnaryMinus';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;

class UnaryPlus extends Expr
{
    /** @var Expr Expression */
    public $expr;

    /**
     * Constructs a unary plus node.
     *
     * @param Expr $expr       Expression
     * @param array               $attributes Additional attributes
     */
    public function __construct(Expr $expr, array $attributes = []) {
        $this->attributes = $attributes;
        $this->expr = $expr;
    }

    public function getSubNodeNames() : array {
        return ['expr'];
    }
    
    public function getType() : string {
        return 'Expr_UnaryPlus';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;

class Variable extends Expr
{
    /** @var string|Expr Name */
    public $name;

    /**
     * Constructs a variable node.
     *
     * @param string|Expr $name       Name
     * @param array       $attributes Additional attributes
     */
    public function __construct($name, array $attributes = []) {
        $this->attributes = $attributes;
        $this->name = $name;
    }

    public function getSubNodeNames() : array {
        return ['name'];
    }
    
    public function getType() : string {
        return 'Expr_Variable';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;

class YieldFrom extends Expr
{
    /** @var Expr Expression to yield from */
    public $expr;

    /**
     * Constructs an "yield from" node.
     *
     * @param Expr  $expr       Expression
     * @param array $attributes Additional attributes
     */
    public function __construct(Expr $expr, array $attributes = []) {
        $this->attributes = $attributes;
        $this->expr = $expr;
    }

    public function getSubNodeNames() : array {
        return ['expr'];
    }
    
    public function getType() : string {
        return 'Expr_YieldFrom';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Expr;

use PhpParser\Node\Expr;

class Yield_ extends Expr
{
    /** @var null|Expr Key expression */
    public $key;
    /** @var null|Expr Value expression */
    public $value;

    /**
     * Constructs a yield expression node.
     *
     * @param null|Expr $value      Value expression
     * @param null|Expr $key        Key expression
     * @param array     $attributes Additional attributes
     */
    public function __construct(Expr $value = null, Expr $key = null, array $attributes = []) {
        $this->attributes = $attributes;
        $this->key = $key;
        $this->value = $value;
    }

    public function getSubNodeNames() : array {
        return ['key', 'value'];
    }
    
    public function getType() : string {
        return 'Expr_Yield';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node;

use PhpParser\Node;

interface FunctionLike extends Node
{
    /**
     * Whether to return by reference
     *
     * @return bool
     */
    public function returnsByRef() : bool;

    /**
     * List of parameters
     *
     * @return Param[]
     */
    public function getParams() : array;

    /**
     * Get the declared return type or null
     *
     * @return null|Identifier|Name|ComplexType
     */
    public function getReturnType();

    /**
     * The function body
     *
     * @return Stmt[]|null
     */
    public function getStmts();

    /**
     * Get PHP attribute groups.
     *
     * @return AttributeGroup[]
     */
    public function getAttrGroups() : array;
}
<?php declare(strict_types=1);

namespace PhpParser\Node;

use PhpParser\NodeAbstract;

/**
 * Represents a non-namespaced name. Namespaced names are represented using Name nodes.
 */
class Identifier extends NodeAbstract
{
    /** @var string Identifier as string */
    public $name;

    private static $specialClassNames = [
        'self'   => true,
        'parent' => true,
        'static' => true,
    ];

    /**
     * Constructs an identifier node.
     *
     * @param string $name       Identifier as string
     * @param array  $attributes Additional attributes
     */
    public function __construct(string $name, array $attributes = []) {
        $this->attributes = $attributes;
        $this->name = $name;
    }

    public function getSubNodeNames() : array {
        return ['name'];
    }

    /**
     * Get identifier as string.
     *
     * @return string Identifier as string.
     */
    public function toString() : string {
        return $this->name;
    }

    /**
     * Get lowercased identifier as string.
     *
     * @return string Lowercased identifier as string
     */
    public function toLowerString() : string {
        return strtolower($this->name);
    }

    /**
     * Checks whether the identifier is a special class name (self, parent or static).
     *
     * @return bool Whether identifier is a special class name
     */
    public function isSpecialClassName() : bool {
        return isset(self::$specialClassNames[strtolower($this->name)]);
    }

    /**
     * Get identifier as string.
     *
     * @return string Identifier as string
     */
    public function __toString() : string {
        return $this->name;
    }
    
    public function getType() : string {
        return 'Identifier';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node;

use PhpParser\NodeAbstract;

class IntersectionType extends ComplexType
{
    /** @var (Identifier|Name)[] Types */
    public $types;

    /**
     * Constructs an intersection type.
     *
     * @param (Identifier|Name)[] $types      Types
     * @param array               $attributes Additional attributes
     */
    public function __construct(array $types, array $attributes = []) {
        $this->attributes = $attributes;
        $this->types = $types;
    }

    public function getSubNodeNames() : array {
        return ['types'];
    }

    public function getType() : string {
        return 'IntersectionType';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node;

use PhpParser\Node;
use PhpParser\NodeAbstract;

class MatchArm extends NodeAbstract
{
    /** @var null|Node\Expr[] */
    public $conds;
    /** @var Node\Expr */
    public $body;

    /**
     * @param null|Node\Expr[] $conds
     */
    public function __construct($conds, Node\Expr $body, array $attributes = []) {
        $this->conds = $conds;
        $this->body = $body;
        $this->attributes = $attributes;
    }

    public function getSubNodeNames() : array {
        return ['conds', 'body'];
    }

    public function getType() : string {
        return 'MatchArm';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node;

use PhpParser\NodeAbstract;

class Name extends NodeAbstract
{
    /**
     * @var string[] Parts of the name
     * @deprecated Use getParts() instead
     */
    public $parts;

    private static $specialClassNames = [
        'self'   => true,
        'parent' => true,
        'static' => true,
    ];

    /**
     * Constructs a name node.
     *
     * @param string|string[]|self $name       Name as string, part array or Name instance (copy ctor)
     * @param array                $attributes Additional attributes
     */
    public function __construct($name, array $attributes = []) {
        $this->attributes = $attributes;
        $this->parts = self::prepareName($name);
    }

    public function getSubNodeNames() : array {
        return ['parts'];
    }

    /**
     * Get parts of name (split by the namespace separator).
     *
     * @return string[] Parts of name
     */
    public function getParts(): array {
        return $this->parts;
    }

    /**
     * Gets the first part of the name, i.e. everything before the first namespace separator.
     *
     * @return string First part of the name
     */
    public function getFirst() : string {
        return $this->parts[0];
    }

    /**
     * Gets the last part of the name, i.e. everything after the last namespace separator.
     *
     * @return string Last part of the name
     */
    public function getLast() : string {
        return $this->parts[count($this->parts) - 1];
    }

    /**
     * Checks whether the name is unqualified. (E.g. Name)
     *
     * @return bool Whether the name is unqualified
     */
    public function isUnqualified() : bool {
        return 1 === count($this->parts);
    }

    /**
     * Checks whether the name is qualified. (E.g. Name\Name)
     *
     * @return bool Whether the name is qualified
     */
    public function isQualified() : bool {
        return 1 < count($this->parts);
    }

    /**
     * Checks whether the name is fully qualified. (E.g. \Name)
     *
     * @return bool Whether the name is fully qualified
     */
    public function isFullyQualified() : bool {
        return false;
    }

    /**
     * Checks whether the name is explicitly relative to the current namespace. (E.g. namespace\Name)
     *
     * @return bool Whether the name is relative
     */
    public function isRelative() : bool {
        return false;
    }

    /**
     * Returns a string representation of the name itself, without taking the name type into
     * account (e.g., not including a leading backslash for fully qualified names).
     *
     * @return string String representation
     */
    public function toString() : string {
        return implode('\\', $this->parts);
    }

    /**
     * Returns a string representation of the name as it would occur in code (e.g., including
     * leading backslash for fully qualified names.
     *
     * @return string String representation
     */
    public function toCodeString() : string {
        return $this->toString();
    }

    /**
     * Returns lowercased string representation of the name, without taking the name type into
     * account (e.g., no leading backslash for fully qualified names).
     *
     * @return string Lowercased string representation
     */
    public function toLowerString() : string {
        return strtolower(implode('\\', $this->parts));
    }

    /**
     * Checks whether the identifier is a special class name (self, parent or static).
     *
     * @return bool Whether identifier is a special class name
     */
    public function isSpecialClassName() : bool {
        return count($this->parts) === 1
            && isset(self::$specialClassNames[strtolower($this->parts[0])]);
    }

    /**
     * Returns a string representation of the name by imploding the namespace parts with the
     * namespace separator.
     *
     * @return string String representation
     */
    public function __toString() : string {
        return implode('\\', $this->parts);
    }

    /**
     * Gets a slice of a name (similar to array_slice).
     *
     * This method returns a new instance of the same type as the original and with the same
     * attributes.
     *
     * If the slice is empty, null is returned. The null value will be correctly handled in
     * concatenations using concat().
     *
     * Offset and length have the same meaning as in array_slice().
     *
     * @param int      $offset Offset to start the slice at (may be negative)
     * @param int|null $length Length of the slice (may be negative)
     *
     * @return static|null Sliced name
     */
    public function slice(int $offset, int $length = null) {
        $numParts = count($this->parts);

        $realOffset = $offset < 0 ? $offset + $numParts : $offset;
        if ($realOffset < 0 || $realOffset > $numParts) {
            throw new \OutOfBoundsException(sprintf('Offset %d is out of bounds', $offset));
        }

        if (null === $length) {
            $realLength = $numParts - $realOffset;
        } else {
            $realLength = $length < 0 ? $length + $numParts - $realOffset : $length;
            if ($realLength < 0 || $realLength > $numParts - $realOffset) {
                throw new \OutOfBoundsException(sprintf('Length %d is out of bounds', $length));
            }
        }

        if ($realLength === 0) {
            // Empty slice is represented as null
            return null;
        }

        return new static(array_slice($this->parts, $realOffset, $realLength), $this->attributes);
    }

    /**
     * Concatenate two names, yielding a new Name instance.
     *
     * The type of the generated instance depends on which class this method is called on, for
     * example Name\FullyQualified::concat() will yield a Name\FullyQualified instance.
     *
     * If one of the arguments is null, a new instance of the other name will be returned. If both
     * arguments are null, null will be returned. As such, writing
     *     Name::concat($namespace, $shortName)
     * where $namespace is a Name node or null will work as expected.
     *
     * @param string|string[]|self|null $name1      The first name
     * @param string|string[]|self|null $name2      The second name
     * @param array                     $attributes Attributes to assign to concatenated name
     *
     * @return static|null Concatenated name
     */
    public static function concat($name1, $name2, array $attributes = []) {
        if (null === $name1 && null === $name2) {
            return null;
        } elseif (null === $name1) {
            return new static(self::prepareName($name2), $attributes);
        } elseif (null === $name2) {
            return new static(self::prepareName($name1), $attributes);
        } else {
            return new static(
                array_merge(self::prepareName($name1), self::prepareName($name2)), $attributes
            );
        }
    }

    /**
     * Prepares a (string, array or Name node) name for use in name changing methods by converting
     * it to an array.
     *
     * @param string|string[]|self $name Name to prepare
     *
     * @return string[] Prepared name
     */
    private static function prepareName($name) : array {
        if (\is_string($name)) {
            if ('' === $name) {
                throw new \InvalidArgumentException('Name cannot be empty');
            }

            return explode('\\', $name);
        } elseif (\is_array($name)) {
            if (empty($name)) {
                throw new \InvalidArgumentException('Name cannot be empty');
            }

            return $name;
        } elseif ($name instanceof self) {
            return $name->parts;
        }

        throw new \InvalidArgumentException(
            'Expected string, array of parts or Name instance'
        );
    }

    public function getType() : string {
        return 'Name';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Name;

class FullyQualified extends \PhpParser\Node\Name
{
    /**
     * Checks whether the name is unqualified. (E.g. Name)
     *
     * @return bool Whether the name is unqualified
     */
    public function isUnqualified() : bool {
        return false;
    }

    /**
     * Checks whether the name is qualified. (E.g. Name\Name)
     *
     * @return bool Whether the name is qualified
     */
    public function isQualified() : bool {
        return false;
    }

    /**
     * Checks whether the name is fully qualified. (E.g. \Name)
     *
     * @return bool Whether the name is fully qualified
     */
    public function isFullyQualified() : bool {
        return true;
    }

    /**
     * Checks whether the name is explicitly relative to the current namespace. (E.g. namespace\Name)
     *
     * @return bool Whether the name is relative
     */
    public function isRelative() : bool {
        return false;
    }

    public function toCodeString() : string {
        return '\\' . $this->toString();
    }
    
    public function getType() : string {
        return 'Name_FullyQualified';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Name;

class Relative extends \PhpParser\Node\Name
{
    /**
     * Checks whether the name is unqualified. (E.g. Name)
     *
     * @return bool Whether the name is unqualified
     */
    public function isUnqualified() : bool {
        return false;
    }

    /**
     * Checks whether the name is qualified. (E.g. Name\Name)
     *
     * @return bool Whether the name is qualified
     */
    public function isQualified() : bool {
        return false;
    }

    /**
     * Checks whether the name is fully qualified. (E.g. \Name)
     *
     * @return bool Whether the name is fully qualified
     */
    public function isFullyQualified() : bool {
        return false;
    }

    /**
     * Checks whether the name is explicitly relative to the current namespace. (E.g. namespace\Name)
     *
     * @return bool Whether the name is relative
     */
    public function isRelative() : bool {
        return true;
    }

    public function toCodeString() : string {
        return 'namespace\\' . $this->toString();
    }
    
    public function getType() : string {
        return 'Name_Relative';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node;

class NullableType extends ComplexType
{
    /** @var Identifier|Name Type */
    public $type;

    /**
     * Constructs a nullable type (wrapping another type).
     *
     * @param string|Identifier|Name $type       Type
     * @param array                  $attributes Additional attributes
     */
    public function __construct($type, array $attributes = []) {
        $this->attributes = $attributes;
        $this->type = \is_string($type) ? new Identifier($type) : $type;
    }

    public function getSubNodeNames() : array {
        return ['type'];
    }
    
    public function getType() : string {
        return 'NullableType';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node;

use PhpParser\NodeAbstract;

class Param extends NodeAbstract
{
    /** @var null|Identifier|Name|ComplexType Type declaration */
    public $type;
    /** @var bool Whether parameter is passed by reference */
    public $byRef;
    /** @var bool Whether this is a variadic argument */
    public $variadic;
    /** @var Expr\Variable|Expr\Error Parameter variable */
    public $var;
    /** @var null|Expr Default value */
    public $default;
    /** @var int */
    public $flags;
    /** @var AttributeGroup[] PHP attribute groups */
    public $attrGroups;

    /**
     * Constructs a parameter node.
     *
     * @param Expr\Variable|Expr\Error                $var        Parameter variable
     * @param null|Expr                               $default    Default value
     * @param null|string|Identifier|Name|ComplexType $type       Type declaration
     * @param bool                                    $byRef      Whether is passed by reference
     * @param bool                                    $variadic   Whether this is a variadic argument
     * @param array                                   $attributes Additional attributes
     * @param int                                     $flags      Optional visibility flags
     * @param AttributeGroup[]                        $attrGroups PHP attribute groups
     */
    public function __construct(
        $var, Expr $default = null, $type = null,
        bool $byRef = false, bool $variadic = false,
        array $attributes = [],
        int $flags = 0,
        array $attrGroups = []
    ) {
        $this->attributes = $attributes;
        $this->type = \is_string($type) ? new Identifier($type) : $type;
        $this->byRef = $byRef;
        $this->variadic = $variadic;
        $this->var = $var;
        $this->default = $default;
        $this->flags = $flags;
        $this->attrGroups = $attrGroups;
    }

    public function getSubNodeNames() : array {
        return ['attrGroups', 'flags', 'type', 'byRef', 'variadic', 'var', 'default'];
    }

    public function getType() : string {
        return 'Param';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node;

abstract class Scalar extends Expr
{
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Scalar;

use PhpParser\Node\Scalar;

class DNumber extends Scalar
{
    /** @var float Number value */
    public $value;

    /**
     * Constructs a float number scalar node.
     *
     * @param float $value      Value of the number
     * @param array $attributes Additional attributes
     */
    public function __construct(float $value, array $attributes = []) {
        $this->attributes = $attributes;
        $this->value = $value;
    }

    public function getSubNodeNames() : array {
        return ['value'];
    }

    /**
     * @param mixed[] $attributes
     */
    public static function fromString(string $str, array $attributes = []): DNumber
    {
        $attributes['rawValue'] = $str;
        $float = self::parse($str);

        return new DNumber($float, $attributes);
    }

    /**
     * @internal
     *
     * Parses a DNUMBER token like PHP would.
     *
     * @param string $str A string number
     *
     * @return float The parsed number
     */
    public static function parse(string $str) : float {
        $str = str_replace('_', '', $str);

        // Check whether this is one of the special integer notations.
        if ('0' === $str[0]) {
            // hex
            if ('x' === $str[1] || 'X' === $str[1]) {
                return hexdec($str);
            }

            // bin
            if ('b' === $str[1] || 'B' === $str[1]) {
                return bindec($str);
            }

            // oct, but only if the string does not contain any of '.eE'.
            if (false === strpbrk($str, '.eE')) {
                // substr($str, 0, strcspn($str, '89')) cuts the string at the first invalid digit
                // (8 or 9) so that only the digits before that are used.
                return octdec(substr($str, 0, strcspn($str, '89')));
            }
        }

        // dec
        return (float) $str;
    }

    public function getType() : string {
        return 'Scalar_DNumber';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Scalar;

use PhpParser\Node\Expr;
use PhpParser\Node\Scalar;

class Encapsed extends Scalar
{
    /** @var Expr[] list of string parts */
    public $parts;

    /**
     * Constructs an encapsed string node.
     *
     * @param Expr[] $parts      Encaps list
     * @param array  $attributes Additional attributes
     */
    public function __construct(array $parts, array $attributes = []) {
        $this->attributes = $attributes;
        $this->parts = $parts;
    }

    public function getSubNodeNames() : array {
        return ['parts'];
    }
    
    public function getType() : string {
        return 'Scalar_Encapsed';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Scalar;

use PhpParser\Node\Scalar;

class EncapsedStringPart extends Scalar
{
    /** @var string String value */
    public $value;

    /**
     * Constructs a node representing a string part of an encapsed string.
     *
     * @param string $value      String value
     * @param array  $attributes Additional attributes
     */
    public function __construct(string $value, array $attributes = []) {
        $this->attributes = $attributes;
        $this->value = $value;
    }

    public function getSubNodeNames() : array {
        return ['value'];
    }
    
    public function getType() : string {
        return 'Scalar_EncapsedStringPart';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Scalar;

use PhpParser\Error;
use PhpParser\Node\Scalar;

class LNumber extends Scalar
{
    /* For use in "kind" attribute */
    const KIND_BIN = 2;
    const KIND_OCT = 8;
    const KIND_DEC = 10;
    const KIND_HEX = 16;

    /** @var int Number value */
    public $value;

    /**
     * Constructs an integer number scalar node.
     *
     * @param int   $value      Value of the number
     * @param array $attributes Additional attributes
     */
    public function __construct(int $value, array $attributes = []) {
        $this->attributes = $attributes;
        $this->value = $value;
    }

    public function getSubNodeNames() : array {
        return ['value'];
    }

    /**
     * Constructs an LNumber node from a string number literal.
     *
     * @param string $str               String number literal (decimal, octal, hex or binary)
     * @param array  $attributes        Additional attributes
     * @param bool   $allowInvalidOctal Whether to allow invalid octal numbers (PHP 5)
     *
     * @return LNumber The constructed LNumber, including kind attribute
     */
    public static function fromString(string $str, array $attributes = [], bool $allowInvalidOctal = false) : LNumber {
        $attributes['rawValue'] = $str;

        $str = str_replace('_', '', $str);

        if ('0' !== $str[0] || '0' === $str) {
            $attributes['kind'] = LNumber::KIND_DEC;
            return new LNumber((int) $str, $attributes);
        }

        if ('x' === $str[1] || 'X' === $str[1]) {
            $attributes['kind'] = LNumber::KIND_HEX;
            return new LNumber(hexdec($str), $attributes);
        }

        if ('b' === $str[1] || 'B' === $str[1]) {
            $attributes['kind'] = LNumber::KIND_BIN;
            return new LNumber(bindec($str), $attributes);
        }

        if (!$allowInvalidOctal && strpbrk($str, '89')) {
            throw new Error('Invalid numeric literal', $attributes);
        }

        // Strip optional explicit octal prefix.
        if ('o' === $str[1] || 'O' === $str[1]) {
            $str = substr($str, 2);
        }

        // use intval instead of octdec to get proper cutting behavior with malformed numbers
        $attributes['kind'] = LNumber::KIND_OCT;
        return new LNumber(intval($str, 8), $attributes);
    }

    public function getType() : string {
        return 'Scalar_LNumber';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Scalar;

use PhpParser\Node\Scalar;

abstract class MagicConst extends Scalar
{
    /**
     * Constructs a magic constant node.
     *
     * @param array $attributes Additional attributes
     */
    public function __construct(array $attributes = []) {
        $this->attributes = $attributes;
    }

    public function getSubNodeNames() : array {
        return [];
    }

    /**
     * Get name of magic constant.
     *
     * @return string Name of magic constant
     */
    abstract public function getName() : string;
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Scalar\MagicConst;

use PhpParser\Node\Scalar\MagicConst;

class Class_ extends MagicConst
{
    public function getName() : string {
        return '__CLASS__';
    }
    
    public function getType() : string {
        return 'Scalar_MagicConst_Class';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Scalar\MagicConst;

use PhpParser\Node\Scalar\MagicConst;

class Dir extends MagicConst
{
    public function getName() : string {
        return '__DIR__';
    }
    
    public function getType() : string {
        return 'Scalar_MagicConst_Dir';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Scalar\MagicConst;

use PhpParser\Node\Scalar\MagicConst;

class File extends MagicConst
{
    public function getName() : string {
        return '__FILE__';
    }
    
    public function getType() : string {
        return 'Scalar_MagicConst_File';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Scalar\MagicConst;

use PhpParser\Node\Scalar\MagicConst;

class Function_ extends MagicConst
{
    public function getName() : string {
        return '__FUNCTION__';
    }
    
    public function getType() : string {
        return 'Scalar_MagicConst_Function';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Scalar\MagicConst;

use PhpParser\Node\Scalar\MagicConst;

class Line extends MagicConst
{
    public function getName() : string {
        return '__LINE__';
    }
    
    public function getType() : string {
        return 'Scalar_MagicConst_Line';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Scalar\MagicConst;

use PhpParser\Node\Scalar\MagicConst;

class Method extends MagicConst
{
    public function getName() : string {
        return '__METHOD__';
    }
    
    public function getType() : string {
        return 'Scalar_MagicConst_Method';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Scalar\MagicConst;

use PhpParser\Node\Scalar\MagicConst;

class Namespace_ extends MagicConst
{
    public function getName() : string {
        return '__NAMESPACE__';
    }
    
    public function getType() : string {
        return 'Scalar_MagicConst_Namespace';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Scalar\MagicConst;

use PhpParser\Node\Scalar\MagicConst;

class Trait_ extends MagicConst
{
    public function getName() : string {
        return '__TRAIT__';
    }
    
    public function getType() : string {
        return 'Scalar_MagicConst_Trait';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Scalar;

use PhpParser\Error;
use PhpParser\Node\Scalar;

class String_ extends Scalar
{
    /* For use in "kind" attribute */
    const KIND_SINGLE_QUOTED = 1;
    const KIND_DOUBLE_QUOTED = 2;
    const KIND_HEREDOC = 3;
    const KIND_NOWDOC = 4;

    /** @var string String value */
    public $value;

    protected static $replacements = [
        '\\' => '\\',
        '$'  =>  '$',
        'n'  => "\n",
        'r'  => "\r",
        't'  => "\t",
        'f'  => "\f",
        'v'  => "\v",
        'e'  => "\x1B",
    ];

    /**
     * Constructs a string scalar node.
     *
     * @param string $value      Value of the string
     * @param array  $attributes Additional attributes
     */
    public function __construct(string $value, array $attributes = []) {
        $this->attributes = $attributes;
        $this->value = $value;
    }

    public function getSubNodeNames() : array {
        return ['value'];
    }

    /**
     * @param bool $parseUnicodeEscape Whether to parse PHP 7 \u escapes
     */
    public static function fromString(string $str, array $attributes = [], bool $parseUnicodeEscape = true): self
    {
        $attributes['kind'] = ($str[0] === "'" || ($str[1] === "'" && ($str[0] === 'b' || $str[0] === 'B')))
            ? Scalar\String_::KIND_SINGLE_QUOTED
            : Scalar\String_::KIND_DOUBLE_QUOTED;

        $attributes['rawValue'] = $str;

        $string = self::parse($str, $parseUnicodeEscape);

        return new self($string, $attributes);
    }

    /**
     * @internal
     *
     * Parses a string token.
     *
     * @param string $str String token content
     * @param bool $parseUnicodeEscape Whether to parse PHP 7 \u escapes
     *
     * @return string The parsed string
     */
    public static function parse(string $str, bool $parseUnicodeEscape = true) : string {
        $bLength = 0;
        if ('b' === $str[0] || 'B' === $str[0]) {
            $bLength = 1;
        }

        if ('\'' === $str[$bLength]) {
            return str_replace(
                ['\\\\', '\\\''],
                ['\\', '\''],
                substr($str, $bLength + 1, -1)
            );
        } else {
            return self::parseEscapeSequences(
                substr($str, $bLength + 1, -1), '"', $parseUnicodeEscape
            );
        }
    }

    /**
     * @internal
     *
     * Parses escape sequences in strings (all string types apart from single quoted).
     *
     * @param string      $str   String without quotes
     * @param null|string $quote Quote type
     * @param bool $parseUnicodeEscape Whether to parse PHP 7 \u escapes
     *
     * @return string String with escape sequences parsed
     */
    public static function parseEscapeSequences(string $str, $quote, bool $parseUnicodeEscape = true) : string {
        if (null !== $quote) {
            $str = str_replace('\\' . $quote, $quote, $str);
        }

        $extra = '';
        if ($parseUnicodeEscape) {
            $extra = '|u\{([0-9a-fA-F]+)\}';
        }

        return preg_replace_callback(
            '~\\\\([\\\\$nrtfve]|[xX][0-9a-fA-F]{1,2}|[0-7]{1,3}' . $extra . ')~',
            function($matches) {
                $str = $matches[1];

                if (isset(self::$replacements[$str])) {
                    return self::$replacements[$str];
                } elseif ('x' === $str[0] || 'X' === $str[0]) {
                    return chr(hexdec(substr($str, 1)));
                } elseif ('u' === $str[0]) {
                    return self::codePointToUtf8(hexdec($matches[2]));
                } else {
                    return chr(octdec($str));
                }
            },
            $str
        );
    }

    /**
     * Converts a Unicode code point to its UTF-8 encoded representation.
     *
     * @param int $num Code point
     *
     * @return string UTF-8 representation of code point
     */
    private static function codePointToUtf8(int $num) : string {
        if ($num <= 0x7F) {
            return chr($num);
        }
        if ($num <= 0x7FF) {
            return chr(($num>>6) + 0xC0) . chr(($num&0x3F) + 0x80);
        }
        if ($num <= 0xFFFF) {
            return chr(($num>>12) + 0xE0) . chr((($num>>6)&0x3F) + 0x80) . chr(($num&0x3F) + 0x80);
        }
        if ($num <= 0x1FFFFF) {
            return chr(($num>>18) + 0xF0) . chr((($num>>12)&0x3F) + 0x80)
                 . chr((($num>>6)&0x3F) + 0x80) . chr(($num&0x3F) + 0x80);
        }
        throw new Error('Invalid UTF-8 codepoint escape sequence: Codepoint too large');
    }

    public function getType() : string {
        return 'Scalar_String';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node;

use PhpParser\NodeAbstract;

abstract class Stmt extends NodeAbstract
{
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Stmt;

use PhpParser\Node;

class Break_ extends Node\Stmt
{
    /** @var null|Node\Expr Number of loops to break */
    public $num;

    /**
     * Constructs a break node.
     *
     * @param null|Node\Expr $num        Number of loops to break
     * @param array          $attributes Additional attributes
     */
    public function __construct(Node\Expr $num = null, array $attributes = []) {
        $this->attributes = $attributes;
        $this->num = $num;
    }

    public function getSubNodeNames() : array {
        return ['num'];
    }
    
    public function getType() : string {
        return 'Stmt_Break';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Stmt;

use PhpParser\Node;

class Case_ extends Node\Stmt
{
    /** @var null|Node\Expr Condition (null for default) */
    public $cond;
    /** @var Node\Stmt[] Statements */
    public $stmts;

    /**
     * Constructs a case node.
     *
     * @param null|Node\Expr $cond       Condition (null for default)
     * @param Node\Stmt[]    $stmts      Statements
     * @param array          $attributes Additional attributes
     */
    public function __construct($cond, array $stmts = [], array $attributes = []) {
        $this->attributes = $attributes;
        $this->cond = $cond;
        $this->stmts = $stmts;
    }

    public function getSubNodeNames() : array {
        return ['cond', 'stmts'];
    }
    
    public function getType() : string {
        return 'Stmt_Case';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Stmt;

use PhpParser\Node;
use PhpParser\Node\Expr;

class Catch_ extends Node\Stmt
{
    /** @var Node\Name[] Types of exceptions to catch */
    public $types;
    /** @var Expr\Variable|null Variable for exception */
    public $var;
    /** @var Node\Stmt[] Statements */
    public $stmts;

    /**
     * Constructs a catch node.
     *
     * @param Node\Name[]           $types      Types of exceptions to catch
     * @param Expr\Variable|null    $var        Variable for exception
     * @param Node\Stmt[]           $stmts      Statements
     * @param array                 $attributes Additional attributes
     */
    public function __construct(
        array $types, Expr\Variable $var = null, array $stmts = [], array $attributes = []
    ) {
        $this->attributes = $attributes;
        $this->types = $types;
        $this->var = $var;
        $this->stmts = $stmts;
    }

    public function getSubNodeNames() : array {
        return ['types', 'var', 'stmts'];
    }

    public function getType() : string {
        return 'Stmt_Catch';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Stmt;

use PhpParser\Node;

class ClassConst extends Node\Stmt
{
    /** @var int Modifiers */
    public $flags;
    /** @var Node\Const_[] Constant declarations */
    public $consts;
    /** @var Node\AttributeGroup[] PHP attribute groups */
    public $attrGroups;
    /** @var Node\Identifier|Node\Name|Node\ComplexType|null Type declaration */
    public $type;

    /**
     * Constructs a class const list node.
     *
     * @param Node\Const_[]                                          $consts     Constant declarations
     * @param int                                                    $flags      Modifiers
     * @param array                                                  $attributes Additional attributes
     * @param Node\AttributeGroup[]                                  $attrGroups PHP attribute groups
     * @param null|string|Node\Identifier|Node\Name|Node\ComplexType $type       Type declaration
     */
    public function __construct(
        array $consts,
        int $flags = 0,
        array $attributes = [],
        array $attrGroups = [],
        $type = null
    ) {
        $this->attributes = $attributes;
        $this->flags = $flags;
        $this->consts = $consts;
        $this->attrGroups = $attrGroups;
        $this->type = \is_string($type) ? new Node\Identifier($type) : $type;
    }

    public function getSubNodeNames() : array {
        return ['attrGroups', 'flags', 'type', 'consts'];
    }

    /**
     * Whether constant is explicitly or implicitly public.
     *
     * @return bool
     */
    public function isPublic() : bool {
        return ($this->flags & Class_::MODIFIER_PUBLIC) !== 0
            || ($this->flags & Class_::VISIBILITY_MODIFIER_MASK) === 0;
    }

    /**
     * Whether constant is protected.
     *
     * @return bool
     */
    public function isProtected() : bool {
        return (bool) ($this->flags & Class_::MODIFIER_PROTECTED);
    }

    /**
     * Whether constant is private.
     *
     * @return bool
     */
    public function isPrivate() : bool {
        return (bool) ($this->flags & Class_::MODIFIER_PRIVATE);
    }

    /**
     * Whether constant is final.
     *
     * @return bool
     */
    public function isFinal() : bool {
        return (bool) ($this->flags & Class_::MODIFIER_FINAL);
    }

    public function getType() : string {
        return 'Stmt_ClassConst';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Stmt;

use PhpParser\Node;

abstract class ClassLike extends Node\Stmt
{
    /** @var Node\Identifier|null Name */
    public $name;
    /** @var Node\Stmt[] Statements */
    public $stmts;
    /** @var Node\AttributeGroup[] PHP attribute groups */
    public $attrGroups;

    /** @var Node\Name|null Namespaced name (if using NameResolver) */
    public $namespacedName;

    /**
     * @return TraitUse[]
     */
    public function getTraitUses() : array {
        $traitUses = [];
        foreach ($this->stmts as $stmt) {
            if ($stmt instanceof TraitUse) {
                $traitUses[] = $stmt;
            }
        }
        return $traitUses;
    }

    /**
     * @return ClassConst[]
     */
    public function getConstants() : array {
        $constants = [];
        foreach ($this->stmts as $stmt) {
            if ($stmt instanceof ClassConst) {
                $constants[] = $stmt;
            }
        }
        return $constants;
    }

    /**
     * @return Property[]
     */
    public function getProperties() : array {
        $properties = [];
        foreach ($this->stmts as $stmt) {
            if ($stmt instanceof Property) {
                $properties[] = $stmt;
            }
        }
        return $properties;
    }

    /**
     * Gets property with the given name defined directly in this class/interface/trait.
     *
     * @param string $name Name of the property
     *
     * @return Property|null Property node or null if the property does not exist
     */
    public function getProperty(string $name) {
        foreach ($this->stmts as $stmt) {
            if ($stmt instanceof Property) {
                foreach ($stmt->props as $prop) {
                    if ($prop instanceof PropertyProperty && $name === $prop->name->toString()) {
                        return $stmt;
                    }
                }
            }
        }
        return null;
    }

    /**
     * Gets all methods defined directly in this class/interface/trait
     *
     * @return ClassMethod[]
     */
    public function getMethods() : array {
        $methods = [];
        foreach ($this->stmts as $stmt) {
            if ($stmt instanceof ClassMethod) {
                $methods[] = $stmt;
            }
        }
        return $methods;
    }

    /**
     * Gets method with the given name defined directly in this class/interface/trait.
     *
     * @param string $name Name of the method (compared case-insensitively)
     *
     * @return ClassMethod|null Method node or null if the method does not exist
     */
    public function getMethod(string $name) {
        $lowerName = strtolower($name);
        foreach ($this->stmts as $stmt) {
            if ($stmt instanceof ClassMethod && $lowerName === $stmt->name->toLowerString()) {
                return $stmt;
            }
        }
        return null;
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Stmt;

use PhpParser\Node;
use PhpParser\Node\FunctionLike;

class ClassMethod extends Node\Stmt implements FunctionLike
{
    /** @var int Flags */
    public $flags;
    /** @var bool Whether to return by reference */
    public $byRef;
    /** @var Node\Identifier Name */
    public $name;
    /** @var Node\Param[] Parameters */
    public $params;
    /** @var null|Node\Identifier|Node\Name|Node\ComplexType Return type */
    public $returnType;
    /** @var Node\Stmt[]|null Statements */
    public $stmts;
    /** @var Node\AttributeGroup[] PHP attribute groups */
    public $attrGroups;

    private static $magicNames = [
        '__construct'   => true,
        '__destruct'    => true,
        '__call'        => true,
        '__callstatic'  => true,
        '__get'         => true,
        '__set'         => true,
        '__isset'       => true,
        '__unset'       => true,
        '__sleep'       => true,
        '__wakeup'      => true,
        '__tostring'    => true,
        '__set_state'   => true,
        '__clone'       => true,
        '__invoke'      => true,
        '__debuginfo'   => true,
        '__serialize'   => true,
        '__unserialize' => true,
    ];

    /**
     * Constructs a class method node.
     *
     * @param string|Node\Identifier $name Name
     * @param array $subNodes   Array of the following optional subnodes:
     *                          'flags       => MODIFIER_PUBLIC: Flags
     *                          'byRef'      => false          : Whether to return by reference
     *                          'params'     => array()        : Parameters
     *                          'returnType' => null           : Return type
     *                          'stmts'      => array()        : Statements
     *                          'attrGroups' => array()        : PHP attribute groups
     * @param array $attributes Additional attributes
     */
    public function __construct($name, array $subNodes = [], array $attributes = []) {
        $this->attributes = $attributes;
        $this->flags = $subNodes['flags'] ?? $subNodes['type'] ?? 0;
        $this->byRef = $subNodes['byRef'] ?? false;
        $this->name = \is_string($name) ? new Node\Identifier($name) : $name;
        $this->params = $subNodes['params'] ?? [];
        $returnType = $subNodes['returnType'] ?? null;
        $this->returnType = \is_string($returnType) ? new Node\Identifier($returnType) : $returnType;
        $this->stmts = array_key_exists('stmts', $subNodes) ? $subNodes['stmts'] : [];
        $this->attrGroups = $subNodes['attrGroups'] ?? [];
    }

    public function getSubNodeNames() : array {
        return ['attrGroups', 'flags', 'byRef', 'name', 'params', 'returnType', 'stmts'];
    }

    public function returnsByRef() : bool {
        return $this->byRef;
    }

    public function getParams() : array {
        return $this->params;
    }

    public function getReturnType() {
        return $this->returnType;
    }

    public function getStmts() {
        return $this->stmts;
    }

    public function getAttrGroups() : array {
        return $this->attrGroups;
    }

    /**
     * Whether the method is explicitly or implicitly public.
     *
     * @return bool
     */
    public function isPublic() : bool {
        return ($this->flags & Class_::MODIFIER_PUBLIC) !== 0
            || ($this->flags & Class_::VISIBILITY_MODIFIER_MASK) === 0;
    }

    /**
     * Whether the method is protected.
     *
     * @return bool
     */
    public function isProtected() : bool {
        return (bool) ($this->flags & Class_::MODIFIER_PROTECTED);
    }

    /**
     * Whether the method is private.
     *
     * @return bool
     */
    public function isPrivate() : bool {
        return (bool) ($this->flags & Class_::MODIFIER_PRIVATE);
    }

    /**
     * Whether the method is abstract.
     *
     * @return bool
     */
    public function isAbstract() : bool {
        return (bool) ($this->flags & Class_::MODIFIER_ABSTRACT);
    }

    /**
     * Whether the method is final.
     *
     * @return bool
     */
    public function isFinal() : bool {
        return (bool) ($this->flags & Class_::MODIFIER_FINAL);
    }

    /**
     * Whether the method is static.
     *
     * @return bool
     */
    public function isStatic() : bool {
        return (bool) ($this->flags & Class_::MODIFIER_STATIC);
    }

    /**
     * Whether the method is magic.
     *
     * @return bool
     */
    public function isMagic() : bool {
        return isset(self::$magicNames[$this->name->toLowerString()]);
    }

    public function getType() : string {
        return 'Stmt_ClassMethod';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Stmt;

use PhpParser\Error;
use PhpParser\Node;

class Class_ extends ClassLike
{
    const MODIFIER_PUBLIC    =  1;
    const MODIFIER_PROTECTED =  2;
    const MODIFIER_PRIVATE   =  4;
    const MODIFIER_STATIC    =  8;
    const MODIFIER_ABSTRACT  = 16;
    const MODIFIER_FINAL     = 32;
    const MODIFIER_READONLY  = 64;

    const VISIBILITY_MODIFIER_MASK = 7; // 1 | 2 | 4

    /** @var int Type */
    public $flags;
    /** @var null|Node\Name Name of extended class */
    public $extends;
    /** @var Node\Name[] Names of implemented interfaces */
    public $implements;

    /**
     * Constructs a class node.
     *
     * @param string|Node\Identifier|null $name Name
     * @param array       $subNodes   Array of the following optional subnodes:
     *                                'flags'       => 0      : Flags
     *                                'extends'     => null   : Name of extended class
     *                                'implements'  => array(): Names of implemented interfaces
     *                                'stmts'       => array(): Statements
     *                                'attrGroups'  => array(): PHP attribute groups
     * @param array       $attributes Additional attributes
     */
    public function __construct($name, array $subNodes = [], array $attributes = []) {
        $this->attributes = $attributes;
        $this->flags = $subNodes['flags'] ?? $subNodes['type'] ?? 0;
        $this->name = \is_string($name) ? new Node\Identifier($name) : $name;
        $this->extends = $subNodes['extends'] ?? null;
        $this->implements = $subNodes['implements'] ?? [];
        $this->stmts = $subNodes['stmts'] ?? [];
        $this->attrGroups = $subNodes['attrGroups'] ?? [];
    }

    public function getSubNodeNames() : array {
        return ['attrGroups', 'flags', 'name', 'extends', 'implements', 'stmts'];
    }

    /**
     * Whether the class is explicitly abstract.
     *
     * @return bool
     */
    public function isAbstract() : bool {
        return (bool) ($this->flags & self::MODIFIER_ABSTRACT);
    }

    /**
     * Whether the class is final.
     *
     * @return bool
     */
    public function isFinal() : bool {
        return (bool) ($this->flags & self::MODIFIER_FINAL);
    }

    public function isReadonly() : bool {
        return (bool) ($this->flags & self::MODIFIER_READONLY);
    }

    /**
     * Whether the class is anonymous.
     *
     * @return bool
     */
    public function isAnonymous() : bool {
        return null === $this->name;
    }

    /**
     * @internal
     */
    public static function verifyClassModifier($a, $b) {
        if ($a & self::MODIFIER_ABSTRACT && $b & self::MODIFIER_ABSTRACT) {
            throw new Error('Multiple abstract modifiers are not allowed');
        }

        if ($a & self::MODIFIER_FINAL && $b & self::MODIFIER_FINAL) {
            throw new Error('Multiple final modifiers are not allowed');
        }

        if ($a & self::MODIFIER_READONLY && $b & self::MODIFIER_READONLY) {
            throw new Error('Multiple readonly modifiers are not allowed');
        }

        if ($a & 48 && $b & 48) {
            throw new Error('Cannot use the final modifier on an abstract class');
        }
    }

    /**
     * @internal
     */
    public static function verifyModifier($a, $b) {
        if ($a & self::VISIBILITY_MODIFIER_MASK && $b & self::VISIBILITY_MODIFIER_MASK) {
            throw new Error('Multiple access type modifiers are not allowed');
        }

        if ($a & self::MODIFIER_ABSTRACT && $b & self::MODIFIER_ABSTRACT) {
            throw new Error('Multiple abstract modifiers are not allowed');
        }

        if ($a & self::MODIFIER_STATIC && $b & self::MODIFIER_STATIC) {
            throw new Error('Multiple static modifiers are not allowed');
        }

        if ($a & self::MODIFIER_FINAL && $b & self::MODIFIER_FINAL) {
            throw new Error('Multiple final modifiers are not allowed');
        }

        if ($a & self::MODIFIER_READONLY && $b & self::MODIFIER_READONLY) {
            throw new Error('Multiple readonly modifiers are not allowed');
        }

        if ($a & 48 && $b & 48) {
            throw new Error('Cannot use the final modifier on an abstract class member');
        }
    }

    public function getType() : string {
        return 'Stmt_Class';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Stmt;

use PhpParser\Node;

class Const_ extends Node\Stmt
{
    /** @var Node\Const_[] Constant declarations */
    public $consts;

    /**
     * Constructs a const list node.
     *
     * @param Node\Const_[] $consts     Constant declarations
     * @param array         $attributes Additional attributes
     */
    public function __construct(array $consts, array $attributes = []) {
        $this->attributes = $attributes;
        $this->consts = $consts;
    }

    public function getSubNodeNames() : array {
        return ['consts'];
    }
    
    public function getType() : string {
        return 'Stmt_Const';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Stmt;

use PhpParser\Node;

class Continue_ extends Node\Stmt
{
    /** @var null|Node\Expr Number of loops to continue */
    public $num;

    /**
     * Constructs a continue node.
     *
     * @param null|Node\Expr $num        Number of loops to continue
     * @param array          $attributes Additional attributes
     */
    public function __construct(Node\Expr $num = null, array $attributes = []) {
        $this->attributes = $attributes;
        $this->num = $num;
    }

    public function getSubNodeNames() : array {
        return ['num'];
    }
    
    public function getType() : string {
        return 'Stmt_Continue';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Stmt;

use PhpParser\Node;

class DeclareDeclare extends Node\Stmt
{
    /** @var Node\Identifier Key */
    public $key;
    /** @var Node\Expr Value */
    public $value;

    /**
     * Constructs a declare key=>value pair node.
     *
     * @param string|Node\Identifier $key        Key
     * @param Node\Expr              $value      Value
     * @param array                  $attributes Additional attributes
     */
    public function __construct($key, Node\Expr $value, array $attributes = []) {
        $this->attributes = $attributes;
        $this->key = \is_string($key) ? new Node\Identifier($key) : $key;
        $this->value = $value;
    }

    public function getSubNodeNames() : array {
        return ['key', 'value'];
    }
    
    public function getType() : string {
        return 'Stmt_DeclareDeclare';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Stmt;

use PhpParser\Node;

class Declare_ extends Node\Stmt
{
    /** @var DeclareDeclare[] List of declares */
    public $declares;
    /** @var Node\Stmt[]|null Statements */
    public $stmts;

    /**
     * Constructs a declare node.
     *
     * @param DeclareDeclare[] $declares   List of declares
     * @param Node\Stmt[]|null $stmts      Statements
     * @param array            $attributes Additional attributes
     */
    public function __construct(array $declares, array $stmts = null, array $attributes = []) {
        $this->attributes = $attributes;
        $this->declares = $declares;
        $this->stmts = $stmts;
    }

    public function getSubNodeNames() : array {
        return ['declares', 'stmts'];
    }
    
    public function getType() : string {
        return 'Stmt_Declare';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Stmt;

use PhpParser\Node;

class Do_ extends Node\Stmt
{
    /** @var Node\Stmt[] Statements */
    public $stmts;
    /** @var Node\Expr Condition */
    public $cond;

    /**
     * Constructs a do while node.
     *
     * @param Node\Expr   $cond       Condition
     * @param Node\Stmt[] $stmts      Statements
     * @param array       $attributes Additional attributes
     */
    public function __construct(Node\Expr $cond, array $stmts = [], array $attributes = []) {
        $this->attributes = $attributes;
        $this->cond = $cond;
        $this->stmts = $stmts;
    }

    public function getSubNodeNames() : array {
        return ['stmts', 'cond'];
    }
    
    public function getType() : string {
        return 'Stmt_Do';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Stmt;

use PhpParser\Node;

class Echo_ extends Node\Stmt
{
    /** @var Node\Expr[] Expressions */
    public $exprs;

    /**
     * Constructs an echo node.
     *
     * @param Node\Expr[] $exprs      Expressions
     * @param array       $attributes Additional attributes
     */
    public function __construct(array $exprs, array $attributes = []) {
        $this->attributes = $attributes;
        $this->exprs = $exprs;
    }

    public function getSubNodeNames() : array {
        return ['exprs'];
    }
    
    public function getType() : string {
        return 'Stmt_Echo';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Stmt;

use PhpParser\Node;

class ElseIf_ extends Node\Stmt
{
    /** @var Node\Expr Condition */
    public $cond;
    /** @var Node\Stmt[] Statements */
    public $stmts;

    /**
     * Constructs an elseif node.
     *
     * @param Node\Expr   $cond       Condition
     * @param Node\Stmt[] $stmts      Statements
     * @param array       $attributes Additional attributes
     */
    public function __construct(Node\Expr $cond, array $stmts = [], array $attributes = []) {
        $this->attributes = $attributes;
        $this->cond = $cond;
        $this->stmts = $stmts;
    }

    public function getSubNodeNames() : array {
        return ['cond', 'stmts'];
    }
    
    public function getType() : string {
        return 'Stmt_ElseIf';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Stmt;

use PhpParser\Node;

class Else_ extends Node\Stmt
{
    /** @var Node\Stmt[] Statements */
    public $stmts;

    /**
     * Constructs an else node.
     *
     * @param Node\Stmt[] $stmts      Statements
     * @param array       $attributes Additional attributes
     */
    public function __construct(array $stmts = [], array $attributes = []) {
        $this->attributes = $attributes;
        $this->stmts = $stmts;
    }

    public function getSubNodeNames() : array {
        return ['stmts'];
    }
    
    public function getType() : string {
        return 'Stmt_Else';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Stmt;

use PhpParser\Node;
use PhpParser\Node\AttributeGroup;

class EnumCase extends Node\Stmt
{
    /** @var Node\Identifier Enum case name */
    public $name;
    /** @var Node\Expr|null Enum case expression */
    public $expr;
    /** @var Node\AttributeGroup[] PHP attribute groups */
    public $attrGroups;

    /**
     * @param string|Node\Identifier    $name       Enum case name
     * @param Node\Expr|null            $expr       Enum case expression
     * @param AttributeGroup[]          $attrGroups PHP attribute groups
     * @param array                     $attributes Additional attributes
     */
    public function __construct($name, Node\Expr $expr = null, array $attrGroups = [], array $attributes = []) {
        parent::__construct($attributes);
        $this->name = \is_string($name) ? new Node\Identifier($name) : $name;
        $this->expr = $expr;
        $this->attrGroups = $attrGroups;
    }

    public function getSubNodeNames() : array {
        return ['attrGroups', 'name', 'expr'];
    }

    public function getType() : string {
        return 'Stmt_EnumCase';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Stmt;

use PhpParser\Node;

class Enum_ extends ClassLike
{
    /** @var null|Node\Identifier Scalar Type */
    public $scalarType;
    /** @var Node\Name[] Names of implemented interfaces */
    public $implements;

    /**
     * @param string|Node\Identifier|null $name       Name
     * @param array                       $subNodes   Array of the following optional subnodes:
     *                                                'scalarType'  => null    : Scalar type
     *                                                'implements'  => array() : Names of implemented interfaces
     *                                                'stmts'       => array() : Statements
     *                                                'attrGroups'  => array() : PHP attribute groups
     * @param array                       $attributes Additional attributes
     */
    public function __construct($name, array $subNodes = [], array $attributes = []) {
        $this->name = \is_string($name) ? new Node\Identifier($name) : $name;
        $this->scalarType = $subNodes['scalarType'] ?? null;
        $this->implements = $subNodes['implements'] ?? [];
        $this->stmts = $subNodes['stmts'] ?? [];
        $this->attrGroups = $subNodes['attrGroups'] ?? [];

        parent::__construct($attributes);
    }

    public function getSubNodeNames() : array {
        return ['attrGroups', 'name', 'scalarType', 'implements', 'stmts'];
    }

    public function getType() : string {
        return 'Stmt_Enum';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Stmt;

use PhpParser\Node;

/**
 * Represents statements of type "expr;"
 */
class Expression extends Node\Stmt
{
    /** @var Node\Expr Expression */
    public $expr;

    /**
     * Constructs an expression statement.
     *
     * @param Node\Expr $expr       Expression
     * @param array     $attributes Additional attributes
     */
    public function __construct(Node\Expr $expr, array $attributes = []) {
        $this->attributes = $attributes;
        $this->expr = $expr;
    }

    public function getSubNodeNames() : array {
        return ['expr'];
    }
    
    public function getType() : string {
        return 'Stmt_Expression';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Stmt;

use PhpParser\Node;

class Finally_ extends Node\Stmt
{
    /** @var Node\Stmt[] Statements */
    public $stmts;

    /**
     * Constructs a finally node.
     *
     * @param Node\Stmt[] $stmts      Statements
     * @param array       $attributes Additional attributes
     */
    public function __construct(array $stmts = [], array $attributes = []) {
        $this->attributes = $attributes;
        $this->stmts = $stmts;
    }

    public function getSubNodeNames() : array {
        return ['stmts'];
    }
    
    public function getType() : string {
        return 'Stmt_Finally';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Stmt;

use PhpParser\Node;

class For_ extends Node\Stmt
{
    /** @var Node\Expr[] Init expressions */
    public $init;
    /** @var Node\Expr[] Loop conditions */
    public $cond;
    /** @var Node\Expr[] Loop expressions */
    public $loop;
    /** @var Node\Stmt[] Statements */
    public $stmts;

    /**
     * Constructs a for loop node.
     *
     * @param array $subNodes   Array of the following optional subnodes:
     *                          'init'  => array(): Init expressions
     *                          'cond'  => array(): Loop conditions
     *                          'loop'  => array(): Loop expressions
     *                          'stmts' => array(): Statements
     * @param array $attributes Additional attributes
     */
    public function __construct(array $subNodes = [], array $attributes = []) {
        $this->attributes = $attributes;
        $this->init = $subNodes['init'] ?? [];
        $this->cond = $subNodes['cond'] ?? [];
        $this->loop = $subNodes['loop'] ?? [];
        $this->stmts = $subNodes['stmts'] ?? [];
    }

    public function getSubNodeNames() : array {
        return ['init', 'cond', 'loop', 'stmts'];
    }
    
    public function getType() : string {
        return 'Stmt_For';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Stmt;

use PhpParser\Node;

class Foreach_ extends Node\Stmt
{
    /** @var Node\Expr Expression to iterate */
    public $expr;
    /** @var null|Node\Expr Variable to assign key to */
    public $keyVar;
    /** @var bool Whether to assign value by reference */
    public $byRef;
    /** @var Node\Expr Variable to assign value to */
    public $valueVar;
    /** @var Node\Stmt[] Statements */
    public $stmts;

    /**
     * Constructs a foreach node.
     *
     * @param Node\Expr $expr       Expression to iterate
     * @param Node\Expr $valueVar   Variable to assign value to
     * @param array     $subNodes   Array of the following optional subnodes:
     *                              'keyVar' => null   : Variable to assign key to
     *                              'byRef'  => false  : Whether to assign value by reference
     *                              'stmts'  => array(): Statements
     * @param array     $attributes Additional attributes
     */
    public function __construct(Node\Expr $expr, Node\Expr $valueVar, array $subNodes = [], array $attributes = []) {
        $this->attributes = $attributes;
        $this->expr = $expr;
        $this->keyVar = $subNodes['keyVar'] ?? null;
        $this->byRef = $subNodes['byRef'] ?? false;
        $this->valueVar = $valueVar;
        $this->stmts = $subNodes['stmts'] ?? [];
    }

    public function getSubNodeNames() : array {
        return ['expr', 'keyVar', 'byRef', 'valueVar', 'stmts'];
    }
    
    public function getType() : string {
        return 'Stmt_Foreach';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Stmt;

use PhpParser\Node;
use PhpParser\Node\FunctionLike;

class Function_ extends Node\Stmt implements FunctionLike
{
    /** @var bool Whether function returns by reference */
    public $byRef;
    /** @var Node\Identifier Name */
    public $name;
    /** @var Node\Param[] Parameters */
    public $params;
    /** @var null|Node\Identifier|Node\Name|Node\ComplexType Return type */
    public $returnType;
    /** @var Node\Stmt[] Statements */
    public $stmts;
    /** @var Node\AttributeGroup[] PHP attribute groups */
    public $attrGroups;

    /** @var Node\Name|null Namespaced name (if using NameResolver) */
    public $namespacedName;

    /**
     * Constructs a function node.
     *
     * @param string|Node\Identifier $name Name
     * @param array  $subNodes   Array of the following optional subnodes:
     *                           'byRef'      => false  : Whether to return by reference
     *                           'params'     => array(): Parameters
     *                           'returnType' => null   : Return type
     *                           'stmts'      => array(): Statements
     *                           'attrGroups' => array(): PHP attribute groups
     * @param array  $attributes Additional attributes
     */
    public function __construct($name, array $subNodes = [], array $attributes = []) {
        $this->attributes = $attributes;
        $this->byRef = $subNodes['byRef'] ?? false;
        $this->name = \is_string($name) ? new Node\Identifier($name) : $name;
        $this->params = $subNodes['params'] ?? [];
        $returnType = $subNodes['returnType'] ?? null;
        $this->returnType = \is_string($returnType) ? new Node\Identifier($returnType) : $returnType;
        $this->stmts = $subNodes['stmts'] ?? [];
        $this->attrGroups = $subNodes['attrGroups'] ?? [];
    }

    public function getSubNodeNames() : array {
        return ['attrGroups', 'byRef', 'name', 'params', 'returnType', 'stmts'];
    }

    public function returnsByRef() : bool {
        return $this->byRef;
    }

    public function getParams() : array {
        return $this->params;
    }

    public function getReturnType() {
        return $this->returnType;
    }

    public function getAttrGroups() : array {
        return $this->attrGroups;
    }

    /** @return Node\Stmt[] */
    public function getStmts() : array {
        return $this->stmts;
    }

    public function getType() : string {
        return 'Stmt_Function';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Stmt;

use PhpParser\Node;

class Global_ extends Node\Stmt
{
    /** @var Node\Expr[] Variables */
    public $vars;

    /**
     * Constructs a global variables list node.
     *
     * @param Node\Expr[] $vars       Variables to unset
     * @param array       $attributes Additional attributes
     */
    public function __construct(array $vars, array $attributes = []) {
        $this->attributes = $attributes;
        $this->vars = $vars;
    }

    public function getSubNodeNames() : array {
        return ['vars'];
    }
    
    public function getType() : string {
        return 'Stmt_Global';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Stmt;

use PhpParser\Node\Identifier;
use PhpParser\Node\Stmt;

class Goto_ extends Stmt
{
    /** @var Identifier Name of label to jump to */
    public $name;

    /**
     * Constructs a goto node.
     *
     * @param string|Identifier $name       Name of label to jump to
     * @param array             $attributes Additional attributes
     */
    public function __construct($name, array $attributes = []) {
        $this->attributes = $attributes;
        $this->name = \is_string($name) ? new Identifier($name) : $name;
    }

    public function getSubNodeNames() : array {
        return ['name'];
    }
    
    public function getType() : string {
        return 'Stmt_Goto';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Stmt;

use PhpParser\Node\Name;
use PhpParser\Node\Stmt;

class GroupUse extends Stmt
{
    /** @var int Type of group use */
    public $type;
    /** @var Name Prefix for uses */
    public $prefix;
    /** @var UseUse[] Uses */
    public $uses;

    /**
     * Constructs a group use node.
     *
     * @param Name     $prefix     Prefix for uses
     * @param UseUse[] $uses       Uses
     * @param int      $type       Type of group use
     * @param array    $attributes Additional attributes
     */
    public function __construct(Name $prefix, array $uses, int $type = Use_::TYPE_NORMAL, array $attributes = []) {
        $this->attributes = $attributes;
        $this->type = $type;
        $this->prefix = $prefix;
        $this->uses = $uses;
    }

    public function getSubNodeNames() : array {
        return ['type', 'prefix', 'uses'];
    }
    
    public function getType() : string {
        return 'Stmt_GroupUse';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Stmt;

use PhpParser\Node\Stmt;

class HaltCompiler extends Stmt
{
    /** @var string Remaining text after halt compiler statement. */
    public $remaining;

    /**
     * Constructs a __halt_compiler node.
     *
     * @param string $remaining  Remaining text after halt compiler statement.
     * @param array  $attributes Additional attributes
     */
    public function __construct(string $remaining, array $attributes = []) {
        $this->attributes = $attributes;
        $this->remaining = $remaining;
    }

    public function getSubNodeNames() : array {
        return ['remaining'];
    }
    
    public function getType() : string {
        return 'Stmt_HaltCompiler';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Stmt;

use PhpParser\Node;

class If_ extends Node\Stmt
{
    /** @var Node\Expr Condition expression */
    public $cond;
    /** @var Node\Stmt[] Statements */
    public $stmts;
    /** @var ElseIf_[] Elseif clauses */
    public $elseifs;
    /** @var null|Else_ Else clause */
    public $else;

    /**
     * Constructs an if node.
     *
     * @param Node\Expr $cond       Condition
     * @param array     $subNodes   Array of the following optional subnodes:
     *                              'stmts'   => array(): Statements
     *                              'elseifs' => array(): Elseif clauses
     *                              'else'    => null   : Else clause
     * @param array     $attributes Additional attributes
     */
    public function __construct(Node\Expr $cond, array $subNodes = [], array $attributes = []) {
        $this->attributes = $attributes;
        $this->cond = $cond;
        $this->stmts = $subNodes['stmts'] ?? [];
        $this->elseifs = $subNodes['elseifs'] ?? [];
        $this->else = $subNodes['else'] ?? null;
    }

    public function getSubNodeNames() : array {
        return ['cond', 'stmts', 'elseifs', 'else'];
    }
    
    public function getType() : string {
        return 'Stmt_If';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Stmt;

use PhpParser\Node\Stmt;

class InlineHTML extends Stmt
{
    /** @var string String */
    public $value;

    /**
     * Constructs an inline HTML node.
     *
     * @param string $value      String
     * @param array  $attributes Additional attributes
     */
    public function __construct(string $value, array $attributes = []) {
        $this->attributes = $attributes;
        $this->value = $value;
    }

    public function getSubNodeNames() : array {
        return ['value'];
    }
    
    public function getType() : string {
        return 'Stmt_InlineHTML';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Stmt;

use PhpParser\Node;

class Interface_ extends ClassLike
{
    /** @var Node\Name[] Extended interfaces */
    public $extends;

    /**
     * Constructs a class node.
     *
     * @param string|Node\Identifier $name Name
     * @param array  $subNodes   Array of the following optional subnodes:
     *                           'extends'    => array(): Name of extended interfaces
     *                           'stmts'      => array(): Statements
     *                           'attrGroups' => array(): PHP attribute groups
     * @param array  $attributes Additional attributes
     */
    public function __construct($name, array $subNodes = [], array $attributes = []) {
        $this->attributes = $attributes;
        $this->name = \is_string($name) ? new Node\Identifier($name) : $name;
        $this->extends = $subNodes['extends'] ?? [];
        $this->stmts = $subNodes['stmts'] ?? [];
        $this->attrGroups = $subNodes['attrGroups'] ?? [];
    }

    public function getSubNodeNames() : array {
        return ['attrGroups', 'name', 'extends', 'stmts'];
    }

    public function getType() : string {
        return 'Stmt_Interface';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Stmt;

use PhpParser\Node\Identifier;
use PhpParser\Node\Stmt;

class Label extends Stmt
{
    /** @var Identifier Name */
    public $name;

    /**
     * Constructs a label node.
     *
     * @param string|Identifier $name       Name
     * @param array             $attributes Additional attributes
     */
    public function __construct($name, array $attributes = []) {
        $this->attributes = $attributes;
        $this->name = \is_string($name) ? new Identifier($name) : $name;
    }

    public function getSubNodeNames() : array {
        return ['name'];
    }
    
    public function getType() : string {
        return 'Stmt_Label';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Stmt;

use PhpParser\Node;

class Namespace_ extends Node\Stmt
{
    /* For use in the "kind" attribute */
    const KIND_SEMICOLON = 1;
    const KIND_BRACED = 2;

    /** @var null|Node\Name Name */
    public $name;
    /** @var Node\Stmt[] Statements */
    public $stmts;

    /**
     * Constructs a namespace node.
     *
     * @param null|Node\Name   $name       Name
     * @param null|Node\Stmt[] $stmts      Statements
     * @param array            $attributes Additional attributes
     */
    public function __construct(Node\Name $name = null, $stmts = [], array $attributes = []) {
        $this->attributes = $attributes;
        $this->name = $name;
        $this->stmts = $stmts;
    }

    public function getSubNodeNames() : array {
        return ['name', 'stmts'];
    }
    
    public function getType() : string {
        return 'Stmt_Namespace';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Stmt;

use PhpParser\Node;

/** Nop/empty statement (;). */
class Nop extends Node\Stmt
{
    public function getSubNodeNames() : array {
        return [];
    }
    
    public function getType() : string {
        return 'Stmt_Nop';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Stmt;

use PhpParser\Node;
use PhpParser\Node\ComplexType;
use PhpParser\Node\Identifier;
use PhpParser\Node\Name;

class Property extends Node\Stmt
{
    /** @var int Modifiers */
    public $flags;
    /** @var PropertyProperty[] Properties */
    public $props;
    /** @var null|Identifier|Name|ComplexType Type declaration */
    public $type;
    /** @var Node\AttributeGroup[] PHP attribute groups */
    public $attrGroups;

    /**
     * Constructs a class property list node.
     *
     * @param int                                     $flags      Modifiers
     * @param PropertyProperty[]                      $props      Properties
     * @param array                                   $attributes Additional attributes
     * @param null|string|Identifier|Name|ComplexType $type       Type declaration
     * @param Node\AttributeGroup[]                   $attrGroups PHP attribute groups
     */
    public function __construct(int $flags, array $props, array $attributes = [], $type = null, array $attrGroups = []) {
        $this->attributes = $attributes;
        $this->flags = $flags;
        $this->props = $props;
        $this->type = \is_string($type) ? new Identifier($type) : $type;
        $this->attrGroups = $attrGroups;
    }

    public function getSubNodeNames() : array {
        return ['attrGroups', 'flags', 'type', 'props'];
    }

    /**
     * Whether the property is explicitly or implicitly public.
     *
     * @return bool
     */
    public function isPublic() : bool {
        return ($this->flags & Class_::MODIFIER_PUBLIC) !== 0
            || ($this->flags & Class_::VISIBILITY_MODIFIER_MASK) === 0;
    }

    /**
     * Whether the property is protected.
     *
     * @return bool
     */
    public function isProtected() : bool {
        return (bool) ($this->flags & Class_::MODIFIER_PROTECTED);
    }

    /**
     * Whether the property is private.
     *
     * @return bool
     */
    public function isPrivate() : bool {
        return (bool) ($this->flags & Class_::MODIFIER_PRIVATE);
    }

    /**
     * Whether the property is static.
     *
     * @return bool
     */
    public function isStatic() : bool {
        return (bool) ($this->flags & Class_::MODIFIER_STATIC);
    }

    /**
     * Whether the property is readonly.
     *
     * @return bool
     */
    public function isReadonly() : bool {
        return (bool) ($this->flags & Class_::MODIFIER_READONLY);
    }

    public function getType() : string {
        return 'Stmt_Property';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Stmt;

use PhpParser\Node;

class PropertyProperty extends Node\Stmt
{
    /** @var Node\VarLikeIdentifier Name */
    public $name;
    /** @var null|Node\Expr Default */
    public $default;

    /**
     * Constructs a class property node.
     *
     * @param string|Node\VarLikeIdentifier $name       Name
     * @param null|Node\Expr                $default    Default value
     * @param array                         $attributes Additional attributes
     */
    public function __construct($name, Node\Expr $default = null, array $attributes = []) {
        $this->attributes = $attributes;
        $this->name = \is_string($name) ? new Node\VarLikeIdentifier($name) : $name;
        $this->default = $default;
    }

    public function getSubNodeNames() : array {
        return ['name', 'default'];
    }
    
    public function getType() : string {
        return 'Stmt_PropertyProperty';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Stmt;

use PhpParser\Node;

class Return_ extends Node\Stmt
{
    /** @var null|Node\Expr Expression */
    public $expr;

    /**
     * Constructs a return node.
     *
     * @param null|Node\Expr $expr       Expression
     * @param array          $attributes Additional attributes
     */
    public function __construct(Node\Expr $expr = null, array $attributes = []) {
        $this->attributes = $attributes;
        $this->expr = $expr;
    }

    public function getSubNodeNames() : array {
        return ['expr'];
    }
    
    public function getType() : string {
        return 'Stmt_Return';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Stmt;

use PhpParser\Node;
use PhpParser\Node\Expr;

class StaticVar extends Node\Stmt
{
    /** @var Expr\Variable Variable */
    public $var;
    /** @var null|Node\Expr Default value */
    public $default;

    /**
     * Constructs a static variable node.
     *
     * @param Expr\Variable  $var         Name
     * @param null|Node\Expr $default    Default value
     * @param array          $attributes Additional attributes
     */
    public function __construct(
        Expr\Variable $var, Node\Expr $default = null, array $attributes = []
    ) {
        $this->attributes = $attributes;
        $this->var = $var;
        $this->default = $default;
    }

    public function getSubNodeNames() : array {
        return ['var', 'default'];
    }
    
    public function getType() : string {
        return 'Stmt_StaticVar';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Stmt;

use PhpParser\Node\Stmt;

class Static_ extends Stmt
{
    /** @var StaticVar[] Variable definitions */
    public $vars;

    /**
     * Constructs a static variables list node.
     *
     * @param StaticVar[] $vars       Variable definitions
     * @param array       $attributes Additional attributes
     */
    public function __construct(array $vars, array $attributes = []) {
        $this->attributes = $attributes;
        $this->vars = $vars;
    }

    public function getSubNodeNames() : array {
        return ['vars'];
    }
    
    public function getType() : string {
        return 'Stmt_Static';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Stmt;

use PhpParser\Node;

class Switch_ extends Node\Stmt
{
    /** @var Node\Expr Condition */
    public $cond;
    /** @var Case_[] Case list */
    public $cases;

    /**
     * Constructs a case node.
     *
     * @param Node\Expr $cond       Condition
     * @param Case_[]   $cases      Case list
     * @param array     $attributes Additional attributes
     */
    public function __construct(Node\Expr $cond, array $cases, array $attributes = []) {
        $this->attributes = $attributes;
        $this->cond = $cond;
        $this->cases = $cases;
    }

    public function getSubNodeNames() : array {
        return ['cond', 'cases'];
    }
    
    public function getType() : string {
        return 'Stmt_Switch';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Stmt;

use PhpParser\Node;

class Throw_ extends Node\Stmt
{
    /** @var Node\Expr Expression */
    public $expr;

    /**
     * Constructs a legacy throw statement node.
     *
     * @param Node\Expr $expr       Expression
     * @param array     $attributes Additional attributes
     */
    public function __construct(Node\Expr $expr, array $attributes = []) {
        $this->attributes = $attributes;
        $this->expr = $expr;
    }

    public function getSubNodeNames() : array {
        return ['expr'];
    }
    
    public function getType() : string {
        return 'Stmt_Throw';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Stmt;

use PhpParser\Node;

class TraitUse extends Node\Stmt
{
    /** @var Node\Name[] Traits */
    public $traits;
    /** @var TraitUseAdaptation[] Adaptations */
    public $adaptations;

    /**
     * Constructs a trait use node.
     *
     * @param Node\Name[]          $traits      Traits
     * @param TraitUseAdaptation[] $adaptations Adaptations
     * @param array                $attributes  Additional attributes
     */
    public function __construct(array $traits, array $adaptations = [], array $attributes = []) {
        $this->attributes = $attributes;
        $this->traits = $traits;
        $this->adaptations = $adaptations;
    }

    public function getSubNodeNames() : array {
        return ['traits', 'adaptations'];
    }
    
    public function getType() : string {
        return 'Stmt_TraitUse';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Stmt;

use PhpParser\Node;

abstract class TraitUseAdaptation extends Node\Stmt
{
    /** @var Node\Name|null Trait name */
    public $trait;
    /** @var Node\Identifier Method name */
    public $method;
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Stmt\TraitUseAdaptation;

use PhpParser\Node;

class Alias extends Node\Stmt\TraitUseAdaptation
{
    /** @var null|int New modifier */
    public $newModifier;
    /** @var null|Node\Identifier New name */
    public $newName;

    /**
     * Constructs a trait use precedence adaptation node.
     *
     * @param null|Node\Name              $trait       Trait name
     * @param string|Node\Identifier      $method      Method name
     * @param null|int                    $newModifier New modifier
     * @param null|string|Node\Identifier $newName     New name
     * @param array                       $attributes  Additional attributes
     */
    public function __construct($trait, $method, $newModifier, $newName, array $attributes = []) {
        $this->attributes = $attributes;
        $this->trait = $trait;
        $this->method = \is_string($method) ? new Node\Identifier($method) : $method;
        $this->newModifier = $newModifier;
        $this->newName = \is_string($newName) ? new Node\Identifier($newName) : $newName;
    }

    public function getSubNodeNames() : array {
        return ['trait', 'method', 'newModifier', 'newName'];
    }
    
    public function getType() : string {
        return 'Stmt_TraitUseAdaptation_Alias';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Stmt\TraitUseAdaptation;

use PhpParser\Node;

class Precedence extends Node\Stmt\TraitUseAdaptation
{
    /** @var Node\Name[] Overwritten traits */
    public $insteadof;

    /**
     * Constructs a trait use precedence adaptation node.
     *
     * @param Node\Name              $trait       Trait name
     * @param string|Node\Identifier $method      Method name
     * @param Node\Name[]            $insteadof   Overwritten traits
     * @param array                  $attributes  Additional attributes
     */
    public function __construct(Node\Name $trait, $method, array $insteadof, array $attributes = []) {
        $this->attributes = $attributes;
        $this->trait = $trait;
        $this->method = \is_string($method) ? new Node\Identifier($method) : $method;
        $this->insteadof = $insteadof;
    }

    public function getSubNodeNames() : array {
        return ['trait', 'method', 'insteadof'];
    }
    
    public function getType() : string {
        return 'Stmt_TraitUseAdaptation_Precedence';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Stmt;

use PhpParser\Node;

class Trait_ extends ClassLike
{
    /**
     * Constructs a trait node.
     *
     * @param string|Node\Identifier $name Name
     * @param array  $subNodes   Array of the following optional subnodes:
     *                           'stmts'      => array(): Statements
     *                           'attrGroups' => array(): PHP attribute groups
     * @param array  $attributes Additional attributes
     */
    public function __construct($name, array $subNodes = [], array $attributes = []) {
        $this->attributes = $attributes;
        $this->name = \is_string($name) ? new Node\Identifier($name) : $name;
        $this->stmts = $subNodes['stmts'] ?? [];
        $this->attrGroups = $subNodes['attrGroups'] ?? [];
    }

    public function getSubNodeNames() : array {
        return ['attrGroups', 'name', 'stmts'];
    }

    public function getType() : string {
        return 'Stmt_Trait';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Stmt;

use PhpParser\Node;

class TryCatch extends Node\Stmt
{
    /** @var Node\Stmt[] Statements */
    public $stmts;
    /** @var Catch_[] Catches */
    public $catches;
    /** @var null|Finally_ Optional finally node */
    public $finally;

    /**
     * Constructs a try catch node.
     *
     * @param Node\Stmt[]   $stmts      Statements
     * @param Catch_[]      $catches    Catches
     * @param null|Finally_ $finally    Optional finally node
     * @param array         $attributes Additional attributes
     */
    public function __construct(array $stmts, array $catches, Finally_ $finally = null, array $attributes = []) {
        $this->attributes = $attributes;
        $this->stmts = $stmts;
        $this->catches = $catches;
        $this->finally = $finally;
    }

    public function getSubNodeNames() : array {
        return ['stmts', 'catches', 'finally'];
    }

    public function getType() : string {
        return 'Stmt_TryCatch';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Stmt;

use PhpParser\Node;

class Unset_ extends Node\Stmt
{
    /** @var Node\Expr[] Variables to unset */
    public $vars;

    /**
     * Constructs an unset node.
     *
     * @param Node\Expr[] $vars       Variables to unset
     * @param array       $attributes Additional attributes
     */
    public function __construct(array $vars, array $attributes = []) {
        $this->attributes = $attributes;
        $this->vars = $vars;
    }

    public function getSubNodeNames() : array {
        return ['vars'];
    }
    
    public function getType() : string {
        return 'Stmt_Unset';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Stmt;

use PhpParser\Node;
use PhpParser\Node\Identifier;

class UseUse extends Node\Stmt
{
    /** @var int One of the Stmt\Use_::TYPE_* constants. Will only differ from TYPE_UNKNOWN for mixed group uses */
    public $type;
    /** @var Node\Name Namespace, class, function or constant to alias */
    public $name;
    /** @var Identifier|null Alias */
    public $alias;

    /**
     * Constructs an alias (use) node.
     *
     * @param Node\Name              $name       Namespace/Class to alias
     * @param null|string|Identifier $alias      Alias
     * @param int                    $type       Type of the use element (for mixed group use only)
     * @param array                  $attributes Additional attributes
     */
    public function __construct(Node\Name $name, $alias = null, int $type = Use_::TYPE_UNKNOWN, array $attributes = []) {
        $this->attributes = $attributes;
        $this->type = $type;
        $this->name = $name;
        $this->alias = \is_string($alias) ? new Identifier($alias) : $alias;
    }

    public function getSubNodeNames() : array {
        return ['type', 'name', 'alias'];
    }

    /**
     * Get alias. If not explicitly given this is the last component of the used name.
     *
     * @return Identifier
     */
    public function getAlias() : Identifier {
        if (null !== $this->alias) {
            return $this->alias;
        }

        return new Identifier($this->name->getLast());
    }
    
    public function getType() : string {
        return 'Stmt_UseUse';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Stmt;

use PhpParser\Node\Stmt;

class Use_ extends Stmt
{
    /**
     * Unknown type. Both Stmt\Use_ / Stmt\GroupUse and Stmt\UseUse have a $type property, one of them will always be
     * TYPE_UNKNOWN while the other has one of the three other possible types. For normal use statements the type on the
     * Stmt\UseUse is unknown. It's only the other way around for mixed group use declarations.
     */
    const TYPE_UNKNOWN = 0;
    /** Class or namespace import */
    const TYPE_NORMAL = 1;
    /** Function import */
    const TYPE_FUNCTION = 2;
    /** Constant import */
    const TYPE_CONSTANT = 3;

    /** @var int Type of alias */
    public $type;
    /** @var UseUse[] Aliases */
    public $uses;

    /**
     * Constructs an alias (use) list node.
     *
     * @param UseUse[] $uses       Aliases
     * @param int      $type       Type of alias
     * @param array    $attributes Additional attributes
     */
    public function __construct(array $uses, int $type = self::TYPE_NORMAL, array $attributes = []) {
        $this->attributes = $attributes;
        $this->type = $type;
        $this->uses = $uses;
    }

    public function getSubNodeNames() : array {
        return ['type', 'uses'];
    }
    
    public function getType() : string {
        return 'Stmt_Use';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node\Stmt;

use PhpParser\Node;

class While_ extends Node\Stmt
{
    /** @var Node\Expr Condition */
    public $cond;
    /** @var Node\Stmt[] Statements */
    public $stmts;

    /**
     * Constructs a while node.
     *
     * @param Node\Expr   $cond       Condition
     * @param Node\Stmt[] $stmts      Statements
     * @param array       $attributes Additional attributes
     */
    public function __construct(Node\Expr $cond, array $stmts = [], array $attributes = []) {
        $this->attributes = $attributes;
        $this->cond = $cond;
        $this->stmts = $stmts;
    }

    public function getSubNodeNames() : array {
        return ['cond', 'stmts'];
    }
    
    public function getType() : string {
        return 'Stmt_While';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node;

class UnionType extends ComplexType
{
    /** @var (Identifier|Name|IntersectionType)[] Types */
    public $types;

    /**
     * Constructs a union type.
     *
     * @param (Identifier|Name|IntersectionType)[] $types      Types
     * @param array               $attributes Additional attributes
     */
    public function __construct(array $types, array $attributes = []) {
        $this->attributes = $attributes;
        $this->types = $types;
    }

    public function getSubNodeNames() : array {
        return ['types'];
    }
    
    public function getType() : string {
        return 'UnionType';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node;

/**
 * Represents a name that is written in source code with a leading dollar,
 * but is not a proper variable. The leading dollar is not stored as part of the name.
 *
 * Examples: Names in property declarations are formatted as variables. Names in static property
 * lookups are also formatted as variables.
 */
class VarLikeIdentifier extends Identifier
{
    public function getType() : string {
        return 'VarLikeIdentifier';
    }
}
<?php declare(strict_types=1);

namespace PhpParser\Node;

use PhpParser\NodeAbstract;

/**
 * Represents the "..." in "foo(...)" of the first-class callable syntax.
 */
class VariadicPlaceholder extends NodeAbstract {
    /**
     * Create a variadic argument placeholder (first-class callable syntax).
     *
     * @param array $attributes Additional attributes
     */
    public function __construct(array $attributes = []) {
        $this->attributes = $attributes;
    }

    public function getType(): string {
        return 'VariadicPlaceholder';
    }

    public function getSubNodeNames(): array {
        return [];
    }
}<?php declare(strict_types=1);

namespace PhpParser;

abstract class NodeAbstract implements Node, \JsonSerializable
{
    protected $attributes;

    /**
     * Creates a Node.
     *
     * @param array $attributes Array of attributes
     */
    public function __construct(array $attributes = []) {
        $this->attributes = $attributes;
    }

    /**
     * Gets line the node started in (alias of getStartLine).
     *
     * @return int Start line (or -1 if not available)
     */
    public function getLine() : int {
        return $this->attributes['startLine'] ?? -1;
    }

    /**
     * Gets line the node started in.
     *
     * Requires the 'startLine' attribute to be enabled in the lexer (enabled by default).
     *
     * @return int Start line (or -1 if not available)
     */
    public function getStartLine() : int {
        return $this->attributes['startLine'] ?? -1;
    }

    /**
     * Gets the line the node ended in.
     *
     * Requires the 'endLine' attribute to be enabled in the lexer (enabled by default).
     *
     * @return int End line (or -1 if not available)
     */
    public function getEndLine() : int {
        return $this->attributes['endLine'] ?? -1;
    }

    /**
     * Gets the token offset of the first token that is part of this node.
     *
     * The offset is an index into the array returned by Lexer::getTokens().
     *
     * Requires the 'startTokenPos' attribute to be enabled in the lexer (DISABLED by default).
     *
     * @return int Token start position (or -1 if not available)
     */
    public function getStartTokenPos() : int {
        return $this->attributes['startTokenPos'] ?? -1;
    }

    /**
     * Gets the token offset of the last token that is part of this node.
     *
     * The offset is an index into the array returned by Lexer::getTokens().
     *
     * Requires the 'endTokenPos' attribute to be enabled in the lexer (DISABLED by default).
     *
     * @return int Token end position (or -1 if not available)
     */
    public function getEndTokenPos() : int {
        return $this->attributes['endTokenPos'] ?? -1;
    }

    /**
     * Gets the file offset of the first character that is part of this node.
     *
     * Requires the 'startFilePos' attribute to be enabled in the lexer (DISABLED by default).
     *
     * @return int File start position (or -1 if not available)
     */
    public function getStartFilePos() : int {
        return $this->attributes['startFilePos'] ?? -1;
    }

    /**
     * Gets the file offset of the last character that is part of this node.
     *
     * Requires the 'endFilePos' attribute to be enabled in the lexer (DISABLED by default).
     *
     * @return int File end position (or -1 if not available)
     */
    public function getEndFilePos() : int {
        return $this->attributes['endFilePos'] ?? -1;
    }

    /**
     * Gets all comments directly preceding this node.
     *
     * The comments are also available through the "comments" attribute.
     *
     * @return Comment[]
     */
    public function getComments() : array {
        return $this->attributes['comments'] ?? [];
    }

    /**
     * Gets the doc comment of the node.
     *
     * @return null|Comment\Doc Doc comment object or null
     */
    public function getDocComment() {
        $comments = $this->getComments();
        for ($i = count($comments) - 1; $i >= 0; $i--) {
            $comment = $comments[$i];
            if ($comment instanceof Comment\Doc) {
                return $comment;
            }
        }

        return null;
    }

    /**
     * Sets the doc comment of the node.
     *
     * This will either replace an existing doc comment or add it to the comments array.
     *
     * @param Comment\Doc $docComment Doc comment to set
     */
    public function setDocComment(Comment\Doc $docComment) {
        $comments = $this->getComments();
        for ($i = count($comments) - 1; $i >= 0; $i--) {
            if ($comments[$i] instanceof Comment\Doc) {
                // Replace existing doc comment.
                $comments[$i] = $docComment;
                $this->setAttribute('comments', $comments);
                return;
            }
        }

        // Append new doc comment.
        $comments[] = $docComment;
        $this->setAttribute('comments', $comments);
    }

    public function setAttribute(string $key, $value) {
        $this->attributes[$key] = $value;
    }

    public function hasAttribute(string $key) : bool {
        return array_key_exists($key, $this->attributes);
    }

    public function getAttribute(string $key, $default = null) {
        if (array_key_exists($key, $this->attributes)) {
            return $this->attributes[$key];
        }

        return $default;
    }

    public function getAttributes() : array {
        return $this->attributes;
    }

    public function setAttributes(array $attributes) {
        $this->attributes = $attributes;
    }

    /**
     * @return array
     */
    public function jsonSerialize() : array {
        return ['nodeType' => $this->getType()] + get_object_vars($this);
    }
}
<?php declare(strict_types=1);

namespace PhpParser;

use PhpParser\Node\Expr\Include_;
use PhpParser\Node\Stmt\Class_;
use PhpParser\Node\Stmt\GroupUse;
use PhpParser\Node\Stmt\Use_;
use PhpParser\Node\Stmt\UseUse;

class NodeDumper
{
    private $dumpComments;
    private $dumpPositions;
    private $code;

    /**
     * Constructs a NodeDumper.
     *
     * Supported options:
     *  * bool dumpComments: Whether comments should be dumped.
     *  * bool dumpPositions: Whether line/offset information should be dumped. To dump offset
     *                        information, the code needs to be passed to dump().
     *
     * @param array $options Options (see description)
     */
    public function __construct(array $options = []) {
        $this->dumpComments = !empty($options['dumpComments']);
        $this->dumpPositions = !empty($options['dumpPositions']);
    }

    /**
     * Dumps a node or array.
     *
     * @param array|Node  $node Node or array to dump
     * @param string|null $code Code corresponding to dumped AST. This only needs to be passed if
     *                          the dumpPositions option is enabled and the dumping of node offsets
     *                          is desired.
     *
     * @return string Dumped value
     */
    public function dump($node, string $code = null) : string {
        $this->code = $code;
        return $this->dumpRecursive($node);
    }

    protected function dumpRecursive($node) {
        if ($node instanceof Node) {
            $r = $node->getType();
            if ($this->dumpPositions && null !== $p = $this->dumpPosition($node)) {
                $r .= $p;
            }
            $r .= '(';

            foreach ($node->getSubNodeNames() as $key) {
                $r .= "\n    " . $key . ': ';

                $value = $node->$key;
                if (null === $value) {
                    $r .= 'null';
                } elseif (false === $value) {
                    $r .= 'false';
                } elseif (true === $value) {
                    $r .= 'true';
                } elseif (is_scalar($value)) {
                    if ('flags' === $key || 'newModifier' === $key) {
                        $r .= $this->dumpFlags($value);
                    } elseif ('type' === $key && $node instanceof Include_) {
                        $r .= $this->dumpIncludeType($value);
                    } elseif ('type' === $key
                            && ($node instanceof Use_ || $node instanceof UseUse || $node instanceof GroupUse)) {
                        $r .= $this->dumpUseType($value);
                    } else {
                        $r .= $value;
                    }
                } else {
                    $r .= str_replace("\n", "\n    ", $this->dumpRecursive($value));
                }
            }

            if ($this->dumpComments && $comments = $node->getComments()) {
                $r .= "\n    comments: " . str_replace("\n", "\n    ", $this->dumpRecursive($comments));
            }
        } elseif (is_array($node)) {
            $r = 'array(';

            foreach ($node as $key => $value) {
                $r .= "\n    " . $key . ': ';

                if (null === $value) {
                    $r .= 'null';
                } elseif (false === $value) {
                    $r .= 'false';
                } elseif (true === $value) {
                    $r .= 'true';
                } elseif (is_scalar($value)) {
                    $r .= $value;
                } else {
                    $r .= str_replace("\n", "\n    ", $this->dumpRecursive($value));
                }
            }
        } elseif ($node instanceof Comment) {
            return $node->getReformattedText();
        } else {
            throw new \InvalidArgumentException('Can only dump nodes and arrays.');
        }

        return $r . "\n)";
    }

    protected function dumpFlags($flags) {
        $strs = [];
        if ($flags & Class_::MODIFIER_PUBLIC) {
            $strs[] = 'MODIFIER_PUBLIC';
        }
        if ($flags & Class_::MODIFIER_PROTECTED) {
            $strs[] = 'MODIFIER_PROTECTED';
        }
        if ($flags & Class_::MODIFIER_PRIVATE) {
            $strs[] = 'MODIFIER_PRIVATE';
        }
        if ($flags & Class_::MODIFIER_ABSTRACT) {
            $strs[] = 'MODIFIER_ABSTRACT';
        }
        if ($flags & Class_::MODIFIER_STATIC) {
            $strs[] = 'MODIFIER_STATIC';
        }
        if ($flags & Class_::MODIFIER_FINAL) {
            $strs[] = 'MODIFIER_FINAL';
        }
        if ($flags & Class_::MODIFIER_READONLY) {
            $strs[] = 'MODIFIER_READONLY';
        }

        if ($strs) {
            return implode(' | ', $strs) . ' (' . $flags . ')';
        } else {
            return $flags;
        }
    }

    protected function dumpIncludeType($type) {
        $map = [
            Include_::TYPE_INCLUDE      => 'TYPE_INCLUDE',
            Include_::TYPE_INCLUDE_ONCE => 'TYPE_INCLUDE_ONCE',
            Include_::TYPE_REQUIRE      => 'TYPE_REQUIRE',
            Include_::TYPE_REQUIRE_ONCE => 'TYPE_REQUIRE_ONCE',
        ];

        if (!isset($map[$type])) {
            return $type;
        }
        return $map[$type] . ' (' . $type . ')';
    }

    protected function dumpUseType($type) {
        $map = [
            Use_::TYPE_UNKNOWN  => 'TYPE_UNKNOWN',
            Use_::TYPE_NORMAL   => 'TYPE_NORMAL',
            Use_::TYPE_FUNCTION => 'TYPE_FUNCTION',
            Use_::TYPE_CONSTANT => 'TYPE_CONSTANT',
        ];

        if (!isset($map[$type])) {
            return $type;
        }
        return $map[$type] . ' (' . $type . ')';
    }

    /**
     * Dump node position, if possible.
     *
     * @param Node $node Node for which to dump position
     *
     * @return string|null Dump of position, or null if position information not available
     */
    protected function dumpPosition(Node $node) {
        if (!$node->hasAttribute('startLine') || !$node->hasAttribute('endLine')) {
            return null;
        }

        $start = $node->getStartLine();
        $end = $node->getEndLine();
        if ($node->hasAttribute('startFilePos') && $node->hasAttribute('endFilePos')
            && null !== $this->code
        ) {
            $start .= ':' . $this->toColumn($this->code, $node->getStartFilePos());
            $end .= ':' . $this->toColumn($this->code, $node->getEndFilePos());
        }
        return "[$start - $end]";
    }

    // Copied from Error class
    private function toColumn($code, $pos) {
        if ($pos > strlen($code)) {
            throw new \RuntimeException('Invalid position information');
        }

        $lineStartPos = strrpos($code, "\n", $pos - strlen($code));
        if (false === $lineStartPos) {
            $lineStartPos = -1;
        }

        return $pos - $lineStartPos;
    }
}
<?php declare(strict_types=1);

namespace PhpParser;

use PhpParser\NodeVisitor\FindingVisitor;
use PhpParser\NodeVisitor\FirstFindingVisitor;

class NodeFinder
{
    /**
     * Find all nodes satisfying a filter callback.
     *
     * @param Node|Node[] $nodes  Single node or array of nodes to search in
     * @param callable    $filter Filter callback: function(Node $node) : bool
     *
     * @return Node[] Found nodes satisfying the filter callback
     */
    public function find($nodes, callable $filter) : array {
        if (!is_array($nodes)) {
            $nodes = [$nodes];
        }

        $visitor = new FindingVisitor($filter);

        $traverser = new NodeTraverser;
        $traverser->addVisitor($visitor);
        $traverser->traverse($nodes);

        return $visitor->getFoundNodes();
    }

    /**
     * Find all nodes that are instances of a certain class.
     *
     * @param Node|Node[] $nodes Single node or array of nodes to search in
     * @param string      $class Class name
     *
     * @return Node[] Found nodes (all instances of $class)
     */
    public function findInstanceOf($nodes, string $class) : array {
        return $this->find($nodes, function ($node) use ($class) {
            return $node instanceof $class;
        });
    }

    /**
     * Find first node satisfying a filter callback.
     *
     * @param Node|Node[] $nodes  Single node or array of nodes to search in
     * @param callable    $filter Filter callback: function(Node $node) : bool
     *
     * @return null|Node Found node (or null if none found)
     */
    public function findFirst($nodes, callable $filter) {
        if (!is_array($nodes)) {
            $nodes = [$nodes];
        }

        $visitor = new FirstFindingVisitor($filter);

        $traverser = new NodeTraverser;
        $traverser->addVisitor($visitor);
        $traverser->traverse($nodes);

        return $visitor->getFoundNode();
    }

    /**
     * Find first node that is an instance of a certain class.
     *
     * @param Node|Node[] $nodes  Single node or array of nodes to search in
     * @param string      $class Class name
     *
     * @return null|Node Found node, which is an instance of $class (or null if none found)
     */
    public function findFirstInstanceOf($nodes, string $class) {
        return $this->findFirst($nodes, function ($node) use ($class) {
            return $node instanceof $class;
        });
    }
}
<?php declare(strict_types=1);

namespace PhpParser;

class NodeTraverser implements NodeTraverserInterface
{
    /**
     * If NodeVisitor::enterNode() returns DONT_TRAVERSE_CHILDREN, child nodes
     * of the current node will not be traversed for any visitors.
     *
     * For subsequent visitors enterNode() will still be called on the current
     * node and leaveNode() will also be invoked for the current node.
     */
    const DONT_TRAVERSE_CHILDREN = 1;

    /**
     * If NodeVisitor::enterNode() or NodeVisitor::leaveNode() returns
     * STOP_TRAVERSAL, traversal is aborted.
     *
     * The afterTraverse() method will still be invoked.
     */
    const STOP_TRAVERSAL = 2;

    /**
     * If NodeVisitor::leaveNode() returns REMOVE_NODE for a node that occurs
     * in an array, it will be removed from the array.
     *
     * For subsequent visitors leaveNode() will still be invoked for the
     * removed node.
     */
    const REMOVE_NODE = 3;

    /**
     * If NodeVisitor::enterNode() returns DONT_TRAVERSE_CURRENT_AND_CHILDREN, child nodes
     * of the current node will not be traversed for any visitors.
     *
     * For subsequent visitors enterNode() will not be called as well.
     * leaveNode() will be invoked for visitors that has enterNode() method invoked.
     */
    const DONT_TRAVERSE_CURRENT_AND_CHILDREN = 4;

    /** @var NodeVisitor[] Visitors */
    protected $visitors = [];

    /** @var bool Whether traversal should be stopped */
    protected $stopTraversal;

    public function __construct() {
        // for BC
    }

    /**
     * Adds a visitor.
     *
     * @param NodeVisitor $visitor Visitor to add
     */
    public function addVisitor(NodeVisitor $visitor) {
        $this->visitors[] = $visitor;
    }

    /**
     * Removes an added visitor.
     *
     * @param NodeVisitor $visitor
     */
    public function removeVisitor(NodeVisitor $visitor) {
        foreach ($this->visitors as $index => $storedVisitor) {
            if ($storedVisitor === $visitor) {
                unset($this->visitors[$index]);
                break;
            }
        }
    }

    /**
     * Traverses an array of nodes using the registered visitors.
     *
     * @param Node[] $nodes Array of nodes
     *
     * @return Node[] Traversed array of nodes
     */
    public function traverse(array $nodes) : array {
        $this->stopTraversal = false;

        foreach ($this->visitors as $visitor) {
            if (null !== $return = $visitor->beforeTraverse($nodes)) {
                $nodes = $return;
            }
        }

        $nodes = $this->traverseArray($nodes);

        foreach ($this->visitors as $visitor) {
            if (null !== $return = $visitor->afterTraverse($nodes)) {
                $nodes = $return;
            }
        }

        return $nodes;
    }

    /**
     * Recursively traverse a node.
     *
     * @param Node $node Node to traverse.
     *
     * @return Node Result of traversal (may be original node or new one)
     */
    protected function traverseNode(Node $node) : Node {
        foreach ($node->getSubNodeNames() as $name) {
            $subNode =& $node->$name;

            if (\is_array($subNode)) {
                $subNode = $this->traverseArray($subNode);
                if ($this->stopTraversal) {
                    break;
                }
            } elseif ($subNode instanceof Node) {
                $traverseChildren = true;
                $breakVisitorIndex = null;

                foreach ($this->visitors as $visitorIndex => $visitor) {
                    $return = $visitor->enterNode($subNode);
                    if (null !== $return) {
                        if ($return instanceof Node) {
                            $this->ensureReplacementReasonable($subNode, $return);
                            $subNode = $return;
                        } elseif (self::DONT_TRAVERSE_CHILDREN === $return) {
                            $traverseChildren = false;
                        } elseif (self::DONT_TRAVERSE_CURRENT_AND_CHILDREN === $return) {
                            $traverseChildren = false;
                            $breakVisitorIndex = $visitorIndex;
                            break;
                        } elseif (self::STOP_TRAVERSAL === $return) {
                            $this->stopTraversal = true;
                            break 2;
                        } else {
                            throw new \LogicException(
                                'enterNode() returned invalid value of type ' . gettype($return)
                            );
                        }
                    }
                }

                if ($traverseChildren) {
                    $subNode = $this->traverseNode($subNode);
                    if ($this->stopTraversal) {
                        break;
                    }
                }

                foreach ($this->visitors as $visitorIndex => $visitor) {
                    $return = $visitor->leaveNode($subNode);

                    if (null !== $return) {
                        if ($return instanceof Node) {
                            $this->ensureReplacementReasonable($subNode, $return);
                            $subNode = $return;
                        } elseif (self::STOP_TRAVERSAL === $return) {
                            $this->stopTraversal = true;
                            break 2;
                        } elseif (\is_array($return)) {
                            throw new \LogicException(
                                'leaveNode() may only return an array ' .
                                'if the parent structure is an array'
                            );
                        } else {
                            throw new \LogicException(
                                'leaveNode() returned invalid value of type ' . gettype($return)
                            );
                        }
                    }

                    if ($breakVisitorIndex === $visitorIndex) {
                        break;
                    }
                }
            }
        }

        return $node;
    }

    /**
     * Recursively traverse array (usually of nodes).
     *
     * @param array $nodes Array to traverse
     *
     * @return array Result of traversal (may be original array or changed one)
     */
    protected function traverseArray(array $nodes) : array {
        $doNodes = [];

        foreach ($nodes as $i => &$node) {
            if ($node instanceof Node) {
                $traverseChildren = true;
                $breakVisitorIndex = null;

                foreach ($this->visitors as $visitorIndex => $visitor) {
                    $return = $visitor->enterNode($node);
                    if (null !== $return) {
                        if ($return instanceof Node) {
                            $this->ensureReplacementReasonable($node, $return);
                            $node = $return;
                        } elseif (self::DONT_TRAVERSE_CHILDREN === $return) {
                            $traverseChildren = false;
                        } elseif (self::DONT_TRAVERSE_CURRENT_AND_CHILDREN === $return) {
                            $traverseChildren = false;
                            $breakVisitorIndex = $visitorIndex;
                            break;
                        } elseif (self::STOP_TRAVERSAL === $return) {
                            $this->stopTraversal = true;
                            break 2;
                        } else {
                            throw new \LogicException(
                                'enterNode() returned invalid value of type ' . gettype($return)
                            );
                        }
                    }
                }

                if ($traverseChildren) {
                    $node = $this->traverseNode($node);
                    if ($this->stopTraversal) {
                        break;
                    }
                }

                foreach ($this->visitors as $visitorIndex => $visitor) {
                    $return = $visitor->leaveNode($node);

                    if (null !== $return) {
                        if ($return instanceof Node) {
                            $this->ensureReplacementReasonable($node, $return);
                            $node = $return;
                        } elseif (\is_array($return)) {
                            $doNodes[] = [$i, $return];
                            break;
                        } elseif (self::REMOVE_NODE === $return) {
                            $doNodes[] = [$i, []];
                            break;
                        } elseif (self::STOP_TRAVERSAL === $return) {
                            $this->stopTraversal = true;
                            break 2;
                        } elseif (false === $return) {
                            throw new \LogicException(
                                'bool(false) return from leaveNode() no longer supported. ' .
                                'Return NodeTraverser::REMOVE_NODE instead'
                            );
                        } else {
                            throw new \LogicException(
                                'leaveNode() returned invalid value of type ' . gettype($return)
                            );
                        }
                    }

                    if ($breakVisitorIndex === $visitorIndex) {
                        break;
                    }
                }
            } elseif (\is_array($node)) {
                throw new \LogicException('Invalid node structure: Contains nested arrays');
            }
        }

        if (!empty($doNodes)) {
            while (list($i, $replace) = array_pop($doNodes)) {
                array_splice($nodes, $i, 1, $replace);
            }
        }

        return $nodes;
    }

    private function ensureReplacementReasonable($old, $new) {
        if ($old instanceof Node\Stmt && $new instanceof Node\Expr) {
            throw new \LogicException(
                "Trying to replace statement ({$old->getType()}) " .
                "with expression ({$new->getType()}). Are you missing a " .
                "Stmt_Expression wrapper?"
            );
        }

        if ($old instanceof Node\Expr && $new instanceof Node\Stmt) {
            throw new \LogicException(
                "Trying to replace expression ({$old->getType()}) " .
                "with statement ({$new->getType()})"
            );
        }
    }
}
<?php declare(strict_types=1);

namespace PhpParser;

interface NodeTraverserInterface
{
    /**
     * Adds a visitor.
     *
     * @param NodeVisitor $visitor Visitor to add
     */
    public function addVisitor(NodeVisitor $visitor);

    /**
     * Removes an added visitor.
     *
     * @param NodeVisitor $visitor
     */
    public function removeVisitor(NodeVisitor $visitor);

    /**
     * Traverses an array of nodes using the registered visitors.
     *
     * @param Node[] $nodes Array of nodes
     *
     * @return Node[] Traversed array of nodes
     */
    public function traverse(array $nodes) : array;
}
<?php declare(strict_types=1);

namespace PhpParser;

interface NodeVisitor
{
    /**
     * Called once before traversal.
     *
     * Return value semantics:
     *  * null:      $nodes stays as-is
     *  * otherwise: $nodes is set to the return value
     *
     * @param Node[] $nodes Array of nodes
     *
     * @return null|Node[] Array of nodes
     */
    public function beforeTraverse(array $nodes);

    /**
     * Called when entering a node.
     *
     * Return value semantics:
     *  * null
     *        => $node stays as-is
     *  * NodeTraverser::DONT_TRAVERSE_CHILDREN
     *        => Children of $node are not traversed. $node stays as-is
     *  * NodeTraverser::STOP_TRAVERSAL
     *        => Traversal is aborted. $node stays as-is
     *  * otherwise
     *        => $node is set to the return value
     *
     * @param Node $node Node
     *
     * @return null|int|Node Replacement node (or special return value)
     */
    public function enterNode(Node $node);

    /**
     * Called when leaving a node.
     *
     * Return value semantics:
     *  * null
     *        => $node stays as-is
     *  * NodeTraverser::REMOVE_NODE
     *        => $node is removed from the parent array
     *  * NodeTraverser::STOP_TRAVERSAL
     *        => Traversal is aborted. $node stays as-is
     *  * array (of Nodes)
     *        => The return value is merged into the parent array (at the position of the $node)
     *  * otherwise
     *        => $node is set to the return value
     *
     * @param Node $node Node
     *
     * @return null|int|Node|Node[] Replacement node (or special return value)
     */
    public function leaveNode(Node $node);

    /**
     * Called once after traversal.
     *
     * Return value semantics:
     *  * null:      $nodes stays as-is
     *  * otherwise: $nodes is set to the return value
     *
     * @param Node[] $nodes Array of nodes
     *
     * @return null|Node[] Array of nodes
     */
    public function afterTraverse(array $nodes);
}
<?php declare(strict_types=1);

namespace PhpParser\NodeVisitor;

use PhpParser\Node;
use PhpParser\NodeVisitorAbstract;

/**
 * Visitor cloning all nodes and linking to the original nodes using an attribute.
 *
 * This visitor is required to perform format-preserving pretty prints.
 */
class CloningVisitor extends NodeVisitorAbstract
{
    public function enterNode(Node $origNode) {
        $node = clone $origNode;
        $node->setAttribute('origNode', $origNode);
        return $node;
    }
}
<?php declare(strict_types=1);

namespace PhpParser\NodeVisitor;

use PhpParser\Node;
use PhpParser\NodeVisitorAbstract;

/**
 * This visitor can be used to find and collect all nodes satisfying some criterion determined by
 * a filter callback.
 */
class FindingVisitor extends NodeVisitorAbstract
{
    /** @var callable Filter callback */
    protected $filterCallback;
    /** @var Node[] Found nodes */
    protected $foundNodes;

    public function __construct(callable $filterCallback) {
        $this->filterCallback = $filterCallback;
    }

    /**
     * Get found nodes satisfying the filter callback.
     *
     * Nodes are returned in pre-order.
     *
     * @return Node[] Found nodes
     */
    public function getFoundNodes() : array {
        return $this->foundNodes;
    }

    public function beforeTraverse(array $nodes) {
        $this->foundNodes = [];

        return null;
    }

    public function enterNode(Node $node) {
        $filterCallback = $this->filterCallback;
        if ($filterCallback($node)) {
            $this->foundNodes[] = $node;
        }

        return null;
    }
}
<?php declare(strict_types=1);

namespace PhpParser\NodeVisitor;

use PhpParser\Node;
use PhpParser\NodeTraverser;
use PhpParser\NodeVisitorAbstract;

/**
 * This visitor can be used to find the first node satisfying some criterion determined by
 * a filter callback.
 */
class FirstFindingVisitor extends NodeVisitorAbstract
{
    /** @var callable Filter callback */
    protected $filterCallback;
    /** @var null|Node Found node */
    protected $foundNode;

    public function __construct(callable $filterCallback) {
        $this->filterCallback = $filterCallback;
    }

    /**
     * Get found node satisfying the filter callback.
     *
     * Returns null if no node satisfies the filter callback.
     *
     * @return null|Node Found node (or null if not found)
     */
    public function getFoundNode() {
        return $this->foundNode;
    }

    public function beforeTraverse(array $nodes) {
        $this->foundNode = null;

        return null;
    }

    public function enterNode(Node $node) {
        $filterCallback = $this->filterCallback;
        if ($filterCallback($node)) {
            $this->foundNode = $node;
            return NodeTraverser::STOP_TRAVERSAL;
        }

        return null;
    }
}
<?php declare(strict_types=1);

namespace PhpParser\NodeVisitor;

use PhpParser\ErrorHandler;
use PhpParser\NameContext;
use PhpParser\Node;
use PhpParser\Node\Expr;
use PhpParser\Node\Name;
use PhpParser\Node\Name\FullyQualified;
use PhpParser\Node\Stmt;
use PhpParser\NodeVisitorAbstract;

class NameResolver extends NodeVisitorAbstract
{
    /** @var NameContext Naming context */
    protected $nameContext;

    /** @var bool Whether to preserve original names */
    protected $preserveOriginalNames;

    /** @var bool Whether to replace resolved nodes in place, or to add resolvedNode attributes */
    protected $replaceNodes;

    /**
     * Constructs a name resolution visitor.
     *
     * Options:
     *  * preserveOriginalNames (default false): An "originalName" attribute will be added to
     *    all name nodes that underwent resolution.
     *  * replaceNodes (default true): Resolved names are replaced in-place. Otherwise, a
     *    resolvedName attribute is added. (Names that cannot be statically resolved receive a
     *    namespacedName attribute, as usual.)
     *
     * @param ErrorHandler|null $errorHandler Error handler
     * @param array $options Options
     */
    public function __construct(ErrorHandler $errorHandler = null, array $options = []) {
        $this->nameContext = new NameContext($errorHandler ?? new ErrorHandler\Throwing);
        $this->preserveOriginalNames = $options['preserveOriginalNames'] ?? false;
        $this->replaceNodes = $options['replaceNodes'] ?? true;
    }

    /**
     * Get name resolution context.
     *
     * @return NameContext
     */
    public function getNameContext() : NameContext {
        return $this->nameContext;
    }

    public function beforeTraverse(array $nodes) {
        $this->nameContext->startNamespace();
        return null;
    }

    public function enterNode(Node $node) {
        if ($node instanceof Stmt\Namespace_) {
            $this->nameContext->startNamespace($node->name);
        } elseif ($node instanceof Stmt\Use_) {
            foreach ($node->uses as $use) {
                $this->addAlias($use, $node->type, null);
            }
        } elseif ($node instanceof Stmt\GroupUse) {
            foreach ($node->uses as $use) {
                $this->addAlias($use, $node->type, $node->prefix);
            }
        } elseif ($node instanceof Stmt\Class_) {
            if (null !== $node->extends) {
                $node->extends = $this->resolveClassName($node->extends);
            }

            foreach ($node->implements as &$interface) {
                $interface = $this->resolveClassName($interface);
            }

            $this->resolveAttrGroups($node);
            if (null !== $node->name) {
                $this->addNamespacedName($node);
            }
        } elseif ($node instanceof Stmt\Interface_) {
            foreach ($node->extends as &$interface) {
                $interface = $this->resolveClassName($interface);
            }

            $this->resolveAttrGroups($node);
            $this->addNamespacedName($node);
         } elseif ($node instanceof Stmt\Enum_) {
            foreach ($node->implements as &$interface) {
                $interface = $this->resolveClassName($interface);
            }

            $this->resolveAttrGroups($node);
            if (null !== $node->name) {
                $this->addNamespacedName($node);
            }
        } elseif ($node instanceof Stmt\Trait_) {
            $this->resolveAttrGroups($node);
            $this->addNamespacedName($node);
        } elseif ($node instanceof Stmt\Function_) {
            $this->resolveSignature($node);
            $this->resolveAttrGroups($node);
            $this->addNamespacedName($node);
        } elseif ($node instanceof Stmt\ClassMethod
                  || $node instanceof Expr\Closure
                  || $node instanceof Expr\ArrowFunction
        ) {
            $this->resolveSignature($node);
            $this->resolveAttrGroups($node);
        } elseif ($node instanceof Stmt\Property) {
            if (null !== $node->type) {
                $node->type = $this->resolveType($node->type);
            }
            $this->resolveAttrGroups($node);
        } elseif ($node instanceof Stmt\Const_) {
            foreach ($node->consts as $const) {
                $this->addNamespacedName($const);
            }
        } else if ($node instanceof Stmt\ClassConst) {
            $this->resolveAttrGroups($node);
        } else if ($node instanceof Stmt\EnumCase) {
            $this->resolveAttrGroups($node);
        } elseif ($node instanceof Expr\StaticCall
                  || $node instanceof Expr\StaticPropertyFetch
                  || $node instanceof Expr\ClassConstFetch
                  || $node instanceof Expr\New_
                  || $node instanceof Expr\Instanceof_
        ) {
            if ($node->class instanceof Name) {
                $node->class = $this->resolveClassName($node->class);
            }
        } elseif ($node instanceof Stmt\Catch_) {
            foreach ($node->types as &$type) {
                $type = $this->resolveClassName($type);
            }
        } elseif ($node instanceof Expr\FuncCall) {
            if ($node->name instanceof Name) {
                $node->name = $this->resolveName($node->name, Stmt\Use_::TYPE_FUNCTION);
            }
        } elseif ($node instanceof Expr\ConstFetch) {
            $node->name = $this->resolveName($node->name, Stmt\Use_::TYPE_CONSTANT);
        } elseif ($node instanceof Stmt\TraitUse) {
            foreach ($node->traits as &$trait) {
                $trait = $this->resolveClassName($trait);
            }

            foreach ($node->adaptations as $adaptation) {
                if (null !== $adaptation->trait) {
                    $adaptation->trait = $this->resolveClassName($adaptation->trait);
                }

                if ($adaptation instanceof Stmt\TraitUseAdaptation\Precedence) {
                    foreach ($adaptation->insteadof as &$insteadof) {
                        $insteadof = $this->resolveClassName($insteadof);
                    }
                }
            }
        }

        return null;
    }

    private function addAlias(Stmt\UseUse $use, int $type, Name $prefix = null) {
        // Add prefix for group uses
        $name = $prefix ? Name::concat($prefix, $use->name) : $use->name;
        // Type is determined either by individual element or whole use declaration
        $type |= $use->type;

        $this->nameContext->addAlias(
            $name, (string) $use->getAlias(), $type, $use->getAttributes()
        );
    }

    /** @param Stmt\Function_|Stmt\ClassMethod|Expr\Closure $node */
    private function resolveSignature($node) {
        foreach ($node->params as $param) {
            $param->type = $this->resolveType($param->type);
            $this->resolveAttrGroups($param);
        }
        $node->returnType = $this->resolveType($node->returnType);
    }

    private function resolveType($node) {
        if ($node instanceof Name) {
            return $this->resolveClassName($node);
        }
        if ($node instanceof Node\NullableType) {
            $node->type = $this->resolveType($node->type);
            return $node;
        }
        if ($node instanceof Node\UnionType || $node instanceof Node\IntersectionType) {
            foreach ($node->types as &$type) {
                $type = $this->resolveType($type);
            }
            return $node;
        }
        return $node;
    }

    /**
     * Resolve name, according to name resolver options.
     *
     * @param Name $name Function or constant name to resolve
     * @param int  $type One of Stmt\Use_::TYPE_*
     *
     * @return Name Resolved name, or original name with attribute
     */
    protected function resolveName(Name $name, int $type) : Name {
        if (!$this->replaceNodes) {
            $resolvedName = $this->nameContext->getResolvedName($name, $type);
            if (null !== $resolvedName) {
                $name->setAttribute('resolvedName', $resolvedName);
            } else {
                $name->setAttribute('namespacedName', FullyQualified::concat(
                    $this->nameContext->getNamespace(), $name, $name->getAttributes()));
            }
            return $name;
        }

        if ($this->preserveOriginalNames) {
            // Save the original name
            $originalName = $name;
            $name = clone $originalName;
            $name->setAttribute('originalName', $originalName);
        }

        $resolvedName = $this->nameContext->getResolvedName($name, $type);
        if (null !== $resolvedName) {
            return $resolvedName;
        }

        // unqualified names inside a namespace cannot be resolved at compile-time
        // add the namespaced version of the name as an attribute
        $name->setAttribute('namespacedName', FullyQualified::concat(
            $this->nameContext->getNamespace(), $name, $name->getAttributes()));
        return $name;
    }

    protected function resolveClassName(Name $name) {
        return $this->resolveName($name, Stmt\Use_::TYPE_NORMAL);
    }

    protected function addNamespacedName(Node $node) {
        $node->namespacedName = Name::concat(
            $this->nameContext->getNamespace(), (string) $node->name);
    }

    protected function resolveAttrGroups(Node $node)
    {
        foreach ($node->attrGroups as $attrGroup) {
            foreach ($attrGroup->attrs as $attr) {
                $attr->name = $this->resolveClassName($attr->name);
            }
        }
    }
}
<?php declare(strict_types=1);

namespace PhpParser\NodeVisitor;

use PhpParser\Node;
use PhpParser\NodeVisitorAbstract;

/**
 * Visitor that connects a child node to its parent node
 * as well as its sibling nodes.
 *
 * On the child node, the parent node can be accessed through
 * <code>$node->getAttribute('parent')</code>, the previous
 * node can be accessed through <code>$node->getAttribute('previous')</code>,
 * and the next node can be accessed through <code>$node->getAttribute('next')</code>.
 */
final class NodeConnectingVisitor extends NodeVisitorAbstract
{
    /**
     * @var Node[]
     */
    private $stack = [];

    /**
     * @var ?Node
     */
    private $previous;

    public function beforeTraverse(array $nodes) {
        $this->stack    = [];
        $this->previous = null;
    }

    public function enterNode(Node $node) {
        if (!empty($this->stack)) {
            $node->setAttribute('parent', $this->stack[count($this->stack) - 1]);
        }

        if ($this->previous !== null && $this->previous->getAttribute('parent') === $node->getAttribute('parent')) {
            $node->setAttribute('previous', $this->previous);
            $this->previous->setAttribute('next', $node);
        }

        $this->stack[] = $node;
    }

    public function leaveNode(Node $node) {
        $this->previous = $node;

        array_pop($this->stack);
    }
}
<?php declare(strict_types=1);

namespace PhpParser\NodeVisitor;

use function array_pop;
use function count;
use PhpParser\Node;
use PhpParser\NodeVisitorAbstract;

/**
 * Visitor that connects a child node to its parent node.
 *
 * On the child node, the parent node can be accessed through
 * <code>$node->getAttribute('parent')</code>.
 */
final class ParentConnectingVisitor extends NodeVisitorAbstract
{
    /**
     * @var Node[]
     */
    private $stack = [];

    public function beforeTraverse(array $nodes)
    {
        $this->stack = [];
    }

    public function enterNode(Node $node)
    {
        if (!empty($this->stack)) {
            $node->setAttribute('parent', $this->stack[count($this->stack) - 1]);
        }

        $this->stack[] = $node;
    }

    public function leaveNode(Node $node)
    {
        array_pop($this->stack);
    }
}
<?php declare(strict_types=1);

namespace PhpParser;

/**
 * @codeCoverageIgnore
 */
class NodeVisitorAbstract implements NodeVisitor
{
    public function beforeTraverse(array $nodes) {
        return null;
    }

    public function enterNode(Node $node) {
        return null;
    }

    public function leaveNode(Node $node) {
        return null;
    }

    public function afterTraverse(array $nodes) {
        return null;
    }
}
<?php declare(strict_types=1);

namespace PhpParser;

interface Parser
{
    /**
     * Parses PHP code into a node tree.
     *
     * @param string $code The source code to parse
     * @param ErrorHandler|null $errorHandler Error handler to use for lexer/parser errors, defaults
     *                                        to ErrorHandler\Throwing.
     *
     * @return Node\Stmt[]|null Array of statements (or null non-throwing error handler is used and
     *                          the parser was unable to recover from an error).
     */
    public function parse(string $code, ErrorHandler $errorHandler = null);
}
<?php declare(strict_types=1);

namespace PhpParser\Parser;

use PhpParser\Error;
use PhpParser\ErrorHandler;
use PhpParser\Parser;

class Multiple implements Parser
{
    /** @var Parser[] List of parsers to try, in order of preference */
    private $parsers;

    /**
     * Create a parser which will try multiple parsers in an order of preference.
     *
     * Parsers will be invoked in the order they're provided to the constructor. If one of the
     * parsers runs without throwing, it's output is returned. Otherwise the exception that the
     * first parser generated is thrown.
     *
     * @param Parser[] $parsers
     */
    public function __construct(array $parsers) {
        $this->parsers = $parsers;
    }

    public function parse(string $code, ErrorHandler $errorHandler = null) {
        if (null === $errorHandler) {
            $errorHandler = new ErrorHandler\Throwing;
        }

        list($firstStmts, $firstError) = $this->tryParse($this->parsers[0], $errorHandler, $code);
        if ($firstError === null) {
            return $firstStmts;
        }

        for ($i = 1, $c = count($this->parsers); $i < $c; ++$i) {
            list($stmts, $error) = $this->tryParse($this->parsers[$i], $errorHandler, $code);
            if ($error === null) {
                return $stmts;
            }
        }

        throw $firstError;
    }

    private function tryParse(Parser $parser, ErrorHandler $errorHandler, $code) {
        $stmts = null;
        $error = null;
        try {
            $stmts = $parser->parse($code, $errorHandler);
        } catch (Error $error) {}
        return [$stmts, $error];
    }
}
<?php

namespace PhpParser\Parser;

use PhpParser\Error;
use PhpParser\Node;
use PhpParser\Node\Expr;
use PhpParser\Node\Name;
use PhpParser\Node\Scalar;
use PhpParser\Node\Stmt;

/* This is an automatically GENERATED file, which should not be manually edited.
 * Instead edit one of the following:
 *  * the grammar files grammar/php5.y or grammar/php7.y
 *  * the skeleton file grammar/parser.template
 *  * the preprocessing script grammar/rebuildParsers.php
 */
class Php5 extends \PhpParser\ParserAbstract
{
    protected $tokenToSymbolMapSize = 396;
    protected $actionTableSize = 1099;
    protected $gotoTableSize = 640;

    protected $invalidSymbol = 168;
    protected $errorSymbol = 1;
    protected $defaultAction = -32766;
    protected $unexpectedTokenRule = 32767;

    protected $YY2TBLSTATE = 415;
    protected $numNonLeafStates = 663;

    protected $symbolToName = array(
        "EOF",
        "error",
        "T_THROW",
        "T_INCLUDE",
        "T_INCLUDE_ONCE",
        "T_EVAL",
        "T_REQUIRE",
        "T_REQUIRE_ONCE",
        "','",
        "T_LOGICAL_OR",
        "T_LOGICAL_XOR",
        "T_LOGICAL_AND",
        "T_PRINT",
        "T_YIELD",
        "T_DOUBLE_ARROW",
        "T_YIELD_FROM",
        "'='",
        "T_PLUS_EQUAL",
        "T_MINUS_EQUAL",
        "T_MUL_EQUAL",
        "T_DIV_EQUAL",
        "T_CONCAT_EQUAL",
        "T_MOD_EQUAL",
        "T_AND_EQUAL",
        "T_OR_EQUAL",
        "T_XOR_EQUAL",
        "T_SL_EQUAL",
        "T_SR_EQUAL",
        "T_POW_EQUAL",
        "T_COALESCE_EQUAL",
        "'?'",
        "':'",
        "T_COALESCE",
        "T_BOOLEAN_OR",
        "T_BOOLEAN_AND",
        "'|'",
        "'^'",
        "T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG",
        "T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG",
        "T_IS_EQUAL",
        "T_IS_NOT_EQUAL",
        "T_IS_IDENTICAL",
        "T_IS_NOT_IDENTICAL",
        "T_SPACESHIP",
        "'<'",
        "T_IS_SMALLER_OR_EQUAL",
        "'>'",
        "T_IS_GREATER_OR_EQUAL",
        "T_SL",
        "T_SR",
        "'+'",
        "'-'",
        "'.'",
        "'*'",
        "'/'",
        "'%'",
        "'!'",
        "T_INSTANCEOF",
        "'~'",
        "T_INC",
        "T_DEC",
        "T_INT_CAST",
        "T_DOUBLE_CAST",
        "T_STRING_CAST",
        "T_ARRAY_CAST",
        "T_OBJECT_CAST",
        "T_BOOL_CAST",
        "T_UNSET_CAST",
        "'@'",
        "T_POW",
        "'['",
        "T_NEW",
        "T_CLONE",
        "T_EXIT",
        "T_IF",
        "T_ELSEIF",
        "T_ELSE",
        "T_ENDIF",
        "T_LNUMBER",
        "T_DNUMBER",
        "T_STRING",
        "T_STRING_VARNAME",
        "T_VARIABLE",
        "T_NUM_STRING",
        "T_INLINE_HTML",
        "T_ENCAPSED_AND_WHITESPACE",
        "T_CONSTANT_ENCAPSED_STRING",
        "T_ECHO",
        "T_DO",
        "T_WHILE",
        "T_ENDWHILE",
        "T_FOR",
        "T_ENDFOR",
        "T_FOREACH",
        "T_ENDFOREACH",
        "T_DECLARE",
        "T_ENDDECLARE",
        "T_AS",
        "T_SWITCH",
        "T_MATCH",
        "T_ENDSWITCH",
        "T_CASE",
        "T_DEFAULT",
        "T_BREAK",
        "T_CONTINUE",
        "T_GOTO",
        "T_FUNCTION",
        "T_FN",
        "T_CONST",
        "T_RETURN",
        "T_TRY",
        "T_CATCH",
        "T_FINALLY",
        "T_USE",
        "T_INSTEADOF",
        "T_GLOBAL",
        "T_STATIC",
        "T_ABSTRACT",
        "T_FINAL",
        "T_PRIVATE",
        "T_PROTECTED",
        "T_PUBLIC",
        "T_READONLY",
        "T_VAR",
        "T_UNSET",
        "T_ISSET",
        "T_EMPTY",
        "T_HALT_COMPILER",
        "T_CLASS",
        "T_TRAIT",
        "T_INTERFACE",
        "T_EXTENDS",
        "T_IMPLEMENTS",
        "T_OBJECT_OPERATOR",
        "T_LIST",
        "T_ARRAY",
        "T_CALLABLE",
        "T_CLASS_C",
        "T_TRAIT_C",
        "T_METHOD_C",
        "T_FUNC_C",
        "T_LINE",
        "T_FILE",
        "T_START_HEREDOC",
        "T_END_HEREDOC",
        "T_DOLLAR_OPEN_CURLY_BRACES",
        "T_CURLY_OPEN",
        "T_PAAMAYIM_NEKUDOTAYIM",
        "T_NAMESPACE",
        "T_NS_C",
        "T_DIR",
        "T_NS_SEPARATOR",
        "T_ELLIPSIS",
        "T_NAME_FULLY_QUALIFIED",
        "T_NAME_QUALIFIED",
        "T_NAME_RELATIVE",
        "';'",
        "'{'",
        "'}'",
        "'('",
        "')'",
        "'$'",
        "'`'",
        "']'",
        "'\"'",
        "T_ENUM",
        "T_NULLSAFE_OBJECT_OPERATOR",
        "T_ATTRIBUTE"
    );

    protected $tokenToSymbol = array(
            0,  168,  168,  168,  168,  168,  168,  168,  168,  168,
          168,  168,  168,  168,  168,  168,  168,  168,  168,  168,
          168,  168,  168,  168,  168,  168,  168,  168,  168,  168,
          168,  168,  168,   56,  164,  168,  161,   55,  168,  168,
          159,  160,   53,   50,    8,   51,   52,   54,  168,  168,
          168,  168,  168,  168,  168,  168,  168,  168,   31,  156,
           44,   16,   46,   30,   68,  168,  168,  168,  168,  168,
          168,  168,  168,  168,  168,  168,  168,  168,  168,  168,
          168,  168,  168,  168,  168,  168,  168,  168,  168,  168,
          168,   70,  168,  163,   36,  168,  162,  168,  168,  168,
          168,  168,  168,  168,  168,  168,  168,  168,  168,  168,
          168,  168,  168,  168,  168,  168,  168,  168,  168,  168,
          168,  168,  168,  157,   35,  158,   58,  168,  168,  168,
          168,  168,  168,  168,  168,  168,  168,  168,  168,  168,
          168,  168,  168,  168,  168,  168,  168,  168,  168,  168,
          168,  168,  168,  168,  168,  168,  168,  168,  168,  168,
          168,  168,  168,  168,  168,  168,  168,  168,  168,  168,
          168,  168,  168,  168,  168,  168,  168,  168,  168,  168,
          168,  168,  168,  168,  168,  168,  168,  168,  168,  168,
          168,  168,  168,  168,  168,  168,  168,  168,  168,  168,
          168,  168,  168,  168,  168,  168,  168,  168,  168,  168,
          168,  168,  168,  168,  168,  168,  168,  168,  168,  168,
          168,  168,  168,  168,  168,  168,  168,  168,  168,  168,
          168,  168,  168,  168,  168,  168,  168,  168,  168,  168,
          168,  168,  168,  168,  168,  168,  168,  168,  168,  168,
          168,  168,  168,  168,  168,  168,    1,    2,    3,    4,
            5,    6,    7,    9,   10,   11,   12,   13,   14,   15,
           17,   18,   19,   20,   21,   22,   23,   24,   25,   26,
           27,   28,   29,   32,   33,   34,   37,   38,   39,   40,
           41,   42,   43,   45,   47,   48,   49,   57,   59,   60,
           61,   62,   63,   64,   65,   66,   67,   69,   71,   72,
           73,   74,   75,   76,   77,   78,   79,   80,   81,   82,
           83,   84,   85,   86,   87,   88,   89,   90,   91,   92,
           93,   94,   95,   96,   97,   98,   99,  100,  101,  102,
          103,  104,  105,  106,  107,  108,  109,  110,  111,  112,
          113,  114,  115,  116,  117,  118,  119,  120,  121,  122,
          123,  124,  125,  126,  127,  128,  129,  130,  165,  131,
          132,  133,  166,  134,  135,  136,  137,  138,  139,  140,
          141,  142,  143,  144,  145,  146,  147,  148,  149,  150,
          151,  152,  153,  154,  155,  167
    );

    protected $action = array(
          700,  670,  671,  672,  673,  674,  286,  675,  676,  677,
          713,  714,  223,  224,  225,  226,  227,  228,  229,  230,
          231,  232,    0,  233,  234,  235,  236,  237,  238,  239,
          240,  241,  242,  243,  244,-32766,-32766,-32766,-32766,-32766,
        -32766,-32766,-32766,-32766,-32767,-32767,-32767,-32767,  245,  246,
          242,  243,  244,-32766,-32766,  678,-32766,-32766,-32766,-32766,
        -32766,-32766,-32766,-32766,-32766, 1229,  245,  246, 1230,  679,
          680,  681,  682,  683,  684,  685,  899,  900,  747,-32766,
        -32766,-32766,-32766,-32766,-32766,  686,  687,  688,  689,  690,
          691,  692,  693,  694,  695,  696,  716,  739,  717,  718,
          719,  720,  708,  709,  710,  738,  711,  712,  697,  698,
          699,  701,  702,  703,  741,  742,  743,  744,  745,  746,
          875,  704,  705,  706,  707,  737,  728,  726,  727,  723,
          724, 1046,  715,  721,  722,  729,  730,  732,  731,  733,
          734,   55,   56,  425,   57,   58,  725,  736,  735,  755,
           59,   60, -226,   61,-32766,-32766,-32766,-32766,-32766,-32766,
        -32766,-32766,-32766,-32766,  337,-32767,-32767,-32767,-32767,   29,
          107,  108,  109,  110,  111,  112,  113,  114,  115,  116,
          117,  118,  119,  620,-32766,-32766,-32766,-32766,   62,   63,
         1046,-32766,-32766,-32766,   64,  419,   65,  294,  295,   66,
           67,   68,   69,   70,   71,   72,   73,  823,   25,  302,
           74,  418,  984,  986,  669,  668, 1100, 1101, 1078,  755,
          755,  767, 1220,  768,  470,-32766,-32766,-32766,  341,  749,
          824,   54,-32767,-32767,-32767,-32767,   98,   99,  100,  101,
          102,  220,  221,  222,  362,  876,-32766,   27,-32766,-32766,
        -32766,-32766,-32766, 1046,  493,  126, 1080, 1079, 1081,  370,
         1068,  930,  207,  478,  479,  952,  953,  954,  951,  950,
          949,  128,  480,  481,  803, 1106, 1107, 1108, 1109, 1103,
         1104,  319,   32,  297,   10,  211, -515, 1110, 1105,  669,
          668, 1080, 1079, 1081,  220,  221,  222,   41,  364,  341,
          334,  421,  336,  426, -128, -128, -128,  313, 1046,  469,
           -4,  824,   54,  812,  770,  207,   40,   21,  427, -128,
          471, -128,  472, -128,  473, -128, 1046,  428,  220,  221,
          222,-32766,   33,   34,  429,  361,  327,   52,   35,  474,
        -32766,-32766,-32766,  342,  357,  358,  475,  476,   48,  207,
          249,  669,  668,  477,  443,  300,  795,  846,  430,  431,
           28,-32766,  814,-32766,-32766,-32766,-32766,-32766,-32766,-32766,
        -32767,-32767,-32767,-32767,-32767,  952,  953,  954,  951,  950,
          949,  422,  755,  424,  426,  826,  634, -128,-32766,-32766,
          469,  824,   54,  288,  812, 1151,  755,   40,   21,  427,
          317,  471,  345,  472,  129,  473,    9, 1186,  428,  769,
          360,  324,  905,   33,   34,  429,  361, 1046,  415,   35,
          474,  944, 1068,  315,  125,  357,  358,  475,  476,-32766,
        -32766,-32766,  926,  302,  477,  121, 1068,  759,  846,  430,
          431,  669,  668,  423,  755, 1152,  809, 1046,  480,  766,
        -32766,  805,-32766,-32766,-32766,-32766, -261,  127,  347,  436,
          841,  341, 1078, 1200,  426,  446,  826,  634,   -4,  807,
          469,  824,   54,  436,  812,  341,  755,   40,   21,  427,
          444,  471,  130,  472, 1068,  473,  346,  767,  428,  768,
         -211, -211, -211,   33,   34,  429,  361,  308, 1076,   35,
          474,-32766,-32766,-32766, 1046,  357,  358,  475,  476,-32766,
        -32766,-32766,  906,  120,  477,  539, 1068,  795,  846,  430,
          431,  436,-32766,  341,-32766,-32766,-32766, 1046,  480,  810,
        -32766,  925,-32766,-32766,  754, 1080, 1079, 1081,   49,-32766,
        -32766,-32766,  749,  751,  426, 1201,  826,  634, -211,   30,
          469,  669,  668,  436,  812,  341,   75,   40,   21,  427,
        -32766,  471, 1064,  472,  124,  473,  669,  668,  428,  212,
         -210, -210, -210,   33,   34,  429,  361,   51, 1186,   35,
          474,  755,-32766,-32766,-32766,  357,  358,  475,  476,  213,
          824,   54,  221,  222,  477,   20,  581,  795,  846,  430,
          431,  220,  221,  222,  755,  222,  247,   78,   79,   80,
           81,  341,  207,  517,  103,  104,  105,  752,  307,  131,
          637, 1068,  207,  341,  207,  122,  826,  634, -210,   36,
          106,   82,   83,   84,   85,   86,   87,   88,   89,   90,
           91,   92,   93,   94,   95,   96,   97,   98,   99,  100,
          101,  102,  103,  104,  105, 1112,  307,  346,  436,  214,
          341,  824,   54,  426,  123,  250,  129,  134,  106,  469,
        -32766,  572, 1112,  812,  245,  246,   40,   21,  427,  251,
          471,  252,  472,  341,  473,  453,   22,  428,  207,  899,
          900,  638,   33,   34,  429,  824,   54,  -86,   35,  474,
          220,  221,  222,  314,  357,  358,  100,  101,  102,  239,
          240,  241,  645,  477, -230,  458,  589,  135,  374,  596,
          597,  207,  760,  640,  648,  642,  941,  654,  929,  662,
          822,  133,  307,  837,  426,-32766,  106,  749,   43,   44,
          469,   45,  442,   46,  812,  826,  634,   40,   21,  427,
           47,  471,   50,  472,   53,  473,  132,  608,  428,  302,
          604, -280,-32766,   33,   34,  429,  824,   54,  426,   35,
          474,  755,  957,  -84,  469,  357,  358,  521,  812,  628,
          363,   40,   21,  427,  477,  471,  575,  472, -515,  473,
          847,  616,  428, -423,-32766,   11,  646,   33,   34,  429,
          824,   54,  445,   35,  474,  462,  285,  578, 1111,  357,
          358,  593,  369,  848,  594,  290,  826,  634,  477,    0,
            0,  532,    0,    0,  325,    0,    0,    0,    0,    0,
          651,    0,    0,    0,  322,  326,    0,    0,    0,  426,
            0,    0,    0,    0,  323,  469,  316,  318, -516,  812,
          862,  634,   40,   21,  427,    0,  471,    0,  472,    0,
          473, 1158,    0,  428,    0, -414,    6,    7,   33,   34,
          429,  824,   54,  426,   35,  474,   12,   14,  373,  469,
          357,  358, -424,  812,  563,  754,   40,   21,  427,  477,
          471,  248,  472,  839,  473,   38,   39,  428,  657,  658,
          765,  813,   33,   34,  429,  821,  800,  815,   35,  474,
          215,  216,  878,  869,  357,  358,  217,  870,  218,  798,
          863,  826,  634,  477,  860,  858,  936,  937,  934,  820,
          209,  804,  806,  808,  811,  933,  763,  764, 1100, 1101,
          935,  659,   78,  335,  426,  359, 1102,  635,  639,  641,
          469,  643,  644,  647,  812,  826,  634,   40,   21,  427,
          649,  471,  650,  472,  652,  473,  653,  636,  428,  796,
         1226, 1228,  762,   33,   34,  429,  215,  216,  845,   35,
          474,  761,  217,  844,  218,  357,  358, 1227,  843, 1060,
          831, 1048,  842, 1049,  477,  559,  209, 1106, 1107, 1108,
         1109, 1103, 1104,  398, 1100, 1101,  829,  942,  867, 1110,
         1105,  868, 1102,  457, 1225, 1194, 1192, 1177, 1157,  219,
         1190, 1091,  917, 1198, 1188,    0,  826,  634,   24, -433,
           26,   31,   37,   42,   76,   77,  210,  287,  292,  293,
          308,  309,  310,  311,  339,  356,  416,    0, -227, -226,
           16,   17,   18,  393,  454,  461,  463,  467,  553,  625,
         1051,  559, 1054, 1106, 1107, 1108, 1109, 1103, 1104,  398,
          907, 1116, 1050, 1026,  564, 1110, 1105, 1025, 1093, 1055,
            0, 1044,    0, 1057, 1056,  219, 1059, 1058, 1075,    0,
         1191, 1176, 1172, 1189, 1090, 1223, 1117, 1171,  600
    );

    protected $actionCheck = array(
            2,    3,    4,    5,    6,    7,   14,    9,   10,   11,
           12,   13,   33,   34,   35,   36,   37,   38,   39,   40,
           41,   42,    0,   44,   45,   46,   47,   48,   49,   50,
           51,   52,   53,   54,   55,    9,   10,   11,   33,   34,
           35,   36,   37,   38,   39,   40,   41,   42,   69,   70,
           53,   54,   55,    9,   10,   57,   30,  116,   32,   33,
           34,   35,   36,   37,   38,   80,   69,   70,   83,   71,
           72,   73,   74,   75,   76,   77,  135,  136,   80,   33,
           34,   35,   36,   37,   38,   87,   88,   89,   90,   91,
           92,   93,   94,   95,   96,   97,   98,   99,  100,  101,
          102,  103,  104,  105,  106,  107,  108,  109,  110,  111,
          112,  113,  114,  115,  116,  117,  118,  119,  120,  121,
           31,  123,  124,  125,  126,  127,  128,  129,  130,  131,
          132,   13,  134,  135,  136,  137,  138,  139,  140,  141,
          142,    3,    4,    5,    6,    7,  148,  149,  150,   82,
           12,   13,  160,   15,   33,   34,   35,   36,   37,   38,
           39,   40,   41,   42,    8,   44,   45,   46,   47,   16,
           17,   18,   19,   20,   21,   22,   23,   24,   25,   26,
           27,   28,   29,   80,   33,   34,   35,   36,   50,   51,
           13,    9,   10,   11,   56,  128,   58,   59,   60,   61,
           62,   63,   64,   65,   66,   67,   68,    1,   70,   71,
           72,   73,   59,   60,   37,   38,   78,   79,   80,   82,
           82,  106,   85,  108,   86,    9,   10,   11,  161,   80,
            1,    2,   44,   45,   46,   47,   48,   49,   50,   51,
           52,    9,   10,   11,  106,  156,   30,    8,   32,   33,
           34,   35,   36,   13,  116,    8,  153,  154,  155,    8,
          122,  158,   30,  125,  126,  116,  117,  118,  119,  120,
          121,   31,  134,  135,  156,  137,  138,  139,  140,  141,
          142,  143,  145,  146,    8,    8,  133,  149,  150,   37,
           38,  153,  154,  155,    9,   10,   11,  159,    8,  161,
          162,    8,  164,   74,   75,   76,   77,    8,   13,   80,
            0,    1,    2,   84,  158,   30,   87,   88,   89,   90,
           91,   92,   93,   94,   95,   96,   13,   98,    9,   10,
           11,    9,  103,  104,  105,  106,    8,   70,  109,  110,
            9,   10,   11,    8,  115,  116,  117,  118,   70,   30,
           31,   37,   38,  124,   31,    8,  127,  128,  129,  130,
            8,   30,  156,   32,   33,   34,   35,   36,   37,   38,
           39,   40,   41,   42,   43,  116,  117,  118,  119,  120,
          121,    8,   82,    8,   74,  156,  157,  158,   33,   34,
           80,    1,    2,    8,   84,  163,   82,   87,   88,   89,
          133,   91,   70,   93,  152,   95,  108,   82,   98,  158,
            8,  113,  160,  103,  104,  105,  106,   13,  108,  109,
          110,  123,  122,  113,  157,  115,  116,  117,  118,    9,
           10,   11,  156,   71,  124,  157,  122,  127,  128,  129,
          130,   37,   38,    8,   82,  160,  156,   13,  134,  156,
           30,  156,   32,   33,   34,   35,  158,  157,  148,  159,
          122,  161,   80,    1,   74,  133,  156,  157,  158,  156,
           80,    1,    2,  159,   84,  161,   82,   87,   88,   89,
          157,   91,  157,   93,  122,   95,  161,  106,   98,  108,
          100,  101,  102,  103,  104,  105,  106,  159,  116,  109,
          110,    9,   10,   11,   13,  115,  116,  117,  118,    9,
           10,   11,  160,   16,  124,   81,  122,  127,  128,  129,
          130,  159,   30,  161,   32,   33,   34,   13,  134,  156,
           30,  156,   32,   33,  153,  153,  154,  155,   70,    9,
           10,   11,   80,   80,   74,  160,  156,  157,  158,   14,
           80,   37,   38,  159,   84,  161,  152,   87,   88,   89,
           30,   91,  160,   93,   14,   95,   37,   38,   98,   16,
          100,  101,  102,  103,  104,  105,  106,   70,   82,  109,
          110,   82,   33,   34,   35,  115,  116,  117,  118,   16,
            1,    2,   10,   11,  124,  160,   85,  127,  128,  129,
          130,    9,   10,   11,   82,   11,   14,  157,    9,   10,
           11,  161,   30,   85,   53,   54,   55,  154,   57,  157,
           31,  122,   30,  161,   30,  157,  156,  157,  158,   30,
           69,   32,   33,   34,   35,   36,   37,   38,   39,   40,
           41,   42,   43,   44,   45,   46,   47,   48,   49,   50,
           51,   52,   53,   54,   55,  144,   57,  161,  159,   16,
          161,    1,    2,   74,  157,   16,  152,  157,   69,   80,
          116,  161,  144,   84,   69,   70,   87,   88,   89,   16,
           91,   16,   93,  161,   95,   75,   76,   98,   30,  135,
          136,   31,  103,  104,  105,    1,    2,   31,  109,  110,
            9,   10,   11,   31,  115,  116,   50,   51,   52,   50,
           51,   52,   31,  124,  160,   75,   76,  101,  102,  111,
          112,   30,  156,  157,   31,   31,  156,  157,  156,  157,
           31,   31,   57,   38,   74,   33,   69,   80,   70,   70,
           80,   70,   89,   70,   84,  156,  157,   87,   88,   89,
           70,   91,   70,   93,   70,   95,   70,   96,   98,   71,
           77,   82,   85,  103,  104,  105,    1,    2,   74,  109,
          110,   82,   82,   97,   80,  115,  116,   85,   84,   92,
          106,   87,   88,   89,  124,   91,   90,   93,  133,   95,
          128,   94,   98,  147,  116,   97,   31,  103,  104,  105,
            1,    2,   97,  109,  110,   97,   97,  100,  144,  115,
          116,  100,  106,  128,  113,  161,  156,  157,  124,   -1,
           -1,  151,   -1,   -1,  114,   -1,   -1,   -1,   -1,   -1,
           31,   -1,   -1,   -1,  131,  131,   -1,   -1,   -1,   74,
           -1,   -1,   -1,   -1,  132,   80,  133,  133,  133,   84,
          156,  157,   87,   88,   89,   -1,   91,   -1,   93,   -1,
           95,  144,   -1,   98,   -1,  147,  147,  147,  103,  104,
          105,    1,    2,   74,  109,  110,  147,  147,  147,   80,
          115,  116,  147,   84,  151,  153,   87,   88,   89,  124,
           91,   31,   93,  152,   95,  156,  156,   98,  156,  156,
          156,  156,  103,  104,  105,  156,  156,  156,  109,  110,
           50,   51,  156,  156,  115,  116,   56,  156,   58,  156,
          156,  156,  157,  124,  156,  156,  156,  156,  156,  156,
           70,  156,  156,  156,  156,  156,  156,  156,   78,   79,
          156,  158,  157,  157,   74,  157,   86,  157,  157,  157,
           80,  157,  157,  157,   84,  156,  157,   87,   88,   89,
          157,   91,  157,   93,  157,   95,  157,  157,   98,  158,
          158,  158,  158,  103,  104,  105,   50,   51,  158,  109,
          110,  158,   56,  158,   58,  115,  116,  158,  158,  158,
          158,  158,  158,  158,  124,  135,   70,  137,  138,  139,
          140,  141,  142,  143,   78,   79,  158,  158,  158,  149,
          150,  158,   86,  158,  158,  158,  158,  158,  164,  159,
          158,  158,  158,  158,  158,   -1,  156,  157,  159,  162,
          159,  159,  159,  159,  159,  159,  159,  159,  159,  159,
          159,  159,  159,  159,  159,  159,  159,   -1,  160,  160,
          160,  160,  160,  160,  160,  160,  160,  160,  160,  160,
          160,  135,  160,  137,  138,  139,  140,  141,  142,  143,
          160,  160,  160,  160,  160,  149,  150,  160,  160,  163,
           -1,  162,   -1,  163,  163,  159,  163,  163,  163,   -1,
          163,  163,  163,  163,  163,  163,  163,  163,  163
    );

    protected $actionBase = array(
            0,  229,  310,  390,  470,  103,  325,  325,  784,   -2,
           -2,  149,   -2,   -2,   -2,  660,  765,  799,  765,  589,
          694,  870,  870,  870,  252,  404,  404,  404,  514,  177,
          177,  918,  434,  118,  295,  313,  240,  491,  491,  491,
          491,  138,  138,  491,  491,  491,  491,  491,  491,  491,
          491,  491,  491,  491,  491,  491,  491,  491,  491,  491,
          491,  491,  491,  491,  491,  491,  491,  491,  491,  491,
          491,  491,  491,  491,  491,  491,  491,  491,  491,  491,
          491,  491,  491,  491,  491,  491,  491,  491,  491,  491,
          491,  491,  491,  491,  491,  491,  491,  491,  491,  491,
          491,  491,  491,  491,  491,  491,  491,  491,  491,  491,
          491,  491,  491,  491,  491,  491,  491,  491,  491,  491,
          491,  491,  491,  491,  491,  491,  491,  491,  491,  491,
          491,  491,  491,  491,  491,  491,   89,  206,  773,  550,
          535,  775,  776,  777,  912,  709,  913,  856,  857,  700,
          858,  859,  862,  863,  864,  855,  865,  935,  866,  599,
          599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
          599,  322,  592,  285,  319,  232,   44,  691,  691,  691,
          691,  691,  691,  691,  182,  182,  182,  182,  182,  182,
          182,  182,  182,  182,  182,  182,  182,  182,  182,  182,
          182,  182,  582,  530,  530,  530,  594,  860,  658,  926,
          926,  926,  926,  926,  926,  926,  926,  926,  926,  926,
          926,  926,  926,  926,  926,  926,  926,  926,  926,  926,
          926,  926,  926,  926,  926,  926,  926,  926,  926,  926,
          926,  926,  926,  926,  926,  926,  926,  926,  926,  926,
          926,  926,  926,  500,  -21,  -21,  492,  702,  420,  355,
          216,  549,  151,   26,   26,  331,  331,  331,  331,  331,
           46,   46,    5,    5,    5,    5,  153,  188,  188,  188,
          188,  121,  121,  121,  121,  314,  314,  394,  394,  362,
          300,  298,  499,  499,  499,  499,  499,  499,  499,  499,
          499,  499,   67,  656,  656,  659,  659,  522,  554,  554,
          554,  554,  679,  -59,  -59,  381,  462,  462,  462,  528,
          717,  854,  382,  382,  382,  382,  382,  382,  561,  561,
          561,   -3,   -3,   -3,  692,  115,  137,  115,  137,  678,
          732,  450,  732,  338,  677,  -15,  510,  810,  468,  707,
          850,  711,  853,  572,  735,  267,  529,  654,  674,  463,
          529,  529,  529,  529,  654,  610,  640,  608,  463,  529,
          463,  718,  323,  496,   89,  570,  507,  675,  778,  293,
          670,  780,  290,  373,  332,  566,  278,  435,  733,  781,
          914,  917,  385,  715,  675,  675,  675,  352,  511,  278,
           -8,  605,  605,  605,  605,  156,  605,  605,  605,  605,
          251,  276,  375,  402,  779,  657,  657,  690,  872,  869,
          869,  657,  689,  657,  690,  874,  874,  874,  874,  657,
          657,  657,  657,  869,  869,  869,  688,  869,  239,  703,
          704,  704,  874,  742,  743,  657,  657,  712,  869,  869,
          869,  712,  695,  874,  701,  741,  277,  869,  874,  672,
          689,  672,  657,  701,  672,  689,  689,  672,   22,  666,
          668,  873,  875,  887,  790,  662,  685,  879,  880,  876,
          878,  871,  699,  744,  745,  497,  669,  671,  673,  680,
          719,  682,  713,  674,  667,  667,  667,  655,  720,  655,
          667,  667,  667,  667,  667,  667,  667,  667,  916,  646,
          731,  714,  653,  749,  553,  573,  791,  664,  811,  900,
          893,  867,  919,  881,  898,  655,  920,  739,  247,  643,
          882,  783,  786,  655,  883,  655,  792,  655,  902,  812,
          686,  813,  814,  667,  910,  921,  923,  924,  925,  927,
          928,  929,  930,  684,  931,  750,  696,  894,  299,  877,
          718,  729,  705,  788,  751,  820,  328,  932,  823,  655,
          655,  794,  785,  655,  795,  756,  740,  890,  757,  895,
          933,  664,  708,  896,  655,  706,  825,  934,  328,  681,
          683,  888,  661,  761,  886,  911,  885,  796,  649,  663,
          829,  830,  831,  693,  763,  891,  892,  889,  764,  803,
          665,  805,  697,  832,  807,  884,  768,  833,  834,  899,
          676,  730,  710,  698,  687,  809,  835,  897,  769,  770,
          771,  848,  772,  849,    0,    0,    0,    0,    0,    0,
            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
            0,    0,    0,    0,  138,  138,  138,  138,   -2,   -2,
           -2,   -2,    0,    0,   -2,    0,    0,    0,  138,  138,
          138,  138,  138,  138,  138,  138,  138,  138,  138,  138,
          138,  138,  138,  138,  138,  138,  138,  138,  138,  138,
          138,  138,  138,  138,    0,    0,  138,  138,  138,  138,
          138,  138,  138,  138,  138,  138,  138,  138,  138,  138,
          138,  138,  138,  138,  138,  138,  138,  138,  138,  138,
          138,  138,  138,  138,  138,  138,  138,  138,  138,  138,
          138,  138,  138,  138,  138,  138,  138,  138,  138,  138,
          138,  138,  138,  138,  138,  138,  138,  138,  138,  138,
          138,  138,  138,  138,  138,  138,  138,  138,  138,  138,
          138,  138,  138,  138,  138,  138,  138,  138,  138,  138,
          138,  138,  138,  138,  138,  138,  138,  138,  138,  138,
          138,  138,  138,  138,  138,  138,  138,  138,  138,  599,
          599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
          599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
          599,  599,    0,    0,    0,    0,    0,    0,    0,    0,
            0,    0,    0,    0,  599,  -21,  -21,  -21,  -21,  599,
          -21,  -21,  -21,  -21,  -21,  -21,  -21,  599,  599,  599,
          599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
          599,  599,  599,  599,  599,  -21,  599,  599,  599,  -21,
          382,  -21,  382,  382,  382,  382,  382,  382,  382,  382,
          382,  382,  382,  382,  382,  382,  382,  382,  382,  382,
          382,  382,  382,  382,  382,  382,  382,  382,  382,  382,
          382,  382,  382,  382,  382,  382,  382,  382,  382,  382,
          382,  382,  382,  382,  382,  382,  599,    0,    0,  599,
          -21,  599,  -21,  599,  -21,  -21,  599,  599,  599,  599,
          599,  599,  599,  -21,  -21,  -21,  -21,  -21,  -21,    0,
          561,  561,  561,  561,  -21,  -21,  -21,  -21,  382,  382,
          382,  382,  382,  382,  259,  382,  382,  382,  382,  382,
          382,  382,  382,  382,  382,  382,  561,  561,   -3,   -3,
          382,  382,  382,  382,  382,  259,  382,  382,  463,  689,
          689,  689,  137,  137,  137,    0,    0,    0,    0,    0,
            0,    0,    0,    0,    0,    0,    0,  137,  463,    0,
          463,    0,  382,  463,  689,  463,  657,  137,  689,  689,
          463,  869,  616,  616,  616,  616,  328,  278,    0,    0,
          689,  689,    0,    0,    0,    0,    0,  689,    0,    0,
            0,    0,    0,    0,  869,    0,    0,    0,    0,    0,
          667,  247,    0,  705,  335,    0,    0,    0,    0,    0,
            0,  705,  335,  347,  347,    0,  684,  667,  667,  667,
            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
            0,    0,    0,    0,    0,    0,    0,  328
    );

    protected $actionDefault = array(
            3,32767,32767,32767,32767,32767,32767,32767,32767,32767,
        32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,
        32767,32767,32767,32767,32767,  544,  544,  499,32767,32767,
        32767,32767,32767,32767,32767,32767,32767,  299,  299,  299,
        32767,32767,32767,  532,  532,  532,  532,  532,  532,  532,
          532,  532,  532,  532,32767,32767,32767,32767,32767,32767,
          383,32767,32767,32767,32767,32767,32767,32767,32767,32767,
        32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,
        32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,
        32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,
        32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,
        32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,
        32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,
        32767,32767,32767,32767,32767,32767,32767,32767,32767,  389,
          549,32767,32767,32767,32767,32767,32767,32767,32767,32767,
        32767,32767,32767,32767,32767,32767,32767,32767,32767,  364,
          365,  367,  368,  298,  552,  533,  247,  390,  548,  297,
          249,  327,  503,32767,32767,32767,  329,  122,  258,  203,
          502,  125,  296,  234,  382,  384,  328,  303,  308,  309,
          310,  311,  312,  313,  314,  315,  316,  317,  318,  319,
          320,  302,  458,  361,  360,  359,  460,32767,  459,  496,
          496,  499,32767,32767,32767,32767,32767,32767,32767,32767,
        32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,
        32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,
        32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,
        32767,32767,32767,  325,  487,  486,  326,  456,  330,  457,
          333,  461,  464,  331,  332,  349,  350,  347,  348,  351,
          462,  463,  480,  481,  478,  479,  301,  352,  353,  354,
          355,  482,  483,  484,  485,32767,32767,  543,  543,32767,
        32767,  282,32767,32767,32767,32767,32767,32767,32767,32767,
        32767,32767,32767,  340,  341,  471,  472,32767,  238,  238,
          238,  238,  283,  238,32767,32767,32767,32767,32767,32767,
        32767,32767,32767,32767,32767,32767,32767,32767,  335,  336,
          334,  466,  467,  465,  432,32767,32767,32767,  434,32767,
        32767,32767,32767,32767,32767,32767,32767,32767,  504,32767,
        32767,32767,32767,32767,  517,  421,  171,32767,  413,32767,
          171,  171,  171,  171,32767,  222,  224,  167,32767,  171,
        32767,  490,32767,32767,32767,32767,  522,  345,32767,32767,
          116,32767,32767,32767,  559,32767,  517,32767,  116,32767,
        32767,32767,32767,  358,  337,  338,  339,32767,32767,  521,
          515,  474,  475,  476,  477,32767,  468,  469,  470,  473,
        32767,32767,32767,32767,32767,32767,32767,32767,  429,  435,
          435,32767,32767,32767,32767,32767,32767,32767,32767,32767,
        32767,32767,32767,32767,  520,  519,32767,  414,  498,  188,
          186,  186,32767,  208,  208,32767,32767,  190,  491,  510,
        32767,  190,  173,32767,  400,  175,  498,32767,32767,  240,
        32767,  240,32767,  400,  240,32767,32767,  240,32767,  415,
          439,32767,32767,32767,32767,32767,32767,32767,32767,32767,
        32767,32767,32767,32767,32767,32767,  379,  380,  493,  506,
        32767,  507,32767,  413,  343,  344,  346,  322,32767,  324,
          369,  370,  371,  372,  373,  374,  375,  377,32767,  419,
        32767,  422,32767,32767,32767,  257,32767,  557,32767,32767,
          306,  557,32767,32767,32767,  551,32767,32767,  300,32767,
        32767,32767,32767,  253,32767,  169,32767,  541,32767,  558,
        32767,  515,32767,  342,32767,32767,32767,32767,32767,32767,
        32767,32767,32767,  516,32767,32767,32767,32767,  229,32767,
          452,32767,  116,32767,32767,32767,  189,32767,32767,  304,
          248,32767,32767,  550,32767,32767,32767,32767,32767,32767,
        32767,32767,  114,32767,  170,32767,32767,32767,  191,32767,
        32767,  515,32767,32767,32767,32767,32767,32767,32767,  295,
        32767,32767,32767,32767,32767,32767,32767,  515,32767,32767,
          233,32767,32767,32767,32767,32767,32767,32767,32767,32767,
          415,32767,  276,32767,32767,32767,32767,32767,32767,32767,
        32767,32767,32767,32767,  127,  127,    3,  127,  127,  260,
            3,  260,  127,  260,  260,  127,  127,  127,  127,  127,
          127,  127,  127,  127,  127,  216,  219,  208,  208,  164,
          127,  127,  268
    );

    protected $goto = array(
          166,  140,  140,  140,  166,  187,  168,  144,  147,  141,
          142,  143,  149,  163,  163,  163,  163,  144,  144,  165,
          165,  165,  165,  165,  165,  165,  165,  165,  165,  165,
          138,  159,  160,  161,  162,  184,  139,  185,  494,  495,
          377,  496,  500,  501,  502,  503,  504,  505,  506,  507,
          970,  164,  145,  146,  148,  171,  176,  186,  203,  253,
          256,  258,  260,  263,  264,  265,  266,  267,  268,  269,
          277,  278,  279,  280,  303,  304,  328,  329,  330,  394,
          395,  396,  543,  188,  189,  190,  191,  192,  193,  194,
          195,  196,  197,  198,  199,  200,  201,  150,  151,  152,
          167,  153,  169,  154,  204,  170,  155,  156,  157,  205,
          158,  136,  621,  561,  757,  561,  561,  561,  561,  561,
          561,  561,  561,  561,  561,  561,  561,  561,  561,  561,
          561,  561,  561,  561,  561,  561,  561,  561,  561,  561,
          561,  561,  561,  561,  561,  561,  561,  561,  561,  561,
          561,  561,  561,  561,  561,  561,  561,  561,  561, 1113,
          629, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113,
         1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113,
         1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113,
         1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113,
         1113, 1113, 1113, 1113, 1113,  758,  520,  531,  509,  656,
          556, 1183,  750,  509,  592,  786, 1183,  888,  612,  613,
          884,  617,  618,  624,  626,  631,  633,  817,  855,  855,
          855,  855,  850,  856,  174,  891,  891, 1205, 1205,  177,
          178,  179,  401,  402,  403,  404,  173,  202,  206,  208,
          257,  259,  261,  262,  270,  271,  272,  273,  274,  275,
          281,  282,  283,  284,  305,  306,  331,  332,  333,  406,
          407,  408,  409,  175,  180,  254,  255,  181,  182,  183,
          498,  498,  498,  498,  498,  498,  861,  498,  498,  498,
          498,  498,  498,  498,  498,  498,  498,  510,  586,  538,
          601,  602,  510,  545,  546,  547,  548,  549,  550,  551,
          552,  554,  587, 1209,  560,  350,  560,  560,  560,  560,
          560,  560,  560,  560,  560,  560,  560,  560,  560,  560,
          560,  560,  560,  560,  560,  560,  560,  560,  560,  560,
          560,  560,  560,  560,  560,  560,  560,  560,  560,  560,
          560,  560,  560,  560,  560,  560,  560,  560,  560,  560,
          400,  607,  537,  537,  569,  533,  909,  535,  535,  497,
          499,  525,  541,  570,  573,  584,  591,  298,  296,  296,
          296,  298,  289,  299,  611,  378,  511,  614,  595,  947,
          375,  511,  437,  437,  437,  437,  437,  437, 1163,  437,
          437,  437,  437,  437,  437,  437,  437,  437,  437, 1077,
          948,  338, 1175,  321, 1077,  898,  898,  898,  898,  606,
          898,  898, 1217, 1217, 1202,  753,  576,  605,  756, 1077,
         1077, 1077, 1077, 1077, 1077, 1069,  384,  384,  384,  391,
         1217,  877,  859,  857,  859,  655,  466,  512,  886,  881,
          753,  384,  753,  384,  968,  384,  895,  385,  588,  353,
          414,  384, 1231, 1019,  542, 1197, 1197, 1197,  568, 1094,
          386,  386,  386,  904,  915,  515, 1029,   19,   15,  372,
          389,  915,  940,  448,  450,  632,  340, 1216, 1216, 1114,
          615,  938,  840,  555,  775,  386,  913, 1070, 1073, 1074,
          399, 1069, 1182,  660,   23, 1216,  773, 1182,  544,  603,
         1066, 1219, 1071, 1174, 1071,  519, 1199, 1199, 1199, 1089,
         1088, 1072,  343,  523,  534,  519,  519,  772,  351,  352,
           13,  579,  583,  627, 1061,  388,  782,  562,  771,  515,
          783, 1181,    3,    4,  918,  956,  865,  451,  574, 1160,
          464,    0,    0,    0,    0,    0,    0,    0,    0,    0,
            0,    0,    0,    0,  514,  529,    0,    0,    0,    0,
          514,    0,  529,    0,    0,    0,    0,  610,  513,  516,
          439,  440, 1067,  619,    0,    0,    0,    0,    0,    0,
            0,    0,    0,    0,  780, 1224,    0,    0,    0,    0,
            0,  524,    0,    0,    0,    0,    0,    0,    0,    0,
            0,  778,    0,    0,    0,    0,    0,    0,    0,    0,
            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
            0,    0,    0,    0,    0,    0,    0,    0,  301,  301
    );

    protected $gotoCheck = array(
           43,   43,   43,   43,   43,   43,   43,   43,   43,   43,
           43,   43,   43,   43,   43,   43,   43,   43,   43,   43,
           43,   43,   43,   43,   43,   43,   43,   43,   43,   43,
           43,   43,   43,   43,   43,   43,   43,   43,   43,   43,
           43,   43,   43,   43,   43,   43,   43,   43,   43,   43,
           43,   43,   43,   43,   43,   43,   43,   43,   43,   43,
           43,   43,   43,   43,   43,   43,   43,   43,   43,   43,
           43,   43,   43,   43,   43,   43,   43,   43,   43,   43,
           43,   43,   43,   43,   43,   43,   43,   43,   43,   43,
           43,   43,   43,   43,   43,   43,   43,   43,   43,   43,
           43,   43,   43,   43,   43,   43,   43,   43,   43,   43,
           43,   43,   57,   69,   15,   69,   69,   69,   69,   69,
           69,   69,   69,   69,   69,   69,   69,   69,   69,   69,
           69,   69,   69,   69,   69,   69,   69,   69,   69,   69,
           69,   69,   69,   69,   69,   69,   69,   69,   69,   69,
           69,   69,   69,   69,   69,   69,   69,   69,   69,  128,
            9,  128,  128,  128,  128,  128,  128,  128,  128,  128,
          128,  128,  128,  128,  128,  128,  128,  128,  128,  128,
          128,  128,  128,  128,  128,  128,  128,  128,  128,  128,
          128,  128,  128,  128,  128,  128,  128,  128,  128,  128,
          128,  128,  128,  128,  128,   16,  102,   32,   69,   32,
           32,  120,    6,   69,   32,   29,  120,   32,   32,   32,
           32,   32,   32,   32,   32,   32,   32,   50,   69,   69,
           69,   69,   69,   69,   27,   77,   77,   77,   77,   27,
           27,   27,   27,   27,   27,   27,   27,   27,   27,   27,
           27,   27,   27,   27,   27,   27,   27,   27,   27,   27,
           27,   27,   27,   27,   27,   27,   27,   27,   27,   27,
           27,   27,   27,   27,   27,   27,   27,   27,   27,   27,
          119,  119,  119,  119,  119,  119,   33,  119,  119,  119,
          119,  119,  119,  119,  119,  119,  119,  119,   67,  110,
           67,   67,  119,  111,  111,  111,  111,  111,  111,  111,
          111,  111,  111,  142,   57,   72,   57,   57,   57,   57,
           57,   57,   57,   57,   57,   57,   57,   57,   57,   57,
           57,   57,   57,   57,   57,   57,   57,   57,   57,   57,
           57,   57,   57,   57,   57,   57,   57,   57,   57,   57,
           57,   57,   57,   57,   57,   57,   57,   57,   57,   57,
           51,   51,   51,   51,   51,   51,   84,   51,   51,   51,
           51,   51,   51,   51,   51,   51,   51,    5,    5,    5,
            5,    5,    5,    5,   63,   46,  124,   63,  129,   98,
           63,  124,   57,   57,   57,   57,   57,   57,  133,   57,
           57,   57,   57,   57,   57,   57,   57,   57,   57,   57,
           98,  127,   82,  127,   57,   57,   57,   57,   57,   49,
           57,   57,  144,  144,  140,   11,   40,   40,   14,   57,
           57,   57,   57,   57,   57,   82,   13,   13,   13,   48,
          144,   14,   14,   14,   14,   14,   57,   14,   14,   14,
           11,   13,   11,   13,  102,   13,   79,   11,   70,   70,
           70,   13,   13,  103,    2,    9,    9,    9,    2,   34,
          125,  125,  125,   81,   13,   13,   34,   34,   34,   34,
           17,   13,    8,    8,    8,    8,   18,  143,  143,    8,
            8,    8,    9,   34,   25,  125,   85,   82,   82,   82,
          125,   82,  121,   74,   34,  143,   24,  121,   47,   34,
          116,  143,   82,   82,   82,   47,  121,  121,  121,  126,
          126,   82,   58,   58,   58,   47,   47,   23,   72,   72,
           58,   62,   62,   62,  114,   12,   23,   12,   23,   13,
           26,  121,   30,   30,   86,  100,   71,   65,   66,  132,
          109,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
           -1,   -1,   -1,   -1,    9,    9,   -1,   -1,   -1,   -1,
            9,   -1,    9,   -1,   -1,   -1,   -1,   13,    9,    9,
            9,    9,   13,   13,   -1,   -1,   -1,   -1,   -1,   -1,
           -1,   -1,   -1,   -1,    9,    9,   -1,   -1,   -1,   -1,
           -1,  102,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
           -1,    9,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
           -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
           -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,    5,    5
    );

    protected $gotoBase = array(
            0,    0, -172,    0,    0,  353,  201,    0,  477,  149,
            0,  110,  195,  117,  426,  112,  203,  140,  171,    0,
            0,    0,    0,  168,  164,  157,  119,   27,    0,  205,
         -118,    0, -428,  266,   51,    0,    0,    0,    0,    0,
          388,    0,    0,  -24,    0,    0,  345,  484,  146,  133,
          209,   75,    0,    0,    0,    0,    0,  107,  161,    0,
            0,    0,  222,  -77,    0,  106,   97, -343,    0,  -94,
          135,  123, -129,    0,  129,    0,    0,  -50,    0,  143,
            0,  159,   64,    0,  338,  132,  122,    0,    0,    0,
            0,    0,    0,    0,    0,    0,    0,    0,   98,    0,
          121,    0,  165,  156,    0,    0,    0,    0,    0,   87,
          273,  259,    0,    0,  114,    0,  150,    0,    0,   -5,
          -91,  200,    0,    0,   84,  154,  202,   77,  -48,  178,
            0,    0,   93,  187,    0,    0,    0,    0,    0,    0,
          136,    0,  286,  167,  102,    0,    0
    );

    protected $gotoDefault = array(
        -32768,  468,  664,    2,  665,  835,  740,  748,  598,  482,
          630,  582,  380, 1193,  792,  793,  794,  381,  368,  483,
          379,  410,  405,  781,  774,  776,  784,  172,  411,  787,
            1,  789,  518,  825, 1020,  365,  797,  366,  590,  799,
          527,  801,  802,  137,  382,  383,  528,  484,  390,  577,
          816,  276,  387,  818,  367,  819,  828,  371,  465,  455,
          460,  530,  557,  609,  432,  447,  571,  565,  536, 1086,
          566,  864,  349,  872,  661,  880,  883,  485,  558,  894,
          452,  902, 1099,  397,  908,  914,  919,  291,  922,  417,
          412,  585,  927,  928,    5,  932,  622,  623,    8,  312,
          955,  599,  969,  420, 1039, 1041,  486,  487,  522,  459,
          508,  526,  488, 1062,  441,  413, 1065,  433,  489,  490,
          434,  435, 1083,  355, 1168,  354,  449,  320, 1155,  580,
         1118,  456, 1208, 1164,  348,  491,  492,  376, 1187,  392,
         1203,  438, 1210, 1218,  344,  540,  567
    );

    protected $ruleToNonTerminal = array(
            0,    1,    3,    3,    2,    5,    5,    6,    6,    6,
            6,    6,    6,    6,    6,    6,    6,    6,    6,    6,
            6,    6,    6,    6,    6,    6,    6,    6,    6,    6,
            6,    6,    6,    6,    6,    6,    6,    6,    6,    6,
            6,    6,    6,    6,    6,    6,    6,    6,    6,    6,
            6,    6,    6,    6,    6,    6,    6,    6,    6,    6,
            6,    6,    6,    6,    6,    6,    6,    6,    6,    6,
            6,    6,    6,    6,    6,    6,    6,    7,    7,    7,
            7,    7,    7,    7,    8,    8,    9,   10,   11,   11,
           12,   12,   13,    4,    4,    4,    4,    4,    4,    4,
            4,    4,    4,    4,   18,   18,   19,   19,   21,   21,
           17,   17,   22,   22,   23,   23,   24,   24,   25,   25,
           20,   20,   26,   28,   28,   29,   30,   30,   32,   31,
           31,   31,   31,   33,   33,   33,   33,   33,   33,   33,
           33,   33,   33,   33,   33,   33,   33,   33,   33,   33,
           33,   33,   33,   33,   33,   33,   33,   33,   33,   33,
           33,   33,   14,   14,   54,   54,   56,   55,   55,   48,
           48,   58,   58,   59,   59,   60,   60,   61,   61,   15,
           16,   16,   16,   64,   64,   64,   65,   65,   68,   68,
           66,   66,   70,   70,   41,   41,   50,   50,   53,   53,
           53,   52,   52,   71,   42,   42,   42,   42,   72,   72,
           73,   73,   74,   74,   39,   39,   35,   35,   75,   37,
           37,   76,   36,   36,   38,   38,   49,   49,   49,   62,
           62,   78,   78,   79,   79,   81,   81,   81,   80,   80,
           63,   63,   82,   82,   82,   83,   83,   84,   84,   84,
           44,   44,   85,   85,   85,   45,   45,   86,   86,   87,
           87,   67,   88,   88,   88,   88,   93,   93,   94,   94,
           95,   95,   95,   95,   95,   96,   97,   97,   92,   92,
           89,   89,   91,   91,   99,   99,   98,   98,   98,   98,
           98,   98,   90,   90,  101,  100,  100,   46,   46,   40,
           40,   43,   43,   43,   43,   43,   43,   43,   43,   43,
           43,   43,   43,   43,   43,   43,   43,   43,   43,   43,
           43,   43,   43,   43,   43,   43,   43,   43,   43,   43,
           43,   43,   43,   43,   43,   43,   43,   43,   43,   43,
           43,   43,   43,   43,   43,   43,   43,   43,   43,   43,
           43,   43,   43,   43,   43,   43,   43,   43,   43,   43,
           43,   43,   43,   43,   43,   43,   43,   43,   43,   43,
           43,   43,   43,   43,   43,   43,   43,   43,   43,   43,
           43,   43,   43,   43,   43,   43,   43,   34,   34,   47,
           47,  106,  106,  107,  107,  107,  107,  113,  102,  102,
          109,  109,  115,  115,  116,  117,  118,  118,  118,  118,
          118,  118,  118,   69,   69,   57,   57,   57,   57,  103,
          103,  122,  122,  119,  119,  123,  123,  123,  123,  104,
          104,  104,  108,  108,  108,  114,  114,  128,  128,  128,
          128,  128,  128,  128,  128,  128,  128,  128,  128,  128,
           27,   27,   27,   27,   27,   27,  130,  130,  130,  130,
          130,  130,  130,  130,  130,  130,  130,  130,  130,  130,
          130,  130,  130,  130,  130,  130,  130,  130,  130,  130,
          130,  130,  130,  130,  130,  130,  130,  130,  130,  130,
          112,  112,  105,  105,  105,  105,  129,  129,  132,  132,
          131,  131,  133,  133,   51,   51,   51,   51,  135,  135,
          134,  134,  134,  134,  134,  136,  136,  121,  121,  124,
          124,  120,  120,  138,  137,  137,  137,  137,  125,  125,
          125,  125,  111,  111,  126,  126,  126,  126,   77,  139,
          139,  140,  140,  140,  110,  110,  141,  141,  142,  142,
          142,  142,  142,  127,  127,  127,  127,  144,  145,  143,
          143,  143,  143,  143,  143,  143,  146,  146,  146
    );

    protected $ruleToLength = array(
            1,    1,    2,    0,    1,    1,    1,    1,    1,    1,
            1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
            1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
            1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
            1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
            1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
            1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
            1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
            1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
            1,    1,    1,    1,    1,    1,    1,    3,    5,    4,
            3,    4,    2,    3,    1,    1,    7,    6,    3,    1,
            3,    1,    3,    1,    1,    3,    1,    3,    1,    2,
            3,    1,    3,    3,    1,    3,    2,    0,    1,    1,
            1,    1,    1,    3,    5,    8,    3,    5,    9,    3,
            2,    3,    2,    3,    2,    3,    3,    3,    3,    1,
            2,    2,    5,    7,    9,    5,    6,    3,    3,    2,
            2,    1,    1,    1,    0,    2,    8,    0,    4,    1,
            3,    0,    1,    0,    1,    0,    1,    1,    1,   10,
            7,    6,    5,    1,    2,    2,    0,    2,    0,    2,
            0,    2,    1,    3,    1,    4,    1,    4,    1,    1,
            4,    1,    3,    3,    3,    4,    4,    5,    0,    2,
            4,    3,    1,    1,    1,    4,    0,    2,    3,    0,
            2,    4,    0,    2,    0,    3,    1,    2,    1,    1,
            0,    1,    3,    4,    6,    1,    1,    1,    0,    1,
            0,    2,    2,    3,    3,    1,    3,    1,    2,    2,
            3,    1,    1,    2,    4,    3,    1,    1,    3,    2,
            0,    1,    3,    3,    9,    3,    1,    3,    0,    2,
            4,    5,    4,    4,    4,    3,    1,    1,    1,    3,
            1,    1,    0,    1,    1,    2,    1,    1,    1,    1,
            1,    1,    1,    3,    1,    1,    3,    3,    1,    0,
            1,    1,    3,    3,    4,    4,    1,    2,    3,    3,
            3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
            3,    2,    2,    2,    2,    3,    3,    3,    3,    3,
            3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
            3,    3,    3,    2,    2,    2,    2,    3,    3,    3,
            3,    3,    3,    3,    3,    3,    3,    1,    3,    5,
            4,    3,    4,    4,    2,    2,    2,    2,    2,    2,
            2,    2,    2,    2,    2,    2,    2,    2,    1,    1,
            1,    3,    2,    1,    2,   10,   11,    3,    3,    2,
            4,    4,    3,    4,    4,    4,    4,    7,    3,    2,
            0,    4,    1,    3,    2,    1,    2,    2,    4,    6,
            2,    2,    4,    1,    1,    1,    1,    1,    1,    1,
            1,    1,    1,    1,    1,    3,    3,    4,    4,    0,
            2,    1,    0,    1,    1,    0,    1,    1,    1,    1,
            1,    1,    1,    1,    1,    1,    1,    1,    3,    2,
            1,    3,    1,    4,    3,    1,    3,    3,    3,    3,
            3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
            3,    3,    3,    3,    2,    2,    2,    2,    3,    3,
            3,    3,    3,    3,    3,    3,    5,    4,    4,    3,
            1,    3,    1,    1,    3,    3,    0,    2,    0,    1,
            3,    1,    3,    1,    1,    1,    1,    1,    6,    4,
            3,    4,    2,    4,    4,    1,    3,    1,    2,    1,
            1,    4,    1,    1,    3,    6,    4,    4,    4,    4,
            1,    4,    0,    1,    1,    3,    1,    1,    4,    3,
            1,    1,    1,    0,    0,    2,    3,    1,    3,    1,
            4,    2,    2,    2,    2,    1,    2,    1,    1,    1,
            4,    3,    3,    3,    6,    3,    1,    1,    1
    );

    protected function initReduceCallbacks() {
        $this->reduceCallbacks = [
            0 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            1 => function ($stackPos) {
                 $this->semValue = $this->handleNamespaces($this->semStack[$stackPos-(1-1)]);
            },
            2 => function ($stackPos) {
                 if (is_array($this->semStack[$stackPos-(2-2)])) { $this->semValue = array_merge($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)]); } else { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; };
            },
            3 => function ($stackPos) {
                 $this->semValue = array();
            },
            4 => function ($stackPos) {
                 $startAttributes = $this->lookaheadStartAttributes; if (isset($startAttributes['comments'])) { $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); } else { $nop = null; };
            if ($nop !== null) { $this->semStack[$stackPos-(1-1)][] = $nop; } $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            5 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            6 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            7 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            8 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            9 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            10 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            11 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            12 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            13 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            14 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            15 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            16 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            17 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            18 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            19 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            20 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            21 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            22 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            23 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            24 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            25 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            26 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            27 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            28 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            29 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            30 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            31 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            32 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            33 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            34 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            35 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            36 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            37 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            38 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            39 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            40 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            41 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            42 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            43 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            44 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            45 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            46 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            47 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            48 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            49 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            50 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            51 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            52 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            53 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            54 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            55 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            56 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            57 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            58 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            59 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            60 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            61 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            62 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            63 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            64 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            65 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            66 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            67 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            68 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            69 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            70 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            71 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            72 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            73 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            74 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            75 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            76 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            77 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            78 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            79 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            80 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            81 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            82 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            83 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            84 => function ($stackPos) {
                 $this->semValue = new Node\Identifier($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            85 => function ($stackPos) {
                 $this->semValue = new Node\Identifier($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            86 => function ($stackPos) {
                 $this->semValue = new Node\Identifier($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            87 => function ($stackPos) {
                 $this->semValue = new Node\Identifier($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            88 => function ($stackPos) {
                 $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            89 => function ($stackPos) {
                 $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            90 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            91 => function ($stackPos) {
                 $this->semValue = new Name(substr($this->semStack[$stackPos-(1-1)], 1), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            92 => function ($stackPos) {
                 $this->semValue = new Expr\Variable(substr($this->semStack[$stackPos-(1-1)], 1), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            93 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            94 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            95 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            96 => function ($stackPos) {
                 $this->semValue = new Stmt\HaltCompiler($this->lexer->handleHaltCompiler(), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            97 => function ($stackPos) {
                 $this->semValue = new Stmt\Namespace_($this->semStack[$stackPos-(3-2)], null, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            $this->semValue->setAttribute('kind', Stmt\Namespace_::KIND_SEMICOLON);
            $this->checkNamespace($this->semValue);
            },
            98 => function ($stackPos) {
                 $this->semValue = new Stmt\Namespace_($this->semStack[$stackPos-(5-2)], $this->semStack[$stackPos-(5-4)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes);
            $this->semValue->setAttribute('kind', Stmt\Namespace_::KIND_BRACED);
            $this->checkNamespace($this->semValue);
            },
            99 => function ($stackPos) {
                 $this->semValue = new Stmt\Namespace_(null, $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            $this->semValue->setAttribute('kind', Stmt\Namespace_::KIND_BRACED);
            $this->checkNamespace($this->semValue);
            },
            100 => function ($stackPos) {
                 $this->semValue = new Stmt\Use_($this->semStack[$stackPos-(3-2)], Stmt\Use_::TYPE_NORMAL, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            101 => function ($stackPos) {
                 $this->semValue = new Stmt\Use_($this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-2)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            },
            102 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(2-1)];
            },
            103 => function ($stackPos) {
                 $this->semValue = new Stmt\Const_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            104 => function ($stackPos) {
                 $this->semValue = Stmt\Use_::TYPE_FUNCTION;
            },
            105 => function ($stackPos) {
                 $this->semValue = Stmt\Use_::TYPE_CONSTANT;
            },
            106 => function ($stackPos) {
                 $this->semValue = new Stmt\GroupUse($this->semStack[$stackPos-(7-3)], $this->semStack[$stackPos-(7-6)], $this->semStack[$stackPos-(7-2)], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes);
            },
            107 => function ($stackPos) {
                 $this->semValue = new Stmt\GroupUse($this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-5)], Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes);
            },
            108 => function ($stackPos) {
                 $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
            },
            109 => function ($stackPos) {
                 $this->semValue = array($this->semStack[$stackPos-(1-1)]);
            },
            110 => function ($stackPos) {
                 $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
            },
            111 => function ($stackPos) {
                 $this->semValue = array($this->semStack[$stackPos-(1-1)]);
            },
            112 => function ($stackPos) {
                 $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
            },
            113 => function ($stackPos) {
                 $this->semValue = array($this->semStack[$stackPos-(1-1)]);
            },
            114 => function ($stackPos) {
                 $this->semValue = new Stmt\UseUse($this->semStack[$stackPos-(1-1)], null, Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); $this->checkUseUse($this->semValue, $stackPos-(1-1));
            },
            115 => function ($stackPos) {
                 $this->semValue = new Stmt\UseUse($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); $this->checkUseUse($this->semValue, $stackPos-(3-3));
            },
            116 => function ($stackPos) {
                 $this->semValue = new Stmt\UseUse($this->semStack[$stackPos-(1-1)], null, Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); $this->checkUseUse($this->semValue, $stackPos-(1-1));
            },
            117 => function ($stackPos) {
                 $this->semValue = new Stmt\UseUse($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); $this->checkUseUse($this->semValue, $stackPos-(3-3));
            },
            118 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)]; $this->semValue->type = Stmt\Use_::TYPE_NORMAL;
            },
            119 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(2-2)]; $this->semValue->type = $this->semStack[$stackPos-(2-1)];
            },
            120 => function ($stackPos) {
                 $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
            },
            121 => function ($stackPos) {
                 $this->semValue = array($this->semStack[$stackPos-(1-1)]);
            },
            122 => function ($stackPos) {
                 $this->semValue = new Node\Const_($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            123 => function ($stackPos) {
                 $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
            },
            124 => function ($stackPos) {
                 $this->semValue = array($this->semStack[$stackPos-(1-1)]);
            },
            125 => function ($stackPos) {
                 $this->semValue = new Node\Const_($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            126 => function ($stackPos) {
                 if (is_array($this->semStack[$stackPos-(2-2)])) { $this->semValue = array_merge($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)]); } else { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; };
            },
            127 => function ($stackPos) {
                 $this->semValue = array();
            },
            128 => function ($stackPos) {
                 $startAttributes = $this->lookaheadStartAttributes; if (isset($startAttributes['comments'])) { $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); } else { $nop = null; };
            if ($nop !== null) { $this->semStack[$stackPos-(1-1)][] = $nop; } $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            129 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            130 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            131 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            132 => function ($stackPos) {
                 throw new Error('__HALT_COMPILER() can only be used from the outermost scope', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            133 => function ($stackPos) {

        if ($this->semStack[$stackPos-(3-2)]) {
            $this->semValue = $this->semStack[$stackPos-(3-2)]; $attrs = $this->startAttributeStack[$stackPos-(3-1)]; $stmts = $this->semValue; if (!empty($attrs['comments'])) {$stmts[0]->setAttribute('comments', array_merge($attrs['comments'], $stmts[0]->getAttribute('comments', []))); };
        } else {
            $startAttributes = $this->startAttributeStack[$stackPos-(3-1)]; if (isset($startAttributes['comments'])) { $this->semValue = new Stmt\Nop($startAttributes + $this->endAttributes); } else { $this->semValue = null; };
            if (null === $this->semValue) { $this->semValue = array(); }
        }

            },
            134 => function ($stackPos) {
                 $this->semValue = new Stmt\If_($this->semStack[$stackPos-(5-2)], ['stmts' => is_array($this->semStack[$stackPos-(5-3)]) ? $this->semStack[$stackPos-(5-3)] : array($this->semStack[$stackPos-(5-3)]), 'elseifs' => $this->semStack[$stackPos-(5-4)], 'else' => $this->semStack[$stackPos-(5-5)]], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes);
            },
            135 => function ($stackPos) {
                 $this->semValue = new Stmt\If_($this->semStack[$stackPos-(8-2)], ['stmts' => $this->semStack[$stackPos-(8-4)], 'elseifs' => $this->semStack[$stackPos-(8-5)], 'else' => $this->semStack[$stackPos-(8-6)]], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes);
            },
            136 => function ($stackPos) {
                 $this->semValue = new Stmt\While_($this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            137 => function ($stackPos) {
                 $this->semValue = new Stmt\Do_($this->semStack[$stackPos-(5-4)], is_array($this->semStack[$stackPos-(5-2)]) ? $this->semStack[$stackPos-(5-2)] : array($this->semStack[$stackPos-(5-2)]), $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes);
            },
            138 => function ($stackPos) {
                 $this->semValue = new Stmt\For_(['init' => $this->semStack[$stackPos-(9-3)], 'cond' => $this->semStack[$stackPos-(9-5)], 'loop' => $this->semStack[$stackPos-(9-7)], 'stmts' => $this->semStack[$stackPos-(9-9)]], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes);
            },
            139 => function ($stackPos) {
                 $this->semValue = new Stmt\Switch_($this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            140 => function ($stackPos) {
                 $this->semValue = new Stmt\Break_(null, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            141 => function ($stackPos) {
                 $this->semValue = new Stmt\Break_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            142 => function ($stackPos) {
                 $this->semValue = new Stmt\Continue_(null, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            143 => function ($stackPos) {
                 $this->semValue = new Stmt\Continue_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            144 => function ($stackPos) {
                 $this->semValue = new Stmt\Return_(null, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            145 => function ($stackPos) {
                 $this->semValue = new Stmt\Return_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            146 => function ($stackPos) {
                 $this->semValue = new Stmt\Global_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            147 => function ($stackPos) {
                 $this->semValue = new Stmt\Static_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            148 => function ($stackPos) {
                 $this->semValue = new Stmt\Echo_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            149 => function ($stackPos) {
                 $this->semValue = new Stmt\InlineHTML($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            150 => function ($stackPos) {
                 $this->semValue = new Stmt\Expression($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            151 => function ($stackPos) {
                 $this->semValue = new Stmt\Expression($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            152 => function ($stackPos) {
                 $this->semValue = new Stmt\Unset_($this->semStack[$stackPos-(5-3)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes);
            },
            153 => function ($stackPos) {
                 $this->semValue = new Stmt\Foreach_($this->semStack[$stackPos-(7-3)], $this->semStack[$stackPos-(7-5)][0], ['keyVar' => null, 'byRef' => $this->semStack[$stackPos-(7-5)][1], 'stmts' => $this->semStack[$stackPos-(7-7)]], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes);
            },
            154 => function ($stackPos) {
                 $this->semValue = new Stmt\Foreach_($this->semStack[$stackPos-(9-3)], $this->semStack[$stackPos-(9-7)][0], ['keyVar' => $this->semStack[$stackPos-(9-5)], 'byRef' => $this->semStack[$stackPos-(9-7)][1], 'stmts' => $this->semStack[$stackPos-(9-9)]], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes);
            },
            155 => function ($stackPos) {
                 $this->semValue = new Stmt\Declare_($this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-5)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes);
            },
            156 => function ($stackPos) {
                 $this->semValue = new Stmt\TryCatch($this->semStack[$stackPos-(6-3)], $this->semStack[$stackPos-(6-5)], $this->semStack[$stackPos-(6-6)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); $this->checkTryCatch($this->semValue);
            },
            157 => function ($stackPos) {
                 $this->semValue = new Stmt\Throw_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            158 => function ($stackPos) {
                 $this->semValue = new Stmt\Goto_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            159 => function ($stackPos) {
                 $this->semValue = new Stmt\Label($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            160 => function ($stackPos) {
                 $this->semValue = new Stmt\Expression($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            161 => function ($stackPos) {
                 $this->semValue = array(); /* means: no statement */
            },
            162 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            163 => function ($stackPos) {
                 $startAttributes = $this->startAttributeStack[$stackPos-(1-1)]; if (isset($startAttributes['comments'])) { $this->semValue = new Stmt\Nop($startAttributes + $this->endAttributes); } else { $this->semValue = null; };
            if ($this->semValue === null) $this->semValue = array(); /* means: no statement */
            },
            164 => function ($stackPos) {
                 $this->semValue = array();
            },
            165 => function ($stackPos) {
                 $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)];
            },
            166 => function ($stackPos) {
                 $this->semValue = new Stmt\Catch_(array($this->semStack[$stackPos-(8-3)]), $this->semStack[$stackPos-(8-4)], $this->semStack[$stackPos-(8-7)], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes);
            },
            167 => function ($stackPos) {
                 $this->semValue = null;
            },
            168 => function ($stackPos) {
                 $this->semValue = new Stmt\Finally_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            },
            169 => function ($stackPos) {
                 $this->semValue = array($this->semStack[$stackPos-(1-1)]);
            },
            170 => function ($stackPos) {
                 $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
            },
            171 => function ($stackPos) {
                 $this->semValue = false;
            },
            172 => function ($stackPos) {
                 $this->semValue = true;
            },
            173 => function ($stackPos) {
                 $this->semValue = false;
            },
            174 => function ($stackPos) {
                 $this->semValue = true;
            },
            175 => function ($stackPos) {
                 $this->semValue = false;
            },
            176 => function ($stackPos) {
                 $this->semValue = true;
            },
            177 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            178 => function ($stackPos) {
                 $this->semValue = new Node\Identifier($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            179 => function ($stackPos) {
                 $this->semValue = new Stmt\Function_($this->semStack[$stackPos-(10-3)], ['byRef' => $this->semStack[$stackPos-(10-2)], 'params' => $this->semStack[$stackPos-(10-5)], 'returnType' => $this->semStack[$stackPos-(10-7)], 'stmts' => $this->semStack[$stackPos-(10-9)]], $this->startAttributeStack[$stackPos-(10-1)] + $this->endAttributes);
            },
            180 => function ($stackPos) {
                 $this->semValue = new Stmt\Class_($this->semStack[$stackPos-(7-2)], ['type' => $this->semStack[$stackPos-(7-1)], 'extends' => $this->semStack[$stackPos-(7-3)], 'implements' => $this->semStack[$stackPos-(7-4)], 'stmts' => $this->semStack[$stackPos-(7-6)]], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes);
            $this->checkClass($this->semValue, $stackPos-(7-2));
            },
            181 => function ($stackPos) {
                 $this->semValue = new Stmt\Interface_($this->semStack[$stackPos-(6-2)], ['extends' => $this->semStack[$stackPos-(6-3)], 'stmts' => $this->semStack[$stackPos-(6-5)]], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes);
            $this->checkInterface($this->semValue, $stackPos-(6-2));
            },
            182 => function ($stackPos) {
                 $this->semValue = new Stmt\Trait_($this->semStack[$stackPos-(5-2)], ['stmts' => $this->semStack[$stackPos-(5-4)]], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes);
            },
            183 => function ($stackPos) {
                 $this->semValue = 0;
            },
            184 => function ($stackPos) {
                 $this->semValue = Stmt\Class_::MODIFIER_ABSTRACT;
            },
            185 => function ($stackPos) {
                 $this->semValue = Stmt\Class_::MODIFIER_FINAL;
            },
            186 => function ($stackPos) {
                 $this->semValue = null;
            },
            187 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(2-2)];
            },
            188 => function ($stackPos) {
                 $this->semValue = array();
            },
            189 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(2-2)];
            },
            190 => function ($stackPos) {
                 $this->semValue = array();
            },
            191 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(2-2)];
            },
            192 => function ($stackPos) {
                 $this->semValue = array($this->semStack[$stackPos-(1-1)]);
            },
            193 => function ($stackPos) {
                 $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
            },
            194 => function ($stackPos) {
                 $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]);
            },
            195 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(4-2)];
            },
            196 => function ($stackPos) {
                 $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]);
            },
            197 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(4-2)];
            },
            198 => function ($stackPos) {
                 $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]);
            },
            199 => function ($stackPos) {
                 $this->semValue = null;
            },
            200 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(4-2)];
            },
            201 => function ($stackPos) {
                 $this->semValue = array($this->semStack[$stackPos-(1-1)]);
            },
            202 => function ($stackPos) {
                 $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
            },
            203 => function ($stackPos) {
                 $this->semValue = new Stmt\DeclareDeclare($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            204 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(3-2)];
            },
            205 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(4-3)];
            },
            206 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(4-2)];
            },
            207 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(5-3)];
            },
            208 => function ($stackPos) {
                 $this->semValue = array();
            },
            209 => function ($stackPos) {
                 $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)];
            },
            210 => function ($stackPos) {
                 $this->semValue = new Stmt\Case_($this->semStack[$stackPos-(4-2)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            },
            211 => function ($stackPos) {
                 $this->semValue = new Stmt\Case_(null, $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            212 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            213 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            214 => function ($stackPos) {
                 $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]);
            },
            215 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(4-2)];
            },
            216 => function ($stackPos) {
                 $this->semValue = array();
            },
            217 => function ($stackPos) {
                 $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)];
            },
            218 => function ($stackPos) {
                 $this->semValue = new Stmt\ElseIf_($this->semStack[$stackPos-(3-2)], is_array($this->semStack[$stackPos-(3-3)]) ? $this->semStack[$stackPos-(3-3)] : array($this->semStack[$stackPos-(3-3)]), $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            219 => function ($stackPos) {
                 $this->semValue = array();
            },
            220 => function ($stackPos) {
                 $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)];
            },
            221 => function ($stackPos) {
                 $this->semValue = new Stmt\ElseIf_($this->semStack[$stackPos-(4-2)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            },
            222 => function ($stackPos) {
                 $this->semValue = null;
            },
            223 => function ($stackPos) {
                 $this->semValue = new Stmt\Else_(is_array($this->semStack[$stackPos-(2-2)]) ? $this->semStack[$stackPos-(2-2)] : array($this->semStack[$stackPos-(2-2)]), $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            224 => function ($stackPos) {
                 $this->semValue = null;
            },
            225 => function ($stackPos) {
                 $this->semValue = new Stmt\Else_($this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            226 => function ($stackPos) {
                 $this->semValue = array($this->semStack[$stackPos-(1-1)], false);
            },
            227 => function ($stackPos) {
                 $this->semValue = array($this->semStack[$stackPos-(2-2)], true);
            },
            228 => function ($stackPos) {
                 $this->semValue = array($this->semStack[$stackPos-(1-1)], false);
            },
            229 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            230 => function ($stackPos) {
                 $this->semValue = array();
            },
            231 => function ($stackPos) {
                 $this->semValue = array($this->semStack[$stackPos-(1-1)]);
            },
            232 => function ($stackPos) {
                 $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
            },
            233 => function ($stackPos) {
                 $this->semValue = new Node\Param($this->semStack[$stackPos-(4-4)], null, $this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-2)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); $this->checkParam($this->semValue);
            },
            234 => function ($stackPos) {
                 $this->semValue = new Node\Param($this->semStack[$stackPos-(6-4)], $this->semStack[$stackPos-(6-6)], $this->semStack[$stackPos-(6-1)], $this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-3)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); $this->checkParam($this->semValue);
            },
            235 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            236 => function ($stackPos) {
                 $this->semValue = new Node\Identifier('array', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            237 => function ($stackPos) {
                 $this->semValue = new Node\Identifier('callable', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            238 => function ($stackPos) {
                 $this->semValue = null;
            },
            239 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            240 => function ($stackPos) {
                 $this->semValue = null;
            },
            241 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(2-2)];
            },
            242 => function ($stackPos) {
                 $this->semValue = array();
            },
            243 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(3-2)];
            },
            244 => function ($stackPos) {
                 $this->semValue = array(new Node\Arg($this->semStack[$stackPos-(3-2)], false, false, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes));
            },
            245 => function ($stackPos) {
                 $this->semValue = array($this->semStack[$stackPos-(1-1)]);
            },
            246 => function ($stackPos) {
                 $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
            },
            247 => function ($stackPos) {
                 $this->semValue = new Node\Arg($this->semStack[$stackPos-(1-1)], false, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            248 => function ($stackPos) {
                 $this->semValue = new Node\Arg($this->semStack[$stackPos-(2-2)], true, false, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            249 => function ($stackPos) {
                 $this->semValue = new Node\Arg($this->semStack[$stackPos-(2-2)], false, true, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            250 => function ($stackPos) {
                 $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
            },
            251 => function ($stackPos) {
                 $this->semValue = array($this->semStack[$stackPos-(1-1)]);
            },
            252 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            253 => function ($stackPos) {
                 $this->semValue = new Expr\Variable($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            254 => function ($stackPos) {
                 $this->semValue = new Expr\Variable($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            },
            255 => function ($stackPos) {
                 $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
            },
            256 => function ($stackPos) {
                 $this->semValue = array($this->semStack[$stackPos-(1-1)]);
            },
            257 => function ($stackPos) {
                 $this->semValue = new Stmt\StaticVar($this->semStack[$stackPos-(1-1)], null, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            258 => function ($stackPos) {
                 $this->semValue = new Stmt\StaticVar($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            259 => function ($stackPos) {
                 if ($this->semStack[$stackPos-(2-2)] !== null) { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; }
            },
            260 => function ($stackPos) {
                 $this->semValue = array();
            },
            261 => function ($stackPos) {
                 $startAttributes = $this->lookaheadStartAttributes; if (isset($startAttributes['comments'])) { $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); } else { $nop = null; };
            if ($nop !== null) { $this->semStack[$stackPos-(1-1)][] = $nop; } $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            262 => function ($stackPos) {
                 $this->semValue = new Stmt\Property($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); $this->checkProperty($this->semValue, $stackPos-(3-1));
            },
            263 => function ($stackPos) {
                 $this->semValue = new Stmt\ClassConst($this->semStack[$stackPos-(3-2)], 0, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            264 => function ($stackPos) {
                 $this->semValue = new Stmt\ClassMethod($this->semStack[$stackPos-(9-4)], ['type' => $this->semStack[$stackPos-(9-1)], 'byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-6)], 'returnType' => $this->semStack[$stackPos-(9-8)], 'stmts' => $this->semStack[$stackPos-(9-9)]], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes);
            $this->checkClassMethod($this->semValue, $stackPos-(9-1));
            },
            265 => function ($stackPos) {
                 $this->semValue = new Stmt\TraitUse($this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            266 => function ($stackPos) {
                 $this->semValue = array();
            },
            267 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(3-2)];
            },
            268 => function ($stackPos) {
                 $this->semValue = array();
            },
            269 => function ($stackPos) {
                 $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)];
            },
            270 => function ($stackPos) {
                 $this->semValue = new Stmt\TraitUseAdaptation\Precedence($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            },
            271 => function ($stackPos) {
                 $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(5-1)][0], $this->semStack[$stackPos-(5-1)][1], $this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-4)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes);
            },
            272 => function ($stackPos) {
                 $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], $this->semStack[$stackPos-(4-3)], null, $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            },
            273 => function ($stackPos) {
                 $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], null, $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            },
            274 => function ($stackPos) {
                 $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], null, $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            },
            275 => function ($stackPos) {
                 $this->semValue = array($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)]);
            },
            276 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            277 => function ($stackPos) {
                 $this->semValue = array(null, $this->semStack[$stackPos-(1-1)]);
            },
            278 => function ($stackPos) {
                 $this->semValue = null;
            },
            279 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(3-2)];
            },
            280 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            281 => function ($stackPos) {
                 $this->semValue = 0;
            },
            282 => function ($stackPos) {
                 $this->semValue = 0;
            },
            283 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            284 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            285 => function ($stackPos) {
                 $this->checkModifier($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $stackPos-(2-2)); $this->semValue = $this->semStack[$stackPos-(2-1)] | $this->semStack[$stackPos-(2-2)];
            },
            286 => function ($stackPos) {
                 $this->semValue = Stmt\Class_::MODIFIER_PUBLIC;
            },
            287 => function ($stackPos) {
                 $this->semValue = Stmt\Class_::MODIFIER_PROTECTED;
            },
            288 => function ($stackPos) {
                 $this->semValue = Stmt\Class_::MODIFIER_PRIVATE;
            },
            289 => function ($stackPos) {
                 $this->semValue = Stmt\Class_::MODIFIER_STATIC;
            },
            290 => function ($stackPos) {
                 $this->semValue = Stmt\Class_::MODIFIER_ABSTRACT;
            },
            291 => function ($stackPos) {
                 $this->semValue = Stmt\Class_::MODIFIER_FINAL;
            },
            292 => function ($stackPos) {
                 $this->semValue = array($this->semStack[$stackPos-(1-1)]);
            },
            293 => function ($stackPos) {
                 $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
            },
            294 => function ($stackPos) {
                 $this->semValue = new Node\VarLikeIdentifier(substr($this->semStack[$stackPos-(1-1)], 1), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            295 => function ($stackPos) {
                 $this->semValue = new Stmt\PropertyProperty($this->semStack[$stackPos-(1-1)], null, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            296 => function ($stackPos) {
                 $this->semValue = new Stmt\PropertyProperty($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            297 => function ($stackPos) {
                 $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
            },
            298 => function ($stackPos) {
                 $this->semValue = array($this->semStack[$stackPos-(1-1)]);
            },
            299 => function ($stackPos) {
                 $this->semValue = array();
            },
            300 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            301 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            302 => function ($stackPos) {
                 $this->semValue = new Expr\Assign($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            303 => function ($stackPos) {
                 $this->semValue = new Expr\Assign($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            304 => function ($stackPos) {
                 $this->semValue = new Expr\AssignRef($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            },
            305 => function ($stackPos) {
                 $this->semValue = new Expr\AssignRef($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            },
            306 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            307 => function ($stackPos) {
                 $this->semValue = new Expr\Clone_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            308 => function ($stackPos) {
                 $this->semValue = new Expr\AssignOp\Plus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            309 => function ($stackPos) {
                 $this->semValue = new Expr\AssignOp\Minus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            310 => function ($stackPos) {
                 $this->semValue = new Expr\AssignOp\Mul($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            311 => function ($stackPos) {
                 $this->semValue = new Expr\AssignOp\Div($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            312 => function ($stackPos) {
                 $this->semValue = new Expr\AssignOp\Concat($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            313 => function ($stackPos) {
                 $this->semValue = new Expr\AssignOp\Mod($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            314 => function ($stackPos) {
                 $this->semValue = new Expr\AssignOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            315 => function ($stackPos) {
                 $this->semValue = new Expr\AssignOp\BitwiseOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            316 => function ($stackPos) {
                 $this->semValue = new Expr\AssignOp\BitwiseXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            317 => function ($stackPos) {
                 $this->semValue = new Expr\AssignOp\ShiftLeft($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            318 => function ($stackPos) {
                 $this->semValue = new Expr\AssignOp\ShiftRight($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            319 => function ($stackPos) {
                 $this->semValue = new Expr\AssignOp\Pow($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            320 => function ($stackPos) {
                 $this->semValue = new Expr\AssignOp\Coalesce($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            321 => function ($stackPos) {
                 $this->semValue = new Expr\PostInc($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            322 => function ($stackPos) {
                 $this->semValue = new Expr\PreInc($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            323 => function ($stackPos) {
                 $this->semValue = new Expr\PostDec($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            324 => function ($stackPos) {
                 $this->semValue = new Expr\PreDec($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            325 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\BooleanOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            326 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\BooleanAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            327 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\LogicalOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            328 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\LogicalAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            329 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\LogicalXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            330 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\BitwiseOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            331 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            332 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            333 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\BitwiseXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            334 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\Concat($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            335 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\Plus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            336 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\Minus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            337 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\Mul($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            338 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\Div($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            339 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\Mod($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            340 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\ShiftLeft($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            341 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\ShiftRight($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            342 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\Pow($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            343 => function ($stackPos) {
                 $this->semValue = new Expr\UnaryPlus($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            344 => function ($stackPos) {
                 $this->semValue = new Expr\UnaryMinus($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            345 => function ($stackPos) {
                 $this->semValue = new Expr\BooleanNot($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            346 => function ($stackPos) {
                 $this->semValue = new Expr\BitwiseNot($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            347 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\Identical($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            348 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\NotIdentical($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            349 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\Equal($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            350 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\NotEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            351 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\Spaceship($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            352 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\Smaller($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            353 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\SmallerOrEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            354 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\Greater($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            355 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\GreaterOrEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            356 => function ($stackPos) {
                 $this->semValue = new Expr\Instanceof_($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            357 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            358 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(3-2)];
            },
            359 => function ($stackPos) {
                 $this->semValue = new Expr\Ternary($this->semStack[$stackPos-(5-1)], $this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-5)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes);
            },
            360 => function ($stackPos) {
                 $this->semValue = new Expr\Ternary($this->semStack[$stackPos-(4-1)], null, $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            },
            361 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\Coalesce($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            362 => function ($stackPos) {
                 $this->semValue = new Expr\Isset_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            },
            363 => function ($stackPos) {
                 $this->semValue = new Expr\Empty_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            },
            364 => function ($stackPos) {
                 $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_INCLUDE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            365 => function ($stackPos) {
                 $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_INCLUDE_ONCE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            366 => function ($stackPos) {
                 $this->semValue = new Expr\Eval_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            367 => function ($stackPos) {
                 $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_REQUIRE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            368 => function ($stackPos) {
                 $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_REQUIRE_ONCE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            369 => function ($stackPos) {
                 $this->semValue = new Expr\Cast\Int_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            370 => function ($stackPos) {
                 $attrs = $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes;
            $attrs['kind'] = $this->getFloatCastKind($this->semStack[$stackPos-(2-1)]);
            $this->semValue = new Expr\Cast\Double($this->semStack[$stackPos-(2-2)], $attrs);
            },
            371 => function ($stackPos) {
                 $this->semValue = new Expr\Cast\String_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            372 => function ($stackPos) {
                 $this->semValue = new Expr\Cast\Array_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            373 => function ($stackPos) {
                 $this->semValue = new Expr\Cast\Object_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            374 => function ($stackPos) {
                 $this->semValue = new Expr\Cast\Bool_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            375 => function ($stackPos) {
                 $this->semValue = new Expr\Cast\Unset_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            376 => function ($stackPos) {
                 $attrs = $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes;
            $attrs['kind'] = strtolower($this->semStack[$stackPos-(2-1)]) === 'exit' ? Expr\Exit_::KIND_EXIT : Expr\Exit_::KIND_DIE;
            $this->semValue = new Expr\Exit_($this->semStack[$stackPos-(2-2)], $attrs);
            },
            377 => function ($stackPos) {
                 $this->semValue = new Expr\ErrorSuppress($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            378 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            379 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            380 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            381 => function ($stackPos) {
                 $this->semValue = new Expr\ShellExec($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            382 => function ($stackPos) {
                 $this->semValue = new Expr\Print_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            383 => function ($stackPos) {
                 $this->semValue = new Expr\Yield_(null, null, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            384 => function ($stackPos) {
                 $this->semValue = new Expr\YieldFrom($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            385 => function ($stackPos) {
                 $this->semValue = new Expr\Closure(['static' => false, 'byRef' => $this->semStack[$stackPos-(10-2)], 'params' => $this->semStack[$stackPos-(10-4)], 'uses' => $this->semStack[$stackPos-(10-6)], 'returnType' => $this->semStack[$stackPos-(10-7)], 'stmts' => $this->semStack[$stackPos-(10-9)]], $this->startAttributeStack[$stackPos-(10-1)] + $this->endAttributes);
            },
            386 => function ($stackPos) {
                 $this->semValue = new Expr\Closure(['static' => true, 'byRef' => $this->semStack[$stackPos-(11-3)], 'params' => $this->semStack[$stackPos-(11-5)], 'uses' => $this->semStack[$stackPos-(11-7)], 'returnType' => $this->semStack[$stackPos-(11-8)], 'stmts' => $this->semStack[$stackPos-(11-10)]], $this->startAttributeStack[$stackPos-(11-1)] + $this->endAttributes);
            },
            387 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(3-2)];
            },
            388 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(3-2)];
            },
            389 => function ($stackPos) {
                 $this->semValue = new Expr\Yield_($this->semStack[$stackPos-(2-2)], null, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            390 => function ($stackPos) {
                 $this->semValue = new Expr\Yield_($this->semStack[$stackPos-(4-4)], $this->semStack[$stackPos-(4-2)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            },
            391 => function ($stackPos) {
                 $attrs = $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes; $attrs['kind'] = Expr\Array_::KIND_LONG;
            $this->semValue = new Expr\Array_($this->semStack[$stackPos-(4-3)], $attrs);
            },
            392 => function ($stackPos) {
                 $attrs = $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes; $attrs['kind'] = Expr\Array_::KIND_SHORT;
            $this->semValue = new Expr\Array_($this->semStack[$stackPos-(3-2)], $attrs);
            },
            393 => function ($stackPos) {
                 $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            },
            394 => function ($stackPos) {
                 $this->semValue = new Expr\ArrayDimFetch(Scalar\String_::fromString($this->semStack[$stackPos-(4-1)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes), $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            },
            395 => function ($stackPos) {
                 $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            },
            396 => function ($stackPos) {
                 $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            },
            397 => function ($stackPos) {
                 $this->semValue = array(new Stmt\Class_(null, ['type' => 0, 'extends' => $this->semStack[$stackPos-(7-3)], 'implements' => $this->semStack[$stackPos-(7-4)], 'stmts' => $this->semStack[$stackPos-(7-6)]], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes), $this->semStack[$stackPos-(7-2)]);
            $this->checkClass($this->semValue[0], -1);
            },
            398 => function ($stackPos) {
                 $this->semValue = new Expr\New_($this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            399 => function ($stackPos) {
                 list($class, $ctorArgs) = $this->semStack[$stackPos-(2-2)]; $this->semValue = new Expr\New_($class, $ctorArgs, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            400 => function ($stackPos) {
                 $this->semValue = array();
            },
            401 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(4-3)];
            },
            402 => function ($stackPos) {
                 $this->semValue = array($this->semStack[$stackPos-(1-1)]);
            },
            403 => function ($stackPos) {
                 $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
            },
            404 => function ($stackPos) {
                 $this->semValue = new Expr\ClosureUse($this->semStack[$stackPos-(2-2)], $this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            405 => function ($stackPos) {
                 $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            406 => function ($stackPos) {
                 $this->semValue = new Expr\FuncCall($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            407 => function ($stackPos) {
                 $this->semValue = new Expr\FuncCall($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            408 => function ($stackPos) {
                 $this->semValue = new Expr\StaticCall($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            },
            409 => function ($stackPos) {
                 $this->semValue = new Expr\StaticCall($this->semStack[$stackPos-(6-1)], $this->semStack[$stackPos-(6-4)], $this->semStack[$stackPos-(6-6)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes);
            },
            410 => function ($stackPos) {
                 $this->semValue = $this->fixupPhp5StaticPropCall($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            411 => function ($stackPos) {
                 $this->semValue = new Expr\FuncCall($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            412 => function ($stackPos) {
                 $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            },
            413 => function ($stackPos) {
                 $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            414 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            415 => function ($stackPos) {
                 $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            416 => function ($stackPos) {
                 $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            417 => function ($stackPos) {
                 $this->semValue = new Name\FullyQualified(substr($this->semStack[$stackPos-(1-1)], 1), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            418 => function ($stackPos) {
                 $this->semValue = new Name\Relative(substr($this->semStack[$stackPos-(1-1)], 10), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            419 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            420 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            421 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            422 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            423 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            424 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            425 => function ($stackPos) {
                 $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            426 => function ($stackPos) {
                 $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            427 => function ($stackPos) {
                 $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            },
            428 => function ($stackPos) {
                 $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            },
            429 => function ($stackPos) {
                 $this->semValue = null;
            },
            430 => function ($stackPos) {
                 $this->semValue = null;
            },
            431 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            432 => function ($stackPos) {
                 $this->semValue = array();
            },
            433 => function ($stackPos) {
                 $this->semValue = array(new Scalar\EncapsedStringPart(Scalar\String_::parseEscapeSequences($this->semStack[$stackPos-(1-1)], '`', false), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes));
            },
            434 => function ($stackPos) {
                 foreach ($this->semStack[$stackPos-(1-1)] as $s) { if ($s instanceof Node\Scalar\EncapsedStringPart) { $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '`', false); } }; $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            435 => function ($stackPos) {
                 $this->semValue = array();
            },
            436 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            437 => function ($stackPos) {
                 $this->semValue = $this->parseLNumber($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes, true);
            },
            438 => function ($stackPos) {
                 $this->semValue = Scalar\DNumber::fromString($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            439 => function ($stackPos) {
                 $this->semValue = Scalar\String_::fromString($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes, false);
            },
            440 => function ($stackPos) {
                 $this->semValue = new Scalar\MagicConst\Line($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            441 => function ($stackPos) {
                 $this->semValue = new Scalar\MagicConst\File($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            442 => function ($stackPos) {
                 $this->semValue = new Scalar\MagicConst\Dir($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            443 => function ($stackPos) {
                 $this->semValue = new Scalar\MagicConst\Class_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            444 => function ($stackPos) {
                 $this->semValue = new Scalar\MagicConst\Trait_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            445 => function ($stackPos) {
                 $this->semValue = new Scalar\MagicConst\Method($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            446 => function ($stackPos) {
                 $this->semValue = new Scalar\MagicConst\Function_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            447 => function ($stackPos) {
                 $this->semValue = new Scalar\MagicConst\Namespace_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            448 => function ($stackPos) {
                 $this->semValue = $this->parseDocString($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes, $this->startAttributeStack[$stackPos-(3-3)] + $this->endAttributeStack[$stackPos-(3-3)], false);
            },
            449 => function ($stackPos) {
                 $this->semValue = $this->parseDocString($this->semStack[$stackPos-(2-1)], '', $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes, $this->startAttributeStack[$stackPos-(2-2)] + $this->endAttributeStack[$stackPos-(2-2)], false);
            },
            450 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            451 => function ($stackPos) {
                 $this->semValue = new Expr\ClassConstFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            452 => function ($stackPos) {
                 $this->semValue = new Expr\ConstFetch($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            453 => function ($stackPos) {
                 $this->semValue = new Expr\Array_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            },
            454 => function ($stackPos) {
                 $this->semValue = new Expr\Array_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            455 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            456 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\BooleanOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            457 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\BooleanAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            458 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\LogicalOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            459 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\LogicalAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            460 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\LogicalXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            461 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\BitwiseOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            462 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            463 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            464 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\BitwiseXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            465 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\Concat($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            466 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\Plus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            467 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\Minus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            468 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\Mul($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            469 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\Div($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            470 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\Mod($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            471 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\ShiftLeft($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            472 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\ShiftRight($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            473 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\Pow($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            474 => function ($stackPos) {
                 $this->semValue = new Expr\UnaryPlus($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            475 => function ($stackPos) {
                 $this->semValue = new Expr\UnaryMinus($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            476 => function ($stackPos) {
                 $this->semValue = new Expr\BooleanNot($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            477 => function ($stackPos) {
                 $this->semValue = new Expr\BitwiseNot($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            478 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\Identical($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            479 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\NotIdentical($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            480 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\Equal($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            481 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\NotEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            482 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\Smaller($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            483 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\SmallerOrEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            484 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\Greater($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            485 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\GreaterOrEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            486 => function ($stackPos) {
                 $this->semValue = new Expr\Ternary($this->semStack[$stackPos-(5-1)], $this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-5)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes);
            },
            487 => function ($stackPos) {
                 $this->semValue = new Expr\Ternary($this->semStack[$stackPos-(4-1)], null, $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            },
            488 => function ($stackPos) {
                 $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            },
            489 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(3-2)];
            },
            490 => function ($stackPos) {
                 $this->semValue = new Expr\ConstFetch($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            491 => function ($stackPos) {
                 $this->semValue = new Expr\ClassConstFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            492 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            493 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            494 => function ($stackPos) {
                 $attrs = $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes; $attrs['kind'] = Scalar\String_::KIND_DOUBLE_QUOTED;
            foreach ($this->semStack[$stackPos-(3-2)] as $s) { if ($s instanceof Node\Scalar\EncapsedStringPart) { $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '"', true); } }; $this->semValue = new Scalar\Encapsed($this->semStack[$stackPos-(3-2)], $attrs);
            },
            495 => function ($stackPos) {
                 $this->semValue = $this->parseDocString($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes, $this->startAttributeStack[$stackPos-(3-3)] + $this->endAttributeStack[$stackPos-(3-3)], true);
            },
            496 => function ($stackPos) {
                 $this->semValue = array();
            },
            497 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(2-1)];
            },
            498 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            499 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            500 => function ($stackPos) {
                 $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
            },
            501 => function ($stackPos) {
                 $this->semValue = array($this->semStack[$stackPos-(1-1)]);
            },
            502 => function ($stackPos) {
                 $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(3-3)], $this->semStack[$stackPos-(3-1)], false, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            503 => function ($stackPos) {
                 $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(1-1)], null, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            504 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            505 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            506 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            507 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            508 => function ($stackPos) {
                 $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-5)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes);
            },
            509 => function ($stackPos) {
                 $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            },
            510 => function ($stackPos) {
                 $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            511 => function ($stackPos) {
                 $this->semValue = new Expr\MethodCall($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            },
            512 => function ($stackPos) {
                 $this->semValue = new Expr\FuncCall($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            513 => function ($stackPos) {
                 $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            },
            514 => function ($stackPos) {
                 $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            },
            515 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            516 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(3-2)];
            },
            517 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            518 => function ($stackPos) {
                 $this->semValue = new Expr\Variable($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            519 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            520 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            521 => function ($stackPos) {
                 $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            },
            522 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            523 => function ($stackPos) {
                 $var = substr($this->semStack[$stackPos-(1-1)], 1); $this->semValue = \is_string($var) ? new Node\VarLikeIdentifier($var, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes) : $var;
            },
            524 => function ($stackPos) {
                 $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            525 => function ($stackPos) {
                 $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos-(6-1)], $this->semStack[$stackPos-(6-5)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes);
            },
            526 => function ($stackPos) {
                 $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            },
            527 => function ($stackPos) {
                 $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            },
            528 => function ($stackPos) {
                 $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            },
            529 => function ($stackPos) {
                 $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            },
            530 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            531 => function ($stackPos) {
                 $this->semValue = new Expr\Variable($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            },
            532 => function ($stackPos) {
                 $this->semValue = null;
            },
            533 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            534 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            535 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(3-2)];
            },
            536 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            537 => function ($stackPos) {
                 $this->semValue = new Expr\Error($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); $this->errorState = 2;
            },
            538 => function ($stackPos) {
                 $this->semValue = new Expr\List_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            },
            539 => function ($stackPos) {
                 $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
            },
            540 => function ($stackPos) {
                 $this->semValue = array($this->semStack[$stackPos-(1-1)]);
            },
            541 => function ($stackPos) {
                 $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(1-1)], null, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            542 => function ($stackPos) {
                 $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(1-1)], null, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            543 => function ($stackPos) {
                 $this->semValue = null;
            },
            544 => function ($stackPos) {
                 $this->semValue = array();
            },
            545 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(2-1)];
            },
            546 => function ($stackPos) {
                 $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
            },
            547 => function ($stackPos) {
                 $this->semValue = array($this->semStack[$stackPos-(1-1)]);
            },
            548 => function ($stackPos) {
                 $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(3-3)], $this->semStack[$stackPos-(3-1)], false, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            549 => function ($stackPos) {
                 $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(1-1)], null, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            550 => function ($stackPos) {
                 $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(4-4)], $this->semStack[$stackPos-(4-1)], true, $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            },
            551 => function ($stackPos) {
                 $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(2-2)], null, true, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            552 => function ($stackPos) {
                 $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(2-2)], null, false, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes, true);
            },
            553 => function ($stackPos) {
                 $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)];
            },
            554 => function ($stackPos) {
                 $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)];
            },
            555 => function ($stackPos) {
                 $this->semValue = array($this->semStack[$stackPos-(1-1)]);
            },
            556 => function ($stackPos) {
                 $this->semValue = array($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)]);
            },
            557 => function ($stackPos) {
                 $this->semValue = new Scalar\EncapsedStringPart($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            558 => function ($stackPos) {
                 $this->semValue = new Expr\Variable($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            559 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            560 => function ($stackPos) {
                 $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            },
            561 => function ($stackPos) {
                 $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            562 => function ($stackPos) {
                 $this->semValue = new Expr\Variable($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            563 => function ($stackPos) {
                 $this->semValue = new Expr\Variable($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            564 => function ($stackPos) {
                 $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-4)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes);
            },
            565 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(3-2)];
            },
            566 => function ($stackPos) {
                 $this->semValue = new Scalar\String_($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            567 => function ($stackPos) {
                 $this->semValue = $this->parseNumString($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            568 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
        ];
    }
}
<?php

namespace PhpParser\Parser;

use PhpParser\Error;
use PhpParser\Node;
use PhpParser\Node\Expr;
use PhpParser\Node\Name;
use PhpParser\Node\Scalar;
use PhpParser\Node\Stmt;

/* This is an automatically GENERATED file, which should not be manually edited.
 * Instead edit one of the following:
 *  * the grammar files grammar/php5.y or grammar/php7.y
 *  * the skeleton file grammar/parser.template
 *  * the preprocessing script grammar/rebuildParsers.php
 */
class Php7 extends \PhpParser\ParserAbstract
{
    protected $tokenToSymbolMapSize = 396;
    protected $actionTableSize = 1241;
    protected $gotoTableSize = 629;

    protected $invalidSymbol = 168;
    protected $errorSymbol = 1;
    protected $defaultAction = -32766;
    protected $unexpectedTokenRule = 32767;

    protected $YY2TBLSTATE = 434;
    protected $numNonLeafStates = 736;

    protected $symbolToName = array(
        "EOF",
        "error",
        "T_THROW",
        "T_INCLUDE",
        "T_INCLUDE_ONCE",
        "T_EVAL",
        "T_REQUIRE",
        "T_REQUIRE_ONCE",
        "','",
        "T_LOGICAL_OR",
        "T_LOGICAL_XOR",
        "T_LOGICAL_AND",
        "T_PRINT",
        "T_YIELD",
        "T_DOUBLE_ARROW",
        "T_YIELD_FROM",
        "'='",
        "T_PLUS_EQUAL",
        "T_MINUS_EQUAL",
        "T_MUL_EQUAL",
        "T_DIV_EQUAL",
        "T_CONCAT_EQUAL",
        "T_MOD_EQUAL",
        "T_AND_EQUAL",
        "T_OR_EQUAL",
        "T_XOR_EQUAL",
        "T_SL_EQUAL",
        "T_SR_EQUAL",
        "T_POW_EQUAL",
        "T_COALESCE_EQUAL",
        "'?'",
        "':'",
        "T_COALESCE",
        "T_BOOLEAN_OR",
        "T_BOOLEAN_AND",
        "'|'",
        "'^'",
        "T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG",
        "T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG",
        "T_IS_EQUAL",
        "T_IS_NOT_EQUAL",
        "T_IS_IDENTICAL",
        "T_IS_NOT_IDENTICAL",
        "T_SPACESHIP",
        "'<'",
        "T_IS_SMALLER_OR_EQUAL",
        "'>'",
        "T_IS_GREATER_OR_EQUAL",
        "T_SL",
        "T_SR",
        "'+'",
        "'-'",
        "'.'",
        "'*'",
        "'/'",
        "'%'",
        "'!'",
        "T_INSTANCEOF",
        "'~'",
        "T_INC",
        "T_DEC",
        "T_INT_CAST",
        "T_DOUBLE_CAST",
        "T_STRING_CAST",
        "T_ARRAY_CAST",
        "T_OBJECT_CAST",
        "T_BOOL_CAST",
        "T_UNSET_CAST",
        "'@'",
        "T_POW",
        "'['",
        "T_NEW",
        "T_CLONE",
        "T_EXIT",
        "T_IF",
        "T_ELSEIF",
        "T_ELSE",
        "T_ENDIF",
        "T_LNUMBER",
        "T_DNUMBER",
        "T_STRING",
        "T_STRING_VARNAME",
        "T_VARIABLE",
        "T_NUM_STRING",
        "T_INLINE_HTML",
        "T_ENCAPSED_AND_WHITESPACE",
        "T_CONSTANT_ENCAPSED_STRING",
        "T_ECHO",
        "T_DO",
        "T_WHILE",
        "T_ENDWHILE",
        "T_FOR",
        "T_ENDFOR",
        "T_FOREACH",
        "T_ENDFOREACH",
        "T_DECLARE",
        "T_ENDDECLARE",
        "T_AS",
        "T_SWITCH",
        "T_MATCH",
        "T_ENDSWITCH",
        "T_CASE",
        "T_DEFAULT",
        "T_BREAK",
        "T_CONTINUE",
        "T_GOTO",
        "T_FUNCTION",
        "T_FN",
        "T_CONST",
        "T_RETURN",
        "T_TRY",
        "T_CATCH",
        "T_FINALLY",
        "T_USE",
        "T_INSTEADOF",
        "T_GLOBAL",
        "T_STATIC",
        "T_ABSTRACT",
        "T_FINAL",
        "T_PRIVATE",
        "T_PROTECTED",
        "T_PUBLIC",
        "T_READONLY",
        "T_VAR",
        "T_UNSET",
        "T_ISSET",
        "T_EMPTY",
        "T_HALT_COMPILER",
        "T_CLASS",
        "T_TRAIT",
        "T_INTERFACE",
        "T_ENUM",
        "T_EXTENDS",
        "T_IMPLEMENTS",
        "T_OBJECT_OPERATOR",
        "T_NULLSAFE_OBJECT_OPERATOR",
        "T_LIST",
        "T_ARRAY",
        "T_CALLABLE",
        "T_CLASS_C",
        "T_TRAIT_C",
        "T_METHOD_C",
        "T_FUNC_C",
        "T_LINE",
        "T_FILE",
        "T_START_HEREDOC",
        "T_END_HEREDOC",
        "T_DOLLAR_OPEN_CURLY_BRACES",
        "T_CURLY_OPEN",
        "T_PAAMAYIM_NEKUDOTAYIM",
        "T_NAMESPACE",
        "T_NS_C",
        "T_DIR",
        "T_NS_SEPARATOR",
        "T_ELLIPSIS",
        "T_NAME_FULLY_QUALIFIED",
        "T_NAME_QUALIFIED",
        "T_NAME_RELATIVE",
        "T_ATTRIBUTE",
        "';'",
        "']'",
        "'{'",
        "'}'",
        "'('",
        "')'",
        "'`'",
        "'\"'",
        "'$'"
    );

    protected $tokenToSymbol = array(
            0,  168,  168,  168,  168,  168,  168,  168,  168,  168,
          168,  168,  168,  168,  168,  168,  168,  168,  168,  168,
          168,  168,  168,  168,  168,  168,  168,  168,  168,  168,
          168,  168,  168,   56,  166,  168,  167,   55,  168,  168,
          163,  164,   53,   50,    8,   51,   52,   54,  168,  168,
          168,  168,  168,  168,  168,  168,  168,  168,   31,  159,
           44,   16,   46,   30,   68,  168,  168,  168,  168,  168,
          168,  168,  168,  168,  168,  168,  168,  168,  168,  168,
          168,  168,  168,  168,  168,  168,  168,  168,  168,  168,
          168,   70,  168,  160,   36,  168,  165,  168,  168,  168,
          168,  168,  168,  168,  168,  168,  168,  168,  168,  168,
          168,  168,  168,  168,  168,  168,  168,  168,  168,  168,
          168,  168,  168,  161,   35,  162,   58,  168,  168,  168,
          168,  168,  168,  168,  168,  168,  168,  168,  168,  168,
          168,  168,  168,  168,  168,  168,  168,  168,  168,  168,
          168,  168,  168,  168,  168,  168,  168,  168,  168,  168,
          168,  168,  168,  168,  168,  168,  168,  168,  168,  168,
          168,  168,  168,  168,  168,  168,  168,  168,  168,  168,
          168,  168,  168,  168,  168,  168,  168,  168,  168,  168,
          168,  168,  168,  168,  168,  168,  168,  168,  168,  168,
          168,  168,  168,  168,  168,  168,  168,  168,  168,  168,
          168,  168,  168,  168,  168,  168,  168,  168,  168,  168,
          168,  168,  168,  168,  168,  168,  168,  168,  168,  168,
          168,  168,  168,  168,  168,  168,  168,  168,  168,  168,
          168,  168,  168,  168,  168,  168,  168,  168,  168,  168,
          168,  168,  168,  168,  168,  168,    1,    2,    3,    4,
            5,    6,    7,    9,   10,   11,   12,   13,   14,   15,
           17,   18,   19,   20,   21,   22,   23,   24,   25,   26,
           27,   28,   29,   32,   33,   34,   37,   38,   39,   40,
           41,   42,   43,   45,   47,   48,   49,   57,   59,   60,
           61,   62,   63,   64,   65,   66,   67,   69,   71,   72,
           73,   74,   75,   76,   77,   78,   79,   80,   81,   82,
           83,   84,   85,   86,   87,   88,   89,   90,   91,   92,
           93,   94,   95,   96,   97,   98,   99,  100,  101,  102,
          103,  104,  105,  106,  107,  108,  109,  110,  111,  112,
          113,  114,  115,  116,  117,  118,  119,  120,  121,  122,
          123,  124,  125,  126,  127,  128,  129,  130,  131,  132,
          133,  134,  135,  136,  137,  138,  139,  140,  141,  142,
          143,  144,  145,  146,  147,  148,  149,  150,  151,  152,
          153,  154,  155,  156,  157,  158
    );

    protected $action = array(
          133,  134,  135,  579,  136,  137,    0,  748,  749,  750,
          138,   38,  327,-32766,-32766,-32766,-32766,-32766,-32766,-32767,
        -32767,-32767,-32767,  102,  103,  104,  105,  106, 1109, 1110,
         1111, 1108, 1107, 1106, 1112,  742,  741,-32766, 1232,-32766,
        -32766,-32766,-32766,-32766,-32766,-32766,-32767,-32767,-32767,-32767,
        -32767,    2,  107,  108,  109,  751,  274,  381,  380,-32766,
        -32766,-32766,-32766,  104,  105,  106, 1024,  422,  110,  265,
          139,  403,  755,  756,  757,  758,  466,  467,  428,  938,
          291,-32766,  287,-32766,-32766,  759,  760,  761,  762,  763,
          764,  765,  766,  767,  768,  769,  789,  580,  790,  791,
          792,  793,  781,  782,  344,  345,  784,  785,  770,  771,
          772,  774,  775,  776,  355,  816,  817,  818,  819,  820,
          581,  777,  778,  582,  583,  810,  801,  799,  800,  813,
          796,  797,  687, -545,  584,  585,  795,  586,  587,  588,
          589,  590,  591, -328, -593, -367, 1234, -367,  798,  592,
          593, -593,  140,-32766,-32766,-32766,  133,  134,  135,  579,
          136,  137, 1057,  748,  749,  750,  138,   38,  688, 1020,
         1019, 1018, 1021,  390,-32766,    7,-32766,-32766,-32766,-32766,
        -32766,-32766,-32766,-32766,-32766,-32766,  379,  380, 1033,  689,
          690,  742,  741,-32766,-32766,-32766,  422, -545, -545, -590,
        -32766,-32766,-32766, 1032,-32766,  127, -590, 1236, 1235, 1237,
         1318,  751, -545,  290,-32766,  283,-32766,-32766,-32766,-32766,
        -32766, 1236, 1235, 1237, -545,  265,  139,  403,  755,  756,
          757,  758,   16,  481,  428,  458,  459,  460,  298,  722,
           35,  759,  760,  761,  762,  763,  764,  765,  766,  767,
          768,  769,  789,  580,  790,  791,  792,  793,  781,  782,
          344,  345,  784,  785,  770,  771,  772,  774,  775,  776,
          355,  816,  817,  818,  819,  820,  581,  777,  778,  582,
          583,  810,  801,  799,  800,  813,  796,  797,  129,  824,
          584,  585,  795,  586,  587,  588,  589,  590,  591, -328,
           83,   84,   85, -593,  798,  592,  593, -593,  149,  773,
          743,  744,  745,  746,  747,  824,  748,  749,  750,  786,
          787,   37,  145,   86,   87,   88,   89,   90,   91,   92,
           93,   94,   95,   96,   97,   98,   99,  100,  101,  102,
          103,  104,  105,  106,  107,  108,  109,  291,  274,  835,
          254, 1109, 1110, 1111, 1108, 1107, 1106, 1112, -590,  860,
          110,  861, -590,  482,  751,-32766,-32766,-32766,-32766,-32766,
          142,  603, 1085,  742,  741, 1262,  326,  987,  752,  753,
          754,  755,  756,  757,  758,  309,-32766,  822,-32766,-32766,
        -32766,-32766,  242,  553,  759,  760,  761,  762,  763,  764,
          765,  766,  767,  768,  769,  789,  812,  790,  791,  792,
          793,  781,  782,  783,  811,  784,  785,  770,  771,  772,
          774,  775,  776,  815,  816,  817,  818,  819,  820,  821,
          777,  778,  779,  780,  810,  801,  799,  800,  813,  796,
          797,  311,  940,  788,  794,  795,  802,  803,  805,  804,
          806,  807,  323,  609, 1274, 1033,  833,  798,  809,  808,
           50,   51,   52,  512,   53,   54,  860,  241,  861,  918,
           55,   56, -111,   57,-32766,-32766,-32766, -111,  826, -111,
          290, 1302, 1347,  356,  305, 1348,  339, -111, -111, -111,
         -111, -111, -111, -111, -111,-32766, -194,-32766,-32766,-32766,
         -193,  956,  957,  829,  -86,  988,  958,  834,   58,   59,
          340,  428,  952, -544,   60,  832,   61,  247,  248,   62,
           63,   64,   65,   66,   67,   68,   69, 1241,   28,  267,
           70,  444,  513, -342,-32766,  141, 1268, 1269,  514,  918,
          833,  326, -272,  918, 1266,   42,   25,  515,  940,  516,
           14,  517,  908,  518,  828,  369,  519,  520,  373,  709,
         1033,   44,   45,  445,  376,  375,  388,   46,  521,  712,
          -86,  440, 1101,  367,  338, -543,  441, -544, -544,  830,
         1227,  442,  523,  524,  525,  290, 1236, 1235, 1237,  361,
         1030,  443, -544, 1087,  526,  527,  839, 1255, 1256, 1257,
         1258, 1252, 1253,  297, -544,  151, -550, -584,  833, 1259,
         1254, -584, 1033, 1236, 1235, 1237,  298, -154, -154, -154,
          152,   71,  908,  321,  322,  326,  908,  920, 1030,  707,
          833,  154, -154, 1337, -154,  155, -154,  283, -154, -543,
         -543,   82, 1232, 1086, 1322,  734,  156,  326,  374,  158,
         1033, 1321, -194,  -79, -543,  -88, -193,  742,  741,  956,
          957,  653,   26,-32766,  522,  -51, -543,   33, -549,  894,
          952, -111, -111, -111,   32,  111,  112,  113,  114,  115,
          116,  117,  118,  119,  120,  121,  122,  123,  -59,   75,
           28,  672,  673,  326,  -58,   36,  250,  920,  124,  707,
          125,  920,  833,  707, -154,  130, 1266,  131,-32766, -547,
          144, -542,  150,  406, 1234,  377,  378, 1146, 1148,  382,
          383,-32766,-32766,-32766,  -85,-32766, 1056,-32766, -542,-32766,
          644,  645,-32766,  159,  160,  161, 1232,-32766,-32766,-32766,
          162,  -79, 1227,-32766,-32766,  742,  741,  163, -302,-32766,
          419,  -75,   -4,  918,  -73,  287,  526,  527,-32766, 1255,
         1256, 1257, 1258, 1252, 1253,  -72,  -71,  -70,  -69,  -68,
          -67, 1259, 1254, -547, -547, -542, -542,  742,  741,  -66,
          -47,  -18,-32766,   73,  148,  918,  322,  326, 1234,  273,
         -542,  284, -542, -542,  723,-32766,-32766,-32766,  726,-32766,
         -547,-32766, -542,-32766,  917,  147,-32766, -542,  288,  289,
         -298,-32766,-32766,-32766,-32766,  713,  279,-32766,-32766, -542,
         1234,  280,  285,-32766,  419,   48,  286,-32766,-32766,-32766,
          332,-32766,-32766,-32766,  292,-32766,  908,  293,-32766,  934,
          274, 1030,  918,-32766,-32766,-32766,  110,  682,  132,-32766,
        -32766,  833,  146,-32766,  559,-32766,  419,  659,  374,  824,
          435, 1349,   74, 1033,-32766,  296,  654, 1116,  908,  956,
          957,  306,  714,  698,  522,  555,  303,   13,  310,  852,
          952, -111, -111, -111,  700,  463,  492,  953,  283,  299,
          300,-32766,   49,  675,  918,  304,  660, 1234,  676,  936,
         1273,-32766,   10, 1263,-32766,-32766,-32766,  642,-32766,  918,
        -32766,  920,-32766,  707,   -4,-32766,  126,   34,  918,  565,
        -32766,-32766,-32766,-32766,    0,  908,-32766,-32766,    0, 1234,
          918,    0,-32766,  419,    0,    0,-32766,-32766,-32766,  717,
        -32766,-32766,-32766,  920,-32766,  707, 1033,-32766,  724, 1275,
            0,  487,-32766,-32766,-32766,-32766,  301,  302,-32766,-32766,
         -507, 1234,  571, -497,-32766,  419,  607,    8,-32766,-32766,
        -32766,  372,-32766,-32766,-32766,   17,-32766,  908,  371,-32766,
          832,  298,  320,  128,-32766,-32766,-32766,   40,  370,   41,
        -32766,-32766,  908, -250, -250, -250,-32766,  419,  731,  374,
          973,  908,  707,  732,  899,-32766,  997,  974,  728,  981,
          956,  957,  971,  908,  982,  522,  897,  969, 1090, 1093,
          894,  952, -111, -111, -111,   28, 1094, 1091, 1092, -249,
         -249, -249, 1241, 1098,  708,  374,  844,  833, 1288, 1306,
         1340, 1266,  647, 1267,  711,  715,  956,  957,  716, 1241,
          718,  522,  920,  719,  707, -250,  894,  952, -111, -111,
         -111,  720,  -16,  721,  725,  710, -511,  920,  895,  707,
         -578, 1232, 1344, 1346,  855,  854,  920, 1227,  707, -577,
          863,  946,  989,  862, 1345,  945,  943,  944,  920,  947,
          707, -249,  527, 1218, 1255, 1256, 1257, 1258, 1252, 1253,
          927,  937,  925,  979,  980,  631, 1259, 1254, 1343, 1300,
        -32766, 1289, 1307,  833, 1316, -275, 1234, -576,   73, -550,
         -549,  322,  326,-32766,-32766,-32766, -548,-32766, -491,-32766,
          833,-32766,    1,   29,-32766,   30,   39,   43,   47,-32766,
        -32766,-32766,   72,   76,   77,-32766,-32766, 1232, -111, -111,
           78,-32766,  419, -111,   79,   80,   81,  143,  153, -111,
        -32766,  157,  246,  328, 1232, -111, -111,  356,-32766,  357,
         -111,  358,  359,  360,  361,  362, -111,  363,  364,  365,
          366,  368,  436,    0, -273,-32766, -272,   19,   20,  298,
           21,   22,   24,  405,   75, 1203,  483,  484,  326,  491,
            0,  494,  495,  496,  497,  501,  298,  502,  503,  510,
          693,   75,    0, 1245, 1186,  326, 1264, 1059, 1058, 1039,
         1222, 1035, -277, -103,   18,   23,   27,  295,  404,  600,
          604,  633,  699, 1190, 1240, 1187, 1319,    0,    0,    0,
          326
    );

    protected $actionCheck = array(
            2,    3,    4,    5,    6,    7,    0,    9,   10,   11,
           12,   13,   70,    9,   10,   11,    9,   10,   11,   44,
           45,   46,   47,   48,   49,   50,   51,   52,  116,  117,
          118,  119,  120,  121,  122,   37,   38,   30,  116,   32,
           33,   34,   35,   36,   37,   38,   39,   40,   41,   42,
           43,    8,   53,   54,   55,   57,   57,  106,  107,  137,
            9,   10,   11,   50,   51,   52,    1,  116,   69,   71,
           72,   73,   74,   75,   76,   77,  134,  135,   80,    1,
           30,   30,   30,   32,   33,   87,   88,   89,   90,   91,
           92,   93,   94,   95,   96,   97,   98,   99,  100,  101,
          102,  103,  104,  105,  106,  107,  108,  109,  110,  111,
          112,  113,  114,  115,  116,  117,  118,  119,  120,  121,
          122,  123,  124,  125,  126,  127,  128,  129,  130,  131,
          132,  133,   80,   70,  136,  137,  138,  139,  140,  141,
          142,  143,  144,    8,    1,  106,   80,  108,  150,  151,
          152,    8,  154,    9,   10,   11,    2,    3,    4,    5,
            6,    7,  164,    9,   10,   11,   12,   13,  116,  119,
          120,  121,  122,  106,   30,  108,   32,   33,   34,   35,
           36,   37,   38,    9,   10,   11,  106,  107,  138,  137,
          138,   37,   38,    9,   10,   11,  116,  134,  135,    1,
            9,   10,   11,  137,   30,   14,    8,  155,  156,  157,
            1,   57,  149,  163,   30,  163,   32,   33,   34,   35,
           36,  155,  156,  157,  161,   71,   72,   73,   74,   75,
           76,   77,    8,   31,   80,  129,  130,  131,  158,  161,
            8,   87,   88,   89,   90,   91,   92,   93,   94,   95,
           96,   97,   98,   99,  100,  101,  102,  103,  104,  105,
          106,  107,  108,  109,  110,  111,  112,  113,  114,  115,
          116,  117,  118,  119,  120,  121,  122,  123,  124,  125,
          126,  127,  128,  129,  130,  131,  132,  133,    8,   80,
          136,  137,  138,  139,  140,  141,  142,  143,  144,  164,
            9,   10,   11,  160,  150,  151,  152,  164,  154,    2,
            3,    4,    5,    6,    7,   80,    9,   10,   11,   12,
           13,   30,    8,   32,   33,   34,   35,   36,   37,   38,
           39,   40,   41,   42,   43,   44,   45,   46,   47,   48,
           49,   50,   51,   52,   53,   54,   55,   30,   57,    1,
            8,  116,  117,  118,  119,  120,  121,  122,  160,  106,
           69,  108,  164,  161,   57,    9,   10,   11,    9,   10,
          161,    1,    1,   37,   38,    1,  167,   31,   71,   72,
           73,   74,   75,   76,   77,    8,   30,   80,   32,   33,
           34,   35,   14,   85,   87,   88,   89,   90,   91,   92,
           93,   94,   95,   96,   97,   98,   99,  100,  101,  102,
          103,  104,  105,  106,  107,  108,  109,  110,  111,  112,
          113,  114,  115,  116,  117,  118,  119,  120,  121,  122,
          123,  124,  125,  126,  127,  128,  129,  130,  131,  132,
          133,    8,  122,  136,  137,  138,  139,  140,  141,  142,
          143,  144,    8,   51,  146,  138,   82,  150,  151,  152,
            2,    3,    4,    5,    6,    7,  106,   97,  108,    1,
           12,   13,  101,   15,    9,   10,   11,  106,   80,  108,
          163,    1,   80,  163,  113,   83,    8,  116,  117,  118,
          119,  120,  121,  122,  123,   30,    8,   32,   33,   34,
            8,  117,  118,   80,   31,  159,  122,  159,   50,   51,
            8,   80,  128,   70,   56,  155,   58,   59,   60,   61,
           62,   63,   64,   65,   66,   67,   68,    1,   70,   71,
           72,   73,   74,  162,    9,  161,   78,   79,   80,    1,
           82,  167,  164,    1,   86,   87,   88,   89,  122,   91,
          101,   93,   84,   95,  156,    8,   98,   99,    8,  161,
          138,  103,  104,  105,  106,  107,    8,  109,  110,   31,
           97,    8,  123,  115,  116,   70,    8,  134,  135,  156,
          122,    8,  124,  125,  126,  163,  155,  156,  157,  163,
          116,    8,  149,  162,  136,  137,    8,  139,  140,  141,
          142,  143,  144,  145,  161,   14,  163,  160,   82,  151,
          152,  164,  138,  155,  156,  157,  158,   75,   76,   77,
           14,  163,   84,  165,  166,  167,   84,  159,  116,  161,
           82,   14,   90,   85,   92,   14,   94,  163,   96,  134,
          135,  161,  116,  159,    1,  161,   14,  167,  106,   14,
          138,    8,  164,   16,  149,   31,  164,   37,   38,  117,
          118,   75,   76,  137,  122,   31,  161,   14,  163,  127,
          128,  129,  130,  131,   16,   17,   18,   19,   20,   21,
           22,   23,   24,   25,   26,   27,   28,   29,   16,  163,
           70,   75,   76,  167,   16,  147,  148,  159,   16,  161,
           16,  159,   82,  161,  162,   16,   86,   16,   74,   70,
           16,   70,  101,  102,   80,  106,  107,   59,   60,  106,
          107,   87,   88,   89,   31,   91,    1,   93,   70,   95,
          111,  112,   98,   16,   16,   16,  116,  103,  104,  105,
           16,   31,  122,  109,  110,   37,   38,   16,   35,  115,
          116,   31,    0,    1,   31,   30,  136,  137,  124,  139,
          140,  141,  142,  143,  144,   31,   31,   31,   31,   31,
           31,  151,  152,  134,  135,  134,  135,   37,   38,   31,
           31,   31,   74,  163,   31,    1,  166,  167,   80,   31,
          149,   31,  134,  135,   31,   87,   88,   89,   31,   91,
          161,   93,  161,   95,   31,   31,   98,  149,   37,   37,
           35,  103,  104,  105,   74,   31,   35,  109,  110,  161,
           80,   35,   35,  115,  116,   70,   35,   87,   88,   89,
           35,   91,  124,   93,   37,   95,   84,   37,   98,   38,
           57,  116,    1,  103,  104,  105,   69,   77,   31,  109,
          110,   82,   70,   85,   89,  115,  116,   96,  106,   80,
          108,   83,  154,  138,  124,  113,   90,   82,   84,  117,
          118,  114,   31,   80,  122,   85,  132,   97,  132,  127,
          128,  129,  130,  131,   92,   97,   97,  128,  163,  134,
          135,   74,   70,   94,    1,  133,  100,   80,  100,  154,
          146,  137,  150,  160,   87,   88,   89,  113,   91,    1,
           93,  159,   95,  161,  162,   98,  161,  161,    1,  153,
          103,  104,  105,   74,   -1,   84,  109,  110,   -1,   80,
            1,   -1,  115,  116,   -1,   -1,   87,   88,   89,   31,
           91,  124,   93,  159,   95,  161,  138,   98,   31,  146,
           -1,  102,  103,  104,  105,   74,  134,  135,  109,  110,
          149,   80,   81,  149,  115,  116,  153,  149,   87,   88,
           89,  149,   91,  124,   93,  149,   95,   84,  149,   98,
          155,  158,  161,  161,  103,  104,  105,  159,  161,  159,
          109,  110,   84,  100,  101,  102,  115,  116,  159,  106,
          159,   84,  161,  159,  159,  124,  159,  159,  162,  159,
          117,  118,  159,   84,  159,  122,  159,  159,  159,  159,
          127,  128,  129,  130,  131,   70,  159,  159,  159,  100,
          101,  102,    1,  159,  161,  106,  160,   82,  160,  160,
          160,   86,  160,  166,  161,  161,  117,  118,  161,    1,
          161,  122,  159,  161,  161,  162,  127,  128,  129,  130,
          131,  161,   31,  161,  161,  161,  165,  159,  162,  161,
          163,  116,  162,  162,  162,  162,  159,  122,  161,  163,
          162,  162,  162,  162,  162,  162,  162,  162,  159,  162,
          161,  162,  137,  162,  139,  140,  141,  142,  143,  144,
          162,  162,  162,  162,  162,  162,  151,  152,  162,  162,
           74,  162,  162,   82,  162,  164,   80,  163,  163,  163,
          163,  166,  167,   87,   88,   89,  163,   91,  163,   93,
           82,   95,  163,  163,   98,  163,  163,  163,  163,  103,
          104,  105,  163,  163,  163,  109,  110,  116,  117,  118,
          163,  115,  116,  122,  163,  163,  163,  163,  163,  128,
          124,  163,  163,  163,  116,  117,  118,  163,  137,  163,
          122,  163,  163,  163,  163,  163,  128,  163,  163,  163,
          163,  163,  163,   -1,  164,  137,  164,  164,  164,  158,
          164,  164,  164,  164,  163,  165,  164,  164,  167,  164,
           -1,  164,  164,  164,  164,  164,  158,  164,  164,  164,
          164,  163,   -1,  164,  164,  167,  164,  164,  164,  164,
          164,  164,  164,  164,  164,  164,  164,  164,  164,  164,
          164,  164,  164,  164,  164,  164,  164,   -1,   -1,   -1,
          167
    );

    protected $actionBase = array(
            0,   -2,  154,  542,  752,  893,  929,   52,  374,  431,
          398,  869,  793,  235,  307,  307,  793,  307,  784,  908,
          908,  917,  908,  538,  841,  468,  468,  468,  708,  708,
          708,  708,  740,  740,  849,  849,  881,  817,  634, 1036,
         1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036,
         1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036,
         1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036,
         1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036,
         1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036,
         1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036,
         1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036,
         1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036,
         1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036,
         1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036,
         1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036,
         1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036,
         1036, 1036, 1036, 1036,  348,  346,  370,  653, 1063, 1069,
         1065, 1070, 1061, 1060, 1064, 1066, 1071,  946,  947,  774,
          949,  950,  943,  952, 1067,  882, 1062, 1068,  291,  291,
          291,  291,  291,  291,  291,  291,  291,  291,  291,  291,
          291,  291,  291,  291,  291,  291,  291,  291,  291,  291,
          291,  291,  291,  291,  291,  525,  191,  359,    4,    4,
            4,    4,    4,    4,    4,    4,    4,    4,    4,    4,
            4,    4,    4,    4,    4,    4,    4,    4,  174,  174,
          174,  620,  620,   51,  465,  356,  955,  955,  955,  955,
          955,  955,  955,  955,  955,  955,  658,  184,  144,  144,
            7,    7,    7,    7,    7, 1031,  371, 1048,  -25,  -25,
          -25,  -25,   50,  725,  526,  449,   39,  317,   80,  474,
          474,   13,   13,  512,  512,  422,  422,  512,  512,  512,
          808,  808,  808,  808,  443,  505,  360,  308,  -78,  209,
          209,  209,  209,  -78,  -78,  -78,  -78,  803,  877,  -78,
          -78,  -78,   63,  641,  641,  822,   -1,   -1,   -1,  641,
          253,  790,  548,  253,  384,  548,  480,  402,  764,  759,
          -49,  447,  764,  639,  755,  198,  143,  825,  609,  825,
         1059,  320,  768,  426,  749,  720,  874,  904, 1072,  796,
          941,  798,  942,  106,  -58,  710, 1058, 1058, 1058, 1058,
         1058, 1058, 1058, 1058, 1058, 1058, 1058, 1073,  336, 1059,
          423, 1073, 1073, 1073,  336,  336,  336,  336,  336,  336,
          336,  336,  336,  336,  619,  423,  586,  616,  423,  795,
          336,  348,  814,  348,  348,  348,  348,  348,  348,  348,
          348,  348,  348,  750,  202,  348,  346,   78,   78,  484,
           65,   78,   78,   78,   78,  348,  348,  348,  348,  609,
          783,  766,  613,  813,  492,  783,  783,  783,  473,  135,
          378,  488,  713,  775,   67,  779,  779,  785,  969,  969,
          779,  769,  779,  785,  975,  779,  779,  969,  969,  823,
          280,  563,  478,  550,  568,  969,  377,  779,  779,  779,
          779,  746,  573,  779,  342,  314,  779,  779,  746,  744,
          760,   43,  762,  969,  969,  969,  746,  547,  762,  762,
          762,  839,  844,  794,  758,  444,  433,  588,  232,  801,
          758,  758,  779,  558,  794,  758,  794,  758,  745,  758,
          758,  758,  794,  758,  769,  502,  758,  717,  583,  224,
          758,    6,  979,  980,  624,  981,  973,  987, 1019,  991,
          992,  873,  965,  999,  974,  993,  972,  970,  773,  682,
          684,  818,  811,  963,  777,  777,  777,  956,  777,  777,
          777,  777,  777,  777,  777,  777,  682,  743,  829,  765,
         1006,  689,  691,  754,  906,  901, 1030, 1004, 1049,  994,
          828,  694, 1028, 1008,  846,  821, 1009, 1010, 1029, 1050,
         1052,  910,  782,  911,  912,  876, 1012,  883,  777,  979,
          992,  693,  974,  993,  972,  970,  748,  739,  737,  738,
          736,  735,  723,  734,  753, 1053,  954,  907,  878, 1011,
          957,  682,  879, 1023,  756, 1032, 1033,  827,  788,  778,
          880,  913, 1014, 1015, 1016,  884, 1054,  887,  830, 1024,
          951, 1035,  789,  918, 1037, 1038, 1039, 1040,  889,  919,
          892,  916,  900,  845,  776, 1020,  761,  920,  591,  787,
          791,  800, 1018,  606, 1000,  902,  921,  922, 1041, 1043,
         1044,  923,  924,  995,  847, 1026,  799, 1027, 1022,  848,
          850,  617,  797, 1055,  781,  786,  772,  621,  632,  925,
          927,  931,  998,  763,  770,  853,  855, 1056,  771, 1057,
          938,  635,  857,  718,  939, 1046,  719,  724,  637,  678,
          672,  731,  792,  903,  826,  757,  780, 1017,  724,  767,
          858,  940,  859,  860,  867, 1045,  868,    0,    0,    0,
            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
            0,    0,    0,    0,    0,    0,    0,  458,  458,  458,
          458,  458,  458,  307,  307,  307,  307,  307,  307,  307,
            0,    0,  307,    0,  458,  458,  458,  458,  458,  458,
          458,  458,  458,  458,  458,  458,  458,  458,  458,  458,
          458,  458,  458,  458,  458,  458,  458,  458,  458,  458,
          458,  458,  458,  458,  458,  458,  458,  458,  458,  458,
          458,  458,  458,  458,  458,  458,  458,  458,  458,  458,
          458,  458,  458,  458,  458,  458,  458,  458,  458,  458,
          458,  458,  458,  458,  458,  458,  458,  458,  458,  458,
          458,  458,  458,  458,  458,  458,  458,  458,  458,  458,
          458,  458,  458,  458,  458,  458,  458,  458,  458,  458,
          458,  458,  458,  458,  458,  458,  458,  458,  458,  458,
          458,  458,  458,  458,  458,  458,  458,  458,  458,  458,
          458,  458,  458,  458,  458,  458,  458,  458,  458,  458,
          458,  458,  458,  458,  458,  458,  458,  458,  458,  458,
          458,  458,  458,  458,  458,  458,  458,  458,  458,  458,
          458,  458,  458,  458,  458,  458,  458,  458,  458,  458,
          291,  291,  291,  291,  291,  291,  291,  291,  291,  291,
          291,  291,  291,  291,  291,  291,  291,  291,  291,  291,
          291,  291,  291,  291,    0,    0,    0,    0,    0,    0,
            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
            0,  291,  291,  291,  291,  291,  291,  291,  291,  291,
          291,  291,  291,  291,  291,  291,  291,  291,  291,  291,
          291,  291,  291,  291,  291,  291,  291,   66,   66,  291,
          291,  291,   66,   66,   66,   66,   66,   66,   66,   66,
           66,   66,    0,  291,  291,  291,  291,  291,  291,  291,
          291,   66,  823,   66,   -1,   -1,   -1,   -1,   66,   66,
           66,  -88,  -88,   66,  384,   66,   66,   -1,   -1,   66,
           66,   66,   66,   66,   66,   66,   66,   66,   66,   66,
            0,    0,  423,  548,   66,  769,  769,  769,  769,   66,
           66,   66,   66,  548,  548,   66,   66,   66,    0,    0,
            0,    0,    0,    0,    0,    0,  423,  548,    0,  423,
            0,    0,  769,  769,   66,  384,  823,  643,   66,    0,
            0,    0,    0,  423,  769,  423,  336,  779,  548,  779,
          336,  336,   78,  348,  643,  611,  611,  611,  611,    0,
            0,  609,  823,  823,  823,  823,  823,  823,  823,  823,
          823,  823,  823,  769,    0,  823,    0,  769,  769,  769,
            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
            0,    0,    0,    0,    0,  769,    0,    0,  969,    0,
            0,    0,    0,    0,    0,    0,    0,    0,    0,  975,
            0,    0,    0,    0,    0,    0,  769,    0,    0,    0,
            0,    0,    0,    0,    0,    0,  777,  788,    0,  788,
            0,  777,  777,  777,    0,    0,    0,    0,  797,  771
    );

    protected $actionDefault = array(
            3,32767,  103,32767,32767,32767,32767,32767,32767,32767,
        32767,32767,32767,32767,32767,32767,  101,32767,32767,32767,
        32767,32767,32767,32767,32767,32767,32767,32767,  596,  596,
          596,  596,32767,32767,  254,  103,32767,32767,  469,  387,
          387,  387,32767,32767,  540,  540,  540,  540,  540,  540,
        32767,32767,32767,32767,32767,32767,  469,32767,32767,32767,
        32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,
        32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,
        32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,
        32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,
        32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,
        32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,
        32767,32767,32767,32767,32767,32767,32767,32767,32767,  101,
        32767,32767,32767,   37,    7,    8,   10,   11,   50,   17,
          324,32767,32767,32767,32767,  103,32767,32767,32767,32767,
        32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,
        32767,32767,32767,32767,32767,32767,32767,  589,32767,32767,
        32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,
        32767,32767,32767,32767,32767,32767,32767,32767,  473,  452,
          453,  455,  456,  386,  541,  595,  327,  592,  385,  146,
          339,  329,  242,  330,  258,  474,  259,  475,  478,  479,
          215,  287,  382,  150,  151,  416,  470,  418,  468,  472,
          417,  392,  397,  398,  399,  400,  401,  402,  403,  404,
          405,  406,  407,  408,  409,  390,  391,  471,  449,  448,
          447,32767,32767,  414,  415,  419,32767,32767,32767,32767,
        32767,32767,32767,32767,  103,32767,  389,  422,  420,  421,
          438,  439,  436,  437,  440,32767,32767,32767,  441,  442,
          443,  444,  316,32767,32767,  366,  364,  316,  112,32767,
        32767,  429,  430,32767,32767,32767,32767,32767,32767,32767,
        32767,32767,32767,32767,  534,  446,32767,32767,32767,32767,
        32767,32767,32767,32767,32767,32767,32767,32767,32767,  103,
        32767,  101,  536,  411,  413,  503,  424,  425,  423,  393,
        32767,  510,32767,  103,32767,  512,32767,32767,32767,32767,
        32767,32767,32767,  535,32767,  542,  542,32767,  496,  101,
          195,32767,32767,32767,  195,  195,32767,32767,32767,32767,
        32767,32767,32767,32767,  603,  496,  111,  111,  111,  111,
          111,  111,  111,  111,  111,  111,  111,32767,  195,  111,
        32767,32767,32767,  101,  195,  195,  195,  195,  195,  195,
          195,  195,  195,  195,  190,32767,  268,  270,  103,  557,
          195,32767,  515,32767,32767,32767,32767,32767,32767,32767,
        32767,32767,32767,  508,32767,32767,32767,32767,32767,32767,
        32767,32767,32767,32767,32767,32767,32767,32767,32767,  496,
          434,  139,32767,  139,  542,  426,  427,  428,  498,  542,
          542,  542,  312,  289,32767,32767,32767,32767,  513,  513,
          101,  101,  101,  101,  508,32767,32767,32767,32767,  112,
          100,  100,  100,  100,  100,  104,  102,32767,32767,32767,
        32767,  223,  100,32767,  102,  102,32767,32767,  223,  225,
          212,  102,  227,32767,  561,  562,  223,  102,  227,  227,
          227,  247,  247,  485,  318,  102,  100,  102,  102,  197,
          318,  318,32767,  102,  485,  318,  485,  318,  199,  318,
          318,  318,  485,  318,32767,  102,  318,  214,  100,  100,
          318,32767,32767,32767,  498,32767,32767,32767,32767,32767,
        32767,32767,  222,32767,32767,32767,32767,32767,32767,32767,
          529,32767,  546,  559,  432,  433,  435,  544,  457,  458,
          459,  460,  461,  462,  463,  465,  591,32767,  502,32767,
        32767,32767,  338,  601,32767,  601,32767,32767,32767,32767,
        32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,
        32767,  602,32767,  542,32767,32767,32767,32767,  431,    9,
           76,  491,   43,   44,   52,   58,  519,  520,  521,  522,
          516,  517,  523,  518,32767,32767,  524,  567,32767,32767,
          543,  594,32767,32767,32767,32767,32767,32767,  139,32767,
        32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,
          529,32767,  137,32767,32767,32767,32767,32767,32767,32767,
        32767,  525,32767,32767,32767,  542,32767,32767,32767,32767,
          314,  311,32767,32767,32767,32767,32767,32767,32767,32767,
        32767,32767,32767,32767,32767,32767,32767,32767,  542,32767,
        32767,32767,32767,32767,  291,32767,  308,32767,32767,32767,
        32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,
        32767,32767,32767,  286,32767,32767,  381,  498,  294,  296,
          297,32767,32767,32767,32767,  360,32767,32767,32767,32767,
        32767,32767,32767,32767,32767,32767,32767,  153,  153,    3,
            3,  341,  153,  153,  153,  341,  341,  153,  341,  341,
          341,  153,  153,  153,  153,  153,  153,  280,  185,  262,
          265,  247,  247,  153,  352,  153
    );

    protected $goto = array(
          196,  196, 1031,  703,  694,  430,  658, 1062, 1334, 1334,
          424,  313,  314,  335,  573,  319,  429,  336,  431,  635,
          651,  652,  850,  669,  670,  671, 1334,  167,  167,  167,
          167,  221,  197,  193,  193,  177,  179,  216,  193,  193,
          193,  193,  193,  194,  194,  194,  194,  194,  194,  188,
          189,  190,  191,  192,  218,  216,  219,  534,  535,  420,
          536,  538,  539,  540,  541,  542,  543,  544,  545, 1132,
          168,  169,  170,  195,  171,  172,  173,  166,  174,  175,
          176,  178,  215,  217,  220,  238,  243,  244,  245,  257,
          258,  259,  260,  261,  262,  263,  264,  268,  269,  270,
          271,  281,  282,  316,  317,  318,  425,  426,  427,  578,
          222,  223,  224,  225,  226,  227,  228,  229,  230,  231,
          232,  233,  234,  235,  236,  180,  237,  181,  198,  199,
          200,  239,  188,  189,  190,  191,  192,  218, 1132,  201,
          182,  183,  184,  202,  198,  185,  240,  203,  201,  165,
          204,  205,  186,  206,  207,  208,  187,  209,  210,  211,
          212,  213,  214,  853,  851,  278,  278,  278,  278,  418,
          620,  620,  350,  570,  597, 1265, 1265, 1265, 1265, 1265,
         1265, 1265, 1265, 1265, 1265, 1283, 1283,  831,  618,  655,
         1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283,
          353,  353,  353,  353,  866,  557,  550,  858,  825,  907,
          902,  903,  916,  859,  904,  856,  905,  906,  857,  878,
          457,  910,  865,  884,  546,  546,  546,  546,  831,  601,
          831, 1084, 1079, 1080, 1081,  341,  550,  557,  566,  567,
          343,  576,  599,  613,  614,  407,  408,  972,  465,  465,
          667,   15,  668, 1323,  411,  412,  413,  465,  681,  348,
         1233,  414, 1233,  478,  569,  346,  439, 1031, 1031, 1233,
          993,  480, 1031,  393, 1031, 1031, 1104, 1105, 1031, 1031,
         1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1315,
         1315, 1315, 1315, 1233,  657, 1333, 1333, 1055, 1233, 1233,
         1233, 1233, 1037, 1036, 1233, 1233, 1233, 1034, 1034, 1181,
          354,  678,  949, 1333,  437, 1026, 1042, 1043,  337,  691,
          354,  354,  827,  923,  691, 1040, 1041,  924,  691,  663,
         1336,  939,  871,  939,  354,  354, 1281, 1281,  354,  679,
         1350, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281,
         1281,  552,  537,  537,  911,  354,  912,  537,  537,  537,
          537,  537,  537,  537,  537,  537,  537,  548,  564,  548,
          574,  611,  730,  634,  636,  849,  548,  656,  475, 1308,
         1309,  680,  684, 1007,  692,  701, 1003,  252,  252,  996,
          970,  970,  968,  970,  729,  843,  549, 1005, 1000,  423,
          455,  608, 1294,  846,  955,  966,  966,  966,  966,  325,
          308,  455,  960,  967,  249,  249,  249,  249,  251,  253,
          402,  351,  352,  683,  868,  551,  561,  449,  449,  449,
          551, 1305,  561, 1305,  612,  396,  461, 1010, 1010, 1224,
         1305,  395,  398,  558,  598,  602, 1015,  468,  577,  469,
          470, 1310, 1311,  876,  552,  846, 1341, 1342,  964,  409,
          702,  733,  324,  275,  324, 1317, 1317, 1317, 1317,  606,
          621,  624,  625,  626,  627,  648,  649,  650,  705, 1068,
          596, 1097,  874,  706,  476, 1228,  507,  697,  880, 1095,
         1115,  432, 1301,  628,  630,  632,  432,  879,  867, 1067,
         1071,    5, 1072,    6, 1038, 1038,  977,    0,  975,  662,
         1049, 1045, 1046,    0,    0,    0,    0, 1226,  449,  449,
          449,  449,  449,  449,  449,  449,  449,  449,  449,  928,
         1120,  449,  965, 1070,    0,    0,  616, 1303, 1303, 1070,
         1229, 1230, 1012,  499,    0,  500,    0,    0,  841,    0,
          870,  506,  661,  991, 1113,  883, 1212,  941,  864,    0,
         1213, 1216,  942, 1217,    0,    0, 1231, 1291, 1292,    0,
         1223,    0,    0,    0,  846,    0,    0,    0,    0,    0,
            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
            0,    0,    0,    0,    0,    0,    0,  255,  255
    );

    protected $gotoCheck = array(
           42,   42,   72,    9,   72,   65,   65,  126,  181,  181,
           65,   65,   65,   65,   65,   65,   65,   65,   65,   65,
           85,   85,   26,   85,   85,   85,  181,   42,   42,   42,
           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,
           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,
           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,
           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,
           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,
           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,
           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,
           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,
           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,
           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,
           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,
           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,
           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,
           42,   42,   42,   15,   27,   23,   23,   23,   23,   43,
          107,  107,   96,  170,  129,  107,  107,  107,  107,  107,
          107,  107,  107,  107,  107,  168,  168,   12,   55,   55,
          168,  168,  168,  168,  168,  168,  168,  168,  168,  168,
           24,   24,   24,   24,   35,   75,   75,   15,    6,   15,
           15,   15,   15,   15,   15,   15,   15,   15,   15,   35,
           82,   15,   35,   45,  106,  106,  106,  106,   12,  106,
           12,   15,   15,   15,   15,   75,   75,   75,   75,   75,
           75,   75,   75,   75,   75,   81,   81,   49,  148,  148,
           81,   75,   81,  179,   81,   81,   81,  148,   81,  177,
           72,   81,   72,   83,  103,   81,   82,   72,   72,   72,
          102,   83,   72,   61,   72,   72,  143,  143,   72,   72,
           72,   72,   72,   72,   72,   72,   72,   72,   72,    9,
            9,    9,    9,   72,   63,  180,  180,  113,   72,   72,
           72,   72,  117,  117,   72,   72,   72,   88,   88,  150,
           14,   88,   88,  180,  112,   88,   88,   88,   29,    7,
           14,   14,    7,   72,    7,  118,  118,   72,    7,  119,
          180,    9,   39,    9,   14,   14,  169,  169,   14,  115,
           14,  169,  169,  169,  169,  169,  169,  169,  169,  169,
          169,   14,  171,  171,   64,   14,   64,  171,  171,  171,
          171,  171,  171,  171,  171,  171,  171,   19,   48,   19,
            2,    2,   48,   48,   48,   25,   19,   48,  174,  174,
          174,   48,   48,   48,   48,   48,   48,    5,    5,   25,
           25,   25,   25,   25,   25,   18,   25,   25,   25,   13,
           19,   13,   14,   22,   91,   19,   19,   19,   19,  167,
          167,   19,   19,   19,    5,    5,    5,    5,    5,    5,
           28,   96,   96,   14,   37,    9,    9,   23,   23,   23,
            9,  129,    9,  129,   79,    9,    9,  106,  106,  159,
          129,   58,   58,   58,   58,   58,  109,    9,    9,    9,
            9,  176,  176,    9,   14,   22,    9,    9,   92,   92,
           92,   98,   24,   24,   24,  129,  129,  129,  129,   80,
           80,   80,   80,   80,   80,   80,   80,   80,   80,  128,
            8,    8,    9,    8,  156,   20,    8,    8,   41,    8,
          146,  116,  129,   84,   84,   84,  116,   16,   16,   16,
           16,   46,  131,   46,  116,  116,   95,   -1,   16,  116,
          116,  116,  116,   -1,   -1,   -1,   -1,   14,   23,   23,
           23,   23,   23,   23,   23,   23,   23,   23,   23,   17,
           17,   23,   16,  129,   -1,   -1,   17,  129,  129,  129,
           20,   20,   17,  154,   -1,  154,   -1,   -1,   20,   -1,
           17,  154,   17,   17,   16,   16,   78,   78,   17,   -1,
           78,   78,   78,   78,   -1,   -1,   20,   20,   20,   -1,
           17,   -1,   -1,   -1,   22,   -1,   -1,   -1,   -1,   -1,
           -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
           -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
           -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
           -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
           -1,   -1,   -1,   -1,   -1,   -1,   -1,    5,    5
    );

    protected $gotoBase = array(
            0,    0, -339,    0,    0,  386,  195,  312,  472,  -10,
            0,    0, -109,   62,   13, -184,   46,   65,   86,  102,
           93,    0,  125,  162,  197,  371,   18,  160,   83,   22,
            0,    0,    0,    0,    0, -166,    0,   85,    0,    9,
            0,   48,   -1,  157,    0,  207, -232,    0, -340,  223,
            0,    0,    0,    0,    0,  148,    0,    0,  396,    0,
            0,  231,    0,   52,  334, -236,    0,    0,    0,    0,
            0,    0,   -5,    0,    0, -139,    0,    0,  149,   91,
          112, -245,  -58, -205,   15, -695,    0,    0,   28,    0,
            0,   75,  154,    0,    0,   64, -310,    0,   55,    0,
            0,    0,  235,  221,    0,    0,  196,  -71,    0,   77,
            0,    0,   37,   24,    0,   56,  219,   23,   40,   39,
            0,    0,    0,    0,    0,    0,    5,    0,  106,  166,
            0,   61,    0,    0,    0,    0,    0,    0,    0,    0,
            0,    0,    0,    1,    0,    0,   47,    0,  214,    0,
           35,    0,    0,    0,   49,    0,   45,    0,    0,   71,
            0,    0,    0,    0,    0,    0,    0,   88,  -56,   95,
          144,  111,    0,    0,   78,    0,   80,  229,    0,  222,
          -12, -299,    0,    0
    );

    protected $gotoDefault = array(
        -32768,  511,  737,    4,  738,  932,  814,  823,  594,  528,
          704,  347,  622,  421, 1299,  909, 1119,  575,  842, 1242,
         1250,  456,  845,  330,  727,  891,  892,  893,  399,  385,
          391,  397,  646,  623,  493,  877,  452,  869,  485,  872,
          451,  881,  164,  417,  509,  885,    3,  888,  554,  919,
          386,  896,  387,  674,  898,  560,  900,  901,  394,  400,
          401, 1124,  568,  619,  913,  256,  562,  914,  384,  915,
          922,  389,  392,  685,  464,  504,  498,  410, 1099,  563,
          605,  643,  446,  472,  617,  629,  615,  479,  433,  415,
          329,  954,  962,  486,  462,  976,  349,  984,  735, 1131,
          637,  488,  992,  638,  999, 1002,  529,  530,  477, 1014,
          272, 1017,  489,   12,  664, 1028, 1029,  665,  639, 1051,
          640,  666,  641, 1053,  471,  595, 1061,  453, 1069, 1287,
          454, 1073,  266, 1076,  277,  416,  434, 1082, 1083,    9,
         1089,  695,  696,   11,  276,  508, 1114,  686,  450, 1130,
          438, 1200, 1202,  556,  490, 1220, 1219,  677,  505, 1225,
          447, 1290,  448,  531,  473,  315,  532,  307,  333,  312,
          547,  294,  334,  533,  474, 1296, 1304,  331,   31, 1324,
         1335,  342,  572,  610
    );

    protected $ruleToNonTerminal = array(
            0,    1,    3,    3,    2,    5,    5,    6,    6,    6,
            6,    6,    6,    6,    6,    6,    6,    6,    6,    6,
            6,    6,    6,    6,    6,    6,    6,    6,    6,    6,
            6,    6,    6,    6,    6,    6,    6,    6,    6,    6,
            6,    6,    6,    6,    6,    6,    6,    6,    6,    6,
            6,    6,    6,    6,    6,    6,    6,    6,    6,    6,
            6,    6,    6,    6,    6,    6,    6,    6,    6,    6,
            6,    6,    6,    6,    6,    6,    6,    6,    7,    7,
            7,    7,    7,    7,    7,    7,    8,    8,    9,   10,
           11,   11,   11,   12,   12,   13,   13,   14,   15,   15,
           16,   16,   17,   17,   18,   18,   21,   21,   22,   23,
           23,   24,   24,    4,    4,    4,    4,    4,    4,    4,
            4,    4,    4,    4,   29,   29,   30,   30,   32,   34,
           34,   28,   36,   36,   33,   38,   38,   35,   35,   37,
           37,   39,   39,   31,   40,   40,   41,   43,   44,   44,
           45,   45,   46,   46,   48,   47,   47,   47,   47,   49,
           49,   49,   49,   49,   49,   49,   49,   49,   49,   49,
           49,   49,   49,   49,   49,   49,   49,   49,   49,   49,
           49,   49,   49,   25,   25,   68,   68,   71,   71,   70,
           69,   69,   62,   74,   74,   75,   75,   76,   76,   77,
           77,   78,   78,   79,   79,   26,   26,   27,   27,   27,
           27,   27,   87,   87,   89,   89,   82,   82,   90,   90,
           91,   91,   91,   83,   83,   86,   86,   84,   84,   92,
           93,   93,   56,   56,   64,   64,   67,   67,   67,   66,
           94,   94,   95,   57,   57,   57,   57,   96,   96,   97,
           97,   98,   98,   99,  100,  100,  101,  101,  102,  102,
           54,   54,   50,   50,  104,   52,   52,  105,   51,   51,
           53,   53,   63,   63,   63,   63,   80,   80,  108,  108,
          110,  110,  111,  111,  111,  111,  109,  109,  109,  113,
          113,  113,  113,   88,   88,  116,  116,  116,  117,  117,
          114,  114,  118,  118,  120,  120,  121,  121,  115,  122,
          122,  119,  123,  123,  123,  123,  112,  112,   81,   81,
           81,   20,   20,   20,  125,  124,  124,  126,  126,  126,
          126,   59,  127,  127,  128,   60,  130,  130,  131,  131,
          132,  132,   85,  133,  133,  133,  133,  133,  133,  133,
          138,  138,  139,  139,  140,  140,  140,  140,  140,  141,
          142,  142,  137,  137,  134,  134,  136,  136,  144,  144,
          143,  143,  143,  143,  143,  143,  143,  135,  145,  145,
          147,  146,  146,   61,  103,  148,  148,   55,   55,   42,
           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,
           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,
           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,
           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,
           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,
           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,
           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,
           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,
           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,
           42,   42,  155,  149,  149,  154,  154,  157,  158,  158,
          159,  160,  161,  161,  161,  161,   19,   19,   72,   72,
           72,   72,  150,  150,  150,  150,  163,  163,  151,  151,
          153,  153,  153,  156,  156,  168,  168,  168,  168,  168,
          168,  168,  168,  168,  169,  169,  169,  107,  171,  171,
          171,  171,  152,  152,  152,  152,  152,  152,  152,  152,
           58,   58,  166,  166,  166,  166,  172,  172,  162,  162,
          162,  173,  173,  173,  173,  173,  173,   73,   73,   65,
           65,   65,   65,  129,  129,  129,  129,  176,  175,  165,
          165,  165,  165,  165,  165,  165,  164,  164,  164,  174,
          174,  174,  174,  106,  170,  178,  178,  177,  177,  179,
          179,  179,  179,  179,  179,  179,  179,  167,  167,  167,
          167,  181,  182,  180,  180,  180,  180,  180,  180,  180,
          180,  183,  183,  183,  183
    );

    protected $ruleToLength = array(
            1,    1,    2,    0,    1,    1,    1,    1,    1,    1,
            1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
            1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
            1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
            1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
            1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
            1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
            1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
            1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
            1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
            0,    1,    0,    1,    1,    2,    1,    3,    4,    1,
            2,    0,    1,    1,    1,    1,    1,    3,    5,    4,
            3,    4,    2,    3,    1,    1,    7,    6,    2,    3,
            1,    2,    3,    1,    2,    3,    1,    1,    3,    1,
            3,    1,    2,    2,    3,    1,    3,    2,    3,    1,
            3,    3,    2,    0,    1,    1,    1,    1,    1,    3,
            7,   10,    5,    7,    9,    5,    3,    3,    3,    3,
            3,    3,    1,    2,    5,    7,    9,    6,    5,    6,
            3,    2,    1,    1,    1,    0,    2,    1,    3,    8,
            0,    4,    2,    1,    3,    0,    1,    0,    1,    0,
            1,    3,    1,    1,    1,    8,    9,    7,    8,    7,
            6,    8,    0,    2,    0,    2,    1,    2,    1,    2,
            1,    1,    1,    0,    2,    0,    2,    0,    2,    2,
            1,    3,    1,    4,    1,    4,    1,    1,    4,    2,
            1,    3,    3,    3,    4,    4,    5,    0,    2,    4,
            3,    1,    1,    7,    0,    2,    1,    3,    3,    4,
            1,    4,    0,    2,    5,    0,    2,    6,    0,    2,
            0,    3,    1,    2,    1,    1,    2,    0,    1,    3,
            0,    2,    1,    1,    1,    1,    6,    8,    6,    1,
            2,    1,    1,    1,    1,    1,    1,    1,    1,    3,
            3,    3,    1,    3,    3,    3,    3,    3,    1,    3,
            3,    1,    1,    2,    1,    1,    0,    1,    0,    2,
            2,    2,    4,    3,    1,    1,    3,    1,    2,    2,
            3,    2,    3,    1,    1,    2,    3,    1,    1,    3,
            2,    0,    1,    5,    5,    6,   10,    3,    5,    1,
            1,    3,    0,    2,    4,    5,    4,    4,    4,    3,
            1,    1,    1,    1,    1,    1,    0,    1,    1,    2,
            1,    1,    1,    1,    1,    1,    1,    2,    1,    3,
            1,    1,    3,    2,    2,    3,    1,    0,    1,    1,
            3,    3,    3,    4,    1,    1,    2,    3,    3,    3,
            3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
            2,    2,    2,    2,    3,    3,    3,    3,    3,    3,
            3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
            3,    3,    2,    2,    2,    2,    3,    3,    3,    3,
            3,    3,    3,    3,    3,    3,    3,    5,    4,    3,
            4,    4,    2,    2,    4,    2,    2,    2,    2,    2,
            2,    2,    2,    2,    2,    2,    1,    3,    2,    1,
            2,    4,    2,    2,    8,    9,    8,    9,    9,   10,
            9,   10,    8,    3,    2,    0,    4,    2,    1,    3,
            2,    1,    2,    2,    2,    4,    1,    1,    1,    1,
            1,    1,    1,    1,    3,    1,    1,    1,    0,    3,
            0,    1,    1,    0,    1,    1,    1,    1,    1,    1,
            1,    1,    1,    1,    3,    5,    3,    3,    4,    1,
            1,    3,    1,    1,    1,    1,    1,    3,    2,    3,
            0,    1,    1,    3,    1,    1,    1,    1,    1,    3,
            1,    1,    4,    4,    1,    4,    4,    0,    1,    1,
            1,    3,    3,    1,    4,    2,    2,    1,    3,    1,
            4,    4,    3,    3,    3,    3,    1,    3,    1,    1,
            3,    1,    1,    4,    1,    1,    1,    3,    1,    1,
            2,    1,    3,    4,    3,    2,    0,    2,    2,    1,
            2,    1,    1,    1,    4,    3,    3,    3,    3,    6,
            3,    1,    1,    2,    1
    );

    protected function initReduceCallbacks() {
        $this->reduceCallbacks = [
            0 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            1 => function ($stackPos) {
                 $this->semValue = $this->handleNamespaces($this->semStack[$stackPos-(1-1)]);
            },
            2 => function ($stackPos) {
                 if (is_array($this->semStack[$stackPos-(2-2)])) { $this->semValue = array_merge($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)]); } else { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; };
            },
            3 => function ($stackPos) {
                 $this->semValue = array();
            },
            4 => function ($stackPos) {
                 $startAttributes = $this->lookaheadStartAttributes; if (isset($startAttributes['comments'])) { $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); } else { $nop = null; };
            if ($nop !== null) { $this->semStack[$stackPos-(1-1)][] = $nop; } $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            5 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            6 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            7 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            8 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            9 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            10 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            11 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            12 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            13 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            14 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            15 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            16 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            17 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            18 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            19 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            20 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            21 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            22 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            23 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            24 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            25 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            26 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            27 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            28 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            29 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            30 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            31 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            32 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            33 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            34 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            35 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            36 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            37 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            38 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            39 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            40 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            41 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            42 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            43 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            44 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            45 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            46 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            47 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            48 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            49 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            50 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            51 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            52 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            53 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            54 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            55 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            56 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            57 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            58 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            59 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            60 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            61 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            62 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            63 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            64 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            65 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            66 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            67 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            68 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            69 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            70 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            71 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            72 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            73 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            74 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            75 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            76 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            77 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            78 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            79 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            80 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            81 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            82 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            83 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            84 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            85 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            86 => function ($stackPos) {
                 $this->semValue = new Node\Identifier($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            87 => function ($stackPos) {
                 $this->semValue = new Node\Identifier($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            88 => function ($stackPos) {
                 $this->semValue = new Node\Identifier($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            89 => function ($stackPos) {
                 $this->semValue = new Node\Identifier($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            90 => function ($stackPos) {
                 $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            91 => function ($stackPos) {
                 $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            92 => function ($stackPos) {
                 $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            93 => function ($stackPos) {
                 $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            94 => function ($stackPos) {
                 $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            95 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            96 => function ($stackPos) {
                 $this->semValue = new Name(substr($this->semStack[$stackPos-(1-1)], 1), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            97 => function ($stackPos) {
                 $this->semValue = new Expr\Variable(substr($this->semStack[$stackPos-(1-1)], 1), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            98 => function ($stackPos) {
                 /* nothing */
            },
            99 => function ($stackPos) {
                 /* nothing */
            },
            100 => function ($stackPos) {
                 /* nothing */
            },
            101 => function ($stackPos) {
                 $this->emitError(new Error('A trailing comma is not allowed here', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes));
            },
            102 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            103 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            104 => function ($stackPos) {
                 $this->semValue = new Node\Attribute($this->semStack[$stackPos-(1-1)], [], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            105 => function ($stackPos) {
                 $this->semValue = new Node\Attribute($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            106 => function ($stackPos) {
                 $this->semValue = array($this->semStack[$stackPos-(1-1)]);
            },
            107 => function ($stackPos) {
                 $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
            },
            108 => function ($stackPos) {
                 $this->semValue = new Node\AttributeGroup($this->semStack[$stackPos-(4-2)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            },
            109 => function ($stackPos) {
                 $this->semValue = array($this->semStack[$stackPos-(1-1)]);
            },
            110 => function ($stackPos) {
                 $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)];
            },
            111 => function ($stackPos) {
                 $this->semValue = [];
            },
            112 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            113 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            114 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            115 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            116 => function ($stackPos) {
                 $this->semValue = new Stmt\HaltCompiler($this->lexer->handleHaltCompiler(), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            117 => function ($stackPos) {
                 $this->semValue = new Stmt\Namespace_($this->semStack[$stackPos-(3-2)], null, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            $this->semValue->setAttribute('kind', Stmt\Namespace_::KIND_SEMICOLON);
            $this->checkNamespace($this->semValue);
            },
            118 => function ($stackPos) {
                 $this->semValue = new Stmt\Namespace_($this->semStack[$stackPos-(5-2)], $this->semStack[$stackPos-(5-4)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes);
            $this->semValue->setAttribute('kind', Stmt\Namespace_::KIND_BRACED);
            $this->checkNamespace($this->semValue);
            },
            119 => function ($stackPos) {
                 $this->semValue = new Stmt\Namespace_(null, $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            $this->semValue->setAttribute('kind', Stmt\Namespace_::KIND_BRACED);
            $this->checkNamespace($this->semValue);
            },
            120 => function ($stackPos) {
                 $this->semValue = new Stmt\Use_($this->semStack[$stackPos-(3-2)], Stmt\Use_::TYPE_NORMAL, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            121 => function ($stackPos) {
                 $this->semValue = new Stmt\Use_($this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-2)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            },
            122 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(2-1)];
            },
            123 => function ($stackPos) {
                 $this->semValue = new Stmt\Const_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            124 => function ($stackPos) {
                 $this->semValue = Stmt\Use_::TYPE_FUNCTION;
            },
            125 => function ($stackPos) {
                 $this->semValue = Stmt\Use_::TYPE_CONSTANT;
            },
            126 => function ($stackPos) {
                 $this->semValue = new Stmt\GroupUse($this->semStack[$stackPos-(7-3)], $this->semStack[$stackPos-(7-6)], $this->semStack[$stackPos-(7-2)], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes);
            },
            127 => function ($stackPos) {
                 $this->semValue = new Stmt\GroupUse($this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-5)], Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes);
            },
            128 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(2-1)];
            },
            129 => function ($stackPos) {
                 $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
            },
            130 => function ($stackPos) {
                 $this->semValue = array($this->semStack[$stackPos-(1-1)]);
            },
            131 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(2-1)];
            },
            132 => function ($stackPos) {
                 $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
            },
            133 => function ($stackPos) {
                 $this->semValue = array($this->semStack[$stackPos-(1-1)]);
            },
            134 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(2-1)];
            },
            135 => function ($stackPos) {
                 $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
            },
            136 => function ($stackPos) {
                 $this->semValue = array($this->semStack[$stackPos-(1-1)]);
            },
            137 => function ($stackPos) {
                 $this->semValue = new Stmt\UseUse($this->semStack[$stackPos-(1-1)], null, Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); $this->checkUseUse($this->semValue, $stackPos-(1-1));
            },
            138 => function ($stackPos) {
                 $this->semValue = new Stmt\UseUse($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); $this->checkUseUse($this->semValue, $stackPos-(3-3));
            },
            139 => function ($stackPos) {
                 $this->semValue = new Stmt\UseUse($this->semStack[$stackPos-(1-1)], null, Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); $this->checkUseUse($this->semValue, $stackPos-(1-1));
            },
            140 => function ($stackPos) {
                 $this->semValue = new Stmt\UseUse($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); $this->checkUseUse($this->semValue, $stackPos-(3-3));
            },
            141 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)]; $this->semValue->type = Stmt\Use_::TYPE_NORMAL;
            },
            142 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(2-2)]; $this->semValue->type = $this->semStack[$stackPos-(2-1)];
            },
            143 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(2-1)];
            },
            144 => function ($stackPos) {
                 $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
            },
            145 => function ($stackPos) {
                 $this->semValue = array($this->semStack[$stackPos-(1-1)]);
            },
            146 => function ($stackPos) {
                 $this->semValue = new Node\Const_($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            147 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(2-1)];
            },
            148 => function ($stackPos) {
                 $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
            },
            149 => function ($stackPos) {
                 $this->semValue = array($this->semStack[$stackPos-(1-1)]);
            },
            150 => function ($stackPos) {
                 $this->semValue = new Node\Const_(new Node\Identifier($this->semStack[$stackPos-(3-1)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributeStack[$stackPos-(3-1)]), $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            151 => function ($stackPos) {
                 $this->semValue = new Node\Const_(new Node\Identifier($this->semStack[$stackPos-(3-1)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributeStack[$stackPos-(3-1)]), $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            152 => function ($stackPos) {
                 if (is_array($this->semStack[$stackPos-(2-2)])) { $this->semValue = array_merge($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)]); } else { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; };
            },
            153 => function ($stackPos) {
                 $this->semValue = array();
            },
            154 => function ($stackPos) {
                 $startAttributes = $this->lookaheadStartAttributes; if (isset($startAttributes['comments'])) { $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); } else { $nop = null; };
            if ($nop !== null) { $this->semStack[$stackPos-(1-1)][] = $nop; } $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            155 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            156 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            157 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            158 => function ($stackPos) {
                 throw new Error('__HALT_COMPILER() can only be used from the outermost scope', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            159 => function ($stackPos) {

        if ($this->semStack[$stackPos-(3-2)]) {
            $this->semValue = $this->semStack[$stackPos-(3-2)]; $attrs = $this->startAttributeStack[$stackPos-(3-1)]; $stmts = $this->semValue; if (!empty($attrs['comments'])) {$stmts[0]->setAttribute('comments', array_merge($attrs['comments'], $stmts[0]->getAttribute('comments', []))); };
        } else {
            $startAttributes = $this->startAttributeStack[$stackPos-(3-1)]; if (isset($startAttributes['comments'])) { $this->semValue = new Stmt\Nop($startAttributes + $this->endAttributes); } else { $this->semValue = null; };
            if (null === $this->semValue) { $this->semValue = array(); }
        }

            },
            160 => function ($stackPos) {
                 $this->semValue = new Stmt\If_($this->semStack[$stackPos-(7-3)], ['stmts' => is_array($this->semStack[$stackPos-(7-5)]) ? $this->semStack[$stackPos-(7-5)] : array($this->semStack[$stackPos-(7-5)]), 'elseifs' => $this->semStack[$stackPos-(7-6)], 'else' => $this->semStack[$stackPos-(7-7)]], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes);
            },
            161 => function ($stackPos) {
                 $this->semValue = new Stmt\If_($this->semStack[$stackPos-(10-3)], ['stmts' => $this->semStack[$stackPos-(10-6)], 'elseifs' => $this->semStack[$stackPos-(10-7)], 'else' => $this->semStack[$stackPos-(10-8)]], $this->startAttributeStack[$stackPos-(10-1)] + $this->endAttributes);
            },
            162 => function ($stackPos) {
                 $this->semValue = new Stmt\While_($this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-5)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes);
            },
            163 => function ($stackPos) {
                 $this->semValue = new Stmt\Do_($this->semStack[$stackPos-(7-5)], is_array($this->semStack[$stackPos-(7-2)]) ? $this->semStack[$stackPos-(7-2)] : array($this->semStack[$stackPos-(7-2)]), $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes);
            },
            164 => function ($stackPos) {
                 $this->semValue = new Stmt\For_(['init' => $this->semStack[$stackPos-(9-3)], 'cond' => $this->semStack[$stackPos-(9-5)], 'loop' => $this->semStack[$stackPos-(9-7)], 'stmts' => $this->semStack[$stackPos-(9-9)]], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes);
            },
            165 => function ($stackPos) {
                 $this->semValue = new Stmt\Switch_($this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-5)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes);
            },
            166 => function ($stackPos) {
                 $this->semValue = new Stmt\Break_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            167 => function ($stackPos) {
                 $this->semValue = new Stmt\Continue_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            168 => function ($stackPos) {
                 $this->semValue = new Stmt\Return_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            169 => function ($stackPos) {
                 $this->semValue = new Stmt\Global_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            170 => function ($stackPos) {
                 $this->semValue = new Stmt\Static_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            171 => function ($stackPos) {
                 $this->semValue = new Stmt\Echo_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            172 => function ($stackPos) {
                 $this->semValue = new Stmt\InlineHTML($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            173 => function ($stackPos) {

        $e = $this->semStack[$stackPos-(2-1)];
        if ($e instanceof Expr\Throw_) {
            // For backwards-compatibility reasons, convert throw in statement position into
            // Stmt\Throw_ rather than Stmt\Expression(Expr\Throw_).
            $this->semValue = new Stmt\Throw_($e->expr, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
        } else {
            $this->semValue = new Stmt\Expression($e, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
        }

            },
            174 => function ($stackPos) {
                 $this->semValue = new Stmt\Unset_($this->semStack[$stackPos-(5-3)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes);
            },
            175 => function ($stackPos) {
                 $this->semValue = new Stmt\Foreach_($this->semStack[$stackPos-(7-3)], $this->semStack[$stackPos-(7-5)][0], ['keyVar' => null, 'byRef' => $this->semStack[$stackPos-(7-5)][1], 'stmts' => $this->semStack[$stackPos-(7-7)]], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes);
            },
            176 => function ($stackPos) {
                 $this->semValue = new Stmt\Foreach_($this->semStack[$stackPos-(9-3)], $this->semStack[$stackPos-(9-7)][0], ['keyVar' => $this->semStack[$stackPos-(9-5)], 'byRef' => $this->semStack[$stackPos-(9-7)][1], 'stmts' => $this->semStack[$stackPos-(9-9)]], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes);
            },
            177 => function ($stackPos) {
                 $this->semValue = new Stmt\Foreach_($this->semStack[$stackPos-(6-3)], new Expr\Error($this->startAttributeStack[$stackPos-(6-4)] + $this->endAttributeStack[$stackPos-(6-4)]), ['stmts' => $this->semStack[$stackPos-(6-6)]], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes);
            },
            178 => function ($stackPos) {
                 $this->semValue = new Stmt\Declare_($this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-5)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes);
            },
            179 => function ($stackPos) {
                 $this->semValue = new Stmt\TryCatch($this->semStack[$stackPos-(6-3)], $this->semStack[$stackPos-(6-5)], $this->semStack[$stackPos-(6-6)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); $this->checkTryCatch($this->semValue);
            },
            180 => function ($stackPos) {
                 $this->semValue = new Stmt\Goto_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            181 => function ($stackPos) {
                 $this->semValue = new Stmt\Label($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            182 => function ($stackPos) {
                 $this->semValue = array(); /* means: no statement */
            },
            183 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            184 => function ($stackPos) {
                 $startAttributes = $this->startAttributeStack[$stackPos-(1-1)]; if (isset($startAttributes['comments'])) { $this->semValue = new Stmt\Nop($startAttributes + $this->endAttributes); } else { $this->semValue = null; };
            if ($this->semValue === null) $this->semValue = array(); /* means: no statement */
            },
            185 => function ($stackPos) {
                 $this->semValue = array();
            },
            186 => function ($stackPos) {
                 $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)];
            },
            187 => function ($stackPos) {
                 $this->semValue = array($this->semStack[$stackPos-(1-1)]);
            },
            188 => function ($stackPos) {
                 $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
            },
            189 => function ($stackPos) {
                 $this->semValue = new Stmt\Catch_($this->semStack[$stackPos-(8-3)], $this->semStack[$stackPos-(8-4)], $this->semStack[$stackPos-(8-7)], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes);
            },
            190 => function ($stackPos) {
                 $this->semValue = null;
            },
            191 => function ($stackPos) {
                 $this->semValue = new Stmt\Finally_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            },
            192 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(2-1)];
            },
            193 => function ($stackPos) {
                 $this->semValue = array($this->semStack[$stackPos-(1-1)]);
            },
            194 => function ($stackPos) {
                 $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
            },
            195 => function ($stackPos) {
                 $this->semValue = false;
            },
            196 => function ($stackPos) {
                 $this->semValue = true;
            },
            197 => function ($stackPos) {
                 $this->semValue = false;
            },
            198 => function ($stackPos) {
                 $this->semValue = true;
            },
            199 => function ($stackPos) {
                 $this->semValue = false;
            },
            200 => function ($stackPos) {
                 $this->semValue = true;
            },
            201 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(3-2)];
            },
            202 => function ($stackPos) {
                 $this->semValue = [];
            },
            203 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            204 => function ($stackPos) {
                 $this->semValue = new Node\Identifier($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            205 => function ($stackPos) {
                 $this->semValue = new Stmt\Function_($this->semStack[$stackPos-(8-3)], ['byRef' => $this->semStack[$stackPos-(8-2)], 'params' => $this->semStack[$stackPos-(8-5)], 'returnType' => $this->semStack[$stackPos-(8-7)], 'stmts' => $this->semStack[$stackPos-(8-8)], 'attrGroups' => []], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes);
            },
            206 => function ($stackPos) {
                 $this->semValue = new Stmt\Function_($this->semStack[$stackPos-(9-4)], ['byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-6)], 'returnType' => $this->semStack[$stackPos-(9-8)], 'stmts' => $this->semStack[$stackPos-(9-9)], 'attrGroups' => $this->semStack[$stackPos-(9-1)]], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes);
            },
            207 => function ($stackPos) {
                 $this->semValue = new Stmt\Class_($this->semStack[$stackPos-(7-2)], ['type' => $this->semStack[$stackPos-(7-1)], 'extends' => $this->semStack[$stackPos-(7-3)], 'implements' => $this->semStack[$stackPos-(7-4)], 'stmts' => $this->semStack[$stackPos-(7-6)], 'attrGroups' => []], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes);
            $this->checkClass($this->semValue, $stackPos-(7-2));
            },
            208 => function ($stackPos) {
                 $this->semValue = new Stmt\Class_($this->semStack[$stackPos-(8-3)], ['type' => $this->semStack[$stackPos-(8-2)], 'extends' => $this->semStack[$stackPos-(8-4)], 'implements' => $this->semStack[$stackPos-(8-5)], 'stmts' => $this->semStack[$stackPos-(8-7)], 'attrGroups' => $this->semStack[$stackPos-(8-1)]], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes);
            $this->checkClass($this->semValue, $stackPos-(8-3));
            },
            209 => function ($stackPos) {
                 $this->semValue = new Stmt\Interface_($this->semStack[$stackPos-(7-3)], ['extends' => $this->semStack[$stackPos-(7-4)], 'stmts' => $this->semStack[$stackPos-(7-6)], 'attrGroups' => $this->semStack[$stackPos-(7-1)]], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes);
            $this->checkInterface($this->semValue, $stackPos-(7-3));
            },
            210 => function ($stackPos) {
                 $this->semValue = new Stmt\Trait_($this->semStack[$stackPos-(6-3)], ['stmts' => $this->semStack[$stackPos-(6-5)], 'attrGroups' => $this->semStack[$stackPos-(6-1)]], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes);
            },
            211 => function ($stackPos) {
                 $this->semValue = new Stmt\Enum_($this->semStack[$stackPos-(8-3)], ['scalarType' => $this->semStack[$stackPos-(8-4)], 'implements' => $this->semStack[$stackPos-(8-5)], 'stmts' => $this->semStack[$stackPos-(8-7)], 'attrGroups' => $this->semStack[$stackPos-(8-1)]], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes);
            $this->checkEnum($this->semValue, $stackPos-(8-3));
            },
            212 => function ($stackPos) {
                 $this->semValue = null;
            },
            213 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(2-2)];
            },
            214 => function ($stackPos) {
                 $this->semValue = null;
            },
            215 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(2-2)];
            },
            216 => function ($stackPos) {
                 $this->semValue = 0;
            },
            217 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(2-1)];
            },
            218 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            219 => function ($stackPos) {
                 $this->checkClassModifier($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $stackPos-(2-2)); $this->semValue = $this->semStack[$stackPos-(2-1)] | $this->semStack[$stackPos-(2-2)];
            },
            220 => function ($stackPos) {
                 $this->semValue = Stmt\Class_::MODIFIER_ABSTRACT;
            },
            221 => function ($stackPos) {
                 $this->semValue = Stmt\Class_::MODIFIER_FINAL;
            },
            222 => function ($stackPos) {
                 $this->semValue = Stmt\Class_::MODIFIER_READONLY;
            },
            223 => function ($stackPos) {
                 $this->semValue = null;
            },
            224 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(2-2)];
            },
            225 => function ($stackPos) {
                 $this->semValue = array();
            },
            226 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(2-2)];
            },
            227 => function ($stackPos) {
                 $this->semValue = array();
            },
            228 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(2-2)];
            },
            229 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(2-1)];
            },
            230 => function ($stackPos) {
                 $this->semValue = array($this->semStack[$stackPos-(1-1)]);
            },
            231 => function ($stackPos) {
                 $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
            },
            232 => function ($stackPos) {
                 $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]);
            },
            233 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(4-2)];
            },
            234 => function ($stackPos) {
                 $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]);
            },
            235 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(4-2)];
            },
            236 => function ($stackPos) {
                 $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]);
            },
            237 => function ($stackPos) {
                 $this->semValue = null;
            },
            238 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(4-2)];
            },
            239 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(2-1)];
            },
            240 => function ($stackPos) {
                 $this->semValue = array($this->semStack[$stackPos-(1-1)]);
            },
            241 => function ($stackPos) {
                 $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
            },
            242 => function ($stackPos) {
                 $this->semValue = new Stmt\DeclareDeclare($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            243 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(3-2)];
            },
            244 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(4-3)];
            },
            245 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(4-2)];
            },
            246 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(5-3)];
            },
            247 => function ($stackPos) {
                 $this->semValue = array();
            },
            248 => function ($stackPos) {
                 $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)];
            },
            249 => function ($stackPos) {
                 $this->semValue = new Stmt\Case_($this->semStack[$stackPos-(4-2)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            },
            250 => function ($stackPos) {
                 $this->semValue = new Stmt\Case_(null, $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            251 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            252 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            253 => function ($stackPos) {
                 $this->semValue = new Expr\Match_($this->semStack[$stackPos-(7-3)], $this->semStack[$stackPos-(7-6)], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes);
            },
            254 => function ($stackPos) {
                 $this->semValue = [];
            },
            255 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(2-1)];
            },
            256 => function ($stackPos) {
                 $this->semValue = array($this->semStack[$stackPos-(1-1)]);
            },
            257 => function ($stackPos) {
                 $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
            },
            258 => function ($stackPos) {
                 $this->semValue = new Node\MatchArm($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            259 => function ($stackPos) {
                 $this->semValue = new Node\MatchArm(null, $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            },
            260 => function ($stackPos) {
                 $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]);
            },
            261 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(4-2)];
            },
            262 => function ($stackPos) {
                 $this->semValue = array();
            },
            263 => function ($stackPos) {
                 $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)];
            },
            264 => function ($stackPos) {
                 $this->semValue = new Stmt\ElseIf_($this->semStack[$stackPos-(5-3)], is_array($this->semStack[$stackPos-(5-5)]) ? $this->semStack[$stackPos-(5-5)] : array($this->semStack[$stackPos-(5-5)]), $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes);
            },
            265 => function ($stackPos) {
                 $this->semValue = array();
            },
            266 => function ($stackPos) {
                 $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)];
            },
            267 => function ($stackPos) {
                 $this->semValue = new Stmt\ElseIf_($this->semStack[$stackPos-(6-3)], $this->semStack[$stackPos-(6-6)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); $this->fixupAlternativeElse($this->semValue);
            },
            268 => function ($stackPos) {
                 $this->semValue = null;
            },
            269 => function ($stackPos) {
                 $this->semValue = new Stmt\Else_(is_array($this->semStack[$stackPos-(2-2)]) ? $this->semStack[$stackPos-(2-2)] : array($this->semStack[$stackPos-(2-2)]), $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            270 => function ($stackPos) {
                 $this->semValue = null;
            },
            271 => function ($stackPos) {
                 $this->semValue = new Stmt\Else_($this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); $this->fixupAlternativeElse($this->semValue);
            },
            272 => function ($stackPos) {
                 $this->semValue = array($this->semStack[$stackPos-(1-1)], false);
            },
            273 => function ($stackPos) {
                 $this->semValue = array($this->semStack[$stackPos-(2-2)], true);
            },
            274 => function ($stackPos) {
                 $this->semValue = array($this->semStack[$stackPos-(1-1)], false);
            },
            275 => function ($stackPos) {
                 $this->semValue = array($this->semStack[$stackPos-(1-1)], false);
            },
            276 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(2-1)];
            },
            277 => function ($stackPos) {
                 $this->semValue = array();
            },
            278 => function ($stackPos) {
                 $this->semValue = array($this->semStack[$stackPos-(1-1)]);
            },
            279 => function ($stackPos) {
                 $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
            },
            280 => function ($stackPos) {
                 $this->semValue = 0;
            },
            281 => function ($stackPos) {
                 $this->checkModifier($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $stackPos-(2-2)); $this->semValue = $this->semStack[$stackPos-(2-1)] | $this->semStack[$stackPos-(2-2)];
            },
            282 => function ($stackPos) {
                 $this->semValue = Stmt\Class_::MODIFIER_PUBLIC;
            },
            283 => function ($stackPos) {
                 $this->semValue = Stmt\Class_::MODIFIER_PROTECTED;
            },
            284 => function ($stackPos) {
                 $this->semValue = Stmt\Class_::MODIFIER_PRIVATE;
            },
            285 => function ($stackPos) {
                 $this->semValue = Stmt\Class_::MODIFIER_READONLY;
            },
            286 => function ($stackPos) {
                 $this->semValue = new Node\Param($this->semStack[$stackPos-(6-6)], null, $this->semStack[$stackPos-(6-3)], $this->semStack[$stackPos-(6-4)], $this->semStack[$stackPos-(6-5)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes, $this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-1)]);
            $this->checkParam($this->semValue);
            },
            287 => function ($stackPos) {
                 $this->semValue = new Node\Param($this->semStack[$stackPos-(8-6)], $this->semStack[$stackPos-(8-8)], $this->semStack[$stackPos-(8-3)], $this->semStack[$stackPos-(8-4)], $this->semStack[$stackPos-(8-5)], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes, $this->semStack[$stackPos-(8-2)], $this->semStack[$stackPos-(8-1)]);
            $this->checkParam($this->semValue);
            },
            288 => function ($stackPos) {
                 $this->semValue = new Node\Param(new Expr\Error($this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes), null, $this->semStack[$stackPos-(6-3)], $this->semStack[$stackPos-(6-4)], $this->semStack[$stackPos-(6-5)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes, $this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-1)]);
            },
            289 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            290 => function ($stackPos) {
                 $this->semValue = new Node\NullableType($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            291 => function ($stackPos) {
                 $this->semValue = new Node\UnionType($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            292 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            293 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            294 => function ($stackPos) {
                 $this->semValue = new Node\Name('static', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            295 => function ($stackPos) {
                 $this->semValue = $this->handleBuiltinTypes($this->semStack[$stackPos-(1-1)]);
            },
            296 => function ($stackPos) {
                 $this->semValue = new Node\Identifier('array', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            297 => function ($stackPos) {
                 $this->semValue = new Node\Identifier('callable', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            298 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            299 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(3-2)];
            },
            300 => function ($stackPos) {
                 $this->semValue = array($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)]);
            },
            301 => function ($stackPos) {
                 $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
            },
            302 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            303 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(3-2)];
            },
            304 => function ($stackPos) {
                 $this->semValue = array($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)]);
            },
            305 => function ($stackPos) {
                 $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
            },
            306 => function ($stackPos) {
                 $this->semValue = array($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)]);
            },
            307 => function ($stackPos) {
                 $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
            },
            308 => function ($stackPos) {
                 $this->semValue = new Node\IntersectionType($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            309 => function ($stackPos) {
                 $this->semValue = array($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)]);
            },
            310 => function ($stackPos) {
                 $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
            },
            311 => function ($stackPos) {
                 $this->semValue = new Node\IntersectionType($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            312 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            313 => function ($stackPos) {
                 $this->semValue = new Node\NullableType($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            314 => function ($stackPos) {
                 $this->semValue = new Node\UnionType($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            315 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            316 => function ($stackPos) {
                 $this->semValue = null;
            },
            317 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            318 => function ($stackPos) {
                 $this->semValue = null;
            },
            319 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(2-2)];
            },
            320 => function ($stackPos) {
                 $this->semValue = null;
            },
            321 => function ($stackPos) {
                 $this->semValue = array();
            },
            322 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(4-2)];
            },
            323 => function ($stackPos) {
                 $this->semValue = array($this->semStack[$stackPos-(3-2)]);
            },
            324 => function ($stackPos) {
                 $this->semValue = new Node\VariadicPlaceholder($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            325 => function ($stackPos) {
                 $this->semValue = array($this->semStack[$stackPos-(1-1)]);
            },
            326 => function ($stackPos) {
                 $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
            },
            327 => function ($stackPos) {
                 $this->semValue = new Node\Arg($this->semStack[$stackPos-(1-1)], false, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            328 => function ($stackPos) {
                 $this->semValue = new Node\Arg($this->semStack[$stackPos-(2-2)], true, false, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            329 => function ($stackPos) {
                 $this->semValue = new Node\Arg($this->semStack[$stackPos-(2-2)], false, true, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            330 => function ($stackPos) {
                 $this->semValue = new Node\Arg($this->semStack[$stackPos-(3-3)], false, false, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes, $this->semStack[$stackPos-(3-1)]);
            },
            331 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(2-1)];
            },
            332 => function ($stackPos) {
                 $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
            },
            333 => function ($stackPos) {
                 $this->semValue = array($this->semStack[$stackPos-(1-1)]);
            },
            334 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            335 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(2-1)];
            },
            336 => function ($stackPos) {
                 $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
            },
            337 => function ($stackPos) {
                 $this->semValue = array($this->semStack[$stackPos-(1-1)]);
            },
            338 => function ($stackPos) {
                 $this->semValue = new Stmt\StaticVar($this->semStack[$stackPos-(1-1)], null, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            339 => function ($stackPos) {
                 $this->semValue = new Stmt\StaticVar($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            340 => function ($stackPos) {
                 if ($this->semStack[$stackPos-(2-2)] !== null) { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; }
            },
            341 => function ($stackPos) {
                 $this->semValue = array();
            },
            342 => function ($stackPos) {
                 $startAttributes = $this->lookaheadStartAttributes; if (isset($startAttributes['comments'])) { $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); } else { $nop = null; };
            if ($nop !== null) { $this->semStack[$stackPos-(1-1)][] = $nop; } $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            343 => function ($stackPos) {
                 $this->semValue = new Stmt\Property($this->semStack[$stackPos-(5-2)], $this->semStack[$stackPos-(5-4)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes, $this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-1)]);
            $this->checkProperty($this->semValue, $stackPos-(5-2));
            },
            344 => function ($stackPos) {
                 $this->semValue = new Stmt\ClassConst($this->semStack[$stackPos-(5-4)], $this->semStack[$stackPos-(5-2)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes, $this->semStack[$stackPos-(5-1)]);
            $this->checkClassConst($this->semValue, $stackPos-(5-2));
            },
            345 => function ($stackPos) {
                 $this->semValue = new Stmt\ClassConst($this->semStack[$stackPos-(6-5)], $this->semStack[$stackPos-(6-2)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes, $this->semStack[$stackPos-(6-1)], $this->semStack[$stackPos-(6-4)]);
            $this->checkClassConst($this->semValue, $stackPos-(6-2));
            },
            346 => function ($stackPos) {
                 $this->semValue = new Stmt\ClassMethod($this->semStack[$stackPos-(10-5)], ['type' => $this->semStack[$stackPos-(10-2)], 'byRef' => $this->semStack[$stackPos-(10-4)], 'params' => $this->semStack[$stackPos-(10-7)], 'returnType' => $this->semStack[$stackPos-(10-9)], 'stmts' => $this->semStack[$stackPos-(10-10)], 'attrGroups' => $this->semStack[$stackPos-(10-1)]], $this->startAttributeStack[$stackPos-(10-1)] + $this->endAttributes);
            $this->checkClassMethod($this->semValue, $stackPos-(10-2));
            },
            347 => function ($stackPos) {
                 $this->semValue = new Stmt\TraitUse($this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            348 => function ($stackPos) {
                 $this->semValue = new Stmt\EnumCase($this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-4)], $this->semStack[$stackPos-(5-1)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes);
            },
            349 => function ($stackPos) {
                 $this->semValue = null; /* will be skipped */
            },
            350 => function ($stackPos) {
                 $this->semValue = array();
            },
            351 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(3-2)];
            },
            352 => function ($stackPos) {
                 $this->semValue = array();
            },
            353 => function ($stackPos) {
                 $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)];
            },
            354 => function ($stackPos) {
                 $this->semValue = new Stmt\TraitUseAdaptation\Precedence($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            },
            355 => function ($stackPos) {
                 $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(5-1)][0], $this->semStack[$stackPos-(5-1)][1], $this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-4)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes);
            },
            356 => function ($stackPos) {
                 $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], $this->semStack[$stackPos-(4-3)], null, $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            },
            357 => function ($stackPos) {
                 $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], null, $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            },
            358 => function ($stackPos) {
                 $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], null, $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            },
            359 => function ($stackPos) {
                 $this->semValue = array($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)]);
            },
            360 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            361 => function ($stackPos) {
                 $this->semValue = array(null, $this->semStack[$stackPos-(1-1)]);
            },
            362 => function ($stackPos) {
                 $this->semValue = null;
            },
            363 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            364 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            365 => function ($stackPos) {
                 $this->semValue = 0;
            },
            366 => function ($stackPos) {
                 $this->semValue = 0;
            },
            367 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            368 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            369 => function ($stackPos) {
                 $this->checkModifier($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $stackPos-(2-2)); $this->semValue = $this->semStack[$stackPos-(2-1)] | $this->semStack[$stackPos-(2-2)];
            },
            370 => function ($stackPos) {
                 $this->semValue = Stmt\Class_::MODIFIER_PUBLIC;
            },
            371 => function ($stackPos) {
                 $this->semValue = Stmt\Class_::MODIFIER_PROTECTED;
            },
            372 => function ($stackPos) {
                 $this->semValue = Stmt\Class_::MODIFIER_PRIVATE;
            },
            373 => function ($stackPos) {
                 $this->semValue = Stmt\Class_::MODIFIER_STATIC;
            },
            374 => function ($stackPos) {
                 $this->semValue = Stmt\Class_::MODIFIER_ABSTRACT;
            },
            375 => function ($stackPos) {
                 $this->semValue = Stmt\Class_::MODIFIER_FINAL;
            },
            376 => function ($stackPos) {
                 $this->semValue = Stmt\Class_::MODIFIER_READONLY;
            },
            377 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(2-1)];
            },
            378 => function ($stackPos) {
                 $this->semValue = array($this->semStack[$stackPos-(1-1)]);
            },
            379 => function ($stackPos) {
                 $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
            },
            380 => function ($stackPos) {
                 $this->semValue = new Node\VarLikeIdentifier(substr($this->semStack[$stackPos-(1-1)], 1), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            381 => function ($stackPos) {
                 $this->semValue = new Stmt\PropertyProperty($this->semStack[$stackPos-(1-1)], null, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            382 => function ($stackPos) {
                 $this->semValue = new Stmt\PropertyProperty($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            383 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(2-1)];
            },
            384 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(2-1)];
            },
            385 => function ($stackPos) {
                 $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
            },
            386 => function ($stackPos) {
                 $this->semValue = array($this->semStack[$stackPos-(1-1)]);
            },
            387 => function ($stackPos) {
                 $this->semValue = array();
            },
            388 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            389 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            390 => function ($stackPos) {
                 $this->semValue = new Expr\Assign($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            391 => function ($stackPos) {
                 $this->semValue = new Expr\Assign($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            392 => function ($stackPos) {
                 $this->semValue = new Expr\Assign($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            393 => function ($stackPos) {
                 $this->semValue = new Expr\AssignRef($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            },
            394 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            395 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            396 => function ($stackPos) {
                 $this->semValue = new Expr\Clone_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            397 => function ($stackPos) {
                 $this->semValue = new Expr\AssignOp\Plus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            398 => function ($stackPos) {
                 $this->semValue = new Expr\AssignOp\Minus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            399 => function ($stackPos) {
                 $this->semValue = new Expr\AssignOp\Mul($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            400 => function ($stackPos) {
                 $this->semValue = new Expr\AssignOp\Div($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            401 => function ($stackPos) {
                 $this->semValue = new Expr\AssignOp\Concat($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            402 => function ($stackPos) {
                 $this->semValue = new Expr\AssignOp\Mod($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            403 => function ($stackPos) {
                 $this->semValue = new Expr\AssignOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            404 => function ($stackPos) {
                 $this->semValue = new Expr\AssignOp\BitwiseOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            405 => function ($stackPos) {
                 $this->semValue = new Expr\AssignOp\BitwiseXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            406 => function ($stackPos) {
                 $this->semValue = new Expr\AssignOp\ShiftLeft($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            407 => function ($stackPos) {
                 $this->semValue = new Expr\AssignOp\ShiftRight($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            408 => function ($stackPos) {
                 $this->semValue = new Expr\AssignOp\Pow($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            409 => function ($stackPos) {
                 $this->semValue = new Expr\AssignOp\Coalesce($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            410 => function ($stackPos) {
                 $this->semValue = new Expr\PostInc($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            411 => function ($stackPos) {
                 $this->semValue = new Expr\PreInc($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            412 => function ($stackPos) {
                 $this->semValue = new Expr\PostDec($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            413 => function ($stackPos) {
                 $this->semValue = new Expr\PreDec($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            414 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\BooleanOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            415 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\BooleanAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            416 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\LogicalOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            417 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\LogicalAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            418 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\LogicalXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            419 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\BitwiseOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            420 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            421 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            422 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\BitwiseXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            423 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\Concat($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            424 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\Plus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            425 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\Minus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            426 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\Mul($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            427 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\Div($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            428 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\Mod($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            429 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\ShiftLeft($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            430 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\ShiftRight($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            431 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\Pow($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            432 => function ($stackPos) {
                 $this->semValue = new Expr\UnaryPlus($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            433 => function ($stackPos) {
                 $this->semValue = new Expr\UnaryMinus($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            434 => function ($stackPos) {
                 $this->semValue = new Expr\BooleanNot($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            435 => function ($stackPos) {
                 $this->semValue = new Expr\BitwiseNot($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            436 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\Identical($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            437 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\NotIdentical($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            438 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\Equal($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            439 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\NotEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            440 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\Spaceship($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            441 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\Smaller($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            442 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\SmallerOrEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            443 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\Greater($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            444 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\GreaterOrEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            445 => function ($stackPos) {
                 $this->semValue = new Expr\Instanceof_($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            446 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(3-2)];
            },
            447 => function ($stackPos) {
                 $this->semValue = new Expr\Ternary($this->semStack[$stackPos-(5-1)], $this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-5)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes);
            },
            448 => function ($stackPos) {
                 $this->semValue = new Expr\Ternary($this->semStack[$stackPos-(4-1)], null, $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            },
            449 => function ($stackPos) {
                 $this->semValue = new Expr\BinaryOp\Coalesce($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            450 => function ($stackPos) {
                 $this->semValue = new Expr\Isset_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            },
            451 => function ($stackPos) {
                 $this->semValue = new Expr\Empty_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            },
            452 => function ($stackPos) {
                 $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_INCLUDE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            453 => function ($stackPos) {
                 $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_INCLUDE_ONCE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            454 => function ($stackPos) {
                 $this->semValue = new Expr\Eval_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            },
            455 => function ($stackPos) {
                 $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_REQUIRE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            456 => function ($stackPos) {
                 $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_REQUIRE_ONCE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            457 => function ($stackPos) {
                 $this->semValue = new Expr\Cast\Int_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            458 => function ($stackPos) {
                 $attrs = $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes;
            $attrs['kind'] = $this->getFloatCastKind($this->semStack[$stackPos-(2-1)]);
            $this->semValue = new Expr\Cast\Double($this->semStack[$stackPos-(2-2)], $attrs);
            },
            459 => function ($stackPos) {
                 $this->semValue = new Expr\Cast\String_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            460 => function ($stackPos) {
                 $this->semValue = new Expr\Cast\Array_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            461 => function ($stackPos) {
                 $this->semValue = new Expr\Cast\Object_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            462 => function ($stackPos) {
                 $this->semValue = new Expr\Cast\Bool_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            463 => function ($stackPos) {
                 $this->semValue = new Expr\Cast\Unset_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            464 => function ($stackPos) {
                 $attrs = $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes;
            $attrs['kind'] = strtolower($this->semStack[$stackPos-(2-1)]) === 'exit' ? Expr\Exit_::KIND_EXIT : Expr\Exit_::KIND_DIE;
            $this->semValue = new Expr\Exit_($this->semStack[$stackPos-(2-2)], $attrs);
            },
            465 => function ($stackPos) {
                 $this->semValue = new Expr\ErrorSuppress($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            466 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            467 => function ($stackPos) {
                 $this->semValue = new Expr\ShellExec($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            468 => function ($stackPos) {
                 $this->semValue = new Expr\Print_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            469 => function ($stackPos) {
                 $this->semValue = new Expr\Yield_(null, null, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            470 => function ($stackPos) {
                 $this->semValue = new Expr\Yield_($this->semStack[$stackPos-(2-2)], null, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            471 => function ($stackPos) {
                 $this->semValue = new Expr\Yield_($this->semStack[$stackPos-(4-4)], $this->semStack[$stackPos-(4-2)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            },
            472 => function ($stackPos) {
                 $this->semValue = new Expr\YieldFrom($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            473 => function ($stackPos) {
                 $this->semValue = new Expr\Throw_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            474 => function ($stackPos) {
                 $this->semValue = new Expr\ArrowFunction(['static' => false, 'byRef' => $this->semStack[$stackPos-(8-2)], 'params' => $this->semStack[$stackPos-(8-4)], 'returnType' => $this->semStack[$stackPos-(8-6)], 'expr' => $this->semStack[$stackPos-(8-8)], 'attrGroups' => []], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes);
            },
            475 => function ($stackPos) {
                 $this->semValue = new Expr\ArrowFunction(['static' => true, 'byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-5)], 'returnType' => $this->semStack[$stackPos-(9-7)], 'expr' => $this->semStack[$stackPos-(9-9)], 'attrGroups' => []], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes);
            },
            476 => function ($stackPos) {
                 $this->semValue = new Expr\Closure(['static' => false, 'byRef' => $this->semStack[$stackPos-(8-2)], 'params' => $this->semStack[$stackPos-(8-4)], 'uses' => $this->semStack[$stackPos-(8-6)], 'returnType' => $this->semStack[$stackPos-(8-7)], 'stmts' => $this->semStack[$stackPos-(8-8)], 'attrGroups' => []], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes);
            },
            477 => function ($stackPos) {
                 $this->semValue = new Expr\Closure(['static' => true, 'byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-5)], 'uses' => $this->semStack[$stackPos-(9-7)], 'returnType' => $this->semStack[$stackPos-(9-8)], 'stmts' => $this->semStack[$stackPos-(9-9)], 'attrGroups' => []], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes);
            },
            478 => function ($stackPos) {
                 $this->semValue = new Expr\ArrowFunction(['static' => false, 'byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-5)], 'returnType' => $this->semStack[$stackPos-(9-7)], 'expr' => $this->semStack[$stackPos-(9-9)], 'attrGroups' => $this->semStack[$stackPos-(9-1)]], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes);
            },
            479 => function ($stackPos) {
                 $this->semValue = new Expr\ArrowFunction(['static' => true, 'byRef' => $this->semStack[$stackPos-(10-4)], 'params' => $this->semStack[$stackPos-(10-6)], 'returnType' => $this->semStack[$stackPos-(10-8)], 'expr' => $this->semStack[$stackPos-(10-10)], 'attrGroups' => $this->semStack[$stackPos-(10-1)]], $this->startAttributeStack[$stackPos-(10-1)] + $this->endAttributes);
            },
            480 => function ($stackPos) {
                 $this->semValue = new Expr\Closure(['static' => false, 'byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-5)], 'uses' => $this->semStack[$stackPos-(9-7)], 'returnType' => $this->semStack[$stackPos-(9-8)], 'stmts' => $this->semStack[$stackPos-(9-9)], 'attrGroups' => $this->semStack[$stackPos-(9-1)]], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes);
            },
            481 => function ($stackPos) {
                 $this->semValue = new Expr\Closure(['static' => true, 'byRef' => $this->semStack[$stackPos-(10-4)], 'params' => $this->semStack[$stackPos-(10-6)], 'uses' => $this->semStack[$stackPos-(10-8)], 'returnType' => $this->semStack[$stackPos-(10-9)], 'stmts' => $this->semStack[$stackPos-(10-10)], 'attrGroups' => $this->semStack[$stackPos-(10-1)]], $this->startAttributeStack[$stackPos-(10-1)] + $this->endAttributes);
            },
            482 => function ($stackPos) {
                 $this->semValue = array(new Stmt\Class_(null, ['type' => $this->semStack[$stackPos-(8-2)], 'extends' => $this->semStack[$stackPos-(8-4)], 'implements' => $this->semStack[$stackPos-(8-5)], 'stmts' => $this->semStack[$stackPos-(8-7)], 'attrGroups' => $this->semStack[$stackPos-(8-1)]], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes), $this->semStack[$stackPos-(8-3)]);
            $this->checkClass($this->semValue[0], -1);
            },
            483 => function ($stackPos) {
                 $this->semValue = new Expr\New_($this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            484 => function ($stackPos) {
                 list($class, $ctorArgs) = $this->semStack[$stackPos-(2-2)]; $this->semValue = new Expr\New_($class, $ctorArgs, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            485 => function ($stackPos) {
                 $this->semValue = array();
            },
            486 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(4-3)];
            },
            487 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(2-1)];
            },
            488 => function ($stackPos) {
                 $this->semValue = array($this->semStack[$stackPos-(1-1)]);
            },
            489 => function ($stackPos) {
                 $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
            },
            490 => function ($stackPos) {
                 $this->semValue = new Expr\ClosureUse($this->semStack[$stackPos-(2-2)], $this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            491 => function ($stackPos) {
                 $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            492 => function ($stackPos) {
                 $this->semValue = new Expr\FuncCall($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            493 => function ($stackPos) {
                 $this->semValue = new Expr\FuncCall($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            494 => function ($stackPos) {
                 $this->semValue = new Expr\FuncCall($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            495 => function ($stackPos) {
                 $this->semValue = new Expr\StaticCall($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            },
            496 => function ($stackPos) {
                 $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            497 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            498 => function ($stackPos) {
                 $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            499 => function ($stackPos) {
                 $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            500 => function ($stackPos) {
                 $this->semValue = new Name\FullyQualified(substr($this->semStack[$stackPos-(1-1)], 1), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            501 => function ($stackPos) {
                 $this->semValue = new Name\Relative(substr($this->semStack[$stackPos-(1-1)], 10), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            502 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            503 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            504 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(3-2)];
            },
            505 => function ($stackPos) {
                 $this->semValue = new Expr\Error($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); $this->errorState = 2;
            },
            506 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            507 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            508 => function ($stackPos) {
                 $this->semValue = null;
            },
            509 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(3-2)];
            },
            510 => function ($stackPos) {
                 $this->semValue = array();
            },
            511 => function ($stackPos) {
                 $this->semValue = array(new Scalar\EncapsedStringPart(Scalar\String_::parseEscapeSequences($this->semStack[$stackPos-(1-1)], '`'), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes));
            },
            512 => function ($stackPos) {
                 foreach ($this->semStack[$stackPos-(1-1)] as $s) { if ($s instanceof Node\Scalar\EncapsedStringPart) { $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '`', true); } }; $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            513 => function ($stackPos) {
                 $this->semValue = array();
            },
            514 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            515 => function ($stackPos) {
                 $this->semValue = new Expr\ConstFetch($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            516 => function ($stackPos) {
                 $this->semValue = new Scalar\MagicConst\Line($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            517 => function ($stackPos) {
                 $this->semValue = new Scalar\MagicConst\File($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            518 => function ($stackPos) {
                 $this->semValue = new Scalar\MagicConst\Dir($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            519 => function ($stackPos) {
                 $this->semValue = new Scalar\MagicConst\Class_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            520 => function ($stackPos) {
                 $this->semValue = new Scalar\MagicConst\Trait_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            521 => function ($stackPos) {
                 $this->semValue = new Scalar\MagicConst\Method($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            522 => function ($stackPos) {
                 $this->semValue = new Scalar\MagicConst\Function_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            523 => function ($stackPos) {
                 $this->semValue = new Scalar\MagicConst\Namespace_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            524 => function ($stackPos) {
                 $this->semValue = new Expr\ClassConstFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            525 => function ($stackPos) {
                 $this->semValue = new Expr\ClassConstFetch($this->semStack[$stackPos-(5-1)], $this->semStack[$stackPos-(5-4)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes);
            },
            526 => function ($stackPos) {
                 $this->semValue = new Expr\ClassConstFetch($this->semStack[$stackPos-(3-1)], new Expr\Error($this->startAttributeStack[$stackPos-(3-3)] + $this->endAttributeStack[$stackPos-(3-3)]), $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); $this->errorState = 2;
            },
            527 => function ($stackPos) {
                 $attrs = $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes; $attrs['kind'] = Expr\Array_::KIND_SHORT;
            $this->semValue = new Expr\Array_($this->semStack[$stackPos-(3-2)], $attrs);
            },
            528 => function ($stackPos) {
                 $attrs = $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes; $attrs['kind'] = Expr\Array_::KIND_LONG;
            $this->semValue = new Expr\Array_($this->semStack[$stackPos-(4-3)], $attrs);
            },
            529 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            530 => function ($stackPos) {
                 $this->semValue = Scalar\String_::fromString($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            531 => function ($stackPos) {
                 $attrs = $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes; $attrs['kind'] = Scalar\String_::KIND_DOUBLE_QUOTED;
            foreach ($this->semStack[$stackPos-(3-2)] as $s) { if ($s instanceof Node\Scalar\EncapsedStringPart) { $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '"', true); } }; $this->semValue = new Scalar\Encapsed($this->semStack[$stackPos-(3-2)], $attrs);
            },
            532 => function ($stackPos) {
                 $this->semValue = $this->parseLNumber($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            533 => function ($stackPos) {
                 $this->semValue = Scalar\DNumber::fromString($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            534 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            535 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            536 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            537 => function ($stackPos) {
                 $this->semValue = $this->parseDocString($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes, $this->startAttributeStack[$stackPos-(3-3)] + $this->endAttributeStack[$stackPos-(3-3)], true);
            },
            538 => function ($stackPos) {
                 $this->semValue = $this->parseDocString($this->semStack[$stackPos-(2-1)], '', $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes, $this->startAttributeStack[$stackPos-(2-2)] + $this->endAttributeStack[$stackPos-(2-2)], true);
            },
            539 => function ($stackPos) {
                 $this->semValue = $this->parseDocString($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes, $this->startAttributeStack[$stackPos-(3-3)] + $this->endAttributeStack[$stackPos-(3-3)], true);
            },
            540 => function ($stackPos) {
                 $this->semValue = null;
            },
            541 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            542 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            543 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(3-2)];
            },
            544 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            545 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            546 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            547 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            548 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            549 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(3-2)];
            },
            550 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            551 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            552 => function ($stackPos) {
                 $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            },
            553 => function ($stackPos) {
                 $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            },
            554 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            555 => function ($stackPos) {
                 $this->semValue = new Expr\MethodCall($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            },
            556 => function ($stackPos) {
                 $this->semValue = new Expr\NullsafeMethodCall($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            },
            557 => function ($stackPos) {
                 $this->semValue = null;
            },
            558 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            559 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            560 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            561 => function ($stackPos) {
                 $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            562 => function ($stackPos) {
                 $this->semValue = new Expr\NullsafePropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            563 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            564 => function ($stackPos) {
                 $this->semValue = new Expr\Variable($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            },
            565 => function ($stackPos) {
                 $this->semValue = new Expr\Variable($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            566 => function ($stackPos) {
                 $this->semValue = new Expr\Variable(new Expr\Error($this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes), $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); $this->errorState = 2;
            },
            567 => function ($stackPos) {
                 $var = $this->semStack[$stackPos-(1-1)]->name; $this->semValue = \is_string($var) ? new Node\VarLikeIdentifier($var, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes) : $var;
            },
            568 => function ($stackPos) {
                 $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            569 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            570 => function ($stackPos) {
                 $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            },
            571 => function ($stackPos) {
                 $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            },
            572 => function ($stackPos) {
                 $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            573 => function ($stackPos) {
                 $this->semValue = new Expr\NullsafePropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            574 => function ($stackPos) {
                 $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            575 => function ($stackPos) {
                 $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            576 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            577 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(3-2)];
            },
            578 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            579 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            580 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(3-2)];
            },
            581 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            582 => function ($stackPos) {
                 $this->semValue = new Expr\Error($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); $this->errorState = 2;
            },
            583 => function ($stackPos) {
                 $this->semValue = new Expr\List_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            },
            584 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)]; $end = count($this->semValue)-1; if ($this->semValue[$end] === null) array_pop($this->semValue);
            },
            585 => function ($stackPos) {
                $this->semValue = $this->semStack[$stackPos];
            },
            586 => function ($stackPos) {
                 /* do nothing -- prevent default action of $$=$this->semStack[$1]. See $551. */
            },
            587 => function ($stackPos) {
                 $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
            },
            588 => function ($stackPos) {
                 $this->semValue = array($this->semStack[$stackPos-(1-1)]);
            },
            589 => function ($stackPos) {
                 $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(1-1)], null, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            590 => function ($stackPos) {
                 $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(2-2)], null, true, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            591 => function ($stackPos) {
                 $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(1-1)], null, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            592 => function ($stackPos) {
                 $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(3-3)], $this->semStack[$stackPos-(3-1)], false, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            593 => function ($stackPos) {
                 $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(4-4)], $this->semStack[$stackPos-(4-1)], true, $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            },
            594 => function ($stackPos) {
                 $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(3-3)], $this->semStack[$stackPos-(3-1)], false, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            595 => function ($stackPos) {
                 $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(2-2)], null, false, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes, true);
            },
            596 => function ($stackPos) {
                 $this->semValue = null;
            },
            597 => function ($stackPos) {
                 $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)];
            },
            598 => function ($stackPos) {
                 $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)];
            },
            599 => function ($stackPos) {
                 $this->semValue = array($this->semStack[$stackPos-(1-1)]);
            },
            600 => function ($stackPos) {
                 $this->semValue = array($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)]);
            },
            601 => function ($stackPos) {
                 $this->semValue = new Scalar\EncapsedStringPart($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            602 => function ($stackPos) {
                 $this->semValue = new Expr\Variable($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            603 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
            604 => function ($stackPos) {
                 $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
            },
            605 => function ($stackPos) {
                 $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            606 => function ($stackPos) {
                 $this->semValue = new Expr\NullsafePropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            607 => function ($stackPos) {
                 $this->semValue = new Expr\Variable($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            608 => function ($stackPos) {
                 $this->semValue = new Expr\Variable($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
            },
            609 => function ($stackPos) {
                 $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-4)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes);
            },
            610 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(3-2)];
            },
            611 => function ($stackPos) {
                 $this->semValue = new Scalar\String_($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            612 => function ($stackPos) {
                 $this->semValue = $this->parseNumString($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
            },
            613 => function ($stackPos) {
                 $this->semValue = $this->parseNumString('-' . $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
            },
            614 => function ($stackPos) {
                 $this->semValue = $this->semStack[$stackPos-(1-1)];
            },
        ];
    }
}
<?php

namespace PhpParser\Parser;

/* GENERATED file based on grammar/tokens.y */
final class Tokens
{
    const YYERRTOK = 256;
    const T_THROW = 257;
    const T_INCLUDE = 258;
    const T_INCLUDE_ONCE = 259;
    const T_EVAL = 260;
    const T_REQUIRE = 261;
    const T_REQUIRE_ONCE = 262;
    const T_LOGICAL_OR = 263;
    const T_LOGICAL_XOR = 264;
    const T_LOGICAL_AND = 265;
    const T_PRINT = 266;
    const T_YIELD = 267;
    const T_DOUBLE_ARROW = 268;
    const T_YIELD_FROM = 269;
    const T_PLUS_EQUAL = 270;
    const T_MINUS_EQUAL = 271;
    const T_MUL_EQUAL = 272;
    const T_DIV_EQUAL = 273;
    const T_CONCAT_EQUAL = 274;
    const T_MOD_EQUAL = 275;
    const T_AND_EQUAL = 276;
    const T_OR_EQUAL = 277;
    const T_XOR_EQUAL = 278;
    const T_SL_EQUAL = 279;
    const T_SR_EQUAL = 280;
    const T_POW_EQUAL = 281;
    const T_COALESCE_EQUAL = 282;
    const T_COALESCE = 283;
    const T_BOOLEAN_OR = 284;
    const T_BOOLEAN_AND = 285;
    const T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG = 286;
    const T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG = 287;
    const T_IS_EQUAL = 288;
    const T_IS_NOT_EQUAL = 289;
    const T_IS_IDENTICAL = 290;
    const T_IS_NOT_IDENTICAL = 291;
    const T_SPACESHIP = 292;
    const T_IS_SMALLER_OR_EQUAL = 293;
    const T_IS_GREATER_OR_EQUAL = 294;
    const T_SL = 295;
    const T_SR = 296;
    const T_INSTANCEOF = 297;
    const T_INC = 298;
    const T_DEC = 299;
    const T_INT_CAST = 300;
    const T_DOUBLE_CAST = 301;
    const T_STRING_CAST = 302;
    const T_ARRAY_CAST = 303;
    const T_OBJECT_CAST = 304;
    const T_BOOL_CAST = 305;
    const T_UNSET_CAST = 306;
    const T_POW = 307;
    const T_NEW = 308;
    const T_CLONE = 309;
    const T_EXIT = 310;
    const T_IF = 311;
    const T_ELSEIF = 312;
    const T_ELSE = 313;
    const T_ENDIF = 314;
    const T_LNUMBER = 315;
    const T_DNUMBER = 316;
    const T_STRING = 317;
    const T_STRING_VARNAME = 318;
    const T_VARIABLE = 319;
    const T_NUM_STRING = 320;
    const T_INLINE_HTML = 321;
    const T_ENCAPSED_AND_WHITESPACE = 322;
    const T_CONSTANT_ENCAPSED_STRING = 323;
    const T_ECHO = 324;
    const T_DO = 325;
    const T_WHILE = 326;
    const T_ENDWHILE = 327;
    const T_FOR = 328;
    const T_ENDFOR = 329;
    const T_FOREACH = 330;
    const T_ENDFOREACH = 331;
    const T_DECLARE = 332;
    const T_ENDDECLARE = 333;
    const T_AS = 334;
    const T_SWITCH = 335;
    const T_MATCH = 336;
    const T_ENDSWITCH = 337;
    const T_CASE = 338;
    const T_DEFAULT = 339;
    const T_BREAK = 340;
    const T_CONTINUE = 341;
    const T_GOTO = 342;
    const T_FUNCTION = 343;
    const T_FN = 344;
    const T_CONST = 345;
    const T_RETURN = 346;
    const T_TRY = 347;
    const T_CATCH = 348;
    const T_FINALLY = 349;
    const T_USE = 350;
    const T_INSTEADOF = 351;
    const T_GLOBAL = 352;
    const T_STATIC = 353;
    const T_ABSTRACT = 354;
    const T_FINAL = 355;
    const T_PRIVATE = 356;
    const T_PROTECTED = 357;
    const T_PUBLIC = 358;
    const T_READONLY = 359;
    const T_VAR = 360;
    const T_UNSET = 361;
    const T_ISSET = 362;
    const T_EMPTY = 363;
    const T_HALT_COMPILER = 364;
    const T_CLASS = 365;
    const T_TRAIT = 366;
    const T_INTERFACE = 367;
    const T_ENUM = 368;
    const T_EXTENDS = 369;
    const T_IMPLEMENTS = 370;
    const T_OBJECT_OPERATOR = 371;
    const T_NULLSAFE_OBJECT_OPERATOR = 372;
    const T_LIST = 373;
    const T_ARRAY = 374;
    const T_CALLABLE = 375;
    const T_CLASS_C = 376;
    const T_TRAIT_C = 377;
    const T_METHOD_C = 378;
    const T_FUNC_C = 379;
    const T_LINE = 380;
    const T_FILE = 381;
    const T_START_HEREDOC = 382;
    const T_END_HEREDOC = 383;
    const T_DOLLAR_OPEN_CURLY_BRACES = 384;
    const T_CURLY_OPEN = 385;
    const T_PAAMAYIM_NEKUDOTAYIM = 386;
    const T_NAMESPACE = 387;
    const T_NS_C = 388;
    const T_DIR = 389;
    const T_NS_SEPARATOR = 390;
    const T_ELLIPSIS = 391;
    const T_NAME_FULLY_QUALIFIED = 392;
    const T_NAME_QUALIFIED = 393;
    const T_NAME_RELATIVE = 394;
    const T_ATTRIBUTE = 395;
}
<?php declare(strict_types=1);

namespace PhpParser;

/*
 * This parser is based on a skeleton written by Moriyoshi Koizumi, which in
 * turn is based on work by Masato Bito.
 */
use PhpParser\Node\Expr;
use PhpParser\Node\Expr\Cast\Double;
use PhpParser\Node\Name;
use PhpParser\Node\Param;
use PhpParser\Node\Scalar\Encapsed;
use PhpParser\Node\Scalar\LNumber;
use PhpParser\Node\Scalar\String_;
use PhpParser\Node\Stmt\Class_;
use PhpParser\Node\Stmt\ClassConst;
use PhpParser\Node\Stmt\ClassMethod;
use PhpParser\Node\Stmt\Else_;
use PhpParser\Node\Stmt\ElseIf_;
use PhpParser\Node\Stmt\Enum_;
use PhpParser\Node\Stmt\Interface_;
use PhpParser\Node\Stmt\Namespace_;
use PhpParser\Node\Stmt\Nop;
use PhpParser\Node\Stmt\Property;
use PhpParser\Node\Stmt\TryCatch;
use PhpParser\Node\Stmt\UseUse;
use PhpParser\Node\VarLikeIdentifier;

abstract class ParserAbstract implements Parser
{
    const SYMBOL_NONE = -1;

    /*
     * The following members will be filled with generated parsing data:
     */

    /** @var int Size of $tokenToSymbol map */
    protected $tokenToSymbolMapSize;
    /** @var int Size of $action table */
    protected $actionTableSize;
    /** @var int Size of $goto table */
    protected $gotoTableSize;

    /** @var int Symbol number signifying an invalid token */
    protected $invalidSymbol;
    /** @var int Symbol number of error recovery token */
    protected $errorSymbol;
    /** @var int Action number signifying default action */
    protected $defaultAction;
    /** @var int Rule number signifying that an unexpected token was encountered */
    protected $unexpectedTokenRule;

    protected $YY2TBLSTATE;
    /** @var int Number of non-leaf states */
    protected $numNonLeafStates;

    /** @var int[] Map of lexer tokens to internal symbols */
    protected $tokenToSymbol;
    /** @var string[] Map of symbols to their names */
    protected $symbolToName;
    /** @var array Names of the production rules (only necessary for debugging) */
    protected $productions;

    /** @var int[] Map of states to a displacement into the $action table. The corresponding action for this
     *             state/symbol pair is $action[$actionBase[$state] + $symbol]. If $actionBase[$state] is 0, the
     *             action is defaulted, i.e. $actionDefault[$state] should be used instead. */
    protected $actionBase;
    /** @var int[] Table of actions. Indexed according to $actionBase comment. */
    protected $action;
    /** @var int[] Table indexed analogously to $action. If $actionCheck[$actionBase[$state] + $symbol] != $symbol
     *             then the action is defaulted, i.e. $actionDefault[$state] should be used instead. */
    protected $actionCheck;
    /** @var int[] Map of states to their default action */
    protected $actionDefault;
    /** @var callable[] Semantic action callbacks */
    protected $reduceCallbacks;

    /** @var int[] Map of non-terminals to a displacement into the $goto table. The corresponding goto state for this
     *             non-terminal/state pair is $goto[$gotoBase[$nonTerminal] + $state] (unless defaulted) */
    protected $gotoBase;
    /** @var int[] Table of states to goto after reduction. Indexed according to $gotoBase comment. */
    protected $goto;
    /** @var int[] Table indexed analogously to $goto. If $gotoCheck[$gotoBase[$nonTerminal] + $state] != $nonTerminal
     *             then the goto state is defaulted, i.e. $gotoDefault[$nonTerminal] should be used. */
    protected $gotoCheck;
    /** @var int[] Map of non-terminals to the default state to goto after their reduction */
    protected $gotoDefault;

    /** @var int[] Map of rules to the non-terminal on their left-hand side, i.e. the non-terminal to use for
     *             determining the state to goto after reduction. */
    protected $ruleToNonTerminal;
    /** @var int[] Map of rules to the length of their right-hand side, which is the number of elements that have to
     *             be popped from the stack(s) on reduction. */
    protected $ruleToLength;

    /*
     * The following members are part of the parser state:
     */

    /** @var Lexer Lexer that is used when parsing */
    protected $lexer;
    /** @var mixed Temporary value containing the result of last semantic action (reduction) */
    protected $semValue;
    /** @var array Semantic value stack (contains values of tokens and semantic action results) */
    protected $semStack;
    /** @var array[] Start attribute stack */
    protected $startAttributeStack;
    /** @var array[] End attribute stack */
    protected $endAttributeStack;
    /** @var array End attributes of last *shifted* token */
    protected $endAttributes;
    /** @var array Start attributes of last *read* token */
    protected $lookaheadStartAttributes;

    /** @var ErrorHandler Error handler */
    protected $errorHandler;
    /** @var int Error state, used to avoid error floods */
    protected $errorState;

    /**
     * Initialize $reduceCallbacks map.
     */
    abstract protected function initReduceCallbacks();

    /**
     * Creates a parser instance.
     *
     * Options: Currently none.
     *
     * @param Lexer $lexer A lexer
     * @param array $options Options array.
     */
    public function __construct(Lexer $lexer, array $options = []) {
        $this->lexer = $lexer;

        if (isset($options['throwOnError'])) {
            throw new \LogicException(
                '"throwOnError" is no longer supported, use "errorHandler" instead');
        }

        $this->initReduceCallbacks();
    }

    /**
     * Parses PHP code into a node tree.
     *
     * If a non-throwing error handler is used, the parser will continue parsing after an error
     * occurred and attempt to build a partial AST.
     *
     * @param string $code The source code to parse
     * @param ErrorHandler|null $errorHandler Error handler to use for lexer/parser errors, defaults
     *                                        to ErrorHandler\Throwing.
     *
     * @return Node\Stmt[]|null Array of statements (or null non-throwing error handler is used and
     *                          the parser was unable to recover from an error).
     */
    public function parse(string $code, ErrorHandler $errorHandler = null) {
        $this->errorHandler = $errorHandler ?: new ErrorHandler\Throwing;

        $this->lexer->startLexing($code, $this->errorHandler);
        $result = $this->doParse();

        // Clear out some of the interior state, so we don't hold onto unnecessary
        // memory between uses of the parser
        $this->startAttributeStack = [];
        $this->endAttributeStack = [];
        $this->semStack = [];
        $this->semValue = null;

        return $result;
    }

    protected function doParse() {
        // We start off with no lookahead-token
        $symbol = self::SYMBOL_NONE;

        // The attributes for a node are taken from the first and last token of the node.
        // From the first token only the startAttributes are taken and from the last only
        // the endAttributes. Both are merged using the array union operator (+).
        $startAttributes = [];
        $endAttributes = [];
        $this->endAttributes = $endAttributes;

        // Keep stack of start and end attributes
        $this->startAttributeStack = [];
        $this->endAttributeStack = [$endAttributes];

        // Start off in the initial state and keep a stack of previous states
        $state = 0;
        $stateStack = [$state];

        // Semantic value stack (contains values of tokens and semantic action results)
        $this->semStack = [];

        // Current position in the stack(s)
        $stackPos = 0;

        $this->errorState = 0;

        for (;;) {
            //$this->traceNewState($state, $symbol);

            if ($this->actionBase[$state] === 0) {
                $rule = $this->actionDefault[$state];
            } else {
                if ($symbol === self::SYMBOL_NONE) {
                    // Fetch the next token id from the lexer and fetch additional info by-ref.
                    // The end attributes are fetched into a temporary variable and only set once the token is really
                    // shifted (not during read). Otherwise you would sometimes get off-by-one errors, when a rule is
                    // reduced after a token was read but not yet shifted.
                    $tokenId = $this->lexer->getNextToken($tokenValue, $startAttributes, $endAttributes);

                    // map the lexer token id to the internally used symbols
                    $symbol = $tokenId >= 0 && $tokenId < $this->tokenToSymbolMapSize
                        ? $this->tokenToSymbol[$tokenId]
                        : $this->invalidSymbol;

                    if ($symbol === $this->invalidSymbol) {
                        throw new \RangeException(sprintf(
                            'The lexer returned an invalid token (id=%d, value=%s)',
                            $tokenId, $tokenValue
                        ));
                    }

                    // Allow productions to access the start attributes of the lookahead token.
                    $this->lookaheadStartAttributes = $startAttributes;

                    //$this->traceRead($symbol);
                }

                $idx = $this->actionBase[$state] + $symbol;
                if ((($idx >= 0 && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $symbol)
                     || ($state < $this->YY2TBLSTATE
                         && ($idx = $this->actionBase[$state + $this->numNonLeafStates] + $symbol) >= 0
                         && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $symbol))
                    && ($action = $this->action[$idx]) !== $this->defaultAction) {
                    /*
                     * >= numNonLeafStates: shift and reduce
                     * > 0: shift
                     * = 0: accept
                     * < 0: reduce
                     * = -YYUNEXPECTED: error
                     */
                    if ($action > 0) {
                        /* shift */
                        //$this->traceShift($symbol);

                        ++$stackPos;
                        $stateStack[$stackPos] = $state = $action;
                        $this->semStack[$stackPos] = $tokenValue;
                        $this->startAttributeStack[$stackPos] = $startAttributes;
                        $this->endAttributeStack[$stackPos] = $endAttributes;
                        $this->endAttributes = $endAttributes;
                        $symbol = self::SYMBOL_NONE;

                        if ($this->errorState) {
                            --$this->errorState;
                        }

                        if ($action < $this->numNonLeafStates) {
                            continue;
                        }

                        /* $yyn >= numNonLeafStates means shift-and-reduce */
                        $rule = $action - $this->numNonLeafStates;
                    } else {
                        $rule = -$action;
                    }
                } else {
                    $rule = $this->actionDefault[$state];
                }
            }

            for (;;) {
                if ($rule === 0) {
                    /* accept */
                    //$this->traceAccept();
                    return $this->semValue;
                } elseif ($rule !== $this->unexpectedTokenRule) {
                    /* reduce */
                    //$this->traceReduce($rule);

                    try {
                        $this->reduceCallbacks[$rule]($stackPos);
                    } catch (Error $e) {
                        if (-1 === $e->getStartLine() && isset($startAttributes['startLine'])) {
                            $e->setStartLine($startAttributes['startLine']);
                        }

                        $this->emitError($e);
                        // Can't recover from this type of error
                        return null;
                    }

                    /* Goto - shift nonterminal */
                    $lastEndAttributes = $this->endAttributeStack[$stackPos];
                    $ruleLength = $this->ruleToLength[$rule];
                    $stackPos -= $ruleLength;
                    $nonTerminal = $this->ruleToNonTerminal[$rule];
                    $idx = $this->gotoBase[$nonTerminal] + $stateStack[$stackPos];
                    if ($idx >= 0 && $idx < $this->gotoTableSize && $this->gotoCheck[$idx] === $nonTerminal) {
                        $state = $this->goto[$idx];
                    } else {
                        $state = $this->gotoDefault[$nonTerminal];
                    }

                    ++$stackPos;
                    $stateStack[$stackPos]     = $state;
                    $this->semStack[$stackPos] = $this->semValue;
                    $this->endAttributeStack[$stackPos] = $lastEndAttributes;
                    if ($ruleLength === 0) {
                        // Empty productions use the start attributes of the lookahead token.
                        $this->startAttributeStack[$stackPos] = $this->lookaheadStartAttributes;
                    }
                } else {
                    /* error */
                    switch ($this->errorState) {
                        case 0:
                            $msg = $this->getErrorMessage($symbol, $state);
                            $this->emitError(new Error($msg, $startAttributes + $endAttributes));
                            // Break missing intentionally
                        case 1:
                        case 2:
                            $this->errorState = 3;

                            // Pop until error-expecting state uncovered
                            while (!(
                                (($idx = $this->actionBase[$state] + $this->errorSymbol) >= 0
                                    && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $this->errorSymbol)
                                || ($state < $this->YY2TBLSTATE
                                    && ($idx = $this->actionBase[$state + $this->numNonLeafStates] + $this->errorSymbol) >= 0
                                    && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $this->errorSymbol)
                            ) || ($action = $this->action[$idx]) === $this->defaultAction) { // Not totally sure about this
                                if ($stackPos <= 0) {
                                    // Could not recover from error
                                    return null;
                                }
                                $state = $stateStack[--$stackPos];
                                //$this->tracePop($state);
                            }

                            //$this->traceShift($this->errorSymbol);
                            ++$stackPos;
                            $stateStack[$stackPos] = $state = $action;

                            // We treat the error symbol as being empty, so we reset the end attributes
                            // to the end attributes of the last non-error symbol
                            $this->startAttributeStack[$stackPos] = $this->lookaheadStartAttributes;
                            $this->endAttributeStack[$stackPos] = $this->endAttributeStack[$stackPos - 1];
                            $this->endAttributes = $this->endAttributeStack[$stackPos - 1];
                            break;

                        case 3:
                            if ($symbol === 0) {
                                // Reached EOF without recovering from error
                                return null;
                            }

                            //$this->traceDiscard($symbol);
                            $symbol = self::SYMBOL_NONE;
                            break 2;
                    }
                }

                if ($state < $this->numNonLeafStates) {
                    break;
                }

                /* >= numNonLeafStates means shift-and-reduce */
                $rule = $state - $this->numNonLeafStates;
            }
        }

        throw new \RuntimeException('Reached end of parser loop');
    }

    protected function emitError(Error $error) {
        $this->errorHandler->handleError($error);
    }

    /**
     * Format error message including expected tokens.
     *
     * @param int $symbol Unexpected symbol
     * @param int $state  State at time of error
     *
     * @return string Formatted error message
     */
    protected function getErrorMessage(int $symbol, int $state) : string {
        $expectedString = '';
        if ($expected = $this->getExpectedTokens($state)) {
            $expectedString = ', expecting ' . implode(' or ', $expected);
        }

        return 'Syntax error, unexpected ' . $this->symbolToName[$symbol] . $expectedString;
    }

    /**
     * Get limited number of expected tokens in given state.
     *
     * @param int $state State
     *
     * @return string[] Expected tokens. If too many, an empty array is returned.
     */
    protected function getExpectedTokens(int $state) : array {
        $expected = [];

        $base = $this->actionBase[$state];
        foreach ($this->symbolToName as $symbol => $name) {
            $idx = $base + $symbol;
            if ($idx >= 0 && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $symbol
                || $state < $this->YY2TBLSTATE
                && ($idx = $this->actionBase[$state + $this->numNonLeafStates] + $symbol) >= 0
                && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $symbol
            ) {
                if ($this->action[$idx] !== $this->unexpectedTokenRule
                    && $this->action[$idx] !== $this->defaultAction
                    && $symbol !== $this->errorSymbol
                ) {
                    if (count($expected) === 4) {
                        /* Too many expected tokens */
                        return [];
                    }

                    $expected[] = $name;
                }
            }
        }

        return $expected;
    }

    /*
     * Tracing functions used for debugging the parser.
     */

    /*
    protected function traceNewState($state, $symbol) {
        echo '% State ' . $state
            . ', Lookahead ' . ($symbol == self::SYMBOL_NONE ? '--none--' : $this->symbolToName[$symbol]) . "\n";
    }

    protected function traceRead($symbol) {
        echo '% Reading ' . $this->symbolToName[$symbol] . "\n";
    }

    protected function traceShift($symbol) {
        echo '% Shift ' . $this->symbolToName[$symbol] . "\n";
    }

    protected function traceAccept() {
        echo "% Accepted.\n";
    }

    protected function traceReduce($n) {
        echo '% Reduce by (' . $n . ') ' . $this->productions[$n] . "\n";
    }

    protected function tracePop($state) {
        echo '% Recovering, uncovered state ' . $state . "\n";
    }

    protected function traceDiscard($symbol) {
        echo '% Discard ' . $this->symbolToName[$symbol] . "\n";
    }
    */

    /*
     * Helper functions invoked by semantic actions
     */

    /**
     * Moves statements of semicolon-style namespaces into $ns->stmts and checks various error conditions.
     *
     * @param Node\Stmt[] $stmts
     * @return Node\Stmt[]
     */
    protected function handleNamespaces(array $stmts) : array {
        $hasErrored = false;
        $style = $this->getNamespacingStyle($stmts);
        if (null === $style) {
            // not namespaced, nothing to do
            return $stmts;
        } elseif ('brace' === $style) {
            // For braced namespaces we only have to check that there are no invalid statements between the namespaces
            $afterFirstNamespace = false;
            foreach ($stmts as $stmt) {
                if ($stmt instanceof Node\Stmt\Namespace_) {
                    $afterFirstNamespace = true;
                } elseif (!$stmt instanceof Node\Stmt\HaltCompiler
                        && !$stmt instanceof Node\Stmt\Nop
                        && $afterFirstNamespace && !$hasErrored) {
                    $this->emitError(new Error(
                        'No code may exist outside of namespace {}', $stmt->getAttributes()));
                    $hasErrored = true; // Avoid one error for every statement
                }
            }
            return $stmts;
        } else {
            // For semicolon namespaces we have to move the statements after a namespace declaration into ->stmts
            $resultStmts = [];
            $targetStmts =& $resultStmts;
            $lastNs = null;
            foreach ($stmts as $stmt) {
                if ($stmt instanceof Node\Stmt\Namespace_) {
                    if ($lastNs !== null) {
                        $this->fixupNamespaceAttributes($lastNs);
                    }
                    if ($stmt->stmts === null) {
                        $stmt->stmts = [];
                        $targetStmts =& $stmt->stmts;
                        $resultStmts[] = $stmt;
                    } else {
                        // This handles the invalid case of mixed style namespaces
                        $resultStmts[] = $stmt;
                        $targetStmts =& $resultStmts;
                    }
                    $lastNs = $stmt;
                } elseif ($stmt instanceof Node\Stmt\HaltCompiler) {
                    // __halt_compiler() is not moved into the namespace
                    $resultStmts[] = $stmt;
                } else {
                    $targetStmts[] = $stmt;
                }
            }
            if ($lastNs !== null) {
                $this->fixupNamespaceAttributes($lastNs);
            }
            return $resultStmts;
        }
    }

    private function fixupNamespaceAttributes(Node\Stmt\Namespace_ $stmt) {
        // We moved the statements into the namespace node, as such the end of the namespace node
        // needs to be extended to the end of the statements.
        if (empty($stmt->stmts)) {
            return;
        }

        // We only move the builtin end attributes here. This is the best we can do with the
        // knowledge we have.
        $endAttributes = ['endLine', 'endFilePos', 'endTokenPos'];
        $lastStmt = $stmt->stmts[count($stmt->stmts) - 1];
        foreach ($endAttributes as $endAttribute) {
            if ($lastStmt->hasAttribute($endAttribute)) {
                $stmt->setAttribute($endAttribute, $lastStmt->getAttribute($endAttribute));
            }
        }
    }

    /**
     * Determine namespacing style (semicolon or brace)
     *
     * @param Node[] $stmts Top-level statements.
     *
     * @return null|string One of "semicolon", "brace" or null (no namespaces)
     */
    private function getNamespacingStyle(array $stmts) {
        $style = null;
        $hasNotAllowedStmts = false;
        foreach ($stmts as $i => $stmt) {
            if ($stmt instanceof Node\Stmt\Namespace_) {
                $currentStyle = null === $stmt->stmts ? 'semicolon' : 'brace';
                if (null === $style) {
                    $style = $currentStyle;
                    if ($hasNotAllowedStmts) {
                        $this->emitError(new Error(
                            'Namespace declaration statement has to be the very first statement in the script',
                            $stmt->getLine() // Avoid marking the entire namespace as an error
                        ));
                    }
                } elseif ($style !== $currentStyle) {
                    $this->emitError(new Error(
                        'Cannot mix bracketed namespace declarations with unbracketed namespace declarations',
                        $stmt->getLine() // Avoid marking the entire namespace as an error
                    ));
                    // Treat like semicolon style for namespace normalization
                    return 'semicolon';
                }
                continue;
            }

            /* declare(), __halt_compiler() and nops can be used before a namespace declaration */
            if ($stmt instanceof Node\Stmt\Declare_
                || $stmt instanceof Node\Stmt\HaltCompiler
                || $stmt instanceof Node\Stmt\Nop) {
                continue;
            }

            /* There may be a hashbang line at the very start of the file */
            if ($i === 0 && $stmt instanceof Node\Stmt\InlineHTML && preg_match('/\A#!.*\r?\n\z/', $stmt->value)) {
                continue;
            }

            /* Everything else if forbidden before namespace declarations */
            $hasNotAllowedStmts = true;
        }
        return $style;
    }

    /**
     * Fix up parsing of static property calls in PHP 5.
     *
     * In PHP 5 A::$b[c][d] and A::$b[c][d]() have very different interpretation. The former is
     * interpreted as (A::$b)[c][d], while the latter is the same as A::{$b[c][d]}(). We parse the
     * latter as the former initially and this method fixes the AST into the correct form when we
     * encounter the "()".
     *
     * @param  Node\Expr\StaticPropertyFetch|Node\Expr\ArrayDimFetch $prop
     * @param  Node\Arg[] $args
     * @param  array      $attributes
     *
     * @return Expr\StaticCall
     */
    protected function fixupPhp5StaticPropCall($prop, array $args, array $attributes) : Expr\StaticCall {
        if ($prop instanceof Node\Expr\StaticPropertyFetch) {
            $name = $prop->name instanceof VarLikeIdentifier
                ? $prop->name->toString() : $prop->name;
            $var = new Expr\Variable($name, $prop->name->getAttributes());
            return new Expr\StaticCall($prop->class, $var, $args, $attributes);
        } elseif ($prop instanceof Node\Expr\ArrayDimFetch) {
            $tmp = $prop;
            while ($tmp->var instanceof Node\Expr\ArrayDimFetch) {
                $tmp = $tmp->var;
            }

            /** @var Expr\StaticPropertyFetch $staticProp */
            $staticProp = $tmp->var;

            // Set start attributes to attributes of innermost node
            $tmp = $prop;
            $this->fixupStartAttributes($tmp, $staticProp->name);
            while ($tmp->var instanceof Node\Expr\ArrayDimFetch) {
                $tmp = $tmp->var;
                $this->fixupStartAttributes($tmp, $staticProp->name);
            }

            $name = $staticProp->name instanceof VarLikeIdentifier
                ? $staticProp->name->toString() : $staticProp->name;
            $tmp->var = new Expr\Variable($name, $staticProp->name->getAttributes());
            return new Expr\StaticCall($staticProp->class, $prop, $args, $attributes);
        } else {
            throw new \Exception;
        }
    }

    protected function fixupStartAttributes(Node $to, Node $from) {
        $startAttributes = ['startLine', 'startFilePos', 'startTokenPos'];
        foreach ($startAttributes as $startAttribute) {
            if ($from->hasAttribute($startAttribute)) {
                $to->setAttribute($startAttribute, $from->getAttribute($startAttribute));
            }
        }
    }

    protected function handleBuiltinTypes(Name $name) {
        $builtinTypes = [
            'bool'     => true,
            'int'      => true,
            'float'    => true,
            'string'   => true,
            'iterable' => true,
            'void'     => true,
            'object'   => true,
            'null'     => true,
            'false'    => true,
            'mixed'    => true,
            'never'    => true,
            'true'     => true,
        ];

        if (!$name->isUnqualified()) {
            return $name;
        }

        $lowerName = $name->toLowerString();
        if (!isset($builtinTypes[$lowerName])) {
            return $name;
        }

        return new Node\Identifier($lowerName, $name->getAttributes());
    }

    /**
     * Get combined start and end attributes at a stack location
     *
     * @param int $pos Stack location
     *
     * @return array Combined start and end attributes
     */
    protected function getAttributesAt(int $pos) : array {
        return $this->startAttributeStack[$pos] + $this->endAttributeStack[$pos];
    }

    protected function getFloatCastKind(string $cast): int
    {
        $cast = strtolower($cast);
        if (strpos($cast, 'float') !== false) {
            return Double::KIND_FLOAT;
        }

        if (strpos($cast, 'real') !== false) {
            return Double::KIND_REAL;
        }

        return Double::KIND_DOUBLE;
    }

    protected function parseLNumber($str, $attributes, $allowInvalidOctal = false) {
        try {
            return LNumber::fromString($str, $attributes, $allowInvalidOctal);
        } catch (Error $error) {
            $this->emitError($error);
            // Use dummy value
            return new LNumber(0, $attributes);
        }
    }

    /**
     * Parse a T_NUM_STRING token into either an integer or string node.
     *
     * @param string $str        Number string
     * @param array  $attributes Attributes
     *
     * @return LNumber|String_ Integer or string node.
     */
    protected function parseNumString(string $str, array $attributes) {
        if (!preg_match('/^(?:0|-?[1-9][0-9]*)$/', $str)) {
            return new String_($str, $attributes);
        }

        $num = +$str;
        if (!is_int($num)) {
            return new String_($str, $attributes);
        }

        return new LNumber($num, $attributes);
    }

    protected function stripIndentation(
        string $string, int $indentLen, string $indentChar,
        bool $newlineAtStart, bool $newlineAtEnd, array $attributes
    ) {
        if ($indentLen === 0) {
            return $string;
        }

        $start = $newlineAtStart ? '(?:(?<=\n)|\A)' : '(?<=\n)';
        $end = $newlineAtEnd ? '(?:(?=[\r\n])|\z)' : '(?=[\r\n])';
        $regex = '/' . $start . '([ \t]*)(' . $end . ')?/';
        return preg_replace_callback(
            $regex,
            function ($matches) use ($indentLen, $indentChar, $attributes) {
                $prefix = substr($matches[1], 0, $indentLen);
                if (false !== strpos($prefix, $indentChar === " " ? "\t" : " ")) {
                    $this->emitError(new Error(
                        'Invalid indentation - tabs and spaces cannot be mixed', $attributes
                    ));
                } elseif (strlen($prefix) < $indentLen && !isset($matches[2])) {
                    $this->emitError(new Error(
                        'Invalid body indentation level ' .
                        '(expecting an indentation level of at least ' . $indentLen . ')',
                        $attributes
                    ));
                }
                return substr($matches[0], strlen($prefix));
            },
            $string
        );
    }

    protected function parseDocString(
        string $startToken, $contents, string $endToken,
        array $attributes, array $endTokenAttributes, bool $parseUnicodeEscape
    ) {
        $kind = strpos($startToken, "'") === false
            ? String_::KIND_HEREDOC : String_::KIND_NOWDOC;

        $regex = '/\A[bB]?<<<[ \t]*[\'"]?([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)[\'"]?(?:\r\n|\n|\r)\z/';
        $result = preg_match($regex, $startToken, $matches);
        assert($result === 1);
        $label = $matches[1];

        $result = preg_match('/\A[ \t]*/', $endToken, $matches);
        assert($result === 1);
        $indentation = $matches[0];

        $attributes['kind'] = $kind;
        $attributes['docLabel'] = $label;
        $attributes['docIndentation'] = $indentation;

        $indentHasSpaces = false !== strpos($indentation, " ");
        $indentHasTabs = false !== strpos($indentation, "\t");
        if ($indentHasSpaces && $indentHasTabs) {
            $this->emitError(new Error(
                'Invalid indentation - tabs and spaces cannot be mixed',
                $endTokenAttributes
            ));

            // Proceed processing as if this doc string is not indented
            $indentation = '';
        }

        $indentLen = \strlen($indentation);
        $indentChar = $indentHasSpaces ? " " : "\t";

        if (\is_string($contents)) {
            if ($contents === '') {
                return new String_('', $attributes);
            }

            $contents = $this->stripIndentation(
                $contents, $indentLen, $indentChar, true, true, $attributes
            );
            $contents = preg_replace('~(\r\n|\n|\r)\z~', '', $contents);

            if ($kind === String_::KIND_HEREDOC) {
                $contents = String_::parseEscapeSequences($contents, null, $parseUnicodeEscape);
            }

            return new String_($contents, $attributes);
        } else {
            assert(count($contents) > 0);
            if (!$contents[0] instanceof Node\Scalar\EncapsedStringPart) {
                // If there is no leading encapsed string part, pretend there is an empty one
                $this->stripIndentation(
                    '', $indentLen, $indentChar, true, false, $contents[0]->getAttributes()
                );
            }

            $newContents = [];
            foreach ($contents as $i => $part) {
                if ($part instanceof Node\Scalar\EncapsedStringPart) {
                    $isLast = $i === \count($contents) - 1;
                    $part->value = $this->stripIndentation(
                        $part->value, $indentLen, $indentChar,
                        $i === 0, $isLast, $part->getAttributes()
                    );
                    $part->value = String_::parseEscapeSequences($part->value, null, $parseUnicodeEscape);
                    if ($isLast) {
                        $part->value = preg_replace('~(\r\n|\n|\r)\z~', '', $part->value);
                    }
                    if ('' === $part->value) {
                        continue;
                    }
                }
                $newContents[] = $part;
            }
            return new Encapsed($newContents, $attributes);
        }
    }

    /**
     * Create attributes for a zero-length common-capturing nop.
     *
     * @param Comment[] $comments
     * @return array
     */
    protected function createCommentNopAttributes(array $comments) {
        $comment = $comments[count($comments) - 1];
        $commentEndLine = $comment->getEndLine();
        $commentEndFilePos = $comment->getEndFilePos();
        $commentEndTokenPos = $comment->getEndTokenPos();

        $attributes = ['comments' => $comments];
        if (-1 !== $commentEndLine) {
            $attributes['startLine'] = $commentEndLine;
            $attributes['endLine'] = $commentEndLine;
        }
        if (-1 !== $commentEndFilePos) {
            $attributes['startFilePos'] = $commentEndFilePos + 1;
            $attributes['endFilePos'] = $commentEndFilePos;
        }
        if (-1 !== $commentEndTokenPos) {
            $attributes['startTokenPos'] = $commentEndTokenPos + 1;
            $attributes['endTokenPos'] = $commentEndTokenPos;
        }
        return $attributes;
    }

    /** @param ElseIf_|Else_ $node */
    protected function fixupAlternativeElse($node) {
        // Make sure a trailing nop statement carrying comments is part of the node.
        $numStmts = \count($node->stmts);
        if ($numStmts !== 0 && $node->stmts[$numStmts - 1] instanceof Nop) {
            $nopAttrs = $node->stmts[$numStmts - 1]->getAttributes();
            if (isset($nopAttrs['endLine'])) {
                $node->setAttribute('endLine', $nopAttrs['endLine']);
            }
            if (isset($nopAttrs['endFilePos'])) {
                $node->setAttribute('endFilePos', $nopAttrs['endFilePos']);
            }
            if (isset($nopAttrs['endTokenPos'])) {
                $node->setAttribute('endTokenPos', $nopAttrs['endTokenPos']);
            }
        }
    }

    protected function checkClassModifier($a, $b, $modifierPos) {
        try {
            Class_::verifyClassModifier($a, $b);
        } catch (Error $error) {
            $error->setAttributes($this->getAttributesAt($modifierPos));
            $this->emitError($error);
        }
    }

    protected function checkModifier($a, $b, $modifierPos) {
        // Jumping through some hoops here because verifyModifier() is also used elsewhere
        try {
            Class_::verifyModifier($a, $b);
        } catch (Error $error) {
            $error->setAttributes($this->getAttributesAt($modifierPos));
            $this->emitError($error);
        }
    }

    protected function checkParam(Param $node) {
        if ($node->variadic && null !== $node->default) {
            $this->emitError(new Error(
                'Variadic parameter cannot have a default value',
                $node->default->getAttributes()
            ));
        }
    }

    protected function checkTryCatch(TryCatch $node) {
        if (empty($node->catches) && null === $node->finally) {
            $this->emitError(new Error(
                'Cannot use try without catch or finally', $node->getAttributes()
            ));
        }
    }

    protected function checkNamespace(Namespace_ $node) {
        if (null !== $node->stmts) {
            foreach ($node->stmts as $stmt) {
                if ($stmt instanceof Namespace_) {
                    $this->emitError(new Error(
                        'Namespace declarations cannot be nested', $stmt->getAttributes()
                    ));
                }
            }
        }
    }

    private function checkClassName($name, $namePos) {
        if (null !== $name && $name->isSpecialClassName()) {
            $this->emitError(new Error(
                sprintf('Cannot use \'%s\' as class name as it is reserved', $name),
                $this->getAttributesAt($namePos)
            ));
        }
    }

    private function checkImplementedInterfaces(array $interfaces) {
        foreach ($interfaces as $interface) {
            if ($interface->isSpecialClassName()) {
                $this->emitError(new Error(
                    sprintf('Cannot use \'%s\' as interface name as it is reserved', $interface),
                    $interface->getAttributes()
                ));
            }
        }
    }

    protected function checkClass(Class_ $node, $namePos) {
        $this->checkClassName($node->name, $namePos);

        if ($node->extends && $node->extends->isSpecialClassName()) {
            $this->emitError(new Error(
                sprintf('Cannot use \'%s\' as class name as it is reserved', $node->extends),
                $node->extends->getAttributes()
            ));
        }

        $this->checkImplementedInterfaces($node->implements);
    }

    protected function checkInterface(Interface_ $node, $namePos) {
        $this->checkClassName($node->name, $namePos);
        $this->checkImplementedInterfaces($node->extends);
    }

    protected function checkEnum(Enum_ $node, $namePos) {
        $this->checkClassName($node->name, $namePos);
        $this->checkImplementedInterfaces($node->implements);
    }

    protected function checkClassMethod(ClassMethod $node, $modifierPos) {
        if ($node->flags & Class_::MODIFIER_STATIC) {
            switch ($node->name->toLowerString()) {
                case '__construct':
                    $this->emitError(new Error(
                        sprintf('Constructor %s() cannot be static', $node->name),
                        $this->getAttributesAt($modifierPos)));
                    break;
                case '__destruct':
                    $this->emitError(new Error(
                        sprintf('Destructor %s() cannot be static', $node->name),
                        $this->getAttributesAt($modifierPos)));
                    break;
                case '__clone':
                    $this->emitError(new Error(
                        sprintf('Clone method %s() cannot be static', $node->name),
                        $this->getAttributesAt($modifierPos)));
                    break;
            }
        }

        if ($node->flags & Class_::MODIFIER_READONLY) {
            $this->emitError(new Error(
                sprintf('Method %s() cannot be readonly', $node->name),
                $this->getAttributesAt($modifierPos)));
        }
    }

    protected function checkClassConst(ClassConst $node, $modifierPos) {
        if ($node->flags & Class_::MODIFIER_STATIC) {
            $this->emitError(new Error(
                "Cannot use 'static' as constant modifier",
                $this->getAttributesAt($modifierPos)));
        }
        if ($node->flags & Class_::MODIFIER_ABSTRACT) {
            $this->emitError(new Error(
                "Cannot use 'abstract' as constant modifier",
                $this->getAttributesAt($modifierPos)));
        }
        if ($node->flags & Class_::MODIFIER_READONLY) {
            $this->emitError(new Error(
                "Cannot use 'readonly' as constant modifier",
                $this->getAttributesAt($modifierPos)));
        }
    }

    protected function checkProperty(Property $node, $modifierPos) {
        if ($node->flags & Class_::MODIFIER_ABSTRACT) {
            $this->emitError(new Error('Properties cannot be declared abstract',
                $this->getAttributesAt($modifierPos)));
        }

        if ($node->flags & Class_::MODIFIER_FINAL) {
            $this->emitError(new Error('Properties cannot be declared final',
                $this->getAttributesAt($modifierPos)));
        }
    }

    protected function checkUseUse(UseUse $node, $namePos) {
        if ($node->alias && $node->alias->isSpecialClassName()) {
            $this->emitError(new Error(
                sprintf(
                    'Cannot use %s as %s because \'%2$s\' is a special class name',
                    $node->name, $node->alias
                ),
                $this->getAttributesAt($namePos)
            ));
        }
    }
}
<?php declare(strict_types=1);

namespace PhpParser;

class ParserFactory
{
    const PREFER_PHP7 = 1;
    const PREFER_PHP5 = 2;
    const ONLY_PHP7 = 3;
    const ONLY_PHP5 = 4;

    /**
     * Creates a Parser instance, according to the provided kind.
     *
     * @param int        $kind  One of ::PREFER_PHP7, ::PREFER_PHP5, ::ONLY_PHP7 or ::ONLY_PHP5
     * @param Lexer|null $lexer Lexer to use. Defaults to emulative lexer when not specified
     * @param array      $parserOptions Parser options. See ParserAbstract::__construct() argument
     *
     * @return Parser The parser instance
     */
    public function create(int $kind, Lexer $lexer = null, array $parserOptions = []) : Parser {
        if (null === $lexer) {
            $lexer = new Lexer\Emulative();
        }
        switch ($kind) {
            case self::PREFER_PHP7:
                return new Parser\Multiple([
                    new Parser\Php7($lexer, $parserOptions), new Parser\Php5($lexer, $parserOptions)
                ]);
            case self::PREFER_PHP5:
                return new Parser\Multiple([
                    new Parser\Php5($lexer, $parserOptions), new Parser\Php7($lexer, $parserOptions)
                ]);
            case self::ONLY_PHP7:
                return new Parser\Php7($lexer, $parserOptions);
            case self::ONLY_PHP5:
                return new Parser\Php5($lexer, $parserOptions);
            default:
                throw new \LogicException(
                    'Kind must be one of ::PREFER_PHP7, ::PREFER_PHP5, ::ONLY_PHP7 or ::ONLY_PHP5'
                );
        }
    }
}
<?php declare(strict_types=1);

namespace PhpParser\PrettyPrinter;

use PhpParser\Node;
use PhpParser\Node\Expr;
use PhpParser\Node\Expr\AssignOp;
use PhpParser\Node\Expr\BinaryOp;
use PhpParser\Node\Expr\Cast;
use PhpParser\Node\Name;
use PhpParser\Node\Scalar;
use PhpParser\Node\Scalar\MagicConst;
use PhpParser\Node\Stmt;
use PhpParser\PrettyPrinterAbstract;

class Standard extends PrettyPrinterAbstract
{
    // Special nodes

    protected function pParam(Node\Param $node) {
        return $this->pAttrGroups($node->attrGroups, true)
             . $this->pModifiers($node->flags)
             . ($node->type ? $this->p($node->type) . ' ' : '')
             . ($node->byRef ? '&' : '')
             . ($node->variadic ? '...' : '')
             . $this->p($node->var)
             . ($node->default ? ' = ' . $this->p($node->default) : '');
    }

    protected function pArg(Node\Arg $node) {
        return ($node->name ? $node->name->toString() . ': ' : '')
             . ($node->byRef ? '&' : '') . ($node->unpack ? '...' : '')
             . $this->p($node->value);
    }

    protected function pVariadicPlaceholder(Node\VariadicPlaceholder $node) {
        return '...';
    }

    protected function pConst(Node\Const_ $node) {
        return $node->name . ' = ' . $this->p($node->value);
    }

    protected function pNullableType(Node\NullableType $node) {
        return '?' . $this->p($node->type);
    }

    protected function pUnionType(Node\UnionType $node) {
        $types = [];
        foreach ($node->types as $typeNode) {
            if ($typeNode instanceof Node\IntersectionType) {
                $types[] = '('. $this->p($typeNode) . ')';
                continue;
            }
            $types[] = $this->p($typeNode);
        }
        return implode('|', $types);
    }

    protected function pIntersectionType(Node\IntersectionType $node) {
        return $this->pImplode($node->types, '&');
    }

    protected function pIdentifier(Node\Identifier $node) {
        return $node->name;
    }

    protected function pVarLikeIdentifier(Node\VarLikeIdentifier $node) {
        return '$' . $node->name;
    }

    protected function pAttribute(Node\Attribute $node) {
        return $this->p($node->name)
             . ($node->args ? '(' . $this->pCommaSeparated($node->args) . ')' : '');
    }

    protected function pAttributeGroup(Node\AttributeGroup $node) {
        return '#[' . $this->pCommaSeparated($node->attrs) . ']';
    }

    // Names

    protected function pName(Name $node) {
        return implode('\\', $node->parts);
    }

    protected function pName_FullyQualified(Name\FullyQualified $node) {
        return '\\' . implode('\\', $node->parts);
    }

    protected function pName_Relative(Name\Relative $node) {
        return 'namespace\\' . implode('\\', $node->parts);
    }

    // Magic Constants

    protected function pScalar_MagicConst_Class(MagicConst\Class_ $node) {
        return '__CLASS__';
    }

    protected function pScalar_MagicConst_Dir(MagicConst\Dir $node) {
        return '__DIR__';
    }

    protected function pScalar_MagicConst_File(MagicConst\File $node) {
        return '__FILE__';
    }

    protected function pScalar_MagicConst_Function(MagicConst\Function_ $node) {
        return '__FUNCTION__';
    }

    protected function pScalar_MagicConst_Line(MagicConst\Line $node) {
        return '__LINE__';
    }

    protected function pScalar_MagicConst_Method(MagicConst\Method $node) {
        return '__METHOD__';
    }

    protected function pScalar_MagicConst_Namespace(MagicConst\Namespace_ $node) {
        return '__NAMESPACE__';
    }

    protected function pScalar_MagicConst_Trait(MagicConst\Trait_ $node) {
        return '__TRAIT__';
    }

    // Scalars

    protected function pScalar_String(Scalar\String_ $node) {
        $kind = $node->getAttribute('kind', Scalar\String_::KIND_SINGLE_QUOTED);
        switch ($kind) {
            case Scalar\String_::KIND_NOWDOC:
                $label = $node->getAttribute('docLabel');
                if ($label && !$this->containsEndLabel($node->value, $label)) {
                    if ($node->value === '') {
                        return "<<<'$label'\n$label" . $this->docStringEndToken;
                    }

                    return "<<<'$label'\n$node->value\n$label"
                         . $this->docStringEndToken;
                }
                /* break missing intentionally */
            case Scalar\String_::KIND_SINGLE_QUOTED:
                return $this->pSingleQuotedString($node->value);
            case Scalar\String_::KIND_HEREDOC:
                $label = $node->getAttribute('docLabel');
                if ($label && !$this->containsEndLabel($node->value, $label)) {
                    if ($node->value === '') {
                        return "<<<$label\n$label" . $this->docStringEndToken;
                    }

                    $escaped = $this->escapeString($node->value, null);
                    return "<<<$label\n" . $escaped . "\n$label"
                         . $this->docStringEndToken;
                }
            /* break missing intentionally */
            case Scalar\String_::KIND_DOUBLE_QUOTED:
                return '"' . $this->escapeString($node->value, '"') . '"';
        }
        throw new \Exception('Invalid string kind');
    }

    protected function pScalar_Encapsed(Scalar\Encapsed $node) {
        if ($node->getAttribute('kind') === Scalar\String_::KIND_HEREDOC) {
            $label = $node->getAttribute('docLabel');
            if ($label && !$this->encapsedContainsEndLabel($node->parts, $label)) {
                if (count($node->parts) === 1
                    && $node->parts[0] instanceof Scalar\EncapsedStringPart
                    && $node->parts[0]->value === ''
                ) {
                    return "<<<$label\n$label" . $this->docStringEndToken;
                }

                return "<<<$label\n" . $this->pEncapsList($node->parts, null) . "\n$label"
                     . $this->docStringEndToken;
            }
        }
        return '"' . $this->pEncapsList($node->parts, '"') . '"';
    }

    protected function pScalar_LNumber(Scalar\LNumber $node) {
        if ($node->value === -\PHP_INT_MAX-1) {
            // PHP_INT_MIN cannot be represented as a literal,
            // because the sign is not part of the literal
            return '(-' . \PHP_INT_MAX . '-1)';
        }

        $kind = $node->getAttribute('kind', Scalar\LNumber::KIND_DEC);
        if (Scalar\LNumber::KIND_DEC === $kind) {
            return (string) $node->value;
        }

        if ($node->value < 0) {
            $sign = '-';
            $str = (string) -$node->value;
        } else {
            $sign = '';
            $str = (string) $node->value;
        }
        switch ($kind) {
            case Scalar\LNumber::KIND_BIN:
                return $sign . '0b' . base_convert($str, 10, 2);
            case Scalar\LNumber::KIND_OCT:
                return $sign . '0' . base_convert($str, 10, 8);
            case Scalar\LNumber::KIND_HEX:
                return $sign . '0x' . base_convert($str, 10, 16);
        }
        throw new \Exception('Invalid number kind');
    }

    protected function pScalar_DNumber(Scalar\DNumber $node) {
        if (!is_finite($node->value)) {
            if ($node->value === \INF) {
                return '\INF';
            } elseif ($node->value === -\INF) {
                return '-\INF';
            } else {
                return '\NAN';
            }
        }

        // Try to find a short full-precision representation
        $stringValue = sprintf('%.16G', $node->value);
        if ($node->value !== (double) $stringValue) {
            $stringValue = sprintf('%.17G', $node->value);
        }

        // %G is locale dependent and there exists no locale-independent alternative. We don't want
        // mess with switching locales here, so let's assume that a comma is the only non-standard
        // decimal separator we may encounter...
        $stringValue = str_replace(',', '.', $stringValue);

        // ensure that number is really printed as float
        return preg_match('/^-?[0-9]+$/', $stringValue) ? $stringValue . '.0' : $stringValue;
    }

    protected function pScalar_EncapsedStringPart(Scalar\EncapsedStringPart $node) {
        throw new \LogicException('Cannot directly print EncapsedStringPart');
    }

    // Assignments

    protected function pExpr_Assign(Expr\Assign $node) {
        return $this->pInfixOp(Expr\Assign::class, $node->var, ' = ', $node->expr);
    }

    protected function pExpr_AssignRef(Expr\AssignRef $node) {
        return $this->pInfixOp(Expr\AssignRef::class, $node->var, ' =& ', $node->expr);
    }

    protected function pExpr_AssignOp_Plus(AssignOp\Plus $node) {
        return $this->pInfixOp(AssignOp\Plus::class, $node->var, ' += ', $node->expr);
    }

    protected function pExpr_AssignOp_Minus(AssignOp\Minus $node) {
        return $this->pInfixOp(AssignOp\Minus::class, $node->var, ' -= ', $node->expr);
    }

    protected function pExpr_AssignOp_Mul(AssignOp\Mul $node) {
        return $this->pInfixOp(AssignOp\Mul::class, $node->var, ' *= ', $node->expr);
    }

    protected function pExpr_AssignOp_Div(AssignOp\Div $node) {
        return $this->pInfixOp(AssignOp\Div::class, $node->var, ' /= ', $node->expr);
    }

    protected function pExpr_AssignOp_Concat(AssignOp\Concat $node) {
        return $this->pInfixOp(AssignOp\Concat::class, $node->var, ' .= ', $node->expr);
    }

    protected function pExpr_AssignOp_Mod(AssignOp\Mod $node) {
        return $this->pInfixOp(AssignOp\Mod::class, $node->var, ' %= ', $node->expr);
    }

    protected function pExpr_AssignOp_BitwiseAnd(AssignOp\BitwiseAnd $node) {
        return $this->pInfixOp(AssignOp\BitwiseAnd::class, $node->var, ' &= ', $node->expr);
    }

    protected function pExpr_AssignOp_BitwiseOr(AssignOp\BitwiseOr $node) {
        return $this->pInfixOp(AssignOp\BitwiseOr::class, $node->var, ' |= ', $node->expr);
    }

    protected function pExpr_AssignOp_BitwiseXor(AssignOp\BitwiseXor $node) {
        return $this->pInfixOp(AssignOp\BitwiseXor::class, $node->var, ' ^= ', $node->expr);
    }

    protected function pExpr_AssignOp_ShiftLeft(AssignOp\ShiftLeft $node) {
        return $this->pInfixOp(AssignOp\ShiftLeft::class, $node->var, ' <<= ', $node->expr);
    }

    protected function pExpr_AssignOp_ShiftRight(AssignOp\ShiftRight $node) {
        return $this->pInfixOp(AssignOp\ShiftRight::class, $node->var, ' >>= ', $node->expr);
    }

    protected function pExpr_AssignOp_Pow(AssignOp\Pow $node) {
        return $this->pInfixOp(AssignOp\Pow::class, $node->var, ' **= ', $node->expr);
    }

    protected function pExpr_AssignOp_Coalesce(AssignOp\Coalesce $node) {
        return $this->pInfixOp(AssignOp\Coalesce::class, $node->var, ' ??= ', $node->expr);
    }

    // Binary expressions

    protected function pExpr_BinaryOp_Plus(BinaryOp\Plus $node) {
        return $this->pInfixOp(BinaryOp\Plus::class, $node->left, ' + ', $node->right);
    }

    protected function pExpr_BinaryOp_Minus(BinaryOp\Minus $node) {
        return $this->pInfixOp(BinaryOp\Minus::class, $node->left, ' - ', $node->right);
    }

    protected function pExpr_BinaryOp_Mul(BinaryOp\Mul $node) {
        return $this->pInfixOp(BinaryOp\Mul::class, $node->left, ' * ', $node->right);
    }

    protected function pExpr_BinaryOp_Div(BinaryOp\Div $node) {
        return $this->pInfixOp(BinaryOp\Div::class, $node->left, ' / ', $node->right);
    }

    protected function pExpr_BinaryOp_Concat(BinaryOp\Concat $node) {
        return $this->pInfixOp(BinaryOp\Concat::class, $node->left, ' . ', $node->right);
    }

    protected function pExpr_BinaryOp_Mod(BinaryOp\Mod $node) {
        return $this->pInfixOp(BinaryOp\Mod::class, $node->left, ' % ', $node->right);
    }

    protected function pExpr_BinaryOp_BooleanAnd(BinaryOp\BooleanAnd $node) {
        return $this->pInfixOp(BinaryOp\BooleanAnd::class, $node->left, ' && ', $node->right);
    }

    protected function pExpr_BinaryOp_BooleanOr(BinaryOp\BooleanOr $node) {
        return $this->pInfixOp(BinaryOp\BooleanOr::class, $node->left, ' || ', $node->right);
    }

    protected function pExpr_BinaryOp_BitwiseAnd(BinaryOp\BitwiseAnd $node) {
        return $this->pInfixOp(BinaryOp\BitwiseAnd::class, $node->left, ' & ', $node->right);
    }

    protected function pExpr_BinaryOp_BitwiseOr(BinaryOp\BitwiseOr $node) {
        return $this->pInfixOp(BinaryOp\BitwiseOr::class, $node->left, ' | ', $node->right);
    }

    protected function pExpr_BinaryOp_BitwiseXor(BinaryOp\BitwiseXor $node) {
        return $this->pInfixOp(BinaryOp\BitwiseXor::class, $node->left, ' ^ ', $node->right);
    }

    protected function pExpr_BinaryOp_ShiftLeft(BinaryOp\ShiftLeft $node) {
        return $this->pInfixOp(BinaryOp\ShiftLeft::class, $node->left, ' << ', $node->right);
    }

    protected function pExpr_BinaryOp_ShiftRight(BinaryOp\ShiftRight $node) {
        return $this->pInfixOp(BinaryOp\ShiftRight::class, $node->left, ' >> ', $node->right);
    }

    protected function pExpr_BinaryOp_Pow(BinaryOp\Pow $node) {
        return $this->pInfixOp(BinaryOp\Pow::class, $node->left, ' ** ', $node->right);
    }

    protected function pExpr_BinaryOp_LogicalAnd(BinaryOp\LogicalAnd $node) {
        return $this->pInfixOp(BinaryOp\LogicalAnd::class, $node->left, ' and ', $node->right);
    }

    protected function pExpr_BinaryOp_LogicalOr(BinaryOp\LogicalOr $node) {
        return $this->pInfixOp(BinaryOp\LogicalOr::class, $node->left, ' or ', $node->right);
    }

    protected function pExpr_BinaryOp_LogicalXor(BinaryOp\LogicalXor $node) {
        return $this->pInfixOp(BinaryOp\LogicalXor::class, $node->left, ' xor ', $node->right);
    }

    protected function pExpr_BinaryOp_Equal(BinaryOp\Equal $node) {
        return $this->pInfixOp(BinaryOp\Equal::class, $node->left, ' == ', $node->right);
    }

    protected function pExpr_BinaryOp_NotEqual(BinaryOp\NotEqual $node) {
        return $this->pInfixOp(BinaryOp\NotEqual::class, $node->left, ' != ', $node->right);
    }

    protected function pExpr_BinaryOp_Identical(BinaryOp\Identical $node) {
        return $this->pInfixOp(BinaryOp\Identical::class, $node->left, ' === ', $node->right);
    }

    protected function pExpr_BinaryOp_NotIdentical(BinaryOp\NotIdentical $node) {
        return $this->pInfixOp(BinaryOp\NotIdentical::class, $node->left, ' !== ', $node->right);
    }

    protected function pExpr_BinaryOp_Spaceship(BinaryOp\Spaceship $node) {
        return $this->pInfixOp(BinaryOp\Spaceship::class, $node->left, ' <=> ', $node->right);
    }

    protected function pExpr_BinaryOp_Greater(BinaryOp\Greater $node) {
        return $this->pInfixOp(BinaryOp\Greater::class, $node->left, ' > ', $node->right);
    }

    protected function pExpr_BinaryOp_GreaterOrEqual(BinaryOp\GreaterOrEqual $node) {
        return $this->pInfixOp(BinaryOp\GreaterOrEqual::class, $node->left, ' >= ', $node->right);
    }

    protected function pExpr_BinaryOp_Smaller(BinaryOp\Smaller $node) {
        return $this->pInfixOp(BinaryOp\Smaller::class, $node->left, ' < ', $node->right);
    }

    protected function pExpr_BinaryOp_SmallerOrEqual(BinaryOp\SmallerOrEqual $node) {
        return $this->pInfixOp(BinaryOp\SmallerOrEqual::class, $node->left, ' <= ', $node->right);
    }

    protected function pExpr_BinaryOp_Coalesce(BinaryOp\Coalesce $node) {
        return $this->pInfixOp(BinaryOp\Coalesce::class, $node->left, ' ?? ', $node->right);
    }

    protected function pExpr_Instanceof(Expr\Instanceof_ $node) {
        list($precedence, $associativity) = $this->precedenceMap[Expr\Instanceof_::class];
        return $this->pPrec($node->expr, $precedence, $associativity, -1)
             . ' instanceof '
             . $this->pNewVariable($node->class);
    }

    // Unary expressions

    protected function pExpr_BooleanNot(Expr\BooleanNot $node) {
        return $this->pPrefixOp(Expr\BooleanNot::class, '!', $node->expr);
    }

    protected function pExpr_BitwiseNot(Expr\BitwiseNot $node) {
        return $this->pPrefixOp(Expr\BitwiseNot::class, '~', $node->expr);
    }

    protected function pExpr_UnaryMinus(Expr\UnaryMinus $node) {
        if ($node->expr instanceof Expr\UnaryMinus || $node->expr instanceof Expr\PreDec) {
            // Enforce -(-$expr) instead of --$expr
            return '-(' . $this->p($node->expr) . ')';
        }
        return $this->pPrefixOp(Expr\UnaryMinus::class, '-', $node->expr);
    }

    protected function pExpr_UnaryPlus(Expr\UnaryPlus $node) {
        if ($node->expr instanceof Expr\UnaryPlus || $node->expr instanceof Expr\PreInc) {
            // Enforce +(+$expr) instead of ++$expr
            return '+(' . $this->p($node->expr) . ')';
        }
        return $this->pPrefixOp(Expr\UnaryPlus::class, '+', $node->expr);
    }

    protected function pExpr_PreInc(Expr\PreInc $node) {
        return $this->pPrefixOp(Expr\PreInc::class, '++', $node->var);
    }

    protected function pExpr_PreDec(Expr\PreDec $node) {
        return $this->pPrefixOp(Expr\PreDec::class, '--', $node->var);
    }

    protected function pExpr_PostInc(Expr\PostInc $node) {
        return $this->pPostfixOp(Expr\PostInc::class, $node->var, '++');
    }

    protected function pExpr_PostDec(Expr\PostDec $node) {
        return $this->pPostfixOp(Expr\PostDec::class, $node->var, '--');
    }

    protected function pExpr_ErrorSuppress(Expr\ErrorSuppress $node) {
        return $this->pPrefixOp(Expr\ErrorSuppress::class, '@', $node->expr);
    }

    protected function pExpr_YieldFrom(Expr\YieldFrom $node) {
        return $this->pPrefixOp(Expr\YieldFrom::class, 'yield from ', $node->expr);
    }

    protected function pExpr_Print(Expr\Print_ $node) {
        return $this->pPrefixOp(Expr\Print_::class, 'print ', $node->expr);
    }

    // Casts

    protected function pExpr_Cast_Int(Cast\Int_ $node) {
        return $this->pPrefixOp(Cast\Int_::class, '(int) ', $node->expr);
    }

    protected function pExpr_Cast_Double(Cast\Double $node) {
        $kind = $node->getAttribute('kind', Cast\Double::KIND_DOUBLE);
        if ($kind === Cast\Double::KIND_DOUBLE) {
            $cast = '(double)';
        } elseif ($kind === Cast\Double::KIND_FLOAT) {
            $cast = '(float)';
        } elseif ($kind === Cast\Double::KIND_REAL) {
            $cast = '(real)';
        }
        return $this->pPrefixOp(Cast\Double::class, $cast . ' ', $node->expr);
    }

    protected function pExpr_Cast_String(Cast\String_ $node) {
        return $this->pPrefixOp(Cast\String_::class, '(string) ', $node->expr);
    }

    protected function pExpr_Cast_Array(Cast\Array_ $node) {
        return $this->pPrefixOp(Cast\Array_::class, '(array) ', $node->expr);
    }

    protected function pExpr_Cast_Object(Cast\Object_ $node) {
        return $this->pPrefixOp(Cast\Object_::class, '(object) ', $node->expr);
    }

    protected function pExpr_Cast_Bool(Cast\Bool_ $node) {
        return $this->pPrefixOp(Cast\Bool_::class, '(bool) ', $node->expr);
    }

    protected function pExpr_Cast_Unset(Cast\Unset_ $node) {
        return $this->pPrefixOp(Cast\Unset_::class, '(unset) ', $node->expr);
    }

    // Function calls and similar constructs

    protected function pExpr_FuncCall(Expr\FuncCall $node) {
        return $this->pCallLhs($node->name)
             . '(' . $this->pMaybeMultiline($node->args) . ')';
    }

    protected function pExpr_MethodCall(Expr\MethodCall $node) {
        return $this->pDereferenceLhs($node->var) . '->' . $this->pObjectProperty($node->name)
             . '(' . $this->pMaybeMultiline($node->args) . ')';
    }

    protected function pExpr_NullsafeMethodCall(Expr\NullsafeMethodCall $node) {
        return $this->pDereferenceLhs($node->var) . '?->' . $this->pObjectProperty($node->name)
            . '(' . $this->pMaybeMultiline($node->args) . ')';
    }

    protected function pExpr_StaticCall(Expr\StaticCall $node) {
        return $this->pStaticDereferenceLhs($node->class) . '::'
             . ($node->name instanceof Expr
                ? ($node->name instanceof Expr\Variable
                   ? $this->p($node->name)
                   : '{' . $this->p($node->name) . '}')
                : $node->name)
             . '(' . $this->pMaybeMultiline($node->args) . ')';
    }

    protected function pExpr_Empty(Expr\Empty_ $node) {
        return 'empty(' . $this->p($node->expr) . ')';
    }

    protected function pExpr_Isset(Expr\Isset_ $node) {
        return 'isset(' . $this->pCommaSeparated($node->vars) . ')';
    }

    protected function pExpr_Eval(Expr\Eval_ $node) {
        return 'eval(' . $this->p($node->expr) . ')';
    }

    protected function pExpr_Include(Expr\Include_ $node) {
        static $map = [
            Expr\Include_::TYPE_INCLUDE      => 'include',
            Expr\Include_::TYPE_INCLUDE_ONCE => 'include_once',
            Expr\Include_::TYPE_REQUIRE      => 'require',
            Expr\Include_::TYPE_REQUIRE_ONCE => 'require_once',
        ];

        return $map[$node->type] . ' ' . $this->p($node->expr);
    }

    protected function pExpr_List(Expr\List_ $node) {
        return 'list(' . $this->pCommaSeparated($node->items) . ')';
    }

    // Other

    protected function pExpr_Error(Expr\Error $node) {
        throw new \LogicException('Cannot pretty-print AST with Error nodes');
    }

    protected function pExpr_Variable(Expr\Variable $node) {
        if ($node->name instanceof Expr) {
            return '${' . $this->p($node->name) . '}';
        } else {
            return '$' . $node->name;
        }
    }

    protected function pExpr_Array(Expr\Array_ $node) {
        $syntax = $node->getAttribute('kind',
            $this->options['shortArraySyntax'] ? Expr\Array_::KIND_SHORT : Expr\Array_::KIND_LONG);
        if ($syntax === Expr\Array_::KIND_SHORT) {
            return '[' . $this->pMaybeMultiline($node->items, true) . ']';
        } else {
            return 'array(' . $this->pMaybeMultiline($node->items, true) . ')';
        }
    }

    protected function pExpr_ArrayItem(Expr\ArrayItem $node) {
        return (null !== $node->key ? $this->p($node->key) . ' => ' : '')
             . ($node->byRef ? '&' : '')
             . ($node->unpack ? '...' : '')
             . $this->p($node->value);
    }

    protected function pExpr_ArrayDimFetch(Expr\ArrayDimFetch $node) {
        return $this->pDereferenceLhs($node->var)
             . '[' . (null !== $node->dim ? $this->p($node->dim) : '') . ']';
    }

    protected function pExpr_ConstFetch(Expr\ConstFetch $node) {
        return $this->p($node->name);
    }

    protected function pExpr_ClassConstFetch(Expr\ClassConstFetch $node) {
        return $this->pStaticDereferenceLhs($node->class) . '::' . $this->pObjectProperty($node->name);
    }

    protected function pExpr_PropertyFetch(Expr\PropertyFetch $node) {
        return $this->pDereferenceLhs($node->var) . '->' . $this->pObjectProperty($node->name);
    }

    protected function pExpr_NullsafePropertyFetch(Expr\NullsafePropertyFetch $node) {
        return $this->pDereferenceLhs($node->var) . '?->' . $this->pObjectProperty($node->name);
    }

    protected function pExpr_StaticPropertyFetch(Expr\StaticPropertyFetch $node) {
        return $this->pStaticDereferenceLhs($node->class) . '::$' . $this->pObjectProperty($node->name);
    }

    protected function pExpr_ShellExec(Expr\ShellExec $node) {
        return '`' . $this->pEncapsList($node->parts, '`') . '`';
    }

    protected function pExpr_Closure(Expr\Closure $node) {
        return $this->pAttrGroups($node->attrGroups, true)
             . ($node->static ? 'static ' : '')
             . 'function ' . ($node->byRef ? '&' : '')
             . '(' . $this->pCommaSeparated($node->params) . ')'
             . (!empty($node->uses) ? ' use(' . $this->pCommaSeparated($node->uses) . ')' : '')
             . (null !== $node->returnType ? ' : ' . $this->p($node->returnType) : '')
             . ' {' . $this->pStmts($node->stmts) . $this->nl . '}';
    }

    protected function pExpr_Match(Expr\Match_ $node) {
        return 'match (' . $this->p($node->cond) . ') {'
            . $this->pCommaSeparatedMultiline($node->arms, true)
            . $this->nl
            . '}';
    }

    protected function pMatchArm(Node\MatchArm $node) {
        return ($node->conds ? $this->pCommaSeparated($node->conds) : 'default')
            . ' => ' . $this->p($node->body);
    }

    protected function pExpr_ArrowFunction(Expr\ArrowFunction $node) {
        return $this->pAttrGroups($node->attrGroups, true)
            . ($node->static ? 'static ' : '')
            . 'fn' . ($node->byRef ? '&' : '')
            . '(' . $this->pCommaSeparated($node->params) . ')'
            . (null !== $node->returnType ? ': ' . $this->p($node->returnType) : '')
            . ' => '
            . $this->p($node->expr);
    }

    protected function pExpr_ClosureUse(Expr\ClosureUse $node) {
        return ($node->byRef ? '&' : '') . $this->p($node->var);
    }

    protected function pExpr_New(Expr\New_ $node) {
        if ($node->class instanceof Stmt\Class_) {
            $args = $node->args ? '(' . $this->pMaybeMultiline($node->args) . ')' : '';
            return 'new ' . $this->pClassCommon($node->class, $args);
        }
        return 'new ' . $this->pNewVariable($node->class)
            . '(' . $this->pMaybeMultiline($node->args) . ')';
    }

    protected function pExpr_Clone(Expr\Clone_ $node) {
        return 'clone ' . $this->p($node->expr);
    }

    protected function pExpr_Ternary(Expr\Ternary $node) {
        // a bit of cheating: we treat the ternary as a binary op where the ?...: part is the operator.
        // this is okay because the part between ? and : never needs parentheses.
        return $this->pInfixOp(Expr\Ternary::class,
            $node->cond, ' ?' . (null !== $node->if ? ' ' . $this->p($node->if) . ' ' : '') . ': ', $node->else
        );
    }

    protected function pExpr_Exit(Expr\Exit_ $node) {
        $kind = $node->getAttribute('kind', Expr\Exit_::KIND_DIE);
        return ($kind === Expr\Exit_::KIND_EXIT ? 'exit' : 'die')
             . (null !== $node->expr ? '(' . $this->p($node->expr) . ')' : '');
    }

    protected function pExpr_Throw(Expr\Throw_ $node) {
        return 'throw ' . $this->p($node->expr);
    }

    protected function pExpr_Yield(Expr\Yield_ $node) {
        if ($node->value === null) {
            return 'yield';
        } else {
            // this is a bit ugly, but currently there is no way to detect whether the parentheses are necessary
            return '(yield '
                 . ($node->key !== null ? $this->p($node->key) . ' => ' : '')
                 . $this->p($node->value)
                 . ')';
        }
    }

    // Declarations

    protected function pStmt_Namespace(Stmt\Namespace_ $node) {
        if ($this->canUseSemicolonNamespaces) {
            return 'namespace ' . $this->p($node->name) . ';'
                 . $this->nl . $this->pStmts($node->stmts, false);
        } else {
            return 'namespace' . (null !== $node->name ? ' ' . $this->p($node->name) : '')
                 . ' {' . $this->pStmts($node->stmts) . $this->nl . '}';
        }
    }

    protected function pStmt_Use(Stmt\Use_ $node) {
        return 'use ' . $this->pUseType($node->type)
             . $this->pCommaSeparated($node->uses) . ';';
    }

    protected function pStmt_GroupUse(Stmt\GroupUse $node) {
        return 'use ' . $this->pUseType($node->type) . $this->pName($node->prefix)
             . '\{' . $this->pCommaSeparated($node->uses) . '};';
    }

    protected function pStmt_UseUse(Stmt\UseUse $node) {
        return $this->pUseType($node->type) . $this->p($node->name)
             . (null !== $node->alias ? ' as ' . $node->alias : '');
    }

    protected function pUseType($type) {
        return $type === Stmt\Use_::TYPE_FUNCTION ? 'function '
            : ($type === Stmt\Use_::TYPE_CONSTANT ? 'const ' : '');
    }

    protected function pStmt_Interface(Stmt\Interface_ $node) {
        return $this->pAttrGroups($node->attrGroups)
             . 'interface ' . $node->name
             . (!empty($node->extends) ? ' extends ' . $this->pCommaSeparated($node->extends) : '')
             . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}';
    }

    protected function pStmt_Enum(Stmt\Enum_ $node) {
        return $this->pAttrGroups($node->attrGroups)
             . 'enum ' . $node->name
             . ($node->scalarType ? " : $node->scalarType" : '')
             . (!empty($node->implements) ? ' implements ' . $this->pCommaSeparated($node->implements) : '')
             . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}';
    }

    protected function pStmt_Class(Stmt\Class_ $node) {
        return $this->pClassCommon($node, ' ' . $node->name);
    }

    protected function pStmt_Trait(Stmt\Trait_ $node) {
        return $this->pAttrGroups($node->attrGroups)
             . 'trait ' . $node->name
             . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}';
    }

    protected function pStmt_EnumCase(Stmt\EnumCase $node) {
        return $this->pAttrGroups($node->attrGroups)
             . 'case ' . $node->name
             . ($node->expr ? ' = ' . $this->p($node->expr) : '')
             . ';';
    }

    protected function pStmt_TraitUse(Stmt\TraitUse $node) {
        return 'use ' . $this->pCommaSeparated($node->traits)
             . (empty($node->adaptations)
                ? ';'
                : ' {' . $this->pStmts($node->adaptations) . $this->nl . '}');
    }

    protected function pStmt_TraitUseAdaptation_Precedence(Stmt\TraitUseAdaptation\Precedence $node) {
        return $this->p($node->trait) . '::' . $node->method
             . ' insteadof ' . $this->pCommaSeparated($node->insteadof) . ';';
    }

    protected function pStmt_TraitUseAdaptation_Alias(Stmt\TraitUseAdaptation\Alias $node) {
        return (null !== $node->trait ? $this->p($node->trait) . '::' : '')
             . $node->method . ' as'
             . (null !== $node->newModifier ? ' ' . rtrim($this->pModifiers($node->newModifier), ' ') : '')
             . (null !== $node->newName     ? ' ' . $node->newName                        : '')
             . ';';
    }

    protected function pStmt_Property(Stmt\Property $node) {
        return $this->pAttrGroups($node->attrGroups)
            . (0 === $node->flags ? 'var ' : $this->pModifiers($node->flags))
            . ($node->type ? $this->p($node->type) . ' ' : '')
            . $this->pCommaSeparated($node->props) . ';';
    }

    protected function pStmt_PropertyProperty(Stmt\PropertyProperty $node) {
        return '$' . $node->name
             . (null !== $node->default ? ' = ' . $this->p($node->default) : '');
    }

    protected function pStmt_ClassMethod(Stmt\ClassMethod $node) {
        return $this->pAttrGroups($node->attrGroups)
             . $this->pModifiers($node->flags)
             . 'function ' . ($node->byRef ? '&' : '') . $node->name
             . '(' . $this->pMaybeMultiline($node->params) . ')'
             . (null !== $node->returnType ? ' : ' . $this->p($node->returnType) : '')
             . (null !== $node->stmts
                ? $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}'
                : ';');
    }

    protected function pStmt_ClassConst(Stmt\ClassConst $node) {
        return $this->pAttrGroups($node->attrGroups)
             . $this->pModifiers($node->flags)
             . 'const '
             . (null !== $node->type ? $this->p($node->type) . ' ' : '')
             . $this->pCommaSeparated($node->consts) . ';';
    }

    protected function pStmt_Function(Stmt\Function_ $node) {
        return $this->pAttrGroups($node->attrGroups)
             . 'function ' . ($node->byRef ? '&' : '') . $node->name
             . '(' . $this->pCommaSeparated($node->params) . ')'
             . (null !== $node->returnType ? ' : ' . $this->p($node->returnType) : '')
             . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}';
    }

    protected function pStmt_Const(Stmt\Const_ $node) {
        return 'const ' . $this->pCommaSeparated($node->consts) . ';';
    }

    protected function pStmt_Declare(Stmt\Declare_ $node) {
        return 'declare (' . $this->pCommaSeparated($node->declares) . ')'
             . (null !== $node->stmts ? ' {' . $this->pStmts($node->stmts) . $this->nl . '}' : ';');
    }

    protected function pStmt_DeclareDeclare(Stmt\DeclareDeclare $node) {
        return $node->key . '=' . $this->p($node->value);
    }

    // Control flow

    protected function pStmt_If(Stmt\If_ $node) {
        return 'if (' . $this->p($node->cond) . ') {'
             . $this->pStmts($node->stmts) . $this->nl . '}'
             . ($node->elseifs ? ' ' . $this->pImplode($node->elseifs, ' ') : '')
             . (null !== $node->else ? ' ' . $this->p($node->else) : '');
    }

    protected function pStmt_ElseIf(Stmt\ElseIf_ $node) {
        return 'elseif (' . $this->p($node->cond) . ') {'
             . $this->pStmts($node->stmts) . $this->nl . '}';
    }

    protected function pStmt_Else(Stmt\Else_ $node) {
        return 'else {' . $this->pStmts($node->stmts) . $this->nl . '}';
    }

    protected function pStmt_For(Stmt\For_ $node) {
        return 'for ('
             . $this->pCommaSeparated($node->init) . ';' . (!empty($node->cond) ? ' ' : '')
             . $this->pCommaSeparated($node->cond) . ';' . (!empty($node->loop) ? ' ' : '')
             . $this->pCommaSeparated($node->loop)
             . ') {' . $this->pStmts($node->stmts) . $this->nl . '}';
    }

    protected function pStmt_Foreach(Stmt\Foreach_ $node) {
        return 'foreach (' . $this->p($node->expr) . ' as '
             . (null !== $node->keyVar ? $this->p($node->keyVar) . ' => ' : '')
             . ($node->byRef ? '&' : '') . $this->p($node->valueVar) . ') {'
             . $this->pStmts($node->stmts) . $this->nl . '}';
    }

    protected function pStmt_While(Stmt\While_ $node) {
        return 'while (' . $this->p($node->cond) . ') {'
             . $this->pStmts($node->stmts) . $this->nl . '}';
    }

    protected function pStmt_Do(Stmt\Do_ $node) {
        return 'do {' . $this->pStmts($node->stmts) . $this->nl
             . '} while (' . $this->p($node->cond) . ');';
    }

    protected function pStmt_Switch(Stmt\Switch_ $node) {
        return 'switch (' . $this->p($node->cond) . ') {'
             . $this->pStmts($node->cases) . $this->nl . '}';
    }

    protected function pStmt_Case(Stmt\Case_ $node) {
        return (null !== $node->cond ? 'case ' . $this->p($node->cond) : 'default') . ':'
             . $this->pStmts($node->stmts);
    }

    protected function pStmt_TryCatch(Stmt\TryCatch $node) {
        return 'try {' . $this->pStmts($node->stmts) . $this->nl . '}'
             . ($node->catches ? ' ' . $this->pImplode($node->catches, ' ') : '')
             . ($node->finally !== null ? ' ' . $this->p($node->finally) : '');
    }

    protected function pStmt_Catch(Stmt\Catch_ $node) {
        return 'catch (' . $this->pImplode($node->types, '|')
             . ($node->var !== null ? ' ' . $this->p($node->var) : '')
             . ') {' . $this->pStmts($node->stmts) . $this->nl . '}';
    }

    protected function pStmt_Finally(Stmt\Finally_ $node) {
        return 'finally {' . $this->pStmts($node->stmts) . $this->nl . '}';
    }

    protected function pStmt_Break(Stmt\Break_ $node) {
        return 'break' . ($node->num !== null ? ' ' . $this->p($node->num) : '') . ';';
    }

    protected function pStmt_Continue(Stmt\Continue_ $node) {
        return 'continue' . ($node->num !== null ? ' ' . $this->p($node->num) : '') . ';';
    }

    protected function pStmt_Return(Stmt\Return_ $node) {
        return 'return' . (null !== $node->expr ? ' ' . $this->p($node->expr) : '') . ';';
    }

    protected function pStmt_Throw(Stmt\Throw_ $node) {
        return 'throw ' . $this->p($node->expr) . ';';
    }

    protected function pStmt_Label(Stmt\Label $node) {
        return $node->name . ':';
    }

    protected function pStmt_Goto(Stmt\Goto_ $node) {
        return 'goto ' . $node->name . ';';
    }

    // Other

    protected function pStmt_Expression(Stmt\Expression $node) {
        return $this->p($node->expr) . ';';
    }

    protected function pStmt_Echo(Stmt\Echo_ $node) {
        return 'echo ' . $this->pCommaSeparated($node->exprs) . ';';
    }

    protected function pStmt_Static(Stmt\Static_ $node) {
        return 'static ' . $this->pCommaSeparated($node->vars) . ';';
    }

    protected function pStmt_Global(Stmt\Global_ $node) {
        return 'global ' . $this->pCommaSeparated($node->vars) . ';';
    }

    protected function pStmt_StaticVar(Stmt\StaticVar $node) {
        return $this->p($node->var)
             . (null !== $node->default ? ' = ' . $this->p($node->default) : '');
    }

    protected function pStmt_Unset(Stmt\Unset_ $node) {
        return 'unset(' . $this->pCommaSeparated($node->vars) . ');';
    }

    protected function pStmt_InlineHTML(Stmt\InlineHTML $node) {
        $newline = $node->getAttribute('hasLeadingNewline', true) ? "\n" : '';
        return '?>' . $newline . $node->value . '<?php ';
    }

    protected function pStmt_HaltCompiler(Stmt\HaltCompiler $node) {
        return '__halt_compiler();' . $node->remaining;
    }

    protected function pStmt_Nop(Stmt\Nop $node) {
        return '';
    }

    // Helpers

    protected function pClassCommon(Stmt\Class_ $node, $afterClassToken) {
        return $this->pAttrGroups($node->attrGroups, $node->name === null)
            . $this->pModifiers($node->flags)
            . 'class' . $afterClassToken
            . (null !== $node->extends ? ' extends ' . $this->p($node->extends) : '')
            . (!empty($node->implements) ? ' implements ' . $this->pCommaSeparated($node->implements) : '')
            . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}';
    }

    protected function pObjectProperty($node) {
        if ($node instanceof Expr) {
            return '{' . $this->p($node) . '}';
        } else {
            return $node;
        }
    }

    protected function pEncapsList(array $encapsList, $quote) {
        $return = '';
        foreach ($encapsList as $element) {
            if ($element instanceof Scalar\EncapsedStringPart) {
                $return .= $this->escapeString($element->value, $quote);
            } else {
                $return .= '{' . $this->p($element) . '}';
            }
        }

        return $return;
    }

    protected function pSingleQuotedString(string $string) {
        return '\'' . addcslashes($string, '\'\\') . '\'';
    }

    protected function escapeString($string, $quote) {
        if (null === $quote) {
            // For doc strings, don't escape newlines
            $escaped = addcslashes($string, "\t\f\v$\\");
        } else {
            $escaped = addcslashes($string, "\n\r\t\f\v$" . $quote . "\\");
        }

        // Escape control characters and non-UTF-8 characters.
        // Regex based on https://stackoverflow.com/a/11709412/385378.
        $regex = '/(
              [\x00-\x08\x0E-\x1F] # Control characters
            | [\xC0-\xC1] # Invalid UTF-8 Bytes
            | [\xF5-\xFF] # Invalid UTF-8 Bytes
            | \xE0(?=[\x80-\x9F]) # Overlong encoding of prior code point
            | \xF0(?=[\x80-\x8F]) # Overlong encoding of prior code point
            | [\xC2-\xDF](?![\x80-\xBF]) # Invalid UTF-8 Sequence Start
            | [\xE0-\xEF](?![\x80-\xBF]{2}) # Invalid UTF-8 Sequence Start
            | [\xF0-\xF4](?![\x80-\xBF]{3}) # Invalid UTF-8 Sequence Start
            | (?<=[\x00-\x7F\xF5-\xFF])[\x80-\xBF] # Invalid UTF-8 Sequence Middle
            | (?<![\xC2-\xDF]|[\xE0-\xEF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4]|[\xF0-\xF4][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF]{2})[\x80-\xBF] # Overlong Sequence
            | (?<=[\xE0-\xEF])[\x80-\xBF](?![\x80-\xBF]) # Short 3 byte sequence
            | (?<=[\xF0-\xF4])[\x80-\xBF](?![\x80-\xBF]{2}) # Short 4 byte sequence
            | (?<=[\xF0-\xF4][\x80-\xBF])[\x80-\xBF](?![\x80-\xBF]) # Short 4 byte sequence (2)
        )/x';
        return preg_replace_callback($regex, function ($matches) {
            assert(strlen($matches[0]) === 1);
            $hex = dechex(ord($matches[0]));;
            return '\\x' . str_pad($hex, 2, '0', \STR_PAD_LEFT);
        }, $escaped);
    }

    protected function containsEndLabel($string, $label, $atStart = true, $atEnd = true) {
        $start = $atStart ? '(?:^|[\r\n])' : '[\r\n]';
        $end = $atEnd ? '(?:$|[;\r\n])' : '[;\r\n]';
        return false !== strpos($string, $label)
            && preg_match('/' . $start . $label . $end . '/', $string);
    }

    protected function encapsedContainsEndLabel(array $parts, $label) {
        foreach ($parts as $i => $part) {
            $atStart = $i === 0;
            $atEnd = $i === count($parts) - 1;
            if ($part instanceof Scalar\EncapsedStringPart
                && $this->containsEndLabel($part->value, $label, $atStart, $atEnd)
            ) {
                return true;
            }
        }
        return false;
    }

    protected function pDereferenceLhs(Node $node) {
        if (!$this->dereferenceLhsRequiresParens($node)) {
            return $this->p($node);
        } else  {
            return '(' . $this->p($node) . ')';
        }
    }

    protected function pStaticDereferenceLhs(Node $node) {
        if (!$this->staticDereferenceLhsRequiresParens($node)) {
            return $this->p($node);
        } else {
            return '(' . $this->p($node) . ')';
        }
    }

    protected function pCallLhs(Node $node) {
        if (!$this->callLhsRequiresParens($node)) {
            return $this->p($node);
        } else  {
            return '(' . $this->p($node) . ')';
        }
    }

    protected function pNewVariable(Node $node): string {
        if (!$this->newOperandRequiresParens($node)) {
            return $this->p($node);
        } else {
            return '(' . $this->p($node) . ')';
        }
    }

    /**
     * @param Node[] $nodes
     * @return bool
     */
    protected function hasNodeWithComments(array $nodes) {
        foreach ($nodes as $node) {
            if ($node && $node->getComments()) {
                return true;
            }
        }
        return false;
    }

    protected function pMaybeMultiline(array $nodes, bool $trailingComma = false) {
        if (!$this->hasNodeWithComments($nodes)) {
            return $this->pCommaSeparated($nodes);
        } else {
            return $this->pCommaSeparatedMultiline($nodes, $trailingComma) . $this->nl;
        }
    }

    protected function pAttrGroups(array $nodes, bool $inline = false): string {
        $result = '';
        $sep = $inline ? ' ' : $this->nl;
        foreach ($nodes as $node) {
            $result .= $this->p($node) . $sep;
        }

        return $result;
    }
}
<?php declare(strict_types=1);

namespace PhpParser;

use PhpParser\Internal\DiffElem;
use PhpParser\Internal\PrintableNewAnonClassNode;
use PhpParser\Internal\TokenStream;
use PhpParser\Node\Expr;
use PhpParser\Node\Expr\AssignOp;
use PhpParser\Node\Expr\BinaryOp;
use PhpParser\Node\Expr\Cast;
use PhpParser\Node\Scalar;
use PhpParser\Node\Stmt;

abstract class PrettyPrinterAbstract
{
    const FIXUP_PREC_LEFT       = 0; // LHS operand affected by precedence
    const FIXUP_PREC_RIGHT      = 1; // RHS operand affected by precedence
    const FIXUP_CALL_LHS        = 2; // LHS of call
    const FIXUP_DEREF_LHS       = 3; // LHS of dereferencing operation
    const FIXUP_BRACED_NAME     = 4; // Name operand that may require bracing
    const FIXUP_VAR_BRACED_NAME = 5; // Name operand that may require ${} bracing
    const FIXUP_ENCAPSED        = 6; // Encapsed string part
    const FIXUP_NEW             = 7; // New/instanceof operand
    const FIXUP_STATIC_DEREF_LHS = 8; // LHS of static dereferencing operation

    protected $precedenceMap = [
        // [precedence, associativity]
        // where for precedence -1 is %left, 0 is %nonassoc and 1 is %right
        BinaryOp\Pow::class            => [  0,  1],
        Expr\BitwiseNot::class         => [ 10,  1],
        Expr\PreInc::class             => [ 10,  1],
        Expr\PreDec::class             => [ 10,  1],
        Expr\PostInc::class            => [ 10, -1],
        Expr\PostDec::class            => [ 10, -1],
        Expr\UnaryPlus::class          => [ 10,  1],
        Expr\UnaryMinus::class         => [ 10,  1],
        Cast\Int_::class               => [ 10,  1],
        Cast\Double::class             => [ 10,  1],
        Cast\String_::class            => [ 10,  1],
        Cast\Array_::class             => [ 10,  1],
        Cast\Object_::class            => [ 10,  1],
        Cast\Bool_::class              => [ 10,  1],
        Cast\Unset_::class             => [ 10,  1],
        Expr\ErrorSuppress::class      => [ 10,  1],
        Expr\Instanceof_::class        => [ 20,  0],
        Expr\BooleanNot::class         => [ 30,  1],
        BinaryOp\Mul::class            => [ 40, -1],
        BinaryOp\Div::class            => [ 40, -1],
        BinaryOp\Mod::class            => [ 40, -1],
        BinaryOp\Plus::class           => [ 50, -1],
        BinaryOp\Minus::class          => [ 50, -1],
        BinaryOp\Concat::class         => [ 50, -1],
        BinaryOp\ShiftLeft::class      => [ 60, -1],
        BinaryOp\ShiftRight::class     => [ 60, -1],
        BinaryOp\Smaller::class        => [ 70,  0],
        BinaryOp\SmallerOrEqual::class => [ 70,  0],
        BinaryOp\Greater::class        => [ 70,  0],
        BinaryOp\GreaterOrEqual::class => [ 70,  0],
        BinaryOp\Equal::class          => [ 80,  0],
        BinaryOp\NotEqual::class       => [ 80,  0],
        BinaryOp\Identical::class      => [ 80,  0],
        BinaryOp\NotIdentical::class   => [ 80,  0],
        BinaryOp\Spaceship::class      => [ 80,  0],
        BinaryOp\BitwiseAnd::class     => [ 90, -1],
        BinaryOp\BitwiseXor::class     => [100, -1],
        BinaryOp\BitwiseOr::class      => [110, -1],
        BinaryOp\BooleanAnd::class     => [120, -1],
        BinaryOp\BooleanOr::class      => [130, -1],
        BinaryOp\Coalesce::class       => [140,  1],
        Expr\Ternary::class            => [150,  0],
        // parser uses %left for assignments, but they really behave as %right
        Expr\Assign::class             => [160,  1],
        Expr\AssignRef::class          => [160,  1],
        AssignOp\Plus::class           => [160,  1],
        AssignOp\Minus::class          => [160,  1],
        AssignOp\Mul::class            => [160,  1],
        AssignOp\Div::class            => [160,  1],
        AssignOp\Concat::class         => [160,  1],
        AssignOp\Mod::class            => [160,  1],
        AssignOp\BitwiseAnd::class     => [160,  1],
        AssignOp\BitwiseOr::class      => [160,  1],
        AssignOp\BitwiseXor::class     => [160,  1],
        AssignOp\ShiftLeft::class      => [160,  1],
        AssignOp\ShiftRight::class     => [160,  1],
        AssignOp\Pow::class            => [160,  1],
        AssignOp\Coalesce::class       => [160,  1],
        Expr\YieldFrom::class          => [165,  1],
        Expr\Print_::class             => [168,  1],
        BinaryOp\LogicalAnd::class     => [170, -1],
        BinaryOp\LogicalXor::class     => [180, -1],
        BinaryOp\LogicalOr::class      => [190, -1],
        Expr\Include_::class           => [200, -1],
    ];

    /** @var int Current indentation level. */
    protected $indentLevel;
    /** @var string Newline including current indentation. */
    protected $nl;
    /** @var string Token placed at end of doc string to ensure it is followed by a newline. */
    protected $docStringEndToken;
    /** @var bool Whether semicolon namespaces can be used (i.e. no global namespace is used) */
    protected $canUseSemicolonNamespaces;
    /** @var array Pretty printer options */
    protected $options;

    /** @var TokenStream Original tokens for use in format-preserving pretty print */
    protected $origTokens;
    /** @var Internal\Differ Differ for node lists */
    protected $nodeListDiffer;
    /** @var bool[] Map determining whether a certain character is a label character */
    protected $labelCharMap;
    /**
     * @var int[][] Map from token classes and subnode names to FIXUP_* constants. This is used
     *              during format-preserving prints to place additional parens/braces if necessary.
     */
    protected $fixupMap;
    /**
     * @var int[][] Map from "{$node->getType()}->{$subNode}" to ['left' => $l, 'right' => $r],
     *              where $l and $r specify the token type that needs to be stripped when removing
     *              this node.
     */
    protected $removalMap;
    /**
     * @var mixed[] Map from "{$node->getType()}->{$subNode}" to [$find, $beforeToken, $extraLeft, $extraRight].
     *              $find is an optional token after which the insertion occurs. $extraLeft/Right
     *              are optionally added before/after the main insertions.
     */
    protected $insertionMap;
    /**
     * @var string[] Map From "{$node->getType()}->{$subNode}" to string that should be inserted
     *               between elements of this list subnode.
     */
    protected $listInsertionMap;
    protected $emptyListInsertionMap;
    /** @var int[] Map from "{$node->getType()}->{$subNode}" to token before which the modifiers
     *             should be reprinted. */
    protected $modifierChangeMap;

    /**
     * Creates a pretty printer instance using the given options.
     *
     * Supported options:
     *  * bool $shortArraySyntax = false: Whether to use [] instead of array() as the default array
     *                                    syntax, if the node does not specify a format.
     *
     * @param array $options Dictionary of formatting options
     */
    public function __construct(array $options = []) {
        $this->docStringEndToken = '_DOC_STRING_END_' . mt_rand();

        $defaultOptions = ['shortArraySyntax' => false];
        $this->options = $options + $defaultOptions;
    }

    /**
     * Reset pretty printing state.
     */
    protected function resetState() {
        $this->indentLevel = 0;
        $this->nl = "\n";
        $this->origTokens = null;
    }

    /**
     * Set indentation level
     *
     * @param int $level Level in number of spaces
     */
    protected function setIndentLevel(int $level) {
        $this->indentLevel = $level;
        $this->nl = "\n" . \str_repeat(' ', $level);
    }

    /**
     * Increase indentation level.
     */
    protected function indent() {
        $this->indentLevel += 4;
        $this->nl .= '    ';
    }

    /**
     * Decrease indentation level.
     */
    protected function outdent() {
        assert($this->indentLevel >= 4);
        $this->indentLevel -= 4;
        $this->nl = "\n" . str_repeat(' ', $this->indentLevel);
    }

    /**
     * Pretty prints an array of statements.
     *
     * @param Node[] $stmts Array of statements
     *
     * @return string Pretty printed statements
     */
    public function prettyPrint(array $stmts) : string {
        $this->resetState();
        $this->preprocessNodes($stmts);

        return ltrim($this->handleMagicTokens($this->pStmts($stmts, false)));
    }

    /**
     * Pretty prints an expression.
     *
     * @param Expr $node Expression node
     *
     * @return string Pretty printed node
     */
    public function prettyPrintExpr(Expr $node) : string {
        $this->resetState();
        return $this->handleMagicTokens($this->p($node));
    }

    /**
     * Pretty prints a file of statements (includes the opening <?php tag if it is required).
     *
     * @param Node[] $stmts Array of statements
     *
     * @return string Pretty printed statements
     */
    public function prettyPrintFile(array $stmts) : string {
        if (!$stmts) {
            return "<?php\n\n";
        }

        $p = "<?php\n\n" . $this->prettyPrint($stmts);

        if ($stmts[0] instanceof Stmt\InlineHTML) {
            $p = preg_replace('/^<\?php\s+\?>\n?/', '', $p);
        }
        if ($stmts[count($stmts) - 1] instanceof Stmt\InlineHTML) {
            $p = preg_replace('/<\?php$/', '', rtrim($p));
        }

        return $p;
    }

    /**
     * Preprocesses the top-level nodes to initialize pretty printer state.
     *
     * @param Node[] $nodes Array of nodes
     */
    protected function preprocessNodes(array $nodes) {
        /* We can use semicolon-namespaces unless there is a global namespace declaration */
        $this->canUseSemicolonNamespaces = true;
        foreach ($nodes as $node) {
            if ($node instanceof Stmt\Namespace_ && null === $node->name) {
                $this->canUseSemicolonNamespaces = false;
                break;
            }
        }
    }

    /**
     * Handles (and removes) no-indent and doc-string-end tokens.
     *
     * @param string $str
     * @return string
     */
    protected function handleMagicTokens(string $str) : string {
        // Replace doc-string-end tokens with nothing or a newline
        $str = str_replace($this->docStringEndToken . ";\n", ";\n", $str);
        $str = str_replace($this->docStringEndToken, "\n", $str);

        return $str;
    }

    /**
     * Pretty prints an array of nodes (statements) and indents them optionally.
     *
     * @param Node[] $nodes  Array of nodes
     * @param bool   $indent Whether to indent the printed nodes
     *
     * @return string Pretty printed statements
     */
    protected function pStmts(array $nodes, bool $indent = true) : string {
        if ($indent) {
            $this->indent();
        }

        $result = '';
        foreach ($nodes as $node) {
            $comments = $node->getComments();
            if ($comments) {
                $result .= $this->nl . $this->pComments($comments);
                if ($node instanceof Stmt\Nop) {
                    continue;
                }
            }

            $result .= $this->nl . $this->p($node);
        }

        if ($indent) {
            $this->outdent();
        }

        return $result;
    }

    /**
     * Pretty-print an infix operation while taking precedence into account.
     *
     * @param string $class          Node class of operator
     * @param Node   $leftNode       Left-hand side node
     * @param string $operatorString String representation of the operator
     * @param Node   $rightNode      Right-hand side node
     *
     * @return string Pretty printed infix operation
     */
    protected function pInfixOp(string $class, Node $leftNode, string $operatorString, Node $rightNode) : string {
        list($precedence, $associativity) = $this->precedenceMap[$class];

        return $this->pPrec($leftNode, $precedence, $associativity, -1)
             . $operatorString
             . $this->pPrec($rightNode, $precedence, $associativity, 1);
    }

    /**
     * Pretty-print a prefix operation while taking precedence into account.
     *
     * @param string $class          Node class of operator
     * @param string $operatorString String representation of the operator
     * @param Node   $node           Node
     *
     * @return string Pretty printed prefix operation
     */
    protected function pPrefixOp(string $class, string $operatorString, Node $node) : string {
        list($precedence, $associativity) = $this->precedenceMap[$class];
        return $operatorString . $this->pPrec($node, $precedence, $associativity, 1);
    }

    /**
     * Pretty-print a postfix operation while taking precedence into account.
     *
     * @param string $class          Node class of operator
     * @param string $operatorString String representation of the operator
     * @param Node   $node           Node
     *
     * @return string Pretty printed postfix operation
     */
    protected function pPostfixOp(string $class, Node $node, string $operatorString) : string {
        list($precedence, $associativity) = $this->precedenceMap[$class];
        return $this->pPrec($node, $precedence, $associativity, -1) . $operatorString;
    }

    /**
     * Prints an expression node with the least amount of parentheses necessary to preserve the meaning.
     *
     * @param Node $node                Node to pretty print
     * @param int  $parentPrecedence    Precedence of the parent operator
     * @param int  $parentAssociativity Associativity of parent operator
     *                                  (-1 is left, 0 is nonassoc, 1 is right)
     * @param int  $childPosition       Position of the node relative to the operator
     *                                  (-1 is left, 1 is right)
     *
     * @return string The pretty printed node
     */
    protected function pPrec(Node $node, int $parentPrecedence, int $parentAssociativity, int $childPosition) : string {
        $class = \get_class($node);
        if (isset($this->precedenceMap[$class])) {
            $childPrecedence = $this->precedenceMap[$class][0];
            if ($childPrecedence > $parentPrecedence
                || ($parentPrecedence === $childPrecedence && $parentAssociativity !== $childPosition)
            ) {
                return '(' . $this->p($node) . ')';
            }
        }

        return $this->p($node);
    }

    /**
     * Pretty prints an array of nodes and implodes the printed values.
     *
     * @param Node[] $nodes Array of Nodes to be printed
     * @param string $glue  Character to implode with
     *
     * @return string Imploded pretty printed nodes
     */
    protected function pImplode(array $nodes, string $glue = '') : string {
        $pNodes = [];
        foreach ($nodes as $node) {
            if (null === $node) {
                $pNodes[] = '';
            } else {
                $pNodes[] = $this->p($node);
            }
        }

        return implode($glue, $pNodes);
    }

    /**
     * Pretty prints an array of nodes and implodes the printed values with commas.
     *
     * @param Node[] $nodes Array of Nodes to be printed
     *
     * @return string Comma separated pretty printed nodes
     */
    protected function pCommaSeparated(array $nodes) : string {
        return $this->pImplode($nodes, ', ');
    }

    /**
     * Pretty prints a comma-separated list of nodes in multiline style, including comments.
     *
     * The result includes a leading newline and one level of indentation (same as pStmts).
     *
     * @param Node[] $nodes         Array of Nodes to be printed
     * @param bool   $trailingComma Whether to use a trailing comma
     *
     * @return string Comma separated pretty printed nodes in multiline style
     */
    protected function pCommaSeparatedMultiline(array $nodes, bool $trailingComma) : string {
        $this->indent();

        $result = '';
        $lastIdx = count($nodes) - 1;
        foreach ($nodes as $idx => $node) {
            if ($node !== null) {
                $comments = $node->getComments();
                if ($comments) {
                    $result .= $this->nl . $this->pComments($comments);
                }

                $result .= $this->nl . $this->p($node);
            } else {
                $result .= $this->nl;
            }
            if ($trailingComma || $idx !== $lastIdx) {
                $result .= ',';
            }
        }

        $this->outdent();
        return $result;
    }

    /**
     * Prints reformatted text of the passed comments.
     *
     * @param Comment[] $comments List of comments
     *
     * @return string Reformatted text of comments
     */
    protected function pComments(array $comments) : string {
        $formattedComments = [];

        foreach ($comments as $comment) {
            $formattedComments[] = str_replace("\n", $this->nl, $comment->getReformattedText());
        }

        return implode($this->nl, $formattedComments);
    }

    /**
     * Perform a format-preserving pretty print of an AST.
     *
     * The format preservation is best effort. For some changes to the AST the formatting will not
     * be preserved (at least not locally).
     *
     * In order to use this method a number of prerequisites must be satisfied:
     *  * The startTokenPos and endTokenPos attributes in the lexer must be enabled.
     *  * The CloningVisitor must be run on the AST prior to modification.
     *  * The original tokens must be provided, using the getTokens() method on the lexer.
     *
     * @param Node[] $stmts      Modified AST with links to original AST
     * @param Node[] $origStmts  Original AST with token offset information
     * @param array  $origTokens Tokens of the original code
     *
     * @return string
     */
    public function printFormatPreserving(array $stmts, array $origStmts, array $origTokens) : string {
        $this->initializeNodeListDiffer();
        $this->initializeLabelCharMap();
        $this->initializeFixupMap();
        $this->initializeRemovalMap();
        $this->initializeInsertionMap();
        $this->initializeListInsertionMap();
        $this->initializeEmptyListInsertionMap();
        $this->initializeModifierChangeMap();

        $this->resetState();
        $this->origTokens = new TokenStream($origTokens);

        $this->preprocessNodes($stmts);

        $pos = 0;
        $result = $this->pArray($stmts, $origStmts, $pos, 0, 'File', 'stmts', null);
        if (null !== $result) {
            $result .= $this->origTokens->getTokenCode($pos, count($origTokens), 0);
        } else {
            // Fallback
            // TODO Add <?php properly
            $result = "<?php\n" . $this->pStmts($stmts, false);
        }

        return ltrim($this->handleMagicTokens($result));
    }

    protected function pFallback(Node $node) {
        return $this->{'p' . $node->getType()}($node);
    }

    /**
     * Pretty prints a node.
     *
     * This method also handles formatting preservation for nodes.
     *
     * @param Node $node Node to be pretty printed
     * @param bool $parentFormatPreserved Whether parent node has preserved formatting
     *
     * @return string Pretty printed node
     */
    protected function p(Node $node, $parentFormatPreserved = false) : string {
        // No orig tokens means this is a normal pretty print without preservation of formatting
        if (!$this->origTokens) {
            return $this->{'p' . $node->getType()}($node);
        }

        /** @var Node $origNode */
        $origNode = $node->getAttribute('origNode');
        if (null === $origNode) {
            return $this->pFallback($node);
        }

        $class = \get_class($node);
        \assert($class === \get_class($origNode));

        $startPos = $origNode->getStartTokenPos();
        $endPos = $origNode->getEndTokenPos();
        \assert($startPos >= 0 && $endPos >= 0);

        $fallbackNode = $node;
        if ($node instanceof Expr\New_ && $node->class instanceof Stmt\Class_) {
            // Normalize node structure of anonymous classes
            $node = PrintableNewAnonClassNode::fromNewNode($node);
            $origNode = PrintableNewAnonClassNode::fromNewNode($origNode);
        }

        // InlineHTML node does not contain closing and opening PHP tags. If the parent formatting
        // is not preserved, then we need to use the fallback code to make sure the tags are
        // printed.
        if ($node instanceof Stmt\InlineHTML && !$parentFormatPreserved) {
            return $this->pFallback($fallbackNode);
        }

        $indentAdjustment = $this->indentLevel - $this->origTokens->getIndentationBefore($startPos);

        $type = $node->getType();
        $fixupInfo = $this->fixupMap[$class] ?? null;

        $result = '';
        $pos = $startPos;
        foreach ($node->getSubNodeNames() as $subNodeName) {
            $subNode = $node->$subNodeName;
            $origSubNode = $origNode->$subNodeName;

            if ((!$subNode instanceof Node && $subNode !== null)
                || (!$origSubNode instanceof Node && $origSubNode !== null)
            ) {
                if ($subNode === $origSubNode) {
                    // Unchanged, can reuse old code
                    continue;
                }

                if (is_array($subNode) && is_array($origSubNode)) {
                    // Array subnode changed, we might be able to reconstruct it
                    $listResult = $this->pArray(
                        $subNode, $origSubNode, $pos, $indentAdjustment, $type, $subNodeName,
                        $fixupInfo[$subNodeName] ?? null
                    );
                    if (null === $listResult) {
                        return $this->pFallback($fallbackNode);
                    }

                    $result .= $listResult;
                    continue;
                }

                if (is_int($subNode) && is_int($origSubNode)) {
                    // Check if this is a modifier change
                    $key = $type . '->' . $subNodeName;
                    if (!isset($this->modifierChangeMap[$key])) {
                        return $this->pFallback($fallbackNode);
                    }

                    $findToken = $this->modifierChangeMap[$key];
                    $result .= $this->pModifiers($subNode);
                    $pos = $this->origTokens->findRight($pos, $findToken);
                    continue;
                }

                // If a non-node, non-array subnode changed, we don't be able to do a partial
                // reconstructions, as we don't have enough offset information. Pretty print the
                // whole node instead.
                return $this->pFallback($fallbackNode);
            }

            $extraLeft = '';
            $extraRight = '';
            if ($origSubNode !== null) {
                $subStartPos = $origSubNode->getStartTokenPos();
                $subEndPos = $origSubNode->getEndTokenPos();
                \assert($subStartPos >= 0 && $subEndPos >= 0);
            } else {
                if ($subNode === null) {
                    // Both null, nothing to do
                    continue;
                }

                // A node has been inserted, check if we have insertion information for it
                $key = $type . '->' . $subNodeName;
                if (!isset($this->insertionMap[$key])) {
                    return $this->pFallback($fallbackNode);
                }

                list($findToken, $beforeToken, $extraLeft, $extraRight) = $this->insertionMap[$key];
                if (null !== $findToken) {
                    $subStartPos = $this->origTokens->findRight($pos, $findToken)
                        + (int) !$beforeToken;
                } else {
                    $subStartPos = $pos;
                }

                if (null === $extraLeft && null !== $extraRight) {
                    // If inserting on the right only, skipping whitespace looks better
                    $subStartPos = $this->origTokens->skipRightWhitespace($subStartPos);
                }
                $subEndPos = $subStartPos - 1;
            }

            if (null === $subNode) {
                // A node has been removed, check if we have removal information for it
                $key = $type . '->' . $subNodeName;
                if (!isset($this->removalMap[$key])) {
                    return $this->pFallback($fallbackNode);
                }

                // Adjust positions to account for additional tokens that must be skipped
                $removalInfo = $this->removalMap[$key];
                if (isset($removalInfo['left'])) {
                    $subStartPos = $this->origTokens->skipLeft($subStartPos - 1, $removalInfo['left']) + 1;
                }
                if (isset($removalInfo['right'])) {
                    $subEndPos = $this->origTokens->skipRight($subEndPos + 1, $removalInfo['right']) - 1;
                }
            }

            $result .= $this->origTokens->getTokenCode($pos, $subStartPos, $indentAdjustment);

            if (null !== $subNode) {
                $result .= $extraLeft;

                $origIndentLevel = $this->indentLevel;
                $this->setIndentLevel($this->origTokens->getIndentationBefore($subStartPos) + $indentAdjustment);

                // If it's the same node that was previously in this position, it certainly doesn't
                // need fixup. It's important to check this here, because our fixup checks are more
                // conservative than strictly necessary.
                if (isset($fixupInfo[$subNodeName])
                    && $subNode->getAttribute('origNode') !== $origSubNode
                ) {
                    $fixup = $fixupInfo[$subNodeName];
                    $res = $this->pFixup($fixup, $subNode, $class, $subStartPos, $subEndPos);
                } else {
                    $res = $this->p($subNode, true);
                }

                $this->safeAppend($result, $res);
                $this->setIndentLevel($origIndentLevel);

                $result .= $extraRight;
            }

            $pos = $subEndPos + 1;
        }

        $result .= $this->origTokens->getTokenCode($pos, $endPos + 1, $indentAdjustment);
        return $result;
    }

    /**
     * Perform a format-preserving pretty print of an array.
     *
     * @param array       $nodes            New nodes
     * @param array       $origNodes        Original nodes
     * @param int         $pos              Current token position (updated by reference)
     * @param int         $indentAdjustment Adjustment for indentation
     * @param string      $parentNodeType   Type of the containing node.
     * @param string      $subNodeName      Name of array subnode.
     * @param null|int    $fixup            Fixup information for array item nodes
     *
     * @return null|string Result of pretty print or null if cannot preserve formatting
     */
    protected function pArray(
        array $nodes, array $origNodes, int &$pos, int $indentAdjustment,
        string $parentNodeType, string $subNodeName, $fixup
    ) {
        $diff = $this->nodeListDiffer->diffWithReplacements($origNodes, $nodes);

        $mapKey = $parentNodeType . '->' . $subNodeName;
        $insertStr = $this->listInsertionMap[$mapKey] ?? null;
        $isStmtList = $subNodeName === 'stmts';

        $beforeFirstKeepOrReplace = true;
        $skipRemovedNode = false;
        $delayedAdd = [];
        $lastElemIndentLevel = $this->indentLevel;

        $insertNewline = false;
        if ($insertStr === "\n") {
            $insertStr = '';
            $insertNewline = true;
        }

        if ($isStmtList && \count($origNodes) === 1 && \count($nodes) !== 1) {
            $startPos = $origNodes[0]->getStartTokenPos();
            $endPos = $origNodes[0]->getEndTokenPos();
            \assert($startPos >= 0 && $endPos >= 0);
            if (!$this->origTokens->haveBraces($startPos, $endPos)) {
                // This was a single statement without braces, but either additional statements
                // have been added, or the single statement has been removed. This requires the
                // addition of braces. For now fall back.
                // TODO: Try to preserve formatting
                return null;
            }
        }

        $result = '';
        foreach ($diff as $i => $diffElem) {
            $diffType = $diffElem->type;
            /** @var Node|null $arrItem */
            $arrItem = $diffElem->new;
            /** @var Node|null $origArrItem */
            $origArrItem = $diffElem->old;

            if ($diffType === DiffElem::TYPE_KEEP || $diffType === DiffElem::TYPE_REPLACE) {
                $beforeFirstKeepOrReplace = false;

                if ($origArrItem === null || $arrItem === null) {
                    // We can only handle the case where both are null
                    if ($origArrItem === $arrItem) {
                        continue;
                    }
                    return null;
                }

                if (!$arrItem instanceof Node || !$origArrItem instanceof Node) {
                    // We can only deal with nodes. This can occur for Names, which use string arrays.
                    return null;
                }

                $itemStartPos = $origArrItem->getStartTokenPos();
                $itemEndPos = $origArrItem->getEndTokenPos();
                \assert($itemStartPos >= 0 && $itemEndPos >= 0 && $itemStartPos >= $pos);

                $origIndentLevel = $this->indentLevel;
                $lastElemIndentLevel = $this->origTokens->getIndentationBefore($itemStartPos) + $indentAdjustment;
                $this->setIndentLevel($lastElemIndentLevel);

                $comments = $arrItem->getComments();
                $origComments = $origArrItem->getComments();
                $commentStartPos = $origComments ? $origComments[0]->getStartTokenPos() : $itemStartPos;
                \assert($commentStartPos >= 0);

                if ($commentStartPos < $pos) {
                    // Comments may be assigned to multiple nodes if they start at the same position.
                    // Make sure we don't try to print them multiple times.
                    $commentStartPos = $itemStartPos;
                }

                if ($skipRemovedNode) {
                    if ($isStmtList && ($this->origTokens->haveBracesInRange($pos, $itemStartPos) ||
                                        $this->origTokens->haveTagInRange($pos, $itemStartPos))) {
                        // We'd remove the brace of a code block.
                        // TODO: Preserve formatting.
                        $this->setIndentLevel($origIndentLevel);
                        return null;
                    }
                } else {
                    $result .= $this->origTokens->getTokenCode(
                        $pos, $commentStartPos, $indentAdjustment);
                }

                if (!empty($delayedAdd)) {
                    /** @var Node $delayedAddNode */
                    foreach ($delayedAdd as $delayedAddNode) {
                        if ($insertNewline) {
                            $delayedAddComments = $delayedAddNode->getComments();
                            if ($delayedAddComments) {
                                $result .= $this->pComments($delayedAddComments) . $this->nl;
                            }
                        }

                        $this->safeAppend($result, $this->p($delayedAddNode, true));

                        if ($insertNewline) {
                            $result .= $insertStr . $this->nl;
                        } else {
                            $result .= $insertStr;
                        }
                    }

                    $delayedAdd = [];
                }

                if ($comments !== $origComments) {
                    if ($comments) {
                        $result .= $this->pComments($comments) . $this->nl;
                    }
                } else {
                    $result .= $this->origTokens->getTokenCode(
                        $commentStartPos, $itemStartPos, $indentAdjustment);
                }

                // If we had to remove anything, we have done so now.
                $skipRemovedNode = false;
            } elseif ($diffType === DiffElem::TYPE_ADD) {
                if (null === $insertStr) {
                    // We don't have insertion information for this list type
                    return null;
                }

                // We go multiline if the original code was multiline,
                // or if it's an array item with a comment above it.
                if ($insertStr === ', ' &&
                    ($this->isMultiline($origNodes) || $arrItem->getComments())
                ) {
                    $insertStr = ',';
                    $insertNewline = true;
                }

                if ($beforeFirstKeepOrReplace) {
                    // Will be inserted at the next "replace" or "keep" element
                    $delayedAdd[] = $arrItem;
                    continue;
                }

                $itemStartPos = $pos;
                $itemEndPos = $pos - 1;

                $origIndentLevel = $this->indentLevel;
                $this->setIndentLevel($lastElemIndentLevel);

                if ($insertNewline) {
                    $result .= $insertStr . $this->nl;
                    $comments = $arrItem->getComments();
                    if ($comments) {
                        $result .= $this->pComments($comments) . $this->nl;
                    }
                } else {
                    $result .= $insertStr;
                }
            } elseif ($diffType === DiffElem::TYPE_REMOVE) {
                if (!$origArrItem instanceof Node) {
                    // We only support removal for nodes
                    return null;
                }

                $itemStartPos = $origArrItem->getStartTokenPos();
                $itemEndPos = $origArrItem->getEndTokenPos();
                \assert($itemStartPos >= 0 && $itemEndPos >= 0);

                // Consider comments part of the node.
                $origComments = $origArrItem->getComments();
                if ($origComments) {
                    $itemStartPos = $origComments[0]->getStartTokenPos();
                }

                if ($i === 0) {
                    // If we're removing from the start, keep the tokens before the node and drop those after it,
                    // instead of the other way around.
                    $result .= $this->origTokens->getTokenCode(
                        $pos, $itemStartPos, $indentAdjustment);
                    $skipRemovedNode = true;
                } else {
                    if ($isStmtList && ($this->origTokens->haveBracesInRange($pos, $itemStartPos) ||
                                        $this->origTokens->haveTagInRange($pos, $itemStartPos))) {
                        // We'd remove the brace of a code block.
                        // TODO: Preserve formatting.
                        return null;
                    }
                }

                $pos = $itemEndPos + 1;
                continue;
            } else {
                throw new \Exception("Shouldn't happen");
            }

            if (null !== $fixup && $arrItem->getAttribute('origNode') !== $origArrItem) {
                $res = $this->pFixup($fixup, $arrItem, null, $itemStartPos, $itemEndPos);
            } else {
                $res = $this->p($arrItem, true);
            }
            $this->safeAppend($result, $res);

            $this->setIndentLevel($origIndentLevel);
            $pos = $itemEndPos + 1;
        }

        if ($skipRemovedNode) {
            // TODO: Support removing single node.
            return null;
        }

        if (!empty($delayedAdd)) {
            if (!isset($this->emptyListInsertionMap[$mapKey])) {
                return null;
            }

            list($findToken, $extraLeft, $extraRight) = $this->emptyListInsertionMap[$mapKey];
            if (null !== $findToken) {
                $insertPos = $this->origTokens->findRight($pos, $findToken) + 1;
                $result .= $this->origTokens->getTokenCode($pos, $insertPos, $indentAdjustment);
                $pos = $insertPos;
            }

            $first = true;
            $result .= $extraLeft;
            foreach ($delayedAdd as $delayedAddNode) {
                if (!$first) {
                    $result .= $insertStr;
                    if ($insertNewline) {
                        $result .= $this->nl;
                    }
                }
                $result .= $this->p($delayedAddNode, true);
                $first = false;
            }
            $result .= $extraRight === "\n" ? $this->nl : $extraRight;
        }

        return $result;
    }

    /**
     * Print node with fixups.
     *
     * Fixups here refer to the addition of extra parentheses, braces or other characters, that
     * are required to preserve program semantics in a certain context (e.g. to maintain precedence
     * or because only certain expressions are allowed in certain places).
     *
     * @param int         $fixup       Fixup type
     * @param Node        $subNode     Subnode to print
     * @param string|null $parentClass Class of parent node
     * @param int         $subStartPos Original start pos of subnode
     * @param int         $subEndPos   Original end pos of subnode
     *
     * @return string Result of fixed-up print of subnode
     */
    protected function pFixup(int $fixup, Node $subNode, $parentClass, int $subStartPos, int $subEndPos) : string {
        switch ($fixup) {
            case self::FIXUP_PREC_LEFT:
            case self::FIXUP_PREC_RIGHT:
                if (!$this->origTokens->haveParens($subStartPos, $subEndPos)) {
                    list($precedence, $associativity) = $this->precedenceMap[$parentClass];
                    return $this->pPrec($subNode, $precedence, $associativity,
                        $fixup === self::FIXUP_PREC_LEFT ? -1 : 1);
                }
                break;
            case self::FIXUP_CALL_LHS:
                if ($this->callLhsRequiresParens($subNode)
                    && !$this->origTokens->haveParens($subStartPos, $subEndPos)
                ) {
                    return '(' . $this->p($subNode) . ')';
                }
                break;
            case self::FIXUP_DEREF_LHS:
                if ($this->dereferenceLhsRequiresParens($subNode)
                    && !$this->origTokens->haveParens($subStartPos, $subEndPos)
                ) {
                    return '(' . $this->p($subNode) . ')';
                }
                break;
            case self::FIXUP_STATIC_DEREF_LHS:
                if ($this->staticDereferenceLhsRequiresParens($subNode)
                    && !$this->origTokens->haveParens($subStartPos, $subEndPos)
                ) {
                    return '(' . $this->p($subNode) . ')';
                }
                break;
            case self::FIXUP_NEW:
                if ($this->newOperandRequiresParens($subNode)
                    && !$this->origTokens->haveParens($subStartPos, $subEndPos)) {
                    return '(' . $this->p($subNode) . ')';
                }
                break;
            case self::FIXUP_BRACED_NAME:
            case self::FIXUP_VAR_BRACED_NAME:
                if ($subNode instanceof Expr
                    && !$this->origTokens->haveBraces($subStartPos, $subEndPos)
                ) {
                    return ($fixup === self::FIXUP_VAR_BRACED_NAME ? '$' : '')
                        . '{' . $this->p($subNode) . '}';
                }
                break;
            case self::FIXUP_ENCAPSED:
                if (!$subNode instanceof Scalar\EncapsedStringPart
                    && !$this->origTokens->haveBraces($subStartPos, $subEndPos)
                ) {
                    return '{' . $this->p($subNode) . '}';
                }
                break;
            default:
                throw new \Exception('Cannot happen');
        }

        // Nothing special to do
        return $this->p($subNode);
    }

    /**
     * Appends to a string, ensuring whitespace between label characters.
     *
     * Example: "echo" and "$x" result in "echo$x", but "echo" and "x" result in "echo x".
     * Without safeAppend the result would be "echox", which does not preserve semantics.
     *
     * @param string $str
     * @param string $append
     */
    protected function safeAppend(string &$str, string $append) {
        if ($str === "") {
            $str = $append;
            return;
        }

        if ($append === "") {
            return;
        }

        if (!$this->labelCharMap[$append[0]]
                || !$this->labelCharMap[$str[\strlen($str) - 1]]) {
            $str .= $append;
        } else {
            $str .= " " . $append;
        }
    }

    /**
     * Determines whether the LHS of a call must be wrapped in parenthesis.
     *
     * @param Node $node LHS of a call
     *
     * @return bool Whether parentheses are required
     */
    protected function callLhsRequiresParens(Node $node) : bool {
        return !($node instanceof Node\Name
            || $node instanceof Expr\Variable
            || $node instanceof Expr\ArrayDimFetch
            || $node instanceof Expr\FuncCall
            || $node instanceof Expr\MethodCall
            || $node instanceof Expr\NullsafeMethodCall
            || $node instanceof Expr\StaticCall
            || $node instanceof Expr\Array_);
    }

    /**
     * Determines whether the LHS of an array/object operation must be wrapped in parentheses.
     *
     * @param Node $node LHS of dereferencing operation
     *
     * @return bool Whether parentheses are required
     */
    protected function dereferenceLhsRequiresParens(Node $node) : bool {
        // A constant can occur on the LHS of an array/object deref, but not a static deref.
        return $this->staticDereferenceLhsRequiresParens($node)
            && !$node instanceof Expr\ConstFetch;
    }

    /**
     * Determines whether the LHS of a static operation must be wrapped in parentheses.
     *
     * @param Node $node LHS of dereferencing operation
     *
     * @return bool Whether parentheses are required
     */
    protected function staticDereferenceLhsRequiresParens(Node $node): bool {
        return !($node instanceof Expr\Variable
            || $node instanceof Node\Name
            || $node instanceof Expr\ArrayDimFetch
            || $node instanceof Expr\PropertyFetch
            || $node instanceof Expr\NullsafePropertyFetch
            || $node instanceof Expr\StaticPropertyFetch
            || $node instanceof Expr\FuncCall
            || $node instanceof Expr\MethodCall
            || $node instanceof Expr\NullsafeMethodCall
            || $node instanceof Expr\StaticCall
            || $node instanceof Expr\Array_
            || $node instanceof Scalar\String_
            || $node instanceof Expr\ClassConstFetch);
    }

    /**
     * Determines whether an expression used in "new" or "instanceof" requires parentheses.
     *
     * @param Node $node New or instanceof operand
     *
     * @return bool Whether parentheses are required
     */
    protected function newOperandRequiresParens(Node $node): bool {
        if ($node instanceof Node\Name || $node instanceof Expr\Variable) {
            return false;
        }
        if ($node instanceof Expr\ArrayDimFetch || $node instanceof Expr\PropertyFetch ||
            $node instanceof Expr\NullsafePropertyFetch
        ) {
            return $this->newOperandRequiresParens($node->var);
        }
        if ($node instanceof Expr\StaticPropertyFetch) {
            return $this->newOperandRequiresParens($node->class);
        }
        return true;
    }

    /**
     * Print modifiers, including trailing whitespace.
     *
     * @param int $modifiers Modifier mask to print
     *
     * @return string Printed modifiers
     */
    protected function pModifiers(int $modifiers) {
        return ($modifiers & Stmt\Class_::MODIFIER_PUBLIC    ? 'public '    : '')
             . ($modifiers & Stmt\Class_::MODIFIER_PROTECTED ? 'protected ' : '')
             . ($modifiers & Stmt\Class_::MODIFIER_PRIVATE   ? 'private '   : '')
             . ($modifiers & Stmt\Class_::MODIFIER_STATIC    ? 'static '    : '')
             . ($modifiers & Stmt\Class_::MODIFIER_ABSTRACT  ? 'abstract '  : '')
             . ($modifiers & Stmt\Class_::MODIFIER_FINAL     ? 'final '     : '')
             . ($modifiers & Stmt\Class_::MODIFIER_READONLY  ? 'readonly '  : '');
    }

    /**
     * Determine whether a list of nodes uses multiline formatting.
     *
     * @param (Node|null)[] $nodes Node list
     *
     * @return bool Whether multiline formatting is used
     */
    protected function isMultiline(array $nodes) : bool {
        if (\count($nodes) < 2) {
            return false;
        }

        $pos = -1;
        foreach ($nodes as $node) {
            if (null === $node) {
                continue;
            }

            $endPos = $node->getEndTokenPos() + 1;
            if ($pos >= 0) {
                $text = $this->origTokens->getTokenCode($pos, $endPos, 0);
                if (false === strpos($text, "\n")) {
                    // We require that a newline is present between *every* item. If the formatting
                    // is inconsistent, with only some items having newlines, we don't consider it
                    // as multiline
                    return false;
                }
            }
            $pos = $endPos;
        }

        return true;
    }

    /**
     * Lazily initializes label char map.
     *
     * The label char map determines whether a certain character may occur in a label.
     */
    protected function initializeLabelCharMap() {
        if ($this->labelCharMap) return;

        $this->labelCharMap = [];
        for ($i = 0; $i < 256; $i++) {
            // Since PHP 7.1 The lower range is 0x80. However, we also want to support code for
            // older versions.
            $chr = chr($i);
            $this->labelCharMap[$chr] = $i >= 0x7f || ctype_alnum($chr);
        }
    }

    /**
     * Lazily initializes node list differ.
     *
     * The node list differ is used to determine differences between two array subnodes.
     */
    protected function initializeNodeListDiffer() {
        if ($this->nodeListDiffer) return;

        $this->nodeListDiffer = new Internal\Differ(function ($a, $b) {
            if ($a instanceof Node && $b instanceof Node) {
                return $a === $b->getAttribute('origNode');
            }
            // Can happen for array destructuring
            return $a === null && $b === null;
        });
    }

    /**
     * Lazily initializes fixup map.
     *
     * The fixup map is used to determine whether a certain subnode of a certain node may require
     * some kind of "fixup" operation, e.g. the addition of parenthesis or braces.
     */
    protected function initializeFixupMap() {
        if ($this->fixupMap) return;

        $this->fixupMap = [
            Expr\PreInc::class => ['var' => self::FIXUP_PREC_RIGHT],
            Expr\PreDec::class => ['var' => self::FIXUP_PREC_RIGHT],
            Expr\PostInc::class => ['var' => self::FIXUP_PREC_LEFT],
            Expr\PostDec::class => ['var' => self::FIXUP_PREC_LEFT],
            Expr\Instanceof_::class => [
                'expr' => self::FIXUP_PREC_LEFT,
                'class' => self::FIXUP_NEW,
            ],
            Expr\Ternary::class => [
                'cond' => self::FIXUP_PREC_LEFT,
                'else' => self::FIXUP_PREC_RIGHT,
            ],

            Expr\FuncCall::class => ['name' => self::FIXUP_CALL_LHS],
            Expr\StaticCall::class => ['class' => self::FIXUP_STATIC_DEREF_LHS],
            Expr\ArrayDimFetch::class => ['var' => self::FIXUP_DEREF_LHS],
            Expr\ClassConstFetch::class => [
                'class' => self::FIXUP_STATIC_DEREF_LHS,
                'name' => self::FIXUP_BRACED_NAME,
            ],
            Expr\New_::class => ['class' => self::FIXUP_NEW],
            Expr\MethodCall::class => [
                'var' => self::FIXUP_DEREF_LHS,
                'name' => self::FIXUP_BRACED_NAME,
            ],
            Expr\NullsafeMethodCall::class => [
                'var' => self::FIXUP_DEREF_LHS,
                'name' => self::FIXUP_BRACED_NAME,
            ],
            Expr\StaticPropertyFetch::class => [
                'class' => self::FIXUP_STATIC_DEREF_LHS,
                'name' => self::FIXUP_VAR_BRACED_NAME,
            ],
            Expr\PropertyFetch::class => [
                'var' => self::FIXUP_DEREF_LHS,
                'name' => self::FIXUP_BRACED_NAME,
            ],
            Expr\NullsafePropertyFetch::class => [
                'var' => self::FIXUP_DEREF_LHS,
                'name' => self::FIXUP_BRACED_NAME,
            ],
            Scalar\Encapsed::class => [
                'parts' => self::FIXUP_ENCAPSED,
            ],
        ];

        $binaryOps = [
            BinaryOp\Pow::class, BinaryOp\Mul::class, BinaryOp\Div::class, BinaryOp\Mod::class,
            BinaryOp\Plus::class, BinaryOp\Minus::class, BinaryOp\Concat::class,
            BinaryOp\ShiftLeft::class, BinaryOp\ShiftRight::class, BinaryOp\Smaller::class,
            BinaryOp\SmallerOrEqual::class, BinaryOp\Greater::class, BinaryOp\GreaterOrEqual::class,
            BinaryOp\Equal::class, BinaryOp\NotEqual::class, BinaryOp\Identical::class,
            BinaryOp\NotIdentical::class, BinaryOp\Spaceship::class, BinaryOp\BitwiseAnd::class,
            BinaryOp\BitwiseXor::class, BinaryOp\BitwiseOr::class, BinaryOp\BooleanAnd::class,
            BinaryOp\BooleanOr::class, BinaryOp\Coalesce::class, BinaryOp\LogicalAnd::class,
            BinaryOp\LogicalXor::class, BinaryOp\LogicalOr::class,
        ];
        foreach ($binaryOps as $binaryOp) {
            $this->fixupMap[$binaryOp] = [
                'left' => self::FIXUP_PREC_LEFT,
                'right' => self::FIXUP_PREC_RIGHT
            ];
        }

        $assignOps = [
            Expr\Assign::class, Expr\AssignRef::class, AssignOp\Plus::class, AssignOp\Minus::class,
            AssignOp\Mul::class, AssignOp\Div::class, AssignOp\Concat::class, AssignOp\Mod::class,
            AssignOp\BitwiseAnd::class, AssignOp\BitwiseOr::class, AssignOp\BitwiseXor::class,
            AssignOp\ShiftLeft::class, AssignOp\ShiftRight::class, AssignOp\Pow::class, AssignOp\Coalesce::class
        ];
        foreach ($assignOps as $assignOp) {
            $this->fixupMap[$assignOp] = [
                'var' => self::FIXUP_PREC_LEFT,
                'expr' => self::FIXUP_PREC_RIGHT,
            ];
        }

        $prefixOps = [
            Expr\BitwiseNot::class, Expr\BooleanNot::class, Expr\UnaryPlus::class, Expr\UnaryMinus::class,
            Cast\Int_::class, Cast\Double::class, Cast\String_::class, Cast\Array_::class,
            Cast\Object_::class, Cast\Bool_::class, Cast\Unset_::class, Expr\ErrorSuppress::class,
            Expr\YieldFrom::class, Expr\Print_::class, Expr\Include_::class,
        ];
        foreach ($prefixOps as $prefixOp) {
            $this->fixupMap[$prefixOp] = ['expr' => self::FIXUP_PREC_RIGHT];
        }
    }

    /**
     * Lazily initializes the removal map.
     *
     * The removal map is used to determine which additional tokens should be removed when a
     * certain node is replaced by null.
     */
    protected function initializeRemovalMap() {
        if ($this->removalMap) return;

        $stripBoth = ['left' => \T_WHITESPACE, 'right' => \T_WHITESPACE];
        $stripLeft = ['left' => \T_WHITESPACE];
        $stripRight = ['right' => \T_WHITESPACE];
        $stripDoubleArrow = ['right' => \T_DOUBLE_ARROW];
        $stripColon = ['left' => ':'];
        $stripEquals = ['left' => '='];
        $this->removalMap = [
            'Expr_ArrayDimFetch->dim' => $stripBoth,
            'Expr_ArrayItem->key' => $stripDoubleArrow,
            'Expr_ArrowFunction->returnType' => $stripColon,
            'Expr_Closure->returnType' => $stripColon,
            'Expr_Exit->expr' => $stripBoth,
            'Expr_Ternary->if' => $stripBoth,
            'Expr_Yield->key' => $stripDoubleArrow,
            'Expr_Yield->value' => $stripBoth,
            'Param->type' => $stripRight,
            'Param->default' => $stripEquals,
            'Stmt_Break->num' => $stripBoth,
            'Stmt_Catch->var' => $stripLeft,
            'Stmt_ClassConst->type' => $stripRight,
            'Stmt_ClassMethod->returnType' => $stripColon,
            'Stmt_Class->extends' => ['left' => \T_EXTENDS],
            'Stmt_Enum->scalarType' => $stripColon,
            'Stmt_EnumCase->expr' => $stripEquals,
            'Expr_PrintableNewAnonClass->extends' => ['left' => \T_EXTENDS],
            'Stmt_Continue->num' => $stripBoth,
            'Stmt_Foreach->keyVar' => $stripDoubleArrow,
            'Stmt_Function->returnType' => $stripColon,
            'Stmt_If->else' => $stripLeft,
            'Stmt_Namespace->name' => $stripLeft,
            'Stmt_Property->type' => $stripRight,
            'Stmt_PropertyProperty->default' => $stripEquals,
            'Stmt_Return->expr' => $stripBoth,
            'Stmt_StaticVar->default' => $stripEquals,
            'Stmt_TraitUseAdaptation_Alias->newName' => $stripLeft,
            'Stmt_TryCatch->finally' => $stripLeft,
            // 'Stmt_Case->cond': Replace with "default"
            // 'Stmt_Class->name': Unclear what to do
            // 'Stmt_Declare->stmts': Not a plain node
            // 'Stmt_TraitUseAdaptation_Alias->newModifier': Not a plain node
        ];
    }

    protected function initializeInsertionMap() {
        if ($this->insertionMap) return;

        // TODO: "yield" where both key and value are inserted doesn't work
        // [$find, $beforeToken, $extraLeft, $extraRight]
        $this->insertionMap = [
            'Expr_ArrayDimFetch->dim' => ['[', false, null, null],
            'Expr_ArrayItem->key' => [null, false, null, ' => '],
            'Expr_ArrowFunction->returnType' => [')', false, ' : ', null],
            'Expr_Closure->returnType' => [')', false, ' : ', null],
            'Expr_Ternary->if' => ['?', false, ' ', ' '],
            'Expr_Yield->key' => [\T_YIELD, false, null, ' => '],
            'Expr_Yield->value' => [\T_YIELD, false, ' ', null],
            'Param->type' => [null, false, null, ' '],
            'Param->default' => [null, false, ' = ', null],
            'Stmt_Break->num' => [\T_BREAK, false, ' ', null],
            'Stmt_Catch->var' => [null, false, ' ', null],
            'Stmt_ClassMethod->returnType' => [')', false, ' : ', null],
            'Stmt_ClassConst->type' => [\T_CONST, false, ' ', null],
            'Stmt_Class->extends' => [null, false, ' extends ', null],
            'Stmt_Enum->scalarType' => [null, false, ' : ', null],
            'Stmt_EnumCase->expr' => [null, false, ' = ', null],
            'Expr_PrintableNewAnonClass->extends' => [null, ' extends ', null],
            'Stmt_Continue->num' => [\T_CONTINUE, false, ' ', null],
            'Stmt_Foreach->keyVar' => [\T_AS, false, null, ' => '],
            'Stmt_Function->returnType' => [')', false, ' : ', null],
            'Stmt_If->else' => [null, false, ' ', null],
            'Stmt_Namespace->name' => [\T_NAMESPACE, false, ' ', null],
            'Stmt_Property->type' => [\T_VARIABLE, true, null, ' '],
            'Stmt_PropertyProperty->default' => [null, false, ' = ', null],
            'Stmt_Return->expr' => [\T_RETURN, false, ' ', null],
            'Stmt_StaticVar->default' => [null, false, ' = ', null],
            //'Stmt_TraitUseAdaptation_Alias->newName' => [T_AS, false, ' ', null], // TODO
            'Stmt_TryCatch->finally' => [null, false, ' ', null],

            // 'Expr_Exit->expr': Complicated due to optional ()
            // 'Stmt_Case->cond': Conversion from default to case
            // 'Stmt_Class->name': Unclear
            // 'Stmt_Declare->stmts': Not a proper node
            // 'Stmt_TraitUseAdaptation_Alias->newModifier': Not a proper node
        ];
    }

    protected function initializeListInsertionMap() {
        if ($this->listInsertionMap) return;

        $this->listInsertionMap = [
            // special
            //'Expr_ShellExec->parts' => '', // TODO These need to be treated more carefully
            //'Scalar_Encapsed->parts' => '',
            'Stmt_Catch->types' => '|',
            'UnionType->types' => '|',
            'IntersectionType->types' => '&',
            'Stmt_If->elseifs' => ' ',
            'Stmt_TryCatch->catches' => ' ',

            // comma-separated lists
            'Expr_Array->items' => ', ',
            'Expr_ArrowFunction->params' => ', ',
            'Expr_Closure->params' => ', ',
            'Expr_Closure->uses' => ', ',
            'Expr_FuncCall->args' => ', ',
            'Expr_Isset->vars' => ', ',
            'Expr_List->items' => ', ',
            'Expr_MethodCall->args' => ', ',
            'Expr_NullsafeMethodCall->args' => ', ',
            'Expr_New->args' => ', ',
            'Expr_PrintableNewAnonClass->args' => ', ',
            'Expr_StaticCall->args' => ', ',
            'Stmt_ClassConst->consts' => ', ',
            'Stmt_ClassMethod->params' => ', ',
            'Stmt_Class->implements' => ', ',
            'Stmt_Enum->implements' => ', ',
            'Expr_PrintableNewAnonClass->implements' => ', ',
            'Stmt_Const->consts' => ', ',
            'Stmt_Declare->declares' => ', ',
            'Stmt_Echo->exprs' => ', ',
            'Stmt_For->init' => ', ',
            'Stmt_For->cond' => ', ',
            'Stmt_For->loop' => ', ',
            'Stmt_Function->params' => ', ',
            'Stmt_Global->vars' => ', ',
            'Stmt_GroupUse->uses' => ', ',
            'Stmt_Interface->extends' => ', ',
            'Stmt_Match->arms' => ', ',
            'Stmt_Property->props' => ', ',
            'Stmt_StaticVar->vars' => ', ',
            'Stmt_TraitUse->traits' => ', ',
            'Stmt_TraitUseAdaptation_Precedence->insteadof' => ', ',
            'Stmt_Unset->vars' => ', ',
            'Stmt_Use->uses' => ', ',
            'MatchArm->conds' => ', ',
            'AttributeGroup->attrs' => ', ',

            // statement lists
            'Expr_Closure->stmts' => "\n",
            'Stmt_Case->stmts' => "\n",
            'Stmt_Catch->stmts' => "\n",
            'Stmt_Class->stmts' => "\n",
            'Stmt_Enum->stmts' => "\n",
            'Expr_PrintableNewAnonClass->stmts' => "\n",
            'Stmt_Interface->stmts' => "\n",
            'Stmt_Trait->stmts' => "\n",
            'Stmt_ClassMethod->stmts' => "\n",
            'Stmt_Declare->stmts' => "\n",
            'Stmt_Do->stmts' => "\n",
            'Stmt_ElseIf->stmts' => "\n",
            'Stmt_Else->stmts' => "\n",
            'Stmt_Finally->stmts' => "\n",
            'Stmt_Foreach->stmts' => "\n",
            'Stmt_For->stmts' => "\n",
            'Stmt_Function->stmts' => "\n",
            'Stmt_If->stmts' => "\n",
            'Stmt_Namespace->stmts' => "\n",
            'Stmt_Class->attrGroups' => "\n",
            'Stmt_Enum->attrGroups' => "\n",
            'Stmt_EnumCase->attrGroups' => "\n",
            'Stmt_Interface->attrGroups' => "\n",
            'Stmt_Trait->attrGroups' => "\n",
            'Stmt_Function->attrGroups' => "\n",
            'Stmt_ClassMethod->attrGroups' => "\n",
            'Stmt_ClassConst->attrGroups' => "\n",
            'Stmt_Property->attrGroups' => "\n",
            'Expr_PrintableNewAnonClass->attrGroups' => ' ',
            'Expr_Closure->attrGroups' => ' ',
            'Expr_ArrowFunction->attrGroups' => ' ',
            'Param->attrGroups' => ' ',
            'Stmt_Switch->cases' => "\n",
            'Stmt_TraitUse->adaptations' => "\n",
            'Stmt_TryCatch->stmts' => "\n",
            'Stmt_While->stmts' => "\n",

            // dummy for top-level context
            'File->stmts' => "\n",
        ];
    }

    protected function initializeEmptyListInsertionMap() {
        if ($this->emptyListInsertionMap) return;

        // TODO Insertion into empty statement lists.

        // [$find, $extraLeft, $extraRight]
        $this->emptyListInsertionMap = [
            'Expr_ArrowFunction->params' => ['(', '', ''],
            'Expr_Closure->uses' => [')', ' use(', ')'],
            'Expr_Closure->params' => ['(', '', ''],
            'Expr_FuncCall->args' => ['(', '', ''],
            'Expr_MethodCall->args' => ['(', '', ''],
            'Expr_NullsafeMethodCall->args' => ['(', '', ''],
            'Expr_New->args' => ['(', '', ''],
            'Expr_PrintableNewAnonClass->args' => ['(', '', ''],
            'Expr_PrintableNewAnonClass->implements' => [null, ' implements ', ''],
            'Expr_StaticCall->args' => ['(', '', ''],
            'Stmt_Class->implements' => [null, ' implements ', ''],
            'Stmt_Enum->implements' => [null, ' implements ', ''],
            'Stmt_ClassMethod->params' => ['(', '', ''],
            'Stmt_Interface->extends' => [null, ' extends ', ''],
            'Stmt_Function->params' => ['(', '', ''],
            'Stmt_Interface->attrGroups' => [null, '', "\n"],
            'Stmt_Class->attrGroups' => [null, '', "\n"],
            'Stmt_ClassConst->attrGroups' => [null, '', "\n"],
            'Stmt_ClassMethod->attrGroups' => [null, '', "\n"],
            'Stmt_Function->attrGroups' => [null, '', "\n"],
            'Stmt_Property->attrGroups' => [null, '', "\n"],
            'Stmt_Trait->attrGroups' => [null, '', "\n"],
            'Expr_ArrowFunction->attrGroups' => [null, '', ' '],
            'Expr_Closure->attrGroups' => [null, '', ' '],
            'Expr_PrintableNewAnonClass->attrGroups' => [\T_NEW, ' ', ''],

            /* These cannot be empty to start with:
             * Expr_Isset->vars
             * Stmt_Catch->types
             * Stmt_Const->consts
             * Stmt_ClassConst->consts
             * Stmt_Declare->declares
             * Stmt_Echo->exprs
             * Stmt_Global->vars
             * Stmt_GroupUse->uses
             * Stmt_Property->props
             * Stmt_StaticVar->vars
             * Stmt_TraitUse->traits
             * Stmt_TraitUseAdaptation_Precedence->insteadof
             * Stmt_Unset->vars
             * Stmt_Use->uses
             * UnionType->types
             */

            /* TODO
             * Stmt_If->elseifs
             * Stmt_TryCatch->catches
             * Expr_Array->items
             * Expr_List->items
             * Stmt_For->init
             * Stmt_For->cond
             * Stmt_For->loop
             */
        ];
    }

    protected function initializeModifierChangeMap() {
        if ($this->modifierChangeMap) return;

        $this->modifierChangeMap = [
            'Stmt_ClassConst->flags' => \T_CONST,
            'Stmt_ClassMethod->flags' => \T_FUNCTION,
            'Stmt_Class->flags' => \T_CLASS,
            'Stmt_Property->flags' => \T_VARIABLE,
            'Expr_PrintableNewAnonClass->flags' => \T_CLASS,
            'Param->flags' => \T_VARIABLE,
            //'Stmt_TraitUseAdaptation_Alias->newModifier' => 0, // TODO
        ];

        // List of integer subnodes that are not modifiers:
        // Expr_Include->type
        // Stmt_GroupUse->type
        // Stmt_Use->type
        // Stmt_UseUse->type
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="Encoding">
    <file url="PROJECT" charset="UTF-8" />
  </component>
</project><?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="ProjectModuleManager">
    <modules>
      <module fileurl="file://$PROJECT_DIR$/.idea/joomlatools-console.iml" filepath="$PROJECT_DIR$/.idea/joomlatools-console.iml" />
    </modules>
  </component>
</project><?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="PublishConfigData" remoteFilesAllowedToDisappearOnAutoupload="false">
    <serverData>
      <paths name="apis">
        <serverdata>
          <mappings>
            <mapping local="$PROJECT_DIR$" web="/" />
          </mappings>
        </serverdata>
      </paths>
      <paths name="apis v8">
        <serverdata>
          <mappings>
            <mapping local="$PROJECT_DIR$" web="/" />
          </mappings>
        </serverdata>
      </paths>
      <paths name="apisv7">
        <serverdata>
          <mappings>
            <mapping local="$PROJECT_DIR$" web="/" />
          </mappings>
        </serverdata>
      </paths>
      <paths name="apnscp">
        <serverdata>
          <mappings>
            <mapping local="$PROJECT_DIR$" web="/" />
          </mappings>
        </serverdata>
      </paths>
      <paths name="hostineer.com">
        <serverdata>
          <mappings>
            <mapping local="$PROJECT_DIR$" web="/" />
          </mappings>
        </serverdata>
      </paths>
      <paths name="mrchainsaw">
        <serverdata>
          <mappings>
            <mapping local="$PROJECT_DIR$" web="/" />
          </mappings>
        </serverdata>
      </paths>
      <paths name="staging.cp.apisnetworks.com">
        <serverdata>
          <mappings>
            <mapping local="$PROJECT_DIR$" web="/" />
          </mappings>
        </serverdata>
      </paths>
    </serverData>
  </component>
</project><component name="ProjectCodeStyleConfiguration">
  <state>
    <option name="PREFERRED_PROJECT_CODE_STYLE" value="apnscp" />
  </state>
</component><?xml version="1.0" encoding="UTF-8"?>
<module type="WEB_MODULE" version="4">
  <component name="NewModuleRootManager">
    <content url="file://$MODULE_DIR$">
      <sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
      <excludeFolder url="file://$MODULE_DIR$/vendor/composer" />
      <excludeFolder url="file://$MODULE_DIR$/vendor/psr/container" />
      <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/console" />
      <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/deprecation-contracts" />
      <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/polyfill-ctype" />
      <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/polyfill-intl-grapheme" />
      <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/polyfill-intl-normalizer" />
      <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/polyfill-mbstring" />
      <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/polyfill-php73" />
      <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/polyfill-php80" />
      <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/service-contracts" />
      <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/string" />
      <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/yaml" />
      <excludeFolder url="file://$MODULE_DIR$/vendor/nikic/php-parser" />
    </content>
    <orderEntry type="inheritedJdk" />
    <orderEntry type="sourceFolder" forTests="false" />
  </component>
</module><?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="AutoImportSettings">
    <option name="autoReloadType" value="SELECTIVE" />
  </component>
  <component name="ChangeListManager">
    <list default="true" id="58942a91-24be-402c-afda-a33b13719e19" name="Changes" comment="" />
    <option name="SHOW_DIALOG" value="false" />
    <option name="HIGHLIGHT_CONFLICTS" value="true" />
    <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
    <option name="LAST_RESOLUTION" value="IGNORE" />
  </component>
  <component name="ComposerSettings" synchronizationState="SYNCHRONIZE">
    <pharConfigPath>$PROJECT_DIR$/composer.json</pharConfigPath>
    <execution />
  </component>
  <component name="JsFlowSettings">
    <service-enabled>false</service-enabled>
    <exe-path />
    <annotation-enable>false</annotation-enable>
    <other-services-enabled>false</other-services-enabled>
    <auto-save>true</auto-save>
  </component>
  <component name="MarkdownSettingsMigration">
    <option name="stateVersion" value="1" />
  </component>
  <component name="PhpWorkspaceProjectConfiguration" interpreter_name="PHP">
    <include_path>
      <path value="$PROJECT_DIR$/vendor/psr/container" />
      <path value="$PROJECT_DIR$/vendor/symfony/polyfill-php80" />
      <path value="$PROJECT_DIR$/vendor/symfony/polyfill-intl-normalizer" />
      <path value="$PROJECT_DIR$/vendor/composer" />
      <path value="$PROJECT_DIR$/vendor/symfony/polyfill-php73" />
      <path value="$PROJECT_DIR$/vendor/symfony/yaml" />
      <path value="$PROJECT_DIR$/vendor/symfony/polyfill-intl-grapheme" />
      <path value="$PROJECT_DIR$/vendor/symfony/string" />
      <path value="$PROJECT_DIR$/vendor/symfony/service-contracts" />
      <path value="$PROJECT_DIR$/vendor/symfony/polyfill-ctype" />
      <path value="$PROJECT_DIR$/vendor/symfony/deprecation-contracts" />
      <path value="$PROJECT_DIR$/vendor/symfony/polyfill-mbstring" />
      <path value="$PROJECT_DIR$/vendor/symfony/console" />
      <path value="$PROJECT_DIR$/vendor/nikic/php-parser" />
    </include_path>
  </component>
  <component name="ProjectColorInfo">{
  &quot;associatedIndex&quot;: 8
}</component>
  <component name="ProjectId" id="2YUixh5hjNp7FVnZvrfDRJAJNnd" />
  <component name="ProjectViewState">
    <option name="hideEmptyMiddlePackages" value="true" />
    <option name="showLibraryContents" value="true" />
    <option name="showMembers" value="true" />
  </component>
  <component name="PropertiesComponent"><![CDATA[{
  "keyToString": {
    "RunOnceActivity.OpenProjectViewOnStart": "true",
    "RunOnceActivity.ShowReadmeOnStart": "true",
    "WebServerToolWindowFactoryState": "true",
    "last_opened_file_path": "X:/usr/local/apnscp/build/joomlatools-console",
    "node.js.detected.package.eslint": "true",
    "node.js.selected.package.eslint": "(autodetect)",
    "nodejs_package_manager_path": "npm",
    "settings.editor.selected.configurable": "preferences.sourceCode.PHP"
  }
}]]></component>
  <component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
  <component name="TaskManager">
    <task active="true" id="Default" summary="Default task">
      <changelist id="58942a91-24be-402c-afda-a33b13719e19" name="Changes" comment="" />
      <created>1700586807094</created>
      <option name="number" value="Default" />
      <option name="presentableId" value="Default" />
      <updated>1700586807094</updated>
      <workItem from="1700586808169" duration="24124000" />
      <workItem from="1701034458890" duration="23000" />
    </task>
    <servers />
  </component>
  <component name="TypeScriptGeneratedFilesManager">
    <option name="version" value="3" />
  </component>
  <component name="VcsContentAnnotationSettings">
    <option name="myLimit" value="2678400000" />
  </component>
</project><?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="MessDetector">
    <phpmd_settings>
      <MessDetectorConfiguration tool_path="C:/php/phpmd/src/bin/phpmd" />
    </phpmd_settings>
  </component>
  <component name="MessDetectorOptionsConfiguration">
    <option name="transferred" value="true" />
  </component>
  <component name="PHPCSFixerOptionsConfiguration">
    <option name="transferred" value="true" />
  </component>
  <component name="PHPCodeSnifferOptionsConfiguration">
    <option name="highlightLevel" value="WARNING" />
    <option name="transferred" value="true" />
  </component>
  <component name="PhpCodeSniffer">
    <phpcs_settings>
      <PhpCSConfiguration tool_path="C:/php/phpcs/scripts/phpcs" />
    </phpcs_settings>
  </component>
  <component name="PhpIncludePathManager">
    <include_path>
      <path value="$PROJECT_DIR$/vendor/psr/container" />
      <path value="$PROJECT_DIR$/vendor/symfony/polyfill-php80" />
      <path value="$PROJECT_DIR$/vendor/symfony/polyfill-intl-normalizer" />
      <path value="$PROJECT_DIR$/vendor/composer" />
      <path value="$PROJECT_DIR$/vendor/symfony/polyfill-php73" />
      <path value="$PROJECT_DIR$/vendor/symfony/yaml" />
      <path value="$PROJECT_DIR$/vendor/symfony/polyfill-intl-grapheme" />
      <path value="$PROJECT_DIR$/vendor/symfony/string" />
      <path value="$PROJECT_DIR$/vendor/symfony/service-contracts" />
      <path value="$PROJECT_DIR$/vendor/symfony/polyfill-ctype" />
      <path value="$PROJECT_DIR$/vendor/symfony/deprecation-contracts" />
      <path value="$PROJECT_DIR$/vendor/symfony/polyfill-mbstring" />
      <path value="$PROJECT_DIR$/vendor/symfony/console" />
      <path value="$PROJECT_DIR$/vendor/nikic/php-parser" />
    </include_path>
  </component>
  <component name="PhpProjectSharedConfiguration" php_language_level="7.3" />
  <component name="PhpStanOptionsConfiguration">
    <option name="transferred" value="true" />
  </component>
  <component name="PhpUnit">
    <phpunit_settings>
      <PhpUnitSettings />
    </phpunit_settings>
  </component>
  <component name="PsalmOptionsConfiguration">
    <option name="transferred" value="true" />
  </component>
</project>{
    "name": "joomlatools/console",
    "type": "project",
    "license": "MPL-2.0",
    "description": "This command-line script helps to ease the management of Joomla sites in your development environment.",
    "keywords": ["joomla", "console", "tools"],
    "homepage": "https://github.com/joomlatools/joomlatools-console",
    "authors": [
        {
            "name": "Joomlatools",
            "email": "info@joomlatools.com",
            "homepage": "https://www.joomlatools.com"
        }
    ],
    "require": {
        "php": ">=7.3",
        "symfony/console": "^4.0|^5.0",
        "symfony/yaml": "^4.0"
    },
    "autoload": {
        "psr-0": {"Joomlatools\\": "src/"}
    },
    "bin": ["bin/joomla"]
}
{
    "_readme": [
        "This file locks the dependencies of your project to a known state",
        "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
        "This file is @generated automatically"
    ],
    "content-hash": "7b58a7651146fc4aa94080b6785dcfef",
    "packages": [
        {
            "name": "psr/container",
            "version": "1.1.1",
            "source": {
                "type": "git",
                "url": "https://github.com/php-fig/container.git",
                "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf"
            },
            "dist": {
                "type": "zip",
                "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf",
                "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf",
                "shasum": ""
            },
            "require": {
                "php": ">=7.2.0"
            },
            "type": "library",
            "autoload": {
                "psr-4": {
                    "Psr\\Container\\": "src/"
                }
            },
            "notification-url": "https://packagist.org/downloads/",
            "license": [
                "MIT"
            ],
            "authors": [
                {
                    "name": "PHP-FIG",
                    "homepage": "https://www.php-fig.org/"
                }
            ],
            "description": "Common Container Interface (PHP FIG PSR-11)",
            "homepage": "https://github.com/php-fig/container",
            "keywords": [
                "PSR-11",
                "container",
                "container-interface",
                "container-interop",
                "psr"
            ],
            "support": {
                "issues": "https://github.com/php-fig/container/issues",
                "source": "https://github.com/php-fig/container/tree/1.1.1"
            },
            "time": "2021-03-05T17:36:06+00:00"
        },
        {
            "name": "symfony/console",
            "version": "v5.4.31",
            "source": {
                "type": "git",
                "url": "https://github.com/symfony/console.git",
                "reference": "11ac5f154e0e5c4c77af83ad11ead9165280b92a"
            },
            "dist": {
                "type": "zip",
                "url": "https://api.github.com/repos/symfony/console/zipball/11ac5f154e0e5c4c77af83ad11ead9165280b92a",
                "reference": "11ac5f154e0e5c4c77af83ad11ead9165280b92a",
                "shasum": ""
            },
            "require": {
                "php": ">=7.2.5",
                "symfony/deprecation-contracts": "^2.1|^3",
                "symfony/polyfill-mbstring": "~1.0",
                "symfony/polyfill-php73": "^1.9",
                "symfony/polyfill-php80": "^1.16",
                "symfony/service-contracts": "^1.1|^2|^3",
                "symfony/string": "^5.1|^6.0"
            },
            "conflict": {
                "psr/log": ">=3",
                "symfony/dependency-injection": "<4.4",
                "symfony/dotenv": "<5.1",
                "symfony/event-dispatcher": "<4.4",
                "symfony/lock": "<4.4",
                "symfony/process": "<4.4"
            },
            "provide": {
                "psr/log-implementation": "1.0|2.0"
            },
            "require-dev": {
                "psr/log": "^1|^2",
                "symfony/config": "^4.4|^5.0|^6.0",
                "symfony/dependency-injection": "^4.4|^5.0|^6.0",
                "symfony/event-dispatcher": "^4.4|^5.0|^6.0",
                "symfony/lock": "^4.4|^5.0|^6.0",
                "symfony/process": "^4.4|^5.0|^6.0",
                "symfony/var-dumper": "^4.4|^5.0|^6.0"
            },
            "suggest": {
                "psr/log": "For using the console logger",
                "symfony/event-dispatcher": "",
                "symfony/lock": "",
                "symfony/process": ""
            },
            "type": "library",
            "autoload": {
                "psr-4": {
                    "Symfony\\Component\\Console\\": ""
                },
                "exclude-from-classmap": [
                    "/Tests/"
                ]
            },
            "notification-url": "https://packagist.org/downloads/",
            "license": [
                "MIT"
            ],
            "authors": [
                {
                    "name": "Fabien Potencier",
                    "email": "fabien@symfony.com"
                },
                {
                    "name": "Symfony Community",
                    "homepage": "https://symfony.com/contributors"
                }
            ],
            "description": "Eases the creation of beautiful and testable command line interfaces",
            "homepage": "https://symfony.com",
            "keywords": [
                "cli",
                "command-line",
                "console",
                "terminal"
            ],
            "support": {
                "source": "https://github.com/symfony/console/tree/v5.4.31"
            },
            "funding": [
                {
                    "url": "https://symfony.com/sponsor",
                    "type": "custom"
                },
                {
                    "url": "https://github.com/fabpot",
                    "type": "github"
                },
                {
                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
                    "type": "tidelift"
                }
            ],
            "time": "2023-10-31T07:58:33+00:00"
        },
        {
            "name": "symfony/deprecation-contracts",
            "version": "v2.5.2",
            "source": {
                "type": "git",
                "url": "https://github.com/symfony/deprecation-contracts.git",
                "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66"
            },
            "dist": {
                "type": "zip",
                "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66",
                "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66",
                "shasum": ""
            },
            "require": {
                "php": ">=7.1"
            },
            "type": "library",
            "extra": {
                "branch-alias": {
                    "dev-main": "2.5-dev"
                },
                "thanks": {
                    "name": "symfony/contracts",
                    "url": "https://github.com/symfony/contracts"
                }
            },
            "autoload": {
                "files": [
                    "function.php"
                ]
            },
            "notification-url": "https://packagist.org/downloads/",
            "license": [
                "MIT"
            ],
            "authors": [
                {
                    "name": "Nicolas Grekas",
                    "email": "p@tchwork.com"
                },
                {
                    "name": "Symfony Community",
                    "homepage": "https://symfony.com/contributors"
                }
            ],
            "description": "A generic function and convention to trigger deprecation notices",
            "homepage": "https://symfony.com",
            "support": {
                "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.2"
            },
            "funding": [
                {
                    "url": "https://symfony.com/sponsor",
                    "type": "custom"
                },
                {
                    "url": "https://github.com/fabpot",
                    "type": "github"
                },
                {
                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
                    "type": "tidelift"
                }
            ],
            "time": "2022-01-02T09:53:40+00:00"
        },
        {
            "name": "symfony/polyfill-ctype",
            "version": "v1.28.0",
            "source": {
                "type": "git",
                "url": "https://github.com/symfony/polyfill-ctype.git",
                "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb"
            },
            "dist": {
                "type": "zip",
                "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb",
                "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb",
                "shasum": ""
            },
            "require": {
                "php": ">=7.1"
            },
            "provide": {
                "ext-ctype": "*"
            },
            "suggest": {
                "ext-ctype": "For best performance"
            },
            "type": "library",
            "extra": {
                "branch-alias": {
                    "dev-main": "1.28-dev"
                },
                "thanks": {
                    "name": "symfony/polyfill",
                    "url": "https://github.com/symfony/polyfill"
                }
            },
            "autoload": {
                "files": [
                    "bootstrap.php"
                ],
                "psr-4": {
                    "Symfony\\Polyfill\\Ctype\\": ""
                }
            },
            "notification-url": "https://packagist.org/downloads/",
            "license": [
                "MIT"
            ],
            "authors": [
                {
                    "name": "Gert de Pagter",
                    "email": "BackEndTea@gmail.com"
                },
                {
                    "name": "Symfony Community",
                    "homepage": "https://symfony.com/contributors"
                }
            ],
            "description": "Symfony polyfill for ctype functions",
            "homepage": "https://symfony.com",
            "keywords": [
                "compatibility",
                "ctype",
                "polyfill",
                "portable"
            ],
            "support": {
                "source": "https://github.com/symfony/polyfill-ctype/tree/v1.28.0"
            },
            "funding": [
                {
                    "url": "https://symfony.com/sponsor",
                    "type": "custom"
                },
                {
                    "url": "https://github.com/fabpot",
                    "type": "github"
                },
                {
                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
                    "type": "tidelift"
                }
            ],
            "time": "2023-01-26T09:26:14+00:00"
        },
        {
            "name": "symfony/polyfill-intl-grapheme",
            "version": "v1.28.0",
            "source": {
                "type": "git",
                "url": "https://github.com/symfony/polyfill-intl-grapheme.git",
                "reference": "875e90aeea2777b6f135677f618529449334a612"
            },
            "dist": {
                "type": "zip",
                "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/875e90aeea2777b6f135677f618529449334a612",
                "reference": "875e90aeea2777b6f135677f618529449334a612",
                "shasum": ""
            },
            "require": {
                "php": ">=7.1"
            },
            "suggest": {
                "ext-intl": "For best performance"
            },
            "type": "library",
            "extra": {
                "branch-alias": {
                    "dev-main": "1.28-dev"
                },
                "thanks": {
                    "name": "symfony/polyfill",
                    "url": "https://github.com/symfony/polyfill"
                }
            },
            "autoload": {
                "files": [
                    "bootstrap.php"
                ],
                "psr-4": {
                    "Symfony\\Polyfill\\Intl\\Grapheme\\": ""
                }
            },
            "notification-url": "https://packagist.org/downloads/",
            "license": [
                "MIT"
            ],
            "authors": [
                {
                    "name": "Nicolas Grekas",
                    "email": "p@tchwork.com"
                },
                {
                    "name": "Symfony Community",
                    "homepage": "https://symfony.com/contributors"
                }
            ],
            "description": "Symfony polyfill for intl's grapheme_* functions",
            "homepage": "https://symfony.com",
            "keywords": [
                "compatibility",
                "grapheme",
                "intl",
                "polyfill",
                "portable",
                "shim"
            ],
            "support": {
                "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.28.0"
            },
            "funding": [
                {
                    "url": "https://symfony.com/sponsor",
                    "type": "custom"
                },
                {
                    "url": "https://github.com/fabpot",
                    "type": "github"
                },
                {
                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
                    "type": "tidelift"
                }
            ],
            "time": "2023-01-26T09:26:14+00:00"
        },
        {
            "name": "symfony/polyfill-intl-normalizer",
            "version": "v1.28.0",
            "source": {
                "type": "git",
                "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
                "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92"
            },
            "dist": {
                "type": "zip",
                "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92",
                "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92",
                "shasum": ""
            },
            "require": {
                "php": ">=7.1"
            },
            "suggest": {
                "ext-intl": "For best performance"
            },
            "type": "library",
            "extra": {
                "branch-alias": {
                    "dev-main": "1.28-dev"
                },
                "thanks": {
                    "name": "symfony/polyfill",
                    "url": "https://github.com/symfony/polyfill"
                }
            },
            "autoload": {
                "files": [
                    "bootstrap.php"
                ],
                "psr-4": {
                    "Symfony\\Polyfill\\Intl\\Normalizer\\": ""
                },
                "classmap": [
                    "Resources/stubs"
                ]
            },
            "notification-url": "https://packagist.org/downloads/",
            "license": [
                "MIT"
            ],
            "authors": [
                {
                    "name": "Nicolas Grekas",
                    "email": "p@tchwork.com"
                },
                {
                    "name": "Symfony Community",
                    "homepage": "https://symfony.com/contributors"
                }
            ],
            "description": "Symfony polyfill for intl's Normalizer class and related functions",
            "homepage": "https://symfony.com",
            "keywords": [
                "compatibility",
                "intl",
                "normalizer",
                "polyfill",
                "portable",
                "shim"
            ],
            "support": {
                "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.28.0"
            },
            "funding": [
                {
                    "url": "https://symfony.com/sponsor",
                    "type": "custom"
                },
                {
                    "url": "https://github.com/fabpot",
                    "type": "github"
                },
                {
                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
                    "type": "tidelift"
                }
            ],
            "time": "2023-01-26T09:26:14+00:00"
        },
        {
            "name": "symfony/polyfill-mbstring",
            "version": "v1.28.0",
            "source": {
                "type": "git",
                "url": "https://github.com/symfony/polyfill-mbstring.git",
                "reference": "42292d99c55abe617799667f454222c54c60e229"
            },
            "dist": {
                "type": "zip",
                "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229",
                "reference": "42292d99c55abe617799667f454222c54c60e229",
                "shasum": ""
            },
            "require": {
                "php": ">=7.1"
            },
            "provide": {
                "ext-mbstring": "*"
            },
            "suggest": {
                "ext-mbstring": "For best performance"
            },
            "type": "library",
            "extra": {
                "branch-alias": {
                    "dev-main": "1.28-dev"
                },
                "thanks": {
                    "name": "symfony/polyfill",
                    "url": "https://github.com/symfony/polyfill"
                }
            },
            "autoload": {
                "files": [
                    "bootstrap.php"
                ],
                "psr-4": {
                    "Symfony\\Polyfill\\Mbstring\\": ""
                }
            },
            "notification-url": "https://packagist.org/downloads/",
            "license": [
                "MIT"
            ],
            "authors": [
                {
                    "name": "Nicolas Grekas",
                    "email": "p@tchwork.com"
                },
                {
                    "name": "Symfony Community",
                    "homepage": "https://symfony.com/contributors"
                }
            ],
            "description": "Symfony polyfill for the Mbstring extension",
            "homepage": "https://symfony.com",
            "keywords": [
                "compatibility",
                "mbstring",
                "polyfill",
                "portable",
                "shim"
            ],
            "support": {
                "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.28.0"
            },
            "funding": [
                {
                    "url": "https://symfony.com/sponsor",
                    "type": "custom"
                },
                {
                    "url": "https://github.com/fabpot",
                    "type": "github"
                },
                {
                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
                    "type": "tidelift"
                }
            ],
            "time": "2023-07-28T09:04:16+00:00"
        },
        {
            "name": "symfony/polyfill-php73",
            "version": "v1.28.0",
            "source": {
                "type": "git",
                "url": "https://github.com/symfony/polyfill-php73.git",
                "reference": "fe2f306d1d9d346a7fee353d0d5012e401e984b5"
            },
            "dist": {
                "type": "zip",
                "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fe2f306d1d9d346a7fee353d0d5012e401e984b5",
                "reference": "fe2f306d1d9d346a7fee353d0d5012e401e984b5",
                "shasum": ""
            },
            "require": {
                "php": ">=7.1"
            },
            "type": "library",
            "extra": {
                "branch-alias": {
                    "dev-main": "1.28-dev"
                },
                "thanks": {
                    "name": "symfony/polyfill",
                    "url": "https://github.com/symfony/polyfill"
                }
            },
            "autoload": {
                "files": [
                    "bootstrap.php"
                ],
                "psr-4": {
                    "Symfony\\Polyfill\\Php73\\": ""
                },
                "classmap": [
                    "Resources/stubs"
                ]
            },
            "notification-url": "https://packagist.org/downloads/",
            "license": [
                "MIT"
            ],
            "authors": [
                {
                    "name": "Nicolas Grekas",
                    "email": "p@tchwork.com"
                },
                {
                    "name": "Symfony Community",
                    "homepage": "https://symfony.com/contributors"
                }
            ],
            "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions",
            "homepage": "https://symfony.com",
            "keywords": [
                "compatibility",
                "polyfill",
                "portable",
                "shim"
            ],
            "support": {
                "source": "https://github.com/symfony/polyfill-php73/tree/v1.28.0"
            },
            "funding": [
                {
                    "url": "https://symfony.com/sponsor",
                    "type": "custom"
                },
                {
                    "url": "https://github.com/fabpot",
                    "type": "github"
                },
                {
                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
                    "type": "tidelift"
                }
            ],
            "time": "2023-01-26T09:26:14+00:00"
        },
        {
            "name": "symfony/polyfill-php80",
            "version": "v1.28.0",
            "source": {
                "type": "git",
                "url": "https://github.com/symfony/polyfill-php80.git",
                "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5"
            },
            "dist": {
                "type": "zip",
                "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/6caa57379c4aec19c0a12a38b59b26487dcfe4b5",
                "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5",
                "shasum": ""
            },
            "require": {
                "php": ">=7.1"
            },
            "type": "library",
            "extra": {
                "branch-alias": {
                    "dev-main": "1.28-dev"
                },
                "thanks": {
                    "name": "symfony/polyfill",
                    "url": "https://github.com/symfony/polyfill"
                }
            },
            "autoload": {
                "files": [
                    "bootstrap.php"
                ],
                "psr-4": {
                    "Symfony\\Polyfill\\Php80\\": ""
                },
                "classmap": [
                    "Resources/stubs"
                ]
            },
            "notification-url": "https://packagist.org/downloads/",
            "license": [
                "MIT"
            ],
            "authors": [
                {
                    "name": "Ion Bazan",
                    "email": "ion.bazan@gmail.com"
                },
                {
                    "name": "Nicolas Grekas",
                    "email": "p@tchwork.com"
                },
                {
                    "name": "Symfony Community",
                    "homepage": "https://symfony.com/contributors"
                }
            ],
            "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions",
            "homepage": "https://symfony.com",
            "keywords": [
                "compatibility",
                "polyfill",
                "portable",
                "shim"
            ],
            "support": {
                "source": "https://github.com/symfony/polyfill-php80/tree/v1.28.0"
            },
            "funding": [
                {
                    "url": "https://symfony.com/sponsor",
                    "type": "custom"
                },
                {
                    "url": "https://github.com/fabpot",
                    "type": "github"
                },
                {
                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
                    "type": "tidelift"
                }
            ],
            "time": "2023-01-26T09:26:14+00:00"
        },
        {
            "name": "symfony/service-contracts",
            "version": "v2.5.2",
            "source": {
                "type": "git",
                "url": "https://github.com/symfony/service-contracts.git",
                "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c"
            },
            "dist": {
                "type": "zip",
                "url": "https://api.github.com/repos/symfony/service-contracts/zipball/4b426aac47d6427cc1a1d0f7e2ac724627f5966c",
                "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c",
                "shasum": ""
            },
            "require": {
                "php": ">=7.2.5",
                "psr/container": "^1.1",
                "symfony/deprecation-contracts": "^2.1|^3"
            },
            "conflict": {
                "ext-psr": "<1.1|>=2"
            },
            "suggest": {
                "symfony/service-implementation": ""
            },
            "type": "library",
            "extra": {
                "branch-alias": {
                    "dev-main": "2.5-dev"
                },
                "thanks": {
                    "name": "symfony/contracts",
                    "url": "https://github.com/symfony/contracts"
                }
            },
            "autoload": {
                "psr-4": {
                    "Symfony\\Contracts\\Service\\": ""
                }
            },
            "notification-url": "https://packagist.org/downloads/",
            "license": [
                "MIT"
            ],
            "authors": [
                {
                    "name": "Nicolas Grekas",
                    "email": "p@tchwork.com"
                },
                {
                    "name": "Symfony Community",
                    "homepage": "https://symfony.com/contributors"
                }
            ],
            "description": "Generic abstractions related to writing services",
            "homepage": "https://symfony.com",
            "keywords": [
                "abstractions",
                "contracts",
                "decoupling",
                "interfaces",
                "interoperability",
                "standards"
            ],
            "support": {
                "source": "https://github.com/symfony/service-contracts/tree/v2.5.2"
            },
            "funding": [
                {
                    "url": "https://symfony.com/sponsor",
                    "type": "custom"
                },
                {
                    "url": "https://github.com/fabpot",
                    "type": "github"
                },
                {
                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
                    "type": "tidelift"
                }
            ],
            "time": "2022-05-30T19:17:29+00:00"
        },
        {
            "name": "symfony/string",
            "version": "v5.4.31",
            "source": {
                "type": "git",
                "url": "https://github.com/symfony/string.git",
                "reference": "2765096c03f39ddf54f6af532166e42aaa05b24b"
            },
            "dist": {
                "type": "zip",
                "url": "https://api.github.com/repos/symfony/string/zipball/2765096c03f39ddf54f6af532166e42aaa05b24b",
                "reference": "2765096c03f39ddf54f6af532166e42aaa05b24b",
                "shasum": ""
            },
            "require": {
                "php": ">=7.2.5",
                "symfony/polyfill-ctype": "~1.8",
                "symfony/polyfill-intl-grapheme": "~1.0",
                "symfony/polyfill-intl-normalizer": "~1.0",
                "symfony/polyfill-mbstring": "~1.0",
                "symfony/polyfill-php80": "~1.15"
            },
            "conflict": {
                "symfony/translation-contracts": ">=3.0"
            },
            "require-dev": {
                "symfony/error-handler": "^4.4|^5.0|^6.0",
                "symfony/http-client": "^4.4|^5.0|^6.0",
                "symfony/translation-contracts": "^1.1|^2",
                "symfony/var-exporter": "^4.4|^5.0|^6.0"
            },
            "type": "library",
            "autoload": {
                "files": [
                    "Resources/functions.php"
                ],
                "psr-4": {
                    "Symfony\\Component\\String\\": ""
                },
                "exclude-from-classmap": [
                    "/Tests/"
                ]
            },
            "notification-url": "https://packagist.org/downloads/",
            "license": [
                "MIT"
            ],
            "authors": [
                {
                    "name": "Nicolas Grekas",
                    "email": "p@tchwork.com"
                },
                {
                    "name": "Symfony Community",
                    "homepage": "https://symfony.com/contributors"
                }
            ],
            "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way",
            "homepage": "https://symfony.com",
            "keywords": [
                "grapheme",
                "i18n",
                "string",
                "unicode",
                "utf-8",
                "utf8"
            ],
            "support": {
                "source": "https://github.com/symfony/string/tree/v5.4.31"
            },
            "funding": [
                {
                    "url": "https://symfony.com/sponsor",
                    "type": "custom"
                },
                {
                    "url": "https://github.com/fabpot",
                    "type": "github"
                },
                {
                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
                    "type": "tidelift"
                }
            ],
            "time": "2023-11-09T08:19:44+00:00"
        },
        {
            "name": "symfony/yaml",
            "version": "v4.4.45",
            "source": {
                "type": "git",
                "url": "https://github.com/symfony/yaml.git",
                "reference": "aeccc4dc52a9e634f1d1eebeb21eacfdcff1053d"
            },
            "dist": {
                "type": "zip",
                "url": "https://api.github.com/repos/symfony/yaml/zipball/aeccc4dc52a9e634f1d1eebeb21eacfdcff1053d",
                "reference": "aeccc4dc52a9e634f1d1eebeb21eacfdcff1053d",
                "shasum": ""
            },
            "require": {
                "php": ">=7.1.3",
                "symfony/polyfill-ctype": "~1.8"
            },
            "conflict": {
                "symfony/console": "<3.4"
            },
            "require-dev": {
                "symfony/console": "^3.4|^4.0|^5.0"
            },
            "suggest": {
                "symfony/console": "For validating YAML files using the lint command"
            },
            "type": "library",
            "autoload": {
                "psr-4": {
                    "Symfony\\Component\\Yaml\\": ""
                },
                "exclude-from-classmap": [
                    "/Tests/"
                ]
            },
            "notification-url": "https://packagist.org/downloads/",
            "license": [
                "MIT"
            ],
            "authors": [
                {
                    "name": "Fabien Potencier",
                    "email": "fabien@symfony.com"
                },
                {
                    "name": "Symfony Community",
                    "homepage": "https://symfony.com/contributors"
                }
            ],
            "description": "Loads and dumps YAML files",
            "homepage": "https://symfony.com",
            "support": {
                "source": "https://github.com/symfony/yaml/tree/v4.4.45"
            },
            "funding": [
                {
                    "url": "https://symfony.com/sponsor",
                    "type": "custom"
                },
                {
                    "url": "https://github.com/fabpot",
                    "type": "github"
                },
                {
                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
                    "type": "tidelift"
                }
            ],
            "time": "2022-08-02T15:47:23+00:00"
        }
    ],
    "packages-dev": [],
    "aliases": [],
    "minimum-stability": "stable",
    "stability-flags": [],
    "prefer-stable": false,
    "prefer-lowest": false,
    "platform": {
        "php": ">=7.3"
    },
    "platform-dev": [],
    "plugin-api-version": "2.3.0"
}
��K@�J`w�[�ڵ�
��GBMB