16 changed files with 556 additions and 180 deletions
+8
View File
@@ -1,5 +1,13 @@
# snacforge changelog
## 2.95-sf.2 - 2026-09-11
- Replace the inherited Susie artwork with an original neutral koala mark.
- Identify the project documentation and manuals as snacforge while retaining
the installed `snac` command and manual names for compatibility.
- Rewrite the repository overview in the fork's own voice and remove inherited
promotional, donation, and mascot-lore text.
## 2.95-sf.1 - 2026-09-11
Based on the signed upstream snac 2.95 release.
+1 -1
View File
@@ -69,7 +69,7 @@ update-po:
xgettext --omit-header -j -o $$a --language=C --keyword=L --keyword=LL --from-code=utf-8 *.c ; \
done
activitypub.o: activitypub.c xs.h xs_json.h xs_curl.h xs_url.h xs_mime.h \
activitypub.o: activitypub.c default_avatar.h xs.h xs_json.h xs_curl.h xs_url.h xs_mime.h \
xs_openssl.h xs_regex.h xs_time.h xs_set.h xs_match.h xs_unicode.h \
xs_webmention.h xs_http.h xs_http_codes.h snac.h
data.o: data.c xs.h xs_hex.h xs_io.h xs_json.h xs_openssl.h xs_glob.h \
+68 -120
View File
@@ -1,151 +1,99 @@
![](https://comam.es/snac-doc/susie64.png)
<img src="assets/snacforge-koala-64.png" alt="snacforge koala mark" width="64" height="64">
# snacforge
An independently maintained fork of snac focused on security hardening,
carefully scoped features, and transparently disclosed LLM-assisted development.
snacforge is an independently maintained ActivityPub server derived from
[snac](https://codeberg.org/grunfink/snac2). It concentrates on conservative
security improvements, carefully bounded changes, and reviewable development.
It is not affiliated with or endorsed by the upstream project.
snacforge is based on [snac](https://comam.es/what-is-snac) and retains its MIT
licence and attribution. It is not affiliated with or endorsed by the upstream
project.
## What it provides
## Features
- ActivityPub federation for public posts, replies, follows, boosts, likes,
and private messages
- Multiple local users without requiring a database server
- A small, JavaScript-free web interface
- Mastodon-compatible API support for third-party clients
- Configurable moderation, filtering, notifications, and media handling
- Portable C code with OpenSSL and libcurl as its principal dependencies
- A hardened release build and executable regression checks
- Human-reviewed contributions, with LLM assistance disclosed when used
- Lightweight, minimal dependencies
- Extensive support of ActivityPub operations, e.g. write public notes, follow users, be followed, reply to the notes of others, admire wonderful content (like or boost), write private messages...
- Multiuser
- Mastodon API support, so Mastodon-compatible apps can be used
- Simple but effective web interface
- Easily-accessed MUTE button to silence morons
- Tested interoperability with related software
- No database needed
- Totally JavaScript-free
- No cookies either
- Not much bullshit
- Human-reviewed contributions may use disclosed LLM assistance
## Documentation
## About
The authoritative snacforge manuals are maintained in this repository:
This program runs as a daemon (proxied by a TLS-enabled real httpd server) and provides the basic services for a Fediverse / ActivityPub instance (sharing messages and stuff from/to other systems like Mastodon, Pleroma, Friendica, etc.).
- [`doc/snac.1`](doc/snac.1) — user commands and web-interface behaviour
- [`doc/snac.5`](doc/snac.5) — message formatting and on-disk formats
- [`doc/snac.8`](doc/snac.8) — installation and server administration
This is not the manual; man pages `snac(1)` (user manual), `snac(5)` (formats) and `snac(8)` (administrator manual) are what you are looking for.
The installed command and manual names remain `snac`, `snac(1)`, `snac(5)`,
and `snac(8)` for operational compatibility with existing installations and
scripts. Each manual identifies the software as snacforge and notes this
compatibility convention.
`snac` stands for Social Networks Are Crap.
## Building and installing
## Building and installation
This program is written in highly portable C. It uses the `__attribute__((__cleanup__))` GNU extension, that is supported at least by the `gcc`, `clang` and `tcc` C compilers. The only external dependencies are `openssl` and `curl`.
On Debian/Ubuntu, you can satisfy these requirements by running
The code uses the GNU `__attribute__((__cleanup__))` extension supported by
GCC, Clang, and Tiny C Compiler. Install OpenSSL and libcurl development files,
then build:
```sh
apt install libssl-dev libcurl4-openssl-dev
make
sudo make install
```
On OpenBSD you just need to install `curl`:
Use `make release` for a hardened production binary. On supported ELF
toolchains this enables PIE, strong stack protection, FORTIFY, full RELRO, and
immediate binding.
```sh
pkg_add curl
```
Run the deterministic regression test with `make check`. `make test` also
builds the SMTP test, which requires a local SMTP server and is therefore not
run automatically. See [`UPSTREAM.md`](UPSTREAM.md) for the reviewed upstream
update procedure.
On FreeBSD, to install `curl` just type:
Platform notes:
```sh
pkg install curl
```
- NetBSD: use `make -f Makefile.NetBSD` and
`make -f Makefile.NetBSD install`.
- Systems requiring POSIX realtime linkage: use `make LDFLAGS=-lrt`.
- Systems without shared-memory functions: use
`make CFLAGS=-DWITHOUT_SHM`.
- To omit the Mastodon API: use `make CFLAGS=-DNO_MASTODON_API`.
- Linux Landlock support is opt-in with
`make CFLAGS=-DWITH_LINUX_SANDBOX` and requires Linux 5.13 or newer.
On NetBSD, to install `curl` just type:
After initialising an instance, copy a desired translation from `po/` into the
instance's `lang/` directory. Deployment, proxy, configuration, migration, and
maintenance details are in `snac(8)`.
```sh
pkgin install curl
```
## Docker development environment
The snacforge source code is available at <https://git.sdf.org/erici/snacforge>.
The upstream snac source is available at <https://comam.es/what-is-snac>.
Run `make` and then `make install` as root. For a hardened production binary,
run `make release`; this enables PIE, strong stack protection, FORTIFY, full
RELRO, and immediate binding on supported ELF toolchains.
Run the deterministic regression test with `make check`. The separate SMTP
test is built by `make test` but is not run automatically because it expects a
local SMTP server. See `UPSTREAM.md` for the fork update procedure.
If you're compiling on NetBSD, you should use the specific provided Makefile and run `make -f Makefile.NetBSD` and then `make -f Makefile.NetBSD install` as root.
From version 2.27, `snac` includes support for the Mastodon API; if you are not interested on it, you can compile it out by running
```sh
make CFLAGS=-DNO_MASTODON_API
```
If your compilation process complains about undefined references to `shm_open()` and `shm_unlink()` (it happens, for example, on Ubuntu 20.04.6 LTS), run it as:
```sh
make LDFLAGS=-lrt
```
If it still gives compilation errors (because your system does not implement the shared memory functions), you can fix it with
```sh
make CFLAGS=-DWITHOUT_SHM
```
From version 2.68, Linux Landlock sandboxing is included (not supported on Linux kernels older than 5.13.0). It's still a bit experimental, so you must compile it in explicitly with
```sh
make CFLAGS=-DWITH_LINUX_SANDBOX
```
From version 2.73, the language of the web UI can be configured; the `po/` source subdirectory includes a set of translation files, one per language. After initializing your instance, copy whatever language file you want to use to the `lang/` subdirectory of the base directory.
See the administrator manual on how to proceed from here.
## Testing via Docker
A `docker-compose` file is provided for development and testing. To start snac with an nginx HTTPS frontend, run:
The supplied Compose setup runs snacforge behind an nginx HTTPS frontend:
```sh
docker-compose build && docker-compose up
```
This will:
It stores disposable development data under `data/`, creates a `testuser`, and
generates a fresh self-signed certificate at container startup. Do not use that
setup or its credentials as a production deployment.
- Start snac, storing data in `data/`
- Configure snac to listen on port 8001 with a server name of `localhost` (see `examples/docker-entrypoint.sh`)
- Create a new user `testuser` and print the user's generated password on the console (see `examples/docker-entrypoint.sh`)
- Start nginx to handle HTTPS, generating an ephemeral self-signed development
certificate at container startup (see `examples/nginx-alpine-ssl/entrypoint.sh`)
## Project links
## Links of Interest
- Source: <https://git.sdf.org/erici/snacforge>
- Security policy: [`SECURITY.md`](SECURITY.md)
- Contribution policy: [`CONTRIBUTING.md`](CONTRIBUTING.md)
- Release history: [`CHANGELOG.md`](CHANGELOG.md)
- Upstream project: <https://codeberg.org/grunfink/snac2>
- [Online snac manuals (user, administrator and data formats)](https://comam.es/snac-doc/).
- [How to install snac on OpenBSD without relayd (by @antics@mastodon.nu)](https://chai.guru/pub/openbsd/snac.html).
- [Setting up Snac in OpenBSD (by Yonle)](https://wiki.ircnow.org/index.php?n=Openbsd.Snac).
- [How to run your own social network with snac (by Giacomo Tesio)](https://encrypted.tesio.it/2024/12/18/how-to-run-your-own-social-network.html). Includes information on how to run snac as a CGI.
- [Improving snac Performance with Nginx Proxy Cache (by Stefano Marinelli)](https://it-notes.dragas.net/2025/01/29/improving-snac-performance-with-nginx-proxy-cache/).
- [Caching Snac Proxied Media With Nginx (by Stefano Marinelli)](https://it-notes.dragas.net/2025/02/08/caching-snac-proxied-media-with-nginx/).
- [My snac config (activitypub instance) with Caddy (by ffuentes)](https://ffuentes.sdf.org/communication/2025/08/23/my-snac-config-activitypub-instance-with-caddy.html).
- [A bit of lore about Susie, snac's default avatar](https://comam.es/snac/grunfink/p/1754553922.333170).
Third-party deployment guides and CSS themes written for snac may remain useful
because snacforge preserves its command, data, and web-theme interfaces, but
they are not maintained or endorsed by this project.
## Incredibly awesome CSS themes for snac
## Licence and credits
- [A compilation of themes for snac (by Ворон)](https://codeberg.org/voron/snac-style).
- [A cool, elegant theme (by Haijo7)](https://codeberg.org/Haijo7/snac-custom-css).
- [A terminal-like theme (by Tetra)](https://codeberg.org/ERROR404NULLNOTFOUND/snac-terminal-theme).
## License
See the LICENSE file for details.
## Contributing
See the CONTRIBUTING.md file for details.
## Author
grunfink [@grunfink@comam.es](https://comam.es/snac/grunfink) with the help of others.
Buy grunfink a coffee: https://ko-fi.com/grunfink/
Contribute via LiberaPay: https://liberapay.com/grunfink/
snacforge is distributed under the MIT licence; see [`LICENSE`](LICENSE).
The fork retains the upstream copyright notices and credits required by that
licence. Fork-specific changes are documented in the Git history and
`CHANGELOG.md`.
+15 -5
View File
@@ -3,11 +3,21 @@
## Reporting a vulnerability
Please do not open a public issue for an undisclosed vulnerability. Contact the
snacforge maintainer in an end-to-end encrypted Matrix direct message at
`@eric:sns.gdn`. Include affected versions, reproduction steps, impact, and any
suggested mitigation. If Matrix is unavailable, open a minimal public issue
asking the maintainer to establish a private reporting channel; do not include
vulnerability details.
snacforge maintainer using one of these private reporting channels:
- End-to-end encrypted Matrix direct message: `@eric:sns.gdn`
- OMEMO-encrypted XMPP message: `erici@xmpp.sns.gdn`
- PGP-encrypted email: `erici@sdf.org`
The PGP public key is available at
https://erici.sdf.org/public-key.asc. Verify its fingerprint before use:
`4E25 DCA8 A531 6763 A439 1BD2 4AE3 B4BF 07EB EB4F`
Include affected versions, reproduction steps, impact, and any suggested
mitigation. If none of the private channels are available, open a minimal
public issue asking the maintainer to establish a private reporting channel;
do not include vulnerability details.
Receipt should be acknowledged within seven days. Status updates are normally
provided at least every 14 days until resolution. Reporters are asked to allow
+16 -36
View File
@@ -16,52 +16,32 @@
#include "xs_http.h"
#include "snac.h"
#include "default_avatar.h"
#include <stddef.h>
#include <sys/wait.h>
const char * const public_address = "https:/" "/www.w3.org/ns/activitystreams#Public";
/* susie.png */
const char * const susie =
"iVBORw0KGgoAAAANSUhEUgAAAEAAAABAAQAAAAC"
"CEkxzAAAAUUlEQVQoz43R0QkAMQwCUDdw/y3dwE"
"vsvzlL4X1IoQkAisKmwfAFT3RgJHbQezpSRoXEq"
"eqCL9BJBf7h3QbOCCxV5EVWMEMwG7K1/WODtlvx"
"AYTtEsDU9F34AAAAAElFTkSuQmCC";
const char * const susie_cool =
"iVBORw0KGgoAAAANSUhEUgAAAEAAAABAAQAAAAC"
"CEkxzAAAAV0lEQVQoz43RwQ3AMAwCQDZg/y3ZgN"
"qo3+JaedwDOUQBQFHYaTB8wTM6sGl2cMPu+DFzn"
"+ZcgN7wF7ZVihXkfSlWIVzIA6dbQzaygllpNuTX"
"ZmmFNlvxADX1+o0cUPMbAAAAAElFTkSuQmCC";
const char * const susie_muertos =
"iVBORw0KGgoAAAANSUhEUgAAAEAAAABAAQAAAAC"
"CEkxzAAAAV0lEQVQoz4XQsQ0AMQxCUW/A/lv+DT"
"ic6zGRolekIMyMELNp8PiCEw6Q4w4NoAt53IH5m"
"xXksrZYgZwJrIox+Z8vJAfe2lCxG6AK7eKkWcEb"
"QHbF617xAQatAAD7jJHUAAAAAElFTkSuQmCC";
const char *default_avatar_base64(void)
xs_str *default_avatar_base64(void)
/* returns the default avatar in base64 */
{
time_t t = time(NULL);
struct tm tm;
const char *p = susie;
return xs_base64_enc((const char *)snacforge_default_avatar_png,
snacforge_default_avatar_png_len);
}
gmtime_r(&t, &tm);
if (tm.tm_mon == 10 && tm.tm_mday == 2)
p = susie_muertos;
else
if (tm.tm_wday == 0 || tm.tm_wday == 6)
p = susie_cool;
xs_str *default_avatar_data(int *size)
/* returns a copy of the default avatar PNG */
{
xs_str *data;
return p;
*size = snacforge_default_avatar_png_len;
data = xs_realloc(NULL, *size + 1);
memcpy(data, snacforge_default_avatar_png, *size);
data[*size] = '\0';
return data;
}
@@ -1819,7 +1799,7 @@ xs_dict *msg_actor(snac *snac)
p = xs_dict_get(snac->config, "avatar");
if (*p == '\0')
avtr = xs_fmt("%s/susie.png", srv_baseurl);
avtr = xs_fmt("%s/snacforge.png", srv_baseurl);
else
avtr = xs_dup(p);
+10
View File
@@ -0,0 +1,10 @@
# Artwork
`snacforge-koala-64.png` is the default snacforge avatar and repository mark.
It was generated for this project with OpenAI's built-in image-generation tool
from an original prompt, then reviewed and resized to 64×64 pixels. It is not
derived from the upstream Susie artwork.
The prompt requested a friendly, front-facing flat koala head with a restrained
red circular accent, a transparent background, no text or trademarks, and
clear rendering at 64×64 pixels.
Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

+401
View File
@@ -0,0 +1,401 @@
/* Generated from assets/snacforge-koala-64.png. */
static const unsigned char snacforge_default_avatar_png[] = {
0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40,
0x08, 0x06, 0x00, 0x00, 0x00, 0xaa, 0x69, 0x71, 0xde, 0x00, 0x00, 0x12,
0x5d, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0xed, 0x9a, 0x69, 0x6c, 0x5c,
0xd7, 0x75, 0xc7, 0x7f, 0xe7, 0xbe, 0x59, 0x38, 0x1b, 0x57, 0x71, 0x91,
0x44, 0x8a, 0xa2, 0x65, 0x59, 0x9b, 0x65, 0xc7, 0xb6, 0x64, 0x51, 0x0b,
0xec, 0xc4, 0x76, 0x1c, 0xc7, 0x69, 0xbc, 0x64, 0x6b, 0xb3, 0x37, 0x41,
0x53, 0x14, 0x68, 0x02, 0xe4, 0x43, 0x51, 0x14, 0x45, 0x91, 0x06, 0x05,
0xfa, 0xa1, 0x40, 0xfb, 0xa1, 0x86, 0x03, 0xa4, 0x41, 0xd1, 0x06, 0x4d,
0x9a, 0x26, 0x4e, 0x93, 0x38, 0x4e, 0xe4, 0x78, 0x51, 0x24, 0x47, 0xd1,
0x42, 0xc9, 0xb6, 0xbc, 0x68, 0x31, 0xb5, 0x59, 0xdc, 0xc4, 0x6d, 0x86,
0xe4, 0x70, 0xf6, 0x99, 0x37, 0xef, 0x9e, 0x7e, 0x98, 0x45, 0xa4, 0x44,
0x25, 0x91, 0xeb, 0x7c, 0x0a, 0xff, 0xc0, 0x80, 0x33, 0x8f, 0x77, 0x39,
0xe7, 0x7f, 0x96, 0x7b, 0xee, 0xbd, 0x0f, 0x96, 0xb1, 0x8c, 0x65, 0x2c,
0x63, 0x19, 0xcb, 0x58, 0xc6, 0x32, 0x96, 0xb1, 0x8c, 0x65, 0x2c, 0xe3,
0x0f, 0x10, 0xf2, 0xdb, 0x1a, 0x6c, 0xbe, 0xfd, 0x0e, 0x1a, 0x23, 0x61,
0x54, 0xf1, 0x01, 0xab, 0x81, 0xf5, 0x22, 0xb2, 0x56, 0x55, 0x5b, 0x44,
0x04, 0x20, 0x01, 0x5c, 0x54, 0xd5, 0xf3, 0xc0, 0x14, 0x60, 0x8f, 0x1d,
0x3d, 0xfc, 0x7b, 0x11, 0xb6, 0x7f, 0xd7, 0x1e, 0x00, 0xa3, 0xaa, 0x5d,
0x22, 0x72, 0x8b, 0x88, 0xf4, 0xa9, 0xea, 0x0a, 0x55, 0x15, 0x11, 0x99,
0x03, 0x86, 0x54, 0xf5, 0xbc, 0xaa, 0x5e, 0x16, 0x11, 0x37, 0x95, 0xc9,
0xf2, 0xd6, 0xc9, 0xd7, 0xdf, 0x19, 0x01, 0xdb, 0xb7, 0xf7, 0x23, 0x3e,
0x07, 0x54, 0xa3, 0x22, 0x72, 0x3f, 0xc2, 0x27, 0x04, 0xe9, 0x07, 0xba,
0x80, 0x06, 0xc0, 0x54, 0x47, 0xb0, 0x82, 0x64, 0x55, 0x75, 0x0c, 0x91,
0x03, 0xa8, 0xfe, 0xb7, 0xaa, 0x1e, 0x07, 0x29, 0x1f, 0x3b, 0x7a, 0xe8,
0x5d, 0x51, 0x7c, 0xc7, 0xce, 0xdd, 0xa0, 0xf8, 0x10, 0xfa, 0x45, 0xe4,
0x53, 0x22, 0xf2, 0x3e, 0xa0, 0x1b, 0x08, 0x57, 0x09, 0x01, 0xb0, 0x40,
0xa1, 0x6a, 0x84, 0x01, 0xe0, 0x29, 0x55, 0xdd, 0x27, 0x22, 0x99, 0x7c,
0xa1, 0xc8, 0x1b, 0x27, 0x5e, 0xfe, 0xdd, 0x09, 0xb8, 0xbb, 0x7f, 0x17,
0xc6, 0x18, 0x54, 0xf5, 0x56, 0xe0, 0xeb, 0x22, 0x7c, 0x10, 0x24, 0xac,
0x15, 0x50, 0xb5, 0x3c, 0x5a, 0x1d, 0x40, 0x44, 0x90, 0xea, 0x43, 0x55,
0x9d, 0x11, 0x91, 0xff, 0x52, 0xd5, 0x7f, 0x06, 0xc6, 0x45, 0x84, 0xa3,
0x87, 0x7f, 0xfd, 0x8e, 0x14, 0xdf, 0xbe, 0x63, 0x27, 0xc6, 0x71, 0x40,
0x75, 0x35, 0xf0, 0x57, 0x22, 0xf2, 0x59, 0x11, 0x69, 0xab, 0xce, 0xa3,
0xaa, 0x5a, 0x93, 0x41, 0xab, 0xcf, 0x44, 0x44, 0x30, 0x46, 0x44, 0x95,
0x9c, 0xaa, 0xfe, 0x42, 0xe1, 0xeb, 0x02, 0xa7, 0x54, 0x95, 0xe3, 0x03,
0x47, 0xae, 0x99, 0xc3, 0xb7, 0x24, 0x2b, 0x62, 0x50, 0xd5, 0x46, 0x90,
0xaf, 0x89, 0xf0, 0x38, 0x20, 0x8e, 0xe3, 0x68, 0x6f, 0x4f, 0x37, 0xab,
0x56, 0x76, 0x11, 0x89, 0x44, 0x30, 0xc6, 0x68, 0xb1, 0x54, 0x64, 0x6e,
0x6e, 0x5e, 0x26, 0xa7, 0xa6, 0x34, 0x91, 0x98, 0xa1, 0xe4, 0xba, 0x6a,
0x8c, 0xb4, 0x02, 0x5f, 0x15, 0x91, 0xdb, 0x40, 0xbf, 0x0c, 0x0c, 0xf6,
0xef, 0xde, 0x83, 0x2d, 0x2b, 0x62, 0x08, 0x00, 0x8d, 0x22, 0x66, 0x0e,
0xc1, 0x1b, 0xa8, 0x12, 0xb3, 0x63, 0xe7, 0x1e, 0x44, 0x70, 0x80, 0x16,
0x55, 0x4d, 0x19, 0x43, 0xc9, 0x75, 0x2d, 0xc6, 0x18, 0x50, 0xbb, 0x11,
0xe4, 0x49, 0x11, 0xb9, 0x4f, 0x44, 0x50, 0x55, 0x0d, 0xf8, 0xfd, 0xb4,
0xb5, 0xb5, 0x6a, 0x67, 0x47, 0x3b, 0xad, 0x2d, 0x2d, 0xd2, 0xd0, 0x10,
0xc4, 0xb3, 0x96, 0x6c, 0x26, 0xab, 0xe3, 0x93, 0x93, 0x0c, 0x8f, 0x8c,
0xa9, 0xb5, 0x5e, 0x08, 0xe4, 0x71, 0x01, 0x6b, 0xad, 0xfe, 0x99, 0x88,
0xa4, 0x96, 0xd2, 0x75, 0x49, 0x02, 0x40, 0x51, 0x70, 0x8d, 0x70, 0x00,
0xd8, 0xa3, 0xaa, 0x2b, 0x3d, 0xcf, 0xd3, 0x15, 0x2b, 0xda, 0x78, 0xff,
0xfd, 0xef, 0x25, 0x12, 0x09, 0x83, 0x22, 0x0a, 0x58, 0xeb, 0x91, 0xcd,
0xe5, 0x19, 0x1a, 0x1e, 0xd1, 0x97, 0x5f, 0x79, 0x8d, 0xf3, 0x17, 0x2e,
0x6a, 0xd9, 0x7a, 0x22, 0xc8, 0xfd, 0xaa, 0x7c, 0x43, 0xd5, 0x7e, 0xd6,
0x18, 0x93, 0x30, 0x0e, 0x0f, 0x2b, 0xfa, 0x39, 0x94, 0x98, 0xaa, 0x7d,
0x42, 0xad, 0x76, 0x6c, 0xef, 0xdf, 0xd5, 0x89, 0xaa, 0x5a, 0xeb, 0x4d,
0x19, 0x63, 0x66, 0x44, 0xe4, 0x2b, 0x22, 0x32, 0xaf, 0xca, 0x77, 0x7c,
0x3e, 0xe7, 0x59, 0x55, 0x6d, 0x17, 0x31, 0xdf, 0x00, 0xee, 0x03, 0xd4,
0x71, 0x1c, 0xbd, 0xe5, 0xe6, 0x75, 0xb2, 0xfd, 0xae, 0x3b, 0xe8, 0x5d,
0xd3, 0x2d, 0x91, 0x70, 0x18, 0xe3, 0x98, 0x8a, 0xcd, 0x44, 0x34, 0x9b,
0xcd, 0xb1, 0xf7, 0xb9, 0x17, 0xb9, 0x34, 0x34, 0x22, 0xd6, 0xaa, 0x88,
0x91, 0x29, 0x94, 0x97, 0x44, 0xc4, 0x95, 0xeb, 0x04, 0xfb, 0xa2, 0xc7,
0xdb, 0x76, 0xec, 0xc4, 0xe7, 0x38, 0xa8, 0xea, 0x2a, 0x11, 0xf9, 0x1b,
0x55, 0xfd, 0x94, 0x31, 0xa6, 0xa5, 0xb3, 0xa3, 0x5d, 0x36, 0xac, 0xbf,
0x99, 0xb5, 0xbd, 0x6b, 0xf4, 0xa6, 0xbe, 0x5e, 0x42, 0xa1, 0x06, 0x41,
0xab, 0x21, 0x20, 0x20, 0x22, 0x2a, 0x62, 0x28, 0x14, 0x0a, 0xf2, 0xf2,
0xab, 0xaf, 0xe9, 0xbe, 0x03, 0xbf, 0x22, 0x9b, 0xcd, 0xd5, 0xc6, 0xfe,
0x0f, 0xcf, 0x7a, 0x79, 0xbf, 0xcf, 0xff, 0xa7, 0x22, 0x44, 0xcb, 0x65,
0xcf, 0x0d, 0x06, 0x03, 0x85, 0x68, 0x24, 0x1a, 0x09, 0x06, 0x03, 0x06,
0xa0, 0x50, 0x28, 0xda, 0x6c, 0x2e, 0x97, 0x2b, 0x16, 0x8b, 0x41, 0x9f,
0xe3, 0xf8, 0xad, 0x6a, 0xa6, 0x5c, 0x2e, 0x7f, 0xdb, 0x71, 0x9c, 0xb0,
0x88, 0x7c, 0x41, 0x55, 0x89, 0x44, 0xc2, 0xfa, 0xc0, 0xfb, 0xee, 0x95,
0xed, 0x77, 0xdd, 0x41, 0x30, 0x18, 0x44, 0xd5, 0xd6, 0x6c, 0x55, 0xd5,
0x42, 0xc8, 0x17, 0x0a, 0x5c, 0xba, 0x34, 0xcc, 0xa5, 0xa1, 0x61, 0xce,
0x9e, 0xbf, 0xc0, 0x74, 0x3c, 0xae, 0xd6, 0xea, 0x2c, 0xc2, 0xf7, 0x50,
0xfe, 0x09, 0x18, 0x57, 0xab, 0x1c, 0x1b, 0x38, 0x7c, 0x2d, 0x01, 0x77,
0xf7, 0xef, 0x44, 0xc4, 0x00, 0xac, 0x15, 0x91, 0x6f, 0xaa, 0xea, 0x83,
0xb1, 0x68, 0x94, 0x3d, 0xbb, 0xfb, 0xd9, 0x76, 0xc7, 0xed, 0x34, 0x36,
0x36, 0x62, 0x44, 0xd4, 0xaa, 0xa5, 0x9a, 0x74, 0xea, 0xfd, 0xfd, 0xfe,
0x00, 0x22, 0x82, 0xeb, 0x96, 0x10, 0x11, 0x4e, 0xbc, 0xfe, 0x26, 0x3f,
0x79, 0xe6, 0x59, 0xcd, 0xe7, 0x73, 0xe2, 0x38, 0x3e, 0xaf, 0x7b, 0xf5,
0x2a, 0xd9, 0x7a, 0xeb, 0x66, 0x73, 0xf9, 0xf2, 0x84, 0x46, 0xa3, 0x11,
0xd9, 0xb4, 0x61, 0x3d, 0x2b, 0xda, 0xda, 0x34, 0x18, 0x0c, 0xa0, 0x40,
0xb1, 0x50, 0x94, 0x99, 0xd9, 0x59, 0x06, 0xcf, 0x9e, 0xd7, 0x74, 0x26,
0x4b, 0xf7, 0xea, 0x95, 0x72, 0xf2, 0xf4, 0x19, 0x3b, 0x3a, 0x36, 0xae,
0x9e, 0xe7, 0x99, 0x70, 0x28, 0x24, 0x8f, 0x7e, 0xf8, 0x83, 0xdc, 0xf9,
0x9e, 0xdb, 0x40, 0xc1, 0xe7, 0xaf, 0x38, 0xae, 0xeb, 0xba, 0x55, 0x11,
0xb4, 0x1a, 0xba, 0x52, 0xcb, 0x5d, 0xcc, 0xa7, 0xd2, 0x9c, 0x78, 0xed,
0x0d, 0x0e, 0x1e, 0x3e, 0x4a, 0x3a, 0x9d, 0x41, 0x44, 0x5e, 0x00, 0xfe,
0x02, 0x18, 0x42, 0x85, 0x81, 0xa3, 0xbf, 0x5e, 0x4c, 0xc0, 0x8e, 0x9d,
0xbb, 0x01, 0x62, 0x22, 0xf2, 0xef, 0xc0, 0x27, 0x1a, 0x1b, 0x63, 0xfa,
0x91, 0x47, 0x3e, 0xa4, 0x9b, 0x37, 0x6d, 0x14, 0xa9, 0x24, 0x18, 0x14,
0xc5, 0xe7, 0xf3, 0xd3, 0xd4, 0xd4, 0xa8, 0x91, 0x48, 0x14, 0x9f, 0xe3,
0x88, 0x5b, 0x76, 0x41, 0x21, 0x1a, 0x8b, 0x11, 0x8f, 0xc7, 0x99, 0x99,
0x49, 0x00, 0xb0, 0xf7, 0xb9, 0x7d, 0x3a, 0x78, 0xf6, 0x3c, 0x7b, 0x76,
0xdd, 0x2d, 0xb7, 0x6e, 0xde, 0x44, 0x28, 0x14, 0xd2, 0x4c, 0x36, 0x4b,
0x2c, 0x1a, 0x11, 0xc7, 0x38, 0x28, 0x4a, 0x8d, 0xc7, 0x8a, 0x01, 0x45,
0xd5, 0x5a, 0x32, 0xd9, 0x2c, 0xd1, 0x48, 0x44, 0x72, 0xf9, 0x3c, 0x27,
0x4f, 0xbf, 0xa5, 0x87, 0x8e, 0x1c, 0x63, 0xd3, 0x86, 0xf5, 0xf2, 0xc1,
0x07, 0xef, 0x47, 0x8c, 0xd0, 0xd6, 0xb6, 0x82, 0xf6, 0xf6, 0x15, 0x64,
0xd2, 0x19, 0x10, 0xf0, 0xf9, 0xfc, 0x78, 0x5e, 0x99, 0x6c, 0x26, 0xcb,
0x7c, 0x6a, 0x1e, 0xd7, 0x75, 0x11, 0x31, 0x18, 0x53, 0x51, 0xed, 0xf4,
0x99, 0xb3, 0xfa, 0xe3, 0x9f, 0xfe, 0x4c, 0xe6, 0x53, 0x69, 0x11, 0x91,
0xa7, 0x54, 0xf5, 0x4b, 0x40, 0xaa, 0xb6, 0x54, 0x0b, 0xc0, 0x8e, 0x5d,
0xbb, 0x11, 0x04, 0x45, 0xbf, 0x24, 0xc8, 0x93, 0x8e, 0xe3, 0xf8, 0x1f,
0xfd, 0xa3, 0x87, 0xd8, 0xb9, 0x63, 0x3b, 0xd6, 0xda, 0x6a, 0x9e, 0x55,
0xa2, 0xb1, 0x28, 0xdd, 0xab, 0xbb, 0x89, 0x44, 0xa3, 0x95, 0x04, 0x55,
0xcb, 0x18, 0xd6, 0x82, 0x08, 0xd6, 0x5a, 0x86, 0x86, 0x86, 0x98, 0x9b,
0x9b, 0x25, 0x93, 0xcd, 0xe1, 0x96, 0x5c, 0x5a, 0x5b, 0x9b, 0x2b, 0x8a,
0xaa, 0xd6, 0x86, 0xe1, 0x4a, 0x3c, 0xd6, 0xbe, 0xd4, 0x3d, 0xaa, 0x6e,
0xd1, 0xea, 0xca, 0xc2, 0xcc, 0xec, 0x9c, 0xfa, 0x7d, 0x3e, 0x89, 0x44,
0x22, 0xb4, 0xb6, 0xb6, 0xb0, 0x76, 0x6d, 0x5f, 0xdd, 0xca, 0x8b, 0x64,
0x50, 0x25, 0x93, 0xc9, 0x30, 0x3a, 0x32, 0x42, 0x26, 0x9b, 0xc1, 0x88,
0x41, 0x01, 0xc7, 0x71, 0x38, 0x32, 0x70, 0x5c, 0x7f, 0xfa, 0xf3, 0x5f,
0x88, 0xe7, 0x79, 0x2e, 0xf0, 0x15, 0xe0, 0x5b, 0x00, 0x03, 0x47, 0x0e,
0x55, 0xd6, 0x72, 0xa9, 0x08, 0xd2, 0x6c, 0xc4, 0x7c, 0x1e, 0x08, 0x34,
0xc6, 0x62, 0x5a, 0x2a, 0xb9, 0xba, 0x6f, 0xff, 0xaf, 0x48, 0xcc, 0xcc,
0x22, 0x82, 0x86, 0xc3, 0x61, 0xed, 0xed, 0xed, 0x25, 0x1a, 0x8b, 0x51,
0xcd, 0xc6, 0xf5, 0x4f, 0x4d, 0x23, 0xc7, 0x71, 0x68, 0x6e, 0x6e, 0x06,
0x84, 0x68, 0x24, 0x42, 0x4b, 0x4b, 0x33, 0xd6, 0xd6, 0xda, 0x80, 0x2e,
0xd4, 0x73, 0x51, 0xfa, 0x91, 0xab, 0xc8, 0xa8, 0x8c, 0x6f, 0x3d, 0x4b,
0x6b, 0x4b, 0xb3, 0x44, 0xa3, 0x51, 0x44, 0x84, 0xe6, 0xe6, 0x66, 0x1c,
0xc7, 0xa9, 0xbb, 0xfb, 0x42, 0x19, 0x04, 0x88, 0xc5, 0x62, 0xac, 0xed,
0xeb, 0x23, 0x1c, 0x8e, 0x28, 0x82, 0xce, 0xcc, 0xce, 0xf2, 0xe2, 0xfe,
0x97, 0x28, 0x95, 0x4a, 0x34, 0xc6, 0x62, 0x0a, 0x04, 0x80, 0xcf, 0x29,
0xda, 0x5c, 0x13, 0xc5, 0x2c, 0x90, 0x62, 0x0b, 0xb0, 0x55, 0x44, 0xec,
0x7c, 0x2a, 0xc5, 0xf3, 0xfb, 0xf6, 0x83, 0x08, 0xad, 0x2d, 0xcd, 0xf5,
0x06, 0xa9, 0x54, 0x5a, 0xbd, 0x72, 0x79, 0xe9, 0x6c, 0x2a, 0x42, 0x3a,
0x9d, 0x66, 0x72, 0x62, 0xa2, 0xaa, 0xa9, 0x2e, 0xcc, 0x15, 0xd5, 0x36,
0x35, 0xae, 0x96, 0x4a, 0xc9, 0xf5, 0xaa, 0xe2, 0x0a, 0x29, 0x02, 0x6a,
0x2b, 0x63, 0xa1, 0xca, 0xc4, 0xc4, 0x04, 0xe9, 0x74, 0x9a, 0xeb, 0x65,
0xf4, 0x72, 0xb9, 0x4c, 0x2a, 0x95, 0xaa, 0xcf, 0xdd, 0xd2, 0xdc, 0x8c,
0x88, 0xf0, 0xfc, 0xbe, 0xfd, 0xcc, 0xa7, 0x52, 0x88, 0x88, 0x05, 0xb6,
0x0a, 0xb2, 0xb9, 0x36, 0xc4, 0x42, 0x02, 0x42, 0xc0, 0x5e, 0x60, 0xcc,
0x5a, 0x6b, 0x36, 0x6f, 0xdc, 0x20, 0xf7, 0xec, 0xee, 0xc7, 0xe7, 0xf3,
0x01, 0x42, 0x38, 0x12, 0xa6, 0xb5, 0xa5, 0x45, 0x1c, 0xdf, 0xb5, 0x2b,
0xa7, 0x88, 0x90, 0xcb, 0xe5, 0x18, 0x1e, 0x1e, 0x26, 0x97, 0xcf, 0x55,
0xb5, 0x94, 0x8a, 0xc2, 0x5c, 0xed, 0xf2, 0x0b, 0x2d, 0x7d, 0xb5, 0xeb,
0x5f, 0x33, 0xf2, 0xa2, 0xc7, 0xf9, 0x5c, 0x9e, 0xe1, 0xa1, 0x21, 0xb2,
0xd9, 0xdc, 0x35, 0xad, 0x15, 0xf0, 0x39, 0x0e, 0xad, 0xad, 0xad, 0x84,
0xc3, 0x61, 0x51, 0x45, 0x1c, 0xc7, 0x70, 0xcf, 0xee, 0x7e, 0xb6, 0x6c,
0xda, 0x28, 0xd6, 0x5a, 0x03, 0x5c, 0x16, 0x91, 0xbd, 0x40, 0x43, 0x6d,
0xe0, 0x3a, 0x01, 0xaa, 0xba, 0x1f, 0x78, 0x46, 0x55, 0x5b, 0x23, 0x91,
0xb0, 0xee, 0xd9, 0xd5, 0x4f, 0x30, 0x10, 0xc4, 0x5a, 0x25, 0x16, 0x8b,
0x49, 0x77, 0x77, 0x8f, 0x04, 0x02, 0x81, 0xa5, 0x44, 0xc4, 0x75, 0x5d,
0xc6, 0x46, 0x47, 0xc9, 0xe7, 0xf3, 0xb5, 0x95, 0x64, 0x81, 0x02, 0x72,
0x95, 0x98, 0x4b, 0xaa, 0xb9, 0x38, 0x20, 0x16, 0xe9, 0x2d, 0x75, 0x22,
0xc4, 0x08, 0xf9, 0x42, 0x9e, 0xb1, 0xb1, 0x31, 0x75, 0xcb, 0xee, 0x35,
0x83, 0x29, 0x10, 0x08, 0x04, 0xe8, 0xe9, 0x59, 0x43, 0x63, 0x2c, 0x86,
0xb5, 0x4a, 0x20, 0x10, 0x60, 0xcf, 0xae, 0x7e, 0x8d, 0x44, 0xc2, 0xaa,
0xaa, 0x2d, 0xaa, 0xfa, 0xb4, 0x67, 0xf5, 0xa5, 0xda, 0x04, 0xb5, 0x2a,
0x02, 0x31, 0x26, 0x00, 0x7c, 0x5a, 0x55, 0xa3, 0x7d, 0xbd, 0x6b, 0x74,
0xf5, 0xaa, 0x95, 0x58, 0xad, 0x54, 0x63, 0x1d, 0x1d, 0xed, 0xf8, 0xfd,
0xfe, 0xeb, 0x88, 0x0f, 0xd3, 0xd3, 0x53, 0xa4, 0x2a, 0x2e, 0x76, 0x1d,
0xf7, 0x14, 0x96, 0x50, 0x73, 0xf1, 0xef, 0xab, 0xb9, 0xba, 0x6e, 0xe1,
0x22, 0xa4, 0x52, 0x29, 0xa6, 0xa7, 0xa6, 0x97, 0xfc, 0xbf, 0xaa, 0xe2,
0xf7, 0xfb, 0xe9, 0xec, 0xea, 0xc2, 0x18, 0x83, 0xf5, 0x2c, 0xab, 0x57,
0xad, 0xa4, 0xaf, 0xb7, 0x57, 0x55, 0x35, 0x0a, 0x7c, 0xc6, 0x31, 0x12,
0xa8, 0x25, 0x24, 0x53, 0xeb, 0x84, 0xea, 0x7a, 0x60, 0x9b, 0x88, 0xe8,
0xda, 0xde, 0x35, 0x04, 0xfc, 0x7e, 0x54, 0x21, 0x18, 0x0c, 0x6a, 0x28,
0x14, 0x56, 0x6b, 0xbd, 0x6b, 0x85, 0x11, 0x21, 0x9b, 0xcb, 0x91, 0x88,
0x27, 0x7e, 0xbb, 0xe4, 0x8b, 0xec, 0xb4, 0xf0, 0x53, 0xfd, 0xa6, 0x57,
0x92, 0xa4, 0x2e, 0xc9, 0xf4, 0x15, 0x4f, 0x00, 0x88, 0x27, 0xe2, 0x64,
0xb3, 0xd9, 0x6b, 0x66, 0x13, 0x2a, 0xd5, 0x69, 0x28, 0x14, 0xa2, 0x21,
0x18, 0x44, 0x51, 0xfc, 0x3e, 0x9f, 0xf4, 0xae, 0xe9, 0xa9, 0xad, 0x2c,
0xdb, 0x45, 0xe4, 0xe6, 0xda, 0x7e, 0xc6, 0x18, 0x63, 0x6a, 0x3e, 0xb7,
0x49, 0xd1, 0x36, 0x63, 0x8c, 0x36, 0x37, 0x35, 0xd5, 0xe5, 0xb2, 0xd6,
0x92, 0x48, 0x24, 0xf0, 0x3c, 0xbb, 0x24, 0xdb, 0x89, 0x44, 0xbc, 0x52,
0x90, 0xd4, 0x37, 0x48, 0xd7, 0xf1, 0x93, 0xaa, 0x86, 0x35, 0x45, 0xb5,
0xce, 0xc1, 0xd5, 0x0f, 0x96, 0x26, 0xe1, 0xaa, 0x10, 0x91, 0x52, 0xc9,
0x95, 0x78, 0x3c, 0x7e, 0x4d, 0xa2, 0x05, 0xf0, 0x3c, 0x4b, 0x22, 0x11,
0x57, 0xcf, 0x5a, 0xad, 0xf5, 0x6c, 0x6e, 0x6e, 0xc2, 0x18, 0x63, 0x81,
0x36, 0x60, 0x23, 0x40, 0x4b, 0x7b, 0x3b, 0x26, 0x18, 0x0c, 0x55, 0xb9,
0x95, 0x2e, 0x41, 0xfc, 0x55, 0x56, 0x40, 0xa0, 0x5c, 0x76, 0xa5, 0x50,
0x28, 0x54, 0xdc, 0xaa, 0x9a, 0xfc, 0xea, 0x39, 0x5a, 0x84, 0x7c, 0x3e,
0x4f, 0x72, 0x2e, 0xb9, 0xc0, 0xb2, 0x0b, 0x75, 0xd0, 0x05, 0x7f, 0xf5,
0x6a, 0x7b, 0x57, 0x38, 0x37, 0x06, 0xa9, 0xce, 0x75, 0xa5, 0x30, 0x5a,
0xa0, 0xd0, 0x15, 0x96, 0xae, 0x21, 0x56, 0x44, 0x98, 0x9f, 0x4f, 0x92,
0x2f, 0x14, 0x16, 0x85, 0x8e, 0x42, 0x25, 0x5c, 0x15, 0x8a, 0xc5, 0x22,
0xe5, 0x72, 0x59, 0x11, 0x70, 0x8c, 0xa9, 0xed, 0x62, 0xfd, 0xaa, 0xda,
0x05, 0x90, 0x4e, 0x26, 0x31, 0x8d, 0x8d, 0xcd, 0xd5, 0x2a, 0x8f, 0xb2,
0xaa, 0xce, 0x58, 0x6b, 0x35, 0x9d, 0x49, 0x33, 0x3e, 0x31, 0xc9, 0x2b,
0x27, 0xde, 0x40, 0x04, 0x82, 0xc1, 0xe0, 0x02, 0x0b, 0x5f, 0xc1, 0x7c,
0x32, 0x49, 0xc9, 0x2d, 0x5d, 0xe5, 0xf5, 0xb5, 0xb5, 0x99, 0x45, 0x16,
0x5f, 0x48, 0x8a, 0x88, 0x30, 0x97, 0x9c, 0xd7, 0xd3, 0x6f, 0x0d, 0xf2,
0xd6, 0xe0, 0x39, 0x4d, 0xa7, 0x33, 0x5a, 0x73, 0x49, 0xea, 0x24, 0xe8,
0x95, 0x2a, 0xb7, 0xee, 0x20, 0xf5, 0xc2, 0x1f, 0x11, 0x70, 0xdd, 0x32,
0xc9, 0x64, 0x92, 0xa5, 0xd0, 0xd0, 0x10, 0x44, 0x44, 0x78, 0xf9, 0xc4,
0xeb, 0x8c, 0x4f, 0x4c, 0x91, 0xce, 0x64, 0xb0, 0xd6, 0x2a, 0x30, 0x03,
0x94, 0xa1, 0xb2, 0xc4, 0xfa, 0xda, 0xda, 0xd7, 0xd4, 0x98, 0xff, 0x99,
0xa0, 0x58, 0xab, 0xff, 0x72, 0xfa, 0xcc, 0xd9, 0xc0, 0x9b, 0xa7, 0xce,
0xd0, 0xd5, 0xd9, 0xa9, 0xc6, 0x98, 0x6a, 0x35, 0xb8, 0xd8, 0x1d, 0x3d,
0xcf, 0xab, 0xae, 0xb9, 0xd7, 0x66, 0x79, 0x53, 0x4d, 0xe3, 0x5a, 0x77,
0xef, 0x85, 0x7e, 0x2c, 0x9c, 0x19, 0x3c, 0xc7, 0x73, 0x2f, 0xee, 0x27,
0x91, 0x98, 0x01, 0x94, 0x55, 0x2b, 0x57, 0xf2, 0xa1, 0x87, 0xde, 0x4f,
0xdf, 0xda, 0x35, 0xb5, 0x82, 0xb1, 0xde, 0xa7, 0x56, 0x11, 0x2a, 0x8a,
0x56, 0x8b, 0xaa, 0x2b, 0x16, 0x57, 0x52, 0xa9, 0x14, 0x9d, 0x9d, 0x1d,
0x18, 0xe3, 0xd4, 0xa7, 0x90, 0x6a, 0x18, 0x18, 0x11, 0xa6, 0xa7, 0xe3,
0x72, 0xea, 0xf4, 0x19, 0x75, 0x2a, 0x9b, 0x3c, 0x17, 0xf8, 0x9a, 0xaa,
0xee, 0x55, 0x2a, 0x86, 0x75, 0xe2, 0xd3, 0x63, 0x5c, 0x1e, 0x1b, 0xa1,
0xa7, 0x67, 0x4d, 0x0a, 0x64, 0x46, 0x44, 0x1e, 0x9b, 0x9d, 0x9b, 0x6b,
0x4b, 0xcc, 0xcc, 0x6a, 0x67, 0x47, 0x07, 0x5b, 0x36, 0x6d, 0xc0, 0xe7,
0xf7, 0x4b, 0x53, 0x53, 0x53, 0xfd, 0x20, 0x44, 0x44, 0x28, 0x14, 0x0a,
0x4c, 0x4d, 0x4d, 0xd6, 0x63, 0xb0, 0x26, 0x78, 0xc9, 0x75, 0xb9, 0xf8,
0xf6, 0x25, 0x86, 0x47, 0x46, 0x09, 0xf8, 0xfd, 0x84, 0x43, 0xe1, 0x7a,
0x89, 0x63, 0x8c, 0x61, 0xf4, 0xf2, 0x38, 0x3f, 0xfc, 0xd1, 0x4f, 0x89,
0xc7, 0x13, 0x02, 0x60, 0xad, 0x65, 0x2e, 0x99, 0x64, 0x7c, 0x62, 0x92,
0xf5, 0xeb, 0xfa, 0x88, 0x44, 0xc2, 0xb2, 0x30, 0x14, 0x26, 0xa7, 0xa7,
0x19, 0x3c, 0x77, 0x5e, 0xf3, 0xf9, 0x02, 0xb1, 0x58, 0x54, 0x8c, 0x31,
0x8b, 0xea, 0x0a, 0x6b, 0x2d, 0xcd, 0x4d, 0xcd, 0x04, 0xfc, 0xfe, 0x45,
0x66, 0x88, 0xc7, 0xa7, 0x25, 0x97, 0xcb, 0xc9, 0x9b, 0x27, 0x4f, 0xeb,
0xc9, 0xd3, 0x67, 0x48, 0x26, 0x93, 0x06, 0x18, 0x46, 0xf8, 0x9a, 0x11,
0x33, 0x3c, 0x70, 0xe4, 0x10, 0xae, 0xeb, 0xe2, 0xd4, 0x3a, 0x75, 0xf7,
0xac, 0x01, 0x98, 0x03, 0x6d, 0x05, 0xb9, 0xa7, 0xa2, 0xa7, 0x70, 0xeb,
0xad, 0x9b, 0x11, 0x11, 0x09, 0x04, 0x02, 0x14, 0x8b, 0x45, 0x1a, 0x1a,
0x1a, 0xaa, 0xf1, 0x37, 0xcf, 0xec, 0xec, 0xec, 0x35, 0x5e, 0xf1, 0xc2,
0xbe, 0x03, 0xec, 0x7d, 0xee, 0x05, 0x2d, 0x5b, 0x88, 0x27, 0x66, 0x68,
0x6a, 0x8a, 0x11, 0x8d, 0x46, 0x05, 0x11, 0xdc, 0x72, 0x99, 0xbd, 0xcf,
0xbf, 0xc8, 0xa5, 0xa1, 0x61, 0xaa, 0x16, 0xa9, 0xf2, 0x29, 0x92, 0x4a,
0xa5, 0x31, 0x8e, 0x61, 0xfd, 0xba, 0x9b, 0x00, 0xc4, 0x88, 0x30, 0x3c,
0x32, 0xa6, 0xaf, 0xbd, 0x79, 0x86, 0xc1, 0xb3, 0x17, 0xf8, 0xd5, 0xa1,
0x23, 0xf8, 0xfc, 0x7e, 0xe9, 0xed, 0xe9, 0xa6, 0x5e, 0xbc, 0x53, 0xc9,
0xf8, 0xb1, 0x68, 0x8c, 0x70, 0x24, 0x82, 0x88, 0x90, 0x4c, 0x26, 0x35,
0x97, 0xcb, 0x4a, 0x22, 0x9e, 0x20, 0x9d, 0xc9, 0xe8, 0xc1, 0xc3, 0x47,
0xc9, 0x64, 0xb2, 0x02, 0xa2, 0xaa, 0x3c, 0x99, 0xcb, 0xe7, 0x9f, 0xf6,
0x39, 0x0e, 0x97, 0xc7, 0x46, 0x2b, 0xde, 0x5a, 0x53, 0x60, 0xe0, 0xc8,
0xa1, 0x5a, 0xec, 0x3e, 0x01, 0x7c, 0x5b, 0x44, 0x4a, 0x53, 0xd3, 0x71,
0x39, 0x75, 0xfa, 0x2d, 0xbc, 0x72, 0x99, 0xd1, 0x91, 0x11, 0xc6, 0xc6,
0x46, 0x49, 0xa7, 0x2b, 0x07, 0x2b, 0xc5, 0x6a, 0x72, 0xac, 0xc1, 0x18,
0xa3, 0xf1, 0x99, 0x19, 0x7d, 0xf9, 0xc4, 0x6b, 0x2a, 0x62, 0xf8, 0xe2,
0x17, 0x3e, 0x2f, 0x9b, 0x36, 0x6f, 0xe1, 0xf5, 0x37, 0x4e, 0x21, 0x02,
0xc6, 0x08, 0xa3, 0x97, 0xc7, 0x39, 0x77, 0xfe, 0x02, 0xc6, 0x98, 0xca,
0x79, 0xd6, 0xe2, 0xa4, 0x26, 0x27, 0x4f, 0xbf, 0x45, 0x7c, 0x66, 0x06,
0x11, 0xc1, 0xaa, 0xf2, 0xfa, 0x9b, 0xa7, 0x78, 0xe0, 0x81, 0x07, 0x78,
0xec, 0xb1, 0x47, 0x29, 0x14, 0x0a, 0x1c, 0x3b, 0xfe, 0x0a, 0xf3, 0xa9,
0xf9, 0x6a, 0x48, 0x5c, 0x31, 0x77, 0xa1, 0x58, 0x04, 0x20, 0x95, 0x4a,
0x31, 0x36, 0x36, 0xca, 0xc8, 0xc8, 0x88, 0x96, 0xbd, 0x32, 0xa7, 0xce,
0x0c, 0x32, 0x39, 0x35, 0x2d, 0x22, 0xe2, 0xaa, 0xea, 0xb7, 0x81, 0x27,
0xc2, 0xa1, 0x10, 0x0b, 0x0f, 0x6d, 0x17, 0xd5, 0xb5, 0xb3, 0x63, 0x93,
0xb4, 0xf5, 0xac, 0x9c, 0x55, 0xd5, 0xaf, 0x8a, 0xc8, 0xfe, 0x72, 0xb9,
0xfc, 0x77, 0x07, 0x0e, 0x1e, 0xda, 0xd8, 0xd6, 0xda, 0x62, 0xd7, 0xdd,
0xd4, 0x27, 0x5e, 0x21, 0xcf, 0xf0, 0xd0, 0x30, 0x8d, 0x4d, 0x4d, 0x9a,
0xcb, 0x66, 0xaf, 0x04, 0x75, 0xb5, 0x8a, 0x29, 0x96, 0x5c, 0xca, 0x65,
0x8f, 0x52, 0xa9, 0xc4, 0xbf, 0x3e, 0xf1, 0xa4, 0x66, 0x32, 0x19, 0x36,
0xde, 0xb2, 0xae, 0x9e, 0x04, 0x07, 0xcf, 0x9e, 0xd7, 0x5c, 0x2e, 0x2f,
0x0b, 0x77, 0x71, 0x0b, 0x08, 0xd0, 0x64, 0x72, 0x5e, 0x2e, 0x5c, 0xbc,
0xa4, 0x5d, 0x1d, 0x1d, 0x78, 0xd6, 0x92, 0x4e, 0x67, 0xe4, 0xdf, 0xbe,
0xf5, 0x2d, 0xac, 0x55, 0x15, 0x81, 0x52, 0xc9, 0xc5, 0x75, 0xaf, 0xda,
0x8b, 0x08, 0xcc, 0xcf, 0x27, 0xb5, 0x5c, 0x76, 0x49, 0xa5, 0x52, 0x92,
0xc9, 0x64, 0xf1, 0xf9, 0x1c, 0x2e, 0x5e, 0x1a, 0xd6, 0xfd, 0x2f, 0x1d,
0x34, 0xe5, 0x72, 0xf9, 0xac, 0x31, 0xe6, 0x1f, 0x41, 0x9f, 0x16, 0x24,
0x3d, 0x1d, 0x9f, 0x5f, 0xd4, 0xdd, 0x59, 0x44, 0x40, 0x6a, 0x8e, 0xb1,
0xd1, 0x11, 0x7a, 0xd6, 0xf4, 0x96, 0xc4, 0xc8, 0x49, 0x11, 0x99, 0xcb,
0xe7, 0x0b, 0x0f, 0x5e, 0xbc, 0x34, 0xd4, 0x90, 0xcd, 0x66, 0x39, 0x7d,
0xe6, 0xac, 0x06, 0x83, 0x41, 0xd2, 0xe9, 0x14, 0xc5, 0x62, 0x89, 0x40,
0x20, 0x20, 0x57, 0x02, 0x40, 0x25, 0xe0, 0xf7, 0x33, 0x34, 0x3c, 0x4a,
0x22, 0x91, 0x60, 0x76, 0x76, 0x16, 0x55, 0xcb, 0x7b, 0xef, 0xd9, 0x43,
0x67, 0x47, 0xbb, 0x14, 0x8b, 0x45, 0x7d, 0xe9, 0xe0, 0x61, 0xe6, 0xe6,
0x92, 0x52, 0x3d, 0x40, 0xad, 0xa7, 0xf3, 0xba, 0x3b, 0xab, 0x12, 0x0c,
0x06, 0x65, 0xcb, 0xe6, 0x8d, 0xf8, 0x7c, 0x3e, 0x0a, 0xc5, 0x22, 0xc7,
0x5f, 0x39, 0x41, 0x32, 0x59, 0xe9, 0xb3, 0x69, 0xe3, 0x2d, 0xdc, 0x75,
0xc7, 0x6d, 0xf5, 0x84, 0x57, 0x9b, 0x3b, 0x99, 0x4c, 0x32, 0x35, 0x3d,
0xcd, 0xc4, 0xe4, 0x14, 0x07, 0x0e, 0x1e, 0x62, 0x78, 0x74, 0x8c, 0x5f,
0xee, 0x3f, 0x68, 0xe6, 0xe6, 0x93, 0x69, 0x11, 0xf9, 0x6b, 0xe0, 0xbb,
0xaa, 0x94, 0x06, 0x8e, 0x1e, 0x66, 0x6e, 0x76, 0xfa, 0xfa, 0x04, 0xd4,
0x30, 0x36, 0x3a, 0x42, 0x77, 0xf7, 0x1a, 0x80, 0x41, 0x60, 0xb6, 0x50,
0x28, 0x6c, 0x1c, 0x1e, 0x19, 0x6d, 0x1a, 0x9f, 0x98, 0x74, 0x4e, 0x9d,
0x19, 0xe4, 0xcd, 0x53, 0xa7, 0xe9, 0xea, 0xea, 0xa4, 0xb3, 0x63, 0x85,
0xe8, 0x82, 0xa5, 0x29, 0x10, 0x08, 0x48, 0xf7, 0xea, 0x55, 0x62, 0xc4,
0xd0, 0xde, 0xd6, 0xc6, 0xbd, 0xf7, 0xec, 0x66, 0xf3, 0xc6, 0x0d, 0x62,
0x8c, 0x61, 0x3e, 0x95, 0xe6, 0xd0, 0xd1, 0x01, 0x0a, 0x85, 0xa2, 0xc8,
0x82, 0x85, 0xfb, 0x4a, 0x62, 0xad, 0x0a, 0xe4, 0xf3, 0xc9, 0xed, 0x5b,
0xb7, 0xe0, 0xf7, 0xfb, 0xe9, 0x68, 0x5f, 0x41, 0x73, 0x73, 0x93, 0x06,
0xfc, 0x7e, 0x36, 0x6f, 0xdc, 0x20, 0xf7, 0xbd, 0xef, 0x1e, 0xa2, 0xd1,
0xd8, 0xa2, 0x2a, 0xc9, 0x18, 0xc3, 0xf9, 0x8b, 0x6f, 0xf3, 0x3f, 0x3f,
0xfc, 0x31, 0xaf, 0x9c, 0x78, 0x4d, 0x86, 0x46, 0x46, 0xcd, 0xf0, 0xf0,
0xa8, 0xcd, 0xe7, 0xf3, 0x43, 0x22, 0xf2, 0x0f, 0xaa, 0xfa, 0x1d, 0xf9,
0x0d, 0x77, 0x15, 0xd7, 0x39, 0x14, 0xad, 0xe4, 0x84, 0xbb, 0x77, 0xee,
0x76, 0xd5, 0xea, 0x37, 0x8d, 0x91, 0x17, 0x81, 0x7b, 0x81, 0x75, 0xb9,
0x5c, 0x6e, 0x65, 0x2e, 0x97, 0xfb, 0x68, 0x3e, 0x9f, 0x8f, 0x5e, 0xe5,
0x89, 0xa8, 0x2a, 0x2b, 0x3b, 0x3b, 0x78, 0xec, 0x91, 0x0f, 0x89, 0xb5,
0x5e, 0xfd, 0xe0, 0x02, 0x14, 0xd7, 0x2d, 0x89, 0x5b, 0x72, 0xeb, 0xfb,
0x85, 0x2b, 0x65, 0x6f, 0xbd, 0x80, 0x92, 0x5a, 0x6e, 0x29, 0x7b, 0x1e,
0xa0, 0xf8, 0xfd, 0x3e, 0xfa, 0xef, 0xde, 0xc6, 0xf6, 0xbb, 0xee, 0x40,
0x54, 0x31, 0x53, 0x71, 0x34, 0x35, 0x8a, 0x74, 0x75, 0xa2, 0x01, 0x5f,
0x7d, 0xa9, 0xcc, 0xe7, 0x0b, 0x32, 0x3b, 0x3b, 0x97, 0x55, 0xf4, 0x47,
0x46, 0xcc, 0x04, 0x70, 0x41, 0x44, 0x0e, 0x7a, 0x9e, 0xbd, 0x60, 0x8c,
0xe8, 0xc0, 0x6f, 0xb8, 0xa8, 0xb9, 0x2e, 0x01, 0x00, 0xc7, 0x2b, 0x1d,
0x15, 0xb8, 0x00, 0x5c, 0xa8, 0xde, 0xcc, 0xac, 0xb6, 0xaa, 0xbb, 0x93,
0xc9, 0xf9, 0xf5, 0xaa, 0xf5, 0x55, 0xbb, 0x9e, 0x94, 0xac, 0xd6, 0x8a,
0x1d, 0x53, 0x59, 0xb7, 0x81, 0x50, 0x28, 0xa4, 0xbd, 0xbd, 0x6b, 0x69,
0x68, 0x68, 0x20, 0x93, 0xcb, 0x8a, 0x60, 0x10, 0xd1, 0xab, 0xcb, 0x5d,
0x55, 0x55, 0x22, 0xd1, 0xa8, 0xac, 0xed, 0x5d, 0x4b, 0x2e, 0x97, 0xa1,
0x52, 0x85, 0x5a, 0x11, 0x55, 0x35, 0xcf, 0x1f, 0x50, 0xdf, 0x2f, 0x7e,
0x29, 0x78, 0x65, 0xbc, 0x5d, 0x77, 0xe3, 0x7d, 0xfc, 0x11, 0x08, 0x04,
0x00, 0x65, 0x76, 0x76, 0x4e, 0xac, 0xb5, 0xe3, 0xc6, 0x98, 0xbf, 0x55,
0xd5, 0xf1, 0x81, 0x23, 0xbf, 0xfb, 0x85, 0x8c, 0xf9, 0x9d, 0x5b, 0x52,
0x2f, 0xdd, 0x67, 0xd4, 0xda, 0xb7, 0xc7, 0x27, 0x26, 0xf1, 0x3c, 0x6f,
0xe9, 0xc2, 0x7f, 0x81, 0x66, 0x8e, 0xe3, 0xd0, 0xd5, 0xd5, 0xc5, 0xba,
0x9b, 0xfa, 0x78, 0xcf, 0xed, 0x5b, 0xb1, 0xb6, 0x7a, 0xa3, 0x81, 0x20,
0x57, 0x6d, 0x95, 0x45, 0x84, 0xfe, 0xbb, 0xb7, 0xd1, 0xd3, 0xd3, 0x4d,
0x67, 0x67, 0x17, 0x46, 0x2a, 0x65, 0x32, 0x89, 0x19, 0x9c, 0x17, 0x0e,
0x20, 0x73, 0x73, 0x48, 0x3a, 0x83, 0x73, 0xf0, 0x08, 0x32, 0x3c, 0x0a,
0x46, 0x70, 0xdd, 0x32, 0x97, 0x27, 0x26, 0x00, 0x2e, 0x01, 0xb3, 0xdc,
0x20, 0x6e, 0x88, 0x00, 0xa9, 0x54, 0x61, 0x05, 0x11, 0x7e, 0x3d, 0x3a,
0x36, 0xce, 0x5c, 0x72, 0x5e, 0xae, 0x77, 0x3a, 0x53, 0x51, 0x49, 0x89,
0x44, 0x22, 0x44, 0xa3, 0x51, 0xf1, 0xfb, 0xfd, 0xf2, 0xd9, 0x4f, 0x7f,
0x52, 0xee, 0xbb, 0xf7, 0x1e, 0x42, 0xa1, 0x50, 0xed, 0x66, 0x47, 0xab,
0x96, 0xd7, 0x68, 0x34, 0x2a, 0x1f, 0x7e, 0xf8, 0x21, 0xf9, 0xe8, 0xe3,
0x8f, 0x22, 0x22, 0x34, 0x36, 0x36, 0x12, 0x0a, 0x87, 0xaa, 0x67, 0x88,
0xb5, 0x44, 0x29, 0x0a, 0xa2, 0x18, 0xa3, 0x88, 0x20, 0x62, 0x48, 0xcc,
0xcc, 0x72, 0xf9, 0xf2, 0x04, 0x22, 0x72, 0x50, 0x44, 0x0a, 0xba, 0xf4,
0x56, 0xf2, 0xba, 0x70, 0x6e, 0xa4, 0xf1, 0xd8, 0xd8, 0x28, 0xdd, 0x3d,
0x3d, 0x80, 0xa4, 0x0a, 0xc5, 0xe2, 0x23, 0x4d, 0x4d, 0x8d, 0x8d, 0x7d,
0xbd, 0xbd, 0x8a, 0xaa, 0x5c, 0xbd, 0xd5, 0xaf, 0x95, 0xf1, 0xcd, 0xcd,
0xcd, 0x34, 0x36, 0x36, 0xa2, 0xaa, 0x34, 0x35, 0x36, 0x72, 0xf7, 0xb6,
0x3b, 0xe5, 0xb6, 0x5b, 0xb7, 0x70, 0x53, 0xdf, 0x5a, 0xe2, 0xf1, 0x04,
0x5d, 0x5d, 0x9d, 0x7c, 0xf2, 0x8f, 0x3f, 0x26, 0x1f, 0xfb, 0xc8, 0x63,
0x3c, 0xf8, 0xe0, 0x03, 0x44, 0xc2, 0xe1, 0xca, 0x39, 0x84, 0x18, 0x72,
0xb9, 0x3c, 0xb9, 0x5c, 0x16, 0xc2, 0x61, 0xd4, 0x2a, 0x32, 0x3e, 0x81,
0x04, 0x83, 0xd8, 0x7b, 0x77, 0x63, 0x77, 0xdc, 0x25, 0xe2, 0x18, 0x0e,
0x0f, 0x1c, 0x97, 0xc1, 0xb3, 0xe7, 0x2e, 0x8b, 0xc8, 0xdf, 0x03, 0x53,
0x37, 0x7a, 0x31, 0xeb, 0xbb, 0xa1, 0xd6, 0x00, 0x2a, 0x18, 0xe1, 0xa4,
0x67, 0xed, 0x53, 0xc7, 0x8e, 0xbf, 0xf2, 0xd5, 0x4d, 0x1b, 0xd6, 0x4b,
0x57, 0x67, 0x27, 0x6a, 0xed, 0xc2, 0x3b, 0x8a, 0x3a, 0x09, 0x0b, 0x77,
0x8f, 0x93, 0x53, 0x53, 0x9a, 0x4e, 0x67, 0xe8, 0xe9, 0xe9, 0x96, 0x6c,
0x2e, 0x57, 0xb9, 0xd1, 0xb4, 0x96, 0xd5, 0xab, 0x56, 0x6a, 0x67, 0x67,
0x07, 0x6f, 0xbf, 0x7d, 0x89, 0xd6, 0xd6, 0x16, 0x59, 0xb1, 0xa2, 0xad,
0xb2, 0x17, 0xaa, 0xb9, 0x97, 0x88, 0xd8, 0x87, 0xee, 0x53, 0xbd, 0x73,
0x2b, 0x78, 0x16, 0xed, 0x6c, 0xc7, 0x04, 0x02, 0x8c, 0x8c, 0x8e, 0xf1,
0xca, 0xab, 0xaf, 0xa3, 0xca, 0x0f, 0x40, 0x4f, 0xfd, 0x26, 0x6f, 0xbc,
0x1e, 0xde, 0x41, 0x97, 0xfa, 0x1d, 0x42, 0x9f, 0xb5, 0xf6, 0xa9, 0xad,
0x5b, 0x36, 0x6f, 0xfb, 0xc4, 0x47, 0x1f, 0xd5, 0x70, 0x38, 0x5c, 0x3f,
0x9d, 0xad, 0x73, 0x85, 0xd2, 0xd4, 0xd4, 0xc4, 0x9a, 0x35, 0xbd, 0x38,
0x8e, 0xc3, 0xb9, 0xf3, 0x17, 0xf4, 0xbb, 0xdf, 0xfb, 0x01, 0xf3, 0xa9,
0x4a, 0x35, 0xf9, 0xf0, 0x43, 0x0f, 0x52, 0x28, 0x14, 0xd8, 0xf7, 0xcb,
0x03, 0x38, 0x3e, 0x1f, 0xad, 0xad, 0x2d, 0x7c, 0xfe, 0x33, 0x9f, 0x94,
0xde, 0x35, 0x6b, 0xb0, 0xd6, 0x72, 0xe9, 0xd2, 0xa5, 0xfa, 0x49, 0x53,
0x95, 0x08, 0x6a, 0xb9, 0x22, 0x35, 0x9f, 0xe6, 0xfb, 0xff, 0xfb, 0x13,
0x39, 0x77, 0xfe, 0xc2, 0xcb, 0xc6, 0x98, 0x8f, 0x03, 0xc3, 0x37, 0x92,
0xfc, 0xfe, 0x5f, 0x04, 0x6c, 0xef, 0xdf, 0x89, 0x63, 0x1c, 0xac, 0xb5,
0xef, 0x35, 0x46, 0xfe, 0xf3, 0xce, 0xf7, 0xdc, 0xbe, 0xf6, 0xc3, 0x0f,
0x7f, 0xc0, 0xc6, 0xa2, 0x51, 0xb1, 0x6a, 0xaf, 0x1c, 0xf0, 0x2a, 0x38,
0x3e, 0x1f, 0x7d, 0x7d, 0x7d, 0x84, 0xc3, 0x61, 0x00, 0xe6, 0x92, 0x49,
0x66, 0x66, 0x66, 0x69, 0x6e, 0x6a, 0x62, 0xc5, 0x8a, 0x36, 0x14, 0x25,
0x1e, 0x4f, 0x90, 0x4a, 0xa5, 0xb5, 0xbd, 0x7d, 0x05, 0x4d, 0x8d, 0x8d,
0x02, 0x90, 0xc9, 0x64, 0x18, 0x1a, 0x1a, 0xc2, 0x7a, 0x5e, 0x9d, 0x4c,
0x00, 0x23, 0x86, 0xb9, 0xf9, 0x79, 0x9e, 0xf9, 0xf9, 0x73, 0x72, 0xea,
0xcc, 0x99, 0x4b, 0xaa, 0x7c, 0xd1, 0x88, 0xbc, 0xe4, 0x59, 0x8f, 0xe3,
0x03, 0x47, 0x6f, 0x58, 0x97, 0x1b, 0xca, 0x01, 0x35, 0x8c, 0x8f, 0x8d,
0xd1, 0xdd, 0xd3, 0x43, 0x21, 0x97, 0x1f, 0x72, 0x7c, 0xbe, 0xc1, 0xc9,
0xc9, 0xa9, 0x6d, 0x93, 0xd3, 0xd3, 0xed, 0x1d, 0xed, 0xed, 0x34, 0x35,
0xc6, 0xb4, 0x5e, 0xe9, 0x48, 0x65, 0xb3, 0x52, 0x76, 0x5d, 0xa2, 0xd1,
0x28, 0x8e, 0x63, 0x08, 0x35, 0x84, 0x68, 0x6b, 0x6b, 0x25, 0x1c, 0x0e,
0xd5, 0x6b, 0x80, 0x58, 0x34, 0x42, 0x5b, 0x6b, 0xab, 0x04, 0x83, 0x41,
0x01, 0x28, 0xb9, 0x25, 0x26, 0x26, 0xc6, 0x29, 0x14, 0x8a, 0xb5, 0x03,
0xe6, 0xea, 0x8a, 0x20, 0x3a, 0x3c, 0x32, 0x2a, 0x4f, 0x3f, 0xb3, 0x57,
0x06, 0xcf, 0x9d, 0x1f, 0x04, 0xfe, 0xd2, 0xef, 0xf3, 0xed, 0xf7, 0x3c,
0xbb, 0xe4, 0xd5, 0xf7, 0xef, 0x8d, 0x00, 0x80, 0xb1, 0xd1, 0x51, 0x7a,
0xfb, 0xd6, 0x61, 0x84, 0x8b, 0x0a, 0x87, 0xe3, 0x89, 0x99, 0xee, 0xf3,
0x17, 0xdf, 0xee, 0x73, 0x5d, 0xd7, 0xd7, 0xdc, 0xd4, 0x4c, 0x28, 0xd4,
0xa0, 0xd5, 0x13, 0x62, 0x29, 0x15, 0x4b, 0x14, 0x8b, 0x05, 0x0d, 0x06,
0x1b, 0xc4, 0xb7, 0xe0, 0x58, 0xbd, 0x7a, 0xb1, 0x5a, 0xff, 0xad, 0xaa,
0xe4, 0x72, 0x39, 0x26, 0xc6, 0xc7, 0xc9, 0x64, 0x32, 0x18, 0x23, 0xb5,
0xa5, 0x50, 0x67, 0x93, 0x49, 0x39, 0x74, 0x64, 0xc0, 0x3c, 0xfb, 0xfc,
0x3e, 0x77, 0x7c, 0x62, 0xf2, 0x59, 0x63, 0xcc, 0x97, 0x15, 0x8e, 0xa8,
0xb5, 0x8b, 0x2e, 0x3b, 0x6f, 0x14, 0xef, 0x28, 0x04, 0x16, 0xa2, 0x7f,
0xd7, 0x9e, 0xda, 0x65, 0x47, 0x93, 0xe7, 0x79, 0x7f, 0xe2, 0x38, 0xce,
0x9f, 0x77, 0xb4, 0xaf, 0xd8, 0xba, 0x79, 0xd3, 0x06, 0xff, 0xa6, 0x0d,
0xb7, 0x68, 0x57, 0x67, 0x47, 0x75, 0x0b, 0x8d, 0xfa, 0x7c, 0x3e, 0x69,
0x6c, 0x6c, 0x24, 0x16, 0x8b, 0x11, 0x0c, 0x36, 0xa8, 0xe3, 0x18, 0x54,
0x2b, 0x5e, 0x52, 0x28, 0x14, 0xc9, 0x64, 0xd2, 0xa4, 0xd3, 0x19, 0x29,
0x97, 0x5d, 0x54, 0x55, 0xf3, 0xf9, 0x82, 0x4c, 0x4c, 0x4e, 0xf1, 0xd6,
0xe0, 0x39, 0x39, 0x3d, 0x78, 0xd6, 0x8d, 0xc7, 0x13, 0x27, 0x55, 0xed,
0xb7, 0x8c, 0x71, 0xbe, 0x0f, 0x3a, 0x6f, 0xad, 0x70, 0xec, 0xe8, 0x3b,
0x7b, 0xf9, 0xe2, 0x5d, 0x23, 0x60, 0x21, 0x11, 0x2b, 0xa3, 0xed, 0x4c,
0x64, 0xe2, 0x5d, 0x9e, 0xe7, 0x7d, 0x40, 0x44, 0x1e, 0x8f, 0x44, 0xc2,
0xdb, 0xda, 0xdb, 0xda, 0x3a, 0xba, 0xba, 0x3a, 0xfd, 0x9d, 0x1d, 0xed,
0x34, 0x35, 0x35, 0x12, 0x0e, 0x87, 0x08, 0x35, 0x84, 0x08, 0x04, 0x02,
0xf8, 0x7c, 0x15, 0x07, 0x2c, 0xbb, 0x65, 0x4a, 0xae, 0x4b, 0xb1, 0x58,
0x24, 0x97, 0xcf, 0x93, 0x4c, 0xce, 0x33, 0x39, 0x35, 0xcd, 0xc4, 0xe4,
0x94, 0x9b, 0x98, 0x99, 0x99, 0xca, 0xe5, 0xf2, 0xaf, 0x5a, 0x6b, 0x7f,
0xe2, 0xf3, 0x39, 0xcf, 0x17, 0xf3, 0x85, 0x49, 0x7f, 0x30, 0xc8, 0xbb,
0xf5, 0x1e, 0xd2, 0xbb, 0x46, 0x40, 0x0d, 0x3b, 0xf6, 0xec, 0x06, 0x4f,
0x10, 0x21, 0xe8, 0x79, 0xde, 0x5a, 0xab, 0x7a, 0xbb, 0x11, 0xb9, 0xdd,
0x71, 0x9c, 0x9b, 0x1d, 0xc7, 0xe9, 0xf2, 0xf9, 0x9c, 0x26, 0xc7, 0x71,
0x42, 0xc6, 0x98, 0x80, 0x11, 0xe3, 0x54, 0xae, 0xbf, 0xac, 0xb5, 0xaa,
0x25, 0xeb, 0xd9, 0x7c, 0xd9, 0xf3, 0xe6, 0x5d, 0xd7, 0x9d, 0xf0, 0x3c,
0xef, 0xbc, 0xaa, 0xbe, 0x69, 0x8c, 0x79, 0xdd, 0x18, 0x33, 0x2c, 0x22,
0xc5, 0x52, 0xa9, 0xc4, 0xab, 0x2f, 0x1f, 0x7b, 0x57, 0xe5, 0x7d, 0xd7,
0x09, 0xb8, 0x1a, 0xfd, 0xbb, 0xef, 0xa5, 0x5c, 0x48, 0xe3, 0x04, 0x42,
0x8e, 0xaa, 0x6d, 0xb0, 0x56, 0x1b, 0x80, 0xa0, 0xaa, 0xfa, 0x55, 0xd5,
0x11, 0x63, 0xa8, 0xbe, 0xed, 0xe0, 0x1a, 0x63, 0x8a, 0x46, 0x24, 0x2f,
0xc6, 0x14, 0x12, 0xb3, 0xc6, 0xeb, 0xea, 0xf0, 0x38, 0x74, 0xf0, 0xf7,
0xf3, 0xc6, 0xd9, 0x32, 0x96, 0xb1, 0x8c, 0x65, 0x2c, 0x63, 0x19, 0xcb,
0x58, 0xc6, 0x32, 0x96, 0xb1, 0x8c, 0x3f, 0x6c, 0xfc, 0x1f, 0xeb, 0xf2,
0x80, 0xf1, 0x60, 0x74, 0xf5, 0x03, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45,
0x4e, 0x44, 0xae, 0x42, 0x60, 0x82,
};
static const unsigned int snacforge_default_avatar_png_len = sizeof snacforge_default_avatar_png;
+4
View File
@@ -10,6 +10,10 @@
.Ar basedir
.Op Ar option ...
.Sh DESCRIPTION
This manual documents snacforge. The installed command remains
.Nm snac
for compatibility with existing installations and scripts.
.Pp
The
.Nm
daemon processes messages from other servers in the Fediverse
+4
View File
@@ -5,6 +5,10 @@
.Nm snac
.Nd message formatting and file format documentation
.Sh DESCRIPTION
This manual documents snacforge. Its file name remains
.Nm snac
for compatibility with existing installations and cross-references.
.Pp
The
.Nm
daemon processes messages from other servers in the Fediverse
+5
View File
@@ -5,6 +5,11 @@
.Nm snac
.Nd snac administration
.Sh DESCRIPTION
This manual documents snacforge. The installed daemon, command, and manual
names remain
.Nm snac
for compatibility with existing deployments and scripts.
.Pp
The
.Nm
daemon processes messages from other servers in the Fediverse
+2 -2
View File
@@ -33,7 +33,7 @@ Links can also be written in [standard Markdown style](https://comam.es/what-is-
Some emojis: X-D <3 :beer: :shrug: :shrug2:
Image URLs written in standard Markdown style for images ![susie, snac's girl](https://comam.es/snac-doc/susie64.png) are converted to ActivityPub attachments.
Image URLs written in standard Markdown image syntax are converted to ActivityPub attachments.
Three minus symbols in a line make a separator:
@@ -49,4 +49,4 @@ But please take note that every ActivityPub implementation out there have its ow
These acrobatics are better documented in the [snac(5)](https://comam.es/snac-doc/snac.5.html) man page.
[WHAT IS THIS SNAC THING?](https://comam.es/what-is-snac)
[Upstream snac project overview](https://comam.es/what-is-snac)
+7 -4
View File
@@ -270,8 +270,10 @@ xs_html *html_actor_icon(snac *user, xs_dict *actor, const char *date,
avatar = make_url(v, proxy, 0);
}
if (avatar == NULL)
avatar = xs_fmt("data:image/png;base64, %s", default_avatar_base64());
if (avatar == NULL) {
xs *avatar_b64 = default_avatar_base64();
avatar = xs_fmt("data:image/png;base64, %s", avatar_b64);
}
const char *actor_id = xs_dict_get(actor, "id");
const char *html_url = xs_dict_get_def(actor, "url", actor_id);
@@ -1065,7 +1067,7 @@ xs_html *html_user_head(snac *user, const char *desc, const char *url)
if (avatar == NULL || *avatar == '\0') {
xs_free(avatar);
avatar = xs_fmt("%s/susie.png", srv_baseurl);
avatar = xs_fmt("%s/snacforge.png", srv_baseurl);
}
/* create a description field */
@@ -1160,7 +1162,8 @@ static xs_html *html_user_body(snac *user, int read_only)
if (avatar == NULL || *avatar == '\0') {
xs_free(avatar);
avatar = xs_fmt("data:image/png;base64, %s", default_avatar_base64());
xs *avatar_b64 = default_avatar_base64();
avatar = xs_fmt("data:image/png;base64, %s", avatar_b64);
}
xs_html_add(top_nav,
+6 -4
View File
@@ -275,9 +275,11 @@ int server_get_handler(xs_dict *req, const char *q_path,
status = HTTP_STATUS_OK;
}
else
if (strcmp(q_path, "/susie.png") == 0 || strcmp(q_path, "/favicon.ico") == 0 ) {
if (strcmp(q_path, "/snacforge.png") == 0 ||
strcmp(q_path, "/susie.png") == 0 || /* legacy avatar URL */
strcmp(q_path, "/favicon.ico") == 0 ) {
status = HTTP_STATUS_OK;
*body = xs_base64_dec(default_avatar_base64(), b_size);
*body = default_avatar_data(b_size);
*ctype = "image/png";
}
else
@@ -311,8 +313,8 @@ int server_get_handler(xs_dict *req, const char *q_path,
xs *j = xs_json_loads(s);
j = xs_dict_set(j, "version", "2.1");
j = xs_dict_set_path(j, "software.repository", WHAT_IS_SNAC_URL);
j = xs_dict_set_path(j, "software.homepage", SNAC_DOC_URL);
j = xs_dict_set_path(j, "software.repository", SNACFORGE_URL);
j = xs_dict_set_path(j, "software.homepage", SNACFORGE_DOC_URL);
status = HTTP_STATUS_OK;
*ctype = "application/json; charset=utf-8";
+5 -5
View File
@@ -721,7 +721,7 @@ xs_dict *mastoapi_account(snac *logged, const xs_dict *actor)
}
if (avatar == NULL)
avatar = xs_fmt("%s/susie.png", srv_baseurl);
avatar = xs_fmt("%s/snacforge.png", srv_baseurl);
acct = xs_dict_append(acct, "avatar", avatar);
acct = xs_dict_append(acct, "avatar_static", avatar);
@@ -1488,7 +1488,7 @@ void credentials_get(char **body, char **ctype, int *status, snac snac)
const char *av = xs_dict_get(snac.config, "avatar");
if (xs_is_null(av) || *av == '\0')
avatar = xs_fmt("%s/susie.png", srv_baseurl);
avatar = xs_fmt("%s/snacforge.png", srv_baseurl);
else
avatar = xs_dup(av);
@@ -2715,13 +2715,13 @@ int mastoapi_get_handler(const xs_dict *req, const char *q_path,
ins = xs_dict_append(ins, "domain", host);
ins = xs_dict_append(ins, "title", title && *title ? title : host);
ins = xs_dict_append(ins, "version", "4.0.0 (not true; really " USER_AGENT ")");
ins = xs_dict_append(ins, "source_url", WHAT_IS_SNAC_URL);
ins = xs_dict_append(ins, "source_url", SNACFORGE_URL);
ins = xs_dict_append(ins, "description", host);
ins = xs_dict_append(ins, "short_description", sdesc && *sdesc ? sdesc : host);
xs *susie = xs_fmt("%s/susie.png", srv_baseurl);
ins = xs_dict_append(ins, "thumbnail", susie);
xs *thumbnail = xs_fmt("%s/snacforge.png", srv_baseurl);
ins = xs_dict_append(ins, "thumbnail", thumbnail);
const char *v = xs_dict_get(srv_config, "admin_email");
if (xs_is_null(v) || *v == '\0')
+4 -3
View File
@@ -1,13 +1,13 @@
/* snac - A simple, minimalistic ActivityPub instance */
/* copyright (c) 2022 - 2026 grunfink et al. / MIT license */
#define VERSION "2.95-sf.1"
#define VERSION "2.95-sf.2"
#define USER_AGENT "snacforge/" VERSION
#define WHAT_IS_SNAC_URL "https:/" "/comam.es/what-is-snac"
#define SNACFORGE_URL "https:/" "/git.sdf.org/erici/snacforge"
#define SNAC_DOC_URL "https:/" "/comam.es/snac-doc"
#define SNACFORGE_DOC_URL SNACFORGE_URL "/src/branch/master/doc"
#define DIR_PERM 00770
#define DIR_PERM_ADD 02770
@@ -370,7 +370,8 @@ int webfinger_request_fake(const char *qs, xs_str **actor, xs_str **user);
int webfinger_get_handler(const xs_dict *req, const char *q_path,
xs_val **body, int *b_size, char **ctype);
const char *default_avatar_base64(void);
xs_str *default_avatar_base64(void);
xs_str *default_avatar_data(int *size);
xs_str *process_tags(snac *snac, const char *content, xs_list **tag);