lunasorcery

as seen on cohost!

30-something poly kinky queer mess
recovering former game dev
dating: @estrogen-and-spite & @RobinProblem


personal blog (with rss!)
moonbase.lgbt/
other website
tiredand.gay/

ThePhD
@ThePhD
valorzard
@valorzard asked:

So i just found out about std::embed/#embed, and it looks cool but I'm also slightly confused. As someone who likes making games, and wants to make a game engine someday, how exactly is #embed useful to me?

It's not useful. You should definitely not use it. It will never help you. Don't worry about it. Just use xxd. xxd fine and definitely scales in size and compilation speed.


ThePhD
@ThePhD

I originally did this as A Bit, but the person I answered this question for is new to C and C++! (https://cohost.org/ThePhD/post/3642613-listen#comment-250a81c8-6c51-4903-aff7-a987c5d7b56d)

So, I've written about this problem before. Like, a lot. And I'm loathe to do it again, but I've still got some of that dog in me, and I can give it another go around. For starters;

To Start

#embed is a utility to take files and get them into your program as binary data. The whole reason you need this is because #include pulls the data in as source code. That is, whatever you have #included better be well-formed C (or C++) source code, otherwise you and the compiler are gonna fight about it. (The compiler will win because no matter how good you are, the implementation is always in control and can always make you its bitch because it decides whether it pops out the result you want or not, not you.) Therefore, if you wanted to, say, have a data array that represents a PNG file on your machine, and you wanted to slurp it up into your program, doing

const unsigned char my_awesome_png_file[] = {
#include <project/assets/images/cute_eevee.png>
};

will not work. It will attempt to include cute_eevee.png's bytes as source code, and yell at you. Not good. So, to fix this, I surveyed, implemented, tested, and eventually standardized (in C, for C23 (ISO/IEC 9899:2023 (coming out in 2024 (don't ask)))) (or C++ (for C++26 (eventually, I'm still fixing the wording of the paper)) a feature called #embed. The feature lets you write the above, just with embed instead of include:

const unsigned char my_awesome_png_file[] = {
#embed <project/assets/images/cute_eevee.png>
};

This will do what you think it does. It translates each byte of data into an integer constant expression, which is then splat out in a comma-delimited list, so after preprocessing it looks as shown below[0]. Here is a live example that pulls random data from /dev/urandom on Godbolt to let you see it in real-time: https://godbolt.org/z/br594bqMK

That is the essence of this feature. That is it. It gives you a standard way to inject (relatively, in terms of files, but maybe not relatively, as in source code) data into your program, using the file system to do it rather than using a different program to "massage" a binary file into source code (such as: xxd, python, some bespokes handmade shit you did, etc. etc.).

This Will Not Help Professional™ Game DevelopersⓇ

Game developers -- and many application developers -- need more control over their assets. They need to bake files in a specific format. They need to control how much data is pulled off of disk. They need to be able to address files by the names artists know them by in the system, and the way technical designers know them, rather than their actual literal file names. Sometimes, the files are not stored as literal files but instead are bundled into compressed archives or packed structures and need special logic to access the right bits.

All of these use cases are outside the realm for #embed.

It's Purpose, Very Simply

#embed (and maybe, God Willing, One Day, with std::embed), enables you to bring data into C and C++ to process it at compile-time, and take advantage of potential optimizations that can come from being able to not only have the data in a convenient array, but know each value of the array during compilation. They are also good for making small games and tiny applications with li'l itty bitty assets that do not change and just need to be vomited directly into the program; simple icons, basic bitch sound effects, etc.

It also does it with speed, if your compiler implementer isn't a coward (see also: this blog post https://thephd.dev/implementing-embed-c-and-c++).

Hopefully this explains it well. Please let me know if you need any further information.

[0]: Like so:

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


You must log in to comment.

in reply to @ThePhD's post:

I know you’re lying here but it’s actually probably not as useful for games (or especially engines) because runtime asset loading is so important there. So it becomes instead very nice for “I want to prototype stuff without worrying about asset loading”.

the production use-case I was imagining is a tiny pixel debug font to use when loading anything fancier is failing. but also it is really nice for prototyping anyways I’m using include_str! in rust right now for a bunch of stuff I need to make runtime loaded soon.

in reply to @ThePhD's post:

Ok so, let me get this straight:
To load stuff like audio or gameplay scripts, you can use XXD on Linux, or use the upcoming #embed in C23/C++26. But since #embed is in C23, and C++ is just a superset of C, I could technically already use #embed once C23 comes out, since you can combine C and C++ code together. At least, this is what I understand so far.

But okay, if I'm on windows, and I want to embed something, and I can't use the xxd command and I can't use #embed, I then use ... #include and #include to read from a file in the filesystem. This means I would then have to package the files along with the exe to have them be able to be used in C++.

Is this right, or am I totally confused? I'm still somewhat new to C++ shenanigans so I literally have no idea.

in reply to @ThePhD's post:

In general its use in games would be niche fs. Could have some limited use embedding things like globally required shaders, global images in an uncompressed format (like common gradient patterns), or startup splash screen images - but that's all optional fs and can be done with current approaches until embed is available.

I could also see something like Unreal Engine using it for their engine version file tbh - but idk the full scope of that and if it'd be worth it

Ok this makes way more sense! Sorry for all the questions! I just really like learning weird things about C/C++ since I find them fascinating. Weird question, but, you know how frameworks like React have special javascript files called .jsx where you can combine javascript and HTML to do some cool stuff? (For example, returning an HTML element in a function). Using #embed, could you do something like that? Like maybe embedding tiny bits of HTML and then using them to do cool UI stuff?

Like okay, lets say I do:

const unsigned char my_html_file[] = { #embed <cool_html_file.html> };

could I like, serve it on a webserver or something?

Like, uh,

void serve_html_file()
{
run_html_file(my_html_file);
}