Initial Code

This commit is contained in:
tobid7 2023-11-24 14:42:57 +01:00
parent f236e59cb4
commit 9d6f367c8d
19 changed files with 43496 additions and 0 deletions

5
build.sh Normal file
View File

@ -0,0 +1,5 @@
#Script to build
echo "Building with g++..."
g++ -g -o npi-build source/main.cpp source/samplefiles.cpp source/helper.cpp source/banner_audio.cpp source/logo_lz11.cpp source/icon.cpp source/banner.cpp -I include
echo "installing..."
sudo cp npi-build /usr/local/bin/

16
cformat.sh Normal file
View File

@ -0,0 +1,16 @@
#!/bin/bash
THIS_PATH="$(realpath "$0")"
THIS_DIR="$(dirname "$THIS_PATH")"
# Find all files in THIS_DIR which end in .ino, .cpp, etc., as specified
# in the regular expression just below
FILE_LIST="$(find "$THIS_DIR" | grep -E ".*(\.ino|\.cpp|\.c|\.h|\.hpp|\.hh)$" | grep -v "json.hpp")"
echo -e "Files found to format = \n\"\"\"\n$FILE_LIST\n\"\"\""
# Format each file.
# - NB: do NOT put quotes around `$FILE_LIST` below or else the `clang-format` command will
# mistakenly see the entire blob of newline-separated file names as a SINGLE file name instead
# of as a new-line separated list of *many* file names!
clang-format --verbose -i --style=file $FILE_LIST

5
include/banner.hpp Normal file
View File

@ -0,0 +1,5 @@
#pragma once
#include <cstddef>
extern unsigned char banner[];
extern size_t banner_size;

5
include/banner_audio.hpp Normal file
View File

@ -0,0 +1,5 @@
#pragma once
#include <cstddef>
extern unsigned char banner_audio[];
extern size_t banner_audio_size;

70
include/fileHash.hpp Normal file
View File

@ -0,0 +1,70 @@
#pragma once
#include <chrono>
#include <cstdlib>
#include <filesystem>
#include <fstream>
#include <iostream>
#include <map>
#include <string>
#include <vector>
inline std::string fix_path(const std::string &path)
{
if (path.find('\\') == path.npos)
return path;
std::string ret = path;
std::replace(ret.begin(), ret.end(), '\\', '/');
return ret;
}
inline std::string stupid_hash(const std::string &file)
{
std::ifstream iff(file);
if(!iff.is_open()) {
return std::to_string(rand());
}
unsigned long long check_sum = 0x0ULL;
char tmp;
while (iff.get(tmp))
{
check_sum += (unsigned long long)tmp;
}
iff.close();
std::stringstream ret;
ret << std::hex << check_sum;
return ret.str();
}
inline std::map<std::string, std::string>
createHashes(const std::vector<std::string> &dirs,
const std::string &extension)
{
std::map<std::string, std::string> hashes;
for (auto const &it : dirs)
{
for (const auto &file : std::filesystem::directory_iterator(it))
{
if (file.is_regular_file() && file.path().extension() == extension)
{
std::string path = fix_path(file.path().string());
hashes[path] = stupid_hash(path);
}
}
}
return hashes;
}
inline std::vector<std::filesystem::path>
getChangedFiles(const std::map<std::string, std::string> &oldHashes)
{
std::vector<std::filesystem::path> changedFiles;
for (const auto &file : oldHashes)
{
std::string newHash = stupid_hash(file.first);
if (newHash != file.second)
{
changedFiles.push_back(std::filesystem::path(file.first));
}
}
return changedFiles;
}

11
include/helper.hpp Normal file
View File

@ -0,0 +1,11 @@
#pragma once
#include <prj_def.hpp>
#include <string>
namespace helper {
std::string GenerateUniqueId();
void ArrayToFile(unsigned char *array_, size_t size_, std::string filename);
void GenerateTemplateFile(std::string path, NpiProject prj);
void CompileProject(std::string path);
void CleanProject(std::string path);
} // namespace helper

5
include/icon.hpp Normal file
View File

@ -0,0 +1,5 @@
#pragma once
#include <cstddef>
extern unsigned char icon[];
extern size_t icon_size;

24651
include/json.hpp Normal file

File diff suppressed because it is too large Load Diff

5
include/logo_lz11.hpp Normal file
View File

@ -0,0 +1,5 @@
#pragma once
#include <cstddef>
extern unsigned char logo_lz11[];
extern size_t logo_lz11_size;

111
include/prj_def.hpp Normal file
View File

@ -0,0 +1,111 @@
#pragma once
#include <string>
#include <vector>
struct NpiProject {
std::string name;
std::string author;
std::string description;
int vmajor;
int vminor;
int vbuild;
std::vector<std::string> source_dirs;
std::vector<std::string> include_dirs;
std::vector<std::string> libraries;
std::vector<std::string> lib_dirs;
std::string icon_path;
std::string banner_path;
std::string banner_a_path;
std::string rsf_path;
std::string logo_lz11_path;
std::string dir_gfx;
std::string dir_gfxbuild;
std::string dir_romfs;
std::string unique_id;
std::string prod;
std::string platform; // Platforms: 3ds, desktop
std::vector<std::string> arch_flags;
std::vector<std::string> c_flags;
std::vector<std::string> cxx_flags;
std::vector<std::string> as_flags;
std::vector<std::string> linker_flags;
std::string cxx_compiler;
std::string c_compiler;
std::string linker;
std::string asm_compiler;
};
inline void Prj_InitDefault(NpiProject &project) {
project.name = "Sample";
project.author = "Sample";
project.description = "Description";
project.vmajor = 1;
project.vminor = 0;
project.vbuild = 0;
project.source_dirs.push_back("source");
project.include_dirs.push_back("include");
project.libraries.push_back("m");
project.libraries.push_back("stdc++");
project.libraries.push_back("citro2d");
project.libraries.push_back("citro3d");
project.libraries.push_back("ctru");
project.arch_flags.push_back("march=armv6k");
project.arch_flags.push_back("mtune=mpcore");
project.arch_flags.push_back("mfloat-abi=hard");
project.arch_flags.push_back("mtp=soft");
project.c_flags.push_back("g");
project.c_flags.push_back("Wall");
project.c_flags.push_back("Wno-psabi");
project.c_flags.push_back("O2");
project.c_flags.push_back("mword-relocations");
project.c_flags.push_back("fomit-frame-pointer");
project.c_flags.push_back("ffunction-sections");
project.c_flags.push_back("[arch_flags]");
project.c_flags.push_back("D__3DS__");
project.c_flags.push_back("D_GNU_SOURCE=1");
project.cxx_flags.push_back("[c_flags]");
project.cxx_flags.push_back("fno-rtti");
project.cxx_flags.push_back("fno-exceptions");
project.cxx_flags.push_back("std=gnu++20");
project.as_flags.push_back("g");
project.as_flags.push_back("[arch_flags]");
project.linker_flags.push_back("specs=3dsx.specs");
project.linker_flags.push_back("g");
project.linker_flags.push_back("[arch_flags]");
project.linker_flags.push_back("Wl,-Map,./build/code.map");
project.lib_dirs.push_back("{DEVKITPRO}/portlibs/3ds/");
project.lib_dirs.push_back("{DEVKITPRO}/libctru/");
project.cxx_compiler = "{DEVKITPRO}/devkitARM/bin/arm-none-eabi-g++";
project.linker = "{DEVKITPRO}/devkitARM/bin/arm-none-eabi-g++";
project.c_compiler = "{DEVKITPRO}/devkitARM/bin/arm-none-eabi-gcc";
project.asm_compiler = "{DEVKITPRO}/devkitARM/bin/arm-none-eabi-gcc";
project.icon_path = "app/icon.png";
project.banner_path = "app/banner.png";
project.banner_a_path = "app/banner_audio.wav";
project.rsf_path = "app/build-cia.rsf";
project.logo_lz11_path = "app/logo.lz11";
project.dir_gfx = "gfx/";
project.dir_gfxbuild = "romfs/gfx/";
project.dir_romfs = "romfs/";
project.unique_id = "0xff3ff";
project.prod = "NPI7";
project.platform = "3ds";
}

7
include/samplefiles.hpp Normal file
View File

@ -0,0 +1,7 @@
#pragma once
extern const char *default_title;
extern const char *default_code;
extern const char *default_unique_id;
extern const char *default_romfs_path;
extern const char *ciaRSF;

519
source/banner.cpp Normal file
View File

@ -0,0 +1,519 @@
#include <banner.hpp>
unsigned char banner[] = {
0x89, 0x50, 0x4e, 0x47, 0xd, 0xa, 0x1a, 0xa, 0x0, 0x0, 0x0, 0xd,
0x49, 0x48, 0x44, 0x52, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x80,
0x8, 0x6, 0x0, 0x0, 0x0, 0xe4, 0xb5, 0xb7, 0xa, 0x0, 0x0, 0x1,
0x84, 0x69, 0x43, 0x43, 0x50, 0x49, 0x43, 0x43, 0x20, 0x70, 0x72, 0x6f,
0x66, 0x69, 0x6c, 0x65, 0x0, 0x0, 0x28, 0x91, 0x7d, 0x91, 0x3d, 0x48,
0xc3, 0x40, 0x1c, 0xc5, 0x5f, 0x53, 0xa5, 0x22, 0x95, 0xe, 0x2d, 0x28,
0xe2, 0x90, 0xa1, 0x3a, 0x59, 0x10, 0x15, 0x75, 0xd4, 0x2a, 0x14, 0xa1,
0x42, 0xa8, 0x15, 0x5a, 0x75, 0x30, 0xb9, 0xf4, 0xb, 0x9a, 0x34, 0x24,
0x29, 0x2e, 0x8e, 0x82, 0x6b, 0xc1, 0xc1, 0x8f, 0xc5, 0xaa, 0x83, 0x8b,
0xb3, 0xae, 0xe, 0xae, 0x82, 0x20, 0xf8, 0x1, 0xe2, 0xea, 0xe2, 0xa4,
0xe8, 0x22, 0x25, 0xfe, 0xaf, 0x29, 0xb4, 0x88, 0xf1, 0xe0, 0xb8, 0x1f,
0xef, 0xee, 0x3d, 0xee, 0xde, 0x1, 0x42, 0xbd, 0xcc, 0x34, 0xab, 0x6b,
0xc, 0xd0, 0x74, 0xdb, 0x4c, 0x25, 0xe2, 0x62, 0x26, 0xbb, 0x2a, 0x6,
0x5e, 0x21, 0x20, 0x8c, 0x10, 0xfa, 0x31, 0x2d, 0x33, 0xcb, 0x98, 0x93,
0xa4, 0x24, 0x3c, 0xc7, 0xd7, 0x3d, 0x7c, 0x7c, 0xbd, 0x8b, 0xf1, 0x2c,
0xef, 0x73, 0x7f, 0x8e, 0x3e, 0x35, 0x67, 0x31, 0xc0, 0x27, 0x12, 0xcf,
0x32, 0xc3, 0xb4, 0x89, 0x37, 0x88, 0xa7, 0x36, 0x6d, 0x83, 0xf3, 0x3e,
0x71, 0x84, 0x15, 0x65, 0x95, 0xf8, 0x9c, 0x78, 0xd4, 0xa4, 0xb, 0x12,
0x3f, 0x72, 0x5d, 0x71, 0xf9, 0x8d, 0x73, 0xa1, 0xc9, 0x2, 0xcf, 0x8c,
0x98, 0xe9, 0xd4, 0x3c, 0x71, 0x84, 0x58, 0x2c, 0x74, 0xb0, 0xd2, 0xc1,
0xac, 0x68, 0x6a, 0xc4, 0x93, 0xc4, 0x51, 0x55, 0xd3, 0x29, 0x5f, 0xc8,
0xb8, 0xac, 0x72, 0xde, 0xe2, 0xac, 0x95, 0xab, 0xac, 0x75, 0x4f, 0xfe,
0xc2, 0x60, 0x4e, 0x5f, 0x59, 0xe6, 0x3a, 0xcd, 0x21, 0x24, 0xb0, 0x88,
0x25, 0x48, 0x10, 0xa1, 0xa0, 0x8a, 0x12, 0xca, 0xb0, 0x11, 0xa3, 0x55,
0x27, 0xc5, 0x42, 0x8a, 0xf6, 0xe3, 0x1e, 0xfe, 0xc1, 0xa6, 0x5f, 0x22,
0x97, 0x42, 0xae, 0x12, 0x18, 0x39, 0x16, 0x50, 0x81, 0x6, 0xb9, 0xe9,
0x7, 0xff, 0x83, 0xdf, 0xdd, 0x5a, 0xf9, 0x89, 0x71, 0x37, 0x29, 0x18,
0x7, 0xba, 0x5f, 0x1c, 0xe7, 0x63, 0x18, 0x8, 0xec, 0x2, 0x8d, 0x9a,
0xe3, 0x7c, 0x1f, 0x3b, 0x4e, 0xe3, 0x4, 0xf0, 0x3f, 0x3, 0x57, 0x7a,
0xdb, 0x5f, 0xa9, 0x3, 0x33, 0x9f, 0xa4, 0xd7, 0xda, 0x5a, 0xf4, 0x8,
0x8, 0x6d, 0x3, 0x17, 0xd7, 0x6d, 0x4d, 0xd9, 0x3, 0x2e, 0x77, 0x80,
0x81, 0x27, 0x43, 0x36, 0xe5, 0xa6, 0xe4, 0xa7, 0x29, 0xe4, 0xf3, 0xc0,
0xfb, 0x19, 0x7d, 0x53, 0x16, 0x8, 0xdf, 0x2, 0xbd, 0x6b, 0x6e, 0x6f,
0xad, 0x7d, 0x9c, 0x3e, 0x0, 0x69, 0xea, 0x2a, 0x79, 0x3, 0x1c, 0x1c,
0x2, 0x23, 0x5, 0xca, 0x5e, 0xf7, 0x78, 0x77, 0x4f, 0x67, 0x6f, 0xff,
0x9e, 0x69, 0xf5, 0xf7, 0x3, 0x8e, 0x4a, 0x72, 0xb2, 0x26, 0x87, 0xf8,
0xc8, 0x0, 0x0, 0x0, 0x6, 0x62, 0x4b, 0x47, 0x44, 0x0, 0xff, 0x0,
0xff, 0x0, 0xff, 0xa0, 0xbd, 0xa7, 0x93, 0x0, 0x0, 0x0, 0x9, 0x70,
0x48, 0x59, 0x73, 0x0, 0x0, 0x2e, 0x23, 0x0, 0x0, 0x2e, 0x23, 0x1,
0x78, 0xa5, 0x3f, 0x76, 0x0, 0x0, 0x0, 0x7, 0x74, 0x49, 0x4d, 0x45,
0x7, 0xe7, 0x2, 0x13, 0xf, 0x1a, 0x1f, 0xc9, 0x80, 0x9a, 0x98, 0x0,
0x0, 0x0, 0x19, 0x74, 0x45, 0x58, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x65,
0x6e, 0x74, 0x0, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x77,
0x69, 0x74, 0x68, 0x20, 0x47, 0x49, 0x4d, 0x50, 0x57, 0x81, 0xe, 0x17,
0x0, 0x0, 0x15, 0xeb, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0xed, 0x9d,
0x79, 0x98, 0x5c, 0x55, 0x95, 0xc0, 0x7f, 0xd5, 0xdd, 0x9, 0x9, 0x21,
0x10, 0x8, 0x61, 0x93, 0x2d, 0x12, 0x82, 0x83, 0xe, 0x6, 0x88, 0x4,
0x8, 0x89, 0xca, 0xa6, 0xa0, 0x80, 0x8c, 0xa2, 0x84, 0x9d, 0x18, 0x70,
0x86, 0x0, 0xe, 0x3a, 0xb2, 0x38, 0x22, 0x8b, 0xcc, 0x27, 0xfb, 0x26,
0x28, 0x4b, 0xc, 0x60, 0x14, 0x44, 0x12, 0x2, 0xc3, 0x30, 0x8, 0xe,
0x61, 0x93, 0xdd, 0x4, 0x8, 0x10, 0x89, 0x81, 0x90, 0x90, 0x34, 0xc1,
0x90, 0x85, 0xac, 0x9d, 0xf4, 0x52, 0xe5, 0x1f, 0xe7, 0xd4, 0xf4, 0xad,
0xd7, 0xef, 0xbe, 0x7a, 0xaf, 0xea, 0xd5, 0xd2, 0xdd, 0xe7, 0xf7, 0x7d,
0xef, 0xeb, 0xaf, 0xeb, 0xd5, 0xab, 0xfb, 0xde, 0x7d, 0xe7, 0x9e, 0x7b,
0xee, 0xb9, 0xe7, 0x9e, 0xb, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, 0x86,
0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, 0x86,
0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, 0x86,
0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, 0x86,
0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, 0x86,
0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, 0x75, 0xc6, 0x66, 0xc0,
0xb5, 0xc0, 0x42, 0xa0, 0x15, 0x58, 0x2, 0xdc, 0x1, 0x6c, 0x6b, 0x55,
0x63, 0x24, 0x60, 0xa, 0x90, 0xb, 0x39, 0x9e, 0x1, 0x1a, 0xac, 0x7a,
0xea, 0x97, 0x5f, 0x7a, 0x5e, 0xdc, 0xe3, 0xf6, 0xe2, 0x8c, 0xee, 0xae,
0x0, 0x92, 0x14, 0x3c, 0x4c, 0x7b, 0xc0, 0x9c, 0xe7, 0xe8, 0x0, 0x4e,
0x2e, 0xa1, 0xfc, 0x67, 0x42, 0x7e, 0x6b, 0x23, 0xb0, 0x53, 0x1d, 0xbc,
0xb4, 0x26, 0xe0, 0xcb, 0x9e, 0x73, 0x63, 0x80, 0x1, 0x15, 0x2e, 0x7f,
0x67, 0xe0, 0x3c, 0x60, 0x3a, 0x30, 0x17, 0x58, 0x5, 0xb4, 0x3, 0x6b,
0x81, 0x66, 0xe0, 0x65, 0x60, 0x12, 0xf0, 0x3d, 0x60, 0x17, 0x6b, 0x63,
0x46, 0x25, 0x29, 0xa6, 0x0, 0x72, 0xc0, 0xfb, 0xc0, 0x16, 0x3d, 0x4c,
0x1, 0xfc, 0xd5, 0xf3, 0xac, 0xeb, 0x75, 0x78, 0x50, 0x9, 0xb6, 0x7,
0xee, 0x89, 0x51, 0xdf, 0xee, 0x91, 0x5, 0xde, 0x0, 0x7e, 0xa4, 0xd7,
0x1b, 0x66, 0x1, 0xa4, 0x6a, 0x1, 0xc4, 0x61, 0x17, 0xe0, 0x7, 0x3d,
0xe8, 0xa5, 0xb5, 0x3, 0x4f, 0x7a, 0xce, 0x3d, 0xab, 0x4a, 0x20, 0x6d,
0xf6, 0x7, 0x66, 0x1, 0xa7, 0x0, 0x7d, 0x12, 0x5c, 0x97, 0x1, 0xf6,
0x2, 0xae, 0x56, 0x9f, 0x45, 0xc6, 0xda, 0x9c, 0x51, 0x6d, 0xb, 0x20,
0xa7, 0x66, 0xea, 0xd0, 0x1e, 0x62, 0x1, 0xa0, 0x66, 0xfe, 0xd5, 0x88,
0x13, 0xb0, 0xd, 0xf8, 0x8, 0xb8, 0x1d, 0x18, 0x52, 0x81, 0xb2, 0x86,
0x3, 0x4b, 0x13, 0xf4, 0xfa, 0x61, 0x47, 0x3b, 0x30, 0xd6, 0xc4, 0xd5,
0x2c, 0x80, 0x5a, 0x29, 0x80, 0x1c, 0xf0, 0xbb, 0x98, 0x3d, 0x50, 0x77,
0x50, 0x0, 0xd5, 0xb4, 0xc6, 0xfe, 0xb7, 0xcc, 0xc6, 0x9f, 0x3, 0xfe,
0x2, 0x34, 0x5a, 0x7b, 0x33, 0x5, 0x10, 0x77, 0x8c, 0x5b, 0x9, 0xbe,
0xd, 0xdc, 0x6, 0x3c, 0x67, 0xef, 0x3d, 0x36, 0x9f, 0x5, 0xe, 0xf5,
0x9c, 0x6b, 0x1, 0x7e, 0x5, 0x3c, 0x6, 0x2c, 0x3, 0x36, 0x57, 0x5,
0x39, 0xa, 0x38, 0x5c, 0x2d, 0x87, 0x8c, 0xa, 0xd4, 0xed, 0x88, 0x43,
0xd6, 0x30, 0x6a, 0x66, 0x1, 0xe4, 0x80, 0x17, 0x63, 0x28, 0x18, 0xb3,
0x0, 0x3a, 0x39, 0xcf, 0x53, 0x8f, 0x6d, 0xc0, 0x91, 0x45, 0xae, 0xdd,
0x1b, 0xb8, 0x19, 0x78, 0x87, 0x64, 0x4e, 0x58, 0xa3, 0x97, 0x5b, 0x0,
0xe5, 0x16, 0x9c, 0x3, 0x96, 0x7b, 0xce, 0xed, 0x7, 0x9c, 0x58, 0xc5,
0xca, 0x9c, 0x1e, 0x18, 0x76, 0xc, 0xd5, 0xb1, 0xfb, 0x2c, 0xf5, 0x4b,
0xb4, 0x1, 0x1f, 0x3, 0x33, 0x80, 0xef, 0x6b, 0x2f, 0x5a, 0x4f, 0x2f,
0xee, 0x9f, 0x3c, 0x9f, 0xcf, 0x44, 0x62, 0xe, 0xa2, 0x78, 0xd, 0x38,
0x57, 0x7f, 0x63, 0x55, 0x82, 0x32, 0xf7, 0xd4, 0xeb, 0x7e, 0x83, 0xcc,
0x20, 0x2c, 0x51, 0x6b, 0xa3, 0x4d, 0xdf, 0xeb, 0x6c, 0x7d, 0xfe, 0x53,
0x80, 0x81, 0x65, 0xbc, 0x9f, 0x2c, 0x30, 0xc1, 0x39, 0xdf, 0x8, 0x1c,
0x81, 0xc4, 0x58, 0xcc, 0x56, 0xab, 0xa6, 0x4d, 0xef, 0xfd, 0x2d, 0xe0,
0x6e, 0xe0, 0x18, 0xcf, 0x50, 0x66, 0x3b, 0xe0, 0x6c, 0xe0, 0x11, 0x60,
0x3e, 0xb0, 0x4e, 0x3b, 0x8c, 0x66, 0xe0, 0x9, 0xc4, 0x9, 0x3d, 0xb8,
0xe, 0xe5, 0x28, 0x2d, 0x46, 0x2, 0x3f, 0x57, 0xf9, 0xcb, 0xbf, 0xaf,
0x56, 0xbd, 0xa7, 0x57, 0xb5, 0x4e, 0x8f, 0xa8, 0x84, 0x75, 0x1f, 0x66,
0x1, 0x64, 0x81, 0xff, 0x0, 0x56, 0x7b, 0x1a, 0xc9, 0x2, 0x60, 0x50,
0x5, 0x2c, 0x80, 0xb0, 0x17, 0xb7, 0x14, 0xe8, 0xaf, 0x2f, 0xef, 0x6c,
0x15, 0x8c, 0x28, 0xb, 0xa5, 0x39, 0x46, 0xcf, 0x5a, 0x4d, 0x5, 0xf0,
0x7b, 0x4f, 0x39, 0x8f, 0x92, 0xae, 0x47, 0x7f, 0x53, 0x60, 0x22, 0xf0,
0xa6, 0xbe, 0xbf, 0xb8, 0x16, 0xdd, 0xa, 0xe0, 0x87, 0x31, 0x5, 0x2b,
0xac, 0xce, 0xa6, 0xea, 0x73, 0xec, 0xa3, 0x8d, 0xbe, 0x58, 0xd9, 0xf9,
0x69, 0xcd, 0x7f, 0x76, 0x94, 0xc6, 0x4f, 0x91, 0x99, 0x97, 0x62, 0xf7,
0xba, 0x1c, 0x38, 0xbe, 0xc4, 0xfb, 0xac, 0x57, 0x39, 0xda, 0x1b, 0x78,
0x3a, 0xe6, 0x3b, 0xcb, 0x22, 0x71, 0x23, 0x47, 0x57, 0x63, 0x8, 0x70,
0x12, 0xf0, 0x33, 0xcf, 0x8d, 0x65, 0xf5, 0x5c, 0x35, 0x14, 0x40, 0x3b,
0x70, 0x10, 0x70, 0xb9, 0x8e, 0x81, 0xe3, 0x8, 0xf5, 0x46, 0xe0, 0x84,
0x3a, 0x51, 0x0, 0x77, 0x79, 0xca, 0xf9, 0x8, 0xd8, 0x2a, 0xa5, 0x32,
0x1a, 0x81, 0xe7, 0xcb, 0x70, 0x30, 0x66, 0xb5, 0x21, 0xf7, 0x2d, 0xb1,
0x61, 0x8d, 0x1, 0x56, 0x26, 0x2c, 0xf3, 0x23, 0x60, 0x77, 0xe0, 0xd6,
0x84, 0xa, 0xab, 0x2d, 0x86, 0x12, 0xe8, 0x2e, 0x72, 0x34, 0x1, 0xd8,
0x50, 0xc2, 0xfb, 0xea, 0x0, 0xae, 0x49, 0x4b, 0x4e, 0x7d, 0xa, 0xe0,
0x5f, 0xb5, 0x97, 0x5f, 0xe0, 0xb9, 0x89, 0xd5, 0xc0, 0x6e, 0x55, 0x50,
0x0, 0x39, 0xed, 0x31, 0xda, 0x13, 0x56, 0xd2, 0x5a, 0xed, 0x95, 0x6a,
0xad, 0x0, 0xfe, 0x33, 0xa2, 0xd1, 0x3d, 0x46, 0x7a, 0xd3, 0x8e, 0x13,
0x13, 0x36, 0xa4, 0xb0, 0xfb, 0xb9, 0xbc, 0x44, 0x61, 0xaf, 0xf6, 0xb1,
0xa4, 0x88, 0xf2, 0xec, 0xe, 0x72, 0x74, 0x4a, 0x9, 0xf7, 0x12, 0x7c,
0x5f, 0x57, 0x54, 0xca, 0x7, 0x0, 0x12, 0xd, 0xf7, 0x9, 0x70, 0x89,
0x16, 0x16, 0x64, 0xa0, 0x5a, 0x1, 0xd5, 0x8, 0x4c, 0xd9, 0x8b, 0xe4,
0x53, 0x60, 0x3, 0x80, 0x1b, 0xa8, 0xfd, 0xd4, 0xd9, 0x93, 0x84, 0x7b,
0xef, 0x33, 0xc0, 0x57, 0x81, 0xb7, 0xd5, 0x24, 0xdd, 0xa4, 0xcc, 0x72,
0xee, 0x41, 0x62, 0x1a, 0x4a, 0x25, 0xa3, 0x63, 0xdf, 0xee, 0x10, 0x6d,
0xb8, 0x2d, 0x70, 0x5c, 0x37, 0x96, 0xa3, 0xcf, 0x0, 0xb7, 0x94, 0xf9,
0x9b, 0x19, 0xe0, 0x7c, 0x60, 0x74, 0xa5, 0x14, 0x40, 0x3e, 0x1e, 0xfe,
0x77, 0xc0, 0x4b, 0x9e, 0xef, 0x1c, 0xa7, 0xe6, 0x5f, 0xb5, 0xf8, 0x8,
0xb8, 0x8, 0x9, 0x88, 0x19, 0x9, 0x7c, 0xc7, 0xb1, 0x34, 0xc2, 0x18,
0xd, 0x1c, 0x50, 0x63, 0x61, 0x7d, 0x15, 0xf8, 0x73, 0xc4, 0xf9, 0x21,
0xc0, 0x2f, 0x80, 0x39, 0x6a, 0x12, 0x96, 0xaa, 0x8, 0xd6, 0x2, 0xd7,
0x3b, 0x3d, 0xc4, 0x5c, 0xe0, 0x26, 0xe0, 0x34, 0xe0, 0x4b, 0x3a, 0xd6,
0x1c, 0xad, 0xe3, 0xfd, 0xc5, 0x9e, 0xdf, 0x18, 0x8, 0x7c, 0xad, 0x8c,
0x67, 0x5d, 0xf, 0x5c, 0x7, 0x1c, 0xa2, 0xbd, 0xe6, 0xf1, 0xea, 0xc8,
0x8c, 0xc3, 0x5f, 0xd5, 0xea, 0x1c, 0x85, 0x44, 0x4d, 0x5e, 0xac, 0x56,
0xa6, 0x4f, 0xf8, 0xf, 0xef, 0xa6, 0x72, 0x94, 0x1, 0xae, 0xf4, 0x38,
0x5f, 0x73, 0x2a, 0x2f, 0x67, 0x6a, 0x3d, 0x8c, 0x4, 0xbe, 0x5, 0xdc,
0xe7, 0xe9, 0x44, 0xfa, 0x0, 0x3f, 0x2e, 0xb7, 0xbd, 0xfb, 0x86, 0x0,
0x57, 0x3b, 0xdf, 0x39, 0x8, 0xff, 0x54, 0xe1, 0x4b, 0x74, 0xd, 0x6d,
0x4d, 0x7b, 0x8, 0x90, 0x3, 0x3e, 0x4, 0x76, 0xf5, 0x8c, 0x7f, 0xa7,
0x44, 0x98, 0xbf, 0x37, 0xd7, 0x78, 0x8, 0x90, 0xef, 0x79, 0x56, 0xc7,
0x34, 0xed, 0x16, 0xaa, 0x39, 0x5f, 0x8a, 0x22, 0x18, 0xa0, 0xde, 0xff,
0x3d, 0x8a, 0x7c, 0x6f, 0x57, 0x75, 0xa8, 0x85, 0x95, 0x7f, 0x47, 0x89,
0xef, 0x67, 0x3, 0x70, 0x70, 0xc8, 0x35, 0x83, 0x90, 0x69, 0xcc, 0xa8,
0x67, 0x7e, 0xc1, 0xd3, 0x20, 0x8e, 0x8a, 0x30, 0x93, 0xe7, 0x44, 0x38,
0x2e, 0xeb, 0x59, 0x8e, 0xf6, 0xd4, 0x76, 0x10, 0x66, 0xd2, 0xdf, 0x16,
0x61, 0x15, 0x9c, 0xe1, 0xf1, 0x5d, 0xac, 0x7, 0x3e, 0x55, 0x9, 0x5,
0x70, 0x6b, 0x40, 0x6b, 0x4d, 0x89, 0x70, 0x48, 0x9c, 0x1e, 0xa2, 0x0,
0x9e, 0x4e, 0x51, 0x1, 0x64, 0xb5, 0xe7, 0xf2, 0xb1, 0x9d, 0x7a, 0xb3,
0xc3, 0xae, 0x7d, 0xdd, 0x23, 0x28, 0xd5, 0x9e, 0xbf, 0x3d, 0x46, 0x7b,
0xe9, 0xb8, 0x63, 0xbc, 0x79, 0xc0, 0xd7, 0x2b, 0x68, 0x99, 0x4c, 0x2b,
0x61, 0x76, 0x22, 0xaa, 0x61, 0x4d, 0x29, 0xd1, 0x3f, 0xd1, 0x16, 0xd1,
0xbb, 0x36, 0x22, 0x2b, 0x23, 0x7d, 0x33, 0x2, 0x7d, 0xbb, 0xa1, 0x1c,
0x5d, 0x14, 0x31, 0xeb, 0x30, 0xb0, 0x88, 0x63, 0xfd, 0x39, 0xcf, 0x33,
0x1d, 0x5b, 0xc9, 0x21, 0x40, 0xde, 0x34, 0xb9, 0x98, 0xf0, 0xb9, 0xe8,
0x6, 0xe0, 0x52, 0xa, 0xa7, 0x5, 0xf3, 0x8d, 0x3d, 0x2d, 0xda, 0x80,
0x87, 0x8a, 0x98, 0x74, 0x4f, 0x78, 0xce, 0xed, 0x8e, 0x4c, 0x91, 0xd5,
0x9a, 0x87, 0xb5, 0x87, 0x7c, 0x2f, 0x81, 0x62, 0x7e, 0x18, 0xf8, 0x35,
0x95, 0x59, 0x9e, 0xbc, 0xc2, 0xf3, 0x79, 0x29, 0x96, 0x47, 0x16, 0xb8,
0x37, 0xe2, 0xfc, 0xf3, 0xf8, 0xa3, 0x18, 0xe7, 0xa8, 0xd9, 0x1b, 0x46,
0x47, 0xc4, 0xf0, 0xa9, 0x5f, 0x9, 0xfe, 0xa7, 0x5a, 0xcb, 0x51, 0x46,
0xad, 0xe9, 0x30, 0x9e, 0x1, 0xd6, 0x14, 0xa9, 0xe3, 0xa7, 0x3c, 0xbf,
0x39, 0xbc, 0x12, 0xa, 0x20, 0xf8, 0xb0, 0xb, 0xd4, 0x19, 0x12, 0x36,
0x4e, 0xda, 0x9, 0x59, 0xae, 0xea, 0x2a, 0x80, 0x96, 0x14, 0x85, 0x75,
0x19, 0xb0, 0xa8, 0xc8, 0x77, 0x5e, 0xf6, 0x7c, 0xde, 0x87, 0xf2, 0xa3,
0xf, 0x77, 0x6, 0x3e, 0x17, 0xf3, 0xd8, 0x2e, 0xe2, 0x77, 0x5e, 0x1,
0x46, 0x0, 0x57, 0x11, 0x6f, 0xc5, 0x61, 0x3, 0x30, 0x1e, 0x9, 0x8e,
0x89, 0xbb, 0x44, 0x79, 0x4, 0xf0, 0x13, 0x55, 0x1e, 0x73, 0xb4, 0xa7,
0x6c, 0xd, 0xe9, 0x81, 0x27, 0x44, 0x8, 0x69, 0xd2, 0x86, 0xd5, 0x1a,
0xd1, 0x88, 0x41, 0xbc, 0xf6, 0x3e, 0x5, 0xf0, 0x92, 0x9a, 0xf9, 0x3e,
0x16, 0x45, 0xd4, 0x4d, 0x77, 0x93, 0xa3, 0x26, 0x75, 0x0, 0x86, 0x31,
0x2e, 0x86, 0x55, 0x78, 0xb1, 0xe7, 0xda, 0xad, 0xc2, 0xa, 0x4a, 0xc3,
0x59, 0x11, 0xe4, 0x7a, 0x64, 0xfa, 0xe2, 0xd3, 0x21, 0xdf, 0x3d, 0x7,
0x99, 0xf3, 0x7e, 0xd7, 0x71, 0x8, 0xa5, 0xe9, 0xfc, 0x2b, 0x16, 0x7,
0xbf, 0x40, 0x2b, 0x29, 0x13, 0x22, 0x28, 0xe5, 0xce, 0xb7, 0xdf, 0xa2,
0xe3, 0xd1, 0x38, 0xdc, 0x88, 0x84, 0xff, 0x46, 0x39, 0xeb, 0x2e, 0xd4,
0x21, 0xd6, 0xf9, 0xda, 0xc0, 0x8b, 0xf5, 0x2c, 0x5f, 0x52, 0x87, 0xde,
0x84, 0x22, 0x8e, 0xaa, 0x6b, 0xd5, 0x79, 0x54, 0xed, 0x25, 0xc3, 0x4b,
0x89, 0x8e, 0x54, 0xdc, 0x10, 0x71, 0xdf, 0xef, 0x16, 0xf9, 0xed, 0x96,
0x1e, 0x24, 0x47, 0x8d, 0x54, 0x26, 0xe5, 0x5c, 0xdf, 0x4a, 0x58, 0x0,
0x61, 0xac, 0x51, 0x2d, 0xe4, 0x9b, 0x16, 0xbc, 0xc2, 0xa9, 0xb8, 0x75,
0x29, 0x96, 0xbb, 0x36, 0x42, 0x80, 0x8a, 0x7d, 0x27, 0xa3, 0xe6, 0x62,
0xbd, 0xb1, 0x48, 0x95, 0xe6, 0x30, 0x55, 0xac, 0xeb, 0x8a, 0x28, 0xe3,
0x53, 0x22, 0xc6, 0xca, 0xe3, 0x91, 0x10, 0xd6, 0xfd, 0xa9, 0x4d, 0xbe,
0x80, 0x8f, 0x3d, 0x32, 0x11, 0x87, 0x55, 0x55, 0xbc, 0xcf, 0x5a, 0xcb,
0xd1, 0xa6, 0x54, 0x6e, 0xa1, 0x5e, 0x55, 0x14, 0x0, 0xc0, 0xfd, 0x3a,
0xa6, 0xb, 0xe3, 0x9b, 0xc0, 0x17, 0x2b, 0xa0, 0xb9, 0xfb, 0xd4, 0xf8,
0x99, 0x2b, 0xc9, 0x12, 0x75, 0x4c, 0xed, 0x81, 0xc4, 0xee, 0x67, 0x23,
0xcc, 0xc7, 0x53, 0x43, 0x3e, 0xdf, 0x57, 0xad, 0x89, 0xbe, 0x35, 0x7c,
0x86, 0xd, 0x31, 0x1a, 0x96, 0x8f, 0x8d, 0x55, 0xbc, 0xcf, 0x5a, 0xcb,
0x51, 0xd5, 0x64, 0xb4, 0x92, 0x5, 0x75, 0xa8, 0xe9, 0xda, 0xe6, 0x11,
0xd2, 0xab, 0xb4, 0xa2, 0x37, 0xa4, 0x58, 0xe6, 0x66, 0x31, 0x9e, 0x69,
0xa0, 0xa7, 0xf7, 0x4b, 0xdb, 0x1f, 0x51, 0x29, 0x9a, 0xb5, 0x81, 0x9f,
0x19, 0x31, 0x26, 0xde, 0x8f, 0xc2, 0x69, 0xa2, 0x8c, 0xe, 0x27, 0x7c,
0x3d, 0xd3, 0xdf, 0x11, 0xaf, 0xf3, 0x48, 0xc4, 0x49, 0xdb, 0xe8, 0x8c,
0xf1, 0x27, 0xa5, 0x2c, 0x13, 0xdd, 0x81, 0x5a, 0xcb, 0x51, 0x4b, 0x84,
0x82, 0x3f, 0xdf, 0x79, 0x37, 0x49, 0x8f, 0xf3, 0xaa, 0xad, 0x69, 0x5e,
0x6, 0x7e, 0xeb, 0x39, 0x37, 0x52, 0xcd, 0xd5, 0x34, 0x15, 0xc0, 0x8e,
0x14, 0x8f, 0x9a, 0x1a, 0xea, 0x79, 0x71, 0x59, 0x75, 0xfe, 0x74, 0x17,
0x26, 0x23, 0x81, 0x1f, 0x61, 0x6c, 0x1f, 0xa8, 0x87, 0xfe, 0x48, 0xd0,
0x8d, 0x6f, 0x5c, 0x3e, 0x6, 0x9, 0x3a, 0x99, 0xa9, 0xa6, 0x76, 0xb6,
0x88, 0x8f, 0xa7, 0xa7, 0x53, 0x6b, 0x39, 0x6a, 0x8d, 0xf8, 0x8d, 0xe1,
0xdd, 0xc9, 0xd4, 0xc8, 0x21, 0x53, 0x7f, 0x2b, 0x3d, 0x65, 0x5f, 0xa2,
0xc2, 0x99, 0x16, 0x3, 0x91, 0x0, 0x8a, 0xa8, 0x31, 0xf2, 0x81, 0x11,
0x26, 0xe6, 0xe2, 0x32, 0xcb, 0x3f, 0xba, 0x1c, 0x6d, 0x5c, 0x42, 0xdd,
0xbe, 0xe8, 0x39, 0xd7, 0x18, 0x22, 0xd0, 0xbe, 0xd9, 0x81, 0xbb, 0x90,
0x58, 0x2, 0x1f, 0x83, 0x7b, 0xa1, 0x2, 0xa8, 0xb5, 0x1c, 0xb5, 0x23,
0x41, 0x51, 0x61, 0x1c, 0x9a, 0x66, 0x9b, 0xa9, 0xc6, 0x58, 0xe3, 0x3,
0xc4, 0xeb, 0x9c, 0xf3, 0x68, 0xda, 0x9, 0x29, 0x96, 0xd5, 0x84, 0x84,
0x44, 0xfa, 0xd8, 0x81, 0xf0, 0x28, 0x34, 0x90, 0xa9, 0xb0, 0x5a, 0xd,
0x1, 0x36, 0x1, 0xfe, 0x1d, 0xd8, 0x26, 0xe1, 0x75, 0xbe, 0x54, 0xe0,
0xcb, 0x3, 0xbd, 0xf8, 0x80, 0x88, 0x9e, 0x3c, 0x6a, 0x5d, 0xc0, 0x10,
0xfc, 0xf3, 0xd1, 0x3d, 0x99, 0x5a, 0xcb, 0x51, 0x3e, 0x40, 0xc8, 0xf7,
0xce, 0x27, 0x74, 0x27, 0x5, 0x0, 0x12, 0x1e, 0xf9, 0xae, 0x47, 0x93,
0xe, 0x4a, 0xb9, 0xac, 0x7f, 0x43, 0xe6, 0xd9, 0xc3, 0x7a, 0xc5, 0xab,
0xf1, 0x47, 0x51, 0xcd, 0xa8, 0xe1, 0x18, 0xb5, 0x9, 0x49, 0xf2, 0xb0,
0x10, 0x78, 0x0, 0x89, 0x6, 0x2c, 0x16, 0x68, 0xb3, 0x1b, 0x5d, 0x23,
0x2b, 0xf3, 0xbc, 0x19, 0xf0, 0xf, 0xac, 0xc7, 0xef, 0x7c, 0x3b, 0xc0,
0xa3, 0x1c, 0x6, 0x21, 0xb, 0x87, 0xb6, 0xa6, 0x77, 0x52, 0x6b, 0x39,
0x9a, 0xa6, 0x43, 0x81, 0xb0, 0x36, 0x73, 0x15, 0x12, 0xf, 0x50, 0x8c,
0x3e, 0x48, 0xae, 0x82, 0xff, 0xf6, 0x59, 0x2c, 0x4d, 0x55, 0xaa, 0xcc,
0xb5, 0xc8, 0x72, 0xd7, 0xdf, 0x57, 0x41, 0xe9, 0x6c, 0x89, 0xa4, 0xec,
0xfe, 0x5, 0xb2, 0xc2, 0x6e, 0x35, 0x12, 0x8f, 0x70, 0x96, 0x6a, 0xed,
0x30, 0x61, 0x6f, 0xd3, 0x7b, 0xab, 0x35, 0xfd, 0xb4, 0xe7, 0xf9, 0x96,
0x8e, 0xc5, 0xff, 0x8c, 0x84, 0x4a, 0xcf, 0x43, 0xa6, 0xd0, 0xd6, 0x6a,
0x83, 0x1c, 0xad, 0xcf, 0xb3, 0x8d, 0x67, 0xc, 0x3a, 0x35, 0xf0, 0xd9,
0x87, 0xea, 0x6b, 0x9, 0xf3, 0x6e, 0x9f, 0xa8, 0xca, 0xe2, 0x3e, 0xf5,
0x7, 0xc, 0x56, 0x9f, 0xc0, 0x99, 0xda, 0xd3, 0xf5, 0x56, 0x6a, 0x2d,
0x47, 0x73, 0x81, 0x7, 0x9, 0xcf, 0x69, 0xd0, 0x1f, 0x59, 0x7c, 0x37,
0x1e, 0x99, 0x6d, 0x9b, 0xa3, 0xb2, 0xb1, 0x89, 0xca, 0xc4, 0xee, 0xaa,
0xd8, 0xf, 0xd3, 0xe7, 0xe8, 0x50, 0x2b, 0xbc, 0x2c, 0x7c, 0x6b, 0x1,
0x1e, 0x88, 0x79, 0x7d, 0xa3, 0x56, 0x64, 0xdc, 0x4, 0xb, 0xa5, 0x2e,
0x6, 0x2a, 0xe5, 0x98, 0x46, 0xf2, 0xb8, 0xf6, 0x34, 0xd7, 0x2, 0xc,
0x50, 0xb3, 0x31, 0x8d, 0x67, 0x79, 0x2d, 0xc4, 0x7a, 0x68, 0xd0, 0x9e,
0x29, 0xcd, 0x3a, 0x7b, 0x32, 0xe2, 0xf9, 0x4b, 0xad, 0xb3, 0x2d, 0x22,
0xea, 0xe1, 0xd4, 0x22, 0x75, 0xf8, 0x3d, 0xcf, 0x75, 0x2d, 0x11, 0xd6,
0x54, 0xbd, 0xcb, 0xd1, 0x8e, 0x48, 0x50, 0x52, 0xb9, 0xf7, 0xe5, 0x4d,
0x15, 0x5f, 0xcd, 0x39, 0xf1, 0xe, 0xe0, 0x2, 0x8f, 0x59, 0x53, 0x4b,
0x96, 0x21, 0xe1, 0xc9, 0x39, 0xba, 0x3f, 0x9f, 0x68, 0xaf, 0xb0, 0x31,
0xc4, 0x2a, 0x98, 0x44, 0xf2, 0x20, 0x9c, 0x1c, 0xb2, 0xc6, 0xe0, 0x6f,
0x18, 0xb5, 0x90, 0xa3, 0xc5, 0x48, 0xa6, 0xa1, 0xb5, 0x95, 0xba, 0xe9,
0x6a, 0x7, 0xc5, 0xcc, 0xd4, 0x71, 0x65, 0xa5, 0xb8, 0x49, 0xcd, 0xb6,
0xb8, 0xac, 0x51, 0x13, 0x6b, 0x7e, 0xf, 0x10, 0xc0, 0x7c, 0x6e, 0x3a,
0xdf, 0xba, 0xfa, 0x3f, 0x20, 0x6b, 0x5, 0x72, 0x9, 0x1a, 0xff, 0x83,
0xc8, 0xa, 0xbd, 0xe9, 0xbd, 0xac, 0x31, 0xd7, 0x93, 0x1c, 0xcd, 0x40,
0x72, 0x2f, 0x34, 0xf7, 0x4, 0x5, 0x90, 0x3, 0x2e, 0xc3, 0x9f, 0x49,
0xb8, 0x5c, 0x6, 0x6b, 0x23, 0x98, 0x1c, 0xa3, 0xb7, 0x7b, 0x7, 0x99,
0x1b, 0x7f, 0xb2, 0xe, 0x4, 0x6e, 0x3, 0x92, 0xb0, 0xe1, 0xed, 0x12,
0x7a, 0x90, 0x16, 0x24, 0x13, 0xec, 0xde, 0xf8, 0xa7, 0x5, 0x51, 0x33,
0xf0, 0x84, 0x98, 0x96, 0x40, 0xbb, 0x8e, 0x19, 0xc7, 0xa9, 0x35, 0x31,
0x9d, 0xe8, 0x85, 0x38, 0x3d, 0x8d, 0x7a, 0x93, 0xa3, 0x67, 0x81, 0xcf,
0x23, 0xeb, 0x47, 0x92, 0x5a, 0x3, 0x2b, 0xf5, 0x5d, 0xce, 0xe, 0x3b,
0xd9, 0x54, 0x83, 0xca, 0x6d, 0x46, 0xbc, 0x98, 0x57, 0x91, 0x7e, 0x90,
0xc9, 0x10, 0xc4, 0xe3, 0xfd, 0x5d, 0x64, 0x7e, 0xfb, 0xc, 0xc4, 0xfb,
0xb9, 0xa3, 0x3a, 0xc0, 0x3e, 0x46, 0xd2, 0x3b, 0xdf, 0xaf, 0xce, 0x9a,
0x7a, 0x19, 0x8e, 0x74, 0x20, 0x2b, 0x28, 0x6f, 0x40, 0x56, 0x81, 0x1d,
0x8c, 0x44, 0xf3, 0xd, 0x47, 0xa6, 0x7d, 0x36, 0x47, 0xe2, 0xc3, 0x3b,
0xd4, 0xcc, 0x5f, 0x84, 0x78, 0xfa, 0x9f, 0xd6, 0x5e, 0x3d, 0xae, 0x42,
0x5d, 0x8f, 0x38, 0xf7, 0xee, 0xd4, 0xbf, 0x63, 0xb5, 0x6e, 0xfa, 0xaa,
0x93, 0x6b, 0xbe, 0xa, 0xdb, 0x64, 0x55, 0x46, 0x79, 0x66, 0x21, 0x8b,
0x5f, 0x86, 0xf5, 0x12, 0x5, 0x50, 0x8f, 0x72, 0xb4, 0x1c, 0x89, 0x1d,
0xb9, 0x14, 0x89, 0x37, 0x39, 0x4, 0x49, 0x20, 0xb3, 0xb, 0x32, 0x23,
0xd1, 0xa8, 0x9d, 0xc1, 0x72, 0x64, 0x36, 0xe9, 0x75, 0x24, 0x9d, 0xfc,
0xc, 0xba, 0x47, 0x84, 0x6b, 0x22, 0x7c, 0xe, 0x95, 0xa7, 0xe9, 0xbe,
0xb1, 0xfe, 0x86, 0xc9, 0x51, 0xd5, 0xe9, 0x69, 0xf, 0x69, 0x3b, 0xe2,
0x1a, 0x26, 0x47, 0xbd, 0x58, 0x1, 0x18, 0x86, 0x61, 0xa, 0xc0, 0x30,
0xc, 0x53, 0x0, 0x86, 0x61, 0x98, 0x2, 0x30, 0xc, 0xc3, 0x14, 0x80,
0x61, 0x18, 0xa6, 0x0, 0xc, 0xc3, 0x30, 0x5, 0xd0, 0x95, 0x6d, 0x91,
0x20, 0x8b, 0x59, 0x48, 0x68, 0x67, 0x3b, 0x92, 0x2a, 0x6b, 0x2a, 0x92,
0x44, 0x33, 0xc8, 0x10, 0x8a, 0xef, 0xd8, 0x7a, 0x49, 0x44, 0x79, 0x9f,
0x43, 0x2, 0x7f, 0x5e, 0x43, 0x82, 0x7b, 0x3a, 0x90, 0xa8, 0xb3, 0x47,
0x2a, 0xf0, 0x5e, 0x8e, 0xd7, 0x32, 0x8a, 0x2d, 0xb4, 0x4a, 0x5a, 0x7,
0x20, 0x41, 0x28, 0x17, 0x22, 0xf9, 0x1f, 0x57, 0x6a, 0x9d, 0x2c, 0x42,
0x2, 0x64, 0xe, 0x31, 0xb1, 0x32, 0x2a, 0x41, 0x9a, 0x2b, 0xf4, 0x32,
0xc8, 0x4a, 0xb3, 0xa8, 0x6d, 0xab, 0x5b, 0xe9, 0x9a, 0x84, 0x61, 0xf,
0xfc, 0xdb, 0xa0, 0x45, 0x29, 0x80, 0x26, 0x64, 0x3d, 0x79, 0x1b, 0x95,
0x5f, 0x65, 0xb8, 0x9, 0x92, 0x8b, 0xc1, 0xdd, 0x2a, 0x2a, 0x4c, 0x1,
0x94, 0x5a, 0x7, 0xdb, 0xd1, 0x19, 0xbe, 0xec, 0xdb, 0xd, 0xea, 0xe2,
0x5e, 0x22, 0x47, 0x46, 0x37, 0xa5, 0x1f, 0x85, 0xfb, 0x13, 0x7e, 0x82,
0xec, 0xa, 0x73, 0xf, 0x92, 0x89, 0xd7, 0xdd, 0xe6, 0x7c, 0x67, 0xe7,
0xba, 0x3, 0xe9, 0xdc, 0x8f, 0x6e, 0x25, 0x70, 0x3b, 0xb2, 0x67, 0x9b,
0x7b, 0x7c, 0x3d, 0xa4, 0xa1, 0x5d, 0x47, 0xe7, 0xe6, 0x1b, 0x59, 0xed,
0x2d, 0xa7, 0x23, 0x31, 0xfa, 0x77, 0x93, 0x5e, 0x88, 0xf4, 0xae, 0xc8,
0x5e, 0x7a, 0xc1, 0x8d, 0x3e, 0xc2, 0x14, 0x40, 0xa9, 0x75, 0x70, 0x3,
0x85, 0x4b, 0x4e, 0x9f, 0x44, 0x32, 0x16, 0x2f, 0xa4, 0x70, 0x2f, 0xc0,
0x61, 0x26, 0x66, 0x46, 0x3d, 0xb3, 0xd, 0xf0, 0x16, 0x92, 0x77, 0x7f,
0xb, 0xe7, 0xf3, 0xa1, 0x48, 0x1e, 0xfe, 0x7c, 0x63, 0x3d, 0xc9, 0x39,
0x77, 0x94, 0xd3, 0xb8, 0x5e, 0x88, 0xd9, 0x63, 0xec, 0xe7, 0x58, 0xd,
0x6b, 0x80, 0x93, 0x8b, 0x5c, 0x77, 0xb2, 0xd3, 0x7b, 0x77, 0x0, 0xdf,
0xe, 0x28, 0x93, 0x5b, 0x9d, 0x7b, 0x58, 0x45, 0xe7, 0x6e, 0x32, 0x87,
0x23, 0xc9, 0x3d, 0xf2, 0xf7, 0x3d, 0xcb, 0x51, 0x56, 0xbe, 0x21, 0x40,
0xd2, 0x3a, 0xc8, 0x20, 0xb1, 0xe6, 0xf9, 0x86, 0xfe, 0x5f, 0xce, 0x35,
0x5b, 0x22, 0x6b, 0x3e, 0xf2, 0xd7, 0xc4, 0xd9, 0x49, 0xf8, 0xab, 0xce,
0xb3, 0x5e, 0x86, 0xe4, 0x48, 0xb8, 0xe, 0x49, 0x66, 0xb2, 0x11, 0x49,
0x7a, 0x71, 0x1e, 0x9d, 0xeb, 0x57, 0x4a, 0xad, 0x1b, 0xc3, 0x8, 0x25,
0x2c, 0x5f, 0x7e, 0x1f, 0xe0, 0x7d, 0x47, 0xc8, 0xbf, 0xeb, 0x9c, 0x3b,
0xdd, 0xf9, 0x7c, 0x6a, 0xcc, 0x32, 0xee, 0x70, 0x1a, 0xc5, 0xb9, 0x31,
0x7d, 0x34, 0xf, 0x39, 0xe5, 0xbc, 0x4f, 0x67, 0xa, 0xb5, 0x3, 0xe8,
0xdc, 0x3d, 0x36, 0x8b, 0xe4, 0x14, 0xc4, 0x39, 0xb7, 0x46, 0x1b, 0xc6,
0xf5, 0x3a, 0x7e, 0x6f, 0x8b, 0xe1, 0x3, 0x48, 0x5a, 0x7, 0x93, 0x9d,
0xcf, 0x7f, 0x1c, 0xb0, 0x28, 0x16, 0xd0, 0xb9, 0xa9, 0xe7, 0x88, 0x84,
0xa, 0x60, 0x26, 0xb2, 0xbf, 0x5d, 0xd8, 0x6, 0x97, 0x77, 0x6a, 0x3,
0x2f, 0xb5, 0x6e, 0xc, 0x23, 0x36, 0xc3, 0xe8, 0x74, 0xf4, 0xb5, 0x7,
0x1c, 0x61, 0xe7, 0x3b, 0xc2, 0xb7, 0x54, 0x9d, 0x65, 0xad, 0x6a, 0x32,
0x3f, 0x80, 0x6c, 0xd3, 0x15, 0x6c, 0x48, 0xf3, 0xf5, 0xfb, 0xeb, 0x90,
0x9c, 0x7e, 0xb7, 0x20, 0x19, 0x5f, 0x36, 0x22, 0x9b, 0x81, 0x5e, 0x89,
0xac, 0xfc, 0x73, 0xd9, 0x29, 0xd0, 0x9b, 0x5f, 0xab, 0x63, 0xfb, 0x57,
0x9c, 0xf2, 0x9f, 0xa2, 0x6b, 0xba, 0xaf, 0x7f, 0xa1, 0x33, 0xb1, 0xe5,
0x81, 0x31, 0x2c, 0x80, 0x52, 0xea, 0xe0, 0xb, 0x8e, 0x75, 0xb0, 0x6,
0x38, 0x1b, 0x59, 0xc1, 0xf8, 0xa0, 0xde, 0x6b, 0x16, 0xc9, 0x92, 0xd3,
0x90, 0x50, 0x1, 0xe4, 0x7b, 0xf5, 0x3f, 0xe9, 0xb0, 0xe8, 0x83, 0xc0,
0x50, 0xe3, 0xb0, 0x32, 0xeb, 0xc6, 0x30, 0x8a, 0xd2, 0x84, 0x6c, 0x9c,
0x99, 0x17, 0xa4, 0x97, 0x28, 0x4c, 0xb7, 0x7d, 0x2d, 0xc5, 0xd3, 0x30,
0xb9, 0xbd, 0xfc, 0xe, 0x4e, 0x43, 0x5a, 0x80, 0xe4, 0xfb, 0xb, 0xbb,
0xee, 0x45, 0xba, 0xee, 0xf2, 0x3b, 0xde, 0x69, 0x1c, 0xeb, 0xe9, 0x5c,
0xd3, 0x9f, 0x1f, 0xaf, 0xef, 0x51, 0xe4, 0x59, 0xc6, 0x94, 0xa8, 0x0,
0x8a, 0xd5, 0x1, 0xea, 0xe7, 0x58, 0xe1, 0x79, 0xfe, 0xdb, 0x89, 0xbf,
0x53, 0xae, 0xab, 0x0, 0xb2, 0xc0, 0x4f, 0x9d, 0x73, 0x43, 0x2, 0x7e,
0x85, 0xbb, 0x53, 0xac, 0x1b, 0xc3, 0x8, 0x35, 0xbd, 0x6f, 0x74, 0x4,
0x69, 0x35, 0xb0, 0x4f, 0xe0, 0x3b, 0x7, 0x23, 0x6b, 0xf2, 0x67, 0x22,
0x53, 0x5e, 0x93, 0xd5, 0x17, 0xe0, 0xf6, 0x62, 0xeb, 0xe9, 0xdc, 0xc8,
0x61, 0x1f, 0xa, 0x3d, 0xff, 0x59, 0xbd, 0x76, 0x32, 0xb2, 0x63, 0x6e,
0x36, 0x62, 0x78, 0xd0, 0x0, 0xfc, 0x8f, 0xc7, 0x24, 0xfe, 0x7e, 0x8c,
0xe7, 0x19, 0x5b, 0x82, 0x2, 0x88, 0x53, 0x7, 0xf9, 0xc6, 0x39, 0x2d,
0xc4, 0xd9, 0x38, 0x8f, 0xce, 0xed, 0xdf, 0x92, 0x2a, 0x80, 0xd6, 0x10,
0xc7, 0xa1, 0xeb, 0x70, 0x7c, 0xcd, 0x51, 0x44, 0xe5, 0xd6, 0x8d, 0x61,
0x14, 0x90, 0x4f, 0xbb, 0x9c, 0x75, 0x1a, 0xf1, 0xd1, 0x9, 0xae, 0x3f,
0x8a, 0xc2, 0xe9, 0xc1, 0x1f, 0xea, 0xe7, 0xa3, 0x9d, 0x46, 0x98, 0x45,
0xa6, 0x2, 0xf3, 0xde, 0xfe, 0x46, 0x3a, 0xd3, 0x75, 0xe5, 0x80, 0x3f,
0xd2, 0x75, 0x26, 0x60, 0x28, 0x5d, 0xa7, 0xe9, 0x9e, 0x21, 0x5e, 0x52,
0x97, 0xa4, 0xa, 0x20, 0x6e, 0x1d, 0xec, 0xe5, 0x98, 0xe7, 0x59, 0xe0,
0x9, 0xed, 0x9d, 0x5b, 0x1d, 0x2b, 0xe0, 0x72, 0xe2, 0xcd, 0x6a, 0xb8,
0xa, 0xa0, 0x25, 0xc4, 0x72, 0x38, 0xdb, 0x79, 0xee, 0xf, 0x2, 0x66,
0x7d, 0x39, 0x75, 0x63, 0x18, 0x5, 0xbd, 0xde, 0x75, 0x81, 0x5e, 0xef,
0xc8, 0x84, 0xbf, 0xd1, 0x88, 0x78, 0xdd, 0xf3, 0x82, 0x78, 0x43, 0x88,
0x5, 0xb0, 0x91, 0xae, 0x9b, 0x7a, 0x4c, 0x70, 0xae, 0x79, 0x23, 0x44,
0x78, 0xc7, 0x3a, 0x8e, 0xad, 0xfc, 0xf1, 0x2e, 0xe2, 0x71, 0x4f, 0x53,
0x1, 0xc4, 0xad, 0x83, 0xbe, 0x6a, 0x1, 0xe5, 0xc7, 0xeb, 0x67, 0x3b,
0xd, 0x7d, 0x84, 0xde, 0x5b, 0xfe, 0xdc, 0x29, 0x25, 0x28, 0x80, 0x60,
0xde, 0xfd, 0x73, 0x9d, 0xe7, 0x5e, 0x18, 0x50, 0x0, 0xe5, 0xd4, 0x8d,
0x61, 0xfc, 0x7f, 0xc3, 0x75, 0xa7, 0x8e, 0x96, 0x6a, 0xaf, 0x5d, 0x8a,
0xef, 0xe0, 0x75, 0x47, 0x10, 0x7f, 0xa6, 0x9f, 0x6f, 0x4d, 0xe7, 0x6,
0x1d, 0x6d, 0xc0, 0xa8, 0xc0, 0x75, 0x13, 0x9d, 0x6b, 0xfe, 0x12, 0x18,
0x6b, 0xf, 0x44, 0xa6, 0xc1, 0xf2, 0x3d, 0xad, 0x3b, 0x56, 0xbe, 0x2d,
0x46, 0xf, 0x1b, 0x57, 0x1, 0x24, 0xa9, 0x83, 0xbd, 0x1c, 0x85, 0xf6,
0x5e, 0x88, 0xa3, 0xed, 0x3b, 0xce, 0xef, 0x3c, 0x1e, 0xe3, 0x1e, 0x83,
0x43, 0x80, 0xe0, 0xa6, 0x1c, 0x37, 0x3b, 0xf5, 0x33, 0xd3, 0xa9, 0x9f,
0x72, 0xeb, 0xc6, 0x30, 0x68, 0x42, 0xd2, 0x5f, 0x67, 0x1d, 0x81, 0xde,
0xb3, 0x88, 0xb2, 0x18, 0x7, 0x6c, 0x15, 0x72, 0xee, 0x68, 0xa7, 0x61,
0x74, 0x38, 0xa6, 0x73, 0x3, 0x85, 0x53, 0x5b, 0xf, 0x39, 0xbd, 0xfc,
0x26, 0x48, 0x2e, 0xbe, 0x30, 0x27, 0x17, 0xc8, 0x54, 0x5e, 0xfe, 0xde,
0x9a, 0x91, 0xb9, 0xf8, 0x76, 0x47, 0x99, 0x7c, 0x25, 0x5, 0x5, 0x90,
0xb4, 0xe, 0x46, 0x39, 0xcf, 0xb9, 0x26, 0xc4, 0xd9, 0x76, 0xa5, 0xf3,
0x5b, 0x51, 0x7b, 0x8, 0xf8, 0x9c, 0x80, 0xd7, 0x4, 0xfc, 0xc, 0x8b,
0x9c, 0xfa, 0xb9, 0x33, 0xc5, 0xba, 0x31, 0x7a, 0x39, 0x7d, 0x91, 0x1d,
0x8c, 0xb3, 0x4e, 0xa3, 0x7d, 0x98, 0xae, 0x51, 0x7d, 0xb7, 0x21, 0xa1,
0xbd, 0xd, 0x7a, 0x4d, 0xb3, 0xf6, 0x54, 0xaf, 0xea, 0xf5, 0x93, 0x80,
0xe7, 0x1c, 0xe1, 0xcb, 0x9b, 0xf2, 0xfd, 0x2, 0x42, 0xee, 0xfa, 0x1,
0x66, 0x23, 0x49, 0x27, 0xe7, 0x38, 0xe5, 0xb7, 0x51, 0xb8, 0x89, 0x83,
0x6b, 0xde, 0x76, 0x20, 0x21, 0xbb, 0x19, 0x2d, 0x33, 0xe7, 0x34, 0xd6,
0x2d, 0xcb, 0x50, 0x0, 0xa5, 0xd4, 0xc1, 0xe6, 0x14, 0x6e, 0x5a, 0xf1,
0x9, 0x32, 0xfd, 0x39, 0x9, 0x99, 0xc9, 0x70, 0x9d, 0x9a, 0x17, 0x24,
0x1c, 0x2, 0xe4, 0xef, 0xe1, 0x29, 0xad, 0x9f, 0x5, 0xce, 0xe7, 0x6d,
0xc8, 0xac, 0x46, 0x5a, 0x75, 0x63, 0xf4, 0x72, 0x7c, 0x3b, 0x1e, 0x85,
0x1d, 0x73, 0xb4, 0xa7, 0xcc, 0x2b, 0x80, 0xa8, 0xef, 0xbe, 0x1f, 0xd2,
0x83, 0x66, 0xb4, 0x31, 0xb4, 0xe3, 0x9f, 0x3a, 0xfc, 0x89, 0x63, 0xb6,
0xba, 0xe6, 0x6d, 0xe, 0xf8, 0x3f, 0xc7, 0xf4, 0xdd, 0x11, 0xc9, 0x4e,
0x9b, 0x6f, 0x64, 0xb7, 0x47, 0x98, 0xbb, 0xc5, 0x14, 0x40, 0x29, 0x75,
0x0, 0x12, 0x67, 0xb0, 0x3e, 0xe2, 0xbb, 0x59, 0xc4, 0x43, 0xdf, 0x3f,
0xa1, 0x2, 0xf8, 0x98, 0xc2, 0x69, 0x3f, 0xf7, 0xf7, 0x6e, 0xd4, 0xe7,
0x4c, 0xab, 0x6e, 0xc, 0x53, 0x0, 0x89, 0x85, 0x3f, 0x83, 0x84, 0x9e,
0x4e, 0x45, 0x82, 0x7b, 0x5a, 0x54, 0x78, 0x57, 0x22, 0xab, 0xe2, 0x2e,
0xa0, 0x30, 0x9c, 0x36, 0xc8, 0x68, 0x64, 0x6f, 0xb7, 0xf, 0xb4, 0x41,
0x2e, 0x45, 0x36, 0x70, 0xc, 0xae, 0x9e, 0x73, 0x9d, 0x71, 0xeb, 0x42,
0xc6, 0xc5, 0x13, 0x3, 0x96, 0xc3, 0x11, 0x55, 0x56, 0x0, 0x20, 0x21,
0xb6, 0xbf, 0xd4, 0xcf, 0xd7, 0x69, 0x39, 0x4b, 0x91, 0x99, 0x8c, 0x13,
0xe8, 0x1a, 0x37, 0x10, 0x57, 0x1, 0xc, 0xd5, 0x3a, 0x5a, 0xa1, 0xf7,
0x3c, 0x1b, 0xd9, 0xfe, 0xab, 0x21, 0xe5, 0xba, 0x31, 0xc, 0xa3, 0xe,
0x70, 0x15, 0xc0, 0x7a, 0x8a, 0xef, 0x8e, 0x6c, 0xa4, 0x80, 0x2d, 0x79,
0x34, 0xea, 0x11, 0x33, 0xd7, 0x4d, 0x1, 0x18, 0x86, 0x61, 0xa, 0xc0,
0x30, 0xc, 0x53, 0x0, 0x86, 0x61, 0xd8, 0x58, 0x2b, 0x9, 0xc3, 0x10,
0xcf, 0x74, 0xb1, 0xa5, 0xa0, 0xf9, 0xe9, 0xb7, 0x75, 0x88, 0xc7, 0xb9,
0x19, 0x59, 0xc8, 0x32, 0xb, 0x99, 0x87, 0x9e, 0x63, 0x62, 0x62, 0x18,
0xdd, 0x53, 0x1, 0xc4, 0x9d, 0xda, 0x8a, 0x9a, 0xc7, 0x7e, 0x13, 0x59,
0x72, 0xda, 0x68, 0x55, 0x6a, 0x18, 0xbd, 0x4b, 0x1, 0xb8, 0x8a, 0xe0,
0x4f, 0x58, 0x44, 0x99, 0x61, 0xf4, 0x4a, 0x5, 0x90, 0x3f, 0xa6, 0x63,
0x7e, 0x13, 0xc3, 0xe8, 0xb5, 0xa, 0xa0, 0x1d, 0x49, 0x4, 0x62, 0x18,
0x3d, 0x82, 0xde, 0x9a, 0x30, 0xe1, 0x42, 0xe0, 0x51, 0xe7, 0xff, 0x3e,
0xc0, 0x60, 0x24, 0x9c, 0xf4, 0x38, 0x24, 0xa9, 0x64, 0x98, 0x83, 0xb4,
0x11, 0xc9, 0xb5, 0x37, 0xc3, 0x44, 0xc7, 0x30, 0xba, 0xaf, 0x5, 0x70,
0x62, 0xc4, 0x75, 0x19, 0x24, 0xc5, 0x75, 0xd6, 0x73, 0xed, 0xd3, 0x36,
0xc, 0x30, 0x7a, 0xa, 0x26, 0xc8, 0x5d, 0xc9, 0x21, 0x6b, 0xd9, 0x57,
0x78, 0xce, 0x6f, 0x41, 0xfc, 0xe9, 0xd3, 0x3d, 0x91, 0x4c, 0x36, 0xbf,
0x41, 0x96, 0x6, 0x2f, 0x41, 0x16, 0xe, 0xb5, 0x1, 0xcb, 0x91, 0x5,
0x2e, 0x53, 0x90, 0x8c, 0x39, 0x3, 0x13, 0xdc, 0x63, 0x70, 0x47, 0x9b,
0x2c, 0x70, 0x5a, 0xe0, 0x3b, 0x9f, 0x45, 0x56, 0x16, 0x3e, 0x8b, 0xac,
0xa5, 0xdf, 0x80, 0x4c, 0x75, 0xfe, 0xd, 0xb8, 0x17, 0x38, 0x36, 0x81,
0x5, 0x58, 0xed, 0xf2, 0xc2, 0x18, 0x9, 0xfc, 0x1c, 0x49, 0xf5, 0x95,
0xaf, 0xc7, 0x56, 0x64, 0xe1, 0xd0, 0xab, 0xc8, 0x82, 0xa4, 0x23, 0xca,
0x7c, 0xa6, 0x6f, 0x6, 0xbe, 0xd3, 0x7, 0x49, 0xff, 0xfe, 0x84, 0x96,
0x93, 0x5f, 0xab, 0x70, 0xab, 0x35, 0x93, 0x9e, 0x6b, 0x1, 0xe4, 0x87,
0x46, 0x6f, 0xe1, 0xcf, 0xda, 0x1b, 0x35, 0x25, 0xb8, 0x29, 0xb2, 0x12,
0xed, 0xcd, 0x8, 0x2b, 0x22, 0xec, 0x58, 0x81, 0xe4, 0xf, 0x6c, 0x2a,
0x41, 0x78, 0x73, 0xaa, 0x64, 0xd0, 0xa1, 0xcc, 0x7d, 0x14, 0xae, 0xad,
0xf7, 0xcd, 0x6c, 0xbc, 0x41, 0x78, 0xa2, 0xcf, 0x5a, 0x97, 0xe7, 0xb2,
0xb7, 0x5a, 0x5d, 0x71, 0xea, 0x32, 0xb, 0xcc, 0x25, 0x5e, 0xe, 0xc7,
0xb0, 0x67, 0xba, 0x26, 0xa0, 0xd0, 0xde, 0xf0, 0x94, 0x7b, 0x99, 0x35,
0xaf, 0x9e, 0xad, 0x0, 0x36, 0xa5, 0x73, 0x3d, 0x79, 0xf0, 0xb8, 0x37,
0xe2, 0xba, 0x46, 0x64, 0x39, 0x70, 0x39, 0xd3, 0x8d, 0x53, 0x9, 0xdf,
0xa0, 0xa3, 0x98, 0xf0, 0xce, 0x47, 0x36, 0xf7, 0x7c, 0x2d, 0x61, 0x99,
0x9f, 0xa8, 0xcf, 0xa3, 0x9e, 0xca, 0xcb, 0x33, 0x81, 0xe2, 0x1b, 0xb0,
0xfa, 0xf6, 0x24, 0xbc, 0xa6, 0x88, 0x85, 0x3b, 0x25, 0x62, 0x78, 0x37,
0xa, 0x58, 0x16, 0xf1, 0xfb, 0xe7, 0x58, 0xf3, 0xea, 0xd9, 0xa, 0xe0,
0x2c, 0x4f, 0x8f, 0x96, 0x45, 0x82, 0x82, 0xa2, 0x98, 0x98, 0xb0, 0xe7,
0xf, 0x2b, 0xe3, 0xf2, 0x12, 0x1a, 0x64, 0x3b, 0x85, 0x9, 0x32, 0x92,
0x1c, 0x73, 0xe9, 0xba, 0x17, 0x41, 0x2d, 0xcb, 0x43, 0x87, 0x45, 0xed,
0x65, 0xd6, 0xe3, 0x15, 0x9, 0x9f, 0x69, 0x25, 0x92, 0xc6, 0x7d, 0x71,
0x91, 0xdf, 0x1d, 0x67, 0xcd, 0xab, 0x67, 0x29, 0x80, 0xc, 0xb2, 0xad,
0xd4, 0xfe, 0x48, 0x8e, 0xb9, 0x8d, 0x9e, 0xeb, 0x16, 0x10, 0x9d, 0xe8,
0x3, 0x60, 0x33, 0xa, 0xb7, 0xd2, 0x2a, 0xe5, 0x58, 0x5, 0x6c, 0x9f,
0x50, 0x78, 0xcb, 0xd, 0x74, 0x3a, 0xb9, 0x8e, 0xca, 0xfb, 0xc, 0x92,
0x8d, 0xb8, 0xdc, 0x72, 0x5a, 0xf1, 0x27, 0x35, 0x9d, 0xe2, 0xb1, 0x1c,
0x16, 0xc4, 0xb0, 0x2e, 0x2c, 0xcf, 0x60, 0x37, 0x57, 0x0, 0xa5, 0x1c,
0x2d, 0x48, 0xd2, 0x8a, 0x38, 0x9c, 0x43, 0xe7, 0xd6, 0x58, 0xef, 0x20,
0x69, 0xac, 0x4e, 0x45, 0x36, 0xca, 0x18, 0x81, 0x6c, 0xd5, 0xf5, 0x3,
0xa, 0x13, 0x5d, 0x6, 0x1b, 0xc8, 0x84, 0x32, 0x1a, 0x64, 0x1b, 0xb2,
0xb3, 0xef, 0x31, 0x5a, 0xde, 0x18, 0x24, 0x3b, 0xf1, 0x9a, 0x88, 0x6b,
0xa6, 0xd6, 0x49, 0x79, 0x19, 0xa, 0xf7, 0xfc, 0xb, 0xd6, 0xcb, 0x2b,
0xc0, 0x19, 0xc8, 0x46, 0xab, 0xfb, 0xaa, 0xe3, 0xee, 0xde, 0x8, 0x6b,
0xe1, 0x51, 0xcf, 0x50, 0xa0, 0x54, 0xa5, 0xd6, 0x86, 0x6c, 0x89, 0x66,
0xf4, 0x12, 0x5, 0x90, 0x45, 0xd2, 0x74, 0x8f, 0x49, 0x50, 0xf6, 0x0,
0xc4, 0xfb, 0x5f, 0x6c, 0x5b, 0xaa, 0x5d, 0x91, 0xd9, 0x80, 0xb0, 0x72,
0xef, 0x28, 0xb1, 0x41, 0xb6, 0x21, 0x29, 0xb9, 0xc3, 0x38, 0x2a, 0xa2,
0xa1, 0xcc, 0x8d, 0x70, 0x40, 0x56, 0xb3, 0xbc, 0x3d, 0x3d, 0x16, 0x58,
0x3e, 0xcd, 0xb7, 0xcf, 0x1, 0x7b, 0x86, 0x67, 0xd8, 0xb6, 0x1e, 0xf8,
0x54, 0x89, 0xa, 0xe0, 0x3d, 0x64, 0x66, 0x63, 0x24, 0x92, 0x1, 0xba,
0x49, 0x7f, 0xab, 0x9f, 0x35, 0xaf, 0xde, 0xa1, 0x0, 0x3a, 0x90, 0x29,
0x9f, 0xa1, 0x15, 0xbc, 0xcf, 0x69, 0x11, 0x3d, 0x57, 0xa6, 0x84, 0x6,
0xf9, 0x50, 0xc4, 0x75, 0xd, 0xf8, 0xf7, 0x24, 0x5c, 0x8d, 0x3f, 0xd,
0x57, 0x35, 0xcb, 0xbb, 0xc8, 0xf3, 0xfd, 0x66, 0xa2, 0xa7, 0x4a, 0x1b,
0x90, 0xac, 0xcc, 0x61, 0x8a, 0xe3, 0xd8, 0x84, 0xcf, 0x94, 0x45, 0xa6,
0x15, 0x7b, 0x7c, 0x43, 0xb7, 0x38, 0x80, 0xe2, 0xf5, 0x73, 0x16, 0x32,
0x97, 0x3d, 0x5, 0xd8, 0xae, 0x2, 0x65, 0xf8, 0xe2, 0xd, 0x4a, 0xc9,
0x89, 0x97, 0x55, 0x53, 0x3c, 0x17, 0x71, 0xfe, 0x59, 0xcf, 0xb9, 0x3e,
0x14, 0x9f, 0x7d, 0xa8, 0x74, 0x79, 0x19, 0xe0, 0x20, 0xcf, 0xf7, 0x9f,
0xd1, 0x21, 0x45, 0xd4, 0xbd, 0x3c, 0xe5, 0x19, 0x52, 0xc, 0x4f, 0xf8,
0x5c, 0xf, 0x23, 0x3b, 0x1d, 0x6d, 0xe8, 0xe9, 0x2, 0x6e, 0x7b, 0xa7,
0xc5, 0xaf, 0xa7, 0x93, 0x90, 0xe9, 0xa1, 0x2f, 0x22, 0x81, 0x28, 0xc5,
0x18, 0x81, 0xec, 0x9c, 0xfb, 0x5, 0x60, 0x77, 0x64, 0xca, 0x6c, 0x20,
0x9d, 0x59, 0x85, 0x8b, 0x91, 0xd1, 0x23, 0x97, 0xe0, 0x3e, 0xdb, 0x90,
0x38, 0x85, 0x28, 0x3e, 0x48, 0xb1, 0x43, 0x48, 0xbb, 0xbc, 0x26, 0x75,
0x0, 0x86, 0x31, 0x8e, 0xd2, 0xbd, 0xef, 0x5b, 0x25, 0xf8, 0x6e, 0x3b,
0x70, 0xa9, 0x2a, 0x14, 0x4c, 0x1, 0xf4, 0x4c, 0x82, 0x6b, 0x1, 0x32,
0x3a, 0x6e, 0xff, 0x34, 0x70, 0xb8, 0x8e, 0x69, 0xc3, 0xcc, 0xbf, 0xdd,
0x81, 0x9b, 0xf4, 0xbc, 0xaf, 0x61, 0x8e, 0x46, 0xb6, 0xe, 0x1f, 0x45,
0xf5, 0x13, 0xae, 0x2c, 0x8b, 0xb0, 0x28, 0xf2, 0xb4, 0xd4, 0x71, 0x79,
0x8d, 0xaa, 0x28, 0xd3, 0x26, 0x89, 0x65, 0xd3, 0x4c, 0x2f, 0x4a, 0x2,
0xd3, 0x5b, 0x15, 0xc0, 0x62, 0x24, 0xd2, 0x2f, 0xc8, 0x4b, 0x88, 0x47,
0xf9, 0x4e, 0xe0, 0x31, 0xcf, 0x98, 0xf3, 0x68, 0xf5, 0x2f, 0xcc, 0xb,
0x39, 0x37, 0x1e, 0xf8, 0x55, 0x9, 0xa6, 0x74, 0x5a, 0xfc, 0x5d, 0xfd,
0x16, 0xdd, 0xb5, 0xbc, 0x4d, 0xeb, 0x40, 0x26, 0x97, 0xf4, 0x96, 0xde,
0xdf, 0x7c, 0x0, 0x7e, 0x9e, 0x47, 0x36, 0xa3, 0xf4, 0xf5, 0x26, 0x63,
0x43, 0x3e, 0xdf, 0x17, 0x71, 0x18, 0xf6, 0xad, 0xe1, 0x7d, 0xb7, 0x24,
0x1c, 0x32, 0xd4, 0x5b, 0x79, 0xf5, 0x20, 0x8f, 0xad, 0x55, 0xae, 0x43,
0x53, 0x0, 0x75, 0xca, 0x1f, 0x3d, 0xbd, 0x5b, 0x98, 0x53, 0x29, 0xa3,
0xc3, 0x8a, 0x7e, 0x11, 0x3d, 0xe5, 0x45, 0xc8, 0x74, 0xd2, 0x20, 0x35,
0x75, 0xf3, 0x63, 0xfc, 0x49, 0x29, 0xde, 0x73, 0x47, 0x95, 0xeb, 0x28,
0xed, 0xf2, 0x5a, 0x22, 0x7a, 0xdf, 0xf3, 0x9d, 0x3a, 0x4b, 0x7a, 0x9c,
0x67, 0xe2, 0x6c, 0x43, 0x80, 0xa4, 0xac, 0x52, 0x61, 0xc, 0x9b, 0x77,
0xde, 0x3c, 0xf0, 0x7f, 0x7f, 0xba, 0x6e, 0xeb, 0x95, 0x67, 0x29, 0x12,
0x43, 0x30, 0xcf, 0x73, 0xde, 0x36, 0xc1, 0x28, 0xec, 0x7d, 0x97, 0x11,
0xbe, 0x7b, 0xf1, 0x70, 0xab, 0x1e, 0xb3, 0x0, 0xaa, 0xc9, 0xe, 0xf8,
0x83, 0x4e, 0xda, 0x3, 0xff, 0xef, 0x88, 0x84, 0x0, 0x87, 0x71, 0x57,
0x44, 0xe3, 0x7, 0x59, 0x4d, 0x67, 0x74, 0xd6, 0xeb, 0x3b, 0x9e, 0x73,
0x87, 0x12, 0x6f, 0x93, 0x51, 0xc3, 0x14, 0x40, 0x2a, 0x7c, 0x23, 0xa2,
0x7e, 0x9a, 0x3, 0xff, 0xf, 0x88, 0xe8, 0xc9, 0x17, 0x46, 0x94, 0x31,
0x4, 0xff, 0xbc, 0x77, 0x6f, 0x24, 0x87, 0xcc, 0xf7, 0x87, 0xb1, 0xb,
0xd1, 0xe1, 0xd1, 0x86, 0x29, 0x80, 0xd4, 0xf8, 0xa, 0x92, 0x8, 0x22,
0x8c, 0x2c, 0x92, 0x80, 0xc2, 0x25, 0xbf, 0x45, 0x76, 0x18, 0xbe, 0xf4,
0x62, 0x83, 0x90, 0x20, 0x9a, 0xad, 0xad, 0xba, 0xb, 0x98, 0xa6, 0x43,
0x81, 0xb0, 0xa1, 0xd2, 0x55, 0xc4, 0x8b, 0x5, 0xe8, 0x3, 0x1c, 0x89,
0xec, 0xb8, 0x7c, 0xa0, 0x55, 0xa9, 0xf9, 0x0, 0x8, 0x31, 0xd9, 0x83,
0xdb, 0x49, 0xf7, 0x3, 0x76, 0x3, 0xbe, 0x86, 0xcc, 0xf3, 0xfb, 0xbc,
0xf9, 0x8b, 0x80, 0x17, 0x2, 0x9f, 0x7d, 0x88, 0x44, 0x8d, 0x85, 0x6d,
0x42, 0x72, 0xa2, 0x9a, 0xb6, 0xf7, 0xa9, 0x3f, 0x60, 0xb0, 0xfa, 0x4,
0xce, 0xd4, 0x61, 0x86, 0x51, 0xc8, 0x5c, 0xe0, 0x41, 0xe0, 0xf8, 0x90,
0x73, 0xfd, 0x91, 0x2d, 0xc3, 0xc7, 0x3, 0xf7, 0x23, 0xf3, 0xf5, 0x6b,
0x91, 0xa8, 0xc9, 0x6d, 0x90, 0x38, 0x8d, 0x3, 0x80, 0xc3, 0x90, 0x14,
0xee, 0x1d, 0x48, 0x4c, 0x86, 0x61, 0xa, 0xa0, 0x80, 0x2b, 0xf5, 0x48,
0x4a, 0x56, 0x7b, 0xa1, 0x60, 0x70, 0xcb, 0x3a, 0x64, 0xc1, 0xd0, 0x97,
0x3d, 0x56, 0xd6, 0xe9, 0x11, 0x16, 0x85, 0xd1, 0x75, 0x18, 0xf0, 0x23,
0xad, 0xcb, 0x6d, 0x3d, 0x96, 0xc0, 0xa1, 0x7a, 0x18, 0x36, 0x4, 0xa8,
0xaa, 0x60, 0x3e, 0x48, 0xf8, 0x2a, 0xbd, 0x2c, 0x32, 0x9d, 0x97, 0x2d,
0xe1, 0x37, 0x7f, 0x8d, 0xac, 0x35, 0x30, 0x3a, 0x59, 0xc, 0x9c, 0xa0,
0xbd, 0xbb, 0x61, 0xa, 0xa0, 0x2e, 0x1a, 0xff, 0x14, 0x24, 0x89, 0x85,
0x6f, 0xee, 0xfb, 0xf, 0xc0, 0x23, 0xc4, 0xf, 0x22, 0xc9, 0x2b, 0x94,
0x89, 0xc8, 0x86, 0x23, 0x46, 0x21, 0x33, 0x74, 0x38, 0xd6, 0x6c, 0x55,
0x61, 0xa, 0xa0, 0x96, 0xd, 0x7f, 0xe, 0xb2, 0x57, 0xc0, 0x69, 0x44,
0xaf, 0xe, 0x6b, 0xd7, 0x5e, 0x2b, 0x8e, 0x25, 0xd0, 0xae, 0x63, 0xd3,
0x71, 0xc8, 0xda, 0xf7, 0xe9, 0x74, 0x9d, 0x5a, 0x34, 0x64, 0x25, 0xe1,
0xe7, 0x91, 0x84, 0x2a, 0x49, 0xad, 0x81, 0x95, 0x5a, 0xc7, 0xb3, 0xad,
0x1a, 0xcd, 0x7, 0x10, 0xb7, 0xb1, 0x6f, 0x40, 0x92, 0x81, 0xce, 0x43,
0x32, 0xcf, 0x3c, 0x8a, 0x38, 0xfc, 0xe2, 0xf6, 0xea, 0xeb, 0x11, 0xe7,
0xde, 0x9d, 0xfa, 0x77, 0x2c, 0xe2, 0x70, 0xec, 0x8b, 0xac, 0x7f, 0x9f,
0xaf, 0x42, 0x3d, 0x19, 0x78, 0xdb, 0xb9, 0x6e, 0x16, 0x92, 0x8a, 0x6a,
0x98, 0xbd, 0x86, 0x2e, 0x2c, 0x47, 0x22, 0xf9, 0x2e, 0x45, 0xd6, 0x61,
0x1c, 0x2, 0xec, 0x85, 0x4c, 0xb, 0xe, 0x44, 0x62, 0x35, 0x5a, 0xf4,
0x7b, 0xb, 0x81, 0xd7, 0x81, 0xc7, 0xd5, 0x82, 0x68, 0xb1, 0xea, 0x33,
0xc, 0xc3, 0x30, 0xc, 0xc3, 0x30, 0xc, 0xc3, 0x30, 0xc, 0xc3, 0x30,
0xc, 0xc3, 0x30, 0xc, 0xc3, 0x30, 0xc, 0xc3, 0x30, 0xc, 0xc3, 0x30,
0xc, 0xc3, 0x30, 0xc, 0xc3, 0x30, 0xc, 0xc3, 0x30, 0xc, 0xc3, 0x30,
0xc, 0xc3, 0x30, 0xc, 0xc3, 0x30, 0xc, 0xa3, 0x9b, 0xf2, 0xf, 0x1,
0xd8, 0xa5, 0x1a, 0xeb, 0x29, 0x91, 0x30, 0x0, 0x0, 0x0, 0x0, 0x49,
0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82};
size_t banner_size = 0x1813;

14796
source/banner_audio.cpp Normal file

File diff suppressed because it is too large Load Diff

729
source/helper.cpp Normal file
View File

@ -0,0 +1,729 @@
#include <condition_variable>
#include <filesystem>
#include <fstream>
#include <future>
#include <iomanip>
#include <iostream>
#include <math.h>
#include <mutex>
#include <random>
#include <sstream>
#include <stack>
#include <string>
#include <thread>
#include <json.hpp>
#include <fileHash.hpp>
#include <helper.hpp>
#define CCRED "\033[31m"
#define CCGREEN "\033[32m"
#define CCYELLOW "\033[33m"
#define CCBLUE "\033[34m"
#define CCMAGENTA "\033[35m"
#define CCCYAN "\033[36m"
#define CCRESET "\033[0m"
#define veccmp(vec1, vec2) (vec1.size() == vec2.size())
void updateProgressBar(float progress)
{
std::cout << CCYELLOW << "[" << static_cast<int>(progress * 100.0) << " %] "
<< CCRESET;
}
std::string catch_str(nlohmann::json js, std::string at)
{
if (!js.contains(at) || js[at].is_null())
{
throw std::invalid_argument("required_key is null or missing: " + at);
}
return js[at].get<std::string>();
}
int catch_int(nlohmann::json js, std::string at)
{
if (!js.contains(at) || js[at].is_null())
{
throw std::invalid_argument("required_key is null or missing: " + at);
}
return js[at].get<int>();
}
std::vector<std::filesystem::path>
get_files_in_dir(const std::vector<std::string> &dir_paths,
const std::string &extension)
{
std::vector<std::filesystem::path> files;
for (const auto &dir_path : dir_paths)
{
if (!std::filesystem::exists(dir_path))
continue;
for (const auto &entry : std::filesystem::directory_iterator(dir_path))
{
if (std::filesystem::is_regular_file(entry.path()) &&
entry.path().extension() == extension)
{
files.push_back(fix_path(entry.path().string()));
}
}
}
return files;
}
void Js2Vec(std::vector<std::string> &vec, nlohmann::json js)
{
vec.clear();
for (auto const &it : js)
{
vec.push_back(it.get<std::string>());
}
}
void Vec2Json(std::vector<std::string> vec, nlohmann::json &js,
NpiProject ref)
{
int indx = 0;
for (auto const &it : vec)
{
js[indx] = it;
indx++;
}
}
std::string Flags2Str(std::vector<std::string> flags)
{
std::string res = "";
for (auto const &it : flags)
res += "-" + it + " ";
return res;
}
std::string IncludeDirs(std::vector<std::string> dirs)
{
std::string res = "";
for (auto const &it : dirs)
res += "-I " + it + " ";
return res;
}
std::string LibIncludes(std::vector<std::string> dirs)
{
std::string res = "";
for (auto const &it : dirs)
res += "-I " + it + "include/ ";
return res;
}
void VecGetExtra(std::vector<std::string> &result,
std::vector<std::string> input, NpiProject ref)
{
result.clear();
for (auto const &it : input)
{
if (it == "[arch_flags]")
{
for (auto const &af : ref.arch_flags)
{
result.push_back(af);
}
}
else if (it == "[c_flags]")
{
for (auto const &cf : ref.c_flags)
{
result.push_back(cf);
}
}
else
{
result.push_back(it);
}
}
}
void ReplVariables(std::string &str, const std::string &from,
const std::string &to)
{
if (from.empty())
return;
size_t start_pos = 0;
while ((start_pos = str.find(from, start_pos)) != std::string::npos)
{
str.replace(start_pos, from.length(), to);
start_pos += to.length(); // In case 'to' contains 'from', like replacing
// 'x' with 'yx'
}
}
void AutoRepl(std::string &str)
{
std::string dkp_env = getenv("DEVKITPRO");
std::string cwd = std::filesystem::current_path().string();
ReplVariables(str, "{DEVKITPRO}", dkp_env);
ReplVariables(str, "{cwd}", cwd);
}
void ReplVector(std::vector<std::string> &vec, const std::string &from,
const std::string &to)
{
for (size_t i = 0; i < vec.size(); i++)
ReplVariables(vec[i], from, to);
}
void AutoVecRepl(std::vector<std::string> &strs)
{
for (size_t i = 0; i < strs.size(); i++)
AutoRepl(strs[i]);
}
void ProcessPrj2Cmp(NpiProject *prj, NpiProject src)
{
VecGetExtra(prj->arch_flags, src.arch_flags, src);
VecGetExtra(prj->c_flags, src.c_flags, src);
VecGetExtra(prj->cxx_flags, src.cxx_flags,
prj[0]); // Use Prj as ref cause arch_flags already written
VecGetExtra(prj->as_flags, src.as_flags, src);
VecGetExtra(prj->linker_flags, src.linker_flags, src);
}
std::string LinkerInput(std::vector<std::filesystem::path> o_files,
std::vector<std::filesystem::path> d_files)
{
std::string res = "";
/*if (o_files.size() != d_files.size()) {
std::cerr << "The Number of .d and .o files is wrong";
return "";
}*/
for (size_t i = 0; i < o_files.size(); i++)
res += o_files[i].string() + " "; // + d_files[i].string() + " ";
return res;
}
std::string Libs(std::vector<std::string> libs)
{
std::string res = "";
for (auto const &it : libs)
res += "-l" + it + " ";
return res;
}
std::string LibPaths(std::vector<std::string> libs)
{
std::string res = "";
for (auto const &it : libs)
res += "-L" + it + "lib/ ";
return res;
}
void DeleteFiles(std::string path, std::vector<std::string> extensions)
{
for (const auto &entry : std::filesystem::directory_iterator(path))
{
if (std::filesystem::is_directory(entry))
{
DeleteFiles(fix_path(entry.path().string()), extensions);
}
else
{
for (const auto &ext : extensions)
{
if (entry.path().extension() == ext)
{
std::filesystem::remove(entry);
std::cout << CCRED << "[*] Deleted file: " << fix_path(entry.path().string())
<< CCRESET << std::endl;
break;
}
}
}
}
}
void DeleteDirectory(std::string path)
{
for (const auto &entry : std::filesystem::directory_iterator(path))
{
if (std::filesystem::is_directory(entry))
{
DeleteDirectory(fix_path(entry.path().string()));
}
else
{
std::filesystem::remove(entry);
std::cout << CCRED << "[*] Deleted file: " << fix_path(entry.path().string())
<< CCRESET << std::endl;
}
}
std::filesystem::remove(path);
std::cout << CCRED << "[*] Deleted directory: " << path << CCRESET
<< std::endl;
}
void GenerateHashes(NpiProject prj, std::string dir_)
{
auto cpp_hashes = createHashes(prj.source_dirs, ".cpp");
auto c_hashes = createHashes(prj.source_dirs, ".c");
auto hpp_hashes = createHashes(prj.include_dirs, ".hpp");
auto h_hashes = createHashes(prj.include_dirs, ".h");
auto v_pica_hashes = createHashes(prj.source_dirs, ".v.pica");
auto shlist_hashes = createHashes(prj.source_dirs, ".shlist");
auto s_hashes = createHashes(prj.source_dirs, ".s");
auto t3s_hashes = createHashes({std::string(dir_ + "/gfx")}, ".t3s");
nlohmann::json jscpp_hashes;
for (auto const &it : cpp_hashes)
jscpp_hashes[it.first] = it.second;
nlohmann::json jsc_hashes;
for (auto const &it : c_hashes)
jsc_hashes[it.first] = it.second;
nlohmann::json jshpp_hashes;
for (auto const &it : hpp_hashes)
jshpp_hashes[it.first] = it.second;
nlohmann::json jsh_hashes;
for (auto const &it : h_hashes)
jsh_hashes[it.first] = it.second;
nlohmann::json jsv_pica_hashes;
for (auto const &it : v_pica_hashes)
jsv_pica_hashes[it.first] = it.second;
nlohmann::json jsshlist_hashes;
for (auto const &it : shlist_hashes)
jsshlist_hashes[it.first] = it.second;
nlohmann::json jss_hashes;
for (auto const &it : s_hashes)
jss_hashes[it.first] = it.second;
nlohmann::json jst3s_hashes;
for (auto const &it : t3s_hashes)
jst3s_hashes[it.first] = it.second;
nlohmann::json hashes;
hashes["cpp"] = jscpp_hashes;
hashes["c"] = jsc_hashes;
hashes["hpp"] = jshpp_hashes;
hashes["h"] = jsh_hashes;
hashes["v_pica"] = jsv_pica_hashes;
hashes["shlist"] = jsshlist_hashes;
hashes["s"] = jss_hashes;
hashes["t3s"] = jst3s_hashes;
std::ofstream hashes_file(dir_ + "/" + "build/hashes.json");
hashes_file << hashes.dump(4);
hashes_file.close();
}
std::map<std::string, std::string> GetHashMap(std::string dir_,
std::string extension)
{
nlohmann::json js;
std::ifstream is(dir_ + "/build/hashes.json");
if (!is)
{
std::cerr << "[-]hashes.json not in " << dir_ + "/build/"
<< "!\n";
exit(-1);
}
is >> js;
is.close();
std::string mod_ext = extension.substr(1);
std::replace(mod_ext.begin(), mod_ext.end(), '.', '_');
std::map<std::string, std::string> res;
for (auto &[filename, hash] : js[mod_ext].items())
{
res[filename] = hash;
}
return res;
}
void CompileProject(NpiProject &prj, std::string dir_)
{
#ifdef _WIN32
std::string dkp_env = "C:/devkitPro/";
std::cout << CCYELLOW << "[+] Warning: Windows Usage Detected!\n[+] Make sure you have devkitpro installed at <C:/devkitPro>!" << CCRESET << std::endl;
#else
std::string dkp_env = getenv("DEVKITPRO");
#endif
bool any_errors = false;
AutoVecRepl(prj.source_dirs);
AutoVecRepl(prj.include_dirs);
std::vector<std::filesystem::path> cpp_files =
get_files_in_dir(prj.source_dirs, ".cpp");
std::vector<std::filesystem::path> c_files =
get_files_in_dir(prj.source_dirs, ".c");
std::vector<std::filesystem::path> hpp_files =
get_files_in_dir(prj.include_dirs, ".hpp");
std::vector<std::filesystem::path> h_files =
get_files_in_dir(prj.include_dirs, ".h");
std::vector<std::filesystem::path> v_pica_files =
get_files_in_dir(prj.source_dirs, ".v.pica");
std::vector<std::filesystem::path> shlist_files =
get_files_in_dir(prj.source_dirs, ".shlist");
std::vector<std::filesystem::path> t3s_files =
get_files_in_dir({std::string(dir_ + "/gfx")}, ".t3s");
std::vector<std::filesystem::path> s_files =
get_files_in_dir(prj.source_dirs, ".s");
std::filesystem::create_directories(dir_ + "/build");
std::vector<std::filesystem::path> cpp_files_;
std::vector<std::filesystem::path> c_files_;
std::vector<std::filesystem::path> v_pica_files_;
std::vector<std::filesystem::path> shlist_files_;
std::vector<std::filesystem::path> s_files_;
std::vector<std::filesystem::path> t3s_files_;
if (!std::filesystem::exists(
std::filesystem::path(dir_ + "/build/hashes.json")))
{
GenerateHashes(prj, dir_);
cpp_files_ = get_files_in_dir(prj.source_dirs, ".cpp");
c_files_ = get_files_in_dir(prj.source_dirs, ".c");
v_pica_files_ = get_files_in_dir(prj.source_dirs, ".v.pica");
shlist_files_ = get_files_in_dir(prj.source_dirs, ".shlist");
s_files_ = get_files_in_dir(prj.source_dirs, ".s");
t3s_files_ = get_files_in_dir({std::string(dir_ + "/gfx")}, ".t3s");
}
else
{
cpp_files_ = getChangedFiles(GetHashMap(dir_, ".cpp"));
c_files_ = getChangedFiles(GetHashMap(dir_, ".c"));
v_pica_files_ = getChangedFiles(GetHashMap(dir_, ".v.pica"));
shlist_files_ = getChangedFiles(GetHashMap(dir_, ".shlist"));
s_files_ = getChangedFiles(GetHashMap(dir_, ".s"));
t3s_files_ = getChangedFiles(GetHashMap(dir_, ".t3s"));
if ((getChangedFiles(GetHashMap(dir_, ".hpp")).size() != 0) ||
(getChangedFiles(GetHashMap(dir_, ".hpp")).size() != 0))
{
cpp_files_ = get_files_in_dir(prj.source_dirs, ".cpp");
c_files_ = get_files_in_dir(prj.source_dirs, ".c");
}
}
if (GetHashMap(dir_, ".cpp").size() != cpp_files.size() ||
GetHashMap(dir_, ".c").size() != c_files.size())
{
cpp_files_ = get_files_in_dir(prj.source_dirs, ".cpp");
c_files_ = get_files_in_dir(prj.source_dirs, ".c");
}
if (GetHashMap(dir_, ".hpp").size() != hpp_files.size() ||
GetHashMap(dir_, ".h").size() != h_files.size())
{
cpp_files_ = get_files_in_dir(prj.source_dirs, ".cpp");
c_files_ = get_files_in_dir(prj.source_dirs, ".c");
}
ReplVector(prj.lib_dirs, "{DEVKITPRO}", dkp_env);
ReplVariables(prj.cxx_compiler, "{DEVKITPRO}", dkp_env);
ReplVariables(prj.c_compiler, "{DEVKITPRO}", dkp_env);
ReplVariables(prj.asm_compiler, "{DEVKITPRO}", dkp_env);
ReplVariables(prj.linker, "{DEVKITPRO}", dkp_env);
int prgc = 0;
int prga = cpp_files_.size() + c_files_.size();
if (prga <= 0)
{
prgc = 1;
prga = 1;
std::cout << CCGREEN << "[+] Everything is Up to date..." << CCRESET
<< std::endl;
return;
}
for (auto const &it : t3s_files_)
{
std::string command = dkp_env + "/tools/bin/tex3ds -i " + fix_path(it.string()) +
" -H " + dir_ + "/build/" + fix_path(it.stem().string()) +
".h" + " -d " + dir_ + "/build/" +
fix_path(it.stem().string()) + ".d" + " -o " + dir_ +
"/romfs/gfx//" + fix_path(it.stem().string()) + ".t3x";
std::cout << CCMAGENTA << "Generating: " << CCCYAN << fix_path(it.filename().string())
<< std::endl;
int reqres = system(command.c_str());
std::cout << (reqres == 0 ? CCGREEN : CCRED)
<< (reqres == 0 ? "[+] " : "[-] ") << fix_path(it.filename().string())
<< std::endl;
if (reqres != 0)
any_errors = true;
}
for (auto const &it : cpp_files_)
{
std::string command =
prj.cxx_compiler + " -MMD -MP -MF " + dir_ + "/build/" +
fix_path(it.stem().string()) + ".d " + "-c " + fix_path(it.string()) + " -o " + dir_ +
"/build/" + fix_path(it.stem().string()) + ".o " + Flags2Str(prj.cxx_flags) +
" " + IncludeDirs(prj.include_dirs) + " " + LibIncludes(prj.lib_dirs);
std::cout << CCMAGENTA << "Compiling: " << CCCYAN << fix_path(it.filename().string())
<< std::endl;
int reqres = system(command.c_str());
std::cout << (reqres == 0 ? CCGREEN : CCRED)
<< (reqres == 0 ? "[+] " : "[-] ") << fix_path(it.filename().string())
<< std::endl;
if (reqres != 0)
any_errors = true;
}
for (auto const &it : c_files_)
{
std::string command =
prj.c_compiler + " -MMD -MP -MF " + dir_ + "/build/" +
fix_path(it.stem().string()) + ".d " + "-c " + fix_path(it.string()) + " -o " + dir_ +
"/build/" + fix_path(it.stem().string()) + ".o " + Flags2Str(prj.c_flags) + " " +
IncludeDirs(prj.include_dirs) + " " + LibIncludes(prj.lib_dirs);
std::cout << CCMAGENTA << "Compiling: " << CCCYAN << fix_path(it.filename().string())
<< std::endl;
int reqres = system(command.c_str());
std::cout << (reqres == 0 ? CCGREEN : CCRED)
<< (reqres == 0 ? "[+] " : "[-] ") << fix_path(it.filename().string())
<< std::endl;
if (reqres != 0)
any_errors = true;
}
std::vector<std::filesystem::path> o_files =
get_files_in_dir({dir_ + "/build/"}, ".o");
std::vector<std::filesystem::path> d_files =
get_files_in_dir({dir_ + "/build/"}, ".d");
if (!any_errors)
{
std::string command = prj.linker + " -o " + dir_ + "/" + prj.name +
".elf " + LinkerInput(o_files, d_files) + " " +
Libs(prj.libraries) + " " + LibPaths(prj.lib_dirs) +
" " + Flags2Str(prj.linker_flags);
std::cout << CCBLUE << "[+] Linking..." << CCRESET << std::endl;
int reqres = system(command.c_str());
if (reqres != 0)
any_errors = true;
command = "bannertool makebanner -i \"app/banner.png\" -a "
"\"app/BannerAudio.wav\" -o \"build/banner.bin\"";
std::cout << CCBLUE << "[+] Creating Banner..." << CCRESET << std::endl;
reqres = system(command.c_str());
std::cout << (reqres == 0 ? CCGREEN : CCRED)
<< (reqres == 0 ? "[+] " : "[-] ") << "Banner" << std::endl;
command = "bannertool makesmdh -i \"app/icon.png\" -s \"" + prj.name +
"\" -l \"Description\" -p \"" + prj.author +
"\" -o \"build/icon.bin\"";
std::cout << CCBLUE << "[+] Creating smdh..." << CCRESET << std::endl;
reqres = system(command.c_str());
std::cout << (reqres == 0 ? CCGREEN : CCRED)
<< (reqres == 0 ? "[+] " : "[-] ") << "Icon" << std::endl;
command = dkp_env += "/tools/bin/3dsxtool " + dir_ + "/" + prj.name +
".elf " + dir_ + "/" + prj.name + ".3dsx " +
"--smdh=" + dir_ + "/build/icon.bin" +
" --romfs=" + dir_ + "/romfs";
std::cout << CCBLUE << "[+] Creating 3dsx..." << CCRESET << std::endl;
reqres = system(command.c_str());
std::cout << (reqres == 0 ? CCGREEN : CCRED)
<< (reqres == 0 ? "[+] " : "[-] ") << prj.name + ".3dsx "
<< std::endl;
command =
"makerom -f cia -target t -exefslogo -o " + dir_ + "/" + prj.name +
".cia -elf " + dir_ + "/" + prj.name + ".elf " + " -rsf " + dir_ + "/" +
prj.rsf_path + " -banner " + dir_ + "/build/banner.bin" + " -icon " +
dir_ + "/build/icon.bin" + " -logo " + dir_ + "/" + prj.logo_lz11_path +
" -DAPP_ROMFS=" + dir_ + "/" + prj.dir_romfs + " -major " +
std::to_string(prj.vmajor) + " -minor " + std::to_string(prj.vminor) +
" -micro " + std::to_string(prj.vbuild) +
" -DAPP_VERSION_MAJOR=" + std::to_string(prj.vmajor);
std::cout << CCBLUE << "[+] Creating Cia..." << CCRESET << std::endl;
reqres = system(command.c_str());
std::cout << (reqres == 0 ? CCGREEN : CCRED)
<< (reqres == 0 ? "[+] " : "[-] ") << prj.name + ".cia "
<< std::endl;
}
if (any_errors)
{
std::cout
<< CCRED
<< "\nErrors Happened!\nTake a look at the Top of this Message...\n"
<< CCRESET;
}
GenerateHashes(prj, dir_);
std::cout << CCRESET << std::endl;
}
namespace helper
{
std::string GenerateUniqueId()
{
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(0, 15);
std::stringstream ss;
ss << "0x";
for (int i = 0; i < 5; ++i)
{
ss << std::hex << dis(gen);
}
std::string hex_str = ss.str();
return hex_str;
}
void ArrayToFile(unsigned char *array_, size_t size_, std::string filename)
{
std::ofstream file(filename, std::ios::binary);
if (!file.is_open())
{
std::cerr << CCRED << "[-]: Could not open file" << CCRESET << std::endl;
return;
}
file.write(reinterpret_cast<char *>(array_), size_);
file.close();
}
void GenerateTemplateFile(std::string path, NpiProject prj)
{
nlohmann::ordered_json js;
js["project_name"] = prj.name;
js["author"] = prj.author;
js["description"] = prj.description;
js["vmajor"] = prj.vmajor;
js["vminor"] = prj.vminor;
js["vbuild"] = prj.vbuild;
js["unique_id"] = prj.unique_id;
js["prod_code"] = prj.prod;
js["platform"] = prj.platform;
nlohmann::json source_dirs;
Vec2Json(prj.source_dirs, source_dirs, prj);
js["source_dirs"] = source_dirs;
nlohmann::json include_dirs;
Vec2Json(prj.include_dirs, include_dirs, prj);
js["include_dirs"] = include_dirs;
nlohmann::json libraries;
Vec2Json(prj.libraries, libraries, prj);
js["libraries"] = libraries;
nlohmann::json lib_dirs;
Vec2Json(prj.lib_dirs, lib_dirs, prj);
js["lib_dirs"] = lib_dirs;
js["icon_path"] = prj.icon_path;
js["banner_path"] = prj.banner_path;
js["banner_a_path"] = prj.banner_a_path;
js["rsf_path"] = prj.rsf_path;
js["logo_lz11_path"] = prj.logo_lz11_path;
js["dir_gfx"] = prj.dir_gfx;
js["dir_gfxbuild"] = prj.dir_gfxbuild;
js["dir_romfs"] = prj.dir_romfs;
nlohmann::json arch_flags;
Vec2Json(prj.arch_flags, arch_flags, prj);
js["arch_flags"] = arch_flags;
nlohmann::json c_flags;
Vec2Json(prj.c_flags, c_flags, prj);
js["c_flags"] = c_flags;
nlohmann::json cxx_flags;
Vec2Json(prj.cxx_flags, cxx_flags, prj);
js["cxx_flags"] = cxx_flags;
nlohmann::json as_flags;
Vec2Json(prj.as_flags, as_flags, prj);
js["as_flags"] = as_flags;
nlohmann::json linker_flags;
Vec2Json(prj.linker_flags, linker_flags, prj);
js["linker_flags"] = linker_flags;
js["cxx_compiler"] = prj.cxx_compiler;
js["c_compiler"] = prj.c_compiler;
js["asm_compiler"] = prj.asm_compiler;
js["linker"] = prj.linker;
std::ofstream fout(path);
fout << js.dump(4);
fout.close();
}
void CompileProject(std::string path)
{
std::string dkp_env = getenv("DEVKITPRO");
if (dkp_env.c_str() == NULL)
{
std::cerr << CCRED << "[-] Please set DEVKITPRO ENV Variable!\n"
<< CCRESET;
return;
}
nlohmann::json js;
std::ifstream is(path + "/build.json");
if (!is)
{
std::cerr << CCRED << "[-] build.json not in " << path << "!\n"
<< CCRESET;
return;
}
is >> js;
is.close();
std::cout << CCBLUE << "[+] Compiling at " << path << " ...\n"
<< CCRESET;
NpiProject prj;
prj.name = catch_str(js, "project_name");
prj.author = catch_str(js, "author");
prj.vmajor = catch_int(js, "vmajor");
prj.vminor = catch_int(js, "vminor");
prj.vbuild = catch_int(js, "vbuild");
prj.description = catch_str(js, "description");
prj.unique_id = catch_str(js, "unique_id");
prj.prod = catch_str(js, "prod_code");
prj.platform = catch_str(js, "platform");
prj.icon_path = catch_str(js, "icon_path");
prj.banner_path = catch_str(js, "banner_path");
prj.banner_a_path = catch_str(js, "banner_a_path");
prj.rsf_path = catch_str(js, "rsf_path");
prj.logo_lz11_path = catch_str(js, "logo_lz11_path");
prj.dir_gfx = catch_str(js, "dir_gfx");
prj.dir_gfxbuild = catch_str(js, "dir_gfxbuild");
prj.dir_romfs = catch_str(js, "dir_romfs");
Js2Vec(prj.arch_flags, js["arch_flags"]);
Js2Vec(prj.linker_flags, js["linker_flags"]);
Js2Vec(prj.c_flags, js["c_flags"]);
Js2Vec(prj.cxx_flags, js["cxx_flags"]);
Js2Vec(prj.as_flags, js["as_flags"]);
Js2Vec(prj.source_dirs, js["source_dirs"]);
Js2Vec(prj.include_dirs, js["include_dirs"]);
Js2Vec(prj.lib_dirs, js["lib_dirs"]);
Js2Vec(prj.libraries, js["libraries"]);
prj.cxx_compiler = catch_str(js, "cxx_compiler");
prj.c_compiler = catch_str(js, "c_compiler");
prj.asm_compiler = catch_str(js, "asm_compiler");
prj.linker = catch_str(js, "linker");
NpiProject _2build = prj;
ProcessPrj2Cmp(&_2build, prj);
CompileProject(_2build, path);
}
void CleanProject(std::string path)
{
DeleteFiles(path, {".3dsx", ".cia", ".elf"});
DeleteFiles(path + "/" + "romfs", {".t3x"});
DeleteDirectory(path + "/build");
}
} // namespace helper

1296
source/icon.cpp Normal file

File diff suppressed because it is too large Load Diff

688
source/logo_lz11.cpp Normal file
View File

@ -0,0 +1,688 @@
#include <logo_lz11.hpp>
unsigned char logo_lz11[] = {
0x11, 0x40, 0xe6, 0x0, 0x0, 0x64, 0x61, 0x72, 0x63, 0xff, 0xfe, 0x1c,
0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x20, 0xe6, 0x0, 0x0, 0x83, 0x30,
0x9, 0x64, 0x3, 0x0, 0x0, 0x80, 0x20, 0x3, 0x30, 0x13, 0xab, 0x30,
0x18, 0x11, 0x20, 0x1d, 0x2, 0xa0, 0xb, 0x6, 0x20, 0x2b, 0x30, 0x18,
0x5a, 0x9, 0x20, 0x35, 0x10, 0x20, 0x39, 0x30, 0x2b, 0xac, 0x20, 0x20,
0x54, 0xaa, 0x20, 0x45, 0x40, 0x20, 0x1c, 0xc, 0x20, 0x2c, 0x98, 0x20,
0x51, 0x60, 0x55, 0x8, 0x50, 0x38, 0xdc, 0x30, 0xb, 0xa, 0x50, 0x23,
0x20, 0x20, 0x51, 0x5, 0x20, 0xd, 0x0, 0x0, 0xe8, 0x20, 0x50, 0x64,
0x30, 0xb, 0xa5, 0x20, 0x40, 0x78, 0x20, 0x6f, 0xa8, 0x1, 0x50, 0x53,
0xe, 0x20, 0x89, 0x40, 0xb2, 0x30, 0x75, 0x14, 0x0, 0x0, 0x28, 0x4,
0x0, 0x24, 0x0, 0xc8, 0x20, 0x81, 0x80, 0x18, 0x20, 0xb, 0x80, 0x0,
0x28, 0x0, 0xe4, 0x30, 0x8d, 0x99, 0x20, 0x17, 0x20, 0x0, 0x0, 0x53,
0xfa, 0x30, 0x17, 0xb9, 0x50, 0xb, 0x12, 0x2, 0x50, 0x8f, 0x30, 0xa7,
0x48, 0x1c, 0x20, 0xa8, 0xc0, 0xd9, 0x20, 0xbf, 0x5, 0x0, 0x0, 0x41,
0x4c, 0x20, 0xb4, 0x40, 0xdf, 0x0, 0x0, 0xe0, 0x20, 0xb0, 0x10, 0x0,
0x0, 0x2e, 0x20, 0xe3, 0x61, 0x0, 0x6e, 0x0, 0x14, 0x69, 0x0, 0x6d,
0x20, 0xed, 0x4e, 0x20, 0x7, 0x6e, 0x0, 0x10, 0x74, 0x0, 0x65, 0x20,
0x11, 0x64, 0x0, 0x6f, 0x0, 0x51, 0x4c, 0x20, 0x3, 0x67, 0x20, 0x7,
0x5f, 0x0, 0x44, 0x20, 0x3, 0x41, 0x30, 0x20, 0x1, 0x5f, 0x0, 0x53,
0x0, 0x63, 0x40, 0x1f, 0x5, 0x65, 0x0, 0x4f, 0x0, 0x75, 0x20, 0x2b,
0x41, 0x20, 0x43, 0x5a, 0x62, 0x20, 0x13, 0x6c, 0x40, 0x47, 0x2, 0x50,
0x43, 0x42, 0x3, 0x20, 0x43, 0x43, 0xbd, 0x1, 0x80, 0x87, 0x55, 0x4,
0xc0, 0x43, 0x1, 0x90, 0xcb, 0x0, 0x90, 0x87, 0xf1, 0x53, 0x74, 0x41,
0x9f, 0x51, 0x67, 0x22, 0x8f, 0x6d, 0x21, 0xad, 0x73, 0x0, 0x6b, 0x81,
0x73, 0xaa, 0x51, 0xb7, 0x62, 0x21, 0x89, 0x62, 0x21, 0x85, 0x6c, 0x21,
0xb9, 0x73, 0xb5, 0xe0, 0x1b, 0x6c, 0x61, 0xc3, 0xd0, 0x31, 0x77, 0x21,
0xf5, 0x76, 0x0, 0x20, 0x2d, 0xbf, 0x30, 0x43, 0x79, 0x22, 0x1, 0x1,
0x32, 0xb, 0x71, 0xf7, 0x0, 0xf0, 0x2f, 0x71, 0x6f, 0xd0, 0x2f, 0x81,
0x0, 0xb0, 0x2, 0x43, 0x4c, 0x41, 0x4e, 0xff, 0xfe, 0x22, 0xec, 0x18,
0x0, 0x2, 0x2, 0x33, 0x43, 0x23, 0x67, 0x0, 0x70, 0x61, 0x1a, 0x74,
0x31, 0x3c, 0x63, 0x7e, 0x33, 0x99, 0x28, 0x23, 0x9d, 0xa1, 0x20, 0x0,
0xf0, 0x43, 0x8c, 0x53, 0x63, 0x65, 0x6e, 0x65, 0x8, 0x4f, 0x75, 0x74,
0x41, 0x23, 0xb1, 0x47, 0x5f, 0x41, 0x10, 0x5f, 0x30, 0x30, 0xd0, 0x60,
0x70, 0x61, 0x69, 0x31, 0x54, 0x5c, 0x23, 0xac, 0x50, 0x43, 0xbe, 0x6,
0x33, 0x46, 0x0, 0x2c, 0xb5, 0x23, 0xdd, 0xcc, 0x33, 0xab, 0x23, 0xcd,
0x54, 0x23, 0xd1, 0xc4, 0x23, 0xd5, 0x43, 0x10, 0x23, 0xd0, 0x6d, 0x61,
0x73, 0x6b, 0xf0, 0x40, 0x33, 0xf0, 0x85, 0x34, 0xd, 0x43, 0x4c, 0x56,
0x43, 0x33, 0xfc, 0xc, 0x34, 0x19, 0xf2, 0x20, 0x2c, 0x33, 0xeb, 0x40,
0xb, 0x44, 0x16, 0x7f, 0x43, 0x20, 0x51, 0xc1, 0xf9, 0x23, 0xcd, 0x30,
0x86, 0x30, 0x5d, 0xa0, 0xb, 0x34, 0x4a, 0x82, 0x42, 0x0, 0x10, 0xb,
0x5c, 0x7f, 0x20, 0x13, 0x8a, 0x20, 0x17, 0x30, 0x3b, 0x90, 0xb, 0xab,
0xaa, 0x5c, 0xe2, 0x20, 0x47, 0x9c, 0x40, 0x2f, 0xb0, 0xb, 0x34, 0x90,
0x62, 0x75, 0x6, 0x62, 0x62, 0x6c, 0x65, 0x73, 0xc0, 0xe3, 0xa0, 0x9f,
0x49, 0xf9, 0x80, 0x9f, 0x24, 0xa6, 0x31, 0x37, 0x90, 0x9f, 0x34, 0xce,
0x8c, 0x42, 0x34, 0xbc, 0xbc, 0x80, 0x43, 0x31, 0x2, 0x90, 0x43, 0x0,
0x41, 0x27, 0x25, 0x19, 0x51, 0x27, 0x54, 0x53, 0x8d, 0x81, 0x27, 0x1,
0x2, 0x0, 0x24, 0x76, 0x61, 0x27, 0x1c, 0x21, 0x3, 0x2d, 0x60, 0xc0,
0x51, 0xfe, 0x44, 0xe0, 0xb, 0x72, 0x14, 0xa0, 0xe0, 0xb, 0x3, 0x90,
0xc0, 0x29, 0xa5, 0x14, 0xbe, 0x0, 0x40, 0xf7, 0x0, 0x60, 0x6f, 0x8a,
0xf0, 0xf7, 0x75, 0x64, 0x4f, 0x22, 0x3a, 0x9e, 0x21, 0x7f, 0x80, 0x79,
0x3f, 0x30, 0xb, 0x0, 0x40, 0xff, 0x1, 0x50, 0x4b, 0x20, 0x3f, 0xcf,
0x3b, 0x90, 0x4b, 0xff, 0x30, 0xb, 0x0, 0xd2, 0xbf, 0x35, 0xf7, 0xb2,
0xbf, 0x25, 0xd2, 0x82, 0xbf, 0x20, 0xeb, 0xc2, 0xbf, 0x8b, 0x32, 0x20,
0x47, 0x5f, 0x42, 0x0, 0x42, 0xbf, 0xbc, 0x26, 0x75, 0x50, 0x2d, 0xaa,
0x92, 0xbf, 0x6c, 0x26, 0xa1, 0xa8, 0x26, 0xa5, 0xe4, 0x26, 0xa9, 0x24,
0xbf, 0x26, 0x95, 0x70, 0x26, 0x99, 0x1, 0xb2, 0xbf, 0x92, 0x2b, 0x93,
0x90, 0x1, 0xb2, 0x5f, 0xb0, 0x3f, 0xf7, 0x1, 0xf2, 0x57, 0xf0, 0x3b,
0x1, 0xb2, 0x4f, 0x92, 0xe3, 0x48, 0x23, 0x73, 0x52, 0x4f, 0x2, 0xb2,
0x1f, 0x14, 0xcd, 0xcc, 0x4c, 0x24, 0x5a, 0x20, 0x23, 0xbf, 0x0, 0x40,
0xec, 0x30, 0xb, 0x2, 0xa2, 0x1f, 0x20, 0x4b, 0xcc, 0x22, 0x1f, 0x30,
0x4b, 0x80, 0x3f, 0xfc, 0x50, 0xb, 0x0, 0xd4, 0xdf, 0x38, 0x44, 0xb4,
0xdf, 0x31, 0x95, 0x74, 0xdf, 0xf1, 0x0, 0x62, 0xff, 0xc4, 0xdf, 0x30,
0xa0, 0x47, 0x5f, 0x43, 0x0, 0x44, 0xdf, 0xb0, 0xaa, 0x28, 0x95, 0xf,
0xe4, 0xdf, 0x78, 0x28, 0xc1, 0xb4, 0x28, 0xc5, 0xf0, 0xb1, 0x28, 0xc9,
0x30, 0x2, 0x22, 0x1f, 0xf4, 0x3f, 0xdb, 0xb6, 0x91, 0x25, 0x62, 0x4c,
0x60, 0x25, 0x66, 0x7f, 0x43, 0x30, 0xb, 0x2, 0x52, 0x2b, 0x60, 0x41,
0xfc, 0x2, 0x92, 0x2b, 0x50, 0x3b, 0x2, 0x52, 0x2b, 0x39, 0xce, 0x2,
0x14, 0x4b, 0x95, 0x4f, 0x80, 0xbf, 0xfe, 0x51, 0xd3, 0x1, 0xd2, 0x1f,
0x0, 0x30, 0x3f, 0x0, 0xb6, 0xdf, 0x2, 0x71, 0xff, 0x36, 0xdf, 0x51,
0xff, 0x8, 0xb5, 0x46, 0xdf, 0x34, 0x3a, 0x83, 0x2a, 0xc1, 0xbc, 0x2a,
0xc5, 0xf8, 0x30, 0xf, 0xae, 0x2a, 0xb5, 0x74, 0x2a, 0xb9, 0xb4, 0x35,
0xa3, 0x1, 0xe6, 0xe7, 0x0, 0xf2, 0x7, 0x6c, 0x1c, 0x6f, 0x67, 0x6f,
0x0, 0xa7, 0x33, 0x1, 0x52, 0x7, 0xd, 0xe2, 0x43, 0x77, 0x61, 0x7f,
0x76, 0xe7, 0xc5, 0xd7, 0x3f, 0x38, 0xf3, 0x3c, 0x47, 0x56, 0x27, 0xf2,
0x87, 0x44, 0xb3, 0x60, 0xbc, 0xd6, 0xeb, 0x40, 0x17, 0x40, 0xd, 0xd7,
0xa3, 0xbb, 0x87, 0x37, 0x67, 0x66, 0x66, 0xe6, 0x3f, 0xc8, 0x2f, 0x2,
0x62, 0xab, 0x0, 0xf9, 0x9f, 0xde, 0x3c, 0xb3, 0x3, 0x36, 0xdf, 0x98,
0x2d, 0x4c, 0x57, 0xd, 0x92, 0xbf, 0x3a, 0x87, 0xb0, 0xb7, 0x2d, 0x85,
0xec, 0x39, 0xef, 0x2d, 0x75, 0x68, 0x62, 0xbf, 0x3c, 0xc3, 0x2, 0xf6,
0xe7, 0xff, 0x2, 0x52, 0xb3, 0xe6, 0xe7, 0xe, 0xa7, 0x23, 0x1, 0x72,
0xbf, 0x34, 0x87, 0x3f, 0x29, 0xea, 0x8b, 0x37, 0x67, 0xfd, 0x24, 0x9a,
0x47, 0x73, 0x82, 0xcb, 0x9a, 0x27, 0x50, 0x23, 0x52, 0xcb, 0x20, 0x82,
0xcb, 0xe0, 0x6a, 0x1b, 0x32, 0xe3, 0x29, 0x83, 0xf0, 0x42, 0xcd, 0xcc,
0xc, 0x7f, 0x40, 0x5c, 0x4a, 0x57, 0xbb, 0x32, 0xfb, 0x4, 0xf7, 0xbb,
0xfc, 0x9f, 0x3f, 0xa7, 0x3, 0x3c, 0x9f, 0x75, 0x28, 0x2f, 0xef, 0x5c,
0x9f, 0x95, 0xbf, 0xd4, 0x2f, 0xfb, 0x18, 0x2f, 0xf7, 0x77, 0x5c, 0x39,
0xfb, 0x6c, 0x9f, 0x3c, 0xc7, 0xdc, 0x9, 0x2c, 0xa7, 0x1, 0xb6, 0x13,
0x1, 0xc, 0xa7, 0xff, 0x10, 0x2, 0xac, 0xeb, 0x2, 0xd3, 0xa7, 0x4d,
0x2f, 0x28, 0x42, 0x3d, 0x3b, 0x4d, 0x47, 0x46, 0x73, 0x22, 0xf2, 0x84,
0xce, 0x57, 0xe1, 0x65, 0x2d, 0x3e, 0x33, 0xa7, 0xa4, 0x70, 0x7c, 0xd,
0x63, 0x8f, 0x40, 0x2f, 0x2, 0xf3, 0x8f, 0x1, 0x4d, 0x6b, 0x4, 0x30,
0x13, 0xff, 0xff, 0x30, 0xff, 0xff, 0x3f, 0x3b, 0x10, 0x13, 0x70, 0x7,
0x77, 0x77, 0x77, 0x77, 0x60, 0x6e, 0xa0, 0x7, 0x0, 0xf0, 0x1f, 0xbb,
0xbb, 0x55, 0x55, 0x3, 0x12, 0x23, 0x23, 0x23, 0x70, 0x7, 0xdd, 0xdd,
0x20, 0xf, 0x5b, 0x1c, 0x5b, 0x5b, 0xfd, 0x60, 0x7, 0x0, 0x70, 0x1f,
0x70, 0x27, 0xaa, 0xaa, 0x8c, 0x20, 0x3f, 0x8b, 0x8b, 0x8b, 0x70, 0x7,
0x40, 0x4f, 0xc3, 0xc3, 0x60, 0xc3, 0x70, 0x7, 0x0, 0xf0, 0x1f, 0x11,
0x11, 0x11, 0x11, 0x2, 0x0, 0xf8, 0xf8, 0xf8, 0x11, 0x0, 0x11, 0x11,
0xa, 0xfe, 0x20, 0x7, 0x4a, 0x81, 0xa0, 0x7, 0x70, 0x17, 0x70, 0x27,
0xf0, 0x1f, 0xa, 0xf0, 0xf, 0x43, 0x12, 0x4c, 0x49, 0x4d, 0x7f, 0x9f,
0x28, 0x4, 0x5f, 0x1f, 0x69, 0x15, 0x6d, 0x61, 0x67, 0x3b, 0x8f, 0x10,
0x2d, 0x55, 0xa, 0x3f, 0xfb, 0xe0, 0x20, 0x17, 0x10, 0x19, 0x74, 0x7f,
0x10, 0x26, 0x72, 0x4f, 0x7f, 0xbb, 0xff, 0x37, 0xb, 0x10, 0x2, 0x2,
0x2, 0x7a, 0x4f, 0x1, 0xfe, 0x3, 0x0, 0x0, 0x62, 0x21, 0x21, 0x21,
0x33, 0x33, 0x33, 0x33, 0x0, 0xb6, 0x18, 0x18, 0x18, 0x33, 0x33, 0xff,
0xff, 0x10, 0x1, 0x3, 0x3, 0x2e, 0x41, 0x11, 0x1, 0x2, 0x30, 0xfd,
0x5f, 0xd8, 0x30, 0x7, 0x70, 0x17, 0x90, 0x1f, 0x50, 0x17, 0x0, 0x0,
0x1f, 0x73, 0x0, 0x0, 0x1f, 0x40, 0x10, 0x40, 0x3f, 0xbb, 0x33, 0x73,
0xaa, 0x1f, 0x1f, 0xd, 0x1f, 0xff, 0xff, 0xf7, 0x4a, 0xc7, 0x20, 0x5f,
0x11, 0x30, 0x5f, 0x6, 0x3, 0xff, 0x10, 0xff, 0x57, 0x27, 0xdc, 0x10,
0x25, 0x76, 0x5f, 0xe, 0x37, 0x0, 0x1f, 0x43, 0xd7, 0x7e, 0x4f, 0xf,
0x20, 0x1, 0xb3, 0xe7, 0x4, 0xf0, 0x7, 0x5e, 0xf0, 0x2e, 0xc8, 0x0,
0x0, 0x20, 0xf, 0x10, 0x25, 0x7a, 0x5f, 0x73, 0xef, 0x10, 0x2f, 0x73,
0xff, 0x1, 0x10, 0x0, 0xef, 0xe, 0x10, 0x2d, 0xb7, 0xff, 0xbc, 0x8,
0xce, 0x88, 0x8, 0x4a, 0x13, 0x13, 0x13, 0xff, 0x6f, 0x0, 0x0, 0x88,
0x70, 0x88, 0x5f, 0xef, 0x50, 0x7, 0x4, 0x0, 0x1f, 0x80, 0x88, 0x88,
0xa, 0x0, 0x37, 0x37, 0x37, 0xcb, 0xff, 0xec, 0xff, 0x42, 0x18, 0x16,
0x16, 0x16, 0x10, 0x25, 0x7f, 0xef, 0x10, 0x7, 0xf, 0x57, 0x7f, 0xff,
0x7f, 0x40, 0x6, 0x0, 0x2f, 0xff, 0xb7, 0xbb, 0x37, 0x33, 0x6a, 0xa,
0x0, 0xa, 0xa, 0xbb, 0xbb, 0x33, 0x33, 0x5, 0x2, 0x38, 0x2, 0x2,
0xff, 0xff, 0x70, 0x17, 0x2, 0x80, 0x1f, 0x7b, 0x33, 0x77, 0x1, 0x4e,
0x1f, 0x1f, 0x1f, 0xf7, 0xff, 0xf7, 0x10, 0x25, 0xd5, 0x67, 0x1, 0xe8,
0xff, 0x1, 0x6b, 0x11, 0x11, 0x11, 0x8f, 0xff, 0x44, 0xf, 0x2c, 0xef,
0x3, 0x3, 0x3, 0x5, 0x7d, 0x5f, 0x1e, 0xff, 0x18, 0x10, 0xff, 0x6b,
0x24, 0x57, 0x7d, 0xcf, 0xf, 0xff, 0x0, 0x7, 0xff, 0x20, 0x20, 0x20,
0x20, 0x10, 0x25, 0x89, 0x6f, 0x63, 0xef, 0x6, 0x73, 0xff, 0xc1, 0x73,
0xef, 0x7, 0x73, 0xff, 0x7f, 0xb3, 0x7f, 0x37, 0xa, 0x0, 0x28, 0xdf,
0x4, 0x31, 0x33, 0x9d, 0xd9, 0x21, 0x2e, 0x87, 0x11, 0x11, 0x1c, 0xdd,
0xdd, 0xa1, 0x0, 0x2e, 0x8f, 0x70, 0x17, 0x1, 0x20, 0x1f, 0x9d, 0x81,
0x80, 0x0, 0x2e, 0xcf, 0xdd, 0x7b, 0x31, 0x73, 0x4e, 0x1e, 0x1e, 0x41,
0x1e, 0x10, 0x25, 0xf3, 0xff, 0xcf, 0x1, 0xf, 0xf8, 0x40, 0xa3, 0xcf,
0x0, 0xf, 0x0, 0xf, 0xf, 0x82, 0x1b, 0x1b, 0x1b, 0xa0, 0x5, 0x28,
0xff, 0x10, 0x39, 0x5f, 0xfe, 0xff, 0xf0, 0xff, 0x22, 0x15, 0x16, 0x16,
0x16, 0x79, 0x6f, 0xf0, 0x20, 0xf, 0xa2, 0x20, 0xf, 0x84, 0x10, 0x15,
0x8f, 0xff, 0xf0, 0xff, 0x8, 0x4, 0xbf, 0xcf, 0xde, 0xff, 0x4, 0xce,
0xe, 0x1, 0x1, 0x1, 0xfb, 0xff, 0x88, 0xcc, 0x0, 0x8e, 0x88, 0xb,
0x34, 0x34, 0x34, 0xcc, 0xcc, 0x78, 0x88, 0x40, 0x7, 0xfc, 0x1f, 0x70,
0x17, 0x1, 0xf0, 0x1f, 0xf, 0xff, 0x80, 0xd0, 0x4b, 0xef, 0x20, 0x56,
0xe8, 0x30, 0x5f, 0xfd, 0xff, 0xfc, 0xff, 0x1f, 0x62, 0xf, 0xf, 0x2c,
0x85, 0x5, 0x5f, 0xff, 0x73, 0xef, 0x6, 0x23, 0xff, 0xc3, 0xef, 0x83,
0x10, 0x1, 0x73, 0xff, 0xb7, 0xdd, 0x37, 0x13, 0x6a, 0x2e, 0x2f, 0x2,
0xa9, 0x7f, 0x84, 0x0, 0x49, 0xbf, 0x33, 0x13, 0xdd, 0xfd, 0x39, 0xdf,
0x7b, 0xff, 0x75, 0x73, 0x5, 0xc2, 0x7f, 0x10, 0x6, 0xfe, 0xe7, 0x0,
0x23, 0xff, 0x7, 0x10, 0x7, 0xb3, 0xff, 0x1, 0x29, 0x91, 0xf8, 0x3e,
0x87, 0x7f, 0xff, 0x39, 0xa1, 0xc, 0xbe, 0x7f, 0x10, 0x5, 0xfd, 0xff,
0x7f, 0x0, 0xf, 0x22, 0xff, 0x20, 0xbf, 0xcf, 0xfe, 0xff, 0xee, 0x0,
0x38, 0xff, 0xcc, 0x8, 0xcc, 0xce, 0xcc, 0x61, 0x2c, 0xa8, 0xee, 0xee,
0xff, 0x38, 0xff, 0x1, 0x0, 0x2d, 0x17, 0x70, 0x17, 0x1, 0xf0, 0x1f,
0xff, 0xff, 0xf8, 0x20, 0xff, 0x4b, 0x28, 0xef, 0xcc, 0xee, 0xec, 0xfe,
0x63, 0x1e, 0x24, 0x24, 0x24, 0xf, 0xff, 0xff, 0x73, 0xef, 0x10, 0x14,
0x73, 0xff, 0x10, 0x8, 0xff, 0x67, 0x8, 0x80, 0xe7, 0xff, 0xce, 0xcc,
0xef, 0x88, 0x4b, 0x2c, 0x2c, 0x64, 0x2c, 0x3, 0x9e, 0x7f, 0x57, 0xff,
0xcc, 0x8c, 0x5e, 0xd7, 0xcb, 0xff, 0x1a, 0xe8, 0xff, 0x47, 0x10, 0x0,
0xad, 0x7f, 0x10, 0x26, 0x25, 0x17, 0x7f, 0xcf, 0xff, 0xef, 0x0, 0xff,
0xf, 0xa, 0x2, 0x2, 0x2, 0x17, 0x33, 0x10, 0x17, 0x11, 0x71, 0x20,
0x7, 0x11, 0x11, 0x11, 0x11, 0x7e, 0xa3, 0x4e, 0xaf, 0xdd, 0x17, 0x70,
0x17, 0x90, 0x1f, 0xde, 0xcf, 0x1, 0x70, 0x1f, 0xff, 0xd, 0x7d, 0x11,
0x71, 0x65, 0x20, 0x6f, 0xaf, 0xf, 0xf0, 0x5d, 0x8f, 0x54, 0xf7, 0xcf,
0xff, 0xfe, 0x2e, 0xc7, 0x42, 0x10, 0x24, 0x35, 0x37, 0xf, 0xff, 0x7,
0xf, 0x12, 0x3, 0x3, 0x3, 0xf0, 0xf, 0x0, 0x1d, 0x7, 0x3, 0xdd,
0x17, 0xd0, 0xf3, 0xef, 0xf3, 0xff, 0xf0, 0x23, 0xef, 0x82, 0x1d, 0x1d,
0x1d, 0xe0, 0x7f, 0xff, 0xf0, 0xf, 0x10, 0x4c, 0x3, 0xff, 0xf7, 0xff,
0x77, 0xa, 0x1, 0x0, 0x1, 0x1, 0x77, 0x77, 0x77, 0x77, 0xda, 0x8,
0x38, 0x8, 0x8, 0xff, 0xff, 0x70, 0x17, 0x0, 0xf0, 0x1f, 0xff, 0x7f,
0x77, 0x30, 0xf7, 0x7, 0x2a, 0xbf, 0x10, 0x2, 0x87, 0xff, 0xcf, 0xff,
0xf, 0xcb, 0xd4, 0x21, 0x7f, 0x0, 0x17, 0xff, 0x1, 0x6, 0xc7, 0xff,
0xf7, 0x10, 0xb, 0xeb, 0xff, 0x1, 0x0, 0x0, 0x13, 0x0, 0x62, 0x22,
0x22, 0x22, 0x33, 0x33, 0x3, 0x0, 0x0, 0x3, 0x29, 0x29, 0x29, 0xfe,
0x5f, 0x70, 0x17, 0xe0, 0x90, 0x1f, 0xde, 0x5f, 0x0, 0xf0, 0x1f, 0x1e,
0xff, 0x10, 0xff, 0x6b, 0x10, 0xa, 0xa, 0xa, 0x7f, 0xff, 0xf, 0xff,
0x0, 0xff, 0x8, 0x20, 0x20, 0x20, 0x20, 0x10, 0x0, 0xf, 0xff, 0xef,
0xff, 0xef, 0x40, 0xe, 0x0, 0x2f, 0x4f, 0xce, 0xc8, 0xce, 0x88, 0x4f,
0x2c, 0x0, 0x2c, 0x2c, 0x88, 0x88, 0xaa, 0xaa, 0x1b, 0x34, 0x38, 0x34,
0x34, 0xff, 0x77, 0x70, 0x17, 0x2, 0xa0, 0x1f, 0x8a, 0x17, 0x35, 0x1,
0x35, 0x35, 0xcc, 0xe8, 0x88, 0xe8, 0x4b, 0x20, 0x67, 0xbf, 0x0, 0x1f,
0xd7, 0xfe, 0x10, 0xc, 0xcf, 0xe7, 0x4, 0xfe, 0x5f, 0xf3, 0xef, 0x10,
0x0, 0x83, 0xff, 0x10, 0x16, 0x6f, 0x4f, 0xfe, 0x5f, 0x0, 0xa, 0x0,
0x8f, 0x0, 0xb, 0x37, 0x37, 0x37, 0x81, 0x4, 0x93, 0xff, 0x80, 0xff,
0x4b, 0x1f, 0x1f, 0x1f, 0x10, 0x27, 0x73, 0xff, 0xb3, 0x2f, 0xff, 0xee,
0x3f, 0xef, 0x20, 0x6, 0xee, 0x43, 0x0, 0x4d, 0xd7, 0x70, 0x17, 0xab,
0x0, 0xe0, 0x1f, 0xef, 0x0, 0x50, 0x3f, 0xfe, 0x2a, 0x3f, 0x22, 0x10,
0x27, 0x53, 0xe7, 0x10, 0x1, 0xdd, 0xc7, 0x0, 0xe9, 0xff, 0x1, 0x6b,
0xa, 0xa, 0xa, 0xf7, 0x1, 0x77, 0x77, 0x77, 0x5a, 0x8, 0x8, 0x8,
0x20, 0x6, 0x21, 0x77, 0xda, 0x20, 0x7, 0x0, 0x0, 0x70, 0x7, 0xbd,
0x2f, 0xf0, 0x70, 0x17, 0x90, 0x1f, 0xdd, 0x37, 0x70, 0x37, 0xff, 0xf7,
0x77, 0xf7, 0x8, 0x4e, 0xf, 0xf, 0xf, 0x8d, 0x67, 0x10, 0x0, 0xd0,
0x8, 0x43, 0x29, 0x29, 0x29, 0xff, 0xef, 0xfb, 0xff, 0xf1, 0x30, 0xff,
0xf, 0x45, 0x8f, 0x10, 0x25, 0xed, 0x1f, 0xf, 0xff, 0xff, 0x0, 0x1d,
0x3, 0x3, 0x3, 0xf0, 0xf, 0x3, 0x7d, 0x7, 0x2f, 0xfa, 0xf0, 0x0,
0x30, 0xf, 0x0, 0xf0, 0xff, 0xf0, 0xff, 0x82, 0x1d, 0x1d, 0x1d, 0xe8,
0x7f, 0xff, 0xf0, 0xf, 0x10, 0x2c, 0xa3, 0xff, 0x70, 0x10, 0x7, 0xc3,
0xff, 0xbf, 0xff, 0x3f, 0xc0, 0x5f, 0x7, 0x8f, 0xff, 0xf, 0xa, 0x2,
0x2, 0x2, 0x1, 0x0, 0xef, 0x13, 0x11, 0x82, 0x21, 0x21, 0x21, 0x11,
0x1c, 0x11, 0x11, 0x11, 0x0, 0x36, 0x7, 0x70, 0x17, 0x1, 0x0, 0x1f,
0x10, 0x11, 0x4, 0x11, 0xa, 0x37, 0x37, 0x37, 0xfa, 0x1f, 0x3d, 0xff,
0x1f, 0x71, 0xff, 0x8b, 0x20, 0x67, 0x95, 0xff, 0x26, 0x87, 0x2a, 0x5f,
0x10, 0x6, 0xf, 0x2f, 0x8, 0x0, 0xff, 0x8, 0xc, 0xa1, 0x87, 0xff,
0xdf, 0xff, 0x30, 0xcf, 0xe, 0x3b, 0xe4, 0xeb, 0xcf, 0xcc, 0xcc, 0xce,
0xcc, 0x0, 0x61, 0x20, 0x20, 0x20, 0xee, 0xee, 0xff, 0xff, 0x74, 0x1,
0x0, 0x28, 0x17, 0x70, 0x17, 0x0, 0x0, 0x1f, 0x80, 0xd0, 0x1f, 0xcc,
0xed, 0x1, 0xcc, 0xec, 0xaa, 0x1f, 0x1f, 0x1f, 0xf3, 0x27, 0xff, 0x63,
0x57, 0x3c, 0x1f, 0x6f, 0xff, 0xfe, 0xff, 0xfe, 0x10, 0x6, 0x7f, 0xff,
0x43, 0xef, 0xfc, 0xf3, 0xff, 0x3, 0xa9, 0xff, 0x0, 0x4a, 0x47, 0xf3,
0xef, 0x10, 0x6, 0x83, 0xff, 0xe, 0xef, 0x6f, 0xb7, 0xbb, 0x0, 0x37,
0x33, 0x6a, 0xa, 0xa, 0xa, 0xff, 0xef, 0xa7, 0x82, 0xf7, 0x10, 0x3c,
0xf7, 0x77, 0x77, 0x24, 0xe7, 0x2d, 0x17, 0x70, 0x7, 0x38, 0x0, 0x0,
0x77, 0x7, 0x57, 0xf, 0x70, 0x1f, 0xbb, 0xbb, 0x33, 0x30, 0x73, 0x5,
0x43, 0x2f, 0xd0, 0x1f, 0xbb, 0x7b, 0x33, 0xf7, 0x6a, 0xb, 0xad, 0x57,
0x20, 0x3f, 0x1, 0x3d, 0x4f, 0xfe, 0x2c, 0xf7, 0x4b, 0xda, 0xa4, 0xf7,
0xf, 0x73, 0xff, 0xf, 0x26, 0x88, 0x26, 0x5e, 0x20, 0x10, 0x15, 0xac,
0xf7, 0xf, 0x70, 0x16, 0xac, 0xe7, 0xf0, 0xf, 0x3, 0x96, 0xe7, 0xf0,
0xff, 0xa2, 0x16, 0x31, 0x16, 0x16, 0xf0, 0xf, 0x7, 0x8f, 0xff, 0xef,
0xff, 0xef, 0x30, 0x9c, 0x80, 0xff, 0xff, 0x8a, 0xcc, 0x8e, 0x88, 0xb,
0x34, 0x34, 0xf, 0x34, 0xcc, 0xcc, 0x88, 0x40, 0x7, 0xff, 0xff, 0x70,
0x17, 0x1, 0x0, 0x1f, 0x41, 0x8c, 0x0, 0x50, 0x3f, 0xc9, 0xff, 0xec,
0xff, 0x62, 0x7, 0xb1, 0x7, 0xc0, 0x10, 0x1e, 0x73, 0xff, 0x10, 0x1e,
0x70, 0x87, 0xbf, 0xff, 0x8f, 0x4f, 0xf, 0xf, 0x0, 0xf, 0x8, 0x8,
0x8c, 0x88, 0x62, 0x29, 0x29, 0x43, 0x29, 0xff, 0xff, 0x0, 0x0, 0x88,
0x88, 0x5e, 0xff, 0x50, 0x7, 0x80, 0x2, 0x0, 0x1f, 0x80, 0x0, 0xa8,
0xf, 0x36, 0x36, 0x36, 0x7, 0xfd, 0xff, 0xf8, 0xff, 0x43, 0x20, 0x67,
0x10, 0x27, 0x3, 0xef, 0xb, 0xee, 0x57, 0x1, 0x43, 0x4c, 0x49, 0x4d,
0xff, 0xfe, 0x14, 0x3f, 0xa5, 0x2, 0x2, 0x28, 0x80, 0x0, 0x0, 0x1,
0x2f, 0xfb, 0x69, 0x8, 0x6d, 0x61, 0x67, 0x10, 0x3f, 0xb8, 0x1, 0x0,
0x1, 0x70, 0xa, 0x54, 0x83, 0x44, 0xc9, 0x4, 0x30, 0x5, 0x1f, 0xa2,
0xff, 0x11, 0x0, 0x7d, 0x17, 0x17, 0x17, 0xcc, 0xdc, 0x55, 0x55, 0x0,
0xc9, 0x3d, 0x3d, 0x3d, 0xff, 0xf0, 0xf, 0xf, 0x60, 0x70, 0x20, 0x7,
0x3f, 0xb9, 0x2, 0xf8, 0xf8, 0xf8, 0x1b, 0x1, 0xff, 0x71, 0xff, 0x59,
0x14, 0x14, 0x14, 0x85, 0x4f, 0x1, 0xf0, 0xf0, 0xf0, 0xe4, 0x91, 0x91,
0x91, 0x10, 0x7, 0xff, 0xdf, 0x0, 0xbf, 0x93, 0x3f, 0x37, 0x18, 0x4,
0x4, 0x4, 0xc0, 0x7f, 0xff, 0x2f, 0x16, 0xf, 0x70, 0x8, 0x8, 0x8,
0x99, 0x0, 0x99, 0x55, 0x55, 0xed, 0x2c, 0x2c, 0x2c, 0x2a, 0x10, 0xf1,
0x11, 0xff, 0x31, 0xe7, 0xf0, 0xff, 0x0, 0x0, 0x40, 0x22, 0x21, 0xc3,
0xf, 0xff, 0xf0, 0xf0, 0x8c, 0xd3, 0x3c, 0xd3, 0xd3, 0x10, 0xf, 0xd,
0xb7, 0xe3, 0xef, 0xf3, 0xff, 0x83, 0xef, 0x77, 0x7f, 0x20, 0x77, 0x12,
0x2f, 0xf7, 0x3, 0x55, 0x50, 0x77, 0xcd, 0x0, 0x7e, 0x7e, 0x7e, 0x9d,
0xee, 0x55, 0x11, 0xa5, 0x82, 0x20, 0x7, 0xff, 0x7f, 0x77, 0x77, 0x26,
0x22, 0x67, 0xff, 0x20, 0xff, 0xf7, 0x4f, 0xff, 0xcc, 0x8c, 0x11, 0x11,
0xed, 0x0, 0x9e, 0x9e, 0x9e, 0xae, 0x51, 0x10, 0xf5, 0xb9, 0x10, 0x3b,
0x3b, 0x3b, 0xff, 0xff, 0xfb, 0xff, 0xf3, 0xff, 0x41, 0x62, 0x29, 0xaf,
0x7f, 0x93, 0x7f, 0x37, 0xb8, 0x2d, 0xb7, 0x90, 0x20, 0x36, 0x77, 0x6,
0x2f, 0xff, 0x77, 0xff, 0x77, 0x77, 0x40, 0x66, 0x22, 0xaf, 0x95, 0xea,
0x57, 0x1, 0xb1, 0x5d, 0x0, 0x5d, 0x5d, 0x0, 0x0, 0xdd, 0xdd, 0xe1,
0x9f, 0x35, 0x9f, 0x9f, 0x40, 0x17, 0x29, 0xdf, 0xf7, 0x20, 0x5f, 0x22,
0x3d, 0xe4, 0x5c, 0x40, 0x50, 0x17, 0xaa, 0xf0, 0x5f, 0x20, 0x40, 0x35,
0x2b, 0x7b, 0xff, 0x10, 0x73, 0xff, 0x82, 0x2a, 0xf, 0xc3, 0xd1, 0x1f,
0x13, 0x0, 0x98, 0x2a, 0x2a, 0x2a, 0x77, 0x77, 0x77, 0x77, 0x60, 0x6e,
0x2f, 0xff, 0x70, 0x3f, 0x33, 0x73, 0xdd, 0xdd, 0x81, 0x0, 0x8f, 0x8f,
0x8f, 0x4a, 0xd5, 0x50, 0x57, 0xad, 0x8, 0x3c, 0x3c, 0x3c, 0x7f, 0x20,
0xd7, 0x2a, 0x1, 0x1, 0x41, 0x1, 0x70, 0x67, 0x9d, 0xea, 0x57, 0x11,
0xa9, 0x20, 0xdf, 0xe0, 0x70, 0x67, 0x70, 0x77, 0x7f, 0xff, 0x8e, 0x54,
0x10, 0xf7, 0xd5, 0x80, 0x2a, 0x67, 0x55, 0xa8, 0x7f, 0x15, 0xb5, 0x2b,
0x2b, 0x2e, 0x2b, 0xf7, 0x20, 0x60, 0x2e, 0x30, 0x3f, 0x21, 0x7, 0x30,
0xa7, 0x35, 0x8, 0x22, 0x55, 0x11, 0x85, 0x20, 0x5f, 0xaa, 0x1b, 0x11,
0x4, 0x51, 0x8d, 0x8e, 0x8e, 0x8e, 0xff, 0xff, 0x39, 0x7b, 0x0, 0x73,
0xf3, 0xcc, 0x61, 0x61, 0x61, 0xff, 0x7f, 0x38, 0xff, 0x7f, 0x31, 0x4f,
0x7f, 0xff, 0x70, 0x47, 0x93, 0x9b, 0x37, 0x6, 0x33, 0xd8, 0x38, 0x38,
0x38, 0x70, 0x47, 0x21, 0x16, 0x77, 0x41, 0x2e, 0x23, 0xc7, 0x7f, 0xf7,
0x77, 0xff, 0x3, 0x20, 0xa7, 0x10, 0x0, 0x0, 0x5d, 0x50, 0xff, 0x59,
0x11, 0x75, 0xad, 0xc0, 0x31, 0x7f, 0xe3, 0xef, 0x39, 0xff, 0x73, 0xf7,
0xf0, 0x51, 0x30, 0x51, 0x51, 0x73, 0xff, 0xb3, 0xef, 0x6c, 0xd4, 0xd4,
0xd4, 0x80, 0x73, 0xff, 0x23, 0x10, 0xc4, 0xfd, 0xa1, 0xcf, 0xcf, 0x57,
0xcf, 0x31, 0x1f, 0x96, 0x61, 0x7f, 0xa6, 0x4b, 0x2f, 0x51, 0x77, 0x0,
0x70, 0xff, 0xf7, 0x71, 0x77, 0x71, 0xc7, 0x71, 0x77, 0x71, 0x67, 0xc1,
0x61, 0x77, 0x71, 0x67, 0x81, 0x3f, 0x80, 0x61, 0xe7, 0xe, 0x15, 0x50,
0x77, 0xb5, 0x28, 0x28, 0x5a, 0x28, 0x21, 0xe7, 0x11, 0x31, 0xe7, 0x20,
0xd7, 0xf7, 0xb1, 0x5f, 0x1d, 0x0, 0x3c, 0x31, 0xf1, 0xb0, 0xa2, 0xa2,
0xa2, 0xb7, 0x83, 0x22, 0x1f, 0x78, 0x15, 0x15, 0x15, 0x7f, 0x22, 0x1f,
0x30, 0xf7, 0x8d, 0x82, 0x1f, 0xaa, 0x57, 0x11, 0x30, 0xf7, 0x22, 0x1f,
0x5d, 0x42, 0x1f, 0xc2, 0x61, 0x77, 0x7f, 0x87, 0x22, 0x53, 0x11, 0x55,
0x31, 0x7f, 0xbd, 0x1, 0x39, 0x33, 0x73, 0xd8, 0x83, 0x83, 0x83, 0x31,
0x67, 0xc0, 0x42, 0x5f, 0x62, 0x7, 0x9f, 0xe9, 0x97, 0x1f, 0x30, 0x5,
0x1, 0x5, 0x5, 0xfb, 0xff, 0x1d, 0x11, 0x85, 0x21, 0x9f, 0x60, 0x7f,
0x22, 0x38, 0xbf, 0xbf, 0x9d, 0x3c, 0x31, 0x71, 0xd4, 0x0, 0xa3, 0xa3,
0xa3, 0xf7, 0x6f, 0xf7, 0x1f, 0x22, 0xda, 0x32, 0x17, 0x22, 0xf7, 0x7,
0x32, 0x1f, 0x20, 0xa7, 0x66, 0x2f, 0xfc, 0xe1, 0x0, 0xdd, 0x1f, 0x11,
0xb4, 0x6b, 0x6b, 0x6b, 0xee, 0x1, 0x50, 0x11, 0xf1, 0xb5, 0x6c, 0x6c,
0x6c, 0xff, 0xff, 0x40, 0x79, 0x32, 0xdf, 0x16, 0x16, 0x16, 0xff, 0x83,
0xff, 0x31, 0x1f, 0x14, 0x22, 0xdf, 0xf0, 0x3f, 0xa5, 0xaa, 0x1d, 0x40,
0xbf, 0x0, 0x1d, 0x1e, 0x11, 0xf1, 0xd0, 0xb4, 0xb4, 0xb4, 0x83, 0xff,
0xff, 0x99, 0x99, 0x99, 0x99, 0x23, 0xa0, 0x7, 0x5, 0x0, 0x1f, 0xa0,
0x97, 0xef, 0xbf, 0x0, 0x33, 0xff, 0x7f, 0xb7, 0x0, 0x88, 0x13, 0x10,
0xf5, 0xf5, 0xf5, 0x21, 0xf9, 0xbb, 0x1d, 0xf9, 0xf9, 0x2, 0xf9, 0xcf,
0xed, 0xe0, 0xec, 0x94, 0x27, 0xff, 0xef, 0x10, 0xfe, 0xee, 0xee, 0x33,
0xf7, 0x3b, 0xf7, 0x88, 0x0, 0x0, 0x86, 0xe2, 0xe2, 0xe2, 0x0, 0x1f,
0x1f, 0xf0, 0x0, 0xe, 0xfd, 0xfd, 0xfd, 0x3e, 0xf0, 0xe, 0xe, 0x41,
0x8c, 0x23, 0xbf, 0xff, 0x1f, 0x0, 0x10, 0x7, 0x28, 0x2b, 0x0, 0xfe,
0xbf, 0xf0, 0x3f, 0x68, 0x40, 0x40, 0x40, 0x0, 0xc3, 0x1, 0x17, 0x13,
0xb4, 0x6e, 0x6e, 0x6e, 0x4, 0xfe, 0xe3, 0xf0, 0xf, 0x8c, 0x21, 0x97,
0xe1, 0x0, 0x0, 0xf, 0x8f, 0x80, 0xdf, 0xdf, 0xdf, 0x0, 0xb7, 0x10,
0x1, 0x80, 0x26, 0x2f, 0xfc, 0x57, 0xbb, 0x80, 0xaa, 0x0, 0x35, 0xe7,
0xe7, 0xe7, 0x0, 0xe3, 0xf0, 0xe0, 0x0, 0x10, 0xfa, 0xfa, 0xfa, 0xf1,
0xff, 0xf0, 0xff, 0x40, 0x93, 0x21, 0x47, 0xb9, 0xf7, 0x8c, 0x0, 0x35,
0xea, 0x1, 0xea, 0xea, 0x0, 0xde, 0xff, 0x10, 0x6, 0x2f, 0xfc, 0x0,
0xde, 0x3c, 0xce, 0xe, 0x54, 0x6, 0x6, 0x6, 0x0, 0x32, 0x33, 0xe,
0x0, 0x13, 0xf7, 0xf7, 0xf7, 0x5, 0x1c, 0x79, 0x71, 0xf3, 0xd0, 0x22,
0x2f, 0xff, 0x26, 0xef, 0x0, 0x68, 0x4e, 0x4e, 0x4e, 0x1f, 0x3c, 0x70,
0xf0, 0xc, 0x54, 0xe6, 0xe6, 0xe6, 0x70, 0xf, 0x78, 0xc7, 0x80, 0xb3,
0x19, 0x88, 0x88, 0x32, 0x20, 0x9f, 0x20, 0x97, 0x0, 0x6, 0x28, 0xc3,
0x4, 0xe1, 0xc1, 0xe0, 0xee, 0xb4, 0x22, 0x67, 0xcc, 0x4c, 0x10, 0xbb,
0xbb, 0xd, 0x20, 0x6f, 0x7b, 0x0, 0x8, 0xff, 0x0, 0x22, 0xf1, 0xf1,
0xf1, 0xee, 0x1e, 0xfe, 0xe, 0x0, 0x8f, 0x1e, 0x1e, 0x1e, 0x3e, 0x0,
0xf, 0xef, 0x0, 0x80, 0xaf, 0xaf, 0xaf, 0x0, 0x7e, 0x10, 0x11, 0x80,
0x30, 0x9f, 0x45, 0x80, 0x91, 0x88, 0x35, 0xfc, 0xfc, 0x2, 0xfc, 0xcc,
0xe0, 0x0, 0xf0, 0x6f, 0x20, 0x77, 0xc1, 0x8, 0xef, 0xe0, 0xee, 0xd0,
0x20, 0xd7, 0x88, 0x44, 0xbb, 0x0, 0x19, 0x15, 0xfb, 0xfb, 0xfb, 0x0,
0x0, 0x8, 0x21, 0xdd, 0x22, 0x35, 0x3f, 0x10, 0xee, 0xe, 0x58, 0x27,
0x87, 0x4, 0xce, 0xcc, 0xf, 0x0, 0x4b, 0x20, 0x9f, 0x1e, 0x7c, 0x0,
0x70, 0xf0, 0x70, 0xe5, 0xe5, 0xe5, 0xb7, 0xc3, 0x10, 0x37, 0x1f, 0x34,
0x20, 0xb7, 0x10, 0xff, 0xff, 0xf0, 0x41, 0x10, 0x29, 0x57, 0xc1, 0xe1,
0x1f, 0x7, 0x70, 0x24, 0x3f, 0x0, 0xe9, 0xfe, 0x3, 0x0, 0x86, 0xdb,
0xdb, 0xdb, 0x6, 0x4c, 0xa0, 0x0, 0xea, 0x79, 0x20, 0xf7, 0x79, 0x77,
0xbd, 0x0, 0xb8, 0x70, 0x33, 0x78, 0xc5, 0xc5, 0xc5, 0xbb, 0x8, 0x5b,
0xaa, 0xaa, 0x51, 0x20, 0x3f, 0x39, 0xff, 0xc, 0x0, 0x0, 0x33, 0xf6,
0xf6, 0xf6, 0x11, 0x31, 0x55, 0x0, 0x45, 0x3d, 0x19, 0x19, 0x19, 0xcb,
0x0, 0x7, 0x0, 0xff, 0x80, 0xbf, 0xbf, 0xbf, 0xce, 0x3c, 0x10, 0x0,
0x71, 0x74, 0xe9, 0xe9, 0xe9, 0x8, 0xff, 0x73, 0x4, 0xf, 0x50, 0x18,
0x18, 0x18, 0x21, 0x77, 0xf0, 0xa, 0xc2, 0x31, 0xaf, 0x29, 0xc8, 0xd0,
0x48, 0x48, 0x48, 0x77, 0xef, 0xbf, 0x1, 0x93, 0x80, 0xc8, 0x3a, 0xf4,
0xf4, 0xf4, 0xf4, 0xf, 0x6, 0xf5, 0x5f, 0xa8, 0x8a, 0x31, 0x20, 0x9f,
0x2f, 0x3f, 0xc, 0x41, 0xc4, 0x21, 0x8f, 0xfe, 0xef, 0xfe, 0xef, 0x26,
0x2f, 0xff, 0x4, 0x1e, 0x3c, 0x8f, 0xe, 0x90, 0x25, 0x1f, 0x0, 0x10,
0x10, 0x0, 0x70, 0x67, 0x21, 0x17, 0x3c, 0xfd, 0xf1, 0xf1, 0x8, 0xa4,
0x70, 0x70, 0x70, 0x7a, 0x17, 0x3c, 0xfc, 0x70, 0x4, 0xf1, 0x88, 0xb2,
0xb2, 0xb2, 0x91, 0x67, 0xf, 0xb0, 0xe0, 0x46, 0x3f, 0x61, 0x87, 0x71,
0x67, 0xdc, 0x1, 0x11, 0x11, 0x2a, 0x82, 0x2a, 0x33, 0x80, 0x0, 0x89,
0x88, 0x3a, 0x2f, 0xfc, 0x1f, 0x0, 0xe8, 0x80, 0xee, 0xb9, 0xc6, 0xc6,
0xc6, 0xd9, 0x0, 0xee, 0xea, 0xee, 0xad, 0x60, 0x60, 0x60, 0x87, 0x8,
0xbe, 0x88, 0x30, 0x6c, 0x20, 0xe7, 0x87, 0xfe, 0x1f, 0x0, 0x0, 0xd1,
0xad, 0xad, 0xad, 0xff, 0xc6, 0xee, 0x27, 0xf, 0x90, 0x23, 0xf7, 0x37,
0x33, 0x21, 0x3f, 0x20, 0xd7, 0x2f, 0x7f, 0x0, 0xe8, 0x37, 0xfe, 0xfe,
0xfe, 0x15, 0x19, 0xa0, 0x20, 0xaa, 0x79, 0x24, 0xbf, 0x0, 0x38, 0xff,
0x70, 0x14, 0x84, 0x21, 0x6f, 0x12, 0x11, 0x54, 0x55, 0x31, 0x7, 0x1b,
0xf7, 0x10, 0x8e, 0x0, 0x39, 0x22, 0x1f, 0xef, 0x9e, 0x0, 0x30, 0x41,
0x32, 0x22, 0xa7, 0x8b, 0x83, 0x37, 0x7, 0xcc, 0x44, 0x1f, 0x20, 0xee,
0xdf, 0x40, 0xa7, 0x16, 0x71, 0xcf, 0xb0, 0x52, 0x1, 0x52, 0x52, 0x3c,
0x0, 0xe, 0x8, 0xa4, 0x21, 0x2f, 0x0, 0x3c, 0xfc, 0xf0, 0xf1, 0x8c,
0xc2, 0xc2, 0xc2, 0x0, 0x3c, 0x78, 0x8f, 0xe, 0xb0, 0x4d, 0x4d, 0x4d,
0x4, 0xef, 0x3e, 0x0, 0x70, 0x70, 0x21, 0x3f, 0x7a, 0xef, 0x0, 0xf0,
0xff, 0x2f, 0x9, 0x9, 0x9, 0x33, 0x52, 0x10, 0x0, 0xf0, 0x67, 0x22,
0x6f, 0x3c, 0xbb, 0xf0, 0x33, 0x0, 0xa4, 0x50, 0x50, 0x50, 0x3e, 0xf0,
0xf, 0xe, 0x41, 0x90, 0x20, 0x27, 0xff, 0x3f, 0x0, 0x70, 0xa, 0x21,
0x7f, 0x4, 0xc3, 0xf3, 0x1f, 0x7, 0xa8, 0x22, 0xc7, 0xff, 0xef, 0x82,
0x52, 0x47, 0x7c, 0xff, 0xf0, 0xf7, 0x80, 0x20, 0x27, 0x9f, 0x8, 0xe3,
0x3f, 0xf, 0x30, 0x21, 0x7f, 0x3c, 0x78, 0x70, 0x20, 0xf3, 0xb0, 0x21,
0x17, 0xc3, 0xe1, 0xf, 0xf, 0x90, 0x84, 0x2b, 0x4f, 0x1, 0x0, 0x3,
0xff, 0x32, 0x17, 0xc3, 0xe1, 0x11, 0xe0, 0xf8, 0x90, 0x31, 0x2f, 0xa3,
0x0, 0xe0, 0x31, 0xc7, 0x6, 0xc3, 0xfe, 0xf8, 0xfe, 0xac, 0x20, 0x5f,
0x9, 0x27, 0xff, 0xff, 0xec, 0xbb, 0xef, 0xf0, 0xf, 0x81, 0xef, 0xf,
0x53, 0x57, 0x0, 0x0, 0xf, 0x0, 0xf0, 0x2, 0xf, 0x98, 0x84, 0x84,
0x84, 0xff, 0x2a, 0x91, 0x42, 0x0, 0xe3, 0xe3, 0xe3, 0xff, 0x30, 0xf0,
0x8f, 0x8c, 0x0, 0x82, 0x82, 0x82, 0x78, 0xf7, 0xe, 0x0, 0x8c, 0x0,
0xbe, 0xbe, 0xbe, 0x0, 0x0, 0xfe, 0xf0, 0x1c, 0xae, 0x24, 0x57, 0xf0,
0x23, 0xef, 0x42, 0x28, 0x17, 0x41, 0xdf, 0x23, 0x67, 0x38, 0x0, 0xbb,
0x73, 0x77, 0xd6, 0x44, 0x44, 0x44, 0xff, 0xc, 0x0, 0xff, 0xf, 0x1c,
0x2a, 0xd7, 0x2a, 0xd1, 0x0, 0xb3, 0x0, 0xe8, 0xe8, 0xe8, 0x9b, 0xcb,
0x37, 0x17, 0xd4, 0x10, 0x3a, 0x3a, 0x3a, 0x71, 0x57, 0x80, 0xf7, 0xf0,
0xf0, 0x68, 0x30, 0x38, 0xa7, 0x2a, 0xef, 0xc8, 0x23, 0xff, 0x87, 0x87,
0xf0, 0x38, 0xf0, 0x90, 0x4a, 0xd7, 0xe0, 0x97, 0x2c, 0xb7, 0x8c, 0x80,
0x80, 0x44, 0x80, 0x0, 0x10, 0xf, 0xff, 0xf, 0x93, 0x4d, 0x5e, 0xf,
0xff, 0x6e, 0xe0, 0x28, 0x6f, 0x0, 0x0, 0xf, 0xf0, 0x23, 0xef, 0x20,
0x77, 0x23, 0xb6, 0xff, 0xd, 0x60, 0x30, 0x30, 0x30, 0x0, 0x0, 0xf,
0x24, 0x78, 0xc, 0x50, 0x9f, 0x3e, 0xff, 0xa2, 0x30, 0xdf, 0xe0, 0xf,
0x2f, 0xf8, 0x43, 0xef, 0x21, 0x6, 0xf, 0x60, 0xd4, 0x3d, 0x57, 0x63,
0xff, 0x30, 0x7c, 0x8e, 0xe, 0x70, 0x14, 0x1a, 0x1a, 0x1a, 0x2f, 0xf9,
0x7f, 0x3d, 0x67, 0x5f, 0x99, 0x1c, 0x0, 0x88, 0x71, 0x34, 0xe7, 0x34,
0x87, 0x2d, 0x77, 0x8f, 0x70, 0x10, 0x0, 0xf7, 0xf9, 0x26, 0x67, 0xcc,
0xcc, 0xaa, 0xaa, 0x60, 0x31, 0x2d, 0x87, 0x70, 0x7, 0xaa, 0xaa, 0x77,
0x77, 0xb2, 0x14, 0x20, 0x20, 0x20, 0x30, 0x7, 0x96, 0x20, 0x7, 0x77,
0xa1, 0x0, 0x88, 0xf8, 0x95, 0xd6, 0xd6, 0xd6, 0x9, 0xff, 0x10, 0xec,
0xf, 0x90, 0x27, 0x57, 0xbb, 0x72, 0x66, 0xf6, 0xe, 0x11, 0x2, 0x2,
0x2, 0x0, 0x37, 0xff, 0x3b, 0xef, 0x8b, 0xff, 0x38, 0x2, 0x70, 0x70,
0x78, 0xd5, 0xd5, 0xd5, 0x7f, 0xff, 0x87, 0x8, 0xf7, 0xf, 0xf, 0x6c,
0x20, 0x8f, 0xff, 0xdf, 0x77, 0x24, 0x57, 0xd, 0x2c, 0x47, 0x83, 0xc3,
0x73, 0x47, 0xb8, 0xbb, 0xb9, 0x3e, 0x7, 0x87, 0x21, 0x67, 0x3c, 0x2f,
0x2f, 0xf9, 0x80, 0x6, 0x2e, 0x17, 0x43, 0xcf, 0x21, 0x77, 0x88, 0x90,
0x90, 0x90, 0x1, 0x1, 0xff, 0x2e, 0x2f, 0x70, 0x88, 0x31, 0x77, 0x8a,
0x6f, 0xd0, 0xf, 0x7f, 0x7f, 0xf, 0xf, 0x0, 0x10, 0x7, 0x7, 0x7,
0xf8, 0x0, 0xd, 0xff, 0x41, 0x2, 0x25, 0x7f, 0xff, 0x7c, 0xff, 0xf,
0x10, 0x2a, 0x17, 0x50, 0x78, 0x22, 0x50, 0x82, 0x25, 0x17, 0x33, 0x91,
0x0, 0xc8, 0x65, 0x37, 0x24, 0xf7, 0x28, 0x79, 0xaa, 0x3d, 0x3a, 0x8f,
0x3c, 0x53, 0xff, 0x6, 0x2b, 0x62, 0x60, 0x66, 0x59, 0x2c, 0xef, 0x81,
0x1f, 0xac, 0xa1, 0x91, 0x1f, 0x92, 0x21, 0x1f, 0xff, 0x6f, 0x66, 0x66,
0x30, 0xc7, 0x0, 0xcb, 0xe9, 0xec, 0xfc, 0xac, 0x71, 0x71, 0x71, 0x6,
0x9f, 0x3c, 0x8f, 0x8f, 0x54, 0x2d, 0xf, 0x3a, 0x47, 0xa2, 0x84, 0x3f,
0xff, 0x5c, 0xff, 0xf, 0x8b, 0x25, 0xe7, 0x8, 0x0, 0x10, 0x3f, 0x33,
0xb, 0x2f, 0xfc, 0x3c, 0x9b, 0x70, 0x33, 0x9, 0xb4, 0xb6, 0xb6, 0xb6,
0x24, 0x27, 0xff, 0xa0, 0x25, 0x57, 0x4, 0x10, 0xdd, 0xff, 0x11, 0x2,
0x2f, 0xfc, 0xc1, 0x7f, 0x0, 0x3, 0x0, 0xac, 0xce, 0xce, 0xce, 0xc4,
0xc4, 0x10, 0xbb, 0x13, 0x3, 0x2f, 0xfc, 0xcc, 0xa0, 0x0, 0xf0, 0x41,
0x57, 0x25, 0x47, 0xea, 0xf0, 0xee, 0xa, 0x95, 0x20, 0x2f, 0x4, 0xbf,
0xb8, 0x30, 0x71, 0x34, 0x22, 0x97, 0x7, 0x33, 0x14, 0x5f, 0x0, 0xd5,
0x32, 0xcf, 0x10, 0x51, 0xbf, 0x1, 0x0, 0x22, 0xff, 0xfe, 0x47, 0x3f,
0x87, 0x80, 0xf0, 0x30, 0x1f, 0xf5, 0xa0, 0x26, 0xcf, 0x47, 0x2a, 0xf7,
0x83, 0xc1, 0xe0, 0xf8, 0xb4, 0x12, 0xc3, 0xc3, 0xc3, 0x7, 0xfb, 0xff,
0xff, 0x7f, 0x57, 0x17, 0xdf, 0x8, 0x9d, 0xcf, 0xcc, 0x98, 0x2f, 0xef,
0x88, 0x88, 0xaa, 0x36, 0xaa, 0xe5, 0x2f, 0xe7, 0x31, 0xb0, 0xe4, 0x41,
0xe7, 0x5f, 0xff, 0xc9, 0xe, 0xfc, 0xe8, 0xff, 0xc9, 0x31, 0x5f, 0x0,
0x63, 0xff, 0x30, 0x3f, 0xb8, 0x84, 0xa0, 0x3f, 0xff, 0xe0, 0xf0, 0xe0,
0x31, 0xff, 0x3c, 0x39, 0x10, 0x8e, 0x8c, 0xb8, 0x2c, 0xf, 0xad, 0xff,
0xa8, 0xff, 0x0, 0xc3, 0x24, 0x24, 0x24, 0xff, 0xfe, 0xff, 0xee, 0x41,
0xe, 0x2b, 0x77, 0x8, 0x0, 0x88, 0xff, 0x62, 0x27, 0x77, 0x4, 0x10,
0xff, 0x11, 0x11, 0x4a, 0x27, 0xcf, 0xae, 0xd9, 0x10, 0xaf, 0x8a, 0xa9,
0x26, 0x67, 0xdb, 0x55, 0xaa, 0xaa, 0x41, 0x6d, 0x25, 0xa7, 0x1, 0x0,
0x11, 0x1, 0x46, 0x27, 0x97, 0x42, 0x37, 0x26, 0xbf, 0x78, 0xec, 0xec,
0xec, 0x20, 0x16, 0xaa, 0x0, 0x8d, 0xb1, 0xb1, 0xb1, 0xd9, 0xed, 0xcc,
0xec, 0x41, 0xd4, 0x23, 0x8f, 0xcb, 0xfd, 0xe8, 0xfc, 0xa8, 0x45, 0x47,
0xbf, 0x57, 0xff, 0xfe, 0x20, 0x58, 0x3f, 0xff, 0x70, 0xc7, 0xf3, 0xff,
0x70, 0xd7, 0x80, 0x87, 0xa, 0xcf, 0xff, 0xf, 0x87, 0x53, 0xff, 0xef,
0x43, 0xff, 0xdf, 0x20, 0xff, 0xcf, 0x3f, 0xff, 0xcb, 0xdd, 0xab, 0xaa,
0xa5, 0x86, 0x36, 0xef, 0xff, 0xdc, 0xf0, 0xa, 0x27, 0xf7, 0x2f, 0x2f,
0xff, 0x40, 0x93, 0x27, 0x5f, 0x99, 0xa9, 0xaa, 0xea, 0xa5, 0x81, 0x1,
0x81, 0x81, 0xf9, 0xff, 0xf8, 0xff, 0x63, 0x5a, 0x77, 0xa1, 0x73, 0xff,
0xdb, 0x43, 0xff, 0x9f, 0xff, 0x8f, 0x87, 0x29, 0xff, 0x4, 0xba, 0xbb,
0xae, 0xaa, 0x85, 0x2d, 0x37, 0x80, 0xff, 0x40, 0xfd, 0x47, 0xef, 0xf0,
0x58, 0xff, 0x8e, 0xc9, 0x31, 0x3, 0x31, 0x31, 0xdd, 0xfa, 0xaa, 0xfa,
0x30, 0x57, 0x30, 0xa7, 0x82, 0x3c, 0xcf, 0x38, 0x7b, 0x8c, 0x88, 0xc8,
0x52, 0x37, 0x11, 0x40, 0x26, 0x2d, 0x7f, 0xde, 0xdc, 0xef, 0xce, 0x58,
0x13, 0x0, 0x13, 0x13, 0xba, 0x55, 0xae, 0x8a, 0x8d, 0xa1, 0x1, 0xa1,
0xa1, 0x32, 0x33, 0xdd, 0x1d, 0x43, 0x44, 0x47, 0x10, 0x11, 0x11, 0xca,
0x24, 0xff, 0x33, 0x33, 0xaa, 0xaa, 0x42, 0x59, 0x2f, 0xb7, 0x55, 0xab,
0xa8, 0xaa, 0x30, 0x1f, 0x1e, 0x8, 0x3e, 0x11, 0xf0, 0x70, 0x23, 0xc7,
0x8f, 0x78, 0x8f, 0x20, 0xf, 0x74, 0x23, 0x47, 0x9d, 0xec, 0xa8, 0xfe,
0xc5, 0xc8, 0x29, 0x6f, 0x91, 0x5f, 0xab, 0x33, 0x3b, 0x1c, 0x0, 0x10,
0x10, 0x22, 0x11, 0x2a, 0x2f, 0xec, 0xae, 0xdd, 0xaf, 0x40, 0xd7, 0xaa,
0xc1, 0x21, 0x5f, 0x31, 0x47, 0xff, 0x0, 0x11, 0x11, 0x56, 0x25, 0x57,
0xb4, 0x21, 0x67, 0xdc, 0x38, 0xbf, 0xa0, 0x5f, 0xea, 0x30, 0x7f, 0x7f,
0xa1, 0x0, 0x0, 0xf8, 0x59, 0xeb, 0xeb, 0xeb, 0x85, 0xff, 0x10, 0xe8,
0xff, 0xcd, 0x20, 0xbf, 0xcd, 0xed, 0xec, 0xfe, 0x68, 0xcc, 0x20, 0xc7,
0x0, 0x35, 0xff, 0x23, 0x2e, 0x2b, 0xde, 0x9d, 0xce, 0xfd, 0xc2, 0x3f,
0xf3, 0xff, 0x81, 0xff, 0x7f, 0xff, 0x21, 0x6f, 0x3d, 0xb7, 0xbc, 0x32,
0x1f, 0x10, 0x5c, 0x5c, 0x5c, 0x7f, 0xff, 0xef, 0xde, 0xef, 0xce, 0x66,
0x16, 0x2d, 0x97, 0x29, 0x97, 0x10, 0x26, 0x32, 0x1f, 0x20, 0xa7, 0x5a,
0x82, 0x29, 0xef, 0x9e, 0xd9, 0xae, 0x8a, 0xb1, 0x25, 0xc7, 0x3b, 0x82,
0x61, 0x7, 0xee, 0xee, 0x11, 0x11, 0x83, 0x29, 0x3f, 0x0, 0x8, 0x1e,
0x11, 0xf0, 0xac, 0x22, 0x1f, 0xd5, 0xaa, 0xaa, 0x25, 0xea, 0x8d, 0x27,
0xdf, 0xdd, 0xea, 0x51, 0x67, 0x1e, 0x2a, 0x47, 0x44, 0x80, 0x34, 0xf,
0xef, 0xff, 0xef, 0x3e, 0x67, 0xed, 0xff, 0x1d, 0xec, 0xff, 0x62, 0xaf,
0xff, 0x78, 0x7, 0x2f, 0xf9, 0xfd, 0x3e, 0xff, 0x6, 0xdf, 0x9c, 0xcf,
0xce, 0x58, 0x2e, 0x97, 0x72, 0xff, 0x97, 0x8, 0xc3, 0xc0, 0xe8, 0x94,
0x25, 0x27, 0xfe, 0x70, 0xff, 0x0, 0xe, 0xb3, 0x35, 0x35, 0x35, 0x8d,
0xfe, 0xa8, 0x61, 0xff, 0x41, 0x5f, 0x60, 0xb7, 0x78, 0x0, 0xe, 0x1c,
0x3a, 0xc7, 0x5, 0xcc, 0xa4, 0x0, 0xf0, 0x2f, 0x28, 0xa7, 0xda, 0x62,
0x37, 0x83, 0x72, 0x27, 0xc3, 0xfd, 0xf8, 0xfc, 0xa4, 0x28, 0xe7, 0x7f,
0xff, 0x1e, 0xfd, 0xff, 0xfc, 0x4e, 0x9f, 0x7, 0x8f, 0xff, 0x7, 0x64,
0x87, 0x37, 0xdf, 0x2, 0xe7, 0x2f, 0xff, 0xf0, 0xf, 0x2c, 0xa0, 0xff,
0x2, 0xad, 0xdf, 0xf0, 0xf, 0xb, 0x81, 0x47, 0xbb, 0x2f, 0xa8, 0x3,
0x0, 0x20, 0xf, 0x3f, 0x92, 0x31, 0x17, 0xf, 0x29, 0x8, 0x0, 0x30,
0xf, 0xfe, 0x3, 0x70, 0x5f, 0x71, 0x67, 0xf0, 0xf, 0x7, 0xa, 0x9f,
0x29, 0x9f, 0xc2, 0x1f, 0xe0, 0xf, 0x0, 0xbc, 0x29, 0x9f, 0x6, 0xb2,
0x1f, 0xe0, 0xf, 0x10, 0x9, 0x70, 0x7, 0x10, 0x66, 0x73, 0xff, 0x43,
0x4c, 0x4, 0x49, 0x4d, 0xff, 0xfe, 0x14, 0x3a, 0x65, 0x2, 0x28, 0x8,
0x20, 0x0, 0x0, 0x1, 0x2f, 0xe3, 0x69, 0x6d, 0x61, 0x21, 0x67, 0x10,
0x2f, 0xeb, 0xe1, 0x0, 0x28, 0x0, 0x3d, 0x9b, 0x72, 0x0, 0x20, 0x17,
0x4, 0x90, 0x1, 0x2e, 0x47, 0xf8, 0x80, 0x10, 0x5b, 0x80, 0x7, 0x80,
0x0, 0x88, 0x77, 0x77, 0x4a, 0xf8, 0x88, 0x9, 0x84, 0x85, 0x20, 0x7,
0x29, 0xff, 0x8b, 0x4, 0xf6, 0xdf, 0x88, 0x30, 0x17, 0x0, 0xfe, 0x8b,
0x3, 0x4, 0x0, 0xdf, 0xdd, 0x81, 0x11, 0xff, 0x9d, 0x25, 0x0, 0x16,
0xff, 0xdd, 0xdd, 0xa1, 0x40, 0x17, 0xc0, 0x70, 0x7, 0x0, 0x50, 0x1f,
0xee, 0xc8, 0x11, 0x71, 0x45, 0xfe, 0x60, 0x8c, 0x27, 0xb8, 0xf7, 0x3f,
0x77, 0x77, 0x31, 0xff, 0x8c, 0xb, 0x4, 0x88, 0x4c, 0x33, 0x20, 0x7f,
0x8a, 0x2e, 0x52, 0xe0, 0x7f, 0x3, 0x0, 0x77, 0xf7, 0xb, 0xf8, 0x81,
0x2f, 0xfa, 0x10, 0x1c, 0xe7, 0x77, 0x28, 0x80, 0x7f, 0x23, 0x7, 0x89,
0x0, 0x2, 0xe7, 0xcc, 0xe8, 0x77, 0x0, 0x11, 0x45, 0xff, 0x8c, 0x14,
0xfd, 0x6e, 0x11, 0x0, 0x0, 0x45, 0xfe, 0xac, 0x34, 0x80, 0x88, 0x7f,
0x5, 0x77, 0xb, 0xff, 0x81, 0x2, 0x23, 0xaf, 0x17, 0x33, 0xaf, 0x0,
0x1, 0x80, 0xbb, 0xbb, 0xb, 0xf8, 0xde, 0x55, 0x0, 0x44, 0x20, 0x0,
0x22, 0x29, 0xfe, 0xda, 0x40, 0x10, 0x0, 0x20, 0xdd, 0x53, 0xa7, 0x80,
0x11, 0x99, 0x87, 0x0, 0xf8, 0xc2, 0x41, 0x11, 0x0, 0x20, 0x22, 0x45,
0x0, 0xff, 0xba, 0x20, 0x11, 0x1, 0xee, 0x0, 0x22, 0x0, 0xf8, 0xb7,
0xf, 0x44, 0x80, 0x9, 0xc8, 0x2b, 0x0, 0xf1, 0xd6, 0x4c, 0x0, 0x0,
0xbb, 0xbb, 0xd, 0x13, 0xff, 0xdb, 0x51, 0x4d, 0xaf, 0xf8, 0xa8, 0x5d,
0xb7, 0x20, 0x7, 0x20, 0x17, 0x11, 0x20, 0x47, 0xee, 0xca, 0x30, 0x11,
0x11, 0x2, 0x22, 0x22, 0x25, 0xff, 0xca, 0x30, 0xf0, 0x1f, 0x0, 0x1,
0x0, 0x22, 0x22, 0x65, 0xff, 0xca, 0x40, 0x90, 0x7, 0xc3, 0x0, 0x50,
0x1f, 0x0, 0x70, 0x3f, 0x11, 0x71, 0x22, 0x0, 0x30, 0x5f, 0x0, 0x70,
0x7f, 0x0, 0x48, 0xdc, 0x88, 0x99, 0x47, 0xf8, 0xd7, 0x4e, 0x0, 0x2a,
0x12, 0x99, 0x11, 0x47, 0xf8, 0xbb, 0x41, 0x86, 0x80, 0x9f, 0x11, 0x23,
0x22, 0x23, 0x20, 0xbf, 0x74, 0x47, 0x88, 0x0, 0x88, 0x73, 0x77, 0x8a,
0xf8, 0x9e, 0x1f, 0x12, 0x8, 0x51, 0x22, 0x2, 0x21, 0x30, 0xa7, 0x40,
0x88, 0x8, 0x0, 0x69, 0xef, 0xcb, 0x41, 0x8, 0x0, 0xf7, 0xff, 0x40,
0x22, 0xab, 0x9f, 0x2a, 0x12, 0x98, 0x11, 0x47, 0xf1, 0x3b, 0xbb, 0x3a,
0x44, 0x7f, 0x21, 0x47, 0xfb, 0xbf, 0x8, 0x24, 0x5f, 0x0, 0x31, 0x77,
0x80, 0x1, 0x7b, 0xe7, 0x6, 0x44, 0x51, 0x77, 0x49, 0xff, 0x8c, 0x0,
0x15, 0x8, 0x8, 0x77, 0xf7, 0x82, 0xf8, 0x96, 0x41, 0x16, 0x10, 0xc,
0x93, 0x9f, 0xff, 0x77, 0xa, 0xf8, 0x81, 0x2e, 0x6e, 0xa0, 0xdd, 0xff,
0x44, 0x23, 0x8f, 0x2d, 0xff, 0x8b, 0x3, 0x15, 0x0, 0x22, 0xdf, 0xcd,
0x61, 0xff, 0xad, 0x25, 0x0, 0xc8, 0x33, 0x9f, 0x26, 0xaf, 0x84, 0xa8,
0x53, 0x9f, 0xc5, 0x84, 0x91, 0x40, 0x88, 0x32, 0xcf, 0x0, 0x20, 0x88,
0xee, 0x2d, 0xff, 0x28, 0xdb, 0x41, 0x33, 0xc7, 0x65, 0x23, 0xc7, 0x44,
0x80, 0x89, 0x80, 0x43, 0x87, 0x21, 0x22, 0x22, 0x32, 0x23, 0xf8, 0xbe,
0x41, 0x1d, 0xf3, 0x7f, 0x1, 0x0, 0x22, 0x32, 0x43, 0xa0, 0x17, 0xf0,
0x10, 0x1, 0x80, 0x7, 0x64, 0x27, 0x34, 0x17, 0x0, 0x34, 0xbf, 0x8,
0x10, 0xbf, 0x3b, 0x0, 0xf, 0xf8, 0xde, 0x54, 0x22, 0x51, 0xdc, 0xfd,
0xa0, 0x41, 0xaf, 0x10, 0x24, 0xff, 0xff, 0xa8, 0x0, 0x10, 0x11, 0x3,
0x22, 0x0, 0x45, 0xef, 0xba, 0x20, 0x74, 0x57, 0x34, 0x47, 0x89, 0x48,
0xff, 0x40, 0xce, 0x88, 0x35, 0x2f, 0x2a, 0x11, 0x30, 0x2f, 0x20, 0xbd,
0x35, 0x74, 0xbf, 0x8, 0x10, 0x88, 0x19, 0x4b, 0xe8, 0x31, 0xd7, 0x75,
0x3f, 0x20, 0x47, 0x6, 0x20, 0x47, 0xee, 0x8c, 0x10, 0x7, 0x31, 0x85,
0xee, 0x9c, 0x24, 0x74, 0x9f, 0x80, 0x57, 0x60, 0x47, 0xc0, 0x70, 0x57,
0x84, 0x9f, 0x11, 0x98, 0x31, 0x65, 0xff, 0xbd, 0x6, 0x34, 0x8e, 0xcc,
0x11, 0x77, 0x0, 0x44, 0x9f, 0x24, 0x57, 0x86, 0x86, 0x10, 0x1, 0x34,
0x57, 0x80, 0xff, 0x7f, 0x3, 0x0, 0x2f, 0xff, 0x2a, 0xbf, 0x37, 0x0,
0x52, 0xf8, 0x8a, 0x11, 0x8c, 0xee, 0x17, 0x11, 0xd0, 0x4a, 0x7f, 0x20,
0x27, 0x6, 0xa0, 0x17, 0x21, 0xa2, 0x11, 0x89, 0x80, 0x36, 0x1f, 0x44,
0x0, 0xb3, 0xbb, 0x9, 0xff, 0xdb, 0x10, 0x52, 0x4, 0x20, 0x5a, 0xe7,
0x11, 0x88, 0x91, 0x89, 0x5, 0x47, 0xf8, 0xc9, 0x4f, 0x17, 0x23, 0x88,
0x41, 0x22, 0x17, 0x21, 0x1, 0x0, 0x57, 0x3f, 0x4, 0x20, 0xbb, 0xfb,
0x20, 0x27, 0x71, 0x51, 0x77, 0x57, 0xf7, 0x3f, 0x24, 0x20, 0x0, 0x2,
0xf1, 0x10, 0x1, 0xa3, 0xaf, 0xf8, 0x8, 0x64, 0xdf, 0x24, 0xf, 0x38,
0x6f, 0x27, 0xcf, 0x3, 0xe5, 0x7f, 0x10, 0x23, 0x2, 0x0, 0x43, 0xf1,
0xb7, 0x16, 0x11, 0x75, 0x22, 0x0, 0x60, 0x25, 0x49, 0x7, 0xf4, 0x9f,
0x8c, 0x19, 0x4f, 0xf8, 0xd7, 0x2e, 0x4d, 0x22, 0x24, 0x91, 0x8d, 0x24,
0x47, 0x44, 0x9f, 0x44, 0x5f, 0x22, 0x7c, 0x22, 0x36, 0xf, 0x74, 0x27,
0x28, 0xb7, 0x4a, 0x2f, 0x89, 0x4f, 0x44, 0xbb, 0x60, 0x3b, 0x32, 0xbf,
0xf8, 0xff, 0xfe, 0x7f, 0x98, 0x19, 0x27, 0x18, 0xf8, 0xc1, 0x47, 0x80,
0x4f, 0x0, 0x6d, 0xbf, 0x88, 0x88, 0x71, 0xfe, 0x4d, 0xe7, 0x0, 0x4d,
0xff, 0x2e, 0x17, 0x70, 0x7, 0x2, 0x40, 0x1f, 0x0, 0xbe, 0x3f, 0x7a,
0xaf, 0x88, 0x58, 0x91, 0x3a, 0xaf, 0x40, 0xfe, 0x8f, 0x7a, 0xaf, 0xcc,
0xe8, 0x88, 0x30, 0xee, 0x21, 0x27, 0x3f, 0x73, 0x9f, 0x33, 0xab, 0x91,
0x89, 0x5e, 0x27, 0x20, 0x2f, 0x11, 0x27, 0x28, 0x35, 0xb7, 0x73, 0x9f,
0x73, 0xc7, 0x15, 0x3f, 0x21, 0x20, 0x0, 0x5a, 0x7f, 0x27, 0x57, 0x3a,
0x47, 0x10, 0xa, 0xf3, 0x9f, 0x10, 0x0, 0x89, 0x17, 0x68, 0xcf, 0xc1,
0x74, 0x2f, 0x1, 0xfd, 0x9f, 0xca, 0xcc, 0xbf, 0xbb, 0x5, 0x4e, 0x17,
0xe1, 0x0, 0x5e, 0x1f, 0x9e, 0x37, 0x0, 0x5e, 0x3f, 0x15, 0x11, 0x20,
0x22, 0x3d, 0x8f, 0xf8, 0x0, 0x8d, 0xff, 0x6e, 0x8f, 0x77, 0x4f, 0x10,
0x1c, 0x83, 0x87, 0x10, 0x2c, 0x62, 0xd7, 0x43, 0x4c, 0x49, 0x10, 0x4d,
0xff, 0xfe, 0x2f, 0xa6, 0x0, 0x2, 0x2, 0x28, 0xc3, 0x2d, 0xfd, 0x3d,
0xef, 0x69, 0x6d, 0x61, 0x67, 0x2f, 0xfe, 0x20, 0xc, 0x1c, 0x40, 0x0,
0xa, 0x3e, 0x10, 0x4e, 0x15, 0x0, 0x50, 0x3, 0x43, 0x4c, 0x24, 0x59,
0x54, 0x70, 0x3f, 0x80, 0x5, 0x47, 0xae, 0x0, 0x6c, 0x18, 0x79, 0x74,
0x31, 0x30, 0x51, 0x3e, 0x3b, 0x0, 0x0, 0xa0, 0x0, 0x43, 0x0, 0x0,
0x70, 0x43, 0x74, 0x78, 0x6c, 0x32, 0x31, 0x40, 0x2f, 0xed, 0x2b, 0x90,
0x0, 0xc, 0x2f, 0xf5, 0x1a, 0xc0, 0x2f, 0xf9, 0x2b, 0x3c, 0x0, 0x62,
0x75, 0x62, 0x62, 0x6c, 0x0, 0x65, 0x73, 0x2e, 0x62, 0x63, 0x6c, 0x69,
0x6d, 0x4, 0x0, 0x6d, 0x61, 0x73, 0x6b, 0x60, 0xa, 0x77, 0x61, 0x60,
0x76, 0x80, 0x16, 0x2f, 0xfd, 0x6d, 0x61, 0x74, 0x31, 0x8c, 0xcd, 0x2e,
0x8c, 0x2b, 0xb0, 0x0, 0x1c, 0x30, 0x63, 0x2f, 0xf9, 0xd4, 0x2f, 0xfd,
0x66, 0x24, 0x2e, 0xa0, 0x30, 0x35, 0x5f, 0x30, 0x4c, 0x7a, 0xc0, 0xa8,
0xff, 0x56, 0xff, 0x0, 0x50, 0x1, 0x15, 0x40, 0x9b, 0x4, 0x30, 0x4a,
0x2f, 0xff, 0x60, 0x4f, 0xc0, 0x50, 0xdd, 0x80, 0x3f, 0x50, 0x3, 0x80,
0x93, 0x0, 0x0, 0x52, 0x0, 0x60, 0x4f, 0x17, 0x80, 0x55, 0x6, 0x3f,
0x35, 0x5, 0x20, 0xfd, 0xb1, 0x27, 0x90, 0x4f, 0x81, 0x20, 0xb4, 0x22,
0x40, 0x24, 0x2, 0x10, 0x66, 0x2f, 0xfd, 0x47, 0x7, 0x61, 0x4a, 0x1,
0x4, 0x5, 0x50, 0xe2, 0x0, 0x20, 0xb8, 0x0, 0xb0, 0xb7, 0x1e, 0x2,
0x0, 0x5, 0x31, 0x2, 0x31, 0x4a, 0x31, 0x4e, 0x0, 0x50, 0xb7, 0x31,
0x82, 0x4, 0xd0, 0xb7, 0x70, 0x61, 0x6e, 0x31, 0x4c, 0x40, 0xc3, 0xff,
0x0, 0x0, 0x52, 0x6f, 0x6f, 0x74, 0x50, 0x61, 0x6e, 0x78, 0x65, 0x0,
0x92, 0x21, 0xf2, 0x3b, 0x71, 0x67, 0x52, 0x17, 0x70, 0x61, 0x73, 0x21,
0x31, 0x8, 0x2f, 0xfd, 0x70, 0x69, 0x63, 0x31, 0x3d, 0xe5, 0xe0, 0x30,
0x53, 0x0, 0x71, 0x17, 0x2f, 0xfc, 0xc0, 0x80, 0x0, 0x80, 0xbf, 0xa4,
0x0, 0x90, 0x53, 0xf2, 0x22, 0x6b, 0x9a, 0x43, 0x71, 0xf7, 0x6f, 0xbb,
0x5f, 0xe7, 0x40, 0x3, 0x2, 0x62, 0x89, 0x62, 0xc5, 0x61, 0x37, 0x71,
0xf3, 0x31, 0x4b, 0x2e, 0x80, 0x3f, 0x30, 0x7f, 0xa0, 0x60, 0xd3, 0x0,
0x71, 0x47, 0x2f, 0xfc, 0xb8, 0xb, 0x0, 0x0, 0x48, 0x42, 0x22, 0xcf,
0xc1, 0xe3, 0x11, 0x61, 0x8f, 0x5a, 0x80, 0x22, 0xeb, 0x80, 0x80, 0x7f,
0x72, 0x7f, 0x3, 0x21, 0xb5, 0xcd, 0x23, 0xcc, 0x6c, 0x42, 0x5b, 0x33,
0x33, 0x5b, 0x41, 0xb7, 0x50, 0xf, 0x2f, 0x20, 0x40, 0x50, 0xf, 0x20,
0xf0, 0x93, 0xe2, 0x43, 0x0, 0x60, 0x9f, 0x0, 0x12, 0xf2, 0xbb, 0x2,
0x40, 0x9f, 0x1, 0x22, 0x55, 0x2f, 0xff, 0x31, 0x93, 0x3e, 0x50, 0x8b,
0x30, 0x7, 0xbe, 0x30, 0xf, 0x14, 0x60, 0x9b, 0x30, 0x7, 0x1, 0x10,
0x9f, 0x51, 0xbf, 0x0, 0x93, 0x8f, 0x80, 0x3, 0xfd, 0x3f, 0x40, 0x0,
0xfe, 0xf, 0xa1, 0x7f, 0xd3, 0x2b, 0x1, 0x10, 0x7e, 0x1b, 0x44, 0x98,
0x3d, 0xfc, 0x0, 0x1, 0x3f, 0xf9, 0x74, 0x49, 0x23, 0xa3, 0x41, 0xab,
0x50, 0x7, 0xe1, 0x1f, 0x61, 0x65, 0x42, 0x47, 0xc, 0x67, 0x72, 0x70,
0x31, 0x34, 0x1f, 0x32, 0x97, 0x47, 0x72, 0x13, 0x6f, 0x75, 0x70, 0xa4,
0xba, 0x67, 0x72, 0x52, 0x6b, 0x30, 0x23, 0x8f, 0x32, 0xbf, 0x47, 0x5f,
0x41, 0xc4, 0x36, 0x34, 0x9b, 0xf3, 0xfb, 0xf4, 0x5b, 0xd5, 0xf3, 0x63,
0x90, 0x4b, 0x42, 0x3, 0x40, 0x4b, 0x2c, 0x40, 0x97, 0x43, 0xc4, 0xce,
0xcd, 0x35, 0x93, 0xf4, 0xe3, 0x67, 0x72, 0x50, 0xef, 0xb5, 0x7f, 0xe0,
0x24, 0x87, 0x5e, 0x11, 0x0, 0x5, 0x7f, 0xc8, 0x85, 0x7f, 0x33, 0xb3,
0x35, 0x3f, 0x35, 0xdb, 0x1e, 0xa8, 0x2f, 0xff, 0x29, 0x2f, 0xfd, 0x34,
0x0, 0x5, 0x83, 0x6c, 0x6f, 0x67, 0x6f, 0x6f, 0x0, 0xd5, 0x8e, 0x35,
0x8b, 0x30, 0x22, 0x32, 0x34, 0xf0, 0x36, 0x1a, 0x31, 0x63, 0x55, 0xd8,
0x2f, 0xff, 0x5c, 0x26, 0x3c, 0xac, 0x2, 0x65, 0x8f, 0x2, 0x0, 0xa5,
0x8f, 0xfa, 0x30, 0x91, 0x1, 0xb5, 0xdf, 0x35, 0x8f, 0x95, 0xdf, 0x0,
0x15, 0x8f, 0x44, 0x26, 0x44, 0x40, 0x77, 0x24, 0x51, 0x2b, 0xb5, 0x8f,
0x1, 0xf5, 0xf7, 0x6a, 0x65, 0xf7, 0x90, 0xbb, 0x0, 0x25, 0xfb, 0xe1,
0x0, 0x36, 0xf, 0x37, 0x64, 0x26, 0x13, 0x10, 0x24, 0x2, 0x11, 0x3,
0x36, 0x13, 0x7c, 0x3, 0x3, 0xa6, 0x13, 0x4, 0x30, 0xd3, 0x3, 0x56,
0x2f, 0x52, 0xc7, 0x4, 0x36, 0x2f, 0x6e, 0xab, 0x6f, 0xe1, 0xe5, 0xaf,
0x76, 0x2f, 0x48, 0x38, 0x1b, 0x28, 0xb6, 0x40, 0x7, 0x5, 0x86, 0x2f,
0x57, 0x4, 0x6, 0x6, 0x2f, 0x20, 0x1, 0xc6, 0xcf, 0x2, 0x86, 0x2f,
0x4a, 0x1c, 0x77, 0x4f, 0xee, 0x67, 0x4b, 0x46, 0xcb, 0x1, 0xa6, 0x2f,
0xff, 0x0, 0x83, 0xdf, 0x39, 0x94, 0x50, 0x3, 0xf0, 0x86, 0xc6, 0x33,
0xcd, 0xcc, 0x4c, 0x3f, 0x30, 0x3, 0x57, 0x6f, 0x38, 0x7f, 0x42, 0x0,
0x16, 0xcf, 0xb7, 0xef, 0xb, 0x56, 0xaf, 0x3a, 0xef, 0xf6, 0xaf, 0x3a,
0x70, 0xfa, 0x43, 0xef, 0xfa, 0xbb, 0xf5, 0x3b, 0x1, 0x36, 0xcf, 0x5c,
0x0, 0x26, 0xcf, 0x3b, 0x77, 0xfb, 0x17, 0xfa, 0xbf, 0x80, 0x4, 0x36,
0xdf, 0x1f, 0xbc, 0xab, 0xc4, 0xf4, 0xa7, 0x73, 0x0, 0xa, 0x1a, 0x5d,
0x17, 0xe0, 0x62, 0xd, 0xcb, 0x0, 0x15, 0x4b, 0xae, 0x36, 0xe9, 0x22,
0xd6, 0xbc, 0x0, 0x84, 0x95, 0x43, 0x89, 0x8a, 0x34, 0x9f, 0xb6, 0x0,
0x56, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
size_t logo_lz11_size = 0x2000;

232
source/main.cpp Normal file
View File

@ -0,0 +1,232 @@
#include <algorithm>
#include <filesystem>
#include <fstream>
#include <iostream>
#include <vector>
#include <banner.hpp>
#include <banner_audio.hpp>
#include <helper.hpp>
#include <icon.hpp>
#include <logo_lz11.hpp>
#include <samplefiles.hpp>
#include <fileHash.hpp>
#define cons_clear std::cout << "\x1B[2J\x1B[H"
void ToUpperCase(std::string &str) {
std::transform(str.begin(), str.end(), str.begin(),
[](unsigned char c) { return std::toupper(c); });
}
bool isValidHex(const std::string &str) {
for (char c : str) {
if (!isxdigit(c)) {
return false;
}
}
return true;
}
void CheckTools() {
std::vector<std::string> installed;
std::vector<std::string> not_installed;
int res = 0;
res = system("makerom");
if (!res) {
not_installed.push_back("makerom");
} else {
installed.push_back("makerom");
}
res = system("bannertool");
if (!res) {
not_installed.push_back("bannertool");
} else {
installed.push_back("bannertool");
}
std::cout << "<DEVKITPRO> is set to: " << getenv("DEVKITPRO") << "\n";
std::cout << "Tools-Check:\n";
for (auto const &it : installed) {
std::cout << "[+]" << it << " is installed!\n";
}
for (auto const &it : not_installed) {
std::cout << "[+]" << it << " is not installed!\n";
}
}
void PrintHelp() {
std::cout << "npi-build v0.1\n";
std::cout << "Commands:\n";
std::cout << "help: Display this\n";
std::cout << "generate <type> <dir>: Create Project Files!\n";
std::cout << " type: 3dsx | cia3dsx\n";
std::cout << "generate-assist: Create Project Files with assistent!\n";
std::cout << "build: Build the Project!\n";
std::cout << "clean: Delete all files from build.\n";
std::cout << "edit-assist: Edit Project files with assist!\n";
std::cout << "check-tools: Check for Missing Tools!\n";
return;
}
void ProcessArgs(int argc, char *argv[]) {
if (argc < 2) {
PrintHelp();
return;
} else if (std::string(argv[1]) == "help") {
PrintHelp();
return;
} else if (std::string(argv[1]) == "generate") {
if (argc < 4) {
std::cout << "Wrong Number of Arguments!\n";
return;
}
std::string type = std::string(argv[2]);
int res = 1;
int type_ = -1;
if (type == "3dsx" | type == "cia3dsx") {
res = 0;
if (type == "3dsx")
type_ = 0;
else if (type == "cia3dsx")
type_ = 1;
}
if (res) {
std::cout << "Unknown type!\n";
return;
}
std::string dst_dir = argv[3];
std::cout << "\nDestination: " << dst_dir << "/\n";
std::filesystem::create_directories(
std::filesystem::path(dst_dir + "/app"));
std::filesystem::create_directories(
std::filesystem::path(dst_dir + "/gfx"));
std::ofstream gfx_keep(dst_dir + "/gfx/.gitkeep");
gfx_keep.close();
std::filesystem::create_directories(
std::filesystem::path(dst_dir + "/romfs/gfx"));
std::ofstream rgfx_keep(dst_dir + "/romfs/gfx/.gitkeep");
rgfx_keep.close();
if (type_ == 1) {
char *ret = new char[10000];
std::string uid = helper::GenerateUniqueId();
sprintf(ret, ciaRSF, default_title, default_code, default_romfs_path,
uid.c_str());
std::ofstream test(dst_dir + "/app/build-cia.rsf");
test << ret;
test.close();
delete[] ret;
helper::ArrayToFile(banner_audio, banner_audio_size,
dst_dir + "/app/banner_audio.wav");
helper::ArrayToFile(logo_lz11, logo_lz11_size,
dst_dir + "/app/logo.lz11");
helper::ArrayToFile(banner, banner_size, dst_dir + "/app/banner.png");
}
helper::ArrayToFile(icon, icon_size, dst_dir + "/app/icon.png");
NpiProject npr;
Prj_InitDefault(npr);
helper::GenerateTemplateFile(dst_dir + "/build.json", npr);
} else if (std::string(argv[1]) == "generate-assist") {
// define vars
std::string prj_name;
std::string prodcode;
std::string unique_id;
int type_;
std::string dst_dir;
std::cout << "Npi-Build Project-Assist:";
std::cout << "\ntype Project Name >";
std::cin >> prj_name;
std::cout << "\ntype Project Code 4 chars [NPI7] >";
std::cin >> prodcode;
if (prodcode.length() != 4) {
std::cout << "\nWrong Length!\n";
return;
}
ToUpperCase(prodcode);
std::cout << "Code set to [" << prodcode << "]";
std::cout << "\ntype project's unique id [ff3ff]\n or type random to "
"generate a random one>";
std::cin >> unique_id;
bool rnd = false;
if (unique_id == "random") {
unique_id = helper::GenerateUniqueId();
rnd = true;
}
if (unique_id.length() != 5 && !rnd) {
std::cout << "\nWrong Length!\n";
return;
}
if (!isValidHex(unique_id) && !rnd) {
std::cout << "\nId is not valid\n";
return;
}
if (!rnd) {
unique_id.insert(0, "0x");
}
std::cout << "\nProject type: type 0 for 3dsx\nonly or 1 for cia and 3dsx>";
std::cin >> type_;
if (!(type_ == 0 | type_ == 1)) {
std::cout << "\nunknown type!\n";
return;
}
std::cout << "\nProjects Directpry: type . for current>";
std::cin >> dst_dir;
std::cout << "\nDestination: " << dst_dir << "/\n";
std::filesystem::create_directories(
std::filesystem::path(dst_dir + "/app"));
std::filesystem::create_directories(
std::filesystem::path(dst_dir + "/gfx"));
std::ofstream gfx_keep(dst_dir + "/gfx/.gitkeep");
gfx_keep.close();
std::filesystem::create_directories(
std::filesystem::path(dst_dir + "/romfs/gfx"));
std::ofstream rgfx_keep(dst_dir + "/romfs/gfx/.gitkeep");
rgfx_keep.close();
if (type_ == 1) {
char *ret = new char[10000];
sprintf(ret, ciaRSF, prj_name.c_str(), prodcode.c_str(),
default_romfs_path, unique_id.c_str());
std::ofstream test(dst_dir + "/app/build-cia.rsf");
test << ret;
test.close();
delete[] ret;
helper::ArrayToFile(banner_audio, banner_audio_size,
dst_dir + "/app/banner_audio.wav");
helper::ArrayToFile(logo_lz11, logo_lz11_size,
dst_dir + "/app/logo.lz11");
helper::ArrayToFile(banner, banner_size, dst_dir + "/app/banner.png");
}
helper::ArrayToFile(icon, icon_size, dst_dir + "/app/icon.png");
NpiProject npr;
Prj_InitDefault(npr);
npr.name = prj_name;
npr.prod = prodcode;
npr.unique_id = unique_id;
helper::GenerateTemplateFile(dst_dir + "/build.json", npr);
}
else if (std::string(argv[1]) == "build") {
helper::CompileProject(fix_path(std::filesystem::current_path().string()));
}
else if (std::string(argv[1]) == "check-tools")
CheckTools();
else if (std::string(argv[1]) == "clean")
helper::CleanProject(fix_path(std::filesystem::current_path().string()));
}
int main(int argc, char *argv[]) {
// std::cout << std::filesystem::current_path() << std::endl;
ProcessArgs(argc, argv);
std::cout << "Exitting...\n";
return 0;
}

302
source/samplefiles.cpp Normal file
View File

@ -0,0 +1,302 @@
#include <samplefiles.hpp>
const char *default_title = "Sample";
const char *default_code = "NPI7";
const char *default_unique_id = "0xff3ff";
const char *default_romfs_path = "romfs";
const char *ciaRSF =
"#This File is generated by npi-build!\n"
"#Every Changes made will get overwritten\n"
"#if the name of this file is <build-cia.rsf>\n"
"#To use custom rsf files change the path in build.json\n"
"BasicInfo:\n"
" Title : \"%s\"\n"
" ProductCode : \"CTR-H-%s\"\n"
" Logo : Homebrew # Nintendo / Licensed / Distributed "
"/ iQue / iQueForSystem\n"
"\n"
"RomFs:\n"
" RootPath: \"%s\"\n"
"\n"
"TitleInfo:\n"
" Category : Application\n"
" UniqueId : %s\n"
"\n"
"Option:\n"
" UseOnSD : true # true if App is to be installed to SD\n"
" FreeProductCode : true # Removes limitations on ProductCode\n"
" MediaFootPadding : false # If true CCI files are created with "
"padding\n"
" EnableCrypt : false # Enables encryption for NCCH and CIA\n"
" EnableCompress : true # Compresses where applicable (currently "
"only exefs:/.code)\n"
" \n"
"AccessControlInfo:\n"
" CoreVersion : 2\n"
"\n"
" # Exheader Format Version\n"
" DescVersion : 2\n"
" \n"
" # Minimum Required Kernel Version (below is for 4.5.0)\n"
" ReleaseKernelMajor : \"02\"\n"
" ReleaseKernelMinor : \"33\"\n"
"\n"
" # ExtData\n"
" UseExtSaveData : false # enables ExtData \n"
" #ExtSaveDataId : 0x300 # only set this when the ID is "
"different to the UniqueId\n"
"\n"
" # FS:USER Archive Access Permissions\n"
" # Uncomment as required\n"
" FileSystemAccess:\n"
" - CategorySystemApplication\n"
" - CategoryHardwareCheck\n"
" - CategoryFileSystemTool\n"
" - Debug\n"
" - TwlCardBackup\n"
" - TwlNandData\n"
" #- Boss\n"
" - DirectSdmc\n"
" - Core\n"
" #- CtrNandRo\n"
" #- CtrNandRw\n"
" #- CtrNandRoWrite\n"
" - CategorySystemSettings\n"
" #- CardBoard\n"
" #- ExportImportIvs\n"
" - DirectSdmcWrite\n"
" #- SwitchCleanup\n"
" #- SaveDataMove\n"
" #- Shop\n"
" #- Shell\n"
" #- CategoryHomeMenu\n"
" #- SeedDB\n"
" IoAccessControl:\n"
" #- FsMountNand\n"
" #- FsMountNandRoWrite\n"
" - FsMountTwln\n"
" #- FsMountWnand\n"
" - FsMountCardSpi\n"
" - UseSdif3\n"
" #- CreateSeed\n"
" - UseCardSpi\n"
"\n"
" # Process Settings\n"
" MemoryType : Application # Application/System/Base\n"
" SystemMode : 64MB # "
"64MB(Default)/96MB/80MB/72MB/32MB\n"
" IdealProcessor : 0\n"
" AffinityMask : 1\n"
" Priority : 16\n"
" MaxCpu : 0x9E # Default\n"
" HandleTableSize : 0x200\n"
" DisableDebug : false\n"
" EnableForceDebug : false\n"
" CanWriteSharedPage : true\n"
" CanUsePrivilegedPriority : false\n"
" CanUseNonAlphabetAndNumber : true\n"
" PermitMainFunctionArgument : true\n"
" CanShareDeviceMemory : true\n"
" RunnableOnSleep : false\n"
" SpecialMemoryArrange : true\n"
"\n"
" # New3DS Exclusive Process Settings\n"
" SystemModeExt : Legacy # Legacy(Default)/124MB/178MB "
"Legacy:Use Old3DS SystemMode\n"
" CpuSpeed : 804MHz # 268MHz(Default)/804MHz\n"
" EnableL2Cache : true # false(default)/true\n"
" CanAccessCore2 : true \n"
"\n"
" # Virtual Address Mappings\n"
" IORegisterMapping:\n"
" - 1ff00000-1ff7ffff # DSP memory\n"
" MemoryMapping: \n"
" - 1f000000-1f5fffff:r # VRAM\n"
"\n"
" # Accessible SVCs, <Name>:<ID>\n"
" SystemCallAccess: \n"
" ControlMemory: 1\n"
" QueryMemory: 2\n"
" ExitProcess: 3\n"
" GetProcessAffinityMask: 4\n"
" SetProcessAffinityMask: 5\n"
" GetProcessIdealProcessor: 6\n"
" SetProcessIdealProcessor: 7\n"
" CreateThread: 8\n"
" ExitThread: 9\n"
" SleepThread: 10\n"
" GetThreadPriority: 11\n"
" SetThreadPriority: 12\n"
" GetThreadAffinityMask: 13\n"
" SetThreadAffinityMask: 14\n"
" GetThreadIdealProcessor: 15\n"
" SetThreadIdealProcessor: 16\n"
" GetCurrentProcessorNumber: 17\n"
" Run: 18\n"
" CreateMutex: 19\n"
" ReleaseMutex: 20\n"
" CreateSemaphore: 21\n"
" ReleaseSemaphore: 22\n"
" CreateEvent: 23\n"
" SignalEvent: 24\n"
" ClearEvent: 25\n"
" CreateTimer: 26\n"
" SetTimer: 27\n"
" CancelTimer: 28\n"
" ClearTimer: 29\n"
" CreateMemoryBlock: 30\n"
" MapMemoryBlock: 31\n"
" UnmapMemoryBlock: 32\n"
" CreateAddressArbiter: 33\n"
" ArbitrateAddress: 34\n"
" CloseHandle: 35\n"
" WaitSynchronization1: 36\n"
" WaitSynchronizationN: 37\n"
" SignalAndWait: 38\n"
" DuplicateHandle: 39\n"
" GetSystemTick: 40\n"
" GetHandleInfo: 41\n"
" GetSystemInfo: 42\n"
" GetProcessInfo: 43\n"
" GetThreadInfo: 44\n"
" ConnectToPort: 45\n"
" SendSyncRequest1: 46\n"
" SendSyncRequest2: 47\n"
" SendSyncRequest3: 48\n"
" SendSyncRequest4: 49\n"
" SendSyncRequest: 50\n"
" OpenProcess: 51\n"
" OpenThread: 52\n"
" GetProcessId: 53\n"
" GetProcessIdOfThread: 54\n"
" GetThreadId: 55\n"
" GetResourceLimit: 56\n"
" GetResourceLimitLimitValues: 57\n"
" GetResourceLimitCurrentValues: 58\n"
" GetThreadContext: 59\n"
" Break: 60\n"
" OutputDebugString: 61\n"
" ControlPerformanceCounter: 62\n"
" CreatePort: 71\n"
" CreateSessionToPort: 72\n"
" CreateSession: 73\n"
" AcceptSession: 74\n"
" ReplyAndReceive1: 75\n"
" ReplyAndReceive2: 76\n"
" ReplyAndReceive3: 77\n"
" ReplyAndReceive4: 78\n"
" ReplyAndReceive: 79\n"
" BindInterrupt: 80\n"
" UnbindInterrupt: 81\n"
" InvalidateProcessDataCache: 82\n"
" StoreProcessDataCache: 83\n"
" FlushProcessDataCache: 84\n"
" StartInterProcessDma: 85\n"
" StopDma: 86\n"
" GetDmaState: 87\n"
" RestartDma: 88\n"
" DebugActiveProcess: 96\n"
" BreakDebugProcess: 97\n"
" TerminateDebugProcess: 98\n"
" GetProcessDebugEvent: 99\n"
" ContinueDebugEvent: 100\n"
" GetProcessList: 101\n"
" GetThreadList: 102\n"
" GetDebugThreadContext: 103\n"
" SetDebugThreadContext: 104\n"
" QueryDebugProcessMemory: 105\n"
" ReadProcessMemory: 106\n"
" WriteProcessMemory: 107\n"
" SetHardwareBreakPoint: 108\n"
" GetDebugThreadParam: 109\n"
" ControlProcessMemory: 112\n"
" MapProcessMemory: 113\n"
" UnmapProcessMemory: 114\n"
" CreateCodeSet: 115\n"
" CreateProcess: 117\n"
" TerminateProcess: 118\n"
" SetProcessResourceLimits: 119\n"
" CreateResourceLimit: 120\n"
" SetResourceLimitValues: 121\n"
" AddCodeSegment: 122\n"
" Backdoor: 123\n"
" KernelSetState: 124\n"
" QueryProcessMemory: 125\n"
"\n"
" # Service List\n"
" # Maximum 34 services (32 if firmware is prior to 9.6.0)\n"
" ServiceAccessControl:\n"
" - APT:U\n"
" - ac:u\n"
" - am:net\n"
" #- boss:U\n"
" #- cam:u\n"
" #- cecd:u\n"
" #- cfg:nor\n"
" - cfg:u\n"
" #- csnd:SND\n"
" - dsp::DSP\n"
" #- frd:u\n"
" - fs:USER\n"
" - gsp::Gpu\n"
" - gsp::Lcd\n"
" - hid:USER\n"
" - http:C\n"
" #- ir:rst\n"
" #- ir:u\n"
" #- ir:USER\n"
" #- mic:u\n"
" #- ndm:u\n"
" #- news:s\n"
" - nwm::EXT\n"
" - nwm::UDS\n"
" - ptm:sysm\n"
" - ptm:u\n"
" - pxi:dev\n"
" - soc:U\n"
" - ssl:C\n"
" #- y2r:u\n"
"\n"
"\n"
"SystemControlInfo:\n"
" SaveDataSize: 0KB # Change if the app uses savedata\n"
" RemasterVersion: $(APP_VERSION_MAJOR)\n"
" StackSize: 0x40000\n"
"\n"
" # Modules that run services listed above should be included below\n"
" # Maximum 48 dependencies\n"
" # <module name>:<module titleid>\n"
" Dependency:\n"
" ac: 0x0004013000002402\n"
" #act: 0x0004013000003802\n"
" am: 0x0004013000001502\n"
" boss: 0x0004013000003402\n"
" camera: 0x0004013000001602\n"
" cecd: 0x0004013000002602\n"
" cfg: 0x0004013000001702\n"
" codec: 0x0004013000001802\n"
" csnd: 0x0004013000002702\n"
" dlp: 0x0004013000002802\n"
" dsp: 0x0004013000001a02\n"
" friends: 0x0004013000003202\n"
" gpio: 0x0004013000001b02\n"
" gsp: 0x0004013000001c02\n"
" hid: 0x0004013000001d02\n"
" http: 0x0004013000002902\n"
" i2c: 0x0004013000001e02\n"
" ir: 0x0004013000003302\n"
" mcu: 0x0004013000001f02\n"
" mic: 0x0004013000002002\n"
" ndm: 0x0004013000002b02\n"
" news: 0x0004013000003502\n"
" #nfc: 0x0004013000004002\n"
" nim: 0x0004013000002c02\n"
" nwm: 0x0004013000002d02\n"
" pdn: 0x0004013000002102\n"
" ps: 0x0004013000003102\n"
" ptm: 0x0004013000002202\n"
" #qtm: 0x0004013020004202\n"
" ro: 0x0004013000003702\n"
" socket: 0x0004013000002e02\n"
" spi: 0x0004013000002302\n"
" ssl: 0x0004013000002f02\n";

43
tools/file2array.cpp Normal file
View File

@ -0,0 +1,43 @@
#include <fstream>
#include <iostream>
#include <vector>
int main(int argc, char *argv[]) {
if (argc < 3) {
std::cout << "Usage:\nfile2array <file> <dstfilename>\n";
return 0;
}
std::string file_path = argv[1];
std::ifstream file(file_path, std::ios::binary);
if (!file.is_open()) {
std::cerr << "[-] Could not open file" << std::endl;
return 1;
}
std::vector<unsigned char> buffer(std::istreambuf_iterator<char>(file), {});
const size_t array_size = buffer.size();
std::ofstream fout(std::string(argv[2]) + ".cpp");
fout << "#include <" << argv[2] << ".hpp>" << std::endl;
fout << "\nunsigned char " << argv[2] << "[] = {";
for (std::size_t i = 0; i < buffer.size(); ++i) {
if (i != 0) {
fout << ", ";
}
fout << "0x" << std::hex << static_cast<int>(buffer[i]);
}
fout << "};" << std::endl;
fout << "\nsize_t " << argv[2] << "_size = 0x" << std::hex << array_size
<< ";" << std::endl;
std::ofstream fhead(std::string(argv[2]) + ".hpp");
fhead << "#pragma once\n#include <cstddef>\n";
fhead << "\nextern unsigned char " << argv[2] << "[];";
fhead << "\nextern size_t " << argv[2] << "_size;";
file.close();
fout.close();
return 0;
}