diff --git a/firmware/application/Makefile b/firmware/application/Makefile index 0ad8b72c..cf743a82 100755 --- a/firmware/application/Makefile +++ b/firmware/application/Makefile @@ -162,6 +162,7 @@ CPPSRC = main.cpp \ ui_debug.cpp \ ui_rds.cpp \ ui_lcr.cpp \ + ui_afsksetup.cpp \ ui_console.cpp \ ui_receiver.cpp \ ui_spectrum.cpp \ diff --git a/firmware/application/main.cpp b/firmware/application/main.cpp index d1e47739..2a96c512 100755 --- a/firmware/application/main.cpp +++ b/firmware/application/main.cpp @@ -475,6 +475,8 @@ message_handlers[Message::ID::TestResults] = [&system_view](const Message* const */ int main(void) { + ui::Context context; + portapack::init(); if( !cpld_update_if_necessary() ) { @@ -484,7 +486,7 @@ int main(void) { init_message_queues(); portapack::io.init(); - ui::Context context; + portapack::display.init(); sdcStart(&SDCD1, nullptr); @@ -503,13 +505,19 @@ int main(void) { { 0, 0, 240, 320 } }; ui::Painter painter; - EventDispatcher event_dispatcher { &system_view, painter, context }; - + context.message_map[Message::ID::FSKPacket] = [](const Message* const p) { const auto message = static_cast(p); (void)message; }; +context.message_map[Message::ID::TXDone] = [](const Message* const p) { + const auto message = static_cast(p); + (void)message; +}; + + EventDispatcher event_dispatcher { &system_view, painter, context }; + m4txevent_interrupt_enable(); m4_init(portapack::spi_flash::baseband, portapack::spi_flash::m4_text_ram_base); diff --git a/firmware/application/splash.bmp b/firmware/application/splash.bmp new file mode 100644 index 00000000..be597b16 Binary files /dev/null and b/firmware/application/splash.bmp differ diff --git a/firmware/application/splash.hpp b/firmware/application/splash.hpp new file mode 100644 index 00000000..f61fe6b4 --- /dev/null +++ b/firmware/application/splash.hpp @@ -0,0 +1,1075 @@ +// Generated with "xxd -i splash.bmp" + +unsigned char splash_bmp[] = { + 0x42, 0x4d, 0x28, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x00, + 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0xb9, 0x00, 0x00, 0x00, 0x1b, 0x01, + 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0xb2, 0x31, + 0x00, 0x00, 0x12, 0x0b, 0x00, 0x00, 0x12, 0x0b, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x1c, 0x80, 0x00, 0x26, 0x2f, + 0xaa, 0x00, 0x03, 0x04, 0x26, 0x00, 0x06, 0x09, 0x49, 0x00, 0x00, 0x00, + 0xc8, 0x00, 0x00, 0x00, 0x73, 0x00, 0x81, 0x81, 0x87, 0x00, 0x1d, 0x1d, + 0x1e, 0x00, 0xcb, 0xcb, 0xce, 0x00, 0x99, 0x99, 0x9b, 0x00, 0x6b, 0x6b, + 0x6c, 0x00, 0xfd, 0xfd, 0xfd, 0x00, 0xb0, 0xb0, 0xb0, 0x00, 0x52, 0x52, + 0x52, 0x00, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xff, + 0x00, 0x0c, 0xfe, 0xed, 0xaa, 0xaa, 0xdd, 0xe7, 0x38, 0xff, 0x00, 0x00, + 0x76, 0xff, 0x00, 0x0e, 0xda, 0x6c, 0x88, 0xc8, 0xcc, 0x9a, 0xef, 0x00, + 0x34, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x74, 0xff, 0x00, 0x10, 0xfd, 0xad, + 0xac, 0x88, 0x88, 0x8c, 0xc6, 0xde, 0x36, 0xff, 0x00, 0x00, 0x74, 0xff, + 0x00, 0x12, 0x7a, 0xd9, 0x98, 0x88, 0x88, 0x8c, 0xcc, 0x6a, 0xdf, 0x00, + 0x32, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x74, 0xff, 0x00, 0x12, 0xda, 0xc8, + 0xac, 0x88, 0x8c, 0xcc, 0xc6, 0xc9, 0xaf, 0x00, 0x34, 0xff, 0x00, 0x00, + 0x74, 0xff, 0x00, 0x12, 0x69, 0x88, 0xcc, 0xcc, 0xc8, 0x8c, 0x88, 0xcc, + 0xcf, 0x00, 0x32, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x74, 0xff, 0x00, 0x12, + 0x9c, 0x98, 0xcc, 0x66, 0xc8, 0x89, 0xc8, 0xc9, 0xcf, 0x00, 0x34, 0xff, + 0x00, 0x00, 0x74, 0xff, 0x00, 0x12, 0x68, 0xa6, 0xc8, 0x9e, 0x88, 0x98, + 0x8c, 0x6c, 0x6f, 0x00, 0x32, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x74, 0xff, + 0x00, 0x12, 0xe8, 0x96, 0xc8, 0x89, 0xe8, 0xa9, 0x8a, 0xd9, 0xdf, 0x00, + 0x34, 0xff, 0x00, 0x00, 0x74, 0xff, 0x00, 0x12, 0x78, 0xca, 0x6c, 0xc8, + 0x69, 0x9c, 0xc9, 0xa8, 0x7f, 0x00, 0x32, 0xff, 0x02, 0xf0, 0x00, 0x00, + 0x74, 0xff, 0x00, 0x10, 0xec, 0x88, 0xd6, 0x9a, 0xca, 0x9e, 0xea, 0xc9, + 0x36, 0xff, 0x00, 0x00, 0x74, 0xff, 0x00, 0x10, 0xe9, 0xc8, 0x86, 0xd9, + 0xaf, 0xda, 0xa6, 0x8c, 0x34, 0xff, 0x02, 0xfe, 0x00, 0x00, 0x74, 0xff, + 0x00, 0x10, 0xfc, 0x88, 0x86, 0xcc, 0x6e, 0xcc, 0x66, 0x8c, 0x36, 0xff, + 0x00, 0x00, 0x74, 0xff, 0x00, 0x10, 0xf6, 0xcc, 0x88, 0x88, 0x8d, 0xc8, + 0xc8, 0x8a, 0x34, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x74, 0xff, 0x00, 0x10, + 0xf6, 0xcc, 0xc8, 0xc8, 0x86, 0x88, 0xc8, 0x8d, 0x36, 0xff, 0x00, 0x00, + 0x74, 0xff, 0x00, 0x10, 0xf9, 0x88, 0x99, 0x88, 0x99, 0x88, 0xcc, 0x8f, + 0x34, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x74, 0xff, 0x00, 0x10, 0xac, 0x88, + 0x9c, 0xcc, 0xcc, 0xc9, 0xa6, 0x6f, 0x36, 0xff, 0x00, 0x00, 0x74, 0xff, + 0x00, 0x10, 0xec, 0x88, 0x89, 0xcc, 0x6a, 0x99, 0xcc, 0xdf, 0x34, 0xff, + 0x02, 0xf0, 0x00, 0x00, 0x74, 0xff, 0x00, 0x10, 0xfc, 0x88, 0x8c, 0x89, + 0xad, 0x8c, 0x68, 0xef, 0x36, 0xff, 0x00, 0x00, 0x74, 0xff, 0x00, 0x10, + 0xfc, 0x88, 0x8c, 0x88, 0xaa, 0xc8, 0x68, 0xef, 0x34, 0xff, 0x02, 0xf0, + 0x00, 0x00, 0x72, 0xff, 0x00, 0x10, 0xfc, 0x88, 0x88, 0xcc, 0x88, 0xaa, + 0xc6, 0x68, 0x38, 0xff, 0x00, 0x00, 0x72, 0xff, 0x00, 0x10, 0xf6, 0xb8, + 0xc8, 0x9c, 0x88, 0xd6, 0x8c, 0x9c, 0x36, 0xff, 0x02, 0xf0, 0x00, 0x00, + 0x72, 0xff, 0x00, 0x10, 0xfd, 0x8c, 0xcc, 0x68, 0xc6, 0xdc, 0x88, 0x98, + 0x38, 0xff, 0x00, 0x00, 0x72, 0xff, 0x00, 0x12, 0xfd, 0x88, 0xcc, 0xa9, + 0x69, 0xdc, 0x8c, 0x9c, 0x7f, 0x00, 0x34, 0xff, 0x02, 0xf0, 0x00, 0x00, + 0x72, 0xff, 0x00, 0x10, 0xf6, 0x88, 0x8c, 0xda, 0x96, 0x69, 0x8c, 0x69, + 0x38, 0xff, 0x00, 0x00, 0x72, 0xff, 0x00, 0x10, 0xfc, 0x9c, 0x88, 0x99, + 0x9e, 0x76, 0x6a, 0xa9, 0x36, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x2a, 0xff, + 0x00, 0x0a, 0xfe, 0xed, 0xed, 0xee, 0x7f, 0x00, 0x3e, 0xff, 0x00, 0x10, + 0xfc, 0xc9, 0x68, 0x88, 0xcc, 0xc8, 0x88, 0x8d, 0x38, 0xff, 0x00, 0x00, + 0x28, 0xff, 0x00, 0x0e, 0xf7, 0xa9, 0xc8, 0xcc, 0xcc, 0xc6, 0xef, 0x00, + 0x3c, 0xff, 0x00, 0x10, 0xdc, 0x9c, 0x99, 0x9c, 0x88, 0x8b, 0x8c, 0x6f, + 0x36, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x28, 0xff, 0x00, 0x10, 0xe6, 0x6a, + 0x6c, 0x98, 0x89, 0x88, 0xca, 0xa7, 0x3a, 0xff, 0x00, 0x10, 0x7c, 0x99, + 0x69, 0xcc, 0x6d, 0x9c, 0xc9, 0x7f, 0x38, 0xff, 0x00, 0x00, 0x26, 0xff, + 0x02, 0xfe, 0x02, 0x9c, 0x08, 0x88, 0x00, 0x08, 0xcc, 0x88, 0x8c, 0x67, + 0x38, 0xff, 0x00, 0x0e, 0xfc, 0xc9, 0x99, 0x9c, 0x8d, 0xc8, 0xc9, 0x00, + 0x38, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x28, 0xff, 0x00, 0x14, 0x99, 0x88, + 0x88, 0x88, 0x8c, 0x88, 0xc8, 0x8c, 0xc8, 0x67, 0x36, 0xff, 0x00, 0x0e, + 0x79, 0xc9, 0x9c, 0x69, 0x66, 0x8c, 0xce, 0x00, 0x3a, 0xff, 0x00, 0x00, + 0x28, 0xff, 0x00, 0x16, 0xf6, 0xc8, 0x88, 0x9c, 0x8c, 0x88, 0xcc, 0xcc, + 0x88, 0xc8, 0xa7, 0x00, 0x34, 0xff, 0x00, 0x0e, 0xa9, 0xc9, 0x9c, 0xd6, + 0xdc, 0xcc, 0xcf, 0x00, 0x38, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x2a, 0xff, + 0x00, 0x16, 0x6c, 0xc8, 0xc9, 0xcc, 0xcc, 0x89, 0xc8, 0xcb, 0x98, 0xc9, + 0xef, 0x00, 0x32, 0xff, 0x00, 0x0e, 0x99, 0xc6, 0x99, 0xda, 0xd8, 0xcc, + 0xaf, 0x00, 0x3a, 0xff, 0x00, 0x00, 0x2a, 0xff, 0x00, 0x18, 0x76, 0x98, + 0x9c, 0x8c, 0x6c, 0x89, 0xc8, 0x88, 0xcc, 0xc8, 0x8a, 0xef, 0x2e, 0xff, + 0x00, 0x10, 0xfd, 0x9c, 0xcc, 0xc6, 0xad, 0x6c, 0x8c, 0x7f, 0x38, 0xff, + 0x02, 0xfe, 0x00, 0x00, 0x2a, 0xff, 0x00, 0x1a, 0xfe, 0xac, 0xcc, 0xcc, + 0x88, 0xcc, 0x88, 0xcb, 0x9c, 0xc8, 0x88, 0x89, 0xef, 0x00, 0x2c, 0xff, + 0x00, 0x0e, 0xf6, 0x99, 0x96, 0x9a, 0xd6, 0xc8, 0xcc, 0x00, 0x3c, 0xff, + 0x00, 0x00, 0x2c, 0xff, 0x00, 0x1a, 0xfa, 0x9c, 0xc8, 0xcc, 0x98, 0x88, + 0x88, 0x9c, 0x98, 0x88, 0x8c, 0x8c, 0xef, 0x00, 0x2a, 0xff, 0x00, 0x0e, + 0xfd, 0xcc, 0x69, 0x6e, 0xee, 0xcc, 0xc9, 0x00, 0x3a, 0xff, 0x02, 0xf0, + 0x00, 0x00, 0x2c, 0xff, 0x00, 0x1c, 0xfe, 0xc9, 0xc8, 0x86, 0x98, 0x8c, + 0x88, 0xcc, 0xcc, 0x88, 0x88, 0xcc, 0x8c, 0xdf, 0x28, 0xff, 0x00, 0x0e, + 0xf6, 0xc9, 0xcc, 0x9d, 0x6d, 0x8c, 0xca, 0x00, 0x3c, 0xff, 0x00, 0x00, + 0x2e, 0xff, 0x00, 0x1a, 0xe8, 0xcc, 0xc8, 0xc8, 0x88, 0x86, 0xa9, 0x8c, + 0xc8, 0x88, 0xc8, 0xc8, 0x8c, 0x00, 0x28, 0xff, 0x00, 0x0e, 0xf9, 0xcc, + 0x9c, 0x66, 0x9d, 0xcc, 0xca, 0x00, 0x3a, 0xff, 0x02, 0xf0, 0x00, 0x00, + 0x2e, 0xff, 0x00, 0x1c, 0xfd, 0x66, 0x88, 0x88, 0xcc, 0x8a, 0xc9, 0xcc, + 0xc9, 0xcc, 0x88, 0xcc, 0xc8, 0xcf, 0x26, 0xff, 0x00, 0x0e, 0xdc, 0xc9, + 0x9c, 0x96, 0x6d, 0xcc, 0xca, 0x00, 0x3c, 0xff, 0x00, 0x00, 0x30, 0xff, + 0x00, 0x1a, 0xfa, 0x98, 0xc8, 0x6c, 0x9c, 0xcc, 0x88, 0x8c, 0x98, 0xcc, + 0x8c, 0x8c, 0x87, 0x00, 0x24, 0xff, 0x00, 0x10, 0xfe, 0x9c, 0x66, 0x96, + 0xda, 0x66, 0xcc, 0x9a, 0x3a, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x32, 0xff, + 0x00, 0x18, 0xa9, 0x68, 0xcd, 0xa6, 0xc8, 0xcc, 0x88, 0xcc, 0xcc, 0x88, + 0xc8, 0xce, 0x24, 0xff, 0x00, 0x10, 0xe6, 0xcc, 0x69, 0xd6, 0xda, 0xd6, + 0xc9, 0xca, 0x3c, 0xff, 0x00, 0x00, 0x32, 0xff, 0x00, 0x18, 0xfc, 0xc8, + 0xc9, 0x9a, 0xcc, 0xcc, 0xc8, 0xc9, 0xc8, 0x88, 0x8c, 0x8f, 0x24, 0xff, + 0x00, 0x10, 0x99, 0xc9, 0x69, 0x69, 0xa9, 0xd6, 0xcc, 0x9d, 0x3a, 0xff, + 0x02, 0xf0, 0x00, 0x00, 0x32, 0xff, 0x00, 0x18, 0xf6, 0x9d, 0x98, 0x89, + 0xc8, 0xc8, 0x6c, 0xc9, 0x88, 0x88, 0x8c, 0x9f, 0x24, 0xff, 0x00, 0x10, + 0x69, 0xc6, 0x66, 0x6a, 0xa6, 0x6c, 0x99, 0x9a, 0x3c, 0xff, 0x00, 0x00, + 0x34, 0xff, 0x00, 0x16, 0x69, 0x69, 0x88, 0xac, 0xc8, 0xc9, 0xc8, 0x8c, + 0xb8, 0x88, 0x6f, 0x00, 0x22, 0xff, 0x00, 0x12, 0xf7, 0xa9, 0x9a, 0x6a, + 0xa6, 0x69, 0xa9, 0xc9, 0x6d, 0x00, 0x3a, 0xff, 0x02, 0xf0, 0x00, 0x00, + 0x34, 0xff, 0x00, 0x16, 0xf9, 0x69, 0xcc, 0x8d, 0xc8, 0xcc, 0x88, 0x98, + 0x88, 0x88, 0xaf, 0x00, 0x22, 0xff, 0x00, 0x12, 0xfa, 0x6c, 0x9a, 0xa6, + 0xaa, 0xa6, 0x69, 0x99, 0x6a, 0x00, 0x3c, 0xff, 0x00, 0x00, 0x36, 0xff, + 0x00, 0x14, 0x98, 0xa8, 0xcc, 0xd8, 0x88, 0x88, 0xc8, 0x8c, 0x88, 0x9f, + 0x22, 0xff, 0x00, 0x12, 0x7a, 0x99, 0x99, 0xa6, 0x6a, 0x6a, 0xd9, 0x99, + 0x6a, 0x00, 0x3a, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x36, 0xff, 0x00, 0x14, + 0xfc, 0xca, 0xcc, 0x99, 0xcc, 0x9c, 0xc8, 0x88, 0xcc, 0x6f, 0x22, 0xff, + 0x00, 0x12, 0xaa, 0x99, 0x69, 0x69, 0x66, 0x6a, 0xd9, 0x69, 0x6a, 0x00, + 0x3c, 0xff, 0x00, 0x00, 0x36, 0xff, 0x00, 0x14, 0xf7, 0xca, 0xc8, 0xca, + 0xad, 0x69, 0xc8, 0x88, 0x89, 0xaf, 0x22, 0xff, 0x00, 0x12, 0xca, 0x99, + 0x96, 0xa6, 0xaa, 0xad, 0xd9, 0x66, 0x6a, 0x00, 0x3a, 0xff, 0x02, 0xf0, + 0x00, 0x00, 0x38, 0xff, 0x00, 0x12, 0x9c, 0x99, 0xae, 0xda, 0xa9, 0xc8, + 0x88, 0x8c, 0xdf, 0x00, 0x20, 0xff, 0x00, 0x14, 0xfd, 0x9d, 0x96, 0x66, + 0x96, 0x6d, 0x6a, 0xa6, 0x66, 0x6a, 0x3c, 0xff, 0x00, 0x00, 0x38, 0xff, + 0x00, 0x10, 0xd9, 0x69, 0x96, 0xaa, 0xa6, 0xc8, 0x8c, 0x8c, 0x1e, 0xff, + 0x00, 0x18, 0xfe, 0xa6, 0xf6, 0x9a, 0x96, 0x9a, 0x66, 0xaa, 0xaa, 0x66, + 0x66, 0xaa, 0x3a, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x38, 0xff, 0x00, 0x10, + 0xa8, 0xc9, 0x6a, 0xa6, 0xa6, 0xc8, 0x88, 0xca, 0x1e, 0xff, 0x00, 0x18, + 0xf7, 0xed, 0xd6, 0x9a, 0x66, 0x6a, 0x6a, 0x66, 0x6a, 0xaa, 0x6a, 0xad, + 0x3c, 0xff, 0x00, 0x00, 0x38, 0xff, 0x00, 0x10, 0xec, 0x99, 0x9a, 0xa6, + 0xaa, 0x88, 0xc8, 0x97, 0x1e, 0xff, 0x00, 0x18, 0xfe, 0xda, 0x99, 0x9d, + 0xa6, 0x6a, 0x6a, 0xd6, 0xaa, 0x6a, 0xaa, 0xad, 0x3a, 0xff, 0x02, 0xf0, + 0x00, 0x00, 0x38, 0xff, 0x00, 0x10, 0xf6, 0x9c, 0xcc, 0x66, 0x66, 0x88, + 0x9c, 0xcf, 0x1e, 0xff, 0x00, 0x18, 0xfe, 0xda, 0x96, 0x9a, 0x66, 0xaa, + 0xaa, 0xad, 0xdd, 0x6a, 0xaa, 0xae, 0x3c, 0xff, 0x00, 0x00, 0x38, 0xff, + 0x00, 0x10, 0xf6, 0xc8, 0xcc, 0x99, 0x99, 0x88, 0x8c, 0x9f, 0x1e, 0xff, + 0x02, 0xfd, 0x02, 0xda, 0x08, 0x66, 0x00, 0x0c, 0xae, 0xea, 0xae, 0xaa, + 0xaa, 0xa7, 0x3a, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x38, 0xff, 0x00, 0x10, + 0xf9, 0xcc, 0xc9, 0x66, 0x69, 0x8c, 0xcc, 0xaf, 0x1e, 0xff, 0x00, 0x1c, + 0xfd, 0xda, 0x66, 0x66, 0x66, 0xad, 0xdd, 0xdd, 0xd7, 0xaa, 0xad, 0xa7, + 0xff, 0x77, 0x38, 0xff, 0x00, 0x00, 0x38, 0xff, 0x00, 0x10, 0xdc, 0xcc, + 0x99, 0x69, 0x69, 0x89, 0xcc, 0x7f, 0x1e, 0xff, 0x00, 0x1c, 0x7d, 0xda, + 0x66, 0x6a, 0xaa, 0xdd, 0xdd, 0xaa, 0x7d, 0xea, 0xda, 0xde, 0xff, 0xef, + 0x36, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x38, 0xff, 0x00, 0x0e, 0x69, 0x99, + 0x96, 0x99, 0x96, 0x8c, 0xc9, 0x00, 0x20, 0xff, 0x00, 0x1c, 0xea, 0xd6, + 0xa6, 0x6a, 0xaa, 0xdd, 0xad, 0xdd, 0xed, 0xda, 0xdd, 0xdd, 0xe7, 0xef, + 0x38, 0xff, 0x00, 0x00, 0x36, 0xff, 0x00, 0x10, 0xfd, 0x66, 0x96, 0x66, + 0x99, 0x99, 0xcc, 0xcc, 0x20, 0xff, 0x00, 0x1c, 0xad, 0xd6, 0xaa, 0x6a, + 0xad, 0xaa, 0xdd, 0xde, 0xed, 0xdd, 0xdd, 0xdd, 0xe7, 0x7f, 0x36, 0xff, + 0x02, 0xf0, 0x00, 0x00, 0x36, 0xff, 0x00, 0x10, 0xf6, 0xd9, 0x66, 0xa6, + 0x9c, 0xa8, 0xc6, 0xc9, 0x1e, 0xff, 0x00, 0x1c, 0xf7, 0xad, 0xaa, 0xde, + 0xaa, 0xaa, 0xad, 0xad, 0xee, 0xed, 0xdd, 0xdd, 0xde, 0xd7, 0x3a, 0xff, + 0x00, 0x00, 0x36, 0xff, 0x00, 0x10, 0xda, 0xa9, 0x66, 0x66, 0xc6, 0x68, + 0x96, 0x96, 0x1e, 0xff, 0x00, 0x1c, 0xfe, 0xad, 0xdd, 0xdd, 0xda, 0xaa, + 0xdd, 0xee, 0xed, 0xee, 0xde, 0xdd, 0xdd, 0xe7, 0x38, 0xff, 0x02, 0xf0, + 0x00, 0x00, 0x36, 0xff, 0x00, 0x10, 0xd6, 0x66, 0x96, 0x99, 0x9a, 0xc8, + 0x69, 0x9d, 0x1e, 0xff, 0x00, 0x1c, 0x7a, 0xad, 0xda, 0xde, 0xda, 0xaa, + 0xde, 0xee, 0xee, 0xee, 0xde, 0xdd, 0xde, 0x7f, 0x3a, 0xff, 0x00, 0x00, + 0x34, 0xff, 0x00, 0x12, 0xfa, 0x6a, 0x69, 0x99, 0xc9, 0xac, 0x89, 0x66, + 0x9d, 0x00, 0x1e, 0xff, 0x00, 0x1c, 0xda, 0xad, 0xad, 0xde, 0xda, 0xd7, + 0xee, 0xee, 0xee, 0x7e, 0xee, 0xee, 0xed, 0x7f, 0x38, 0xff, 0x02, 0xf0, + 0x00, 0x00, 0x32, 0xff, 0x00, 0x14, 0xfe, 0xd6, 0x66, 0xa9, 0x99, 0x99, + 0xcc, 0x96, 0xaa, 0x9e, 0x1c, 0xff, 0x00, 0x20, 0xfe, 0xed, 0xdd, 0xdd, + 0xde, 0xed, 0xde, 0xee, 0xee, 0xee, 0x7e, 0x7e, 0xee, 0xee, 0x77, 0x7f, + 0x38, 0xff, 0x00, 0x00, 0x2e, 0xff, 0x00, 0x18, 0xf7, 0xdd, 0xaa, 0x66, + 0x6a, 0xaa, 0x69, 0x9c, 0xc9, 0x9a, 0xaa, 0x9d, 0x1c, 0xff, 0x00, 0x20, + 0xda, 0xdd, 0xdd, 0xdd, 0xde, 0xed, 0xde, 0xe7, 0xe7, 0xe7, 0xee, 0xe7, + 0xee, 0xee, 0xee, 0x7f, 0x36, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x2e, 0xff, + 0x00, 0x18, 0xed, 0xa6, 0xaa, 0xaa, 0x66, 0xaa, 0xaa, 0x99, 0x6a, 0x66, + 0xaa, 0x6a, 0x1c, 0xff, 0x00, 0x20, 0xdd, 0xed, 0xdd, 0xed, 0xde, 0xed, + 0xee, 0xee, 0x77, 0xee, 0xee, 0xe7, 0x7e, 0xee, 0xe7, 0x7f, 0x38, 0xff, + 0x00, 0x00, 0x2c, 0xff, 0x00, 0x1a, 0xf7, 0xdd, 0xaa, 0xdd, 0xde, 0xd6, + 0xad, 0xaa, 0xaa, 0xad, 0x69, 0x6a, 0x6a, 0x00, 0x1c, 0xff, 0x00, 0x20, + 0xdd, 0xdd, 0xde, 0xed, 0xee, 0xed, 0xee, 0x77, 0x7e, 0xee, 0xe7, 0xe7, + 0xee, 0xee, 0xe7, 0x7f, 0x36, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x2c, 0xff, + 0x00, 0x1a, 0xdd, 0xad, 0xdd, 0xad, 0xdd, 0xda, 0xaa, 0xaa, 0x66, 0x66, + 0x66, 0xaa, 0x9a, 0x00, 0x1c, 0xff, 0x00, 0x20, 0xdd, 0xde, 0xee, 0xee, + 0xde, 0x7e, 0xe7, 0x7e, 0xee, 0xe7, 0x77, 0xee, 0xe7, 0xe7, 0xe7, 0x77, + 0x38, 0xff, 0x00, 0x00, 0x28, 0xff, 0x00, 0x20, 0xf7, 0xed, 0xda, 0xaa, + 0xdd, 0xda, 0xda, 0xad, 0xaa, 0xaa, 0xaa, 0xa6, 0x6a, 0xaa, 0x6a, 0x7f, + 0x1a, 0xff, 0x00, 0x20, 0xee, 0xdd, 0xed, 0xed, 0xe7, 0xee, 0xde, 0xee, + 0xee, 0x77, 0x77, 0x7e, 0x7e, 0xee, 0xe7, 0x77, 0x36, 0xff, 0x02, 0xf0, + 0x00, 0x00, 0x28, 0xff, 0x02, 0x7e, 0x02, 0xee, 0x08, 0xdd, 0x02, 0xad, + 0x08, 0xda, 0x00, 0x0a, 0xaa, 0xaa, 0xaa, 0x6a, 0x7f, 0x00, 0x1a, 0xff, + 0x00, 0x20, 0xed, 0xde, 0xed, 0xee, 0xee, 0x7e, 0xe7, 0x77, 0xff, 0x77, + 0x77, 0x77, 0xe7, 0xee, 0x77, 0x77, 0x38, 0xff, 0x00, 0x00, 0x00, 0x18, + 0xf5, 0x35, 0x55, 0x25, 0x55, 0x5f, 0x55, 0x55, 0x50, 0x55, 0x35, 0xf2, + 0x08, 0x55, 0x02, 0x5f, 0x02, 0xf3, 0x08, 0x55, 0x00, 0x14, 0x53, 0x55, + 0x53, 0x5d, 0x05, 0x55, 0x33, 0x55, 0x55, 0x05, 0x0c, 0x55, 0x02, 0x35, + 0x0a, 0xff, 0x00, 0x18, 0x35, 0x55, 0x35, 0xff, 0xff, 0x75, 0x55, 0x35, + 0x35, 0x55, 0x53, 0x73, 0x0a, 0x55, 0x00, 0x24, 0x35, 0x55, 0x35, 0x55, + 0x55, 0x3f, 0x55, 0x55, 0x53, 0x53, 0x55, 0x55, 0x55, 0x2f, 0x55, 0x53, + 0x5f, 0x35, 0x08, 0x55, 0x00, 0x08, 0xff, 0x55, 0x55, 0x53, 0x08, 0x55, + 0x02, 0x53, 0x02, 0xf0, 0x00, 0x00, 0x00, 0x40, 0xf5, 0xbb, 0xb8, 0x55, + 0x8b, 0x65, 0xdb, 0xbb, 0x61, 0xbb, 0xb1, 0x35, 0x9b, 0xbb, 0xbb, 0xbb, + 0x65, 0x50, 0x8b, 0xbb, 0xbb, 0xb8, 0x65, 0x8b, 0xbb, 0x5d, 0x38, 0xbb, + 0xb1, 0xbb, 0xb6, 0x58, 0x08, 0xbb, 0x00, 0x06, 0x68, 0xbb, 0xb5, 0x00, + 0x0a, 0xff, 0x00, 0x56, 0x58, 0xbb, 0xb5, 0xff, 0xff, 0x56, 0xbb, 0xb1, + 0x5b, 0xbb, 0x85, 0x75, 0x8b, 0xbb, 0x58, 0xbb, 0xb5, 0x3c, 0xbc, 0x53, + 0xbb, 0xb8, 0x52, 0x1b, 0xbb, 0xbb, 0x15, 0xbb, 0xbb, 0xb8, 0x53, 0x6b, + 0xbb, 0x13, 0x58, 0xbb, 0x89, 0xbb, 0xba, 0x35, 0xab, 0xbb, 0x61, 0x00, + 0x08, 0xbb, 0x02, 0xb5, 0x02, 0xff, 0x00, 0x00, 0x00, 0x18, 0xf5, 0xbb, + 0xb8, 0x56, 0xbb, 0xb0, 0x1b, 0xbb, 0x66, 0xbb, 0xbd, 0x58, 0x08, 0xbb, + 0x02, 0xb6, 0x02, 0x5b, 0x08, 0xbb, 0x00, 0x14, 0xb1, 0x8b, 0xbb, 0x5e, + 0x58, 0xbb, 0xb1, 0xbb, 0xb6, 0x58, 0x08, 0xbb, 0x00, 0x06, 0x68, 0xbb, + 0xb5, 0x00, 0x0a, 0xff, 0x00, 0x56, 0x58, 0xbb, 0xb5, 0xff, 0xff, 0x56, + 0xbb, 0xba, 0x3b, 0xbb, 0x85, 0x56, 0xbb, 0xb6, 0x58, 0xbb, 0xb3, 0x1b, + 0xbb, 0x15, 0xbb, 0xb8, 0x55, 0x9b, 0xbb, 0xbb, 0x91, 0xbb, 0xbb, 0xbb, + 0x52, 0x0b, 0xbb, 0x9a, 0x1b, 0xbb, 0x96, 0xbb, 0xb1, 0x25, 0xbb, 0xb8, + 0x01, 0x00, 0x08, 0xbb, 0x02, 0xb3, 0x02, 0xf0, 0x00, 0x00, 0x00, 0x4e, + 0xf5, 0xbb, 0xb8, 0x5b, 0xbb, 0xb9, 0x1b, 0xbb, 0x99, 0xbb, 0xb1, 0x5b, + 0xbb, 0xb6, 0x16, 0xbb, 0xb8, 0xab, 0xbb, 0x8a, 0x19, 0xbb, 0xb6, 0x8b, + 0xbb, 0x3e, 0x58, 0xbb, 0xba, 0xbb, 0xb6, 0x58, 0xbb, 0xb1, 0xd1, 0xa1, + 0x08, 0xbb, 0xb3, 0x00, 0x0a, 0xff, 0x00, 0x40, 0x58, 0xbb, 0xb3, 0xff, + 0xff, 0x56, 0xbb, 0xb1, 0x5b, 0xbb, 0x85, 0x0b, 0xbb, 0x85, 0x58, 0xbb, + 0xb5, 0x8b, 0xbb, 0x85, 0xbb, 0xbc, 0x55, 0x8b, 0xbb, 0xbb, 0x86, 0xbb, + 0xbb, 0xbb, 0x12, 0x5b, 0x08, 0xbb, 0x00, 0x1a, 0x66, 0xbb, 0xb1, 0x59, + 0xbb, 0xba, 0x3a, 0xbb, 0xbc, 0x1d, 0x1a, 0x15, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x98, 0xf3, 0xbb, 0xb8, 0x9b, 0xbb, 0xbb, 0x6b, 0xbb, 0x61, 0xbb, + 0xba, 0x56, 0x69, 0x65, 0x16, 0xbb, 0xb8, 0x1b, 0xbb, 0x65, 0x3a, 0xbb, + 0xb6, 0x8b, 0xbb, 0x55, 0x58, 0xbb, 0xb1, 0xbb, 0xb6, 0x58, 0xbb, 0xb5, + 0x55, 0x53, 0x58, 0xbb, 0xb5, 0x55, 0x55, 0x5f, 0xff, 0xff, 0x58, 0xbb, + 0xb5, 0x55, 0x53, 0x56, 0xbb, 0xb1, 0x3b, 0xbb, 0xbc, 0x8b, 0xbb, 0xc5, + 0x5c, 0xbb, 0xb6, 0xbb, 0xbb, 0xb6, 0xbb, 0xb8, 0x53, 0xbb, 0xb8, 0xbb, + 0xbb, 0xbb, 0x8b, 0xbb, 0x65, 0x5c, 0x08, 0xbb, 0x00, 0x1a, 0x16, 0xbb, + 0xb8, 0x8b, 0xbb, 0xb0, 0x51, 0xbb, 0xb6, 0x55, 0x55, 0x5f, 0xf0, 0x00, + 0x00, 0x00, 0x02, 0xf5, 0x0e, 0xbb, 0x00, 0x20, 0x69, 0xbb, 0xb1, 0x35, + 0x6c, 0x8b, 0xbb, 0xbb, 0xb6, 0x1b, 0xbb, 0x65, 0xe0, 0x1a, 0x10, 0x8b, + 0x08, 0xbb, 0x00, 0x08, 0xba, 0xbb, 0xb6, 0x58, 0x08, 0xbb, 0x02, 0x5c, + 0x08, 0xbb, 0x00, 0x08, 0x3f, 0xff, 0xff, 0x5c, 0x08, 0xbb, 0x00, 0x08, + 0x56, 0xbb, 0xba, 0x5b, 0x08, 0xbb, 0x02, 0xb9, 0x02, 0x58, 0x0c, 0xbb, + 0x00, 0x20, 0xb8, 0x51, 0xbb, 0xb6, 0xbb, 0xbb, 0xbb, 0x6b, 0xbb, 0xc5, + 0x56, 0xbb, 0xb6, 0x8b, 0xbb, 0x56, 0x0a, 0xbb, 0x02, 0x0a, 0x08, 0xbb, + 0x02, 0x65, 0x02, 0xff, 0x00, 0x00, 0x00, 0x30, 0xf5, 0xbb, 0xbb, 0xbb, + 0x86, 0xbb, 0xbb, 0xbb, 0x66, 0xbb, 0xbd, 0x58, 0xbb, 0xbb, 0xbb, 0x8c, + 0x65, 0x1b, 0xbb, 0x65, 0x75, 0x35, 0x55, 0x8b, 0x08, 0xbb, 0x00, 0x08, + 0xb1, 0xbb, 0xb6, 0x58, 0x08, 0xbb, 0x02, 0x58, 0x08, 0xbb, 0x00, 0x08, + 0x5f, 0xff, 0xff, 0x58, 0x08, 0xbb, 0x00, 0x4c, 0x56, 0xbb, 0xb1, 0x3b, + 0xbb, 0xb8, 0x88, 0x8b, 0xb8, 0x58, 0xbb, 0xbb, 0xbb, 0x1b, 0xbb, 0xbb, + 0xb8, 0x56, 0xbb, 0xb0, 0x8b, 0xbb, 0xbb, 0x08, 0xbb, 0xb3, 0x20, 0xbb, + 0xb6, 0xbb, 0xbc, 0x56, 0xbb, 0xb8, 0x88, 0x8b, 0xbb, 0xd1, 0x08, 0xbb, + 0x02, 0x63, 0x02, 0xf0, 0x00, 0x00, 0x00, 0xba, 0xf5, 0xbb, 0xbb, 0xbb, + 0x65, 0x8b, 0xbb, 0xbb, 0x66, 0xbb, 0xb1, 0x5b, 0xbb, 0x81, 0x10, 0x66, + 0x6a, 0x1b, 0xbb, 0x65, 0x51, 0xbb, 0xb6, 0x8b, 0xbb, 0x1a, 0x18, 0xbb, + 0xb1, 0xbb, 0xb6, 0x58, 0xbb, 0xb1, 0x11, 0x11, 0x58, 0xbb, 0xb1, 0x11, + 0x11, 0x5f, 0xff, 0xff, 0x58, 0xbb, 0xb1, 0x11, 0x11, 0x56, 0xbb, 0xb1, + 0x5b, 0xbb, 0xc5, 0x55, 0x1b, 0xb8, 0x58, 0xbb, 0xbb, 0xbc, 0x59, 0xbb, + 0xbb, 0xb8, 0x58, 0xbb, 0xb5, 0x6b, 0xbb, 0xbb, 0x59, 0xbb, 0xb1, 0x25, + 0xbb, 0xb8, 0xbb, 0xb6, 0x56, 0xbb, 0xb1, 0x55, 0x58, 0xbb, 0x1a, 0xbb, + 0xbc, 0x11, 0x11, 0x02, 0xff, 0x00, 0x00, 0x00, 0x00, 0xba, 0xf5, 0xbb, + 0xbb, 0xb8, 0x53, 0x1b, 0xbb, 0xbb, 0x69, 0xbb, 0xba, 0x5b, 0xbb, 0xb6, + 0x6c, 0xbb, 0xb6, 0x0b, 0xbb, 0x86, 0x6c, 0xbb, 0xb6, 0x8b, 0xbb, 0x33, + 0x5c, 0xbb, 0xba, 0xbb, 0xb6, 0x58, 0xbb, 0xb6, 0x66, 0x66, 0x18, 0xbb, + 0xb6, 0x66, 0x66, 0x12, 0xff, 0xff, 0x58, 0xbb, 0xb6, 0x66, 0x66, 0x16, + 0xbb, 0xba, 0x5b, 0xbb, 0xb8, 0xc8, 0x8b, 0xb8, 0x58, 0xbb, 0xbb, 0xb5, + 0x25, 0xbb, 0xbb, 0xbc, 0x5b, 0xbb, 0x85, 0x1b, 0xbb, 0xbc, 0x5a, 0xbb, + 0xb6, 0x55, 0x8b, 0xbb, 0xbb, 0xb0, 0x56, 0xbb, 0xb8, 0x88, 0x8b, 0xbb, + 0x11, 0xbb, 0xb8, 0x66, 0x66, 0x65, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x18, + 0xf5, 0xbb, 0xbb, 0xb1, 0x2f, 0x5c, 0xbb, 0xbb, 0x61, 0xbb, 0xb1, 0x36, + 0x08, 0xbb, 0x02, 0x85, 0x02, 0x58, 0x08, 0xbb, 0x00, 0x14, 0xb5, 0x8b, + 0xbb, 0x57, 0x58, 0xbb, 0xb1, 0xbb, 0xb6, 0x58, 0x08, 0xbb, 0x02, 0x68, + 0x08, 0xbb, 0x00, 0x08, 0x65, 0xff, 0xff, 0x58, 0x08, 0xbb, 0x00, 0x08, + 0x96, 0xbb, 0xb1, 0x3b, 0x08, 0xbb, 0x00, 0x30, 0xb9, 0x58, 0xbb, 0xbb, + 0x65, 0x75, 0x6b, 0xbb, 0xb8, 0x1b, 0xbb, 0x65, 0x3b, 0xbb, 0xb6, 0x50, + 0xbb, 0xbc, 0x53, 0x6b, 0xbb, 0xbb, 0xb5, 0x36, 0x0a, 0xbb, 0x02, 0x0a, + 0x08, 0xbb, 0x02, 0xb5, 0x02, 0xff, 0x00, 0x00, 0x00, 0xba, 0xf5, 0x8c, + 0x88, 0x65, 0xff, 0x20, 0xc8, 0xc8, 0x66, 0xc8, 0x80, 0x23, 0x1c, 0xc8, + 0x8c, 0x86, 0x03, 0x35, 0x6c, 0x8c, 0x88, 0x89, 0x05, 0x98, 0x88, 0x57, + 0x59, 0x88, 0x80, 0x88, 0x86, 0x59, 0x88, 0x8c, 0x88, 0xc8, 0x69, 0xc8, + 0x8c, 0x88, 0xc8, 0x63, 0xff, 0xff, 0x56, 0x88, 0xc8, 0x8c, 0x88, 0x16, + 0x88, 0x80, 0x58, 0x8c, 0x88, 0x88, 0x88, 0x60, 0x59, 0x88, 0x8c, 0x57, + 0x7e, 0x5c, 0x88, 0x89, 0x68, 0x88, 0x03, 0x59, 0x88, 0x80, 0x25, 0x98, + 0x89, 0x52, 0x1c, 0x88, 0xc8, 0x95, 0x36, 0x88, 0xc8, 0x8c, 0x88, 0xc1, + 0x50, 0x8c, 0x88, 0xc8, 0x8c, 0x85, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x40, + 0xf3, 0x55, 0x55, 0x5f, 0xff, 0xf3, 0x55, 0x55, 0x33, 0x55, 0x53, 0xff, + 0x35, 0x55, 0x55, 0x55, 0xff, 0xff, 0x35, 0x55, 0x53, 0x55, 0x7e, 0x55, + 0x55, 0x3f, 0x25, 0x53, 0x53, 0x55, 0x53, 0x73, 0x08, 0x55, 0x02, 0x35, + 0x08, 0x55, 0x00, 0x08, 0x3f, 0xff, 0xff, 0x25, 0x08, 0x55, 0x00, 0x40, + 0x33, 0x53, 0x53, 0x33, 0x55, 0x55, 0x53, 0x55, 0x57, 0x23, 0x55, 0x55, + 0x37, 0x77, 0x25, 0x55, 0x35, 0x35, 0x35, 0x3e, 0x75, 0x53, 0x53, 0xf2, + 0x55, 0x55, 0x2f, 0x35, 0x55, 0x55, 0x52, 0xf3, 0x08, 0x55, 0x02, 0x52, + 0x02, 0xf3, 0x08, 0x55, 0x02, 0x53, 0x02, 0xff, 0x00, 0x00, 0x26, 0xff, + 0x00, 0x1c, 0xf7, 0xf7, 0x77, 0x77, 0xff, 0xff, 0xf7, 0x77, 0xee, 0xee, + 0xe7, 0x77, 0x77, 0x7f, 0x1e, 0xff, 0x00, 0x30, 0xf7, 0x77, 0x77, 0x77, + 0xee, 0x7e, 0x77, 0x77, 0x7f, 0xff, 0x7e, 0x7f, 0xf7, 0x77, 0x77, 0x77, + 0xf7, 0x77, 0x77, 0x7f, 0x77, 0x77, 0x7e, 0xef, 0x28, 0xff, 0x02, 0xf0, + 0x00, 0x00, 0x34, 0xff, 0x00, 0x08, 0x7e, 0xee, 0xee, 0x77, 0x2a, 0xff, + 0x00, 0x10, 0xf7, 0x77, 0x7e, 0x7e, 0x77, 0x77, 0xf7, 0x7f, 0x18, 0xff, + 0x02, 0x7f, 0x2a, 0xff, 0x00, 0x00, 0x02, 0xff, 0x0a, 0x55, 0x02, 0x52, + 0x0a, 0xff, 0x02, 0x25, 0x0a, 0x55, 0x02, 0xff, 0x02, 0xf3, 0x0a, 0x55, + 0x00, 0x0c, 0x3f, 0x77, 0xe7, 0xee, 0x7f, 0x35, 0x0a, 0x55, 0x0a, 0xff, + 0x02, 0x25, 0x12, 0x55, 0x02, 0x2f, 0x0a, 0x77, 0x00, 0x08, 0x7f, 0xff, + 0x22, 0x35, 0x10, 0x55, 0x02, 0x53, 0x02, 0x22, 0x0c, 0xff, 0x02, 0xf2, + 0x02, 0x23, 0x12, 0x55, 0x00, 0x0a, 0x32, 0x2f, 0xff, 0xff, 0xf0, 0x00, + 0x00, 0x00, 0x02, 0xff, 0x0a, 0x55, 0x02, 0x53, 0x0a, 0xff, 0x02, 0x35, + 0x0a, 0x55, 0x02, 0xff, 0x02, 0xf5, 0x0a, 0x55, 0x00, 0x0c, 0x5f, 0x77, + 0xee, 0x77, 0xff, 0x35, 0x0a, 0x55, 0x0a, 0xff, 0x02, 0x35, 0x12, 0x55, + 0x02, 0x3f, 0x0a, 0x77, 0x02, 0x7f, 0x02, 0xf3, 0x18, 0x55, 0x02, 0x3f, + 0x0a, 0xff, 0x02, 0x35, 0x16, 0x55, 0x00, 0x08, 0x53, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x02, 0xff, 0x0a, 0x55, 0x02, 0x53, 0x0a, 0xff, 0x02, 0x35, + 0x0a, 0x55, 0x02, 0xff, 0x02, 0xf3, 0x0a, 0x55, 0x00, 0x0a, 0x5f, 0x27, + 0x77, 0x77, 0x7f, 0x00, 0x0c, 0x55, 0x0a, 0xff, 0x14, 0x55, 0x00, 0x0e, + 0x5f, 0x77, 0x77, 0x77, 0xe7, 0x7f, 0xf2, 0x00, 0x1c, 0x55, 0x00, 0x0a, + 0x2f, 0xff, 0xff, 0xff, 0x25, 0x00, 0x1a, 0x55, 0x00, 0x06, 0x52, 0xff, + 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xff, 0x55, 0x44, 0x44, 0x44, 0x45, + 0x53, 0x00, 0x0a, 0xff, 0x00, 0x10, 0x35, 0x54, 0x44, 0x44, 0x45, 0x54, + 0xff, 0xf2, 0x08, 0x44, 0x00, 0x18, 0x55, 0x52, 0xf7, 0xf7, 0x77, 0xff, + 0x55, 0x54, 0x44, 0x44, 0x45, 0x42, 0x08, 0xff, 0x00, 0x06, 0xf2, 0x55, + 0x54, 0x00, 0x0e, 0x44, 0x00, 0x16, 0x55, 0x5f, 0xf7, 0x77, 0x77, 0xe7, + 0x7f, 0x25, 0x55, 0x55, 0x54, 0x00, 0x10, 0x44, 0x00, 0x14, 0x45, 0x55, + 0x55, 0x52, 0xff, 0xff, 0xf2, 0x55, 0x55, 0x55, 0x12, 0x44, 0x00, 0x0a, + 0x55, 0x55, 0x55, 0x2f, 0xff, 0x00, 0x00, 0x00, 0x02, 0xff, 0x02, 0x55, + 0x08, 0x44, 0x02, 0x53, 0x0a, 0xff, 0x00, 0x26, 0x24, 0x54, 0x44, 0x44, + 0x44, 0x55, 0xff, 0xff, 0x45, 0x44, 0x44, 0x44, 0x45, 0x52, 0xff, 0xff, + 0xff, 0xf2, 0x55, 0x00, 0x08, 0x44, 0x02, 0x42, 0x08, 0xff, 0x00, 0x06, + 0xf2, 0x55, 0x54, 0x00, 0x0e, 0x44, 0x00, 0x12, 0x55, 0x52, 0xf7, 0x77, + 0x77, 0x77, 0xff, 0x55, 0x53, 0x00, 0x16, 0x44, 0x00, 0x10, 0x45, 0x55, + 0x55, 0xff, 0xff, 0xf5, 0x55, 0x34, 0x16, 0x44, 0x00, 0x08, 0x55, 0x55, + 0x5f, 0xf0, 0x00, 0x00, 0x00, 0x0e, 0xff, 0x45, 0x54, 0x44, 0x44, 0x45, + 0x53, 0x00, 0x0a, 0xff, 0x00, 0x30, 0x35, 0x54, 0x44, 0x44, 0x44, 0x55, + 0xff, 0xff, 0x54, 0x44, 0x44, 0x44, 0x55, 0x53, 0x22, 0x22, 0x22, 0x23, + 0x55, 0x54, 0x44, 0x44, 0x44, 0x5f, 0x08, 0xff, 0x02, 0xf3, 0x02, 0x55, + 0x10, 0x44, 0x00, 0x12, 0x55, 0x53, 0xff, 0xf7, 0x77, 0x7f, 0xf2, 0x55, + 0x54, 0x00, 0x18, 0x44, 0x00, 0x0c, 0x45, 0x55, 0x2f, 0xff, 0x25, 0x55, + 0x1a, 0x44, 0x00, 0x06, 0x55, 0x52, 0xff, 0x00, 0x00, 0x00, 0x00, 0x0e, + 0xff, 0x55, 0x44, 0x44, 0x44, 0x45, 0x42, 0x00, 0x0a, 0xff, 0x00, 0x1a, + 0x35, 0x54, 0x44, 0x44, 0x44, 0x55, 0xff, 0xff, 0x34, 0x44, 0x44, 0x44, + 0x45, 0x00, 0x0c, 0x55, 0x00, 0x16, 0x44, 0x44, 0x44, 0x45, 0x5f, 0x77, + 0xff, 0xff, 0xff, 0xf5, 0x55, 0x00, 0x10, 0x44, 0x00, 0x12, 0x45, 0x53, + 0xff, 0x77, 0x77, 0xf7, 0xf3, 0x55, 0x54, 0x00, 0x18, 0x44, 0x00, 0x0c, + 0x45, 0x55, 0x5f, 0xff, 0x35, 0x55, 0x1a, 0x44, 0x00, 0x06, 0x55, 0x55, + 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xff, 0x55, 0x44, 0x44, 0x44, 0x45, + 0x53, 0x00, 0x0a, 0xff, 0x00, 0x1a, 0x35, 0x44, 0x44, 0x44, 0x45, 0x54, + 0xff, 0xff, 0x24, 0x54, 0x44, 0x44, 0x45, 0x00, 0x0c, 0x55, 0x08, 0x44, + 0x00, 0x0e, 0x3f, 0x77, 0x7f, 0xff, 0xff, 0x25, 0x55, 0x00, 0x10, 0x44, + 0x00, 0x10, 0x45, 0x55, 0xf7, 0xe7, 0xff, 0x77, 0xf5, 0x55, 0x0a, 0x44, + 0x00, 0x08, 0x55, 0x35, 0x53, 0x55, 0x0a, 0x44, 0x00, 0x0a, 0x55, 0x5f, + 0xff, 0x55, 0x54, 0x00, 0x08, 0x44, 0x00, 0x0a, 0x45, 0x35, 0x53, 0x55, + 0x34, 0x00, 0x08, 0x44, 0x00, 0x06, 0x45, 0x55, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0xff, 0x55, 0x44, 0x44, 0x44, 0x45, 0x53, 0x00, 0x0a, 0xff, + 0x00, 0x12, 0x35, 0x54, 0x44, 0x44, 0x44, 0x55, 0xff, 0xff, 0xf4, 0x00, + 0x08, 0x44, 0x02, 0x45, 0x08, 0x55, 0x08, 0x44, 0x00, 0x10, 0x54, 0x2f, + 0x77, 0x77, 0xff, 0xff, 0x25, 0x55, 0x12, 0x44, 0x00, 0x0e, 0x55, 0x2f, + 0x77, 0x77, 0xe7, 0xf5, 0x54, 0x00, 0x08, 0x44, 0x02, 0x42, 0x08, 0xff, + 0x02, 0x24, 0x08, 0x44, 0x00, 0x08, 0x45, 0x5f, 0xff, 0x55, 0x0a, 0x44, + 0x00, 0x0a, 0x2f, 0xff, 0xff, 0xff, 0xf2, 0x00, 0x0a, 0x44, 0x02, 0x55, + 0x02, 0xf0, 0x00, 0x00, 0x00, 0x0e, 0xff, 0x45, 0x54, 0x44, 0x44, 0x44, + 0x53, 0x00, 0x0a, 0xff, 0x00, 0x12, 0x34, 0x54, 0x44, 0x44, 0x44, 0x55, + 0xff, 0xff, 0xf5, 0x00, 0x1c, 0x44, 0x00, 0x0e, 0xf7, 0x77, 0x77, 0xff, + 0xff, 0x35, 0x54, 0x00, 0x10, 0x44, 0x00, 0x3e, 0x45, 0x55, 0x3f, 0xf7, + 0x7e, 0xe7, 0xf4, 0x55, 0x44, 0x44, 0x44, 0x45, 0x4f, 0x7e, 0xee, 0xdd, + 0xd7, 0xf4, 0x54, 0x44, 0x44, 0x44, 0x45, 0x5f, 0xff, 0x45, 0x54, 0x44, + 0x44, 0x44, 0x54, 0x00, 0x0a, 0xff, 0x02, 0x45, 0x08, 0x44, 0x02, 0x55, + 0x02, 0xff, 0x00, 0x00, 0x00, 0x0e, 0xff, 0x55, 0x44, 0x44, 0x44, 0x45, + 0x53, 0x00, 0x0a, 0xff, 0x00, 0x12, 0x35, 0x54, 0x44, 0x44, 0x44, 0x55, + 0xff, 0xff, 0xf3, 0x00, 0x1a, 0x44, 0x00, 0x10, 0x55, 0xf7, 0xe7, 0x7e, + 0x77, 0xff, 0x55, 0x54, 0x12, 0x44, 0x00, 0x32, 0x55, 0x5f, 0xf7, 0xee, + 0xe7, 0xf5, 0x54, 0x44, 0x44, 0x44, 0x45, 0x5f, 0x7d, 0xda, 0xaa, 0xae, + 0xf5, 0x54, 0x44, 0x44, 0x44, 0x45, 0x5f, 0xff, 0x55, 0x00, 0x08, 0x44, + 0x02, 0x55, 0x0a, 0xff, 0x02, 0x54, 0x08, 0x44, 0x02, 0x54, 0x02, 0xf0, + 0x00, 0x00, 0x00, 0x0e, 0xff, 0x55, 0x44, 0x44, 0x44, 0x45, 0x52, 0x00, + 0x0a, 0xff, 0x00, 0x14, 0x25, 0x54, 0x44, 0x44, 0x45, 0x54, 0xff, 0xff, + 0xf3, 0x45, 0x18, 0x44, 0x00, 0x10, 0x43, 0xf7, 0x77, 0xe7, 0x77, 0xf2, + 0x55, 0x54, 0x08, 0x44, 0x02, 0x54, 0x08, 0x44, 0x00, 0x3c, 0x55, 0x5f, + 0x7e, 0xee, 0xe7, 0xf5, 0x54, 0x44, 0x44, 0x44, 0x55, 0x4f, 0x7d, 0xaa, + 0xaa, 0xae, 0xf5, 0x54, 0x44, 0x44, 0x44, 0x55, 0x4f, 0xff, 0x55, 0x44, + 0x44, 0x44, 0x45, 0x54, 0x0a, 0xff, 0x02, 0x54, 0x08, 0x44, 0x02, 0x45, + 0x02, 0xff, 0x00, 0x00, 0x00, 0x0e, 0xff, 0x55, 0x44, 0x44, 0x44, 0x55, + 0x53, 0x00, 0x0a, 0x22, 0x00, 0x12, 0x35, 0x55, 0x44, 0x44, 0x44, 0x55, + 0xff, 0xff, 0xff, 0x00, 0x18, 0x44, 0x00, 0x1c, 0x45, 0x42, 0xf7, 0x7e, + 0x77, 0x77, 0xf2, 0x55, 0x54, 0x44, 0x44, 0x44, 0x45, 0xf4, 0x08, 0x44, + 0x00, 0x32, 0x55, 0x52, 0xfe, 0x7e, 0xe7, 0xf5, 0x54, 0x44, 0x44, 0x44, + 0x45, 0x5f, 0xed, 0xaa, 0x6a, 0xae, 0xf5, 0x54, 0x44, 0x44, 0x44, 0x45, + 0x5f, 0xff, 0x55, 0x00, 0x08, 0x44, 0x02, 0x55, 0x0a, 0xff, 0x0c, 0x44, + 0x02, 0xf0, 0x00, 0x00, 0x00, 0x0c, 0xff, 0x45, 0x54, 0x44, 0x44, 0x45, + 0x0e, 0x55, 0x00, 0x22, 0x54, 0x44, 0x44, 0x44, 0x55, 0xff, 0xff, 0xff, + 0x55, 0x44, 0x44, 0x44, 0x45, 0x45, 0xff, 0xf5, 0x45, 0x00, 0x08, 0x44, + 0x00, 0x0e, 0x4f, 0x77, 0x77, 0x77, 0xe7, 0xf3, 0x55, 0x00, 0x08, 0x44, + 0x02, 0x45, 0x02, 0xf5, 0x08, 0x44, 0x00, 0x3c, 0x55, 0x53, 0xf7, 0xee, + 0xe7, 0xf4, 0x55, 0x44, 0x44, 0x44, 0x45, 0x5f, 0xea, 0x66, 0x66, 0xae, + 0xf4, 0x55, 0x44, 0x44, 0x44, 0x45, 0x5f, 0xff, 0x45, 0x54, 0x44, 0x44, + 0x44, 0x55, 0x0a, 0xff, 0x0c, 0x45, 0x02, 0xf0, 0x00, 0x00, 0x00, 0x0c, + 0xff, 0x55, 0x44, 0x44, 0x44, 0x45, 0x0e, 0x55, 0x00, 0x22, 0x54, 0x44, + 0x44, 0x44, 0x55, 0xff, 0xff, 0xff, 0x54, 0x44, 0x44, 0x44, 0x45, 0x55, + 0xff, 0xf3, 0x55, 0x00, 0x08, 0x44, 0x00, 0x1a, 0x5f, 0x77, 0x7e, 0x7e, + 0x77, 0xf5, 0x55, 0x44, 0x44, 0x44, 0x45, 0x43, 0xf3, 0x00, 0x08, 0x44, + 0x00, 0x3c, 0x45, 0x53, 0xf7, 0xee, 0xe7, 0xf5, 0x54, 0x44, 0x44, 0x44, + 0x54, 0x5f, 0xea, 0xaa, 0x69, 0xad, 0xf5, 0x54, 0x44, 0x44, 0x44, 0x45, + 0x5f, 0xff, 0x55, 0x44, 0x44, 0x44, 0x45, 0x45, 0x16, 0xff, 0x02, 0xf0, + 0x00, 0x00, 0x02, 0xff, 0x02, 0x55, 0x08, 0x44, 0x02, 0x45, 0x0a, 0x55, + 0x00, 0x24, 0x54, 0x44, 0x44, 0x44, 0x45, 0x54, 0xff, 0xff, 0xff, 0x34, + 0x54, 0x44, 0x44, 0x45, 0x55, 0xff, 0xf5, 0x55, 0x08, 0x44, 0x00, 0x0e, + 0x3f, 0x7e, 0x77, 0xee, 0x7f, 0x25, 0x55, 0x00, 0x08, 0x44, 0x00, 0x3e, + 0x42, 0xf2, 0x45, 0x44, 0x44, 0x44, 0x45, 0x55, 0xf7, 0xee, 0xd7, 0xf5, + 0x54, 0x44, 0x44, 0x44, 0x45, 0x52, 0xe6, 0x66, 0x69, 0x6e, 0xf5, 0x54, + 0x44, 0x44, 0x44, 0x55, 0x4f, 0xff, 0x55, 0x00, 0x08, 0x44, 0x02, 0x55, + 0x16, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x02, 0xff, 0x02, 0x55, 0x1e, 0x44, + 0x00, 0x0a, 0x55, 0xff, 0xff, 0xff, 0x24, 0x00, 0x08, 0x44, 0x00, 0x1e, + 0x55, 0x2f, 0x25, 0x55, 0x44, 0x44, 0x44, 0x54, 0x2f, 0x77, 0xee, 0x77, + 0xff, 0x25, 0x55, 0x00, 0x08, 0x44, 0x02, 0x5f, 0x02, 0xff, 0x0a, 0x44, + 0x00, 0x30, 0x55, 0x2f, 0xee, 0xd7, 0xf5, 0x54, 0x44, 0x44, 0x44, 0x45, + 0x5f, 0xe9, 0x69, 0x99, 0x6d, 0xf5, 0x45, 0x44, 0x44, 0x44, 0x45, 0x5f, + 0xff, 0x55, 0x08, 0x44, 0x02, 0x55, 0x16, 0xff, 0x02, 0xf0, 0x00, 0x00, + 0x00, 0x06, 0xff, 0x45, 0x54, 0x00, 0x1c, 0x44, 0x00, 0x1a, 0x55, 0xff, + 0xff, 0xff, 0xf5, 0x44, 0x44, 0x44, 0x45, 0x55, 0x2f, 0x25, 0x54, 0x00, + 0x08, 0x44, 0x00, 0x0e, 0xf7, 0x7e, 0x7e, 0xe7, 0xff, 0x35, 0x54, 0x00, + 0x08, 0x44, 0x00, 0x48, 0x5f, 0xff, 0x54, 0x44, 0x44, 0x44, 0x45, 0x55, + 0x3f, 0xed, 0xde, 0xf4, 0x55, 0x44, 0x44, 0x44, 0x54, 0x5f, 0xe6, 0x96, + 0x69, 0x9e, 0xf5, 0x54, 0x44, 0x44, 0x44, 0x45, 0x5f, 0xff, 0x45, 0x54, + 0x44, 0x44, 0x45, 0x45, 0x16, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x02, 0xff, + 0x02, 0x55, 0x1c, 0x44, 0x00, 0x40, 0x45, 0x45, 0xff, 0xff, 0xff, 0xf5, + 0x45, 0x44, 0x44, 0x44, 0x55, 0x3f, 0x35, 0x55, 0x44, 0x44, 0x44, 0x55, + 0xf7, 0xe7, 0xee, 0x7f, 0xff, 0x55, 0x54, 0x44, 0x44, 0x44, 0x54, 0x3f, + 0xff, 0x34, 0x08, 0x44, 0x00, 0x30, 0x55, 0x5f, 0x7d, 0xd7, 0xf5, 0x54, + 0x44, 0x44, 0x44, 0x45, 0x5f, 0xd9, 0x99, 0x99, 0x6e, 0xf5, 0x54, 0x44, + 0x44, 0x44, 0x45, 0x5f, 0xff, 0x55, 0x08, 0x44, 0x02, 0x55, 0x0a, 0xff, + 0x00, 0x0e, 0xf2, 0x2f, 0x22, 0x2f, 0x2f, 0x2f, 0xf0, 0x00, 0x00, 0x00, + 0x02, 0xff, 0x02, 0x55, 0x1e, 0x44, 0x00, 0x30, 0x55, 0xff, 0xff, 0xff, + 0xf3, 0x54, 0x44, 0x44, 0x44, 0x55, 0x5f, 0x35, 0x54, 0x44, 0x44, 0x44, + 0x43, 0xf7, 0x7e, 0xee, 0x7f, 0xf2, 0x55, 0x54, 0x08, 0x44, 0x00, 0x48, + 0x2f, 0xff, 0x24, 0x54, 0x44, 0x44, 0x44, 0x55, 0x5f, 0x7d, 0xde, 0xf5, + 0x54, 0x44, 0x44, 0x44, 0x55, 0x5f, 0xd9, 0x99, 0x96, 0xce, 0xf5, 0x45, + 0x44, 0x44, 0x44, 0x45, 0x4f, 0xff, 0x55, 0x44, 0x44, 0x44, 0x45, 0x55, + 0x0a, 0xff, 0x0c, 0x55, 0x02, 0xfb, 0x00, 0x00, 0x00, 0x0e, 0xff, 0x54, + 0x54, 0x44, 0x44, 0x44, 0x45, 0x00, 0x0a, 0xff, 0x02, 0x54, 0x08, 0x44, + 0x00, 0x0a, 0x55, 0xff, 0xff, 0xff, 0xf2, 0x00, 0x08, 0x44, 0x00, 0x1c, + 0x55, 0x52, 0x55, 0x54, 0x44, 0x44, 0x45, 0x43, 0xf7, 0x77, 0xe7, 0xff, + 0xf2, 0x55, 0x08, 0x44, 0x00, 0x08, 0x45, 0xff, 0xff, 0xf4, 0x08, 0x44, + 0x00, 0x0c, 0x55, 0x52, 0xfd, 0xde, 0xf5, 0x45, 0x08, 0x44, 0x00, 0x26, + 0x5f, 0xd9, 0x99, 0x99, 0x6d, 0xf5, 0x54, 0x44, 0x44, 0x44, 0x55, 0x5f, + 0xff, 0x54, 0x54, 0x44, 0x44, 0x44, 0x45, 0x00, 0x0a, 0xff, 0x0c, 0x55, + 0x02, 0xf0, 0x00, 0x00, 0x00, 0x0e, 0xff, 0x55, 0x44, 0x44, 0x44, 0x45, + 0x53, 0x00, 0x0a, 0xff, 0x00, 0x0c, 0x35, 0x54, 0x44, 0x44, 0x45, 0x45, + 0x08, 0xff, 0x08, 0x44, 0x00, 0x2c, 0x55, 0x52, 0x55, 0x54, 0x44, 0x44, + 0x44, 0x4f, 0xf7, 0x77, 0x77, 0x7f, 0xf3, 0x55, 0x54, 0x44, 0x44, 0x44, + 0x45, 0xff, 0xff, 0xf5, 0x08, 0x44, 0x00, 0x3a, 0x55, 0x53, 0xfe, 0xde, + 0x25, 0x54, 0x44, 0x44, 0x44, 0x55, 0x5f, 0xd9, 0xc9, 0xc9, 0x9e, 0xf5, + 0x55, 0x44, 0x44, 0x44, 0x45, 0x5f, 0xf2, 0x55, 0x44, 0x44, 0x44, 0x45, + 0x55, 0x00, 0x0a, 0xff, 0x0c, 0x55, 0x02, 0xf0, 0x00, 0x00, 0x00, 0x0e, + 0xff, 0x55, 0x44, 0x44, 0x44, 0x45, 0x42, 0x00, 0x0a, 0xff, 0x02, 0x35, + 0x08, 0x44, 0x02, 0x55, 0x08, 0xff, 0x00, 0x18, 0x55, 0x44, 0x44, 0x44, + 0x45, 0x55, 0x55, 0x54, 0x44, 0x44, 0x44, 0x5f, 0x08, 0x77, 0x00, 0x14, + 0xf5, 0x55, 0x44, 0x44, 0x44, 0x45, 0x43, 0xfe, 0x77, 0xf3, 0x08, 0x44, + 0x00, 0x30, 0x45, 0x53, 0xfe, 0xae, 0xf5, 0x54, 0x44, 0x44, 0x44, 0x45, + 0x5f, 0xfd, 0xdd, 0xdd, 0xdf, 0xf5, 0x54, 0x44, 0x44, 0x44, 0x45, 0x4f, + 0xff, 0x55, 0x08, 0x44, 0x02, 0x55, 0x0a, 0xff, 0x02, 0x55, 0x08, 0x44, + 0x02, 0x54, 0x02, 0xf0, 0x00, 0x00, 0x00, 0x0e, 0xff, 0x54, 0x54, 0x44, + 0x44, 0x45, 0x53, 0x00, 0x0a, 0xff, 0x00, 0x0c, 0x35, 0x54, 0x44, 0x44, + 0x44, 0x55, 0x08, 0xff, 0x00, 0x0e, 0x34, 0x44, 0x44, 0x44, 0x45, 0x55, + 0x55, 0x00, 0x08, 0x44, 0x00, 0x0e, 0x3f, 0x77, 0x77, 0x7e, 0x7f, 0x25, + 0x55, 0x00, 0x08, 0x44, 0x00, 0x1a, 0x42, 0xf7, 0xe7, 0xf2, 0x45, 0x44, + 0x44, 0x44, 0x45, 0x55, 0xf7, 0xae, 0xf5, 0x00, 0x08, 0x44, 0x02, 0x55, + 0x02, 0x53, 0x08, 0xff, 0x02, 0x35, 0x02, 0x55, 0x08, 0x44, 0x00, 0x28, + 0x5f, 0xff, 0x54, 0x44, 0x44, 0x44, 0x45, 0x55, 0x3f, 0xff, 0xff, 0xff, + 0xf3, 0x55, 0x54, 0x44, 0x44, 0x44, 0x45, 0xf0, 0x00, 0x00, 0x00, 0x0e, + 0xff, 0x55, 0x44, 0x44, 0x44, 0x45, 0x53, 0x00, 0x0a, 0xff, 0x00, 0x0c, + 0x35, 0x44, 0x44, 0x44, 0x45, 0x54, 0x08, 0xff, 0x00, 0x24, 0x24, 0x54, + 0x44, 0x44, 0x45, 0x55, 0x54, 0x44, 0x44, 0x44, 0x54, 0x2f, 0xe7, 0x77, + 0x77, 0x7f, 0x25, 0x54, 0x08, 0x44, 0x00, 0x08, 0x5f, 0x77, 0xe7, 0xff, + 0x0a, 0x44, 0x00, 0x08, 0x55, 0x2f, 0xde, 0xf5, 0x08, 0x44, 0x10, 0x55, + 0x08, 0x44, 0x00, 0x0e, 0x5f, 0xff, 0x54, 0x44, 0x44, 0x44, 0x45, 0x00, + 0x0e, 0x55, 0x00, 0x0c, 0x54, 0x44, 0x44, 0x44, 0x45, 0xf0, 0x00, 0x00, + 0x00, 0x0e, 0xff, 0x55, 0x54, 0x44, 0x44, 0x44, 0x53, 0x00, 0x0a, 0xff, + 0x00, 0x0c, 0x35, 0x54, 0x44, 0x44, 0x44, 0x55, 0x08, 0xff, 0x02, 0xf4, + 0x14, 0x44, 0x00, 0x0e, 0x2f, 0x7e, 0xe7, 0x77, 0x7f, 0x35, 0x55, 0x00, + 0x08, 0x44, 0x00, 0x1a, 0x5f, 0x77, 0x7f, 0x7f, 0x54, 0x44, 0x44, 0x44, + 0x45, 0x55, 0x3f, 0xdd, 0x75, 0x00, 0x08, 0x44, 0x02, 0x45, 0x0c, 0x55, + 0x02, 0x54, 0x08, 0x44, 0x00, 0x06, 0x2f, 0xff, 0x54, 0x00, 0x08, 0x44, + 0x0e, 0x55, 0x08, 0x44, 0x02, 0x42, 0x02, 0xf0, 0x00, 0x00, 0x00, 0x0e, + 0xff, 0x54, 0x44, 0x44, 0x44, 0x45, 0x53, 0x00, 0x0a, 0xff, 0x00, 0x0c, + 0x35, 0x54, 0x44, 0x44, 0x44, 0x55, 0x08, 0xff, 0x02, 0xf5, 0x12, 0x44, + 0x00, 0x22, 0x45, 0xf7, 0xee, 0xee, 0x7e, 0x7f, 0x55, 0x54, 0x44, 0x44, + 0x44, 0x45, 0x3f, 0xee, 0x77, 0xef, 0x34, 0x00, 0x08, 0x44, 0x00, 0x0a, + 0x55, 0x5f, 0xea, 0xdf, 0x54, 0x00, 0x08, 0x44, 0x0c, 0x55, 0x0a, 0x44, + 0x00, 0x06, 0xff, 0xff, 0xf5, 0x00, 0x08, 0x44, 0x02, 0x45, 0x0a, 0x55, + 0x02, 0x54, 0x08, 0x44, 0x02, 0x4f, 0x02, 0xf0, 0x00, 0x00, 0x02, 0xff, + 0x02, 0x55, 0x08, 0x44, 0x02, 0x53, 0x0a, 0xff, 0x02, 0x35, 0x08, 0x44, + 0x02, 0x45, 0x08, 0xff, 0x02, 0xf3, 0x12, 0x44, 0x00, 0x0e, 0x45, 0xf7, + 0xed, 0xed, 0xe7, 0xf2, 0x55, 0x00, 0x0a, 0x44, 0x00, 0x0a, 0xf7, 0x77, + 0xfe, 0xd7, 0x24, 0x00, 0x08, 0x44, 0x00, 0x0a, 0x45, 0x52, 0xea, 0xa7, + 0xf4, 0x00, 0x1c, 0x44, 0x00, 0x08, 0x4f, 0xff, 0xff, 0xff, 0x1e, 0x44, + 0x02, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x02, 0xff, 0x0a, 0x44, 0x02, 0x43, + 0x0a, 0xff, 0x02, 0x34, 0x08, 0x44, 0x02, 0x45, 0x08, 0xff, 0x02, 0xf2, + 0x12, 0x44, 0x00, 0x0e, 0x43, 0xfe, 0xee, 0xdd, 0xe7, 0xf3, 0x54, 0x00, + 0x0a, 0x44, 0x00, 0x0a, 0xfe, 0xe7, 0x7d, 0xde, 0xf4, 0x00, 0x0a, 0x44, + 0x00, 0x0a, 0x52, 0x76, 0x9a, 0xff, 0x54, 0x00, 0x18, 0x44, 0x00, 0x0c, + 0x45, 0xf7, 0xef, 0xff, 0xff, 0x25, 0x1a, 0x44, 0x00, 0x06, 0x5f, 0xff, + 0xfb, 0x00, 0x00, 0x00, 0x02, 0xff, 0x0a, 0x44, 0x02, 0x43, 0x0a, 0xff, + 0x02, 0x34, 0x0a, 0x44, 0x0a, 0xff, 0x12, 0x44, 0x00, 0x0c, 0x42, 0x7e, + 0xdd, 0xdd, 0xde, 0xf5, 0x0a, 0x44, 0x00, 0x0c, 0x45, 0xfe, 0x7f, 0xea, + 0xae, 0xf5, 0x0a, 0x44, 0x00, 0x0a, 0x45, 0xf6, 0xcc, 0x6e, 0xf3, 0x00, + 0x18, 0x44, 0x00, 0x0e, 0x3f, 0x76, 0x9f, 0xff, 0xff, 0xff, 0x34, 0x00, + 0x16, 0x44, 0x00, 0x08, 0x43, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x0e, + 0xff, 0x53, 0x55, 0x35, 0x53, 0x55, 0x33, 0x00, 0x0a, 0xff, 0x00, 0x0c, + 0x25, 0x53, 0x55, 0x35, 0x53, 0x55, 0x0a, 0xff, 0x00, 0x66, 0x35, 0x53, + 0x55, 0x35, 0x55, 0x53, 0x55, 0x35, 0x53, 0x5f, 0xf7, 0xed, 0xad, 0xde, + 0x73, 0x55, 0x35, 0x55, 0x53, 0x55, 0x52, 0x7e, 0x7e, 0xaa, 0xad, 0xf2, + 0x53, 0x55, 0x35, 0x53, 0x55, 0x33, 0x7a, 0xcc, 0xc6, 0xd7, 0xf2, 0x53, + 0x55, 0x35, 0x53, 0x55, 0x53, 0x55, 0x35, 0x53, 0x53, 0x2f, 0x7d, 0x98, + 0xcf, 0x00, 0x08, 0xff, 0x00, 0x1e, 0x25, 0x35, 0x53, 0x55, 0x35, 0x53, + 0x55, 0x35, 0x53, 0x55, 0x33, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, + 0x40, 0xff, 0x00, 0x0c, 0xf7, 0xee, 0xee, 0x7e, 0xdd, 0xe7, 0x0a, 0xff, + 0x00, 0x0c, 0xf7, 0xd7, 0xfd, 0xaa, 0xad, 0xe7, 0x0a, 0xff, 0x00, 0x0c, + 0xf7, 0xd6, 0x9c, 0x9c, 0xc9, 0xae, 0x14, 0xff, 0x00, 0x08, 0xea, 0xcc, + 0x98, 0x8d, 0x24, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x36, 0xff, 0x00, 0x5e, + 0x7d, 0xed, 0xee, 0xed, 0xdd, 0xed, 0xaa, 0xad, 0xad, 0xea, 0xde, 0xed, + 0xdd, 0xde, 0xef, 0xee, 0xaa, 0xe7, 0xfa, 0x6a, 0x6e, 0xde, 0xdd, 0xdd, + 0xdd, 0xaa, 0xaa, 0xa6, 0x69, 0x99, 0x99, 0x99, 0xc9, 0x66, 0xaa, 0x6a, + 0x66, 0x69, 0x96, 0x66, 0x69, 0x96, 0x69, 0xc8, 0x88, 0xc8, 0x89, 0x00, + 0x24, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x36, 0xff, 0x00, 0x3a, 0x7a, 0xd6, + 0xea, 0xad, 0xad, 0xdd, 0xaa, 0x6d, 0xda, 0xaa, 0xad, 0xae, 0xad, 0xad, + 0xd7, 0xdd, 0x6e, 0x7f, 0xda, 0x66, 0xdd, 0xd6, 0xa6, 0xa6, 0x6a, 0x66, + 0x66, 0x99, 0x96, 0x00, 0x08, 0x66, 0x00, 0x1c, 0x69, 0x99, 0x99, 0xc9, + 0x69, 0x8c, 0x9c, 0x8c, 0xcc, 0xcc, 0x88, 0xcc, 0x88, 0x8c, 0x24, 0xff, + 0x02, 0xf0, 0x00, 0x00, 0x36, 0xff, 0x00, 0x3e, 0xfd, 0xda, 0xd6, 0x66, + 0xaa, 0xaa, 0xa6, 0xad, 0xda, 0xad, 0xdd, 0xaa, 0xd7, 0x6d, 0xdf, 0xda, + 0xae, 0x77, 0xa6, 0x66, 0xed, 0xaa, 0xad, 0xaa, 0x96, 0x69, 0x99, 0xc9, + 0x6a, 0x66, 0x69, 0x00, 0x0a, 0x99, 0x00, 0x16, 0xcc, 0x88, 0xcc, 0xcc, + 0x8c, 0x9c, 0x88, 0x88, 0x9c, 0xc8, 0x9d, 0x00, 0x24, 0xff, 0x02, 0xf0, + 0x00, 0x00, 0x38, 0xff, 0x00, 0x3a, 0xea, 0xaa, 0x66, 0x66, 0x66, 0x6a, + 0xda, 0x6a, 0xaa, 0xaa, 0xae, 0xed, 0xaa, 0xdf, 0xda, 0xa7, 0x7a, 0x66, + 0x9d, 0x66, 0xc9, 0x66, 0x6a, 0x66, 0x69, 0x9c, 0x6a, 0x66, 0x66, 0x00, + 0x0c, 0x99, 0x00, 0x16, 0xa6, 0x8c, 0xcc, 0xc8, 0x8c, 0xc8, 0xc8, 0x88, + 0xcc, 0xc6, 0x97, 0x00, 0x24, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x38, 0xff, + 0x00, 0x5c, 0xea, 0xda, 0xa6, 0x69, 0x9a, 0xa6, 0x66, 0x6a, 0xad, 0x9a, + 0xde, 0xaa, 0xa6, 0xdf, 0xda, 0xe7, 0xd6, 0x66, 0x66, 0x99, 0x6a, 0xa9, + 0x96, 0x99, 0x66, 0x96, 0xa6, 0x66, 0x99, 0x99, 0x99, 0x69, 0x66, 0x69, + 0x6c, 0x88, 0x8c, 0xcc, 0x88, 0xc9, 0x98, 0x8b, 0xc9, 0xad, 0x69, 0xcf, + 0x24, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x38, 0xff, 0x00, 0x5c, 0xfd, 0x66, + 0x6d, 0xda, 0xa6, 0xe7, 0xea, 0xad, 0xe7, 0xda, 0x66, 0x6a, 0x66, 0xd7, + 0xdd, 0x77, 0x66, 0x66, 0xee, 0xda, 0xaa, 0xd9, 0x96, 0xa6, 0x99, 0x6a, + 0xa6, 0x69, 0x99, 0x99, 0x66, 0x6a, 0x99, 0xdc, 0x66, 0xb8, 0x8c, 0xcc, + 0x8c, 0x99, 0xc8, 0xb8, 0x89, 0xa6, 0xc8, 0xaf, 0x24, 0xff, 0x02, 0xf0, + 0x00, 0x00, 0x38, 0xff, 0x00, 0x5c, 0xf7, 0xa6, 0x96, 0x96, 0x6e, 0xee, + 0xdd, 0xef, 0xf7, 0x7d, 0xee, 0xdd, 0xda, 0xad, 0x6e, 0x7d, 0x96, 0x6a, + 0xea, 0x69, 0x96, 0xd6, 0x89, 0x69, 0x66, 0xa6, 0xa6, 0x99, 0x99, 0x66, + 0x69, 0x96, 0x6c, 0xc9, 0x88, 0x88, 0x88, 0xc8, 0x88, 0x99, 0xc8, 0x8c, + 0x88, 0x88, 0x88, 0x7f, 0x24, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x3a, 0xff, + 0x00, 0x58, 0x76, 0x69, 0x99, 0x6e, 0xfd, 0xdd, 0x7f, 0xff, 0x7f, 0xf7, + 0xf7, 0x7e, 0xdd, 0xe7, 0xf6, 0x96, 0xae, 0x66, 0x69, 0xaa, 0x9a, 0xc8, + 0xc9, 0x6a, 0xda, 0x69, 0x99, 0x99, 0x99, 0xca, 0xac, 0x68, 0x88, 0x8c, + 0xcc, 0xb8, 0xb8, 0x8c, 0x69, 0x88, 0x8b, 0x88, 0x9c, 0x8c, 0x26, 0xff, + 0x02, 0xf0, 0x00, 0x00, 0x3a, 0xff, 0x00, 0x0e, 0xfa, 0x96, 0x9c, 0xad, + 0xed, 0xdd, 0xef, 0x00, 0x08, 0xff, 0x00, 0x42, 0x7a, 0xd7, 0x77, 0xe9, + 0x9a, 0xad, 0x66, 0x99, 0xad, 0xca, 0x6c, 0x8c, 0x6d, 0xad, 0xa9, 0x99, + 0x99, 0x9a, 0x9c, 0x9c, 0x88, 0x8c, 0xc9, 0x96, 0xc8, 0xbb, 0x8c, 0x6c, + 0x8b, 0x88, 0x88, 0xd8, 0x86, 0x00, 0x26, 0xff, 0x02, 0xf0, 0x00, 0x00, + 0x3a, 0xff, 0x00, 0x0e, 0xfa, 0x96, 0x99, 0xdd, 0xde, 0xdd, 0xef, 0x00, + 0x08, 0xff, 0x00, 0x42, 0xe6, 0xd7, 0xef, 0xa9, 0x96, 0x7d, 0x66, 0x69, + 0xae, 0x69, 0x99, 0x88, 0xce, 0xed, 0x69, 0x9c, 0x99, 0xc8, 0x98, 0x88, + 0x8b, 0x89, 0x6c, 0xc6, 0x9c, 0x88, 0x89, 0x9c, 0x88, 0xc8, 0x88, 0xac, + 0x8e, 0x00, 0x26, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x3a, 0xff, 0x00, 0x58, + 0xf7, 0xc6, 0xc6, 0xda, 0xdd, 0xdd, 0xdf, 0xff, 0xff, 0xff, 0xfe, 0xdf, + 0xf7, 0x7e, 0x99, 0x96, 0xa6, 0xa6, 0x66, 0x66, 0xa9, 0xaa, 0x88, 0xcd, + 0xea, 0x99, 0x9c, 0x99, 0x9c, 0x88, 0x88, 0xb8, 0x89, 0xc9, 0xc8, 0xcc, + 0x88, 0xc9, 0x98, 0x88, 0xcc, 0x88, 0xa8, 0x8f, 0x26, 0xff, 0x02, 0xf0, + 0x00, 0x00, 0x3c, 0xff, 0x00, 0x56, 0xea, 0xca, 0xad, 0xdd, 0xdd, 0xd7, + 0xff, 0xe6, 0xda, 0x6a, 0xed, 0xe7, 0xfa, 0x99, 0x9e, 0xa6, 0xca, 0x66, + 0x9a, 0x69, 0x96, 0xc9, 0xca, 0xea, 0x69, 0xcc, 0x99, 0xc9, 0xcc, 0x88, + 0x8b, 0x8c, 0x88, 0xc8, 0x8b, 0x8c, 0x69, 0xc8, 0x8c, 0xc9, 0x8c, 0xa8, + 0x6f, 0x00, 0x26, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x3c, 0xff, 0x00, 0x56, + 0xfa, 0x6a, 0xae, 0xdd, 0xa6, 0x6e, 0xe9, 0x66, 0xda, 0x99, 0xaa, 0xe7, + 0xe6, 0x9c, 0x6a, 0x66, 0xca, 0x66, 0xc6, 0xa9, 0x69, 0xc8, 0xc6, 0xda, + 0x99, 0x9c, 0x99, 0x88, 0x8c, 0xb8, 0x88, 0x89, 0x88, 0x88, 0x88, 0x89, + 0x99, 0xc8, 0x8a, 0x98, 0x89, 0x9c, 0xdf, 0x00, 0x26, 0xff, 0x02, 0xf0, + 0x00, 0x00, 0x3c, 0xff, 0x00, 0x54, 0xf7, 0x99, 0xed, 0xd6, 0xcc, 0x9e, + 0xdc, 0x96, 0xa6, 0xad, 0xad, 0xef, 0xa9, 0x99, 0xd6, 0x6a, 0xc6, 0xa6, + 0x96, 0x99, 0x69, 0xcc, 0x89, 0xda, 0x9c, 0xcc, 0x99, 0x9c, 0x8c, 0x8b, + 0x8c, 0x9c, 0x88, 0x88, 0xb8, 0xcc, 0x9c, 0x88, 0x8c, 0x98, 0x8a, 0xc8, + 0x28, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x3e, 0xff, 0x00, 0x52, 0x6e, 0xee, + 0xdc, 0x99, 0xc6, 0x99, 0x6a, 0xa9, 0x9a, 0xae, 0xef, 0x69, 0x6a, 0xea, + 0xa6, 0x9c, 0xa6, 0x99, 0x66, 0x6c, 0xcc, 0x89, 0xda, 0x99, 0xcc, 0x99, + 0xc8, 0x88, 0x88, 0xc9, 0x98, 0x88, 0x88, 0x8c, 0xcc, 0xcc, 0xc8, 0x88, + 0xc8, 0xca, 0x89, 0x00, 0x28, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x3e, 0xff, + 0x00, 0x52, 0xfd, 0xdd, 0x9c, 0x99, 0x99, 0x66, 0x6e, 0x6a, 0xda, 0xae, + 0xf7, 0x9c, 0x6d, 0xd6, 0xaa, 0x6c, 0x69, 0x99, 0xc9, 0x6c, 0xc8, 0x89, + 0xdd, 0x9c, 0xcc, 0x9c, 0x88, 0x88, 0x8c, 0x99, 0x98, 0x88, 0x88, 0x9c, + 0xc9, 0xcc, 0x8c, 0x8c, 0xc8, 0x9e, 0x8d, 0x00, 0x28, 0xff, 0x02, 0xf0, + 0x00, 0x00, 0x3e, 0xff, 0x00, 0x52, 0xaa, 0xda, 0x8c, 0x99, 0x99, 0xa9, + 0xa6, 0x6a, 0xaa, 0xde, 0xfd, 0xca, 0xaa, 0xdd, 0x6a, 0xa8, 0x9c, 0x9c, + 0x99, 0x98, 0x88, 0x89, 0xed, 0x9c, 0xcc, 0x9c, 0x88, 0x88, 0xcc, 0x99, + 0xcc, 0x88, 0xcc, 0x99, 0xc9, 0xcc, 0x88, 0xc9, 0x8c, 0xdd, 0x87, 0x00, + 0x28, 0xff, 0x02, 0xf7, 0x00, 0x00, 0x3c, 0xff, 0x00, 0x54, 0xf7, 0x66, + 0xa9, 0xc9, 0xc9, 0xcc, 0xcc, 0x66, 0x9a, 0xde, 0xe7, 0x76, 0xca, 0x6a, + 0x9a, 0x69, 0xcb, 0xc8, 0x89, 0x9c, 0x88, 0x88, 0x8c, 0x7a, 0x9c, 0xcc, + 0x99, 0xc8, 0x8c, 0x99, 0x99, 0x9c, 0xcc, 0x9c, 0x99, 0xc9, 0xcc, 0x8c, + 0xcc, 0x88, 0xec, 0xcf, 0x28, 0xff, 0x02, 0xf1, 0x00, 0x00, 0x3c, 0xff, + 0x00, 0x54, 0xf7, 0xa6, 0x9c, 0xc9, 0xcc, 0xc8, 0xc8, 0xc9, 0x9d, 0x6d, + 0xdf, 0xdc, 0xcc, 0xa9, 0x69, 0x98, 0x8c, 0xa8, 0x89, 0x9c, 0x88, 0x88, + 0xc9, 0xe6, 0xcc, 0xcc, 0xcc, 0x9c, 0xc9, 0x9c, 0x99, 0xcc, 0xcc, 0xcc, + 0x99, 0xcc, 0xc8, 0xc9, 0xc8, 0x88, 0xe8, 0xaf, 0x28, 0xff, 0x02, 0xf0, + 0x00, 0x00, 0x3e, 0xff, 0x00, 0x52, 0x6c, 0xcc, 0x99, 0xcc, 0x89, 0x6c, + 0x8c, 0xdd, 0xda, 0xef, 0xac, 0xcc, 0x69, 0xc8, 0x89, 0x69, 0x96, 0x88, + 0x99, 0x98, 0x88, 0x96, 0xe9, 0xcc, 0xcc, 0x99, 0xc9, 0x99, 0x99, 0x99, + 0xc9, 0x99, 0xc9, 0xc9, 0xc9, 0xc8, 0xc9, 0xcc, 0x89, 0xec, 0xef, 0x00, + 0x28, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x3e, 0xff, 0x00, 0x50, 0x98, 0x9c, + 0x99, 0x99, 0x9a, 0x66, 0xcc, 0xed, 0xde, 0x77, 0xac, 0x88, 0x88, 0xc6, + 0xd6, 0xa9, 0xc6, 0x9c, 0x99, 0x98, 0xb8, 0x9a, 0x69, 0xcc, 0x9c, 0xcc, + 0xcc, 0x9c, 0x99, 0x9c, 0xcc, 0xc9, 0x99, 0x99, 0x9c, 0xcc, 0x99, 0xc8, + 0x8e, 0x9c, 0x2a, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x3e, 0xff, 0x00, 0x50, + 0x9c, 0xcc, 0x69, 0x9c, 0xa6, 0x66, 0x96, 0xea, 0x9e, 0x7e, 0xa9, 0xc9, + 0xc8, 0x9e, 0x69, 0xd9, 0xc9, 0x96, 0x99, 0xc9, 0x88, 0x6a, 0xc9, 0xcc, + 0xc9, 0xc9, 0xcc, 0x9c, 0x99, 0x9c, 0xc9, 0x9c, 0x99, 0x9c, 0x99, 0x9b, + 0x88, 0xc8, 0xce, 0xc9, 0x2a, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x3e, 0xff, + 0x00, 0x50, 0xdc, 0xc9, 0xa9, 0xa8, 0xa6, 0x6a, 0x96, 0x9c, 0xd7, 0xfa, + 0xa6, 0x69, 0xac, 0x6d, 0x66, 0xa6, 0x6c, 0x88, 0x99, 0x9c, 0xc9, 0x69, + 0xc9, 0xcc, 0xc9, 0xcc, 0xcc, 0xc9, 0x99, 0xcc, 0x9c, 0x99, 0x99, 0x99, + 0x98, 0xb8, 0x88, 0x88, 0xcd, 0xc7, 0x2a, 0xff, 0x02, 0xf0, 0x00, 0x00, + 0x3e, 0xff, 0x00, 0x50, 0x79, 0x96, 0x69, 0x68, 0x66, 0xa6, 0x96, 0xcc, + 0xaf, 0xfa, 0xe9, 0x9c, 0xc8, 0xa6, 0xa9, 0x69, 0x9c, 0x98, 0xc9, 0x99, + 0x9c, 0x99, 0x99, 0xc9, 0x99, 0xc9, 0xcc, 0x99, 0x9c, 0xc9, 0xcc, 0x9c, + 0x9c, 0x99, 0xc8, 0x89, 0xc8, 0x88, 0xad, 0x8f, 0x2a, 0xff, 0x02, 0xf0, + 0x00, 0x00, 0x3e, 0xff, 0x00, 0x50, 0xf9, 0x9a, 0x96, 0xac, 0x9a, 0x66, + 0x99, 0x88, 0x6f, 0xfd, 0xec, 0xc9, 0x9c, 0x99, 0x9a, 0x96, 0x68, 0x9c, + 0xc9, 0x99, 0x99, 0x96, 0x69, 0xcc, 0x99, 0x9c, 0x9c, 0xc9, 0x9c, 0xcc, + 0xc9, 0xc9, 0x99, 0x9c, 0x96, 0xc8, 0xc8, 0x88, 0x79, 0x6f, 0x2a, 0xff, + 0x02, 0xf0, 0x00, 0x00, 0x3e, 0xff, 0x00, 0x50, 0xf9, 0x99, 0xd9, 0x9c, + 0x6a, 0x66, 0x69, 0x8c, 0x6f, 0xfa, 0x99, 0x96, 0x9a, 0x69, 0x99, 0x66, + 0x9c, 0x99, 0x89, 0xc9, 0x99, 0x99, 0x98, 0x88, 0x88, 0x99, 0xcc, 0x99, + 0xcc, 0xc9, 0xcc, 0x99, 0xc9, 0x9c, 0x9c, 0x69, 0xc9, 0x88, 0x7c, 0xef, + 0x2a, 0xff, 0x02, 0xfb, 0x00, 0x00, 0x3e, 0xff, 0x00, 0x4e, 0xfd, 0x96, + 0x99, 0x99, 0xa6, 0x66, 0x69, 0x88, 0x6f, 0xd9, 0x9c, 0x99, 0xac, 0x96, + 0x66, 0x96, 0x69, 0xc9, 0x89, 0x98, 0x99, 0x99, 0x6c, 0x88, 0x8b, 0x8c, + 0x99, 0xc9, 0xcc, 0xcc, 0x9c, 0x9c, 0x99, 0x9c, 0x96, 0x6d, 0xcc, 0x89, + 0xac, 0x00, 0x2c, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x3e, 0xff, 0x00, 0x4e, + 0xfa, 0x99, 0x99, 0xca, 0xd6, 0xaa, 0x99, 0x8c, 0x69, 0x69, 0x99, 0xc8, + 0x6c, 0x96, 0xc9, 0x96, 0x66, 0xc9, 0xcc, 0x9c, 0x99, 0xcc, 0x88, 0xb8, + 0x88, 0x88, 0x69, 0x9c, 0xcc, 0xc9, 0xc9, 0x99, 0x9c, 0xcc, 0xcc, 0xc6, + 0x89, 0x8e, 0x9a, 0x00, 0x2c, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x3e, 0xff, + 0x00, 0x4e, 0xfd, 0x99, 0x9c, 0x6a, 0xda, 0x66, 0x69, 0x8c, 0x99, 0x96, + 0xa9, 0xc8, 0x96, 0x99, 0x69, 0x69, 0x99, 0x8a, 0xc8, 0x99, 0x99, 0x9c, + 0xb8, 0x88, 0x88, 0xb8, 0x96, 0x9c, 0xcc, 0xcc, 0x9c, 0x99, 0xc9, 0xc8, + 0xcc, 0x88, 0x88, 0x9e, 0xce, 0x00, 0x2c, 0xff, 0x02, 0xf4, 0x00, 0x00, + 0x3e, 0xff, 0x00, 0x4e, 0xfa, 0x99, 0xc9, 0xdd, 0xa6, 0xaa, 0x69, 0x88, + 0xc9, 0xc9, 0xd6, 0x88, 0x69, 0x66, 0x99, 0x96, 0x66, 0xc9, 0x68, 0x89, + 0x9c, 0x9c, 0xb8, 0x88, 0x88, 0x88, 0x69, 0xcc, 0xcc, 0xc9, 0x99, 0x9c, + 0xc8, 0xcc, 0xcc, 0xcc, 0x88, 0xe6, 0xcf, 0x00, 0x2c, 0xff, 0x02, 0xf0, + 0x00, 0x00, 0x3e, 0xff, 0x00, 0x4e, 0xfd, 0x99, 0x99, 0xdd, 0xa6, 0x66, + 0x69, 0x88, 0x8c, 0x9c, 0xaa, 0x88, 0x99, 0xa9, 0xc9, 0x9d, 0xaa, 0x99, + 0x9c, 0x8c, 0x99, 0xc8, 0x88, 0x88, 0x88, 0xb8, 0x6c, 0x9c, 0xc9, 0x9c, + 0x99, 0xcc, 0x96, 0x66, 0x99, 0x88, 0xc8, 0xec, 0x6f, 0x00, 0x2c, 0xff, + 0x02, 0xf0, 0x00, 0x00, 0x3e, 0xff, 0x00, 0x4e, 0xfd, 0x69, 0x96, 0xdd, + 0xaa, 0x6a, 0x69, 0x88, 0x88, 0xc9, 0x9d, 0xc8, 0x86, 0x69, 0x9c, 0x69, + 0xaa, 0xa9, 0x6c, 0x88, 0xc9, 0xc8, 0x88, 0x88, 0x8b, 0x88, 0x9c, 0xcc, + 0x9c, 0xc9, 0x9c, 0x99, 0x96, 0x96, 0xcc, 0x8c, 0x89, 0x68, 0xef, 0x00, + 0x2c, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x3e, 0xff, 0x00, 0x4c, 0xfd, 0xa9, + 0x9d, 0xda, 0xa6, 0xa6, 0x69, 0x98, 0x88, 0xc9, 0xad, 0x68, 0x8a, 0xad, + 0x88, 0x88, 0x8c, 0x99, 0x96, 0xa8, 0x99, 0x68, 0x88, 0x8c, 0x8b, 0x89, + 0xcc, 0xc9, 0xc9, 0x99, 0x9c, 0x88, 0x8c, 0x66, 0xcc, 0x8c, 0x8a, 0x9c, + 0x2e, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x3e, 0xff, 0x00, 0x4c, 0xfe, 0xa9, + 0x9e, 0xda, 0xaa, 0x6a, 0x69, 0x66, 0x99, 0xcc, 0x6a, 0xd8, 0x88, 0x9b, + 0x88, 0x8c, 0x6c, 0x9d, 0x99, 0x98, 0x9c, 0x96, 0x98, 0xc8, 0x88, 0x8c, + 0x9c, 0x9c, 0x96, 0x9c, 0xc8, 0x8b, 0x8c, 0xc9, 0x98, 0xc8, 0x8a, 0xc6, + 0x2e, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x36, 0xff, 0x08, 0x22, 0x00, 0x4c, + 0x2e, 0xa9, 0x6d, 0xda, 0xa6, 0x6a, 0x66, 0x96, 0x99, 0x69, 0x6d, 0xdc, + 0x88, 0xa6, 0xaa, 0x66, 0x9c, 0xbd, 0xdc, 0x9c, 0xc6, 0xaa, 0x99, 0xc8, + 0xb8, 0x99, 0xc9, 0xc6, 0x99, 0xc9, 0x88, 0x8c, 0xcc, 0xcc, 0x9c, 0xc8, + 0x6c, 0x8e, 0x2e, 0xff, 0x02, 0xf4, 0x00, 0x00, 0x30, 0xff, 0x00, 0x5a, + 0x22, 0x22, 0x23, 0x32, 0x32, 0x22, 0xf2, 0xfd, 0xa9, 0xdd, 0xaa, 0x66, + 0xa6, 0x6a, 0xee, 0x77, 0x69, 0x96, 0x66, 0x8c, 0xcd, 0xa6, 0x9d, 0x96, + 0x8c, 0xdd, 0xac, 0xc9, 0x8c, 0x8c, 0x88, 0xc6, 0xc9, 0x99, 0x69, 0x9c, + 0x69, 0x99, 0x9c, 0xc9, 0xc9, 0x9c, 0x8c, 0xac, 0xcf, 0x00, 0x2e, 0xff, + 0x02, 0xf0, 0x00, 0x00, 0x2e, 0xff, 0x00, 0x14, 0x22, 0x22, 0x33, 0x22, + 0xf2, 0xff, 0xff, 0xff, 0xfa, 0x66, 0x08, 0xaa, 0x00, 0x40, 0x6d, 0xdd, + 0xdd, 0xa6, 0x6a, 0xaa, 0x88, 0x86, 0x69, 0xc6, 0x99, 0x98, 0x88, 0x9c, + 0xc8, 0x88, 0x88, 0x99, 0x69, 0x6a, 0xa6, 0x9c, 0xc8, 0xc9, 0xc9, 0xcc, + 0x86, 0x99, 0x9c, 0xba, 0x98, 0x9f, 0x2e, 0xff, 0x02, 0xf0, 0x00, 0x00, + 0x2a, 0xff, 0x00, 0x0a, 0xf2, 0x22, 0x22, 0x22, 0x2f, 0x00, 0x0a, 0xff, + 0x00, 0x4c, 0x7a, 0xce, 0xdd, 0xa6, 0x6a, 0xaa, 0xad, 0xea, 0xdd, 0xd6, + 0xda, 0xa6, 0xcc, 0x89, 0xa9, 0x99, 0x99, 0xac, 0x88, 0xb8, 0xbb, 0x88, + 0x86, 0x9a, 0x99, 0x99, 0xc8, 0xcc, 0xcc, 0x99, 0xcc, 0x9d, 0xc9, 0xc6, + 0x9c, 0xce, 0x9c, 0xdf, 0x2e, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x28, 0xff, + 0x00, 0x08, 0xf2, 0x22, 0x22, 0x2f, 0x0e, 0xff, 0x00, 0x4a, 0xe9, 0xda, + 0xa6, 0xaa, 0xd6, 0xda, 0xa6, 0xda, 0xad, 0xea, 0x7a, 0xa6, 0xa8, 0xc8, + 0xac, 0x66, 0x99, 0x9a, 0xd6, 0x9c, 0xc6, 0x6d, 0xa6, 0x9c, 0x9c, 0x88, + 0xc9, 0x9c, 0x9c, 0x99, 0xcc, 0xcc, 0xc6, 0xc9, 0xc8, 0x7a, 0xcc, 0x00, + 0x30, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x26, 0xff, 0x00, 0x06, 0xf2, 0x23, + 0x22, 0x00, 0x12, 0xff, 0x00, 0x4a, 0x6d, 0xaa, 0x66, 0x6d, 0xdd, 0xaa, + 0x66, 0x6a, 0xda, 0xaa, 0xea, 0x6a, 0xa9, 0xc8, 0x69, 0x6c, 0x66, 0x66, + 0x66, 0x6a, 0x66, 0x6a, 0xaa, 0x6c, 0xe9, 0xcc, 0xc9, 0x96, 0x99, 0x96, + 0xcc, 0xc8, 0xc9, 0xc9, 0x8a, 0xf6, 0xc9, 0x00, 0x30, 0xff, 0x02, 0xf7, + 0x00, 0x00, 0x26, 0xff, 0x02, 0x23, 0x02, 0x32, 0x14, 0xff, 0x00, 0x4a, + 0x9a, 0xa6, 0x66, 0x6a, 0xdd, 0x9c, 0x88, 0xc8, 0xca, 0xa6, 0xa6, 0x9a, + 0x66, 0xc8, 0x96, 0x9c, 0x99, 0xc9, 0x99, 0x9c, 0x99, 0x69, 0x6a, 0xa8, + 0x6a, 0xac, 0xcc, 0x96, 0x98, 0x99, 0xcc, 0xcc, 0x89, 0xc8, 0xcf, 0xec, + 0xcd, 0x00, 0x30, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x24, 0xff, 0x02, 0x22, + 0x02, 0x32, 0x16, 0xff, 0x00, 0x4a, 0x6a, 0xaa, 0x69, 0x6a, 0x66, 0xc6, + 0x77, 0xfe, 0xa8, 0x96, 0xc8, 0x89, 0xdd, 0x8c, 0x8a, 0xcc, 0xcc, 0xc9, + 0x9c, 0x9c, 0xcc, 0x6e, 0xa6, 0xa6, 0x8a, 0xde, 0x6a, 0x66, 0x8c, 0xa9, + 0xcc, 0xcc, 0xcc, 0x98, 0x9f, 0xec, 0xcf, 0x00, 0x30, 0xff, 0x02, 0xf0, + 0x00, 0x00, 0x22, 0xff, 0x00, 0x06, 0xf2, 0x33, 0x2f, 0x00, 0x14, 0xff, + 0x00, 0x4c, 0xf7, 0x6a, 0x66, 0xcc, 0x9a, 0xa8, 0x6f, 0xff, 0xff, 0xfa, + 0x88, 0x86, 0x69, 0xdd, 0x98, 0xc6, 0x99, 0xc9, 0xcc, 0x9c, 0x9c, 0xcc, + 0x6d, 0xa6, 0x6d, 0x8c, 0xcc, 0xc8, 0x88, 0x8d, 0x66, 0x9c, 0x9c, 0xc8, + 0x68, 0xdf, 0x68, 0x9f, 0x30, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x22, 0xff, + 0x02, 0x33, 0x02, 0x22, 0x18, 0xff, 0x00, 0x4a, 0xd6, 0xa6, 0x99, 0xc6, + 0xd9, 0xff, 0xff, 0xff, 0xfe, 0xd9, 0xae, 0x99, 0xa7, 0xa8, 0xcc, 0x9c, + 0x99, 0x96, 0x6c, 0xcc, 0xcc, 0xae, 0xdd, 0xaa, 0xac, 0x9c, 0x66, 0xc9, + 0xda, 0x9a, 0x69, 0xcc, 0xc8, 0x98, 0xef, 0xcc, 0xef, 0x00, 0x30, 0xff, + 0x02, 0xfb, 0x00, 0x00, 0x20, 0xff, 0x02, 0xf3, 0x02, 0x33, 0x1a, 0xff, + 0x00, 0x48, 0xaa, 0x66, 0x9c, 0x99, 0x6d, 0xef, 0xf7, 0xff, 0xf7, 0xed, + 0xda, 0x96, 0xce, 0xe8, 0x8c, 0x99, 0xc9, 0xaa, 0x66, 0xcc, 0xcc, 0xde, + 0xaa, 0x6a, 0xae, 0x6c, 0xc9, 0x6a, 0xcc, 0x9c, 0xcc, 0x9c, 0xcc, 0x88, + 0xee, 0xcc, 0x32, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x1e, 0xff, 0x00, 0x06, + 0xf2, 0x25, 0x3f, 0x00, 0x1a, 0xff, 0x00, 0x48, 0xaa, 0x69, 0x99, 0xc6, + 0x9a, 0x6f, 0xff, 0xff, 0x77, 0xea, 0x6a, 0xa6, 0x6a, 0xdc, 0x8c, 0xd6, + 0x69, 0xd6, 0xd9, 0xcc, 0xcc, 0x7d, 0xaa, 0xa6, 0x9e, 0xe7, 0xa6, 0x69, + 0x6c, 0xc8, 0x9c, 0xcc, 0x9c, 0x8c, 0xea, 0x86, 0x32, 0xff, 0x02, 0xf0, + 0x00, 0x00, 0x1e, 0xff, 0x02, 0xf2, 0x02, 0x53, 0x1c, 0xff, 0x00, 0x48, + 0xa6, 0x6c, 0xcc, 0x9c, 0x96, 0xd6, 0xff, 0xfe, 0x77, 0xd9, 0xaa, 0xa8, + 0x9a, 0xaa, 0x88, 0x9a, 0xc9, 0xa6, 0x9a, 0xa9, 0x9c, 0xea, 0x99, 0x96, + 0x9d, 0xae, 0xd6, 0x69, 0xd6, 0x88, 0x9c, 0xc9, 0x6c, 0x89, 0xdc, 0xc7, + 0x32, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x1e, 0xff, 0x02, 0x25, 0x02, 0x2f, + 0x1c, 0xff, 0x00, 0x48, 0x68, 0x88, 0xcc, 0xcc, 0x9d, 0x6a, 0x6f, 0xff, + 0xfd, 0xc8, 0x99, 0xac, 0x89, 0x66, 0x8c, 0x86, 0xc9, 0xd6, 0x6c, 0x99, + 0x69, 0xa6, 0xc6, 0x66, 0x6a, 0x9a, 0xa6, 0x6a, 0xac, 0x68, 0xcc, 0x88, + 0x8b, 0x89, 0x9c, 0xcf, 0x32, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x1c, 0xff, + 0x00, 0x06, 0xf2, 0x33, 0x2f, 0x00, 0x1c, 0xff, 0x00, 0x48, 0x99, 0x9c, + 0xc8, 0xcc, 0x9d, 0xda, 0x66, 0xde, 0xdc, 0x88, 0x6d, 0x9c, 0x96, 0xa9, + 0xcc, 0xcc, 0xc6, 0x66, 0x99, 0x99, 0x6a, 0xa9, 0x99, 0x99, 0x66, 0x96, + 0x66, 0xa6, 0x66, 0x6c, 0x88, 0xc9, 0x88, 0x9a, 0x9c, 0xaf, 0x32, 0xff, + 0x02, 0xf1, 0x00, 0x00, 0x1c, 0xff, 0x02, 0xf3, 0x02, 0x52, 0x16, 0xff, + 0x00, 0x50, 0xfe, 0xa7, 0xff, 0xff, 0x9c, 0xcc, 0xcc, 0xcc, 0x9c, 0xaa, + 0x6a, 0x96, 0xc8, 0x88, 0x9a, 0xcc, 0xc9, 0x6c, 0x9c, 0xcc, 0xcc, 0xc9, + 0xc9, 0x9c, 0x9a, 0xa9, 0xc6, 0x6c, 0x69, 0x9c, 0x96, 0x6a, 0xa9, 0x66, + 0x88, 0xee, 0xda, 0x68, 0x89, 0x7f, 0x32, 0xff, 0x02, 0xf0, 0x00, 0x00, + 0x1c, 0xff, 0x02, 0x25, 0x02, 0x2f, 0x16, 0xff, 0x00, 0x4e, 0xf7, 0x69, + 0xaf, 0xff, 0x98, 0xc9, 0xc8, 0x8c, 0x9c, 0xad, 0xd6, 0x69, 0x8c, 0x98, + 0x86, 0x69, 0xc9, 0x66, 0x98, 0x88, 0x9c, 0xc9, 0x66, 0x69, 0x6d, 0xa9, + 0xc6, 0x9c, 0x69, 0x66, 0x99, 0x66, 0x96, 0x99, 0xcb, 0xef, 0x6c, 0x9c, + 0xcc, 0x00, 0x34, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x1c, 0xff, 0x02, 0x33, + 0x02, 0x2f, 0x18, 0xff, 0x00, 0x4c, 0xd9, 0x96, 0xef, 0xa8, 0x8c, 0xcc, + 0x88, 0x99, 0xdd, 0xde, 0xa9, 0x6d, 0x6c, 0x8c, 0xd6, 0x9c, 0xc6, 0x98, + 0x88, 0xdc, 0xc6, 0xaa, 0x9c, 0x6d, 0x99, 0xcc, 0x99, 0x96, 0x96, 0x6a, + 0xa6, 0xa6, 0x9c, 0x88, 0x6e, 0x6d, 0xac, 0xcd, 0x34, 0xff, 0x02, 0xf0, + 0x00, 0x00, 0x1a, 0xff, 0x02, 0xf2, 0x02, 0x52, 0x1a, 0xff, 0x00, 0x4c, + 0xfc, 0x99, 0xcf, 0xd8, 0xb8, 0xcc, 0x88, 0xca, 0xa9, 0xde, 0x77, 0x7d, + 0xd6, 0x88, 0xad, 0x99, 0xca, 0x9c, 0x88, 0xaa, 0xc6, 0xa6, 0x69, 0x9a, + 0x99, 0x96, 0x99, 0x96, 0xca, 0xaa, 0xaa, 0xa6, 0x9c, 0x8c, 0x66, 0xdf, + 0xfe, 0xcf, 0x34, 0xff, 0x02, 0xf9, 0x00, 0x00, 0x1a, 0xff, 0x02, 0xf3, + 0x02, 0x32, 0x1a, 0xff, 0x00, 0x4c, 0xfa, 0xcc, 0x98, 0x68, 0x88, 0x8c, + 0x88, 0xca, 0xdd, 0xdf, 0xff, 0xff, 0xfa, 0x98, 0xca, 0xe9, 0x96, 0x69, + 0x88, 0x9d, 0xc9, 0xc9, 0x99, 0x9a, 0xca, 0xc6, 0x99, 0x99, 0x66, 0xc9, + 0x99, 0x99, 0x98, 0xc6, 0xc9, 0xde, 0xff, 0xdf, 0x34, 0xff, 0x02, 0xf0, + 0x00, 0x00, 0x1a, 0xff, 0x02, 0x23, 0x02, 0x3f, 0x1a, 0xff, 0x00, 0x30, + 0xfa, 0xcc, 0x98, 0x88, 0x88, 0x88, 0x8c, 0xca, 0xae, 0xdf, 0xff, 0xff, + 0xf7, 0xd9, 0x8c, 0xda, 0x66, 0x96, 0x88, 0xce, 0xcc, 0x99, 0x66, 0x66, + 0x0a, 0xcc, 0x00, 0x0e, 0x9c, 0xc9, 0x98, 0x89, 0x98, 0x9c, 0x96, 0x00, + 0x38, 0xff, 0x02, 0xf9, 0x00, 0x00, 0x1a, 0xff, 0x02, 0x25, 0x02, 0x2f, + 0x1a, 0xff, 0x00, 0x48, 0xda, 0xc9, 0x99, 0xb8, 0x8b, 0x88, 0xc6, 0x9d, + 0xdd, 0xae, 0xed, 0x7f, 0x77, 0xee, 0xc8, 0x9a, 0xa6, 0x66, 0xc8, 0x86, + 0x6c, 0xc9, 0x66, 0x99, 0xcc, 0xcc, 0xcc, 0x8c, 0xcc, 0xcc, 0x9c, 0xb8, + 0x6c, 0xc9, 0x66, 0x9e, 0x38, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x1a, 0xff, + 0x02, 0x35, 0x02, 0x2f, 0x18, 0xff, 0x00, 0x48, 0xfd, 0xda, 0xcc, 0x66, + 0x88, 0x88, 0x88, 0x8a, 0xa9, 0x6e, 0xed, 0xad, 0xaf, 0xf7, 0xef, 0xd6, + 0x8c, 0x9a, 0x6a, 0x68, 0x89, 0xec, 0x9c, 0xc6, 0x9c, 0x9c, 0xcc, 0x8c, + 0xcc, 0xc8, 0x98, 0x88, 0x9a, 0x99, 0xa6, 0x6d, 0x3a, 0xff, 0x02, 0xf0, + 0x00, 0x00, 0x18, 0xff, 0x02, 0xf2, 0x02, 0x53, 0x1a, 0xff, 0x00, 0x32, + 0xfc, 0xa6, 0x68, 0x99, 0x9b, 0x88, 0xb8, 0xca, 0x69, 0xae, 0xee, 0xed, + 0xe7, 0xff, 0x77, 0xfe, 0xdc, 0xc6, 0xa6, 0x9c, 0x88, 0xdc, 0xc8, 0x99, + 0x69, 0x00, 0x08, 0xcc, 0x00, 0x0c, 0x8c, 0x88, 0x8a, 0x9c, 0x6a, 0xd7, + 0x3c, 0xff, 0x02, 0xf2, 0x00, 0x00, 0x18, 0xff, 0x02, 0xf2, 0x02, 0x53, + 0x1a, 0xff, 0x00, 0x34, 0x66, 0x96, 0x98, 0x96, 0x9b, 0x8b, 0x88, 0xca, + 0x66, 0x9d, 0xdd, 0xff, 0xff, 0xee, 0xaa, 0xae, 0xed, 0xa9, 0x66, 0x99, + 0x8c, 0x69, 0x8c, 0xc9, 0x66, 0xcc, 0x08, 0xc8, 0x00, 0x08, 0x89, 0xac, + 0xc6, 0xe2, 0x3e, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x18, 0xff, 0x02, 0xf2, + 0x02, 0x53, 0x1a, 0xff, 0x00, 0x46, 0x96, 0x69, 0x98, 0x99, 0x68, 0xb8, + 0xb8, 0xca, 0xaa, 0x9a, 0xdf, 0x7e, 0xa9, 0x88, 0x88, 0x89, 0xef, 0xea, + 0x6d, 0xed, 0xa6, 0x66, 0x88, 0x8c, 0xc6, 0x98, 0x88, 0x88, 0x88, 0x8c, + 0xa9, 0xc9, 0xae, 0x22, 0x2f, 0x00, 0x3c, 0xff, 0x02, 0xf0, 0x00, 0x00, + 0x18, 0xff, 0x02, 0xf3, 0x02, 0x52, 0x1a, 0xff, 0x00, 0x46, 0xc9, 0xd6, + 0xac, 0x9c, 0x68, 0xb8, 0x88, 0xcd, 0x6c, 0x9a, 0xea, 0xc8, 0xb8, 0x8b, + 0x8b, 0x88, 0xb9, 0xaa, 0x69, 0x6d, 0xd6, 0x9c, 0x8c, 0x88, 0x8c, 0x88, + 0x88, 0x88, 0xc9, 0x99, 0x9a, 0x9d, 0xdf, 0xf2, 0x2f, 0x00, 0x3c, 0xff, + 0x02, 0xf0, 0x00, 0x00, 0x18, 0xff, 0x02, 0xf3, 0x02, 0x52, 0x18, 0xff, + 0x00, 0x48, 0xf6, 0xa9, 0xd6, 0xa9, 0x9c, 0x9b, 0x8b, 0x88, 0x9a, 0x6c, + 0xcd, 0xc8, 0x8b, 0x8b, 0xb8, 0xb8, 0x8b, 0x8b, 0x88, 0xc6, 0xc9, 0x6c, + 0x88, 0x88, 0x88, 0x69, 0x8b, 0x8b, 0xbc, 0xa9, 0x8c, 0x9d, 0x7a, 0x7f, + 0xf2, 0x22, 0x3c, 0xff, 0x02, 0xf9, 0x00, 0x00, 0x18, 0xff, 0x02, 0xf3, + 0x02, 0x52, 0x14, 0xff, 0x00, 0x4c, 0xf7, 0x9c, 0xcc, 0xa6, 0x66, 0x69, + 0xc9, 0x98, 0xb8, 0x88, 0x6d, 0x98, 0x88, 0x88, 0xb8, 0x88, 0x8c, 0x96, + 0x69, 0xc8, 0x8b, 0x8c, 0x6c, 0x69, 0xcc, 0xc1, 0x8a, 0xa8, 0x8b, 0x8c, + 0xa9, 0xcc, 0xcc, 0xad, 0xad, 0xff, 0xff, 0x22, 0x3c, 0xff, 0x02, 0xf0, + 0x00, 0x00, 0x18, 0xff, 0x02, 0xf3, 0x02, 0x52, 0x14, 0xff, 0x00, 0x18, + 0xf6, 0xc8, 0x8c, 0xca, 0xca, 0x9c, 0xc6, 0x98, 0x88, 0x88, 0xad, 0x8b, + 0x08, 0x88, 0x00, 0x2c, 0xc6, 0x6a, 0xa9, 0xcc, 0x88, 0x88, 0xc9, 0x96, + 0xcc, 0xc1, 0x9c, 0xc8, 0xcc, 0x8c, 0x88, 0x89, 0xaa, 0x96, 0xaf, 0xff, + 0xff, 0x22, 0x3c, 0xff, 0x02, 0xfc, 0x00, 0x00, 0x18, 0xff, 0x02, 0xf3, + 0x02, 0x52, 0x14, 0xff, 0x00, 0x4e, 0xfc, 0x8c, 0xc8, 0xc6, 0xca, 0x6c, + 0x96, 0xa8, 0xb8, 0x8c, 0x66, 0x88, 0xb8, 0x88, 0xcc, 0xc9, 0xa6, 0xa6, + 0xa6, 0x69, 0x8c, 0x9b, 0x89, 0xc6, 0xcc, 0xc6, 0x16, 0x98, 0xc8, 0xcc, + 0xc9, 0x9d, 0xec, 0x96, 0x7f, 0xff, 0xff, 0x23, 0x2f, 0x00, 0x3a, 0xff, + 0x02, 0xf0, 0x00, 0x00, 0x18, 0xff, 0x02, 0xf3, 0x02, 0x52, 0x14, 0xff, + 0x00, 0x4e, 0xfc, 0xc8, 0xc9, 0x9c, 0x8a, 0x9c, 0x96, 0xa8, 0x8b, 0x8c, + 0xa8, 0x8b, 0x88, 0x8c, 0xc9, 0x9a, 0x66, 0x6a, 0xaa, 0x69, 0x98, 0x98, + 0xb8, 0x99, 0xd9, 0x91, 0x1a, 0x6c, 0x9c, 0x96, 0x96, 0xde, 0x69, 0x67, + 0xff, 0xff, 0xff, 0xf3, 0x2f, 0x00, 0x3a, 0xff, 0x02, 0xf0, 0x00, 0x00, + 0x18, 0xff, 0x02, 0xf3, 0x02, 0x52, 0x14, 0xff, 0x00, 0x4e, 0xec, 0x8c, + 0xc9, 0x89, 0xca, 0x99, 0xc6, 0xec, 0x88, 0x89, 0x68, 0xb8, 0x88, 0x8c, + 0x99, 0xaa, 0xaa, 0xa6, 0x69, 0xcc, 0xcc, 0xc9, 0x8b, 0xcc, 0xa6, 0x96, + 0x16, 0x99, 0xc6, 0x99, 0x97, 0xde, 0x96, 0xef, 0xff, 0xff, 0xff, 0xf2, + 0x3f, 0x00, 0x3a, 0xff, 0x02, 0xf4, 0x00, 0x00, 0x18, 0xff, 0x02, 0xf3, + 0x02, 0x52, 0x14, 0xff, 0x00, 0x42, 0xa8, 0x88, 0x86, 0x9c, 0x89, 0x99, + 0xc9, 0xec, 0x8b, 0x88, 0x98, 0x8b, 0x88, 0xcc, 0x6a, 0x6a, 0x66, 0x69, + 0x96, 0x9c, 0x8c, 0xcc, 0x8b, 0x8c, 0x9d, 0x6a, 0x11, 0x9c, 0xc9, 0x6a, + 0xee, 0xed, 0x9e, 0x00, 0x08, 0xff, 0x02, 0xf2, 0x02, 0x3f, 0x3a, 0xff, + 0x02, 0xfb, 0x00, 0x00, 0x18, 0xff, 0x02, 0xf2, 0x02, 0x52, 0x12, 0xff, + 0x00, 0x42, 0xfd, 0xc8, 0x98, 0x8c, 0x99, 0x8c, 0x69, 0x99, 0xe9, 0x88, + 0xb8, 0x88, 0xb8, 0x88, 0xc9, 0x6a, 0x66, 0x66, 0x9a, 0xa6, 0x6c, 0x8c, + 0x8c, 0xc8, 0x88, 0x9a, 0xaa, 0x11, 0x6c, 0xc9, 0x9d, 0xee, 0xee, 0x00, + 0x0a, 0xff, 0x02, 0xf2, 0x02, 0x32, 0x3a, 0xff, 0x02, 0xf4, 0x00, 0x00, + 0x18, 0xff, 0x02, 0xf2, 0x02, 0x53, 0x12, 0xff, 0x00, 0x42, 0xec, 0x99, + 0xc6, 0x88, 0x69, 0x98, 0x69, 0x99, 0xaa, 0xc8, 0x88, 0x88, 0x88, 0x8c, + 0xc9, 0x6a, 0x69, 0x6a, 0xaa, 0xa6, 0xc9, 0xcc, 0xcc, 0xc8, 0xb8, 0xc6, + 0xdd, 0xa1, 0x6c, 0x89, 0xee, 0xee, 0x7f, 0x00, 0x0c, 0xff, 0x02, 0x32, + 0x3a, 0xff, 0x02, 0xfd, 0x00, 0x00, 0x18, 0xff, 0x02, 0xf2, 0x02, 0x53, + 0x12, 0xff, 0x00, 0x40, 0x9c, 0xcc, 0x6c, 0x98, 0x8c, 0x9c, 0x69, 0x99, + 0x6d, 0x9b, 0xb8, 0x8b, 0x88, 0x8c, 0x6a, 0xa6, 0x66, 0x66, 0x66, 0x69, + 0xcc, 0x8c, 0x88, 0x98, 0xb8, 0x89, 0xde, 0xd0, 0x19, 0x9a, 0xed, 0xe7, + 0x0e, 0xff, 0x02, 0x22, 0x3a, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x18, 0xff, + 0x02, 0xf2, 0x02, 0x55, 0x12, 0xff, 0x00, 0x40, 0xcc, 0xc8, 0x96, 0x96, + 0xc8, 0xcc, 0x99, 0x96, 0x9e, 0xd8, 0x88, 0xc8, 0x88, 0xc6, 0xa6, 0x66, + 0x69, 0x99, 0x99, 0x96, 0x9c, 0x88, 0xcc, 0xcc, 0x88, 0x8a, 0x6e, 0xe0, + 0x49, 0x9e, 0x77, 0x7f, 0x0e, 0xff, 0x02, 0x33, 0x3a, 0xff, 0x02, 0xf9, + 0x00, 0x00, 0x1a, 0xff, 0x02, 0x35, 0x02, 0x2f, 0x0e, 0xff, 0x00, 0x3e, + 0xf7, 0xc8, 0xcc, 0xc9, 0xaa, 0xd8, 0x89, 0x69, 0x99, 0x9c, 0x68, 0xbb, + 0x9c, 0x88, 0xa6, 0x66, 0x66, 0x69, 0xc9, 0x9a, 0xa6, 0x69, 0xc8, 0x88, + 0x8c, 0x88, 0xaf, 0x96, 0x7e, 0x01, 0xef, 0x00, 0x12, 0xff, 0x02, 0x23, + 0x3a, 0xff, 0x02, 0xfd, 0x00, 0x00, 0x1a, 0xff, 0x02, 0x35, 0x02, 0x2f, + 0x0e, 0xff, 0x00, 0x3e, 0xfa, 0xc8, 0x89, 0xcc, 0xa7, 0x6c, 0x88, 0x96, + 0xcc, 0xc9, 0xac, 0x88, 0xb8, 0x99, 0x66, 0x66, 0x99, 0x66, 0x66, 0xaa, + 0x6c, 0xc9, 0xcc, 0x88, 0x8c, 0x88, 0x87, 0x9c, 0xae, 0x01, 0x3f, 0x00, + 0x12, 0xff, 0x02, 0x33, 0x3a, 0xff, 0x02, 0xfd, 0x00, 0x00, 0x1a, 0xff, + 0x02, 0x25, 0x02, 0x3f, 0x0e, 0xff, 0x00, 0x3e, 0xf9, 0x88, 0x8c, 0x9c, + 0x6a, 0xcc, 0x9c, 0x8c, 0xcc, 0xcc, 0x6a, 0xc9, 0x6c, 0x99, 0x96, 0x66, + 0x96, 0x96, 0xaa, 0x69, 0xc8, 0xcc, 0xcc, 0x88, 0x88, 0xc8, 0x88, 0xca, + 0x77, 0x75, 0x52, 0x00, 0x10, 0xff, 0x02, 0xf2, 0x02, 0x33, 0x3a, 0xff, + 0x02, 0xfb, 0x00, 0x00, 0x1a, 0xff, 0x02, 0x25, 0x02, 0x5f, 0x0e, 0xff, + 0x00, 0x3e, 0x7c, 0xcc, 0xc8, 0xc9, 0xa8, 0xcc, 0xa6, 0x8b, 0x98, 0x9c, + 0xaa, 0xcc, 0x89, 0x99, 0x99, 0x69, 0x99, 0x66, 0x99, 0x99, 0x9c, 0x8c, + 0xcc, 0x88, 0xcc, 0xc8, 0x88, 0x86, 0xff, 0xf3, 0x55, 0x00, 0x12, 0xff, + 0x02, 0x32, 0x3a, 0xff, 0x02, 0xfd, 0x00, 0x00, 0x1a, 0xff, 0x02, 0xf3, + 0x02, 0x52, 0x0e, 0xff, 0x00, 0x1e, 0xd8, 0xcc, 0x6a, 0x89, 0x88, 0x9d, + 0xc8, 0x88, 0x99, 0xc8, 0x96, 0x88, 0x8c, 0x99, 0x96, 0x00, 0x08, 0x99, + 0x02, 0x98, 0x02, 0xcc, 0x08, 0x88, 0x00, 0x0e, 0xc8, 0x88, 0x88, 0x7f, + 0xff, 0x35, 0x3f, 0x00, 0x0e, 0xff, 0x02, 0xf2, 0x02, 0x32, 0x3a, 0xff, + 0x02, 0xfd, 0x00, 0x00, 0x1a, 0xff, 0x02, 0xf2, 0x02, 0x53, 0x0e, 0xff, + 0x00, 0x1c, 0x99, 0xcc, 0xc6, 0xea, 0xcc, 0xe9, 0x8b, 0x8c, 0x6f, 0xcc, + 0xc6, 0x88, 0x88, 0xc9, 0x08, 0x99, 0x00, 0x06, 0xc8, 0xca, 0xea, 0x00, + 0x08, 0x88, 0x00, 0x0e, 0x8c, 0x8c, 0x8c, 0xdf, 0xff, 0x25, 0x53, 0x00, + 0x0e, 0xff, 0x02, 0xf2, 0x02, 0x32, 0x3a, 0xff, 0x02, 0xf5, 0x00, 0x00, + 0x1a, 0xff, 0x02, 0xf2, 0x02, 0x55, 0x0c, 0xff, 0x00, 0x2e, 0xfd, 0xc9, + 0x8a, 0x96, 0xc9, 0x6c, 0x9c, 0x88, 0x8c, 0xef, 0xf9, 0xc9, 0x68, 0xb8, + 0xc9, 0x99, 0x99, 0x9c, 0x88, 0xc6, 0xd7, 0xdd, 0xa9, 0x00, 0x0a, 0x88, + 0x00, 0x0c, 0x96, 0xef, 0xff, 0xf2, 0x55, 0x2f, 0x0c, 0xff, 0x02, 0x23, + 0x02, 0x3f, 0x3a, 0xff, 0x02, 0xfd, 0x00, 0x00, 0x1c, 0xff, 0x02, 0x34, + 0x02, 0x2f, 0x0a, 0xff, 0x00, 0x44, 0xfc, 0xcc, 0xcc, 0x6a, 0xcc, 0xcd, + 0xac, 0x88, 0xcd, 0xff, 0xff, 0x6c, 0x9a, 0x88, 0x86, 0x99, 0x9c, 0xc8, + 0x8e, 0xde, 0x77, 0xea, 0xdd, 0xd9, 0x88, 0x88, 0x88, 0x8c, 0x97, 0xff, + 0xff, 0xff, 0x25, 0x53, 0x0c, 0xff, 0x02, 0x33, 0x02, 0x2f, 0x3a, 0xff, + 0x02, 0xf1, 0x00, 0x00, 0x1c, 0xff, 0x02, 0x25, 0x02, 0x5f, 0x0a, 0xff, + 0x00, 0x46, 0xd6, 0xc9, 0xc9, 0xa8, 0xcc, 0x88, 0x68, 0x88, 0x9f, 0xff, + 0xff, 0xf6, 0x9a, 0xc8, 0x89, 0x69, 0x9c, 0x86, 0xdd, 0xdd, 0x77, 0xda, + 0xae, 0xed, 0xdc, 0x88, 0x88, 0xcc, 0xdf, 0xff, 0xff, 0xff, 0xf2, 0x55, + 0x32, 0x00, 0x08, 0xff, 0x02, 0xf3, 0x02, 0x53, 0x3c, 0xff, 0x02, 0xfd, + 0x00, 0x00, 0x1c, 0xff, 0x02, 0xf3, 0x02, 0x52, 0x0a, 0xff, 0x00, 0x10, + 0x68, 0xc9, 0x99, 0x8c, 0x98, 0x88, 0x8c, 0x8a, 0x08, 0xff, 0x00, 0x22, + 0x6c, 0x99, 0xc6, 0x69, 0x88, 0xde, 0xdd, 0xee, 0xe6, 0xc8, 0x6d, 0xdd, + 0xdd, 0x68, 0x88, 0x89, 0x7f, 0x00, 0x08, 0xff, 0x00, 0x10, 0x25, 0x55, + 0x32, 0xff, 0xff, 0x22, 0x35, 0x3f, 0x3c, 0xff, 0x02, 0xfb, 0x00, 0x00, + 0x1c, 0xff, 0x00, 0x1e, 0xf2, 0x55, 0x2f, 0xff, 0xff, 0xff, 0xf6, 0xcc, + 0x6a, 0xed, 0x99, 0x88, 0xc8, 0x88, 0x6f, 0x00, 0x08, 0xff, 0x00, 0x20, + 0xf9, 0x96, 0xe9, 0x69, 0x6e, 0xaa, 0xde, 0xee, 0x66, 0xc8, 0xc6, 0xad, + 0xdd, 0xe6, 0x88, 0x89, 0x0c, 0xff, 0x00, 0x0c, 0x25, 0x55, 0x53, 0x33, + 0x35, 0x52, 0x3e, 0xff, 0x02, 0xfb, 0x00, 0x00, 0x1e, 0xff, 0x00, 0x1a, + 0x35, 0x2f, 0xff, 0xff, 0xff, 0xd8, 0x89, 0x9c, 0xda, 0x9c, 0x88, 0x88, + 0x89, 0x00, 0x0c, 0xff, 0x00, 0x1e, 0x77, 0xd9, 0x69, 0xd7, 0xdd, 0x77, + 0x76, 0x6a, 0xcc, 0xc9, 0x6a, 0xdd, 0xd6, 0xc8, 0x89, 0x00, 0x0c, 0xff, + 0x00, 0x0c, 0xf2, 0x23, 0x33, 0x53, 0x32, 0x2f, 0x3e, 0xff, 0x02, 0xf0, + 0x00, 0x00, 0x1e, 0xff, 0x00, 0x1a, 0x25, 0x5f, 0xff, 0xff, 0xff, 0x9c, + 0xca, 0xda, 0x99, 0xc8, 0xc8, 0x88, 0xc7, 0x00, 0x0e, 0xff, 0x00, 0x1c, + 0xf6, 0x69, 0xe7, 0x77, 0x7e, 0x66, 0x6a, 0xcc, 0xcc, 0x9a, 0xad, 0xd6, + 0xc8, 0xc6, 0x10, 0xff, 0x02, 0xf2, 0x02, 0xf2, 0x42, 0xff, 0x02, 0xf0, + 0x00, 0x00, 0x1e, 0xff, 0x00, 0x1a, 0xf3, 0x53, 0xff, 0xff, 0xfa, 0xa6, + 0xa7, 0xe9, 0xcc, 0x88, 0x8c, 0x8c, 0xaf, 0x00, 0x0e, 0xff, 0x00, 0x1c, + 0xf6, 0x69, 0xd7, 0x77, 0xd6, 0x66, 0x6a, 0xc9, 0xcc, 0xc9, 0x6a, 0xd6, + 0xc8, 0xca, 0x56, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x1e, 0xff, 0x00, 0x18, + 0xf2, 0x55, 0x2f, 0xff, 0x66, 0x98, 0x8c, 0xcc, 0xd9, 0xc8, 0xb8, 0x86, + 0x10, 0xff, 0x00, 0x1c, 0xf6, 0x69, 0xae, 0xd6, 0x66, 0x6a, 0x6a, 0x9c, + 0xc9, 0xc9, 0x99, 0xa9, 0xcc, 0xcd, 0x56, 0xff, 0x02, 0xfb, 0x00, 0x00, + 0x20, 0xff, 0x00, 0x16, 0x25, 0x5f, 0xee, 0x69, 0x9c, 0x8c, 0xcc, 0xc6, + 0xc8, 0x88, 0x9f, 0x00, 0x10, 0xff, 0x00, 0x1c, 0x76, 0x66, 0x66, 0x66, + 0x6a, 0x66, 0x6a, 0xcc, 0x9c, 0xcc, 0xcc, 0xc8, 0x8c, 0xcd, 0x56, 0xff, + 0x02, 0xfb, 0x00, 0x00, 0x20, 0xff, 0x00, 0x16, 0xf3, 0x50, 0x66, 0xc8, + 0xcc, 0xc8, 0xc9, 0x8c, 0x98, 0x8c, 0x7f, 0x00, 0x10, 0xff, 0x02, 0xe6, + 0x02, 0xa6, 0x0a, 0x66, 0x00, 0x0e, 0xc9, 0xcc, 0x99, 0x99, 0xcc, 0xcc, + 0xce, 0x00, 0x56, 0xff, 0x02, 0xfb, 0x00, 0x00, 0x22, 0xff, 0x00, 0x12, + 0x11, 0xc9, 0x98, 0xcc, 0xc9, 0x6c, 0x8c, 0xcc, 0xcd, 0x00, 0x12, 0xff, + 0x00, 0x1c, 0xe6, 0xaa, 0x66, 0x66, 0x6c, 0xc6, 0x66, 0xcc, 0x99, 0xcc, + 0x99, 0x9c, 0x89, 0x9e, 0x56, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x1e, 0xff, + 0x00, 0x16, 0x22, 0xff, 0x11, 0x18, 0x88, 0x99, 0x8c, 0xc9, 0x98, 0xbc, + 0x9f, 0x00, 0x12, 0xff, 0x00, 0x1c, 0xe6, 0x66, 0x66, 0x66, 0x88, 0x86, + 0xa9, 0xc8, 0x89, 0x69, 0x99, 0x99, 0xcc, 0xc7, 0x56, 0xff, 0x02, 0xfc, + 0x00, 0x00, 0x1c, 0xff, 0x00, 0x18, 0xf2, 0x00, 0x02, 0x66, 0x11, 0x8c, + 0x9c, 0x9c, 0xc8, 0xb8, 0x88, 0xdf, 0x12, 0xff, 0x00, 0x1c, 0xd9, 0x6a, + 0x66, 0x68, 0x88, 0x96, 0x69, 0xc8, 0xc8, 0x96, 0x96, 0x99, 0x9c, 0x67, + 0x56, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x1c, 0xff, 0x00, 0x1e, 0xf0, 0x00, + 0x00, 0x68, 0xc1, 0x18, 0xcc, 0x66, 0x98, 0x88, 0x88, 0xdf, 0xff, 0x23, + 0x2f, 0x00, 0x0c, 0xff, 0x00, 0x1c, 0x66, 0x66, 0x69, 0x98, 0x99, 0x66, + 0x69, 0xcc, 0xc9, 0x8a, 0x96, 0x99, 0xcc, 0xce, 0x56, 0xff, 0x02, 0xfc, + 0x00, 0x00, 0x1c, 0xff, 0x00, 0x1e, 0x20, 0x00, 0x00, 0x98, 0x8c, 0x11, + 0x86, 0x6a, 0xd9, 0xc8, 0x8c, 0xff, 0xf2, 0x32, 0x3f, 0x00, 0x0c, 0xff, + 0x00, 0x1c, 0xa6, 0x66, 0x99, 0xc9, 0x69, 0x69, 0x99, 0xc9, 0xc6, 0xc9, + 0x66, 0x99, 0xcc, 0xce, 0x56, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x1c, 0xff, + 0x00, 0x1e, 0x23, 0x00, 0x00, 0xc8, 0x8c, 0x91, 0x98, 0xcc, 0x6d, 0x98, + 0x89, 0xff, 0xf3, 0x32, 0x3f, 0x00, 0x0c, 0xff, 0x00, 0x1c, 0x66, 0x69, + 0xcc, 0x96, 0x99, 0x99, 0x6c, 0xc9, 0xc6, 0x6c, 0x96, 0xa6, 0x9c, 0x8e, + 0x56, 0xff, 0x02, 0xfc, 0x00, 0x00, 0x1e, 0xff, 0x00, 0x1c, 0x23, 0x01, + 0xc8, 0xc9, 0x9c, 0x11, 0x8b, 0x86, 0xac, 0x88, 0xaf, 0x23, 0x37, 0x2f, + 0x0c, 0xff, 0x00, 0x1c, 0x66, 0x69, 0x89, 0x99, 0x69, 0x69, 0xcc, 0xc9, + 0xc6, 0xd6, 0x88, 0x9a, 0x9c, 0xcf, 0x56, 0xff, 0x02, 0xfb, 0x00, 0x00, + 0x20, 0xff, 0x00, 0x1a, 0xac, 0xc8, 0xc9, 0x8c, 0x61, 0x18, 0x88, 0x8c, + 0xc8, 0x8e, 0x33, 0x23, 0x2f, 0x00, 0x0c, 0xff, 0x00, 0x1c, 0xa6, 0x68, + 0x9c, 0xc6, 0x69, 0x99, 0x6c, 0x9c, 0xca, 0x66, 0xd9, 0x86, 0xa9, 0xcf, + 0x56, 0xff, 0x02, 0xfc, 0x00, 0x00, 0x1e, 0xff, 0x00, 0x1a, 0xf7, 0x8a, + 0x6d, 0xe9, 0x89, 0xcc, 0x11, 0x69, 0x88, 0xcc, 0xcd, 0x32, 0x33, 0x00, + 0x0e, 0xff, 0x00, 0x1c, 0xa6, 0xc9, 0x69, 0xc9, 0xa9, 0x99, 0x9c, 0xcc, + 0x96, 0xad, 0x66, 0xcc, 0xa9, 0x9f, 0x56, 0xff, 0x02, 0xf0, 0x00, 0x00, + 0x1e, 0xff, 0x00, 0x1a, 0xf6, 0x89, 0xcc, 0x66, 0x6d, 0x98, 0xc1, 0x19, + 0x19, 0xc8, 0x83, 0x23, 0x3f, 0x00, 0x0e, 0xff, 0x00, 0x1c, 0xa9, 0x96, + 0x99, 0x99, 0xa9, 0x99, 0xcc, 0x9c, 0xc6, 0xaa, 0x69, 0x6c, 0xca, 0x6f, + 0x56, 0xff, 0x02, 0xfc, 0x00, 0x00, 0x1e, 0xff, 0x00, 0x1a, 0xf9, 0xa8, + 0x89, 0xc8, 0x9a, 0xa9, 0x6c, 0x64, 0x41, 0x19, 0xa3, 0x30, 0x3f, 0x00, + 0x0e, 0xff, 0x00, 0x1c, 0x7a, 0xa6, 0x99, 0x9c, 0xa6, 0x66, 0xad, 0xc9, + 0x9a, 0x6a, 0xa9, 0x96, 0xc9, 0x6f, 0x56, 0xff, 0x02, 0xfc, 0x00, 0x00, + 0x1e, 0xff, 0x00, 0x1a, 0xf6, 0xc9, 0xac, 0x88, 0xc9, 0x88, 0xcc, 0xc6, + 0x44, 0x00, 0x32, 0x70, 0x2f, 0x00, 0x10, 0xff, 0x00, 0x1a, 0x7d, 0xa9, + 0x99, 0x66, 0x66, 0xae, 0x9c, 0xc9, 0x99, 0x9c, 0xc9, 0x99, 0xef, 0x00, + 0x56, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x20, 0xff, 0x00, 0x18, 0xa8, 0xca, + 0xc9, 0x9b, 0x8c, 0x8b, 0x86, 0x11, 0x40, 0x32, 0x30, 0x3f, 0x0c, 0xff, + 0x00, 0x1c, 0xf2, 0x32, 0xff, 0xff, 0xfe, 0x6a, 0x66, 0x6d, 0x9c, 0x99, + 0x99, 0x66, 0x66, 0xae, 0x58, 0xff, 0x02, 0xfc, 0x00, 0x00, 0x20, 0xff, + 0x00, 0x18, 0xf9, 0xcc, 0x88, 0x99, 0xc8, 0x88, 0x86, 0x00, 0x03, 0x32, + 0x33, 0x02, 0x0c, 0xff, 0x00, 0x16, 0x23, 0x22, 0xff, 0xff, 0xff, 0xfd, + 0x6d, 0x6a, 0xcc, 0x99, 0xd7, 0x00, 0x5e, 0xff, 0x02, 0xfb, 0x00, 0x00, + 0x22, 0xff, 0x00, 0x18, 0xfa, 0xc8, 0xc8, 0x88, 0xc8, 0x8c, 0xa0, 0x33, + 0x37, 0x32, 0x30, 0x02, 0x0a, 0xff, 0x02, 0x33, 0x02, 0x22, 0x08, 0xff, + 0x00, 0x08, 0xad, 0xad, 0x69, 0x97, 0x60, 0xff, 0x02, 0xfb, 0x00, 0x00, + 0x24, 0xff, 0x00, 0x24, 0x9c, 0xd9, 0x8c, 0xcc, 0x6d, 0xf2, 0x33, 0x23, + 0x33, 0x50, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf2, 0x00, 0x2f, 0x08, 0xff, + 0x00, 0x08, 0x7a, 0xda, 0x9c, 0x7f, 0x60, 0xff, 0x02, 0xfb, 0x00, 0x00, + 0x28, 0xff, 0x00, 0x20, 0xc9, 0x6a, 0xef, 0xf2, 0x32, 0x33, 0x00, 0x01, + 0x00, 0x00, 0x52, 0xff, 0xff, 0xf0, 0x00, 0x2f, 0x08, 0xff, 0x00, 0x06, + 0xfa, 0xad, 0xcd, 0x00, 0x62, 0xff, 0x02, 0xfc, 0x00, 0x00, 0x2a, 0xff, + 0x00, 0x1c, 0xe7, 0xff, 0xf2, 0x32, 0x03, 0x33, 0x00, 0x01, 0x01, 0x00, + 0x52, 0xff, 0x20, 0x03, 0x0a, 0xff, 0x00, 0x06, 0xfd, 0xad, 0xcf, 0x00, + 0x62, 0xff, 0x02, 0xfa, 0x00, 0x00, 0x2e, 0xff, 0x00, 0x18, 0x23, 0x37, + 0x32, 0xff, 0xf3, 0x00, 0x00, 0x11, 0x00, 0x52, 0x00, 0x0f, 0x0a, 0xff, + 0x00, 0x06, 0xfd, 0x6d, 0xaf, 0x00, 0x62, 0xff, 0x02, 0xf0, 0x00, 0x00, + 0x2e, 0xff, 0x00, 0x18, 0x23, 0x33, 0x3f, 0xff, 0xff, 0x23, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x2f, 0x0a, 0xff, 0x00, 0x06, 0xfe, 0xa0, 0x7f, 0x00, + 0x62, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x2e, 0xff, 0x02, 0x37, 0x02, 0x33, + 0x08, 0xff, 0x00, 0x0c, 0x23, 0x00, 0x00, 0x10, 0x00, 0x02, 0x0a, 0xff, + 0x00, 0x06, 0xf2, 0xd2, 0x32, 0x00, 0x62, 0xff, 0x02, 0xfc, 0x00, 0x00, + 0x2c, 0xff, 0x00, 0x06, 0xf2, 0x33, 0x33, 0x00, 0x0a, 0xff, 0x00, 0x0c, + 0xf3, 0x00, 0x01, 0x01, 0x00, 0x02, 0x08, 0xff, 0x00, 0x06, 0xf2, 0x02, + 0x2f, 0x00, 0x62, 0xff, 0x02, 0xfa, 0x00, 0x00, 0x2c, 0xff, 0x00, 0x06, + 0xf2, 0x22, 0x3f, 0x00, 0x0c, 0xff, 0x00, 0x18, 0xf3, 0x00, 0x10, 0x01, + 0x00, 0x52, 0xff, 0xff, 0xff, 0xf3, 0x10, 0x2f, 0x62, 0xff, 0x02, 0xfc, + 0x00, 0x00, 0x2c, 0xff, 0x00, 0x06, 0xf3, 0x23, 0x2f, 0x00, 0x0c, 0xff, + 0x00, 0x16, 0xf2, 0x00, 0x00, 0x10, 0x10, 0x10, 0x03, 0xff, 0xff, 0x20, + 0x03, 0x00, 0x64, 0xff, 0x02, 0xf9, 0x00, 0x00, 0x2e, 0xff, 0x02, 0x32, + 0x0e, 0xff, 0x00, 0x16, 0x23, 0x13, 0x23, 0x01, 0x01, 0x01, 0x00, 0x03, + 0x2f, 0x30, 0x0f, 0x00, 0x64, 0xff, 0x02, 0xfc, 0x00, 0x00, 0x3e, 0xff, + 0x00, 0x16, 0x20, 0x02, 0xff, 0x23, 0x00, 0x10, 0x10, 0x10, 0x03, 0x00, + 0x2f, 0x00, 0x0c, 0xff, 0x02, 0xf2, 0x56, 0xff, 0x02, 0xfb, 0x00, 0x00, + 0x3e, 0xff, 0x00, 0x14, 0x00, 0x0f, 0xff, 0xff, 0x23, 0x00, 0x11, 0x10, + 0x00, 0x00, 0x0e, 0xff, 0x02, 0x23, 0x02, 0x2f, 0x54, 0xff, 0x02, 0xf0, + 0x00, 0x00, 0x3c, 0xff, 0x00, 0x1a, 0xf2, 0x00, 0x2f, 0xff, 0xff, 0xff, + 0x23, 0x00, 0x01, 0x10, 0x00, 0x53, 0x2f, 0x00, 0x08, 0xff, 0x00, 0x06, + 0xf2, 0x32, 0x3f, 0x00, 0x54, 0xff, 0x02, 0xfb, 0x00, 0x00, 0x3c, 0xff, + 0x02, 0xf3, 0x02, 0x33, 0x0a, 0xff, 0x00, 0x1a, 0x23, 0x00, 0x11, 0x10, + 0x10, 0x03, 0x2f, 0xff, 0xff, 0xff, 0xf3, 0x00, 0x2f, 0x00, 0x54, 0xff, + 0x02, 0xfc, 0x00, 0x00, 0x3c, 0xff, 0x02, 0xf3, 0x02, 0x32, 0x0c, 0xff, + 0x00, 0x16, 0x23, 0x00, 0x11, 0x11, 0x00, 0x03, 0x2f, 0xff, 0xff, 0x20, + 0x13, 0x00, 0x56, 0xff, 0x02, 0xfb, 0x00, 0x00, 0x3c, 0xff, 0x02, 0xf2, + 0x02, 0x2f, 0x0c, 0xff, 0x00, 0x16, 0xf3, 0x00, 0x00, 0x10, 0x11, 0x10, + 0x53, 0x2f, 0xff, 0x30, 0x02, 0x00, 0x56, 0xff, 0x02, 0xfc, 0x00, 0x00, + 0x4c, 0xff, 0x00, 0x16, 0x20, 0x02, 0x23, 0x01, 0x01, 0x01, 0x11, 0x03, + 0x22, 0x01, 0x3f, 0x00, 0x56, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x4a, 0xff, + 0x00, 0x16, 0xf2, 0x30, 0x0f, 0xff, 0x23, 0x00, 0x11, 0x01, 0x10, 0x05, + 0x00, 0x00, 0x58, 0xff, 0x02, 0xfc, 0x00, 0x00, 0x4a, 0xff, 0x00, 0x18, + 0xf2, 0x01, 0x2f, 0xff, 0xff, 0x23, 0x00, 0x11, 0x01, 0x10, 0x15, 0x2f, + 0x0c, 0xff, 0x02, 0x32, 0x02, 0x2f, 0x46, 0xff, 0x02, 0xf0, 0x00, 0x00, + 0x4a, 0xff, 0x02, 0xf3, 0x02, 0x30, 0x08, 0xff, 0x00, 0x0e, 0x23, 0x00, + 0x11, 0x11, 0x00, 0x03, 0x22, 0x00, 0x08, 0xff, 0x00, 0x06, 0xf2, 0x23, + 0x2f, 0x00, 0x46, 0xff, 0x02, 0xf1, 0x00, 0x00, 0x4a, 0xff, 0x02, 0x23, + 0x02, 0x32, 0x0a, 0xff, 0x00, 0x1a, 0x23, 0x00, 0x11, 0x11, 0x41, 0x03, + 0x2f, 0xff, 0xff, 0xff, 0xf3, 0x33, 0x2f, 0x00, 0x46, 0xff, 0x02, 0xf0, + 0x00, 0x00, 0x4a, 0xff, 0x02, 0xf2, 0x02, 0x32, 0x0c, 0xff, 0x00, 0x16, + 0x23, 0x00, 0x11, 0x11, 0x01, 0x03, 0x2f, 0xff, 0xff, 0x20, 0x13, 0x00, + 0x48, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x5a, 0xff, 0x00, 0x16, 0xf0, 0x05, + 0x00, 0x11, 0x14, 0x10, 0x00, 0x2f, 0xff, 0x31, 0x0f, 0x00, 0x48, 0xff, + 0x02, 0xfa, 0x00, 0x00, 0x5a, 0xff, 0x00, 0x16, 0x20, 0x12, 0xf3, 0x01, + 0x11, 0x11, 0x40, 0x03, 0x22, 0x01, 0x2f, 0x00, 0x48, 0xff, 0x02, 0xf0, + 0x00, 0x00, 0x58, 0xff, 0x00, 0x16, 0xf2, 0x01, 0x3f, 0xff, 0xf3, 0x01, + 0x01, 0x11, 0x41, 0x05, 0x00, 0x00, 0x4a, 0xff, 0x02, 0xf4, 0x00, 0x00, + 0x58, 0xff, 0x00, 0x18, 0xf3, 0x00, 0x2f, 0xff, 0xff, 0xf3, 0x01, 0x11, + 0x11, 0x11, 0x13, 0x2f, 0x0c, 0xff, 0x02, 0x22, 0x3a, 0xff, 0x02, 0xf0, + 0x00, 0x00, 0x58, 0xff, 0x02, 0x23, 0x02, 0x30, 0x08, 0xff, 0x00, 0x0e, + 0xf2, 0x30, 0x11, 0x14, 0x11, 0x03, 0x2f, 0x00, 0x08, 0xff, 0x02, 0xf3, + 0x02, 0x33, 0x3a, 0xff, 0x02, 0xfb, 0x00, 0x00, 0x58, 0xff, 0x02, 0x23, + 0x02, 0x22, 0x0a, 0xff, 0x00, 0x18, 0xf2, 0x30, 0x11, 0x14, 0x11, 0x03, + 0x2f, 0xff, 0xff, 0xff, 0xf3, 0x33, 0x3a, 0xff, 0x02, 0xf0, 0x00, 0x00, + 0x58, 0xff, 0x02, 0xf2, 0x02, 0x3f, 0x0c, 0xff, 0x00, 0x16, 0xf3, 0x01, + 0x11, 0x11, 0x41, 0x03, 0x2f, 0xff, 0xff, 0x31, 0x02, 0x00, 0x3a, 0xff, + 0x02, 0xf1, 0x00, 0x00, 0x68, 0xff, 0x00, 0x16, 0xf0, 0x13, 0x00, 0x11, + 0x11, 0x11, 0x03, 0x2f, 0xff, 0x51, 0x3f, 0x00, 0x3a, 0xff, 0x02, 0xfc, + 0x00, 0x00, 0x68, 0xff, 0x00, 0x16, 0x31, 0x02, 0xf3, 0x00, 0x11, 0x41, + 0x41, 0x03, 0x22, 0x11, 0x2f, 0x00, 0x3a, 0xff, 0x02, 0xf0, 0x00, 0x00, + 0x66, 0xff, 0x00, 0x16, 0xf2, 0x01, 0x3f, 0xff, 0xf3, 0x01, 0x11, 0x11, + 0x11, 0x10, 0x13, 0x00, 0x3c, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x66, 0xff, + 0x00, 0x18, 0xf3, 0x10, 0x2f, 0xff, 0xff, 0xf2, 0x01, 0x11, 0x41, 0x41, + 0x10, 0x2f, 0x0a, 0xff, 0x02, 0xf2, 0x02, 0x32, 0x2c, 0xff, 0x02, 0xf0, + 0x00, 0x00, 0x66, 0xff, 0x02, 0x23, 0x02, 0x00, 0x08, 0xff, 0x00, 0x0e, + 0xf2, 0x01, 0x11, 0x11, 0x14, 0x10, 0x3f, 0x00, 0x08, 0xff, 0x02, 0xf3, + 0x02, 0x33, 0x2c, 0xff, 0x02, 0xf4, 0x00, 0x00, 0x66, 0xff, 0x02, 0x33, + 0x02, 0x32, 0x0a, 0xff, 0x00, 0x18, 0xf3, 0x00, 0x14, 0x11, 0x11, 0x40, + 0x2f, 0xff, 0xff, 0xff, 0x25, 0x32, 0x2c, 0xff, 0x02, 0xf0, 0x00, 0x00, + 0x66, 0xff, 0x02, 0x23, 0x02, 0x3f, 0x0c, 0xff, 0x00, 0x16, 0xf0, 0x11, + 0x11, 0x41, 0x11, 0x10, 0x2f, 0xff, 0xff, 0x01, 0x02, 0x00, 0x2c, 0xff, + 0x02, 0xf2, 0x00, 0x00, 0x66, 0xff, 0x02, 0xf2, 0x02, 0x2f, 0x0c, 0xff, + 0x00, 0x16, 0x21, 0x13, 0x01, 0x11, 0x14, 0x11, 0x10, 0x2f, 0xf2, 0x11, + 0x3f, 0x00, 0x2c, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x76, 0xff, 0x00, 0x16, + 0x31, 0x0f, 0xf2, 0x01, 0x11, 0x14, 0x11, 0x15, 0x25, 0x10, 0x2f, 0x00, + 0x2c, 0xff, 0x02, 0xf1, 0x00, 0x00, 0x74, 0xff, 0x00, 0x16, 0xf2, 0x11, + 0x3f, 0xff, 0xf3, 0x00, 0x11, 0x14, 0x11, 0x11, 0x13, 0x00, 0x0e, 0xff, + 0x02, 0x2f, 0x1e, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x74, 0xff, 0x00, 0x18, + 0xf3, 0x10, 0xff, 0xff, 0xff, 0xf2, 0x00, 0x11, 0x14, 0x11, 0x10, 0x32, + 0x0a, 0xff, 0x02, 0xf3, 0x02, 0x33, 0x1e, 0xff, 0x02, 0xf0, 0x00, 0x00, + 0x74, 0xff, 0x02, 0x23, 0x02, 0x32, 0x08, 0xff, 0x00, 0x0e, 0xf2, 0x30, + 0x11, 0x14, 0x11, 0x10, 0x32, 0x00, 0x08, 0xff, 0x02, 0xf3, 0x02, 0x33, + 0x1e, 0xff, 0x02, 0xfb, 0x00, 0x00, 0x74, 0xff, 0x02, 0x23, 0x02, 0x3f, + 0x0a, 0xff, 0x00, 0x18, 0xf2, 0x31, 0x11, 0x41, 0x14, 0x10, 0x32, 0xff, + 0xff, 0xff, 0x30, 0x32, 0x1e, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x84, 0xff, + 0x00, 0x16, 0x20, 0x11, 0x11, 0x41, 0x11, 0x10, 0x32, 0xff, 0xf2, 0x01, + 0x0f, 0x00, 0x1e, 0xff, 0x02, 0xfb, 0x00, 0x00, 0x84, 0xff, 0x00, 0x16, + 0x51, 0x13, 0x31, 0x11, 0x14, 0x11, 0x11, 0x32, 0xf3, 0x11, 0x3f, 0x00, + 0x1e, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x82, 0xff, 0x00, 0x18, 0xf2, 0x11, + 0x3f, 0xf2, 0x01, 0x11, 0x14, 0x11, 0x10, 0x50, 0x10, 0x2f, 0x1e, 0xff, + 0x02, 0xf7, 0x00, 0x00, 0x82, 0xff, 0x00, 0x16, 0xf0, 0x10, 0xff, 0xff, + 0xf2, 0x51, 0x11, 0x41, 0x11, 0x11, 0x12, 0x00, 0x0c, 0xff, 0x02, 0xf2, + 0x12, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x82, 0xff, 0x00, 0x18, 0x20, 0x13, + 0xff, 0xff, 0xff, 0xf2, 0x00, 0x11, 0x41, 0x41, 0x11, 0x2f, 0x0a, 0xff, + 0x02, 0xf3, 0x02, 0x32, 0x10, 0xff, 0x02, 0xf2, 0x00, 0x00, 0x82, 0xff, + 0x02, 0x33, 0x02, 0x32, 0x08, 0xff, 0x00, 0x0e, 0xf2, 0x01, 0x11, 0x11, + 0x41, 0x11, 0x3f, 0x00, 0x08, 0xff, 0x02, 0x23, 0x02, 0x33, 0x10, 0xff, + 0x02, 0xf0, 0x00, 0x00, 0x82, 0xff, 0x02, 0x33, 0x02, 0x3f, 0x0a, 0xff, + 0x00, 0x18, 0xf2, 0x51, 0x41, 0x14, 0x11, 0x11, 0x3f, 0xff, 0xff, 0xff, + 0x30, 0x02, 0x10, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x82, 0xff, 0x02, 0xf2, + 0x02, 0x2f, 0x0c, 0xff, 0x00, 0x16, 0x31, 0x11, 0x11, 0x41, 0x14, 0x11, + 0x32, 0xff, 0xf2, 0x01, 0x3f, 0x00, 0x10, 0xff, 0x02, 0xf4, 0x00, 0x00, + 0x92, 0xff, 0x00, 0x16, 0x01, 0x02, 0x31, 0x11, 0x41, 0x14, 0x11, 0x32, + 0xf3, 0x11, 0x2f, 0x00, 0x10, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x90, 0xff, + 0x00, 0x16, 0xf2, 0x11, 0x3f, 0xf2, 0x00, 0x11, 0x41, 0x11, 0x11, 0x50, + 0x13, 0x00, 0x12, 0xff, 0x02, 0xf7, 0x00, 0x00, 0x90, 0xff, 0x00, 0x16, + 0xf0, 0x10, 0xff, 0xff, 0xf2, 0x31, 0x11, 0x41, 0x41, 0x11, 0x12, 0x00, + 0x12, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x90, 0xff, 0x00, 0x18, 0x20, 0x13, + 0xff, 0xff, 0xff, 0xf2, 0x31, 0x11, 0x11, 0x41, 0x41, 0x3f, 0x10, 0xff, + 0x02, 0xf2, 0x00, 0x00, 0x90, 0xff, 0x02, 0x33, 0x02, 0x32, 0x08, 0xff, + 0x00, 0x0e, 0xf2, 0x31, 0x14, 0x11, 0x11, 0x11, 0x3f, 0x00, 0x0e, 0xff, + 0x02, 0xf0, 0x00, 0x00, 0x90, 0xff, 0x02, 0x33, 0x02, 0x2f, 0x0a, 0xff, + 0x00, 0x0e, 0xf2, 0x31, 0x11, 0x41, 0x41, 0x41, 0x32, 0x00, 0x0c, 0xff, + 0x02, 0xf2, 0x00, 0x00, 0x90, 0xff, 0x02, 0xf2, 0x0e, 0xff, 0x00, 0x0c, + 0x21, 0x00, 0x11, 0x11, 0x11, 0x13, 0x0c, 0xff, 0x02, 0xf0, 0x00, 0x00, + 0xa0, 0xff, 0x00, 0x0c, 0x01, 0x3f, 0x20, 0x11, 0x41, 0x12, 0x0c, 0xff, + 0x02, 0xf0, 0x00, 0x00, 0x9e, 0xff, 0x00, 0x0e, 0xf3, 0x11, 0xff, 0xff, + 0x30, 0x11, 0x3f, 0x00, 0x0c, 0xff, 0x02, 0xf0, 0x00, 0x00, 0x9e, 0xff, + 0x00, 0x0e, 0xf0, 0x13, 0xff, 0xff, 0xff, 0x33, 0x2f, 0x00, 0x0c, 0xff, + 0x02, 0xf0, 0x00, 0x00, 0x9e, 0xff, 0x02, 0x33, 0x02, 0x02, 0x16, 0xff, + 0x02, 0xf2, 0x00, 0x00, 0x9e, 0xff, 0x02, 0x32, 0x02, 0x3f, 0x16, 0xff, + 0x02, 0xf0, 0x00, 0x00, 0x9e, 0xff, 0x02, 0x23, 0x02, 0x3f, 0x16, 0xff, + 0x02, 0xfb, 0x00, 0x00, 0xb8, 0xff, 0x02, 0xf0, 0x00, 0x01, 0x00, 0x00 +}; +unsigned int splash_bmp_len = 12840; diff --git a/firmware/application/ui_afsksetup.cpp b/firmware/application/ui_afsksetup.cpp new file mode 100644 index 00000000..4e0e6266 --- /dev/null +++ b/firmware/application/ui_afsksetup.cpp @@ -0,0 +1,121 @@ +/* + * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. + * + * This file is part of PortaPack. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#include "ui_rds.hpp" +#include "ui_afsksetup.hpp" +#include "ui_receiver.hpp" + +#include "ch.h" + +#include "ff.h" +#include "hackrf_gpio.hpp" +#include "portapack.hpp" +#include "radio.hpp" + +#include "hackrf_hal.hpp" +#include "portapack_shared_memory.hpp" +#include "portapack_persistent_memory.hpp" + +#include +#include + +using namespace hackrf::one; + +namespace ui { + +void AFSKSetupView::focus() { + button_setfreq.focus(); +} + +void AFSKSetupView::paint(Painter& painter) { + +} + +void AFSKSetupView::updfreq(rf::Frequency f) { + char finalstr[9] = {0}; + + persistent_memory::set_tuned_frequency(f); + transmitter_model.set_tuning_frequency(f); + + auto mhz = to_string_dec_int(f / 1000000, 3); + auto hz100 = to_string_dec_int((f / 100) % 10000, 4, '0'); + + strcat(finalstr, mhz.c_str()); + strcat(finalstr, "."); + strcat(finalstr, hz100.c_str()); + + this->button_setfreq.set_text(finalstr); +} + +AFSKSetupView::AFSKSetupView( + NavigationView& nav, + TransmitterModel& transmitter_model +) : transmitter_model(transmitter_model) +{ + + add_children({ { + &text_title, + &button_setfreq, + &button_setbps, + &text_mark, + &field_mark, + &text_space, + &field_space, + &button_done + } }); + + updfreq(persistent_memory::tuned_frequency()); + + field_mark.set_value(persistent_memory::afsk_mark_freq()*100); + field_space.set_value(persistent_memory::afsk_space_freq()*100); + + button_setfreq.on_select = [this,&nav](Button&){ + auto new_view = new FrequencyKeypadView { nav, this->transmitter_model.tuning_frequency() }; + new_view->on_changed = [this](rf::Frequency f) { + updfreq(f); + }; + nav.push(new_view); + }; + + if (persistent_memory::afsk_bitrate() == 1200) { + button_setbps.set_text("1200 bps"); + } else { + button_setbps.set_text("2400 bps"); + } + + button_setbps.on_select = [this](Button&){ + if (persistent_memory::afsk_bitrate() == 1200) { + persistent_memory::set_afsk_bitrate(2400); + button_setbps.set_text("2400 bps"); + } else { + persistent_memory::set_afsk_bitrate(1200); + button_setbps.set_text("1200 bps"); + } + }; + + button_done.on_select = [this,&nav](Button&){ + persistent_memory::set_afsk_mark(field_mark.value()/100); + persistent_memory::set_afsk_space(field_space.value()/100); + nav.pop(); + }; +} + +} /* namespace ui */ diff --git a/firmware/application/ui_afsksetup.hpp b/firmware/application/ui_afsksetup.hpp new file mode 100644 index 00000000..c9f36b06 --- /dev/null +++ b/firmware/application/ui_afsksetup.hpp @@ -0,0 +1,93 @@ +/* + * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. + * + * This file is part of PortaPack. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#include "ui.hpp" +#include "ui_widget.hpp" +#include "ui_painter.hpp" +#include "ui_menu.hpp" +#include "ui_navigation.hpp" +#include "ui_font_fixed_8x16.hpp" +#include "clock_manager.hpp" +#include "message.hpp" +#include "rf_path.hpp" +#include "max2837.hpp" +#include "volume.hpp" +#include "transmitter_model.hpp" + +namespace ui { + +class AFSKSetupView : public View { +public: + AFSKSetupView(NavigationView& nav, TransmitterModel& transmitter_model); + + void updfreq(rf::Frequency f); + void focus() override; + void paint(Painter& painter) override; + +private: + //rf::Frequency f = 162950000; + TransmitterModel& transmitter_model; + + Text text_title { + { 40, 32, 160, 16 }, + "AFSK modulator setup" + }; + + Button button_setfreq { + { 8, 64, 104, 32 }, + "---.----M" + }; + Button button_setbps { + { 128, 64, 96, 32 }, + "----bps" + }; + + Text text_mark { + { 16, 104, 48, 16 }, + "Mark: Hz" + }; + NumberField field_mark { + { 64, 104 }, + 5, + { 100, 32000 }, + 100, + ' ' + }; + + Text text_space { + { 16, 120, 48, 16 }, + "Space: Hz" + }; + NumberField field_space { + { 64, 120 }, + 5, + { 100, 32000 }, + 100, + ' ' + }; + + Button button_done { + { 72, 200, 96, 48 }, + "Save" + }; +}; + +} /* namespace ui */ diff --git a/firmware/application/ui_debug.cpp b/firmware/application/ui_debug.cpp index 56b02407..d917d434 100644 --- a/firmware/application/ui_debug.cpp +++ b/firmware/application/ui_debug.cpp @@ -27,6 +27,7 @@ #include "led.hpp" #include "hackrf_gpio.hpp" #include "portapack.hpp" +#include "portapack_shared_memory.hpp" #include "radio.hpp" @@ -229,15 +230,71 @@ void DebugSDView::focus() { button_done.focus(); } +// LCR debug view + +void DebugLCRView::paint(Painter& painter) { + const Point offset = { + static_cast(32), + static_cast(32) + }; + + const auto text = to_string_hex(fr, 2); + painter.draw_string( + screen_pos() + offset, + style(), + text + ); +} + +char hexify(char in) { + if (in > 9) in += 7; + return in + 0x30; +} + +DebugLCRView::DebugLCRView(NavigationView& nav, char* lcrstring, uint8_t checksum) { + char cstr[15] = "Checksum: 0x "; + + add_children({ { + &text_lcr1, + &text_lcr2, + &text_lcr3, + &text_lcr4, + &text_lcr5, + &text_lcr6, + &text_checksum, + &button_done + } }); + + std::string b = std::string(lcrstring); + + text_lcr1.set(b.substr(8+(0*26),26)); + text_lcr2.set(b.substr(8+(1*26),26)); + text_lcr3.set(b.substr(8+(2*26),26)); + text_lcr4.set(b.substr(8+(3*26),26)); + text_lcr5.set(b.substr(8+(4*26),26)); + text_lcr6.set(b.substr(8+(5*26),26)); + + cstr[12] = hexify(checksum >> 4); + cstr[13] = hexify(checksum & 15); + + text_checksum.set(cstr); + + button_done.on_select = [&nav](Button&){ nav.pop(); }; +} + +void DebugLCRView::focus() { + button_done.focus(); +} + DebugMenuView::DebugMenuView(NavigationView& nav) { add_items<7>({ { - { "Memory", [&nav](){ nav.push(new DebugMemoryView { nav }); } }, - { "Radio State", [&nav](){ nav.push(new NotImplementedView { nav }); } }, - { "SD Card", [&nav](){ nav.push(new DebugSDView { nav }); } }, - { "RFFC5072", [&nav](){ nav.push(new DebugRFFC5072View { nav }); } }, - { "MAX2837", [&nav](){ nav.push(new NotImplementedView { nav }); } }, - { "Si5351C", [&nav](){ nav.push(new NotImplementedView { nav }); } }, - { "WM8731", [&nav](){ nav.push(new NotImplementedView { nav }); } }, + { "Memory", ui::Color::white(), [&nav](){ nav.push(new DebugMemoryView { nav }); } }, + { "Radio State", ui::Color::white(), [&nav](){ nav.push(new NotImplementedView { nav }); } }, + { "SD Card", ui::Color::white(), [&nav](){ nav.push(new DebugSDView { nav }); } }, + { "RFFC5072", ui::Color::white(), [&nav](){ nav.push(new DebugRFFC5072View { nav }); } }, + { "MAX2837", ui::Color::white(), [&nav](){ nav.push(new NotImplementedView { nav }); } }, + { "Si5351C", ui::Color::white(), [&nav](){ nav.push(new NotImplementedView { nav }); } }, + { "WM8731", ui::Color::white(), [&nav](){ nav.push(new NotImplementedView { nav }); } }, } }); on_left = [&nav](){ nav.pop(); }; } diff --git a/firmware/application/ui_debug.hpp b/firmware/application/ui_debug.hpp index ec976313..b85fb7a1 100644 --- a/firmware/application/ui_debug.hpp +++ b/firmware/application/ui_debug.hpp @@ -188,6 +188,51 @@ private: }; }; +class DebugLCRView : public View { +public: + DebugLCRView(NavigationView& nav, char* lcrstring, uint8_t checksum); + + void focus() override; + + void paint(Painter& painter) override; + +private: + Text text_lcr1 { + { 16, 32, 208, 8 }, + "" + }; + Text text_lcr2 { + { 16, 32+16, 208, 8 }, + "" + }; + Text text_lcr3 { + { 16, 32+16+16, 208, 8 }, + "" + }; + Text text_lcr4 { + { 16, 32+16+16+16, 208, 8 }, + "" + }; + Text text_lcr5 { + { 16, 32+16+16+16+16, 208, 8 }, + "" + }; + Text text_lcr6 { + { 16, 32+16+16+16+16+16, 208, 8 }, + "" + }; + + Text text_checksum { + { 16, 32+16+16+16+16+16+32, 208, 8 }, + "" + }; + + Button button_done { + { 72, 240, 96, 24 }, + "Done" + }; +}; + class DebugMenuView : public MenuView { public: DebugMenuView(NavigationView& nav); diff --git a/firmware/application/ui_lcr.cpp b/firmware/application/ui_lcr.cpp index ec65f5fa..4b89f6e9 100644 --- a/firmware/application/ui_lcr.cpp +++ b/firmware/application/ui_lcr.cpp @@ -22,6 +22,8 @@ #include "ui_rds.hpp" #include "ui_lcr.hpp" #include "ui_receiver.hpp" +#include "ui_afsksetup.hpp" +#include "ui_debug.hpp" #include "ch.h" @@ -37,6 +39,12 @@ #include #include +//TODO: Repeats +//TODO: Shared memory semaphore for doing/done +//TODO: Scan +//TODO: Text showing status in LCRView +//TODO: Checkboxes for AMs + using namespace hackrf::one; namespace ui { @@ -49,18 +57,70 @@ LCRView::~LCRView() { transmitter_model.disable(); } -char hexify(char in) { - if (in > 9) in += 7; - return in + 0x30; -} - -void LCRView::paint(Painter& painter) { +void LCRView::make_frame() { char eom[3] = { 3, 0, 0 }; - uint8_t checksum = 0, i; - char teststr[16]; + uint8_t i; uint16_t dp; uint8_t cp, pp, cur_byte, new_byte; + // Testing: 7 char pad for litterals + for (i = 0; i < 5; i++) { + while (strlen(litteral[i]) < 7) { + strcat(litteral[i], " "); + } + } + + // Recreate LCR frame + memset(lcrframe, 0, 256); + lcrframe[0] = 127; + lcrframe[1] = 127; + lcrframe[2] = 127; + lcrframe[3] = 127; + lcrframe[4] = 127; + lcrframe[5] = 127; + lcrframe[6] = 127; + lcrframe[7] = 15; + strcat(lcrframe, rgsb); + strcat(lcrframe, "PA AM=1 AF=\""); + strcat(lcrframe, litteral[0]); + strcat(lcrframe, "\" CL=0 AM=2 AF=\""); + strcat(lcrframe, litteral[1]); + strcat(lcrframe, "\" CL=0 AM=3 AF=\""); + strcat(lcrframe, litteral[2]); + strcat(lcrframe, "\" CL=0 AM=4 AF=\""); + strcat(lcrframe, litteral[3]); + strcat(lcrframe, "\" CL=0 AM=5 AF=\""); + strcat(lcrframe, litteral[4]); + strcat(lcrframe, "\" CL=0 EC=A SAB=0"); //TODO: EC=A,J,N + + memcpy(lcrstring, lcrframe, 256); + + //Checksum + checksum = 0; + i = 7; + while (lcrframe[i]) { + checksum ^= lcrframe[i]; + i++; + } + checksum ^= 3; + checksum &= 0x7F; + eom[1] = checksum; + + strcat(lcrframe, eom); + + for (dp=0;dp>cp)&1) pp++; + new_byte |= ((cur_byte>>cp)&1)<<(7-cp); + } + lcrframe_f[dp] = new_byte|(pp&1); + } +} + +void LCRView::paint(Painter& painter) { static constexpr Style style_orange { .font = font::fixed_8x16, .background = Color::black(), @@ -102,108 +162,65 @@ void LCRView::paint(Painter& painter) { litteral[3] ); - // Testing: 7 char pad for litterals - for (i = 0; i < 4; i++) { - while (strlen(litteral[i]) < 7) { - strcat(litteral[i], " "); - } - } + offset.y += 40; - // Recreate LCR frame - memset(lcrframe, 0, 256); - lcrframe[0] = 127; - lcrframe[1] = 127; - lcrframe[2] = 127; - lcrframe[3] = 127; - lcrframe[4] = 127; - lcrframe[5] = 127; - lcrframe[6] = 127; - lcrframe[7] = 15; - strcat(lcrframe, rgsb); - strcat(lcrframe, "PA AM=1 AF=\""); - strcat(lcrframe, litteral[0]); - strcat(lcrframe, "\" CL=0 AM=2 AF=\""); - strcat(lcrframe, litteral[1]); - strcat(lcrframe, "\" CL=0 AM=3 AF=\""); - strcat(lcrframe, litteral[2]); - strcat(lcrframe, "\" CL=0 AM=4 AF=\""); - strcat(lcrframe, litteral[3]); - strcat(lcrframe, "\" CL=0 EC=A SAB=0"); //TODO: EC=A,J,N - - //Checksum - i = 7; - while (lcrframe[i]) { - checksum ^= lcrframe[i]; - i++; - } - checksum ^= 3; - checksum &= 0x7F; - eom[1] = checksum; - - strcat(lcrframe, eom); - - for (dp=0;dp>cp)&1) pp++; - new_byte |= ((cur_byte>>cp)&1)<<(7-cp); - } - lcrframe[dp] = new_byte|(pp&1); - } - - teststr[0] = hexify(eom[1] >> 4); - teststr[1] = hexify(eom[1] & 15); - teststr[2] = 0; - offset.x = 220; painter.draw_string( screen_pos() + offset, - style(), - teststr + style_orange, + litteral[4] ); } -void LCRView::updfreq(rf::Frequency f) { - char finalstr[9] = {0}; - transmitter_model.set_tuning_frequency(f); - - auto mhz = to_string_dec_int(f / 1000000, 3); - auto hz100 = to_string_dec_int((f / 100) % 10000, 4, '0'); - - strcat(finalstr, mhz.c_str()); - strcat(finalstr, "."); - strcat(finalstr, hz100.c_str()); - - this->button_setfreq.set_text(finalstr); -} - LCRView::LCRView( NavigationView& nav, TransmitterModel& transmitter_model ) : transmitter_model(transmitter_model) { + char finalstr[24] = {0}; + + static constexpr Style style_val { + .font = font::fixed_8x16, + .background = Color::green(), + .foreground = Color::black(), + }; + transmitter_model.set_modulation(16); - transmitter_model.set_tuning_frequency(f); - memset(litteral, 0, 4*8); + transmitter_model.set_tuning_frequency(persistent_memory::tuned_frequency()); + memset(litteral, 0, 5*8); memset(rgsb, 0, 5); strcpy(rgsb, RGSB_list[0]); add_children({ { + &text_recap, &button_setrgsb, &button_txsetup, &button_setam_a, &button_setam_b, &button_setam_c, &button_setam_d, - &button_setfreq, - &button_setbps, + &button_setam_e, + &text_status, + &button_lcrdebug, &button_transmit, &button_transmit_scan, &button_exit } }); + // Recap: tx freq @ bps + auto fstr = to_string_dec_int(persistent_memory::tuned_frequency() / 1000, 6); + auto bstr = to_string_dec_int(persistent_memory::afsk_bitrate(), 4); + + strcat(finalstr, fstr.c_str()); + strcat(finalstr, " @ "); + strcat(finalstr, bstr.c_str()); + strcat(finalstr, "bps"); + + text_recap.set(finalstr); + + button_transmit.set_style(&style_val); + button_transmit_scan.set_style(&style_val); + button_setrgsb.on_select = [this,&nav](Button&){ auto an_view = new AlphanumView { nav, rgsb, 4 }; an_view->on_changed = [this](char *rgsb) { @@ -211,13 +228,6 @@ LCRView::LCRView( }; nav.push(an_view); }; - button_setfreq.on_select = [this,&nav](Button&){ - auto new_view = new FrequencyKeypadView { nav, this->transmitter_model.tuning_frequency() }; - new_view->on_changed = [this](rf::Frequency f) { - updfreq(f); - }; - nav.push(new_view); - }; button_setam_a.on_select = [this,&nav](Button&){ auto an_view = new AlphanumView { nav, litteral[0], 7 }; @@ -239,28 +249,46 @@ LCRView::LCRView( an_view->on_changed = [this](char *) {}; nav.push(an_view); }; - button_setbps.on_select = [this](Button&){ - if (persistent_memory::afsk_bitrate() == 1200) { - persistent_memory::set_afsk_bitrate(2400); - button_setbps.set_text("2400 bps"); - } else { - persistent_memory::set_afsk_bitrate(1200); - button_setbps.set_text("1200 bps"); - } + button_setam_e.on_select = [this,&nav](Button&){ + auto an_view = new AlphanumView { nav, litteral[4], 7 }; + an_view->on_changed = [this](char *) {}; + nav.push(an_view); + }; + + button_lcrdebug.on_select = [this,&nav](Button&){ + make_frame(); + nav.push(new DebugLCRView { nav, lcrstring, checksum }); }; button_transmit.on_select = [this,&transmitter_model](Button&){ uint16_t c; + ui::Context context; + + make_frame(); shared_memory.afsk_samples_per_bit = 228000/persistent_memory::afsk_bitrate(); - shared_memory.afsk_phase_inc_mark = persistent_memory::afsk_mark_freq()*(65536*1024)/228000; - shared_memory.afsk_phase_inc_space = persistent_memory::afsk_space_freq()*(65536*1024)/228000; + shared_memory.afsk_phase_inc_mark = persistent_memory::afsk_mark_freq()*(65536*1024)/2280; + shared_memory.afsk_phase_inc_space = persistent_memory::afsk_space_freq()*(65536*1024)/2280; for (c = 0; c < 256; c++) { shared_memory.lcrdata[c] = this->lcrframe[c]; } + + shared_memory.afsk_transmit_done = false; + shared_memory.afsk_repeat = 5; // DEFAULT + + /*context.message_map[Message::ID::TXDone] = [this](const Message* const p) { + text_status.set("Sent ! "); + };*/ + + text_status.set("Send..."); + transmitter_model.enable(); }; + + button_txsetup.on_select = [&nav, &transmitter_model](Button&){ + nav.push(new AFSKSetupView { nav, transmitter_model }); + }; button_exit.on_select = [&nav](Button&){ nav.pop(); diff --git a/firmware/application/ui_lcr.hpp b/firmware/application/ui_lcr.hpp index 3e7e320f..85b26b6b 100644 --- a/firmware/application/ui_lcr.hpp +++ b/firmware/application/ui_lcr.hpp @@ -39,7 +39,7 @@ public: LCRView(NavigationView& nav, TransmitterModel& transmitter_model); ~LCRView(); - void updfreq(rf::Frequency f); + void make_frame(); void focus() override; void paint(Painter& painter) override; @@ -56,12 +56,25 @@ private: "AJ40", "AJ50", "AJ60", "AJ70", "AK10" }; - char litteral[4][8]; + char litteral[5][8]; char rgsb[5]; + char lcrstring[256]; + char checksum = 0; char lcrframe[256]; + char lcrframe_f[256]; rf::Frequency f = 162950000; TransmitterModel& transmitter_model; + Text text_status { + { 136, 128, 64, 16 }, + "Ready" + }; + + Text text_recap { + { 32, 6, 192, 16 }, + "-" + }; + Button button_setrgsb { { 16, 24, 96, 32 }, "Set RGSB" @@ -91,21 +104,22 @@ private: "AM 4" }; - Button button_setfreq { - { 8, 232, 96, 32 }, - "162.9500" + Button button_setam_e { + { 16, 64+40+40+40+40, 48, 32 }, + "AM 5" }; - Button button_setbps { - { 128, 232, 96, 32 }, - "1200bps" + + Button button_lcrdebug { + { 152, 224, 64, 32 }, + "DEBUG" }; Button button_transmit { - { 8, 270, 48, 32 }, + { 24, 270, 48, 32 }, "TX" }; Button button_transmit_scan { - { 60, 270, 64, 32 }, + { 76, 270, 72, 32 }, "SCAN TX" }; Button button_exit { diff --git a/firmware/application/ui_menu.cpp b/firmware/application/ui_menu.cpp index 45468c2d..0924f016 100644 --- a/firmware/application/ui_menu.cpp +++ b/firmware/application/ui_menu.cpp @@ -50,10 +50,20 @@ void MenuItemView::paint(Painter& painter) { r, paint_style.background ); - + + ui::Color final_item_color = item.color; + + if (final_item_color.v == paint_style.background.v) final_item_color = paint_style.foreground; + + Style text_style { + .font = paint_style.font, + .background = paint_style.background, + .foreground = final_item_color + }; + painter.draw_string( { static_cast(r.pos.x + 8), static_cast(r.pos.y + (r.size.h - font_height) / 2) }, - paint_style, + text_style, item.text ); } diff --git a/firmware/application/ui_menu.hpp b/firmware/application/ui_menu.hpp index 5863e048..c52f2c3a 100644 --- a/firmware/application/ui_menu.hpp +++ b/firmware/application/ui_menu.hpp @@ -34,6 +34,7 @@ namespace ui { struct MenuItem { std::string text; + ui::Color color; std::function on_select; }; diff --git a/firmware/application/ui_navigation.cpp b/firmware/application/ui_navigation.cpp index aecf7eca..d97901b2 100644 --- a/firmware/application/ui_navigation.cpp +++ b/firmware/application/ui_navigation.cpp @@ -23,6 +23,9 @@ #include "receiver_model.hpp" #include "transmitter_model.hpp" +#include "portapack_persistent_memory.hpp" + +#include "splash.hpp" #include "ui_setup.hpp" #include "ui_debug.hpp" @@ -98,16 +101,17 @@ void NavigationView::focus() { /* SystemMenuView ********************************************************/ SystemMenuView::SystemMenuView(NavigationView& nav) { - add_items<9>({ { - { "Receiver", [&nav](){ nav.push(new ReceiverView { nav, receiver_model }); } }, - { "Capture", [&nav](){ nav.push(new NotImplementedView { nav }); } }, - { "Analyze", [&nav](){ nav.push(new NotImplementedView { nav }); } }, - { "RDS TX", [&nav](){ nav.push(new RDSView { nav, transmitter_model }); } }, - { "LCR TX", [&nav](){ nav.push(new LCRView { nav, transmitter_model }); } }, - { "Setup", [&nav](){ nav.push(new SetupMenuView { nav }); } }, - { "About", [&nav](){ nav.push(new AboutView { nav }); } }, - { "Debug", [&nav](){ nav.push(new DebugMenuView { nav }); } }, - { "HackRF", [&nav](){ nav.push(new HackRFFirmwareView { nav }); } }, + add_items<10>({ { + { "Play dead", ui::Color::red(), [&nav](){ nav.push(new PlayDeadView { nav }); } }, + { "Receiver", ui::Color::white(), [&nav](){ nav.push(new ReceiverView { nav, receiver_model }); } }, + { "Capture", ui::Color::white(), [&nav](){ nav.push(new NotImplementedView { nav }); } }, + { "Analyze", ui::Color::white(), [&nav](){ nav.push(new NotImplementedView { nav }); } }, + { "RDS TX", ui::Color::orange(), [&nav](){ nav.push(new RDSView { nav, transmitter_model }); } }, + { "LCR TX", ui::Color::orange(), [&nav](){ nav.push(new LCRView { nav, transmitter_model }); } }, + { "Setup", ui::Color::white(), [&nav](){ nav.push(new SetupMenuView { nav }); } }, + { "About", ui::Color::white(), [&nav](){ nav.push(new AboutView { nav }); } }, + { "Debug", ui::Color::white(), [&nav](){ nav.push(new DebugMenuView { nav }); } }, + { "HackRF", ui::Color::white(), [&nav](){ nav.push(new HackRFFirmwareView { nav }); } }, } }); } @@ -143,13 +147,104 @@ SystemView::SystemView( // Initial view. // TODO: Restore from non-volatile memory? - navigation_view.push(new SystemMenuView { navigation_view }); + navigation_view.push(new BMPView { navigation_view }); //SystemMenuView } Context& SystemView::context() const { return context_; } +/* ***********************************************************************/ + +void BMPView::focus() { + button_done.focus(); +} + +BMPView::BMPView(NavigationView& nav) { + add_children({ { + &text_info, + &button_done + } }); + + button_done.on_select = [this,&nav](Button&){ + nav.pop(); + nav.push(new SystemMenuView { nav }); + }; +} + +void BMPView::paint(Painter& painter) { + uint32_t pixel_data; + uint8_t p, by, c, count; + ui::Color linebuffer[185]; + ui::Coord px = 0, py = 302; + ui::Color palette[16]; + + // RLE_4 BMP loader with hardcoded size and no delta :( + + pixel_data = splash_bmp[0x0A]; + p = 0; + for (c = 0x36; c < (0x36+(16*4)); c+=4) { + palette[p++] = ui::Color(splash_bmp[c+2], splash_bmp[c+1], splash_bmp[c]); + } + + do { + by = splash_bmp[pixel_data++]; + if (by) { + count = by; + by = splash_bmp[pixel_data++]; + for (c = 0; c < count; c+=2) { + linebuffer[px++] = palette[by >> 4]; + if (px < 185) linebuffer[px++] = palette[by & 15]; + } + if (pixel_data & 1) pixel_data++; + } else { + by = splash_bmp[pixel_data++]; + if (by == 0) { + portapack::display.render_line({27, py}, 185, linebuffer); + py--; + px = 0; + } else if (by == 1) { + break; + } else if (by == 2) { + // Delta + } else { + count = by; + for (c = 0; c < count; c+=2) { + by = splash_bmp[pixel_data++]; + linebuffer[px++] = palette[by >> 4]; + if (px < 185) linebuffer[px++] = palette[by & 15]; + } + if (pixel_data & 1) pixel_data++; + } + } + } while (1); +} + +/* PlayDeadView **********************************************************/ + +void PlayDeadView::focus() { + button_done.focus(); +} + +PlayDeadView::PlayDeadView(NavigationView& nav) { + add_children({ { + &text_playdead1, + &text_playdead2, + &button_done, + } }); + + button_done.on_dir = [this,&nav](Button&, KeyEvent key){ + sequence = (sequence<<3) | static_cast::type>(key); + }; + + button_done.on_select = [this,&nav](Button&){ + if (sequence == persistent_memory::playdead_sequence()) + nav.pop(); + else + sequence = 0; + }; +} + /* HackRFFirmwareView ****************************************************/ HackRFFirmwareView::HackRFFirmwareView(NavigationView& nav) { diff --git a/firmware/application/ui_navigation.hpp b/firmware/application/ui_navigation.hpp index ee816a04..3dcbb474 100644 --- a/firmware/application/ui_navigation.hpp +++ b/firmware/application/ui_navigation.hpp @@ -41,8 +41,8 @@ public: private: Text portapack { - { 0, 0, 9 * 8, 1 * 16 }, - "PortaPack", + { 0, 0, 15 * 8, 1 * 16 }, + "PortaPack/HAVOC" }; }; @@ -70,6 +70,25 @@ public: SystemMenuView(NavigationView& nav); }; +class BMPView : public View { +public: + BMPView(NavigationView& nav); + void paint(Painter& painter) override; + void focus() override; + +private: + Text text_info { + { 5 * 8, 284, 20 * 8, 16 }, + "shrbrnd-sig-ftk 2015" + }; + + Button button_done { + { 240, 0, 1, 1 }, + "" + }; +}; + + class SystemView : public View { public: SystemView( @@ -85,6 +104,28 @@ private: Context& context_; }; +class PlayDeadView : public View { +public: + PlayDeadView(NavigationView& nav); + void focus() override; + +private: + uint32_t sequence = 0; + Text text_playdead1 { + { 6 * 8, 7 * 16, 14 * 8, 16 }, + "Firmware error" + }; + Text text_playdead2 { + { 6 * 8, 9 * 16, 16 * 8, 16 }, + "0x1400_0000 : 2C" + }; + + Button button_done { + { 240, 0, 1, 1 }, + "" + }; +}; + class HackRFFirmwareView : public View { public: HackRFFirmwareView(NavigationView& nav); diff --git a/firmware/application/ui_setup.cpp b/firmware/application/ui_setup.cpp index 08b29272..003697bb 100644 --- a/firmware/application/ui_setup.cpp +++ b/firmware/application/ui_setup.cpp @@ -26,8 +26,10 @@ #include "lpc43xx_cpp.hpp" #include +#include using namespace lpc43xx; +using namespace portapack; namespace ui { @@ -184,11 +186,56 @@ bool SetTouchCalibView::on_touch(const TouchEvent event) { return true; } +SetPlayDeadView::SetPlayDeadView(NavigationView& nav) { + add_children({{ + &text_sequence, + &button_enter, + &button_cancel + }}); + + button_enter.on_select = [this,&nav](Button&){ + if (entermode == false) { + sequence = 0; + memset(sequence_txt,0,11); + text_sequence.set(""); + keycount = 0; + entermode = true; + button_cancel.hidden(true); + } else { + persistent_memory::set_playdead_sequence(sequence); + nav.pop(); + } + }; + button_enter.on_dir = [this,&nav](Button&, KeyEvent key){ + if ((entermode == true) && (keycount < 10)) { + key_code = static_cast::type>(key); + if (key_code == 0) + sequence_txt[keycount] = 'R'; + else if (key_code == 1) + sequence_txt[keycount] = 'L'; + else if (key_code == 2) + sequence_txt[keycount] = 'D'; + else if (key_code == 3) + sequence_txt[keycount] = 'U'; + text_sequence.set(sequence_txt); + sequence = (sequence<<3) | key_code; + keycount++; + + } + }; + button_cancel.on_select = [&nav](Button&){ nav.pop(); }; +} + +void SetPlayDeadView::focus() { + button_enter.focus(); +} + SetupMenuView::SetupMenuView(NavigationView& nav) { - add_items<3>({ { - { "Date/Time", [&nav](){ nav.push(new SetDateTimeView { nav }); } }, - { "Frequency Correction", [&nav](){ nav.push(new SetFrequencyCorrectionView { nav }); } }, - { "Touch", [&nav](){ nav.push(new SetTouchCalibView { nav }); } }, + add_items<4>({ { + { "Date/Time", ui::Color::white(), [&nav](){ nav.push(new SetDateTimeView { nav }); } }, + { "Frequency correction", ui::Color::white(), [&nav](){ nav.push(new SetFrequencyCorrectionView { nav }); } }, + { "Touch", ui::Color::white(), [&nav](){ nav.push(new SetTouchCalibView { nav }); } }, + { "Play dead", ui::Color::white(), [&nav](){ nav.push(new SetPlayDeadView { nav }); } }, } }); on_left = [&nav](){ nav.pop(); }; } diff --git a/firmware/application/ui_setup.hpp b/firmware/application/ui_setup.hpp index fd8370f7..21bee9a1 100644 --- a/firmware/application/ui_setup.hpp +++ b/firmware/application/ui_setup.hpp @@ -25,6 +25,7 @@ #include "ui_widget.hpp" #include "ui_menu.hpp" #include "ui_navigation.hpp" +#include "portapack_persistent_memory.hpp" #include @@ -190,7 +191,7 @@ private: Text text_firmware { { 0, 128, 240, 16 }, - "Firmware Version git-??????", + "Firmware Version HAVOC 0.10", }; Text text_cpld_hackrf { @@ -237,6 +238,31 @@ private: }; }; +class SetPlayDeadView : public View { +public: + SetPlayDeadView(NavigationView& nav); + void focus() override; +private: + bool entermode = false; + uint32_t sequence = 0; + uint8_t keycount, key_code; + char sequence_txt[11]; + + Text text_sequence { + { 64, 32, 14 * 8, 16 }, + "Enter sequence", + }; + + Button button_enter { + { 16, 192, 96, 24 }, + "Enter" + }; + Button button_cancel { + { 128, 192, 96, 24 }, + "Cancel" + }; +}; + class SetupMenuView : public MenuView { public: SetupMenuView(NavigationView& nav); diff --git a/firmware/baseband/main.cpp b/firmware/baseband/main.cpp index a1e62619..c1e6f275 100755 --- a/firmware/baseband/main.cpp +++ b/firmware/baseband/main.cpp @@ -762,12 +762,6 @@ private: class LCRFSKProcessor : public BasebandProcessor { public: - void BasebandProcessor() { - afsk_samples_per_bit = shared_memory.afsk_samples_per_bit; - phase_inc_mark = shared_memory.afsk_phase_inc_mark; - phase_inc_space = shared_memory.afsk_phase_inc_space; - } - void execute(buffer_c8_t buffer) override { for (size_t i = 0; i= 9) { s = 0; - if (sample_count >= afsk_samples_per_bit) { - cur_byte = shared_memory.lcrdata[byte_pos]; + if (sample_count >= shared_memory.afsk_samples_per_bit) { + if (shared_memory.afsk_transmit_done == false) + cur_byte = shared_memory.lcrdata[byte_pos]; if (!cur_byte) { - bit_pos = 0; - byte_pos = 0; - cur_byte = shared_memory.lcrdata[0]; + if (shared_memory.afsk_repeat) { + shared_memory.afsk_repeat--; + bit_pos = 0; + byte_pos = 0; + cur_byte = shared_memory.lcrdata[0]; + } else { + shared_memory.afsk_transmit_done = true; // TODO: Remove, unused + //shared_memory.application_queue.push(&message); + cur_byte = 0; + } } - cur_byte = (0x55<<1); //DEBUG + //cur_byte = (0x55<<1); //DEBUG //SdddddddpD //0dddddddp1 @@ -808,9 +810,9 @@ public: sample_count++; } if (cur_bit) - aphase += phase_inc_mark; //(353205) + aphase += shared_memory.afsk_phase_inc_mark; //(353205) else - aphase += phase_inc_space; //(647542) + aphase += shared_memory.afsk_phase_inc_space; //(647542) sample = sintab[(aphase & 0x03FF0000)>>16]; } else { @@ -833,8 +835,6 @@ public: } private: - uint32_t afsk_samples_per_bit; - uint32_t phase_inc_mark, phase_inc_space; int8_t re, im; uint8_t s; uint8_t bit_pos, byte_pos; @@ -844,6 +844,7 @@ private: uint32_t sample_count; uint32_t aphase, phase, sphase; int32_t sample, sig, frq; + TXDoneMessage message; }; static BasebandProcessor* baseband_processor { nullptr }; diff --git a/firmware/common/lcd_ili9341.cpp b/firmware/common/lcd_ili9341.cpp index a470d417..6d916e9a 100644 --- a/firmware/common/lcd_ili9341.cpp +++ b/firmware/common/lcd_ili9341.cpp @@ -241,6 +241,11 @@ void ILI9341::fill_rectangle(ui::Rect r, const ui::Color c) { } } +void ILI9341::render_line(const ui::Point p, const uint8_t count, const ui::Color* line_buffer) { + lcd_start_ram_write(p, { count, 1 }); + io.lcd_write_pixels(line_buffer, count); +} + void ILI9341::draw_line(const ui::Point start, const ui::Point end, const ui::Color color) { int x0 = start.x; int y0 = start.y; diff --git a/firmware/common/lcd_ili9341.hpp b/firmware/common/lcd_ili9341.hpp index 415dbd53..ebabc862 100644 --- a/firmware/common/lcd_ili9341.hpp +++ b/firmware/common/lcd_ili9341.hpp @@ -54,6 +54,7 @@ public: ); void draw_pixel(const ui::Point p, const ui::Color color); + void render_line(const ui::Point p, const uint8_t count, const ui::Color* line_buffer); template void draw_pixels( diff --git a/firmware/common/message.hpp b/firmware/common/message.hpp index 2910f80e..0cad72be 100644 --- a/firmware/common/message.hpp +++ b/firmware/common/message.hpp @@ -42,6 +42,7 @@ public: FSKConfiguration = 6, FSKPacket = 7, TestResults = 8, + TXDone = 9, MAX }; @@ -251,6 +252,14 @@ public: FSKPacket packet; }; +class TXDoneMessage : public Message { +public: + TXDoneMessage( + ) : Message { ID::TXDone } + { + } +}; + class MessageHandlerMap { public: using MessageHandler = std::function; diff --git a/firmware/common/portapack_persistent_memory.cpp b/firmware/common/portapack_persistent_memory.cpp index 06f01177..4c133cec 100644 --- a/firmware/common/portapack_persistent_memory.cpp +++ b/firmware/common/portapack_persistent_memory.cpp @@ -55,14 +55,14 @@ using ppb_range_t = range_t; constexpr ppb_range_t ppb_range { -99000, 99000 }; constexpr ppb_t ppb_reset_value { 0 }; -using afsk_freq_range_t = range_t; -constexpr afsk_freq_range_t afsk_freq_range { 100, 32000 }; -constexpr int16_t afsk_mark_reset_value { 1200 }; -constexpr int16_t afsk_space_reset_value { 2200 }; +using afsk_freq_range_t = range_t; +constexpr afsk_freq_range_t afsk_freq_range { 1, 60 }; +constexpr int32_t afsk_mark_reset_value { 12 }; +constexpr int32_t afsk_space_reset_value { 22 }; -using afsk_bitrate_range_t = range_t; +using afsk_bitrate_range_t = range_t; constexpr afsk_bitrate_range_t afsk_bitrate_range { 600, 9600 }; -constexpr int16_t afsk_bitrate_reset_value { 1200 }; +constexpr int32_t afsk_bitrate_reset_value { 1200 }; /* struct must pack the same way on M4 and M0 cores. */ struct data_t { @@ -71,10 +71,14 @@ struct data_t { int32_t correction_ppb; // AFSK modem - int16_t afsk_mark_freq; - int16_t afsk_space_freq; - int16_t afsk_bitrate; + int32_t afsk_mark_freq; + int32_t afsk_space_freq; + int32_t afsk_bitrate; uint8_t afsk_config; + + // Play dead unlock + bool playing_dead; + uint32_t playdead_sequence; }; static_assert(sizeof(data_t) <= 0x100, "Persistent memory structure too large for VBAT-maintained region"); @@ -99,30 +103,30 @@ void set_correction_ppb(const ppb_t new_value) { data->correction_ppb = ppb_range.clip(new_value); } -int16_t afsk_mark_freq() { +int32_t afsk_mark_freq() { afsk_freq_range.reset_if_outside(data->afsk_mark_freq, afsk_mark_reset_value); - return data->correction_ppb; + return data->afsk_mark_freq; } -void set_afsk_mark(const int16_t new_value) { +void set_afsk_mark(const int32_t new_value) { data->afsk_mark_freq = afsk_freq_range.clip(new_value); } -int16_t afsk_space_freq() { +int32_t afsk_space_freq() { afsk_freq_range.reset_if_outside(data->afsk_space_freq, afsk_space_reset_value); - return data->correction_ppb; + return data->afsk_space_freq; } -void set_afsk_space(const int16_t new_value) { +void set_afsk_space(const int32_t new_value) { data->afsk_space_freq = afsk_freq_range.clip(new_value); } -int16_t afsk_bitrate() { +int32_t afsk_bitrate() { afsk_bitrate_range.reset_if_outside(data->afsk_bitrate, afsk_bitrate_reset_value); - return data->correction_ppb; + return data->afsk_bitrate; } -void set_afsk_bitrate(const int16_t new_value) { +void set_afsk_bitrate(const int32_t new_value) { data->afsk_bitrate = afsk_bitrate_range.clip(new_value); } @@ -134,5 +138,21 @@ void set_afsk_config(const uint8_t new_value) { data->afsk_config = new_value; } +bool playing_dead() { + return data->playing_dead; +} + +void set_playing_dead(const bool new_value) { + data->playing_dead = new_value; +} + +uint32_t playdead_sequence() { + return data->playdead_sequence; +} + +void set_playdead_sequence(const uint32_t new_value) { + data->playdead_sequence = new_value; +} + } /* namespace persistent_memory */ } /* namespace portapack */ diff --git a/firmware/common/portapack_persistent_memory.hpp b/firmware/common/portapack_persistent_memory.hpp index 947947cc..08aabe06 100644 --- a/firmware/common/portapack_persistent_memory.hpp +++ b/firmware/common/portapack_persistent_memory.hpp @@ -37,18 +37,24 @@ void set_tuned_frequency(const rf::Frequency new_value); ppb_t correction_ppb(); void set_correction_ppb(const ppb_t new_value); -int16_t afsk_mark_freq(); -void set_afsk_mark(const int16_t new_value); +int32_t afsk_mark_freq(); +void set_afsk_mark(const int32_t new_value); -int16_t afsk_space_freq(); -void set_afsk_space(const int16_t new_value); +int32_t afsk_space_freq(); +void set_afsk_space(const int32_t new_value); -int16_t afsk_bitrate(); -void set_afsk_bitrate(const int16_t new_value); +int32_t afsk_bitrate(); +void set_afsk_bitrate(const int32_t new_value); uint8_t afsk_config(); void set_afsk_config(const uint8_t new_value); +bool playing_dead(); +void set_playing_dead(const bool new_value); + +uint32_t playdead_sequence(); +void set_playdead_sequence(const uint32_t new_value); + } /* namespace persistent_memory */ } /* namespace portapack */ diff --git a/firmware/common/portapack_shared_memory.hpp b/firmware/common/portapack_shared_memory.hpp index 289cbf30..1d387f13 100644 --- a/firmware/common/portapack_shared_memory.hpp +++ b/firmware/common/portapack_shared_memory.hpp @@ -47,6 +47,8 @@ struct SharedMemory { uint32_t afsk_samples_per_bit; uint32_t afsk_phase_inc_mark; uint32_t afsk_phase_inc_space; + uint8_t afsk_repeat; + bool afsk_transmit_done; }; extern SharedMemory& shared_memory; diff --git a/firmware/common/ui_widget.cpp b/firmware/common/ui_widget.cpp index 83b7e705..a193e9a1 100644 --- a/firmware/common/ui_widget.cpp +++ b/firmware/common/ui_widget.cpp @@ -401,6 +401,11 @@ bool Button::on_key(const KeyEvent key) { on_select(*this); return true; } + } else { + if( on_dir ) { + on_dir(*this, key); + return false; + } } return false; diff --git a/firmware/common/ui_widget.hpp b/firmware/common/ui_widget.hpp index c5293cdb..341aa0c8 100644 --- a/firmware/common/ui_widget.hpp +++ b/firmware/common/ui_widget.hpp @@ -212,6 +212,7 @@ private: class Button : public Widget { public: std::function on_select; + std::function on_dir; Button( Rect parent_rect,