From 26938e5aafa6667a3bd55a3c0d4ffdc91092f054 Mon Sep 17 00:00:00 2001 From: Scott Duensing Date: Wed, 2 Feb 2022 17:36:44 -0600 Subject: [PATCH] Start of cache system. --- .gitignore | 2 + LICENSE | 5 + client/client.pro | 14 +- client/{data => in}/dconnect.png | 0 client/{data => in}/ddialing.png | 0 client/{data => in}/dinit.png | 0 client/{data => in}/logo.png | 0 client/{data => in}/mbie32.png | 0 client/{data => in}/mbii32.png | 0 client/{data => in}/mbim32.png | 0 client/{data => in}/mbiq32.png | 0 client/{data => in}/mbiw32.png | 0 client/{data => in}/mouse.png | 0 client/postBuild.sh | 4 +- client/src/embedded/embedded.c | 22 - client/src/embedded/mouse.h | 457 ------------------ client/src/embedded/vga8x14.h | 347 ------------- client/src/gui/gui.c | 5 +- client/src/gui/msgbox.c | 13 +- client/src/{system => gui}/taglist.c | 0 client/src/{system => gui}/taglist.h | 0 client/src/linux/linux.c | 4 +- client/src/main.c | 6 +- client/src/system/cache.c | 447 +++++++++++++++++ .../{embedded/embedded.h => system/cache.h} | 30 +- client/src/{ => system}/network.c | 0 client/src/{ => system}/network.h | 0 client/src/system/os.c | 151 ++++++ client/src/system/os.h | 16 +- client/src/thirdparty/SHA256/LICENSE | 21 + client/src/thirdparty/SHA256/README.md | 13 + client/src/thirdparty/SHA256/mark2/Makefile | 32 ++ client/src/thirdparty/SHA256/mark2/sha256.C | 298 ++++++++++++ client/src/thirdparty/SHA256/mark2/sha256.h | 57 +++ client/src/thirdparty/SHA256/sha256.c | 245 ++++++++++ client/src/thirdparty/SHA256/sha256.h | 50 ++ client/src/welcome.c | 18 +- font/data/vga8x14.dat | 3 - font/data/vga8x16.dat | 3 - font/data/vga8x8.dat | 3 - font/{assets => in}/vga8x14.png | 0 font/{assets => in}/vga8x16.png | 0 font/{assets => in}/vga8x8.png | 0 kpmpgsmkii.pro | 5 +- precache/precache.pro | 58 +++ precache/src/main.c | 57 +++ 46 files changed, 1517 insertions(+), 869 deletions(-) rename client/{data => in}/dconnect.png (100%) rename client/{data => in}/ddialing.png (100%) rename client/{data => in}/dinit.png (100%) rename client/{data => in}/logo.png (100%) rename client/{data => in}/mbie32.png (100%) rename client/{data => in}/mbii32.png (100%) rename client/{data => in}/mbim32.png (100%) rename client/{data => in}/mbiq32.png (100%) rename client/{data => in}/mbiw32.png (100%) rename client/{data => in}/mouse.png (100%) delete mode 100644 client/src/embedded/embedded.c delete mode 100644 client/src/embedded/mouse.h delete mode 100644 client/src/embedded/vga8x14.h rename client/src/{system => gui}/taglist.c (100%) rename client/src/{system => gui}/taglist.h (100%) create mode 100644 client/src/system/cache.c rename client/src/{embedded/embedded.h => system/cache.h} (54%) rename client/src/{ => system}/network.c (100%) rename client/src/{ => system}/network.h (100%) create mode 100644 client/src/thirdparty/SHA256/LICENSE create mode 100644 client/src/thirdparty/SHA256/README.md create mode 100644 client/src/thirdparty/SHA256/mark2/Makefile create mode 100644 client/src/thirdparty/SHA256/mark2/sha256.C create mode 100644 client/src/thirdparty/SHA256/mark2/sha256.h create mode 100644 client/src/thirdparty/SHA256/sha256.c create mode 100644 client/src/thirdparty/SHA256/sha256.h delete mode 100644 font/data/vga8x14.dat delete mode 100644 font/data/vga8x16.dat delete mode 100644 font/data/vga8x8.dat rename font/{assets => in}/vga8x14.png (100%) rename font/{assets => in}/vga8x16.png (100%) rename font/{assets => in}/vga8x8.png (100%) create mode 100644 precache/precache.pro create mode 100644 precache/src/main.c diff --git a/.gitignore b/.gitignore index 1007e5d..430cf55 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,8 @@ obj/ retired/ test/ +*/out/ + kanga.world/kirby/ kanga.world/.htaccess kanga.world/README.md diff --git a/LICENSE b/LICENSE index e85ff7d..0e77ed4 100644 --- a/LICENSE +++ b/LICENSE @@ -52,6 +52,11 @@ SDL2 https://www.libsdl.org/ BSD 3-Clause +SHA256 +------ +https://github.com/ilvn/SHA256 +MIT + stb_ds.h -------- https://github.com/nothings/stb diff --git a/client/client.pro b/client/client.pro index 800790b..1c9bfe4 100644 --- a/client/client.pro +++ b/client/client.pro @@ -71,28 +71,29 @@ HEADERS = \ $$SHARED/packets.h \ src/config.h \ $$SHARED/util.h \ - src/embedded/embedded.h \ src/gui/msgbox.h \ src/gui/timer.h \ src/hangup.h \ src/login.h \ src/menu.h \ - src/network.h \ src/runtime.h \ src/signup.h \ + src/system/cache.h \ + src/thirdparty/SHA256/sha256.h \ src/thirdparty/minicoro/minicoro.h \ src/system/comport.h \ src/settings.h \ src/system/color.h \ $$SHARED/memory.h \ src/system/surface.h \ - src/system/taglist.h \ + src/gui/taglist.h \ src/system/keyboard.h \ $$SHARED/array.h \ $$SHARED/log.h \ src/system/mouse.h \ src/system/vesa.h \ src/system/os.h \ + src/system/network.h \ src/embedded/vga8x14.h \ src/embedded/mouse.h \ src/gui/listbox.h \ @@ -122,14 +123,15 @@ SOURCES = \ $$SHARED/thirdparty/tiny-AES-c/aes.c \ $$SHARED/thirdparty/tiny-AES128-C/pkcs7_padding.c \ $$SHARED/memory.c \ - src/embedded/embedded.c \ src/gui/msgbox.c \ src/gui/timer.c \ src/hangup.c \ + src/system/cache.c \ src/system/comport.c \ src/system/os.c \ src/system/surface.c \ - src/system/taglist.c \ + src/system/network.c \ + src/gui/taglist.c \ $$SHARED/util.c \ $$SHARED/array.c \ $$SHARED/log.c \ @@ -151,11 +153,11 @@ SOURCES = \ src/gui/label.c \ src/config.c \ src/main.c \ + src/thirdparty/SHA256/sha256.c \ src/welcome.c \ src/login.c \ src/menu.c \ src/signup.c \ - src/network.c \ src/settings.c LIBS = \ diff --git a/client/data/dconnect.png b/client/in/dconnect.png similarity index 100% rename from client/data/dconnect.png rename to client/in/dconnect.png diff --git a/client/data/ddialing.png b/client/in/ddialing.png similarity index 100% rename from client/data/ddialing.png rename to client/in/ddialing.png diff --git a/client/data/dinit.png b/client/in/dinit.png similarity index 100% rename from client/data/dinit.png rename to client/in/dinit.png diff --git a/client/data/logo.png b/client/in/logo.png similarity index 100% rename from client/data/logo.png rename to client/in/logo.png diff --git a/client/data/mbie32.png b/client/in/mbie32.png similarity index 100% rename from client/data/mbie32.png rename to client/in/mbie32.png diff --git a/client/data/mbii32.png b/client/in/mbii32.png similarity index 100% rename from client/data/mbii32.png rename to client/in/mbii32.png diff --git a/client/data/mbim32.png b/client/in/mbim32.png similarity index 100% rename from client/data/mbim32.png rename to client/in/mbim32.png diff --git a/client/data/mbiq32.png b/client/in/mbiq32.png similarity index 100% rename from client/data/mbiq32.png rename to client/in/mbiq32.png diff --git a/client/data/mbiw32.png b/client/in/mbiw32.png similarity index 100% rename from client/data/mbiw32.png rename to client/in/mbiw32.png diff --git a/client/data/mouse.png b/client/in/mouse.png similarity index 100% rename from client/data/mouse.png rename to client/in/mouse.png diff --git a/client/postBuild.sh b/client/postBuild.sh index e1a7182..3a1ad5d 100755 --- a/client/postBuild.sh +++ b/client/postBuild.sh @@ -22,5 +22,5 @@ SOURCE=$1 TARGET=$2 -mkdir -p ${TARGET}/data -cp ${SOURCE}/data/* ${TARGET}/data/. +#mkdir -p ${TARGET}/data +#cp ${SOURCE}/data/* ${TARGET}/data/. diff --git a/client/src/embedded/embedded.c b/client/src/embedded/embedded.c deleted file mode 100644 index 8885719..0000000 --- a/client/src/embedded/embedded.c +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Kangaroo Punch MultiPlayer Game Server Mark II - * Copyright (C) 2020-2021 Scott Duensing - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program 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. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - - -#define EMBED_HERE -#include "embedded/embedded.h" diff --git a/client/src/embedded/mouse.h b/client/src/embedded/mouse.h deleted file mode 100644 index de48447..0000000 --- a/client/src/embedded/mouse.h +++ /dev/null @@ -1,457 +0,0 @@ -/* - * Kangaroo Punch MultiPlayer Game Server Mark II - * Copyright (C) 2020-2021 Scott Duensing - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program 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. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - - -#ifndef MOUSE_PNG_H -#define MOUSE_PNG_H - - -// ===== THIS FILE IS AUTOMATICALLY GENERATED - DO NOT EDIT ===== - - -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wunused-variable" - -#ifdef EMBED_HERE - -unsigned char mouse_png[] = { - 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, - 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x18, - 0x08, 0x06, 0x00, 0x00, 0x00, 0xf3, 0xa0, 0x7d, 0x0c, 0x00, 0x00, 0x10, - 0x66, 0x7a, 0x54, 0x58, 0x74, 0x52, 0x61, 0x77, 0x20, 0x70, 0x72, 0x6f, - 0x66, 0x69, 0x6c, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x65, 0x78, - 0x69, 0x66, 0x00, 0x00, 0x78, 0xda, 0xc5, 0x9a, 0x5b, 0x76, 0x1b, 0x39, - 0x12, 0x44, 0xff, 0xb1, 0x8a, 0x59, 0x02, 0xde, 0x8f, 0xe5, 0xe0, 0x91, - 0x38, 0xa7, 0x77, 0x30, 0xcb, 0x9f, 0x9b, 0xa8, 0x22, 0x2d, 0xca, 0x94, - 0x65, 0xbb, 0x3f, 0xc6, 0x6c, 0x89, 0xa5, 0x62, 0x15, 0x0a, 0xc8, 0x8c, - 0x8c, 0xc8, 0x00, 0xdb, 0xc8, 0x7f, 0xff, 0xd9, 0xe6, 0x3f, 0xfc, 0x4b, - 0xd6, 0x66, 0x13, 0x53, 0xa9, 0xb9, 0xe5, 0x6c, 0xf9, 0x17, 0x5b, 0x6c, - 0xbe, 0x73, 0x50, 0xed, 0xf5, 0xaf, 0x9f, 0xdf, 0xce, 0xc6, 0xf3, 0xfb, - 0xfe, 0xc3, 0x3e, 0x0e, 0x5e, 0xce, 0x1b, 0xf7, 0xb8, 0xc9, 0x73, 0x2a, - 0xf0, 0x1e, 0xae, 0x3f, 0x6b, 0xbe, 0xcf, 0x0b, 0xe7, 0x3d, 0xd7, 0xfb, - 0xfb, 0xfc, 0xbc, 0xc7, 0xe9, 0x9c, 0x4f, 0x1f, 0x06, 0x6a, 0x72, 0x7f, - 0x30, 0x5e, 0x3f, 0xe8, 0xf7, 0x40, 0xbe, 0xde, 0x0f, 0x78, 0x4c, 0xe5, - 0x7e, 0x50, 0x70, 0xd7, 0x03, 0xec, 0xba, 0x07, 0xea, 0xf7, 0x40, 0xc1, - 0xdf, 0x4f, 0x8e, 0xd7, 0xdf, 0xe3, 0x7e, 0x72, 0x6e, 0xb5, 0x7c, 0x5c, - 0xc2, 0x7a, 0x2c, 0xad, 0xde, 0x67, 0xea, 0xf5, 0x63, 0xf4, 0x57, 0x0c, - 0xc5, 0xe7, 0x94, 0x5d, 0x89, 0xfc, 0x8e, 0xde, 0x96, 0x92, 0x1b, 0xc7, - 0xd5, 0xdb, 0x58, 0x88, 0xdb, 0xd2, 0x89, 0xee, 0xe9, 0x9b, 0xde, 0x97, - 0xc6, 0x35, 0xce, 0xe7, 0xbf, 0xcd, 0xe3, 0x52, 0xcf, 0x9c, 0xbc, 0x04, - 0x17, 0xec, 0xf9, 0x5d, 0xaf, 0x59, 0x06, 0xfd, 0x71, 0xa1, 0xeb, 0xf9, - 0xf3, 0x9b, 0x50, 0xe9, 0xa7, 0x1c, 0x87, 0x73, 0x26, 0x84, 0x72, 0xe2, - 0x6b, 0x0d, 0x29, 0x63, 0x0a, 0xcc, 0xbc, 0xdd, 0xb1, 0x15, 0xfb, 0x8c, - 0xe6, 0x4b, 0x6c, 0x9e, 0xe9, 0x7a, 0xff, 0xcf, 0xfc, 0xce, 0xb2, 0x6e, - 0x38, 0xbc, 0xa4, 0xbb, 0xf7, 0x57, 0x18, 0x98, 0x0f, 0x4f, 0x72, 0xef, - 0x60, 0x90, 0xe5, 0x3e, 0x1f, 0x3e, 0x65, 0x2f, 0x3f, 0xdf, 0xcf, 0x79, - 0xf3, 0xf9, 0x03, 0x97, 0xde, 0xa7, 0xfb, 0xe4, 0xf4, 0xc3, 0x8c, 0x4a, - 0x7c, 0x3e, 0xd8, 0xbf, 0xcc, 0xc8, 0xc5, 0x07, 0xe4, 0x9e, 0xe9, 0x7d, - 0xfe, 0xec, 0xbd, 0xea, 0xde, 0x72, 0xad, 0xae, 0xc7, 0xcc, 0x92, 0xf3, - 0xbd, 0xa8, 0xc7, 0x4a, 0x9c, 0x39, 0xa9, 0xdc, 0x6b, 0x28, 0x08, 0xce, - 0x6d, 0x99, 0x57, 0xe1, 0x27, 0x71, 0x5c, 0xce, 0xab, 0xf1, 0xaa, 0x94, - 0xcb, 0x04, 0x63, 0xcb, 0x4e, 0x3b, 0x78, 0x4d, 0xd7, 0x9c, 0x27, 0x95, - 0x9b, 0x09, 0x2c, 0xd7, 0xdd, 0x36, 0x4e, 0xce, 0xc1, 0x74, 0x93, 0x39, - 0x46, 0x2f, 0xbe, 0xf0, 0xee, 0xfd, 0x24, 0xeb, 0x7a, 0xae, 0x92, 0x8b, - 0xe6, 0x67, 0xd0, 0xa4, 0x47, 0x7d, 0xb9, 0xed, 0x4b, 0x68, 0x61, 0x01, - 0x01, 0x1f, 0x26, 0x50, 0x09, 0x9c, 0xf5, 0x7b, 0x9b, 0x7b, 0x2e, 0xee, - 0x3c, 0xb7, 0x9d, 0xe7, 0x4d, 0xea, 0x6f, 0xd9, 0xe5, 0xb8, 0xd4, 0x3b, - 0x06, 0x73, 0xdc, 0xf2, 0xed, 0xcb, 0xfc, 0xce, 0x45, 0xbf, 0x7a, 0xed, - 0xad, 0xb5, 0xe4, 0x9c, 0x79, 0xd4, 0x0c, 0xb8, 0x60, 0x5e, 0x5e, 0x03, - 0xce, 0x34, 0x34, 0x73, 0xfa, 0x9b, 0xcb, 0xc8, 0x88, 0xdb, 0x77, 0x50, - 0xd3, 0x09, 0xf0, 0xe3, 0xf5, 0x0a, 0xc8, 0x3b, 0xb1, 0x81, 0x14, 0xa6, - 0x13, 0xe6, 0xca, 0x02, 0xbb, 0x1d, 0xd7, 0x10, 0x23, 0xb9, 0x1f, 0xd8, - 0x0a, 0x27, 0xd1, 0x81, 0xeb, 0x12, 0xef, 0x57, 0x71, 0xbb, 0xb2, 0xae, - 0xfb, 0x75, 0xa0, 0xc8, 0xb3, 0x13, 0x93, 0xa1, 0x92, 0xa2, 0xb3, 0xd9, - 0x85, 0xe4, 0xb2, 0xb3, 0xc5, 0xfb, 0xe2, 0x1c, 0x81, 0xac, 0x24, 0xa8, - 0x3b, 0x5b, 0x7d, 0x88, 0x7e, 0x90, 0x01, 0x97, 0x92, 0x5f, 0x4c, 0xd2, - 0xc7, 0x10, 0x32, 0xb9, 0xa1, 0x08, 0x78, 0xb4, 0xe1, 0x9e, 0xe2, 0xce, - 0xb5, 0x3e, 0xf9, 0xeb, 0x3c, 0x2c, 0x49, 0x26, 0x52, 0xc8, 0xa1, 0x90, - 0x9b, 0x16, 0x3a, 0xc9, 0x8a, 0x31, 0x81, 0x9f, 0x12, 0x2b, 0x18, 0xea, - 0x29, 0xa4, 0x98, 0x52, 0xca, 0xa9, 0xa4, 0x9a, 0x5a, 0xea, 0x39, 0xe4, - 0x68, 0xa8, 0xb0, 0x9c, 0x4b, 0x56, 0xba, 0xed, 0x25, 0x94, 0x58, 0x52, - 0xc9, 0xa5, 0x94, 0x5a, 0x5a, 0xe9, 0x35, 0xd4, 0x58, 0x53, 0xcd, 0xb5, - 0xd4, 0x5a, 0x5b, 0xed, 0xcd, 0xb7, 0x00, 0x1b, 0xa7, 0x46, 0x39, 0xb6, - 0xda, 0x5a, 0xeb, 0x9d, 0x67, 0x76, 0x46, 0xee, 0xd9, 0x74, 0xae, 0xef, - 0x9c, 0x19, 0x7e, 0x84, 0x11, 0x47, 0x1a, 0x79, 0x94, 0x51, 0x47, 0x1b, - 0x7d, 0x02, 0x9f, 0x19, 0x67, 0x9a, 0x79, 0x96, 0x59, 0x67, 0x9b, 0x7d, - 0xf9, 0x15, 0x16, 0x75, 0xbc, 0xf2, 0x2a, 0xab, 0xae, 0xb6, 0xba, 0x38, - 0x01, 0x4a, 0x12, 0x25, 0x19, 0xc9, 0x52, 0xa4, 0x4a, 0x93, 0xbe, 0xc1, - 0xda, 0x0e, 0x3b, 0xee, 0xb4, 0xf3, 0x2e, 0xbb, 0xee, 0xb6, 0xfb, 0x33, - 0x6b, 0xee, 0x2e, 0xdb, 0xcf, 0xaf, 0x3f, 0xc8, 0x9a, 0xbb, 0xb3, 0xe6, - 0x4f, 0xa6, 0xf4, 0xba, 0xf2, 0xcc, 0x1a, 0x67, 0x4b, 0xb9, 0xde, 0xcd, - 0xc1, 0x0b, 0x83, 0x68, 0xce, 0xc8, 0x98, 0x8f, 0x8e, 0x8c, 0x17, 0xcd, - 0x00, 0x80, 0xf6, 0x9a, 0x33, 0x5b, 0x5d, 0x8c, 0x5e, 0x33, 0xa7, 0x39, - 0xb3, 0xcd, 0x53, 0x15, 0xc9, 0x33, 0xc9, 0xa4, 0xb9, 0x59, 0xce, 0x76, - 0x97, 0x7d, 0x34, 0x21, 0x8a, 0xf3, 0x69, 0xbb, 0x67, 0xee, 0x7e, 0x64, - 0xee, 0x8f, 0xf2, 0x66, 0x72, 0xfc, 0x65, 0xde, 0xfc, 0xef, 0x66, 0xce, - 0x68, 0xea, 0xfe, 0x65, 0xe6, 0x4e, 0xde, 0x8c, 0xa4, 0x0f, 0x79, 0x7b, - 0x93, 0xb5, 0xa5, 0xdc, 0x3c, 0x4f, 0xc6, 0xae, 0x2a, 0xd4, 0x98, 0xda, - 0x40, 0xf5, 0xf1, 0xb9, 0xf0, 0xd8, 0xb8, 0xf5, 0xb8, 0x9a, 0x5d, 0xf2, - 0xde, 0x65, 0xec, 0x6e, 0xfb, 0x5c, 0xbd, 0x89, 0x1b, 0xbd, 0x10, 0xe0, - 0xde, 0x6b, 0x02, 0xfa, 0x73, 0x87, 0x24, 0x33, 0xc7, 0x54, 0x57, 0x4f, - 0xd5, 0xcf, 0xd4, 0xfb, 0xd2, 0x09, 0x13, 0xef, 0x3e, 0x1c, 0xc1, 0x5c, - 0x84, 0x75, 0x11, 0xae, 0x68, 0x58, 0x48, 0x2f, 0x4d, 0x92, 0xef, 0x4a, - 0x80, 0x76, 0x34, 0xf1, 0x7d, 0xad, 0x22, 0x6d, 0x71, 0x5f, 0x5e, 0xe7, - 0x67, 0xe7, 0x15, 0x4b, 0x0e, 0xb5, 0x27, 0x52, 0x52, 0x72, 0x76, 0x31, - 0xf1, 0x5f, 0x49, 0xcd, 0x5f, 0x47, 0x4a, 0xd4, 0xe6, 0x71, 0xf0, 0x67, - 0xef, 0xd9, 0xe9, 0xbb, 0x4b, 0xbb, 0x16, 0x27, 0x0d, 0xc2, 0xec, 0x66, - 0xce, 0x01, 0xa1, 0xa7, 0x56, 0xe1, 0xfe, 0x2e, 0x3c, 0x75, 0x14, 0xe2, - 0x02, 0x1a, 0x76, 0x49, 0xba, 0x7a, 0xef, 0xb6, 0x84, 0xd4, 0x06, 0x33, - 0x18, 0x8e, 0x49, 0x6e, 0xe6, 0x54, 0x7d, 0xd7, 0x05, 0xd7, 0x91, 0xf2, - 0x86, 0x02, 0x5a, 0xf2, 0x75, 0x9a, 0xb6, 0x56, 0x1b, 0xe3, 0x9a, 0xab, - 0x0c, 0x0f, 0x4e, 0xcf, 0xb3, 0xe2, 0x9f, 0xbe, 0x9b, 0xe7, 0x09, 0x57, - 0x53, 0x22, 0x65, 0x5b, 0xa6, 0x84, 0xbd, 0x7d, 0x24, 0xcc, 0xc8, 0xcb, - 0x20, 0x07, 0x4d, 0x67, 0x06, 0x5a, 0x7c, 0xdf, 0xad, 0xfa, 0x21, 0xe7, - 0xef, 0xd5, 0x66, 0xd9, 0x12, 0x9b, 0x64, 0x24, 0x84, 0xbf, 0x0d, 0xab, - 0x6d, 0xdc, 0x18, 0x15, 0xa9, 0xd7, 0x8a, 0x6b, 0x91, 0xe5, 0xd6, 0x59, - 0x16, 0xa3, 0x31, 0x34, 0x47, 0x3a, 0x5e, 0xd9, 0x9b, 0xb1, 0xd2, 0x3d, - 0x9a, 0x94, 0xed, 0x7c, 0xa9, 0x69, 0xc4, 0xbc, 0x49, 0x40, 0x33, 0xdc, - 0x53, 0xf3, 0x68, 0xb9, 0xec, 0x3c, 0x46, 0xaa, 0x92, 0x28, 0x31, 0xd2, - 0x08, 0x17, 0x88, 0x9b, 0x5a, 0xad, 0x13, 0x76, 0x2c, 0x34, 0x22, 0x7b, - 0xca, 0x68, 0x0c, 0x06, 0x2c, 0xd2, 0xb6, 0x00, 0x4e, 0x6a, 0x12, 0x7d, - 0xc8, 0x6c, 0x6b, 0xd4, 0x6d, 0x08, 0x65, 0x63, 0x5d, 0xdb, 0xdb, 0x94, - 0x47, 0x62, 0xd6, 0xb3, 0x74, 0x5f, 0x58, 0x1d, 0xf7, 0xf9, 0xdc, 0x53, - 0x1c, 0x54, 0x41, 0x88, 0x00, 0x8b, 0x21, 0xdc, 0x52, 0xe5, 0x2c, 0x5c, - 0x67, 0x25, 0xf3, 0x91, 0x87, 0x22, 0xa6, 0x42, 0x2b, 0x2e, 0x88, 0xcd, - 0x65, 0xf0, 0x59, 0x4a, 0xdc, 0x7d, 0xa4, 0x55, 0xa7, 0x00, 0xa8, 0xb9, - 0x52, 0xa3, 0xd6, 0x59, 0xad, 0xa3, 0x68, 0x6a, 0xcb, 0x64, 0xb5, 0x8f, - 0x41, 0x5d, 0xae, 0xb9, 0xe1, 0x87, 0xd2, 0xc7, 0x8e, 0x7d, 0x0e, 0x28, - 0x2c, 0x6e, 0x07, 0xc8, 0xd6, 0x30, 0xc9, 0x47, 0xca, 0x87, 0x21, 0x98, - 0x65, 0x9e, 0xe2, 0x1b, 0x85, 0x95, 0x56, 0xab, 0x17, 0x4e, 0x56, 0x8f, - 0xf5, 0xff, 0x9f, 0xb5, 0x26, 0xf3, 0x01, 0xe0, 0x32, 0xa7, 0x5e, 0xc5, - 0xd0, 0x42, 0xbf, 0xa0, 0xc3, 0xd9, 0x06, 0xa1, 0xe8, 0x11, 0xa3, 0x64, - 0x7d, 0x07, 0xad, 0x94, 0xfd, 0x16, 0xe3, 0xdb, 0xb6, 0x6b, 0x49, 0xa9, - 0xb1, 0xcc, 0x08, 0x0d, 0x75, 0x32, 0x3f, 0x1b, 0xbd, 0x7b, 0x21, 0xf8, - 0x23, 0x14, 0xba, 0xdb, 0x19, 0x39, 0x39, 0x2b, 0xb8, 0xb7, 0xb1, 0x6a, - 0x06, 0xad, 0xac, 0xb4, 0x4b, 0x58, 0x30, 0x8b, 0xdb, 0x6e, 0xe8, 0xcc, - 0xba, 0xd1, 0xac, 0xeb, 0xc8, 0xf9, 0xa4, 0x72, 0x77, 0x0d, 0x1e, 0xcf, - 0xb3, 0x8b, 0x12, 0xf7, 0xd3, 0x79, 0x35, 0x05, 0x91, 0x05, 0x55, 0x2d, - 0xe6, 0xbd, 0x73, 0x8d, 0x69, 0x53, 0xd4, 0x7b, 0x32, 0xb1, 0xba, 0x72, - 0x5e, 0x4e, 0xab, 0xc5, 0x0e, 0x13, 0xd6, 0x4c, 0x62, 0x7b, 0xa3, 0x92, - 0xba, 0x87, 0x22, 0x68, 0x80, 0x24, 0xc5, 0x1e, 0x60, 0xf5, 0x9c, 0x41, - 0xe6, 0x29, 0x4d, 0xe2, 0x34, 0xbf, 0x29, 0x64, 0xf3, 0xb6, 0xb2, 0xcb, - 0x0a, 0x07, 0xcf, 0x81, 0x46, 0x6d, 0xb6, 0x30, 0x57, 0x04, 0x7f, 0xd3, - 0x53, 0x8a, 0xc0, 0x10, 0x36, 0x1d, 0x92, 0x6d, 0xdf, 0x9d, 0x60, 0xe5, - 0x72, 0x42, 0xdd, 0xbc, 0x01, 0xc4, 0x4c, 0x72, 0x55, 0x5a, 0x5a, 0xe8, - 0x10, 0x76, 0xa0, 0x76, 0x1d, 0xa0, 0xcc, 0x65, 0x7c, 0x4e, 0xb4, 0x93, - 0x6b, 0x78, 0x42, 0x79, 0x0d, 0x1f, 0xf6, 0x19, 0xfe, 0xca, 0x1a, 0x4f, - 0x68, 0xf9, 0x7a, 0xc2, 0x68, 0x00, 0x15, 0x8e, 0x64, 0xdd, 0x03, 0x2c, - 0x75, 0x74, 0x20, 0xbb, 0x2e, 0xc0, 0x1d, 0x62, 0x5e, 0x99, 0x0a, 0x00, - 0xc6, 0xe4, 0x7b, 0x4c, 0x94, 0x41, 0xbb, 0x44, 0x18, 0x32, 0x3a, 0xa9, - 0xe0, 0x20, 0x74, 0x38, 0xfb, 0x24, 0xd1, 0x91, 0x26, 0x78, 0xfe, 0xa4, - 0xd8, 0x95, 0x13, 0x7e, 0x5f, 0xb2, 0x4e, 0x81, 0xf2, 0x53, 0x1c, 0x54, - 0x97, 0xfa, 0xa2, 0x22, 0xa9, 0xc1, 0xda, 0x20, 0x74, 0xee, 0x9d, 0xad, - 0x43, 0x45, 0x92, 0x73, 0x5d, 0x08, 0x24, 0xeb, 0x75, 0xa8, 0x15, 0xa2, - 0x96, 0x78, 0x6a, 0x0c, 0x8d, 0xcf, 0x14, 0xfb, 0x94, 0xee, 0x48, 0x28, - 0x1b, 0x48, 0x57, 0xe5, 0x58, 0x2b, 0x48, 0x5f, 0xf0, 0x2d, 0x5c, 0x6d, - 0x4b, 0x20, 0x10, 0x79, 0x12, 0x06, 0x7e, 0x8b, 0x78, 0xb4, 0x29, 0x1b, - 0xcf, 0xac, 0xa9, 0x2b, 0x50, 0x61, 0x41, 0x56, 0xdf, 0xcb, 0x6b, 0x29, - 0x12, 0xed, 0x59, 0x92, 0x53, 0xb2, 0x6e, 0x21, 0x0e, 0xa4, 0x87, 0xb0, - 0x50, 0x77, 0x95, 0xd2, 0xfc, 0x48, 0xdb, 0xf9, 0x49, 0xdb, 0xe6, 0x57, - 0xb4, 0x7c, 0x92, 0x77, 0x52, 0xa7, 0x64, 0xf1, 0xab, 0xe4, 0x69, 0x89, - 0x68, 0xfe, 0x9a, 0x7f, 0x49, 0x1e, 0x95, 0xf4, 0xcb, 0xf4, 0x3d, 0xd3, - 0xb8, 0x03, 0xa5, 0x32, 0x03, 0x8f, 0xaa, 0x66, 0x2a, 0x43, 0xf9, 0xa4, - 0x95, 0x77, 0x58, 0xb1, 0x9d, 0x40, 0xd7, 0x95, 0x0a, 0x47, 0xac, 0x64, - 0x86, 0x82, 0x5a, 0x39, 0x4a, 0xc1, 0x51, 0x49, 0x95, 0x25, 0xd2, 0x67, - 0xf8, 0xb4, 0x52, 0x97, 0xb9, 0x64, 0xa3, 0x97, 0x9e, 0x93, 0xde, 0x9b, - 0x51, 0xa9, 0x03, 0xab, 0x49, 0x0c, 0x83, 0xb5, 0x4c, 0x74, 0x16, 0x8b, - 0x84, 0x9a, 0xe9, 0x3c, 0x07, 0x79, 0x57, 0x5b, 0x70, 0x06, 0x17, 0x16, - 0xa7, 0x0e, 0x64, 0x86, 0xd4, 0x7f, 0xd6, 0x1e, 0xf3, 0x77, 0xe2, 0xf3, - 0xb3, 0xf6, 0x98, 0x6f, 0x68, 0xeb, 0xb7, 0x59, 0xca, 0xbc, 0xa7, 0xa9, - 0x5f, 0xb2, 0xd4, 0xdb, 0x77, 0xa3, 0xb0, 0x55, 0x0f, 0x75, 0x14, 0xe8, - 0xd6, 0x1f, 0xe8, 0xe4, 0xd6, 0x9f, 0xf3, 0xcc, 0xaf, 0x14, 0xe8, 0x45, - 0x80, 0xcc, 0xef, 0x28, 0x10, 0x59, 0x7c, 0xd5, 0xa0, 0x4b, 0x81, 0x0e, - 0x3f, 0x3e, 0x24, 0xc8, 0x5c, 0x1a, 0x04, 0xe0, 0xfe, 0x4e, 0x85, 0x9e, - 0x22, 0x64, 0xfe, 0xa5, 0x0a, 0x3d, 0x45, 0xc8, 0xe8, 0x6c, 0x7e, 0x4f, - 0x87, 0x1e, 0x09, 0x64, 0x41, 0xf3, 0x62, 0xa6, 0x47, 0x12, 0x55, 0xd2, - 0xcd, 0xc9, 0xe3, 0xab, 0xd6, 0xbc, 0xa6, 0xf0, 0x4e, 0x20, 0xde, 0xe7, - 0x97, 0x29, 0x34, 0x5f, 0xe5, 0xf4, 0x56, 0x22, 0xfb, 0xd4, 0xa2, 0x87, - 0x12, 0x5d, 0x3a, 0xf4, 0x50, 0xa1, 0xa7, 0x08, 0x99, 0xbf, 0x52, 0x21, - 0xd8, 0x95, 0x62, 0x98, 0x64, 0x87, 0x10, 0x45, 0x1d, 0x2e, 0x1b, 0x6e, - 0x6a, 0x99, 0xbc, 0xef, 0x95, 0xb2, 0x28, 0xb5, 0x6d, 0x8f, 0x69, 0x82, - 0x9c, 0x74, 0x53, 0x8a, 0x43, 0x6f, 0x29, 0x46, 0xcc, 0x31, 0x0e, 0x17, - 0x63, 0x56, 0xb9, 0xbb, 0xda, 0x30, 0x07, 0x6c, 0x99, 0xe9, 0x4e, 0x21, - 0xc1, 0x89, 0xe5, 0x48, 0xc5, 0x99, 0x99, 0xd2, 0x8c, 0x03, 0xfa, 0x5c, - 0x64, 0x93, 0x18, 0x45, 0x02, 0x14, 0x5d, 0x1c, 0x08, 0x14, 0x68, 0x83, - 0x35, 0xe9, 0x5a, 0x17, 0x9c, 0x4b, 0xaa, 0x71, 0x84, 0x30, 0x3d, 0xfe, - 0x60, 0xe2, 0xc2, 0x75, 0xea, 0x20, 0x8f, 0xb9, 0x4c, 0xdd, 0x92, 0x49, - 0x06, 0x4b, 0x8b, 0x66, 0x61, 0x16, 0xa9, 0xcb, 0x11, 0x3a, 0xd5, 0x4c, - 0x66, 0x9b, 0x96, 0x21, 0x4b, 0x01, 0xca, 0x7d, 0x43, 0x12, 0x73, 0xca, - 0x76, 0x98, 0x85, 0xc4, 0xdc, 0x56, 0x50, 0x34, 0x2b, 0x25, 0x8c, 0x05, - 0x9a, 0x4a, 0x94, 0x80, 0x1e, 0x36, 0xda, 0x63, 0xb2, 0x51, 0xa4, 0xcc, - 0x53, 0xfd, 0x61, 0x25, 0xd0, 0xbb, 0xbb, 0xa3, 0x6d, 0xcf, 0x76, 0x82, - 0x78, 0x7c, 0xaa, 0x74, 0x0f, 0x7e, 0x00, 0xe6, 0xb1, 0x18, 0x68, 0x2d, - 0x59, 0x8c, 0x10, 0x62, 0x6a, 0xd8, 0x99, 0xda, 0x7d, 0xa5, 0xd3, 0x8e, - 0xe6, 0xdf, 0xc9, 0xe2, 0x0f, 0x62, 0x35, 0xdf, 0xca, 0xe2, 0x77, 0xef, - 0xb7, 0x6c, 0x9a, 0xf7, 0xba, 0xf9, 0xe7, 0xb2, 0x69, 0xde, 0xeb, 0xe6, - 0x3e, 0x4f, 0x71, 0xb9, 0x4c, 0x6f, 0x31, 0xe6, 0x19, 0x2c, 0x83, 0xbb, - 0xe2, 0x79, 0xd4, 0x8e, 0x7e, 0x7b, 0x51, 0x91, 0x8b, 0x9b, 0x7a, 0x44, - 0x4e, 0xf7, 0x48, 0x53, 0x4c, 0xc9, 0x98, 0x29, 0xc4, 0x2e, 0x8a, 0x1d, - 0x62, 0x05, 0xbb, 0xb8, 0x32, 0x48, 0x91, 0x44, 0x08, 0x49, 0x23, 0x4a, - 0xbb, 0x63, 0x44, 0xe8, 0x76, 0x03, 0x63, 0x2b, 0x82, 0x8a, 0x10, 0x62, - 0x46, 0x4e, 0xa1, 0x15, 0x7c, 0x1a, 0xc6, 0xa9, 0x43, 0x47, 0x1e, 0x1c, - 0x31, 0xaf, 0x4c, 0x09, 0xa1, 0xb0, 0x58, 0x1f, 0xd8, 0x5a, 0xfc, 0xc2, - 0x02, 0x0a, 0x45, 0xa7, 0x18, 0x77, 0x6d, 0x25, 0x3c, 0x24, 0x56, 0x0e, - 0x6c, 0xd6, 0xde, 0x03, 0x9e, 0xd0, 0x21, 0xc5, 0x81, 0xa8, 0xe6, 0x59, - 0x17, 0x26, 0x08, 0x4e, 0xdf, 0xa9, 0x40, 0xb5, 0xa9, 0xc1, 0x43, 0xd8, - 0xb5, 0xd0, 0xeb, 0x1e, 0xb9, 0xc7, 0xd6, 0xd5, 0x48, 0x8d, 0x2d, 0x4a, - 0xc0, 0x29, 0x54, 0x2c, 0xe0, 0x08, 0x56, 0xb3, 0xec, 0xe1, 0xfb, 0xc6, - 0xe1, 0xbb, 0xd2, 0x36, 0xaf, 0xb5, 0x1d, 0xec, 0xf7, 0x20, 0xd8, 0xf0, - 0xe2, 0x0a, 0x01, 0x1b, 0x76, 0x30, 0xa4, 0x9b, 0xa7, 0xbc, 0x9b, 0xc7, - 0xc1, 0xfd, 0x3e, 0x9c, 0x6c, 0x92, 0xa3, 0x06, 0x70, 0x05, 0xa2, 0x1a, - 0x61, 0x38, 0x3a, 0x10, 0x9b, 0x5b, 0xc2, 0xc4, 0x26, 0x72, 0x8d, 0x64, - 0x86, 0x25, 0xb3, 0xe0, 0x10, 0x25, 0x5a, 0xaf, 0x98, 0x15, 0x5c, 0xb3, - 0x81, 0x9d, 0xb7, 0x6e, 0x39, 0x2e, 0x1d, 0xa5, 0x5d, 0xb6, 0x32, 0xca, - 0x56, 0x0e, 0xd1, 0x79, 0x62, 0x20, 0xaf, 0x2e, 0xb6, 0x06, 0xa7, 0x07, - 0x1a, 0xa6, 0x2d, 0x8e, 0xd1, 0xb9, 0x6f, 0x2f, 0xbb, 0x8a, 0x2e, 0x4c, - 0xec, 0xa4, 0x3d, 0x3e, 0xb8, 0xf1, 0x9d, 0x54, 0x61, 0x47, 0xff, 0x7a, - 0x30, 0xa3, 0xa3, 0x7d, 0x1a, 0x4c, 0x49, 0xd9, 0x4b, 0x1b, 0x54, 0x67, - 0x10, 0x58, 0x17, 0x82, 0x1d, 0x83, 0x1a, 0xa3, 0xcf, 0x1a, 0x6b, 0xf8, - 0xd6, 0x97, 0xd0, 0x37, 0xe9, 0x86, 0x05, 0x39, 0xb5, 0x58, 0x7a, 0x60, - 0xd8, 0x0c, 0xce, 0x97, 0x1a, 0xed, 0xa7, 0x37, 0x69, 0x6b, 0x57, 0xc5, - 0x37, 0xfc, 0xb1, 0xec, 0xbe, 0xd8, 0xfc, 0x6a, 0xd4, 0xa9, 0xfd, 0x78, - 0x98, 0xac, 0xc8, 0xf5, 0x37, 0xb7, 0xa0, 0xdf, 0xa4, 0xc3, 0xd1, 0x34, - 0x9c, 0x12, 0x81, 0x8f, 0x54, 0x22, 0x9f, 0xed, 0xc9, 0xdf, 0x76, 0x27, - 0xe6, 0x73, 0x7b, 0xf2, 0xa9, 0x3b, 0x39, 0x32, 0xf8, 0xcd, 0x5c, 0xe9, - 0x5f, 0x66, 0x61, 0x46, 0x7b, 0xd0, 0x95, 0xdd, 0xcc, 0x7b, 0x11, 0x6f, - 0x29, 0x36, 0xad, 0x85, 0xbe, 0x90, 0x57, 0x3a, 0x4e, 0xa2, 0x11, 0x6b, - 0x5d, 0xb5, 0x7a, 0xfa, 0x2a, 0x48, 0xea, 0x23, 0xe9, 0x56, 0x41, 0x36, - 0x5b, 0x26, 0x46, 0x00, 0xc5, 0xea, 0x16, 0x0d, 0xc0, 0x80, 0x79, 0x3d, - 0xca, 0x54, 0x0a, 0xab, 0xed, 0xda, 0xc5, 0xa1, 0xb0, 0x09, 0x6a, 0x26, - 0xe2, 0xdf, 0xf3, 0xa6, 0x79, 0x4f, 0x9c, 0x5f, 0xf1, 0x66, 0x69, 0x47, - 0x3e, 0x76, 0x3a, 0x42, 0x09, 0xd5, 0xc3, 0x63, 0xc4, 0x8e, 0x2a, 0x35, - 0xa7, 0x53, 0x90, 0x1d, 0xe9, 0xa8, 0xa0, 0xfe, 0x99, 0xc3, 0x1f, 0xb5, - 0xa0, 0x3f, 0x3a, 0x50, 0xf3, 0xa6, 0x05, 0xa5, 0x35, 0xe9, 0xf1, 0x2d, - 0x55, 0xa6, 0xcb, 0xa3, 0xb1, 0x32, 0xaa, 0xb9, 0xcf, 0xad, 0xde, 0xcc, - 0x0d, 0x08, 0x61, 0x33, 0x23, 0x64, 0x72, 0x35, 0x2f, 0x1d, 0xb2, 0x71, - 0x1e, 0x2a, 0xdb, 0xbe, 0x79, 0x16, 0xe9, 0xaa, 0x44, 0x1f, 0xb3, 0xee, - 0x3b, 0x2e, 0x5d, 0x25, 0xc2, 0xea, 0x14, 0xb7, 0x40, 0x53, 0xfc, 0x01, - 0x30, 0x3e, 0x2a, 0x5c, 0xcc, 0x4d, 0x4f, 0xb8, 0x8d, 0x7e, 0x9f, 0x90, - 0x45, 0xa9, 0x6c, 0x6c, 0x22, 0xcc, 0x7b, 0xc8, 0xd7, 0xa2, 0xd0, 0x34, - 0x1e, 0x25, 0x6b, 0x5d, 0x85, 0xa2, 0x3c, 0xc3, 0x15, 0x42, 0x63, 0xb4, - 0xd0, 0x6a, 0x97, 0x01, 0x84, 0xaa, 0x74, 0x9f, 0xda, 0xd0, 0x64, 0xd3, - 0x57, 0x0f, 0x65, 0x75, 0xd2, 0x45, 0x93, 0x22, 0x39, 0x8e, 0x9d, 0x7b, - 0x6b, 0xa8, 0xce, 0x22, 0x75, 0x81, 0x60, 0xaa, 0x0b, 0xd4, 0xef, 0x6b, - 0x4e, 0x3f, 0xa0, 0x1d, 0x3f, 0x72, 0xce, 0x01, 0xe8, 0x04, 0xe6, 0x78, - 0x39, 0x80, 0x50, 0x43, 0x9e, 0x86, 0xfe, 0x2b, 0x86, 0xa5, 0x71, 0x86, - 0x25, 0x68, 0xb1, 0x00, 0x0d, 0x04, 0xcb, 0xc8, 0xf0, 0x94, 0xaf, 0x70, - 0xbb, 0x6d, 0x54, 0x6a, 0xf6, 0xa1, 0xc3, 0x7b, 0xb3, 0x8f, 0x09, 0x56, - 0xb5, 0x21, 0x1c, 0x89, 0x5b, 0x74, 0xef, 0x49, 0xb3, 0x3a, 0xcf, 0xd2, - 0x52, 0xa0, 0x63, 0xaa, 0x72, 0x0a, 0x42, 0xc8, 0xaf, 0x74, 0xf4, 0x03, - 0xfe, 0x62, 0x4a, 0x93, 0xb5, 0x85, 0x19, 0x84, 0x16, 0x04, 0xef, 0xd9, - 0x6a, 0x59, 0xd9, 0x7b, 0xa8, 0x5b, 0x9d, 0xd2, 0xce, 0x61, 0x9c, 0xcc, - 0x35, 0x80, 0xd5, 0x9b, 0xe9, 0xe1, 0x1a, 0x98, 0x58, 0xe9, 0xc0, 0x3a, - 0xea, 0xee, 0x1a, 0xea, 0x4d, 0xaf, 0x52, 0xd6, 0xe5, 0x74, 0x9b, 0xa3, - 0x4c, 0x27, 0xba, 0xd3, 0x3e, 0x4c, 0xe5, 0xc3, 0x1d, 0xcc, 0xc3, 0x30, - 0x91, 0x7b, 0x1a, 0x00, 0x27, 0xc5, 0xa0, 0xed, 0x0d, 0x6d, 0xe7, 0xb8, - 0x42, 0xec, 0x49, 0x50, 0xaa, 0x28, 0x43, 0x88, 0x48, 0xc1, 0x3d, 0xf1, - 0xe7, 0xf5, 0xc3, 0xad, 0x53, 0xd2, 0x13, 0xf5, 0x32, 0x8b, 0x89, 0x72, - 0x9a, 0x68, 0x8c, 0x4d, 0x55, 0xef, 0xcb, 0xf4, 0x49, 0x8c, 0xa4, 0x51, - 0xf7, 0x34, 0xb3, 0xca, 0xd2, 0xcb, 0x2d, 0xe7, 0x8e, 0x6b, 0x5d, 0xd7, - 0xaa, 0xa0, 0xb9, 0x85, 0x39, 0x7e, 0x8d, 0xc3, 0x33, 0x0c, 0x7f, 0x8a, - 0x6f, 0xf3, 0x95, 0xc5, 0x42, 0xee, 0xc6, 0xc7, 0x56, 0xf1, 0xd1, 0xe8, - 0xd5, 0x45, 0xd2, 0xc7, 0x49, 0x7a, 0x15, 0x4a, 0x8b, 0x85, 0x0c, 0xaa, - 0x93, 0x26, 0x62, 0x68, 0x7b, 0xdc, 0xc6, 0x42, 0x64, 0x71, 0xfb, 0x4f, - 0x4e, 0x0a, 0x9e, 0x5a, 0xd5, 0xc4, 0x77, 0xf9, 0x82, 0xee, 0x9f, 0x04, - 0x3d, 0x04, 0x6f, 0x60, 0xea, 0x58, 0xf4, 0x5e, 0x24, 0x8a, 0xf2, 0x41, - 0xad, 0xf3, 0x86, 0x00, 0x9a, 0xf8, 0x31, 0x55, 0x0b, 0x91, 0xd2, 0x16, - 0x60, 0x86, 0xda, 0x94, 0x12, 0xb9, 0x17, 0x17, 0xdd, 0x8a, 0x57, 0x65, - 0xf7, 0x78, 0x5c, 0x6c, 0xac, 0x8b, 0x72, 0x7a, 0x26, 0xfc, 0x1a, 0xed, - 0x2a, 0x2e, 0x0a, 0x0e, 0xda, 0x14, 0x9a, 0xf8, 0x29, 0x95, 0x2a, 0x21, - 0x71, 0x40, 0x5e, 0x5a, 0xe9, 0xf4, 0x1f, 0x18, 0x01, 0xa2, 0xcc, 0xe2, - 0x7a, 0x82, 0x8e, 0xd3, 0x42, 0xfa, 0x3b, 0xde, 0x00, 0x8c, 0x8a, 0xcd, - 0x6a, 0x98, 0xdb, 0x1c, 0xd5, 0xc8, 0x82, 0xe3, 0x90, 0xbd, 0x28, 0xc8, - 0x04, 0x56, 0x81, 0xde, 0xbf, 0x51, 0x40, 0xc0, 0xb9, 0xe7, 0x45, 0x17, - 0xef, 0x93, 0x55, 0x0b, 0x0c, 0xfd, 0x21, 0x54, 0x44, 0xf2, 0xb4, 0xf3, - 0xfe, 0x67, 0x23, 0x64, 0xbe, 0x70, 0x42, 0x20, 0x1b, 0x9c, 0x20, 0xa2, - 0x9c, 0x81, 0x2e, 0x5c, 0x56, 0x4f, 0x19, 0x51, 0x5f, 0x21, 0xc2, 0xbd, - 0x30, 0x2d, 0xd1, 0x15, 0xd1, 0x20, 0x39, 0x44, 0xb8, 0xfa, 0x6d, 0x2e, - 0x43, 0xa8, 0x1b, 0x43, 0x08, 0x13, 0x1d, 0x2b, 0x9e, 0x91, 0x16, 0xa0, - 0xab, 0xf6, 0x00, 0xfe, 0x7b, 0xd7, 0xc8, 0xa5, 0x90, 0xce, 0xe6, 0xc2, - 0x74, 0x25, 0x2e, 0xdd, 0x7c, 0x5f, 0xfa, 0xc5, 0x62, 0xd5, 0xf2, 0xdb, - 0x95, 0x7e, 0xa3, 0x74, 0xc3, 0x2d, 0x3c, 0xca, 0x37, 0x35, 0x35, 0x15, - 0xeb, 0x43, 0x14, 0x97, 0xfa, 0xcb, 0xc5, 0xe0, 0x3c, 0x36, 0xcb, 0xd2, - 0x56, 0x11, 0x51, 0xd9, 0x94, 0xf8, 0xb2, 0x97, 0xfd, 0xcc, 0xdd, 0x5f, - 0xed, 0xc9, 0xa9, 0xdf, 0xf3, 0x6e, 0x1e, 0x07, 0x8f, 0x6e, 0xe5, 0x1b, - 0x37, 0xf9, 0x68, 0x57, 0x7e, 0x82, 0xaa, 0xf9, 0xa2, 0x5f, 0xd9, 0xa1, - 0x1c, 0xec, 0x79, 0x1a, 0x35, 0xfa, 0xbf, 0x40, 0xb3, 0xa4, 0x7d, 0xc9, - 0xb2, 0xb2, 0xc3, 0x2b, 0xe3, 0xa8, 0x43, 0xc8, 0x09, 0xa5, 0x2d, 0xde, - 0xa1, 0x57, 0x20, 0x43, 0xb4, 0x37, 0xa0, 0xfb, 0xb2, 0xf5, 0xf2, 0x8c, - 0x54, 0x17, 0x45, 0xaf, 0xa2, 0xa8, 0xdf, 0x45, 0x91, 0xb8, 0x72, 0x79, - 0x46, 0xb5, 0xec, 0xd4, 0xd8, 0xbd, 0xe7, 0x62, 0xed, 0xb5, 0xeb, 0x72, - 0xfc, 0x5a, 0x78, 0x70, 0xc9, 0x4d, 0x52, 0xca, 0x51, 0x09, 0xe7, 0xe5, - 0xa7, 0x36, 0x8b, 0x10, 0xb7, 0xee, 0xc2, 0x24, 0x24, 0x4f, 0x22, 0x44, - 0xa7, 0xdf, 0xe5, 0x3d, 0x2c, 0x64, 0x8b, 0xe9, 0xf2, 0x90, 0xd9, 0x90, - 0xe3, 0xb2, 0x92, 0x67, 0x20, 0xaf, 0x4d, 0x24, 0xe8, 0xc3, 0x10, 0x2d, - 0x2d, 0xbe, 0x59, 0x46, 0x3f, 0xea, 0xb5, 0xb4, 0x30, 0x72, 0x5e, 0xba, - 0xe3, 0xe2, 0x7c, 0xc4, 0x53, 0x26, 0x32, 0x9c, 0xf1, 0x49, 0x99, 0x35, - 0x5c, 0xc4, 0x30, 0xcd, 0xc5, 0x0b, 0xe0, 0x70, 0x15, 0xbb, 0x33, 0x1d, - 0x1b, 0x1d, 0x57, 0x49, 0xbd, 0xc5, 0xee, 0xe9, 0x2e, 0x75, 0xd7, 0x4d, - 0xbb, 0x49, 0x8c, 0xa5, 0xee, 0xcd, 0x57, 0xfa, 0xdf, 0xc9, 0xa3, 0x81, - 0xb6, 0xea, 0x04, 0x25, 0xc8, 0x3a, 0xa6, 0x76, 0x25, 0xc8, 0x91, 0xb6, - 0x4e, 0x3c, 0xe6, 0x22, 0x32, 0xc0, 0x5d, 0xd6, 0x65, 0xf8, 0x46, 0x49, - 0x88, 0xaf, 0xea, 0x84, 0x26, 0x21, 0xd2, 0xdd, 0x0e, 0xb8, 0x0d, 0x94, - 0x46, 0x35, 0xa4, 0x42, 0x4f, 0x82, 0x88, 0xd1, 0x56, 0xaf, 0x35, 0x72, - 0x2e, 0xc9, 0xe8, 0x17, 0x96, 0x4f, 0xa1, 0x40, 0xa4, 0xa5, 0x30, 0xb9, - 0xfa, 0xdc, 0x8e, 0xb1, 0x8f, 0xbd, 0xe0, 0x4f, 0x3e, 0x7c, 0x28, 0xe0, - 0xf1, 0x91, 0x78, 0x2f, 0xac, 0x32, 0x37, 0x99, 0x8d, 0x5f, 0xd3, 0x1d, - 0x91, 0x7d, 0x9a, 0x59, 0xbd, 0xcc, 0x67, 0x57, 0x61, 0x1b, 0x80, 0x74, - 0x9a, 0x54, 0xca, 0x0b, 0x37, 0xfa, 0x19, 0x7f, 0x1f, 0xe1, 0x07, 0x90, - 0x84, 0x86, 0x1d, 0x8d, 0xb2, 0xba, 0x4b, 0x0d, 0x9a, 0x1c, 0xea, 0xb7, - 0x80, 0xd5, 0xa0, 0x3d, 0x58, 0xfa, 0x18, 0x7c, 0xf8, 0xdc, 0x34, 0x09, - 0xa8, 0x18, 0xd1, 0xc3, 0x75, 0x70, 0x86, 0xfe, 0x86, 0xe8, 0xd3, 0x89, - 0x10, 0x6c, 0x81, 0x6d, 0x84, 0xda, 0x77, 0x63, 0x98, 0x4a, 0x1a, 0x03, - 0x25, 0x95, 0x2c, 0x0c, 0x01, 0xeb, 0x45, 0x60, 0x75, 0x36, 0x62, 0x60, - 0x3b, 0x69, 0xba, 0x0d, 0xa4, 0x73, 0x87, 0xac, 0xfa, 0x85, 0xae, 0xe6, - 0xf4, 0x9b, 0xdf, 0x7e, 0xc4, 0x3a, 0xf3, 0x50, 0x84, 0x1f, 0x39, 0xf5, - 0xc3, 0x14, 0xe5, 0xd0, 0x05, 0xad, 0x61, 0xe6, 0xa9, 0x05, 0xdd, 0xe9, - 0xcb, 0x5e, 0xbd, 0x34, 0x2c, 0x83, 0xe8, 0x6e, 0x4a, 0x81, 0x96, 0xee, - 0x94, 0x2e, 0xf3, 0xda, 0xc8, 0xd4, 0xc1, 0x99, 0x34, 0x40, 0x06, 0x36, - 0x89, 0xe7, 0xd0, 0xef, 0xbc, 0x96, 0x61, 0x85, 0x18, 0x22, 0x4a, 0x9e, - 0x12, 0xdf, 0x04, 0xda, 0xe5, 0x58, 0x6a, 0x9c, 0xa0, 0x10, 0x28, 0x52, - 0xe5, 0x61, 0x97, 0x2e, 0xba, 0xc7, 0x5a, 0x90, 0x1a, 0x38, 0x95, 0xd4, - 0xc5, 0xce, 0xcf, 0xbc, 0xda, 0x7c, 0x9c, 0x51, 0x68, 0x5a, 0x53, 0xe6, - 0xf4, 0xfc, 0xd3, 0x6b, 0x7f, 0xa0, 0x05, 0x60, 0x9b, 0xba, 0x37, 0x4f, - 0xaf, 0x06, 0x7c, 0x96, 0x7a, 0x3a, 0x00, 0x15, 0x15, 0x35, 0x4a, 0x52, - 0xd4, 0x1f, 0x4e, 0xcc, 0xc3, 0x9f, 0x4b, 0x1a, 0x8e, 0x7f, 0x94, 0x98, - 0x8f, 0x35, 0xd0, 0x0d, 0x84, 0xa7, 0x3b, 0xd8, 0x6d, 0x0f, 0x28, 0x59, - 0xd0, 0x2c, 0x85, 0x53, 0x80, 0xb1, 0x23, 0xbc, 0xd2, 0x66, 0x9d, 0xf4, - 0x8c, 0xba, 0x65, 0xf0, 0xd8, 0x86, 0xd0, 0xed, 0x93, 0xcc, 0xea, 0x86, - 0xd0, 0xce, 0x5a, 0x96, 0x31, 0x2a, 0xbe, 0xbf, 0x2c, 0xbf, 0x81, 0x1e, - 0xcd, 0x0c, 0x88, 0x8e, 0x5e, 0xf9, 0x13, 0x83, 0xce, 0x2c, 0x20, 0x31, - 0x6f, 0x21, 0xbb, 0xe4, 0xb5, 0x1f, 0x8c, 0xd0, 0xf6, 0x50, 0x1b, 0xdc, - 0xcf, 0xf7, 0x58, 0x2a, 0xd8, 0x3c, 0x95, 0xf9, 0xa3, 0xb9, 0xba, 0x11, - 0x64, 0xfa, 0xa5, 0xe2, 0x99, 0x78, 0xe3, 0xa5, 0xe1, 0xb6, 0xaa, 0x91, - 0xa5, 0x15, 0x83, 0xe0, 0x37, 0x5d, 0x35, 0xb9, 0x57, 0xf7, 0xa5, 0xdf, - 0xf8, 0x53, 0xec, 0x9d, 0x36, 0x77, 0xfb, 0x5d, 0x10, 0x34, 0xf0, 0x32, - 0x46, 0x0b, 0x54, 0x8d, 0x4a, 0x07, 0xda, 0x9f, 0xc8, 0x4d, 0xfa, 0xb8, - 0x57, 0xfe, 0x6e, 0xab, 0x9c, 0x2b, 0xe9, 0xa8, 0xb9, 0xd6, 0x22, 0x3e, - 0x09, 0xb4, 0xa0, 0x06, 0xb9, 0xe3, 0x27, 0x0a, 0x2d, 0x3c, 0x60, 0xae, - 0xcd, 0x40, 0x04, 0xfa, 0x45, 0x60, 0xd3, 0x4d, 0x2a, 0x9a, 0xb3, 0xb6, - 0xbd, 0x53, 0xbd, 0x2c, 0xc0, 0xaa, 0x4d, 0x48, 0x72, 0x52, 0xf7, 0x17, - 0x73, 0x02, 0x27, 0x0b, 0x4c, 0xcf, 0xf0, 0x28, 0x49, 0x87, 0x2f, 0x7b, - 0x92, 0xe8, 0xea, 0xe8, 0x60, 0xc0, 0xd0, 0xe7, 0xab, 0xd4, 0x2e, 0x49, - 0x85, 0x5e, 0xb2, 0x08, 0xed, 0x2d, 0xe6, 0xb3, 0x83, 0xd3, 0x79, 0x3b, - 0xbb, 0x4d, 0xc5, 0xbf, 0x9a, 0xbc, 0x2b, 0xcf, 0xfa, 0x25, 0xe2, 0x45, - 0x75, 0xd4, 0x2d, 0xdd, 0x88, 0xa8, 0xf7, 0x60, 0xfe, 0x37, 0xaf, 0x5c, - 0xb4, 0x02, 0xf1, 0x4c, 0x25, 0x1f, 0x59, 0xf1, 0x6c, 0x86, 0xc0, 0x87, - 0x60, 0x11, 0x30, 0xc1, 0x15, 0xf4, 0xe8, 0x6e, 0xc2, 0x7b, 0x08, 0x7e, - 0x72, 0x67, 0xca, 0x24, 0x99, 0x26, 0xc2, 0xc5, 0xaa, 0x2e, 0x3f, 0x65, - 0xc5, 0x67, 0x23, 0x26, 0xc7, 0x48, 0xca, 0x44, 0x8b, 0xdf, 0x54, 0xe8, - 0xbb, 0x26, 0x07, 0x12, 0x99, 0x00, 0x12, 0x58, 0x5b, 0xad, 0x37, 0x5a, - 0x4f, 0x1e, 0xae, 0xd5, 0x2b, 0x89, 0xbc, 0xe6, 0x18, 0x6a, 0xd3, 0x92, - 0xd4, 0x95, 0xeb, 0xa3, 0x29, 0x40, 0xcd, 0x68, 0xd6, 0x3e, 0x21, 0xd1, - 0x71, 0x71, 0x65, 0x4a, 0x88, 0x24, 0xb2, 0xbc, 0x54, 0x45, 0xee, 0xdd, - 0xb2, 0xa4, 0x65, 0x7b, 0xed, 0x96, 0x11, 0x7c, 0x18, 0x8f, 0x8a, 0xd3, - 0xf6, 0x07, 0x57, 0xe0, 0xaa, 0x06, 0x59, 0x79, 0x13, 0x2c, 0x23, 0x11, - 0xc1, 0xa7, 0xad, 0xfe, 0xaa, 0xed, 0xac, 0xbb, 0x43, 0x1e, 0xe9, 0x40, - 0x4c, 0xcc, 0xad, 0x26, 0x6a, 0x80, 0xf0, 0x3d, 0xcf, 0xe6, 0x95, 0xdf, - 0xfb, 0x29, 0x24, 0xba, 0xc5, 0x71, 0x35, 0x31, 0xb7, 0x98, 0x20, 0x25, - 0x09, 0xa5, 0x42, 0xf7, 0xd2, 0xbe, 0xbf, 0x66, 0x31, 0x5f, 0x63, 0xe7, - 0x57, 0x7d, 0xfe, 0xd5, 0xe6, 0x5f, 0xbd, 0xfb, 0xc5, 0xc8, 0xe6, 0xd9, - 0xba, 0xf7, 0x45, 0x03, 0x97, 0xab, 0xca, 0x6d, 0xde, 0x3f, 0xf8, 0x98, - 0xaa, 0xa9, 0xa2, 0x4e, 0x24, 0x1c, 0x46, 0x26, 0xe4, 0xfe, 0x99, 0x76, - 0x6d, 0xdd, 0x48, 0x98, 0xee, 0x2f, 0x45, 0xd3, 0xf1, 0x7a, 0xd7, 0xd7, - 0x83, 0xd0, 0xeb, 0x79, 0x96, 0x5a, 0x14, 0x92, 0x43, 0x88, 0x56, 0x18, - 0x87, 0x39, 0x63, 0x9a, 0x03, 0x0d, 0xc3, 0xb5, 0xee, 0x07, 0xe9, 0xe2, - 0xb0, 0xe6, 0x8c, 0x1f, 0xd0, 0x65, 0x5e, 0x60, 0xf6, 0xe5, 0x7b, 0xef, - 0x2a, 0x59, 0x52, 0x28, 0xe5, 0x2d, 0x39, 0xa3, 0xeb, 0x03, 0x8f, 0x31, - 0xd4, 0xdd, 0x07, 0xd7, 0xaa, 0xeb, 0xce, 0x28, 0x47, 0x74, 0xfd, 0xe6, - 0x9c, 0x8a, 0x07, 0xdb, 0x54, 0x3e, 0xe9, 0xcf, 0x22, 0xfa, 0x9d, 0xbc, - 0x78, 0x01, 0x62, 0x6e, 0x2f, 0x75, 0xc8, 0x34, 0xba, 0x47, 0xa0, 0x2f, - 0x87, 0x30, 0xd6, 0x7d, 0x1a, 0xbb, 0xa3, 0x1f, 0xb8, 0xd3, 0xb0, 0x33, - 0x6f, 0x70, 0x38, 0xa8, 0xbe, 0x4d, 0x24, 0xfd, 0xf9, 0xb8, 0x91, 0x90, - 0xad, 0x5f, 0x65, 0xec, 0x39, 0x61, 0x00, 0xed, 0xb0, 0xc0, 0xc7, 0x61, - 0xdd, 0xc3, 0xb9, 0x84, 0xe2, 0x4a, 0x4c, 0x92, 0x43, 0xc6, 0xe6, 0x67, - 0x36, 0x56, 0x01, 0x52, 0x1f, 0x31, 0x4a, 0x4b, 0x17, 0x7e, 0xf5, 0x7f, - 0x8d, 0x68, 0x9d, 0x00, 0x65, 0x27, 0x0b, 0x85, 0x9f, 0x0a, 0xef, 0x8c, - 0x75, 0x86, 0xac, 0x48, 0xab, 0x40, 0x7d, 0xd9, 0x00, 0x67, 0xe2, 0xad, - 0x8d, 0x21, 0xcd, 0xac, 0x2b, 0x96, 0x06, 0x92, 0x1f, 0xa6, 0x9d, 0x90, - 0x46, 0x20, 0x45, 0x52, 0x72, 0x8c, 0xba, 0x91, 0xc2, 0x0d, 0x57, 0xcc, - 0x40, 0x7b, 0xfc, 0x1c, 0x45, 0x6a, 0x8d, 0x7b, 0xcc, 0xff, 0x00, 0x59, - 0x81, 0x84, 0x20, 0x42, 0x67, 0xd2, 0x1b, 0x00, 0x00, 0x01, 0x86, 0x69, - 0x43, 0x43, 0x50, 0x49, 0x43, 0x43, 0x20, 0x70, 0x72, 0x6f, 0x66, 0x69, - 0x6c, 0x65, 0x00, 0x00, 0x78, 0x9c, 0x7d, 0x91, 0x3d, 0x48, 0xc3, 0x40, - 0x1c, 0xc5, 0x5f, 0x53, 0xa5, 0x52, 0x2b, 0x0e, 0x16, 0x11, 0x11, 0xc9, - 0x50, 0x9d, 0x2c, 0x88, 0x8a, 0x08, 0x2e, 0x5a, 0x85, 0x22, 0x54, 0x08, - 0xb5, 0x42, 0xab, 0x0e, 0x26, 0x97, 0x7e, 0x08, 0x4d, 0x1a, 0x92, 0x14, - 0x17, 0x47, 0xc1, 0xb5, 0xe0, 0xe0, 0xc7, 0x62, 0xd5, 0xc1, 0xc5, 0x59, - 0x57, 0x07, 0x57, 0x41, 0x10, 0xfc, 0x00, 0x71, 0x73, 0x73, 0x52, 0x74, - 0x91, 0x12, 0xff, 0x97, 0x14, 0x5a, 0xc4, 0x7a, 0x70, 0xdc, 0x8f, 0x77, - 0xf7, 0x1e, 0x77, 0xef, 0x00, 0xa1, 0x5a, 0x64, 0x9a, 0xd5, 0x36, 0x0a, - 0x68, 0xba, 0x6d, 0x26, 0xe3, 0x31, 0x31, 0x9d, 0x59, 0x11, 0x03, 0xaf, - 0x08, 0xa2, 0x13, 0xbd, 0x98, 0xc6, 0xa0, 0xcc, 0x2c, 0x63, 0x56, 0x92, - 0x12, 0x68, 0x39, 0xbe, 0xee, 0xe1, 0xe3, 0xeb, 0x5d, 0x94, 0x67, 0xb5, - 0x3e, 0xf7, 0xe7, 0xe8, 0x52, 0xb3, 0x16, 0x03, 0x7c, 0x22, 0xf1, 0x0c, - 0x33, 0x4c, 0x9b, 0x78, 0x9d, 0x78, 0x72, 0xd3, 0x36, 0x38, 0xef, 0x13, - 0x87, 0x59, 0x41, 0x56, 0x89, 0xcf, 0x89, 0x47, 0x4c, 0xba, 0x20, 0xf1, - 0x23, 0xd7, 0x15, 0x8f, 0xdf, 0x38, 0xe7, 0x5d, 0x16, 0x78, 0x66, 0xd8, - 0x4c, 0x25, 0xe7, 0x88, 0xc3, 0xc4, 0x62, 0xbe, 0x89, 0x95, 0x26, 0x66, - 0x05, 0x53, 0x23, 0x9e, 0x20, 0x8e, 0xa8, 0x9a, 0x4e, 0xf9, 0x42, 0xda, - 0x63, 0x95, 0xf3, 0x16, 0x67, 0xad, 0x58, 0x66, 0xf5, 0x7b, 0xf2, 0x17, - 0x86, 0xb2, 0xfa, 0xf2, 0x12, 0xd7, 0x69, 0x0e, 0x20, 0x8e, 0x05, 0x2c, - 0x42, 0x82, 0x08, 0x05, 0x65, 0x6c, 0xa0, 0x08, 0x1b, 0x51, 0x5a, 0x75, - 0x52, 0x2c, 0x24, 0x69, 0x3f, 0xd6, 0xc2, 0xdf, 0xef, 0xfa, 0x25, 0x72, - 0x29, 0xe4, 0xda, 0x00, 0x23, 0xc7, 0x3c, 0x4a, 0xd0, 0x20, 0xbb, 0x7e, - 0xf0, 0x3f, 0xf8, 0xdd, 0xad, 0x95, 0x1b, 0x1f, 0xf3, 0x92, 0x42, 0x31, - 0xa0, 0xfd, 0xc5, 0x71, 0x3e, 0x86, 0x80, 0xc0, 0x2e, 0x50, 0xab, 0x38, - 0xce, 0xf7, 0xb1, 0xe3, 0xd4, 0x4e, 0x00, 0xff, 0x33, 0x70, 0xa5, 0x37, - 0xfc, 0xa5, 0x2a, 0x30, 0xf5, 0x49, 0x7a, 0xa5, 0xa1, 0x45, 0x8e, 0x80, - 0xee, 0x6d, 0xe0, 0xe2, 0xba, 0xa1, 0x29, 0x7b, 0xc0, 0xe5, 0x0e, 0xd0, - 0xf7, 0x64, 0xc8, 0xa6, 0xec, 0x4a, 0x7e, 0x9a, 0x42, 0x2e, 0x07, 0xbc, - 0x9f, 0xd1, 0x37, 0x65, 0x80, 0x9e, 0x5b, 0x20, 0xb8, 0xea, 0xf5, 0x56, - 0xdf, 0xc7, 0xe9, 0x03, 0x90, 0xa2, 0xae, 0x12, 0x37, 0xc0, 0xc1, 0x21, - 0x30, 0x9c, 0xa7, 0xec, 0xb5, 0x16, 0xef, 0xee, 0x68, 0xee, 0xed, 0xdf, - 0x33, 0xf5, 0xfe, 0x7e, 0x00, 0xb6, 0x7a, 0x72, 0xc2, 0xb7, 0x19, 0xd7, - 0x5a, 0x00, 0x00, 0x00, 0x06, 0x62, 0x4b, 0x47, 0x44, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xf9, 0x43, 0xbb, 0x7f, 0x00, 0x00, 0x00, 0x09, 0x70, - 0x48, 0x59, 0x73, 0x00, 0x00, 0x2e, 0x23, 0x00, 0x00, 0x2e, 0x23, 0x01, - 0x78, 0xa5, 0x3f, 0x76, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4d, 0x45, - 0x07, 0xe5, 0x0a, 0x0b, 0x17, 0x1e, 0x25, 0x91, 0xc0, 0xe1, 0x5c, 0x00, - 0x00, 0x00, 0x19, 0x74, 0x45, 0x58, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x74, 0x00, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x77, - 0x69, 0x74, 0x68, 0x20, 0x47, 0x49, 0x4d, 0x50, 0x57, 0x81, 0x0e, 0x17, - 0x00, 0x00, 0x00, 0x8f, 0x49, 0x44, 0x41, 0x54, 0x38, 0xcb, 0xa5, 0x92, - 0x49, 0x0e, 0xc0, 0x20, 0x0c, 0x03, 0x1d, 0x8b, 0xff, 0x7f, 0xd9, 0x3d, - 0x54, 0xdd, 0x21, 0x5b, 0x91, 0x10, 0x82, 0x90, 0x89, 0x21, 0x36, 0x00, - 0x02, 0x84, 0xee, 0xe0, 0xbe, 0xd8, 0x5f, 0x40, 0x1f, 0x42, 0x00, 0x90, - 0xd4, 0x86, 0x9c, 0x0a, 0xba, 0x10, 0xde, 0x37, 0x1d, 0x08, 0xdf, 0x07, - 0x55, 0x08, 0x67, 0x87, 0x15, 0x08, 0x57, 0x81, 0x2c, 0x84, 0x5e, 0x30, - 0x03, 0x61, 0x24, 0x31, 0x82, 0x30, 0xf3, 0x51, 0x1e, 0x84, 0xd9, 0x76, - 0xad, 0x20, 0xac, 0x98, 0x66, 0x06, 0x61, 0xd5, 0xba, 0x6f, 0xc8, 0xf0, - 0x2e, 0x9b, 0x45, 0x3e, 0xb0, 0xb9, 0x82, 0x23, 0xf1, 0xaa, 0xa6, 0xe5, - 0x64, 0xbd, 0xaa, 0xd3, 0x85, 0x3d, 0x59, 0x93, 0x37, 0x27, 0x8c, 0xf4, - 0x4c, 0x56, 0x5a, 0x09, 0x57, 0x95, 0xb3, 0x2a, 0x78, 0x7d, 0x52, 0xa7, - 0x0b, 0x80, 0x01, 0x92, 0x1b, 0x7e, 0x6a, 0xf9, 0xdc, 0x18, 0x81, 0x6d, - 0x42, 0x05, 0x1b, 0x88, 0xd3, 0x3f, 0x1e, 0x42, 0x28, 0x07, 0xad, 0x00, - 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 -}; -unsigned int mouse_png_len = 4907; - -#else // EMBED_HERE - -extern unsigned char mouse_png[]; -extern unsigned int mouse_png_len; - -#endif // EMBED_HERE - - -#pragma GCC diagnostic pop - - -#endif // MOUSE_PNG_H diff --git a/client/src/embedded/vga8x14.h b/client/src/embedded/vga8x14.h deleted file mode 100644 index 7a18a3f..0000000 --- a/client/src/embedded/vga8x14.h +++ /dev/null @@ -1,347 +0,0 @@ -/* - * Kangaroo Punch MultiPlayer Game Server Mark II - * Copyright (C) 2020-2021 Scott Duensing - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program 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. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - - -#ifndef VGA8X14_DAT_H -#define VGA8X14_DAT_H - - -// ===== THIS FILE IS AUTOMATICALLY GENERATED - DO NOT EDIT ===== - - -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wunused-variable" - -#ifdef EMBED_HERE - -unsigned char vga8x14_dat[] = { - 0x08, 0x0e, 0x10, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x7e, 0x7e, 0x00, 0x00, 0x18, 0x18, 0x00, 0xff, 0x00, 0xff, 0x1e, - 0x3c, 0x3f, 0x7f, 0x18, 0x00, 0x81, 0xff, 0x6c, 0x10, 0x3c, 0x3c, 0x00, - 0xff, 0x00, 0xff, 0x0e, 0x66, 0x33, 0x63, 0x18, 0x00, 0xa5, 0xdb, 0xfe, - 0x38, 0x3c, 0x7e, 0x00, 0xff, 0x3c, 0xc3, 0x1a, 0x66, 0x3f, 0x7f, 0xdb, - 0x00, 0x81, 0xff, 0xfe, 0x7c, 0xe7, 0xff, 0x18, 0xe7, 0x66, 0x99, 0x32, - 0x66, 0x30, 0x63, 0x3c, 0x00, 0x81, 0xff, 0xfe, 0xfe, 0xe7, 0xff, 0x3c, - 0xc3, 0x42, 0xbd, 0x78, 0x3c, 0x30, 0x63, 0xe7, 0x00, 0xbd, 0xc3, 0xfe, - 0x7c, 0xe7, 0x7e, 0x3c, 0xc3, 0x42, 0xbd, 0xcc, 0x18, 0x30, 0x63, 0x3c, - 0x00, 0x99, 0xe7, 0x7c, 0x38, 0x18, 0x18, 0x18, 0xe7, 0x66, 0x99, 0xcc, - 0x7e, 0x70, 0x67, 0xdb, 0x00, 0x81, 0xff, 0x38, 0x10, 0x18, 0x18, 0x00, - 0xff, 0x3c, 0xc3, 0xcc, 0x18, 0xf0, 0xe7, 0x18, 0x00, 0x7e, 0x7e, 0x10, - 0x00, 0x3c, 0x3c, 0x00, 0xff, 0x00, 0xff, 0x78, 0x18, 0xe0, 0xe6, 0x18, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, - 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x02, 0x18, 0x66, - 0x7f, 0xc6, 0x00, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xc0, 0x06, 0x3c, 0x66, 0xdb, 0x60, 0x00, 0x3c, 0x3c, 0x18, 0x00, 0x00, - 0x00, 0x00, 0x10, 0xfe, 0xe0, 0x0e, 0x7e, 0x66, 0xdb, 0x38, 0x00, 0x7e, - 0x7e, 0x18, 0x18, 0x30, 0x00, 0x28, 0x38, 0xfe, 0xf8, 0x3e, 0x18, 0x66, - 0xdb, 0x6c, 0x00, 0x18, 0x18, 0x18, 0x0c, 0x60, 0xc0, 0x6c, 0x38, 0x7c, - 0xfe, 0xfe, 0x18, 0x66, 0x7b, 0xc6, 0x00, 0x18, 0x18, 0x18, 0xfe, 0xfe, - 0xc0, 0xfe, 0x7c, 0x7c, 0xf8, 0x3e, 0x18, 0x66, 0x1b, 0xc6, 0x00, 0x18, - 0x18, 0x18, 0x0c, 0x60, 0xc0, 0x6c, 0x7c, 0x38, 0xe0, 0x0e, 0x7e, 0x00, - 0x1b, 0x6c, 0xfe, 0x7e, 0x18, 0x7e, 0x18, 0x30, 0xfe, 0x28, 0xfe, 0x38, - 0xc0, 0x06, 0x3c, 0x66, 0x1b, 0x38, 0xfe, 0x3c, 0x18, 0x3c, 0x00, 0x00, - 0x00, 0x00, 0xfe, 0x10, 0x80, 0x02, 0x18, 0x66, 0x1b, 0x0c, 0xfe, 0x18, - 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xc6, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x66, 0x00, 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x66, 0x6c, 0x7c, 0x00, 0x38, 0x30, - 0x0c, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3c, 0x66, 0x6c, - 0xc6, 0x00, 0x6c, 0x30, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, - 0x00, 0x3c, 0x24, 0xfe, 0xc2, 0xc2, 0x6c, 0x60, 0x30, 0x0c, 0x66, 0x18, - 0x00, 0x00, 0x00, 0x0c, 0x00, 0x3c, 0x00, 0x6c, 0xc0, 0xc6, 0x38, 0x00, - 0x30, 0x0c, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x6c, - 0x7c, 0x0c, 0x76, 0x00, 0x30, 0x0c, 0xff, 0x7e, 0x00, 0xfe, 0x00, 0x30, - 0x00, 0x18, 0x00, 0x6c, 0x06, 0x18, 0xdc, 0x00, 0x30, 0x0c, 0x3c, 0x18, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0xfe, 0x86, 0x30, 0xcc, 0x00, - 0x30, 0x0c, 0x66, 0x18, 0x18, 0x00, 0x00, 0xc0, 0x00, 0x18, 0x00, 0x6c, - 0xc6, 0x66, 0xcc, 0x00, 0x18, 0x18, 0x00, 0x00, 0x18, 0x00, 0x18, 0x80, - 0x00, 0x18, 0x00, 0x6c, 0x7c, 0xc6, 0x76, 0x00, 0x0c, 0x30, 0x00, 0x00, - 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x7c, 0x18, 0x7c, 0x7c, 0x0c, 0xfe, 0x38, 0xfe, 0x7c, 0x7c, 0x00, 0x00, - 0x06, 0x00, 0x60, 0x7c, 0xc6, 0x38, 0xc6, 0xc6, 0x1c, 0xc0, 0x60, 0xc6, - 0xc6, 0xc6, 0x18, 0x18, 0x0c, 0x00, 0x30, 0xc6, 0xce, 0x78, 0x06, 0x06, - 0x3c, 0xc0, 0xc0, 0x06, 0xc6, 0xc6, 0x18, 0x18, 0x18, 0x00, 0x18, 0xc6, - 0xde, 0x18, 0x0c, 0x06, 0x6c, 0xc0, 0xc0, 0x0c, 0xc6, 0xc6, 0x00, 0x00, - 0x30, 0x7e, 0x0c, 0x0c, 0xf6, 0x18, 0x18, 0x3c, 0xcc, 0xfc, 0xfc, 0x18, - 0x7c, 0x7e, 0x00, 0x00, 0x60, 0x00, 0x06, 0x18, 0xe6, 0x18, 0x30, 0x06, - 0xfe, 0x06, 0xc6, 0x30, 0xc6, 0x06, 0x00, 0x00, 0x30, 0x00, 0x0c, 0x18, - 0xc6, 0x18, 0x60, 0x06, 0x0c, 0x06, 0xc6, 0x30, 0xc6, 0x06, 0x18, 0x18, - 0x18, 0x7e, 0x18, 0x00, 0xc6, 0x18, 0xc6, 0xc6, 0x0c, 0xc6, 0xc6, 0x30, - 0xc6, 0x0c, 0x18, 0x18, 0x0c, 0x00, 0x30, 0x18, 0x7c, 0x7e, 0xfe, 0x7c, - 0x1e, 0x7c, 0x7c, 0x30, 0x7c, 0x78, 0x00, 0x30, 0x06, 0x00, 0x60, 0x18, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x10, 0xfc, 0x3c, - 0xf8, 0xfe, 0xfe, 0x3c, 0xc6, 0x3c, 0x1e, 0xe6, 0xf0, 0xc6, 0xc6, 0x38, - 0xc6, 0x38, 0x66, 0x66, 0x6c, 0x66, 0x66, 0x66, 0xc6, 0x18, 0x0c, 0x66, - 0x60, 0xee, 0xe6, 0x6c, 0xc6, 0x6c, 0x66, 0xc2, 0x66, 0x62, 0x62, 0xc2, - 0xc6, 0x18, 0x0c, 0x6c, 0x60, 0xfe, 0xf6, 0xc6, 0xde, 0xc6, 0x66, 0xc0, - 0x66, 0x68, 0x68, 0xc0, 0xc6, 0x18, 0x0c, 0x6c, 0x60, 0xfe, 0xfe, 0xc6, - 0xde, 0xc6, 0x7c, 0xc0, 0x66, 0x78, 0x78, 0xc0, 0xfe, 0x18, 0x0c, 0x78, - 0x60, 0xd6, 0xde, 0xc6, 0xde, 0xfe, 0x66, 0xc0, 0x66, 0x68, 0x68, 0xde, - 0xc6, 0x18, 0x0c, 0x6c, 0x60, 0xc6, 0xce, 0xc6, 0xdc, 0xc6, 0x66, 0xc2, - 0x66, 0x62, 0x60, 0xc6, 0xc6, 0x18, 0xcc, 0x6c, 0x62, 0xc6, 0xc6, 0xc6, - 0xc0, 0xc6, 0x66, 0x66, 0x6c, 0x66, 0x60, 0x66, 0xc6, 0x18, 0xcc, 0x66, - 0x66, 0xc6, 0xc6, 0x6c, 0x7c, 0xc6, 0xfc, 0x3c, 0xf8, 0xfe, 0xf0, 0x3a, - 0xc6, 0x3c, 0x78, 0xe6, 0xfe, 0xc6, 0xc6, 0x38, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x38, 0x00, 0xfc, 0x7c, 0xfc, 0x7c, 0x7e, 0xc6, 0xc6, 0xc6, - 0xc6, 0x66, 0xfe, 0x3c, 0x80, 0x3c, 0x6c, 0x00, 0x66, 0xc6, 0x66, 0xc6, - 0x7e, 0xc6, 0xc6, 0xc6, 0xc6, 0x66, 0xc6, 0x30, 0xc0, 0x0c, 0xc6, 0x00, - 0x66, 0xc6, 0x66, 0xc6, 0x5a, 0xc6, 0xc6, 0xc6, 0x6c, 0x66, 0x8c, 0x30, - 0xe0, 0x0c, 0x00, 0x00, 0x66, 0xc6, 0x66, 0x60, 0x18, 0xc6, 0xc6, 0xc6, - 0x38, 0x66, 0x18, 0x30, 0x70, 0x0c, 0x00, 0x00, 0x7c, 0xc6, 0x7c, 0x38, - 0x18, 0xc6, 0xc6, 0xd6, 0x38, 0x3c, 0x30, 0x30, 0x38, 0x0c, 0x00, 0x00, - 0x60, 0xd6, 0x6c, 0x0c, 0x18, 0xc6, 0xc6, 0xd6, 0x38, 0x18, 0x60, 0x30, - 0x1c, 0x0c, 0x00, 0x00, 0x60, 0xde, 0x66, 0xc6, 0x18, 0xc6, 0x6c, 0xfe, - 0x6c, 0x18, 0xc2, 0x30, 0x0e, 0x0c, 0x00, 0x00, 0x60, 0x7c, 0x66, 0xc6, - 0x18, 0xc6, 0x38, 0x7c, 0xc6, 0x18, 0xc6, 0x30, 0x06, 0x0c, 0x00, 0x00, - 0xf0, 0x0c, 0xe6, 0x7c, 0x3c, 0x7c, 0x10, 0x6c, 0xc6, 0x3c, 0xfe, 0x3c, - 0x02, 0x3c, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x18, 0x00, 0xe0, 0x00, 0x1c, 0x00, 0x38, 0x00, 0xe0, 0x18, 0x06, 0xe0, - 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x0c, 0x00, 0x6c, 0x00, - 0x60, 0x18, 0x06, 0x60, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0x0c, 0x00, 0x64, 0x00, 0x60, 0x00, 0x00, 0x60, 0x18, 0x00, 0x00, 0x00, - 0x00, 0x78, 0x78, 0x7c, 0x3c, 0x7c, 0x60, 0x76, 0x6c, 0x38, 0x0e, 0x66, - 0x18, 0xec, 0xdc, 0x7c, 0x00, 0x0c, 0x6c, 0xc6, 0x6c, 0xc6, 0xf0, 0xcc, - 0x76, 0x18, 0x06, 0x6c, 0x18, 0xfe, 0x66, 0xc6, 0x00, 0x7c, 0x66, 0xc0, - 0xcc, 0xfe, 0x60, 0xcc, 0x66, 0x18, 0x06, 0x78, 0x18, 0xd6, 0x66, 0xc6, - 0x00, 0xcc, 0x66, 0xc0, 0xcc, 0xc0, 0x60, 0xcc, 0x66, 0x18, 0x06, 0x6c, - 0x18, 0xd6, 0x66, 0xc6, 0x00, 0xcc, 0x66, 0xc6, 0xcc, 0xc6, 0x60, 0x7c, - 0x66, 0x18, 0x06, 0x66, 0x18, 0xd6, 0x66, 0xc6, 0x00, 0x76, 0x7c, 0x7c, - 0x76, 0x7c, 0xf0, 0x0c, 0xe6, 0x3c, 0x66, 0xe6, 0x3c, 0xc6, 0x66, 0x7c, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x66, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, - 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x18, 0x70, 0x76, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, - 0x18, 0x18, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x00, 0x10, 0xdc, 0x76, 0xdc, 0x7c, - 0xfc, 0xcc, 0x66, 0xc6, 0xc6, 0xc6, 0xfe, 0x18, 0x18, 0x18, 0x00, 0x38, - 0x66, 0xcc, 0x76, 0xc6, 0x30, 0xcc, 0x66, 0xc6, 0x6c, 0xc6, 0xcc, 0x70, - 0x00, 0x0e, 0x00, 0x6c, 0x66, 0xcc, 0x66, 0x70, 0x30, 0xcc, 0x66, 0xd6, - 0x38, 0xc6, 0x18, 0x18, 0x18, 0x18, 0x00, 0xc6, 0x66, 0xcc, 0x60, 0x1c, - 0x30, 0xcc, 0x66, 0xd6, 0x38, 0xc6, 0x30, 0x18, 0x18, 0x18, 0x00, 0xc6, - 0x7c, 0x7c, 0x60, 0xc6, 0x36, 0xcc, 0x3c, 0xfe, 0x6c, 0x7e, 0x66, 0x18, - 0x18, 0x18, 0x00, 0xfe, 0x60, 0x0c, 0xf0, 0x7c, 0x1c, 0x76, 0x18, 0x6c, - 0xc6, 0x06, 0xfe, 0x0e, 0x18, 0x70, 0x00, 0x00, 0x60, 0x0c, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xf0, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, - 0x00, 0x00, 0x0c, 0x10, 0x00, 0x60, 0x38, 0x00, 0x10, 0x00, 0x60, 0x00, - 0x18, 0x60, 0xc6, 0x6c, 0x3c, 0xcc, 0x18, 0x38, 0xcc, 0x30, 0x6c, 0x00, - 0x38, 0xcc, 0x30, 0x66, 0x3c, 0x30, 0xc6, 0x38, 0x66, 0xcc, 0x30, 0x6c, - 0xcc, 0x18, 0x38, 0x00, 0x6c, 0xcc, 0x18, 0x66, 0x66, 0x18, 0x10, 0x00, - 0xc2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x38, 0x38, 0xc0, 0xcc, 0x7c, 0x78, 0x78, 0x78, 0x78, 0x66, - 0x7c, 0x7c, 0x7c, 0x38, 0x38, 0x38, 0x6c, 0x6c, 0xc0, 0xcc, 0xc6, 0x0c, - 0x0c, 0x0c, 0x0c, 0x60, 0xc6, 0xc6, 0xc6, 0x18, 0x18, 0x18, 0xc6, 0xc6, - 0xc2, 0xcc, 0xfe, 0x7c, 0x7c, 0x7c, 0x7c, 0x66, 0xfe, 0xfe, 0xfe, 0x18, - 0x18, 0x18, 0xc6, 0xc6, 0x66, 0xcc, 0xc0, 0xcc, 0xcc, 0xcc, 0xcc, 0x3c, - 0xc0, 0xc0, 0xc0, 0x18, 0x18, 0x18, 0xfe, 0xfe, 0x3c, 0xcc, 0xc6, 0xcc, - 0xcc, 0xcc, 0xcc, 0x0c, 0xc6, 0xc6, 0xc6, 0x18, 0x18, 0x18, 0xc6, 0xc6, - 0x0c, 0x76, 0x7c, 0x76, 0x76, 0x76, 0x76, 0x06, 0x7c, 0x7c, 0x7c, 0x3c, - 0x3c, 0x3c, 0xc6, 0xc6, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x10, - 0x00, 0x60, 0x30, 0x60, 0x00, 0xc6, 0xc6, 0x18, 0x38, 0x00, 0xf8, 0x0e, - 0x60, 0x00, 0x3e, 0x38, 0xc6, 0x30, 0x78, 0x30, 0xc6, 0xc6, 0xc6, 0x18, - 0x6c, 0x66, 0xcc, 0x1b, 0x00, 0x00, 0x6c, 0x6c, 0xc6, 0x18, 0xcc, 0x18, - 0xc6, 0x38, 0x00, 0x3c, 0x64, 0x66, 0xcc, 0x18, 0xfe, 0xcc, 0xcc, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0xc6, 0x66, 0x60, 0x3c, 0xf8, 0x18, - 0x66, 0x76, 0xcc, 0x7c, 0x7c, 0x7c, 0xcc, 0xcc, 0xc6, 0xc6, 0xc6, 0x60, - 0xf0, 0x18, 0xc4, 0x18, 0x60, 0x36, 0xfe, 0xc6, 0xc6, 0xc6, 0xcc, 0xcc, - 0xc6, 0xc6, 0xc6, 0x60, 0x60, 0x7e, 0xcc, 0x7e, 0x7c, 0x7e, 0xcc, 0xc6, - 0xc6, 0xc6, 0xcc, 0xcc, 0xc6, 0xc6, 0xc6, 0x66, 0x60, 0x18, 0xde, 0x18, - 0x60, 0xd8, 0xcc, 0xc6, 0xc6, 0xc6, 0xcc, 0xcc, 0xc6, 0xc6, 0xc6, 0x3c, - 0x60, 0x7e, 0xcc, 0x18, 0x66, 0xd8, 0xcc, 0xc6, 0xc6, 0xc6, 0xcc, 0xcc, - 0x7e, 0x6c, 0xc6, 0x18, 0xe6, 0x18, 0xcc, 0x18, 0xfe, 0x6e, 0xce, 0x7c, - 0x7c, 0x7c, 0x76, 0x76, 0x06, 0x38, 0x7c, 0x18, 0xfc, 0x18, 0xc6, 0x18, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x18, 0x0c, 0x18, 0x18, 0x00, 0xdc, 0x3c, 0x38, - 0x00, 0x00, 0x00, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x30, 0x18, 0x30, 0x30, - 0x76, 0x00, 0x6c, 0x6c, 0x30, 0x00, 0x00, 0xc0, 0xc0, 0x18, 0x00, 0x00, - 0x60, 0x30, 0x60, 0x60, 0xdc, 0xc6, 0x6c, 0x6c, 0x30, 0x00, 0x00, 0xc6, - 0xc6, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe6, 0x3e, 0x38, - 0x00, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x36, 0xd8, 0x78, 0x38, 0x7c, 0xcc, - 0xdc, 0xf6, 0x00, 0x00, 0x30, 0x00, 0x00, 0xd8, 0xd8, 0x18, 0x6c, 0x6c, - 0x0c, 0x18, 0xc6, 0xcc, 0x66, 0xfe, 0x7e, 0x7c, 0x30, 0xfe, 0xfe, 0x30, - 0x30, 0x18, 0xd8, 0x36, 0x7c, 0x18, 0xc6, 0xcc, 0x66, 0xde, 0x00, 0x00, - 0x60, 0xc0, 0x06, 0x60, 0x66, 0x3c, 0x6c, 0x6c, 0xcc, 0x18, 0xc6, 0xcc, - 0x66, 0xce, 0x00, 0x00, 0xc6, 0xc0, 0x06, 0xdc, 0xce, 0x3c, 0x36, 0xd8, - 0xcc, 0x18, 0xc6, 0xcc, 0x66, 0xc6, 0x00, 0x00, 0xc6, 0xc0, 0x06, 0x86, - 0x9e, 0x3c, 0x00, 0x00, 0x76, 0x3c, 0x7c, 0x76, 0x66, 0xc6, 0x00, 0x00, - 0x7c, 0x00, 0x00, 0x0c, 0x3e, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x06, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, - 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x55, 0xdd, 0x18, - 0x18, 0x18, 0x36, 0x00, 0x00, 0x36, 0x36, 0x00, 0x36, 0x36, 0x18, 0x00, - 0x44, 0xaa, 0x77, 0x18, 0x18, 0x18, 0x36, 0x00, 0x00, 0x36, 0x36, 0x00, - 0x36, 0x36, 0x18, 0x00, 0x11, 0x55, 0xdd, 0x18, 0x18, 0x18, 0x36, 0x00, - 0x00, 0x36, 0x36, 0x00, 0x36, 0x36, 0x18, 0x00, 0x44, 0xaa, 0x77, 0x18, - 0x18, 0x18, 0x36, 0x00, 0x00, 0x36, 0x36, 0x00, 0x36, 0x36, 0x18, 0x00, - 0x11, 0x55, 0xdd, 0x18, 0x18, 0x18, 0x36, 0x00, 0x00, 0x36, 0x36, 0x00, - 0x36, 0x36, 0x18, 0x00, 0x44, 0xaa, 0x77, 0x18, 0x18, 0xf8, 0x36, 0x00, - 0xf8, 0xf6, 0x36, 0xfe, 0xf6, 0x36, 0xf8, 0x00, 0x11, 0x55, 0xdd, 0x18, - 0x18, 0x18, 0x36, 0x00, 0x18, 0x06, 0x36, 0x06, 0x06, 0x36, 0x18, 0x00, - 0x44, 0xaa, 0x77, 0x18, 0xf8, 0xf8, 0xf6, 0xfe, 0xf8, 0xf6, 0x36, 0xf6, - 0xfe, 0xfe, 0xf8, 0xf8, 0x11, 0x55, 0xdd, 0x18, 0x18, 0x18, 0x36, 0x36, - 0x18, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x18, 0x44, 0xaa, 0x77, 0x18, - 0x18, 0x18, 0x36, 0x36, 0x18, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x18, - 0x11, 0x55, 0xdd, 0x18, 0x18, 0x18, 0x36, 0x36, 0x18, 0x36, 0x36, 0x36, - 0x00, 0x00, 0x00, 0x18, 0x44, 0xaa, 0x77, 0x18, 0x18, 0x18, 0x36, 0x36, - 0x18, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x18, 0x11, 0x55, 0xdd, 0x18, - 0x18, 0x18, 0x36, 0x36, 0x18, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x18, - 0x44, 0xaa, 0x77, 0x18, 0x18, 0x18, 0x36, 0x36, 0x18, 0x36, 0x36, 0x36, - 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x00, 0x18, 0x00, 0x18, 0x18, 0x36, - 0x36, 0x00, 0x36, 0x00, 0x36, 0x00, 0x36, 0x18, 0x18, 0x18, 0x00, 0x18, - 0x00, 0x18, 0x18, 0x36, 0x36, 0x00, 0x36, 0x00, 0x36, 0x00, 0x36, 0x18, - 0x18, 0x18, 0x00, 0x18, 0x00, 0x18, 0x18, 0x36, 0x36, 0x00, 0x36, 0x00, - 0x36, 0x00, 0x36, 0x18, 0x18, 0x18, 0x00, 0x18, 0x00, 0x18, 0x18, 0x36, - 0x36, 0x00, 0x36, 0x00, 0x36, 0x00, 0x36, 0x18, 0x18, 0x18, 0x00, 0x18, - 0x00, 0x18, 0x18, 0x36, 0x36, 0x00, 0x36, 0x00, 0x36, 0x00, 0x36, 0x18, - 0x18, 0x18, 0x00, 0x18, 0x00, 0x18, 0x1f, 0x36, 0x37, 0x3f, 0xf7, 0xff, - 0x37, 0xff, 0xf7, 0xff, 0x18, 0x18, 0x00, 0x18, 0x00, 0x18, 0x18, 0x36, - 0x30, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0x1f, - 0xff, 0xff, 0x1f, 0x37, 0x3f, 0x37, 0xff, 0xf7, 0x37, 0xff, 0xf7, 0xff, - 0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x36, 0x00, 0x36, 0x00, 0x36, - 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x36, - 0x00, 0x36, 0x00, 0x36, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x18, 0x18, - 0x00, 0x18, 0x18, 0x36, 0x00, 0x36, 0x00, 0x36, 0x36, 0x00, 0x36, 0x00, - 0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x36, 0x00, 0x36, 0x00, 0x36, - 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x36, - 0x00, 0x36, 0x00, 0x36, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x18, 0x18, - 0x00, 0x18, 0x18, 0x36, 0x00, 0x36, 0x00, 0x36, 0x36, 0x00, 0x36, 0x00, - 0x36, 0x00, 0x00, 0x36, 0x18, 0x00, 0x00, 0x36, 0x18, 0x18, 0x00, 0xff, - 0x00, 0xf0, 0x0f, 0xff, 0x36, 0x00, 0x00, 0x36, 0x18, 0x00, 0x00, 0x36, - 0x18, 0x18, 0x00, 0xff, 0x00, 0xf0, 0x0f, 0xff, 0x36, 0x00, 0x00, 0x36, - 0x18, 0x00, 0x00, 0x36, 0x18, 0x18, 0x00, 0xff, 0x00, 0xf0, 0x0f, 0xff, - 0x36, 0x00, 0x00, 0x36, 0x18, 0x00, 0x00, 0x36, 0x18, 0x18, 0x00, 0xff, - 0x00, 0xf0, 0x0f, 0xff, 0x36, 0x00, 0x00, 0x36, 0x18, 0x00, 0x00, 0x36, - 0x18, 0x18, 0x00, 0xff, 0x00, 0xf0, 0x0f, 0xff, 0x36, 0xff, 0x00, 0x36, - 0x1f, 0x1f, 0x00, 0x36, 0xff, 0x18, 0x00, 0xff, 0x00, 0xf0, 0x0f, 0xff, - 0x36, 0x00, 0x00, 0x36, 0x18, 0x18, 0x00, 0x36, 0x18, 0x18, 0x00, 0xff, - 0x00, 0xf0, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x1f, 0x1f, 0x3f, 0xff, - 0xff, 0xf8, 0x1f, 0xff, 0xff, 0xf0, 0x0f, 0x00, 0x00, 0x18, 0x36, 0x00, - 0x00, 0x18, 0x36, 0x36, 0x18, 0x00, 0x18, 0xff, 0xff, 0xf0, 0x0f, 0x00, - 0x00, 0x18, 0x36, 0x00, 0x00, 0x18, 0x36, 0x36, 0x18, 0x00, 0x18, 0xff, - 0xff, 0xf0, 0x0f, 0x00, 0x00, 0x18, 0x36, 0x00, 0x00, 0x18, 0x36, 0x36, - 0x18, 0x00, 0x18, 0xff, 0xff, 0xf0, 0x0f, 0x00, 0x00, 0x18, 0x36, 0x00, - 0x00, 0x18, 0x36, 0x36, 0x18, 0x00, 0x18, 0xff, 0xff, 0xf0, 0x0f, 0x00, - 0x00, 0x18, 0x36, 0x00, 0x00, 0x18, 0x36, 0x36, 0x18, 0x00, 0x18, 0xff, - 0xff, 0xf0, 0x0f, 0x00, 0x00, 0x18, 0x36, 0x00, 0x00, 0x18, 0x36, 0x36, - 0x18, 0x00, 0x18, 0xff, 0xff, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0xfe, 0x00, 0x00, 0x00, - 0x7e, 0x38, 0x38, 0x1e, 0x00, 0x03, 0x1c, 0x00, 0x00, 0x00, 0xc6, 0x00, - 0xc6, 0x00, 0x00, 0x00, 0x18, 0x6c, 0x6c, 0x30, 0x00, 0x06, 0x30, 0x7c, - 0x00, 0x7c, 0xc6, 0xfe, 0x60, 0x00, 0x66, 0x76, 0x3c, 0xc6, 0xc6, 0x18, - 0x00, 0x7e, 0x60, 0xc6, 0x76, 0xc6, 0xc0, 0x6c, 0x30, 0x7e, 0x66, 0xdc, - 0x66, 0xc6, 0xc6, 0x0c, 0x7e, 0xdb, 0x60, 0xc6, 0xdc, 0xfc, 0xc0, 0x6c, - 0x18, 0xd8, 0x66, 0x18, 0x66, 0xfe, 0xc6, 0x3e, 0xdb, 0xdb, 0x7c, 0xc6, - 0xd8, 0xc6, 0xc0, 0x6c, 0x30, 0xd8, 0x66, 0x18, 0x66, 0xc6, 0x6c, 0x66, - 0xdb, 0xf3, 0x60, 0xc6, 0xd8, 0xc6, 0xc0, 0x6c, 0x60, 0xd8, 0x7c, 0x18, - 0x3c, 0xc6, 0x6c, 0x66, 0x7e, 0x7e, 0x60, 0xc6, 0xdc, 0xfc, 0xc0, 0x6c, - 0xc6, 0xd8, 0x60, 0x18, 0x18, 0x6c, 0x6c, 0x66, 0x00, 0x60, 0x30, 0xc6, - 0x76, 0xc0, 0xc0, 0x6c, 0xfe, 0x70, 0x60, 0x18, 0x7e, 0x38, 0xee, 0x3c, - 0x00, 0xc0, 0x1c, 0xc6, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x18, 0x00, 0x00, 0x38, 0x00, 0x00, 0x0f, 0xd8, 0x70, 0x00, 0x00, - 0x00, 0x00, 0x30, 0x0c, 0x0e, 0x18, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x0c, - 0x6c, 0xd8, 0x00, 0x00, 0xfe, 0x18, 0x18, 0x18, 0x1b, 0x18, 0x18, 0x00, - 0x6c, 0x00, 0x00, 0x0c, 0x6c, 0x30, 0x00, 0x00, 0x00, 0x18, 0x0c, 0x30, - 0x1b, 0x18, 0x18, 0x76, 0x38, 0x00, 0x00, 0x0c, 0x6c, 0x60, 0x7c, 0x00, - 0x00, 0x7e, 0x06, 0x60, 0x18, 0x18, 0x00, 0xdc, 0x00, 0x00, 0x00, 0x0c, - 0x6c, 0xc8, 0x7c, 0x00, 0xfe, 0x18, 0x0c, 0x30, 0x18, 0x18, 0x7e, 0x00, - 0x00, 0x18, 0x00, 0x0c, 0x6c, 0xf8, 0x7c, 0x00, 0x00, 0x18, 0x18, 0x18, - 0x18, 0x18, 0x00, 0x76, 0x00, 0x18, 0x18, 0xec, 0x00, 0x00, 0x7c, 0x00, - 0x00, 0x00, 0x30, 0x0c, 0x18, 0xd8, 0x18, 0xdc, 0x00, 0x00, 0x00, 0x6c, - 0x00, 0x00, 0x7c, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x18, 0xd8, 0x18, 0x00, - 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x7c, 0x00, 0x00, 0xff, 0x7e, 0x7e, - 0x18, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; -unsigned int vga8x14_dat_len = 3588; - -#else // EMBED_HERE - -extern unsigned char vga8x14_dat[]; -extern unsigned int vga8x14_dat_len; - -#endif // EMBED_HERE - - -#pragma GCC diagnostic pop - - -#endif // VGA8X14_DAT_H diff --git a/client/src/gui/gui.c b/client/src/gui/gui.c index 51110e5..9fffc58 100644 --- a/client/src/gui/gui.c +++ b/client/src/gui/gui.c @@ -25,7 +25,6 @@ #include "widget.h" #include "desktop.h" #include "window.h" -#include "embedded/embedded.h" typedef struct PendingEventsS { @@ -662,8 +661,8 @@ DesktopT *guiStartup(void) { _guiColor[COLOR_LISTBOX_ARROWS_ACTIVE] = vbeColorMake(168, 168, 168); _guiColor[COLOR_LISTBOX_ARROWS_INACTIVE] = vbeColorMake( 80, 84, 80); - // Load font. - _guiFont = fontFromRAMLoad(vga8x14_dat); + // Load font. ***TODO*** This should probably be provided by an API call to remove it from in here. + _guiFont = fontLoad(cacheFilenameGet("system:vga8x14")); // Create desktop and return it. Remember it for later. _guiDesktop = desktopNew(); diff --git a/client/src/gui/msgbox.c b/client/src/gui/msgbox.c index db693d9..86f4829 100644 --- a/client/src/gui/msgbox.c +++ b/client/src/gui/msgbox.c @@ -55,12 +55,13 @@ static ButtonT *_btnTwo = NULL; static ButtonT *_btnThree = NULL; +//***TODO*** This depends on the cache system which isn't really part of the GUI. static char *_iconFiles[MSGBOX_ICON_COUNT] = { - "data/mbie32.png", - "data/mbiw32.png", - "data/mbii32.png", - "data/mbim32.png", - "data/mbiq32.png" + "system:exclamation", + "system:warning", + "system:information", + "system:message", + "system:question" }; @@ -173,7 +174,7 @@ void msgBoxThree(char *title, MsgBoxIconT icon, char *message, char *buttonOne, // Load proper icon, if desired. if (icon > MSGBOX_ICON_NONE && icon < MSGBOX_ICON_COUNT) { - _picIcon = pictureNew(x, y, _iconFiles[icon - 1]); + _picIcon = pictureNew(x, y, cacheFilenameGet(_iconFiles[icon - 1])); guiAttach(W(_winDialog), W(_picIcon)); } diff --git a/client/src/system/taglist.c b/client/src/gui/taglist.c similarity index 100% rename from client/src/system/taglist.c rename to client/src/gui/taglist.c diff --git a/client/src/system/taglist.h b/client/src/gui/taglist.h similarity index 100% rename from client/src/system/taglist.h rename to client/src/gui/taglist.h diff --git a/client/src/linux/linux.c b/client/src/linux/linux.c index 57d5519..f6085b7 100644 --- a/client/src/linux/linux.c +++ b/client/src/linux/linux.c @@ -75,7 +75,7 @@ static uint8_t _takeScreenshot = 0; static void comAddToBuffer(char *data, uint16_t len); -static void comBufferShow(void); +//static void comBufferShow(void); static void comModem(uint8_t c); static void processEvent(void); static void processNetworkEvent(void); @@ -98,6 +98,7 @@ static void comAddToBuffer(char *data, uint16_t len) { } +/* static void comBufferShow(void) { uint16_t x = _bufferTail; @@ -109,6 +110,7 @@ static void comBufferShow(void) { } logWrite("}\n"); } +*/ int comClose(int com) { diff --git a/client/src/main.c b/client/src/main.c index 5792504..0ccaa48 100644 --- a/client/src/main.c +++ b/client/src/main.c @@ -48,7 +48,6 @@ #include "comport.h" #include "network.h" #include "timer.h" -#include "embedded/embedded.h" #include "welcome.h" #include "settings.h" @@ -109,6 +108,7 @@ static void eventLoop(void) { static uint8_t hasValidSettings(void) { + // Returning false sends us immediately to the settings dialog. return (__configData.serialCom > 0 && __configData.serialCom < 5); } @@ -121,6 +121,7 @@ static void shutdown(void) { imageUnload(&_pointer); + cacheShutdown(); netShutdown(); guiShutdown(); mouseShutdown(); @@ -186,8 +187,9 @@ static uint8_t startup(int argc, char *argv[]) { mouseStartup(); guiStartup(); netStartup(); + cacheStartup(argv[0]); - _pointer = imageFromRAMLoad(mouse_png, mouse_png_len); + _pointer = imageLoad(cacheFilenameGet("system:mouse")); _alpha = imagePixelGet(_pointer, 5, 0); return 0; diff --git a/client/src/system/cache.c b/client/src/system/cache.c new file mode 100644 index 0000000..687ca64 --- /dev/null +++ b/client/src/system/cache.c @@ -0,0 +1,447 @@ +/* + * Kangaroo Punch MultiPlayer Game Server Mark II + * Copyright (C) 2020-2021 Scott Duensing + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program 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. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + + +// ***TODO*** Maybe add a cacheFOpen() and cacheFClose() for reading and writing directly to virtual pathnames? + + +#include "thirdparty/SHA256/sha256.h" + +#include "cache.h" + + +#define CACHE_FIELD_SHA256 0 +#define CACHE_FIELD_ENTRYNAME 1 +#define CACHE_FIELD_FILENAME 2 + + +static char *cacheEntryNameDirGet(char *entryName, uint8_t includeCache); +static char *cacheEntryNameGenerate(void); +static char *cacheFieldGet(char *virtualPath, uint8_t field); + + +uint8_t cacheDelete(char *virtualPath) { + FILE *in = NULL; + FILE *out = NULL; + char index[16] = { 0 }; + char indexNew[16] = { 0 }; + char buffer[1024] = { 0 }; + char *name = NULL; + char *path = NULL; + char *dir2 = NULL; + char *dir1 = NULL; + char *entryDir = NULL; + + // Deletes entry from cache index AND the data from the cache. + + sprintf(index, "CACHE%cINDEX.DAT", OS_PATH_SLASH); + sprintf(indexNew, "CACHE%cINDEX.NEW", OS_PATH_SLASH); + + // Do we have an index yet? + if (osFileExists(index)) { + in = fopen(index, "rt"); + if (in) { + out = fopen(indexNew, "wt"); + if (out) { + while (fgets(buffer, 1024, in) != 0) { + name = strstr(buffer, " "); + *name = 0; + name++; + path = strstr(name, " "); + *path = 0; + path++; + path[strlen(path) - 1] = 0; + if (strcmp(virtualPath, path) == 0) { + // Found! Delete data from disk. + entryDir = cacheEntryNameDirGet(name, 1); + unlink(entryDir); + // Attempt to remove the second-level directory. + dir2 = osLastPathComponentGetUpTo(entryDir); + if (rmdir(dir2) == 0) { + // Attempt to move the top level directory. + dir1 = osLastPathComponentGetUpTo(dir2); + rmdir(dir1); + DEL(dir1); + } + DEL(dir2); + } else { + // Not what we're after, copy to new index. + fprintf(out, "%s %s %s\n", buffer, name, path); + } + } + } else { + fclose(in); + return FAIL; + } + fclose(in); + unlink(index); + rename(indexNew, index); + return SUCCESS; + } + } + + return FAIL; +} + + +uint8_t cacheEntryAdd(char *sha256, char *entryName, char *virtualPath) { + FILE *in = NULL; + FILE *out = NULL; + char index[16] = { 0 }; + char indexNew[16] = { 0 }; + char *name = NULL; + char *path = NULL; + char buffer[1024] = { 0 }; + uint8_t found = 0; + + // This adds or updates an entry to the index. + // It does not add data to the actual cache. + + // Index format is: SHA256 ENTRYNAME VIRTUALPATH + + sprintf(index, "CACHE%cINDEX.DAT", OS_PATH_SLASH); + sprintf(indexNew, "CACHE%cINDEX.NEW", OS_PATH_SLASH); + + // Do we have an index yet? + if (!osFileExists(index)) { + // Nope. Just add this entry and be done. + out = fopen(index, "wt"); + if (out) { + fprintf(out, "%s %s %s\n", sha256, entryName, virtualPath); + fclose(out); + return SUCCESS; + } + return FAIL; + } + + // Read existing index, update the entry if it exists. + // If not, we'll add it at the end. + in = fopen(index, "rt"); + if (in) { + out = fopen(indexNew, "wt"); + if (out) { + while (fgets(buffer, 1024, in) != 0) { + name = strstr(buffer, " "); + *name = 0; + name++; + path = strstr(name, " "); + *path = 0; + path++; + path[strlen(path) - 1] = 0; + if (strcmp(virtualPath, path) == 0) { + // Update this entry. + fprintf(out, "%s %s %s\n", sha256, entryName, virtualPath); + found = 1; + } else { + // Not what we're after, copy to new index. + fprintf(out, "%s %s %s\n", buffer, name, path); + } + } + // Did we replace an entry? + if (!found) { + // Add new entry to end. + fprintf(out, "%s %s %s\n", sha256, entryName, virtualPath); + } + fclose(out); + } else { + fclose(in); + return FAIL; + } + fclose(in); + unlink(index); + rename(indexNew, index); + return SUCCESS; + } + + return FAIL; +} + + +static char *cacheEntryNameDirGet(char *entryName, uint8_t includeCache) { + uint8_t i = 0; + uint8_t j = 0; + static char dir[21] = "CACHE"; + + dir[5] = OS_PATH_SLASH; + + j = 6; + for (i=0; i<13; i++) { + dir[j++] = entryName[i]; + if ((i == 1) || (i == 3)) { + dir[j++] = OS_PATH_SLASH; + } + } + + dir[20] = 0; + + return includeCache ? dir : &dir[6]; +} + + +static char *cacheEntryNameGenerate(void) { + uint8_t i = 0; + static char name[13] = { 0 }; + + // Cached files are stored in a two-layer directory tree to + // reduce the number of files in any single folder. + // The folder names are two digits. + // The filename is eight random letters. + + // First directory level. + i = random() % 100; + sprintf(&name[0], "%02d", i); + + // Second directory level. + i = random() % 100; + sprintf(&name[2], "%02d", i); + + // Random name. + for (i=4; i<12; i++) name[i] = 'A' + (random() % 26); + + name[12] = 0; + + return name; +} + + +char *cacheEntryNameGet(char *virtualPath) { + return cacheFieldGet(virtualPath, CACHE_FIELD_ENTRYNAME); +} + + +uint8_t cacheExists(void) { + char index[16] = { 0 }; + + sprintf(index, "CACHE%cINDEX.DAT", OS_PATH_SLASH); + + return osFileExists(index); +} + + +static char *cacheFieldGet(char *virtualPath, uint8_t field) { + FILE *in = NULL; + char index[16] = { 0 }; + static char buffer[1024] = { 0 }; + static char *name = NULL; + static char *path = NULL; + static char *result = NULL; + + // Return SHA256 given virtual path or NULL if not found. + + sprintf(index, "CACHE%cINDEX.DAT", OS_PATH_SLASH); + + result = NULL; + + // Do we have an index yet? + if (osFileExists(index)) { + in = fopen(index, "rt"); + if (in) { + while ((fgets(buffer, 1024, in) != 0) && result == NULL) { + name = strstr(buffer, " "); + *name = 0; + name++; + path = strstr(name, " "); + *path = 0; + path++; + path[strlen(path) - 1] = 0; + if (strcmp(virtualPath, path) == 0) { + // Found! Return requested data. + switch (field) { + case CACHE_FIELD_SHA256: + result = buffer; + break; + + case CACHE_FIELD_ENTRYNAME: + result = name; + break; + + case CACHE_FIELD_FILENAME: + result = cacheEntryNameDirGet(name, 1); + break; + } + } + } + fclose(in); + } + } + + return result; +} + + +char *cacheFilenameGet(char *virtualPath) { + return cacheFieldGet(virtualPath, CACHE_FIELD_FILENAME); +} + + +uint8_t cachePrePack(char *name, CachePreMakeListT *list) { + + FILE *in = NULL; + FILE *out = NULL; + uint16_t i = 0; + uint8_t result = SUCCESS; + uint32_t length = 0; + uint32_t total = 0; + uint32_t temp = 0; + int8_t buffer[8192] = { 0 }; + sha256_context ctx = { 0 }; + uint8_t hv[32] = { 0 }; + + // Prebuilt cache format: + // - Virtual Path (zero terminated) + // - x bytes hash + // - 4 bytes unsigned length of data + // - length bytes of data + // ... repeat for each file ... + // - 4 bytes length of entire cache (used for embedding cache data) + + out = fopen(name, "wb"); + if (out) { + while (list[i].filename != NULL) { + in = fopen(list[i].filename, "rb"); + if (in) { + // Get length of file. + fseek(in, 0, SEEK_END); + length = ftell(in); + fseek(in, 0, SEEK_SET); + // Generate SHA256. + sha256_init(&ctx); + do { + temp = fread(buffer, 1, sizeof(buffer), in); + if (temp) sha256_hash(&ctx, (uint8_t *)buffer, temp); + } while (temp > 0); + sha256_done(&ctx, hv); + fseek(in, 0, SEEK_SET); + // Write header. + temp = strlen(list[i].virtualPath) + 1; + fwrite(list[i].virtualPath, temp, 1, out); + fwrite(hv, sizeof(hv), 1, out); + fwrite(&length, sizeof(uint32_t), 1, out); + total += temp + sizeof(hv) + sizeof(uint32_t) + length; + // Copy data. + do { + temp = fread(buffer, 1, sizeof(buffer), in); + if (temp) fwrite(buffer, 1, temp, out); + } while (temp > 0); + fclose(in); + } else { + result = FAIL; + } + i++; + } + // Write length of entire block. + total += sizeof(uint32_t); + fwrite(&total, sizeof(uint32_t), 1, out); + fclose(out); + } else { + result = FAIL; + } + + return result; +} + + +uint8_t cachePreUnpack(char *name) { + FILE *in = NULL; + FILE *out = NULL; + char *entryName = NULL; + char *entryDir = NULL; + char *temp = NULL; + uint8_t result = SUCCESS; + uint32_t i = 0; + uint32_t length = 0; + uint32_t total = 0; + int8_t buffer[8192] = { 0 }; + uint8_t hv[32] = { 0 }; + char virtualPath[CACHE_VIRTUAL_PATH_MAX] = { 0 }; + + in = fopen(name, "rb"); + if (in) { + // Get entire pack size. + fseek(in, -sizeof(uint32_t), SEEK_END); + fread(&total, 1, sizeof(uint32_t), in); + fseek(in, 0, SEEK_SET); + do { + // Read virtual path. + i = 0; + do { + virtualPath[i++] = fgetc(in); + } while (virtualPath[i - 1] != 0); + // Read SHA256. + fread(hv, 1, sizeof(hv), in); + for (i=0; i<32; i++) sprintf((char *)&buffer[i * 2], "%02x", hv[i]); + buffer[64] = 0; + // Read length. + fread(&length, 1, sizeof(uint32_t), in); + // Get filename from cache manager & create missing directories. + do { + entryName = cacheEntryNameGenerate(); + entryDir = cacheEntryNameDirGet(entryName, 1); + temp = osLastPathComponentGetUpTo(entryDir); + osMkDirP(temp); + DEL(temp); + } while (osFileExists(entryDir)); + cacheEntryAdd((char *)buffer, entryName, virtualPath); + out = fopen(entryDir, "wb"); + if (out) { + // Copy out data. + do { + if (length > sizeof(buffer)) { + i = sizeof(buffer); + } else { + i = length; + } + length -= i; + fread(buffer, 1, i, in); + fwrite(buffer, 1, i, out); + } while (length > 0); + fclose(out); + } else { + result = FAIL; + } + } while ((unsigned)ftell(in) < (total - sizeof(uint32_t))); + fclose(in); + } else { + result = FAIL; + } + + return result; +} + + +char *cacheSha256Get(char *virtualPath) { + return cacheFieldGet(virtualPath, CACHE_FIELD_SHA256); +} + + +void cacheShutdown(void) { + // Nada. +} + + +void cacheStartup(char *appName) { + char *temp = NULL; + + // Do we need to unpack the initial cache? + if (!cacheExists()) { + temp = utilAppNameWithNewExtensionGet(appName, "pre"); + cachePreUnpack(temp); + DEL(temp); + } +} diff --git a/client/src/embedded/embedded.h b/client/src/system/cache.h similarity index 54% rename from client/src/embedded/embedded.h rename to client/src/system/cache.h index 0d511e5..9d084e2 100644 --- a/client/src/embedded/embedded.h +++ b/client/src/system/cache.h @@ -18,12 +18,32 @@ */ -#ifndef EMBEDDED_H -#define EMBEDDED_H +#ifndef CACHE_H +#define CACHE_H -#include "mouse.h" -#include "vga8x14.h" +#include "os.h" -#endif // EMBEDDED_H +#define CACHE_VIRTUAL_PATH_MAX 512 + + +typedef struct CachePreMakeListS { + char *filename; + char *virtualPath; +} CachePreMakeListT; + + +uint8_t cacheDelete(char *virtualPath); +uint8_t cacheEntryAdd(char *sha256, char *entryName, char *virtualPath); +char *cacheEntryNameGet(char *virtualPath); +uint8_t cacheExists(void); +char *cacheFilenameGet(char *virtualPath); +uint8_t cachePrePack(char *name, CachePreMakeListT *list); +uint8_t cachePreUnpack(char *name); +char *cacheSha256Get(char *virtualPath); +void cacheShutdown(void); +void cacheStartup(char *appName); + + +#endif // CACHE_H diff --git a/client/src/network.c b/client/src/system/network.c similarity index 100% rename from client/src/network.c rename to client/src/system/network.c diff --git a/client/src/network.h b/client/src/system/network.h similarity index 100% rename from client/src/network.h rename to client/src/system/network.h diff --git a/client/src/system/os.c b/client/src/system/os.c index 9496230..7fa6f42 100644 --- a/client/src/system/os.c +++ b/client/src/system/os.c @@ -31,6 +31,155 @@ uint8_t osFileExists(char *filename) { } +char *osLastPathComponentGet(char *pathname) { + static char *start; + int32_t x; + + start = pathname; + + // Scan through name and find the last path separator + for (x=0; x<(int32_t)strlen(pathname); x++) { + if (pathname[x] == '\\' || pathname[x] == '/') { + start = &pathname[x + 1]; + } + } + + return start; +} + + +char *osLastPathComponentGetUpTo(char *pathname) { + static char *copy = NULL; + uint8_t dumb = 0; // Using (copy == NULL) below didn't work after optimizations, so ente + int32_t x; + + x = (int32_t)(strlen(pathname) - strlen(osLastPathComponentGet(pathname))) - 1; + if (x < 0) x = 0; + if (dumb) { + free(copy); + copy = NULL; + } else { + dumb = 1; + } + copy = strdup(pathname); + copy[x] = 0; + osPathSeparatorsFix(©, 1); + + return copy; +} + + +int8_t osMkDir(char *dir) { + return mkdir(dir, 0777); +} + + +uint8_t osMkDirP(char *dir) { + char tmp[OS_PATH_MAX]; + char *p = NULL; + struct stat sb; + size_t len; + + // Make copy of dir. + len = strnlen(dir, OS_PATH_MAX); + if (len == 0 || len == OS_PATH_MAX) { + return FAIL; + } + memcpy(tmp, dir, len); + tmp[len] = '\0'; + + // Remove trailing slash. + if (tmp[len - 1] == OS_PATH_SLASH) { + tmp[len - 1] = '\0'; + } + + // Does it already exist? + if (stat(tmp, &sb) == 0) { + if (S_ISDIR (sb.st_mode)) { + return SUCCESS; + } + } + + // Recursive mkdir. + for (p = tmp + 1; *p; p++) { + if (*p == OS_PATH_SLASH) { + *p = 0; + if (stat(tmp, &sb) != 0) { + // Does not exist - create it. + if (osMkDir(tmp) < 0) { + return FAIL; + } + } else { + if (!S_ISDIR(sb.st_mode)) { + // Not a directory + return FAIL; + } + } + *p = OS_PATH_SLASH; + } + } + // Check path + if (stat(tmp, &sb) != 0) { + // Does not exist - create it. + if (osMkDir(tmp) < 0) { + return FAIL; + } + } else { + if (!S_ISDIR(sb.st_mode)) { + // Not a directory + return FAIL; + } + } + + return SUCCESS; +} + + +void osPathSeparatorsFix(char **path, uint8_t slash) { + + int32_t i = 0; + int32_t j = 0; + char *work = *path; + char *temp = NULL; + + // Flip path separators to whatever our OS wants & remove repeated separators. + while (work[i] != 0) { + // Correct separator + if (work[i] == '\\' || work[i] == '/') { + // Was the prior character a seprator? + if (j == 0) { + work[j++] = OS_PATH_SLASH; + } else { + if (work[j - 1] != OS_PATH_SLASH) { + // No, accept it. + work[j++] = OS_PATH_SLASH; + } + } + } else { + work[j++] = work[i]; + } + i++; + } + work[j] = 0; + + if (slash) { + // Does this string end with a path separator? + if (work[strlen(work) - 1] != OS_PATH_SLASH) { + // No - append one. + temp = strdup(work); + free(work); + work = malloc(sizeof(char) * (strlen(temp) + 2)); + strcpy(work, temp); + work[strlen(temp)] = OS_PATH_SLASH; + work[strlen(temp) + 1] = 0; + free(temp); + } + } + + *path = work; +} + + void osShutdown(void) { #ifdef __linux__ linuxOsShutdown(); @@ -42,4 +191,6 @@ void osStartup(void) { #ifdef __linux__ linuxOsStartup(); #endif + + srand(rawclock()); } diff --git a/client/src/system/os.h b/client/src/system/os.h index c4908c5..48c0771 100644 --- a/client/src/system/os.h +++ b/client/src/system/os.h @@ -42,10 +42,13 @@ #define TICKS_PER_SECOND 18.2 #define TICKS_PER_DAY (SECONDS_IN_DAY * TICKS_PER_SECOND) +#define OS_PATH_MAX 256 + #ifdef __linux__ #define BITS64 +#define OS_PATH_SLASH '/' // Linux DOS replacements. uint32_t rawclock(void); @@ -57,6 +60,7 @@ void linuxOsStartup(void); #else #define BITS32 +#define PATH_SLASH '\\' // DOS includes. #include @@ -78,6 +82,7 @@ void linuxOsStartup(void); #include "log.h" #include "util.h" #include "packet.h" +#include "cache.h" // Allocation helpers. @@ -99,9 +104,14 @@ typedef struct PacketThreadDataS PacketThreadDataT; extern PacketThreadDataT *__packetThreadData; // Declared in main.c -uint8_t osFileExists(char *filename); -void osShutdown(void); -void osStartup(void); +uint8_t osFileExists(char *filename); +char *osLastPathComponentGet(char *pathname); +char *osLastPathComponentGetUpTo(char *pathname); +int8_t osMkDir(char *dir); +uint8_t osMkDirP(char *dir); +void osPathSeparatorsFix(char **path, uint8_t slash); +void osShutdown(void); +void osStartup(void); #endif // OS_H diff --git a/client/src/thirdparty/SHA256/LICENSE b/client/src/thirdparty/SHA256/LICENSE new file mode 100644 index 0000000..91fcc73 --- /dev/null +++ b/client/src/thirdparty/SHA256/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 Ilya O. Levin + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/client/src/thirdparty/SHA256/README.md b/client/src/thirdparty/SHA256/README.md new file mode 100644 index 0000000..097ce06 --- /dev/null +++ b/client/src/thirdparty/SHA256/README.md @@ -0,0 +1,13 @@ +# SHA256 + +SHA-256 implementation to compliment a portable byte-oriented AES-256 +implementation in C at http://www.literatecode.com/aes256 + +There is also a newer version in the [mark2](mark2) directory. This version is +cleaner and closer to a reference implementation. It no longer has +built-in support features for endianness, but you may easily adapt +the code to different endianness shall you need that. + +Unlike the previous implementation, the Mark 2 one is formally +verifiable with [CBMC](http://www.cprover.org/cbmc/) + diff --git a/client/src/thirdparty/SHA256/mark2/Makefile b/client/src/thirdparty/SHA256/mark2/Makefile new file mode 100644 index 0000000..c8224d3 --- /dev/null +++ b/client/src/thirdparty/SHA256/mark2/Makefile @@ -0,0 +1,32 @@ +COMPLR = $(shell which clang >/dev/null; echo $$?) +ifeq "$(COMPLR)" "0" + CC = clang + CFLAGS=-Oz -pedantic -Wall -Wextra -Weverything +else + CC = gcc + CFLAGS=-O3 -pedantic -Wall -Wextra -std=c99 +endif + +CBMCH = $(shell cbmc --help) +CBMCFLAGS = --unwind 8 --partial-loops --bounds-check --pointer-check \ + --div-by-zero-check --signed-overflow-check + +TARGET = sha256 + +$(TARGET).o: sha256.c sha256.h + $(CC) $(CFLAGS) -c -o $@ $< + +test: sha256.c sha256.h + $(CC) $(CFLAGS) -o $(TARGET) -DSELF_TEST $< + +all: $(TARGET) + +.PHONY: clean verify + +clean: + rm -f $(TARGET) *.o + +verify: + @# Unsigned overflows are deliberate, so we skip such checks to avoid + @# code complication with wrapping additions into a safeguard function + cbmc sha256.c -DSELF_TEST $(CBMCFLAGS) $(findstring --memory-leak-check,$(CBMCH)) diff --git a/client/src/thirdparty/SHA256/mark2/sha256.C b/client/src/thirdparty/SHA256/mark2/sha256.C new file mode 100644 index 0000000..290cea3 --- /dev/null +++ b/client/src/thirdparty/SHA256/mark2/sha256.C @@ -0,0 +1,298 @@ +/* +* SHA-256 implementation, Mark 2 +* +* Copyright (c) 2010,2014 Ilya O. Levin, http://www.literatecode.com +* +* Permission to use, copy, modify, and distribute this software for any +* purpose with or without fee is hereby granted, provided that the above +* copyright notice and this permission notice appear in all copies. +* +* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +#include "sha256.h" +/* #define MINIMIZE_STACK_IMPACT */ + +#ifdef __cplusplus +extern "C" { +#endif + +#define FN_ inline static + +static const uint32_t K[64] = { + 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, + 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, + 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, + 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, + 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, + 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, + 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, + 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, + 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, + 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, + 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, + 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, + 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, + 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, + 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, + 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 +}; + +#ifdef MINIMIZE_STACK_IMPACT +static uint32_t W[64]; +#endif + +/* -------------------------------------------------------------------------- */ +FN_ uint8_t _shb(uint32_t x, uint32_t n) +{ + return ( (x >> (n & 31)) & 0xff ); +} /* _shb */ + +/* -------------------------------------------------------------------------- */ +FN_ uint32_t _shw(uint32_t x, uint32_t n) +{ + return ( (x << (n & 31)) & 0xffffffff ); +} /* _shw */ + +/* -------------------------------------------------------------------------- */ +FN_ uint32_t _r(uint32_t x, uint8_t n) +{ + return ( (x >> n) | _shw(x, 32 - n) ); +} /* _r */ + +/* -------------------------------------------------------------------------- */ +FN_ uint32_t _Ch(uint32_t x, uint32_t y, uint32_t z) +{ + return ( (x & y) ^ ((~x) & z) ); +} /* _Ch */ + +/* -------------------------------------------------------------------------- */ +FN_ uint32_t _Ma(uint32_t x, uint32_t y, uint32_t z) +{ + return ( (x & y) ^ (x & z) ^ (y & z) ); +} /* _Ma */ + +/* -------------------------------------------------------------------------- */ +FN_ uint32_t _S0(uint32_t x) +{ + return ( _r(x, 2) ^ _r(x, 13) ^ _r(x, 22) ); +} /* _S0 */ + +/* -------------------------------------------------------------------------- */ +FN_ uint32_t _S1(uint32_t x) +{ + return ( _r(x, 6) ^ _r(x, 11) ^ _r(x, 25) ); +} /* _S1 */ + +/* -------------------------------------------------------------------------- */ +FN_ uint32_t _G0(uint32_t x) +{ + return ( _r(x, 7) ^ _r(x, 18) ^ (x >> 3) ); +} /* _G0 */ + +/* -------------------------------------------------------------------------- */ +FN_ uint32_t _G1(uint32_t x) +{ + return ( _r(x, 17) ^ _r(x, 19) ^ (x >> 10) ); +} /* _G1 */ + +/* -------------------------------------------------------------------------- */ +FN_ uint32_t _word(uint8_t *c) +{ + return ( _shw(c[0], 24) | _shw(c[1], 16) | _shw(c[2], 8) | (c[3]) ); +} /* _word */ + +/* -------------------------------------------------------------------------- */ +FN_ void _addbits(sha256_context *ctx, uint32_t n) +{ + if ( ctx->bits[0] > (0xffffffff - n) ) + ctx->bits[1] = (ctx->bits[1] + 1) & 0xFFFFFFFF; + ctx->bits[0] = (ctx->bits[0] + n) & 0xFFFFFFFF; +} /* _addbits */ + +/* -------------------------------------------------------------------------- */ +static void _hash(sha256_context *ctx) +{ + register uint32_t a, b, c, d, e, f, g, h, i; + uint32_t t[2]; +#ifndef MINIMIZE_STACK_IMPACT + uint32_t W[64]; +#endif + + a = ctx->hash[0]; + b = ctx->hash[1]; + c = ctx->hash[2]; + d = ctx->hash[3]; + e = ctx->hash[4]; + f = ctx->hash[5]; + g = ctx->hash[6]; + h = ctx->hash[7]; + + for (i = 0; i < 64; i++) { + if ( i < 16 ) + W[i] = _word(&ctx->buf[_shw(i, 2)]); + else + W[i] = _G1(W[i - 2]) + W[i - 7] + _G0(W[i - 15]) + W[i - 16]; + + t[0] = h + _S1(e) + _Ch(e, f, g) + K[i] + W[i]; + t[1] = _S0(a) + _Ma(a, b, c); + h = g; + g = f; + f = e; + e = d + t[0]; + d = c; + c = b; + b = a; + a = t[0] + t[1]; + } + + ctx->hash[0] += a; + ctx->hash[1] += b; + ctx->hash[2] += c; + ctx->hash[3] += d; + ctx->hash[4] += e; + ctx->hash[5] += f; + ctx->hash[6] += g; + ctx->hash[7] += h; +} /* _hash */ + +/* -------------------------------------------------------------------------- */ +void sha256_init(sha256_context *ctx) +{ + if ( ctx != NULL ) { + ctx->bits[0] = ctx->bits[1] = 0; + ctx->len = 0; + ctx->hash[0] = 0x6a09e667; + ctx->hash[1] = 0xbb67ae85; + ctx->hash[2] = 0x3c6ef372; + ctx->hash[3] = 0xa54ff53a; + ctx->hash[4] = 0x510e527f; + ctx->hash[5] = 0x9b05688c; + ctx->hash[6] = 0x1f83d9ab; + ctx->hash[7] = 0x5be0cd19; + } +} /* sha256_init */ + +/* -------------------------------------------------------------------------- */ +void sha256_hash(sha256_context *ctx, const void *data, size_t len) +{ + register size_t i; + const uint8_t *bytes = (const uint8_t *)data; + + if ( (ctx != NULL) && (bytes != NULL) ) + for (i = 0; i < len; i++) { + ctx->buf[ctx->len] = bytes[i]; + ctx->len++; + if (ctx->len == sizeof(ctx->buf) ) { + _hash(ctx); + _addbits(ctx, sizeof(ctx->buf) * 8); + ctx->len = 0; + } + } +} /* sha256_hash */ + +/* -------------------------------------------------------------------------- */ +void sha256_done(sha256_context *ctx, uint8_t *hash) +{ + register uint32_t i, j; + + if ( ctx != NULL ) { + j = ctx->len % sizeof(ctx->buf); + ctx->buf[j] = 0x80; + for (i = j + 1; i < sizeof(ctx->buf); i++) + ctx->buf[i] = 0x00; + + if ( ctx->len > 55 ) { + _hash(ctx); + for (j = 0; j < sizeof(ctx->buf); j++) + ctx->buf[j] = 0x00; + } + + _addbits(ctx, ctx->len * 8); + ctx->buf[63] = _shb(ctx->bits[0], 0); + ctx->buf[62] = _shb(ctx->bits[0], 8); + ctx->buf[61] = _shb(ctx->bits[0], 16); + ctx->buf[60] = _shb(ctx->bits[0], 24); + ctx->buf[59] = _shb(ctx->bits[1], 0); + ctx->buf[58] = _shb(ctx->bits[1], 8); + ctx->buf[57] = _shb(ctx->bits[1], 16); + ctx->buf[56] = _shb(ctx->bits[1], 24); + _hash(ctx); + + if ( hash != NULL ) + for (i = 0, j = 24; i < 4; i++, j -= 8) { + hash[i ] = _shb(ctx->hash[0], j); + hash[i + 4] = _shb(ctx->hash[1], j); + hash[i + 8] = _shb(ctx->hash[2], j); + hash[i + 12] = _shb(ctx->hash[3], j); + hash[i + 16] = _shb(ctx->hash[4], j); + hash[i + 20] = _shb(ctx->hash[5], j); + hash[i + 24] = _shb(ctx->hash[6], j); + hash[i + 28] = _shb(ctx->hash[7], j); + } + } +} /* sha256_done */ + +/* -------------------------------------------------------------------------- */ +void sha256(const void *data, size_t len, uint8_t *hash) +{ + sha256_context ctx; + + sha256_init(&ctx); + sha256_hash(&ctx, data, len); + sha256_done(&ctx, hash); +} /* sha256 */ + + +/* ========================================================================== */ +#ifdef SELF_TEST + +#include +#include + +int main(void) +{ + char *buf[] = { + "", + "e3b0c442 98fc1c14 9afbf4c8 996fb924 27ae41e4 649b934c a495991b 7852b855", + + "abc", + "ba7816bf 8f01cfea 414140de 5dae2223 b00361a3 96177a9c b410ff61 f20015ad", + + "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", + "248d6a61 d20638b8 e5c02693 0c3e6039 a33ce459 64ff2167 f6ecedd4 19db06c1", + + "The quick brown fox jumps over the lazy dog", + "d7a8fbb3 07d78094 69ca9abc b0082e4f 8d5651e4 6d3cdb76 2d02d0bf 37c9e592", + + "The quick brown fox jumps over the lazy cog", /* avalanche effect test */ + "e4c4d8f3 bf76b692 de791a17 3e053211 50f7a345 b46484fe 427f6acc 7ecc81be", + + "bhn5bjmoniertqea40wro2upyflkydsibsk8ylkmgbvwi420t44cq034eou1szc1k0mk46oeb7ktzmlxqkbte2sy", + "9085df2f 02e0cc45 5928d0f5 1b27b4bf 1d9cd260 a66ed1fd a11b0a3f f5756d99" + }; + uint8_t hash[SHA256_BYTES]; + size_t i, j; + + for (i = 0; i < (sizeof(buf) / sizeof(buf[0])); i += 2) { + sha256(buf[i], strlen(buf[i]), hash); + printf("input = '%s'\ndigest: %s\nresult: ", buf[i], buf[i + 1]); + for (j = 0; j < SHA256_BYTES; j++) + printf("%02x%s", hash[j], ((j % 4) == 3) ? " " : ""); + printf("\n\n"); + } + + return 0; +} /* main */ + +#endif /* def SELF_TEST */ + +#ifdef __cplusplus +} +#endif + diff --git a/client/src/thirdparty/SHA256/mark2/sha256.h b/client/src/thirdparty/SHA256/mark2/sha256.h new file mode 100644 index 0000000..02de100 --- /dev/null +++ b/client/src/thirdparty/SHA256/mark2/sha256.h @@ -0,0 +1,57 @@ +/* +* SHA-256 implementation, Mark 2 +* +* Copyright (c) 2010,2014 Ilya O. Levin, http://www.literatecode.com +* +* Permission to use, copy, modify, and distribute this software for any +* purpose with or without fee is hereby granted, provided that the above +* copyright notice and this permission notice appear in all copies. +* +* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +#ifndef SHA256_H_ +#define SHA256_H_ + +#include +#ifdef _MSC_VER +#ifndef uint8_t +typedef unsigned __int8 uint8_t; +#endif +#ifndef uint32_t +typedef unsigned __int32 uint32_t; +#endif +#else +#include +#endif + +#define SHA256_BYTES 32 + +#ifdef __cplusplus +extern "C" +{ +#endif + +typedef struct { + uint8_t buf[64]; + uint32_t hash[8]; + uint32_t bits[2]; + uint32_t len; +} sha256_context; + +void sha256_init(sha256_context *ctx); +void sha256_hash(sha256_context *ctx, const void *data, size_t len); +void sha256_done(sha256_context *ctx, uint8_t *hash); + +void sha256(const void *data, size_t len, uint8_t *hash); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/client/src/thirdparty/SHA256/sha256.c b/client/src/thirdparty/SHA256/sha256.c new file mode 100644 index 0000000..747cc09 --- /dev/null +++ b/client/src/thirdparty/SHA256/sha256.c @@ -0,0 +1,245 @@ +/* +* SHA-256 implementation. +* +* Copyright (c) 2010 Ilya O. Levin, http://www.literatecode.com +* +* Permission to use, copy, modify, and distribute this software for any +* purpose with or without fee is hereby granted, provided that the above +* copyright notice and this permission notice appear in all copies. +* +* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +#define SWAP_BYTES +// #define USE_STD_MEMCPY +// #define SELF_TEST + +#ifdef USE_STD_MEMCPY +#include +#endif +#include "sha256.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define RL(x,n) (((x) << n) | ((x) >> (32 - n))) +#define RR(x,n) (((x) >> n) | ((x) << (32 - n))) + +#define S0(x) (RR((x), 2) ^ RR((x),13) ^ RR((x),22)) +#define S1(x) (RR((x), 6) ^ RR((x),11) ^ RR((x),25)) +#define G0(x) (RR((x), 7) ^ RR((x),18) ^ ((x) >> 3)) +#define G1(x) (RR((x),17) ^ RR((x),19) ^ ((x) >> 10)) + +#ifdef SWAP_BYTES +#define BSWP(x,y) _bswapw((uint32_t *)(x), (uint32_t)(y)) +#else +#define BSWP(p,n) +#endif +#ifdef USE_STD_MEMCPY +#define MEMCP(x,y,z) memcpy((x),(y),(z)) +#else +#define MEMCP(x,y,z) _memcp((x),(y),(z)) +#endif + +#ifndef __cdecl +#define __cdecl +#endif + +static const uint32_t K[64] = { + 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, + 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, + 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, + 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, + 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, + 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, + 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, + 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, + 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, + 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, + 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, + 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, + 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, + 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, + 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, + 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 +}; + +/* -------------------------------------------------------------------------- */ +static void _bswapw(uint32_t *p, uint32_t i) +{ + while (i--) p[i] = (RR(p[i],24) & 0x00ff00ff) | (RR(p[i],8) & 0xff00ff00); + +} /* _bswapw */ + +/* -------------------------------------------------------------------------- */ +#ifndef USE_STD_MEMCPY +void * __cdecl _memcp (void *d, const void *s, uint32_t sz) +{ + void *rv = d; + + while (sz--) *(char *)d = *(char *)s, d = (char *)d + 1, s = (char *)s + 1; + + return(rv); +} /* _memcp */ +#endif + +/* -------------------------------------------------------------------------- */ +static void _rtrf(uint32_t *b, uint32_t *p, uint32_t i, uint32_t j) +{ + #define B(x, y) b[(x-y) & 7] + #define P(x, y) p[(x+y) & 15] + + B(7,i) += (j ? (p[i & 15] += G1(P(i,14)) + P(i,9) + G0(P(i,1))) : p[i & 15]) + + K[i+j] + S1(B(4,i)) + + (B(6,i) ^ (B(4,i) & (B(5,i) ^ B(6,i)))); + B(3,i) += B(7,i); + B(7,i) += S0(B(0,i)) + ( (B(0,i) & B(1,i)) | (B(2,i) & (B(0,i) ^ B(1,i))) ); + + #undef P + #undef B +} /* _rtrf */ + +/* -------------------------------------------------------------------------- */ +static void _hash(sha256_context *ctx) +{ + uint32_t b[8], *p, j; + + b[0] = ctx->hash[0]; b[1] = ctx->hash[1]; b[2] = ctx->hash[2]; + b[3] = ctx->hash[3]; b[4] = ctx->hash[4]; b[5] = ctx->hash[5]; + b[6] = ctx->hash[6]; b[7] = ctx->hash[7]; + + for (p = ctx->buf, j = 0; j < 64; j += 16) + _rtrf(b, p, 0, j), _rtrf(b, p, 1, j), _rtrf(b, p, 2, j), + _rtrf(b, p, 3, j), _rtrf(b, p, 4, j), _rtrf(b, p, 5, j), + _rtrf(b, p, 6, j), _rtrf(b, p, 7, j), _rtrf(b, p, 8, j), + _rtrf(b, p, 9, j), _rtrf(b, p, 10, j), _rtrf(b, p, 11, j), + _rtrf(b, p, 12, j), _rtrf(b, p, 13, j), _rtrf(b, p, 14, j), + _rtrf(b, p, 15, j); + + ctx->hash[0] += b[0]; ctx->hash[1] += b[1]; ctx->hash[2] += b[2]; + ctx->hash[3] += b[3]; ctx->hash[4] += b[4]; ctx->hash[5] += b[5]; + ctx->hash[6] += b[6]; ctx->hash[7] += b[7]; + +} /* _hash */ + +/* -------------------------------------------------------------------------- */ +void sha256_init(sha256_context *ctx) +{ + ctx->len[0] = ctx->len[1] = 0; + ctx->hash[0] = 0x6a09e667; ctx->hash[1] = 0xbb67ae85; + ctx->hash[2] = 0x3c6ef372; ctx->hash[3] = 0xa54ff53a; + ctx->hash[4] = 0x510e527f; ctx->hash[5] = 0x9b05688c; + ctx->hash[6] = 0x1f83d9ab; ctx->hash[7] = 0x5be0cd19; + +} /* sha256_init */ + +/* -------------------------------------------------------------------------- */ +void sha256_hash(sha256_context *ctx, uint8_t *dat, uint32_t sz) +{ + register uint32_t i = ctx->len[0] & 63, l, j; + + if ((ctx->len[0] += sz) < sz) ++(ctx->len[1]); + + for (j = 0, l = 64-i; sz >= l; j += l, sz -= l, l = 64, i = 0) + { + MEMCP((char *)ctx->buf + i, &dat[j], l); + BSWP(ctx->buf, 16 ); + _hash(ctx); + } + MEMCP((char *)ctx->buf + i, &dat[j], sz); + +} /* _hash */ + +/* -------------------------------------------------------------------------- */ +void sha256_done(sha256_context *ctx, uint8_t *buf) +{ + uint32_t i = (uint32_t)(ctx->len[0] & 63), j = ((~i) & 3) << 3; + + BSWP(ctx->buf, (i + 3) >> 2); + + ctx->buf[i >> 2] &= 0xffffff80 << j; /* add padding */ + ctx->buf[i >> 2] |= 0x00000080 << j; + + if (i < 56) i = (i >> 2) + 1; + else ctx->buf[15] ^= (i < 60) ? ctx->buf[15] : 0, _hash(ctx), i = 0; + + while (i < 14) ctx->buf[i++] = 0; + + ctx->buf[14] = (ctx->len[1] << 3)|(ctx->len[0] >> 29); /* add length */ + ctx->buf[15] = ctx->len[0] << 3; + + _hash(ctx); + + for (i = 0; i < 32; i++) + ctx->buf[i % 16] = 0, /* may remove this line in case of a DIY cleanup */ + buf[i] = (uint8_t)(ctx->hash[i >> 2] >> ((~i & 3) << 3)); + +} /* sha256_done */ + + +#ifdef SELF_TEST +#pragma warning (push, 0) +#include +#include +#include +#pragma warning(pop) + +char *buf[] = { + "", + "e3b0c442 98fc1c14 9afbf4c8 996fb924 27ae41e4 649b934c a495991b 7852b855", + + "abc", + "ba7816bf 8f01cfea 414140de 5dae2223 b00361a3 96177a9c b410ff61 f20015ad", + + "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", + "248d6a61 d20638b8 e5c02693 0c3e6039 a33ce459 64ff2167 f6ecedd4 19db06c1", + + "The quick brown fox jumps over the lazy dog", + "d7a8fbb3 07d78094 69ca9abc b0082e4f 8d5651e4 6d3cdb76 2d02d0bf 37c9e592", + + "The quick brown fox jumps over the lazy cog", /* avalanche effect test */ + "e4c4d8f3 bf76b692 de791a17 3e053211 50f7a345 b46484fe 427f6acc 7ecc81be", + + "bhn5bjmoniertqea40wro2upyflkydsibsk8ylkmgbvwi420t44cq034eou1szc1k0mk46oeb7ktzmlxqkbte2sy", + "9085df2f 02e0cc45 5928d0f5 1b27b4bf 1d9cd260 a66ed1fd a11b0a3f f5756d99" +}; + +int main(int argc, char *argv[]) +{ + sha256_context ctx; + uint8_t hv[32]; + uint32_t i, j; + + for (j = 0; j < (sizeof(buf)/sizeof(buf[0])); j += 2) + { + sha256_init(&ctx); + sha256_hash(&ctx, (uint8_t *)buf[j], (uint32_t)strlen(buf[j])); + sha256_done(&ctx, hv); + printf("input = %s\ndigest: %s\nresult: ", buf[j], buf[j+1]); + for (i = 0; i < 32; i++) printf("%02x%s", hv[i], ((i%4)==3)?" ":""); + printf("\n\n"); + } + + for (j = 1; j < (uint32_t)argc; j++) + { + printf("argv[%d]: %s\nresult: ", (int)j, argv[j]); + sha256_init(&ctx); + sha256_hash(&ctx, (uint8_t *)argv[j], (uint32_t)strlen(argv[j])); + sha256_done(&ctx, hv); + for (i = 0; i < 32; i++) printf("%02x%s", hv[i], ((i%4)==3)?" ":""); + printf("\n\n"); + } + + return 0; +} /* main */ +#endif + +#ifdef __cplusplus +} +#endif diff --git a/client/src/thirdparty/SHA256/sha256.h b/client/src/thirdparty/SHA256/sha256.h new file mode 100644 index 0000000..e19e56b --- /dev/null +++ b/client/src/thirdparty/SHA256/sha256.h @@ -0,0 +1,50 @@ +/* +* SHA-256 implementation. +* +* Copyright (c) 2010 Ilya O. Levin, http://www.literatecode.com +* +* Permission to use, copy, modify, and distribute this software for any +* purpose with or without fee is hereby granted, provided that the above +* copyright notice and this permission notice appear in all copies. +* +* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +#ifdef _MSC_VER +#ifndef uint8_t +typedef unsigned __int8 uint8_t; +#endif +#ifndef uint32_t +typedef unsigned __int32 uint32_t; +#endif +#ifndef uint64_t +typedef __int64 int64_t; +typedef unsigned __int64 uint64_t; +#endif +#else +#include +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef struct { + uint32_t buf[16]; + uint32_t hash[8]; + uint32_t len[2]; + } sha256_context; + + void sha256_init(sha256_context *); + void sha256_hash(sha256_context *, uint8_t * /* data */, uint32_t /* len */); + void sha256_done(sha256_context *, uint8_t * /* hash */); + +#ifdef __cplusplus +} +#endif diff --git a/client/src/welcome.c b/client/src/welcome.c index c2faaf4..b7ecb09 100644 --- a/client/src/welcome.c +++ b/client/src/welcome.c @@ -195,6 +195,11 @@ static void settingsFinished(WidgetT *widget) { void welcomeShow(void) { + char *logo = strdup(cacheFilenameGet("system:logo")); + char *init = strdup(cacheFilenameGet("system:init")); + char *dial = strdup(cacheFilenameGet("system:dialing")); + char *conn = strdup(cacheFilenameGet("system:connect")); + // 450x128 logo TagItemT uiWelcome[] = { @@ -204,22 +209,22 @@ void welcomeShow(void) { T_WIDTH, 500, T_HEIGHT, 225, T_PICTURE, O(_picLogo), - T_FILENAME, P("data/logo.png"), + T_FILENAME, P(logo), T_X, 18, T_Y, 18, T_PICTURE, T_DONE, T_PICTURE, O(_picInit), - T_FILENAME, P("data/dinit.png"), + T_FILENAME, P(init), T_X, 18, T_Y, 18, T_VISIBLE, T_FALSE, T_PICTURE, T_DONE, T_PICTURE, O(_picDialing), - T_FILENAME, P("data/ddialing.png"), + T_FILENAME, P(dial), T_X, 179, T_Y, 18, T_VISIBLE, T_FALSE, T_PICTURE, T_DONE, T_PICTURE, O(_picConnect), - T_FILENAME, P("data/dconnect.png"), + T_FILENAME, P(conn), T_X, 339, T_Y, 18, T_VISIBLE, T_FALSE, T_PICTURE, T_DONE, @@ -251,6 +256,11 @@ void welcomeShow(void) { }; tagListRun(uiWelcome); + + DEL(conn); + DEL(dial); + DEL(init); + DEL(logo); } diff --git a/font/data/vga8x14.dat b/font/data/vga8x14.dat deleted file mode 100644 index 432c721..0000000 --- a/font/data/vga8x14.dat +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f547ef7ca4aa8fd9050cf370473ed2ee4b0db030613008fd7ed6a7dc08e9f3c7 -size 3588 diff --git a/font/data/vga8x16.dat b/font/data/vga8x16.dat deleted file mode 100644 index bd9288e..0000000 --- a/font/data/vga8x16.dat +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ffaf5a93c5e4315b7ed5059ed8cf1322824e9f4ee3a3d93d878e068f74ea6329 -size 4100 diff --git a/font/data/vga8x8.dat b/font/data/vga8x8.dat deleted file mode 100644 index e41fe84..0000000 --- a/font/data/vga8x8.dat +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:014d7209c4f671963ab147b478213def901f657eff3a6c5eafd65298903d6138 -size 2052 diff --git a/font/assets/vga8x14.png b/font/in/vga8x14.png similarity index 100% rename from font/assets/vga8x14.png rename to font/in/vga8x14.png diff --git a/font/assets/vga8x16.png b/font/in/vga8x16.png similarity index 100% rename from font/assets/vga8x16.png rename to font/in/vga8x16.png diff --git a/font/assets/vga8x8.png b/font/in/vga8x8.png similarity index 100% rename from font/assets/vga8x8.png rename to font/in/vga8x8.png diff --git a/kpmpgsmkii.pro b/kpmpgsmkii.pro index dd61259..01169bb 100644 --- a/kpmpgsmkii.pro +++ b/kpmpgsmkii.pro @@ -21,8 +21,9 @@ TEMPLATE = subdirs CONFIG *= ORDERED SUBDIRS = \ - client \ - server + client +# server +# precache # font # primes diff --git a/precache/precache.pro b/precache/precache.pro new file mode 100644 index 0000000..fce2fc9 --- /dev/null +++ b/precache/precache.pro @@ -0,0 +1,58 @@ +# +# Kangaroo Punch MultiPlayer Game Server Mark II +# Copyright (C) 2020-2021 Scott Duensing +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program 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. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +TEMPLATE = app +CONFIG -= qt +CONFIG += console + +DESTDIR = $$OUT_PWD/bin +SHARED = $$PWD/../shared +CLIENT = $$PWD/../client/src +SYSTEM = $$CLIENT/system +THIRDP = $$CLIENT/thirdparty + +INCLUDEPATH += \ + $$SHARED \ + $$SHARED/thirdparty \ + $$SYSTEM \ + $$THIRDP + +HEADERS = \ + $$SHARED/stddclmr.h \ + $$SHARED/log.h \ + $$SHARED/util.h \ + $$SHARED/thirdparty/memwatch/memwatch.h \ + $$THIRDP/SHA256/sha256.h \ + $$SYSTEM/surface.h \ + $$SYSTEM/os.h \ + $$SYSTEM/cache.h + +SOURCES = \ + $$SHARED/thirdparty/memwatch/memwatch.c \ + $$SHARED/log.c \ + $$SHARED/util.c \ + $$THIRDP/SHA256/sha256.c \ + $$CLIENT/linux/linux.c \ + $$SYSTEM/surface.c \ + $$SYSTEM/os.c \ + $$SYSTEM/cache.c \ + src/main.c + +LIBS = \ + -lSDL2 \ + -lSDL2_image diff --git a/precache/src/main.c b/precache/src/main.c new file mode 100644 index 0000000..9da387c --- /dev/null +++ b/precache/src/main.c @@ -0,0 +1,57 @@ +/* + * Kangaroo Punch MultiPlayer Game Server Mark II + * Copyright (C) 2020-2021 Scott Duensing + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program 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. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + + +#include + +#define MEMWATCH +#include "memwatch/memwatch.h" + +#include "cache.h" + +#include "stddclmr.h" + + +int main(int argc, char *argv[]) { + + CachePreMakeListT list[] = { + { "dconnect.png", "system:connect" }, + { "ddialing.png", "system:dialing" }, + { "dinit.png", "system:init" }, + { "logo.png", "system:logo" }, + { "mbie32.png", "system:exclamation" }, + { "mbii32.png", "system:information" }, + { "mbim32.png", "system:message" }, + { "mbiq32.png", "system:question" }, + { "mbiw32.png", "system:warning" }, + { "mouse.png", "system:mouse" }, + { "vga8x14.dat", "system:vga8x14" }, + { NULL, NULL } + }; + + (void)argc; + (void)argv; + + // Also run optipng -o7 on images. + + cachePrePack("client.pre", list); + cachePreUnpack("client.pre"); + + return 0; +}