417 lines
82 KiB
Markdown
417 lines
82 KiB
Markdown
|
---
|
|||
|
obj: application
|
|||
|
os: linux
|
|||
|
repo: https://github.com/httpie/httpie
|
|||
|
website: https://httpie.io/
|
|||
|
---
|
|||
|
# HTTPie
|
|||
|
modern, user-friendly command-line [HTTP](../../internet/HTTP.md) client (with optional GUI) for the API era. [JSON](../../files/JSON.md) support, colors, sessions, downloads, plugins & more.
|
|||
|
|
|||
|
## GUI
|
|||
|
HTTPie features a graphical application for API testing. It supports everything features in the CLI version but with graphics.
|
|||
|
|
|||
|
![Screenshot][Screenshot]
|
|||
|
|
|||
|
## CLI
|
|||
|
Usage:
|
|||
|
```shell
|
|||
|
http [flags] [METHOD] URL [ITEM [ITEM]]
|
|||
|
```
|
|||
|
|
|||
|
### Querystring parameters
|
|||
|
If you find yourself manually constructing URLs with querystring parameters on the terminal, you may appreciate the `param==value` syntax for appending [URL](../../internet/URL.md) parameters.
|
|||
|
|
|||
|
With that, you don’t have to worry about escaping the `&` separators for your [shell](../cli/Shell.md). Additionally, any special characters in the parameter name or value get automatically [URL](../../internet/URL.md)-escaped (as opposed to the parameters specified in the full [URL](../../internet/URL.md), which HTTPie doesn’t modify).
|
|||
|
```shell
|
|||
|
$ http https://api.github.com/search/repositories q==httpie per_page==1
|
|||
|
```
|
|||
|
|
|||
|
```http
|
|||
|
GET /search/repositories?q=httpie&per_page=1 HTTP/1.1
|
|||
|
```
|
|||
|
|
|||
|
### Request Items
|
|||
|
| Item Type | Description |
|
|||
|
| ------------------------------------------------------------:| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|||
|
| HTTP Headers `Name:Value` | Arbitrary [HTTP](../../internet/HTTP.md) header, e.g. `X-API-Token:123` |
|
|||
|
| [URL](../../internet/URL.md) parameters `name==value` | Appends the given name/value pair as a querystring parameter to the [URL](../../internet/URL.md). The `==` separator is used. |
|
|||
|
| Data Fields `field=value` | Request data fields to be serialized as a [JSON](../../files/JSON.md) object (default), to be form-encoded (with `--form, -f`), or to be serialized as `multipart/form-data` (with `--multipart`) |
|
|||
|
| Raw JSON fields `field:=json` | Useful when sending [JSON](../../files/JSON.md) and one or more fields need to be a `Boolean`, `Number`, nested `Object`, or an `Array`, e.g., `meals:='["ham","spam"]'` or `pies:=[1,2,3]` (note the quotes) |
|
|||
|
| File upload fields `field@/dir/file`, `field@file;type=mime` | Only available with `--form`, `-f` and `--multipart`. For example `screenshot@~/Pictures/img.png`, or `'cv@cv.txt;type=text/markdown'`. With `--form`, the presence of a file field results in a `--multipart` request |
|
|||
|
|
|||
|
### JSON Requests
|
|||
|
Data is send as [JSON](../../files/JSON.md) by default.
|
|||
|
|
|||
|
Non-string [JSON](../../files/JSON.md) fields use the `:=` separator, which allows you to embed arbitrary [JSON](../../files/JSON.md) data into the resulting [JSON](../../files/JSON.md) object. Additionally, text and raw [JSON](../../files/JSON.md) files can also be embedded into fields using `=@` and `:=@`:
|
|||
|
```shell
|
|||
|
$ http PUT pie.dev/put \
|
|||
|
name=John \ # String (default)
|
|||
|
age:=29 \ # Raw JSON — Number
|
|||
|
married:=false \ # Raw JSON — Boolean
|
|||
|
hobbies:='["http", "pies"]' \ # Raw JSON — Array
|
|||
|
favorite:='{"tool": "HTTPie"}' \ # Raw JSON — Object
|
|||
|
bookmarks:=@files/data.json \ # Embed JSON file
|
|||
|
description=@files/text.txt # Embed text file
|
|||
|
```
|
|||
|
|
|||
|
```http
|
|||
|
PUT /person/1 HTTP/1.1
|
|||
|
Accept: application/json, */*;q=0.5
|
|||
|
Content-Type: application/json
|
|||
|
Host: pie.dev
|
|||
|
|
|||
|
{
|
|||
|
"age": 29,
|
|||
|
"hobbies": [
|
|||
|
"http",
|
|||
|
"pies"
|
|||
|
],
|
|||
|
"description": "John is a nice guy who likes pies.",
|
|||
|
"married": false,
|
|||
|
"name": "John",
|
|||
|
"favorite": {
|
|||
|
"tool": "HTTPie"
|
|||
|
},
|
|||
|
"bookmarks": {
|
|||
|
"HTTPie": "https://httpie.org",
|
|||
|
}
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
### Forms
|
|||
|
Submitting forms is very similar to sending [JSON](../../files/JSON.md) requests. Often the only difference is in adding the `--form, -f` option, which ensures that data fields are serialized as, and `Content-Type` is set to `application/x-www-form-urlencoded; charset=utf-8`.
|
|||
|
|
|||
|
#### Regular forms
|
|||
|
```shell
|
|||
|
$ http --form POST pie.dev/post name='John Smith'
|
|||
|
```
|
|||
|
|
|||
|
```http
|
|||
|
POST /post HTTP/1.1
|
|||
|
Content-Type: application/x-www-form-urlencoded; charset=utf-8
|
|||
|
|
|||
|
name=John+Smith
|
|||
|
```
|
|||
|
|
|||
|
#### File upload forms
|
|||
|
If one or more file fields is present, the serialization and content type is `multipart/form-data`:
|
|||
|
```shell
|
|||
|
$ http -f POST pie.dev/post name='John Smith' cv@~/files/data.xml
|
|||
|
```
|
|||
|
|
|||
|
The request above is the same as if the following [HTML](../../internet/HTML.md) form were submitted:
|
|||
|
```html
|
|||
|
<form enctype="multipart/form-data" method="post" action="http://example.com/jobs">
|
|||
|
<input type="text" name="name" />
|
|||
|
<input type="file" name="cv" />
|
|||
|
</form>
|
|||
|
```
|
|||
|
|
|||
|
Please note that `@` is used to simulate a file upload form field, whereas `=@` just embeds the file content as a regular text field value.
|
|||
|
|
|||
|
When uploading files, their content type is inferred from the file name. You can manually override the inferred content type:
|
|||
|
```shell
|
|||
|
$ http -f POST pie.dev/post name='John Smith' cv@'~/files/data.bin;type=application/pdf'
|
|||
|
```
|
|||
|
|
|||
|
### HTTP headers
|
|||
|
To set custom headers you can use the `Header:Value` notation:
|
|||
|
```shell
|
|||
|
$ http pie.dev/headers User-Agent:Bacon/1.0 'Cookie:valued-visitor=yes;foo=bar' \
|
|||
|
X-Foo:Bar Referer:https://httpie.org/
|
|||
|
```
|
|||
|
|
|||
|
```http
|
|||
|
GET /headers HTTP/1.1
|
|||
|
Accept: */*
|
|||
|
Accept-Encoding: gzip, deflate
|
|||
|
Cookie: valued-visitor=yes;foo=bar
|
|||
|
Host: pie.dev
|
|||
|
Referer: https://httpie.org/
|
|||
|
User-Agent: Bacon/1.0
|
|||
|
X-Foo: Bar
|
|||
|
```
|
|||
|
|
|||
|
#### Default request headers
|
|||
|
There are a couple of default headers that HTTPie sets:
|
|||
|
|
|||
|
```http
|
|||
|
GET / HTTP/1.1
|
|||
|
Accept: */*
|
|||
|
Accept-Encoding: gzip, deflate
|
|||
|
User-Agent: HTTPie/<version>
|
|||
|
Host: <taken-from-URL>
|
|||
|
```
|
|||
|
|
|||
|
All of these can be overwritten or unset.
|
|||
|
|
|||
|
#### Reading headers from a file
|
|||
|
You can read headers from a file by using the `:@` operator. This would also effectively strip the newlines from the end.
|
|||
|
|
|||
|
```shell
|
|||
|
$ http pie.dev/headers X-Data:@files/text.txt
|
|||
|
```
|
|||
|
|
|||
|
#### Empty headers and header un-setting
|
|||
|
To unset a previously specified header (such a one of the default headers), use `Header:`:
|
|||
|
```shell
|
|||
|
$ http pie.dev/headers Accept: User-Agent:
|
|||
|
```
|
|||
|
|
|||
|
To send a header with an empty value, use `Header;`, with a semicolon:
|
|||
|
```shell
|
|||
|
$ http pie.dev/headers 'Header;'
|
|||
|
```
|
|||
|
|
|||
|
Please note that some internal headers, such as `Content-Length`, can’t be unset if they are automatically added by the client itself.
|
|||
|
|
|||
|
#### Multiple header values with the same name
|
|||
|
If the request is sent with multiple headers that are sharing the same name, then the HTTPie will send them individually.
|
|||
|
```shell
|
|||
|
http example.org Cookie:one Cookie:two
|
|||
|
```
|
|||
|
|
|||
|
```http
|
|||
|
GET / HTTP/1.1
|
|||
|
Cookie: one
|
|||
|
Cookie: two
|
|||
|
```
|
|||
|
|
|||
|
It is also possible to pass a single header value pair, where the value is a comma separated list of header values. Then the client will send it as a single header.
|
|||
|
```shell
|
|||
|
http example.org Numbers:one,two
|
|||
|
```
|
|||
|
|
|||
|
```http
|
|||
|
GET / HTTP/1.1
|
|||
|
Numbers: one,two
|
|||
|
```
|
|||
|
|
|||
|
Also be aware that if the current session contains any headers they will get overwritten by individual commands when sending a request instead of being joined together.
|
|||
|
|
|||
|
### Offline mode
|
|||
|
Use `--offline` to construct [HTTP](../../internet/HTTP.md) requests without sending them anywhere. With `--offline`, HTTPie builds a request based on the specified options and arguments, prints it to `stdout`, and then exits. It works completely offline; no network connection is ever made. This has a number of use cases, including:
|
|||
|
|
|||
|
Generating API documentation examples that you can copy & paste without sending a request:
|
|||
|
```shell
|
|||
|
$ http --offline POST server.chess/api/games API-Key:ZZZ w=magnus b=hikaru t=180 i=2
|
|||
|
```
|
|||
|
|
|||
|
```shell
|
|||
|
$ http --offline MOVE server.chess/api/games/123 API-Key:ZZZ p=b a=R1a3 t=77
|
|||
|
```
|
|||
|
|
|||
|
Generating raw requests that can be sent with any other client:
|
|||
|
```shell
|
|||
|
# 1. save a raw request to a file:
|
|||
|
$ http --offline POST pie.dev/post hello=world > request.http
|
|||
|
|
|||
|
# 2. send it over the wire with, for example, the fantastic netcat tool:
|
|||
|
$ nc pie.dev 80 < request.http
|
|||
|
```
|
|||
|
|
|||
|
You can also use the `--offline` mode for debugging and exploring [HTTP](../../internet/HTTP.md) and HTTPie, and for “dry runs”.
|
|||
|
|
|||
|
### Cookies
|
|||
|
[HTTP](../../internet/HTTP.md) clients send [cookies](../../internet/Cookie.md) to the server as regular [HTTP](../../internet/HTTP.md) headers. That means, HTTPie does not offer any special syntax for specifying cookies — the usual `Header:Value` notation is used:
|
|||
|
|
|||
|
Send a single [cookie](../../internet/Cookie.md):
|
|||
|
```shell
|
|||
|
$ http pie.dev/cookies Cookie:sessionid=foo
|
|||
|
```
|
|||
|
|
|||
|
```http
|
|||
|
GET / HTTP/1.1
|
|||
|
Accept: */*
|
|||
|
Accept-Encoding: gzip, deflate
|
|||
|
Connection: keep-alive
|
|||
|
Cookie: sessionid=foo
|
|||
|
Host: pie.dev
|
|||
|
User-Agent: HTTPie/0.9.9
|
|||
|
```
|
|||
|
|
|||
|
Send multiple cookies (note: the header is quoted to prevent the [shell](../cli/Shell.md) from interpreting the `;`):
|
|||
|
|
|||
|
```shell
|
|||
|
$ http pie.dev/cookies 'Cookie:sessionid=foo;another-cookie=bar'
|
|||
|
```
|
|||
|
|
|||
|
```http
|
|||
|
GET / HTTP/1.1
|
|||
|
Accept: */*
|
|||
|
Accept-Encoding: gzip, deflate
|
|||
|
Connection: keep-alive
|
|||
|
Cookie: sessionid=foo;another-cookie=bar
|
|||
|
Host: pie.dev
|
|||
|
User-Agent: HTTPie/0.9.9
|
|||
|
```
|
|||
|
|
|||
|
### Authentication
|
|||
|
#### Basic auth
|
|||
|
```shell
|
|||
|
$ http -a username:password pie.dev/basic-auth/username/password
|
|||
|
```
|
|||
|
|
|||
|
#### Digest auth
|
|||
|
```shell
|
|||
|
$ http -A digest -a username:password pie.dev/digest-auth/httpie/username/password
|
|||
|
```
|
|||
|
|
|||
|
#### Bearer auth
|
|||
|
```shell
|
|||
|
https -A bearer -a token pie.dev/bearer
|
|||
|
```
|
|||
|
|
|||
|
#### Password prompt
|
|||
|
If you omit the password part of `--auth, -a`, HTTPie securely prompts you for it:
|
|||
|
|
|||
|
```shell
|
|||
|
$ http -a username pie.dev/basic-auth/username/password
|
|||
|
```
|
|||
|
|
|||
|
### HTTP redirects
|
|||
|
By default, [HTTP](../../internet/HTTP.md) redirects are not followed and only the first response is shown:
|
|||
|
```shell
|
|||
|
$ http pie.dev/redirect/3
|
|||
|
```
|
|||
|
|
|||
|
#### Follow `Location`
|
|||
|
To instruct HTTPie to follow the `Location` header of `30x` responses and show the final response instead, use the `--follow, -F` option:
|
|||
|
```shell
|
|||
|
$ http --follow pie.dev/redirect/3
|
|||
|
```
|
|||
|
|
|||
|
With `307 Temporary Redirect` and `308 Permanent Redirect`, the method and the body of the original request are reused to perform the redirected request. Otherwise, a body-less `GET` request is performed.
|
|||
|
|
|||
|
#### Showing intermediary redirect responses
|
|||
|
If you wish to see the intermediary requests/responses, then use the `--all` option:
|
|||
|
|
|||
|
```shell
|
|||
|
$ http --follow --all pie.dev/redirect/3
|
|||
|
```
|
|||
|
|
|||
|
#### Limiting maximum redirects followed
|
|||
|
To change the default limit of maximum `30` redirects, use the `--max-redirects=<limit>` option:
|
|||
|
|
|||
|
```shell
|
|||
|
$ http --follow --all --max-redirects=2 pie.dev/redirect/3
|
|||
|
```
|
|||
|
|
|||
|
### Proxies
|
|||
|
You can specify proxies to be used through the `--proxy` argument for each protocol (which is included in the value in case of redirects across protocols):
|
|||
|
```shell
|
|||
|
$ http --proxy=http:http://10.10.1.10:3128 --proxy=https:https://10.10.1.10:1080 example.org
|
|||
|
```
|
|||
|
|
|||
|
With Basic authentication:
|
|||
|
```shell
|
|||
|
$ http --proxy=http:http://user:pass@10.10.1.10:3128 example.org
|
|||
|
```
|
|||
|
|
|||
|
#### Environment variables
|
|||
|
You can also configure proxies by [environment variables](../../linux/Environment%20Variables.md) `ALL_PROXY`, `HTTP_PROXY` and `HTTPS_PROXY`, and the underlying [Requests library](https://requests.readthedocs.io/en/latest/) will pick them up. If you want to disable proxies configured through the [environment variables](../../linux/Environment%20Variables.md) for certain hosts, you can specify them in `NO_PROXY`.
|
|||
|
|
|||
|
In your `~/.bash_profile`:
|
|||
|
```shell
|
|||
|
export HTTP_PROXY=http://10.10.1.10:3128
|
|||
|
export HTTPS_PROXY=https://10.10.1.10:1080
|
|||
|
export NO_PROXY=localhost,example.com
|
|||
|
```
|
|||
|
|
|||
|
#### SOCK
|
|||
|
Usage for SOCKS is the same as for other types of proxies:
|
|||
|
```shell
|
|||
|
$ http --proxy=http:socks5://user:pass@host:port --proxy=https:socks5://user:pass@host:port example.org
|
|||
|
```
|
|||
|
|
|||
|
### HTTPS
|
|||
|
To skip the host’s SSL certificate verification, you can pass `--verify=no` (default is `yes`):
|
|||
|
|
|||
|
```shell
|
|||
|
$ http --verify=no https://pie.dev/get
|
|||
|
```
|
|||
|
|
|||
|
### Output options
|
|||
|
By default, HTTPie only outputs the final response and the whole response message is printed (headers as well as the body). You can control what should be printed via several options:
|
|||
|
|
|||
|
| Option | What is printed |
|
|||
|
| --------------------------:| -------------------------------------------------------------------------------------------------- |
|
|||
|
| `--headers, -h` | Only the response headers are printed |
|
|||
|
| `--body, -b` | Only the response body is printed |
|
|||
|
| `--meta, -m` | Only the response metadata is printed |
|
|||
|
| `--verbose, -v` | Print the whole [HTTP](../../internet/HTTP.md) exchange (request and response). This option also enables `--all` (see below) |
|
|||
|
| `--verbose --verbose, -vv` | Just like `-v`, but also include the response metadata. |
|
|||
|
| `--print, -p` | Selects parts of the [HTTP](../../internet/HTTP.md) exchange |
|
|||
|
| `--quiet, -q` | Don’t print anything to `stdout` and `stderr` |
|
|||
|
|
|||
|
### Download mode
|
|||
|
HTTPie features a download mode in which it acts similarly to [wget](../cli/wget.md).
|
|||
|
|
|||
|
When enabled using the `--download, -d` flag, response headers are printed to the terminal (`stderr`), and a progress bar is shown while the response body is being saved to a file.
|
|||
|
```shell
|
|||
|
$ http --download https://github.com/httpie/cli/archive/master.tar.gz
|
|||
|
```
|
|||
|
|
|||
|
```http
|
|||
|
HTTP/1.1 200 OK
|
|||
|
Content-Disposition: attachment; filename=httpie-master.tar.gz
|
|||
|
Content-Length: 257336
|
|||
|
Content-Type: application/x-gzip
|
|||
|
|
|||
|
Downloading 251.30 kB to "httpie-master.tar.gz"
|
|||
|
Done. 251.30 kB in 2.73862s (91.76 kB/s)
|
|||
|
```
|
|||
|
|
|||
|
#### Downloaded filename
|
|||
|
There are three mutually exclusive ways through which HTTPie determines the output filename (with decreasing priority):
|
|||
|
|
|||
|
1. You can explicitly provide it via `--output, -o`. The file gets overwritten if it already exists (or appended to with `--continue, -c`).
|
|||
|
2. The server may specify the filename in the optional `Content-Disposition` response header. Any leading dots are stripped from a server-provided filename.
|
|||
|
3. The last resort HTTPie uses is to generate the filename from a combination of the request [URL](../../internet/URL.md) and the response `Content-Type`. The initial [URL](../../internet/URL.md) is always used as the basis for the generated filename — even if there has been one or more redirects.
|
|||
|
|
|||
|
To prevent data loss by overwriting, HTTPie adds a unique numerical suffix to the filename when necessary (unless specified with `--output, -o`).
|
|||
|
|
|||
|
#### Piping while downloading
|
|||
|
You can also redirect the response body to another program while the response headers and progress are still shown in the terminal:
|
|||
|
|
|||
|
```shell
|
|||
|
$ http -d https://github.com/httpie/cli/archive/master.tar.gz | tar zxf -
|
|||
|
```
|
|||
|
|
|||
|
#### Resuming downloads
|
|||
|
If `--output, -o` is specified, you can resume a partial download using the `--continue, -c` option. This only works with servers that support `Range` requests and `206 Partial Content` responses. If the server doesn’t support that, the whole file will simply be downloaded:
|
|||
|
```shell
|
|||
|
$ http -dco file.zip example.org/file
|
|||
|
```
|
|||
|
|
|||
|
`-dco` is shorthand for `--download` `--continue` `--output`.
|
|||
|
|
|||
|
### Sessions
|
|||
|
By default, every request HTTPie makes is completely independent of any previous ones to the same host.
|
|||
|
|
|||
|
However, HTTPie also supports persistent sessions via the `--session=SESSION_NAME_OR_PATH` option. In a session, custom [HTTP](../../internet/HTTP.md) headers (except for the ones starting with `Content-` or `If-`), authentication, and cookies (manually specified or sent by the server) persist between requests to the same host.
|
|||
|
|
|||
|
```shell
|
|||
|
# Create a new session:
|
|||
|
$ http --session=./session.json pie.dev/headers API-Token:123
|
|||
|
|
|||
|
# Inspect / edit the generated session file:
|
|||
|
$ cat session.json
|
|||
|
|
|||
|
# Re-use the existing session — the API-Token header will be set:
|
|||
|
$ http --session=./session.json pie.dev/headers
|
|||
|
```
|
|||
|
|
|||
|
All session data, including credentials, prompted passwords, [cookie](../../internet/Cookie.md) data, and custom headers are stored in plain text. That means session files can also be created and edited manually in a text editor—they are regular [JSON](../../files/JSON.md). It also means that they can be read by anyone who has access to the session file.
|
|||
|
|
|||
|
#### Readonly session
|
|||
|
To use the original session file without updating it from the request/response exchange after it has been created, specify the session name via `--session-read-only=SESSION_NAME_OR_PATH` instead.
|
|||
|
```shell
|
|||
|
# If the session file doesn’t exist, then it is created:
|
|||
|
$ http --session-read-only=./ro-session.json pie.dev/headers Custom-Header:orig-value
|
|||
|
|
|||
|
# But it is not updated:
|
|||
|
$ http --session-read-only=./ro-session.json pie.dev/headers Custom-Header:new-value
|
|||
|
```
|
|||
|
|
|||
|
[Screenshot]: data:image/avif;base64,AAAAIGZ0eXBhdmlmAAAAAGF2aWZtaWYxbWlhZk1BMUEAAADybWV0YQAAAAAAAAAoaGRscgAAAAAAAAAAcGljdAAAAAAAAAAAAAAAAGxpYmF2aWYAAAAADnBpdG0AAAAAAAEAAAAeaWxvYwAAAABEAAABAAEAAAABAAABGgAAvzgAAAAoaWluZgAAAAAAAQAAABppbmZlAgAAAAABAABhdjAxQ29sb3IAAAAAamlwcnAAAABLaXBjbwAAABRpc3BlAAAAAAAABnwAAAP8AAAAEHBpeGkAAAAAAwgICAAAAAxhdjFDgSgAAAAAABNjb2xybmNseAABAA0ABoAAAAAXaXBtYQAAAAAAAAABAAEEAQKDBAAAv0BtZGF0EgAKCjoqc9/3wgIaDSAypv4CRGQAYYYYUPS62DoEDz1hescAf8cFg3a7tJH4c0wYdEwGr52fQKTQ1+msnvmMmDnVb/oLDepriGlv4u1UvofltGMpf3ImirpY3CnvTvJ/pciEhCxBEOh3WaO9msdOWLPfWg7fSWGPSoO2hoQVp2LCOCkaqw4RTaByQPZ+pN7rpDOYeOnysE0Go5VZS+rBXoookO4AVnqpjcwxQoh2RyRojbFoJGk2txGrgE6vQhoMlcM5BKFDoaU/C/zGef5XYVxnmdkUNmPWAjcayeZFeWCoUBxItyv20P3e70+ylxEv1O8IniFtO5/O7wGoThpCb0hYgs0RL/Fp61jtZVbBWgqxlSN8CxtjaUj3pyFw5T/QfQih22lFER7UY+PZTZIsm+GT4SMcqEbLesAQS1fY3jKlG8Oj0yv9kt/YravH+lpN2fuOn4i9bumG1cetjxyEvuSz35GuTr6XupqHh2M6SggwpmzlEWlGgGj3u3B/R7v7VJAx9nlz1bXawlsKWBjUw4yz2ZBjC5Y+gmgIzfUkjug/QScbF1pyO8ihIEm+agmVYB5xXxKaIYf5y/flVX9YNGT5SjgC1E5mqKz+bPWw4Wdc9nF2BxyBSuoWjx+h89nhquCkCleDXVYmm7onzeq8Rz3QUg/wgtmRvjYvkQHPMAtk++riFcNBlI0Oc5NPSNZmq1px9Bg+Z3Kl9AC8vn2Dkml7Na7s8rP4Pe0J02UZmTjpw8seRRAHUfxw4+4GMWa8UR3Vi/2W9JMbSrIirZS73BaQ0p4xRdYwGAiLMSJoqaKSIj9PMgNukzkMYf9yora+XBUlUr6YZlUqjSKPDeruAXbb3iwkMQs5jaKm1pPmglSxzOHa7vt+3FTFbXGjkEjdYLe9cbmX3GXztKka6b9F3dh1muTp9GM39bHTDkjuJrvmWH1+mGI+fCpQ3h6YbbmU9eU5+rTQ+syfuW1NWtD6qu7Z+1w8KBKSqWZqLiJ5y9A4xh0imjD1atyOdD+aCGwM5t7ULjOa2vjQwwJ8eM8KUXGF7ulyFqziBJdvSG8LPQA3I3NL5XJ+leQ98aM6lrJuClq+dr0g9QK+P+FiX8sb9r32QvJLOHJRHJ2kUkPLuVM84FpR5piGFNMN+ObFacoSbNBMbzSNrBMkmVJbnSS/+5Tcuag4w8ssVaNQqq/sj18E03ltJLwmwmwXKPWLo4qqiFaTd6KgOyQPfv5OvQiAxCws8dKP8u/86g4iMwkGhyZmAPy2E2l2BOhvAJPc98A4TR7zCq08aLvxt9ZQBY+QAWNnXmFCoUxtUweY30Gs+/0uA01Nk/KM7MZcj8J4ekEQv9kWv6mj4ngst777f69/sRxcZU7XkWnEPFhpMTY2Gy0f13D8Gm8oAFNwIGRwCNxDo2asbk1WDvqKNxmS4azb5OFSF5eCEc9R8DMRNTX2CZpZLUxbTATe0E3dhapJ5H0hZ/ERdWxX97Ak9VQIqq+OROppq/G4MndyZvPfC2TE+ZyyNI4MEDpCrzuEBh1GwyGJ4DmANBrJjaPMfVWDcpFTexSPZINtbe8attOP4wwWSFnzWOu64n7V6dw0ftmMZ1UEIRaklN41faMvZ6N6wrGKACvCpn0fkkQMceKob2tyNillNm/V/Vkia+9uJM8kBbxiv1G3OF8rOVwR1yzqjsvBRG3a6LCtFK0UH+MJ6//2rqJhvhAMCg2bZVWGrgOc8NxfHI4NC6W76J+YJvvLHhYKFkEPAkhUxr+2A5dHFHHWQ3qmY4d+v/fGe0OwsoDWJCgfrtfdggldZh1HLt8vcuIj8ZSGeynniGwvN9LF+t7WLSvEfykwssSK6C/eYJ0u6JFJLtiVy5o0Cj7MKN4KqPOxumd/6GwG8099HTyJt4kSVWTFdYenUCYF9oaYJFK6jjdAdxeaNhYgCmL27whpP3Lkx3N2pCTD1UynL2RoKWbKoORe9qk6rjh17LuvoUDt7vDXWQ2mIKJ3vI2gBAoKSPqy5RqtOW4npx+5THwOeR6vWwtzYn/fCbCnnHHVJEzYehBZ1z5EgtT/jIRIVX86vvtqu/vTsxWa0UGTvOU/Skf2t+MondZmZ4jApZt2Y8Zwtkjq9ZbU2Tnxwzj6GsTVoSbQDe1ZF7qv1mlLKCDPMev/wfod873uOZ8zo3eecT+6Y9u2pGzlY8TTK9EQd1Tau5iN3smyf00/iIrHDXhkKf6qm8dQRolNcgXMzQEZ1/Mz+n9EBb7BfLYCXarn0FqtF+e8Lnb7qFPg4kHm4SkfjcUq5yoftuoX9npY4w8gQuFusugXcLtmOj4Fshz+IbUNgyRb8UO7T8gl2I9gIfKEzXxWTHX8dFYyoVC6rbDy1tKDM+38FTM9WhJ5effrcw4Y6m7xjp4YrKZIHLy2BYPtOI2eghhUX0FOJmhtq8bnbu4NHFaW049GjYBJor2yMW4FnhzoFV9IQu0SKby/M2b9tgH1hqxNBJ0CheRBKViUsxK4iblWnNuVGPc1q58YnNVJ6V+gi5nvzgnmauPCmFk5SNuCe4dCkwPZ0RZNMzpZjVmK2LH+XwLs4Ylt6L/yXPOhjHhn3pNGGOA5uXe4jobFfZLMF3t/zyaevXXNw1rKWGj5LZAqMpeaYxflerj3Bb7joWyn+JffZ519AzYWInE4f36cIyp6Iqprg5tPttL+EZKrf1hwG0OgKJNSgpDJ4n/k420Ih//5N7NTCJUqiuw/olfH1aD22/6e89SLpqhJzci6LRln14lxJT38XIBYkU8yKpkTt4U2P8QY/xzTLVbyCAQbwrpknl09xQAM6EdYrZxTdcPuG3wGieM/oEOrWwfXlUQqHIhYEpl3HrV3R8Mw5qYJaI/4cpJWb3B4Cy+OBtPd0gmNk2uh51iMWASUZB6K9YUEWrHngZo6f0BXkVLcvF0uy/hcXP3wpaXJyxuUf5Ene5M4wdtfhERNTHuqZoguNjbqYHkvMMt79OSh7f2Jvl75SLE/kzW+8pR6pw5wqyagtXAcH+S05KcGyeKBjObSEPKLZgeTMBP+Mav3G+6wNWvRsljEZP7+a0DmMo0Wc6rKIKw4wdbr4qpLXPrFMgNjWet39jweE2GghhI0A+zmifauYJYfLInQzkPsI7Jf8Ue8XsOIy2K7bzTrk+iVqN2RqdsNRbVXdGslEEeRsrTRoKfcmbmEawC+aS1joaZ65c8hEmJaPRwehWtcWvi6UIxXHLLL5LacRR08B8gF5CB88nG03RBiDNyALSgiTVCAQCpoiNOKG7VeoyurTEqGbM5SFA//z2aN2233VpcFw7oB33NfHiXyUWI6nwV6ZGmMkjz2DAo0MPxA5CDB29ItZNGJq5/3Dk5Z+Jheigy/RKdIly1mcFy0gNywK5CqErlB6NWC4GS6wMGyvB+Y1rn4PLOko9T/T8m12girEFbDqzSGvt1VYBYjSkCIwj9i+fOxQMxrsG+PZmKNS1iONyJeaIr1uiUkLZSI4ZqEBw6iBKsac4uklE/w8cQCcX/rVnI3RtIUboivsSmkBArGr9dMQO4Z5WXQFaa7xaAimlDCisjoG89cTnD/dgJ2cocuklQGY7C+LFeak0Sr7CmdHxGND8RZTWjbrBjcLp4ASu2zLeWtUwOBM9yAI8/myQKiqiJJocJBqJZYSx6jDEQjE/xlufScFB1Qe/Kr3dZYWbwMsI
|