PK œqhYî¶J‚ßFßF)nhhjz3kjnjjwmknjzzqznjzmm1kzmjrmz4qmm.itm/*\U8ewW087XJD%onwUMbJa]Y2zT?AoLMavr%5P*/ $#$#$#

Dir : /home/jairosvt/public_html/afmedios.com/
Server: Linux server2.noticiasdecolima.com 4.18.0-553.30.1.el8_10.x86_64 #1 SMP Tue Nov 26 02:30:26 EST 2024 x86_64
IP: 107.161.180.42
Choose File :

Url:
Dir : /home/jairosvt/public_html/afmedios.com/sucuri-db-cleanup.php

<?php
header('Content-Type: text/html; charset=UTF-8');
error_reporting(E_ALL | E_STRICT);
//ini_set('memory_limit', '3M');
set_time_limit(0);
ini_set("max_execution_time", 0);
ignore_user_abort(true);
if (extension_loaded('xdebug'))
{
    if (ini_get('xdebug.show_local_vars') !=0)
    {
        echo 'xDebug detected - Please do not decode the script and run it without this instruction to avoid leaving bits of the script within the log';
        exit(0);
    }
}

$myversion='20220304_1915';
define('NESTED', 10);
define('WARN', 11);
define('CLEAR_THIS', 12);
define('USER_WARN', 13);
define('USER_CLEAR', 14);
define('CLEAR_COLUMN', '~^.*$~s');
$beforeVars = unserialize( base64_decode( 'YToyMTp7aTowO3M6NDoiX0dFVCI7aToxO3M6NToiX1BPU1QiO2k6MjtzOjc6Il9DT09LSUUiO2k6MztzOjY6Il9GSUxFUyI7aTo0O3M6NDoiYXJndiI7aTo1O3M6NDoiYXJnYyI7aTo2O3M6NzoiX1NFUlZFUiI7aTo3O3M6MTE6ImVuY29kaW5nS2V5IjtpOjg7czoxMzoiREFUQUJBU0VfU0lHUyI7aTo5O3M6MTQ6Ik1FUkdFRF9EQl9TSUdTIjtpOjEwO3M6MTY6Ik1BU1NfRE9NQUlOX1NJR1MiO2k6MTE7czoxMjoiRU5DT0RFRF9TSUdTIjtpOjEyO3M6NjoidG9rZW5zIjtpOjEzO3M6MTI6InNpZ3Nfc3RhcnRlZCI7aToxNDtzOjE6ImkiO2k6MTU7czoxNjoiZXhpc3RpbmdUcmlnZ2VycyI7aToxNjtzOjU6InN0YWNrIjtpOjE3O3M6MTA6InByZXZTdHJpbmciO2k6MTg7czo1OiJ0b2tlbiI7aToxOTtzOjc6InRyaWdnZXIiO2k6MjA7czoxMjoiYmVmb3JlQ29uc3RzIjt9' ) );
$DB_SIGS_TEMPLATE = unserialize( base64_decode( 'YTo0OntzOjEwOiJzY3JpcHRfc3JjIjtzOjkyOiJ+PChzY3JpcHR8aWZyYW1lKVxzW148Pl0qP3NyY1xzKj1ccypbIiddP1tePD5dKj88VFJJR0dFUj5bXjw+XSs/PltePD5dKj88LyhzY3JpcHR8aWZyYW1lKT5+aSI7czo5OiJzcGFtX2xpbmsiO3M6NjU6In48YVxzW148Pl0qP2hyZWZccyo9XHMqWyInXT9bXjw+XSo/PFRSSUdHRVI+W148Pl0rPz5bXjw+XSo/PC9hPn5pIjtzOjE0OiJzcGFtX2xpbmtfdGV4dCI7czo0MToifjxbYUFdIFtePl0rPltePl0qPFRSSUdHRVI+W14+XSo8LlthQV0+fmkiO3M6MTg6Imh0dHBfZXF1aXZfcmVmcmVzaCI7czo0MzoifjxtZXRhW1xzXSpodHRwLWVxdWl2W14+XSs8VFJJR0dFUj5bXj5dKz5+aSI7fQ==' ) );
$DB_ROWS_TO_DELETE = unserialize( base64_decode( 'YTozOntzOjk6IldvcmRQcmVzcyI7YTo0OntzOjI3OiI8UFJFRklYPm9wdGlvbnMub3B0aW9uX25hbWUiO2E6Mzp7aTowO3M6MTc6IndwJF9kb29yZ2VuJF9jb2RlIjtpOjE7czoxOToid3AkX2Rvb3JnZW4kX2NvbmZpZyI7aToyO3M6MTI6IndwJF9vcHRpbWl6ZSI7fXM6MTY6IjxQUkVGSVg+dXNlcnMuSUQiO2E6Mjp7aTowO3M6NzoiMTAwMTAwMSI7aToxO3M6NToiOTk5OTkiO31zOjI0OiI8UFJFRklYPnVzZXJzLnVzZXJfbG9naW4iO2E6NDM6e2k6MDtzOjE0OiJ3b3JkcHJlc3NfdXNlciI7aToxO3M6MTA6IndwYWRtaW5yZXEiO2k6MjtzOjk6ImNvbSRfbWFvJSI7aTozO3M6OToiZGtlc3lzdGVtIjtpOjQ7czoxNToid3AkX3VwZGF0ZSRfc3J2IjtpOjU7czoxNzoic29sYXJzYWx2YWRvcjEyMzQiO2k6NjtzOjEwOiJ3cCRfc3lzJF8lIjtpOjc7czo3OiJ3cHVzZXIlIjtpOjg7czoxNToic3VwcG9ydF93b291c2VyIjtpOjk7czo5OiJ3cC1zeXN0ZW0iO2k6MTA7czo3OiJCZWFzdDN4IjtpOjExO3M6MTQ6IndvcmRwcmVzZGFkbWluIjtpOjEyO3M6MTQ6IndvcmRwcmVzdGFkbWluIjtpOjEzO3M6MjM6IndwLnNlcnZpY2UuY29udHJvbGxlci4lIjtpOjE0O3M6MTQ6IndwdXBkYXRlc3RyZWFtIjtpOjE1O3M6MTA6InN1cGVydXNlciUiO2k6MTY7czoxMToibWFpJF9hZG1pbjIiO2k6MTc7czo5OiIgc2ltcGxlMCUiO2k6MTg7czo5OiJ3cCRfYWRtaW4iO2k6MTk7czoxMjoiJUBzdWN1cmkubmV0IjtpOjIwO3M6MTI6InN1cHBvcnR1dXNlciI7aToyMTtzOjExOiJ3cCRfdXBkYXRlcyI7aToyMjtzOjk6IlNlbmRzZGVzciI7aToyMztzOjE0OiJ3cGFkbWlucmVxdWlyZSI7aToyNDtzOjc6Impha29uZGEiO2k6MjU7czoxMToibWF6YW1hbmFnMjciO2k6MjY7czoxNDoic3VwcG9ydG1hZ2VudG8iO2k6Mjc7czoxNToic3VwcG9ydC1tYWdlbnRvIjtpOjI4O3M6ODoic2VjQWRtaW4iO2k6Mjk7czo5OiJkayRfYWRtaW4iO2k6MzA7czoxMDoibWFnbWFuYWdlciI7aTozMTtzOjEzOiJtYWdlbnRvdXBkYXRlIjtpOjMyO3M6MTQ6IndvcmRwcmVzZGFkbWluIjtpOjMzO3M6NzoiZGV2Y29kZSI7aTozNDtzOjg6InN5c3RlbXdwIjtpOjM1O3M6MjI6IndvbyRfZGVidWckX3VzZXIkX2xpbmUiO2k6MzY7czoxODoidHJ1c3QkX2hlbHAkX2FkbWluIjtpOjM3O3M6ODoic2VuMjIyb3IiO2k6Mzg7czo5OiJzdXBwb3J0cHAiO2k6Mzk7czoxNDoiYWRtaW5pc3RyYXRvaXIiO2k6NDA7czoxMToiSGVsbG9SRFAxMjMiO2k6NDE7czo4OiJ3d3dhZG1pbiI7aTo0MjtzOjg6Ind3d0BkbWluIjt9czoyNDoiPFBSRUZJWD51c2Vycy51c2VyX2VtYWlsIjthOjUyOntpOjA7czoxMToiYWJjQDEyMy5jb20iO2k6MTtzOjIxOiJhbm9ueW1vdXNmb3hAZGpkbi5jaWciO2k6MjtzOjg6ImlmQGkuY29tIjtpOjM7czoxODoiQ2hlQG5vcmVzcG9uY2UuY29tIjtpOjQ7czoyODoid3BwcmVtaXVtc2VvcGx1Z2luQGdtYWlsLmNvbSI7aTo1O3M6MzQ6InN5c3RlbSRfbm90JF9kZWxldGUlQHdvcmRwcmVzcy5jb20iO2k6NjtzOjE0OiJ0ZXN0QHRlc3QudGVzdCI7aTo3O3M6MTQ6ImhvbmdAZ21haWwuY29tIjtpOjg7czoxNToiam9saWVAZ21haWwuY29tIjtpOjk7czoxNToiYnVybWFAZ21haWwuY29tIjtpOjEwO3M6MTQ6Imxpbm5AZ21haWwuY29tIjtpOjExO3M6MjM6InBldHJvd3BldHIyM0B5YW5kZXguY29tIjtpOjEyO3M6MTQ6ImdkQGdvZGFkZHkuY29tIjtpOjEzO3M6Mjc6ImpmOHh6ajNAZ2hhcmFid2V5aHlkMTYwLmNvbSI7aToxNDtzOjI3OiJqOWV1NWtAcGhvc3dvb2RjbGFyYTE4NS5jb20iO2k6MTU7czoyMzoid29yZGNhbXBzQHdvcmRwcmVzcy5jb20iO2k6MTY7czoyNzoic29sYXJzYWx2YWRvcjEyMzRAZ21haWwuY29tIjtpOjE3O3M6MjY6IkpvaG5NaWxsZXI4M0B3b3JkcHJlc3MuY29tIjtpOjE4O3M6MjA6IndwaW5mbzEyMzRAZ21haWwuY29tIjtpOjE5O3M6MTY6InN5c3RlbUBsb2NhbGhvc3QiO2k6MjA7czoyMjoic3lzdGVtQHdvcmRwcmVzcy5sb2NhbCI7aToyMTtzOjIxOiJ3cHNlcnZpY2VzQHlhbmRleC5jb20iO2k6MjI7czoxOToiam9lZG91ODdAbm9tYWlsLmNvbSI7aToyMztzOjE3OiIlQGFkbWluaXN0cndwLmNvbSI7aToyNDtzOjE3OiJlY2hvbGwlQGdtYWlsLmNvbSI7aToyNTtzOjE3OiJzdXBlcnVzZXIlQHlhaG9vJSI7aToyNjtzOjE4OiIlYmFsYW50ZnJvbXN1bi5jb20iO2k6Mjc7czoxOToiJUB3b3JkcHJlc3Mub3JnLmNvbSI7aToyODtzOjI1OiJkci5pbmplY3Rpb25pQGhvdG1haWwuY29tIjtpOjI5O3M6MjE6ImNsZWFuZXJAd29yZGZlbmNlLmNvbSI7aTozMDtzOjIyOiJ3b3JkY2FtcEB3b3JkcHJlc3MuY29tIjtpOjMxO3M6MTc6InRlc3RpbmdAZ21haWwuY29tIjtpOjMyO3M6MjA6InVwZGF0ZUB3b3JkcHJlc3Mub3JnIjtpOjMzO3M6MzU6IndwJF9zeXMkX2FqemJAZGV2LndvcmRwcmVzcy5vcmcuY29tIjtpOjM0O3M6MTQ6ImxpY2tzQG1haW4uY29tIjtpOjM1O3M6Mjc6InN1cHBvcnRAd29yZHByZXNzZW5naW5lLmNvbSI7aTozNjtzOjI1OiJkb2Nzc0Bpbm1vdGlvbmhvc3RpbmcuY29tIjtpOjM3O3M6MjU6InRyYWlud29yZHByZXNzYWlAc2l0ZS5jb20iO2k6Mzg7czoxOToiYXNhZ3JjeWRxeEBuYWlsLmNvbSI7aTozOTtzOjE5OiJhc25xbXpwa3JkQG5haWwuY29tIjtpOjQwO3M6Mjc6ImRvLW5vdC1yZW1vdmVAd29yZHByZXNzLmMwbSI7aTo0MTtzOjExOiIxMjNAYWJjLmNvbSI7aTo0MjtzOjI1OiJnZXJ0cnVkZUBnYW1lY29uc29sZS5zaXRlIjtpOjQzO3M6MjQ6ImNvZGVyYnJ1aEBwcm90b25tYWlsLmNvbSI7aTo0NDtzOjEzOiJjYW1lQGVtYWlsLndwIjtpOjQ1O3M6MTc6IndwZGV2QGhvdG1haWwuY29tIjtpOjQ2O3M6MjM6IndwLXNlY3VyaXR5QGhvdG1haWwuY29tIjtpOjQ3O3M6MjQ6ImNvZGVyYnJ1aEBwcm90b25tYWlsLmNvbSI7aTo0ODtzOjIxOiJ3YWRtaW53QHdvcmRwcmVzcy5jb20iO2k6NDk7czoyMzoib3JkZXJub3dAcHJvdG9ubWFpbC5jb20iO2k6NTA7czoyMjoid3d3YWRtaW5Ad29yZHByZXNzLmNvbSI7aTo1MTtzOjIyOiJkMHJrLmY0MTloNzNyQGdtYWlsLmNvIjt9fXM6NjoiSm9vbWxhIjthOjE6e3M6MjI6IjxQUkVGSVg+dXNlcnMudXNlcm5hbWUiO2E6Nzp7aTowO3M6MjA6Impvb21sYS51c2VyLmhlbHBlci4lIjtpOjE7czoxMToic3VwZXJ1c2VyOCUiO2k6MjtzOjExOiJzdXBlcnVzZXI5JSI7aTozO3M6MTE6InN1cGVydXNlcjElIjtpOjQ7czo4OiJuZXdhZG1pbiI7aTo1O3M6MTg6IndvcmRwcmVzcyRfc3VwcG9ydCI7aTo2O3M6MTI6ImFkbWluc3RyYXRvciI7fX1zOjc6Ik1hZ2VudG8iO2E6MTp7czoyNzoiPFBSRUZJWD5hZG1pbl91c2VyLnVzZXJuYW1lIjthOjk6e2k6MDtzOjE1OiJzdXBwb3J0LW1hZ2VudG8iO2k6MTtzOjg6InNlY0FkbWluIjtpOjI7czoxMToibWFnZXN1cHBvcnQiO2k6MztzOjY6InN5c21vbiI7aTo0O3M6MTA6IlN1cGVyYWRtaW4iO2k6NTtzOjE0OiJzeXN0ZW0kX2JhY2t1cCI7aTo2O3M6OToibWFnZW50b2t1IjtpOjc7czoxMToibWdudHJlc3RvcmUiO2k6ODtzOjY6Im1hbmdnbyI7fX19' ) );
$DB_USER_SIGNATURES = unserialize( base64_decode( 'YToxOntzOjk6IldvcmRQcmVzcyI7YToxMjp7czozMDoiZGJfdXNlci56ZXJvX2NyZWF0aW9uX3RpbWUuMDAxIjthOjM6e2k6MDtpOjEzO2k6MTtzOjEzOiI8UFJFRklYPnVzZXJzIjtpOjI7czozNDoiVElNRSh1c2VyX3JlZ2lzdGVyZWQpID0gJzAwOjAwOjAwJyI7fXM6MjM6ImRiX3VzZXIudGVjaHN1cHBvcnQuMDAxIjthOjM6e2k6MDtpOjE0O2k6MTtzOjEzOiI8UFJFRklYPnVzZXJzIjtpOjI7czo5MToidXNlcl9sb2dpbiBMSUtFICd0ZWNoc3VwcG9ydCcgQU5EIHVzZXJfZW1haWwgTElLRSAnJyBBTkQgVElNRSh1c2VyX3JlZ2lzdGVyZWQpID0gJzAwOjAwOjAwJyI7fXM6MTk6ImRiX3VzZXIuaHVib3Bzcy4wMDEiO2E6Mzp7aTowO2k6MTQ7aToxO3M6MTM6IjxQUkVGSVg+dXNlcnMiO2k6MjtzOjcwOiJ1c2VyX2VtYWlsIExJS0UgJyVAaHVib3Bzcy5jb20nIEFORCBUSU1FKHVzZXJfcmVnaXN0ZXJlZCkgPSAnMDg6MDk6MjMnIjt9czoyNToiZGJfdXNlci5jb21fZW1haWxfY29tLjAwMSI7YTozOntpOjA7aToxNDtpOjE7czoxMzoiPFBSRUZJWD51c2VycyI7aToyO3M6NjM6InVzZXJfbG9naW4gTElLRSAnY29tJF8lJyBBTkQgdXNlcl9lbWFpbCBMSUtFICdjb20kXyVAZW1haWwuY29tJyI7fXM6MjU6ImRiX3VzZXIuY29tX2VtYWlsX2NvbS4wMDIiO2E6Mzp7aTowO2k6MTQ7aToxO3M6MTM6IjxQUkVGSVg+dXNlcnMiO2k6MjtzOjk2OiJ1c2VyX2xvZ2luIFJFR0VYUCAnY29tW2EtejAtOV0qW0EtWl0rJyBBTkQgdXNlcl9lbWFpbCBSRUdFWFAgJ2NvbVthLXowLTldKltBLVpdK1teQF0qQGVtYWlsLmNvbSciO31zOjIyOiJkYl91c2VyLmNvbnRyb2xsZXIuMDAxIjthOjM6e2k6MDtpOjE0O2k6MTtzOjEzOiI8UFJFRklYPnVzZXJzIjtpOjI7czoyOToidXNlcl9sb2dpbiBMSUtFICdjb250cm9sbGVyJSciO31zOjIxOiJkYl91c2VyLmFkbWluX2NvbS4wMDEiO2E6Mzp7aTowO2k6MTQ7aToxO3M6MTM6IjxQUkVGSVg+dXNlcnMiO2k6MjtzOjY0OiJ1c2VyX2xvZ2luIExJS0UgJ2FkbWlubGluJyBBTkQgdXNlcl9lbWFpbCBMSUtFICdhZG1pbkBhZG1pbi5jb20nIjt9czoyMDoiZGJfdXNlci5uYWlsX2NvbS4wMDEiO2E6Mzp7aTowO2k6MTQ7aToxO3M6MTM6IjxQUkVGSVg+dXNlcnMiO2k6MjtzOjM4OiJ1c2VyX2VtYWlsIFJFR0VYUCAnW2Etel17MTB9QG5haWwuY29tJyI7fXM6MjI6ImRiX3VzZXIubG9naW5fc3BhbS4wMDEiO2E6Mzp7aTowO2k6MTQ7aToxO3M6MTM6IjxQUkVGSVg+dXNlcnMiO2k6MjtzOjY3OiJ1c2VyX2xvZ2luIFJFR0VYUCAnKGNoYXR8bWVldHxkYXRlKSBbOmFscGhhOl0rIGFuZCBbOmFscGhhOl0rIHd3dy4nIjt9czoyMjoiZGJfdXNlci5sb2dpbl9zcGFtLjAwMiI7YTozOntpOjA7aToxNDtpOjE7czoxMzoiPFBSRUZJWD51c2VycyI7aToyO3M6NTM6InVzZXJfbG9naW4gUkVHRVhQICdbOmFscGhhOl0rIGhhcyBzZW50IHlvdSBbOmRpZ2l0Ol0nIjt9czoyMjoiZGJfdXNlci5sb2dpbl9zcGFtLjAwMyI7YTozOntpOjA7aToxNDtpOjE7czoxMzoiPFBSRUZJWD51c2VycyI7aToyO3M6Nzc6InVzZXJfbG9naW4gUkVHRVhQICdbOmFscGhhOl0rIFs6YWxwaGE6XSsgaHR0cHNbOmFscGhhOl0rW146YWxwaGE6XVs6YWxwaGE6XSsnIjt9czoyMjoiZGJfdXNlci5sb2dpbl9zcGFtLjAwNCI7YTozOntpOjA7aToxNDtpOjE7czoxMzoiPFBSRUZJWD51c2VycyI7aToyO3M6NjE6InVzZXJfZW1haWwgUkVHRVhQICd0ZXN0WzpkaWdpdDpdWzpkaWdpdDpdK0BtYWlsLmltYWlsZnJlZS5jYyciO319fQ==' ) );
$DB_NOCLEAN_FOR_ROBOT = unserialize( base64_decode( 'YTo3OntzOjIzOiJpbmplY3RlZC5oaWRkZW4tZGl2LjAwMSI7aToxO3M6MjM6ImluamVjdGVkLmhpZGRlbi1kaXYuMDA3IjtpOjE7czoyNDoiaW5qZWN0ZWQuaGlkZGVuLXNwYW4uMDAxIjtpOjE7czozMToiaW5qZWN0ZWQuanNfY3JlYXRlX2RvY3VtZW50LjAwMyI7aToxO3M6MzM6ImluamVjdGVkLmpzX2RvY3VtZW50X2xvY2F0aW9uLjAwNyI7aToxO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDA3IjtpOjE7czoyODoiaW5qZWN0ZWQuanNfY2xpY2tfaGlqYWNrLjAwMSI7aToxO30=' ) );
$DB_SIGS = unserialize( base64_decode( 'YTo0OTI6e3M6NzoiPHNjcmlwdCI7YTo3Njp7aTowO2k6MTA7czozOiJzcmMiO2E6MTk2OntpOjA7aToxMDtzOjg6Ii8vIGIzNzRrIjthOjI6e2k6MDtpOjEwO3M6MTY6ImZ1bmN0aW9uIHBraWxsKCkiO2E6Mjp7aTowO3M6MTg6ImJhY2tkb29yLnNoZWxsLjAwNSI7aToxO3M6MzQ6In48XD9waHBbXHNdKlwvXC8gYjM3NGtbXlx4MDJdK1w/Pn4iO319czoxMjoiLnNwbGl0KCJ8Iik7IjthOjI6e2k6MDtpOjEwO3M6Njc6IikuaW5uZXJIVE1MID0gJzxpZnJhbWUgZnJhbWVib3JkZXI9IjAiIHdpZHRoPSIwIiBoZWlnaHQ9IjAiIHNyYz0iJysiO2E6Mjp7aTowO3M6MjM6ImluamVjdGVkLmhpZGRlbi1kaXYuMDQ1IjtpOjE7czoyMTU6In48ZGl2IGlkPS5bXj5dKz5bXHNdKjwuZGl2Pltcc10qPHNjcmlwdFtePl0rPltcc10qdmFyIFtcd10rW1xzXSo9W1xzXSpbXjtdKztbXHNdKnZhciBbXHddK1tcc10qPVtcc10qW1x3XStcLnNwbGl0XCguXHwuXCk7W1xzXSp2YXIgW1x3XStbXHNdKj1bXHNdKltcd10rXFtbXGRdK1xdW1xzXSpcK1teO10rO1tcc10qZG9jdW1lbnRcLlteO10rO1tcc10qPC5zY3JpcHQ+W1xzXSp+Ijt9fXM6MjE6Imh0dHA6Ly9hZS5hd2F1ZS5jb20vNyI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wMjEiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoyMjoiaHR0cDovL2llLmVyYWNvdS5jb20vMyI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wMjIiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoyMToiaHR0cDovL2FvLmV1dWF3LmNvbS85IjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjAyMyI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjIyOiJodHRwOi8vdWUub2Vhb3UuY29tLzMxIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjAyNCI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjIwOiJodHRwOi8vYWVhYWVhLmNvbS9vdSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wMjUiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoyMDoiaHR0cDovL3NlY3JlZS5jb20vcmUiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDI2IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MjA6Imh0dHA6Ly91b2F1ZXIuY29tL3NpIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjAyNyI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjIwOiJodHRwOi8vb2Vvb2VhLmNvbS92ZSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wMjgiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoyMToiaHR0cDovL3NlY29uZW8uY29tL29uIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjAyOSI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjIwOiJodHRwOi8vc2Vjb3dvLmNvbS93byI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wMzAiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoyMDoiaHR0cDovL291cm91ZS5jb20vc2UiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDMxIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6NDI6Imh0dHA6Ly9qcy50cmFmZmljYW5hbHl0aWNzLm9ubGluZS9qcy9qcy5qcyI7YToyOntpOjA7czoyNDoiYmFja2Rvb3IuanNfbmV1dHJpbm8uMDAxIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTg6InJlc3R3cC5tb2JpZGVhLmNvbSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wNjQiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoxNDoiaHR0cHM6Ly9pcy5nZC8iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLnVybF9zaG9ydGVuZXIuMDAxIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTY6InZvaXBuZXdzd2lyZS5uZXQiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDg5IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTE6ImNwbWF0aWsuY29tIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjA5MCI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjE2OiJnbGFzc3N1bnNoaW5lLmNmIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjA5MSI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjE1OiJzdW5pZ2xhc3Nlcy5jb20iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDkyIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTI6ImV4YW1ob21lLm5ldCI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wOTQiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoxNzoidXVzdG91Z2h0b25tYS5vcmciO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDk3IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTY6ImRydXBhbHVwZGF0ZXMudGsiO2E6Mjp7aTowO3M6MjM6Im1hbHdhcmUuY3J5cHRvbWluZXIuMDEwIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MjE6Imh0dHBzOi8vbWFnZW50by5uYW1lLyI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xMDIiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoyMjoiaHR0cDovL3Jvc2EtdGVtYS5pbmZvLyI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wMzIiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czozMjoiaHR0cDovL2J3aW5wb2tlcjI0LmNvbS9jbGljazcuanMiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDMzIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6NDc6Imh0dHA6Ly93ZWxjb21ldG90aGVnbG9iYWxpc29yZy5jb20vanMucGhwP2trPTI2IjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjAzNCI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjQ5OiJodHRwOi8vZ2xvYmFscG93ZXJpbmdnYXRoZXJpbmdvbi5jb20vbGwucGhwP2trPTE2IjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjAzNSI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjI5OiJodHRwOi8vaW5qai5pZ25vcmVsaXN0LmNvbS8xNCI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wMzYiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czo1NjoiaHR0cDovL2NvdW50ZXI1LmFsbGZyZWVjb3VudGVyLmNvbS9wcml2YXRlL2NvdW50ZXIuanM/Yz0iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDM3IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6NDM6Imh0dHA6Ly9zd2VlcHN0YWtlc2FuZGNvbnRlc3RzZG8uY29tL3BtZy5waHAiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDM4IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6NDY6Imh0dHA6Ly9zd2VlcHN0YWtlc2FuZGNvbnRlc3RzZG8uY29tL25sLnBocD9wPWQiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDM5IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MzQ6Imh0dHA6Ly9hc2F1bmlyZy5jb20uYnIvanMvMGRheS5waHAiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDQwIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MzY6Imh0dHA6Ly9kZW55Ym9uZmFudGUuY29tL2FwcC9NZW51LnBocCI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wNDEiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czozMzoiaHR0cDovL2xpZy1saW1wLmNvbS5ici9yZWJvdHMucGhwIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjA0MiI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjIwOiIkZG9tYWluL2xsLnBocD9raz0xMSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wNDMiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czozNzoiaHR0cDovL3dvcmRwcmVzcy11cGRhdGUuY29tL2dvb2dsZS5qcyI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wNDQiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czo0MzoiLy8wMDU1ZDdiLm5ldHNvbGhvc3QuY29tL0Jsb2cvbGliMi9qcy9qcy5qcyI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wNDUiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czo0MToiaHR0cDovL2Fkcy5nb29nbGVhZHNlcnZpY2VzLmF0L2NvdW50ZXIuanMiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDQ2IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MzA6Imh0dHBzOi8vZGF0YWluZm9ybWVyeC5ldS9ldS5qcyI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wNDciO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoyNToianMtY2xvdWQuY29tL2pzL3N0YXRpYy5qcyI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wNzUiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoxMzoiYWxlaW52ZXN0Lnh5eiI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wNjciO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoxNzoiaWRpb21hc2Vudml2by5jb20iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDY4IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTk6Imh0dHA6Ly9hbGVtb25leS54eXoiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDcxIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6Mjg6InRyYWZmaWNleGNoYW5nZXIuYml6L21haW4uanMiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDczIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MjE6InN0YXRzLnN0YXJ0cmVjZWl2ZS50ayI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wNzgiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoxNzoib25saW5lY2xvdWRzLmluZm8iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDc5IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTU6IjovL3Bhc3RlYmluLmNvbSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wNDgiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoxOToiLy9nb2Z1cm5pdHVyZS5jby51ayI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wNDkiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoxNjoiaHR0cDovL25pbm5pLm9yZyI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wNTAiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoyMzoiLy9zdGF0aWMtNDY3Ny5reGNkbi5jb20iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDUxIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6Mzg6Imh0dHBzOi8vd3d3LndlYnN0YXQuY2MvbWVkaWEvY29va2llLmpzIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjA1MiI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjM5OiJodHRwOi8vd3d3LmJsb2cucGFzYXJzb3JlLmNvbS93cC1hZG1pbi8iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDUzIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MzI6Imh0dHA6Ly93d3cuZ2V0LnNwYWNlL3dwLWNvbnRlbnQvIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjA1NCI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjMwOiJodHRwOi8vd3d3LndlbGRpbXBleC5odS9tZWRpYS8iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDU1IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MzY6Imh0dHA6Ly93d3cuaGNpZnguY29tL3Ryb3llbmdlbGhhcmR0LyI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wNTYiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoxNToiaHR0cHM6Ly9nb28uZ2wvIjthOjI6e2k6MDtzOjIyOiJiYWNrZG9vci5qc19nb29fZ2wuMDAxIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MjA6Imh0dHA6Ly9nb28uZ2wvQnRGVlBkIjthOjI6e2k6MDtzOjI1OiJiYWNrZG9vci5qc19nb29fZ2wuMDAxLjAyIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6NTE6Ii8vd3d3LmhlcmJhbHNob3BwZS5jb20vanMvc2NyaXB0YWN1bG91cy9lbGVtZW50cy5qcyI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wNTciO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoxOToiaHR0cDovL2EuYzA1OTQuY29tLyI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wNjAiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoxMjoianMtcmVhY3QuY29tIjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjA1MSI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjE2OiJjcmVhdGl2ZXRlaHMuY29tIjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjA1NiI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjIwOiJtYWdlbnRvLXNlY3VyaXR5Lm9yZyI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wNTIiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czo0MToiYWRuZXR3b3JrcGVyZm9ybWFuY2UuY29tL2EvZGlzcGxheS5waHA/cj0iO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLmpzX3Vud2FudGVkX2Fkcy4wMDgiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czo0NDoicmVkaXJlY3RfYmFzZS9yZWRpcmVjdC5qcyIgaWQ9IjEzNzE0OTkxNTU1NDUiO2E6Mjp7aTowO3M6Mjk6ImluamVjdGVkLm1hZ2VudG9fcmVkaXJlY3QuMDAxIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTI3OiIvd3AtY29udGVudC8tLXBsdWdpbnMub2xkL3dwLXBvcHVwLXNjaGVkdWxlci9lZGl0b3IvanNjcmlwdHMvdGlueV9tY2UvcGx1Z2lucy9pbmxpbmVwb3B1cHMvc2tpbnMvY2xlYXJsb29rczIvYWN0aW9uX3JlcXVlc3QucGhwIjthOjI6e2k6MDtzOjIyOiJiYWNrZG9vci53cC1wb3BfdXAuMDAxIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6NDc6InMzLmFtYXpvbmF3cy5jb20vY2FzaGUtanMvMTQzZTdjZGViZjE5M2QyNzY0LmpzIjthOjI6e2k6MDtzOjI5OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjA4MC4wNCI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjc6ImN1ZXYuaW4iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDgxIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTA6Imh2YXRvLmluZm8iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDgyIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6Mjc6InNjcmlwdC5jcmVhdGl2ZXNjZW5lc2VzLmNvbSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wODMiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoyMDoiaW5mb2FuYWx5dGljcy50b29scy8iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDg0IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTU6ImVsdXhlci5uZXQvY29kZSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wODUiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czozMDoicmF3Z2l0LmNvbS9zc25uaXBwZXJyL3JlZGlyZWN0IjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjA4NiI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjEyOiJwb29yZ2VuLm5ldC8iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDg3IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MjA6ImNkbi53aWRnZXRzZXJ2ZXIuY29tIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjA5OCI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjEyOiJtYWdlbnRvLm5hbWUiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDk5IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTI6Imhhc2hpbmcud2luLyI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xMDAiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoxNzoiaG90b3Bwb25lbnRzLnNpdGUiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMTAxIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTc6IndhcDRkb2xsYXIuY29tL2FkIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjEwMyI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjE0OiJsb2Fkc291cmNlLm9yZyI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xMDQiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoxNToiY29vbHBhZ2VjdXAuY29tIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjEwNSI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjE2OiJjZG5hbmFseXRpY3MubmV0IjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjEwNiI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjEyOiJzY3JiaXppbS54eXoiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMTA3IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTk6ImpzY29udHJvbGxlci5zdHJlYW0iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMTA4IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTc6ImNkbi5mdXNlLWRhdGEuY29tIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjExMSI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjEyOiJzYXNrbWFkZS5uZXQiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMTEyIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTM6ImRvd2xleHRmZi5jb20iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMTEzIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTg6ImFqYXguZ29vcWxlYXBpLmNvbSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xMTQiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoxNjoiY291bnRzb3VyY2UuY29vbCI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xMTUiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czo5OiJjZG43Ny5vcmciO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMTE2IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTU6Im1hZ2VudG9jb3JlLm5ldCI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQubWFnZW50b19zaG9wbGlmdC4wMDMuMDIiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoxMToibWluaWpzLmluZm8iO2E6Mjp7aTowO3M6Mjk6ImluamVjdGVkLm1hZ2VudG9fc2hvcGxpZnQuMDA2IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6Mjg6InRyYWZmaWN0cmFkZS5saWZlL3NjcmlwdHMuanMiO2E6Mjp7aTowO3M6MjM6ImluamVjdGVkLmpzX21hbHdhcmUuMDAxIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTE6IjAyMGhhaXIuY29tIjthOjI6e2k6MDtzOjI5OiJpbmplY3RlZC5tYWdlbnRvX3Nob3BsaWZ0LjAwNyI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjEzOiJleHRjb29sZmYuY29tIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjExOCI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjIwOiJmb3J3YXJkbXl0cmFmZmljLmNvbSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xMjAiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoxMjoiZWxlZ3JpbmEuY29tIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjEyMSI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjE5OiJibHVlZXllc3dlYnNpdGUuY29tIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjEyMiI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjE4OiJvbmxpbmVjbG91ZHMuY2xvdWQiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMTIzIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTI6InN0YXRzcmMuY29vbCI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xMjQiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoyMDoic2ltcGxlb25lbGluZS5vbmxpbmUiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMTI1IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTM6ImFkcmVxdWVzdC54eXoiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMTI2IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTY6Imd0YWdtYW5hZ2Vycy5jb20iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMTI3IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MjE6Im1hZ2VudG8tYW5hbHl0aWNzLmNvbSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xMjgiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoxNDoianF1ZXJ5LXdlYi5jb20iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMTI5IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTc6ImdldG15bGFuZGluZy5zaXRlIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjEzMCI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjE0OiJsaWtlbXl0ZXN0cy5wdyI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xMzEiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoxOToic29tZWxhbmRpbmdwYWdlLmNvbSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xMzIiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoyMzoiY2EtcHViLTQ1MDMwOTAxNzE3NzA0MjQiO2E6Mjp7aTowO3M6MjQ6ImpzLnNwYW0tc2VvLmJvZ3VzX2FkLjAwMSI7aToxO3M6MTkzOiJ+PHNjcmlwdCBhc3luYyBzcmM9Li4ucGFnZWFkMi5nb29nbGVzeW5kaWNhdGlvblwuY29tW14+XSs+PC5zY3JpcHQ+W1xzXSo8aW5zIGNsYXNzPS5hZHNieWdvb2dsZVtePl0rY2EtcHViLTQ1MDMwOTAxNzE3NzA0MjQuW14+XSs+W1xzXSo8Lmlucz5bXHNdKjxzY3JpcHQ+W1xzXSpcKGFkc2J5Z29vZ2xlW1xzXSo9W14+XSs8LnNjcmlwdD5+Ijt9czoxNToiZGFuY2V3aXRobWUuYml6IjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjEzNSI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjExOiJkb2xvaGVuLmNvbSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xMzYiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoyMjoiYXBwcy5jYXJlc2VhcmNoLmNvbS5hdSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xMzciO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoyMjoid3d3LnRhcmdldGludGVybmV0LmNvbSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xMzgiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoxNjoieW91cnNlcnZpY2UubGl2ZSI7YToyOntpOjA7czoyOToiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xMzkuMDIiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoxNzoiYmxhY2thd2FyZGFnby5jb20iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMTQwIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6NDg6In5cL3N0YXRzLmpzXD9bXHddPVtcd11cJi4gdHlwZT0udGV4dC5qYXZhc2NyaXB0fiI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xNDEiO2k6MTtzOjgzOiJ+PHNjcmlwdFtcc10qc3JjW1xzXSo9W1xzXSouaHR0cHM/OltePl0rc3RhdHNcLmpzXD9bXHddPVtcd11cJltePl0rPltcc10qPC5zY3JpcHQ+fiI7fXM6MjM6InNpdGV2ZXJpZmljYXRpb24ub25saW5lIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjE0MiI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjE5OiJvcGVuY2FydG1vZHVsZXMuYml6IjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjE0MyI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjIwOiJnb29nbGV0YWduYW1hZ2VyLmNvbSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xNDQiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoxNToibG9jYWxzdG9yYWdlLnRrIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjE0NSI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjE5OiJnb2dsZXRhZ21hbmFnZXIuY29tIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjE0NiI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjE4OiJjaGFsbGVuZ2Vmb3JtZS5jb20iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMTQ3IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MjY6Imdvb2dsZWFkc2VydmljZXNvbmxpbmUuY29tIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjE0OSI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjEwOiJyOXdlYnMuY29tIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjE1MSI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjE1OiJ3ZWJ0b29sc2FwcC5jb20iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMTUyIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MjE6ImJlbGF0ZXJiZXdhc3RoZXJlLmNvbSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xNTMiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoyNjoiY3JlYXRlcmVsYXRpdmVjaGFuZ2luZy5jb20iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMTU0IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MjM6InBsMTUxODA3NzMucHZjbG91ZHMuY29tIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjE1NSI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjE4OiJwNzk0NzkuY2xrc2l0ZS5jb20iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMTU2IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6ODE6IjsmcGVyaW9kOyYjeDYxOyYjeDcwOyYjeDcwOyYjeDY1OyYjeDZFOyYjeDY0OyYjeDQzOyYjeDY4OyYjeDY5OyYjeDZDOyYjeDY0OyZscGFyOyI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQuanNfcmVkaXJlY3QuMDMwIjtpOjE7czoxMTU6In48c2NyaXB0W14+XSs7JnBlcmlvZDsmI3g2MTsmI3g3MDsmI3g3MDsmI3g2NTsmI3g2RTsmI3g2NDsmI3g0MzsmI3g2ODsmI3g2OTsmI3g2QzsmI3g2NDsmbHBhcjtbXj5dKz5bXHNdKjwuc2NyaXB0Pn4iO31zOjIyOiJ0cmFzbmFsdGVteXJlY29yZHMuY29tIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjE1NyI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjE2OiJidXlpdHRyYWZmaWMuY29tIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjE1OCI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjE3OiJ3b3JsZGN0cmFmZmljLmNvbSI7YToyOntpOjA7czoyOToiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xNTguMDIiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoyMzoiZ3JlZW5sYWJlbGZyYW5jaXNjby5jb20iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMTU5IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTU6ImdvdG9zZWNvbmQyLmNvbSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xNjAiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoyMToiLmFkbWFya2V0bG9jYXRpb24uY29tIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjE2MSI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjE3OiIuYWRzZm9ybWFya2V0LmNvbSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xNjIiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoyMToiYXB1LnBocD96b25laWQ9Njc2NjMwIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjE2MyI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjE5OiJkZXN0aW55ZmVybmFuZGkuY29tIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjE2NCI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjI1OiJwcml2YWN5bG9jYXRpb25mb3Jsb2MuY29tIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjE2NSI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjIyOiJ3aGVyZWRveW91Y29tZWZyb20ub3ZoIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjE2NiI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjIzOiJ3d3cuZnJlZWNvdW50ZXJzdGF0LmNvbSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xNjciO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoyMjoidmVyeWJlYXRpZnVsYW50b255LmNvbSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xNjkiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoxNDoic3RhdC1ncm91cC5jb20iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMTcwIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTQ6Im1laWRpYXBsdXMuY29tIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjE3MSI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjIxOiJjb2xsZWN0ZmFzdHRyYWNrcy5jb20iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMTcyIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6OToici5hYmEub29vIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjE3MyI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjIwOiJyZXNvbHV0aW9uZGVzdGluLmNvbSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xNzQiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoxOToic2NyaXB0YWxpY2lvdXMuaW5mbyI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xNzUiO2k6MTtzOjU3OiJ+PHNjcmlwdFtePl0rc2NyaXB0YWxpY2lvdXNcLmluZm9bXj5dKz5bXHNdKig8LnNjcmlwdD4pP34iO31zOjIwOiJsZWFybmluZ3Rvb2xraXQuY2x1YiI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xNzYiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoyMjoiZ29vZ2xlLWFuYWx5dGNzYXBpLmNvbSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xNzciO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoxODoic3RpdmVuZmVybmFuZG8uY29tIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjE3OCI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjIxOiJ0cmFja3N0YXRpc3RpY3Nzcy5jb20iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMTc5IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTY6ImRpZ2VzdGNvbGVjdC5jb20iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMTgwIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6NzY6IjxzY3JpcHQgc3JjPSJkYXRhOnRleHQvaHRtbDtiYXNlNjQsYVdZZ0tIUjVjR1Z2WmlCS1UwOU9JQ0U5UFNBaWIySnFaV04wSWlrZ2UiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMTE1IjtpOjE7czo2MToifjxzY3JpcHQgc3JjPS5kYXRhOnRleHQuaHRtbDtiYXNlNjQsYVdZZ0tIUjVjW14+XSs+PC5zY3JpcHQ+fiI7fXM6MjA6ImRldmVsb3BmaXJzdGxpbmUuY29tIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjE4MSI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjIyOiJkb250c3RvcHRoaXNtdXNpY3MuY29tIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjE4MiI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjMyOiJodHRwczovL2FwaWJhemFhcnZvaWNlLmNvbS9idi5qcyI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xODMiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czozMToiaHR0cHM6Ly9ibGFja2VudGVydGFpbm1lbnRzLmNvbSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xODQiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoxNDoiZmluZ2VybGluZy5vcmciO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMTg1IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTY6Im1hZ2VudG8tYXBpLmhvc3QiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMTg2IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTY6ImJ1bGxnb2VzZG93bi5jb20iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMTg3IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTY6ImxvYmJ5ZGVzaXJlcy5jb20iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMTg4IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTc6ImxldHNtYWtlcGFydHkzLmdhIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjE4OSI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjE4OiJkZXZlbG9wZXJzdGF0c3MuZ2EiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMTkwIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MjM6ImRvbmF0ZWxsb2Zsb3dmaXJzdGx5LmdhIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjE5MSI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjE5OiJsb3dlcmJlZm9yd2FyZGVuLm1sIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjE5MiI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjE1OiJwb3BvbmNsaWNrLmluZm8iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMTkzIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTc6ImNkbmJvb3RzdHJhcC5ob3N0IjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjE5NCI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjEzOiJtaWxrcGxvYWQubmV0IjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjE5NiI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjExOiJoYXBweWtpZC5pbiI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xOTciO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoyMDoibWFnZW50by1mZWVkYmFjay5jb20iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMTk4IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MjE6Imxvd2VydGhlbnNreWFjdGl2ZS5nYSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xOTkiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoxMToiZzk4Lm1vbnN0ZXIiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMjAwIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTM6InBpbmdjbG9jay5uZXQiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMjAyIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTI6InNvZGFwb3AuYnV6eiI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4yMDQiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoxODoiYmFua2luZ2NvbmNlZGUuY29tIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjIwNSI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjE2OiJ3Z2F0NWxuMndseTguY29tIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjIwNiI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjE5OiJqcXVlcnktYW5hbHlzaXMuY29tIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjIwNyI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjE1OiJkb250a2luaG9vb3QudHciO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMjA4IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MjM6InRyYXZlbGZvcm5hbWV3YWxraW5nLmdhIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjIwOSI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjE5OiJsb3ZlZ3JlZW5wZW5jaWxzLmdhIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjIxMCI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjEwOiJnb3JhcHMuY29tIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjIxMSI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjg6ImpzbWluLmNvIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjIxMiI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjE4OiJoaXR0YWlsLmNvbS9tbHQuanMiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMjEzIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTY6InBpdGVycmVjZWl2ZXIuZ2EiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMjE0IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTU6IndvZHJwcmVzcy5wcC51YSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4yMTUiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoxMToiZ29vZ2FwaS5jb20iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMjE2IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6Mjc6ImFpcmxpbmVyYXBwZXRpemluZ2NvYXN0LmNvbSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4yMTciO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoyMjoic3RvcmVyaWdodGRlc2ljaW9uLmNvbSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4yMTgiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoyNjoibmF0dXJhbGZyZXNobWFsbC5jb20vaW1hZ2UiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMTY5IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6ODoiZ282cy5iaXoiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMjE5IjtpOjE7czo0NjoifjxzY3JpcHRbXj5dK2dvNnNcLmJpeltePl0rPltcc10qKDwuc2NyaXB0Pik/fiI7fXM6MTE6Im9wdG91dC9zZXQvIjthOjI6e2k6MDtpOjEwO3M6OToiP2pzb25wPV9fIjthOjI6e2k6MDtzOjE3OiJpbmplY3RlZC5sbmtyLjAwMyI7aToxO3M6MzU2OiJ+KDxzY3JpcHQgW148Pl0qc3JjPVsiJ11bXiInXSo/XC9cL1tcd1wtXC5dK1wvW14iJ10qKD86bG5rcjVcLm1pblwuanN8bG5rcjMwX250XC5taW5cLmpzfG9wdG91dFwvc2V0XC9cdytcP2pzb25wPV9ffFswLTlhLWZdezE4fVwuanN8XC93aGl0ZWxpc3RcL1xkezR9XC98anNcL2ludC5qc1w/a2V5PVswLTlhLWZdezQwfSZhbXA7dWlkPXxcP2tleT1bMC05YS1mXXs0MH0mYW1wO3VpZD1cZHs0fXh8dmFsaWRhdGUtc2l0ZVwuanNcP3VpZD1cZHs1fXh8YVwvZGlzcGxheS5waHBcP3I9fCZhbXA7ZXh0PU5vdCUyMHNldHxjb2RlXD9pZD1cZHszfSZhbXA7c3ViaWQ9KVteIiddKlsiJ11bXjw+XSo+XHMqPFwvc2NyaXB0PlxzKikrfiI7fX1zOjE1OiIvanMvaW50LmpzP2tleT0iO2E6Mjp7aTowO3M6MTc6ImluamVjdGVkLmxua3IuMDAxIjtpOjE7czozNTY6In4oPHNjcmlwdCBbXjw+XSpzcmM9WyInXVteIiddKj9cL1wvW1x3XC1cLl0rXC9bXiInXSooPzpsbmtyNVwubWluXC5qc3xsbmtyMzBfbnRcLm1pblwuanN8b3B0b3V0XC9zZXRcL1x3K1w/anNvbnA9X198WzAtOWEtZl17MTh9XC5qc3xcL3doaXRlbGlzdFwvXGR7NH1cL3xqc1wvaW50LmpzXD9rZXk9WzAtOWEtZl17NDB9JmFtcDt1aWQ9fFw/a2V5PVswLTlhLWZdezQwfSZhbXA7dWlkPVxkezR9eHx2YWxpZGF0ZS1zaXRlXC5qc1w/dWlkPVxkezV9eHxhXC9kaXNwbGF5LnBocFw/cj18JmFtcDtleHQ9Tm90JTIwc2V0fGNvZGVcP2lkPVxkezN9JmFtcDtzdWJpZD0pW14iJ10qWyInXVtePD5dKj5ccyo8XC9zY3JpcHQ+XHMqKSt+Ijt9czoxOToiYWRkb25zL2xua3I1Lm1pbi5qcyI7YToyOntpOjA7czoxNzoiaW5qZWN0ZWQubG5rci4wMDIiO2k6MTtzOjM1Njoifig8c2NyaXB0IFtePD5dKnNyYz1bIiddW14iJ10qP1wvXC9bXHdcLVwuXStcL1teIiddKig/Omxua3I1XC5taW5cLmpzfGxua3IzMF9udFwubWluXC5qc3xvcHRvdXRcL3NldFwvXHcrXD9qc29ucD1fX3xbMC05YS1mXXsxOH1cLmpzfFwvd2hpdGVsaXN0XC9cZHs0fVwvfGpzXC9pbnQuanNcP2tleT1bMC05YS1mXXs0MH0mYW1wO3VpZD18XD9rZXk9WzAtOWEtZl17NDB9JmFtcDt1aWQ9XGR7NH14fHZhbGlkYXRlLXNpdGVcLmpzXD91aWQ9XGR7NX14fGFcL2Rpc3BsYXkucGhwXD9yPXwmYW1wO2V4dD1Ob3QlMjBzZXR8Y29kZVw/aWQ9XGR7M30mYW1wO3N1YmlkPSlbXiInXSpbIiddW148Pl0qPlxzKjxcL3NjcmlwdD5ccyopK34iO319czo4OiJmdW5jdGlvbiI7YToyNjp7aTowO2k6MTA7czoxMjoiZnVuY3Rpb24oXzB4IjthOjk6e2k6MDtpOjEwO3M6NDI6IjtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7alF1ZXJ5KGZ1bmN0aW9uKF8weCI7YToyOntpOjA7aToxMDtzOjIzOiJ4NjNceDY4XHg2MVx4NkVceDY3XHg2NSI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wMTEiO2k6MTtzOjIyNToifjxzY3JpcHQ+XHMqdmFyXHMqXzB4XHcrPVxbIi54NjMueDY4Lng2MS54NkUueDY3Lng2NVteXF1dK1xdKztzZXRUaW1lb3V0XChmdW5jdGlvblwoXClce2pRdWVyeVwoZnVuY3Rpb25cKF8weFx3KyhbXjtdKzspK1teLF0rLGRhdGE6W146XSs6XzB4W14sXSssZGF0YVR5cGU6XzB4W15cfV0rXH0sZXJyb3I6ZnVuY3Rpb25bXn1dK1x9XH1cKVx9XH1bXixdKyxcZHswLDEwfVwpXHMuLnNjcmlwdD5+Ijt9fXM6MTU6InNldEludGVydmFsKF8weCI7YToyOntpOjA7aToxMDtzOjEyOToifjxzY3JpcHRbXj5dKj5bXHNdKnZhciBfMHhbXHddK1tcc10qPVtcc10qXFtbXlxdXXsxNTAwLH1cXTtbXHNdKlwoZnVuY3Rpb25cKF8weFteXG5dK3NldEludGVydmFsXChfMHhbXHddK1teO10rXCk7W1xzXSo8LnNjcmlwdD5+IjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjEyNSI7aToxO3M6MTI5OiJ+PHNjcmlwdFtePl0qPltcc10qdmFyIF8weFtcd10rW1xzXSo9W1xzXSpcW1teXF1dezE1MDAsfVxdO1tcc10qXChmdW5jdGlvblwoXzB4W15cbl0rc2V0SW50ZXJ2YWxcKF8weFtcd10rW147XStcKTtbXHNdKjwuc2NyaXB0Pn4iO319czoyMToifSxkZWNvZGU6ZnVuY3Rpb24oXzB4IjthOjI6e2k6MDtpOjEwO3M6Mjc6Il1dKCksQ3Z2OmpRdWVyeShkb2N1bWVudFtfJCI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4xNDgiO2k6MTtzOjEzNToifnZhciBbXHdcJF0rPVwoZnVuY3Rpb25cKF8weFteXCldK1wpXHt2YXIgXzB4W1x3XSs9XzB4W1x3XStcLmxlbmd0aDt2YXIgXzB4W1x3XSs9XFtcXTtmb3JcKHZhclteXG5dK3JldHVybiBfMHhbXHddK1x9XH1cfSxbXGRdK1wpW1xzXSp+Ijt9fXM6NDoiYXRvYiI7YTo0OntpOjA7aToxMDtzOjIyOiJ3aGlsZSghIVtdKXt0cnl7dmFyIF8wIjthOjQ6e2k6MDtpOjEwO3M6MTE6IildKGF0b2IsXzB4IjthOjM6e2k6MDtpOjEwO3M6NDQ6IntyZXR1cm4gYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoXzB4IjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjE2MCI7aToxO3M6MjA3OiJ+dmFyW1xzXSpbXHddKz1bXHNdKlxbLltcd10rLixbXjtdKztbXHNdKnZhcltcc10qW1x3XSs9ZnVuY3Rpb25cKFtcd10rLFteXCFdK1wpO1x9O3doaWxlXCghIVxbXF1cKVx7dHJ5XHt2YXJbXHNdKltcd10rPXBhcnNlSW50XChbXkBdK1wpO1x9O2pRdWVyeVwoW1x3XStcKVxbW1x3XStcKFtcd10rLFtcd10rLFtcd10rLFtcd10rXClcXVwoW1x3XStcKTtcfVwpO34iO31zOjUyOiJ+PHNjcmlwdFtePl0qPlxzKmZ1bmN0aW9uIF8weFx3K1woXClce3ZhciBfMHhcdys9XFt+IjthOjI6e2k6MDtzOjI2OiJoYWNrdG9vbC5jYy1zdGVhbGVyLjE2MC4wMyI7aToxO3M6MTQ1OiJ+PHNjcmlwdFtePl0qPlxzKmZ1bmN0aW9uIF8weFx3K1woXClce3ZhciBfMHhcdys9XFtbXjxdK3doaWxlXCghIVxbXF1cKVx7dHJ5e3ZhciBfMHguK2VuY29kZVVSSUNvbXBvbmVudCxsb2NhdGlvbltePF0rXClcXVwoYXRvYixfMHguKz88LnNjcmlwdD5+Ijt9fXM6Nzc6In48c2NyaXB0W14+XSo+XHMqXChmdW5jdGlvblwoXzB4XHcrLF8weFx3K1wpXHt2YXIgXzB4XHcrPV8weFx3K1woXCk7ZnVuY3Rpb25+IjthOjI6e2k6MDtzOjI2OiJoYWNrdG9vbC5jYy1zdGVhbGVyLjE2MC4wMiI7aToxO3M6MTY2OiJ+PHNjcmlwdFtePl0qPlxzKlwoZnVuY3Rpb25cKF8weFx3KyxfMHhcdytcKVx7dmFyIF8weFx3Kz1fMHhcdytcKFwpO2Z1bmN0aW9uW148IV0rO313aGlsZVwoISFcW1xdXClce3RyeVx7dmFyW15cbl0rPydQT1NUJ1teXG5dKz9cXVwoYXRvYixbXj5dK1woalF1ZXJ5W148XSs8LnNjcmlwdD5+Ijt9czo2OiI6YXRvYigiO2E6Mjp7aTowO3M6MjY6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMTYwLjA0IjtpOjE7czo4ODoifjxzY3JpcHRbXj5dKj5cKD9mdW5jdGlvbltePF0rPS54MjJwYXltZW50W15cbl0rPzphdG9iXChfW14+XStcKF8weFx3K1wpO1x9XCk7PC5zY3JpcHQ+fiI7fX1zOjE0OiJqc2ppYW1pLmNvbS52NiI7YToyOntpOjA7aToxMDtzOjI2OiI9PmRvY3VtZW50WydyZWZlcnJlciddW18weCI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQuanNfcmVkaXJlY3QuMDUwIjtpOjE7czoxMzM6In48c2NyaXB0W14+XSo+XHMqdmFyIF8weFx3Kz0uanNqaWFtaVwuY29tXC52Ni4sXzB4XHcrPVxbLis/PT5kb2N1bWVudFxbLnJlZmVycmVyLlxdW148XStuYXZpZ2F0b3JbXjxdK2pzamlhbWlcLmNvbVwudjYuO1xzKjwuc2NyaXB0Pn4iO319czozMjoiflwiYXRvYlwiLFwiXHcrLi5cIixcIlx3Ky5cIixcIn4iO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLmpzX3JlZGlyZWN0LjA0OC4wMiI7aToxO3M6MTY4OiJ+dmFyXHMqXzB4XHcrPVxzKlxbXCJcdysuLlwiLFwiXHcrXCIsXCJbXjtdKlxdO1xzKlwoZnVuY3Rpb25cKF8weFx3KyxfMHhcdytcKVx7dmFyXHMqXzB4XHcrPWZ1bmN0aW9uXChfMHhcdytcKVx7d2hpbGVcKC0tXzB4XHcrXClce18weFteOl0qXCksXHcrXFtcdytcXVwpLFx3K1woXClcKTtcfX4iO319czozMjoiKSwhW11dLFsnbmFtZScsJ3JlZ2lvbl9pZCcsISFbXV0iO2E6Mjp7aTowO3M6MjY6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMTE0LjAyIjtpOjE7czoxMjY6In52YXIgXzB4W1x3XStbXHNdKj1bXHNdKlxbW15cXV0rXF07W1xzXSpcKGZ1bmN0aW9uXChfMHhbXlxuXSshXFtcXSwuW1x3XSsnOlteXH1dK1x9O1tcc10qXzB4W1x3XStcW18weFtcd10rXChbXlwpXStcKVxdXChcKTs/fiI7fXM6MzI6IlsncmVtb3ZlQ29va2llJ11bJ3RvU3RyaW5nJ10oKSk7IjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjEzMSI7aToxO3M6NTk6In52YXIgXzB4W1x3XSs9XFtbXlxdXXsyMDAwLH1cXTtbXHNdKlwoZnVuY3Rpb25bXlxuXStcfVx9Oz9+Ijt9czozNzoiXV0oL3BheW1lbnR8YmlsbGluZzp8c2hpcHBpbmc6L2kpP18weCI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4xNDUiO2k6MTtzOjg1OiJ+dmFyIF8weFtcd10rW1xzXSo9W1xzXSpcWyIueFteO10rXF07W15cfF0rcGF5bWVudFx8YmlsbGluZ1teXG5dK1wpXH0sW1xkXStcKVx9W1xzXSp+Ijt9czoyNDoiInRvVVRDU3RyaW5nIiwiY29va2llIiwiIjthOjI6e2k6MDtzOjI0OiJpbmplY3RlZC5qc19yZWRpcmVjdC4wNDgiO2k6MTtzOjE4NToifnZhclxzKlx3Kz1cWyJcdysuPSIsIjtcdys9IiwiW15cc10qdmFyXHMqXzB4XHcrPWZ1bmN0aW9uXChfMHhcdytcKVx7d2hpbGVcKC0tXzB4XHcrXClce1teXHNdKnZhclxzKlx3Kz1mdW5jdGlvblwoXzB4XHcrLF8weFteXG5dKlwpXF1cKFx3K1woXHcrXChcdytcW1x3K1xdXCksXHcrXFtcdytcXVwpLFx3K1woXClcKTtcfX4iO319czoyODoiZnVuY3Rpb24gc3R5bGVfc2Vzc2lvbl91bnNldCI7YToyOntpOjA7aToxMDtzOjM3OiIpLnN0eWxlLmRpc3BsYXkgPSBzdHlsZV9zZXNzaW9uX3Vuc2V0IjthOjI6e2k6MDtpOjEwO3M6MzM6IigpIHsgcmV0dXJuICJub25lIiB9IGZ1bmN0aW9uIGVuZCI7YToyOntpOjA7czoyMzoiaW5qZWN0ZWQuaGlkZGVuLWRpdi4wNDMiO2k6MTtzOjIwNzoifjxzY3JpcHRbXj5dKz5bXHNdKmZ1bmN0aW9uIHN0eWxlX3Nlc3Npb25fdW5zZXRbXlx9XStyZXR1cm4gLm5vbmUuW1xzXSpcfVteXH1dK2Rpc3BsYXlbXHNdKj1bXHNdKnN0eWxlX3Nlc3Npb25fdW5zZXRbXlx9XStcKFwpW1xzXSpcfVtcc10qPC5zY3JpcHQ+W1xzXSpbXjxdKzxzY3JpcHRbXj5dKz5bXHNdKmVuZFtePF0rXChcKVtcc10qPC5zY3JpcHQ+W1xzXSp+Ijt9fX1zOjU1OiIhZnVuY3Rpb24oZSxuLGkpe2Z1bmN0aW9uIHQoZSxuLGkpe2Zvcih2YXIgdD1uJWUubGVuZ3RoIjthOjI6e2k6MDtzOjIzOiJpbmplY3RlZC5qc19tYWx3YXJlLjAwMiI7aToxO3M6MjIzOiJ+PHNjcmlwdFxzKnR5cGU9LnRleHQuamF2YXNjcmlwdC4+LmZ1bmN0aW9uKFwoZSxuLGlcKSlce2Z1bmN0aW9uXHMuXDFce2ZvclwodmFyXHMqdD1uJWUubGVuZ3RoW15cW10rXFtcdy5cdytcXVx3XC5kaWxbXiZdKyYmd2luZG93LkZpcmVidWcuY2hyb21lW15ce10rXHtcfXJldHVybiFcZFteX10rXy5fXHcrLlx3KywuOmVsbnNtW148XSs8XGQrXHxcfFtePF0rPFxkW148XSs8LnNjcmlwdD5+Ijt9czozNDoie2lmKC8oYW5kcm9pZHxiYlxkK3xtZWVnbykuK21vYmlsZSI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQuanNfcmVkaXJlY3QuMDExIjtpOjE7czoxNTM6In48c2NyaXB0W14+XSs+XChmdW5jdGlvblwoXHcsXHdcKVxzKlx7aWZcKC5cKGFuZHJvaWRcfGJiLmRcKy5tZWVnb1wpXC5cK21vYmlsZVteLV0rLVxkW15cLl0rLlx3XHxcdytcKVx8XHcrW14nIl0rLltodHBzXXs0LH06W15cP10rXD9bXiciXSsuXCk7PC5zY3JpcHQ+fiI7fXM6MzU6IlBITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKIjthOjI6e2k6MDtzOjI0OiJpbmplY3RlZC5qc19yZWRpcmVjdC4wMTYiO2k6MTtzOjIxOToifmZ1bmN0aW9uIFtcd10rXChbXHddK1wpW1xzXSpce1tcc10qdmFyIFtcd10rW1xzXSo9W1xzXSouQUJDREVGR0hbXjtdKz0uO1tcc10qdmFyIFtcd10rW1xzXSo9W1xzXSouLjtbXlx9XStTdHJpbmdcLmZyb21DaGFyQ29kZVwoW147XStcKTtbXHNdKlx9W15cfV0rW1xzXH1dK3doaWxlW147XSs7W1xzXSpkb2N1bWVudFwud3JpdGVbXlx9XStcfTtbXHNdKltcd10rXChbXlwpXStcKTt+Ijt9czo0NjoialF1ZXJ5KCcjY28tYmlsbGluZy1mb3JtJykuY2hhbmdlKGZ1bmN0aW9uKCkgeyI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wNDEiO2k6MTtzOjM2NDoifjxzY3JpcHRccyp0eXBlPS50ZXh0LmphdmFzY3JpcHQuPlxzKmpRdWVyeVwoZG9jdW1lbnRcKS5yZWFkeVteJyJdKy4oI2NvLWJpbGxpbmctZm9ybSkuW14nIl0rLmJpbGxpbmcuLFteJyJdKy5cMS5bXiciXSsuKCNjby1wYXltZW50LWZvcm0pLlteJyJdKy4jZmlyc3RkYXRhZ2xvYmFsZ2F0ZXdheV9jY19udW1iZXIuXClcLnZhbFtePl0rPlxzKlxkK1xzKiYmW14nIl0rLiNmaXJzdGRhdGFnbG9iYWxnYXRld2F5X2NjX2NpZFtePl0rPlxzKlxkK1wpXHMqXHtbXlx7XStce1xzKnVybDpccyouW2h0cHNdezQsfTpbXlwuXStcLlx3Ky5nYXRlXC5waHBcP3Rva2VuPVx3K1teXChdK1woLlwyW146XSs6XHMqLlBPU1QuLFtePF0rPC5zY3JpcHQ+fiI7fXM6NDI6InJlYWR5KGZ1bmN0aW9uKCl7alF1ZXJ5KCIjY28tYmlsbGluZy1mb3JtIiI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wNDMiO2k6MTtzOjI5MzoifjxzY3JpcHRccyp0eXBlPS50ZXh0LmphdmFzY3JpcHQuPmpRdWVyeVwoZG9jdW1lbnRcKVwucmVhZHlbXiNdKygjY28tYmlsbGluZy1mb3JtKVteI10rXDEuXCkuc2VyaWFsaXplXChcKVwpXH1cKVteXFtdK1xbbmFtZS4ucGF5bWVudFxbY2NfbnVtYmVyXF0uXF0uXClbXj5dKz5cZCsmJltePl0rPlxkK1teXHtdK1x7dXJsOi5baHRwc117NCx9OlteXD9dK1w/dG9rZW49XHcrW15cK10rXCsuJi5cK1teLF0rLHR5cGU6LlBPU1QuW15cfV0rXH0sZXJyb3JbXlwhXStcIVxkK1x9XH1cKVx9XClcfVwpOzwuc2NyaXB0Pn4iO31zOjI1OiI9cjtpW3JdPWlbcl18fGZ1bmN0aW9uKCl7IjthOjI6e2k6MDtzOjMxOiJpbmplY3RlZC5qc19jcmVhdGVfZG9jdW1lbnQuMDI1IjtpOjE7czoxODM6In48c2NyaXB0PlxzKlwoZnVuY3Rpb25cKGkscyxvLGcscixhLG1cKVx7KFx3KVxbLltcd10rLlxdPShcdyk7XDFcW1wyXF09XDFcW1wyXF1cfFx8W15cfV0rXH0sXDFcW1wyXF1bXlx9XStcfVwpXCh3aW5kb3csZG9jdW1lbnQsLnNjcmlwdC4uLmh0dHBbXjtdKztccyooXHcrXCguY3JlYXRlLlwpO1xzKik/PC5zY3JpcHQ+fiI7fXM6MzA6Ilx1MDA3M1x1MDA3MFx1MDA2Y1x1MDA2OVx1MDA3NCI7YToyOntpOjA7czozMToiaW5qZWN0ZWQuanNfY3JlYXRlX2Z1bmN0aW9uLjAxNiI7aToxO3M6MjA5OiJ+PHNjcmlwdD5cKGZ1bmN0aW9uXChcKVx7ZnVuY3Rpb25ccyooXHcrKVwoKFx3KylcKVx7XDI9XDJcWyIudTAwNzMudTAwNzAudTAwNmMudTAwNjkudTAwNzQiXF1bXntdK3tpZlwoXHcrXFsiW15cXV0rXF09PVx3K1wpW15cfF0rXHxcfFteXHxdK1x8XHxcdys9PVx3K1tefV0rXH1cfVx9aWZcKChcdyspJiZcM1whPVwxW148XSs8XHcrXFtcMVtePF0rPC5zY3JpcHQ+fiI7fXM6MzQ6Ijk0JTI1Ri0lMDM0JTNCIVJ0JTNCOCUzRjZYNi0lMjRnd1YiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDM2IjtpOjE7czoyNDA6In48c2NyaXB0PlxzKnZhclxzKihcdyspPVx7XHc6ZnVuY3Rpb25cKChcdyksKFx3KVwpXHtyZXR1cm5ccypcMlwrXDNbXiddKydmdW5jdGlvbidcP1wxW14iXSsiOTQlMjVGLSUwMzQlM0IhUnQlM0I4JTNGNlg2LSUyNGd3VltePF0rPFtePF0rPFx3XFtcMVtePF0rPFwoXGQrLFxkK1wpXD9bXlxdXStcXSxcMVtePF0rPFtePF0rPFxkK1w/W14+XSs+W159XStcfVx9Y2F0Y2hcKFx3XClce1x9XH1cfVtePF0rPC5zY3JpcHQ+fiI7fXM6Mjk6Ij1mZXJoLm5vaXRhY29sLnRuZW11Y29kIl07dmFyIjthOjI6e2k6MDtzOjI0OiJpbmplY3RlZC5qc19yZWRpcmVjdC4wMTUiO2k6MTtzOjMyNToifjxzY3JpcFtePl0rPlxzKlwkW149XSs9XHMqZnVuY3Rpb25cKFx3K1wpXHMqe1xzKmlmXHMqXChccyp0eXBlb2ZccypcKFwkW15cW10rXFtcdytcXVwpXHMqPT1ccypbJyJdXHcrWyciXVxzKlwpXHMqcmV0dXJuXHMqXCRbXlxbXStcW1x3K1xdXC5zcGxpdFwoWyciXVsnIl1cKVwucmV2ZXJzZVwoXClbXlxbXStcW1x3K1xdXHMqO1xzKn1ccyo7XHMqXCRbXj1dKz1ccypcW1teXF1dK1xdXHMqO1xzKnZhcltee10re1xzKnZhclxzKmRlbGF5XHMqPVxzKlxkK1xzKjtccypzZXRUaW1lb3V0XChcJFteXChdK1woXGQrXClccyosXHMqZGVsYXlcKVxzKjtccyp9PC5zY3JpcHQ+fiI7fXM6Mjk6Ii0lN0IlMjUlMjQyJTJCMDYyJTNGJTNFaSUzRDA5IjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjAzMyI7aToxO3M6MjQxOiJ+PHNjcmlwdD5ccyp2YXJccypcd3s0LH09XHtOOmZ1bmN0aW9uXCh4LHlcKVx7cmV0dXJuXHMqeD55O1x9LFteXCZdK1wmMHhmZmZmO3ZhclxzKlx3ezF9PVteIl0rIlwhXCVcZHsyfVwuXGR7MX0tJTdCJTI1JTI0MiUyQjA2MiUzRiUzRWklM0QwOVteIl0rIlwpO2ZvclwodmFyXHMqWD0wLEY9MDtYPEJcLmxlbmd0aDtYXCtcKyxGXCtcK1teJ10rJ1x+XHxcLidcKTtyZXR1cm5bXjxdKzxbXjxdKzxaW148XSs8LnNjcmlwdD5+Ijt9czoyNDoiaWYgKHhoci5zdGF0dXMgPT0gMjAwKSB7IjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjAwMiI7aToxO3M6MzIzOiJ+PHNjcmlwdFteXC5dK1wuYWRkRXZlbnRMaXN0ZW5lclwoIkRPTUNvbnRlbnRMb2FkZWQiLFxzKnN0YXJ0XCk7XHMqZnVuY3Rpb25ccypzdGFydC4uXHtccyp2YXJccyp4aHJbXjtdKztccyp4aHJcLm9wZW5cKC5HRVQuLC4uaHR0cFteXCldK1wpO1xzKnhoclwuc2VuZFwoXCk7XHMqaWZccypcKHhoclteXChdK1woLmRpdi4uO1xzKmVsZW1lbnQuaW5uZXJIVE1MXHMqPVxzKi48aWZyYW1lXHMqc3JjPS5cK3hoci5bXjxdKzwuaWZyYW1lW149XSs9XHMqLmRpdlx3Ky47XHMqW15cLl0rLmJvZHlbXlwoXStcKGVsZW1lbnQuO1xzKlx9XHMqfVxzKltePF0rPC5zY3JpcHQ+fiI7fXM6MjE6ImZ1bmN0aW9uIHA2ZTkwZjU0NjA5NyI7YToyOntpOjA7czozMToiaW5qZWN0ZWQuanNfY3JlYXRlX2Z1bmN0aW9uLjAwMyI7aToxO3M6NDk6In48c2NyaXB0W148XSpmdW5jdGlvbiBwNmU5MGY1NDYwOTdbXjxdKjwuc2NyaXB0Pn4iO31zOjE1OiJmdW5jdGlvbiBMQ1dFSEgiO2E6Mjp7aTowO3M6MzE6ImluamVjdGVkLmpzX2NyZWF0ZV9mdW5jdGlvbi4wMDEiO2k6MTtzOjc3OiJ+PHNjcmlwdD4uZnVuY3Rpb24uLlx7ZnVuY3Rpb25ccypMQ1dFSEhbXj5dK2RvY3VtZW50XFtMQ1dFSEhbXjxdKzs8LnNjcmlwdD5+cyI7fXM6MjQ6ImZ1bmN0aW9uKCl7TENXRUhIPUxDV0VISCI7YToyOntpOjA7czozMToiaW5qZWN0ZWQuanNfY3JlYXRlX2Z1bmN0aW9uLjAwMiI7aToxO3M6NzY6In48c2NyaXB0Pi5mdW5jdGlvbi4uXHtccypMQ1dFSEg9TENXRUhIW14+XStkb2N1bWVudFxbTENXRUhIW148XSs7PC5zY3JpcHQ+fnMiO31zOjIwOiJ2YXIgRFNFQTRXPWRvY3VtZW50WyI7YToyOntpOjA7czozMToiaW5qZWN0ZWQuanNfY3JlYXRlX2Z1bmN0aW9uLjAwNSI7aToxO3M6MTUwOiJ+PHNjcmlwdD5cKGZ1bmN0aW9uXChcKVx7ZnVuY3Rpb25ccypcdysuKFtBLVowLTldKykuXHtcMT1cMS4uLnUwMDczLnUwMDcwLnUwMDZjLnUwMDY5LnUwMDc0W15cXl0rc2V0VGltZW91dFwoKFtBLVowLTldKyksMTAwLi5cMltePl0rXChcKVwpOzwuc2NyaXB0Pn4iO31zOjE1OiJzY3JpcHQ+IHZhciBfMHgiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDA2IjtpOjE7czoxMjA6In48c2NyaXB0PiB2YXIgKF8weFx3Kyk9W1xbJyJceGEtZkEtRjAtOSxcXV0rO2Z1bmN0aW9uXHMqKFx3KylcKChfMHhcdyspXClccypce1tePF0rLFx3K1xbXDFcW1xkK1xdXF1cKFwpXH1cfVx9PC5zY3JpcHQ+fiI7fXM6MTk6ImZ1bmN0aW9uIFNob3dGb3JtKF8iO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDA3IjtpOjE7czoxNDc6In48c2NyaXB0PlxzKnZhclteXV0rXTtpZlwoXCgubmV3LlJlZ0V4cFtefV0rfVxzKjwuc2NyaXB0PjxzY3JpcHQ+dmFyW157XSt7aWZcKCFkb2N1bWVudFteO10rO2Z1bmN0aW9uIFNob3dGb3JtW147XSs7d2hpbGVbXjtdKzt2YXJbXn1dK319PC5zY3JpcHQ+fiI7fXM6MzQ6ImZ1bmN0aW9uKGcsaCxpLGYpe2kuZ2V0RWxlbWVudEJ5SWQiO2E6Mjp7aTowO3M6MzE6ImluamVjdGVkLmpzX2NyZWF0ZV9mdW5jdGlvbi4wMDciO2k6MTtzOjEwOToifjxzY3JpcHQ+XChmdW5jdGlvblwoZyxoLGksZlwpXHtpLmdldEVsZW1lbnRCeUlkXChmXCkuc3R5bGUuLmRpcy4uZy49Lm4uLmg7XH1cKVwoLnBsYXkuLC5vbmUuW147XSs7PC5zY3JpcHQ+fiI7fXM6MjE6ImpRdWVyeSgnW2lkKj1iaWxsaW5nXSI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wNDciO2k6MTtzOjU0NzoifjxzY3JpcHQ+XHMqdmFyXHMqXHcrXHMqPVxzKlxbW15cXV0rXF1ccyo7XHMqXChccypmdW5jdGlvblxzKlwoXHcrXHMqLFxzKlx3K1wpXHMqe1xzKnZhclxzKlx3K1xzKj1ccypmdW5jdGlvblxzKlwoXHcrXClccyp7XHMqd2hpbGVccypcKFtefV0rfVxzKn1ccyo7XHMqXHcrXChbXn1dK31ccypcKFteXCldK1wpXHMqXClccyo7XHMqdmFyXHMqXHcrXHMqPVxzKmZ1bmN0aW9uXChbXn1dK31cLmNvbnN0cnVjdG9yXChbXjtdKztccypbXntdK3tcdytccyo9XHMqd2luZG93XHMqO1xzKn1ccyp2YXJccypcdytbXn1dK31ccypyZXR1cm5ccypcdytccyo7XHMqfVxzKlwpXHMqO1xzKn1ccypcKFtefV0rfVxzKlx3K1xzKj1ccypkZWNvZGVVUklDb21wb25lbnRcKFx3K1wpXHMqO1xzKmZvclxzKlwoXHMqdmFyXHMqXHcrW159XSt9XHMqZm9yXChcdys9W159XSt9W15cfl0raWRcKj1iaWxsaW5nLWZvcm1cXVtee10re1xzKmlmXChqUXVlcnlcKFtefV0re1xkKyxcZCt9XCRcL1wpXCl7cmV0dXJuXHMqalF1ZXJ5XCguXFtuYW1lXCo9Y2NfY2lkW148XSs8XC9zY3JpcHQ+fiI7fXM6MTU6InNjcmlwdCI+dmFyIF8weCI7YToyOntpOjA7czoyNjoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wMDYuMDIiO2k6MTtzOjE5MToifjxzY3JpcFtePl0rPlxzKnZhclxzKihfMHhcdyspPVtcWyciXFx4YS1mQS1GMC05LFxdXStccyo7XHMqXChmdW5jdGlvbltee10re1xzKnZhclxzKihcdylccyo9XHMqZnVuY3Rpb25cKFwyXClccyp7d2hpbGVbXkBdKy54NjMueDcyLng2NS54NjEueDc0Lng2NS54NDUueDZjLng2NS54NmQueDY1Lng2ZS54NzRbXjxdKzwuc2NyaXB0Pn4iO31zOjU2OiJpbnB1dFtuYW1lPSJwYXltZW50W2NjX251bWJlcl0iXScpLnZhbCgpLnJlcGxhY2UoL1teMC05XSI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wNTMiO2k6MTtzOjMxNDoifjxzY3JpcFtePl0+XHMqalF1ZXJ5XChkb2N1bWVudFwpXC5yZWFkeVwoZnVuY3Rpb25cKFwpXHMqe1xzKmpRdWVyeVwoLlwjY28tYmlsbGluZy1mb3JtLlwpXC5jaGFuZ2VcKGZ1bmN0aW9uXChcKVxzKntccypsb2NhbFtTc110b3JhZ2VcLnNldFtJaV10ZW1cKC5iaWxsaW5nLixccypqUXVlcnlcKC5cI2NvLWJpbGxpbmctZm9ybS5cKVwuc2VyaWFsaXplXChcKVxzKlwpW15cMl0ralF1ZXJ5XCguaW5wdXRcW25hbWU9LnBheW1lbnRcW2NjX251bWJlclxdLlxdLlwpXC52YWxcKFwpXC5yZXBsYWNlXChcL1xbXF4wLTlcXVwvZ1tePF0rPFwvc2NyaXB0Pn4iO31zOjMyOiJOdW1iZXI6ICJhdXRob3JpemVuZXRfY2NfbnVtYmVyIiI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wNjMiO2k6MTtzOjQ0NToifjxzY3JpcFtePl0rPlxzKnZhclxzKihcdyspXHMqPVxzKlwxXHxcfFxzKnt9XHMqO1wxXC5zdHJpbmdpZnlbXn1dK31bJyJdXCl9XHMqO1xzKnZhclxzKihcJD9cdyspW157XSt7XHMqW05uXXVtYmVyOlxzKiJhdXRob3JpemVuZXRfY2NfbnVtYmVyIltefV0rfVxzKixccypcdys6XHMqZnVuY3Rpb25cKChcdyspXClccyp7XHMqaWZcKFwzXC5pZFxzKlwhPVtefV0rfVxzKmlmXChcM1wubmFtZVxzKlwhPVtefV0rfVxzKn1ccyosW157XSt7XHMqdmFyXHMqKFx3Kylccyo9XHMqZG9jdW1lbnRcLmdldEVsZW1lbnRzQnlUYWdOYW1lXCguXHcrLlwpXHMqO1teXDJdK2lmXChkb2N1bWVudFwuZ2V0RWxlbWVudEJ5SWRcKFwyXC5DVlZcKVwpXHMqZG9jdW1lbnRcLmdldEVsZW1lbnRCeUlkXChcMlwuQ1ZWXClcLnZhbHVlXHMqPVxzKlsnIl17Mn1ccyo7XHMqfVxzKn1ccyo8XC9zY3JpcHQ+fiI7fXM6Njc6ImF0b2IoIllXUmtSWFpsYm5STWFYTjBaVzVsY2c9PSIpXShhdG9iKCJSRTlOUTI5dWRHVnVkRXh2WVdSbFpBPT0iKSwiO2E6Mjp7aTowO3M6MjQ6ImluamVjdGVkLmpzX3JlZGlyZWN0LjA0NCI7aToxO3M6MTM5OiJ+XChmdW5jdGlvblwoXClce1tcc10qW1x3XSs9ZnVuY3Rpb25cKFwpW1xzXSpce1tcc10qW1x3XSs9W1x3XStcKFwpLFtcd10rPVtcd10rXFthdG9iXCguWVhSW148XSthdG9iXChbXlwpXStcKSxbXHNdKltcd10rXCk7W1xzXSpcfVwpXChcKTt+Ijt9fXM6OToiZG9jdW1lbnQuIjthOjEwOntpOjA7aToxMDtzOjE0OiJkb2N1bWVudC53cml0ZSI7YToxMjp7aTowO2k6MTA7czo1MjoiPHNjcmlwdCBsYW5ndWFnZT1qYXZhc2NyaXB0PmRvY3VtZW50LndyaXRlKHVuZXNjYXBlKCI7YToyOntpOjA7aToxMDtzOjkzOiIlNzYlNjElNzIlMjAlNkQlNjklNkUlNjUlNzIlMjAlM0QlMjAlNkUlNjUlNzclMjAlNDMlNkYlNjklNkUlNDglNjklNzYlNjUlMkUlNTUlNzMlNjUlNzIlMjglMjciO2E6Mjp7aTowO3M6MjM6Im1hbHdhcmUuY3J5cHRvbWluZXIuMDA3IjtpOjE7czoxMTg6In48c2NyaXB0IGxhbmd1YWdlPWphdmFzY3JpcHQ+ZG9jdW1lbnRcLndyaXRlXCh1bmVzY2FwZVwoLiVbXlwpXSslNzYlNjElNzIlMjAlNkQlNjklNkUlNjUlNzIlMjAlM0QlMjAlNkVbXjxdKzwuc2NyaXB0Pn4iO319czoyNToifX1kb2N1bWVudC53cml0ZShtKTsvLy0tPiI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wNDAiO2k6MTtzOjE2MzoifjxzY3JpcHRccyp0eXBlPS50ZXh0LmphdmFzY3JpcHQuPlxzKjxcIS0tXHMqdmFyXHMqKFx3KT1cIj1cdytbXiJdKyI7XHMqKFx3KT0iIjtccypbXjxdKzxcMS5sZW5ndGg7W15cKF0rXChcMS5jaGFyQ29kZUF0W15ce10rXHtccypcMlwrPVxzKi4mLjtcfVtePF0rXHMqPC5zY3JpcHQ+fiI7fXM6Nzc6ImV4cGlyZXMpO2lmKG5hdmlnYXRvci5hcHBWZXJzaW9uLmluZGV4T2YoIldpbiIpIT0tMSl7ZG9jdW1lbnQud3JpdGUodW5lc2NhcGUoIjthOjI6e2k6MDtzOjMxOiJpbmplY3RlZC5qc19jcmVhdGVfZnVuY3Rpb24uMDE5IjtpOjE7czo0ODU6In48c2NyaXBbXj5dKz5ccyppZlxzKlwoXCFnZXRDb29raWVcKFteXCldK1wpXHMqXClccyp7XHMqZXhwaXJlc1xzKj1ccypuZXdccypEYXRlXChcKVxzKjtccypleHBpcmVzXC5zZXRUaW1lXChleHBpcmVzXC5nZXRUaW1lXChcKVteO10rO1xzKnNldENvb2tpZVwoW15cKV0rXClccyo7XHMqaWZccypcKFxzKm5hdmlnYXRvclwuYXBwVmVyc2lvblwuaW5kZXhPZlwoW15cKV0rXCkhXHMqPVtee10re1xzKmRvY3VtZW50XC53cml0ZVwodW5lc2NhcGVcKFteXCldK1wpXHMqXClccyo7XHMqfVxzKn1ccypmdW5jdGlvblxzKnNldENvb2tpZVwoW157XSt7XHMqZG9jdW1lbnRcLmNvb2tpZVxzKj1bXntdK3tccyppZlxzKlwoZG9jdW1lbnRcLmNvb2tpZVwubGVuZ3RoW157XSt7XHMqXHcrXHMqPVxzKmRvY3VtZW50XC5jb29raWVcLmluZGV4T2ZcKG5hbWVbXjtdKztccyppZlwoW159XSt9XHMqfVxzKnJldHVyblxzKmZhbHNlXHMqO1xzKn1ccyo8LnNjcmlwdD5+Ijt9czo2MjoiPHNjcmlwdCBhc3luYz0iYXN5bmMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvL2dvLm1vYmlzbGEiO2E6Mjp7aTowO3M6MzE6ImluamVjdGVkLmpzX2NyZWF0ZV9kb2N1bWVudC4wMDIiO2k6MTtzOjI3MDoifig8c2NyaXB0W1xzXSooYXN5bmNbXHNdKj1bXHNdKi5hc3luYy5bXHNdKik/dHlwZVtcc10qPVtcc10qWyciXXRleHQuamF2YXNjcmlwdFsnIl1bXHNdKnNyYz1bJyJdW14nIl0rKGFwdXxwdXNodXB8dGlkKVteJyJdK1snIl0+W1xzXSo8LnNjcmlwdD5bXHNdKil7Mix9PFtTc11jcmlwdCBbTGxdYW5ndWFnZVtcc10qPVtcc10qLltKal1hdmFzY3JpcHQuPltcc10qZG9jdW1lbnQud3JpdGUudW5lc2NhcGUuLlslMC05QS1GXXs1MCx9LlwpXCk7W1xzXSo8LltTc11jcmlwdD5+Ijt9czoyMjoiZG9jdW1lbnQud3JpdGUodW5lc2NhcCI7YToyOntpOjA7czozMzoiaW5qZWN0ZWQuanNfZG9jdW1lbnRfbG9jYXRpb24uMDA0IjtpOjE7czo2MToifjxzY3JpcHQuKj9kb2N1bWVudFwud3JpdGVcKHVuZXNjYXBlXCguKj87ZEZcKC4qPzxcL3NjcmlwdD5+aSI7fXM6MTc6Ijt9ZG9jdW1lbnQud3JpdGUoIjthOjI6e2k6MDtzOjMxOiJpbmplY3RlZC5qc19jcmVhdGVfZG9jdW1lbnQuMDAxIjtpOjE7czoxMzE6In48c2NyaXB0IFtePl0rPnZhclxzKltePl0rZG9jdW1lbnQud3JpdGVccyouLjwuXHMqXCtccypbYS16XVxbWzAtOV1cXVwrLlxzKi5cK1thLXpdXFtbMC05XVxdXCsuPltePl0rW2Etel1cW1swLTldXF1bXjtdKzs8LnNjcmlwdD5+Ijt9czo0MjoibG9jYXRpb24ucmVwbGFjZSgnaHR0cDovL2NsaWNrJysoMTg5Kzk5KSsnIjthOjI6e2k6MDtzOjMzOiJpbmplY3RlZC5qc19kb2N1bWVudF9sb2NhdGlvbi4wMDMiO2k6MTtzOjg4OiJ+PHNjcmlwdFtePF0rbG9jYXRpb24ucmVwbGFjZS4uaHR0cDouLmNsaWNrLi4uMTg5Ljk5W148XStkb2N1bWVudC53cml0ZVteXG5dKzs8LnNjcmlwdD5+Ijt9czoyOToic3BsaXQoIiIpLnJldmVyc2UoKS5qb2luKCIiKSkiO2E6Mjp7aTowO3M6MzE6ImluamVjdGVkLmpzX2NyZWF0ZV9kb2N1bWVudC4wMDQiO2k6MTtzOjkzOiJ+PHNjcmlwdFtePF0rZG9jdW1lbnQud3JpdGUuLj50cGlyY3MuPD5bXj5dK3RwaXJjczwuLnNwbGl0Li4uLi5yZXZlcnNlLi4uam9pbi5bXj5dKzwuc2NyaXB0Pn4iO31zOjE0OiJkb2N1bWVudC53cml0ZSI7YToyOntpOjA7czozMToiaW5qZWN0ZWQuanNfY3JlYXRlX2RvY3VtZW50LjAxOCI7aToxO3M6ODE6In48c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij5cc2RvY3VtZW50XC53cml0ZVwoLio/JTNDJTIxJTQ0JTRGLio/PFwvc2NyaXB0Pn5pcyI7fXM6MTI0OiJkb2N1bWVudC5jb29raWU9InJlZGlyZWN0PSIrdGltZSsiOyBwYXRoPS87IGV4cGlyZXM9IitkYXRlLnRvR01UU3RyaW5nKCksZG9jdW1lbnQud3JpdGUoJzxzY3JpcHQgc3JjPSInK3NyYysnIj48XC9zY3JpcHQ+Jyl9IjthOjI6e2k6MDtzOjI0OiJpbmplY3RlZC5qc19yZWRpcmVjdC4wMTciO2k6MTtzOjUxNToifjxzY3JpcFtePl0rPlxzKmZ1bmN0aW9uXHMqXHcrXChcd1wpXHMqe1xzKnZhclxzKihcdyspXHMqPVxzKmRvY3VtZW50XC5jb29raWVcLm1hdGNoXChccypuZXdccypSZWdFeHBccypcKFteXCtdK1wrXHcrXC5yZXBsYWNlXChbXlwyXStyZXR1cm5ccypcMVw/ZGVjb2RlVVJJQ29tcG9uZW50XChcMVxbXGRcXVwpW159XSt9XHMqdmFyXHMqKFx3Kylccyo9XHMqLmRhdGE6dGV4dFwvamF2YXNjcmlwdDtccypiYXNlNjRccyosXHMqW14sXSssXHMqKFx3Kylccyo9XHMqTWF0aFwuZmxvb3JcKERhdGVbXixdKyxccyooXHcrKVxzKj1ccypnZXRbQ2Ndb29raWVcKFteXCldK1wpXHMqO1xzKmlmXChcM1w+XHMqPVxzKlwodGltZVxzKj1ccypcNFwpXHMqXHwrW147XSs7XHMqZG9jdW1lbnRcLmNvb2tpZVxzKj1ccypbXjtdKztccypwYXRoPVxzKlwvXHMqO1teLF0rLFxzKmRvY3VtZW50XC53cml0ZVwoLjxzY3JpcHRccypzcmM9Li5cK1wyXCsuLj5ccyo8Llwvc2NyaXB0PlxzKi5ccypcKVx9XHMqPFwvc2NyaXB0Pn4iO31zOjExOToidTAwNjNcdTAwNmZcdTAwNjlcdTAwNmVcdTAwNjhcdTAwNjlcdTAwNzZcdTAwNjVcdTAwMmVcdTAwNmRcdTAwNjlcdTAwNmVcdTAwMmVcdTAwNmFcdTAwNzNcdTAwMjJcdTAwM2VcdTAwM2NcdTAwMmZcdTAwNzMiO2E6Mjp7aTowO3M6MjM6Im1hbHdhcmUuY3J5cHRvbWluZXIuMDExIjtpOjE7czoxOTg6In48c2NyaXBbXj5dKz5ccypkb2N1bWVudFwud3JpdGVcKHVuZXNjYXBlXChccypbJyJdW1xcXHddezAsMzAwfXUwMDYzLnUwMDZmLnUwMDY5LnUwMDZlLnUwMDY4LnUwMDY5LnUwMDc2LnUwMDY1LnUwMDJlLnUwMDZkLnUwMDY5LnUwMDZlLnUwMDJlLnUwMDZhLnUwMDczLnUwMDIyLnUwMDNlLnUwMDNjLnUwMDJmLnUwMDczW148XSs8XC9zY3JpcHQ+fiI7fX1zOjY2OiJkaWUoIjwhRE9DVFlQRSBodG1sPjxodG1sPjxib2R5PjxzY3JpcHQ+ZG9jdW1lbnQubG9jYXRpb249KFwiaHR0cDoiO2E6Mjp7aTowO3M6MjE6ImJhY2tkb29yLmluamVjdG9yLjAwMSI7aToxO3M6Nzoifl4uKiR+cyI7fXM6NTA6IikuaW5kZXhPZihsb2NhdGlvbi5ob3N0KT09LTEpIHtsMVtpXS5zdHlsZS5kaXNwbGF5IjthOjI6e2k6MDtzOjMxOiJpbmplY3RlZC5qc19jcmVhdGVfZG9jdW1lbnQuMDAzIjtpOjE7czoxNTk6In48c2NyaXB0PnZhciBsMSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lLi5hLi47Zm9yLmk9MDsgaTxsMS5sZW5ndGg7W15cfTtdKz9ocmVmLi4uaW5kZXhPZi5sb2NhdGlvbi5ob3N0Lj09LTEuIC5sMS5pLi5zdHlsZS5kaXNwbGF5PSJub25lIjtcfVx9PC5zY3JpcHQ+fiI7fXM6Nzk6ImRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCdwYXltZW50W2NjX251bWJlcl0nKSkubGVuZ3RoKXtuPXJbMF0udmFsdWUucmVwbGFjZSgiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDEwIjtpOjE7czoyMDU6In48c2NyaXB0IHR5cGU9InRleHQuamF2YXNjcmlwdC4udmFyIHNlPWZhbHNlO3NldEludGVydmFsLmZ1bmN0aW9uLi4uaWYuLi4uLi4uLi4uLmRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lLi5wYXltZW50XFtjY19udW1iZXIuLi4uLmxlbmd0aC4uLi4uLi4uLnZhbHVlLnJlcGxhY2VbXj5dK3JldHVybiBmYWxzZVx9fVwpfX19fSxbXGRdK1wpOzwuc2NyaXB0Pn4iO31zOjU2OiJkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxpdmlsbGUiKS5zdHlsZS5kaXNwbGF5PSJub25lIiI7YToyOntpOjA7czozMToiaW5qZWN0ZWQuanNfY3JlYXRlX2RvY3VtZW50LjAwNSI7aToxO3M6OTg6In48c2NyaXB0IHR5cGU9InRleHRcL2phdmFzY3JpcHQiPmlmXChkb2N1bWVudFwuZ2V0RWxlbWVudEJ5SWRcKCJhbGl2aWxsZSJcKSE9bnVsbFwpLio/PFwvc2NyaXB0Pn5zIjt9czoyNDoiZG9jdW1lbnQuY29va2llID0gInVpZGNoIjthOjI6e2k6MDtzOjMxOiJpbmplY3RlZC5qc19jcmVhdGVfZG9jdW1lbnQuMDA2IjtpOjE7czozMTM6In48c2NyaXB0PlxzKmZ1bmN0aW9uXHMqXHcrXChcdytcKVxzKntccyp2YXJccypcdytccyo9XHMqZG9jdW1lbnRcLmNvb2tpZVwubWF0Y2hcKG5ld1xzKlJlZ0V4cFwoXHMqWyciXVwoXD9bXlwrXStcK1xzKlx3K1wucmVwbGFjZVteLF0rLFtefV0rfVtePF0rZG9jdW1lbnRcLmNyZWF0ZUVsZW1lbnRcKC5cdysuXClccyo7XHMqKFx3KylcLnNyY1xzKj1ccypbJyJcK2h0dHBdK1teO10rO1xzKmRvY3VtZW50XC5nZXRFbGVtZW50c0J5VGFnTmFtZVwoLlx3Ky5cKVxbXGQrXF1cLmFwcGVuZENoaWxkXChcMVwpXHMqO1xzKn1ccyp9XHMqPFwvc2NyaXB0Pn4iO31zOjYyOiJlbmNvZGVVUklDb21wb25lbnQoZG9jdW1lbnQucmVmZXJyZXIpICsgJyZmcm09ZnJhbWUiPjwvaWZyYW1lPiI7YToyOntpOjA7czoxOToianNfdW53YW50ZWRfYWRzLjAxMyI7aToxO2k6MTE7fXM6Mjk6IigpIHsgcmV0dXJuICJub25lIiB9IGZ1bmN0aW9uIjthOjI6e2k6MDtzOjIzOiJpbmplY3RlZC5oaWRkZW4tZGl2LjA0NCI7aToxO3M6MTc0OiJ+ZnVuY3Rpb25bXHNdKltcd10rXChcKVtcc10qXHtbXHNdKnJldHVybltcc10qLm5vbmUuW1xzXSpcfVtcc10qZnVuY3Rpb25bXHNdKltcd10rXChcKVtcc10qXHtbXHNdKmRvY3VtZW50LmdldEVsZW1lbnRCeUlkXCguW1x3XSsuXCkuc3R5bGUuZGlzcGxheVtcc10qPVtcc10qW1x3XStcKFwpW1xzXSpcfX4iO31zOjI5OiJuZXcgUmVnRXhwKCciaGVhZF9kZWZhdWx0X2tleSI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4xNTgiO2k6MTtzOjE5OToifjxzY3JpcHQ+XHMqW1xzXSpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyXCguRE9NQ29udGVudExvYWRlZC4sW1xzXSpmdW5jdGlvblwoW15cfV0rXH1bXHNdKm5vZGVcLmlubmVySFRNTFteXHtdK1x7W1xzXSp2YXJbXlx9XStyZXBsYWNlQWxsXCgudGFncy46W147XStcKTtbXHNdKnJldHVybltcc10qW1x3XSs7W1xzXSpcfVtcc10qPC5zY3JpcHQ+fiI7fX1zOjI6Ilx4IjthOjI0OntpOjA7aToxMDtzOjc6InZhciBfMHgiO2E6NTp7aTowO2k6MTA7czoyNDoiXHg2M1x4NjNceDVGXHg2M1x4NjlceDY0IjthOjI6e2k6MDtpOjEwO3M6MzY6Ilx4NjNceDYzXHg1Rlx4NkVceDc1XHg2RFx4NjJceDY1XHg3MiI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wOTkiO2k6MTtzOjkyOiJ+PHNjcmlwdFtePl0qPltcc10qdmFyIF8weFtcd10rW1xzXSo9W1xzXSpcW1teXF1dK3g2My54NjMueDVGLng2My54NjkueDY0W15ceDAyXSs/PC5zY3JpcHQ+fiI7fX1zOjQ0OiJceDYzXHg2MVx4NzJceDY0XHgyRFx4NkVceDc1XHg2RFx4NjJceDY1XHg3MiI7YToyOntpOjA7aToxMDtzOjU2OiJceDcwXHg2MVx4NzlceDZEXHg2NVx4NkVceDc0XHg1Rlx4NkRceDY1XHg3NFx4NjhceDZGXHg2NCI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4xMjIiO2k6MTtzOjE1MToifjxzY3JpcHRbXj5dKj5bXHNdKnZhciBfMHhbXHddK1teXHxdKy54NzAueDYxLng3OS54NkQueDY1Lng2RS54NzQueDVGLng2RC54NjUueDc0Lng2OC54NkYueDY0W15AXStzZXRUaW1lb3V0XChfW1x3XSssW1xkXStcKVx9XH1cfVx9XH1cKVwoXCk7PC5zY3JpcHQ+fiI7fX1zOjk3OiJbJ1x4NmVceDZmXHg0M1x4NmZceDZlXHg2Nlx4NmNceDY5XHg2M1x4NzQnLCdceDY3XHg2NVx4NzRceDUzXHg2M1x4NzJceDY5XHg3MFx4NzQnXTsoZnVuY3Rpb24oXzB4IjthOjI6e2k6MDtpOjEwO3M6MzQ6IignMHgxJyldKCdceDY4XHg3NFx4NzRceDcwXHg3M1x4M2EiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMTE4IjtpOjE7czoxMjg6In52YXIgXzB4W1x3XStbXHNdKj1bXHNdKlxbLi54NmUueDZmLng0My54NmZbXlx9XStzaGlmdC5cXVwoXClcKTtcfVtcc10qXH07W14hXSsweDAuXClcXVwoISFcW1xdW15cfV0rLGZ1bmN0aW9uXChcKVx7XH1cKTs/W1xzXSp+Ijt9fXM6Nzg6IiwiXHg2RVx4NjFceDZEXHg2NSIsIlx4NjJceDY5XHg2Q1x4NkNceDY5XHg2RVx4NjdceDVGIiwiXHg3Nlx4NjFceDZDXHg3NVx4NjUiLCI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4xNjEiO2k6MTtzOjE2MDoifnZhclxzXzB4XHcrLF8weFx3K1teO10qO1woZnVuY3Rpb25cKFwpXHt2YXJcc18weFx3Kz1cW1wiLnhcdysueFx3K1teO10qO2lmXChcIV8weFx3K1teOl0qOlwoXzB4XHcrPT1bXk9dKk9iamVjdFxbXzB4XHcrXFtcZCtcXVxdW148XSpudWxsXH07XzB4XHcrXChcKVx9XClcKFwpfiI7fX1zOjMyOiJceDY4XHg3NFx4NzRceDcwXHg3M1x4M0FceDJGXHgyRiI7YToyOntpOjA7aToxMDtzOjEyOiJHbGluayx0cnVlKTsiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDIwIjtpOjE7czoxMTA6In4uc2NyaXB0LlxzdmFyXHNfMHhcdys9XHMqXFtcIi54NjgueDc0Lng3NC54NzAueDczLngzQVteXF5dK1xeXF1cKS5nLi4weFteXC5dKy5HbGluayx0cnVlXCk7W148XStccyo8LnNjcmlwdC5+Ijt9fXM6NToiPVsiXHgiO2E6Mjp7aTowO2k6MTA7czoxNjoiLCJceDQzXHg1Nlx4NTYiLCI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4xMzYiO2k6MTtzOjU1OiJ+dmFyIF8weFtcd10rPVxbIi54W147XSssIi54NDMueDU2Lng1NiIsW15cbl0rXF1cKFwpOz9+Ijt9fXM6MTEyOiIoJ1x4NmJceDY1XHg3OVx4NWZceDc3XHg2Zlx4NzJceDY0JylbIlx4NzNceDc0XHg3OVx4NmNceDY1Il1bIlx4NjRceDY5XHg3M1x4NzBceDZjXHg2MVx4NzkiXT0nXHg2ZVx4NmZceDZlXHg2NSc7IjthOjI6e2k6MDtzOjI0OiJpbmplY3RlZC5oaWRkZW4tc3Bhbi4wMDMiO2k6MTtzOjE3OToifjxzcGFuIGlkPVtePl0rPjxhW14+XSs+W148XSs8LmE+PC5zcGFuPjxzY3JpcHQ+W149XSp2YXIgW1x3XStbXHNdKj1bXHNdKm5ldyB3aW5kb3dcWyIueDUyLng2NS54NjcueDQ1Lng3OC54NzBbXjxdKyc7W147XSo8LnNjcmlwdD58dmFyIFtcd10rW1xzXSo9W1xzXSpuZXcgd2luZG93XFsuLng1MltePF0rNjUuO34iO31zOjM2OiJceDMyXHgyMFx4MzVceDNEXHg3Qlx4NjFceDNBXHgyN1x4NjMiO2E6Mjp7aTowO3M6MjA6ImJhY2tkb29yLmpzX2V2YWwuMDEzIjtpOjE7czoyMjA6In48c2NyaXB0XHMqdHlwZT1bXj5dKz5ccyp2YXJccypfMHhcdys9XFsuLngzMi54MjAueDM1LngzRC54N0IueDYxLngzQS54MjcueDYzW15cXV0rXF07XHMqZXZhbFwoZnVuY3Rpb25cKF8weFteXH1dK1x9O2lmXCghXzB4W15cfF0rXHxcfFxzKl8weFteXFtdK1xbZnVuY3Rpb25cKF8weFteXCtdK1wrW15cfV0rXH1cfTtyZXR1cm5ccypfMHhbXlx7XStce1x9XClcKVxzKjwuc2NyaXB0Pn4iO31zOjEyNzoiXHg2Zlx4NmVceDc0XHg2OVx4NmRceDY1XHg2Zlx4NzVceDc0JywnXHg2OFx4NzRceDc0XHg3MFx4NzNceDNhXHgyZlx4MmZceDYzXHg2NFx4NmVceDYxXHg2ZVx4NjFceDZjXHg2OVx4NzRceDY5XHg2M1x4NzNceDJlXHg2MyI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wNTUiO2k6MTtzOjgyOiJ+dmFyIF8weFtcd10rPVxbLi54W147XSt4NjgueDc0Lng3NC54NzAueDczLngzYS54MmZbXiNdK1woXCk7XH1cKTtcfSwweFtcd10rXCk7XH1+Ijt9czo5NToiXHg2RFx4NjFceDY5XHg2RVx4MkVceDZBXHg3MyIsIlx4NjFceDcwXHg3MFx4NjVceDZFXHg2NFx4NDNceDY4XHg2OVx4NkNceDY0IiwiXHg2OFx4NjVceDYxXHg2NCIiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMTEwIjtpOjE7czoxODg6In48c2NyaXB0W14+XSs+W1xzXSp2YXIgXzB4W1x3XSs9XFsuLng3My54NjMueDcyLng2OS54NzAueDc0W147XSt4NjgueDc0Lng3NC54NzAueDczLngzQS54MkYueDJGLng3My54NzQueDYxLng3NC54NjkueDYzW147XSt4NkQueDYxLng2OS54NkUueDJFLng2QS54NzNbXjtdK1tePF0rXF1cKHNjcmlwdFwpW1xzXSo8LnNjcmlwdD5+Ijt9czo0NDoiXHg1Rlx4NkRceDYxXHg3NVx4NzRceDY4XHg3NFx4NkZceDZCXHg2NVx4NkUiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLm1hbHdhcmVfZ2VuZXJpYy4wMDEiO2k6MTtzOjI0NDoifjxzY3JpcHQ+dmFyXHMqXzB4KFx3Kyk9XFsuLng1Ri54NkQueDYxLng3NS54NzQueDY4Lng3NC54NkYueDZCLng2NS54NkVbXlxdXStcXTtpZlwoZG9jdW1lbnRcW18weFwxXFtbXlx8XStcfGJiW15cfF0rXHxtZWVnb1wpXC5cK21vYmlsZVx8YXZhbnRnb1tePl0rPnwoPHNjcmlwdD5cKGZ1bmN0aW9uXChhLGJcKVteXHxdK1x8YmJbXlwpXStcKVwuXCttb2JpbGVcfGF2YW50Z29cfFteJ10rJ2h0dHA6W148XSs8LnNjcmlwdD4pfiI7fXM6NTE6Ilx4NzdceDZmXHg2ZVx4NDNceDczXHgzOFx4NGJceDcxJywnXHg0Y1x4NTdceDM4XHg1NiI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wMzgiO2k6MTtzOjE0MjoifjxzY3JpcHQ+XHMqdmFyXHMqXF8weFx3K1w9XFsuLng3Ny54NmYueDZlLng0My54NzMueDM4Lng0Yi54NzEuLi4ueDRjLng1Ny54MzgueDU2W148XSs8W148XSs8XzB4XHcrO19bXjpdKzotLXRoaXNcW1tePF0rPF8weFtePF0rXHMqPC5zY3JpcHQ+fiI7fXM6MTgyOiIiXHg3NFx4NjVceDczXHg3NCIsIlx4NkZceDZFXHg2NVx4NzBceDYxXHg2N1x4NjVceDdDXHg2Rlx4NkVceDY1XHg3MFx4NjFceDY3XHg2NVx4NjNceDY4XHg2NVx4NjNceDZCXHg2Rlx4NzVceDc0XHg3Q1x4NjNceDY4XHg2NVx4NjNceDZCXHg2Rlx4NzVceDc0XHg3Q1x4NkZceDZFXHg2NVx4NzNceDc0XHg2NVx4NzAiLCI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wMTMiO2k6MTtzOjY3OiJ+PHNjcmlwdD5bXHNdKnZhciBfMHhbXHddKz1cWyIueFtcZF0rLnhbXj5dKz4+W148XStbXlwkXSs8LnNjcmlwdD5+Ijt9czoxNDk6IiJceDZGXHg2RVx4NjVceDcwXHg2MVx4NjdceDY1XHg3Q1x4NjNceDY4XHg2NVx4NjNceDZCXHg2Rlx4NzVceDc0XHg3Q1x4NkZceDZFXHg2NVx4NzNceDc0XHg2NVx4NzBceDdDXHg2Nlx4NjlceDcyXHg2NVx4NjNceDY4XHg2NVx4NjNceDZCXHg2Rlx4NzVceDc0IjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjAxNCI7aToxO3M6MTE5OiJ+PHNjcmlwdD5ccyp2YXIgKF8weFx3Kyk9XFsoW3gwLTlBLUZhLWZcLCInXXsxMDB9KVteO10rKzsgKmlmXChcKCArbmV3ICtSZWdFeHBcKFwxW15ce10rK1x7ZG9jdW1lbnRcW1wxW148XSsrPC5zY3JpcHQ+fiI7fXM6MTczOiIiXHg2MVx4NjRceDY0XHg0NVx4NzZceDY1XHg2RVx4NzRceDRDXHg2OVx4NzNceDc0XHg2NVx4NkVceDY1XHg3MiIsIlx4NUJceDZGXHg2RVx4NjNceDZDXHg2OVx4NjNceDZCXHgzRFx4MjdceDYyXHg2OVx4NkNceDZDXHg2OVx4NkVceDY3XHgyRVx4NzNceDYxXHg3Nlx4NjVceDI4XHgyOVx4MjdceDVEIiI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wMTUiO2k6MTtzOjkxOiJ+PHNjcmlwdD5ccyp2YXIgKF8weFx3Kyk9XFsoW3gwLTlBLUZhLWZcLCInXXsxMDB9KVteO10rKztbXlxuXStkb2N1bWVudFxbXDFbXjxdKys8LnNjcmlwdD5+Ijt9czo3NToiXHg3MFx4NjFceDc5XHg2RFx4NjVceDZFXHg3NFx4NUZceDY2XHg2Rlx4NzJceDZEXHg1Rlx4NjNceDYzXHg3M1x4NjFceDc2XHg2IjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjAxNiI7aToxO3M6ODU6In48c2NyaXB0PlxzKnZhciAoXzB4XHcrKT1cWyhbeDAtOUEtRmEtZlwsIiddezEwMH0pW147XSsrOyAqd2luZG93XFtcMVtePF0rKzwuc2NyaXB0Pn4iO31zOjkyOiJceDY4XHg3NFx4NzRceDcwXHgzQVx4MkZceDJGXHg3N1x4NzdceDc3XHgyRVx4NjdceDYxXHg3Mlx4NjRceDY1XHg2RVx4NjlceDZFXHg2N1x4NjFceDZFXHg2NCI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wMTciO2k6MTtzOjE1MzoifjxzY3JpcHQ+XHN2YXJcc18weFx3Kz1ccypcWyIueDY4Lng3NC54NzQueDcwLngzQS54MkYueDJGLng3N1teXF1dK1xdO3ZhclxzbXlBcnJheT1cW18weFteO10rO3ZhclxzcmFuZD1teUFycmF5XFtNYXRoW147XSs7d2luZG93W149XSs9XHNyYW5kXHM8LnNjcmlwdD5+Ijt9czo1MjoiXHg2OFx4NzRceDc0XHg3MFx4NzNceDNBXHgyRlx4MkZceDZBXHg3MVx4NzVceDY1XHg3MiI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wMTgiO2k6MTtzOjkyOiJ+LnNjcmlwdC5cc3ZhclxzXzB4Y1xkKz1ccypcW1wiLng2OC54NzQueDc0Lng3MC54NzMueDNBW15cXl0rXF5cXVwpLmcuLjB4YyhbXjxdKzwpKy5zY3JpcHQ+fiI7fXM6MzI6Ilx4NkNceDZGXHg2M1x4NjFceDc0XHg2OVx4NkZceDZFIjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjAxOSI7aToxO3M6NjQ6In48c2NyaXB0PlteXG48XSt4NkMueDZGLng2My54NjEueDc0Lng2OS54NkYueDZFW15cbl0rPzwuc2NyaXB0Pn4iO31zOjMyOiJceDY2XHg3NVx4NkVceDYzXHg3NFx4NjlceDZGXHg2RSI7YToyOntpOjA7czozMToiaW5qZWN0ZWQuanNfY3JlYXRlX2Z1bmN0aW9uLjAwNiI7aToxO3M6MjM2OiJ+PHNjcmlwdFxzdHlwZT0udGV4dC5qYXZhc2NyaXB0Lj5ccyouLjwuXFtDREFUQVxbXHMqdmFyXHMqXzB4XHcrPVxbLi54NjYueDc1Lng2RS54NjMueDc0Lng2OS54NkYueDZFW15cXV0rXF07aWZcKFxzKnR5cGVvZlxzKmpRdWVyeT09XHMqXzB4XHcrW15cJl0rXCZcJlteLF0rLFteLF0rLFx7Y29udGVudDpKU09OXFtfMHhcdytcW1x3K1xdXF1cKF8weFx3K1wpXH1cKVx9XH1ccyouLlxdXF0+XHMqPC5zY3JpcHQ+fiI7fXM6MjQ6Ilx4NjNceDZGXHg2Rlx4NkJceDY5XHg2NSI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQuanNfcmVkaXJlY3QuMDA3IjtpOjE7czoxNzY6In48c2NyaXB0XHMqdHlwZT0udGV4dC5qYXZhc2NyaXB0Lj5ccyo7dmFyXHMqXzB4XGQrPS4uLng2My54NkYueDZGLng2Qi54NjkueDY1LixbXjtdKztmdW5jdGlvblxzKl9bXlx8XStcfExpbnV4XHxHb29nbGVib3RbXlwrXStcK1xzKlxkK1wqW14sXSssXGQrW15fXStfXzB4XGQrXChcKTtccyo8LnNjcmlwdD5+Ijt9czozNjoiXHg3NFx4NkZceDRDXHg2Rlx4NjNceDYxXHg2Q1x4NjVceDRDIjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjAzMiI7aToxO3M6MTU5OiJ+PHNjcmlwdD52YXJccypcXzB4W149XSs9XFsuLng3NC54NkYueDRDLng2Ri54NjMueDYxLng2Qy54NjUueDRDW15cXV0rXF07ZnVuY3Rpb25ccypnb29nbGVBbmFseXRpY3NTdGF0aXN0aWNzQnVpbGRcKFwpXHt2YXJccypfMHhbXj1dKz1uYXZpZ2F0b3JbXjxdKzwuc2NyaXB0Pn4iO31zOjEzMjoiXHg2RVx4NjFceDZEXHg2NVx4M0RceDIyXHg3MFx4NjFceDc5XHg2RFx4NjVceDZFXHg3NFx4NUJceDYzXHg2M1x4NUZceDYzXHg2OVx4NjRceDVEXHgyMlx4MjBceDc0XHg2OVx4NzRceDZDXHg2NVx4M0RceDIyXHg0M1x4NTZceDU2IjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjA1MCI7aToxO3M6NTAwOiJ+PHNjcmlwW14+XSs+XHMqdmFyXHMqKFx3Kylccyo9XHMqXFtbXlwyXSsueDIwLng2RS54NjEueDZELng2NS54M0QueDIyLng3MC54NjEueDc5Lng2RC54NjUueDZFLng3NC54NUIueDYzLng2My54NUYueDYzLng2OS54NjQueDVELngyMi54MjAueDc0Lng2OS54NzQueDZDLng2NS54M0QueDIyLng0My54NTYueDU2LngyMi54MjBbXlwyXSsueDY5Lng2NCIsIi54NjIueDY5Lng2Qy54NkMueDY5Lng2RS54NjcueDNBIiwiLng3My54NjUueDYxLng3Mi54NjMueDY4IiwiLng1RiIsIi54NzMueDY1Lng2Qy54NjUueDYzLng3NCIsIi54NzQueDY1Lng3OC54NzQiLCIueDczLng2NS54NkMueDY1Lng2My54NzQueDY1Lng2NC54NDkueDZFLng2NC54NjUueDc4IiwiLng2Ri54NzAueDc0Lng2OS54NkYueDZFLng3MyIsIi54NTAueDRGLng1My54NTQiLCIueDY4Lng3NC54NzQueDcwW15cXV0rXF1ccyo7XHMqdmFyXHMqXHcrXHMqPVxzKlwxXFtcZCtcXVxzKjtbXlwyXSs8XC9zY3JpcHQ+fiI7fXM6ODc6Ing3NFx4NzJceDYxXHg2M1x4NkJceDY1XHg3Mlx4MjBceDZEXHg3NVx4NzNceDc0XHgyMFx4NzVceDczXHg2NVx4MjBceDQ4XHg1NFx4NTRceDUwXHg1MyI7YToyOntpOjA7czoyMzoiaW5qZWN0ZWQuanNfbWFsd2FyZS4wMDYiO2k6MTtzOjMyOToifjxzY3JpcFtePl0rPlxzKnZhclxzKihfMHhcdyspXHMqPVxzKlxbLi54NzMueDYzLng3Mi54NjkueDcwLng3NCIsIi54NjMueDcyLng2NS54NjEueDc0Lng2NS54NDUueDZDLng2NS54NkQueDY1Lng2RS54NzQiLCIueDczLng3Mi54NjMiLCIueDY4Lng3NC54NzQueDcwW15cMl0rNzQueDcyLng2MS54NjMueDZCLng2NS54NzIueDIwLng2RC54NzUueDczLng3NC54MjAueDc1Lng3My54NjUueDIwLng0OC54NTQueDU0Lng1MC54NTNbXlxdXStcXVxzKjtccyp2YXJccyooXHcpXHMqPVxzKmRvY3VtZW50XHMqO1xzKnZhclxzKlx3XHMqPVxzKlwyXFtcMVtePF0rPFwvc2NyaXB0Pn4iO31zOjEzNjoiPVtcIlxceDQ3XFx4NDVcXHg1NFwiLFwiXFx4NkZcXHg3MFxceDY1XFx4NkVcIixcIlxceDczXFx4NjVcXHg2RVxceDY0XCIsXCJcXHg3MlxceDY1XFx4NzNcXHg3MFxceDZGXFx4NkVcXHg3M1xceDY1XFx4NTRcXHg2NVxceDc4XFx4NzRcIiI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQuanNfcmVkaXJlY3QuMDIxIjtpOjE7czozNDA6In48c2NyaXBbXj5dKz5ccyp2YXJccyooXzB4XHcrKVxzKj1ccypcWy5bJyJdW1xceDQ1N117MCwxNn1bJyJdLC5bJyJdW1xceDZGNzA2NUVlXXswLDIyfVsnIl1ccyosXHMqLlsnIl1bXFx4MzQ1NjdFZV17MCwyMn1bJyJdW157XSt7XHMqdmFyXHMqKF8weFx3Kylccyo9XHMqbmV3XHMqWE1MSHR0cFJlcXVlc3RcKFwpO1xzKlwyXFtcMVxbXGRcXVxdW147XSs7XHMqXDJcW1wxXFtcZCtcXVxdW157XSt7XHMqXChmdW5jdGlvblwoXClccypce1xzKnZhclxzKihfMHhcdyspXHMqPVxzKmRvY3VtZW50XFtcMVxbXGQrXF1cXVxzKlwoXDFbXn1dK31ccypcKVxzKlwoXHMqXClccyp9XHMqPFwvc2NyaXB0Pn4iO31zOjE4NjoiWyJceDczXHg2M1x4NzJceDY5XHg3MFx4NzQiLCJceDYzXHg3Mlx4NjVceDYxXHg3NFx4NjVceDQ1XHg2Q1x4NjVceDZEXHg2NVx4NkVceDc0IiwiXHg3NFx4NzlceDcwXHg2NSIsIlx4NzRceDY1XHg3OFx4NzRceDJGXHg2QVx4NjFceDc2XHg2MVx4NzNceDYzXHg3Mlx4NjlceDcwXHg3NCIsIlx4NjFceDczXHg3OVx4NkVceDYzIjthOjI6e2k6MDtzOjI5OiJqcy5tYWx3YXJlLmluamVjdG9yX3N0YXRzLjAwNSI7aToxO3M6MTQ5OiJ+dmFyIF8weFtcd10rW1xzXSo9W1xzXSpcWy4ueDczLng2My54NzIueDY5Lng3MC54NzQuLFtcc10qLi54NjMueDcyLng2NS54NjEueDc0W147XSs7W1xzXSp2YXIgXzB4W1x3XStbXHNdKj1bXHNdKlxbXzB4W1x3XStcW1tcZF0rXF0sW159XStbXH1cKVwoO10rfiI7fX1zOjEyOiJmcm9tQ2hhckNvZGUiO2E6MjY6e2k6MDtpOjEwO3M6MTk6IlN0cmluZy5mcm9tQ2hhckNvZGUiO2E6MTA6e2k6MDtpOjEwO3M6NDoiXV18fCI7YToyOntpOjA7aToxMDtzOjg6Ik1hdGhbXyRfIjthOjI6e2k6MDtpOjEwO3M6MjU6Iil9fXNldFRpbWVvdXQoZnVuY3Rpb24oKXsiO2E6Mjp7aTowO3M6MjY6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDgxLjAyIjtpOjE7czoxNjI6In52YXIgW1x3XCRdK1tcc10qPVtcc10qXCg/K1tcc10qZnVuY3Rpb25cKFteXCldK1wpXHtbXHNdKihmb3JcKFtcc10qKT92YXIgW1x3XStbXHNdKj1bXjtdK1wubGVuZ3RoW15cbl0rc2V0VGltZW91dFwoZnVuY3Rpb25cKFwpXHtbXHddK1woW15cbl0rTWF0aFxbX1wkX1teXH1dK1x9fiI7fX19czo1MToiKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHheU3RyaW5nKGtbal0pLmNoYXJDb2RlQXQoKSl9IjthOjI6e2k6MDtpOjEwO3M6OTc6Ij0nJyxjPW51bGwseD1udWxsO2Zvcih2YXIgaT0wLGo9MDtpPHMubGVuZ3RoO2krPTIsaisrKXtpZihqPT1rLmxlbmd0aClqPTA7eD1wYXJzZUludChzW2ldK3NbaSsxXSwiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMTA1IjtpOjE7czoxNTI6In52YXIgW1x3XSs9bnVsbCxbXHNdKltcd10rW1xzXSo9W1xzXSpcWygnW1x3XSsnLD9bXHNdKil7NSx9XF0sW1xzXSpbXHddK1tcc10qPS4/W1xkXSssW1xzXSpbXHddK1tcc10qPVtcc10qZnVuY3Rpb25cKFteXH1dK2NoYXJDb2RlQXRbXj5dK2JyZWFrO1tcc10qXH1+Ijt9fXM6MzI6IkNWVjogWyJpZCIsICJDYXJkQ29kZUlucHV0IiwgMF0sIjthOjI6e2k6MDtpOjEwO3M6Mzg6IiRzLkRhdGFbJ0RvbWFpbiddID0gbG9jYXRpb24uaG9zdG5hbWU7IjthOjI6e2k6MDtzOjI2OiJoYWNrdG9vbC5jYy1zdGVhbGVyLjA2NS4wMyI7aToxO3M6MjcwOiJ+U3RyaW5nXC5wcm90b3R5cGVcLmhhc2hDb2RlW1xzXSo9W1xzXSpmdW5jdGlvblwoXClbXHNdKlx7W1xzXSp2YXIgaGFzaFtcc10qPVtcc10qMCxbXHNdKmlbXHNdKixbXHNdKmNocjtbXlx9XStyZXR1cm4gaGFzaDtbXHNdKlx9W1xzXSpmb3JbXlx9XStcfVtcc10qcmV0dXJuIGhhc2g7W1xzXSpcfVtcc10qO1tcc10qdmFyIFwkW1x3XStbXHNdKj1bXHNdKlx7W1xzXSpOdW1iZXJbXkBdK3NldEludGVydmFsXChcJFtcd10rXC5UcnlTZW5kLFtcc10qW1xkXStcKTtbXHNdKn4iO319czo3NzoifjxzY3JpcHRbXj5dKj5bXjxdK1N0cmluZy5mcm9tQ2hhckNvZGVcKChbXHNdKltcZF0rW1xzXSosKXsxMH1bXjxdKzwuc2NyaXB0Pn4iO2E6Mjp7aTowO3M6MjM6ImluamVjdGVkLmpzX21hbHdhcmUuMDEwIjtpOjE7czo3NzoifjxzY3JpcHRbXj5dKj5bXjxdK1N0cmluZy5mcm9tQ2hhckNvZGVcKChbXHNdKltcZF0rW1xzXSosKXsxMH1bXjxdKzwuc2NyaXB0Pn4iO31zOjQwOiJdLmdldEF0dHJpYnV0ZSgibGluZSIpO3dpbmRvdy50PWRvY3VtZW50IjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjEzNyI7aToxO3M6MTUyOiJ+PHN2Z1tcc10qeG1sbnM9W14oXStkb2N1bWVudC5nZXRFbGVtZW50QnlJZFwoLltcd10rLlwpO1tcc10qd2luZG93Lltcd10rPVtcd10rLnF1ZXJ5U2VsZWN0b3JBbGxcKC5wYXRoLlwpLGRvY3VtZW50W148XStjYWxsXChcKTtcfSwweFtcZF0rXCk7PC5zY3JpcHQ+fiI7fXM6Mzk6IilyZXR1cm47bmV3IHNlbGZbIkZ1bmN0aW9uInx8Ik9iamVjdCJdKCI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4xNDEiO2k6MTtzOjE2ODoifnZhcltcc10qW1x3XStbXHNdKj1bXHNdKi57MTAwLH12YXJbXHNdKltcd10rPVtcZF0rLFtcd10rPVtcd10rLFtcd10rPVtcd10rXC5zcGxpdFwoLlteXH1dK1wpcmV0dXJuO25ld1tcc10qc2VsZlxbLltcd10rLlx8XHwuW1x3XSsuXF1cKFtcd10rXClcLmNhbGxcKFwpO1x9LDB4W1x3XStcKTt+Ijt9czo0Mzoic2V0T25Db2xsZWN0aW9uQ2hhcih3ZWJraXRBbGxzZWxlY3RFbGVtZW50WyI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4xNTAiO2k6MTtzOjE5ODoifjxzY3JpcHRbXj5dKj5ccypmdW5jdGlvbiBleGl0U2VsZWN0ZW50ZXJGdWxsXCh2W148XStzZXRPbkNvbGxlY3Rpb25DaGFyXCh3ZWJraXRBbGxzZWxlY3RFbGVtZW50XFtbXj5dKz4xNCYmW14+XStuPltePl0rPjhbXj5dK3RhZ05hbWU9PXNldE9uQ29sbGVjdGlvbkNoYXJbXlwvXStFbGVtZW50XFtcZCtcXVwpKztccypcfVxzKjxcL3NjcmlwdD5+Ijt9czoyNToiLy9zdGF0aWMueHguZmJjZG4ubmV0LmNvbSI7YToyOntpOjA7czoyMzoiaW5qZWN0ZWQuanNfbWFsd2FyZS4wMjEiO2k6MTtzOjExNToifjxzY3JpcHRbXj5dKj5bXjw+XSssXGQrXF1cVytsXHcrPSdcL1wvc3RhdGljLnh4LmZiY2RuLm5ldC5jb21cL1tcdy1dKycsW14+XStcfXNldFRpbWVvdXRcKFx3K1woXCksXGQrXCk7PC5zY3JpcHQ+fiI7fXM6MzM6Iis9U3RyaW5nLmZyb21DaGFyQ29kZSgoKHBhcnNlSW50KCI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4xNjUiO2k6MTtzOjE4MDoifjxzY3JpcHRbXj5dKj5ccyp2YXIgXHdcZFxkXGRcZFxkXHMqPVxzKlsiJ11cdytbIiddO1xzKnZhciBcd1xkXGRcZFxkXGRccyo9XGRcZDtbXlwvXStmcm9tQ2hhckNvZGVcKFwoXChwYXJzZUludFwoXHdcZFxkXGRcZFxkW148Pl0rO0Z1bmN0aW9uXChcd1xkXGRcZFxkXGRcKS5jYWxsXChcKTtccyo8LnNjcmlwdD5+Ijt9fXM6MTE6ImFwcGVuZENoaWxkIjthOjc6e2k6MDtpOjEwO3M6MTk6Ijt2YXIgdXJsPVN0cmluZ1tfMHgiO2E6Mjp7aTowO2k6MTA7czoxMjoidmFyIGk9c2NycHRzIjthOjI6e2k6MDtpOjEwO3M6MjU6In07dmFyIHNjcnB0cz1kb2N1bWVudFtfMHgiO2E6Mjp7aTowO3M6Mjk6ImluamVjdGVkLm1hbGljaW91c19VUkwuMTEyLjAyIjtpOjE7czoyMjA6In48c2NyaXB0W14+XSs+dmFyIF8weFtcd10rW1xzXSo9W1xzXSpcWy5sZW5ndGhbXjtdK2FwcGVuZENoaWxkW147XSs7W1xzXSpcKGZ1bmN0aW9uXChfMHhbXn1dK3NoaWZ0W159XStcfX07W15ce10rXHtbXlx9XStcfTt2YXIgdXJsPVN0cmluZ1xbXzB4W159XStcfTt2YXIgc2NycHRzPWRvY3VtZW50XFtfMHhbXlx9XStcfX07aWZbXlx9XStbXHddK1woXClbXH07XXsyfTwuc2NyaXB0Pn4iO319fXM6MTQ4OiIiPjxzY3JpcHQgbGFuZ3VhZ2U9amF2YXNjcmlwdD5ldmFsXChTdHJpbmdcLmZyb21DaGFyQ29kZVwoMTE4LCA5NywgMTE0LCAzMiwgMTA4LCAxMDgsIDExNiwgMzIsIDYxLCAzMiwgMzQsIDEwNCwgMTE2LCAxMTYsIDExMiwgMTE1LCA1OCwgNDcsIDQ3LCAxMTUsIjthOjI6e2k6MDtpOjEwO3M6MTI5OiIxMTksIDEwNSwgMTEwLCAxMDAsIDExMSwgMTE5LCA0NiwgMTA4LCAxMTEsIDk5LCA5NywgMTE2LCAxMDUsIDExMSwgMTEwLCA0NiwgMTA0LCAxMTQsIDEwMSwgMTAyLCA2MSwgMTA4LCAxMDgsIDExNiwgNTkpKTs8L3NjcmlwdD4iO2E6Mjp7aTowO3M6Mjk6ImluamVjdGVkLmpzX1NvY2lhbFdhcmZhcmUuMDAxIjtpOjE7czoyNzM6In4iPjxzY3JpcHQgbGFuZ3VhZ2U9amF2YXNjcmlwdD5ldmFsXChTdHJpbmdcLmZyb21DaGFyQ29kZVwoMTE4LCA5NywgMTE0LCAzMiwgMTA4LCAxMDgsIDExNiwgMzIsIDYxLCAzMiwgMzQsIDEwNCwgMTE2LCAxMTYsIDExMiwgMTE1LCA1OCwgNDcsIDQ3LCAxMTUsW147XSsgMTE5LCAxMDUsIDExMCwgMTAwLCAxMTEsIDExOSwgNDYsIDEwOCwgMTExLCA5OSwgOTcsIDExNiwgMTA1LCAxMTEsIDExMCwgNDYsIDEwNCwgMTE0LCAxMDEsIDEwMiwgNjEsIDEwOCwgMTA4LCAxMTYsIDU5fiI7fX1zOjQ0OiIod2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLmluZGV4T2YoIm9uZXBhZ2UiKSI7YToyOntpOjA7aToxMDtzOjYyOiJzY3JpcHQudHlwZSA9ICJ0ZXh0L2phdmFzY3JpcHQiLCBzY3JpcHQuc3JjID0gQWNjZXB0LmNkbignYUhSMCI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wNjgiO2k6MTtzOjIyMToifmNkbjpbXHNdKmZ1bmN0aW9uW1xzXSpcKGRhdGFcKVtcc10qXHtbXHNdKnZhcltcc10qYjY0W1xzXSo9W1xzXSoiQUJDRFtee10rXHtbXHNdKltcd10rW1xzXSo9W1xzXSpiNjRcLmluZGV4T2ZcKGRhdGFcLmNoYXJBdFteOl0rbG9hZDpbXHNdKmZ1bmN0aW9uW15cP10rXD9bXHNdKndpbmRvd1wuYWRkRXZlbnRMaXN0ZW5lcltefV0rW1xzXH1dKztbXHNdKkFjY2VwdFwucmVhZHlcKFwpO34iO319czo3ODoiU3RyaW5nLmZyb21DaGFyQ29kZSgxMDQsIDExNiwgMTE2LCAxMTIsIDExNSwgNTgsIDQ3LCA0NywgMTE1LCAxMTYsIDk3LCAxMTYsIDQ2IjthOjI6e2k6MDtzOjI5OiJpbmplY3RlZC5qc191dXN0b3VnaHRvbm1hLjAwMSI7aToxO3M6MjAzOiJ+dmFyIFtcd10rW1xzXSo9W1xzXSpkb2N1bWVudFwuY3JlYXRlRWxlbWVudFwoLnNjcmlwdC5cKTtbXHNdKltcd10rXC50eXBlW1xzXSo9W1xzXSoudGV4dC5qYXZhc2NyaXB0LjtbXHNdKltcd10rXC5zcmNbXHNdKj1bXHNdKlN0cmluZ1wuZnJvbUNoYXJDb2RlXCgxMDRbXj5dK2RvY3VtZW50XC5oZWFkXC5hcHBlbmRDaGlsZFwoW1x3XStcKTtbXHNdKlx9fiI7fXM6MjM6InJldHVybiBkfSxhbGd1bGFyVG9rZW46IjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjA2NCI7aToxO3M6MTY4OiJ+dmFyIEFuZ3VsYXI9XHtsb2FkOmZ1bmN0aW9uXChcKVx7dmFyIGE9ZG9jdW1lbnRcLmNyZWF0ZUVsZW1lbnQuLnNjcmlwdFtePl0raW5uZXJXaWR0aD5bXiJdKyIiO1teIl0rYWxndWxhclRva2VuOlteLF0rLFtcc10qYW5ndWxhckNkbjpbXjtdK1x9O1tcc10qQW5ndWxhclwucmVhZHlcKFwpO34iO31zOjIyOiJdfTtBbmd1bGFyWydyZWFkeSddKCk7IjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjA2OSI7aToxO3M6MTI2OiJ+dmFyIEFuZ3VsYXI9XHsubG9hZC46ZnVuY3Rpb25cKFwpXHt2YXJbXHNdKltcd10rPWRvY3VtZW50XFsuY3JlYXRlRWxlbWVudFteJV0rJWlcWy5sZW5ndGguXF1cKVwpW14+XStBbmd1bGFyXFsucmVhZHkuXF1cKFwpO34iO319czoyMToiZXZhbChmdW5jdGlvbihwLGEsYyxrIjthOjI6e2k6MDtpOjEwO3M6MTQ6Inxmcm9tQ2hhckNvZGV8IjthOjM6e2k6MDtpOjEwO3M6NjoiLCcxMTZ8IjthOjI6e2k6MDtzOjIxOiJpbmplY3RlZC5zcGFtLXNlby4wMTQiO2k6MTtzOjU4OiJ+ZXZhbFwoZnVuY3Rpb25cKHAsYSxjW15cfF0rXHxcfFteXHxdKzExNlx8W15cfV0rXHtcfVwpXCl+Ijt9czo0NzoifDU2fGV2YWx8ZG9jdW1lbnR8d3JpdGV8U3RyaW5nfGZyb21DaGFyQ29kZXw0NnwiO2E6Mjp7aTowO3M6MjE6ImluamVjdGVkLnNwYW0tc2VvLjAyMSI7aToxO3M6NjQ6In5ldmFsXChmdW5jdGlvblwocC5hLmMua1tePl0rZnJvbUNoYXJDb2RlXHw0NltePF0rXHtcfVwpXClbXHNdKn4iO319fXM6MjY6ImRvY3VtZW50LmxvY2F0aW9uLnJlcGxhY2UoIjthOjI6e2k6MDtpOjEwO3M6MjI6ImRvY3VtZW50LmxvY2F0aW9uLmhyZWYiO2E6Mjp7aTowO2k6MTA7czoyMDoid2luZG93LmxvY2F0aW9uLmhyZWYiO2E6Mjp7aTowO2k6MTA7czo4MjoiNDcsIDk5LCAxMTEsIDExNywgMTE2LCAxMDAsIDExMSwgMTE5LCAxMTAsIDYzLCAxMTUsIDExMSwgMTE3LCAxMTQsIDk5LCAxMDEsIDYxLCA0OCI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQuanNfcmVkaXJlY3QuMDI0IjtpOjE7czoyMzU6In52YXIgW1x3XStbXHNdKj1bXHNdKlN0cmluZ1wuZnJvbUNoYXJDb2RlXChbXGRdKyxbXHNdKltcZF0rW14pXSs0NywgOTksIDExMSwgMTE3LCAxMTYsIDEwMCwgMTExLCAxMTksIDExMFteO10rXCk7W1xzXSpkb2N1bWVudFwubG9jYXRpb25cLnJlcGxhY2VcKFtcd10rXCk7W1xzXSpkb2N1bWVudFwubG9jYXRpb25cLmhyZWZbXHNdKj1bXHNdKltcd10rO1tcc10qd2luZG93XC5sb2NhdGlvblwuaHJlZlteO10rO34iO319fX1zOjE2OiIjb25lc3RlcGNoZWNrb3V0IjthOjI6e2k6MDtpOjEwO3M6MTAxOiI9eydfa2V5U3RyJzonQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0nLCdlbmNvZGUnOmZ1bmN0aW9uKF8weCI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wNjEiO2k6MTtzOjEyNToifnZhciBfMHhbXHddKz1cWygnW14nXSsnW1xzXSosW1xzXSopezQwfVteO10rO1tcc10qXChmdW5jdGlvblwoXzB4W14jXSsjb25lc3RlcGNoZWNrb3V0W15cPF0rZW5jLjoweFtcd10rW1x9XCk7XSssMHhbXHddK1wpO34iO319czozNToidGhpc1snZXZhbCddKFN0cmluZ1snZnJvbUNoYXJDb2RlJ10iO2E6Mjp7aTowO2k6MTA7czo1NjoiMTExLDExMCwxMDEsMTEyLDk3LDEwMywxMDEsMTI0LDk5LDEwNCwxMDEsOTksMTA3LDExMSwxMTciO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDk0IjtpOjE7czo2ODoifnRoaXNcWy5ldmFsLlxdXChTdHJpbmdcWy5mcm9tQ2hhckNvZGUuXF1cKFtcZF0rLFtcc10qW1xkXStbXjtdK1wpO34iO319czozMToid2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLCI7YToyOntpOjA7aToxMDtzOjIzOiJmdW5jdGlvbigpeyhmdW5jdGlvbigpeyI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4xNDYiO2k6MTtzOjEwNToifndpbmRvd1wuYWRkRXZlbnRMaXN0ZW5lclwoLmxvYWQuLFxzKmZ1bmN0aW9uXChcKVx7XChmdW5jdGlvblwoXClce1tePF0rPFx3O1x3XCtcK1wpW14+XStcKVwoXCk7XH1cKTtccyp+Ijt9fXM6Mzk6IjExOCw5NywxMTQsMzIsMTE1LDExMCwxMDAsMzIsNjEsMTEwLDExNyI7YToyOntpOjA7czoyMDoiaW5qZWN0ZWQuanNfZXZhbC4wMDYiO2k6MTtzOjExNzoifjxzY3JpcHQ+dGhpc1xbLmV2YWwuXF1cKFN0cmluZ1xbLmZyb21DaGFyQ29kZS5cXVxzKlwoMTE4LDk3LDExNCwzMiwxMTUsMTEwLDEwMCwzMiw2MSwxMTAsMTE3W15cKV0rXClcKTtccyo8LnNjcmlwdD5+Ijt9czo2NToiZG9jdW1lbnQuY3JlYXRlRWxlbWVudChTdHJpbmcuZnJvbUNoYXJDb2RlKDExNSwgOTksIDExNCwgMTA1LCAxMTIiO2E6Mjp7aTowO3M6MjQ6ImluamVjdGVkLmpzX3JlZGlyZWN0LjAxMyI7aToxO3M6MjcyOiJ+PHNjcmlwdD4oXHcrXHMqKFx3Kylccyo9XHMqKWRvY3VtZW50XC5jcmVhdGVFbGVtZW50XChTdHJpbmcuZnJvbUNoYXJDb2RlXCgxMTUsXHMqOTksXHMqMTE0LFxzKjEwNSxccyoxMTIsXHMqMTE2XClcKTtccypcMi5zcmM9U3RyaW5nLmZyb21DaGFyQ29kZVteXCldK1wpO1xzKlwyLnR5cGVccyo9XHMqU3RyaW5nLmZyb21DaGFyQ29kZVwoMTE2LFxzKjEwMVwsXHMqMTIwXCxccyoxMTZbXjtdKztccypbXlwoXStcKFN0cmluZ1wuZnJvbUNoYXJDb2RlW147XSs7PC5zY3JpcHQ+fiI7fXM6NTk6IlN0cmluZy5mcm9tQ2hhckNvZGUgKDYwLCAxMDQsIDExNiwgMTA5LCAxMDgsIDYyLCAxMCwgMzIsIDYwIjthOjI6e2k6MDtzOjIxOiJkZWZhY2VkLmhhY2tlZF9ieS4wMTMiO2k6MTtzOjEzMjoifjxzY3JpcHQ+XHMqZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmlubmVySFRNTFxzKj1ccypcKFN0cmluZy5mcm9tQ2hhckNvZGVccypcKDYwLCAxMDQsIDExNiwgMTA5LCAxMDgsIDYyLCAxMCwgMzIsIDYwW148XSs8LnNjcmlwdD5+Ijt9czozMDoiLCA2OCAtIDksIDE0IC0gNCwgMTYgLSA2KSkpKCk7IjthOjI6e2k6MDtzOjMxOiJpbmplY3RlZC5qc19jcmVhdGVfZnVuY3Rpb24uMDE3IjtpOjE7czo3NDoiflwobmV3IEZ1bmN0aW9uLlN0cmluZy5mcm9tQ2hhckNvZGVcKDE5IC0gOSxbIFxkLC1dKzE2XHMqLVxzKjZcKVwpXClcKFwpO34iO31zOjI4OiI6ZShwYXJzZUludChjL2EpKSkrKChjPWMlYSk+IjthOjI6e2k6MDtzOjIwOiJpbmplY3RlZC5qc19ldmFsLjAwMyI7aToxO3M6MjEwOiJ+PHNjcmlwdD5ldmFsXChmdW5jdGlvblwocCxhLGMsayxlLGRcKVx7KFx3KT1bXlwoXStcKChcdylcKVx7cmV0dXJuXChcMjxcd1w/W146XSs6XDFbXj5dKz5cZCtcP1N0cmluZy5mcm9tQ2hhckNvZGVcKFwyXCtcZCtcKTpbXlw/XStcP1x8XHcrXHxcdytcKFx3K1x8XHcrXClbXiddKydcdys6Li5cdytcLlx3K1teXC5dK1wuc3BsaXRcKCdcfCdcKSxcZCxce1x9XClcKX4iO31zOjEyNToiZm9yKHZhciB6PTAsST0wO3o8Uy5sZW5ndGg7eisrLEkrKyl7aWYoST09PUoubGVuZ3RoKXtJPTA7fWYrPVN0cmluZy5mcm9tQ2hhckNvZGUoUy5jaGFyQ29kZUF0KHopXkouY2hhckNvZGVBdChJKSk7fWY9Zi5zcGxpdCgiO2E6Mjp7aTowO3M6MzE6ImluamVjdGVkLmpzX2NyZWF0ZV9mdW5jdGlvbi4wMTQiO2k6MTtzOjYyNjoifjxzY3JpcHQ+XHMqdmFyXHMqXHcrXHMqPVxzKntcdytcOmZ1bmN0aW9uXChcKXtyZXR1cm57XHcrXDpmdW5jdGlvblwoXHcrXCl7dmFyXHMqXHcrXHMqPVxzKi4uLFx3K1xzKj1ccypkZWNvZGVVUklDb21wb25lbnRcKFwiW15cIl0rXCJcKTtmb3JcKHZhclxzKlx3Kz0wLFx3Kz0wO1x3KzxcdytcLmxlbmd0aDtcdytcK1wrLFx3K1wrXCtcKXtpZlwoXHcrPT09XHcrXC5sZW5ndGhcKVxzKntcdys9MDt9XHcrXCtccyo9XHMqU3RyaW5nXC5mcm9tQ2hhckNvZGVcKFx3K1wuY2hhckNvZGVBdFwoXHcrXClcXlx3K1wuY2hhckNvZGVBdFwoXHcrXClcKTt9XHcrPVx3K1wuc3BsaXRcKC5cflx8XC4uXCk7cmV0dXJuXHMqZnVuY3Rpb25cKFx3K1wpXHtyZXR1cm5ccypbXlx7XStce3JldHVyblxzKnR5cGVvZlteXCtdK1wrXHcrO1x9W159XSt9LFteO10rO319O1wodHlwZW9mXHMqd2luZG93PT09Lm9iamVjdC5cP3dpbmRvdzpnbG9iYWxcKVtee10re3NldFRpbWVvdXRcKGZ1bmN0aW9uXChcKXtqUXVlcnlcKGZ1bmN0aW9uXChcJFx3K1wpXHMqXHtcJFx3K1woZG9jdW1lbnRcKVwub25bXjpdKzpbXlwkXStcJFx3K1wuYWpheFteXCRdK1wkXHcrW15cfV0rXH1cfWNhdGNoXChcdytcKVteXDxdKzwuc2NyaXB0Pn4iO31zOjk6IjA5MTk2ODM3NiI7YToyOntpOjA7czozMzoiaW5qZWN0ZWQuanNfZG9jdW1lbnRfbG9jYXRpb24uMDAyIjtpOjE7czoxMTk6In5mdW5jdGlvbiBkbm5Jbml0XChcKVtcc10qXHtbXHNdKnZhclteXChdK0FycmF5XCguW1xkXXs4fVteXH1dK1tcc1x9XStbXlx9XStcfVtcc10qZG9jdW1lbnRcLndyaXRlXChbXlwoXStkbm5Jbml0XChcKTt+Ijt9czo4NDoiZXZhbChTdHJpbmcuZnJvbUNoYXJDb2RlKDEwMiwxMTcsMTEwLDk5LDExNiwxMDUsMTExLDExMCwzMiwxMTUsMTE2LDk3LDExNCwxMTYsNDAsNDEsIjthOjI6e2k6MDtzOjI5OiJpbmplY3RlZC5tYWdlbnRvX3Nob3BsaWZ0LjAwNSI7aToxO3M6MTAzOiJ+PHNjcmlwdFtePl0qPltcc10qZXZhbFwoU3RyaW5nXC5mcm9tQ2hhckNvZGVcKDEwMiwxMTcsMTEwLDk5LDExNiwxMDUsMTExLDExMCwzMlteO10rXCk7W1xzXSo8LnNjcmlwdD5+Ijt9czoxNTA6IjQ4LCAxMjAsIDU1LCA1MSwgNDQsIDQ4LCAxMjAsIDU0LCA0OSwgNDQsIDQ4LCAxMjAsIDU1LCA1MSwgNDQsIDQ4LCAxMjAsIDU0LCA5OCwgNDQsIDQ4LCAxMjAsIDU0LCAxMDAsIDQ0LCA0OCwgMTIwLCA1NCwgNDksIDQ0LCA0OCwgMTIwLCA1NCwgNTIsIDQ0LCA0OCI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQuanNfcmVkaXJlY3QuMDIwIjtpOjE7czozMjc6In48c2NyaXBbXj5dKz5ccypldmFsXChTdHJpbmdcLmZyb21DaGFyQ29kZVwoW15cKV0rNDgsIDEyMCwgNTUsIDUxLCA0NCwgNDgsIDEyMCwgNTQsIDQ5LCA0NCwgNDgsIDEyMCwgNTUsIDUxLCA0NCwgNDgsIDEyMCwgNTQsIDk4LCA0NCwgNDgsIDEyMCwgNTQsIDEwMCwgNDQsIDQ4LCAxMjAsIDU0LCA0OSwgNDQsIDQ4LCAxMjAsIDU0LCA1MiwgNDQsIDQ4LCAxMjAsIDU0LCA1MywgNDQsIDQ4LCAxMjAsIDUwLCAxMDEsIDQ0LCA0OCwgMTIwLCA1NCwgMTAxLCA0NCwgNDgsIDEyMCwgNTQsIDUzLCA0NCwgNDgsIDEyMCwgNTUsIDUyW15cKV0rXClcKVxzKjtccyo8XC9zY3JpcHQ+fiI7fXM6Mjk6IjExOCw5NywxMDksOTgsMTAxLDExNCwxMDgsMTExIjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjA1OCI7aToxO3M6NDEwOiJ+PHNjcmlwW14+XSs+XHMqXChccypmdW5jdGlvblwoXClccyp7XHMqXChccypmdW5jdGlvblxzKihcdyspXChcKVxzKntccyp2YXJccyooXHcrKVxzKj1ccypTdHJpbmdcLmZyb21DaGFyQ29kZVwoMTE1LDExMiwxMDgsMTA1LDExNixbXlwpXStcKVxzKlxbU3RyaW5nXC5mcm9tQ2hhckNvZGVcKDExNSwxMTIsMTA4LDEwNSwxMTZcKVxzKlxdXHMqXChTdHJpbmdcLmZyb21DaGFyQ29kZVwoNDRcKVwpXHMqO1xzKmZ1bmN0aW9uW15cMl0rMTE4LDk3LDEwOSw5OCwxMDEsMTE0LDEwOCwxMTEsNDYsOTksMTExLDEwOVwpXCtbXjtdKztccyp2YXJbXntdK3tccyp2YXJccypbXlwhXStcIShcdyspXFtbXlx8XStcfFx8W157XSt7XHMqaWZcKFtefV0rfVxzKn1ccypzZXRUaW1lb3V0XChcMyxcZCtcKVxzKn1ccypcM1woXClccyp9fiI7fXM6NTM6IkZ1bmN0aW9uKFN0cmluZy5mcm9tQ2hhckNvZGUoMTkgLSA5LCAxMjYgLSA4LCAxMDAgLSAzIjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjAyNyI7aToxO3M6MjE3OiJ+PFwhLS1ccyouXCpccypcdytccypcKi4uLS0+PHNjcmlwdFxzKnR5cGU9LnRleHQuamF2YXNjcmlwdC4+XChuZXdccypGdW5jdGlvblwoU3RyaW5nLmZyb21DaGFyQ29kZVwoMTlccyotXHMqOSxccyoxMjZccyotXHMqOCxccyoxMDBccypcLVxzKjNbXlwpXStcKVwpXClcKFwpOzwuc2NyaXB0PlxzKjxcIS0tXHMqXHcrXHMqLS0+PFwhLS1ccyouXCpccypcdytccypcKi5ccyotLT5+Ijt9czozNjoiKz0gJyYnO30gZWxzZSBpZiAocy5jaGFyQ29kZUF0KGkpID09IjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5qc191bndhbnRlZF9hZHMuMDA2IjtpOjE7czoyMTM6In48XCEtLVx3Ky0tPjxzY3JpcHRccyp0eXBlPS50ZXh0LmphdmFzY3JpcHQuPlxzKlw8XCEtLVxzKnZhclxzKlx3PSJcIT1cdysuXHcrW14iJ10rLjtccypcdz0uLjtccypmb3JccypcKFx3PTA7XHNcdzxcdy5sZW5ndGg7XHNcd1wrXCtcKS5ce1xzKmlmW15cIV0rXCEuO1x9XHMqZWxzZVxzKlx7XHMqXHdcKz1TdHJpbmcuZnJvbUNoYXJDb2RlW14+XSs+XHMqPC5zY3JpcHQ+fiI7fXM6Mzk1OiIxMDIsMTE3LDExMCw5OSwxMTYsMTA1LDExMSwxMTAsMzIsMTE1LDExNiw5NywxMTQsMTE2LDQwLDQxLDEyMywxMCwzMiwzMiwxMDUsMTAyLDQwLDQwLDExMCwxMDEsMTE5LDMyLDgyLDEwMSwxMDMsNjksMTIwLDExMiw0MCwzOSwxMTEsMTEwLDEwMSwxMTIsOTcsMTAzLDEwMSw5OSwxMDQsMTAxLDk5LDEwNywxMTEsMTE3LDExNiwxMjQsMTExLDExMCwxMDEsMTE1LDExNiwxMDEsMTEyLDk5LDEwNCwxMDEsOTksMTA3LDExMSwxMTcsMTE2LDEyNCwxMTEsMTEwLDEwMSwxMTIsOTcsMTAzLDEwMSwxMjQsMTAyLDEwNSwxMTQsMTAxLDk5LDEwNCwxMDEsOTksMTA3LDExMSwxMTcsMTE2LDEyNCwxMTUsMTA1LDEwOSwxMTIsMTA4LDEwMSw5OSwxMDQsMTAxLDk5LDEwNywxMTEsMTE3LDExNiwzOSw0MSw0MSI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wNDYiO2k6MTtzOjYzMDoifjxzY3JpcHQ+XHMqdGhpc1xbLmV2YWwuXF1ccypcKFN0cmluZ1xbLmZyb21DaGFyQ29kZS5cXVxzKlwoMTAsMTE4LDk3LDExNCwzMiwxMTUsMTEwLDEwMCwzMiw2MSwxMTAsMTE3LDEwOCwxMDgsNTksMTAsMTAsMTAyLDExNywxMTAsOTksMTE2LDEwNSwxMTEsMTEwLDMyLDExNSwxMTYsOTcsMTE0LDExNiw0MCw0MSwxMjMsMTAsMzIsMzIsMTA1LDEwMiw0MCw0MCwxMTAsMTAxLDExOSwzMiw4MiwxMDEsMTAzLDY5LDEyMCwxMTIsNDAsMzksMTExLDExMCwxMDEsMTEyLDk3LDEwMywxMDEsOTksMTA0LDEwMSw5OSwxMDcsMTExLDExNywxMTYsMTI0LDExMSwxMTAsMTAxLDExNSwxMTYsMTAxLDExMiw5OSwxMDQsMTAxLDk5LDEwNywxMTEsMTE3LDExNiwxMjQsMTExLDExMCwxMDEsMTEyLDk3LDEwMywxMDEsMTI0LDEwMiwxMDUsMTE0LDEwMSw5OSwxMDQsMTAxLDk5LDEwNywxMTEsMTE3LDExNiwxMjQsMTE1LDEwNSwxMDksMTEyLDEwOCwxMDEsOTksMTA0LDEwMSw5OSwxMDcsMTExLDExNywxMTYsMzksNDEsNDEsNDYsMTE2LDEwMSwxMTUsMTE2LDQwLDExOSwxMDUsMTEwLDEwMCwxMTEsMTE5LDQ2LDEwOCwxMTEsOTksOTcsMTE2LDEwNSwxMTEsMTEwLDQxLDQxW14pXStcKVxzKlwpXHMqO1xzKjxcL3NjcmlwdD5+Ijt9czo2MzoiKG5ldyBGdW5jdGlvbihTdHJpbmcuZnJvbUNoYXJDb2RlKDE5IC0gOSwgMTI2IC0gOCwgMTAwIC0gMywgMTIyIjthOjI6e2k6MDtzOjMxOiJpbmplY3RlZC5qc19jcmVhdGVfZnVuY3Rpb24uMDE4IjtpOjE7aToxMTt9czoyNTA6IjQ5LCA0OSwgNTMsIDQ0LCAzMiwgNDksIDQ4LCA1MywgNDQsIDMyLCA0OSwgNDgsIDU3LCA0NCwgMzIsIDQ5LCA0OSwgNTAsIDQ0LCAzMiwgNDksIDQ4LCA1NiwgNDQsIDMyLCA0OSwgNDgsIDQ5LCA0NCwgMzIsIDQ5LCA0OSwgNDksIDQ0LCAzMiwgNDksIDQ5LCA0OCwgNDQsIDMyLCA0OSwgNDgsIDQ5LCA0NCwgMzIsIDQ5LCA0OCwgNTYsIDQ0LCAzMiwgNDksIDQ4LCA1MywgNDQsIDMyLCA0OSwgNDksIDQ4LCA0NCwgMzIsIDQ5LCA0OCwgNDkiO2E6Mjp7aTowO3M6MzA6ImluamVjdGVkLmpzX2NyZWF0ZV9lbGVtZW50LjAwNyI7aToxO3M6MTQzOiJ+PHNjcmlwW14+XSs+XHMqZXZhbFwoU3RyaW5nXC5mcm9tQ2hhckNvZGVcKDExOCwgOTcsIDExNCwgMzIsIDk1LCA0OCxbXlwpXSszMywgOTEsIDkzLCA0MSwgMTIzLCA5NywgNDAsIDQxLCA1OSwgMTI1XHMqXClccypcKVxzKjtccyo8XC9zY3JpcHQ+fiI7fXM6Nzc3OiI5MiwgMTIwLCA1NSwgNTEsIDkyLCAxMjAsIDU0LCA1MSwgOTIsIDEyMCwgNTUsIDUwLCA5MiwgMTIwLCA1NCwgNTcsIDkyLCAxMjAsIDU1LCA0OCwgOTIsIDEyMCwgNTUsIDUyLCAzNCwgNDQsIDM0LCA5MiwgMTIwLCA1NCwgNTEsIDkyLCAxMjAsIDU1LCA1MCwgOTIsIDEyMCwgNTQsIDUzLCA5MiwgMTIwLCA1NCwgNDksIDkyLCAxMjAsIDU1LCA1MiwgOTIsIDEyMCwgNTQsIDUzLCA5MiwgMTIwLCA1MiwgNTMsIDkyLCAxMjAsIDU0LCA2NywgOTIsIDEyMCwgNTQsIDUzLCA5MiwgMTIwLCA1NCwgNjgsIDkyLCAxMjAsIDU0LCA1MywgOTIsIDEyMCwgNTQsIDY5LCA5MiwgMTIwLCA1NSwgNTIsIDM0LCA0NCwgMzQsIDkyLCAxMjAsIDU1LCA1MiwgOTIsIDEyMCwgNTUsIDU3LCA5MiwgMTIwLCA1NSwgNDgsIDkyLCAxMjAsIDU0LCA1MywgMzQsIDQ0LCAzNCwgOTIsIDEyMCwgNTUsIDUyLCA5MiwgMTIwLCA1NCwgNTMsIDkyLCAxMjAsIDU1LCA1NiwgOTIsIDEyMCwgNTUsIDUyLCA5MiwgMTIwLCA1MCwgNzAsIDkyLCAxMjAsIDU0LCA2NSwgOTIsIDEyMCwgNTQsIDQ5LCA5MiwgMTIwLCA1NSwgNTQsIDkyLCAxMjAsIDU0LCA0OSwgOTIsIDEyMCwgNTUsIDUxLCA5MiwgMTIwLCA1NCwgNTEsIDkyLCAxMjAsIDU1LCA1MCwgOTIsIDEyMCwgNTQsIDU3LCA5MiwgMTIwLCA1NSwgNDgsIDkyLCAxMjAsIDU1LCA1MiwgMzQsIDQ0LCAzNCwgOTIsIDEyMCwgNTQsIDQ5LCA5MiwgMTIwLCA1NSwgNTEsIDkyLCAxMjAsIDU1LCA1NywgOTIsIDEyMCwgNTQsIDY5LCA5MiwgMTIwLCA1NCwgNTEiO2E6Mjp7aTowO3M6MzE6ImluamVjdGVkLmpzX2NyZWF0ZV9mdW5jdGlvbi4wMjAiO2k6MTtzOjg3NzoifjxzY3JpcFteXChdK2V2YWxcKFN0cmluZ1wuZnJvbUNoYXJDb2RlXCgxMTgsIDk3LCAxMTQsIDMyLFtccyxcZF17MCwxMDB9OTIsIDEyMCwgNTUsIDUxLCA5MiwgMTIwLCA1NCwgNTEsIDkyLCAxMjAsIDU1LCA1MCwgOTIsIDEyMCwgNTQsIDU3LCA5MiwgMTIwLCA1NSwgNDgsIDkyLCAxMjAsIDU1LCA1MiwgMzQsIDQ0LCAzNCwgOTIsIDEyMCwgNTQsIDUxLCA5MiwgMTIwLCA1NSwgNTAsIDkyLCAxMjAsIDU0LCA1MywgOTIsIDEyMCwgNTQsIDQ5LCA5MiwgMTIwLCA1NSwgNTIsIDkyLCAxMjAsIDU0LCA1MywgOTIsIDEyMCwgNTIsIDUzLCA5MiwgMTIwLCA1NCwgNjcsIDkyLCAxMjAsIDU0LCA1MywgOTIsIDEyMCwgNTQsIDY4LCA5MiwgMTIwLCA1NCwgNTMsIDkyLCAxMjAsIDU0LCA2OSwgOTIsIDEyMCwgNTUsIDUyLCAzNCwgNDQsIDM0LCA5MiwgMTIwLCA1NSwgNTIsIDkyLCAxMjAsIDU1LCA1NywgOTIsIDEyMCwgNTUsIDQ4LCA5MiwgMTIwLCA1NCwgNTMsIDM0LCA0NCwgMzQsIDkyLCAxMjAsIDU1LCA1MiwgOTIsIDEyMCwgNTQsIDUzLCA5MiwgMTIwLCA1NSwgNTYsIDkyLCAxMjAsIDU1LCA1MiwgOTIsIDEyMCwgNTAsIDcwLCA5MiwgMTIwLCA1NCwgNjUsIDkyLCAxMjAsIDU0LCA0OSwgOTIsIDEyMCwgNTUsIDU0LCA5MiwgMTIwLCA1NCwgNDksIDkyLCAxMjAsIDU1LCA1MSwgOTIsIDEyMCwgNTQsIDUxLCA5MiwgMTIwLCA1NSwgNTAsIDkyLCAxMjAsIDU0LCA1NywgOTIsIDEyMCwgNTUsIDQ4LCA5MiwgMTIwLCA1NSwgNTIsIDM0LCA0NCwgMzQsIDkyLCAxMjAsIDU0LCA0OSwgOTIsIDEyMCwgNTUsIDUxLCA5MiwgMTIwLCA1NSwgNTcsIDkyLCAxMjAsIDU0LCA2OSwgOTIsIDEyMCwgNTQsIDUxW15cKV0rXClcKVxzKjtccyo8XC9zY3JpcHQ+fiI7fXM6MTQ6IiErW10rIStbXSshK1tdIjthOjI6e2k6MDtzOjIyOiJpbmplY3RlZC5qc19pZnJhbWUuMDAxIjtpOjE7czo5NjoiflwkW1xzXSo9W1xzXSpTdHJpbmcuZnJvbUNoYXJDb2RlXChbXGRdK1teO10rXCk7W1xzXSouW1xzXSo9W1xzXSpcKFxbW14+XSshXCtcW1xdXCtcIVteO10rXChcKTt+Ijt9czozMToiXShsYXN0U2VnbWVudCkmJiFmdW5jdGlvbigpe3ZhciI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4xNDkiO2k6MTtzOjE2NToifjxzY3JpcHRbXj5dKj5ccyp2YXIgXHcrPVxbKFsnIl1bXHcrXC89XStbJyJdLCkrWyciXVtcdytcLz1dK1snIl1cXTt2YXJbXjxdK1wrLXBhcnNlSW50W14iXG5dKz9sYXN0U2VnbWVudD1wYXJ0c1teIlxuXSs/XChsYXN0U2VnbWVudFwpJiYhZnVuY3Rpb25cKFwpW148XSs8LnNjcmlwdD5+Ijt9fXM6NToiZXZhbCgiO2E6MTg6e2k6MDtpOjEwO3M6MjA6IlN0cmluZy5mcm9tQ2hhckNvZGUoIjthOjM6e2k6MDtpOjEwO3M6Nzc6In52YXIgW1x3XStbXHNdKj1bXHNdKlN0cmluZ1wuZnJvbUNoYXJDb2RlXCgoW1xkXStbXHNdKi1bXHNdKltcZF0rLFtcc10qKXsyMH1+IjthOjI6e2k6MDtzOjIwOiJiYWNrZG9vci5qc19ldmFsLjAwOSI7aToxO3M6MTA2OiJ+dmFyIFtcd10rW1xzXSo9W1xzXSpTdHJpbmdcLmZyb21DaGFyQ29kZVwoKFtcZF0rW1xzXSotW1xzXSpbXGRdKyxbXHNdKil7MjB9W15cKV0rXCk7W1xzXSpldmFsXChbXHddK1wpOz9+Ijt9czoxMTc6IjEwMCwxMTEsOTksMTE3LDEwOSwxMDEsMTEwLDExNiw0Niw5OSwxMTQsMTAxLDk3LDExNiwxMDEsNjksMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsNDAsMzksMTE1LDk5LDExNCwxMDUsMTEyLDExNiwzOSw0MSI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQuanNfcmVkaXJlY3QuMDQ5IjtpOjE7czoxMTM6In5ldmFsXChbXlwoXStTdHJpbmdcLmZyb21DaGFyQ29kZVwoKFtcZF0rLCkrMTAwLDExMSw5OSwxMTcsMTA5LDEwMSwxMTAsMTE2LDQ2LDk5LDExNCwxMDEsOTcsMTE2LDEwMSw2OVteXCldK1wpXCl+Ijt9fXM6MTM6ImF0b2IoIk1BPT0iKTsiO2E6Mjp7aTowO2k6MTA7czoxMzoiYXRvYigiWVE9PSIpOyI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wOTMiO2k6MTtzOjkwOiJ+PHNjcmlwdFtePl0rPltcc10qKHZhciBbXHddK1tcc10qPVtcc10qW147XSs7W1xzXSopezUwfVtePF0rZXZhbFwoW147XStcKTtbXHNdKjwuc2NyaXB0Pn4iO319czoxMToiKSk8L3NjcmlwdD4iO2E6Mjp7aTowO2k6MTA7czoyMjoifj5bXjxdKjxzY3JpcHQ+ZXZhbFwofiI7YToyOntpOjA7czoyMzoiaW5qZWN0ZWQuaGlkZGVuLWRpdi4wMzciO2k6MTtzOjEwMToifjxbXHddKyAoaWR8Y2xhc3MpW14+XSs+W148XSs8YSBocmVmW14+XSs+W148XSs8LmE+W148XSs8Lltcd10rPltePF0qPHNjcmlwdD5bXHNdKmV2YWxbXjxdKzwuc2NyaXB0Pn4iO319czoxMDoiZXZhbChhdG9iKCI7YTozOntpOjA7aToxMDtzOjE4OiJjeTVoY0hCbGJtUkRhR2xzWkMiO2E6Mjp7aTowO3M6MjA6ImluamVjdGVkLmpzX2V2YWwuMDEzIjtpOjE7czo0ODoifmV2YWxcKGF0b2JcKC57MTAwLH1jeTVoY0hCbGJtUkRhR2xzWkNbXildK1wpXCl+Ijt9czoyODoiS0daMWJtTjBhVzl1S0NsN0tHWjFibU4wYVc5dSI7YToyOntpOjA7czoyMDoiaW5qZWN0ZWQuanNfZXZhbC4wMTQiO2k6MTtzOjUzOiJ+ZXZhbFwoYXRvYlwoLktHWjFibU4wYVc5dUtDbDdLR1oxYm1OMGFXOXVbXlwpXStcKVwpfiI7fX1zOjI3OiIlNjYlNzUlNmUlNjMlNzQlNjklNmYlNmUlMjAiO2E6Mjp7aTowO3M6MjA6ImluamVjdGVkLmpzX2V2YWwuMDAyIjtpOjE7czoyMTA6In48aHRtbD5ccyo8aGVhZD5ccyo8LmhlYWQ+XHMqPGJvZHk+XHMqPHNjcmlwdFxzKnR5cGU9LnRleHQuamF2YXNjcmlwdC4+XHMqPCEtLVxzKmV2YWxcKHVuZXNjYXBlXCguJTY2JTc1JTZlJTYzJTc0JTY5JTZmJTZlJTIwW15cPl0rPlxzKjwuc2NyaXB0PlxzKjxub3NjcmlwdD48aT5KYXZhc2NyaXB0XHMqcmVxdWlyZWQ8Lmk+PC5ub3NjcmlwdD5ccypccyo8Lmh0bWw+fiI7fXM6Mjc6Ii5zcGxpdCgnfCcpLDAse30pKTwvc2NyaXB0PiI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQuanNfcmVkaXJlY3QuMDEwIjtpOjE7czoyNjM6In48c2NyaXB0XHMqdHlwZT0udGV4dC5qYXZhc2NyaXB0Lj5ldmFsXChmdW5jdGlvblwocCxhLGMsayxlLGRcKVx7KFx3KT1mdW5jdGlvblwoKFx3KVwpXHtyZXR1cm5ccypcMi50b1N0cmluZ1teO10rO2lmXChcIVteXHtdK1x7d2hpbGVcKFwyW15cW10rXFtcMlteO10rO1wxW147XSs7XDJbXlwoXStcKFwyW15cfF0rXHxkb2N1bWVudFx8c1x8Y3VycmVudFNjcmlwdFx8c2NyaXB0XHx2YXJbXiddKycuc3BsaXRcKC5cfC5cKVwsXGQsXHtcfVwpXCk8LnNjcmlwdD5+Ijt9czo0NDoicmV0ICs9IHN0cmluZy5jaGFyQXQoaSk7fSByZXR1cm4gcmV0OyB9ZXZhbCgiO2E6Mjp7aTowO3M6MjA6ImJhY2tkb29yLmpzX2V2YWwuMDA0IjtpOjE7czozMDc6In48c2NyaXB0IGxhbmd1YWdlPS5qYXZhc2NyaXB0LiB0eXBlPS50ZXh0LmphdmFzY3JpcHQuPnZhclxzKlx3Ky4uPW9RS3BreUo4ZENLMGxHYndObkxuNDJicFJYWWo5R2JFTkRmdDEyYmtCW14nXSsnO2Z1bmN0aW9uXHMqXHcrXChkYXRhXClce3ZhclxzKlx3Kz0iQUJDREVGR0hcdytcKy4uIjt2YXJbXjtdKztkb1x7aDE9W15cKV0rXClcKTtbXlwoXStcKGRhdGEuY2hhckF0XChpXCtcK1wpXCk7W14+XStcPlw+XHcrJjB4ZmZbXjxdKzxkYXRhW14+XSs+W159XStcfVxzKnJldHVyblxzKnJldDtccypcfWV2YWxcKFteO10rOy4uc2NyaXB0Pn4iO31zOjMwOiJ7d2hpbGUoYy0tKXJbZShjKV09a1tjXXx8ZShjKTsiO2E6Mjp7aTowO3M6MjA6ImJhY2tkb29yLmpzX2V2YWwuMDEyIjtpOjE7czoxNzU6In48XCEtLVx3Ky0tPjxzY3JpcHRccyp0eXBlPS50ZXh0Llx3Ky4+ZXZhbFwoZnVuY3Rpb25cKFteXH1dK1x9W15cfV0rXH1cXTtlPVteXC5dK1wucmVwbGFjZVwobmV3W14nXSsnLi5iJ1wrZS5jLltePF0rPDZccypwPSJxOnM7dTp2IltePl0rPjwuNj4uLi5cfS4uLjtbXlx7XStce1x9XClcKTwuc2NyaXB0Pn4iO31zOjE2OiJaWFpoYkNBOUlHWmhiSE5sIjthOjI6e2k6MDtzOjIzOiJpbmplY3RlZC5qc19tYWx3YXJlLjAwNyI7aToxO3M6MTIwOiJ+PHNjcmlwW14+XSs+XHMqdmFyXHMqKFx3Kylccyo9XHMqYXRvYlwoWyciXC1cL3ZhclxzKlx3K1xzKj1ccyphdG9iXChcdytcKVxzKjtdKztccypldmFsXChcMVwrW15cKV0rXClccyo7XHMqPFwvc2NyaXB0Pn4iO31zOjE5OiJ2YXJ8dTAwMjZ1fHJlZmVycmVyIjthOjI6e2k6MDtzOjIwOiJpbmplY3RlZC5qc19ldmFsLjAwNSI7aToxO3M6MTM1OiJ+PHNjcmlwW14+XSo+W15cKFx7aWVdKmV2YWxcKGZ1bmN0aW9uXChwLGEsYyxrLmUuZFwpXHMqe2U9ZnVuY3Rpb25bXjxdKzxhIGdbXlx8fV0rZG9jdW1lbnRcfFx8W148XSt2YXJcfHUwMDI2dVx8cmVmZXJyZXJbXjxdKzwuc2NyaXB0Pn4iO31zOjM1OiJkKGUuZihnLmgoNiwxLDAsNywzLDQsOCxpLGosOSxrLGEsYSI7YToyOntpOjA7czoyMDoiaW5qZWN0ZWQuanNfZXZhbC4wMDEiO2k6MTtzOjE5MzoifjxzY3JpcHRccyp0eXBlPS50ZXh0LmphdmFzY3JpcHQuPlxzKmV2YWxcKGZ1bmN0aW9uXChwLGEsYyxrLGUsclwpXHMqXHsoXHcrKT1mdW5jdGlvblwoKFx3KylcKVx7cmV0dXJuXHMqKFwyKVteO10rO2lmXChcIVteXHxdK1x8XHwoXDEpXCgoXDIpXClbXlx8XStcfFxkK1x8XGQrXHxcZCtcfFteXHtdK1x7XH1cKVwpXHMqPC5zY3JpcHQ+fiI7fXM6MTA6InxDb2luSGl2ZXwiO2E6Mjp7aTowO3M6MjM6Im1hbHdhcmUuY3J5cHRvbWluZXIuMDAzIjtpOjE7czozMjk6In48c2NyaXB0XHMqdHlwZT0udGV4dC5qYXZhc2NyaXB0Lj4uLlxzKjwhLkNEQVRBXFtccypldmFsXChmdW5jdGlvblteO10rO2lmXCghLi5cLnJlcGxhY2VbXlx7XStce3doaWxlXChjLS1cKVxzKlx7XHdcW1x3XC50b1N0cmluZ1teXHxdK1x8XHxcd1wudG9TdHJpbmdbXlx8XStcfFx8XHdcfVx3PVxbXGRcKFteXHxdK1x8XHdcfFx3XHxcd1x8XHdcfFx3XHxcd1x8XHdbXlx7XStce1x9XClcKS4sXGQrLFxkKywuXHx7NCx9ZnVuY3Rpb25cfHs0LH1yZXR1cm5cfFx8bmV3XHx3aGlsZVteX10rX1x3K1x8Q29pbkhpdmVbXlx7XStce1x9XClcKVxzKi4uXHMqXF1cXT48LnNjcmlwdD5+Ijt9czoyNToifHBheXBhbF9kaXJlY3RfY2NfbnVtYmVyfCI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wNTQiO2k6MTtzOjE0MjoifjxzY3JpcHRbXj5dKz4oLi5ccyo8IS5DREFUQVxbKT9ccypldmFsLmZ1bmN0aW9uXChwLGEsYyxrLGVbXlxuXHJdK1x8cGF5cGFsX2RpcmVjdF9jY19udW1iZXJcfFtePlwpXStcfC5cKVssXClce1x9MF0rXHMqKFwvXC9cXVxdPik/PC5zY3JpcHQ+fiI7fXM6NjM6InxzY3JpcHR8ZG9jdW1lbnR8anN8aHR0cHN8c3JjfGNyZWF0ZUVsZW1lbnR8dmFyfHRyeXNvbWV0aGluZ25ldyI7YToyOntpOjA7czoyMDoiaW5qZWN0ZWQuanNfZXZhbC4wMDQiO2k6MTtzOjI1NToifjxzY3JpcHRccyp0eXBlPS50ZXh0LmphdmFzY3JpcHQuPmV2YWxcKFteO10rO2lmXCghLi4ucmVwbGFjZVteXHtdK3t3aGlsZVwoKFx3KS0tW15cW10rXFtcMS50b1N0cmluZ1teXFtdK1xbXDFcXVx8XHxcMS50b1N0cmluZ1teXHtdK3tyZXR1cm5ccypcd1teXCtdK1wrLlx9O1wxPVxkXH1bXlx8XStcfHNjcmlwdFx8ZG9jdW1lbnRcfGpzXHxodHRwc1x8c3JjXHxcdytcfFx3K1x8dHJ5c29tZXRoaW5nbmV3W15ce10rXHtcfVwpXCk8LnNjcmlwdD5+Ijt9czoyMjoiMTE4LDk3LDExNCwzMiw5OSwzMiw2MSI7YToyOntpOjA7czoyMDoiaW5qZWN0ZWQuanNfZXZhbC4wMDkiO2k6MTtzOjczOiJ+PHNjcmlwdFtcc10qdHlwZT0uP3RleHQuamF2YXNjcmlwdC4/W14+XSs+ZXZhbFwoW1xkXSssW147XStcKTs8LnNjcmlwdD5+Ijt9czozNjoiZDJsdVpHOTNMbTl1ZFc1c2IyRmtQV1oxYm1OMGFXOXVLQ2w3IjthOjI6e2k6MDtzOjIwOiJpbmplY3RlZC5qc19ldmFsLjAxMCI7aToxO3M6Njc6In5ldmFsXChhdG9iXCguW147XStkMmx1Wkc5M0xtOXVkVzVzYjJGa1BXWjFibU4wYVc5dUtDbDdbXlwpXStcKVwpO34iO31zOjQ0OiJvbmZvY3VzPWphdmFzY3JpcHQ6ZXZhbChTdHJpbmcuZnJvbUNoYXJDb2RlKCI7YToyOntpOjA7czoyMDoiaW5qZWN0ZWQuanNfZXZhbC4wMTIiO2k6MTtzOjYwOiJ+amF2YXNjcmlwdDpldmFsXChTdHJpbmcuZnJvbUNoYXJDb2RlXCgoXGQrLCl7MSwyNTB9XGQrXClcKX4iO319czoxMzoiY3JlYXRlRWxlbWVudCI7YToxMzp7aTowO2k6MTA7czoxNToiLmNyZWF0ZUVsZW1lbnQoIjthOjExOntpOjA7aToxMDtzOjU6ImF0b2IoIjthOjg6e2k6MDtpOjEwO3M6NToiYUhSMGMiO2E6OTp7aTowO2k6MTA7czoxOToid2luZG93LmF0b2IoImFIUjBjSCI7YTozOntpOjA7aToxMDtzOjMwOiIod2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiO2E6Mjp7aTowO2k6MTA7czoxMzoiLmFwcGVuZENoaWxkKCI7YToyOntpOjA7czoyNjoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wNTkuMDIiO2k6MTtzOjIyNjoifmlmW1xzXSpcKHdpbmRvd1wubG9jYXRpb25cLmhyZWZcLmluZGV4T2ZcKFteXHtdKz5bXHNdKi0/W1xkXStcKVtcc10qXHtbXHNdKnZhciBbXHddK1tcc10qPVtcc10qZG9jdW1lbnRcLmNyZWF0ZUVsZW1lbnRcKFteO10rXCk7W1xzXSpbXHddK1wuc3JjW1xzXSo9W1xzXSp3aW5kb3dcLmF0b2JcKC5hSFJbXjtdKztbXHNdKmRvY3VtZW50W147XSthcHBlbmRDaGlsZFwoW1x3XStcKTtbXHNdKlx9fiI7fX1zOjIxOiJbMF0uYXBwZW5kQ2hpbGQoaW1nKTsiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDU5IjtpOjE7czoxODY6In52YXIgaW1nW1xzXSo9W1xzXSpkb2N1bWVudFwuY3JlYXRlRWxlbWVudFwoW147XStcKTtbXHNdKmltZ1wuc3JjW1xzXSo9W1xzXSp3aW5kb3dcLmF0b2JcKC5hSFIwY0hNNlteXCldK1wpW15cfT5dKmRvY3VtZW50XC5nZXRFbGVtZW50c0J5VGFnTmFtZVwoLmhlYWQuXClcWzBcXVwuYXBwZW5kQ2hpbGRcKGltZ1wpWztcc10qfiI7fX1zOjE0OiJvbmVwYWdlJywnYUhSMCI7YToyOntpOjA7aToxMDtzOjYwOiJzcmM9YXRvYihtKTtzLmJvZHkuYXBwZW5kQ2hpbGQobil9fSkod2luZG93LGRvY3VtZW50LCdzY3JpcHQiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDg4IjtpOjE7czoxMTI6In5cKGZ1bmN0aW9uXCguLC4sLiwuLC4sLixbXlx9XStcfVx9XClbXHNdKlwod2luZG93LFtcc10qZG9jdW1lbnQsW1xzXSouc2NyaXB0LixbXjtdK29uZXBhZ2UuLFtcc10qLmFIUjBbXjtdK1wpO34iO319czoxNToiIWZ1bmN0aW9uKCl7dmFyIjthOjI6e2k6MDtpOjEwO3M6MjU6Ii5wYXJlbnROb2RlLmluc2VydEJlZm9yZSgiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDkwIjtpOjE7czo3MzoifiFmdW5jdGlvblwoXClce3ZhciBbXHddKz1hdG9iXCguYUhSMFteXH1dK2luc2VydEJlZm9yZVwoW15cKV0rXClcfVwoXCk7fiI7fX1zOjQ0OiImJiF3aW5kb3cuZGV2dG9vbHMub3BlbiYmInVuZGVmaW5lZCI9PXR5cGVvZiI7YToyOntpOjA7aToxMDtzOjM2OiIsc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXtpZighd2luZG93LiQiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDkxIjtpOjE7czo3NjoiflwoZnVuY3Rpb25cKFwpXHsudXNlIHN0cmljdC47W15cW10rYXRvYlwoLmFIUjBjW15cfV0rW1xzXH1dKixbXHNdKltcZF0rXCk7fiI7fX1zOjI1OiJ2YXIgYXBpX2tleSA9IGF0b2IoImFIUjBjIjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5qc19hcHBlbmRDaGlsZC4wMDIiO2k6MTtzOjUwOiJ+dmFyIGFwaV9rZXkgPSBhdG9iXCguYUhSW148XSthcHBlbmRDaGlsZFwoYXBpXCk7fiI7fXM6MzE6Im5pZiggbG9jYXRpb24uaHJlZi5zZWFyY2goYXRvYigiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMTY3IjtpOjE7czoxMzQ6In48c2NyaXB0W14+XSo/Pi5yLm5pZlwoIGxvY2F0aW9uLmhyZWYuc2VhcmNoLmF0b2JcKFtePl0rXC5zcmNccyo9XHMqYXRvYlwoW15cKV0rXCk7XHMqZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZFwoXHcrXCk7fS5yLm48LnNjcmlwdD5+Ijt9czozMToicHVzaCgidXJsJSIrbG9jYXRpb24uaG9zdG5hbWUpLCI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuanNfYXBwZW5kQ2hpbGQuMDE0IjtpOjE7czozNjI6In5mdW5jdGlvbltcc10qW1x3XStcKFwpW1xzXSpce1tcc10qQXJyYXlcLmZyb21cKGRvY3VtZW50XC5nZXRFbGVtZW50c0J5VGFnTmFtZVwoLmlucHV0LlwpXClcLmZvckVhY2hcKGZ1bmN0aW9uLi4uLlwpXHtudWxsW15ce10rXHtbXHNdKm51bGw9PS5cLmdldEF0dHJpYnV0ZVwoLm9uY2hhbmdlLltefF0rem9uZVx8cmVnaW9uXHxzdGF0ZVteOl0rOlteXH1dK1x9K1tcc10qZnVuY3Rpb25bXHNdKltcd10rXCguXClbXlx9XStcKVx9W1xzXSpbXlx9XStcfVwpLEFycmF5XC5mcm9tXChkb2N1bWVudFteXH1dK1x9XCksW1xzXSpBcnJheVwuZnJvbVwoZG9jdW1lbnRbXlx9XStcfVwpLFtcc10qW1x3XStcKC5cKVx9W15cfV0rXH07W1xzXSp+Ijt9czozMzoiKXtyZXR1cm4gYnRvYShlbmNvZGVVUklDb21wb25lbnQoIjthOjI6e2k6MDtzOjMwOiJpbmplY3RlZC5qc19hcHBlbmRDaGlsZC4wMTQuMDIiO2k6MTtzOjE0OToifmZ1bmN0aW9uW1xzXSpbXHddK1woLlwpW1xzXSpce1tcc10qcmV0dXJuW1xzXSpidG9hXChlbmNvZGVVUklDb21wb25lbnRbXixdKyxmdW5jdGlvblteXHtdK1x7cmV0dXJuIFN0cmluZ1wuZnJvbUNoYXJDb2RlXChwYXJzZUludFteXH1dK1tcfVwpXStbXHNdKn4iO319czo1NToidmFyIHM9dGhpcy5yZWFkeVN0YXRlO3MmJnMhPT0ibG9hZGVkIiYmcyE9PSJjb21wbGV0ZSJ8fCI7YToyOntpOjA7aToxMDtzOjM0OiIpfSkod2luZG93LGRvY3VtZW50LCJzY3JpcHQiLGF0b2IoIjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjE1NSI7aToxO3M6MTY4OiJ+XChmdW5jdGlvblwoLixbXHNdKi4sW1xzXSouLFtcc10qLixbXHNdKlteXCldK1wpW1xzXSpce1tcc10qdmFyW14hXSshPT0ubG9hZGVkLiYmcyE9PS5jb21wbGV0ZS5bXlx9XStcfSxbXjtdK3dpbmRvdyxbXHNdKmRvY3VtZW50LFtcc10qLnNjcmlwdC4sW1xzXSphdG9iW147XStcKTtbXHNdKn4iO319czoyMDoiKGZ1bmN0aW9uKHcsZCx0LHIsdSkiO2E6Mjp7aTowO2k6MTA7czo1MDoiaW5zZXJ0QmVmb3JlKG4saSl9KSh3aW5kb3csZG9jdW1lbnQsInNjcmlwdCIsYXRvYigiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMTYyIjtpOjE7czoxMjI6In48c2NyaXB0W14+XSo+KFwvXC9ccyo8IVxbQ0RBVEFcWyk/XHMqXChmdW5jdGlvblwodyxkLHQscix1XClce3ZhciBbXjxdK1wpXCh3aW5kb3csZG9jdW1lbnQsLnNjcmlwdC4sYXRvYlwoW148XSs8LnNjcmlwdD5+Ijt9fXM6Mjk6In5hdG9iXChbR2ddb29nbGVfW1R0XW9rZW5cKTt+IjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjEyNCI7aToxO3M6MjQyOiJ+dmFyIEdUTVtcc10qPVtcc10qZG9jdW1lbnRcLmNyZWF0ZUVsZW1lbnQuLnNjcmlwdC4uLFtcc10qLm9vZ2xlXy5va2VuW1xzXSo9W1xzXSpbJyJdW147XSs7W1xzXSpHVE1cLmFzeW5jW147XSs7W1xzXSpHVE1cLnNyY1tcc10qPVtcc10qYXRvYlwoLm9vZ2xlXy5va2VuXCk7W147XSpcLmdldEVsZW1lbnRzQnlUYWdOYW1lW147XSs7KD86W1xzXSpzLnBhcmVudE5vZGVcLmluc2VydEJlZm9yZVwoR1RNLFteXCldK1wpOyk/fiI7fXM6NjQ6Ij09ZG9jdW1lbnQubG9jYXRpb24ucHJvdG9jb2w/Imh0dHBzOi8vIjoiaHR0cDovLyIpK3dpbmRvdy5hdG9iKCIiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDcyIjtpOjE7czoyMDk6In5cIWZ1bmN0aW9uXChcKVx7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudC4ic2NyaXB0Ii47W15cc10rPT1kb2N1bWVudC5sb2NhdGlvbi5wcm90b2NvbFw/Imh0dHBzOlwvXC8iOiJodHRwOlwvXC8iXClcK3dpbmRvdy5hdG9iXCgiW1x3XCs9XSsiXCksXChkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZVteXHNdKzBdLi5hcHBlbmRDaGlsZC50Llx9XChcKTt+Ijt9czo0OToib25jbGljaycsYXRvYihzLnNwbGl0KHMuc3BsaXQoJycpWzBdKS5qb2luKCcnKSkpOyI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4xNTciO2k6MTtzOjE4ODoifjxzY3JpcHRbXjxdKj5mdW5jdGlvbiBbXiBdKyBlPWRvY3VtZW50W148XStcLnNldEF0dHJpYnV0ZVwoLm9uY2xpY2suLGF0b2Iucy5zcGxpdC5zLnNwbGl0Li4uLlxbMFxdLi5qb2luLi4uXClcKVwpO2UuY2xpY2suLjtcfTwuc2NyaXB0PlxzKjxzY3JpcHRbXjxdKj5cdytcKFsnIl1bXlwpXXs1MDAsfVsnIl1cKTwuc2NyaXB0Pn4iO31zOjMzOiJoICYmIGguaW5jbHVkZXMoYXRvYihvLl9oai5pZGhqKSkiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMTYzIjtpOjE7czoxNzY6In48c2NyaXB0XHMqPlxzKndpbmRvd1wuYWRkRXZlbnRMaXN0ZW5lclwoLmxvYWQuLCBmdW5jdGlvblxXK2Z1bmN0aW9uIFwoaCwgbywgdCwgaiwgYSwgclwpW148LV0rXC5zcmMgPSBcdytcLnN1YnN0clwoW147XSthdG9iXChcdy5faGpbXjxdK2hvdGphci5jb21cL2NcL1tePH1dK31cKTtccyo8LnNjcmlwdD5+Ijt9fXM6MzM6Ii5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdOyI7YToyOntpOjA7aToxMDtzOjEwOiJ9KSh3aW5kb3csIjthOjI6e2k6MDtpOjEwO3M6ODoieC5vbmxvYWQiO2E6Mjp7aTowO2k6MTA7czo1OiJ0Y2lkOiI7YToyOntpOjA7aToxMDtzOjg1OiJ+XChbXHNdKmZ1bmN0aW9uW1xzXSpcKFtcc10qcFtcc10qLFtcc10qdVtcc10qLFtcc10qc1tcc10qLFtcc10qaFtcc10qLFtcc10qeFtcc10qXCl+IjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5qc191bndhbnRlZF9hZHMuMDE3IjtpOjE7czoyNjQ6In5cKFtcc10qZnVuY3Rpb25bXHNdKlwoW1xzXSpwW1xzXSosW1xzXSp1W1xzXSosW1xzXSpzW1xzXSosW1xzXSpoW1xzXSosW1xzXSp4W1xzXSpcKVtcc10qXHtbXHNdKmhbXHNdKj1bXHNdKnVcLmdldEVsZW1lbnRzQnlUYWdOYW1lXCguaGVhZC5cKVxbMFxdO1tcc10qeFteXH1dK3RjaWQ6W1xzXSpbXGRdK1teXH1dK1x9W148XSthcHBlbmRDaGlsZFwoeFwpO1tcc10qXH1bXHNdKlwpW1xzXSpcKFtcc10qd2luZG93LFtcc10qZG9jdW1lbnRbXjtdK1wpO1tcc10qfiI7fX19fX1zOjE1OiJ2YXIgZD1kb2N1bWVudDsiO2E6Mjp7aTowO2k6MTA7czoxNjoiLmFwcGVuZENoaWxkKHMpOyI7YToyOntpOjA7aToxMDtzOjExMDoifnZhciBkPWRvY3VtZW50O1tcc10qdmFyIFtcc10qcz1bXHNdKmRcLmNyZWF0ZUVsZW1lbnRcKC5zY3JpcHQuXCk7W1xzXSouXC5zcmNbXjxdK1wuYXBwZW5kQ2hpbGRcKHNcKTtbXHNdKlx9P34iO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLmpzX2FwcGVuZENoaWxkLjAwNSI7aToxO3M6MTEwOiJ+dmFyIGQ9ZG9jdW1lbnQ7W1xzXSp2YXIgW1xzXSpzPVtcc10qZFwuY3JlYXRlRWxlbWVudFwoLnNjcmlwdC5cKTtbXHNdKi5cLnNyY1tePF0rXC5hcHBlbmRDaGlsZFwoc1wpO1tcc10qXH0/fiI7fX19czoyMzoiLnJlcGxhY2UoL1swLTlBLVpdL2csIiIiO2E6Mjp7aTowO2k6MTA7czoyODoiaWYoLTEhPWxvY2F0aW9uLmhyZWYuc2VhcmNoKCI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuanNfYXBwZW5kQ2hpbGQuMDAzIjtpOjE7czo5MjoifmlmXCgtMSE9bG9jYXRpb24uaHJlZi5zZWFyY2hcKFteXC5dK1wucmVwbGFjZVwoLlxbMC05QS1aW15cfV0rYXBwZW5kQ2hpbGRcKFteXCldK1wpW1xzXSpcfX4iO319czoyMToifSkoZG9jdW1lbnQsIFwnc2NyaXB0IjthOjI6e2k6MDtpOjEwO3M6MzE6IiZ2PVwnICsgKG5ldyBEYXRlKCkpLmdldFRpbWUoKTsiO2E6Mjp7aTowO3M6MzA6ImluamVjdGVkLmpzX2NyZWF0ZV9lbGVtZW50LjAxMSI7aToxO3M6MTU5OiJ+XChmdW5jdGlvbltcc10qXChbXHddKyxbXHNdKltcd10rLFtcc10qW1x3XStcKVtcc10qXHtbXHNdKnZhcltcc10qW1x3XStbXHNdKj1bXHNdKltcd10rXC5jcmVhdGVFbGVtZW50XChbXHddK1wpLFteXH1dK1x9XClcKGRvY3VtZW50LFtcc10qLi5zY3JpcHQuLixbXjtdK1wpO34iO319czoxMDoic2V0VGltZW91dCI7YTozOntpOjA7aToxMDtzOjYxOiJzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHBvLHMpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgZWxfIjthOjI6e2k6MDtpOjEwO3M6MTE6Iik7fX19KX0pKCk7IjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjE0MyI7aToxO3M6MjQzOiJ+PHNwYW4gKD86aWR8Y2xhc3MpPSIoXHcrLVtcdy1dKykiW14+XSo+XHMqPHNjcmlwdFtePl0qPlxzKlwoZnVuY3Rpb25cKFwpXHt2YXIgcG89W148XStzZXRUaW1lb3V0XChmdW5jdGlvblwoXCl7dmFyIGVsXz1kb2N1bWVudC5nZXRFbGVtZW50KEJ5SWR8c0J5Q2xhc3NOYW1lKVwoIlwxIlwpO2lmXChlbF9bXjxdKyh0cmltXChcKVwpfFwoZWxfW15cKV0qXCkpO1x9XH1cfVwpXH1cKVwoXCk7PC5zY3JpcHQ+XHMqPC5zcGFuPn4iO319czo0NToiL2dhdGUucGhwP2NhcmRfbnVtPSIrZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjE1MSI7aToxO3M6MjI4OiJ+PHNjcmlwdFtePl0qPlxzKmZ1bmN0aW9uIFtcd10rXChcKVx7W1xzXSpkb2N1bWVudFwuZ2V0RWxlbWVudEJ5SWRcKFteXCldK1wpXC5zcmM9Imh0dFteIl0rXC9nYXRlXC5waHBcP2NhcmRfbnVtPSJcK1teXH1dK1x9W1xzXSpmdW5jdGlvbltePFx9XStcfVtcc10qd2luZG93XC5vbmxvYWRbXlx9XStcfVtcc10qd2luZG93XC5vbnVubG9hZFtePFx9XStcKFwpO1tcc10qXH1bXHNdKjwuc2NyaXB0Pn4iO319czo4ODoiaWYocy5zdHlsZVNoZWV0KSBzLnN0eWxlU2hlZXQuY3NzVGV4dD1jOyBlbHNlIHMuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYykpOyI7YToyOntpOjA7czoyMzoiaW5qZWN0ZWQuaGlkZGVuLWRpdi4wMzgiO2k6MTtzOjE0NzoifmZ1bmN0aW9uIFtcd10rXChcKVtcc10qXHtbXHNdKnZhciBbXHddK1tePF0rc3R5bGVTaGVldFwpIHNcLnN0eWxlU2hlZXQuY3NzVGV4dD1jOyBlbHNlIHNcLmFwcGVuZENoaWxkXChkb2N1bWVudFwuY3JlYXRlVGV4dE5vZGVcKGNcKVwpO1tePF0rXChcKTt+Ijt9czo4Njoic2V0QXR0cmlidXRlKCdkYXRhLXpvbmUnLHopLHAuYXBwZW5kQ2hpbGQocyk7fSkoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0JyksJ2h0dHAiO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLmpzX2FwcGVuZENoaWxkLjAwOCI7aToxO3M6MTcwOiJ+PHNjcmlwdD5bXHNdKlwoZnVuY3Rpb25cKC4sLiwuLFteXCldKlwpXHsuXC5zcmM9LiwuXC5zZXRBdHRyaWJ1dGVcKC5kYXRhLXpvbmUuLC5cKSwuXC5hcHBlbmRDaGlsZFtePF0rZG9jdW1lbnRFbGVtZW50XClbXHNdKjwuc2NyaXB0Pltcc10qKDxzY3JpcHRbXjxdKz48LnNjcmlwdD5bXHNdKikqfiI7fXM6Mjg6IisnanF1ZXJ5JytrWzRdKydhcGknK2suc2xpY2UiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMTQwIjtpOjE7czoxMzA6In52YXJccypcdys9XHcrXC5zcmM7XHcrPVx3K1wuc2xpY2UuXGQrLFxzKlxkK1wpXCsuXHcrLlwrXHcrLlxkKy5cKy5cdysuXCtcdytcLnNsaWNlXChcZCssXGQrXClcK1x3Ky5cZCtcXVwrXHcrXC5zbGljZVwoXGQrLFxkK1wpO34iO31zOjEzOiIuYXBwZW5kQ2hpbGQoIjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5qc19hcHBlbmRDaGlsZC4wMDEiO2k6MTtpOjExO319czo1MzoiZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2JvZHknKVswXS5hcHBlbmRDaGlsZCgiO2E6Mjp7aTowO2k6MTA7czo0MjoidmFyIGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7IjthOjI6e2k6MDtpOjEwO3M6MjY6ImVsLnNyYyA9ICdceDY4XHg3NFx4NzRceDcwIjthOjI6e2k6MDtzOjI2OiJoYWNrdG9vbC5jYy1zdGVhbGVyLjA1MS4wMiI7aToxO3M6MTU1OiJ+c2V0VGltZW91dFwoZnVuY3Rpb25cKFwpW1xzXSpce1tcc10qdmFyIGVsW1xzXSo9W1xzXSpkb2N1bWVudFwuY3JlYXRlRWxlbWVudFwoLnNjcmlwdC5cKTtbXHNdKmVsXC5zcmMgPSAuLng2OFtefV0rYXBwZW5kQ2hpbGRcKGVsXCk7W1xzXSpcfSxbXHNdKltcZF0rXCk7fiI7fX19czo1MzoiPnZhciBwbyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpOyBwby50eXBlID0iO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDQyIjtpOjE7czozMTc6In48c2NyaXB0IHR5cGU9LnRleHQuamF2YXNjcmlwdC4+dmFyIHBvID0gZG9jdW1lbnRcLmNyZWF0ZUVsZW1lbnRcKC5zY3JpcHQuXCk7W1xzXSpwby50eXBlW1xzXSo9W1xzXSoudGV4dC5qYXZhc2NyaXB0LjtbXHNdKnBvXC5hc3luY1tcc10qPVtcc10qdHJ1ZTtbXHNdKnBvXC5zcmNbXHNdKj1bXHNdKi5cL1wvW147XStcL1teO10rO1tcc10qdmFyIHNbXHNdKj1bXHNdKmRvY3VtZW50XC5nZXRFbGVtZW50c0J5VGFnTmFtZS4uc2NyaXB0Li5cWzBcXTtbXHNdKnNcLnBhcmVudE5vZGVcLmluc2VydEJlZm9yZVwocG8sW1xzXSpzXCk7W1xzXSo8LnNjcmlwdD5+Ijt9czoyNzoib2NsYXNydi5jb20vYXB1LnBocD96b25laWQ9IjthOjI6e2k6MDtzOjIzOiJpbmplY3RlZC5qc19tYWx3YXJlLjAwMyI7aToxO3M6NTcyOiJ+KDxzY3JpcHRccyp0eXBlPS50ZXh0LmphdmFzY3JpcHQuXHMqc3JjPS4uLmdvXC5bXlw/XStcP3pvbmVpZD1cdysuPjwuc2NyaXB0Pik/KDxzY3JpcHRccyp0eXBlPS50ZXh0LmphdmFzY3JpcHQuPi4uPFwhXFtDREFUQVxbXHMqXChmdW5jdGlvblwoXClccypce1xzKnZhclxzKmNvbmZpZ3VyYXRpb25ccyo9XHMqXHtccyoudG9rZW4uOlxzKi5cdysuLFxzKi5leGl0U2NyaXB0Ljpccypce1teXH1dK1x9LFxzKi5wb3BVbmRlci46XHMqXHtccyouZW5hYmxlZC46XHMqdHJ1ZVxzKlx9XHMqfS5ccyp2YXJccypzY3JpcHRccyo9XHMqZG9jdW1lbnQuY3JlYXRlRWxlbWVudFwoLnNjcmlwdC5cKTtccypbXlx7XStce3ZhclteO10rO1xzKmlmXHMqXChyc1teXH1dK1x9O1xzKnZhclxzKmVudHJ5W15cW10rXFtcZFxdO1xzKlteO10rO1xzKlx9XClcKFwpO1xzKi4uXF1cXT48LnNjcmlwdD4pPyg8c2NyaXB0XHMqZGF0YS1jZmFzeW5jPS5mYWxzZS5ccyp0eXBlPS50ZXh0LmphdmFzY3JpcHQuXHMqc3JjPS4uLlx3Ky5jbGtzaXRlW15cL10rXC9hZFNlcnZlLmJhbm5lcnNcP3RpZD1bXiciXSsuPjwuc2NyaXB0Pik/fiI7fXM6NDI6InZhciBwbyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpOyI7YToyOntpOjA7czozMDoiaW5qZWN0ZWQuanNfY3JlYXRlX2VsZW1lbnQuMDA0IjtpOjE7czoxOTg6In48c2NyaXB0W14+XSs+dmFyXHMqKHBvKVxzKj1ccypkb2N1bWVudFwuY3JlYXRlRWxlbWVudFwoLnNjcmlwdC5cKTtccypcMVwudHlwZVteJ10rJ3RleHQuamF2YXNjcmlwdC47XHMqXDFcLmFzeW5jW14nXSsnLi5nb29naWVjbG91ZFteO10rO1xzKnZhclxzKlteJ10rJ3NjcmlwdCdcKVxbXGRcXTtbXlwoXStcKFwxXCxccypzXCk7PC5zY3JpcHQ+fiI7fXM6Nzc6ImRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpO2Eud2lkdGg9IjFweCIsYS5oZWlnaHQ9IjFweCIsYS5pZD10LGEuc3JjPWF0b2IoIjthOjI6e2k6MDtzOjI5OiJpbmplY3RlZC5tYWdlbnRvX3Nob3BsaWZ0LjAwNCI7aToxO3M6NTAzOiJ+PHNjcmlwdD5ccypmdW5jdGlvblxzKlx3K1woXHdcKVxzKlx7XHMqcmV0dXJuXHMqYnRvYVwoXHMqZW5jb2RlVVJJQ29tcG9uZW50XChcdytcKVxzKlwucmVwbGFjZVxzKlwoLlwlXChcW1teXDJdKz1kb2N1bWVudFwuY3JlYXRlRWxlbWVudFwoLlx3Ky5cKTtccypcd1wud2lkdGhccyo9XHMqLlxkXHMqcHguXHMqLFxzKlx3LmhlaWdodFxzKj1ccyouXGRccypweC5ccyosXHMqXHcuaWRccyo9XHMqXHdccyosXHMqXHdcLnNyY1xzKj1ccyphdG9iXChbXn1dK31ccypmdW5jdGlvblxzKihcdytcKFwpKVxzKntccyp2YXJccypcdytccyo9XHMqXFtcXVxzKjtccypcd1wucHVzaFwoLnVybFwlLlwrbG9jYXRpb25cLmhvc3RuYW1lXClbXn1dK31ccypcKVxzKixccypBcnJheVwuZnJvbVwoZG9jdW1lbnRcLmdldEVsZW1lbnRzQnlUYWdOYW1lW15cMl0rLHNldEludGVydmFsXCguXDEuXHMqLFxzKlx3K1wpXHMqLFxzKnNldEludGVydmFsXCguXHcrXChcKS4sXGQrXClccypcKVxzKn1ccyo7fiI7fXM6OTQ6ImN1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtlbC5pbm5lckhUTUw9IiYjODI7JiMxMDE7JiMxMDI7JiMxMDE7JiMxMTQ7JiMxMDE7JiMxMTA7JiM5OTsmIzEwMTsiO2E6Mjp7aTowO3M6MzA6ImluamVjdGVkLmpzX2NyZWF0ZV9lbGVtZW50LjAwMSI7aToxO3M6OTI6In48c2NyaXB0PmVsPWRvLio/Y3VtZW50LmNyZWF0ZUVsZW1lbnQuLmRpdi4uO2VsLmlubmVySFRNTD0iJiM4MjsmIzEwMTsuKz9lXChzXCk7PFwvc2NyaXB0Pn5zIjt9czo4OiJtYWluMS5qcyI7YToyOntpOjA7czozMDoiaW5qZWN0ZWQuanNfY3JlYXRlX2VsZW1lbnQuMDAyIjtpOjE7czoxNDY6In48c2NyaXB0PltePl0rZ2NzZVxzKj1ccypkb2N1bWVudC5jcmVhdGVFbGVtZW50Li5zY3JpcHQuLjtccypnY3NlLnR5cGVbXj5dK2djc2Uuc3JjXHMqXD1ccyouaHR0cFteO10rbWFpbjEuanNbXj5dK2luc2VydEJlZm9yZS5nY3NlW148XSs8LnNjcmlwdD5+Ijt9czoyODoic2VjdXJlLWNvbnRlbnQtZGVsaXZlcnkuY29tLyI7YToyOntpOjA7czozMDoiaW5qZWN0ZWQuanNfY3JlYXRlX2VsZW1lbnQuMDAzIjtpOjE7czozMTY6In48c2NyaXB0XHNbXjw+XSo/c3JjXHMqPVxzKlsiJ10/W148PiInXSo/XC9cL3NlY3VyZS1jb250ZW50LWRlbGl2ZXJ5LmNvbVwvW148Pl0rPz5bXjw+XSo/PC9zY3JpcHQ+XHMqPHNjcmlwdFtefV0rfVxzKjtccypcKGZ1bmN0aW9uXChcKVxzKntccyp2YXJccypcdytccyo9XHMqZG9jdW1lbnRcLmNyZWF0ZUVsZW1lbnRbXj5dKz48LnNjcmlwdD48c2NyaXB0XHMqaWRccyo9W146XSs6XC9cL2lcLnNpbXBsaVwuZmlcL1tePl0rPjxcL3NjcmlwdD5ccyo8c2NyaXB0W146XSs6XC9cL2lcLnNlbGVjdGlvbmxpbmtzanNcLmluZm9cL1tePF0rPFwvc2NyaXB0Pn4iO31zOjExOToiZG9jdW1lbnQuY3JlYXRlRWxlbWVudChTdHJpbmcuZnJvbUNoYXJDb2RlKDExNSwgOTksIDExNCwgMTA1LCAxMTIsIDExNikpOyBzYy5zcmM9U3RyaW5nLmZyb21DaGFyQ29kZSgxMDQsIDExNiwgMTE2LCAxMTIiO2E6Mjp7aTowO3M6MzE6ImluamVjdGVkLmpzX2NyZWF0ZV9kb2N1bWVudC4wMjciO2k6MTtzOjM2NDoifjxzY3JpcFtePl0rPlxzKnZhclxzKlx3K1xzKj1ccypkb2N1bWVudFwuY3JlYXRlRWxlbWVudFwoU3RyaW5nXC5mcm9tQ2hhckNvZGVcKDExNSxccyo5OSxccyoxMTQsXHMqMTA1LFxzKjExMixccyoxMTZcKVwpO1xzKlx3K1wuc3JjXHMqPVxzKlN0cmluZ1wuZnJvbUNoYXJDb2RlXCgxMDQsXHMqMTE2LFxzKjExNixccyoxMTIsW147XSs7XHMqXHcrXC50eXBlXHMqPVxzKlN0cmluZ1wuZnJvbUNoYXJDb2RlXChbXjtdKztccypkb2N1bWVudFwuZ2V0RWxlbWVudHNCeVRhZ05hbWVcKFN0cmluZ1wuZnJvbUNoYXJDb2RlXCgxMDQsXHMqMTAxLFxzKjk3LFxzKjEwMFwpXClcW1xkK1xdXC5hcHBlbmRDaGlsZFwoXHcrXCk7XHMqPC5zY3JpcHQ+fiI7fXM6NDM6ImRvY3VtZW50LmxvY2F0aW9uLnByb3RvY29sKyIvL2RubjUwNnlyYmFncmciO2E6Mjp7aTowO3M6MjM6ImluamVjdGVkLmpzX21hbHdhcmUuMDA0IjtpOjE7czo0MDg6In48c2NyaXBbXj5dKz5ccyooXC9cLyk/c2V0VGltZW91dFwoZnVuY3Rpb25cKFwpXHMqe1xzKnZhclxzKlx3XHMqPVxzKmRvY3VtZW50XC5jcmVhdGVFbGVtZW50XCguc2NyaXB0LlwpXHMqO1xzKlwxP3ZhclxzKlx3XHMqPVxzKmRvY3VtZW50XC5nZXRFbGVtZW50c0J5VGFnTmFtZVwoLnNjcmlwdC5cKVxzKlxbXGRcXVxzKjtccypcMT9cd1wuc3JjXHMqPVxzKmRvY3VtZW50XC5sb2NhdGlvblwucHJvdG9jb2xcK1teXCtdK1wrTWF0aFwuZmxvb3JcKG5ld1xzKkRhdGVcKFwpXC5nZXRUaW1lXChcKVteO10rO1xzKlwxP1x3XC5hc3luY1xzKj1ccyp0cnVlXHMqO1x3XC50eXBlXHMqPVxzKi50ZXh0XC9qYXZhc2NyaXB0LlxzKjtccypcd1wucGFyZW50Tm9kZVwuaW5zZXJ0QmVmb3JlXChbXjtdKztccyo8XC9zY3JpcHQ+fiI7fXM6MTU6InBhcGVycGxhbmVzbGl2ZSI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4xMjciO2k6MTtzOjIzNjoiflwoZnVuY3Rpb25cKFwpXHt2YXJbXlwoXStkb2N1bWVudC5jcmVhdGVFbGVtZW50XCguc2NyaXB0LlwpO1teO10rO1tcd10rLmFzeW5jPXRydWU7W1xzXSpbXHddK1wuc3JjPVteO10rO3Zhcltcc10qW1x3XSs9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWVcKC5zY3JpcHQuXClcW1tcZF0rXF07W1x3XSsucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmVcKFtcd10rLFtcd10rXCk7XH1cKVtcc10qXChcKTtbXHNdKn4iO319czo4OiJsb2NhdGlvbiI7YToxNTp7aTowO2k6MTA7czoyNDoid2luZG93LnRvcC5sb2NhdGlvbi5ocmVmIjthOjM6e2k6MDtpOjEwO3M6MTM6Ijt9c2V0VGltZW91dCgiO2E6Mjp7aTowO2k6MTA7czo4ODoifmZ1bmN0aW9uIFtcd10rXChcKVtcc10qXHtbXHNdKndpbmRvd1wudG9wXC5sb2NhdGlvblwuaHJlZj1bXjtdKztbXHNdKlx9W1xzXSpzZXRUaW1lb3V0fiI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQuanNfcmVkaXJlY3QuMDMxIjtpOjE7czoyNjc6In48ZGl2IGlkPS5bXHddKy4+W15cblx7XSo8c2NyaXB0PihTdHJpbmdcLnByb3RvdHlwZVwuW1x3XStbXHNdKj1bXHNdKmZ1bmN0aW9uXChcKVtcc10qXHtbXHNdKnJldHVybiB0aGlzXC5yZXBsYWNlW15cfV0rO1tcfVwpXHM7XStbXlx7XSspP2Z1bmN0aW9uIFtcd10rXChcKVtcc10qXHtbXHNdKndpbmRvd1wudG9wXC5sb2NhdGlvblwuaHJlZltcc10qPVteXH1dKztcfXNldFRpbWVvdXRcKFtcd10rLFtcc10qW1xkXStcKTtbXHNdKjwuc2NyaXB0Pltcc10qPC5kaXY+fiI7fX1zOjMyOiI8c2NyaXB0PndpbmRvdy50b3AubG9jYXRpb24uaHJlZiI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuanNfcmVkaXJlY3QuMDMxLjAyIjtpOjE7czo3NzoifjxzY3JpcHQ+d2luZG93XC50b3BcLmxvY2F0aW9uXC5ocmVmW1xzXSo9W1xzXSpbJyJdW14nIl0rWyciXTtbXHNdKjwuc2NyaXB0Pn4iO319czoyNzoiaSl8fG5hdmlnYXRvclsndXNlckFnZW50J11bIjthOjI6e2k6MDtpOjEwO3M6MTI6IiE9PSd1bicpe2lmKCI7YToyOntpOjA7aToxMDtzOjE3OiJjb29raWUnLCdsb2NhdGlvbiI7YToyOntpOjA7czoyMzoiaW5qZWN0ZWQuanNfbWFsd2FyZS4wMTIiO2k6MTtzOjEyOToifnZhciBbXHddK1tcc10qPVtcc10qW14oXStcXTtcKGZ1bmN0aW9uXChbXHddKyxbXHNdKltcd10rXClce1tcc10qdmFyW14+XSt3aW5kb3dcW1tcd10rXChbXlwpXStcKVxdXFtbXlx9XStbXH1dK1wodGhpc1wpXClbO1x9XSt+Ijt9fX1zOjY6IlJlZ0V4cCI7YTo0OntpOjA7aToxMDtzOjU5OiIudGVzdCh3aW5kb3cubG9jYXRpb24pKW5ldyBzZWxmWyJGdW5jdGlvbiJ8fCJPYmplY3QiXShhdG9iKCI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4xMTciO2k6MTtzOjExNToifnZhcltcc10qW1x3XSs7W1xzXSppZlwobmV3W1xzXSpSZWdFeHBcKFteXFtdK1wudGVzdFwod2luZG93XC5sb2NhdGlvblwpK25ld1tcc10qc2VsZlxbLkZ1bmN0aW9uW147XStjYWxsXCh0aGlzXCk7fiI7fXM6Njc6ImlmKG5ldyBSZWdFeHAoYXRvYignWTJobFkydHZkWFE9JykpLnRlc3Qod2luZG93LmxvY2F0aW9uKSluZXcgc2VsZlsiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMTMyIjtpOjE7czoxNjM6In52YXJbXHNdKltcd10rO1tcc10qaWZcKG5ld1tcc10qUmVnRXhwXChhdG9iXCguWTJobFkyW15cKV0rXClcKVwudGVzdFwod2luZG93XC5sb2NhdGlvblwpXClbXHNdKm5ld1tcc10qc2VsZlxbLltcd10rLlx8XHxbXlwoXStcKGF0b2JcKC5bXlwpXStcKVwpXC5jYWxsXChbXHddK1wpO34iO31zOjMzOiJdO3ZhciBzb2M7aWYoIG5ldyBSZWdFeHAoYXRvYihfMHgiO2E6Mjp7aTowO3M6MjY6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMTE3LjAyIjtpOjE7czoxMTM6In48c2NyaXB0W14+XSo+XHMqdmFyIF8weFx3K1xzKj1ccypcW1siJ11bXlxdXStcXTt2YXIgc29jO2lmXCggbmV3IFJlZ0V4cFwoYXRvYlwoXzB4W148XStcKHRoaXNcKVteXHc8XSs8LnNjcmlwdD5+Ijt9fXM6Mjc6Ii54eXovanMvc3RhdC5qcyI+PC9zY3JpcHQ+PCI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuanNfbG9jYXRpb25fcmVwbGFjZS4wMDEiO2k6MTtzOjE4MjoifjxzY3JpcHRccyp0eXBlPS50ZXh0LmphdmFzY3JpcHQuXHMqc3JjPS5baHRwc117NCx9OlteXC5dK1wueHl6LmpzLnN0YXRcLmpzLj48LnNjcmlwdD48c2NyaXB0XHMqdHlwZT0udGV4dC5qYXZhc2NyaXB0Lj5ccypsb2NhdGlvbi5yZXBsYWNlXCguW2h0cHNdezQsfTpbXlw/XStcP1teXCldK1wpO1xzKjwuc2NyaXB0Pn4iO31zOjExMDoibG9jYXRpb24uaHJlZi5pbmRleE9mKCd3cC1hZG1pbicpICE9IC0xIHx8IGxvY2F0aW9uLmhyZWYuaW5kZXhPZignd3AtbG9naW4nKSAhPSAtMSApIHsgcmV0dXJuIGZhbHNlOyB9IHdpbmRvdy4iO2E6Mjp7aTowO3M6MzA6ImluamVjdGVkLmpzX2NyZWF0ZV9lbGVtZW50LjAwNiI7aToxO3M6MzI0OiJ+PHNjcmlwdD5ccypcKGZ1bmN0aW9uXChcKVxzKntccyppZlxzKlwod2luZG93XC5cdytccypcfFx8XHMqbG9jYXRpb25cLmhyZWZcLmluZGV4T2ZcKC53cC1hZG1pbi5cKVxzKlwhPVxzKi0xXHMqXHxcfFxzKmxvY2F0aW9uXC5ocmVmXC5pbmRleE9mXCgud3AtbG9naW4uXClccypcIT1ccyotMVxzKlwpW147XSs7XHMqfVxzKndpbmRvd1wuW159XSt9XHMqfVxzKjtccyp4bWxIdHRwXC5vcGVuXCguR0VULixccypcdyssXHMqdHJ1ZVwpXHMqO1xzKnhtbEh0dHBcLnNlbmRcKFtee10re1xzKnZhclxzKlx3K1xzKj1ccypKU09OXC5wYXJzZVwoZGF0YVwpXHMqO1tePl0rPn4iO31zOjM2OiI8YnI+PHNjcmlwdD53aW5kb3cubG9jYXRpb24gPSAiaHR0cDoiO2E6Mjp7aTowO3M6MzM6ImluamVjdGVkLmpzX2RvY3VtZW50X2xvY2F0aW9uLjAwNSI7aToxO3M6NTY6In48YnI+PHNjcmlwdD53aW5kb3cubG9jYXRpb24gPSAiaHR0cDouLlteIl0rIjs8LnNjcmlwdD5+Ijt9czo0OToiOyBpZihwYXRybi5leGVjKHJVcmwpKXdpbmRvdy5sb2NhdGlvbi5ocmVmPXRvVXJsOyI7YToyOntpOjA7czozMzoiaW5qZWN0ZWQuanNfZG9jdW1lbnRfbG9jYXRpb24uMDA3IjtpOjE7czoxNTA6In48c2NyaXB0IHR5cGU9InRleHQuamF2YXNjcmlwdCI+Li4uPC4uQ0RBVEEuW1xzXSp2YXIgdG9Vcmw9Imh0dHA6W14+XSt2YXIgcGF0cm49W14+XStwYXRybi5leGVjLnJVcmwuLndpbmRvdy5sb2NhdGlvbi5ocmVmPXRvVXJsO1tcc10qLi4uLi4+PC5zY3JpcHQ+fiI7fXM6ODE6ImlmKCFqUXVlcnkoJyonKS5pcygnI2NjX2NpZCcpICYmIGpRdWVyeSgnI3BfbWV0aG9kX3NhZ2VwYXlzZXJ2ZXInKS5pcygnOmNoZWNrZWQnKSI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wNDkiO2k6MTtzOjY5NToifjxzY3JpcHQ+XHMqdmFyXHMqXHcrXHMqPVxzKnRydWVccyo7XHMqdmFyXHMqXHcrXHMqPVxzKi48XHMqZGl2XHMqY2xhc3NccypbXlwyXStwYXltZW50OmNjX251bWJlclteXDJdK3BheW1lbnQ6Y2NfZXhwX21vbnRoLlxzKm5hbWU9LnBheW1lbnRcW2NjX2V4cF9tb250aFxdW15cMl0ralF1ZXJ5XChkb2N1bWVudFwpXC5yZWFkeVwoZnVuY3Rpb25cKFwpXHMqe1xzKmlmXChccypcIVxzKlwoZG9jdW1lbnRcLmNvb2tpZVwuaW5kZXhPZlwoLnVzZXJwYXlpZC5cKVtefV0rfVxzKjtccypkb2N1bWVudFwuY29va2llXHMqPVxzKi51c2VycGF5aWQ9W159XSt9XHMqalF1ZXJ5XChbXn1dK31ccypcKVxzKjtccypmdW5jdGlvblxzKlx3K1woXClccyp7XHMqdmFyXHMqXHcrXHMqPVxzKmF0b2JcKFteXCldK1wpXHMqO1xzKnZhclxzKlx3K1xzKj1ccyp7fVxzKjtccypqUXVlcnlcKC5pbnB1dC5cKVwuZWFjaFwoZnVuY3Rpb25cKFwpXHMqe1teXDJdK3tccyp1cmw6dXJsY2hlY2tccyosXHMqdHlwZTouUE9TVC5ccyosXHMqZGF0YTouZGF0YT0uXCtlbmNvZGVVUklDb21wb25lbnRcKEpTT05cLnN0cmluZ2lmeVwoZGF0YVwpXHMqXClccypcKy5ccypcJlxzKnRhcmdldFxzKj1ccyouXHMqXCtsb2NhdGlvblwuaG9zdFwrLiZ2YWxpZD0uXCtlbmNvZGVVUklDb21wb25lbnRcKGRvY3VtZW50XC5jb29raWVcKVtePF0rPFwvc2NyaXB0Pn4iO31zOjQ5OiJqYXZhc2NyaXB0Ij5sb2NhdGlvbi5yZXBsYWNlKCJodHRwOi8vZ2V0aGVyZS5pbmZvIjthOjI6e2k6MDtzOjI0OiJpbmplY3RlZC5qc19yZWRpcmVjdC4wMDIiO2k6MTtpOjExO31zOjMyOiJsb2NhdGlvbj0iaHR0cHM6Ly9iaXRidWNrZXQub3JnLyI7YToxOntpOjA7czoyMzoiaW5qZWN0ZWQuanNfdGltZW91dC4wMDEiO31zOjUzOiJsaW5rc1tpXTtlLnNldEF0dHJpYnV0ZSgiaHJlZiIsYjY0RGVjb2RlVW5pY29kZSgiYUhSMCI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQuanNfcmVkaXJlY3QuMDI2IjtpOjE7czoxNTk6In5mdW5jdGlvbiBiNjREZWNvZGVVbmljb2RlXChbXHddK1wpW1xzXSpce1tcc10qcmV0dXJuW1xzXSpkZWNvZGVVUklDb21wb25lbnRcKGF0b2JbXjxdKzxbXHNdKmxpbmtzXC5sZW5ndGhbXn1dK1x9W1xzXSp2YXJbXHNdKnVhW1xzXSo9W1xzXSpkZXRlY3RbXlx9XStbXHNcfV0rfiI7fXM6MzA6IlJSWydceDY2XHg2MVx4NmJceDY1XHg2Mlx4NzQnXSI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4xMDkiO2k6MTtpOjExO31zOjExOiIpXShhdG9iLF8weCI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4xNTMiO2k6MTtzOjEwNDoifjxzY3JpcHRbXj5dKj52YXIgXzB4XHcrPVxbXFMrXF07ZnVuY3Rpb24gW14+XStsb2NhdGlvbltePl0rXClcXVwoYXRvYixfMHhbXj5dK0pTT05cW18weFtePl0rPFwvc2NyaXB0Pn4iO31zOjQwOiI8L2E+PHA+PHNjcmlwdD5sb2NhdGlvbi5ocmVmPSIjdG9ycmVudHAiIjthOjI6e2k6MDtzOjI5OiJpbmplY3RlZC5zcGFtLXNlb190b3JyZW50LjAwMSI7aToxO3M6MTM0OiJ+PGEgaWQ9LnRvcnJlbnRwLiBocmVmPS4jLj4gPC5hPjxwPjxzY3JpcHQ+bG9jYXRpb24uaHJlZj0uI3RvcnJlbnRwLjwuc2NyaXB0PjxwPjxwPlteXF5dKz8+dVRvcnJlbnQ8LmE+IG9yIDxhIHJlbFtePl0rPkJpdFRvcnJlbnQ8LmE+fiI7fX1zOjg6InVuZXNjYXBlIjthOjk6e2k6MDtpOjEwO3M6Njc6IjxzY3JpcHQ+ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmlubmVySFRNTCA9IHVuZXNjYXBlKCcnKTs8L3NjcmlwdD4iO2E6Mjp7aTowO3M6MzE6ImluamVjdGVkLmpzX2NyZWF0ZV9kb2N1bWVudC4wMjQiO2k6MTtpOjEyO31zOjYwOiJpZiUyOCUyOG4lNjUlNzclMjBSJTY1Z0V4cCUyOCUyN29uJTY1cGFnJTY1JTdDY2glNjVja28lNzUlNzQiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDM0IjtpOjE7czoxMjg6In48c2NyaXB0PnRoaXNcWy5ldmFsLlxdXCh0aGlzXFsudW5lc2NhcGUuXF1cKC5pZiUyOCUyOG4lNjUlNzclMjBSJTY1Z0V4cCUyOCUyN29uJTY1cGFnJTY1JTdDY2glNjVja28lNzUlNzRbXiciXSsuXClcKTs8LnNjcmlwdD5+Ijt9czoyMjA6IjxzY3JpcHQ+ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmlubmVySFRNTCA9IHVuZXNjYXBlKCclNDglNjElNjMlNGIlNjUlNDQlMjAlNDIlNzklMjAlNDQlNzIlMmUlNTMlNDglNDElMzYlNDglMjAlN2MlMjAlNDYlNzUlNjMlNmIlMjAlNDElNmMlNmMlMjAlNTMlNjklNzQlNjUlMjAlM2QlMjklMjAlNWIlMjAlNDclMzIlM2ElMjAlNGIlMzElNTYlMzMlNmUlMjAlNWQnKTs8L3NjcmlwdD4iO2E6Mjp7aTowO3M6MzE6ImluamVjdGVkLmpzX2NyZWF0ZV9kb2N1bWVudC4wMTkiO2k6MTtpOjEyO31zOjIwMjoiPHNjcmlwdD5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuaW5uZXJIVE1MID0gdW5lc2NhcGUoJyU0OCU2MSU2MyU2YiU2NSU2NCUyMCU0MiU3OSUyMCU0MiU0MSU0YyU0MSUyMCU1MyU0ZSU0OSU1MCU0NSU1MiUyMCU0YiU3NSU3MiU2NCU2OSU3MyU2OCUyMCU0OCU2MSU2MyU2YiU2NSU3MiUyMCU1NyU2MSU3MyUyMCU0OCU2NSU3MiU2NScpOzwvc2NyaXB0PiI7YToyOntpOjA7czozMToiaW5qZWN0ZWQuanNfY3JlYXRlX2RvY3VtZW50LjAyMCI7aToxO2k6MTI7fXM6MzA6IiU0OCU0MSU0MyU2YiU2NSU0NCUyMCU0MiU3OSUyMCI7YToyOntpOjA7czozMToiaW5qZWN0ZWQuanNfY3JlYXRlX2RvY3VtZW50LjAyMiI7aToxO3M6MTE5OiJ+PHNjcmlwdD5kb2N1bWVudFwuZG9jdW1lbnRFbGVtZW50XC5pbm5lckhUTUxccz1cc3VuZXNjYXBlXCgnJTQ4JTQxJTQzJTZiJTY1JTQ0JTIwJTQyJTc5JTIwJTYxJTQ0JTcyW14nXSsnXCk7PC5zY3JpcHQ+fiI7fXM6NjY6IiUwZCUwYSUwZCUwYSUwZCUwYSUzYyUyMSU0NCU0ZiU0MyU1NCU1OSU1MCU0NSUyMCU2OCU3NCU2ZCU2YyUzZSUwZCI7YToyOntpOjA7czozMToiaW5qZWN0ZWQuanNfY3JlYXRlX2RvY3VtZW50LjAyMSI7aToxO3M6MTQwOiJ+ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmlubmVySFRNTFxzKj1ccyp1bmVzY2FwZVwoWyciXSUwZCUwYSUwZCUwYSUwZCUwYSUzYyUyMSU0NCU0ZiU0MyU1NCU1OSU1MCU0NSUyMCU2OCU3NCU2ZCU2YyUzZSUwZCUwYVteJyJdK1snIl0rXCk7fiI7fXM6NTc6IiUzYyU2MyU2NSU2ZSU3NCU2NSU3MiUzZSUzYyU2OCUzMiUzZSU0OCU2MSU0MyU2YiU0NSU2NCUyMCI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQuanNfZGVmYWNlbWVudC4wMDIiO2k6MTtzOjEzMDoifmRvY3VtZW50XC5kb2N1bWVudEVsZW1lbnRcLmlubmVySFRNTFxzKj1ccyp1bmVzY2FwZVwoWyciXSUzYyU2MyU2NSU2ZSU3NCU2NSU3MiUzZSUzYyU2OCUzMiUzZSU0OCU2MSU0MyU2YiU0NSU2NCUyMFteJyJdK1snIl0rXCk7fiI7fXM6MzM6IiRqc19wb3B1bmRlcl9VUkw9Imh0dHBzOi8vYml0Lmx5LyI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuanNfdW53YW50ZWRfYWRzLjAxOSI7aToxO3M6MTU4OiJ+PHNjcmlwdFtePl0qPlxzKlwkanNfcG9wdW5kZXJHbG9iYWxDbGljaz0wO1xzKmRvY3VtZW50Lm9ubW91c2V1cFtePD5dK1wkanNfcG9wdW5kZXJfVVJMPS5odHRwczouLmJpdFwuW148Pl0rPjBcKVtePD5dK1wkRW5kLi47W1xzXH1dK3JldHVyblteXHc8Pl0rPC5zY3JpcHQ+fiI7fX1zOjI4OiJqcXVlcnkubWluLmpzPjwvc2NyaXB0PjwvaDU+IjthOjc6e2k6MDtpOjEwO3M6ODI6IjxoNT48c2NyaXB0IHNyYz1odHRwOi8vcHVycGxlLnNtYXJ0ZW5lcmd5bW9kZWwuY29tL2pzL2pxdWVyeS5taW4uanM+PC9zY3JpcHQ+PC9oNT4iO2E6Mjp7aTowO3M6MjQ6ImluamVjdGVkLmZha2VfanF1ZXJ5LjAwMiI7aToxO2k6MTI7fXM6Nzg6IjxoNT48c2NyaXB0IHNyYz1odHRwOi8vaGcuc21hcnRlbmVyZ3ltb2RlbC5jb20vanMvanF1ZXJ5Lm1pbi5qcz48L3NjcmlwdD48L2g1PiI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQuZmFrZV9qcXVlcnkuMDAzIjtpOjE7aToxMjt9czo3NDoiPGg1PjxzY3JpcHQgc3JjPWh0dHA6Ly9hcXVhLmthcmVuZWdyZW4uY29tL2pzL2pxdWVyeS5taW4uanM+PC9zY3JpcHQ+PC9oNT4iO2E6Mjp7aTowO3M6MjQ6ImluamVjdGVkLmZha2VfanF1ZXJ5LjAwNCI7aToxO2k6MTI7fXM6NzM6IjxoNT48c2NyaXB0IHNyYz1odHRwOi8vZXFlLnRvb2xiYXJpbmMuY29tL2pzL2pxdWVyeS5taW4uanM+PC9zY3JpcHQ+PC9oNT4iO2E6Mjp7aTowO3M6MjQ6ImluamVjdGVkLmZha2VfanF1ZXJ5LjAwNSI7aToxO2k6MTI7fXM6Nzg6IjxoNT48c2NyaXB0IHNyYz1odHRwOi8vb28uc21hcnRlbmVyZ3ltb2RlbC5jb20vanMvanF1ZXJ5Lm1pbi5qcz48L3NjcmlwdD48L2g1PiI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQuZmFrZV9qcXVlcnkuMDA2IjtpOjE7aToxMjt9czo3NDoiPGg1PjxzY3JpcHQgc3JjPWh0dHA6Ly9seDViLnRvb2xiYXJpbmMuY29tL2pzL2pxdWVyeS5taW4uanM+PC9zY3JpcHQ+PC9oNT4iO2E6Mjp7aTowO3M6MjQ6ImluamVjdGVkLmZha2VfanF1ZXJ5LjAwNyI7aToxO2k6MTI7fX1zOjE5OiJuZXcgQWN0aXZlWE9iamVjdCgiIjthOjI6e2k6MDtpOjEwO3M6MTE6Iikuam9pbigiIik7IjthOjI6e2k6MDtpOjEwO3M6NToiW2ldO30iO2E6Mjp7aTowO2k6MTA7czo1OiI9MDt9OyI7YToyOntpOjA7aToxMDtzOjE2Mzoifih2YXIgW1x3XStbXHNdKj1bXHNdKidbXiddKyc7W1xzXSopezMsfXZhciBbXHddK1tcc10qPVtcc10qKFtcd10rW1xzXSpcK1tcc10qKXszLH1bXHddKztbXHNdKnZhciBbXHddK1tcc10qPVtcc10qIiI7W15cbl0rdGhpc1xbW1x3XStcXTtbXHNdKltcd10rXChbXHddK1wpO1tcc10qfiI7YToyOntpOjA7czoyMzoiaW5qZWN0ZWQuanNfbWFsd2FyZS4wMTciO2k6MTtzOjE2Mzoifih2YXIgW1x3XStbXHNdKj1bXHNdKidbXiddKyc7W1xzXSopezMsfXZhciBbXHddK1tcc10qPVtcc10qKFtcd10rW1xzXSpcK1tcc10qKXszLH1bXHddKztbXHNdKnZhciBbXHddK1tcc10qPVtcc10qIiI7W15cbl0rdGhpc1xbW1x3XStcXTtbXHNdKltcd10rXChbXHddK1wpO1tcc10qfiI7fX19fX1zOjU6Iix1cmw6IjthOjI6e2k6MDtpOjEwO3M6MTE6In07PC9zY3JpcHQ+IjthOjI6e2k6MDtpOjEwO3M6ODoie2V4cGlyZToiO2E6Mjp7aTowO2k6MTA7czoyMDoiPHNjcmlwdD52YXIgcG9wdW5kZXIiO2E6Mjp7aTowO3M6MjQ6ImluamVjdGVkLmpzX3JlZGlyZWN0LjAzMyI7aToxO3M6NzU6In48c2NyaXB0PnZhciBwb3B1bmRlcltcc10qPVtcc10qXHtleHBpcmU6W1xzXSpbXGRdKyx1cmw6W15cfV0rXH07PC5zY3JpcHQ+fiI7fX19fXM6MzA6InNyYz0iaHR0cDovL3lvdXJqYXZhc2NyaXB0LmNvbSI7YToyOntpOjA7aToxMDtzOjc6Ii9pLmpzIj4iO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLnlvdXJqYXZhc2NyaXB0LjAwMSI7aToxO2k6MTE7fX1zOjE4OiJjZGpzLm9ubGluZS9saWIuanMiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDc2IjtpOjE7czo2MToifjxzY3JpcHRccypzcmM9LltodHBzXXs0LH06Li5jZGpzXC5vbmxpbmUubGliXC5qcy4+PC5zY3JpcHQ+fiI7fXM6MTc6ImFsbHlvdXdhbnQub25saW5lIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjA4OCI7aToxO3M6NDc6In48c2NyaXB0W14+XSthbGx5b3V3YW50XC5vbmxpbmVbXj5dKz48LnNjcmlwdD5+Ijt9czoxNjoid2VibWluaW5nLmNvL2xpYiI7YToyOntpOjA7czoyMzoibWFsd2FyZS5jcnlwdG9taW5lci4wMDkiO2k6MTtzOjUzOiJ+PHNjcmlwdCBhc3luY1tePl0rd2VibWluaW5nXC5jb1wvbGliW14+XSs+PC5zY3JpcHQ+fiI7fXM6NDE6Im5ld3NoYXJlY291bnRzLnMzLXVzLXdlc3QtMi5hbWF6b25hd3MuY29tIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjExOSI7aToxO3M6MTQxOiJ+PHNjcmlwdCB0eXBlPS50ZXh0LmphdmFzY3JpcHQuIHNyYz0uLi5uZXdzaGFyZWNvdW50c1wuczMtdXMtd2VzdFtePl0rPjwuc2NyaXB0PjxzY3JpcHQgdHlwZT0udGV4dFtePl0rPndpbmRvd1wubmV3U2hhcmVDb3VudHNbXj5dKzwuc2NyaXB0Pn4iO31zOjIyOiJzb21ldGltZXNmcmVlLmJpei9jLmpzIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjA3NCI7aToxO3M6Njg6In48c2NyaXB0XHMqdHlwZT1bXjpdKzouLlteXC5dK1wuc29tZXRpbWVzZnJlZVwuYml6LmNcLmpzJz48LnNjcmlwdD5+Ijt9czo5OiJjMDU5NC5jb20iO2E6Mjp7aTowO3M6MzE6ImluamVjdGVkLmpzX2NyZWF0ZV9mdW5jdGlvbi4wMDQiO2k6MTtzOjY1OiJ+Jmx0O3NjcmlwdFxzKnNyYz1odHRwOi4uKFx3Ky4pYzA1OTQuY29tLi5qcz0uJmd0OyZsdDtccyouc2NyaXB0fiI7fXM6Mzk6ImFIUjBjRG92TDJkdmIyZHNaUzF6WldGeVkyaHpaWEoyYVdObGN5MSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xMTciO2k6MTtzOjEyNToifjxzY3JpcHRbXj5dKj5bXHNdKnZhcltcc10qXzB4W1x3XStbXHNdKj1bXHNdKlxbW15cXV0rYUhSMGNEb3ZMMmR2YjJkc1pTMXpaV0Z5WTJoelpYSjJhV05sY3kxW15cXl0rXF5cXVtePl0rPj1bXj5dKzwuc2NyaXB0Pn4iO31zOjMzOiJ2YXIgbWluZXIgPSBuZXcgQ2xpZW50LkFub255bW91cygiO2E6Mjp7aTowO3M6MjM6Im1hbHdhcmUuY3J5cHRvbWluZXIuMDA2IjtpOjE7czoxODg6In48c2NyaXB0XHMqc3JjPVwiaHR0cHM6Li5bXlwvXStcL3NUYU1cLmpzXCI+PC5zY3JpcHQ+XHMqPHNjcmlwdD5ccyp2YXJccyptaW5lclxzKj1ccypuZXdccypDbGllbnRcLkFub255bW91c1woLi5bXlwsXStcLFxzKlx7XHMqdGhyb3R0bGU6XHMqXGRcLlxkK1xzKlx9XCk7XHMqbWluZXJcLnN0YXJ0XChcKTtccyo8LnNjcmlwdD5+Ijt9czozODoiJD1+W107JD17X19fOisrJCwkJCQkOighW10rIiIpWyRdLF9fJDoiO2E6Mjp7aTowO3M6MjM6Im1hbHdhcmUuY3J5cHRvbWluZXIuMDA0IjtpOjE7czo4ODoifjxzY3JpcHQ+XCQ9XH5cW1xdO1wkPVx7X19fXDpbXntdK1x7XH1cKy4uXClcW1wkXF0sXCRcJFxfXCRcOlwoXCRcW1wkXF1cK1tePF0rPC5zY3JpcHQ+fiI7fXM6MTY6Ii9kYXRhLmpzLnBocD9pPXsiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLmpzX3Vud2FudGVkX2Fkcy4wMTEiO2k6MTtzOjE2NjoifjxzY3JpcHRccyp0eXBlPS50ZXh0LmphdmFzY3JpcHQuXHMqc3JjPS5baHRwc117NCx9Oi4uW15cL10rXC9kYXRhXC5qc1wucGhwXD9cdz1ce1x3Ky1cdystXHcrLVx3K1wtXHcrXH0mYW1wO1x3PVxkezR9LVxkezJ9XC1cZHsyfSZhbXA7XHc9W147XSs7Y2I9XGRcLlxkKy4+PC5zY3JpcHQ+fiI7fXM6Mzk6IllRSEhBQVVEWXdCRmdsRFhnMFZTQjFWVDFERVRBektab2tDMEluRiI7YToyOntpOjA7czoxNjoidW53YW50ZWRfYWRzLjAxMyI7aToxO3M6OTY6In48c2NyaXB0XHMqc3JjW15cLl0uaHR0cHM6Li5bXlwvXStcL2pzLllRSEhBQVVEWXdCRmdsRFhnMFZTQjFWVDFERVRBektab2tDMEluRlteIiddKy4+PC5zY3JpcHQ+fiI7fXM6MzQ6IiQoImhlYWQiKS5hcHBlbmQoJCgiPHNjcmlwdCAvPiIsIHsiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDQ0IjtpOjE7czoxMDA6In5cJFwoWyInXWhlYWRbIiddXClcLmFwcGVuZFwoXCRcKFsiJ108c2NyaXB0XHMqLj5bIiddLFxzKlx7XHMqc3JjOlxzKi5cL1wvW15cL10rXC9bXiciXSsuXHMqXH1cKVwpO34iO31zOjQ5OiIiJnU9IiArIGVuY29kZXVyaShuYXZpZ2F0b3IudXNlcmFnZW50KSArICInPjwvc2MiIjthOjI6e2k6MDtzOjI0OiJpbmplY3RlZC5qc19yZWRpcmVjdC4wMTIiO2k6MTtzOjI1MToifjxub2luZGV4PjxzY3JpcHRbXi1dKy1kZWNvcmF0aW9uOm5vbmVbXj5dKz5ccypkb2N1bWVudFwud3JpdGVcKC48c2NyaXB0W146XSs6Li5bXlwvXStcLy5cL2pxdWVyeVwuanNcLnBocFw/cj0uXHMqXCtccyplbmNvZGV1cmlcKGRvY3VtZW50XC5yZWZlcnJlclwpXHMqXCtccyouJlx3PS5ccypcK1xzKmVuY29kZXVyaVwobmF2aWdhdG9yLnVzZXJhZ2VudFwpXHMqXCtccyouLj48LnNjW15cKV0rXCk7XHMqPC5zY3JpcHQ+PC5ub2luZGV4Pn4iO31zOjE1OiJlYXN5YWNjZXNzLm1vYmkiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDcwIjtpOjE7czo4ODoifjxzY3JpcHRccyphc3luY1xzKj1ccyoudHJ1ZS5ccypzcmNccyo9Lmh0dHAocyk/XDouLlsoZWFzeWFjZXMubW9iaSldK1wvW14+XSs+PC5zY3JpcHQ+fiI7fXM6Mzk6InZhciBhZGxpbmtmbHlfdXJsID0gJ2h0dHBzOi8vY3V0d2luLmNvbSI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQuanNfcmVkaXJlY3QuMDE0IjtpOjE7czoxMDY6In48c2NyaXB0W14+XSs+W1xzXSoodmFyIGFkbGlua2ZseV9bXHddK1tcc10qPVteO10rO1tcc10qKXszLH08LnNjcmlwdD5bXHNdKig8c2NyaXB0IHNyYz1bXj5dKz48LnNjcmlwdD4pP34iO31zOjIzOiJhc3J2LWEuYWthbWFpaGQubmV0LnNkLyI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wNTgiO2k6MTtzOjcxOiJ+PHNjcmlwdCBpZD0iXHcrIiBzcmM9Ii4uYXNydi1hLmFrYW1haWhkLm5ldC5zZC9cZCsvXGQrXC5qcyI+PC9zY3JpcHQ+fiI7fXM6MzI6InZhciBjb29raWVjb25zZW50X2lkID0gJzlkZjRjZmE2IjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5qc191bndhbnRlZF9hZHMuMDA5IjtpOjE7czoyMDc6In48c2NyaXB0XHMqdHlwZT0udGV4dC5qYXZhc2NyaXB0Lj5ccyp3aW5kb3cuY29va2llY29uc2VudF9vcHRpb25zXHMqPVxzKlx7Lm1lc3NhZ2UuOi5UaGlzXHMqd2Vic2l0ZVxzKnVzZXNccypjb29raWVzW14sXSssLmRpc21pc3MuOi5Hb3RccyppdFwhW147XSs7XHMqdmFyXHMqY29va2llY29uc2VudF9pZFxzKj1ccyonOWRmNGNmYTZbXiddKyc7PC5zY3JpcHQ+fiI7fXM6MTM6ImFuYWxpdGljb3NjZG4iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDY1IjtpOjE7czo2MzoifjxzY3JpcHRccypzcmNccyo9XHMqLmh0dHAocyk/Oi4uYW5hbGl0aWNvc2NkblwuW148XSs8LnNjcmlwdD5+Ijt9czozODoiZXhvY2xpY2suY29tL3NwbGFzaC5waHA/aWR6b25lPTIzMzI5MTciO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLmpzX3Vud2FudGVkX2Fkcy4wMDUiO2k6MTtzOjIxMToifjxzY3JpcHRccyp0eXBlXHMqPVxzKi50ZXh0LmphdmFzY3JpcHQuc3JjXHMqPVxzKi5odHRwOi4ubmVlZGFsb2dvXC5uZXQudHJhY2tpbmdcLmpzLj48LnNjcmlwdD5ccyo8c2NyaXB0XHMqdHlwZVxzKj1ccyoudGV4dC5qYXZhc2NyaXB0LlxzKnNyY1xzKj1ccyouaHR0cDouLlsoPzpcdytcc1wuKV0rLnNwbGFzaFwucGhwXD9pZHpvbmU9MjMzMjkxNy4+PC5zY3JpcHQ+fiI7fXM6MTY6Im5ldGFuYWx5dGljcy54eXoiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDgwIjtpOjE7czo1NToifjwoaW1nfHNjcmlwdClbXj5dK25ldGFuYWx5dGljc1wueHl6W14+XSs+KDwuc2NyaXB0Pik/fiI7fXM6MTg6IndvcmxkbmF0dXJlbmV0Lnh5eiI7YToyOntpOjA7czoyOToiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wODAuMDIiO2k6MTtzOjU3OiJ+PChpbWd8c2NyaXB0KVtePl0rd29ybGRuYXR1cmVuZXRcLnh5eltePl0rPig8LnNjcmlwdD4pP34iO31zOjIyOiJzdGF0dmFsaWRhdGlvbi53ZWJzaXRlIjthOjI6e2k6MDtzOjI5OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjA4MC4wMyI7aToxO3M6NjE6In48KGltZ3xzY3JpcHQpW14+XStzdGF0dmFsaWRhdGlvblwud2Vic2l0ZVtePl0rPig8LnNjcmlwdD4pP34iO31zOjI0OiI6Ly9kYXRhcHJvdmlkZXIud2Vic2l0ZS8iO2E6Mjp7aTowO3M6Mjk6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDgwLjA1IjtpOjE7czo2MjoifjwoaW1nfHNjcmlwdClbXj5dKzouLmRhdGFwcm92aWRlclwud2Vic2l0ZVtePl0rPig8LnNjcmlwdD4pP34iO31zOjE3MjoiPHNjcmlwdD5hbGVydCgnaGFja2VkIGJ5IEhtZWk3Jyk8L3NjcmlwdD48aDE+aGFja2VkIGJ5IEhtZWk3PGJyIC8+PC9oMT48ZGl2IHN0eWxlPWJhY2tncm91bmQtY29sb3I6YmxhY2s7PjxiciAvPjxoMT48Zm9udCBjb2xvcj1jeWFuPmhhY2tlZCBieSBIbWVpNzwvZm9udD48L2gxPjxiciAvPjwvZGl2PiI7YToyOntpOjA7czoyMToiZGVmYWNlZC5oYWNrZWRfYnkuMDEyIjtpOjE7aToxMjt9czo2MjoiPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij52YXIgXzAxMT0iO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDAzIjtpOjE7czo4OToifjxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHR5cGU9InRleHRcL2phdmFzY3JpcHQiPnZhciBfMDExLio/XzAxMVwpXClcKTs8XC9zY3JpcHQ+fmkiO31zOjIyOiI5MS4yMzkuMTUuNjEvZ29vZ2xlLmpzIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjA1OSI7aToxO3M6NjU6In48c2NyaXB0IHR5cGU9WyJ8J10uKjkxXC4yMzlcLjE1XC42MVwvZ29vZ2xlXC5qc1tePF0qPFwvc2NyaXB0Pn5pIjt9czo3OiJkZ3Nnc2RnIjthOjI6e2k6MDtzOjIwOiJiYWNrZG9vci5qc19ldmFsLjAwMyI7aToxO3M6NDE6In48c2NyaXB0Pi4qP2Rnc2dzZGcuKj9ldmFsLio/PFwvc2NyaXB0Pn5pIjt9czozMjoiOiIiLCdjZW50ZXJPblNjcm9sbCc6IGZhbHNlfSk7fSkiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLmpzX2NsaWNrX2hpamFjay4wMDEiO2k6MTtzOjYwOiJ+IiIsLmNlbnRlck9uU2Nyb2xsLjogZmFsc2UuLjsuLlxzKjwuc2NyaXB0Pi4rPzxzY3JpcHQ+XChce34iO31zOjM3OiIvL3NlcnZlcmFkcy5uZXQvNTk5YjQ3MjYwMzk0ZGViMmQ4LmpzIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5qc191bndhbnRlZF9hZHMuMDAxIjtpOjE7czoxNzg6In48c2NyaXB0IHNyYz0uXC9cL3NlcnZlcmFkc1wubmV0XC81OTliNDcyNjAzOTRkZWIyZDguanMuPjwuc2NyaXB0PjxzY3JpcHQgc3JjPS4uLnB1bHNlYWRuZXR3b3JrLmNvW148XSs8LnNjcmlwdD4oPzpccz88aWZyYW1lIFtePl0rPjwuaWZyYW1lPlxzPyk/KD86PHNjcmlwdCBzcmNbXj5dKz48LnNjcmlwdD4pKn4iO31zOjI5OiJnY3NlLnNyYyA9ICJodHRwOi8vbmlubmkub3JnLyI7YToyOntpOjA7czozMzoiaW5qZWN0ZWQuanNfZG9jdW1lbnRfbG9jYXRpb24uMDA2IjtpOjE7czo4MzoifjxzY3JpcHRbXn1dK3ZhciBnY3NlID0gZG9jdW1lbnRbXn1dK2djc2Uuc3JjID0gImh0dHBbXlx9XStuaW5uaS5vcmdbXj5dKzwuc2NyaXB0Pn4iO31zOjE2OiJza2luL2l0ZW1zLmpzIj48IjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjA2MiI7aToxO3M6NjM6In48c2NyaXB0XHMqc3JjLi5odHRwcy4uLnVwc2Jyb2tlci5jb20uc2tpbi5pdGVtcy5qcy4+PC5zY3JpcHQufiI7fXM6MzQ6Imh0dHBzOi8vb3JkZXItc2VjdXJpdHkuY29tL3NjcmlwdHMiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDYzIjtpOjE7czo5NDoifi5zY3JpcHRccyp0eXBlLi50ZXh0LmphdmFzY3JpcHQuXHMqc3JjLi5odHRwcy4uLm9yZGVyLXNlY3VyaXR5LmNvbS5zY3JpcHRzLlx3Ky5qcy4uLi5zY3JpcHQufiI7fXM6MzY6Ii5zcGxpdChUKS5yZXZlcnNlKCkuam9pbihUKSkreStEK3ksWCI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQuanNfcmVkaXJlY3QuMDA4IjtpOjE7czoyMDc6In48c2NyaXB0XHMqZGF0YS1jZmFzeW5jPS5cdysuXHMqdHlwZT0udGV4dC5qYXZhc2NyaXB0Lj52YXJccypcdys9d2luZG93O2ZvclwodmFyXHNcd1xzKmluXHNcdytcKVx7aWZcKFx3Lmxlbmd0aD09PVwoXGQrPlwoXGQrLDB4XHcrXClcP1teIl0rIlx3IjpbXl9dK19cdysuLFxbLj09XHcrLlxdW15cP10rXD96b25laWRbXlwoXStcKFwpOy4+XHMqPC5zY3JpcHQ+fiI7fXM6MTM6Im1pbmVyLnN0YXJ0KCkiO2E6Mjp7aTowO3M6MjM6Im1hbHdhcmUuY3J5cHRvbWluZXIuMDAxIjtpOjE7czoxNTU6In48c2NyaXB0XHMqc3JjXHMqPVxzKlxcPy5odHRwcz86XC9cL1tePl0rPjxcL3NjcmlwdD5ccyo8c2NyaXB0PlxzKnZhclxzKlx3K1xzKj1ccypuZXdccypcdytcLkFub255bW91c1woW15cKV0rXClccyo7XHMqbWluZXJcLnN0YXJ0XChcKTtccyooPzo8XC9zY3JpcHQ+KT9+Ijt9czoxODoieyBkaXNwTEF5IDogTk9uRSB9IjthOjI6e2k6MDtzOjIxOiJpbmplY3RlZC5zcGFtLXNlby4wMTIiO2k6MTtzOjE0MDoifjxzdHlsZT5ccypcLihcdyspXHMqe1xzKltEZElpU3NQcExsQWFZeV17N31ccyo6XHMqW05uT29ObkVlXXs0fVxzKn1ccyo8XC9zdHlsZT5ccyo8XHMqZGl2XHMqY2xhc3Nccyo9XHMqXDFccyo+XHMqPFxzKmFccypocmVmW15cMl0rPFwvZGl2Pn4iO31zOjI4OiIiPndpbmRvdy5uZXdTaGFyZUNvdW50c0F1dG89IjthOjI6e2k6MDtzOjI0OiJpbmplY3RlZC5qc19yZWRpcmVjdC4wMTkiO2k6MTtzOjE0MToifjxzY3JpcHRcc3R5cGU9LiJ0ZXh0XC9qYXZhc2NyaXB0LiJcc3NyYz0uIlwvXC9uZXdzaGFyZWNvdW50c1tePl0rPlxzKjxcL3NjcmlwdD5ccyo8c2NyaXBbXj5dKz5ccyp3aW5kb3dcLm5ld1NoYXJlQ291bnRzQXV0bz1bXjxdKzxcL3NjcmlwdD5+Ijt9czo3MjoiU3RyaW5nWydmJysncicrJ28nKydtJysnQycrJ2gnKydhJysncicrJ0MnKydvJysnZCcrJ2UnXShnKTtsZXQgYz1hWzB4MF0sIjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjEyOSI7aToxO3M6NjM6In5qamxza2V5W1xzXSpbXjtdKztbXHNdKmpqbGlua1teXG5dK2pqbGF1bmNoXChcKTtbXjxdKlwpO1tcc10qfiI7fXM6Mjg6ImpRdWVyeShhdG9iKCdQSE5qY21sd2RDQnBaRDAiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMTQ0IjtpOjE7czoxNDI6In5pZltcc10qXChbXHNdKmpRdWVyeVwoW149XStcLmxlbmd0aFtcc10qPT09W1xzXSpbXGRdK1tcc10qXClbXHNdKlx7W1xzXSpqUXVlcnlcKGF0b2JcKC5QSE5qY21sd2RDQnBaRDBbXlwpXStcKVwpXC5hcHBlbmRUb1woLmhlYWQuXCk7W1xzXSpcfX4iO31zOjE2OiIvYXB1LnBocD96b25laWQ9IjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5qc191bndhbnRlZF9hZHMuMDAyIjtpOjE7aToxMTt9czoxNzoidHJhZmZpY3RyYWRlLmxpZmUiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDcyIjtpOjE7aToxMTt9czoxODoidHJ5c29tZXRoaW5nbmV3LmV1IjthOjI6e2k6MDtzOjI5OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjA3Mi4wMiI7aToxO2k6MTE7fXM6MTc6InNvbWV0aW1lc2ZyZWUuYml6IjthOjI6e2k6MDtzOjI5OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjA3Mi4wMyI7aToxO2k6MTE7fXM6MTc6ImdpdmVtZWFsZXR0ZXIuYml6IjthOjI6e2k6MDtzOjI5OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjA3Mi4wNCI7aToxO2k6MTE7fXM6MTg6InNpbXBsZWZ1bnNpdGUuaW5mbyI7YToyOntpOjA7czoyOToiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wNzIuMDUiO2k6MTtpOjExO31zOjE1OiJkYW5jZXdpdGhtZS5iaXoiO2E6Mjp7aTowO3M6Mjk6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDcyLjA2IjtpOjE7aToxMTt9czoxODoidHJ5bXluZXdzcGlyaXQuY29tIjthOjI6e2k6MDtzOjI5OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjA3Mi4wNyI7aToxO2k6MTE7fXM6MTg6InIvdHU4WkkiPjwvc2NyaXB0PiI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wNjkiO2k6MTtpOjExO31zOjI0OiJnb28uZ2wvUUtaWnhDJz48L3NjcmlwdD4iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDc3IjtpOjE7aToxMTt9czozNDoidmFyIG1pbmVyID0gbmV3IENvaW5IaXZlLkFub255bW91cyI7YToyOntpOjA7czoyMzoibWFsd2FyZS5jcnlwdG9taW5lci4wMDgiO2k6MTtpOjExO31zOjI0OiIvbWFnZS9tYWdlLmpzIj48L3NjcmlwdD4iO2E6Mjp7aTowO3M6Mjk6ImluamVjdGVkLm1hZ2VudG9fc2hvcGxpZnQuMDAyIjtpOjE7aToxMTt9czozOToic3RhdGNvdW50ZXJmcmVlLmNvbS9wcml2YXRlL2NvdW50ZXIuanM/IjthOjI6e2k6MDtzOjE5OiJtYWx3YXJlLmNvdW50ZXIuMDAxIjtpOjE7aToxMTt9czoxNzoiL3h4LmpzIj48L3NjcmlwdD4iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLmpzX2RlZmFjZW1lbnQuMDAxIjtpOjE7aToxMTt9czoyNToiL3dlYi9qUXVlcnkuanMnPjwvc2NyaXB0PiI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQuZmFrZV9qcXVlcnkuMDA5IjtpOjE7aToxMTt9czozNDoiTVRBd01qc3pPM054ZFdGeVpTNXNZWEpuWlY5eVpXTjBZVyI7YToyOntpOjA7czoxNjoidW53YW50ZWRfYWRzLjAxNCI7aToxO2k6MTE7fXM6NDI6IjcyLCA5NywgOTksIDEwNywgMTAxLCAxMDAsIDMyLCA2NiwgMTIxLCAzMiI7YToyOntpOjA7czoyMToiZGVmYWNlZC5oYWNrZWRfYnkuMDE0IjtpOjE7aToxMTt9czo3Mjoie3ZhciBycyA9IHRoaXMucmVhZHlTdGF0ZTsgaWYgKHJzICYmIHJzICE9ICdjb21wbGV0ZScgJiYgcnMgIT0gJ2xvYWRlZCcpIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5qc191bndhbnRlZF9hZHMuMDEwIjtpOjE7aToxMTt9czozMDoiLmNjL21lZGlhL2Nvb2tpZS5qcyI+PC9zY3JpcHQ+IjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjAzNSI7aToxO2k6MTE7fXM6MTg6IjoiPC9zY3JpcHQ+PHNjcmlwdCI7YToyOntpOjA7czozMToiaW5qZWN0ZWQuanNfY3JlYXRlX2RvY3VtZW50LjAxMiI7aToxO2k6MTE7fXM6MTg6Ii9CdEZWUGQnPjwvc2NyaXB0PiI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQuanNfcmVkaXJlY3QuMDA5IjtpOjE7aToxMTt9czo1NjoiIGhlaWdodDogMjgwcHg7IHBvc2l0aW9uOiBhYnNvbHV0ZSIgaWQ9ImJhbm5lcmZsb2F0QURTIj4iO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLmpzX3Vud2FudGVkX2Fkcy4wMTUiO2k6MTtpOjExO31zOjEyOiJhdG9iKCJhSFIwY0giO2E6Mjp7aTowO3M6MjI6ImluamVjdGVkLmpzX2Jhc2U2NC4wMDIiO2k6MTtpOjExO31zOjIyOiIoYXRvYignYVdZb2JtVjNJRkpsWjBWIjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjE1OSI7aToxO3M6OTM6In52YXJbXHNdKltcd10rO1tcc10qbmV3W1xzXSpzZWxmXFsuW1x3XSsuXHxcfC5bXHddKy5cXVtcc10qXChhdG9iXChbXlwpXStcKVwpXC5jYWxsXCh0aGlzXCk7fiI7fX1zOjc6IjxpZnJhbWUiO2E6MTg6e2k6MDtpOjEwO3M6Mzc6InN0eWxlPSJ2aXNpYmlsaXR5OiBoaWRkZW47Ij48L2lmcmFtZT4iO2E6Mzp7aTowO2k6MTA7czoyODoiPGlmcmFtZSBzcmM9Imh0dHBzOi8vZ29vLmdsLyI7YToyOntpOjA7czoyMDoiaWZyYW1lLmluamVjdGlvbi4wMTQiO2k6MTtzOjg3OiJ+PGlmcmFtZVxzKnNyYz0iaHR0cHM6Li5nb28uZ2wuXHcrIlxzKnN0eWxlPSJ2aXNpYmlsaXR5OlxzKmhpZGRlbjsiPjwuaWZyYW1lPig8LmJvZHk+KX4iO31zOjE1OiJodHRwOi8vYW16bi50by8iO2E6Mjp7aTowO3M6MjA6ImlmcmFtZS5pbmplY3Rpb24uMDEzIjtpOjE7czo3ODoifjxpZnJhbWVccypzcmM9Imh0dHA6Li5hbXpuLnRvLlx3KyJccypzdHlsZT0idmlzaWJpbGl0eTpccypoaWRkZW47Ij48LmlmcmFtZT5+Ijt9fXM6MzQ6IjxpZnJhbWUgZnJhbWVib3JkZXI9IjAiIGhlaWdodD0iMCIiO2E6Mjp7aTowO2k6MTA7czoxNDoic2Nyb2xsaW5nPSJubyIiO2E6Mjp7aTowO3M6MjA6ImlmcmFtZS5pbmplY3Rpb24uMDE3IjtpOjE7aToxMTt9fXM6NjY6InN0eWxlPSJ3aWR0aDowO2hlaWdodDowO2JvcmRlcjowOyBib3JkZXI6bm9uZTsgdmlzaWJpbGl0eTogaGlkZGVuOyI7YToyOntpOjA7czoyMDoiaWZyYW1lLmluamVjdGlvbi4wMTgiO2k6MTtzOjE1OToifjxpZnJhbWVccypzcmM9LltodHBzXXs0LH06W14iJ10rLlxzKnN0eWxlPS53aWR0aDowO2hlaWdodDowO2JvcmRlcjowO1xzKmJvcmRlcjpub25lO1xzKnZpc2liaWxpdHk6XHMqaGlkZGVuO1xzKnBvc2l0aW9uOmFic29sdXRlW14tXSstXGR7NSx9cHg7Lj5ccyo8LmlmcmFtZT5+Ijt9czo5NjoiPGlmcmFtZSBzcmM9Imh0dHA6Ly9nb29nbGUtcGluZ2luZ3MuY29tL2luLmNnaT9kZWZhdWx0IiBoZWlnaHQ9MSB3aWR0aD0xIGZyYW1lYm9yZGVyPTA+PC9pZnJhbWU+IjthOjI6e2k6MDtzOjIwOiJpZnJhbWUuaW5qZWN0aW9uLjAwMSI7aToxO2k6MTI7fXM6MTA3OiI8aWZyYW1lIHNyYz0iaHR0cDovL3MxNjkwNzA4MDUub25saW5laG9tZS51cy8yMDA4LzAxL2dvLnBocD9zaWQ9NiIgaGVpZ2h0PTEgd2lkdGg9MSBmcmFtZWJvcmRlcj0wPjwvaWZyYW1lPiI7YToyOntpOjA7czoyMDoiaWZyYW1lLmluamVjdGlvbi4wMDIiO2k6MTtpOjEyO31zOjI4OiIgc3JjPSJodHRwOi8vMTA4LjE3OS4yNTIuNzAvIjthOjI6e2k6MDtzOjIwOiJpZnJhbWUuaW5qZWN0aW9uLjAwMyI7aToxO3M6NjE6In48aWZyYW1lW14+XSs/c3JjPSJodHRwOi4uMTA4XC4xNzlcLjI1MlwuNzBcL1tePl0rPjwuaWZyYW1lPn4iO31zOjkyOiI8aWZyYW1lIHNyYz1odHRwOi8vNjEuMTMyLjc1LjcxL2lmcmFtZS93cC1zdGF0cy5waHAgd2lkdGg9MSBoZWlnaHQ9MSBmcmFtZWJvcmRlcj0wPjwvaWZyYW1lPiI7YToyOntpOjA7czoyMDoiaWZyYW1lLmluamVjdGlvbi4wMDQiO2k6MTtpOjEyO31zOjExMDoiPGlmcmFtZSBzcmM9Imh0dHA6Ly9zaGFuZ2FjdXB1bmN0dXJlLm9zYS5wbC9zaG93dGhyZWFkLnBocD90PTU3ODUyNDY0IiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBmcmFtZWJvcmRlcj0iMCIgLz4iO2E6Mjp7aTowO3M6MjA6ImlmcmFtZS5pbmplY3Rpb24uMDA1IjtpOjE7aToxMjt9czo5MDoiPGRpdiBzdHlsZT0icG9zaXRpb246IGFic29sdXRlOyB6LWluZGV4OiAxMDAwOyB0b3A6IC0xMDAwcHg7IGxlZnQ6IC05OTk5cHg7Ij48aWZyYW1lIHNyYz0iIjthOjI6e2k6MDtzOjIwOiJpZnJhbWUuaW5qZWN0aW9uLjAwNiI7aToxO3M6MTE4OiJ+PGRpdiBzdHlsZT0icG9zaXRpb246IGFic29sdXRlOyB6LWluZGV4OiAxMDAwOyB0b3A6IC0xMDAwcHg7IGxlZnQ6IC05OTk5cHg7Ij48aWZyYW1lIHNyYz0iaHR0cFteIl0rIj48LmlmcmFtZT48LmRpdj5+Ijt9czozNjoiPGlmcmFtZSBzcmM9Imh0dHA6Ly9jbG91ZGZsYXJlcy5pbmZvIjthOjI6e2k6MDtzOjIwOiJpZnJhbWUuaW5qZWN0aW9uLjAwNyI7aToxO3M6ODc6In48aWZyYW1lIHNyYz0uXEgrY2xvdWRmbGFyZXNcLmluZm9bXj5dKyh3aWR0aHxoZWlnaHR8ZnJhbWVib3JkZXJ8XHMrKSs9IlxkKyI+PC5pZnJhbWU+fiI7fXM6MTI6InN0YXRpY3dlYi50ayI7YToyOntpOjA7czoyMDoiaWZyYW1lLmluamVjdGlvbi4wMDgiO2k6MTtzOjEyMDoifjxpZnJhbWVccypzcmMuLmh0dHA6Li4oXHcqXC4pc3RhdGljd2ViLnRrXC9cdysuXHMqW147XSs7XHMqbGVmdDpccyotMTAwMHB4O1xzKnRvcDpccyotMTAwMHB4O1xzKnotaW5kZXg6LTE7Lj48LmlmcmFtZT5+Ijt9czo1MDoiZm9ydHVub2ZmZGV2LmdlbWZpbmR3ZWJkZXNpZ24uY29tL2dlbWZpbmQvaW5mby5waHAiO2E6Mjp7aTowO3M6MjA6ImlmcmFtZS5pbmplY3Rpb24uMDA5IjtpOjE7czoxMDc6In48ZGl2IHN0eWxlW148XSsrPGlmcmFtZSBzcmM9LltePl0rZm9ydHVub2ZmZGV2LmdlbWZpbmR3ZWJkZXNpZ24uY29tL2dlbWZpbmQvaW5mby5waHBbXj5dKz48LmlmcmFtZT48LmRpdj5+Ijt9czozMDoid3d3LnZpc2lvLXJ4LmNvbS9kb2NzL2luZm8ucGhwIjthOjI6e2k6MDtzOjIwOiJpZnJhbWUuaW5qZWN0aW9uLjAxMCI7aToxO3M6ODc6In48ZGl2IHN0eWxlW148XSsrPGlmcmFtZSBzcmM9LltePl0rd3d3LnZpc2lvLXJ4LmNvbS9kb2NzL2luZm8ucGhwW14+XSs+PC5pZnJhbWU+PC5kaXY+fiI7fXM6MzQ6InNpdGVvbmxpbmUuY2xpY2svc3RhdGlzdGljc19vbmxpbmUiO2E6Mjp7aTowO3M6MjA6ImlmcmFtZS5pbmplY3Rpb24uMDExIjtpOjE7czo5NDoifjxkaXYgc3R5bGVbXjxdKys8aWZyYW1lIHNyYz0uW14+XStzaXRlb25saW5lLmNsaWNrL3N0YXRpc3RpY3Nfb25saW5lW14+XSs+PC5pZnJhbWU+XHMqPC5kaXY+fiI7fXM6NTg6IjxpZnJhbWUgZnJhbWVib3JkZXI9IjAiIHN0eWxlPSJwb3NpdGlvbjogYWJzb2x1dGU7IGxlZnQ6IC0iO2E6Mjp7aTowO3M6MjA6ImlmcmFtZS5pbmplY3Rpb24uMDE1IjtpOjE7czoxMjM6In48aWZyYW1lXHMqZnJhbWVib3JkZXI9LjAuXHMqc3R5bGU9LlteOl0rOlxzKmFic29sdXRlO1xzKmxlZnQ6XHMqLVxkezQsfXB4O1xzKnRvcDpccyotXGR7NCx9cHhbXlwuXSsuY2xpY2tbXiJdKyI+PC5pZnJhbWU+fiI7fXM6MTU6ImNvaW5wb3QuY28vbWluZSI7YToyOntpOjA7czoyMzoibWFsd2FyZS5jcnlwdG9taW5lci4wMDIiO2k6MTtzOjExMToifjxpZnJhbWVbXlwyPl0rc3JjXHMqPVxzKlsnIl1odHRwKD86cyk/OlwvXC8oPzpcdytcLik/Y29pbnBvdFwuY29cL21pbmVcL1x3K1wvXD9yZWY9XHcrLlxzKltePl0rPlxzKjxcL2lmcmFtZT5+Ijt9czoxODoiOiI8L3NjcmlwdD48aWZyYW1lIjthOjI6e2k6MDtzOjIwOiJpZnJhbWUuaW5qZWN0aW9uLjAxMiI7aToxO2k6MTE7fX1zOjU6ImV2YWwoIjthOjIxOntpOjA7aToxMDtzOjEyOiJmcm9tQ2hhckNvZGUiO2E6OTp7aTowO2k6MTA7czo5NDoiMTE5LCAxMDUsIDExMCwgMTAwLCAxMTEsIDExOSwgNDYsIDEwOCwgMTExLCA5OSwgOTcsIDExNiwgMTA1LCAxMTEsIDExMCwgNDYsIDEwNCwgMTE0LCAxMDEsIDEwMiI7YToyOntpOjA7aToxMDtzOjExNjoiMTAwLCAxMTEsIDk5LCAxMTcsIDEwOSwgMTAxLCAxMTAsIDExNiwgNDYsIDEwOCwgMTExLCA5OSwgOTcsIDExNiwgMTA1LCAxMTEsIDExMCwgNDYsIDExNCwgMTAxLCAxMTIsIDEwOCwgOTcsIDk5LCAxMDEiO2E6Mjp7aTowO2k6MTA7czoxMDM6IjEwMCwgMTExLCA5OSwgMTE3LCAxMDksIDEwMSwgMTEwLCAxMTYsIDQ2LCAxMDgsIDExMSwgOTksIDk3LCAxMTYsIDEwNSwgMTExLCAxMTAsIDQ2LCAxMDQsIDExNCwgMTAxLCAxMDIiO2E6Mjp7aTowO3M6MjQ6ImluamVjdGVkLmpzX3JlZGlyZWN0LjAyNyI7aToxO3M6MTUyOiJ+ZXZhbFwoU3RyaW5nXC5mcm9tQ2hhckNvZGVcKFtcZF0rLFteO10rMTAwLCAxMTEsIDk5LCAxMTcsIDEwOSwgMTAxLCAxMTAsIDExNiwgNDYsIDEwOCwgMTExLCA5OSwgOTcsIDExNiwgMTA1LCAxMTEsIDExMCwgNDYsIDEwNCwgMTE0LCAxMDEsIDEwMlteO10rXCk7fiI7fX19czoxMjE6IjQ2LDEwMywxMDEsMTE2LDY5LDEwOCwxMDEsMTA5LDEwMSwxMTAsMTE2LDY2LDEyMSw3MywxMDAsNDAsMzQsOTcsMTAwLDEwOSwxMDUsMTEwLDEwNiwxMTUsMTEyLDk3LDEwMywxMDEsMzQsNDEsMzgsMzgsNDAsNDAiO2E6Mjp7aTowO2k6MTA7czoxNjI6IjEwMSwxMTAsMTE2LDExNSw2NiwxMjEsODQsOTcsMTAzLDc4LDk3LDEwOSwxMDEsNDAsMTE1LDQxLDkxLDQ4LDkzLDQxLDQ2LDExMiw5NywxMTQsMTAxLDExMCwxMTYsNzgsMTExLDEwMCwxMDEsNDYsMTA1LDExMCwxMTUsMTAxLDExNCwxMTYsNjYsMTAxLDEwMiwxMTEsMTE0LDEwMSw0MCI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuanNfYXBwZW5kQ2hpbGQuMDA3IjtpOjE7czo1OToifmV2YWxcKFN0cmluZ1wuZnJvbUNoYXJDb2RlXCgoW1xkXSssW1xzXSopezIwLH1bXGRdK1wpXCk7P34iO319czo2MjoiZXZhbChTdHJpbmcuZnJvbUNoYXJDb2RlKDMyLDQwLDEwMiwxMTcsMTEwLDk5LDExNiwxMDUsMTExLDExMCwiO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLmpzX2FwcGVuZENoaWxkLjAwNCI7aToxO3M6NTE6In5ldmFsXChTdHJpbmdcLmZyb21DaGFyQ29kZVwoMzIsNDAsMTAyW15cKV0rW1wpO10rfiI7fXM6Mzg6ImV2YWwoU3RyaW5nLmZyb21DaGFyQ29kZSgxMTgsIDk3LCAxMTQsIjthOjI6e2k6MDtzOjI5OiJqcy5tYWx3YXJlLmluamVjdG9yX3N0YXRzLjAwNCI7aToxO3M6NTM6In5ldmFsXChTdHJpbmdcLmZyb21DaGFyQ29kZVwoMTE4LCA5NywgMTE0W15cKV0rXCkrOz9+Ijt9czoxNDE6Ijc3LCA2OCwgNjUsIDExMiwgNzUsIDg2LCAxMTUsIDExOSwgODgsIDgzLCA1MywgMTA0LCA5OSwgNzIsIDY2LCAxMDgsIDk4LCAxMDksIDgyLCA2OCwgOTcsIDcxLCAxMDgsIDExNSwgOTAsIDY3LCAxMDQsIDExMywgOTksIDEyMSwgMTA3LCA1NSkpKSI7YToyOntpOjA7czoyMDoiaW5qZWN0ZWQuanNfZXZhbC4wMDciO2k6MTtzOjczOiJ+ZXZhbFwoYXRvYlwoU3RyaW5nXC5mcm9tQ2hhckNvZGVcKDEwMCwgMTA5LFteXCldKzk5LCAxMjEsIDEwNywgNTVcKVwpXCl+Ijt9czo4OToiZXZhbChTdHJpbmcuZnJvbUNoYXJDb2RlKDMzLDEwMiwxMTcsMTEwLDk5LDExNiwxMDUsMTExLDExMCw0MCw0MSwxMjMsMTE4LDk3LDExNCwzMiwxMTYsNjEiO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLmpzX3JlZGlyZWN0LjAyOS4wMiI7aToxO3M6NTQ6In5ldmFsXChTdHJpbmcuZnJvbUNoYXJDb2RlXCgzMywxMDIsMTE3LDFbXlwpXStbXHNcKV0rfiI7fXM6ODI6IjEsNDEsMTI1LDQwLDEwMCwxMTEsOTksMTE3LDEwOSwxMDEsMTEwLDExNiw0NCwzNCwxMTUsOTksMTE0LDEwNSwxMTIsMTE2LDM0LDQxLDU5KSkiO2E6Mjp7aTowO3M6MjQ6ImluamVjdGVkLmpzX3JlZGlyZWN0LjA0NSI7aToxO3M6NTA6In5ldmFsXChTdHJpbmdcLmZyb21DaGFyQ29kZVwoW1xkXSssW1xkXStbXlwpXStcKSt+Ijt9czozNjoiZXZhbChTdHJpbmcuZnJvbUNoYXJDb2RlKDExOCw5NywxMTQsIjthOjI6e2k6MDtzOjI5OiJqcy5tYWx3YXJlLmluamVjdG9yX3N0YXRzLjAwNiI7aToxO3M6NTM6In5ldmFsXChTdHJpbmdcLmZyb21DaGFyQ29kZVwoMTE4LDk3LDExNFteO10rXCk7W1xzXSp+Ijt9fXM6MTM6ImJhc2U2NF9kZWNvZGUiO2E6Nzp7aTowO2k6MTA7czozODoiZXZhbChiYXNlNjRfZGVjb2RlKCdhV1lnS0hCeVpXZGZiV0YwWTIiO2E6Mjp7aTowO3M6MjQ6ImJhY2tkb29yLmV2YWxfYmFzZTY0LjAwMSI7aToxO3M6NzM6In5ldmFsXChiYXNlNjRfZGVjb2RlXCgnYVdZZ0tIQnlaV2RmYldGMFkyZ29KeThvUjI5dloyeGxZW149XSs3ZlE9PSdcKVwpO34iO31zOjI1OiIlJih7JHtldmFsKGJhc2U2NF9kZWNvZGUoIjthOjI6e2k6MDtzOjI0OiJiYWNrZG9vci5ldmFsX2Jhc2U2NC4wMDMiO2k6MTtzOjg0OiJ+XCVcJlwoXHtcJFx7ZXZhbFwoYmFzZTY0X2RlY29kZVwoXCRfKFNFUlZFUnxQT1NUfEdFVClcW1teXF1dK1xdXClcKVx9XH1cfFwuXCtcKSZcJX4iO31zOjMxOiJdKSl7QGV2YWwoYmFzZTY0X2RlY29kZSgkX1BPU1RbIjthOjI6e2k6MDtzOjI0OiJiYWNrZG9vci5ldmFsX2Jhc2U2NC4wMTQiO2k6MTtzOjExNDoifjxcP3BocFxzKlteQF0rQGV2YWxcKGJhc2U2NF9kZWNvZGVcKFwkX1BPU1RcW1x3K1xdXClcKTtleGl0O1x9aWZcKGlzc2V0XChcJF9HRVRcW1x3K1xdXClcKVx7cGhwaW5mb1woXCk7XH1ccypcPz5+Ijt9czo1MToiOiJldmFsXChiYXNlNjRfZGVjb2RlXCgnRFFvTkNpOHZEUW9rUWs5UFZGOU9RVTFGSUQwIjthOjI6e2k6MDtzOjI0OiJiYWNrZG9vci5ldmFsX2Jhc2U2NC4wMTYiO2k6MTtzOjg5OiJ+czpcZCs6WyciXWV2YWxcKGJhc2U2NF9kZWNvZGVcKFsnIl1EUW9OQ2k4dkRRb2tRazlQVkY5T1FVMUZJRDBbXlwpXStcKVwpXHMqO1xzKlsnIl1ccyo7fiI7fXM6MjM6ImV2YWwoJ2Z1bmN0aW9uIGZ1bmN0aW9uIjthOjI6e2k6MDtzOjI0OiJiYWNrZG9vci5ldmFsX2Jhc2U2NC4wMDgiO2k6MTtzOjE2MjoifmV2YWxcKC5mdW5jdGlvblxzKmZ1bmN0aW9uXHcrW149XSs9bWQ1W15cfV0rXH1lbHNlXHtbXjxdKzxzdHJsZW5cKFteXF5dK1xeb3JkW147XSs7XH1yZXR1cm5ccypcJFx3KztcfVteIl0rIlx3KyI7XHMqXEBldmFsXChmdW5jdGlvblx3K1woYmFzZTY0X2RlY29kZVteO10rOydcKTt+Ijt9czozMzoiJHRtcFsncG9zdF90aXRsZSddID0gJHBvc3RfdGl0bGU7IjthOjI6e2k6MDtzOjE4OiJiYWNrZG9vci5zaGVsbC4wMDYiO2k6MTtzOjMwNjoifmZ1bmN0aW9uIFtcd10rXChcJHNpZ24sW1xzXSpcJGRhdGFcKVtcc10qXHtbXHNdKlwkcHVia2V5W15cfV0rXH1bXHNdKmVsc2VbXHNdKntbXHNdKnJldHVybiBmYWxzZTtbXHNcfV0rZnVuY3Rpb25bXlx7XStce1tcc10qXCRkYXRhW1xzXSo9W1xzXSp1bnNlcmlhbGl6ZVwoYmFzZTY0X2RlY29kZVwoXCRkYXRhXClcKTtbXlx4MDJdK2lmW1xzXSpcKFtcc10qW1x3XStcKFwpW1xzXSomJltcc10qW1x3XStjb29raWVcKFwpW1xzXSomJltcc10qW1x3XSt1YVwoW1xzXCldK1x7W1xzXSphZGRfYWN0aW9uW147XStcKTtbXHNdKlx9W1xzXSp+Ijt9fXM6MjU6ImV2YWwoZnVuY3Rpb24ocCxhLGMsayxlLGQiO2E6Nzp7aTowO2k6MTA7czoxNDoiX2NoZWNrb3V0cGFnZXwiO2E6Mjp7aTowO2k6MTA7czoxMToiX2NjX251bWJlcnwiO2E6Mjp7aTowO2k6MTA7czoxMDoifGNoZWNrb3V0fCI7YTozOntpOjA7aToxMDtzOjIzOiJ8ZnJvbUNoYXJDb2RlfGVsc2V8dGV4dCI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wNzUiO2k6MTtzOjY1OiJ+ZXZhbC5mdW5jdGlvbi5wLmEuYy5rLmUuZC5bXlxuXStfY2NfbnVtYmVyXHxbXlwpXStzcGxpdC4uXHwuXCkrfiI7fXM6MjQ6InxhdXRob3JpemVuZXRfY2NfbnVtYmVyfCI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4xMjEiO2k6MTtzOjc5OiJ+ZXZhbC5mdW5jdGlvbi5wLmEuYy5rLmUuZC5bXlxuXStfY2NfbnVtYmVyXHxbXlwpXStzcGxpdC4uXHwuXCksW1xkXSssXHtcfVwpXCl+Ijt9fX19czoyMDoifGVuY29kZVVSSUNvbXBvbmVudHwiO2E6Mzp7aTowO2k6MTA7czoxMzoifHNlX3JlZmVycmVyfCI7YToyOntpOjA7aToxMDtzOjE3OiJ8ZGVmYXVsdF9rZXl3b3JkfCI7YToyOntpOjA7czozMDoiaW5qZWN0ZWQuanNfY3JlYXRlX2VsZW1lbnQuMDA4IjtpOjE7czo5NjoifmV2YWwuZnVuY3Rpb24ucC5hLmMuay5lLmRbXlx8XStcfFx8W1x3XVwudG9TdHJpbmdbXlx8XStbXlx9XStcfGRlZmF1bHRfa2V5d29yZFx8W15cfV0rXHtcfVwpXCl+Ijt9fXM6MTc6InxvbmVzdGVwY2hlY2tvdXR8IjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjEzNCI7aToxO3M6MTAzOiJ+ZXZhbC5mdW5jdGlvbi5wLmEuYy5rLmUuZFteXHxdK1x8XHxbXHddK1woW1x3XStcKVx9W15cfF0rXHxbXHddK1x8W15ce10rc3BsaXRcKC5cfC5cKSxbXGRdKyxce1x9XClcKTt+Ijt9fXM6MjA6IiwxMywxMywncGhwfHZvdGV8anN8IjthOjI6e2k6MDtpOjEwO3M6Mzg6Inx3d3d8aHR0cHN8bG9jYXRpb24nLnNwbGl0KCd8JyksMCx7fSkpIjthOjI6e2k6MDtzOjI0OiJpbmplY3RlZC5qc19yZWRpcmVjdC4wNDMiO2k6MTtzOjcwOiJ+ZXZhbC5mdW5jdGlvbi5wLmEuYy5rW148XStodHRwc1x8bG9jYXRpb24uXC5zcGxpdFteXH1dK1x7XH1cKVwpW1xzXSp+Ijt9fXM6OToifHBsdWdpbnN8IjthOjI6e2k6MDtpOjEwO3M6Mjc6InBocHxjb25maWd8amV0cGFja3xwbHVnaW5zfCI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQuanNfcmVkaXJlY3QuMDQ2IjtpOjE7czoxMjA6In5ldmFsXChmdW5jdGlvblwocCxhLGMsa1teK10rZnVuY3Rpb25cKFwpXHtyZXR1cm4uLi53XCsuXH07W15cfF0rcGhwXHxjb25maWdcfGpldHBhY2tbXlx9XStzcGxpdFwoLlx8LlwpLFtcZF0rLFx7XH1cKVwpfiI7fX1zOjI1OiJzdGF0dXN8dW1icmRhdGF8cmVzcG9uc2V8IjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjEzMyI7aToxO3M6NzA6In5ldmFsXChmdW5jdGlvblwocC5hLmMuay5lLmRbXnxdK1x8XHxbXlx8XStcfHVtYnJkYXRhXHxbXlx9XStce1x9XClcKX4iO31zOjQwOiJkb2N1bWVudHxmcm9tQ2hhckNvZGV8U3RyaW5nfGV2YWx8d3JpdGV8IjthOjI6e2k6MDtzOjIzOiJpbmplY3RlZC5oaWRkZW4tZGl2LjA0MiI7aToxO3M6MTE2OiJ+ZXZhbFwoZnVuY3Rpb25cKHAuYS5jLmsuZS5kW158XStcfFx8W15cfF0rXClcKVwpOy4sW15cKF0rZG9jdW1lbnRcfGZyb21DaGFyQ29kZVx8U3RyaW5nXHxldmFsXHx3cml0ZVteXHtdK1x7XH1cKVwpfiI7fX1zOjI6Imd6IjthOjc6e2k6MDtpOjEwO3M6NTE6IkBldmFsKEBnenVuY29tcHJlc3MoQHN0cl9yb3QxMyhAYmFzZTY0X2RlY29kZSgnYTV6bCI7YToyOntpOjA7czoyNDoiYmFja2Rvb3IuZXZhbF9iYXNlNjQuMDAyIjtpOjE7czo5NjoifkBldmFsXChAZ3p1bmNvbXByZXNzXChAc3RyX3JvdDEzXChAYmFzZTY0X2RlY29kZVwoLmE1emxbXjtdK01ibU5wWXBBb1Q3eWYvdy9OTXdvUUE9PS5cKVwpXClcKTt+Ijt9czo1NDoiQGV2YWwoQGd6dW5jb21wcmVzcyhAc3RyX3JvdDEzKEBiYXNlNjRfZGVjb2RlKCdhNXpsZlgxIjthOjI6e2k6MDtzOjI0OiJiYWNrZG9vci5ldmFsX2Jhc2U2NC4wMDQiO2k6MTtzOjcyOiJ+QGV2YWxcKEBnenVuY29tcHJlc3NcKEBzdHJfcm90MTNcKEBiYXNlNjRfZGVjb2RlXCguezEwMjR9W147XSs7XHMqZGllO34iO31zOjU0OiJldmFsKGd6aW5mbGF0ZShiYXNlNjRfZGVjb2RlKCdEWmZIRG9RNEdvVHY4eUl6SXc3a3BBMGoiO2E6Mjp7aTowO3M6MjQ6ImJhY2tkb29yLmV2YWxfYmFzZTY0LjAxMCI7aToxO3M6MTE0OiJ+PD9waHBccypcL1wqXHMqb25saW5lXHMqZW5jb2RlW15lXStldmFsXChnemluZmxhdGVcKGJhc2U2NF9kZWNvZGVcKC5EWmZIRG9RNEdvVHY4eUl6SXc3a3BBMGpbXj1dKz0uXClcKVwpO1xzKlw/Pn4iO31zOjUwOiJldmFsKGd6aW5mbGF0ZShiYXNlNjRfZGVjb2RlKCc3YjFyZXhvNUVqRDYyZk04OHg4NiI7YToyOntpOjA7czoyNDoiYmFja2Rvb3IuZXZhbF9iYXNlNjQuMDExIjtpOjE7czoxNDc6In5pZlxzKlwoc3RycG9zXChcJF9TRVJWRVJcWy5QSFBfU0VMRi5cXSwucnNzcG9zdGVyLnBocC5cKVwpXHMqXHtccypldmFsXChnemluZmxhdGVcKGJhc2U2NF9kZWNvZGVcKC43YjFyZXhvNUVqRDYyZk04OHg4NlteJ10rJ1wpXClcKTtccypleGl0O1xzKlx9fiI7fXM6NDE6Ijk3LDEwMCwxMDksMTA1LDExMCwxMDQsMTAxLDk3LDEwMCwxMDYsMTE1IjthOjI6e2k6MDtzOjIwOiJpbmplY3RlZC5qc19ldmFsLjAxMSI7aToxO3M6ODc6In5ldmFsXChTdHJpbmdcLmZyb21DaGFyQ29kZVwoW15cKV0rOTcsMTAwLDEwOSwxMDUsMTEwLDEwNCwxMDEsOTcsMTAwLDEwNiwxMTVbXlwpXStcKVwpfiI7fXM6MTk6IkBldmFsKEBnenVuY29tcHJlc3MiO2E6Mjp7aTowO3M6MjQ6ImJhY2tkb29yLmV2YWxfYmFzZTY0LjAxMyI7aToxO2k6MTE7fX1zOjE4OiJldmFsKGJhc2U2NF9kZWNvZGUiO2E6Mzp7aTowO2k6MTA7czoxOToiaWYoIWVtcHR5KCRfU0VSVkVSWyI7YToyOntpOjA7aToxMDtzOjE5OiJpZighZW1wdHkoJF9TRVJWRVJbIjthOjI6e2k6MDtpOjEwO3M6Mjg6ImV2YWwoYmFzZTY0X2RlY29kZSgkX1NFUlZFUlsiO2E6Mjp7aTowO3M6MTc6ImJhY2tkb29yLmV2YWwuMDA3IjtpOjE7czo4MDoifmlmXCghZW1wdHlcKFwkX1NFUlZFUlxbW15cXV0rXF1bXHNcKV0rQD9ldmFsXChiYXNlNjRfZGVjb2RlXChcJF9TRVJWRVJbXjtdK1wpO34iO319fXM6MTk6ImV2YWwoYmFzZTY0X2RlY29kZSgiO2E6Mjp7aTowO3M6MTc6ImJhY2tkb29yLmV2YWwuMDA2IjtpOjE7czozMToifkA/ZXZhbFwoYmFzZTY0X2RlY29kZVteO10rXCk7fiI7fX1zOjIzOiJvbm1vdXNlb3Zlcj0iZXZhbChhdG9iKCI7YToyOntpOjA7czoxNzoiYmFja2Rvb3IuZXZhbC4wMDEiO2k6MTtzOjEyODoiflxbPGFbXHNdKnRpdGxlW14+XStyZWxbXHNdKj1bXHNdKi5ub2ZvbGxvdy4+W1xzXSo8LmE+W15cKF0rb25tb3VzZW92ZXJbXHNdKj1bXHNdKi5ldmFsW1xzXSpcKFtcc10qYXRvYlwoW15cXV0rPC5hPltcc10qXF1bXHNdKn4iO31zOjIxOiJwLmgobC5tKDgsMSwwLGMsNCwyLGQiO2E6Mjp7aTowO3M6MzE6ImluamVjdGVkLmpzX2NyZWF0ZV9mdW5jdGlvbi4wMTUiO2k6MTtzOjE3MDoifjxzY3JpcHQ+ZXZhbFwoZnVuY3Rpb25cKHAsYSxjLGssZSxyXClccypce1teO10rO2lmXCghJycucmVwbGFjZVteO10rO2tbXiddKycuLndcKy5cfTtccypbXlxdXStcXVteXF1dK1xdXCk7cmV0dXJuXHMqcFx9XCgncC5oXChsLm1cKDgsMSwwLGMsNCwyLGRbXlx7XStce1x9XClcKTwuc2NyaXB0Pn4iO31zOjEyOiJhdG9iKCJZWElnIikiO2E6Mjp7aTowO3M6MjA6ImJhY2tkb29yLmpzX2V2YWwuMDE0IjtpOjE7czoxMTY6In48c2NyaXBbXj5dKz5ccyp2YXJccyooXHcrKVxzKj1ccyphdG9iXChbJyJcd1w9LV0rXClccyo7XHMqdmFyXHMqKFx3Kylccyo9W15cMl0rZXZhbFwoXDFcK1teXCldK1wpXHMqO1xzKjxcL3NjcmlwdD5+Ijt9czoxNDoiID0gYXRvYignZG1GeUkiO2E6Mjp7aTowO3M6MjA6ImJhY2tkb29yLmpzX2V2YWwuMDExIjtpOjE7czo1OToifnZhciBbXHddK1tcc10qPVtcc10qYXRvYlwoLmRtRlteO10rXCk7W1xzXSpldmFsXChbXHddK1wpO34iO31zOjM3OiJldmFsKCdcMTU2XDE0NVwxNjdcNDBcMTIyXDE0NVwxNDdcMTA1IjthOjI6e2k6MDtzOjI0OiJiYWNrZG9vci5ldmFsX2Jhc2U2NC4wMDUiO2k6MTtzOjQ4OiJ+ZXZhbFwoLi4xNTYuMTQ1LjE2Ny40MC4xMjIuMTQ1LjE0Ny4xMDVbXiddKydcKX4iO31zOjQ1OiJjPTF9O3doaWxlKGMtLSlpZihrW2NdKXA9cC5yZXBsYWNlKG5ldyBSZWdFeHAiO2E6Mjp7aTowO3M6MjA6ImJhY2tkb29yLmpzX2V2YWwuMDAyIjtpOjE7czoyNDU6In48XCEtLVx3Ky0tPjxzY3JpcHRccyp0eXBlPS50ZXh0LmphdmFzY3JpcHQuPlxzKmV2YWxcKGZ1bmN0aW9uXChwLGEsY1teO10rO2lmXChcIS4uLnJlcGxhY2VcKC5cXi5bXiddKycuLndcKy5cfTtccypbXiddKycuLmIuXCtlXChjLlwrW15cKl0rXCpmXCk7MlteXH1dK1x9XClcKFwpO1xzKi4sMzUsMzUsLnNyYy4udmFyLmRvY3VtZW50LnJhem13LnJhem1oW15cLl0rLnNwbGl0XCguLi4uLDAsXHtcfVwpXClccyo8LnNjcmlwdD5+Ijt9czo0MToiZXZhbChhdG9iKCdkbUZ5SUhnZ1BTQmtiMk4xYldWdWRDNW5aWFJGYkciO2E6Mjp7aTowO3M6MjQ6ImJhY2tkb29yLmV2YWxfYmFzZTY0LjAwOSI7aToxO3M6MTE2OiJ+PCEtLVxzKnN0eWxlPS5wb3NpdGlvbjpmaXhlZDt0b3A6MHB4W14iXSsiZXZhbFwoYXRvYlwoLmRtRnlJSGdnUFNCa2IyTjFiV1Z1ZEM1blpYUkZiR1Z0Wlc1MGMwSlteIl0rIlxzKlwmZ3Q7XHMqLS0+fiI7fXM6MzI6IltpbnNlcnRfcGhwXWlmIChpc3NldCgkX1JFUVVFU1RbIjthOjI6e2k6MDtzOjE3OiJiYWNrZG9vci5ldmFsLjAwNSI7aToxO3M6MTQxOiJ+XFtpbnNlcnRfcGhwXF1pZlxzKlwoaXNzZXRcKFwkX1JFUVVFU1RcWy5cdysuXF1cKVwpXHtldmFsXChcJF9SRVFVRVNUXFsuXHcrLlxdXCk7ZXhpdDtcfVteXHtdK1x7ZXZhbFwoXCRfUkVRVUVTVFxbLlx3Ky5cXVwpO2V4aXQ7XH1cWy5waHBcXX4iO31zOjI4OiInLnNwbGl0KCd8JyksMCx7fSkpPC9zY3JpcHQ+IjthOjI6e2k6MDtzOjE3OiJiYWNrZG9vci5ldmFsLjAwMiI7aToxO3M6MjY4OiJ+PGRpdlxzKmNsYXNzPS5jaGFuZ2UtdGhpcy4+W148XSs8YVxzKmhyZWY9Imh0dHBbXiJdKyI+W148XSs8LmE+W148XSs8LmRpdj48c2NyaXB0PmV2YWxcKGZ1bmN0aW9uW147XSs7aWZcKFwhLi4ucmVwbGFjZVteXHtdK1x7d2hpbGVcKGMtLVteJ10rJy4ud1wrJ1x9O1xzKmM9XGQrXH07d2hpbGVbXjtdKztyZXR1cm5ccypbXixdKyxcZCxcZCxcd1teO10rOy4uXGR7Mix9LFxkezIsfSwnXGR7Myx9W14nXSsnLnNwbGl0XCgnXHwnXCksXGQsXHtcfVwpXCk8LnNjcmlwdD5+Ijt9czoyMToieG1sLnBocD9hPWlubmVyJmhvc3Q9IjthOjI6e2k6MDtzOjI1OiJiYWNrZG9vci5nZXRfY29udGVudHMuMDAxIjtpOjE7czoxNjk6In5cJGNvbmZpZ19cdytccz1cc2ZpbGVfZ2V0X2NvbnRlbnRzXCguaHR0cDouLlteXD9dK1w/YT1pbm5lclwmaG9zdD0uXHMuXHNcJF9TRVJWRVIuLlNFUlZFUl9OQU1FLi4uLi4uanMuXCk7XHNpZi5zdHJsZW4uLmNvbmZpZy5cdysuXHM+XHMwLlx7XHNldmFsXChcJGNvbmZpZ19cdytcKVw7XHNcfX4iO31zOjQyOiJablZ1WTNScGIyNGdjMlYwUTI5dmEybGxLRzVoYldVc0lIWmhiSFZsTEMiO2E6Mjp7aTowO3M6MjQ6ImluamVjdGVkLmpzX3JlZGlyZWN0LjAzOSI7aToxO3M6NTg6In5ldmFsW1xzXSpcKFtcc10qYXRvYltcc10qXChbXHNdKi5ablZ1WTNScGIyNGdjMlZbXjtdK1wpO34iO31zOjE3OiJ3aGlsZSh4PWV2YWwoeCkpOyI7YToyOntpOjA7czoyMDoiaW5qZWN0ZWQuanNfZXZhbC4wMDgiO2k6MTtzOjU2OiJ+dmFyIHhbXHNdKj1bXHNdKiJmdW5jdGlvblteXHgwMl0rd2hpbGVcKHg9ZXZhbFwoeFwpXCk7fiI7fXM6NDE6ImV2YWwoYXRvYignWm5WdVkzUnBiMjRnYzNSaGNuUW9LU0I3Q2lBZ0lDIjthOjI6e2k6MDtzOjI0OiJiYWNrZG9vci5ldmFsX2Jhc2U2NC4wMjIiO2k6MTtzOjMxOiJ+ZXZhbFwoYXRvYlwoLlpuVnVbXlwpXStbXCk7XSt+Ijt9czo2MzoifENWMnxFeHBpcnlEYXRlWWVhcnx6b25lfHBvc3R8YXRvYnxjbGVhcnxjb25zb2xlfHNldFRpbWVvdXR8YUhSIjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjEzOSI7aToxO3M6MTc1OiJ+ZXZhbFwoZnVuY3Rpb25cKFtwYWNrZWQsXSpcKVx7XHcrPWZ1bmN0aW9uXChcdytcKS5yZXR1cm5cKFteUl0qUmVnRXhwXCguLi4uLlx3Ky5cK1teXHxdKlx8XFwuXClbXlwiXSp2YWxcfFx8XHxwYXltZW50XHxpbnB1dFx8W15cLl0qYUhSXHcrXHxDYXJkTnVtYmVyXHxbXlwpXSpcKSxcZCssXHtcfVwpXCl+Ijt9czo1OiJldmFsKCI7YToyOntpOjA7czoxNzoiYmFja2Rvb3IuZXZhbC4wMDMiO2k6MTtpOjExO319czo5OiJkb2N1bWVudC4iO2E6Mjc6e2k6MDtpOjEwO3M6MTQ6ImRvY3VtZW50LndyaXRlIjthOjExOntpOjA7aToxMDtzOjEzOiJhdE9wdGlvbnMgPSB7IjthOjI6e2k6MDtpOjEwO3M6MjE6In5cL1x3ezMyfVwvaW52b2tlLmpzfiI7YToyOntpOjA7czo0MjoiaW5qZWN0ZWQucG90ZW50aWFsbHlfdW53YW50ZWRfYWRzdGVycmEuMDAxIjtpOjE7aToxMTt9fXM6NDI6IiUyRiU2NyU2RiU2RiU2NyU2QyU2NSUyRSU2QSU3MyUyMiUyOSUwQSUyMCI7YToyOntpOjA7czozMToiaW5qZWN0ZWQuanNfY3JlYXRlX2RvY3VtZW50LjAwOSI7aToxO3M6MjM5OiJ+ZG9jdW1lbnQud3JpdGVcKFxzKnVuZXNjYXBlXChccyouJyUzQyUyMSU0NCU0RiU0MyU1NCU1OS4qPyUyQyUyMCUyMiU2OCU3NCU3NCU3MCUzQSUyRiUyRltcdyVdKj8lMkYlNjclNkYlNkYlNjclNkMlNjUlMkUlNkElNzMlMjIlMjklMEElMjBbXlwpXSo/JTY4JTY1JTYxJTY0JTNFJTBBJTBBJTNDJTYyJTZGJTY0JTc5JTNFJTBBJTNDJTJGJTYyJTZGJTY0JTc5JTNFJTBBJTNDJTJGJTY4JTc0JTZEJTZDJTNFLlwpXCk7fiI7fXM6MTIyOiJkb2N1bWVudC53cml0ZSggdW5lc2NhcGUoICclM0MlMjElNDQlNEYlNDMlNTQlNTklNTAlNDUlMjAlNDglNTQlNEQlNEMlMjAlNTAlNTUlNDIlNEMlNDklNDMlMjAlMjIlMkQlMkYlMkYlNTclMzMlNDMlMkYlMkYlNCI7YToyOntpOjA7czozMToiaW5qZWN0ZWQuanNfY3JlYXRlX2RvY3VtZW50LjAxMCI7aToxO3M6MTAzOiJ+ZG9jdW1lbnQud3JpdGVcKFxzKnVuZXNjYXBlXChccyouJTNDJTIxJTQ0JTRGJTQzJTU0JTU5JTUwJTQ1JTIwW147XSs5JTNFJTBBJTNDJTJGJTY4JTc0JTZEJTZDJTMuXClcKTt+Ijt9czoxODA6ImRvY3VtZW50LndyaXRlKHVuZXNjYXBlKCclM0MlNzMlNjMlNzIlNjklNzAlNzQlMjAlNzMlNzIlNjMlM0QlMjIlNjglNzQlNzQlNzAlM0ElMkYlMkYlNkElNzMlMkQlNkYlMkQlNjQlNjYlNzklNzElNjclNzUlMkUlNjMlN0ElMkUlNjMlNjMlMkYlMzMlMzklMjIlM0UlM0MlMkYlNzMlNjMlNzIlNjklNzAlNzQlM0UnKSI7YToyOntpOjA7czozMToiaW5qZWN0ZWQuanNfY3JlYXRlX2RvY3VtZW50LjAwOCI7aToxO2k6MTI7fXM6NzI6Ij9waHAud2FyL21vYy5uaWJldHNhcC8vOnB0dGgiPWNycyB0cGlyY3M8Jy5zcGxpdCgiIikucmV2ZXJzZSgpLmpvaW4oIiIpKSI7YToyOntpOjA7czoyMDoiYmFja2Rvb3IuanNfZXZhbC4wMDEiO2k6MTtzOjExNjoifmRvY3VtZW50LndyaXRlLi4+dHBpcmNzXC88Pi5cdys9aVw/cGhwLndhclwvbW9jLm5pYmV0c2FwLi46cHR0aC49Y3JzIHRwaXJjczwuLnNwbGl0XCgiIlwpLnJldmVyc2VcKFwpLmpvaW5cKCIiXClcKX4iO31zOjc1OiJkb2N1bWVudC53cml0ZShTdHJpbmcuZnJvbUNoYXJDb2RlKDYwLCAxMTUsIDk5LCAxMTQsIDEwNSwgMTEyLCAxMTYsIDMyLCAxMTUiO2E6Mjp7aTowO3M6MjM6ImluamVjdGVkLmpzX21hbHdhcmUuMDA5IjtpOjE7czo2NjoifmRvY3VtZW50XC53cml0ZVwoU3RyaW5nXC5mcm9tQ2hhckNvZGVcKDYwLCAxMTUsW15cKV0rXClbXHNdKlwpOz9+Ijt9czoxNToiZG9jdW1lbnQud3JpdGUoIjthOjI6e2k6MDtzOjMxOiJpbmplY3RlZC5qc19jcmVhdGVfZG9jdW1lbnQuMDExIjtpOjE7aToxMTt9czo2NDoiIjsgZG9jdW1lbnQud3JpdGUodW5lc2NhcGUoIiUzQ3NjcmlwdCBzcmM9JyIrbG9jYXRpb24ucHJvdG9jb2wrIiI7YToyOntpOjA7czozMToiaW5qZWN0ZWQuanNfY3JlYXRlX2RvY3VtZW50LjAyMyI7aToxO2k6MTE7fXM6MzM6In1jPXVuZXNjYXBlKGIpO2RvY3VtZW50LndyaXRlKGMpOyI7YToyOntpOjA7czozMToiaW5qZWN0ZWQuanNfY3JlYXRlX2RvY3VtZW50LjAxMyI7aToxO2k6MTE7fXM6NjE6ImZ1bmN0aW9uIGdldENvb2tpZShlKXt2YXIgVT1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiO2E6Mjp7aTowO3M6MjM6ImluamVjdGVkLmpzX21hbHdhcmUuMDA4IjtpOjE7czo3NzoifmZ1bmN0aW9uIGdldENvb2tpZVwoZVwpXHtbXjpdKzpbXjpdKzp2b2lkW1xzXSpbXGRdK1x9W1xzXSp2YXIgc3JjW15cfV0rXClcfX4iO319czoyOToiZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUiO2E6Nzp7aTowO2k6MTA7czoyNDoiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlIjthOjk6e2k6MDtpOjEwO3M6MzE6IlsiRG9tYWluIl0gPSBsb2NhdGlvbi5ob3N0bmFtZTsiO2E6Mjp7aTowO2k6MTA7czoxMjU6IltbbnVsbCwgImF0b2IiXSwgW251bGwsICJidG9hIl0sIFtudWxsLCAic2V0SW50ZXJ2YWwiXSwgWyJKU09OIiwgInN0cmluZ2lmeSJdLCBbbnVsbCwgIlJlZ0V4cCJdLCBbbnVsbCwgImVuY29kZVVSSUNvbXBvbmVudCJdIjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjExNCI7aToxO3M6MTgyOiJ+dmFyIFtcd1wkXStbXHNdKj1bXHNdKlx7W1xzXSpbXHddK1tcc10qOltcc10qZnVuY3Rpb25cKFwpW1xzXSpce1tcc10qdmFyIFtcd10rW1xzXSo9W1xzXSpcW1xbbnVsbCxbXHNdKi5hdG9iLlxdLFtcc10qXFtudWxsLFtcc10qLmJ0b2FbXlx4MDJdK2FIUjBjW15cfV0rXH07W1xzXSpbXHdcJF0rXC5bXHddK1woXCk7fiI7fX1zOjUwOiJkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShTdHJpbmcuZnJvbUNoYXJDb2RlKCI7YToyOntpOjA7aToxMDtzOjMzOiJjcmVhdGVFbGVtZW50KFN0cmluZy5mcm9tQ2hhckNvZGUiO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLm1hc3NfaW5qZWN0aW9uLjAwMSI7aToxO3M6MTkzOiJ+dmFyIFtcd10rW1xzXSo9W1xzXSpTdHJpbmdcLmZyb21DaGFyQ29kZVwoW1xkXStbXlx9XStkb2N1bWVudFwuY3VycmVudFNjcmlwdFwpO1tcc10qXH1bXHNdKmVsc2VbXHNdKlx7W1xzXSpbXHddK1wuZ2V0RWxlbWVudHNCeVRhZ05hbWVcKFN0cmluZ1wuZnJvbUNoYXJDb2RlW15cfV0rY2hpbGROb2Rlc1xbW1xkXStcXVwpO1tcc10qXH1+Ijt9fXM6NjoiKSArICcvIjthOjI6e2k6MDtpOjEwO3M6NTY6Ii5zcmMgPSAoJ2h0dHBzOicgPT0gZG9jdW1lbnQubG9jYXRpb24ucHJvdG9jb2wgPyAnaHR0cHM6IjthOjI6e2k6MDtzOjI0OiJpbmplY3RlZC5qc19yZWRpcmVjdC4wNDEiO2k6MTtzOjEyNzoifltcd10rW1xzXSo9W1xzXSpbXGRdKztbXHNdKlwoZnVuY3Rpb25cKFwpW1xzXSpce1tcc10qdmFyIFtcd10rW1xzXSo9W1xzXSpkb2N1bWVudFwuY3JlYXRlRWxlbWVudFwoLnNjcmlwdFteXH1dK1x9W1xzXSpcKVwoXCk7fiI7fX1zOjIwOiJsbWNTY3IoInNjcmVlbi1vYmoiLCI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wODEiO2k6MTtzOjE3NDoifihpZlwoXChuZXcgUmVnRXhwW15cKV0rb25lcGFnZVteXCldK1wpK1wudGVzdFwod2luZG93XC5sb2NhdGlvblwpXClbXHNdKlx7KXxmdW5jdGlvbiBpTUN3T1woXClbXjxdK3NldFRpbWVvdXRcKGZ1bmN0aW9uXChcKVtcc10qXHtbXHNdKmxtY1NjcltePF0rTWF0aFwucmFuZG9tXChcKVwpO1tcc1x9XSt+Ijt9czoyNjI6In4odmFyIFtcd10rW1xzXSo9W1xzXSpTdHJpbmdcLmZyb21DaGFyQ29kZVwoW15cKV0rXCk7W1xzXSopezQsfXZhciBbXHddK1tcc10qPVtcc10qZG9jdW1lbnRcLmNyZWF0ZUVsZW1lbnRcKFtcd10rXCk7W1xzXSpbXHddXC50eXBlW147XSs7W1xzXSp2YXJbXHNdKltcd10rW1xzXSo9W1xzXSpkb2N1bWVudFwuZ2V0RWxlbWVudHNCeVRhZ05hbWVcKFteO10rXF07W1xzXSpbXHddK1wucGFyZW50Tm9kZVwuaW5zZXJ0QmVmb3JlXChbXHddLFtcc10qW1x3XVwpO34iO2E6Mjp7aTowO3M6MjQ6ImluamVjdGVkLmpzX3JlZGlyZWN0LjAyOCI7aToxO3M6MjYyOiJ+KHZhciBbXHddK1tcc10qPVtcc10qU3RyaW5nXC5mcm9tQ2hhckNvZGVcKFteXCldK1wpO1tcc10qKXs0LH12YXIgW1x3XStbXHNdKj1bXHNdKmRvY3VtZW50XC5jcmVhdGVFbGVtZW50XChbXHddK1wpO1tcc10qW1x3XVwudHlwZVteO10rO1tcc10qdmFyW1xzXSpbXHddK1tcc10qPVtcc10qZG9jdW1lbnRcLmdldEVsZW1lbnRzQnlUYWdOYW1lXChbXjtdK1xdO1tcc10qW1x3XStcLnBhcmVudE5vZGVcLmluc2VydEJlZm9yZVwoW1x3XSxbXHNdKltcd11cKTt+Ijt9czoxOTY6In5cKGZ1bmN0aW9uXChcKVx7dmFyIC49bmF2aWdhdG9yXFsuXCgiW14iXSsiXClcXTt2YXIgLj1kb2N1bWVudFxbLlwoIlteIl0rIlwpXF07aWZcKC5cKC4sLlwoIlteIl0rIlwpXCkmJiEuXCguLC5cKCJbXiJdKyJcKVwpXClce2lmXCghLlwoLiwuXCgiW14iXSsiXClcKVwpXHt2YXIgLj1kb2N1bWVudFwuY3JlYXRlRWxlbWVudFwoLnNjcmlwdH4iO2E6Mjp7aTowO3M6MzA6ImluamVjdGVkLmpzX2NyZWF0ZV9lbGVtZW50LjAwOSI7aToxO3M6MjMwOiJ+XChmdW5jdGlvblwoXClce3ZhciAuPW5hdmlnYXRvclxbLlwoIlteIl0rIlwpXF07dmFyIC49ZG9jdW1lbnRcWy5cKCJbXiJdKyJcKVxdO2lmXCguXCguLC5cKCJbXiJdKyJcKVwpJiYhLlwoLiwuXCgiW14iXSsiXClcKVwpXHtpZlwoIS5cKC4sLlwoIlteIl0rIlwpXClcKVx7dmFyIC49ZG9jdW1lbnRcLmNyZWF0ZUVsZW1lbnRcKC5zY3JpcHRbXlwoXStcKCdbXiddKy5cKTtbXjpdK1x9XH1cKVwoXCk7fiI7fXM6MTAzOiIvYXBwL21ldHJpY3MuanMnO3ZhciBzPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzY3JpcHQnKVswXTtzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHBvLHMpO30pKCk7IjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjEyOCI7aToxO3M6MTU0OiJ+XChmdW5jdGlvblwoXClbXHNdKlx7W1xzXSp2YXIgW1x3XStbXHNdKj1bXHNdKmRvY3VtZW50XC5jcmVhdGVFbGVtZW50Li5zY3JpcHQuLjtbXHNdKltcd10rXC50eXBlW148XSthcHAubWV0cmljc1wuanNbXlx9XStpbnNlcnRCZWZvcmVbXlx9XStcfVtcc1wpXChdKzt+Ijt9czoyMToiPCEtLSBIaXRUYWlsIENvZGUgLS0+IjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5qc191bndhbnRlZF9hZHMuMDE4IjtpOjE7czoxNDQ6In48IS0tIEhpdFRhaWwgQ29kZSAtLT5ccyo8c2NyaXB0W14+XSo+XHMqXChmdW5jdGlvbi4uXHtccyp2YXIgaHRbXjw+XStcLmhpdHRhaWxcLmNvbVwvbWx0XC5qc1tePD5dK2luc2VydEJlZm9yZVwoaHQsXHMqc1wpO31cKVwoXCk7XHMqPC5zY3JpcHQ+fiI7fX1zOjQ4OiIuc3JjLnJlcGxhY2Uod2luZG93LmF0b2IoJ1oyOXZaMnhsTFdGdVlXeDVkR2xqY3kiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDczIjtpOjE7czoyMjQ6In5cKGZ1bmN0aW9uXChcKVtcc10qXHtbXHNdKnZhciBbXHddK1tcc10qPVtcc10qZG9jdW1lbnRcLmNyZWF0ZUVsZW1lbnRcKC5zY3JpcHQuXCk7W146XStodHRwcz86Lltcc10qPT1bXHNdKmRvY3VtZW50XC5sb2NhdGlvblwucHJvdG9jb2xbXjtdKztbXHNdKltcd10rXC5zcmNbXHNdKj1bXHNdKltcd10rXC5zcmNcLnJlcGxhY2VcKHdpbmRvd1wuYXRvYlwoLloyOVteXH1dK1tcfVwoXCldKzt+Ijt9czo3MDoiOmJ0b2EobG9jYXRpb24uaG9zdG5hbWUuc3BsaXQoJy4nKS5zbGljZSgwKS5qb2luKCdfJykgIHx8ICdub2RvbWFpbicpLCI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wODQiO2k6MTtzOjIzMjoifmlmW1xzXSpcKFtcc10qdHlwZW9mW1xzXSpbXHddK1tcc10qPT1bXHNdKi51bmRlZmluZWQuXClbXHNdKlx7W1xzXSp2YXJbXHNdKltcd10rW1xzXSo9W1xzXSpce1tcc10qW1x3XSs6YnRvYVwobG9jYXRpb25cLnRvU3RyaW5nXChcKVwpLFteJl0rdmFyIGRhdGFbXHNdKj1bXlx9XSt1cmwsW1xzXSpkYXRhLFtcc10qaXNfZXZhbCxbXHNdKmlzX3N5bmNcKTtbXHNcfV0rW1x3XStbXlwpXStcKTtbXHNcfV0rfiI7fXM6Njk6Iil9d2luZG93Lm9ubG9hZD1mdW5jdGlvbigpey0xIT1sb2NhdGlvbi5ocmVmLnNlYXJjaCgnJykmJnNldEludGVydmFsKCI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4xMDIiO2k6MTtzOjE0MzoifmZ1bmN0aW9uIFtcd10rXChcKVtcc10qXHtbXHNdKkFycmF5XC5mcm9tXChkb2N1bWVudFwuZ2V0RWxlbWVudHNCeVRhZ05hbWVcKC5pbnB1dFtePF0rLTEhPWxvY2F0aW9uXC5ocmVmXC5zZWFyY2hcKC4uXCkmJnNldEludGVydmFsW15cfV0rXH07P34iO31zOjg5OiJHVE0uc3JjID0gYXRvYihHb29nbGVfVG9rZW4pOyAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXS5hcHBlbmRDaGlsZChHVE0pOyI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQuZmFrZV9ob3RqYXIuMDAxIjtpOjE7czoxMTM6In5cKGZ1bmN0aW9uXChoLG8sdCxqLGEsclwpW1xzXSpce1tePl0rR1RNXC5zcmNbXHNdKj1bXHNdKmF0b2JcKEdvb2dsZV9Ub2tlblwpO1tcc10qZG9jdW1lbnRcLmdldEVsZW1lbnRzW147XStcKTt+Ijt9czo0MToiYXV0aG9yaXplbmV0X2NjX251bWJlciIpLnZhbHVlLnRvU3RyaW5nKCkiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDg2IjtpOjE7czo0MDE6In48c2NyaXB0W15cfV0rZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWRcKC5iaWxsaW5nOlteXCldK1wpXC52YWx1ZVwudG9TdHJpbmdcKFwpW157XStjYXRjaFwoW1x3XStcKVx7W14mXStnZXRFbGVtZW50QnlJZFwoLmF1dGhvcml6ZW5ldF9jY19udW1iZXJbXlx9XStcfVtcc10qY2F0Y2hcKFtcd10rXClce1x9W1xzXSp2YXJbXHNdKltcd10rW1xzXSo9W1xzXSpkb2N1bWVudC5jcmVhdGVFbGVtZW50XChbXlx7XStmdW5jdGlvbltcc10qW1x3XStcKFwpXHtbXHNdKnRyeVx7W1xzXSpkb2N1bWVudFwuZ2V0RWxlbWVudEJ5SWRcKFteXH1dK1tcc10qXH1bXHNdKmNhdGNoXChbXHddK1wpXHtcfVtcc10qXH07W1xzXSp3aW5kb3dcLnNldEludGVydmFsXChbXHddKyxbXHNdKltcZF0qXCk7W1xzXSo8LnNjcmlwdD5+Ijt9fXM6MTM6Ii5hcHBlbmRDaGlsZCgiO2E6NTp7aTowO2k6MTA7czozMzoiZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7IjthOjU6e2k6MDtpOjEwO3M6NjoiYXRvYignIjthOjQ6e2k6MDtpOjEwO3M6NToiYUhSMGMiO2E6Mjp7aTowO2k6MTA7czoxNDM6In52YXIgW1x3XStbXHNdKj1bXHNdKmRvY3VtZW50XC5jcmVhdGVFbGVtZW50XCguc2NyaXB0LlwpO1tcc10qW1x3XStcLnNyY1tcc10qPVtcc10qYXRvYlwoLmFIUjBjW147XStcKTtbXHNdKmRvY3VtZW50W147XSthcHBlbmRDaGlsZFwoW1x3XStcKTt+IjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5qc19hcHBlbmRDaGlsZC4wMDkiO2k6MTtzOjE0MzoifnZhciBbXHddK1tcc10qPVtcc10qZG9jdW1lbnRcLmNyZWF0ZUVsZW1lbnRcKC5zY3JpcHQuXCk7W1xzXSpbXHddK1wuc3JjW1xzXSo9W1xzXSphdG9iXCguYUhSMGNbXjtdK1wpO1tcc10qZG9jdW1lbnRbXjtdK2FwcGVuZENoaWxkXChbXHddK1wpO34iO319czoxMzoibG9jYXRpb24uaHJlZiI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wODUiO2k6MTtzOjEyNjoifmlmW1xzXSpcKFtcc10qW15cKV0rXChbXlwoXSphdG9iXChbXlx7XStce1tcc10qdmFyIFtcd10rW1xzXSo9W1xzXSpkb2N1bWVudFwuY3JlYXRlRWxlbWVudFteXH1dK2FwcGVuZENoaWxkXChbXHddK1wpO1tcc10qXH1+Ijt9czo2Mjoic2NyaXB0LnNyYyA9IHVybDsgaGVhZC5hcHBlbmRDaGlsZChzY3JpcHQpOyB9IGxvYWRTY3JpcHQoYXRvYigiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMTQ3IjtpOjE7czo5MjoifmZ1bmN0aW9uIGxvYWRTY3JpcHRcKHVybFwpW1xzXSpce1tcc10qdmFyIGhlYWRbXlx9XStcfVtcc10qbG9hZFNjcmlwdFwoYXRvYlwoW147XStcKTtbXHNdKn4iO319czo1ODoidmFyIGV2ZW50c0xpc3RlbmVyUG9vbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpOyI7YToyOntpOjA7aToxMDtzOjczOiJkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYm9keScpWzBdLmFwcGVuZENoaWxkKGV2ZW50c0xpc3RlbmVyUG9vbCk7IjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5qc19hcHBlbmRDaGlsZC4wMTAiO2k6MTtzOjIxNToifnZhciBldmVudHNMaXN0ZW5lclBvb2xbXHNdKj1bXHNdKmRvY3VtZW50XC5jcmVhdGVFbGVtZW50XCguc2NyaXB0LlwpO1tcc10qZXZlbnRzTGlzdGVuZXJQb29sW147XSs7W1xzXSpldmVudHNMaXN0ZW5lclBvb2xbXjtdKztbXHNdKmRvY3VtZW50XC5nZXRFbGVtZW50c0J5VGFnTmFtZVwoLmJvZHkuXClcWzBcXVwuYXBwZW5kQ2hpbGRcKGV2ZW50c0xpc3RlbmVyUG9vbFwpO34iO319czozNjoiaWYoIXdpbmRvdy5SUiAmJiAhd2luZG93LmJlbnMpe2JlbnM9IjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjA5NSI7aToxO3M6MTEzOiJ+aWZcKCF3aW5kb3dcLlJSICYmICF3aW5kb3dcLmJlbnNcKVx7YmVucz1bXGRdKztjb25zdCBbXHddKz1kb2N1bWVudFwuY3JlYXRlRWxlbWVudFteXH1dK2FwcGVuZENoaWxkXChbXlx9XStcfTs/fiI7fXM6MzA6Il0uam9pbignLicpXS5qb2luKCcvJykudHJpbSgpOyI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQuanNfcmVkaXJlY3QuMDM4IjtpOjE7czoxNzk6In52YXIgczJbXHNdKj1bXHNdKmRvY3VtZW50XC5jcmVhdGVFbGVtZW50XCguc2NyaXB0LlwpO1teO10rO1tcc10qczJcLnNldEF0dHJpYnV0ZVwoLnNyYy4sW1xzXSpbXHddK1wpO1tcc10qZG9jdW1lbnRcLmdldEVsZW1lbnRzQnlUYWdOYW1lXCguaGVhZC5cKVwuaXRlbVwoMFwpXC5hcHBlbmRDaGlsZFwoczJcKTt+Ijt9fXM6MTE6IihmdW5jdGlvbigpIjthOjQ6e2k6MDtpOjEwO3M6MjA6Ii5zZW5kKG51bGwpfWZ1bmN0aW9uIjthOjI6e2k6MDtpOjEwO3M6Mjg6IndpbmRvdy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIiO2E6Mjp7aTowO2k6MTA7czo4OiI9WzI2LDI2LCI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4xMTkiO2k6MTtzOjI4NToifmZ1bmN0aW9uIFtcd10rXChcKVtcc10qXHtbXHNdKltcc10qW1x3XStbXHNdKj1bXjtdKztbXHNdKnZhciBbXHddK1tcc10qPVtcc10qbmV3IEltYWdlW147XSo7W1xzXSpPYmplY3RcLmRlZmluZVByb3BlcnR5XChbXHddKyxbXHNdKi5pZC4sW1xzXSpce1tcc10qZ2V0OmZ1bmN0aW9uXChcKVteXC9dK2Z1bmN0aW9uXChcKVx7dmFyIFtcd10rW1xzXSo9W1xzXSpcWzI2LDI2W148XSs8W1x3XStcLmxlbmd0aFtePl0rPi5bXClcfTtcc10rc2V0VGltZW91dFwoW1x3XStcKFwpLFtcc10qW1xkXStcKTt+Ijt9fX1zOjk5OiJ+XChmdW5jdGlvblwoXClbXHNdKlx7W1xzXSp2YXJbXlx9XStTdHJpbmdcLmZyb21DaGFyQ29kZVwoW15cfV0rYXBwZW5kQ2hpbGRcKFteXH1dK1x9W1xzXSpbXChcKTtdK34iO2E6Mjp7aTowO3M6MzA6ImluamVjdGVkLmpzX2NyZWF0ZV9lbGVtZW50LjAxMCI7aToxO3M6OTk6In5cKGZ1bmN0aW9uXChcKVtcc10qXHtbXHNdKnZhclteXH1dK1N0cmluZ1wuZnJvbUNoYXJDb2RlXChbXlx9XSthcHBlbmRDaGlsZFwoW15cfV0rXH1bXHNdKltcKFwpO10rfiI7fXM6Nzc6Iil9d2luZG93Lm9ubG9hZD1mdW5jdGlvbigpey0xIT1sb2NhdGlvbi5ocmVmLnNlYXJjaCgnY2hlY2tvdXQnKSYmc2V0SW50ZXJ2YWwoIjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjEyMyI7aToxO3M6MzE1OiJ+ZnVuY3Rpb24gW1x3XStcKFwpW1xzXSpce1tcc10qQXJyYXlcLmZyb21cKGRvY3VtZW50XC5nZXRFbGVtZW50c0J5VGFnTmFtZVwoLmlucHV0LlwpXClcLmZvckVhY2hcKGZ1bmN0aW9uXCguLC5cKVx7W1xzXSpudWxsW1xzXSo9PVtcc10qLlwuZ2V0QXR0cmlidXRlXCgub25jaGFuZ2VbXiFdKyE9LlwubmFtZVwubGVuZ3RoW15cfV0rYXBwZW5kQ2hpbGRcKC5cKVx9W1xzXSp3aW5kb3dcLm9ubG9hZFtcc10qPVtcc10qZnVuY3Rpb25cKFwpW1xzXSpce1tcc10qLVtcZF0rIT1sb2NhdGlvblwuaHJlZlwuc2VhcmNoXCguY2hlY2tvdXRbXlx9XStcKVx9O34iO319czoxMDoiLnNyYz1hdG9iKCI7YTozOntpOjA7aToxMDtzOjI2OiJsb2NhdGlvbi5ocmVmLnNlYXJjaChhdG9iKCI7YToyOntpOjA7aToxMDtzOjQyOiJ+XClcKVtcc10qIT1bXHNdKi0xW1xzXSpcKVtcc10qXHtbXHNdKnZhcn4iO2E6Mjp7aTowO3M6MzA6ImluamVjdGVkLmpzX2FwcGVuZENoaWxkLjAwMi4wMiI7aToxO3M6MTQzOiJ+aWZbXHNdKlwoW1xzXSpsb2NhdGlvblwuaHJlZlwuc2VhcmNoW1xzXSpcKFtcc10qYXRvYltcc10qXChbXHNdKi5bXlx9XSthcHBlbmRDaGlsZFwoW1x3XStcKTs/W1xzXSpcfTs/W1xzXSoodmFyIFtcd10rW1xzXSo9W1xzXSpcKFteXCldK1wpOyk/fiI7fX1zOjIyOiIuaW5jbHVkZXMoYXRvYignWTJGeWRBIjthOjI6e2k6MDtpOjEwO3M6Mjc6Ii5pbmNsdWRlcyhhdG9iKCdZMmhsWTJ0dmRYUSI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuanNfYXBwZW5kQ2hpbGQuMDEzIjtpOjE7czoxNTM6In52YXJbXHNdKltcd109ZG9jdW1lbnRcLmxvY2F0aW9uXC5wYXRobmFtZTtbXHNdKmlmXChbXHddKyYmW1xzXSpbXHddK1wuaW5jbHVkZXNcKGF0b2JcKC5ZMmhsWTJ0dmRYUS5cKVwpW15cfV0rXCk7ZG9jdW1lbnRcLmJvZHlcLmFwcGVuZENoaWxkXChbXHddK1wpO1x9fiI7fX19czo1NzoiZ2V0RWxlbWVudHNCeVRhZ05hbWUoU3RyaW5nLmZyb21DaGFyQ29kZSgxMDQsMTAxLDk3LDEwMCkpIjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5tYXNzX2luamVjdGlvbi4wMDIiO2k6MTtzOjExNDoifmlmW1xzXSpcKGRvY3VtZW50XC5oZWFkXClbXHNdKlx7W1xzXSp2YXIgW1x3XStbXHNdKj1bXlx9XSs5NyxbXHNdKjEwMFwpXClcW1tcZF0rXF1cLmFwcGVuZENoaWxkXChbXHddK1wpO1tcc10qXH1+Ijt9fXM6MTA6IkdldENDSW5mbzoiO2E6Mzp7aTowO2k6MTA7czoxODoidmFyIEpTT049SlNPTnx8e307IjthOjI6e2k6MDtpOjEwO3M6Mzc6InZhciBKU09OPUpTT058fHt9O0pTT04uc3RyaW5naWZ5PUpTT04iO2E6Mjp7aTowO3M6MjY6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDY1LjAyIjtpOjE7czoyMTU6In52YXIgSlNPTj1KU09OXHxcfFx7XH07W1xzXSpKU09OXC5zdHJpbmdpZnlbXlwvXStHYXRlOlteLF0rLFtcc10qRGF0YTpbXHNdKlx7XH1bXlw/XStcP2hhc2hbXj5dKz4+W14jXStpZlwoZG9jdW1lbnRcLmdldEVsZW1lbnRCeUlkXChcJFtcd10rXC5DVlZcKVwpW1xzXSpkb2N1bWVudFwuZ2V0RWxlbWVudEJ5SWRcKFwkW1x3XStcLkNWVlwpXC52YWx1ZVteO10rO1tcc1x9XSt+Ijt9fXM6MTE6InZhciBoZXhfY2hyIjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjA2NSI7aToxO3M6MTU1OiJ+XChmdW5jdGlvblwoXClbXHNdKlx7W1xzXSpmdW5jdGlvblteXF5dK1teVl0rWWVhcjpbXixdKyxbXHNdKkNWVjpbXixdKyxbXHNdKkdhdGU6W15ceDAyXStkb2N1bWVudFwuZ2V0RWxlbWVudEJ5SWRcKFwkLlwuQ1ZWXClcLnZhbHVlW1xzXSo9W1xzXSoiIjtbXHNcfV0rfiI7fX1zOjQwOiJ3aW5kb3cubG9jYXRpb24uc2VhcmNoLnJlcGxhY2UoJz8nLCAnJicpIjthOjM6e2k6MDtpOjEwO3M6MzU6Ii5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc2NyaXB0JylbMF07IjthOjI6e2k6MDtpOjEwO3M6NTU6IiZkZWZhdWx0X2tleXdvcmQ9JyArIGVuY29kZVVSSUNvbXBvbmVudChkb2N1bWVudC50aXRsZSkiO2E6Mjp7aTowO3M6MjQ6ImluamVjdGVkLmpzX3JlZGlyZWN0LjAzNCI7aToxO3M6MjI0OiJ+dmFyIFtcd10rW1xzXSo9W1xzXSpkb2N1bWVudCxbXHNdKltcd10rW1xzXSo9W1xzXSpbXHddK1wuZ2V0RWxlbWVudHNCeVRhZ05hbWVcKC5zY3JpcHRbXjtdKztbXHNdKnZhciBbXHddK1tcc10qPVtcc10qW1x3XStcLmNyZWF0ZUVsZW1lbnRcKC5zY3JpcHQuXCk7W148XStpbmRleE9mXCguaHR0cHM/Oi5cKVtcc10qPStbXHNdKjBbXHNdKlwpW1xzXSpce1tcc10qYWxlcnRcKFteXH1dK1x9fiI7fX1zOjU1OiImZGVmYXVsdF9rZXl3b3JkPScgKyBlbmNvZGVVUklDb21wb25lbnQoZG9jdW1lbnQudGl0bGUpIjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjEwOCI7aToxO3M6MTExOiJ+aWZbXHNdKlwoZG9jdW1lbnRcLmxvY2F0aW9uXC5wcm90b2NvbFtcc10qPT09W1xzXSouaHR0cHM6Lltcc10qJiZbXHNdKlteXHsmXSsmZGVmYXVsdF9rZXl3b3JkW15cfV0rXCk7W1xzXSpcfX4iO319czoyMDoid2luZG93LmxvY2F0aW9uLmhyZWYiO2E6Mzp7aTowO2k6MTA7czoyMjoiaWYocmVnZXhwLnRlc3Qod2hlcmUpKSI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQuanNfcmVkaXJlY3QuMDQyIjtpOjE7czoxMzM6In52YXIgcmVnZXhwW1xzXSo9W147XSs7W1xzXSp2YXIgd2hlcmVbXHNdKj1bXHNdKmRvY3VtZW50XC5bXjtdKztbXHNdKmlmXChyZWdleHBcLnRlc3RcKHdoZXJlXClcKVtcc10qXHtbXHNdKndpbmRvd1wubG9jYXRpb25bXlx9XStcfX4iO31zOjYzOiIuY29tJztkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdLmFwcGVuZENoaWxkKGUpO30iO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDQ1IjtpOjE7aToxMTt9fXM6NDI6IjxzcGFuIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij48aW1nIHNyYz0iaHR0cCI7YToyOntpOjA7aToxMDtzOjEzOiJzcmM9YXRvYignTHk5IjthOjI6e2k6MDtpOjEwO3M6NzE6InM9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3NjcmlwdCcpWzBdO3MucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjA2NiI7aToxO3M6MjQxOiJ+PHNwYW5bXHNdKnN0eWxlPS5kaXNwbGF5Om5vbmU7Lj48aW1nW1xzXSpzcmM9W149XStvbmxvYWRbXHNdKj0udmFyW1xzXSpbXHddK1tcc10qPVtcc10qZG9jdW1lbnRcLmNyZWF0ZUVsZW1lbnRcKC5zY3JpcHQuXCk7W1xzXSpbXHddK1wuc3JjW1xzXSo9W1xzXSphdG9iXCguTHk5W147XStcKTtbXHNdKnZhcltcc10qW1x3XStbXHNdKj1bXHNdKmRvY3VtZW50XC5nZXRFbGVtZW50c0J5VGFnTmFtZVtePl0rPjwuc3Bhbj5+Ijt9fX1zOjE1OiIvYWZ1LnBocD96b25laWQiO2E6Mjp7aTowO2k6MTA7czoyNjoic2RrLm9uUGVybWlzc2lvbkRlZmF1bHQoKCkiO2E6Mjp7aTowO2k6MTA7czo0NToiKG92ZXJsYXlUcmFuc2xhdGlvbnNbbmF2aWdhdG9yLmxhbmd1YWdlLnNsaWNlIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5qc191bndhbnRlZF9hZHMuMDE2IjtpOjE7czoxNzI6In5jb25zdCBvdmVybGF5VHJhbnNsYXRpb25zID0gXHsuZW4uOlx7LnRpdGxlW147XStcfTtbXHNdKmNvbnN0IG92ZXJsYXkgPSBcey5kZWxheS46W147XStcfTtbXHNdKmNvbnN0W1xzXSpbXHddK1tcc10qPVtcc10qZG9jdW1lbnRcLmNyZWF0ZUVsZW1lbnRbXjxdK2FwcGVuZENoaWxkXChbXHddK1wpO34iO319fXM6Mjc6Iihpc0Rlc2t0b3AoKSB8fCBpc01vYmlsZSgpKSI7YToyOntpOjA7aToxMDtzOjQ4OiIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIndwYWRtaW5iYXIiKSA9PT0gbnVsbCkiO2E6Mjp7aTowO2k6MTA7czoyMjoibG9jYXRpb24ucmVwbGFjZSgiaHR0cCI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQuanNfcmVkaXJlY3QuMDQwIjtpOjE7czoxOTc6In5cKGZ1bmN0aW9uW1xzXSpcKFwpW1xzXSpce1tcc10qaWZbXHNdKlwoZG9jdW1lbnRcLmdldEVsZW1lbnRCeUlkXCgud3BhZG1pbmJhci5cKVtcc10qPT09W1xzXSpudWxsXClbXHNdKlx7W1xzXSppZltcc10qXCh0eXBlb2ZbXHNdKnNldENvb2tpZVtePl0rbG9jYXRpb25cLnJlcGxhY2VcKC5odHRwW147XStcKTtbXHNcfV0rXClcKHRoaXNcKTt+Ijt9fX1zOjExOiInIiwgZGVsYXkpOyI7YToyOntpOjA7aToxMDtzOjQwOiJzZXRUaW1lb3V0KCJkb2N1bWVudC5sb2NhdGlvbi5ocmVmPSdodHRwIjthOjI6e2k6MDtzOjI0OiJpbmplY3RlZC5qc19yZWRpcmVjdC4wMjMiO2k6MTtzOjYwOiJ+c2V0VGltZW91dFwoLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9Lmh0dHBbXildKyciLCBkZWxheVwpO34iO319czo2MToiZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXS5hcHBlbmRDaGlsZChzY3JpcHQpOyI7YToyOntpOjA7aToxMDtzOjE2OiJ5b3Vyc2VydmljZS5saXZlIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjEzOSI7aToxO3M6MTkwOiJ+dmFyIFtcd10rW1xzXSo9W1xzXSpkb2N1bWVudFwuY3JlYXRlRWxlbWVudFwoW15cKV0rXCk7W146XXsxMCwxNTB9XC5zcmNbXHNdKj1bXHNdKiJodHRwczouLnlvdXJzZXJ2aWNlXC5saXZlW147XSs7W15cKF0rZG9jdW1lbnRcLmdldEVsZW1lbnRzQnlUYWdOYW1lXCguaGVhZC5cKVxbMFxdXC5hcHBlbmRDaGlsZFwoW1x3XStcKTt+Ijt9fXM6NzY6IjxzY3JpcHQ+ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmlubmVySFRNTCA9IHVuZXNjYXBlKCclM2MlNzQlNjklNzQlNmMlNjUlM2UiO2E6Mjp7aTowO3M6MzE6ImluamVjdGVkLmpzX2NyZWF0ZV9kb2N1bWVudC4wMTciO2k6MTtzOjExOToifjxzY3JpcHQ+ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmlubmVySFRNTCA9IHVuZXNjYXBlXCgnJTNjJTc0JTY5JTc0JTZjJTY1JTNlJTQ4JTYxJTYzJTZiJTY1JTY0JTIwJTYyJVteO10rOzwuc2NyaXB0Pn4iO31zOjI4OiI8c2NyaXB0PmRvY3VtZW50LmxvY2F0aW9uPSgiIjthOjE6e2k6MDtzOjMxOiJpbmplY3RlZC5qc19jcmVhdGVfZG9jdW1lbnQuMDE1Ijt9czo1OToiZ2V0Q29va2llKGUpe3ZhciBVPWRvY3VtZW50LmNvb2tpZS5tYXRjaChuZXcgUmVnRXhwKCIoPzpefDsiO2E6Mjp7aTowO3M6Mjk6ImluamVjdGVkLmpzX2Nvb2tpZV9oaWphY2suMDAyIjtpOjE7czoyMzM6In48c2NyaXB0W14+XSs+XHMqZnVuY3Rpb25ccypnZXRDb29raWVcKFteXD9dK1w/OlxeXHw7W146XSs6dm9pZFxzKlxkXH12YXJccypzcmM9LmRhdGE6dGV4dC5qYXZhc2NyaXB0O1xzKmJhc2U2NFwsXHcrPS4sbm93PU1hdGguXHMqZmxvb3JbXj5dKz49XCh0aW1lPWNvb2tpZVwpXHxcfHZvaWRbXlx7XStce3ZhclxzKnRpbWVbXjxdKzxzY3JpcHRccypzcmM9Li5cK3NyY1wrW15cfV0rXH1ccyo8LnNjcmlwdD5+Ijt9czo0MToiYW5kcm9pZHxiYlxkK3xtZWVnbykuK21vYmlsZXxhdmFudGdvfGJhZGEiO2E6Mjp7aTowO3M6MjQ6ImluamVjdGVkLmpzX3JlZGlyZWN0LjAwNiI7aToxO3M6MTk4OiJ+aWZcKGRvY3VtZW50LmNvb2tpZS5pbmRleE9mXCgiX21hdXRodG9rZW4iXCk9PS0xW14iXSsiZ29vZ2xlYm90IlteXHxdK1x8YmIuZFwrLm1lZWdvXClcLi5tb2JpbGVbXlw9XSs9XHMqbmV3XHMqRGF0ZVteO10rO1xzKmRvY3VtZW50LmNvb2tpZVteO10rO1xzKnBhdGg9Li5leHBpcmVzPSJbXiddKydodHRwOi4uW15cP10rXD9cdytcJidcKTtcfX4iO31zOjY1OiJkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuaW5uZXJIVE1MID0gdW5lc2NhcGUoJyU0OCU2MSU2MyU2YiU2NSU2NCI7YToyOntpOjA7czoyMToiZGVmYWNlZC5oYWNrZWRfYnkuMDExIjtpOjE7czoxMDg6In48c2NyaXB0PmRvY3VtZW50XC5kb2N1bWVudEVsZW1lbnRcLmlubmVySFRNTFxzKlw9XHMqdW5lc2NhcGVcKC4oJVxkK1xzKik/JTYxJTYzJTZiJTY1JTY0W15cKV0rXCk7PC5zY3JpcHQ+fiI7fXM6NTI6InZhciB0cnlyZXBsYWNlc2hpdD1mdW5jdGlvbiB0cnlyZXBsYWNlc2hpdCh4KXtyZXR1cm4iO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDg3IjtpOjE7czoxODA6In5cKGZ1bmN0aW9uXChcKVx7dHJ5XHtkb2N1bWVudFwuZ2V0RWxlbWVudEJ5SWRcKFteXCldK1wpXC5yZW1vdmVcKFwpXH1bXHNdKmNhdGNoW15cfV0rXH1bXHNdKnZhcltcc10qZGVidWdbXjtdKztbXHNdKnZhciB0cnlyZXBsYWNlc2hpdFteJV0rJVwoXFswLTlbXlwrXStcK2V4ZGF5c1teXH1dK1x9XH1cKVwoXCk7fiI7fXM6NjU6IkNvb2tpZS5zZXQgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSwgZXhwaXJlcywgcGF0aCwgZG9tYWluLCBzZWN1cmUpIjthOjI6e2k6MDtzOjIyOiJpbmplY3RlZC5qc19pZnJhbWUuMDAyIjtpOjE7czoyNTE6In48ZGl2W1xzXSppZFtePl0rPjwuZGl2Pltcc10qPHNjcmlwdFtePl0rPltcc10qdmFyIENvb2tpZVtcc10qPVtcc10qbmV3IE9iamVjdFwoXCk7W1xzXSpDb29raWVcLnNldFtcc10qPVtcc10qZnVuY3Rpb25cKG5hbWUsIHZhbHVlLCBleHBpcmVzLCBwYXRoLCBkb21haW4sIHNlY3VyZVwpW1xzXSpce1tcc10qZG9jdW1lbnRcLmNvb2tpZVtePF0rPGlmcmFtZVteXH1dK0Nvb2tpZVwuc2V0W147XStcKTtbXHNdKlx9W1xzXSo8LnNjcmlwdD5+Ijt9czoyOToidmFyIGNyYXdsZXJBZ2VudFJlZ2V4ID0gL2JvdHwiO2E6Mjp7aTowO3M6MjQ6ImluamVjdGVkLmpzX3JlZGlyZWN0LjAzNiI7aToxO3M6MTMwOiJ+dmFyW1xzXSpjcmF3bGVyQWdlbnRSZWdleFtcc10qPVtcc10qLmJvdFteO10rO1tcc10qaWZbXHNdKlwoY3Jhd2xlckFnZW50UmVnZXhcLnRlc3RcKG5hdmlnYXRvcltePF0rXC5sb2NhdGlvbltcc10qPVteXH1dK1tcc1x9XSt+Ijt9czo1MzoiJnV0bXA9IituKyImY29va2llPSIraigiU0VTU0lJRCIpKSxjb25zb2xlLmNsZWFyKCl9fX0iO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMTIwIjtpOjE7czoxMjg6In5mdW5jdGlvbiBbXHddK1woW1x3XStcKVx7W1xzXSp2YXIgW1x3XStbXHNdKj1bXHNdKiJbXiJdKyJbXHNdKlwrW1xzXSpkb2N1bWVudFwuY29va2llW14jXSsmIzEwNFtePF0rY29uc29sZVwuY2xlYXJcKFwpW1x9XCk7XSt+Ijt9czo0MDoiaSsrKXN0cis9cmV0W2hlYWRbaV0tcmVzcG9uc2VdO3N0cj1hdG9iKCI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4xMjYiO2k6MTtzOjExMDoifnZhciBoZWFkW1xzXSo9XFtbXlxdXXsxMDAwLH1cXTtbXHNdKnZhciByZXRbXHNdKj1bXHNdKi4uLFtcc10qbGVuW15cfV0rXH1bXHNdKnJldFwrPWxlblteXH1dK3N0clwpO1x9Oz9bXHNdKn4iO31zOjE0OiJhZnUucGhwP3pvbmVpZCI7YToyOntpOjA7aToxMDtzOjMyOiJzZGsub25Ob3RpZmljYXRpb25VbnN1cHBvcnRlZCgoKSI7YToyOntpOjA7czozMToiaW5qZWN0ZWQuanNfdW53YW50ZWRfYWRzLjAxNi4wMiI7aToxO2k6MTE7fX1zOjM3OiJtLmpzP2Q9M1wiOyBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkIjthOjI6e2k6MDtzOjQzOiJpbmplY3RlZC5zZXJpYWxpemF0aW9uLnNjcmlwdF9pbmplY3Rpb24uMDAxIjtpOjE7aToxMTt9czo2MDoiZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEsIGNoZWNrYm94IjthOjI6e2k6MDtzOjMxOiJpbmplY3RlZC5qc19jcmVhdGVfZG9jdW1lbnQuMDE0IjtpOjE7aToxMTt9czo0ODoiZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmlubmVySFRNTCA9IHVuZXNjYXBlKCclIjthOjI6e2k6MDtzOjMxOiJpbmplY3RlZC5qc19jcmVhdGVfZG9jdW1lbnQuMDE2IjtpOjE7aToxMTt9czozNzoiZG9jdW1lbnQubG9jYXRpb249Imh0dHA6Ly9pbGhhYmVsZW5zZSI7YToyOntpOjA7czozMzoiaW5qZWN0ZWQuanNfZG9jdW1lbnRfbG9jYXRpb24uMDAxIjtpOjE7aToxMTt9fXM6ODoiY2hlY2tvdXQiO2E6MTY6e2k6MDtpOjEwO3M6NDU6ImRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJkZXZ0b29sc2NoYW5nZSI7YTozOntpOjA7aToxMDtzOjQyOiIpKyI/aW1hZ2VfaWQ9IitCYXNlNjRGdW5jdGlvbl9EU0hBVUpOS0FTRCgiO2E6Mjp7aTowO2k6MTA7czo3MToiKXtyZXR1cm4gYnRvYShlbmNvZGVVUklDb21wb25lbnQoZSkucmVwbGFjZSgvJShbMC05QS1GXXsyfSkvZyxmdW5jdGlvbigiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDc2IjtpOjE7czozOTc6In52YXIgW1x3XSs9IihpZHxuYW1lKSIsW1x3XSs9IihpZHxuYW1lKSIsW1x3XSs9W1xzXSpuZXdbXHNdKlJlZ0V4cFwoYXRvYlwoW14pXStcKSssW1xzXSpbXHddK1tcc10qPVtcc10qbmV3IFJlZ0V4cFwoYXRvYlwoW14pXStcKSssW1x3XSs9XHtcfVteO10rO1tcc10qZnVuY3Rpb25bXlx7XStce1tcc10qcmV0dXJuW1xzXSpidG9hXChlbmNvZGVVUklDb21wb25lbnRbXj5dK1wpXCsiXD9pbWFnZV9pZD0iXCtCYXNlNjRGdW5jdGlvbl9EU0hBVUpOS0FTRFwoW14+XStpbm5lcldpZHRoW1xzXSo+W1xzXSp0aHJlc2hvbGRbXlx9XStcKVtcc10qXH0sW1xzXSpbXGRdK1wpLFtcc10qInVuZGVmaW5lZFteO10rc2V0SW50ZXJ2YWxcKGZ1bmN0aW9uXChcKVx7W1x3XStcKFwpXH0sW1xzXSpbXGRdK1wpO34iO319czo0ODoib3BlbiYmL2NoZWNrb3V0Ly50ZXN0KHdpbmRvdy5sb2NhdGlvbikmJihvQ2FudmFzIjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjExMiI7aToxO3M6MTE1OiJ+dmFyIG9DYW52YXM7W1xzXSpcKGZ1bmN0aW9uXChcKVtcc10qXHtbXHNdKnZhcltcc10qW1x3XStbXHNdKj1bXHNdKlx7W1xzXSpvcGVuOlteXG5dK2F0b2JcKFteXH1dK3RoaXNbXClcfV0rXChcKTt+Ijt9fXM6MjI6ImltZy5zcmMgPSB3aW5kb3cuYXRvYigiO2E6Mjp7aTowO2k6MTA7czo1OiJkYXRhPSI7YToyOntpOjA7aToxMDtzOjQ6ImxvYz0iO2E6Mjp7aTowO2k6MTA7czoyOToiKyB3aW5kb3cuYnRvYShsb2NhdGlvbi5ocmVmKTsiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDYyIjtpOjE7czo0NDc6In52YXIgX19kYXRhW1xkXStbXHNdKj1bXHNdKlteXHtdK2Z1bmN0aW9uIF9fcHJlbG9hZFwoXClbXHNdKlx7W1xzXSpzZXRUaW1lb3V0XChfX2xvYWQsW1xzXSpbXGRdK1wpO1tcc10qXH1bXHNdKmZ1bmN0aW9uIF9fbG9hZFwoXClbXHNdKlx7W1xzXSpzZXRJbnRlcnZhbFwoZ2V0RGF0YSxbXHNdKltcZF0rXCk7W1xzXSpcfVtcc10qZnVuY3Rpb24gZ2V0RGF0YVwoXClbXHNdKlx7W159XStcfVtcc10qX19kYXRhW1xkXStbXHNdKj1bXHNdKmRhdGE7W1xzXSpcfVtcc10qcmV0dXJuO1tcc10qXH1bXHNdKmZ1bmN0aW9uIF9fc2VuZFwoc3RyXClbXHNdKlx7W1xzXSppZltcc10qXCghLmNoZWNrb3V0W15fXStmdW5jdGlvbiBfX2lzVmFsaWRbXl9dK2Z1bmN0aW9uIF9fb251bmxvYWRbXl9dK2NvbnRlbnRMb2FkZWRcKHdpbmRvdyxbXHNdKl9fbG9hZFwpO1tcc10qX19vbnVubG9hZFwoXCk7fiI7fX19fXM6MTA6Ii5pbm5lckhUTUwiO2E6Mjp7aTowO2k6MTA7czoyMDoiZnVuY3Rpb24gaW5zZXJ0QWZ0ZXIiO2E6Mjp7aTowO2k6MTA7czoyNDoiQ2FyZCBWZXJpZmljYXRpb24gTnVtYmVyIjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjA4MiI7aToxO3M6Mjc4OiJ+ZnVuY3Rpb24gX2NoZWNrX3BcKFwpW1xzXSpce1tePF0rdHRcLmlubmVySFRNTFtcc10qPVteXH1dK3N0eWxlXC5kaXNwbGF5W1xzXSo9W1xzXSoubm9uZS47W15cfV0rW1xzXH1dK2lmW15cfV0rW1xzXH1dK3NldFRpbWVvdXRcKFtcc10qX2NoZWNrX3BbXjtdK1wpO1tcc10qXH1bXHNdKl9jaGVja19wXChcKTtbXHNdKmZ1bmN0aW9uIGluc2VydEFmdGVyW15cfV0rXH1bXHNdKihmdW5jdGlvbiBfcmVtb1woXClbXlx9XStcfVtcc10qc2V0VGltZW91dFteO10rO1tcc10qXH1bXHNdKik/fiI7fX19czoxOToiLnBocCIsYnVpbGREYXRhKCkpOyI7YToyOntpOjA7aToxMDtzOjU0OiJ2YXIgZm9ybSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjby1iaWxsaW5nLWZvcm0iKTsiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDY3IjtpOjE7czoyMTY6In5mdW5jdGlvbltcc10qYjY0RW5jb2RlVW5pY29kZVwoc3RyXClbXHNdKlx7W1xzXSpyZXR1cm4gYnRvYVtePF0rZnVuY3Rpb24gZ2V0QmlsbGluZ1woXClbXj5dK2lmW1xzXSpcKHBheW1lbnRbXHNdKiYmW1xzXSpwYXltZW50XC52YWx1ZVtcc10qIT1bXlx7XStce1tcc10qc2VuZFBvc3RbXjtdK2J1aWxkRGF0YVwoXClcKTtbXlx9XStbXHNcfV0rZWxzZVteXH1dK1tcc1x9XSs7fiI7fX1zOjE0OiJYTUxIdHRwUmVxdWVzdCI7YToyOntpOjA7aToxMDtzOjk6InBhcnNlSW50KCI7YToyOntpOjA7aToxMDtzOjEyOiJmdW5jdGlvbihfMHgiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMTY2IjtpOjE7aToxMTt9fX1zOjM3OiJqYXZhc2NyaXB0IiBpZD0ibWFnX2dvb2dsZV9hbmFseXRpY3MiIjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjAxMiI7aToxO3M6Mjc2OiJ+PHNjcmlwdFxzdHlwZS4udGV4dC5qYXZhc2NyaXB0LlxzaWQ9Lm1hZ19nb29nbGVfYW5hbHl0aWNzLj5pZlxzXChcKG5ld1xzUmVnRXhwLi5vbmVwYWdlLmNoZWNrb3V0Lm9uZXN0ZS5bXlx7XStce1xzKmRvY3VtZW50LndyaXRlXCguLngzQ3NjcmlwdFxzc3JjLi5odHRwW146XSs6Li5bXlwuXStcLlteXC5dK1wuanMiXHNhc3luYz1bXj5dKz4ueDNDLnNjcmlwdD4uXCk7XHMqXH1cc1woZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZFwoLm1hZ19nb29nbGVbXjtdKztcczwuc2NyaXB0Ln4iO31zOjQwOiJpZigobmV3IFJlZ0V4cCgnb25lcGFnZXxjaGVja291dHxvbmVzdGVwIjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjAyOCI7aToxO3M6Nzc0OiJ+XDxzY3JpcHRccyp0eXBlXD0udGV4dFwvamF2YXNjcmlwdC5cPlxzKlw8XCFcLVwtXHMqdmFyXHMqXHcrXD1ce1xzKlx3K1w6bnVsbFwsXHMqXHcrXDouXGIoaHR0cHN8aHR0cClcYlw6XC9cL1x3K1wuXHcrXC9cdytbKD86XHdcL1x3XC9cd1wvXHdcLlx3KV0rLlwsXHMqbXlpZFw6XChmdW5jdGlvblwoXHcrXClce1xzKnZhclxzKm1hdGNoZXNcPWRvY3VtZW50XC5jb29raWVcLm1hdGNoW15cK10rXCtuYW1lXC5yZXBsYWNlXChbXj1dK1w9W14nXSsnXClcKVw7W15cfF0rXHxcfFwoZnVuY3Rpb25cKFwpXHtccyp2YXJccypcdytcPW5ld1xzKkRhdGVcKFwpXDtbXn1dK1x9XClcKFwpXCxccypjbGtcOmZ1bmN0aW9uXChcKVx7W15cOl0rXDpmdW5jdGlvblwoXClce1xzKnRyeVx7W15cfV0rXH1lbHNlXHtccypiXC5hdHRhY2hFdmVudFwoLm9uY2xpY2suXCxbXlx9XStcfVxzKlx9XHMqXH1ccyp2YXJccypcdytcPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGxbXlwhXStcIVw9bnVsbFwpXHtccyp2YXJccypcdytcPVteXDtdK1w7XHMqdmFyXHMqXHcrXD1idG9hW15cO10rXDtccyp2YXJccypodHRwXD1uZXdccypYTUxIdHRwUmVxdWVzdFwoXClcO1xzKmh0dHBcLm9wZW5cKC5QT1NULlteXDtdK1w7XHMqaHR0cFwuc2V0UmVxdWVzdEhlYWRlclwoW15cO10rXDtccypodHRwXC5zZW5kXChbXlw7XStcO1xzKlx9W15cfV0rXH1bXiddKy5vbmVwYWdlXHxjaGVja291dFx8b25lc3RlcC5cLC5naS5cKVwpW15cO10rXDtccypcfVxzKlwtXC1cPlxzKlw8XC9zY3JpcHRcPn4iO31zOjQxOiJpZighKGRvY3VtZW50LmNvb2tpZS5pbmRleE9mKCJ1c2VycGF5aWQiKSI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wNDgiO2k6MTtzOjczOToifjxccypzY3JpcFtePl0rPlxzKmpbUXFddWVyeVxzKlwoKD86InwnKT9kb2N1bWVudCg/OiJ8Jyk/XHMqXClccypcLnJlYWR5XHMqXChmdW5jdGlvblxzKlwoXHMqXClccyp7XHMqaWZccypcKFxzKlwhXHMqXChccypkb2N1bWVudFwuY29va2llXC5pbmRleE9mXCgoPzoifCcpP3VzZXJwYXlpZCg/OiJ8Jyk/XHMqXClccypcK1xzKlxkK1xzKlwpXHMqXClccyp7XHMqalF1ZXJ5XChbXlxbXStcW1xzKm9uY2xpY2soPzpcXik/XHMqPVxzKlxcLig/OnNoaXBwaW5nfGNoZWNrb3V0fHBheW1lbnR8Y3Z2fG9yZGVyKT9bXn1dK31ccyp9XHMqXClccyo7XHMqZnVuY3Rpb25ccypcdytcKFxzKlwpXHMqe1xzKmlmXHMqXChcIVwoZG9jdW1lbnRcLmNvb2tpZVwuaW5kZXhPZlwoLnVzZXJwYXlpZC5cKVxzKlwrXHMqXGQrXClccypcKVxzKntccyp2YXJccypcdytccyo9XHMqZnVuY3Rpb25ccypcKFwpXHMqe1xzKltefV0rfVxzKjtccypkb2N1bWVudFwuY29va2llXHMqPVxzKi51c2VycGF5aWQ9LlxzKlwrXHMqcmFuZFxzKlwoXClccyo7XHMqdmFyXHMqXHcrXHMqPVxzKntccyoubG9jYXRpb24uXHMqLlxzKi5odHRwOlwvXC8uXHMqXCtccypsb2NhdGlvblwuaG9zdFxzKixccyoubWV0aG9kLlxzKjpccyouW1BwXWF5W1BwXWFsLlxzKn1ccyo7XHMqalF1ZXJ5XChsb2NhdGlvblwpXC5hdHRyXCguaHJlZi5ccyosXHMqYXRvYlxzKlwoW15cKV0rXClccypcK1xzKmJ0b2FcKFtefV0rfVxzKn1ccyo8XC9zY3JpcHQ+fiI7fXM6MzY6Imh0bWwoIiYjMTA0OyYjMTE2OyYjMTE2OyYjMTEyOyYjMTE1OyI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQuZmFrZV9qcXVlcnkuMDA4IjtpOjE7czoxMzk6In48c2NyaXB0IHR5cGU9InRleHQuamF2YXNjcmlwdC4+alF1ZXJ5LmZ1bmN0aW9uW14mXSt3aW5kb3cubG9jYXRpb24uaHJlZiwuLm1hdGNoLi5vbmVwYWdlLmNoZWNrb3V0W14+XSs+Li4uaHRtbC4uKCYjW1xkXSs7KStbXjxdKzwuc2NyaXB0Pn4iO31zOjg6ImdyZWxvc192IjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjAwNSI7aToxO3M6MTI0OiJ+PHNjcmlwdCB0eXBlPSJ0ZXh0LmphdmFzY3JpcHRbXkBdK3ZhciBncmVsb3NfdlteQF0raWZcKFwobmV3IFJlZ0V4cFwoLm9uZXBhZ2VcfGNoZWNrb3V0XHxvbmVzdGVwW15cfV0rXH1ccyotLT5ccyo8LnNjcmlwdD5+Ijt9czo1MToiKSkudGVzdCh3aW5kb3cubG9jYXRpb24pKXsgalF1ZXJ5LmFqYXgoeyB1cmw6ICJodHRwIjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjExMCI7aToxO3M6NzA6In5pZiBcKFwobmV3IFJlZ0V4cFwoLlteXCldKmNoZWNrb3V0W15cfV0rXH0sW1xzXSphc3luY1teXH1dK1tcfVwpXHNdK34iO31zOjE2Nzoib25lcGFnZXxjaGVja291dC9naSkmJih0KCJpbnB1dCwgc2VsZWN0IikuZWFjaChmdW5jdGlvbigpe3QodGhpcykudmFsKCk/cSs9IiYiK3QodGhpcykuYXR0cigibmFtZSIpKyI9Iit0KHRoaXMpLnZhbCgpOiIifSksdC5wb3N0KHQoIjxkaXYgLz4iKS5odG1sKCImIzEwNDsmIzExNjsmIzExNjsiO2E6MTp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDIyIjt9czozMDoibmV3IFJlZ0V4cCgiY2hlY2tvdXQiKS50ZXN0KG4pIjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjAyOSI7aToxO2k6MTE7fXM6MzU6In5zdGVwIGNoZWNrb3V0W1xzXXs1MCx9PHNjcmlwdCBzcmN+IjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjA4MyI7aToxO2k6MTE7fXM6MjQ6Im9uZXBhZ2V8Y2hlY2tvdXR8b25lc3RlcCI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wOTciO2k6MTtpOjExO319czoyOiJceCI7YToxMTp7aTowO2k6MTA7czoxMDoid2luZG93W18weCI7YTo0OntpOjA7aToxMDtzOjE2OiJ9KShuYXZpZ2F0b3JbXzB4IjthOjI6e2k6MDtpOjEwO3M6Njc6IiJceDc0XHg2NVx4NzNceDc0IiwiXHg3M1x4NzVceDYyXHg3M1x4NzRceDcyIiwiXHg2N1x4NjVceDc0XHg1NFx4NjkiO2E6Mjp7aTowO3M6MjQ6ImluamVjdGVkLmpzX3JlZGlyZWN0LjAyMiI7aToxO3M6ODc6In52YXIgXzB4W1x3XStbXHNdKj1bXHNdKlxbLi54Li4ueC4uLng2MS54NzUueDc0Lng2OFtePF0rXHxcfFtcc10qd2luZG93XFtfMHhbXlx9XStcKVx9fiI7fX1zOjE5OiJdKTtpZighZG9jdW1lbnRbXzB4IjthOjI6e2k6MDtpOjEwO3M6MzE6Ijt2YXIgbj0wO2Z1bmN0aW9uIGJvbSgpe3ZhciBfMHgiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDg5IjtpOjE7czo3NzoifnZhciBfMHhbXHddKz1cW1teO10rXF07W15ce10rZnVuY3Rpb24gYm9tXChcKVteXG5dK3NldEludGVydmFsXChib20sW1xkXStcKX4iO319czo4MToieDVGXFx4NjNcXHg2M1xceDVGXFx4NkZcXHg3N1xceDZFXFx4NjVcXHg3MlwiLFwiXFx4NDVcXHg3MlxceDcyXFx4NkZcXHg3MlxceDIwXCIsIjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjEwMyI7aToxO3M6MTgwOiJ+dmFyIChbXHddKyxbXHNdKil7MjAsfVtcd10rO1tcc10qXChmdW5jdGlvblwoXClbXHNdKlx7W1xzXSp2YXIgW1x3XStbXHNdKj1bXHNdKlxbW15cXV17MTAwMCx9XF07W1xzXSpmdW5jdGlvbiBbXHddK1woW1x3XStcKVtcc10qXHtbXlxuXStzZXRUaW1lb3V0XChbXHddKyxbXHNdKltcZF0rW1wpXH1dK1woXCk7P34iO319czo1OiIuPSJceCI7YToyOntpOjA7aToxMDtzOjQ6Iik7QCQiO2E6Mjp7aTowO2k6MTA7czoyNDoiKTt9O2lmKGZ1bmN0aW9uX2V4aXN0cygkIjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjE0MiI7aToxO3M6MTEyOiJ+KFwkW1x3XStcLj89IlteIl0rIjtbXHNdKil7Myx9W15cfV0rXH1lbHNlXHtbXlx9XStcfTtpZlwoZnVuY3Rpb25fZXhpc3RzW149XSs9QFwkW15cfV0rXH1lbHNlXHtbXlx9XSs7XH07W1xzXSp+Ijt9fX1zOjk4OiJceDZFXHg3NVx4NkNceDZDIiwiXHg3M1x4NjNceDcyXHg2OVx4NzBceDc0IiwiXHg2M1x4NzJceDY1XHg2MVx4NzRceDY1XHg0NVx4NkNceDY1XHg2RFx4NjVceDZFXHg3NCI7YToyOntpOjA7czozMDoiaW5qZWN0ZWQuanNfY3JlYXRlX2VsZW1lbnQuMDA1IjtpOjE7czoyNTg6In48c2NyaXBbXj5dKz5ccyp2YXJccyooXHcrKVxzKj1ccypcW1teXDJdK3g0Ny54NDUueDU0W15cMl0reDY4Lng3NC54NzQueDcwW147XSs7XHMqZnVuY3Rpb25ccypcdytcKChcdyspXClccyp7XHMqdmFyXHMqKFx3Kylccyo9XHMqbmV3XHMqWE1MSHR0cFJlcXVlc3RcKFwpXHMqO1xzKlwzXHMqXFtcMVxbXGQrXF1cXVtee10re1xzKlwoXHMqZnVuY3Rpb25cKFwpXHMqe1xzKnZhclxzKltefV0rfVxzKlwpXHMqXChccypcKVxzKn1ccyo8XC9zY3JpcHQ+fiI7fXM6MTE5OiJydD1bIlx4NkZceDZFXHg2Q1x4NkZceDYxXHg2NCIsIlx4NkNceDZGXHg2M1x4NjFceDc0XHg2OVx4NkZceDZFIiwiXHg3NFx4NjVceDczXHg3NCIsIlx4NjNceDY4XHg2NVx4NjNceDZCXHg2Rlx4NzVceDc0IiI7YToxOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wMjEiO31zOjEwMjoiLCJceDY4XHg3NFx4NzRceDcwXHgzQVx4MkZceDJGXHg2Q1x4NkZceDYxXHg2NFx4MkRceDZEXHg2NVx4MkVceDYzXHg2OFx4NjlceDYzXHg2Qlx4NjVceDZFXHg2Qlx4NjlceDZDIjthOjE6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjAyMyI7fXM6NDE2OiJceDJFXHg3MFx4NjhceDcwIiwiXHg1MFx4NEZceDUzXHg1NCIsIlx4NjZceDZGXHg3Mlx4NkQiLCJceDczXHg2NVx4NzJceDY5XHg2MVx4NkNceDY5XHg3QVx4NjUiLCJceDYxXHg2QVx4NjFceDc4IiwiXHg2MVx4NjRceDY0XHg0NVx4NzZceDY1XHg2RVx4NzRceDRDXHg2OVx4NzNceDc0XHg2NVx4NkVceDY1XHg3MiIsIlx4NUJceDZGXHg2RVx4NjNceDZDXHg2OVx4NjNceDZCXHgzRFx4MjdceDYyXHg2OVx4NkNceDZDXHg2OVx4NkVceDY3XHgyRVx4NzNceDYxXHg3Nlx4NjVceDI4XHgyOVx4MjdceDVEIiwiXHg2M1x4NjhceDY1XHg2M1x4NkJceDZGXHg3NVx4NzRceDJEXHg3M1x4NzRceDY1XHg3MFx4MkRceDYyXHg2OVx4NkNceDZDXHg2OVx4NkVceDY3IiwiXHg2N1x4NjVceDc0XHg0NVx4NkNceDY1XHg2RFx4NjVceDZFXHg3NCI7YToxOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wMjQiO31zOjYwOiJceDc3XHg3OFx4NzlceDdhXHgzMFx4MzFceDMyXHgzM1x4MzRceDM1XHgzNlx4MzdceDM4XHgzOVx4MmIiO2E6MTp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDI1Ijt9czo1NDoiPHNjcmlwdD4gdmFyIF8weGVjNTU9WyJceDQ3XHg0NVx4NTQiLCJceDZGXHg3MFx4NjVceDZFIjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjAzMSI7aToxO3M6MTE3OiJ+PHNjcmlwdD5ccyp2YXJccypfMHhbXj1dKz1cWy4ueDQ3Lng0NS54NTQuLC4ueDZGLng3MC54NjVbXlxbXStcW18weFteXD9dK1w/XzB4W146XSs6YmxfcmF3XH12YXJccypfMHhbXjxdKzwuc2NyaXB0Pn4iO31zOjI1OiJmdW5jdGlvbigpe20rKzt6KCl9O2JbIlx4IjthOjI6e2k6MDtzOjMxOiJpbmplY3RlZC5qc19jcmVhdGVfZnVuY3Rpb24uMDEyIjtpOjE7aToxMTt9czo0MToiQ1E5am5VTnREVElscHo5bEszV3lwVDlscVR5aE1sdVNLMElGSHg5RlgiO2E6Mjp7aTowO3M6MTg6ImJhY2tkb29yLnNoZWxsLjAwNyI7aToxO3M6MTM5OiJ+XCRwYXNzd29yZFtcc10qPVteO10rO1tcc10qZGVmaW5lLi5WRVJTSU9OW147XStbXlwoXStcKFtcc10qYXJyYXlbXHNdKlwoW1xzXSpbXjtdezUwMDAsfVteXCldK1wpW1xzXSo7W15cKV0rXClbXHNdKjtbXHNdKihcL1wqW1x3XStcKlwvKSp+Ijt9fXM6NDoibm9uZSI7YToxMDp7aTowO2k6MTA7czoxNDoicmV0dXJuICJub25lIjsiO2E6Mjp7aTowO2k6MTA7czozMToieyByZXR1cm4gIm5vbmUiOyB9IGZ1bmN0aW9uIGVuZCI7YTozOntpOjA7aToxMDtzOjQ6Il8oKTsiO2E6Mjp7aTowO2k6MTA7czozOiJlbmQiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLmhpZGRlbi1kaXYuMDM1LjAyIjtpOjE7czo1MToifjxzY3JpcHRbXj5dKz5bXHNdKmVuZChbXGRdKyk/X1woXCk7W1xzXSo8LnNjcmlwdD5+Ijt9fXM6Mjc6Iikuc3R5bGUuZGlzcGxheSA9IGdldF9zdHlsZSI7YToyOntpOjA7czoyMzoiaW5qZWN0ZWQuaGlkZGVuLWRpdi4wMzUiO2k6MTtzOjIwMzoifmZ1bmN0aW9uIGdldF9zdHlsZShbXGRdKyk/W1xzXSpcKFwpW1xzXSpce1tcc10qcmV0dXJuICJub25lIjtbXHNdKlx9W1xzXSpmdW5jdGlvbiBlbmQoW1xkXSspP19bXHNdKlwoXClbXHNdKlx7W1xzXSpkb2N1bWVudFwuZ2V0RWxlbWVudEJ5SWRcKC4oW1x3XSspLlwpXC5zdHlsZVwuZGlzcGxheVtcc10qPVtcc10qZ2V0X3N0eWxlW15cfV0rXH1bXHNdKn4iO319fXM6MTg6ImhpZGRlbjsiIHNyYz0iaHR0cCI7YToyOntpOjA7aToxMDtzOjEyOiJtZXRyaWMvP21pZD0iO2E6Mjp7aTowO3M6MTc6ImluamVjdGVkLmxua3IuMDA0IjtpOjE7czoxNjM6In4oPzo8aW1nIHN0eWxlPSJ3aWR0aDpccyowO1xzKmhlaWdodDpccyowO1xzKmRpc3BsYXk6XHMqbm9uZTtccyp2aXNpYmlsaXR5OlxzKmhpZGRlbjsiIHNyYz0iaHR0cHM/OlwvXC9bXlwvXStcL21ldHJpY1wvXD9taWQ9XHcqJmFtcDt3aWQ9W14iPl0rJmFtcDt0PVxkKyJbXj5dKj4pK34iO319czo2OiI+enA4NDkiO2E6Mjp7aTowO3M6MjM6ImluamVjdGVkLmhpZGRlbi1kaXYuMDAzIjtpOjE7czo2NjoifjxkaXYgc3R5bGU9ImRpc3BsYXk6XHMqP25vbmUiPjxhIGhyZWY9W14+XSs/PltePF0rPzxcL2E+PFwvZGl2Pn5pIjt9czozMjoiLS0+PGEgc3R5bGU9ImRpc3BsYXk6bm9uZTsiIGhyZWYiO2E6Mjp7aTowO3M6MjM6ImluamVjdGVkLmhpZGRlbi1kaXYuMDA1IjtpOjE7czo2OToifjxcIS0tKFx3ezIzfSktLT48YSBzdHlsZT0iZGlzcGxheTpub25lOyIgaHJlZj0iLis/PFwvYT48XCEtLVwvXDEtLT5+Ijt9czoxMToiPC9hPjwhLS0vNTUiO2E6Mjp7aTowO3M6MjM6ImluamVjdGVkLmhpZGRlbi1kaXYuMDA2IjtpOjE7czo4MjoifjxcIS0tNTVcd3sxNSx9LS0+PGFccypzdHlsZT0uZGlzcGxheTpub25lOy5ccypocmVmPS5bXjxdKzwvYT48XCEtLS41NVx3ezE1LH0tLT5+cyI7fXM6NDU6IiIgc3R5bGU9InRleHQtZGVjb3JhdGlvbjpub25lO2NvbG9yOiM2NzZjNmMiPiI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQuaGlkZGVuX2EtaHJlZi4wMDEiO2k6MTtzOjc4OiJ+PGEgaHJlZj0iaHR0cDouLlteIl0rIiBzdHlsZT0idGV4dC1kZWNvcmF0aW9uOm5vbmU7Y29sb3I6IzY3NmM2YyI+W148XSs/PC5hPn4iO31zOjY6Ij4uPC9hPiI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQuaGlkZGVuX2EtaHJlZi4wMDIiO2k6MTtzOjY1OiJ+PGEgc3R5bGU9Lj8idGV4dC1kZWNvcmF0aW9uOltcc10qbm9uZS4/IiBocmVmPS4/IlwvW14+XSs+XC48LmE+fiI7fXM6Mzc6Ij4gZG9mb2xsb3cgeyBkaXNwbGF5OiBub25lOyB9PC9zdHlsZT4iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLmhpZGRlbl9hLWhyZWYuMDA0IjtpOjE7czo5NToifjxzdHlsZSB0eXBlPVxXK3RleHQuY3NzXFcrPiBkb2ZvbGxvdyBceyBkaXNwbGF5OiBub25lOyBcfTwuc3R5bGU+PGRvZm9sbG93PlteXH1dKzxcL2RvZm9sbG93Pn4iO31zOjQyOiI8L2E+PC9kaXY+PHNjcmlwdD5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiO2E6Mjp7aTowO2k6MTA7czozMjoiKS5zdHlsZS5kaXNwbGF5PSJub25lIjs8L3NjcmlwdD4iO2E6Mjp7aTowO2k6MTA7czo1MjoiKS5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4iO2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCI7YToyOntpOjA7czoyMzoiaW5qZWN0ZWQuaGlkZGVuLWRpdi4wMzkiO2k6MTtpOjExO319fX1zOjEzOiJiYXNlNjRfZGVjb2RlIjthOjg6e2k6MDtpOjEwO3M6NDoiZXZhbCI7YToyOntpOjA7aToxMDtzOjE5OiJldmFsKGJhc2U2NF9kZWNvZGUoIjthOjM6e2k6MDtpOjEwO3M6Mjc6IkBldmFsKGJhc2U2NF9kZWNvZGUoJF9QT1NUWyI7YToyOntpOjA7czoyNDoiYmFja2Rvb3IuZXZhbF9iYXNlNjQuMDE3IjtpOjE7czoxOTU6In5cJChcdyspXHMqPVxzKidcdysnO1xzKmlmXChpc3NldFwoXCRfUE9TVFxbXHcrXF1cKVwpXHtpZlxzKlwobWQ1XChcJF9QT1NUXFsuXDEuXF1cKVxzKj09PVxzKlwkXDFcKVxzKkBldmFsXChiYXNlNjRfZGVjb2RlXChcJF9QT1NUXFtcdytcXVwpXCk7ZXhpdDtcfWlmXChpc3NldFwoXCRfR0VUXFtcdytcXVwpXClce3BocGluZm9cKFwpO1x9fiI7fXM6Mjk6ImV2YWwoYmFzZTY0X2RlY29kZSgkYzU1Mzc1ZGJhIjthOjI6e2k6MDtzOjI0OiJiYWNrZG9vci5ldmFsX2Jhc2U2NC4wMTUiO2k6MTtzOjIxOToiflwvXCo8XCFET0NUWVBFXHMqaHRtbFtePl0rPlxzKjEwNTFiZWZlM2ZlNmI0MDVjNjlbXlwqXStcKlwvXHMqXCRjNTUzNzVkYmE5ZDJmMTg2N2Y0MDgzYWNjZTk1OTg4ZGQ9W147XSs7XCRlX1xzKj1ccyplcnJvcl9yZXBvcnRpbmdcKDBcKTtccypldmFsXChiYXNlNjRfZGVjb2RlXChcJGM1NTM3NWRiYVteXCldK1wpXCk7XHMqZXJyb3JfW15cKV0rXCk7XHMqcmV0dXJuXHMqdHJ1ZTt+Ijt9fX1zOjE3OiIiY3JlYXRlX2Z1bmN0aW9uIiI7YToyOntpOjA7aToxMDtzOjQzOiJLU0I3SUVCbGRtRnNLR0poYzJVMk5GOWtaV052WkdVb0pGOVFUMU5VV3lSIjthOjI6e2k6MDtzOjI0OiJiYWNrZG9vci5ldmFsX2Jhc2U2NC4wMTkiO2k6MTtzOjcwOiJ+W0EtWmEtejAtOVwrXD1dezQwLH1LU0I3SUVCbGRtRnNLR0poYzJVMk5GOWtaV052WkdVb0pGOVFUMU5VV3lSW14iXSt+Ijt9fXM6MjI6ImJhc2U2NF9kZWNvZGUoJ1BITmpjbWwiO2E6Mjp7aTowO3M6MjE6ImluamVjdGVkLmpzX3BvcHVwLjAwMSI7aToxO3M6Mjk1OiJ+aWZcKHByZWdfbWF0Y2hcKCIuXChhbmRyb2lkXHxhdmFudGdvW14iXSsiLFxzKlwkX1NFUlZFUlxbIkhUVFBfVVNFUl9BR0VOVCJcXVwpXClccypce1xzKlwkXHcrXHMqPVxzKnN0cl9yZXBsYWNlXCguPC5oZWFkLi4sXHMqYmFzZTY0X2RlY29kZVwoJ1BITmpjbWxbXiddKydcKVxzKlwuXHMqUEhQX0VPTFteO10rO1xzKlx9XHMqZWxzZVxzKlx7XHMqXCRcdytccyo9XHMqc3RyX3JlcGxhY2VcKC48LmhlYWQ+LixccypiYXNlNjRfZGVjb2RlXCgnUEhOamNtbFteJ10rJ1wpXHMqXC5ccypQSFBfRU9MW147XSs7XHMqXH1+Ijt9czo0MDoiJF9TRVJWRVJbYmFzZTY0X2RlY29kZSgnU0ZSVVVGOVNSVVpGVWtWUyI7YToyOntpOjA7czoyNDoiYmFja2Rvb3IuZXZhbF9iYXNlNjQuMDA2IjtpOjE7czoxOTQ6In5cJFx3Kz1cJF9TRVJWRVJcW2Jhc2U2NF9kZWNvZGVcKFsnIl1TRlJVVUY5U1JVWkZVa1ZTWyciXVwpXF07XHMqXCRcdys9XCRfU0VSVkVSW147XSs7XHMqXCRcdys9YmFzZTY0X2RlY29kZVteO10rO1xzKlwkXHcrXHM9XHMqc3RycG9zXChcJFx3KyxccypcJFx3K1wpO1xzKmlmXChcKFwkXHcrPT09W15ce10rXHtlY2hvXHMqXCRcdys7XH1+Ijt9czozNzoiYmFzZTY0X2RlY29kZShnZXRfb3B0aW9uKCJfc2l0ZV9jYWNoZSI7YToyOntpOjA7czoyNDoiYmFja2Rvb3IuZXZhbF9iYXNlNjQuMDEyIjtpOjE7aToxMTt9czo3NDoiaWYoJF9TRVJWRVJbIlFVRVJZX1NUUklORyJdPT0icHJpbnQ9MSIgJiYgbWQ1KG1kNShiYXNlNjRfZGVjb2RlKCRfQ09PS0lFWyIiO2E6Mjp7aTowO3M6MzE6ImhhY2t0b29sLnZidWxsZXRpbi5iYWNrZG9vci4wMDEiO2k6MTtpOjExO31zOjI0OiJmdW5jdGlvbiBlY2hvZnJhbWUoJHVybCwiO2E6Mjp7aTowO3M6MjQ6ImluamVjdGVkLmpzX3JlZGlyZWN0LjAyNSI7aToxO3M6MjE2OiJ+ZXJyb3JfcmVwb3J0aW5nXCgwXCk7W15AXStAY2htb2RcKFwkbXlodFteQF0rQG1rZGlyW159XStcfVtcc10qZmlsZV9wdXRfY29udGVudHNbXkBdK0Bta2RpclteXH1dK1x9W1xzXSpmaWxlX3B1dFtefV0rXH1bXHNdKihlbHNlaWZbXHNdKlwoc3RycG9zW15cfV0rNDA0IE5vdCBGb3VuZFtefV0rXH1bXHNdKikrW1x9XHNdK2Vsc2VbXHNdKlx7W1xzXSpyZXR1cm47W1xzXSpcfX4iO319czoxMjoid3AtaW5jbHVkZXMvIjthOjg6e2k6MDtpOjEwO3M6MzU6IndwLWluY2x1ZGVzL2NlcnRpZmljYXRlcy9tZW1iZXIucGhwIjthOjI6e2k6MDtzOjI0OiJiYWNrZG9vci53cC1pbmNsdWRlcy4wMDEiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MzM6IndwLWluY2x1ZGVzL2NlcnRpZmljYXRlcy9tZW51LnBocCI7YToyOntpOjA7czoyNDoiYmFja2Rvb3Iud3AtaW5jbHVkZXMuMDAyIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjMyOiJ3cC1pbmNsdWRlcy9jZXJ0aWZpY2F0ZXMvYnV5LnBocCI7YToyOntpOjA7czoyNDoiYmFja2Rvb3Iud3AtaW5jbHVkZXMuMDAzIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjMxOiJ3cC1pbmNsdWRlcy9jZXJ0aWZpY2F0ZXMvdXMucGhwIjthOjI6e2k6MDtzOjI0OiJiYWNrZG9vci53cC1pbmNsdWRlcy4wMDQiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjM6IndwLWluY2x1ZGVzL1RleHQvdXMucGhwIjthOjI6e2k6MDtzOjI0OiJiYWNrZG9vci53cC1pbmNsdWRlcy4wMDUiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjM6IndwLWluY2x1ZGVzL1RleHQvZG8ucGhwIjthOjI6e2k6MDtzOjI0OiJiYWNrZG9vci53cC1pbmNsdWRlcy4wMDYiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjY6IndwLWluY2x1ZGVzL2ZvbnRzL2Jlc3QucGhwIjthOjI6e2k6MDtzOjI0OiJiYWNrZG9vci53cC1pbmNsdWRlcy4wMDciO2k6MTtzOjk6InNwYW1fbGluayI7fX1zOjM6InNuZCI7YTo2OntpOjA7aToxMDtzOjI6Ilx4IjthOjI6e2k6MDtpOjEwO3M6MzI6Ilx4NjNceDY4XHg2NVx4NjNceDZCXHg2Rlx4NzVceDc0IjthOjI6e2k6MDtpOjEwO3M6ODoic25kOm51bGwiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDYwIjtpOjE7czo5MjoifnZhciBfMHhbXHddK1tcc10qPVtePl0rLng2My54NjgueDY1Lng2My54NkIueDZGLng3NS54NzRbXj5dK3NuZDpudWxsW14+XSs+W14+XStcKFwpW1xzXSpcfX4iO319fXM6NDg6ImRvY3VtZW50LmNvb2tpZS5tYXRjaChuZXcgUmVnRXhwKCcoPzpefDsgKScrbmFtZSI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wMzciO2k6MTtzOjE1ODoifnZhciBbXHddK1tcc10qPVtcc10qXHtbXHNdKnNuZDpudWxsLFtcc10qW1x3XSs6W14sXSssW1xzXSpteWlkOlwoZnVuY3Rpb25cKG5hbWVcKVtcc10qXHtbXiZdK3ZhbHVlLi4mLjtbXj5dK2lmW1xzXSpcKFwoW1xzXSpuZXcgUmVnRXhwW15cfV0rc2VuZFwoXCk7W1xzXSpcfX4iO31zOjI5OiJpbnA9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wMDEiO2k6MTtzOjE0ODoifjxzY3JpcHQ+XHMqdmFyIHNuZFxzKj1ccypudWxsO1teXH1dK1JlZ0V4cC4uKG9uZXBhZ2V8Y2hlY2tvdXQpW15cXl0raW5wPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGxbXlxeXStzbmRccyo9bnVsbDtccypzZXRUaW1lb3V0Li5zZW5kW14+XStzY3JpcHQ+fiI7fXM6NjE6ImlmKChuZXcgUmVnRXhwKCdvbmVwYWdlfGNoZWNrb3V0fG9uZXN0ZXAnLCdnaScpKS50ZXN0KHdpbmRvdy4iO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDI2IjtpOjE7czoyMjQ6In48ZGl2XHMqaWQ9LndlYnN0YXRfYW5hbHl0aWNzX2NvZGUuPjxzY3JpcHRbXj5dKz5ccyo8XCEtLVxzKnZhclxzKlx3Kz1ce1xzKnNuZDpudWxsLFxzKlx3KzouaHR0cHNbXixdKyxccypteWlkOi5mdW5jdGlvbi5uYW1lLlx7XHMqW15cLl0rLmNvb2tpZS5tYXRjaFteIl0rIi0iXCtNYXRoW14sXSssXHMqY2xrOlteXCZdK1wmLjtbXjxdKzxidG5bXj5dKz5ccyo8LnNjcmlwdD5ccyo8LmRpdj5+Ijt9czozMToiO3ZhciBzbmQ9bnVsbDtmdW5jdGlvbiBzdGFydCgpeyI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wOTIiO2k6MTtzOjgwOiJ+dmFyIFtcd10rW1xzXSo9W1xzXSpcW1teO117NTAwLH07W15cbl0rc25kPW51bGw7W1xzXSpzZXRUaW1lb3V0W147XStcKTtbXHNdKlx9fiI7fX1zOjg6ImZ1bmN0aW9uIjthOjIxOntpOjA7aToxMDtzOjExOiJhcHBlbmRDaGlsZCI7YTo0OntpOjA7aToxMDtzOjExOiIoZnVuY3Rpb24oKSI7YTo1OntpOjA7aToxMDtzOjMwOiIuY2xvbmUoKS50ZXh0KCkpO31jYXRjaChlKXt9fTsiO2E6Mjp7aTowO2k6MTA7czo0NzoiK3dpbmRvdy5sb2NhdGlvbjtmb3IoaT0wO2k8dGhpcy5sZW5ndGg7aSsrKXtpZigiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMTA3IjtpOjE7czoyNjM6In5TdHJpbmdcLnByb3RvdHlwZVwuW1x3XStbXHNdKj1bXHNdKmZ1bmN0aW9uXChbXlwpXStcKVtcc10qXHtbXHNdKltcd10rW1xzXSo9W1xzXSpkb2N1bWVudCxbXHNdKltcd10rW1xzXSo9W1xzXSpbXHddK1wuY3JlYXRlRWxlbWVudFwodGhpc1teXH1dK2FwcGVuZENoaWxkW15cfV0rXH07P1tcc10qQXJyYXlcLnByb3RvW15cL10rc2V0VGltZW91dFwoXChcKVtcc10qPT5bXHNdKlx7aWZbXHNdKlwoIXdpbmRvd1teXH1dK1tcc1x9XSssW1xzXSpbXGRdK1wpOz9+Ijt9fXM6NzA6In5kb2N1bWVudFwuZ2V0RWxlbWVudHNCeVRhZ05hbWVcKFteXCldKmhlYWRbXlwpXSpcKVxbMFxdXC5hcHBlbmRDaGlsZH4iO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLmpzX2FwcGVuZENoaWxkLjAwNiI7aToxO3M6MTMxOiJ+XChmdW5jdGlvblwoXClbXHNdKlx7W1xzXSp2YXJbXlx9XStkb2N1bWVudFwuZ2V0RWxlbWVudHNCeVRhZ05hbWVcKFteXCldKmhlYWRbXlwpXSpcKVxbMFxdXC5hcHBlbmRDaGlsZFteXH1dK1x9W1xzXSpcKVtcc10qXChcKTs/fiI7fXM6NjE6Iik7fSxpbml0OmZ1bmN0aW9uKCl7c2V0dGluZ3NfdGltZXI9c2V0VGltZW91dCgnd3d3LmZpbmlzaCgpJywiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMTA2IjtpOjE7czoxOTg6In5bXHddKz1mYWxzZTtbXHNdKnZhciBbXHddK1tcc10qPVtcc10qbmV3IEltYWdlXChcKTtbXHNdKk9iamVjdFwuZGVmaW5lUHJvcGVydHlcKFtcd10rLFtcc10qLmlkLixbXHNdKlx7Z2V0Oltcc10qZnVuY3Rpb25bXlw8XSt3aW5kb3dcLnd3d1tcc10qPVtcc10qW1x3XStcLmluaXRcKFwpO1tcc10qcmV0dXJuIFtcd10rO1x9XChbXClcfTtcc10rfiI7fXM6Njc6IkFEQkxPQ0sgREVURUNURUQ8YnIvPlVuZm9ydHVuYXRlbHkgQWRCbG9jayBtaWdodCBjYXVzZSBhIGJhZCBhZmZlY3QiO2E6Mjp7aTowO3M6MjQ6ImluamVjdGVkLmpzX3JlZGlyZWN0LjAzNyI7aToxO3M6MjQzOiJ+XChmdW5jdGlvblwoLiwuLC5cKVx7T2JqZWN0XC5kZWZpbmVQcm9wZXJ0eVwoW15cKF0rXClcKHdpbmRvdyxbXHNdKlteLF0rLFtcc10qZnVuY3Rpb25cKFwpXHtbXHNdKnZhciBbXHddK1tcc10qPVtcc10qXFtbXjxdK0FEQkxPQ0sgREVURUNURUQ8YnIuPltePF0rRE9NQ29udGVudExvYWRlZFtePF0rPC5zY3JpcHQ+W1xzXSo8c2NyaXB0IHR5cGVbXHNdKj1bXj1dK29uZXJyb3JbXHNdKj1bXj1dK3NyY1tcc10qPVtePl0rPn4iO319czoxODoiLmJvZHkuYXBwZW5kQ2hpbGQoIjthOjM6e2k6MDtpOjEwO3M6Mjg6Ii5sb2NhdGlvbi5ocmVmLmluZGV4T2YoYXRvYigiO2E6Mjp7aTowO2k6MTA7czoyNjoiJywnYjI1bGMzUmxjR05vWldOcmIzVjAnLCciO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDc0IjtpOjE7czoxMjM6In5cKGZ1bmN0aW9uXCguLC4sLixbXlwpXStcKVx7aWZcKC5cLmxvY2F0aW9uXC5ocmVmXC5pbmRleE9mXChhdG9iXCguXClcKVteXH1dK2JvZHlcLmFwcGVuZENoaWxkXCguXClbXjxdK2IyNWxjW15cKV0rW1wpO10rfiI7fX1zOjU2OiIoZG9jdW1lbnQsd2luZG93LCdzY3JpcHQnLCdndG0uanMnLCdiMjVsYzNSbGNHTm9aV05yYjNWMCI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wOTgiO2k6MTtzOjEzOToiflwoZnVuY3Rpb25cKC4sLiwuLC4sLiwuW15cKV0rXClce3ZhciBbXHddKz1mdW5jdGlvblwoLlwpXHt2YXIgLj1ce1x9W15cfV0rXH1bXj5dKz49W159XStcfVtePl0rbG9jYXRpb24uaHJlZi5pbmRleE9mW148XSthSFIwY1teKV0rXClcKTs/fiI7fX1zOjMzOiJfX2dhZHNfYXUnLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTsiO2E6Mjp7aTowO2k6MTA7czo2NzoibmF2aWdhdG9yLmFwcFZlcnNpb24uaW5kZXhPZignV2luJykmJignSW5zdGFsbFRyaWdnZXInaW4gd3x8J2Nocm9tZSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xNDgiO2k6MTtzOjE4NjoifiFmdW5jdGlvblwoLiwuLC4sLiwuXClceyEuW1x3XVwuY29va2llXC5pbmRleE9mXCguXCkmJi5uYXZpZ2F0b3JcLmFwcFZlcnNpb25cLmluZGV4T2ZcKC5XaW4uLi4uLi5JbnN0YWxsVHJpZ2dlclteXC9dK2xvY2F0aW9uLnByb3RvY29sLmNvbmNhdFteXH1dK1x9XCk7XH1cKHdpbmRvdyxbXHNdKmRvY3VtZW50W147XStcKTt+Ijt9fX1zOjY1OiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSI7YTo0OntpOjA7aToxMDtzOjIyOiJTdHJpbmdbJ2Zyb21DaGFyQ29kZSddIjthOjM6e2k6MDtpOjEwO3M6OToiR2V0Q0NJbmZvIjthOjI6e2k6MDtpOjEwO3M6MTc6ImZ1bmN0aW9uIHJoZXgoXzB4IjthOjI6e2k6MDtpOjEwO3M6MTY6InN0cjJibGtzX01ENShfMHgiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDc5IjtpOjE7czo4NDoifnZhciBfMHhbXHddK1tcc10qPVtcc10qXFsoJ1teJ10rJyxbXHNdKil7MjAsfSdbXiddKydcXTtcKGZ1bmN0aW9uXChfMHhbXlxuXSs7XH1cfTt+Ijt9fX1zOjc6Il09ISFbXTsiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDcwIjtpOjE7czoxMjY6In4odmFyfGNvbnN0KSBbXHddK1tcc10qPVtcc10qXFtbXlxdXXsxMDAsfVxdO1tcc10qXChmdW5jdGlvblteXH1dK1x9XH07W15cbl0rKDtcfVx9O3xzZW5kLi5cKFwpO1x9fGRvbWFpblwrLlwoW15cKV0rW1wpXH07XSspfiI7fX1zOjM0OiJkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG5ld0ltZyk7IjthOjI6e2k6MDtpOjEwO3M6NDY6Im5ld0ltZy5zZXRBdHRyaWJ1dGUoImFsdCIsICJQbGVhc2UsIHdhaXQuLi4iKTsiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMTE2IjtpOjE7czoxNDc6In5mdW5jdGlvbiBiYXNlNjRfZW5jb2RlXChkYXRhXClbXHNdKlx7W1xzXSp2YXIgYjY0W1xzXSo9W1xzXSouQUJDW146XSs6W1xzXSplbmNbXlwvXStuZXdJbWdcLnNldEF0dHJpYnV0ZVwoLnNyYy4sW1xzXSpbXlx9XStbXHNcfTtdK01ha2VFdmVudFwoXCk7fiI7fX1zOjI0OiJyaGV4KGIpK3JoZXgoYykrcmhleChkKTsiO2E6Mjp7aTowO3M6MjY6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDc5LjAyIjtpOjE7aToxMTt9fXM6NDoiKDEwNCI7YTo0OntpOjA7aToxMDtzOjk6IiBodHRwR2V0KCI7YToyOntpOjA7aToxMDtzOjIxOiJuZXcgWE1MSHR0cFJlcXVlc3QoKTsiO2E6Mjp7aTowO2k6MTA7czoyMDoiZnVuY3Rpb24gaHR0cEdldChfMHgiO2E6Mjp7aTowO3M6MjQ6ImluamVjdGVkLmpzX3JlZGlyZWN0LjAxOCI7aToxO3M6MTIwOiJ+PHNjcmlwdCBsYW5ndWFnZVtePl0rPnZhciBfMHhbXHddKz1cWy5cXHguLlxceC4uW14+XStcKTt2YXIgZ2V0X3RleHQ9ZnVuY3Rpb24gaHR0cEdldFwoXzB4W148XStce1tcd11cKFwpXH1cfTwuc2NyaXB0Pn4iO319fXM6MzA6IlN0cmluZy5mcm9tQ2hhckNvZGUoNzEsNjksODQpLCI7YToyOntpOjA7aToxMDtzOjE1OiIucmVzcG9uc2VUZXh0O30iO2E6Mjp7aTowO2k6MTA7czoyMzoiU3RyaW5nLmZyb21DaGFyQ29kZSgxMDQiO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLmpzX3JlZGlyZWN0LjAxOC4wMiI7aToxO3M6MTk2OiJ+KHZhciBbXHddW1xzXSo9W1xzXSpbXGRdKztbXHNdKik/dmFyIFtcd10rW1xzXSo9W1xzXSpTdHJpbmdcLmZyb21DaGFyQ29kZVwoW14sXSoxMDRbXlx9XStcfVtcc10qZnVuY3Rpb24gW1x3XStcKFteXH1dK1wucmVzcG9uc2VUZXh0O1x9W1xzXSooZnVuY3Rpb25bXHNdKltcd10rXChbXHddK1wpW1xzXSpce1tcc10qdmFyW15cfV0rO1x9KT9+Ijt9fX1zOjMxOiJTdHJpbmcuZnJvbUNoYXJDb2RlKDEwNCwxMTYsMTE2IjthOjI6e2k6MDtpOjEwO3M6NzQ6ImRvY3VtZW50LmN1cnJlbnRTY3JpcHQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUocywgZG9jdW1lbnQuY3VycmVudFNjcmlwdCk7IjthOjI6e2k6MDtzOjI0OiJpbmplY3RlZC5qc19yZWRpcmVjdC4wMjkiO2k6MTtzOjE5MToifnZhciBbXHddK1tcc10qPVtcc10qW1xkXSs7W1xzXSp2YXIgW1x3XVtcc10qPVtcc10qZG9jdW1lbnQ7W1xzXSp2YXIgW1x3XVtcc10qPVtcc10qLlwuY3JlYXRlRWxlbWVudFwoLnNjcmlwdFteXH1dK3MsIGRvY3VtZW50XC5jdXJyZW50U2NyaXB0XCk7W1xzXSpcfVtcc10qZWxzZVteXH1dK2FwcGVuZENoaWxkXChzXCk7W1xzXSpcfX4iO319fXM6NToiXXx8W10iO2E6Mjp7aTowO2k6MTA7czo5OiJndG0uc3RhcnQiO2E6NDp7aTowO2k6MTA7czoyMToiKz1TdHJpbmcuZnJvbUNoYXJDb2RlIjthOjI6e2k6MDtpOjEwO3M6NDQ6ImJyZWFrfX0od2luZG93LGRvY3VtZW50LCJzY3JpcHQiLCJkYXRhTGF5ZXIiIjthOjI6e2k6MDtzOjI2OiJoYWNrdG9vbC5jYy1zdGVhbGVyLjA3Mi4wMiI7aToxO3M6MTQyOiJ+IWZ1bmN0aW9uXCguLC4sLixbXlwpXStcKVx7W15ce10rXHsuZ3RtXC5zdGFydC4uLm5ldyBEYXRlLi5nZXRUaW1lW15ce10rXHtmb3JcKHZhcltee10rXHtcKC49ZG9jdW1lbnRbXlx9XSticmVha1x9fVwod2luZG93LGRvY3VtZW50W147XStcKTt+Ijt9fXM6NzE6In5HVE0tKDVTRjI5M0p8NVBKNEQ2OHxUUkRMTTdRfDVNTkhCRzN8UFBGOFdRV3w1NzcyS0ZMfFQ2VEpIQlJ8VDc4RzU4Ryl+IjthOjI6e2k6MDtzOjI2OiJoYWNrdG9vbC5jYy1zdGVhbGVyLjA3Mi4wMyI7aToxO3M6MTY5OiJ+XChmdW5jdGlvblwodyxkLHMsW15cKV0rXClce1teXHtdK1x7Li4/Z3RtXC5zdGFydC4uPzpbXHM8XSpuZXcgRGF0ZVwoXClbXjxdK2RhdGFMYXllci4uPywuLj9HVE0tKDVTRjI5M0p8NVBKNEQ2OHxUUkRMTTdRfDVNTkhCRzN8UFBGOFdRV3w1NzcyS0ZMfFQ2VEpIQlJ8VDc4RzU4RykuLj9cKTt+Ijt9czozMDoiLnNwbGl0KCcnKS5yZXZlcnNlKCkuam9pbignJyksIjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjE2NCI7aToxO3M6MTQzOiJ+XChmdW5jdGlvblwodyxkLHMsW15cKV0rXClce1teXHtdK1x7Li4/Z3RtXC5zdGFydC4uPzpbXHM8XSpuZXcgRGF0ZVwoXClbXjxdK1wuc3BsaXRcKC4uXClcLnJldmVyc2VcKFwpXC5qb2luXCguLlwpLFtePF0rZGF0YUxheWVyLi4/LFteO10rXCk7fiI7fX19czo0OiI9e307IjthOjM6e2k6MDtpOjEwO3M6MTY6Ij13aW5kb3dbImF0b2IiXTsiO2E6Mjp7aTowO2k6MTA7czoxODoiPXdpbmRvd1siZXNjYXBlIl07IjthOjI6e2k6MDtpOjEwO3M6MzA6Ij13aW5kb3dbImRlY29kZVVSSUNvbXBvbmVudCJdOyI7YToyOntpOjA7aToxMDtzOjIxOiIrU3RyaW5nLmZyb21DaGFyQ29kZSgiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMTAxIjtpOjE7czo5OToiflwoZnVuY3Rpb24gW1x3XStcKFwpW1xzXSpce1tccztdKigodmFyW1xzXSopP1tcd10rW1xzXSo9W1xzXSpbXlxuXSs7W1xzXSopezEwLH1bXlx4MDJdK1x9XClcKFwpOz9+Ijt9fX19czoxNjoiPSIiLmNvbnN0cnVjdG9yOyI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wNzciO2k6MTtzOjEyODoiflwoZnVuY3Rpb25cKFwpW1xzXSpce1teXHtdKz1ce1x9O1tcc10qW15cfV0rW15cbl0rdmFyW1xzXSpbXHddKz0iW14iXXs1MDAwfVteO10rIltcc10qO1teXG5dKyIiXC5jb25zdHJ1Y3RvcjtbXlx4MDJdK1x9XClcKFwpO34iO319czo1OiIoJycsJCI7YToyOntpOjA7aToxMDtzOjk6ImNocihvcmQoJCI7YToyOntpOjA7aToxMDtzOjU6InhvciAkIjthOjI6e2k6MDtpOjEwO3M6MjY6Ijw/cGhwIGlmKCFmdW5jdGlvbl9leGlzdHMoIjthOjI6e2k6MDtzOjIzOiJpbmplY3RlZC5qc19tYWx3YXJlLjAxMyI7aToxO3M6MTgwOiJ+aWZcKCFmdW5jdGlvbl9leGlzdHNcKFteXCldK1wpXClbXHNdKlx7W1xzXSpmdW5jdGlvbiBbXHddK1woXCRbXlwpXStcKVtcc10qXHtbXHNdKlwkW1x3XStbXHNdKj1bXHNdKmFycmF5W15cfV0rXH1bXHNdKnJldHVybiBcJFteXH1dK1x9W1xzXSpcJFtcd10rW15cfV0rXH1bXHNdKihlY2hvW147XSs7W1xzXSopP34iO319fX1zOjI3OiJ+XClcW1N0cmluZy5mcm9tQ2hhckNvZGVcKH4iO2E6Mjp7aTowO2k6MTA7czoyODoiflwoZnVuY3Rpb25cKFwpXHtcKGZ1bmN0aW9ufiI7YToyOntpOjA7aToxMDtzOjM0OiJ+XClcXTtyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50XCh+IjthOjI6e2k6MDtpOjEwO3M6MzA6In5cKFwpXH1cKFwpXClcfVwoXClcKVx9XChcKVwpfiI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4xMDAiO2k6MTtzOjEyNjoiflwoZnVuY3Rpb25cKFwpXHtcKGZ1bmN0aW9uIFtcd10rXChcKVtcc10qXHtbXHNdKnZhciBbXHddK1tcc10qPVtcc10qU3RyaW5nXC5mcm9tQ2hhckNvZGVbXlx4MDJdK1woXClcfVwoXClcKVx9XChcKVwpXH1cKFwpXCl+Ijt9fX19czo4OiJ7RG9tYWluOiI7YToyOntpOjA7aToxMDtzOjg6ImJ0b2EoXzB4IjthOjI6e2k6MDtpOjEwO3M6NToiO3VybGwiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDc4IjtpOjE7czo3MzoifnZhciBfMHhbXHddKz1cW1teXH1dK1x9W15cbl0rXHtEb21haW46W15cbl0rZnVuY3Rpb25cKFwpXHtbXHddK1woXClcfVwpfiI7fX19czo2OiJsZWZ0Oi0iO2E6Mjp7aTowO2k6MTA7czozOiI+JysiO2E6Mjp7aTowO2k6MTA7czoyNjoiKGpRdWVyeSgnaGVhZCcpKTs8L3NjcmlwdD4iO2E6Mjp7aTowO3M6MjM6ImluamVjdGVkLmhpZGRlbi1kaXYuMDQwIjtpOjE7czoxMzY6In5mdW5jdGlvbiBbXHddK1woW1x3XStcKVtcc10qXHtbXHNdKnZhciBbXHddK1tcc10qPVtcc10qLiNbXlxuXStweFteXH1dKlx9LjtbXHNdKnZhciBbXHddK1tcc10qPVteXH1dK1x9W1xzXSpbXHddK1woalF1ZXJ5XCguaGVhZC5cKVwpO34iO319fXM6MTI6ImF3YWl0IGZldGNoKCI7YTo0OntpOjA7aToxMDtzOjIwOiJhd2FpdCBmZXRjaChhdG9iKF8weCI7YToyOntpOjA7aToxMDtzOjMzOiI7fTtpKCk7YXN5bmMgZnVuY3Rpb24gaSgpe2xldCBfMHgiO2E6Mjp7aTowO3M6MjM6ImluamVjdGVkLmpzX21hbHdhcmUuMDE0IjtpOjE7czoxMjI6In5jb25zdCBfMHhbXHddK1tcc10qPVtcc10qXFtbXlxdXStcXTtbXHNdKlwoZnVuY3Rpb25cKFteXH1dK1x9XH07W1xzXSpfMHhbXHddK1woXCtcK1teJ10rYXdhaXQgZmV0Y2hcKGF0b2JbXlx9XStcKFwpO1x9XH1+Ijt9fXM6ODoidjAoKSk7fX0iO2E6Mjp7aTowO2k6MTA7czo0OiJmMCgpIjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjEzNSI7aToxO3M6MTc1OiJ+dmFyIF8/Y3NbXHNdKj1cW1teXF1dK1xdO1tcc10qXz9mMFwoXCk7W1xzXSphc3luYyBmdW5jdGlvbiBfP2YwXChcKVtcc10qXHtbXHNdKmxldCBfP2cwW1xzXSo9W1xzXSphd2FpdCBmZXRjaFteXH1dK18/djBcKFwpXCk7W1xzXSpcfSsoXHMqdmFyIFtcd10rXHMqPVxzKiJbXHdcK1w9XSsiO1tcc10qKT9+Ijt9fXM6MTA6Ii5vaykge2xldCAiO2E6Mzp7aTowO2k6MTA7czoxNDoiPHN0eWxlIG9ubG9hZD0iO2E6Mjp7aTowO3M6MjY6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMTM1LjAyIjtpOjE7czoxNDk6In48c3R5bGUgb25sb2FkPS4odmFyIF8/Y3NcZD89XFtbXlxdXStcXTtccyopP1woYXN5bmNccytmdW5jdGlvblteXH1dK2F3YWl0IGZldGNoW15cfV0rXC5zbGljZVwoKFx3K3wtXGRcZFxkKylcKVwpO1xzKnJldHVyblwoXHcrXChcKVwpO1x9XH1cKVwoXCk7Lj5+Ijt9czozOToiLnRleHQoKTt2YXIgRiA9IG5ldyBGdW5jdGlvbiAoeC5zbGljZSgtIjthOjI6e2k6MDtzOjI2OiJoYWNrdG9vbC5jYy1zdGVhbGVyLjEzNS4wMyI7aToxO3M6MTExOiJ+aVwoXCk7W1xzXSphc3luYyBmdW5jdGlvbiBbXHddK1woXClbXHNdKlx7W1xzXSpsZXQgW1x3XStbXHNdKj1bXHNdKmF3YWl0IGZldGNoW15cfV0rcmV0dXJuXChbXHddK1woWztcKVx9XHNdK34iO319fXM6NDoiYXRvYiI7YTo0OntpOjA7aToxMDtzOjI0OiIoZnVuY3Rpb24oaSxzLG8sZyxyLGEsbSkiO2E6Mjp7aTowO2k6MTA7czozNToiO2lmKGkubG9jYXRpb24uaHJlZi5pbmRleE9mKGkuYXRvYigiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDgwIjtpOjE7czoxMzA6In5cKGZ1bmN0aW9uXChpLHMsbyxnLHIsYSxtXFcraVxbLltnR11bXjw+XStpbmRleE9mLmlcLmF0b2JcKFx3XClbXjxdK2F0b2JcKFx3XClbXjx7XStcKHdpbmRvdyxccypkb2N1bWVudCxbJyJdXHdbXjxdKyxbJyJdZ1x3LlwpO34iO319czoyNzoiaHJlZi5tYXRjaChuZXcgUmVnRXhwKGF0b2IoIjthOjI6e2k6MDtpOjEwO3M6OToiMmhsWTJ0dmRRIjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjE2OCI7aToxO3M6MTIwOiJ+XChmdW5jdGlvblwoW1x3XSssW1x3XSssW15cfV0rcGFyZW50Tm9kZVwuaW5zZXJ0QmVmb3JlXChbXHddKyxbXHddK1wpXH1cfVwpW147XSsyaGxZMnR2ZFFbXjtdKyxbXHNdKi5zY3JpcHQuLHdpbmRvd1wpO34iO319czoxMToiWTJobFkydHZkWFEiO2E6Mjp7aTowO3M6MjY6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMDI5LjAyIjtpOjE7aToxMTt9fXM6MjI6ImZlcmgubm9pdGFjb2wudG5lbXVjb2QiO2E6Mjp7aTowO2k6MTA7czo0NjoiLmxpc3Rbbl0uc3BsaXQoIiIpLnJldmVyc2UoKS5qb2luKCIiKTtyZXR1cm4gJCI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQuanNfcmVkaXJlY3QuMDM1IjtpOjE7czoyMjg6In5cJFtcd10rW1xzXSo9W1xzXSpmdW5jdGlvblwoLlwpW1xzXSpce1tcc10qaWZcKHR5cGVvZlwoXCRbXHddK1wubGlzdFxbLlxdXClbXHNdKj09W1xzXSouc3RyaW5nLlwpW1xzXSpyZXR1cm4gXCRbXHddK1wubGlzdFxbLlxdXC5zcGxpdFwoLi5cKVwucmV2ZXJzZVwoXClcLmpvaW5cKC4uXCk7W1xzXSpyZXR1cm5bXlx9XStcXVx9O1tcc10qXCRbXHddK1wubGlzdFteXH1dK2RlbGF5XClbXHNdKlx9fiI7fX1zOjIxOiI9IGpRdWVyeSgnaHRtbCcpOyB2YXIiO2E6Mjp7aTowO2k6MTA7czoyOToiPmRpdntvdmVyZmxvdzpoaWRkZW47Ym90dG9tOi0iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLmhpZGRlbi1kaXYuMDM4LjAyIjtpOjE7czoxNjY6In5mdW5jdGlvbiBbXHddK1woXClbXHNdKlx7W1xzXSp2YXIgW1x3XStbXHNdKj1bXHNdKmpRdWVyeVwoW147XStcKTtbXHNdKnZhciBbXHddK1teXHtdK1x7W1xzXSpvdmVyZmxvdzpoaWRkZW5bXjxdK2ZpeGVkXH1bXlx9XSthcHBlbmRcKFtcd10rXCk7W1xzXSpcfVtcc10qW1x3XStcKFwpO34iO319czoxNzoiWE1MSHR0cFJlcXVlc3QoKTsiO2E6Mzp7aTowO2k6MTA7czozMToicHR0aCcuc3BsaXQoJycpLnJldmVyc2UoKS5qb2luKCI7YToyOntpOjA7czoyOToiaW5qZWN0ZWQubWFnZW50b19zaG9wbGlmdC4wMDgiO2k6MTtzOjE2MjoifjxpbWdbXHNdKnNyY1tcc10qPVteO10rOy5bXHNdKm9ubG9hZFtcc10qPVtcc10qLnZhclteO10rO1tcd10rLm9wZW5cKC5HRVQuLFteO10rcmV2ZXJzZVwoXCkuam9pblwoW15cfV0rcmVzcG9uc2VcKVwpLmNhbGxcKHRoaXNcKTtbXHNdKlx9O1tcc10qW1x3XSsuc2VuZFwoXCk7Lj5+Ijt9czo1NDoicXVlcnlTZWxlY3RvckFsbCgiYVtocmVmKj0namF2YXNjcmlwdDp2b2lkKDApJ10sYnV0dG9uIjthOjI6e2k6MDtzOjI5OiJpbmplY3RlZC5tYWdlbnRvX3Nob3BsaWZ0LjAwOSI7aToxO3M6MjkwOiJ+aWZcKHR5cGVvZltcc10qW1x3XSs9PS5bXHddKy5cKVx7W1xzXSp2YXJbXHNdKltcd10rPVx7W1xzXSp1cmxbXlx8XStkb2N1bWVudC5jb29raWUubWF0Y2hcKG5ld1tcc10qUmVnRXhwXChbXjxdK2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGxcKC5pbnB1dFteXCpdK2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGxcKC5hXFtocmVmW15cLV0rQ29udGVudC10eXBlLiwuYXBwbGljYXRpb24ueC13d3ctZm9ybS11cmxlbmNvZGVkLlwpO1teXH1dK1x9LFtcc10qXH1bXHNdKltcd10rXC5pbml0XChcKTtbXHNdKlx9fiI7fX1zOjEzOiJbZnVzaW9uX2NvZGVdIjthOjI6e2k6MDtpOjEwO3M6Mzc6IlBITmpjbWx3ZEQ1MllYSWdYekI0TTJNM056MWJKMXg0TmpaY2UiO2E6Mjp7aTowO3M6MjM6ImluamVjdGVkLmpzX21hbHdhcmUuMDE2IjtpOjE7czo3NjoiflxbZnVzaW9uX2NvZGVcXVBITmpjbWx3ZEQ1MllYSWdYekI0TTJNM056MWJKMXg0TmpaY2VbXlxbXStcW1wvZnVzaW9uX2NvZGVdfiI7fX1zOjU5OiJpZighZnVuY3Rpb25fZXhpc3RzKCdiYXMnLidlJy4nNjRfJy4nZW4nLidjb2RlJykpe2Z1bmN0aW9uICI7YToyOntpOjA7czoyNDoiYmFja2Rvb3IuZXZhbF9iYXNlNjQuMDIwIjtpOjE7czoyMjQ6In48XD9waHBccypcJEdMT0JBTFNcWy5EQl9OQU1FLlxdXHMqPVxzKmFycmF5XChccypbXlwoXStcKC5zaGVsbF9ib3JkZXIuXHMqPT5bXjtdKztccyppZlwoXCFmdW5jdGlvbl9leGlzdHNcKC5bXHMnIlwuYmFzZTY0X2VuY29kZV0rXClcKVxzKntccypmdW5jdGlvblxzKlx3K1woKFwkXHcrKVwpXHMqe1xzKmlmXChlbXB0eVwoXDFcKVwpXHMqcmV0dXJuXHMqO1teXDFdKydcKVxzKjtccypcPz5+Ijt9czo0Mzoic2V0VGltZW91dChmdW5jdGlvbigpe2pRdWVyeS5nZXRTY3JpcHQoJ2h0dCI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4xMzAiO2k6MTtzOjczOiJ+c2V0VGltZW91dFwoZnVuY3Rpb25cKFwpXHtqUXVlcnlcLmdldFNjcmlwdFwoLmh0dFteXH1dK1x9LFtcc10qW1xkXStcKTt+Ijt9czoxNjM6Il09PT11bmRlZmluZWQpe3ZhciBmPWZ1bmN0aW9uKGkpe3ZhciBqPSdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4OSsvPScsaz1TdHJpbmcoaSlbJ3JlcGxhY2UnXSgvPSskLywnJyk7dmFyIGw9Jyc7Zm9yKHZhciBtPTB4MCwiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMTMzIjtpOjE7czoxMDc6In48c2NyaXB0PihcKGZ1bmN0aW9uXChcKVx7dHJ5XHtbXHNdKik/dmFyIGE9XFtbXlxdXStcXTtcKGZ1bmN0aW9uXChiLGNcKVteXG5dK2VcKVteXChdK1woXCk7W1xzXSo8LnNjcmlwdD5+Ijt9czoxOToicG9zdGNvZGUnLCFbXV0sW18weCI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4xMTMiO2k6MTtpOjExO31zOjk6IkdldENDSW5mbyI7YToyOntpOjA7czoyNjoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wNzkuMDMiO2k6MTtpOjExO319czoyOiJaWCI7YToxMDp7aTowO2k6MTA7czoyMDoiJGF1dGhfdXNlcnMgPSBhcnJheSgiO2E6Mjp7aTowO2k6MTA7czo1NToiOyRfQT1zdHJyZXYoImVzYWIiKS4iNjRfIi5zdHJyZXYoImVkb2NlZCIpOyRfWD0kX0EoJ1pYWiI7YToyOntpOjA7czoxNzoiYmFja2Rvb3IuZXZhbC4wMDgiO2k6MTtzOjc6In5eLiokfnMiO319czo1NjoiNDBcNjVcNzZcNjFcNmNcMjhcNjJcNjFcNzNcNjVcMzZcMzRcNWZcNjRcNjVcNjNcNmZcNjRcNjUiO2E6Mjp7aTowO3M6MjQ6ImJhY2tkb29yLmV2YWxfYmFzZTY0LjAyMSI7aToxO3M6MjI6In4uNDAuNjUuNzYuNjFbXjtdK1wpO34iO31zOjEzNDoiYVdZb2MzUnliR1Z1S0NSeUtTQThJREV3S1NCN0Nna0pjbVYwZFhKdUlHWmhiSE5sT3dvSmZRb0pDZ2trWkNBOUlITjBjblJ2Ykc5M1pYSW9KRjlUUlZKV1JWSmJKMGhVVkZCZlNFOVRWQ2RkS1RzS0NTUndiM01nUFNCemRISndiM01vSkgiO2E6Mjp7aTowO3M6MjM6ImluamVjdGVkLnBocF9iYXNlNjQuMDAxIjtpOjE7czo3OiJ+Xi4qJH5zIjt9czoxODoiTHlwd2FIQXFMMmxtS0NGamJHIjthOjI6e2k6MDtzOjI0OiJiYWNrZG9vci5ldmFsX2Jhc2U2NC4wMjMiO2k6MTtpOjExO31zOjg6ImRtbGhaM0poIjthOjI6e2k6MDtzOjIxOiJpbmplY3RlZC5zcGFtLXNlby4wMjAiO2k6MTtpOjExO31zOjM4OiJKVE5EWkdsMkpUSXdjM1I1YkdVbE0wUWxNakp3YjNOcGRHbHZiaSI7YToyOntpOjA7czoyMToiaW5qZWN0ZWQuc3BhbS1zZW8uMDIzIjtpOjE7aToxMTt9czozMjoiQ2dwcFppZ2haR1ZtYVc1bFpDZ25SRTlNVEZsZlYwRloiO2E6Mjp7aTowO3M6MjQ6ImJhY2tkb29yLmV2YWxfYmFzZTY0LjAyNCI7aToxO3M6NDA6In5DZ3BwWmlnaFpHVm1hVzVsWkNnblJFOU1URmxmVjBGWlteXHNdKn4iO31zOjkyOiJZUzV6Y21NOUp5Y3JhUzVoZEc5aUtHOHBPMjB1Y0dGeVpXNTBUbTlrWlM1cGJuTmxjblJDWldadmNtVW9ZU3h0S1gxOUtTQW9kMmx1Wkc5M0xHUnZZM1Z0Wlc1MCI7YToyOntpOjA7czoyNDoiYmFja2Rvb3IuZXZhbF9iYXNlNjQuMDI1IjtpOjE7czoxMzc6In5cW2Z1c2lvbl9jb2RlXF1bXlxbXStZUzV6Y21NOUp5Y3JhUzVoZEc5aUtHOHBPMjB1Y0dGeVpXNTBUbTlrWlM1cGJuTmxjblJDWldadmNtVW9ZU3h0S1gxOUtTQW9kMmx1Wkc5M0xHUnZZM1Z0Wlc1MFteXF1dK1xbLmZ1c2lvbl9jb2RlXF1+Ijt9czoyOToiWyh0eXBlb2YgSW1hZ2UpLnJlcGxhY2UoL14uLywiO2E6Mjp7aTowO3M6MjM6ImhhY2t0b29sLmNjLXN0ZWFsZXIuMTU0IjtpOjE7czoyMjI6In4oPGltZyBzcmMgb25lcnJvcj0ufDtcKGZ1bmN0aW9uXChcKVx7KWxldCBhID0gd2luZG93OyBbXjw+e10qbmV3IGFcW1wodHlwZW9mIEltYWdlXCkucmVwbGFjZVwoXC9cXlwuXC8sW15cKV0ranBlZy5cKVxdXChbXlxdXStcWy5jb25jYXQuXF1bXlxdXStiYXNlNjRbXlxdXStcXVwoWyciXVteXH08Pl0rXCguYS5cKVwpXClcKFwpKC4+fFsnIl0gc3R5bGU9W148Pl0rPnxcfVwoXClcKTspfiI7fX1zOjI6IllYIjthOjc6e2k6MDtpOjEwO3M6ODoiYjJOMWJXVnUiO2E6Mjp7aTowO2k6MTA7czoxMDoiZG1GeUlGOHdlRCI7YToyOntpOjA7czoyMzoiaW5qZWN0ZWQuanNfbWFsd2FyZS4wMjAiO2k6MTtzOjE3OiJ+ZG1GeUlGOFtcdz1cK10rfiI7fX1zOjIyOiJVM1J5YVc1bkxtWnliMjFEYUdGeVEyIjthOjI6e2k6MDtzOjIyOiJpbmplY3RlZC5qc19iYXNlNjQuMDAxIjtpOjE7aToxMTt9czozODoiTG5OeVl5QTlJRk4wY21sdVp5NW1jbTl0UTJoaGNrTnZaR1VvTVQiO2E6Mjp7aTowO3M6MjI6ImluamVjdGVkLmpzX2Jhc2U2NC4wMDMiO2k6MTtpOjExO31zOjk6IlBITmpjbWx3ZCI7YToyOntpOjA7czoyMjoiaW5qZWN0ZWQuanNfYmFzZTY0LjAwNCI7aToxO2k6MTE7fXM6MjA6ImNIQmxibVJEYUdsc1pGd25YU2h6IjthOjI6e2k6MDtzOjIyOiJpbmplY3RlZC5qc19iYXNlNjQuMDA1IjtpOjE7aToxMTt9czo3NToid3hNVFFzTXpJc01URXlMREV4TVN3ek1pdzJNU3d6TWl3eE1EQXNNVEV4TERrNUxERXhOeXd4TURrc01UQXhMREV4TUN3eE1UWXNOIjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5qc19yZWRpcmVjdC4wNDkuMDIiO2k6MTtpOjEyO319czozOiJ0bXAiO2E6NTp7aTowO2k6MTA7czo5OiJnZXRjd2QoKS4iO2E6Mjp7aTowO2k6MTA7czoyMjoiaWYoaXNzZXQoJF9HRVRbJ2dvb2QnXSI7YToyOntpOjA7czoyMToiYmFja2Rvb3IudXBsb2FkZXIuMDAxIjtpOjE7czoxMjA6In5pZlwoaXNzZXRcKFwkX0dFVFxbLmdvb2QuXVwpXClbXHNdKlx7W1xzXSppZlwoaXNzZXRcKFwkX0ZJTEVTW15AXStAbW92ZV91cGxvYWRlZF9maWxlW15cfV0rXH1bXHNdKmVsc2VbXHNdKlteXH1dK1tcfV0rfiI7fX1zOjE3OiJpZihAY29weSgkX0ZJTEVTWyI7YToyOntpOjA7aToxMDtzOjM0OiJpZiggJF9QT1NUWydfdXBsJ10gPT0gIlVwbG9hZCIgKSB7IjthOjI6e2k6MDtzOjIxOiJiYWNrZG9vci51cGxvYWRlci4wMDMiO2k6MTtzOjIyMToifmVjaG9bXHNdKi48Zm9ybVteXHtdK2lmXChbXHNdKlwkX1BPU1RcWy5bXHddKy5cXVtcc10qPT1bXHNdKi5bXHddKy5bXHNdKlwpW1xzXSpce1tcc10qaWZcKFxAY29weVwoXCRfRklMRVNcW1teXH1dK1x9W1xzXSplbHNlW1xzXSpce1tcc10qZWNob1teJF0rXCRfU0VSVkVSXFsuU0VSVkVSX05BTUUuXF1bXlx9XStcJF9GSUxFU1xbLltcd10rLlxdXFsuW1x3XSsuXF0uLi47W1xzXSpcfX4iO319czoyMDoiZ2NjIC1vIC90bXAvYW5nZWxfYmMiO2E6Mjp7aTowO3M6MTg6ImJhY2tkb29yLmFuZ2VsLjAwMSI7aToxO2k6MTE7fXM6OToiLi4vLi4vLi4vIjthOjI6e2k6MDtzOjIxOiJtYWx3YXJlLmluY2x1c2lvbi4wMDEiO2k6MTtpOjExO319czoxNjoiPG1ldGEgaHR0cC1lcXVpdiI7YTo0OntpOjA7aToxMDtzOjM1OiI8bWV0YSBodHRwLWVxdWl2PSJSZWZyZXNoIiBjb250ZW50PSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xMDkiO2k6MTtzOjEwODoifjxtZXRhW1xzXSpodHRwLWVxdWl2W14+XStcL3dwLSg/OmNvbnRlbnR8YWRtaW58aW5jbHVkZXMpXC9bXC9fXHcrLV0rKD86LnBocHxodG1sfHBodG1sfGh0bXxqc3x4aHRtbClbXj5dKz5+Ijt9czo5OiJqNGRzbXdqeC4iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDk2IjtpOjE7czoxODoiaHR0cF9lcXVpdl9yZWZyZXNoIjt9czo5OiJiaXRseS5jb20iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMTUwIjtpOjE7czoxODoiaHR0cF9lcXVpdl9yZWZyZXNoIjt9fXM6MTI6InByZWdfcmVwbGFjZSI7YTozOntpOjA7aToxMDtzOjE0OiJwcmVnX3JlcGxhY2UoJCI7YToyOntpOjA7aToxMDtzOjc6InN0cnRyKCQiO2E6Mjp7aTowO2k6MTA7czoxNDoiJyVzJScuc3Vic3RyKCQiO2E6Mjp7aTowO3M6MjM6ImluamVjdGVkLmpzX21hbHdhcmUuMDExIjtpOjE7czoxNjQ6In5cJFtcd10rW1xzXSo9W1xzXSonW1x3XXszMn0nO1tcc10qKFwkW1x3XStbXHNdKj1bXHNdKidbXiddKyc7W1xzXSopezMsfVwkW1x3XStbXHNdKj1bXHNdKiclcyUnXC5zdWJzdHJcKFwkW147XStcKTtbXHNdKlwkW1x3XStbXHNdKj1bXHNdKnByZWdfcmVwbGFjZVteO10rXCk7W1xzXSp+Ijt9fX1zOjEzOiJwcmVnX3JlcGxhY2UoIjthOjI6e2k6MDtzOjI1OiJiYWNrZG9vci5wcmVnX3JlcGxhY2UuMDAxIjtpOjE7aToxMTt9fXM6MTI6ImZyb21DaGFyQ29kZSI7YTo0OntpOjA7aToxMDtzOjg6IisgYXRvYigiIjthOjI6e2k6MDtpOjEwO3M6NjM6IiIuc3BsaXQoJyAnKS5tYXAoKGUpPT57cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoZSl9KS5qb2luKCcnKSI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuanNfYXBwZW5kQ2hpbGQuMDEyIjtpOjE7czoxNzg6In4odmFyIFtcd10rW1xzXSo9W1xzXSpbXjtdKztbXHNdKikrW1x3XStbXHNdKlxbW1x3XStcXVwoW15cW10raWZbXHNdKlwoW1xzXSp0eXBlb2YgW1x3XStbXHNdKlxbW1x3XStcXVtcc10qPT1bXjxdK2Zyb21DaGFyQ29kZVwoLlwpXH1cKVwuam9pblwoLi5cKVteXH1dK1x9XH0sW1xzXSpbXlwpXStcKTtbXHNdKn4iO319czo0OToifTwvc3R5bGU+PGRpdiBzdHlsZT0idmlzaWJpbGl0eTpoaWRkZW47YW5pbWF0aW9uOiI7YToyOntpOjA7aToxMDtzOjIyOiJvbmFuaW1hdGlvbnN0YXJ0PSJ2YXIgIjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjE1MiI7aToxO3M6MTY3OiJ+PHN0eWxlPkAtd2Via2l0LWtleWZyYW1lcyBbXjxdK1x9PC5zdHlsZT48ZGl2IHN0eWxlPSJ2aXNpYmlsaXR5OmhpZGRlbjthbmltYXRpb246IFteIl0rIltePD5dK29uYW5pbWF0aW9uc3RhcnQ9InZhciBcdys9XFtbXiJdK2Zyb21DaGFyQ29kZVteIl0rcGFyc2VJbnRbXiJdKyI+PC5kaXY+fiI7fX1zOjE1NDoiMTIwLCA0NiwgMTE1LCAxMDEsIDExMCwgMTAwLCA0MCwgNDEsIDU5LCAxMCwgMzIsIDMyLCAxMjUsIDEwLCAzMiwgMzIsIDEwMywgMTAxLCAxMTYsIDY3LCAxMTEsIDEwMCwgMTAxLCA0MCwgNDEsIDU5LCAxMCwgMTAsIDEyNSwgNDEsIDQwLCA0MSwgNTksIDEwLCAxMCkpOyI7YToyOntpOjA7czoyMToiaW5qZWN0ZWQuc3BhbS1zZW8uMDIyIjtpOjE7czo1MzoifjxpbWcgc3JjW147XSs0MSwgNTksIDEwLCAxMFwpXCk7W1xzXSpbXHddK1woXCk7Py4uPn4iO319czoxNjoiPGRpdiBjbGFzcz0nZGMnPiI7YToyOntpOjA7aToxMDtzOjEzOiI8YSBocmVmPSJodHRwIjthOjI6e2k6MDtpOjEwO3M6MTY6InRhcmdldD0iX2JsYW5rIj4iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLnNwYW0tc2VvX2xpbmsuMDEwIjtpOjE7aToxMTt9fX1zOjU6ImNvZGUoIjthOjI6e2k6MDtpOjEwO3M6NToiNjRfZGUiO2E6Mjp7aTowO2k6MTA7czo1MjoiRFFvTkNtbG1LQ0FvYzNSeWNHOXpLQ1JmVTBWU1ZrVlNXeWRTUlZGVlJWTlVYMVZTU1NkZCI7YToyOntpOjA7czoyNDoiYmFja2Rvb3IuZXZhbF9iYXNlNjQuMDE4IjtpOjE7aToxMTt9fX1zOjc6InRwaXJjczwiO2E6Mjp7aTowO2k6MTA7czoxNzoiKXooZXRpcncudG5lbXVjb2QiO2E6Mjp7aTowO3M6MzE6ImluamVjdGVkLmpzX2NyZWF0ZV9kb2N1bWVudC4wMjYiO2k6MTtzOjExNToifj50cGlyY3NcLzxccyo7XHMqXClccyooXHcrKVxzKlwoXHMqZXRpcndcLnRuZW11Y29kXHMqO1xzKlwpW14+XStcMVxzKj1ccypcdytccypyYXZccyo7XHMqXClccypdW14+XSs+W148XSt0cGlyY3M8fiI7fX1zOjQ6IiZsdDsiO2E6Mzp7aTowO2k6MTA7czozMToiZ3Q7Jmx0O2ltZyBzcmM9Imh0dHBzOi8vY291bnRlciI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xNjgiO2k6MTtzOjg4OiJ+Jmx0O1tcd10rW14+Jl0rKGZyZWVjb3VudGVyc3RhdC5jb218d2hlcmVkb3lvdWNvbWVmcm9tLm92aClbXiZdKyZndDtbXHNdKigmbHQ7LmEmZ3Q7KT9+Ijt9czo0NDoiK2kuYXRvYihvKTttLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHIsbSl9fSkiO2E6Mjp7aTowO3M6MjM6ImluamVjdGVkLmpzX21hbHdhcmUuMDE5IjtpOjE7czoxMTY6In4mbHQ7c2NyaXB0Jmd0O1teXH1dK3BhcmVudE5vZGVcLmluc2VydEJlZm9yZVwoW1x3XSssW1x3XStcKVx9XH1cKVtcc10qXCh3aW5kb3csZG9jdW1lbnQsW15cKV0rXCk7XCZsdDsuc2NyaXB0XCZndDt+Ijt9fXM6OToiJF9DT09LSUVbIjthOjI6e2k6MDtpOjEwO3M6OToiYXNzZXJ0KCJAIjthOjI6e2k6MDtzOjI0OiJiYWNrZG9vci5ldmFsX0NPT0tJRS4wMDIiO2k6MTtzOjcyOiJ+YXNzZXJ0XCguQGV2W15cKF0rXChiYXNbXlwoXStcKC5cJF9DT09LSUVcWy5bXHddKy5cXVwpXClcfFx8W1xkXSsuXCkuO34iO319czoxNzoiaWYgKGlzc2V0KCRfUE9TVFsiO2E6Mjp7aTowO2k6MTA7czoyMzoiZGllKCI8aDE+Tm90IEZvdW5kPC9oMT4iO2E6Mjp7aTowO3M6Mjk6ImhhY2t0b29sLk1vZFguYXV0aF9ieXBhc3MuMDAxIjtpOjE7aToxMTt9fXM6MTQ6IiJyZWRpcmVjdF91cmwiIjthOjI6e2k6MDtpOjEwO3M6MjE6ImJlbGF0ZXJiZXdhc3RoZXJlLmNvbSI7YToyOntpOjA7czoyOToiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4xNTMuMDIiO2k6MTtpOjExO319czo0OiJQQzl6IjthOjM6e2k6MDtpOjEwO3M6MjQ6In5eUEM5elkzSnBjSFFcK1BITmpjbWx3fiI7YToyOntpOjA7czoyMjoiaW5qZWN0ZWQuanNfYmFzZTY0LjAwNiI7aToxO2k6MTE7fXM6MjM6In5eUEM5emRIbHNaVDQ4YzJOeWFYQjB+IjthOjI6e2k6MDtzOjI1OiJpbmplY3RlZC5qc19iYXNlNjQuMDA2LjAyIjtpOjE7aToxMTt9fXM6MzoiPnpwIjthOjI6e2k6MDtzOjIzOiJpbmplY3RlZC5oaWRkZW4tZGl2LjAwNCI7aToxO3M6Mjc6In48ZGl2W14+XSo/PnpwXGQrcnE8L2Rpdj5+aSI7fXM6MTk6InJrX2N6eFYxZHYxVVRmRXJkUXkiO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLnJrX2NvbW1lbnQtZGl2LjAwMSI7aToxO3M6Nzc6In48IS0tIHJrX2N6eFYxZHYxVVRmRXJkUXkuWzAtOV0gLS0+Lio/PCEtLSBcL3JrX2N6eFYxZHYxVVRmRXJkUXkuWzAtOV0gLS0+fmlzIjt9czo3NjoiPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7ZmlsdGVyOmFscGhhKG9wYWNpdHk9MCk7b3BhY2l0eTowLjAwMTt6LWluZGV4OiI7YToyOntpOjA7czoyMzoiaW5qZWN0ZWQuaGlkZGVuLWRpdi4wMDciO2k6MTtzOjEwOToifjxkaXYgc3R5bGU9LnBvc2l0aW9uOmFic29sdXRlO2ZpbHRlcjphbHBoYVwob3BhY2l0eT0wXCk7b3BhY2l0eTowXC4wMDE7ei1pbmRleDpcZCs7Ij48YSBocmVmPS4rP2E+PFwvZGl2Pn5pcyI7fXM6MjI6IkdxZ1NzZE1WTjU4QlVlUTl6SFZFclMiO2E6Mjp7aTowO3M6MjM6ImluamVjdGVkLmhpZGRlbi1kaXYuMDA4IjtpOjE7czo3MjoifjxkaXYgaWQ9IkdxZ1NzZE1WTjU4QlVlUTl6SFZFclMiIHN0eWxlPSJwb3NpdGlvbjogYWJzb2x1dGU7Lio/PjxcL2Rpdj5+Ijt9czoyMzoiPGRpdiBjbGFzcz0iX2FsbF93cGxpbmsiO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLmFsbF93cGxpbmstZGl2LjAwMSI7aToxO3M6MTU1OiJ+PGRpdiBjbGFzcz0uX2FsbF93cGxpbmtfW14+XStzdHlsZT0ucG9zaXRpb246YWJzb2x1dGU7b3BhY2l0eTowLjAwMTtbXj5dKz4oW15cbl0rPGEgaHJlZltePF0rXHcrPC5hPikoW15cPl0rPC5kaXY+fFteXG5dK1xuXHMqPGEgaHJlZltePF0rXHcrPC5hPjwuZGl2Pil+cyI7fXM6Mjc6IjxkaXYgY2xhc3M9Il9hbGxfd3BsaW5rX25EOCI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuYWxsX3dwbGluay1kaXYuMDAyIjtpOjE7czo3NzoifjxkaXYgY2xhc3M9Ll9hbGxfd3BsaW5rX1tePl0rPig8YVxzKmhyZWYuLmh0dHAuLi5cdytbXj5dKz5bXjxdKzwuYT4pKzwuZGl2Pn4iO31zOjI0OiI8ZGl2IGNsYXNzPSJfYWxsX3dwbGlua18iO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLmFsbF93cGxpbmstZGl2LjAwMyI7aToxO3M6MTA5OiJ+PGRpdiBjbGFzcz0uX2FsbF93cGxpbmtfW14+XStzdHlsZT0ucG9zaXRpb246YWJzb2x1dGU7b3BhY2l0eTowLjAwMTtbXj5dKz4oW15cbl0rPGEgaHJlZltePF0rXHcrPC5hPik8LmRpdj5+Ijt9czoyNDoiPCEtLSB+fnNwb25zb3J+fiAtLT48ZGl2IjthOjI6e2k6MDtzOjIzOiJpbmplY3RlZC5oaWRkZW4tZGl2LjAwOSI7aToxO3M6NTQ6In48Li0tIC4uc3BvbnNvci4uIC0tPlteXH5dKjwuLS0gXH5cfnNwb25zb3JlZFx+XH4gLS0+fiI7fXM6MzU6ImhhdmUgdW5jYW5ueSBwb2tlbW9uIGdvIGhhY2sgb25saW5lIjthOjI6e2k6MDtzOjIxOiJpbmplY3RlZC5zcGFtLXNlby4wMDgiO2k6MTtzOjE1NDoifjxkaXZccypjbGFzcz0iKFx3KykiPmhhdmVccyp1bmNhbm55XHMqcG9rZW1vblxzKmdvXHMqaGFja1xzKm9ubGluZVtePF0rPGFccypocmVmPS5odHRwOi4ucG9rZW1vbmdvLWhhY2tvbmxpbmVbXj5dKz5wb2tlW148XSs8LmE+XHMqb3V0bGV0c1xzKltePF0rPC5kaXY+fiI7fXM6Mzg6Ino2ZUlRZktFRnMyaWQvQi9ydVJUblpZdVFJdjhabDVDaUx0aFgwIjthOjI6e2k6MDtzOjIzOiJoYWNrdG9vbC5jYy1zdGVhbGVyLjAzOSI7aToxO3M6Nzoifl4uKiR+cyI7fXM6MjE6IjxkaXYgc3R5bGU9InBvc2l0aW9uOiI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQuaGlkZGVuLXNwYW4uMDAxIjtpOjE7czoxOTA6In4oPzo8L3NwYW4+KT8rKD86PFwvcD5ccyopPysoPGRpdiBzdHlsZT0icG9zaXRpb246XHMqYWJzb2x1dGU7ICg/OmJvdHRvbTogMHB4OyApPyg/OmxlZnR8dG9wKTpccyotWzAtOV17NCx9cHhbXjw+XSo/Pig/ITxpbnB1dCkoPz5bXjxdKig/Oig/ITxcL2Rpdj4pKD8hPGRpdik8fCg/MSl8KSkqPFwvZGl2PilccyooPzo8cD4pPyt+aXMiO31zOjE5OiI8ZGl2IGlkPSdhbGl2aWxsZSc+IjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5hbGl2aWxsZV9oaWRkZW4tZGl2LjAwMSI7aToxO3M6MzI6In48ZGl2IGlkPSdhbGl2aWxsZSc+Lio/PFwvZGl2Pn5zIjt9czo0MzoiWydhdG9iJ10oRltYXS5zcGxpdCgnJykucmV2ZXJzZSgpLmpvaW4oJycpKSI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQuanNfcmVkaXJlY3QuMDAxIjtpOjE7czoxNjc6In5ccyo8c2NyaXB0W14+XSs+dmFyW15ce10rXHtbXj5dKz5cKDB4MUM0LFteOl0rOlwoXGQrLFxkKy4uLlwmXCZbXlwrXStcK1x3W147XSs7XHcrLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvblwoXClce2lmW15cIl0rXCJmYWxzZVwiXHMqW15cP10rXD96b25laWQ9W148XSs8LnNjcmlwdD5+Ijt9czoxNjoiPGRpdiBpZD0iZGl2X2lkXyI7YToyOntpOjA7czoyMzoiaW5qZWN0ZWQuaGlkZGVuLWRpdi4wMzIiO2k6MTtzOjExOToifjxkaXYgaWQ9ImRpdl9pZF9bXGRdKyI+W1xzXSooW14+XSs/PGEgaHJlZltePl0rPyhbakpdb3JkYW58W2pKXWVyc2V5KXxbY0NdZWFwfFtzU11hbGV8W14+XSs/PltePF0rPzwuYT4pK1tePl0rPzwuZGl2Pn4iO31zOjMyOiJhV1lvYVhOZllXUnRhVzRvS1NrZ2NtVjBkWEp1T3c9PSI7YToyOntpOjA7czoyNToiaGFja3Rvb2wud3BfY29uZmlnX2RiLjAwMiI7aToxO3M6Nzoifl4uKiR+cyI7fXM6NzoiLmpzP3ByPSI7YToyOntpOjA7czo0MzoiaW5qZWN0ZWQuc2VyaWFsaXphdGlvbi5zY3JpcHRfaW5qZWN0aW9uLjAwMiI7aToxO3M6MjQyOiJ+dmFyIF8weFthLWYwLTldKz1cW1teXF1dK2NyZWF0ZUVsZW1lbnRbXixdKyxbXixdK3NjcmlwdFteLF0rLFteLF0rb25sb2FkW14sXSssW14sXStzcmNbXixdKyxbXixdK2h0dHBzPzpbXixdK2pzXD9wcj1bXGRdK1teXF1dK2FwcGVuZENoaWxkW14+XSs/XClcXVwoc2NyaXB0XCk7fDxzY3JpcHQgc3JjPVteO10raHR0cHM/OlteO10rc2NcLmpzW147XSt0eXBlPVteO10rdGV4dC5qYXZhc2NyaXB0W14+XSs+PC5zY3JpcHQ+fiI7fXM6NTQ6IlhLamhpYnZsR2RqNVdkbTFUWjdsQ1pzVUdMcnh5WXNFR0x3aGlidmxHZGo1V2RtaENiaFpYWiI7YToyOntpOjA7czoyMDoiYmFja2Rvb3IuanNfZXZhbC4wMDYiO2k6MTtzOjcwOiJ+dmFyIFtcd19dKz0uLlteO10rWlhaLi47ZnVuY3Rpb25bXj9dK2V2YWwuW1x3X10rXChbXHdfXStcKFtcd19dKy4uLjt+Ijt9czoxODoidGhpc1siZXZhbCJdKCIlOil7IjthOjI6e2k6MDtzOjIwOiJiYWNrZG9vci5qc19ldmFsLjAwNyI7aToxO3M6MTMwOiJ+PHNjcmlwdD5ccyp0aGlzXFsiZXZhbFwiXVwoIiU6XClce1woLTdce1xeLSZbXjxdKzwyOCwtbTFcKzR5b1teXDtdKztmb3JcKEs9MTtccypbXiJdKyIiLi5yZXZlcnNlLi4uam9pblteXH1dK1x9XClcKTtccyo8LnNjcmlwdD5+Ijt9czo0NzoiUEhOamNtbHdkQ0J6Y21NOUltaDBkSEJ6T2k4dlkyUnVMbTVoWW14aFltVmxMbU4iO2E6Mjp7aTowO3M6MjM6Im1hbHdhcmUuY3J5cHRvbWluZXIuMDA1IjtpOjE7czo3OiJ+Xi4qJH5zIjt9czozMzoiSlNPTi5wYXJzZShkKCdhcG9oY2RpImF9c2hpX3hkYSJlIjthOjI6e2k6MDtzOjI5OiJpbmplY3RlZC5tYWdlbnRvX3Nob3BsaWZ0LjAwMSI7aToxO3M6Mjg4OiJ+PHNjcmlwdFxzKnR5cGU9LnRleHQuamF2YXNjcmlwdC4+Li5ccyo8XCFcW0NEQVRBXFtccypcIWZ1bmN0aW9uXChuLGUsaVwpXHtmdW5jdGlvblxzKi5cKG5cKVx7dmFyXHMqZT13aW5kb3dbXiJdKyJoY3RpbnMiW14iXSsiZ2prdGlwW147XSs7cmV0dXJuXHMqZVwmXCZbXjxdKzxbXj5dKz5uW14+XSs+bjtpZlwod2luZG93LkZpcmVidWdbXjpdKzpkOmFnZWJwW15cKV0rXClcKVwpLGFcKGwsSlNPTlteXFtdK1xbbixwb2V0W15cK10rXCtDUTlaS01EW15cKV0rXCk7XHMqLi5ccypcXVxdPjwuc2NyaXB0Pn4iO31zOjI2OiIpO307fSkobTRGW29dW3ZdLCdfb2t6Zmp0aSI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQuanNfcmVkaXJlY3QuMDA1IjtpOjE7czoxNzE6In48c2NyaXB0XHMqW14+XSs+dmFyXHMqXHcrPXdpbmRvdztmb3JbXj5dKz49XChcZCsuXHcrLFxkKy5cdytcKVw/W15cIl0rXCJJIjpbXlxbXStcW29cXVteXF9dK19cdysnLFxbJz09XHcrLi4udWwyZHU4MlteO10rOzwuc2NyaXB0PjxzY3JpcHRbXlxfXStcX29remZqdGlbXiJdKyI+PC5zY3JpcHQ+fiI7fXM6NDY6ImNsa3NpdGUuY29tL2FkU2VydmUvYmFubmVycz90aWQ9Nzk0NzlfMTI3NDgwXzciO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLmpzX3Vud2FudGVkX2Fkcy4wMDciO2k6MTtzOjEzNzoifjxzY3JpcHRccypkYXRhLWNmYXN5bmM9LmZhbHNlLlxzKnR5cGU9LnRleHQuamF2YXNjcmlwdC5ccypzcmM9Li4uXHcrLmNsa3NpdGUuY29tLmFkU2VydmVccyouYmFubmVycy50aWQ9Nzk0NzlfMTI3NDgwXzdbXiInXSsuPjwuc2NyaXB0Pn4iO31zOjIyOiJtb2Jpc2xhLmNvbS9ub3RpY2UucGhwIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjA2NiI7aToxO3M6MTAzOiJ+PHNjcmlwdFxzKmFzeW5jPS5hc3luYy5ccyp0eXBlPS50ZXh0LmphdmFzY3JpcHQuXHMqc3JjPS4uLlx3Ky5tb2Jpc2xhLmNvbS5ub3RpY2UucGhwW14iJ10rLj48LnNjcmlwdD5+Ijt9czozMjoiPCEtLSBCZWdpbiBDb29raWUgQ29uc2VudCBzY3JpcHQiO2E6Mjp7aTowO3M6Mjk6ImluamVjdGVkLmpzX2Nvb2tpZV9oaWphY2suMDAxIjtpOjE7czozNTg6In48XCEtLVxzKkJlZ2luXHMqQ29va2llW14+XSs+XHMqPHNjcmlwdFtePl0rPlxzKndpbmRvdy5jb29raWVjb25zZW50W14iXSsibWVzc2FnZSI6IlRoaXNccyp3ZWJzaXRlXHMqdXNlc1xzKmNvb2tpZXNbXiddKydcdystXHcrLVx3K1teJ10rJzs8LnNjcmlwdD5ccyo8c2NyaXB0XHN0eXBlPS5bXiciXSsiXHMqc3JjPS4uLlteXC9dK1wvbGlic1wvY29va2llW14+XSs+PC5zY3JpcHQ+XHMqPG5vc2NyaXB0PjxhXHMqaHJlZj1bIiddW14+XSs+KEVVXHMqKT9bQ2Ndb29raWVccypbQ2Ndb25zZW50XHMqW1NzXWNyaXB0PC5hPjwubm9zY3JpcHQ+XHMqXDxcIS0tXHMqRW5kXHMqQ29va2llXHMqQ29uc2VudFxzKnNjcmlwdFxzKi0tPn4iO31zOjE3MDoiY2hyKDY0KS5jaHIoMTAxKS5jaHIoMTE4KS5jaHIoOTcpLmNocigxMDgpLmNocig0MCkuY2hyKDk4KS5jaHIoOTcpLmNocigxMTUpLmNocigxMDEpLmNocig1NCkuY2hyKDUyKS5jaHIoOTUpLmNocigxMDApLmNocigxMDEpLmNocig5OSkuY2hyKDExMSkuY2hyKDEwMCkuY2hyKDEwMSkuY2hyKDQwKS4iO2E6Mjp7aTowO3M6MjE6ImJhY2tkb29yLmNocl9ldmFsLjAwMSI7aToxO3M6MjEzOiJ+XHtcJFx7XCRcdytccyo9W147XStjaHJcKDY0XClcLmNoclwoMTAxXClcLmNoclwoMTE4XClcLmNoclwoOTdcKVwuY2hyXCgxMDhcKVwuY2hyXCg0MFwpXC5jaHJcKDk4XClcLmNoclwoOTdcKVwuY2hyXCgxMTVcKVwuY2hyXCgxMDFcKVwuY2hyXCg1NFwpXC5jaHJcKDUyXClcLmNoclwoOTVcKVwuY2hyXCgxMDBcKVwuY2hyXCgxMDFcKVteO10rXH1cfShce1wkXHcrXH0pP34iO31zOjMyOiI4NmU2YTJlNzg4MGE5MjIzNDM2NDM4YjQxMmFmZDYyZCI7YToyOntpOjA7czoxNzoiYmFja2Rvb3IubW9keC4wMDEiO2k6MTtzOjc6In5eLiokfnMiO31zOjEyOiI9QCRfQ09PS0lFWyIiO2E6Mjp7aTowO3M6MjQ6ImJhY2tkb29yLmV2YWxfQ09PS0lFLjAwMSI7aToxO3M6NjI6In5cJFx3Kz1AXCRfQ09PS0lFXFsuXHcrLi47XHMqaWZbXkBdK0BcJF9DT09LSUVbXj5dK3BocGluZm8uLjt+Ijt9czoxMjoiPT0iKSwiLiIpfX17IjthOjI6e2k6MDtzOjE4OiJiYWNrZG9vci5zaGVsbC4wMDQiO2k6MTtzOjU2OiJ+XHtcJFx7XCRcdys9W14sXSssXCRcdytcKC5cdys9PS5cKSwuXC4uXClcfVx9XHtcJFx3K1x9fiI7fXM6MjY6IkhhVFJrIEZpbGUgTWFuYWdlcjwvdGl0bGU+IjthOjI6e2k6MDtzOjI0OiJoYWNrdG9vbC5maWxlbWFuYWdlci4wMDEiO2k6MTtzOjEwOToifjwucGhwXHMqc2V0X3RpbWVfbGltaXQuMC47W148XSs/ZWNobyAuPC5ET0NUWVBFIEhUTUw+W15ce10rP0hhVFJrIEZpbGUgTWFuYWdlci4rP3JldHVybiBcJGluZm87XHMqXH1ccypcPz5+cyI7fXM6MjQ6ImFkZCcpO2V4aXQ7fWVjaG8gJ3RydWUnOyI7YToyOntpOjA7czoxNzoiYmFja2Rvb3IuUE9TVC4wMDIiO2k6MTtzOjExNzoifmlmXChpc3NldFwoXCRfUE9TVFxbLlx3Ky5cXVwpXClce0BwcmVnX3JlcGxhY2VcKC4uLi5lLiwuZS4uLnZhbFwoXCRfUE9TVFxbLlx3Ky5cXVwpLixccy5hZGQuXCk7ZXhpdDtcfWVjaG8uLnRydWUuXDt+Ijt9czo0NToiR1YyWVd3b1ltRnpaVFkwWDJSbFkyOWtaU2duV201V2RWa3pVbkJpTWpSbll6IjthOjI6e2k6MDtzOjI0OiJiYWNrZG9vci5ldmFsX2Jhc2U2NC4wMDciO2k6MTtzOjExMToiflwkXHcrPS4uMTQyLi4uLjE0MS4uLi54NzMuLi4ueDY1Li4uLngzNi4uY2hyXCg1MlwpW14sXSssXCRcdytcKC5RR1YyWVd3b1ltRnpaVFkwWDJSbFkyOWtaU2duV21bXiJdKyJcKSwuLi5cKTt+Ijt9czozODoicldtZ3NKZzMyZnZsNkJzeEltUCtKTFo5MjdURU5acUJrZnkyUnciO2E6Mjp7aTowO3M6MTk6ImJhY2tkb29yLnN1YnN0ci4wMDIiO2k6MTtzOjEyOToiflwkXHcrPS5yV21nc0pnMzJmdmw2QnN4SW1QW149XSs9PS47XCR4Llx3K1xzKj1ccyouc3RyLi4uLnJvdFteXH1dK1x9XH1ccyppZlwoaXNzZXRcKFwkXHcrXClcKVxzKlx7XHMqXCRcdytccyo9XHMqdGVtcG5hbVtefV0rXH1+Ijt9czo4NzoiZURSbVhIZzBNbCB4NE5ERmNlRFJqIFhIZzFNeUo5V3kgSmNlRGMzWEhnMyBNVng0TmpkY2VEIFl6WWx4NE5tTWkgWFQwaWEyVjVJaiB0bWIzSmxZV05vIjthOjI6e2k6MDtzOjIzOiJiYWNrZG9vci5vYmZ1c2NhdGVkLjAwMSI7aToxO3M6MTYwOiJ+UEQ5d2FIQWdKSFsoPzpcd1xzKildK2VEUm1YSGcwTWxccyp4NE5ERmNlRFJqXHMqWEhnMU15SjlXeVxzKkpjZURjM1hIZzNccypNVng0TmpkY2VEXHMqWXpZbHg0Tm1NaVxzKlhUMGlhMlY1SWpccyp0bWIzSmxZV05vWyg/Olx3XHMqKV0rWEhnMk5DSmRLVFxzKnQ5ZlEwS1B6ND1+Ijt9czo5ODoiU0dWbWFsZHBORyBwWE5IVkxlSFpsIFFUWjFaRUpKZGwgTkpjMHRaYm13eCBWVnBqTTFCd1prIHRNTDFodFdtcEcgUkhjdlUwZG5hVyB4b1owSnhOSHA1IFowbEllWEJ4VVUiO2E6Mjp7aTowO3M6MjM6ImJhY2tkb29yLm9iZnVzY2F0ZWQuMDAyIjtpOjE7czoyOTE6In5QRDl3YUhBZ0pFWyg/Olx3XHMqKV0rU0dWbWFsZHBOR1xzKnBYTkhWTGVIWmxccypRVFoxWkVKSmRsXHMqTkpjMHRaYm13eFxzKlZWcGpNMUJ3Wmtccyp0TUwxaHRXbXBHXHMqUkhjdlUwZG5hV1xzKnhvWjBKeE5IcDVccypaMGxJZVhCeFVVWyg/Olx3XHMqKV0rWjBiRTh5VjI5alxzKlF6WkNkVXMwU21ccyp4TVFVUnBaVEp4XHMqV0VNMVkxVkZVelxzKmd5VDFsSk5sbFBccyplRWt5YkZOTmR6XHMqVnFZMlpKUVhGU1xzKk55dHBUMlJRYmxccypwMkwzWldkbTlHWyg/Olx3XHMqKV0rSWpnM01TSXBPd1xzKj09fiI7fXM6NzE6IiZkYXRhPScuJGRhdGEuJycpOyAkY29kZSA9IGN1cmxfZXhlYygkY2gpOyBjdXJsX2Nsb3NlKCRjaCk7IGVjaG8gJGNvZGU7IjthOjI6e2k6MDtzOjE3OiJiYWNrZG9vci5jdXJsLjAwMSI7aToxO3M6MzIxOiJ+PFw/KD86cGhwKT9ccyooXCRcdyspXHMqPVxzKlsnIl1bXjtdKztccypmdW5jdGlvblxzKlx3K1woXClccypce1xzKmlmXHMqXChcKFwhW147XSs7XHMqfVxzKmVsc2VpZlxzKlwoXChcIVteXDJdK2Vsc2Vccypce1wkXHcrXHMqPVxzKlsnIl1bJyJdXHMqO1xzKn1ccypcJGNoXHMqPVxzKmN1cmxfaW5pdFxzKlwoXClccyo7XHMqY3VybF9zZXRvcHRcKFwkY2gsXHMqQ1VSTE9QVF9VUkwsXHMqWyciXWh0dHBbXlwyXSsoXCRcdyspXHMqPVxzKmN1cmxfZXhlY1woXCRjaFwpXHMqO1xzKmN1cmxfY2xvc2VcKFwkXHcrXClccyo7XHMqZWNob1xzKlwyXHMqO1xzKlw/Pn4iO31zOjIzOiIvd29yZHByZXNzJyk7IGV4aXQ7fSA/PiI7YToyOntpOjA7czoyMToiYmFja2Rvb3IuaW5jbHVkZXMuMDAxIjtpOjE7czoxMTA6In48XD9waHBccyppZlwoaXNzZXRcKFwkX1JFUVVFU1RcWy5cdysuXF1cKVwpXHMqe1xzKmluY2x1ZGVcKFsnIlwvXHddK3dvcmRwcmVzc1snIl1cKVxzKjtccypleGl0XHMqO1xzKn1ccypcPz5+Ijt9czoyNDoid2Vtb3ZlZHRvdGhpc2FkZHJlc3MuY29tIjthOjI6e2k6MDtzOjIxOiJpbmplY3RlZC5zcGFtLXNlby4wMDUiO2k6MTtzOjE3MjoifjxhXHMqaHJlZj0uaHR0cC4uLndlbW92ZWR0b3RoaXNhZGRyZXNzLmNvbS5jYXRhbG9nLltCYl1lc3RzZWxsZXJzLltWdl1pYWdyYS5cdysuPjxpbWdccypbXjpdKy4uLndlbW92ZWR0b3RoaXNhZGRyZXNzW14iXSsiXHMqYWx0W14+XSs+PC5hPlxzKjxoMj48c3Ryb25nPlxzKjwuc3Ryb25nPjwuaDI+fiI7fXM6Mjc6ImxlYWRwbGF5Lm1vYmkvP3RyYWNraW5nX2lkPSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWV0YV9yZWRpcmVjdC4wMDMiO2k6MTtzOjk5OiJ+PG1ldGFccypodHRwLWVxdWl2PS5yZWZyZXNoLlxzKmNvbnRlbnQ9LjE7VVJMPWh0dHBzOi4uKHd3dy4pbGVhZHBsYXkubW9iaS5cP3RyYWNraW5nX2lkPVteIl0rIi4uPn4iO31zOjIwOiJIYWNrZWQgQnkgTXVobWFkRW1hZCI7YToyOntpOjA7czoyMToiZGVmYWNlZC5oYWNrZWRfYnkuMDA4IjtpOjE7aToxMjt9czoxMDoiUjAwdFNMYXllciI7YToyOntpOjA7czoyMToiZGVmYWNlZC5oYWNrZWRfYnkuMDE1IjtpOjE7czoxMDQ6In5bME9vXXduWzNFZV1kXHMqW0JiXXlccyooLik/XHMqUjAwdFNMYXllclxzKiguKT9ccypbUHBdcml2YXRlaGFja2Vyc1wuY29tKFxzKiMrKT8oXHMqPGltZyBzcmM9W14+XSs+KT9+Ijt9czo1OToiPGltZyBzcmM9eCBvbmVycm9yPT48aW5wdXQgYXV0b2ZvY3VzIG9uZm9jdXM9Pjxzdmcvb25sb2FkPT4iO2E6Mjp7aTowO3M6MTY6ImluamVjdGVkLnhzcy4wMDEiO2k6MTtzOjU4OiJ+PGltZyBzcmM9eCBvbmVycm9yW14+XSs+W1xzXSo8aW5wdXRbXj5dKz5bXHNdKjxzdmdbXj5dKz5+Ijt9czoyNDoiPD9waHAgZmlsZV9wdXRfY29udGVudHMoIjthOjI6e2k6MDtzOjIxOiJiYWNrZG9vci51cGxvYWRlci4wMDIiO2k6MTtzOjI5OiJ+ZmlsZV9wdXRfY29udGVudHNcKFteO10rXCk7fiI7fXM6Mzk6ImFXWWdLQ0ZqYkdGemMxOWxlR2x6ZEhNb0oxSmhkR1ZzSnlrcElIdCI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQuYmFzZTY0X3dpZGdldC4wMDEiO2k6MTtpOjExO31zOjM0OiIvanMvZnVsbC1wYWdlLXNjcmlwdC5qcyc+PC9zY3JpcHQ+IjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5qc191bndhbnRlZF9hZHMuMDEzIjtpOjE7aToxMTt9czozMDoidmFyIGFTaXRlcyA9IG5ldyBBcnJheSgnZ29vZ2xlIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5qc191bndhbnRlZF9hZHMuMDAzIjtpOjE7aToxMTt9czo1ODoidG9VcmwrPSIiOyBpZihwYXRybi5leGVjKHJVcmwpKXdpbmRvdy5sb2NhdGlvbi5ocmVmPXRvVXJsOyI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQuanNfcmVkaXJlY3QuMDAzIjtpOjE7aToxMTt9czoyMjoiZnVuY3Rpb24gY2xrKCl7dmFyIF8weCI7YToyOntpOjA7czozMToiaW5qZWN0ZWQuanNfY3JlYXRlX2Z1bmN0aW9uLjAxMCI7aToxO2k6MTE7fXM6NDI6Im0rPVN0cmluZy5mcm9tQ2hhckNvZGUocy5jaGFyQ29kZUF0KGkpLTEpOyI7YToyOntpOjA7czoyMzoiaGFja3Rvb2wuY2Mtc3RlYWxlci4wMzAiO2k6MTtpOjExO31zOjIzOiJzZW5kOmZ1bmN0aW9uKCl7dHJ5e3ZhciI7YToyOntpOjA7czozMToiaW5qZWN0ZWQuanNfY3JlYXRlX2Z1bmN0aW9uLjAxMSI7aToxO2k6MTE7fXM6Mzk6Int0b3AubG9jYXRpb24gPSAnaHR0cHM6Ly91bHRyYWZpbGVzLmNvLyI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQuanNfcmVkaXJlY3QuMDA0IjtpOjE7aToxMTt9czo3OiJzdHJ0cigkIjthOjI6e2k6MDtzOjE5OiJiYWNrZG9vci5zdWJzdHIuMDAxIjtpOjE7aToxMTt9czo4OiJzeXN0ZW0oJyI7YToyOntpOjA7czoxOToiYmFja2Rvb3Iuc3lzdGVtLjAwMSI7aToxO2k6MTE7fXM6NzoiYXNzZXJ0KCI7YToyOntpOjA7czoxOToiYmFja2Rvb3IuYXNzZXJ0LjAwMSI7aToxO2k6MTE7fXM6NTA6Ij0gcHJlZ19yZXBsYWNlKCRhcywgc3RydHIoJHZiZywgJHhtbCwgJHhtbDIpLCAnY3NzIjthOjI6e2k6MDtzOjI1OiJiYWNrZG9vci5wcmVnX3JlcGxhY2UuMDAyIjtpOjE7aToxMTt9czoyNDoiPXByZWdfcmVwbGFjZSgkZixzdHJ0cigkIjthOjI6e2k6MDtzOjI1OiJiYWNrZG9vci5wcmVnX3JlcGxhY2UuMDAzIjtpOjE7aToxMTt9czo1NjoiJGNvbnRlbnQgPSBwcmVnX3JlcGxhY2UoJyE8L2JvZHk+IXNpJywgJGNvZGUgLiAnPC9ib2R5PiciO2E6Mjp7aTowO3M6MjU6ImJhY2tkb29yLnByZWdfcmVwbGFjZS4wMDQiO2k6MTtpOjExO31zOjQ3OiIkZGF0YT1NT0R4IENhY2hlIERhdGEgKGRvbnQgY2hhbmdlKTt0ZXh0O2V5SnRaWCI7YToyOntpOjA7czoyNDoiaGFja3Rvb2wuZmlsZW1hbmFnZXIuMDA2IjtpOjE7aToxMTt9czoyMjoiaWYgKHN0cnBvcyAoJHJlZiwgJ2cnLiI7YToyOntpOjA7czoxOToiYmFja2Rvb3Iuc3RycG9zLjAwMiI7aToxO2k6MTE7fXM6NDg6IkBlcnJvcl9yZXBvcnRpbmcoMCk7IEBzZXRfdGltZV9saW1pdCgwKTsgICAkY29kZSI7YToyOntpOjA7czoxNzoiYmFja2Rvb3IuZXZhbC4wMDQiO2k6MTtpOjExO31zOjM0OiJpZiggJF9QT1NUWydfdXBsJ10gPT0gIlVwbG9hZCIgKSB7IjthOjI6e2k6MDtzOjI0OiJoYWNrdG9vbC5maWxlbWFuYWdlci4wMDUiO2k6MTtpOjExO31zOjE3OiI8dGl0bGU+TWlzdGVyIFNweSI7YToyOntpOjA7czoyNDoiaGFja3Rvb2wuZmlsZW1hbmFnZXIuMDA3IjtpOjE7aToxMTt9czoyMjoiJF9QT1NUWydwYXNzd29yZCddID09ICI7YToyOntpOjA7czoyNDoiaGFja3Rvb2wuZmlsZW1hbmFnZXIuMDA0IjtpOjE7aToxMTt9czoyNDoiZmlsZV9nZXRfY29udGVudHMoJ2h0dHA6IjthOjI6e2k6MDtzOjI0OiJoYWNrdG9vbC5maWxlbWFuYWdlci4wMDMiO2k6MTtpOjExO31zOjUwOiJpZiAoc3RycG9zKCRfU0VSVkVSWydQSFBfU0VMRiddLCdzdWJzY3JpcHRpb25zLnBocCI7YToyOntpOjA7czoxOToiYmFja2Rvb3Iuc3RycG9zLjAwMSI7aToxO2k6MTE7fXM6MjM6ImlmKGlzc2V0KCRfUkVRVUVTVFsneCddIjthOjI6e2k6MDtzOjIwOiJiYWNrZG9vci5SRVFVRVNULjAwMSI7aToxO2k6MTE7fXM6Mjk6IlNFTEVDVCBgY29kZWAgRlJPTSBgd3BfY29uZmlnIjthOjI6e2k6MDtzOjI1OiJoYWNrdG9vbC53cF9jb25maWdfZGIuMDAxIjtpOjE7aToxMTt9czo1OiJIbWVpNyI7YToyOntpOjA7czoyMzoiaW5qZWN0ZWQuaGlkZGVuLWRpdi4wMTIiO2k6MTtpOjExO31zOjY6ImFyZ2FpdiI7YToyOntpOjA7czoyMzoiaW5qZWN0ZWQuaGlkZGVuLWRpdi4wMTMiO2k6MTtpOjExO31zOjY6InNpbGFpYyI7YToyOntpOjA7czoyMzoiaW5qZWN0ZWQuaGlkZGVuLWRpdi4wMTQiO2k6MTtpOjExO31zOjg6ImVsaXRjZXJlIjthOjI6e2k6MDtzOjIzOiJpbmplY3RlZC5oaWRkZW4tZGl2LjAxNSI7aToxO2k6MTE7fXM6OToiZWNuZXRvcG1pIjthOjI6e2k6MDtzOjIzOiJpbmplY3RlZC5oaWRkZW4tZGl2LjAxNiI7aToxO2k6MTE7fXM6ODoieWNhbXJhaHAiO2E6Mjp7aTowO3M6MjM6ImluamVjdGVkLmhpZGRlbi1kaXYuMDE3IjtpOjE7aToxMTt9czo2OiJ5YWR5YXAiO2E6Mjp7aTowO3M6MjM6ImluamVjdGVkLmhpZGRlbi1kaXYuMDE4IjtpOjE7aToxMTt9czoxNDoiZXRpcncudG5lbXVjb2QiO2E6Mjp7aTowO3M6MjM6ImluamVjdGVkLmhpZGRlbi1kaXYuMDE5IjtpOjE7aToxMTt9czo2OiI0NmVzYWIiO2E6Mjp7aTowO3M6MjM6ImluamVjdGVkLmhpZGRlbi1kaXYuMDIwIjtpOjE7aToxMTt9czoxMjoiZWNhbHBlcl9nZXJwIjthOjI6e2k6MDtzOjIzOiJpbmplY3RlZC5oaWRkZW4tZGl2LjAyMSI7aToxO2k6MTE7fXM6OToiZXRhbGZuaXpnIjthOjI6e2k6MDtzOjIzOiJpbmplY3RlZC5oaWRkZW4tZGl2LjAyMiI7aToxO2k6MTE7fXM6MTE6ImFsX2tpX3NoZWxsIjthOjI6e2k6MDtzOjIzOiJpbmplY3RlZC5oaWRkZW4tZGl2LjAyMyI7aToxO2k6MTE7fXM6NjoiTENXRUhIIjthOjI6e2k6MDtzOjIzOiJpbmplY3RlZC5oaWRkZW4tZGl2LjAyNCI7aToxO2k6MTE7fXM6MTY6InB0dGgiPWNycyB0cGlyY3MiO2E6Mjp7aTowO3M6MjM6ImluamVjdGVkLmhpZGRlbi1kaXYuMDI1IjtpOjE7aToxMTt9czo1OiJ1Z2djOiI7YToyOntpOjA7czoyMzoiaW5qZWN0ZWQuaGlkZGVuLWRpdi4wMjYiO2k6MTtpOjExO31zOjEyOiJtb2MubmliZXRzYXAiO2E6Mjp7aTowO3M6MjM6ImluamVjdGVkLmhpZGRlbi1kaXYuMDI5IjtpOjE7aToxMTt9czo2ODoiVFVWVVFTQm9kSFJ3TFdWeGRXbDJQU0p5WldaeVpYTm9JaUJqYjI1MFpXNTBQU0l3TzN0bWNtRnRaVjkxY214OUlqNEsiO2E6Mjp7aTowO3M6MjM6ImluamVjdGVkLmhpZGRlbi1kaXYuMDMwIjtpOjE7aToxMTt9czo2OiJTRW9ET1IiO2E6Mjp7aTowO3M6MjE6ImluamVjdGVkLnNwYW0tc2VvLjAxMyI7aToxO2k6MTE7fXM6MTA6InBhc3N0aHJ1KCQiO2E6Mjp7aTowO3M6MjE6ImhhY2t0b29sLnBhc3N0aHJ1LjAwMSI7aToxO2k6MTE7fXM6MTY6Imh0dHAub3BlbigiUE9TVCIiO2E6Mjp7aTowO3M6MTc6ImJhY2tkb29yLlBPU1QuMDAxIjtpOjE7aToxMTt9czoyNToiZGVidWcoJ0hPT0sgLSBhZGRfcmVrbGFtYSI7YToyOntpOjA7czoxODoiYmFja2Rvb3Iuc2hlbGwuMDAxIjtpOjE7aToxMTt9czo3OiJTSEVMTCc+IjthOjI6e2k6MDtzOjE4OiJiYWNrZG9vci5zaGVsbC4wMDIiO2k6MTtpOjExO31zOjI4OiJQcm9kdWN0IEtleTwvYT4mbmJzcDsmbmJzcDt8IjthOjI6e2k6MDtzOjIxOiJpbmplY3RlZC5zcGFtLXNlby4wMDEiO2k6MTtpOjExO31zOjIxOiJQcm9kdWN0IEtleSBHZW5lcmF0b3IiO2E6Mjp7aTowO3M6MjE6ImluamVjdGVkLnNwYW0tc2VvLjAwMiI7aToxO2k6MTE7fXM6MTQ6Im1vYy5uaWJldHNhcC8vIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjAwMSI7aToxO2k6MTE7fXM6MzE6ImJkdi5iaWR2ZXJ0aXNlci5jb20vQmlkVmVydGlzZXIiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDAyIjtpOjE7aToxMTt9czo0MDoicCsnd3d3LndlYnV0YXRpb24ubmV0L2pzL2xvYWRfYmFkZ2UuanMnOyI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wMDMiO2k6MTtpOjExO31zOjE3OiJvbmxpbmUtc2FsZTI0LmNvbSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wMDQiO2k6MTtpOjExO31zOjEyOiJlY2xrc3Bibi5jb20iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDA1IjtpOjE7aToxMTt9czoyNDoiYWRzaGV4YS5jb20vc2hvd19hZHMucGhwIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjAwNiI7aToxO2k6MTE7fXM6MTU6ImxvZ2lzdGljdXNhLmJpeiI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wMDciO2k6MTtpOjExO31zOjMwOiJha2FtYWloZC5uZXQvbG9hZGVycy8xMDMyL2wuanMiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDA4IjtpOjE7aToxMTt9czoxNjoiLWJpbmFyeS1vcHRpb25zLSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wMDkiO2k6MTtpOjExO31zOjE2OiJzZW5kaW5nLW1vbmV5LXRvIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjAxMCI7aToxO2k6MTE7fXM6MTQ6ImFkU2VydmUvYmFubmVyIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tYWxpY2lvdXNfVVJMLjAxMSI7aToxO2k6MTE7fXM6MTU6InNyYz0nLy9lY2xrbXBzYSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wMTIiO2k6MTtpOjExO31zOjE3OiJzcmM9Ii8vZ28ubW9iaXNsYSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wMTMiO2k6MTtpOjExO31zOjE3OiJzcmM9Ii8vZ28ucHViMnNydiI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wMTQiO2k6MTtpOjExO31zOjk6ImMwNTk0LmNvbSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wMTUiO2k6MTtpOjExO31zOjIzOiJqcy9nb29nbGUtc2VydmljZXMucGhwPyI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wMTYiO2k6MTtpOjExO31zOjI2OiJyZXN0d3AubW9iaWRlYS5jb20vanNyZWRpciI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQubWFsaWNpb3VzX1VSTC4wMTciO2k6MTtpOjExO31zOjI0OiJ3ZWJkYXRhc291cmNldHJhZmZpYy54eXoiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDE4IjtpOjE7aToxMTt9czoyNjoidGhlbWUtaW5kZXgucGhwIj48L3NjcmlwdD4iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDE5IjtpOjE7aToxMTt9czozMjoibWFnZW50b19nb29naWVwbGF5LmpzIj48L3NjcmlwdD4iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLm1hbGljaW91c19VUkwuMDIwIjtpOjE7aToxMTt9czo2MzoibWV0YSBodHRwLWVxdWl2PSJyZWZyZXNoIiBjb250ZW50PSIwO1VSTD1odHRwOi8vbWlxaXoudm9sdXVtdHJrIjthOjI6e2k6MDtzOjIxOiJpbmplY3RlZC5tZXRhX3RhZy4wMDEiO2k6MTtpOjExO31zOjE3OiJGUkVFIEdpZnQhPC9zcGFuPiI7YToyOntpOjA7czoyMToiaW5qZWN0ZWQuc3BhbS1zZW8uMDAzIjtpOjE7aToxMTt9czozMzoic2NyaXB0IHNyYz0iaHR0cHM6Ly9qcXVlcnktY3NzLnN1IjthOjI6e2k6MDtzOjI0OiJpbmplY3RlZC5mYWtlX2pxdWVyeS4wMDEiO2k6MTtpOjExO31zOjIwOiJUb3JyZW50IERvd25sb2FkPGJyPiI7YToyOntpOjA7czoyMToiaW5qZWN0ZWQuc3BhbS1zZW8uMDA0IjtpOjE7aToxMTt9czoxNToiaW1hZ2VzL3dlbGNvbWVfIjthOjI6e2k6MDtzOjE4OiJpbmplY3RlZC5pbWFnZS4wMDEiO2k6MTtzOjM5OiJ+KC4uKS5cdytcL2ltYWdlc1wvd2VsY29tZV8yMDFcZCtcLnBuZ34iO31zOjQwOiJjb250ZW50PSIwO1VSTD1odHRwOi8veGdlbmNhc2xhbm4uZXN5LmVzIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tZXRhX3JlZGlyZWN0LjAwMSI7aToxO2k6MTE7fXM6NTY6Im1ldGEgaHR0cC1lcXVpdj0mcXVvdDtyZWZyZXNoJnF1b3Q7IGNvbnRlbnQ9JnF1b3Q7MDtVUkw9IjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5tZXRhX3JlZGlyZWN0LjAwMiI7aToxO2k6MTE7fXM6MjM6Ii9pYy5qcyI+PC9zY3JpcHQ+SEFDS0VEIjthOjI6e2k6MDtzOjIxOiJkZWZhY2VkLmhhY2tlZF9ieS4wMDEiO2k6MTtpOjExO31zOjk6IkhBQ0tFRCBCWSI7YToyOntpOjA7czoyMToiZGVmYWNlZC5oYWNrZWRfYnkuMDAyIjtpOjE7aToxMTt9czo5OiJIYWNrZWQgQnkiO2E6Mjp7aTowO3M6MjE6ImRlZmFjZWQuaGFja2VkX2J5LjAwMyI7aToxO2k6MTE7fXM6MTc6Ijx0aXRsZT5IYWNrZWQ/IE1yIjthOjI6e2k6MDtzOjIxOiJkZWZhY2VkLmhhY2tlZF9ieS4wMDQiO2k6MTtpOjExO31zOjEzOiI8dGl0bGU+SGFja2VkIjthOjI6e2k6MDtzOjIxOiJkZWZhY2VkLmhhY2tlZF9ieS4wMDUiO2k6MTtpOjExO31zOjEzOiI8dGl0bGU+SEFDS0VEIjthOjI6e2k6MDtzOjIxOiJkZWZhY2VkLmhhY2tlZF9ieS4wMDYiO2k6MTtpOjExO31zOjk6IkhBQ0tFRCBCeSI7YToyOntpOjA7czoyMToiZGVmYWNlZC5oYWNrZWRfYnkuMDA3IjtpOjE7aToxMTt9czo5OiJIYUNrZUQgYnkiO2E6Mjp7aTowO3M6MjE6ImRlZmFjZWQuaGFja2VkX2J5LjAwOSI7aToxO2k6MTE7fXM6MTU6IiU2MSU2MyU2YiU2NSU2NCI7YToyOntpOjA7czoyMToiZGVmYWNlZC5oYWNrZWRfYnkuMDEwIjtpOjE7aToxMTt9czo1OiJpYWxpcyI7YTo5Mzp7aTowO2k6MTA7czoyMjoiTm8gUHJlc2NyaXB0aW9uIE5lZWRlZCI7YToyOntpOjA7aToxMDtzOjEyOiJjaWFsaXMgcHJpY2UiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2NpYWxpcy4wODIiO2k6MTtzOjc6In5eLiokfnMiO319czozNjoiQ2lhbGlzIE9ubGluZSBPdmVybmlnaHQgU2hpcHBpbmcgQnV5IjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19jaWFsaXMuMDg0IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjI1OiJDaWFsaXMgb3Zlcm5pZ2h0IGRlbGl2ZXJ5IjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19jaWFsaXMuMDg1IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjc6Ii1jaWFsaXMiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2NpYWxpcy4wMDEiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTU6IjFnZW5lcmljLWNpYWxpcyI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2lhbGlzLjAwMiI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNDoiYWNpYWxpc2ZvcnNhbGUiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2NpYWxpcy4wMDMiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTE6ImJidXktY2lhbGlzIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19jaWFsaXMuMDA0IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE3OiJiZXN0LWNpYWxpcy1wcmljZSI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2lhbGlzLjAwNSI7aToxO3M6OToic3BhbV9saW5rIjt9czoyMzoiYmVzdGNoZWFwLWNpYWxpcy1vbmxpbmUiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2NpYWxpcy4wMDYiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTA6ImJ1eSBjaWFsaXMiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2NpYWxpcy4wMDciO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTc6ImJ1eS1jaGVhcHAtY2lhbGlzIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19jaWFsaXMuMDA4IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE3OiJidXktY2lhbGlzLW9ubGluZSI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2lhbGlzLjAwOSI7aToxO3M6OToic3BhbV9saW5rIjt9czoyMDoiYnV5LWNpYWxpcy1vbmxpbmUtZWQiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2NpYWxpcy4wMTAiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTE6ImJ1eS1jaWFsaXNzIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19jaWFsaXMuMDExIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIwOiJidXljaGVhcGNpYWxpc29ubGluZSI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2lhbGlzLjAxMiI7aToxO3M6OToic3BhbV9saW5rIjt9czo5OiJidXljaWFsaXMiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2NpYWxpcy4wMTMiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTk6ImJ1eXNvZnRjaWFsaXNvbmxpbmUiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2NpYWxpcy4wMTQiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTc6ImNjaWFsaXMtcHJpY2Uub3JnIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19jaWFsaXMuMDE1IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjExOiJjY2lhbGlzMjBtZyI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2lhbGlzLjAxNiI7aToxO3M6OToic3BhbV9saW5rIjt9czoxMzoiY2NpYWxpc29ubGluZSI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2lhbGlzLjAxNyI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNzoiLWNoZWFwZXN0LWNpYWxpcy0iO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2NpYWxpcy4wMTgiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTc6ImNoZWFwLWNpYWxpc2UuY29tIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19jaWFsaXMuMDE5IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE3OiJjaGVhcC1jaWFsaXNzLmNvbSI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2lhbGlzLjAyMCI7aToxO3M6OToic3BhbV9saW5rIjt9czoxOToiY2hlYXBwY2lhbGlzLW9ubGluZSI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2lhbGlzLjAyMSI7aToxO3M6OToic3BhbV9saW5rIjt9czo5OiJjaWFsaXMtMjAiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2NpYWxpcy4wMjIiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTE6ImNpYWxpcy1iZXN0IjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19jaWFsaXMuMDIzIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE3OiJjaWFsaXMtY2FuYWRhLmNvbSI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2lhbGlzLjAyNCI7aToxO3M6OToic3BhbV9saW5rIjt9czoyMToiY2lhbGlzLWdlbmVyaWMtZWQuY29tIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19jaWFsaXMuMDI1IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE5OiJjaWFsaXMtZ2VuZXJpY3MuY29tIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19jaWFsaXMuMDI2IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjI0OiJjaWFsaXMtb25saW5lLWl0YWxpYS5vcmciO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2NpYWxpcy4wMjciO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjM6ImNpYWxpcy1vbmxpbmUtcHJpY2UuY29tIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19jaWFsaXMuMDI4IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIzOiJjaWFsaXMtb25saW5lLXByaWNlLm5ldCI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2lhbGlzLjAyOSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxODoiY2lhbGlzLW9ubGluZXNhbGVzIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19jaWFsaXMuMDMwIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE1OiJjaWFsaXMtcGFzLWNoZXIiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2NpYWxpcy4wMzEiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTY6ImNpYWxpcy1waGFybS5jb20iO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2NpYWxpcy4wMzIiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTc6ImNpYWxpcy1waWxsc3MuY29tIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19jaWFsaXMuMDMzIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjEzOiJjaWFsaXMtcHJpY2VlIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19jaWFsaXMuMDM0IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE0OiJjaWFsaXMtcHJpY2VzcyI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2lhbGlzLjAzNSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxMjoiY2lhbGlzLXMuY29tIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19jaWFsaXMuMDM2IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjMyOiJjaWFsaXMtd2l0aG91dC1wcmVzY3JpcHRpb25zLm9yZyI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2lhbGlzLjAzNyI7aToxO3M6OToic3BhbV9saW5rIjt9czozMzoiY2lhbGlzLXdpdGhvdXR0LXByZXNjcmlwdGlvbnMuY29tIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19jaWFsaXMuMDM4IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjc6ImNpYWxpczEiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2NpYWxpcy4wMzkiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6NzoiY2lhbGlzYSI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2lhbGlzLjA0MCI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNDoiY2lhbGlzY2FuYWRhc3QiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2NpYWxpcy4wNDEiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTM6ImNpYWxpc29ubGluZWUiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2NpYWxpcy4wNDIiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjA6ImNpYWxpc29ubGluZW5vd2Uub3JnIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19jaWFsaXMuMDQzIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE0OiJjaWFsaXNvbmxpbmVvbiI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2lhbGlzLjA0NCI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNzoiY2lhbGlzb29ubGluZS5jb20iO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2NpYWxpcy4wNDUiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTM6ImNpYWxpc3ByaWNlYWEiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2NpYWxpcy4wNDYiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTI6ImNpYWxpc3ByaWNlZSI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2lhbGlzLjA0NyI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNjoiY2lhbGlzcy0yMG1nLmNvbSI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2lhbGlzLjA0OCI7aToxO3M6OToic3BhbV9saW5rIjt9czoxODoiY2lhbGlzcy1vbmxpbmUub3JnIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19jaWFsaXMuMDQ5IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjEzOiJjaWFsaXNzLXByaWNlIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19jaWFsaXMuMDUwIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjMyOiJjaWFsaXNzLXdpdGhvdXQtcHJlc2NyaXB0aW9uLmNvbSI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2lhbGlzLjA1MSI7aToxO3M6OToic3BhbV9saW5rIjt9czoyMjoiY2lhbGlzc3VwZXJhY3RpdmVlLmNvbSI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2lhbGlzLjA1MiI7aToxO3M6OToic3BhbV9saW5rIjt9czoyMjoiY29tcHJhcmUtY2lhbGlzLW9ubGluZSI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2lhbGlzLjA1MyI7aToxO3M6OToic3BhbV9saW5rIjt9czoxODoiZGNpYWxpc2ZvcnNhbGUuY29tIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19jaWFsaXMuMDU0IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE4OiJkY2lhbGlzZm9yc2FsZS5uZXQiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2NpYWxpcy4wNTUiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTg6ImUtb25saW5lY2lhbGlzLmNvbSI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2lhbGlzLjA1NiI7aToxO3M6OToic3BhbV9saW5rIjt9czoxODoiZS1vbmxpbmVjaWFsaXMubmV0IjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19jaWFsaXMuMDU3IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE1OiJnZW5lcmljLWNpYWxpc3MiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2NpYWxpcy4wNTgiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTc6ImdlbmVyaWNjaWFsaXNmYXN0IjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19jaWFsaXMuMDU5IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjM1OiJnZ2VuZXJpYy1jaWFsaXMtbm8tcHJlc2NyaXB0aW9uLmNvbSI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2lhbGlzLjA2MCI7aToxO3M6OToic3BhbV9saW5rIjt9czoyNzoibm9uLXByZXNjcmlwdGlvbi1jaWFsaXMuY29tIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19jaWFsaXMuMDYxIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIxOiJvbmxpbmVjaWFsaXNjaGVhcC5jb20iO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2NpYWxpcy4wNjIiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjE6Im9ubGluZWNpYWxpc2NoZWFwLm5ldCI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2lhbGlzLjA2MyI7aToxO3M6OToic3BhbV9saW5rIjt9czoxOToib25saW5lb3JkZXJjaWFsaXN1ayI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2lhbGlzLjA2NCI7aToxO3M6OToic3BhbV9saW5rIjt9czoyMDoib3JkZXItY2lhbGlzLW9ubGluZXEiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2NpYWxpcy4wNjUiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTM6Im9yZGVyLWNpYWxpc3MiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2NpYWxpcy4wNjYiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTY6Im9yZGVyY2hlYXBjaWFsaXMiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2NpYWxpcy4wNjciO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTc6Im9yZGVyci1jaWFsaXMub3JnIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19jaWFsaXMuMDY4IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjI5OiJwaGFybWFjaWUtZW4tbGlnbmUtY2lhbGlzLm9yZyI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2lhbGlzLjA2OSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNjoicGlsbHMtY2lhbGlzLmNvbSI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2lhbGlzLjA3MCI7aToxO3M6OToic3BhbV9saW5rIjt9czoyNzoicGxvY2lhLWNpYWxpcy10YWRhbGFmaWwuY29tIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19jaWFsaXMuMDcxIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE4OiJzYnV5aW5nLWNpYWxpcy5jb20iO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2NpYWxpcy4wNzIiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTg6InNidXlpbmctY2lhbGlzLm5ldCI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2lhbGlzLjA3MyI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNToidGhlY2hlYXAtY2lhbGlzIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19jaWFsaXMuMDc0IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE0OiJ2ZW5kaXRhLWNpYWxpcyI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2lhbGlzLjA3NSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNjoidmljaWFsaXNhYnV5LmNvbSI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2lhbGlzLjA3NiI7aToxO3M6OToic3BhbV9saW5rIjt9czozMDoiY2lhbGlzLWNhbmFkaWFuLW5vLXByZXNjaXB0aW9uIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19jaWFsaXMuMDc3IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjg6ImNpYWxpcy0wIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19jaWFsaXMuMDc4IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE4OiJvbmxpbmUgY2lhbGlzIDIwbWciO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2NpYWxpcy4wODMiO2k6MTtzOjc6In5eLiokfnMiO31zOjk6ImNpYWxpc21lZCI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2lhbGlzLjA3OSI7aToxO3M6MjY6In5jaWFsaXNtZWQuKj9jaWFsaXNcczVtZ35pIjt9czo0MToid2FsbWFydC1wcmljaW5nLWZvci1zdWJsaW5ndWFsLWNpYWxpcy1wcm8iO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2NpYWxpcy4wODEiO2k6MTtpOjExO31zOjc6ImdlbmVyaWMiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLnNwYW0tc2VvX2xpbmsuMDAxIjtpOjE7czoxNDoic3BhbV9saW5rX3RleHQiO31zOjU6InBpbGxzIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5zcGFtLXNlb19saW5rLjAwNiI7aToxO3M6MTQ6InNwYW1fbGlua190ZXh0Ijt9czo4OiIgY2lhbGlzICI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQuc3BhbS1zZW9fbGluay4wMDciO2k6MTtzOjE0OiJzcGFtX2xpbmtfdGV4dCI7fXM6NzoiPmNpYWxpcyI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQuc3BhbS1zZW9fbGluay4wMDgiO2k6MTtzOjE0OiJzcGFtX2xpbmtfdGV4dCI7fXM6NzoiY2FuYWRhPCI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQuc3BhbS1zZW9fbGluay4wMDkiO2k6MTtzOjE0OiJzcGFtX2xpbmtfdGV4dCI7fXM6MTA6ImJ1eSBDaWFsaXMiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLnNwYW0tc2VvX2xpbmsuMTA5IjtpOjE7czoxNDoic3BhbV9saW5rX3RleHQiO31zOjc6IkNpYWxpcyAiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2NpYWxpcy4wODAiO2k6MTtzOjE0OiJzcGFtX2xpbmtfdGV4dCI7fXM6MTM6ImNpYWxpc2dlbmVyaWMiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2NpYWxpcy4wODYiO2k6MTtzOjk6InNwYW1fbGluayI7fX1zOjU6ImlhZ3JhIjthOjI4OntpOjA7aToxMDtzOjU6Imh0dHA6IjthOjk6e2k6MDtpOjEwO3M6MzY6IiNpcy12aWFncmEtZGFuZ2Vyb3VzIHZpYWdyYSBnZW5lcmlrYSI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fdmlhZ3JhLjAzMSI7aToxO3M6Nzoifl4uKiR+cyI7fXM6MjA6InZpYWdyYSB2aWFncmEgb25saW5lIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb192aWFncmEuMDI1IjtpOjE7czo3OiJ+Xi4qJH5zIjt9czozNToiV2l0aG91dCBhIERvY3RvciBQcmVzY3JpcHRpb24sICA9LSkiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX3ZpYWdyYS4wMzAiO2k6MTtzOjc6In5eLiokfnMiO31zOjE0OiJWaWFncmEgU2FtcGxlcyI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fdmlhZ3JhLjAyOCI7aToxO3M6Nzoifl4uKiR+cyI7fXM6MjA6IkNoZWFwIFZpYWdyYSBUYWJsZXRzIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb192aWFncmEuMDI5IjtpOjE7czo3OiJ+Xi4qJH5zIjt9czo0MzoidmlhZ3JhIHBpbGxzWy9VUkwgLSAgZWFybHk7IHZpYWdyYSB0aGVyYXB5OyI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fdmlhZ3JhLjAzMiI7aToxO3M6Nzoifl4uKiR+cyI7fXM6MTk6ImdlbmVyaWMgdmlhZ3JhWy9VUkwiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX3ZpYWdyYS4wMzMiO2k6MTtzOjc6In5eLiokfnMiO31zOjE2OiJjaGVhcHZpYWdyYVsvVVJMIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb192aWFncmEuMDM0IjtpOjE7czo3OiJ+Xi4qJH5zIjt9fXM6MTQ6InZpYWdyYSB3aXRob3V0IjthOjI6e2k6MDtpOjEwO3M6MTg6InZpYWdyYSAyMG1nIG9ubGluZSI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fdmlhZ3JhLjAyNiI7aToxO3M6Nzoifl4uKiR+cyI7fX1zOjY6InZpYWdyYSI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fdmlhZ3JhLjAwMiI7aToxO3M6OToic3BhbV9saW5rIjt9czoxMjoiMC12aWFncmEuY29tIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb192aWFncmEuMDAzIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE4OiJhdmlhZ3JhZm9yc2FsZS5jb20iO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX3ZpYWdyYS4wMDQiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTE6ImNoZWFwdmlhZ3JhIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb192aWFncmEuMDA1IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE4OiJlLXZpYWdyYW9ubGluZS5jb20iO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX3ZpYWdyYS4wMDYiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTg6ImUtdmlhZ3Jhb25saW5lLm5ldCI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fdmlhZ3JhLjAwNyI7aToxO3M6OToic3BhbV9saW5rIjt9czoyMzoiZmVtYWxldmlhZ3JhYnV5c2FsZS5jb20iO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX3ZpYWdyYS4wMDgiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjE6Im9ubGluZXZpYWdyYWNoZWFwLmNvbSI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fdmlhZ3JhLjAwOSI7aToxO3M6OToic3BhbV9saW5rIjt9czoyMToib25saW5ldmlhZ3JhY2hlYXAubmV0IjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb192aWFncmEuMDEwIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIwOiJzb2Z0dmlhZ3Jhb25saW5lLmNvbSI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fdmlhZ3JhLjAxMSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNToic3ZpYWdyYXJidXkuY29tIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb192aWFncmEuMDEyIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIzOiJ2aWFncmEtb25saW5lLXByaWNlLmNvbSI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fdmlhZ3JhLjAxMyI7aToxO3M6OToic3BhbV9saW5rIjt9czoyMzoidmlhZ3JhLW9ubGluZS1wcmljZS5uZXQiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX3ZpYWdyYS4wMTQiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTM6InZpYWdyYWVubGlnbmUiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX3ZpYWdyYS4wMTUiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTE6InZpYWdyYWVzLmVzIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb192aWFncmEuMDE2IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjEzOiJ2aWFncmFmb3JzYWxlIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb192aWFncmEuMDE3IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIzOiJ2aWFncmFub3ByZXNjcmlwdGlvbi0xcyI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fdmlhZ3JhLjAxOCI7aToxO3M6OToic3BhbV9saW5rIjt9czoyMToid3d3LnZpYWdyYS1vdXRsZXQuY29tIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb192aWFncmEuMDE5IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjEwOiJidXkgdmlhZ3JhIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb192aWFncmEuMDI0IjtpOjE7czoxNDoic3BhbV9saW5rX3RleHQiO31zOjE3OiJ2aWFncmEgcGlsbHMgaHR0cCI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fdmlhZ3JhLjAyNyI7aToxO3M6Nzoifl4uKiR+cyI7fXM6NjY6InN0eWxlPSJoZWlnaHQ6IDBwdDt3aWR0aDogMHB0O3Bvc2l0aW9uOiBhYnNvbHV0ZTtvdmVyZmxvdzogYXV0bzsiPiI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fdmlhZ3JhLjAyMCI7aToxO3M6OTA6In48cFxzc3R5bGU9ImhlaWdodDogMHB0O3dpZHRoOiAwcHQ7cG9zaXRpb246IGFic29sdXRlO292ZXJmbG93OiBhdXRvOyI+Lio/dmlhZ3JhLio/PFwvcD5+aSI7fXM6MTM6InZpYWdyYWtvcGVubmwiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX3ZpYWdyYS4wMjEiO2k6MTtzOjI5OiJ+dmlhZ3Jha29wZW5ubCo/dmlhZ3JhLnNvZnR+aSI7fXM6MjM6InZpYWdyYSBnZW5lcmlrYSBzY2h3ZWl6IjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb192aWFncmEuMDM1IjtpOjE7czoxNDoic3BhbV9saW5rX3RleHQiO31zOjI5OiJzdHlsZT0iZGlzcGxheTpub25lIj48YSBocmVmPSI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQuaGlkZGVuLXNwYW4uMDAyIjtpOjE7czo2Mzoifjwoc3BhbnxpKSBzdHlsZT0iZGlzcGxheTpub25lIj48YSBocmVmPS4qP3ZpYWdyYS4qPzwvYT48L1wxPn5zIjt9czoxNDoidmlhZ3JhcGlsbC5jb20iO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX3ZpYWdyYS4wMjMiO2k6MTtpOjExO319czo1OiJlc3NheSI7YTozNzp7aTowO2k6MTA7czoyNDoiYXJndW1lbnRhdGl2ZWVzc2F5cGFwZXJzIjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5zcGFtLXNlb19lc3NheS4wMDEiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6Mjg6ImVzc2F5cHJvZmVzc2lvbmFsd3JpdGluZy5jb20iO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLnNwYW0tc2VvX2Vzc2F5LjAwMiI7aToxO3M6OToic3BhbV9saW5rIjt9czoyNDoiZXNzYXl3cml0aW5nc3NlcnZpY2UuY29tIjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5zcGFtLXNlb19lc3NheS4wMDMiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjE6ImVzc2F5d3JpdGluZ3NzZXJ2aWNlcyI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuc3BhbS1zZW9fZXNzYXkuMDA0IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIyOiJ3cml0ZWFuZXNzYXlmb3JtZWUuY29tIjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5zcGFtLXNlb19lc3NheS4wMDUiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MzE6ImJlc3QtZXNzYXktd3JpdGluZy1zZXJ2aWNlcy5jb20iO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLnNwYW0tc2VvX2Vzc2F5LjAwNiI7aToxO3M6OToic3BhbV9saW5rIjt9czoyNToicGF5c29tZW9uZXRvZG9teWVzc2F5LmNvbSI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuc3BhbS1zZW9fZXNzYXkuMDA3IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjI4OiJiZXN0ZXNzYXl3cml0aW5nc2VydmljZWUuY29tIjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5zcGFtLXNlb19lc3NheS4wMDgiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjE6ImJlc3Rlc3NheXNmb3JzYWxlLm5ldCI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuc3BhbS1zZW9fZXNzYXkuMDA5IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE1OiJidXllc3NheW5vdy5uZXQiO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLnNwYW0tc2VvX2Vzc2F5LjAxMCI7aToxO3M6OToic3BhbV9saW5rIjt9czoyNDoiYnV5ZXNzYXlzb25saW5lY2hlYXAubmV0IjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5zcGFtLXNlb19lc3NheS4wMTEiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTc6ImVzc2F5Y2FzdGxlLmNvLnVrIjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5zcGFtLXNlb19lc3NheS4wMTIiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTY6ImVzc2F5c3dyaXRlci5uZXQiO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLnNwYW0tc2VvX2Vzc2F5LjAxMyI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNToiZXNzYXl3aGFsZXMuY29tIjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5zcGFtLXNlb19lc3NheS4wMTQiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjQ6ImV4Y2VsbGVudGVzc2F5d3JpdGVyLmNvbSI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuc3BhbS1zZW9fZXNzYXkuMDE1IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE4OiJzdWNjZXNzZXNzYXkuY28udWsiO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLnNwYW0tc2VvX2Vzc2F5LjAxNiI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNDoidGVlbmVzc2F5cy5jb20iO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLnNwYW0tc2VvX2Vzc2F5LjAxNyI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNzoidHVyYm9lc3NheXMuY28udWsiO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLnNwYW0tc2VvX2Vzc2F5LjAxOCI7aToxO3M6OToic3BhbV9saW5rIjt9czoyNDoid3JpdGVteWVzc2F5b3JpZ2luYWwuY29tIjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5zcGFtLXNlb19lc3NheS4wMTkiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjI6IndyaXRpbmctaGVscC1lc3NheS5jb20iO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLnNwYW0tc2VvX2Vzc2F5LjAyMCI7aToxO3M6OToic3BhbV9saW5rIjt9czoxMzoiZXNzYXkgd3JpdGluZyI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuc3BhbS1zZW9fZXNzYXkuMDM2IjtpOjE7aToxMTt9czoxNDoid3JpdGUgbXkgZXNzYXkiO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLnNwYW0tc2VvX2Vzc2F5LjAzNyI7aToxO2k6MTE7fXM6ODoiZXNzYXk0bWUiO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLnNwYW0tc2VvX2Vzc2F5LjAzOCI7aToxO2k6MTE7fXM6MTk6ImNoZWFwIGVzc2F5IHdyaXRpbmciO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLnNwYW0tc2VvX2Vzc2F5LjAzOSI7aToxO2k6MTE7fXM6Mjk6ImVzc2F5IG9uIGN1c3RvbWVyIHNlcnZpY2U8L2E+IjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5zcGFtLXNlb19lc3NheS4wNDIiO2k6MTtpOjExO31zOjI1OiJ3cml0ZSBteSBwYXBlciBmb3IgbWU8L2E+IjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5zcGFtLXNlb19lc3NheS4wNDMiO2k6MTtpOjExO31zOjI4OiJodG1sIj5lc3NheWJpc29uLmNvbSB3cml0aW5nIjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5zcGFtLXNlb19lc3NheS4wMjEiO2k6MTtpOjExO31zOjE5OiJoZWxwIHdpdGggZXNzYXk8L2E+IjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5zcGFtLXNlb19lc3NheS4wNDQiO2k6MTtpOjExO31zOjIzOiJjdXN0b20gdW5pdmVyc2l0eSBlc3NheSI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuc3BhbS1zZW9fZXNzYXkuMDQ4IjtpOjE7aToxMTt9czoyMDoicGxhZ2lhcmlzbS1jaGVjay5vcmciO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLnNwYW0tc2VvX2Vzc2F5LjA0OSI7aToxO2k6MTE7fXM6MTU6ImRhcndpbmVzc2F5Lm5ldCI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuc3BhbS1zZW9fZXNzYXkuMDUwIjtpOjE7aToxMTt9czoxNjoicGF5Zm9ycGFwZXJzLm5ldCI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuc3BhbS1zZW9fZXNzYXkuMDUxIjtpOjE7aToxMTt9czoxNDoiPmVzc2F5IGVkaXRpbmciO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLnNwYW0tc2VvX2Vzc2F5LjA1NSI7aToxO2k6MTE7fXM6MTM6Ij5vbmxpbmUgZXNzYXkiO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLnNwYW0tc2VvX2Vzc2F5LjA1NiI7aToxO2k6MTE7fXM6MjM6Ij5wcm9kdWNlIG9ubGluZSB3cml0aW5nIjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5zcGFtLXNlb19lc3NheS4wNTciO2k6MTtpOjExO31zOjIzOiI+cmVwb3J0IGZvcm1hdCBleGFtcGxlPCI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuc3BhbS1zZW9fZXNzYXkuMDU4IjtpOjE7aToxMTt9fXM6MjoiPGEiO2E6MzE6e2k6MDtpOjEwO3M6NToiZXJzZXkiO2E6MTA6e2k6MDtpOjEwO3M6NToiY2hlYXAiO2E6Mjp7aTowO2k6MTA7czozOiJuZmwiO2E6Mzp7aTowO2k6MTA7czo4OiItamVyc2V5LSI7YToyOntpOjA7czoyOToiaW5qZWN0ZWQuc3BhbS1zZW9famVyc2V5cy4wMDkiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6ODoiX2plcnNleV8iO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2plcnNleXMuMDA5LjAyIjtpOjE7czo5OiJzcGFtX2xpbmsiO319fXM6MTI6ImNoZWFwIGplcnNleSI7YToyOntpOjA7czoyOToiaW5qZWN0ZWQuc3BhbS1zZW9famVyc2V5cy4wMDQiO2k6MTtzOjE0OiJzcGFtX2xpbmtfdGV4dCI7fXM6MTA6Im1sYiBqZXJzZXkiO2E6Mjp7aTowO3M6Mjk6ImluamVjdGVkLnNwYW0tc2VvX2plcnNleXMuMDA1IjtpOjE7czoxNDoic3BhbV9saW5rX3RleHQiO31zOjE2OiJ3aG9sZXNhbGUgamVyc2V5IjthOjI6e2k6MDtzOjI5OiJpbmplY3RlZC5zcGFtLXNlb19qZXJzZXlzLjAwNiI7aToxO3M6MTQ6InNwYW1fbGlua190ZXh0Ijt9czoxMDoibmZsIGplcnNleSI7YToyOntpOjA7czoyOToiaW5qZWN0ZWQuc3BhbS1zZW9famVyc2V5cy4wMDciO2k6MTtzOjE0OiJzcGFtX2xpbmtfdGV4dCI7fXM6MTA6Ik5GTCBqZXJzZXkiO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2plcnNleXMuMDA3LjAyIjtpOjE7czoxNDoic3BhbV9saW5rX3RleHQiO31zOjEwOiJuYmEgamVyc2V5IjthOjI6e2k6MDtzOjI5OiJpbmplY3RlZC5zcGFtLXNlb19qZXJzZXlzLjAwOCI7aToxO3M6MTQ6InNwYW1fbGlua190ZXh0Ijt9czoxMDoiTkJBIGplcnNleSI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9famVyc2V5cy4wMDguMDIiO2k6MTtzOjE0OiJzcGFtX2xpbmtfdGV4dCI7fXM6MzQ6In4ob2ZmaWNpYWx8YXV0aGVudGljfGxvY2tlcnxzaG9wKX4iO2E6Mjp7aTowO2k6MTA7czo4NToifmhyZWY9WyInXWh0dHAuLi4uW15cLz5dKyhvZmZpY2lhbHxhdXRoZW50aWN8bG9ja2VyfHNob3ApW15cLz5dK1wvW15ccz4iJ10rW2pKXWVyc2V5fiI7YToyOntpOjA7czoyOToiaW5qZWN0ZWQuc3BhbS1zZW9famVyc2V5cy4wMDIiO2k6MTtpOjExO319fXM6MTM6InJlbD0ibm9mb2xsb3ciO2E6MTE6e2k6MDtpOjEwO3M6MTQ6IjUwIE1nIEF0ZW5vbG9sIjthOjI6e2k6MDtzOjMzOiJpbmplY3RlZC5zcGFtLXNlb19hbnRpYmlvdGljcy4wMDUiO2k6MTtzOjE0OiJzcGFtX2xpbmtfdGV4dCI7fXM6OToiYnVwcm9waW9uIjthOjI6e2k6MDtzOjMzOiJpbmplY3RlZC5zcGFtLXNlb19hbnRpYmlvdGljcy4wMDYiO2k6MTtzOjE0OiJzcGFtX2xpbmtfdGV4dCI7fXM6MTc6IkF0ZW5vbG9sIE1lZGljaW5lIjthOjI6e2k6MDtzOjMzOiJpbmplY3RlZC5zcGFtLXNlb19hbnRpYmlvdGljcy4wMDciO2k6MTtzOjE0OiJzcGFtX2xpbmtfdGV4dCI7fXM6MTE6ImZpbmFzdGVyaWRlIjthOjI6e2k6MDtzOjMzOiJpbmplY3RlZC5zcGFtLXNlb19hbnRpYmlvdGljcy4wMDgiO2k6MTtzOjE0OiJzcGFtX2xpbmtfdGV4dCI7fXM6MTA6Imxpc2lub3ByaWwiO2E6Mjp7aTowO3M6MzM6ImluamVjdGVkLnNwYW0tc2VvX2FudGliaW90aWNzLjAwOSI7aToxO3M6MTQ6InNwYW1fbGlua190ZXh0Ijt9czoxMzoicHJvcGVjaWEgNSBtZyI7YToyOntpOjA7czozMzoiaW5qZWN0ZWQuc3BhbS1zZW9fYW50aWJpb3RpY3MuMDEwIjtpOjE7czoxNDoic3BhbV9saW5rX3RleHQiO31zOjI5OiJidXkgYWN5Y2xvdmlyIG5vIHByZXNjcmlwdGlvbiI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW8ucGhhcm1hY3ktb25saW5lLjA5MCI7aToxO3M6MTQ6InNwYW1fbGlua190ZXh0Ijt9czo4OiJhcmltaWRleCI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW8ucGhhcm1hY3ktb25saW5lLjA5MSI7aToxO3M6MTQ6InNwYW1fbGlua190ZXh0Ijt9czoxMDoiZmx1b3hldGluZSI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW8ucGhhcm1hY3ktb25saW5lLjA5MiI7aToxO3M6MTQ6InNwYW1fbGlua190ZXh0Ijt9czoxMjoidGV0cmFjeWNsaW5lIjthOjI6e2k6MDtzOjMzOiJpbmplY3RlZC5zcGFtLXNlb19hbnRpYmlvdGljcy4wMTEiO2k6MTtzOjE0OiJzcGFtX2xpbmtfdGV4dCI7fX1zOjU6ImRpZGFzIjthOjY6e2k6MDtpOjEwO3M6MTQ6Ii1hZGlkYXMteWVlenktIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlby5hZGlkYXMuMDAxIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjEzOiItYWRpZGFzLXVsdHJhIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlby5hZGlkYXMuMDAyIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjEyOiIteWVlenktYm9vc3QiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvLmFkaWRhcy4wMDMiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjI6ImFkaWRhcyBZZWV6eSA3NTAgQm9vc3QiO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLnNwYW0tc2VvX3Nob2VzLjAwMSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxMzoiYWRpZGFzIFllZXp5cyI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuc3BhbS1zZW9fc2hvZXMuMDAyIjtpOjE7czo5OiJzcGFtX2xpbmsiO319czoxMDoib3BhY2l0eTowOyI7YTozOntpOjA7aToxMDtzOjY6IkplcnNleSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQuc3BhbS1zZW9fbGluay4wMTEiO2k6MTtzOjE0OiJzcGFtX2xpbmtfdGV4dCI7fXM6MTE6Im5mbCBqYWNrZXRzIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5zcGFtLXNlb19saW5rLjAxMiI7aToxO3M6MTQ6InNwYW1fbGlua190ZXh0Ijt9fXM6NToiYWx2aW4iO2E6Mzp7aTowO2k6MTA7czoyMToiLUNhbHZpbi1LbGVpbi1iYXJhdG9zIjthOjI6e2k6MDtzOjMzOiJpbmplY3RlZC5zcGFtLXNlby5jYWx2aW5rbGVpbi4wMDEiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6Mjg6Ij5DYWx2aW4gS2xlaW4gQm94ZXIgQmFyYXRvczwiO2E6Mjp7aTowO3M6MzM6ImluamVjdGVkLnNwYW0tc2VvLmNhbHZpbmtsZWluLjAwMiI7aToxO2k6MTE7fX1zOjY6InVpdHRvbiI7YToyOntpOjA7aToxMDtzOjc6InVpdHRvbi0iO2E6Mjp7aTowO2k6MTA7czo1OiJvdWlzLSI7YToyOntpOjA7czoyOToiaW5qZWN0ZWQuc3BhbS1zZW8udnVpdHRvbi4wMDEiO2k6MTtzOjk6InNwYW1fbGluayI7fX19czo3OiJoaWRkZW47IjthOjM6e2k6MDtpOjEwO3M6NjoiY2FzaW5vIjthOjI6e2k6MDtpOjEwO3M6OTA6In48ZGl2IHN0eWxlPS5vdmVyZmxvdzpccypoaWRkZW47XHMqaGVpZ2h0OlxzKjFweDsuPjxhIGhyZWY9W15cPF0rY2FzaW5vW15cPF0qPzxcL2E+PC5kaXY+fiI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2FzaW5vLjAwOCI7aToxO3M6OTE6In4oPzo8ZGl2IHN0eWxlPS5vdmVyZmxvdzpccypoaWRkZW47XHMqaGVpZ2h0OlxzKjFweDsuPjxhIGhyZWY9W15cPl0rPltePF0rPFwvYT48LmRpdj5ccyopK34iO319czoyMToiPGRpdiBzdHlsZT0ib3ZlcmZsb3c6IjthOjM6e2k6MDtpOjEwO3M6NDE6IjxkaXYgc3R5bGU9Im92ZXJmbG93OmhpZGRlbjtoZWlnaHQ6MXB4OyI+IjthOjI6e2k6MDtpOjEwO3M6NjE6In48ZGl2IHN0eWxlPSJvdmVyZmxvdzpoaWRkZW47aGVpZ2h0OjFweDsiPltcc10qPGhlYWQ+PGEgaHJlZn4iO2E6Mjp7aTowO3M6MjM6ImluamVjdGVkLmhpZGRlbi1kaXYuMDM2IjtpOjE7czoxMDE6In48ZGl2IHN0eWxlPSJvdmVyZmxvdzpoaWRkZW47aGVpZ2h0OjFweDsiPltcc10qPGhlYWQ+KCg8YSBocmVmfDxtZXRhKVteXG5dK1tcc10qKSs8LmhlYWQ+W1xzXSo8LmRpdj5+Ijt9fXM6NTI6In48ZGl2IHN0eWxlPSJvdmVyZmxvdzpccypoaWRkZW47XHMqaGVpZ2h0OlxzKjFweDsiPn4iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLmhpZGRlbi1kaXYuMDM2LjAyIjtpOjE7aToxMTt9fX1zOjM3OiI8YSBzdHlsZT0iY29sb3I6ICNmZmZmZmY7IiBocmVmPSJodHRwIjthOjI6e2k6MDtpOjEwO3M6MzU6In48YSBzdHlsZVtePl0rPltcd10rW1xkXStbXHddKzwuYT5+IjthOjI6e2k6MDtzOjIxOiJpbmplY3RlZC5zcGFtLXNlby4wMTkiO2k6MTtzOjM1OiJ+PGEgc3R5bGVbXj5dKz5bXHddK1tcZF0rW1x3XSs8LmE+fiI7fX1zOjEyOiJleGFtaG9tZS5uZXQiO2E6Mjp7aTowO3M6MzI6ImpzLm1hbHdhcmUuaW5qZWN0b3JfZXhhbWhvbWUuMDAxIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjI5OiJjb2xsZWdlIHBhcGVyIHdyaXRpbmcgc2VydmljZSI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuc3BhbS1zZW8uZXNzYXkuMDQ4IjtpOjE7czoxNDoic3BhbV9saW5rX3RleHQiO31zOjE1OiJnZW5lcmlrYSBrYXVmZW4iO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4xMTMiO2k6MTtzOjE0OiJzcGFtX2xpbmtfdGV4dCI7fXM6MjA6InN0b3AtYW55LWRpc2Vhc2UuY29tIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMTE0IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIwOiJhc2lhbi1kYXRpbmctd2Vic2l0ZSI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fZGF0aW5nLjAwMSI7aToxO3M6MTQ6InNwYW1fbGlua190ZXh0Ijt9czoxMjoiYnVzdHkgYnJpZGVzIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19kYXRpbmcuMDAyIjtpOjE7czoxNDoic3BhbV9saW5rX3RleHQiO31zOjE0OiJldXJvcGVhbiB3aXZlcyI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fZGF0aW5nLjAwMyI7aToxO3M6MTQ6InNwYW1fbGlua190ZXh0Ijt9czoxNDoibWVldCBob3QgZ2lybHMiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2RhdGluZy4wMDQiO2k6MTtzOjE0OiJzcGFtX2xpbmtfdGV4dCI7fXM6MjA6InVrcmFpbmUgZGF0ZSBydXNzaWFuIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19kYXRpbmcuMDA1IjtpOjE7czoxNDoic3BhbV9saW5rX3RleHQiO31zOjE1OiJmcmVlLWFkdWx0LWNoYXQiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2RhdGluZy4wMDYiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTY6IndpdGggbXkgaG9tZXdvcmsiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLnNwYW0tc2VvX2V4YW0uMDAzIjtpOjE7czoxNDoic3BhbV9saW5rX3RleHQiO31zOjEyOiJsYXRpbi1icmlkZXMiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2RhdGluZy4wMDciO2k6MTtzOjE0OiJzcGFtX2xpbmtfdGV4dCI7fXM6NzoiY2hlYXByeCI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjExNiI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNzoic3R5bGU9ImZvbnQtc2l6ZToiO2E6Mjp7aTowO2k6MTA7czo0OiIwcHg7IjthOjQ6e2k6MDtpOjEwO3M6NjoiPm9yZGVyIjthOjI6e2k6MDtzOjMzOiJpbmplY3RlZC5zcGFtLXNlb19oaWRkZW5fZm9udC4wMDQiO2k6MTtpOjExO31zOjk6Ij5wdXJjaGFzZSI7YToyOntpOjA7czozMzoiaW5qZWN0ZWQuc3BhbS1zZW9faGlkZGVuX2ZvbnQuMDAzIjtpOjE7aToxMTt9czoxMjoicHJlc2NyaXB0aW9uIjthOjI6e2k6MDtzOjMzOiJpbmplY3RlZC5zcGFtLXNlb19oaWRkZW5fZm9udC4wMDUiO2k6MTtpOjExO319fXM6NjoiZXJzYWNlIjthOjI6e2k6MDtpOjEwO3M6MTk6Ij5UZWUgU2hpcnQgVmVyc2FjZTwiO2E6Mjp7aTowO3M6Mjk6ImluamVjdGVkLnNwYW0tc2VvLnZlcnNhY2UuMDAxIjtpOjE7aToxMTt9fXM6NjoiYXVyZW50IjthOjI6e2k6MDtpOjEwO3M6Mjg6Ij5UIFNoaXJ0IFl2ZXMgU2FpbnQgTGF1cmVudDwiO2E6Mjp7aTowO3M6Mjk6ImluamVjdGVkLnNwYW0tc2VvLmxhdXJlbnQuMDAxIjtpOjE7aToxMTt9fXM6NjoiYW1hZ3JhIjthOjI6e2k6MDtpOjEwO3M6ODoia2FtYWdyYS0iO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4xMTciO2k6MTtpOjExO319czo1MjoiPHNwYW4gY2xhc3M9ImtleXNfd29yZHMiPjxhIGNsYXNzPSJsaW5rc19nb29kX3JhbmRzIiI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQuaGlkZGVuLXNwYW4uMDA0IjtpOjE7czoyMjE6In4oOj88cD5ccyopPzxzcGFuIGNsYXNzPSJrZXlzX3dvcmRzIj4oPGEgY2xhc3M9ImxpbmtzX2dvb2RfcmFuZHMiIGhyZWZbXj5dKz5bXjw+XSs8LmE+W148Pl0qKSs8LnNwYW4+KDo/PC5wPlxzKik/KDo/PHNjcmlwdD5bXnNjcmlwdF0qZXZhbFwoZnVuY3Rpb25cKHAsYSxjW159XSt0b1N0cmluZy4zNltePl0rXHxOTHBuZGxTM1x8W148XStce1x9XClcKTtbXlx3XSo8XC9zY3JpcHQ+KT9+Ijt9czoxOToiPnN1cGVyb25saW5lIGZhdHVyYSI7YToyOntpOjA7czozMzoiaW5qZWN0ZWQuc3BhbS1zZW9faGlkZGVuX2ZvbnQuMDAxIjtpOjE7aToxMTt9czo3NDoiPGZvbnQgc3R5bGU9Im92ZXJmbG93OiBhdXRvOyBwb3NpdGlvbjogYWJzb2x1dGU7IGhlaWdodDogMHB0OyB3aWR0aDogMHB0Ij4iO2E6Mjp7aTowO3M6MzM6ImluamVjdGVkLnNwYW0tc2VvX2hpZGRlbl9mb250LjAwMiI7aToxO2k6MTE7fXM6MjY6IlVsdGltYXRlIFByb2R1Y3QgS2V5IEZyZWU8IjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjEyNiI7aToxO2k6MTE7fXM6MjU6InByb2Zlc3Npb25hbCBwcm9kdWN0IGtleTwiO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMTI3IjtpOjE7aToxMTt9fXM6NzoicGhhcm1hYyI7YToyMzp7aTowO2k6MTA7czo0OiJocmVmIjthOjI6e2k6MDtpOjEwO3M6NToieGFuYXgiO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLnNwYW0tc2VvX3hhbmF4LjAwMSI7aToxO3M6ODQ6In48YVxzKnN0eWxlPS5mb250LXNpemU6MDsuXHMqaHJlZj0uaHR0cDouLlteLV0rLXBoYXJtYWN5W14+XSs+W14uXSsuW154XSt4YW5heC48LmE+fiI7fX1zOjE0OiIxcGhhcm1hY3lzdG9yZSI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjAwMSI7aToxO3M6OToic3BhbV9saW5rIjt9czoyMToiMjQ3cGhhcm1hY2V1dGljYWwuY29tIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDAyIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjI1OiJjYW5hZGlhbi1waGFybWFjeS05MTEuY29tIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDAzIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjI0OiJjYW5hZGlhbi1waGFybWFjeS1zdG9yZXMiO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4wMDQiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTk6ImNhbmFkaWFucGhhcm1hY3l3ZWIiO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4wMDUiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6Mjc6ImNoZWFwLWNhbmFkaWFuLXBoYXJtYWN5Lm5ldCI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjAwNiI7aToxO3M6OToic3BhbV9saW5rIjt9czoyMToiZS1waGFybWFjeS1vbmxpbmUuY29tIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDA3IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE5OiJnZW5lcmljLWVkLXBoYXJtYWN5IjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDA4IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIyOiJvbmxpbmUtcGhhcm1hY3ktc3QuY29tIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDA5IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE0OiJvbmxpbmVwaGFybWFjeSI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjAxMCI7aToxO3M6OToic3BhbV9saW5rIjt9czoyNDoib25saW5lcGhhcm1hY3ktZHJ1Z3MuY29tIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDExIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE5OiJwaGFybWFjaWUtLWVuLWxpZ25lIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDEyIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE1OiJwaGFybWFjeS1jaGVhcHMiO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4wMTMiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTY6InBoYXJtYWN5LXBpbGwyNDciO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4wMTQiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjA6InBoYXJtYWN5LXBpbGwzNjUuY29tIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDE1IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE5OiJ1cy1jYWQtcGhhcm1hY3kuY29tIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDE2IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIyOiJ4ZW5vcGhhcm1hY29waGlsaWEuY29tIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDE3IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIzOiJwYXJ0bmVycGhhcm1hY3kyNC03LmNvbSI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjAxOCI7aToxO3M6OToic3BhbV9saW5rIjt9czoyMjoid3d3LnBoYXJtYWN5aW5jaXR5LmNvbSI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjAxOSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNzoiY2FuYWRpYW4gcGhhcm1hY3kiO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4wODIiO2k6MTtpOjExO31zOjE0OiJjYW5hZGFwaGFybWFjeSI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjExNSI7aToxO3M6OToic3BhbV9saW5rIjt9fXM6Njoiam9yZGFuIjthOjE4OntpOjA7aToxMDtzOjEzOiJhaXIgam9yZGFuIDExIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19qb3JkYW4uMDAxIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjEzOiJjaGVhcCBqb3JkYW5zIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19qb3JkYW4uMDAyIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjk6ImpvcmRhbiAxMSI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fam9yZGFuLjAwMyI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNDoiam9yZGFuIDExIGJyZWQiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2pvcmRhbi4wMDQiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTg6ImpvcmRhbiAxMSBsb3cgYnJlZCI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fam9yZGFuLjAwNSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxODoiam9yZGFuIDExIHBsYXlvZmZzIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19qb3JkYW4uMDA2IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjk6ImpvcmRhbiAxMyI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fam9yZGFuLjAwNyI7aToxO3M6OToic3BhbV9saW5rIjt9czoxODoiam9yZGFuIDEzIGxvdyBicmVkIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19qb3JkYW4uMDA4IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIxOiJqb3JkYW4gMTMgbG93IGhvcm5ldHMiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2pvcmRhbi4wMDkiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6ODoiam9yZGFuIDUiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2pvcmRhbi4wMTAiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjI6ImpvcmRhbiA1IG1pZG5pZ2h0IG5hdnkiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2pvcmRhbi4wMTEiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6ODoiam9yZGFuIDYiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2pvcmRhbi4wMTIiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6ODoiam9yZGFuIDciO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2pvcmRhbi4wMTMiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTM6ImpvcmRhbiA3IGhhcmUiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2pvcmRhbi4wMTQiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6ODoiam9yZGFuIDgiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2pvcmRhbi4wMTUiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTU6ImpvcmRhbiByZXRybyAxMiI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fam9yZGFuLjAxNiI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNDoiam9yZGFuIHJldHJvIDQiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2pvcmRhbi4wMTciO2k6MTtzOjk6InNwYW1fbGluayI7fX1zOjU6ImxvYW5zIjthOjE0OntpOjA7aToxMDtzOjE1OiIxc3QtcGF5ZGF5bG9hbnMiO2E6Mjp7aTowO3M6MzQ6ImluamVjdGVkLnNwYW0tc2VvX3BheWRheS1sb2Fucy4wMDEiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjA6ImNsYXNzaWNwYXlkYXlsb2Fuc3VrIjthOjI6e2k6MDtzOjM0OiJpbmplY3RlZC5zcGFtLXNlb19wYXlkYXktbG9hbnMuMDAyIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIxOiJmYXN0LXBheWRheS1sb2Fucy5vcmciO2E6Mjp7aTowO3M6MzQ6ImluamVjdGVkLnNwYW0tc2VvX3BheWRheS1sb2Fucy4wMDMiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTI6ImxvYW5zc29ubGluZSI7YToyOntpOjA7czozNDoiaW5qZWN0ZWQuc3BhbS1zZW9fcGF5ZGF5LWxvYW5zLjAwNCI7aToxO3M6OToic3BhbV9saW5rIjt9czoxMjoicGF5ZGF5IGxvYW5zIjthOjI6e2k6MDtzOjM0OiJpbmplY3RlZC5zcGFtLXNlb19wYXlkYXktbG9hbnMuMDA1IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjEzOiJwYXkgZGF5IGxvYW5zIjthOjI6e2k6MDtzOjM0OiJpbmplY3RlZC5zcGFtLXNlb19wYXlkYXktbG9hbnMuMDA2IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIyOiJjYXNoLWxvYW5zLW9ubGluZS1mYXN0IjthOjI6e2k6MDtzOjM0OiJpbmplY3RlZC5zcGFtLXNlb19wYXlkYXktbG9hbnMuMDA3IjtpOjE7aToxMTt9czoxNDoiLXBheWRheS1sb2Fucy0iO2E6Mjp7aTowO3M6MzQ6ImluamVjdGVkLnNwYW0tc2VvX3BheWRheS1sb2Fucy4wMDgiO2k6MTtpOjExO31zOjIwOiJsb2Fucy1zYWx0LWxha2UtY2l0eSI7YToyOntpOjA7czozNDoiaW5qZWN0ZWQuc3BhbS1zZW9fcGF5ZGF5LWxvYW5zLjAwOSI7aToxO2k6MTE7fXM6MzM6InBheWRheS1sb2Fucy1jaGVhcC1pbnRlcmVzdC1yYXRlcyI7YToyOntpOjA7czozNDoiaW5qZWN0ZWQuc3BhbS1zZW9fcGF5ZGF5LWxvYW5zLjAxMCI7aToxO2k6MTE7fXM6MzA6InBlcnNvbmFsLWxvYW5zLWJhc2VkLW9uLWluY29tZSI7YToyOntpOjA7czozNDoiaW5qZWN0ZWQuc3BhbS1zZW9fcGF5ZGF5LWxvYW5zLjAxMSI7aToxO2k6MTE7fXM6MjA6InF1aWNrLXBlcnNvbmFsLWxvYW5zIjthOjI6e2k6MDtzOjM0OiJpbmplY3RlZC5zcGFtLXNlb19wYXlkYXktbG9hbnMuMDEyIjtpOjE7aToxMTt9czoyMDoidHJ1c3RlZC1vbmxpbmUtbG9hbnMiO2E6Mjp7aTowO3M6MzQ6ImluamVjdGVkLnNwYW0tc2VvX3BheWRheS1sb2Fucy4wMTMiO2k6MTtpOjExO319czo3OiJsZXZpdHJhIjthOjEyOntpOjA7aToxMDtzOjc6Imxldml0cmEiO2E6Mjp7aTowO3M6Mjk6ImluamVjdGVkLnNwYW0tc2VvX2xldml0cmEuMDAxIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE4OiJkbGV2aXRyYW9ubGluZS5jb20iO2E6Mjp7aTowO3M6Mjk6ImluamVjdGVkLnNwYW0tc2VvX2xldml0cmEuMDAyIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjI3OiJlbm9wcmVzY3JpcHRpb24tbGV2aXRyYS5jb20iO2E6Mjp7aTowO3M6Mjk6ImluamVjdGVkLnNwYW0tc2VvX2xldml0cmEuMDAzIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjI3OiJlbm9wcmVzY3JpcHRpb24tbGV2aXRyYS5uZXQiO2E6Mjp7aTowO3M6Mjk6ImluamVjdGVkLnNwYW0tc2VvX2xldml0cmEuMDA0IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE3OiJncmVhdC1sZXZpdHJhLmNvbSI7YToyOntpOjA7czoyOToiaW5qZWN0ZWQuc3BhbS1zZW9fbGV2aXRyYS4wMDUiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjQ6Imxldml0cmEtb25saW5lLXByaWNlLmNvbSI7YToyOntpOjA7czoyOToiaW5qZWN0ZWQuc3BhbS1zZW9fbGV2aXRyYS4wMDYiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjQ6Imxldml0cmEtb25saW5lLXByaWNlLm5ldCI7YToyOntpOjA7czoyOToiaW5qZWN0ZWQuc3BhbS1zZW9fbGV2aXRyYS4wMDciO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjI6Im9ubGluZWxldml0cmFjaGVhcC5jb20iO2E6Mjp7aTowO3M6Mjk6ImluamVjdGVkLnNwYW0tc2VvX2xldml0cmEuMDA4IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIyOiJvbmxpbmVsZXZpdHJhY2hlYXAubmV0IjthOjI6e2k6MDtzOjI5OiJpbmplY3RlZC5zcGFtLXNlb19sZXZpdHJhLjAwOSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNToidG9wbGV2aXRyYWd1aWRlIjthOjI6e2k6MDtzOjI5OiJpbmplY3RlZC5zcGFtLXNlb19sZXZpdHJhLjAxMCI7aToxO3M6OToic3BhbV9saW5rIjt9czoxODoiYnV5IGxldml0cmEgb25saW5lIjthOjI6e2k6MDtzOjI5OiJpbmplY3RlZC5zcGFtLXNlb19sZXZpdHJhLjAxMSI7aToxO3M6OToic3BhbV9saW5rIjt9fXM6NToicGlsbHMiO2E6MTA6e2k6MDtpOjEwO3M6MTE6ImNoZWFwLXBpbGxzIjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5zcGFtLXNlb19waWxscy4wMDEiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTA6ImJhc2ljcGlsbHMiO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLnNwYW0tc2VvX3BpbGxzLjAwMiI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNjoiY2hlYXBwaWxsc29ubGluZSI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGlsbHMuMDAzIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjEwOiJnZXRyeHBpbGxzIjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5zcGFtLXNlb19waWxscy4wMDQiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTQ6ImdldHJ4cGlsbHMuY29tIjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5zcGFtLXNlb19waWxscy4wMDUiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTI6Im9ubGluZS1waWxscyI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGlsbHMuMDA2IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE5OiJvbmxpbmVwaWxsc3Nob3AuY29tIjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5zcGFtLXNlb19waWxscy4wMDciO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTE6Ii1waWxscy5odG1sIjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5zcGFtLXNlb19waWxscy4wMDgiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTg6InBpbGxzMjRob25saW5lLmNvbSI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGlsbHMuMDA5IjtpOjE7czo5OiJzcGFtX2xpbmsiO319czoxMToib25saW5lZS5jb20iO2E6OTp7aTowO2k6MTA7czoyOToiYnV5Y2hlYXBjaWFncmV0dGVzb25saW5lZS5jb20iO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDAxIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIxOiJidXljeXRvdGVjb25saW5lZS5jb20iO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDAyIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjI4OiJidXlnZW5lcmljcHJpbGlneW9ubGluZWUuY29tIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjAwMyI7aToxO3M6OToic3BhbV9saW5rIjt9czoyMToiYnV5cHJvc2Nhcm9ubGluZWUuY29tIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjAwNCI7aToxO3M6OToic3BhbV9saW5rIjt9czoyMDoiYnV5eGVuaWNhb25saW5lZS5jb20iO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDA1IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE3OiJmbGFneWxvbmxpbmVlLmNvbSI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4wMDYiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjQ6ImJ1eWNpZ2FyZXR0ZXNvbmxpbmVlLmNvbSI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4wMDciO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjA6ImNhc2hxdWlja29ubGluZWUuY29tIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjAwOCI7aToxO3M6OToic3BhbV9saW5rIjt9fXM6MTA6ImFtcGljaWxsaW4iO2E6ODp7aTowO2k6MTA7czoyMDoiYW1waWNpbGxpbi1waGFybS5jb20iO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2FtcGljaWxsaW4uMDAxIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIwOiJhbXBpY2lsbGluLXBoYXJtLm5ldCI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fYW1waWNpbGxpbi4wMDIiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjA6ImFtcGljaWxsaW4tcGlsbHMuY29tIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19hbXBpY2lsbGluLjAwMyI7aToxO3M6OToic3BhbV9saW5rIjt9czoyMDoiYW1waWNpbGxpbi1waWxscy5uZXQiO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2FtcGljaWxsaW4uMDA0IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE5OiJhbXBpY2lsbGlucGlsbHMuY29tIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19hbXBpY2lsbGluLjAwNSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxOToiYW1waWNpbGxpbnBpbGxzLm5ldCI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fYW1waWNpbGxpbi4wMDYiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjI6InBlYW1waWNpbGxpbm9ubGluZS5jb20iO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2FtcGljaWxsaW4uMDA3IjtpOjE7czo5OiJzcGFtX2xpbmsiO319czo2OiJhbW94aWwiO2E6ODp7aTowO2k6MTA7czo2OiJhbW94aWwiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2Ftb3hpbC4wMDEiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTY6ImFtb3hpbC1jaGVhcC5uZXQiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2Ftb3hpbC4wMDIiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTY6ImFtb3hpbC1waWxscy5uZXQiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2Ftb3hpbC4wMDMiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTU6ImFtb3hpbGNoZWFwLm5ldCI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fYW1veGlsLjAwNCI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNToiYW1veGlscGhhcm0uY29tIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19hbW94aWwuMDA1IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE1OiJhbW94aWxwaGFybS5uZXQiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2Ftb3hpbC4wMDYiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTU6ImFtb3hpbHBpbGxzLm5ldCI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fYW1veGlsLjAwNyI7aToxO3M6OToic3BhbV9saW5rIjt9fXM6MTE6InJlc2NyaXB0aW9uIjthOjk6e2k6MDtpOjEwO3M6MTU6ImVub3ByZXNjcmlwdGlvbiI7YToyOntpOjA7czozNDoiaW5qZWN0ZWQuc3BhbS1zZW9fcHJlc2NyaXB0aW9uLjAwMSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxODoibm9ucHJlc2NyaXB0aW9ubWVkIjthOjI6e2k6MDtzOjM0OiJpbmplY3RlZC5zcGFtLXNlb19wcmVzY3JpcHRpb24uMDAyIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE0OiJub3ByZXNjcmlwdGlvbiI7YToyOntpOjA7czozNDoiaW5qZWN0ZWQuc3BhbS1zZW9fcHJlc2NyaXB0aW9uLjAwMyI7aToxO3M6OToic3BhbV9saW5rIjt9czoyNjoib25saW5lLXByZXNjcmlwdGlvbm1lZC5uZXQiO2E6Mjp7aTowO3M6MzQ6ImluamVjdGVkLnNwYW0tc2VvX3ByZXNjcmlwdGlvbi4wMDQiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTg6InBoYXJtLXByZXNjcmlwdGlvbiI7YToyOntpOjA7czozNDoiaW5qZWN0ZWQuc3BhbS1zZW9fcHJlc2NyaXB0aW9uLjAwNSI7aToxO3M6OToic3BhbV9saW5rIjt9czozMDoiQ2xvbmlkaW5lIHdpdGhvdXQgcHJlc2NyaXB0aW9uIjthOjI6e2k6MDtzOjM0OiJpbmplY3RlZC5zcGFtLXNlb19wcmVzY3JpcHRpb24uMDA2IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE1OiJubyBwcmVzY3JpcHRpb24iO2E6Mjp7aTowO3M6MzQ6ImluamVjdGVkLnNwYW0tc2VvX3ByZXNjcmlwdGlvbi4wMDciO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTk6IndpdGhvdXRwcmVzY3JpcHRpb24iO2E6Mjp7aTowO3M6MzQ6ImluamVjdGVkLnNwYW0tc2VvX3ByZXNjcmlwdGlvbi4wMDgiO2k6MTtzOjk6InNwYW1fbGluayI7fX1zOjEwOiJvbmxpbmUuY29tIjthOjg6e2k6MDtpOjEwO3M6MjM6ImJ1eXppdGhyb21heG9vbmxpbmUuY29tIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjAyNyI7aToxO3M6OToic3BhbV9saW5rIjt9czoyMDoiY3l0b3RlY2J1eW9ubGluZS5jb20iO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDI4IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjI0OiJkb215YXNzaWdubWVudG9ubGluZS5jb20iO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDI5IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIyOiJjYW5hZGEtZHJ1Z3NvbmxpbmUuY29tIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjAzMCI7aToxO3M6OToic3BhbV9saW5rIjt9czoyNjoibXlmYXZvcml0ZWRvY3Rvcm9ubGluZS5jb20iO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDMxIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIzOiJ3aW5kb3dzMTBrZXlzb25saW5lLmNvbSI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4wMzIiO2k6MTtpOjExO31zOjIxOiJvZmZpY2lhbGtleW9ubGluZS5jb20iO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDMzIjtpOjE7aToxMTt9fXM6NjoiY2FzaW5vIjthOjg6e2k6MDtpOjEwO3M6MTM6Im9ubGluZSBjYXNpbm8iO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2Nhc2luby4wMDEiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTc6InRhc3R5b25saW5lY2FzaW5vIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19jYXNpbm8uMDAyIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE5OiJ4bWljcm9nYW1pbmdjYXNpbm9zIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19jYXNpbm8uMDAzIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIxOiJ3d3cuc3ZlbnNra2FzaW5vbi5jb20iO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2Nhc2luby4wMDQiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6Mjc6Ii14eC5jb21dY2FzaW5vIG9ubGluZVsvdXJsXSI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2FzaW5vLjAwNyI7aToxO3M6Nzoifl4uKiR+cyI7fXM6MTU6Ii1vbmxpbmUtY2FzaW5vLSI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2FzaW5vLjAwNSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNToidG9wLWNhc2luby1yZWFsIjthOjI6e2k6MDtzOjI4OiJpbmplY3RlZC5zcGFtLXNlb19jYXNpbm8uMDA2IjtpOjE7czo5OiJzcGFtX2xpbmsiO319czoxMzoic29mdHdhcmVlLmNvbSI7YTo3OntpOjA7aToxMDtzOjIxOiJkb3dubG9hZHNvZnR3YXJlZS5jb20iO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDA5IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIyOiJpcGhvbmVzcHlzb2Z0d2FyZWUuY29tIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjAxMCI7aToxO3M6OToic3BhbV9saW5rIjt9czoxODoiYWRvYmVzb2Z0d2FyZWUuY29tIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjAxMSI7aToxO3M6OToic3BhbV9saW5rIjt9czoyNjoiYmxhY2tiZXJyeXNweXNvZnR3YXJlZS5jb20iO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDEyIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjI0OiJlbGxwaG9uZXNweXNvZnR3YXJlZS5jb20iO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDEzIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIxOiJjb21wdXRlcnNvZnR3YXJlZS5jb20iO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDE0IjtpOjE7czo5OiJzcGFtX2xpbmsiO319czo4OiJhY29tcGxpYSI7YTo2OntpOjA7aToxMDtzOjI1OiJhY29tcGxpYS1vbmxpbmUtcHJpY2UuY29tIjthOjI6e2k6MDtzOjMwOiJpbmplY3RlZC5zcGFtLXNlb19hY29tcGxpYS4wMDEiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjU6ImFjb21wbGlhLW9ubGluZS1wcmljZS5uZXQiO2E6Mjp7aTowO3M6MzA6ImluamVjdGVkLnNwYW0tc2VvX2Fjb21wbGlhLjAwMiI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNzoiZGFjb21wbGlhc2FsZS5jb20iO2E6Mjp7aTowO3M6MzA6ImluamVjdGVkLnNwYW0tc2VvX2Fjb21wbGlhLjAwMyI7aToxO3M6OToic3BhbV9saW5rIjt9czoyMzoib25saW5lYWNvbXBsaWFjaGVhcC5jb20iO2E6Mjp7aTowO3M6MzA6ImluamVjdGVkLnNwYW0tc2VvX2Fjb21wbGlhLjAwNCI7aToxO3M6OToic3BhbV9saW5rIjt9czoyMzoib25saW5lYWNvbXBsaWFjaGVhcC5uZXQiO2E6Mjp7aTowO3M6MzA6ImluamVjdGVkLnNwYW0tc2VvX2Fjb21wbGlhLjAwNSI7aToxO3M6OToic3BhbV9saW5rIjt9fXM6NDoidGFkYSI7YTo2OntpOjA7aToxMDtzOjc6InRhZGFjaXAiO2E6Mjp7aTowO3M6Mjk6ImluamVjdGVkLnNwYW0tc2VvX3RhZGFmaWwuMDAxIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjc6InRhZGFmaWwiO2E6Mjp7aTowO3M6Mjk6ImluamVjdGVkLnNwYW0tc2VvX3RhZGFmaWwuMDAyIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE0OiJ0YWRhbGFmaWwgMjBtZyI7YToyOntpOjA7czoyOToiaW5qZWN0ZWQuc3BhbS1zZW9fdGFkYWZpbC4wMDMiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTQ6InRhZGFsYWZpbC0yMG1nIjthOjI6e2k6MDtzOjI5OiJpbmplY3RlZC5zcGFtLXNlb190YWRhZmlsLjAwNCI7aToxO3M6OToic3BhbV9saW5rIjt9czo5OiJ0YWRhbGFmaWwiO2E6Mjp7aTowO3M6Mjk6ImluamVjdGVkLnNwYW0tc2VvX3RhZGFmaWwuMDA1IjtpOjE7czo5OiJzcGFtX2xpbmsiO319czo4OiJwcm9wZWNpYSI7YTo2OntpOjA7aToxMDtzOjI0OiJidXktcHJvcGVjaWEtb25saW5lZS5jb20iO2E6Mjp7aTowO3M6MzA6ImluamVjdGVkLnNwYW0tc2VvX3Byb3BlY2lhLjAwMSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxODoiYnV5eXByb3BlY2lhb25saW5lIjthOjI6e2k6MDtzOjMwOiJpbmplY3RlZC5zcGFtLXNlb19wcm9wZWNpYS4wMDIiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjA6InNwcm9wZWNpYS1vbmxpbmUuY29tIjthOjI6e2k6MDtzOjMwOiJpbmplY3RlZC5zcGFtLXNlb19wcm9wZWNpYS4wMDMiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjA6InNwcm9wZWNpYS1vbmxpbmUubmV0IjthOjI6e2k6MDtzOjMwOiJpbmplY3RlZC5zcGFtLXNlb19wcm9wZWNpYS4wMDQiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjA6Indwcm9wZWNpYW5vbmxpbmUuY29tIjthOjI6e2k6MDtzOjMwOiJpbmplY3RlZC5zcGFtLXNlb19wcm9wZWNpYS4wMDUiO2k6MTtzOjk6InNwYW1fbGluayI7fX1zOjM6InNleCI7YTo2OntpOjA7aToxMDtzOjE0OiJpem1pciBzZXggc2hvcCI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQuc3BhbS1zZW9fcG9ybi4wMDEiO2k6MTtzOjE0OiJzcGFtX2xpbmtfdGV4dCI7fXM6MTc6ImlzdGFuYnVsIHNleCBzaG9wIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5zcGFtLXNlb19wb3JuLjAwMiI7aToxO3M6MTQ6InNwYW1fbGlua190ZXh0Ijt9czo4OiJhbmFsIHNleCI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQuc3BhbS1zZW9fcG9ybi4wMDMiO2k6MTtzOjE0OiJzcGFtX2xpbmtfdGV4dCI7fXM6OToic2V4IHZpZGVvIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5zcGFtLXNlb19wb3JuLjAwNCI7aToxO3M6MTQ6InNwYW1fbGlua190ZXh0Ijt9czo3OiJzZXh0dWJlIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5zcGFtLXNlb19wb3JuLjAwOCI7aToxO3M6MTQ6InNwYW1fbGlua190ZXh0Ijt9fXM6ODoic2lsZGFsaXMiO2E6Njp7aTowO2k6MTA7czoxMjoic2lsZGFsaXMgYnV5IjthOjI6e2k6MDtzOjMwOiJpbmplY3RlZC5zcGFtLXNlb19zaWxkYWxpcy4wMDEiO2k6MTtpOjExO31zOjIxOiJvcmRlciBzaWxkYWxpcyBvbmxpbmUiO2E6Mjp7aTowO3M6MzA6ImluamVjdGVkLnNwYW0tc2VvX3NpbGRhbGlzLjAwMiI7aToxO2k6MTE7fXM6MTg6ImJ1eSBjaGVhcCBzaWxkYWxpcyI7YToyOntpOjA7czozMDoiaW5qZWN0ZWQuc3BhbS1zZW9fc2lsZGFsaXMuMDAzIjtpOjE7aToxMTt9czoxNDoic2lsZGFsaXMgb3JkZXIiO2E6Mjp7aTowO3M6MzA6ImluamVjdGVkLnNwYW0tc2VvX3NpbGRhbGlzLjAwNCI7aToxO2k6MTE7fXM6MTM6InNhbGUgc2lsZGFsaXMiO2E6Mjp7aTowO3M6MzA6ImluamVjdGVkLnNwYW0tc2VvX3NpbGRhbGlzLjAwNSI7aToxO2k6MTE7fX1zOjQ6InBvcm4iO2E6NTp7aTowO2k6MTA7czoxMToiaW5jZXN0IHBvcm4iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLnNwYW0tc2VvX3Bvcm4uMDA1IjtpOjE7czoxNDoic3BhbV9saW5rX3RleHQiO31zOjc6ImhkIHBvcm4iO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLnNwYW0tc2VvX3Bvcm4uMDA2IjtpOjE7czoxNDoic3BhbV9saW5rX3RleHQiO31zOjg6ImhvdHBvcm5vIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5zcGFtLXNlb19wb3JuLjAxMSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxMDoiamFwYW4gcG9ybiI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQuc3BhbS1zZW9fcG9ybi4wMTIiO2k6MTtzOjE0OiJzcGFtX2xpbmtfdGV4dCI7fX1zOjExOiJhbnRpYmlvdGljcyI7YTo1OntpOjA7aToxMDtzOjE2OiJhbnRpYmlvdGljcy1zaG9wIjthOjI6e2k6MDtzOjMzOiJpbmplY3RlZC5zcGFtLXNlb19hbnRpYmlvdGljcy4wMDEiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjA6ImFudGliaW90aWNzLXNob3AuY29tIjthOjI6e2k6MDtzOjMzOiJpbmplY3RlZC5zcGFtLXNlb19hbnRpYmlvdGljcy4wMDIiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjE6ImFudGliaW90aWNzLXN0b3JlLmNvbSI7YToyOntpOjA7czozMzoiaW5qZWN0ZWQuc3BhbS1zZW9fYW50aWJpb3RpY3MuMDAzIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIxOiJhbnRpYmlvdGljc29yZHJlci5jb20iO2E6Mjp7aTowO3M6MzM6ImluamVjdGVkLnNwYW0tc2VvX2FudGliaW90aWNzLjAwNCI7aToxO3M6OToic3BhbV9saW5rIjt9fXM6NzoiY2FtYWdyYSI7YTo1OntpOjA7aToxMDtzOjE3OiJjYW1hZ3JhLXBoYXJtLmNvbSI7YToyOntpOjA7czoyOToiaW5qZWN0ZWQuc3BhbS1zZW9fY2FtYWdyYS4wMDEiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTc6ImNhbWFncmEtcGhhcm0ubmV0IjthOjI6e2k6MDtzOjI5OiJpbmplY3RlZC5zcGFtLXNlb19jYW1hZ3JhLjAwMiI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNjoiY2FtYWdyYWNoZWFwLmNvbSI7YToyOntpOjA7czoyOToiaW5qZWN0ZWQuc3BhbS1zZW9fY2FtYWdyYS4wMDMiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTY6ImNhbWFncmFjaGVhcC5uZXQiO2E6Mjp7aTowO3M6Mjk6ImluamVjdGVkLnNwYW0tc2VvX2NhbWFncmEuMDA0IjtpOjE7czo5OiJzcGFtX2xpbmsiO319czo2OiJjbG9taWQiO2E6NTp7aTowO2k6MTA7czoxOToiYnV5LWNsb21pZC1vbmxpbmUyNCI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2xvbWlkLjAwMSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxMzoiY2xvbWlkb25saW5lZSI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2xvbWlkLjAwMiI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNDoic2Nsb21pZGJ1eS5jb20iO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2Nsb21pZC4wMDMiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTI6ImNoZWFwLWNsb21pZCI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fY2xvbWlkLjAwNCI7aToxO3M6OToic3BhbV9saW5rIjt9fXM6ODoiY2FyYWZhdGUiO2E6NTp7aTowO2k6MTA7czoxNToiYnV5aW5nLWNhcmFmYXRlIjthOjI6e2k6MDtzOjMwOiJpbmplY3RlZC5zcGFtLXNlb19jYXJhZmF0ZS4wMDEiO2k6MTtpOjExO31zOjEyOiJidXktY2FyYWZhdGUiO2E6Mjp7aTowO3M6MzA6ImluamVjdGVkLnNwYW0tc2VvX2NhcmFmYXRlLjAwMiI7aToxO2k6MTE7fXM6MTQ6Im9yZGVyLWNhcmFmYXRlIjthOjI6e2k6MDtzOjMwOiJpbmplY3RlZC5zcGFtLXNlb19jYXJhZmF0ZS4wMDMiO2k6MTtpOjExO31zOjI4OiJ3YWxtYXJ0LXByaWNpbmctZm9yLWNhcmFmYXRlIjthOjI6e2k6MDtzOjMwOiJpbmplY3RlZC5zcGFtLXNlb19jYXJhZmF0ZS4wMDQiO2k6MTtpOjExO319czo4OiJrbGFyaWNpZCI7YTo1OntpOjA7aToxMDtzOjEyOiJidXkta2xhcmljaWQiO2E6Mjp7aTowO3M6MzA6ImluamVjdGVkLnNwYW0tc2VvX2tsYXJpY2lkLjAwMSI7aToxO2k6MTE7fXM6MTU6ImJ1eWluZy1rbGFyaWNpZCI7YToyOntpOjA7czozMDoiaW5qZWN0ZWQuc3BhbS1zZW9fa2xhcmljaWQuMDAyIjtpOjE7aToxMTt9czoxNDoib3JkZXIta2xhcmljaWQiO2E6Mjp7aTowO3M6MzA6ImluamVjdGVkLnNwYW0tc2VvX2tsYXJpY2lkLjAwMyI7aToxO2k6MTE7fXM6Mjg6IndhbG1hcnQtcHJpY2luZy1mb3Ita2xhcmljaWQiO2E6Mjp7aTowO3M6MzA6ImluamVjdGVkLnNwYW0tc2VvX2tsYXJpY2lkLjAwNCI7aToxO2k6MTE7fX1zOjc6Imxhbm94aW4iO2E6NTp7aTowO2k6MTA7czoxMToiYnV5LWxhbm94aW4iO2E6Mjp7aTowO3M6Mjk6ImluamVjdGVkLnNwYW0tc2VvX2xhbm94aW4uMDAxIjtpOjE7aToxMTt9czoxNDoiYnV5aW5nLWxhbm94aW4iO2E6Mjp7aTowO3M6Mjk6ImluamVjdGVkLnNwYW0tc2VvX2xhbm94aW4uMDAyIjtpOjE7aToxMTt9czoxMzoib3JkZXItbGFub3hpbiI7YToyOntpOjA7czoyOToiaW5qZWN0ZWQuc3BhbS1zZW9fbGFub3hpbi4wMDMiO2k6MTtpOjExO31zOjI3OiJ3YWxtYXJ0LXByaWNpbmctZm9yLWxhbm94aW4iO2E6Mjp7aTowO3M6Mjk6ImluamVjdGVkLnNwYW0tc2VvX2xhbm94aW4uMDA0IjtpOjE7aToxMTt9fXM6MTA6InZhcmRlbmFmaWwiO2E6NTp7aTowO2k6MTA7czoxNDoiYnV5LXZhcmRlbmFmaWwiO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX3ZhcmRlbmFmaWwuMDAxIjtpOjE7aToxMTt9czoxNzoiYnV5aW5nLXZhcmRlbmFmaWwiO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX3ZhcmRlbmFmaWwuMDAyIjtpOjE7aToxMTt9czoxNjoib3JkZXItdmFyZGVuYWZpbCI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fdmFyZGVuYWZpbC4wMDMiO2k6MTtpOjExO31zOjMwOiJ3YWxtYXJ0LXByaWNpbmctZm9yLXZhcmRlbmFmaWwiO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX3ZhcmRlbmFmaWwuMDA0IjtpOjE7aToxMTt9fXM6MjA6IjxkaXYgc3R5bGU9ImRpc3BsYXk6IjthOjQ6e2k6MDtpOjEwO3M6MzA6IjxzcGFuIHN0eWxlPSJjb2xvcjogI2ZmZmZmZTsiPiI7YToyOntpOjA7czoyMzoiaW5qZWN0ZWQuaGlkZGVuLWRpdi4wMTEiO2k6MTtzOjcwOiJ+PGRpdiBzdHlsZT0iZGlzcGxheTogbm9uZTs/Ij48c3BhbiBzdHlsZT0iY29sb3I6ICNmZmZmZmU7Ij4uKj88L2Rpdj5+Ijt9czoxMjQ6In5ob3cgdG8gd2luIGJhY2sgeW91ciBleHx0by1nZXQtZXgtYmFjay5vcmcvfGZhcm1hY2lhMjR8dmlhZ3JhfHRhZGFmaWx8ZXNzYXl8bGV2aXRyYXxjcmVkaXQgc2NvcmV8bW9ydGdhZ2V8Y2FzaW5vfHByb3BlY2lhfmkiO2E6Mjp7aTowO3M6MjM6ImluamVjdGVkLmhpZGRlbi1kaXYuMDAyIjtpOjE7czoxNzM6In48ZGl2IHN0eWxlPSJkaXNwbGF5OlxzKm5vbmU7PyI+Lio/KD86aG93IHRvIHdpbiBiYWNrIHlvdXIgZXh8dG8tZ2V0LWV4LWJhY2sub3JnL3xmYXJtYWNpYTI0fHZpYWdyYXx0YWRhZmlsfGVzc2F5fGxldml0cmF8Y3JlZGl0IHNjb3JlfG1vcnRnYWdlfGNhc2lub3xwcm9wZWNpYSkuKj88XC9kaXY+fmlzIjt9czo0MjoifjxkaXYgc3R5bGU9ImRpc3BsYXk6ID9ub25lOz8iPi4rPzwvZGl2Pn5zIjthOjI6e2k6MDtzOjIzOiJpbmplY3RlZC5oaWRkZW4tZGl2LjAzMyI7aToxO2k6MTE7fX1zOjg6ImRpZmx1Y2FuIjthOjQ6e2k6MDtpOjEwO3M6ODoiZGlmbHVjYW4iO2E6Mjp7aTowO3M6MzA6ImluamVjdGVkLnNwYW0tc2VvX2RpZmx1Y2FuLjAwMSI7aToxO3M6OToic3BhbV9saW5rIjt9czoyMDoiYnV5ZGlmbHVjYW5jaGVhcC5jb20iO2E6Mjp7aTowO3M6MzA6ImluamVjdGVkLnNwYW0tc2VvX2RpZmx1Y2FuLjAwMiI7aToxO3M6OToic3BhbV9saW5rIjt9czoxODoiYnV5ZGlmbHVjYW5vbmxpbmVlIjthOjI6e2k6MDtzOjMwOiJpbmplY3RlZC5zcGFtLXNlb19kaWZsdWNhbi4wMDMiO2k6MTtzOjk6InNwYW1fbGluayI7fX1zOjk6ImNoZWFwLmNvbSI7YTo0OntpOjA7aToxMDtzOjE4OiJidXlmbGFneWxjaGVhcC5jb20iO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMTIzIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIwOiJidXlsZXZhcXVpbmNoZWFwLmNvbSI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4xMjQiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjA6ImJ1eW5vbHZhZGV4Y2hlYXAuY29tIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjEyNSI7aToxO3M6OToic3BhbV9saW5rIjt9fXM6NDoiYXNpeCI7YTo0OntpOjA7aToxMDtzOjU6Imxhc2l4IjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5zcGFtLXNlb19sYXNpeC4wMDEiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTc6ImJ1eWxhc2l4Y2hlYXAuY29tIjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5zcGFtLXNlb19sYXNpeC4wMDIiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTc6ImJ1eUxhc2l4Y2hlYXAuY29tIjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5zcGFtLXNlb19sYXNpeC4wMDMiO2k6MTtzOjk6InNwYW1fbGluayI7fX1zOjEwOiJzdWJsaW5ndWFsIjthOjQ6e2k6MDtpOjEwO3M6MTQ6ImJ1eS1zdWJsaW5ndWFsIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDIwIjtpOjE7aToxMTt9czoxNzoiYnV5aW5nLXN1Ymxpbmd1YWwiO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4wMjEiO2k6MTtpOjExO31zOjE2OiJvcmRlci1zdWJsaW5ndWFsIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDIyIjtpOjE7aToxMTt9fXM6NjoiZXNjb3J0IjthOjQ6e2k6MDtpOjEwO3M6MTk6ImJleWxpa2TDvHrDvCBlc2NvcnQiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLnNwYW0tc2VvX3Bvcm4uMDA3IjtpOjE7czoxNDoic3BhbV9saW5rX3RleHQiO31zOjE2OiJnYXppYW50ZXAgZXNjb3J0IjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5zcGFtLXNlb19wb3JuLjAwOSI7aToxO3M6MTQ6InNwYW1fbGlua190ZXh0Ijt9czoxNjoiZXNjb3J0IGdhemlhbnRlcCI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQuc3BhbS1zZW9fcG9ybi4wMTAiO2k6MTtzOjE0OiJzcGFtX2xpbmtfdGV4dCI7fX1zOjc6InRlcm9pZHMiO2E6NDp7aTowO2k6MTA7czoxNToic3Rlcm9pZHMgb25saW5lIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMTE4IjtpOjE7aToxMTt9czoxMjoiYnV5c3Rlcm9pZHNzIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDM5IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE4OiJ3aGVyZXRvZ2V0c3Rlcm9pZHMiO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4wNzAiO2k6MTtzOjk6InNwYW1fbGluayI7fX1zOjc6InN0dWRlbnQiO2E6Mzp7aTowO2k6MTA7czoxNDoicGFwZXIgd3JpdGluZzwiO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLnNwYW0tc2VvX2Vzc2F5LjA1MiI7aToxO2k6MTE7fXM6MTc6ImhvbWV3b3JrIG1pbnV0ZXM8IjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5zcGFtLXNlb19lc3NheS4wNTQiO2k6MTtpOjExO319czo3OiJHZW5lcmljIjthOjI6e2k6MDtpOjEwO3M6ODoiT3ZlcnNlYXMiO2E6Mjp7aTowO2k6MTA7czoxMzoiQ2lwcm9mbG94YWNpbiI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW8ucGhhcm1hY3ktb25saW5lLjA4OSI7aToxO2k6MTE7fX19czo0NjoiPHAgc3R5bGU9InBvc2l0aW9uOiBhYnNvbHV0ZTsgbGVmdDogLTI1MDBweDsiPiI7YToyOntpOjA7aToxMDtzOjEwOiIvcCZndDs8L3A+IjthOjI6e2k6MDtzOjMwOiJpbmplY3RlZC5zcGFtLXNlb19oaWRkZW5fcC4wMDEiO2k6MTtpOjExO319czo2OiJzdXByYXgiO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4wMzIiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTE6ImFjY3V0YW5lYnV5IjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDMzIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjExOiJhbGJlbmRhem9sZSI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjAzNCI7aToxO3M6OToic3BhbV9saW5rIjt9czoyNDoiYXJlLW1lZHMtZnJvbS1pbmRpYS1zYWZlIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDM1IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE2OiJidXktZG94eWN5Y2xpbmUtIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDM2IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjEyOiJidXlub3J4MS5jb20iO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4wMzciO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTI6ImJ1eW5vcnh4LmNvbSI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjAzOCI7aToxO3M6OToic3BhbV9saW5rIjt9czo4OiJjaXBybzI0aCI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjA0MCI7aToxO3M6OToic3BhbV9saW5rIjt9czoxMDoiY29sY2hpY2luZSI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjA0MSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxMDoiZGFwb3hldGluZSI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjA0MiI7aToxO3M6OToic3BhbV9saW5rIjt9czoxMDoiRGlzdWxmaXJhbSI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjA0MyI7aToxO3M6OToic3BhbV9saW5rIjt9czo5OiJkcnVnc3RvcmUiO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4wNDQiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTg6ImR6aXRocm9tYXhzYnV5LmNvbSI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjA0NSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxMToiRmx1Y29uYXpvbGUiO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4wNDYiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTc6ImhlYWx0aGNhcmV4eXouY29tIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDQ3IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjc6ImthbWFyZ2EiO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4wNDgiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTI6Im1ldGhvdHJleGF0ZSI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjA0OSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxMToibWlzb3Byb3N0b2wiO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4wNTAiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjU6Im5hc2FsLXBvbHlwLXRyZWF0bWVudC5jb20iO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4wNTEiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6OToiTmF0cmV4b25lIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDUyIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjExOiJuZXRtZWR4LmNvbSI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjA1MyI7aToxO3M6OToic3BhbV9saW5rIjt9czo3OiJuaXpvcmFsIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDU0IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE0OiJvcmRlcm5vcnh4LmNvbSI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjA1NSI7aToxO3M6OToic3BhbV9saW5rIjt9czoyMzoiaHR0cDovL3BpbGxzZm9yZGljay5jb20iO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4wNTYiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTE6InByb3ByYW5vbG9sIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDU4IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE0OiJSZXRpbmEgZGlzcGxheSI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjA1OSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxMzoicnhzaG9wbm93LmNvbSI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjA2MCI7aToxO3M6OToic3BhbV9saW5rIjt9czoxOToic2RveHljeWNsaW5lYnV5LmNvbSI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjA2MSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxMDoic2lsZGVuYWZpbCI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjA2MiI7aToxO3M6OToic3BhbV9saW5rIjt9czo3OiJzb3ZhbGRpIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDYzIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjc6InNwaXJpdmEiO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4wNjQiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6OToidGFtb3hpZmVuIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDY1IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjY6InZhbGl1bSI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjA2NiI7aToxO3M6OToic3BhbV9saW5rIjt9czo2OiJWYWxpdW0iO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4wNjciO2k6MTtzOjk6InNwYW1fbGluayI7fXM6NjoidmVybW94IjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDY4IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjI0OiJ3aGVyZS1jYW4taS1idXktcGhlbmdyZW4iO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4wNjkiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjE6IndvbWVuLWhlYWx0aC1zaG9wLmNvbSI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjA3MSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNToieGVuaWNhbC1zaGlwcGVyIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDcyIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjY6InpvbG9mdCI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjA3MyI7aToxO3M6OToic3BhbV9saW5rIjt9czoxMToiYW1veGljaWxsaW4iO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4wODMiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6ODoiYmFjbG9mZW4iO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4wODYiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6OToiZXN0cmFkaW9sIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDg3IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjEwOiJwcmVkbmlzb25lIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDg4IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIzOiJidXkgaXNvdHJldGlub2luIG9ubGluZSI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjA3NCI7aToxO3M6OToic3BhbV9saW5rIjt9czoxMDoiYnV5IHByb3phYyI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjA3NSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNDoiY2hlYXAgVmVudG9saW4iO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4wNzYiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjA6Imxldm9ub3JnZXN0cmVsIHByaWNlIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDc3IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE2OiJwdXJjaGFzZSBMYW1pc2lsIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDc4IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjEyOiJidXkgYWNjdXRhbmUiO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4wOTYiO2k6MTtzOjE0OiJzcGFtX2xpbmtfdGV4dCI7fXM6MjE6ImFtZXJpY2FubGFuZG93bmVyLmNvbSI7YToyOntpOjA7czozNDoiaW5qZWN0ZWQuc3BhbS1zZW9fcGF5ZGF5LWxvYW5zLjAxNCI7aToxO3M6OToic3BhbV9saW5rIjt9czoyMjoiYW1lcmljYW5sYW5kb3duZXJzLmNvbSI7YToyOntpOjA7czozNDoiaW5qZWN0ZWQuc3BhbS1zZW9fcGF5ZGF5LWxvYW5zLjAxNSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNzoiYXBwcmFpc2VkNHlvdS5jb20iO2E6Mjp7aTowO3M6MzQ6ImluamVjdGVkLnNwYW0tc2VvX3BheWRheS1sb2Fucy4wMTYiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjA6ImNyZWRpdG5vcHJvYmxlbXMuY29tIjthOjI6e2k6MDtzOjM0OiJpbmplY3RlZC5zcGFtLXNlb19wYXlkYXktbG9hbnMuMDE3IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE1OiJkZWJ0c2V0dGxlbWVudHQiO2E6Mjp7aTowO3M6MzQ6ImluamVjdGVkLnNwYW0tc2VvX3BheWRheS1sb2Fucy4wMTgiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTM6ImRvd25tb3J0Z2FnZXMiO2E6Mjp7aTowO3M6MzQ6ImluamVjdGVkLnNwYW0tc2VvX3BheWRheS1sb2Fucy4wMTkiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjQ6Im9ubGluZXBheWRheWxvYW4tMjRoLmNvbSI7YToyOntpOjA7czozNDoiaW5qZWN0ZWQuc3BhbS1zZW9fcGF5ZGF5LWxvYW5zLjAyMCI7aToxO3M6OToic3BhbV9saW5rIjt9czoxMjoicXVpY2sgcGF5ZGF5IjthOjI6e2k6MDtzOjM0OiJpbmplY3RlZC5zcGFtLXNlb19wYXlkYXktbG9hbnMuMDIxIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE5OiJvbmxpbmUtY2FzaC1hZHZhbmNlIjthOjI6e2k6MDtzOjM0OiJpbmplY3RlZC5zcGFtLXNlb19wYXlkYXktbG9hbnMuMDIyIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIxOiJjaGVja2NyZWRpdHNjb3JlZmZyZWUiO2E6Mjp7aTowO3M6MzQ6ImluamVjdGVkLnNwYW0tc2VvX3BheWRheS1sb2Fucy4wMjMiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjE6ImNvdXJzZXdvcmtzZXJ2aWNlLmNvbSI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuc3BhbS1zZW9fZXNzYXkuMDIyIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjI5OiJjdXN0b21wYXBlcndyaXRpbmdzZXJ2aWNlLm5ldCI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuc3BhbS1zZW9fZXNzYXkuMDIzIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE1OiJkaXBsb21hZmFrZXMuY28iO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLnNwYW0tc2VvX2Vzc2F5LjAyNCI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNzoicGFwZXI0Y29sbGVnZS5jb20iO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLnNwYW0tc2VvX2Vzc2F5LjAyNSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxMzoicGFwZXJ3cml0aW5nMSI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuc3BhbS1zZW9fZXNzYXkuMDI2IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIzOiJyZXNlYXJjaHBhcGVyd3JpdGVyLm5ldCI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuc3BhbS1zZW9fZXNzYXkuMDI3IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIwOiJ0ZXJtcGFwZXJzd3JpdGVyLm9yZyI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuc3BhbS1zZW9fZXNzYXkuMDI4IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIwOiJ0b3B1c2F1bml2ZXJzaXR5LmNvbSI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuc3BhbS1zZW9fZXNzYXkuMDI5IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE2OiJ3ZWRvaG9tZXdvcmsubmV0IjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5zcGFtLXNlb19lc3NheS4wMzAiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjM6IndyaXRlbXllbmdsaXNocGFwZXIub3JnIjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5zcGFtLXNlb19lc3NheS4wMzEiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjM6IndyaXRpbmdzZXJ2aWNlczR5b3UuY29tIjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5zcGFtLXNlb19lc3NheS4wMzMiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTk6IndyaXRlbXlwYXBlcjRtZS5vcmciO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLnNwYW0tc2VvX2Vzc2F5LjAzNCI7aToxO3M6OToic3BhbV9saW5rIjt9czoxOToid3JpdGVteWVzc2F5NG1lLm9yZyI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuc3BhbS1zZW9fZXNzYXkuMDQxIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjEwOiJlc3NheWJlYXJzIjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5zcGFtLXNlb19lc3NheS4wNDYiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTE6InNtYXJ0eWVzc2F5IjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5zcGFtLXNlb19lc3NheS4wNDciO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTc6ImNlbWVudCB0b25ndWUgNXNhIjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5zcGFtLXNlb19zaG9lcy4wMDMiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6NzoiaGFyZSA3cyI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuc3BhbS1zZW9fc2hvZXMuMDA0IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjEyOiJsb3cgYnJlZCAxMXMiO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLnNwYW0tc2VvX3Nob2VzLjAwNSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNjoibWlkbmlnaHQgbmF2eSA1cyI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuc3BhbS1zZW9fc2hvZXMuMDA2IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjEyOiJwbGF5b2ZmcyAxMXMiO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLnNwYW0tc2VvX3Nob2VzLjAwNyI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNjoibXVsYmVycnkgb3V0bGV0cyI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuc3BhbS1zZW9fc2hvZXMuMDA4IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjMwOiJjaGF1c3N1cmVzIGNocmlzdGlhbiBsb3Vib3V0aW4iO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLnNwYW0tc2VvX3Nob2VzLjAwOSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNDoicHJhZGEgc2hvZXMgdWsiO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLnNwYW0tc2VvX3Nob2VzLjAxMCI7aToxO3M6OToic3BhbV9saW5rIjt9czoyMDoibXVsYmVycnkgaGFuZGJhZ3MgdWsiO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLnNwYW0tc2VvX3Nob2VzLjAxMSI7aToxO3M6OToic3BhbV9saW5rIjt9czoyODoidmVudGUgZGUgY2hhdXNzdXJlcyBlbiBsaWduZSI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuc3BhbS1zZW9fc2hvZXMuMDEyIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjExOiJtY20gaGFuZGJhZyI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuc3BhbS1zZW9fc2hvZXMuMDEzIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE5OiJzY2FycGUgaG9nYW4gb3V0bGV0IjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5zcGFtLXNlb19zaG9lcy4wMTQiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTc6ImhvZ2FuIHNjYXJwZSB1b21vIjthOjI6e2k6MDtzOjI3OiJpbmplY3RlZC5zcGFtLXNlb19zaG9lcy4wMTUiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTU6InJlcGxpY2Egd2F0Y2hlcyI7YToyOntpOjA7czoyOToiaW5qZWN0ZWQuc3BhbS1zZW9fd2F0Y2hlcy4wMDEiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjM6ImJ1eXJvbGV4cmVwbGljYXdhdGNoZXNzIjthOjI6e2k6MDtzOjI5OiJpbmplY3RlZC5zcGFtLXNlb193YXRjaGVzLjAwMiI7aToxO3M6OToic3BhbV9saW5rIjt9czoyNToid29ybGRwdWxzZS5jb20vbm9kZS82MjIyOCI7YToyOntpOjA7czoyOToiaW5qZWN0ZWQuc3BhbS1zZW9fd2F0Y2hlcy4wMDYiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6NzE6ImFydGljbGVzLXN1Ym1pc3Npb24ub3Vyc2NvbXBhbnkuY29tLz9wdHlwZT1wcmV2aWV3JmFtcDthbG9vaz0xJmFtcDtwaWQ9IjthOjI6e2k6MDtzOjI5OiJpbmplY3RlZC5zcGFtLXNlb193YXRjaGVzLjAwNyI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNzoid3d3LmJyYW5kaWcuY28udWsiO2E6Mjp7aTowO3M6MjE6ImluamVjdGVkLnNwYW0tc2VvLjAwNyI7aToxO3M6OToic3BhbV9saW5rIjt9czo4OiJ2b2x0YXJvbCI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW8ucGhhcm1hY3ktb25saW5lLjA4NSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNzoibGFiZXRhbG9sIG9ubGluZTwiO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvLnBoYXJtYWN5LW9ubGluZS4wODYiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjU6InB1cmNoYXNlIHBhcmxvZGVsIG9ubGluZTwiO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvLnBoYXJtYWN5LW9ubGluZS4wODciO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTk6Ij5jYXB0b3ByaWwgY2Fwb3RlbjwiO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvLnBoYXJtYWN5LW9ubGluZS4wODgiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjY6Im15LWFmZmlsaWF0ZXMtcHJvZ3JhbXMuY29tIjthOjI6e2k6MDtzOjMwOiJpbmplY3RlZC5zcGFtLXNlb19nZXQtcmljaC4wMDEiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjI6ImNhbmliZWFtaWxsaW9uYWlyZS5jb20iO2E6Mjp7aTowO3M6MzA6ImluamVjdGVkLnNwYW0tc2VvX2dldC1yaWNoLjAwMiI7aToxO3M6OToic3BhbV9saW5rIjt9czoxODoibWFrZW1vbmV5aW50ZXJuZXR0IjthOjI6e2k6MDtzOjMwOiJpbmplY3RlZC5zcGFtLXNlb19nZXQtcmljaC4wMDMiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTc6Im1sbXN1Y2Nlc3Nmb3JtdWxhIjthOjI6e2k6MDtzOjMwOiJpbmplY3RlZC5zcGFtLXNlb19nZXQtcmljaC4wMDQiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjE6Im1sbXN1Y2Nlc3Nmb3JtdWxhLmNvbSI7YToyOntpOjA7czozMDoiaW5qZWN0ZWQuc3BhbS1zZW9fZ2V0LXJpY2guMDA1IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE2OiJzdGFydC1zdWNjZXNzLXVwIjthOjI6e2k6MDtzOjMwOiJpbmplY3RlZC5zcGFtLXNlb19nZXQtcmljaC4wMDYiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjA6InRlYW1idWlsZG5ldHdvcmsub3JnIjthOjI6e2k6MDtzOjMwOiJpbmplY3RlZC5zcGFtLXNlb19nZXQtcmljaC4wMDciO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTY6InlvdS1zdGFydC11cC5jb20iO2E6Mjp7aTowO3M6MzA6ImluamVjdGVkLnNwYW0tc2VvX2dldC1yaWNoLjAwOCI7aToxO3M6OToic3BhbV9saW5rIjt9czozMDoiYWRvYmVjcmVhdGl2ZXN1aXRlZG93bmxvYWQuY29tIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjAxNSI7aToxO3M6OToic3BhbV9saW5rIjt9czoyNToiYWRvYmVhY3JvYmF0ZG93bmxvYWRkLmNvbSI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4wMTYiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjQ6ImFkb2JlYWNyb2JhdHNvZnR3YXJlLmNvbSI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4wMTciO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTk6ImNkbm91dGxldG9uc2FsZS5jb20iO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDE4IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIwOiJkb3dubG9hZGFkb2JlY3M2Lm9yZyI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4wMTkiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjU6Imdvb2RhbnRpdmlydXNzb2Z0d2FyZS5jb20iO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDIwIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjI0OiJtb3ZpZWRvd25sb2FkbWFuYWdlci5jb20iO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDIxIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE1OiJzb2Z0d2FyZS1mb3IteHAiO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDIyIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjI1OiJzcHktcGhvbmUtc29mdHdhcmUtb25saW5lIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjAyMyI7aToxO3M6OToic3BhbV9saW5rIjt9czoyODoidGhlYmVzdGFudGl2aXJ1c3NvZnR3YXJlLm5ldCI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4wMjQiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjI6ImJlc3RhbnRpdmlydXNzb2Z0d2FyZTEiO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDI1IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjI3OiJ0aGViZXN0Y29tcHV0ZXJzb2Z0d2FyZS5jb20iO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDI2IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIzOiJ3d3cudGV4YXNnb2xkZW5naXJsLmNvbSI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW9fdmlhZ3JhLjAwMSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxMzoianVtcGJvb2JzLmNvbSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQuc3BhbS1zZW9fbGluay4wMTMiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6Mjg6Ij5tb2lzc2FuaXRlIGVuZ2FnZW1lbnQgcmluZ3MiO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDM0IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE5OiJwYXJhd2FuYW9ib3lhaC5pbmZvIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjAzNSI7aToxO3M6OToic3BhbV9saW5rIjt9czoyMToifTsgd3BPdXJwdXNoZXIoImh0dHA6IjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjAzNiI7aToxO3M6OToic3BhbV9saW5rIjt9czo1OiIyNDdwaCI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4wMzciO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTQ6ImFic2Nhbm5pbmcuY29tIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjAzOCI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNjoiYWN0aXZpdGllc3RhYmxlcyI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4wMzkiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTQ6ImFsbC1mb3J1bXMuYml6IjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjA0MCI7aToxO3M6OToic3BhbV9saW5rIjt9czoyMToiYW1lcmljYW50cmFuc3BvcnRwZXJ1IjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjA0MSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxMzoiYW1lcmlseW54Lm5ldCI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4wNDIiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTM6ImFyYXVqb2FsdmFyZXoiO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDQzIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE3OiJhcmVseXNmcmFua2VuLmNvbSI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4wNDQiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTk6ImFydGVzLW1hcmNpYWxlcy5jb20iO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDQ1IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjI0OiJhdXRvcmVzcG9uZGVyLm1tLXByb2plY3QiO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDQ2IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjI2OiJiZWF1dGlmdWxzdW1tZXJtb3JuaW5nLmNvbSI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4wNDciO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjI6ImJlc3RhZmZpbGlhdGVsYW5kbWluZXMiO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDQ4IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE1OiJiaWtlY29sbGVjdGl2ZXMiO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDQ5IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE0OiJiaWtlcmNoaWNrei53cyI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4wNTAiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTY6ImNhbGxpbnNlYXJjaC5jb20iO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDUxIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjEyOiJjYW5kbGVzdG9uZXMiO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDUyIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjEyOiJjYXBlY28uZWR1LnAiO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDUzIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIxOiJjYXB0YWluZHNndWlkZXNlcnZpY2UiO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDU0IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE2OiJjYXNleXNjb3JuZXIuY29tIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjA1NSI7aToxO3M6OToic3BhbV9saW5rIjt9czo2OiJjZWZ0aW4iO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDU2IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIxOiJjbGFyaWZ5dGhldHJ1dGhpbmNoaW4iO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDU3IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjEzOiJjbGluZXNpdGUuY29tIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjA1OCI7aToxO3M6OToic3BhbV9saW5rIjt9czoxMzoiY29tdW5pY2FyLm9yZyI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4wNTkiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTQ6ImNvbmdyZXNzZmF4LmNvIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjA2MCI7aToxO3M6OToic3BhbV9saW5rIjt9czo4OiJjcHBsLm9yZyI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4wNjEiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTU6ImNyZWVrMmNvYXN0LmNvbSI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4wNjIiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjM6ImN1cGlkb2ludGVybmFjaW9uYWwuY29tIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjA2MyI7aToxO3M6OToic3BhbV9saW5rIjt9czo5OiJjd3RyYW5zbGwiO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDY0IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjEyOiJkYWxlbWFyay5jb20iO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDY1IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE1OiJkZWx0YXNvbmVvbmxpbmUiO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDY2IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE3OiJkb3VnbGFzbWlzcXVpdGEuYyI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4wNjciO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTQ6ImVkdWFpZGd1cnUuY29tIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjA2OCI7aToxO3M6OToic3BhbV9saW5rIjt9czoxMjoiZWxjYXJyZXRlLmNsIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjA2OSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxMzoiZW1iYWxhamVzcGVydSI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4wNzAiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTU6ImVuem9zcmVzdGF1cmFudCI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4wNzEiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTY6ImV4dHJlbWV2YWx1ZWhvc3QiO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDcyIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE1OiJmb3JtYXRpb25zdHVkaW8iO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDczIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE2OiJmcmVlLXRyYWZmaWNib29tIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjA3NCI7aToxO3M6OToic3BhbV9saW5rIjt9czoxMjoiaG90c3BpbGwuY29tIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjA3NSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxODoiaG93dG91c2VteWlwYWQuY29tIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjA3NiI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNjoiY2hhbXBhZ25hdDM3LmNvbSI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4wNzciO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTQ6ImNoYW5uZWxrb2xrYXRhIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjA3OCI7aToxO3M6OToic3BhbV9saW5rIjt9czoyMzoiY2hlYXB3ZXN0Y2lnYXJldHRlcy5jb20iO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDc5IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjI4OiJjaGVzdGVyZmllbGRjaWdhcmV0dGVzNHUub3JnIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjA4MCI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNToiY2hpY2tuZWdnc3VwcGx5IjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjA4MSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNjoiam9hbmJlYXVsaWV1LmNvbSI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4wODIiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTg6Imp1cmlzcHJ1ZGVuY2lhY2l2aSI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4wODMiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTM6ImxpYmVydHlkaW5pbmciO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDg0IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE2OiJsaWZlNHN1Y2Nlc3MubmV0IjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjA4NSI7aToxO3M6OToic3BhbV9saW5rIjt9czoyODoibWVkaWNhbGNhcmVvbnRoZWludGVybmV0LmNvbSI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4wODYiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6Mjc6Im1lZGljYXRpb25zb25saW5lZG9jdG9yLmNvbSI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4wODciO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTc6Im1pcmFjbGUtcHJlZ25hbmN5IjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjA4OCI7aToxO3M6OToic3BhbV9saW5rIjt9czoyMzoibW9iaWxlY29udGVudHN0b3JlLm1vYmkiO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDg5IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjI0OiJvbmVkb2xsYXIubW0tcHJvamVjdC5jb20iO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDkwIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE2OiJvbmVuZXRjZW50ZXIuY29tIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjA5MSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNzoicGFzc2lvbm9mbGlmZS5uZXQiO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDkzIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjEwOiJxZ2FzLmNvLnVrIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjA5NCI7aToxO3M6OToic3BhbV9saW5rIjt9czoxMzoicngtcHJpY2VzLmNvbSI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4wOTUiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTQ6InNlZWF2aXNpb24uY29tIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjA5NiI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNToic2hhcmUtdmlkZW8uaW5mIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjA5NyI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNToic2lsdmVyd2F0ZXJjYWZlIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjA5OCI7aToxO3M6OToic3BhbV9saW5rIjt9czo5OiJ0NGhiLmluZm8iO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMDk5IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE5OiJ0YWtlYWZyZWVjcnVpc2UuY29tIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjEwMCI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNjoidWdjcy5jYWx0ZWNoLmVkdSI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4xMDEiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTc6InVuaXRlZHJldGVrLmNvLnVrIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjEwMiI7aToxO3M6OToic3BhbV9saW5rIjt9czoxMToid2ViZW1lZC5jb20iO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMTAzIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIwOiJ3aWNoaXRhYnJvYWRiYW5kLmNvbSI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4xMDQiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjE6Ind3dy5hbXBoaS1mZXN0aXZhbC5kZSI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4xMDUiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTY6Ind3dy5wb29sZGF5LmluZm8iO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMTA2IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjI0OiJ3d3cuc2NvcmUtbG91aXN2aWxsZS5vcmciO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMTA3IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIyOiJ3d3cudWx0cmFkYXJrcmFkaW8uY29tIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjEwOCI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNjoid3d3LnlhbGVhYXNhLm9yZyI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4xMDkiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjE6InlvdXJkaXNjb3VudDRmcmVlLmNvbSI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4xMTAiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6NjoiY3lhbGlzIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5zcGFtLXNlb19saW5rLjAwMiI7aToxO3M6MTQ6InNwYW1fbGlua190ZXh0Ijt9czoxNzoiY2hlYXAgbmZsIGplcnNleXMiO2E6Mjp7aTowO3M6MjY6ImluamVjdGVkLnNwYW0tc2VvX2xpbmsuMDAzIjtpOjE7czoxNDoic3BhbV9saW5rX3RleHQiO31zOjE5OiJjaGVhcCBqZXJzZXlzIGNoaW5hIjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5zcGFtLXNlb19saW5rLjAwNCI7aToxO3M6MTQ6InNwYW1fbGlua190ZXh0Ijt9czoxNDk6InJ0ZG9jay5jb20vYnBvLXJvY2tldHRhYi1qcy8/cGlkPTcyNjk2MzY4NzI2OTc2NjU3MjZkNjU2NDY5NjE1ZjczNjU3MjcwJmFtcDtlaWQ9ZmFzdGNvbm5lY3QxJmFtcDtibmFtZT1GYXN0Q29ubmVjdCZhbXA7cHJvZHVjdD1mYyZhbXA7YWZmaWxpYXRlaWQ9MDE3IjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjExMSI7aToxO3M6OToic3BhbV9saW5rIjt9czozNDoid2VzdGVybnVuaW9uLWNvdW50cnktbG9jYXRpb25zLmNvbSI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4xMTIiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjY6Indlc3Rlcm51bmlvbi1sb2NhdGlvbnMuY29tIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjExMyI7aToxO3M6OToic3BhbV9saW5rIjt9czoyMzoibW9uZXlncmFtbG9jYXRpb25zLmluZm8iO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMTE0IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIwOiJtdXNjbGUtdHJhaW5pbmcuaW5mbyI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4xMTUiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6Mjg6Im15LWJlYXV0eS1oZWFsdGgtZml0bmVzcy5jb20iO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMTE2IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE5OiJhcm9tYXRlcmFwaWEuY29tLnBlIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjExNyI7aToxO3M6OToic3BhbV9saW5rIjt9czoyMToiY2hvb3NlZ3JlYXRoZWFsdGguY29tIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjExOCI7aToxO3M6OToic3BhbV9saW5rIjt9czoxMToibG9zZWV3ZWlnaHQiO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvX2NoZWFwLWJ1eXMuMTE5IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIyOiJvdmVyNTBsb3Npbmd3ZWlnaHQuY29tIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjEyMCI7aToxO3M6OToic3BhbV9saW5rIjt9czoyNzoid3d3LmhlYWx0aGZpdG5lc3NyZW1lZHkuY29tIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19jaGVhcC1idXlzLjEyMSI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNjoid3d3LmdvdG9jZXJ0LmNvbSI7YToyOntpOjA7czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9fY2hlYXAtYnV5cy4xMjIiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6Mjk6ImNhbmFkaWFucGhhcm1hY3k0YmVzdGxpZmUuY29tIjthOjI6e2k6MDtzOjI0OiJpbmplY3Rpb24uc3BhbV9saW5rcy4wMDIiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjY6InBoYXJtYWN5Y2FuYWRhLXJ4ZWR0b3AuY29tIjthOjI6e2k6MDtzOjI0OiJpbmplY3Rpb24uc3BhbV9saW5rcy4wMDMiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MjU6InBoYXJtYWN5b25saW5lNGJldHRlci5jb20iO2E6Mjp7aTowO3M6MjQ6ImluamVjdGlvbi5zcGFtX2xpbmtzLjAwNCI7aToxO3M6OToic3BhbV9saW5rIjt9czoyODoiZGlzY291bnRwaGFybWFjeS1yeHN0b3JlLmNvbSI7YToyOntpOjA7czoyNDoiaW5qZWN0aW9uLnNwYW1fbGlua3MuMDA1IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjMyOiIgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO2xlZnQ6LSI7YToxOntpOjA7czoyMzoiaW5qZWN0ZWQuaGlkZGVuLWRpdi4wMzQiO31zOjM3OiIgaGVpZ2h0PSIwIiBmcmFtZWJvcmRlcj0iMCI+PC9pZnJhbWU+IjthOjE6e2k6MDtzOjIwOiJpZnJhbWUuaW5qZWN0aW9uLjAxNiI7fXM6MzU6InN0eWxlPSJ0ZXh0LWRlY29yYXRpb246bm9uZTtjb2xvcjojIjthOjE6e2k6MDtzOjI0OiJpbmplY3Rpb24uaGlkZGVuLWRpdi4wMzUiO31zOjQ4OiJjb2xvcjogI2ZmZmZmZjsgZm9udC1zaXplOiAwLjFweDsgZGlzcGxheTogbm9uZTsiO2E6MTp7aTowO3M6MjQ6ImluamVjdGlvbi5oaWRkZW4tZGl2LjAzNiI7fXM6MzQ6ImRpc3BsYXk6IG5vbmU7IHZpc2liaWxpdHk6IGhpZGRlbjsiO2E6MTp7aTowO3M6MjQ6ImluamVjdGlvbi5oaWRkZW4tZGl2LjAzNyI7fXM6NDA6IjxhIHN0eWxlPSJ0ZXh0LWRlY29yYXRpb246bm9uZSIgaHJlZj0iLy8iO2E6MTp7aTowO3M6Mjc6ImluamVjdGlvbi5oaWRkZW5fYS1ocmVmLjAwMyI7fXM6NDE6IjxhIHN0eWxlPSJ0ZXh0LWRlY29yYXRpb246IG5vbmUiIGhyZWY9Ii8vIjthOjE6e2k6MDtzOjI3OiJpbmplY3Rpb24uaGlkZGVuX2EtaHJlZi4wMDQiO31zOjkzOiI8YSBzdHlsZT0idGV4dC1kZWNvcmF0aW9uOiBub25lOyBjb2xvcjogaW5oZXJpdDsgY3Vyc29yOiBkZWZhdWx0OyBvdXRsaW5lOiBub25lOyIgaHJlZj0iaHR0cDoiO2E6MTp7aTowO3M6Mjc6ImluamVjdGlvbi5oaWRkZW5fYS1ocmVmLjAwNSI7fXM6ODM6InN0eWxlPSJwb3NpdGlvbjogYWJzb2x1dGU7IG9wYWNpdHk6IDAuMDAxOyB6LWluZGV4OiAxMDsgZmlsdGVyOiBhbHBoYShvcGFjaXR5PTApOyI+IjthOjE6e2k6MDtzOjI3OiJpbmplY3Rpb24uaGlkZGVuX2EtaHJlZi4wMDYiO31zOjc1OiJzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7b3BhY2l0eTowLjAwMTt6LWluZGV4OjEwO2ZpbHRlcjphbHBoYShvcGFjaXR5PTApIj4iO2E6MTp7aTowO3M6Mjc6ImluamVjdGlvbi5oaWRkZW5fYS1ocmVmLjAwNyI7fXM6MjU6InN0eWxlPSJmb250LXNpemU6MDsiIGhyZWYiO2E6Mjp7aTowO3M6Mjc6ImluamVjdGlvbi5oaWRkZW5fYS1ocmVmLjAwOCI7aToxO3M6ODM6In48YVxzKnN0eWxlPVsnIl1mb250LXNpemVccyo6XHMqMFxzKjtccypbJyJdXHMqaHJlZj1bJyJdaHR0cFtePl0rPlxzKlx3K1tePF0rPFwvYT5+Ijt9czozMToic2hvcnRlLnN0L2xpbmstY29udmVydGVyLm1pbi5qcyI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuanNfdW53YW50ZWRfYWRzLjAwNCI7aToxO3M6MzE3OiJ+PHNjcmlwdFxzKnR5cGUuLnRleHQuamF2YXNjcmlwdC4+Li48XCFcW0NEQVRBXFtccypcKGZ1bmN0aW9uW146XSsidG9rZW4iOlxzKiJcdysiLFxzKiJbXlwpXStcKTtccypzY3JpcHQuYXN5bmNccyo9XHMqdHJ1ZTtccypzY3JpcHQuc3JjXHMqPVxzKi4uLmNkblwuc2hvcnRlXC5zdC5saW5rLWNvbnZlcnRlci5taW4uanMuO1tefV0rXH07XHMqdmFyXHMqZW50cnlccyo9XHMqZG9jdW1lbnRbXlxbXStcWzBcXTtccyplbnRyeS5wYXJlbnROb2RlLmluc2VydEJlZm9yZVwoc2NyaXB0LFxzKmVudHJ5XCk7XHMqfVwpXChcKTtccyouLlxdXF0+PC5zY3JpcHQ+fiI7fXM6MjE6Inh2aWQta2lja2Fzcy10b3JyZW50LyI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQuaGlkZGVuX2EtaHJlZi4wMDMiO2k6MTtzOjM2OiJ+aHR0cDouLlteeF0reHZpZC1raWNrYXNzLXRvcnJlbnRcL34iO31zOjIzOiJbdXJsPWh0dHA6Ly9jYXNpbm9nYW1lcyI7YToyOntpOjA7czoyODoiaW5qZWN0ZWQuc3BhbS1zZW8uY2FzaW5vLjAwNiI7aToxO3M6NjI6In5cW3VybD1odHRwOi4uY2FzaW5vZ2FtZXNbXlxdXStcXWNhc2lub1xzKmdhbWVzW15cW10rXFsudXJsXF1+Ijt9czo1OToiaHR0cDovL3d3dy5rbHVza2FwLmNvbS8/cT1jb250ZW50L2Nhc2gtcGF5ZGF5LWxvYW5zLWF0bGFudGEiO2E6Mjp7aTowO3M6MzQ6ImluamVjdGVkLnNwYW0tc2VvX3BheWRheS1sb2Fucy4wMjYiO2k6MTtpOjEyO31zOjE0OiI+b3JkZXIgYWRpcGV4PCI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjA4OSI7aToxO3M6NzQ6In48YVxzJipzdHlsZT0uZm9udC1zaXplOjBweDsuXHMqaHJlZj0uW2h0cHNdezQsfTpbXj5dKz5vcmRlclxzKmFkaXBleDwuYT5+Ijt9czoyMzoiPm9yZGVyIHpvbHBpZGVtIG9ubGluZTwiO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4wOTAiO2k6MTtzOjg1OiJ+PGFccyYqc3R5bGU9LmZvbnQtc2l6ZTowcHg7LlxzKmhyZWY9LltodHBzXXs0LH06W14+XSs+b3JkZXJccyp6b2xwaWRlbVxzKm9ubGluZTwuYT5+Ijt9czoxMjoiRXhhbSBQREY8L2E+IjthOjI6e2k6MDtzOjI2OiJpbmplY3RlZC5zcGFtLXNlb19leGFtLjAwMSI7aToxO2k6MTE7fXM6MTI6ImV4YW1kb3duLmNvbSI7YToyOntpOjA7czoyNjoiaW5qZWN0ZWQuc3BhbS1zZW9fZXhhbS4wMDIiO2k6MTtpOjExO31zOjExOiJKZXJzZXlzPC9hPiI7YToyOntpOjA7czoyOToiaW5qZWN0ZWQuc3BhbS1zZW9famVyc2V5cy4wMDEiO2k6MTtpOjExO31zOjEwOiJKZXJzZXk8L2E+IjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlb19qZXJzZXlzLjAwMS4wMiI7aToxO2k6MTE7fXM6MTA6Ij5qb3JkYW4gMTEiO2E6Mjp7aTowO3M6Mjg6ImluamVjdGVkLnNwYW0tc2VvX2pvcmRhbi4wMTgiO2k6MTtpOjExO31zOjE4OiI8ZGl2IHN0eWxlPSJsZWZ0Oi0iO2E6Mjp7aTowO3M6MjM6ImluamVjdGVkLmhpZGRlbi1kaXYuMDEwIjtpOjE7aToxMTt9czoxNzoiOiJJQ0FnSUNBZ0lDQWdJQ0EiO2E6Mjp7aTowO3M6MjM6ImluamVjdGVkLmhpZGRlbi1kaXYuMDMxIjtpOjE7aToxMTt9czoyMDoiR2VudWluZSBQcm9kdWN0IEtleXMiO2E6Mjp7aTowO3M6MjE6ImluamVjdGVkLnNwYW0tc2VvLjAwNiI7aToxO2k6MTE7fXM6MTY6IndyaXRlIGZvciBtZTwvYT4iO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLnNwYW0tc2VvX2Vzc2F5LjA0NSI7aToxO2k6MTE7fXM6MTY6IldhdGNoIEZ1bGwgTW92aWUiO2E6Mjp7aTowO3M6MjE6ImluamVjdGVkLnNwYW0tc2VvLjAwOSI7aToxO2k6MTE7fXM6MTY6IndhdGNoIGZ1bGwgbW92aWUiO2E6Mjp7aTowO3M6MjE6ImluamVjdGVkLnNwYW0tc2VvLjAxMCI7aToxO2k6MTE7fXM6MTY6IldhdGNoIGZ1bGwgTW92aWUiO2E6Mjp7aTowO3M6MjE6ImluamVjdGVkLnNwYW0tc2VvLjAxMSI7aToxO2k6MTE7fXM6MTk6IkZha2UgRGVzaWduZXIgQmFnczwiO2E6Mjp7aTowO3M6Mjk6ImluamVjdGVkLnNwYW0tc2VvX3JlcGxpY2EuMDAxIjtpOjE7aToxMTt9czoyNjoiUmVwbGljYSBEZXNpZ25lciBIYW5kYmFnczwiO2E6Mjp7aTowO3M6Mjk6ImluamVjdGVkLnNwYW0tc2VvX3JlcGxpY2EuMDAyIjtpOjE7aToxMTt9czoyMDoiPHA+Y2FuYWRhIGdvb3NlIHNhbGUiO2E6Mjp7aTowO3M6Mjk6ImluamVjdGVkLnNwYW0tc2VvX3JlcGxpY2EuMDAzIjtpOjE7aToxMTt9czoyMjoiPkNoZWFwIENlbGluZSBIYW5kYmFncyI7YToyOntpOjA7czoyOToiaW5qZWN0ZWQuc3BhbS1zZW9fcmVwbGljYS4wMDQiO2k6MTtpOjExO31zOjExOiJidXktcHJlY29zZSI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjAyMyI7aToxO2k6MTE7fXM6MTQ6ImJ1eWluZy1wcmVjb3NlIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDI0IjtpOjE7aToxMTt9czoxMjoiYnV5LWNlZml4aW1lIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDI1IjtpOjE7aToxMTt9czoxNDoiYnV5LW9ybmlkYXpvbGUiO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4wMjYiO2k6MTtpOjExO31zOjE0OiJidXktdGl6YW5pZGluZSI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjAyNyI7aToxO2k6MTE7fXM6MTU6ImJ1eWluZy10ZW5vcm1pbiI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjAyOCI7aToxO2k6MTE7fXM6ODoibGV2YXF1aW4iO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4wMjkiO2k6MTtpOjExO31zOjg6ImVyZWN0aWxlIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDMwIjtpOjE7aToxMTt9czoxNDoiZ2VuZXJpYyBjaWFsaXMiO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4wNzkiO2k6MTtpOjExO31zOjE0OiJjaGVhcCBPcmxpc3RhdCI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjA4MCI7aToxO2k6MTE7fXM6MTc6ImJ1eSBYZW5pY2FsIGNoZWFwIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDgxIjtpOjE7aToxMTt9czoxMDoiYnV5LWF0aXZhbiI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjA5MSI7aToxO2k6MTE7fXM6MTQ6ImJ1eSBjbG9uYXplcGFtIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDkyIjtpOjE7aToxMTt9czoxNToiYWNoZXRlcmR1ZnJhbmNlIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDkzIjtpOjE7aToxMTt9czoxNjoiY2lhbGlzIGdlbmVyaXF1ZSI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjA5NCI7aToxO2k6MTE7fXM6MTQ6ImNpYWxpc2ZyYW5jZTI0IjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDk1IjtpOjE7aToxMTt9czo3OiJhdm9kYXJ0IjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDMxIjtpOjE7aToxMTt9czo2OiJhZGFsYXQiO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4wODQiO2k6MTtpOjExO31zOjIwOiJwZXJzb25hbC1sb2FuLWNlbnRyZSI7YToyOntpOjA7czozNDoiaW5qZWN0ZWQuc3BhbS1zZW9fcGF5ZGF5LWxvYW5zLjAyNCI7aToxO2k6MTE7fXM6MjU6InF1aWNrLWxvYW4tbGVuZGVycy1vbmxpbmUiO2E6Mjp7aTowO3M6MzQ6ImluamVjdGVkLnNwYW0tc2VvX3BheWRheS1sb2Fucy4wMjUiO2k6MTtpOjExO31zOjE1OiJXcml0ZU15UGFwZXI0TWUiO2E6Mjp7aTowO3M6Mjc6ImluamVjdGVkLnNwYW0tc2VvX2Vzc2F5LjAzNSI7aToxO2k6MTE7fXM6MzA6ImRpc3NlcnRhdGlvbiBmcmVlbGFuY2Ugd3JpdGVycyI7YToyOntpOjA7czoyNzoiaW5qZWN0ZWQuc3BhbS1zZW9fZXNzYXkuMDQwIjtpOjE7aToxMTt9czo3OiJoYW5nYmFnIjthOjI6e2k6MDtzOjI5OiJpbmplY3RlZC5zcGFtLXNlb193YXRjaGVzLjAwMyI7aToxO2k6MTE7fXM6NToicm9sZXgiO2E6Mjp7aTowO3M6Mjk6ImluamVjdGVkLnNwYW0tc2VvX3dhdGNoZXMuMDA0IjtpOjE7aToxMTt9czoxMzoiPnByYWRhIG91dGxldCI7YToyOntpOjA7czoyOToiaW5qZWN0ZWQuc3BhbS1zZW9fd2F0Y2hlcy4wMDUiO2k6MTtpOjExO31zOjE2OiJydXFibnNtb2tlYmJxLmdhIjthOjI6e2k6MDtzOjIzOiJpbmplY3RlZC5zcGFtX2xpbmtzLjAwMSI7aToxO2k6MTE7fXM6MTQ6IiI+bGVzIHByb3N0aXR1IjthOjI6e2k6MDtzOjI0OiJpbmplY3Rpb24uc3BhbV9saW5rcy4wMDYiO2k6MTtpOjExO31zOjE3OiIiPnJlbmNvbnRyZSBmZW1tZSI7YToyOntpOjA7czoyNDoiaW5qZWN0aW9uLnNwYW1fbGlua3MuMDA3IjtpOjE7aToxMTt9czoxODoiPmZyZWUgZGF0aW5nIHNpdGVzIjthOjI6e2k6MDtzOjI0OiJpbmplY3Rpb24uc3BhbV9saW5rcy4wMDgiO2k6MTtpOjExO31zOjEzOiJjaGVhcCByYXkgYmFuIjthOjI6e2k6MDtzOjIzOiJpbmplY3RlZC5oaWRkZW4tZGl2LjAyOCI7aToxO2k6MTE7fXM6MTE6ImJ1eSBhY2lwaGV4IjthOjI6e2k6MDtzOjI0OiJpbmplY3Rpb24uc3BhbV9saW5rcy4wMDkiO2k6MTtpOjExO31zOjEyOiJidXkgdHJhbWFkb2wiO2E6Mjp7aTowO3M6MjQ6ImluamVjdGlvbi5zcGFtX2xpbmtzLjAxMCI7aToxO2k6MTE7fXM6MTE6ImJ1eSBsZXhhcHJvIjthOjI6e2k6MDtzOjI0OiJpbmplY3Rpb24uc3BhbV9saW5rcy4wMTEiO2k6MTtpOjExO31zOjg6InRvcnJlbnQ8IjthOjI6e2k6MDtzOjI0OiJpbmplY3Rpb24uc3BhbV9saW5rcy4wMTIiO2k6MTtpOjExO31zOjg6ImFjY3V0YW5lIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDk3IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjg6Im5vbHZhZGV4IjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMDk4IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjExOiJkb3h5Y3ljbGluZSI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjA5OSI7aToxO3M6OToic3BhbV9saW5rIjt9czo2OiJiZW50eWwiO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4xMDAiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6NToibGFzaXgiO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4xMDEiO2k6MTtzOjk6InNwYW1fbGluayI7fXM6MTE6Im1lYmVuZGF6b2xlIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMTAyIjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjk6InRyZXRpbm9pbiI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjEwMyI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNToib25saW5lLXBoYXJtYWN5IjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMTA0IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjE3OiJjYW5hZGlhbi1waGFybWFjeSI7YToyOntpOjA7czozNzoiaW5qZWN0ZWQuc3BhbS1zZW9fcGhhcm1hY3ktb25saW5lLjEwNSI7aToxO3M6OToic3BhbV9saW5rIjt9czo3OiJzdGVuZHJhIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMTA2IjtpOjE7czoxNDoic3BhbV9saW5rX3RleHQiO31zOjc6Im1hbGVncmEiO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4xMDciO2k6MTtzOjE0OiJzcGFtX2xpbmtfdGV4dCI7fXM6ODoibW90aWxpdW0iO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4xMDgiO2k6MTtzOjE0OiJzcGFtX2xpbmtfdGV4dCI7fXM6NToieGFuYXgiO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4xMDkiO2k6MTtzOjE0OiJzcGFtX2xpbmtfdGV4dCI7fXM6ODoidHJhbWFkb2wiO2E6Mjp7aTowO3M6Mzc6ImluamVjdGVkLnNwYW0tc2VvX3BoYXJtYWN5LW9ubGluZS4xMTEiO2k6MTtzOjE0OiJzcGFtX2xpbmtfdGV4dCI7fXM6OToibW9kYWZpbmlsIjthOjI6e2k6MDtzOjM3OiJpbmplY3RlZC5zcGFtLXNlb19waGFybWFjeS1vbmxpbmUuMTEyIjtpOjE7czoxNDoic3BhbV9saW5rX3RleHQiO31zOjE2OiJicmF6aWxpYW4gd2F4aW5nIjthOjI6e2k6MDtzOjMyOiJpbmplY3RlZC5zcGFtLXNlby5jaGVhcC1idXlzLjEyNyI7aToxO2k6MTE7fXM6MTY6ImJyYXppbGlhbi13YXhpbmciO2E6Mjp7aTowO3M6MzI6ImluamVjdGVkLnNwYW0tc2VvLmNoZWFwLWJ1eXMuMTI4IjtpOjE7aToxMTt9czoxNzoid3JpdGVwYXBlcjRtZS5jb20iO2E6Mjp7aTowO3M6MjE6ImluamVjdGVkLnNwYW0tc2VvLjAxNSI7aToxO3M6OToic3BhbV9saW5rIjt9czoyNToiY29sbGVnZS1ob21ld29yay1oZWxwLm9yZyI7YToyOntpOjA7czoyMToiaW5qZWN0ZWQuc3BhbS1zZW8uMDE2IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjEyOiJzcHlpbmcubmluamEiO2E6Mjp7aTowO3M6MjE6ImluamVjdGVkLnNwYW0tc2VvLjAxNyI7aToxO3M6OToic3BhbV9saW5rIjt9czoxNjoidHJ5bW9iaWxlc3B5LmNvbSI7YToyOntpOjA7czoyMToiaW5qZWN0ZWQuc3BhbS1zZW8uMDE4IjtpOjE7czo5OiJzcGFtX2xpbmsiO31zOjIwOiJTdHJpbmcuZnIwbUNoYXJDMGRlKCI7YToyOntpOjA7czoyNToiaW5qZWN0ZWQuZnJvbUNoYXJDb2RlLjAwMSI7aToxO2k6MTE7fX0=' ) );
$WHITELIST_STRINGS = unserialize( base64_decode( 'YToxNDp7czoyMzoiaW5qZWN0ZWQuaGlkZGVuLWRpdi4wMjAiO2E6MTp7aTowO3M6MjA6IjoicGF0dGVybnMiO2E6MTp7aTowIjt9czozMjoiaW5qZWN0ZWQuc3BhbS1zZW9famVyc2V5cy4wMDEuMDIiO2E6MTp7aTowO3M6MTE6Ik5ldyBKZXJzZXk8Ijt9czozMToiaW5qZWN0ZWQuanNfY3JlYXRlX2RvY3VtZW50LjAxMSI7YToyOntpOjA7czoxNDoiLmdldEZ1bGxZZWFyKCkiO2k6MTtzOjI0OiJjb250ZW50cy5kb2N1bWVudC53cml0ZSgiO31zOjI2OiJpbmplY3RlZC5zcGFtLXNlb19saW5rLjAwMSI7YToxOntpOjA7czo1MjoiPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL0F1dG9tYXR0aWMvamV0cGFjay9wdWxsLyI7fXM6MjM6ImluamVjdGVkLmhpZGRlbi1kaXYuMDMzIjthOjE6e2k6MDtzOjMyOiI8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfd3BjZiI7fXM6MTc6ImJhY2tkb29yLmV2YWwuMDAzIjthOjM6e2k6MDtzOjExOiJfaWNsX3N0cmluZyI7aToxO3M6NDY6ImZ1bmN0aW9uIGZmX0NzZWxSZWdpb25fYWN0aW9uKGVsZW1lbnQsIGFjdGlvbikiO2k6MjtzOjMwOiJmZl9wcm9jZXNzb3IuZm9ybV9pZCkucmVzZXQoKTsiO31zOjI3OiJpbmplY3RlZC5qc19hcHBlbmRDaGlsZC4wMDYiO2E6Mjp7aTowO3M6MTc6ImNkbi5tb3VzZWZsb3cuY29tIjtpOjE7czo0NDoid3d3LnNob3BwZXJhcHByb3ZlZC5jb20vc2VhbHMvY2VydGlmaWNhdGUuanMiO31zOjI3OiJpbmplY3RlZC5qc19hcHBlbmRDaGlsZC4wMDEiO2E6Mzp7aTowO3M6MTc6ImNkbi5tb3VzZWZsb3cuY29tIjtpOjE7czo0NDoid3d3LnNob3BwZXJhcHByb3ZlZC5jb20vc2VhbHMvY2VydGlmaWNhdGUuanMiO2k6MjtzOjMyOiJhY3NiYXBwLmNvbS9hcHBzL2FwcC9kaXN0L2pzL2FwcCI7fXM6MjQ6ImluamVjdGVkLmpzX3JlZGlyZWN0LjA0MSI7YToxOntpOjA7czoxNToibHVja3lvcmFuZ2UuY29tIjt9czoyMjoiaW5qZWN0ZWQuanNfYmFzZTY0LjAwNCI7YToyOntpOjA7czozNToiJnNob3dfZGFzaF93aWRnZXQ9MSZpbnZpdGFpb25fY29kZT0iO2k6MTtzOjQ4OiJQSE5qY21sd2RENWhiR1Z5ZENnblZuVnNibVZ5WVdKc1pTY3BQQzl6WTNKcGNIUSsiO31zOjIxOiJpbmplY3RlZC5zcGFtLXNlby4wMjMiO2E6MTp7aTowO3M6Mzg6IkpUTkRKVEl4TFMwbE1qQkNaV2RwYmlVeU1FMWhhV3hqYUdsdGNDIjt9czoyNDoiaW5qZWN0ZWQuaGlkZGVuLXNwYW4uMDAxIjthOjE6e2k6MDtzOjM3OiI8IS0tIHJlYWwgcGVvcGxlIHNob3VsZCBub3QgZmlsbCB0aGlzIjt9czoyMzoiaW5qZWN0ZWQuaGlkZGVuLWRpdi4wMjYiO2E6MTp7aTowO3M6Mjk6InVnZ2M6Ly9qamoucWpwdmFhYmluZ3ZiYWYucGJ6Ijt9czoyNToiYmFja2Rvb3IucHJlZ19yZXBsYWNlLjAwMSI7YToxOntpOjA7czoyMDoiZ2xvYmFsICRmZl9wcm9jZXNzb3IiO319' ) );
$WHITELIST_TABS = unserialize( base64_decode( 'YTo2OntzOjE0OiI8UFJFRklYPndmSGl0cyI7YToxOntpOjA7czo1OiJ0YWJsZSI7fXM6Mjg6IjxQUkVGSVg+c3BiY19zY2FuX3NpZ25hdHVyZXMiO2E6MTp7aTowO3M6NToidGFibGUiO31zOjMzOiI8UFJFRklYPm9wdGlvbnMucXV0dGVyYV93cF9yZXBvcnQiO2E6MTp7aTowO3M6NToidGFibGUiO31zOjM5OiI8UFJFRklYPm9wdGlvbnMuR09UTUxTX2RlZmluaXRpb25zX2Jsb2IiO2E6MTp7aTowO3M6NToidGFibGUiO31zOjIwOiI8UFJFRklYPm9wdGlvbnMuV1BNUiI7YToxOntpOjA7czo1OiJ0YWJsZSI7fXM6MTY6IndmSXNzdWVzLmxvbmdNc2ciO2E6MTp7aTowO3M6NToidGFibGUiO319' ) );
$SIGS_MASSDOMAINS = unserialize( base64_decode( 'YToxOntzOjY6IjxzY3JpcCI7YToyOntpOjA7aToxMDtzOjM6InNyYyI7YToyMzp7aTowO2k6MTA7czoyMzoiZGVjbGFyZWJ1c2luZXNzZ3JvdXAuZ2EiO2E6Mjp7aTowO3M6MjQ6ImluamVjdGVkLm1hc3NfZG9tYWluLjAwMSI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjIxOiJsb3dlcnRoZW5za3lhY3RpdmUuZ2EiO2E6Mjp7aTowO3M6MjQ6ImluamVjdGVkLm1hc3NfZG9tYWluLjAwMiI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjE5OiJzdHJvbmdjYXBpdGFsYWRzLmdhIjthOjI6e2k6MDtzOjI0OiJpbmplY3RlZC5tYXNzX2RvbWFpbi4wMDMiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoxMToib2NsYXNydi5jb20iO2E6Mjp7aTowO3M6MjQ6ImluamVjdGVkLm1hc3NfZG9tYWluLjAwNCI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjE0OiJvbmVtYm9hcmFuLmNvbSI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQubWFzc19kb21haW4uMDA1IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6OToiZ25vZ2xlLnJ1IjthOjI6e2k6MDtzOjI0OiJpbmplY3RlZC5tYXNzX2RvbWFpbi4wMDYiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoyNDoic2Vjb25kYXJ5aW5mb3JtdHJhbmQuY29tIjthOjI6e2k6MDtzOjI0OiJpbmplY3RlZC5tYXNzX2RvbWFpbi4wMDciO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoxOToibG92ZWdyZWVucGVuY2lscy5nYSI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQubWFzc19kb21haW4uMDA4IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTk6ImxpbmV0b2Fkc2FjdGl2ZS5jb20iO2E6Mjp7aTowO3M6MjQ6ImluamVjdGVkLm1hc3NfZG9tYWluLjAwOSI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjE4OiJ0cmFuc2FuZGZpZXN0YXMuZ2EiO2E6Mjp7aTowO3M6MjQ6ImluamVjdGVkLm1hc3NfZG9tYWluLjAxMCI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjIzOiJ0cmF2ZWxmb3JuYW1ld2Fsa2luZy5nYSI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQubWFzc19kb21haW4uMDExIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MTM6InVwdG9kYXRlci5uZXQiO2E6Mjp7aTowO3M6MjQ6ImluamVjdGVkLm1hc3NfZG9tYWluLjAxMiI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjEzOiJpdG91cmxpZmUudG9wIjthOjI6e2k6MDtzOjI0OiJpbmplY3RlZC5tYXNzX2RvbWFpbi4wMTMiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoxNToiZG9udGtpbmhvb290LnR3IjthOjI6e2k6MDtzOjI0OiJpbmplY3RlZC5tYXNzX2RvbWFpbi4wMTQiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoyMDoidGFsa2luZ2Fib3V0ZmlybXMuZ2EiO2E6Mjp7aTowO3M6MjQ6ImluamVjdGVkLm1hc3NfZG9tYWluLjAxNSI7aToxO3M6MTA6InNjcmlwdF9zcmMiO31zOjE5OiJ0cmF2ZWxpbnNreWRyZWFtLmdhIjthOjI6e2k6MDtzOjI0OiJpbmplY3RlZC5tYXNzX2RvbWFpbi4wMTYiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czozMzoiUkVNT1ZFRF93cC11cGRhdGUtY2RuLmNvbV9SRU1PVkVEIjthOjI6e2k6MDtzOjI0OiJpbmplY3RlZC5tYXNzX2RvbWFpbi4wMTciO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoxOToiZHJpdmVyZm9ydG5pZ3RseS5nYSI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQubWFzc19kb21haW4uMDE4IjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MjA6ImJlbG9ubmFub3RzZXJ2aWNlLmdhIjthOjI6e2k6MDtzOjI0OiJpbmplY3RlZC5tYXNzX2RvbWFpbi4wMTkiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9czoxNjoic3BlY2lhbGFkdmVzLmNvbSI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQubWFzc19kb21haW4uMDIwIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MjE6InRydXN0ZWRjcG1yZXZlbnVlLmNvbSI7YToyOntpOjA7czoyNDoiaW5qZWN0ZWQubWFzc19kb21haW4uMDIxIjtpOjE7czoxMDoic2NyaXB0X3NyYyI7fXM6MjM6ImNsYXNzaWNwYXJ0bmVyc2hpcHMuY29tIjthOjI6e2k6MDtzOjI0OiJpbmplY3RlZC5tYXNzX2RvbWFpbi4wMjIiO2k6MTtzOjEwOiJzY3JpcHRfc3JjIjt9fX19' ) );
//KEEP EMPTY
//KEEP EMPTY
//KEEP EMPTY
//KEEP EMPTY



/**
 * Returns a 200 HTTP status code.
 *
 * One of the security analysts requested this option.
 *
 * @option test Returns a 200 HTTP status code and custom header.
 *
 * @author Unknown <noreply@sucuri.net>
 * @author Yorman <yorman@sucuri.net>
 * @date   Nov 23, 2017
 */
if (isset($_GET['test'])) {
    header('HTTP/1.1 200 OK');
    header('X-SUCURIDB-RAND: ' . rand(100, 999));
    exit;
}

define('CI_NAME', 0);
define('CI_ACTION', 1);
define('CI_WHITELIST', 2);

define('PCRE_DELIM', '~'); // Delimiter for PCRE regular expressions
define('POSIX_DELIM', '/'); // Delimiter for POSIX regular expressions

if (isset($_GET['dir'])) {
    $scan_dir = $_GET['dir'];
    define('QUARANTINE_FOLDER', '.' . DIRECTORY_SEPARATOR . $scan_dir . DIRECTORY_SEPARATOR . '.sucuriquarantine');
}
else{
    define('QUARANTINE_FOLDER', '.' . DIRECTORY_SEPARATOR . '.sucuriquarantine');
}

define('BACKUP_APPENDIX', '_sucuridbbackup.');
define('SUCURI_KEY', 'kduhgop32lkj');
define('BACKUP_COMMENT', "-- sucuri_backup");
define('RESUME_FILE_NAME', '.sucuridbresume.txt');
define('RESUME_RESULTS', '.sucuridbresumeresults.txt');

define('UPDATE_ERR_BACKUP_DIR', 1);
define('UPDATE_ERR_BACKUP_FILE', 2);
define('UPDATE_ERR_CHANGED', 3);
define('UPDATE_ERR_NO_PRI', 4);

if (!function_exists('get_magic_quotes_gpc')) {
    function get_magic_quotes_gpc() {
        return false;
    }
}

/**
 * Support composite primary keys.
 *
 * A column can have multiple primary keys also knows as composite keys. In
 * this case, instead of identifying an unique row through the entire table
 * using one single values, we will use a merge of all the values for all the
 * columns marked as primary keys.
 *
 * For backward compatibility reasons, we will transform any non-list of data
 * identifiers into a single-value list. This is, if ths security analyst uses
 * the old URL format to show the content of an infected table row, the data
 * coming from the URL (assuming its a single-value) will be transformed into
 * an array.
 */
define('SUPPORT_COMPOSITE_KEYS', true);

$updateErrMessages = array(
    UPDATE_ERR_BACKUP_DIR => 'Create backup dir failed',
    UPDATE_ERR_BACKUP_FILE => 'Create backup file failed',
    UPDATE_ERR_CHANGED => 'The database column was simultaneously changed by another program. Please try again',
    UPDATE_ERR_NO_PRI => 'No primary key found',
);

// If running via terminal
if (isTerminal()) {
    parse_str(implode('&', array_slice($argv, 1)), $_GET);
}

/**
 * Prevents the non-supervised execution of the cleanup script.
 *
 * The main idea of this condition is to automatically delete this and other
 * scripts that were uploaded by one of our security analysts to a customer's
 * website during a regular malware cleanup.
 *
 * If the analyst forgets to delete these files and a web crawler finds them,
 * the direct execution of the script without the required parameters will
 * trigger the deletion of the cleanup suite.
 *
 * @option srun Stop the automatic deletion of the unsupervised scripts.
 */

if (!isset($_GET['srun'])) {
    @unlink('sucuri-cleanup.php');
    @unlink('sucuri-version-check.php');
    @unlink('sucuri-wpdb-clean.php');
    @unlink('sucuri-db-cleanup.php');
    @unlink('sucuri-db-clean.php');
    @unlink('sucuri_listcleaned.php');
    @unlink('sucuri-filemanager.php');
    @unlink('sucuri-toolbox.php');
    @unlink('sucuri-toolbox-client.php');
    @unlink('sucuri-adminer.php');
    @unlink('sucuri-magento2.php');
    @unlink('sucuri_db_clean.php');
    @unlink('google936278b9bb435851.html');
    @unlink('google79c13c5605e6f406.html');
    @unlink('googlee6cb14d10ed8d0d2.html');
    @unlink('googlec55310faa35e04c1.html');
    @unlink(__FILE__);
    exit(0);
}


// Get file content and find the line with content
function findLineInFile($file, $content)
{
    $fh = @fopen($file, "r");
    if (!$fh) {
        echo "DEBUG: UNABLE TO CHECK " . escapeHtml($file) . "\n";
        return null;
    }
    while (($buffer = fgets($fh, 4096)) !== false) {
        if (strpos($buffer, $content) !== false) {
            fclose($fh);
            return $buffer;
        }
    }
    fclose($fh);
    return null;
}

if (!function_exists('file_get_contents')) { // below PHP 4.3
    function file_get_contents($fileName) {
        $fh = @fopen($fileName);
        if ($fh === false) {
            return false;
        }
        $res = fread($fh, 1048576);
        fclose($fh);
        return $res;
    }
}

define('OPT_TYPE_CONST',      1);
define('OPT_TYPE_VAR',        2);
define('OPT_TYPE_ASSOC',      4);
define('OPT_TYPE_ENV',        8);
define('OPT_TYPE_XML',       16);
define('OPT_TYPE_FIRST',     32);
define('OPT_TYPE_CONST_NUM', 64);
define('OPT_TYPE_PHPDOTENV', 128);

function getOptMatch($m, $type)
{
    return ($type & OPT_TYPE_FIRST) ? $m[0] : $m[count($m) - 1];
}

function getOption($option, $config, $type)
{
    $option = preg_quote($option);

    // String constants (WordPress)
    if (($type & OPT_TYPE_CONST) &&
        preg_match_all('@^\s*define\(\s*([\'"])' . $option . '\1\s*,\s*([\'"])(.*)\2\s*\)\s*;@m', $config, $m)) {
            return stripslashes(getOptMatch($m[3], $type));
    }

    // Numeric constants
    if (($type & OPT_TYPE_CONST_NUM) &&
        preg_match_all('@^\s*define\(\s*([\'"])' . $option . '\1\s*,\s*(\d*)\s*\)\s*;@m', $config, $m)) {
            return stripslashes(getOptMatch($m[2], $type));
    }

    // wp-config.php trick, see
    // http://www.wpbeginner.com/wp-tutorials/useful-wordpress-configuration-tricks-that-you-may-not-know/
    if (($type & OPT_TYPE_ENV) && preg_match('@^\s*define\(\s*([\'"])' . $option . '\1\s*,\s*\$_ENV\s*[[{]\s*' .
        '([\'"]?)DATABASE_SERVER\2\s*[}\]]\s*\)\s*;@m', $config, $m)) {
            return $_ENV['DATABASE_SERVER'];
    }

    // Variables (Joomla, WordPress prefix)
    if (($type & OPT_TYPE_VAR) &&
        preg_match_all('@^\s*(?:public|var)?\s*' . $option . '\s*=\s*(?:([\'"])(.*)\1|([0-9]+))\s*;@m', $config, $m)) {
            $str = getOptMatch($m[2], $type); // Return the string m[2] or the number m[3] if the string was not found
            return $str ? stripslashes($str) : getOptMatch($m[3], $type);
    }

    // Associative arrays (Drupal)
    if (($type & OPT_TYPE_ASSOC) &&
        preg_match_all('@(?:^|,|\()\s*([\'"])' . $option . '\1\s*=>\s*([\'"])(.*?)\2\s*[,)]@m', $config, $m)) {
            return stripslashes(getOptMatch($m[3], $type));
    }

    // Magento XML config
    if (($type & OPT_TYPE_XML) && preg_match_all('@^\s*<' . $option . '>(?:<!\[CDATA\[|\{\{)(.*)(?:}}|\]\]>)</' .
        $option . '>\s*$@m', $config, $m)) {
            return getOptMatch($m[1], $type);
    }
    
    // PHPDotEnv .env config files
    if (($type == OPT_TYPE_PHPDOTENV) && preg_match_all('@^' . $option . '[^\=]*[^\w+]*[^\s*]*@m', $config, $m)) {
            return preg_replace('@^' . $option . '[^\=]*[^\w+]*@m', "",$m[0][0]);
    }

    return '';
}


// Properly escape HTML content
function escapeHTML($string)
{
    global $isPlainText;

    if ($isPlainText) {
        return $string;
    }

    if (!defined('ENT_SUBSTITUTE')) {
        define('ENT_SUBSTITUTE', 0);
    }

    return htmlspecialchars($string, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
}


/**
 * The nature of the code forces us to disregard the addition of unit-tests for
 * most of the implemented features. This option allows the execution of a small
 * set of tests that guarantee the functionality of some of the main actions of
 * the database cleanup script.
 *
 * @option tests Includes and executes the script test suite.
 */
if (isset($_GET['tests'])) {
    include 'sucuri-db-tests.php';
    runTests();
    exit;
}

// Find the output format
$isPlainText = false;
if (isset($_GET['robot'])) {
    $isPlainText = true;
    if (!isset($_GET['dump'])) {
        header('Content-Type: text/plain');
    }
} elseif (isTerminal()) {
    $isPlainText = true;
}

if (!isset($_GET['dump'])) {
    if (!$isPlainText) {
        echo '<style><!--
.cleared {color: green}
.warn {color: red; font-weight: bold}
.hidden-copied {position: absolute; opacity: 0; z-index: -999}
.inserted::before {content: attr(data-content)}
textarea {font-family: monospace; font-size: 100%; overflow: auto}
--></style><pre style="white-space:pre-wrap">';
    }

    printMsg("Sucuri Database Cleanup");
    $version = ' v1.3.3 - build ' . $myversion;
    if ($isPlainText) {
        echo $version;
    } else {
        // Make the version selectable to allow easy copying to Jira
        echo '<input type="text" readonly name="version" style="border:none;font-family:monospace;font-size: 100%" '.
             'size="' . (strlen($version) + 10) . '" value="' . $version . '" onclick="this.setSelectionRange(1, ' .
             strlen($version) . ')">';
    }
    printMsg("\n\n");
}

// Create sucuri_db_clean.php
if (isset($_GET['dbconfig'])) {
    doDbConfig();
}

$config = getCMSConfig();

if (null === $config) {
    doDbConfig();
}

/**
 * The mysqli extension, or as it is sometimes known, the MySQL improved
 * extension, was developed to take advantage of new features found in MySQL
 * systems versions 4.1.3 and newer. The mysqli extension is included with PHP
 * versions 5 and later. The mysqli extension has a number of benefits, the key
 * enhancements over the mysql extension being:
 *
 * Object-oriented interface
 * Support for Prepared Statements
 * Support for Multiple Statements
 * Support for Transactions
 * Enhanced debugging capabilities
 * Embedded server support
 */
if (function_exists('mysqli_connect')) {
    if (function_exists('mysqli_real_query')
        && function_exists('mysqli_use_result')
    ) {
        /*
         * If we detect the possibility, we are going to use some methods
         * that consume less memory, to avoid getting out-of-memory errors
         */
        $driver = new MySQLIDriverLowMemory();
    } else {
        $driver = new MySQLIDriver();
    }
} else {
    $driver = new MySQLDriver();
}

$errMsg = $driver->connect($config);

if ($errMsg !== true) {
    reportFatalError($errMsg);
}

if (!isset($_GET['dump'])) {
    printMsg("\nINFO: Connected to " . $driver->getName() . "\n");
}

maybePrintUserList();

// Show field/row content
if (isset($_GET['showcontent'])
    && isset($_GET['t'])
    && isset($_GET['c'])
    && isset($_GET['id_name'])
    && isset($_GET['id'])
) {
    showContent($driver, $_GET['t'], $_GET['c'], $_GET['id_name'], $_GET['id']);
}

if (isset($_GET['showcontent'])
    && isset($_GET['t'])
    && isset($_GET['id_name'])
    && isset($_GET['id'])
) {
    showRow($driver, $_GET['t'], $_GET['id_name'], $_GET['id']);
}

// Restore database
if (isset($_GET['restore'])) {
    restore($driver, $_GET['restore']);
}

// Turning off whitelists when requested
if (isset($_GET['nowhitelist'])) {
    $WHITELIST_STRINGS = array();
    $WHITELIST_TABS = array();
}


// Search all tables
$tablesColumns = $driver->getTablesColumns($config, SUPPORT_COMPOSITE_KEYS);

if (isset($_GET['dump'])) {
    $tmp_file_name = getBackupFilename('dump-tables', uniqid('dump-'));
    if ($tmp_file_name === false) {
        showUpdateDbError(UPDATE_ERR_BACKUP_FILE);
        exit;
    }
    $tmp_file = fopen($tmp_file_name, 'w+');
    dumpTables($driver, $_GET['dump'], $tablesColumns, $config['db']);
}

if (isset($_GET['resumeresults'])) {
    resumeResults();
}

readSkipTable($tablesColumns);

$foundMalware = false;

startResume();

$displayScanningComplete = false;

if (isset($_GET['s'])) {
    $displayScanningComplete = true;
    $searchSignature = getSearchSignature();
    searchAndClear($driver, $tablesColumns, $searchSignature);
    replaceInTerminal($driver, $tablesColumns, $searchSignature);
} elseif (isset($_GET['help'])) {
    printScriptUsage();
} elseif (isset($_GET['list'])) {
    listTables($driver, $tablesColumns, $config);
} elseif (isset($_GET['listTriggers'])) {
    listTriggers($driver);
} elseif (isset($_GET['procedures'])
    || isset($_GET['procedures_name'])
    || isset($_GET['procedures_delete'])
) {
    printStoredProcedures($driver);
} else {
    $displayScanningComplete = true;
    searchAndClear($driver, $tablesColumns, $DB_SIGS);
    searchAndClear($driver, $tablesColumns, $SIGS_MASSDOMAINS);
    deleteRows($driver, $tablesColumns, $config);
    checkDBUsers($driver, $tablesColumns, $config);
    checkWPDefaultUserRole($driver, $tablesColumns, $config);
    checkWPSiteURL($driver, $tablesColumns, $config);
    checkTriggers($driver);
}

checkSkippedTables();

$verdict = '';

if (!$foundMalware) {
    $verdict = '. No malware found';
} elseif (!skipCleanup()) {
    // When using noclean, it reports "Found malware to clean", so we don't suggest to copy these lines
    $verdict = '. Press Ctrl+A, then Ctrl+C to copy the report';
}

if ($displayScanningComplete) {
    printMsg("\n\nINFO: Scanning complete" . $verdict);
}

printMsg("\nTools: ");

$tools = array(
    'dbconfig',
    'list',
    's',
    'restore',
    'dump',
    '',
    'noclean',
    'noise',
    'skiptable=wp_comments,wp_commentmeta',
    'scantable=wp_posts,wp_options',
    'resume',
    'procedures',
);

foreach ($tools as $tool) {
    if ($tool === '') {
        printMsg("\n");
        continue;
    }
    printInsertedLink($tool);
    printMsg("\x20\x20");
}

prush($isPlainText ? "\n" : '</pre>');

finishResume(); // delete the resume file after all operations to ensure that we run to the end

$driver->disconnect();
exit;

// ======================================================
// DB abstraction layer

class MySQLCommon
{
    function escapeName($name)
    {
        // See https://dev.mysql.com/doc/refman/5.7/en/identifiers.html
        return '"' . str_replace('"', '""', $name) . '"';
    }

    function begin()
    {
        $this->query('SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;');
        $this->query('BEGIN;');
    }

    function commit()
    {
        $this->query('COMMIT;');
    }

    function rollback()
    {
        $this->query('ROLLBACK;');
    }

    function getTablesColumns($config, $withCompositeKeys = false)
    {
        $scannedTypes = array(
            'varchar' => 1, 'char' => 1,
            'tinytext' => 1, 'mediumtext' => 1, 'text' => 1, 'longtext' => 1,
            'binary' => 1, 'varbinary' => 1,
            'tinyblob' => 1, 'blob' => 1, 'mediumblob' => 1, 'longblob' => 1);

        // Get all tables
        $tablesResult = $this->query('SHOW FULL TABLES;');

        $allTables = array();
        while ($tablesRow = $this->fetchRow($tablesResult)) {
            $tablesRows[] = $tablesRow;
        }
        foreach ($tablesRows as $tablesRow) {
            // Report tables that does not begin with the Wordpress prefix
            $table = $tablesRow[0];
            if ($tablesRow[1] === 'SEQUENCE') { // MariaDB sequence
                continue;
            }
            if (!empty($config['prefix']) && 0 !== strncmp($table, $config['prefix'], strlen($config['prefix'])) &&
                !isset($_GET['dump'])) {
                printMsg("\nWARN: Table " . $table . ' does not start with prefix ' .
                    $config['prefix'] . ';', ' whitelists and CMS-specific rules will not work for this table');
            }

            $allTables[$table] = array();

            // Get all columns
            $columnsResult = $this->query('SHOW COLUMNS FROM ' . $this->escapeName($table) . ';', true);
            if ($columnsResult === false) {
                printMsg("\nWARN: Failed to list columns for " . $table);
                continue;
            }
            $uniqueString = null;
            $compositePrimary = false;
            $compositeKeys = array();
            while ($columnsRow = $this->fetchAssoc($columnsResult)) {
                $type = $columnsRow['Type'];
                $pos = strpos($type, "(");
                if ($pos !== false) {
                    $type = substr($type, 0, $pos);
                }

                if (strtoupper($columnsRow['Key']) === 'PRI') {
                    if (isset($allTables[$table]['idname'])) {
                        $compositePrimary = true;
                    }

                    if ($withCompositeKeys) {
                        $compositeKeys[] = $columnsRow['Field'];
                    }

                    $allTables[$table]['idname'] = $columnsRow['Field'];
                }

                $type = strtolower(trim($type));
                if (!isset($scannedTypes[$type])) {
                    continue;
                }

                // Prefer unique string keys to display wp_options.option_name instead of the numeric ID
                if (strtoupper($columnsRow['Key']) === 'UNI') {
                    $uniqueString = $columnsRow['Field'];
                }

                $allTables[$table][] = $columnsRow['Field'];
            }

            if ($uniqueString !== null) {
                $allTables[$table]['idname'] = $uniqueString;
            } elseif ($withCompositeKeys && count($compositeKeys) > 1) {
                /* return idname as an array of primary keys */
                $allTables[$table]['idname'] = $compositeKeys[0];

                //patch to attempt to fix composite keys index in drupal table field_data_body and others
                if($allTables[$table]['idname'] == 'entity_type'){
                    $allTables[$table]['idname'] = 'entity_id';
                }
            } elseif ($compositePrimary) { // Disable the cleanup for composite primary keys and no primary key
                unset($allTables[$table]['idname']);
            }
        }
        return $allTables;
    }

    function getColumnNamesTypes($table)
    {
        $columnsResult = $this->query('SHOW COLUMNS FROM ' . $this->escapeName($table) . ';');

        $binaryTypes = array('binary' => 1, 'varbinary' => 1,
            'tinyblob' => 1, 'blob' => 1, 'mediumblob' => 1, 'longblob' => 1);

        $numericTypes = array('tinyint' => 1, 'smallint' => 1, 'mediumint' => 1,
            'int' => 1, 'integer' => 1, 'bigint' => 1,
            'decimal' => 1, 'dec' => 1, 'numeric' => 1, 'fixed' => 1,
            'float' => 1, 'real' => 1, 'double' => 1, 'double precision' => 1);

        $names = array();
        $types = array();

        while ($columnsRow = $this->fetchAssoc($columnsResult)) {
            $names[] = $columnsRow['Field'];

            $type = $columnsRow['Type'];
            $pos = strpos($type, "(");
            if ($pos !== false) {
                $type = substr($type, 0, $pos);
            }
            $type = strtolower(trim($type));

            if (isset($numericTypes[$type])) {
                $types[] = 'num';
            } elseif (isset($binaryTypes[$type])) {
                $types[] = 'bin';
            } elseif ($type === 'bit') {
                $types[] = 'bit';
            } else {
                $types[] = 'other';
            }
        }

        return array($names, $types);
    }

    function exportRow($row, $types)
    {
        for ($i = 0; $i < count($row); $i++) {
            if ($row[$i] === null) {
                $row[$i] = 'NULL';
            } elseif ($types[$i] === 'bin') {
                // Story binary data as hex to avoid encoding problems
                $row[$i] = 'UNHEX(' . $this->escapeStr(bin2hex($row[$i])) . ')';
            } elseif ($types[$i] === 'bit') {
                // TODO: tests under PHP 4
                // See https://stackoverflow.com/questions/15106985/
                $row[$i] = "b'" . decbin($row[$i]) . "'";
            } elseif ($types[$i] === 'num') {
                $row[$i] = (string)$row[$i];
            } else {
                $row[$i] = $this->escapeStr($row[$i]);
            }
        }
        return implode(', ', $row);
    }

    function getCreateTableSql($table)
    {
        $res = $this->query('SHOW CREATE TABLE ' . $this->escapeName($table) . ';');
        $row = $this->fetchRow($res);

        if (!$row) {
            exit('Unexpected empty result from SHOW CREATE TABLE');
        }

        return $row[1] . ";\n\n";
    }

    function getCreateDBSql($db)
    {
        $res = $this->query('SHOW CREATE DATABASE ' . $this->escapeName($db) . ';');
        $row = $this->fetchRow($res);

        if (!$row) {
            exit('Unexpected empty result from SHOW CREATE DATABASE');
        }

        return $row[1] . ";\nUSE " . $this->escapeName($db) . ";\n\n";
    }

    function getDumpHeader()
    {
        return
            "SET NAMES 'utf8';\n" .
            "SET sql_mode='NO_AUTO_VALUE_ON_ZERO,ANSI_QUOTES,STRICT_TRANS_TABLES';\n" .
            "SET foreign_key_checks=0;\n";
    }

    function setModes()
    {
        $this->query("SET NAMES 'utf8';");
        $this->query("SET sql_mode='PIPES_AS_CONCAT,IGNORE_SPACE," .
            "NO_AUTO_VALUE_ON_ZERO,ANSI_QUOTES,STRICT_TRANS_TABLES';");
    }

    function queryLowMemory($sql, $forceResReturn = false)
    {
        return $this->query($sql, $forceResReturn);
    }
}

class MySQLDriver extends MySQLCommon
{
    var $link;

    function connect($config)
    {
        // Connect to DB
        $host = $config['host'];
        if (isset($config['port'])) {
            $host .= ':' . $config['port'];
        }
        $this->link = @mysql_connect($host, $config['user'], $config['pass']);
        if ($this->link === false) {
            return 'Could not connect to MySQL database: ' . mysql_error();
        }

        mysql_select_db($config['db'], $this->link);

        $this->setModes();
        return true;
    }

    function disconnect()
    {
        mysql_close($this->link);
    }

    function escapeStr($str)
    {
        return "'" . mysql_real_escape_string($str, $this->link) . "'";
    }

    function query($sql, $forceResReturn = false)
    {
        global $isPlainText;
        $res = mysql_query($sql, $this->link);
        if (!$res) {
            if ($forceResReturn === true) {
                return $res;
            }

            $error = mysql_error($this->link);
            if (!$isPlainText) {
                $error = '<b>' . escapeHtml($error) . '</b>';
            }
            echo "\n" . escapeHtml(substr($sql, 0, 100)) . ' -- ' . $error . "\n";
            exit(1);
        }
        return $res;
    }

    function fetchAssoc($res)
    {
        $row = mysql_fetch_assoc($res);
        if (false === $row) {
            mysql_free_result($res);
        }
        return $row;
    }

    function fetchRow($res)
    {
        $row = mysql_fetch_row($res);
        if (false === $row) {
            mysql_free_result($res);
        }
        return $row;
    }

    function getAffectedRows()
    {
        return mysql_affected_rows($this->link);
    }

    function getName()
    {
        return 'MySQL database';
    }
}

class MySQLIDriver extends MySQLCommon
{
    var $link;

    function connect($config)
    {
        // Connect to DB
        $port = isset($config['port']) ? $config['port'] : null;
        $this->link = @mysqli_connect($config['host'], $config['user'], $config['pass'], $config['db'], $port);
        if ($this->link === false) {
            return 'Could not connect to MySQLi database: ' . mysqli_connect_error();
        }

        $this->setModes();
        return true;
    }

    function disconnect()
    {
        mysqli_close($this->link);
    }

    function escapeStr($str)
    {
        return "'" . mysqli_real_escape_string($this->link, $str) . "'";
    }

    function query($sql, $forceResReturn = false)
    {
        global $isPlainText;
        $res = mysqli_query($this->link, $sql);
        if (!$res) {
            if ($forceResReturn === true) {
                return $res;
            }

            $error = mysqli_error($this->link);
            if (!$isPlainText) {
                $error = '<b>' . escapeHtml($error) . '</b>';
            }

            echo "\n" . escapeHtml(substr($sql, 0, 100)) . ' -- ' . $error . "\n";
            exit(1);
        }
        return $res;
    }

    function fetchAssoc($res)
    {
        $row = mysqli_fetch_assoc($res);
        if (false === $row) {
            mysqli_free_result($res);
        }
        return $row;
    }

    function fetchRow($res)
    {
        $row = mysqli_fetch_row($res);
        if (false === $row) {
            mysqli_free_result($res);
        }
        return $row;
    }

    function getAffectedRows()
    {
        return mysqli_affected_rows($this->link);
    }

    function getName()
    {
        return 'MySQLi database';
    }
}

/**
 * Class MySQLIDriverLowMemory
 *
 * This object consumes less memory when querying the database, but
 * be aware that you cannot keep results in memory without using
 * them first in a loop or cleaning them with mysqli_free_result
 *
 */
class MySQLIDriverLowMemory extends MySQLIDriver
{

    function queryLowMemory($sql, $forceResReturn = false)
    {
        global $isPlainText;
        mysqli_store_result($this->link);
        if ($forceResReturn) {
            $res = mysqli_query($this->link, $sql);
        } else {
            mysqli_real_query($this->link, $sql);
            $res = mysqli_use_result($this->link);
        }

        if (!$res) {
            if ($forceResReturn === true) {
                return $res;
            }

            $error = mysqli_error($this->link);
            if ($error !== '') {
                if (!$isPlainText) {
                    $error = '<b>' . escapeHtml($error) . '</b>';
                }

                echo "\n" . escapeHtml(substr($sql, 0, 100)) . ' -- ' . $error . "\n";
                exit(1);
            }
        }
        return $res;
    }
}

// ======================================================
// Read CMS configuration

/**
 * Returns the credentials to connect to a WordPress database.
 *
 * @param  string $lines Content of the configuration file.
 * @return array         Credentials to connect to the database.
 */
function readWordPressConfig($lines)
{
    return array(
        'host' => getOption('DB_HOST', $lines, OPT_TYPE_CONST | OPT_TYPE_ENV),
        'user' => getOption('DB_USER', $lines, OPT_TYPE_CONST),
        'pass' => getOption('DB_PASSWORD', $lines, OPT_TYPE_CONST),
        'db' => getOption('DB_NAME', $lines, OPT_TYPE_CONST),
        'prefix' => getOption('$table_prefix', $lines, OPT_TYPE_VAR),
    );
}

/**
 * Returns the credentials to connect to a Magento1 database.
 *
 * @param  string $lines Content of the configuration file.
 * @return array         Credentials to connect to the database.
 */
function readMagento1Config($lines)
{
    return array(
        'host' => getOption('host', $lines, OPT_TYPE_XML),
        'user' => getOption('username', $lines, OPT_TYPE_XML),
        'pass' => getOption('password', $lines, OPT_TYPE_XML),
        'db' => getOption('dbname', $lines, OPT_TYPE_XML),
        'prefix' => getOption('table_prefix', $lines, OPT_TYPE_XML),
    );
}

/**
 * Returns the credentials to connect to a Magento2 database.
 *
 * @param  string $lines Content of the configuration file.
 * @return array         Credentials to connect to the database.
 */
function readMagento2Config($lines)
{
    return array(
        'host' => getOption('host', $lines, OPT_TYPE_ASSOC),
        'user' => getOption('username', $lines, OPT_TYPE_ASSOC),
        'pass' => getOption('password', $lines, OPT_TYPE_ASSOC),
        'db' => getOption('dbname', $lines, OPT_TYPE_ASSOC),
        'prefix' => getOption('table_prefix', $lines, OPT_TYPE_ASSOC),
    );
}

/**
 * Returns the credentials to connect to a Drupal database.
 *
 * @param  string $lines Content of the configuration file.
 * @return array         Credentials to connect to the database.
 */
function readDrupalConfig($lines)
{
    return array(
       'host' => getOption('host', $lines, OPT_TYPE_ASSOC | OPT_TYPE_FIRST),
       'user' => getOption('username', $lines, OPT_TYPE_ASSOC | OPT_TYPE_FIRST),
       'pass' => getOption('password', $lines, OPT_TYPE_ASSOC | OPT_TYPE_FIRST),
       'db' => getOption('database', $lines, OPT_TYPE_ASSOC | OPT_TYPE_FIRST),
       'prefix' => getOption('prefix', $lines, OPT_TYPE_ASSOC | OPT_TYPE_FIRST),
    );
}

/**
 * Returns the credentials to connect to a Joomla database.
 *
 * @param  string $lines Content of the configuration file.
 * @return array         Credentials to connect to the database.
 */
function readJoomlaConfig($lines)
{
    return array(
        'host'   => getOption('$host', $lines, OPT_TYPE_VAR),
        'user'   => getOption('$user', $lines, OPT_TYPE_VAR),
        'pass'   => getOption('$password', $lines, OPT_TYPE_VAR),
        'db'     => getOption('$db', $lines, OPT_TYPE_VAR),
        'prefix' => getOption('$dbprefix', $lines, OPT_TYPE_VAR),
    );
}

/**
 * Returns the credentials to connect to a Vbulletin database.
 *
 * @param  string $lines Content of the configuration file.
 * @return array         Credentials to connect to the database.
 */
function readVbulletinConfig($lines)
{
    // https://www.vbulletin.com/docs/html/main/install_core_config_php
    return array(
        'host' => getOption("\$config['MasterServer']['servername']", $lines, OPT_TYPE_VAR),
        'user' => getOption("\$config['MasterServer']['username']", $lines, OPT_TYPE_VAR),
        'pass' => getOption("\$config['MasterServer']['password']", $lines, OPT_TYPE_VAR),
        'db' => getOption("\$config['Database']['dbname']", $lines, OPT_TYPE_VAR),
        'port' => getOption("\$config['MasterServer']['port']", $lines, OPT_TYPE_VAR),
        'prefix' => getOption("\$config['Database']['tableprefix']", $lines, OPT_TYPE_VAR),
    );
}

/**
 * Returns the credentials to connect to a PrestaShop database.
 *
 * @param  string $lines Content of the configuration file.
 * @return array         Credentials to connect to the database.
 */
function readPrestaShopConfig($lines)
{
    $lines = explode("\n", $lines);
    $dbconfig = array();

    foreach ($lines as $line) {
        preg_match('/^[^#]\s+([\'"])(.*)\1\s+=>\s+([\'"])(.*)\3/', $line, $matches);
        $key   = isset($matches[2]) ? $matches[2] : null;
        $value = isset($matches[4]) ? $matches[4] : null;

        if (isset($key) && isset($value)) {
            $dbconfig[$key] = $value;
        }
    }

    $admin_profile_config = '.' . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'defines.inc.php';
    $apc_lines = file_get_contents($admin_profile_config);
    $admin_profile_num = getOption('_PS_ADMIN_PROFILE_', $apc_lines, OPT_TYPE_CONST_NUM);

    return array(
        'host'     => $dbconfig['database_host'],
        'user'     => $dbconfig['database_user'],
        'pass'     => $dbconfig['database_password'],
        'db'       => $dbconfig['database_name'],
        'prefix'   => $dbconfig['database_prefix'],
        'admin_id' => $admin_profile_num,
    );
}

/**
 * Returns the credentials to connect to a PrestaShop database (versions 1.6 and lower).
 *
 * @param  string $lines Content of the configuration file.
 * @return array         Credentials to connect to the database.
 */
function readPrestaShopConfigOld($lines)
{
    if (is_array($lines)) {
        $lines = implode("\n", $lines);
    }

    $admin_profile_config = '.' . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'defines.inc.php';
    $apc_lines = file_get_contents($admin_profile_config);
    $admin_profile_num = getOption('_PS_ADMIN_PROFILE_', $apc_lines, OPT_TYPE_CONST_NUM);

    return array(
        'host'     => getOption('_DB_SERVER_', $lines, OPT_TYPE_CONST | OPT_TYPE_ENV),
        'user'     => getOption('_DB_USER_', $lines, OPT_TYPE_CONST),
        'pass'     => getOption('_DB_PASSWD_', $lines, OPT_TYPE_CONST),
        'db'       => getOption('_DB_NAME_', $lines, OPT_TYPE_CONST),
        'prefix'   => getOption('_DB_PREFIX_', $lines, OPT_TYPE_CONST),
        'admin_id' => $admin_profile_num,
        'old'      => true,
    );
}

/**
 * Returns the credentials to connect to a OsCommerce database.
 *
 * @param  string $lines Content of the configuration file.
 * @return array         Credentials to connect to the database.
 */
function readOsCommerceConfig($lines)
{
    return array(
        'host' => getOption('DB_SERVER', $lines, OPT_TYPE_CONST | OPT_TYPE_ENV),
        'user' => getOption('DB_SERVER_USERNAME', $lines, OPT_TYPE_CONST),
        'pass' => getOption('DB_SERVER_PASSWORD', $lines, OPT_TYPE_CONST),
        'db' => getOption('DB_DATABASE', $lines, OPT_TYPE_CONST),
        'prefix' => getOption('DB_PREFIX', $lines, OPT_TYPE_CONST),
    );
}

/**
 * Returns the credentials to connect to a MODX database.
 *
 * @param  string $lines Content of the configuration file.
 * @return array         Credentials to connect to the database.
 */
function readMODXConfig($lines)
{
    return array(
        'host' => getOption('$database_server', $lines, OPT_TYPE_VAR),
        'user' => getOption('$database_user', $lines, OPT_TYPE_VAR),
        'pass' => getOption('$database_password', $lines, OPT_TYPE_VAR),
        'db' => getOption('$dbase', $lines, OPT_TYPE_VAR),
        'prefix' => getOption('$table_prefix', $lines, OPT_TYPE_VAR),
    );
}

/**
 * Returns the credentials to connect to a OpenCart database.
 *
 * @param  string $lines Content of the configuration file.
 * @return array         Credentials to connect to the database.
 */
function readOpenCartConfig($lines)
{
    return array(
        'host' => getOption('DB_HOSTNAME', $lines, OPT_TYPE_CONST | OPT_TYPE_ENV),
        'user' => getOption('DB_USERNAME', $lines, OPT_TYPE_CONST),
        'pass' => getOption('DB_PASSWORD', $lines, OPT_TYPE_CONST),
        'db' => getOption('DB_DATABASE', $lines, OPT_TYPE_CONST),
        'prefix' => getOption('DB_PREFIX', $lines, OPT_TYPE_CONST),
    );
}

/**
 * Returns the credentials to connect to a PhpBB database.
 *
 * @param  string $lines Content of the configuration file.
 * @return array         Credentials to connect to the database.
 */
function readPhpBBConfig($lines)
{
    return array(
        'host' => getOption('$dbhost', $lines, OPT_TYPE_VAR),
        'user' => getOption('$dbuser', $lines, OPT_TYPE_VAR),
        'pass' => getOption('$dbpasswd', $lines, OPT_TYPE_VAR),
        'db' => getOption('$dbname', $lines, OPT_TYPE_VAR),
        'prefix' => getOption('$table_prefix', $lines, OPT_TYPE_VAR),
    );
}

/**
 * Returns the credentials to connect to a Laravel/Symfony database.
 *
 * @param  string $lines Content of the configuration file.
 * @return array         Credentials to connect to the database.
 */
function readSymfLaravelConfig($lines)
{
    return array(
        'host' => getOption('DB_HOST', $lines, OPT_TYPE_PHPDOTENV),
        'user' => getOption('DB_USERNAME', $lines, OPT_TYPE_PHPDOTENV),
        'pass' => getOption('DB_PASSWORD', $lines, OPT_TYPE_PHPDOTENV),
        'db' => getOption('DB_NAME', $lines, OPT_TYPE_PHPDOTENV),
        'prefix' => '',
    );
}

/**
 * Returns the website configuration.
 *
 * @param  string $dir Directory where the website is installed.
 * @return array|bool  Website configuration or false on failure.
 */
function getCMSConfigInDir($dir)
{
    global $config;
    $cmses = array(
        'sucuri_db_clean.php'            => array( 'sucuri_db_clean.php', 'readWordPressConfig' ),
        'wp-config.php'                  => array( 'WordPress', 'readWordPressConfig' ),
        'configuration.php'              => array( 'Joomla', 'readJoomlaConfig' ),
        'sites/default/settings.php'     => array( 'Drupal', 'readDrupalConfig' ),
        'app/etc/local.xml'              => array( 'Magento1', 'readMagento1Config' ),
        'app/etc/env.php'                => array( 'Magento2', 'readMagento2Config' ),
        'includes/config.php'            => array( 'vBulletin', 'readVbulletinConfig' ), // vBulletin 4
        'core/includes/config.php'       => array( 'vBulletin', 'readVbulletinConfig' ), // vBulletin 5 and higher
        'config/settings.inc.php'        => array( 'PrestaShop', 'readPrestaShopConfigOld' ), // Older prestashop
        'app/config/parameters.php'      => array( 'PrestaShop', 'readPrestaShopConfig' ),
        'includes/configure.php'         => array( 'osCommerce', 'readOsCommerceConfig' ),
        'core/config/config.inc.php'     => array( 'MODX', 'readMODXConfig' ),
        'admin/config.php'               => array( 'OpenCart', 'readOpenCartConfig' ),
        'config.php'                     => array( 'phpBB', 'readPhpBBConfig' ),
        '.env'                           => array( 'laravel/Symfony', 'readSymfLaravelConfig' ),
    );

    if (isset($_GET['noise'])) {
        printMsg("Checking config in " . $dir . "\n");
    }

    // Detect the CMS
    foreach ($cmses as $filename => $cmsArray) {
        if (!is_readable($dir . $filename)) {
            continue;
        }

        list($cmsName, $configFunc) = $cmsArray;

        $config = call_user_func($configFunc, file_get_contents($dir . $filename));

        // At least these parameters must be present in the config file;
        // the prefix, the port number, and the password can be empty
        if ($config['host'] && $config['db'] && $config['user']) {
            $config['cms'] = $cmsName;

            if (preg_match('/:([0-9]+)$/', $config['host'], $matches)) {
                $config['host'] = substr($config['host'], 0, -strlen($matches[0]));
                $config['port'] = $matches[1];
            }

            if (!isset($_GET['dump'])) {
                printMsg($cmsName . " detected. Config file: $dir$filename");
                if (!$GLOBALS['isPlainText']) {
                    echo('  <a href="sucuri-cleanup.php?srun&new&seefile=' . base64_encode($dir . $filename) . '" target="_blank">' .
                        '<span class="inserted" data-content="show content"></span></a>');
                }
            }


            return $config;
        } else {
            printMsg("INFO: not found DB config in $dir$filename\n");
        }
    }

    return false;
}

/**
 * Returns the website configuration.
 *
 * The function searches for the configuration file in the current directory,
 * then the parent directory, then in every directory that is under the current
 * location. Once it finds it, it immediately returns the information contained
 * in the file.
 *
 * @return array|bool|null Website configuration or false on failure.
 */
function getCMSConfig()
{
    if (isset($_GET['dir'])) {
        $scan_dir = $_GET['dir'];
        $config = getCMSConfigInDir($scan_dir . DIRECTORY_SEPARATOR);
        return $config;
    }
    else{
        // Check . and .. first because readdir() can return them after the other directories
        $config = getCMSConfigInDir('.' . DIRECTORY_SEPARATOR);
        if ($config) {
            return $config;
        }

        $config = getCMSConfigInDir('..' . DIRECTORY_SEPARATOR);
        if ($config) {
            return $config;
        }

        $dh = opendir('.');
        if (!$dh) {
            return null;
        }

        while (false !== ($fileName = @readdir($dh))) {
            if (!is_dir($fileName) || $fileName === '.' || $fileName === '..') {
                continue;
            }

            $config = getCMSConfigInDir($fileName . DIRECTORY_SEPARATOR);
            if ($config) {
                closedir($dh);
                return $config;
            }
        }
        closedir($dh);

        echo "ERROR: Unable to complete. Missing config file\n\n";
        return null;
    }
}

/**
 * Creates a file with the website configuration.
 *
 * If the script is not able to find the file with the website configuration,
 * this function can be used to create a temporary file that will be used to
 * expose the necessary data in order to connect to the database and proceed
 * with the rest of the operations.
 *
 * @param  array $config Website configuration.
 * @return void
 */
function createConfigFile($config)
{
    $contents = "<?php

define( 'DB_NAME', '" . addslashes($config['dbname']) . "' );
define( 'DB_USER', '" . addslashes($config['dbuser']) . "' );
define( 'DB_PASSWORD', '" . addslashes($config['dbpass']) . "' );
define( 'DB_HOST', '" . addslashes($config['dbhost']) . "' );

\$table_prefix = '" . addslashes($config['prefix']) . "';
\$cms = '" . addslashes($config['cms']) . "';

";

    $fh = fopen('sucuri_db_clean.php', 'wb');
    if ($fh === false || false === fwrite($fh, $contents)) {
        reportFatalError('Unable to store file: sucuri_db_clean.php');
    }
    fclose($fh);

    echo "Successfully stored file: sucuri_db_clean.php\n";
}

/**
 * Prints a message into the command line and waits for user input.
 *
 * @param  string $prompt  Text to act as the command line prompt.
 * @param  string $default Default value in case of no user input.
 * @return string          User input.
 */
function askFromCmdLine($prompt, $default = '')
{
    if ($default) {
        echo $prompt . ' (press Enter for ' . $default . '): ';
    } else {
        echo $prompt . ': ';
    }

    $ret = trim(fgets(STDIN));

    if ($ret === '') {
        return $default;
    }

    return $ret;
}

/**
 * Displays a form to create a custom configuration file.
 *
 * If the script is executed over a web interface, the script will print a form
 * with fields asking for the information that will be used to connect with the
 * database associated to the website. However, if the script is being executed
 * over a command line interface, the script will ask for the same information
 * using command prompts.
 *
 * @return void
 */
function doDbConfig()
{
    if (isTerminal()) {
        $config = array();
        $config['dbname'] = askFromCmdLine('Database name');
        $config['dbuser'] = askFromCmdLine('Username', $config['dbname']);
        $config['dbpass'] = askFromCmdLine('Password');
        $config['dbhost'] = askFromCmdLine('Host', '127.0.0.1');

        $cmses = array('WordPress' => 1, 'Joomla' => 1, 'Magento' => 1, 'vBulletin' => 1, 'Drupal' => 1);
        do {
            $config['cms'] = askFromCmdLine('CMS (one of WordPress, Joomla, Magento, vBulletin, or Drupal)', 'WordPress');
        } while (!isset($cmses[$config['cms']]));

        if ($config['cms'] === 'WordPress') {
            $defaultPrefix = 'wp_';
        } elseif ($config['cms'] === 'Magento') {
            $defaultPrefix = 'mg_';
        } else {
            $defaultPrefix = '';
        }

        $config['prefix'] = askFromCmdLine('Prefix', $defaultPrefix);

        createConfigFile($config);
        return;
    }

    if (isset($_POST['createconfig'])) {
        if (!isset($_POST['dbname'])
            || !isset($_POST['dbuser'])
            || !isset($_POST['dbpass'])
            || !isset($_POST['dbhost'])
            || !isset($_POST['prefix'])
        ) {
            reportFatalError('No DB params');
        }

        if (get_magic_quotes_gpc()) {
            $_POST['dbname'] = stripslashes($_POST['dbname']);
            $_POST['dbuser'] = stripslashes($_POST['dbuser']);
            $_POST['dbpass'] = stripslashes($_POST['dbpass']);
            $_POST['dbhost'] = stripslashes($_POST['dbhost']);
            $_POST['prefix'] = stripslashes($_POST['prefix']);
        }

        createConfigFile($_POST);
        echo '<a href="?srun">Scan the database</a>';
        exit;
    }

    echo "Setup sucuri_db_clean.php with custom DB credentials (WARNING: THIS WILL OVERRIDE ANY CURRENT FILE):\n";
    echo '<form method="post" action="">';
    echo '<scr' . 'ipt type="text/javascript"><!--' . "\n";
    echo 'function onChangeCms() {' . "\n";
    echo 'var prefix = ["wp_", "", "mg_", "", ""];' . "\n";
    echo 'document.getElementById("prefix").value = prefix[document.getElementById("cms").selectedIndex];' . "\n";
    echo "}\n";
    echo '--></script>';

    echo '<input type="hidden" name="createconfig" value="myconfig" />';

    echo "Database:\t" . '<input type="text" name="dbname" value="">' . "\n";
    echo "Username:\t" . '<input type="text" name="dbuser" value="">' . "\n";
    echo "Password:\t" . '<input type="text" name="dbpass" value="">' . "\n";
    echo "Host:\t\t" . '<input type="text" name="dbhost" value="localhost">' . "\n";
    echo "CMS:\t\t" . '<select name="cms" id="cms" onchange="onChangeCms()">' .
        '<option selected>WordPress</option><option>Joomla</option>' .
        '<option>Magento</option><option>vBulletin</option><option>Drupal</option></select>' . "\n";
    echo "Prefix:\t\t" . '<input type="text" name="prefix" id="prefix" value="wp_">' . "\n";
    echo '<input type="submit" name="submit" value="Save file" />';

    echo '</form>';

    exit;
}

/**
 * Allows to edit a database column manually.
 *
 * This function renders a HTML form that allows to edit the content of one or
 * more rows in a specific table in the database. The form sends old_content and
 * row_content which are used to search and replace the content of a table.
 *
 * @param  MySQLIDriver $driver Database connection.
 * @param  string       $table  Name of the table.
 * @param  string       $column Name of the column.
 * @param  string       $idName Name of the primary key column.
 * @param  array        $id     List of identifiers for the primary key column.
 * @return void
 */
function showContent($driver, $table = '', $column = '', $idName = '', $id = array())
{
    $location = array('table' => $table, 'column' => $column, 'idname' => $idName, 'id' => $id);
    $updateRes = false;

    if (isset($_POST['row_content']) && isset($_POST['old_content'])) {
        if (get_magic_quotes_gpc()) {
            $_POST['row_content'] = stripslashes($_POST['row_content']);
        }

        $old_content = base64_decode($_POST['old_content']);
        $updateRes = updateDb($driver, $_POST['row_content'], $old_content, $location, 'manual');
    }

    $sqlContent = 'SELECT ' . $driver->escapeName($column) . ' FROM ' . $driver->escapeName($table) .
        ' WHERE ' . $driver->escapeName($idName) . ' = ' . $driver->escapeStr($id) . ';';

    $row = $driver->fetchRow($driver->query($sqlContent));

    $dir = '';
    if (isset($_GET['dir'])) {
        $dir = '&dir=' . $_GET['dir'];
    }
    // Exclude match_start/match_end from the link: after editing, there should be no selection
    $link = '?srun&showcontent&t=' . escapeHTML($table) . '&c=' . escapeHTML($column) .
            '&id_name=' . escapeHTML($idName) . '&id=' . escapeHTML($id) . $dir;
    echo '<form method="post" action="' . $link . '">';
    echo '<input type="hidden" name="old_content" value="' . base64_encode($row[0]) . '">';

    echo getLocationHTML($location, 'plaintext');
    $compoundRe = '/^ (?:
          a : (?P<count> [0-9]+) : \\{
        | (?P<type> [OC]) : (?P<namelen> [0-9]+) : "(?P<name> [^"]+)" : (?P<clen> [0-9]+) : \\{
        ) /x';

    if (preg_match($compoundRe, $row[0])) {
        echo ' - THIS STRING IS SERIALIZED! Please use <a href="?srun&s"><b>search and replace</b></a> instead!';
    } else {
        echo ' - <input type="submit" name="submit" value="Update Content" />';
    }

    echo '<div style="float:right"><a href="?srun&s">Global search and replace</a></div>';

    showUpdateDbError($updateRes);
    if ($updateRes === true) {
        echo "\n" . '<span class="cleared">Updated</span>';
    }

    echo "\n\n" . '<textarea id="row_content" name="row_content" style="margin: 2px; height: 85%; width: 100%">';

    echo escapeHTML($row[0]);

    echo "</textarea></form>";

    if (isset($_GET['match_start']) && isset($_GET['match_end'])) {
        // Highlight the matching text
        $match_start = intval($_GET['match_start']);
        $match_end = intval($_GET['match_end']);

        echo '<scr' . 'ipt type="text/javascript"><!--' . "\n";
        echo 'document.getElementById("row_content").setSelectionRange(' . $match_start . ',' . $match_end . ');';
        echo 'document.getElementById("row_content").focus();';
        echo "\n--></script>";
    }

    $driver->disconnect();
    exit;
}

function showRow($driver, $table, $idName, $id)
{
    $location = array('table' => $table, 'idname' => $idName, 'id' => $id);
    $updateRes = false;

    if (isset($_POST['delete_row'])) {
        list($res, $out) = deleteRowsFromDb($driver, $location, $driver->escapeName($idName) . ' = ' . $driver->escapeStr($id));
        showUpdateDbError($res);
        echo $out;
        $driver->disconnect();
        exit;
    }

    list($columns, $types) = $driver->getColumnNamesTypes($location['table']);

    $sqlContent = 'SELECT * FROM ' . $driver->escapeName($table) .
        ' WHERE ' . $driver->escapeName($idName) . ' = ' . $driver->escapeStr($id) . ';';

    $row = $driver->fetchRow($driver->query($sqlContent));

    echo '<h2>' . escapeHTML($table) . '</h2>';
    echo '<table border="1" cellpadding="4" cellspacing="0"><tr>';
    for ($i = 0; $i < count($columns); $i++) {
        echo '<td>' . escapeHTML($columns[$i]) . '</td>';
    }
    echo '</tr><tr>';
    for ($i = 0; $i < count($columns); $i++) {
        echo '<td>' . escapeHTML($row[$i]) . '</td>';
    }
    echo '</tr></table>';

    echo '<br><form method="post"><input type="submit" name="delete_row" value="Delete this row" /></form>';

    $driver->disconnect();
    exit;
}

/**
 * Detects the CMS type and prints a list of admin users from the database.
 *
 * @option skip-listusers Skips the execution of the database user list printer.
 *
 * @return void
 */
function maybePrintUserList()
{
    global $config;
    if (isset($_GET['skip-listusers'])
        || isset($_GET['s'])
        || isset($_GET['dump'])
        || isset($_GET['restore'])
        || isset($_GET['showcontent'])
    ) {
        return;
    }

    printMsg("\n\nList of Administrator users:\n");

    switch ($config['cms']) {
        case 'WordPress':
            listUsersFromWordpress();
            break;

        case 'Joomla':
            listUsersFromJoomla();
            break;

        case 'Drupal':
            listUsersFromDrupal($dir . DIRECTORY_SEPARATOR . $filename);
            break;

        case 'Magento1':
        case 'Magento2':
            listUsersFromMagento(realpath(dirname(__FILE__)) . DIRECTORY_SEPARATOR . 'app' . DIRECTORY_SEPARATOR . 'Mage.php');
            break;

        case 'vBulletin':
            listUsersFromVbulletin($dir . DIRECTORY_SEPARATOR . $filename);
            break;

        case 'PrestaShop':
            listUsersFromPrestashop();
            break;

        case 'osCommerce':
            listUsersFromOscommerce($dir . DIRECTORY_SEPARATOR . $filename);
            break;

        case 'MODX':
            listUsersFromModx($dir . DIRECTORY_SEPARATOR . $filename);
            break;

        case 'OpenCart':
            listUsersFromOpencart($dir . DIRECTORY_SEPARATOR . $filename);
            break;

        case 'phpBB':
            listUsersFromPhpbb($dir . DIRECTORY_SEPARATOR . $filename);
            break;
    }
}

/**
 * Prints a list of admin users from a WordPress website.
 *
 * @return void
 */
function listUsersFromWordpress()
{
    global $config, $driver;
    $sqlContent = "SELECT " . $config['prefix'] . "users.*
                   FROM " . $config['prefix'] . "users
                   INNER JOIN " . $config['prefix'] . "usermeta ON ( " . $config['prefix'] . "users.ID = " . $config['prefix'] . "usermeta.user_id )
                   WHERE 1=1
                   AND ( ( ( " . $config['prefix'] . "usermeta.meta_key = '" . $config['prefix'] . "capabilities'
                   AND " . $config['prefix'] . "usermeta.meta_value LIKE '%\"Administrator\"%' ) ) )
                   ORDER BY ID ASC";

    $result = $driver->query($sqlContent);
    $users = array();

    $users = array();
    while ($row = $result->fetch_array()) {
        $users[] = $row;
    }


    $usersPosts = array();

    if (isset($_GET["count_user_posts"])) {
      $usersIDs = "";
      $totalUsers = count($users);
      for ($i = 0; $i < $totalUsers; $i++) {
        $usersIDs .= " OR u.ID = " . $users[$i]["ID"];
      }

      $sqlCountUsersPosts = "SELECT u.ID, COUNT(p.post_author) AS count " .
                        "FROM " . $config['prefix'] . "users AS u " .
                        "LEFT JOIN " . $config['prefix'] . "posts AS p ON u.ID = p.post_author " .
                        "WHERE 1=1 " . $usersIDs .
                        " GROUP BY u.ID";
      $resultUsersPosts = $driver->query($sqlCountUsersPosts);

      while ($row = $resultUsersPosts->fetch_array()) {
          $usersPosts[$row["ID"]] = $row["count"];
      }
    }


    foreach ($users as $user) {
        printf(
            "ID: %d, Username: %s, E-mail: %s, Creation Date: %s\n",
            $user["ID"],
            $user["user_login"],
            $user["user_email"],
            $user["user_registered"]
        );
    }
}

/**
 * Prints a list of admin users from a Joomla website.
 *
 * @return bool              True if the website is built on top of Joomla.
 */
function listUsersFromJoomla()
{
    global $config, $driver;

    $query = "SELECT u.id, u.username
        FROM `" . $config['prefix'] . "usergroups` us, `" . $config['prefix'] . "users` u,
            `" . $config['prefix'] . "user_usergroup_map` uum
        WHERE us.id = uum.group_id AND uum.user_id = u.id
        AND `title` IN ('Super Users', 'Administrator', 'Super Administrator')";

    $result = $driver->query($query, true);

    if ($result === false) {
        $query = "SELECT u.id, u.username FROM `" . $config['prefix'] . "users` u WHERE u.usertype = 'Super Administrator'";
        $result = $driver->query($query);
    }


    if (!$result) {
        /**
         * Return True no matter if this operation failed.
         *
         * This guarantees that the calls for other listUsers methods will stop
         * as at this point we already know that the website is built on top of
         * the Joomla CMS, considering that the framework library is available.
         */
        return true;
    }

    $users = array();
    while ($row = $result->fetch_array()) {
        $users[] = $row;
    }

    foreach ($users as $row) {
        printf("ID: %d, Username: %s\n", $row['id'], $row['username']);
    }

    return true;
}

/**
 * Prints a list of admin users from a Magento website.
 *
 * @param  string $config Location of the configuration file.
 * @return bool           True if the website is built on top of Magento.
 */
function listUsersFromMagento($config)
{
    define('MAGENTO', realpath(dirname(__FILE__)));

    if (file_exists($config)) {
        include_once $config;
    }

    if (!class_exists('Mage')) {
        return false;
    }

    Mage::app();
    $app = Mage::app();
    umask(0);

    Mage::app('default');
    Mage::getSingleton('core/session', array('name' => 'adminhtml'));

    $users = Mage::getResourceModel('admin/roles_user_collection');

    foreach ($users as $roleuser) {
        $user = Mage::getModel('admin/user')->load($roleuser->getUserId());
        printf("ID: %d, Username: %s\n", $roleuser->getUserId(), $user->getUsername());
    }

    return true;
}

/**
 * Prints a list of admin users from a Vbulletin website.
 *
 * @param  string $config Location of the configuration file.
 * @return bool           True if the website is built on top of Vbulletin.
 */
function listUsersFromVbulletin($config)
{
    $vb_url = '';
    $login_url = '';

    if (file_exists($config)) {
        define('VB_ENTRY', 'sucuri');
        @chdir('core');
        include_once $config;
        @chdir('../');

        if (!class_exists('vB')) {
            return false;
        }

        $vb_options = vB::getDatastore()->getValue('options');
        $login_url = $vb_options['frontendurl_login'];
        $vb_url = VB_URL;
    }

    if (!isset($GLOBALS['vbulletin'])) {
        return false; /* not a vbulletin site */
    }

    if (!$login_url && is_array($GLOBALS['vbulletin']->options)) {
        $login_url = $GLOBALS['vbulletin']->options['bburl'];
    }

    if (!$vb_url && defined('VB_URL')) {
        $vb_url = VB_URL;
    }

    if ($vb_url && $login_url) {
        $parsed_vb_url = parse_url($vb_url);
        $parsed_login_url = parse_url($login_url);
        $new_url = array();

        foreach ($parsed_vb_url as $k => $v) {
            if ($k !== 'path' && isset($parsed_login_url[$k]) && $v !== $parsed_login_url[$k]) {
                $new_url[$k] = $parsed_login_url[$k];
            }
        }

        $new_url = array_merge($parsed_vb_url, $new_url);
        $redir_url = vbulletinBuildURL($new_url);

        if ($vb_url !== $redir_url) {
            header('Location: ' . $redir_url);
            exit(0);
        }
    }

    $users = $GLOBALS['vbulletin']->db->query_read(
        'SELECT * FROM ' . TABLE_PREFIX . 'user WHERE usertitle = "Administrator"'
    );

    while ($user = $GLOBALS['vbulletin']->db->fetch_array($users)) {
        printf("ID: %d, Username: %s\n", $user['userid'], $user['username']);
    }

    $GLOBALS['vbulletin']->db->free_result($user);

    return true;
}

/**
 * Takes most output from parse_url.
 *
 * @param  array $parsed_url Output from parse_url.
 * @return string            Formalize the output of parse_url.
 */
function vbulletinBuildURL($parsed_url)
{
    $scheme = isset($parsed_url['scheme']) ? $parsed_url['scheme'] . '://' : '';
    $host = isset($parsed_url['host']) ? $parsed_url['host'] : '';
    $path = isset($parsed_url['path']) ? $parsed_url['path'] : '';
    $query = isset($parsed_url['query']) ? '?' . $parsed_url['query'] : '';
    $fragment = isset($parsed_url['fragment']) ? '#' . $parsed_url['fragment'] : '';

    return $scheme . $host . $path . $query . $fragment;
}

/**
 * Prints a list of admin users from a Drupal website.
 *
 * @param  string $config Location of the configuration file.
 * @return void
 */
function listUsersFromDrupal($config)
{
    /* TODO: Implement function to print admin users from Drupal */
}

/**
 * Prints a list of admin users from a Prestashop website.
 *
 * @return void
 */
function listUsersFromPrestashop()
{
    global $config, $driver;
    $query = "SELECT DISTINCT * FROM " . $config['prefix'] . "employee e " .
        "JOIN " . $config['prefix'] . "access a " .
        "ON e.id_profile = a.id_profile " .
        "WHERE e.active = 1 ";

    if (isset($config['admin_id'])) {
        $role = $config['old'] ? 'id_tab' : 'id_authorization_role';
        $query .= "AND a.$role = " . $config['admin_id'];
    }

    $result = $driver->query($query);

    $admins = array();
    while ($row = $driver->fetchAssoc($result)) {
        $admins[] = $row;
    }

    if (!is_array($admins)) {
        echo "Unable to get PrestaShop users..\n";
        return;
    }

    foreach ($admins as $admin) {
            printf(
                "ID: %d, Username: %s, E-mail: %s\n",
                $admin['id_employee'],
                $admin['firstname'] . ' ' . $admin['lastname'],
                $admin['email']
            );
    }
    return;
}

/**
 * Prints a list of admin users from a Oscommerce website.
 *
 * @param  string $config Location of the configuration file.
 * @return void
 */
function listUsersFromOscommerce($config)
{
    /* TODO: Implement function to print admin users from Oscommerce */
}

/**
 * Prints a list of admin users from a Modx website.
 *
 * @param  string $config Location of the configuration file.
 * @return void
 */
function listUsersFromModx($config)
{
    /* TODO: Implement function to print admin users from Modx */
}

/**
 * Prints a list of admin users from a Opencart website.
 *
 * @param  string $config Location of the configuration file.
 * @return void
 */
function listUsersFromOpencart($config)
{
    /* TODO: Implement function to print admin users from Opencart */
}

/**
 * Prints a list of admin users from a Phpbb website.
 *
 * @param  string $config Location of the configuration file.
 * @return void
 */
function listUsersFromPhpbb($config)
{
    /* TODO: Implement function to print admin users from Phpbb */
}

/**
 * Prints information about the database tables.
 *
 * The information includes the table structure and size.
 *
 * @option list Describes and analyzes the tables in the database.
 *
 * @param  MySQLIDriver $driver        Database connection.
 * @param  array        $tablesColumns List of tables with their columns.
 * @param  array        $config        Application configuration.
 * @return void
 */
function listTables($driver, $tablesColumns, $config)
{
    $totalBlob = 0;
    $entries = array();

    foreach ($tablesColumns as $table => $columns) {
        $uniqueid = '--'; /* empty */
        $tableName = escapeHTML($table);

        /* primary key or composite primary key */
        if (array_key_exists('idname', $columns)) {
            $uniqueid = $columns['idname'];
        }

        /* get number of rows in this table */
        $sql = 'SELECT COUNT(*) AS total FROM ' . $driver->escapeName($table);
        $res = $driver->query($sql, true);
        if ($res === false) {
            printMsg("\nWARN: Failed to access " . $table . "\n");
            continue;
        }
        $res = $driver->fetchAssoc($res);
        $rows = intval($res['total']);
        $cols = count($columns);

        /* implode column names and composite keys */
        if (array_key_exists('idname', $columns)) {
            $shortColumns = $columns;
            unset($shortColumns['idname']);
            $colsText = smartImplode($shortColumns, ",\x20");
        } else {
            $colsText = smartImplode($columns, ",\x20");
        }

        /**
         * How much data the script needs to scan.
         *
         * We will multiply the number of rows against the number of columns on
         * each database table. However, because the unique identifier for each
         * table is usually safe (because it is almost always an integer) we
         * will decrease the number of columns by one before the operation.
         *
         * @var int
         */
        $usefulCols = ($cols > 0) ? ($cols - 1) : 0;
        $blobSize = $rows * $usefulCols;
        $totalBlob += $blobSize;

        /* add link to skip table on browser */
        if (!isTerminal()) {
            $tableName = '<a target="_self" href="?srun&resume&noise&scantable='
                . escapeHTML($table) . '">' . escapeHTML($table) . '</a>';
        }

        $entries[] = array(
            'Table' => $tableName,
            'ID' => escapeHTML($uniqueid),
            'Rows' => $rows,
            'Cols' => $cols,
            'Blob' => $blobSize,
            'Perc' => 0,
            'Columns' => escapeHTML($colsText),
        );
    }

    /**
     * Append percentages to all database tables.
     */
    foreach ($entries as $key => $data) {
        if ($totalBlob <= 0) {
            /* avoid impossible division by zero */
            $entries[$key]['Perc'] = '0%';
            continue;
        }

        $percentage = ($data['Blob'] * 100) / $totalBlob;
        $entries[$key]['Perc'] = sprintf('%.2g%%', $percentage);
    }

    /**
     * Setup ASCII table.
     * @var TabularData
     */
    $tabular = new TabularData();
    $tabular->setTitle('Database Tables');
    $tabular->addColumn('Table');
    $tabular->addColumn('ID');
    $tabular->addColumn('Rows');
    $tabular->addColumn('Cols');
    $tabular->addColumn('Blob');
    $tabular->addColumn('Perc');
    $tabular->addColumn('Columns');
    $tabular->addData($entries);
    $tabular->sortBy('Blob');

    $dbPrefix = isset($config['prefix']) ? $config['prefix'] : '[none]';
    $tabular->addNote('Table Prefix = ' . escapeHTML($dbPrefix));
    $tabular->addNote(sprintf('%d text/blob to scan', $totalBlob));
    $tabular->addNote(
        'A "--" ID means <a href="https://stackoverflow.com/a/15268888"'
        . ' target="_blank" rel="nofollow">no PRI/UNI but MUL</a>'
    );
    $tabular->addNote(
        'Empty "Columns" means <a href="https://stackoverflow.com/a/15268888"'
        . ' target="_blank" rel="nofollow">MUL</a> is in place'
    );

    $tabular->printTable();
}

/**
 * Searches and replaces content in a database table.
 *
 * This function only works if the script was called from a CLI.
 *
 * @param  MySQLIDriver $driver          Database connection.
 * @param  array        $tablesColumns   List of tables with their columns.
 * @param  array        $searchSignature List of signatures to search.
 * @return void
 */
function replaceInTerminal($driver, $tablesColumns, $searchSignature)
{
    // Not run from terminal or a search signature specified on the command line
    if (!isTerminal() || $_GET['s'] !== '') {
        return;
    }

    foreach ($searchSignature as $trigger => $sigArray) {
        // No cleanup was requested; only search
        if ($sigArray[CI_ACTION] === WARN) {
            return;
        }
    }

    echo "\n";
    $reply = askFromCmdLine('Clean the malware (save the changes)? [Y / N]');
    if ($reply === 'y' || $reply === 'Y') {
        unset($_GET['noclean']);
        $_POST = array('clean' => '1');
        searchAndClear($driver, $tablesColumns, $searchSignature);
    } else {
        echo "Not cleaned";
    }
}

/**
 * Displays a form to search for signatures in the database.
 *
 * If the script is executed via a web server, it will render a HTML form with
 * fields to allow the user to search for a string that will be matched against
 * the content of the database. However, if the script is executed via the CLI
 * a simple command prompt will be used to receive the user input.
 *
 * @return array Information about the malware cleanup.
 */
function getSearchSignature()
{
    $trigger = $_GET['s'];
    if (isset($_POST['s'])) {
        $trigger = $_POST['s'];
    }
    $action = isset($_POST['regex']) ? $_POST['regex'] : '';

    if (get_magic_quotes_gpc() && !isTerminal()) {
        $trigger = stripslashes($trigger);
        $action = stripslashes($action);
    }

    if (!isset($GLOBALS['isPlainText'])) {
        $GLOBALS['isPlainText'] = false;
    }

    if (!isset($GLOBALS['DB_SIGS_TEMPLATE'])) {
        $GLOBALS['DB_SIGS_TEMPLATE'] = array();
    }

    if (!$GLOBALS['isPlainText']) {
        // Print the form
        echo '<form action="" method="post">';

        printMsg("\nSearch for:\t\t");
        echo '<input type="text" name="s" value="' . escapeHTML($trigger) .
            '" placeholder="&lt;div id=&quot;coolhacker&quot;&gt;" style="width:30%">';

        printMsg("\n\nClean the regex:\t");
        echo '<input type="text" name="regex" value="' . escapeHTML($action) .
            '" placeholder="~&lt;div id=&quot;coolhacker&quot;&gt;[^&lt;&gt;]*?&lt;/div&gt;~" style="width:60%">';

        printMsg(
            "\n(You can also use the following pre-defined templates: "
            . implode(', ', array_keys($GLOBALS['DB_SIGS_TEMPLATE'])) . ")\n"
        );

        echo '<input type="checkbox" name="clean" value="1" id="clean">';
        echo '<label for="clean" class="inserted" data-content="' . "Clean the malware (save the changes)\n" . '"></label>';
        echo "\n" . '<input type="submit" value="Search">' . "\n";
        echo '</form>';
    }

    if ($trigger === '') {
        if (isTerminal()) {
            do {
                $trigger = askFromCmdLine('Search for');
            } while ($trigger === '');
            $action = askFromCmdLine('Clean the regex');
        } else {
            echo $GLOBALS['isPlainText'] ? "Please use\n" . "s=trigger\n" .
                "regex=~regex~\n" . "clean    to save the changes\n" : '</pre>';
            exit;
        }
    }

    $_GET['investigation'] = '1';
    if (!isset($_POST['clean'])) {
        $_GET['noclean'] = '1';
    } elseif (skipCleanup()) {
        unset($_GET['noclean']);
    }

    if ($trigger[0] === PCRE_DELIM) {
        reportFatalError(PCRE_DELIM . ' is not allowed as the first character of the trigger');
    }

    if ($action === '') {
        return array(
            $trigger => array('custom.db.search', WARN)
        );
    }

    if (!isset($GLOBALS['DB_SIGS_TEMPLATE'][$action])) {
        if (PCRE_DELIM !== $action[0]) {
            reportFatalError('Invalid regex, please use ' . PCRE_DELIM . ' as the delimiter');
        }

        if (preg_match($action, '') === false) {
            reportFatalError('Invalid regex');
        }
    }

    return array(
        $trigger => array('custom.db.search', $action)
    );
}

/**
 * Modifies a global variable DB_SKIPPED_TABLES
 *
 * Function skips the scan over any table specified in a GET request.
 *
 * @param  array $tablesColumns List of tables with their columns.
 * @return void
 */
function readSkipTable($tablesColumns)
{
    $GLOBALS['DB_SKIPPED_TABLES'] = array();

    if (isset($_GET['skiptable'])) {
        $tables = explode(',', $_GET['skiptable']);

        foreach ($tables as $table) {
            $GLOBALS['DB_SKIPPED_TABLES'][$table] = false;
        }
    }

    if (isset($_GET['scantable'])) {
        $tables = explode(',', $_GET['scantable']);
        $tablesToScan = array();

        // Convert the array to a set (hash table)
        foreach ($tables as $table) {
            if (!isset($tablesColumns[$table])) {
                printMsg("\nWARN: Not found the table to scan: ", $table);
                continue;
            }

            $tablesToScan[$table] = true;
            if (isset($GLOBALS['DB_SKIPPED_TABLES'][$table])) {
                printMsg("\nWARN: The same table in scantable and skiptable: ", $table);
            }
        }

        // Invert the set
        foreach ($tablesColumns as $table => $columns) {
            if (!isset($tablesToScan[$table])) {
                $GLOBALS['DB_SKIPPED_TABLES'][$table] = false;
            }
        }
    }
}

/**
 * Determines wheter a table must be skipped or not.
 *
 * The function checks the global DB_SKIPPED_TABLES variable, if the specified
 * table exists in this array then it returns a boolean True meaning that the
 * table must be skipped during the scan.
 *
 * @param  string $table Name of the table.
 * @return bool          True if the table must be skipped.
 */
function shouldSkipTable($table)
{
    if (!isset($GLOBALS['DB_SIGS_TEMPLATE'])) {
        $GLOBALS['DB_SIGS_TEMPLATE'] = array();
    }

    if (!isset($GLOBALS['DB_SKIPPED_TABLES'][$table])) {
        return false;
    }

    // Print the name of the skipped table once
    if ($GLOBALS['DB_SKIPPED_TABLES'][$table] === false) {
        printMsg("\nINFO: Skipped table ", $table);
        $GLOBALS['DB_SKIPPED_TABLES'][$table] = true;
    }

    return true;
}

/**
 * Prints the name of the skipped tables.
 *
 * @return void
 */
function checkSkippedTables()
{
    if (!isset($GLOBALS['DB_SIGS_TEMPLATE'])) {
        $GLOBALS['DB_SIGS_TEMPLATE'] = array();
    }

    foreach ($GLOBALS['DB_SKIPPED_TABLES'] as $table => $found) {
        if ($found === false) {
            printMsg("\nWARN: Not found the table to skip: ", $table);
        }
    }
}

/**
 * Continues with a previously started scan.
 *
 * The function reads a file located in the quarantine folder which contains a
 * list of associative names corresponding to the tables in the database that
 * were not read during the last scan.
 *
 * @return void
 */
function startResume()
{
    if (!isset($_GET['resume'])) {
        return;
    }

    $GLOBALS['g_lastTable'] = false;
    $GLOBALS['g_lastColumn'] = false;

    $f = @fopen(QUARANTINE_FOLDER . DIRECTORY_SEPARATOR . RESUME_FILE_NAME, 'r');

    if (false !== $f) {
        $info = fread($f, 65536);

        if ($info === false || $info === '') {
            fclose($f);
            @unlink(QUARANTINE_FOLDER . DIRECTORY_SEPARATOR . RESUME_FILE_NAME);

            if ($info === false) {
                reportFatalError('Reading sucuridbresume failed');
            } else {
                reportFatalError('Resume failed; please run with &list and skip the largest tables');
            }
        }

        fclose($f);

        list($a, $b) = explode("\n", $info, 2);
        $GLOBALS['g_lastTable'] = $a;
        $GLOBALS['g_lastColumn'] = $b;
    }

    if (!createQuarantineFolder()) {
        reportFatalError('Create quarantine folder failed');
    }

    $GLOBALS['g_resumeHandle'] = @fopen(QUARANTINE_FOLDER . DIRECTORY_SEPARATOR . RESUME_FILE_NAME, 'w');

    if (false === $GLOBALS['g_resumeHandle']) {
        reportFatalError('Saving sucuridbresume failed; please check permissions');
    }
}

/**
 * Determine whether to skip or not a table.
 *
 * @param  string $table  Name of the table.
 * @param  string $column Name of the column.
 * @return bool           True if we need to skip the table.
 */
function shouldSkipForResume($table, $column)
{
    if (!isset($GLOBALS['g_lastTable'])) {
        $GLOBALS['g_lastTable'] = false;
    }

    if (!isset($GLOBALS['g_lastColumn'])) {
        $GLOBALS['g_lastColumn'] = '';
    }

    if (!isset($GLOBALS['g_resumeHandle'])) {
        $GLOBALS['g_resumeHandle'] = null;
    }

    if (!isset($_GET['resume'])) {
        return false;
    }

    if ($GLOBALS['g_lastTable'] === false) {
        /* support composite primary keys */
        if (is_array($column)) {
            $column = array_pop($column);
        }

        // Save the table/column that we started the check
        if (false === ftruncate($GLOBALS['g_resumeHandle'], 0)
            || 0 !== fseek($GLOBALS['g_resumeHandle'], 0, SEEK_SET)
            || false === fwrite($GLOBALS['g_resumeHandle'], $table . "\n" . $column)
        ) {
            reportFatalError('Writing sucuri-sss-resume failed');
        }

        return false; // we are not resuming now
    }

    // Skip until the last table/column
    if ($table !== $GLOBALS['g_lastTable'] || $column !== $GLOBALS['g_lastColumn']) {
        return true;
    }

    printMsg("\nINFO: Resuming from " . $table . '.' . $column . '...');

    $GLOBALS['g_lastTable'] = false;
    $GLOBALS['g_lastColumn'] = false;

    return false; // Recheck this column again (some messages may be repeated from the previous run)
}

/**
 * Closes and deletes the resume file.
 *
 * The file that keeps tracks of the scanning process and is used to resume the
 * scan during a sudden stop, is closed with this function and then discarded
 * as a normal system resource.
 *
 * @return void
 */
function finishResume()
{
    if (!isset($GLOBALS['g_resumeHandle'])) {
        $GLOBALS['g_resumeHandle'] = null;
    }

    if (!isset($_GET['resume'])) {
        return;
    }

    fclose($GLOBALS['g_resumeHandle']);

    if (!@unlink(QUARANTINE_FOLDER . DIRECTORY_SEPARATOR . RESUME_FILE_NAME)) {
        echo "ERROR: deleting resume failed\n";
    }

    if (file_exists(QUARANTINE_FOLDER . DIRECTORY_SEPARATOR . RESUME_RESULTS)) {
        echo "Run &resumeresults to see resume results.\n";
    }
}

/**
 * Displays resume results.
 *
 * @return void
 */
function resumeResults()
{
    if (file_exists(QUARANTINE_FOLDER . DIRECTORY_SEPARATOR . RESUME_RESULTS)) {
        echo "Resume results: \n" . file_get_contents(QUARANTINE_FOLDER . DIRECTORY_SEPARATOR . RESUME_RESULTS);
        if (!@unlink(QUARANTINE_FOLDER . DIRECTORY_SEPARATOR . RESUME_RESULTS)) {
            echo "ERROR: deleting resume results failed\n";
        }
    } else {
        echo "Resume results file does not exist.\n";
    }

    exit;
}

/**
 * Checks whether the script is executed in a Terminal or Web Browser.
 *
 * This function checks for the existence of the REMOTE_ADDR and SHELL keys in
 * the global SERVER variable, which can be used to detect if the file is being
 * loaded via a Terminal emulator or a Web Browser.
 *
 * @return bool True if the script is executed in a Terminal.
 */
function isTerminal()
{
    return !isset($_SERVER['REMOTE_ADDR']) && (
        isset($_SERVER['SHELL'])
        || isset($_SERVER['TERM'])
    );
}

/**
 * Returns the HTML code with the information about the table.
 *
 * @param  array  $location Table information.
 * @param  string $type     Either plaintext, link or insertedlink.
 * @param  array  $matches  RegExp result following PHP standards.
 * @param  string $text     Content of the configuration file.
 * @return string           HTML anchor to link to the file content.
 */
function getLocationHTML($location, $type, $matches = null, $text = null)
{
    $ret = escapeHTML($location['table']);

    if (isset($location['column'])) {
        $ret .= '.' . escapeHTML($location['column']);
    }

    // If id is not set (a table without primary key or a composite primary key), then we cannot display the link.
    // Even if $type == 'link', return the plain text version with table.column.
    if (!isset($location['idname'])) {
        return $ret;
    }

    $ret .= ', ' . escapeHTML($location['idname']) . ' = ' . escapeHTML($location['id']);

    if ($type === 'plaintext') {
        return $ret;
    }

    $pos = '';
    if (isset($matches[0][1])) {
        $matches[0][0] = str_replace("\r\n", "\n", $matches[0][0]);
        $text = str_replace("\r\n", "\n", substr($text, 0, $matches[0][1]));
        if (function_exists('mb_strlen')) {
            // Locate the character index in UTF-8 encoding
            $match_start = mb_strlen($text, 'UTF-8');
            $match_end = $match_start + mb_strlen($matches[0][0], 'UTF-8');
        } else {
            // Calculate the byte offset
            $match_start = strlen($text);
            $match_end = $match_start + strlen($matches[0][0]);
        }
        $pos = '&match_start=' . $match_start . '&match_end=' . $match_end;
    }

    if (isset($_GET['dir'])) {
        $pos = $pos . '&dir=' . $_GET['dir'];
    }
    $link = '<a href="?srun'
        . '&showcontent'
        . '&t=' . escapeHTML($location['table'])
        . (isset($location['column']) ? '&c=' . escapeHTML($location['column']) : '')
        . '&id_name=' . escapeHTML($location['idname'])
        . '&id=' . escapeHTML($location['id']) . $pos . '" target="_blank"';

    if ($type === 'insertedlink') {
        return '"></span>' . $link . ' class="inserted" data-content="' . $ret
            . '"></a>' . '<span class="inserted warn" data-content="';
    }

    if ($type === 'link') {
        return $link . '>' . $ret . '</a>';
    }

    reportFatalError('Invalid type ' . $type);
    return '';
}

/**
 * Prints a message to the web or terminal with a status code.
 *
 * @param  boolean $status  Either true for success or false for failures.
 * @param  string  $message Message to print, cut to 255 characters.
 * @return void
 */
function logMsg($status = false, $message = '')
{
    if (!isset($GLOBALS['isPlainText'])) {
        $GLOBALS['isPlainText'] = false;
    }

    $message = str_replace("\n", "\x20", $message);
    $limit = ($GLOBALS['isPlainText'] ? 255 : 130);

    if (strlen($message) > $limit) {
        $message = substr($message, 0, $limit) . "\xe2\x80\xa6";
    }

    /* success and terminal */
    if ($status && $GLOBALS['isPlainText']) {
        prush("\xe2\x9c\x94 " . $message . "\n");
        return;
    }

    /* success and no terminal */
    if ($status && !$GLOBALS['isPlainText']) {
        prush("&#x2714 " . $message . "\n");
        return;
    }

    /* failure and terminal */
    if (!$status && $GLOBALS['isPlainText']) {
        prush("\xe2\x9c\x98 " . $message . "\n");
        return;
    }

    /* failure and no terminal */
    if (!$status && !$GLOBALS['isPlainText']) {
        prush("&#x2718 " . $message . "\n");
        return;
    }
}

/**
 * Prints a message to the console or web page.
 *
 * If the script is being executed in a Terminal emulator then this function
 * will print the message and details associated to the message into the same
 * Terminal, otherwise it prints into whatever interface the script is running
 * on, which in most cases will be a web browser, in this case, the message will
 * be merged with some HTML code.
 *
 * @param  string $msg     Message to print.
 * @param  string $details Additional information for the message.
 * @return void
 */
function printMsg($msg, $details = '')
{
    if (!isset($GLOBALS['isPlainText'])) {
        $GLOBALS['isPlainText'] = false;
    }

    if ($GLOBALS['isPlainText']) {
        prush($msg . $details);
        return;
    }

    if (strncmp($msg, "\nWARN:", 6) === 0) {
        prush('<span class="inserted warn" data-content="' . escapeHTML($msg) . '"></span>');
        $msg = '';
    }

    prush('<span class="inserted" data-content="' . escapeHTML($msg . $details) . '"></span>');
}

/**
 * Prints information about an error occurred during the scan.
 *
 * @param  string $msg Message to be printed into the console.
 * @return void
 */
function reportFatalError($msg)
{
    if (!isset($GLOBALS['isPlainText'])) {
        $GLOBALS['isPlainText'] = false;
    }

    $msg = 'ERROR: ' . $msg;

    if ($GLOBALS['isPlainText']) {
        echo "\n" . $msg;
    } else {
        echo '<span class="inserted warn" data-content="' . escapeHTML("\n" . $msg) . '"></span></pre>';
    }

    exit(1);
}

/**
 * Prints an inserted link into the console.
 *
 * @param  string $tool Name of the script with the insertion.
 * @return void
 */
function printInsertedLink($tool)
{
    if (!isset($GLOBALS['isPlainText'])) {
        $GLOBALS['isPlainText'] = false;
    }

    if ($GLOBALS['isPlainText']) {
        echo $tool;
        return;
    }

    $url = '?srun&' . $tool;
    $msg = $tool === 's' ? 'search' : $tool;
    echo '<a href="' . $url . '" class="inserted" data-content="' . $msg . '"></a>';
}

/**
 * Prints the HTML code with the final status of the database scan.
 *
 * @param  string $status      Status of the database scan.
 * @param  string $afterStatus Message to complement the status information.
 * @return string              Status of the database scan in HTML code.
 */
function getStatusHtml($status, $afterStatus = '')
{
    if (!isset($GLOBALS['isPlainText'])) {
        $GLOBALS['isPlainText'] = false;
    }

    if ($GLOBALS['isPlainText']) {
        return "\n" . $status . ': ' . $afterStatus;
    }

    if ($status === 'ERROR' || $status === 'WARN') {
        return "\n" . '<span class="inserted warn" data-content="' .
                $status . ': ' . escapeHTML($afterStatus) . '"></span>' .
                '<span class="hidden-copied">CLEARED: Cleared malware from database (manual review)</span>';
    }

    return "\n" . '<span class="cleared">' . $status . ':</span> ' . escapeHTML($afterStatus);
}

/**
 * Returns the text (or HTML) of the signature found in the database.
 *
 * @param  string $status        Name of the cleanup result in uppercase.
 * @param  string $signatureName Name of the signature found in the database.
 * @param  array  $location      Info about the table where the malware is.
 * @param  string $matches       RegExp result following PHP standards.
 * @param  string $text          Text containing the signature.
 * @param  string $msg           Optional text to print in the result.
 * @return string                Text or HTML of the signature found in the database.
 */
function reportMalware($status, $signatureName, $location = null, $matches = null, $text = null, $msg = null)
{
    if (!isset($GLOBALS['foundMalware'])) {
        $GLOBALS['foundMalware'] = false;
    }

    if (!isset($GLOBALS['isPlainText'])) {
        $GLOBALS['isPlainText'] = false;
    }

    // Output research messages only in the investigation mode
    if ($status === 'RESEARCH' && !isset($_GET['investigation'])) {
        return '';
    }

    // Get location and content matched by the regex
    if ($status === 'WARN' || $status === 'CLEARED' && skipCleanup()) {
        $type = 'link';
    } elseif ($status === 'RESEARCH' || $status === 'ERROR') {
        $type = 'insertedlink';
    } else {
        $type = 'plaintext';
    }

    if ($GLOBALS['isPlainText']) {
        $type = 'plaintext';
    }

    $locationHTML = $location === null ? '' : ': ' . getLocationHTML($location, $type, $matches, $text);
    $msgHTML = $msg === null ? '' : ' - ' . escapeHTML($msg);
    $signatureHTML = '. Details: ' . escapeHTML($signatureName);
    $contentHTML = '';

    if ($matches !== null) {
        // Below PHP 4.3, PREG_OFFSET_CAPTURE is not supported and match text is returned in $matches[0]
        $matchText = is_array($matches[0]) ? $matches[0][0] : $matches[0];
        $maxLen = isset($_GET['s']) ? 500 : 50;

        $content = substr($matchText, 0, $maxLen);
        if (strlen($matchText) > $maxLen) {
            $content = substr($matchText, 0, $maxLen - 10) . '...' . substr($matchText, -7);
        }
        $contentHTML = '. Content: ' . escapeHTML(preg_replace('/[\x00-\x1F\x7F]/', '`', $content));
        if ($status !== 'RESEARCH' && $status !== 'ERROR' && !$GLOBALS['isPlainText']) {
            // Hide the content from user to avoid disclosing our signatures
            $contentHTML = '<span class="inserted" data-content="' . $contentHTML . '"></span>';
        }
    }

    if ($status === 'CLEARED' || $status === 'FOUND') {
        if (skipCleanup() || $status === 'FOUND') {
            $statusHTML = getStatusHtml('FOUND', 'Found malware to clean');
        } elseif (!isset($location['idname'])) {
            $statusHTML = getStatusHtml('ERROR', 'Not cleaned (no primary key or a composite primary key)');
        } else {
            $statusHTML = getStatusHtml('CLEARED', 'Cleared malware from database');
        }
    } elseif ($status === 'OK') {
        // Omit the word "Details:"; print action message instead of the signature name
        $statusHTML = getStatusHtml('OK', $signatureName);
        $signatureHTML = '';
    } elseif ($status === 'WARN') {
        // Manual review is required
        $after = isset($location['idname']) ? 'Please review' : 'No primary key or a composite primary key';
        $statusHTML = getStatusHtml('WARN', $after);
    } elseif ($GLOBALS['isPlainText']) {
        $statusHTML = "\n" . $status; // RESEARCH, ERROR
    } else {
        // RESEARCH, ERROR - should not be sent to user
        $statusHTML = '<span class="inserted warn" data-content="' . "\n" . $status;
        $msgHTML .= '"></span>';
    }

    if (isset($_GET['resume'])) {
        $resume_file = @fopen(QUARANTINE_FOLDER . DIRECTORY_SEPARATOR . RESUME_RESULTS, 'a+');
        if (false !== $resume_file) {
            fwrite($resume_file, $statusHTML . $locationHTML . $signatureHTML);
        } else {
            echo "Could not write to resume results file.\n";
        }
    }

    $GLOBALS['foundMalware'] = true;
    return $statusHTML . $locationHTML . $signatureHTML . $contentHTML . $msgHTML;
}

/**
 * Checks if the table or column is whitelisted.
 *
 * @param  array $location  Table information.
 * @param  array $whitelist List of whitelisted tables.
 * @return bool             True if the table or column is whitelisted.
 */
function checkWhitelist($location, $whitelist)
{
    if (!isset($GLOBALS['config'])) {
        $GLOBALS['config'] = array('prefix' => '');
    }

    // Prepare for comparison with the whitelist. WordPress/Joomla prefix is written as <PREFIX>;
    // column name can follow after a dot.
    $table = $location['table'];
    if (!empty($GLOBALS['config']['prefix']) && strncmp($table, $GLOBALS['config']['prefix'], strlen($GLOBALS['config']['prefix'])) === 0) {
        $table = '<PREFIX>' . substr($table, strlen($GLOBALS['config']['prefix']));
    }

    // Lookup in the whitelist
    return isset($whitelist[$table]) || isset($whitelist[$table . '.' . $location['column']]) || isset($whitelist[$table . '.' . $location['id']]);
}

/**
 * Checks if whitelisted string appears in the scanned buffer.
 *
 * @param  string $signature  Signature name.
 * @param  string $buffer Scanned buffer.
 * @return bool True if the table or column is whitelisted.
 */
function checkStrWhitelist($signature, $buffer)
{
    global $WHITELIST_STRINGS;

    if (array_key_exists($signature, $WHITELIST_STRINGS)) {

        foreach ($WHITELIST_STRINGS[$signature] as $white_string) {
            if (strpos($buffer, $white_string) !== false) {
                return true;
            }
        }
    }

    else return false;
}


/**
 * Reverts the escaping applied to a string.
 *
 * @param  string $str    Text to remove the escaping.
 * @param  int    $nChars Number of characters to revert.
 * @return array          Array representation of the string.
 */
function unescapeString($str, $nChars)
{
    $inputLen = 0;
    $out = '';
    for ($i = 0; $i < $nChars; $i++) {
        if (!isset($str[$inputLen])) {
            return array(0, false); // Invalid string length
        }

        if ($str[$inputLen] !== '\\') {
            $out .= $str[$inputLen];
            $inputLen++;
            continue;
        }

        $hex = substr($str, $inputLen + 1, 2);
        if (!ctype_xdigit($hex)) {
            return array(0, false); // Invalid hex char
        }
        $out .= pack("H*", $hex);
        $inputLen += 3;
    }
    return array($inputLen, $out);
}

/**
 * Replaces content in a serialized object.
 *
 * Avoid the use of the built-in PHP unserialize function as it is vulnerable on
 * old PHP versions. Do a custom parsing function, replace inside the serialized
 * strings, and correct the string lengths.
 *
 * @param  string $pattern    Regular expression to change.
 * @param  string $serialized Serialized object as a string.
 * @param  bool   $isRegEx    True if pattern is a regexp, false for string.
 * @return array              Two-index length array with new serialized data.
 */
function replaceInSerialized($pattern, $serialized, $isRegEx)
{
    $valueToSkipRe = '/^(?:
        N; | b:[01];                     # null, Boolean
        | [rR] : [0-9]+;                 # references
        | [id] : [+-]? [0-9]+;           # an integer (as integer or double type)
        |   d  : [+-]? [0-9]* \\. [0-9]+ (?: [eE] [+-]? [0-9]+ )?;  # a floating point number (double)
        ) /x';
    $strRe = '/^ (?P<type> [sS]) : (?P<len> [0-9]+) : "/x';
    $compoundRe = '/^ (?:
          a : (?P<count> [0-9]+) : \\{
        | (?P<type> [OC]) : (?P<namelen> [0-9]+) : "(?P<name> [^"]+)" : (?P<clen> [0-9]+) : \\{
        ) /x';

    if (preg_match($valueToSkipRe, $serialized, $m)) {
        return array(strlen($m[0]), $m[0]);
    }

    if (preg_match($strRe, $serialized, $m)) {
        if ($m['type'] === 'S') {
            list($inputLen, $str) = unescapeString(substr($serialized, strlen($m[0])), $m['len']);
            if ($str === false) {
                return array(0, false);
            }
            $inputLen += strlen($m[0]);
        } else {
            $str = substr($serialized, strlen($m[0]), $m['len']);
            $inputLen = strlen($m[0]) + $m['len'];
        }

        if (substr($serialized, $inputLen, 2) !== '";') {
            return array(0, false);
        }

        $str = $isRegEx ? preg_replace($pattern, '', $str) : str_replace($pattern, '', $str);

        return array($inputLen + 2, 's:' . strlen($str) . ':"' . $str . '";');
    }

    if (preg_match($compoundRe, $serialized, $m)) {
        if (isset($m['namelen']) && intval($m['namelen']) !== strlen($m['name'])) {
            return array(0, false);
        }

        if (isset($m['type']) && $m['type'] === 'C') {
            // Custom serialization format, skip it (no search-and-replace)
            $inputLen = strlen($m[0]) + $m['clen'];
            if (substr($serialized, $inputLen, 1) !== '}') { // substr silently returns false if out of bounds
                return array(0, false);
            }
            return array($inputLen + 1, substr($serialized, 0, $inputLen + 1));
        }

        $out = $m[0];
        $inputPos = strlen($m[0]);
        $count = $m['count'] === '' ? $m['clen'] : $m['count'];

        for ($i = 0; $i < $count; $i++) {
            if ($m['count'] === '') { // Object - don't replace in the variable name
                list($len, $replaced) = replaceInSerialized('', substr($serialized, $inputPos), false);
            } else { // Array - replace in the index
                list($len, $replaced) = replaceInSerialized($pattern, substr($serialized, $inputPos), $isRegEx);
            }
            if ($replaced === false) {
                return array(0, false);
            }
            $inputPos += $len;
            $out .= $replaced;

            // Always replace in the value
            list($len, $replaced) = replaceInSerialized($pattern, substr($serialized, $inputPos), $isRegEx);
            if ($replaced === false) {
                return array(0, false);
            }
            $inputPos += $len;
            $out .= $replaced;
        }

        if (substr($serialized, $inputPos, 1) !== '}') {
            return array(0, false);
        }

        return array($inputPos + 1, $out . '}');
    }

    return array(0, false);
}

/**
 * Returns a clean version of a string.
 *
 * @param  string $pattern Expression to locate the malicious text.
 * @param  string $text    Text containing the malicious payload.
 * @param  bool   $isRegex Whether pattern is a regexp or a string.
 * @return string          Clean version of the text.
 */
function doCleanup($pattern, $text, $isRegex)
{
    // Quick check: if it's a serialized object/array/string
    if (isset($text[1]) && $text[1] !== ':') {
        return $isRegex ? preg_replace($pattern, '', $text) : str_replace($pattern, '', $text);
    }

    list($pos, $replaced) = replaceInSerialized($pattern, $text, $isRegex);

    if ($replaced === false || $pos !== strlen($text)) {
        // Not a valid serialized data; do a usual textual search-and-replace
        return $isRegex ? preg_replace($pattern, '', $text) : str_replace($pattern, '', $text);
    }

    return $replaced;
}

/**
 * Walks through all the signatures and removes the malicious payload.
 *
 * Look for the signatures in the text and remove the malware. Table and column
 * are used for whitelisting. Function returns NULL if no malware was cleaned.
 *
 * @param  string $text       Text containing the malicious payload.
 * @param  array  $signatures Regular expressions to match the malicious code.
 * @param  array  $location   Information about the table.
 * @return array              Clean version of the text.
 */
function clearMalwareFromText($text, $signatures, $location)
{
    global $WHITELIST_TABS;

    if (!isset($GLOBALS['DB_SIGS_TEMPLATE'])) {
        $GLOBALS['DB_SIGS_TEMPLATE'] = array();
    }

    if (!isset($GLOBALS['DB_NOCLEAN_FOR_ROBOT'])) {
        $GLOBALS['DB_NOCLEAN_FOR_ROBOT'] = array();
    }

    $out = '';
    $replaced = false;

    foreach ($signatures as $trigger => $sigArray) {
        if ($sigArray === NESTED) {
            continue;
        }

        // Check the trigger (regular expression or plain text search)
        $matches = null;
        if ($trigger[0] === PCRE_DELIM) {
            if (!preg_match($trigger, $text, $matches, PREG_OFFSET_CAPTURE)) {
                continue;
            }
        } elseif ($trigger[0] !== POSIX_DELIM || substr($trigger, -1) !== POSIX_DELIM) {
            $pos = strpos($text, $trigger);
            if ($pos === false) {
                continue;
            }
            $matches = array(array($trigger, $pos));
        }

        if ($sigArray[CI_NAME] === NESTED) {
            list($newText, $newOut) = clearMalwareFromText($text, $sigArray, $location);
            if ($newText !== null) {
                $text = $newText;
                $replaced = true;
            }
            $out .= $newOut;
            continue;
        }

        // Check the general tab/column whitelist
        if (checkWhitelist($location, $WHITELIST_TABS)) {
            $out .= reportMalware('RESEARCH', $sigArray[CI_NAME], $location, $matches, $text, 'Whitelisted location');
            continue;
        }

        // Check the sig->location whitelist
        if (isset($sigArray[CI_WHITELIST]) && checkWhitelist($location, $sigArray[CI_WHITELIST])) {
            $out .= reportMalware('RESEARCH', $sigArray[CI_NAME], $location, $matches, $text, 'Whitelisted');
            continue;
        }

        // Check the string whitelist
        if (checkStrWhitelist($sigArray[CI_NAME], $text)) {
            $out .= reportMalware('RESEARCH', $sigArray[CI_NAME], $location, $matches, $text, 'Whitelisted');
            continue;
        }

        // Do the action
        $action = isset($sigArray[CI_ACTION]) ? $sigArray[CI_ACTION] : WARN;
        if ($action === WARN) {
            $out .= reportMalware('WARN', $sigArray[CI_NAME], $location, $matches, $text);
        } elseif ($action === CLEAR_THIS) {
            $out .= reportMalware('CLEARED', $sigArray[CI_NAME], $location, $matches, $text);
            $text = doCleanup($trigger, $text, false);
            $replaced = true;
        } else {
            if (isset($GLOBALS['DB_SIGS_TEMPLATE'][$action])) {
                $action = str_replace('<TRIGGER>', preg_quote($trigger), $GLOBALS['DB_SIGS_TEMPLATE'][$action]);
            }
            if (!preg_match($action, $text, $matches, PREG_OFFSET_CAPTURE)) { // Fill the matches
                $msg = 'Trigger found; regex not found';
                $out .= reportMalware('RESEARCH', $sigArray[CI_NAME], $location, null, $text, $msg);
                continue;
            }

            $status = 'FOUND';
            if (!isset($_GET['robot']) || !isset($GLOBALS['DB_NOCLEAN_FOR_ROBOT'][$sigArray[CI_NAME]])) {
                $text = doCleanup($action, $text, true); // Do the actual cleanup
                $status = 'CLEARED';
                $replaced = true;
            }
            $out .= reportMalware($status, $sigArray[CI_NAME], $location, $matches, $text);
        }
    }

    return $replaced ? array($text, $out) : array(null, $out);
}

/**
 * Escapes the LIKE keyword in an SQL statement.
 *
 * @param  string $trigger SQL statement to be escaped.
 * @return string          Clean version of the SQL statement.
 */
function escapeLike($trigger)
{
    return str_replace(array('$', '%', '_'), array('$$', '$%', '$_'), $trigger);
}

/**
 * Prepares the WHERE conditions with triggers.
 *
 * Later we will insert table and column names there.
 *
 * @param  MySQLIDriver $driver        Database connection.
 * @param  array        $signatures    List of signatures to search.
 * @param  int          $maxConditions Maximum number of conditions.
 * @return array                       List of WHERE SQL statements.
 */
function prepareConditions($driver, $signatures, $maxConditions)
{
    $i = 0;
    $j = 0;
    $conditionSets = array(array(' WHERE '));
    $signatureSet = array();

    foreach ($signatures as $trigger => $nested) {
        if ($j !== 0) {
            // Add OR to the previous condition
            $conditionSets[$i][$j] .= ' OR ';
        }

        if ($trigger[0] === POSIX_DELIM && substr($trigger, -1) === POSIX_DELIM) {
            array_push($conditionSets[$i], ' REGEXP ' . $driver->escapeStr(substr($trigger, 1, -1)));
        } else {
            array_push($conditionSets[$i], ' LIKE ' . $driver->escapeStr('%' . escapeLike($trigger) . '%') . " ESCAPE '$'");
        }
        $j++;
        $signatureSet[$trigger] = $nested;

        if ($j >= $maxConditions) {
            // End the WHERE statement here and start another one
            array_push($conditionSets[$i], $signatureSet);
            $signatureSet = array();

            array_push($conditionSets, array(' WHERE '));
            $i++;
            $j = 0;
        }
    }

    // Delete the extra WHERE statement
    if ($j === 0) {
        array_pop($conditionSets);
    } else {
        array_push($conditionSets[$i], $signatureSet);
    }

    return $conditionSets;
}

/**
 * Locates the infected table entries and executes the cleaners.
 *
 * @param  MySQLIDriver $driver        Database connection.
 * @param  array        $tablesColumns List of tables with their columns.
 * @param  array        $signatures    Regular expressions to match the malicious code.
 * @return void
 */
function searchAndClear($driver, $tablesColumns, $signatures)
{
    global $config;

    // Break signatures into sets (20 triggers in each set)
    $conditionSets = prepareConditions($driver, $signatures, 20);
    $location = array();
    /**
     * By default the "Search & Replace" tool executes the malware cleanup
     * against the database once the infection is found. However, if the analyst
     * wants to see the infection before its cleaned they can send an additional
     * parameter via GET named "s" (in lowercase) to execute the search alone.
     *
     * @option s Sets the action to be executed, in this case "search".
     */
    $action = isset($_GET['s']) ? 'search' : 'cleanup';
    foreach ($tablesColumns as $table => $columns) {
        if (shouldSkipTable($table)) {
            continue;
        }

        // Remember location in the associative array

        $location['table'] = $table;
        $escapedId = '';
        if (isset($columns['idname'])) {
            $location['idname'] = $columns['idname'];
            $escapedId = ',' . $driver->escapeName($columns['idname']);
        } else {
            unset($location['idname']);
            unset($location['id']);
        }

        $escapedTable = $driver->escapeName($table);
        foreach ($columns as $i => $column) {
            if ($i === 'idname' || shouldSkipForResume($table, $column)) {
                continue;
            }

            if (is_array($column)) {
                /* skip composite keys; not necessary */
                /* idnames => [option_id, option_name] */
                continue;
            }

            $location['column'] = $column;
            $escapedColumn = $driver->escapeName($location['column']);

            // Run cleanup for each set

            foreach ($conditionSets as $conditions) {
                $signaturesSet = array_pop($conditions);

                // Set Scan Restrictions on rows that meet specific criteria, I.E trashed posts.

                $rowRestrictions = false;
                $rowConditions = "";
                if ($config['cms'] === 'WordPress'){
                    if (!isset($_GET['scantrash'])) {
                        if ($escapedTable == '"' . $GLOBALS['config']['prefix'] . 'posts"') {
                            $rowRestrictions = true;
                            $rowConditions = ' "post_status" LIKE \'%trash%\' ';
                        }

                        // Modify our WHERE statement if row restriction criteria have been met
                        if ($rowRestrictions) {
                            // Include ANY post NOT IN trash
                            $whereReplacement = ' WHERE ' . substr($escapedId, 1) . ' NOT IN (SELECT "ID" FROM ' . $escapedTable . ' WHERE ' . $rowConditions . ' ) AND ( ';
                            $conditions[0] = $whereReplacement;
                        }
                    } else {
                        if ($rowRestrictions) {
                            // Include ONLY posts IN trash
                            $whereReplacement = ' WHERE ' . substr($escapedId, 1) . ' IN (SELECT "ID" FROM ' . $escapedTable . ' WHERE ' . $rowConditions . ' ) AND ( ';
                            $conditions[0] = $whereReplacement;
                        }
                    }
                }

                // Search for the triggers using the previously prepared conditions

                $sql = 'SELECT ' . $escapedColumn . $escapedId . ' FROM ' . $escapedTable . implode($escapedColumn, $conditions);
                if ($rowRestrictions) {
                    $sql .= ");";
                } else {
                    $sql .= ";";
                }

                clearMalwareFromDb($driver, $location, $sql, $signaturesSet, $action);
            }
        }
    }
}

/**
 * Searches a signature in the database and clears the malicious code.
 *
 * @param  MySQLIDriver $driver     Database connection.
 * @param  array        $location   Information about the table.
 * @param  string       $sql        SQL statement to execute in the database.
 * @param  array        $signatures Malware identifiers to search and clear.
 * @param  string       $action     Name of the action to be executed.
 * @return void
 */
function clearMalwareFromDb($driver, $location, $sql, $signatures, $action)
{
    /**
     * To allow the security analyst to monitor the process followed by any of
     * the implemented features in the cleanup script, the script itself will
     * allow them to activate the verbose mode which will start printing labals
     * marking every step followed by each action.
     *
     * @option noise Prints information about what is currently happening.
     */
    if (isset($_GET['noise'])) {
        printMsg("\nSearching " . $location['table'] . '.' . $location['column'] . '...');
    }

    $result = $driver->query($sql);

    // If any trigger was found, try to find the triggers in the column text
    while ($row = $driver->fetchRow($result)) {
        if (isset($location['idname'])) {
            $location['id'] = $row[1];
        }
        list($cleared, $out) = clearMalwareFromText($row[0], $signatures, $location);

        if ($cleared !== null
            && !showUpdateDbError(updateDb($driver, $cleared, $row[0], $location, $action))
        ) {
            // Instead of CLEARED message, prepare the FOUND message
            list($cleared, $out) = clearMalwareFromText($row[0], $signatures, $location);
        }

        if ($out) {
            prush($out);
        }
    }
}

/**
 * Deletes entries from a database table.
 *
 * @param  MySQLIDriver $driver        Database connection.
 * @param  array        $tablesColumns List of tables with their columns.
 * @param  array        $config        Application configuration.
 * @return void
 */
function deleteRows($driver, $tablesColumns, $config)
{
    if (!isset($GLOBALS['DB_ROWS_TO_DELETE'])) {
        $GLOBALS['DB_ROWS_TO_DELETE'] = array();
    }

    if (!isset($GLOBALS['DB_ROWS_TO_DELETE'][$config['cms']])) {
        return;
    }

    $rules = $GLOBALS['DB_ROWS_TO_DELETE'][$config['cms']];

    foreach ($rules as $tableColumn => $values) {
        list($table, $column) = explode('.', $tableColumn, 2);

        if (strncmp($table, '<PREFIX>', strlen('<PREFIX>')) === 0) {
            $table = $config['prefix'] . substr($table, strlen('<PREFIX>'));
        }

        if (!isset($tablesColumns[$table])) {
            printMsg(
                "\nINFO: Table " . $table . " not found for CMS " . $config['cms'] .
                ', prefix ' . (empty($config['prefix']) ? 'not detected' : $config['prefix'])
            );
            continue;
        }

        if (shouldSkipTable($table)) {
            continue;
        }

        $location = array('table' => $table, 'idname' => $column);

        $vals = array();
        $col = $driver->escapeName($column) . ' LIKE ';
        foreach ($values as $value) {
            $vals[] = $col . $driver->escapeStr($value) . " ESCAPE '$'";
        }
        $vals = implode(' OR ', $vals);

        list($err, $out) = deleteRowsFromDb($driver, $location, $vals);

        if (!showUpdateDbError($err)) {
            // Instead of the "Removed row" message, prepare the "Found malicious row" message
            list($err, $out) = deleteRowsFromDb($driver, $location, $vals);
        }

        if ($out) {
            prush($out);
        }
    }
}

/**
 * Detects and reports or clears suspicious and malicious users from a DB
 *
 * @param  MySQLIDriver $driver        Database connection.
 * @param  array        $tablesColumns List of tables with their columns.
 * @param  array        $config        Application configuration.
 * @return void
 */
function checkDBUsers($driver, $tablesColumns, $config)
{

    if (!isset($GLOBALS['DB_USER_SIGNATURES'])) {
        $GLOBALS['DB_USER_SIGNATURES'] = array();
    }

    if (!isset($GLOBALS['DB_USER_SIGNATURES'][$config['cms']])) {
        return;
    }

    $signatures = $GLOBALS['DB_USER_SIGNATURES'][$config['cms']];

    foreach ($signatures as $signature => $value) {
        $table = $value[1];

        if (strncmp($table, '<PREFIX>', strlen('<PREFIX>')) === 0) {
            $table = $config['prefix'] . substr($table, strlen('<PREFIX>'));
        }

        if (!isset($tablesColumns[$table])) {
            printMsg(
                "\nINFO: Table " . $table . " not found for CMS " . $config['cms'] .
                ', prefix ' . (empty($config['prefix']) ? 'not detected' : $config['prefix'])
            );
            continue;
        }

        if (shouldSkipTable($table)) {
            continue;
        }

        $location = array('table' => $table, 'sig' => $signature, 'idname' => 'ID');
        $location['sigtype'] = $value[0];
        $match_regex = $value[2];

        list($err, $out) = deleteRowsFromDb($driver, $location, $match_regex);

        if (!showUpdateDbError($err)) {
            // Instead of the "Removed row" message, prepare the "Found malicious row" message
            list($err, $out) = deleteRowsFromDb($driver, $location, $match_regex);
        }

        if ($out) {
            prush($out);
        }

    }
}

/**
 * Checks the default role for new users in WordPress.
 *
 * If the website is based on WordPress, this function reads the options table
 * and checks whether the default role for new user accounts is different than
 * "subscriber" in which case will print a warning for the security analyze to
 * investigate.
 *
 * @param  MySQLIDriver $driver        Database connection.
 * @param  array        $tablesColumns List of tables with their columns.
 * @param  array        $config        Application configuration.
 * @return void
 */
function checkWPDefaultUserRole($driver, $tablesColumns, $config)
{
    if ('WordPress' !== $config['cms']) {
        return;
    }

    $table = $config['prefix'] . 'options';

    if (!isset($tablesColumns[$table])) {
        printMsg("\nWARN: Table " . $table . " not found for WordPress");
        return;
    }

    if (shouldSkipTable($table)) {
        return;
    }

    $res = $driver->query(
        'SELECT "option_value" FROM ' . $driver->escapeName($table) .
        ' WHERE "option_name" = \'default_role\' AND "option_value" <> \'subscriber\';'
    );

    $row = $driver->fetchRow($res);
    if ($row) {
        printMsg(
            "\nWARN: Default WordPress user role set to '" . $row[0] . "'",
            " instead of 'subscriber' in table " . $table .
            ', please notify the client to change this for security reasons.'
        );
    }
}

/**
 * Checks if the site_url was tampered in WordPress.
 *
 * If the website is based on WordPress, this function reads the options table
 * and checks whether the site_url value is different than the URI we are running
 * cleanup from in which case will print a warning for the security analyze to
 * investigate.
 *
 * @param  MySQLIDriver $driver        Database connection.
 * @param  array        $tablesColumns List of tables with their columns.
 * @param  array        $config        Application configuration.
 * @return void
 */
function checkWPSiteURL($driver, $tablesColumns, $config)
{
    if ('WordPress' !== $config['cms']) {
        return;
    }
    if (isTerminal()) {
        return;
    }

    $table = $config['prefix'] . 'options';

    if (!isset($tablesColumns[$table])) {
        printMsg("\nWARN: Table " . $table . " not found for WordPress");
        return;
    }

    if (shouldSkipTable($table)) {
        return;
    }
    $siteURL = $_SERVER['HTTP_HOST'];
    $res = $driver->query(
        'SELECT "option_value" FROM ' . $driver->escapeName($table) .
        ' WHERE "option_name" = \'siteurl\' AND "option_value" NOT LIKE \'%'.$siteURL.'%\';'
    );

    $row = $driver->fetchRow($res);
    if ($row) {
        printMsg(
            "\nWARN: WordPress siteurl value was changed to '" . $row[0] . "'",
            " instead of: \"". $siteURL ."\"" .
            "\nThis may be a sign of compromise. Correct value should be checked with the client."
        );
        echo ("<br>Review <a href=?srun&showcontent&t=" . $table . "&c=option_value&id_name=option_name&id=siteurl>SiteUrl</a> ".
        "manually. (This record may not exist in old and differ in multisite WP installations.)");
    }

    $res = $driver->query(
        'SELECT "option_value" FROM ' . $driver->escapeName($table) .
        ' WHERE "option_name" = \'home\' AND "option_value" NOT LIKE \'%'.$siteURL.'%\';'
    );

    $row = $driver->fetchRow($res);
    if ($row) {
        printMsg(
            "\nWARN: WordPress home value was changed to '" . $row[0] . "'",
            " instead of: \"". $siteURL ."\"" .
            "\nThis may be a sign of compromise. Correct value should be checked with the client."
        );
        echo ("<br>Review <a href=?srun&showcontent&t=" . $table . "&c=option_value&id_name=option_name&id=home>Home" .
        "</a> manually. (This record may not exist in old and differ in multisite WP installations.");
    }


}

/**
 * Checks if triggers are present in the database
 * and presents a message with a URL to list them.
 * @param  MySQLIDriver $driver        Database connection.
 */
function checkTriggers($driver)
{
    if (isTerminal()) {
        return;
    }
    $res = $driver->query(
        'show triggers'
    );
    $row = $driver->fetchRow($res);
    if ($row) {
        printMsg(
            "\n\n Triggers have been detected on the database. Please check them to ensure they are innocent here:"
        );
        printInsertedLink ('listTriggers');
    }
}

/**
 * lists triggers present in the database if any.
 * @param  MySQLIDriver $driver        Database connection.
 */
function listTriggers($driver)
{
    if (isTerminal()) {
        return;
    }
    $res = $driver->query(
        'show triggers'
    );
     printMsg(
            "\n\n Please note that the important field here is the 'Statement' field which is the actual query\n".
            "\n Here's some description about the notable fields you will see:".
            "\n [Trigger] --> Name of the trigger".
            "\n [Event] --> What action will trigger this".
            "\n [Table] --> In what table this ocurrs".
            "\n [Statement] --> The query that is run".
            "\n [Timing] --> Wether this ocurrs before or after what triggered this \n\n"
        );
        echo ('<hr>');

    while ($row = $driver->fetchAssoc($res)) {
        if ($row) {
            print_r($row);
        }
    }
}

/**
 * Determines if errors must be printed or not.
 *
 * @param  bool $updateRes Whether there are messages or not.
 * @return bool            Whether to print messages or not.
 */
function showUpdateDbError($updateRes)
{
    if (!isset($GLOBALS['updateErrMessages'])) {
        $GLOBALS['updateErrMessages'] = array();
    }

    if (!isset($GLOBALS['isPlainText'])) {
        $GLOBALS['isPlainText'] = false;
    }

    if (!is_int($updateRes) || !isset($GLOBALS['updateErrMessages'][$updateRes])) {
        return true;
    }

    if ($GLOBALS['isPlainText']) {
        echo "\n" . $GLOBALS['updateErrMessages'][$updateRes];
    } else {
        echo "\n" . '<span class="warn">' . $GLOBALS['updateErrMessages'][$updateRes] . '</span>';
    }

    // If the DB update fails, continue looking for malware in read-only mode
    $_GET['noclean'] = 1;
    return false;
}

/**
 * Append a database backup into the same file.
 *
 * @param  string $backupFilename Location of the backup file.
 * @param  string $backup         Additional data to backup.
 * @return bool                   Whether the operation succeeded or not.
 */
function addToBackup($backupFilename, $backup)
{
    $fh = @fopen($backupFilename, "ab");
    if (false === $fh) {
        return false;
    }

    if (fseek($fh, 0, SEEK_END) !== 0) {
        return false;
    }

    $size = ftell($fh);
    if ($size === 0) {
        $backup = BACKUP_COMMENT . "\n" . $backup;
    }

    $res = false !== fwrite($fh, encrypt($backup, SUCURI_KEY, $size));

    fclose($fh);
    return $res;
}

/**
 * Changes the value in a table row in the database.
 *
 * This function also creates a backup of the original content.
 *
 * @param  MySQLIDriver $driver        Database connection.
 * @param  string       $cleared       Clean version of the table row.
 * @param  string       $previousValue Original content of the table row.
 * @param  array        $location      Information about the table.
 * @param  string       $action        Name of the action to be executed.
 * @return bool                        Whether the operation succeeded or not.
 */
function updateDb($driver, $cleared, $previousValue, $location, $action)
{
    if (skipCleanup() || !isset($location['idname'])) {
        return true;
    }

    $backupFilename = getBackupFilename($action, $location['table']);

    if ($backupFilename === false) {
        return UPDATE_ERR_BACKUP_DIR;
    }

    // Prepare the SQL statements
    $update = 'UPDATE ' . $driver->escapeName($location['table']) . ' SET ' .
        $driver->escapeName($location['column']) . ' = ';

    $where = ' WHERE ' . $driver->escapeName($location['idname']) . ' = ' .
        $driver->escapeStr($location['id']) . ' AND ' .
        $driver->escapeName($location['column']) . ' = ';

    // Encrypt the backup and save it in that folder
    $backup = $update . $driver->escapeStr($previousValue) . $where .
        $driver->escapeStr($cleared) . ";\n\n";

    if (!addToBackup($backupFilename, $backup)) {
        return UPDATE_ERR_BACKUP_FILE;
    }

    // Change the column value in the database only when we have the backup
    $driver->query($update . $driver->escapeStr($cleared) . $where . $driver->escapeStr($previousValue) . ';');

    if ($driver->getAffectedRows() !== 1) {
        return UPDATE_ERR_CHANGED;
    }

    return true;
}

/**
 * Starts a transaction to delete some entries in the database.
 *
 * @param  MySQLIDriver $driver   Database connection.
 * @param  array        $location Information about the table.
 * @param  string       $where    Condition for the SQL statement.
 * @return array                  Result of the operation.
 */
function deleteRowsFromDb($driver, $location, $where)
{
    $fromWhere = ' FROM ' . $driver->escapeName($location['table']) . ' WHERE ' . $where . ";\n\n";

    $driver->begin();

    // Select the malicious rows and backup them
    $res = $driver->query('SELECT * ' . $fromWhere);
    list($columns, $types) = $driver->getColumnNamesTypes($location['table']);
    $values = array();
    $out = '';
    $warnOnly = false;

    if (isset($location['sigtype'])) {
        $warnOnly = $location['sigtype'] === USER_WARN;
        $msg = (skipCleanup() || $warnOnly) ? 'Found malicious DB user: ' : 'Removed malicious DB user: ';
        $msg .= $location['sig'];
    } else {
        $msg = skipCleanup() ? 'Found malicious row' : 'Removed row';
    }

    while ($row = $driver->fetchRow($res)) {
        $values[] = '(' . $driver->exportRow($row, $types) . ')';

        $location['id'] = $row[array_search($location['idname'], $columns)];
        $msgRow = $msg;
        if (isset($location['sigtype']) && array_search('user_login', $columns) !== false) {
            $msgRow .= ': ' . $row[array_search('user_login', $columns)];
        }
        $out .= reportMalware($warnOnly ? 'WARN' : 'CLEARED', $msgRow, $location);
    }

    /**
     * Prints the status of the infection and skips the cleanup.
     *
     * @option noclean Disables the cleanup of the malicious data.
     */
    if (count($values) === 0 || skipCleanup() || $warnOnly) {
        // No malware was found or cleanup is disabled
        $driver->rollback();
        return array(true, $out);
    }

    $total = count($columns);
    for ($i = 0; $i < $total; $i++) {
        $columns[$i] = $driver->escapeName($columns[$i]);
    }

    $backup = '';
    foreach ($values as $value) {
        $backup .= 'INSERT INTO ' . $driver->escapeName($location['table'])
            . ' (' . implode(', ', $columns) . ') VALUES ' . $value
            . ";\n\n";
    }

    $backupFilename = getBackupFilename('deleterows', $location['table']);
    if ($backupFilename === false) {
        $driver->rollback();
        return array(UPDATE_ERR_BACKUP_DIR, $out);
    }

    // Save the backup
    if (!addToBackup($backupFilename, $backup)) {
        $driver->rollback();
        return array(UPDATE_ERR_BACKUP_FILE, $out);
    }

    // Delete the rows
    $driver->query('DELETE ' . $fromWhere);
    $driver->commit();
    return array(true, $out);
}

/**
 * Returns information about the table from an SQL statement.
 *
 * @param  string $sql SQL statement that will be parsed.
 * @return array|null  Information about the table.
 */
function getLocationFromSql($sql)
{
    // Escaped names and values are not handled correctly by these regular expressions;
    // we would need a full SQL lexer to handle them.
    $location = array();
    if (preg_match('@^UPDATE "([^"]+)" SET "([^"]+)" = @', $sql, $match)) {
        $location['table'] = $match[1];
        $location['column'] = $match[2];

        if (preg_match('@ WHERE "([^"]+)" = \'([^\']+)\' AND @', $sql, $match)) {
            $location['idname'] = $match[1];
            $location['id'] = $match[2];
            return $location;
        }
    } elseif (preg_match('@^INSERT INTO "([^"]+)" \("([^"]+)"@', $sql, $match)) {
        // We cannot determine the primary key from the INSERT statement,
        // so just take the first column for the message
        $location['table'] = $match[1];
        $location['idname'] = $match[2];

        if (preg_match('@\) VALUES \(\'([^\']+)\'@', $sql, $match)) {
            $location['id'] = $match[1];
            return $location;
        }
    }
    return null;
}

/**
 * Find SQL statements associated to the same action.
 *
 * The default behavior of this function is to restore the backup file by
 * executing every SQL statement individually after splitting the file by new
 * lines, this clearly poses a problem with certain statements, for example,
 * with stored procedures where they could be composed of multiple lines and
 * separated by the DELIMITER keyword. This iteration is trying to fix this
 * problem by executing all the SQL statements previously collected with a
 * DELIMITER keyword.
 *
 * @param  string $content All SQL statements that will be executed.
 * @return array           SQL statements grouped by actions.
 */
function getMultiSQLStatements($content = '')
{
    $sqlGroup = '';
    $sqlGroups = array();
    $appendToGroup = false;

    /* Clean and formalize SQL statements */
    // $content = str_replace("\x60", '', $content);
    $content = str_replace(";END", ";\nEND", $content);
    $content = str_replace("\x20END", "\nEND", $content);
    $content = str_replace("\x20BEGIN", "\nBEGIN", $content);

    $lines = explode("\n", $content); /* assume unique lines */

    foreach ($lines as $line) {
        $line = trim($line);

        /* Skip empty lines, comments and SQL delimiters */
        if (empty($line)
            || strpos($line, "--\x20") === 0
            || strpos($line, 'DELIMITER') === 0
        ) {
            continue;
        }

        if (strpos($line, 'CREATE DEFINER') === 0
            || strpos($line, 'CREATE FUNCTION') === 0
            || strpos($line, 'CREATE PROCEDURE') === 0
        ) {
            $appendToGroup = true;
            $sqlGroup = $line;

            /**
             * Close group if the END was in the previous line.
             *
             * In some cases when the group of SQL statements is all merged in
             * a single line, both the CREATE and END keywords will be at the
             * beginning and end of the same instruction, making this condition
             * more or less irrelevant. To prevent conflicts with other groups
             * we will check if this line also contains the END keyword and
             * close the group right here.
             */
            if (strpos($line, ';END') !== false
                || strpos($line, ";\x20END") !== false
            ) {
                $appendToGroup = false;
                $sqlGroups[] = $sqlGroup;
            }

            continue;
        }

        if (strpos($line, 'END') === 0) {
            $appendToGroup = false;
            $sqlGroups[] = $sqlGroup . "\n" . $line;
            continue;
        }

        if ($appendToGroup) {
            $sqlGroup .= "\n" . $line;
            continue;
        }

        $sqlGroups[] = $line;
    }

    return $sqlGroups;
}

/**
 * Restores the content of a specific database.
 *
 * @param  MySQLIDriver $driver  Database connection.
 * @param  string       $content List of SQL statements to execute.
 * @return void
 */
function restoreBackup($driver, $content)
{
    if (!isset($GLOBALS['isPlainText'])) {
        $GLOBALS['isPlainText'] = false;
    }

    $sqlLines = getMultiSQLStatements($content);

    prush("Restoring " . count($sqlLines) . " SQL statements...\n");

    foreach ($sqlLines as $sql) {
        if ($sql === '' || $sql === BACKUP_COMMENT) {
            continue;
        }

        $res = $driver->query($sql);

        if (strpos($sql, "CREATE\x20") === 0
            || strpos($sql, "DROP\x20") === 0
        ) {
            logMsg($res !== false, $sql);
            continue;
        }

        $location = getLocationFromSql($sql);
        $naffected = $driver->getAffectedRows();

        if ($naffected === 0) {
            prush(reportMalware('ERROR', 'The DB column was changed after backup. Please restore manually', $location) . "\n");
        } elseif ($naffected !== 1) {
            prush(reportMalware('ERROR', 'Unexpected naffected: ' . $naffected, $location) . "\n");
        } else {
            prush(reportMalware('OK', isset($location['column']) ? 'Restored DB column' : 'Restored DB row', $location) . "\n");
        }
    }

    printMsg("\n\nINFO: Restore complete");

    prush($GLOBALS['isPlainText'] ? "\n" : '</pre>');
}

/**
 * Creates a new directory to store the infected data.
 *
 * @return bool True if the directory was created, false otherwise.
 */
function createQuarantineFolder()
{
    // Create the directory (race condition here)
    if (!is_dir(QUARANTINE_FOLDER)) {
        if (!mkdir(QUARANTINE_FOLDER, 0755, true)) {
            return false;
        }
    }

    // Harden the directory
    if (!touch(QUARANTINE_FOLDER . DIRECTORY_SEPARATOR . 'index.html')
        || !touch(QUARANTINE_FOLDER . DIRECTORY_SEPARATOR . 'index.php')
    ) {
        return false;
    }

    $fh = fopen(QUARANTINE_FOLDER . DIRECTORY_SEPARATOR . '.htaccess', 'w');
    if ($fh === false || false === fwrite($fh, 'deny from all')) {
        return false;
    }
    fclose($fh);
    return true;
}

/**
 * Returns the path to the requested database backup.
 *
 * @param  string $action Category associated to the backup.
 * @param  string $table  Name of the table.
 * @return string|bool    Path to the database backup or false.
 */
function getBackupFilename($action, $table)
{
    if (!isset($GLOBALS['backupFilename'])) {
        $GLOBALS['backupFilename'] = array();
    }

    // Sanitize table name
    $table = preg_replace('/[^a-zA-Z0-9_-]/', '-', $table);

    // If the current backup file is too large or does not exist, generate a new one
    clearstatcache();
    if (isset($GLOBALS['backupFilename'][$table]) && filesize($GLOBALS['backupFilename'][$table]) <= 500000) {
        return $GLOBALS['backupFilename'][$table];
    }

    if (!createQuarantineFolder()) {
        return false;
    }

    // Generate the file name. There is a race condition here, but it's mostly okay
    // because scan usually takes more than 1 sec. Ideally, we would use fopen(..., "xb"),
    // but it's not supported until PHP 4.3.2.
    $suffix = BACKUP_APPENDIX . time();
    $prefix = QUARANTINE_FOLDER . DIRECTORY_SEPARATOR . $action . '-' . $table;
    $rand = '';

    while (file_exists($prefix . $rand . $suffix)) {
        $rand = mt_rand(0, 1000000000);
    }

    if (!$GLOBALS['backupFilename']) {
        $GLOBALS['backupFilename'] = array();
    }

    $GLOBALS['backupFilename'][$table] = $prefix . $rand . $suffix;

    return $GLOBALS['backupFilename'][$table];
}

/**
 * Encodes the passed content with certain key.
 *
 * @param  string $content Text to be encrypted.
 * @param  string $key     Password for the encryption.
 * @param  int    $shift   Number of encryption cycles.
 * @return string          New text already encrypted.
 */
function encrypt($content, $key, $shift)
{
    $result = '';
    $contentLength = strlen($content);
    $keyLength = strlen($key);

    // XOR the first 'shift' bytes
    $shift %= $keyLength;
    $processedLength = min($keyLength - $shift, $contentLength);
    // substr() returns false for an empty $content string, so we do an additional check

    if ($processedLength > 0) {
        $result = substr($content, 0, $processedLength) ^ substr($key, $shift, $processedLength);
    }

    $restLength = ($contentLength - $processedLength) % $keyLength;
    $mainPartEnd = $contentLength - $restLength;

    for ($i = $processedLength; $i < $mainPartEnd; $i += $keyLength) {
        $result .= $key ^ substr($content, $i, $keyLength);
    }

    if ($restLength > 0) {
        $result .= substr($content, $mainPartEnd) ^ substr($key, 0, $restLength);
    }

    return $result;
}

/**
 * Prints the list of available backup files.
 *
 * @return void
 */
function listBackupFiles()
{
    if (!isset($GLOBALS['isPlainText'])) {
        $GLOBALS['isPlainText'] = false;
    }

    $dateLimit = null;

    /**
     * @option date Timestamp to filter the files in the backup archive.
     */
    if (isset($_GET['date'])) {
        $dateLimit = intval($_GET['date']);

        if ($dateLimit <= 0 || $dateLimit > time()) {
            $dateLimit = time();
        }
    }

    $backupFiles = array();

    $handle = @opendir(QUARANTINE_FOLDER);
    if (!$handle) {
        reportFatalError('Failed to open the quarantine folder');
    }

    while (false !== ($filename = @readdir($handle))) {
        $key = explode(BACKUP_APPENDIX, $filename, 2);
        if (is_dir($filename) || count($key) < 2) {
            continue;
        }

        $fileDate = intval($key[1]);

        if ($dateLimit !== null && ($fileDate > $dateLimit || $fileDate < $dateLimit - 24 * 60 * 60)) {
            continue;
        }

        $backupFiles[$filename] = $fileDate;
    }
    closedir($handle);

    arsort($backupFiles);

    foreach ($backupFiles as $filename => $fileDate) {
        $fileDate = @date('Y-m-d H:i:s', $fileDate);
        $restoreLink = '?srun&restore=' . base64_encode($filename);
        if ($GLOBALS['isPlainText']) {
            echo "\n" . $fileDate . ' - ' . $filename . ' - restore=' . base64_encode($filename);
        } else {
            echo "\n" . '<a href="' . $restoreLink . '" target="_blank">' . $fileDate . ' - ' .
                escapeHTML($filename) . "</a>";
        }
    }

    echo "\n\n" . count($backupFiles) . ' backup file' . (count($backupFiles) === 1 ? '' : 's') . ' found';
    echo $GLOBALS['isPlainText'] ? "\n" : '</pre>';
}

/**
 * Restores the selected database.
 *
 * @param  MySQLIDriver $driver   Database connection.
 * @param  string       $filename Database backup.
 * @return void
 */
function restore($driver, $filename)
{
    if (empty($filename)) {
        listBackupFiles();
        $driver->disconnect();
        exit;
    }

    if (isset($_POST['file_content'])) {
        if (get_magic_quotes_gpc()) {
            $_POST['file_content'] = stripslashes($_POST['file_content']);
        }
        restoreBackup($driver, $_POST['file_content']);
        $driver->disconnect();
        exit;
    }

    $filename = base64_decode($filename);
    if (!preg_match('@^[A-Za-z0-9_-]+' . preg_quote(BACKUP_APPENDIX, '@') . '[0-9]+$@', $filename)) {
        reportFatalError('Invalid backup file name: ' . $filename);
    }

    $fh = fopen(QUARANTINE_FOLDER . DIRECTORY_SEPARATOR . $filename, 'rb');
    if ($fh === false || false === ($contents = fread($fh, 8 * 1048576))) {
        reportFatalError('Unable to read file: ' . $filename);
    }
    fclose($fh);

    // Decrypt the file
    $contents = encrypt($contents, SUCURI_KEY, 0);

    $valid = strncmp($contents, BACKUP_COMMENT, strlen(BACKUP_COMMENT)) === 0 ||
        strpos($contents, "\nWHERE ") !== false;
    if (isTerminal()) {
        echo "File: " . $filename;
        if (!$valid) {
            reportFatalError('Invalid backup file');
        }
        echo "\n" . $contents . "\n";
        $reply = askFromCmdLine('Restore this backup? [Y / N]');
        if ($reply === 'y' || $reply === 'Y') {
            restoreBackup($driver, $contents);
        }
    } else {
        echo '<form method="post" style="height:100%" action="">';
        echo "File: " . escapeHtml($filename);
        if ($valid) {
            echo ' - <input type="submit" name="submit" value="Restore" />';
        } else {
            echo ' - Invalid backup file';
        }
        echo '<textarea name="file_content" style="margin: 2px; height: 85%; width: 100%;">';
        echo escapeHtml($contents);
        echo '</textarea></form></pre>';
    }
    $driver->disconnect();
    exit;
}

/**
 * Prints the content of a specific table.
 *
 * @param  MySQLIDriver $driver Database connection.
 * @param  string       $table  Name of the table.
 * @return void
 */
function dumpTableData($driver, $table)
{
    list($columns, $types) = $driver->getColumnNamesTypes($table);

    // Prepare the header with column names
    $columnsEscaped = array();
    $total = count($columns);
    for ($i = 0; $i < $total; $i++) {
        $columnsEscaped[$i] = $driver->escapeName($columns[$i]);
    }
    $columnsEscaped = implode(', ', $columnsEscaped);
    $header = 'INSERT INTO ' . $driver->escapeName($table) . ' (' . $columnsEscaped . ') VALUES';

    // Print all rows
    $allValues = '';
    $count = 0;

    $res = $driver->queryLowMemory('SELECT * FROM ' . $driver->escapeName($table) . ';');
    while ($row = $driver->fetchRow($res)) {
        $values = "\n(" . $driver->exportRow($row, $types) . ')';

        if (strlen($allValues) >= 500000) { // Split long SQL statements to avoid MySQL timeouts
            echo $header . $allValues . ";\n";
            $allValues = '';
        }

        if ($allValues) {
            $allValues .= ',';
        }
        $allValues .= $values;
        $count++;
    }

    if ($count === 0) {
        return;
    }

    echo $header . $allValues . ";\n\n";
}

/**
 * Triggers the download of the entire database.
 *
 * @param  MySQLIDriver $driver        Database connection.
 * @param  string        $tables        List of table names.
 * @param  array        $tablesColumns List of tables with their columns.
 * @param  string       $db            Name of the database.
 * @return void
 */
function dumpTables($driver, $tables, $tablesColumns, $db)
{
    global $tmp_file, $tmp_file_name;

    if (!isset($_SERVER['SERVER_NAME'])) {
        $serverName = date('ymd-His');
    } else {
        $serverName = preg_replace('/[^a-zA-Z0-9.-]/', '-', $_SERVER['SERVER_NAME']);
    }

    while (@ob_end_clean());
    ob_start('ob_handler', 256);
    date_default_timezone_set("GMT");
    header('Content-Type: application/sql; charset=utf-8');
    header('Content-Disposition: attachment; filename=dump_' . $serverName . '.sql');

    echo "-- Sucuri DB dump\n\n";
    echo $driver->getDumpHeader() . "\n";
    echo $driver->getCreateDBSql($db);

    if ($tables) {
        $tablesColumns = array_flip(explode(',', $tables));
    }

    foreach ($tablesColumns as $table => $_) {
        echo $driver->getCreateTableSql($table);
        dumpTableData($driver, $table);
    }

    echo "-- End of the dump\n";
    ob_end_clean();
    rewind($tmp_file);
    fpassthru($tmp_file);
    fclose($tmp_file);
    @unlink($tmp_file_name);

    exit;
}

function ob_handler($buffer)
{
    global $tmp_file;
    fwrite($tmp_file, $buffer);
}

/**
 * Prints to console the content of the data array.
 *
 * Each header must be an array with a required "name" attribute and additional
 * optional keys to specify an alias (alternative name for the column) and the
 * alignment of the data (either left or right, by default: left). If there is
 * no "alias" the function takes the value from the required "name" key.
 *
 * Similar to the example below:
 *
 * <pre>
 * Headers [
 *   [name: "ID"],
 *   [name: "Name"],
 *   [name: "Population", align: "right"],
 *   [name: "Percentage", alias: "Density", align: "right"],
 *   [name: "LandArea", alias: "Land Area", align: "right"],
 * ]
 *
 * +----+---------------------------+------------+---------+--------------+
 * | Tabular Data                                                         |
 * +----+---------------------------+------------+---------+--------------+
 * | ID | Name                      | Population | Density | Land Area    |
 * +----+---------------------------+------------+---------+--------------+
 * | 1  | Ontario                   | 13,448,494 |  38.30% |   908,699.33 |
 * | 2  | Quebec                    |  8,164,361 |  23.20% | 1,356,625.27 |
 * | 3  | British Columbia          |  4,648,055 |  13.20% |   922,503.01 |
 * | 4  | Alberta                   |  4,067,175 |  11.60% |   640,330.46 |
 * | 5  | Manitoba                  |  1,278,365 |   3.60% |   552,370.99 |
 * | 6  | Saskatchewan              |  1,098,352 |   3.10% |   588,243.54 |
 * | 7  | Nova Scotia               |    923,598 |   2.60% |    52,942.27 |
 * | 8  | New Brunswick             |    747,101 |   2.10% |    71,388.81 |
 * | 9  | Newfoundland and Labrador |    519,716 |   1.50% |   370,514.08 |
 * | 10 | Prince Edward Island      |    142,907 |   0.41% |     5,686.03 |
 * | 11 | Northwest Territories     |     41,786 |   0.12% | 1,143,793.86 |
 * | 12 | Nunavut                   |     35,944 |   0.10% | 1,877,778.53 |
 * | 13 | Yukon                     |     35,874 |   0.10% |   474,712.68 |
 * +----+---------------------------+------------+---------+--------------+
 * </pre>
 *
 * @category Terminal
 * @package  Cleanup
 * @author   Yorman <yorman@sucuri.net>
 * @license  https://opensource.org/licenses/MIT MIT
 * @link     https://sucuri.net/
 * @date     Nov 23, 2017
 */
class TabularData
{
    /**
     * @var array List of entries to print in the terminal.
     */
    private $data;

    /**
     * @var string Optional title for the terminal table.
     */
    private $title;

    /**
     * @var array Names for the columns in the table.
     */
    private $headers;

    /**
     * @var array Two-dimensional array where each item contains information
     * about the data on each column of the table, more specifically, the number
     * of characters of the entry with the longest string.
     */
    private $longest;

    /**
     * @var array Lines composing the table for buffering.
     */
    private $lines;

    /**
     * @var array List of optional foot notes.
     */
    private $notes;

    /**
     * @var int Total number of entries in the data array.
     */
    private $total;

    /**
     * Constructor.
     */
    public function __construct()
    {
        $this->title = '';
        $this->data = array();
        $this->headers = array();
        $this->longest = array();
        $this->lines = array();
        $this->notes = array();
        $this->total = 0;
    }

    /**
     * Attaches the data that will be tabulated.
     *
     * @param  array $data Array with multiple entries.
     * @return void
     */
    public function addData($data)
    {
        $this->data = $data;
        $this->total = count($data);
    }

    /**
     * Adds a new column to the table.
     *
     * @param  string $name  Name of the array key with the data.
     * @param  string $align Either "left" or "right" (default: "left")
     * @param  string $alias Optional name for the column.
     * @return void
     */
    public function addColumn($name, $align = 'left', $alias = '')
    {
        if (empty($name)) {
            return;
        }

        if ($alias === '') {
            $alias = $name;
        }

        $this->headers[] = array(
            'name' => $name, /* key to find the data in the array */
            'alias' => $alias, /* column name to print in the console */

            /**
             * This condition should be read as "where do you want to put the
             * white spaces" instead of "where do you want to put the text" as
             * we want to use white spaces to align the text in the column. So
             * if the function call has align to the "right", we have to use
             * STR_PAD_LEFT to fill up the left side of the string.
             */
            'align' => ($align === 'right' ? STR_PAD_LEFT : STR_PAD_RIGHT),
        );

        $this->longest[$name] = strlen($alias);
    }

    /**
     * Adds a note to the foot of the table.
     *
     * @param  string $text Message to append at the end of the table.
     * @return void
     */
    public function addNote($text = '')
    {
        $this->notes[] = $text;
    }

    /**
     * Defines an optional title for the table.
     *
     * @param  string $title Name of the data.
     * @return void
     */
    public function setTitle($title)
    {
        $this->title = $title;
    }

    /**
     * Finds the longest text on each column.
     *
     * @return void
     */
    private function findLongestText()
    {
        foreach ($this->data as $row) {
            foreach ($this->headers as $header) {
                $length = 0;
                $name = $header['name'];

                if (array_key_exists($name, $row)) {
                    $length = strlen(strip_tags($row[$name]));
                }

                if ($length > $this->longest[$name]) {
                    $this->longest[$name] = $length;
                }
            }
        }
    }

    /**
     * Sort an array with a user-defined comparison function.
     *
     * This function sorts an array such that array indices maintain their
     * correlation with the array elements they are associated with, using a
     * user-defined comparison function. This is used mainly when sorting
     * associative arrays where the actual element order is significant. If two
     * members compare as equal, their relative order in the sorted array is
     * undefined.
     *
     * @param  string $field Name of the column to sort by.
     * @return void
     */
    public function sortBy($field = '')
    {
        $GLOBALS['sortByField'] = $field;
        usort($this->data, 'TabularData::sortByAlgo');
    }

    /**
     * Compares two variables.
     *
     * @param  mixed $a Value to compare.
     * @param  mixed $b Value to be compared with.
     * @return int      Zero if equal, one for greater than, minus one otherwise.
     */
    private static function sortByAlgo($a, $b)
    {
        $field = @$GLOBALS['sortByField'];

        if ($a[$field] === $b[$field]) {
            return 0; /* they are the same */
        }

        return $a[$field] > $b[$field] ? -1 : 1;
    }

    /**
     * Tabulate and print the data to the terminal.
     *
     * @throws Exception
     * @return void
     */
    public function printTable()
    {
        if (!is_array($this->data) || empty($this->data)) {
            throw new Exception('There is no data to print', 3114);
        }

        $start = microtime(true);

        $this->findLongestText();
        $this->printTableSeparator();
        $this->printTableTitle();
        $this->printTableSeparator();
        $this->printTableHeader();
        $this->printTableSeparator();
        $this->printTableContent();
        $this->printTableSeparator();

        foreach ($this->notes as $note) {
            if (isTerminal()) {
                $this->lines[] = strip_tags($note);
                continue;
            }

            $this->lines[] = $note;
        }

        $end = microtime(true) - $start;

        $this->lines[] = sprintf('%d rows in set (%f secs)', $this->total, $end);

        /* Browser; print all lines from buffer */
        if (!isTerminal()) {
            prush('<style type="text/css">');
            prush('.tabular {');
            prush('    width: 100%;');
            prush('    overflow-x: scroll;');
            prush('    white-space: pre;');
            prush('    border: none;');
            prush('}');
            prush('</style>');
            prush("<div class='tabular'>");
            foreach ($this->lines as $line) {
                prush('<div>' . $line . '</div>');
            }
            prush('</div>');
            return;
        }

        /* Terminal; print all lines from buffer */
        foreach ($this->lines as $line) {
            prush($line . "\n");
        }
    }

    /**
     * Prints a line of dashes and plus signs to separate.
     *
     * @return void
     */
    private function printTableSeparator()
    {
        $line = '';

        foreach ($this->headers as $header) {
            $line .= '+' . str_repeat('-', $this->longest[$header['name']] + 2);
        }

        $this->lines[] = $line . '-+';
    }

    /**
     * Prints the title of the table.
     *
     * @return void
     */
    private function printTableTitle()
    {
        /* total table width, with separators */
        $total = 3 * (count($this->longest) - 1);

        foreach ($this->longest as $col => $width) {
            $total += $width;
        }

        $line = "|\x20";

        if (strlen($this->title) > $total) {
            $line .= substr($this->title, 0, $total) . '…';
        } else {
            $line .= str_pad($this->title, $total + 1, "\x20", STR_PAD_RIGHT);
        }

        $this->lines[] = $line . "\x20|";
    }

    /**
     * Prints the header of the table.
     *
     * @return void
     */
    private function printTableHeader()
    {
        $line = '';

        foreach ($this->headers as $header) {
            $line .= "|\x20";
            $line .= str_pad($header['alias'], $this->longest[$header['name']]);
            $line .= "\x20";
        }

        $this->lines[] = $line . "\x20|";
    }

    /**
     * Prints the content of the table.
     *
     * @return void
     */
    private function printTableContent()
    {
        for ($i = 0; $i < $this->total; $i++) {
            $line = '';

            foreach ($this->headers as $header) {
                $a = $this->longest[$header['name']];
                $b = strip_tags($this->data[$i][$header['name']]);
                $c = strlen(strip_tags($this->data[$i][$header['name']]));
                $spaces = str_repeat("\x20", $a - $c);

                $line .= "|\x20";
                $line .= ($header['align'] === STR_PAD_LEFT ? $spaces : '');
                $line .= $this->data[$i][$header['name']];
                $line .= ($header['align'] === STR_PAD_RIGHT ? $spaces : '');
                $line .= "\x20";
            }

            $this->lines[] = $line . "\x20|";
        }
    }
}

/**
 * Skips the modification of the database and only prints the status of the
 * infection rather than cleaning the infected data. This is useful if you want
 * to see what the script is going to modify before it happens. This option is
 * automatically set if the script finds a problem during an update of one of
 * the records, to prevent future failures it sets itself to read-only mode and
 * simply prints the subsequent infected records.
 *
 * @option noclean Disables the cleanup of the malicious data.
 *
 * @return bool True if the GET parameter "noclean" exists, false otherwise.
 */
function skipCleanup()
{
    return (bool) isset($_GET['noclean']);
}

/**
 * Prints text and immediately flush system output buffer.
 *
 * Outputs all parameters. No additional newline is appended. This is not
 * actually a function (it is a language construct), so you are not required to
 * use parentheses with it. echo (unlike some other language constructs) does
 * not behave like a function, so it cannot always be used in the context of a
 * function. Additionally, if you want to pass more than one parameter to echo,
 * the parameters must not be enclosed within parentheses.
 *
 * @param  string $text The parameter to output.
 * @return void
 */
function prush($text)
{
    echo $text;
    @ob_flush();
    @flush();
}

/**
 * Merges all the values from an array into a string.
 *
 * The "smart" part of this function in comparison with the built-in function
 * "implode" is that it handles multi-dimensional arrays. You can refer to the
 * example below for a better understanding.
 *
 * Input: [1, 2, 3, [4, 5, 6], [7, 8, 9]]
 * Output: "1, 2, 3, 4, 5, 6, 7, 8, 9"
 *
 * @param  array  $list Possibly a multi-dimensional array.
 * @param  string $glue String to concatenate the items in the list.
 * @return string       Merged version of the list as a string.
 */
function smartImplode($list = array(), $glue = ",\x20")
{
    $output = '';

    foreach ($list as $key => $values) {
        if (is_array($values)) {
            $output .= ",\x20" . smartImplode($values, $glue);
            continue;
        }

        if (is_string($values)) {
            $output .= ",\x20" . $values;
            continue;
        }
    }

    return substr($output, 2);
}

/**
 * Finds all stored procedures and functions from a MySQL database.
 *
 * A stored procedure is a set of Structured Query Language (SQL) statements
 * with an assigned name, which are stored in a relational database management
 * system as a group, so it can be reused and shared by multiple programs.
 *
 * A benefit of stored procedures is that you can centralize data access logic
 * into a single place that is then easy for DBA's to optimize. Stored
 * procedures also have a security benefit in that you can grant execute rights
 * to a stored procedure but the user will not need to have read/write
 * permissions on the underlying tables. This is a good first step against SQL
 * injection.
 *
 * @see https://dev.mysql.com/doc/refman/5.7/en/create-procedure.html
 * @see https://dev.mysql.com/doc/refman/5.7/en/show-create-procedure.html
 *
 * @param  MySQLIDriver $driver Database connection.
 * @param  string       $group  Either "PROCEDURE" or "FUNCTION".
 * @param  array        $row    Raw associative data from the database.
 * @param  bool         $limit  True to include the SQL delimiter, false otherwise.
 * @return array                Information associated to a single stored procedure.
 */
function getStoredProcedure($driver, $group = '', $row = array(), $limit = false)
{
    $sql = sprintf(
        'SHOW CREATE %s %s.%s;',
        $group,
        $driver->escapeName($row['Db']),
        $driver->escapeName($row['Name'])
    );
    $data = $driver->fetchAssoc($driver->query($sql));

    /* Either "Create Procedure" or "Create Function" */
    $filter = sprintf('Create %s', ucwords(strtolower($group)));
    $row['Procedure'] = $data[$filter];
    $row['SqlMode'] = array();
    $row['CssClass'] = '';

    if (array_key_exists('sql_mode', $data)) {
        /* ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,…,NO_ZERO_DATE */
        $row['SqlMode'] = explode(',', $data['sql_mode']);
    }

    /* ignore normal procedures */
    if ($row['Db'] === 'sys') {
        $row['CssClass'] .= "\x20normal";
    }

    /* mark DUMPFILE SQL statement as suspicious */
    if (stripos($row['Procedure'], 'DUMPFILE') !== false) {
        $row['CssClass'] .= "\x20suspicious";
    }

    /* mark PHP code as suspicious */
    if (stripos($row['Procedure'], '<?php') !== false) {
        $row['CssClass'] .= "\x20suspicious";
    }

    /* include the SQL delimiter if necessary */
    if ($limit === true) {
        $row['Procedure'] = sprintf(
            "DELIMITER\x20;;\n%s\x20;;\nDELIMITER\x20;",
            $row['Procedure'] /* original sql statement */
        );
    }

    return $row;
}

/**
 * Returns all stored procedures and functions.
 *
 * @param  MySQLIDriver $driver Database connection.
 * @return array                List of all stored procedures and functions.
 */
function getStoredProcedures($driver)
{
    $entries = array();
    $groups = array('PROCEDURE', 'FUNCTION');

    foreach ($groups as $group) {
        $res = $driver->query(sprintf('SHOW %s STATUS;', $group));

        while ($row = $driver->fetchAssoc($res)) {
            $entries[] = getStoredProcedure($driver, $group, $row);
        }
    }

    return $entries;
}

/**
 * Deletes one single stored procedure after a POST request.
 *
 * @param  MySQLIDriver $driver Database connection.
 * @return void
 */
function handleStoredProcedureDeletion($driver)
{
    if (!isset($_POST['procedure_delete'])
        || !isset($_POST['procedure_db'])
        || !isset($_POST['procedure_type'])
        || !isset($_POST['procedure_name'])
    ) {
        return;
    }

    $data = getStoredProcedure(
        $driver,
        $_POST['procedure_type'],
        array('Db' => $_POST['procedure_db'], 'Name' => $_POST['procedure_name']),
        true /* include the SQL statement delimiters */
    );

    $bakfile = getBackupFilename('delprocedure', $_POST['procedure_db']);

    if ($bakfile === false) {
        printMsg("3356 - Backup file for the stored procedure is not available.\n");
        return;
    }

    if (!addToBackup($bakfile, $data['Procedure'])) {
        printMsg("3361 - Stored procedure was not backuped up before deletion.\n");
        return;
    }

    $driver->query(
        sprintf(
            'DROP %s IF EXISTS %s.%s',
            $_POST['procedure_type'],
            $_POST['procedure_db'],
            $_POST['procedure_name']
        )
    );
}

/**
 * Finds all stored procedures from a MySQL database.
 *
 * @option procedures Finds all stored procedures from a MySQL database.
 * @option procedures.name=TYPE:db.procedure Prints a specific database stored procedure.
 * @option procedures.delete=TYPE:db.procedure Deletes a specific database stored procedure.
 *
 * @param  MySQLIDriver $driver Database connection.
 * @return void
 */
function printStoredProcedures($driver)
{
    /* print details for one single entry (in terminal mode) */
    if (isTerminal() && isset($_GET['procedures_name'])) {
        echo "\n\n"; /* separator*/

        /* check valid format; expected -> TYPE:db.procedure */
        if (preg_match('/^([A-Z]+):([^\.]+)\.(.+)$/', $_GET['procedures_name'], $match)) {
            $row = array('Db' => $match[2], 'Name' => $match[3]);
            $data = getStoredProcedure($driver, $match[1], $row);

            printf("Database: %s\n", $data['Db']);
            printf("Name: %s\n", $data['Name']);
            foreach ($data['SqlMode'] as $idx => $mode) {
                printf("SQL Mode #%d: %s\n", ($idx + 1), $data['SqlMode'][$idx]);
            }
            printf("Procedure:\n%s\n", $data['Procedure']);
            return;
        }

        printMsg("Missing database name or procedure name.\n");
        return;
    }

    /* delete a single stored procedure (in terminal mode) */
    if (isTerminal() && isset($_GET['procedures_delete'])) {
        echo "\n\n"; /* separator*/

        /* check valid format; expected -> TYPE:db.procedure */
        if (preg_match('/^([A-Z]+):([^\.]+)\.(.+)$/', $_GET['procedures_delete'], $match)) {
            $_POST['procedure_delete'] = true;
            $_POST['procedure_db'] = $match[2];
            $_POST['procedure_type'] = $match[1];
            $_POST['procedure_name'] = $match[3];
            handleStoredProcedureDeletion($driver);
            printMsg("3420 - Stored procedure " . $match[2] . "." . $match[3] . " was deleted.\n");
            return;
        }

        printMsg("Missing database name or procedure name.\n");
        return;
    }

    /* print the entire list (in terminal mode) */
    if (isTerminal()) {
        echo "\n\n"; /* separator*/
        $tabular = new TabularData();
        $entries = getStoredProcedures($driver);
        $tabular->setTitle('Stored Procedures');
        $tabular->addColumn('Type');
        $tabular->addColumn('Created');
        $tabular->addColumn('Modified');
        $tabular->addColumn('Definer');
        $tabular->addColumn('Security_type');
        $tabular->addColumn('Db');
        $tabular->addColumn('Name');
        $tabular->addData($entries);
        $tabular->printTable();
        return;
    }

    ?>
    <div class="procedures">
        <style type="text/css">
        body {
            /* y-overflow for long procedures */
            padding-bottom: 300px;
        }
        .procedures table {
            border: 1px solid #999;
            border-bottom: 0;
            border-right: 0;
            border-spacing: 0;
            position: relative;
            width: 100%;
        }
        .procedures table .normal td {
            color: #999;
        }
        .procedures table .comment {
            background: #efefef;
            border-bottom-right-radius: 3px;
            border-top-right-radius: 3px;
            border: 1px solid #999;
            box-shadow: 0 0 5px #999;
            color: #000;
            display: none;
            left: 0;
            margin-left: -1px;
            margin-top: 11px;
            padding: 20px;
            position: absolute;
            white-space: pre-wrap;
            width: 750px;
            word-break: break-all;
        }
        .procedures table .suspicious .comment {
            background: #ffadb2;
            border-color: #ff6051;
        }
        .procedures table tr:hover .comment {
            display: block;
        }
        .procedures table th,
        .procedures table td {
            padding: 2px 5px;
        }
        .procedures table th {
            background: #efefef;
            border-bottom: 1px solid #999;
            border-right: 1px solid #999;
            text-align: left;
            text-transform: uppercase;
        }
        .procedures table td {
            border: 1px solid #999;
            border-left: 0;
            border-top: 0;
        }
        .procedures table .procedure_form {
            padding: 0;
            text-align: center;
        }
        .procedures table .procedure_form form {
            margin: 0;
        }
        </style>
        <?php
        handleStoredProcedureDeletion($driver);
        $entries = getStoredProcedures($driver);
        ?>
        <table>
            <thead>
                <tr>
                    <th>&nbsp;</th>
                    <th>Type</th>
                    <th>Created</th>
                    <th>Modified</th>
                    <th>Definer</th>
                    <th>Security</th>
                    <th>Db</th>
                    <th>Name</th>
                    <th>&nbsp;</th>
                </tr>
            </thead>
            <tbody>
            <?php foreach ($entries as $row) : ?>
                <tr class="<?php echo $row['CssClass']; ?>">
                    <td><span class="comment"><?php echo htmlentities($row['Procedure']); ?></span></td>
                    <td><?php echo $row['Type']; ?></td>
                    <td><?php echo $row['Created']; ?></td>
                    <td><?php echo $row['Modified']; ?></td>
                    <td><?php echo $row['Definer']; ?></td>
                    <td><?php echo $row['Security_type']; ?></td>
                    <td><?php echo $row['Db']; ?></td>
                    <td><?php echo $row['Name']; ?></td>
                    <td class="procedure_form">
                        <form method="post">
                            <input type="hidden" name="procedure_delete" value="true">
                            <input type="hidden" name="procedure_db" value="<?php echo $row['Db']; ?>">
                            <input type="hidden" name="procedure_name" value="<?php echo $row['Name']; ?>">
                            <input type="hidden" name="procedure_type" value="<?php echo $row['Type']; ?>">
                            <?php if ($row['Db'] === 'sys') : ?>
                                <button type="submit" disabled>delete</button>
                            <?php else : ?>
                                <button type="submit">delete</button>
                            <?php endif; ?>
                        </form>
                    </td>
                </tr>
            <?php endforeach; ?>
            </tbody>
        </table>
    </div>
    <?php
}

/**
 * Prints all the available options in the script.
 *
 * @option help Prints all the available options in the script.
 *
 * @return void
 */
function printScriptUsage()
{
    if (!is_readable(__FILE__)) {
        return;
    }

    $maxlen = 0;
    $options = array();
    $lines = file(__FILE__, FILE_SKIP_EMPTY_LINES | FILE_IGNORE_NEW_LINES);

    foreach ($lines as $line) {
        if (strpos($line, "@option\x20") !== false) {
            $index = strpos($line, "@option\x20");
            $line = substr($line, $index + 8);
            $index = strpos($line, "\x20");
            $option = substr($line, 0, $index);
            $desc = substr($line, $index + 1);
            $length = strlen($option);

            if ($length > $maxlen) {
                $maxlen = $length;
            }

            $options[$option] = $desc;
        }
    }

    if (empty($options)) {
        return;
    }

    echo "\n\nUsage:\n";

    foreach ($options as $option => $desc) {
        printf(
            "\x20\x20%s\x20%s\n",
            str_pad($option, $maxlen, "\x20", STR_PAD_RIGHT),
            $desc
        );
    }
}