From 928856567670d123b88b458f450bae0051deecb7 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sun, 1 Mar 2026 22:06:01 +0100 Subject: [PATCH 001/295] Qt: properly handle cancel of pkg install dialog --- rpcs3/rpcs3qt/main_window.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/rpcs3/rpcs3qt/main_window.cpp b/rpcs3/rpcs3qt/main_window.cpp index 56e125ab11..687358d625 100644 --- a/rpcs3/rpcs3qt/main_window.cpp +++ b/rpcs3/rpcs3qt/main_window.cpp @@ -938,13 +938,20 @@ bool main_window::HandlePackageInstallation(QStringList file_paths, bool from_bo bool precompile_caches = false; bool create_desktop_shortcuts = false; bool create_app_shortcut = false; + bool canceled = false; game_compatibility* compat = m_game_list_frame ? m_game_list_frame->GetGameCompatibility() : nullptr; // Let the user choose the packages to install and select the order in which they shall be installed. pkg_install_dialog dlg(file_paths, compat, this); - connect(&dlg, &QDialog::accepted, this, [&]() + connect(&dlg, &QDialog::finished, this, [&](int result) { + if (result != QDialog::Accepted) + { + canceled = true; + return; + } + packages = dlg.get_paths_to_install(); precompile_caches = dlg.precompile_caches(); create_desktop_shortcuts = dlg.create_desktop_shortcuts(); @@ -952,6 +959,11 @@ bool main_window::HandlePackageInstallation(QStringList file_paths, bool from_bo }); dlg.exec(); + if (canceled) + { + return false; + } + if (!from_boot) { if (!m_gui_settings->GetBootConfirmation(this)) From 595e42c4f3bfa11b8585ea029e1aa9d2c9c68fd1 Mon Sep 17 00:00:00 2001 From: AniLeo Date: Sun, 1 Mar 2026 12:33:42 +0100 Subject: [PATCH 002/295] rpcs3_version: Bump to 0.0.40 --- rpcs3/rpcs3_version.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpcs3/rpcs3_version.cpp b/rpcs3/rpcs3_version.cpp index 19d107e582..6eb904222f 100644 --- a/rpcs3/rpcs3_version.cpp +++ b/rpcs3/rpcs3_version.cpp @@ -26,7 +26,7 @@ namespace rpcs3 const utils::version& get_version() { - static constexpr utils::version version{ 0, 0, 39, utils::version_type::alpha, 1, RPCS3_GIT_VERSION }; + static constexpr utils::version version{ 0, 0, 40, utils::version_type::alpha, 1, RPCS3_GIT_VERSION }; return version; } From e66f1fa3066f99d816fb950aad77d6fc57d0f1c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20D=C3=ADaz=20=C3=81lvarez?= Date: Tue, 3 Mar 2026 21:41:51 +0100 Subject: [PATCH 003/295] Solves render problems due to vertex data being modified before reuse * Stores first 64bit of the vertex data to compare on retrieval as a fingerprint of if the underlying vertex data has been changed --- rpcs3/Emu/RSX/rsx_cache.h | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/rpcs3/Emu/RSX/rsx_cache.h b/rpcs3/Emu/RSX/rsx_cache.h index b219745f6a..c73e3c2d11 100644 --- a/rpcs3/Emu/RSX/rsx_cache.h +++ b/rpcs3/Emu/RSX/rsx_cache.h @@ -7,6 +7,7 @@ #include "Common/unordered_map.hpp" #include "Emu/System.h" #include "Emu/cache_utils.hpp" +#include "Emu/Memory/vm.h" #include "Emu/RSX/Program/RSXVertexProgram.h" #include "Emu/RSX/Program/RSXFragmentProgram.h" #include "Overlays/Shaders/shader_loading_dialog.h" @@ -478,6 +479,7 @@ namespace rsx uptr local_address; u32 offset_in_heap; u32 data_length; + u64 fingerprint; }; // A weak vertex cache with no data checks or memory range locks @@ -502,11 +504,19 @@ namespace rsx { const auto key = hash(local_addr, data_length); const auto found = vertex_ranges.find(key); + if (found == vertex_ranges.end()) { return nullptr; } + // Check if data in local_address changed vs what was stored in the vertex_cache + if (auto sudo_ptr = vm::get_super_ptr(local_addr); + data_length >= 8 && found->second.fingerprint != *utils::bless(sudo_ptr)) + { + vertex_ranges.erase(key); + return nullptr; + } return std::addressof(found->second); } @@ -516,7 +526,15 @@ namespace rsx v.data_length = data_length; v.local_address = local_addr; v.offset_in_heap = offset_in_heap; + v.fingerprint = 0; + if (data_length >= 8) + { + // Uses get_super_ptr to access vm memory safely + // and bless to avoid endian conversion and circumvent compiler strict aliasing rules. + auto sudo_ptr = vm::get_super_ptr(local_addr); + v.fingerprint = *utils::bless(sudo_ptr); + } const auto key = hash(local_addr, data_length); vertex_ranges[key] = v; } From 11a9011510e8b6c256a86f057764c929afd99a5b Mon Sep 17 00:00:00 2001 From: kd-11 Date: Wed, 4 Mar 2026 02:54:42 +0300 Subject: [PATCH 004/295] rsx: Fix memory misalignment for temporary storage - We create the temp storage with alignment of U but then do a type cast to u128 later. This obviously causes problems. --- rpcs3/Emu/RSX/Common/TextureUtils.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpcs3/Emu/RSX/Common/TextureUtils.cpp b/rpcs3/Emu/RSX/Common/TextureUtils.cpp index 937508035b..8cf3466bb9 100644 --- a/rpcs3/Emu/RSX/Common/TextureUtils.cpp +++ b/rpcs3/Emu/RSX/Common/TextureUtils.cpp @@ -244,7 +244,7 @@ struct copy_unmodified_block_swizzled } const u32 size_in_block = padded_width * padded_height * depth * 2; - rsx::simple_array tmp(size_in_block * words_per_block); + rsx::simple_array tmp(size_in_block * words_per_block); if (words_per_block == 1) [[likely]] { From 86b2773c2854ede00ff376d1ee82898c74eb8b71 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Wed, 4 Mar 2026 02:56:12 +0300 Subject: [PATCH 005/295] rsx: Clean up after vertex cache changes --- rpcs3/Emu/RSX/rsx_cache.h | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/rpcs3/Emu/RSX/rsx_cache.h b/rpcs3/Emu/RSX/rsx_cache.h index c73e3c2d11..625311fc11 100644 --- a/rpcs3/Emu/RSX/rsx_cache.h +++ b/rpcs3/Emu/RSX/rsx_cache.h @@ -517,6 +517,7 @@ namespace rsx vertex_ranges.erase(key); return nullptr; } + return std::addressof(found->second); } @@ -526,15 +527,12 @@ namespace rsx v.data_length = data_length; v.local_address = local_addr; v.offset_in_heap = offset_in_heap; - v.fingerprint = 0; - if (data_length >= 8) + if (auto sudo_ptr = vm::get_super_ptr(local_addr); data_length >= 8) { - // Uses get_super_ptr to access vm memory safely - // and bless to avoid endian conversion and circumvent compiler strict aliasing rules. - auto sudo_ptr = vm::get_super_ptr(local_addr); v.fingerprint = *utils::bless(sudo_ptr); } + const auto key = hash(local_addr, data_length); vertex_ranges[key] = v; } From 3750fb2c1f1ff5ccd4996ef42cdf8b16119666c3 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Wed, 4 Mar 2026 08:37:26 +0100 Subject: [PATCH 006/295] cellGem: Fix deadlock when cellGemUpdateStart is called before cellCamera delivers images --- rpcs3/Emu/Cell/Modules/cellGem.cpp | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/cellGem.cpp b/rpcs3/Emu/Cell/Modules/cellGem.cpp index 3c7b299af7..1a1e8a7d04 100644 --- a/rpcs3/Emu/Cell/Modules/cellGem.cpp +++ b/rpcs3/Emu/Cell/Modules/cellGem.cpp @@ -1616,6 +1616,7 @@ public: } m_tracker.set_image_data(m_camera_info.buffer.get_ptr(), m_camera_info.bytesize, m_camera_info.width, m_camera_info.height, m_camera_info.format); + m_framenumber++; // using framenumber instead of timestamp since the timestamp could be identical return true; } @@ -1648,6 +1649,7 @@ public: } auto& gem = g_fxo->get(); + u64 last_framenumber = 0; while (thread_ctrl::state() != thread_state::aborting) { @@ -1663,6 +1665,13 @@ public: } } + if (std::exchange(last_framenumber, m_framenumber.load()) == last_framenumber) + { + cellGem.warning("Tracker woke up without new frame. Skipping processing (framenumber=%d)", last_framenumber); + tracker_done(); + continue; + } + m_busy.release(true); // Update PS Move LED colors @@ -1754,6 +1763,7 @@ public: private: atomic_t m_wake_up_tracker = 0; atomic_t m_tracker_done = 0; + atomic_t m_framenumber = 0; atomic_t m_busy = false; ps_move_tracker m_tracker{}; CellCameraInfoEx m_camera_info{}; @@ -3876,13 +3886,15 @@ error_code cellGemUpdateStart(vm::cptr camera_frame, u64 timestamp) gem.camera_frame = camera_frame.addr(); - if (!tracker.set_image(gem.camera_frame)) + const bool image_set = tracker.set_image(gem.camera_frame); + + tracker.wake_up_tracker(); + + if (!image_set) { return not_an_error(CELL_GEM_NO_VIDEO); } - tracker.wake_up_tracker(); - return CELL_OK; } From d46ddcee5d8db68d7f856c5e7015bffc651b419f Mon Sep 17 00:00:00 2001 From: RipleyTom Date: Wed, 4 Mar 2026 01:29:10 +0100 Subject: [PATCH 007/295] Fix mac build --- .ci/build-mac.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ci/build-mac.sh b/.ci/build-mac.sh index 2f43e05e74..300f69cb06 100755 --- a/.ci/build-mac.sh +++ b/.ci/build-mac.sh @@ -17,7 +17,7 @@ brew install -f --overwrite --quiet ccache "llvm@$LLVM_COMPILER_VER" brew link -f --overwrite --quiet "llvm@$LLVM_COMPILER_VER" if [ "$AARCH64" -eq 1 ]; then brew install -f --overwrite --quiet googletest opencv@4 sdl3 vulkan-headers vulkan-loader molten-vk - brew unlink --quiet ffmpeg fmt qtbase qtsvg qtdeclarative protobuf + brew unlink --quiet ffmpeg fmt qtbase qtsvg qtdeclarative else arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" arch -x86_64 /usr/local/bin/brew install -f --overwrite --quiet python@3.14 opencv@4 "llvm@$LLVM_COMPILER_VER" sdl3 vulkan-headers vulkan-loader molten-vk From 5605cf21413be189ca8e2ab866c3ad537b5e79ca Mon Sep 17 00:00:00 2001 From: Megamouse Date: Thu, 5 Mar 2026 15:32:14 +0100 Subject: [PATCH 008/295] Qt: Do not check return code of rpcs3 download --- rpcs3/rpcs3qt/downloader.cpp | 4 ++-- rpcs3/rpcs3qt/downloader.h | 2 +- rpcs3/rpcs3qt/game_compatibility.cpp | 14 +++++++------- rpcs3/rpcs3qt/game_compatibility.h | 2 +- rpcs3/rpcs3qt/patch_manager_dialog.cpp | 2 +- rpcs3/rpcs3qt/update_manager.cpp | 4 ++-- 6 files changed, 14 insertions(+), 14 deletions(-) diff --git a/rpcs3/rpcs3qt/downloader.cpp b/rpcs3/rpcs3qt/downloader.cpp index 39078c880d..65f481bff8 100644 --- a/rpcs3/rpcs3qt/downloader.cpp +++ b/rpcs3/rpcs3qt/downloader.cpp @@ -34,7 +34,7 @@ downloader::~downloader() } } -void downloader::start(const std::string& url, bool follow_location, bool show_progress_dialog, const QString& progress_dialog_title, bool keep_progress_dialog_open, int expected_size, bool check_return_code, bool again) +void downloader::start(const std::string& url, bool follow_location, bool show_progress_dialog, bool check_return_code, const QString& progress_dialog_title, bool keep_progress_dialog_open, int expected_size, bool again) { network_log.notice("Starting download from URL: %s", url); @@ -121,7 +121,7 @@ void downloader::start(const std::string& url, bool follow_location, bool show_p { network_log.error("Error during download. Trying to download again (attempts=%d, return_code=%d)", m_download_attempts, return_code); std::this_thread::sleep_for(500ms); // Wait for a little while - start(url, follow_location, show_progress_dialog, progress_dialog_title, keep_progress_dialog_open, expected_size, check_return_code, true); + start(url, follow_location, show_progress_dialog, check_return_code, progress_dialog_title, keep_progress_dialog_open, expected_size, true); return; } } diff --git a/rpcs3/rpcs3qt/downloader.h b/rpcs3/rpcs3qt/downloader.h index be0cd0e568..35c2d5533e 100644 --- a/rpcs3/rpcs3qt/downloader.h +++ b/rpcs3/rpcs3qt/downloader.h @@ -21,7 +21,7 @@ public: explicit downloader(QWidget* parent = nullptr); ~downloader(); - void start(const std::string& url, bool follow_location, bool show_progress_dialog, const QString& progress_dialog_title = "", bool keep_progress_dialog_open = false, int expected_size = -1, bool check_return_code = true, bool again = false); + void start(const std::string& url, bool follow_location, bool show_progress_dialog, bool check_return_code, const QString& progress_dialog_title = "", bool keep_progress_dialog_open = false, int expected_size = -1, bool again = false); usz update_buffer(char* data, usz size); void update_progress_dialog(const QString& title) const; diff --git a/rpcs3/rpcs3qt/game_compatibility.cpp b/rpcs3/rpcs3qt/game_compatibility.cpp index b9cb32a7c1..a7a4a4bc34 100644 --- a/rpcs3/rpcs3qt/game_compatibility.cpp +++ b/rpcs3/rpcs3qt/game_compatibility.cpp @@ -36,7 +36,7 @@ void game_compatibility::handle_download_finished(const QByteArray& content) compat_log.notice("Database download finished"); // Create new map from database and write database to file if database was valid - if (ReadJSON(QJsonDocument::fromJson(content).object(), true)) + if (handle_json(content, true)) { // Write database to file QFile file(m_filepath); @@ -67,8 +67,9 @@ void game_compatibility::handle_download_canceled() Q_EMIT DownloadCanceled(); } -bool game_compatibility::ReadJSON(const QJsonObject& json_data, bool after_download) +bool game_compatibility::handle_json(const QByteArray& data, bool after_download) { + const QJsonObject json_data = QJsonDocument::fromJson(data).object(); const int return_code = json_data["return_code"].toInt(-255); if (return_code < 0) @@ -101,7 +102,7 @@ bool game_compatibility::ReadJSON(const QJsonObject& json_data, bool after_downl m_compat_database.clear(); - QJsonObject json_results = json_data["results"].toObject(); + const QJsonObject json_results = json_data["results"].toObject(); // Retrieve status data for every valid entry for (const auto& key : json_results.keys()) @@ -112,7 +113,7 @@ bool game_compatibility::ReadJSON(const QJsonObject& json_data, bool after_downl continue; } - QJsonObject json_result = json_results[key].toObject(); + const QJsonObject json_result = json_results[key].toObject(); // Retrieve compatibility information from json compat::status status = ::at32(Status_Data, json_result.value("status").toString("NoResult")); @@ -210,15 +211,14 @@ void game_compatibility::RequestCompatibility(bool online) compat_log.notice("Finished reading database from file: %s", m_filepath); // Create new map from database - ReadJSON(QJsonDocument::fromJson(content).object(), online); - + handle_json(content, online); return; } const std::string url = "https://rpcs3.net/compatibility?api=v1&export"; compat_log.notice("Beginning compatibility database download from: %s", url); - m_downloader->start(url, true, true, tr("Downloading Database")); + m_downloader->start(url, true, true, true, tr("Downloading Database")); // We want to retrieve a new database, therefore refresh gamelist and indicate that Q_EMIT DownloadStarted(); diff --git a/rpcs3/rpcs3qt/game_compatibility.h b/rpcs3/rpcs3qt/game_compatibility.h index 664bafea34..8dc1ce5aa5 100644 --- a/rpcs3/rpcs3qt/game_compatibility.h +++ b/rpcs3/rpcs3qt/game_compatibility.h @@ -138,7 +138,7 @@ private: std::map m_compat_database; /** Creates new map from the database */ - bool ReadJSON(const QJsonObject& json_data, bool after_download); + bool handle_json(const QByteArray& data, bool after_download); public: /** Handles reads, writes and downloads for the compatibility database */ diff --git a/rpcs3/rpcs3qt/patch_manager_dialog.cpp b/rpcs3/rpcs3qt/patch_manager_dialog.cpp index a41d8ed7b5..2e9d980d20 100644 --- a/rpcs3/rpcs3qt/patch_manager_dialog.cpp +++ b/rpcs3/rpcs3qt/patch_manager_dialog.cpp @@ -1163,7 +1163,7 @@ void patch_manager_dialog::download_update(bool automatic, bool auto_accept) } } - m_downloader->start(url, true, !m_download_automatic, tr("Downloading latest patches")); + m_downloader->start(url, true, !m_download_automatic, true, tr("Downloading latest patches")); } bool patch_manager_dialog::handle_json(const QByteArray& data) diff --git a/rpcs3/rpcs3qt/update_manager.cpp b/rpcs3/rpcs3qt/update_manager.cpp index ec4d7ce44f..d32a1810b9 100644 --- a/rpcs3/rpcs3qt/update_manager.cpp +++ b/rpcs3/rpcs3qt/update_manager.cpp @@ -110,7 +110,7 @@ void update_manager::check_for_updates(bool automatic, bool check_only, bool aut const std::string url = fmt::format("https://update.rpcs3.net/?api=v3&c=%s&os_type=%s&os_arch=%s&os_version=%i.%i.%i", rpcs3::get_commit_and_hash().second, os.type, os.arch, os.version_major, os.version_minor, os.version_patch); - m_downloader->start(url, true, !automatic, tr("Checking For Updates"), true); + m_downloader->start(url, true, !automatic, true, tr("Checking For Updates"), true); } bool update_manager::handle_json(bool automatic, bool check_only, bool auto_accept, const QByteArray& data) @@ -440,7 +440,7 @@ void update_manager::update(bool auto_accept) }); update_log.notice("Downloading update..."); - m_downloader->start(m_request_url, true, true, tr("Downloading Update"), true, m_expected_size); + m_downloader->start(m_request_url, true, true, false, tr("Downloading Update"), true, m_expected_size); } bool update_manager::handle_rpcs3(const QByteArray& data, bool auto_accept) From ae6172d86bc79a63af0533c870e13d6702ad2343 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sun, 1 Mar 2026 11:39:52 +0100 Subject: [PATCH 009/295] Remove unused function --- rpcs3/Emu/Io/LogitechG27.cpp | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/rpcs3/Emu/Io/LogitechG27.cpp b/rpcs3/Emu/Io/LogitechG27.cpp index 1f02c92d59..7ae996c864 100644 --- a/rpcs3/Emu/Io/LogitechG27.cpp +++ b/rpcs3/Emu/Io/LogitechG27.cpp @@ -945,17 +945,6 @@ static u8 sdl_to_logitech_g27_pedal(std::map>& j return unsigned_avg * 0xFF / 0xFFFF; } -static inline void set_bit(u8* buf, int bit_num, bool set) -{ - const int byte_num = bit_num / 8; - bit_num %= 8; - const u8 mask = 1 << bit_num; - if (set) - buf[byte_num] = buf[byte_num] | mask; - else - buf[byte_num] = buf[byte_num] & (~mask); -} - void usb_device_logitech_g27::transfer_dfex(u32 buf_size, u8* buf, UsbTransfer* transfer) { DFEX_data data{}; From ec00a06cafceb5849633f4c5f501e975d0f4cc24 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sun, 1 Mar 2026 11:41:22 +0100 Subject: [PATCH 010/295] Fix warning suppression in windows clang --- Utilities/StrFmt.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Utilities/StrFmt.cpp b/Utilities/StrFmt.cpp index 4431769f3a..d68ef51cb5 100644 --- a/Utilities/StrFmt.cpp +++ b/Utilities/StrFmt.cpp @@ -16,12 +16,12 @@ #include #endif -#ifdef _MSC_VER -#pragma warning(push) -#pragma warning(disable : 4996) -#elif defined(__clang__) +#ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecated-declarations" +#elif defined(_MSC_VER) +#pragma warning(push) +#pragma warning(disable : 4996) #else #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wdeprecated-declarations" From f2c8b157ef048f57570861d305d2fa8ead03fc92 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sun, 1 Mar 2026 11:41:56 +0100 Subject: [PATCH 011/295] ISO: pass mode to file --- rpcs3/Loader/ISO.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpcs3/Loader/ISO.cpp b/rpcs3/Loader/ISO.cpp index e46a1a6b82..af2d18ff7d 100644 --- a/rpcs3/Loader/ISO.cpp +++ b/rpcs3/Loader/ISO.cpp @@ -569,7 +569,7 @@ std::unique_ptr iso_device::open(const std::string& path, bs_t(fs::file(iso_path), *node); + return std::make_unique(fs::file(iso_path, mode), *node); } std::unique_ptr iso_device::open_dir(const std::string& path) From 2a292d1e2e4541162a1b85efa28500f6de2c9b98 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sun, 1 Mar 2026 11:42:29 +0100 Subject: [PATCH 012/295] rsx: fix unused parameter warning --- rpcs3/Emu/RSX/NV47/HW/nv4097.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpcs3/Emu/RSX/NV47/HW/nv4097.cpp b/rpcs3/Emu/RSX/NV47/HW/nv4097.cpp index 17ee040f8c..43c8a5d9f4 100644 --- a/rpcs3/Emu/RSX/NV47/HW/nv4097.cpp +++ b/rpcs3/Emu/RSX/NV47/HW/nv4097.cpp @@ -306,7 +306,7 @@ namespace rsx REGS(ctx)->decode(reg, REGS(ctx)->latch); } - void set_aa_control(context* ctx, u32 reg, u32 arg) + void set_aa_control(context* ctx, u32 /*reg*/, u32 arg) { const auto latch = REGS(ctx)->latch; if (arg == latch) From c57d6110c4c503e8145c9d18e38042d275cd6995 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sun, 1 Mar 2026 11:42:51 +0100 Subject: [PATCH 013/295] rsx: add missing default to switch --- rpcs3/Emu/RSX/Program/ProgramStateCache.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rpcs3/Emu/RSX/Program/ProgramStateCache.cpp b/rpcs3/Emu/RSX/Program/ProgramStateCache.cpp index 4420e51555..528b5c6316 100644 --- a/rpcs3/Emu/RSX/Program/ProgramStateCache.cpp +++ b/rpcs3/Emu/RSX/Program/ProgramStateCache.cpp @@ -675,6 +675,8 @@ fragment_program_utils::fragment_program_metadata fragment_program_utils::analys // Otherwise we would need to follow the execution chain result.has_branch_instructions = true; break; + default: + break; } if (rsx::assembler::FP::get_operand_count(opcode) > 0 && From 2f9f79eea2673aaafb5ff91e4d294777906d629b Mon Sep 17 00:00:00 2001 From: RipleyTom Date: Fri, 6 Mar 2026 08:06:29 +0100 Subject: [PATCH 014/295] PPU Fixes -CallFunction empty function/jump elision was never gone through as cond was always false -MSelf duplicate offset detection never triggered because set was reset each loop -Rel executable memory size calculation used wrong section type --- rpcs3/Emu/Cell/PPUModule.cpp | 6 +++--- rpcs3/Emu/Cell/PPUThread.cpp | 4 ++-- rpcs3/Emu/Cell/PPUTranslator.cpp | 5 ++--- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/rpcs3/Emu/Cell/PPUModule.cpp b/rpcs3/Emu/Cell/PPUModule.cpp index b298539519..e95a1542d8 100644 --- a/rpcs3/Emu/Cell/PPUModule.cpp +++ b/rpcs3/Emu/Cell/PPUModule.cpp @@ -1004,7 +1004,7 @@ static import_result_t ppu_load_imports(const ppu_module& _module, std: // Check address // TODO: The address of use should be extracted from analyser instead - if (fstub && fstub >= _module.segs[0].addr && fstub <= _module.segs[0].addr + _module.segs[0].size) + if (fstub && fstub >= _module.segs[0].addr && fstub < _module.segs[0].addr + _module.segs[0].size) { nid_to_use_addr.emplace(fnid, fstub); } @@ -1895,7 +1895,7 @@ shared_ptr ppu_load_prx(const ppu_prx_object& elf, bool virtual_load, c } else { - ppu_loader.error("Library %s: PRX library info not found"); + ppu_loader.error("Library: PRX library info not found"); } prx->start.set(prx->specials[0xbc9a0086]); @@ -3192,7 +3192,7 @@ bool ppu_load_rel_exec(const ppu_rel_object& elf) for (const auto& s : elf.shdrs) { - if (s.sh_type != sec_type::sht_progbits) + if (s.sh_type == sec_type::sht_progbits) { memsize = utils::align(memsize + vm::cast(s.sh_size), 128); } diff --git a/rpcs3/Emu/Cell/PPUThread.cpp b/rpcs3/Emu/Cell/PPUThread.cpp index a9bef5e640..4d690b344d 100644 --- a/rpcs3/Emu/Cell/PPUThread.cpp +++ b/rpcs3/Emu/Cell/PPUThread.cpp @@ -3867,12 +3867,12 @@ extern void ppu_precompile(std::vector& dir_queue, std::vector offs; + for (u32 j = 0; j < hdr.count; j++) { mself_record rec{}; - std::set offs; - if (mself.read(rec) && rec.get_pos(mself.size())) { if (rec.size <= 0x20) diff --git a/rpcs3/Emu/Cell/PPUTranslator.cpp b/rpcs3/Emu/Cell/PPUTranslator.cpp index 70d34aa775..1c9f6e2b9d 100644 --- a/rpcs3/Emu/Cell/PPUTranslator.cpp +++ b/rpcs3/Emu/Cell/PPUTranslator.cpp @@ -550,11 +550,10 @@ void PPUTranslator::CallFunction(u64 target, Value* indirect) else if (_target >= caddr && _target <= cend) { u32 target_last = static_cast(_target); - std::unordered_set passed_targets{target_last}; // Try to follow unconditional branches as long as there is no infinite loop - while (target_last != _target) + while (true) { const ppu_opcode_t op{*ensure(m_info.get_ptr(target_last))}; const ppu_itype::type itype = g_ppu_itype.decode(op.opcode); @@ -1304,7 +1303,7 @@ void PPUTranslator::VMADDFP(ppu_opcode_t op) if (!m_use_fma && data == v128{}) { set_vr(op.vd, vec_handle_result(a * c + fsplat(0.f))); - ppu_log.notice("LLVM: VMADDFP with -0 addend at [0x%08x]", m_addr + (m_reloc ? m_reloc->addr : 0)); + ppu_log.notice("LLVM: VMADDFP with +0 addend at [0x%08x]", m_addr + (m_reloc ? m_reloc->addr : 0)); return; } } From cf5eb22591f9443eb97c0537eeaf588801afd3f6 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Thu, 5 Mar 2026 02:33:25 +0300 Subject: [PATCH 015/295] glutils: Extend buffer_object interface --- rpcs3/Emu/RSX/GL/glutils/buffer_object.cpp | 5 +++++ rpcs3/Emu/RSX/GL/glutils/buffer_object.h | 7 ++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/rpcs3/Emu/RSX/GL/glutils/buffer_object.cpp b/rpcs3/Emu/RSX/GL/glutils/buffer_object.cpp index 5c1f0d0447..f3849718d0 100644 --- a/rpcs3/Emu/RSX/GL/glutils/buffer_object.cpp +++ b/rpcs3/Emu/RSX/GL/glutils/buffer_object.cpp @@ -131,6 +131,11 @@ namespace gl DSA_CALL2(NamedBufferSubData, m_id, offset, length, data); } + void buffer::fill(GLsizeiptr offset, GLsizeiptr length, GLuint pattern) + { + DSA_CALL2(ClearNamedBufferSubData, m_id, GL_R32UI, offset, length, GL_RED, GL_UNSIGNED_INT, &pattern); + } + GLubyte* buffer::map(GLsizeiptr offset, GLsizeiptr length, access access_) { ensure(m_memory_type == memory_type::host_visible); diff --git a/rpcs3/Emu/RSX/GL/glutils/buffer_object.h b/rpcs3/Emu/RSX/GL/glutils/buffer_object.h index dccb2a314e..28730bdd0d 100644 --- a/rpcs3/Emu/RSX/GL/glutils/buffer_object.h +++ b/rpcs3/Emu/RSX/GL/glutils/buffer_object.h @@ -15,7 +15,9 @@ namespace gl element_array = GL_ELEMENT_ARRAY_BUFFER, uniform = GL_UNIFORM_BUFFER, texture = GL_TEXTURE_BUFFER, - ssbo = GL_SHADER_STORAGE_BUFFER + ssbo = GL_SHADER_STORAGE_BUFFER, + copy_src = GL_COPY_READ_BUFFER, + copy_dst = GL_COPY_WRITE_BUFFER }; enum class access @@ -65,6 +67,8 @@ namespace gl case target::uniform: pname = GL_UNIFORM_BUFFER_BINDING; break; case target::texture: pname = GL_TEXTURE_BUFFER_BINDING; break; case target::ssbo: pname = GL_SHADER_STORAGE_BUFFER_BINDING; break; + case target::copy_src: pname = GL_COPY_READ_BUFFER_BINDING; break; + case target::copy_dst: pname = GL_COPY_WRITE_BUFFER_BINDING; break; default: fmt::throw_exception("Invalid binding state target (0x%x)", static_cast(target_)); } @@ -113,6 +117,7 @@ namespace gl void data(GLsizeiptr size, const void* data_ = nullptr, GLenum usage = GL_STREAM_DRAW); void sub_data(GLsizeiptr offset, GLsizeiptr length, const GLvoid* data); + void fill(GLsizeiptr offset, GLsizeiptr length, GLuint pattern); GLubyte* map(GLsizeiptr offset, GLsizeiptr length, access access_); void unmap(); From a1af15b907a27bc12c6459801cf3d3514f39fb42 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Thu, 5 Mar 2026 02:33:47 +0300 Subject: [PATCH 016/295] gl/dma: Fix range calculation when creating DMA blocks --- rpcs3/Emu/RSX/GL/GLDMA.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/GLDMA.cpp b/rpcs3/Emu/RSX/GL/GLDMA.cpp index 3c12009f67..5e60525a5c 100644 --- a/rpcs3/Emu/RSX/GL/GLDMA.cpp +++ b/rpcs3/Emu/RSX/GL/GLDMA.cpp @@ -22,7 +22,7 @@ namespace gl void* userptr = vm::get_super_ptr(base_address); m_data = std::make_unique(); - m_data->create(buffer::target::array, block_size, userptr, buffer::memory_type::userptr, 0); + m_data->create(buffer::target::copy_dst, block_size, userptr, buffer::memory_type::userptr, 0); m_base_address = base_address; // Some drivers may reject userptr input for whatever reason. Check that the state is still valid. @@ -77,7 +77,7 @@ namespace gl { const auto start_block_address = start & s_dma_block_mask; const auto end_block_address = (start + length + s_dma_block_size - 1) & s_dma_block_mask; - return utils::address_range32::start_end(start_block_address, end_block_address); + return utils::address_range32::start_length(start_block_address, end_block_address - start_block_address); } const dma_block& get_block(u32 start, u32 length) From d75e8b24f7f4726656c77467110273588d99fa4e Mon Sep 17 00:00:00 2001 From: kd-11 Date: Thu, 5 Mar 2026 02:34:04 +0300 Subject: [PATCH 017/295] [FIXUP] API extend --- rpcs3/Emu/RSX/GL/GLProcTable.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/rpcs3/Emu/RSX/GL/GLProcTable.h b/rpcs3/Emu/RSX/GL/GLProcTable.h index 8f42995a9d..5278014b5c 100644 --- a/rpcs3/Emu/RSX/GL/GLProcTable.h +++ b/rpcs3/Emu/RSX/GL/GLProcTable.h @@ -218,6 +218,9 @@ OPENGL_PROC(PFNGLNAMEDBUFFERDATAEXTPROC, NamedBufferDataEXT); OPENGL_PROC(PFNGLNAMEDBUFFERSUBDATAPROC, NamedBufferSubData); OPENGL_PROC(PFNGLNAMEDBUFFERSUBDATAEXTPROC, NamedBufferSubDataEXT); +OPENGL_PROC(PFNGLCLEARNAMEDBUFFERSUBDATAPROC, ClearNamedBufferSubData); +OPENGL_PROC(PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC, ClearNamedBufferSubDataEXT); + // ARB_shader_image_load_store OPENGL_PROC(PFNGLBINDIMAGETEXTUREPROC, BindImageTexture); From 92f63ccc0b09aa90cf5d16a5b73a62a9568988bc Mon Sep 17 00:00:00 2001 From: kd-11 Date: Fri, 6 Mar 2026 02:19:25 +0300 Subject: [PATCH 018/295] rsx/cfg: Silence GCC noise --- .../Program/Assembler/Passes/FP/RegisterAnnotationPass.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/RSX/Program/Assembler/Passes/FP/RegisterAnnotationPass.cpp b/rpcs3/Emu/RSX/Program/Assembler/Passes/FP/RegisterAnnotationPass.cpp index 622deefe7c..5e45ec6133 100644 --- a/rpcs3/Emu/RSX/Program/Assembler/Passes/FP/RegisterAnnotationPass.cpp +++ b/rpcs3/Emu/RSX/Program/Assembler/Passes/FP/RegisterAnnotationPass.cpp @@ -31,14 +31,14 @@ namespace rsx::assembler::FP switch (dst.prec) { case RSX_FP_PRECISION_REAL: - case RSX_FP_PRECISION_UNKNOWN: + // case RSX_FP_PRECISION_UNKNOWN: // Unreachable break; case RSX_FP_PRECISION_HALF: if (!src0.fp16) return false; break; case RSX_FP_PRECISION_FIXED12: case RSX_FP_PRECISION_FIXED9: - case RSX_FP_PRECISION_SATURATE: + // case RSX_FP_PRECISION_SATURATE: // Unreachable return false; } From 414df8432e56e8b015a4b447242f8127e62197b7 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Fri, 6 Mar 2026 03:25:58 +0300 Subject: [PATCH 019/295] gl: Respect internal offsets when performing DMA transfer operations --- rpcs3/Emu/RSX/GL/GLTextureCache.h | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/GLTextureCache.h b/rpcs3/Emu/RSX/GL/GLTextureCache.h index ae3b8e37e9..2c16bc8ba5 100644 --- a/rpcs3/Emu/RSX/GL/GLTextureCache.h +++ b/rpcs3/Emu/RSX/GL/GLTextureCache.h @@ -48,7 +48,7 @@ namespace gl void init_buffer(const gl::texture* src) { - const u32 vram_size = src->pitch() * src->height(); + const u32 vram_size = std::max(src->pitch() * src->height(), get_section_size()); const u32 buffer_size = utils::align(vram_size, 4096); if (pbo) @@ -148,7 +148,7 @@ namespace gl } } - void dma_transfer(gl::command_context& cmd, gl::texture* src, const areai& /*src_area*/, const utils::address_range32& /*valid_range*/, u32 pitch) + void dma_transfer(gl::command_context& cmd, gl::texture* src, const areai& src_area, const utils::address_range32& valid_range, u32 pitch) { init_buffer(src); glGetError(); @@ -165,6 +165,20 @@ namespace gl real_pitch = src->pitch(); rsx_pitch = pitch; + const coord3u src_rgn = + { + { static_cast(src_area.x1), static_cast(src_area.y1), 0 }, + { static_cast(src_area.width()), static_cast(src_area.height()), 1 } + }; + + u32 pbo_offset = 0; + if (valid_range.valid()) + { + const u32 section_base = get_section_base(); + pbo_offset = valid_range.start - section_base; + ensure(valid_range.start >= section_base && pbo_offset <= pbo.size()); + } + bool use_driver_pixel_transform = true; if (get_driver_caps().ARB_compute_shader_supported) [[likely]] { @@ -193,14 +207,14 @@ namespace gl mem_info.image_size_in_bytes *= 2; } - void* out_offset = copy_image_to_buffer(cmd, pack_info, src, &scratch_mem, 0, 0, { {}, src->size3D() }, &mem_info); + void* out_offset = copy_image_to_buffer(cmd, pack_info, src, &scratch_mem, 0, 0, src_rgn, &mem_info); glBindBuffer(GL_SHADER_STORAGE_BUFFER, GL_NONE); glMemoryBarrier(GL_BUFFER_UPDATE_BARRIER_BIT); real_pitch = pack_info.size * src->width(); const u64 data_length = pack_info.size * mem_info.image_size_in_texels; - scratch_mem.copy_to(&pbo, reinterpret_cast(out_offset), 0, data_length); + scratch_mem.copy_to(&pbo, reinterpret_cast(out_offset), pbo_offset, data_length); } else { @@ -225,7 +239,7 @@ namespace gl pack_settings.alignment(1); pack_settings.swap_bytes(pack_unpack_swap_bytes); - src->copy_to(nullptr, format, type, pack_settings); + src->copy_to(reinterpret_cast(pbo_offset), format, type, 0, src_rgn, pack_settings); } if (auto error = glGetError()) From 1c5e30e83f4a9840a712cc70fc69c4a4c2123002 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Fri, 6 Mar 2026 12:21:28 +0100 Subject: [PATCH 020/295] input/qt: fix default squircle value in text and remove duplicate comments --- rpcs3/Emu/Io/PadHandler.cpp | 16 ---------------- rpcs3/Emu/Io/PadHandler.h | 8 ++++---- rpcs3/rpcs3qt/tooltips.h | 2 +- 3 files changed, 5 insertions(+), 21 deletions(-) diff --git a/rpcs3/Emu/Io/PadHandler.cpp b/rpcs3/Emu/Io/PadHandler.cpp index 9110687a9c..a2ae41349e 100644 --- a/rpcs3/Emu/Io/PadHandler.cpp +++ b/rpcs3/Emu/Io/PadHandler.cpp @@ -24,13 +24,11 @@ std::set PadHandlerBase::narrow_set(const std::set& src) return dst; } -// Get new multiplied value based on the multiplier s32 PadHandlerBase::MultipliedInput(s32 raw_value, s32 multiplier) { return (multiplier * raw_value) / 100; } -// Get new scaled value between 0 and range based on its minimum and maximum f32 PadHandlerBase::ScaledInput(f32 raw_value, f32 minimum, f32 maximum, f32 deadzone, f32 range) { if (deadzone > 0 && deadzone > minimum) @@ -46,7 +44,6 @@ f32 PadHandlerBase::ScaledInput(f32 raw_value, f32 minimum, f32 maximum, f32 dea return range * val; } -// Get new scaled value between -range and range based on its minimum and maximum f32 PadHandlerBase::ScaledAxisInput(f32 raw_value, f32 minimum, f32 maximum, f32 deadzone, f32 range) { // convert [min, max] to [0, 1] @@ -79,7 +76,6 @@ f32 PadHandlerBase::ScaledAxisInput(f32 raw_value, f32 minimum, f32 maximum, f32 return (2.0f * range * val) - range; } -// Get normalized trigger value based on the range defined by a threshold u16 PadHandlerBase::NormalizeTriggerInput(u16 value, u32 threshold) const { if (value <= threshold || threshold >= trigger_max) @@ -90,8 +86,6 @@ u16 PadHandlerBase::NormalizeTriggerInput(u16 value, u32 threshold) const return static_cast(ScaledInput(static_cast(value), static_cast(trigger_min), static_cast(trigger_max), static_cast(threshold))); } -// normalizes a directed input, meaning it will correspond to a single "button" and not an axis with two directions -// the input values must lie in 0+ u16 PadHandlerBase::NormalizeDirectedInput(s32 raw_value, s32 threshold, s32 maximum) const { if (threshold >= maximum || maximum <= 0 || raw_value < 0) @@ -114,9 +108,6 @@ u16 PadHandlerBase::NormalizeStickInput(u16 raw_value, s32 threshold, s32 multip return static_cast(ScaledInput(static_cast(scaled_value), 0.0f, static_cast(thumb_max), static_cast(threshold))); } -// This function normalizes stick deadzone based on the DS3's deadzone, which is ~13% (default of anti deadzone) -// X and Y is expected to be in (-255) to 255 range, deadzone should be in terms of thumb stick range -// return is new x and y values in 0-255 range std::tuple PadHandlerBase::NormalizeStickDeadzone(s32 inX, s32 inY, u32 deadzone, u32 anti_deadzone) const { f32 X = inX / 255.0f; @@ -150,28 +141,21 @@ std::tuple PadHandlerBase::NormalizeStickDeadzone(s32 inX, s32 inY, u3 return std::tuple(ConvertAxis(X), ConvertAxis(Y)); } -// get clamped value between 0 and 255 u16 PadHandlerBase::Clamp0To255(f32 input) { return static_cast(std::clamp(input, 0.0f, 255.0f)); } -// get clamped value between 0 and 1023 u16 PadHandlerBase::Clamp0To1023(f32 input) { return static_cast(std::clamp(input, 0.0f, 1023.0f)); } -// input has to be [-1,1]. result will be [0,255] u16 PadHandlerBase::ConvertAxis(f32 value) { return static_cast((value + 1.0) * (255.0 / 2.0)); } -// The DS3, (and i think xbox controllers) give a 'square-ish' type response, so that the corners will give (almost)max x/y instead of the ~30x30 from a perfect circle -// using a simple scale/sensitivity increase would *work* although it eats a chunk of our usable range in exchange -// this might be the best for now, in practice it seems to push the corners to max of 20x20, with a squircle_factor of ~4000 -// This function assumes inX and inY is already in 0-255 void PadHandlerBase::ConvertToSquirclePoint(u16& inX, u16& inY, u32 squircle_factor) { if (!squircle_factor) diff --git a/rpcs3/Emu/Io/PadHandler.h b/rpcs3/Emu/Io/PadHandler.h index 98cca72a7d..a273beb3de 100644 --- a/rpcs3/Emu/Io/PadHandler.h +++ b/rpcs3/Emu/Io/PadHandler.h @@ -274,7 +274,7 @@ protected: // the input values must lie in 0+ u16 NormalizeDirectedInput(s32 raw_value, s32 threshold, s32 maximum) const; - // This function normalizes stick deadzone based on the DS3's deadzone, which is ~13% + // This function normalizes stick deadzone based on the DS3's deadzone, which is ~13% (default of anti deadzone) // X and Y is expected to be in (-255) to 255 range, deadzone should be in terms of thumb stick range // return is new x and y values in 0-255 range std::tuple NormalizeStickDeadzone(s32 inX, s32 inY, u32 deadzone, u32 anti_deadzone) const; @@ -284,10 +284,10 @@ public: // Get new multiplied value based on the multiplier static s32 MultipliedInput(s32 raw_value, s32 multiplier); - // Get new scaled value between 0 and 255 based on its minimum and maximum + // Get new scaled value between 0 and range based on its minimum and maximum static f32 ScaledInput(f32 raw_value, f32 minimum, f32 maximum, f32 deadzone, f32 range = 255.0f); - // Get new scaled value between -255 and 255 based on its minimum and maximum + // Get new scaled value between -range and range based on its minimum and maximum static f32 ScaledAxisInput(f32 raw_value, f32 minimum, f32 maximum, f32 deadzone, f32 range = 255.0f); // get clamped value between 0 and 255 @@ -301,7 +301,7 @@ public: // The DS3, (and i think xbox controllers) give a 'square-ish' type response, so that the corners will give (almost)max x/y instead of the ~30x30 from a perfect circle // using a simple scale/sensitivity increase would *work* although it eats a chunk of our usable range in exchange - // this might be the best for now, in practice it seems to push the corners to max of 20x20, with a squircle_factor of 8000 + // this might be the best for now, in practice it seems to push the corners to max of 20x20, with a squircle_factor of ~4000 // This function assumes inX and inY is already in 0-255 static void ConvertToSquirclePoint(u16& inX, u16& inY, u32 squircle_factor); diff --git a/rpcs3/rpcs3qt/tooltips.h b/rpcs3/rpcs3qt/tooltips.h index e9c8ad436b..4f983dc18a 100644 --- a/rpcs3/rpcs3qt/tooltips.h +++ b/rpcs3/rpcs3qt/tooltips.h @@ -302,7 +302,7 @@ public: const QString analog_limiter = tr("Applies the stick multipliers while this special button is pressed.
Enable \"Toggle\" if you want to toggle the analog limiter on button press instead.
If no button has been assigned, the stick multipliers are always applied."); const QString pressure_intensity = tr("Controls the intensity of pressure sensitive buttons while this special button is pressed.
Enable \"Toggle\" if you want to toggle the intensity on button press instead.
Use the percentage to change how hard you want to press a button."); const QString pressure_deadzone = tr("Controls the deadzone of pressure sensitive buttons. It determines how far the button has to be pressed until it is recognized by the game. The resulting range will be projected onto the full button sensitivity range."); - const QString squircle_factor = tr("The actual DualShock 3's stick range is not circular but formed like a rounded square (or squircle) which represents the maximum range of the emulated sticks. You can use the squircle values to modify the stick input if your sticks can't reach the corners of that range. A value of 0 does not apply any so called squircling. A value of 8000 is usually recommended."); + const QString squircle_factor = tr("The actual DualShock 3's stick range is not circular but formed like a rounded square (or squircle) which represents the maximum range of the emulated sticks. You can use the squircle values to modify the stick input if your sticks can't reach the corners of that range. A value of 0 does not apply any so called squircling. A value of 4000 is usually recommended."); const QString stick_multiplier = tr("The stick multipliers can be used to change the sensitivity of your stick movements.
The default setting is 1 and represents normal input."); const QString stick_deadzones = tr("A stick's deadzone determines how far the stick has to be moved until it is fully recognized by the game. The resulting range will be projected onto the full input range in order to give you a smooth experience. Movement inside the deadzone is simulated using the anti-deadzone slider (default is 13%), so don't worry if there is still movement shown in the emulated stick preview."); const QString vibration = tr("The PS3 activates two motors (large and small) to handle controller vibrations.
You can enable, disable or even switch these signals for the currently selected pad here.
The game sends values from 0-255 to activate the motors.
Any value smaller or equal the threshold will be set to 0. This is 63 by default for pad handlers other than DualShock3 in order to emulate the DualShock3's behavior."); From d97851376d0adb736dff4715e158b4c2355432b8 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Fri, 6 Mar 2026 09:06:53 +0100 Subject: [PATCH 021/295] Add stacktrace in case of exception --- Utilities/Thread.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/Utilities/Thread.cpp b/Utilities/Thread.cpp index 08dce12315..6395c32505 100644 --- a/Utilities/Thread.cpp +++ b/Utilities/Thread.cpp @@ -14,6 +14,11 @@ #include "Emu/CPU/Backends/AArch64/AArch64Signal.h" #endif +#ifdef __cpp_lib_stacktrace +#include "rpcs3_version.h" +#include +#endif + #ifdef _WIN32 #include #include @@ -2800,6 +2805,16 @@ void thread_base::exec() [[noreturn]] void thread_ctrl::emergency_exit(std::string_view reason) { + // Print stacktrace +#ifdef __cpp_lib_stacktrace + if (rpcs3::is_local_build()) + { + std::ostringstream oss; + oss << std::stacktrace::current(); + sys_log.notice("StackTrace\n\n%s\n", oss.str()); + } +#endif + if (const std::string info = dump_useful_thread_info(); !info.empty()) { sys_log.notice("\n%s", info); From 4fd2409b8be1e85c9c25e631012b53abc5a859dc Mon Sep 17 00:00:00 2001 From: Megamouse Date: Tue, 3 Mar 2026 20:41:36 +0100 Subject: [PATCH 022/295] Update FAudio to 26.03 --- 3rdparty/FAudio | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/FAudio b/3rdparty/FAudio index e67d761ead..dc034fc671 160000 --- a/3rdparty/FAudio +++ b/3rdparty/FAudio @@ -1 +1 @@ -Subproject commit e67d761ead486de3e69fa11705456bf94df734ca +Subproject commit dc034fc671b07bbd14e8410d5dd6be6da38fdf6d From 69384d7bb4018dd0886fee25afe791bb99fbcbfd Mon Sep 17 00:00:00 2001 From: Megamouse Date: Mon, 5 Jan 2026 12:58:23 +0100 Subject: [PATCH 023/295] Update codebase to SDL 3.4.0 --- rpcs3/Emu/Io/LogitechG27.h | 5 +---- rpcs3/Input/sdl_camera_handler.cpp | 9 --------- rpcs3/Input/sdl_instance.cpp | 4 ++-- 3 files changed, 3 insertions(+), 15 deletions(-) diff --git a/rpcs3/Emu/Io/LogitechG27.h b/rpcs3/Emu/Io/LogitechG27.h index 4ec0d35c0b..dc68db68b9 100644 --- a/rpcs3/Emu/Io/LogitechG27.h +++ b/rpcs3/Emu/Io/LogitechG27.h @@ -38,10 +38,7 @@ struct logitech_g27_ffb_slot logitech_g27_ffb_state state = logitech_g27_ffb_state::inactive; u64 last_update = 0; SDL_HapticEffect last_effect {}; - - // TODO switch to SDL_HapticEffectID when it becomes available in a future SDL release - // Match the return of SDL_CreateHapticEffect for now - int effect_id = -1; + SDL_HapticEffectID effect_id = -1; }; struct sdl_mapping diff --git a/rpcs3/Input/sdl_camera_handler.cpp b/rpcs3/Input/sdl_camera_handler.cpp index 4faf4eaf75..8f6aa965de 100644 --- a/rpcs3/Input/sdl_camera_handler.cpp +++ b/rpcs3/Input/sdl_camera_handler.cpp @@ -10,15 +10,6 @@ LOG_CHANNEL(camera_log, "Camera"); -#if !(SDL_VERSION_ATLEAST(3, 4, 0)) -namespace SDL_CameraPermissionState -{ - constexpr int SDL_CAMERA_PERMISSION_STATE_DENIED = -1; - constexpr int SDL_CAMERA_PERMISSION_STATE_PENDING = 0; - constexpr int SDL_CAMERA_PERMISSION_STATE_APPROVED = 1; -} -#endif - template <> void fmt_class_string::format(std::string& out, u64 arg) { diff --git a/rpcs3/Input/sdl_instance.cpp b/rpcs3/Input/sdl_instance.cpp index d3296f44ba..a1b1410b53 100644 --- a/rpcs3/Input/sdl_instance.cpp +++ b/rpcs3/Input/sdl_instance.cpp @@ -102,8 +102,8 @@ bool sdl_instance::initialize_impl() set_hint(SDL_HINT_JOYSTICK_HIDAPI_PS3, "1"); #endif - // Disable LG4FF driver on windows (only needed for SDL 3.4.0) -#if _WIN32 && SDL_VERSION_ATLEAST(3, 4, 0) + // Disable LG4FF driver on windows +#if _WIN32 set_hint(SDL_HINT_JOYSTICK_HIDAPI_LG4FF, "0"); #endif From 0d80e300a07bb46d1b35e0b4211865c7b641859f Mon Sep 17 00:00:00 2001 From: Megamouse Date: Wed, 4 Mar 2026 19:31:50 +0100 Subject: [PATCH 024/295] Qt: add log level settings --- 3rdparty/yaml-cpp/yaml-cpp | 2 +- Utilities/Config.cpp | 2 +- .../Emu/CPU/Backends/AArch64/AArch64Common.h | 6 +- rpcs3/rpcs3.vcxproj | 2 + rpcs3/rpcs3.vcxproj.filters | 6 + rpcs3/rpcs3qt/CMakeLists.txt | 1 + rpcs3/rpcs3qt/emu_settings.cpp | 44 +++-- rpcs3/rpcs3qt/emu_settings.h | 9 + rpcs3/rpcs3qt/emu_settings_type.h | 6 + rpcs3/rpcs3qt/log_level_dialog.cpp | 155 ++++++++++++++++++ rpcs3/rpcs3qt/log_level_dialog.h | 19 +++ rpcs3/rpcs3qt/settings_dialog.cpp | 12 +- rpcs3/rpcs3qt/settings_dialog.ui | 26 ++- rpcs3/rpcs3qt/tooltips.h | 1 + rpcs3/util/logs.cpp | 11 +- rpcs3/util/logs.hpp | 8 +- 16 files changed, 279 insertions(+), 31 deletions(-) create mode 100644 rpcs3/rpcs3qt/log_level_dialog.cpp create mode 100644 rpcs3/rpcs3qt/log_level_dialog.h diff --git a/3rdparty/yaml-cpp/yaml-cpp b/3rdparty/yaml-cpp/yaml-cpp index 05c44fcd18..51a5d623e3 160000 --- a/3rdparty/yaml-cpp/yaml-cpp +++ b/3rdparty/yaml-cpp/yaml-cpp @@ -1 +1 @@ -Subproject commit 05c44fcd18074836e21e1eda9fc02b3a4a1529b5 +Subproject commit 51a5d623e3fde1f58829a56ba910f1cb33596222 diff --git a/Utilities/Config.cpp b/Utilities/Config.cpp index cee928def7..381ee01079 100644 --- a/Utilities/Config.cpp +++ b/Utilities/Config.cpp @@ -416,7 +416,7 @@ void cfg::encode(YAML::Emitter& out, const cfg::_base& rhs) out << YAML::BeginMap; for (const auto& np : static_cast(rhs).get_map()) { - if (np.second == logs::level::notice) continue; + if (np.second == logs::level::_default) continue; out << YAML::Key << np.first; out << YAML::Value << fmt::format("%s", np.second); } diff --git a/rpcs3/Emu/CPU/Backends/AArch64/AArch64Common.h b/rpcs3/Emu/CPU/Backends/AArch64/AArch64Common.h index dff06dfb81..2ce4fa68b3 100644 --- a/rpcs3/Emu/CPU/Backends/AArch64/AArch64Common.h +++ b/rpcs3/Emu/CPU/Backends/AArch64/AArch64Common.h @@ -20,19 +20,19 @@ namespace aarch64 sp }; - static const char* gpr_names[] = + [[maybe_unused]] static const char* gpr_names[] = { "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21", "x22", "x23", "x24", "x25", "x26", "x27", "x28", "x29", "x30" }; - static const char* spr_names[] = + [[maybe_unused]] static const char* spr_names[] = { "xzr", "pc", "sp" }; - static const char* spr_asm_names[] = + [[maybe_unused]] static const char* spr_asm_names[] = { "xzr", ".", "sp" }; diff --git a/rpcs3/rpcs3.vcxproj b/rpcs3/rpcs3.vcxproj index 9749f60fcd..cd5d7c8bc4 100644 --- a/rpcs3/rpcs3.vcxproj +++ b/rpcs3/rpcs3.vcxproj @@ -826,6 +826,7 @@ + @@ -1578,6 +1579,7 @@ "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" + diff --git a/rpcs3/rpcs3.vcxproj.filters b/rpcs3/rpcs3.vcxproj.filters index a011ddf62e..6c7841b4fc 100644 --- a/rpcs3/rpcs3.vcxproj.filters +++ b/rpcs3/rpcs3.vcxproj.filters @@ -1275,6 +1275,9 @@ Io + + Gui\settings + @@ -1517,6 +1520,9 @@ Io + + Gui\settings + diff --git a/rpcs3/rpcs3qt/CMakeLists.txt b/rpcs3/rpcs3qt/CMakeLists.txt index b59d6f7a11..6fe8d9db13 100644 --- a/rpcs3/rpcs3qt/CMakeLists.txt +++ b/rpcs3/rpcs3qt/CMakeLists.txt @@ -53,6 +53,7 @@ add_library(rpcs3_ui STATIC localized.cpp localized_emu.cpp log_frame.cpp + log_level_dialog.cpp log_viewer.cpp main_window.cpp memory_string_searcher.cpp diff --git a/rpcs3/rpcs3qt/emu_settings.cpp b/rpcs3/rpcs3qt/emu_settings.cpp index ccb2308509..c686394c10 100644 --- a/rpcs3/rpcs3qt/emu_settings.cpp +++ b/rpcs3/rpcs3qt/emu_settings.cpp @@ -31,18 +31,20 @@ namespace out << YAML::Null; return; } + if (node.IsMap()) { std::vector keys; keys.reserve(node.size()); + // generate vector of strings to be sorted using the as function from YAML documentation for (const auto& pair : node) { - keys.push_back(pair.first.as()); + keys.push_back(pair.first.Scalar()); } std::sort(keys.begin(), keys.end()); + // recursively generate sorted maps - // alternative implementations could have stops at specified recursion levels or maybe just the first two levels would be sorted out << YAML::BeginMap; for (const std::string& key : keys) { @@ -51,15 +53,10 @@ namespace emit_data(out, node[key]); } out << YAML::EndMap; + return; } - // alternatively: an else statement could be used however I wanted to follow a similar format to the += operator so the YAML Undefined class can be ignored - else if (node.IsScalar() || node.IsSequence()) - { - out << node; - } - // this exists to preserve the same functionality as before where Undefined nodes would still be output, can be removed or consolidated with the else if branch - else - out << node; + + out << node; } // Incrementally load YAML @@ -910,11 +907,38 @@ std::string emu_settings::GetSetting(emu_settings_type type) const return ""; } +std::map emu_settings::GetMapSettingDefault(emu_settings_type type) const +{ + if (const auto node = cfg_adapter::get_node(m_default_settings, ::at32(settings_location, type)); node && node.IsMap()) + { + return node.as>(); + } + + cfg_log.fatal("GetMapSettingDefault(type=%d) could not retrieve the requested node", static_cast(type)); + return {}; +} + +std::map emu_settings::GetMapSetting(emu_settings_type type) const +{ + if (const auto node = cfg_adapter::get_node(m_current_settings, ::at32(settings_location, type)); node && node.IsMap()) + { + return node.as>(); + } + + cfg_log.fatal("GetMapSetting(type=%d) could not retrieve the requested node", static_cast(type)); + return {}; +} + void emu_settings::SetSetting(emu_settings_type type, const std::string& val) const { cfg_adapter::get_node(m_current_settings, ::at32(settings_location, type)) = val; } +void emu_settings::SetMapSetting(emu_settings_type type, const std::map& val) const +{ + cfg_adapter::get_node(m_current_settings, ::at32(settings_location, type)) = val; +} + emu_settings_type emu_settings::FindSettingsType(const cfg::_base* node) const { // Add key and value to static map on first use diff --git a/rpcs3/rpcs3qt/emu_settings.h b/rpcs3/rpcs3qt/emu_settings.h index 5da946dabe..c5a1e89252 100644 --- a/rpcs3/rpcs3qt/emu_settings.h +++ b/rpcs3/rpcs3qt/emu_settings.h @@ -78,9 +78,18 @@ public: /** Returns the value of the setting type.*/ std::string GetSetting(emu_settings_type type) const; + /** Returns the default map value of the setting type.*/ + std::map GetMapSettingDefault(emu_settings_type type) const; + + /** Returns the value of the setting type as map.*/ + std::map GetMapSetting(emu_settings_type type) const; + /** Sets the setting type to a given value.*/ void SetSetting(emu_settings_type type, const std::string& val) const; + /** Sets the setting type to a given map value.*/ + void SetMapSetting(emu_settings_type type, const std::map& val) const; + /** Try to find the settings type for a given string.*/ emu_settings_type FindSettingsType(const cfg::_base* node) const; diff --git a/rpcs3/rpcs3qt/emu_settings_type.h b/rpcs3/rpcs3qt/emu_settings_type.h index 6a5b6841b1..67238571d3 100644 --- a/rpcs3/rpcs3qt/emu_settings_type.h +++ b/rpcs3/rpcs3qt/emu_settings_type.h @@ -217,6 +217,9 @@ enum class emu_settings_type EmptyHdd0Tmp, LimitCacheSize, MaximumCacheSize, + + // Log + Log, }; /** A helper map that keeps track of where a given setting type is located*/ @@ -434,4 +437,7 @@ inline static const std::map settings_location { emu_settings_type::SuspendEmulationSavestateMode, { "Savestate", "Suspend Emulation Savestate Mode" }}, { emu_settings_type::CompatibleEmulationSavestateMode, { "Savestate", "Compatible Savestate Mode" }}, { emu_settings_type::StartSavestatePaused, { "Savestate", "Start Paused" }}, + + // Logs + { emu_settings_type::Log, { "Log" }}, }; diff --git a/rpcs3/rpcs3qt/log_level_dialog.cpp b/rpcs3/rpcs3qt/log_level_dialog.cpp new file mode 100644 index 0000000000..3f5fd3c58d --- /dev/null +++ b/rpcs3/rpcs3qt/log_level_dialog.cpp @@ -0,0 +1,155 @@ +#include "stdafx.h" +#include "log_level_dialog.h" +#include "emu_settings.h" + +#include +#include +#include +#include +#include +#include + +LOG_CHANNEL(cfg_log, "CFG"); + +log_level_dialog::log_level_dialog(QWidget* parent, std::shared_ptr emu_settings) + : QDialog(parent), m_emu_settings(emu_settings) +{ + setWindowTitle(tr("Configure minimum log levels")); + setObjectName("log_level_dialog"); + setAttribute(Qt::WA_DeleteOnClose); + setMinimumSize(QSize(700, 400)); + + const std::set channels = logs::get_channels(); + std::vector> levels; + + const auto add_level = [&levels](logs::level level, const QString& localized) + { + levels.push_back(std::pair(fmt::format("%s", level), localized)); + }; + + add_level(logs::level::always, tr("Always")); + add_level(logs::level::fatal, tr("Fatal")); + add_level(logs::level::error, tr("Error")); + add_level(logs::level::todo, tr("Todo")); + add_level(logs::level::success, tr("Success")); + add_level(logs::level::warning, tr("Warning")); + add_level(logs::level::notice, tr("Notice")); + add_level(logs::level::trace, tr("Trace")); + + const std::map current_settings = m_emu_settings->GetMapSetting(emu_settings_type::Log); + for (const auto& [channel, level] : current_settings) + { + if (!channels.contains(channel)) + { + cfg_log.warning("log_level_dialog: Ignoring unknown channel '%s' found in config file.", channel); + } + } + + m_table = new QTableWidget(static_cast(channels.size()), 2, this); + m_table->setHorizontalHeaderLabels({ tr("Channel"), tr("Level") }); + + int i = 0; + for (const std::string& channel : channels) + { + QComboBox* combo = new QComboBox(); + + for (const auto& [level, localized] : levels) + { + combo->addItem(localized, QString::fromStdString(level)); + } + + connect(combo, &QComboBox::currentIndexChanged, combo, [this, combo, ch = channel](int index) + { + if (index < 0) return; + + const QVariant var = combo->itemData(index); + if (!var.canConvert()) return; + + std::map settings = m_emu_settings->GetMapSetting(emu_settings_type::Log); + + settings[ch] = var.toString().toStdString(); + + m_emu_settings->SetMapSetting(emu_settings_type::Log, settings); + }); + + m_table->setItem(i, 0, new QTableWidgetItem(QString::fromStdString(channel))); + m_table->setCellWidget(i, 1, combo); + + i++; + } + + QLineEdit* filter_edit = new QLineEdit(this); + filter_edit->setPlaceholderText(tr("Filter channels")); + connect(filter_edit, &QLineEdit::textChanged, this, [this](const QString& text) + { + for (int i = 0; i < m_table->rowCount(); i++) + { + if (QTableWidgetItem* item = m_table->item(i, 0)) + { + m_table->setRowHidden(i, !text.isEmpty() && !item->text().contains(text, Qt::CaseInsensitive)); + } + } + }); + + QDialogButtonBox* button_box = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel | QDialogButtonBox::RestoreDefaults); + connect(button_box, &QDialogButtonBox::clicked, this, [this, button_box, old_settings = m_emu_settings->GetMapSetting(emu_settings_type::Log)](QAbstractButton* button) + { + if (button == button_box->button(QDialogButtonBox::Ok)) + { + accept(); + } + else if (button == button_box->button(QDialogButtonBox::Cancel)) + { + m_emu_settings->SetMapSetting(emu_settings_type::Log, old_settings); + reject(); + } + else if (button == button_box->button(QDialogButtonBox::RestoreDefaults)) + { + m_emu_settings->SetMapSetting(emu_settings_type::Log, m_emu_settings->GetMapSettingDefault(emu_settings_type::Log)); + reload_page(); + } + }); + + reload_page(); + + m_table->resizeColumnsToContents(); + m_table->horizontalHeader()->stretchLastSection(); + + QVBoxLayout* layout = new QVBoxLayout(); + layout->addWidget(filter_edit); + layout->addWidget(m_table); + layout->addWidget(button_box); + setLayout(layout); +} + +log_level_dialog::~log_level_dialog() +{ +} + +void log_level_dialog::reload_page() +{ + const std::map settings = m_emu_settings->GetMapSetting(emu_settings_type::Log); + const QString def_str = QString::fromStdString(fmt::format("%s", logs::level::_default)); + + for (int i = 0; i < m_table->rowCount(); i++) + { + QTableWidgetItem* item = m_table->item(i, 0); + if (!item) continue; + + const std::string channel = item->text().toStdString(); + + if (QComboBox* combo = static_cast(m_table->cellWidget(i, 1))) + { + combo->blockSignals(true); + combo->setCurrentIndex(combo->findData(def_str)); + if (settings.contains(channel)) + { + if (const int index = combo->findData(QString::fromStdString(settings.at(channel))); index >= 0) + { + combo->setCurrentIndex(index); + } + } + combo->blockSignals(false); + } + } +} diff --git a/rpcs3/rpcs3qt/log_level_dialog.h b/rpcs3/rpcs3qt/log_level_dialog.h new file mode 100644 index 0000000000..87a0ccf8a4 --- /dev/null +++ b/rpcs3/rpcs3qt/log_level_dialog.h @@ -0,0 +1,19 @@ +#pragma once + +#include +#include + +class emu_settings; + +class log_level_dialog : public QDialog +{ +public: + log_level_dialog(QWidget* parent, std::shared_ptr emu_settings); + virtual ~log_level_dialog(); + +private: + void reload_page(); + + std::shared_ptr m_emu_settings; + QTableWidget* m_table = nullptr; +}; diff --git a/rpcs3/rpcs3qt/settings_dialog.cpp b/rpcs3/rpcs3qt/settings_dialog.cpp index 0c0fb63efd..b903db0f52 100644 --- a/rpcs3/rpcs3qt/settings_dialog.cpp +++ b/rpcs3/rpcs3qt/settings_dialog.cpp @@ -23,13 +23,13 @@ #include "emu_settings_type.h" #include "render_creator.h" #include "microphone_creator.h" -#include "Emu/NP/rpcn_countries.h" +#include "log_level_dialog.h" +#include "Emu/NP/rpcn_countries.h" #include "Emu/GameInfo.h" #include "Emu/System.h" #include "Emu/system_config.h" #include "Emu/title.h" - #include "Emu/Audio/audio_device_enumerator.h" #include "Loader/PSF.h" @@ -2496,6 +2496,14 @@ settings_dialog::settings_dialog(std::shared_ptr gui_settings, std m_emu_settings->EnhanceComboBox(ui->vulkansched, emu_settings_type::VulkanAsyncSchedulerDriver); SubscribeTooltip(ui->gb_vulkansched, tooltips.settings.vulkan_async_scheduler); + // Log levels + SubscribeTooltip(ui->gb_log_levels, tooltips.settings.vulkan_async_scheduler); + connect(ui->pb_log_levels, &QAbstractButton::clicked, this, [this]() + { + log_level_dialog* dlg = new log_level_dialog(this, m_emu_settings); + dlg->open(); + }); + if (!restoreGeometry(m_gui_settings->GetValue(gui::cfg_geometry).toByteArray())) { // Ignore. This will most likely only fail if the setting doesn't contain any values diff --git a/rpcs3/rpcs3qt/settings_dialog.ui b/rpcs3/rpcs3qt/settings_dialog.ui index e394407e11..76a418298d 100644 --- a/rpcs3/rpcs3qt/settings_dialog.ui +++ b/rpcs3/rpcs3qt/settings_dialog.ui @@ -265,7 +265,7 @@ - + @@ -2321,9 +2321,9 @@ - - Enable Clans - + + Enable Clans + @@ -4467,7 +4467,7 @@ - + 0 @@ -4545,6 +4545,22 @@ + + + + Log Levels + + + + + + Configure + + + + + + diff --git a/rpcs3/rpcs3qt/tooltips.h b/rpcs3/rpcs3qt/tooltips.h index 4f983dc18a..b56e093dff 100644 --- a/rpcs3/rpcs3qt/tooltips.h +++ b/rpcs3/rpcs3qt/tooltips.h @@ -59,6 +59,7 @@ public: const QString paused_savestates = tr("When this mode is on, savestates are loaded and paused on the first frame.\nThis allows players to prepare for gameplay without being thrown into the action immediately."); const QString spu_profiler = tr("When enabled, SPU performance is measured at runtime.\nEnable only at a developer's request because when enabled it reduces performance a bit by itself."); const QString use_ReBAR = tr("When enabled, Vulkan will try to use PCI-e resizable bar address space for GPU uploads of timing-sensitive data.\nThis yields a massive performance win on NVIDIA cards when the base framerate is low.\nFor games with very high framerates, this option can result in worse performance for all GPU vendors.\n"); + const QString log_levels = tr("Set the minimum log levels for any log channels."); // audio diff --git a/rpcs3/util/logs.cpp b/rpcs3/util/logs.cpp index 0276f90e0b..f0afc95bac 100644 --- a/rpcs3/util/logs.cpp +++ b/rpcs3/util/logs.cpp @@ -202,7 +202,7 @@ namespace logs for (auto&& pair : get_logger()->channels) { - pair.second->enabled.release(level::notice); + pair.second->enabled.release(level::_default); } } @@ -271,18 +271,17 @@ namespace logs } } - std::vector get_channels() + std::set get_channels() { - std::vector result; + std::set result; std::lock_guard lock(g_mutex); for (auto&& p : get_logger()->channels) { - // Copy names removing duplicates - if (result.empty() || result.back() != p.first) + if (!p.first.empty()) { - result.push_back(p.first); + result.insert(p.first); } } diff --git a/rpcs3/util/logs.hpp b/rpcs3/util/logs.hpp index 52d163ed43..1b75bd6499 100644 --- a/rpcs3/util/logs.hpp +++ b/rpcs3/util/logs.hpp @@ -3,7 +3,7 @@ #include #include #include -#include +#include #include #include "util/atomic.hpp" #include "Utilities/StrFmt.h" @@ -20,6 +20,8 @@ namespace logs warning = 5, notice = 6, trace = 7, // Lowest severity (usually disabled) + + _default = notice }; struct channel; @@ -163,7 +165,7 @@ namespace logs registerer(channel& _ch); }; - // Log level control: set all channels to level::notice + // Log level control: set all channels to default level::notice void reset(); // Log level control: set all channels to level::always @@ -179,7 +181,7 @@ namespace logs void set_channel_levels(const std::map>& map); // Get all registered log channels - std::vector get_channels(); + std::set get_channels(); // Helper: no additional name specified consteval const char* make_channel_name(const char* name, const char* alt = nullptr) From ac30feeddb4d53f08397897574649228b8c187d1 Mon Sep 17 00:00:00 2001 From: RipleyTom Date: Fri, 6 Mar 2026 21:25:52 +0100 Subject: [PATCH 025/295] Revert enabling PPU jump elider --- rpcs3/Emu/Cell/PPUTranslator.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/rpcs3/Emu/Cell/PPUTranslator.cpp b/rpcs3/Emu/Cell/PPUTranslator.cpp index 1c9f6e2b9d..ddf7d330a0 100644 --- a/rpcs3/Emu/Cell/PPUTranslator.cpp +++ b/rpcs3/Emu/Cell/PPUTranslator.cpp @@ -553,7 +553,9 @@ void PPUTranslator::CallFunction(u64 target, Value* indirect) std::unordered_set passed_targets{target_last}; // Try to follow unconditional branches as long as there is no infinite loop - while (true) + // !! Triggers compilation issues in Asura's Wrath in other parts of the code + // !! See https://github.com/RPCS3/rpcs3/issues/18287 + while (false) { const ppu_opcode_t op{*ensure(m_info.get_ptr(target_last))}; const ppu_itype::type itype = g_ppu_itype.decode(op.opcode); From 14789b536f2122e0f6fc8b9d34958a615ef34619 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sat, 7 Mar 2026 00:23:58 +0300 Subject: [PATCH 026/295] gl: Clean up the awful image copy API - Wrap everything in rsx::io_buffer and gl::buffer to avoid out of bounds issues. - Also abstracts away nasty things like OpenGL offset pointer casts. --- rpcs3/Emu/RSX/Common/io_buffer.h | 7 ++-- rpcs3/Emu/RSX/GL/GLGSRender.cpp | 9 ++--- rpcs3/Emu/RSX/GL/GLOverlays.cpp | 6 ++-- rpcs3/Emu/RSX/GL/GLPresent.cpp | 5 +-- rpcs3/Emu/RSX/GL/GLTexture.cpp | 18 +++------- rpcs3/Emu/RSX/GL/GLTextureCache.h | 4 +-- rpcs3/Emu/RSX/GL/glutils/image.cpp | 43 +++++++++++++++-------- rpcs3/Emu/RSX/GL/glutils/image.h | 13 ++++--- rpcs3/Emu/RSX/Overlays/overlay_controls.h | 5 +++ 9 files changed, 62 insertions(+), 48 deletions(-) diff --git a/rpcs3/Emu/RSX/Common/io_buffer.h b/rpcs3/Emu/RSX/Common/io_buffer.h index 64f95a5e61..59e8e6a32e 100644 --- a/rpcs3/Emu/RSX/Common/io_buffer.h +++ b/rpcs3/Emu/RSX/Common/io_buffer.h @@ -9,7 +9,7 @@ namespace rsx template concept SpanLike = requires(T t) { - { t.data() } -> std::convertible_to; + { t.data() } -> std::convertible_to; { t.size_bytes() } -> std::convertible_to; }; @@ -71,9 +71,10 @@ namespace rsx return static_cast(m_ptr); } - usz size() const + template + T size() const { - return m_size; + return static_cast(m_size); } template diff --git a/rpcs3/Emu/RSX/GL/GLGSRender.cpp b/rpcs3/Emu/RSX/GL/GLGSRender.cpp index ebff202303..408ea9f784 100644 --- a/rpcs3/Emu/RSX/GL/GLGSRender.cpp +++ b/rpcs3/Emu/RSX/GL/GLGSRender.cpp @@ -249,22 +249,23 @@ void GLGSRender::on_init_thread() // Fallback null texture instead of relying on texture0 { std::array pixeldata = { 0, 0, 0, 0, 0, 0, 0, 0 }; + const rsx::io_buffer src_buf = std::span(pixeldata); // 1D auto tex1D = std::make_unique(GL_TEXTURE_1D, 1, 1, 1, 1, 1, GL_RGBA8, RSX_FORMAT_CLASS_COLOR); - tex1D->copy_from(pixeldata.data(), gl::texture::format::rgba, gl::texture::type::uint_8_8_8_8, {}); + tex1D->copy_from(src_buf, gl::texture::format::rgba, gl::texture::type::uint_8_8_8_8, {}); // 2D auto tex2D = std::make_unique(GL_TEXTURE_2D, 1, 1, 1, 1, 1, GL_RGBA8, RSX_FORMAT_CLASS_COLOR); - tex2D->copy_from(pixeldata.data(), gl::texture::format::rgba, gl::texture::type::uint_8_8_8_8, {}); + tex2D->copy_from(src_buf, gl::texture::format::rgba, gl::texture::type::uint_8_8_8_8, {}); // 3D auto tex3D = std::make_unique(GL_TEXTURE_3D, 1, 1, 1, 1, 1, GL_RGBA8, RSX_FORMAT_CLASS_COLOR); - tex3D->copy_from(pixeldata.data(), gl::texture::format::rgba, gl::texture::type::uint_8_8_8_8, {}); + tex3D->copy_from(src_buf, gl::texture::format::rgba, gl::texture::type::uint_8_8_8_8, {}); // CUBE auto texCUBE = std::make_unique(GL_TEXTURE_CUBE_MAP, 1, 1, 1, 1, 1, GL_RGBA8, RSX_FORMAT_CLASS_COLOR); - texCUBE->copy_from(pixeldata.data(), gl::texture::format::rgba, gl::texture::type::uint_8_8_8_8, {}); + texCUBE->copy_from(src_buf, gl::texture::format::rgba, gl::texture::type::uint_8_8_8_8, {}); m_null_textures[GL_TEXTURE_1D] = std::move(tex1D); m_null_textures[GL_TEXTURE_2D] = std::move(tex2D); diff --git a/rpcs3/Emu/RSX/GL/GLOverlays.cpp b/rpcs3/Emu/RSX/GL/GLOverlays.cpp index 7d36e5598b..0c4732430c 100644 --- a/rpcs3/Emu/RSX/GL/GLOverlays.cpp +++ b/rpcs3/Emu/RSX/GL/GLOverlays.cpp @@ -223,7 +223,7 @@ namespace gl gl::texture_view* ui_overlay_renderer::load_simple_image(rsx::overlays::image_info_base* desc, bool temp_resource, u32 owner_uid) { auto tex = std::make_unique(GL_TEXTURE_2D, desc->w, desc->h, 1, 1, 1, GL_RGBA8, RSX_FORMAT_CLASS_COLOR); - tex->copy_from(desc->get_data(), gl::texture::format::rgba, gl::texture::type::uint_8_8_8_8, {}); + tex->copy_from(desc->as_span(), gl::texture::format::rgba, gl::texture::type::uint_8_8_8_8, {}); const GLenum remap[] = { GL_RED, GL_ALPHA, GL_BLUE, GL_GREEN }; auto view = std::make_unique(tex.get(), remap); @@ -308,7 +308,7 @@ namespace gl const std::vector& glyph_data = font->get_glyph_data(); auto tex = std::make_unique(GL_TEXTURE_2D_ARRAY, font_size.width, font_size.height, font_size.depth, 1, 1, GL_R8, RSX_FORMAT_CLASS_COLOR); - tex->copy_from(glyph_data.data(), gl::texture::format::r, gl::texture::type::ubyte, {}); + tex->copy_from(std::span(glyph_data), gl::texture::format::r, gl::texture::type::ubyte, {}); GLenum remap[] = { GL_RED, GL_RED, GL_RED, GL_RED }; auto view = std::make_unique(tex.get(), remap); @@ -332,7 +332,7 @@ namespace gl if (dirty) { - view->image()->copy_from(desc->get_data(), gl::texture::format::rgba, gl::texture::type::uint_8_8_8_8, {}); + view->image()->copy_from(desc->as_span(), gl::texture::format::rgba, gl::texture::type::uint_8_8_8_8, {}); } return view; diff --git a/rpcs3/Emu/RSX/GL/GLPresent.cpp b/rpcs3/Emu/RSX/GL/GLPresent.cpp index e7c03dfcf5..4c241d7d33 100644 --- a/rpcs3/Emu/RSX/GL/GLPresent.cpp +++ b/rpcs3/Emu/RSX/GL/GLPresent.cpp @@ -132,7 +132,8 @@ gl::texture* GLGSRender::get_present_source(gl::present_surface_info* info, cons const auto range = utils::address_range32::start_length(info->address, info->pitch * info->height); m_gl_texture_cache.invalidate_range(cmd, range, rsx::invalidation_cause::read); - flip_image->copy_from(vm::base(info->address), static_cast(expected_format), gl::texture::type::uint_8_8_8_8, unpack_settings); + const rsx::io_buffer read_buf = { vm::base(info->address), range.length() }; + flip_image->copy_from(read_buf, static_cast(expected_format), gl::texture::type::uint_8_8_8_8, unpack_settings); image = flip_image.get(); } else if (image->get_internal_format() != static_cast(expected_format)) @@ -368,7 +369,7 @@ void GLGSRender::flip(const rsx::display_flip_info_t& info) std::vector sshot_frame(buffer_height * buffer_width * 4); glGetError(); - tex->copy_to(sshot_frame.data(), gl::texture::format::rgba, gl::texture::type::ubyte, pack_settings); + tex->copy_to(std::span(sshot_frame), gl::texture::format::rgba, gl::texture::type::ubyte, pack_settings); m_sshot_tex.reset(); diff --git a/rpcs3/Emu/RSX/GL/GLTexture.cpp b/rpcs3/Emu/RSX/GL/GLTexture.cpp index 181e5058c8..40c3af180c 100644 --- a/rpcs3/Emu/RSX/GL/GLTexture.cpp +++ b/rpcs3/Emu/RSX/GL/GLTexture.cpp @@ -363,8 +363,7 @@ namespace gl } } - dst->bind(buffer::target::pixel_pack); - src->copy_to(reinterpret_cast(static_cast(dst_offset)), static_cast(pack_info.format), static_cast(pack_info.type), src_level, src_region, {}); + src->copy_to(*dst, dst_offset, static_cast(pack_info.format), static_cast(pack_info.type), src_level, src_region, {}); return false; }; @@ -611,9 +610,8 @@ namespace gl } glBindBuffer(GL_SHADER_STORAGE_BUFFER, GL_NONE); - transfer_buf->bind(buffer::target::pixel_unpack); - dst->copy_from(reinterpret_cast(u64(out_offset)), static_cast(unpack_info.format), + dst->copy_from(*transfer_buf, out_offset, static_cast(unpack_info.format), static_cast(unpack_info.type), dst_level, dst_region, {}); } } @@ -712,7 +710,6 @@ namespace gl pixel_buffer_layout mem_layout; std::span dst_buffer = staging_buffer; - void* out_pointer = staging_buffer.data(); u8 block_size_in_bytes = rsx::get_format_block_size_in_bytes(format); u64 image_linear_size = staging_buffer.size(); @@ -731,8 +728,6 @@ namespace gl g_compute_decode_buffer.remove(); g_compute_decode_buffer.create(gl::buffer::target::ssbo, min_required_buffer_size); } - - out_pointer = nullptr; } for (const rsx::subresource_layout& layout : input_layouts) @@ -867,7 +862,7 @@ namespace gl else { unpack_settings.swap_bytes(op.require_swap); - dst->copy_from(out_pointer, static_cast(gl_format), static_cast(gl_type), layout.level, region, unpack_settings); + dst->copy_from(staging_buffer, static_cast(gl_format), static_cast(gl_type), layout.level, region, unpack_settings); } } } @@ -1156,9 +1151,7 @@ namespace gl // Start pack operation pixel_pack_settings pack_settings{}; pack_settings.swap_bytes(pack_info.swap_bytes); - - g_typeless_transfer_buffer.get().bind(buffer::target::pixel_pack); - src->copy_to(nullptr, static_cast(pack_info.format), static_cast(pack_info.type), 0, src_region, pack_settings); + src->copy_to(g_typeless_transfer_buffer.get(), 0, static_cast(pack_info.format), static_cast(pack_info.type), 0, src_region, pack_settings); glBindBuffer(GL_PIXEL_PACK_BUFFER, GL_NONE); @@ -1166,8 +1159,7 @@ namespace gl pixel_unpack_settings unpack_settings{}; unpack_settings.swap_bytes(unpack_info.swap_bytes); - g_typeless_transfer_buffer.get().bind(buffer::target::pixel_unpack); - dst->copy_from(nullptr, static_cast(unpack_info.format), static_cast(unpack_info.type), 0, dst_region, unpack_settings); + dst->copy_from(g_typeless_transfer_buffer.get(), 0, static_cast(unpack_info.format), static_cast(unpack_info.type), 0, dst_region, unpack_settings); glBindBuffer(GL_PIXEL_UNPACK_BUFFER, GL_NONE); } } diff --git a/rpcs3/Emu/RSX/GL/GLTextureCache.h b/rpcs3/Emu/RSX/GL/GLTextureCache.h index 2c16bc8ba5..704589cccf 100644 --- a/rpcs3/Emu/RSX/GL/GLTextureCache.h +++ b/rpcs3/Emu/RSX/GL/GLTextureCache.h @@ -233,13 +233,11 @@ namespace gl pack_unpack_swap_bytes = false; } - pbo.bind(buffer::target::pixel_pack); - pixel_pack_settings pack_settings; pack_settings.alignment(1); pack_settings.swap_bytes(pack_unpack_swap_bytes); - src->copy_to(reinterpret_cast(pbo_offset), format, type, 0, src_rgn, pack_settings); + src->copy_to(pbo, pbo_offset, format, type, 0, src_rgn, pack_settings); } if (auto error = glGetError()) diff --git a/rpcs3/Emu/RSX/GL/glutils/image.cpp b/rpcs3/Emu/RSX/GL/glutils/image.cpp index 7dbd7fc254..b70a61f367 100644 --- a/rpcs3/Emu/RSX/GL/glutils/image.cpp +++ b/rpcs3/Emu/RSX/GL/glutils/image.cpp @@ -175,7 +175,7 @@ namespace gl m_id = GL_NONE; } - void texture::copy_from(const void* src, texture::format format, texture::type type, int level, const coord3u region, const pixel_unpack_settings& pixel_settings) + void texture::copy_from(const rsx::io_buffer& src, texture::format format, texture::type type, int level, const coord3u region, const pixel_unpack_settings& pixel_settings) { ensure(m_samples <= 1, "Transfer operations are unsupported on multisampled textures."); @@ -185,30 +185,30 @@ namespace gl { case GL_TEXTURE_1D: { - DSA_CALL(TextureSubImage1D, m_id, GL_TEXTURE_1D, level, region.x, region.width, static_cast(format), static_cast(type), src); + DSA_CALL(TextureSubImage1D, m_id, GL_TEXTURE_1D, level, region.x, region.width, static_cast(format), static_cast(type), src.data()); break; } case GL_TEXTURE_2D: { - DSA_CALL(TextureSubImage2D, m_id, GL_TEXTURE_2D, level, region.x, region.y, region.width, region.height, static_cast(format), static_cast(type), src); + DSA_CALL(TextureSubImage2D, m_id, GL_TEXTURE_2D, level, region.x, region.y, region.width, region.height, static_cast(format), static_cast(type), src.data()); break; } case GL_TEXTURE_3D: case GL_TEXTURE_2D_ARRAY: { - DSA_CALL(TextureSubImage3D, m_id, target_, level, region.x, region.y, region.z, region.width, region.height, region.depth, static_cast(format), static_cast(type), src); + DSA_CALL(TextureSubImage3D, m_id, target_, level, region.x, region.y, region.z, region.width, region.height, region.depth, static_cast(format), static_cast(type), src.data()); break; } case GL_TEXTURE_CUBE_MAP: { if (get_driver_caps().ARB_direct_state_access_supported) { - glTextureSubImage3D(m_id, level, region.x, region.y, region.z, region.width, region.height, region.depth, static_cast(format), static_cast(type), src); + glTextureSubImage3D(m_id, level, region.x, region.y, region.z, region.width, region.height, region.depth, static_cast(format), static_cast(type), src.data()); } else { rsx_log.warning("Cubemap upload via texture::copy_from is halfplemented!"); - auto ptr = static_cast(src); + auto ptr = static_cast(src.data()); const auto end = std::min(6u, region.z + region.depth); for (unsigned face = region.z; face < end; ++face) { @@ -221,22 +221,25 @@ namespace gl } } - void texture::copy_from(buffer& buf, u32 gl_format_type, u32 offset, u32 length) + void texture::copy_from(buffer& buf, GLsizeiptr offset, texture::format format, texture::type type, int level, const coord3u region, const pixel_unpack_settings& pixel_settings) { ensure(m_samples <= 1, "Transfer operations are unsupported on multisampled textures."); - if (get_target() != target::textureBuffer) - fmt::throw_exception("OpenGL error: texture cannot copy from buffer"); + buf.bind(buffer::target::pixel_unpack); - DSA_CALL(TextureBufferRange, m_id, GL_TEXTURE_BUFFER, gl_format_type, buf.id(), offset, length); + const rsx::io_buffer src{ reinterpret_cast(static_cast(offset)), buf.size() - offset }; + copy_from(src, format, type, level, region, pixel_settings); } void texture::copy_from(buffer_view& view) { - copy_from(*view.value(), view.format(), view.offset(), view.range()); + if (get_target() != target::textureBuffer) + fmt::throw_exception("OpenGL error: texture cannot copy from buffer"); + + DSA_CALL(TextureBufferRange, m_id, GL_TEXTURE_BUFFER, view.format(), view.value()->id(), view.offset(), view.range()); } - void texture::copy_to(void* dst, texture::format format, texture::type type, int level, const coord3u& region, const pixel_pack_settings& pixel_settings) const + void texture::copy_to(const rsx::io_buffer& dst, texture::format format, texture::type type, int level, const coord3u& region, const pixel_pack_settings& pixel_settings) const { ensure(m_samples <= 1, "Transfer operations are unsupported on multisampled textures."); @@ -247,14 +250,14 @@ namespace gl region.width == m_width && region.height == m_height && region.depth == m_depth) { if (caps.ARB_direct_state_access_supported) - glGetTextureImage(m_id, level, static_cast(format), static_cast(type), s32{ smax }, dst); + glGetTextureImage(m_id, level, static_cast(format), static_cast(type), dst.size(), dst.data()); else - glGetTextureImageEXT(m_id, static_cast(m_target), level, static_cast(format), static_cast(type), dst); + glGetTextureImageEXT(m_id, static_cast(m_target), level, static_cast(format), static_cast(type), dst.data()); } else if (caps.ARB_direct_state_access_supported) { glGetTextureSubImage(m_id, level, region.x, region.y, region.z, region.width, region.height, region.depth, - static_cast(format), static_cast(type), s32{ smax }, dst); + static_cast(format), static_cast(type), s32{ smax }, dst.data()); } else { @@ -269,6 +272,16 @@ namespace gl } } + void texture::copy_to(buffer& buf, GLsizeiptr offset, texture::format format, texture::type type, int level, const coord3u& region, const pixel_pack_settings& pixel_settings) const + { + ensure(offset < buf.size(), "PBO write is out of range"); + + buf.bind(buffer::target::pixel_pack); + + const rsx::io_buffer dst{ reinterpret_cast(static_cast(offset)), buf.size() - offset }; + copy_to(dst, format, type, level, region, pixel_settings); + } + void texture_view::create(texture* data, GLenum target, GLenum sized_format, const subresource_range& range, const GLenum* argb_swizzle) { m_target = target; diff --git a/rpcs3/Emu/RSX/GL/glutils/image.h b/rpcs3/Emu/RSX/GL/glutils/image.h index 4112d833c7..6af4d28fa1 100644 --- a/rpcs3/Emu/RSX/GL/glutils/image.h +++ b/rpcs3/Emu/RSX/GL/glutils/image.h @@ -4,6 +4,7 @@ #include "Utilities/geometry.h" #include "Emu/RSX/Common/TextureUtils.h" +#include "Emu/RSX/Common/io_buffer.h" //using enum rsx::format_class; using namespace ::rsx::format_class_; @@ -321,22 +322,24 @@ namespace gl } // Data management - void copy_from(const void* src, texture::format format, texture::type type, int level, const coord3u region, const pixel_unpack_settings& pixel_settings); + void copy_from(const rsx::io_buffer& src, texture::format format, texture::type type, int level, const coord3u region, const pixel_unpack_settings& pixel_settings); - void copy_from(buffer& buf, u32 gl_format_type, u32 offset, u32 length); + void copy_from(buffer& buf, GLsizeiptr offset, texture::format format, texture::type type, int level, const coord3u region, const pixel_unpack_settings& pixel_settings); void copy_from(buffer_view& view); - void copy_to(void* dst, texture::format format, texture::type type, int level, const coord3u& region, const pixel_pack_settings& pixel_settings) const; + void copy_to(const rsx::io_buffer& dst, texture::format format, texture::type type, int level, const coord3u& region, const pixel_pack_settings& pixel_settings) const; + + void copy_to(buffer& buf, GLsizeiptr offset, texture::format format, texture::type type, int level, const coord3u& region, const pixel_pack_settings& pixel_settings) const; // Convenience wrappers - void copy_from(const void* src, texture::format format, texture::type type, const pixel_unpack_settings& pixel_settings) + void copy_from(const rsx::io_buffer& src, texture::format format, texture::type type, const pixel_unpack_settings& pixel_settings) { const coord3u region = { {}, size3D() }; copy_from(src, format, type, 0, region, pixel_settings); } - void copy_to(void* dst, texture::format format, texture::type type, const pixel_pack_settings& pixel_settings) const + void copy_to(const rsx::io_buffer& dst, texture::format format, texture::type type, const pixel_pack_settings& pixel_settings) const { const coord3u region = { {}, size3D() }; copy_to(dst, format, type, 0, region, pixel_settings); diff --git a/rpcs3/Emu/RSX/Overlays/overlay_controls.h b/rpcs3/Emu/RSX/Overlays/overlay_controls.h index 96090d1597..dd9dd98f4d 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_controls.h +++ b/rpcs3/Emu/RSX/Overlays/overlay_controls.h @@ -5,6 +5,7 @@ #include "Emu/localized_string.h" #include +#include // Definitions for common UI controls and their routines namespace rsx @@ -39,6 +40,9 @@ namespace rsx image_info_base() {} virtual ~image_info_base() {} virtual const u8* get_data() const = 0; + virtual usz size_bytes() const { return static_cast(w * h * bpp); } + + std::span as_span() const { return { get_data(), size_bytes() }; } }; struct image_info : public image_info_base @@ -56,6 +60,7 @@ namespace rsx void load_data(const std::vector& bytes, bool grayscaled = false); const u8* get_data() const override { return channels == 4 ? data : data_grey.empty() ? nullptr : data_grey.data(); } + usz size_bytes() const override { return data_grey.size(); } }; struct resource_config From 1e16b338b4303984d81a1075f6ad68bfcaf2aa63 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sat, 7 Mar 2026 03:04:59 +0300 Subject: [PATCH 027/295] gl: Add support for named objects --- rpcs3/Emu/RSX/GL/GLProcTable.h | 1 + rpcs3/Emu/RSX/GL/glutils/common.h | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/rpcs3/Emu/RSX/GL/GLProcTable.h b/rpcs3/Emu/RSX/GL/GLProcTable.h index 5278014b5c..ad8943bd4f 100644 --- a/rpcs3/Emu/RSX/GL/GLProcTable.h +++ b/rpcs3/Emu/RSX/GL/GLProcTable.h @@ -259,6 +259,7 @@ OPENGL_PROC(PFNGLDELETESYNCPROC, DeleteSync); // KHR_debug OPENGL_PROC(PFNGLDEBUGMESSAGECALLBACKPROC, DebugMessageCallback); +OPENGL_PROC(PFNGLOBJECTLABELPROC, ObjectLabel); // Immutable textures OPENGL_PROC(PFNGLTEXSTORAGE1DPROC, TexStorage1D); diff --git a/rpcs3/Emu/RSX/GL/glutils/common.h b/rpcs3/Emu/RSX/GL/glutils/common.h index f99c3590a6..a147a6e754 100644 --- a/rpcs3/Emu/RSX/GL/glutils/common.h +++ b/rpcs3/Emu/RSX/GL/glutils/common.h @@ -76,6 +76,26 @@ namespace gl } }; + template + struct named_object + { + protected: + GLuint m_id = GL_NONE; + std::string m_name = "Unnamed"; + + public: + void set_name(std::string_view name) + { + m_name = name.data(); + glObjectLabel(Ns, m_id, name.length(), name.data()); + } + + std::string_view name() const + { + return m_name; + } + }; + // Very useful util when capturing traces with RenderDoc static inline void push_debug_label(const char* label) { From 0ea692e9ab1f9bdf793eb539773ee372e514fadb Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sat, 7 Mar 2026 03:06:45 +0300 Subject: [PATCH 028/295] gl: Use named_object as the base class for images --- rpcs3/Emu/RSX/GL/glutils/image.cpp | 2 ++ rpcs3/Emu/RSX/GL/glutils/image.h | 7 +++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/glutils/image.cpp b/rpcs3/Emu/RSX/GL/glutils/image.cpp index b70a61f367..4760bb1cc9 100644 --- a/rpcs3/Emu/RSX/GL/glutils/image.cpp +++ b/rpcs3/Emu/RSX/GL/glutils/image.cpp @@ -410,6 +410,8 @@ namespace gl auto view = std::make_unique(this, swizzle, aspect_flags); auto result = view.get(); views.emplace(key, std::move(view)); + + result->set_name(fmt::format("%s_%x", name(), remap.encoded)); return result; } diff --git a/rpcs3/Emu/RSX/GL/glutils/image.h b/rpcs3/Emu/RSX/GL/glutils/image.h index 6af4d28fa1..bd974c226a 100644 --- a/rpcs3/Emu/RSX/GL/glutils/image.h +++ b/rpcs3/Emu/RSX/GL/glutils/image.h @@ -59,7 +59,7 @@ namespace gl GLuint num_layers; }; - class texture + class texture : public named_object { friend class texture_view; @@ -181,7 +181,6 @@ namespace gl }; protected: - GLuint m_id = GL_NONE; GLuint m_width = 0; GLuint m_height = 0; GLuint m_depth = 0; @@ -346,10 +345,9 @@ namespace gl } }; - class texture_view + class texture_view : public named_object { protected: - GLuint m_id = GL_NONE; GLenum m_target = 0; GLenum m_format = 0; GLenum m_view_format = 0; @@ -465,6 +463,7 @@ namespace gl class viewable_image : public texture { + protected: std::unordered_map> views; public: From 4a51302c583da4747af60802a1f8c2bf4444ace1 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sat, 7 Mar 2026 03:07:57 +0300 Subject: [PATCH 029/295] gl: Propagate native layout from parent when creating temporary subresources --- rpcs3/Emu/RSX/GL/GLTextureCache.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/rpcs3/Emu/RSX/GL/GLTextureCache.cpp b/rpcs3/Emu/RSX/GL/GLTextureCache.cpp index c2b0e3c252..e01385d51b 100644 --- a/rpcs3/Emu/RSX/GL/GLTextureCache.cpp +++ b/rpcs3/Emu/RSX/GL/GLTextureCache.cpp @@ -179,6 +179,10 @@ namespace gl auto components = get_component_mapping(gcm_format, rsx::component_order::default_); dst->set_native_component_layout(components); } + else + { + dst->set_native_component_layout(src->get_native_component_layout()); + } return dst->get_view(remap); } From 728d84b1fed0e99b00a7283d58014c4d3024d583 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sat, 7 Mar 2026 03:12:18 +0300 Subject: [PATCH 030/295] gl: Add debug names to some objects --- rpcs3/Emu/RSX/GL/GLTextureCache.cpp | 2 ++ rpcs3/Emu/RSX/GL/GLTextureCache.h | 1 + rpcs3/Emu/RSX/GL/glutils/image.cpp | 2 +- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/rpcs3/Emu/RSX/GL/GLTextureCache.cpp b/rpcs3/Emu/RSX/GL/GLTextureCache.cpp index e01385d51b..f8aa9d95df 100644 --- a/rpcs3/Emu/RSX/GL/GLTextureCache.cpp +++ b/rpcs3/Emu/RSX/GL/GLTextureCache.cpp @@ -152,6 +152,8 @@ namespace gl dst = data.get(); dst->properties_encoding = match_key; m_temporary_surfaces.emplace_back(std::move(data)); + + dst->set_name(fmt::format("[Temp View] id=%u, fmt=0x%x", dst->id(), gcm_format)); } dst->add_ref(); diff --git a/rpcs3/Emu/RSX/GL/GLTextureCache.h b/rpcs3/Emu/RSX/GL/GLTextureCache.h index 704589cccf..8bfc92f902 100644 --- a/rpcs3/Emu/RSX/GL/GLTextureCache.h +++ b/rpcs3/Emu/RSX/GL/GLTextureCache.h @@ -745,6 +745,7 @@ namespace gl gl::upload_texture(cmd, section->get_raw_texture(), gcm_format, input_swizzled, subresource_layout); + section->get_raw_texture()->set_name(fmt::format("Raw Texture @0x%x", rsx_range.start)); section->last_write_tag = rsx::get_shared_tag(); return section; } diff --git a/rpcs3/Emu/RSX/GL/glutils/image.cpp b/rpcs3/Emu/RSX/GL/glutils/image.cpp index 4760bb1cc9..e99a6e15b2 100644 --- a/rpcs3/Emu/RSX/GL/glutils/image.cpp +++ b/rpcs3/Emu/RSX/GL/glutils/image.cpp @@ -411,7 +411,7 @@ namespace gl auto result = view.get(); views.emplace(key, std::move(view)); - result->set_name(fmt::format("%s_%x", name(), remap.encoded)); + result->set_name(fmt::format("%s, remap=%x", name(), remap.encoded)); return result; } From cae8ae63e343ec8acc479016c91a8d93f301b7ed Mon Sep 17 00:00:00 2001 From: kd-11 <15904127+kd-11@users.noreply.github.com> Date: Sat, 7 Mar 2026 13:16:39 +0300 Subject: [PATCH 031/295] gl: Use image dimensions to determine read buffer size --- rpcs3/Emu/RSX/Overlays/overlay_controls.h | 1 - 1 file changed, 1 deletion(-) diff --git a/rpcs3/Emu/RSX/Overlays/overlay_controls.h b/rpcs3/Emu/RSX/Overlays/overlay_controls.h index dd9dd98f4d..f64fdfa47f 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_controls.h +++ b/rpcs3/Emu/RSX/Overlays/overlay_controls.h @@ -60,7 +60,6 @@ namespace rsx void load_data(const std::vector& bytes, bool grayscaled = false); const u8* get_data() const override { return channels == 4 ? data : data_grey.empty() ? nullptr : data_grey.data(); } - usz size_bytes() const override { return data_grey.size(); } }; struct resource_config From 7dad9663b2f411458f79a10b1f341d95e153baf7 Mon Sep 17 00:00:00 2001 From: capriots <29807355+capriots@users.noreply.github.com> Date: Sat, 19 Jul 2025 13:59:21 +0200 Subject: [PATCH 032/295] cellDmuxPamf implementation part 1: SPU thread --- rpcs3/Emu/Cell/Modules/cellDmux.h | 4 +- rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp | 1145 ++++++++++++++++++++++- rpcs3/Emu/Cell/Modules/cellDmuxPamf.h | 661 +++++++++++++ rpcs3/Emu/Cell/Modules/cellPamf.h | 1 + rpcs3/Emu/savestate_utils.cpp | 3 +- 5 files changed, 1789 insertions(+), 25 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/cellDmux.h b/rpcs3/Emu/Cell/Modules/cellDmux.h index 1767165283..7c31bbf105 100644 --- a/rpcs3/Emu/Cell/Modules/cellDmux.h +++ b/rpcs3/Emu/Cell/Modules/cellDmux.h @@ -301,7 +301,7 @@ using CellDmuxCoreOpResetStream = error_code(vm::ptr); using CellDmuxCoreOpCreateThread = error_code(vm::ptr); using CellDmuxCoreOpJoinThread = error_code(vm::ptr); using CellDmuxCoreOpSetStream = error_code(vm::ptr, vm::cptr, u32, b8, u64); -using CellDmuxCoreOpFreeMemory = error_code(vm::ptr, vm::ptr, u32); +using CellDmuxCoreOpReleaseAu = error_code(vm::ptr, vm::ptr, u32); using CellDmuxCoreOpQueryEsAttr = error_code(vm::cptr, vm::cptr, vm::ptr); using CellDmuxCoreOpEnableEs = error_code(vm::ptr, vm::cptr, vm::cptr, vm::cptr>, vm::cptr>, vm::cptr, vm::pptr); using CellDmuxCoreOpDisableEs = u32(vm::ptr); @@ -318,7 +318,7 @@ struct CellDmuxCoreOps vm::bptr createThread; vm::bptr joinThread; vm::bptr setStream; - vm::bptr freeMemory; + vm::bptr releaseAu; vm::bptr queryEsAttr; vm::bptr enableEs; vm::bptr disableEs; diff --git a/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp b/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp index 70162d4031..7c0fd8ec39 100644 --- a/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp +++ b/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp @@ -1,16 +1,1126 @@ #include "stdafx.h" #include "Emu/Cell/PPUModule.h" -#include "Emu/IdManager.h" +#include "Emu/Cell/lv2/sys_sync.h" -#include "cellDmux.h" #include "cellDmuxPamf.h" - +#include vm::gvar g_cell_dmux_core_ops_pamf; vm::gvar g_cell_dmux_core_ops_raw_es; LOG_CHANNEL(cellDmuxPamf) +inline std::pair dmuxPamfStreamIdToTypeChannel(u16 stream_id, u16 private_stream_id) +{ + if ((stream_id & 0xf0) == 0xe0) + { + return { DMUX_PAMF_STREAM_TYPE_INDEX_VIDEO, stream_id & 0x0f }; + } + + if ((stream_id & 0xff) != 0xbd) + { + return { DMUX_PAMF_STREAM_TYPE_INDEX_INVALID, 0 }; + } + + switch (private_stream_id & 0xf0) + { + case 0x40: return { DMUX_PAMF_STREAM_TYPE_INDEX_LPCM, private_stream_id & 0x0f }; + case 0x30: return { DMUX_PAMF_STREAM_TYPE_INDEX_AC3, private_stream_id & 0x0f }; + case 0x00: return { DMUX_PAMF_STREAM_TYPE_INDEX_ATRACX, private_stream_id & 0x0f }; + case 0x20: return { DMUX_PAMF_STREAM_TYPE_INDEX_USER_DATA, private_stream_id & 0x0f }; + default: return { DMUX_PAMF_STREAM_TYPE_INDEX_INVALID, 0 }; + } +} + + +// SPU thread + +void dmux_pamf_base::output_queue::pop_back(u32 au_size) +{ + ensure(back - au_size >= buffer.data(), "Invalid au_size"); + back -= au_size; +} + +void dmux_pamf_base::output_queue::pop_back(u8* au_addr) +{ + ensure(au_addr >= buffer.data() && au_addr < std::to_address(buffer.end()), "Invalid au_addr"); + + // If au_begin is in front of the back pointer, unwrap the back pointer (there are no more access units behind the back pointer) + if (au_addr > back) + { + wrap_pos = buffer.data(); + } + + back = au_addr; +} + +void dmux_pamf_base::output_queue::pop_front(u32 au_size) +{ + ensure(front + au_size <= std::to_address(buffer.end()), "Invalid au_size"); + front += au_size; + + // When front reaches wrap_pos, unwrap the queue + if (wrap_pos != buffer.data() && wrap_pos <= front) + { + ensure(wrap_pos == front, "Invalid au_size"); + front = buffer.data(); + wrap_pos = buffer.data(); + } +} + +void dmux_pamf_base::output_queue::push_unchecked(const access_unit_chunk& au_chunk) +{ + std::ranges::copy(au_chunk.cached_data, back); + std::ranges::copy(au_chunk.data, back + au_chunk.cached_data.size()); + back += au_chunk.data.size() + au_chunk.cached_data.size(); +} + +bool dmux_pamf_base::output_queue::push(const access_unit_chunk& au_chunk, const std::function& on_fatal_error) +{ + // If there are any unconsumed access units behind the back pointer, the distance between the front and back pointers is the remaining capacity, + // otherwise the distance between the end of the buffer and the back pointer is the remaining capacity + if (wrap_pos == buffer.data()) + { + // Since it was already checked if there is enough space for au_max_size, this can only occur if the current access unit is larger than au_max_size + if (au_chunk.data.size() + au_chunk.cached_data.size() > static_cast(std::to_address(buffer.end()) - back)) + { + cellDmuxPamf.error("Access unit larger than specified maximum access unit size"); + on_fatal_error(); + return false; + } + } + else if (au_chunk.data.size() + au_chunk.cached_data.size() + 0x10 > static_cast(front - back)) // + sizeof(v128) because of SPU shenanigans probably + { + return false; + } + + push_unchecked(au_chunk); + return true; +} + +bool dmux_pamf_base::output_queue::prepare_next_au(u32 au_max_size) +{ + // LLE always checks the distance between the end of the buffer and the back pointer, even if the back pointer is wrapped around and there are unconsumed access units behind it + if (std::to_address(buffer.end()) - back < au_max_size) + { + // Can't wrap the back pointer around again as long as there are unconsumed access units behind it + if (wrap_pos != buffer.data()) + { + return false; + } + + wrap_pos = back; + back = buffer.data(); + } + + return true; +} + +void dmux_pamf_base::elementary_stream::flush_es() +{ + if (current_au.accumulated_size != 0) + { + ensure(au_queue.get_free_size() >= cache.size()); + au_queue.push_unchecked({ {}, cache }); + + current_au.accumulated_size += static_cast(cache.size()); + + ctx.on_au_found(get_stream_id().first, get_stream_id().second, user_data, { au_queue.peek_back(current_au.accumulated_size), current_au.accumulated_size }, current_au.pts, current_au.dts, + current_au.rap, au_specific_info_size, current_au.au_specific_info_buf); + } + + reset(); + + while (!ctx.on_flush_done(get_stream_id().first, get_stream_id().second, user_data)) {} // The flush_done event is repeatedly fired until it succeeds +} + +void dmux_pamf_base::elementary_stream::reset_es(u8* au_addr) +{ + if (!au_addr) + { + reset(); + au_queue.clear(); + } + else + { + au_queue.pop_back(au_addr); + } +} + +void dmux_pamf_base::elementary_stream::discard_access_unit() +{ + au_queue.pop_back(current_au.accumulated_size - static_cast(au_chunk.data.size() + au_chunk.cached_data.size())); + reset(); + cache.clear(); +} + +template +u32 dmux_pamf_base::elementary_stream::parse_audio_stream_header(std::span pes_packet_data) +{ + u32 extra_header_size_unk = 0; // No clue what this is, I have not found a single instance in any PAMF stream where it is something other than zero + + if (!au_size_unk) // For some reason, LLE uses the member that stores the size of user data access units here as bool + { + // Not checked on LLE + if (pes_packet_data.size() < sizeof(u32)) + { + return umax; + } + + extra_header_size_unk = read_from_ptr>(pes_packet_data) & extra_header_size_unk_mask; + au_size_unk = true; + } + + return extra_header_size_unk + sizeof(u32); +} + +bool dmux_pamf_base::elementary_stream::process_pes_packet_data() +{ + ensure(pes_packet_data, "set_pes_packet_data() should be used before process_stream()"); + + for (;;) + { + switch (state) + { + case state::initial: + if (stream_chunk.empty()) + { + pes_packet_data.reset(); + return true; + } + + // Parse the current stream section and increment the reading position by the amount that was consumed + stream_chunk = stream_chunk.subspan(parse_stream(stream_chunk)); + + current_au.accumulated_size += static_cast(au_chunk.data.size() + au_chunk.cached_data.size()); + + // If the beginning of a new access unit was found, set the current timestamps and rap indicator + if (!current_au.timestamps_rap_set && (current_au.state == access_unit::state::commenced || current_au.state == access_unit::state::m2v_sequence + || (current_au.state == access_unit::state::complete && au_chunk.cached_data.empty()))) + { + set_au_timestamps_rap(); + } + + state = state::pushing_au_queue; + [[fallthrough]]; + + case state::pushing_au_queue: + if (!au_chunk.data.empty() || !au_chunk.cached_data.empty()) + { + if (!au_queue.push(au_chunk, std::bind_front(&dmux_pamf_base::on_fatal_error, &ctx))) + { + ctx.on_au_queue_full(); + return false; + } + + au_chunk.data = {}; + au_chunk.cached_data.clear(); + } + + // This happens if the distance between two delimiters is greater than the size indicated in the info header of the stream. + if (current_au.state == access_unit::state::size_mismatch) + { + // LLE cuts off one byte from the beginning of the current PES packet data and then starts over. + pes_packet_data = pes_packet_data->subspan<1>(); + stream_chunk = *pes_packet_data; + + // It also removes the entire current access unit from the queue, even if it began in an earlier PES packet + au_queue.pop_back(current_au.accumulated_size); + current_au.accumulated_size = 0; + + state = state::initial; + continue; + } + + state = state::notifying_au_found; + [[fallthrough]]; + + case state::notifying_au_found: + if (current_au.state == access_unit::state::complete && !ctx.on_au_found(get_stream_id().first, get_stream_id().second, user_data, + { au_queue.peek_back(current_au.accumulated_size), current_au.accumulated_size }, current_au.pts, current_au.dts, current_au.rap, au_specific_info_size, current_au.au_specific_info_buf)) + { + return false; + } + + state = state::preparing_for_next_au; + [[fallthrough]]; + + case state::preparing_for_next_au: + if (current_au.state == access_unit::state::complete) + { + if (!au_queue.prepare_next_au(au_max_size)) + { + ctx.on_au_queue_full(); + return false; + } + + current_au = {}; + } + + state = state::initial; + } + } +} + +template +u32 dmux_pamf_base::video_stream::parse_stream(std::span stream) +{ + if (current_au.state != access_unit::state::none && (avc || current_au.state != access_unit::state::m2v_sequence)) + { + current_au.state = access_unit::state::incomplete; + } + + // Concatenate the cache of the previous stream section and the beginning of the current section + std::array buf{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; // Prevent false positives (M2V pic start code ends with 0x00) + ensure(cache.size() <= 3, "The size of the cache should never exceed three bytes"); + std::ranges::copy(cache, buf.begin()); + std::copy_n(stream.begin(), std::min(sizeof(u32) - 1, stream.size()), buf.begin() + cache.size()); // Not entirely accurate: LLE always reads three bytes from the stream, even if it is smaller than that + + auto au_chunk_begin = stream.begin(); + s32 cache_idx = 0; + auto stream_it = stream.begin(); + [&] + { + // Search for delimiter in cache + for (; cache_idx < static_cast(cache.size()); cache_idx++) + { + if (const be_t code = read_from_ptr>(buf.data() + cache_idx); + (avc && code == AVC_AU_DELIMITER) || (!avc && (code == M2V_PIC_START || code == M2V_SEQUENCE_HEADER || code == M2V_SEQUENCE_END))) + { + if (current_au.state != access_unit::state::none && (avc || current_au.state != access_unit::state::m2v_sequence)) + { + // The sequence end code is included in the access unit + // LLE increments the stream pointer instead of the cache index, which will cause the access unit to be corrupted at the end + if (!avc && code == M2V_SEQUENCE_END) + { + cellDmuxPamf.warning("M2V sequence end code in cache"); + stream_it += std::min(sizeof(u32), stream.size()); // Not accurate, LLE always increments by four, regardless of the stream size + } + + current_au.state = access_unit::state::complete; + return; + } + + // If current_au.state is none and there was a delimiter found here, then LLE outputs the entire cache, even if the access unit starts at cache_idx > 0 + + current_au.state = avc || code == M2V_PIC_START ? access_unit::state::commenced : access_unit::state::m2v_sequence; + } + } + + // Search for delimiter in stream + for (; stream_it <= stream.end() - sizeof(u32); stream_it++) + { + if (const be_t code = read_from_ptr>(stream_it); + (avc && code == AVC_AU_DELIMITER) || (!avc && (code == M2V_PIC_START || code == M2V_SEQUENCE_HEADER || code == M2V_SEQUENCE_END))) + { + if (current_au.state != access_unit::state::none && (avc || current_au.state != access_unit::state::m2v_sequence)) + { + stream_it += !avc && code == M2V_SEQUENCE_END ? sizeof(u32) : 0; // The sequence end code is included in the access unit + current_au.state = access_unit::state::complete; + return; + } + + au_chunk_begin = avc || current_au.state == access_unit::state::none ? stream_it : au_chunk_begin; + current_au.state = avc || code == M2V_PIC_START ? access_unit::state::commenced : access_unit::state::m2v_sequence; + } + } + }(); + + if (current_au.state != access_unit::state::none) + { + au_chunk.data = { au_chunk_begin, stream_it }; + std::copy_n(cache.begin(), cache_idx, std::back_inserter(au_chunk.cached_data)); + cache.erase(cache.begin(), cache.begin() + cache_idx); + } + + // Cache the end of the stream if an access unit wasn't completed. There could be the beginning of a delimiter in the last three bytes + if (current_au.state != access_unit::state::complete) + { + std::copy(stream_it, stream.end(), std::back_inserter(cache)); + } + + return static_cast((current_au.state != access_unit::state::complete || stream_it > stream.end() ? stream.end() : stream_it) - stream.begin()); +} + +u32 dmux_pamf_base::lpcm_stream::parse_stream_header(std::span pes_packet_data, [[maybe_unused]] s8 pts_dts_flag) +{ + // Not checked on LLE + if (pes_packet_data.size() < sizeof(u8) + 0x10) + { + return umax; + } + + std::memcpy(au_specific_info_buf.data(), &pes_packet_data[1], au_specific_info_buf.size()); + return parse_audio_stream_header<0x7ff>(pes_packet_data); +} + +u32 dmux_pamf_base::lpcm_stream::parse_stream(std::span stream) +{ + if (current_au.state == access_unit::state::none) + { + current_au.au_specific_info_buf = au_specific_info_buf; + } + + if (au_max_size - current_au.accumulated_size > stream.size()) + { + au_chunk.data = stream; + current_au.state = current_au.state == access_unit::state::none ? access_unit::state::commenced : access_unit::state::incomplete; + } + else + { + au_chunk.data = stream.first(au_max_size - current_au.accumulated_size); + current_au.state = access_unit::state::complete; + } + + return static_cast(au_chunk.data.size()); +} + +template +u32 dmux_pamf_base::audio_stream::parse_stream(std::span stream) +{ + const auto parse_au_size = [](be_t data) -> u16 + { + if constexpr (ac3) + { + if (const u8 fscod = data >> 14, frmsizecod = data >> 8 & 0x3f; fscod < 3 && frmsizecod < 38) + { + return AC3_FRMSIZE_TABLE[fscod][frmsizecod] * sizeof(s16); + } + } + else if ((data & 0x3ff) < 0x200) + { + return ((data & 0x3ff) + 1) * 8 + ATRACX_ATS_HEADER_SIZE; + } + + return 0; + }; + + if (current_au.state != access_unit::state::none) + { + current_au.state = access_unit::state::incomplete; + } + + // Concatenate the cache of the previous stream section and the beginning of the current section + std::array buf{}; + ensure(cache.size() <= 3, "The size of the cache should never exceed three bytes"); + std::ranges::copy(cache, buf.begin()); + std::copy_n(stream.begin(), std::min(sizeof(u16) - 1, stream.size()), buf.begin() + cache.size()); + + auto au_chunk_begin = stream.begin(); + s32 cache_idx = 0; + auto stream_it = stream.begin(); + [&] + { + // Search for delimiter in cache + for (; cache_idx <= static_cast(cache.size() + std::min(sizeof(u16) - 1, stream.size()) - sizeof(u16)); cache_idx++) + { + if (const be_t tmp = read_from_ptr>(buf.data() + cache_idx); current_au.size_info_offset != 0) + { + if (--current_au.size_info_offset == 0) + { + current_au.parsed_size = parse_au_size(tmp); + } + } + else if (tmp == SYNC_WORD) + { + if (current_au.state == access_unit::state::none) + { + // If current_au.state is none and there was a delimiter found here, then LLE outputs the entire cache, even if the access unit starts at cache_idx > 0 + + current_au.size_info_offset = ac3 ? sizeof(u16) * 2 : sizeof(u16); + current_au.state = access_unit::state::commenced; + } + else if (const u32 au_size = current_au.accumulated_size + cache_idx; au_size >= current_au.parsed_size) + { + current_au.state = au_size == current_au.parsed_size ? access_unit::state::complete : access_unit::state::size_mismatch; + return; + } + } + } + + // As long as the current access unit hasn't reached the size indicated in its header, we don't need to parse the stream + if (current_au.state != access_unit::state::none && current_au.size_info_offset == 0 && current_au.accumulated_size + cache.size() < current_au.parsed_size) + { + stream_it += std::min(current_au.parsed_size - current_au.accumulated_size - cache.size(), stream.size() - sizeof(u32)); + } + + // Search for delimiter in stream + for (; stream_it <= stream.end() - sizeof(u32); stream_it++) // LLE uses sizeof(u32), even though the delimiter is only two bytes large + { + if (const be_t tmp = read_from_ptr>(stream_it); current_au.size_info_offset != 0) + { + if (--current_au.size_info_offset == 0) + { + current_au.parsed_size = parse_au_size(tmp); + } + } + else if (tmp == SYNC_WORD) + { + if (current_au.state == access_unit::state::none) + { + au_chunk_begin = stream_it; + current_au.size_info_offset = ac3 ? sizeof(u16) * 2 : sizeof(u16); + current_au.state = access_unit::state::commenced; + } + else if (const u32 au_size = static_cast(current_au.accumulated_size + stream_it - au_chunk_begin + cache.size()); au_size >= current_au.parsed_size) + { + current_au.state = au_size == current_au.parsed_size ? access_unit::state::complete : access_unit::state::size_mismatch; + return; + } + } + } + }(); + + if (current_au.state != access_unit::state::none) + { + au_chunk.data = { au_chunk_begin, stream_it }; + std::copy_n(cache.begin(), cache_idx, std::back_inserter(au_chunk.cached_data)); + cache.erase(cache.begin(), cache.begin() + cache_idx); + } + + // Cache the end of the stream if an access unit wasn't completed. There could be the beginning of a delimiter in the last three bytes + if (current_au.state != access_unit::state::complete && current_au.state != access_unit::state::size_mismatch) + { + std::copy(stream_it, stream.end(), std::back_inserter(cache)); + } + + return static_cast((current_au.state != access_unit::state::complete ? stream.end() : stream_it) - stream.begin()); +} + +u32 dmux_pamf_base::user_data_stream::parse_stream_header(std::span pes_packet_data, s8 pts_dts_flag) +{ + if (pts_dts_flag < 0) // PTS field exists + { + // Not checked on LLE + if (pes_packet_data.size() < 2 + sizeof(u32)) + { + return umax; + } + + au_size_unk = read_from_ptr>(pes_packet_data.begin() + 2) - sizeof(u32); + return 10; + } + + return 2; +} + +u32 dmux_pamf_base::user_data_stream::parse_stream(std::span stream) +{ + if (au_size_unk > stream.size()) + { + au_chunk.data = stream; + au_size_unk -= static_cast(stream.size()); + current_au.state = access_unit::state::commenced; // User data streams always use commenced + } + else + { + au_chunk.data = stream.first(au_size_unk); + au_size_unk = 0; + current_au.state = access_unit::state::complete; + } + + return static_cast(stream.size()); // Always consume the entire stream +} + +bool dmux_pamf_base::enable_es(u32 stream_id, u32 private_stream_id, bool is_avc, std::span au_queue_buffer, u32 au_max_size, bool raw_es, u32 user_data) +{ + const auto [type_idx, channel] = dmuxPamfStreamIdToTypeChannel(stream_id, private_stream_id); + + if (type_idx == DMUX_PAMF_STREAM_TYPE_INDEX_INVALID || elementary_stream::is_enabled(elementary_streams[type_idx][channel])) + { + return false; + } + + this->raw_es = raw_es; + pack_es_type_idx = type_idx; + + switch (type_idx) + { + case DMUX_PAMF_STREAM_TYPE_INDEX_VIDEO: + elementary_streams[0][channel] = is_avc ? static_cast>(std::make_unique>(channel, au_max_size, *this, user_data, au_queue_buffer)) + : std::make_unique>(channel, au_max_size, *this, user_data, au_queue_buffer); + return true; + + case DMUX_PAMF_STREAM_TYPE_INDEX_LPCM: elementary_streams[1][channel] = std::make_unique(channel, au_max_size, *this, user_data, au_queue_buffer); return true; + case DMUX_PAMF_STREAM_TYPE_INDEX_AC3: elementary_streams[2][channel] = std::make_unique>(channel, au_max_size, *this, user_data, au_queue_buffer); return true; + case DMUX_PAMF_STREAM_TYPE_INDEX_ATRACX: elementary_streams[3][channel] = std::make_unique>(channel, au_max_size, *this, user_data, au_queue_buffer); return true; + case DMUX_PAMF_STREAM_TYPE_INDEX_USER_DATA: elementary_streams[4][channel] = std::make_unique(channel, au_max_size, *this, user_data, au_queue_buffer); return true; + default: fmt::throw_exception("Unreachable"); + } +} + +bool dmux_pamf_base::disable_es(u32 stream_id, u32 private_stream_id) +{ + const auto [type_idx, channel] = dmuxPamfStreamIdToTypeChannel(stream_id, private_stream_id); + + if (type_idx == DMUX_PAMF_STREAM_TYPE_INDEX_INVALID || !elementary_stream::is_enabled(elementary_streams[type_idx][channel])) + { + return false; + } + + elementary_streams[type_idx][channel] = nullptr; + return true; +} + +bool dmux_pamf_base::release_au(u32 stream_id, u32 private_stream_id, u32 au_size) const +{ + const auto [type_idx, channel] = dmuxPamfStreamIdToTypeChannel(stream_id, private_stream_id); + + if (type_idx == DMUX_PAMF_STREAM_TYPE_INDEX_INVALID || !elementary_stream::is_enabled(elementary_streams[type_idx][channel])) + { + return false; + } + + elementary_streams[type_idx][channel]->release_au(au_size); + return true; +} + +bool dmux_pamf_base::flush_es(u32 stream_id, u32 private_stream_id) +{ + const auto [type_idx, channel] = dmuxPamfStreamIdToTypeChannel(stream_id, private_stream_id); + + if (type_idx == DMUX_PAMF_STREAM_TYPE_INDEX_INVALID || !elementary_stream::is_enabled(elementary_streams[type_idx][channel])) + { + return false; + } + + state = state::initial; + elementary_streams[type_idx][channel]->flush_es(); + return true; +} + +void dmux_pamf_base::set_stream(std::span stream, bool continuity) +{ + if (!continuity) + { + std::ranges::for_each(elementary_streams | std::views::join | std::views::filter(elementary_stream::is_enabled), &elementary_stream::discard_access_unit); + } + + state = state::initial; + + // Not checked on LLE, it would parse old memory contents or uninitialized memory if the size of the input stream set by the user is not a multiple of 0x800. + // Valid PAMF streams are always a multiple of 0x800 bytes large. + if ((stream.size() & 0x7ff) != 0) + { + cellDmuxPamf.warning("Invalid stream size"); + } + + this->stream = stream; + demux_done_notified = false; +} + +void dmux_pamf_base::reset_stream() +{ + std::ranges::for_each(elementary_streams | std::views::join | std::views::filter(elementary_stream::is_enabled), &elementary_stream::discard_access_unit); + state = state::initial; + stream.reset(); +} + +bool dmux_pamf_base::reset_es(u32 stream_id, u32 private_stream_id, u8* au_addr) +{ + const auto [type_idx, channel] = dmuxPamfStreamIdToTypeChannel(stream_id, private_stream_id); + + if (type_idx == DMUX_PAMF_STREAM_TYPE_INDEX_INVALID || !elementary_stream::is_enabled(elementary_streams[type_idx][channel])) + { + return false; + } + + if (!au_addr) + { + state = state::initial; + } + + elementary_streams[type_idx][channel]->reset_es(au_addr); + return true; +} + +bool dmux_pamf_base::process_next_pack() +{ + if (!stream) + { + demux_done_notified = demux_done_notified || on_demux_done(); + return true; + } + + switch (state) + { + case state::initial: + { + // Search for the next pack start code or prog end code + std::span pack{ static_cast(nullptr), PACK_SIZE }; // This initial value is not used, can't be default constructed + + for (;;) + { + if (stream->empty()) + { + stream.reset(); + demux_done_notified = on_demux_done(); + return true; + } + + pack = stream->subspan<0, PACK_SIZE>(); + stream = stream->subspan(); + + // If the input stream is a raw elementary stream, skip everything MPEG-PS related and go straight to elementary stream parsing + if (raw_es) + { + if (elementary_stream::is_enabled(elementary_streams[pack_es_type_idx][0])) + { + elementary_streams[pack_es_type_idx][0]->set_pes_packet_data(pack); + } + + state = state::elementary_stream; + return true; + } + + // While LLE is actually searching the entire section for a pack start code or program end code, + // it doesn't set its current reading position to the address where it found the code, so it would bug out if there isn't one at the start of the section + + if (const be_t code = read_from_ptr>(pack); code == PACK_START) + { + break; + } + else if (code == PROG_END) + { + if (!on_prog_end()) + { + state = state::prog_end; + } + + return true; + } + + cellDmuxPamf.warning("No start code found at the beginning of the current section"); + } + + // Skip over pack header + const u8 pack_stuffing_length = read_from_ptr(pack.subspan()) & 0x7; + std::span current_pes_packet = pack.subspan(PACK_STUFFING_LENGTH_OFFSET + sizeof(u8) + pack_stuffing_length); + + if (read_from_ptr>(current_pes_packet) >> 8 != PACKET_START_CODE_PREFIX) + { + cellDmuxPamf.error("Invalid start code after pack header"); + return false; + } + + // Skip over system header if present + if (read_from_ptr>(current_pes_packet) == SYSTEM_HEADER) + { + const u32 system_header_length = read_from_ptr>(current_pes_packet.begin() + PES_PACKET_LENGTH_OFFSET) + PES_PACKET_LENGTH_OFFSET + sizeof(u16); + + // Not checked on LLE, the SPU task would just increment the reading position and read random data in the SPU local store + if (system_header_length + PES_HEADER_DATA_LENGTH_OFFSET + sizeof(u8) > current_pes_packet.size()) + { + cellDmuxPamf.error("Invalid system header length"); + return false; + } + + current_pes_packet = current_pes_packet.subspan(system_header_length); + + // The SPU thread isn't doing load + rotate here for 4-byte loading (in valid PAMF streams, the next start code after a system header is always 0x10 byte aligned) + const u32 offset_low = (current_pes_packet.data() - pack.data()) & 0xf; + current_pes_packet = { current_pes_packet.begin() - offset_low, current_pes_packet.end() }; + + if (const be_t code = read_from_ptr>(current_pes_packet); code >> 8 != PACKET_START_CODE_PREFIX) + { + cellDmuxPamf.error("Invalid start code after system header"); + return false; + } + else if (code == PRIVATE_STREAM_2) + { + // A system header is optionally followed by a private stream 2 + // The first two bytes of the stream are the stream id of a video stream. The next access unit of that stream is a random access point/keyframe + + const u16 pes_packet_length = read_from_ptr>(current_pes_packet.begin() + PES_PACKET_LENGTH_OFFSET) + PES_PACKET_LENGTH_OFFSET + sizeof(u16); + + // Not checked on LLE, the SPU task would just increment the reading position and read random data in the SPU local store + if (pes_packet_length + PES_HEADER_DATA_LENGTH_OFFSET + sizeof(u8) > current_pes_packet.size()) + { + cellDmuxPamf.error("Invalid private stream 2 length"); + return false; + } + + if (const u8 channel = read_from_ptr>(current_pes_packet.begin() + PES_PACKET_LENGTH_OFFSET + sizeof(u16)) & 0xf; + elementary_stream::is_enabled(elementary_streams[0][channel])) + { + elementary_streams[0][channel]->set_rap(); + } + + current_pes_packet = current_pes_packet.subspan(pes_packet_length); + } + } + + // Parse PES packet + // LLE only parses the first PES packet per pack (valid PAMF streams only have one PES packet per pack, not including the system header + private stream 2) + + const u32 pes_packet_start_code = read_from_ptr>(current_pes_packet); + + if (pes_packet_start_code >> 8 != PACKET_START_CODE_PREFIX) + { + cellDmuxPamf.error("Invalid start code"); + return false; + } + + // The size of the stream is not checked here because if coming from a pack header, it is guaranteed that there is enough space, + // and if coming from a system header or private stream 2, it was already checked above + const u16 pes_packet_length = read_from_ptr>(current_pes_packet.begin() + PES_PACKET_LENGTH_OFFSET) + PES_PACKET_LENGTH_OFFSET + sizeof(u16); + const u8 pes_header_data_length = read_from_ptr(current_pes_packet.begin() + PES_HEADER_DATA_LENGTH_OFFSET) + PES_HEADER_DATA_LENGTH_OFFSET + sizeof(u8); + + // Not checked on LLE, the SPU task would just increment the reading position and read random data in the SPU local store + if (pes_packet_length > current_pes_packet.size() || pes_packet_length <= pes_header_data_length) + { + cellDmuxPamf.error("Invalid pes packet length"); + return false; + } + + const std::span pes_packet_data = current_pes_packet.subspan(pes_header_data_length, pes_packet_length - pes_header_data_length); + + const auto [type_idx, channel] = dmuxPamfStreamIdToTypeChannel(pes_packet_start_code, read_from_ptr(pes_packet_data)); + + if (type_idx == DMUX_PAMF_STREAM_TYPE_INDEX_INVALID) + { + cellDmuxPamf.error("Invalid stream type"); + return false; + } + + pack_es_type_idx = type_idx; + pack_es_channel = channel; + + if (elementary_stream::is_enabled(elementary_streams[type_idx][channel])) + { + const s8 pts_dts_flag = read_from_ptr(current_pes_packet.begin() + PTS_DTS_FLAG_OFFSET); + + if (pts_dts_flag < 0) + { + // The timestamps should be unsigned, but are sign-extended from s32 to u64 on LLE. They probably forgot about integer promotion + const s32 PTS_32_30 = read_from_ptr(current_pes_packet.begin() + 9) >> 1; + const s32 PTS_29_15 = read_from_ptr>(current_pes_packet.begin() + 10) >> 1; + const s32 PTS_14_0 = read_from_ptr>(current_pes_packet.begin() + 12) >> 1; + + elementary_streams[type_idx][channel]->set_pts(PTS_32_30 << 30 | PTS_29_15 << 15 | PTS_14_0); // Bit 32 is discarded + } + + if (pts_dts_flag & 0x40) + { + const s32 DTS_32_30 = read_from_ptr(current_pes_packet.begin() + 14) >> 1; + const s32 DTS_29_15 = read_from_ptr>(current_pes_packet.begin() + 15) >> 1; + const s32 DTS_14_0 = read_from_ptr>(current_pes_packet.begin() + 17) >> 1; + + elementary_streams[type_idx][channel]->set_dts(DTS_32_30 << 30 | DTS_29_15 << 15 | DTS_14_0); // Bit 32 is discarded + } + + const usz stream_header_size = elementary_streams[type_idx][channel]->parse_stream_header(pes_packet_data, pts_dts_flag); + + // Not checked on LLE, the SPU task would just increment the reading position and read random data in the SPU local store + if (stream_header_size > pes_packet_data.size()) + { + cellDmuxPamf.error("Invalid stream header size"); + return false; + } + + elementary_streams[type_idx][channel]->set_pes_packet_data(pes_packet_data.subspan(stream_header_size)); + } + + state = state::elementary_stream; + [[fallthrough]]; + } + case state::elementary_stream: + { + if (!elementary_stream::is_enabled(elementary_streams[pack_es_type_idx][pack_es_channel]) || elementary_streams[pack_es_type_idx][pack_es_channel]->process_pes_packet_data()) + { + state = state::initial; + } + + return true; + } + case state::prog_end: + { + if (on_prog_end()) + { + state = state::initial; + } + + return true; + } + default: + fmt::throw_exception("Unreachable"); + } +} + +u32 dmux_pamf_base::get_enabled_es_count() const +{ + return static_cast(std::ranges::count_if(elementary_streams | std::views::join, elementary_stream::is_enabled)); +} + +bool dmux_pamf_spu_context::get_next_cmd(DmuxPamfCommand& lhs, bool new_stream) const +{ + cellDmuxPamf.trace("Getting next command"); + + if (cmd_queue->pop(lhs)) + { + cellDmuxPamf.trace("Command type: %d", static_cast(lhs.type.get())); + return true; + } + + if ((new_stream || has_work()) && !wait_for_au_queue && !wait_for_event_queue) + { + cellDmuxPamf.trace("No new command, continuing demuxing"); + return false; + } + + cellDmuxPamf.trace("No new command and nothing to do, waiting..."); + + cmd_queue->wait(); + + if (thread_ctrl::state() == thread_state::aborting) + { + return false; + } + + ensure(cmd_queue->pop(lhs)); + + cellDmuxPamf.trace("Command type: %d", static_cast(lhs.type.get())); + return true; +} + +bool dmux_pamf_spu_context::send_event(auto&&... args) const +{ + if (event_queue->size() >= max_enqueued_events) + { + return false; + } + + return ensure(event_queue->emplace(std::forward(args)..., event_queue_was_too_full)); +} + +void dmux_pamf_spu_context::operator()() // cellSpursMain() +{ + DmuxPamfCommand cmd; + + while (thread_ctrl::state() != thread_state::aborting) + { + if (get_next_cmd(cmd, new_stream)) + { + event_queue_was_too_full = wait_for_event_queue; + wait_for_event_queue = false; + wait_for_au_queue = false; + + ensure(cmd_result_queue->emplace(static_cast(cmd.type.value()) + 1)); + + switch (cmd.type) + { + case DmuxPamfCommandType::enable_es: + max_enqueued_events += 2; + enable_es(cmd.enable_es.stream_id, cmd.enable_es.private_stream_id, cmd.enable_es.is_avc, { cmd.enable_es.au_queue_buffer.get_ptr(), cmd.enable_es.au_queue_buffer_size }, + cmd.enable_es.au_max_size, cmd.enable_es.is_raw_es, cmd.enable_es.user_data); + break; + + case DmuxPamfCommandType::disable_es: + disable_es(cmd.disable_flush_es.stream_id, cmd.disable_flush_es.private_stream_id); + max_enqueued_events -= 2; + break; + + case DmuxPamfCommandType::set_stream: + new_stream = true; + break; + + case DmuxPamfCommandType::release_au: + release_au(cmd.release_au.stream_id, cmd.release_au.private_stream_id, cmd.release_au.au_size); + break; + + case DmuxPamfCommandType::flush_es: + flush_es(cmd.disable_flush_es.stream_id, cmd.disable_flush_es.private_stream_id); + break; + + case DmuxPamfCommandType::close: + while (!send_event(DmuxPamfEventType::close)) {} + return; + + case DmuxPamfCommandType::reset_stream: + reset_stream(); + break; + + case DmuxPamfCommandType::reset_es: + reset_es(cmd.reset_es.stream_id, cmd.reset_es.private_stream_id, cmd.reset_es.au_addr ? cmd.reset_es.au_addr.get_ptr() : nullptr); + break; + + case DmuxPamfCommandType::resume: + break; + + default: + cellDmuxPamf.error("Invalid command"); + return; + } + } + else if (thread_ctrl::state() == thread_state::aborting) + { + return; + } + + // Only set the new stream once the previous one has been entirely consumed + if (new_stream && !has_work()) + { + new_stream = false; + + DmuxPamfStreamInfo stream_info; + ensure(stream_info_queue->pop(stream_info)); + + set_stream({ stream_info.stream_addr.get_ptr(), stream_info.stream_size }, stream_info.continuity); + } + + process_next_pack(); + } +} + +void dmux_pamf_base::elementary_stream::save(utils::serial& ar) +{ + // These need to be saved first since they need to be initialized in the constructor's initializer list + if (ar.is_writing()) + { + ar(au_max_size, user_data); + au_queue.save(ar); + } + + ar(state, au_size_unk, au_specific_info_buf, current_au, pts, dts, rap); + + if (state == state::pushing_au_queue) + { + ar(au_chunk.cached_data); + + if (ar.is_writing()) + { + ar(vm::get_addr(au_chunk.data.data()), static_cast(au_chunk.data.size())); + } + else + { + au_chunk.data = { vm::_ptr(ar.pop()), ar.pop() }; + } + } + + if (current_au.state != access_unit::state::complete) + { + ar(cache); + } + + bool save_stream = !!pes_packet_data; + ar(save_stream); + + if (save_stream) + { + if (ar.is_writing()) + { + ensure(stream_chunk.size() <= pes_packet_data->size()); + ar(vm::get_addr(pes_packet_data->data()), static_cast(pes_packet_data->size()), static_cast(stream_chunk.data() - pes_packet_data->data())); + } + else + { + pes_packet_data = { vm::_ptr(ar.pop()), ar.pop() }; + stream_chunk = { pes_packet_data->begin() + ar.pop(), pes_packet_data->end() }; + } + } +} + +void dmux_pamf_base::save_base(utils::serial& ar) +{ + bool stream_not_consumed = !!stream; + + ar(state, stream_not_consumed, demux_done_notified, pack_es_type_idx, raw_es); + + if (stream_not_consumed) + { + if (ar.is_writing()) + { + ar(vm::get_addr(stream->data()), static_cast(stream->size())); + } + else + { + stream = std::span{ vm::_ptr(ar.pop()), ar.pop() }; + } + } + + if (state == state::elementary_stream) + { + ar(pack_es_channel); + } + + std::array enabled_video_streams; + std::array avc_video_streams; + std::array enabled_lpcm_streams; + std::array enabled_ac3_streams; + std::array enabled_atracx_streams; + std::array enabled_user_data_streams; + + if (ar.is_writing()) + { + std::ranges::transform(elementary_streams[DMUX_PAMF_STREAM_TYPE_INDEX_VIDEO], enabled_video_streams.begin(), elementary_stream::is_enabled); + std::ranges::transform(elementary_streams[DMUX_PAMF_STREAM_TYPE_INDEX_VIDEO], avc_video_streams.begin(), [](auto& es){ return !!dynamic_cast*>(es.get()); }); + std::ranges::transform(elementary_streams[DMUX_PAMF_STREAM_TYPE_INDEX_LPCM], enabled_lpcm_streams.begin(), elementary_stream::is_enabled); + std::ranges::transform(elementary_streams[DMUX_PAMF_STREAM_TYPE_INDEX_AC3], enabled_ac3_streams.begin(), elementary_stream::is_enabled); + std::ranges::transform(elementary_streams[DMUX_PAMF_STREAM_TYPE_INDEX_ATRACX], enabled_atracx_streams.begin(), elementary_stream::is_enabled); + std::ranges::transform(elementary_streams[DMUX_PAMF_STREAM_TYPE_INDEX_USER_DATA], enabled_user_data_streams.begin(), elementary_stream::is_enabled); + } + + ar(enabled_video_streams, avc_video_streams, enabled_lpcm_streams, enabled_ac3_streams, enabled_atracx_streams, enabled_user_data_streams); + + if (ar.is_writing()) + { + std::ranges::for_each(elementary_streams | std::views::join | std::views::filter(elementary_stream::is_enabled), [&](const auto& es){ es->save(ar); }); + } + else + { + for (u32 ch = 0; ch < 0x10; ch++) + { + if (enabled_video_streams[ch]) + { + elementary_streams[DMUX_PAMF_STREAM_TYPE_INDEX_VIDEO][ch] = avc_video_streams[ch] ? static_cast>(std::make_unique>(ar, ch, *this)) + : std::make_unique>(ar, ch, *this); + } + } + + for (u32 ch = 0; ch < 0x10; ch++) + { + if (enabled_lpcm_streams[ch]) + { + elementary_streams[DMUX_PAMF_STREAM_TYPE_INDEX_LPCM][ch] = std::make_unique(ar, ch, *this); + } + } + + for (u32 ch = 0; ch < 0x10; ch++) + { + if (enabled_ac3_streams[ch]) + { + elementary_streams[DMUX_PAMF_STREAM_TYPE_INDEX_AC3][ch] = std::make_unique>(ar, ch, *this); + } + } + + for (u32 ch = 0; ch < 0x10; ch++) + { + if (enabled_atracx_streams[ch]) + { + elementary_streams[DMUX_PAMF_STREAM_TYPE_INDEX_ATRACX][ch] = std::make_unique>(ar, ch, *this); + } + } + + for (u32 ch = 0; ch < 0x10; ch++) + { + if (enabled_user_data_streams[ch]) + { + elementary_streams[DMUX_PAMF_STREAM_TYPE_INDEX_USER_DATA][ch] = std::make_unique(ar, ch, *this); + } + } + } +} + +void dmux_pamf_spu_context::save(utils::serial& ar) +{ + USING_SERIALIZATION_VERSION(cellDmuxPamf); + ar(cmd_queue, new_stream); // The queues are contiguous in guest memory, so we only need to save the address of the first one + save_base(ar); +} + + +// PPU thread + error_code _CellDmuxCoreOpQueryAttr(vm::cptr pamfSpecificInfo, vm::ptr pamfAttr) { cellDmuxPamf.todo("_CellDmuxCoreOpQueryAttr(pamfSpecificInfo=*0x%x, pamfAttr=*0x%x)", pamfSpecificInfo, pamfAttr); @@ -63,9 +1173,9 @@ error_code _CellDmuxCoreOpSetStream(vm::ptr handle, vm::cptr streamA return CELL_OK; } -error_code _CellDmuxCoreOpFreeMemory(vm::ptr esHandle, vm::ptr memAddr, u32 memSize) +error_code _CellDmuxCoreOpReleaseAu(vm::ptr esHandle, vm::ptr memAddr, u32 memSize) { - cellDmuxPamf.todo("_CellDmuxCoreOpFreeMemory(esHandle=*0x%x, memAddr=*0x%x, memSize=0x%x)", esHandle, memAddr, memSize); + cellDmuxPamf.todo("_CellDmuxCoreOpReleaseAu(esHandle=*0x%x, memAddr=*0x%x, memSize=0x%x)", esHandle, memAddr, memSize); return CELL_OK; } @@ -116,6 +1226,7 @@ error_code _CellDmuxCoreOpResetStreamAndWaitDone(vm::ptr handle) return CELL_OK; } +template static void init_gvar(const vm::gvar& var) { var->queryAttr.set(g_fxo->get().func_addr(FIND_FUNC(_CellDmuxCoreOpQueryAttr))); @@ -124,7 +1235,10 @@ static void init_gvar(const vm::gvar& var) var->resetStream.set(g_fxo->get().func_addr(FIND_FUNC(_CellDmuxCoreOpResetStream))); var->createThread.set(g_fxo->get().func_addr(FIND_FUNC(_CellDmuxCoreOpCreateThread))); var->joinThread.set(g_fxo->get().func_addr(FIND_FUNC(_CellDmuxCoreOpJoinThread))); - var->freeMemory.set(g_fxo->get().func_addr(FIND_FUNC(_CellDmuxCoreOpFreeMemory))); + var->setStream.set(g_fxo->get().func_addr(FIND_FUNC(_CellDmuxCoreOpSetStream))); + var->releaseAu.set(g_fxo->get().func_addr(FIND_FUNC(_CellDmuxCoreOpReleaseAu))); + var->queryEsAttr.set(g_fxo->get().func_addr(FIND_FUNC(_CellDmuxCoreOpQueryEsAttr))); + var->enableEs.set(g_fxo->get().func_addr(FIND_FUNC(_CellDmuxCoreOpEnableEs))); var->disableEs.set(g_fxo->get().func_addr(FIND_FUNC(_CellDmuxCoreOpDisableEs))); var->flushEs.set(g_fxo->get().func_addr(FIND_FUNC(_CellDmuxCoreOpFlushEs))); var->resetEs.set(g_fxo->get().func_addr(FIND_FUNC(_CellDmuxCoreOpResetEs))); @@ -133,21 +1247,8 @@ static void init_gvar(const vm::gvar& var) DECLARE(ppu_module_manager::cellDmuxPamf)("cellDmuxPamf", [] { - REG_VNID(cellDmuxPamf, 0x28b2b7b2, g_cell_dmux_core_ops_pamf).init = [] - { - g_cell_dmux_core_ops_pamf->setStream.set(g_fxo->get().func_addr(FIND_FUNC(_CellDmuxCoreOpSetStream))); - g_cell_dmux_core_ops_pamf->queryEsAttr.set(g_fxo->get().func_addr(FIND_FUNC(_CellDmuxCoreOpQueryEsAttr))); - g_cell_dmux_core_ops_pamf->enableEs.set(g_fxo->get().func_addr(FIND_FUNC(_CellDmuxCoreOpEnableEs))); - init_gvar(g_cell_dmux_core_ops_pamf); - }; - - REG_VNID(cellDmuxPamf, 0x9728a0e9, g_cell_dmux_core_ops_raw_es).init = [] - { - g_cell_dmux_core_ops_raw_es->setStream.set(g_fxo->get().func_addr(FIND_FUNC(_CellDmuxCoreOpSetStream))); - g_cell_dmux_core_ops_raw_es->queryEsAttr.set(g_fxo->get().func_addr(FIND_FUNC(_CellDmuxCoreOpQueryEsAttr))); - g_cell_dmux_core_ops_raw_es->enableEs.set(g_fxo->get().func_addr(FIND_FUNC(_CellDmuxCoreOpEnableEs))); - init_gvar(g_cell_dmux_core_ops_raw_es); - }; + REG_VNID(cellDmuxPamf, 0x28b2b7b2, g_cell_dmux_core_ops_pamf).init = []{ init_gvar(g_cell_dmux_core_ops_pamf); }; + REG_VNID(cellDmuxPamf, 0x9728a0e9, g_cell_dmux_core_ops_raw_es).init = []{ init_gvar(g_cell_dmux_core_ops_raw_es); }; REG_HIDDEN_FUNC(_CellDmuxCoreOpQueryAttr); REG_HIDDEN_FUNC(_CellDmuxCoreOpOpen); @@ -157,7 +1258,7 @@ DECLARE(ppu_module_manager::cellDmuxPamf)("cellDmuxPamf", [] REG_HIDDEN_FUNC(_CellDmuxCoreOpJoinThread); REG_HIDDEN_FUNC(_CellDmuxCoreOpSetStream); REG_HIDDEN_FUNC(_CellDmuxCoreOpSetStream); - REG_HIDDEN_FUNC(_CellDmuxCoreOpFreeMemory); + REG_HIDDEN_FUNC(_CellDmuxCoreOpReleaseAu); REG_HIDDEN_FUNC(_CellDmuxCoreOpQueryEsAttr); REG_HIDDEN_FUNC(_CellDmuxCoreOpQueryEsAttr); REG_HIDDEN_FUNC(_CellDmuxCoreOpEnableEs); diff --git a/rpcs3/Emu/Cell/Modules/cellDmuxPamf.h b/rpcs3/Emu/Cell/Modules/cellDmuxPamf.h index 01983b724a..c720fb89c5 100644 --- a/rpcs3/Emu/Cell/Modules/cellDmuxPamf.h +++ b/rpcs3/Emu/Cell/Modules/cellDmuxPamf.h @@ -1,5 +1,666 @@ #pragma once +#include "Emu/savestate_utils.hpp" +#include "Utilities/Thread.h" +#include "cellPamf.h" +#include "cellDmux.h" +#include + +// Replacement for CellSpursQueue +template requires(std::is_trivial_v && max_num_of_entries > 0) +class alignas(0x80) dmux_pamf_hle_spurs_queue +{ + T* buffer; + + alignas(atomic_t) std::array)> _size; // Stored in a byte array since the PPU context needs to be trivial + u32 front; + u32 back; + + template + bool _pop(T* lhs) + { + atomic_t& _size = *std::launder(reinterpret_cast*>(this->_size.data())); + + if (_size == 0) + { + return false; + } + + if (lhs) + { + *lhs = buffer[front]; + } + + if constexpr (!is_peek) + { + front = (front + 1) % max_num_of_entries; + _size--; + _size.notify_one(); + } + + return true; + } + +public: + void init(T (&buffer)[max_num_of_entries]) + { + this->buffer = buffer; + new (_size.data()) atomic_t(0); + front = 0; + back = 0; + } + + bool pop(T& lhs) { return _pop(&lhs); } + bool pop() { return _pop(nullptr); } + bool peek(T& lhs) const { return const_cast(this)->_pop(&lhs); } + bool emplace(auto&&... args) + { + atomic_t& _size = *std::launder(reinterpret_cast*>(this->_size.data())); + + if (_size >= max_num_of_entries) + { + return false; + } + + new (&buffer[back]) T(std::forward(args)...); + + back = (back + 1) % max_num_of_entries; + _size++; + _size.notify_one(); + + return true; + } + + [[nodiscard]] u32 size() const { return std::launder(reinterpret_cast*>(this->_size.data()))->observe(); } + + void wait() const + { + const atomic_t& _size = *std::launder(reinterpret_cast*>(this->_size.data())); + + while (_size == 0 && thread_ctrl::state() != thread_state::aborting) + { + thread_ctrl::wait_on(_size, 0); + } + } +}; + +enum class DmuxPamfCommandType : u32 +{ + enable_es = 0, + disable_es = 2, + set_stream = 4, + release_au = 6, + flush_es = 8, + close = 10, + reset_stream = 12, + reset_es = 14, + resume = 16, +}; + +struct alignas(0x80) DmuxPamfCommand +{ + be_t type; + + union + { + struct + { + be_t stream_id; + be_t private_stream_id; + be_t is_avc; + vm::bptr au_queue_buffer; + be_t au_queue_buffer_size; + be_t au_max_size; + be_t au_specific_info_size; + be_t is_raw_es; + be_t user_data; + } + enable_es; + + struct + { + be_t stream_id; + be_t private_stream_id; + } + disable_flush_es; + + struct + { + vm::ptr> au_addr; + be_t au_size; + be_t stream_id; + be_t private_stream_id; + } + release_au; + + struct + { + be_t stream_id; + be_t private_stream_id; + vm::ptr> au_addr; + } + reset_es; + }; + + DmuxPamfCommand() = default; + + DmuxPamfCommand(be_t&& type) + : type(type) + { + } + + DmuxPamfCommand(be_t&& type, const be_t& stream_id, const be_t& private_stream_id) + : type(type), disable_flush_es{ stream_id, private_stream_id } + { + } + + DmuxPamfCommand(be_t&& type, const be_t& stream_id, const be_t& private_stream_id, const vm::ptr>& au_addr) + : type(type), reset_es{ stream_id, private_stream_id, au_addr } + { + } + + DmuxPamfCommand(be_t&& type, const vm::ptr>& au_addr, const be_t& au_size, const be_t& stream_id, const be_t& private_stream_id) + : type(type), release_au{ au_addr, au_size, stream_id, private_stream_id } + { + } + + DmuxPamfCommand(be_t&& type, const be_t& stream_id, const be_t& private_stream_id, const be_t& is_avc, const vm::bptr& au_queue_buffer, + const be_t& au_queue_buffer_size, const be_t& au_max_size, const be_t& au_specific_info_size, const be_t& is_raw_es, const be_t& user_data) + : type(type), enable_es{ stream_id, private_stream_id, is_avc, au_queue_buffer, au_queue_buffer_size, au_max_size, au_specific_info_size, is_raw_es, user_data } + { + } +}; + +CHECK_SIZE_ALIGN(DmuxPamfCommand, 0x80, 0x80); + +enum class DmuxPamfEventType : u32 +{ + au_found, + demux_done, + fatal_error, + close, + flush_done, + prog_end_code, +}; + +struct alignas(0x80) DmuxPamfEvent +{ + be_t type; + + union + { + u8 pad[0x78]; + + struct + { + be_t stream_id; + be_t private_stream_id; + vm::ptr> au_addr; + CellCodecTimeStamp pts; + CellCodecTimeStamp dts; + be_t unk; + u8 reserved[4]; + be_t au_size; + be_t stream_header_size; + std::array stream_header_buf; + be_t user_data; + be_t is_rap; + } + au_found; + + struct + { + be_t stream_id; + be_t private_stream_id; + be_t user_data; + } + flush_done; + }; + + be_t event_queue_was_too_full; + + DmuxPamfEvent() = default; + + DmuxPamfEvent(be_t&& type, const be_t& event_queue_was_too_full) + : type(type), event_queue_was_too_full(event_queue_was_too_full) + { + } + + DmuxPamfEvent(be_t&& type, const be_t& stream_id, const be_t& private_stream_id, const be_t& user_data, const be_t& event_queue_was_too_full) + : type(type), flush_done{ stream_id, private_stream_id, user_data }, event_queue_was_too_full(event_queue_was_too_full) + { + } + + DmuxPamfEvent(be_t&& type, const be_t& stream_id, const be_t& private_stream_id, const vm::ptr>& au_addr, const CellCodecTimeStamp& pts, const CellCodecTimeStamp& dts, const be_t& unk, + const be_t& au_size, const be_t& au_specific_info_size, const std::array& au_specific_info, const be_t& user_data, const be_t& is_rap, const be_t& event_queue_was_too_full) + : type(type) + , au_found{ stream_id, private_stream_id, au_addr, pts, dts, static_cast>(unk), {}, au_size, au_specific_info_size, au_specific_info, user_data, is_rap } + , event_queue_was_too_full(event_queue_was_too_full) + { + } +}; + +CHECK_SIZE_ALIGN(DmuxPamfEvent, 0x80, 0x80); + +struct alignas(0x80) DmuxPamfStreamInfo +{ + vm::bcptr stream_addr; + be_t stream_size; + be_t user_data; + be_t continuity; + be_t is_raw_es; +}; + +CHECK_SIZE_ALIGN(DmuxPamfStreamInfo, 0x80, 0x80); + +enum DmuxPamfStreamTypeIndex +{ + DMUX_PAMF_STREAM_TYPE_INDEX_INVALID = -1, + DMUX_PAMF_STREAM_TYPE_INDEX_VIDEO, + DMUX_PAMF_STREAM_TYPE_INDEX_LPCM, + DMUX_PAMF_STREAM_TYPE_INDEX_AC3, + DMUX_PAMF_STREAM_TYPE_INDEX_ATRACX, + DMUX_PAMF_STREAM_TYPE_INDEX_USER_DATA, +}; + + +// SPU thread + +class dmux_pamf_base +{ + // Event handlers for the demuxer. These correspond to the events that the SPU thread sends to the PPU thread on LLE (except for au_queue_full(): the SPU thread just sets a global bool, + // but it is never notified to the PPU thread or the user). + + virtual bool on_au_found(u8 stream_id, u8 private_stream_id, u32 user_data, std::span au, u64 pts, u64 dts, bool rap, u8 au_specific_info_size, std::array au_specific_info_buf) = 0; + virtual bool on_demux_done() = 0; + virtual void on_fatal_error() = 0; + virtual bool on_flush_done(u8 stream_id, u8 private_stream_id, u32 user_data) = 0; + virtual bool on_prog_end() = 0; + virtual void on_au_queue_full() = 0; + +public: + virtual ~dmux_pamf_base() = default; + + bool enable_es(u32 stream_id, u32 private_stream_id, bool is_avc, std::span au_queue_buffer, u32 au_max_size, bool raw_es, u32 user_data); + bool disable_es(u32 stream_id, u32 private_stream_id); + bool release_au(u32 stream_id, u32 private_stream_id, u32 au_size) const; + bool flush_es(u32 stream_id, u32 private_stream_id); + void set_stream(std::span stream, bool continuity); + void reset_stream(); + bool reset_es(u32 stream_id, u32 private_stream_id, u8* au_addr); + bool process_next_pack(); + +protected: + void save_base(utils::serial& ar); + [[nodiscard]] bool has_work() const { return !!stream || !demux_done_notified; } + [[nodiscard]] u32 get_enabled_es_count() const; + +private: + static constexpr u16 PACK_SIZE = 0x800; + static constexpr s8 PACK_STUFFING_LENGTH_OFFSET = 0xd; + static constexpr s8 PES_PACKET_LENGTH_OFFSET = 0x4; + static constexpr s8 PES_HEADER_DATA_LENGTH_OFFSET = 0x8; + static constexpr s8 PTS_DTS_FLAG_OFFSET = 0x7; + static constexpr u8 PACKET_START_CODE_PREFIX = 1; + + static constexpr be_t M2V_PIC_START = 0x100; + static constexpr be_t AVC_AU_DELIMITER = 0x109; + static constexpr be_t M2V_SEQUENCE_HEADER = 0x1b3; + static constexpr be_t M2V_SEQUENCE_END = 0x1b7; + static constexpr be_t PACK_START = 0x1ba; + static constexpr be_t SYSTEM_HEADER = 0x1bb; + static constexpr be_t PRIVATE_STREAM_1 = 0x1bd; + static constexpr be_t PRIVATE_STREAM_2 = 0x1bf; + static constexpr be_t PROG_END = 0x1b9; + static constexpr be_t VIDEO_STREAM_BASE = 0x1e0; // The lower 4 bits indicate the channel + + // Partial access unit that will be written to the output queue + struct access_unit_chunk + { + std::vector cached_data; // Up to three bytes of data from the previous PES packet (copied into this vector, since it might not be in memory anymore) + std::span data; // Data of the current PES packet + }; + + // Output queue for access units + // The queue doesn't keep track of where access units are in the buffer (only which parts are used and which are free), this has to be done extenally + class output_queue + { + public: + explicit output_queue(std::span buffer) : buffer(buffer) {} + + explicit output_queue(utils::serial& ar) + : buffer{vm::_ptr(ar.pop()), ar.pop()} + , back(vm::_ptr(ar.pop())) + , front(vm::_ptr(ar.pop())) + , wrap_pos(vm::_ptr(ar.pop())) + { + } + + void save(utils::serial& ar) const { ar(vm::get_addr(buffer.data()), static_cast(buffer.size()), vm::get_addr(back), vm::get_addr(front), vm::get_addr(wrap_pos)); } + + // The queue itself doesn't keep track of the location of each access unit, so the pop and access operations need the size or address of the access unit to remove/return + void pop_back(u32 au_size); + void pop_back(u8* au_addr); + void pop_front(u32 au_size); + [[nodiscard]] const u8* peek_back(u32 au_size) const { return back - au_size; } + + void clear() { wrap_pos = front = back = buffer.data(); } + + void push_unchecked(const access_unit_chunk& au_chunk); + bool push(const access_unit_chunk& au_chunk, const std::function& on_fatal_error); + + [[nodiscard]] bool prepare_next_au(u32 au_max_size); + + [[nodiscard]] usz get_free_size() const { return wrap_pos != buffer.data() ? front - back : std::to_address(buffer.end()) - back; } + + private: + const std::span buffer; + + // Since access units have a variable size, uses pointers instead of indices + u8* back = buffer.data(); + const u8* front = buffer.data(); + const u8* wrap_pos = buffer.data(); // The address where the back pointer wrapped around to the beginning of the queue + }; + + // Base class for elementary streams and subclasses for each stream type + // Responsible for processing the data section of PES packets and splitting it into access units with the stream parsers of each subclass + class elementary_stream + { + public: + elementary_stream(u8 channel, u32 au_max_size, dmux_pamf_base& ctx, u32 user_data, u8 au_specific_info_size, std::span au_queue_buffer) + : channel(channel) + , au_max_size(au_max_size == umax || au_max_size > au_queue_buffer.size() ? 0x800 : au_max_size) + , ctx(ctx) + , au_specific_info_size(au_specific_info_size) + , user_data(user_data) + , au_queue(au_queue_buffer) + { + // The cache sizes will never exceed three bytes + cache.reserve(3); + au_chunk.cached_data.reserve(3); + } + + elementary_stream(utils::serial& ar, u8 channel, dmux_pamf_base& ctx, u8 au_specific_info_size) + : channel(channel) + , au_max_size(ar.pop()) + , ctx(ctx) + , au_specific_info_size(au_specific_info_size) + , user_data(ar.pop()) + , au_queue(ar) + { + save(ar); + } + + virtual ~elementary_stream() = default; + void save(utils::serial& ar); + + static bool is_enabled(const std::unique_ptr& es) { return !!es; } + + [[nodiscard]] virtual std::pair get_stream_id() const = 0; + + void set_pes_packet_data(std::span pes_packet_data) { ensure(!this->pes_packet_data); this->pes_packet_data = this->stream_chunk = pes_packet_data; } + void set_pts(u64 pts) { this->pts = pts; } + void set_dts(u64 dts) { this->dts = dts; } + void set_rap() { rap = true; } + + // Parses the proprietary header of private streams. Returns the size of the header or umax if the stream is invalid + virtual u32 parse_stream_header(std::span elementary_stream, s8 pts_dts_flag) = 0; + + // Processes the current PES packet. Returns true if it has been entirely consumed + bool process_pes_packet_data(); + + void release_au(u32 au_size) { au_queue.pop_front(au_size); } + void flush_es(); + void reset_es(u8* au_addr); + void discard_access_unit(); + + protected: + const u8 channel : 4; + const u32 au_max_size; // Maximum possible size of an access unit + u32 au_size_unk = 0; // For user data streams, used to store the size of the current access unit. For other private streams, used as a bool for some reason + alignas(0x10) std::array au_specific_info_buf{}; // For LPCM streams, stores the first 0x10 bytes of the current PES packet data, contains info like the number of channels + + // The access unit that is currently being cut out + struct access_unit + { + ENABLE_BITWISE_SERIALIZATION + + enum class state : u8 + { + none, // An access unit is not currently being cut out + incomplete, // An access unit is currently being cut out + commenced, // The current PES packet contains the beginning of an access unit + complete, // The current PES packet contains the end of an access unit + size_mismatch, // The distance between sync words and size indicated in the access unit's info header does not match + m2v_sequence, // Special case for M2V, access unit commenced, but the next start code does not complete the access unit + } + state = state::none; + + bool rap = false; + bool timestamps_rap_set = false; + + // Since the delimiters of compressed audio streams are allowed to appear anywhere in the stream (instead of just the beginning of an access unit), we need to parse the size of the access unit from the stream + u8 size_info_offset = 0; + u16 parsed_size = 0; + + u32 accumulated_size = 0; // Incremented after every access unit chunk cut out from the stream + + u64 pts = umax; + u64 dts = umax; + + alignas(0x10) std::array au_specific_info_buf{}; + } + current_au; + + access_unit_chunk au_chunk; // A partial access unit that will be written to the access unit queue. Set by the stream parsers + std::vector cache; // The last three bytes of the current PES packet need to be saved, since they could contain part of an access unit delimiter + + // Returns the stream header size of audio streams. The only difference between LPCM and compressed streams is the extra_header_size_unk_mask + template + u32 parse_audio_stream_header(std::span pes_packet_data); + + private: + dmux_pamf_base& ctx; // For access to event handlers + + enum class state : u8 + { + initial, + pushing_au_queue, + notifying_au_found, + preparing_for_next_au + } + state = state::initial; + + // Size of the "CellDmuxPamfAuSpecificInfo..." struct for the type of this stream ("reserved" fields are not counted, so for all stream types other than LPCM this will be 0) + // This does NOT correspond to the amount of data in au_specific_info_buf, the info in the buffer gets unpacked by the PPU thread + const u8 au_specific_info_size; + + const u32 user_data; + + // Data section of the current PES packet. Needs to be remembered separately from the span we're working with below + std::optional> pes_packet_data; + + std::span stream_chunk; // The current section of the PES packet data to be processed + u64 pts = umax; // Presentation time stamp of the current PES packet + u64 dts = umax; // Decoding time stamp of the current PES packet + bool rap = false; // Random access point indicator + + output_queue au_queue; + + // Extracts access units from the stream by searching for the access unit delimiter and setting au_chunk accordingly. Returns the number of bytes that were parsed + virtual u32 parse_stream(std::span stream) = 0; + + void reset() + { + state = state::initial; + pes_packet_data.reset(); + au_size_unk = 0; + pts = + dts = umax; + rap = false; + au_chunk.data = {}; + au_chunk.cached_data.clear(); + current_au = {}; + } + + void set_au_timestamps_rap() + { + current_au.pts = pts; + current_au.dts = dts; + current_au.rap = rap; + pts = + dts = umax; + rap = false; + current_au.timestamps_rap_set = true; + } + }; + + template + class video_stream final : public elementary_stream + { + public: + video_stream(u8 channel, u32 au_max_size, dmux_pamf_base& ctx, u32 user_data, std::span au_queue_buffer) : elementary_stream(channel, au_max_size, ctx, user_data, 0, au_queue_buffer) {} + video_stream(utils::serial& ar, u8 channel, dmux_pamf_base& ctx) : elementary_stream(ar, channel, ctx, 0) {} + + private: + u32 parse_stream(std::span stream) override; + u32 parse_stream_header([[maybe_unused]] std::span pes_packet_data, [[maybe_unused]] s8 pts_dts_flag) override { return 0; } + [[nodiscard]] std::pair get_stream_id() const override { return { 0xe0 | channel, 0 }; } + }; + + class lpcm_stream final : public elementary_stream + { + public: + lpcm_stream(u8 channel, u32 au_max_size, dmux_pamf_base& ctx, u32 user_data, std::span au_queue_buffer) : elementary_stream(channel, au_max_size, ctx, user_data, 3, au_queue_buffer) {} + lpcm_stream(utils::serial& ar, u8 channel, dmux_pamf_base& ctx) : elementary_stream(ar, channel, ctx, 3) {} + + private: + u32 parse_stream(std::span stream) override; + u32 parse_stream_header(std::span pes_packet_data, [[maybe_unused]] s8 pts_dts_flag) override; + [[nodiscard]] std::pair get_stream_id() const override { return { 0xbd, 0x40 | channel }; } + }; + + template + class audio_stream final : public elementary_stream + { + public: + audio_stream(u8 channel, u32 au_max_size, dmux_pamf_base& ctx, u32 user_data, std::span au_queue_buffer) : elementary_stream(channel, au_max_size, ctx, user_data, 0, au_queue_buffer) {} + audio_stream(utils::serial& ar, u8 channel, dmux_pamf_base& ctx) : elementary_stream(ar, channel, ctx, 0) {} + + private: + static constexpr be_t SYNC_WORD = ac3 ? 0x0b77 : 0x0fd0; + static constexpr u8 ATRACX_ATS_HEADER_SIZE = 8; + static constexpr u16 AC3_FRMSIZE_TABLE[3][38] = + { + { 0x40, 0x40, 0x50, 0x50, 0x60, 0x60, 0x70, 0x70, 0x80, 0x80, 0xa0, 0xa0, 0xc0, 0xc0, 0xe0, 0xe0, 0x100, 0x100, 0x140, 0x140, 0x180, 0x180, 0x1c0, 0x1c0, 0x200, 0x200, 0x280, 0x280, 0x300, 0x300, 0x380, 0x380, 0x400, 0x400, 0x480, 0x480, 0x500, 0x500 }, + { 0x45, 0x46, 0x57, 0x58, 0x68, 0x69, 0x79, 0x7a, 0x8b, 0x8c, 0xae, 0xaf, 0xd0, 0xd1, 0xf3, 0xf4, 0x116, 0x117, 0x15c, 0x15d, 0x1a1, 0x1a2, 0x1e7, 0x1e8, 0x22d, 0x22e, 0x2b8, 0x2b9, 0x343, 0x344, 0x3cf, 0x3d0, 0x45a, 0x45b, 0x4e5, 0x4e6, 0x571, 0x572 }, + { 0x60, 0x60, 0x78, 0x78, 0x90, 0x90, 0xa8, 0xa8, 0xc0, 0xc0, 0xf0, 0xf0, 0x120, 0x120, 0x150, 0x150, 0x180, 0x180, 0x1e0, 0x1e0, 0x240, 0x240, 0x2a0, 0x2a0, 0x300, 0x300, 0x3c0, 0x3c0, 0x480, 0x480, 0x540, 0x540, 0x600, 0x600, 0x6c0, 0x6c0, 0x780, 0x780 } + }; + + u32 parse_stream(std::span stream) override; + u32 parse_stream_header(std::span pes_packet_data, [[maybe_unused]] s8 pts_dts_flag) override { return parse_audio_stream_header<0xffff>(pes_packet_data); } + [[nodiscard]] std::pair get_stream_id() const override { return { 0xbd, (ac3 ? 0x30 : 0x00) | channel }; } + }; + + class user_data_stream final : public elementary_stream + { + public: + user_data_stream(u8 channel, u32 au_max_size, dmux_pamf_base& ctx, u32 user_data, std::span au_queue_buffer) : elementary_stream(channel, au_max_size, ctx, user_data, 0, au_queue_buffer) {} + user_data_stream(utils::serial& ar, u8 channel, dmux_pamf_base& ctx) : elementary_stream(ar, channel, ctx, 0) {} + + private: + u32 parse_stream(std::span stream) override; + u32 parse_stream_header(std::span pes_packet_data, s8 pts_dts_flag) override; + [[nodiscard]] std::pair get_stream_id() const override { return { 0xbd, 0x20 | channel }; } + }; + + + enum class state : u8 + { + initial, + elementary_stream, + prog_end + } + state = state::initial; + + bool demux_done_notified = true; // User was successfully notified that the stream has been consumed + + u8 pack_es_type_idx = umax; // Elementary stream type in the current pack + u8 pack_es_channel = 0; // Elementary stream channel in the current pack + + bool raw_es = false; // Indicates that the input stream is a raw elementary stream instead of a multiplexed MPEG program stream. If set to true, MPEG-PS related parsing will be skipped + + std::optional> stream; // The stream to be demultiplexed, provided by the user + + std::unique_ptr elementary_streams[5][0x10]; // One for each possible type and channel +}; + +// Implementation of the SPU thread +class dmux_pamf_spu_context : dmux_pamf_base +{ +public: + static constexpr u32 id_base = 0; + static constexpr u32 id_step = 1; + static constexpr u32 id_count = 0x400; + SAVESTATE_INIT_POS(std::numeric_limits::max()); // Doesn't depend on or is a dependency of anything + + dmux_pamf_spu_context(vm::ptr> cmd_queue, vm::ptr, 1>> cmd_result_queue, + vm::ptr> stream_info_queue, vm::ptr> event_queue) + : cmd_queue(cmd_queue), cmd_result_queue(cmd_result_queue), stream_info_queue(stream_info_queue), event_queue(event_queue) + { + } + + explicit dmux_pamf_spu_context(utils::serial& ar) + : cmd_queue(ar.pop>>()) + , cmd_result_queue(vm::ptr, 1>>::make(cmd_queue.addr() + sizeof(dmux_pamf_hle_spurs_queue))) + , stream_info_queue(vm::ptr>::make(cmd_result_queue.addr() + sizeof(dmux_pamf_hle_spurs_queue, 1>))) + , event_queue(vm::ptr>::make(stream_info_queue.addr() + sizeof(dmux_pamf_hle_spurs_queue))) + , new_stream(ar.pop()) + { + save_base(ar); + max_enqueued_events += 2 * get_enabled_es_count(); + } + + void save(utils::serial& ar); + + void operator()(); // cellSpursMain() + static constexpr auto thread_name = "HLE PAMF demuxer SPU thread"sv; + +private: + // These are globals in the SPU thread + const vm::ptr> cmd_queue; + const vm::ptr, 1>> cmd_result_queue; + const vm::ptr> stream_info_queue; + const vm::ptr> event_queue; + bool wait_for_au_queue = false; + bool wait_for_event_queue = false; + bool event_queue_was_too_full = false; // Sent to the PPU thread + u8 max_enqueued_events = 4; // 4 + 2 * number of enabled elementary streams + + // This is a local variable in cellSpursMain(), needs to be saved for savestates + bool new_stream = false; + + bool get_next_cmd(DmuxPamfCommand& lhs, bool new_stream) const; + bool send_event(auto&&... args) const; + + // The events are sent to the PPU thread via the event_queue + bool on_au_found(u8 stream_id, u8 private_stream_id, u32 user_data, std::span au, u64 pts, u64 dts, bool rap, u8 au_specific_info_size, std::array au_specific_info_buf) override + { + return !((wait_for_event_queue = !send_event(DmuxPamfEventType::au_found, stream_id, private_stream_id, vm::get_addr(au.data()), std::bit_cast(static_cast>(pts)), + std::bit_cast(static_cast>(dts)), 0, static_cast(au.size()), au_specific_info_size, au_specific_info_buf, user_data, rap))); + } + bool on_demux_done() override { return !((wait_for_event_queue = !send_event(DmuxPamfEventType::demux_done))); } + void on_fatal_error() override { send_event(DmuxPamfEventType::fatal_error); } + bool on_flush_done(u8 stream_id, u8 private_stream_id, u32 user_data) override { return send_event(DmuxPamfEventType::flush_done, stream_id, private_stream_id, user_data); } // The "flush done" event does not set wait_for_event_queue if the queue is full + bool on_prog_end() override { return !((wait_for_event_queue = !send_event(DmuxPamfEventType::prog_end_code))); } + void on_au_queue_full() override { wait_for_au_queue = true; } +}; + +using dmux_pamf_spu_thread = named_thread; + + +// PPU thread + struct CellDmuxPamfAttr { be_t maxEnabledEsNum; diff --git a/rpcs3/Emu/Cell/Modules/cellPamf.h b/rpcs3/Emu/Cell/Modules/cellPamf.h index e42acf60f4..abd89f8852 100644 --- a/rpcs3/Emu/Cell/Modules/cellPamf.h +++ b/rpcs3/Emu/Cell/Modules/cellPamf.h @@ -1,5 +1,6 @@ #pragma once +#include "Emu/Cell/ErrorCodes.h" #include "Emu/Memory/vm_ptr.h" // Error Codes diff --git a/rpcs3/Emu/savestate_utils.cpp b/rpcs3/Emu/savestate_utils.cpp index 5add3e8c6b..167a060262 100644 --- a/rpcs3/Emu/savestate_utils.cpp +++ b/rpcs3/Emu/savestate_utils.cpp @@ -23,7 +23,7 @@ struct serial_ver_t std::set compatible_versions; }; -static std::array s_serial_versions; +static std::array s_serial_versions; #define SERIALIZATION_VER(name, identifier, ...) \ \ @@ -85,6 +85,7 @@ SERIALIZATION_VER(LLE, 24, 1) SERIALIZATION_VER(HLE, 25, 1) SERIALIZATION_VER(cellSysutil, 26, 1, 2/*AVC2 Muting,Volume*/) +SERIALIZATION_VER(cellDmuxPamf, 27, 1) template <> void fmt_class_string>::format(std::string& out, u64 arg) From a3d09a7427efe193efba099f4cdffbdb9a4506cb Mon Sep 17 00:00:00 2001 From: capriots <29807355+capriots@users.noreply.github.com> Date: Sat, 19 Jul 2025 21:11:56 +0200 Subject: [PATCH 033/295] tests: cellDmuxPamf --- rpcs3/tests/test_dmux_pamf.cpp | 630 +++++++++++++++++++++++++++++++++ rpcs3/tests/test_dmux_pamf.h | 123 +++++++ 2 files changed, 753 insertions(+) create mode 100644 rpcs3/tests/test_dmux_pamf.cpp create mode 100644 rpcs3/tests/test_dmux_pamf.h diff --git a/rpcs3/tests/test_dmux_pamf.cpp b/rpcs3/tests/test_dmux_pamf.cpp new file mode 100644 index 0000000000..40a8a02b32 --- /dev/null +++ b/rpcs3/tests/test_dmux_pamf.cpp @@ -0,0 +1,630 @@ +#include "stdafx.h" +#include +#include "Emu/Cell/Modules/cellDmuxPamf.h" +#include "Crypto/sha1.h" +#include "test_dmux_pamf.h" + +using namespace testing; + +struct DmuxPamfMock : dmux_pamf_base +{ + MOCK_METHOD(bool, on_au_found, (u8 stream_id, u8 private_stream_id, u32 user_data, std::span au, u64 pts, u64 dts, bool rap, u8 au_specific_info_size, (std::array) au_specific_info_buf), (override)); + MOCK_METHOD(bool, on_demux_done, (), (override)); + MOCK_METHOD(void, on_fatal_error, (), (override)); + MOCK_METHOD(bool, on_flush_done, (u8 stream_id, u8 private_stream_id, u32 user_data), (override)); + MOCK_METHOD(bool, on_prog_end, (), (override)); + MOCK_METHOD(void, on_au_queue_full, (), (override)); +}; + +struct DmuxPamfTest : Test +{ + StrictMock demuxer; + MockFunction check_point; + std::array au_queue_buffer{}; + InSequence seq; +}; + +MATCHER_P(Sha1Is, expected_sha1, "") { std::array sha1_buf{}; sha1(arg.data(), arg.size(), sha1_buf.data()); return sha1_buf == expected_sha1; } + +struct DmuxPamfSinglePack : DmuxPamfTest, WithParamInterface, AccessUnit, std::optional>> {}; + +TEST_P(DmuxPamfSinglePack, Test) +{ + const auto& [stream_id, private_stream_id, is_avc, au_max_size, stream, au_1, au_2] = GetParam(); + + EXPECT_CALL(check_point, Call(0)); + EXPECT_CALL(demuxer, on_au_found(stream_id, private_stream_id, 0x12345678, Sha1Is(au_1.data_sha1), au_1.pts, au_1.dts, au_1.rap, au_1.specific_info_size, au_1.specific_info_buf)).WillOnce(Return(true)); + + if (au_2) + { + EXPECT_CALL(demuxer, on_au_found(stream_id, private_stream_id, 0x12345678, Sha1Is(au_2->data_sha1), au_2->pts, au_2->dts, au_2->rap, au_2->specific_info_size, au_2->specific_info_buf)); + } + + demuxer.enable_es(stream_id, private_stream_id, is_avc, au_queue_buffer, au_max_size, false, 0x12345678); + demuxer.set_stream(stream, false); + check_point.Call(0); + demuxer.process_next_pack(); +} + +// These streams are made of a single pack that contains two access units (one for the user data stream) +INSTANTIATE_TEST_SUITE_P(Basic, DmuxPamfSinglePack, Values +( + std::tuple{ 0xe0, 0x00, true, 0x800, AVC_SINGLE_PACK_STREAM, AVC_SINGLE_PACK_EXPECTED_AU_1, AVC_SINGLE_PACK_EXPECTED_AU_2 }, + std::tuple{ 0xe0, 0x00, false, 0x800, M2V_SINGLE_PACK_STREAM, M2V_SINGLE_PACK_EXPECTED_AU_1, M2V_SINGLE_PACK_EXPECTED_AU_2 }, + std::tuple{ 0xbd, 0x00, false, 0x800, ATRACX_SINGLE_PACK_STREAM, ATRACX_SINGLE_PACK_EXPECTED_AU_1, ATRACX_SINGLE_PACK_EXPECTED_AU_2 }, + std::tuple{ 0xbd, 0x30, false, 0x800, AC3_SINGLE_PACK_STREAM, AC3_SINGLE_PACK_EXPECTED_AU_1, AC3_SINGLE_PACK_EXPECTED_AU_2 }, + std::tuple{ 0xbd, 0x40, false, 0x369, LPCM_SINGLE_PACK_STREAM, LPCM_SINGLE_PACK_EXPECTED_AU_1, LPCM_SINGLE_PACK_EXPECTED_AU_2 }, + std::tuple{ 0xbd, 0x20, false, 0x800, USER_DATA_SINGLE_PACK_STREAM, USER_DATA_SINGLE_PACK_EXPECTED_AU, std::nullopt } // There can be at most one user data access unit in a single pack +)); + +// Tests buggy behavior: timestamps should be unsigned, but get sign-extended from s32 to u64 on LLE. They probably forgot about integer promotion +INSTANTIATE_TEST_SUITE_P(TimeStampSignExtended, DmuxPamfSinglePack, Values +( + std::tuple{ 0xbd, 0x20, false, 0x800, TIME_STAMP_SIGN_EXTENDED_STREAM, TIME_STAMP_SIGN_EXTENDED_EXPECTED_AU, std::nullopt } +)); + +// Tests buggy behavior: if there is no Pack Start Code at the beginning of the current stream section, LLE will search for the code. +// However, if it finds one, it will not set the reading position to where the code was found. It continues reading from the beginning of the stream section instead. +// Test disabled since this is not currently implemented +INSTANTIATE_TEST_SUITE_P(DISABLED_PackStartCodeNotAtBeginning, DmuxPamfSinglePack, Values +( + std::tuple{ 0xe0, 0x00, true, 0x800, []() { auto pack = AVC_SINGLE_PACK_STREAM; std::copy_n(pack.begin(), 4, pack.begin() + 0x93); std::fill_n(pack.begin(), 4, 0); return pack; }(), AVC_SINGLE_PACK_EXPECTED_AU_1, AVC_SINGLE_PACK_EXPECTED_AU_2 } +)); + +struct DmuxPamfMultiplePackSingleAu : DmuxPamfTest, WithParamInterface, AccessUnit>> {}; + +TEST_P(DmuxPamfMultiplePackSingleAu, Test) +{ + const auto& [stream_id, private_stream_id, is_avc, au_max_size, stream, au] = GetParam(); + + EXPECT_CALL(check_point, Call(0)); + EXPECT_CALL(demuxer, on_au_found(stream_id, private_stream_id, 0x12345678, Sha1Is(au.data_sha1), au.pts, au.dts, au.rap, au.specific_info_size, au.specific_info_buf)).WillOnce(Return(true)); + + demuxer.enable_es(stream_id, private_stream_id, is_avc, au_queue_buffer, au_max_size, false, 0x12345678); + demuxer.set_stream(stream, false); + + // Demultiplex all packs until the last one + for (u32 i = 0; i < stream.size() - 0x800; i += 0x800) + { + demuxer.process_next_pack(); + } + + // The next call to process_next_pack() should produce an access unit + check_point.Call(0); + demuxer.process_next_pack(); +} + +// These streams contain a single access unit that is split across four packs +INSTANTIATE_TEST_SUITE_P(Basic, DmuxPamfMultiplePackSingleAu, Values +( + std::tuple{ 0xe0, 0x00, true, 0x1800, AVC_LARGE_AU_STREAM, AVC_LARGE_AU_EXPECTED_AU }, + std::tuple{ 0xe0, 0x00, false, 0x1800, M2V_LARGE_AU_STREAM, M2V_LARGE_AU_EXPECTED_AU }, + std::tuple{ 0xbd, 0x00, false, 0x1800, ATRACX_LARGE_AU_STREAM, ATRACX_LARGE_AU_EXPECTED_AU }, + std::tuple{ 0xbd, 0x30, false, 0x1800, AC3_LARGE_AU_STREAM, AC3_LARGE_AU_EXPECTED_AU }, + std::tuple{ 0xbd, 0x40, false, 0x1400, LPCM_LARGE_AU_STREAM, LPCM_LARGE_AU_EXPECTED_AU }, + std::tuple{ 0xbd, 0x20, false, 0x1800, USER_DATA_LARGE_AU_STREAM, USER_DATA_LARGE_AU_EXPECTED_AU } +)); + +// PES packets with audio streams contain a proprietary header before the actual stream. +// The last two bytes of the header indicate how much of the stream should be skipped +// (note that I have not found a single PAMF stream in any game where this is not 0). +// These streams test if this is implemented properly, the first access unit should not be output +INSTANTIATE_TEST_SUITE_P(SkipByes, DmuxPamfMultiplePackSingleAu, Values +( + std::tuple{ 0xbd, 0x00, false, 0x1800, ATRACX_SKIP_BYTES_STREAM, ATRACX_SKIP_BYTES_EXPECTED_AU }, + std::tuple{ 0xbd, 0x30, false, 0x1800, AC3_SKIP_BYTES_STREAM, AC3_SKIP_BYTES_EXPECTED_AU }, + std::tuple{ 0xbd, 0x40, false, 0xb40, LPCM_SKIP_BYTES_STREAM, LPCM_SKIP_BYTES_EXPECTED_AU } +)); + +// Tests buggy behavior: if the start of an access unit in the last three bytes of the previous PES packet and the demuxer was not cutting out an access unit before that, +// LLE will always output all three bytes, even if the access unit starts at the second last or last byte +INSTANTIATE_TEST_SUITE_P(FirstDilimiterSplit, DmuxPamfMultiplePackSingleAu, Values +( + std::tuple{ 0xe0, 0x00, true, 0x1800, AVC_BEGIN_OF_AU_SPLIT_STREAM, AVC_BEGIN_OF_AU_SPLIT_EXPECTED_AU }, + std::tuple{ 0xe0, 0x00, false, 0x1800, M2V_BEGIN_OF_AU_SPLIT_STREAM, M2V_BEGIN_OF_AU_SPLIT_EXPECTED_AU }, + std::tuple{ 0xbd, 0x00, false, 0x1800, ATRACX_BEGIN_OF_AU_SPLIT_STREAM, ATRACX_BEGIN_OF_AU_SPLIT_EXPECTED_AU }, + std::tuple{ 0xbd, 0x30, false, 0x1800, AC3_BEGIN_OF_AU_SPLIT_STREAM, AC3_BEGIN_OF_AU_SPLIT_EXPECTED_AU } +)); + +// The distance of the access units in these streams do not match the size indicated in the ATRAC3plus ATS header/AC3 frmsizecod + fscod fields +// LLE repeatedly cuts off one byte at the beginning of the PES packet until the sizes match and clears the current access unit +INSTANTIATE_TEST_SUITE_P(SizeMismatch, DmuxPamfMultiplePackSingleAu, Values +( + std::tuple{ 0xbd, 0x00, false, 0x608, ATRACX_SIZE_MISMATCH_STREAM, ATRACX_SIZE_MISMATCH_EXPECTED_AU }, + std::tuple{ 0xbd, 0x30, false, 0x600, AC3_SIZE_MISMATCH_STREAM, AC3_SIZE_MISMATCH_EXPECTED_AU } +)); + +// Tests buggy behavior: if an M2V sequence end code is found, it should be included in the current access unit, unlike all other delimiters. +// If the sequence end code is split across two packs, LLE isn't properly including it in the access unit. +// Disabled because this behavior isn't properly implemented currently +INSTANTIATE_TEST_SUITE_P(DISABLED_M2vSequenceEndSplit, DmuxPamfMultiplePackSingleAu, Values +( + std::tuple{ 0xe0, 0x00, false, 0x1000, M2V_SEQUENCE_END_SPLIT_STREAM, M2V_SEQUENCE_END_SPLIT_EXPECTED_AU } +)); + +struct DmuxPamfSplitDelimiter : DmuxPamfTest, WithParamInterface, AccessUnit, AccessUnit, AccessUnit, AccessUnit>> {}; + +TEST_P(DmuxPamfSplitDelimiter, Test) +{ + const auto& [stream_id, private_stream_id, is_avc, au_max_size, stream, au_1, au_2, au_3, au_4] = GetParam(); + + EXPECT_CALL(check_point, Call(0)); + EXPECT_CALL(demuxer, on_au_found(stream_id, private_stream_id, 0x12345678, Sha1Is(au_1.data_sha1), au_1.pts, au_1.dts, au_1.rap, au_1.specific_info_size, au_1.specific_info_buf)).WillOnce(Return(true)); + EXPECT_CALL(check_point, Call(1)); + EXPECT_CALL(demuxer, on_au_found(stream_id, private_stream_id, 0x12345678, Sha1Is(au_2.data_sha1), au_2.pts, au_2.dts, au_2.rap, au_2.specific_info_size, au_2.specific_info_buf)).WillOnce(Return(true)); + EXPECT_CALL(check_point, Call(2)); + EXPECT_CALL(demuxer, on_au_found(stream_id, private_stream_id, 0x12345678, Sha1Is(au_3.data_sha1), au_3.pts, au_3.dts, au_3.rap, au_3.specific_info_size, au_3.specific_info_buf)).WillOnce(Return(true)); + EXPECT_CALL(demuxer, on_au_found(stream_id, private_stream_id, 0x12345678, Sha1Is(au_4.data_sha1), au_4.pts, au_4.dts, au_4.rap, au_4.specific_info_size, au_4.specific_info_buf)).WillOnce(Return(true)); + + demuxer.enable_es(stream_id, private_stream_id, is_avc, au_queue_buffer, au_max_size, false, 0x12345678); + demuxer.set_stream(stream, false); + demuxer.process_next_pack(); + check_point.Call(0); + demuxer.process_next_pack(); + check_point.Call(1); + demuxer.process_next_pack(); + check_point.Call(2); + demuxer.process_next_pack(); +} + +// The delimiters of each stream is split across two packs. Tests, if it is still found and the access units are extracted properly +INSTANTIATE_TEST_SUITE_P(Basic, DmuxPamfSplitDelimiter, Values +( + std::tuple{ 0xe0, 0x00, true, 0x800, AVC_MULTIPLE_PACK_STREAM, AVC_MULTIPLE_PACK_EXPECTED_AU_1, AVC_MULTIPLE_PACK_EXPECTED_AU_2, AVC_MULTIPLE_PACK_EXPECTED_AU_3, AVC_MULTIPLE_PACK_EXPECTED_AU_4 }, + std::tuple{ 0xe0, 0x00, false, 0x800, M2V_MULTIPLE_PACK_STREAM, M2V_MULTIPLE_PACK_EXPECTED_AU_1, M2V_MULTIPLE_PACK_EXPECTED_AU_2, M2V_MULTIPLE_PACK_EXPECTED_AU_3, M2V_MULTIPLE_PACK_EXPECTED_AU_4 }, + std::tuple{ 0xbd, 0x00, false, 0x800, ATRACX_MULTIPLE_PACK_STREAM, ATRACX_MULTIPLE_PACK_EXPECTED_AU_1, ATRACX_MULTIPLE_PACK_EXPECTED_AU_2, ATRACX_MULTIPLE_PACK_EXPECTED_AU_3, ATRACX_MULTIPLE_PACK_EXPECTED_AU_4 }, + std::tuple{ 0xbd, 0x30, false, 0x800, AC3_MULTIPLE_PACK_STREAM, AC3_MULTIPLE_PACK_EXPECTED_AU_1, AC3_MULTIPLE_PACK_EXPECTED_AU_2, AC3_MULTIPLE_PACK_EXPECTED_AU_3, AC3_MULTIPLE_PACK_EXPECTED_AU_4 } +)); + +struct DmuxPamfNoAccessUnits : DmuxPamfTest, WithParamInterface>> {}; + +TEST_P(DmuxPamfNoAccessUnits, Test) +{ + const auto& [stream_id, private_stream_id, is_avc, stream] = GetParam(); + + demuxer.enable_es(stream_id, private_stream_id, is_avc, au_queue_buffer, 0x1000, false, 0x12345678); + demuxer.set_stream(stream, false); + demuxer.process_next_pack(); + demuxer.process_next_pack(); + demuxer.process_next_pack(); + demuxer.process_next_pack(); +} + +// Tests buggy behavior: LLE doesn't handle multiple consecutive PES packets with less than three bytes correctly. +// These streams contain access units, but they are not found on LLE +INSTANTIATE_TEST_SUITE_P(TinyPackets, DmuxPamfNoAccessUnits, Values +( + std::tuple{ 0xe0, 0x00, true, AVC_TINY_PACKETS_STREAM }, + std::tuple{ 0xe0, 0x00, false, M2V_TINY_PACKETS_STREAM } +)); + +struct DmuxPamfInvalidStream : DmuxPamfTest, WithParamInterface> {}; + +TEST_P(DmuxPamfInvalidStream, Test) +{ + demuxer.set_stream(GetParam(), false); + demuxer.enable_es(0xbd, 0x00, false, au_queue_buffer, 0x800, false, 0); + demuxer.enable_es(0xbd, 0x20, false, au_queue_buffer, 0x800, false, 0); + demuxer.enable_es(0xbd, 0x40, false, au_queue_buffer, 0x800, false, 0); + EXPECT_FALSE(demuxer.process_next_pack()); +} + +// Tests if invalid streams are handled correctly. +// Each of these should fail a different check in process_next_pack() +// (LLE doesn't actually check anything, it would just read random things in the SPU local store) +INSTANTIATE_TEST_SUITE_P(Instance, DmuxPamfInvalidStream, Values +( + []() consteval { auto pack = AVC_SINGLE_PACK_STREAM; pack[0xe] = 0x01; return pack; }(), // Invalid code after pack header + []() consteval { auto pack = AVC_SINGLE_PACK_STREAM; pack[0x12] = 0x07; pack[0x13] = 0xe7; return pack; }(), // System header size too large + []() consteval { auto pack = AVC_SINGLE_PACK_STREAM; pack[0x20] = 0x01; return pack; }(), // Invalid code after system header + []() consteval { auto pack = AVC_SINGLE_PACK_STREAM; pack[0x24] = 0x07; pack[0x25] = 0xd2; return pack; }(), // Private stream 2 size too large + []() consteval { auto pack = AVC_SINGLE_PACK_STREAM; pack[0x114] = 0x01; return pack; }(), // Invalid code after private stream 2 + []() consteval { auto pack = AVC_SINGLE_PACK_STREAM; pack[0x117] = 0xbe; return pack; }(), // Invalid stream type + []() consteval { auto pack = AVC_SINGLE_PACK_STREAM; pack[0x119] = 0xe7; return pack; }(), // PES packet size too large + []() consteval { auto pack = AVC_SINGLE_PACK_STREAM; pack[0x118] = 0x00; pack[0x119] = 0x03; pack[0x11c] = 0x00; return pack; }(), // PES packet header size too large + []() consteval { auto pack = USER_DATA_SINGLE_PACK_STREAM; pack[0x118] = 0x00; pack[0x119] = 0x15; return pack; }(), // User data stream too small + []() consteval { auto pack = LPCM_SINGLE_PACK_STREAM; pack[0x118] = 0x00; pack[0x119] = 0x20; pack[0x12c] = 0x00; pack[0x12d] = 0x00; return pack; }(), // LPCM stream too small + []() consteval { auto pack = ATRACX_SINGLE_PACK_STREAM; pack[0x118] = 0x00; pack[0x119] = 0x13; pack[0x12c] = 0x00; pack[0x12d] = 0x00; return pack; }(), // Stream header too small + []() consteval { auto pack = AVC_SINGLE_PACK_STREAM; pack[0x118] = 0x00; pack[0x119] = 0x03; pack[0x11c] = 0x00; return pack; }() // PES packet header size too large +)); + +// Tests if the program end code is properly detected and the corresponding event is fired +TEST_F(DmuxPamfTest, ProgEnd) +{ + EXPECT_CALL(check_point, Call(0)); + EXPECT_CALL(demuxer, on_prog_end).WillOnce(Return(false)); // Since this returns false, the event should be fired again immediately after the next process_next_pack() call + EXPECT_CALL(check_point, Call(1)); + EXPECT_CALL(demuxer, on_prog_end).WillOnce(Return(true)); + + constexpr std::array stream = { 0x00, 0x00, 0x01, 0xb9 }; + + demuxer.set_stream(stream, false); + check_point.Call(0); + demuxer.process_next_pack(); + check_point.Call(1); + demuxer.process_next_pack(); +} + +// Tests if the output queue properly checks whether there is enough space to write an au_chunk to the queue +TEST_F(DmuxPamfTest, QueueNoSpaceForAuChunk) +{ + EXPECT_CALL(check_point, Call(0)); + EXPECT_CALL(demuxer, on_au_found).WillOnce(Return(true)); + EXPECT_CALL(demuxer, on_au_queue_full); + EXPECT_CALL(check_point, Call(1)); + EXPECT_CALL(demuxer, on_au_queue_full); + + // Set a large au_max_size, this causes the back pointer of the queue to wrap around to the beginning after the first access units + demuxer.enable_es(0xe0, 0x00, true, au_queue_buffer, 0x2c14, false, 0); + + demuxer.set_stream(AVC_SINGLE_PACK_STREAM, false); + + // Since the first access unit is behind the back pointer and there is no space to write the next au_chunk to the queue, this should cause the au_queue_full event to be fired + check_point.Call(0); + demuxer.process_next_pack(); + + // Since we didn't release the first access unit to remove it from the queue, this should result in au_queue_full again + check_point.Call(1); + demuxer.process_next_pack(); +} + +// Tests if access units are properly removed from the queue +TEST_F(DmuxPamfTest, QueueReleaseAu) +{ + EXPECT_CALL(check_point, Call(0)); + EXPECT_CALL(demuxer, on_au_found).WillOnce(Return(true)); + EXPECT_CALL(demuxer, on_au_queue_full); + EXPECT_CALL(check_point, Call(1)); + EXPECT_CALL(demuxer, on_au_found).WillOnce(Return(true)); + + demuxer.enable_es(0xe0, 0x00, true, au_queue_buffer, 0x2c14, false, 0); + demuxer.set_stream(AVC_SINGLE_PACK_STREAM, false); + check_point.Call(0); + demuxer.process_next_pack(); + demuxer.release_au(0xe0, 0x00, 0x3ed); // Should remove the first access unit from the queue + check_point.Call(1); + demuxer.process_next_pack(); // Since there is space again in the queue, the second access unit should now be found +} + +// LLE adds 0x10 bytes to the size of the au_chunk when checking whether there is enough space. +TEST_F(DmuxPamfTest, QueueNoSpaceSPUShenanigans) +{ + EXPECT_CALL(check_point, Call(0)); + EXPECT_CALL(demuxer, on_au_found).Times(2).WillRepeatedly(Return(true)); + EXPECT_CALL(demuxer, on_au_queue_full); + EXPECT_CALL(check_point, Call(1)); + EXPECT_CALL(demuxer, on_au_queue_full); + + std::array small_au_queue_buffer{}; + + demuxer.enable_es(0xe0, 0x00, true, small_au_queue_buffer, 0x400, false, 0); + demuxer.set_stream(AVC_SINGLE_PACK_STREAM, false); + check_point.Call(0); + demuxer.process_next_pack(); + demuxer.release_au(0xe0, 0x00, 0x3fc); // 0xf bytes more than needed, but this should still result in au_queue_full + demuxer.set_stream(AVC_SINGLE_PACK_STREAM, false); + check_point.Call(1); + demuxer.process_next_pack(); +} + +// After completing an access unit, it should be checked whether au_max_size fits into the queue. +TEST_F(DmuxPamfTest, QueueNoSpaceForMaxAu) +{ + EXPECT_CALL(check_point, Call(0)); + EXPECT_CALL(demuxer, on_au_found).WillOnce(Return(true)); + EXPECT_CALL(demuxer, on_au_queue_full); + EXPECT_CALL(check_point, Call(1)); + EXPECT_CALL(demuxer, on_au_found).WillOnce(Return(true)); + EXPECT_CALL(demuxer, on_au_queue_full); + + std::array small_au_queue_buffer{}; + + demuxer.enable_es(0xe0, 0x00, true, small_au_queue_buffer, 0x400, false, 0); + demuxer.set_stream(AVC_SINGLE_PACK_STREAM, false); + check_point.Call(0); + demuxer.process_next_pack(); + demuxer.release_au(0xe0, 0x00, 0x300); // This does not remove the entire access unit from the queue + + // Since there is still data behind the back pointer of the queue, it can't wrap around again. + // Because au_max_size won't fit between the back pointer and the end of the queue buffer after finding the next access unit, + // this should cause au_queue_full before starting to extract the next access unit + check_point.Call(1); + demuxer.process_next_pack(); +} + +// Tests if a fatal error is produced if an access unit in the stream is larger than au_max_size +TEST_F(DmuxPamfTest, QueueAuLargerThanMaxSize) +{ + EXPECT_CALL(check_point, Call(0)); + EXPECT_CALL(demuxer, on_fatal_error); + EXPECT_CALL(demuxer, on_au_queue_full); + EXPECT_CALL(check_point, Call(1)); + EXPECT_CALL(demuxer, on_fatal_error); + EXPECT_CALL(demuxer, on_au_queue_full); + + std::array small_au_queue_buffer{}; + + demuxer.enable_es(0xe0, 0x00, true, small_au_queue_buffer, 0x800, false, 0); // au_max_size is smaller than the access unit in the stream + demuxer.set_stream(AVC_LARGE_AU_STREAM, false); + demuxer.process_next_pack(); + check_point.Call(0); + demuxer.process_next_pack(); + check_point.Call(1); + demuxer.process_next_pack(); +} + +// LLE sets au_max_size to 0x800 if it is too large (no fatal error or anything else) +TEST_F(DmuxPamfTest, EnableEsAuMaxSizeTooLarge) +{ + EXPECT_CALL(check_point, Call(0)); + EXPECT_CALL(demuxer, on_au_found).Times(2).WillRepeatedly(Return(true)); + + demuxer.enable_es(0xe0, 0x00, true, au_queue_buffer, std::numeric_limits::max(), false, 0); // The access unit max size will be set to 0x800 if it is larger than the queue buffer size or UINT32_MAX + demuxer.set_stream(AVC_SINGLE_PACK_STREAM, false); + + // Normally, this would cause the event au_queue_full because au_max_size wouldn't fit in the queue. + // However, since au_max_size gets set to 0x800, this doesn't occur + check_point.Call(0); + demuxer.process_next_pack(); +} + +// Tests if the demux_done event is fired when process_next_pack() is called after the end of the stream has been reached +TEST_F(DmuxPamfTest, DemuxDone) +{ + EXPECT_CALL(check_point, Call(0)); + EXPECT_CALL(demuxer, on_demux_done).WillOnce(Return(true)); + + demuxer.enable_es(0xe0, 0x00, true, au_queue_buffer, 0x1800, false, 0); + demuxer.set_stream({ AVC_MULTIPLE_PACK_STREAM.begin(), 0x800 }, false); + demuxer.process_next_pack(); + check_point.Call(0); + demuxer.process_next_pack(); + demuxer.process_next_pack(); // Since on_demux_done was already called and returned true, it should not produce another demux_done event +} + +// process_next_pack() should skip through the stream until it finds a start code or the end of the stream is reached +TEST_F(DmuxPamfTest, DemuxDoneEmptyStream) +{ + EXPECT_CALL(check_point, Call(0)); + EXPECT_CALL(demuxer, on_demux_done).WillOnce(Return(true)); + + constexpr std::array stream{}; + + demuxer.set_stream(stream, false); + + // Should immediately cause demux_done since there is no start code in the stream + check_point.Call(0); + demuxer.process_next_pack(); +} + +// Tests if the demuxer handles an input stream that is a continuation of the previous one correctly +TEST_F(DmuxPamfTest, StreamContinuity) +{ + EXPECT_CALL(check_point, Call(0)); + EXPECT_CALL(demuxer, on_au_found).WillOnce(Return(true)); + + demuxer.enable_es(0xe0, 0x00, true, au_queue_buffer, 0x1800, false, 0); + demuxer.set_stream({ AVC_MULTIPLE_PACK_STREAM.begin(), 0x800 }, false); + demuxer.process_next_pack(); + demuxer.set_stream({ AVC_MULTIPLE_PACK_STREAM.begin() + 0x800, AVC_MULTIPLE_PACK_STREAM.end() }, true); + check_point.Call(0); + demuxer.process_next_pack(); +} + +// Flushing an elementary stream manually produces an au_found event +TEST_F(DmuxPamfTest, Flush) +{ + EXPECT_CALL(check_point, Call(0)); + EXPECT_CALL(demuxer, on_au_found(0xe0, 0x00, 0, Sha1Is(AVC_FLUSH_EXPECTED_AU_SHA1), 0x15f90, 0x159b2, true, 0, Each(0))).WillOnce(Return(true)); + EXPECT_CALL(demuxer, on_flush_done).Times(10).WillRepeatedly(Return(false)); // The flush_done event is fired repeatedly in a loop until it returns true + EXPECT_CALL(demuxer, on_flush_done).WillOnce(Return(true)); + + demuxer.enable_es(0xe0, 0x00, true, au_queue_buffer, 0x800, false, 0); + demuxer.set_stream(AVC_MULTIPLE_PACK_STREAM, false); + demuxer.process_next_pack(); + check_point.Call(0); + demuxer.flush_es(0xe0, 0x00); + demuxer.process_next_pack(); // The elementary stream should be reset after a flush, so this should not find the next access unit +} + +// Tests resetting the stream +// On LLE, it is necessary to reset the stream before setting a new one, if the current stream has not been entirely consumed yet +TEST_F(DmuxPamfTest, ResetStream) +{ + EXPECT_CALL(check_point, Call(0)); + EXPECT_CALL(demuxer, on_demux_done).WillOnce(Return(true)); + + demuxer.enable_es(0xe0, 0x00, true, au_queue_buffer, 0x1800, false, 0); + demuxer.set_stream(AVC_MULTIPLE_PACK_STREAM, false); + demuxer.reset_stream(); + check_point.Call(0); + demuxer.process_next_pack(); // Should produce a demux_done event and shouldn't find an access unit since the stream was reset + demuxer.process_next_pack(); +} + +// Disabling an elementary stream should clear the access unit queue and internal state, and the disabled stream should not be demultiplexed anymore +TEST_F(DmuxPamfTest, DisableEs) +{ + demuxer.enable_es(0xe0, 0x00, true, au_queue_buffer, 0x1800, false, 0); + demuxer.set_stream(AVC_MULTIPLE_PACK_STREAM, false); + demuxer.process_next_pack(); + demuxer.disable_es(0xe0, 0x00); + + // Should not find an access unit since the elementary stream was disabled + demuxer.process_next_pack(); + demuxer.process_next_pack(); + demuxer.process_next_pack(); +} + +// Resetting an elementary stream should clear the queue and internal state, like disabling, except the elementary stream remains enabled +TEST_F(DmuxPamfTest, ResetEs) +{ + EXPECT_CALL(check_point, Call(0)); + EXPECT_CALL(demuxer, on_au_found).WillOnce(Return(0)); + + demuxer.enable_es(0xe0, 0x00, true, au_queue_buffer, 0x1800, false, 0); + demuxer.set_stream(AVC_MULTIPLE_PACK_STREAM, false); + demuxer.process_next_pack(); + demuxer.reset_es(0xe0, 0x00, nullptr); + demuxer.process_next_pack(); // Should not find an access unit since the output queue and the current access unit state was cleared + check_point.Call(0); + demuxer.process_next_pack(); +} + +// If reset_es is called with an address, only the most recent access unit should be removed from the queue. Nothing else should be reset +TEST_F(DmuxPamfTest, ResetEsSingleAu) +{ + EXPECT_CALL(check_point, Call(0)); + EXPECT_CALL(demuxer, on_au_found).Times(2).WillRepeatedly(Return(true)); + EXPECT_CALL(demuxer, on_au_queue_full); + EXPECT_CALL(check_point, Call(1)); + EXPECT_CALL(demuxer, on_au_found).WillOnce(Return(true)); + EXPECT_CALL(demuxer, on_au_queue_full); + + std::array small_au_queue_buffer{}; + + demuxer.enable_es(0xe0, 0x00, true, small_au_queue_buffer, 0x400, false, 0); + demuxer.set_stream(AVC_SINGLE_PACK_STREAM, false); + check_point.Call(0); + demuxer.process_next_pack(); + demuxer.set_stream(AVC_SINGLE_PACK_STREAM, false); + demuxer.reset_es(0xe0, 0x00, small_au_queue_buffer.data() + 0x400); + check_point.Call(1); + demuxer.process_next_pack(); +} + +// Tests the raw elementary stream mode, which skips all MPEG program stream related parsing +// (this isn't actually available through the abstraction layer cellDmux/libdmux.sprx, but the related PPU functions are exported in libdmuxpamf.sprx) +TEST_F(DmuxPamfTest, RawEs) +{ + // Zero out MPEG-PS related stuff from the stream, so that only the elementary stream remains + constexpr std::array stream = []() consteval { auto pack = AVC_SINGLE_PACK_STREAM; std::fill_n(pack.begin(), 0x12a, 0); return pack; }(); + + EXPECT_CALL(check_point, Call(0)); + EXPECT_CALL(demuxer, on_au_found(0xe0, 0x00, 0, Sha1Is(AVC_SINGLE_PACK_EXPECTED_AU_1.data_sha1), std::numeric_limits::max(), std::numeric_limits::max(), false, _, _)).WillOnce(Return(true)); + EXPECT_CALL(demuxer, on_au_found(0xe0, 0x00, 0, Sha1Is(AVC_SINGLE_PACK_EXPECTED_AU_2.data_sha1), std::numeric_limits::max(), std::numeric_limits::max(), false, _, _)).WillOnce(Return(true)); + + demuxer.enable_es(0xe0, 0x00, true, au_queue_buffer, 0x400, true, 0); + demuxer.set_stream(stream, false); + + // In raw elementary stream mode, the demuxer still processes the stream in chunks of 0x800 bytes. + // The first call to process_next_pack() each chunk does nothing, it only sets the internal state to elementary stream parsing + demuxer.process_next_pack(); + check_point.Call(0); + demuxer.process_next_pack(); +} + +// If any of the event handlers return false (on LLE this happens if the event queue is full), the state of process_next_pack() should be saved and return immediately. +// The next time process_next_pack() is called, it should resume where it left off +TEST_F(DmuxPamfTest, EventHandlersReturnFalse) +{ + EXPECT_CALL(check_point, Call(0)); + EXPECT_CALL(demuxer, on_au_found(0xe0, 0x00, 0, Sha1Is(AVC_SINGLE_PACK_EXPECTED_AU_1.data_sha1), AVC_SINGLE_PACK_EXPECTED_AU_1.pts, AVC_SINGLE_PACK_EXPECTED_AU_1.dts, AVC_SINGLE_PACK_EXPECTED_AU_1.rap, _, _)).WillOnce(Return(false)); + EXPECT_CALL(check_point, Call(1)); + EXPECT_CALL(demuxer, on_au_found(0xe0, 0x00, 0, Sha1Is(AVC_SINGLE_PACK_EXPECTED_AU_1.data_sha1), AVC_SINGLE_PACK_EXPECTED_AU_1.pts, AVC_SINGLE_PACK_EXPECTED_AU_1.dts, AVC_SINGLE_PACK_EXPECTED_AU_1.rap, _, _)).WillOnce(Return(true)); + EXPECT_CALL(demuxer, on_au_found(0xe0, 0x00, 0, Sha1Is(AVC_SINGLE_PACK_EXPECTED_AU_2.data_sha1), AVC_SINGLE_PACK_EXPECTED_AU_2.pts, AVC_SINGLE_PACK_EXPECTED_AU_2.dts, AVC_SINGLE_PACK_EXPECTED_AU_2.rap, _, _)).WillOnce(Return(false)); + EXPECT_CALL(check_point, Call(2)); + EXPECT_CALL(demuxer, on_au_found(0xe0, 0x00, 0, Sha1Is(AVC_SINGLE_PACK_EXPECTED_AU_2.data_sha1), AVC_SINGLE_PACK_EXPECTED_AU_2.pts, AVC_SINGLE_PACK_EXPECTED_AU_2.dts, AVC_SINGLE_PACK_EXPECTED_AU_2.rap, _, _)).WillOnce(Return(true)); + + EXPECT_CALL(check_point, Call(3)); + EXPECT_CALL(demuxer, on_demux_done).WillOnce(Return(false)); + EXPECT_CALL(check_point, Call(4)); + EXPECT_CALL(demuxer, on_demux_done).WillOnce(Return(true)); + + demuxer.enable_es(0xe0, 0x00, true, au_queue_buffer, 0x800, false, 0); + demuxer.set_stream(AVC_SINGLE_PACK_STREAM, false); + check_point.Call(0); + demuxer.process_next_pack(); + check_point.Call(1); + demuxer.process_next_pack(); + check_point.Call(2); + demuxer.process_next_pack(); + + check_point.Call(3); + demuxer.process_next_pack(); + check_point.Call(4); + demuxer.process_next_pack(); + demuxer.process_next_pack(); + demuxer.process_next_pack(); +} + +// Tests if invalid stream ids are handled properly +TEST_F(DmuxPamfTest, InvalidStreamIds) +{ + const auto test = [&](u8 stream_id, u8 private_stream_id) + { + EXPECT_FALSE(demuxer.release_au(stream_id, private_stream_id, 0x800)); + EXPECT_FALSE(demuxer.disable_es(stream_id, private_stream_id)); + EXPECT_FALSE(demuxer.reset_es(stream_id, private_stream_id, nullptr)); + EXPECT_FALSE(demuxer.flush_es(stream_id, private_stream_id)); + }; + + // Trying to use or disable already disabled elementary streams should result in failures + for (u32 stream_id = 0xe0; stream_id < 0xf0; stream_id++) + { + test(stream_id, 0x00); + } + for (u32 private_stream_id = 0x00; private_stream_id < 0x10; private_stream_id++) + { + test(0xbd, private_stream_id); + } + for (u32 private_stream_id = 0x20; private_stream_id < 0x50; private_stream_id++) + { + test(0xbd, private_stream_id); + } + + // Enabling all possible elementary streams + for (u32 stream_id = 0xe0; stream_id < 0xf0; stream_id++) + { + EXPECT_TRUE(demuxer.enable_es(stream_id, 0x00, true, au_queue_buffer, 0x800, false, 0)); + } + for (u32 private_stream_id = 0x00; private_stream_id < 0x10; private_stream_id++) + { + EXPECT_TRUE(demuxer.enable_es(0xbd, private_stream_id, true, au_queue_buffer, 0x800, false, 0)); + } + for (u32 private_stream_id = 0x20; private_stream_id < 0x50; private_stream_id++) + { + EXPECT_TRUE(demuxer.enable_es(0xbd, private_stream_id, true, au_queue_buffer, 0x800, false, 0)); + } + + // Attempting to enable them again should result in failures + for (u32 stream_id = 0xe0; stream_id < 0xf0; stream_id++) + { + EXPECT_FALSE(demuxer.enable_es(stream_id, 0x00, true, au_queue_buffer, 0x800, false, 0)); + } + for (u32 private_stream_id = 0x00; private_stream_id < 0x10; private_stream_id++) + { + EXPECT_FALSE(demuxer.enable_es(0xbd, private_stream_id, true, au_queue_buffer, 0x800, false, 0)); + } + for (u32 private_stream_id = 0x20; private_stream_id < 0x50; private_stream_id++) + { + EXPECT_FALSE(demuxer.enable_es(0xbd, private_stream_id, true, au_queue_buffer, 0x800, false, 0)); + } + + // Testing all possible invalid IDs + for (u32 stream_id = 0; stream_id < 0xbd; stream_id++) + { + EXPECT_FALSE(demuxer.enable_es(stream_id, 0x00, true, au_queue_buffer, 0x800, false, 0)); + test(stream_id, 0x00); + } + for (u32 stream_id = 0xbe; stream_id < 0xe0; stream_id++) + { + EXPECT_FALSE(demuxer.enable_es(stream_id, 0x00, true, au_queue_buffer, 0x800, false, 0)); + test(stream_id, 0x00); + } + for (u32 stream_id = 0xf0; stream_id <= 0xff; stream_id++) + { + EXPECT_FALSE(demuxer.enable_es(stream_id, 0x00, true, au_queue_buffer, 0x800, false, 0)); + test(stream_id, 0x00); + } + for (u32 private_stream_id = 0x10; private_stream_id < 0x20; private_stream_id++) + { + EXPECT_FALSE(demuxer.enable_es(0xbd, private_stream_id, true, au_queue_buffer, 0x800, false, 0)); + test(0xbd, private_stream_id); + } + for (u32 private_stream_id = 0x50; private_stream_id <= 0xff; private_stream_id++) + { + EXPECT_FALSE(demuxer.enable_es(0xbd, private_stream_id, true, au_queue_buffer, 0x800, false, 0)); + test(0xbd, private_stream_id); + } +} diff --git a/rpcs3/tests/test_dmux_pamf.h b/rpcs3/tests/test_dmux_pamf.h new file mode 100644 index 0000000000..841051a4e0 --- /dev/null +++ b/rpcs3/tests/test_dmux_pamf.h @@ -0,0 +1,123 @@ +#pragma once + +struct AccessUnit +{ + u64 pts; + u64 dts; + bool rap; + u8 specific_info_size; + std::array specific_info_buf; + std::array data_sha1; +}; + +constexpr std::array AVC_SINGLE_PACK_STREAM = { 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xe0, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x00, 0x00, 0x01, 0x09, 0x36, 0x2c, 0xe0, 0x95, 0x35, 0x29, 0xce, 0xf6, 0xc8, 0xc9, 0xc1, 0x2b, 0xa1, 0xc5, 0xae, 0xfd, 0xa6, 0x0d, 0x98, 0xa7, 0x39, 0x66, 0xe2, 0xd9, 0xbc, 0x1a, 0xbe, 0xba, 0x03, 0xcc, 0x80, 0x90, 0x3a, 0xe9, 0x5b, 0xa7, 0xa0, 0x31, 0x21, 0xbf, 0xee, 0xd2, 0x90, 0x1e, 0x9c, 0x79, 0xbf, 0x15, 0xce, 0xac, 0x02, 0xcf, 0x85, 0xe1, 0xf9, 0x9a, 0xcb, 0x97, 0x2f, 0xd9, 0x97, 0x67, 0x63, 0xed, 0xa3, 0x6d, 0x1b, 0xa3, 0x8b, 0xef, 0x0d, 0x54, 0xd6, 0xb6, 0x4b, 0x42, 0x9b, 0x5e, 0xc4, 0x47, 0xbc, 0x21, 0x02, 0x83, 0xa0, 0x00, 0x08, 0x27, 0x83, 0x2f, 0x5a, 0x02, 0x54, 0xda, 0xe6, 0x16, 0x57, 0x93, 0x09, 0xd6, 0xe4, 0x4a, 0xd9, 0x90, 0xc0, 0x8f, 0x3e, 0xe2, 0xcc, 0xc6, 0xec, 0x8b, 0x4e, 0xf3, 0x96, 0xa7, 0x86, 0x06, 0xca, 0xae, 0xf7, 0xb5, 0xde, 0xe6, 0xcd, 0x41, 0x6e, 0x3e, 0x8e, 0x33, 0xb5, 0x2b, 0xf4, 0xbb, 0xd4, 0x5b, 0xad, 0x1d, 0xfe, 0x5e, 0xc8, 0x03, 0xdd, 0x9d, 0x7e, 0xb9, 0x55, 0xd3, 0x41, 0x76, 0xa0, 0xf1, 0xca, 0x00, 0xe5, 0x80, 0x93, 0x4f, 0x30, 0x15, 0x8c, 0x4b, 0xa6, 0xda, 0xc1, 0xac, 0x1d, 0xe5, 0x96, 0xc4, 0x88, 0x6a, 0x64, 0x4a, 0x10, 0x18, 0x94, 0xe3, 0x18, 0xc2, 0x4d, 0xe7, 0xa0, 0x5e, 0xa3, 0x7c, 0x4a, 0x47, 0x7f, 0xd6, 0x22, 0xc9, 0x44, 0xc2, 0xd1, 0x99, 0xba, 0xdf, 0xa7, 0xfd, 0x24, 0xc6, 0x4c, 0x3c, 0x32, 0xf6, 0xb1, 0x98, 0x30, 0xd1, 0x51, 0x00, 0x18, 0x76, 0xe6, 0xe5, 0x86, 0xdc, 0x4a, 0x6d, 0x28, 0x18, 0x3e, 0x0f, 0x5c, 0xb9, 0x65, 0x2b, 0x48, 0x3c, 0x90, 0x20, 0xe7, 0x88, 0x3f, 0x65, 0x6d, 0x64, 0x83, 0x7d, 0xf6, 0xd3, 0xb0, 0xc7, 0x21, 0xc0, 0xf0, 0x9a, 0xad, 0xc8, 0x53, 0x6d, 0x05, 0xa4, 0x66, 0x2d, 0x87, 0x3f, 0x03, 0x3c, 0x76, 0xd9, 0xa7, 0x6c, 0x25, 0x34, 0xe7, 0x36, 0x46, 0xf9, 0x56, 0xf4, 0x37, 0xe7, 0xa3, 0x8c, 0x32, 0xfc, 0x3f, 0x1b, 0xb6, 0x93, 0xc9, 0x4c, 0x10, 0xaa, 0xba, 0xde, 0xed, 0x3e, 0x98, 0x5f, 0x38, 0x1b, 0xe0, 0xee, 0x48, 0xab, 0xeb, 0x18, 0x1f, 0xa0, 0xc5, 0x08, 0x97, 0x00, 0x85, 0xdf, 0xd4, 0x0a, 0x96, 0xb1, 0x59, 0xeb, 0xce, 0x35, 0xc9, 0x97, 0x83, 0x15, 0xc7, 0xef, 0x01, 0xce, 0x4f, 0xb2, 0x48, 0x36, 0xef, 0xd6, 0x46, 0x54, 0x4f, 0x47, 0xa3, 0x62, 0xf0, 0xd3, 0xbd, 0xd6, 0xe5, 0xec, 0x12, 0x63, 0x60, 0xe5, 0xe7, 0x2c, 0xc1, 0xeb, 0x72, 0xb5, 0x96, 0x50, 0x34, 0x8a, 0x48, 0xc0, 0x6c, 0x48, 0xfe, 0xb0, 0x04, 0xa7, 0x1a, 0xac, 0x3a, 0x08, 0x96, 0xae, 0x9b, 0x93, 0x66, 0x56, 0x9c, 0x22, 0x6a, 0x5a, 0x57, 0x2e, 0xc7, 0xef, 0x6e, 0x54, 0xdb, 0x7f, 0x7d, 0xf1, 0x88, 0x9c, 0x01, 0x95, 0x5d, 0xa1, 0x5a, 0xbb, 0x00, 0xc1, 0xe0, 0x88, 0x9a, 0x17, 0x3f, 0x6b, 0xab, 0x96, 0x95, 0x01, 0x6e, 0x79, 0xa4, 0x54, 0x34, 0xa2, 0x79, 0xdc, 0x53, 0xf5, 0xfa, 0x4a, 0xee, 0x3f, 0x3f, 0xeb, 0xe0, 0x0b, 0x06, 0x64, 0xa5, 0x1a, 0xae, 0x92, 0xd6, 0xdc, 0x1c, 0x3e, 0x8b, 0x1c, 0x72, 0x8f, 0x1d, 0x0b, 0xac, 0xe5, 0x0a, 0x57, 0x65, 0xa9, 0x1e, 0xae, 0x6c, 0x42, 0x63, 0x4a, 0x54, 0x55, 0xa3, 0x34, 0xcd, 0x29, 0x9a, 0xcb, 0xb0, 0x26, 0xf9, 0xc7, 0x55, 0x9c, 0xe1, 0x38, 0x81, 0x3e, 0x8a, 0x72, 0x2c, 0x7f, 0xff, 0xcb, 0x66, 0x75, 0x11, 0xda, 0xe6, 0xb0, 0x12, 0xa8, 0x4c, 0x22, 0x50, 0x6a, 0x69, 0x9e, 0x3d, 0xdc, 0x46, 0x68, 0x2f, 0x9d, 0x27, 0x03, 0x70, 0xe8, 0x46, 0xa2, 0x12, 0x2d, 0x3f, 0x57, 0x45, 0x2a, 0x8f, 0x5a, 0xb9, 0x0d, 0xf0, 0x61, 0x41, 0x7b, 0x51, 0x6c, 0x2d, 0xc5, 0x93, 0x5e, 0x50, 0xcd, 0x98, 0x20, 0xdb, 0x95, 0x3e, 0xf9, 0x80, 0x7d, 0xfd, 0xae, 0xd1, 0xec, 0xa2, 0x96, 0x2b, 0xd5, 0xd5, 0x29, 0x71, 0xd1, 0xb2, 0xbd, 0x4e, 0x03, 0xb2, 0xa3, 0x30, 0x54, 0xbe, 0xbc, 0x08, 0x7b, 0x05, 0xa3, 0x86, 0x8d, 0x7f, 0xa3, 0x6e, 0x9b, 0xad, 0xbd, 0xc8, 0x59, 0xe4, 0xcf, 0x9e, 0x3e, 0x19, 0x6f, 0xcf, 0xda, 0x2b, 0x9b, 0x6b, 0x9d, 0xb7, 0xc5, 0xbc, 0x9a, 0x67, 0x4c, 0x08, 0x0e, 0xa1, 0xa2, 0x19, 0xc6, 0x3c, 0x0d, 0x87, 0xcb, 0x11, 0x0f, 0x53, 0x85, 0x9b, 0xa9, 0x97, 0xa0, 0xba, 0x04, 0x98, 0x66, 0x57, 0xa5, 0xb9, 0x09, 0x31, 0xfe, 0xa9, 0xd2, 0xb4, 0x30, 0xa9, 0x9c, 0x0e, 0x6c, 0x62, 0x3a, 0x04, 0xcd, 0x2a, 0x64, 0x91, 0xfe, 0xee, 0x19, 0xa6, 0xa8, 0x6d, 0x87, 0xa2, 0x1a, 0xda, 0xb6, 0xf1, 0x27, 0x35, 0x95, 0x47, 0x64, 0xfa, 0x1f, 0xed, 0xcf, 0x7b, 0xdc, 0x9a, 0x18, 0x2e, 0xfe, 0xf3, 0x56, 0x6d, 0x28, 0xce, 0xcd, 0x16, 0x03, 0x59, 0x14, 0x4a, 0x90, 0xc2, 0xe3, 0x20, 0x6b, 0x96, 0xd5, 0x30, 0x20, 0x3f, 0xc4, 0xeb, 0x48, 0xe5, 0x9c, 0x34, 0xdf, 0x8d, 0x46, 0x73, 0x1d, 0x54, 0x11, 0x65, 0x5b, 0xe4, 0xab, 0xb3, 0xa6, 0x1e, 0x40, 0x43, 0xb5, 0x84, 0x61, 0x94, 0x01, 0xea, 0x92, 0xd4, 0x9f, 0xb9, 0xc6, 0x26, 0x2d, 0x56, 0xda, 0xa4, 0x11, 0x5f, 0xf6, 0x3f, 0xa2, 0xd8, 0xcb, 0xda, 0xb7, 0x0e, 0xc6, 0x0e, 0x6d, 0xbe, 0x0d, 0x9a, 0x46, 0xc2, 0x77, 0x7d, 0x3a, 0x0d, 0x67, 0xf9, 0x58, 0xf4, 0xba, 0x65, 0xb2, 0xe0, 0x39, 0x60, 0xcf, 0x76, 0xd4, 0x15, 0x73, 0x46, 0xdf, 0x14, 0x22, 0xa7, 0x25, 0x6f, 0xd3, 0x9f, 0x8f, 0xa9, 0x60, 0x1f, 0xbb, 0x13, 0x71, 0x1b, 0x43, 0x4f, 0x9f, 0x66, 0x17, 0x4a, 0xd7, 0x56, 0xd6, 0x84, 0xec, 0x65, 0xd1, 0xb1, 0x64, 0x48, 0x65, 0x18, 0x61, 0x8f, 0x7e, 0xef, 0xdf, 0x5d, 0xea, 0x7d, 0x67, 0xb2, 0x66, 0x95, 0xfe, 0xf3, 0x6c, 0xf4, 0xaa, 0x1d, 0x14, 0x0e, 0x73, 0x0e, 0xca, 0x32, 0xc1, 0x52, 0x23, 0x77, 0xba, 0x94, 0x31, 0x4b, 0x26, 0x44, 0xce, 0x34, 0xe6, 0xd0, 0x6a, 0xa9, 0x5c, 0x58, 0xbd, 0xf8, 0xc6, 0xf4, 0x0b, 0xac, 0xab, 0x1e, 0x5a, 0x81, 0xee, 0x4a, 0xe4, 0x7a, 0x4b, 0xf0, 0x92, 0xad, 0xad, 0x75, 0xd3, 0x0a, 0xa1, 0x71, 0xab, 0x1f, 0x90, 0xbd, 0x8c, 0x80, 0xcd, 0x09, 0x7f, 0x9a, 0x46, 0xbd, 0xd5, 0x92, 0x66, 0x8b, 0xc9, 0xc0, 0x3b, 0xbc, 0xdb, 0xff, 0xa6, 0x99, 0x08, 0xb6, 0x73, 0xf9, 0x79, 0x6e, 0x8d, 0xee, 0x51, 0xdd, 0xd7, 0xe5, 0xec, 0xb4, 0xa1, 0x92, 0x58, 0xab, 0xdc, 0x79, 0xfe, 0xc9, 0xad, 0x55, 0xf3, 0x07, 0x86, 0x56, 0x81, 0x4d, 0x90, 0x52, 0x48, 0x15, 0xbf, 0x56, 0xa1, 0xd4, 0x96, 0xae, 0x44, 0x3c, 0x35, 0x25, 0x06, 0x39, 0xde, 0x60, 0x86, 0x88, 0xb0, 0xc6, 0xcc, 0x98, 0x8f, 0x06, 0x14, 0xb7, 0xed, 0x5b, 0x92, 0x7f, 0x64, 0xc4, 0xd0, 0xf1, 0x2a, 0x89, 0x08, 0x32, 0xab, 0x26, 0x28, 0x55, 0xff, 0xd7, 0xca, 0xf0, 0x41, 0xfe, 0x7d, 0x90, 0xd3, 0x52, 0xcb, 0x6b, 0x1b, 0x2d, 0xfa, 0x05, 0x01, 0x2f, 0xf1, 0xda, 0x84, 0xbe, 0x5c, 0x86, 0xcd, 0x41, 0x09, 0xfe, 0x92, 0xbf, 0x74, 0xc9, 0x75, 0x21, 0x89, 0x70, 0xac, 0x1c, 0x70, 0xdd, 0x56, 0xcb, 0xb0, 0xe1, 0xb9, 0xb4, 0xf8, 0x1c, 0x00, 0x00, 0x01, 0x09, 0x22, 0x6d, 0x07, 0x49, 0x80, 0xdb, 0x25, 0x5c, 0xeb, 0xa5, 0x99, 0x4a, 0xb0, 0x12, 0x9c, 0xc1, 0xce, 0x89, 0xca, 0xc8, 0x57, 0x99, 0x56, 0x40, 0x18, 0xe7, 0xb1, 0xe7, 0x47, 0x97, 0x47, 0xc2, 0xa4, 0x7a, 0xae, 0x3e, 0xe2, 0xb3, 0xec, 0xc2, 0x69, 0x43, 0xd9, 0xe3, 0x9c, 0x95, 0xde, 0x01, 0x95, 0xb7, 0xb4, 0x08, 0x8d, 0x7f, 0x1d, 0x2e, 0x95, 0x0f, 0x3c, 0xdd, 0x9e, 0x64, 0xd6, 0xf3, 0xe6, 0xa0, 0x24, 0xe5, 0x19, 0xf0, 0x96, 0x92, 0x0a, 0xde, 0xc5, 0x12, 0xf7, 0x3a, 0xa3, 0x26, 0x12, 0x84, 0x7b, 0x73, 0x1d, 0xd5, 0xbc, 0xf4, 0x47, 0xfd, 0x81, 0xf7, 0xd9, 0x03, 0xc4, 0x34, 0x06, 0x2b, 0x05, 0x40, 0xa7, 0x2e, 0x1d, 0xbd, 0x5c, 0x85, 0x27, 0x77, 0xf7, 0x75, 0xca, 0xd5, 0x34, 0x5b, 0xf5, 0x40, 0x7e, 0x06, 0x92, 0x5c, 0x94, 0x89, 0x0a, 0xa3, 0x0e, 0x63, 0x95, 0x5d, 0x54, 0x28, 0x86, 0x68, 0x17, 0x2d, 0xd3, 0xc3, 0x46, 0x93, 0xbb, 0x9c, 0xae, 0xea, 0x35, 0xdd, 0xda, 0xc4, 0x1b, 0xa3, 0xba, 0xee, 0x1e, 0x7e, 0xab, 0xb9, 0xba, 0xe4, 0x8d, 0x5e, 0x98, 0x9f, 0x84, 0xba, 0x0c, 0x7c, 0x29, 0x63, 0xed, 0xae, 0x90, 0x54, 0x9c, 0x74, 0x2a, 0x80, 0xe4, 0x4d, 0xbc, 0x5b, 0xaa, 0xd5, 0xbe, 0x64, 0xae, 0xab, 0xc1, 0x45, 0xb7, 0xfd, 0xc1, 0x48, 0xd3, 0x48, 0x32, 0x82, 0xea, 0x3f, 0x93, 0x3c, 0xa5, 0xef, 0xf1, 0x45, 0x73, 0xae, 0x60, 0x98, 0x36, 0x5e, 0xb1, 0xaa, 0x7c, 0x1b, 0x23, 0x68, 0xaa, 0x7f, 0x5c, 0x6a, 0x2d, 0xad, 0x23, 0xa5, 0x82, 0x9a, 0x0e, 0x65, 0x62, 0xca, 0x91, 0x61, 0x39, 0xfd, 0xd1, 0x3f, 0x6f, 0xc0, 0xf0, 0xa2, 0x2d, 0xcc, 0x99, 0x96, 0xd3, 0x6b, 0xe3, 0x51, 0x5c, 0x12, 0x3c, 0x23, 0x88, 0xc3, 0x8d, 0x42, 0x7c, 0xf3, 0xec, 0x9e, 0x5c, 0x69, 0xb7, 0xb6, 0xf7, 0xa7, 0x07, 0xd5, 0x56, 0x8b, 0x8b, 0x2c, 0x3f, 0x29, 0x02, 0x03, 0xb1, 0xde, 0xe6, 0xeb, 0xbd, 0x52, 0x4c, 0xf3, 0x4e, 0x03, 0xf9, 0x9f, 0x4a, 0x2d, 0x23, 0x10, 0x57, 0xf5, 0x96, 0xd2, 0x0e, 0x8c, 0x72, 0xd2, 0x56, 0xdf, 0x44, 0x1a, 0xcb, 0x36, 0xe9, 0x03, 0x67, 0xca, 0xa9, 0xbf, 0x38, 0x43, 0x73, 0x49, 0xb8, 0x9a, 0x13, 0x4c, 0x78, 0x89, 0xac, 0xc7, 0xb9, 0x8c, 0x2c, 0xee, 0x80, 0x04, 0xf7, 0x75, 0x4f, 0xd2, 0x7c, 0xb5, 0x20, 0xe2, 0x3b, 0xb8, 0xc5, 0x57, 0x2e, 0xc8, 0x9f, 0xcb, 0xd1, 0xee, 0xcf, 0x59, 0x6c, 0xc1, 0x85, 0xe6, 0x34, 0x42, 0xe2, 0x65, 0x7b, 0xbb, 0xae, 0x2e, 0x97, 0x0b, 0x3f, 0x1b, 0xfb, 0xd3, 0xcc, 0x5d, 0x01, 0xba, 0xf9, 0x30, 0x62, 0xa5, 0xd6, 0xe0, 0xca, 0xce, 0xde, 0x52, 0x68, 0x90, 0x76, 0xa3, 0x82, 0x88, 0x52, 0xa2, 0xb0, 0x9c, 0xa1, 0x3d, 0xf8, 0x95, 0x35, 0x31, 0x8d, 0x0a, 0x9c, 0xaa, 0xac, 0xb7, 0x2f, 0x30, 0x4e, 0xda, 0x0b, 0x56, 0x32, 0x8d, 0xda, 0xd5, 0xc2, 0xd3, 0x1b, 0x7f, 0xc1, 0xf6, 0xd1, 0xde, 0x07, 0xe4, 0x94, 0x34, 0xb9, 0x00, 0x40, 0x05, 0xa3, 0x6a, 0x0d, 0x8f, 0xd8, 0x44, 0x0b, 0xc3, 0x64, 0xd0, 0x53, 0x70, 0x5c, 0xc9, 0x99, 0x13, 0xac, 0xc8, 0x09, 0x85, 0x44, 0x3c, 0x1d, 0x99, 0x26, 0x52, 0x3c, 0xce, 0x50, 0xe4, 0x44, 0xd0, 0xd0, 0xa5, 0xa8, 0xad, 0x6b, 0xae, 0xf0, 0xca, 0x58, 0x22, 0x9f, 0x61, 0xf6, 0xb3, 0x6b, 0xd0, 0x34, 0x9b, 0x3b, 0x45, 0x25, 0x5e, 0x0e, 0xac, 0xf6, 0x82, 0x2b, 0x01, 0xa4, 0x49, 0x72, 0x23, 0xd7, 0xd3, 0x31, 0xb9, 0x36, 0xb2, 0x3e, 0x06, 0xcc, 0xfc, 0x82, 0xee, 0x12, 0x97, 0x26, 0xae, 0xe5, 0x03, 0xb5, 0x54, 0x3f, 0x45, 0xde, 0x94, 0xb1, 0x39, 0xbd, 0xd7, 0xe3, 0x20, 0xca, 0x85, 0xa1, 0x83, 0x04, 0xfc, 0x93, 0x8d, 0xbf, 0x2d, 0x49, 0x36, 0x8e, 0xf2, 0x82, 0x3f, 0xcf, 0xcf, 0xfb, 0xae, 0x31, 0x35, 0x45, 0xa4, 0xde, 0xd7, 0xc7, 0x07, 0xdd, 0xdc, 0x12, 0x68, 0x6f, 0x93, 0x44, 0xef, 0xd5, 0x96, 0x00, 0x04, 0x1a, 0xc7, 0x46, 0xe7, 0x51, 0x76, 0xd4, 0x3a, 0x50, 0x40, 0xce, 0x9a, 0x55, 0x1e, 0xd6, 0x9a, 0x8d, 0xd9, 0xc8, 0x34, 0xea, 0xda, 0xdc, 0x5f, 0x51, 0x88, 0x80, 0xcf, 0xf9, 0xb9, 0x20, 0x8b, 0x60, 0xf9, 0xbf, 0x2a, 0x24, 0x18, 0x8f, 0x86, 0xc8, 0xaa, 0x00, 0xf9, 0x05, 0xef, 0x38, 0x59, 0xa2, 0xe9, 0x36, 0xac, 0x01, 0xd5, 0xa6, 0x09, 0x22, 0x5c, 0xd7, 0xca, 0xc3, 0x15, 0xb4, 0x8f, 0x6f, 0x1e, 0xe9, 0xca, 0xe4, 0xad, 0x77, 0x28, 0x99, 0x8f, 0xdd, 0x8a, 0x5d, 0x82, 0x17, 0xa7, 0x58, 0x6f, 0x71, 0x66, 0x8f, 0x74, 0x69, 0xc9, 0x0e, 0x58, 0xf3, 0xc6, 0x37, 0x93, 0xf9, 0xff, 0xf6, 0x6b, 0x51, 0xa7, 0x5c, 0x61, 0x12, 0x92, 0x0d, 0xc9, 0x3b, 0x59, 0xe9, 0xea, 0x14, 0x25, 0x29, 0x28, 0xd1, 0x51, 0xc6, 0x1c, 0x39, 0x80, 0x2f, 0x99, 0xbd, 0xd0, 0xcd, 0x03, 0x71, 0xba, 0xb4, 0x1c, 0xd3, 0x2f, 0xa9, 0xaf, 0xc6, 0x24, 0x24, 0xb9, 0xd5, 0xc7, 0xe3, 0xda, 0xf1, 0xd2, 0x4d, 0xc2, 0x69, 0x31, 0x64, 0xc6, 0xfd, 0xb5, 0xce, 0x00, 0x3a, 0xc7, 0x9c, 0x95, 0xfd, 0x88, 0xb5, 0x58, 0xc5, 0x7d, 0x52, 0xf4, 0x58, 0x83, 0x4a, 0xc8, 0x07, 0xd3, 0x45, 0x53, 0x66, 0x00, 0x00, 0x01, 0x09 }; +constexpr AccessUnit AVC_SINGLE_PACK_EXPECTED_AU_1 = { 0x15f90, 0x159b2, true, 0, {}, { 0xdb, 0x46, 0x52, 0xf7, 0x3e, 0x38, 0x99, 0x16, 0xe6, 0x60, 0x20, 0x01, 0x4d, 0xce, 0x65, 0x8f, 0xfa, 0xb5, 0x8f, 0x3a } }; +constexpr AccessUnit AVC_SINGLE_PACK_EXPECTED_AU_2 = { std::numeric_limits::max(), std::numeric_limits::max(), false, 0, {}, { 0xd2, 0x40, 0xa9, 0x31, 0x5a, 0x2f, 0x92, 0xb0, 0x3c, 0x26, 0xa9, 0xd0, 0xdf, 0xfb, 0x97, 0x2d, 0xb3, 0xf1, 0x4d, 0x78 } }; + +constexpr std::array M2V_SINGLE_PACK_STREAM = { 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xe0, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x00, 0x00, 0x01, 0xb3, 0x5f, 0x55, 0xe4, 0xf8, 0x98, 0x9f, 0x07, 0x15, 0x3e, 0x0f, 0x8d, 0x16, 0xed, 0xcd, 0x0a, 0xa8, 0x39, 0xbf, 0xb5, 0xba, 0x30, 0xf0, 0x64, 0x37, 0x31, 0xba, 0xec, 0x8e, 0xa0, 0x68, 0xcc, 0xa1, 0xfd, 0x1f, 0x93, 0xff, 0xc3, 0xd1, 0xbf, 0x05, 0x6f, 0x8f, 0x71, 0x78, 0x90, 0xeb, 0xc1, 0x9e, 0xe6, 0x63, 0xad, 0x00, 0x07, 0xcb, 0x8f, 0x60, 0x57, 0xc6, 0x3c, 0xbb, 0x4b, 0x47, 0xe8, 0xc9, 0x8c, 0x58, 0x5c, 0x78, 0x12, 0x21, 0x20, 0xc8, 0x54, 0xa7, 0x85, 0x65, 0x2d, 0x4a, 0x86, 0xb3, 0x66, 0x5e, 0x89, 0x8e, 0xeb, 0xd6, 0x37, 0xaa, 0xcb, 0xab, 0xb0, 0x42, 0x94, 0xe6, 0x77, 0x86, 0xfd, 0x21, 0x8e, 0xb8, 0xe5, 0x4d, 0x5f, 0x94, 0x38, 0xc1, 0x0c, 0xaa, 0x92, 0xb4, 0xf4, 0x20, 0x75, 0x2d, 0x60, 0xa8, 0x83, 0x7b, 0x1d, 0xa1, 0x91, 0x7c, 0xf9, 0x82, 0xfb, 0x89, 0x19, 0x8e, 0x3b, 0xb2, 0x8b, 0xb9, 0x61, 0x3e, 0x62, 0x29, 0x96, 0xe6, 0x64, 0x91, 0xce, 0x61, 0x11, 0xb9, 0x69, 0x4d, 0xcb, 0xcb, 0x9c, 0xe2, 0xca, 0xa4, 0x97, 0x3a, 0x3a, 0xc5, 0xea, 0xeb, 0x2b, 0xf1, 0x08, 0xad, 0x68, 0xe3, 0xd2, 0xd0, 0xff, 0x49, 0x34, 0xb6, 0x09, 0x91, 0xa3, 0xfe, 0xc2, 0x4f, 0x69, 0x7e, 0xaf, 0xf5, 0x15, 0x42, 0x47, 0xc2, 0x8e, 0x14, 0xc6, 0x99, 0x80, 0x2f, 0x57, 0xbe, 0x39, 0x6e, 0x5e, 0xb2, 0x7f, 0x96, 0x21, 0xe5, 0x96, 0x6b, 0x4c, 0x99, 0xb5, 0x18, 0xcf, 0x87, 0x28, 0x5a, 0x66, 0x03, 0xaa, 0xcc, 0xd5, 0xce, 0x1d, 0x42, 0x99, 0xb4, 0x58, 0xf8, 0xf8, 0x82, 0x58, 0x8a, 0x94, 0x4a, 0xce, 0x92, 0x53, 0xec, 0xeb, 0x00, 0x00, 0x01, 0x00, 0xdd, 0xdc, 0xcc, 0xa9, 0x9d, 0x30, 0xfa, 0x65, 0xff, 0xd5, 0xc6, 0xb5, 0x2f, 0x5a, 0x14, 0xab, 0x0a, 0x86, 0x18, 0x98, 0x8c, 0x02, 0x49, 0x11, 0x05, 0x78, 0xf7, 0xae, 0x21, 0x7a, 0x5e, 0xa8, 0x1d, 0x5e, 0x1c, 0x1b, 0x7f, 0x8d, 0xe9, 0x05, 0x0b, 0x93, 0x4f, 0x98, 0xaa, 0x11, 0x71, 0x91, 0x0f, 0x8b, 0x47, 0x43, 0x69, 0x12, 0x1b, 0x30, 0x31, 0x3b, 0x8d, 0x5a, 0x09, 0x91, 0x19, 0x83, 0xd8, 0x68, 0x0d, 0xc9, 0x25, 0xf6, 0xdf, 0x42, 0xb2, 0x49, 0x76, 0xcf, 0x98, 0x6a, 0x54, 0xfa, 0x10, 0xd8, 0x5b, 0x51, 0x75, 0xb8, 0x80, 0x7e, 0xfd, 0x92, 0x7f, 0x57, 0xcf, 0x9c, 0xad, 0xb4, 0x90, 0xb1, 0x42, 0x3e, 0xa0, 0xea, 0xde, 0xea, 0x66, 0x7b, 0xd6, 0xa0, 0xf3, 0xc3, 0xa6, 0xe0, 0x4b, 0x3c, 0x97, 0xf0, 0x11, 0x95, 0xb7, 0xb7, 0xd1, 0x94, 0x0a, 0x32, 0x11, 0x4d, 0x34, 0x8d, 0x72, 0xc5, 0xfd, 0x96, 0xfc, 0x44, 0xd7, 0x59, 0xcf, 0xa5, 0xd7, 0x2d, 0x3a, 0xd0, 0x7d, 0x1c, 0x88, 0xac, 0x7d, 0x63, 0xad, 0xcd, 0x35, 0xd1, 0xba, 0x66, 0xc5, 0x20, 0xb7, 0x65, 0x41, 0xe3, 0x41, 0x39, 0xfe, 0xdd, 0x90, 0x40, 0x52, 0xe8, 0x51, 0x86, 0x2c, 0xb0, 0x1f, 0x36, 0x57, 0x77, 0x8c, 0xe7, 0xf6, 0x8f, 0xc6, 0x5d, 0xfe, 0xa4, 0x4c, 0x65, 0x01, 0x53, 0x0b, 0xe6, 0x8a, 0xc5, 0x6b, 0x17, 0xa0, 0xe7, 0x31, 0xe1, 0xce, 0x1e, 0xc8, 0xc8, 0xb3, 0x8d, 0x04, 0x0e, 0x7f, 0x6a, 0xaa, 0x32, 0x4e, 0x24, 0xe8, 0xc8, 0xbf, 0x8c, 0xec, 0xea, 0xcd, 0xb2, 0xd4, 0xdc, 0x0c, 0xb6, 0xc9, 0xac, 0x6e, 0x66, 0xa7, 0x22, 0xa5, 0x26, 0xe0, 0x90, 0xad, 0x6f, 0xef, 0x96, 0x85, 0xee, 0x53, 0xfb, 0xdd, 0xd6, 0x6a, 0xa7, 0x45, 0xb9, 0x64, 0x3b, 0x4d, 0xfc, 0xce, 0x21, 0x7d, 0x33, 0x70, 0xb4, 0xb6, 0x43, 0x97, 0x77, 0xcc, 0x8e, 0x38, 0xee, 0x82, 0x54, 0x26, 0x1e, 0xc1, 0x6e, 0x86, 0x1c, 0x39, 0x62, 0x46, 0xf5, 0x11, 0x95, 0xbf, 0x64, 0xa0, 0xf9, 0x1d, 0x1a, 0x23, 0x34, 0x42, 0x0b, 0x11, 0x6b, 0x55, 0x19, 0x37, 0xb8, 0x43, 0xa2, 0x24, 0x22, 0x08, 0xca, 0xa0, 0xb9, 0x90, 0xae, 0x74, 0x57, 0xb3, 0x7b, 0x31, 0x1a, 0x50, 0xc3, 0xe6, 0xb9, 0xaa, 0xb1, 0xc9, 0x41, 0xcd, 0x7f, 0x11, 0xac, 0xf2, 0x4f, 0x92, 0xeb, 0xe7, 0xd1, 0xd5, 0x58, 0x6a, 0xdd, 0x15, 0x1c, 0xd6, 0x9f, 0x4e, 0xb3, 0xa5, 0x7a, 0xdc, 0xde, 0x33, 0x25, 0x14, 0x59, 0x58, 0x21, 0x96, 0x8f, 0x5c, 0x78, 0x08, 0x5b, 0xe6, 0xa0, 0xca, 0x75, 0x83, 0x2a, 0x76, 0x16, 0x10, 0x34, 0x1f, 0x6f, 0x4b, 0x60, 0x8d, 0x8e, 0xf8, 0xb1, 0xe2, 0xac, 0xe5, 0xe3, 0x48, 0xcb, 0x99, 0xdb, 0x5e, 0xc8, 0xad, 0x15, 0x35, 0x44, 0xac, 0x92, 0x83, 0x95, 0x19, 0x91, 0x0c, 0x7f, 0x0a, 0xf2, 0x17, 0xc7, 0xff, 0x95, 0xd2, 0xee, 0x10, 0xad, 0xde, 0x03, 0xe2, 0x20, 0x1e, 0xd9, 0x4f, 0xda, 0x80, 0xf8, 0xba, 0x7e, 0x6d, 0x0c, 0x9e, 0xce, 0xbe, 0x61, 0x89, 0x16, 0x2a, 0x2f, 0xf6, 0x58, 0xce, 0x50, 0x4d, 0x23, 0x02, 0x5a, 0xf4, 0x11, 0xf3, 0xd7, 0x5a, 0x15, 0xaa, 0xd2, 0x74, 0xa1, 0x9b, 0x87, 0x40, 0xec, 0x37, 0x9f, 0x36, 0x05, 0x36, 0xd6, 0xf1, 0x7d, 0x2d, 0xd4, 0x16, 0x38, 0xf1, 0xe3, 0x64, 0xeb, 0x8d, 0x69, 0xa5, 0x6e, 0xac, 0xd6, 0x1c, 0x8b, 0x3d, 0x7a, 0x52, 0xb5, 0x50, 0xe4, 0x57, 0x61, 0xb8, 0xf2, 0xde, 0x77, 0x5c, 0x4b, 0x4a, 0x5a, 0x76, 0x97, 0x0d, 0x82, 0x50, 0xb6, 0x8a, 0x72, 0x64, 0x9f, 0xc2, 0x14, 0xbf, 0xbb, 0x4f, 0xe9, 0x5b, 0x34, 0x41, 0x27, 0xf3, 0x04, 0x8e, 0x9e, 0xd2, 0xc4, 0xc0, 0x56, 0xd5, 0x91, 0x99, 0x18, 0xbb, 0xd4, 0x41, 0xb3, 0xe4, 0x0a, 0xaf, 0x3f, 0xc2, 0xde, 0x4c, 0x97, 0x00, 0x4d, 0xc2, 0x83, 0x1c, 0x1c, 0xd9, 0x49, 0xd5, 0x24, 0x25, 0xab, 0x90, 0x8b, 0xac, 0x39, 0x58, 0x55, 0x1b, 0x17, 0xc3, 0x41, 0x66, 0x91, 0xa1, 0x78, 0x6e, 0x01, 0x20, 0x82, 0x54, 0x7e, 0xad, 0x0b, 0x6d, 0x05, 0x51, 0x00, 0x00, 0x01, 0x00, 0x12, 0xb7, 0x73, 0x59, 0x4c, 0x73, 0x73, 0x28, 0xdb, 0x82, 0x34, 0xcf, 0x9a, 0xa1, 0x13, 0xe9, 0xdf, 0x22, 0x5c, 0x02, 0xf7, 0x43, 0x86, 0x56, 0x99, 0x20, 0x4c, 0x74, 0x5b, 0x39, 0xe7, 0x55, 0x28, 0x06, 0x7e, 0x18, 0x1e, 0xbf, 0xaf, 0xbd, 0x73, 0xa5, 0x15, 0xb5, 0xc7, 0x8c, 0x1a, 0x07, 0x78, 0x78, 0xed, 0x02, 0x10, 0xe7, 0x34, 0xbd, 0x09, 0x14, 0xb9, 0xb3, 0xf8, 0x15, 0xe9, 0xd4, 0xa0, 0x41, 0x93, 0x69, 0x97, 0x46, 0xd1, 0x41, 0x0c, 0x3f, 0xa3, 0x2d, 0x24, 0xda, 0x2f, 0x2b, 0x04, 0xad, 0x07, 0x61, 0x91, 0xf0, 0x8f, 0x55, 0xa6, 0x70, 0x51, 0x5c, 0x2d, 0xfc, 0x30, 0xad, 0xc6, 0x47, 0xc4, 0x35, 0x6e, 0x47, 0xe0, 0x25, 0x02, 0x51, 0x2f, 0xed, 0xf5, 0x34, 0xe0, 0xe8, 0x4e, 0x9f, 0xc0, 0x43, 0x68, 0x05, 0x5c, 0x66, 0x54, 0x7d, 0x19, 0x19, 0xba, 0xf3, 0x12, 0xf1, 0xa6, 0xb1, 0xe3, 0x22, 0x2d, 0x71, 0x55, 0xe6, 0xce, 0x91, 0x0d, 0x92, 0x0d, 0x94, 0x1d, 0x7a, 0xc4, 0xa5, 0x53, 0x1c, 0x9b, 0xa7, 0x7f, 0xaa, 0xd2, 0x3b, 0xdd, 0x0f, 0x92, 0xc5, 0xef, 0x5f, 0xbd, 0x1a, 0xc4, 0xa1, 0x7b, 0x9a, 0xc6, 0xc2, 0x51, 0x8a, 0x8f, 0x02, 0x26, 0x0d, 0x49, 0x4b, 0x36, 0xfa, 0x1c, 0xfe, 0x62, 0xcd, 0x81, 0x95, 0x7c, 0x98, 0x7a, 0x45, 0x0d, 0xc5, 0x84, 0x75, 0x7e, 0x14, 0xaf, 0x11, 0x06, 0x23, 0x90, 0x8b, 0x50, 0x27, 0x8c, 0x57, 0xcc, 0x55, 0xa0, 0xa9, 0x52, 0x1a, 0x94, 0x9e, 0x96, 0x52, 0xdf, 0x7f, 0x6d, 0xcf, 0x37, 0x87, 0xae, 0x01, 0x28, 0x41, 0xde, 0x29, 0x70, 0x0c, 0x90, 0xf8, 0xcc, 0x7c, 0x2e, 0x6a, 0x37, 0x12, 0x9d, 0x49, 0xfe, 0x3f, 0xec, 0x6d, 0x21, 0xce, 0x67, 0x8b, 0xc9, 0xab, 0x20, 0x38, 0x80, 0x8b, 0x93, 0x24, 0x3f, 0x62, 0x03, 0x57, 0x59, 0x83, 0xb4, 0x6c, 0xdd, 0x68, 0xdd, 0x4c, 0x89, 0xfc, 0x79, 0x64, 0x47, 0x0e, 0x44, 0x96, 0xb7, 0x0b, 0x0a, 0xab, 0x9a, 0x1e, 0xc5, 0x24, 0x92, 0x3c, 0xf5, 0x91, 0x77, 0x39, 0x67, 0x41, 0x5a, 0xdd, 0x62, 0x91, 0x95, 0xe5, 0x64, 0x56, 0x0a, 0x2d, 0xee, 0xf4, 0x65, 0x98, 0xa6, 0x73, 0x28, 0x71, 0xb8, 0xa0, 0x9b, 0xa8, 0x95, 0x6e, 0xa6, 0xec, 0xb3, 0xf7, 0x19, 0xf5, 0xcd, 0x60, 0xf2, 0x5d, 0x1e, 0x23, 0x4c, 0xeb, 0x53, 0xad, 0x28, 0xd1, 0x7e, 0xa2, 0xbb, 0x83, 0xf8, 0x55, 0x9e, 0x08, 0x85, 0xfb, 0x47, 0x3c, 0x9e, 0x3b, 0xbb, 0x81, 0xa2, 0x13, 0xc0, 0x8e, 0x18, 0x37, 0x2e, 0x98, 0x61, 0x88, 0x3e, 0x13, 0x06, 0x67, 0x1e, 0x03, 0xea, 0x7a, 0xb1, 0x3e, 0x6b, 0xef, 0x68, 0x09, 0x11, 0xfb, 0x80, 0x16, 0x12, 0x34, 0xc3, 0xb1, 0x14, 0x13, 0x64, 0x64, 0xc6, 0x6d, 0xf9, 0x43, 0x2c, 0xc2, 0x08, 0xac, 0xb5, 0x72, 0xe2, 0xf6, 0x44, 0x65, 0x90, 0x0a, 0xdc, 0x80, 0xab, 0x69, 0xdf, 0x63, 0x22, 0x57, 0x9d, 0x8e, 0xd7, 0x7d, 0x8d, 0xd5, 0x10, 0xd1, 0xc8, 0xd1, 0xbd, 0x39, 0xd9, 0x71, 0x7b, 0x0f, 0x10, 0x7f, 0x9a, 0x35, 0xdb, 0x1f, 0x3e, 0x69, 0x7c, 0x79, 0x6c, 0x5e, 0x2f, 0x5e, 0x97, 0xd4, 0xfc, 0xff, 0x7f, 0xf3, 0x5c, 0x68, 0xa7, 0xd6, 0x3d, 0xce, 0x5c, 0x90, 0x98, 0x61, 0x0e, 0x13, 0xe6, 0x3d, 0xa0, 0x24, 0xae, 0x75, 0x0d, 0x2d, 0xfc, 0xd7, 0x93, 0xae, 0x17, 0xf6, 0x9a, 0x27, 0xb8, 0x78, 0xca, 0xfa, 0x5d, 0x54, 0x10, 0x12, 0xf2, 0x54, 0x71, 0x46, 0xf3, 0xf7, 0x32, 0xe4, 0xb6, 0xb7, 0xab, 0x9a, 0xe5, 0xd4, 0x12, 0xd8, 0x09, 0xdc, 0x35, 0xa1, 0xe9, 0x5e, 0x39, 0x47, 0xe2, 0x9d, 0x79, 0xf7, 0x56, 0x34, 0x73, 0x51, 0x48, 0x3d, 0xce, 0xef, 0x3c, 0xbd, 0xe8, 0xd5, 0xd5, 0x5b, 0x95, 0x64, 0xf0, 0x12, 0x57, 0xac, 0x66, 0xa0, 0x73, 0x43, 0xd9, 0x35, 0x40, 0x0e, 0x98, 0x1d, 0x3e, 0x7b, 0x35, 0xa6, 0xaa, 0xfe, 0xad, 0x7d, 0x5a, 0xe6, 0x10, 0x0b, 0xc8, 0x27, 0x7a, 0x1c, 0xb2, 0x72, 0x78, 0x16, 0xbf, 0x87, 0x3e, 0xc9, 0xe3, 0xf2, 0xea, 0x44, 0x4a, 0x4c, 0x65, 0x5c, 0x2e, 0xe1, 0xfc, 0xb8, 0x69, 0xfe, 0xf2, 0xdd, 0xe6, 0x96, 0x45, 0x84, 0xf8, 0xd2, 0xc2, 0x8b, 0xe3, 0x05, 0x9b, 0x32, 0x59, 0xf8, 0xba, 0xcf, 0x2d, 0xa8, 0x05, 0x26, 0x03, 0x5a, 0x1d, 0x9e, 0xc5, 0x1a, 0xdb, 0xb8, 0x9a, 0x9d, 0xab, 0x05, 0x3a, 0x15, 0x45, 0x20, 0x88, 0xe4, 0xd4, 0x89, 0x3b, 0x2d, 0xf8, 0x91, 0x21, 0x4f, 0xed, 0x30, 0xfd, 0xc7, 0x0c, 0x6b, 0x94, 0xb3, 0xa8, 0x56, 0x9b, 0x05, 0x94, 0x96, 0x4c, 0x06, 0xdf, 0x1b, 0xf6, 0xc8, 0xc8, 0x5c, 0xe6, 0x51, 0x4c, 0x93, 0xf0, 0x92, 0x1b, 0x9f, 0x89, 0xf9, 0xe7, 0x0d, 0xbd, 0x17, 0x8f, 0xc1, 0x27, 0x77, 0x8a, 0xde, 0xb4, 0xb3, 0x2b, 0xe3, 0x6a, 0xcb, 0xe7, 0xf2, 0x42, 0x3f, 0x7c, 0x3d, 0xa6, 0xa5, 0xcf, 0x82, 0x52, 0x99, 0x69, 0xbd, 0xee, 0xf1, 0xbf, 0xcd, 0x64, 0x03, 0x37, 0x64, 0xf3, 0x24, 0x8a, 0x57, 0x49, 0x6c, 0x20, 0xfd, 0x09, 0x69, 0xd8, 0x65, 0x04, 0x7d, 0xbe, 0x35, 0x5a, 0xd3, 0x4b, 0xe2, 0x4e, 0xa7, 0x0c, 0xee, 0x7b, 0xac, 0x7f, 0xb5, 0x02, 0x4f, 0x84, 0x87, 0xf7, 0x17, 0x22, 0xa2, 0x6f, 0x33, 0x94, 0x79, 0xc1, 0xb9, 0xc1, 0x14, 0xd6, 0x7a, 0x11, 0x70, 0xa8, 0xb7, 0x08, 0x3e, 0x7a, 0x36, 0x00, 0x26, 0x9d, 0x82, 0x08, 0x7f, 0x65, 0x81, 0x11, 0x2d, 0xf7, 0x63, 0xa1, 0xf0, 0x2c, 0x66, 0x7e, 0xf3, 0x35, 0xf8, 0x49, 0x5c, 0x17, 0xd0, 0x56, 0xc5, 0xbb, 0x78, 0x1c, 0xe8, 0x77, 0xde, 0xd9, 0x20, 0x82, 0xad, 0xc3, 0x0d, 0x2e, 0x7c, 0xc6, 0x9c, 0x7f, 0x6f, 0xb8, 0xc6, 0x20, 0x6c, 0x93, 0x62, 0x32, 0x1d, 0x1d, 0x79, 0xba, 0xaa, 0x59, 0x44, 0xfb, 0xcd, 0x66, 0xa5, 0x49, 0xae, 0xab, 0x0d, 0xa3, 0xcf, 0x29, 0x8b, 0xb4, 0x3a, 0x90, 0xc0, 0x2e, 0x64, 0x91, 0x78, 0x86, 0xfc, 0x75, 0x81, 0xed, 0xa8, 0x7d, 0x58, 0x65, 0xc4, 0x72, 0xf8, 0x3b, 0x6b, 0xbd, 0xe6, 0x09, 0x3d, 0x63, 0x87, 0x39, 0xbc, 0xf2, 0xbf, 0xe6, 0x75, 0x66, 0x2e, 0x50, 0x06, 0xe5, 0xf7, 0xab, 0x5a, 0xb5, 0x88, 0x91, 0x04, 0x81, 0x7f, 0xb7, 0x7b, 0xfa, 0x37, 0xa6, 0x6b, 0x7d, 0x8e, 0x96, 0x17, 0xcc, 0xf1, 0x9e, 0xb3, 0x5a, 0xd6, 0xf9, 0xa1, 0x70, 0x15, 0x63, 0x22, 0xaf, 0xe2, 0x0f, 0x6d, 0xb3, 0x34, 0x0c, 0x86, 0xb5, 0x48, 0x91, 0x1e, 0x70, 0x63, 0xb3, 0xa6, 0x14, 0x8f, 0xfe, 0x54, 0xaa, 0x5d, 0x26, 0xdb, 0x78, 0x24, 0xc1, 0xfe, 0x2b, 0x83, 0x7e, 0x1f, 0xd1, 0xf5, 0x50, 0x30, 0x1a, 0x3a, 0xf0, 0x3c, 0x58, 0xa5, 0x00, 0x00, 0x01, 0xb7 }; +constexpr AccessUnit M2V_SINGLE_PACK_EXPECTED_AU_1 = { 0x15f90, 0x159b2, true, 0, {}, { 0xcc, 0xde, 0x79, 0xd3, 0x4e, 0x18, 0x1d, 0xe1, 0xd9, 0xb6, 0x96, 0x08, 0x89, 0x4d, 0x21, 0xc9, 0x3c, 0x69, 0xf0, 0x97 } }; +constexpr AccessUnit M2V_SINGLE_PACK_EXPECTED_AU_2 = { std::numeric_limits::max(), std::numeric_limits::max(), false, 0, {}, { 0x62, 0xee, 0x39, 0x77, 0xee, 0xb9, 0x4b, 0xa8, 0x02, 0x81, 0xb1, 0x65, 0x11, 0x6b, 0xa8, 0x40, 0xd8, 0x80, 0xff, 0xf3 } }; + +constexpr std::array ATRACX_SINGLE_PACK_STREAM = { 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xbd, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xd0, 0x00, 0x00, 0xf9, 0x59, 0xfb, 0xc5, 0x0f, 0xd0, 0x00, 0xd6, 0xa6, 0x43, 0x65, 0x4e, 0x0f, 0xd0, 0x00, 0xd5, 0x0b, 0xf0, 0x8b, 0x9a, 0x6b, 0x02, 0xf9, 0xe8, 0xc3, 0x80, 0x7f, 0x21, 0xad, 0xe3, 0x55, 0xe4, 0x2b, 0xb3, 0x50, 0xad, 0x7d, 0xb8, 0x7b, 0x69, 0xaa, 0x09, 0xf6, 0x6f, 0xb1, 0x31, 0x57, 0x04, 0x1b, 0x22, 0x91, 0x9a, 0xc0, 0x05, 0xe6, 0x27, 0x6a, 0x65, 0xee, 0xac, 0xc9, 0x56, 0xa3, 0x4e, 0xcf, 0xef, 0xcb, 0xff, 0x5a, 0x4d, 0x31, 0xed, 0x72, 0xa4, 0xb0, 0x26, 0x8a, 0x7e, 0xd6, 0x28, 0x8a, 0x51, 0x77, 0x4a, 0x51, 0x9f, 0x38, 0x7a, 0xa5, 0xac, 0x69, 0xcf, 0x7b, 0x22, 0xbb, 0xc1, 0x0d, 0x1b, 0x7b, 0x50, 0x1e, 0x66, 0xce, 0xc0, 0x98, 0x33, 0x4f, 0x04, 0xcb, 0xd3, 0x44, 0x89, 0x54, 0xe4, 0xb9, 0x0d, 0x05, 0x86, 0xfd, 0x21, 0xf1, 0x5f, 0xda, 0xcb, 0x19, 0x74, 0xb9, 0x90, 0xa8, 0x10, 0xe4, 0xf8, 0xbc, 0x9b, 0x04, 0xc1, 0x67, 0x11, 0x6b, 0x13, 0x82, 0xec, 0x62, 0x48, 0x3b, 0x44, 0xa7, 0xf1, 0x45, 0x54, 0x2f, 0x51, 0x77, 0xfc, 0xa5, 0xed, 0xd3, 0x24, 0x2e, 0xf6, 0xfa, 0x8d, 0xff, 0x06, 0x13, 0x66, 0xda, 0x5f, 0x70, 0x4e, 0x3e, 0xcf, 0xe2, 0xd1, 0x03, 0x8e, 0xa2, 0xec, 0x22, 0x50, 0x81, 0x0f, 0xdf, 0x3f, 0x8e, 0x99, 0x0f, 0xb9, 0x5c, 0x05, 0x32, 0xa9, 0x0a, 0x0d, 0xd1, 0xfb, 0xcb, 0xdf, 0x21, 0x13, 0xf1, 0x35, 0xcc, 0x39, 0xb8, 0xb2, 0x09, 0xc7, 0xa8, 0x01, 0x33, 0xb4, 0x0d, 0x15, 0x59, 0x0f, 0xca, 0x36, 0x3c, 0x64, 0xb7, 0x91, 0x35, 0xe9, 0x0d, 0x40, 0x1a, 0xd3, 0xe0, 0xe9, 0x00, 0xd0, 0x9d, 0x98, 0x0b, 0x1a, 0x54, 0xf6, 0x9a, 0x1b, 0x46, 0x66, 0x87, 0xea, 0x21, 0xc6, 0x30, 0xb3, 0x32, 0xaa, 0xd0, 0xb3, 0x4e, 0x70, 0x36, 0xc5, 0xfd, 0xae, 0x35, 0xb1, 0x65, 0x6c, 0xfd, 0xa8, 0xe4, 0xe6, 0x00, 0x7a, 0x51, 0x0d, 0xcf, 0x99, 0x62, 0x16, 0xc6, 0xde, 0x7f, 0x79, 0xc4, 0xe7, 0x0f, 0xed, 0xc5, 0x6e, 0xaa, 0xd2, 0x98, 0xef, 0xb4, 0x34, 0x76, 0x58, 0x1b, 0x74, 0x62, 0xa4, 0x87, 0x3a, 0x37, 0x45, 0x1f, 0x48, 0xc0, 0xe5, 0xb7, 0xd5, 0x15, 0xe7, 0x4b, 0xc6, 0xef, 0x39, 0x19, 0x49, 0x89, 0x85, 0x41, 0xa3, 0xd3, 0x6f, 0x2f, 0xb1, 0x00, 0x8b, 0xa4, 0xf0, 0xcd, 0x40, 0x73, 0xfa, 0xf8, 0x46, 0x95, 0x75, 0xe0, 0xb1, 0x63, 0x74, 0xf1, 0x5c, 0xd7, 0xf0, 0x38, 0x21, 0xc7, 0xad, 0xa4, 0xa6, 0xbd, 0x47, 0x13, 0xc2, 0x6f, 0x2f, 0xbe, 0x87, 0x05, 0x36, 0x3e, 0x00, 0xe7, 0x8d, 0xb7, 0x00, 0xcd, 0xc1, 0xb7, 0xbc, 0x94, 0x5b, 0x45, 0x8f, 0xf3, 0x05, 0x35, 0xa1, 0xc9, 0x84, 0xde, 0x52, 0x5b, 0xc9, 0xe8, 0xc0, 0x60, 0x14, 0x7f, 0x81, 0xe6, 0xb2, 0xdb, 0x5a, 0xd1, 0xfd, 0x38, 0xe8, 0x3d, 0x63, 0x55, 0x00, 0x0c, 0xae, 0xf0, 0x7f, 0xb2, 0x39, 0x9b, 0xff, 0x25, 0x87, 0xc9, 0x2a, 0x94, 0xf3, 0xfc, 0x11, 0xcd, 0x3f, 0x8b, 0x1a, 0xca, 0x14, 0xe5, 0x26, 0x5f, 0xed, 0xc5, 0xe4, 0x4d, 0xb9, 0x20, 0x04, 0x24, 0x0e, 0xeb, 0x2e, 0x8e, 0x0e, 0x9e, 0xa4, 0xea, 0x1a, 0x92, 0xb3, 0x37, 0xe9, 0x08, 0x39, 0x8c, 0xe0, 0x96, 0x3d, 0x4c, 0xa3, 0xb5, 0xd9, 0xb1, 0x24, 0xea, 0x40, 0xeb, 0x99, 0x21, 0x7d, 0x91, 0xc7, 0xae, 0x36, 0x7a, 0x95, 0xd0, 0x79, 0x65, 0xa8, 0x6f, 0xf7, 0x87, 0xf3, 0x99, 0x95, 0xfd, 0xe6, 0x35, 0x1e, 0xf9, 0x8d, 0xd1, 0xdb, 0x3d, 0x46, 0xe0, 0xd4, 0x5c, 0x94, 0x59, 0x86, 0x34, 0x47, 0xae, 0x63, 0xb0, 0x4c, 0xea, 0xa0, 0x99, 0x03, 0x71, 0x2d, 0xd3, 0x92, 0xea, 0x5a, 0x8e, 0x82, 0x06, 0x27, 0xd7, 0xce, 0xc1, 0x3c, 0xbc, 0xa7, 0xb6, 0x5a, 0xfc, 0x5c, 0x58, 0x1e, 0x5a, 0x66, 0x77, 0xae, 0x20, 0xa7, 0x8e, 0xb9, 0x3a, 0x96, 0xef, 0x1f, 0xfc, 0x6c, 0x89, 0x36, 0xae, 0x75, 0xac, 0xff, 0x40, 0xca, 0x95, 0x5d, 0xa0, 0x61, 0x65, 0x33, 0x3a, 0xae, 0x67, 0x0f, 0x2e, 0x12, 0x69, 0x9f, 0x8c, 0x21, 0x2b, 0x6a, 0x74, 0xe2, 0xbc, 0xf3, 0xfc, 0xe9, 0xa5, 0x19, 0xf7, 0xb5, 0x0f, 0x69, 0x0f, 0x5f, 0x06, 0xc2, 0xac, 0x06, 0x2d, 0xea, 0x1a, 0x49, 0x02, 0x01, 0x50, 0xd1, 0xa7, 0xbf, 0x6a, 0xbf, 0x15, 0x21, 0xcf, 0xf1, 0x21, 0xae, 0x1e, 0x25, 0x48, 0x34, 0x30, 0x77, 0x65, 0xca, 0x91, 0x9d, 0xa1, 0xff, 0xb0, 0xd7, 0xdd, 0x9e, 0xd2, 0x8a, 0x7e, 0x8f, 0x95, 0x16, 0xae, 0x1e, 0x37, 0xc4, 0x43, 0x29, 0x35, 0x4d, 0x8f, 0xe0, 0xbe, 0x0a, 0x42, 0x9c, 0x16, 0x32, 0x65, 0x1a, 0x8e, 0xea, 0xb6, 0xda, 0x90, 0xb3, 0x18, 0x5b, 0x26, 0xcb, 0x95, 0xfd, 0xaf, 0x59, 0x4b, 0x74, 0xc7, 0xbe, 0x26, 0xa2, 0x27, 0x85, 0x64, 0xd7, 0x45, 0xe7, 0x90, 0x4f, 0x25, 0xa3, 0x47, 0x5c, 0xbe, 0x24, 0xa8, 0x20, 0xb9, 0xda, 0x42, 0x4e, 0xea, 0x71, 0x02, 0x9e, 0xb0, 0x64, 0x18, 0x38, 0xb0, 0x53, 0x2f, 0x5c, 0x4f, 0x10, 0x91, 0x31, 0x66, 0xa3, 0x51, 0xa0, 0xf4, 0x75, 0x9f, 0x3f, 0xd6, 0xaf, 0x5e, 0x42, 0xde, 0xd1, 0x7d, 0xa8, 0x46, 0x1d, 0xf8, 0xe6, 0xb8, 0x34, 0x50, 0xc7, 0x8d, 0xa5, 0x56, 0x8a, 0xce, 0xec, 0x03, 0xc8, 0xb1, 0xa1, 0x7e, 0xb6, 0x40, 0xf4, 0x0b, 0x6b, 0x17, 0x4d, 0xbe, 0x87, 0x2a, 0xe4, 0xe5, 0xc0, 0x1a, 0x05, 0x40, 0xe8, 0x3b, 0xbe, 0x97, 0x1d, 0xca, 0xee, 0xfb, 0xc7, 0x8f, 0xf5, 0x96, 0xa4, 0xbb, 0xc7, 0x1e, 0x79, 0x5a, 0x95, 0x6f, 0x12, 0x6d, 0x46, 0x37, 0xa5, 0x9a, 0xbb, 0xe4, 0xb6, 0xbe, 0x82, 0xb0, 0x7f, 0xe5, 0x63, 0xa4, 0xbd, 0x73, 0x41, 0x5c, 0xbf, 0xd5, 0x59, 0x44, 0x83, 0x1a, 0x26, 0xf9, 0xaa, 0x03, 0xa0, 0xaf, 0x72, 0xb1, 0x3a, 0x17, 0x01, 0x80, 0xf1, 0xca, 0x4e, 0x18, 0x00, 0x0c, 0x1b, 0xd9, 0xaa, 0xce, 0x2e, 0xe9, 0x89, 0xf0, 0x42, 0x32, 0x19, 0x4f, 0x74, 0x5f, 0x2f, 0x04, 0x6f, 0xe7, 0x8a, 0x03, 0x81, 0x6f, 0x76, 0x74, 0xc0, 0xfc, 0xba, 0x92, 0x73, 0xbe, 0x95, 0xc5, 0x4b, 0x78, 0xcd, 0x30, 0x7a, 0x0f, 0xca, 0x1c, 0x36, 0x85, 0xfb, 0xc7, 0xd9, 0xc4, 0xb0, 0xd5, 0xb9, 0xf4, 0x23, 0x70, 0x6a, 0x9a, 0x27, 0x86, 0x24, 0xa6, 0xb0, 0x96, 0xfb, 0xaa, 0xe7, 0xf0, 0x5d, 0x80, 0xb6, 0x19, 0x80, 0x01, 0xf5, 0x9c, 0x0f, 0x08, 0x49, 0x82, 0x58, 0x59, 0x16, 0x99, 0xbb, 0x78, 0x65, 0xe0, 0x2c, 0x6c, 0x1c, 0xf3, 0xda, 0x67, 0xb9, 0xf3, 0xb1, 0xa2, 0x19, 0x4f, 0x9b, 0x30, 0x2e, 0xc3, 0xc0, 0x01, 0x90, 0x7d, 0x4e, 0x05, 0xda, 0xde, 0x49, 0x40, 0xe5, 0x53, 0xf1, 0x0b, 0x66, 0x3b, 0x7f, 0x5d, 0xda, 0xcd, 0x28, 0x38, 0xfa, 0x44, 0x3f, 0xe6, 0x27, 0x06, 0x58, 0x27, 0x96, 0xaa, 0xe1, 0x1a, 0xe5, 0x1c, 0xc4, 0xa6, 0xc7, 0xbe, 0x27, 0xd3, 0xb8, 0x53, 0xc6, 0x71, 0xd8, 0x44, 0x2f, 0xe9, 0x6d, 0xae, 0xe8, 0x06, 0x62, 0xad, 0xfc, 0x7d, 0x1e, 0xc0, 0x67, 0x8a, 0xb3, 0x18, 0xd6, 0xb5, 0x14, 0xe7, 0xc9, 0x99, 0xeb, 0x3d, 0xab, 0x1c, 0x4f, 0xda, 0x56, 0xde, 0xba, 0x5b, 0xe6, 0xed, 0x58, 0x22, 0x3a, 0xc9, 0x89, 0xef, 0x4e, 0xf1, 0xaa, 0xdf, 0xae, 0x81, 0xbe, 0x34, 0x29, 0x5e, 0x18, 0x90, 0xe9, 0x7c, 0x89, 0xa4, 0xeb, 0x11, 0x33, 0x39, 0x3b, 0x36, 0x18, 0x00, 0x43, 0xac, 0xa3, 0x02, 0xe6, 0xd9, 0x6b, 0x0d, 0xa9, 0xea, 0x31, 0x6f, 0x66, 0xc8, 0xab, 0x3d, 0x9f, 0x11, 0x8a, 0x17, 0x13, 0x43, 0x13, 0xd2, 0xc1, 0x37, 0x90, 0x9f, 0x57, 0xc7, 0x03, 0xcf, 0x05, 0x9c, 0x74, 0x8d, 0xd5, 0xe1, 0xd9, 0x75, 0xe2, 0x12, 0x04, 0x41, 0x30, 0x24, 0x6e, 0x52, 0xf3, 0xf8, 0xbc, 0xa4, 0xba, 0x39, 0x39, 0xff, 0xea, 0x71, 0x78, 0x9f, 0x38, 0xbe, 0xbd, 0xcd, 0x74, 0xc5, 0x56, 0xb8, 0x35, 0x5c, 0xf5, 0x01, 0x9e, 0xbf, 0x8a, 0xc4, 0x2c, 0x3c, 0x7c, 0xb5, 0x78, 0x36, 0x27, 0xc3, 0x19, 0xb8, 0x37, 0x6e, 0xa2, 0x02, 0xc0, 0x1f, 0x09, 0x6c, 0x2e, 0xf6, 0xcc, 0xcf, 0x05, 0xbf, 0xdb, 0xa3, 0x23, 0xe4, 0x6f, 0xb2, 0x33, 0xd8, 0xc5, 0xa1, 0x83, 0x04, 0x15, 0x45, 0xcc, 0xf9, 0xc5, 0xba, 0x98, 0xc5, 0x82, 0xf5, 0xda, 0x08, 0x64, 0xf0, 0xb9, 0x54, 0x5f, 0x34, 0x2c, 0x23, 0x57, 0x22, 0x81, 0xf5, 0xb7, 0x01, 0xdb, 0x41, 0x29, 0x78, 0xbb, 0x93, 0xe7, 0x08, 0x85, 0x86, 0x84, 0xf1, 0x6d, 0x9e, 0xc4, 0x91, 0x18, 0x74, 0xd8, 0xd3, 0x5f, 0xb5, 0x33, 0x56, 0x76, 0xc1, 0xd2, 0x39, 0x83, 0x29, 0x44, 0xf8, 0x1d, 0xf6, 0xd0, 0xd2, 0x4b, 0x50, 0x01, 0xc0, 0xf4, 0xa2, 0xac, 0x1a, 0x04, 0x77, 0xce, 0xf1, 0x3e, 0x53, 0xea, 0xe0, 0xfb, 0xc8, 0xe6, 0xe0, 0xda, 0x23, 0xa9, 0xcc, 0x88, 0x50, 0x95, 0x5c, 0x0f, 0x48, 0x31, 0x4d, 0x6a, 0x46, 0xc8, 0xad, 0xa3, 0xbe, 0xb0, 0x8a, 0x70, 0x3e, 0x4a, 0x79, 0x77, 0x07, 0xb1, 0xfc, 0x8f, 0xdd, 0x2d, 0x2e, 0x1d, 0x10, 0x33, 0xcf, 0x62, 0x35, 0x55, 0x12, 0x40, 0x50, 0x24, 0xc2, 0x0f, 0xb6, 0x59, 0x88, 0x1e, 0x87, 0xbf, 0x77, 0x1c, 0x78, 0x77, 0x7e, 0xad, 0x8d, 0x43, 0xf4, 0xe4, 0xe4, 0x00, 0x7a, 0x71, 0xff, 0x3b, 0x3f, 0x3e, 0x17, 0x4f, 0x19, 0xa1, 0x4d, 0x6f, 0xa8, 0xec, 0x30, 0x87, 0xd7, 0xff, 0x46, 0x9d, 0x4d, 0x2e, 0xa8, 0x61, 0x45, 0x06, 0x51, 0xd0, 0x7b, 0x2e, 0xbe, 0x5e, 0x7d, 0x45, 0x3e, 0x95, 0x52, 0xff, 0x64, 0xb6, 0x28, 0x7e, 0x2a, 0x7b, 0x33, 0xb4, 0x80, 0x17, 0x57, 0xc6, 0x80, 0xde, 0xfc, 0x3f, 0x25, 0xe4, 0x35, 0x85, 0xd1, 0xce, 0xa1, 0x2a, 0xd7, 0x6e, 0x83, 0x6c, 0x61, 0x5d, 0xa8, 0xaf, 0xa0, 0x1e, 0x15, 0x51, 0x57, 0x93, 0xd0, 0x51, 0x21, 0x68, 0x79, 0x99, 0x25, 0xbe, 0x51, 0xc2, 0xf4, 0x72, 0x5c, 0x05, 0x60, 0x05, 0x81, 0xff, 0x20, 0x81, 0x28, 0xb7, 0x38, 0xb4, 0xb2, 0x1a, 0xdd, 0xe9, 0xab, 0xc7, 0x29, 0x4f, 0x24, 0xef, 0x99, 0xae, 0x0c, 0xcc, 0xe7, 0x24, 0xca, 0xa8, 0x71, 0x15, 0xef, 0x58, 0xb2, 0x58, 0x4b, 0xbe, 0x64, 0xbe, 0x68, 0xcc, 0x9f, 0xbf, 0x31, 0xa5, 0x0c, 0x44, 0x71, 0xec, 0x47, 0xa0, 0xda, 0xa5, 0xde, 0x54, 0x19, 0x30, 0xa9, 0x1c, 0x19, 0xbc, 0x18, 0x65, 0x71, 0x70, 0xbc, 0x53, 0x95, 0xe3, 0x44, 0x3f, 0x02, 0x24, 0x15, 0xc9, 0xe0, 0x7e, 0xb2, 0x29, 0xc9, 0x8b, 0x73, 0x28, 0xab, 0xc5, 0xde, 0x37, 0x0f, 0x44, 0x0d, 0x3e, 0x80, 0x52, 0x44, 0xe2, 0xe2, 0x0d, 0xe2, 0x6e, 0xd5, 0xc6, 0xa0, 0xb5, 0xe9, 0x70, 0x0d, 0xcc, 0x52, 0x1f, 0xc3, 0xaa, 0x64, 0x0e, 0xbe, 0x83, 0x0e, 0xfe, 0xb6, 0xee, 0xe0, 0xee, 0xb9, 0x50, 0x47, 0xe3, 0xa1, 0x8d, 0xff, 0x33, 0x8c, 0x6b, 0x45, 0xfb, 0xa0, 0x2c, 0xb6, 0xae, 0xf3, 0x93, 0xb3, 0xca, 0x27, 0xf2, 0x43, 0x83, 0x15, 0x26, 0xa5, 0xe8, 0x48, 0xc4, 0x91, 0x43, 0x42, 0xa2, 0x59, 0x38, 0xff, 0x55, 0x08, 0x0c, 0xf2, 0x22, 0x56, 0x25, 0xda, 0xf9, 0x33, 0xa9, 0xff, 0x0a, 0xbb, 0x83, 0x68, 0xee, 0xc1, 0xa0, 0xde, 0x2d, 0x75, 0x67, 0x3d, 0xa2, 0x4a, 0xef, 0xf5, 0x05, 0x62, 0x6a, 0x5e, 0x3c, 0x26, 0x86, 0xb6, 0xed, 0x22, 0xea, 0x96, 0xbb, 0x91, 0xa7, 0xee, 0x20, 0x77, 0x3a, 0x59, 0x97, 0x31, 0x47, 0x07, 0xad, 0xcd, 0xe3, 0x96, 0x27, 0x43, 0xab, 0xc2, 0xa4, 0xb7, 0x69, 0xef, 0x25, 0xb1, 0x97, 0xa4, 0x79, 0x17, 0x81, 0xbd, 0x68, 0xb5, 0x97, 0x60, 0x66, 0xb1, 0x97, 0x2b, 0x7a, 0x50, 0xf3, 0xc2, 0x10, 0xec, 0xd4, 0xf1, 0x38, 0x1c, 0xdf, 0xa0, 0x08, 0xb8, 0xb8, 0x9f, 0x46, 0x0e, 0x57, 0x53, 0x34, 0xf8, 0x14, 0xa5, 0xdc, 0x69, 0xef, 0x96, 0xe3, 0x54, 0xcf, 0x13, 0xcb, 0x02, 0xb7, 0x24, 0x77, 0xb5, 0xd6, 0xc0, 0x74, 0x65, 0x65, 0xb4, 0x97, 0x0d, 0x15, 0x2e, 0xa9, 0xc7, 0x24, 0x22, 0x13, 0xf7, 0x50, 0x5f, 0xf5, 0xb1, 0x79, 0xce, 0xf6, 0x15, 0xcf, 0x47, 0x1c, 0x4c, 0x40, 0x61, 0x84, 0x74, 0x23, 0x6e, 0xae, 0xaa, 0x00, 0x3a, 0x34, 0x26, 0x8e, 0x92, 0xa2, 0x55, 0xae, 0x89, 0xc1, 0xbc, 0xb9, 0x13, 0xe1, 0x22, 0x8b, 0x52, 0x62, 0x45, 0xa1, 0x01, 0x4f, 0x97, 0x4e, 0xc7, 0xc3, 0xfd, 0xc9, 0x9e, 0x92, 0x67, 0xbb, 0x21, 0x31, 0x5d, 0x10, 0xbc, 0x3a, 0x27, 0xe8, 0x55, 0x48, 0x46, 0x21, 0x56, 0x8a, 0x0f, 0xd0, 0x62, 0x9a, 0xe1, 0xd0, 0xe1, 0x77, 0x53, 0x0b }; +constexpr AccessUnit ATRACX_SINGLE_PACK_EXPECTED_AU_1 = { 0x15f90, 0x159b2, false, 0, {}, { 0xca, 0x9d, 0x63, 0xb7, 0xda, 0xcd, 0xd6, 0xb1, 0xa0, 0x27, 0xf2, 0x61, 0xc1, 0x56, 0x3e, 0x3e, 0xb1, 0x1c, 0x5e, 0x76 } }; +constexpr AccessUnit ATRACX_SINGLE_PACK_EXPECTED_AU_2 = { std::numeric_limits::max(), std::numeric_limits::max(), false, 0, {}, { 0xeb, 0x30, 0x7d, 0xad, 0x5f, 0xcb, 0xc1, 0x17, 0xc1, 0x10, 0x19, 0xef, 0xd5, 0xd3, 0xaa, 0x72, 0x6f, 0xd2, 0x5d, 0x5b } }; + +constexpr std::array AC3_SINGLE_PACK_STREAM = { 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xbd, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x30, 0x00, 0x00, 0x00, 0x0b, 0x77, 0x59, 0x66, 0x00, 0x87, 0x05, 0xf4, 0xa8, 0x09, 0x93, 0x66, 0x9e, 0xcf, 0x4e, 0x3e, 0x1e, 0xc6, 0x10, 0x6b, 0xaa, 0x2b, 0x3d, 0x5c, 0xec, 0x4b, 0x2e, 0xd1, 0x47, 0x6f, 0x9c, 0x77, 0x35, 0x7a, 0x6a, 0xcf, 0x95, 0x42, 0x66, 0xca, 0x6c, 0x31, 0xae, 0x53, 0xc3, 0x84, 0xf1, 0x00, 0x1a, 0x5a, 0x11, 0xb4, 0xd0, 0x32, 0x15, 0xaa, 0x97, 0x7e, 0xb8, 0x2f, 0xc6, 0x5e, 0x79, 0xd8, 0xf5, 0x85, 0x8b, 0x2a, 0x4b, 0x8c, 0xfd, 0x0b, 0xb0, 0x5a, 0x05, 0x0b, 0x77, 0x76, 0xd7, 0x69, 0x3c, 0xf2, 0xad, 0x10, 0x4f, 0xc7, 0x20, 0x30, 0x68, 0xb3, 0x72, 0x47, 0x58, 0x13, 0xcb, 0x17, 0x94, 0xe0, 0x13, 0xd8, 0xa2, 0xf7, 0xf2, 0x71, 0xbe, 0xdc, 0x9f, 0x15, 0x23, 0xfd, 0x98, 0x1c, 0x5b, 0x79, 0xca, 0xe0, 0x6f, 0x8e, 0xa2, 0x7a, 0xce, 0xa6, 0xc5, 0x41, 0xd5, 0x30, 0x83, 0x22, 0x0b, 0x77, 0x99, 0x0a, 0x99, 0x5c, 0xaa, 0xc6, 0x49, 0x3c, 0x95, 0x33, 0x0a, 0x9f, 0x5c, 0x73, 0xfb, 0x0e, 0xa9, 0xaf, 0x4e, 0x0d, 0xec, 0xfc, 0xbb, 0x0f, 0x61, 0x9a, 0x9f, 0xa0, 0x5b, 0x14, 0x88, 0x6b, 0x76, 0x43, 0x7a, 0x0d, 0x2d, 0x1b, 0x6d, 0xea, 0x84, 0x13, 0x0f, 0xe2, 0x89, 0xb3, 0xef, 0xe2, 0xe7, 0x2b, 0xbd, 0xde, 0x20, 0x07, 0x61, 0x99, 0xbd, 0x24, 0x94, 0xd5, 0x0c, 0xa8, 0x69, 0x99, 0xb9, 0xf3, 0x7d, 0x9c, 0x5b, 0xbd, 0x76, 0x6f, 0x1f, 0x8b, 0x61, 0x20, 0x83, 0x53, 0xb0, 0xd5, 0x86, 0xd9, 0xd9, 0xcf, 0x49, 0x4a, 0x3a, 0xd6, 0x51, 0xf6, 0x09, 0x4a, 0x09, 0x1b, 0xc5, 0xce, 0xbf, 0x35, 0xfa, 0x93, 0x75, 0x5f, 0x7c, 0x04, 0xc3, 0xd2, 0x17, 0xd8, 0x76, 0x0d, 0xc0, 0x86, 0xc3, 0x7e, 0xfc, 0x7c, 0x2a, 0xe3, 0xc9, 0x13, 0x74, 0xec, 0x5b, 0x8d, 0x9b, 0x45, 0x6b, 0x12, 0xa5, 0x1f, 0xeb, 0xf5, 0x75, 0x24, 0x22, 0xa8, 0xbf, 0xc6, 0xb8, 0x35, 0xe5, 0x95, 0x69, 0xaf, 0xfc, 0xc1, 0xe6, 0x49, 0x01, 0x0d, 0x4b, 0xc8, 0xf0, 0x02, 0x9e, 0x4a, 0xb2, 0x43, 0xb4, 0x4f, 0xb2, 0xd6, 0x6a, 0x38, 0xfe, 0xe8, 0x80, 0x6e, 0x73, 0x51, 0x2f, 0xd4, 0x9e, 0x56, 0xd8, 0xa0, 0x40, 0x9b, 0x65, 0xb5, 0xc2, 0x04, 0x86, 0x15, 0x92, 0xe0, 0x7a, 0x26, 0x0c, 0xc9, 0x6a, 0x27, 0xd9, 0xfc, 0x4e, 0x50, 0xc5, 0xac, 0xe5, 0x45, 0xec, 0x2a, 0x13, 0x95, 0xaf, 0xf3, 0x81, 0xe1, 0x5b, 0xc7, 0x87, 0x50, 0x67, 0xdb, 0xc2, 0x79, 0xd5, 0x2e, 0xdd, 0x42, 0x51, 0x3b, 0x14, 0x1d, 0x83, 0x3c, 0x25, 0x4b, 0xe7, 0x77, 0x48, 0xa8, 0xed, 0x1d, 0x55, 0x75, 0xf1, 0x65, 0xca, 0x6d, 0x5a, 0x13, 0x7c, 0x9b, 0xdb, 0x95, 0x7d, 0xf3, 0x42, 0xcf, 0x49, 0x17, 0xe5, 0x07, 0xbb, 0x7d, 0xf0, 0x6f, 0x9d, 0xcb, 0x9e, 0x07, 0x11, 0x5a, 0x51, 0x9b, 0x80, 0x5e, 0x77, 0xc6, 0x3c, 0xa8, 0xa5, 0x22, 0xa8, 0xb2, 0x83, 0x97, 0x8a, 0xdf, 0x75, 0x49, 0x43, 0x59, 0x5d, 0x5c, 0x32, 0x14, 0x6c, 0xc3, 0xb4, 0xf5, 0x25, 0xe7, 0xdf, 0xb0, 0xb3, 0xc6, 0xb7, 0x1f, 0x3f, 0x7c, 0xfd, 0xe4, 0xf5, 0x0c, 0xbe, 0x92, 0xcb, 0xb6, 0x72, 0xa0, 0x8a, 0x9f, 0x3b, 0xfd, 0x76, 0x5d, 0xb2, 0xdf, 0xee, 0x21, 0x19, 0xd4, 0x5a, 0x05, 0x6a, 0xb9, 0x9f, 0xdb, 0x9c, 0xe1, 0xc0, 0xd4, 0x14, 0xb4, 0x5e, 0x4d, 0x2e, 0x3d, 0xca, 0x73, 0xc6, 0x01, 0xd6, 0x73, 0x01, 0x24, 0xef, 0x2b, 0x6c, 0xfc, 0xa0, 0xea, 0xb4, 0x54, 0x57, 0x70, 0xfb, 0x31, 0x0d, 0xc9, 0xcb, 0xef, 0x49, 0x64, 0x2e, 0x9b, 0xea, 0x6d, 0x68, 0x09, 0x5c, 0x86, 0xb8, 0xc5, 0x03, 0xd5, 0x34, 0x62, 0x9f, 0xf7, 0x38, 0x0d, 0x2b, 0x9f, 0x54, 0x90, 0x14, 0x48, 0xd9, 0xaf, 0xa7, 0x9e, 0x20, 0x4e, 0x4a, 0x68, 0x60, 0x95, 0x7b, 0x53, 0x96, 0x9e, 0x05, 0x70, 0x7c, 0xbc, 0xe8, 0x95, 0xfd, 0xa7, 0x16, 0x1e, 0x98, 0x5d, 0x45, 0xda, 0x3b, 0x93, 0x21, 0xc3, 0xc3, 0x22, 0xe6, 0x55, 0x99, 0xcb, 0x9a, 0x57, 0xcf, 0x34, 0x5d, 0x52, 0xf8, 0xce, 0x28, 0xe6, 0xcf, 0xac, 0x4e, 0x34, 0x82, 0x81, 0x1f, 0x99, 0x63, 0xcc, 0xcc, 0x07, 0x5d, 0xcc, 0x7e, 0x7b, 0x33, 0x5e, 0xba, 0x7d, 0xc3, 0xa7, 0xc7, 0x4b, 0x23, 0xb4, 0x64, 0x80, 0x6e, 0x5b, 0x79, 0x0d, 0xc0, 0x54, 0x03, 0x96, 0x5d, 0x63, 0xe7, 0x4b, 0xd9, 0x86, 0x65, 0xcf, 0xfb, 0x3e, 0x29, 0xdf, 0x3c, 0xd4, 0xcf, 0xdd, 0x96, 0x4a, 0x27, 0x73, 0x69, 0xd2, 0x40, 0xb6, 0xb7, 0xa5, 0xe0, 0x56, 0x37, 0x1f, 0xc2, 0x95, 0xe2, 0xb8, 0x4d, 0x42, 0x22, 0xc1, 0xbd, 0xd2, 0x57, 0x11, 0x27, 0x49, 0x6a, 0x88, 0x3d, 0x8e, 0x09, 0x87, 0x87, 0xd0, 0xf2, 0xf6, 0x05, 0xac, 0x47, 0xab, 0xf7, 0x5c, 0xa0, 0xa1, 0xb0, 0x0a, 0x74, 0x01, 0xd5, 0xeb, 0x04, 0xa6, 0x53, 0x2e, 0x8f, 0xc3, 0x68, 0xe1, 0x0a, 0x59, 0xcb, 0xee, 0xf3, 0xde, 0x94, 0x35, 0xe8, 0x78, 0x44, 0x73, 0x87, 0x0b, 0xe2, 0x87, 0xa3, 0xd1, 0xa2, 0x87, 0x8d, 0x64, 0x3a, 0x53, 0xd8, 0x09, 0xba, 0xae, 0x04, 0x7e, 0x07, 0xc2, 0x07, 0x98, 0xc0, 0x87, 0x56, 0x12, 0x86, 0x14, 0xdb, 0x4c, 0xc4, 0xed, 0x84, 0xad, 0xca, 0xf3, 0x2e, 0x1a, 0x28, 0x64, 0x76, 0x0c, 0x4c, 0x27, 0x9d, 0xab, 0x12, 0x7d, 0xb3, 0xfa, 0xed, 0x5c, 0xf0, 0x77, 0xdc, 0xf3, 0x45, 0x5d, 0x31, 0x27, 0x5f, 0x4c, 0xe2, 0x96, 0x98, 0x25, 0xab, 0xcd, 0x3d, 0x22, 0x64, 0xc6, 0x00, 0x47, 0xbd, 0xb8, 0xde, 0x65, 0xdb, 0x54, 0xd5, 0xc6, 0x62, 0x1b, 0x45, 0x6b, 0xd8, 0x9d, 0x00, 0xb7, 0xe3, 0xfc, 0x84, 0x03, 0xf0, 0x6c, 0xf8, 0x23, 0x14, 0xf6, 0x92, 0x73, 0xc6, 0x42, 0xcc, 0x67, 0xd3, 0x3e, 0xaa, 0xc4, 0x3d, 0x81, 0x13, 0xfb, 0x13, 0x22, 0xd3, 0x9b, 0xc8, 0xf5, 0x0b, 0x78, 0x47, 0x9b, 0x83, 0xb5, 0xd7, 0x98, 0xe9, 0x3f, 0x7c, 0x8f, 0x42, 0xa3, 0xef, 0x1f, 0x94, 0x99, 0x75, 0x21, 0x95, 0xd1, 0xcf, 0x74, 0xfd, 0x5f, 0x80, 0xec, 0x40, 0x22, 0x28, 0x92, 0x9e, 0x65, 0x73, 0x8b, 0xc5, 0x30, 0xe5, 0xb0, 0xb6, 0xf2, 0x03, 0x24, 0x00, 0x2e, 0x6a, 0xa3, 0x74, 0x62, 0xad, 0xbe, 0x11, 0x80, 0x61, 0xcf, 0x23, 0x3f, 0xd8, 0x0a, 0xf0, 0x2d, 0x4a, 0x58, 0x49, 0xf4, 0x63, 0xf3, 0x05, 0x9b, 0x78, 0xc7, 0xf7, 0xb7, 0x31, 0x02, 0x16, 0x63, 0x87, 0x08, 0x3b, 0x7b, 0x7b, 0xd1, 0xb1, 0xb8, 0x99, 0x39, 0xfe, 0x71, 0x49, 0xac, 0xb7, 0x79, 0x84, 0x47, 0x15, 0x74, 0x5e, 0x29, 0x01, 0xb7, 0x93, 0x9a, 0x87, 0xbd, 0x1a, 0x59, 0xff, 0xec, 0xe5, 0xb8, 0xb9, 0x30, 0x8c, 0x29, 0xd6, 0x0d, 0x32, 0x22, 0x28, 0xd4, 0x4d, 0x25, 0x06, 0x9f, 0x6a, 0xf7, 0x92, 0x16, 0x4b, 0xb6, 0x17, 0xbc, 0xa7, 0xca, 0x17, 0xa6, 0x76, 0x48, 0x46, 0x51, 0xd9, 0xed, 0xc1, 0x69, 0x60, 0xf4, 0x00, 0x64, 0x17, 0x5c, 0x76, 0x18, 0xc4, 0xd1, 0x74, 0x06, 0x67, 0x34, 0xa5, 0xd4, 0x77, 0x1c, 0x62, 0x6d, 0xbb, 0x76, 0x5d, 0x49, 0x5b, 0x08, 0x60, 0x5a, 0x29, 0x4c, 0xec, 0x92, 0x99, 0x55, 0xc0, 0xcc, 0x64, 0xdc, 0x4c, 0x22, 0x37, 0x3d, 0xdb, 0x3b, 0xb0, 0x3f, 0x19, 0x95, 0x6a, 0x04, 0x47, 0x09, 0xf4, 0xd7, 0xe4, 0xf7, 0x28, 0x4f, 0xef, 0xf7, 0x30, 0x37, 0x28, 0xa6, 0xdc, 0x82, 0xfe, 0x2c, 0x7c, 0x67, 0xf8, 0x73, 0x0a, 0x0d, 0x5c, 0xaa, 0x4e, 0x09, 0x0b, 0x47, 0x45, 0x07, 0x44, 0x49, 0x21, 0xe8, 0x12, 0xd1, 0x3e, 0x29, 0x6d, 0xe5, 0x2f, 0xe6, 0x52, 0xd6, 0xa2, 0x76, 0x0f, 0x8c, 0xbb, 0x87, 0xd4, 0x72, 0x49, 0xba, 0xa4, 0x1b, 0x9b, 0x52, 0xe2, 0xa0, 0x82, 0x72, 0x8d, 0x4a, 0x25, 0xf2, 0xe5, 0xb7, 0x59, 0xff, 0x47, 0x69, 0xb5, 0x26, 0x8b, 0x35, 0x76, 0xd7, 0xd3, 0xf4, 0xab, 0x8d, 0x4b, 0x5b, 0x3d, 0xda, 0xec, 0xb6, 0xb8, 0x9c, 0x4a, 0xd1, 0x2d, 0x9d, 0x0c, 0x39, 0x89, 0x58, 0xa6, 0x37, 0x96, 0x2e, 0x7e, 0x21, 0xe4, 0x05, 0xad, 0xdd, 0xf7, 0x5c, 0xf0, 0x7d, 0x79, 0x0a, 0x66, 0x11, 0xcf, 0x46, 0x8a, 0x28, 0xbc, 0x62, 0xbe, 0x4b, 0xf4, 0xb3, 0x4f, 0xba, 0x9c, 0xf7, 0xc2, 0xc4, 0xa0, 0xb3, 0x0e, 0x5c, 0x30, 0x25, 0x3e, 0x94, 0x03, 0x73, 0x81, 0x98, 0xfa, 0x2e, 0xa6, 0xad, 0x6b, 0xf5, 0x6a, 0x08, 0xf9, 0x75, 0xde, 0xb4, 0xdc, 0xf9, 0xad, 0xb2, 0x31, 0xe5, 0x9f, 0xba, 0x86, 0xb6, 0x59, 0x4e, 0xae, 0xcf, 0xf9, 0xef, 0xf9, 0x16, 0xc3, 0x5f, 0xce, 0x90, 0xbe, 0xce, 0xd0, 0xf3, 0x49, 0x1f, 0x44, 0xae, 0xce, 0x5d, 0x8e, 0xcd, 0x12, 0x07, 0x19, 0xf9, 0x0a, 0x3e, 0x29, 0xbb, 0x97, 0x8d, 0x56, 0x48, 0x69, 0x62, 0xf7, 0x68, 0xe8, 0xbc, 0x41, 0x90, 0xd6, 0x26, 0x26, 0xa5, 0x0d, 0xd9, 0x4c, 0x52, 0x0c, 0x4f, 0x20, 0xc7, 0x6e, 0x62, 0xfd, 0x91, 0xc2, 0x57, 0xef, 0x8e, 0x43, 0xc1, 0x48, 0x82, 0x73, 0x16, 0xed, 0x1e, 0x10, 0x66, 0x49, 0xda, 0xaf, 0x83, 0xc1, 0x48, 0xb4, 0x41, 0xd5, 0xa5, 0x9e, 0xa1, 0x44, 0x41, 0x75, 0x5c, 0x50, 0xd0, 0x7a, 0x5a, 0x0d, 0xd2, 0x32, 0xe8, 0x0c, 0x88, 0x4c, 0xb8, 0x72, 0x07, 0xbf, 0xe2, 0x85, 0xef, 0xb4, 0x20, 0xb5, 0x24, 0x00, 0x9d, 0x23, 0xca, 0x6e, 0x53, 0xf8, 0x62, 0xe4, 0x21, 0xbe, 0x79, 0x21, 0x8e, 0x5d, 0xde, 0x91, 0x0b, 0x8a, 0xcd, 0x0c, 0x89, 0xa0, 0x5b, 0xd5, 0xbe, 0x91, 0xdb, 0xa1, 0x71, 0x79, 0xfb, 0xbf, 0xc8, 0x22, 0x19, 0x7e, 0x66, 0x13, 0x9c, 0x94, 0xf2, 0xbc, 0xc1, 0x1a, 0x8a, 0xf6, 0xc2, 0x62, 0xcd, 0x11, 0xda, 0xc0, 0xa5, 0x34, 0x6c, 0x0c, 0x24, 0x60, 0xda, 0x5c, 0x71, 0x0d, 0x77, 0xbc, 0x0e, 0x59, 0xb7, 0xea, 0xa7, 0x81, 0x32, 0x27, 0xf8, 0x9c, 0xdf, 0x75, 0x41, 0x59, 0xdf, 0xb2, 0x56, 0x13, 0x93, 0x22, 0x2c, 0x30, 0x27, 0xc6, 0xa3, 0x29, 0x34, 0x17, 0xf1, 0xe3, 0xc1, 0xa0, 0x38, 0x53, 0x0c, 0xe5, 0x2e, 0xaf, 0x4e, 0x8f, 0xca, 0x9b, 0x9c, 0xe1, 0xc6, 0x6f, 0x9e, 0x8c, 0x91, 0xa2, 0xc9, 0x39, 0xa9, 0x20, 0xd3, 0x61, 0x4e, 0x7c, 0x33, 0xc8, 0x6f, 0x13, 0xbd, 0x74, 0xdd, 0xcd, 0xca, 0xa7, 0x0b, 0x00, 0x74, 0xa2, 0xbe, 0x55, 0x6e, 0xe8, 0x72, 0x57, 0x9c, 0x30, 0x19, 0xe0, 0x4a, 0xb2, 0xa3, 0xdd, 0xb9, 0xb9, 0x6a, 0x30, 0xea, 0xc3, 0xd4, 0xb8, 0x8b, 0x32, 0xdf, 0x5c, 0x04, 0x8c, 0x82, 0x0a, 0x19, 0x9a, 0x78, 0xa9, 0xd2, 0xc2, 0x3c, 0xaf, 0xcd, 0x5d, 0xc7, 0x9a, 0x9f, 0x51, 0x8b, 0x72, 0xee, 0x26, 0xe7, 0xba, 0x24, 0xfb, 0xef, 0xf2, 0x9f, 0x73, 0x51, 0xb3, 0x6a, 0xe6, 0x1f, 0x26, 0xa6, 0x93, 0xde, 0xe3, 0xaf, 0x06, 0x96, 0x25, 0x61, 0x98, 0x9d, 0xc8, 0x0e, 0x5b, 0xb3, 0x3f, 0x60, 0xb3, 0xdf, 0xe2, 0xfb, 0xd7, 0x11, 0x52, 0x40, 0xdd, 0x90, 0x93, 0xbd, 0xbf, 0xd5, 0x76, 0x40, 0x27, 0xb2, 0xe7, 0xe8, 0x16, 0xfa, 0x89, 0xca, 0xdf, 0xfa, 0xbd, 0x5a, 0x38, 0xba, 0x58, 0x5a, 0xd8, 0xc4, 0xd5, 0x53, 0x2c, 0x5a, 0x2d, 0x65, 0xe7, 0xce, 0x8d, 0xe1, 0x9b, 0x29, 0x2f, 0xa4, 0x70, 0xa2, 0x3c, 0xa3, 0x69, 0x89, 0x11, 0x01, 0x90, 0x6f, 0xa2, 0x3d, 0x0e, 0xac, 0xeb, 0x6e, 0x2a, 0x5e, 0x19, 0x28, 0x21, 0x95, 0xa1, 0xf1, 0x63, 0x16, 0x68, 0x5a, 0x2f, 0xf0, 0xc4, 0xe2, 0xca, 0xc8, 0xe3, 0xee, 0xcd, 0x23, 0x19, 0xf9, 0x38, 0x90, 0x6f, 0x8c, 0x23, 0x8f, 0x71, 0x8b, 0x3e, 0xa9, 0xee, 0x0e, 0x37, 0xca, 0xbb, 0x44, 0x06, 0xbe, 0x07, 0x81, 0xd0, 0x22, 0x1f, 0x3c, 0x20, 0x02, 0x34, 0x16, 0xd8, 0x28, 0x99, 0x46, 0x3f, 0x0a, 0xbe, 0x24, 0x30, 0xb3, 0xba, 0x8b, 0xfa, 0x11, 0xed, 0x47, 0xe2, 0xf5, 0x36, 0x27, 0x7d, 0x9b, 0x36, 0xb3, 0x33, 0x62, 0x1c, 0x4d, 0xd4, 0x38, 0x30, 0x0b, 0xb4, 0x92, 0xe4, 0x1e, 0xf4, 0xd2, 0x17, 0x3d, 0x36, 0xba, 0x28, 0x39, 0x0b, 0x77, 0x93, 0xb8, 0x91, 0x4f, 0x44, 0xb3, 0x3d, 0xef, 0x72, 0xdc, 0x39, 0xd3, 0x90, 0x9a, 0x27, 0xcd, 0xdb, 0x47, 0xde, 0xe0, 0x5e, 0x14, 0x76, 0x81, 0x09, 0xd6, 0x00, 0x37, 0xb8, 0x97, 0x1b, 0xc1, 0x0f, 0xbe, 0x0d, 0xcd, 0xe6, 0x33, 0x3a, 0x52, 0xe9, 0x40, 0x8e, 0x18, 0xfa, 0xbe, 0xd6, 0xd7, 0x6a, 0xa9, 0x49, 0xbd, 0x49, 0xe9, 0x0d, 0x57, 0xee, 0xb0, 0x31, 0xa1, 0x18, 0xbb, 0xb8, 0x4f, 0x31, 0xc5, 0x63, 0xa5, 0x74, 0xb4, 0x26, 0x67, 0x67, 0x70, 0x66, 0x39, 0x2b, 0x96, 0xde, 0x26 }; +constexpr AccessUnit AC3_SINGLE_PACK_EXPECTED_AU_1 = { 0x15f90, 0x159b2, false, 0, {}, { 0xe4, 0x34, 0x28, 0xe9, 0x7e, 0x1b, 0xa0, 0xea, 0x42, 0x2c, 0xd7, 0x21, 0x26, 0x44, 0x70, 0x9f, 0x0e, 0x3d, 0x4f, 0x23 } }; +constexpr AccessUnit AC3_SINGLE_PACK_EXPECTED_AU_2 = { std::numeric_limits::max(), std::numeric_limits::max(), false, 0, {}, { 0xf9, 0x27, 0xd1, 0x79, 0x4b, 0x94, 0xd7, 0x63, 0x4c, 0x57, 0x74, 0x46, 0xa3, 0xc2, 0x9d, 0xf0, 0x99, 0x18, 0x78, 0x3c } }; + +constexpr std::array LPCM_SINGLE_PACK_STREAM = { 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xbd, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x40, 0xb1, 0x40, 0x00, 0xda, 0x2c, 0xae, 0xd8, 0xf8, 0x31, 0x4d, 0x58, 0x96, 0x3f, 0x03, 0x7e, 0x2e, 0x5d, 0xb9, 0x16, 0xf9, 0x14, 0x26, 0x07, 0x3f, 0x85, 0xc1, 0x78, 0xcb, 0xf1, 0x73, 0xc1, 0xd6, 0xc2, 0x80, 0x8d, 0xaf, 0xa9, 0x76, 0xb1, 0xb2, 0x83, 0xcf, 0xce, 0x89, 0x25, 0xe4, 0x78, 0xe7, 0x06, 0x10, 0x18, 0xdd, 0x52, 0xf6, 0x17, 0x36, 0xe0, 0xba, 0x91, 0xc5, 0x0b, 0x07, 0xca, 0x35, 0x6b, 0xe0, 0x1c, 0xbf, 0xdf, 0x36, 0xfb, 0xca, 0x06, 0x73, 0x67, 0x8d, 0xcf, 0xb0, 0xf8, 0x8d, 0x34, 0xef, 0x73, 0x07, 0x1b, 0x74, 0x31, 0x13, 0xf4, 0x5a, 0x45, 0x77, 0xf9, 0xc2, 0x7e, 0x0c, 0x9b, 0xb1, 0x3a, 0xf9, 0x48, 0xbb, 0x8e, 0xda, 0xc6, 0x9f, 0x68, 0xfd, 0x4a, 0x39, 0xcd, 0x81, 0xa1, 0x4e, 0xcc, 0x6e, 0x2a, 0x49, 0x32, 0xc4, 0xb2, 0xee, 0xb9, 0xcd, 0x5d, 0x92, 0x07, 0x53, 0x9e, 0xca, 0x7f, 0xfc, 0x6c, 0xe0, 0xa5, 0xc8, 0xed, 0xba, 0x5d, 0x35, 0xc9, 0x4d, 0x1a, 0x86, 0x1b, 0xaf, 0xfc, 0x44, 0xb4, 0xec, 0xf8, 0xeb, 0xdc, 0x22, 0x08, 0x5f, 0x29, 0x85, 0x81, 0xdb, 0xe9, 0x8f, 0x4e, 0xf2, 0xb9, 0xd9, 0x09, 0x58, 0x11, 0xd4, 0xfa, 0x2a, 0x01, 0x5d, 0xf1, 0x07, 0x6f, 0xe8, 0x75, 0x66, 0x39, 0xac, 0x1b, 0x28, 0x57, 0x6b, 0xd3, 0xd4, 0x06, 0xee, 0xd0, 0x86, 0xde, 0xc4, 0x88, 0x99, 0x62, 0x52, 0x37, 0xd9, 0xed, 0x44, 0x3d, 0xc7, 0xa4, 0x2c, 0x2f, 0x96, 0xed, 0xfd, 0xba, 0xd8, 0xd1, 0x72, 0xf6, 0xbb, 0xf3, 0x5f, 0x3b, 0x3e, 0xc3, 0x2c, 0x23, 0xca, 0xb2, 0x72, 0x69, 0xb7, 0x14, 0xcc, 0x81, 0x1a, 0x24, 0x9b, 0x95, 0xd4, 0xc7, 0x97, 0x9f, 0xd3, 0x5b, 0x22, 0xa6, 0x57, 0x63, 0xec, 0x27, 0x20, 0xc4, 0x76, 0x6e, 0xd9, 0xf0, 0x56, 0xaa, 0x0d, 0x54, 0xb7, 0x49, 0x39, 0xf2, 0x19, 0x7d, 0x56, 0xa2, 0x70, 0x7e, 0xce, 0x89, 0x46, 0x08, 0xb2, 0x7f, 0xba, 0x73, 0x9a, 0x2d, 0x11, 0xdd, 0x74, 0x90, 0x70, 0x36, 0xd6, 0x97, 0x62, 0xf0, 0xf7, 0x39, 0x99, 0xf6, 0x50, 0xb2, 0xd4, 0xff, 0x42, 0x8e, 0xbe, 0xf1, 0x57, 0x0e, 0xc8, 0x29, 0x6f, 0x16, 0xa7, 0x86, 0xdb, 0xd9, 0x81, 0x43, 0x9b, 0x95, 0x24, 0xbd, 0x9a, 0x0c, 0x54, 0x2e, 0x71, 0x72, 0x42, 0xe6, 0x25, 0x41, 0xa9, 0x6e, 0x1c, 0x2e, 0x74, 0xb1, 0xe0, 0x4e, 0x66, 0xc3, 0xda, 0xb6, 0x16, 0xb2, 0x84, 0xc5, 0x1f, 0x1f, 0x65, 0xf2, 0xc8, 0x3d, 0x9c, 0xb4, 0x28, 0xed, 0xd3, 0xe2, 0xa2, 0xf8, 0x24, 0xd8, 0x84, 0x16, 0x9f, 0x72, 0x57, 0xa0, 0xfd, 0x28, 0x81, 0x97, 0xb3, 0x7b, 0x5d, 0x29, 0x37, 0xa3, 0x81, 0x2a, 0x5f, 0x45, 0x6b, 0xd3, 0xbd, 0x13, 0x78, 0x4a, 0x63, 0x9f, 0x7a, 0x34, 0x3c, 0xf4, 0x45, 0x7f, 0x51, 0xe9, 0x58, 0xdc, 0xcb, 0x39, 0x38, 0x87, 0xab, 0xb4, 0x0d, 0xaf, 0x4d, 0x63, 0x4b, 0x0f, 0x2e, 0xac, 0xc6, 0xd6, 0x04, 0x1b, 0x3a, 0xda, 0x9d, 0x3b, 0x20, 0x90, 0x3b, 0x19, 0x4f, 0x6e, 0x82, 0x93, 0x85, 0x53, 0x18, 0xf7, 0xa6, 0x1a, 0x2f, 0x98, 0xc8, 0x1f, 0xe3, 0x59, 0x5b, 0x43, 0x76, 0xc4, 0xd4, 0x37, 0xef, 0x0e, 0xce, 0xa3, 0x35, 0xc9, 0x4d, 0x43, 0x13, 0x24, 0xe3, 0x6c, 0x5a, 0xc8, 0x8d, 0xb2, 0x68, 0x5d, 0xc0, 0xd2, 0xd0, 0x06, 0x1d, 0x77, 0x80, 0x65, 0xcd, 0x0a, 0xc0, 0x93, 0xb1, 0x8c, 0xf8, 0x1b, 0xf6, 0x8c, 0x59, 0xf5, 0x99, 0x7f, 0xec, 0x34, 0x0e, 0x16, 0x4e, 0x6a, 0x0c, 0x86, 0xba, 0x1b, 0xd8, 0x53, 0x66, 0x1e, 0xdc, 0x66, 0x8d, 0x91, 0x1b, 0x2b, 0xb4, 0xdd, 0xe2, 0x54, 0x1e, 0xea, 0xc2, 0x5b, 0x6b, 0x56, 0x96, 0x8c, 0xfb, 0xf8, 0x21, 0x22, 0x8f, 0x1e, 0xbb, 0xd7, 0xe7, 0x7b, 0xd7, 0xbf, 0x0c, 0xbb, 0x9e, 0xe2, 0x6c, 0x31, 0x3a, 0xaa, 0xcd, 0xd3, 0xfb, 0xcb, 0x6e, 0xc6, 0x82, 0x7f, 0x01, 0xda, 0x0e, 0x0b, 0xc8, 0x21, 0xc4, 0x6c, 0x2b, 0xe3, 0x88, 0xcd, 0x0c, 0xb3, 0x3d, 0x89, 0xf6, 0xd9, 0x75, 0x16, 0xf8, 0x0e, 0x6d, 0xee, 0x5a, 0xd6, 0xaf, 0xe1, 0x63, 0xe0, 0x77, 0x55, 0x78, 0x39, 0xf9, 0xc4, 0xa2, 0xa7, 0x96, 0x34, 0x17, 0xe0, 0x4f, 0x79, 0xcc, 0x0c, 0x3f, 0x67, 0x31, 0x55, 0xc9, 0xe0, 0x3b, 0x2c, 0x45, 0xaf, 0xbb, 0xbc, 0x73, 0x7c, 0x13, 0xe6, 0x0a, 0x5b, 0x87, 0xd5, 0x91, 0x35, 0xbc, 0x63, 0xd2, 0x31, 0x41, 0x4f, 0x17, 0xb2, 0xf3, 0x44, 0x33, 0xbf, 0x41, 0x7f, 0x49, 0x2f, 0xab, 0x38, 0xd4, 0x9e, 0xf8, 0x9d, 0xb7, 0xe4, 0x97, 0x0f, 0x0e, 0xec, 0xa3, 0xe8, 0xda, 0x9a, 0x4f, 0x23, 0xab, 0x2f, 0xa8, 0x0f, 0x7e, 0x17, 0xed, 0x56, 0xc8, 0x69, 0x5b, 0xe6, 0xc1, 0xbd, 0x01, 0x19, 0xe5, 0xc3, 0xa6, 0x96, 0x91, 0x84, 0x36, 0x9e, 0xb1, 0x25, 0x72, 0xc5, 0x60, 0x3a, 0xcb, 0x77, 0xf9, 0x9b, 0x70, 0x78, 0x6a, 0x67, 0xd4, 0x9e, 0x7b, 0x48, 0x59, 0xa9, 0x6a, 0xed, 0x72, 0x70, 0x22, 0x5a, 0xfe, 0x07, 0x66, 0x1a, 0xb2, 0x3a, 0x7a, 0x1e, 0xcf, 0x3c, 0xc8, 0x94, 0xe0, 0x97, 0xcb, 0xba, 0x4b, 0x1c, 0xb9, 0xab, 0x5f, 0xa5, 0xeb, 0xf7, 0x25, 0x94, 0xce, 0x66, 0x5a, 0xf3, 0xdb, 0xf7, 0x3e, 0xca, 0xb2, 0x64, 0xf2, 0x04, 0xb3, 0xc5, 0x44, 0xf1, 0x6d, 0x2e, 0xfe, 0x16, 0xfa, 0xcc, 0x49, 0x6a, 0x61, 0x6f, 0x27, 0x4f, 0x0b, 0x85, 0x92, 0x17, 0xcc, 0x07, 0xe1, 0x93, 0x9e, 0x5f, 0x34, 0x6f, 0x9d, 0x65, 0xae, 0x03, 0x6a, 0x55, 0xa5, 0x45, 0x9f, 0x41, 0x0f, 0x29, 0xee, 0x87, 0xf5, 0x2d, 0x1e, 0xf3, 0x78, 0xa7, 0x4b, 0xb7, 0x80, 0x62, 0x5f, 0x90, 0x22, 0x80, 0x22, 0x44, 0xaa, 0xb2, 0x41, 0x33, 0xcd, 0x7c, 0xa7, 0x2b, 0x44, 0x5c, 0x3d, 0x54, 0x25, 0xfd, 0x6e, 0x47, 0xcb, 0x81, 0x46, 0x77, 0x8b, 0x75, 0x84, 0xe6, 0x94, 0x58, 0xa3, 0xd9, 0xbe, 0x54, 0x11, 0x25, 0xd7, 0x43, 0x53, 0xba, 0x43, 0x85, 0xfd, 0xec, 0x5b, 0x59, 0xe0, 0x03, 0x0e, 0x57, 0x80, 0x97, 0x7a, 0x0f, 0xf3, 0x17, 0x27, 0x50, 0x88, 0x72, 0x85, 0xb0, 0x14, 0x9d, 0x28, 0xec, 0x09, 0xb1, 0xb4, 0x56, 0x9b, 0x36, 0x4f, 0xa9, 0x8f, 0xb9, 0x66, 0x1f, 0xac, 0xea, 0xc3, 0x9f, 0xfe, 0x5a, 0xb8, 0xe8, 0xde, 0x63, 0xeb, 0x6f, 0xb8, 0x26, 0xdf, 0x42, 0x4b, 0x46, 0x94, 0xe0, 0xdb, 0x61, 0xae, 0x0a, 0x6f, 0xd6, 0xbf, 0xb3, 0x3b, 0x13, 0x82, 0xd6, 0x3e, 0xaf, 0x18, 0x2e, 0x4b, 0x03, 0xca, 0xf9, 0xa8, 0x83, 0x61, 0x2f, 0x04, 0x0b, 0x6e, 0xf0, 0x0e, 0x8c, 0xc2, 0x19, 0x9b, 0x10, 0x78, 0x3b, 0x36, 0xf6, 0x54, 0x12, 0x9b, 0xa1, 0xad, 0xf8, 0x02, 0x3b, 0x7b, 0x51, 0x53, 0x56, 0x8b, 0xc7, 0xeb, 0xaa, 0x5c, 0xfe, 0x38, 0x80, 0x59, 0x6c, 0x37, 0x79, 0x5e, 0x33, 0x77, 0xc7, 0x8b, 0x6b, 0x78, 0x1b, 0x9b, 0xd9, 0x91, 0x2f, 0xfb, 0x9b, 0x42, 0xca, 0x9b, 0xfe, 0xc8, 0x8f, 0x6a, 0xba, 0x47, 0x04, 0x94, 0xfd, 0xa2, 0x1a, 0x07, 0xb3, 0xc2, 0xb8, 0xaf, 0x0d, 0x9f, 0x7e, 0x2a, 0x6b, 0x1e, 0x82, 0x91, 0xe1, 0x17, 0xc0, 0x51, 0xf3, 0xc9, 0x14, 0xef, 0xf4, 0xbe, 0xe3, 0xa8, 0x57, 0xec, 0x2d, 0xb3, 0x1d, 0x26, 0x62, 0xd1, 0xb4, 0xad, 0x89, 0x58, 0x72, 0xc3, 0x87, 0x6a, 0xfb, 0x0f, 0x89, 0xa7, 0x1e, 0x34, 0x89, 0x3a, 0x3b, 0x96, 0x85, 0xa3, 0x91, 0x64, 0xf1, 0x59, 0x66, 0x66, 0x91, 0xa1, 0x76, 0x3a, 0x73, 0xc2, 0x93, 0x43, 0x07, 0xc3, 0xed, 0xb7, 0xf0, 0x9d, 0x6a, 0x48, 0x6c, 0xc8, 0xb4, 0x56, 0x12, 0xa6, 0xc2, 0x52, 0x50, 0x25, 0xf9, 0xd4, 0x1d, 0xfc, 0x4d, 0xbe, 0x0e, 0x48, 0x02, 0x31, 0xa9, 0xea, 0xce, 0xcb, 0x9a, 0xe9, 0x31, 0x9b, 0xd2, 0x8d, 0xdc, 0x37, 0x52, 0x95, 0x85, 0xdb, 0x36, 0x05, 0x1f, 0x1a, 0x6a, 0xbd, 0xc5, 0x73, 0x61, 0xdb, 0x27, 0xbf, 0x2a, 0x13, 0x47, 0x16, 0xde, 0x29, 0xa7, 0xc1, 0x24, 0xe4, 0x85, 0x23, 0x78, 0x13, 0x3a, 0x31, 0xc4, 0x32, 0x37, 0xbc, 0x30, 0x67, 0xd3, 0xdc, 0x47, 0x5c, 0xa6, 0x34, 0x8a, 0xd4, 0xb3, 0x7c, 0x5f, 0x5f, 0xb2, 0x14, 0x53, 0x50, 0xd8, 0xc4, 0x9d, 0xf0, 0xe5, 0x0d, 0x37, 0xa0, 0xd4, 0x43, 0x18, 0x05, 0xbc, 0x91, 0x33, 0x3a, 0x39, 0x06, 0x21, 0x53, 0x35, 0xd5, 0x15, 0xc0, 0x19, 0xac, 0x4d, 0xf0, 0x89, 0x8d, 0x0a, 0x07, 0x44, 0x43, 0xb7, 0xe0, 0x66, 0x1f, 0xc3, 0xcd, 0x30, 0x8b, 0x01, 0xd0, 0x8a, 0xa4, 0x21, 0x06, 0x25, 0xef, 0x3d, 0x19, 0xd0, 0xa3, 0x6c, 0x15, 0x7a, 0x32, 0x12, 0xad, 0xce, 0xfa, 0xba, 0xa2, 0xc9, 0x0d, 0xe0, 0x84, 0x56, 0x7e, 0xc8, 0x6b, 0x59, 0xbe, 0x86, 0xc8, 0xa4, 0xdc, 0x65, 0xac, 0xf1, 0x80, 0x44, 0x5d, 0x6b, 0x3c, 0x13, 0x11, 0x47, 0xf6, 0x16, 0x35, 0x4e, 0xa3, 0xbf, 0xf2, 0x2a, 0x31, 0xee, 0x38, 0x47, 0xf4, 0x78, 0x42, 0x61, 0x6d, 0x4a, 0xab, 0xc0, 0x58, 0x04, 0xb2, 0x96, 0xb6, 0x30, 0xed, 0xec, 0x9a, 0x85, 0x09, 0x21, 0xfc, 0xbe, 0x5c, 0xbd, 0xec, 0xa4, 0x1e, 0xa4, 0x3d, 0xb1, 0x4e, 0xf8, 0x5e, 0xfb, 0x3a, 0x0f, 0xf8, 0xdc, 0x45, 0xda, 0xd3, 0x78, 0x82, 0x4f, 0x99, 0x8a, 0x42, 0x1a, 0xd7, 0x73, 0x55, 0x79, 0x42, 0xb9, 0x05, 0x19, 0xba, 0x57, 0x7f, 0xb1, 0x58, 0xc5, 0x55, 0x61, 0x4c, 0xed, 0x0d, 0x3e, 0x24, 0xf1, 0x04, 0x5e, 0xf3, 0xe7, 0x3e, 0x02, 0x36, 0x38, 0xdc, 0xca, 0x3b, 0x9f, 0xe1, 0x25, 0xf5, 0xa8, 0xc6, 0xc4, 0xdc, 0x39, 0xb0, 0xc0, 0xd8, 0x61, 0x84, 0xcd, 0xcf, 0xbe, 0xb7, 0x07, 0x08, 0x12, 0xef, 0x53, 0x37, 0xd7, 0xf8, 0x3e, 0x41, 0xde, 0x12, 0x1f, 0xe3, 0xa7, 0x90, 0x01, 0xce, 0x91, 0x87, 0x62, 0xdd, 0x7a, 0x9f, 0xde, 0xdf, 0xb0, 0x62, 0x96, 0x66, 0x6e, 0x9c, 0xd4, 0x82, 0x43, 0xa1, 0xa7, 0xde, 0x03, 0x7a, 0x49, 0xc8, 0x8a, 0x72, 0x2d, 0xee, 0x42, 0x7f, 0x6b, 0x1e, 0x81, 0x31, 0xee, 0x61, 0xe5, 0x97, 0x38, 0xe4, 0x6f, 0xf3, 0x42, 0x5e, 0x38, 0xb3, 0x37, 0xe5, 0x53, 0x5c, 0xeb, 0x7d, 0x86, 0xcf, 0xfa, 0xe2, 0x8d, 0xb5, 0x57, 0x44, 0x59, 0x48, 0x30, 0x51, 0xe6, 0x7b, 0x9a, 0xc4, 0x25, 0x61, 0x51, 0x68, 0xf9, 0x42, 0x28, 0x8c, 0x6c, 0xba, 0x70, 0x3d, 0x0d, 0xa2, 0x8d, 0xcd, 0xcf, 0xf2, 0x4b, 0x85, 0xd6, 0xd6, 0x14, 0xe6, 0x1a, 0x9b, 0x18, 0x22, 0x67, 0x22, 0xa5, 0xb8, 0x7c, 0xec, 0x6d, 0x66, 0xf5, 0xa4, 0x29, 0x13, 0x5c, 0x1c, 0x4f, 0xcd, 0x8b, 0xbc, 0x0f, 0x27, 0x75, 0xda, 0xc6, 0x77, 0xd2, 0x5f, 0x37, 0xee, 0x46, 0xd4, 0xb1, 0x18, 0x72, 0xfb, 0xb7, 0x5f, 0x62, 0x08, 0xff, 0x7f, 0x2e, 0x50, 0x36, 0x29, 0x53, 0x0b, 0x62, 0x38, 0xc6, 0x5a, 0x3e, 0xe9, 0xba, 0x36, 0xe2, 0xcb, 0x7d, 0xf4, 0x67, 0xd8, 0x98, 0x88, 0xf6, 0x39, 0xf9, 0x85, 0x64, 0xeb, 0xc4, 0x7f, 0xb6, 0xc9, 0xf8, 0x03, 0x1a, 0xca, 0x0d, 0x35, 0x94, 0xe2, 0xc3, 0xcc, 0xef, 0x5d, 0x5a, 0x83, 0x28, 0x50, 0x8e, 0x88, 0x67, 0x31, 0xd3, 0xa0, 0x5c, 0x69, 0x83, 0x6d, 0x21, 0x0e, 0x2a, 0x67, 0x35, 0x68, 0x9a, 0xb2, 0x41, 0x67, 0x87, 0x8b, 0x1a, 0x84, 0x53, 0x78, 0xa3, 0x26, 0x1b, 0xc3, 0x0f, 0x24, 0x5f, 0x76, 0xbf, 0x0c, 0x50, 0xff, 0x40, 0x38, 0x98, 0x55, 0x6d, 0x24, 0x44, 0x84, 0x05, 0x79, 0x20, 0x36, 0xe0, 0xb8, 0x04, 0xcb, 0x69, 0x63, 0x91, 0x81, 0xb9, 0x07, 0xa9, 0xa6, 0x28, 0x91, 0xf3, 0xe6, 0xf9, 0xa0, 0xbb, 0x77, 0xaa, 0xe1, 0xe9, 0x90, 0xe8, 0x36, 0x60, 0x15, 0x5b, 0xb3, 0x9b, 0x72, 0x7b, 0x1c, 0x17, 0xcb, 0xd5, 0xf0, 0x1b, 0x2f, 0xce, 0x76, 0xf9, 0xae, 0x50, 0x7b, 0x70, 0xc5, 0xe8, 0x3a, 0x08, 0x96, 0x08, 0xa2, 0x9f, 0x22, 0xbb, 0x39, 0x4f, 0x37, 0x3c, 0x72, 0x36, 0x71, 0x1b, 0x4b, 0x09, 0x25, 0x71, 0x6e, 0xcf, 0xc1, 0x09, 0x42, 0x7f, 0x5c, 0xa4, 0xc8, 0xf2, 0x8e, 0xa7, 0x21, 0xc7, 0x89, 0xa7, 0x51, 0xbc, 0xf3, 0x87, 0x3d, 0x57, 0xd0, 0x38, 0x0e, 0xde, 0x3c, 0x28, 0x02, 0x1b, 0x75, 0x5c, 0x01, 0x90, 0xa2, 0xd7, 0x5a, 0x39, 0x0a, 0xe6, 0x01, 0x16, 0x80, 0xad, 0x98, 0x21, 0x82, 0xf4, 0x31, 0xca, 0x50, 0x76, 0x98, 0xd1, 0xd7, 0x62, 0xd2, 0xfb, 0xf4, 0x94, 0x61, 0x34, 0x30, 0x5b, 0x90, 0xe0, 0x98, 0x66, 0xf3, 0xba, 0x10, 0xa4, 0x3f, 0x30, 0x06, 0x0e, 0xcc, 0x2b, 0x61, 0xa3, 0xaa, 0x3b, 0xef, 0x8a, 0x26, 0x59, 0xdf, 0x6b, 0xd2, 0xc5, 0x8e, 0x8d }; +constexpr AccessUnit LPCM_SINGLE_PACK_EXPECTED_AU_1 = { 0x15f90, 0x159b2, false, 3, { 0xb1, 0x40, 0x00, 0xda, 0x2c, 0xae, 0xd8, 0xf8, 0x31, 0x4d, 0x58, 0x96, 0x3f, 0x03, 0x7e, 0x2e }, { 0xec, 0x7a, 0x1d, 0x5c, 0xa0, 0xca, 0x0e, 0xdc, 0x52, 0x1a, 0x9c, 0xc1, 0x52, 0xdc, 0xcd, 0xa6, 0x9e, 0x28, 0x97, 0xde } }; +constexpr AccessUnit LPCM_SINGLE_PACK_EXPECTED_AU_2 = { std::numeric_limits::max(), std::numeric_limits::max(), false, 3, { 0xb1, 0x40, 0x00, 0xda, 0x2c, 0xae, 0xd8, 0xf8, 0x31, 0x4d, 0x58, 0x96, 0x3f, 0x03, 0x7e, 0x2e }, { 0x09, 0xa0, 0xb5, 0x46, 0xd8, 0x95, 0xf7, 0x34, 0x86, 0xc9, 0x2c, 0x8f, 0xe0, 0xb6, 0x69, 0x72, 0x75, 0x0b, 0xa9, 0x59 } }; + +constexpr std::array USER_DATA_SINGLE_PACK_STREAM = { 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xbd, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x20, 0xb1, 0x00, 0x00, 0x04, 0x29, 0xae, 0xd8, 0xf8, 0x31, 0x4d, 0x58, 0x96, 0x3f, 0x03, 0x7e, 0x2e, 0x5d, 0xb9, 0x16, 0xf9, 0x14, 0x26, 0x07, 0x3f, 0x85, 0xc1, 0x78, 0xcb, 0xf1, 0x73, 0xc1, 0xd6, 0xc2, 0x80, 0x8d, 0xaf, 0xa9, 0x76, 0xb1, 0xb2, 0x83, 0xcf, 0xce, 0x89, 0x25, 0xe4, 0x78, 0xe7, 0x06, 0x10, 0x18, 0xdd, 0x52, 0xf6, 0x17, 0x36, 0xe0, 0xba, 0x91, 0xc5, 0x0b, 0x07, 0xca, 0x35, 0x6b, 0xe0, 0x1c, 0xbf, 0xdf, 0x36, 0xfb, 0xca, 0x06, 0x73, 0x67, 0x8d, 0xcf, 0xb0, 0xf8, 0x8d, 0x34, 0xef, 0x73, 0x07, 0x1b, 0x74, 0x31, 0x13, 0xf4, 0x5a, 0x45, 0x77, 0xf9, 0xc2, 0x7e, 0x0c, 0x9b, 0xb1, 0x3a, 0xf9, 0x48, 0xbb, 0x8e, 0xda, 0xc6, 0x9f, 0x68, 0xfd, 0x4a, 0x39, 0xcd, 0x81, 0xa1, 0x4e, 0xcc, 0x6e, 0x2a, 0x49, 0x32, 0xc4, 0xb2, 0xee, 0xb9, 0xcd, 0x5d, 0x92, 0x07, 0x53, 0x9e, 0xca, 0x7f, 0xfc, 0x6c, 0xe0, 0xa5, 0xc8, 0xed, 0xba, 0x5d, 0x35, 0xc9, 0x4d, 0x1a, 0x86, 0x1b, 0xaf, 0xfc, 0x44, 0xb4, 0xec, 0xf8, 0xeb, 0xdc, 0x22, 0x08, 0x5f, 0x29, 0x85, 0x81, 0xdb, 0xe9, 0x8f, 0x4e, 0xf2, 0xb9, 0xd9, 0x09, 0x58, 0x11, 0xd4, 0xfa, 0x2a, 0x01, 0x5d, 0xf1, 0x07, 0x6f, 0xe8, 0x75, 0x66, 0x39, 0xac, 0x1b, 0x28, 0x57, 0x6b, 0xd3, 0xd4, 0x06, 0xee, 0xd0, 0x86, 0xde, 0xc4, 0x88, 0x99, 0x62, 0x52, 0x37, 0xd9, 0xed, 0x44, 0x3d, 0xc7, 0xa4, 0x2c, 0x2f, 0x96, 0xed, 0xfd, 0xba, 0xd8, 0xd1, 0x72, 0xf6, 0xbb, 0xf3, 0x5f, 0x3b, 0x3e, 0xc3, 0x2c, 0x23, 0xca, 0xb2, 0x72, 0x69, 0xb7, 0x14, 0xcc, 0x81, 0x1a, 0x24, 0x9b, 0x95, 0xd4, 0xc7, 0x97, 0x9f, 0xd3, 0x5b, 0x22, 0xa6, 0x57, 0x63, 0xec, 0x27, 0x20, 0xc4, 0x76, 0x6e, 0xd9, 0xf0, 0x56, 0xaa, 0x0d, 0x54, 0xb7, 0x49, 0x39, 0xf2, 0x19, 0x7d, 0x56, 0xa2, 0x70, 0x7e, 0xce, 0x89, 0x46, 0x08, 0xb2, 0x7f, 0xba, 0x73, 0x9a, 0x2d, 0x11, 0xdd, 0x74, 0x90, 0x70, 0x36, 0xd6, 0x97, 0x62, 0xf0, 0xf7, 0x39, 0x99, 0xf6, 0x50, 0xb2, 0xd4, 0xff, 0x42, 0x8e, 0xbe, 0xf1, 0x57, 0x0e, 0xc8, 0x29, 0x6f, 0x16, 0xa7, 0x86, 0xdb, 0xd9, 0x81, 0x43, 0x9b, 0x95, 0x24, 0xbd, 0x9a, 0x0c, 0x54, 0x2e, 0x71, 0x72, 0x42, 0xe6, 0x25, 0x41, 0xa9, 0x6e, 0x1c, 0x2e, 0x74, 0xb1, 0xe0, 0x4e, 0x66, 0xc3, 0xda, 0xb6, 0x16, 0xb2, 0x84, 0xc5, 0x1f, 0x1f, 0x65, 0xf2, 0xc8, 0x3d, 0x9c, 0xb4, 0x28, 0xed, 0xd3, 0xe2, 0xa2, 0xf8, 0x24, 0xd8, 0x84, 0x16, 0x9f, 0x72, 0x57, 0xa0, 0xfd, 0x28, 0x81, 0x97, 0xb3, 0x7b, 0x5d, 0x29, 0x37, 0xa3, 0x81, 0x2a, 0x5f, 0x45, 0x6b, 0xd3, 0xbd, 0x13, 0x78, 0x4a, 0x63, 0x9f, 0x7a, 0x34, 0x3c, 0xf4, 0x45, 0x7f, 0x51, 0xe9, 0x58, 0xdc, 0xcb, 0x39, 0x38, 0x87, 0xab, 0xb4, 0x0d, 0xaf, 0x4d, 0x63, 0x4b, 0x0f, 0x2e, 0xac, 0xc6, 0xd6, 0x04, 0x1b, 0x3a, 0xda, 0x9d, 0x3b, 0x20, 0x90, 0x3b, 0x19, 0x4f, 0x6e, 0x82, 0x93, 0x85, 0x53, 0x18, 0xf7, 0xa6, 0x1a, 0x2f, 0x98, 0xc8, 0x1f, 0xe3, 0x59, 0x5b, 0x43, 0x76, 0xc4, 0xd4, 0x37, 0xef, 0x0e, 0xce, 0xa3, 0x35, 0xc9, 0x4d, 0x43, 0x13, 0x24, 0xe3, 0x6c, 0x5a, 0xc8, 0x8d, 0xb2, 0x68, 0x5d, 0xc0, 0xd2, 0xd0, 0x06, 0x1d, 0x77, 0x80, 0x65, 0xcd, 0x0a, 0xc0, 0x93, 0xb1, 0x8c, 0xf8, 0x1b, 0xf6, 0x8c, 0x59, 0xf5, 0x99, 0x7f, 0xec, 0x34, 0x0e, 0x16, 0x4e, 0x6a, 0x0c, 0x86, 0xba, 0x1b, 0xd8, 0x53, 0x66, 0x1e, 0xdc, 0x66, 0x8d, 0x91, 0x1b, 0x2b, 0xb4, 0xdd, 0xe2, 0x54, 0x1e, 0xea, 0xc2, 0x5b, 0x6b, 0x56, 0x96, 0x8c, 0xfb, 0xf8, 0x21, 0x22, 0x8f, 0x1e, 0xbb, 0xd7, 0xe7, 0x7b, 0xd7, 0xbf, 0x0c, 0xbb, 0x9e, 0xe2, 0x6c, 0x31, 0x3a, 0xaa, 0xcd, 0xd3, 0xfb, 0xcb, 0x6e, 0xc6, 0x82, 0x7f, 0x01, 0xda, 0x0e, 0x0b, 0xc8, 0x21, 0xc4, 0x6c, 0x2b, 0xe3, 0x88, 0xcd, 0x0c, 0xb3, 0x3d, 0x89, 0xf6, 0xd9, 0x75, 0x16, 0xf8, 0x0e, 0x6d, 0xee, 0x5a, 0xd6, 0xaf, 0xe1, 0x63, 0xe0, 0x77, 0x55, 0x78, 0x39, 0xf9, 0xc4, 0xa2, 0xa7, 0x96, 0x34, 0x17, 0xe0, 0x4f, 0x79, 0xcc, 0x0c, 0x3f, 0x67, 0x31, 0x55, 0xc9, 0xe0, 0x3b, 0x2c, 0x45, 0xaf, 0xbb, 0xbc, 0x73, 0x7c, 0x13, 0xe6, 0x0a, 0x5b, 0x87, 0xd5, 0x91, 0x35, 0xbc, 0x63, 0xd2, 0x31, 0x41, 0x4f, 0x17, 0xb2, 0xf3, 0x44, 0x33, 0xbf, 0x41, 0x7f, 0x49, 0x2f, 0xab, 0x38, 0xd4, 0x9e, 0xf8, 0x9d, 0xb7, 0xe4, 0x97, 0x0f, 0x0e, 0xec, 0xa3, 0xe8, 0xda, 0x9a, 0x4f, 0x23, 0xab, 0x2f, 0xa8, 0x0f, 0x7e, 0x17, 0xed, 0x56, 0xc8, 0x69, 0x5b, 0xe6, 0xc1, 0xbd, 0x01, 0x19, 0xe5, 0xc3, 0xa6, 0x96, 0x91, 0x84, 0x36, 0x9e, 0xb1, 0x25, 0x72, 0xc5, 0x60, 0x3a, 0xcb, 0x77, 0xf9, 0x9b, 0x70, 0x78, 0x6a, 0x67, 0xd4, 0x9e, 0x7b, 0x48, 0x59, 0xa9, 0x6a, 0xed, 0x72, 0x70, 0x22, 0x5a, 0xfe, 0x07, 0x66, 0x1a, 0xb2, 0x3a, 0x7a, 0x1e, 0xcf, 0x3c, 0xc8, 0x94, 0xe0, 0x97, 0xcb, 0xba, 0x4b, 0x1c, 0xb9, 0xab, 0x5f, 0xa5, 0xeb, 0xf7, 0x25, 0x94, 0xce, 0x66, 0x5a, 0xf3, 0xdb, 0xf7, 0x3e, 0xca, 0xb2, 0x64, 0xf2, 0x04, 0xb3, 0xc5, 0x44, 0xf1, 0x6d, 0x2e, 0xfe, 0x16, 0xfa, 0xcc, 0x49, 0x6a, 0x61, 0x6f, 0x27, 0x4f, 0x0b, 0x85, 0x92, 0x17, 0xcc, 0x07, 0xe1, 0x93, 0x9e, 0x5f, 0x34, 0x6f, 0x9d, 0x65, 0xae, 0x03, 0x6a, 0x55, 0xa5, 0x45, 0x9f, 0x41, 0x0f, 0x29, 0xee, 0x87, 0xf5, 0x2d, 0x1e, 0xf3, 0x78, 0xa7, 0x4b, 0xb7, 0x80, 0x62, 0x5f, 0x90, 0x22, 0x80, 0x22, 0x44, 0xaa, 0xb2, 0x41, 0x33, 0xcd, 0x7c, 0xa7, 0x2b, 0x44, 0x5c, 0x3d, 0x54, 0x25, 0xfd, 0x6e, 0x47, 0xcb, 0x81, 0x46, 0x77, 0x8b, 0x75, 0x84, 0xe6, 0x94, 0x58, 0xa3, 0xd9, 0xbe, 0x54, 0x11, 0x25, 0xd7, 0x43, 0x53, 0xba, 0x43, 0x85, 0xfd, 0xec, 0x5b, 0x59, 0xe0, 0x03, 0x0e, 0x57, 0x80, 0x97, 0x7a, 0x0f, 0xf3, 0x17, 0x27, 0x50, 0x88, 0x72, 0x85, 0xb0, 0x14, 0x9d, 0x28, 0xec, 0x09, 0xb1, 0xb4, 0x56, 0x9b, 0x36, 0x4f, 0xa9, 0x8f, 0xb9, 0x66, 0x1f, 0xac, 0xea, 0xc3, 0x9f, 0xfe, 0x5a, 0xb8, 0xe8, 0xde, 0x63, 0xeb, 0x6f, 0xb8, 0x26, 0xdf, 0x42, 0x4b, 0x46, 0x94, 0xe0, 0xdb, 0x61, 0xae, 0x0a, 0x6f, 0xd6, 0xbf, 0xb3, 0x3b, 0x13, 0x82, 0xd6, 0x3e, 0xaf, 0x18, 0x2e, 0x4b, 0x03, 0xca, 0xf9, 0xa8, 0x83, 0x61, 0x2f, 0x04, 0x0b, 0x6e, 0xf0, 0x0e, 0x8c, 0xc2, 0x19, 0x9b, 0x10, 0x78, 0x3b, 0x36, 0xf6, 0x54, 0x12, 0x9b, 0xa1, 0xad, 0xf8, 0x02, 0x3b, 0x7b, 0x51, 0x53, 0x56, 0x8b, 0xc7, 0xeb, 0xaa, 0x5c, 0xfe, 0x38, 0x80, 0x59, 0x6c, 0x37, 0x79, 0x5e, 0x33, 0x77, 0xc7, 0x8b, 0x6b, 0x78, 0x1b, 0x9b, 0xd9, 0x91, 0x2f, 0xfb, 0x9b, 0x42, 0xca, 0x9b, 0xfe, 0xc8, 0x8f, 0x6a, 0xba, 0x47, 0x04, 0x94, 0xfd, 0xa2, 0x1a, 0x07, 0xb3, 0xc2, 0xb8, 0xaf, 0x0d, 0x9f, 0x7e, 0x2a, 0x6b, 0x1e, 0x82, 0x91, 0xe1, 0x17, 0xc0, 0x51, 0xf3, 0xc9, 0x14, 0xef, 0xf4, 0xbe, 0xe3, 0xa8, 0x57, 0xec, 0x2d, 0xb3, 0x1d, 0x26, 0x62, 0xd1, 0xb4, 0xad, 0x89, 0x58, 0x72, 0xc3, 0x87, 0x6a, 0xfb, 0x0f, 0x89, 0xa7, 0x1e, 0x34, 0x89, 0x3a, 0x3b, 0x96, 0x85, 0xa3, 0x91, 0x64, 0xf1, 0x59, 0x66, 0x66, 0x91, 0xa1, 0x76, 0x3a, 0x73, 0xc2, 0x93, 0x43, 0x07, 0xc3, 0xed, 0xb7, 0xf0, 0x9d, 0x6a, 0x48, 0x6c, 0xc8, 0xb4, 0x56, 0x12, 0xa6, 0xc2, 0x52, 0x50, 0x25, 0xf9, 0xd4, 0x1d, 0xfc, 0x4d, 0xbe, 0x0e, 0x48, 0x02, 0x31, 0xa9, 0xea, 0xce, 0xcb, 0x9a, 0xe9, 0x31, 0x9b, 0xd2, 0x8d, 0xdc, 0x37, 0x52, 0x95, 0x85, 0xdb, 0x36, 0x05, 0x1f, 0x1a, 0x6a, 0xbd, 0xc5, 0x73, 0x61, 0xdb, 0x27, 0xbf, 0x2a, 0x13, 0x47, 0x16, 0xde, 0x29, 0xa7, 0xc1, 0x24, 0xe4, 0x85, 0x23, 0x78, 0x13, 0x3a, 0x31, 0xc4, 0x32, 0x37, 0xbc, 0x30, 0x67, 0xd3, 0xdc, 0x47, 0x5c, 0xa6, 0x34, 0x8a, 0xd4, 0xb3, 0x7c, 0x5f, 0x5f, 0xb2, 0x14, 0x53, 0x50, 0xd8, 0xc4, 0x9d, 0xf0, 0xe5, 0x0d, 0x37, 0xa0, 0xd4, 0x43, 0x18, 0x05, 0xbc, 0x91, 0x33, 0x3a, 0x39, 0x06, 0x21, 0x53, 0x35, 0xd5, 0x15, 0xc0, 0x19, 0xac, 0x4d, 0xf0, 0x89, 0x8d, 0x0a, 0x07, 0x44, 0x43, 0xb7, 0xe0, 0x66, 0x1f, 0xc3, 0xcd, 0x30, 0x8b, 0x01, 0xd0, 0x8a, 0xa4, 0x21, 0x06, 0x25, 0xef, 0x3d, 0x19, 0xd0, 0xa3, 0x6c, 0x15, 0x7a, 0x32, 0x12, 0xad, 0xce, 0xfa, 0xba, 0xa2, 0xc9, 0x0d, 0xe0, 0x84, 0x56, 0x7e, 0xc8, 0x6b, 0x59, 0xbe, 0x86, 0xc8, 0xa4, 0xdc, 0x65, 0xac, 0xf1, 0x80, 0x44, 0x5d, 0x6b, 0x3c, 0x13, 0x11, 0x47, 0xf6, 0x16, 0x35, 0x4e, 0xa3, 0xbf, 0xf2, 0x2a, 0x31, 0xee, 0x38, 0x47, 0xf4, 0x78, 0x42, 0x61, 0x6d, 0x4a, 0xab, 0xc0, 0x58, 0x04, 0xb2, 0x96, 0xb6, 0x30, 0xed, 0xec, 0x9a, 0x85, 0x09, 0x21, 0xfc, 0xbe, 0x5c, 0xbd, 0xec, 0xa4, 0x1e, 0xa4, 0x3d, 0xb1, 0x4e, 0xf8, 0x5e, 0xfb, 0x3a, 0x0f, 0xf8, 0xdc, 0x45, 0xda, 0xd3, 0x78, 0x82, 0x4f, 0x99, 0x8a, 0x42, 0x1a, 0xd7, 0x73, 0x55, 0x79, 0x42, 0xb9, 0x05, 0x19, 0xba, 0x57, 0x7f, 0xb1, 0x58, 0xc5, 0x55, 0x61, 0x4c, 0xed, 0x0d, 0x3e, 0x24, 0xf1, 0x04, 0x5e, 0xf3, 0xe7, 0x3e, 0x02, 0x36, 0x38, 0xdc, 0xca, 0x3b, 0x9f, 0xe1, 0x25, 0xf5, 0xa8, 0xc6, 0xc4, 0xdc, 0x39, 0xb0, 0xc0, 0xd8, 0x61, 0x84, 0xcd, 0xcf, 0xbe, 0xb7, 0x07, 0x08, 0x12, 0xef, 0x53, 0x37, 0xd7, 0xf8, 0x3e, 0x41, 0xde, 0x12, 0x1f, 0xe3, 0xa7, 0x90, 0x01, 0xce, 0x91, 0x87, 0x62, 0xdd, 0x7a, 0x9f, 0xde, 0xdf, 0xb0, 0x62, 0x96, 0x66, 0x6e, 0x9c, 0xd4, 0x82, 0x43, 0xa1, 0xa7, 0xde, 0x03, 0x7a, 0x49, 0xc8, 0x8a, 0x72, 0x2d, 0xee, 0x42, 0x7f, 0x6b, 0x1e, 0x81, 0x31, 0xee, 0x61, 0xe5, 0x97, 0x38, 0xe4, 0x6f, 0xf3, 0x42, 0x5e, 0x38, 0xb3, 0x37, 0xe5, 0x53, 0x5c, 0xeb, 0x7d, 0x86, 0xcf, 0xfa, 0xe2, 0x8d, 0xb5, 0x57, 0x44, 0x59, 0x48, 0x30, 0x51, 0xe6, 0x7b, 0x9a, 0xc4, 0x25, 0x61, 0x51, 0x68, 0xf9, 0x42, 0x28, 0x8c, 0x6c, 0xba, 0x70, 0x3d, 0x0d, 0xa2, 0x8d, 0xcd, 0xcf, 0xf2, 0x4b, 0x85, 0xd6, 0xd6, 0x14, 0xe6, 0x1a, 0x9b, 0x18, 0x22, 0x67, 0x22, 0xa5, 0xb8, 0x7c, 0xec, 0x6d, 0x66, 0xf5, 0xa4, 0x29, 0x13, 0x5c, 0x1c, 0x4f, 0xcd, 0x8b, 0xbc, 0x0f, 0x27, 0x75, 0xda, 0xc6, 0x77, 0xd2, 0x5f, 0x37, 0xee, 0x46, 0xd4, 0xb1, 0x18, 0x72, 0xfb, 0xb7, 0x5f, 0x62, 0x08, 0xff, 0x7f, 0x2e, 0x50, 0x36, 0x29, 0x53, 0x0b, 0x62, 0x38, 0xc6, 0x5a, 0x3e, 0xe9, 0xba, 0x36, 0xe2, 0xcb, 0x7d, 0xf4, 0x67, 0xd8, 0x98, 0x88, 0xf6, 0x39, 0xf9, 0x85, 0x64, 0xeb, 0xc4, 0x7f, 0xb6, 0xc9, 0xf8, 0x03, 0x1a, 0xca, 0x0d, 0x35, 0x94, 0xe2, 0xc3, 0xcc, 0xef, 0x5d, 0x5a, 0x83, 0x28, 0x50, 0x8e, 0x88, 0x67, 0x31, 0xd3, 0xa0, 0x5c, 0x69, 0x83, 0x6d, 0x21, 0x0e, 0x2a, 0x67, 0x35, 0x68, 0x9a, 0xb2, 0x41, 0x67, 0x87, 0x8b, 0x1a, 0x84, 0x53, 0x78, 0xa3, 0x26, 0x1b, 0xc3, 0x0f, 0x24, 0x5f, 0x76, 0xbf, 0x0c, 0x50, 0xff, 0x40, 0x38, 0x98, 0x55, 0x6d, 0x24, 0x44, 0x84, 0x05, 0x79, 0x20, 0x36, 0xe0, 0xb8, 0x04, 0xcb, 0x69, 0x63, 0x91, 0x81, 0xb9, 0x07, 0xa9, 0xa6, 0x28, 0x91, 0xf3, 0xe6, 0xf9, 0xa0, 0xbb, 0x77, 0xaa, 0xe1, 0xe9, 0x90, 0xe8, 0x36, 0x60, 0x15, 0x5b, 0xb3, 0x9b, 0x72, 0x7b, 0x1c, 0x17, 0xcb, 0xd5, 0xf0, 0x1b, 0x2f, 0xce, 0x76, 0xf9, 0xae, 0x50, 0x7b, 0x70, 0xc5, 0xe8, 0x3a, 0x08, 0x96, 0x08, 0xa2, 0x9f, 0x22, 0xbb, 0x39, 0x4f, 0x37, 0x3c, 0x72, 0x36, 0x71, 0x1b, 0x4b, 0x09, 0x25, 0x71, 0x6e, 0xcf, 0xc1, 0x09, 0x42, 0x7f, 0x5c, 0xa4, 0xc8, 0xf2, 0x8e, 0xa7, 0x21, 0xc7, 0x89, 0xa7, 0x51, 0xbc, 0xf3, 0x87, 0x3d, 0x57, 0xd0, 0x38, 0x0e, 0xde, 0x3c, 0x28, 0x02, 0x1b, 0x75, 0x5c, 0x01, 0x90, 0xa2, 0xd7, 0x5a, 0x39, 0x0a, 0xe6, 0x01, 0x16, 0x80, 0xad, 0x98, 0x21, 0x82, 0xf4, 0x31, 0xca, 0x50, 0x76, 0x98, 0xd1, 0xd7, 0x62, 0xd2, 0xfb, 0xf4, 0x94, 0x61, 0x34, 0x30, 0x5b, 0x90, 0xe0, 0x98, 0x66, 0xf3, 0xba, 0x10, 0xa4, 0x3f, 0x30, 0x06, 0x0e, 0xcc, 0x2b, 0x61, 0xa3, 0xaa, 0x3b, 0xef, 0x8a, 0x26, 0x59, 0xdf, 0x6b, 0xd2, 0xc5, 0x8e, 0x8d }; +constexpr AccessUnit USER_DATA_SINGLE_PACK_EXPECTED_AU = { 0x15f90, 0x159b2, false, 0, {}, { 0x65, 0x94, 0x4b, 0xa5, 0x88, 0x59, 0x24, 0xa3, 0x5a, 0x30, 0x33, 0x6d, 0xaf, 0xb2, 0x95, 0x4b, 0x84, 0x08, 0x72, 0xd6 } }; + + +constexpr std::array TIME_STAMP_SIGN_EXTENDED_STREAM = []() constexpr { auto pack = USER_DATA_SINGLE_PACK_STREAM; pack[0x11d] |= 0x4; pack[0x122] |= 0x4; return pack; }(); // Set 31st bits of the timestamps +constexpr AccessUnit TIME_STAMP_SIGN_EXTENDED_EXPECTED_AU = { 0xffffffff'80015f90ull, 0xffffffff'800159b2ull, false, 0, {}, { 0x65, 0x94, 0x4b, 0xa5, 0x88, 0x59, 0x24, 0xa3, 0x5a, 0x30, 0x33, 0x6d, 0xaf, 0xb2, 0x95, 0x4b, 0x84, 0x08, 0x72, 0xd6 } }; + + +const std::vector AVC_LARGE_AU_STREAM = { 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xe0, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x00, 0x00, 0x00, 0x01, 0x09, 0xf6, 0xc0, 0x00, 0x4f, 0x57, 0x7f, 0xb7, 0xec, 0x51, 0xfa, 0xd4, 0x23, 0xdf, 0x05, 0x0a, 0x7a, 0x74, 0x3b, 0xbc, 0x91, 0xb6, 0xc8, 0x73, 0x6b, 0xe4, 0x1d, 0x28, 0xe9, 0xf2, 0x5f, 0xf8, 0x91, 0x13, 0xe6, 0xdb, 0x83, 0x92, 0x7f, 0x24, 0x04, 0x68, 0x57, 0x5c, 0x20, 0x6a, 0x4d, 0xfe, 0x93, 0x47, 0xe9, 0xf0, 0xf0, 0x18, 0xe2, 0xef, 0x2a, 0x94, 0xa9, 0xe4, 0xac, 0xc7, 0x1b, 0x62, 0x71, 0x96, 0xc8, 0x9e, 0xf6, 0x91, 0x44, 0x83, 0x34, 0x23, 0xf8, 0xb7, 0x35, 0x15, 0x1d, 0xe9, 0xc5, 0x1a, 0x61, 0xbd, 0x48, 0x21, 0x6b, 0xff, 0xd6, 0x2d, 0x85, 0xc8, 0x37, 0xf5, 0x6b, 0xaa, 0x59, 0x24, 0xf8, 0x33, 0xb5, 0xc8, 0xbc, 0x0a, 0x43, 0x3f, 0x82, 0xea, 0xd8, 0x8c, 0xdc, 0xd0, 0x6e, 0x92, 0x20, 0x3e, 0xce, 0x6c, 0x36, 0x3c, 0x43, 0xbf, 0x6e, 0x47, 0x92, 0xaa, 0xa3, 0x2a, 0x21, 0x95, 0x4c, 0x2e, 0x06, 0xbd, 0x64, 0x07, 0xf7, 0xdd, 0x15, 0x58, 0xf4, 0x15, 0xde, 0x47, 0x02, 0xe5, 0x2b, 0x9a, 0xce, 0x25, 0x2a, 0x85, 0x48, 0x3e, 0x05, 0xc2, 0xd2, 0xc6, 0x5a, 0x6d, 0xfe, 0xe8, 0x8b, 0xda, 0xe4, 0x4a, 0x6e, 0xc7, 0xc4, 0xff, 0x94, 0xe4, 0x46, 0xac, 0xf1, 0xa1, 0x8b, 0xdd, 0x54, 0xe0, 0xac, 0xd7, 0x1f, 0x76, 0x3c, 0xa6, 0x8f, 0x24, 0x37, 0xc1, 0xd2, 0xa6, 0xa4, 0x95, 0xdd, 0x53, 0x28, 0x5d, 0xb4, 0x89, 0xfd, 0x8f, 0x16, 0xa1, 0x9d, 0x5a, 0x1a, 0x7c, 0xda, 0x50, 0xa0, 0x33, 0x3e, 0x9b, 0x1a, 0x33, 0xa6, 0x4a, 0xc0, 0xfa, 0x14, 0xbf, 0xb9, 0x24, 0xa0, 0x99, 0x64, 0xb8, 0x9d, 0xb1, 0xfb, 0x98, 0xc9, 0xcf, 0xac, 0x7b, 0xcb, 0x9e, 0x85, 0x6f, 0x1e, 0xb3, 0x56, 0x33, 0xaf, 0x68, 0x42, 0xd9, 0xf7, 0x0c, 0x79, 0x2b, 0xfe, 0x61, 0x14, 0xa6, 0x59, 0x8c, 0x72, 0x97, 0xb3, 0x5e, 0x4e, 0xce, 0x25, 0xea, 0x1c, 0x09, 0x40, 0x1e, 0xfc, 0x6b, 0x31, 0xf1, 0xe3, 0x43, 0x10, 0xe4, 0x3b, 0x66, 0xa3, 0xde, 0x3b, 0xcc, 0x94, 0x5f, 0x97, 0xfd, 0xb6, 0x5a, 0x69, 0x9d, 0x28, 0xc9, 0xf0, 0xc9, 0x19, 0xd0, 0xe5, 0x52, 0xb9, 0x2b, 0x2d, 0xac, 0x15, 0xe3, 0x14, 0x3d, 0xea, 0x32, 0xc5, 0x49, 0x8e, 0x7f, 0xfc, 0x26, 0xe8, 0xc9, 0xbc, 0x60, 0x2f, 0x7c, 0xc9, 0x42, 0xca, 0xfe, 0x81, 0xe1, 0x02, 0x08, 0x91, 0x03, 0xe4, 0xe6, 0xca, 0x00, 0xef, 0x06, 0x5b, 0x3e, 0x8a, 0x91, 0xc8, 0x0e, 0x3c, 0xa7, 0x94, 0x08, 0x4f, 0x09, 0x92, 0x98, 0xc8, 0x48, 0xb0, 0x2d, 0xf3, 0x95, 0xe7, 0x01, 0x83, 0xee, 0x90, 0xb0, 0xc7, 0xbf, 0x27, 0x77, 0xfc, 0x19, 0xaf, 0xb4, 0xc2, 0x36, 0xad, 0x95, 0xca, 0xab, 0xa9, 0xf1, 0x1a, 0xaa, 0xfc, 0x2e, 0x56, 0x8a, 0xd8, 0x97, 0x8e, 0x91, 0xd7, 0xee, 0x80, 0x85, 0x9d, 0x33, 0x6d, 0xa6, 0x3d, 0xcd, 0x78, 0xb1, 0xcb, 0x58, 0xdd, 0x43, 0x59, 0xd3, 0x6b, 0xaa, 0x34, 0xcc, 0x56, 0xd5, 0x09, 0x5f, 0x0c, 0x62, 0x53, 0xb2, 0x69, 0x3d, 0xcd, 0xe2, 0x5e, 0x21, 0xfa, 0x34, 0x1e, 0xa7, 0x35, 0x04, 0x8b, 0xfc, 0x45, 0x3b, 0x9a, 0x56, 0x61, 0x2d, 0x09, 0xe3, 0xdc, 0xa4, 0xf1, 0xb2, 0xb0, 0xdc, 0x48, 0xdb, 0x41, 0xb0, 0x9b, 0xef, 0x0e, 0x55, 0x02, 0x83, 0x5c, 0x97, 0xe3, 0x90, 0x4b, 0xdb, 0x81, 0x03, 0xc5, 0x60, 0x91, 0x9e, 0xf6, 0x80, 0x7c, 0x7e, 0xe4, 0xdf, 0x91, 0x1b, 0xcd, 0x71, 0x2d, 0xe5, 0xa6, 0x19, 0x95, 0x09, 0xfc, 0x9b, 0x82, 0x8e, 0x99, 0xde, 0x4c, 0x4d, 0x11, 0x87, 0x2b, 0x9a, 0x3d, 0xdc, 0xc8, 0xd3, 0x23, 0x35, 0x7d, 0x87, 0xbb, 0xcb, 0xbe, 0x89, 0x7a, 0x8e, 0xa8, 0x84, 0x6e, 0xcf, 0x4d, 0x2f, 0x1f, 0xd1, 0xfb, 0x65, 0x4f, 0x58, 0xc1, 0xa3, 0xa7, 0x5c, 0x71, 0x8a, 0x01, 0x98, 0xee, 0x99, 0xd1, 0xde, 0xac, 0xd9, 0x1c, 0x23, 0x70, 0x88, 0x28, 0x83, 0x3b, 0x13, 0xd1, 0xc8, 0x87, 0x31, 0xe5, 0xdf, 0x56, 0x71, 0xa7, 0x81, 0xe7, 0x82, 0x25, 0x9e, 0x95, 0xb8, 0xc9, 0x8c, 0x82, 0xc6, 0xc7, 0x29, 0x80, 0xa1, 0xa6, 0x90, 0x5e, 0xbc, 0x2e, 0x13, 0x49, 0x51, 0x94, 0x67, 0x48, 0xd8, 0x54, 0x05, 0xe9, 0xe5, 0x0b, 0x48, 0xcf, 0x7e, 0x7e, 0x17, 0x7e, 0x05, 0xa0, 0x2f, 0x92, 0xbe, 0xd0, 0x28, 0xae, 0xac, 0x65, 0xae, 0x4b, 0x61, 0x6f, 0x37, 0x2e, 0xd8, 0xb2, 0x54, 0xe6, 0xfd, 0x9d, 0x03, 0x70, 0xcf, 0xb9, 0x29, 0xe7, 0x8c, 0xef, 0x4a, 0xf2, 0xcf, 0xd9, 0x85, 0xfe, 0xf1, 0x69, 0x60, 0x98, 0xe0, 0x0d, 0x87, 0xe0, 0x04, 0x70, 0x53, 0xeb, 0x90, 0x26, 0x7a, 0xa5, 0x57, 0x3a, 0x96, 0x84, 0x0e, 0x60, 0x73, 0x9f, 0x37, 0x0c, 0xb1, 0x4e, 0xc5, 0x29, 0xbe, 0x32, 0x1b, 0x6e, 0xed, 0xdc, 0x28, 0xa2, 0x48, 0x57, 0x3b, 0x78, 0x10, 0xbf, 0x98, 0x39, 0x91, 0x58, 0x35, 0xc4, 0x21, 0x48, 0x13, 0xf1, 0xc3, 0x63, 0xa4, 0x63, 0x97, 0x66, 0x49, 0x6b, 0x32, 0x4c, 0xe5, 0x1b, 0xd8, 0x50, 0xd2, 0x44, 0x91, 0x26, 0xe2, 0x2d, 0x04, 0xab, 0x52, 0x67, 0xe3, 0x8f, 0x29, 0x1c, 0x04, 0x4f, 0xc7, 0xc0, 0xa2, 0x19, 0xb0, 0x87, 0xdd, 0x50, 0xe7, 0xa8, 0xdb, 0x86, 0x78, 0xa4, 0x78, 0x6d, 0xc9, 0xd0, 0x88, 0x69, 0x87, 0xaf, 0xa4, 0x95, 0x61, 0x61, 0xdb, 0x83, 0x94, 0x53, 0xa6, 0xb4, 0xb2, 0x52, 0x24, 0xca, 0x83, 0x5f, 0x14, 0x16, 0xc7, 0x98, 0x51, 0xb5, 0x20, 0xb0, 0xc8, 0xb7, 0xdb, 0xd3, 0xd0, 0x95, 0xce, 0x0d, 0xef, 0xd4, 0x1e, 0x10, 0x8d, 0x8d, 0x8f, 0xb1, 0x12, 0x55, 0x03, 0xd8, 0x64, 0x0b, 0x14, 0xa8, 0xc8, 0x6f, 0x48, 0x47, 0x69, 0x46, 0x96, 0x81, 0xbe, 0xed, 0xf2, 0x39, 0x87, 0x71, 0xc7, 0x95, 0xf8, 0xb1, 0x4c, 0xd9, 0x07, 0xfa, 0x35, 0x93, 0xba, 0x09, 0x70, 0x79, 0xdf, 0x1f, 0x78, 0x8b, 0x12, 0x26, 0x06, 0x1d, 0x8e, 0xf0, 0x16, 0x8a, 0x18, 0xd9, 0xd8, 0xd3, 0x9a, 0x50, 0x76, 0x61, 0x22, 0xdd, 0x87, 0x3d, 0x4c, 0x5a, 0xdf, 0xe3, 0xe9, 0x47, 0x98, 0x5c, 0xac, 0x7a, 0x65, 0x55, 0xb5, 0xd7, 0xd5, 0xe3, 0x2b, 0x7b, 0x26, 0xa9, 0xce, 0xcc, 0x7c, 0x21, 0x8f, 0x7c, 0xcf, 0x28, 0x7e, 0x59, 0xfa, 0x8e, 0xb7, 0xee, 0x60, 0xda, 0x7b, 0xae, 0x73, 0xbe, 0x03, 0xb8, 0x8d, 0xab, 0xa2, 0x0a, 0x55, 0x27, 0xaf, 0x59, 0x96, 0xa0, 0xa5, 0xb4, 0xf0, 0xbc, 0xf8, 0xbe, 0xa6, 0x9d, 0x9b, 0x12, 0xd5, 0x03, 0xfa, 0x38, 0x4b, 0x00, 0x14, 0x4f, 0xe0, 0xe7, 0x49, 0x06, 0x83, 0x96, 0x60, 0x53, 0xe9, 0x08, 0x66, 0xb2, 0x3d, 0x4d, 0xf1, 0x65, 0x51, 0x09, 0x1c, 0x0c, 0x2a, 0x6f, 0xc8, 0x76, 0x3a, 0x4c, 0x98, 0x08, 0x3b, 0x1e, 0xd3, 0x8d, 0x6c, 0x2e, 0xd4, 0xf6, 0x4b, 0x1c, 0xba, 0xfc, 0x75, 0x94, 0xee, 0x1b, 0xa1, 0xa3, 0x9a, 0xa5, 0x57, 0xbc, 0x7e, 0xdb, 0xef, 0x81, 0x65, 0x39, 0x2f, 0x5f, 0x1e, 0x42, 0x5b, 0xb4, 0xe4, 0xf1, 0x46, 0x92, 0x3f, 0x86, 0x89, 0x24, 0xdd, 0x4b, 0x18, 0x49, 0x76, 0xfc, 0x65, 0xbf, 0xe7, 0x11, 0x8a, 0xb8, 0x78, 0xd6, 0x40, 0xe4, 0xd4, 0xc1, 0x8e, 0xa9, 0xe2, 0xb4, 0x9c, 0x8e, 0x7a, 0xcb, 0xca, 0x39, 0x2a, 0xf6, 0x17, 0x0e, 0x69, 0x91, 0xc1, 0x83, 0x1a, 0xe3, 0xfd, 0x49, 0xc1, 0x1f, 0x17, 0xc6, 0xf6, 0x6b, 0x20, 0x86, 0xea, 0xf2, 0x35, 0xaf, 0xf5, 0x3e, 0xd9, 0x11, 0x14, 0xf9, 0x3f, 0x46, 0x71, 0x2a, 0x47, 0x7b, 0xeb, 0xf3, 0xd5, 0xe6, 0x3e, 0xd0, 0xdc, 0xd3, 0x3e, 0x32, 0x82, 0x3d, 0xf2, 0xb8, 0x91, 0xfc, 0xa9, 0x54, 0x43, 0x6a, 0x6f, 0x68, 0xb4, 0x75, 0x49, 0x7f, 0x3e, 0xb9, 0x4e, 0x88, 0x4e, 0xb3, 0xf5, 0xd3, 0x91, 0x21, 0xde, 0xf8, 0x75, 0xd6, 0xed, 0x6c, 0xa0, 0x2c, 0x3a, 0x26, 0x5c, 0xea, 0x82, 0x9d, 0x6c, 0x25, 0x1b, 0x93, 0x64, 0x74, 0x8e, 0xca, 0x8e, 0x1f, 0xba, 0x6d, 0x6c, 0x08, 0xae, 0x42, 0xba, 0x1f, 0x0a, 0x8c, 0xa0, 0x66, 0xd4, 0xda, 0x44, 0x48, 0x29, 0x78, 0x6b, 0xdb, 0x2a, 0x2b, 0xbf, 0x32, 0xd9, 0xb5, 0xf1, 0xf9, 0xc0, 0x78, 0x7b, 0x4a, 0x1f, 0xd8, 0xff, 0xa7, 0xdc, 0x20, 0x1a, 0x69, 0x1c, 0x97, 0x77, 0x49, 0x21, 0x83, 0xf1, 0xb2, 0x5b, 0xfb, 0x4b, 0xb0, 0x7e, 0x32, 0xae, 0x47, 0xb5, 0x2b, 0x3e, 0x34, 0x62, 0xce, 0x5c, 0x37, 0x85, 0x3f, 0x51, 0x4b, 0xa9, 0x98, 0x1f, 0x18, 0x8d, 0xfa, 0x7f, 0x81, 0x70, 0x50, 0x97, 0x48, 0xa7, 0xec, 0x6b, 0xd4, 0xf0, 0x1c, 0x16, 0xfd, 0x54, 0xdc, 0x5d, 0x39, 0x2a, 0x6f, 0x6b, 0x02, 0x75, 0xbb, 0x7b, 0x24, 0xe9, 0xa7, 0xc4, 0xd8, 0xd4, 0x00, 0xbb, 0x8f, 0x17, 0x82, 0x87, 0x06, 0x55, 0x11, 0xd4, 0xd9, 0x95, 0x03, 0x84, 0x13, 0xec, 0xf7, 0x60, 0x30, 0xb5, 0xf1, 0xcb, 0x4b, 0xa7, 0x60, 0xd4, 0x4f, 0x4c, 0xfd, 0x37, 0x3b, 0x13, 0x89, 0xc2, 0x95, 0xbe, 0x90, 0xf8, 0x00, 0x7e, 0xcb, 0x24, 0x1e, 0xd9, 0x54, 0x73, 0x7f, 0x1e, 0xdc, 0x6c, 0x27, 0x57, 0x39, 0x2b, 0x94, 0x03, 0x41, 0x4b, 0xeb, 0xa7, 0x2b, 0x03, 0xd6, 0xf4, 0xb2, 0xc4, 0x3f, 0xa1, 0x60, 0x2d, 0x76, 0xa3, 0x43, 0x1f, 0x7c, 0xfe, 0x0e, 0x2f, 0x07, 0xb0, 0x4f, 0x7e, 0xd8, 0xca, 0x9f, 0xcb, 0xec, 0x32, 0x77, 0xce, 0x67, 0xcf, 0x06, 0xbd, 0xd1, 0xe4, 0x3c, 0x24, 0x6e, 0x9e, 0x82, 0x7a, 0x4c, 0xa9, 0xa2, 0xd5, 0xe5, 0xe7, 0x8c, 0x94, 0x1f, 0x6b, 0x1a, 0xf8, 0x2b, 0x31, 0xb1, 0x87, 0xbd, 0xd3, 0x76, 0x0d, 0x41, 0xeb, 0x72, 0x0a, 0xd0, 0x15, 0xad, 0x74, 0x16, 0xb8, 0x53, 0x79, 0xd6, 0xf9, 0xa7, 0x67, 0x6d, 0x0d, 0x22, 0xc2, 0xe2, 0x7c, 0xb6, 0xbc, 0x06, 0x77, 0xe9, 0x1e, 0xcb, 0xd2, 0xfa, 0xfd, 0x68, 0x57, 0x3e, 0x22, 0x5c, 0xe9, 0xe4, 0x61, 0x12, 0xd0, 0x9f, 0xfa, 0x38, 0x31, 0x5f, 0x40, 0xe2, 0x3d, 0xbe, 0x39, 0xff, 0x02, 0x78, 0x31, 0xa4, 0x39, 0xc4, 0xe2, 0xcc, 0x3c, 0xde, 0x8b, 0x24, 0x89, 0x8c, 0xba, 0x3f, 0x2f, 0x1a, 0x23, 0x1c, 0x27, 0x38, 0x34, 0xeb, 0x7a, 0x99, 0x0b, 0x61, 0x2c, 0x6a, 0xd8, 0xe8, 0xcd, 0x64, 0xce, 0x9d, 0x63, 0x31, 0xb0, 0xad, 0xdf, 0x0b, 0x81, 0xcc, 0x78, 0x5b, 0x3f, 0xa7, 0x52, 0x92, 0x5d, 0xf0, 0xd4, 0xed, 0x6f, 0xb1, 0xc3, 0x37, 0xde, 0x57, 0x05, 0xd6, 0xdd, 0x10, 0x14, 0x7c, 0x00, 0xde, 0x08, 0x54, 0x8f, 0x07, 0xb5, 0xd7, 0x8d, 0x1f, 0x5f, 0x6f, 0x5f, 0x27, 0x3c, 0x80, 0xd5, 0xfa, 0xdb, 0x26, 0x0f, 0x63, 0xda, 0x1c, 0xf4, 0xb7, 0x36, 0xc1, 0x1c, 0x79, 0x9d, 0xe3, 0xbd, 0xae, 0x3f, 0xfb, 0x41, 0xe2, 0x41, 0xe8, 0xa9, 0x6e, 0x01, 0x16, 0x59, 0xf0, 0x1c, 0x2b, 0x25, 0xc7, 0x05, 0xc6, 0x72, 0x51, 0x40, 0x4d, 0xa1, 0x2e, 0x31, 0xbf, 0xd9, 0x13, 0x4f, 0x9d, 0x6b, 0xce, 0xfb, 0x4a, 0xb1, 0xb5, 0xfa, 0x1f, 0x94, 0x88, 0x07, 0x43, 0x48, 0x12, 0x63, 0x40, 0x24, 0xaf, 0xfd, 0x67, 0x50, 0x21, 0xc9, 0xf0, 0x3f, 0xaa, 0xeb, 0xb1, 0xcf, 0x48, 0x2d, 0x93, 0x92, 0xfd, 0xdf, 0x21, 0xb1, 0xda, 0xa1, 0x26, 0xca, 0x9d, 0x76, 0xc1, 0xab, 0x01, 0x76, 0x7b, 0x5e, 0x08, 0xa7, 0xd1, 0x1f, 0x1c, 0x89, 0x50, 0x25, 0x39, 0x0e, 0xa5, 0x04, 0x1c, 0x13, 0xf6, 0x21, 0x6e, 0xbe, 0x6f, 0xc9, 0x6e, 0x6c, 0x84, 0xa1, 0x41, 0xdd, 0xa3, 0x95, 0x65, 0x50, 0xcf, 0xca, 0xac, 0x1a, 0xa3, 0x4d, 0x86, 0x12, 0x23, 0x5b, 0x3a, 0xaa, 0x43, 0xac, 0x04, 0x43, 0x81, 0x77, 0xa8, 0x59, 0xf8, 0x0f, 0xb9, 0x33, 0xd9, 0x24, 0x18, 0x3b, 0x53, 0xea, 0x97, 0x88, 0x30, 0x84, 0xb0, 0x72, 0x5b, 0x49, 0x6d, 0x27, 0xbe, 0x14, 0x71, 0x5a, 0xf2, 0x9d, 0x21, 0xae, 0xc2, 0xf6, 0x37, 0x31, 0xd1, 0xba, 0x66, 0x58, 0xfe, 0xf9, 0x31, 0x3e, 0x51, 0x95, 0xd4, 0x8f, 0x27, 0x7f, 0x91, 0xeb, 0xe6, 0x94, 0x16, 0xb6, 0x0e, 0x2e, 0x28, 0x9f, 0x8d, 0x2e, 0x47, 0x37, 0x01, 0x9c, 0x60, 0x16, 0xc1, 0xd6, 0x06, 0xfc, 0x59, 0x55, 0x1d, 0x2e, 0xbf, 0x62, 0x72, 0xc3, 0xaa, 0x18, 0x5e, 0x97, 0x33, 0x61, 0x8a, 0x8a, 0xa0, 0xdd, 0x4a, 0x41, 0x4e, 0x72, 0xf9, 0x98, 0xbf, 0xc7, 0x06, 0xbb, 0x35, 0x61, 0x48, 0x60, 0xdf, 0xa1, 0xba, 0xcf, 0x25, 0x4a, 0x09, 0x3b, 0xff, 0xd6, 0xf1, 0xc0, 0xc7, 0xa3, 0x2e, 0x50, 0x3e, 0x07, 0xb7, 0x02, 0x29, 0xbd, 0x69, 0x70, 0xd7, 0xa5, 0xc4, 0xda, 0x7a, 0xc5, 0xdb, 0x0c, 0x2e, 0xde, 0xc7, 0x4d, 0x57, 0x93, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x02, 0xe4, 0x61, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xe0, 0x07, 0xec, 0x81, 0x00, 0x00, 0x48, 0x7d, 0x43, 0xe1, 0xdb, 0x54, 0x90, 0x90, 0x65, 0x1f, 0xe2, 0xac, 0x42, 0x11, 0xbc, 0x94, 0x4c, 0xa0, 0x08, 0x07, 0x9e, 0x23, 0x7d, 0x4f, 0x8b, 0xe8, 0x12, 0x1c, 0x18, 0xbb, 0x03, 0x67, 0x80, 0x32, 0x88, 0x98, 0x45, 0x91, 0xb1, 0x4a, 0x0f, 0xca, 0x75, 0xf8, 0x03, 0x59, 0x88, 0x96, 0x5a, 0x37, 0xf3, 0xd1, 0xe0, 0x0d, 0x27, 0x07, 0x66, 0x0c, 0xe5, 0x75, 0x2d, 0x29, 0x88, 0xfc, 0xc4, 0x71, 0x0a, 0xd0, 0x78, 0xab, 0xb1, 0x96, 0xca, 0x3f, 0xa5, 0x71, 0x15, 0xc7, 0x16, 0x2e, 0xd6, 0xf4, 0x10, 0x42, 0xf0, 0x28, 0x8d, 0xba, 0xae, 0x36, 0xcc, 0x72, 0xe1, 0x78, 0x40, 0xb1, 0x6d, 0xc9, 0x4b, 0x21, 0x8d, 0xc1, 0xa6, 0x66, 0x4d, 0xa3, 0x4e, 0x4e, 0xc1, 0x0c, 0x6f, 0x54, 0xe3, 0xb8, 0xab, 0x1b, 0xc5, 0xe3, 0x58, 0x9c, 0xbd, 0x89, 0xfb, 0xca, 0xaa, 0x65, 0x2b, 0xf9, 0x7e, 0x59, 0x08, 0xde, 0xb9, 0xc9, 0xde, 0x56, 0x72, 0x61, 0xba, 0xe2, 0x9f, 0x4a, 0x02, 0x03, 0x86, 0xa2, 0x96, 0x33, 0xf8, 0x52, 0xc6, 0xf3, 0x05, 0xb7, 0x80, 0x74, 0xeb, 0x05, 0x6d, 0x07, 0x07, 0x44, 0x2f, 0xf7, 0xc2, 0xf5, 0xd7, 0x20, 0x3a, 0xbb, 0x07, 0x13, 0x70, 0xcc, 0xb1, 0x76, 0x51, 0x4d, 0xfc, 0x33, 0xf4, 0x60, 0x09, 0xf8, 0x47, 0xc8, 0xde, 0x4e, 0x7c, 0x2b, 0x0a, 0x59, 0x9a, 0x89, 0x9c, 0x56, 0x6c, 0xd8, 0x3d, 0x85, 0x8e, 0xa3, 0xe4, 0x20, 0x13, 0xf9, 0xf0, 0x84, 0x4b, 0x51, 0x4e, 0x75, 0xbd, 0xac, 0xd8, 0x5b, 0x04, 0x4b, 0x2e, 0xbe, 0xf3, 0xb7, 0xa3, 0x0a, 0xe2, 0x14, 0x4e, 0xc5, 0xc7, 0x30, 0xc0, 0xe1, 0xab, 0x2c, 0x9d, 0xec, 0x74, 0x64, 0x83, 0x19, 0x6c, 0x05, 0x81, 0x5c, 0x89, 0xf5, 0x99, 0xa2, 0x8b, 0x8b, 0x86, 0x9f, 0xcf, 0xb3, 0x3f, 0xcf, 0x1a, 0x12, 0x49, 0xc6, 0xa6, 0xaa, 0x5c, 0x60, 0x06, 0x99, 0x97, 0x1e, 0x6f, 0x65, 0xe6, 0x91, 0x51, 0x0b, 0x76, 0xca, 0x14, 0x05, 0x37, 0x77, 0x7f, 0x9c, 0x0e, 0xc9, 0x15, 0x05, 0xd7, 0xd9, 0x52, 0x16, 0x68, 0x41, 0x27, 0xb4, 0x95, 0xe1, 0xf1, 0xe6, 0x35, 0x66, 0x0f, 0x26, 0xc5, 0x42, 0xde, 0xab, 0xa8, 0x34, 0x16, 0xb1, 0x4e, 0x7c, 0x5a, 0xc1, 0xe7, 0x29, 0x5b, 0x32, 0x44, 0x3d, 0xea, 0xa0, 0x59, 0xf6, 0xa9, 0x7a, 0x94, 0x9f, 0x14, 0x0c, 0xc5, 0x75, 0xc7, 0x94, 0xfc, 0xcf, 0xd7, 0x0c, 0xe6, 0x1b, 0x79, 0x9b, 0x9e, 0x25, 0xfd, 0x0e, 0xa1, 0xe3, 0xb7, 0xf4, 0x35, 0x71, 0x7e, 0xd0, 0x18, 0x50, 0x07, 0xf6, 0xe8, 0xf5, 0x82, 0x29, 0xd6, 0x47, 0xa8, 0x4f, 0xa7, 0xd0, 0xcb, 0x87, 0x60, 0xdb, 0x7a, 0xe8, 0x7b, 0x30, 0xbc, 0xeb, 0x43, 0x81, 0x9f, 0x1e, 0x1b, 0xec, 0xef, 0x0e, 0x52, 0x9b, 0xd8, 0x5d, 0xb5, 0x45, 0x3e, 0x35, 0x33, 0xc7, 0x99, 0x7b, 0xdb, 0x12, 0xb9, 0x92, 0xa7, 0xd6, 0xb3, 0xf1, 0x7e, 0x53, 0x61, 0x40, 0x1f, 0xf2, 0x48, 0x45, 0xc3, 0x9f, 0xbe, 0x1f, 0xb8, 0x24, 0x2b, 0xa3, 0xcb, 0x0d, 0xbf, 0xe5, 0xb0, 0x1a, 0x0a, 0xc0, 0xd8, 0x68, 0x51, 0x1e, 0x06, 0xfe, 0xad, 0x88, 0x0f, 0xd3, 0xe5, 0x49, 0x9e, 0xf6, 0x79, 0x21, 0x68, 0x98, 0xda, 0x23, 0x5b, 0x55, 0xd9, 0xba, 0xd9, 0xa4, 0x6a, 0x47, 0x46, 0x3d, 0xbc, 0xd7, 0xdb, 0xa6, 0x95, 0x8a, 0x24, 0xc8, 0x52, 0x95, 0xfd, 0xcd, 0xf2, 0x71, 0x8c, 0x60, 0x7e, 0x60, 0xa4, 0xe4, 0xe0, 0x42, 0x25, 0x2c, 0x33, 0x5a, 0x94, 0x87, 0xd0, 0x95, 0x00, 0xd8, 0xd1, 0xa2, 0x85, 0xa5, 0x04, 0xd6, 0x61, 0xb3, 0x3b, 0xa1, 0x01, 0xb1, 0xe8, 0x1d, 0xd0, 0x1b, 0xf1, 0xbc, 0xda, 0xe7, 0xa9, 0x07, 0x58, 0xd5, 0x82, 0x68, 0x09, 0x1a, 0xe3, 0xb4, 0x1e, 0x98, 0x8b, 0xce, 0xe1, 0x73, 0xf2, 0x5e, 0xa8, 0xe7, 0xa3, 0x66, 0xb1, 0x47, 0x61, 0x56, 0x70, 0x90, 0xb2, 0xe0, 0x39, 0x24, 0x7f, 0x02, 0x73, 0x65, 0x0d, 0x0f, 0x51, 0x93, 0x22, 0x82, 0x20, 0xd1, 0xdd, 0x4c, 0x3e, 0xe8, 0xf6, 0xe1, 0x16, 0x58, 0xaf, 0x1f, 0x03, 0xd5, 0x8b, 0x28, 0x2d, 0x19, 0x74, 0x28, 0xe5, 0xbc, 0x76, 0xb2, 0x0e, 0xb5, 0xb4, 0x69, 0x5b, 0xf4, 0x87, 0x5a, 0xd9, 0xcd, 0x9f, 0xf4, 0xe0, 0xfc, 0x92, 0xf2, 0x16, 0x34, 0x9a, 0xc7, 0x36, 0x62, 0xff, 0x47, 0x19, 0x11, 0x02, 0x45, 0x67, 0xfa, 0xec, 0x45, 0xf0, 0xaf, 0x5b, 0x85, 0x21, 0x10, 0x49, 0xcc, 0x1b, 0xeb, 0x60, 0x02, 0x89, 0x52, 0x06, 0xf7, 0x72, 0xeb, 0xd2, 0xf6, 0x69, 0x44, 0xe4, 0xbe, 0xc0, 0x46, 0x16, 0xf7, 0x61, 0x55, 0x0b, 0x15, 0x61, 0x37, 0x4a, 0x7e, 0x1e, 0xa5, 0xd3, 0xe7, 0xab, 0x13, 0xca, 0xab, 0x33, 0x13, 0x77, 0x25, 0x9e, 0x2e, 0xf1, 0xe2, 0x00, 0x9c, 0x17, 0x38, 0x65, 0xb1, 0x49, 0x34, 0xea, 0xd8, 0x28, 0x3d, 0x6f, 0xc3, 0x6d, 0xc6, 0x9e, 0xdc, 0xe3, 0x28, 0xae, 0xe4, 0xf2, 0x2b, 0x6e, 0x78, 0x0b, 0x78, 0x09, 0xdb, 0x76, 0x56, 0x98, 0x8e, 0x71, 0xb4, 0x09, 0x76, 0x72, 0xd0, 0xfe, 0x3a, 0x5c, 0x6f, 0x0f, 0x30, 0x68, 0xb5, 0x14, 0x84, 0x83, 0xfc, 0xd4, 0x65, 0x92, 0x35, 0xec, 0x32, 0xbd, 0xb7, 0x76, 0x5f, 0xa9, 0x51, 0x61, 0x54, 0x00, 0x69, 0x67, 0x2f, 0x74, 0x2c, 0x42, 0xf6, 0xed, 0x17, 0x0d, 0x40, 0x43, 0x68, 0xcf, 0x66, 0xb2, 0x98, 0x36, 0x99, 0x2a, 0x72, 0x69, 0xff, 0x4c, 0xa4, 0x71, 0x69, 0xf3, 0x62, 0xb5, 0x21, 0xac, 0x9f, 0x7c, 0x5e, 0x15, 0x95, 0xd4, 0xbb, 0xa1, 0x5b, 0xc8, 0x73, 0x9a, 0x1f, 0xdb, 0x57, 0x7e, 0x3e, 0x9e, 0x80, 0x99, 0xab, 0xb6, 0xd4, 0x9f, 0xf0, 0xaf, 0x95, 0x2b, 0xf6, 0x39, 0x41, 0xb1, 0x77, 0x53, 0x45, 0xc7, 0x66, 0x17, 0xa9, 0xce, 0xac, 0xd5, 0xa9, 0xcf, 0xc3, 0x9e, 0x51, 0xe0, 0x5b, 0x1a, 0x84, 0xbe, 0xcd, 0xc7, 0xa6, 0x56, 0x29, 0x05, 0x57, 0x3a, 0xfe, 0xf1, 0x6f, 0x3e, 0xc6, 0x02, 0x2b, 0xbe, 0xd9, 0xa8, 0xa3, 0x6e, 0x0e, 0xe1, 0x86, 0x3a, 0xdc, 0x9a, 0x81, 0x71, 0xd8, 0x1d, 0xb4, 0xd7, 0xf0, 0xd7, 0x20, 0x45, 0x41, 0x79, 0xe3, 0x1c, 0xe1, 0x80, 0xb4, 0xb1, 0x11, 0xab, 0x25, 0xdd, 0xb5, 0x4e, 0x75, 0x29, 0x40, 0xcf, 0x83, 0x81, 0xd8, 0x28, 0x07, 0x36, 0x9c, 0xa8, 0x9c, 0x77, 0x6d, 0x77, 0x5f, 0xc6, 0x70, 0xf3, 0x5a, 0x95, 0x04, 0x1f, 0x13, 0x1d, 0x14, 0xad, 0xa5, 0xb9, 0x9c, 0xcb, 0xdf, 0xda, 0xe1, 0x71, 0xb4, 0x08, 0x26, 0x2b, 0x4e, 0x44, 0xd7, 0x0d, 0x7c, 0xfb, 0xb9, 0x1a, 0xab, 0xb3, 0xab, 0x03, 0x01, 0xda, 0xb1, 0x99, 0x15, 0x23, 0x8e, 0xaa, 0x46, 0x3f, 0x93, 0x36, 0xb6, 0x94, 0x96, 0x0e, 0x6e, 0x92, 0x70, 0x3c, 0x27, 0xf8, 0x7e, 0x89, 0xfa, 0xcd, 0x2d, 0xa8, 0xf0, 0xb7, 0x81, 0x38, 0x54, 0xac, 0xca, 0xec, 0xc0, 0x3b, 0x51, 0x7f, 0x86, 0xb7, 0xa3, 0x03, 0x0c, 0x71, 0xf4, 0xa3, 0x8d, 0x4a, 0x73, 0x03, 0x81, 0xe8, 0x5c, 0x20, 0x39, 0x97, 0xbd, 0x1b, 0x05, 0xcc, 0xe0, 0x9d, 0x7e, 0x7b, 0x48, 0x7e, 0xdb, 0x39, 0xdf, 0xe6, 0xf2, 0xc4, 0x45, 0xf5, 0xe2, 0xc7, 0xb7, 0xe8, 0xb8, 0x1b, 0x50, 0xa3, 0xf5, 0xf4, 0xb1, 0x81, 0x60, 0xbd, 0x69, 0x20, 0x6e, 0x63, 0xa3, 0x80, 0xe6, 0x54, 0x4b, 0x57, 0x93, 0x9d, 0x9e, 0xa2, 0x6a, 0xb4, 0x43, 0x6b, 0x02, 0xdd, 0x1d, 0xa0, 0xec, 0xe3, 0xa1, 0x3c, 0x64, 0x4d, 0xec, 0xf4, 0x33, 0x37, 0x5e, 0x24, 0x1e, 0x96, 0x42, 0x89, 0x86, 0x0b, 0x47, 0x88, 0xf1, 0x8a, 0xa9, 0x30, 0xb3, 0x54, 0xc1, 0xa7, 0x1f, 0x88, 0xb5, 0xac, 0xf7, 0x70, 0xfc, 0x00, 0x14, 0xd7, 0xdc, 0x43, 0x4e, 0xbd, 0x20, 0x1f, 0x55, 0x63, 0xb3, 0x04, 0xff, 0x01, 0x83, 0xcb, 0x37, 0x6b, 0xf7, 0x18, 0x81, 0x0c, 0xf3, 0x95, 0x0e, 0xe2, 0x1e, 0x2b, 0x55, 0x69, 0xbe, 0x05, 0x66, 0xe0, 0x8e, 0x67, 0x90, 0xe6, 0xcf, 0xb9, 0x1b, 0xa3, 0x83, 0x17, 0x43, 0xdb, 0x06, 0xe7, 0x38, 0x38, 0x69, 0x08, 0x8f, 0x82, 0xc0, 0xa7, 0x33, 0xdf, 0xf4, 0x84, 0xe0, 0x43, 0xd2, 0x20, 0x0d, 0xcf, 0x15, 0x63, 0x67, 0xa9, 0xe1, 0xb3, 0x9d, 0xe5, 0x5c, 0x90, 0xc3, 0x11, 0xfc, 0x4d, 0x88, 0x3c, 0x5e, 0x26, 0x57, 0x15, 0x3e, 0xcd, 0xce, 0x7b, 0xd3, 0xfd, 0x2d, 0x5e, 0x0c, 0x9e, 0x48, 0x9b, 0xb9, 0x20, 0x0f, 0x7a, 0xce, 0x92, 0x86, 0xc8, 0x50, 0xef, 0xa5, 0xe8, 0x84, 0x9a, 0xb5, 0x2b, 0xa5, 0x0e, 0xdc, 0x2c, 0x2c, 0x47, 0x68, 0x2a, 0x1c, 0xb9, 0x3c, 0x91, 0x24, 0x60, 0x24, 0xe7, 0xfd, 0x22, 0x78, 0xcd, 0x64, 0x3e, 0x05, 0xb9, 0x4f, 0x28, 0x98, 0x4b, 0x83, 0x73, 0x81, 0x21, 0x00, 0xea, 0x33, 0x03, 0x7e, 0xe2, 0x6c, 0x22, 0xac, 0x71, 0xcc, 0x38, 0x6f, 0xdd, 0x93, 0xd0, 0xef, 0x27, 0x6e, 0xb8, 0xf9, 0x15, 0x60, 0xfe, 0x59, 0x76, 0xb7, 0x30, 0x65, 0xaf, 0xdd, 0xc7, 0x89, 0x06, 0x15, 0x89, 0x82, 0x49, 0x2a, 0xcb, 0x9a, 0xda, 0xbe, 0x98, 0x74, 0xa4, 0x38, 0x41, 0xd0, 0x8e, 0x37, 0x59, 0x00, 0x82, 0x12, 0xec, 0xe1, 0x98, 0x6a, 0x7e, 0xc8, 0x19, 0xee, 0xba, 0xd2, 0xb3, 0xf3, 0x66, 0x75, 0xc4, 0xf6, 0x35, 0x80, 0xc2, 0x39, 0x04, 0xc2, 0x78, 0xde, 0xd9, 0xa7, 0x19, 0x4e, 0xb8, 0xc0, 0xf1, 0xda, 0x29, 0x01, 0xee, 0xd1, 0xda, 0xa4, 0xb0, 0xdd, 0x1e, 0x15, 0x90, 0x0d, 0x0d, 0x86, 0xd3, 0xb4, 0xf2, 0xf4, 0x3b, 0x05, 0x67, 0x8c, 0x39, 0x6f, 0xfe, 0x4b, 0xa5, 0xa1, 0x21, 0x24, 0x0f, 0x81, 0xf4, 0x3c, 0x38, 0xff, 0xd6, 0x0d, 0x26, 0xb5, 0x3f, 0xd8, 0x2b, 0xcd, 0x77, 0xe2, 0xab, 0xd0, 0xa6, 0xa4, 0x70, 0xfb, 0x2a, 0x8a, 0xbe, 0x07, 0x4e, 0x91, 0x6f, 0x3b, 0x1e, 0xe8, 0x13, 0xfa, 0xd3, 0xd6, 0xf6, 0x74, 0x67, 0xc9, 0xb1, 0xf1, 0x7f, 0x9a, 0xe8, 0xae, 0x0c, 0x1f, 0xa8, 0xf9, 0xcc, 0x34, 0x39, 0x04, 0x96, 0x28, 0x6b, 0x5e, 0xa9, 0x11, 0x37, 0xe1, 0xf5, 0x53, 0x40, 0x17, 0x40, 0xea, 0x99, 0x81, 0x93, 0x99, 0x4c, 0x6a, 0x78, 0x4d, 0x54, 0x4c, 0x6a, 0x66, 0x93, 0xf3, 0xe8, 0x8f, 0x8e, 0xfa, 0xd7, 0x13, 0x0f, 0xe8, 0xcc, 0x46, 0x3c, 0x92, 0x1a, 0xb3, 0x66, 0x15, 0x3b, 0x9d, 0xab, 0x81, 0x34, 0x6f, 0xac, 0x15, 0x62, 0x44, 0xa3, 0x67, 0x50, 0xa9, 0x77, 0x1d, 0x1e, 0x0f, 0xac, 0xb4, 0xcb, 0xaf, 0x29, 0xbc, 0x36, 0xfb, 0xdb, 0x5c, 0x83, 0x4b, 0x35, 0xd5, 0x77, 0x59, 0x0e, 0x21, 0x46, 0x57, 0x21, 0xb6, 0x1a, 0x10, 0xcb, 0xc1, 0x7a, 0x7f, 0x58, 0xfd, 0xe7, 0xaa, 0x5b, 0xcb, 0xa4, 0xdd, 0x2c, 0x12, 0x2d, 0xd2, 0xf3, 0x62, 0xda, 0xe7, 0x4e, 0x57, 0x34, 0xcf, 0x76, 0xf7, 0x01, 0x2f, 0x7b, 0xa1, 0x65, 0x02, 0x98, 0xad, 0xe2, 0xa2, 0x60, 0xf0, 0xf6, 0xed, 0x98, 0xcc, 0xc3, 0x33, 0x4f, 0x19, 0xf7, 0xee, 0x85, 0xd4, 0x26, 0x2c, 0x22, 0xb8, 0x34, 0xe6, 0xfe, 0xce, 0xec, 0x4d, 0x96, 0x87, 0x58, 0x83, 0xd5, 0x36, 0x04, 0x6d, 0x52, 0x60, 0x65, 0x0e, 0x31, 0x59, 0x53, 0xb7, 0x12, 0x06, 0x6b, 0x0a, 0xf6, 0x45, 0x56, 0x5e, 0xaf, 0x86, 0x17, 0xbc, 0x1b, 0x10, 0xc8, 0x04, 0x63, 0xe6, 0xf2, 0xa9, 0x55, 0xe5, 0x00, 0x16, 0xc8, 0x7c, 0x0e, 0xa2, 0x1a, 0x60, 0x94, 0xf8, 0x75, 0x5e, 0x08, 0x67, 0xcd, 0x3a, 0x84, 0x45, 0x88, 0x71, 0x45, 0x82, 0x93, 0x01, 0xd0, 0x80, 0x12, 0x02, 0x2c, 0x55, 0xe2, 0x70, 0x0c, 0x05, 0xdf, 0xff, 0xa3, 0x8e, 0x57, 0x1f, 0xbe, 0x01, 0x6b, 0x98, 0x40, 0xde, 0x60, 0xdb, 0x18, 0xa3, 0xe6, 0xfc, 0x79, 0x4e, 0xac, 0x04, 0x99, 0x8c, 0xca, 0xb2, 0x32, 0xc9, 0x51, 0x7c, 0x6f, 0x97, 0xca, 0x42, 0x4c, 0xd4, 0x07, 0x2b, 0x0c, 0x19, 0x69, 0x32, 0x1c, 0x86, 0xa2, 0x57, 0x6d, 0xbd, 0x0c, 0x6c, 0xd7, 0xb4, 0x24, 0xff, 0x63, 0x88, 0xe8, 0xef, 0x2b, 0x66, 0x63, 0xa8, 0xea, 0x4b, 0x27, 0x02, 0xac, 0x5b, 0x01, 0xa8, 0xdf, 0x9f, 0x5b, 0x8a, 0xf0, 0xaf, 0x60, 0x9b, 0xe4, 0x90, 0xd0, 0x90, 0x92, 0x6c, 0x5b, 0x9a, 0x0c, 0x03, 0x9f, 0xd7, 0x5d, 0x28, 0xfa, 0x27, 0xcb, 0x1d, 0x6b, 0x2b, 0x43, 0x50, 0x6b, 0xca, 0xd5, 0x1b, 0x41, 0x35, 0x59, 0x28, 0x97, 0x56, 0x2f, 0xa8, 0x03, 0x9a, 0xd9, 0x91, 0xff, 0x17, 0x32, 0x0b, 0x28, 0x49, 0x11, 0x37, 0x07, 0x05, 0xb3, 0x21, 0x51, 0xf3, 0x08, 0x81, 0x7a, 0xc1, 0x5d, 0x37, 0x40, 0xa5, 0xe8, 0x31, 0xcf, 0x85, 0x01, 0x3f, 0xa6, 0xff, 0xa4, 0x06, 0xcb, 0x8a, 0x8b, 0xd8, 0x18, 0xa7, 0x90, 0xaf, 0x81, 0x36, 0x4d, 0xdf, 0x81, 0xd9, 0xd0, 0x63, 0x61, 0x9e, 0xc8, 0x33, 0x5a, 0xd5, 0xc9, 0xaa, 0x66, 0xcb, 0x56, 0x57, 0xc5, 0x06, 0x71, 0x68, 0xbf, 0xe0, 0x1a, 0x8e, 0xf7, 0x7a, 0x02, 0xa9, 0x62, 0x43, 0xc0, 0xe7, 0x31, 0x7d, 0x27, 0xfe, 0xc6, 0xd9, 0xd5, 0xb4, 0xee, 0x0d, 0x50, 0x8a, 0x2a, 0xf4, 0xac, 0x9b, 0x78, 0x10, 0x0d, 0xc9, 0xef, 0x01, 0x84, 0x34, 0xd4, 0x0e, 0x7a, 0xfb, 0xc9, 0x1c, 0x13, 0x4e, 0xd6, 0x44, 0xd1, 0xed, 0x3c, 0xf4, 0x04, 0x15, 0xd0, 0x7a, 0xbc, 0x0f, 0x5c, 0x2d, 0xa6, 0x42, 0xaa, 0xdf, 0xfc, 0xde, 0x35, 0xf4, 0x7b, 0x38, 0x7f, 0xe3, 0x99, 0x72, 0x5f, 0x07, 0x33, 0x9f, 0x71, 0x73, 0x02, 0x2f, 0x5a, 0xba, 0x5a, 0xd3, 0x21, 0x42, 0x56, 0xf4, 0x52, 0x7d, 0x2a, 0xe7, 0x00, 0x23, 0xea, 0x76, 0xea, 0x2e, 0xb4, 0x89, 0xc5, 0x5a, 0x0d, 0x69, 0xa0, 0x0b, 0xad, 0x8e, 0xd5, 0x20, 0x23, 0x2d, 0xb0, 0xf8, 0x8e, 0xa2, 0x78, 0xc3, 0xea, 0xd4, 0x48, 0x4d, 0x66, 0x88, 0x83, 0xc1, 0xa6, 0x9f, 0xf7, 0x6d, 0x3d, 0x44, 0xce, 0x22, 0x4d, 0x4a, 0x43, 0xcd, 0x81, 0xa1, 0x06, 0xa9, 0x32, 0xfc, 0x47, 0x0c, 0x41, 0x5c, 0xa1, 0x74, 0x0e, 0x36, 0xd5, 0x9c, 0x93, 0x23, 0x0a, 0xdb, 0x15, 0x33, 0x6c, 0xa3, 0xa1, 0xa1, 0xf6, 0x7a, 0xbc, 0xe9, 0xa3, 0x5e, 0x83, 0x0a, 0xa1, 0x9a, 0xd7, 0xb5, 0x70, 0x78, 0xc5, 0xb1, 0xdf, 0x94, 0xf6, 0x16, 0xa4, 0x5e, 0xe6, 0x4b, 0xa6, 0x2e, 0x89, 0x7f, 0xb2, 0xde, 0x40, 0x50, 0x39, 0x8e, 0xf5, 0x52, 0x80, 0xbe, 0x56, 0x8f, 0x5e, 0x3e, 0xd0, 0x91, 0x82, 0x73, 0xf7, 0x9a, 0xe9, 0xef, 0x2a, 0x70, 0xe1, 0x5d, 0xbf, 0xf8, 0xca, 0x05, 0x0c, 0x20, 0xd8, 0xf9, 0xb7, 0x1f, 0xf9, 0xdf, 0xc8, 0x38, 0xd2, 0x21, 0x77, 0xd8, 0x2e, 0x6b, 0xda, 0x11, 0x7d, 0x01, 0xfa, 0x5d, 0x95, 0x44, 0x86, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x02, 0xe4, 0x61, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xe0, 0x07, 0xec, 0x81, 0x00, 0x00, 0xc4, 0x7a, 0x33, 0xf0, 0xf1, 0x4a, 0x5d, 0x7b, 0xe7, 0x1a, 0x12, 0xf2, 0x08, 0x12, 0xe6, 0x62, 0x45, 0x6b, 0x2e, 0x93, 0x7b, 0x50, 0x92, 0x1f, 0x9a, 0x78, 0x3c, 0x07, 0x79, 0xb9, 0x82, 0x19, 0xd8, 0x11, 0xfe, 0x50, 0x92, 0x8d, 0x73, 0x56, 0xea, 0xc3, 0x5c, 0xa3, 0x91, 0x81, 0x82, 0x45, 0xc7, 0x40, 0x35, 0xcf, 0xe3, 0x65, 0xa3, 0xbc, 0xf5, 0xe2, 0xc6, 0xc2, 0x05, 0xc0, 0xe3, 0x4d, 0x44, 0xc5, 0xa3, 0xd7, 0xea, 0x96, 0x0f, 0x34, 0xb2, 0x87, 0x35, 0xaa, 0x76, 0xb8, 0xe3, 0x3e, 0x97, 0x71, 0x5f, 0xbc, 0xc8, 0x27, 0x9e, 0x78, 0xbd, 0x1c, 0x0f, 0x04, 0x19, 0x0f, 0x1e, 0x42, 0x25, 0x98, 0xea, 0x68, 0x09, 0x1c, 0x6a, 0xb9, 0xb6, 0xe2, 0xec, 0x1d, 0x7d, 0xf7, 0xca, 0x9f, 0x24, 0xe1, 0x97, 0x2b, 0xb5, 0x1e, 0xc8, 0x2e, 0x8f, 0x98, 0x5f, 0xc2, 0x32, 0xe0, 0x39, 0xc7, 0xd9, 0xf9, 0x8d, 0x58, 0xae, 0xb5, 0x2e, 0xee, 0xda, 0xf7, 0x85, 0x28, 0x9b, 0x49, 0xb9, 0xd4, 0x62, 0x72, 0x54, 0x9a, 0xac, 0x78, 0x42, 0x58, 0xdd, 0x00, 0x42, 0x77, 0xd1, 0xc0, 0xdc, 0xc2, 0xdd, 0xe8, 0x43, 0x35, 0x5a, 0x69, 0xa8, 0x58, 0xe0, 0xe1, 0x11, 0xe7, 0x8a, 0xa8, 0x37, 0x4a, 0xbd, 0x79, 0x03, 0x17, 0x9e, 0xd8, 0xa5, 0x3f, 0x0d, 0x7e, 0x78, 0xf8, 0xa2, 0x50, 0x40, 0x82, 0x34, 0xf2, 0x95, 0x89, 0x72, 0x61, 0xd3, 0x2b, 0x33, 0x25, 0x90, 0x7f, 0xba, 0x74, 0xde, 0xed, 0x69, 0x71, 0x01, 0xad, 0x0a, 0x9b, 0x89, 0x03, 0xcc, 0x2a, 0x87, 0xfb, 0x55, 0x5c, 0xc3, 0xce, 0xd9, 0x3b, 0x59, 0x26, 0xa3, 0x57, 0x00, 0xb2, 0x81, 0x90, 0x26, 0x2f, 0x24, 0x8b, 0x83, 0xa7, 0x85, 0x76, 0xb8, 0xcd, 0xe1, 0x5c, 0xd4, 0xac, 0x38, 0x78, 0x19, 0x9a, 0xff, 0x3b, 0xa5, 0x68, 0x2c, 0x04, 0xed, 0xfd, 0x11, 0x28, 0xda, 0xdc, 0xf3, 0xf9, 0x43, 0x06, 0x8b, 0x76, 0xb4, 0xd2, 0xaf, 0xb2, 0x4f, 0x52, 0xa9, 0x40, 0xaf, 0x53, 0x1c, 0xac, 0xdb, 0x51, 0x82, 0xda, 0x7b, 0xba, 0x11, 0xef, 0x4f, 0xa3, 0x9c, 0x71, 0x7c, 0xd8, 0x9c, 0x22, 0x5c, 0x1f, 0x21, 0xbf, 0x42, 0xce, 0xce, 0x4b, 0x2a, 0xdb, 0x37, 0xaa, 0x6d, 0x71, 0x75, 0xf2, 0x84, 0x39, 0x3f, 0xac, 0x2e, 0xcd, 0xa2, 0x8e, 0xde, 0x90, 0x0d, 0xcb, 0x3c, 0x7b, 0x40, 0xa9, 0xc8, 0x2c, 0x1f, 0x45, 0x77, 0x04, 0xef, 0x7d, 0xfd, 0x42, 0x37, 0x06, 0x22, 0xc7, 0x13, 0x55, 0x17, 0x0b, 0xd7, 0xeb, 0xea, 0x29, 0x6e, 0x83, 0xa8, 0x09, 0xc8, 0x97, 0x27, 0x11, 0x4a, 0xd0, 0x92, 0xcf, 0x96, 0xf7, 0x38, 0x0f, 0x05, 0xe4, 0xe2, 0x8f, 0xc5, 0x4e, 0x26, 0xf6, 0x97, 0xf0, 0x49, 0x47, 0xe6, 0xf6, 0x38, 0x47, 0xc4, 0xf8, 0x33, 0x6b, 0x78, 0xca, 0x83, 0x4d, 0xbc, 0xaf, 0xf2, 0x08, 0xde, 0x9d, 0xcf, 0xb4, 0xe3, 0xc1, 0x8b, 0x17, 0x37, 0x3e, 0x08, 0x9f, 0x9b, 0x8b, 0xc7, 0x07, 0x84, 0x26, 0x04, 0xb6, 0x9d, 0x3d, 0x43, 0x7a, 0xf1, 0x4a, 0x92, 0xec, 0x21, 0xcc, 0x0c, 0xe5, 0x77, 0x29, 0xf1, 0x68, 0xd6, 0x5d, 0x19, 0x3f, 0x4f, 0xa3, 0x4c, 0x66, 0x60, 0x8f, 0xf4, 0x6e, 0x66, 0x87, 0xdd, 0x75, 0x80, 0x95, 0x77, 0xf1, 0xb7, 0x95, 0x82, 0xc1, 0xab, 0x3d, 0xa0, 0x65, 0xbb, 0xc3, 0xeb, 0xa2, 0x84, 0xa6, 0x6e, 0x4a, 0xf5, 0x52, 0x92, 0x35, 0x7b, 0xb1, 0x7d, 0xb0, 0x28, 0x34, 0xa1, 0x4e, 0x91, 0xcf, 0x9d, 0xea, 0x5c, 0x4e, 0xa5, 0xa8, 0xe1, 0x80, 0x35, 0x33, 0x0c, 0x15, 0x9a, 0x6a, 0xf3, 0x28, 0x14, 0x4d, 0x31, 0x52, 0x62, 0x70, 0x89, 0x8a, 0x78, 0x7a, 0x99, 0xa8, 0x64, 0x33, 0x24, 0xb5, 0xe1, 0x51, 0x78, 0x05, 0xb4, 0x27, 0xb4, 0xec, 0xe6, 0x53, 0x4d, 0x1f, 0x3b, 0x41, 0xb5, 0x04, 0x49, 0xe6, 0x1e, 0x1b, 0x2a, 0x7b, 0x88, 0x46, 0xf7, 0xc2, 0x57, 0xa2, 0x6a, 0x8b, 0xca, 0x95, 0x56, 0xf9, 0xf1, 0x27, 0x96, 0x57, 0xf1, 0x30, 0x41, 0x5e, 0x8e, 0x95, 0x5b, 0xc8, 0xd2, 0xbd, 0xe7, 0x2b, 0x39, 0x0a, 0xf3, 0xd9, 0xd0, 0xb0, 0xd7, 0x98, 0x24, 0xf5, 0xeb, 0x1d, 0xde, 0x1c, 0x89, 0xb9, 0x39, 0x0c, 0xd0, 0x54, 0xc8, 0xc2, 0x9d, 0x6c, 0x58, 0xb5, 0xcc, 0xc9, 0xfb, 0x43, 0x82, 0x70, 0x87, 0xe5, 0xae, 0xb3, 0x84, 0x21, 0x1e, 0x16, 0xce, 0xb2, 0xed, 0x08, 0xee, 0xee, 0xd1, 0x97, 0x8d, 0xd7, 0x27, 0x20, 0xe9, 0x61, 0x8d, 0x7a, 0x7e, 0xc8, 0x4c, 0xa8, 0x91, 0xfc, 0x7e, 0x8b, 0x44, 0xa1, 0xdd, 0x87, 0x61, 0x39, 0xc6, 0x85, 0x5d, 0xff, 0x32, 0x65, 0x23, 0x46, 0x8b, 0xe6, 0xaa, 0x62, 0x7c, 0x71, 0xca, 0x6e, 0xf5, 0xeb, 0xde, 0xb8, 0x98, 0x1f, 0x21, 0x6b, 0xe2, 0xe4, 0x1b, 0x2c, 0x25, 0x4b, 0x07, 0xae, 0x2d, 0x32, 0xf2, 0x53, 0x24, 0x11, 0xd5, 0xfd, 0x52, 0x49, 0x56, 0x6e, 0x60, 0xd0, 0x17, 0x3a, 0xa4, 0x5c, 0xda, 0x12, 0x49, 0x7c, 0x0d, 0xed, 0x0f, 0xce, 0xc0, 0x42, 0x01, 0xe9, 0x12, 0x13, 0x06, 0x62, 0x36, 0x69, 0x8a, 0xca, 0xdf, 0xda, 0x1a, 0xac, 0xc1, 0x4b, 0x12, 0xb2, 0xbd, 0xbd, 0x75, 0x60, 0x64, 0x83, 0x7d, 0xfb, 0x4c, 0xad, 0xad, 0x03, 0x7b, 0x01, 0x3e, 0x27, 0x26, 0x30, 0xb3, 0x22, 0x27, 0x44, 0x95, 0xe6, 0x82, 0xd0, 0xcd, 0x49, 0xfd, 0x6e, 0x0b, 0x8b, 0x24, 0xd7, 0x14, 0xf4, 0xc2, 0xf3, 0xb1, 0x2d, 0x66, 0xa6, 0x51, 0x4e, 0x12, 0xd6, 0x4f, 0x7e, 0xa8, 0x4d, 0x73, 0x5d, 0x9d, 0xe9, 0x29, 0xfe, 0xc2, 0xcb, 0x83, 0x1a, 0x03, 0x19, 0x91, 0xd8, 0x3d, 0x88, 0x5e, 0x35, 0xb9, 0x9a, 0x96, 0x0b, 0x3d, 0x3a, 0x1a, 0xc9, 0xa9, 0x03, 0x61, 0x18, 0xfd, 0xcf, 0x5c, 0x1c, 0x6d, 0xa5, 0x59, 0xe0, 0xcf, 0x1a, 0x08, 0x5a, 0xbf, 0xd7, 0x7d, 0x55, 0xc9, 0xd9, 0x50, 0x72, 0x2b, 0xad, 0xc6, 0xc5, 0x05, 0xb4, 0xad, 0x06, 0xf7, 0xda, 0xb0, 0xc0, 0xa2, 0x9b, 0xc2, 0xfd, 0xf9, 0x4a, 0xdf, 0x3f, 0x67, 0xde, 0x18, 0x2f, 0xe5, 0xc9, 0x62, 0x26, 0x5e, 0x69, 0xf4, 0x1b, 0x1d, 0x74, 0xa2, 0xcb, 0x9f, 0xde, 0xa8, 0xbb, 0xa9, 0xaa, 0xe5, 0xa8, 0x80, 0x5b, 0x16, 0x60, 0xaf, 0xe8, 0xee, 0x21, 0x5c, 0x17, 0x61, 0xa2, 0x1b, 0x1e, 0x63, 0xc7, 0x01, 0x71, 0x4c, 0x73, 0xd8, 0xed, 0x74, 0xf8, 0xa5, 0x3e, 0x8c, 0xec, 0x6e, 0xd5, 0x54, 0xb6, 0x59, 0x91, 0xf9, 0x28, 0xb8, 0xb4, 0x50, 0x28, 0x1c, 0xf9, 0x5e, 0x0e, 0x60, 0x1b, 0xb4, 0x9d, 0xad, 0x1e, 0x6e, 0xa3, 0x8e, 0xfd, 0xfb, 0x4e, 0x28, 0xd2, 0x3f, 0x51, 0x5f, 0xc0, 0xb4, 0x52, 0xa1, 0x29, 0xf1, 0x25, 0xa0, 0x84, 0x14, 0xc9, 0x87, 0xc7, 0xda, 0xc1, 0xad, 0x5c, 0xf8, 0x9c, 0x53, 0x11, 0xa8, 0x76, 0xba, 0xeb, 0x50, 0x33, 0x66, 0xf5, 0xab, 0xdc, 0xb8, 0xab, 0x57, 0x57, 0x5d, 0xc9, 0x54, 0x8a, 0x9f, 0x97, 0x3b, 0x51, 0x07, 0xdb, 0xc6, 0xa8, 0xaf, 0x6c, 0x86, 0x16, 0x04, 0x0f, 0x48, 0x97, 0xa9, 0xab, 0x17, 0x8b, 0x08, 0x35, 0xc7, 0xba, 0x6a, 0xa9, 0xe0, 0xed, 0x58, 0x80, 0x24, 0xe8, 0x37, 0xb3, 0x04, 0x8f, 0x96, 0xa0, 0x57, 0x63, 0xfb, 0xe3, 0x47, 0xd5, 0x42, 0x98, 0x6a, 0xda, 0x20, 0xef, 0xa1, 0xfb, 0x0c, 0xcb, 0x97, 0x86, 0xe6, 0x17, 0x0f, 0xda, 0x30, 0x0c, 0x79, 0xd2, 0xec, 0x51, 0x7d, 0x3f, 0x6b, 0x52, 0x62, 0x23, 0xbf, 0x73, 0x00, 0xa4, 0x00, 0xb4, 0x8a, 0xd5, 0x42, 0x88, 0x36, 0x86, 0x86, 0xb6, 0x6f, 0xbe, 0x69, 0x16, 0x65, 0x7d, 0x3d, 0x33, 0x34, 0xa0, 0x06, 0x4f, 0xa8, 0x6d, 0xd7, 0x96, 0xb5, 0x98, 0xd3, 0xe6, 0xda, 0xb8, 0xd1, 0x7e, 0x4f, 0x2c, 0x97, 0xa7, 0x2e, 0xf2, 0x08, 0xc7, 0xac, 0x32, 0x67, 0x45, 0xbf, 0x47, 0xb7, 0xe1, 0x55, 0x3a, 0x07, 0x0c, 0xb8, 0xb4, 0x51, 0x00, 0xfd, 0x81, 0x33, 0x4a, 0xb8, 0xde, 0x16, 0x38, 0xfd, 0x74, 0x4f, 0x3d, 0xad, 0xf5, 0x0f, 0x5f, 0x0c, 0x53, 0xd2, 0x0b, 0xa5, 0x49, 0xb6, 0xd0, 0x6e, 0x88, 0x0f, 0x0e, 0x9b, 0x4d, 0x26, 0xf3, 0xff, 0x59, 0x95, 0x93, 0x69, 0x85, 0xc2, 0xf5, 0x41, 0xc8, 0x35, 0x5c, 0x31, 0x02, 0xd8, 0x6c, 0x0c, 0x8e, 0xae, 0xb7, 0x54, 0x3c, 0x29, 0xa3, 0xae, 0x58, 0x70, 0xe6, 0x4c, 0xf7, 0x61, 0xdd, 0xc6, 0x25, 0xd4, 0xb0, 0x37, 0x37, 0xb5, 0xff, 0x27, 0x58, 0x08, 0xae, 0x79, 0x1b, 0xc5, 0xf5, 0x28, 0x8a, 0x37, 0x15, 0x40, 0x95, 0x6f, 0x5a, 0x6e, 0x3f, 0x94, 0xf3, 0xfc, 0x09, 0x3d, 0xfd, 0x40, 0xc8, 0x21, 0xd4, 0x37, 0x4b, 0x89, 0xf3, 0x81, 0x6d, 0xf5, 0xa1, 0x96, 0x68, 0xa3, 0xbf, 0xb6, 0x8e, 0xd2, 0xba, 0x4f, 0x1c, 0x91, 0x8d, 0x07, 0xa5, 0x05, 0xb7, 0x20, 0x9f, 0xe3, 0x88, 0x92, 0x62, 0xc9, 0x73, 0xed, 0x43, 0x3f, 0x9d, 0x59, 0x5b, 0xd8, 0xd5, 0x3d, 0x62, 0xde, 0x56, 0x3d, 0x63, 0x85, 0x7d, 0x58, 0x90, 0xd2, 0xb9, 0x70, 0xad, 0x13, 0xf3, 0xde, 0xc9, 0x5c, 0xd1, 0x89, 0x04, 0x50, 0x05, 0xf7, 0xf2, 0xbe, 0x1c, 0x6d, 0xa9, 0x04, 0x7d, 0x0e, 0xcf, 0x17, 0x51, 0x57, 0xbc, 0x0a, 0xc6, 0xa7, 0x0f, 0x9e, 0xbb, 0x88, 0xa8, 0x7a, 0xa9, 0x8c, 0x42, 0xb9, 0x19, 0x89, 0xee, 0x62, 0xda, 0x10, 0xd9, 0x90, 0xc9, 0x66, 0x23, 0x45, 0x36, 0xc9, 0x25, 0xb4, 0x45, 0x30, 0x9b, 0x34, 0x81, 0xa5, 0x70, 0xfc, 0xc3, 0xed, 0xb5, 0xfa, 0xf3, 0xeb, 0xfe, 0xc8, 0x49, 0xc7, 0x9c, 0x05, 0x23, 0x7f, 0x4c, 0x9f, 0x5a, 0xf8, 0x71, 0xce, 0xc0, 0xe1, 0xb6, 0x6f, 0x8e, 0xfd, 0xd5, 0x20, 0xbf, 0x18, 0x1e, 0x5a, 0x47, 0x29, 0xc5, 0x61, 0x89, 0x9b, 0x97, 0x4c, 0x2e, 0x88, 0x33, 0xf5, 0xcb, 0x08, 0xe4, 0x6a, 0x10, 0x3b, 0x22, 0x32, 0x2b, 0x8f, 0x52, 0x7b, 0xa2, 0xe7, 0x50, 0xb9, 0x39, 0x77, 0x63, 0x2f, 0x78, 0x91, 0x56, 0x03, 0xb3, 0x69, 0x2e, 0xbb, 0x71, 0x00, 0xc2, 0x53, 0x11, 0xdb, 0x3f, 0xc6, 0x49, 0x4c, 0xdc, 0xb0, 0x02, 0x36, 0x12, 0x05, 0x6b, 0x50, 0x5c, 0xa6, 0xad, 0x7f, 0xd6, 0x5b, 0xd3, 0x39, 0xe6, 0x9a, 0xd1, 0xbc, 0x75, 0xd3, 0x0a, 0xbc, 0x9a, 0x2e, 0x95, 0x2a, 0xa0, 0xc0, 0x33, 0x83, 0x4a, 0x5e, 0x10, 0x9a, 0x03, 0x99, 0xbc, 0xec, 0x71, 0xcb, 0xb7, 0xed, 0xbd, 0xd7, 0xa3, 0xa7, 0xfa, 0xa5, 0xb5, 0xf5, 0x1a, 0xd8, 0xed, 0x9f, 0x2b, 0xcc, 0x75, 0x7c, 0x7d, 0x4e, 0x1a, 0xcc, 0x6e, 0x21, 0xa6, 0x00, 0x51, 0xee, 0xf4, 0xf2, 0x01, 0xcd, 0x6a, 0x35, 0x3f, 0x43, 0xa5, 0xf7, 0x43, 0x86, 0xbb, 0x0f, 0xbd, 0x96, 0x6c, 0x26, 0x1f, 0x6f, 0xc2, 0xaa, 0x20, 0x9e, 0x81, 0x9c, 0x53, 0x57, 0xce, 0xf7, 0x33, 0x4e, 0xe7, 0x12, 0xe9, 0xeb, 0x56, 0x14, 0x22, 0x0a, 0x29, 0xe8, 0xf6, 0x45, 0x01, 0x4b, 0x40, 0xab, 0x83, 0x31, 0x33, 0x87, 0xb6, 0xa2, 0x57, 0xa8, 0xa7, 0x3a, 0x2a, 0xd2, 0x35, 0xe1, 0x69, 0x94, 0xde, 0x75, 0xdb, 0x8d, 0x1e, 0x34, 0x78, 0x79, 0x07, 0x93, 0xea, 0x7b, 0x20, 0x14, 0xf8, 0xba, 0x5f, 0xb1, 0xbc, 0x15, 0x7f, 0xa6, 0x42, 0x04, 0x9d, 0xfe, 0x8c, 0xd2, 0x22, 0xe8, 0x39, 0x1f, 0x8a, 0x44, 0xcf, 0x8e, 0x58, 0x19, 0x33, 0x4b, 0xc8, 0x44, 0x20, 0x40, 0xba, 0x57, 0x3c, 0xd0, 0x55, 0xb2, 0x73, 0xea, 0x95, 0x32, 0x3d, 0xb1, 0xae, 0xe0, 0xb0, 0x04, 0xe9, 0x74, 0xff, 0xcb, 0xba, 0xe1, 0xed, 0x6d, 0x35, 0x10, 0xaf, 0x3e, 0xc3, 0xca, 0xbb, 0x6b, 0xdc, 0xfe, 0x65, 0x81, 0xa1, 0x2e, 0x1a, 0x5e, 0x15, 0x3e, 0xe8, 0x56, 0x8f, 0x90, 0x6b, 0xd8, 0x1a, 0xae, 0x2a, 0xc2, 0xbd, 0xff, 0xb5, 0xf2, 0x36, 0xd0, 0x2d, 0x0d, 0x1e, 0x4f, 0x0c, 0xa6, 0xcc, 0x5d, 0x57, 0xac, 0x1e, 0x8f, 0x92, 0x0f, 0x7c, 0x04, 0xeb, 0x79, 0x54, 0x41, 0x6f, 0x2c, 0x9c, 0xeb, 0x56, 0x8b, 0x19, 0x5f, 0x7b, 0x79, 0xa1, 0xff, 0x68, 0xe2, 0xe3, 0x3e, 0x0d, 0x75, 0xe3, 0x92, 0x54, 0x06, 0x57, 0x25, 0x52, 0x9e, 0x0a, 0xb9, 0xdf, 0x88, 0x19, 0x85, 0x1a, 0x81, 0xb9, 0x3f, 0x3d, 0x42, 0x59, 0x7c, 0xb5, 0x74, 0xd8, 0xfa, 0x29, 0x96, 0x66, 0x7e, 0xf6, 0xad, 0x49, 0x93, 0x38, 0x17, 0x3c, 0x3f, 0x73, 0xb0, 0x33, 0x70, 0x5c, 0xee, 0x8d, 0xbc, 0xf1, 0x74, 0x45, 0x7f, 0x46, 0xa2, 0x91, 0x1a, 0xab, 0x00, 0x34, 0x3c, 0xb9, 0x25, 0xc3, 0x5c, 0x76, 0x07, 0xd5, 0xb4, 0x8b, 0x2d, 0xf0, 0x6b, 0xa8, 0x11, 0x77, 0xa9, 0xc6, 0xf8, 0x6c, 0x75, 0x57, 0xaa, 0xd4, 0x94, 0x9d, 0x7e, 0xb8, 0xfa, 0x5b, 0xee, 0xb7, 0xaa, 0x47, 0x6e, 0x28, 0x30, 0xb4, 0x84, 0x52, 0x49, 0x8c, 0x39, 0x41, 0x07, 0x5c, 0x24, 0x4f, 0xe4, 0x5e, 0xab, 0xfa, 0x69, 0xcd, 0x90, 0x6c, 0x81, 0x55, 0x62, 0x23, 0x3b, 0x81, 0x76, 0x14, 0x3c, 0x3e, 0x56, 0x89, 0x19, 0x30, 0xa2, 0x2f, 0x34, 0x23, 0x3a, 0x07, 0xf2, 0x6b, 0x9f, 0x03, 0x62, 0x47, 0x97, 0x5a, 0xc4, 0xda, 0x3d, 0xaa, 0x79, 0x35, 0x03, 0x41, 0xf9, 0x7d, 0x61, 0xd5, 0x2b, 0x23, 0xc0, 0xb1, 0x72, 0xfe, 0x2a, 0x38, 0x93, 0x32, 0x8a, 0xe1, 0x87, 0xaf, 0xb2, 0x0c, 0xaf, 0xf3, 0x98, 0xf3, 0x01, 0x00, 0x7b, 0x12, 0x48, 0x48, 0x72, 0xfc, 0xc8, 0xcf, 0xc1, 0xf9, 0x88, 0x87, 0x92, 0x22, 0x3b, 0x4b, 0xf8, 0x67, 0x1d, 0xb5, 0x5f, 0x87, 0x0a, 0x57, 0x9c, 0x7e, 0x91, 0x4f, 0xac, 0xc8, 0x1b, 0xc5, 0x1e, 0xba, 0xb8, 0xb4, 0x4c, 0x4b, 0x46, 0x7f, 0x18, 0xb6, 0x09, 0x4f, 0x43, 0xb8, 0x87, 0xd3, 0x4f, 0x51, 0xef, 0x50, 0xcc, 0xa0, 0x7f, 0x30, 0xbd, 0xcd, 0x80, 0x80, 0x96, 0x13, 0xf8, 0x95, 0xc4, 0xeb, 0xb3, 0xca, 0x60, 0x99, 0xc0, 0x76, 0x44, 0x51, 0x9a, 0x20, 0xef, 0x54, 0x8d, 0xeb, 0xea, 0xd1, 0xb6, 0x55, 0xc4, 0x4e, 0xfd, 0x9f, 0xf9, 0x6e, 0xe1, 0xbd, 0xbc, 0x6e, 0x6f, 0x9b, 0x24, 0x36, 0xaf, 0x23, 0x27, 0x39, 0xf6, 0x4a, 0xf3, 0xde, 0x58, 0x9d, 0xcb, 0xea, 0xcf, 0x63, 0xdf, 0xbe, 0xe2, 0x02, 0x4d, 0x51, 0xed, 0x06, 0x83, 0xb3, 0xee, 0x06, 0x2f, 0xb1, 0xb1, 0x46, 0x55, 0x61, 0xdf, 0xa8, 0xcb, 0x77, 0x3a, 0x81, 0xac, 0x27, 0x53, 0xd8, 0xaa, 0xbe, 0xae, 0xab, 0x16, 0xe6, 0x85, 0xda, 0xec, 0xc0, 0xa3, 0xdd, 0x60, 0xcf, 0x96, 0x2f, 0x10, 0xb8, 0x6b, 0x8d, 0x81, 0x34, 0x74, 0x9b, 0xc7, 0x37, 0xde, 0x1c, 0x04, 0x41, 0xd5, 0x26, 0x8e, 0xfb, 0x38, 0x7e, 0x72, 0xe3, 0x7a, 0xf8, 0x68, 0x8b, 0x81, 0x1e, 0xd3, 0x00, 0x00, 0x01, 0x09 }; +constexpr AccessUnit AVC_LARGE_AU_EXPECTED_AU = { 0x15f90, 0x159b2, true, 0, {}, { 0x59, 0x01, 0x7a, 0x65, 0x04, 0xcc, 0xfb, 0xf8, 0x14, 0x0a, 0x82, 0xb6, 0xa0, 0xb8, 0xe9, 0x55, 0x47, 0x35, 0x9c, 0x90 } }; + +const std::vector M2V_LARGE_AU_STREAM = { 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xe0, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x00, 0x00, 0x01, 0xb3, 0xad, 0x05, 0x26, 0xaa, 0xe6, 0x35, 0x3c, 0xd3, 0x39, 0xd0, 0x8e, 0x3e, 0x56, 0x34, 0x97, 0x50, 0xf0, 0x75, 0x62, 0x8f, 0x4f, 0x2e, 0x75, 0x9c, 0x56, 0xc5, 0xcb, 0x1f, 0xa9, 0x84, 0xd5, 0xe2, 0x85, 0xec, 0xcf, 0x29, 0xcc, 0xbd, 0xc6, 0x77, 0xff, 0x7d, 0x1b, 0xec, 0x2c, 0x85, 0x65, 0x1f, 0xeb, 0x71, 0x26, 0x0d, 0x71, 0x01, 0x09, 0x7a, 0xb2, 0xed, 0x0b, 0x50, 0x39, 0x71, 0x96, 0xc9, 0x38, 0x98, 0x7b, 0x43, 0x4c, 0xa1, 0x7f, 0xac, 0xe2, 0x26, 0x30, 0xfc, 0xc0, 0x89, 0xb2, 0x6b, 0x09, 0xbf, 0x39, 0x02, 0x2f, 0x9f, 0x40, 0x3d, 0x17, 0xd3, 0x29, 0x03, 0xa4, 0x28, 0x30, 0x55, 0xa9, 0x36, 0x87, 0x10, 0xf3, 0x31, 0x88, 0x89, 0xda, 0x33, 0x88, 0x04, 0x49, 0x00, 0x81, 0x49, 0x5c, 0xe3, 0x8c, 0x83, 0x11, 0xc0, 0x84, 0xcd, 0xb5, 0x95, 0x29, 0x91, 0x83, 0x4b, 0xc8, 0x50, 0xf4, 0x5d, 0xb5, 0xeb, 0x28, 0xdc, 0x3a, 0x79, 0x68, 0x6e, 0x2b, 0x78, 0x06, 0x67, 0x83, 0x3b, 0x10, 0x7e, 0xba, 0x58, 0x72, 0x06, 0xce, 0x41, 0xed, 0xe1, 0xb7, 0x4d, 0x0e, 0x3d, 0x4a, 0xc2, 0x0b, 0xb7, 0xb1, 0x3b, 0x9a, 0x23, 0x6e, 0x1c, 0xaf, 0x02, 0xfa, 0x73, 0x0d, 0x58, 0x15, 0x33, 0x4f, 0x2f, 0x6b, 0x91, 0x82, 0x1a, 0x8d, 0xb6, 0xc2, 0x44, 0x96, 0x08, 0x9e, 0x69, 0x53, 0xb1, 0x5b, 0x2d, 0x3d, 0xa4, 0xac, 0xac, 0xf1, 0x54, 0xb3, 0xfe, 0x6a, 0x21, 0x67, 0x19, 0xfa, 0x37, 0x99, 0x41, 0x08, 0x81, 0xf6, 0xac, 0x12, 0x1d, 0x98, 0xef, 0x7a, 0x4b, 0xcc, 0xb2, 0xea, 0xdb, 0x08, 0x5e, 0xad, 0x02, 0xe6, 0x6e, 0x83, 0x10, 0x12, 0x3b, 0x7e, 0xc7, 0xdc, 0xc0, 0xd7, 0x26, 0x48, 0x6a, 0x66, 0x01, 0x11, 0x35, 0xc3, 0x4a, 0xce, 0xd6, 0x03, 0xe7, 0x29, 0x6a, 0x22, 0x3a, 0x8e, 0x55, 0x8c, 0x8a, 0xc8, 0xad, 0x3b, 0x22, 0xb9, 0xfa, 0xc1, 0x05, 0x4e, 0xd2, 0x9e, 0x84, 0xdf, 0x6f, 0xec, 0x2a, 0x75, 0x9b, 0x7f, 0xcc, 0x3b, 0xeb, 0x59, 0xb9, 0xf3, 0x02, 0x99, 0x50, 0x79, 0x41, 0x1e, 0x58, 0x8b, 0x6c, 0x39, 0x08, 0xce, 0x90, 0xb6, 0x5c, 0x59, 0x2c, 0x0b, 0xd2, 0xa0, 0xae, 0x47, 0xa9, 0x01, 0x81, 0xe4, 0xda, 0x5c, 0xdb, 0x68, 0xac, 0xda, 0xa5, 0xcf, 0xfe, 0x71, 0xed, 0xab, 0x00, 0x4a, 0xcf, 0x62, 0x95, 0xce, 0x74, 0xf4, 0x48, 0x18, 0xab, 0x00, 0xe2, 0x43, 0x5a, 0x9f, 0xff, 0x03, 0xdd, 0xd5, 0xd3, 0xd4, 0x22, 0xcb, 0x83, 0x9d, 0x25, 0xc0, 0x43, 0x1f, 0x3d, 0xfa, 0x0c, 0x39, 0x89, 0x33, 0x4f, 0x6c, 0xdd, 0x40, 0x8e, 0xb8, 0x4d, 0x75, 0x38, 0x3d, 0x1e, 0x6c, 0x0a, 0x8f, 0xd4, 0x07, 0x71, 0xcf, 0x8b, 0xa8, 0x65, 0x4a, 0xb4, 0xc9, 0x9f, 0x4a, 0x6f, 0xee, 0xab, 0x2a, 0xee, 0xc1, 0x5b, 0x88, 0xe6, 0x93, 0x7c, 0x7b, 0x23, 0xee, 0x1a, 0xab, 0xb6, 0x82, 0x03, 0x63, 0x24, 0x8e, 0xea, 0xd3, 0xdc, 0x1f, 0x8e, 0x3d, 0x6a, 0xb9, 0x96, 0x79, 0xd2, 0x8f, 0x37, 0x23, 0x9d, 0x1b, 0x58, 0x38, 0xb4, 0x9e, 0x50, 0x8e, 0x13, 0x00, 0xcc, 0x22, 0x17, 0x25, 0x04, 0xde, 0x29, 0xea, 0x36, 0xac, 0x1a, 0x70, 0x7a, 0x15, 0x22, 0xbd, 0x14, 0x70, 0x08, 0x62, 0xfa, 0x1d, 0xeb, 0x37, 0xe1, 0xcd, 0x16, 0x8b, 0x3b, 0x24, 0x39, 0xec, 0xe8, 0x76, 0x4e, 0x50, 0x4a, 0x9f, 0x83, 0xc2, 0xb5, 0x9d, 0x1d, 0x71, 0xb3, 0x7f, 0xcd, 0x8d, 0x5d, 0x3e, 0x75, 0x6d, 0x3e, 0xd9, 0x2d, 0xfb, 0x3e, 0x0d, 0x95, 0x63, 0x3b, 0xe0, 0x34, 0x85, 0x91, 0xb3, 0x88, 0x6c, 0x87, 0x58, 0x60, 0x1c, 0x10, 0x4e, 0xd0, 0x18, 0x10, 0x77, 0x9f, 0xe1, 0x73, 0x05, 0x69, 0xd0, 0xc3, 0xe0, 0xa9, 0x7d, 0x11, 0x5f, 0xe8, 0xee, 0x05, 0xc3, 0x97, 0x19, 0x5b, 0x6f, 0xa9, 0x9f, 0xb8, 0x1c, 0x6c, 0x43, 0x40, 0x88, 0x7b, 0xc1, 0xf0, 0x5a, 0x2e, 0x5e, 0x2c, 0xf9, 0xd4, 0xbb, 0xef, 0x4a, 0x84, 0xe3, 0x3e, 0x9b, 0xbf, 0x62, 0x99, 0x8d, 0x5f, 0x26, 0x76, 0x39, 0x13, 0xc7, 0x8d, 0x36, 0xff, 0xa1, 0xf1, 0xd7, 0x47, 0xf7, 0x73, 0x10, 0x6e, 0x24, 0x1a, 0x44, 0xad, 0xca, 0xbd, 0xbc, 0xa6, 0xa8, 0xb4, 0x56, 0x26, 0xfc, 0x1f, 0x57, 0xe0, 0xca, 0x6e, 0x67, 0x33, 0x3e, 0x5f, 0x39, 0x47, 0x82, 0xb6, 0x54, 0xde, 0xc5, 0x92, 0xa8, 0xb7, 0xbc, 0x82, 0x03, 0xa7, 0x3d, 0x7b, 0x13, 0x70, 0x64, 0x57, 0x29, 0xa5, 0x33, 0x27, 0x63, 0xc1, 0xaa, 0x60, 0x3b, 0xe1, 0x91, 0xfd, 0x6c, 0x01, 0x88, 0x34, 0xc0, 0x07, 0xc3, 0x85, 0xfb, 0x1f, 0x12, 0xd7, 0x31, 0xfe, 0x78, 0xb8, 0x15, 0xe5, 0xc7, 0xf2, 0x97, 0x60, 0x05, 0xd1, 0x35, 0x34, 0x1b, 0x25, 0x4f, 0x35, 0xc6, 0x98, 0x12, 0x17, 0xc1, 0xe6, 0x42, 0xd0, 0xa3, 0xd7, 0xc8, 0xef, 0xed, 0x01, 0x7c, 0x3e, 0xc5, 0xc1, 0xf5, 0x02, 0xd7, 0x92, 0xea, 0x53, 0xfc, 0x65, 0xc4, 0x84, 0x85, 0x08, 0x1a, 0xbc, 0x07, 0xd2, 0xbc, 0xc4, 0x28, 0xf6, 0xab, 0xb0, 0x22, 0x9e, 0x05, 0x9b, 0xc6, 0xb4, 0x5e, 0x5f, 0xb5, 0xf5, 0x1f, 0x6c, 0xe0, 0xc8, 0xdb, 0x17, 0xd8, 0xe3, 0xdb, 0x50, 0x65, 0xef, 0x2a, 0xda, 0x40, 0x34, 0xc3, 0x21, 0x21, 0x13, 0x79, 0x12, 0x04, 0x84, 0x35, 0x34, 0x7f, 0x82, 0x37, 0xe8, 0x14, 0x29, 0x61, 0x2f, 0x19, 0xd2, 0xa2, 0x42, 0x93, 0x6f, 0x6d, 0x85, 0x38, 0x30, 0x6e, 0x25, 0x45, 0x78, 0xd5, 0x2a, 0xc4, 0x0e, 0xfd, 0xa0, 0xab, 0xa6, 0xae, 0xdc, 0x93, 0xa7, 0x72, 0x2a, 0x09, 0x04, 0xb4, 0x4e, 0xf2, 0x56, 0x00, 0x15, 0x98, 0x7f, 0x3b, 0x4f, 0x43, 0x90, 0x08, 0x42, 0xd0, 0x11, 0x93, 0x58, 0xd1, 0x23, 0xd4, 0x9a, 0x9a, 0x80, 0x0b, 0xf6, 0xa8, 0xe4, 0x17, 0x1a, 0xa8, 0xe3, 0x3d, 0x5a, 0x05, 0xf4, 0x73, 0xa7, 0x2d, 0xe6, 0xee, 0xa9, 0x78, 0xa2, 0x6e, 0x1b, 0xc2, 0x07, 0x04, 0xb8, 0x31, 0xb2, 0x01, 0x76, 0xba, 0x19, 0x0c, 0x0f, 0x4f, 0xce, 0xbe, 0x63, 0xa2, 0xb8, 0x80, 0xf2, 0x22, 0x8d, 0x0c, 0xdb, 0x25, 0x66, 0x7a, 0x40, 0xa3, 0x0b, 0xe2, 0x2f, 0x47, 0x4a, 0xfe, 0xd4, 0xd6, 0x12, 0x0f, 0x26, 0x5b, 0x04, 0xf4, 0x8c, 0xdf, 0x6b, 0x67, 0x45, 0x67, 0xe9, 0x62, 0xf3, 0x1d, 0x2c, 0x2e, 0x1a, 0xd6, 0x58, 0x43, 0x62, 0x03, 0x0a, 0xf1, 0xe6, 0x2d, 0xf8, 0xe0, 0x1a, 0x77, 0xbf, 0xe6, 0x39, 0x4c, 0x45, 0xaa, 0xce, 0xbf, 0x6c, 0x6c, 0xbb, 0x55, 0x91, 0x51, 0xd5, 0x49, 0x05, 0x1d, 0x39, 0xe4, 0xf6, 0x22, 0x20, 0x24, 0xc4, 0xb2, 0x83, 0xda, 0xb7, 0xb3, 0x86, 0xdf, 0x37, 0xe0, 0x01, 0xe1, 0x5b, 0x55, 0xd9, 0x60, 0x8b, 0x55, 0xcb, 0x28, 0x7f, 0xf9, 0xfa, 0x50, 0x0b, 0x4c, 0xc0, 0x18, 0x1d, 0x2e, 0x92, 0x19, 0x05, 0xa4, 0xd7, 0xde, 0xc7, 0x3e, 0xc4, 0x3f, 0x27, 0x56, 0x35, 0x00, 0xf5, 0xe3, 0x32, 0x71, 0xcb, 0xa0, 0x34, 0xa2, 0xbd, 0x3c, 0x6b, 0x17, 0x1e, 0x94, 0xb9, 0x7b, 0x62, 0xb8, 0xcb, 0xa4, 0xa2, 0x8a, 0x90, 0xb0, 0xc0, 0xb6, 0xc3, 0xfa, 0x9e, 0x1f, 0xa3, 0x75, 0x09, 0x71, 0x5d, 0x9c, 0x23, 0xdd, 0xf6, 0x6d, 0x4f, 0x42, 0xd2, 0xaf, 0x8d, 0x89, 0x54, 0xc1, 0xfd, 0x36, 0x25, 0x2c, 0x06, 0x2e, 0x4a, 0xea, 0x41, 0x63, 0x0e, 0x3d, 0xfc, 0x40, 0xa7, 0x71, 0x1c, 0x3c, 0x9c, 0x75, 0x02, 0xcb, 0xb3, 0x32, 0x6e, 0x33, 0xf5, 0x30, 0xb9, 0x63, 0x40, 0xd2, 0xb4, 0xff, 0xd5, 0x9e, 0xcd, 0x44, 0x9b, 0xeb, 0x4a, 0x43, 0x1d, 0x20, 0xf1, 0x60, 0xa6, 0xad, 0x0a, 0xb7, 0x6d, 0xef, 0x82, 0x15, 0x02, 0x35, 0xd8, 0x4d, 0xdc, 0x1b, 0xdf, 0x1f, 0x69, 0x2c, 0x86, 0xdd, 0x11, 0x91, 0x22, 0x70, 0x74, 0x3e, 0x64, 0xef, 0x3f, 0xb2, 0xb1, 0xc3, 0xbe, 0x6e, 0x9d, 0x13, 0x8c, 0x8f, 0xff, 0xd6, 0x74, 0x0b, 0xc0, 0x89, 0x6a, 0x87, 0xd0, 0xe5, 0x4b, 0x3c, 0x30, 0xd7, 0x27, 0xad, 0xf1, 0xc8, 0x0c, 0x07, 0x1d, 0xea, 0x31, 0xfe, 0x37, 0x5b, 0x0b, 0xeb, 0xfe, 0xc2, 0x43, 0x55, 0xa4, 0xf6, 0x92, 0x11, 0x38, 0xa4, 0x71, 0xbc, 0x77, 0x59, 0x8e, 0x38, 0x24, 0xe3, 0xd3, 0xb0, 0x61, 0x5f, 0xe5, 0x76, 0x20, 0x93, 0x81, 0xba, 0x0f, 0x8d, 0xc4, 0x86, 0x73, 0x78, 0x74, 0xdf, 0x7a, 0xb4, 0x93, 0x58, 0xf2, 0x02, 0x40, 0x4e, 0x10, 0x93, 0xe4, 0xdd, 0xeb, 0x1e, 0x8d, 0x96, 0xa2, 0x32, 0x0a, 0x4b, 0xfe, 0xa7, 0x48, 0x2d, 0x72, 0x1e, 0x89, 0xa7, 0x50, 0x5c, 0x10, 0xe8, 0x52, 0x49, 0x4a, 0x13, 0xcc, 0x51, 0xba, 0x22, 0x7c, 0xa3, 0xca, 0xc8, 0xcf, 0x31, 0x79, 0x40, 0x2a, 0x6f, 0xf6, 0x6d, 0x82, 0x5c, 0x6c, 0xb5, 0x3a, 0x6c, 0xa7, 0x4f, 0xdf, 0x52, 0x94, 0xe0, 0x1a, 0xaa, 0xe6, 0x43, 0x20, 0x2f, 0xa6, 0x27, 0x67, 0x08, 0xbb, 0x31, 0x5c, 0x3d, 0xfd, 0x9a, 0xf9, 0x2e, 0x42, 0x95, 0x56, 0x8f, 0xad, 0x86, 0x20, 0xae, 0xd4, 0x04, 0x74, 0x1f, 0xfe, 0xe2, 0x0d, 0x0f, 0x69, 0xb3, 0x73, 0x2a, 0x57, 0x26, 0xca, 0x2f, 0xdd, 0xa5, 0xdd, 0x4d, 0x77, 0x44, 0x43, 0x54, 0x37, 0xf5, 0xda, 0x70, 0x36, 0x59, 0x89, 0x3d, 0x91, 0x3f, 0x6b, 0xff, 0x8f, 0x29, 0x3d, 0x8f, 0x4b, 0x07, 0xb8, 0x70, 0x7f, 0x13, 0x89, 0x9d, 0x03, 0xe9, 0x81, 0xcb, 0x19, 0xc5, 0x98, 0xde, 0xcd, 0x32, 0xdf, 0x33, 0x14, 0x69, 0xbf, 0x9b, 0xb1, 0x39, 0xdc, 0xec, 0x29, 0xf2, 0x3a, 0x88, 0x1d, 0x23, 0x1b, 0xec, 0xd1, 0x0f, 0xc4, 0x82, 0x94, 0xf7, 0xc1, 0x55, 0x3f, 0x98, 0xc9, 0xd8, 0x34, 0xd9, 0x80, 0x05, 0x59, 0xb7, 0xca, 0x24, 0x85, 0xbe, 0xf1, 0xfc, 0xb7, 0x42, 0xa0, 0x1b, 0xd5, 0x1c, 0x10, 0x6b, 0x1c, 0x99, 0x20, 0x4c, 0x7e, 0xa8, 0x8d, 0xf6, 0x27, 0x07, 0x48, 0xf3, 0x18, 0x99, 0x73, 0x42, 0x37, 0x96, 0x4e, 0x34, 0x1d, 0x38, 0x91, 0x5a, 0x0e, 0x61, 0x6b, 0x9f, 0xfa, 0xe0, 0x39, 0x3a, 0x54, 0x87, 0xfc, 0x5d, 0xcf, 0x13, 0xba, 0x74, 0x8c, 0xc3, 0xa2, 0xa3, 0x89, 0x91, 0x7c, 0x97, 0xbe, 0xf8, 0x26, 0x0f, 0x54, 0x5c, 0x40, 0xb4, 0x61, 0x3f, 0xbb, 0x87, 0xa1, 0xdd, 0x62, 0x5d, 0x5c, 0x49, 0x93, 0x85, 0x50, 0x30, 0x32, 0x8a, 0xd7, 0x2c, 0x83, 0xf0, 0x4b, 0x76, 0x4a, 0xac, 0x87, 0x0e, 0x6e, 0xff, 0x7a, 0x11, 0xbd, 0x49, 0x71, 0xaf, 0x2d, 0xa7, 0x44, 0x7b, 0xcc, 0x71, 0xc3, 0xb8, 0x13, 0x28, 0xe9, 0x62, 0x1a, 0xa5, 0x67, 0x78, 0xb6, 0x19, 0x83, 0xc5, 0xa7, 0x15, 0xd2, 0x3d, 0xf9, 0x85, 0xb1, 0x99, 0xd8, 0x18, 0x4d, 0x16, 0x1d, 0x17, 0x3e, 0x29, 0x63, 0x8f, 0x07, 0x86, 0x03, 0x9f, 0x0f, 0xc5, 0xcf, 0x76, 0x9d, 0xef, 0xe3, 0xaa, 0x0a, 0xac, 0x37, 0xa4, 0xfc, 0x49, 0x25, 0xa5, 0x8f, 0x1c, 0x4e, 0xab, 0x2b, 0x68, 0x3f, 0x59, 0xbb, 0x9f, 0x80, 0x47, 0x82, 0x31, 0x92, 0x64, 0xf3, 0xab, 0x6b, 0xd3, 0xd1, 0x42, 0xe7, 0x26, 0xb4, 0x73, 0x5e, 0xac, 0x08, 0xdd, 0x48, 0x89, 0xbd, 0xd3, 0x68, 0xa1, 0xfa, 0x20, 0x05, 0xe3, 0x39, 0x37, 0x84, 0x78, 0x52, 0x3d, 0x0f, 0xe8, 0x2b, 0xa2, 0x8c, 0x3c, 0xd3, 0x5b, 0x60, 0x31, 0xf1, 0x60, 0x20, 0xd6, 0x64, 0xb2, 0x9c, 0xa4, 0x99, 0xf5, 0x90, 0xd9, 0xca, 0x5f, 0xf2, 0x39, 0x1c, 0x6e, 0xd2, 0x0d, 0x65, 0xda, 0x0c, 0x2a, 0x67, 0x16, 0x6f, 0x63, 0x88, 0x6f, 0x66, 0xc7, 0x39, 0x4b, 0xf6, 0x5b, 0xaa, 0x30, 0x2b, 0xc2, 0xb9, 0x40, 0x88, 0xda, 0x10, 0xb4, 0x2d, 0x5f, 0x9b, 0x16, 0xc1, 0xb5, 0x19, 0x2f, 0x70, 0xa7, 0x22, 0xdf, 0x2d, 0xe8, 0x7b, 0x1c, 0x6d, 0xa8, 0xce, 0x75, 0xb9, 0x5b, 0x68, 0x01, 0xb3, 0x36, 0x95, 0xcd, 0x0c, 0x98, 0x5b, 0xf1, 0x1d, 0xfe, 0xaa, 0x20, 0xf2, 0xd8, 0x9b, 0xdd, 0xeb, 0x5b, 0x98, 0x6d, 0x59, 0xd1, 0xd4, 0xe8, 0x83, 0x05, 0xf1, 0x15, 0x9d, 0x56, 0xb2, 0x5a, 0xd6, 0xfd, 0x05, 0x7e, 0x7b, 0x89, 0xf6, 0x53, 0xcf, 0x5a, 0x43, 0xef, 0x49, 0x99, 0xf5, 0xee, 0xa0, 0x36, 0x5f, 0x07, 0x02, 0x3d, 0x08, 0xd9, 0xb1, 0xfc, 0xd2, 0xb5, 0x72, 0x60, 0xee, 0xa9, 0xaf, 0x27, 0x48, 0x96, 0x86, 0x97, 0xf5, 0x37, 0x74, 0x56, 0x2e, 0x80, 0x02, 0xc5, 0xf1, 0x80, 0x2e, 0xa8, 0xc1, 0x20, 0xcf, 0x60, 0x78, 0xcc, 0xa6, 0x48, 0xea, 0xf1, 0x72, 0xce, 0xb7, 0x23, 0xeb, 0x58, 0x51, 0x9f, 0xfa, 0xf6, 0x3d, 0x13, 0x5b, 0x82, 0xa6, 0x1c, 0x25, 0xac, 0x71, 0x94, 0xe9, 0x86, 0x60, 0xf7, 0x86, 0xe3, 0xab, 0x11, 0x0a, 0xbf, 0x23, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x02, 0xe4, 0x61, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xe0, 0x07, 0xec, 0x81, 0x00, 0x00, 0x3d, 0x4f, 0xe8, 0x8a, 0x84, 0x70, 0xd4, 0x47, 0x10, 0x56, 0xdf, 0x21, 0xf4, 0xb6, 0x51, 0xed, 0x6a, 0xba, 0xf6, 0x41, 0x64, 0xac, 0x13, 0xd8, 0x9e, 0xee, 0xeb, 0xc1, 0xc1, 0xc5, 0xd5, 0x88, 0x4e, 0xa9, 0x5a, 0x51, 0x4d, 0xd6, 0xbc, 0x4e, 0xa1, 0x0d, 0x56, 0x46, 0xed, 0x11, 0xba, 0xe2, 0xa8, 0x7a, 0xd8, 0xd6, 0x42, 0x13, 0x27, 0x53, 0xc6, 0x42, 0x41, 0x1f, 0xed, 0x44, 0x76, 0x11, 0x1d, 0x89, 0xcb, 0x39, 0x99, 0x03, 0xa8, 0x6e, 0x6a, 0x89, 0x13, 0xfc, 0xa3, 0x40, 0x1c, 0x08, 0x40, 0x19, 0x68, 0xc2, 0x4e, 0xc2, 0x7d, 0x03, 0x33, 0xa6, 0x04, 0xf1, 0x78, 0xac, 0xc1, 0xdb, 0x78, 0x38, 0xfc, 0x01, 0x3a, 0x81, 0xed, 0xc6, 0xa1, 0x42, 0xd3, 0x22, 0x0c, 0x41, 0x7a, 0x8a, 0x30, 0x99, 0x12, 0x4d, 0xab, 0x94, 0xe7, 0xb4, 0xba, 0x1f, 0x9c, 0xbd, 0xfd, 0x49, 0xef, 0x93, 0x74, 0xf4, 0x88, 0x72, 0xc4, 0x75, 0xc2, 0x95, 0x76, 0x21, 0x86, 0xf8, 0x24, 0xc3, 0x4c, 0x22, 0x8d, 0x60, 0xd2, 0x8f, 0xec, 0xca, 0x20, 0x99, 0x87, 0x4b, 0x69, 0xc2, 0x45, 0xff, 0x89, 0xab, 0xe8, 0x9b, 0x7e, 0x51, 0x00, 0xf2, 0x0b, 0xc7, 0x7e, 0xe2, 0xdd, 0x16, 0x94, 0xb3, 0x76, 0x24, 0xf9, 0xe5, 0x0a, 0x3e, 0xc1, 0x7b, 0xd7, 0x1a, 0x40, 0x23, 0x99, 0x3d, 0x16, 0x8e, 0xe0, 0x7b, 0xcc, 0x67, 0xeb, 0xeb, 0xab, 0xee, 0xab, 0x17, 0xca, 0xd6, 0xca, 0xb3, 0x37, 0xe4, 0x4b, 0x93, 0x85, 0x0c, 0x65, 0xe0, 0x7e, 0x16, 0xd4, 0x5f, 0x5b, 0x3c, 0x57, 0x3d, 0x1f, 0x6a, 0x7a, 0x81, 0xf3, 0x94, 0x93, 0x52, 0xf4, 0x7f, 0xac, 0x56, 0xdf, 0xf1, 0xa9, 0xed, 0xca, 0xb3, 0x2b, 0x6b, 0x23, 0x2d, 0x12, 0x40, 0x6f, 0xfe, 0x07, 0x8a, 0x53, 0x19, 0x1d, 0x42, 0x65, 0x2d, 0x3d, 0x99, 0xf6, 0x39, 0xb5, 0x01, 0x7f, 0xca, 0x30, 0x88, 0x0a, 0x4a, 0xe6, 0x3e, 0xc2, 0x50, 0xd0, 0x2a, 0x8e, 0xe7, 0xdd, 0xcb, 0xfc, 0x4e, 0xdd, 0xb2, 0x7a, 0x21, 0x79, 0xbc, 0x7c, 0xfc, 0x96, 0xe1, 0x71, 0xfa, 0xf0, 0x28, 0x05, 0x18, 0x8c, 0x8f, 0x41, 0x00, 0x9f, 0x6d, 0xe4, 0xd2, 0x82, 0xb9, 0xe5, 0x21, 0xdf, 0xc0, 0xfc, 0x73, 0x38, 0xd4, 0x11, 0x38, 0x88, 0x06, 0x16, 0x59, 0x14, 0x92, 0xbe, 0x13, 0xa2, 0xc7, 0x53, 0xf2, 0xe2, 0xe6, 0x01, 0x51, 0x30, 0x12, 0x3f, 0xf2, 0x1e, 0xe1, 0x78, 0xe9, 0x9d, 0xac, 0xfe, 0x47, 0x6a, 0x96, 0x85, 0x08, 0xe3, 0x11, 0x34, 0x7c, 0xfe, 0xe8, 0x9d, 0x2d, 0x36, 0x58, 0x22, 0x03, 0xaf, 0x9f, 0x10, 0x5e, 0xb7, 0x04, 0xed, 0x47, 0xbb, 0xcb, 0x96, 0xed, 0xca, 0xde, 0x1f, 0xf5, 0xe6, 0x84, 0x12, 0xa3, 0x31, 0x06, 0xd9, 0xb2, 0x32, 0xe2, 0xc5, 0x32, 0xa4, 0x8a, 0x7e, 0x56, 0xcd, 0x17, 0x4b, 0xc8, 0x20, 0xd9, 0xa4, 0xc3, 0x23, 0xda, 0x0c, 0x62, 0x56, 0xa2, 0xaf, 0xf5, 0xcd, 0x1a, 0xdf, 0x9b, 0xcd, 0x63, 0xf9, 0xdc, 0xae, 0xf5, 0x43, 0xb1, 0x83, 0x21, 0x33, 0xb2, 0x75, 0x2a, 0xd7, 0xa8, 0x4f, 0x70, 0x37, 0x61, 0xd5, 0xa6, 0x6c, 0xec, 0x98, 0x89, 0x0c, 0xfc, 0x2b, 0x0e, 0x35, 0x0f, 0xca, 0xa0, 0x1d, 0x03, 0xd8, 0x4f, 0xc2, 0x11, 0x4d, 0x7e, 0x72, 0xd3, 0xa9, 0xb9, 0x04, 0xee, 0x4e, 0xd0, 0xa2, 0xb6, 0xbb, 0x70, 0x9d, 0xd5, 0x25, 0x3e, 0x92, 0xab, 0xe1, 0x10, 0x7d, 0xe4, 0x75, 0xe9, 0xd7, 0x44, 0x6e, 0xa5, 0x60, 0x88, 0xc3, 0x14, 0x67, 0x89, 0x65, 0xb5, 0x52, 0xf5, 0x97, 0x9c, 0xf7, 0x2d, 0xa7, 0xa4, 0xda, 0xb6, 0x63, 0x93, 0x28, 0x6c, 0x81, 0xb4, 0x8a, 0x36, 0x8c, 0x2d, 0xa1, 0xa4, 0xde, 0xac, 0x7e, 0xee, 0x91, 0xe5, 0xb9, 0x68, 0x4f, 0x6d, 0x56, 0xbb, 0x81, 0xf9, 0xa1, 0xdb, 0x39, 0xb6, 0x6b, 0xf9, 0xd6, 0x3d, 0x5e, 0x7d, 0x4f, 0x14, 0x97, 0xae, 0x83, 0xf7, 0x56, 0xe1, 0xa6, 0x78, 0x49, 0x69, 0x81, 0x44, 0x29, 0x99, 0xf4, 0xbb, 0x49, 0xaa, 0x9b, 0x7c, 0x73, 0xdf, 0xe8, 0x6c, 0xd2, 0x3c, 0x8c, 0xb4, 0xcc, 0xde, 0xea, 0x55, 0x70, 0x58, 0xca, 0x72, 0x47, 0x49, 0xe2, 0x36, 0xb0, 0x90, 0x6e, 0x40, 0xd8, 0xb6, 0x8d, 0x0c, 0xcd, 0xab, 0xa8, 0x3c, 0x25, 0x6f, 0x37, 0xc5, 0x01, 0xf0, 0xa5, 0x11, 0x0a, 0xa0, 0x77, 0x9b, 0x02, 0xd5, 0x20, 0xfa, 0x06, 0x37, 0x4e, 0x6c, 0xa7, 0x44, 0xdd, 0x84, 0x77, 0x3e, 0xe6, 0x59, 0x65, 0x33, 0xb3, 0x66, 0x79, 0x4f, 0x1a, 0xd3, 0x2f, 0x7d, 0xd2, 0xde, 0x29, 0x10, 0x41, 0xa5, 0x1b, 0x06, 0xe7, 0x99, 0xfd, 0x07, 0x55, 0x98, 0xfe, 0x61, 0xdd, 0x90, 0xc4, 0x85, 0x46, 0xcb, 0x09, 0x39, 0xf3, 0xd2, 0x29, 0xf2, 0x52, 0x15, 0xc3, 0xb3, 0xad, 0x65, 0x3d, 0xa4, 0xb3, 0x73, 0x9f, 0x2f, 0xd7, 0xc7, 0x3f, 0xc4, 0x06, 0xa9, 0x40, 0xcd, 0x1a, 0xb0, 0xb1, 0x22, 0x32, 0x80, 0xe8, 0x58, 0xc2, 0x79, 0x9e, 0x5a, 0xf0, 0x2d, 0xad, 0xa0, 0x8a, 0xcc, 0x65, 0x30, 0x91, 0xa9, 0xe9, 0xae, 0xce, 0xe9, 0xf6, 0x30, 0x44, 0x6f, 0x7f, 0xc2, 0x60, 0xa6, 0xa6, 0x16, 0xd3, 0x4b, 0x92, 0x4f, 0xa1, 0xd9, 0x7a, 0xbe, 0x14, 0x24, 0xac, 0xa8, 0xc4, 0xed, 0xd9, 0x01, 0xde, 0xea, 0x45, 0x83, 0x92, 0x52, 0xfa, 0xc1, 0xdd, 0xc7, 0xf3, 0x62, 0x8e, 0x2b, 0x0e, 0x1d, 0x6e, 0xcc, 0x00, 0xe6, 0x0d, 0xba, 0xb2, 0x4c, 0x98, 0x81, 0xab, 0x12, 0x42, 0x8b, 0x05, 0x66, 0x9a, 0xfe, 0xa5, 0xc4, 0xc5, 0x16, 0xc4, 0xa9, 0xb7, 0x97, 0x6c, 0x5d, 0x92, 0x45, 0xf6, 0xf9, 0xe9, 0x38, 0x8f, 0xec, 0x0e, 0x14, 0xb3, 0x97, 0x26, 0x66, 0x4c, 0xeb, 0x14, 0x01, 0x18, 0xb1, 0xc8, 0x1e, 0x83, 0x49, 0x54, 0x98, 0x30, 0xf3, 0xa7, 0x03, 0x08, 0x98, 0x2b, 0x5e, 0x63, 0xbf, 0x79, 0xe1, 0x8e, 0xf9, 0xbd, 0x85, 0xc8, 0xdb, 0x79, 0xd8, 0x14, 0x93, 0xc5, 0x78, 0xf7, 0x67, 0xe1, 0xa9, 0xeb, 0xab, 0xf2, 0xa9, 0x16, 0x2b, 0xfa, 0x65, 0x45, 0x0b, 0x6e, 0xa8, 0xcd, 0x9c, 0x43, 0x3c, 0xb7, 0x24, 0xe5, 0x68, 0x92, 0x96, 0x50, 0xd5, 0x8b, 0xf2, 0x32, 0xf7, 0x49, 0xe3, 0x4c, 0xbb, 0xb1, 0xaa, 0x39, 0xfe, 0xc4, 0xa1, 0xf3, 0xf2, 0x1e, 0x77, 0xd4, 0x4f, 0x7f, 0x7c, 0x61, 0x28, 0x05, 0x55, 0xb3, 0xd2, 0xd6, 0x05, 0xbb, 0x38, 0x4c, 0x82, 0xc5, 0x19, 0x58, 0x53, 0xd8, 0xdb, 0xf3, 0x85, 0xb3, 0x12, 0x5e, 0xe6, 0x03, 0xa8, 0x2a, 0x9e, 0xc0, 0xfd, 0xcf, 0x87, 0x87, 0xe5, 0x64, 0x98, 0xf2, 0x44, 0x2e, 0x27, 0x3d, 0x7a, 0x91, 0x02, 0x2e, 0x4f, 0xac, 0xa1, 0x86, 0xc5, 0x64, 0x8e, 0xb9, 0x75, 0xf5, 0x94, 0xfe, 0x01, 0xfd, 0x73, 0xc2, 0xd6, 0xfb, 0x39, 0xda, 0xae, 0x91, 0x3b, 0xae, 0xb7, 0x70, 0x6c, 0x87, 0xfe, 0x89, 0x31, 0x8d, 0x1a, 0xdb, 0x95, 0x1c, 0x8d, 0xdf, 0x86, 0x27, 0x0b, 0x00, 0x7d, 0x9a, 0xfc, 0xb5, 0xaa, 0xf0, 0x79, 0x30, 0xf8, 0xab, 0xc1, 0xac, 0x2f, 0xdf, 0x8a, 0x36, 0x63, 0x59, 0xca, 0x77, 0x98, 0x00, 0x00, 0x01, 0x00, 0xca, 0xc7, 0x4a, 0x81, 0xaf, 0xcb, 0x45, 0x6a, 0xe9, 0x9d, 0xa3, 0x03, 0x70, 0xb3, 0x07, 0xd0, 0xca, 0x3d, 0xac, 0xad, 0xca, 0x8c, 0x63, 0xbd, 0x65, 0x83, 0x99, 0x84, 0x62, 0xb4, 0xe0, 0x9d, 0xdd, 0x1f, 0x41, 0x1e, 0x53, 0x28, 0x0c, 0xd3, 0x15, 0x7d, 0xd3, 0x69, 0x5c, 0xbe, 0xcc, 0xeb, 0xf0, 0xe7, 0xb7, 0xf2, 0x54, 0xd6, 0x8b, 0xee, 0x2c, 0xcb, 0x5c, 0x02, 0x17, 0x34, 0x07, 0xb3, 0x42, 0x41, 0xaf, 0x2a, 0x1d, 0xdc, 0x40, 0x50, 0x10, 0x6d, 0x2e, 0x00, 0xff, 0xe9, 0x8b, 0x9b, 0x8f, 0xc2, 0x9c, 0x74, 0x33, 0xd3, 0x69, 0x3f, 0x22, 0x34, 0xc5, 0x2f, 0xcd, 0x3a, 0x66, 0xc7, 0x7d, 0x23, 0x15, 0x8d, 0x1e, 0x26, 0x4b, 0x09, 0xf0, 0x10, 0x5d, 0x4a, 0x87, 0x8b, 0xf2, 0x94, 0xda, 0x9e, 0x98, 0x69, 0x28, 0x7c, 0x01, 0x04, 0x26, 0xb1, 0xea, 0x16, 0x4e, 0x6a, 0x88, 0x58, 0x1f, 0xb2, 0x44, 0xf2, 0x65, 0xe3, 0x75, 0x53, 0x1c, 0x34, 0x67, 0x47, 0x34, 0x2f, 0x61, 0x28, 0x5a, 0x70, 0x00, 0x4f, 0xb6, 0x47, 0x25, 0x8a, 0x34, 0x1f, 0xa8, 0x68, 0xcb, 0x05, 0x92, 0x5e, 0xf0, 0x6f, 0xa0, 0x41, 0x3c, 0x68, 0xf1, 0xb3, 0x9e, 0x11, 0x2a, 0xe5, 0xc9, 0xff, 0xa0, 0x79, 0x8e, 0x1c, 0xf2, 0x86, 0xbe, 0xd2, 0x7a, 0xf4, 0xaa, 0xd9, 0x2b, 0x7b, 0x6f, 0xfc, 0x97, 0x1b, 0x02, 0x98, 0x6b, 0x28, 0x43, 0x79, 0x2c, 0x49, 0x0c, 0x7c, 0x12, 0x02, 0x91, 0xf6, 0x7e, 0xf9, 0xfe, 0x13, 0x3d, 0x4a, 0x47, 0xed, 0x24, 0xae, 0xae, 0x7f, 0xfc, 0x3b, 0x93, 0xc4, 0x64, 0x8c, 0xcb, 0x79, 0xfc, 0xff, 0x8b, 0xdd, 0xcc, 0x16, 0x02, 0x0b, 0xd6, 0x95, 0xcc, 0x02, 0x74, 0xd5, 0x9b, 0xe5, 0x05, 0x1d, 0x0a, 0x8e, 0xb9, 0x5d, 0xe5, 0xf5, 0xda, 0xf3, 0xbd, 0x93, 0xb3, 0x1f, 0x7f, 0xfe, 0x8c, 0x5a, 0x9e, 0x9e, 0x3c, 0x44, 0x29, 0x2b, 0x2c, 0x2b, 0x02, 0x7d, 0xe7, 0x76, 0xac, 0x20, 0xe5, 0x51, 0x7b, 0xa6, 0x6d, 0xba, 0x00, 0x73, 0xcd, 0xe0, 0xa1, 0x9d, 0x0b, 0x52, 0xe0, 0x11, 0x46, 0xff, 0x18, 0x46, 0x0a, 0x80, 0x1c, 0xe7, 0xc7, 0x11, 0x6a, 0x06, 0x77, 0xec, 0x40, 0xfc, 0x45, 0xe1, 0xe2, 0x8e, 0x3d, 0xc2, 0x6e, 0x01, 0xa4, 0x07, 0x56, 0xd7, 0xa8, 0x39, 0x8c, 0x54, 0x88, 0xa7, 0x96, 0x8f, 0x0b, 0x55, 0x41, 0x39, 0x2e, 0x62, 0x83, 0x8e, 0x96, 0xe4, 0x42, 0xc8, 0xd9, 0x36, 0x5b, 0x4c, 0x2a, 0xdc, 0x3a, 0x4c, 0x73, 0x7a, 0xde, 0x75, 0x9f, 0x98, 0x4d, 0xf1, 0x23, 0xd5, 0x53, 0xf3, 0x51, 0x79, 0x26, 0x3a, 0x48, 0xc9, 0xd0, 0xa3, 0x0a, 0xb9, 0x38, 0x43, 0x84, 0x33, 0x5d, 0x66, 0x76, 0x1d, 0xcb, 0xef, 0x98, 0x9b, 0xab, 0xb4, 0xef, 0x11, 0x5d, 0x61, 0xbe, 0x84, 0xcf, 0x6a, 0x05, 0x0e, 0x46, 0x7c, 0x9b, 0x7c, 0xd9, 0x1e, 0x14, 0xea, 0x03, 0xa3, 0xf4, 0x19, 0x59, 0xf0, 0xa1, 0xb8, 0x5c, 0xd0, 0x53, 0x85, 0x09, 0x82, 0x4a, 0x67, 0x6c, 0xe7, 0x2f, 0x69, 0x98, 0x4f, 0x7f, 0xbe, 0x83, 0x93, 0x82, 0x40, 0xde, 0x28, 0xfd, 0xec, 0xd7, 0x59, 0x49, 0xc8, 0x0e, 0x2e, 0x98, 0x69, 0x51, 0x34, 0x71, 0x75, 0x19, 0xac, 0x7c, 0xac, 0x6f, 0xdb, 0x24, 0x48, 0xbb, 0xa5, 0x13, 0x23, 0x02, 0xbc, 0xe2, 0x62, 0x32, 0x12, 0xa9, 0x15, 0x15, 0x16, 0x92, 0x54, 0x4f, 0xa3, 0xa2, 0x27, 0x8b, 0x14, 0x61, 0x57, 0x8d, 0x6d, 0x24, 0x87, 0x0d, 0x36, 0x5c, 0x5d, 0x10, 0xf1, 0x27, 0xf2, 0x36, 0xf1, 0xc4, 0x32, 0x28, 0x20, 0x23, 0xc2, 0x83, 0x51, 0x21, 0xe5, 0xe1, 0x60, 0x10, 0x2e, 0x38, 0xc8, 0xc2, 0x05, 0x73, 0xd2, 0x6e, 0xb3, 0x0f, 0x20, 0xfe, 0xd9, 0x1b, 0x99, 0xbc, 0x09, 0x3a, 0x69, 0x20, 0xd6, 0xb6, 0x08, 0xc2, 0x62, 0xa5, 0x2d, 0xf5, 0x09, 0x1b, 0x12, 0xf2, 0x2b, 0x36, 0x29, 0xff, 0xfa, 0xec, 0x20, 0x0c, 0xdf, 0x15, 0x52, 0x56, 0x91, 0x34, 0x40, 0xbc, 0xdd, 0x86, 0x93, 0x01, 0x7d, 0xb9, 0x70, 0xdb, 0xff, 0xfa, 0x12, 0xe5, 0x4a, 0x1b, 0xec, 0x61, 0x8f, 0x28, 0x9e, 0xaa, 0x60, 0x31, 0x00, 0xc7, 0x7f, 0xcb, 0x1f, 0x94, 0x79, 0xd6, 0x79, 0x03, 0xce, 0x6b, 0x4c, 0x62, 0x26, 0xc8, 0x4f, 0xae, 0x9c, 0x14, 0x89, 0x54, 0x3c, 0x29, 0x74, 0xdd, 0x69, 0x9d, 0x84, 0x79, 0x40, 0x90, 0xc9, 0xe2, 0xbc, 0xfa, 0x94, 0x87, 0x86, 0x09, 0x19, 0x71, 0x29, 0x53, 0x77, 0xd2, 0x24, 0xf8, 0x69, 0xcb, 0x14, 0x34, 0x51, 0x58, 0x89, 0xa2, 0xd6, 0x17, 0xf2, 0xee, 0x51, 0x4f, 0x03, 0x9a, 0x9e, 0x6f, 0x58, 0x5f, 0xb8, 0xf9, 0x0f, 0x4f, 0x9c, 0x11, 0x64, 0x84, 0xa2, 0x89, 0x94, 0xca, 0x9a, 0x7a, 0x9e, 0xd1, 0xf8, 0x92, 0x4e, 0x45, 0xae, 0xd1, 0xab, 0x09, 0x4f, 0x0b, 0x32, 0x76, 0xf0, 0x39, 0x55, 0x77, 0x1e, 0xfe, 0xa5, 0xc2, 0xce, 0x3d, 0x3b, 0xd5, 0xc6, 0x6d, 0xb6, 0x70, 0x7a, 0x2b, 0x64, 0x20, 0x47, 0x71, 0x23, 0xf9, 0x40, 0x58, 0xd2, 0x68, 0x66, 0xf2, 0x8b, 0x48, 0xfa, 0x66, 0xa4, 0x80, 0x13, 0x4a, 0xc3, 0xe5, 0x2e, 0x65, 0xae, 0xd8, 0x61, 0xfb, 0xba, 0x67, 0x8d, 0x20, 0x54, 0x07, 0xa4, 0x91, 0x2f, 0x94, 0x08, 0x7c, 0xae, 0xc3, 0x6e, 0x79, 0x3a, 0xf4, 0xa3, 0xe9, 0xaf, 0xf7, 0x7b, 0x13, 0xa7, 0x29, 0xdb, 0xf5, 0x93, 0x3e, 0x9a, 0x14, 0xd6, 0x61, 0x45, 0x52, 0x9b, 0x19, 0xfe, 0xa3, 0x85, 0xc4, 0x00, 0x13, 0x31, 0xc8, 0x0d, 0x72, 0x72, 0x8e, 0x68, 0xd0, 0x82, 0x4f, 0x4b, 0xe5, 0x13, 0xe1, 0x96, 0x18, 0xb3, 0x8d, 0xcc, 0x50, 0x59, 0x2a, 0x46, 0xb2, 0x21, 0x98, 0x78, 0xf6, 0xf6, 0xc6, 0x3d, 0xce, 0x38, 0x92, 0x21, 0x33, 0x2a, 0x76, 0x70, 0xec, 0x58, 0x72, 0xfa, 0xde, 0x64, 0xda, 0x08, 0xc9, 0x93, 0x4c, 0xde, 0x1c, 0x86, 0x35, 0x52, 0x58, 0x5b, 0xb0, 0x8e, 0x03, 0x6e, 0x7e, 0xab, 0x11, 0x5e, 0x67, 0x18, 0x74, 0xc5, 0x83, 0xab, 0x6c, 0x10, 0x38, 0x73, 0x0f, 0x2e, 0x92, 0x28, 0x61, 0x7a, 0xd6, 0x45, 0xcb, 0xc0, 0x35, 0x57, 0x72, 0x03, 0x11, 0x12, 0x1f, 0x2b, 0x5d, 0xee, 0x9b, 0xdb, 0xa9, 0x10, 0xd6, 0x21, 0xb0, 0x1e, 0xfd, 0xbe, 0x6e, 0x4b, 0x27, 0xec, 0xc7, 0xc5, 0x46, 0xde, 0x0a, 0x53, 0x53, 0x64, 0xcf, 0x35, 0xc7, 0xf5, 0x02, 0x3a, 0x39, 0xb9, 0xf9, 0xfb, 0x2a, 0x8d, 0xc7, 0x67, 0x63, 0x09, 0x5e, 0x09, 0xd9, 0x16, 0x27, 0x8c, 0x9a, 0xfb, 0xb6, 0xf9, 0x5d, 0xa8, 0x37, 0x92, 0xde, 0x9f, 0x7b, 0x0b, 0x2d, 0xb1, 0x48, 0x09, 0x2e, 0x2e, 0x6a, 0x1c, 0x05, 0x2f, 0x27, 0x83, 0xf5, 0x37, 0xd2, 0x3f, 0xf3, 0x2c, 0x45, 0x80, 0xdc, 0x31, 0x68, 0x05, 0x81, 0x65, 0xa3, 0x1b, 0x6e, 0x5c, 0xaa, 0xf8, 0xa6, 0x60, 0x6a, 0x2e, 0x4d, 0x9d, 0x9c, 0x2f, 0xbf, 0x4c, 0x2e, 0xf3, 0x01, 0xc0, 0xa5, 0x59, 0x00, 0x7d, 0x61, 0x42, 0x21, 0xec, 0x2b, 0x13, 0xfd, 0x3c, 0x45, 0xb4, 0xcd, 0x01, 0x7c, 0x40, 0x47, 0x50, 0xdc, 0x7a, 0x33, 0x26, 0xc0, 0x9a, 0xb9, 0xf4, 0x8c, 0xa8, 0x00, 0xfb, 0x51, 0xbf, 0x04, 0x9b, 0x92, 0x4b, 0xd8, 0x06, 0xb2, 0x71, 0x8b, 0x3a, 0xee, 0x69, 0xc0, 0x2c, 0xc9, 0x5f, 0x57, 0x45, 0x62, 0xa2, 0xdc, 0x89, 0x14, 0xcb, 0x40, 0x74, 0xbb, 0x99, 0x56, 0x0c, 0xb5, 0xdd, 0x11, 0x12, 0xc3, 0x9b, 0x5e, 0x17, 0xdd, 0x4d, 0xcf, 0x1c, 0x4b, 0x5f, 0x3e, 0xd2, 0x45, 0x20, 0x12, 0xc2, 0xeb, 0x70, 0x09, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x02, 0xe4, 0x61, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xe0, 0x07, 0xec, 0x81, 0x00, 0x00, 0xb3, 0x9c, 0x26, 0x3a, 0x16, 0x44, 0x6e, 0xe1, 0xfb, 0x28, 0x93, 0x4d, 0x84, 0x3a, 0x9f, 0xe0, 0xb6, 0x9c, 0x08, 0xe9, 0xb2, 0x19, 0xe5, 0xb2, 0xb4, 0x79, 0x1c, 0x3c, 0x44, 0xa3, 0xe5, 0x33, 0x62, 0xf2, 0x26, 0xdd, 0xef, 0x55, 0x90, 0x47, 0x4c, 0xb6, 0xc2, 0x33, 0x7f, 0xc4, 0xd0, 0x9d, 0x79, 0xcd, 0x9b, 0xf0, 0x47, 0xe4, 0x57, 0xa5, 0x81, 0x51, 0xd8, 0x0c, 0x8d, 0xa4, 0x73, 0xd9, 0xae, 0x6f, 0xaa, 0xfc, 0x73, 0x96, 0xe1, 0x01, 0x40, 0xe8, 0x30, 0xb7, 0x8d, 0x11, 0x95, 0x0d, 0xc8, 0x31, 0x8e, 0x24, 0x93, 0x6e, 0xb4, 0xfc, 0xe8, 0xe0, 0x94, 0x29, 0x6a, 0x6e, 0x98, 0x01, 0x6d, 0x04, 0xde, 0x04, 0xac, 0xf0, 0xcf, 0x89, 0xaf, 0x79, 0xd6, 0xc1, 0xf4, 0x82, 0x90, 0x78, 0xd0, 0x91, 0x8c, 0x6f, 0x0d, 0xc8, 0x80, 0xce, 0x67, 0x3f, 0x2a, 0x86, 0x43, 0x4a, 0x6e, 0x33, 0x87, 0x9c, 0xc5, 0x72, 0xae, 0xc1, 0x90, 0xda, 0x96, 0x46, 0xf1, 0x86, 0x0c, 0x3b, 0xe1, 0x52, 0xad, 0x7b, 0x90, 0xbe, 0x81, 0x91, 0x22, 0xa5, 0xee, 0x65, 0xef, 0xb4, 0x3c, 0xd6, 0x21, 0xd5, 0x30, 0xc7, 0x24, 0x4f, 0x2a, 0x70, 0x81, 0xf4, 0x27, 0xab, 0x2f, 0x2d, 0x75, 0xc6, 0x34, 0xda, 0x36, 0x3c, 0xfa, 0x55, 0x79, 0xd1, 0xe3, 0xee, 0xcd, 0x88, 0x84, 0xd7, 0x1e, 0x95, 0x9c, 0x68, 0x73, 0x07, 0xbb, 0xff, 0x9b, 0x50, 0xbc, 0xdf, 0x12, 0xde, 0xfb, 0xb4, 0x14, 0xe1, 0x41, 0x9f, 0x1e, 0xe3, 0x96, 0xb3, 0xc4, 0x12, 0x2b, 0x7f, 0xb6, 0x73, 0x7c, 0x25, 0x66, 0xa9, 0x6d, 0x4b, 0x81, 0x7f, 0xda, 0x66, 0x88, 0xca, 0x9a, 0x40, 0xa8, 0x57, 0xed, 0x56, 0x7b, 0x39, 0xe9, 0x53, 0x00, 0xeb, 0x7c, 0x7b, 0x7e, 0x96, 0x21, 0x78, 0x13, 0xee, 0x24, 0x52, 0xdd, 0x14, 0x54, 0xc7, 0x98, 0xff, 0x01, 0x9f, 0x63, 0x3b, 0xc1, 0x11, 0x31, 0x96, 0x63, 0x2b, 0xca, 0x38, 0x9d, 0xb3, 0xda, 0xcb, 0x48, 0x72, 0xa2, 0x60, 0xaa, 0x4e, 0xb4, 0xb3, 0xad, 0x66, 0xed, 0x2c, 0x27, 0x43, 0xa2, 0x88, 0x05, 0x39, 0x62, 0x47, 0x79, 0x9d, 0x3f, 0xe3, 0x7d, 0xc5, 0xfb, 0x9f, 0x6a, 0x72, 0xce, 0x24, 0xbf, 0x61, 0x02, 0x23, 0xde, 0x00, 0x84, 0xcc, 0xd8, 0xd5, 0x8e, 0xe3, 0xd3, 0xc9, 0x47, 0x29, 0x83, 0x7a, 0x81, 0xc0, 0x52, 0xcb, 0x4e, 0x1f, 0x61, 0x16, 0x3f, 0x95, 0xc8, 0x2a, 0xf9, 0x0d, 0x3b, 0xb2, 0x6f, 0x2b, 0x89, 0x22, 0xd4, 0xf3, 0x62, 0xc8, 0x49, 0x45, 0xce, 0x7d, 0xa9, 0x4b, 0xc5, 0x02, 0x17, 0x96, 0x9c, 0xcd, 0x87, 0x99, 0x1c, 0xa8, 0xb3, 0xb3, 0xf9, 0xab, 0x27, 0x04, 0xf9, 0x3a, 0xf9, 0xd8, 0x92, 0xb8, 0x3f, 0x3c, 0x66, 0x0e, 0x62, 0xf9, 0x86, 0xfe, 0x4e, 0xe6, 0x57, 0xf7, 0xa2, 0x7f, 0x0b, 0x7f, 0xf5, 0x42, 0xbb, 0xb0, 0x5e, 0xc2, 0xc3, 0x4c, 0x8f, 0xc7, 0x97, 0xa8, 0x63, 0xbb, 0x20, 0x41, 0xc8, 0x67, 0x61, 0x08, 0x27, 0x4a, 0x4b, 0x72, 0x81, 0x4c, 0xca, 0x85, 0xed, 0x93, 0x81, 0x41, 0x60, 0x16, 0x85, 0xaa, 0x7e, 0x56, 0x07, 0x65, 0xd3, 0xe9, 0x35, 0x0b, 0xf7, 0x96, 0xbc, 0x00, 0x31, 0x5a, 0xae, 0x68, 0xe7, 0x94, 0x97, 0x29, 0x2a, 0xec, 0x0b, 0xc7, 0x89, 0xa0, 0x03, 0xd2, 0xc0, 0x35, 0x11, 0xa9, 0xe7, 0x19, 0x6e, 0x5b, 0x83, 0x40, 0xe6, 0xf5, 0xf4, 0x90, 0x6c, 0xdc, 0x8c, 0xe4, 0xac, 0xde, 0xb7, 0x9f, 0x15, 0x54, 0xaa, 0x46, 0x56, 0xf1, 0x60, 0xe6, 0x77, 0x1b, 0x80, 0xa5, 0x21, 0xb9, 0x5b, 0x93, 0x6d, 0x7e, 0xf0, 0x06, 0x5f, 0x65, 0xc7, 0xdc, 0x5f, 0x12, 0x88, 0x31, 0x2f, 0x78, 0x8b, 0x56, 0xea, 0x23, 0x9a, 0xf7, 0x7c, 0xcc, 0x96, 0x56, 0xc8, 0x49, 0x86, 0xb0, 0x90, 0x71, 0xc0, 0x83, 0xc5, 0xdd, 0xa3, 0x40, 0xa2, 0x11, 0x7d, 0xc3, 0xc5, 0x07, 0x05, 0xe1, 0x19, 0x6c, 0xed, 0x23, 0x01, 0xf8, 0xbe, 0x96, 0xa9, 0x6f, 0x66, 0xb3, 0xcd, 0x88, 0xc2, 0xf0, 0x19, 0xaf, 0x4b, 0x79, 0x16, 0xdf, 0x84, 0x28, 0x28, 0x3e, 0x05, 0xe4, 0xcb, 0xf7, 0x69, 0x45, 0xf8, 0x31, 0xb9, 0x35, 0xad, 0xc0, 0x71, 0xf5, 0xd9, 0x38, 0xc7, 0xa2, 0xd3, 0xf6, 0x5b, 0xf6, 0xb4, 0xc0, 0x3d, 0x3f, 0x1d, 0xdf, 0xad, 0x05, 0xf6, 0x15, 0x01, 0x1f, 0xdd, 0x03, 0x3d, 0x9e, 0xb5, 0x9a, 0x16, 0xdc, 0xf5, 0x6c, 0x8e, 0x59, 0x03, 0xa8, 0x84, 0x6b, 0x16, 0x43, 0xf0, 0x57, 0xcb, 0x5e, 0xa4, 0x74, 0x26, 0x88, 0xac, 0x41, 0x8d, 0x97, 0xd0, 0x69, 0x6c, 0xeb, 0x32, 0xc4, 0xda, 0x5e, 0x02, 0xa2, 0x36, 0x5e, 0x07, 0x81, 0x26, 0x38, 0x0c, 0x73, 0x26, 0x12, 0x8f, 0x90, 0xff, 0xdc, 0x5b, 0x69, 0xd9, 0x2f, 0xc4, 0x67, 0xbb, 0xc6, 0x14, 0x36, 0xba, 0xee, 0x3b, 0x2c, 0xb4, 0x22, 0x13, 0x89, 0x2e, 0xf4, 0x65, 0x1d, 0x22, 0x19, 0xbe, 0x9c, 0xf4, 0x00, 0x6c, 0xb2, 0x42, 0x5b, 0x65, 0x1a, 0x8a, 0x11, 0xae, 0xf6, 0x29, 0x8a, 0xbc, 0xef, 0xce, 0x8d, 0xeb, 0x7a, 0x9e, 0xb7, 0xb3, 0x5d, 0xfa, 0x07, 0xa4, 0x98, 0xa2, 0xbc, 0xbc, 0xb6, 0xca, 0x72, 0x00, 0x7c, 0xbf, 0xde, 0xe9, 0x5c, 0x12, 0x1f, 0x1e, 0x03, 0xaa, 0x15, 0xde, 0x7e, 0xfc, 0xfa, 0x4c, 0x97, 0x21, 0x77, 0xb1, 0xfa, 0x16, 0xa8, 0x8d, 0x88, 0x00, 0xc5, 0x9b, 0xb2, 0x2e, 0xd3, 0x65, 0xfc, 0x68, 0x44, 0x86, 0xf1, 0x08, 0xec, 0xa7, 0x88, 0xcd, 0x56, 0xf1, 0x09, 0x55, 0x1e, 0x6a, 0x6b, 0x71, 0x4b, 0x7b, 0x7f, 0x58, 0xf0, 0xd7, 0xd7, 0xe6, 0xb9, 0xe6, 0x5e, 0xef, 0xa2, 0xc0, 0x24, 0x8a, 0xee, 0xd5, 0xeb, 0x38, 0x0e, 0x9b, 0x18, 0x8b, 0x9c, 0x5f, 0xb2, 0x1e, 0x21, 0xb5, 0x1f, 0xb7, 0xef, 0xf5, 0xa4, 0xdf, 0xae, 0x07, 0xcd, 0xf8, 0x7f, 0xe4, 0x13, 0x0a, 0x90, 0x2e, 0x2a, 0x6d, 0xd3, 0x2b, 0x30, 0x06, 0x2f, 0xea, 0xd7, 0x26, 0x06, 0x94, 0xc3, 0x97, 0x6e, 0x00, 0x29, 0x80, 0x85, 0xa9, 0xb9, 0xfc, 0x86, 0x52, 0x78, 0x19, 0xdc, 0x82, 0xc7, 0xae, 0xda, 0x54, 0xc3, 0x27, 0x6d, 0xf9, 0x2e, 0xf8, 0x62, 0xcf, 0xe7, 0xd1, 0x27, 0x44, 0x2b, 0x7f, 0x97, 0xf1, 0xe7, 0x1a, 0x4f, 0x0d, 0xae, 0x93, 0x77, 0x96, 0x41, 0xfb, 0x3c, 0x40, 0xb0, 0xc2, 0xef, 0x5e, 0x7b, 0x50, 0x4e, 0xb3, 0x73, 0xbb, 0xf9, 0x29, 0x22, 0x82, 0x3a, 0x0f, 0xf9, 0x99, 0x42, 0x1a, 0xf5, 0x4e, 0x13, 0xa1, 0x16, 0xc5, 0x00, 0xd9, 0xa6, 0x25, 0xdd, 0x14, 0xf8, 0xd7, 0x87, 0xc7, 0x67, 0x13, 0xc4, 0x09, 0xaa, 0xa9, 0xab, 0x51, 0x2b, 0xf2, 0xbf, 0x81, 0xfb, 0xcd, 0x8d, 0x53, 0xf7, 0xc7, 0x9b, 0xe2, 0xdc, 0xe9, 0x7c, 0xa3, 0x27, 0x79, 0xe4, 0xc5, 0x00, 0x8f, 0x40, 0xf8, 0x71, 0xcf, 0x80, 0xf6, 0xa2, 0xc2, 0x9e, 0x62, 0xcc, 0x71, 0x2c, 0xc8, 0x88, 0xde, 0x76, 0xdd, 0x5e, 0xfa, 0xbc, 0xdd, 0x9e, 0x30, 0xbd, 0x2f, 0x90, 0x0d, 0x0b, 0x3f, 0x66, 0x5a, 0xb3, 0x76, 0x0f, 0x3a, 0xd8, 0x14, 0xec, 0xc2, 0x24, 0x56, 0x5b, 0xe2, 0xf8, 0xe2, 0xac, 0x05, 0x70, 0x92, 0xf6, 0x5b, 0xf5, 0x77, 0x60, 0xa8, 0x55, 0xbe, 0x6a, 0xf1, 0x54, 0x87, 0x62, 0xfe, 0x0c, 0xb5, 0x2c, 0x25, 0x8f, 0xc7, 0xff, 0xdf, 0x0e, 0x66, 0x2a, 0xd5, 0xb2, 0x4d, 0x75, 0x8e, 0xa7, 0xcc, 0x17, 0x10, 0x32, 0xfb, 0xeb, 0x67, 0xc0, 0x19, 0x80, 0x0d, 0xd0, 0xfc, 0x69, 0xaa, 0xd0, 0xe1, 0x9e, 0xff, 0xd6, 0x41, 0xbb, 0xe9, 0x1a, 0x04, 0x13, 0x4f, 0x82, 0x1e, 0x30, 0x20, 0xea, 0x77, 0x85, 0x05, 0x75, 0x6c, 0x0c, 0xc8, 0x66, 0x62, 0x77, 0xbd, 0xaf, 0xf3, 0xfa, 0x06, 0x4b, 0xb9, 0xc3, 0xb2, 0xc3, 0x63, 0x64, 0x02, 0x81, 0x2a, 0x8d, 0x02, 0x5a, 0x87, 0x94, 0x0f, 0x4f, 0x22, 0x1e, 0x30, 0x4c, 0x44, 0xac, 0xf0, 0x2d, 0x87, 0xe1, 0x56, 0x61, 0xe9, 0xa6, 0xcc, 0xa6, 0x39, 0xba, 0xac, 0xeb, 0x49, 0x7c, 0x04, 0xbb, 0xeb, 0x77, 0x5c, 0x9b, 0xc8, 0x69, 0xf4, 0x9a, 0xfb, 0xac, 0xa6, 0x54, 0xd7, 0x7b, 0x4e, 0x53, 0x74, 0x95, 0x6a, 0xa2, 0x7a, 0x9b, 0x10, 0x0a, 0x10, 0x1d, 0xae, 0x4e, 0xf7, 0xf4, 0x38, 0xd7, 0x4f, 0x94, 0xb4, 0xc1, 0x16, 0xee, 0xce, 0xab, 0x0f, 0xaf, 0x89, 0x85, 0x2a, 0x66, 0xb9, 0x5c, 0xfb, 0xf8, 0xd1, 0xa8, 0xc5, 0x01, 0xf6, 0x98, 0xac, 0x77, 0xce, 0x4b, 0xaa, 0xc3, 0xe3, 0x1d, 0x23, 0x23, 0xec, 0xb4, 0x92, 0xcf, 0xa5, 0xbf, 0x9f, 0xac, 0x92, 0x6f, 0xa7, 0xdf, 0xf4, 0x46, 0x81, 0x3d, 0x93, 0x85, 0x03, 0x7a, 0x7a, 0x65, 0xed, 0xe1, 0x22, 0xd5, 0x5a, 0xcb, 0x9b, 0x6b, 0x3c, 0xa0, 0x81, 0xc3, 0xc2, 0x3b, 0x8c, 0x2e, 0x7e, 0xfb, 0xf2, 0x97, 0x9d, 0x2b, 0x5f, 0x81, 0x31, 0xdc, 0xce, 0xec, 0x88, 0x9c, 0x70, 0x84, 0xed, 0x5f, 0xac, 0xbd, 0x76, 0x0e, 0xab, 0x1f, 0x15, 0x97, 0xbe, 0xd1, 0x74, 0x5d, 0x3a, 0x0a, 0xe0, 0xd7, 0x4a, 0x79, 0xb0, 0xd2, 0xf5, 0x70, 0x72, 0x6a, 0xa0, 0x50, 0xd2, 0x15, 0x97, 0xc9, 0xb6, 0x6f, 0x3c, 0xd7, 0x71, 0x94, 0x64, 0x7e, 0x15, 0xa1, 0x90, 0xe2, 0xa4, 0xed, 0xef, 0x00, 0x4d, 0xb8, 0xea, 0x48, 0x00, 0x18, 0x73, 0x24, 0x54, 0xb7, 0x96, 0x37, 0x5f, 0x04, 0xb3, 0x50, 0x06, 0xfe, 0x1c, 0x2e, 0x23, 0x19, 0xce, 0x8a, 0x64, 0x02, 0xfa, 0x6e, 0x77, 0xd2, 0xd4, 0x0b, 0x96, 0xc5, 0xfa, 0x04, 0xc5, 0x35, 0x24, 0x9d, 0x55, 0x6a, 0xac, 0x4e, 0x2a, 0x85, 0x44, 0xa8, 0xba, 0xde, 0x2d, 0x54, 0x26, 0xf4, 0x51, 0x78, 0x47, 0x93, 0x0b, 0x00, 0xa8, 0x88, 0x24, 0xac, 0x05, 0x56, 0x6c, 0xb7, 0xe0, 0x4c, 0xc6, 0xc4, 0x74, 0xe7, 0xc5, 0x77, 0xfd, 0x8f, 0x3a, 0x77, 0x1b, 0xb8, 0xc7, 0xca, 0x12, 0x9c, 0xcc, 0x86, 0x0a, 0x77, 0xba, 0x1d, 0x79, 0x42, 0xba, 0x01, 0x52, 0x97, 0x9d, 0x84, 0xdb, 0xdc, 0xbf, 0x27, 0x1e, 0x82, 0x22, 0x2e, 0x10, 0xb3, 0x1a, 0x2a, 0x95, 0x34, 0x84, 0x1d, 0x68, 0xda, 0xec, 0xc3, 0xc7, 0x19, 0xcb, 0xe1, 0x12, 0x98, 0xac, 0x78, 0xad, 0x18, 0xe7, 0xa0, 0xfe, 0x26, 0xae, 0xd7, 0xda, 0x38, 0xce, 0x83, 0x0d, 0xdb, 0x0d, 0xea, 0x02, 0x21, 0x3e, 0x03, 0x71, 0x9a, 0x4d, 0xc6, 0x2f, 0x8a, 0xe6, 0x5f, 0x12, 0x60, 0xfe, 0x88, 0x4b, 0x1d, 0x1f, 0x9c, 0x6f, 0x72, 0x0e, 0xdb, 0x5d, 0xcf, 0x19, 0x95, 0xeb, 0x9e, 0x18, 0xa6, 0x14, 0xe2, 0x81, 0x50, 0x45, 0x7d, 0x0b, 0xb4, 0x27, 0x56, 0xda, 0x22, 0x9a, 0x4b, 0x98, 0xed, 0x3e, 0x0e, 0xd8, 0xe7, 0x96, 0xe9, 0xa0, 0x5b, 0x41, 0xbe, 0x3a, 0x5c, 0x11, 0x99, 0x98, 0x86, 0x5a, 0xe6, 0xba, 0xe5, 0xc7, 0x3f, 0xa8, 0x13, 0x26, 0x26, 0x53, 0x4c, 0x8b, 0x76, 0xa6, 0xee, 0x0f, 0x04, 0x02, 0x5d, 0x34, 0xf1, 0x94, 0x79, 0x4d, 0x44, 0x8d, 0x8b, 0xf6, 0x9e, 0xbf, 0x3c, 0x88, 0xee, 0xcf, 0x75, 0x28, 0xfe, 0xfb, 0x89, 0x77, 0xb7, 0x33, 0xd9, 0xe0, 0x3c, 0x92, 0x14, 0x1c, 0x8e, 0xcb, 0x9b, 0x49, 0x4b, 0xd7, 0x02, 0x4d, 0xdd, 0xea, 0x57, 0x5c, 0x03, 0xd2, 0xbe, 0x06, 0x67, 0x75, 0x55, 0x48, 0x06, 0x78, 0xc6, 0x6f, 0xe9, 0x80, 0x61, 0xc3, 0xc5, 0xeb, 0xdd, 0x44, 0xd7, 0xd6, 0x22, 0x13, 0xeb, 0x4b, 0x22, 0xfc, 0xfa, 0xa0, 0xa9, 0xd7, 0x6f, 0x20, 0x29, 0x74, 0xe9, 0x27, 0x19, 0xbc, 0x57, 0x30, 0x91, 0x1c, 0x16, 0x86, 0x7a, 0xf4, 0x71, 0xbe, 0x67, 0x33, 0xde, 0xfc, 0x96, 0x61, 0xa9, 0x8e, 0x9b, 0x3f, 0x7e, 0xc9, 0xb2, 0xe2, 0xea, 0x07, 0xe2, 0x0c, 0xf6, 0x58, 0x12, 0x2d, 0x18, 0x73, 0x9e, 0x8b, 0xfe, 0xe1, 0x7c, 0x55, 0x7c, 0x81, 0x35, 0x85, 0x0d, 0xf1, 0x0d, 0xa2, 0x0a, 0x5f, 0x32, 0x52, 0x90, 0xd5, 0xad, 0xc4, 0xcc, 0xdf, 0x2f, 0xd4, 0xf1, 0x65, 0xeb, 0xdd, 0xf0, 0x77, 0x9e, 0x70, 0x25, 0x8d, 0x44, 0xae, 0x6b, 0x25, 0x1b, 0x1a, 0xce, 0x39, 0x2e, 0xe0, 0xc7, 0xa4, 0xc5, 0x8a, 0x96, 0xd7, 0x25, 0x28, 0xb2, 0x38, 0x35, 0x62, 0xbd, 0x8b, 0x12, 0x84, 0x47, 0xa4, 0xf3, 0x72, 0x06, 0x33, 0x7f, 0xc7, 0x35, 0xa5, 0x5c, 0x8b, 0x57, 0x9d, 0xd5, 0x3f, 0xc6, 0x64, 0xa8, 0xaf, 0xbf, 0x51, 0x8f, 0xcc, 0x88, 0x15, 0x34, 0xea, 0xc3, 0x13, 0x71, 0x02, 0x12, 0xa6, 0xb9, 0x01, 0x58, 0xe7, 0x3a, 0x24, 0x8f, 0x31, 0xa7, 0xfb, 0x4d, 0x1e, 0x76, 0x44, 0xb2, 0xd8, 0x15, 0xe5, 0xf6, 0x79, 0x37, 0x00, 0x0d, 0x3f, 0x12, 0xcf, 0x2b, 0x10, 0xa2, 0x51, 0x28, 0x99, 0x88, 0xc6, 0x33, 0xf7, 0xf3, 0x3f, 0xf9, 0xd2, 0xa9, 0x00, 0x3a, 0x1f, 0xfa, 0x28, 0xb2, 0xe5, 0x2c, 0xd0, 0x7d, 0x9a, 0x14, 0xcd, 0x2e, 0x20, 0x27, 0x71, 0x57, 0x73, 0x78, 0x61, 0x99, 0x9b, 0x2b, 0x98, 0xa0, 0x0b, 0xf3, 0x4a, 0x36, 0x1c, 0xd1, 0x38, 0x91, 0xda, 0x0c, 0xf2, 0x38, 0x27, 0x41, 0x69, 0xa7, 0xe9, 0x88, 0x9d, 0xe8, 0xcf, 0xe7, 0x0c, 0xe2, 0x61, 0x25, 0x5a, 0xb4, 0xce, 0x4e, 0x1d, 0xbd, 0x6f, 0x8f, 0x06, 0x20, 0xb1, 0x4a, 0x24, 0x46, 0x84, 0xfe, 0xaa, 0x82, 0x07, 0x59, 0x08, 0x79, 0xd9, 0xc3, 0xb5, 0x14, 0xce, 0x1a, 0xd8, 0x76, 0x06, 0x39, 0x09, 0x2f, 0x18, 0x4e, 0x6b, 0x1c, 0xe3, 0xb6, 0xff, 0x96, 0xbe, 0x39, 0x8d, 0xa1, 0x46, 0xe4, 0x3b, 0xeb, 0x85, 0xf5, 0xe5, 0x7c, 0x05, 0xf2, 0x39, 0xcd, 0x0d, 0x7b, 0xa0, 0x95, 0x5c, 0x03, 0x99, 0xaa, 0x53, 0xca, 0x12, 0xb3, 0x25, 0x9a, 0x0a, 0x2f, 0x4b, 0x3f, 0x89, 0x28, 0x12, 0x27, 0x31, 0x2c, 0xce, 0x55, 0x2f, 0x4d, 0xb1, 0xfb, 0x2a, 0x5e, 0x3b, 0x8f, 0x73, 0x1d, 0x4d, 0xfa, 0x20, 0x8f, 0x3b, 0x8d, 0x83, 0x08, 0xb3, 0x53, 0xb6, 0x0f, 0xcb, 0xe9, 0xa3, 0xde, 0x25, 0xa1, 0xbc, 0x0e, 0x1c, 0x15, 0x9c, 0xc4, 0x2f, 0xee, 0x39, 0x41, 0xf9, 0xe4, 0x57, 0x14, 0xf3, 0x4a, 0x92, 0xeb, 0xae, 0xbf, 0x1c, 0x18, 0x01, 0xbd, 0x78, 0xa1, 0xf6, 0xbe, 0x40, 0x0e, 0xcb, 0x35, 0x1c, 0x7e, 0x17, 0x8c, 0x2e, 0xc3, 0xb3, 0x8d, 0xa1, 0xbe, 0xec, 0x04, 0x35, 0x6a, 0x2f, 0xe0, 0xd0, 0x94, 0x63, 0xca, 0x86, 0x19, 0x1a, 0xdc, 0x70, 0xf9, 0x5d, 0x06, 0xf1, 0xeb, 0x4c, 0x04, 0x05, 0x25, 0x7e, 0xe1, 0xfa, 0x14, 0x01, 0x06, 0x21, 0x95, 0x50, 0x8b, 0x3f, 0xd8, 0xee, 0x11, 0xc2, 0x79, 0xb7, 0x54, 0x50, 0x66, 0x0d, 0xed, 0x83, 0x5c, 0x38, 0xed, 0x54, 0x11, 0x0a, 0xb3, 0x52, 0x50, 0x05, 0x7a, 0x58, 0xb9, 0xe2, 0xea, 0xde, 0x00, 0x00, 0x01, 0xb7 }; +constexpr AccessUnit M2V_LARGE_AU_EXPECTED_AU = { 0x15f90, 0x159b2, true, 0, {}, { 0x60, 0x03, 0x38, 0xf1, 0x3d, 0xc4, 0xab, 0x4f, 0x09, 0xbd, 0xc3, 0xae, 0x12, 0xf0, 0xc2, 0xb8, 0x16, 0x3e, 0xa1, 0x92 } }; + +const std::vector ATRACX_LARGE_AU_STREAM = { 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xbd, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xd0, 0xfd, 0xff, 0xe6, 0x35, 0x3c, 0xd3, 0x39, 0xd0, 0x8e, 0x3e, 0x56, 0x34, 0x97, 0x50, 0xf0, 0x75, 0x62, 0x8f, 0x4f, 0x2e, 0x75, 0x9c, 0x56, 0xc5, 0xcb, 0x1f, 0xa9, 0x84, 0xd5, 0xe2, 0x85, 0xec, 0xcf, 0x29, 0xcc, 0xbd, 0xc6, 0x77, 0xff, 0x7d, 0x1b, 0xec, 0x2c, 0x85, 0x65, 0x1f, 0xeb, 0x71, 0x26, 0x0d, 0x71, 0x01, 0x09, 0x7a, 0xb2, 0xed, 0x0b, 0x50, 0x39, 0x71, 0x96, 0xc9, 0x38, 0x98, 0x7b, 0x43, 0x4c, 0xa1, 0x7f, 0xac, 0xe2, 0x26, 0x30, 0xfc, 0xc0, 0x89, 0xb2, 0x6b, 0x09, 0xbf, 0x39, 0x02, 0x2f, 0x9f, 0x40, 0x3d, 0x17, 0xd3, 0x29, 0x03, 0xa4, 0x28, 0x30, 0x55, 0xa9, 0x36, 0x87, 0x10, 0xf3, 0x31, 0x88, 0x89, 0xda, 0x33, 0x88, 0x04, 0x49, 0x00, 0x81, 0x49, 0x5c, 0xe3, 0x8c, 0x83, 0x11, 0xc0, 0x84, 0xcd, 0xb5, 0x95, 0x29, 0x91, 0x83, 0x4b, 0xc8, 0x50, 0xf4, 0x5d, 0xb5, 0xeb, 0x28, 0xdc, 0x3a, 0x79, 0x68, 0x6e, 0x2b, 0x78, 0x06, 0x67, 0x83, 0x3b, 0x10, 0x7e, 0xba, 0x58, 0x72, 0x06, 0xce, 0x41, 0xed, 0xe1, 0xb7, 0x4d, 0x0e, 0x3d, 0x4a, 0xc2, 0x0b, 0xb7, 0xb1, 0x3b, 0x9a, 0x23, 0x6e, 0x1c, 0xaf, 0x02, 0xfa, 0x73, 0x0d, 0x58, 0x15, 0x33, 0x4f, 0x2f, 0x6b, 0x91, 0x82, 0x1a, 0x8d, 0xb6, 0xc2, 0x44, 0x96, 0x08, 0x9e, 0x69, 0x53, 0xb1, 0x5b, 0x2d, 0x3d, 0xa4, 0xac, 0xac, 0xf1, 0x54, 0xb3, 0xfe, 0x6a, 0x21, 0x67, 0x19, 0xfa, 0x37, 0x99, 0x41, 0x08, 0x81, 0xf6, 0xac, 0x12, 0x1d, 0x98, 0xef, 0x7a, 0x4b, 0xcc, 0xb2, 0xea, 0xdb, 0x08, 0x5e, 0xad, 0x02, 0xe6, 0x6e, 0x83, 0x10, 0x12, 0x3b, 0x7e, 0xc7, 0xdc, 0xc0, 0xd7, 0x26, 0x48, 0x6a, 0x66, 0x01, 0x11, 0x35, 0xc3, 0x4a, 0xce, 0xd6, 0x03, 0xe7, 0x29, 0x6a, 0x22, 0x3a, 0x8e, 0x55, 0x8c, 0x8a, 0xc8, 0xad, 0x3b, 0x22, 0xb9, 0xfa, 0xc1, 0x05, 0x4e, 0xd2, 0x9e, 0x84, 0xdf, 0x6f, 0xec, 0x2a, 0x75, 0x9b, 0x7f, 0xcc, 0x3b, 0xeb, 0x59, 0xb9, 0xf3, 0x02, 0x99, 0x50, 0x79, 0x41, 0x1e, 0x58, 0x8b, 0x6c, 0x39, 0x08, 0xce, 0x90, 0xb6, 0x5c, 0x59, 0x2c, 0x0b, 0xd2, 0xa0, 0xae, 0x47, 0xa9, 0x01, 0x81, 0xe4, 0xda, 0x5c, 0xdb, 0x68, 0xac, 0xda, 0xa5, 0xcf, 0xfe, 0x71, 0xed, 0xab, 0x00, 0x4a, 0xcf, 0x62, 0x95, 0xce, 0x74, 0xf4, 0x48, 0x18, 0xab, 0x00, 0xe2, 0x43, 0x5a, 0x9f, 0xff, 0x03, 0xdd, 0xd5, 0xd3, 0xd4, 0x22, 0xcb, 0x83, 0x9d, 0x0f, 0xd0, 0x43, 0x1f, 0x3d, 0xfa, 0x0c, 0x39, 0x89, 0x33, 0x4f, 0x6c, 0xdd, 0x40, 0x8e, 0xb8, 0x4d, 0x75, 0x38, 0x3d, 0x1e, 0x6c, 0x0a, 0x8f, 0xd4, 0x07, 0x71, 0xcf, 0x8b, 0xa8, 0x65, 0x4a, 0xb4, 0xc9, 0x9f, 0x4a, 0x6f, 0xee, 0xab, 0x2a, 0xee, 0xc1, 0x5b, 0x88, 0xe6, 0x93, 0x7c, 0x7b, 0x23, 0xee, 0x1a, 0xab, 0xb6, 0x82, 0x03, 0x63, 0x24, 0x8e, 0xea, 0xd3, 0xdc, 0x1f, 0x8e, 0x3d, 0x6a, 0xb9, 0x96, 0x79, 0xd2, 0x8f, 0x37, 0x23, 0x9d, 0x1b, 0x58, 0x38, 0xb4, 0x9e, 0x50, 0x8e, 0x13, 0x00, 0xcc, 0x22, 0x17, 0x25, 0x04, 0xde, 0x29, 0xea, 0x36, 0xac, 0x1a, 0x70, 0x7a, 0x15, 0x22, 0xbd, 0x14, 0x70, 0x08, 0x62, 0xfa, 0x1d, 0xeb, 0x37, 0xe1, 0xcd, 0x16, 0x8b, 0x3b, 0x24, 0x39, 0xec, 0xe8, 0x76, 0x4e, 0x50, 0x4a, 0x9f, 0x83, 0xc2, 0xb5, 0x9d, 0x1d, 0x71, 0xb3, 0x7f, 0xcd, 0x8d, 0x5d, 0x3e, 0x75, 0x6d, 0x3e, 0xd9, 0x2d, 0xfb, 0x3e, 0x0d, 0x95, 0x63, 0x3b, 0xe0, 0x34, 0x85, 0x91, 0xb3, 0x88, 0x6c, 0x87, 0x58, 0x60, 0x1c, 0x10, 0x4e, 0xd0, 0x18, 0x10, 0x77, 0x9f, 0xe1, 0x73, 0x05, 0x69, 0xd0, 0xc3, 0xe0, 0xa9, 0x7d, 0x11, 0x5f, 0xe8, 0xee, 0x05, 0xc3, 0x97, 0x19, 0x5b, 0x6f, 0xa9, 0x9f, 0xb8, 0x1c, 0x6c, 0x43, 0x40, 0x88, 0x7b, 0xc1, 0xf0, 0x5a, 0x2e, 0x5e, 0x2c, 0xf9, 0xd4, 0xbb, 0xef, 0x4a, 0x84, 0xe3, 0x3e, 0x9b, 0xbf, 0x62, 0x99, 0x8d, 0x5f, 0x26, 0x76, 0x39, 0x13, 0xc7, 0x8d, 0x36, 0xff, 0xa1, 0xf1, 0xd7, 0x47, 0xf7, 0x73, 0x10, 0x6e, 0x24, 0x1a, 0x44, 0xad, 0xca, 0xbd, 0xbc, 0xa6, 0xa8, 0xb4, 0x56, 0x26, 0xfc, 0x1f, 0x57, 0xe0, 0xca, 0x6e, 0x67, 0x33, 0x3e, 0x5f, 0x39, 0x47, 0x82, 0xb6, 0x54, 0xde, 0xc5, 0x92, 0xa8, 0xb7, 0xbc, 0x82, 0x03, 0xa7, 0x3d, 0x7b, 0x13, 0x70, 0x64, 0x57, 0x29, 0xa5, 0x33, 0x27, 0x63, 0xc1, 0xaa, 0x60, 0x3b, 0xe1, 0x91, 0xfd, 0x6c, 0x01, 0x88, 0x34, 0xc0, 0x07, 0xc3, 0x85, 0xfb, 0x1f, 0x12, 0xd7, 0x31, 0xfe, 0x78, 0xb8, 0x15, 0xe5, 0xc7, 0xf2, 0x97, 0x60, 0x05, 0xd1, 0x35, 0x34, 0x1b, 0x25, 0x4f, 0x35, 0xc6, 0x98, 0x12, 0x17, 0xc1, 0xe6, 0x42, 0xd0, 0xa3, 0xd7, 0xc8, 0xef, 0xed, 0x01, 0x7c, 0x3e, 0xc5, 0xc1, 0xf5, 0x02, 0xd7, 0x92, 0xea, 0x53, 0xfc, 0x65, 0xc4, 0x84, 0x85, 0x08, 0x1a, 0xbc, 0x07, 0xd2, 0xbc, 0xc4, 0x28, 0xf6, 0xab, 0xb0, 0x22, 0x9e, 0x05, 0x9b, 0xc6, 0xb4, 0x5e, 0x5f, 0xb5, 0xf5, 0x1f, 0x6c, 0xe0, 0xc8, 0xdb, 0x17, 0xd8, 0xe3, 0xdb, 0x50, 0x65, 0xef, 0x2a, 0xda, 0x40, 0x34, 0xc3, 0x21, 0x21, 0x13, 0x79, 0x12, 0x04, 0x84, 0x35, 0x34, 0x7f, 0x82, 0x37, 0xe8, 0x14, 0x29, 0x61, 0x2f, 0x19, 0xd2, 0xa2, 0x42, 0x93, 0x6f, 0x6d, 0x85, 0x38, 0x30, 0x6e, 0x25, 0x45, 0x78, 0xd5, 0x2a, 0xc4, 0x0e, 0xfd, 0xa0, 0xab, 0xa6, 0xae, 0xdc, 0x93, 0xa7, 0x72, 0x2a, 0x09, 0x04, 0xb4, 0x4e, 0xf2, 0x56, 0x00, 0x15, 0x98, 0x7f, 0x3b, 0x4f, 0x43, 0x90, 0x08, 0x42, 0xd0, 0x11, 0x93, 0x58, 0xd1, 0x23, 0xd4, 0x9a, 0x9a, 0x80, 0x0b, 0xf6, 0xa8, 0xe4, 0x17, 0x1a, 0xa8, 0xe3, 0x3d, 0x5a, 0x05, 0xf4, 0x73, 0xa7, 0x2d, 0xe6, 0xee, 0xa9, 0x78, 0xa2, 0x6e, 0x1b, 0xc2, 0x07, 0x04, 0xb8, 0x31, 0xb2, 0x01, 0x76, 0xba, 0x19, 0x0c, 0x0f, 0x4f, 0xce, 0xbe, 0x63, 0xa2, 0xb8, 0x80, 0xf2, 0x22, 0x8d, 0x0c, 0xdb, 0x25, 0x66, 0x7a, 0x40, 0xa3, 0x0b, 0xe2, 0x2f, 0x47, 0x4a, 0xfe, 0xd4, 0xd6, 0x12, 0x0f, 0x26, 0x5b, 0x04, 0xf4, 0x8c, 0xdf, 0x6b, 0x67, 0x45, 0x67, 0xe9, 0x62, 0xf3, 0x1d, 0x2c, 0x2e, 0x1a, 0xd6, 0x58, 0x43, 0x62, 0x03, 0x0a, 0xf1, 0xe6, 0x2d, 0xf8, 0xe0, 0x1a, 0x77, 0xbf, 0xe6, 0x39, 0x4c, 0x45, 0xaa, 0xce, 0xbf, 0x6c, 0x6c, 0xbb, 0x55, 0x91, 0x51, 0xd5, 0x49, 0x05, 0x1d, 0x39, 0xe4, 0xf6, 0x22, 0x20, 0x24, 0xc4, 0xb2, 0x83, 0xda, 0xb7, 0xb3, 0x86, 0xdf, 0x37, 0xe0, 0x01, 0xe1, 0x5b, 0x55, 0xd9, 0x60, 0x8b, 0x55, 0xcb, 0x28, 0x7f, 0xf9, 0xfa, 0x50, 0x0b, 0x4c, 0xc0, 0x18, 0x1d, 0x2e, 0x92, 0x19, 0x05, 0xa4, 0xd7, 0xde, 0xc7, 0x3e, 0xc4, 0x3f, 0x27, 0x56, 0x35, 0x00, 0xf5, 0xe3, 0x32, 0x71, 0xcb, 0xa0, 0x34, 0xa2, 0xbd, 0x3c, 0x6b, 0x17, 0x1e, 0x94, 0xb9, 0x7b, 0x62, 0xb8, 0xcb, 0xa4, 0xa2, 0x8a, 0x90, 0xb0, 0xc0, 0xb6, 0xc3, 0xfa, 0x9e, 0x1f, 0xa3, 0x75, 0x09, 0x71, 0x5d, 0x9c, 0x23, 0xdd, 0xf6, 0x6d, 0x4f, 0x42, 0xd2, 0xaf, 0x8d, 0x89, 0x54, 0xc1, 0xfd, 0x36, 0x25, 0x2c, 0x06, 0x2e, 0x4a, 0xea, 0x41, 0x63, 0x0e, 0x3d, 0xfc, 0x40, 0xa7, 0x71, 0x1c, 0x3c, 0x9c, 0x75, 0x02, 0xcb, 0xb3, 0x32, 0x6e, 0x33, 0xf5, 0x30, 0xb9, 0x63, 0x40, 0xd2, 0xb4, 0xff, 0xd5, 0x9e, 0xcd, 0x44, 0x9b, 0xeb, 0x4a, 0x43, 0x1d, 0x0f, 0xd0, 0x60, 0xa6, 0xad, 0x0a, 0xb7, 0x6d, 0xef, 0x82, 0x15, 0x02, 0x35, 0xd8, 0x4d, 0xdc, 0x1b, 0xdf, 0x1f, 0x69, 0x2c, 0x86, 0xdd, 0x11, 0x91, 0x22, 0x70, 0x74, 0x3e, 0x64, 0xef, 0x3f, 0xb2, 0xb1, 0xc3, 0xbe, 0x6e, 0x9d, 0x13, 0x8c, 0x8f, 0xff, 0xd6, 0x74, 0x0b, 0xc0, 0x89, 0x6a, 0x87, 0xd0, 0xe5, 0x4b, 0x3c, 0x30, 0xd7, 0x27, 0xad, 0xf1, 0xc8, 0x0c, 0x07, 0x1d, 0xea, 0x31, 0xfe, 0x37, 0x5b, 0x0b, 0xeb, 0xfe, 0xc2, 0x43, 0x55, 0xa4, 0xf6, 0x92, 0x11, 0x38, 0xa4, 0x71, 0xbc, 0x77, 0x59, 0x8e, 0x38, 0x24, 0xe3, 0xd3, 0xb0, 0x61, 0x5f, 0xe5, 0x76, 0x20, 0x93, 0x81, 0xba, 0x0f, 0x8d, 0xc4, 0x86, 0x73, 0x78, 0x74, 0xdf, 0x7a, 0xb4, 0x93, 0x58, 0xf2, 0x02, 0x40, 0x4e, 0x10, 0x93, 0xe4, 0xdd, 0xeb, 0x1e, 0x8d, 0x96, 0xa2, 0x32, 0x0a, 0x4b, 0xfe, 0xa7, 0x48, 0x2d, 0x72, 0x1e, 0x89, 0xa7, 0x50, 0x5c, 0x10, 0xe8, 0x52, 0x49, 0x4a, 0x13, 0xcc, 0x51, 0xba, 0x22, 0x7c, 0xa3, 0xca, 0xc8, 0xcf, 0x31, 0x79, 0x40, 0x2a, 0x6f, 0xf6, 0x6d, 0x82, 0x5c, 0x6c, 0xb5, 0x3a, 0x6c, 0xa7, 0x4f, 0xdf, 0x52, 0x94, 0xe0, 0x1a, 0xaa, 0xe6, 0x43, 0x20, 0x2f, 0xa6, 0x27, 0x67, 0x08, 0xbb, 0x31, 0x5c, 0x3d, 0xfd, 0x9a, 0xf9, 0x2e, 0x42, 0x95, 0x56, 0x8f, 0xad, 0x86, 0x20, 0xae, 0xd4, 0x04, 0x74, 0x1f, 0xfe, 0xe2, 0x0d, 0x0f, 0x69, 0xb3, 0x73, 0x2a, 0x57, 0x26, 0xca, 0x2f, 0xdd, 0xa5, 0xdd, 0x4d, 0x77, 0x44, 0x43, 0x54, 0x37, 0xf5, 0xda, 0x70, 0x36, 0x59, 0x89, 0x3d, 0x91, 0x3f, 0x6b, 0xff, 0x8f, 0x29, 0x3d, 0x8f, 0x4b, 0x07, 0xb8, 0x70, 0x7f, 0x13, 0x89, 0x9d, 0x03, 0xe9, 0x81, 0xcb, 0x19, 0xc5, 0x98, 0xde, 0xcd, 0x32, 0xdf, 0x33, 0x14, 0x69, 0xbf, 0x9b, 0xb1, 0x39, 0xdc, 0xec, 0x29, 0xf2, 0x3a, 0x88, 0x1d, 0x23, 0x1b, 0xec, 0xd1, 0x0f, 0xc4, 0x82, 0x94, 0xf7, 0xc1, 0x55, 0x3f, 0x98, 0xc9, 0xd8, 0x34, 0xd9, 0x80, 0x05, 0x59, 0xb7, 0xca, 0x24, 0x85, 0xbe, 0xf1, 0xfc, 0xb7, 0x42, 0xa0, 0x1b, 0xd5, 0x1c, 0x10, 0x6b, 0x1c, 0x99, 0x20, 0x4c, 0x7e, 0xa8, 0x8d, 0xf6, 0x27, 0x07, 0x48, 0xf3, 0x18, 0x99, 0x73, 0x42, 0x37, 0x96, 0x4e, 0x34, 0x1d, 0x38, 0x91, 0x5a, 0x0e, 0x61, 0x6b, 0x9f, 0xfa, 0xe0, 0x39, 0x3a, 0x54, 0x87, 0xfc, 0x5d, 0xcf, 0x13, 0xba, 0x74, 0x8c, 0xc3, 0xa2, 0xa3, 0x89, 0x91, 0x7c, 0x97, 0xbe, 0xf8, 0x26, 0x0f, 0x54, 0x5c, 0x40, 0xb4, 0x61, 0x3f, 0xbb, 0x87, 0xa1, 0xdd, 0x62, 0x5d, 0x5c, 0x49, 0x93, 0x85, 0x50, 0x30, 0x32, 0x8a, 0xd7, 0x2c, 0x83, 0xf0, 0x4b, 0x76, 0x4a, 0xac, 0x87, 0x0e, 0x6e, 0xff, 0x7a, 0x11, 0xbd, 0x49, 0x71, 0xaf, 0x2d, 0xa7, 0x44, 0x7b, 0xcc, 0x71, 0xc3, 0xb8, 0x13, 0x28, 0xe9, 0x62, 0x1a, 0xa5, 0x67, 0x78, 0xb6, 0x19, 0x83, 0xc5, 0xa7, 0x15, 0xd2, 0x3d, 0xf9, 0x85, 0xb1, 0x99, 0xd8, 0x18, 0x4d, 0x16, 0x1d, 0x17, 0x3e, 0x29, 0x63, 0x8f, 0x07, 0x86, 0x03, 0x9f, 0x0f, 0xc5, 0xcf, 0x76, 0x9d, 0xef, 0xe3, 0xaa, 0x0a, 0xac, 0x37, 0xa4, 0xfc, 0x49, 0x25, 0xa5, 0x8f, 0x1c, 0x4e, 0xab, 0x2b, 0x68, 0x3f, 0x59, 0xbb, 0x9f, 0x80, 0x47, 0x82, 0x31, 0x92, 0x64, 0xf3, 0xab, 0x6b, 0xd3, 0xd1, 0x42, 0xe7, 0x26, 0xb4, 0x73, 0x5e, 0xac, 0x08, 0xdd, 0x48, 0x89, 0xbd, 0xd3, 0x68, 0xa1, 0xfa, 0x20, 0x05, 0xe3, 0x39, 0x37, 0x84, 0x78, 0x52, 0x3d, 0x0f, 0xe8, 0x2b, 0xa2, 0x8c, 0x3c, 0xd3, 0x5b, 0x60, 0x31, 0xf1, 0x60, 0x20, 0xd6, 0x64, 0xb2, 0x9c, 0xa4, 0x99, 0xf5, 0x90, 0xd9, 0xca, 0x5f, 0xf2, 0x39, 0x1c, 0x6e, 0xd2, 0x0d, 0x65, 0xda, 0x0c, 0x2a, 0x67, 0x16, 0x6f, 0x63, 0x88, 0x6f, 0x66, 0xc7, 0x39, 0x4b, 0xf6, 0x5b, 0xaa, 0x30, 0x2b, 0xc2, 0xb9, 0x40, 0x88, 0xda, 0x10, 0xb4, 0x2d, 0x5f, 0x9b, 0x16, 0xc1, 0xb5, 0x19, 0x2f, 0x70, 0xa7, 0x22, 0xdf, 0x2d, 0xe8, 0x7b, 0x1c, 0x6d, 0xa8, 0xce, 0x75, 0xb9, 0x5b, 0x68, 0x01, 0xb3, 0x36, 0x95, 0xcd, 0x0c, 0x98, 0x5b, 0xf1, 0x1d, 0xfe, 0xaa, 0x20, 0xf2, 0xd8, 0x9b, 0xdd, 0xeb, 0x5b, 0x98, 0x6d, 0x59, 0xd1, 0xd4, 0xe8, 0x83, 0x05, 0xf1, 0x15, 0x9d, 0x56, 0xb2, 0x5a, 0xd6, 0xfd, 0x05, 0x7e, 0x7b, 0x89, 0xf6, 0x53, 0xcf, 0x5a, 0x43, 0xef, 0x49, 0x99, 0xf5, 0xee, 0xa0, 0x36, 0x5f, 0x07, 0x02, 0x3d, 0x08, 0xd9, 0xb1, 0xfc, 0xd2, 0xb5, 0x72, 0x60, 0xee, 0xa9, 0xaf, 0x27, 0x48, 0x96, 0x86, 0x97, 0xf5, 0x37, 0x74, 0x56, 0x2e, 0x80, 0x02, 0xc5, 0xf1, 0x80, 0x2e, 0xa8, 0xc1, 0x20, 0xcf, 0x60, 0x78, 0xcc, 0xa6, 0x48, 0xea, 0xf1, 0x72, 0xce, 0xb7, 0x23, 0xeb, 0x58, 0x51, 0x9f, 0xfa, 0xf6, 0x3d, 0x13, 0x5b, 0x82, 0xa6, 0x1c, 0x25, 0xac, 0x71, 0x94, 0xe9, 0x86, 0x60, 0xf7, 0x86, 0xe3, 0xab, 0x11, 0x0a, 0xbf, 0x23, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x02, 0xe4, 0x61, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbd, 0x07, 0xec, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa6, 0x75, 0x77, 0xd9, 0xe4, 0xa6, 0x14, 0x6e, 0x44, 0x44, 0xa3, 0xd5, 0x48, 0xc2, 0x54, 0x30, 0xb1, 0xbe, 0x24, 0x0f, 0x09, 0xf3, 0xb4, 0xb1, 0xb4, 0x97, 0x47, 0xff, 0x0a, 0xe2, 0x1e, 0xa2, 0xff, 0xcf, 0x78, 0x49, 0x56, 0xe6, 0x64, 0xfc, 0x68, 0xcd, 0xf8, 0x61, 0xef, 0x67, 0xf1, 0x44, 0x5e, 0x70, 0x90, 0xf3, 0xf2, 0x4e, 0x4e, 0x8c, 0xae, 0x31, 0xca, 0x70, 0xc6, 0x31, 0xed, 0x4b, 0x1c, 0xac, 0x2d, 0x6a, 0x0b, 0xaa, 0xb4, 0x08, 0xc8, 0xb6, 0xd3, 0xef, 0xf6, 0x2b, 0x5f, 0x8b, 0xe4, 0xd4, 0x3b, 0x7a, 0x73, 0x76, 0x75, 0x4f, 0xe7, 0x61, 0xd5, 0x66, 0xca, 0x4f, 0xd1, 0x16, 0xfb, 0x53, 0x9f, 0x1b, 0x1e, 0xd5, 0x2c, 0xdb, 0x0b, 0x11, 0x95, 0xb8, 0xa5, 0x29, 0xf6, 0xa3, 0x00, 0x61, 0x73, 0x0f, 0x5f, 0xbc, 0x6a, 0x87, 0xe0, 0x84, 0x4e, 0xcc, 0x91, 0x9d, 0x8a, 0x5c, 0x4a, 0x63, 0x67, 0xd5, 0xa7, 0x31, 0xe2, 0xc8, 0x79, 0xc3, 0x42, 0xce, 0xa2, 0x0f, 0x68, 0x3c, 0x8a, 0x84, 0xad, 0x53, 0xd7, 0x4f, 0x27, 0xfa, 0x65, 0xcf, 0x48, 0xd5, 0x50, 0xdc, 0x83, 0x29, 0xfc, 0x2c, 0xcf, 0x41, 0x07, 0xe8, 0xf8, 0x90, 0x03, 0xf1, 0x12, 0x8c, 0x9c, 0xee, 0x42, 0x19, 0x2a, 0xff, 0xf8, 0xf8, 0x0f, 0x64, 0x32, 0x28, 0x79, 0xf6, 0xe4, 0xad, 0x07, 0x2e, 0x1f, 0xef, 0x3b, 0xc6, 0xc9, 0x01, 0x08, 0x94, 0xfe, 0x22, 0x10, 0x05, 0x07, 0x7f, 0x01, 0x19, 0x86, 0xf1, 0xf6, 0x86, 0x79, 0x62, 0xb4, 0xe3, 0x0c, 0x92, 0x3c, 0x0b, 0x82, 0xb7, 0x7f, 0x8b, 0x4e, 0x3e, 0x85, 0x7e, 0xe1, 0x84, 0x5e, 0xc1, 0xa6, 0xf9, 0xdc, 0xc9, 0x8e, 0xec, 0x09, 0x7d, 0x9e, 0x52, 0xeb, 0xe6, 0x70, 0x9b, 0xa6, 0x8a, 0xbe, 0x09, 0xd6, 0xea, 0x34, 0x30, 0x26, 0x5c, 0x70, 0xc6, 0x55, 0x7c, 0x4d, 0xfc, 0xb6, 0xb5, 0x76, 0x8b, 0x5a, 0xa1, 0x96, 0x72, 0x81, 0xba, 0x47, 0xd4, 0x3e, 0xde, 0x29, 0x94, 0xa6, 0xcb, 0x59, 0xe4, 0xff, 0x44, 0xc9, 0xc4, 0xf5, 0x6c, 0x9a, 0xef, 0x52, 0xe4, 0x82, 0x5d, 0x51, 0xdd, 0x8b, 0x17, 0xfd, 0x56, 0x01, 0x8f, 0x9a, 0x36, 0xc8, 0xe5, 0x92, 0x40, 0xdb, 0x8c, 0x21, 0x30, 0x02, 0xdf, 0x4f, 0xd3, 0x42, 0x0f, 0xd1, 0x72, 0x01, 0x42, 0x5b, 0xe6, 0xb8, 0x27, 0x0c, 0xb6, 0x57, 0xf4, 0xf4, 0x81, 0xdb, 0x88, 0x24, 0x87, 0xa3, 0xb7, 0x06, 0x09, 0x4a, 0x9c, 0x1d, 0x42, 0xa6, 0x3d, 0x20, 0x5c, 0x14, 0x24, 0x53, 0xb3, 0x02, 0x32, 0xcd, 0xea, 0x10, 0xab, 0xa7, 0x79, 0x00, 0xd9, 0xa4, 0x44, 0xa3, 0x2d, 0x8a, 0xa2, 0xdd, 0x44, 0xf3, 0x32, 0x35, 0x10, 0x31, 0xf7, 0x59, 0x5a, 0x0b, 0x5a, 0x87, 0x51, 0xa7, 0x6b, 0x3b, 0xea, 0xcb, 0xd5, 0xf8, 0x07, 0x56, 0x1a, 0x53, 0xd9, 0xd8, 0x83, 0x77, 0xf3, 0xf4, 0xec, 0x3d, 0x0b, 0xc7, 0xea, 0x91, 0x4f, 0xe5, 0xaf, 0x4d, 0x8a, 0xb9, 0xcf, 0xd5, 0x86, 0x61, 0x5a, 0x94, 0xaa, 0x84, 0xb9, 0xad, 0x62, 0xeb, 0x1f, 0x26, 0x1b, 0x64, 0xb8, 0xdc, 0xe9, 0xe7, 0x8f, 0x8c, 0xfd, 0x19, 0xf5, 0x9d, 0xff, 0x6a, 0xb9, 0x01, 0x7c, 0x93, 0x70, 0x3f, 0x45, 0x4d, 0x29, 0xcc, 0x45, 0xcb, 0xba, 0x43, 0xc6, 0x2e, 0x03, 0xda, 0x4c, 0xd6, 0x21, 0x57, 0x8f, 0x74, 0x99, 0x31, 0x0f, 0xd0, 0x9b, 0x54, 0x8c, 0x57, 0xb0, 0x14, 0xd0, 0xdd, 0x26, 0xec, 0xbb, 0xb4, 0x2f, 0xb1, 0xfe, 0xb1, 0xba, 0x50, 0xd9, 0x24, 0xd1, 0x49, 0xbb, 0x68, 0x7a, 0x88, 0xeb, 0x38, 0xc8, 0x1e, 0x8e, 0x11, 0xb0, 0x58, 0x88, 0xaf, 0xa1, 0xf3, 0xb7, 0x7f, 0xc9, 0xab, 0xc2, 0x29, 0xec, 0x5c, 0x85, 0xc8, 0x18, 0xb8, 0x8d, 0xd6, 0x7f, 0xbb, 0xc2, 0x48, 0xfc, 0x73, 0xfa, 0xb4, 0x6a, 0xaa, 0x3c, 0x0f, 0x7c, 0x90, 0x75, 0x52, 0xed, 0x0e, 0x24, 0xdd, 0x5f, 0xbe, 0x1d, 0x88, 0xce, 0xbb, 0xeb, 0xf3, 0xcc, 0x24, 0x02, 0xed, 0xad, 0x97, 0x7e, 0x73, 0x1f, 0x82, 0x52, 0x35, 0x9b, 0xd9, 0x95, 0x9a, 0x2f, 0x2e, 0x91, 0x07, 0xa9, 0xb1, 0x5c, 0x39, 0xe8, 0xe4, 0x60, 0x7e, 0x1a, 0xa1, 0x45, 0xa2, 0xc8, 0xdb, 0x6f, 0xbb, 0x82, 0x33, 0x54, 0x46, 0xca, 0x97, 0xc6, 0xa5, 0xf6, 0x16, 0x7d, 0x98, 0x10, 0x6a, 0x66, 0x82, 0x22, 0x4a, 0x35, 0x35, 0x6b, 0x8c, 0xd3, 0xe7, 0x36, 0x39, 0x0f, 0x1a, 0x9c, 0xa5, 0xf2, 0x5d, 0x8b, 0x57, 0x16, 0xc8, 0xc3, 0xa6, 0xa9, 0x34, 0xa7, 0x30, 0x82, 0x12, 0x79, 0x6a, 0x75, 0x5e, 0x38, 0xef, 0x37, 0xaf, 0xad, 0x8b, 0xf1, 0x60, 0xdc, 0x6c, 0xb3, 0x97, 0xf5, 0x06, 0x56, 0x11, 0xdc, 0x96, 0xf2, 0x37, 0x12, 0x75, 0xac, 0xa7, 0x40, 0xb4, 0xd7, 0x43, 0x97, 0x4e, 0x70, 0x56, 0xef, 0xf0, 0x5e, 0xfb, 0xbe, 0xc2, 0xc2, 0x9a, 0xc3, 0xf5, 0xfb, 0x75, 0xde, 0x2a, 0xc6, 0x6e, 0x44, 0x3b, 0x65, 0x2d, 0xa4, 0xd2, 0x3b, 0x39, 0x21, 0x64, 0x4a, 0xc8, 0x14, 0xa5, 0xb9, 0x4a, 0x38, 0x6d, 0x8c, 0x46, 0x4c, 0x22, 0x76, 0x20, 0x9b, 0x00, 0x71, 0x32, 0x98, 0xd4, 0xea, 0x9e, 0x38, 0x89, 0xdb, 0x83, 0xd2, 0x9d, 0xbc, 0x04, 0x55, 0x55, 0x38, 0x0e, 0x03, 0x51, 0x57, 0x33, 0x75, 0x82, 0x07, 0x8c, 0x2a, 0xe7, 0x64, 0xe1, 0x18, 0x2c, 0x1f, 0x9e, 0xca, 0x3e, 0x35, 0xda, 0xaa, 0x08, 0x8c, 0xa7, 0x59, 0x5c, 0xaa, 0x92, 0x53, 0xc3, 0x87, 0x66, 0x14, 0x2a, 0x94, 0x35, 0xda, 0x03, 0x3b, 0xea, 0xea, 0x54, 0xea, 0x27, 0x25, 0x65, 0x64, 0x78, 0xbc, 0x76, 0x50, 0xd7, 0xd4, 0xc3, 0x3f, 0x62, 0x71, 0xbb, 0xe5, 0x85, 0x5d, 0xf9, 0x39, 0xc4, 0xdf, 0x6a, 0xa7, 0x46, 0x18, 0x4f, 0x71, 0x34, 0x6e, 0x1a, 0x3b, 0x5d, 0x9a, 0xa3, 0xde, 0xe0, 0xc1, 0xd7, 0xa1, 0xc5, 0x49, 0x68, 0x4e, 0xd1, 0xc8, 0xb6, 0x2b, 0xbe, 0xda, 0xdf, 0xc1, 0x68, 0x63, 0xdd, 0xef, 0xed, 0x86, 0x5e, 0xc1, 0x15, 0x73, 0x2d, 0x40, 0x2f, 0xe9, 0xeb, 0x16, 0x10, 0x34, 0x5e, 0xdf, 0x5d, 0xee, 0x75, 0x43, 0xe0, 0x29, 0x8e, 0x5e, 0xe3, 0x3f, 0xbb, 0xd1, 0x04, 0x9c, 0x91, 0xf1, 0x4b, 0xd7, 0x44, 0xeb, 0xba, 0xbe, 0x0c, 0x06, 0x0f, 0x5d, 0x05, 0x2c, 0x2f, 0x46, 0x46, 0x01, 0x7d, 0xae, 0x50, 0x2b, 0xe5, 0x38, 0xec, 0x44, 0x6f, 0x32, 0x27, 0xcc, 0x54, 0xfa, 0xf9, 0x97, 0x9a, 0xa6, 0xaf, 0xa5, 0x11, 0x6c, 0x59, 0xf5, 0x51, 0xd1, 0xd2, 0x5a, 0xfa, 0x6e, 0x58, 0xf0, 0xd0, 0xd0, 0xca, 0x84, 0x8d, 0x07, 0x3f, 0xb1, 0xe9, 0x27, 0x4d, 0x6d, 0x1e, 0x3e, 0x09, 0xaf, 0xd3, 0x5a, 0x6b, 0x36, 0x06, 0x7d, 0x85, 0xbe, 0x72, 0x76, 0x8d, 0x8f, 0xf3, 0x14, 0x82, 0xad, 0xbe, 0x89, 0xf3, 0x46, 0x78, 0xd9, 0x32, 0x49, 0xdb, 0x96, 0x19, 0xe2, 0x86, 0x29, 0xcf, 0x2f, 0x41, 0x4a, 0xdd, 0xab, 0xb1, 0xad, 0x36, 0xf0, 0x4a, 0xc3, 0x31, 0xa2, 0x95, 0xc2, 0xdb, 0xfc, 0x6b, 0xda, 0xf6, 0x07, 0x39, 0x55, 0x53, 0x21, 0x28, 0x06, 0x3d, 0xaf, 0xf2, 0x6c, 0x56, 0x94, 0xc4, 0x9d, 0xd2, 0x80, 0xac, 0x53, 0xc2, 0xc7, 0xaf, 0x55, 0x60, 0x6c, 0x18, 0x34, 0x37, 0x9f, 0x57, 0xdc, 0xb8, 0xdb, 0x96, 0x0d, 0x03, 0x23, 0xaf, 0xff, 0xfd, 0x03, 0x3d, 0x4f, 0x7e, 0x33, 0xa3, 0x24, 0xd8, 0x61, 0x23, 0xfc, 0x18, 0x76, 0xed, 0xa0, 0xaf, 0xb6, 0x09, 0x87, 0x3c, 0x7f, 0x1d, 0xae, 0x23, 0x2b, 0x50, 0x17, 0x39, 0x02, 0x72, 0x55, 0xc7, 0x67, 0xc7, 0x04, 0x0e, 0x31, 0x40, 0x7f, 0xb3, 0x84, 0xe7, 0x10, 0x89, 0x2f, 0xef, 0xe6, 0xfd, 0x1e, 0xfb, 0xcf, 0x3b, 0x10, 0xe8, 0x24, 0x50, 0x81, 0x72, 0xc3, 0x31, 0xd2, 0xa7, 0x65, 0xf2, 0xed, 0x95, 0xc4, 0x2a, 0xd9, 0x7e, 0x98, 0x4f, 0x50, 0xe3, 0xb1, 0x9d, 0x60, 0xbf, 0x3c, 0x50, 0x4f, 0xb4, 0x33, 0xd6, 0x19, 0xb6, 0xeb, 0x66, 0x36, 0x16, 0xd9, 0x39, 0x50, 0xcd, 0x16, 0xce, 0xdf, 0x52, 0x48, 0x8f, 0x01, 0x64, 0xff, 0x3d, 0x6c, 0x7e, 0x8a, 0xb4, 0x14, 0x5f, 0xc7, 0x8c, 0x29, 0xb9, 0xc5, 0xc7, 0x18, 0x47, 0xfe, 0xe3, 0x9e, 0xe8, 0xea, 0x65, 0x14, 0xe5, 0x40, 0x43, 0x71, 0xb9, 0x93, 0x3f, 0x7b, 0xf2, 0x81, 0x5d, 0x9b, 0x66, 0x1b, 0x08, 0x51, 0x0a, 0x4d, 0x27, 0x35, 0x54, 0x62, 0xb5, 0x71, 0x00, 0x99, 0x61, 0x79, 0xfe, 0x45, 0xa3, 0xaa, 0x72, 0x5c, 0xec, 0x5d, 0x0a, 0x7b, 0xee, 0xa2, 0x9b, 0x1f, 0xff, 0xf2, 0x53, 0x40, 0x9b, 0xce, 0xae, 0x9f, 0xd5, 0x07, 0x60, 0x18, 0x86, 0xb9, 0xdb, 0xc1, 0x2e, 0x61, 0xc8, 0xba, 0x73, 0x60, 0x2c, 0x7c, 0x14, 0x55, 0x6e, 0xce, 0x9d, 0x23, 0xf6, 0xcb, 0xbf, 0x3f, 0x3b, 0x9a, 0xd6, 0x21, 0x3b, 0x73, 0x27, 0x5f, 0xf3, 0xda, 0x99, 0x19, 0xb6, 0x81, 0xd9, 0x7e, 0xc0, 0x2e, 0x29, 0x4e, 0xcb, 0xa2, 0x3f, 0x67, 0xf3, 0x69, 0xde, 0xa7, 0xa5, 0xed, 0x9c, 0xb4, 0x4e, 0xcd, 0xd2, 0x74, 0xa3, 0xce, 0x3d, 0x59, 0x7d, 0x71, 0x72, 0x83, 0xb7, 0x10, 0x07, 0xd4, 0x2c, 0x03, 0xa3, 0x26, 0xe2, 0xed, 0x3c, 0x8b, 0xd7, 0xab, 0xf5, 0xb2, 0xe7, 0xf7, 0xe1, 0x0a, 0xeb, 0xe2, 0x3d, 0xcf, 0x1c, 0x96, 0x92, 0xa7, 0xe1, 0x35, 0x45, 0x3d, 0x7f, 0xe9, 0x58, 0x5b, 0xae, 0xfe, 0x6b, 0xfd, 0xaf, 0xd9, 0x68, 0x33, 0x26, 0xee, 0x6d, 0x9e, 0xc3, 0x0d, 0x17, 0x22, 0x0a, 0xf6, 0x55, 0x24, 0x2b, 0x26, 0x05, 0xaf, 0x66, 0x1d, 0xfb, 0x19, 0xec, 0x7c, 0x01, 0x1f, 0x71, 0xa3, 0x86, 0x50, 0x82, 0xb1, 0x61, 0x5a, 0x30, 0xac, 0x58, 0xe7, 0x62, 0xe1, 0x9f, 0xf9, 0x0c, 0x99, 0x06, 0x6d, 0xf9, 0x0f, 0xd0, 0x78, 0x79, 0x46, 0x65, 0x27, 0xe4, 0x03, 0xf2, 0x25, 0xb4, 0xa5, 0xe2, 0x95, 0x14, 0x5d, 0x49, 0x71, 0x9b, 0x5e, 0xf7, 0x0f, 0xe7, 0x6b, 0xe3, 0xe9, 0xce, 0x92, 0xb4, 0xef, 0x15, 0x3f, 0x1a, 0x5b, 0x73, 0xe9, 0x7e, 0x45, 0x4d, 0x8b, 0xdb, 0x58, 0x56, 0x67, 0x10, 0xbd, 0xd8, 0xe4, 0x83, 0x6f, 0x42, 0x67, 0x55, 0x78, 0xa7, 0x2a, 0xe6, 0xf7, 0x0b, 0x21, 0x04, 0x19, 0x2b, 0xbe, 0x5c, 0x40, 0x3c, 0xa0, 0x7e, 0x94, 0x56, 0x7c, 0xcd, 0x85, 0x49, 0x28, 0xf9, 0xec, 0x85, 0x94, 0xfc, 0x8c, 0x4f, 0x60, 0xd6, 0x9a, 0x58, 0xaa, 0x83, 0xbe, 0x9a, 0xf1, 0x99, 0xeb, 0x02, 0xce, 0xb5, 0x74, 0x27, 0x49, 0x35, 0xd1, 0xcd, 0xdc, 0x05, 0xab, 0x07, 0x81, 0xac, 0x36, 0xf4, 0x1a, 0x4d, 0x6b, 0xd9, 0xc4, 0xd5, 0x1a, 0x41, 0xab, 0x90, 0x34, 0xe8, 0xbb, 0xe1, 0xb7, 0xad, 0x46, 0x5d, 0x11, 0x17, 0x2f, 0x60, 0xa1, 0x2e, 0x4a, 0xbf, 0xea, 0x75, 0xba, 0x65, 0xd7, 0x30, 0xf5, 0x75, 0x92, 0xba, 0xbb, 0x69, 0x2e, 0x2b, 0x5d, 0x72, 0xcc, 0xec, 0xf3, 0x19, 0x74, 0x2d, 0x1c, 0x1b, 0xb3, 0xf5, 0xe8, 0xd8, 0xc8, 0x9f, 0xe7, 0x6e, 0x83, 0x44, 0x61, 0xbb, 0x5e, 0x8c, 0xaf, 0x3f, 0xc1, 0x8b, 0x7f, 0xaf, 0x2c, 0xc9, 0x4d, 0xfe, 0xde, 0x37, 0xa1, 0x96, 0x32, 0x76, 0x38, 0xcb, 0xc3, 0x38, 0xce, 0x96, 0x12, 0x9b, 0xb9, 0x8c, 0x91, 0xac, 0x9f, 0x95, 0x0d, 0x27, 0x3c, 0xb2, 0x1d, 0xfb, 0xc3, 0x94, 0x29, 0xc8, 0xc2, 0xa9, 0xd8, 0x3f, 0x29, 0x85, 0xa7, 0x16, 0x37, 0xb9, 0xc3, 0x96, 0x52, 0x76, 0xe2, 0x01, 0xa3, 0x4e, 0x54, 0xb5, 0x3b, 0x0a, 0x29, 0x6d, 0x90, 0xc1, 0xd1, 0x97, 0x56, 0x04, 0xd7, 0x78, 0x0a, 0x1d, 0x5c, 0x5e, 0x27, 0xa0, 0x46, 0x95, 0xb8, 0x7d, 0x0e, 0xad, 0x2c, 0xe7, 0x1f, 0xea, 0xa1, 0x80, 0xc9, 0x20, 0x21, 0xf7, 0x98, 0xca, 0x9c, 0x06, 0x31, 0x34, 0xec, 0x75, 0xd2, 0x10, 0x50, 0xe8, 0xae, 0x95, 0x54, 0x96, 0xc2, 0x45, 0x70, 0xef, 0x32, 0xae, 0x38, 0xd1, 0x69, 0x95, 0xba, 0xa8, 0x8a, 0x9f, 0xae, 0x8f, 0xea, 0x06, 0x57, 0x98, 0xe7, 0xdd, 0x3f, 0xd8, 0x7d, 0x9a, 0xff, 0xf5, 0xb4, 0x4b, 0xe1, 0x72, 0x2d, 0x5f, 0x53, 0xdb, 0x8a, 0x3a, 0xff, 0xe5, 0x58, 0x7d, 0xa1, 0xe9, 0xdb, 0x9b, 0x71, 0xf6, 0xb9, 0x0b, 0x43, 0x04, 0x70, 0xad, 0x29, 0xd1, 0x98, 0x0f, 0x1b, 0xbe, 0x27, 0x94, 0x7d, 0xf6, 0x1c, 0x7d, 0x39, 0x1d, 0x8d, 0x3d, 0x25, 0xbb, 0x1c, 0x8e, 0x67, 0x3b, 0x22, 0xa9, 0x5e, 0x5c, 0x95, 0x6e, 0x2c, 0x61, 0x1e, 0x5d, 0x18, 0x4b, 0xd0, 0x41, 0x6f, 0x9b, 0x1c, 0x6d, 0x5d, 0x8b, 0x8a, 0x10, 0x4b, 0x14, 0xc0, 0x91, 0xcf, 0xc9, 0x69, 0x77, 0x08, 0x3b, 0x1d, 0x4f, 0x2b, 0x8e, 0x7b, 0xc7, 0x66, 0xe1, 0x0b, 0xda, 0x69, 0xbb, 0xcc, 0x21, 0x09, 0x07, 0xaa, 0x47, 0xd3, 0x6c, 0x91, 0xc3, 0x43, 0xdb, 0x07, 0x5a, 0xd4, 0xbf, 0x88, 0xca, 0x23, 0xcb, 0xcc, 0xf9, 0x0c, 0x09, 0xc6, 0xdf, 0xe2, 0xe1, 0xa4, 0x7c, 0x42, 0x4a, 0x0d, 0xf9, 0xa7, 0xf1, 0x1a, 0x6c, 0xb9, 0x5c, 0x09, 0xa9, 0x92, 0x90, 0xe9, 0xce, 0xa5, 0x62, 0xd4, 0x51, 0x6b, 0x32, 0xc1, 0x2f, 0x70, 0x68, 0x40, 0x11, 0x3d, 0x6a, 0x35, 0xa0, 0xde, 0x38, 0x3a, 0x10, 0x0f, 0x6e, 0x9b, 0x23, 0x6a, 0x3d, 0x2e, 0xab, 0x7b, 0x77, 0x5e, 0xa2, 0x11, 0xbc, 0xa1, 0x8e, 0x05, 0xcd, 0x27, 0x97, 0x98, 0x4b, 0x9c, 0xec, 0x30, 0x8b, 0x2b, 0xdf, 0x84, 0x30, 0xa2, 0x72, 0xc7, 0x59, 0xdb, 0xbf, 0x4f, 0xc8, 0x9e, 0x90, 0x3f, 0x33, 0x4a, 0x86, 0xd5, 0x43, 0x8f, 0xa0, 0x7f, 0x75, 0x90, 0xb1, 0x51, 0xbd, 0xc8, 0x58, 0xe6, 0xbb, 0x55, 0x24, 0x62, 0x28, 0x54, 0xb9, 0x85, 0xe7, 0x09, 0x8d, 0xec, 0xfb, 0xe5, 0x55, 0x4a, 0x09, 0x08, 0xc0, 0xbc, 0x2a, 0x29, 0xb7, 0xbe, 0x69, 0x73, 0x68, 0xd4, 0xc2, 0xaa, 0x24, 0xd0, 0x69, 0x9d, 0xc2, 0xcd, 0xf5, 0x78, 0x80, 0xbe, 0xe0, 0xcc, 0xe1, 0x1d, 0x7d, 0xcc, 0xe1, 0x1e, 0x3b, 0x40, 0xfb, 0x17, 0xa2, 0x11, 0xa5, 0xa5, 0x7a, 0x22, 0xf3, 0x98, 0x9c, 0x85, 0xa8, 0x2f, 0x01, 0x6f, 0xb5, 0x7b, 0xb4, 0x2f, 0xde, 0x0b, 0x85, 0x02, 0x7c, 0x1b, 0xba, 0x0e, 0x40, 0xcb, 0x1f, 0xac, 0x88, 0x35, 0x84, 0xe3, 0x30, 0x90, 0x77, 0xe7, 0xc9, 0xf5, 0x1c, 0xf7, 0x3a, 0x21, 0x8a, 0x26, 0x2a, 0xc8, 0x98, 0x1a, 0xaf, 0xbd, 0x4e, 0x12, 0xe3, 0x76, 0x01, 0x20, 0x17, 0x2e, 0x57, 0x15, 0xe0, 0xab, 0x1c, 0xf6, 0x89, 0x1b, 0x45, 0xfa, 0x20, 0x1f, 0x3d, 0xc0, 0x40, 0xf4, 0x83, 0x03, 0x76, 0x38, 0x81, 0xe1, 0x35, 0xdc, 0x7a, 0x88, 0x13, 0x50, 0x47, 0x72, 0x9c, 0x8d, 0x8f, 0x69, 0x70, 0xcd, 0xc0, 0x6f, 0x7a, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x02, 0xe4, 0x61, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbd, 0x07, 0xec, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xab, 0x7d, 0x70, 0x64, 0xa8, 0x3f, 0x8a, 0x3a, 0x5c, 0xdc, 0xc3, 0xb6, 0x0e, 0x2e, 0x85, 0x44, 0x01, 0x62, 0xb2, 0x2b, 0x63, 0xcb, 0x0a, 0xab, 0xa1, 0xf7, 0x60, 0xae, 0x98, 0xa1, 0x3a, 0xf7, 0xd6, 0xc8, 0x39, 0x4d, 0x37, 0xe5, 0x42, 0x0e, 0x62, 0xfc, 0x7c, 0x33, 0x38, 0xdc, 0xaa, 0x14, 0x67, 0xa7, 0xed, 0xaa, 0xc6, 0xc7, 0x96, 0xb7, 0xf5, 0x5a, 0x9d, 0x23, 0xbd, 0x0f, 0x50, 0xa8, 0x0d, 0x4d, 0x27, 0x48, 0xfe, 0x79, 0xc6, 0x13, 0x6f, 0x4e, 0xd3, 0xd7, 0xae, 0xd7, 0xcc, 0xf5, 0x43, 0x07, 0x5b, 0x81, 0x4e, 0x23, 0x4e, 0x29, 0x16, 0x22, 0xb7, 0xa1, 0x90, 0x0a, 0x99, 0x23, 0xdd, 0xac, 0x5f, 0xb3, 0x36, 0x23, 0x84, 0x64, 0xf9, 0xf3, 0x8d, 0x4a, 0x3c, 0x70, 0x43, 0x39, 0x9d, 0x5d, 0xf4, 0x23, 0x2e, 0x02, 0xd2, 0x7f, 0x78, 0x5e, 0x73, 0x3b, 0xfd, 0x8f, 0x68, 0x59, 0x82, 0x2c, 0x64, 0xfe, 0x7e, 0x36, 0x68, 0x89, 0x59, 0x75, 0xa4, 0x07, 0x8b, 0xfc, 0x87, 0x32, 0xcf, 0x98, 0xee, 0xa4, 0xda, 0x37, 0x1d, 0x3d, 0x09, 0x17, 0x70, 0x25, 0x11, 0x90, 0xc9, 0xda, 0x0e, 0xca, 0xa7, 0x6f, 0xc8, 0x7f, 0x12, 0xe9, 0x18, 0xf0, 0xb0, 0xa9, 0xbf, 0x94, 0x00, 0x5e, 0x3b, 0x76, 0xa1, 0x41, 0x14, 0xec, 0x57, 0x3b, 0x67, 0x6c, 0x0d, 0xaa, 0x20, 0x52, 0xc5, 0x82, 0x19, 0xd3, 0x37, 0x34, 0x5e, 0xd2, 0x62, 0xe2, 0x66, 0x95, 0xf9, 0x58, 0x25, 0x16, 0x77, 0xff, 0xff, 0x8e, 0xd1, 0xfc, 0xb2, 0xa5, 0x60, 0x15, 0x21, 0x34, 0xf0, 0x2e, 0x74, 0xf2, 0x85, 0x23, 0x60, 0x57, 0x01, 0xaa, 0x9f, 0x18, 0x70, 0x3a, 0x4c, 0x87, 0xa2, 0x7f, 0xaf, 0xb4, 0xfa, 0x6d, 0xba, 0xaa, 0xfe, 0x12, 0x9c, 0x04, 0x2a, 0x28, 0xcd, 0x14, 0x9a, 0x18, 0xf9, 0xc9, 0x2e, 0x08, 0x5f, 0x3a, 0x8c, 0x11, 0xe4, 0x52, 0x0a, 0xdf, 0x2e, 0x26, 0xd4, 0x99, 0xf8, 0x4c, 0xa7, 0xbf, 0x2a, 0xb3, 0x90, 0x07, 0x9c, 0xc0, 0x43, 0x0b, 0x07, 0x5a, 0xa5, 0x9b, 0x1d, 0x25, 0x69, 0x1a, 0x5c, 0x35, 0x5a, 0x59, 0x06, 0x26, 0xa2, 0xe3, 0xf7, 0x03, 0x58, 0x01, 0x90, 0x37, 0x07, 0x8b, 0x44, 0x64, 0xc6, 0xf3, 0x0b, 0x64, 0x79, 0xff, 0x59, 0x3e, 0xe0, 0x82, 0xaf, 0xac, 0x06, 0x31, 0x7a, 0x93, 0x69, 0x67, 0xe3, 0xca, 0x22, 0xcf, 0xc2, 0x0f, 0xd0, 0xec, 0xc5, 0x75, 0xbf, 0x9b, 0x02, 0x0f, 0xd0, 0x09, 0x1d, 0x02, 0x80, 0x31, 0x6c, 0x7b, 0xeb, 0x11, 0xe5, 0x06, 0xe8, 0x84, 0x27, 0x9f, 0x9a, 0xbf, 0x39, 0x73, 0xbe, 0xef, 0x5b, 0xce, 0x05, 0x60, 0xe7, 0x02, 0x47, 0xf2, 0x59, 0x4f, 0xd9, 0xfd, 0x1a, 0x4f, 0x13, 0x69, 0xc0, 0xdc, 0xd9, 0xfa, 0xfa, 0x18, 0xaa, 0x8d, 0x8f, 0xd8, 0x42, 0xee, 0x3a, 0x12, 0xcf, 0xe6, 0xaa, 0x64, 0x3d, 0x98, 0xc9, 0x28, 0x1f, 0x01, 0x63, 0xa4, 0xe6, 0x4a, 0xb0, 0x69, 0x30, 0x4c, 0x52, 0x8a, 0xbc, 0xa9, 0x18, 0x31, 0xe9, 0x14, 0x55, 0xf7, 0xdf, 0x79, 0x12, 0x0b, 0x8c, 0x69, 0xf3, 0xb3, 0x8a, 0xb8, 0x86, 0x90, 0x21, 0x96, 0x1c, 0x5b, 0xd8, 0x0a, 0x10, 0xbe, 0xc3, 0xd7, 0x15, 0xae, 0xcb, 0x19, 0x2b, 0xf9, 0xa8, 0x24, 0x5f, 0x04, 0x8c, 0xfe, 0xc3, 0x93, 0x8e, 0x8c, 0x01, 0x44, 0x6b, 0x92, 0x27, 0x06, 0xc4, 0x4b, 0x41, 0xf1, 0x6c, 0xd4, 0xfa, 0xf2, 0x51, 0xd5, 0xaa, 0xac, 0x5b, 0xcd, 0xa3, 0xb0, 0x14, 0xb7, 0x48, 0x5c, 0x77, 0xf1, 0x12, 0xeb, 0xcd, 0x17, 0x04, 0xb0, 0xea, 0x37, 0x3b, 0xc4, 0xa2, 0x47, 0x35, 0x87, 0x4d, 0x8c, 0x9d, 0x61, 0xdb, 0xad, 0x95, 0x76, 0xad, 0x11, 0x72, 0x8c, 0xff, 0xed, 0x8e, 0x94, 0xbf, 0xd3, 0xb5, 0xe8, 0xfd, 0xa9, 0x60, 0x17, 0x8b, 0xec, 0xaa, 0x4e, 0x8d, 0x1b, 0xf3, 0xa0, 0xca, 0x56, 0x1a, 0xe8, 0x95, 0x48, 0x35, 0xa2, 0xa3, 0xd1, 0xd7, 0xd2, 0x99, 0x14, 0x4c, 0x96, 0x53, 0x9a, 0x8b, 0x4e, 0xa8, 0x0b, 0xb1, 0xaa, 0x6d, 0x9b, 0x43, 0x7e, 0x6c, 0xe9, 0x77, 0x68, 0x75, 0x09, 0x43, 0xd5, 0xa7, 0x36, 0xc6, 0x3b, 0xf4, 0x2c, 0xd4, 0x65, 0x6f, 0xa0, 0xe2, 0x80, 0x81, 0xc7, 0xbf, 0x19, 0x92, 0xb1, 0x1a, 0x00, 0x4f, 0xa0, 0x4a, 0x5b, 0xad, 0x62, 0x9a, 0xad, 0x50, 0x86, 0xf2, 0x88, 0x04, 0x80, 0x35, 0x08, 0x3a, 0x34, 0x4b, 0xde, 0xc3, 0x3d, 0xd8, 0x2a, 0x7a, 0x53, 0x9d, 0x88, 0xca, 0xca, 0x47, 0xa4, 0xcb, 0xff, 0x2e, 0xbf, 0x8d, 0x34, 0xba, 0x79, 0xdf, 0x7b, 0x2a, 0xa2, 0xa3, 0x5f, 0x05, 0x85, 0x7e, 0x90, 0x81, 0xb2, 0xf6, 0xa3, 0xd4, 0x82, 0x0f, 0xc9, 0x64, 0x06, 0x92, 0x0c, 0x09, 0x47, 0x72, 0x37, 0x34, 0x84, 0x8a, 0x02, 0x34, 0x49, 0x9a, 0xae, 0xa2, 0x47, 0xa2, 0xb6, 0x17, 0x3d, 0x32, 0xb3, 0x0a, 0x6b, 0x0a, 0xb4, 0x2c, 0xbc, 0x80, 0x06, 0x84, 0xcd, 0x86, 0xec, 0x9e, 0x21, 0x6d, 0xb6, 0xbb, 0x1c, 0x60, 0x96, 0x0b, 0xe8, 0xe3, 0x28, 0x03, 0xc6, 0x2e, 0x89, 0xd3, 0x87, 0x1b, 0xf5, 0x14, 0xdd, 0x37, 0x50, 0x6a, 0xd1, 0x93, 0x37, 0x0b, 0x82, 0x78, 0x93, 0x18, 0x56, 0x9c, 0x95, 0x0b, 0x37, 0x37, 0xfe, 0xfd, 0x88, 0xc3, 0xad, 0xb8, 0x56, 0x16, 0xa4, 0xa2, 0xda, 0x0c, 0x92, 0xa5, 0xa2, 0xe9, 0x37, 0x55, 0x9c, 0x24, 0x90, 0x3a, 0x53, 0x81, 0xee, 0x6d, 0x98, 0x9e, 0x7a, 0x46, 0xb9, 0x42, 0x22, 0xfd, 0x2a, 0xb9, 0xc2, 0xa2, 0xde, 0x01, 0x0d, 0x5c, 0x5d, 0x91, 0x0f, 0x31, 0x52, 0xec, 0x23, 0x72, 0x5c, 0xee, 0x63, 0x81, 0xfa, 0x96, 0x9f, 0x1e, 0x4f, 0x62, 0x00, 0xb8, 0xb5, 0xf1, 0x03, 0x2a, 0x7f, 0xe0, 0x7b, 0x2c, 0x38, 0xf0, 0xb6, 0x50, 0xfc, 0xf3, 0xbc, 0xe2, 0x7c, 0xf8, 0xf3, 0x4f, 0x6b, 0x98, 0xf8, 0x9b, 0x02, 0x6d, 0xcc, 0x34, 0x2b, 0xfb, 0xfc, 0x59, 0x13, 0xb2, 0x2f, 0x7e, 0x50, 0x90, 0xe5, 0x99, 0x4d, 0x6b, 0xa0, 0xe9, 0x0f, 0x71, 0x73, 0xff, 0xaf, 0xcd, 0x14, 0xf1, 0x70, 0x31, 0x6c, 0x2d, 0x51, 0x3c, 0xf4, 0xe6, 0x4a, 0x25, 0x90, 0x51, 0x86, 0x86, 0x66, 0xce, 0x20, 0xdd, 0x5c, 0xe0, 0x35, 0x0a, 0xf9, 0x9b, 0xe0, 0xd5, 0xa5, 0x76, 0xf6, 0x7f, 0x9a, 0x96, 0x3b, 0x92, 0x37, 0xe5, 0xb1, 0xb7, 0xba, 0x0c, 0xe0, 0x73, 0x07, 0x99, 0xac, 0xa4, 0x3d, 0x2f, 0x14, 0x69, 0x6f, 0x70, 0xf5, 0x2b, 0xe5, 0x11, 0x31, 0x71, 0x02, 0xca, 0x77, 0xb2, 0x81, 0x1c, 0xc5, 0xe9, 0xf4, 0xcd, 0x85, 0xb0, 0xd0, 0x97, 0x10, 0xa9, 0xc5, 0xa9, 0xc5, 0xcf, 0x6c, 0xd3, 0x5d, 0xe5, 0x55, 0xe2, 0x2a, 0xb3, 0x23, 0xda, 0x36, 0x63, 0xa7, 0xd7, 0x1c, 0xb8, 0xba, 0x5a, 0x2b, 0xd2, 0x88, 0xdb, 0xe1, 0x77, 0xf9, 0x2b, 0xf6, 0x9f, 0xa5, 0xa5, 0xcd, 0x08, 0x8e, 0x2e, 0x72, 0x35, 0xac, 0x50, 0xe5, 0x5f, 0xfa, 0xf9, 0xa4, 0x9d, 0x7c, 0xfd, 0xf8, 0x15, 0x35, 0x38, 0xa1, 0x7e, 0x26, 0x0c, 0x9a, 0x16, 0x3a, 0x14, 0x22, 0x14, 0x9d, 0x26, 0x33, 0x55, 0x76, 0x53, 0x2e, 0xaa, 0x84, 0xb0, 0xb0, 0x2d, 0x4d, 0xff, 0x4d, 0x08, 0x01, 0x69, 0x2a, 0x97, 0xdc, 0xff, 0x41, 0x35, 0x27, 0xc1, 0x93, 0xed, 0xd7, 0xe7, 0x70, 0xcb, 0x9c, 0xa1, 0x8a, 0xa0, 0xce, 0x42, 0xd7, 0x41, 0x5d, 0x9a, 0xef, 0x08, 0x58, 0xd2, 0x8b, 0x72, 0x3f, 0x21, 0xeb, 0xcf, 0x20, 0xaf, 0xed, 0x0b, 0xc4, 0x25, 0x14, 0xe9, 0x57, 0xd5, 0x0d, 0xc7, 0xcb, 0x56, 0x10, 0x89, 0x11, 0xa5, 0x92, 0xb3, 0xbb, 0xb1, 0xc7, 0xc7, 0x94, 0x4f, 0x0a, 0x9d, 0xcd, 0x10, 0x62, 0x06, 0xa7, 0x48, 0x68, 0x2e, 0x67, 0xf0, 0xb0, 0x1e, 0x12, 0xd6, 0x27, 0xaf, 0xef, 0xe9, 0xa5, 0x6e, 0x58, 0x79, 0x6a, 0x4f, 0xc6, 0xad, 0xee, 0xb3, 0x5d, 0xd4, 0xf8, 0x51, 0x47, 0x71, 0x55, 0x5f, 0x25, 0xc6, 0x57, 0x0d, 0xbe, 0xba, 0x8a, 0xa9, 0xf6, 0x25, 0x24, 0x32, 0x76, 0x9f, 0x75, 0x3b, 0xfa, 0x30, 0xf2, 0xa1, 0x5e, 0xea, 0x69, 0xa4, 0x4b, 0xa3, 0x27, 0x25, 0x3c, 0x3f, 0xe1, 0xb1, 0x1f, 0xd3, 0x03, 0x52, 0xf4, 0x8e, 0xf4, 0xf3, 0x10, 0x83, 0x69, 0x81, 0x58, 0x44, 0x3f, 0x93, 0xb6, 0x41, 0x1b, 0x86, 0x5d, 0x9d, 0xe4, 0x16, 0x51, 0xac, 0x02, 0xb1, 0xdb, 0x77, 0xdc, 0x51, 0x61, 0x8d, 0x5b, 0x04, 0x08, 0xa6, 0x8d, 0xa0, 0x89, 0x11, 0xf4, 0x95, 0xd8, 0xc1, 0x87, 0xb2, 0xa9, 0xe1, 0xb1, 0x68, 0xbb, 0x0d, 0xdf, 0x2d, 0x14, 0xa5, 0x0f, 0x1b, 0x5a, 0xbd, 0x32, 0x2f, 0x88, 0x9b, 0x5d, 0x78, 0xdf, 0x89, 0x13, 0x62, 0xc3, 0x4f, 0x6b, 0x29, 0xa0, 0x0c, 0x65, 0x21, 0x9a, 0x4f, 0x18, 0xbc, 0x4c, 0x94, 0x21, 0x37, 0x76, 0x22, 0xf8, 0x39, 0x21, 0xe2, 0xb3, 0x7c, 0x83, 0xe3, 0x13, 0x1b, 0x92, 0x30, 0x9e, 0x07, 0xc9, 0x78, 0xe5, 0xe9, 0x4a, 0x0b, 0x09, 0xe3, 0x9c, 0x8e, 0x00, 0x98, 0x1b, 0x57, 0x92, 0x1e, 0x3b, 0x78, 0x24, 0xc2, 0xf7, 0x24, 0x31, 0x15, 0x99, 0x5b, 0xc8, 0x58, 0xc0, 0x32, 0xde, 0x31, 0x3a, 0xb8, 0xb4, 0xac, 0xde, 0xfe, 0x2f, 0x1b, 0x82, 0x42, 0xe9, 0xb0, 0x7e, 0xd0, 0x68, 0x0d, 0x69, 0xce, 0xa4, 0x2a, 0x2a, 0x63, 0xc2, 0xfd, 0xc3, 0xd4, 0x73, 0x0e, 0x2c, 0xd5, 0x8e, 0x5c, 0xeb, 0x2b, 0x7e, 0x31, 0xd4, 0x1a, 0x49, 0x64, 0xd0, 0xb4, 0x5b, 0x06, 0x4c, 0xb4, 0x55, 0x25, 0xf1, 0x8e, 0xc6, 0xd7, 0xe9, 0x37, 0x11, 0x46, 0x40, 0x43, 0xb2, 0x9d, 0x51, 0xfe, 0x83, 0x51, 0xf6, 0xd4, 0xca, 0xd3, 0xed, 0x0c, 0x0f, 0x74, 0xa5, 0x4c, 0xc7, 0x29, 0x4f, 0x55, 0xf1, 0x71, 0x6d, 0x90, 0x9a, 0x36, 0x51, 0x3a, 0x7f, 0xbb, 0xd1, 0x37, 0x8a, 0xde, 0xd6, 0xfe, 0xb7, 0x1c, 0xbe, 0xe4, 0xc6, 0x4e, 0xb0, 0x91, 0x54, 0xd2, 0xf3, 0x1b, 0xbe, 0xaa, 0x1a, 0xf6, 0x70, 0xbd, 0x07, 0x5d, 0x65, 0xa9, 0xd4, 0xbd, 0xda, 0xa3, 0x35, 0xad, 0x2f, 0x88, 0x7e, 0xb4, 0x0c, 0x8c, 0x62, 0x5a, 0x9a, 0x03, 0x3b, 0x9d, 0x67, 0x1b, 0x94, 0xa2, 0xce, 0x7d, 0x9d, 0x05, 0x0d, 0x19, 0xe2, 0x84, 0x3e, 0xb4, 0x5d, 0xc2, 0xf1, 0x72, 0x9f, 0xbd, 0xad, 0x52, 0xa4, 0x7a, 0xa2, 0x4a, 0x99, 0x28, 0x5b, 0x9a, 0x47, 0xb0, 0xac, 0xc5, 0x02, 0x4b, 0x2d, 0x3f, 0xc5, 0x20, 0xed, 0xcd, 0x8c, 0xda, 0x44, 0x73, 0x0f, 0x68, 0x86, 0x19, 0xce, 0xf0, 0xf5, 0x58, 0x44, 0x0d, 0xb6, 0x4e, 0x4d, 0x1e, 0xf6, 0x72, 0xcb, 0x3a, 0xff, 0xfb, 0xd1, 0x2a, 0xf6, 0x7e, 0x1f, 0xe0, 0xe0, 0x29, 0xdf, 0xb8, 0x0c, 0x75, 0x2d, 0x28, 0x48, 0x29, 0xa2, 0xd5, 0xcc, 0xe7, 0x9c, 0xf2, 0x0b, 0x12, 0x27, 0x19, 0xd9, 0xb7, 0x10, 0x31, 0x36, 0xc5, 0x51, 0xaa, 0xe5, 0x94, 0xeb, 0x0f, 0x36, 0xaf, 0xb5, 0xdf, 0x22, 0xd5, 0x32, 0xbc, 0xeb, 0xf7, 0x38, 0x68, 0x86, 0x3a, 0x19, 0x43, 0xed, 0x78, 0x1a, 0x15, 0x9e, 0xb9, 0xc2, 0x9c, 0x98, 0x04, 0x10, 0x28, 0x1d, 0x22, 0xd9, 0x3d, 0x20, 0x99, 0x62, 0xfb, 0xd8, 0xec, 0x13, 0x7f, 0xc0, 0x79, 0x99, 0xe2, 0x73, 0x74, 0xf7, 0xa9, 0xc9, 0x05, 0x18, 0xdb, 0x15, 0x11, 0x12, 0x5c, 0xd7, 0xeb, 0x53, 0x6f, 0xba, 0x3b, 0x7c, 0x8c, 0x7d, 0xd8, 0x74, 0xa1, 0x32, 0x8e, 0x3c, 0x3f, 0x59, 0x5d, 0x3c, 0xcf, 0xf5, 0xee, 0x62, 0x2d, 0x50, 0x23, 0xbd, 0x3d, 0x13, 0xce, 0x0d, 0x90, 0xc9, 0xf5, 0xbd, 0x80, 0x2e, 0xf8, 0x7d, 0x9c, 0x9d, 0xbd, 0xd2, 0x2b, 0xad, 0x2b, 0x44, 0x0f, 0x47, 0x07, 0x7b, 0x64, 0x57, 0x2e, 0x9e, 0xbd, 0xff, 0x63, 0xa2, 0xf6, 0x6c, 0xc0, 0x2a, 0x93, 0x77, 0xfb, 0xb8, 0x9c, 0x7a, 0x77, 0x4b, 0x24, 0x6b, 0x0e, 0xb0, 0x2b, 0xa3, 0xcf, 0xa9, 0xec, 0x5c, 0x7d, 0x4c, 0xcd, 0xbf, 0x65, 0xbb, 0x5d, 0x8b, 0x43, 0x69, 0x45, 0xdb, 0x8b, 0x81, 0xdf, 0x3b, 0x34, 0xd6, 0x8c, 0x74, 0xc8, 0x63, 0xd5, 0x88, 0x5c, 0xfe, 0xd7, 0x9b, 0xd8, 0x32, 0x42, 0x88, 0x79, 0x81, 0x33, 0xaa, 0x9c, 0x0e, 0x0e, 0x90, 0x52, 0xf8, 0x44, 0x10, 0xb3, 0x01, 0x07, 0xf9, 0x3b, 0x67, 0x26, 0x71, 0xf2, 0x7b, 0x39, 0xf0, 0x1e, 0xe8, 0xc8, 0xd2, 0xbd, 0xbe, 0x36, 0xae, 0x28, 0x8f, 0xe7, 0xf3, 0x1a, 0xb5, 0x92, 0xf2, 0x46, 0x48, 0xf6, 0xc1, 0xc3, 0x1d, 0x05, 0xe5, 0x26, 0xd3, 0xba, 0x32, 0xcd, 0x17, 0x64, 0xbd, 0xc1, 0xfc, 0xd1, 0x53, 0xbf, 0x8d, 0xd4, 0xf4, 0x03, 0x48, 0x24, 0xb8, 0x16, 0x40, 0x63, 0xce, 0xd3, 0xd1, 0xf2, 0x21, 0x38, 0x9e, 0x01, 0xc4, 0x6a, 0xfb, 0x0b, 0x27, 0x35, 0x6d, 0xf5, 0x65, 0x67, 0xe2, 0x2a, 0x20, 0x32, 0xbc, 0xa8, 0xca, 0x95, 0x24, 0xb2, 0xe9, 0xab, 0xaa, 0xa8, 0xcf, 0xa3, 0xb6, 0xc4, 0x29, 0xe2, 0x5b, 0x72, 0x00, 0x64, 0x64, 0x96, 0x25, 0x04, 0xb0, 0x98, 0x74, 0xfb, 0xe8, 0x90, 0x83, 0x4e, 0x9f, 0x08, 0x0e, 0xbe, 0x71, 0xfa, 0xf5, 0x5f, 0x0d, 0xd9, 0xb3, 0x1e, 0x11, 0xb8, 0x50, 0x28, 0x5d, 0x21, 0xd9, 0x77, 0x28, 0xa7, 0xa8, 0x63, 0x84, 0xeb, 0xab, 0xa1, 0x29, 0x35, 0xf9, 0xc6, 0x6a, 0xfa, 0x7b, 0x31, 0xbb, 0xdc, 0x4a, 0xce, 0x86, 0xd4, 0xcd, 0x64, 0x53, 0x45, 0x4b, 0x0b, 0x8c, 0x1d, 0x76, 0x8d, 0xd2, 0x27, 0x74, 0xf2, 0x37, 0x95, 0x84, 0xe3, 0xfd, 0x43, 0xf6, 0x0c, 0x44, 0xea, 0xbc, 0x4c, 0x52, 0x6f, 0xca, 0x23, 0x48, 0x92, 0xa8, 0x43, 0x3e, 0x64, 0xd6, 0x0e, 0xd1, 0x59, 0xf2, 0xe2, 0xfe, 0xe5, 0xdc, 0x12, 0x9a, 0x65, 0x26, 0x1d, 0x18, 0x1f, 0x8d, 0xf8, 0xeb, 0xc5, 0x92, 0xcc, 0x47, 0x1d, 0x32, 0x60, 0xe7, 0x7b, 0xa6, 0xd2, 0x09, 0xaa, 0x70, 0xfc, 0x1e, 0x02, 0x70, 0x54, 0xff, 0x71, 0x93, 0xa5, 0x28, 0xc9, 0xf4, 0x08, 0x5a, 0xa6, 0x29, 0x85, 0x77, 0xaa, 0xdc, 0xdb, 0x8e, 0xb6, 0x52, 0x48, 0x97, 0x02, 0x16, 0x4c, 0x87, 0x19, 0x06, 0x2f, 0x3f, 0x31, 0x1a, 0x42, 0xc0, 0xd3, 0xed, 0xcf, 0xd5, 0x43, 0x82, 0xcc, 0xc8, 0xbf, 0x4f, 0x45, 0x0f, 0x09, 0x3e, 0xc3, 0x80, 0x39, 0xd2, 0x08, 0xe5, 0x02, 0x63, 0xfe, 0x35, 0xe8, 0x27, 0x9a, 0xb7, 0x54, 0xb2, 0x9d, 0x06, 0x24, 0x2a, 0x22, 0x90, 0xbf, 0x99, 0x48, 0x7a, 0x1a, 0x9e, 0xc7, 0xb5, 0x1f, 0xea, 0x63, 0x2c, 0x45, 0xff, 0x41, 0x59, 0xa7, 0x5e, 0xd1, 0xb4, 0x54, 0x93, 0x30, 0x9f, 0xa7, 0x7e, 0xbb, 0x1f, 0x90, 0x27, 0x32, 0xc1, 0x9d, 0x55, 0x45, 0xf7, 0x25, 0x40, 0x4d, 0xbc, 0xdf, 0x23, 0xd4, 0xcf, 0x5d, 0x2f, 0x03, 0xdf, 0xda }; +constexpr AccessUnit ATRACX_LARGE_AU_EXPECTED_AU = { 0x15f90, 0x159b2, false, 0, {}, { 0x11, 0x92, 0xc6, 0xab, 0x16, 0x53, 0x3d, 0x96, 0x54, 0xa0, 0x81, 0xef, 0x3b, 0x10, 0x94, 0x47, 0x4a, 0x4d, 0x0a, 0x36 } }; + +const std::vector AC3_LARGE_AU_STREAM = { 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xbd, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x30, 0x00, 0x00, 0x00, 0x0b, 0x77, 0xe2, 0x05, 0xa5, 0xda, 0x2b, 0xef, 0x62, 0xd4, 0xa5, 0xaf, 0xd9, 0x1b, 0xd0, 0x7c, 0xec, 0x75, 0x5e, 0x09, 0x04, 0x80, 0xb4, 0x45, 0x05, 0x0e, 0xb6, 0xa6, 0x5d, 0x0d, 0x01, 0x68, 0x40, 0xce, 0x9f, 0x93, 0xf9, 0x3e, 0xda, 0x08, 0x41, 0x76, 0xeb, 0x39, 0xfa, 0xbb, 0xe6, 0xd6, 0x8e, 0x40, 0x05, 0x75, 0xbc, 0x84, 0x47, 0x2b, 0x79, 0x20, 0x5e, 0x94, 0x66, 0x36, 0x39, 0x4c, 0xd4, 0xa9, 0xa9, 0xf7, 0xf7, 0x9e, 0x0e, 0x80, 0xe8, 0x5a, 0x63, 0xb4, 0x53, 0x04, 0x59, 0xe5, 0xf6, 0x31, 0xc9, 0x6d, 0xe3, 0x29, 0x13, 0x81, 0xd5, 0x17, 0x70, 0xf3, 0x9c, 0x2c, 0x7a, 0xec, 0xcf, 0x9b, 0xb2, 0xe9, 0x62, 0x25, 0xf3, 0x1f, 0x4b, 0x08, 0xcc, 0x67, 0xaf, 0x7c, 0x21, 0x7a, 0xac, 0xda, 0xf6, 0x06, 0x6d, 0x3f, 0x48, 0xac, 0x8e, 0xc6, 0x0a, 0x49, 0xe3, 0xf6, 0x60, 0x07, 0x62, 0x7b, 0xa6, 0x86, 0x85, 0xf2, 0xac, 0xa2, 0x11, 0x7b, 0xda, 0x9d, 0xa3, 0xad, 0x10, 0xe4, 0xe1, 0x7d, 0x13, 0x8a, 0xe6, 0xcb, 0xe0, 0xf7, 0xec, 0xc0, 0x51, 0x1e, 0xf5, 0x51, 0x4f, 0x08, 0xbc, 0x30, 0xcf, 0xaa, 0x9c, 0x6b, 0xf7, 0xc4, 0x85, 0xe6, 0x72, 0x06, 0xbf, 0x1f, 0x0a, 0x59, 0xf2, 0x27, 0x8e, 0xb2, 0xde, 0x77, 0x1c, 0x4a, 0x6d, 0x3a, 0x10, 0x31, 0x70, 0x19, 0x30, 0x4e, 0x73, 0xbb, 0xf6, 0xf2, 0xf4, 0x7f, 0x5f, 0xb5, 0x08, 0x34, 0x72, 0x40, 0x66, 0x9a, 0xa0, 0xe7, 0xb2, 0x60, 0x12, 0x0b, 0x0a, 0x01, 0x6b, 0x18, 0x0b, 0x63, 0xc9, 0xf2, 0x9c, 0x63, 0xde, 0xf7, 0x41, 0xca, 0xfb, 0x4f, 0x62, 0x69, 0x31, 0x44, 0xd4, 0x78, 0xf6, 0xce, 0xc9, 0xc5, 0x3d, 0x89, 0x7b, 0xee, 0xf9, 0x7b, 0xab, 0x0a, 0x1b, 0xb3, 0x32, 0xc8, 0xad, 0x1a, 0xdc, 0x4c, 0xf4, 0x6d, 0x5d, 0xc0, 0x7a, 0x9b, 0x17, 0x2f, 0xf4, 0x49, 0x15, 0xe3, 0x17, 0x1f, 0x4e, 0x40, 0x2e, 0x51, 0x41, 0xa8, 0x71, 0x0d, 0x9c, 0x7b, 0x4f, 0xad, 0x57, 0xc3, 0xb3, 0xa6, 0x38, 0x50, 0xa0, 0x43, 0x68, 0xa2, 0x38, 0xc1, 0xf3, 0x42, 0xfc, 0x3f, 0xa3, 0x29, 0x06, 0x2b, 0x8a, 0xff, 0x58, 0xa4, 0x61, 0xef, 0xc0, 0xbf, 0x34, 0x99, 0x6b, 0x86, 0xaf, 0x92, 0x4b, 0x00, 0xcd, 0xfe, 0xe8, 0xae, 0x26, 0xfc, 0x9f, 0xb4, 0x55, 0x52, 0x84, 0x5c, 0x06, 0x99, 0xf8, 0x08, 0x98, 0x09, 0x4d, 0x67, 0x7e, 0xc9, 0xa2, 0x98, 0xe0, 0x55, 0xc1, 0x30, 0x87, 0x85, 0x4d, 0xdf, 0xaf, 0x57, 0x09, 0x37, 0x43, 0x3b, 0x49, 0xee, 0x13, 0x69, 0xc8, 0x53, 0xa7, 0x9c, 0xb2, 0x87, 0x87, 0xd5, 0xcf, 0x4b, 0xa8, 0xb0, 0x4a, 0x2e, 0xd2, 0x47, 0x31, 0xad, 0x77, 0x29, 0x43, 0xf7, 0x69, 0x90, 0x8f, 0x84, 0xd5, 0x8a, 0xea, 0xb2, 0x1f, 0x27, 0x7a, 0x2a, 0xf7, 0x6b, 0x90, 0x0f, 0xed, 0x72, 0x97, 0xdf, 0xf2, 0x03, 0xb3, 0xd3, 0xee, 0x99, 0x6e, 0xce, 0x6c, 0x3f, 0x9d, 0xc5, 0x0a, 0x57, 0xcd, 0xbd, 0x5f, 0x25, 0x7b, 0x64, 0x27, 0xb3, 0xef, 0x34, 0xaa, 0x06, 0x1c, 0x6c, 0x75, 0xd2, 0x9d, 0xc8, 0xd5, 0x96, 0x0c, 0x31, 0x9f, 0xdd, 0x75, 0x99, 0x0e, 0x77, 0x10, 0xe5, 0x77, 0xda, 0xc8, 0xde, 0xc5, 0xf5, 0x3b, 0xae, 0x2f, 0xe2, 0x08, 0xc1, 0x43, 0x02, 0xf0, 0x13, 0x15, 0xfc, 0x86, 0xbf, 0xaa, 0x31, 0xac, 0x6b, 0xdd, 0xac, 0x60, 0x4e, 0xe2, 0x69, 0x26, 0xd9, 0x8b, 0xdb, 0x69, 0x41, 0xc8, 0x04, 0x76, 0x29, 0xa1, 0xb3, 0xba, 0xee, 0xf8, 0xa5, 0x1e, 0x02, 0x86, 0x2c, 0x62, 0x0a, 0x00, 0x7d, 0xba, 0x57, 0x39, 0x85, 0xd3, 0x03, 0x7e, 0x42, 0x0c, 0x06, 0x74, 0x15, 0x5b, 0xba, 0x82, 0x96, 0x61, 0x6a, 0x3d, 0x93, 0x8a, 0xae, 0x0c, 0xf1, 0x45, 0x61, 0x22, 0x58, 0xcc, 0xd7, 0x64, 0xb4, 0x23, 0x0a, 0xa7, 0xf1, 0xd8, 0x82, 0xce, 0xb8, 0x3b, 0xf1, 0xc8, 0x9d, 0xb4, 0xb2, 0x2b, 0x9a, 0xc4, 0xf3, 0x9d, 0x6c, 0xe9, 0x5a, 0xca, 0x37, 0x8f, 0x03, 0xb2, 0xad, 0x52, 0x67, 0xd0, 0x53, 0x72, 0xd2, 0xeb, 0xc6, 0x93, 0x41, 0x31, 0x83, 0x60, 0x18, 0x48, 0xb7, 0xe8, 0xe4, 0x93, 0xbc, 0x0b, 0xab, 0xd6, 0x78, 0x8a, 0x7d, 0x24, 0x83, 0x49, 0xf4, 0x80, 0x77, 0xfa, 0xb1, 0xa1, 0xa6, 0x7a, 0x7f, 0xd7, 0xba, 0x9d, 0x62, 0x46, 0x30, 0xc4, 0x38, 0xf5, 0x97, 0x11, 0x00, 0xdc, 0xfe, 0x93, 0xe9, 0xcd, 0xbf, 0xd0, 0x55, 0xea, 0xce, 0xb0, 0x70, 0x76, 0x2d, 0x69, 0x2b, 0xdc, 0xe9, 0x6a, 0xfe, 0xda, 0x36, 0x3b, 0xca, 0x3d, 0x0a, 0x7d, 0x76, 0x7e, 0x0d, 0xad, 0x93, 0xe8, 0xa6, 0xfc, 0x17, 0x31, 0xb0, 0x0b, 0x77, 0xc7, 0x9f, 0x75, 0x41, 0xe3, 0xe3, 0xea, 0x48, 0xc6, 0xe9, 0x62, 0x69, 0xbd, 0x87, 0x86, 0x5f, 0xe4, 0x13, 0xbf, 0xb9, 0x63, 0xc8, 0xb4, 0x24, 0x49, 0x17, 0x5c, 0xe5, 0x5f, 0xc1, 0x4d, 0x77, 0x78, 0x26, 0xbd, 0x66, 0x21, 0xcf, 0xd0, 0x3b, 0x7e, 0x01, 0x06, 0x49, 0x9a, 0x99, 0x46, 0x89, 0x18, 0xa3, 0x3e, 0x1b, 0xae, 0x6a, 0x33, 0xdd, 0xca, 0x36, 0x33, 0x34, 0xa8, 0xa8, 0xd3, 0x18, 0x6c, 0x6b, 0x7e, 0x1e, 0x0f, 0xca, 0x12, 0x35, 0x78, 0xc2, 0x30, 0x84, 0xcf, 0xc4, 0xe5, 0x81, 0x65, 0xc7, 0xf3, 0xb5, 0xed, 0x89, 0xaa, 0x65, 0xcf, 0x9d, 0x71, 0xd8, 0x06, 0x5a, 0xac, 0xe5, 0x66, 0xf2, 0x18, 0xc4, 0x28, 0x54, 0xdc, 0x45, 0x1b, 0x16, 0x7b, 0xd9, 0x56, 0x70, 0x9f, 0x66, 0x92, 0x65, 0x50, 0x95, 0x27, 0x75, 0x2c, 0x85, 0x67, 0x8d, 0x6e, 0x6e, 0x12, 0x09, 0xa5, 0x34, 0x62, 0x55, 0x50, 0xc8, 0xb0, 0xe6, 0xd8, 0x63, 0x81, 0x63, 0xc7, 0x44, 0xf1, 0x35, 0x5e, 0xc6, 0x41, 0x24, 0x6c, 0x00, 0xb3, 0xba, 0x5f, 0x7b, 0x4a, 0x01, 0x49, 0x6a, 0x64, 0x45, 0x7b, 0xf1, 0xce, 0x3b, 0xe3, 0x59, 0xeb, 0x83, 0xd1, 0xda, 0xa7, 0x5e, 0x60, 0x8f, 0x16, 0x32, 0x06, 0xa9, 0xd8, 0x88, 0x2d, 0x5a, 0xf9, 0x21, 0x51, 0xb2, 0x1b, 0x62, 0x2a, 0x6a, 0xce, 0xd3, 0x02, 0x06, 0xc1, 0xf5, 0x2f, 0xe7, 0xb4, 0x6e, 0x22, 0x2b, 0x52, 0x80, 0x94, 0x7c, 0x86, 0xc6, 0x0f, 0xfd, 0xc1, 0xd0, 0x7e, 0xb1, 0x8d, 0xd1, 0x5f, 0xa6, 0xd9, 0x1b, 0x42, 0x62, 0x88, 0x11, 0x68, 0x21, 0x9e, 0x66, 0x6e, 0xca, 0xf6, 0xa0, 0x9a, 0x05, 0xef, 0x4c, 0xa4, 0xf4, 0x59, 0x7a, 0x33, 0x25, 0x22, 0xdc, 0xf8, 0x32, 0x34, 0xbb, 0x2f, 0x0a, 0xf0, 0xb7, 0x2f, 0x47, 0x1a, 0x08, 0x62, 0xcb, 0x46, 0xaf, 0x67, 0xf0, 0x9d, 0x02, 0xb9, 0x24, 0x26, 0x2a, 0x84, 0x61, 0x62, 0x3e, 0x44, 0x36, 0xd0, 0x41, 0x37, 0xf6, 0x48, 0xd7, 0x6d, 0x02, 0x4e, 0xef, 0xe1, 0x57, 0xc3, 0x0a, 0xc4, 0xe3, 0x9f, 0x63, 0x49, 0xed, 0x3a, 0xda, 0x68, 0xd5, 0x51, 0x96, 0x58, 0x05, 0xa6, 0xdc, 0xf9, 0xcb, 0xeb, 0x7d, 0x1a, 0xfe, 0x99, 0x0f, 0xca, 0x35, 0x65, 0xdc, 0x82, 0xae, 0x3b, 0x05, 0x02, 0x0e, 0xad, 0xf7, 0x55, 0xfb, 0xc6, 0x1d, 0xc1, 0x00, 0x50, 0x29, 0x1b, 0x10, 0xa2, 0x4d, 0x7f, 0x58, 0xea, 0x85, 0x56, 0x13, 0x74, 0x76, 0x4e, 0xd4, 0x30, 0xc4, 0xec, 0x81, 0xc2, 0x2d, 0x8d, 0x54, 0x61, 0x50, 0xb2, 0x98, 0xab, 0x89, 0x16, 0x7d, 0xaf, 0x78, 0xa7, 0x99, 0xdd, 0x91, 0xa8, 0x20, 0xc0, 0x0f, 0xf9, 0x76, 0xde, 0xaa, 0x16, 0x2d, 0xcb, 0xc3, 0x12, 0xeb, 0x6a, 0x9c, 0x57, 0xfa, 0x76, 0xb0, 0x30, 0x3a, 0x0e, 0x82, 0xc1, 0x6f, 0x9a, 0x43, 0xfa, 0x8d, 0xf6, 0xf9, 0x97, 0x1a, 0xf9, 0x70, 0x44, 0xa5, 0x04, 0x13, 0xc5, 0x5e, 0x89, 0x68, 0xf5, 0x3c, 0x53, 0xa7, 0xd2, 0x2d, 0x15, 0x77, 0x7a, 0xfc, 0x3e, 0x94, 0xe4, 0xa7, 0x66, 0xbe, 0xe6, 0xcd, 0x72, 0x34, 0xa8, 0x92, 0x64, 0x18, 0x81, 0x16, 0x8a, 0x7c, 0x12, 0xdd, 0x9a, 0xc0, 0x3e, 0x2f, 0x0b, 0xb7, 0x55, 0xfe, 0xc3, 0x2a, 0x04, 0x60, 0x0d, 0x98, 0x4c, 0x63, 0xfb, 0x13, 0x2b, 0xb9, 0x07, 0xc3, 0xb0, 0x69, 0xec, 0x56, 0x55, 0xe4, 0x50, 0xc5, 0x60, 0xb7, 0xd6, 0x2d, 0xf2, 0xff, 0xbb, 0x26, 0xeb, 0xb3, 0xc5, 0x41, 0xdd, 0x11, 0x20, 0x97, 0xb3, 0x4a, 0xa8, 0x14, 0xb0, 0xa0, 0xd4, 0x35, 0xaa, 0x5a, 0xa7, 0x68, 0xb5, 0xcc, 0x8d, 0xab, 0xa2, 0x68, 0x38, 0x9a, 0x9e, 0xbb, 0xe6, 0x3d, 0x2f, 0xc0, 0xd3, 0xe9, 0x9c, 0x74, 0x51, 0xe8, 0xce, 0x5d, 0x0d, 0xcf, 0xea, 0x44, 0x01, 0x32, 0x39, 0x8e, 0x00, 0x0e, 0xa4, 0x0e, 0x28, 0x04, 0xf1, 0x1b, 0xa2, 0xd1, 0x34, 0xa6, 0x52, 0xc5, 0x2c, 0xd4, 0xf2, 0xd5, 0x53, 0x99, 0x67, 0x07, 0x92, 0x6e, 0x6c, 0x66, 0xfe, 0x29, 0xbd, 0xdf, 0x63, 0x72, 0x82, 0xde, 0xb1, 0x2a, 0xb7, 0x06, 0xc1, 0xa6, 0x71, 0x61, 0x61, 0x79, 0xc0, 0x0c, 0x1f, 0x56, 0x5e, 0x97, 0xe6, 0xb8, 0xfb, 0xe6, 0x00, 0xcd, 0x1a, 0xb5, 0x18, 0xf9, 0xad, 0x35, 0x6b, 0x9d, 0xf8, 0x9a, 0xfc, 0x87, 0x7a, 0xb6, 0x3b, 0x10, 0xa0, 0xb7, 0x67, 0xc5, 0xa0, 0xdb, 0xd8, 0x59, 0xde, 0xb2, 0x18, 0x81, 0xce, 0x84, 0xbc, 0xf0, 0xfe, 0xa2, 0x53, 0x96, 0x15, 0x17, 0x0f, 0x94, 0x4c, 0xac, 0x3b, 0x4c, 0x11, 0x1f, 0xd7, 0x07, 0x79, 0x12, 0xe0, 0x1a, 0xbc, 0x16, 0x16, 0x30, 0x54, 0x71, 0x05, 0x0f, 0x66, 0x7f, 0xb9, 0x2e, 0xd7, 0x38, 0xbe, 0xaf, 0x78, 0x7d, 0x91, 0x6a, 0xee, 0x33, 0xa0, 0xea, 0xe0, 0xed, 0xbf, 0x0f, 0x59, 0x2d, 0xe3, 0x07, 0xd4, 0xa0, 0xe3, 0xb8, 0xdf, 0x83, 0x1a, 0xd8, 0x22, 0x9b, 0x42, 0x5a, 0x08, 0x2e, 0x7a, 0x4b, 0x17, 0xf4, 0x92, 0xb9, 0xb2, 0x99, 0x5e, 0x28, 0x0f, 0x4e, 0x51, 0x4f, 0x97, 0x7a, 0x1a, 0xa0, 0x7b, 0x5a, 0x0d, 0x4e, 0xab, 0x46, 0xed, 0x93, 0xa0, 0xc2, 0x04, 0x9b, 0x6f, 0xde, 0xc9, 0xf5, 0xf4, 0xb3, 0x7c, 0x37, 0xef, 0x4a, 0x93, 0xf7, 0x9b, 0x1f, 0x7a, 0x23, 0xe8, 0x08, 0x87, 0x19, 0x2f, 0xe2, 0xb8, 0xe6, 0x34, 0xac, 0x96, 0x66, 0x61, 0xf0, 0xdc, 0x16, 0x15, 0x79, 0x43, 0x3c, 0xc0, 0x43, 0x6c, 0x11, 0x51, 0x91, 0x8a, 0xd8, 0x48, 0x8d, 0xae, 0x1c, 0x69, 0xec, 0x76, 0x60, 0xdd, 0xb8, 0xc6, 0x1c, 0x40, 0x2b, 0xf0, 0x29, 0x11, 0x27, 0xc1, 0x36, 0x2c, 0x49, 0x74, 0xbd, 0xc1, 0xfe, 0x0d, 0x12, 0x3f, 0x1f, 0xd4, 0x27, 0x30, 0xc3, 0x4e, 0xfd, 0x87, 0x72, 0x25, 0xd7, 0x45, 0x12, 0xce, 0x9a, 0x93, 0x50, 0x24, 0xd2, 0x70, 0xf9, 0x46, 0x1b, 0x53, 0x59, 0x6b, 0x9e, 0x65, 0x39, 0x60, 0x01, 0xe1, 0xbd, 0x0c, 0x61, 0xfb, 0x3c, 0x0a, 0x7f, 0x3c, 0xd1, 0x5f, 0x4b, 0x82, 0xfb, 0x55, 0xde, 0x86, 0x66, 0xd1, 0xb6, 0x7c, 0x6e, 0xd9, 0xe1, 0x9f, 0x41, 0x45, 0x56, 0x2f, 0x91, 0xaf, 0xc5, 0x65, 0x45, 0xd8, 0x34, 0x31, 0x7d, 0xbe, 0xb1, 0xf5, 0xe6, 0x13, 0x8e, 0x72, 0x2e, 0x3b, 0x76, 0xbc, 0x3f, 0x34, 0x82, 0x25, 0x35, 0x6f, 0xaf, 0xe2, 0x90, 0xef, 0x08, 0xc6, 0xb4, 0xdc, 0xa5, 0x11, 0xea, 0xbb, 0x23, 0x8b, 0x71, 0x4e, 0xba, 0x6e, 0x6f, 0xb2, 0x70, 0xca, 0xf0, 0xe1, 0xfa, 0xc2, 0x93, 0x37, 0xc9, 0x24, 0xa3, 0xb9, 0x38, 0x7e, 0x38, 0xc6, 0xde, 0x2c, 0x73, 0x70, 0x1d, 0x21, 0x4b, 0xae, 0x3e, 0x46, 0x2c, 0x6f, 0x9f, 0x10, 0xd0, 0xb0, 0xee, 0x1b, 0x14, 0x19, 0x55, 0x59, 0x72, 0x7c, 0xcb, 0x53, 0x61, 0xdc, 0x52, 0x1d, 0xea, 0x47, 0x7b, 0xed, 0xe6, 0x06, 0x6e, 0xbf, 0xe8, 0x56, 0xa8, 0xa7, 0xd7, 0x5d, 0xb8, 0xd0, 0x8c, 0x9f, 0xcf, 0xc3, 0x33, 0xae, 0x5a, 0x73, 0x02, 0xc2, 0x76, 0x7f, 0x65, 0x82, 0x23, 0x58, 0xed, 0x6c, 0x5e, 0xde, 0x98, 0x6c, 0x3e, 0x36, 0xec, 0x8a, 0xc1, 0x0b, 0xa4, 0x28, 0x20, 0x2c, 0xf8, 0xcd, 0xe7, 0x49, 0x50, 0xec, 0x6f, 0xe0, 0xcc, 0x76, 0x03, 0x10, 0x6b, 0xdf, 0xf8, 0x94, 0x2d, 0x71, 0x2b, 0x11, 0xd5, 0x64, 0x3f, 0xeb, 0x62, 0x50, 0x40, 0xf8, 0x94, 0x9f, 0xa4, 0x10, 0x61, 0x6c, 0x18, 0x50, 0xa1, 0x0c, 0xaf, 0x13, 0x5b, 0x96, 0x2b, 0x17, 0x05, 0x19, 0xd3, 0xba, 0x83, 0xba, 0xc2, 0xed, 0xb7, 0x58, 0xe5, 0x57, 0xd5, 0x26, 0xf4, 0xaf, 0xac, 0x0b, 0x06, 0x28, 0x79, 0xee, 0xbf, 0x76, 0xf8, 0xee, 0x93, 0xcd, 0x0a, 0x88, 0x00, 0xc2, 0xfe, 0x5a, 0x44, 0xce, 0x0b, 0xc7, 0xb5, 0x5d, 0xb8, 0x8c, 0x5c, 0x91, 0xbf, 0xd6, 0x4d, 0x16, 0xfd, 0x76, 0x5f, 0xd6, 0x2c, 0x71, 0xf7, 0x45, 0xe7, 0xf0, 0x61, 0x24, 0x55, 0x86, 0xb1, 0x88, 0x0b, 0x77, 0xc7, 0xe0, 0x54, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x02, 0xe4, 0x61, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbd, 0x07, 0xec, 0x81, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0xf2, 0x8f, 0x7b, 0xf7, 0x90, 0x80, 0xe5, 0x04, 0x40, 0xe5, 0x72, 0xe8, 0x0f, 0x33, 0x29, 0xa8, 0x11, 0x1b, 0xf6, 0xd9, 0x92, 0x2a, 0xf4, 0x5f, 0xe7, 0x96, 0x33, 0xc4, 0xd5, 0x56, 0x52, 0x07, 0x63, 0xc8, 0xa5, 0xc7, 0x4b, 0x1a, 0xf6, 0x7a, 0x9f, 0x9e, 0x15, 0x3f, 0x8d, 0x9c, 0xd2, 0xb9, 0x72, 0x78, 0x4b, 0xbe, 0x51, 0xbd, 0xca, 0xa2, 0xc7, 0xb0, 0x15, 0x55, 0x23, 0x79, 0x2b, 0x7e, 0x48, 0x2a, 0x9d, 0x5a, 0xb9, 0xc6, 0x9c, 0xbd, 0x91, 0x2f, 0x94, 0x4b, 0xff, 0x05, 0xd9, 0xb8, 0x6c, 0xb7, 0xd5, 0x13, 0x16, 0xd7, 0x7e, 0xd3, 0x73, 0xd8, 0x18, 0x4b, 0x8c, 0x1b, 0x89, 0xdd, 0xdb, 0x43, 0x39, 0x73, 0x7b, 0x9f, 0x65, 0x20, 0x03, 0x74, 0xc8, 0xf4, 0x31, 0x23, 0xe8, 0xae, 0xcd, 0x7b, 0x08, 0x9d, 0x38, 0xa0, 0x48, 0x8b, 0xa2, 0xe5, 0xe6, 0xa6, 0x72, 0x1f, 0x2a, 0x71, 0x84, 0x15, 0x4d, 0xde, 0x68, 0x3e, 0xb3, 0x74, 0x0d, 0xe1, 0x5a, 0xa5, 0xc0, 0x5b, 0x95, 0x57, 0x39, 0x24, 0xda, 0xde, 0x36, 0x36, 0x59, 0x85, 0x5a, 0x8b, 0x5d, 0x6f, 0x7a, 0xfe, 0x20, 0x12, 0x9e, 0x01, 0x6e, 0xe1, 0x2d, 0x3a, 0xb5, 0xa9, 0x53, 0xcc, 0x20, 0x55, 0xcc, 0x9f, 0xe7, 0xda, 0xb0, 0x91, 0x71, 0xb3, 0xa1, 0x71, 0x49, 0xab, 0xa4, 0x41, 0xeb, 0x44, 0xb0, 0x14, 0x70, 0x69, 0xd9, 0x61, 0x3d, 0x08, 0x39, 0xee, 0x44, 0xb0, 0x14, 0x0b, 0xdb, 0xb5, 0xa6, 0x75, 0x6d, 0x11, 0x06, 0x61, 0x5f, 0x99, 0xdf, 0xd8, 0x20, 0x17, 0x96, 0x07, 0xee, 0xa8, 0x11, 0xc3, 0xbc, 0x5b, 0x1d, 0x23, 0x76, 0x87, 0x50, 0x99, 0xc8, 0x59, 0x31, 0xa1, 0x7d, 0x89, 0x46, 0x65, 0x74, 0x9c, 0x07, 0xc6, 0x9d, 0x9a, 0x53, 0xd3, 0x81, 0x68, 0xf0, 0xf5, 0x9b, 0xb9, 0x10, 0x1d, 0x5d, 0x5b, 0x34, 0x2a, 0xc6, 0x29, 0xbb, 0xd2, 0x00, 0xef, 0xee, 0x86, 0xfc, 0xcd, 0x6b, 0x5d, 0xf8, 0xa0, 0x46, 0x8a, 0xd3, 0x6d, 0x8f, 0xc1, 0x69, 0x29, 0xad, 0xa2, 0xcc, 0x33, 0x10, 0x53, 0x1f, 0xbd, 0xc6, 0x08, 0x0e, 0xd7, 0x3f, 0xcc, 0xd0, 0xaf, 0xae, 0x54, 0x16, 0x40, 0x0e, 0x64, 0xc4, 0x91, 0x50, 0xd5, 0xc3, 0x2d, 0xe9, 0xe7, 0x2e, 0x9b, 0x97, 0xd7, 0xd5, 0x63, 0xdd, 0xb5, 0x29, 0x46, 0x2c, 0xec, 0xc5, 0x02, 0x1b, 0x3c, 0xb4, 0xe4, 0xb4, 0xae, 0xa7, 0x25, 0x84, 0x0b, 0x77, 0xd3, 0xd3, 0x02, 0xdd, 0x1f, 0xab, 0x25, 0x18, 0x63, 0xe3, 0xa5, 0xb6, 0x67, 0x97, 0x42, 0xae, 0x8d, 0x77, 0x0f, 0xaa, 0x8b, 0xe2, 0x67, 0x49, 0xa2, 0x87, 0xd8, 0x66, 0x5d, 0xc5, 0xb3, 0x12, 0x52, 0x88, 0xb3, 0x34, 0x8c, 0x03, 0xda, 0x92, 0x1e, 0xbc, 0x73, 0xba, 0x4f, 0x54, 0xb4, 0x70, 0x17, 0x0e, 0x2b, 0xa9, 0x3b, 0x61, 0x32, 0x2b, 0x22, 0xb2, 0xb8, 0x61, 0xfc, 0xbb, 0xe6, 0x84, 0xa3, 0x1c, 0x65, 0xe8, 0xe4, 0x08, 0x55, 0xf0, 0x7a, 0xfc, 0x66, 0x2b, 0x7f, 0xaf, 0xe2, 0x74, 0xdd, 0x06, 0xb4, 0xa2, 0x2f, 0x44, 0xb3, 0x40, 0x84, 0xba, 0x95, 0xf5, 0x6d, 0xf9, 0x4b, 0xa2, 0x33, 0x92, 0xfe, 0x89, 0x2d, 0xd6, 0x32, 0xd4, 0xe0, 0x2b, 0x10, 0x9f, 0x65, 0xe9, 0x18, 0x76, 0x23, 0xa6, 0x78, 0x4d, 0xdf, 0x7f, 0xce, 0x87, 0xf7, 0x5a, 0xfe, 0x8f, 0x6b, 0xd7, 0x68, 0xcd, 0x00, 0x75, 0xaf, 0x14, 0xdd, 0xea, 0x85, 0x39, 0x83, 0x73, 0x2b, 0xe5, 0x64, 0x78, 0x03, 0x51, 0x4b, 0x06, 0x67, 0x32, 0x73, 0x58, 0x0c, 0x86, 0xcc, 0x09, 0xfb, 0x41, 0x7f, 0x2d, 0x67, 0xe9, 0xcf, 0x0e, 0x5d, 0x73, 0x0b, 0x76, 0x12, 0xb1, 0x66, 0x5f, 0xd0, 0x46, 0x57, 0x23, 0xad, 0xb9, 0xf8, 0x8e, 0x99, 0xc4, 0xd2, 0xb6, 0x88, 0x40, 0x7a, 0x48, 0xe1, 0x38, 0x08, 0xc3, 0x90, 0xec, 0x32, 0xd5, 0x68, 0x38, 0xfb, 0x58, 0xc4, 0x9e, 0xb2, 0x0d, 0x9e, 0xb2, 0x22, 0x22, 0xb4, 0x62, 0x49, 0x56, 0x26, 0x5f, 0xbc, 0x1f, 0xb9, 0x1b, 0x02, 0x6e, 0x0b, 0x22, 0xcc, 0x31, 0x7e, 0x64, 0x82, 0xc5, 0x75, 0x78, 0xf5, 0xa7, 0x56, 0x2e, 0x19, 0xf8, 0x73, 0x66, 0xea, 0x16, 0x52, 0x0c, 0xc4, 0xcb, 0x55, 0xf0, 0x34, 0x2d, 0x42, 0x2f, 0x0c, 0x50, 0x41, 0xc5, 0x68, 0x09, 0xd1, 0x14, 0xab, 0x6b, 0x46, 0x45, 0x35, 0x92, 0x93, 0xd0, 0x49, 0x72, 0xdb, 0x99, 0x10, 0xcd, 0x31, 0x5b, 0x97, 0x6c, 0xb7, 0x1a, 0xea, 0x04, 0x77, 0xd5, 0xb5, 0x05, 0x52, 0xe6, 0x43, 0xc9, 0x07, 0x67, 0xf7, 0xb4, 0xf1, 0x05, 0x2b, 0xb2, 0x88, 0x9a, 0x20, 0xe6, 0x4a, 0x8b, 0x8f, 0xb9, 0x32, 0x0a, 0x85, 0x2e, 0x1c, 0xcb, 0x5d, 0xdc, 0x56, 0x7f, 0x2f, 0x7a, 0x59, 0x4b, 0xf2, 0x6b, 0xb7, 0x37, 0xf8, 0x46, 0xf2, 0x85, 0xfb, 0x19, 0x37, 0x69, 0x46, 0x48, 0xbb, 0xe6, 0x3d, 0x70, 0xba, 0xbf, 0x18, 0xf7, 0xbf, 0x9d, 0xc4, 0xf6, 0xb8, 0xda, 0xdb, 0xc5, 0x14, 0x35, 0xe4, 0x2c, 0x35, 0x33, 0x13, 0x6d, 0xe6, 0xb2, 0x04, 0x9b, 0xed, 0x4c, 0x9c, 0xd3, 0xf6, 0x6d, 0x34, 0xca, 0xb7, 0xbd, 0xf0, 0x4e, 0x98, 0xbe, 0xbd, 0x70, 0xb8, 0x82, 0xef, 0xd9, 0x2c, 0x9e, 0x75, 0x14, 0x2d, 0xd3, 0x74, 0x7f, 0xf2, 0xb0, 0x6b, 0x7f, 0xb6, 0x38, 0x02, 0x1f, 0x56, 0xe0, 0xf1, 0x91, 0x55, 0x53, 0xf6, 0xad, 0x26, 0xde, 0xcc, 0x64, 0x86, 0xc7, 0xb2, 0x11, 0x74, 0x0a, 0x09, 0x91, 0x53, 0x98, 0x94, 0x44, 0xd0, 0xe5, 0x9a, 0x5f, 0x68, 0x3e, 0x21, 0x14, 0xc6, 0x3f, 0x17, 0x9a, 0x3e, 0x93, 0x6b, 0x8a, 0xbd, 0x34, 0xfe, 0x4e, 0xa8, 0x72, 0xca, 0x20, 0x01, 0x09, 0x52, 0x51, 0x67, 0x36, 0x29, 0xd3, 0x07, 0x5e, 0xbf, 0xed, 0xce, 0x56, 0xfa, 0x98, 0x5b, 0x1c, 0x68, 0xad, 0x92, 0x42, 0xb8, 0x19, 0xfe, 0x3a, 0xbf, 0x4e, 0x1f, 0x06, 0xea, 0xd2, 0x78, 0x02, 0x91, 0x21, 0xfd, 0x88, 0x83, 0x49, 0xc2, 0x31, 0x4e, 0x40, 0x6e, 0x8e, 0x41, 0xbc, 0xd0, 0x74, 0xc4, 0x07, 0xa1, 0x39, 0x8b, 0x95, 0x4c, 0x33, 0x3d, 0x4a, 0x1a, 0xdd, 0x26, 0x1b, 0xcc, 0x03, 0xf5, 0xe6, 0xc3, 0xae, 0xb4, 0x90, 0x33, 0x75, 0x8b, 0xbd, 0xfc, 0xa6, 0x22, 0xea, 0x6b, 0x5d, 0x39, 0x15, 0x1f, 0x15, 0x60, 0xea, 0x56, 0x00, 0xcd, 0x65, 0x28, 0x40, 0x59, 0x87, 0xf6, 0x40, 0x08, 0x61, 0x65, 0x8e, 0xc8, 0xde, 0x2a, 0x5e, 0x4a, 0x2b, 0xfb, 0x1c, 0x61, 0xea, 0xd0, 0xe8, 0x2f, 0xd4, 0xcd, 0x5c, 0xb4, 0xfa, 0x93, 0x87, 0xfd, 0x87, 0x56, 0x83, 0x87, 0x25, 0x25, 0xfb, 0x80, 0x87, 0x59, 0xca, 0x85, 0x55, 0x86, 0x8e, 0xd6, 0x63, 0xfd, 0x0f, 0x15, 0xb5, 0x7c, 0xf7, 0x87, 0xb9, 0x09, 0xa7, 0xbf, 0x9b, 0x36, 0x2b, 0x8c, 0x5b, 0xd1, 0xa6, 0x8a, 0xc2, 0x27, 0x6a, 0xbc, 0xb1, 0xea, 0xa2, 0x04, 0xe0, 0x6e, 0x34, 0xbf, 0x4b, 0x1d, 0x2a, 0xf2, 0xe2, 0x22, 0xfc, 0xb0, 0x58, 0x33, 0x35, 0x01, 0x51, 0x27, 0x03, 0x7f, 0x6a, 0x24, 0xb8, 0xe9, 0x8b, 0x42, 0xbd, 0x7e, 0x60, 0x39, 0xaf, 0x43, 0xfd, 0xfb, 0xb3, 0x4a, 0xc9, 0xb8, 0x21, 0xbd, 0x06, 0xad, 0x39, 0x67, 0x55, 0xc3, 0x8c, 0x01, 0x23, 0x70, 0x48, 0x7c, 0x5b, 0x5b, 0x94, 0xd3, 0x37, 0xd2, 0x27, 0xac, 0x11, 0x78, 0xd9, 0x8e, 0xbb, 0x52, 0xdf, 0x75, 0x96, 0x4d, 0x2f, 0xe0, 0x7a, 0x52, 0x02, 0xb5, 0xed, 0xc5, 0xd1, 0xe4, 0x41, 0xa5, 0x1f, 0xba, 0x3e, 0xf3, 0x1b, 0x7c, 0x61, 0x08, 0xce, 0x2e, 0xba, 0xf3, 0xa4, 0x5b, 0x46, 0x9a, 0x59, 0x64, 0xe2, 0xd6, 0x0c, 0x3e, 0x8d, 0x2d, 0xd4, 0x92, 0x15, 0xec, 0xf8, 0xfb, 0xeb, 0x35, 0x05, 0x13, 0x7c, 0x70, 0x37, 0x88, 0x3e, 0x59, 0xe4, 0x51, 0x53, 0x31, 0xc8, 0x09, 0x51, 0xf7, 0x30, 0xbe, 0xad, 0x8d, 0xe2, 0x63, 0xc8, 0x48, 0xc1, 0xee, 0x3e, 0x71, 0xc4, 0x56, 0xb7, 0x5f, 0xf9, 0x32, 0x58, 0x33, 0x14, 0x7d, 0x51, 0xbf, 0xeb, 0x23, 0x19, 0x4a, 0x07, 0x3e, 0x73, 0xd4, 0xd2, 0xc8, 0xc8, 0x2a, 0x72, 0x24, 0x0e, 0xed, 0xf0, 0xb6, 0x95, 0x0e, 0xea, 0x24, 0xcb, 0x92, 0xdb, 0xa6, 0xf3, 0xc2, 0xef, 0x73, 0x9a, 0xef, 0x3e, 0xb9, 0x00, 0xf3, 0xda, 0xe2, 0x28, 0x3b, 0xb4, 0xfa, 0x5f, 0x9e, 0xc2, 0x4b, 0x8b, 0x4a, 0xbb, 0x7c, 0x25, 0xf6, 0x32, 0xf8, 0x60, 0x07, 0xeb, 0x11, 0xb6, 0x75, 0xf2, 0xc9, 0x66, 0x87, 0xb3, 0x31, 0x96, 0x1b, 0x13, 0x99, 0x13, 0x00, 0x9e, 0xd6, 0xd7, 0x59, 0xba, 0x90, 0xf8, 0xda, 0x00, 0x96, 0x94, 0x0f, 0xa1, 0x74, 0x84, 0x9f, 0xd7, 0xc1, 0xbb, 0xd3, 0xae, 0xe6, 0x7f, 0x0f, 0x82, 0x70, 0x13, 0x4d, 0x55, 0xdc, 0x0a, 0x5f, 0xa6, 0x48, 0xae, 0x16, 0x24, 0x83, 0x38, 0x42, 0x39, 0x7b, 0x23, 0x29, 0x3f, 0x98, 0x76, 0x04, 0x3d, 0x9b, 0x60, 0x51, 0xf7, 0xc7, 0xdb, 0x50, 0x39, 0x4d, 0x87, 0x7c, 0xef, 0x1b, 0xbc, 0xf0, 0x0c, 0xa6, 0x1b, 0x27, 0x4a, 0x0c, 0x6b, 0x09, 0x3b, 0x9f, 0xc3, 0x67, 0x86, 0x0d, 0xdb, 0x11, 0xd2, 0x50, 0xbb, 0x19, 0xe8, 0xb8, 0x18, 0xf2, 0x51, 0xce, 0xa8, 0x9b, 0x12, 0x69, 0x49, 0x3f, 0x22, 0x81, 0xfe, 0x23, 0x50, 0x02, 0xc0, 0xbd, 0x4b, 0xe4, 0x36, 0xd8, 0xe5, 0x5d, 0x11, 0x29, 0x10, 0x79, 0xd9, 0x6e, 0xd0, 0xdb, 0x81, 0x57, 0x9e, 0xa7, 0x54, 0x1f, 0x85, 0xb8, 0x1a, 0xdf, 0xa6, 0xbf, 0x0a, 0x43, 0x74, 0xc2, 0xb8, 0x6c, 0x09, 0x20, 0xbe, 0x59, 0xae, 0x05, 0xc7, 0x52, 0xe2, 0x67, 0xa8, 0x00, 0x21, 0x23, 0xbd, 0x3e, 0x6a, 0x2f, 0x10, 0x44, 0x09, 0xfb, 0x62, 0x35, 0xe0, 0x9a, 0x41, 0x1f, 0x06, 0x72, 0x12, 0x49, 0xed, 0x26, 0x78, 0x67, 0xdd, 0xfb, 0x9e, 0x28, 0xe4, 0x8d, 0xe1, 0x7a, 0xa2, 0x2f, 0x64, 0xca, 0xda, 0xa0, 0xee, 0x51, 0xc5, 0x2c, 0x8d, 0x65, 0x8c, 0xb1, 0x01, 0xd0, 0x91, 0x5f, 0x60, 0x8f, 0xba, 0xbd, 0x6a, 0x7f, 0x35, 0x40, 0x74, 0xaa, 0x24, 0xad, 0x42, 0xcc, 0xfa, 0xba, 0x02, 0xc4, 0xdc, 0xda, 0x24, 0x87, 0xb7, 0xd6, 0xc9, 0x1e, 0x3e, 0xd5, 0xb2, 0x31, 0x83, 0xc8, 0x32, 0x99, 0x9e, 0xef, 0xec, 0x94, 0xe6, 0x0c, 0xba, 0x6d, 0x0d, 0x0e, 0x18, 0x3e, 0x5c, 0xfb, 0xa1, 0xbc, 0xda, 0x16, 0xec, 0x71, 0xd7, 0x67, 0xe6, 0xbb, 0x2e, 0x88, 0x4c, 0x37, 0x14, 0x71, 0x23, 0x38, 0x6d, 0xae, 0x4b, 0xb0, 0x7a, 0xd1, 0xdb, 0x2a, 0x6d, 0xbb, 0xd5, 0x9f, 0x38, 0xdf, 0x4b, 0x43, 0xe5, 0xfa, 0x27, 0x5c, 0x95, 0x45, 0x28, 0x6a, 0xfe, 0x29, 0x82, 0x49, 0x24, 0x11, 0x59, 0xc1, 0x81, 0x37, 0x22, 0x18, 0xf6, 0x35, 0xf3, 0x74, 0x54, 0xea, 0x4c, 0xed, 0x04, 0x71, 0x14, 0x20, 0x09, 0xbf, 0x79, 0x34, 0xa5, 0x15, 0xdb, 0x9c, 0xa0, 0x18, 0x67, 0xbc, 0x74, 0x83, 0x5f, 0x7e, 0x7e, 0xbf, 0x1a, 0x8a, 0x8b, 0xf3, 0xb8, 0xe8, 0x9e, 0xb6, 0x98, 0x4a, 0x99, 0x0b, 0x77, 0x9a, 0xf6, 0x47, 0x24, 0x34, 0xf3, 0xcb, 0xc3, 0x48, 0x73, 0x6b, 0x17, 0x52, 0x3a, 0xf5, 0x50, 0xcd, 0x9e, 0xc2, 0xec, 0xf6, 0x15, 0x4b, 0x67, 0xf5, 0x8c, 0x90, 0xdc, 0x4b, 0x0a, 0xb4, 0x53, 0xf8, 0x63, 0x10, 0x9d, 0x01, 0x5d, 0x97, 0xc7, 0x9e, 0xc0, 0xcf, 0x99, 0xcd, 0x71, 0x4b, 0x71, 0xd4, 0xf2, 0x3d, 0xb8, 0x79, 0xc1, 0x15, 0xfd, 0xe2, 0xc0, 0xe9, 0xb5, 0x5b, 0xef, 0xb7, 0xc4, 0x72, 0xf9, 0x65, 0x14, 0xad, 0x96, 0x2b, 0x26, 0x3e, 0x75, 0xac, 0xb1, 0xea, 0x9b, 0xd2, 0xe1, 0xd1, 0xb6, 0xe1, 0x5e, 0x46, 0xa7, 0x4f, 0x50, 0xde, 0x00, 0x3b, 0xb2, 0x7d, 0xb0, 0xdf, 0x59, 0x69, 0xd6, 0xac, 0xa1, 0x64, 0xe8, 0xdf, 0xb9, 0x71, 0xf2, 0x31, 0x45, 0x1f, 0xd2, 0x4d, 0x8b, 0x67, 0x18, 0xd9, 0x67, 0x9c, 0xd6, 0x90, 0x64, 0x04, 0x5b, 0x46, 0x12, 0x45, 0xd3, 0xb7, 0xa0, 0xc9, 0xb8, 0x25, 0x79, 0xb7, 0x7c, 0x0e, 0x08, 0xc4, 0x4b, 0x01, 0xef, 0x36, 0x6b, 0xda, 0x9a, 0xb9, 0x34, 0x1b, 0x2c, 0xba, 0xf7, 0xc9, 0xfa, 0x5a, 0x16, 0xec, 0xbb, 0x4d, 0x94, 0x40, 0x1b, 0x37, 0xaf, 0x57, 0x9c, 0x7d, 0xd1, 0x69, 0x12, 0xeb, 0xb7, 0x20, 0x0b, 0x4b, 0x67, 0x9d, 0xfb, 0x6a, 0x58, 0x81, 0xaa, 0x9a, 0xe9, 0xd4, 0xf8, 0xbb, 0x0d, 0x68, 0x8c, 0xe0, 0x88, 0x91, 0x4d, 0xd7, 0x57, 0x73, 0x62, 0x88, 0xd5, 0xb7, 0xc6, 0x2e, 0x53, 0xa1, 0xfa, 0x7b, 0x1f, 0xdf, 0xc4, 0x78, 0x48, 0xcf, 0x06, 0x52, 0xbf, 0xff, 0xa3, 0xf6, 0x97, 0xa4, 0x04, 0x4e, 0xeb, 0x56, 0xa7, 0xf9, 0x39, 0x78, 0x8e, 0x23, 0x0a, 0xbf, 0xd9, 0x4a, 0xde, 0xda, 0x9f, 0x0a, 0x94, 0x2d, 0x8b, 0xb5, 0x7e, 0x28, 0x88, 0xa0, 0xfb, 0x72, 0x63, 0x3c, 0x26, 0xa3, 0x2f, 0xd4, 0x4b, 0xd0, 0x25, 0x6d, 0xc7, 0x9b, 0x34, 0x3d, 0x54, 0xb7, 0xd2, 0x4b, 0x89, 0x81, 0x07, 0x01, 0x89, 0x0e, 0x0f, 0x22, 0x64, 0xce, 0x21, 0xff, 0x4d, 0xfd, 0x9b, 0x04, 0x0f, 0xb8, 0x44, 0xd2, 0xe1, 0x2f, 0x0c, 0x41, 0xdd, 0xf3, 0x72, 0xdd, 0x02, 0x89, 0xca, 0x3e, 0xb6, 0xc8, 0xce, 0xff, 0xaf, 0x20, 0xd1, 0x8e, 0x9b, 0xf5, 0x87, 0x94, 0x49, 0x5b, 0x9f, 0x82, 0x28, 0xd4, 0x3c, 0xe3, 0xb9, 0x46, 0x4e, 0x0a, 0x48, 0xfb, 0x8c, 0x77, 0x7b, 0xf1, 0x10, 0x6f, 0x07, 0x8b, 0x75, 0x4f, 0xaa, 0x66, 0x45, 0x6a, 0xef, 0xee, 0x6f, 0x2c, 0x3c, 0x58, 0x30, 0x3c, 0x0d, 0xa2, 0x52, 0x32, 0x6a, 0x37, 0xda, 0x25, 0xd5, 0x02, 0xf9, 0x64, 0x36, 0x0e, 0x42, 0xb9, 0xb6, 0x88, 0xa9, 0xd5, 0xd1, 0x58, 0x3d, 0x33, 0x4d, 0x92, 0xa0, 0x10, 0xe0, 0x05, 0x63, 0xc8, 0x0a, 0x72, 0x6a, 0x95, 0xa7, 0x71, 0x18, 0x6c, 0x23, 0x65, 0xab, 0x01, 0x77, 0xa7, 0x23, 0x38, 0xd9, 0x1a, 0xec, 0x4e, 0x58, 0x1f, 0x5e, 0xfc, 0xf0, 0x7c, 0xf6, 0x3e, 0x00, 0x06, 0xfc, 0x10, 0x92, 0xf9, 0x07, 0x2c, 0x60, 0xcf, 0xbd, 0x74, 0xb6, 0x5b, 0xe4, 0x81, 0x07, 0x7b, 0x92, 0x8c, 0x0b, 0xf1, 0xc1, 0xf9, 0x60, 0x96, 0x1c, 0x1f, 0xf6, 0x6e, 0x21, 0x99, 0xea, 0xce, 0x12, 0x8f, 0x9b, 0xe4, 0x69, 0xaf, 0x3e, 0x61, 0x85, 0xca, 0x96, 0xbf, 0xcb, 0xbd, 0xb3, 0x91, 0x65, 0x9a, 0xcf, 0xe8, 0xcc, 0x98, 0xb1, 0xa5, 0x5a, 0xd4, 0xaa, 0xff, 0x07, 0x54, 0x4e, 0xb9, 0x1c, 0x0b, 0x77, 0xef, 0x10, 0x11, 0x0f, 0xa7, 0x75, 0xf8, 0x24, 0xe8, 0xe2, 0xf5, 0x9f, 0xe0, 0x91, 0xd4, 0x39, 0xad, 0xd9, 0x97, 0x44, 0xc0, 0xd1, 0x00, 0x66, 0xfa, 0x69, 0xad, 0xd1, 0x2c, 0xbc, 0x46, 0x5b, 0xe7, 0x4f, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x02, 0xe4, 0x61, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbd, 0x07, 0xec, 0x81, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x97, 0xe6, 0x8b, 0xbe, 0x78, 0x2d, 0xeb, 0xc6, 0x0e, 0x8e, 0x5a, 0xa9, 0xee, 0x19, 0xd4, 0x5a, 0x17, 0x32, 0xb0, 0xf9, 0x3c, 0x7e, 0x4a, 0xb1, 0x7f, 0x9b, 0xc0, 0x9e, 0xf5, 0x0d, 0x22, 0x73, 0x1e, 0x93, 0xac, 0x8f, 0x06, 0xea, 0x26, 0x10, 0x2f, 0xca, 0x13, 0xc0, 0x8e, 0xcd, 0x52, 0x13, 0x59, 0xdf, 0x30, 0xda, 0x86, 0x9b, 0x82, 0x5a, 0xbd, 0x13, 0x34, 0xcb, 0x58, 0x31, 0xad, 0x08, 0x49, 0xc3, 0x08, 0x5b, 0xf2, 0xf8, 0x13, 0xec, 0x7a, 0x0b, 0x77, 0x1a, 0x06, 0x1f, 0xe7, 0x4b, 0xf8, 0xf8, 0x1e, 0x75, 0xab, 0xa3, 0x3e, 0xb5, 0x5f, 0x85, 0xc3, 0x77, 0xc9, 0x81, 0xeb, 0x46, 0xd9, 0x3b, 0x91, 0xe6, 0xc2, 0x13, 0x16, 0x39, 0xf0, 0x50, 0x89, 0xa6, 0x79, 0x83, 0xba, 0xe4, 0x0e, 0x6c, 0x1b, 0x8b, 0xf2, 0x46, 0xc7, 0x63, 0x01, 0xb8, 0x36, 0x45, 0x6d, 0x89, 0xdb, 0xff, 0x30, 0xa8, 0xb7, 0x67, 0x48, 0xa7, 0x74, 0xe3, 0x08, 0xbf, 0x1a, 0xa0, 0xeb, 0x24, 0xa9, 0xfb, 0x11, 0x33, 0xb0, 0x11, 0xc6, 0x22, 0x6f, 0x23, 0x99, 0x3a, 0xf2, 0x8d, 0xc7, 0x9d, 0x3c, 0xab, 0xf1, 0xaa, 0x7f, 0x19, 0x9b, 0x2f, 0xcf, 0x3f, 0xf4, 0xe7, 0x2d, 0xda, 0x49, 0x70, 0x09, 0x12, 0xb3, 0xe8, 0xc5, 0xec, 0x29, 0xd9, 0xf0, 0x36, 0x40, 0xdf, 0xdc, 0x10, 0x54, 0xba, 0x4e, 0xad, 0xbd, 0x6b, 0xe8, 0xc0, 0xed, 0x81, 0x8e, 0x57, 0xb0, 0x1c, 0xd3, 0x6c, 0x7f, 0x10, 0x1c, 0x5e, 0x51, 0x34, 0x50, 0x48, 0x9b, 0x90, 0x01, 0x50, 0x7e, 0x36, 0x28, 0x3a, 0x75, 0x90, 0x13, 0x17, 0xe6, 0x43, 0x33, 0xc8, 0xac, 0xba, 0xa8, 0x00, 0x2c, 0xa2, 0xd0, 0x98, 0xfc, 0x97, 0x8b, 0x14, 0x70, 0xa7, 0x6e, 0x80, 0xc3, 0x0f, 0xe9, 0x1d, 0x00, 0xe5, 0xac, 0x53, 0x6d, 0x0f, 0xd4, 0xc5, 0x92, 0x0d, 0xf8, 0x2f, 0x75, 0x32, 0x72, 0x8b, 0x87, 0x05, 0xb3, 0xf8, 0xce, 0x1c, 0x1a, 0x41, 0x44, 0xe8, 0x1a, 0x8b, 0x8b, 0x6a, 0x82, 0x29, 0xa7, 0x35, 0x31, 0xe8, 0xee, 0x7f, 0x9f, 0x10, 0xe4, 0xe8, 0xd0, 0xaf, 0x04, 0x18, 0x71, 0xbc, 0x45, 0xdf, 0x59, 0x84, 0xd6, 0xca, 0x1f, 0x8f, 0xd7, 0x29, 0xff, 0xc1, 0x3d, 0x18, 0xc7, 0x91, 0x16, 0x53, 0x90, 0x36, 0x70, 0x7c, 0xad, 0x7f, 0xf2, 0x67, 0x30, 0x22, 0x31, 0x5b, 0x19, 0x21, 0x86, 0x37, 0xd7, 0x82, 0x82, 0x14, 0x35, 0x06, 0xbc, 0x73, 0x55, 0x39, 0x54, 0xbb, 0xf5, 0x6e, 0xd9, 0x47, 0xc3, 0xdc, 0xd0, 0xf8, 0xd0, 0x8b, 0x1c, 0x25, 0x89, 0xdf, 0x78, 0x09, 0xb8, 0xcd, 0x98, 0x8f, 0xe8, 0xf3, 0xbe, 0x88, 0xf1, 0x26, 0x3b, 0x97, 0x02, 0x6e, 0xaa, 0xe9, 0x95, 0x5d, 0x9e, 0xe4, 0xd0, 0x53, 0xa6, 0x91, 0xa0, 0x88, 0x84, 0xc6, 0x2f, 0x0d, 0x41, 0x0c, 0x9d, 0x0f, 0x51, 0x3f, 0xea, 0xf8, 0x85, 0x14, 0x17, 0x70, 0x00, 0xf2, 0x57, 0xa8, 0x6e, 0x79, 0xce, 0x2f, 0x28, 0x3f, 0x6c, 0xb3, 0x28, 0x8b, 0x29, 0xec, 0xe5, 0x42, 0x4e, 0xf1, 0x6f, 0x1b, 0x09, 0x4e, 0x57, 0x49, 0xf8, 0xac, 0x0b, 0x32, 0x9f, 0x84, 0x01, 0x6c, 0xcf, 0x11, 0xc7, 0xb9, 0x01, 0xe1, 0xe2, 0x8d, 0x74, 0xe0, 0xff, 0xcc, 0xb6, 0x26, 0xfb, 0xf2, 0xce, 0xa3, 0x78, 0x59, 0xc5, 0x64, 0x84, 0x72, 0xed, 0xaf, 0xa8, 0x5f, 0x7d, 0xe2, 0x17, 0xa1, 0xb2, 0xc9, 0x21, 0xb0, 0x83, 0x5b, 0x2a, 0xea, 0xc6, 0xa8, 0xe0, 0x63, 0x61, 0x73, 0x1e, 0x43, 0xc8, 0xc4, 0x29, 0x19, 0xa8, 0x21, 0x1b, 0xb5, 0x80, 0x15, 0x23, 0xf4, 0xeb, 0x3e, 0x3a, 0xcc, 0x88, 0x88, 0xae, 0x5c, 0x52, 0xd5, 0xb3, 0x2f, 0x9e, 0x74, 0x97, 0x61, 0x14, 0x1b, 0x82, 0xaa, 0x75, 0xdf, 0x08, 0x58, 0x94, 0x27, 0xe8, 0x59, 0x6b, 0xc8, 0xd6, 0x2e, 0x2a, 0xc5, 0x83, 0x80, 0x64, 0x32, 0x77, 0xd9, 0xf1, 0x7c, 0xca, 0x27, 0xe2, 0x68, 0xbc, 0xf2, 0x41, 0x49, 0x5f, 0x52, 0xbf, 0xef, 0xf6, 0xcc, 0x70, 0x94, 0x37, 0xa8, 0x2d, 0xb2, 0x15, 0x9a, 0xab, 0x45, 0x26, 0xee, 0x5c, 0x5c, 0x06, 0x03, 0x24, 0x21, 0xff, 0xc5, 0x86, 0x08, 0xbe, 0x96, 0xda, 0x36, 0x45, 0x6a, 0x4d, 0xa7, 0xb6, 0xce, 0xd4, 0xde, 0x66, 0x87, 0x4e, 0xc3, 0xbb, 0x3c, 0xe7, 0xf6, 0xe5, 0x56, 0x38, 0xd0, 0x3a, 0x94, 0x9a, 0xe4, 0xea, 0x97, 0x5c, 0x1e, 0xe6, 0x1a, 0x99, 0xc8, 0xf6, 0x50, 0x3d, 0x76, 0xf9, 0xfc, 0x37, 0xbd, 0xd0, 0x7a, 0xc3, 0x51, 0x02, 0x2e, 0xea, 0xb4, 0x43, 0x88, 0x1f, 0xcb, 0x95, 0x6a, 0xda, 0x05, 0xfc, 0x8a, 0xa4, 0x2e, 0xa0, 0x60, 0x90, 0x7c, 0x66, 0xdb, 0xa7, 0x70, 0xb8, 0x39, 0xe2, 0xca, 0x74, 0x0c, 0xf8, 0x60, 0x59, 0x15, 0xa2, 0x62, 0x76, 0x73, 0xfa, 0xf3, 0x74, 0x4f, 0x57, 0xc4, 0xd4, 0xba, 0xca, 0x2e, 0x40, 0x9c, 0x45, 0x59, 0xbb, 0x6c, 0x88, 0xbb, 0x30, 0x8e, 0xdf, 0x01, 0xbb, 0x9d, 0xbc, 0xae, 0x64, 0x2f, 0xe2, 0x48, 0xbd, 0x10, 0xd6, 0xad, 0x31, 0x93, 0xb8, 0xff, 0x06, 0xf8, 0xc6, 0x01, 0x8c, 0x0e, 0x87, 0x63, 0xbb, 0x9d, 0x80, 0xa5, 0x5e, 0x0e, 0x8b, 0xc1, 0xb6, 0xec, 0xfe, 0x46, 0x23, 0x64, 0x54, 0x52, 0x46, 0x46, 0x79, 0x07, 0x4e, 0xd0, 0xd7, 0x6d, 0x8d, 0xe1, 0x9a, 0xd1, 0xfe, 0xa2, 0x38, 0xfb, 0xdf, 0x03, 0x47, 0x78, 0xd5, 0x01, 0x5c, 0xf9, 0x48, 0xa6, 0x63, 0xa0, 0xe4, 0xfb, 0x50, 0x35, 0x9f, 0xb8, 0xce, 0x80, 0x9f, 0xb5, 0x2b, 0x01, 0xcf, 0x78, 0x31, 0x72, 0x2c, 0x44, 0x66, 0xb7, 0x7d, 0x6f, 0xfd, 0x00, 0x25, 0x0e, 0xf9, 0x04, 0x98, 0x49, 0xf5, 0xc1, 0xeb, 0xae, 0x27, 0x95, 0xe4, 0x47, 0xc3, 0xb5, 0x27, 0x64, 0x2d, 0x1a, 0xa5, 0x0b, 0x57, 0xde, 0xa3, 0x23, 0xda, 0x11, 0xd5, 0xeb, 0xa9, 0xec, 0xdc, 0x6f, 0xeb, 0xc2, 0x95, 0x56, 0xf4, 0x26, 0x6d, 0xb4, 0x64, 0x8e, 0x8c, 0x88, 0x1d, 0x59, 0x25, 0xb6, 0x56, 0x78, 0x85, 0x3d, 0xf4, 0xd9, 0x12, 0xa0, 0x7a, 0xc8, 0xd2, 0x49, 0x0c, 0xfc, 0x68, 0x1c, 0xbd, 0xf5, 0xe6, 0x9a, 0x0f, 0x54, 0x1e, 0x37, 0x60, 0x9e, 0x93, 0xe5, 0xe7, 0x46, 0x9d, 0x0d, 0x2f, 0xd7, 0x61, 0xfc, 0x4c, 0xdf, 0x6c, 0x39, 0x07, 0x4f, 0x4b, 0x04, 0xfb, 0xec, 0x5c, 0x83, 0x54, 0x06, 0x14, 0x80, 0x05, 0x5f, 0xba, 0xf9, 0xec, 0x2f, 0xe3, 0x43, 0x74, 0xc6, 0x4d, 0xb9, 0x48, 0x93, 0xd8, 0xc8, 0x37, 0xdd, 0xf5, 0x39, 0x0a, 0x64, 0xb7, 0x91, 0x79, 0xf8, 0x85, 0x03, 0xbb, 0x41, 0xa1, 0xb1, 0x62, 0x2c, 0xd7, 0xec, 0x62, 0xc4, 0xc6, 0xc5, 0xc4, 0xdb, 0xb8, 0xf7, 0x5f, 0x41, 0xb7, 0x92, 0xe7, 0x17, 0xfc, 0xcf, 0x4f, 0x35, 0xb3, 0x49, 0xaf, 0xf1, 0x32, 0x3c, 0x16, 0x46, 0xc7, 0xb2, 0xef, 0xf4, 0x5d, 0x42, 0x11, 0x36, 0x29, 0x68, 0x92, 0x44, 0xb8, 0x1a, 0x14, 0xa0, 0x25, 0x94, 0x71, 0xdf, 0xa5, 0xbd, 0xa2, 0x30, 0xa8, 0xe5, 0xaf, 0x6b, 0x46, 0x62, 0xff, 0xcd, 0x34, 0xe6, 0x09, 0x4c, 0x96, 0x06, 0x5d, 0xb2, 0xb4, 0xcb, 0xc0, 0x54, 0x61, 0x56, 0x8f, 0x8e, 0xef, 0x59, 0x0f, 0x8e, 0xc2, 0x62, 0x83, 0x01, 0x50, 0x2f, 0x16, 0x6d, 0xe8, 0x6e, 0xda, 0xd6, 0x7b, 0x9d, 0xf6, 0xca, 0x30, 0x10, 0x59, 0xc7, 0x06, 0x92, 0x9d, 0xdd, 0x98, 0xd3, 0x07, 0x06, 0x3d, 0x35, 0xba, 0xe6, 0x4e, 0xf1, 0x49, 0x4f, 0x11, 0x4a, 0x75, 0x23, 0x5b, 0xc2, 0xec, 0x0c, 0x43, 0xd4, 0x9d, 0x3b, 0xfc, 0xc8, 0xc9, 0x75, 0x77, 0xee, 0x96, 0x0a, 0x52, 0xbe, 0xa5, 0x76, 0xde, 0x8e, 0x40, 0x85, 0x1d, 0x32, 0x3a, 0xe8, 0x75, 0xd1, 0x1d, 0x2b, 0x65, 0xfd, 0x40, 0xbe, 0x7d, 0x5b, 0x25, 0x95, 0xdf, 0x60, 0xde, 0xa9, 0x70, 0x5d, 0x53, 0x2d, 0xe0, 0xa1, 0x6d, 0xdb, 0xe5, 0xd5, 0xd8, 0x77, 0x19, 0xeb, 0x4e, 0xa3, 0x32, 0x82, 0x25, 0x5b, 0xe4, 0xfa, 0x90, 0x16, 0x6e, 0xfa, 0x0d, 0x77, 0xa7, 0xee, 0xf4, 0xf6, 0x50, 0xe7, 0xdb, 0x46, 0x6e, 0xe0, 0x7b, 0x37, 0xe5, 0xf6, 0xee, 0x81, 0x0b, 0x90, 0x39, 0x4f, 0x0e, 0x1a, 0x1f, 0xb5, 0x4d, 0x80, 0x7c, 0x31, 0xbd, 0x86, 0x5c, 0x30, 0x50, 0x38, 0x93, 0x18, 0x78, 0x5d, 0xbb, 0x23, 0x4b, 0x60, 0x8b, 0x42, 0x69, 0x7e, 0xfd, 0xf4, 0xaa, 0xe2, 0x9a, 0xb6, 0xe1, 0x28, 0x83, 0x37, 0x1b, 0x62, 0x17, 0x2f, 0x9b, 0xc5, 0xa1, 0x9d, 0x0b, 0xea, 0x0e, 0x9e, 0x68, 0x8b, 0xa9, 0x04, 0xf8, 0x5c, 0x21, 0x94, 0xad, 0x0b, 0x94, 0xc0, 0x43, 0x92, 0x7d, 0xd0, 0xc2, 0x09, 0x36, 0x47, 0x59, 0x4f, 0x85, 0x70, 0xba, 0x03, 0x91, 0xd0, 0x25, 0xb6, 0xf5, 0xc7, 0xd2, 0xf5, 0x38, 0x67, 0x5a, 0x26, 0xdd, 0xcb, 0xff, 0x7b, 0xac, 0xe0, 0x26, 0x13, 0xfa, 0x2d, 0xb9, 0x05, 0x86, 0xa9, 0xf6, 0xc4, 0xb8, 0x8f, 0x5d, 0x94, 0xe0, 0x51, 0xfe, 0x38, 0x6b, 0x71, 0x26, 0x3f, 0xa4, 0x93, 0x6f, 0x6d, 0xf4, 0xd8, 0x53, 0xdd, 0x08, 0xb2, 0x51, 0x7f, 0x30, 0xab, 0x46, 0x4d, 0xaa, 0x15, 0xa0, 0xba, 0xed, 0x38, 0x90, 0xb9, 0x28, 0x62, 0x2f, 0xfd, 0xae, 0xf6, 0xa1, 0x1d, 0x82, 0xfa, 0xc2, 0x50, 0x8a, 0xfe, 0xf1, 0x82, 0xaf, 0x58, 0x3e, 0xec, 0x78, 0x94, 0x54, 0x2d, 0xaa, 0x8e, 0x5f, 0xe0, 0x11, 0x41, 0xd5, 0xcf, 0x25, 0x0b, 0x37, 0x4d, 0xc0, 0x1f, 0xf0, 0x98, 0x55, 0x3e, 0x6c, 0x75, 0xd7, 0xd1, 0x60, 0xe7, 0x03, 0x03, 0x4d, 0x48, 0x5b, 0x30, 0x75, 0xb3, 0x95, 0x0b, 0xa2, 0x2f, 0x34, 0xe6, 0x23, 0xdc, 0x04, 0x36, 0x5e, 0x32, 0x5b, 0x25, 0x49, 0xe1, 0x26, 0x11, 0xbf, 0x5c, 0x27, 0xba, 0xa7, 0x1c, 0x11, 0xbb, 0xcc, 0x0b, 0x83, 0xb3, 0x46, 0x1d, 0x7b, 0xbc, 0x51, 0x11, 0x45, 0xc4, 0xbd, 0x85, 0x2a, 0xda, 0x0a, 0x86, 0xb2, 0x7b, 0x61, 0x6b, 0x3f, 0x5e, 0x6b, 0xcf, 0x77, 0x48, 0x4f, 0x59, 0xf0, 0x2f, 0x10, 0x53, 0xeb, 0x52, 0x98, 0x4d, 0xf5, 0x8f, 0xee, 0xb5, 0x97, 0xaa, 0xe7, 0xdc, 0xa5, 0x92, 0xfb, 0xd8, 0xec, 0x3b, 0x23, 0xd1, 0xbf, 0x9a, 0x99, 0xc3, 0x07, 0x56, 0xc1, 0x68, 0x99, 0x8f, 0xc6, 0xbc, 0x39, 0xf2, 0x3e, 0x20, 0xd1, 0xa3, 0xa5, 0xc5, 0x1c, 0xe6, 0x4d, 0x73, 0x83, 0x8a, 0x86, 0xbd, 0xde, 0x63, 0xdd, 0xe4, 0x78, 0x99, 0xcc, 0x8a, 0x24, 0x4b, 0x08, 0x74, 0x22, 0x11, 0x14, 0xd3, 0xfa, 0x3a, 0x90, 0xd4, 0xd6, 0xe1, 0x43, 0x2c, 0xc4, 0xfa, 0x43, 0x2e, 0x42, 0x79, 0x48, 0xb2, 0x52, 0x48, 0x76, 0x06, 0x93, 0xc1, 0x92, 0x76, 0x7a, 0xb8, 0xa8, 0x35, 0x5b, 0xb6, 0x63, 0x5d, 0x74, 0x3e, 0xb6, 0x10, 0xa1, 0x4a, 0xf7, 0x3c, 0xb1, 0x67, 0x35, 0x2a, 0x62, 0xbd, 0xd6, 0x44, 0x11, 0x0d, 0x25, 0xf5, 0xe1, 0xd2, 0xd6, 0x98, 0xfb, 0xc0, 0xc7, 0x5b, 0x0a, 0xae, 0x2d, 0x1d, 0x4e, 0x5c, 0xcf, 0x82, 0x8e, 0xd7, 0x54, 0x85, 0x93, 0xb9, 0xbe, 0x09, 0x61, 0xa9, 0x51, 0x74, 0xc8, 0xb5, 0x0f, 0xa6, 0xb2, 0x23, 0x3f, 0x5e, 0x06, 0xa4, 0x36, 0x95, 0xaa, 0xd7, 0xfa, 0x05, 0x8d, 0x32, 0x30, 0x6b, 0xae, 0x97, 0x0a, 0xf5, 0x51, 0x4b, 0x88, 0x61, 0x29, 0x81, 0xee, 0xc9, 0xde, 0xe0, 0x46, 0x19, 0x2d, 0xe8, 0xc6, 0x88, 0x0c, 0x01, 0x5c, 0xf8, 0x8c, 0xf6, 0x66, 0xa0, 0x21, 0x5b, 0x65, 0x79, 0x46, 0x7f, 0xb3, 0x85, 0x8d, 0x51, 0xd8, 0xfb, 0x94, 0xcc, 0x0b, 0x94, 0x79, 0x29, 0xcc, 0x07, 0x6b, 0xb0, 0x2e, 0x9f, 0x3b, 0x81, 0xab, 0x62, 0x0b, 0x3c, 0x2e, 0x09, 0x46, 0x6a, 0x22, 0x95, 0x04, 0x1c, 0xd1, 0x9e, 0x6c, 0x59, 0xe1, 0x0d, 0xf4, 0xc0, 0x9c, 0x58, 0x52, 0xa2, 0xf1, 0x68, 0x30, 0xe1, 0x8e, 0x4b, 0x4c, 0x3c, 0xbc, 0x0e, 0xb1, 0x5a, 0x54, 0x97, 0xef, 0x0c, 0x69, 0x6a, 0x7b, 0xbc, 0x2b, 0x02, 0xc6, 0x84, 0xfa, 0x0a, 0x92, 0xe7, 0xea, 0x11, 0x89, 0x2f, 0x16, 0xf4, 0x0b, 0xfc, 0x7d, 0xc0, 0x21, 0x7f, 0x10, 0xb7, 0x98, 0x3d, 0x50, 0x51, 0x4e, 0xcb, 0x4f, 0x06, 0x85, 0x1b, 0xda, 0xdb, 0x39, 0x15, 0x8a, 0x86, 0xe5, 0xe9, 0xa7, 0xc9, 0x52, 0xde, 0x56, 0xca, 0x87, 0x1d, 0xb1, 0x92, 0x14, 0x2a, 0x64, 0x3e, 0x3a, 0x44, 0x4e, 0x48, 0x5d, 0x1f, 0x8a, 0x26, 0x92, 0xd3, 0xf5, 0xbc, 0x0d, 0x33, 0x0c, 0x94, 0xe8, 0x47, 0x62, 0x8c, 0x86, 0xaa, 0x50, 0x5d, 0x5b, 0xb8, 0x37, 0xc0, 0x21, 0x8f, 0x10, 0xba, 0x0a, 0xd1, 0xb4, 0x33, 0xa3, 0x6b, 0xe8, 0xe3, 0x29, 0x2e, 0xfd, 0x4a, 0xd4, 0xfb, 0xa5, 0x06, 0x55, 0x3a, 0xe4, 0xba, 0x69, 0x61, 0x80, 0x5d, 0x43, 0x92, 0xb5, 0xd9, 0xeb, 0x40, 0x50, 0x4c, 0xd5, 0x74, 0x2e, 0xfa, 0x88, 0xe4, 0xf1, 0xf3, 0x36, 0xb1, 0x19, 0xf7, 0xd7, 0xba, 0x6a, 0x11, 0xc3, 0x84, 0x28, 0xc2, 0xa7, 0xda, 0x6e, 0x0b, 0xad, 0x0e, 0x8b, 0xe5, 0x32, 0xe8, 0xee, 0x77, 0x3d, 0xfe, 0xc5, 0x25, 0x76, 0xb3, 0x1a, 0x08, 0xa9, 0xf6, 0x01, 0x5d, 0x3f, 0xdb, 0xd1, 0x25, 0x59, 0xb9, 0x3f, 0x54, 0x88, 0x29, 0x42, 0xd9, 0xfd, 0xa6, 0x89, 0x01, 0x16, 0x1b, 0xbe, 0x72, 0xb5, 0x41, 0x00, 0x44, 0x15, 0xd9, 0xd0, 0xca, 0x5c, 0x50, 0xbb, 0x45, 0x76, 0x4d, 0xa3, 0x28, 0x2e, 0x76, 0x7c, 0x4d, 0xef, 0xfc, 0x95, 0x21, 0x19, 0x45, 0x77, 0xfe, 0xe6, 0x51, 0xc3, 0xad, 0xbf, 0x37, 0x41, 0xf0, 0xb6, 0x65, 0x96, 0x8b, 0xa9, 0x72, 0x64, 0x57, 0xc1, 0xcc, 0x43, 0xd5, 0x1a, 0xff, 0xcf, 0x8c, 0x03, 0x30, 0xd8, 0x92, 0x18, 0xa2, 0xf0, 0x74, 0xab, 0xb0, 0xa4, 0xf2, 0xab, 0x73, 0x66, 0x85, 0x4a, 0x07, 0x4b, 0xcb, 0x7f, 0xb2, 0x19, 0x3a, 0xa0, 0xc8, 0x89, 0x4c, 0x1f, 0x57, 0x15, 0x3a, 0x1d, 0x9d, 0xca, 0x39, 0x19, 0xe7, 0x2a, 0xf6, 0x03, 0x33, 0x41, 0x5d, 0x94, 0xf5, 0xc2, 0x40, 0xdf, 0xf0, 0x20, 0xd1, 0x68, 0x25, 0xfa, 0x4d, 0x50, 0xdc, 0x00, 0x30, 0x93, 0xa1, 0xc6, 0xc9, 0x17, 0xd5, 0x8a, 0xb7, 0xb5, 0x34, 0xb7, 0xaf, 0xad, 0x92, 0x7f, 0xb6, 0x30, 0x37, 0x7d, 0xc8, 0x22, 0x26, 0x56, 0x63, 0xe0, 0xbe, 0x23, 0x23, 0x81, 0xeb, 0xe7, 0xe4, 0x1a, 0x06, 0x1a, 0x12, 0x7e, 0x6a, 0xb6, 0xab, 0x27, 0xd6, 0xff, 0x81, 0xa7, 0x91, 0x68, 0x3d, 0x7d, 0x82, 0xce, 0xf5, 0xc0, 0x58, 0x2c, 0x3d, 0xd0, 0xc8, 0x9e, 0x19, 0x91, 0x13, 0x8a, 0xf7, 0x0e, 0xab, 0xc3, 0x0f, 0x92, 0xe8, 0x56, 0xed, 0x64, 0xbf, 0x84, 0x99, 0xd7, 0xdb, 0xbc, 0xc8, 0x99, 0xad, 0x6e, 0xcc, 0xd5, 0xc3, 0xe4, 0x44, 0xb5, 0x03, 0x1f }; +constexpr AccessUnit AC3_LARGE_AU_EXPECTED_AU = { 0x15f90, 0x159b2, false, 0, {}, { 0x15, 0x52, 0x08, 0x0e, 0x4a, 0x8b, 0xd1, 0xa1, 0xfe, 0x30, 0xc1, 0x4b, 0xc9, 0x96, 0x59, 0xc4, 0x6c, 0x6b, 0x42, 0xed } }; + +const std::vector LPCM_LARGE_AU_STREAM = { 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xbd, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x40, 0x00, 0x00, 0x00, 0xfb, 0xba, 0x2b, 0xca, 0x88, 0x65, 0x2b, 0x01, 0xf4, 0xe6, 0xfc, 0x43, 0xc2, 0xad, 0x45, 0xe3, 0xf1, 0x0b, 0x86, 0x17, 0x75, 0x98, 0x11, 0x62, 0xb4, 0xd9, 0xb5, 0x6c, 0x1e, 0xac, 0xf0, 0xaa, 0xf6, 0xc4, 0x4a, 0xcc, 0x5d, 0xb3, 0x3d, 0xd3, 0x40, 0x11, 0xbc, 0x73, 0x09, 0x49, 0x80, 0xe4, 0xef, 0x95, 0xb2, 0xc8, 0xb4, 0x48, 0x20, 0xe2, 0x49, 0x07, 0x94, 0x7c, 0xe7, 0xab, 0x73, 0x0b, 0xa9, 0x97, 0xbd, 0x8b, 0xf3, 0x90, 0x3c, 0x12, 0x29, 0xec, 0xe8, 0x5a, 0x8a, 0xbb, 0x35, 0x60, 0xf5, 0x6c, 0xaa, 0x93, 0xf1, 0x3c, 0x86, 0x8b, 0x63, 0x11, 0xa8, 0x22, 0x32, 0x90, 0x4a, 0x57, 0xa0, 0x91, 0xbf, 0x95, 0x45, 0xef, 0x98, 0xa1, 0x11, 0xf7, 0x59, 0x05, 0xc2, 0x0f, 0x13, 0x86, 0x27, 0xd4, 0x28, 0x21, 0x27, 0x74, 0x31, 0xdb, 0xe6, 0xf9, 0xa5, 0xbd, 0xe1, 0x19, 0x79, 0x9f, 0xc6, 0xd4, 0x49, 0x14, 0x06, 0x59, 0x03, 0x0f, 0x07, 0x16, 0x93, 0x95, 0x2e, 0xae, 0x82, 0x99, 0xbb, 0x86, 0x36, 0xda, 0x6e, 0xf2, 0x3e, 0x77, 0xa9, 0x74, 0x79, 0x92, 0x0c, 0x28, 0x24, 0x4a, 0x1f, 0x0e, 0x16, 0xf8, 0xdf, 0xa9, 0x4f, 0x67, 0xb8, 0xe1, 0xfa, 0x83, 0x42, 0x3a, 0x38, 0x2e, 0x12, 0xb3, 0x10, 0x54, 0x59, 0x0c, 0xdb, 0xa1, 0xe8, 0x64, 0x0d, 0x87, 0x6b, 0xac, 0xd1, 0x2c, 0x90, 0x15, 0xd6, 0xed, 0x5e, 0x78, 0x94, 0x05, 0x2d, 0x15, 0xb0, 0xf0, 0xbd, 0xd6, 0x02, 0xa1, 0xf7, 0xf2, 0x2a, 0xf1, 0x1a, 0xe7, 0xf0, 0x3c, 0x36, 0xd9, 0x24, 0xb6, 0x98, 0x4e, 0xda, 0x73, 0x39, 0x33, 0xda, 0x5c, 0xb1, 0x4e, 0x4c, 0xca, 0x01, 0xa2, 0x96, 0x13, 0x9f, 0x8a, 0x87, 0xdb, 0x3f, 0x09, 0x14, 0x6b, 0x2c, 0x99, 0x55, 0x37, 0xe4, 0xe5, 0x08, 0x61, 0xf5, 0x4e, 0xb2, 0x0a, 0x3e, 0xbd, 0xb8, 0x52, 0xdf, 0xea, 0x8b, 0xee, 0x49, 0x98, 0x7d, 0x94, 0x95, 0x2c, 0x1c, 0x29, 0x67, 0xb5, 0xa2, 0x38, 0x06, 0x91, 0x25, 0x22, 0xd3, 0x3c, 0xd6, 0xd0, 0x7d, 0x2f, 0xd1, 0x03, 0x2a, 0xec, 0xea, 0xa9, 0xfa, 0xab, 0x70, 0x49, 0xf4, 0xde, 0x5d, 0xfd, 0xda, 0x7f, 0xf7, 0xf1, 0xfc, 0x56, 0x52, 0x1e, 0x85, 0x1c, 0x9f, 0xaa, 0xbd, 0x6f, 0x3d, 0xda, 0x46, 0xe2, 0x58, 0x80, 0xe1, 0x3d, 0xae, 0xed, 0x51, 0xf8, 0x1c, 0x65, 0x71, 0x9b, 0xf0, 0x04, 0x31, 0xdd, 0xb8, 0x4b, 0x15, 0x29, 0xf5, 0xaa, 0x82, 0x11, 0x26, 0x1c, 0xaf, 0xb7, 0x47, 0xa0, 0x72, 0x26, 0x48, 0x73, 0x7e, 0xa2, 0xaa, 0x0b, 0x9f, 0x86, 0x44, 0xa5, 0xfd, 0xfa, 0xb5, 0x58, 0x21, 0x1b, 0x46, 0x4b, 0x46, 0xd7, 0x6b, 0xc8, 0xcd, 0xc3, 0x08, 0x60, 0x6d, 0xc8, 0x65, 0xd7, 0xa5, 0x67, 0x63, 0xf9, 0x07, 0x8b, 0x68, 0x16, 0xce, 0x35, 0x37, 0xe3, 0x71, 0xb7, 0xb1, 0x5f, 0x73, 0x3b, 0xba, 0xe3, 0xd6, 0x38, 0x2b, 0x35, 0x77, 0x06, 0x11, 0x2e, 0x63, 0xf2, 0xdc, 0x26, 0x34, 0x8d, 0x86, 0x81, 0x05, 0x70, 0xd3, 0x0a, 0x65, 0xec, 0x7a, 0xf4, 0x6a, 0xcc, 0x36, 0x93, 0x19, 0xe4, 0x40, 0xd7, 0x2c, 0x33, 0x8e, 0xab, 0xc0, 0x19, 0x2c, 0xd5, 0x60, 0x7f, 0x5e, 0x99, 0x82, 0x09, 0x23, 0x08, 0xe0, 0x2c, 0x50, 0x5d, 0x88, 0xd7, 0x7f, 0x13, 0xdc, 0xb3, 0x0f, 0xfb, 0x99, 0x4b, 0x75, 0xfb, 0x40, 0xa0, 0x8b, 0x13, 0xbc, 0x74, 0x03, 0xe4, 0x36, 0x18, 0x28, 0x50, 0x26, 0xfa, 0x94, 0x3d, 0xa6, 0x41, 0x6c, 0xff, 0xd1, 0x14, 0x35, 0x81, 0xe8, 0x9c, 0x6d, 0x15, 0xea, 0xc2, 0xef, 0x61, 0x80, 0x56, 0x97, 0xd9, 0xec, 0x66, 0x3d, 0xf8, 0x6f, 0x74, 0xb0, 0x18, 0x50, 0x9d, 0x12, 0x4a, 0x96, 0xdc, 0x86, 0xf7, 0x2c, 0xa1, 0x8a, 0x43, 0x03, 0x3b, 0xe8, 0x4e, 0xd9, 0x43, 0x2e, 0x46, 0xa5, 0xa9, 0xce, 0x92, 0x38, 0x12, 0xab, 0xe1, 0x47, 0x18, 0x8e, 0x26, 0x44, 0x17, 0x7a, 0xe9, 0xd0, 0x58, 0xd7, 0x6a, 0xc4, 0xc5, 0x00, 0x04, 0x24, 0x47, 0xb5, 0xaa, 0x61, 0x2b, 0x9d, 0x41, 0xbd, 0x97, 0x63, 0x03, 0x3c, 0x55, 0x85, 0x15, 0x2d, 0x3f, 0xb8, 0x68, 0x3f, 0xb9, 0x80, 0x57, 0x59, 0xcf, 0x50, 0xb1, 0x53, 0xda, 0x5e, 0xfb, 0xff, 0xde, 0x85, 0x1e, 0xaf, 0x1c, 0x95, 0x87, 0xe1, 0xbd, 0xe2, 0x10, 0x42, 0xb4, 0x44, 0x42, 0xf3, 0x5a, 0xbf, 0x16, 0xd9, 0xbf, 0x45, 0x36, 0x8e, 0x00, 0xd7, 0xaf, 0x72, 0xb3, 0x85, 0xf7, 0x98, 0xbf, 0x3d, 0xb0, 0x20, 0xc3, 0x92, 0xb6, 0x2e, 0xda, 0x71, 0x0c, 0x6e, 0xdd, 0x05, 0x74, 0x30, 0xbe, 0xd7, 0x35, 0x66, 0x07, 0xcc, 0x43, 0x75, 0xc8, 0xbe, 0xce, 0x66, 0x1e, 0x36, 0xcd, 0x1f, 0xe8, 0x63, 0x7e, 0x0b, 0x9c, 0x86, 0x85, 0xdc, 0xfd, 0xd4, 0x71, 0xb1, 0x0f, 0xe8, 0x69, 0xd8, 0x91, 0xa9, 0xc4, 0x26, 0xde, 0x57, 0xd7, 0xcd, 0x35, 0xd8, 0x40, 0xb8, 0x79, 0xfa, 0x33, 0xb0, 0x4c, 0xb2, 0xe2, 0x76, 0x21, 0x75, 0x72, 0x08, 0xf4, 0x45, 0x3d, 0x0b, 0xaa, 0x98, 0x0c, 0x5a, 0x72, 0x15, 0x17, 0x49, 0xf0, 0xcc, 0x33, 0x0d, 0x55, 0x04, 0x58, 0x17, 0x1a, 0x5c, 0x52, 0xb6, 0x5d, 0x22, 0xaa, 0x73, 0x24, 0xe5, 0x3b, 0x3e, 0xa4, 0x6a, 0xcc, 0xc9, 0x23, 0x6d, 0xc6, 0x9b, 0xc6, 0x5c, 0xe8, 0x6e, 0x7c, 0x0a, 0xa1, 0xa0, 0xb8, 0x05, 0x17, 0xb1, 0x18, 0xb8, 0x27, 0x38, 0x7e, 0xff, 0x89, 0x73, 0x6e, 0x79, 0x7d, 0xf9, 0x1e, 0x35, 0xb3, 0x2f, 0x9b, 0x85, 0xda, 0xd0, 0xbc, 0xb2, 0xd2, 0x2c, 0x56, 0x99, 0x12, 0xba, 0x62, 0xbc, 0x62, 0xc9, 0xaf, 0x3c, 0x62, 0x53, 0xf3, 0xb6, 0x64, 0xa1, 0xd8, 0x43, 0xda, 0x97, 0xe7, 0x68, 0xb0, 0x2f, 0xba, 0x8a, 0x0f, 0x09, 0x13, 0xbf, 0x6a, 0xe2, 0x92, 0x04, 0xf5, 0xb3, 0xd3, 0x3b, 0xfa, 0x28, 0xb8, 0x76, 0x55, 0x7a, 0xe8, 0x0a, 0xa5, 0x41, 0x62, 0xfe, 0xf3, 0xd9, 0x50, 0x68, 0xc7, 0xb2, 0x6d, 0xde, 0xc7, 0x77, 0x1e, 0x7e, 0x50, 0x79, 0xc0, 0xf2, 0xd2, 0x83, 0x8b, 0x0d, 0x9e, 0xce, 0xaf, 0x9b, 0x33, 0x20, 0xd9, 0x8b, 0xf5, 0xf1, 0x3c, 0x92, 0xb7, 0x5d, 0x93, 0x38, 0xda, 0xd4, 0x84, 0xe6, 0xbe, 0xcd, 0x65, 0x14, 0x94, 0x60, 0xae, 0x26, 0x6b, 0x1d, 0x15, 0x99, 0xf3, 0x56, 0xac, 0x20, 0x5e, 0x0a, 0x2e, 0x90, 0x5e, 0x69, 0x6a, 0xb2, 0xf0, 0xe2, 0xf2, 0x96, 0xfe, 0x61, 0xcd, 0xe8, 0x44, 0x52, 0x0a, 0x5d, 0x2a, 0x3d, 0x4e, 0x45, 0xc5, 0xef, 0x95, 0x55, 0x59, 0xe1, 0x7f, 0x9e, 0x43, 0x05, 0x7c, 0x09, 0xd5, 0xd8, 0x32, 0x9a, 0x41, 0x40, 0xa5, 0x22, 0x3a, 0xf9, 0x28, 0x85, 0x5c, 0x94, 0x89, 0x63, 0xbf, 0x81, 0x06, 0xa9, 0x6f, 0x63, 0x66, 0x2d, 0x9d, 0x66, 0x87, 0xfb, 0x6f, 0xdc, 0x0d, 0x75, 0x76, 0x61, 0x16, 0xd1, 0xda, 0xfa, 0x65, 0xe1, 0x3d, 0x32, 0xea, 0x01, 0x11, 0x71, 0x38, 0x20, 0x5a, 0x27, 0x3b, 0x6c, 0x9d, 0xb2, 0xda, 0xb0, 0x7b, 0xef, 0x26, 0x6a, 0x96, 0x86, 0x62, 0x80, 0x6f, 0x59, 0xcb, 0xc2, 0x79, 0x49, 0x24, 0x95, 0x8f, 0xd0, 0x4a, 0x65, 0x94, 0x0f, 0xbf, 0x9f, 0x9b, 0xc7, 0x1f, 0x7b, 0x46, 0x56, 0x29, 0x21, 0xa9, 0xdf, 0x01, 0xba, 0x89, 0x3d, 0x24, 0xef, 0x6f, 0x4b, 0x24, 0x6f, 0x4c, 0x74, 0xe7, 0x40, 0x0c, 0xde, 0x60, 0xbf, 0xe2, 0x86, 0x78, 0x26, 0xe6, 0xd6, 0xd3, 0x27, 0x10, 0x57, 0xd9, 0xb8, 0x09, 0x85, 0x3f, 0x28, 0xdf, 0x36, 0xba, 0x4d, 0x4f, 0xc3, 0xa3, 0x65, 0x81, 0x6d, 0xdf, 0x94, 0xc9, 0x90, 0xce, 0x65, 0xc2, 0x7e, 0x42, 0xc9, 0x4c, 0x11, 0x53, 0x45, 0xa7, 0x95, 0x97, 0x7a, 0x2d, 0xc5, 0x79, 0xee, 0x61, 0x0e, 0x5c, 0xe9, 0x9c, 0xfc, 0xb4, 0xba, 0x19, 0x7f, 0x64, 0x60, 0xac, 0x94, 0x6e, 0xc7, 0xc1, 0x5c, 0x3f, 0x9e, 0xac, 0xfb, 0x78, 0x52, 0xc8, 0x8a, 0x91, 0x02, 0x5c, 0x3c, 0xf7, 0x45, 0xe0, 0x14, 0x94, 0x2f, 0x8a, 0x02, 0x43, 0x83, 0x03, 0x67, 0x82, 0x5b, 0xc6, 0xc7, 0xe0, 0x0a, 0xe2, 0x06, 0x90, 0x1f, 0x80, 0xdc, 0x12, 0x52, 0xc7, 0x1d, 0x6a, 0x2a, 0xcd, 0x71, 0x85, 0xb1, 0x51, 0x9a, 0xa1, 0x2e, 0xc6, 0x07, 0x88, 0xa3, 0x3a, 0xd5, 0xdd, 0x8f, 0x55, 0xbd, 0xe4, 0x63, 0xd1, 0x95, 0x98, 0x4b, 0xe6, 0xea, 0x8f, 0x70, 0x0e, 0x67, 0x91, 0x74, 0xd6, 0x79, 0x9c, 0x17, 0xfd, 0xef, 0xf2, 0x8b, 0xa6, 0xf6, 0x26, 0xdf, 0x0e, 0x5c, 0xc2, 0x5d, 0x1d, 0x9c, 0x4d, 0xe5, 0xb2, 0xf7, 0xb4, 0xb5, 0x63, 0x15, 0x4b, 0x16, 0x3f, 0x21, 0x77, 0xe1, 0x8b, 0x1a, 0x92, 0x0d, 0x02, 0x39, 0x9b, 0xdf, 0x74, 0x79, 0x73, 0x08, 0x78, 0x69, 0x6d, 0xcb, 0x8d, 0xc2, 0x57, 0x85, 0xed, 0x2a, 0x54, 0xeb, 0x75, 0x14, 0xfe, 0x16, 0xc8, 0x4a, 0x72, 0xa2, 0x58, 0x01, 0xd9, 0x2c, 0xbb, 0x9e, 0x42, 0x8f, 0xf6, 0x1d, 0x6c, 0x50, 0x7c, 0x78, 0x69, 0x15, 0x57, 0x05, 0x6a, 0x55, 0x04, 0x66, 0x31, 0xf2, 0x2e, 0x96, 0x28, 0x59, 0x86, 0xbd, 0xcf, 0x83, 0x69, 0xc8, 0x76, 0xe7, 0xf3, 0x61, 0xac, 0x1a, 0x02, 0x7a, 0xf3, 0x2e, 0x8a, 0x65, 0x99, 0x6a, 0x06, 0xc0, 0xca, 0x3d, 0x28, 0x83, 0x66, 0xde, 0x2b, 0xf4, 0xfa, 0x78, 0xa0, 0x3b, 0xa8, 0x6c, 0x75, 0x22, 0x51, 0xd4, 0x0e, 0xcb, 0x3e, 0x88, 0x65, 0x02, 0x9e, 0xde, 0xb1, 0x2a, 0x46, 0x00, 0xc0, 0x50, 0x57, 0x67, 0xdf, 0x8d, 0xa5, 0x78, 0x68, 0xbb, 0x6f, 0x8d, 0x41, 0xb6, 0x37, 0x6d, 0x4e, 0x1a, 0x78, 0x71, 0x3b, 0x72, 0xe9, 0x04, 0x84, 0x8b, 0x84, 0xc9, 0x79, 0xce, 0x83, 0xaa, 0x2b, 0xeb, 0x2c, 0x61, 0xa2, 0x8a, 0xc8, 0x91, 0xe4, 0x77, 0x9b, 0x89, 0x4a, 0x46, 0x34, 0x39, 0x74, 0xdb, 0xe4, 0x29, 0x8f, 0x94, 0xf1, 0x2f, 0xf6, 0x58, 0x0d, 0x3f, 0x4f, 0x4e, 0x99, 0x59, 0xda, 0x14, 0x4c, 0x8f, 0xd6, 0x80, 0x7b, 0x6f, 0xb4, 0x71, 0x52, 0xaf, 0x2a, 0x9e, 0xe5, 0x61, 0x75, 0xec, 0x45, 0x21, 0x45, 0x27, 0x72, 0x0b, 0xa3, 0xe2, 0xf0, 0x02, 0xd7, 0xd6, 0xf3, 0xc9, 0xe1, 0x6b, 0xb1, 0xbd, 0x33, 0xda, 0x38, 0xa9, 0x69, 0x4e, 0x27, 0x9d, 0x1c, 0xf4, 0x77, 0x47, 0xc5, 0xa2, 0x31, 0x3d, 0x46, 0xbe, 0x21, 0xd3, 0xdb, 0x41, 0xbe, 0x09, 0x94, 0x2a, 0x6e, 0xfe, 0x7a, 0x21, 0xaa, 0x00, 0x0b, 0x5a, 0xa6, 0x3c, 0xd6, 0x5a, 0xb0, 0xe4, 0x3e, 0x74, 0x5d, 0x82, 0x15, 0x0a, 0x83, 0x58, 0x08, 0x03, 0xb4, 0x32, 0x44, 0x4c, 0xb3, 0x2b, 0xd8, 0x28, 0x3a, 0x6c, 0xca, 0x4d, 0xa9, 0xec, 0x8b, 0x87, 0x0b, 0x1b, 0xd4, 0x17, 0x24, 0x4e, 0xf5, 0x05, 0xd8, 0x37, 0xa7, 0x60, 0xee, 0x8a, 0x17, 0xa8, 0x7b, 0x1e, 0xd2, 0x79, 0xe1, 0x91, 0x39, 0xab, 0x96, 0x5c, 0x63, 0xcc, 0x1c, 0xc9, 0x54, 0xdd, 0xdb, 0xbd, 0x36, 0xec, 0x95, 0x87, 0x4b, 0xb8, 0x43, 0xfe, 0x0f, 0x16, 0xcd, 0x36, 0x55, 0x7c, 0x64, 0xd8, 0x69, 0x88, 0x31, 0x79, 0xc0, 0x53, 0xe5, 0x93, 0x5c, 0x94, 0x66, 0x87, 0xb2, 0x63, 0x39, 0x66, 0x7e, 0x79, 0x3a, 0x0e, 0xbe, 0x66, 0xdb, 0xac, 0x0a, 0xbe, 0xdb, 0x28, 0x69, 0xd9, 0x8e, 0x5c, 0x39, 0xea, 0x6f, 0xec, 0x83, 0x72, 0xee, 0xd7, 0x66, 0x82, 0xce, 0xa4, 0x4e, 0x25, 0x26, 0xbc, 0x8c, 0x4c, 0x19, 0x69, 0x0c, 0x35, 0x39, 0x42, 0x6d, 0xde, 0x7b, 0x23, 0x63, 0x82, 0x4f, 0xfd, 0x1a, 0x02, 0xbf, 0x38, 0x76, 0xc0, 0xb1, 0x4b, 0x85, 0x3f, 0xde, 0x99, 0x7b, 0x8d, 0x13, 0x76, 0x45, 0x77, 0x69, 0x2b, 0x6a, 0xf5, 0x3b, 0x5c, 0x55, 0xbb, 0x25, 0x9d, 0x02, 0xb1, 0xd8, 0xa7, 0xae, 0x89, 0xc6, 0x4d, 0x56, 0x82, 0xb4, 0x86, 0x01, 0x25, 0xc4, 0x25, 0x1e, 0xd4, 0xed, 0x99, 0xc4, 0x46, 0xba, 0xea, 0xb9, 0x6c, 0xa2, 0x49, 0xe4, 0x59, 0xf6, 0xfd, 0x4c, 0x24, 0xcb, 0xc5, 0x38, 0xc9, 0x11, 0xa1, 0x81, 0x1d, 0xae, 0xab, 0x28, 0x5d, 0x61, 0xda, 0xb9, 0x16, 0x5a, 0x9b, 0x9f, 0xda, 0x94, 0xa0, 0xb3, 0x5e, 0x65, 0x6a, 0xd6, 0x64, 0x68, 0x98, 0xb4, 0x4c, 0x82, 0xf0, 0x98, 0xeb, 0xf0, 0x05, 0xb8, 0xbf, 0x3f, 0x61, 0xb2, 0xe3, 0x99, 0x4a, 0x36, 0x52, 0x4b, 0x08, 0x7c, 0x47, 0x55, 0x1e, 0xfa, 0x9d, 0x5f, 0xbe, 0x77, 0xf9, 0x51, 0x81, 0x02, 0x0a, 0x9c, 0x4c, 0xd1, 0xdf, 0x3a, 0xcc, 0x13, 0x6c, 0x1b, 0xd1, 0xbb, 0xd9, 0x30, 0x09, 0x66, 0xb0, 0x2b, 0xdc, 0xe4, 0xcd, 0x0e, 0xb8, 0xf5, 0xf9, 0x2c, 0x0c, 0x7d, 0x26, 0xc0, 0xe4, 0xc1, 0x6f, 0x4f, 0x32, 0xe6, 0x60, 0xbf, 0x5e, 0xae, 0x0b, 0xb3, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x02, 0xe4, 0x61, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbd, 0x07, 0xec, 0x81, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0xfc, 0x48, 0xcd, 0xae, 0x7c, 0x9e, 0x15, 0x6f, 0x47, 0x49, 0x2b, 0x4d, 0x91, 0xaf, 0x65, 0x47, 0x4d, 0x69, 0x82, 0xc6, 0x41, 0xa3, 0xe8, 0x85, 0xb0, 0x66, 0x08, 0x86, 0xb8, 0x99, 0x25, 0x99, 0xa5, 0xb1, 0xdf, 0x6b, 0x6d, 0x6f, 0xd0, 0x08, 0xfe, 0x3d, 0xee, 0x78, 0xfc, 0xa8, 0xb5, 0x9a, 0x9b, 0xb8, 0x8e, 0x8e, 0x20, 0x89, 0x9a, 0x5c, 0x4e, 0x4f, 0x9e, 0x4f, 0x22, 0xc9, 0x77, 0xe9, 0xa7, 0x9c, 0x68, 0xaf, 0xe2, 0xcc, 0xf6, 0xa0, 0x3b, 0x71, 0x83, 0xdd, 0x64, 0xc4, 0xf2, 0x9a, 0x17, 0x98, 0x44, 0xc6, 0xa8, 0x9a, 0xe0, 0xcd, 0x0c, 0x64, 0xd8, 0x34, 0x90, 0x43, 0x16, 0x5a, 0x65, 0x25, 0x4d, 0x14, 0x1b, 0x53, 0x03, 0x24, 0x89, 0xf8, 0x00, 0x3b, 0xfe, 0xe8, 0x91, 0xf9, 0x4e, 0x4d, 0x8a, 0xb6, 0x4d, 0xb8, 0x81, 0xa9, 0x13, 0x53, 0x9f, 0x6a, 0xd3, 0xeb, 0xa2, 0x5c, 0x17, 0xcc, 0x7a, 0x53, 0xd5, 0xad, 0x44, 0x3a, 0xa5, 0xd7, 0x2e, 0x45, 0xe5, 0xff, 0x55, 0x79, 0xc8, 0x99, 0x2e, 0x4c, 0x6f, 0x70, 0xc8, 0xf1, 0x8b, 0x02, 0xe5, 0x19, 0x38, 0xcc, 0xb7, 0xe4, 0x12, 0xac, 0x53, 0x07, 0x93, 0xd0, 0x69, 0xd2, 0xb1, 0x5c, 0x79, 0x8f, 0xbc, 0xcb, 0x19, 0x2f, 0xe0, 0x11, 0xea, 0xb2, 0x6f, 0x0a, 0x0e, 0x53, 0x2d, 0xc1, 0x05, 0x09, 0x67, 0xd7, 0x58, 0xed, 0x1c, 0xf2, 0xc4, 0x20, 0x6d, 0x12, 0x75, 0x71, 0xc6, 0xeb, 0xe7, 0x51, 0x81, 0x08, 0x4a, 0x95, 0x24, 0x55, 0xd8, 0x7a, 0x26, 0x79, 0xe6, 0x76, 0x26, 0x63, 0x1c, 0x10, 0xeb, 0xab, 0xba, 0x2a, 0x92, 0x35, 0xc8, 0x0f, 0x2c, 0x2b, 0x6f, 0x76, 0x45, 0xf1, 0x30, 0x07, 0x11, 0xc1, 0x8c, 0xb2, 0xe4, 0x44, 0x81, 0x20, 0xaa, 0xab, 0xc4, 0xa6, 0x31, 0xe7, 0x6f, 0xd8, 0x1f, 0x92, 0x2b, 0x57, 0xe3, 0xbe, 0x66, 0xe0, 0xe1, 0xa2, 0x76, 0x13, 0xb0, 0x6d, 0xfa, 0x36, 0x9f, 0x6d, 0x35, 0x14, 0xd3, 0xf0, 0xc3, 0x94, 0x9e, 0x88, 0x52, 0x1d, 0x41, 0xff, 0xe1, 0xc3, 0xa7, 0xd7, 0xa8, 0x6e, 0x3c, 0xf5, 0xba, 0xc8, 0xca, 0x4c, 0x06, 0x0c, 0x26, 0xbc, 0x0e, 0xda, 0xc0, 0x3c, 0x49, 0x65, 0x09, 0x64, 0x0a, 0x1e, 0xaf, 0x35, 0x32, 0x03, 0x04, 0x7d, 0x85, 0xc3, 0xd5, 0x87, 0x22, 0x3a, 0x1f, 0xe0, 0xd2, 0x18, 0xfc, 0x5f, 0xc5, 0xa9, 0x1c, 0x6f, 0x6f, 0x54, 0x6c, 0x6b, 0xd5, 0x3f, 0xa7, 0x7a, 0x09, 0x22, 0xad, 0x88, 0x4a, 0xf1, 0x16, 0xae, 0x17, 0x38, 0x6d, 0x9a, 0x89, 0x4f, 0x6b, 0xb7, 0x23, 0x80, 0x4e, 0x1a, 0x53, 0x80, 0x25, 0xd9, 0xc8, 0x1b, 0xb5, 0xf3, 0x8a, 0xb7, 0x5f, 0x1e, 0x5f, 0xa7, 0x86, 0xf7, 0x1f, 0x43, 0x17, 0xfd, 0xb5, 0x49, 0x27, 0x91, 0x6f, 0xa9, 0x03, 0x2d, 0x94, 0x35, 0x9d, 0x64, 0x53, 0x2a, 0x44, 0xce, 0x4d, 0x47, 0x8e, 0x7a, 0xf9, 0x8e, 0x22, 0x19, 0xb4, 0xe8, 0x59, 0x54, 0x1b, 0xa5, 0x75, 0xda, 0xdc, 0xc0, 0x16, 0xf4, 0x45, 0x75, 0x83, 0xe7, 0x31, 0xc0, 0x3f, 0x1b, 0x50, 0x0f, 0xae, 0x33, 0x46, 0x29, 0xf2, 0x1d, 0xb2, 0xcf, 0xe8, 0xb0, 0x2d, 0x7e, 0x73, 0x3d, 0xfd, 0x7d, 0xdc, 0x85, 0x7a, 0x8f, 0x8d, 0xbc, 0x14, 0x60, 0xaf, 0xcf, 0x44, 0x48, 0x6f, 0xd3, 0x05, 0x5d, 0x37, 0x77, 0x81, 0xd5, 0x63, 0xb5, 0x31, 0x72, 0xc0, 0xd4, 0x3e, 0x79, 0x56, 0x9c, 0x2d, 0xb4, 0xe9, 0xed, 0xa6, 0x00, 0x87, 0x47, 0x26, 0xf9, 0x1c, 0x0b, 0xe1, 0xce, 0x0b, 0xaa, 0x20, 0x71, 0x6c, 0x80, 0x88, 0x65, 0x17, 0x9b, 0x06, 0x66, 0x25, 0xcc, 0x57, 0x55, 0x3d, 0x7c, 0x4a, 0x8a, 0xde, 0x6d, 0xe1, 0x53, 0x46, 0x8d, 0xd7, 0xaa, 0xb5, 0x7d, 0xd8, 0x4a, 0x85, 0xe0, 0x2a, 0x1d, 0x1c, 0xab, 0x72, 0x10, 0xd8, 0x83, 0x77, 0x36, 0xe9, 0xab, 0x7a, 0xe8, 0xc3, 0xd3, 0xf7, 0x9f, 0xb1, 0xc6, 0x36, 0x3b, 0x8c, 0x78, 0x80, 0x04, 0x4f, 0x29, 0x33, 0x77, 0x17, 0xa3, 0x68, 0xf4, 0x00, 0x37, 0xf1, 0x11, 0x20, 0x14, 0x61, 0x90, 0x70, 0xe7, 0xaf, 0xd4, 0x1b, 0xc4, 0x3d, 0x84, 0x47, 0x35, 0xfa, 0x11, 0xc1, 0x8a, 0xe6, 0x8c, 0x9b, 0x8b, 0x07, 0xbd, 0xd4, 0x8b, 0x99, 0x94, 0xeb, 0x85, 0x28, 0x90, 0x36, 0x8d, 0x4a, 0x86, 0xad, 0xbd, 0xf1, 0x33, 0x95, 0xd4, 0x99, 0xfa, 0xa2, 0x3f, 0x03, 0x56, 0xb5, 0x72, 0x30, 0xcb, 0x4d, 0x39, 0x91, 0x64, 0x47, 0xa9, 0xa8, 0xa3, 0x0a, 0x3f, 0x91, 0xac, 0xd7, 0xca, 0xaf, 0x7b, 0x46, 0x9d, 0x9d, 0xc3, 0xa3, 0x28, 0x23, 0x9f, 0x01, 0xae, 0xf8, 0x07, 0xec, 0x79, 0xa0, 0x4f, 0x97, 0x25, 0x85, 0xa3, 0x39, 0xae, 0x0e, 0x37, 0xc1, 0x32, 0x98, 0xae, 0xb5, 0xa2, 0x5a, 0x11, 0xa6, 0xd3, 0x38, 0x90, 0xda, 0x92, 0xc2, 0x2b, 0x7c, 0xd0, 0xd2, 0xf3, 0xe4, 0x23, 0x11, 0x9b, 0x7b, 0x0f, 0x61, 0xfa, 0xe3, 0x4b, 0x4c, 0xbb, 0x0a, 0x4c, 0x93, 0x60, 0x15, 0x51, 0x0d, 0x76, 0x41, 0x37, 0x39, 0x02, 0x21, 0x80, 0x3b, 0x04, 0xc5, 0x1b, 0xf0, 0x97, 0x2e, 0x17, 0x5f, 0xf4, 0xa0, 0x19, 0x55, 0xf3, 0x2f, 0xe8, 0x53, 0x07, 0xae, 0xdf, 0x98, 0xe4, 0xc3, 0xd0, 0xe9, 0x32, 0x0e, 0x34, 0x00, 0x3b, 0x7d, 0xe8, 0x1b, 0xb6, 0x9d, 0x60, 0x67, 0xff, 0x57, 0xa4, 0x04, 0x32, 0x14, 0x95, 0xe5, 0xa5, 0x06, 0xb0, 0xd4, 0x94, 0xb2, 0xc1, 0xe4, 0x5b, 0x14, 0x44, 0x7d, 0xee, 0x01, 0x81, 0xe2, 0x2d, 0xfb, 0x01, 0x39, 0x41, 0xdf, 0x6b, 0xd8, 0x16, 0x80, 0x4c, 0x9c, 0xdf, 0x5c, 0x8a, 0x75, 0xf6, 0x99, 0xcb, 0xcc, 0xf3, 0x39, 0x78, 0x31, 0xfe, 0x8c, 0xe8, 0x74, 0x02, 0xa3, 0x44, 0x36, 0xf8, 0x20, 0xcf, 0x3a, 0x97, 0xcd, 0x18, 0xec, 0xda, 0xac, 0x4c, 0xbe, 0xe6, 0x03, 0xf3, 0xe2, 0x4b, 0x62, 0x93, 0x0e, 0xc5, 0xb9, 0x17, 0x33, 0xc9, 0xa1, 0xef, 0x2c, 0x7e, 0x02, 0x41, 0xec, 0xe8, 0x8e, 0x86, 0x71, 0xd3, 0xe7, 0xad, 0x42, 0x5e, 0x37, 0xb0, 0x05, 0xba, 0x8c, 0xdd, 0xb1, 0x35, 0x66, 0xe8, 0xf5, 0x41, 0x22, 0xd0, 0x1b, 0xd5, 0x38, 0x85, 0x5d, 0xc0, 0xa1, 0x79, 0x1e, 0x29, 0x9c, 0x1c, 0xc3, 0x2d, 0x4b, 0x42, 0xe7, 0xe6, 0xcc, 0x0b, 0x19, 0xc1, 0xa4, 0x4b, 0xb2, 0x74, 0x4c, 0xf7, 0x07, 0x52, 0x34, 0x9d, 0xf4, 0x69, 0xd7, 0xd1, 0x80, 0xe5, 0xfb, 0x41, 0xf9, 0x08, 0xef, 0x03, 0x26, 0xd8, 0xf4, 0xd5, 0xf0, 0x25, 0xcf, 0x90, 0xb4, 0x39, 0x39, 0x55, 0x6b, 0x2c, 0x1b, 0x16, 0xde, 0x81, 0xce, 0x4f, 0x39, 0x65, 0xad, 0xee, 0x69, 0x7c, 0xd0, 0xf9, 0x10, 0xcd, 0x94, 0xf5, 0x5c, 0xa9, 0x6c, 0xb4, 0x60, 0x1f, 0xbf, 0x64, 0x18, 0x43, 0x7e, 0xf2, 0x22, 0xcc, 0x9d, 0xde, 0x21, 0xbb, 0xcb, 0x2c, 0xdf, 0xb4, 0xda, 0xb6, 0xb8, 0xe1, 0x79, 0x02, 0xb2, 0x06, 0xcb, 0xec, 0xf0, 0x6d, 0x38, 0xf5, 0x99, 0xe6, 0x72, 0xce, 0x68, 0x79, 0x15, 0x90, 0x35, 0x6b, 0xdd, 0x51, 0x31, 0x21, 0xcd, 0x3b, 0x2d, 0x54, 0x0d, 0x49, 0x80, 0xa1, 0x22, 0x70, 0x50, 0x4c, 0x97, 0xd2, 0xef, 0x68, 0xaa, 0x65, 0xa9, 0x0f, 0x1c, 0x46, 0xcf, 0x55, 0x15, 0xbc, 0x60, 0x93, 0xd9, 0xbc, 0xd7, 0x53, 0xef, 0xdb, 0xbf, 0x9d, 0xc1, 0xc9, 0xac, 0xa3, 0x88, 0x23, 0x59, 0xff, 0x78, 0xb0, 0x6b, 0x6d, 0x7e, 0x31, 0xf3, 0xc2, 0xf0, 0x02, 0xc6, 0xa6, 0x5a, 0x1b, 0x97, 0xc3, 0x77, 0xa6, 0xb9, 0x0b, 0xdd, 0x3b, 0x70, 0x6b, 0x20, 0xbd, 0xd7, 0xdb, 0x2d, 0xd6, 0x28, 0xc8, 0x1c, 0x09, 0x8d, 0x43, 0x4f, 0xb5, 0x5b, 0x56, 0xb0, 0x57, 0x67, 0xf2, 0xb4, 0x01, 0xa4, 0x13, 0x9f, 0x24, 0xf0, 0x93, 0x7a, 0x9d, 0xbe, 0xdf, 0xfa, 0xcc, 0x60, 0x4d, 0xdf, 0x8e, 0xeb, 0x43, 0x48, 0x82, 0x2a, 0x38, 0xec, 0xdd, 0x4a, 0x0e, 0x2e, 0x34, 0x14, 0x13, 0xee, 0x52, 0x39, 0x04, 0x48, 0x82, 0x6d, 0x03, 0xa0, 0xac, 0xef, 0x3b, 0x3d, 0x37, 0x58, 0x4d, 0x9c, 0x2a, 0xb1, 0x88, 0x38, 0x1b, 0x1f, 0xfc, 0x97, 0x40, 0xa5, 0xfe, 0xdb, 0xc0, 0x51, 0x2a, 0x96, 0x77, 0xa3, 0x4d, 0xec, 0x61, 0xe4, 0x27, 0x21, 0x30, 0x45, 0x70, 0xd9, 0x67, 0xae, 0x62, 0xb2, 0xba, 0x98, 0xf1, 0x4d, 0x4b, 0x70, 0x88, 0x21, 0x03, 0x98, 0xc8, 0x4d, 0xf8, 0xe6, 0x00, 0x64, 0x34, 0x9b, 0x80, 0x87, 0xc9, 0x48, 0xa2, 0x5c, 0x18, 0x1e, 0xd9, 0x40, 0xfc, 0x27, 0x8f, 0xbf, 0x9f, 0x9a, 0xe6, 0x83, 0x8d, 0xcb, 0xde, 0x18, 0x66, 0x13, 0xa9, 0x7b, 0x86, 0x22, 0x90, 0x8f, 0x0a, 0xbd, 0x1d, 0x07, 0x08, 0xe6, 0x03, 0x26, 0x08, 0xa3, 0x4b, 0xcd, 0xf9, 0xf1, 0x8b, 0x67, 0xd0, 0xe6, 0x81, 0xa9, 0xbd, 0x71, 0x88, 0x66, 0xe4, 0xef, 0xe8, 0xd6, 0x3e, 0xb4, 0x33, 0x0e, 0x48, 0x8f, 0x1f, 0x12, 0x86, 0x92, 0xa1, 0xc8, 0x13, 0x42, 0xe0, 0xe3, 0x3c, 0xb7, 0x68, 0x9f, 0x56, 0xc9, 0xe2, 0xd1, 0x40, 0xa5, 0x40, 0x27, 0xa6, 0xce, 0x2b, 0x63, 0xa7, 0xd7, 0xeb, 0xdf, 0x16, 0xa2, 0xb6, 0xe0, 0xfa, 0x78, 0x77, 0xae, 0x9f, 0x46, 0xe7, 0x63, 0xe2, 0x19, 0xd0, 0xa9, 0x00, 0x2b, 0x5d, 0xb0, 0x5e, 0x8a, 0x1e, 0xd9, 0xaa, 0x57, 0x03, 0x92, 0x52, 0x30, 0xda, 0x8e, 0xba, 0x0c, 0x61, 0xbe, 0x1c, 0xbf, 0x99, 0xf2, 0x08, 0x24, 0x57, 0xd3, 0x81, 0x48, 0xc6, 0x7d, 0x36, 0x8b, 0xd1, 0x9c, 0xa8, 0x21, 0x91, 0xdb, 0xf0, 0x2c, 0x44, 0x61, 0x82, 0x25, 0x11, 0x08, 0xcc, 0x67, 0xe3, 0x71, 0x58, 0xf3, 0x09, 0xd5, 0x66, 0x99, 0x6d, 0x4e, 0x97, 0x20, 0x50, 0x90, 0x91, 0xbd, 0x79, 0x5b, 0x7e, 0x32, 0xab, 0x65, 0x1d, 0x2d, 0xdc, 0xda, 0x4c, 0x0c, 0x5c, 0xae, 0xbd, 0xa2, 0x61, 0xc9, 0xb4, 0x5f, 0x7e, 0x65, 0x8b, 0xc3, 0xc2, 0xdd, 0x60, 0xf0, 0x8d, 0xec, 0x83, 0x6f, 0x3e, 0x33, 0x5b, 0x76, 0x2d, 0x28, 0x19, 0xe1, 0xb9, 0x60, 0x6c, 0x1d, 0xcb, 0x3a, 0x68, 0x94, 0x5a, 0xca, 0xc8, 0xa4, 0x11, 0x03, 0x6d, 0xcb, 0x20, 0x68, 0x70, 0x26, 0x60, 0xdb, 0xc4, 0x6c, 0xe8, 0x57, 0xa7, 0xcb, 0xea, 0x86, 0xb6, 0xb4, 0x7b, 0x48, 0xe9, 0xfc, 0x06, 0x87, 0x1c, 0x38, 0xe9, 0xdb, 0x93, 0xd0, 0x69, 0xd8, 0xee, 0x0c, 0x2c, 0x80, 0x67, 0x3f, 0xcc, 0xbf, 0xd1, 0x49, 0x9f, 0x04, 0x30, 0x1a, 0x33, 0xd8, 0x31, 0x50, 0x0c, 0x26, 0x66, 0xd6, 0x02, 0x47, 0x56, 0xdb, 0x8f, 0x55, 0x9d, 0x53, 0xf2, 0x4b, 0x96, 0x46, 0xa1, 0x8b, 0xf0, 0x9f, 0xcf, 0xf4, 0x6a, 0x0f, 0x0b, 0x98, 0xd9, 0x9d, 0xa7, 0xbb, 0xe3, 0xd5, 0xc0, 0xbc, 0x0b, 0xc3, 0xcb, 0x5a, 0x87, 0x17, 0xf6, 0xe2, 0x86, 0xad, 0x00, 0x27, 0x4d, 0xe3, 0x63, 0x72, 0x7d, 0x7f, 0xe8, 0xec, 0xf6, 0x7e, 0xbe, 0x57, 0x60, 0x16, 0xd7, 0xa8, 0x03, 0x7d, 0x0d, 0xbf, 0xc3, 0x1e, 0x0d, 0xd6, 0x54, 0x79, 0x2b, 0xe5, 0xc1, 0x59, 0x51, 0xcd, 0x16, 0xf4, 0x97, 0xd2, 0x09, 0xe6, 0x90, 0xff, 0x43, 0x8b, 0x25, 0x35, 0xd1, 0xb3, 0x53, 0x34, 0x68, 0xcf, 0x9d, 0xde, 0x13, 0x38, 0xca, 0x3a, 0x2a, 0xd2, 0xd8, 0xd1, 0xf4, 0xb6, 0x7d, 0x1b, 0x38, 0x9b, 0x37, 0xcb, 0xd5, 0xb8, 0x00, 0x09, 0xc4, 0x0b, 0x6b, 0x46, 0x2e, 0x63, 0x85, 0x72, 0x37, 0xce, 0x25, 0x1f, 0xf3, 0xfa, 0x2b, 0xd1, 0xf7, 0x73, 0x3d, 0xa0, 0xec, 0x8e, 0x7d, 0xe8, 0x0f, 0x44, 0x07, 0x89, 0xf6, 0xc0, 0xca, 0xb6, 0xaf, 0x39, 0x94, 0x78, 0x3d, 0xfe, 0x92, 0x26, 0xf1, 0x88, 0x78, 0x7f, 0xf8, 0x37, 0x3f, 0x5a, 0x4c, 0x62, 0xfe, 0x5d, 0x4a, 0xa8, 0xd1, 0x5e, 0xfd, 0xc3, 0x92, 0x78, 0x53, 0x87, 0x31, 0xbd, 0x44, 0x87, 0x7e, 0xac, 0x59, 0x86, 0x93, 0x23, 0x48, 0xad, 0x57, 0x31, 0x1c, 0x60, 0x24, 0xef, 0x13, 0x07, 0xa0, 0x01, 0x0f, 0xb3, 0xc7, 0x81, 0x62, 0xfa, 0x26, 0xfb, 0x6e, 0x1b, 0xd6, 0x9e, 0x1f, 0xbe, 0x0e, 0x38, 0x1d, 0x11, 0xb3, 0xbc, 0x24, 0x76, 0x9d, 0x57, 0xd6, 0xb1, 0x27, 0x04, 0xbd, 0x54, 0x15, 0x57, 0xa1, 0xb3, 0x38, 0x11, 0x0f, 0x2f, 0x40, 0x42, 0xdc, 0x8d, 0x88, 0x9f, 0xbb, 0x6b, 0xf1, 0x02, 0x4c, 0x11, 0x29, 0xa7, 0xb9, 0xc3, 0x19, 0xc1, 0xeb, 0x3d, 0x8a, 0xa9, 0x7a, 0x02, 0x02, 0x4f, 0xe8, 0xa6, 0x39, 0xbb, 0xa7, 0x80, 0xa5, 0xfb, 0x1e, 0x05, 0x04, 0x8f, 0x56, 0xba, 0xb1, 0x85, 0xf0, 0xc0, 0xd9, 0xe7, 0xf2, 0xf7, 0x15, 0x85, 0x0f, 0x84, 0x0e, 0x31, 0x24, 0xae, 0x19, 0xc5, 0xaa, 0xfb, 0xf2, 0x80, 0x8d, 0x7e, 0x1e, 0x00, 0xd3, 0x89, 0xac, 0x0a, 0x9c, 0x29, 0xfe, 0xe3, 0xc2, 0x8b, 0xa4, 0xb9, 0x19, 0xc9, 0xf7, 0x37, 0x4e, 0x60, 0xb6, 0x93, 0x20, 0xf8, 0xcf, 0xf9, 0xe1, 0xbf, 0x25, 0x33, 0x67, 0xa9, 0xd4, 0xce, 0xc5, 0x74, 0xdd, 0xbf, 0x62, 0xfa, 0xfd, 0x5f, 0x25, 0xcc, 0x36, 0x30, 0x28, 0xf1, 0x4c, 0x67, 0x31, 0x2d, 0x1e, 0xc0, 0x93, 0x0d, 0x2e, 0xb1, 0xfe, 0xe1, 0xf7, 0x17, 0xe8, 0x55, 0x83, 0x24, 0x94, 0x44, 0xe1, 0xaf, 0xa5, 0xa4, 0x90, 0x42, 0x93, 0x16, 0x7c, 0xdf, 0x7b, 0xc7, 0x03, 0x5a, 0x61, 0x1c, 0x04, 0xdd, 0xf7, 0x7a, 0xf6, 0xc7, 0xe9, 0xa7, 0x9e, 0x94, 0xe8, 0x36, 0x6e, 0x4d, 0x75, 0xa7, 0x60, 0x68, 0x28, 0x5d, 0x27, 0xce, 0xc5, 0x79, 0x88, 0x13, 0xfc, 0x88, 0x6a, 0x16, 0x3e, 0x02, 0x49, 0xed, 0x8f, 0x32, 0x0e, 0x80, 0x7e, 0x19, 0x7d, 0xcf, 0xbe, 0x84, 0xcb, 0x4b, 0xfd, 0x8d, 0xba, 0x85, 0x75, 0x10, 0x87, 0x6a, 0xd5, 0xfd, 0xe1, 0x54, 0xd4, 0x8f, 0xaf, 0x0c, 0xf7, 0x37, 0x04, 0x19, 0xbe, 0xfa, 0x3e, 0xf8, 0xb4, 0x14, 0x73, 0x7c, 0x33, 0x99, 0xdf, 0xe7, 0x09, 0xb4, 0x3f, 0x2d, 0x1f, 0x6f, 0x5b, 0x40, 0xa0, 0x6b, 0x6d, 0x9b, 0x51, 0xac, 0xa9, 0x96, 0x65, 0x13, 0xbf, 0xf2, 0xb5, 0xe3, 0xab, 0xc5, 0xe2, 0xa8, 0x3a, 0x4c, 0x38, 0xf6, 0x30, 0xd4, 0xfe, 0xf9, 0x59, 0x66, 0x74, 0x8a, 0x99, 0xa3, 0xa2, 0x7c, 0x81, 0xae, 0xbc, 0xa3, 0xdc, 0x16, 0xe4, 0xd4, 0xa4, 0x3b, 0x62, 0x9f, 0x56, 0xb2, 0x21, 0xee, 0xb0, 0x86, 0xe7, 0xae, 0xa8, 0x4c, 0x09, 0x4a, 0xc4, 0x52, 0x92, 0x73, 0x2e, 0xa2, 0x5d, 0x8b, 0x38, 0x76, 0xcc, 0x43, 0xe1, 0x1a, 0xbf, 0x9e, 0x89, 0x82, 0xd6, 0x5c, 0x5f, 0x4c, 0x00, 0xb7, 0xd5, 0x56, 0x72, 0x63, 0x64, 0xca, 0xde, 0xaf, 0x58, 0xe9, 0xf9, 0x3f, 0x17, 0x3a, 0xa4, 0x49, 0x0a, 0x21, 0xea, 0x9f, 0x4a, 0xbf, 0xe9, 0x4e, 0x82, 0x43, 0x29, 0xbc, 0x70, 0xad, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x02, 0xe4, 0x61, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbd, 0x07, 0xec, 0x81, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x02, 0xc6, 0xd7, 0x7c, 0xc0, 0xcb, 0xc4, 0x09, 0x67, 0x85, 0xf1, 0x8e, 0x19, 0x9c, 0xef, 0x6b, 0xd4, 0xab, 0x9e, 0x39, 0xa2, 0xa3, 0x6d, 0x71, 0xea, 0x44, 0x1e, 0x39, 0xc7, 0x45, 0x57, 0xe2, 0x12, 0xe8, 0x75, 0x6f, 0x3b, 0xc0, 0x3e, 0x83, 0x3b, 0x76, 0x00, 0x4f, 0x11, 0x4e, 0xdd, 0x59, 0x7e, 0xb3, 0xaf, 0x36, 0x2f, 0x90, 0xfb, 0xb5, 0x14, 0x64, 0x62, 0xb8, 0x40, 0x6e, 0xfa, 0xb3, 0xee, 0x58, 0xdf, 0xb8, 0xfe, 0xcb, 0x89, 0x65, 0x04, 0x03, 0xca, 0x5c, 0xc5, 0xf8, 0x39, 0x08, 0xb6, 0x4a, 0xe1, 0xc4, 0x1a, 0x92, 0xf3, 0x4b, 0x47, 0xcf, 0x00, 0xcd, 0xfd, 0xce, 0xb4, 0x7a, 0x25, 0x31, 0x43, 0xc4, 0xf9, 0x9d, 0x9b, 0x62, 0x30, 0x25, 0xae, 0xcb, 0x56, 0x8a, 0xd0, 0xa9, 0x47, 0x3e, 0x29, 0x3b, 0x0f, 0x69, 0x80, 0xb9, 0x4b, 0x7f, 0x52, 0xa3, 0xa6, 0x62, 0xe8, 0xa8, 0x62, 0x2f, 0x64, 0x82, 0xad, 0xba, 0x18, 0x75, 0xcb, 0x09, 0x68, 0x96, 0x65, 0x48, 0xae, 0x2c, 0xfb, 0x88, 0xb9, 0x0c, 0x07, 0x9a, 0x4c, 0x3b, 0x85, 0xe8, 0x30, 0xce, 0xbb, 0xce, 0x24, 0x9d, 0x6d, 0xcb, 0xd9, 0xed, 0x05, 0x22, 0xb0, 0x65, 0x62, 0x45, 0x28, 0xb9, 0xcf, 0x2d, 0x06, 0xe3, 0xef, 0x93, 0x42, 0x68, 0xa5, 0xce, 0xe3, 0x57, 0x6a, 0x8b, 0x69, 0x7e, 0x0e, 0xeb, 0x12, 0x6a, 0x1f, 0xf5, 0xf4, 0x8a, 0x96, 0x5a, 0x4f, 0x82, 0xbf, 0x1c, 0x5c, 0xb0, 0xdb, 0xad, 0x21, 0x28, 0xd4, 0x05, 0x70, 0xf6, 0x14, 0x7d, 0x6b, 0xa0, 0xca, 0x22, 0xd2, 0xbb, 0x55, 0x4c, 0x52, 0x84, 0xc9, 0x8c, 0xe3, 0x59, 0xb3, 0x1b, 0xd9, 0x0e, 0x87, 0x2e, 0x6e, 0x49, 0x27, 0xc9, 0xe4, 0xbf, 0xb2, 0x2e, 0xa7, 0xde, 0x16, 0xc6, 0x62, 0x9b, 0x72, 0xbe, 0x11, 0x20, 0x38, 0xaa, 0x35, 0x54, 0xc1, 0xc6, 0x5f, 0xd2, 0x4d, 0x42, 0xce, 0xc4, 0xe6, 0xf1, 0x81, 0x11, 0x59, 0x8d, 0x0c, 0x43, 0x35, 0x7f, 0x3f, 0x74, 0xc2, 0xdd, 0x05, 0x12, 0x8b, 0x05, 0x40, 0xd8, 0x74, 0x9d, 0x5b, 0x45, 0x36, 0xff, 0x6e, 0xe9, 0xb7, 0xa2, 0x9e, 0x95, 0x95, 0x41, 0xef, 0x2c, 0x39, 0xc5, 0x78, 0xe8, 0xe5, 0x9d, 0x54, 0x68, 0x78, 0x7f, 0x81, 0xb1, 0x40, 0xbf, 0x7c, 0x11, 0xb0, 0x41, 0xbf, 0xaa, 0x04, 0x71, 0x34, 0x2a, 0x72, 0x30, 0xbb, 0x75, 0xb1, 0xf5, 0x0c, 0x07, 0x9b, 0xa7, 0xab, 0xd0, 0x38, 0x80, 0x9e, 0x64, 0xb1, 0x19, 0x70, 0x6f, 0xa9, 0x45, 0x66, 0x1b, 0x41, 0xd6, 0xd9, 0x73, 0xb3, 0xa6, 0xfb, 0x2e, 0x62, 0xf6, 0x18, 0x1d, 0x38, 0x63, 0x07, 0x68, 0x5e, 0xbf, 0x14, 0xa4, 0xec, 0x4e, 0x47, 0x49, 0xa7, 0x8c, 0xdf, 0x32, 0xfb, 0xec, 0x80, 0xca, 0xbd, 0xfc, 0xc3, 0x70, 0xac, 0x7c, 0x5e, 0x6a, 0xc9, 0x67, 0x4b, 0x7a, 0x07, 0xd5, 0xcd, 0xef, 0xba, 0x70, 0x73, 0x5b, 0x66, 0x75, 0xd9, 0x85, 0xfe, 0x72, 0x65, 0xcb, 0x74, 0xe8, 0x14, 0xde, 0xf1, 0xb9, 0xe7, 0xac, 0x6e, 0x2f, 0xc9, 0x8f, 0x94, 0x06, 0x05, 0x9d, 0x48, 0xe7, 0xc6, 0x96, 0xeb, 0x8c, 0x44, 0x84, 0x91, 0x14, 0xa8, 0x76, 0x4c, 0x4f, 0x78, 0xba, 0x9a, 0x18, 0x23, 0x56, 0x86, 0xb9, 0x38, 0xd9, 0x62, 0xeb, 0x36, 0x5b, 0xbf, 0x1b, 0x9a, 0xb6, 0x6d, 0x8a, 0x0a, 0x69, 0x33, 0x87, 0x1e, 0xbd, 0x07, 0x85, 0xcc, 0x86, 0xa0, 0x17, 0x2b, 0x00, 0x51, 0x19, 0x93, 0xbd, 0x64, 0x25, 0x47, 0xad, 0x5d, 0xa1, 0xbd, 0x84, 0xe6, 0xf5, 0xaa, 0x1d, 0x61, 0x19, 0x49, 0x9a, 0x59, 0xdc, 0x40, 0xd7, 0xf7, 0x4e, 0xda, 0x0a, 0x93, 0x39, 0x0f, 0x39, 0xdd, 0x54, 0x95, 0x14, 0x30, 0xcb, 0x25, 0xdd, 0x63, 0xf5, 0x00, 0xf2, 0x75, 0x33, 0x5c, 0xea, 0x7a, 0xac, 0x20, 0xb2, 0xfe, 0xab, 0x94, 0x76, 0x7d, 0x0b, 0x15, 0x67, 0x3a, 0x4c, 0x1e, 0xa8, 0x3d, 0x75, 0x0d, 0x31, 0xcb, 0xdf, 0xe2, 0xa7, 0xa3, 0xff, 0xb1, 0x95, 0x14, 0x42, 0x3b, 0x53, 0xba, 0x1b, 0xb4, 0xcd, 0x97, 0x02, 0xc3, 0x63, 0x91, 0x7d, 0x91, 0xa0, 0xbf, 0xca, 0x29, 0xd5, 0xfb, 0xc0, 0x54, 0x49, 0x1c, 0xff, 0x15, 0x65, 0xff, 0xda, 0x36, 0x66, 0xe6, 0x66, 0xbc, 0x1e, 0x29, 0x46, 0xca, 0xf2, 0xaf, 0x93, 0xb8, 0x82, 0xb4, 0xdc, 0x43, 0x05, 0xf1, 0xd9, 0x71, 0x3f, 0x18, 0x75, 0xb6, 0x5f, 0x12, 0x7f, 0x2e, 0x35, 0xf7, 0xf8, 0x50, 0xf3, 0xa8, 0xd7, 0xc4, 0xad, 0xa6, 0x11, 0x6d, 0x83, 0xe5, 0xe1, 0x14, 0x3a, 0x33, 0x32, 0xb0, 0x17, 0x36, 0xd9, 0xcd, 0x98, 0x05, 0x81, 0x13, 0xcd, 0x87, 0x37, 0x87, 0x48, 0x3e, 0x12, 0x61, 0xea, 0x09, 0x7e, 0x93, 0x4d, 0x10, 0x98, 0x6d, 0xa6, 0x6f, 0x87, 0x4f, 0x7c, 0x05, 0x41, 0x7e, 0x3d, 0x6b, 0xc8, 0x5b, 0x63, 0xdb, 0x34, 0x2b, 0xc4, 0xc9, 0x2a, 0x25, 0xbe, 0x03, 0x67, 0x0c, 0xd4, 0xc8, 0x95, 0x3e, 0xb5, 0xf5, 0xf4, 0xc2, 0xa7, 0xce, 0x23, 0xd9, 0x0c, 0x0f, 0x73, 0xc3, 0x19, 0xeb, 0xae, 0x18, 0x47, 0x4c, 0xdc, 0xba, 0x7e, 0xdd, 0x5a, 0xec, 0x8f, 0x41, 0xef, 0x8d, 0xf9, 0x7f, 0x23, 0x88, 0xf2, 0xda, 0x3e, 0x8e, 0x78, 0xef, 0xeb, 0x46, 0xae, 0xea, 0xa6, 0x86, 0x49, 0x6e, 0x01, 0x37, 0xf8, 0x83, 0x9c, 0x21, 0x73, 0x68, 0xff, 0x29, 0x3e, 0xf4, 0x65, 0xab, 0x22, 0x15, 0xdf, 0x5f, 0xfb, 0x53, 0x98, 0xec, 0xee, 0xe5, 0x6e, 0xa5, 0xae, 0x1f, 0xac, 0x58, 0x3e, 0x1a, 0x53, 0xc3, 0x3a, 0xa8, 0x72, 0xf2, 0x53, 0xf9, 0x37, 0x7d, 0xba, 0xec, 0xb3, 0x91, 0xfd, 0x05, 0xd2, 0x5c, 0xb9, 0x24, 0xb1, 0xf6, 0xe5, 0xb1, 0x1f, 0xc8, 0x27, 0x2d, 0xa7, 0x49, 0x77, 0xfd, 0xe2, 0x39, 0x37, 0x48, 0x5b, 0x70, 0x28, 0x85, 0x83, 0x12, 0xdf, 0xbc, 0xb0, 0x65, 0x05, 0x02, 0xa1, 0x73, 0x71, 0x0e, 0xd3, 0x8f, 0x3a, 0x27, 0xb8, 0xc4, 0x5b, 0xe4, 0xb1, 0x12, 0x18, 0xa8, 0x6c, 0xc8, 0x17, 0xe2, 0x13, 0xf1, 0x51, 0x49, 0xb4, 0x0f, 0xb7, 0xf5, 0x88, 0x94, 0x20, 0xc2, 0x8e, 0x95, 0xff, 0xd6, 0xfd, 0xda, 0x4f, 0xda, 0x19, 0xa9, 0x59, 0x49, 0x71, 0x01, 0xf5, 0x5c, 0xdf, 0x2c, 0x93, 0xb5, 0x7f, 0xd7, 0x42, 0x57, 0x6e, 0x76, 0xd8, 0x03, 0x5e, 0xd6, 0xfa, 0x0e, 0x79, 0xa2, 0x91, 0xbd, 0xb0, 0xda, 0x6b, 0xa7, 0x38, 0xfc, 0x95, 0x39, 0x8b, 0xf0, 0x7f, 0xfe, 0xb9, 0x5a, 0xbb, 0x5d, 0xa2, 0x8e, 0x3a, 0xd1, 0x6e, 0x60, 0xb6, 0x55, 0x24, 0xfb, 0x05, 0xce, 0x75, 0x19, 0xb3, 0x53, 0x79, 0x11, 0xb9, 0xbb, 0xff, 0x0c, 0xcf, 0x3c, 0x42, 0xaf, 0xec, 0xf4, 0x51, 0x20, 0x0b, 0xc0, 0x10, 0xc8, 0x69, 0x52, 0x03, 0xc4, 0xcb, 0x67, 0x08, 0xb5, 0x06, 0x4c, 0x78, 0xf5, 0x39, 0xd9, 0x44, 0x03, 0x17, 0xbf, 0xa2, 0xb6, 0x45, 0x0b, 0xfb, 0xca, 0xb5, 0xe1, 0xc0, 0x33, 0x53, 0xe5, 0x4f, 0x0b, 0x40, 0xc5, 0xda, 0x6a, 0x40, 0x35, 0x10, 0x24, 0xac, 0x43, 0xd5, 0x8b, 0x17, 0xac, 0x84, 0x64, 0x37, 0xc6, 0x48, 0x1f, 0x9f, 0x68, 0x52, 0xa5, 0x5a, 0x08, 0xac, 0x92, 0x19, 0xa9, 0xe0, 0xa7, 0xbe, 0x98, 0x8c, 0x9e, 0xd1, 0xfe, 0x14, 0x27, 0x76, 0x58, 0x9d, 0x02, 0xc6, 0x9a, 0x31, 0xbc, 0x73, 0x9a, 0x73, 0x26, 0x65, 0x05, 0xe0, 0x7f, 0x46, 0xe3, 0x2f, 0xf9, 0x6d, 0xd5, 0x96, 0x35, 0xab, 0xea, 0x75, 0x04, 0xe6, 0xa1, 0x57, 0x3d, 0x8c, 0x3b, 0x76, 0xcc, 0xfc, 0x50, 0x25, 0xe8, 0xbe, 0x8d, 0x6b, 0xe2, 0x60, 0xdc, 0xa2, 0x41, 0xc0, 0xa9, 0xc8, 0x92, 0xdb, 0xa0, 0x7f, 0xb4, 0xb3, 0x80, 0xcb, 0x68, 0xc0, 0x4a, 0x0a, 0xda, 0xda, 0x79, 0xed, 0x3d, 0x66, 0x62, 0xcb, 0x28, 0xdf, 0x06, 0x88, 0x74, 0x09, 0x24, 0xe9, 0xeb, 0x55, 0xd4, 0x15, 0x45, 0x28, 0xb2, 0xb1, 0xc7, 0x0e, 0x7c, 0x67, 0x73, 0xe3, 0x57, 0xf7, 0x26, 0x79, 0x7c, 0x0f, 0x7a, 0x31, 0x8f, 0x4b, 0xf4, 0xd9, 0xef, 0xc3, 0xda, 0x12, 0x8b, 0x24, 0x8d, 0x41, 0xde, 0xbb, 0x6f, 0x20, 0x19, 0xae, 0x0f, 0xad, 0xd5, 0xd5, 0xba, 0x4a, 0x8e, 0x74, 0x36, 0x2e, 0x86, 0x02, 0xbf, 0x87, 0x33, 0x2f, 0xd3, 0x52, 0xe5, 0xce, 0x06, 0xc2, 0x00, 0xa0, 0x93, 0x54, 0x47, 0x27, 0x6e, 0xa5, 0xdd, 0xee, 0x51, 0x24, 0xdb, 0x19, 0xb2, 0x9d, 0xf0, 0x6d, 0x5e, 0x01, 0x73, 0x91, 0x4f, 0x89, 0x70, 0xc5, 0x41, 0x7c, 0xc4, 0x31, 0x4d, 0xc0, 0x1e, 0x7a, 0x0a, 0x07, 0xbb, 0xce, 0x45, 0x8c, 0x7c, 0x70, 0x44, 0xc4, 0x26, 0xa6, 0xc9, 0x98, 0xaa, 0x3a, 0xf2, 0xaf, 0xc9, 0x03, 0x62, 0x10, 0xa6, 0xa5, 0x7c, 0x66, 0x2f, 0xc7, 0x00, 0x43, 0x9d, 0xf7, 0x04, 0x9f, 0x66, 0x58, 0x78, 0x3a, 0xc9, 0xc3, 0xca, 0x98, 0x7a, 0x56, 0x1f, 0xa6, 0x6b, 0x5b, 0x60, 0x45, 0xb0, 0x57, 0x17, 0x90, 0x1f, 0xa9, 0x5c, 0x0a, 0x4c, 0xbb, 0x7c, 0x63, 0xf0, 0x0c, 0x77, 0x63, 0x11, 0x52, 0xc8, 0xa9, 0x36, 0x39, 0x4b, 0xfb, 0x07, 0x07, 0x60, 0xd7, 0x77, 0x1e, 0x4e, 0xbe, 0x0d, 0xf6, 0xdb, 0xcd, 0x09, 0x98, 0x66, 0x5a, 0xc2, 0xc7, 0x36, 0x79, 0x92, 0xa8, 0x21, 0xc3, 0x03, 0xb7, 0x40, 0x93, 0x58, 0x28, 0xb3, 0xa4, 0x2d, 0x7c, 0xa2, 0xeb, 0x33, 0x3c, 0x97, 0xbd, 0x34, 0x37, 0x38, 0x33, 0x6b, 0xe6, 0x0c, 0xfd, 0x95, 0x39, 0x8b, 0x72, 0xbc, 0x49, 0x6d, 0xfc, 0x74, 0x97, 0x59, 0xfe, 0x87, 0x7c, 0xec, 0x50, 0xde, 0x72, 0x83, 0x9c, 0x35, 0x3b, 0x84, 0xa4, 0x96, 0x46, 0x7e, 0xe0, 0x3a, 0xcd, 0xb8, 0xa3, 0x4e, 0x82, 0x4b, 0x59, 0xaa, 0x0b, 0xc4, 0x18, 0xb4, 0x36, 0x97, 0x41, 0xad, 0x6c, 0xd7, 0x13, 0x6a, 0x4e, 0x86, 0x0e, 0x8f, 0xe5, 0x90, 0xf2, 0x03, 0x94, 0x5c, 0x1d, 0x13, 0xda, 0x0f, 0x7c, 0xd7, 0xc1, 0x31, 0xa0, 0x50, 0x2a, 0x4c, 0x7e, 0xb0, 0xd2, 0x9b, 0xc0, 0xd7, 0x7e, 0x72, 0x2d, 0xf2, 0x25, 0x2e, 0xd5, 0x85, 0xf2, 0xb2, 0x82, 0x9f, 0x8e, 0x5c, 0x8e, 0x5a, 0xe9, 0x5f, 0x1d, 0x87, 0xcd, 0xdb, 0x14, 0x5f, 0x9d, 0xa3, 0x95, 0x35, 0x73, 0x48, 0x10, 0xc1, 0xd4, 0x30, 0x0d, 0x79, 0xe9, 0x56, 0xab, 0xbf, 0xf7, 0x07, 0xe6, 0x06, 0xa2, 0x24, 0xa1, 0x78, 0x6b, 0x2a, 0xdf, 0xd1, 0x6a, 0x8a, 0x18, 0x84, 0x4e, 0xaf, 0x37, 0x9a, 0xea, 0x86, 0x08, 0xf0, 0x8f, 0x88, 0xa4, 0xb5, 0x3d, 0x94, 0x5e, 0xec, 0x24, 0x15, 0x06, 0xbf, 0x09, 0x8b, 0x4e, 0xa5, 0xef, 0x48, 0x87, 0xa1, 0xe5, 0x1a, 0x4f, 0x32, 0x16, 0x8c, 0x5a, 0x97, 0xae, 0x68, 0x6f, 0x66, 0x15, 0xb0, 0x24, 0x62, 0x1b, 0x17, 0x51, 0xc9, 0xab, 0x51, 0x69, 0x63, 0x96, 0x0f, 0x59, 0x61, 0xad, 0xe7, 0x34, 0x4e, 0xad, 0xc6, 0x74, 0xaa, 0x79, 0xfb, 0x67, 0x66, 0x58, 0xf8, 0x6f, 0x98, 0x03, 0x17, 0x09, 0x86, 0x1e, 0x5b, 0xe4, 0x13, 0x50, 0xcc, 0xaf, 0x1a, 0x4d, 0xd1, 0x5b, 0xf2, 0x8e, 0x85, 0x8d, 0x29, 0x2d, 0xc8, 0x71, 0x74, 0xcd, 0x68, 0xa3, 0x4c, 0xc1, 0xc8, 0xc8, 0x02, 0x20, 0xc7, 0xcd, 0x26, 0x7f, 0x7f, 0xa3, 0x83, 0xa0, 0x4f, 0x9f, 0x50, 0x9d, 0x99, 0x21, 0x0c, 0x05, 0xd4, 0x68, 0xd2, 0xfe, 0xd3, 0x3e, 0x64, 0xf7, 0xe0, 0x81, 0x45, 0x91, 0x25, 0xeb, 0x0a, 0x81, 0x5c, 0xdb, 0xc6, 0x9d, 0x0e, 0xe0, 0x83, 0x4c, 0x4d, 0x6f, 0x66, 0xf9, 0x91, 0xf0, 0x91, 0x5a, 0x1f, 0x74, 0x57, 0xcd, 0x20, 0x6b, 0x79, 0x72, 0xf5, 0x51, 0xb0, 0x51, 0x68, 0x34, 0x6f, 0xf0, 0x80, 0x85, 0x7e, 0x68, 0x6c, 0xd5, 0x10, 0x63, 0x35, 0x77, 0x37, 0xf2, 0xf5, 0x91, 0x06, 0xfd, 0x81, 0xa4, 0x20, 0xf2, 0x72, 0x66, 0xe3, 0x7d, 0x32, 0x05, 0xa3, 0xdc, 0xf4, 0xda, 0x36, 0x58, 0x8d, 0xae, 0x20, 0x34, 0x0f, 0x8e, 0xe0, 0xd1, 0x82, 0x0c, 0xcf, 0x2b, 0xac, 0x5e, 0xda, 0x3e, 0x49, 0x4d, 0xb4, 0x2c, 0x17, 0x15, 0xda, 0xe2, 0x30, 0x9b, 0x86, 0x01, 0xa8, 0x71, 0x20, 0xdb, 0x18, 0x27, 0x3d, 0xcf, 0xe6, 0x01, 0x09, 0x6d, 0xe0, 0xf2, 0xa9, 0xea, 0x4c, 0x80, 0x56, 0xab, 0x3b, 0x56, 0xfb, 0x4f, 0xe2, 0x5f, 0x80, 0x7a, 0x6c, 0xe8, 0x02, 0x6b, 0x65, 0xef, 0x3a, 0xd6, 0x66, 0xe4, 0x9f, 0xa1, 0x15, 0x50, 0x21, 0xe1, 0x37, 0x84, 0xfc, 0x5e, 0xe4, 0xf2, 0x89, 0xdb, 0x57, 0xa7, 0x9a, 0x68, 0x7c, 0x3d, 0x75, 0xf3, 0x64, 0x54, 0xca, 0xff, 0x83, 0xc7, 0x9e, 0x39, 0xc5, 0x98, 0x6a, 0xb3, 0x79, 0x30, 0x6f, 0xd6, 0x96, 0x2e, 0xa3, 0xdd, 0x4a, 0x84, 0xa7, 0x9f, 0x48, 0x06, 0xa1, 0x47, 0x1b, 0x79, 0xeb, 0x75, 0x12, 0x8d, 0xf9, 0xde, 0x43, 0xbd, 0x5f, 0xfa, 0xba, 0x28, 0x5e, 0x8e, 0x4c, 0xfb, 0xf9, 0x85, 0xd0, 0xe5, 0x37, 0xdc, 0x23, 0x99, 0x56, 0xea, 0x84, 0x8a, 0xa2, 0xe6, 0xdd, 0x1f, 0x25, 0xfb, 0x7d, 0x1c, 0x0b, 0xd9, 0x46, 0xc1, 0xfe, 0xf9, 0xc9, 0xf4, 0x51, 0xaf, 0xe9, 0x67, 0x1a, 0xe0, 0xeb, 0x22, 0xf2, 0xe0, 0x66, 0xa6, 0x2a, 0x47, 0x8d, 0xdd, 0xe3, 0x82, 0x9c, 0x92, 0x51, 0x05, 0x4f, 0x3f, 0x2f, 0xf6, 0xfb, 0x40, 0x3b, 0xf7, 0x73, 0xbb, 0xcd, 0xe1, 0xc5, 0xd1, 0xe4, 0xe0, 0x5d, 0xd2, 0xbb, 0xa8, 0xe4, 0x9e, 0x83, 0xf0, 0x7a, 0x77, 0x0e, 0x42, 0x7c, 0xd9, 0xeb, 0xe4, 0xb9, 0xb1, 0x17, 0x53, 0x8c, 0x17, 0xdc, 0xaf, 0x64, 0x99, 0x49, 0x76, 0xf3, 0xf0, 0x8e, 0x76, 0x54, 0xba, 0xde, 0x81, 0xce, 0x52, 0xaf, 0x0c, 0xb8, 0xec, 0x28, 0x99, 0x36, 0x75, 0xb8, 0x6e, 0x2f, 0x07, 0xd5, 0x41, 0x1b, 0x27, 0xfe, 0x12, 0xc6, 0x00, 0xe7, 0x90, 0x8b, 0x8d, 0xcb, 0xb4, 0x61, 0x09, 0x29, 0x7d, 0x50, 0xc0, 0xdc, 0x93, 0xb0, 0xa3, 0x2e, 0x2f, 0x7e, 0x2b, 0xc5, 0x0e, 0x87, 0x7a, 0xa4, 0x32, 0xd1, 0x90, 0xf0, 0xbe, 0x3c, 0x78, 0x9d, 0xd5, 0xae, 0xe5, 0xa8, 0xa1, 0x9b, 0xed, 0x03, 0xa2, 0xfe, 0x1a, 0x26, 0x13, 0x15, 0x99, 0xe6, 0xf5, 0x2d, 0x58, 0x68, 0x42, 0xe1, 0xda, 0x25, 0x1c, 0x8e, 0x0d, 0xed, 0x78, 0x4f, 0x42, 0x10, 0x8f, 0x1d, 0x2b, 0x24, 0x01, 0x94, 0xcf, 0xe1, 0x65, 0xeb, 0x67, 0x96, 0x08, 0xa2, 0x10, 0xa0, 0x9c, 0x45, 0x0b, 0x01, 0xf3, 0xa9, 0x38, 0x1e, 0xab, 0xbe, 0x24, 0x80, 0x07, 0xff, 0x43, 0xa7, 0x32, 0xf2, 0x54, 0xee, 0xba, 0xe7, 0x63, 0xfd, 0xc3, 0x5b, 0x26, 0x27, 0x36, 0x4f, 0xf0, 0xbd, 0x5b, 0xfc, 0x9a, 0x58, 0xe1, 0xb9, 0x60, 0x60, 0x3f, 0x5b, 0x92, 0x61, 0xa8, 0x7b, 0x13, 0xf2, 0xed, 0x9d, 0x9d, 0xee, 0x2a, 0x6b, 0x06, 0xd4 }; +constexpr AccessUnit LPCM_LARGE_AU_EXPECTED_AU = { 0x15f90, 0x159b2, false, 3, { 0x00, 0x00, 0x00, 0xfb, 0xba, 0x2b, 0xca, 0x88, 0x65, 0x2b, 0x01, 0xf4, 0xe6, 0xfc, 0x43, 0xc2 }, { 0xd6, 0x8c, 0x4f, 0x4c, 0xff, 0x84, 0x68, 0xd3, 0xb0, 0x60, 0x67, 0xd0, 0x3c, 0x90, 0x37, 0x14, 0x84, 0xba, 0x7a, 0xca } }; + +const std::vector USER_DATA_LARGE_AU_STREAM = { 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xbd, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x20, 0x4d, 0x00, 0x00, 0x12, 0x34, 0x5c, 0x19, 0xda, 0x7f, 0x08, 0x26, 0x84, 0x39, 0xe1, 0xd5, 0x52, 0x91, 0x8d, 0x44, 0xa5, 0xfc, 0xcb, 0x75, 0x65, 0x49, 0xd3, 0xaf, 0x92, 0x68, 0x5b, 0x79, 0x65, 0x28, 0x51, 0x4e, 0x74, 0xf7, 0xe6, 0xe6, 0x11, 0xe6, 0x89, 0x46, 0xcf, 0x5c, 0x3b, 0xe3, 0xaa, 0x7e, 0xc0, 0xee, 0xb8, 0x5a, 0xca, 0xf1, 0x60, 0x2d, 0x4b, 0xcd, 0x10, 0x79, 0xca, 0xf5, 0xc6, 0x3a, 0x63, 0x4e, 0xc5, 0x7e, 0x09, 0xeb, 0x6b, 0x12, 0x8f, 0x74, 0x71, 0x4f, 0x7e, 0x73, 0xd1, 0xe8, 0xe6, 0x6d, 0x4a, 0xc9, 0xf7, 0x0b, 0x96, 0x55, 0xcc, 0xcf, 0x96, 0x5b, 0xd2, 0x3e, 0x26, 0x5d, 0x61, 0x46, 0x73, 0xfe, 0x20, 0x18, 0xe7, 0xc7, 0xeb, 0x69, 0x02, 0xd8, 0xd8, 0x34, 0x94, 0xf9, 0xcb, 0x3c, 0xd7, 0x41, 0xd9, 0x8c, 0xa8, 0xbd, 0x8b, 0x18, 0xf1, 0x5d, 0xa0, 0x94, 0xdf, 0xd0, 0xa0, 0x72, 0xb2, 0xc3, 0x29, 0x05, 0xd6, 0x61, 0x95, 0xba, 0xa8, 0x13, 0x8b, 0x56, 0xcf, 0xb7, 0x65, 0x0d, 0xbb, 0xaf, 0xe9, 0x4e, 0x4c, 0xb6, 0xd4, 0xf6, 0x43, 0x81, 0x46, 0x46, 0xb1, 0x0f, 0xf7, 0x59, 0x3d, 0xe3, 0xc5, 0x1b, 0x3f, 0x60, 0x9f, 0x80, 0x71, 0x60, 0x19, 0x37, 0xb6, 0x7a, 0x2b, 0x7e, 0x1e, 0x6a, 0x13, 0x64, 0x5a, 0x80, 0xcb, 0xda, 0xaa, 0x6f, 0xd0, 0xfd, 0x9c, 0x32, 0x36, 0xac, 0x24, 0x9d, 0x9e, 0xfa, 0xfc, 0x26, 0xcb, 0x5d, 0x3a, 0x74, 0x56, 0xd3, 0x0e, 0xea, 0xc2, 0x4e, 0xaf, 0xef, 0x02, 0x5c, 0x2b, 0x68, 0x13, 0x5f, 0x71, 0xae, 0x27, 0x5d, 0xe2, 0xb2, 0x10, 0x01, 0x0e, 0x6e, 0xed, 0x9e, 0x7b, 0x6f, 0xb6, 0xdc, 0x99, 0x62, 0x0b, 0x48, 0x03, 0xa5, 0x8c, 0x6c, 0x82, 0xa1, 0xe3, 0x69, 0x72, 0x90, 0x47, 0xb6, 0x36, 0xe2, 0xfb, 0x9d, 0x14, 0x8a, 0xcd, 0x67, 0x48, 0xb9, 0x01, 0x2d, 0xf0, 0x9d, 0xc3, 0xf1, 0xb3, 0x92, 0x0c, 0x3a, 0xb4, 0xb5, 0x3a, 0x5c, 0x22, 0x0f, 0x31, 0x3c, 0xf9, 0xd1, 0xd8, 0x0c, 0xc9, 0xc9, 0x06, 0xbf, 0x86, 0x4e, 0x5a, 0xe7, 0xd8, 0xd2, 0x6b, 0x7a, 0x2c, 0xb3, 0xb3, 0x40, 0xd3, 0x49, 0xa0, 0xf9, 0xc3, 0x31, 0x18, 0x75, 0x95, 0x34, 0xce, 0x25, 0x3c, 0x48, 0x47, 0xeb, 0x4f, 0xde, 0xa6, 0xd2, 0x5f, 0xf3, 0x4d, 0x09, 0xb1, 0xc0, 0x65, 0xbc, 0xe6, 0x27, 0x3b, 0x8a, 0x08, 0xf6, 0x6e, 0x48, 0x1a, 0x1e, 0xc9, 0x8d, 0x6d, 0x7b, 0x67, 0x6c, 0xdb, 0x67, 0xcc, 0xe2, 0x67, 0x8e, 0x61, 0xf0, 0x3c, 0x0b, 0xac, 0x40, 0x37, 0x57, 0xae, 0x6d, 0x12, 0xfd, 0x2b, 0xec, 0x7e, 0xd3, 0xc0, 0x4e, 0x67, 0x44, 0x5e, 0xa7, 0x88, 0x14, 0x89, 0x44, 0x0e, 0x10, 0x20, 0xf8, 0x01, 0xe2, 0xea, 0xb3, 0xea, 0xd7, 0x04, 0x79, 0x6d, 0x7c, 0xd9, 0x32, 0xc9, 0x6e, 0x0e, 0xb5, 0xa7, 0x16, 0x23, 0x01, 0xdd, 0xb5, 0x6e, 0x51, 0xd8, 0x46, 0x9c, 0x1e, 0x14, 0x1c, 0x48, 0xb6, 0x3b, 0xb7, 0xcd, 0x0f, 0x1c, 0x8a, 0x3a, 0x69, 0xec, 0xb5, 0xa3, 0x31, 0x30, 0x3f, 0x44, 0x45, 0xd1, 0x5b, 0x4f, 0x94, 0xba, 0x01, 0x3f, 0xcd, 0x1f, 0x24, 0x2e, 0xe8, 0x4e, 0x48, 0x59, 0xeb, 0x86, 0xb8, 0x52, 0x1a, 0xcf, 0x1b, 0x02, 0x84, 0x8f, 0x81, 0x52, 0x8c, 0xfc, 0xb7, 0xf0, 0x15, 0xe1, 0xab, 0xa8, 0xc4, 0xd5, 0x61, 0x3c, 0x29, 0xd1, 0x32, 0x40, 0x84, 0xd1, 0xc9, 0x48, 0x03, 0x09, 0x4d, 0x3e, 0xd0, 0x07, 0xaf, 0xc9, 0x90, 0xad, 0xd6, 0x77, 0x27, 0x29, 0x17, 0x51, 0x2d, 0x37, 0x5f, 0xed, 0xe1, 0xef, 0xb1, 0xa0, 0xd5, 0xd6, 0xb6, 0x78, 0x89, 0xb2, 0x98, 0xec, 0x28, 0x05, 0x9e, 0x2b, 0x18, 0xa5, 0x59, 0x00, 0x6d, 0x0c, 0x62, 0x06, 0x85, 0xe4, 0xa7, 0x6f, 0xf9, 0x38, 0x42, 0x59, 0x43, 0xc0, 0xe0, 0xaf, 0xe5, 0x66, 0x7d, 0x70, 0x3c, 0x36, 0x0b, 0x6e, 0x47, 0x8b, 0xcf, 0x19, 0x91, 0xa3, 0xff, 0xe4, 0x98, 0x75, 0x46, 0x45, 0x64, 0x59, 0x9c, 0x9e, 0xf6, 0xe2, 0x47, 0xb0, 0xeb, 0xb6, 0x87, 0x3f, 0xc2, 0xbd, 0xcc, 0x76, 0x49, 0x38, 0xc6, 0x60, 0xb1, 0xc6, 0x57, 0x61, 0x3c, 0xc2, 0xd9, 0x68, 0xde, 0x61, 0x57, 0x0b, 0x7d, 0x80, 0x93, 0xb2, 0xc4, 0xdb, 0x54, 0x2d, 0xa2, 0x9d, 0x30, 0x2e, 0x77, 0x52, 0x64, 0xa0, 0xa5, 0x40, 0x61, 0xa5, 0x17, 0xd0, 0x10, 0x4e, 0x34, 0x1b, 0x15, 0x3b, 0x82, 0xc7, 0xea, 0x9e, 0xf8, 0xdd, 0x6b, 0xc4, 0xa9, 0xc4, 0x69, 0x76, 0xa9, 0x8b, 0x9f, 0x52, 0x06, 0xa3, 0xc4, 0x6b, 0xd9, 0x2e, 0x4a, 0xd6, 0x65, 0xb9, 0x51, 0xde, 0x5c, 0x7b, 0xd1, 0x26, 0x97, 0x80, 0xe1, 0x03, 0xa6, 0x79, 0x30, 0x73, 0xe8, 0x36, 0x91, 0xbe, 0x6b, 0xe1, 0xef, 0x5a, 0xdc, 0x2a, 0x73, 0x03, 0x72, 0x6a, 0x39, 0x60, 0x2a, 0xe3, 0x7f, 0x2f, 0x67, 0x95, 0x19, 0x38, 0x94, 0x27, 0xc0, 0x77, 0xba, 0x9e, 0xe1, 0x98, 0xb4, 0x2f, 0xa9, 0xe2, 0x9c, 0xf3, 0xea, 0x80, 0x5e, 0x6b, 0xee, 0x81, 0x38, 0x80, 0x29, 0xa1, 0x28, 0x84, 0x5f, 0x8e, 0xbb, 0xbe, 0x63, 0xcf, 0x85, 0x7f, 0x9a, 0x22, 0xae, 0x89, 0xfe, 0x87, 0xf5, 0x4f, 0x03, 0x70, 0xc9, 0xeb, 0xf9, 0x90, 0x6e, 0x7c, 0x25, 0xf3, 0xd7, 0xc5, 0xbf, 0x2b, 0x13, 0x8a, 0xbe, 0xbc, 0x50, 0x38, 0xf5, 0x38, 0xd9, 0xf7, 0x3b, 0xa7, 0xb0, 0x57, 0x85, 0x0b, 0xd0, 0x3d, 0x05, 0xfc, 0xe3, 0xf5, 0x3f, 0xc4, 0x23, 0x8c, 0x26, 0x94, 0xe9, 0xf0, 0xb0, 0x84, 0x77, 0xb4, 0x88, 0xa1, 0x5d, 0xd0, 0xb9, 0xb2, 0x9c, 0xf5, 0x18, 0x13, 0x3a, 0x3a, 0x69, 0x90, 0x35, 0x4e, 0x4f, 0xcb, 0xc9, 0xab, 0xb3, 0x1a, 0x5d, 0x8a, 0xff, 0x84, 0xf5, 0x43, 0x45, 0xdd, 0x99, 0x79, 0x48, 0x32, 0x7a, 0x5b, 0xed, 0xc5, 0x9e, 0x8c, 0xef, 0xfd, 0x23, 0x6d, 0x92, 0xf9, 0xef, 0xa2, 0x86, 0xe2, 0x09, 0xdf, 0x06, 0x85, 0x9e, 0xbc, 0x83, 0x88, 0xb3, 0x24, 0x8f, 0xbf, 0x00, 0x84, 0x91, 0x90, 0xc9, 0xc8, 0xaf, 0x4b, 0xbe, 0xa0, 0xa3, 0xff, 0x66, 0xb1, 0x8a, 0x8a, 0x78, 0x37, 0x4e, 0x32, 0xa9, 0x61, 0x9a, 0xbd, 0x13, 0xf5, 0xbc, 0x39, 0x41, 0x8d, 0x4f, 0xfa, 0xe3, 0xdc, 0x76, 0x65, 0x26, 0xf1, 0x23, 0xdb, 0x71, 0xc6, 0x0b, 0x31, 0x4e, 0x05, 0x0c, 0xb4, 0x8d, 0x3c, 0x12, 0x37, 0x86, 0x59, 0x40, 0x1a, 0x40, 0x26, 0xcb, 0x04, 0x29, 0x23, 0x48, 0x76, 0xee, 0x6c, 0x00, 0x22, 0x9d, 0x8e, 0x70, 0x0e, 0x37, 0x9e, 0x78, 0x53, 0x76, 0x91, 0x10, 0x00, 0x23, 0xb0, 0x6c, 0x70, 0x78, 0x1b, 0xeb, 0x3e, 0x26, 0xb0, 0x0b, 0x8b, 0x3b, 0xa2, 0x9c, 0x72, 0x5e, 0xb9, 0x93, 0x17, 0x6b, 0x25, 0x06, 0xd0, 0x87, 0x52, 0x66, 0x0f, 0xe2, 0x28, 0xc9, 0xbb, 0x3a, 0x7f, 0xdb, 0x03, 0x53, 0x58, 0xb0, 0x59, 0x9a, 0xb7, 0x08, 0x57, 0x5a, 0xd9, 0xaa, 0xd9, 0xd5, 0x3b, 0xb1, 0xb2, 0xa7, 0x01, 0xae, 0x5b, 0xb5, 0xef, 0xb7, 0x2a, 0x83, 0x0e, 0x5c, 0x17, 0x70, 0x5f, 0xbf, 0xa5, 0x59, 0xbc, 0xa8, 0xee, 0x8a, 0x88, 0x47, 0x14, 0xfc, 0x59, 0x99, 0x85, 0x4e, 0x52, 0x14, 0x6b, 0x76, 0xd7, 0x23, 0xd2, 0xdf, 0x32, 0x97, 0x70, 0x89, 0x4e, 0xc0, 0xa8, 0x5d, 0x03, 0x64, 0xca, 0x89, 0x63, 0x9b, 0xc8, 0x57, 0x1f, 0xed, 0xf2, 0xbb, 0x87, 0x7c, 0xbf, 0x4c, 0xda, 0xf0, 0x71, 0x62, 0xda, 0x1e, 0xd9, 0x3d, 0x3c, 0xa2, 0xc6, 0xa7, 0x16, 0xdf, 0x6c, 0x8a, 0xd8, 0xbc, 0x7b, 0x8c, 0x23, 0x2e, 0xce, 0x42, 0x48, 0xe7, 0x91, 0xf9, 0x4a, 0xcf, 0xe6, 0xfd, 0xd3, 0xb1, 0x99, 0x86, 0xd9, 0xcc, 0x6f, 0x9d, 0x73, 0x5a, 0x8f, 0x63, 0x5d, 0x4d, 0x07, 0x65, 0x46, 0x7a, 0x1f, 0x60, 0x94, 0x89, 0x53, 0x49, 0x38, 0x1e, 0x3e, 0xf2, 0xeb, 0x55, 0x52, 0x90, 0xa8, 0x76, 0x75, 0x90, 0xd9, 0x16, 0x4a, 0x63, 0x90, 0xe3, 0x02, 0xcf, 0x0f, 0x94, 0xb4, 0xb4, 0xa2, 0x96, 0xb4, 0xc2, 0x6c, 0x8e, 0x87, 0x86, 0x8d, 0x1c, 0x18, 0xbd, 0xc4, 0x1a, 0xd9, 0x8a, 0x0d, 0x87, 0x72, 0xdb, 0x6d, 0xbe, 0x05, 0xb6, 0x79, 0xbe, 0x5d, 0x19, 0x4f, 0x1c, 0x34, 0x89, 0xa5, 0xe2, 0x37, 0x2d, 0x2c, 0xbd, 0x58, 0xf5, 0xb7, 0xb9, 0x8b, 0x2c, 0xf9, 0x0c, 0xa0, 0x4d, 0x10, 0x8d, 0xda, 0x7f, 0x0d, 0x87, 0xcb, 0x6d, 0x59, 0xe9, 0x22, 0xc4, 0x29, 0x8e, 0x4b, 0x40, 0xf1, 0x94, 0xc7, 0xca, 0x37, 0x3d, 0x3f, 0xc9, 0x15, 0xa5, 0x22, 0xaf, 0xec, 0xb9, 0x52, 0xd2, 0x0c, 0xb5, 0x41, 0x33, 0x4f, 0xa1, 0x5b, 0x75, 0x01, 0x40, 0x63, 0x74, 0x52, 0xff, 0x3e, 0x5c, 0x50, 0xab, 0x63, 0x78, 0xad, 0xf5, 0x7c, 0x1e, 0xb1, 0x89, 0x5f, 0xc3, 0xb6, 0x44, 0xc5, 0xd1, 0x1f, 0xb7, 0xa6, 0x32, 0x78, 0x63, 0xc0, 0x68, 0xbe, 0x38, 0x33, 0x6b, 0x81, 0x2f, 0xfa, 0x0e, 0x9f, 0x70, 0x80, 0x6b, 0x0d, 0x29, 0xf9, 0x91, 0x65, 0x36, 0x3f, 0x71, 0x1e, 0x1c, 0xd1, 0xf7, 0xe7, 0xef, 0x82, 0x64, 0x68, 0x1d, 0x8e, 0x9e, 0x04, 0x48, 0x3e, 0xff, 0xc3, 0xff, 0x60, 0x01, 0xda, 0x26, 0x81, 0x42, 0x32, 0x33, 0xf2, 0x66, 0xa5, 0xed, 0xf0, 0x7c, 0x24, 0x54, 0xc7, 0xa6, 0xde, 0x05, 0x3f, 0x89, 0x7c, 0xbc, 0x72, 0x57, 0x23, 0xb4, 0x1e, 0x9b, 0xb0, 0x64, 0x62, 0x4d, 0x59, 0x99, 0x0a, 0xef, 0x7d, 0x69, 0xff, 0x8b, 0xd0, 0x8f, 0xac, 0x38, 0x94, 0xcc, 0xda, 0x15, 0x39, 0x34, 0xd3, 0x0b, 0x91, 0x71, 0x16, 0xf5, 0xf0, 0xa7, 0xd6, 0xe3, 0x1b, 0x02, 0x9d, 0x68, 0x45, 0x70, 0x5c, 0x70, 0x76, 0xdd, 0x0b, 0x3b, 0xcf, 0xbe, 0x81, 0x36, 0x46, 0x5e, 0xd1, 0x23, 0x16, 0xa6, 0x44, 0x71, 0x9f, 0x37, 0x03, 0xa9, 0xf8, 0x44, 0x4c, 0xe9, 0x1c, 0xbd, 0x02, 0xad, 0x66, 0x4f, 0x5c, 0x86, 0xe1, 0xc4, 0xde, 0x4e, 0x8c, 0x23, 0x2b, 0x53, 0x1b, 0xf7, 0x67, 0x2c, 0xb9, 0x2c, 0x32, 0xad, 0x9c, 0x95, 0x97, 0xfa, 0x9e, 0x4d, 0x85, 0xac, 0x46, 0xe0, 0x72, 0x83, 0x56, 0x1d, 0x38, 0x5d, 0x75, 0x3f, 0xb5, 0xf6, 0x23, 0xb2, 0xba, 0x9e, 0xda, 0xe3, 0x3a, 0x3e, 0x02, 0x66, 0x52, 0xd4, 0x9d, 0x3b, 0x52, 0x98, 0x58, 0x89, 0x6f, 0x24, 0xe1, 0x67, 0xd7, 0x1c, 0xea, 0xca, 0xce, 0x9f, 0xe9, 0xa9, 0xca, 0xc6, 0x59, 0x7b, 0x9d, 0xe4, 0x19, 0xeb, 0x86, 0x6f, 0x8a, 0xa0, 0x8a, 0x7a, 0x74, 0x98, 0x71, 0x5d, 0x8b, 0x03, 0xb4, 0xce, 0x13, 0x08, 0x15, 0xa1, 0x38, 0xbb, 0x00, 0xb1, 0xb3, 0x52, 0x27, 0x0f, 0x8c, 0x24, 0x10, 0x9e, 0x18, 0xfd, 0x3e, 0xa7, 0xaa, 0x5d, 0x4f, 0xa4, 0x83, 0x5e, 0xbe, 0x63, 0x9f, 0xc4, 0xf2, 0x0a, 0x95, 0x46, 0xef, 0x84, 0x90, 0x5e, 0xd7, 0xbe, 0x5c, 0xad, 0xc2, 0x85, 0x03, 0xbc, 0xc5, 0xf4, 0x63, 0xb1, 0x9d, 0x4c, 0x9f, 0x2a, 0x6d, 0x4e, 0x1b, 0xf8, 0xf4, 0x24, 0x32, 0xf0, 0x4e, 0xe0, 0x3f, 0xca, 0x5c, 0xc0, 0xb8, 0x71, 0xc3, 0x1c, 0x7a, 0xec, 0xbf, 0x5b, 0xd0, 0xdc, 0xf4, 0x7d, 0x6d, 0x5e, 0x6c, 0xd0, 0x0e, 0xe0, 0x64, 0x22, 0x82, 0x84, 0xb4, 0xeb, 0xc8, 0x79, 0xdf, 0xcc, 0x0b, 0x60, 0x14, 0x9c, 0xa3, 0x7e, 0x9d, 0xb1, 0xb0, 0xf2, 0x1d, 0x7e, 0x3f, 0x28, 0xf3, 0x6a, 0x50, 0x67, 0x14, 0x56, 0xe1, 0x05, 0x89, 0x9b, 0xf2, 0x41, 0x75, 0xc9, 0x59, 0x03, 0xa1, 0xf0, 0x85, 0xa7, 0xca, 0x23, 0x09, 0xaf, 0x3a, 0xe5, 0x92, 0x14, 0xa7, 0xbe, 0x71, 0x7e, 0x99, 0x07, 0x91, 0xef, 0xdf, 0xab, 0x4a, 0x69, 0x97, 0xa5, 0x37, 0xfe, 0xe5, 0x12, 0xf7, 0x3f, 0x82, 0x2a, 0x9d, 0xd2, 0xa5, 0x27, 0xd3, 0xf5, 0xc1, 0x99, 0xc2, 0x78, 0x10, 0x14, 0x8d, 0x2f, 0xf0, 0x5c, 0x0f, 0x15, 0xc8, 0x0c, 0x8c, 0x93, 0x52, 0x1d, 0x3e, 0xb0, 0x2b, 0x35, 0xda, 0xac, 0x00, 0x80, 0x10, 0xb6, 0x56, 0xea, 0x1a, 0x43, 0xdd, 0x14, 0x0e, 0x75, 0x40, 0x96, 0x5f, 0x1d, 0xcb, 0xf6, 0x26, 0x3e, 0x88, 0x9e, 0xf8, 0x1a, 0x1e, 0x74, 0xed, 0x6b, 0xa7, 0xc8, 0x73, 0x83, 0xac, 0xe0, 0xe4, 0x38, 0x02, 0x7c, 0x4b, 0x67, 0x9a, 0xb3, 0xe1, 0xef, 0xc2, 0xb8, 0xc8, 0xc4, 0x19, 0xe0, 0xab, 0x73, 0x55, 0xd4, 0x99, 0x86, 0x22, 0x27, 0xd4, 0x7b, 0x05, 0x4b, 0x43, 0x2c, 0x43, 0x0b, 0xf2, 0x35, 0x37, 0x3c, 0x95, 0x63, 0xcd, 0x08, 0x24, 0x5f, 0x37, 0xce, 0xff, 0x99, 0xbe, 0x98, 0x0e, 0x0b, 0x87, 0x07, 0xe0, 0x70, 0x89, 0x0b, 0x82, 0x53, 0x57, 0x53, 0x62, 0xdb, 0xe7, 0x76, 0xc6, 0x41, 0x0f, 0x0c, 0x9b, 0x52, 0x37, 0xf8, 0x83, 0x40, 0x23, 0x26, 0x55, 0xf9, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x02, 0xe4, 0x61, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbd, 0x07, 0xec, 0x81, 0x00, 0x00, 0x20, 0x91, 0x48, 0x5e, 0xa3, 0x75, 0x85, 0xfa, 0xa0, 0x8b, 0x71, 0x17, 0xb1, 0x83, 0x8f, 0x09, 0x16, 0x15, 0x34, 0x04, 0xa6, 0x6c, 0x2d, 0x5f, 0x2d, 0x6a, 0x6d, 0xf4, 0x63, 0x28, 0x9c, 0xcb, 0x76, 0x85, 0xd6, 0xdc, 0x0b, 0x75, 0x65, 0xa1, 0xcd, 0xcc, 0x10, 0xa9, 0x4a, 0x81, 0xa9, 0x43, 0x0f, 0xf7, 0x7a, 0xb8, 0xa2, 0x25, 0x44, 0xc5, 0x56, 0xbc, 0x22, 0x0b, 0xa6, 0xaf, 0x45, 0xe2, 0xe4, 0x02, 0x61, 0x4d, 0x5d, 0x1e, 0x47, 0x9a, 0xdc, 0x29, 0xc6, 0x80, 0xf5, 0x79, 0x55, 0x74, 0xd0, 0x19, 0x75, 0xa7, 0x89, 0x9a, 0x7d, 0x11, 0x65, 0x0b, 0x7c, 0xcd, 0x41, 0xcc, 0x9e, 0x41, 0x0c, 0x5e, 0x69, 0xd2, 0x16, 0x95, 0x71, 0xfe, 0xa3, 0x05, 0x41, 0xac, 0xaa, 0x63, 0xa3, 0x25, 0x1e, 0x3a, 0xa8, 0xf8, 0x59, 0x62, 0x42, 0x98, 0x0c, 0x42, 0xdc, 0x12, 0xe6, 0xaf, 0xe3, 0x35, 0x58, 0xba, 0x37, 0x02, 0x6d, 0xd0, 0xff, 0xa8, 0xfd, 0x25, 0x31, 0x29, 0x6c, 0xa9, 0x81, 0xa4, 0x24, 0x9c, 0x65, 0x3e, 0x2e, 0x4f, 0xcb, 0x9f, 0x3e, 0x12, 0x13, 0xf6, 0x52, 0x79, 0x38, 0xbf, 0x74, 0xae, 0x13, 0x7f, 0xa1, 0x4b, 0x90, 0xd6, 0x9e, 0x3d, 0x0e, 0xa5, 0x66, 0xea, 0xa7, 0xe8, 0x72, 0xcb, 0xb5, 0x2f, 0x62, 0xc0, 0xa7, 0xb2, 0xe4, 0x83, 0xfd, 0x9d, 0xcc, 0xb7, 0x1d, 0x44, 0x65, 0x78, 0x44, 0x4d, 0x97, 0x83, 0x38, 0xcc, 0xc2, 0x62, 0x8e, 0x4b, 0x4f, 0x98, 0x12, 0x69, 0x53, 0x1e, 0x4d, 0x4c, 0x86, 0xf5, 0x4f, 0x1a, 0x2c, 0x8c, 0x70, 0x9f, 0x4e, 0x75, 0x8e, 0x46, 0x96, 0xcd, 0xe0, 0x90, 0xcc, 0x8e, 0xa4, 0x8a, 0x5a, 0x1f, 0xe3, 0x4b, 0x9e, 0xa0, 0xfc, 0xc8, 0xb8, 0xa3, 0x7e, 0xc8, 0x11, 0xde, 0x62, 0xa9, 0xfe, 0xe0, 0x01, 0x79, 0x92, 0x00, 0x87, 0xef, 0x51, 0xd2, 0x73, 0x50, 0xaa, 0xad, 0xd6, 0x82, 0x50, 0x83, 0xda, 0x93, 0x96, 0xc5, 0x51, 0x21, 0x7e, 0xe3, 0x9d, 0x86, 0x1c, 0xbb, 0xdb, 0xca, 0x6a, 0x38, 0x32, 0xf9, 0x55, 0x63, 0x97, 0x44, 0x4f, 0x2e, 0xf9, 0x07, 0x43, 0x9e, 0x88, 0x25, 0x6a, 0xa5, 0x1f, 0x75, 0xdc, 0x5b, 0xd0, 0xbf, 0x24, 0x6d, 0xd7, 0x02, 0x6c, 0x82, 0x8b, 0x5f, 0x3b, 0xfc, 0x0d, 0xf4, 0x3a, 0xa5, 0x94, 0x36, 0x07, 0xe2, 0x07, 0x9f, 0x7e, 0xed, 0xb7, 0xc7, 0x3c, 0x9c, 0xdc, 0xbb, 0xd6, 0xa7, 0x8b, 0x1c, 0x8f, 0x1f, 0x26, 0x3d, 0x40, 0x87, 0xfe, 0x2b, 0xa8, 0xf4, 0x1e, 0x84, 0x7c, 0x48, 0xd7, 0xb1, 0xdf, 0xdb, 0xda, 0x8c, 0xa5, 0xea, 0xca, 0xa1, 0xe5, 0xc6, 0x54, 0x57, 0x15, 0x3f, 0xc5, 0x7b, 0xea, 0xc4, 0x58, 0x44, 0x81, 0xa1, 0xdc, 0x8d, 0x98, 0x09, 0x1c, 0xb2, 0x4f, 0xdf, 0x0a, 0x14, 0xb5, 0xfd, 0x34, 0x56, 0x8f, 0x33, 0xd7, 0xbb, 0x28, 0xa1, 0x29, 0x81, 0x53, 0xcb, 0xb7, 0x67, 0xd9, 0x78, 0x3e, 0x46, 0xd6, 0x64, 0x0b, 0x0c, 0x84, 0xc4, 0xb5, 0x65, 0xf9, 0x9f, 0x0e, 0x45, 0x2a, 0x2d, 0xbd, 0x92, 0x63, 0x61, 0x8e, 0xab, 0xb9, 0x22, 0x7e, 0x89, 0x77, 0x1a, 0x47, 0x92, 0x87, 0x77, 0xaf, 0xf7, 0x39, 0x2c, 0x52, 0x55, 0xf8, 0xab, 0xa8, 0x29, 0x18, 0xc4, 0xd3, 0xad, 0x9a, 0x1d, 0x2f, 0x8f, 0x0e, 0xdc, 0x1a, 0x06, 0x39, 0xcf, 0xec, 0x1a, 0xca, 0xde, 0x77, 0x43, 0x04, 0xe2, 0x05, 0xac, 0x6a, 0xa0, 0x0c, 0x51, 0x6c, 0x33, 0x4f, 0xa1, 0xdc, 0x7d, 0x28, 0x08, 0x90, 0x2f, 0x7d, 0x7a, 0x46, 0x21, 0x77, 0x7c, 0xcf, 0x19, 0x0e, 0x9e, 0xbb, 0xbf, 0xe6, 0x3b, 0x7c, 0x05, 0xf1, 0x89, 0xb3, 0x93, 0x90, 0x44, 0xa5, 0xe0, 0x39, 0x73, 0x88, 0x16, 0x0f, 0x99, 0xaf, 0x3b, 0x31, 0x81, 0x05, 0x52, 0x09, 0x46, 0x9e, 0x95, 0xe9, 0xf0, 0x86, 0x78, 0xc9, 0x18, 0x54, 0x9d, 0xe8, 0xfc, 0x3d, 0x0f, 0x77, 0x06, 0xc1, 0x6b, 0xf6, 0x8d, 0x67, 0x77, 0x1d, 0xb3, 0xd3, 0x6e, 0x1f, 0x25, 0x9e, 0x27, 0x5f, 0x35, 0x70, 0x52, 0x24, 0xde, 0xed, 0x3c, 0x5a, 0x35, 0xf1, 0x63, 0xe9, 0xc7, 0x58, 0xdb, 0x5f, 0xcc, 0x46, 0x25, 0xe1, 0xb7, 0x89, 0xfe, 0x81, 0xf1, 0x19, 0x65, 0x0d, 0xc7, 0xcf, 0xf0, 0x79, 0x33, 0xcd, 0xbf, 0xd0, 0xdd, 0x2c, 0xdd, 0xdc, 0x7d, 0x68, 0x66, 0x91, 0x51, 0x26, 0x76, 0x6d, 0x8e, 0xe0, 0xe1, 0x3f, 0xdc, 0xc9, 0xc0, 0xe9, 0x75, 0x50, 0x74, 0x23, 0x28, 0xd9, 0x55, 0x16, 0x53, 0xd8, 0x6c, 0xfe, 0xc8, 0xaa, 0x27, 0x0f, 0xd6, 0x46, 0x33, 0xde, 0x0c, 0xa1, 0x49, 0x57, 0xb5, 0xe9, 0x04, 0xc9, 0xc1, 0xfc, 0x4b, 0x10, 0x5b, 0x41, 0x92, 0xa9, 0x66, 0xda, 0x9a, 0x45, 0xf3, 0x57, 0x47, 0x43, 0x32, 0x64, 0xe2, 0xe9, 0x19, 0x2d, 0x53, 0xff, 0xae, 0x3f, 0x69, 0xc3, 0x14, 0x83, 0xdd, 0x2a, 0xdc, 0xc2, 0xeb, 0x2c, 0x9e, 0x2c, 0x26, 0x2b, 0x0b, 0x70, 0x57, 0xe8, 0x47, 0x6a, 0x83, 0xce, 0xf3, 0x3d, 0xda, 0xbf, 0x8c, 0x1f, 0x87, 0x67, 0xfa, 0x38, 0xaf, 0x57, 0xa8, 0x3d, 0x24, 0x1d, 0xf7, 0xf1, 0x82, 0x93, 0x8f, 0x6a, 0xed, 0x97, 0x60, 0xef, 0x10, 0x61, 0x8a, 0x5d, 0x17, 0x58, 0x5e, 0x4d, 0x2d, 0x4a, 0x61, 0x48, 0xc1, 0x1d, 0x17, 0x3e, 0x8c, 0x97, 0x24, 0xb8, 0x8e, 0xfc, 0xba, 0x47, 0x96, 0x52, 0x18, 0xec, 0xf9, 0xec, 0xa9, 0x32, 0x26, 0xe2, 0xe9, 0xb8, 0x59, 0xc7, 0xf2, 0x8b, 0xc7, 0x11, 0xf7, 0x76, 0x64, 0x63, 0x5a, 0x2a, 0x55, 0xef, 0x3b, 0xf2, 0x78, 0x50, 0x44, 0x03, 0xfe, 0xa3, 0xcb, 0x5b, 0xac, 0x9a, 0x2c, 0xef, 0x5f, 0x73, 0x08, 0x4b, 0xac, 0x63, 0x2b, 0xe7, 0x2f, 0x9a, 0x4a, 0x6f, 0xab, 0x1f, 0x53, 0x70, 0xea, 0x58, 0xa3, 0x1f, 0xbe, 0xbb, 0x7e, 0x11, 0xf7, 0x46, 0x0e, 0xfe, 0xe7, 0x7e, 0xd1, 0xfe, 0x88, 0xa1, 0x6e, 0x8a, 0x3e, 0xff, 0x9d, 0xda, 0xf0, 0x57, 0xbb, 0x41, 0xbf, 0xdd, 0x79, 0x0d, 0x47, 0x98, 0x23, 0x11, 0xa3, 0xea, 0x6d, 0x6b, 0x32, 0x70, 0x5f, 0x1a, 0xf5, 0xfc, 0x03, 0x2f, 0xc1, 0x52, 0x2d, 0xab, 0xb4, 0xb4, 0xb9, 0x2f, 0x53, 0x99, 0x3c, 0x93, 0xbe, 0xa3, 0x69, 0x17, 0x91, 0x89, 0x1b, 0xa6, 0x25, 0x9f, 0x84, 0x3e, 0xb5, 0x32, 0x41, 0xaa, 0x2a, 0x7c, 0x09, 0xde, 0xc2, 0xd6, 0xf6, 0x06, 0x99, 0xf2, 0x4e, 0x49, 0x26, 0x0c, 0x75, 0x39, 0x4d, 0x10, 0x41, 0x86, 0x70, 0xc6, 0xa6, 0x92, 0xfc, 0xe1, 0x84, 0xd2, 0xcb, 0xe2, 0x9c, 0x82, 0x62, 0x3c, 0x24, 0xa4, 0x62, 0xc4, 0xbe, 0xfb, 0xc4, 0xdc, 0xde, 0xa3, 0x89, 0x53, 0x26, 0x25, 0xdf, 0x7e, 0x53, 0x6f, 0x57, 0xca, 0x62, 0x22, 0x18, 0xe6, 0xde, 0x87, 0x31, 0x3b, 0x6f, 0x2b, 0x2f, 0xb0, 0x95, 0xc6, 0xa9, 0x36, 0xcf, 0x51, 0x40, 0xd5, 0xe6, 0x9d, 0xeb, 0x9f, 0x5b, 0x9e, 0x82, 0x47, 0xb9, 0x17, 0xdf, 0x94, 0x1e, 0x0c, 0x85, 0x48, 0xd3, 0x00, 0x7d, 0x3a, 0xe0, 0x45, 0xd2, 0xe7, 0x96, 0x27, 0xb6, 0xc5, 0x88, 0x0b, 0x3b, 0x52, 0xcc, 0xa7, 0xbf, 0x0b, 0x20, 0xa5, 0x84, 0x12, 0x29, 0xc9, 0xd9, 0xec, 0xd1, 0xd4, 0x05, 0x4d, 0x38, 0x96, 0x3e, 0x9e, 0xaa, 0x53, 0x85, 0xe2, 0x5f, 0x1c, 0x43, 0xce, 0x88, 0xb1, 0x49, 0x6a, 0x64, 0xc4, 0x11, 0x91, 0x4a, 0x06, 0xac, 0x4c, 0xe7, 0x03, 0x5b, 0x44, 0xf3, 0xbd, 0x9c, 0x7a, 0x56, 0xb5, 0xef, 0x98, 0x18, 0xa9, 0xbf, 0xb9, 0xb9, 0x7d, 0x16, 0xb8, 0x21, 0xe5, 0x2d, 0xfc, 0xb0, 0x16, 0x69, 0x6c, 0x81, 0x59, 0xf0, 0xcd, 0xd3, 0x2b, 0x0c, 0x5a, 0x8b, 0x5b, 0xa7, 0x38, 0x21, 0x85, 0x96, 0xd3, 0x43, 0xdf, 0xb3, 0x81, 0xde, 0xa2, 0x4a, 0x23, 0xb3, 0x95, 0x46, 0x41, 0x9c, 0x24, 0x76, 0x27, 0xe6, 0xc2, 0x8e, 0x52, 0xe9, 0xe5, 0x86, 0x0a, 0x0d, 0x45, 0x2f, 0x70, 0x6e, 0x9d, 0xcb, 0x3a, 0x70, 0xaa, 0xf4, 0xd8, 0xbf, 0xe1, 0x94, 0x95, 0x60, 0x4f, 0x11, 0x04, 0x0f, 0x23, 0x31, 0x1a, 0x35, 0x20, 0xe1, 0x3d, 0x2b, 0xf2, 0x6f, 0xfd, 0x7e, 0x25, 0x88, 0xd7, 0xdf, 0x25, 0x3e, 0x3c, 0x90, 0x09, 0xd3, 0x9b, 0x08, 0xbe, 0x5e, 0x23, 0x9a, 0x8f, 0xdc, 0x0a, 0xda, 0x7f, 0x00, 0xa3, 0xb2, 0x80, 0x86, 0xc4, 0x2d, 0x01, 0xbd, 0x50, 0x13, 0x28, 0xe3, 0xae, 0x87, 0x19, 0x71, 0xcc, 0x31, 0xdd, 0x7a, 0x81, 0x40, 0x55, 0x66, 0x54, 0xa3, 0x9b, 0x30, 0x19, 0x69, 0x91, 0xa0, 0xd6, 0x4c, 0xaa, 0x60, 0xf3, 0x28, 0xce, 0x86, 0xc3, 0xee, 0xff, 0x52, 0xcf, 0x97, 0x2e, 0x41, 0x6f, 0x35, 0xfe, 0x2f, 0x6b, 0x56, 0x51, 0x15, 0x68, 0x53, 0xbc, 0xab, 0xb6, 0xd0, 0x88, 0x80, 0x57, 0x75, 0x4b, 0x87, 0x3e, 0x15, 0x73, 0xba, 0x3c, 0xa8, 0xc7, 0x5b, 0x7a, 0xec, 0x56, 0xf2, 0x56, 0x6d, 0x8d, 0x62, 0x86, 0xeb, 0x9e, 0x8f, 0x50, 0x85, 0xd2, 0x1c, 0xd7, 0xeb, 0x37, 0xeb, 0x96, 0xc1, 0x11, 0xbd, 0xcd, 0xf7, 0xf0, 0xbf, 0x9e, 0xba, 0xaf, 0x66, 0xe1, 0x64, 0x06, 0x4e, 0x6b, 0x48, 0x31, 0xd8, 0x06, 0x8b, 0x5c, 0x14, 0x33, 0x47, 0x78, 0xab, 0xd0, 0x56, 0x52, 0xd2, 0xf1, 0x0f, 0xc0, 0x12, 0xd2, 0x07, 0x8f, 0xe7, 0xe9, 0x85, 0x6f, 0x17, 0x6d, 0xa5, 0x7e, 0xdf, 0xff, 0xd1, 0xb8, 0x12, 0x74, 0x0d, 0xf6, 0xd2, 0xcb, 0xc3, 0xae, 0x8c, 0x3a, 0x5e, 0xcf, 0x46, 0x6f, 0xb3, 0xc1, 0xfb, 0x87, 0xcd, 0x8c, 0x93, 0xf3, 0x10, 0x90, 0x2a, 0xea, 0x9d, 0x92, 0x38, 0x75, 0x07, 0x91, 0x7b, 0x5b, 0x5d, 0x64, 0x32, 0x63, 0x28, 0x58, 0xbf, 0x5c, 0xb4, 0x53, 0x6c, 0x1a, 0xcc, 0x95, 0xbb, 0x54, 0xb0, 0x81, 0x0a, 0xb8, 0x65, 0xf2, 0x71, 0x66, 0xa7, 0x84, 0x71, 0x20, 0x5b, 0x6c, 0x0e, 0x1b, 0xeb, 0x4d, 0xe0, 0xbd, 0x72, 0xa8, 0x9a, 0x6f, 0x6a, 0x44, 0x6d, 0xcc, 0x13, 0xdf, 0x5b, 0x76, 0xd8, 0x54, 0x0d, 0xee, 0xc9, 0xdd, 0x48, 0x1f, 0x80, 0xb2, 0x22, 0x20, 0xb7, 0xc4, 0x3a, 0x91, 0x34, 0x06, 0x97, 0xc2, 0xbb, 0xe8, 0x5f, 0x30, 0x4e, 0x3a, 0x2a, 0xb7, 0x26, 0xe8, 0x7e, 0xb9, 0xfc, 0x84, 0x04, 0x6e, 0xab, 0x93, 0x92, 0xd6, 0x18, 0xfc, 0x51, 0x52, 0x8d, 0x84, 0x45, 0x71, 0x0a, 0x6f, 0x38, 0x37, 0x40, 0x94, 0xc9, 0xbc, 0xa3, 0x87, 0x50, 0xaa, 0x3b, 0x76, 0xab, 0xb4, 0xc3, 0xa4, 0xf4, 0xa6, 0x07, 0xfe, 0x15, 0xac, 0x81, 0x31, 0x4b, 0xfa, 0xcb, 0x5e, 0xa1, 0xb3, 0x3a, 0x77, 0xc9, 0x85, 0xd8, 0xa7, 0x34, 0xf5, 0xf1, 0x06, 0x99, 0x20, 0x05, 0x50, 0xeb, 0x6d, 0x67, 0x2c, 0x51, 0xb8, 0x21, 0xe3, 0x79, 0x40, 0x18, 0x83, 0xbf, 0xa5, 0xe2, 0x9e, 0xb2, 0x9e, 0xc6, 0x58, 0x8d, 0xb6, 0x4b, 0xa8, 0xa6, 0x86, 0x16, 0xcb, 0x8f, 0x67, 0x00, 0xa5, 0x5c, 0x45, 0xdd, 0x46, 0x7b, 0xb3, 0x34, 0xd7, 0x55, 0x63, 0xfc, 0x2a, 0x3f, 0x6d, 0x24, 0xda, 0xd0, 0xf1, 0x5c, 0xe5, 0xbc, 0x80, 0xce, 0x09, 0x4d, 0xcf, 0x96, 0x6e, 0xfb, 0xb1, 0x69, 0xcd, 0xbb, 0x8e, 0x12, 0xfc, 0xb0, 0xe7, 0x39, 0xaf, 0xe8, 0x04, 0xea, 0x2a, 0xbd, 0x11, 0x2e, 0x14, 0xa8, 0x6b, 0x87, 0x4a, 0xe8, 0xda, 0xd2, 0xd2, 0xc1, 0x3b, 0x35, 0x9b, 0x25, 0xb2, 0x18, 0x23, 0xd4, 0xb6, 0xb6, 0x33, 0x53, 0x34, 0xbc, 0xb6, 0x3f, 0x25, 0xc5, 0x68, 0x1f, 0xe7, 0xcb, 0x1e, 0x1e, 0xeb, 0x33, 0x80, 0x7f, 0xa2, 0x29, 0x3e, 0xa7, 0xb6, 0xfb, 0x02, 0xfe, 0x71, 0xbc, 0x9a, 0x4d, 0x22, 0x9c, 0x7e, 0x4f, 0x7d, 0xe3, 0x9e, 0x5e, 0x19, 0x20, 0xf1, 0x59, 0x71, 0xd8, 0x23, 0x58, 0xbb, 0xd1, 0x04, 0x9e, 0xdf, 0x0d, 0x4b, 0x72, 0x94, 0x7c, 0xb4, 0x41, 0xbe, 0x64, 0x2d, 0x88, 0x5d, 0x2e, 0x29, 0x08, 0x96, 0xcf, 0xb8, 0xa9, 0x38, 0x2d, 0x84, 0x7f, 0xec, 0xa8, 0xf3, 0x54, 0x4d, 0x36, 0xc8, 0x3a, 0x3c, 0x3a, 0x3d, 0xdb, 0x60, 0xf7, 0x2e, 0x08, 0x19, 0xd4, 0x6a, 0xe8, 0x12, 0xb5, 0x75, 0x2b, 0xd1, 0xaa, 0xc5, 0xea, 0xd8, 0x75, 0x2e, 0xe0, 0x61, 0x25, 0xc9, 0x86, 0x92, 0x07, 0x6f, 0x7d, 0x4f, 0xd4, 0xda, 0x0c, 0x47, 0xa0, 0xbf, 0xb4, 0x08, 0x97, 0xe5, 0xb1, 0x4c, 0x3a, 0xac, 0xd3, 0xc4, 0xec, 0x5c, 0x2a, 0x6e, 0x3d, 0xb3, 0xf8, 0xf0, 0x7b, 0xdf, 0x02, 0xfa, 0xd9, 0x03, 0x10, 0x96, 0x52, 0x3b, 0xa7, 0x96, 0x51, 0x52, 0x87, 0xb1, 0x28, 0xf8, 0xd6, 0x74, 0x62, 0xa4, 0xfc, 0xa4, 0xd0, 0x5a, 0xbe, 0x9e, 0x9d, 0x72, 0x10, 0x92, 0xac, 0x85, 0x34, 0xfd, 0xcc, 0x1d, 0x1a, 0x37, 0xc7, 0xb0, 0x1e, 0xc2, 0xcc, 0x81, 0x85, 0x7b, 0x21, 0x97, 0xa1, 0x7e, 0x9a, 0xe4, 0x6d, 0x62, 0x93, 0x26, 0xcd, 0x19, 0xfc, 0x81, 0x36, 0xe9, 0x8f, 0x7a, 0x36, 0xd9, 0x22, 0x6e, 0x35, 0x1a, 0xae, 0x5f, 0xfb, 0x9d, 0xf1, 0xf3, 0x19, 0x40, 0x40, 0x4f, 0xab, 0xb7, 0xe2, 0xe7, 0x6e, 0x23, 0xe6, 0x11, 0xa1, 0x87, 0x13, 0x1d, 0x9b, 0xc0, 0x21, 0x9c, 0x7c, 0x6a, 0xfb, 0x5b, 0xc0, 0x53, 0x07, 0x09, 0xd0, 0x57, 0xa6, 0x82, 0xe8, 0x64, 0x61, 0x4b, 0x7c, 0x01, 0xa7, 0x58, 0xfe, 0xd8, 0x7a, 0x0d, 0x05, 0xf1, 0xda, 0xc3, 0x40, 0xf7, 0x3a, 0xd5, 0x8e, 0xba, 0xae, 0xe2, 0x5c, 0xf6, 0x4b, 0x13, 0x09, 0xba, 0x99, 0xb4, 0x97, 0x4d, 0x69, 0xd2, 0x8b, 0x94, 0x5d, 0x2d, 0x15, 0x60, 0xad, 0xb0, 0x4e, 0xfc, 0x07, 0xef, 0x0d, 0xb5, 0x4a, 0x84, 0x59, 0x2d, 0xb9, 0x53, 0x9e, 0x3c, 0x89, 0xbb, 0x24, 0x77, 0x88, 0x63, 0x88, 0xa4, 0x2f, 0x11, 0x5d, 0x7c, 0xd4, 0xd0, 0xf5, 0x89, 0x39, 0xc1, 0x95, 0xde, 0x39, 0x40, 0x53, 0xd6, 0xff, 0x46, 0x17, 0x83, 0x27, 0x94, 0x33, 0xb6, 0xb9, 0x0c, 0xe8, 0x28, 0xb0, 0xc9, 0xc7, 0x96, 0x3e, 0xdd, 0xb9, 0x64, 0x9d, 0xee, 0x99, 0x59, 0x88, 0x59, 0xfe, 0x99, 0x3e, 0xaa, 0xd8, 0xaf, 0x62, 0x6e, 0xb9, 0xc9, 0xb1, 0x86, 0x5a, 0xba, 0xa7, 0x9a, 0xbf, 0xf7, 0x58, 0xff, 0xb1, 0xe2, 0x6d, 0x31, 0x7f, 0x3a, 0xde, 0x51, 0x95, 0x4e, 0x60, 0x9b, 0x53, 0x29, 0x83, 0xd3, 0x8e, 0xf2, 0x47, 0x6f, 0x86, 0x99, 0x89, 0xfb, 0x7d, 0x3b, 0x6d, 0x85, 0xe0, 0xb0, 0x32, 0x0b, 0x26, 0xcb, 0x5f, 0xb8, 0xc7, 0x2d, 0x57, 0xe1, 0xe2, 0x44, 0x81, 0x0a, 0x0b, 0xd4, 0x21, 0x0b, 0x4d, 0x68, 0xfe, 0x31, 0x21, 0x25, 0x8e, 0xfc, 0x38, 0xe2, 0x69, 0x32, 0x67, 0xff, 0x43, 0xbd, 0xc3, 0x7e, 0x3c, 0x0d, 0x7f, 0x6a, 0x70, 0x31, 0x9b, 0x41, 0x45, 0xa9, 0x53, 0x1a, 0x62, 0xa2, 0xaf, 0x03, 0x45, 0xe2, 0xf4, 0x13, 0x04, 0x47, 0xf9, 0x52, 0x05, 0xf5, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x02, 0xe4, 0x61, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbd, 0x07, 0xec, 0x81, 0x00, 0x00, 0x20, 0xa4, 0x0f, 0x2b, 0x24, 0x82, 0x3a, 0x10, 0xf0, 0xcc, 0x73, 0x05, 0x2a, 0x3a, 0x68, 0xdc, 0xd3, 0x1b, 0x96, 0x77, 0x74, 0x51, 0x86, 0x4d, 0xd8, 0x66, 0x59, 0xd5, 0xa6, 0x31, 0x22, 0x48, 0x96, 0x55, 0x98, 0xd0, 0xb6, 0x5b, 0x1a, 0xbd, 0xe4, 0x97, 0x27, 0x3a, 0xc8, 0x39, 0x64, 0x7b, 0x1e, 0x6e, 0x84, 0x92, 0x38, 0xff, 0xb6, 0xcf, 0xc8, 0x4f, 0x4c, 0x47, 0xd3, 0xea, 0x8b, 0xa4, 0xcd, 0xa4, 0x17, 0x8c, 0x14, 0x2e, 0xb2, 0xec, 0x18, 0x3f, 0xa6, 0x6c, 0x8c, 0xae, 0x93, 0x1a, 0x26, 0xd6, 0x5f, 0x7e, 0x1d, 0x88, 0x40, 0x81, 0x85, 0xf9, 0x14, 0x70, 0xf3, 0xbf, 0xd6, 0x4a, 0xdd, 0x90, 0x51, 0x88, 0x0e, 0x90, 0x89, 0x9c, 0x95, 0xec, 0x3c, 0xa1, 0xeb, 0xb6, 0x52, 0x30, 0x3c, 0xd1, 0x0f, 0xb8, 0xf3, 0xbf, 0x42, 0x87, 0x98, 0x0b, 0xad, 0xdf, 0xe7, 0x07, 0x6c, 0x05, 0xf5, 0xd8, 0xb8, 0xce, 0x4e, 0xdc, 0xa9, 0xb2, 0x7d, 0xeb, 0xc1, 0x1d, 0xae, 0x82, 0xbe, 0x15, 0x4a, 0x72, 0xb6, 0x15, 0x0f, 0x75, 0x93, 0xb7, 0x59, 0x4e, 0x22, 0x9e, 0x62, 0xab, 0x81, 0xc7, 0xb0, 0xa9, 0xb7, 0xbb, 0x8c, 0x45, 0x3d, 0x04, 0xcc, 0x1f, 0x15, 0x1a, 0xef, 0x5b, 0x89, 0x77, 0x87, 0xfb, 0x61, 0x91, 0x5d, 0x96, 0x2a, 0x28, 0x39, 0xd4, 0xa2, 0xfc, 0xfa, 0x5b, 0x74, 0x93, 0x30, 0x6c, 0x74, 0x50, 0x2b, 0x26, 0x25, 0xd2, 0xdb, 0xf2, 0xa8, 0xcf, 0xa1, 0x67, 0xe8, 0x63, 0x0e, 0xd8, 0x56, 0xbc, 0x2b, 0xa7, 0x7e, 0x78, 0xa8, 0xaf, 0xe0, 0xf2, 0x04, 0xed, 0xe2, 0xdd, 0xfb, 0xf2, 0x8a, 0x04, 0xf9, 0xdf, 0xba, 0x0e, 0x42, 0x2b, 0xaf, 0xeb, 0xca, 0x17, 0x36, 0x67, 0x5b, 0xf3, 0x93, 0x23, 0x64, 0xeb, 0x9e, 0xd0, 0x3e, 0x51, 0x5d, 0xb7, 0x18, 0x4e, 0x09, 0x2a, 0x91, 0x80, 0xca, 0x73, 0x3b, 0x3f, 0xd6, 0x8e, 0x40, 0xa1, 0x74, 0xd0, 0x03, 0xed, 0xdd, 0x99, 0xe3, 0x87, 0x30, 0x54, 0x65, 0xe8, 0x8b, 0x32, 0x1e, 0xff, 0xa2, 0x1e, 0x25, 0xe7, 0x96, 0xfc, 0xe1, 0xb4, 0x1c, 0xfc, 0x0d, 0x41, 0x48, 0xda, 0x8a, 0x5a, 0x4a, 0x43, 0x50, 0xe6, 0x8b, 0xfb, 0x41, 0xcc, 0xa5, 0xbc, 0x38, 0xc1, 0xc0, 0x8e, 0x11, 0x8d, 0x5f, 0xd9, 0x60, 0x8f, 0x7c, 0xb8, 0x86, 0x51, 0xdc, 0x07, 0x0a, 0xfc, 0x06, 0x48, 0xb4, 0x4b, 0xe2, 0x25, 0x1f, 0x89, 0xd0, 0xcd, 0xcf, 0x92, 0x60, 0xf9, 0x63, 0x31, 0xb1, 0x2b, 0x7c, 0x86, 0x7a, 0xb0, 0x7d, 0x4d, 0x4d, 0x9a, 0xb6, 0x67, 0xa5, 0x48, 0x02, 0x04, 0x53, 0x13, 0x4d, 0x44, 0x86, 0x0d, 0x3d, 0xc0, 0x8b, 0x86, 0x36, 0xfd, 0x50, 0x98, 0x42, 0x18, 0x2f, 0xe3, 0x48, 0x01, 0xed, 0xd8, 0xbf, 0x68, 0x42, 0xde, 0x08, 0xe2, 0xe0, 0xb0, 0x9d, 0x81, 0x05, 0x4b, 0x5b, 0x4d, 0xcc, 0xa4, 0x14, 0xf8, 0x09, 0x73, 0x62, 0xaa, 0x83, 0x27, 0x49, 0x67, 0x75, 0x61, 0xae, 0x6a, 0xa3, 0xf6, 0xa1, 0x87, 0x45, 0x9f, 0x29, 0x99, 0xa5, 0xba, 0x4c, 0x07, 0x5d, 0xb1, 0x42, 0x49, 0x68, 0x94, 0xb8, 0xf9, 0xa0, 0x3c, 0x89, 0xc7, 0x09, 0xa5, 0x0e, 0x62, 0xa6, 0x33, 0xd0, 0x79, 0xf3, 0xd4, 0xc2, 0x72, 0xcb, 0x6b, 0x97, 0xa8, 0x83, 0x92, 0xa1, 0x43, 0xc2, 0x26, 0x50, 0x48, 0xd0, 0x2f, 0x63, 0x5f, 0xff, 0x46, 0xac, 0x7b, 0xe0, 0xe6, 0x4d, 0x8a, 0x2f, 0xb6, 0xf0, 0xfc, 0x58, 0x06, 0xde, 0x5e, 0x42, 0xef, 0x15, 0x74, 0x8b, 0xc4, 0x9e, 0x32, 0x97, 0x19, 0x15, 0x9f, 0x7d, 0x3f, 0xe9, 0xe7, 0x0d, 0x47, 0xd3, 0x6b, 0xad, 0xaf, 0x58, 0x02, 0x5a, 0xd0, 0xb5, 0xa9, 0x94, 0xd8, 0xd4, 0xae, 0xb1, 0xab, 0x93, 0x0f, 0x1b, 0xb4, 0xcb, 0xf7, 0x13, 0x2e, 0x25, 0x80, 0x61, 0x32, 0x47, 0x7c, 0x5a, 0xfa, 0x08, 0x9b, 0x65, 0x42, 0xaf, 0xec, 0x65, 0xaf, 0x7d, 0xb3, 0x87, 0x04, 0xc2, 0x35, 0xb0, 0x23, 0xa4, 0x54, 0xfc, 0xb6, 0x9f, 0x9b, 0xa8, 0xfb, 0x21, 0x6f, 0x51, 0x57, 0x00, 0xb8, 0x9a, 0x48, 0x53, 0x18, 0x69, 0xc1, 0xdc, 0x12, 0x4b, 0xb5, 0x87, 0x3a, 0x5f, 0x48, 0x8f, 0x43, 0xfd, 0x67, 0x51, 0x24, 0x8b, 0xd9, 0xf5, 0xc8, 0xfd, 0xa2, 0x99, 0xac, 0xbd, 0x46, 0x5d, 0x8e, 0xa7, 0xe4, 0x40, 0x2b, 0x27, 0x77, 0x63, 0x3a, 0xbe, 0x03, 0xaf, 0x73, 0x3e, 0xdc, 0xae, 0x6f, 0xea, 0xf0, 0xe2, 0xa0, 0xc5, 0x81, 0xd5, 0x77, 0x72, 0x19, 0x2b, 0x3c, 0x1c, 0xc1, 0xd3, 0xf4, 0xda, 0xf1, 0x6b, 0xbc, 0x3a, 0xd9, 0x0b, 0x8f, 0x28, 0xaa, 0x50, 0x49, 0x0b, 0xda, 0x3f, 0x53, 0x40, 0xf3, 0x73, 0x4e, 0x41, 0x98, 0x96, 0x67, 0x0a, 0xc4, 0x98, 0xd6, 0x1d, 0xae, 0x57, 0xbe, 0x82, 0x77, 0x87, 0x5d, 0xb5, 0xfe, 0x90, 0xe0, 0xd6, 0x85, 0x34, 0x6d, 0x78, 0xf0, 0x7e, 0xba, 0xed, 0x2b, 0xf2, 0xb7, 0xe4, 0x00, 0xee, 0x6e, 0xd2, 0x57, 0x6b, 0xbc, 0xcd, 0x31, 0x20, 0xbd, 0xbe, 0x8f, 0xc4, 0x8a, 0x34, 0x8b, 0x50, 0xfe, 0x7d, 0x3a, 0x57, 0xf1, 0x75, 0x69, 0xa6, 0xdd, 0xf3, 0xae, 0x77, 0x14, 0x98, 0x25, 0x9b, 0xe0, 0x11, 0x68, 0x66, 0xa7, 0xbf, 0xc7, 0x0e, 0xb3, 0x75, 0xd5, 0x2b, 0x44, 0x27, 0xd6, 0x9c, 0x7f, 0x32, 0x9c, 0x54, 0x3e, 0x1c, 0x6b, 0xa6, 0x20, 0x9d, 0xd8, 0xbf, 0x4b, 0xf1, 0x30, 0x48, 0x8b, 0x0a, 0x6d, 0x92, 0x21, 0x5c, 0xd3, 0x21, 0x0a, 0x25, 0x54, 0x3b, 0xa0, 0x15, 0xc8, 0x73, 0xf5, 0x38, 0xce, 0xff, 0x96, 0xf9, 0xbb, 0xbb, 0x3e, 0x9b, 0xba, 0x08, 0x24, 0xcd, 0x14, 0x77, 0x2e, 0xc6, 0x3e, 0x2d, 0x30, 0x19, 0x2c, 0xd5, 0x6a, 0x1e, 0x6d, 0x16, 0x78, 0xa8, 0x9b, 0xca, 0x44, 0x51, 0x74, 0x3b, 0x0e, 0x76, 0x07, 0xf1, 0x81, 0x8f, 0x43, 0x44, 0xf1, 0xf5, 0xab, 0x6e, 0x0a, 0x9b, 0xbb, 0xf7, 0xf6, 0xfb, 0xba, 0x2a, 0x9e, 0xc3, 0xa4, 0xc6, 0x9b, 0x78, 0x6c, 0x01, 0x37, 0x9b, 0x45, 0x2d, 0xee, 0x70, 0x32, 0xd8, 0x29, 0x98, 0xcb, 0x92, 0x42, 0x12, 0x2d, 0x31, 0x1d, 0xd5, 0x39, 0xa3, 0xac, 0x1e, 0x79, 0xb6, 0x54, 0x15, 0x97, 0x8b, 0xa2, 0x82, 0x12, 0xbc, 0xc6, 0x0c, 0x94, 0xcd, 0xcc, 0xe4, 0xb6, 0xda, 0x8d, 0x69, 0xe1, 0xa7, 0x65, 0x66, 0xad, 0x8d, 0xf1, 0x85, 0x6e, 0x1b, 0xd5, 0x9c, 0xf6, 0x45, 0x37, 0xd2, 0x8a, 0xc4, 0x3a, 0x80, 0x23, 0x3d, 0xa7, 0xa5, 0xa5, 0x92, 0x6a, 0xf7, 0x30, 0x06, 0x5f, 0xad, 0x19, 0x0f, 0x64, 0x2c, 0x37, 0xa5, 0xc1, 0xfb, 0xaa, 0x80, 0x6b, 0x71, 0xd8, 0x87, 0xb7, 0x11, 0x03, 0x66, 0x0b, 0x8c, 0xff, 0xc2, 0x16, 0x41, 0xe2, 0x5c, 0x6d, 0xdc, 0x0d, 0x51, 0x09, 0x9f, 0xae, 0xf7, 0x2a, 0xa8, 0x07, 0x91, 0xe4, 0x59, 0x9b, 0x32, 0xd8, 0x68, 0x50, 0x32, 0x99, 0x9f, 0x77, 0xe6, 0x91, 0xd5, 0x80, 0x33, 0xe7, 0xd8, 0x6d, 0xa9, 0xc9, 0xf2, 0xed, 0x7f, 0xd8, 0x15, 0x57, 0xd7, 0x5b, 0x4e, 0xa0, 0x9f, 0xee, 0x81, 0x8a, 0x3d, 0x6e, 0x51, 0x99, 0x3a, 0xdf, 0x33, 0xe3, 0x2b, 0xa2, 0x45, 0xd3, 0xb1, 0x4b, 0x77, 0x69, 0xcb, 0xee, 0x4a, 0xa8, 0x9d, 0x96, 0x8b, 0x97, 0x66, 0xd5, 0xd3, 0x11, 0xad, 0x7a, 0xd5, 0x3a, 0x45, 0x7b, 0x97, 0x00, 0x6f, 0x0f, 0x5b, 0x42, 0x78, 0x0d, 0xd8, 0xa6, 0xb1, 0xc7, 0xc1, 0xc0, 0x94, 0xe5, 0x2b, 0xcb, 0xc8, 0xea, 0x88, 0xa7, 0x9b, 0xf8, 0x6a, 0x6d, 0xfd, 0xf6, 0xf1, 0x05, 0x75, 0x59, 0xd1, 0xdf, 0xd5, 0xfc, 0xa2, 0x40, 0x48, 0x56, 0xba, 0x80, 0xc0, 0xac, 0x11, 0x32, 0x23, 0x4f, 0x36, 0xda, 0x8d, 0x14, 0x65, 0xdd, 0xda, 0x73, 0xcc, 0x04, 0x02, 0x8d, 0xc4, 0x66, 0xf1, 0x0b, 0x91, 0x65, 0xc7, 0xda, 0x5a, 0x42, 0x8a, 0x00, 0xbc, 0xf0, 0x96, 0x7a, 0xd8, 0x05, 0xd3, 0xe7, 0xa1, 0x16, 0xba, 0xbd, 0x2b, 0x38, 0x3d, 0x62, 0x76, 0xbf, 0x6e, 0x82, 0xdb, 0x56, 0xeb, 0x5c, 0x01, 0xd9, 0x58, 0x0d, 0x7e, 0x91, 0x33, 0xdd, 0x4c, 0x0c, 0x50, 0xcc, 0xdf, 0x7f, 0x11, 0x3a, 0x9a, 0x62, 0x21, 0xdb, 0x94, 0xe1, 0xdc, 0xbb, 0x86, 0x3f, 0x6d, 0x34, 0x42, 0x4b, 0xbb, 0x22, 0x4e, 0x1b, 0x7b, 0x6c, 0x75, 0x6f, 0x8c, 0xc0, 0xcf, 0x48, 0xe5, 0xc0, 0x53, 0xd5, 0x77, 0x2e, 0x58, 0x94, 0x36, 0x2c, 0xf0, 0xc8, 0x08, 0x55, 0xb2, 0xae, 0xec, 0x06, 0x8b, 0x1b, 0xa0, 0x51, 0x6f, 0x6b, 0xfa, 0x6f, 0xa0, 0x0a, 0xc5, 0x51, 0xf7, 0xe3, 0x21, 0x6d, 0x2b, 0x8c, 0x9d, 0x94, 0xe4, 0x9a, 0x26, 0xe5, 0x55, 0xdb, 0x35, 0xcf, 0x09, 0x8e, 0x2f, 0x59, 0x50, 0xa9, 0xd7, 0x4d, 0x92, 0xcf, 0x63, 0xfb, 0xc7, 0xe1, 0x41, 0xab, 0x1b, 0x77, 0xfe, 0xdc, 0xaf, 0x2e, 0x2a, 0x90, 0x50, 0x59, 0x73, 0x5b, 0x82, 0x34, 0x6a, 0xcd, 0xcf, 0x3c, 0x67, 0x3f, 0x1e, 0x8c, 0x02, 0xa0, 0x6b, 0xf2, 0xdb, 0x9e, 0xa3, 0xd0, 0xdd, 0xc2, 0x8b, 0x09, 0xf2, 0xb1, 0x17, 0x1c, 0x74, 0x38, 0x1e, 0xc1, 0xcf, 0x36, 0x25, 0x3d, 0x6f, 0x9c, 0x49, 0x79, 0x17, 0x73, 0xb6, 0x6f, 0x81, 0xf6, 0x65, 0xd7, 0xfa, 0xcd, 0x8a, 0x6f, 0x30, 0x42, 0x95, 0xf7, 0xa9, 0xa4, 0xeb, 0x4b, 0xae, 0x22, 0xab, 0x8b, 0x80, 0x38, 0x93, 0x5a, 0x63, 0x44, 0x61, 0x78, 0x54, 0xc6, 0x23, 0xe3, 0x47, 0xe6, 0x63, 0x23, 0x82, 0xb2, 0x53, 0x4b, 0x1b, 0xe2, 0x8f, 0xfe, 0x81, 0x21, 0xb4, 0xfd, 0x12, 0xb9, 0x4a, 0x84, 0x1c, 0xf8, 0x8a, 0xdd, 0x3c, 0xef, 0xef, 0x07, 0x35, 0x80, 0x90, 0x78, 0x03, 0x75, 0x46, 0xfb, 0x09, 0xf4, 0x18, 0x34, 0x70, 0x1c, 0xd8, 0xd7, 0x15, 0x30, 0xaa, 0x6e, 0x66, 0x1c, 0x2b, 0x62, 0x63, 0xd1, 0x28, 0x34, 0x37, 0x93, 0xb9, 0x83, 0x9f, 0x11, 0xae, 0xc5, 0x77, 0xdf, 0xf3, 0xdf, 0x2e, 0x22, 0x24, 0xf4, 0xe7, 0x3e, 0xb6, 0x14, 0x67, 0xc6, 0x4e, 0xae, 0x88, 0x19, 0xcb, 0x3a, 0x64, 0x34, 0xc8, 0xa2, 0xf6, 0xcb, 0x35, 0xc7, 0x93, 0x65, 0x65, 0xd7, 0xd9, 0x98, 0xa6, 0x93, 0xb1, 0xb7, 0xd3, 0xe0, 0xa9, 0x55, 0x02, 0x3f, 0xf9, 0x47, 0x01, 0x09, 0xa0, 0x92, 0xf0, 0x91, 0x98, 0xd4, 0x9b, 0xc8, 0xf1, 0x47, 0xf8, 0x19, 0x6b, 0x4c, 0xa0, 0x23, 0x67, 0xeb, 0xb5, 0xfa, 0x3b, 0xb1, 0x2b, 0xe0, 0xfb, 0x74, 0x7e, 0x3b, 0x58, 0x1a, 0xcf, 0x49, 0x24, 0xb0, 0x52, 0x44, 0x78, 0x8e, 0x06, 0xbf, 0x06, 0x4e, 0x3b, 0x24, 0x9f, 0x4c, 0x5a, 0x68, 0xd4, 0xef, 0x53, 0x4a, 0x4a, 0x85, 0x61, 0x7e, 0x45, 0x2d, 0x3f, 0x69, 0x2f, 0x6b, 0xa3, 0x2f, 0x24, 0x99, 0x9d, 0x45, 0x27, 0x71, 0xce, 0xd3, 0x2d, 0x9c, 0xa6, 0x7f, 0xd7, 0x74, 0x7a, 0x16, 0xd8, 0x07, 0x05, 0x94, 0x93, 0x4c, 0xc5, 0xb9, 0xe8, 0x45, 0xd4, 0x53, 0x65, 0x8b, 0xce, 0x08, 0x98, 0x45, 0xd9, 0x16, 0x0c, 0x45, 0xeb, 0x7a, 0xb3, 0x69, 0x70, 0xbd, 0xef, 0xbc, 0xcb, 0x6f, 0xaf, 0xfd, 0x67, 0x14, 0xcb, 0x34, 0xeb, 0x82, 0x45, 0xb7, 0x7f, 0x13, 0x24, 0xa0, 0xd2, 0x01, 0x86, 0x34, 0xb9, 0xa1, 0x79, 0x45, 0xe9, 0x01, 0x1e, 0x90, 0x01, 0x61, 0x6a, 0x19, 0xce, 0x50, 0xc0, 0xff, 0xc6, 0xb6, 0x83, 0x79, 0xf6, 0x2d, 0x6a, 0x83, 0x8c, 0x2a, 0x6a, 0xe3, 0xe9, 0x7c, 0x6c, 0x69, 0x60, 0xee, 0xb0, 0xaa, 0x14, 0x2a, 0x32, 0x64, 0x08, 0x92, 0x6c, 0x1f, 0x9b, 0xf7, 0xfe, 0xec, 0x46, 0x26, 0x90, 0xe0, 0x23, 0xa3, 0x29, 0xc7, 0x48, 0xde, 0x71, 0x18, 0x69, 0xe9, 0x26, 0x30, 0x01, 0x86, 0x46, 0xe4, 0x6a, 0xac, 0xa8, 0x2f, 0xf7, 0xd1, 0x5a, 0x71, 0xba, 0x6b, 0xa5, 0x20, 0xf1, 0x59, 0xe3, 0x45, 0xc2, 0x85, 0xe7, 0x98, 0xcc, 0x32, 0xef, 0xa8, 0x4b, 0xe9, 0xd3, 0xc6, 0x8e, 0x14, 0x87, 0xee, 0x06, 0xe6, 0xc0, 0x8e, 0x7a, 0xb9, 0x28, 0x71, 0x91, 0xdf, 0xe9, 0xc2, 0x0f, 0x2e, 0xa1, 0xc9, 0xf5, 0x1c, 0x69, 0x1a, 0x9f, 0xfb, 0x9b, 0x31, 0xcf, 0x25, 0xdb, 0xdc, 0x78, 0xb3, 0x12, 0x3a, 0x39, 0x78, 0xa7, 0xc6, 0xb6, 0x6f, 0x9d, 0x4b, 0x65, 0xdc, 0xf8, 0xcd, 0x67, 0x78, 0xee, 0xb0, 0x98, 0xb4, 0x05, 0xd6, 0x8f, 0x8b, 0xba, 0x65, 0x27, 0x07, 0xbf, 0x6a, 0x40, 0x94, 0xcc, 0x29, 0xb4, 0xe2, 0x5c, 0xb6, 0x42, 0x97, 0xb7, 0x0a, 0x98, 0x97, 0x5f, 0x86, 0xe2, 0x38, 0x4a, 0x39, 0xe3, 0x20, 0x00, 0xae, 0xe4, 0x78, 0xe4, 0xf0, 0xa0, 0x37, 0x11, 0xe1, 0x74, 0xad, 0xb4, 0x6e, 0x31, 0xad, 0xb5, 0xe9, 0xb1, 0x48, 0x44, 0x42, 0xbd, 0xc8, 0x25, 0x73, 0xd7, 0x45, 0x83, 0x85, 0x38, 0xfd, 0xcc, 0x69, 0xd4, 0xc7, 0x35, 0x2f, 0xb6, 0xd7, 0xcd, 0x6b, 0x8e, 0x87, 0x2d, 0xe3, 0x81, 0x44, 0x58, 0x16, 0x00, 0x88, 0x8e, 0x41, 0x13, 0xd1, 0xfe, 0x5a, 0xf7, 0xe1, 0x68, 0x5f, 0xeb, 0x0b, 0x04, 0x2e, 0x10, 0xf3, 0x67, 0xc2, 0xe3, 0x1c, 0xea, 0x3c, 0xf6, 0xc5, 0x4d, 0x85, 0x8c, 0x6e, 0x10, 0xa4, 0x52, 0x3f, 0xfd, 0x36, 0x45, 0xd8, 0x03, 0x45, 0xe8, 0xd5, 0x73, 0x1f, 0x00, 0x90, 0x3e, 0x7b, 0x9f, 0x4b, 0x2a, 0x59, 0x4a, 0x01, 0xfa, 0xfc, 0x7d, 0xe6, 0x9b, 0x08, 0x46, 0x0b, 0x20, 0x13, 0xdc, 0xaa, 0x86, 0x47, 0x17, 0x4a, 0xe8, 0xa9, 0xab, 0x16, 0x73, 0x45, 0xc7, 0xb5, 0x84, 0x1c, 0x36, 0x9f, 0x48, 0x89, 0x22, 0xe2, 0xf1, 0xd1, 0x62, 0x7c, 0xb8, 0x79, 0x6d, 0x97, 0x4a, 0x80, 0x6b, 0x69, 0x13, 0xb4, 0x7e, 0x21, 0x34, 0xe7, 0xb3, 0xf1, 0xe2, 0x9b, 0x1f, 0x53, 0x24, 0xcd, 0x07, 0x40, 0x92, 0xed, 0xf1, 0xb3, 0x91, 0x15, 0x76, 0xac, 0xdd, 0x1c, 0x3f, 0xb0, 0xdb, 0x73, 0xfd, 0xb2, 0x98, 0xa1, 0x87, 0x2d, 0xe8, 0x43, 0x19, 0x86, 0x4f, 0xe7, 0x22, 0x77, 0x25, 0x16, 0x10, 0x97, 0xfb, 0x02, 0x0a, 0x57, 0xb4, 0xa1, 0x34, 0x1f, 0x5e, 0x04, 0xea, 0xdc, 0x0b, 0xac, 0x41, 0x9d, 0xe0, 0xd2, 0x9e, 0x5c, 0x3f, 0x25, 0x0a, 0x1d, 0x0a, 0xf6, 0x36, 0x7b, 0xc7, 0x33, 0x16, 0xb0, 0xc3, 0xca, 0x36, 0x1c, 0xd8, 0xd3, 0x09, 0x72, 0xd2, 0xee, 0x00, 0x98, 0xea, 0x30, 0x06, 0x20, 0x5b, 0x15, 0x9a, 0xa0, 0x42, 0x60, 0x5d, 0x41, 0x9b, 0x37, 0xbe, 0x3c, 0x22, 0x2f, 0x15, 0xeb, 0x3e, 0x28, 0x24, 0x1d, 0x54, 0xb0, 0x0f, 0xd3, 0xba, 0xb3, 0x9c, 0xa7, 0x3f, 0x0e, 0x23, 0x35, 0xc3, 0x0e, 0x33, 0x98, 0x98, 0xf7, 0x08, 0xb0, 0x65, 0xd6, 0x3c, 0xdd, 0x58, 0x9c, 0x1c, 0x2c, 0xc2, 0x94, 0x0c, 0x86, 0x87, 0xab, 0x8a, 0x64, 0xd3, 0x88, 0x3b, 0x97, 0xb7, 0x31, 0x38, 0x1a, 0x08, 0xa2, 0x2f, 0xc9, 0xf1 }; +constexpr AccessUnit USER_DATA_LARGE_AU_EXPECTED_AU = { 0x15f90, 0x159b2, false, 0, {}, { 0xe6, 0xce, 0x63, 0xc5, 0xc9, 0x69, 0xbf, 0x14, 0xa4, 0x80, 0x23, 0x67, 0xff, 0x8f, 0x9f, 0x76, 0xf7, 0x10, 0x3e, 0xdb } }; + + +const std::vector ATRACX_SKIP_BYTES_STREAM = { 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xf3, 0x3b, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0x7a, 0x01, 0xe0, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6a, 0x00, 0x1a, 0x00, 0x80, 0x20, 0x90, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x00, 0x01, 0xbd, 0x07, 0x5a, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xa7, 0xab, 0x1e, 0x73, 0x3b, 0x00, 0x4f, 0x02, 0xa0, 0x0f, 0xd0, 0x00, 0x52, 0x18, 0x4c, 0xe5, 0xfb, 0x25, 0x04, 0x81, 0xb1, 0x90, 0x29, 0x50, 0x65, 0x71, 0xac, 0x47, 0xdb, 0x51, 0x9e, 0x31, 0x43, 0xd2, 0x41, 0xc8, 0x06, 0xd3, 0xd3, 0x41, 0x13, 0x26, 0xef, 0xff, 0xba, 0x03, 0xc3, 0x38, 0x5c, 0xb5, 0x79, 0xb1, 0x88, 0x4e, 0x7c, 0xea, 0x44, 0x40, 0x9d, 0x56, 0x92, 0x3c, 0x21, 0x79, 0x83, 0xa9, 0x45, 0x10, 0x5c, 0x9c, 0xca, 0x93, 0x9c, 0x24, 0x89, 0xb5, 0xf5, 0x41, 0x2a, 0xc1, 0x70, 0xfa, 0x7d, 0xe3, 0x6c, 0x48, 0x0a, 0xc8, 0x16, 0xdf, 0xd9, 0x29, 0x95, 0xfc, 0x91, 0x18, 0x0c, 0xd4, 0x63, 0x3e, 0x1f, 0x3a, 0x60, 0x4b, 0xb2, 0x9b, 0x37, 0x4b, 0xf7, 0x70, 0x78, 0xb4, 0x19, 0xb9, 0xd4, 0x3f, 0x03, 0x28, 0xf7, 0x00, 0x22, 0x0b, 0xff, 0x39, 0x21, 0x23, 0xa0, 0xe5, 0xe9, 0xeb, 0x77, 0xfc, 0x81, 0x06, 0x32, 0xe0, 0x83, 0xde, 0x72, 0x7d, 0x49, 0x94, 0x98, 0x08, 0x0b, 0xde, 0xf1, 0x72, 0x8a, 0x78, 0xdb, 0xe9, 0x03, 0x2a, 0xe2, 0x03, 0x87, 0xa5, 0xf1, 0x77, 0xfb, 0xaa, 0x10, 0x78, 0x49, 0x3e, 0x53, 0x0c, 0x96, 0xe2, 0xe6, 0x08, 0x84, 0x11, 0x69, 0x78, 0xd1, 0x78, 0xff, 0xab, 0xd1, 0xa7, 0xc2, 0x20, 0xa5, 0x42, 0x88, 0x07, 0x2c, 0xd9, 0x1e, 0x2d, 0xf4, 0xf2, 0x72, 0x63, 0xcf, 0x01, 0x48, 0xce, 0xc1, 0x42, 0x74, 0xaf, 0x58, 0xb3, 0xbe, 0x85, 0xc7, 0xb8, 0xdb, 0x9f, 0x3b, 0x09, 0x2c, 0x86, 0x4d, 0x00, 0x2b, 0xcc, 0x88, 0x7d, 0xb5, 0x29, 0x5b, 0xc9, 0x94, 0xf4, 0x03, 0x57, 0x0c, 0x69, 0x32, 0x3a, 0x31, 0x3b, 0x88, 0xa8, 0x5e, 0x71, 0x1e, 0xf7, 0x16, 0x84, 0xc0, 0xd4, 0x0d, 0x3e, 0x90, 0xb4, 0x3b, 0xda, 0x28, 0xaf, 0x35, 0x4f, 0x8c, 0x56, 0x23, 0xe5, 0x65, 0x27, 0x0c, 0x62, 0x69, 0xad, 0x64, 0x76, 0xea, 0x82, 0x05, 0x44, 0xdd, 0xae, 0xf8, 0x18, 0xed, 0x25, 0xcd, 0xb2, 0x58, 0x50, 0x5a, 0xbd, 0xae, 0xf5, 0x15, 0x4a, 0xb7, 0xe7, 0x7d, 0x74, 0x0c, 0x40, 0x2b, 0x84, 0x3b, 0x20, 0x8c, 0x2e, 0x69, 0x36, 0x61, 0xc9, 0xdc, 0x7d, 0x78, 0x99, 0xe1, 0xf9, 0x49, 0x8e, 0xe4, 0x6c, 0x5e, 0x07, 0xce, 0x37, 0xbe, 0x86, 0xde, 0xec, 0xb7, 0x62, 0xa1, 0x51, 0xbf, 0xde, 0xce, 0xbd, 0x58, 0x37, 0x04, 0x20, 0x15, 0x90, 0xc9, 0x26, 0x45, 0xcd, 0x4f, 0x36, 0xd0, 0xc3, 0xc7, 0x46, 0x52, 0x4d, 0x51, 0xc0, 0x8c, 0x35, 0xd8, 0xfa, 0x97, 0xf5, 0x63, 0xf2, 0x92, 0xc2, 0xa1, 0x52, 0xac, 0x68, 0xce, 0xfd, 0xb9, 0xed, 0x25, 0x8f, 0xbf, 0xfb, 0x80, 0xa0, 0x26, 0x84, 0xe6, 0xbb, 0x75, 0x27, 0x14, 0x42, 0xd1, 0x4d, 0x53, 0xca, 0x9a, 0xf9, 0x22, 0x9a, 0xe2, 0xc6, 0x83, 0x51, 0xa2, 0x9b, 0xed, 0xf0, 0xd8, 0xf6, 0x45, 0xc4, 0xfe, 0xef, 0x50, 0xe5, 0x84, 0x4a, 0x7c, 0x50, 0x3a, 0x33, 0x07, 0xd0, 0xd2, 0x87, 0xcc, 0x38, 0xef, 0xba, 0x46, 0xa7, 0x61, 0xc6, 0x98, 0xce, 0x86, 0xb0, 0x9d, 0x7f, 0xf1, 0x88, 0x53, 0xf3, 0xca, 0xfa, 0x2e, 0x93, 0x96, 0xd3, 0x17, 0x2c, 0x46, 0x12, 0x2f, 0xe2, 0xc7, 0x60, 0x96, 0x45, 0x79, 0x0a, 0xc7, 0x5a, 0x36, 0xdf, 0x5a, 0x85, 0xd9, 0x8a, 0x2d, 0x94, 0x77, 0x42, 0x4d, 0x6f, 0xa1, 0xee, 0x1e, 0x1d, 0x7c, 0x1d, 0x9a, 0x1c, 0x75, 0x69, 0xa6, 0x55, 0xdf, 0x1b, 0xda, 0x16, 0xd1, 0x40, 0x34, 0xd9, 0xfa, 0x74, 0x94, 0xd2, 0x4f, 0x0f, 0xfe, 0x7d, 0xd0, 0x86, 0x02, 0xaf, 0xb5, 0x24, 0xb8, 0xdb, 0xc9, 0x6f, 0x3a, 0x8f, 0xd4, 0xe0, 0x98, 0x69, 0x39, 0xbc, 0x93, 0xf3, 0x42, 0x35, 0xaf, 0x2c, 0xbb, 0x2c, 0x66, 0xb7, 0xd2, 0x2b, 0x89, 0xed, 0x59, 0x7e, 0x1a, 0x4d, 0xea, 0x78, 0x28, 0x07, 0x87, 0x4f, 0x83, 0x98, 0xa8, 0x24, 0x47, 0xc2, 0xec, 0x0d, 0x90, 0x4a, 0xcb, 0x48, 0xed, 0x41, 0xfc, 0xf0, 0x45, 0xda, 0x7c, 0xcd, 0x58, 0xfa, 0x60, 0x14, 0x0d, 0x09, 0xdc, 0x49, 0x2e, 0xc1, 0x31, 0x8c, 0x53, 0xf0, 0x66, 0xe7, 0x05, 0x69, 0x00, 0x9b, 0x74, 0xab, 0x20, 0x5a, 0x38, 0xea, 0xb2, 0xf1, 0xfa, 0x86, 0x9f, 0xe7, 0x09, 0x1d, 0x28, 0xf7, 0x28, 0xc4, 0xd6, 0x7d, 0x1e, 0x0d, 0xb6, 0x34, 0xdc, 0xf2, 0xb8, 0xde, 0x3e, 0xc9, 0x72, 0xb8, 0xb7, 0xca, 0xa9, 0xd1, 0x6e, 0xda, 0x49, 0x9e, 0xa0, 0xa6, 0xc1, 0x70, 0x50, 0x36, 0xe8, 0x9b, 0x8d, 0x85, 0xdc, 0x7b, 0xdf, 0xd1, 0x7c, 0x9d, 0xa3, 0x9e, 0x7e, 0xc1, 0x6d, 0xb4, 0x34, 0x7a, 0xa4, 0x81, 0x81, 0x98, 0x01, 0xac, 0x9d, 0xb1, 0xa8, 0xce, 0x98, 0x64, 0xf4, 0x87, 0xcc, 0x38, 0x31, 0x78, 0xa2, 0x2e, 0xed, 0xd8, 0x5b, 0x5f, 0x85, 0x97, 0xca, 0x4d, 0x24, 0x5c, 0x2a, 0xb9, 0x5a, 0xcb, 0x77, 0x1c, 0xf6, 0xdd, 0x00, 0x22, 0xd7, 0x0f, 0xd0, 0x01, 0x00, 0xb5, 0xf3, 0xca, 0xde, 0xeb, 0x93, 0x07, 0x58, 0xd3, 0x9e, 0x57, 0xaf, 0x26, 0xe3, 0x44, 0x06, 0x5a, 0x2e, 0x14, 0xcd, 0xcb, 0x11, 0x4f, 0xe8, 0xce, 0x3a, 0x30, 0x44, 0xae, 0x50, 0x8b, 0xcf, 0xcb, 0x6f, 0x0e, 0x31, 0x51, 0xca, 0xfa, 0xc4, 0x53, 0x05, 0xa4, 0xa3, 0x35, 0x42, 0x6a, 0xce, 0xab, 0x0c, 0xeb, 0xc4, 0xc4, 0x84, 0xa8, 0x05, 0xc4, 0x84, 0x5e, 0x5c, 0xbe, 0xa6, 0xc8, 0xf9, 0x37, 0x48, 0x8a, 0x9b, 0x40, 0x1c, 0x7f, 0x69, 0xd1, 0xc5, 0xac, 0x37, 0x56, 0x98, 0x89, 0x48, 0xaf, 0x86, 0x65, 0xda, 0x20, 0xbd, 0x1f, 0x0d, 0xe8, 0x8d, 0x73, 0xe0, 0x84, 0x9c, 0x83, 0x63, 0xcb, 0x79, 0x84, 0x62, 0x73, 0x0c, 0x91, 0x13, 0xa7, 0x86, 0x18, 0x97, 0xba, 0xc6, 0x6c, 0x54, 0x29, 0x52, 0x6a, 0x7f, 0x6a, 0x5a, 0x34, 0x58, 0x48, 0x75, 0x78, 0xe3, 0xc5, 0xef, 0xcb, 0x37, 0xbe, 0xf1, 0x08, 0x9e, 0xc9, 0xd4, 0xb1, 0x21, 0x15, 0x64, 0xd2, 0x40, 0x3b, 0xe3, 0xe7, 0xe8, 0x43, 0x17, 0xa9, 0xf7, 0x54, 0xb1, 0xe8, 0xcf, 0xd5, 0xd4, 0xbc, 0xce, 0xed, 0x91, 0xb4, 0xb5, 0xa9, 0x93, 0xe5, 0x3e, 0x44, 0x63, 0xe3, 0x88, 0x3e, 0xef, 0x0d, 0x05, 0x54, 0x3a, 0xcc, 0x0c, 0x88, 0x73, 0x92, 0x57, 0xb3, 0xc8, 0xc1, 0xef, 0x64, 0xb3, 0xd2, 0x5e, 0x07, 0xa4, 0x54, 0x2f, 0x8c, 0x36, 0xb0, 0x02, 0x0c, 0x59, 0xae, 0xcf, 0x29, 0x2a, 0x3b, 0x0b, 0x24, 0x49, 0xf5, 0xde, 0xe9, 0xf7, 0x5b, 0x8d, 0x7e, 0x5b, 0xc9, 0xcb, 0xae, 0x91, 0x8f, 0xa3, 0xc6, 0x83, 0xc7, 0x0c, 0xc8, 0xa5, 0xbe, 0x81, 0x6b, 0x0d, 0x1e, 0x11, 0xc1, 0x8f, 0x17, 0xcf, 0x70, 0xc2, 0x40, 0x8d, 0xb9, 0x29, 0xfe, 0x56, 0xd4, 0xda, 0x8f, 0x09, 0x50, 0x60, 0x10, 0x00, 0x80, 0xb9, 0x2a, 0xc7, 0x23, 0x9f, 0x2d, 0x22, 0xcf, 0x88, 0xc5, 0x00, 0xd6, 0x09, 0x9c, 0x1d, 0x9f, 0x8d, 0x8d, 0x60, 0xb2, 0x81, 0x38, 0x47, 0xf4, 0x68, 0x23, 0xe1, 0xcc, 0x85, 0xb1, 0x2f, 0x2f, 0x08, 0xa1, 0xf0, 0xc8, 0xd8, 0xdb, 0x25, 0xcc, 0x86, 0xb4, 0xde, 0x1b, 0xf8, 0x0b, 0x18, 0xbc, 0xc4, 0xc1, 0xaf, 0xee, 0x6c, 0x8b, 0xc7, 0x43, 0xdc, 0x1c, 0x23, 0x88, 0xdc, 0x16, 0x3c, 0x6f, 0x63, 0x54, 0x28, 0x45, 0xf6, 0x6b, 0x99, 0x18, 0x7b, 0x86, 0x84, 0x27, 0x31, 0xe8, 0x36, 0x78, 0xb6, 0xc5, 0xe6, 0xf0, 0x4c, 0x3b, 0x11, 0x4b, 0xc3, 0x94, 0x30, 0xcb, 0xb1, 0x25, 0x87, 0x83, 0xf3, 0x6d, 0x26, 0x8b, 0x95, 0x46, 0x64, 0x8e, 0x8c, 0x54, 0x5e, 0x75, 0xfb, 0xfb, 0x43, 0x26, 0xe5, 0x86, 0x86, 0x99, 0x76, 0x53, 0x35, 0xb7, 0x5c, 0x29, 0xfe, 0xc4, 0xc7, 0x09, 0xc4, 0x51, 0x16, 0x1a, 0xb6, 0xf2, 0x44, 0x96, 0x41, 0x2d, 0x92, 0xc0, 0x6a, 0x64, 0x13, 0x52, 0x5b, 0xbe, 0x07, 0xf5, 0x25, 0x34, 0x33, 0xa0, 0x15, 0x59, 0x9a, 0xfd, 0x16, 0x83, 0x54, 0x2f, 0xfc, 0x62, 0x5b, 0x90, 0xb6, 0x34, 0x85, 0x4c, 0xbb, 0x17, 0x1a, 0xed, 0x3e, 0x39, 0xa8, 0x3d, 0xf2, 0xdc, 0x08, 0x07, 0x6b, 0x6c, 0xbf, 0xb3, 0x69, 0x25, 0x25, 0xb6, 0x97, 0xfe, 0x03, 0x4b, 0x8c, 0xe4, 0x87, 0x05, 0x19, 0x6e, 0xd1, 0x1a, 0x34, 0x93, 0x67, 0x84, 0x00, 0x19, 0x5f, 0x4f, 0xce, 0xbf, 0x06, 0xb5, 0x15, 0x51, 0x4c, 0xe2, 0xbd, 0x33, 0x59, 0x7e, 0x32, 0x0e, 0xf1, 0x52, 0x22, 0xa9, 0x93, 0xb3, 0xe7, 0x23, 0x91, 0x78, 0xe3, 0x0b, 0x6f, 0xb0, 0x6e, 0x10, 0x50, 0x62, 0x09, 0x4b, 0x53, 0xfc, 0xf4, 0x58, 0xff, 0x46, 0x70, 0xc2, 0x46, 0x02, 0x2e, 0x70, 0xb0, 0x80, 0xc5, 0x26, 0xab, 0xdb, 0x39, 0x3a, 0x25, 0xa2, 0xcf, 0x0f, 0xd9, 0x21, 0xd6, 0x0e, 0x08, 0x92, 0x11, 0x08, 0x76, 0xdd, 0xed, 0x59, 0xf1, 0xbd, 0xb5, 0x30, 0xae, 0x75, 0x63, 0xc6, 0x47, 0x53, 0xcc, 0x75, 0x31, 0xbe, 0x3e, 0xfb, 0xe1, 0x97, 0xd7, 0x52, 0x05, 0x0c, 0x1c, 0xe5, 0x85, 0x40, 0xa9, 0x21, 0x2b, 0x5c, 0xf8, 0x8f, 0x30, 0xe9, 0x94, 0x04, 0x0a, 0x8d, 0x40, 0x94, 0x2f, 0x8d, 0xe3, 0x55, 0xb7, 0xa4, 0x3a, 0x17, 0x0a, 0x1a, 0xab, 0xa9, 0x04, 0x28, 0xb9, 0x4d, 0x3c, 0x10, 0xe8, 0x66, 0x5e, 0x84, 0x23, 0x9c, 0xbb, 0x2e, 0xe8, 0xe5, 0x85, 0x84, 0xc8, 0x45, 0x57, 0x35, 0x0b, 0x25, 0x08, 0xd8, 0x84, 0x9e, 0xdd, 0xb4, 0xd2, 0x10, 0x9b, 0xb1, 0xb8, 0xe1, 0x15, 0xea, 0x37, 0x4c, 0x33, 0x60, 0x8e, 0x83, 0x8a, 0xb6, 0x60, 0xa1, 0xfe, 0x17, 0x8e, 0x24, 0x21, 0x94, 0x99, 0xed, 0x20, 0xa9, 0x85, 0x07, 0x89, 0xae, 0xa4, 0xa5, 0x44, 0x67, 0xb9, 0x20, 0x6d, 0xfb, 0x55, 0xe9, 0x01, 0x02, 0x6e, 0xad, 0x83, 0x6f, 0x7f, 0x28, 0x0a, 0x89, 0xbe, 0x64, 0x63, 0x3b, 0x34, 0x56, 0x2f, 0x6a, 0xbe, 0x2d, 0x30, 0x1a, 0x4f, 0xab, 0x2c, 0x8e, 0xef, 0x6d, 0x13, 0xb4, 0x54, 0xf9, 0x52, 0x7f, 0x0c, 0xe6, 0x85, 0x0a, 0x9d, 0x8f, 0xf0, 0x9f, 0x16, 0x19, 0x67, 0xfa, 0xd9, 0xae, 0x99, 0x71, 0xc0, 0x4d, 0xea, 0xca, 0xd3, 0x89, 0x36, 0xee, 0x24, 0x11, 0x4c, 0xc8, 0x9a, 0xdd, 0xe5, 0xef, 0xc4, 0x5d, 0x61, 0xfd, 0xe6, 0x0f, 0xab, 0xa4, 0xe6, 0x3d, 0xea, 0xea, 0xd8, 0xe6, 0xf9, 0x1a, 0x33, 0x09, 0xc1, 0x56, 0x08, 0xca, 0xf7, 0xd3, 0xb2, 0x35, 0xcf, 0x31, 0xe3, 0x97, 0xac, 0x71, 0x09, 0xa8, 0xdc, 0x81, 0x58, 0x04, 0xec, 0x66, 0x15, 0xad, 0x20, 0x63, 0xd5, 0x95, 0x19, 0xc4, 0xd2, 0x69, 0xb5, 0x19, 0x95, 0x1c, 0xb8, 0x0e, 0x89, 0xe9, 0xca, 0x2a, 0x3c, 0xd0, 0xce, 0x23, 0x5d, 0xbf, 0xae, 0x93, 0xc7, 0xef, 0x14, 0x36, 0x1e, 0x2a, 0xaf, 0x05, 0xca, 0xf3, 0xfb, 0xd1, 0x6b, 0xd5, 0xb9, 0x33, 0xf8, 0x51, 0x76, 0xf1, 0x2d, 0x21, 0xda, 0x35, 0x07, 0xd3, 0xa5, 0x2d, 0x5b, 0xfd, 0x86, 0xf6, 0xdb, 0x75, 0x3e, 0xeb, 0x0c, 0x5a, 0xaf, 0xb2, 0x02, 0xdf, 0xd3, 0xa9, 0xe1, 0x1d, 0xb4, 0x87, 0x83, 0x62, 0xe5, 0x55, 0xb7, 0xb3, 0x16, 0x16, 0xfc, 0x90, 0xc0, 0xb6, 0xaf, 0x24, 0x03, 0x2e, 0x0e, 0x5f, 0x33, 0xde, 0x84, 0xc5, 0xb0, 0x90, 0x1d, 0xda, 0x0a, 0xb6, 0x2b, 0x73, 0x81, 0xbd, 0x5a, 0x68, 0x68, 0x97, 0xd1, 0x5a, 0x05, 0xd4, 0x23, 0x9b, 0xe2, 0xeb, 0x1a, 0x56, 0xbc, 0x84, 0xb0, 0x99, 0x73, 0xed, 0xb9, 0xd9, 0xb4, 0x0a, 0x11, 0x0a, 0x3d, 0x68, 0x54, 0x6c, 0xf0, 0x40, 0x78, 0xa1, 0x1b, 0x95, 0xbd, 0xb7, 0xa3, 0xbe, 0xdd, 0x2b, 0x02, 0xfe, 0x71, 0x1d, 0x39, 0x08, 0xe5, 0x33, 0x32, 0x7b, 0x77, 0xe8, 0x30, 0xcf, 0x24, 0x39, 0x3b, 0x31, 0x7b, 0x04, 0xc2, 0x40, 0xa9, 0x72, 0xc9, 0xb4, 0x4c, 0x4c, 0x60, 0x62, 0xda, 0x1c, 0x49, 0x24, 0x9d, 0x64, 0xf7, 0x89, 0xa3, 0x64, 0x59, 0x6d, 0x1b, 0x25, 0x78, 0xd1, 0xf5, 0xd5, 0x0b, 0x89, 0xd3, 0x97, 0xb0, 0xb0, 0x8f, 0x60, 0xf6, 0xdc, 0xe9, 0x81, 0x20, 0x96, 0x21, 0xee, 0x16, 0x95, 0x9a, 0x7d, 0x68, 0x9d, 0xb6, 0x82, 0x81, 0x2d, 0x96, 0xab, 0xaf, 0x45, 0x72, 0xee, 0xe3, 0xeb, 0xa2, 0xea, 0x65, 0x47, 0x9f, 0x17, 0xd6, 0x78, 0x8d, 0xa0, 0x3c, 0x73, 0x0e, 0xc5, 0xfd, 0x8e, 0x7a, 0x1a, 0xf0, 0x9f, 0xbe, 0x0c, 0xfb, 0xaa, 0x70, 0x77, 0xe1, 0xa8, 0xe1, 0x3c, 0x32, 0xd4, 0x43, 0x20, 0x7f, 0x82, 0x23, 0x64, 0x53, 0x7a, 0xca, 0xd8, 0x7f, 0x53, 0x4d, 0x68, 0xc3, 0x51, 0x60, 0x55, 0xe9, 0xaa, 0x2d, 0xa2, 0xca, 0x55, 0xc0, 0x6a, 0xed, 0xb7, 0xd9, 0x17, 0x96, 0xca, 0x25, 0xc6, 0x92, 0x9f, 0x38, 0x3b, 0x0b, 0x54, 0xc2, 0x3e, 0x2a, 0xd9, 0xe2, 0x43, 0x63, 0x22, 0x87, 0xa9, 0x9f, 0xa1, 0x4c, 0x08, 0xa7, 0x24, 0x37, 0x48, 0x8c, 0x75, 0x48, 0x7e, 0xe6, 0x51, 0xcc, 0xc9, 0x24, 0xa2, 0xcf, 0xb3, 0x4f, 0xff, 0x2f, 0xc8, 0xf0, 0xe8, 0x22, 0x65, 0x0d, 0x4b, 0x3b, 0xf7, 0x54, 0x2a, 0x35, 0x28, 0xfc, 0x92, 0x14, 0xbd, 0xec, 0x28, 0x6c, 0x11, 0x29, 0xf6, 0xcd, 0x7b, 0xb1, 0x52, 0xad, 0x05, 0x25, 0xf6, 0x5b, 0x52, 0xfa, 0xaa, 0xb8, 0x84, 0x21, 0x18, 0xdc, 0x82, 0x3d, 0xad, 0xd7, 0x0d, 0xe9, 0x9c, 0x2f, 0x54, 0xaf, 0x5a, 0xdc, 0x18, 0x9d, 0x47, 0xd4, 0x92, 0xa9, 0x3c, 0x6d, 0x92, 0x46, 0x3a, 0x26, 0x9a, 0xe4, 0x89, 0xa3, 0xf5, 0x38, 0xda, 0xe0, 0xf4, 0x83, 0x59, 0xf7, 0xe9, 0x42, 0xc3, 0xf0, 0x7e, 0xec, 0xdb, 0x7e, 0x7b, 0xb1, 0xd7, 0x9f, 0x29, 0x6d, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbd, 0x07, 0xec, 0x79, 0x01, 0x00, 0x00, 0x24, 0xff, 0xdb, 0x8c, 0xe6, 0x0a, 0xfa, 0x51, 0x85, 0xb8, 0xdb, 0x2d, 0x4f, 0x23, 0x96, 0x35, 0xb2, 0x4b, 0x26, 0x29, 0x13, 0x41, 0x05, 0xb5, 0x52, 0x96, 0xed, 0xe2, 0x23, 0x2f, 0xc8, 0x03, 0xd7, 0xf8, 0xc1, 0x9e, 0x30, 0x12, 0xf0, 0x30, 0x52, 0x75, 0x34, 0xcb, 0x09, 0x30, 0x0c, 0xd7, 0xd4, 0xa7, 0x9a, 0x96, 0x86, 0x8e, 0x28, 0x1a, 0x63, 0x7e, 0xc7, 0xd1, 0x04, 0x56, 0xe1, 0xee, 0x7c, 0xd4, 0xeb, 0x28, 0x70, 0x11, 0x7d, 0xbc, 0x2a, 0xcd, 0x7a, 0xa3, 0xe0, 0xb2, 0x22, 0x4e, 0xa5, 0x07, 0x24, 0x82, 0xc4, 0x6d, 0x12, 0x09, 0x88, 0x9f, 0xd7, 0x5d, 0x9d, 0x62, 0xfa, 0x7f, 0x96, 0x02, 0xde, 0x9d, 0x49, 0x19, 0x51, 0x47, 0x08, 0x89, 0x03, 0x3f, 0xe2, 0xc6, 0xcb, 0x32, 0x79, 0xf2, 0xca, 0xea, 0x23, 0x67, 0xd5, 0xc1, 0x50, 0x9e, 0xb6, 0x58, 0x6c, 0xaa, 0x26, 0xf7, 0xcb, 0xa2, 0xa1, 0x05, 0x44, 0xad, 0x60, 0x77, 0x8e, 0xa8, 0x26, 0x3b, 0x7e, 0x7d, 0xba, 0xed, 0xc9, 0xa4, 0x16, 0x62, 0xdd, 0x7a, 0xc6, 0xd0, 0xec, 0x53, 0xfd, 0xa9, 0x53, 0x7a, 0x3e, 0x6d, 0xe5, 0x8a, 0xc1, 0xfd, 0xcc, 0xc4, 0xe2, 0x46, 0xfd, 0x5d, 0x42, 0x48, 0x8a, 0xdd, 0x6a, 0xbf, 0x32, 0x0d, 0x16, 0x0d, 0x0e, 0x19, 0x81, 0x1b, 0x31, 0xca, 0x4d, 0x4b, 0x98, 0x10, 0xdd, 0xc9, 0xd5, 0x44, 0x4e, 0xb3, 0x2f, 0xcd, 0x56, 0x03, 0x3f, 0x0f, 0xb7, 0x2b, 0x3c, 0xdd, 0x17, 0xbc, 0x75, 0xd0, 0x5c, 0xa7, 0xb8, 0x2a, 0xe5, 0xda, 0x9a, 0x44, 0x48, 0x4d, 0xe6, 0x9f, 0x62, 0xc8, 0xac, 0x0e, 0xdb, 0xec, 0xa1, 0xa5, 0x79, 0x50, 0xde, 0x57, 0xea, 0xbd, 0x31, 0x6d, 0xc5, 0xca, 0x76, 0x45, 0xfe, 0x7d, 0xc0, 0x07, 0x12, 0x9a, 0x43, 0x36, 0x95, 0xd2, 0x4b, 0x4e, 0xf1, 0xfd, 0xa1, 0xd8, 0x80, 0xff, 0x39, 0xa2, 0x53, 0x24, 0x0b, 0x05, 0x44, 0xea, 0x6a, 0x6b, 0x37, 0xa6, 0x3e, 0x77, 0x96, 0x71, 0xee, 0x7e, 0x71, 0x3c, 0xf0, 0x49, 0xe0, 0x11, 0x39, 0x3a, 0x72, 0xcb, 0x0f, 0x49, 0xda, 0xd9, 0xf2, 0x8b, 0x29, 0xc8, 0x99, 0x1b, 0x32, 0xb4, 0x4b, 0xaf, 0xf8, 0xde, 0xfa, 0x26, 0x42, 0xf9, 0xf1, 0xd0, 0xab, 0xf3, 0x05, 0x58, 0xd6, 0x53, 0x87, 0x70, 0x8e, 0x6e, 0x75, 0xbb, 0x08, 0xf9, 0xab, 0x9d, 0x8a, 0xdb, 0x00, 0xd0, 0x25, 0x2f, 0x9b, 0x00, 0x55, 0xd6, 0xfa, 0xc5, 0xa3, 0x1e, 0x5a, 0xb5, 0xaf, 0x47, 0x8d, 0x75, 0x2b, 0xf9, 0x6d, 0xf3, 0xb7, 0xf1, 0x75, 0x3a, 0xaf, 0x74, 0x28, 0x87, 0x46, 0x50, 0x5b, 0x8e, 0x92, 0x85, 0x88, 0x1c, 0x5f, 0xc6, 0xb4, 0x7d, 0xe1, 0x7f, 0x9e, 0x56, 0xb0, 0x16, 0x34, 0xe4, 0x96, 0x75, 0x8c, 0xbc, 0x20, 0x37, 0xd6, 0x89, 0xf6, 0xf0, 0x11, 0x6e, 0x71, 0x6d, 0x6b, 0xf4, 0xf3, 0xf1, 0xa1, 0xb4, 0xec, 0xb7, 0xbf, 0x28, 0xa4, 0x4d, 0x15, 0x52, 0x23, 0x8f, 0x4d, 0x1e, 0xd3, 0x4f, 0xe4, 0xb4, 0xc0, 0xf5, 0x83, 0x1d, 0x89, 0xaa, 0xef, 0xea, 0x63, 0xcc, 0x93, 0xd5, 0xc3, 0xc6, 0xda, 0x6d, 0x95, 0x8b, 0xd9, 0x56, 0x1c, 0x4f, 0xfe, 0xb9, 0xc3, 0x37, 0xce, 0xcf, 0x9f, 0x1f, 0xdd, 0xbc, 0x52, 0xb3, 0x8a, 0x1f, 0x99, 0x71, 0x32, 0x07, 0xba, 0x5b, 0xdb, 0x37, 0x83, 0x67, 0x8d, 0xe0, 0xb8, 0xf4, 0xe2, 0x4c, 0xf9, 0xde, 0x79, 0x14, 0x90, 0xe7, 0x50, 0xd8, 0xbe, 0x97, 0x40, 0xa6, 0x56, 0xd0, 0x1f, 0x6e, 0xd9, 0xaa, 0x2f, 0x46, 0x55, 0x5e, 0xee, 0x54, 0xba, 0x4d, 0x74, 0x9a, 0x77, 0x79, 0xe0, 0x00, 0x71, 0xe7, 0x8c, 0x5b, 0xca, 0xc9, 0x10, 0x4e, 0xf6, 0x78, 0x3c, 0x39, 0x10, 0x7d, 0x97, 0x9a, 0x81, 0x4d, 0x1b, 0x99, 0x58, 0x69, 0x1c, 0x9c, 0xf0, 0x06, 0xb1, 0x1d, 0xb6, 0x77, 0xfa, 0x1e, 0x40, 0xed, 0x20, 0xfc, 0xfa, 0x60, 0xf1, 0x79, 0x14, 0x99, 0x62, 0x30, 0x87, 0xbf, 0x6e, 0xea, 0x4d, 0xe4, 0x12, 0x69, 0x2e, 0x68, 0x59, 0xb1, 0xb1, 0x32, 0xc6, 0xdd, 0x1f, 0x1b, 0x7d, 0x06, 0xa2, 0x06, 0x02, 0xdb, 0xe8, 0x7f, 0x79, 0xd5, 0xe5, 0xe5, 0xaa, 0x3b, 0x86, 0x6f, 0x42, 0x56, 0x7e, 0x91, 0x13, 0x93, 0x81, 0x99, 0x3d, 0x69, 0x8f, 0x87, 0x9e, 0x43, 0x20, 0x6a, 0xdb, 0xcb, 0x59, 0xdb, 0xe3, 0x4c, 0xa5, 0x4e, 0xd0, 0x14, 0x3d, 0x5c, 0x6c, 0xfc, 0x9d, 0x3b, 0xd7, 0x8e, 0xd6, 0x06, 0x01, 0x66, 0x43, 0x8e, 0x04, 0xd0, 0x1f, 0xcc, 0x83, 0xad, 0xea, 0x3b, 0xa8, 0x35, 0xad, 0xab, 0x59, 0x1a, 0x81, 0x4b, 0xc5, 0x1a, 0xf3, 0x0f, 0x69, 0x0b, 0x20, 0xa4, 0x12, 0xf1, 0x9f, 0x8c, 0xa5, 0xa7, 0xa7, 0x2e, 0x8c, 0x23, 0xfa, 0xdf, 0x27, 0x6c, 0x73, 0x3a, 0x9c, 0xbf, 0x66, 0x46, 0xdd, 0x84, 0x14, 0x44, 0xca, 0xff, 0xe2, 0x26, 0xc0, 0xf3, 0x25, 0xff, 0xff, 0x96, 0xa3, 0xfe, 0xa8, 0x8e, 0x27, 0xb2, 0x5a, 0xd5, 0xbc, 0xb0, 0x9d, 0xc4, 0x73, 0xe5, 0x95, 0x99, 0xd2, 0x14, 0xcb, 0x3a, 0x38, 0x5f, 0xf4, 0x10, 0xe8, 0xdb, 0xfa, 0x32, 0x88, 0x77, 0xcc, 0x47, 0x34, 0xcd, 0x9a, 0xc6, 0x7f, 0xaa, 0x96, 0x8d, 0x07, 0x45, 0x5d, 0xef, 0x6a, 0x90, 0x93, 0xa7, 0xc4, 0x0d, 0x66, 0x64, 0x0b, 0x14, 0xfc, 0xce, 0xe9, 0x7e, 0x00, 0x3d, 0xea, 0x07, 0xcc, 0x80, 0x25, 0xfc, 0xee, 0x70, 0xaf, 0xf7, 0x0b, 0x26, 0x7f, 0xb7, 0x44, 0x1b, 0x97, 0x62, 0xba, 0x81, 0x91, 0xc0, 0xd2, 0x9b, 0xf1, 0x30, 0x41, 0xed, 0xcb, 0x71, 0x20, 0x79, 0xac, 0x82, 0x75, 0x74, 0xcd, 0x24, 0xfd, 0x20, 0xfc, 0xd1, 0x29, 0xae, 0xce, 0x31, 0x92, 0x67, 0x01, 0x57, 0x54, 0x71, 0x14, 0x4e, 0x19, 0xee, 0x8f, 0xd2, 0xc5, 0x56, 0x7a, 0x2b, 0x0d, 0x42, 0xf8, 0x8d, 0x63, 0x08, 0x0a, 0x6f, 0xff, 0xdd, 0xee, 0xc0, 0x04, 0x67, 0xa1, 0xf6, 0xeb, 0xe9, 0x71, 0x3e, 0xce, 0x78, 0xaa, 0x6e, 0x27, 0xde, 0xd0, 0x6f, 0x2d, 0x26, 0xe5, 0x37, 0xdd, 0xe8, 0xb7, 0xa1, 0x54, 0xd6, 0x3a, 0x9d, 0x16, 0x25, 0x51, 0xa5, 0x53, 0xc9, 0xa8, 0x59, 0x58, 0xab, 0x74, 0xba, 0xb7, 0x48, 0x36, 0x69, 0xcf, 0x61, 0xe2, 0xcf, 0xc2, 0xac, 0xfe, 0x34, 0x0a, 0xad, 0x9a, 0x0b, 0x2b, 0x2c, 0x43, 0x04, 0x44, 0xe7, 0x37, 0xb0, 0x72, 0x7d, 0x99, 0xc4, 0x44, 0x0f, 0xd0, 0x43, 0xc5, 0x4a, 0x1d, 0x1c, 0xc5, 0xe3, 0x38, 0x0f, 0x73, 0x6e, 0xbc, 0xd5, 0x71, 0xc8, 0x15, 0xed, 0xee, 0x0a, 0x8b, 0x8a, 0x70, 0x88, 0xf3, 0x68, 0x61, 0x63, 0x2c, 0xb4, 0x80, 0xd4, 0x3e, 0x24, 0xd0, 0x9a, 0x49, 0xfb, 0xa3, 0x40, 0x89, 0x9f, 0xd1, 0x25, 0x1b, 0xdf, 0x57, 0x65, 0x5e, 0x3d, 0xc9, 0x26, 0xff, 0xab, 0x66, 0xde, 0x1f, 0xa9, 0xc3, 0x8d, 0x1e, 0xb8, 0x41, 0x12, 0xf5, 0x7c, 0xd6, 0x06, 0x29, 0x0b, 0xe5, 0xcb, 0xce, 0x43, 0x12, 0xbc, 0x19, 0x30, 0x60, 0xa2, 0x71, 0xc3, 0x09, 0xeb, 0x0e, 0x77, 0xd5, 0x38, 0x96, 0x9f, 0xe1, 0x42, 0x31, 0x77, 0x1d, 0x3c, 0x1c, 0x3f, 0xf6, 0x13, 0xae, 0xe5, 0xed, 0x4b, 0x47, 0x14, 0x10, 0x55, 0xba, 0xb4, 0x97, 0x93, 0x0d, 0x1d, 0x22, 0x76, 0xae, 0x92, 0x50, 0x53, 0x79, 0xcd, 0xa6, 0xfc, 0x29, 0xaa, 0x12, 0x1e, 0x16, 0x34, 0x76, 0xf7, 0x4e, 0xb7, 0x00, 0xf8, 0x75, 0x7d, 0x47, 0x43, 0x04, 0x6f, 0x6a, 0x3f, 0xb7, 0xbc, 0xab, 0x97, 0x55, 0x34, 0x4e, 0x66, 0x2c, 0x0b, 0xa1, 0x6a, 0xd0, 0x1c, 0x7f, 0x7a, 0x09, 0xf7, 0xbe, 0xa0, 0x03, 0x43, 0x48, 0x81, 0x20, 0x41, 0xdb, 0x11, 0x03, 0x78, 0xab, 0xa1, 0xb5, 0xe6, 0x5e, 0xd6, 0x00, 0x29, 0x2b, 0x17, 0x59, 0x81, 0x07, 0x6e, 0xf2, 0xae, 0x2a, 0x05, 0xdd, 0xf6, 0x5b, 0xab, 0x4c, 0xe0, 0xd2, 0x09, 0x51, 0x72, 0x91, 0x79, 0xc4, 0xfa, 0x91, 0xa7, 0x12, 0xb3, 0x1a, 0x6b, 0x2e, 0xd0, 0x25, 0x83, 0xea, 0xaf, 0xb0, 0x1f, 0x60, 0x57, 0x3a, 0x68, 0x40, 0x76, 0xfe, 0x6d, 0x29, 0x77, 0x8e, 0x25, 0x58, 0x79, 0xd3, 0x6d, 0x5c, 0x33, 0xb5, 0x36, 0xa0, 0x12, 0xe1, 0x44, 0xe5, 0x1d, 0x61, 0x3a, 0x12, 0x66, 0x16, 0xc7, 0xef, 0x1d, 0x3b, 0x40, 0xa5, 0x8c, 0x7b, 0xee, 0x22, 0x85, 0x52, 0xe0, 0xc6, 0x12, 0xad, 0x12, 0xe1, 0x76, 0x17, 0x24, 0xf0, 0xc4, 0xda, 0x03, 0xaa, 0x99, 0xe4, 0x40, 0x44, 0xcd, 0x59, 0xe6, 0x79, 0x1f, 0x1d, 0x1e, 0x3f, 0x26, 0xcc, 0xe8, 0x40, 0x1d, 0xd8, 0xb7, 0x72, 0x4e, 0xd3, 0xc0, 0x6e, 0x2b, 0x18, 0x3b, 0x5a, 0x5d, 0x51, 0xfd, 0x8c, 0x5e, 0x9b, 0x0d, 0x39, 0x5f, 0x3e, 0x2e, 0xda, 0x8d, 0x36, 0x87, 0x08, 0x02, 0x0c, 0xcd, 0x10, 0xe4, 0xbc, 0x9d, 0x77, 0x91, 0x99, 0x03, 0x23, 0xcc, 0x7e, 0x3d, 0xfb, 0x48, 0xb3, 0x3c, 0x18, 0x1e, 0x54, 0x8d, 0xee, 0xea, 0x2c, 0x85, 0xf3, 0xac, 0x3c, 0xf5, 0xbf, 0xb3, 0x7d, 0xbe, 0xa6, 0x15, 0x7f, 0xf8, 0x33, 0x94, 0xf9, 0x9d, 0x21, 0xe7, 0x73, 0xda, 0xb0, 0xc1, 0x94, 0x7e, 0x65, 0x1b, 0xc4, 0x20, 0xa2, 0x90, 0x2e, 0x06, 0xa9, 0xd5, 0x4d, 0xd4, 0xe4, 0xa1, 0x83, 0x94, 0x97, 0x7d, 0x88, 0xa1, 0x48, 0x62, 0x92, 0x81, 0x91, 0x21, 0x87, 0xbb, 0x1e, 0xdb, 0xa9, 0x33, 0x08, 0x2e, 0x80, 0x9b, 0xda, 0xc7, 0xf6, 0x00, 0xe5, 0x75, 0xe8, 0x86, 0xbe, 0x07, 0xa7, 0xda, 0xfd, 0x7d, 0x1f, 0xe8, 0x9e, 0x5d, 0xa5, 0xd8, 0x9d, 0x2f, 0xab, 0x7b, 0xad, 0x7a, 0xcf, 0x82, 0x20, 0xc2, 0x05, 0x46, 0x5f, 0x5a, 0xd5, 0xf4, 0x94, 0x0c, 0xf2, 0x60, 0x54, 0xf5, 0x96, 0xd0, 0x75, 0x0d, 0x71, 0x8d, 0x5d, 0x38, 0x17, 0x00, 0x74, 0xdc, 0x35, 0xa8, 0x87, 0x57, 0x03, 0x45, 0x4a, 0xd8, 0xb1, 0xdc, 0x3d, 0x67, 0xc4, 0x9b, 0xa7, 0x2f, 0xb2, 0xaa, 0x76, 0x4d, 0x20, 0x6a, 0x23, 0xb5, 0x8f, 0xc8, 0xf6, 0xfc, 0x72, 0x88, 0x48, 0x07, 0xdf, 0xc7, 0x9d, 0x00, 0x69, 0x08, 0xac, 0x02, 0xc7, 0x8d, 0xc5, 0x60, 0x5f, 0xde, 0x13, 0x88, 0xd6, 0xa2, 0xb4, 0xc8, 0x3b, 0x4f, 0xab, 0x94, 0x70, 0x41, 0x1a, 0x05, 0xe4, 0x35, 0x52, 0xa4, 0xc8, 0x4d, 0xa1, 0xd7, 0x46, 0x0d, 0xed, 0x6a, 0x70, 0xff, 0x8b, 0x0d, 0xe5, 0xdb, 0xd1, 0xd2, 0x6d, 0x79, 0x64, 0xf0, 0xfe, 0xdb, 0x38, 0x5b, 0xeb, 0x19, 0xc0, 0x03, 0x3f, 0x00, 0xcc, 0xb9, 0x73, 0xa6, 0x0b, 0x11, 0x07, 0x4b, 0x3a, 0xca, 0xb6, 0x48, 0x67, 0x86, 0x3a, 0xe7, 0xde, 0xe0, 0xec, 0x54, 0x9f, 0x25, 0xa7, 0x1d, 0x78, 0x50, 0xbf, 0xdf, 0x22, 0xfb, 0xf8, 0x15, 0xf4, 0x60, 0xc4, 0x31, 0x16, 0xb6, 0x39, 0x6a, 0x42, 0x73, 0x88, 0xf6, 0x77, 0x3b, 0xe6, 0x86, 0x3b, 0x95, 0x2b, 0x4c, 0x43, 0x9a, 0x97, 0xd9, 0x9d, 0x4e, 0x8c, 0x9b, 0xbf, 0x46, 0x2a, 0xd6, 0x0f, 0xc9, 0x07, 0x41, 0xc3, 0xa5, 0x8f, 0xc8, 0x39, 0x48, 0xb9, 0x07, 0x1a, 0xee, 0x15, 0x74, 0xed, 0xea, 0x65, 0x6e, 0xf1, 0x57, 0x51, 0x86, 0x5c, 0xc1, 0xd8, 0xc7, 0x59, 0x8f, 0x91, 0xd5, 0x62, 0x36, 0xe9, 0x1e, 0xd4, 0x8e, 0xe0, 0x78, 0xd7, 0xc2, 0x02, 0xf0, 0xf5, 0xb5, 0x95, 0xa0, 0xfc, 0xed, 0x3c, 0xbb, 0x0f, 0x37, 0x7f, 0x50, 0xf1, 0xac, 0x0c, 0x50, 0xf7, 0xd7, 0x90, 0xdd, 0x39, 0xff, 0x7d, 0x01, 0xd1, 0xf8, 0x26, 0x3d, 0x59, 0xeb, 0xfc, 0x9a, 0xf0, 0xfb, 0xdc, 0x2b, 0x77, 0xbe, 0xb3, 0x29, 0xc6, 0xe9, 0xee, 0x17, 0x17, 0xa5, 0x75, 0x99, 0xe3, 0x72, 0x2d, 0xea, 0xe3, 0x8e, 0x39, 0x1c, 0x06, 0x3b, 0x81, 0x93, 0x7d, 0x65, 0x28, 0x60, 0x39, 0x7e, 0x00, 0x6d, 0x6d, 0x93, 0x33, 0xa1, 0x04, 0xf0, 0x8e, 0x6f, 0x13, 0xd5, 0x44, 0x78, 0xac, 0x08, 0x10, 0x2c, 0xb3, 0x62, 0xf8, 0x8f, 0x81, 0x85, 0x33, 0xa6, 0x89, 0x63, 0xe8, 0x13, 0x3f, 0x4f, 0xbe, 0xf0, 0xf4, 0xb3, 0x87, 0xff, 0x7a, 0xa5, 0x73, 0x9e, 0xa9, 0xfa, 0x8f, 0x37, 0x24, 0x97, 0x88, 0x07, 0xff, 0x0e, 0xf7, 0x74, 0x17, 0xd7, 0xa3, 0x58, 0x44, 0xac, 0x83, 0xf6, 0xb6, 0xd7, 0x75, 0x73, 0x24, 0x7c, 0xe1, 0x14, 0x9e, 0x32, 0xd8, 0xa1, 0x24, 0x66, 0x4e, 0x94, 0x62, 0x6d, 0x86, 0x16, 0x23, 0x38, 0xd8, 0xd4, 0x5f, 0x07, 0x5b, 0x3f, 0xfa, 0x9d, 0x26, 0xc1, 0x98, 0xce, 0x28, 0xe8, 0x1c, 0x5f, 0xd4, 0xa7, 0xa8, 0x96, 0x18, 0x27, 0x51, 0xff, 0x60, 0xc2, 0xbf, 0x31, 0xa1, 0x23, 0x7e, 0x9c, 0xa3, 0xaf, 0xb4, 0xbd, 0x0b, 0xa5, 0x7b, 0x25, 0xdf, 0xa2, 0x21, 0x43, 0x80, 0x75, 0xfa, 0xe0, 0x59, 0x6f, 0x97, 0xa5, 0xb3, 0x93, 0x82, 0x3f, 0x84, 0x65, 0xdc, 0xd9, 0x11, 0x30, 0x72, 0x09, 0xc0, 0xf8, 0x36, 0x77, 0x84, 0x86, 0x1b, 0xc8, 0xa1, 0x37, 0xd1, 0x99, 0xc8, 0x77, 0xe6, 0x98, 0xcb, 0x1a, 0x2d, 0x07, 0x50, 0xfe, 0x8f, 0x34, 0x61, 0x99, 0x99, 0xb2, 0xb5, 0x71, 0x67, 0x60, 0xff, 0x96, 0xc8, 0x87, 0xbe, 0x95, 0xb2, 0x9f, 0x43, 0x95, 0x6d, 0x86, 0xf1, 0x7a, 0x07, 0x35, 0xeb, 0x49, 0xed, 0x36, 0xb6, 0x32, 0xcf, 0x7f, 0x80, 0xeb, 0x1d, 0x5d, 0x0f, 0x4f, 0xc8, 0x9a, 0x92, 0x64, 0x11, 0x12, 0xd4, 0x37, 0x9b, 0x54, 0x81, 0x44, 0xfd, 0x15, 0x8d, 0x42, 0x8b, 0x76, 0xdd, 0x92, 0x23, 0x83, 0xd3, 0xb0, 0x22, 0x57, 0x4e, 0x5e, 0xd4, 0xcf, 0x43, 0x67, 0x03, 0xc1, 0x0e, 0x31, 0x7e, 0x10, 0x03, 0x86, 0xb8, 0x28, 0xfb, 0x40, 0xce, 0xa3, 0xd4, 0xc5, 0xa2, 0x32, 0x2a, 0x7c, 0xdb, 0x0f, 0xb6, 0xab, 0xea, 0x84, 0x1b, 0x68, 0x6b, 0x4e, 0x1c, 0x89, 0x8b, 0xf3, 0x6f, 0xc0, 0x3e, 0x51, 0xaf, 0x4f, 0x6c, 0xef, 0x32, 0xf9, 0x70, 0xe3, 0xa3, 0x2f, 0x81, 0x50, 0xbe, 0x86, 0xe7, 0xd4, 0x95, 0x0b, 0x0b, 0x66, 0x1e, 0xf2, 0xd5, 0x78, 0x08, 0xb9, 0xd8, 0x64, 0x11, 0xc9, 0x43, 0x74, 0x5f, 0x14, 0x9e, 0x10, 0x8f, 0x54, 0xb7, 0xdb, 0x78, 0xdc, 0x63, 0xcd, 0xe8, 0x21, 0xdc, 0x9b, 0xc9, 0x6a, 0xf1, 0xed, 0x70, 0x5b, 0x48, 0x3d, 0x18, 0x30, 0x64, 0x5a, 0xb8, 0xf6, 0x47, 0xef, 0xbe, 0x0a, 0xbb, 0x87, 0x5c, 0xa8, 0xbd, 0xe6, 0x78, 0x61, 0x82, 0xbb, 0x5d, 0xb1, 0x14, 0x05, 0xcd, 0x1a, 0x8a, 0xa1, 0x0d, 0x75, 0x3f, 0xe1, 0x02, 0x5c, 0xaf, 0x31, 0x8a, 0xe7, 0xc3, 0x0c, 0x99, 0x1c, 0xb3, 0xe5, 0xca, 0xc1, 0xdd, 0xb2, 0x6a, 0x83, 0x21, 0x3e, 0x36, 0x8f, 0xad, 0x84, 0x44, 0x1d, 0x46, 0x99, 0xd7, 0x86, 0x78, 0xfd, 0x1f, 0xdb, 0x3c, 0x57, 0x10, 0x2e, 0xf8, 0xe8, 0xe3, 0xe6, 0xfa, 0x4c, 0xea, 0xe0, 0xb8, 0x41 }; +constexpr AccessUnit ATRACX_SKIP_BYTES_EXPECTED_AU = { 0x15f90, 0x153d5, false, 0, {}, { 0x8a, 0x7b, 0xc9, 0x69, 0xee, 0xca, 0xcb, 0xab, 0xc6, 0x61, 0xa1, 0xf4, 0x75, 0x2e, 0x59, 0xb5, 0xf2, 0x90, 0x9d, 0x29 } }; + +const std::vector AC3_SKIP_BYTES_STREAM = { 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xf3, 0x3b, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0x7a, 0x01, 0xe0, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6a, 0x00, 0x1a, 0x00, 0x80, 0x20, 0x90, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x00, 0x01, 0xbd, 0x07, 0x5a, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xa7, 0xab, 0x1e, 0x73, 0x3b, 0x30, 0x05, 0x05, 0x00, 0x0b, 0x77, 0xf4, 0x4b, 0x1b, 0x17, 0x5a, 0xaf, 0x1a, 0x24, 0x2c, 0x25, 0xa4, 0x37, 0x51, 0x53, 0xb0, 0x42, 0x4c, 0x69, 0x01, 0x21, 0x3f, 0x19, 0xf9, 0xfe, 0x1f, 0x8c, 0x15, 0x45, 0x98, 0xc8, 0x74, 0xa5, 0x58, 0x15, 0xba, 0xfd, 0xc4, 0x76, 0xf0, 0x2d, 0x4c, 0x44, 0x42, 0x21, 0xe0, 0x5a, 0xa7, 0xab, 0x3c, 0x92, 0xdf, 0xdf, 0x11, 0x67, 0x62, 0x1a, 0x35, 0xf5, 0x0b, 0xea, 0x6d, 0xc4, 0xb5, 0x70, 0x78, 0xfd, 0x0b, 0xfc, 0x67, 0x0b, 0x41, 0x02, 0x74, 0xba, 0x7d, 0x9c, 0xd8, 0x5a, 0x13, 0x3c, 0x59, 0x7a, 0xf9, 0x42, 0x91, 0x37, 0x02, 0xa3, 0x29, 0x4c, 0xc0, 0xc1, 0x7c, 0x3e, 0x2f, 0x2e, 0x6c, 0x62, 0x7b, 0x04, 0x54, 0xa4, 0x88, 0xeb, 0x67, 0x33, 0x0b, 0x1e, 0xe5, 0x8a, 0x60, 0xf1, 0xec, 0x79, 0x67, 0xa7, 0xe1, 0x1d, 0x17, 0xaa, 0xad, 0xf7, 0x8e, 0x68, 0x42, 0x86, 0xd2, 0x66, 0x31, 0x17, 0x86, 0x59, 0x41, 0xb0, 0x43, 0x42, 0x4b, 0x4e, 0x68, 0xef, 0xd5, 0xd3, 0x7d, 0x5a, 0x24, 0x5c, 0x85, 0xba, 0xc9, 0xde, 0xe1, 0x54, 0xda, 0x4e, 0x93, 0x52, 0x60, 0xa0, 0x0f, 0x32, 0xaa, 0x60, 0xe8, 0x93, 0x88, 0xcd, 0xf5, 0x76, 0xaa, 0x9d, 0xd4, 0x2d, 0x9a, 0xd3, 0xdf, 0x9c, 0x16, 0x62, 0xf5, 0x7f, 0xb6, 0x76, 0xa5, 0xdb, 0x2d, 0x9f, 0xaf, 0xc8, 0x9b, 0x42, 0xdd, 0x3f, 0x9b, 0xf8, 0xa6, 0xa0, 0x26, 0xd2, 0x26, 0x0a, 0x71, 0xa8, 0x52, 0xc9, 0x4c, 0xdb, 0x7f, 0x6d, 0xb8, 0x40, 0x9a, 0x4c, 0xb6, 0x12, 0xad, 0x8a, 0x86, 0x2b, 0x88, 0xe4, 0xdb, 0xd9, 0xb4, 0xcf, 0xad, 0x0d, 0x04, 0xbf, 0xbd, 0xc7, 0x60, 0x95, 0xf4, 0xea, 0xa9, 0x89, 0x25, 0xf1, 0xd6, 0x19, 0xe6, 0x1d, 0x9d, 0xca, 0x7d, 0x16, 0x45, 0xc4, 0x29, 0x27, 0x88, 0x96, 0x2d, 0x85, 0x94, 0xb8, 0x6e, 0x42, 0x8f, 0x85, 0x93, 0xe7, 0x32, 0xc1, 0xe9, 0xd2, 0x65, 0x06, 0x84, 0xcf, 0xe7, 0x82, 0x5e, 0x97, 0x6a, 0xf9, 0x64, 0x17, 0xbe, 0xfb, 0xbe, 0xbb, 0xdc, 0xa1, 0xc1, 0x18, 0xfe, 0x65, 0x4e, 0xac, 0x13, 0xda, 0x91, 0xa5, 0x2f, 0x4f, 0x69, 0xc3, 0xd5, 0xad, 0xec, 0xe2, 0x34, 0x19, 0xc4, 0xbc, 0xb2, 0x2b, 0x65, 0xe2, 0x6d, 0xba, 0x51, 0x06, 0x76, 0x9c, 0xed, 0x1a, 0xf8, 0xd2, 0xa4, 0xd6, 0xa4, 0xfa, 0x46, 0xa4, 0xef, 0x0f, 0xf3, 0x14, 0x0e, 0xbf, 0x03, 0x4b, 0xc5, 0xe8, 0xa0, 0x12, 0x6a, 0x06, 0x21, 0x73, 0xac, 0x9e, 0x53, 0x18, 0x0a, 0xf3, 0x2a, 0xc8, 0x0c, 0x91, 0xa8, 0xbd, 0x98, 0x76, 0xe2, 0xbc, 0x0c, 0xea, 0x69, 0x10, 0xe5, 0x53, 0x93, 0xe0, 0x27, 0x8a, 0x5b, 0x8f, 0xc9, 0x84, 0xdc, 0xfe, 0xd7, 0x56, 0x97, 0xf6, 0x14, 0xe5, 0x13, 0x10, 0x48, 0xc9, 0x77, 0xd4, 0x8a, 0x32, 0x3c, 0xfc, 0x25, 0xd9, 0x12, 0xf6, 0xf8, 0x51, 0x8d, 0x2c, 0x6a, 0x2f, 0x47, 0xa1, 0x4d, 0xf4, 0x7c, 0xea, 0x4f, 0xa9, 0x57, 0x9a, 0xcf, 0x86, 0x69, 0x96, 0x3e, 0x34, 0x13, 0x01, 0x58, 0x66, 0xce, 0xa2, 0xdd, 0xed, 0x98, 0xfa, 0xa5, 0x76, 0x02, 0x6a, 0x21, 0x9a, 0x95, 0x27, 0xb6, 0xf8, 0x8e, 0xd1, 0x79, 0x6e, 0x2e, 0xf0, 0x3e, 0xbd, 0x12, 0xb2, 0x05, 0x1e, 0x61, 0x9d, 0x24, 0x9f, 0xb4, 0x25, 0xdb, 0x47, 0x08, 0x42, 0x0f, 0x54, 0x29, 0x8e, 0x65, 0x24, 0x5d, 0x75, 0x07, 0x87, 0x42, 0x81, 0xbe, 0x93, 0x1c, 0xd9, 0x26, 0x44, 0x16, 0x6f, 0x35, 0x6b, 0x2a, 0x78, 0x56, 0xbe, 0xb2, 0x2b, 0xcb, 0x1f, 0xd5, 0xea, 0x1f, 0x51, 0x5d, 0x3d, 0xd1, 0xb9, 0x9a, 0x54, 0x8b, 0xea, 0x6b, 0xfd, 0x8b, 0x19, 0x86, 0x2b, 0x11, 0xad, 0xa2, 0x8d, 0xed, 0x8f, 0x1c, 0xd2, 0x96, 0xf6, 0x2c, 0x93, 0x5a, 0xbf, 0xd6, 0x01, 0x7f, 0xa6, 0x1c, 0xcf, 0x85, 0xd7, 0x2c, 0x00, 0xcc, 0xc0, 0x80, 0x7c, 0x51, 0x13, 0x34, 0xaf, 0x4b, 0x59, 0x06, 0x80, 0xce, 0x95, 0xc7, 0x63, 0xd5, 0xcf, 0x2c, 0x6c, 0x3c, 0x87, 0x44, 0x89, 0xa0, 0x5f, 0x0a, 0x54, 0x26, 0x94, 0xd6, 0x28, 0x9d, 0xfc, 0x9f, 0x69, 0x86, 0xac, 0x52, 0x22, 0xe7, 0x80, 0xb7, 0x6e, 0x00, 0x1a, 0xa1, 0x53, 0x44, 0x27, 0x61, 0xfb, 0x29, 0xe8, 0xbe, 0x7b, 0xb4, 0x5f, 0xed, 0x8c, 0xdb, 0x96, 0x3e, 0xf1, 0x10, 0xe4, 0x85, 0x61, 0xa1, 0x20, 0x70, 0x35, 0xb9, 0x2e, 0x4e, 0x35, 0x2c, 0x51, 0x03, 0x43, 0x5a, 0x2d, 0x1b, 0xba, 0xda, 0x6b, 0x46, 0xc0, 0xb3, 0x5a, 0xb0, 0xed, 0x50, 0x1b, 0xf1, 0xf3, 0x7f, 0x12, 0x98, 0x38, 0x20, 0xc0, 0x83, 0x8c, 0x5c, 0x41, 0x88, 0x63, 0x7f, 0xff, 0x2a, 0x42, 0xd1, 0x66, 0x50, 0x53, 0x0f, 0xa9, 0x42, 0x38, 0x59, 0xdb, 0x61, 0xa0, 0xb6, 0xf1, 0x5d, 0x39, 0x86, 0x74, 0xdf, 0xf4, 0x84, 0xf0, 0xe3, 0xc2, 0x2d, 0x6e, 0x45, 0x3b, 0xac, 0x7e, 0x38, 0xd8, 0xa8, 0xaa, 0x9b, 0xa8, 0x8b, 0x52, 0x7c, 0xb7, 0x25, 0x3e, 0x33, 0x84, 0xc0, 0x7c, 0xd6, 0x45, 0x05, 0x4d, 0x05, 0xd0, 0x52, 0x2b, 0x4b, 0x63, 0x4d, 0x3b, 0x8a, 0xb7, 0xe9, 0xbc, 0x31, 0xff, 0x21, 0x26, 0x38, 0xce, 0x15, 0x28, 0x23, 0x02, 0x5b, 0xb5, 0x7d, 0x2a, 0xa6, 0xb5, 0x92, 0x0a, 0x22, 0x34, 0x5a, 0x3a, 0x12, 0xfb, 0xdd, 0xf0, 0xa1, 0x05, 0x80, 0x80, 0xef, 0x3b, 0xff, 0x24, 0xc3, 0x5a, 0x0a, 0x0d, 0x78, 0x03, 0xc9, 0xd6, 0x01, 0x44, 0xba, 0xd7, 0x24, 0x27, 0xad, 0xf0, 0x44, 0x12, 0xd2, 0xd5, 0x53, 0x03, 0x1c, 0xdf, 0xd4, 0xf9, 0x74, 0xf7, 0xfd, 0x10, 0x6f, 0x2a, 0x58, 0x1a, 0x96, 0xe2, 0x82, 0xcd, 0x64, 0xe2, 0xe4, 0xc6, 0x88, 0x84, 0x7b, 0xf2, 0x27, 0xd4, 0x18, 0x25, 0x05, 0x77, 0xa4, 0xf6, 0xf1, 0x98, 0x53, 0x1c, 0xd5, 0x2f, 0xd5, 0xe5, 0x33, 0x67, 0xef, 0x8e, 0x06, 0xfd, 0x07, 0x85, 0x4e, 0xc8, 0x92, 0xe8, 0xab, 0xe1, 0x6d, 0xca, 0xe2, 0x05, 0x8e, 0x01, 0x2e, 0x2c, 0x9b, 0x9f, 0xa8, 0x79, 0x4f, 0x45, 0x3a, 0xf0, 0xbd, 0xf9, 0xdf, 0xa5, 0xda, 0x33, 0x28, 0x43, 0xde, 0x3d, 0x45, 0x20, 0x60, 0x2b, 0x08, 0x4e, 0x44, 0xf6, 0xa5, 0x48, 0xdb, 0x8c, 0x2d, 0x31, 0xd1, 0xda, 0xf1, 0xd2, 0xbd, 0x20, 0x5a, 0xb6, 0x7e, 0x1d, 0xed, 0x22, 0xaf, 0xda, 0x6e, 0xcc, 0xe2, 0x1e, 0x6c, 0x74, 0x65, 0xe5, 0xaa, 0xe0, 0xcb, 0x53, 0x1d, 0xd4, 0x78, 0x00, 0x86, 0xfa, 0xe2, 0x97, 0xe0, 0xe9, 0x57, 0x2b, 0x13, 0xaf, 0x66, 0xb7, 0xba, 0x91, 0x4a, 0xa6, 0xec, 0xe5, 0xf1, 0x61, 0x4a, 0x44, 0x7c, 0x3e, 0xc1, 0x62, 0x52, 0x51, 0xd7, 0x56, 0x20, 0xea, 0x61, 0x2c, 0x70, 0xdb, 0xee, 0xf7, 0x9b, 0xba, 0x64, 0xc1, 0x48, 0xc1, 0x87, 0x16, 0xc8, 0x10, 0x5e, 0x10, 0xef, 0x55, 0xc7, 0x03, 0x45, 0x35, 0x9f, 0x51, 0xac, 0xf2, 0x48, 0xed, 0xd5, 0x2f, 0x89, 0xa3, 0x20, 0xc0, 0xf6, 0x29, 0xca, 0xf4, 0x74, 0x81, 0x7a, 0xc8, 0x79, 0x4d, 0x8c, 0xe4, 0x20, 0xff, 0xc3, 0x5e, 0x32, 0x18, 0x24, 0x99, 0xba, 0xde, 0x33, 0xd0, 0xc6, 0x2f, 0xda, 0x03, 0x6d, 0x6d, 0x9a, 0x72, 0x39, 0xa0, 0xe9, 0xd5, 0x8a, 0x3d, 0xd4, 0xef, 0x9a, 0x43, 0x3d, 0x43, 0x34, 0x9c, 0x57, 0xf1, 0x3f, 0xdf, 0x3f, 0x12, 0xae, 0xef, 0xc2, 0x15, 0x8e, 0x22, 0xb8, 0xf2, 0x23, 0xcd, 0x8c, 0x32, 0x5c, 0x71, 0xc3, 0x2c, 0x13, 0xf2, 0xb7, 0xeb, 0xd7, 0x7b, 0xc4, 0xa1, 0x41, 0x04, 0x9a, 0x9b, 0x02, 0xa5, 0x82, 0x18, 0x38, 0x1e, 0xb8, 0x83, 0xbd, 0x44, 0x3d, 0xd9, 0x61, 0x39, 0xa6, 0x55, 0x66, 0xa6, 0xe4, 0x9c, 0xa0, 0x56, 0x03, 0x07, 0x01, 0xea, 0x51, 0xc6, 0x8f, 0x87, 0x80, 0xf9, 0xf6, 0xaf, 0x9c, 0xf8, 0x3d, 0xb9, 0xfb, 0x6c, 0x57, 0x84, 0x77, 0xeb, 0x83, 0x5c, 0x9d, 0x43, 0xc4, 0x3a, 0x9d, 0x9d, 0xe6, 0xd0, 0x1e, 0x1f, 0xce, 0xfc, 0x56, 0xcf, 0x0d, 0xa9, 0x00, 0xbf, 0xf9, 0x33, 0x02, 0xd5, 0xc2, 0xc0, 0xf1, 0xb8, 0x44, 0x46, 0xbc, 0xaf, 0x89, 0x14, 0x2c, 0x7a, 0x45, 0x20, 0x05, 0x7a, 0xbd, 0x7a, 0xf2, 0xa6, 0xd6, 0x8d, 0x89, 0x2c, 0x4c, 0x24, 0x14, 0xb3, 0x4e, 0x5c, 0xeb, 0xa2, 0xf3, 0xea, 0x87, 0xe3, 0x4e, 0x62, 0xa4, 0xfe, 0x16, 0x74, 0x0d, 0x8a, 0x1e, 0x3d, 0xf5, 0x52, 0x22, 0x26, 0xee, 0xa2, 0x96, 0xf0, 0xe5, 0xa1, 0x81, 0xe3, 0xbb, 0xb1, 0x9a, 0x4a, 0x51, 0x2a, 0x1d, 0xa0, 0x2d, 0xfe, 0x25, 0x25, 0x0b, 0x07, 0x73, 0xc3, 0x03, 0x19, 0xe8, 0x69, 0x0a, 0x19, 0x37, 0x56, 0x03, 0xac, 0x71, 0xea, 0xa9, 0x47, 0x88, 0x08, 0xf9, 0xa6, 0xe8, 0x10, 0xf5, 0x0a, 0xb4, 0x00, 0xd6, 0xac, 0x5d, 0x4f, 0x13, 0x4d, 0x8a, 0x7b, 0xd3, 0xde, 0x9e, 0x72, 0xa6, 0x96, 0x3e, 0x42, 0xa7, 0xf3, 0xab, 0xb7, 0x56, 0x8a, 0xdd, 0xe7, 0xd4, 0x97, 0xa6, 0xb4, 0x5b, 0xb3, 0x4f, 0xdb, 0xfc, 0x24, 0x6b, 0x13, 0x1f, 0xa5, 0xed, 0x4b, 0x44, 0xa8, 0xa1, 0x19, 0xee, 0x65, 0xa2, 0xd5, 0xd4, 0x38, 0x6d, 0x05, 0xb3, 0x2a, 0xa2, 0x08, 0x58, 0x9a, 0xa7, 0x33, 0xc8, 0x6b, 0xa7, 0xb6, 0x99, 0x33, 0xac, 0x1a, 0xd8, 0x3a, 0xcd, 0x15, 0x25, 0x56, 0xb5, 0x13, 0xcc, 0xf4, 0xef, 0xb0, 0x0b, 0x77, 0xc4, 0xf4, 0x1b, 0x3c, 0x9c, 0x29, 0x93, 0xd9, 0x20, 0x7a, 0x4a, 0x4a, 0x9d, 0xcd, 0x2d, 0x39, 0x5f, 0x7f, 0x2b, 0x8b, 0x04, 0xf0, 0x46, 0xde, 0x02, 0x08, 0xed, 0x87, 0xd6, 0x25, 0x46, 0xa8, 0xa3, 0x1c, 0xec, 0x28, 0x36, 0x3a, 0x98, 0x93, 0xac, 0x6d, 0xae, 0x3f, 0x32, 0x0b, 0xbd, 0x29, 0xa6, 0xd4, 0x47, 0x69, 0x0d, 0x27, 0x7d, 0x48, 0x15, 0x97, 0xc3, 0x36, 0x2b, 0x3d, 0x13, 0x3b, 0xde, 0x86, 0xa9, 0xaa, 0x7e, 0x5f, 0x7e, 0x1c, 0x49, 0xe4, 0x8a, 0x0b, 0x8d, 0x13, 0xd1, 0x8b, 0x8a, 0x1b, 0xa2, 0xfb, 0x08, 0x38, 0xa2, 0xb1, 0xdd, 0x50, 0x82, 0xeb, 0xe7, 0xb3, 0x79, 0x9c, 0x2d, 0xb1, 0xd7, 0xd3, 0x24, 0xf1, 0x60, 0xda, 0x59, 0xa8, 0x34, 0x42, 0xf9, 0x3b, 0x75, 0x7b, 0xf5, 0xce, 0xf3, 0xbc, 0xb7, 0xd6, 0x91, 0x4b, 0xae, 0xb8, 0x26, 0x67, 0x27, 0xf6, 0x06, 0x6f, 0x30, 0x8f, 0x93, 0x07, 0x7f, 0x7c, 0x5e, 0x49, 0xa3, 0x7a, 0xc8, 0x4f, 0xe6, 0x8b, 0x37, 0xa9, 0xb7, 0xd8, 0x38, 0x7a, 0x84, 0xe7, 0x2d, 0x5a, 0x42, 0x49, 0x6a, 0x3c, 0x2c, 0x2a, 0xcc, 0xf1, 0x66, 0x85, 0x39, 0xff, 0x89, 0xc2, 0x99, 0xf6, 0x50, 0x0c, 0x25, 0x6e, 0xe4, 0xc2, 0x2e, 0x59, 0x83, 0x99, 0xb1, 0x57, 0x7a, 0x87, 0x5a, 0x36, 0xb4, 0x6e, 0xd1, 0xd2, 0x5a, 0x28, 0x61, 0xed, 0x35, 0x6f, 0x6d, 0xc6, 0xde, 0xb6, 0x3a, 0x85, 0xef, 0x06, 0xef, 0xb2, 0xac, 0x50, 0xf0, 0x62, 0xf0, 0xe6, 0xe2, 0xc9, 0x48, 0x03, 0x02, 0x4d, 0x85, 0x8b, 0xa0, 0x64, 0x3a, 0x79, 0xde, 0xc6, 0xe6, 0x99, 0x15, 0xbe, 0xc1, 0x82, 0x6b, 0xac, 0x72, 0x03, 0x8d, 0xfe, 0x17, 0x5d, 0x99, 0x31, 0x78, 0x06, 0x93, 0x9b, 0x42, 0xdd, 0x10, 0x1f, 0x98, 0xf3, 0xe0, 0x02, 0x79, 0x5f, 0xe3, 0x72, 0xa6, 0xc6, 0x5b, 0x9a, 0x18, 0x82, 0x5b, 0x37, 0x2f, 0x91, 0x2b, 0x0e, 0x25, 0xc0, 0xca, 0xc4, 0x7d, 0xb6, 0xd2, 0xeb, 0x60, 0xce, 0x76, 0x42, 0x36, 0xf0, 0x5f, 0x8e, 0xe7, 0xcc, 0x91, 0x7b, 0x87, 0x2c, 0xaf, 0x63, 0x6c, 0x46, 0x3d, 0x04, 0xe1, 0x34, 0xb8, 0x6d, 0xf9, 0x08, 0xa6, 0xb1, 0x40, 0x25, 0xee, 0x2b, 0x3d, 0xbf, 0x29, 0x5e, 0x0b, 0xbf, 0xaf, 0xc1, 0x79, 0x68, 0x8d, 0xfe, 0x7e, 0x76, 0xc1, 0x74, 0xec, 0x93, 0x47, 0x06, 0xa5, 0x62, 0xe8, 0x7e, 0xd8, 0x77, 0xd5, 0x1f, 0xe9, 0xf9, 0x7d, 0x23, 0x1a, 0xcf, 0x22, 0x30, 0x27, 0x90, 0x24, 0x25, 0x48, 0x8f, 0x03, 0xae, 0x64, 0xc1, 0x8a, 0x80, 0x67, 0x63, 0xb6, 0x44, 0xff, 0x88, 0x31, 0x75, 0x2e, 0x02, 0x84, 0xca, 0x83, 0x48, 0x56, 0xeb, 0xda, 0x51, 0x5f, 0x89, 0x00, 0x8a, 0xd9, 0x1a, 0x91, 0x50, 0x9f, 0xcf, 0xf6, 0x9f, 0x43, 0x89, 0x56, 0xe0, 0xc8, 0xd9, 0xd4, 0x04, 0xd1, 0x5d, 0x8a, 0x52, 0x62, 0x01, 0xfd, 0x9f, 0x96, 0xf3, 0x05, 0xca, 0xdf, 0x4d, 0x6b, 0xc5, 0xaa, 0xd3, 0xb4, 0x6f, 0x93, 0x3d, 0xd6, 0x17, 0x6a, 0xe9, 0xd0, 0x6d, 0xbf, 0xf3, 0x6e, 0x29, 0xc5, 0x11, 0x9e, 0xc6, 0xa3, 0xa9, 0x2b, 0xfe, 0x9e, 0xfd, 0xc7, 0xf7, 0xa7, 0x77, 0xa7, 0x4e, 0x3a, 0x58, 0x37, 0x64, 0x97, 0x65, 0x88, 0xa2, 0xc3, 0x4a, 0x94, 0x9c, 0xe4, 0xd6, 0x7b, 0x3e, 0xd2, 0x45, 0x41, 0x6e, 0xff, 0x39, 0xc4, 0xd9, 0x11, 0x1f, 0xee, 0xc4, 0xc2, 0x11, 0x53, 0x26, 0xee, 0x84, 0xc1, 0x59, 0xe3, 0x48, 0x76, 0x2f, 0x54, 0xaf, 0x04, 0x39, 0x80, 0xd8, 0x0f, 0x7f, 0x7e, 0x7d, 0x6d, 0x11, 0xb3, 0xbe, 0x63, 0x18, 0xd9, 0xc4, 0xef, 0x56, 0x3c, 0x3e, 0x74, 0x42, 0xef, 0x06, 0x1f, 0x2f, 0x36, 0x7d, 0xed, 0x20, 0x66, 0x6b, 0x25, 0x3d, 0xe3, 0x65, 0x9e, 0x1a, 0x17, 0x12, 0x42, 0x28, 0x7e, 0xd6, 0x87, 0x18, 0x22, 0xa9, 0xe3, 0x02, 0x25, 0x32, 0x71, 0x8d, 0x2a, 0x61, 0x43, 0x7a, 0xd2, 0x2e, 0x1f, 0x4b, 0x8a, 0x27, 0xa1, 0xdb, 0x60, 0xfa, 0x04, 0x32, 0xaa, 0x32, 0x02, 0xe0, 0xa3, 0xb6, 0x93, 0xa8, 0x5d, 0xe2, 0x83, 0x53, 0x93, 0x35, 0x17, 0xe1, 0x52, 0xee, 0x40, 0x81, 0x7c, 0x17, 0x20, 0xf9, 0x90, 0xde, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbd, 0x07, 0xec, 0x79, 0x01, 0x00, 0x30, 0x40, 0x7b, 0x72, 0x2a, 0xee, 0x84, 0xd7, 0xa4, 0x09, 0x4a, 0x05, 0xac, 0x4a, 0xac, 0x61, 0xf7, 0xf9, 0x62, 0xd3, 0x8d, 0x35, 0xe0, 0x7d, 0x1e, 0x7c, 0x57, 0xe5, 0xe0, 0x7c, 0x5a, 0x5d, 0x7e, 0xa1, 0xf1, 0xa4, 0x26, 0xe4, 0x34, 0xf2, 0xc7, 0xc8, 0x9d, 0xfc, 0xfe, 0x9e, 0xc3, 0x98, 0x51, 0x60, 0x29, 0x10, 0xab, 0xd4, 0x3b, 0x52, 0x44, 0xb9, 0xd0, 0x7e, 0x60, 0x3b, 0xa1, 0x93, 0x91, 0xe2, 0x9d, 0x2f, 0x66, 0xbf, 0x15, 0x9e, 0xbc, 0x97, 0x12, 0xbf, 0x0b, 0x37, 0x64, 0x6d, 0x74, 0x45, 0x29, 0x6f, 0x64, 0x2f, 0xf0, 0x2f, 0x02, 0x14, 0xa2, 0xa8, 0xde, 0xbe, 0xe4, 0x53, 0x7a, 0x0d, 0x9d, 0x0c, 0xa3, 0x6f, 0xbc, 0x23, 0xcb, 0x42, 0x8c, 0x20, 0xc5, 0x36, 0x16, 0xf0, 0x97, 0x14, 0x6d, 0x7a, 0x47, 0x7a, 0xdc, 0xcf, 0xda, 0x7d, 0x5a, 0x85, 0xe7, 0x2b, 0xb6, 0xdf, 0x68, 0x74, 0x63, 0xd7, 0xc5, 0xeb, 0xd3, 0x2d, 0x32, 0x5c, 0xc2, 0x13, 0xd5, 0x43, 0xfa, 0x18, 0x62, 0x80, 0x50, 0x5d, 0x19, 0xed, 0xf4, 0x4f, 0x44, 0xa5, 0x59, 0x5c, 0xbc, 0x2a, 0x3f, 0x60, 0x00, 0xac, 0xb7, 0xcf, 0xed, 0x2b, 0x15, 0xcc, 0x22, 0x3a, 0x3f, 0xb1, 0x95, 0x86, 0xbf, 0xbc, 0xf5, 0x80, 0x82, 0xeb, 0xd3, 0xc1, 0x3d, 0x33, 0xac, 0x06, 0xd4, 0x98, 0x53, 0xe6, 0x3b, 0xdf, 0x5a, 0x8b, 0xb1, 0xd8, 0x6c, 0x2b, 0x55, 0x75, 0xc0, 0xf5, 0x64, 0x36, 0x15, 0xae, 0xad, 0x9a, 0xe1, 0x4f, 0x08, 0x99, 0xa1, 0x36, 0xd4, 0x5f, 0x6f, 0xdb, 0xd6, 0xc7, 0x55, 0x0f, 0xf9, 0x4d, 0x02, 0x30, 0xc1, 0x7a, 0xca, 0xee, 0x76, 0x00, 0x25, 0x6b, 0x62, 0x04, 0x19, 0xed, 0x9d, 0x54, 0x2d, 0x6a, 0x3a, 0x82, 0xe4, 0x8f, 0xe6, 0x1f, 0xe1, 0x22, 0x3b, 0x9c, 0x21, 0xd9, 0x5e, 0x7c, 0xf8, 0xfb, 0xa8, 0xe1, 0xc0, 0x77, 0x71, 0xa9, 0x5f, 0x3d, 0x42, 0x9f, 0x19, 0xf9, 0xfd, 0x6f, 0x52, 0x95, 0xc5, 0x62, 0x31, 0x13, 0xb6, 0x21, 0x4a, 0xa0, 0xb5, 0xef, 0xc8, 0xfc, 0xe2, 0x24, 0xb0, 0x8f, 0x7e, 0xdb, 0x3d, 0xd0, 0x54, 0x10, 0x6d, 0xd1, 0xdf, 0xb0, 0x40, 0x0b, 0xce, 0x53, 0x3f, 0xd5, 0xa9, 0x9c, 0x4f, 0x0d, 0x9c, 0x76, 0xe4, 0xdc, 0xc9, 0xb9, 0x0f, 0xb5, 0x8f, 0xe1, 0x13, 0xd6, 0xad, 0xde, 0x65, 0x06, 0x40, 0x39, 0x47, 0x50, 0xe9, 0x03, 0x6d, 0xe2, 0xa7, 0x4f, 0x56, 0x76, 0x39, 0x35, 0x3d, 0xcb, 0x02, 0x95, 0xde, 0x22, 0xd1, 0x19, 0x70, 0xc2, 0x06, 0x30, 0x7c, 0xfc, 0xf2, 0x00, 0x8c, 0x2a, 0x68, 0x8d, 0xd3, 0xa7, 0xe1, 0x89, 0x35, 0xbf, 0xb2, 0x93, 0x6d, 0x05, 0x20, 0xd7, 0x2a, 0xa2, 0x67, 0x59, 0x5c, 0x80, 0xf9, 0x53, 0x18, 0x69, 0x7b, 0x76, 0xbb, 0x71, 0x61, 0xfe, 0x3f, 0x51, 0x16, 0xd8, 0xf0, 0x89, 0x21, 0x58, 0xdf, 0x6a, 0xac, 0x34, 0xcd, 0x55, 0x58, 0xd0, 0x7a, 0xe7, 0x5e, 0xff, 0x75, 0xcb, 0x43, 0xcc, 0xea, 0x71, 0xb6, 0xf9, 0x14, 0xea, 0x5f, 0x36, 0x3c, 0x93, 0xa8, 0x4a, 0x6f, 0x6b, 0xd3, 0xa6, 0x66, 0x2a, 0xe7, 0x2d, 0x36, 0x7d, 0x33, 0x12, 0xc8, 0xf5, 0x8e, 0x2a, 0x33, 0x99, 0x85, 0x10, 0x7a, 0x26, 0x12, 0xe5, 0x41, 0x5f, 0xa7, 0xae, 0x75, 0x0e, 0x8c, 0x77, 0x15, 0x85, 0xf7, 0xd3, 0x7a, 0xd0, 0x48, 0x59, 0xd9, 0xd7, 0x54, 0x31, 0xde, 0x2c, 0xb1, 0xe0, 0x96, 0x47, 0x67, 0xcd, 0x13, 0x58, 0x80, 0x4a, 0x6c, 0x0e, 0x47, 0x0c, 0x10, 0xe2, 0x49, 0x58, 0x9a, 0xd6, 0x60, 0x5d, 0x7f, 0xab, 0x4b, 0x7a, 0x5c, 0x01, 0xb4, 0x69, 0xbe, 0xef, 0x96, 0x8b, 0x91, 0xf4, 0x68, 0xd6, 0xb2, 0x5b, 0x83, 0x1a, 0x36, 0x75, 0xa2, 0x9c, 0x6a, 0x35, 0x78, 0x48, 0xac, 0x1f, 0xb5, 0xea, 0x8c, 0x94, 0xfc, 0x36, 0xda, 0xdf, 0x9f, 0x96, 0x9c, 0xa5, 0x21, 0xf9, 0x0b, 0x83, 0xd8, 0x21, 0x08, 0x07, 0x33, 0x2c, 0xb2, 0x5a, 0x6e, 0x4e, 0x0f, 0x30, 0xc4, 0x09, 0xed, 0xe6, 0x71, 0x43, 0x6d, 0xe2, 0xfe, 0x15, 0xe0, 0x96, 0xb6, 0x3a, 0xe1, 0xb8, 0x47, 0x5d, 0xdf, 0x9b, 0xdd, 0xca, 0x7c, 0xb8, 0x3c, 0x3c, 0x6a, 0xc6, 0xb5, 0xb6, 0xc3, 0xff, 0xf0, 0xbe, 0xf0, 0x73, 0xe5, 0x54, 0xa1, 0x75, 0x86, 0x86, 0x70, 0x91, 0xed, 0x7c, 0x29, 0x98, 0x15, 0x4c, 0xdd, 0xa9, 0x70, 0x0f, 0x26, 0x4e, 0xde, 0xe9, 0x59, 0x04, 0xd5, 0x0c, 0x7c, 0xd4, 0xcf, 0xef, 0x40, 0xd5, 0x33, 0x2e, 0x5d, 0xaf, 0x5e, 0xd8, 0x01, 0x7e, 0x8c, 0x24, 0x46, 0xb7, 0xa8, 0xc2, 0xc6, 0xdc, 0x5f, 0x53, 0xd4, 0x2d, 0xec, 0xb6, 0xef, 0xa5, 0x82, 0x2a, 0x65, 0xe3, 0x4b, 0x88, 0x59, 0xdd, 0x53, 0x05, 0x87, 0x75, 0xe4, 0x42, 0x7d, 0x50, 0x30, 0xa0, 0x3b, 0x8c, 0x34, 0x1c, 0x53, 0x26, 0x4a, 0x1c, 0x09, 0x3c, 0xce, 0x0a, 0x10, 0x7e, 0xc1, 0x92, 0xdd, 0x66, 0x61, 0xdb, 0xad, 0x20, 0x0f, 0x33, 0xbb, 0x31, 0x0a, 0xdc, 0x42, 0x3e, 0xc9, 0x03, 0x42, 0x93, 0x00, 0x1c, 0x2f, 0x40, 0xa8, 0x16, 0xf9, 0xe9, 0x0b, 0x77, 0x15, 0xa7, 0x8d, 0x65, 0x75, 0x99, 0x21, 0x9a, 0xa0, 0xf8, 0x08, 0x34, 0x49, 0xd1, 0x56, 0xa4, 0x21, 0xc1, 0x9b, 0x02, 0xc6, 0x4b, 0x65, 0xe9, 0xf8, 0xa5, 0xc1, 0x0f, 0x8e, 0x22, 0x94, 0x5b, 0xc9, 0x7c, 0xb4, 0x6d, 0xf5, 0xbd, 0xb0, 0xdf, 0x8c, 0x82, 0xb1, 0xa9, 0x35, 0xc8, 0xe1, 0x7b, 0x62, 0x99, 0x3e, 0xf6, 0x69, 0x36, 0xd4, 0x0c, 0x41, 0x95, 0xb3, 0xf9, 0x66, 0x5c, 0x2b, 0x99, 0x6c, 0x9f, 0x18, 0x16, 0x58, 0x18, 0x47, 0x25, 0xbd, 0xa0, 0x51, 0x56, 0x35, 0x0b, 0x5a, 0x26, 0xbe, 0xc8, 0xa0, 0xde, 0xfe, 0xdb, 0xcf, 0x75, 0x93, 0x13, 0x70, 0xec, 0xd2, 0x8e, 0xfe, 0xe3, 0xb4, 0xf3, 0x6f, 0x6d, 0xcb, 0xf3, 0x33, 0x4d, 0x75, 0xf8, 0x03, 0x25, 0xb6, 0x14, 0x02, 0x4e, 0x63, 0x93, 0x01, 0x5b, 0x90, 0xc5, 0xed, 0x76, 0x67, 0xe6, 0xbc, 0x21, 0xd8, 0x35, 0x59, 0x15, 0xc7, 0xa1, 0x65, 0x29, 0xb2, 0x99, 0xd5, 0x9b, 0xe9, 0xf2, 0xb7, 0x22, 0xd7, 0xe2, 0xaf, 0x81, 0xf3, 0x87, 0xf3, 0xb3, 0x59, 0x84, 0xd8, 0xc3, 0x2d, 0x9a, 0x31, 0xf9, 0x31, 0x51, 0x1b, 0xed, 0x42, 0x15, 0xf7, 0x9f, 0xa2, 0x5d, 0xa1, 0xb8, 0x42, 0xbc, 0x30, 0x7d, 0x6c, 0xf5, 0xcb, 0x30, 0x84, 0x70, 0x61, 0xcf, 0xcb, 0xaa, 0x50, 0x79, 0x48, 0x7f, 0x3c, 0xf5, 0x4b, 0x66, 0xb8, 0x10, 0x34, 0x00, 0x78, 0xcc, 0x67, 0x93, 0x21, 0xae, 0x9e, 0x48, 0x06, 0x8c, 0xfc, 0x55, 0x54, 0xb0, 0xa1, 0x62, 0x87, 0x3d, 0x8b, 0xce, 0x27, 0x14, 0x10, 0xa7, 0x1e, 0xbd, 0x49, 0x7b, 0x38, 0x04, 0x23, 0x57, 0x8e, 0x50, 0x00, 0x94, 0xf1, 0xef, 0x0c, 0x4a, 0xa3, 0xc7, 0xc4, 0x8a, 0xdb, 0x3a, 0x48, 0xb3, 0xf4, 0x2f, 0x71, 0x8c, 0x44, 0x78, 0xce, 0xeb, 0xee, 0x1a, 0xfe, 0x1c, 0x38, 0x34, 0x06, 0x51, 0x33, 0x6e, 0x9e, 0xbd, 0xc3, 0x4f, 0x92, 0x3e, 0x47, 0xcb, 0xb2, 0xa4, 0x86, 0xec, 0xea, 0xfe, 0x8d, 0x7b, 0x89, 0x81, 0xa2, 0xea, 0xc3, 0xe5, 0x94, 0xfd, 0xf5, 0x5b, 0xe6, 0xef, 0x49, 0x6c, 0xb6, 0x0f, 0xa8, 0x70, 0x5a, 0x06, 0x2a, 0x5f, 0x06, 0x58, 0x6a, 0x33, 0x10, 0xc6, 0x6e, 0x21, 0x8b, 0x9b, 0x15, 0x52, 0x51, 0x15, 0x21, 0xf6, 0xce, 0x76, 0x6c, 0xc9, 0x07, 0x6a, 0xcd, 0x68, 0xba, 0xbd, 0xba, 0x10, 0x90, 0xb0, 0xc1, 0xb0, 0xc7, 0x54, 0x43, 0x4f, 0xc7, 0xaf, 0x2e, 0x3e, 0x79, 0xab, 0x88, 0xa5, 0x71, 0x06, 0x10, 0x41, 0x2c, 0xbe, 0x54, 0x80, 0xf3, 0xba, 0xe4, 0x48, 0x33, 0xa8, 0xa1, 0x08, 0x51, 0x4d, 0x37, 0xf6, 0x45, 0xc6, 0x4b, 0x91, 0x8b, 0x6e, 0xf8, 0xbd, 0x38, 0x6e, 0x8c, 0x25, 0x3c, 0x31, 0xaa, 0xad, 0x15, 0x2f, 0x52, 0x1c, 0x95, 0xdc, 0x59, 0x57, 0x6e, 0xa5, 0x60, 0xc4, 0x9f, 0x43, 0x61, 0xbb, 0x0f, 0xdd, 0x3f, 0x16, 0xd3, 0xb2, 0x0e, 0x46, 0xfd, 0x4a, 0xfc, 0x80, 0xfb, 0x6b, 0xff, 0xe5, 0xc2, 0x47, 0xc1, 0xbc, 0x6d, 0xae, 0x66, 0x1f, 0x07, 0x2a, 0x2e, 0xb5, 0x8f, 0x58, 0x09, 0x4b, 0x89, 0xe8, 0x93, 0x82, 0xa8, 0x0b, 0x26, 0xca, 0x50, 0x48, 0xea, 0x6b, 0x0d, 0xee, 0x12, 0x5a, 0x3f, 0xaa, 0xad, 0x04, 0x90, 0xf4, 0xbb, 0x73, 0xf2, 0x54, 0x76, 0x4f, 0x48, 0xb9, 0xed, 0xb9, 0xeb, 0x5c, 0x70, 0xf9, 0xa9, 0xf0, 0x6a, 0x7a, 0x0d, 0x16, 0x9a, 0x9c, 0xe5, 0x59, 0xda, 0x3e, 0x6f, 0x1e, 0xd9, 0x1d, 0xa4, 0x55, 0x7e, 0x65, 0x75, 0xe3, 0xd5, 0x0d, 0x09, 0xf7, 0xbc, 0xd9, 0x3f, 0xd2, 0xb0, 0x26, 0x08, 0xb8, 0x79, 0xcd, 0x64, 0x06, 0x85, 0xce, 0x0a, 0xaf, 0x42, 0x89, 0x07, 0x8d, 0xba, 0xb2, 0xe6, 0x5c, 0x45, 0x4f, 0x2a, 0x39, 0x1f, 0x6b, 0x21, 0x05, 0x1c, 0x46, 0x64, 0x06, 0xe4, 0x37, 0x89, 0xa1, 0x64, 0x7d, 0xdb, 0x0d, 0x58, 0xc0, 0x17, 0x54, 0x28, 0xf7, 0x90, 0x07, 0x79, 0xf3, 0x26, 0x78, 0x1d, 0xcd, 0x00, 0x5f, 0x5a, 0xe9, 0xf7, 0x3c, 0xa6, 0x5d, 0x0f, 0xda, 0x4f, 0xdd, 0x88, 0xcd, 0xb1, 0x89, 0x48, 0xc6, 0xf2, 0x34, 0xbb, 0x13, 0x61, 0x07, 0x67, 0xbe, 0xf5, 0x94, 0xc7, 0xfd, 0x86, 0xc0, 0x38, 0x01, 0xc0, 0x0e, 0x01, 0x58, 0xe7, 0x3f, 0xc7, 0x52, 0xe8, 0x50, 0xf2, 0x41, 0x5b, 0x33, 0xd9, 0x6d, 0x69, 0xf3, 0xb8, 0x1c, 0xb3, 0xfc, 0xbe, 0x09, 0xbe, 0xce, 0xc1, 0x21, 0x75, 0x4b, 0x6a, 0x6e, 0xc1, 0x61, 0xce, 0x79, 0x61, 0xd2, 0xe6, 0x97, 0x5b, 0x48, 0x48, 0xe5, 0xd0, 0x02, 0x0e, 0xe5, 0x05, 0xc6, 0xe5, 0xff, 0xda, 0xdf, 0x99, 0x63, 0x1b, 0x5c, 0xa1, 0x01, 0x50, 0xd8, 0x7f, 0x9a, 0xff, 0x70, 0xff, 0x23, 0x88, 0xbf, 0x9d, 0xf5, 0x08, 0x03, 0xa1, 0x88, 0xf1, 0xc0, 0xbb, 0xb3, 0x42, 0x7d, 0x2e, 0xb3, 0x84, 0x7a, 0xd4, 0x6a, 0x05, 0x7e, 0x86, 0x9b, 0xf5, 0x13, 0xb6, 0x1d, 0x51, 0xcc, 0x47, 0x40, 0xc5, 0x73, 0xee, 0xde, 0x02, 0x45, 0xa6, 0xd9, 0x16, 0x7c, 0x08, 0x01, 0xd2, 0xeb, 0x90, 0x92, 0x54, 0x5c, 0x1a, 0xe1, 0x29, 0xf8, 0x23, 0xd2, 0xb4, 0xec, 0xa1, 0x32, 0xc0, 0x09, 0x70, 0x1a, 0x77, 0x21, 0xb1, 0xe5, 0x11, 0x52, 0x96, 0x70, 0x07, 0x88, 0x73, 0x9c, 0x99, 0xe6, 0x20, 0x5b, 0xe2, 0xda, 0xed, 0xae, 0xea, 0x12, 0xc1, 0x6e, 0x50, 0x99, 0x27, 0xb9, 0x8c, 0xc1, 0x58, 0x62, 0xec, 0xbd, 0x92, 0xc4, 0xb0, 0xf4, 0x41, 0xc4, 0x04, 0x7b, 0xca, 0xf8, 0xaf, 0x4a, 0x03, 0x2f, 0xb9, 0x0b, 0xa3, 0xde, 0x5c, 0x99, 0x3c, 0x19, 0x01, 0x90, 0x81, 0x35, 0x28, 0x91, 0xed, 0x2c, 0x6c, 0x02, 0x0f, 0x57, 0x10, 0x7a, 0x0f, 0x33, 0xbd, 0x2e, 0x34, 0x28, 0x61, 0xf6, 0x74, 0x96, 0x58, 0xca, 0x64, 0x9d, 0x4a, 0xdb, 0x03, 0x64, 0x74, 0x8f, 0x3f, 0xd0, 0x39, 0x1a, 0x36, 0xf1, 0x2e, 0x6c, 0x7c, 0xa0, 0x13, 0xb6, 0xf8, 0xfe, 0x5a, 0xc2, 0x27, 0xe7, 0x30, 0xcc, 0xc3, 0x78, 0x31, 0xb7, 0x2f, 0x40, 0x31, 0xad, 0x1a, 0xc1, 0xca, 0x97, 0x43, 0x53, 0x9b, 0x00, 0x4c, 0x8d, 0x61, 0x3d, 0x00, 0xc2, 0x52, 0xfd, 0x8b, 0x4b, 0x74, 0x97, 0x70, 0x93, 0xd1, 0xb5, 0x52, 0x25, 0xad, 0x36, 0xd4, 0x3c, 0x42, 0x67, 0x19, 0x88, 0x94, 0xeb, 0xc2, 0x30, 0x5c, 0xec, 0x5b, 0x3f, 0x24, 0x7a, 0x98, 0x07, 0x17, 0x29, 0xea, 0x23, 0x1a, 0x54, 0x30, 0x2d, 0x2b, 0x99, 0x99, 0x4f, 0x25, 0x6d, 0xf9, 0x2c, 0x63, 0xe6, 0x2c, 0xf4, 0xdd, 0x15, 0x48, 0x79, 0xbf, 0x8d, 0xa3, 0xad, 0x8e, 0xed, 0x11, 0xdb, 0x63, 0x99, 0xca, 0x72, 0xcd, 0xe5, 0xdb, 0x5c, 0x5c, 0x69, 0x21, 0x0b, 0xea, 0x48, 0x17, 0xd0, 0x2e, 0x88, 0x13, 0x23, 0x20, 0xe0, 0xb2, 0xe7, 0x39, 0x91, 0x7b, 0xdf, 0xa6, 0x24, 0x0f, 0xce, 0xe8, 0x2e, 0x75, 0x0a, 0x84, 0x77, 0x3a, 0x68, 0xb3, 0x18, 0x8a, 0xd4, 0x3e, 0x77, 0x7b, 0x09, 0xf0, 0x32, 0x22, 0x1a, 0x4e, 0x5d, 0x34, 0xd5, 0x77, 0xb0, 0x4a, 0x3f, 0x6c, 0x70, 0x0a, 0x97, 0x10, 0x4f, 0xc9, 0xa1, 0xa9, 0x7d, 0x68, 0x3f, 0xb6, 0x9c, 0x86, 0x89, 0x59, 0x6d, 0x48, 0xdf, 0xac, 0x4b, 0x40, 0xbf, 0xc9, 0xe1, 0x52, 0x42, 0x56, 0xa0, 0x8d, 0xa0, 0xce, 0xe6, 0x4d, 0x0d, 0xf4, 0xe5, 0x37, 0xcf, 0x19, 0xad, 0xd6, 0x74, 0x1e, 0xf1, 0xdd, 0x6b, 0x64, 0x61, 0x71, 0x7d, 0x15, 0xc1, 0xe9, 0xdd, 0x6b, 0x04, 0xe9, 0xd3, 0xe9, 0x20, 0xd6, 0x35, 0xb3, 0x60, 0xf8, 0x2d, 0x66, 0x5e, 0xc7, 0x12, 0x28, 0x02, 0x48, 0x3b, 0xd6, 0x14, 0x69, 0x20, 0x81, 0x50, 0xc1, 0x30, 0x97, 0x02, 0x2d, 0x25, 0x7f, 0xa3, 0x25, 0xd0, 0x77, 0xf1, 0xc9, 0x96, 0xf4, 0x7b, 0xfd, 0x18, 0xe8, 0xac, 0x11, 0xcb, 0x9a, 0xba, 0xd7, 0x70, 0x00, 0x0b, 0x1a, 0xb4, 0xc1, 0xf8, 0xd5, 0x6c, 0x4f, 0x03, 0xb1, 0x28, 0xc6, 0xde, 0x8a, 0x23, 0x7a, 0xd7, 0x20, 0xbf, 0x5d, 0x99, 0x24, 0x13, 0xb1, 0x46, 0x44, 0x3f, 0xaa, 0x58, 0xef, 0x8e, 0xf0, 0xda, 0xf1, 0x93, 0x2c, 0xdd, 0x1f, 0xc7, 0x0e, 0x3c, 0xab, 0x5f, 0x74, 0x19, 0xed, 0x5e, 0xa1, 0x9b, 0xa6, 0x12, 0xb0, 0xdf, 0x09, 0x85, 0xaf, 0x25, 0x20, 0x97, 0x07, 0xa3, 0x50, 0xb9, 0x2e, 0x8e, 0x06, 0x91, 0xbd, 0x46, 0xe2, 0xfc, 0x5a, 0xa9, 0xe7, 0x24, 0x30, 0xfd, 0x7a, 0xb2, 0xce, 0x0b, 0x3d, 0x51, 0xa2, 0x37, 0x1a, 0xfd, 0x7f, 0xc7, 0xfd, 0xe1, 0xd2, 0xa4, 0x0f, 0xb5, 0x78, 0x36, 0x84, 0xe4, 0x62, 0x40, 0x3a, 0xeb, 0x6c, 0xc9, 0xc7, 0xb7, 0x17, 0x76, 0xad, 0xf9, 0x18, 0xf6, 0xd9, 0xa5, 0xdc, 0x4e, 0x9c, 0x2b, 0x77, 0x2e, 0xc4, 0x0e, 0xa1, 0xaa, 0x95, 0xed, 0xbd, 0xe3, 0xa9, 0x25, 0x00, 0x99, 0x13, 0x94, 0x32, 0xa1, 0x3c, 0x3b, 0xb9, 0xb6, 0x5b, 0xad, 0xca, 0x33, 0x84, 0x9b, 0xfb, 0x96, 0xa4, 0xe2, 0x9c, 0xe1, 0xf2, 0xf3, 0x7f, 0x47, 0x9c, 0x6e, 0x23, 0xae, 0xc9, 0x53, 0x6d, 0xe5, 0x2f, 0x21, 0x4e, 0xb8, 0xd0, 0xb7, 0x1a, 0x30, 0xa9, 0xf0, 0x62, 0x9a, 0x5a, 0x22, 0x91, 0x43, 0x20, 0x1d, 0xac, 0xe8, 0x9a, 0x49, 0xe9, 0x53, 0x36, 0xeb, 0x02, 0xb1, 0x4a, 0xd1, 0x74, 0x7b, 0x23, 0xda, 0x15, 0x1b, 0x9e, 0x17, 0xb2, 0x9c, 0x11, 0x83, 0x93, 0x09, 0x8c, 0x8f, 0x21, 0x51, 0xce, 0xf8, 0x15, 0xd2, 0x62, 0xae, 0xd2, 0xe8, 0xc8, 0xb7, 0xe6, 0x0b, 0xa7, 0x63, 0xd4, 0x77, 0x57, 0x2f, 0x91, 0x59, 0x55, 0x29, 0x6e, 0xf8, 0x61, 0xd0, 0x43, 0x5f, 0x5f, 0x9a, 0x26 }; +constexpr AccessUnit AC3_SKIP_BYTES_EXPECTED_AU = { 0x15f90, 0x153d5, false, 0, {}, { 0x8e, 0x59, 0x01, 0x62, 0x21, 0xbd, 0x77, 0x65, 0x7b, 0xfe, 0x1e, 0xb1, 0x20, 0x49, 0xce, 0x3f, 0xed, 0x98, 0xe4, 0x99 } }; + +const std::vector LPCM_SKIP_BYTES_STREAM = { 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xf3, 0x3b, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0x7a, 0x01, 0xe0, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6a, 0x00, 0x1a, 0x00, 0x80, 0x20, 0x90, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x00, 0x01, 0xbd, 0x07, 0x5a, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xa7, 0xab, 0x1e, 0x73, 0x3b, 0x40, 0xe6, 0xa3, 0x12, 0x99, 0xcf, 0x16, 0x2e, 0x6d, 0x67, 0x2a, 0xa2, 0xb4, 0xf7, 0xa2, 0x3c, 0xdf, 0x11, 0xe7, 0x98, 0x98, 0xef, 0x5c, 0x93, 0xbf, 0x51, 0x56, 0xaa, 0x5c, 0x26, 0x2d, 0x8e, 0xc3, 0x34, 0x23, 0x45, 0x68, 0x25, 0x5c, 0x60, 0x1a, 0xa9, 0x35, 0x12, 0xa7, 0x95, 0x8f, 0x35, 0x23, 0x2e, 0x00, 0x85, 0x49, 0x0c, 0xe8, 0xa6, 0xbc, 0x42, 0xe5, 0xb8, 0x18, 0xb0, 0x29, 0x86, 0x1c, 0xb6, 0x9d, 0xa0, 0x5c, 0xa9, 0xea, 0xee, 0x40, 0xc2, 0xbc, 0x80, 0x4c, 0x63, 0xe7, 0xab, 0xe4, 0xf1, 0x41, 0xc0, 0x15, 0x9e, 0x52, 0xeb, 0x12, 0xd9, 0x34, 0x02, 0x6b, 0x50, 0x3c, 0x4c, 0x38, 0xa5, 0x53, 0x99, 0xac, 0x57, 0x0b, 0x29, 0xd9, 0x6f, 0xd8, 0x3c, 0x96, 0xfa, 0x05, 0x45, 0xc7, 0x66, 0x43, 0x1e, 0x88, 0x3b, 0xe5, 0xbe, 0xed, 0xd0, 0x3b, 0x42, 0x59, 0xf8, 0x84, 0x52, 0xab, 0xc8, 0x7e, 0x2f, 0xb5, 0xdd, 0x8c, 0xf7, 0xc2, 0xe1, 0xe1, 0xeb, 0x1a, 0x25, 0x47, 0xbf, 0xd1, 0x8c, 0x5f, 0x49, 0x51, 0x2c, 0x71, 0x0e, 0x5c, 0x51, 0x36, 0x86, 0x89, 0xcf, 0x21, 0x1c, 0x6d, 0xd6, 0x1c, 0x36, 0xf9, 0xa1, 0xc0, 0xd2, 0xbc, 0xc0, 0x77, 0x85, 0x11, 0xe7, 0x11, 0xe8, 0x6b, 0x56, 0xb6, 0xbe, 0x41, 0x6f, 0x4b, 0x5f, 0x52, 0xfc, 0xa7, 0x30, 0x48, 0x30, 0x39, 0x44, 0xdc, 0x7d, 0xed, 0x56, 0x1b, 0xb8, 0x7c, 0xc7, 0x6d, 0x26, 0x7c, 0x56, 0x5b, 0x72, 0xca, 0xa2, 0x65, 0xab, 0x2b, 0xcf, 0x50, 0xb6, 0x49, 0xc9, 0xa8, 0xe7, 0x52, 0xf8, 0x84, 0xa9, 0xf5, 0x76, 0xb6, 0x5f, 0x78, 0x09, 0xe5, 0xef, 0x1b, 0x79, 0x5d, 0xa0, 0x17, 0xfe, 0x77, 0x31, 0xdc, 0xe4, 0xf1, 0x66, 0x67, 0xa1, 0x98, 0x66, 0xc8, 0xf8, 0x16, 0x99, 0x3f, 0xe7, 0xd2, 0xfc, 0x81, 0x72, 0x20, 0x0f, 0x06, 0xa0, 0x44, 0xc6, 0x7a, 0x1d, 0xfa, 0x30, 0xb1, 0x73, 0x8d, 0xbf, 0xb7, 0xb8, 0xa4, 0x57, 0xd3, 0x2d, 0x58, 0x98, 0xa7, 0x2c, 0x3e, 0x0d, 0xba, 0x5b, 0x6a, 0x21, 0x0f, 0x0f, 0xa3, 0x18, 0xa5, 0x3c, 0x47, 0x70, 0xfc, 0x7e, 0x95, 0x4d, 0xfa, 0xfc, 0x65, 0xed, 0xcd, 0x3f, 0x7a, 0x3f, 0xa0, 0x40, 0xf3, 0x1b, 0x4c, 0x38, 0xa2, 0xb5, 0x55, 0x07, 0x27, 0x41, 0xd3, 0x34, 0x2a, 0xf6, 0x25, 0xd6, 0x24, 0xd4, 0x86, 0xf8, 0x64, 0xe1, 0xe4, 0x35, 0x6e, 0xbf, 0x96, 0xaa, 0xcf, 0xd7, 0xc1, 0x7c, 0xf0, 0x70, 0x9e, 0x85, 0xa9, 0x74, 0xe4, 0xf2, 0x88, 0xbc, 0x07, 0xdf, 0x07, 0x1b, 0x1d, 0x3a, 0x33, 0x8f, 0x82, 0x7e, 0x7f, 0x4a, 0xa5, 0x10, 0xba, 0x6f, 0x8c, 0x41, 0x67, 0xc9, 0xee, 0x56, 0xf9, 0xcd, 0x08, 0x0e, 0x9f, 0xa3, 0x7e, 0x75, 0xb2, 0x24, 0xe7, 0x20, 0xec, 0xea, 0xe5, 0x06, 0xf1, 0xef, 0xde, 0x96, 0xe4, 0x59, 0xb8, 0xcf, 0xfd, 0x69, 0x2e, 0x5e, 0x68, 0xb5, 0xa1, 0x18, 0xdd, 0x1a, 0x7b, 0x63, 0xb3, 0x0d, 0x81, 0x40, 0x6d, 0x3f, 0xb5, 0x1c, 0xf3, 0xbf, 0x9c, 0xad, 0xff, 0xf9, 0x0d, 0x5a, 0x73, 0x56, 0xdb, 0x0d, 0x91, 0x4d, 0x00, 0x6f, 0x5b, 0x2e, 0x1c, 0xdf, 0x8e, 0xf6, 0x6b, 0xa8, 0xf8, 0xf2, 0x8d, 0x53, 0x23, 0x09, 0xb5, 0x0d, 0x97, 0xe5, 0x23, 0x77, 0x22, 0x64, 0x04, 0x77, 0xf3, 0xf9, 0x11, 0xb4, 0x75, 0xf0, 0x88, 0xf9, 0x30, 0xba, 0x60, 0x9c, 0x24, 0xb3, 0xd0, 0x95, 0x65, 0x07, 0x87, 0x07, 0xe5, 0xb0, 0x30, 0x3e, 0xb9, 0x9e, 0x1e, 0x80, 0x42, 0x9c, 0x3d, 0x2f, 0x0c, 0x72, 0xa0, 0x06, 0x4a, 0x5b, 0x52, 0x92, 0x38, 0xd5, 0x36, 0x15, 0xd9, 0x55, 0x25, 0x76, 0xd6, 0x74, 0x96, 0x04, 0x67, 0x96, 0x73, 0x11, 0x9c, 0x1f, 0xf9, 0xb7, 0x6c, 0xbf, 0xb7, 0x58, 0x4c, 0x62, 0x13, 0x97, 0x56, 0xca, 0xeb, 0xe5, 0x2a, 0xee, 0x28, 0xe2, 0x0c, 0x97, 0x6b, 0x2a, 0x09, 0xd5, 0x28, 0x4a, 0xff, 0x52, 0xd0, 0xfa, 0xea, 0x91, 0xe0, 0xdf, 0xd0, 0xa3, 0xf2, 0x5c, 0x24, 0xe0, 0x38, 0x4e, 0x83, 0xad, 0xe8, 0xaf, 0x1f, 0x68, 0x87, 0x72, 0x40, 0xe6, 0x25, 0x26, 0xa2, 0x3a, 0xed, 0x2a, 0xab, 0xae, 0x9b, 0x83, 0xae, 0x11, 0xc4, 0x8f, 0xc5, 0xcd, 0xf6, 0x39, 0xe9, 0x74, 0x22, 0x69, 0x5d, 0xab, 0xe0, 0xc6, 0x96, 0x9b, 0x66, 0x05, 0x1b, 0x63, 0x5c, 0x70, 0x29, 0x27, 0xd9, 0x4c, 0x09, 0xaa, 0x2d, 0x48, 0x59, 0xb1, 0x5b, 0x33, 0xc1, 0x7b, 0x4b, 0x80, 0xd3, 0x1f, 0x27, 0x78, 0x18, 0x9a, 0x6c, 0x0e, 0x72, 0xd0, 0x9c, 0xb2, 0x68, 0xe5, 0x9c, 0xa6, 0x08, 0x93, 0x25, 0xa9, 0x5e, 0x78, 0xe4, 0xfb, 0xbf, 0x74, 0x1f, 0x0a, 0x62, 0x9b, 0x01, 0x58, 0x02, 0x51, 0xe1, 0x5f, 0x88, 0x87, 0x2d, 0x84, 0xf7, 0x48, 0xc5, 0x60, 0x15, 0xf5, 0xf4, 0xf6, 0x8e, 0xec, 0x4d, 0x90, 0x90, 0x7e, 0x1f, 0x5f, 0x18, 0x55, 0x4d, 0x27, 0x69, 0xd2, 0xa9, 0x7a, 0x75, 0xf1, 0x2f, 0x56, 0x28, 0xb4, 0xc4, 0x35, 0xd2, 0x35, 0x41, 0xcf, 0x36, 0xd0, 0xf9, 0x26, 0xef, 0x12, 0x12, 0xa3, 0x2c, 0x57, 0x45, 0x4e, 0xff, 0x40, 0xe7, 0x73, 0xba, 0x76, 0x58, 0x34, 0x12, 0x59, 0x34, 0xea, 0x15, 0x95, 0xda, 0x45, 0x0f, 0xbf, 0x32, 0x8e, 0x01, 0x68, 0xc2, 0x8b, 0x42, 0x58, 0x78, 0xd8, 0x62, 0xd1, 0xbe, 0xb5, 0x77, 0x17, 0xb1, 0xa7, 0x5d, 0x93, 0xaa, 0x69, 0xa2, 0x57, 0x56, 0xfb, 0x10, 0xd2, 0x19, 0xeb, 0x22, 0x00, 0x80, 0x03, 0xd1, 0x63, 0xec, 0x14, 0x83, 0x86, 0xc8, 0x7a, 0x05, 0xf0, 0xf6, 0x94, 0xe2, 0xae, 0x36, 0x54, 0x81, 0xea, 0xbb, 0x8d, 0xd3, 0x2c, 0x3f, 0xbe, 0x80, 0x48, 0x30, 0x71, 0xdf, 0x08, 0xd7, 0x69, 0x25, 0x1a, 0x96, 0x3e, 0x90, 0xd9, 0x8f, 0x27, 0x8d, 0xe9, 0x60, 0x01, 0x09, 0xd0, 0xc3, 0xdd, 0x75, 0xed, 0x2f, 0xaa, 0x35, 0x90, 0xdf, 0xba, 0x6f, 0x07, 0xd2, 0x36, 0x83, 0xda, 0xa6, 0xcb, 0x9f, 0x9a, 0x64, 0x1e, 0x2d, 0x00, 0x9b, 0xd2, 0x15, 0x28, 0x70, 0x24, 0x18, 0x38, 0x69, 0x79, 0xaf, 0xc4, 0x2a, 0x60, 0x3e, 0xac, 0x66, 0xcd, 0x89, 0x55, 0xb6, 0xad, 0xa9, 0x6c, 0x21, 0x0c, 0x06, 0xa7, 0x7f, 0x5d, 0x00, 0x20, 0x03, 0xc0, 0x5e, 0x4b, 0x9f, 0x39, 0x9f, 0x98, 0xff, 0x34, 0xc6, 0x4b, 0x57, 0xde, 0x47, 0x1f, 0x4d, 0x26, 0x21, 0xa9, 0x97, 0x5e, 0x56, 0xab, 0x3f, 0xe0, 0x44, 0xb4, 0x92, 0x35, 0x96, 0xd2, 0x1f, 0x8d, 0xcb, 0x24, 0x69, 0x93, 0x93, 0x95, 0x1c, 0xec, 0x78, 0x11, 0xe4, 0xec, 0x8d, 0xfa, 0x4c, 0x4a, 0x2d, 0xb1, 0x33, 0xe2, 0xef, 0x74, 0xbb, 0xd1, 0x6a, 0xec, 0xcd, 0x77, 0x5d, 0x20, 0x8a, 0x26, 0x63, 0xba, 0x51, 0x95, 0x4c, 0xc8, 0x1f, 0x56, 0xa5, 0x5a, 0x83, 0xe3, 0x32, 0xc3, 0x64, 0x11, 0x45, 0x4d, 0x4f, 0xe9, 0x3f, 0x9c, 0x16, 0x3d, 0xa8, 0x2c, 0xe4, 0x86, 0xa8, 0x8b, 0x27, 0xce, 0xd3, 0x48, 0xda, 0xb9, 0x85, 0xbe, 0x2a, 0xf8, 0x52, 0x1d, 0x69, 0xb1, 0x3a, 0x75, 0xd6, 0xa8, 0xa9, 0x91, 0xb0, 0x35, 0x73, 0xe9, 0x92, 0x54, 0x56, 0x06, 0x10, 0x5b, 0xb0, 0x07, 0x18, 0x1c, 0x6b, 0x3d, 0x8f, 0x8b, 0x60, 0xf9, 0x21, 0x2e, 0xa8, 0x07, 0x51, 0xd7, 0x8f, 0x7e, 0x28, 0x8e, 0x39, 0xc6, 0x23, 0x9d, 0x1e, 0x17, 0x37, 0x1d, 0xef, 0xbf, 0x0c, 0x81, 0x8e, 0xfd, 0xc6, 0xf8, 0x1d, 0x3a, 0xfb, 0xad, 0x61, 0xed, 0xae, 0x27, 0xf4, 0x76, 0x79, 0x6c, 0xff, 0xbf, 0x26, 0x99, 0x7b, 0x69, 0x75, 0x0d, 0x36, 0xd3, 0xd0, 0x70, 0x11, 0x51, 0x18, 0x17, 0x43, 0x48, 0xdf, 0xa3, 0x82, 0x17, 0xaf, 0xd2, 0x6f, 0x03, 0x40, 0xe7, 0xa5, 0x7f, 0xa2, 0x1a, 0x39, 0x8f, 0xdd, 0xf0, 0x99, 0x2a, 0x79, 0x83, 0x15, 0xc3, 0xed, 0xfb, 0x80, 0x6a, 0xf8, 0xd3, 0xb1, 0x38, 0x51, 0xae, 0xd5, 0xde, 0x42, 0xc5, 0xd7, 0x99, 0x06, 0x45, 0x52, 0xe8, 0x13, 0x1d, 0xd5, 0xb9, 0xa1, 0x10, 0x61, 0xef, 0x08, 0x11, 0x79, 0x7c, 0xe2, 0x3e, 0x21, 0x6b, 0xf4, 0xfb, 0x9f, 0x92, 0x53, 0xff, 0xf6, 0xce, 0x4b, 0x61, 0x48, 0x00, 0xf7, 0xec, 0xb2, 0x2e, 0x96, 0x49, 0x49, 0x79, 0x07, 0xc9, 0x45, 0xce, 0xfb, 0xdf, 0x86, 0x89, 0xc5, 0x91, 0xff, 0x6a, 0xd9, 0x6c, 0xba, 0x8d, 0x5c, 0xd1, 0x69, 0x58, 0x68, 0x98, 0xd9, 0x7c, 0xcc, 0x5c, 0xa3, 0x80, 0x78, 0x03, 0xf5, 0x83, 0xea, 0x40, 0x59, 0x16, 0x32, 0x28, 0xc0, 0x6b, 0x73, 0x1b, 0x4a, 0x30, 0xf5, 0x95, 0x8f, 0xd6, 0x29, 0xb3, 0x56, 0x25, 0x3a, 0x6e, 0xff, 0x47, 0x02, 0xe8, 0x25, 0xc2, 0x8b, 0x44, 0x1a, 0xfb, 0x68, 0xed, 0x59, 0x47, 0x90, 0x3a, 0x12, 0x93, 0x8b, 0xda, 0x54, 0x3b, 0x1d, 0x7b, 0x93, 0x8d, 0xba, 0x86, 0x88, 0x0e, 0x65, 0xfd, 0x99, 0x8f, 0xdb, 0xb7, 0x5c, 0x8b, 0x26, 0x9c, 0xdb, 0x7e, 0xe5, 0x9c, 0xa1, 0x14, 0xfb, 0x79, 0xcb, 0x6a, 0x6f, 0xa0, 0x93, 0xbc, 0xaa, 0xb4, 0x1d, 0x46, 0x54, 0x81, 0x6f, 0x23, 0x92, 0x71, 0xe5, 0x73, 0x5d, 0xc4, 0x92, 0x26, 0x23, 0x2a, 0x43, 0x17, 0x06, 0x6e, 0x34, 0x68, 0x5e, 0x5a, 0x9c, 0x49, 0x49, 0x11, 0xa3, 0x9a, 0x76, 0x6d, 0x67, 0x09, 0x7f, 0x2f, 0x1e, 0xa5, 0x70, 0x0a, 0x89, 0x09, 0x51, 0xe0, 0x33, 0x94, 0xdf, 0xa6, 0x3f, 0x4a, 0xb6, 0xd7, 0xb6, 0x5e, 0xa9, 0x69, 0x9c, 0x81, 0x03, 0xa8, 0x42, 0x6e, 0xe2, 0x66, 0x91, 0x52, 0x08, 0x6d, 0x4e, 0x0b, 0xae, 0x1f, 0x8c, 0x5b, 0x45, 0xad, 0xd1, 0x89, 0x3c, 0x59, 0xa0, 0x0d, 0x24, 0x9f, 0x72, 0x47, 0xcf, 0x45, 0x45, 0x54, 0x4c, 0xb1, 0x53, 0x84, 0xd2, 0xf3, 0x9f, 0x11, 0xff, 0x6e, 0x5a, 0x00, 0x01, 0x17, 0x5b, 0x65, 0x89, 0xa3, 0x1e, 0x6a, 0xa1, 0x21, 0x1c, 0xca, 0xc1, 0xe2, 0x56, 0xa8, 0xc6, 0xa1, 0x75, 0xf9, 0x98, 0x4e, 0xdc, 0xe0, 0xae, 0xfb, 0x76, 0xaa, 0xb8, 0xb8, 0x42, 0x62, 0x23, 0x70, 0xc5, 0x19, 0x33, 0x0d, 0xf6, 0x55, 0xf7, 0x70, 0x4b, 0x5e, 0x45, 0x12, 0xf3, 0x38, 0x8a, 0x43, 0x6f, 0x9c, 0x1f, 0x75, 0x08, 0x36, 0x61, 0xfb, 0xe4, 0xf6, 0xcd, 0x26, 0xa9, 0x45, 0xd0, 0xba, 0x00, 0x5b, 0x1e, 0x0a, 0x53, 0x19, 0xac, 0x4c, 0xaa, 0x1c, 0xaa, 0xf2, 0x7f, 0xe6, 0x19, 0x07, 0xd9, 0x5b, 0xdd, 0xed, 0x27, 0xf0, 0x5d, 0x01, 0x96, 0x40, 0x19, 0xe6, 0xd8, 0xee, 0xc9, 0x9b, 0xa2, 0x04, 0xe6, 0x8e, 0x57, 0x39, 0xb2, 0x4e, 0x9c, 0xca, 0x2d, 0x9a, 0xd4, 0xd1, 0x76, 0xda, 0xbc, 0x4a, 0x8f, 0x56, 0xaa, 0x2c, 0x94, 0xb3, 0x20, 0x49, 0xbd, 0x7b, 0xba, 0xd9, 0xd4, 0xca, 0xaa, 0xe2, 0xec, 0x60, 0x47, 0xee, 0x80, 0xa5, 0x65, 0xa3, 0x53, 0x78, 0x6e, 0x4f, 0xa9, 0xc1, 0x87, 0x70, 0xbb, 0x20, 0x29, 0xbc, 0x7f, 0x47, 0xfa, 0x44, 0x1e, 0xba, 0xde, 0xb3, 0xb9, 0x15, 0x76, 0xb6, 0x57, 0x1b, 0x8b, 0x21, 0x0f, 0x12, 0x2e, 0x53, 0xe1, 0x4b, 0x71, 0xe7, 0xbc, 0xd1, 0x0d, 0xc8, 0xa7, 0x91, 0x5d, 0x24, 0x19, 0x8a, 0x7e, 0xdb, 0xe3, 0xce, 0x79, 0x5f, 0x46, 0x5d, 0xcb, 0x35, 0x0f, 0x2f, 0xb0, 0x74, 0xdd, 0xeb, 0x05, 0xfe, 0xe1, 0x28, 0xa2, 0x56, 0xbe, 0x36, 0x83, 0x40, 0x5f, 0xc1, 0x27, 0x9f, 0xe3, 0xdb, 0xec, 0x28, 0xfa, 0x35, 0x62, 0xf5, 0x4b, 0x97, 0xd1, 0x08, 0xc3, 0xdf, 0x67, 0x3a, 0xec, 0x1a, 0xda, 0x39, 0xa3, 0x77, 0x6a, 0x8c, 0xc3, 0x2e, 0x84, 0xbd, 0xb2, 0x9f, 0x88, 0x19, 0xe1, 0x2f, 0x67, 0xbc, 0x93, 0xc2, 0x15, 0xbe, 0x9d, 0xcb, 0x14, 0xcc, 0xe3, 0x43, 0x84, 0x7a, 0xc3, 0x1c, 0x84, 0x0f, 0xb8, 0xf4, 0xd8, 0xb0, 0xe0, 0x0d, 0x0e, 0x15, 0x35, 0xeb, 0xa7, 0x36, 0x9a, 0x0d, 0xf5, 0x9b, 0x23, 0x9c, 0xb2, 0x3a, 0x15, 0x16, 0x85, 0x13, 0xa5, 0x45, 0x00, 0xf0, 0x6a, 0x04, 0xbb, 0xfd, 0xf8, 0xb0, 0x9c, 0x18, 0x32, 0x39, 0x83, 0x13, 0x3d, 0x3b, 0xd0, 0x49, 0x1b, 0x91, 0x84, 0x3d, 0x61, 0x3b, 0xfb, 0x1a, 0x90, 0xaa, 0x78, 0x60, 0x03, 0xa5, 0xf8, 0x0c, 0x71, 0x78, 0x1c, 0xf6, 0x7c, 0x0f, 0x0d, 0x52, 0xd7, 0x2d, 0xaa, 0x76, 0xe8, 0xf9, 0x70, 0x5e, 0xf4, 0x6a, 0xe1, 0x8e, 0x4a, 0x70, 0x5a, 0x45, 0xf0, 0xca, 0xa5, 0x2e, 0xba, 0xf7, 0xad, 0xf1, 0xe8, 0xb1, 0x2a, 0x60, 0xa3, 0xc9, 0x25, 0x1e, 0xf3, 0x78, 0xac, 0xf1, 0x14, 0x61, 0x1a, 0x31, 0x38, 0xde, 0xbf, 0xee, 0x1f, 0x5b, 0xda, 0xd7, 0x19, 0xd0, 0x28, 0xe9, 0x4b, 0xa2, 0x83, 0x76, 0x66, 0x7d, 0x48, 0x14, 0x0f, 0xeb, 0x80, 0x70, 0xab, 0xbc, 0x18, 0x2d, 0x64, 0x85, 0x86, 0x34, 0x7f, 0xc3, 0xb7, 0x32, 0x65, 0x74, 0x2a, 0x1d, 0xf3, 0x29, 0x81, 0xf3, 0xfd, 0xe1, 0x03, 0x28, 0x06, 0x3e, 0xc0, 0x62, 0xa8, 0xd6, 0x62, 0x72, 0x2b, 0xb2, 0xe0, 0xc2, 0x41, 0x4b, 0x8e, 0x8c, 0xe6, 0x86, 0x43, 0xa2, 0xe3, 0x85, 0x9e, 0x9a, 0x6d, 0x55, 0x96, 0xa0, 0xd8, 0xc3, 0xda, 0x46, 0x64, 0xea, 0xbf, 0x0a, 0x96, 0x3c, 0xaf, 0x81, 0xa3, 0x22, 0x5a, 0x42, 0xd5, 0x6b, 0x30, 0x14, 0x0c, 0x25, 0xc2, 0xf9, 0xa6, 0xac, 0x2e, 0x05, 0x77, 0xea, 0xad, 0x3a, 0xa9, 0x2d, 0xd8, 0xc3, 0xa3, 0x0b, 0x57, 0x44, 0x4a, 0x28, 0xf1, 0x2b, 0x44, 0xed, 0x41, 0x2e, 0x11, 0x73, 0x8f, 0x59, 0x16, 0x36, 0x78, 0x68, 0xff, 0x5b, 0x76, 0x49, 0x06, 0x8f, 0x73, 0xfe, 0x03, 0xd4, 0xf3, 0x48, 0x69, 0xbe, 0x7d, 0xb9, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbd, 0x07, 0xec, 0x79, 0x01, 0x00, 0x40, 0xbf, 0x45, 0x1f, 0x31, 0x39, 0xc2, 0x40, 0x77, 0xfb, 0x6a, 0x24, 0xa5, 0xcb, 0x6c, 0xd8, 0x05, 0xaa, 0x6f, 0x6b, 0xa1, 0x51, 0x5c, 0xbf, 0x4c, 0xc1, 0x76, 0xed, 0x59, 0x4e, 0xa6, 0xc4, 0x9e, 0x1f, 0x40, 0x72, 0xa2, 0x7b, 0xaf, 0xe7, 0x0b, 0x6c, 0xcc, 0x79, 0xb2, 0x80, 0xe2, 0xd8, 0xea, 0xbe, 0x8d, 0x61, 0xec, 0x07, 0xf7, 0x4d, 0x6d, 0x8f, 0x38, 0x63, 0xc7, 0x14, 0xc2, 0x1c, 0x4e, 0x01, 0x22, 0x5b, 0xb4, 0xb4, 0x97, 0x33, 0x82, 0x77, 0x27, 0x5f, 0x24, 0xfe, 0x41, 0x57, 0x01, 0x75, 0x26, 0x2f, 0x97, 0x5d, 0x82, 0xb5, 0xa1, 0xda, 0x10, 0x68, 0xb9, 0x2c, 0x27, 0x45, 0xfa, 0x65, 0x81, 0x8f, 0x93, 0xa9, 0xac, 0xfa, 0x5d, 0x87, 0xeb, 0xed, 0xca, 0x2d, 0x73, 0xc4, 0xde, 0x8e, 0x54, 0x38, 0xf0, 0xbe, 0x7f, 0x64, 0x6c, 0x17, 0x9f, 0x09, 0xe0, 0xe9, 0xd0, 0x08, 0xf6, 0xd1, 0x67, 0x2a, 0x32, 0xf0, 0x43, 0xc1, 0xa1, 0x9a, 0x6f, 0xac, 0xb8, 0x4a, 0x04, 0xc5, 0x17, 0xdd, 0x97, 0xd3, 0x0b, 0x6e, 0x95, 0x7b, 0xd6, 0x4c, 0x6d, 0xce, 0x31, 0xf1, 0x5f, 0x64, 0x9b, 0xe4, 0x46, 0x3f, 0x47, 0xf5, 0xd4, 0xc6, 0xda, 0x42, 0xeb, 0x9b, 0x42, 0xe4, 0x28, 0x32, 0x47, 0x48, 0xd0, 0x4b, 0xbf, 0x80, 0x90, 0xd1, 0x6a, 0x17, 0xe6, 0xac, 0xe3, 0x3e, 0x15, 0x8c, 0x46, 0x4e, 0xf2, 0xd3, 0x4a, 0xf7, 0xfc, 0xf7, 0x15, 0xa4, 0x7c, 0x2c, 0x04, 0xe0, 0xb4, 0x17, 0x0e, 0xcb, 0x45, 0xe0, 0xa8, 0xdf, 0x5d, 0xef, 0x38, 0xa7, 0x58, 0x10, 0x74, 0x20, 0xdc, 0xe7, 0x58, 0xd4, 0xa3, 0xdd, 0x79, 0x09, 0x7b, 0xf9, 0xe4, 0x7a, 0x24, 0x44, 0xdb, 0x77, 0x20, 0xb5, 0x0d, 0x73, 0xa1, 0xc4, 0x26, 0x47, 0x0f, 0x12, 0xd5, 0xbf, 0xf7, 0xdb, 0xa4, 0x37, 0x3e, 0x0e, 0x36, 0x4f, 0xf6, 0x4c, 0xd5, 0x14, 0x37, 0x22, 0x5d, 0x13, 0xc8, 0x3e, 0xec, 0x34, 0x8c, 0x81, 0xed, 0x63, 0xf1, 0x1e, 0x5b, 0x4a, 0xde, 0x2c, 0x58, 0xb8, 0xda, 0x60, 0x77, 0x7b, 0x6c, 0xd1, 0x4a, 0xab, 0xe9, 0x01, 0x25, 0xd1, 0x37, 0x7f, 0x1a, 0x4f, 0x31, 0xe8, 0x9b, 0xf9, 0xb9, 0x24, 0x57, 0xd4, 0xa9, 0x0a, 0x2f, 0x4d, 0x24, 0xe3, 0x5e, 0x7e, 0xfd, 0x67, 0x35, 0x35, 0x39, 0x33, 0xff, 0xea, 0xe3, 0xd0, 0xf1, 0xd1, 0xa9, 0xce, 0x39, 0xa5, 0x0c, 0x84, 0x94, 0xf9, 0x0c, 0x79, 0xfc, 0x0e, 0x9e, 0x97, 0x4e, 0x8b, 0x5f, 0x90, 0x06, 0x8f, 0x3d, 0x2d, 0x6c, 0x05, 0x1d, 0x69, 0xc8, 0x21, 0xaa, 0x83, 0x87, 0x77, 0xde, 0x84, 0x5b, 0x1f, 0xeb, 0xc8, 0xc5, 0xbd, 0x90, 0x93, 0x8e, 0x72, 0x0b, 0xc8, 0x27, 0x0f, 0x33, 0x41, 0xf5, 0x01, 0x60, 0x62, 0xeb, 0xdc, 0x33, 0xde, 0x18, 0x77, 0x6b, 0xd7, 0xf8, 0xfa, 0x4a, 0xc8, 0xa8, 0x5b, 0x43, 0xdf, 0x60, 0x21, 0xf1, 0xb4, 0xc3, 0x72, 0x8d, 0x93, 0xee, 0xbb, 0x65, 0xb7, 0x52, 0x7b, 0x0b, 0x2a, 0xc7, 0x01, 0x3c, 0x31, 0x6a, 0x2a, 0xb7, 0x7d, 0x1a, 0x65, 0x86, 0x76, 0xc8, 0x89, 0x6d, 0x66, 0xdc, 0x55, 0x82, 0x56, 0x58, 0x95, 0x27, 0xe4, 0x9a, 0x46, 0xe1, 0x69, 0xc9, 0x38, 0xcb, 0x1c, 0x59, 0x0e, 0x9b, 0x35, 0x39, 0x8c, 0x81, 0x1a, 0x86, 0x98, 0x4e, 0x1d, 0xea, 0x71, 0xa6, 0x6f, 0xf3, 0xdf, 0x39, 0x25, 0x0a, 0x76, 0x40, 0x9b, 0xe6, 0x37, 0xb6, 0x7f, 0x8a, 0x09, 0x0e, 0x46, 0x3d, 0xf1, 0x58, 0xf0, 0x07, 0x00, 0x22, 0x46, 0x9b, 0x47, 0x84, 0x02, 0xc0, 0x6c, 0x0f, 0x80, 0xa4, 0x95, 0xae, 0x02, 0x9e, 0xc4, 0xa0, 0x8a, 0x53, 0xec, 0x16, 0xd7, 0x4a, 0x52, 0x27, 0x26, 0x54, 0xee, 0x1e, 0x9c, 0x5a, 0xff, 0x57, 0x91, 0x78, 0xf8, 0x2c, 0x1a, 0x80, 0x68, 0xaf, 0x95, 0x31, 0xa5, 0x21, 0x02, 0xd9, 0x40, 0x78, 0x77, 0x22, 0x98, 0x58, 0x03, 0x40, 0x09, 0x4e, 0xb2, 0xc2, 0x9a, 0x3d, 0xa9, 0xb9, 0x17, 0x3e, 0x79, 0x04, 0x07, 0x6f, 0x13, 0xe3, 0xe7, 0x6d, 0x1a, 0x21, 0x8f, 0x72, 0x6d, 0x87, 0xc4, 0x58, 0x20, 0x5d, 0x3e, 0xf7, 0x48, 0x28, 0xbc, 0x9f, 0x50, 0xef, 0xdf, 0xa9, 0xb9, 0xb1, 0xe8, 0x5c, 0x75, 0xe9, 0xa3, 0x99, 0x4b, 0x28, 0xfe, 0x17, 0xf1, 0x3e, 0x27, 0x28, 0xbf, 0x76, 0x38, 0x37, 0x31, 0xcf, 0xb9, 0x91, 0xa0, 0x43, 0x8a, 0x17, 0xdf, 0x88, 0xfc, 0xfa, 0xa3, 0xd5, 0x27, 0x9b, 0xed, 0x93, 0xd0, 0x1b, 0xd7, 0x11, 0x58, 0x5e, 0x72, 0x97, 0x96, 0x6b, 0xaa, 0x7b, 0x9c, 0x70, 0x4f, 0x06, 0xb6, 0xe8, 0xb9, 0x53, 0x27, 0x9b, 0xac, 0x7d, 0x83, 0x6c, 0x70, 0xb8, 0x9e, 0x45, 0x3f, 0x34, 0x65, 0x8a, 0x7d, 0xe3, 0x32, 0xd8, 0x66, 0x7e, 0x57, 0x0a, 0x12, 0x6b, 0x04, 0xc0, 0x11, 0x56, 0xb6, 0xe5, 0xf4, 0xa1, 0xda, 0xf1, 0x7d, 0x03, 0x5b, 0xdd, 0x60, 0xf4, 0x28, 0x0b, 0xbb, 0xc2, 0x0d, 0x9f, 0xba, 0x68, 0x5e, 0xfe, 0x0a, 0x8a, 0x3c, 0x77, 0x0f, 0x22, 0x94, 0x49, 0x02, 0xd8, 0x0e, 0x91, 0x67, 0xfa, 0x80, 0xc6, 0x8a, 0x93, 0xbe, 0xd2, 0xe6, 0x26, 0xb6, 0x02, 0xa7, 0xf6, 0x48, 0x36, 0xbd, 0xf0, 0x41, 0x2d, 0x12, 0x94, 0x68, 0xc6, 0xee, 0x7f, 0x8a, 0x93, 0xa0, 0x66, 0xe8, 0x1c, 0xdb, 0xac, 0x89, 0xa7, 0x7f, 0xe8, 0x3a, 0x73, 0xa7, 0xee, 0x4e, 0xa1, 0x3d, 0x4d, 0x68, 0x51, 0x6a, 0x4b, 0xd7, 0xa6, 0xa3, 0xbc, 0x55, 0xb3, 0x30, 0x64, 0x33, 0x87, 0x5f, 0x9f, 0x41, 0xd7, 0xce, 0x8d, 0xf7, 0x09, 0x7b, 0x04, 0xb1, 0x8b, 0x7f, 0xf2, 0x08, 0xc5, 0xa8, 0x0a, 0x96, 0x13, 0x58, 0xcf, 0xac, 0x8e, 0x58, 0x64, 0xcd, 0x9a, 0x8a, 0xb9, 0xf2, 0x73, 0xa6, 0xe8, 0xeb, 0x3a, 0x72, 0xf4, 0x64, 0x42, 0x13, 0x2a, 0x5b, 0x8a, 0x7c, 0xda, 0x12, 0xae, 0x0a, 0x31, 0xcd, 0xc5, 0xd2, 0x57, 0xe3, 0xef, 0x3d, 0x33, 0xf2, 0x7e, 0xe3, 0x68, 0x3e, 0x09, 0xd1, 0x67, 0x8a, 0xe0, 0xab, 0xbc, 0xfa, 0x8e, 0x4f, 0xe3, 0xc1, 0x84, 0xe0, 0x54, 0xab, 0x00, 0x78, 0x8c, 0xdc, 0xd5, 0xda, 0x40, 0x31, 0xb6, 0xd7, 0x13, 0x38, 0x04, 0x58, 0x61, 0xa2, 0x61, 0x2d, 0x09, 0x99, 0x86, 0x15, 0x46, 0x7b, 0x0d, 0xab, 0xfd, 0xc1, 0x30, 0x23, 0x11, 0x2a, 0xc3, 0xfc, 0xa8, 0x66, 0xd3, 0x21, 0x6c, 0xe1, 0xb4, 0x1a, 0x32, 0x68, 0x75, 0x3b, 0x96, 0xbc, 0xf3, 0xff, 0x7c, 0x64, 0x10, 0xfc, 0x77, 0x38, 0xc0, 0x18, 0x86, 0x8f, 0xea, 0xee, 0xc5, 0xf5, 0x64, 0x91, 0xd7, 0xe2, 0x74, 0x10, 0x42, 0xcf, 0x9f, 0x71, 0x03, 0x9d, 0xc0, 0x0f, 0xff, 0x41, 0x9f, 0x7d, 0x35, 0x0d, 0x85, 0x61, 0xb5, 0x1c, 0x8f, 0xf8, 0xd4, 0xaf, 0xb2, 0x21, 0x29, 0x8c, 0xb3, 0x2b, 0x2f, 0x9d, 0x90, 0xc2, 0xab, 0x6e, 0x0e, 0xb9, 0x3c, 0x48, 0x76, 0x8e, 0x97, 0xf6, 0xa6, 0xd3, 0x6a, 0x89, 0x0f, 0xfc, 0xec, 0xa0, 0x47, 0x25, 0x7f, 0xfe, 0x2c, 0xcf, 0xfb, 0x7e, 0xe4, 0xac, 0x88, 0xb5, 0x24, 0x06, 0x16, 0xc4, 0x81, 0x46, 0xd8, 0x2d, 0xcd, 0xa3, 0x5b, 0xb6, 0xaf, 0x1f, 0x17, 0xa2, 0xfd, 0x34, 0x8e, 0xd6, 0x95, 0xeb, 0x64, 0xa8, 0x9e, 0x3c, 0xfb, 0x70, 0x8f, 0xf0, 0x81, 0x1e, 0x50, 0x62, 0x74, 0x6b, 0x57, 0xdc, 0x15, 0x65, 0x9f, 0x70, 0x50, 0x70, 0xc3, 0x75, 0xfc, 0xf4, 0xc2, 0x28, 0x8d, 0x61, 0x0d, 0x09, 0xa2, 0x31, 0xf6, 0xe5, 0xef, 0x1b, 0xb1, 0xc2, 0x7a, 0x9f, 0x5b, 0x0b, 0x3b, 0x8f, 0xd7, 0xb7, 0x76, 0x5c, 0x69, 0x48, 0x7d, 0x27, 0x52, 0xdb, 0x9b, 0xf2, 0xf4, 0xa9, 0x62, 0x78, 0x26, 0xb4, 0x9f, 0x6e, 0xc3, 0x78, 0x9f, 0x4c, 0xa9, 0xe4, 0x9a, 0xd3, 0xab, 0xee, 0x65, 0xf4, 0x29, 0x84, 0xc1, 0xd3, 0x4d, 0xb6, 0xec, 0xf2, 0x2d, 0x4d, 0x3d, 0xe1, 0x4f, 0x3e, 0x09, 0xe8, 0x3c, 0x93, 0x04, 0x8b, 0x38, 0xd7, 0xd8, 0xe3, 0x3c, 0x0a, 0xc9, 0x2a, 0xcf, 0xaa, 0x70, 0xef, 0x5b, 0x65, 0x01, 0xdd, 0x10, 0x74, 0xac, 0xfc, 0x8b, 0xbb, 0xed, 0xd9, 0xb0, 0x1e, 0x02, 0x11, 0x8e, 0xc3, 0xbb, 0x05, 0x2d, 0x19, 0x6c, 0xd7, 0x93, 0xdf, 0xb6, 0xe7, 0x76, 0x93, 0x5f, 0x6a, 0x5d, 0xf0, 0x85, 0xe3, 0x1e, 0x75, 0xd0, 0x83, 0x05, 0x06, 0x7b, 0xc9, 0x1a, 0x39, 0x50, 0xe5, 0x3f, 0xd5, 0xf6, 0xae, 0x1e, 0x89, 0x2f, 0x2e, 0x38, 0xff, 0xd1, 0x21, 0x76, 0xb0, 0xb6, 0xe3, 0x06, 0x30, 0xdd, 0xa2, 0x82, 0xdc, 0x6f, 0xda, 0x9a, 0x07, 0x79, 0x71, 0xb5, 0x30, 0x7b, 0xef, 0x55, 0xcb, 0x2a, 0xae, 0x2a, 0xa5, 0xfa, 0x07, 0x1e, 0xfb, 0x50, 0xc5, 0xc7, 0xbd, 0x81, 0x6c, 0x0e, 0xa3, 0xe2, 0x29, 0xf0, 0x01, 0xa5, 0x69, 0xad, 0x87, 0x40, 0x67, 0xcb, 0x57, 0x90, 0x48, 0xbd, 0x1e, 0x0f, 0x7e, 0x16, 0x20, 0xaa, 0x92, 0x97, 0x58, 0x2d, 0x90, 0x86, 0x29, 0x4c, 0xa9, 0x12, 0x3a, 0xae, 0xde, 0xbc, 0x73, 0x90, 0xa9, 0x03, 0x47, 0xea, 0x14, 0xcb, 0xba, 0x1f, 0xa1, 0x46, 0xbb, 0xa1, 0xed, 0x49, 0xe0, 0x20, 0x14, 0x5c, 0x90, 0x25, 0x17, 0xf3, 0x19, 0x2b, 0xd7, 0x94, 0x5c, 0x9e, 0x77, 0xe1, 0xf0, 0x53, 0x2b, 0xc6, 0xfa, 0x58, 0xb7, 0x47, 0x15, 0x3b, 0x3d, 0xa3, 0x01, 0x20, 0x1d, 0xcf, 0x00, 0x41, 0xe6, 0x8a, 0x0f, 0xb9, 0xc1, 0x74, 0x64, 0xb3, 0xc1, 0xf9, 0xe3, 0x56, 0x03, 0xfb, 0x6e, 0x15, 0x90, 0x86, 0x46, 0x2c, 0x5f, 0xf7, 0xda, 0x7d, 0xf6, 0x6a, 0xc4, 0x12, 0x84, 0x57, 0xcf, 0xf7, 0x75, 0xa0, 0x36, 0x30, 0xc8, 0x90, 0x95, 0xfd, 0xca, 0x8a, 0x1d, 0xbc, 0xe1, 0x4e, 0x16, 0x01, 0x90, 0x33, 0xc6, 0xcf, 0xf2, 0xb4, 0x2e, 0x00, 0x35, 0x18, 0x4d, 0x3f, 0xed, 0x35, 0xce, 0x2d, 0x41, 0x82, 0x5c, 0x92, 0x3e, 0xf6, 0xec, 0xa9, 0xe8, 0x74, 0xcb, 0xfa, 0xc5, 0xbe, 0x44, 0x46, 0xf5, 0x25, 0x0b, 0x6b, 0x2a, 0x7e, 0xec, 0x64, 0xfc, 0x0b, 0x57, 0xb3, 0x77, 0x62, 0xb6, 0xd6, 0xdf, 0x7a, 0xc8, 0xac, 0x04, 0x75, 0x5c, 0xd7, 0xa5, 0xc9, 0x25, 0x80, 0xb8, 0xd5, 0x88, 0x17, 0x9f, 0x15, 0x96, 0xf1, 0x94, 0x77, 0xa1, 0xce, 0xde, 0x87, 0x13, 0xbe, 0x93, 0x77, 0x70, 0xe5, 0xf8, 0x32, 0xb7, 0x11, 0xd2, 0x02, 0x8e, 0x2f, 0x1e, 0x7e, 0xd4, 0xfe, 0x16, 0xc1, 0xa7, 0xab, 0x7f, 0x22, 0xdf, 0x13, 0x92, 0xe6, 0x8e, 0xe5, 0x03, 0xb3, 0x25, 0xf6, 0x07, 0xb6, 0x1b, 0x55, 0x4a, 0xbc, 0x5c, 0x16, 0x34, 0xb6, 0xdc, 0xd9, 0x06, 0x6c, 0xf7, 0x6d, 0x90, 0x54, 0x9a, 0x3d, 0x9e, 0xce, 0x50, 0x49, 0x58, 0x36, 0xa9, 0xd6, 0x27, 0x9a, 0xa5, 0x32, 0xef, 0x03, 0x09, 0x21, 0xa4, 0x8c, 0xdb, 0xd5, 0x89, 0xcd, 0x56, 0x83, 0xa1, 0x50, 0x1f, 0x06, 0x29, 0x04, 0x8e, 0x0c, 0x15, 0xff, 0x4a, 0xcf, 0xf0, 0xf5, 0x9c, 0x50, 0x99, 0x2b, 0x1e, 0x8f, 0xb8, 0xe4, 0xc2, 0x4c, 0xec, 0x79, 0x4d, 0x2a, 0x04, 0xa9, 0xc1, 0x61, 0xcb, 0xcb, 0x52, 0x48, 0x3b, 0xe9, 0xe2, 0x5b, 0x14, 0x00, 0x1f, 0xa4, 0x38, 0xd7, 0xc4, 0x87, 0x3e, 0x3a, 0x92, 0x6e, 0x25, 0x85, 0xff, 0xd9, 0x1b, 0xc0, 0xbf, 0xb7, 0xac, 0xce, 0x93, 0x27, 0xf1, 0x63, 0x0b, 0xf4, 0x71, 0xc3, 0x2c, 0x71, 0xde, 0x7e, 0x17, 0x8b, 0xe0, 0xb1, 0x33, 0x33, 0x8d, 0x7e, 0x74, 0x72, 0x4d, 0xb7, 0xaf, 0xd2, 0x3d, 0x02, 0x32, 0xe2, 0x5e, 0xe5, 0xf8, 0x10, 0x14, 0x81, 0x38, 0x13, 0xcc, 0xf2, 0x34, 0x98, 0xc8, 0x8c, 0x6b, 0x0c, 0x6e, 0x7f, 0xae, 0x90, 0x92, 0x92, 0xac, 0x86, 0x98, 0xed, 0xf6, 0x43, 0x73, 0x41, 0x9c, 0xd5, 0xc7, 0xba, 0xcf, 0xda, 0xcb, 0x72, 0x3a, 0xee, 0xa0, 0x7c, 0xf6, 0x21, 0x3f, 0x9f, 0x4c, 0x73, 0x3c, 0x60, 0xaf, 0x5f, 0xed, 0xf4, 0x96, 0xd4, 0xc7, 0x3e, 0x29, 0x3f, 0xf2, 0xe8, 0xe5, 0x7c, 0x6d, 0x3e, 0xad, 0xc7, 0x40, 0x68, 0xe9, 0x13, 0x96, 0x0b, 0xa4, 0x5d, 0xc1, 0x94, 0xdd, 0xcf, 0x77, 0x95, 0x64, 0xe2, 0xd2, 0x0a, 0x03, 0xcd, 0xeb, 0x66, 0xd3, 0xd9, 0x03, 0xc1, 0xeb, 0x89, 0xa5, 0x86, 0xd9, 0x9b, 0x2f, 0x77, 0x8d, 0x56, 0xaa, 0xed, 0xa2, 0xa4, 0xe1, 0xa6, 0x34, 0xf3, 0x1f, 0x86, 0xae, 0xe3, 0x09, 0x19, 0x36, 0x26, 0x6b, 0xc6, 0xb3, 0x2b, 0x03, 0xfe, 0x7e, 0x71, 0x9b, 0xcb, 0x4e, 0xa3, 0xec, 0x98, 0xe5, 0xcc, 0x2c, 0x13, 0x88, 0x50, 0x45, 0x7a, 0x5d, 0x76, 0x0b, 0xbe, 0x22, 0xad, 0xed, 0x4d, 0xe8, 0xd8, 0x00, 0x61, 0xbb, 0x52, 0x63, 0x32, 0x65, 0x6f, 0x4f, 0x6a, 0xbd, 0xab, 0x5c, 0xaa, 0x24, 0xd0, 0xc0, 0x14, 0x24, 0xc1, 0xa9, 0x14, 0x57, 0xb6, 0xe4, 0xeb, 0x0b, 0x10, 0x6f, 0xb4, 0x45, 0x1f, 0xba, 0xde, 0x11, 0x6e, 0xa7, 0x55, 0x57, 0x80, 0x95, 0xe2, 0x88, 0x06, 0xf8, 0x6d, 0xef, 0x01, 0x5f, 0x29, 0x75, 0x5a, 0xdc, 0xdf, 0x15, 0xcf, 0x27, 0xe0, 0x66, 0x60, 0x12, 0x44, 0xec, 0x7a, 0xfa, 0x89, 0x12, 0xa5, 0x68, 0xc4, 0x02, 0x64, 0x12, 0xd9, 0xc7, 0x89, 0xcf, 0x86, 0x60, 0x41, 0x56, 0x2f, 0xb0, 0x81, 0xbf, 0xaa, 0x7d, 0xa8, 0x26, 0x94, 0xe5, 0x74, 0xee, 0xd2, 0xf3, 0xb0, 0x77, 0x52, 0x4a, 0x1f, 0x54, 0x3f, 0x07, 0xa2, 0x43, 0x18, 0x46, 0x8e, 0x83, 0x7f, 0x06, 0xb6, 0x45, 0xa8, 0x3e, 0xa2, 0x4b, 0xa6, 0x6c, 0xe6, 0x05, 0x21, 0xec, 0xaa, 0xaf, 0x19, 0xe0, 0xc7, 0x3c, 0xcd, 0x7d, 0x0b, 0x2a, 0xea, 0xfb, 0x83, 0x77, 0x8b, 0x85, 0xf4, 0x49, 0xc5, 0xe2, 0xcb, 0x1f, 0xba, 0xbc, 0x2b, 0x89, 0x6a, 0xb0, 0xf5, 0xbf, 0xc6, 0x97, 0xe1, 0x94, 0xba, 0xb1, 0x0e, 0xa6, 0x32, 0xa2, 0x97, 0xc1, 0x4e, 0x67, 0x14, 0xd1, 0x43, 0xb6, 0x1c, 0xeb, 0xa9, 0x6b, 0x2f, 0x2d, 0x30, 0xfa, 0x90, 0x9a, 0xf1, 0x0c, 0x04, 0x20, 0xe6, 0xb1, 0x7c, 0x72, 0x36, 0xd4, 0x13, 0x68, 0x5b, 0xe2, 0xfa, 0x00, 0x56, 0xc9, 0x27, 0x49, 0x74, 0xc2, 0xed, 0xc7, 0x60, 0x8a, 0xd4, 0x0d, 0x75, 0xfc, 0x48, 0xae, 0x97, 0x38, 0x08, 0xca, 0x07, 0xbe, 0x64, 0xb1, 0xf6, 0x2f, 0xac, 0x88, 0xca, 0x9d, 0x6d, 0xe4, 0x53, 0x91, 0x51, 0xab, 0x78, 0x45, 0xd0, 0xcf, 0x04, 0x9e, 0xef, 0xad, 0x9d, 0xfc, 0xcc, 0x0f, 0x20, 0xde, 0xb8, 0x32, 0xd5, 0xf2, 0x05, 0x4c, 0x45, 0x1a, 0xf2, 0x61, 0xa0, 0x64, 0x2b, 0x7f, 0xf9, 0x25, 0xec, 0x94, 0xcb, 0x8d, 0xb3, 0x89, 0x92, 0x7a, 0xfd, 0x52, 0x5d, 0x65, 0x9e, 0x15, 0xb1, 0x9e, 0x8e, 0xa2, 0x1d, 0x37, 0x4f, 0xd3, 0x52, 0x5f, 0x3f, 0xa1, 0xa8, 0x00, 0x78, 0xf5, 0x60, 0xdd, 0x16, 0x79, 0x0e, 0x9e, 0x09 }; +constexpr AccessUnit LPCM_SKIP_BYTES_EXPECTED_AU = { 0x15f90, 0x153d5, false, 3, { 0xe6, 0xa3, 0x12, 0x99, 0xcf, 0x16, 0x2e, 0x6d, 0x67, 0x2a, 0xa2, 0xb4, 0xf7, 0xa2, 0x3c, 0xdf }, { 0x97, 0xf7, 0x18, 0x4f, 0xfc, 0x6b, 0x28, 0x74, 0x44, 0x69, 0x80, 0xc1, 0x76, 0x96, 0x50, 0xe6, 0x23, 0x0d, 0xdf, 0xf2 } }; + + +const std::vector AVC_BEGIN_OF_AU_SPLIT_STREAM = { 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xe0, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x5c, 0xe5, 0xaf, 0x00, 0xfd, 0x0f, 0x1d, 0x27, 0x61, 0x90, 0xd4, 0x77, 0x92, 0x34, 0x4a, 0x7a, 0xdc, 0x96, 0x0d, 0x27, 0x58, 0x2f, 0xfa, 0x88, 0x0d, 0xb6, 0x88, 0xcb, 0x5f, 0xd7, 0x79, 0xc8, 0xe5, 0x46, 0xe3, 0x99, 0xc7, 0x10, 0x1d, 0xfa, 0x50, 0xd7, 0x07, 0xcf, 0xcf, 0x21, 0x1c, 0xaf, 0x1c, 0x74, 0x86, 0x02, 0x33, 0x71, 0xc2, 0x81, 0x7f, 0xd6, 0xea, 0xe0, 0xab, 0xa5, 0xf2, 0x66, 0xb1, 0x69, 0x10, 0x40, 0x36, 0x55, 0x95, 0x09, 0xba, 0x8d, 0x65, 0xc8, 0x33, 0x21, 0xa0, 0xcf, 0x1c, 0xfc, 0xa4, 0x2b, 0x3e, 0x8f, 0x92, 0x74, 0xbe, 0x8a, 0x75, 0xed, 0x8a, 0x33, 0x85, 0x42, 0xcf, 0xf2, 0x0e, 0xaa, 0xe2, 0x8f, 0x51, 0xee, 0xd9, 0x67, 0x8c, 0x24, 0x75, 0x18, 0xf5, 0x90, 0x3e, 0x74, 0xf8, 0x43, 0x4e, 0xc5, 0x5d, 0xe1, 0xd5, 0x6f, 0x97, 0x6d, 0xef, 0xd5, 0x5f, 0x12, 0xb0, 0x83, 0xcb, 0x07, 0x02, 0x8c, 0x1d, 0x91, 0x2e, 0x04, 0x2c, 0x34, 0xff, 0xa0, 0xdc, 0x27, 0xe9, 0x53, 0x9e, 0x6f, 0xe2, 0x75, 0xd6, 0x2a, 0x73, 0x17, 0x71, 0xe7, 0x5e, 0x93, 0x98, 0x9f, 0xca, 0x01, 0xd9, 0x03, 0x60, 0x6d, 0x49, 0xed, 0x54, 0x79, 0x90, 0x09, 0x1a, 0x52, 0xfa, 0x36, 0x06, 0x5f, 0x7a, 0x0a, 0xd7, 0x9e, 0xbc, 0x97, 0xbb, 0xa1, 0xc5, 0xfd, 0xaa, 0xb8, 0x62, 0x82, 0x72, 0x73, 0xfb, 0x29, 0x86, 0x35, 0x25, 0x8c, 0x2b, 0x9b, 0xdd, 0xf2, 0x73, 0xd6, 0xc0, 0x34, 0x32, 0x14, 0x43, 0x3d, 0x48, 0xe0, 0x58, 0x2e, 0x7d, 0x81, 0x6f, 0xb0, 0x05, 0xde, 0x7c, 0xff, 0xb6, 0xa2, 0xc6, 0x3d, 0x57, 0xea, 0x84, 0xa8, 0x28, 0x32, 0x51, 0x67, 0xf5, 0xa8, 0x0d, 0x58, 0x34, 0x1e, 0x59, 0x05, 0x4a, 0xff, 0x3b, 0x44, 0x0e, 0xe1, 0x21, 0x49, 0xe5, 0x4f, 0x6c, 0x6e, 0xe0, 0x52, 0xc1, 0x86, 0xec, 0x17, 0x61, 0xdd, 0xc5, 0x6a, 0x15, 0x6e, 0x76, 0x9d, 0xe0, 0x51, 0x55, 0x0c, 0x63, 0x12, 0xe4, 0x9c, 0x3c, 0xa5, 0x7c, 0xb5, 0xc1, 0xd7, 0xbf, 0xc2, 0x3c, 0x2f, 0xb9, 0xca, 0x69, 0x15, 0xfd, 0x02, 0x06, 0xb9, 0xc9, 0xa2, 0x1f, 0x25, 0xc1, 0x18, 0x54, 0x76, 0x8c, 0x7b, 0x8c, 0x12, 0x55, 0xb6, 0xa2, 0xbb, 0x08, 0xa2, 0x9b, 0xab, 0xa1, 0xfd, 0xb2, 0x1d, 0x42, 0x38, 0x71, 0x5a, 0xba, 0xc4, 0x09, 0x3b, 0x06, 0x51, 0x38, 0x16, 0xb8, 0x94, 0xab, 0x41, 0x24, 0x9e, 0x93, 0x3f, 0x82, 0x85, 0x0c, 0x97, 0xf0, 0x78, 0x21, 0xeb, 0x4f, 0xe9, 0xf3, 0xf1, 0x3a, 0x53, 0x90, 0x91, 0xe6, 0xdb, 0x5f, 0x56, 0x22, 0x1d, 0x33, 0x61, 0x83, 0xf5, 0xf2, 0xac, 0x0b, 0x9b, 0xb4, 0xda, 0x58, 0xc4, 0xac, 0xf2, 0xa6, 0xd6, 0xfb, 0x37, 0x7a, 0x97, 0x70, 0x22, 0x4c, 0x6c, 0x1d, 0x4d, 0x52, 0x29, 0x07, 0xdf, 0xc9, 0x79, 0x30, 0xd4, 0x63, 0x92, 0x15, 0xc8, 0x3c, 0xd9, 0x51, 0x56, 0xb9, 0xc9, 0x41, 0x8c, 0x45, 0xe1, 0x18, 0x99, 0xa7, 0xbf, 0xb8, 0x3b, 0x45, 0x84, 0x48, 0xdd, 0x39, 0x36, 0xb3, 0x21, 0x48, 0xf1, 0x69, 0x51, 0x62, 0x45, 0x6b, 0xf4, 0xf6, 0xed, 0x41, 0xda, 0x8f, 0x64, 0xb8, 0x39, 0xa5, 0x36, 0x58, 0x8a, 0xc1, 0xd6, 0x6c, 0x3a, 0xc6, 0xf5, 0x41, 0x9f, 0xe5, 0x7b, 0x68, 0x9e, 0xbf, 0x39, 0x55, 0x9d, 0xda, 0x14, 0xa3, 0x2e, 0x4a, 0xa8, 0x25, 0x31, 0x4c, 0x9f, 0xb6, 0xf2, 0x1d, 0x67, 0x20, 0x2a, 0x49, 0x0e, 0x65, 0x04, 0xa5, 0x3d, 0x6e, 0xb7, 0x95, 0x4d, 0x90, 0x63, 0xec, 0xa0, 0xc7, 0xd4, 0x16, 0x5e, 0xe7, 0x33, 0x77, 0xbf, 0x03, 0x09, 0xfc, 0x5e, 0xe9, 0x21, 0x3f, 0x58, 0x76, 0xdc, 0x4a, 0x19, 0x89, 0x8e, 0x05, 0x90, 0x45, 0xb1, 0x55, 0xfc, 0x79, 0x44, 0x88, 0xcc, 0xc3, 0x24, 0x1d, 0xf4, 0xc5, 0x07, 0x65, 0xcf, 0x39, 0x2e, 0xeb, 0x43, 0x70, 0x41, 0xb3, 0x56, 0x8c, 0x51, 0x64, 0xc1, 0xcd, 0x42, 0x1b, 0xfa, 0x05, 0x80, 0x6c, 0xa6, 0x15, 0xe5, 0xa2, 0x2d, 0xd3, 0x34, 0x5f, 0x9e, 0xab, 0x7b, 0xd4, 0x0f, 0x14, 0x67, 0x3e, 0x28, 0x4f, 0xab, 0x30, 0xa7, 0x02, 0xb5, 0x59, 0xcd, 0x35, 0xfa, 0x43, 0xe4, 0x77, 0xe6, 0xa5, 0x04, 0xba, 0x91, 0xf8, 0x0a, 0xc5, 0xb0, 0xef, 0x48, 0xf3, 0x8a, 0x97, 0x9f, 0x9a, 0x01, 0xd3, 0x28, 0x99, 0x70, 0xf6, 0xa2, 0x50, 0xe5, 0x75, 0xcc, 0xd4, 0x22, 0x50, 0x95, 0x6b, 0xc2, 0x95, 0xcd, 0xeb, 0x8e, 0x01, 0xa9, 0x70, 0x25, 0x9f, 0x62, 0xf4, 0x3a, 0xfe, 0xec, 0x41, 0xb3, 0x49, 0xce, 0x68, 0xfe, 0xc3, 0xe5, 0x1f, 0x7d, 0xfd, 0x7d, 0x78, 0x4c, 0xa4, 0x55, 0x8b, 0x19, 0xf0, 0x4c, 0xce, 0xb8, 0xa4, 0xb1, 0xe1, 0x86, 0x03, 0xb0, 0x46, 0xc5, 0xa4, 0xdc, 0xcb, 0x20, 0xc5, 0x55, 0xbb, 0xf4, 0xc6, 0xba, 0x70, 0x27, 0xa2, 0xd5, 0xd8, 0x05, 0x25, 0x60, 0xb6, 0x6e, 0xe0, 0xda, 0x03, 0x6c, 0x98, 0x0c, 0xa4, 0xf1, 0xe7, 0x33, 0x6d, 0xf2, 0x1d, 0xf6, 0x99, 0x4b, 0xd6, 0x84, 0x4c, 0x2e, 0xf1, 0x54, 0x42, 0x78, 0xa2, 0x2f, 0x08, 0x9e, 0x95, 0xf7, 0x1f, 0xfa, 0xe1, 0x50, 0x1a, 0x1c, 0x69, 0x98, 0x1d, 0x2b, 0x1d, 0xe0, 0xec, 0xe6, 0x28, 0xda, 0xc8, 0x76, 0xf3, 0xaa, 0x91, 0xf8, 0x63, 0x04, 0x6b, 0xa6, 0x3b, 0x8e, 0xbb, 0x45, 0x8c, 0x7b, 0x5a, 0x75, 0xe7, 0x26, 0xe0, 0x07, 0xd7, 0xb7, 0x6d, 0x6f, 0x4c, 0xc5, 0xda, 0xde, 0xc7, 0xcf, 0xf2, 0x07, 0xd8, 0xad, 0x23, 0x0e, 0xa2, 0xc2, 0xcf, 0xe7, 0xbd, 0x9e, 0x41, 0x09, 0xb2, 0x9b, 0x6b, 0xcc, 0x4d, 0xe9, 0xe1, 0x88, 0xbb, 0x12, 0x76, 0x20, 0xe9, 0x60, 0x73, 0x08, 0x87, 0x7e, 0xb8, 0x71, 0x7b, 0x7c, 0x75, 0xb1, 0x5a, 0xfb, 0x9e, 0xd1, 0xb4, 0x2b, 0x94, 0xa8, 0x5f, 0x88, 0xf2, 0xec, 0x9a, 0x21, 0x42, 0x9f, 0x70, 0xd9, 0xf5, 0x6a, 0xad, 0xbd, 0x88, 0x75, 0x86, 0xc2, 0x1e, 0xcb, 0x45, 0xe7, 0x27, 0xa2, 0xe8, 0x48, 0xd7, 0xaf, 0x22, 0x30, 0xe6, 0x47, 0x36, 0x9e, 0x5d, 0x0d, 0xa3, 0x5c, 0x84, 0xcd, 0x14, 0x63, 0xae, 0x12, 0x28, 0x6a, 0xcf, 0x75, 0xfb, 0x62, 0x84, 0x25, 0x8c, 0xda, 0x10, 0xaa, 0xf8, 0xa7, 0xfa, 0xee, 0xa5, 0x9e, 0x54, 0x62, 0xe7, 0xdd, 0x11, 0xb3, 0x3e, 0x1f, 0x9e, 0x00, 0x0a, 0x89, 0x55, 0x7c, 0x28, 0x56, 0xb9, 0xb2, 0x0a, 0xc9, 0x83, 0xc4, 0x51, 0x6b, 0x6d, 0x9f, 0xec, 0xd0, 0x49, 0x41, 0xd2, 0xcb, 0xf7, 0xc9, 0x38, 0x85, 0x2f, 0x0b, 0xd4, 0x84, 0x6c, 0xd9, 0xd3, 0x35, 0x44, 0x4d, 0x9a, 0x80, 0xee, 0xca, 0xf5, 0x77, 0x2e, 0xf5, 0xd8, 0xc0, 0xd9, 0x05, 0xfc, 0xfe, 0xaf, 0x0b, 0x62, 0x90, 0x21, 0x73, 0x2f, 0x3f, 0x39, 0x44, 0x74, 0x7f, 0x18, 0x20, 0xa1, 0x34, 0x49, 0xeb, 0x1f, 0x69, 0x50, 0xa5, 0x1c, 0x51, 0x3b, 0x4c, 0xeb, 0x1e, 0xc9, 0x5f, 0xe9, 0xe4, 0xed, 0x6e, 0x37, 0x3d, 0x44, 0xd9, 0x86, 0x8e, 0x5c, 0x05, 0x48, 0x4a, 0x64, 0x9d, 0x9e, 0x6c, 0x26, 0x03, 0x1d, 0xa3, 0x2d, 0xa0, 0x7c, 0x51, 0xf6, 0xaf, 0xe1, 0xaf, 0xeb, 0x05, 0xdc, 0x6a, 0x05, 0xc7, 0x15, 0x0e, 0xc8, 0xd6, 0x99, 0x9b, 0xdf, 0x7f, 0x9b, 0x25, 0x40, 0x17, 0x96, 0x97, 0xa7, 0x15, 0x6a, 0xbd, 0x70, 0x11, 0x64, 0x26, 0x90, 0x55, 0x80, 0x7d, 0xed, 0xd5, 0xb5, 0xc3, 0x86, 0x9a, 0x5b, 0xb5, 0x31, 0x83, 0x35, 0x69, 0x81, 0x59, 0x32, 0x1a, 0x72, 0xf8, 0xae, 0xe0, 0xfa, 0x1e, 0x34, 0xa1, 0xc3, 0xfd, 0x88, 0xa1, 0xa8, 0x27, 0xa9, 0x95, 0x61, 0x09, 0xfb, 0xc5, 0xd5, 0x48, 0x97, 0x19, 0x1e, 0xfb, 0xd5, 0x03, 0xdf, 0xa4, 0x59, 0x82, 0x12, 0x5e, 0x63, 0x93, 0xe3, 0x8b, 0xd2, 0x3c, 0x13, 0x4d, 0x14, 0x90, 0xe0, 0x28, 0x95, 0xb3, 0x79, 0xcb, 0x62, 0x7d, 0x80, 0xfd, 0xa8, 0xbd, 0xdc, 0x69, 0x07, 0x0e, 0x59, 0xc3, 0x57, 0xca, 0xbe, 0xd9, 0xfb, 0xd0, 0x34, 0x26, 0x98, 0x7c, 0x6a, 0xa7, 0x3f, 0x4f, 0x70, 0x8f, 0x9c, 0x63, 0x3e, 0xa0, 0x84, 0x14, 0x95, 0x59, 0xe6, 0xb3, 0x38, 0x99, 0xf7, 0xb4, 0x9d, 0x34, 0x50, 0x35, 0xe2, 0x74, 0x90, 0xa4, 0x1a, 0x93, 0xe1, 0xd1, 0x46, 0x68, 0xa7, 0x4d, 0x02, 0x48, 0x32, 0x49, 0x39, 0xd8, 0xd1, 0x57, 0x85, 0xc5, 0x36, 0xd7, 0x87, 0x08, 0x7a, 0xca, 0xb8, 0xb5, 0x4a, 0x02, 0x1a, 0x98, 0x5e, 0x5b, 0x57, 0xb5, 0x14, 0x8f, 0x10, 0x33, 0xbe, 0xbd, 0x43, 0x17, 0xf3, 0x0e, 0x15, 0x49, 0x84, 0xc9, 0xcd, 0xbb, 0xe6, 0x19, 0x0b, 0x2e, 0xf4, 0xfc, 0xdf, 0x48, 0x3e, 0xe4, 0x5f, 0x72, 0x8a, 0x8d, 0x08, 0x90, 0x93, 0x0d, 0x64, 0xd6, 0xa2, 0xf6, 0x28, 0x63, 0x73, 0x56, 0x8a, 0xfb, 0xd5, 0x6f, 0xf9, 0x80, 0x88, 0xeb, 0xe4, 0x42, 0x7c, 0x62, 0x7e, 0xd7, 0xe2, 0x8c, 0x1f, 0x68, 0x5b, 0xae, 0x6c, 0xba, 0x3a, 0x43, 0xc5, 0x52, 0x55, 0xe0, 0x3c, 0x7d, 0x52, 0x75, 0xd5, 0x6a, 0x0f, 0xd8, 0xdd, 0x53, 0x1d, 0xcb, 0x61, 0xa7, 0x80, 0x2a, 0x82, 0x70, 0x25, 0x8e, 0xb5, 0xdf, 0xea, 0xb1, 0x2a, 0xab, 0x1f, 0x6b, 0xad, 0x86, 0x78, 0xba, 0x98, 0x9b, 0x3a, 0x64, 0xf2, 0xdd, 0x5b, 0x65, 0x89, 0x20, 0xc4, 0xa6, 0x98, 0x67, 0x67, 0x3c, 0xe6, 0xaf, 0x1c, 0x3a, 0xd9, 0xf0, 0x1e, 0x14, 0x96, 0xbe, 0x08, 0x21, 0xad, 0xa1, 0x44, 0xa1, 0xed, 0xdf, 0x52, 0xad, 0x3d, 0x84, 0x4d, 0x2c, 0x7d, 0xd9, 0xe5, 0xed, 0x80, 0xda, 0x3f, 0x22, 0xd7, 0xe6, 0xb3, 0xa5, 0xc6, 0xe9, 0x50, 0x3b, 0xbc, 0xf8, 0xc5, 0xc6, 0x7e, 0x7f, 0xce, 0x40, 0x69, 0x91, 0xe9, 0xc1, 0x8b, 0xfb, 0xa7, 0xca, 0xae, 0xab, 0xee, 0x14, 0x2b, 0x3c, 0x35, 0x01, 0xfa, 0x91, 0x2f, 0xea, 0xcf, 0x8c, 0xc7, 0x01, 0xed, 0x9b, 0x86, 0xff, 0xea, 0x7d, 0xb6, 0xf2, 0x43, 0x46, 0xf7, 0x3f, 0xf1, 0x96, 0x02, 0x00, 0xde, 0xfc, 0x3b, 0xc5, 0x0a, 0x6e, 0xe8, 0xd6, 0x47, 0x4e, 0xb9, 0x65, 0xcb, 0x59, 0xe9, 0x05, 0x08, 0xb6, 0x67, 0x13, 0x02, 0x8a, 0x61, 0xbe, 0x20, 0x15, 0x87, 0x7a, 0x8e, 0x56, 0xc4, 0x04, 0x18, 0xd4, 0xa0, 0x48, 0x24, 0x73, 0x90, 0xe0, 0x0f, 0xbb, 0xca, 0x98, 0xeb, 0x77, 0xc9, 0x70, 0x7a, 0x8e, 0x1a, 0xd1, 0x57, 0xc8, 0x09, 0xe7, 0x6f, 0x54, 0xd9, 0xe5, 0xf9, 0xc3, 0x79, 0xb8, 0xb7, 0xa3, 0x11, 0x3b, 0x08, 0xc7, 0x7e, 0xe2, 0xcb, 0xc8, 0x5e, 0x87, 0x68, 0x3a, 0xee, 0x78, 0x45, 0x67, 0x8b, 0xed, 0x22, 0xde, 0x7f, 0x4b, 0xad, 0xc3, 0xc8, 0x88, 0xa8, 0x54, 0x86, 0xbe, 0x82, 0x08, 0xaa, 0xee, 0x81, 0xd0, 0xa6, 0x29, 0xf0, 0x66, 0x91, 0xa5, 0xa7, 0xc4, 0x2f, 0x26, 0x72, 0x10, 0xea, 0x92, 0x9c, 0xde, 0x23, 0x90, 0x9e, 0x4e, 0x01, 0x7f, 0x93, 0x13, 0x7f, 0x95, 0x89, 0x22, 0x8e, 0x53, 0xcd, 0xa7, 0x68, 0x7f, 0xa4, 0x78, 0xef, 0xaf, 0x30, 0x3e, 0xfe, 0xbe, 0x62, 0x22, 0x10, 0x8e, 0x52, 0xbd, 0xbe, 0x30, 0x5c, 0x5d, 0x84, 0xbe, 0x1d, 0xeb, 0x27, 0x4a, 0x8c, 0x17, 0xd8, 0x91, 0x97, 0x85, 0x7b, 0xb8, 0x65, 0x11, 0x84, 0xe2, 0x6f, 0x4f, 0x61, 0x3e, 0x05, 0x5d, 0x53, 0x60, 0x8b, 0xe8, 0x35, 0x4d, 0x58, 0x12, 0x60, 0x3a, 0xaf, 0x7a, 0x2a, 0xe4, 0xb3, 0x82, 0x33, 0x02, 0x15, 0x1b, 0xc9, 0x37, 0xd9, 0xa5, 0x81, 0xe3, 0x91, 0xf3, 0x08, 0xb4, 0x8d, 0xad, 0x90, 0x96, 0xb5, 0xb0, 0xe9, 0x23, 0xba, 0xb7, 0x25, 0x38, 0xb9, 0x07, 0x0f, 0xc1, 0x4c, 0xdc, 0x6d, 0x3c, 0x85, 0x6b, 0xea, 0x96, 0x04, 0xf0, 0xca, 0xfb, 0xb7, 0xdc, 0x45, 0xcb, 0x11, 0x5b, 0x7e, 0x14, 0xcc, 0x2d, 0xc4, 0x23, 0xcb, 0x68, 0xeb, 0x56, 0xe9, 0xaa, 0x7a, 0x44, 0x5b, 0x92, 0xc1, 0x3b, 0xff, 0xfd, 0x16, 0x5a, 0xf3, 0x4c, 0xbc, 0x38, 0x1e, 0x36, 0x68, 0xd4, 0xa2, 0x4d, 0xcb, 0xc7, 0xee, 0x3a, 0x1d, 0xa5, 0x69, 0x67, 0xd8, 0xd7, 0x34, 0x7a, 0xe9, 0x2b, 0x6d, 0xb0, 0xe4, 0x47, 0x81, 0x1f, 0xef, 0xf6, 0xd4, 0x60, 0x07, 0x92, 0x1d, 0xd1, 0x61, 0xbb, 0x8f, 0x3f, 0x4a, 0x0b, 0xbd, 0xae, 0x6f, 0x77, 0xf2, 0x46, 0x64, 0x77, 0x34, 0xf1, 0x93, 0xa5, 0x3a, 0x2b, 0x98, 0x79, 0x93, 0x54, 0xc2, 0x7b, 0x63, 0xad, 0xdb, 0xb8, 0x9e, 0xa2, 0x9c, 0xba, 0xe6, 0x7c, 0xf1, 0x0f, 0x0e, 0x68, 0x04, 0xba, 0x63, 0xf2, 0xe5, 0xbd, 0x85, 0xf3, 0x6c, 0x96, 0x40, 0xb0, 0xf2, 0x71, 0x2f, 0x50, 0xe8, 0x20, 0x38, 0xac, 0xe6, 0xc9, 0x26, 0x7a, 0xca, 0xeb, 0xec, 0xd0, 0x40, 0x65, 0x34, 0x4b, 0x70, 0x07, 0x23, 0xee, 0x65, 0x00, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xe0, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x3e, 0x95, 0xcd, 0x33, 0x75, 0xc9, 0xd6, 0x9d, 0x2c, 0xad, 0x4c, 0x70, 0xfc, 0x00, 0x01, 0x09, 0x40, 0x7f, 0x53, 0xed, 0xb3, 0xc2, 0xfd, 0xff, 0x4c, 0x6a, 0x04, 0x34, 0xc8, 0x0f, 0xc1, 0xcf, 0x3b, 0xdf, 0xb1, 0x07, 0xa8, 0x0e, 0x59, 0xb2, 0xc9, 0x3c, 0x27, 0x51, 0x67, 0xb2, 0x07, 0x0b, 0x30, 0xd3, 0xa0, 0x73, 0x14, 0xda, 0x1b, 0xd1, 0xbc, 0xf8, 0x42, 0xca, 0xe5, 0xab, 0x6b, 0x49, 0x7a, 0xe7, 0xe5, 0x3a, 0xf1, 0x9d, 0x4a, 0x8b, 0x34, 0x18, 0x12, 0xcb, 0x1c, 0x10, 0x5e, 0x2c, 0x53, 0x16, 0xfc, 0x65, 0x00, 0x49, 0x27, 0x30, 0xb2, 0x5e, 0xc8, 0x35, 0x44, 0xab, 0x9e, 0x18, 0xc8, 0x0c, 0xda, 0x5b, 0xc2, 0xb8, 0xf3, 0x2b, 0xcc, 0xc8, 0x5c, 0x0c, 0x14, 0x79, 0x58, 0x4d, 0x69, 0xd2, 0xff, 0x06, 0x58, 0x20, 0xca, 0xe4, 0xac, 0x1a, 0x3f, 0x5a, 0x53, 0x82, 0x3b, 0x5b, 0xd3, 0x8f, 0x6c, 0x63, 0xc0, 0xf0, 0x84, 0x9e, 0x4b, 0x61, 0x67, 0xd6, 0xc3, 0xd3, 0x61, 0xb2, 0xec, 0xd5, 0xb0, 0xdf, 0x41, 0x13, 0xcb, 0x66, 0x4c, 0x13, 0x69, 0x69, 0x8d, 0x27, 0xa7, 0x06, 0x1b, 0xca, 0x00, 0xf6, 0x82, 0xfb, 0xeb, 0x1b, 0xc1, 0x36, 0x95, 0x9d, 0x44, 0x98, 0x33, 0x8f, 0x26, 0x7a, 0x41, 0x9c, 0x00, 0x2c, 0xeb, 0xcc, 0xc0, 0x05, 0x5a, 0xf5, 0x58, 0xec, 0x23, 0x4f, 0x44, 0x79, 0x97, 0x8d, 0x0c, 0xe0, 0xa5, 0xc9, 0x14, 0xcf, 0x2b, 0xe3, 0xa1, 0x3f, 0x12, 0x8d, 0xde, 0xbf, 0x46, 0x4e, 0xca, 0x9c, 0xe4, 0xa5, 0x1c, 0x61, 0x35, 0x57, 0xae, 0xa8, 0xfa, 0x3a, 0x55, 0x11, 0x05, 0x7b, 0x55, 0xb7, 0x90, 0x5c, 0x03, 0xb3, 0x00, 0x31, 0xfa, 0xa0, 0x16, 0xa7, 0x03, 0x99, 0xc1, 0x5d, 0xfe, 0x7e, 0xc7, 0x61, 0x7e, 0xb1, 0x4b, 0x4d, 0x05, 0x65, 0xdf, 0x14, 0x47, 0x81, 0xd1, 0xe7, 0xd9, 0x5e, 0x8a, 0xbd, 0xa5, 0xfb, 0x48, 0x2f, 0x7f, 0x33, 0x90, 0x26, 0x1e, 0x28, 0xbb, 0x45, 0xd0, 0x8d, 0x98, 0x83, 0x5f, 0x4c, 0xe4, 0xa6, 0x20, 0x2b, 0xc2, 0x7b, 0x11, 0xf9, 0x6a, 0x9c, 0x46, 0x21, 0x5b, 0x32, 0x8c, 0x51, 0x11, 0x06, 0x00, 0xb6, 0xf6, 0xc2, 0xcf, 0x26, 0x50, 0x2c, 0xd6, 0x39, 0xa8, 0xe4, 0xf6, 0xc9, 0x97, 0x3d, 0xe2, 0x54, 0x88, 0x4b, 0x0c, 0x93, 0xbe, 0xd5, 0x17, 0xa6, 0xfc, 0x65, 0x1f, 0xa6, 0x0f, 0xe9, 0xa5, 0xcb, 0xdf, 0x61, 0xc4, 0xea, 0x87, 0x83, 0xc8, 0x50, 0xe7, 0x51, 0x96, 0x96, 0x7e, 0x2b, 0x5b, 0x58, 0x3e, 0x87, 0x3b, 0x8f, 0x92, 0x23, 0x7f, 0xb3, 0x10, 0xe8, 0xd9, 0xdd, 0x74, 0x21, 0x37, 0x7d, 0x0f, 0x91, 0x7c, 0xef, 0xaa, 0x9c, 0x1f, 0x18, 0xee, 0xe8, 0x20, 0xfe, 0xb4, 0x7e, 0x7a, 0xe6, 0x1a, 0xa3, 0x04, 0x6a, 0xfa, 0x82, 0x4c, 0xe1, 0xdd, 0xf5, 0xb0, 0x45, 0x52, 0x32, 0x71, 0x87, 0x7a, 0xd2, 0xc6, 0x38, 0xcb, 0xff, 0xce, 0x22, 0x01, 0xb5, 0x28, 0x69, 0x8d, 0xef, 0x37, 0xd2, 0xb3, 0xc4, 0x53, 0x9f, 0x49, 0x10, 0xda, 0xa4, 0x10, 0x13, 0x8d, 0x76, 0x2f, 0x0d, 0xc0, 0x24, 0x96, 0x96, 0x6d, 0xe5, 0xe9, 0x97, 0xf2, 0xce, 0x10, 0x9e, 0x53, 0xab, 0x3a, 0x46, 0xdf, 0xed, 0xab, 0x6b, 0xf3, 0xd6, 0x92, 0xba, 0x92, 0xb0, 0xb3, 0xbb, 0x2b, 0xd9, 0xd5, 0xc3, 0xbd, 0xb1, 0xeb, 0x8b, 0x86, 0x3d, 0xf9, 0xfb, 0x08, 0x64, 0x62, 0x24, 0xa5, 0x0e, 0x46, 0x27, 0x32, 0x67, 0x8d, 0x19, 0x5e, 0xe7, 0x95, 0x1d, 0x42, 0x92, 0xde, 0xaf, 0x15, 0xd3, 0x98, 0x7f, 0x08, 0xd2, 0xd5, 0xcb, 0xd6, 0x20, 0xb4, 0x3d, 0x96, 0xff, 0x3a, 0x0c, 0x1a, 0x77, 0xe0, 0x2f, 0xe1, 0x09, 0x99, 0x82, 0x00, 0x11, 0x7c, 0xe3, 0xb7, 0xc4, 0x1f, 0x97, 0xa1, 0xd9, 0xff, 0x6b, 0x1c, 0x6a, 0xd9, 0xf4, 0x28, 0x30, 0xa7, 0x06, 0xef, 0x22, 0xab, 0x6e, 0x3a, 0xc0, 0x40, 0xc0, 0x1e, 0x47, 0xb8, 0x01, 0x25, 0xfd, 0x44, 0xf6, 0x3b, 0xf1, 0xe3, 0xd5, 0x5f, 0x35, 0x4b, 0x0f, 0xe8, 0x32, 0xca, 0x7b, 0xe7, 0x73, 0xb0, 0x2a, 0xe8, 0xe5, 0x5e, 0xd5, 0x19, 0xfd, 0x7c, 0x7a, 0x3c, 0x33, 0xdb, 0x50, 0xa4, 0xec, 0x09, 0x94, 0xaa, 0xbc, 0x6f, 0xf1, 0x43, 0xa3, 0x36, 0x6f, 0xcd, 0x0b, 0x34, 0xfc, 0x5a, 0x2c, 0xee, 0x2a, 0x69, 0x98, 0x06, 0x41, 0xa7, 0x9d, 0xe1, 0x97, 0x80, 0x6e, 0x2f, 0x4b, 0x17, 0xd9, 0x39, 0xf9, 0xbd, 0x8b, 0x64, 0x1c, 0x0b, 0x51, 0xde, 0x2d, 0x73, 0x39, 0x9d, 0xed, 0x5d, 0x9f, 0x3e, 0xb9, 0xa8, 0x0d, 0xf1, 0xf7, 0x21, 0xd4, 0xf8, 0x05, 0x1c, 0x95, 0x9e, 0x5e, 0xb1, 0xc3, 0xc4, 0x45, 0x2c, 0xcc, 0x55, 0x15, 0xba, 0x4b, 0xae, 0x84, 0x7f, 0x2f, 0x23, 0xf1, 0x47, 0x46, 0x9b, 0x3a, 0xed, 0x06, 0xe1, 0xff, 0x3e, 0x55, 0x44, 0xfe, 0xdc, 0xb3, 0x8f, 0xde, 0xa6, 0x3e, 0x33, 0xf8, 0x8c, 0x52, 0x0c, 0x77, 0xa8, 0x12, 0xeb, 0xfa, 0x0d, 0x05, 0x6c, 0x5c, 0x86, 0x4f, 0x46, 0x2f, 0x9c, 0xa7, 0x58, 0x4f, 0x50, 0xa1, 0x21, 0xde, 0xda, 0x54, 0xd2, 0x51, 0x84, 0x5e, 0xa3, 0x7c, 0x55, 0xd0, 0xc7, 0x73, 0x80, 0xfe, 0x99, 0x26, 0xb2, 0x6f, 0xd8, 0x4f, 0x75, 0x09, 0xe0, 0xb7, 0xde, 0xec, 0x04, 0xc9, 0x8c, 0xc9, 0xaf, 0xb0, 0x9a, 0x41, 0x52, 0xff, 0xf9, 0x29, 0x64, 0xe8, 0xa2, 0x7f, 0x7c, 0x65, 0x81, 0xf6, 0x0d, 0x16, 0x71, 0x2f, 0xca, 0xf7, 0xac, 0xe3, 0x3e, 0x91, 0xf9, 0xdb, 0xb4, 0x0f, 0x87, 0xa6, 0x74, 0x9b, 0x5e, 0xbf, 0x6a, 0x74, 0x78, 0x75, 0x76, 0x9f, 0x5f, 0xc7, 0x75, 0x36, 0x60, 0xe5, 0xe5, 0x86, 0x2c, 0xbf, 0xf1, 0xa2, 0x68, 0x14, 0xc9, 0x44, 0x80, 0x08, 0xe6, 0x55, 0x06, 0x5e, 0xd6, 0xbf, 0x70, 0x8b, 0x2a, 0x9a, 0xa6, 0xe2, 0x79, 0xe2, 0xa7, 0x54, 0x7d, 0x59, 0xe0, 0x82, 0xc9, 0xd8, 0x72, 0x88, 0x5e, 0xe1, 0x11, 0x59, 0xa4, 0x6d, 0xaf, 0x6e, 0x97, 0xa3, 0xe3, 0xa2, 0x60, 0xe1, 0x8e, 0x02, 0x72, 0xe6, 0xcc, 0x46, 0x12, 0x15, 0x28, 0x37, 0xfc, 0x5c, 0x2b, 0x65, 0x63, 0x6a, 0x90, 0x46, 0x20, 0x6a, 0xa1, 0xca, 0xb5, 0x6d, 0x9a, 0xba, 0xb5, 0x8c, 0x77, 0x03, 0xdf, 0x28, 0x08, 0x03, 0xb1, 0x21, 0x42, 0x79, 0xbb, 0x55, 0xf1, 0x14, 0x76, 0x00, 0x04, 0xb2, 0x1c, 0x4d, 0x31, 0x5c, 0x74, 0x7a, 0xdf, 0x4a, 0xd6, 0x82, 0x7d, 0x1d, 0xe3, 0x05, 0x04, 0x9c, 0xdc, 0xe3, 0x39, 0xeb, 0x3a, 0xe9, 0xa0, 0x9a, 0x95, 0x54, 0x8f, 0x3b, 0x28, 0x98, 0x7e, 0xd3, 0x44, 0xcf, 0xf5, 0x9e, 0x98, 0xdd, 0xa9, 0x53, 0xe4, 0x2a, 0xfb, 0xb7, 0x25, 0x0a, 0x39, 0x76, 0x4b, 0x5f, 0xaa, 0x86, 0xad, 0xf2, 0x65, 0xce, 0x31, 0x90, 0xd1, 0xc7, 0x2c, 0x3b, 0x3c, 0x13, 0x91, 0x49, 0xe6, 0xb8, 0x93, 0xd9, 0x98, 0x70, 0x2b, 0x6c, 0xe2, 0xd0, 0x6a, 0xd4, 0xd8, 0x13, 0x73, 0xae, 0x77, 0x9d, 0xda, 0xe1, 0xbc, 0x23, 0x52, 0x4b, 0x43, 0x62, 0xb5, 0x46, 0xb9, 0x75, 0x40, 0x75, 0xef, 0x1e, 0x1a, 0x2b, 0xa5, 0x13, 0x9e, 0x16, 0xdb, 0x7e, 0x08, 0x35, 0xe8, 0x83, 0xc4, 0x6b, 0xfe, 0x92, 0x74, 0x9f, 0xf0, 0xfc, 0xf4, 0x0b, 0xd6, 0x98, 0x24, 0xc1, 0x4a, 0xeb, 0x91, 0xc4, 0x21, 0x71, 0x4b, 0x36, 0x2c, 0xe8, 0xb2, 0xc5, 0xd9, 0xd0, 0x59, 0xbe, 0x1d, 0xcc, 0x23, 0x52, 0xc8, 0x27, 0x36, 0x95, 0x53, 0xf9, 0x2a, 0xb9, 0x17, 0x03, 0xa8, 0xbc, 0x22, 0x03, 0x62, 0x0d, 0x98, 0xec, 0xd2, 0x4e, 0x2f, 0x42, 0x52, 0x52, 0x47, 0xc6, 0x68, 0x8b, 0xa6, 0x5d, 0x58, 0x53, 0x1a, 0xf3, 0x82, 0x7c, 0xea, 0xdd, 0xda, 0x4f, 0x88, 0x66, 0x62, 0x58, 0x05, 0xf8, 0x82, 0x95, 0xa5, 0x6f, 0x15, 0x1b, 0xcf, 0xaa, 0x7c, 0x64, 0xd4, 0xd0, 0xf3, 0x5d, 0x8a, 0xce, 0xf9, 0x53, 0x87, 0x03, 0xf9, 0xc9, 0x8c, 0x16, 0x43, 0xd6, 0x92, 0x83, 0x7f, 0xb3, 0x03, 0x8f, 0x7e, 0xc7, 0xec, 0x90, 0x2f, 0xc6, 0xf3, 0x1d, 0xd8, 0x55, 0xf6, 0x65, 0x7e, 0xfe, 0xa1, 0x95, 0x90, 0x0d, 0xd9, 0xca, 0xd5, 0xb6, 0x3d, 0x32, 0x75, 0x47, 0xd6, 0xc4, 0x8a, 0x29, 0x34, 0x3d, 0xd8, 0xdc, 0x2e, 0xe7, 0x8b, 0xc6, 0x25, 0x0f, 0xa7, 0xd0, 0xf9, 0x86, 0x60, 0x2d, 0xa5, 0xdb, 0x90, 0xc6, 0x99, 0x63, 0xc8, 0xcd, 0xe4, 0xa0, 0x42, 0x52, 0x2a, 0xad, 0x88, 0x62, 0x9a, 0x41, 0xc8, 0x7f, 0xf3, 0x35, 0x10, 0xc5, 0xe5, 0x48, 0x6b, 0x91, 0x41, 0x58, 0x9b, 0x0e, 0x54, 0x34, 0xef, 0x09, 0x4b, 0x11, 0xf9, 0x83, 0xed, 0xd2, 0x0d, 0x7e, 0xc8, 0x03, 0xf1, 0x26, 0x04, 0xc1, 0x46, 0x18, 0xc7, 0x6e, 0xb4, 0xeb, 0x27, 0x33, 0x64, 0x23, 0x1b, 0xa1, 0xb5, 0x5d, 0xec, 0x56, 0xc0, 0x98, 0x0c, 0xde, 0x08, 0x1b, 0x2e, 0x7d, 0xad, 0xc0, 0x6c, 0x7a, 0x76, 0x48, 0xd9, 0x59, 0xca, 0x93, 0x44, 0x95, 0x74, 0x5c, 0x9d, 0x66, 0x7c, 0x3a, 0x26, 0xc0, 0x9e, 0xee, 0x49, 0xae, 0x6e, 0x28, 0x13, 0xb3, 0xb0, 0xd5, 0x1f, 0xad, 0x33, 0x00, 0xba, 0xc6, 0x1b, 0x92, 0x6b, 0xda, 0x70, 0xef, 0x61, 0x13, 0x71, 0x37, 0xe3, 0xe3, 0x1d, 0x7a, 0x10, 0xb4, 0x22, 0xed, 0xc4, 0xd0, 0x31, 0x1f, 0xc2, 0x45, 0x2c, 0xa5, 0x7d, 0x3e, 0x1f, 0xd8, 0xd0, 0xa8, 0x52, 0x5a, 0x0d, 0x6c, 0xb4, 0x0a, 0xfc, 0x3f, 0x5e, 0x4d, 0xe1, 0x5d, 0xc2, 0x2d, 0x10, 0x18, 0x9c, 0xd6, 0x3e, 0xc3, 0x48, 0x68, 0x3e, 0xd3, 0xcd, 0x87, 0x91, 0xdb, 0x9c, 0x3e, 0x86, 0x87, 0xf7, 0x28, 0xa9, 0xb5, 0xd1, 0x2c, 0x71, 0x12, 0x3e, 0x0a, 0x8d, 0x0b, 0xe9, 0x7c, 0x92, 0x1e, 0xd8, 0xbf, 0xd4, 0x9f, 0x0a, 0x1a, 0x0e, 0x5f, 0xac, 0xcd, 0x23, 0xc0, 0xa2, 0x6c, 0x43, 0xa2, 0x00, 0x1c, 0x7e, 0x6a, 0x7b, 0xf5, 0x46, 0x47, 0xd4, 0x4e, 0x3c, 0x37, 0x36, 0x79, 0x52, 0xfb, 0xa0, 0x7d, 0x13, 0x73, 0x7f, 0xe2, 0xff, 0xbf, 0x0b, 0x68, 0xdd, 0x81, 0xcf, 0x48, 0x40, 0x1e, 0x16, 0x06, 0x26, 0x87, 0xd1, 0xa6, 0x2c, 0xec, 0x10, 0x6d, 0x2c, 0xcc, 0x95, 0x79, 0x1f, 0xb7, 0x41, 0x30, 0x01, 0x34, 0x30, 0x00, 0x31, 0x90, 0xce, 0x59, 0x4d, 0x85, 0xda, 0x51, 0x1e, 0x08, 0x81, 0x06, 0x1c, 0x71, 0x41, 0x5d, 0xac, 0xf2, 0x75, 0x27, 0x81, 0xe7, 0xa6, 0x8b, 0x6d, 0x84, 0x44, 0x32, 0xb1, 0xfb, 0xf2, 0x45, 0xfd, 0x9e, 0xb5, 0xa7, 0x9e, 0xf9, 0x3f, 0xa0, 0x0b, 0x03, 0x21, 0x90, 0xa0, 0x4a, 0x83, 0x39, 0x81, 0xa7, 0x90, 0xe0, 0xfd, 0xd1, 0x1a, 0xea, 0xaf, 0xea, 0x72, 0x5a, 0xfc, 0xe4, 0xfe, 0xbb, 0xf2, 0x3a, 0xbb, 0x75, 0x3c, 0x9f, 0xed, 0xcb, 0xbe, 0x2c, 0x8e, 0xd8, 0x18, 0x0c, 0x58, 0x39, 0x98, 0x9c, 0x9e, 0x92, 0x1f, 0x3f, 0x80, 0xe0, 0xda, 0x61, 0x54, 0x07, 0xe0, 0x65, 0x66, 0x12, 0x29, 0x09, 0x4d, 0x47, 0x8f, 0x8d, 0x26, 0x6c, 0xbe, 0x30, 0x71, 0x51, 0x0a, 0x65, 0x94, 0x74, 0x87, 0x32, 0xf8, 0x4d, 0xc0, 0x57, 0x4d, 0x31, 0x42, 0xc2, 0xc0, 0xf2, 0x2c, 0x29, 0x15, 0xc1, 0xa0, 0x93, 0xf2, 0x36, 0xd2, 0x9b, 0x4c, 0xf3, 0xb5, 0x40, 0xff, 0xad, 0x9e, 0xd5, 0x28, 0x63, 0xfd, 0xfc, 0x1f, 0x40, 0xdb, 0x6d, 0x91, 0x90, 0x39, 0xc5, 0x98, 0x00, 0xb9, 0x29, 0x74, 0x68, 0xba, 0xbb, 0x8b, 0x5d, 0x27, 0x8c, 0x75, 0x2d, 0xa6, 0x27, 0xed, 0xd5, 0x62, 0x48, 0x65, 0x70, 0xb3, 0xef, 0xd8, 0x19, 0x23, 0x49, 0x33, 0x94, 0x9c, 0xb2, 0x08, 0xcf, 0x51, 0x72, 0x47, 0x44, 0x07, 0x9a, 0x14, 0x40, 0x8f, 0xbd, 0x36, 0x90, 0xc5, 0x9a, 0xcb, 0x8d, 0xcd, 0xae, 0xe4, 0xb5, 0x4b, 0x63, 0x81, 0xbb, 0x27, 0x55, 0xb5, 0x17, 0xf0, 0x66, 0xb6, 0x87, 0xc6, 0xc1, 0xc7, 0x1c, 0x73, 0xa0, 0xb4, 0xcb, 0xb8, 0xd4, 0xf9, 0xf4, 0xbb, 0x1b, 0x1b, 0x4e, 0x59, 0xf6, 0x99, 0x8d, 0xa2, 0xb7, 0x5b, 0x34, 0x58, 0x7d, 0x09, 0x99, 0xa0, 0x44, 0x7d, 0xa6, 0xf6, 0xc9, 0xe8, 0x8a, 0x74, 0xfe, 0xd1, 0xcd, 0xa4, 0xad, 0xa0, 0x3e, 0x8b, 0xde, 0x25, 0x92, 0xc9, 0x92, 0x34, 0xee, 0x01, 0x3d, 0xe9, 0xe2, 0x4d, 0x8a, 0xcb, 0xc6, 0x88, 0xe7, 0x09, 0xb7, 0x7d, 0x9f, 0xf6, 0x6e, 0xd9, 0x20, 0x62, 0x0b, 0x06, 0x7b, 0xa3, 0x94, 0xfb, 0x26, 0x8b, 0x3f, 0x13, 0x71, 0x77, 0xeb, 0x0e, 0x19, 0xd5, 0xb0, 0x71, 0x22, 0xec, 0xf5, 0x92, 0xda, 0x16, 0x14, 0x88, 0xa6, 0xc5, 0x88, 0xd7, 0x0f, 0x1f, 0x73, 0xbd, 0xec, 0x5c, 0xc4, 0x64, 0xf6, 0x82, 0x31, 0x00, 0x8b, 0x96, 0xee, 0x4a, 0x38, 0x88, 0x85, 0x2d, 0x3b, 0x0b, 0xaa, 0x0e, 0x75, 0xc6, 0xff, 0x94, 0xaf, 0x7c, 0xce, 0x4c, 0x5b, 0xdd, 0x00, 0x00, 0x01, 0x09 }; +constexpr AccessUnit AVC_BEGIN_OF_AU_SPLIT_EXPECTED_AU = { std::numeric_limits::max(), std::numeric_limits::max(), false, 0, {}, { 0x8d, 0x36, 0x09, 0x27, 0xb3, 0xab, 0x69, 0x2f, 0x0f, 0x43, 0xb5, 0x3e, 0x2d, 0x6d, 0x54, 0x1a, 0x9f, 0x91, 0x90, 0xbd } }; + +const std::vector M2V_BEGIN_OF_AU_SPLIT_STREAM = { 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xe0, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x5c, 0xe5, 0xaf, 0x00, 0xfd, 0x0f, 0x1d, 0x27, 0x61, 0x90, 0xd4, 0x77, 0x92, 0x34, 0x4a, 0x7a, 0xdc, 0x96, 0x0d, 0x89, 0x63, 0xef, 0x89, 0xa1, 0x9a, 0x65, 0xc3, 0x28, 0xba, 0x93, 0x62, 0x56, 0x1b, 0xfc, 0x5e, 0xac, 0xaf, 0x7d, 0x30, 0xaa, 0x20, 0x5f, 0x98, 0xf7, 0x81, 0x50, 0xa1, 0x73, 0xa2, 0xd1, 0x35, 0x49, 0x93, 0xed, 0xdf, 0xc4, 0x4b, 0xb7, 0xc3, 0x26, 0x8d, 0xaa, 0x93, 0xb6, 0x62, 0x9a, 0xd4, 0xc8, 0x2c, 0x35, 0x7b, 0x38, 0x78, 0x5c, 0x8c, 0xb8, 0x93, 0x40, 0x3c, 0x0a, 0x11, 0x77, 0x63, 0x33, 0x4b, 0xe0, 0xfd, 0x79, 0x75, 0x87, 0x30, 0x65, 0xbd, 0x20, 0x28, 0x8c, 0x98, 0x4a, 0x60, 0x44, 0xfa, 0xfc, 0x13, 0x31, 0xa5, 0x6f, 0x0b, 0xea, 0x2d, 0x4b, 0xf6, 0x21, 0xd8, 0xa2, 0x0f, 0x19, 0x82, 0x2f, 0x39, 0x45, 0x86, 0xea, 0x54, 0x21, 0xcf, 0xcb, 0xce, 0x75, 0x05, 0x75, 0x96, 0xe8, 0x40, 0x3f, 0x0b, 0x28, 0x96, 0xe2, 0x2a, 0x4a, 0x21, 0xb7, 0xb5, 0xaf, 0x16, 0xce, 0xfe, 0xdd, 0xf4, 0x67, 0x26, 0xcc, 0x95, 0xd3, 0xc3, 0x19, 0x73, 0xeb, 0xce, 0x67, 0x4e, 0x1e, 0x0c, 0xf6, 0x68, 0xbe, 0xde, 0x22, 0x61, 0xf8, 0x87, 0x3e, 0xdf, 0x9b, 0xbf, 0x57, 0x36, 0x19, 0x18, 0x02, 0x49, 0xb4, 0xcc, 0x17, 0xe8, 0x64, 0x03, 0x01, 0x8d, 0xbd, 0x18, 0x60, 0xcc, 0x3f, 0x8f, 0xe8, 0x89, 0xe3, 0x40, 0x4b, 0x3e, 0xf5, 0x0c, 0xa3, 0xd1, 0x32, 0x9f, 0x6c, 0x2e, 0xbd, 0xd4, 0xb7, 0x38, 0x09, 0x40, 0x43, 0x0d, 0xd5, 0x7a, 0x85, 0xf5, 0x30, 0xd7, 0x22, 0xe2, 0x17, 0x7c, 0x7e, 0x26, 0xa0, 0x4b, 0xc4, 0xcf, 0x95, 0xe9, 0x99, 0xbe, 0xc8, 0x1a, 0xda, 0x14, 0x61, 0x4e, 0x49, 0x89, 0x54, 0x8d, 0x0b, 0x0a, 0x27, 0x67, 0x45, 0xd0, 0xb6, 0x18, 0x70, 0x47, 0x11, 0x13, 0x77, 0x46, 0x4b, 0xc4, 0x87, 0x7e, 0x7e, 0x5c, 0x05, 0x4a, 0x2d, 0x2e, 0xf4, 0xbf, 0x0b, 0xf4, 0xd2, 0x7c, 0xa7, 0x9b, 0x29, 0x50, 0x60, 0xc5, 0x3b, 0xa2, 0x72, 0x45, 0x3d, 0xe7, 0x0e, 0x83, 0x68, 0x17, 0x92, 0xc8, 0x80, 0xf4, 0x04, 0x74, 0x5c, 0x61, 0xfc, 0x17, 0x77, 0x32, 0x72, 0xd7, 0xde, 0xcb, 0x3e, 0x00, 0x2c, 0x0b, 0x6b, 0x7c, 0xf1, 0xf6, 0x57, 0x4a, 0xe7, 0x84, 0x38, 0x3c, 0x0e, 0xcd, 0x47, 0xc1, 0x29, 0xa4, 0xab, 0x0f, 0x1a, 0x77, 0x15, 0x5b, 0x90, 0xe4, 0x14, 0xee, 0x03, 0xf2, 0xda, 0x1f, 0x08, 0xd4, 0x2b, 0x1b, 0xa5, 0x35, 0x76, 0x2b, 0x13, 0x8a, 0xe8, 0x70, 0x43, 0x96, 0x86, 0x1d, 0xeb, 0x85, 0x7c, 0x52, 0x8f, 0x22, 0x6b, 0xaf, 0x2d, 0xab, 0xd9, 0x0f, 0xdb, 0x2d, 0xed, 0xd1, 0xd0, 0x2c, 0xa9, 0x7c, 0xcd, 0x66, 0x1d, 0x45, 0x6d, 0x0e, 0x60, 0xd7, 0xa7, 0xca, 0xcd, 0xf5, 0x46, 0x07, 0xcb, 0x60, 0xbb, 0x45, 0x75, 0xe3, 0x61, 0xa2, 0x11, 0x97, 0x05, 0x80, 0xc6, 0x95, 0x76, 0xff, 0x4c, 0x62, 0x86, 0x58, 0xa4, 0x20, 0x14, 0x24, 0x57, 0xa3, 0x10, 0x21, 0x16, 0x42, 0xd6, 0x96, 0x00, 0x0a, 0x15, 0x2e, 0x69, 0x6a, 0x7e, 0x1a, 0x3b, 0x4e, 0x23, 0xc3, 0xb5, 0x41, 0x1b, 0x0b, 0xa3, 0x11, 0xfb, 0xd2, 0x22, 0x79, 0x38, 0xb8, 0xa9, 0x90, 0x31, 0x9e, 0x2d, 0x94, 0xdd, 0x45, 0x1b, 0x3e, 0x2c, 0xbc, 0x43, 0x42, 0x39, 0x00, 0x17, 0xce, 0x9d, 0xb5, 0x25, 0x02, 0x03, 0x9f, 0xb8, 0xdc, 0x18, 0x5d, 0xdc, 0x68, 0xa2, 0xd1, 0xf8, 0xca, 0xdd, 0xce, 0xf8, 0xe1, 0xa5, 0xe9, 0xec, 0xf1, 0x1a, 0xcd, 0xa0, 0x6d, 0xd7, 0xcc, 0xc9, 0xd5, 0x60, 0x59, 0xe6, 0xc7, 0x5b, 0x56, 0x31, 0x83, 0x58, 0x30, 0x7d, 0x54, 0x66, 0x7b, 0x34, 0xc9, 0x4c, 0xda, 0xab, 0xcf, 0x5c, 0xae, 0x82, 0x75, 0x28, 0xa1, 0xed, 0x4a, 0x55, 0xca, 0x8d, 0x2c, 0xd3, 0x52, 0x58, 0xb6, 0xf8, 0x2d, 0x1d, 0x00, 0x82, 0x0f, 0xff, 0x7f, 0x6d, 0x80, 0xe0, 0xa1, 0x77, 0x23, 0x77, 0x3e, 0x67, 0xff, 0x82, 0x18, 0xff, 0x17, 0x00, 0xeb, 0xa9, 0x92, 0x3c, 0x2e, 0x16, 0x27, 0x36, 0xde, 0xef, 0x72, 0x42, 0xb8, 0x9a, 0xbb, 0xa7, 0x46, 0x9b, 0xa6, 0x75, 0xce, 0x8b, 0x71, 0x1c, 0x76, 0x4e, 0x84, 0xaa, 0x15, 0x24, 0xe4, 0xf5, 0x93, 0x4f, 0x19, 0xf3, 0x7b, 0x57, 0xd7, 0x3f, 0x70, 0xfe, 0xb4, 0x75, 0x52, 0x4e, 0x52, 0x88, 0x75, 0xfe, 0x4a, 0x16, 0x22, 0x00, 0xe8, 0xa7, 0x41, 0x7a, 0x8a, 0xb4, 0x15, 0x30, 0xda, 0x3f, 0x5c, 0x54, 0xc3, 0x00, 0xef, 0x4e, 0x65, 0x14, 0xa2, 0xca, 0x8d, 0x4c, 0x3a, 0x4c, 0xba, 0x07, 0xaf, 0xdc, 0x7b, 0x2c, 0x5b, 0x95, 0x79, 0x6e, 0x0b, 0xc4, 0xf3, 0x09, 0x80, 0x5e, 0xc1, 0x18, 0x23, 0x49, 0xe6, 0x81, 0xcd, 0x8b, 0x5d, 0xfc, 0xa2, 0xed, 0xd2, 0x46, 0x30, 0x6d, 0x21, 0x77, 0xde, 0xa3, 0x1f, 0xeb, 0x29, 0x51, 0xd0, 0xae, 0x06, 0x92, 0x1c, 0xd3, 0x80, 0x4f, 0x85, 0x3e, 0xbc, 0xf1, 0xb9, 0x59, 0x1a, 0x25, 0xe2, 0xdb, 0x0a, 0x51, 0xad, 0x2f, 0x62, 0xbd, 0xf6, 0x1a, 0x59, 0xd7, 0x84, 0x48, 0xc7, 0xd3, 0x82, 0xd8, 0xb8, 0x63, 0x02, 0xf4, 0x77, 0x0b, 0x7e, 0xe9, 0x54, 0xc7, 0x5f, 0x04, 0xcd, 0x38, 0xf9, 0xb3, 0xc1, 0x29, 0x7e, 0x69, 0x01, 0x7b, 0xa7, 0x03, 0x4d, 0xd0, 0x2a, 0x3e, 0x5f, 0x06, 0xf2, 0xcb, 0x15, 0x5a, 0x91, 0xe8, 0x02, 0xbc, 0x9c, 0xfb, 0x54, 0x26, 0xb3, 0xec, 0xe1, 0xb7, 0x8b, 0x14, 0x71, 0xc2, 0xc7, 0x8b, 0x61, 0x91, 0x25, 0xcd, 0x51, 0x79, 0x90, 0xcf, 0x26, 0x34, 0x1b, 0x1b, 0xc9, 0x8d, 0xc7, 0x60, 0x15, 0x41, 0x06, 0x48, 0x08, 0xbd, 0x30, 0x28, 0xfc, 0x5e, 0x06, 0x5a, 0x58, 0x89, 0xd1, 0x0c, 0xb6, 0x4c, 0x23, 0x6a, 0xe5, 0x10, 0x97, 0xba, 0x97, 0x01, 0xee, 0x9d, 0x3e, 0x2e, 0x2a, 0x88, 0xa6, 0x86, 0xdc, 0xb1, 0xd8, 0x6a, 0xc0, 0x1c, 0xa8, 0x64, 0xb6, 0x7f, 0x65, 0x7c, 0x5d, 0x91, 0xdf, 0x64, 0x93, 0x93, 0xcf, 0xa7, 0xc6, 0xf9, 0xd3, 0x76, 0xc1, 0x89, 0x90, 0x48, 0xd2, 0x24, 0xa2, 0x68, 0x2f, 0xa8, 0x32, 0xd6, 0x28, 0x27, 0x74, 0x44, 0xdf, 0x56, 0x0d, 0x6a, 0x85, 0xf7, 0xe7, 0x5c, 0x33, 0xcc, 0x2c, 0xa1, 0x55, 0x93, 0xe8, 0x9e, 0x18, 0x08, 0xd3, 0x11, 0x69, 0xb8, 0xb6, 0x03, 0x50, 0x80, 0x2b, 0xce, 0x66, 0x67, 0x13, 0xd8, 0x88, 0x67, 0xcd, 0xb8, 0x51, 0x48, 0xd3, 0xd7, 0x8e, 0x0f, 0x11, 0x5f, 0x89, 0xdd, 0x84, 0xe2, 0xb0, 0x5b, 0x1e, 0xb9, 0x0f, 0x41, 0x6e, 0xfb, 0x3c, 0x13, 0x56, 0xcd, 0x4b, 0x06, 0x05, 0x4d, 0x82, 0xed, 0xa3, 0xa5, 0x37, 0xfb, 0x4f, 0x14, 0x3b, 0x20, 0xdf, 0x13, 0xf1, 0x34, 0x14, 0x31, 0xea, 0xd3, 0x17, 0x4c, 0xa3, 0x7f, 0xf6, 0x9b, 0x13, 0x08, 0x3c, 0x31, 0x85, 0xb2, 0xae, 0xf3, 0x3f, 0x46, 0x70, 0x75, 0x26, 0x77, 0x58, 0xb8, 0x4c, 0x33, 0xad, 0x4c, 0xb1, 0x1b, 0xc7, 0x93, 0xde, 0xd1, 0xaf, 0xfe, 0xc6, 0x96, 0x82, 0x58, 0x0a, 0xfb, 0x70, 0xfd, 0xa4, 0x8f, 0x7d, 0x4b, 0x9b, 0xbf, 0x1f, 0xc4, 0x50, 0x7d, 0x4a, 0x11, 0x10, 0x69, 0x68, 0x23, 0xa4, 0xfe, 0xbe, 0x39, 0x3b, 0xc2, 0x4c, 0x66, 0x4d, 0xed, 0x71, 0x66, 0x96, 0x9c, 0xc0, 0x0b, 0xc5, 0x02, 0x75, 0x79, 0xf6, 0x24, 0xc7, 0x2e, 0x5c, 0x7f, 0x17, 0x16, 0x78, 0x8d, 0x9f, 0xcc, 0xe2, 0x58, 0x62, 0x74, 0x0d, 0xbf, 0xea, 0x9b, 0xc8, 0x65, 0x8a, 0x44, 0x24, 0xcf, 0x8e, 0x79, 0x20, 0x4a, 0x4e, 0x74, 0xc2, 0xef, 0x31, 0x31, 0xe7, 0x73, 0xeb, 0xbe, 0x28, 0x5b, 0x58, 0xb5, 0x4b, 0xd7, 0x36, 0xf5, 0xda, 0x4b, 0x75, 0xb4, 0xbd, 0x81, 0xd0, 0x52, 0x7d, 0xd7, 0xfa, 0x6c, 0x59, 0xbd, 0x02, 0x8d, 0x28, 0x41, 0x21, 0xe9, 0xdb, 0x45, 0x7d, 0xf3, 0x23, 0xc8, 0x9f, 0xf2, 0xed, 0x2e, 0xfa, 0x6f, 0x22, 0x0e, 0x58, 0x6c, 0x96, 0x94, 0xde, 0xa3, 0xce, 0x14, 0x6c, 0xb9, 0x21, 0x43, 0xd1, 0x6d, 0x26, 0x11, 0x80, 0xb2, 0xdf, 0xc9, 0x64, 0xb7, 0xd5, 0xf7, 0x4b, 0xb8, 0x04, 0x29, 0x23, 0x4c, 0xb3, 0x4b, 0x0a, 0x03, 0xc9, 0x22, 0xfc, 0x05, 0xa6, 0x2d, 0x99, 0xf3, 0xc1, 0x19, 0xb4, 0xf6, 0x1c, 0xeb, 0x9b, 0xa0, 0xb6, 0x98, 0x28, 0x04, 0x54, 0x12, 0x8d, 0x4d, 0xc7, 0xa7, 0x2a, 0x55, 0x28, 0xe6, 0x6b, 0xd7, 0xaa, 0x00, 0x31, 0x5e, 0x9b, 0xa1, 0xfc, 0xcd, 0x86, 0xe7, 0xd1, 0x4e, 0xea, 0x93, 0x5a, 0x02, 0x2c, 0xa7, 0x3a, 0x48, 0xde, 0xb0, 0xe3, 0x35, 0x2c, 0x53, 0x9e, 0x65, 0xe2, 0xaf, 0x2f, 0xb7, 0xe4, 0x62, 0xb8, 0x26, 0xb9, 0x2f, 0x2f, 0x4c, 0xd7, 0xda, 0xaf, 0x3d, 0xbe, 0x1c, 0x0a, 0xcb, 0x64, 0xb3, 0xcb, 0xc9, 0xd1, 0xf1, 0xdf, 0x8f, 0xa1, 0xd7, 0xba, 0x1d, 0xf8, 0xdd, 0x68, 0xf6, 0x54, 0x9c, 0x59, 0x90, 0x93, 0x7a, 0x10, 0x88, 0x97, 0x0a, 0xc8, 0x34, 0xfc, 0xd0, 0x30, 0xea, 0xd2, 0x2d, 0x39, 0x3a, 0xe0, 0x5c, 0x05, 0xc1, 0x35, 0x1e, 0xfb, 0x77, 0x38, 0xb7, 0xb3, 0xf8, 0x84, 0x75, 0xfd, 0x11, 0xec, 0x6a, 0xef, 0xc6, 0xd6, 0x8b, 0x5f, 0xb3, 0xf7, 0x05, 0x05, 0x36, 0x94, 0x02, 0x7a, 0xf2, 0xc1, 0x40, 0x46, 0xf9, 0x38, 0xb6, 0x37, 0xc5, 0xec, 0x00, 0xe3, 0xd0, 0x6f, 0xfb, 0xa5, 0x0a, 0x05, 0xc7, 0x97, 0x20, 0xe5, 0xd7, 0x8f, 0x33, 0x05, 0x18, 0xc3, 0x14, 0xed, 0x72, 0x00, 0x1d, 0x7a, 0x5e, 0xa1, 0xb4, 0x32, 0x2d, 0xe4, 0xf1, 0xd7, 0x43, 0xb2, 0x27, 0xf8, 0x43, 0x41, 0x9d, 0x02, 0xf8, 0xc4, 0xb8, 0x7d, 0x84, 0x1f, 0xc3, 0xb6, 0xcf, 0x73, 0xdf, 0x6b, 0xad, 0xda, 0x7b, 0xe6, 0xa0, 0x55, 0xa4, 0x5a, 0x48, 0x8a, 0xd0, 0xe3, 0xe1, 0x62, 0x86, 0xe3, 0x7d, 0xab, 0x23, 0x2b, 0x1e, 0x57, 0x64, 0x25, 0xf7, 0x67, 0x71, 0x07, 0x90, 0x7f, 0xf5, 0x59, 0xc1, 0x89, 0x3e, 0x9f, 0xfe, 0x16, 0xbc, 0x5e, 0xc9, 0xcd, 0x6d, 0x60, 0x97, 0x00, 0x33, 0x4c, 0x10, 0x9f, 0x24, 0xcc, 0x7f, 0x9f, 0x43, 0x4c, 0x80, 0x7e, 0x94, 0x0d, 0x5d, 0xb4, 0x00, 0x6b, 0xbf, 0x3a, 0xb4, 0xee, 0x9a, 0x75, 0xa4, 0x2a, 0x20, 0xa0, 0x1a, 0x04, 0x5d, 0xf5, 0x06, 0x19, 0x9a, 0x1a, 0xd8, 0xb4, 0xca, 0xd7, 0xbb, 0xe5, 0x8b, 0x0d, 0x34, 0x30, 0x9e, 0xf4, 0x45, 0xa5, 0xd5, 0x2d, 0x0d, 0x68, 0x3a, 0xb9, 0xef, 0x86, 0x47, 0x38, 0xda, 0xc7, 0x05, 0xd4, 0x60, 0xc8, 0x99, 0x2f, 0xb7, 0x34, 0x44, 0x1c, 0x5b, 0xa2, 0x97, 0x2a, 0xb2, 0xa5, 0xe1, 0x24, 0x44, 0x01, 0x79, 0x60, 0x0f, 0x12, 0xe3, 0x9b, 0x01, 0xe1, 0x23, 0x94, 0x0d, 0x46, 0x59, 0x78, 0x53, 0xe1, 0x39, 0x7e, 0x3e, 0xe3, 0x80, 0xe3, 0xe9, 0xf1, 0xa9, 0x29, 0xf0, 0xc4, 0x96, 0xd5, 0x8d, 0xe6, 0x40, 0xc5, 0x40, 0x22, 0x8f, 0x96, 0xa0, 0xc5, 0x90, 0xa9, 0x8b, 0xba, 0xb4, 0xcc, 0x77, 0x07, 0x95, 0xb7, 0x37, 0xe3, 0x84, 0xc5, 0xb0, 0xc8, 0x8d, 0x53, 0xa9, 0x57, 0xa5, 0x73, 0xbb, 0xea, 0x5a, 0xcc, 0x79, 0x22, 0x6e, 0x65, 0x63, 0x5c, 0xd5, 0xb4, 0x35, 0xf9, 0xed, 0x95, 0xfa, 0xad, 0x73, 0x7c, 0x20, 0x53, 0x45, 0xac, 0x76, 0x36, 0x50, 0x65, 0xe0, 0x63, 0x14, 0x1e, 0xa2, 0x82, 0x73, 0x43, 0x22, 0xe4, 0xce, 0xbb, 0x6f, 0xb5, 0xa3, 0x99, 0xd8, 0x0a, 0x8d, 0xc2, 0x0d, 0xb7, 0xa6, 0x56, 0xbf, 0x13, 0x84, 0x63, 0x18, 0x8f, 0xaf, 0x15, 0xc9, 0x21, 0xe3, 0xf6, 0x08, 0x48, 0x90, 0xe2, 0x95, 0xf9, 0x69, 0x7f, 0xce, 0xa7, 0x83, 0xdb, 0x5c, 0x35, 0x24, 0x3e, 0x8c, 0x98, 0x3d, 0xd7, 0xe6, 0xc2, 0xe8, 0x23, 0xde, 0xf5, 0x35, 0xa5, 0x98, 0x2a, 0x96, 0x9c, 0xe3, 0xf7, 0x97, 0x17, 0x16, 0x24, 0x46, 0xd2, 0x30, 0x5f, 0x38, 0xd4, 0x63, 0x7c, 0x9e, 0xa1, 0x92, 0xa8, 0xbb, 0x20, 0x79, 0x25, 0xe6, 0x79, 0x6a, 0x73, 0x2a, 0xb9, 0xe8, 0x8b, 0x4d, 0xd4, 0x97, 0x37, 0x5f, 0x05, 0x86, 0xb5, 0x91, 0x0e, 0xc9, 0xd5, 0x75, 0xa0, 0xb4, 0xb4, 0xe7, 0x6f, 0x9a, 0xf5, 0xb9, 0x24, 0x22, 0x21, 0x15, 0x0c, 0x18, 0x4a, 0x65, 0x18, 0x80, 0xa6, 0x11, 0x67, 0x8f, 0x97, 0x6a, 0x68, 0x5a, 0x4d, 0xca, 0xae, 0x2a, 0x05, 0x40, 0xe7, 0x01, 0xef, 0xa5, 0xdb, 0xa3, 0x96, 0x19, 0x59, 0xa7, 0x7c, 0x0f, 0xae, 0xc3, 0xd1, 0xf5, 0x8e, 0x4a, 0xa3, 0xc7, 0x8c, 0x54, 0x85, 0x01, 0x14, 0x3b, 0x44, 0x16, 0xe0, 0xa0, 0xdb, 0x0b, 0x66, 0xe8, 0x9d, 0x2c, 0xea, 0xc3, 0xf5, 0x43, 0xaf, 0xfd, 0xec, 0x3d, 0x1a, 0x83, 0x96, 0x4a, 0xfb, 0x5a, 0x7c, 0x00, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xe0, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0xc3, 0xa9, 0xb9, 0x73, 0x50, 0xe3, 0x6a, 0x08, 0xb4, 0x2e, 0x64, 0x6d, 0x05, 0x00, 0x01, 0xb3, 0xd5, 0x92, 0x5f, 0xdd, 0xe1, 0xe6, 0xd0, 0x9d, 0xc5, 0x1c, 0xa6, 0xe6, 0x19, 0xb0, 0x16, 0x15, 0xa1, 0xc3, 0xa6, 0xdb, 0xdb, 0x47, 0x92, 0xa0, 0x40, 0x59, 0x85, 0x23, 0xde, 0x43, 0x26, 0x81, 0x72, 0xab, 0xd9, 0x0b, 0x02, 0xc4, 0x4e, 0x6d, 0xc8, 0x02, 0x67, 0x4a, 0x2f, 0x79, 0x49, 0x22, 0x44, 0xbf, 0x58, 0xec, 0xef, 0x55, 0x29, 0xc6, 0x17, 0xba, 0xf0, 0xcf, 0x1b, 0x94, 0x1d, 0x83, 0x10, 0x85, 0x07, 0x90, 0xda, 0xb9, 0x45, 0xa5, 0x1f, 0xc0, 0x79, 0x00, 0x6d, 0x0b, 0x14, 0xbc, 0xed, 0xde, 0x1f, 0xd4, 0x4a, 0x0c, 0x6e, 0x82, 0x26, 0xeb, 0x37, 0xb8, 0x0b, 0xd0, 0xa5, 0xb3, 0x5f, 0xc1, 0x8e, 0xb8, 0x3d, 0x6d, 0x39, 0x17, 0x64, 0x86, 0x7b, 0x56, 0x01, 0x8d, 0x54, 0x17, 0x5a, 0x16, 0xec, 0x64, 0x3b, 0x4a, 0xce, 0x4a, 0x1d, 0xd7, 0x57, 0xbe, 0x0e, 0x8b, 0x2e, 0xad, 0xd4, 0xbd, 0xab, 0x6b, 0x58, 0xa3, 0xee, 0xd3, 0x2e, 0x38, 0x3c, 0x34, 0x68, 0xe5, 0x37, 0x3b, 0x1d, 0xff, 0xb6, 0x08, 0x3a, 0xed, 0x46, 0x70, 0xc4, 0x85, 0xcd, 0x1e, 0xce, 0xcd, 0x90, 0xa5, 0x7e, 0x42, 0x21, 0xe4, 0x1b, 0x0a, 0xe9, 0xda, 0x9f, 0x42, 0x12, 0xec, 0x89, 0xb8, 0xd3, 0x3e, 0x3e, 0x5e, 0xa0, 0x5e, 0xae, 0x9e, 0x13, 0xa4, 0x7f, 0x89, 0x52, 0x92, 0x36, 0x87, 0x2e, 0x34, 0xaf, 0x3b, 0x0d, 0xaa, 0xe2, 0xfe, 0x85, 0xe5, 0x96, 0x49, 0x2f, 0xf3, 0x28, 0x8a, 0x00, 0xe4, 0x67, 0x9e, 0xf8, 0xc9, 0x70, 0xbd, 0x7c, 0x05, 0x6a, 0x57, 0x81, 0x6f, 0xbc, 0x59, 0x59, 0xc0, 0xce, 0x04, 0xe5, 0x67, 0xc4, 0xac, 0xba, 0xda, 0xd3, 0xe1, 0xbc, 0xf0, 0x79, 0xbb, 0x53, 0x4b, 0xc7, 0x85, 0x63, 0xbf, 0xf0, 0x4f, 0x2f, 0xfa, 0x8d, 0xcf, 0xd7, 0x75, 0x7b, 0x1d, 0x05, 0xea, 0x00, 0x00, 0x01, 0x00, 0x19, 0x48, 0xbb, 0x1d, 0x3e, 0xd9, 0x98, 0x87, 0x8e, 0x14, 0x43, 0x97, 0xd5, 0xae, 0x1f, 0xcc, 0x45, 0x84, 0x6b, 0x27, 0xad, 0x5d, 0x2f, 0x93, 0x5f, 0xac, 0xca, 0x18, 0x34, 0x36, 0x1e, 0x99, 0xf7, 0x9c, 0xf2, 0x93, 0x6a, 0x9c, 0x39, 0xe8, 0x70, 0x87, 0xce, 0x64, 0xf2, 0xa4, 0x70, 0x40, 0x50, 0x49, 0xc2, 0xa7, 0xa9, 0xe9, 0x78, 0xe7, 0xec, 0x6b, 0x33, 0xca, 0x7a, 0xfa, 0x49, 0x4c, 0x39, 0xe4, 0x8d, 0xe5, 0x3d, 0x3f, 0x63, 0xd4, 0xf6, 0xc2, 0x45, 0xc8, 0x93, 0xb6, 0xf9, 0xaa, 0x4d, 0xd2, 0xbc, 0x7e, 0x56, 0x99, 0x6f, 0x43, 0x98, 0x4f, 0xfa, 0xdc, 0x4f, 0x15, 0x30, 0xcf, 0x70, 0x9d, 0x47, 0x0b, 0xb7, 0x42, 0xf8, 0xa6, 0xd3, 0x00, 0x75, 0xff, 0x3a, 0xe4, 0x2f, 0x13, 0xa1, 0xc9, 0xc6, 0x11, 0xa1, 0x51, 0xbb, 0xd4, 0x3d, 0x69, 0x7e, 0xfc, 0xec, 0xa5, 0x77, 0xa4, 0x04, 0x5b, 0xd0, 0x6c, 0x78, 0xe7, 0xbe, 0x10, 0x4c, 0xfc, 0xa2, 0x1f, 0x03, 0x5c, 0x28, 0x57, 0x2f, 0x95, 0xff, 0xdd, 0x65, 0x0b, 0x38, 0xcd, 0x2e, 0x72, 0xcc, 0xcd, 0x2d, 0x80, 0x80, 0x5a, 0xa3, 0x09, 0xaa, 0xd8, 0x9e, 0xe3, 0x96, 0xc2, 0x86, 0xed, 0xe7, 0x55, 0xd6, 0x9e, 0xce, 0xfc, 0x3c, 0x28, 0x40, 0xc8, 0x21, 0xbf, 0x9b, 0x51, 0x64, 0xce, 0x21, 0xe8, 0xc4, 0xab, 0x72, 0xc2, 0x07, 0x5d, 0xa5, 0x26, 0x0e, 0xdc, 0xfb, 0xa4, 0xec, 0x63, 0x00, 0x08, 0x50, 0x4e, 0x27, 0xd6, 0xf7, 0x7f, 0x92, 0xe9, 0xe0, 0x11, 0x50, 0xea, 0xbe, 0xf8, 0x53, 0x5d, 0x02, 0xec, 0x8f, 0x0a, 0xb0, 0xbd, 0x33, 0x22, 0x37, 0x0f, 0x80, 0xff, 0x45, 0xcf, 0x71, 0xdc, 0x00, 0xad, 0x25, 0x1b, 0xee, 0x88, 0x71, 0x69, 0xa5, 0x06, 0x07, 0x21, 0x55, 0x10, 0x43, 0xe0, 0xdb, 0x1a, 0x99, 0xdd, 0xa6, 0xdf, 0xd4, 0x63, 0x2c, 0x1b, 0x0c, 0x17, 0x61, 0xd5, 0x97, 0x2c, 0x71, 0xcf, 0xd7, 0x15, 0x5a, 0x49, 0x83, 0x2a, 0x32, 0x29, 0x19, 0x75, 0x65, 0xc3, 0x6f, 0x17, 0xbb, 0xd2, 0x94, 0x76, 0x2f, 0x7a, 0x96, 0xb5, 0x1f, 0xa1, 0xce, 0xa1, 0x63, 0x0b, 0x29, 0x1c, 0x84, 0x73, 0x37, 0x5f, 0x00, 0x22, 0x41, 0x24, 0x78, 0xb0, 0x34, 0x6e, 0xcf, 0xe7, 0x26, 0x49, 0x61, 0x5b, 0x04, 0x81, 0xe6, 0x15, 0x18, 0x81, 0xc9, 0xd7, 0x2f, 0x28, 0x64, 0xea, 0x30, 0x08, 0x8e, 0x7b, 0x7c, 0x09, 0x79, 0x43, 0x27, 0xa8, 0x9d, 0x38, 0x01, 0xbe, 0xbd, 0xe5, 0xeb, 0xea, 0x83, 0xbd, 0x37, 0x77, 0x71, 0xf2, 0x1d, 0x24, 0x1b, 0x64, 0x57, 0xd7, 0x30, 0x20, 0xa6, 0xa9, 0x3d, 0xe7, 0xd1, 0x34, 0x53, 0x72, 0x3a, 0xb8, 0xe1, 0x39, 0x3e, 0xef, 0x46, 0x94, 0x97, 0xb4, 0x2c, 0xf6, 0x5f, 0xd6, 0x8d, 0xb5, 0x77, 0xf4, 0x38, 0x25, 0x90, 0xc7, 0x21, 0x9d, 0xa7, 0x4a, 0xd2, 0x09, 0xf1, 0xb9, 0x64, 0xed, 0x88, 0xb5, 0xfa, 0xce, 0x60, 0x44, 0x46, 0xf5, 0xb1, 0x02, 0x8e, 0x0f, 0x44, 0xe9, 0x2d, 0x93, 0x4c, 0xd7, 0xa5, 0x03, 0xb1, 0xff, 0x3d, 0xad, 0xf3, 0x7f, 0x00, 0xbb, 0x70, 0x34, 0x74, 0xd7, 0x89, 0x19, 0xb7, 0x17, 0x6a, 0xf1, 0xdb, 0x6c, 0x7a, 0xb1, 0x9f, 0x34, 0xff, 0x51, 0x68, 0x41, 0x9c, 0xea, 0x2b, 0x69, 0x7e, 0x73, 0xf0, 0xb6, 0xa9, 0x3e, 0x65, 0x00, 0xd9, 0xf1, 0xb4, 0x95, 0xdc, 0xdf, 0x89, 0xbc, 0x97, 0xf2, 0x56, 0xf0, 0xa6, 0x01, 0xfa, 0x67, 0x16, 0x0f, 0x38, 0xb1, 0x28, 0x23, 0x0b, 0xef, 0xaa, 0x5f, 0x43, 0xd3, 0x3b, 0xad, 0xe7, 0xf7, 0xe3, 0xa6, 0xdb, 0x84, 0x78, 0x12, 0xda, 0x7d, 0xcb, 0x59, 0xda, 0x76, 0x7f, 0x23, 0x88, 0xe4, 0x9b, 0x7b, 0x4d, 0xb4, 0x29, 0xce, 0xd7, 0x81, 0xa7, 0x0a, 0x12, 0xbb, 0x4f, 0x31, 0x2a, 0x45, 0x6f, 0xbb, 0x68, 0x0a, 0x8b, 0xe2, 0xba, 0xe4, 0x49, 0xa0, 0x13, 0x45, 0x7b, 0xd4, 0x65, 0x01, 0xc8, 0x68, 0x8c, 0xe4, 0x00, 0x4f, 0x15, 0xdf, 0x0a, 0x08, 0x0f, 0x2c, 0x2d, 0x8a, 0x2b, 0xfc, 0xa2, 0x37, 0x96, 0xfb, 0xaf, 0x92, 0x7d, 0xcf, 0x2a, 0x71, 0xec, 0x47, 0x9d, 0x44, 0x49, 0x23, 0x84, 0x3e, 0x4d, 0x97, 0x36, 0x1a, 0xf8, 0xc6, 0x0c, 0x6e, 0x52, 0x29, 0xeb, 0xc1, 0xbd, 0x74, 0xf1, 0x9e, 0x02, 0xf6, 0x21, 0xd0, 0x87, 0x67, 0x29, 0x2a, 0xcd, 0xfc, 0xfb, 0xd5, 0x6e, 0xe1, 0xe3, 0xec, 0xdd, 0x0b, 0x64, 0x16, 0xe8, 0xf6, 0x4b, 0x0f, 0x1e, 0x49, 0x92, 0xd4, 0x5d, 0x0c, 0xcb, 0x1b, 0x41, 0x85, 0x30, 0x42, 0x91, 0xe8, 0x4a, 0x31, 0xbc, 0x0d, 0x4f, 0x3e, 0xd4, 0x9f, 0x9b, 0x51, 0xaa, 0x84, 0x9a, 0x25, 0x85, 0x5e, 0x87, 0x4b, 0x95, 0x12, 0x52, 0x69, 0x54, 0x31, 0x45, 0xde, 0xe2, 0x58, 0xf6, 0xde, 0x8f, 0xce, 0xa1, 0x66, 0x0e, 0x35, 0xd6, 0xc5, 0x7c, 0x70, 0x83, 0x71, 0xe7, 0x96, 0x06, 0x06, 0x75, 0xcd, 0x0b, 0xeb, 0x9b, 0x98, 0x8d, 0x79, 0xc2, 0x33, 0xad, 0x4b, 0x1c, 0x08, 0x67, 0x63, 0x65, 0xd0, 0xbd, 0x67, 0x56, 0x7a, 0x0a, 0x46, 0x9c, 0xe8, 0x10, 0x25, 0x9d, 0xb1, 0x97, 0x4c, 0x20, 0xe8, 0x5a, 0x07, 0xc7, 0x82, 0x36, 0x9b, 0xfd, 0x32, 0x15, 0xf2, 0xe6, 0x86, 0x20, 0x61, 0xb8, 0xc9, 0xc5, 0x86, 0xcb, 0x84, 0x35, 0x86, 0x96, 0xb2, 0x5e, 0xcc, 0x00, 0x2e, 0x14, 0x1c, 0x64, 0xd0, 0xdb, 0x59, 0x0e, 0x5e, 0x53, 0x07, 0x94, 0x05, 0xa8, 0xa8, 0x5e, 0x9f, 0xb6, 0x44, 0xbd, 0x7d, 0x03, 0x47, 0xf7, 0xb2, 0xbf, 0x21, 0xf6, 0xc6, 0xe5, 0xe3, 0xaa, 0x1a, 0xab, 0xca, 0x79, 0x0d, 0x72, 0xa7, 0xc4, 0x48, 0x97, 0x1e, 0xbc, 0x8c, 0xf9, 0xbf, 0xe5, 0xc2, 0xfa, 0x64, 0x0f, 0xa6, 0x1c, 0x98, 0xa8, 0x74, 0x47, 0x51, 0x55, 0xc3, 0x53, 0x64, 0xc6, 0x17, 0xed, 0x44, 0x02, 0x25, 0x33, 0xcd, 0x13, 0xa8, 0x1e, 0x9c, 0x3f, 0x49, 0xf1, 0xac, 0x6a, 0xd5, 0xfb, 0xb3, 0xde, 0xcc, 0xf5, 0x3e, 0xb7, 0x73, 0x2e, 0xb2, 0x0e, 0x0c, 0x03, 0x5c, 0xbb, 0xf6, 0x0e, 0x57, 0x0a, 0x15, 0xd5, 0x84, 0xdb, 0x3c, 0x6c, 0x64, 0xca, 0xe7, 0x41, 0x52, 0xb3, 0x62, 0xb8, 0xf5, 0xd0, 0xdd, 0xc5, 0xba, 0x1a, 0x26, 0x6b, 0xb7, 0xe5, 0xb5, 0x9d, 0xdb, 0x21, 0x4a, 0x28, 0x1a, 0xe4, 0x6a, 0xd0, 0x32, 0x71, 0xf0, 0x7d, 0x02, 0x67, 0x75, 0x9d, 0xe0, 0x0f, 0x61, 0x2b, 0x60, 0xb2, 0xc0, 0x1f, 0x73, 0x72, 0x10, 0x43, 0x7e, 0xcc, 0x28, 0x52, 0xb0, 0xa9, 0x75, 0x20, 0x79, 0xf8, 0xd6, 0x20, 0x6e, 0x3d, 0x38, 0x0e, 0x5d, 0x61, 0xe6, 0x32, 0xfc, 0x34, 0xa6, 0x6d, 0xd9, 0xd0, 0x59, 0x7b, 0xc7, 0xdb, 0xb7, 0x23, 0x7c, 0x4a, 0x66, 0x2d, 0xae, 0x6c, 0xde, 0x6d, 0x50, 0x14, 0x83, 0xb3, 0x28, 0xa3, 0x4c, 0x7e, 0xde, 0x3b, 0x24, 0x6b, 0xb7, 0x5f, 0x08, 0xa2, 0x06, 0x0f, 0x31, 0x13, 0x66, 0x1e, 0xf9, 0x8e, 0x85, 0x61, 0xb9, 0xbb, 0x67, 0x28, 0x2a, 0xe7, 0xd9, 0xb4, 0x7e, 0xab, 0x1b, 0xb2, 0xdb, 0x2d, 0x7e, 0xb9, 0x96, 0x10, 0x82, 0x20, 0xa9, 0xa2, 0x44, 0x72, 0xb3, 0xe7, 0x97, 0x63, 0x3e, 0xdc, 0x81, 0x2a, 0xbf, 0x2b, 0xf5, 0x02, 0x37, 0xe8, 0x77, 0x3b, 0x8b, 0xe1, 0x11, 0xcf, 0xab, 0x26, 0xbd, 0x07, 0x62, 0x45, 0x0a, 0x5f, 0x55, 0x10, 0x7a, 0x52, 0xa0, 0xea, 0x1c, 0x84, 0xdf, 0xa2, 0x31, 0xaf, 0x2a, 0xe5, 0x50, 0x39, 0x58, 0xc0, 0x65, 0x3f, 0xad, 0x3b, 0x27, 0xa1, 0x3b, 0x26, 0x91, 0x02, 0x82, 0xaf, 0xfc, 0x36, 0xc3, 0x42, 0xc7, 0x2b, 0x40, 0xd1, 0xf1, 0xde, 0x6d, 0x0c, 0x35, 0x28, 0xa1, 0x7d, 0x62, 0x51, 0xeb, 0x04, 0xca, 0xdb, 0x81, 0x8e, 0x4e, 0x2a, 0x41, 0xb9, 0x6e, 0x2f, 0x58, 0x53, 0x1b, 0xa6, 0x34, 0x06, 0x50, 0x56, 0xa2, 0x66, 0x8e, 0xc5, 0xfb, 0xe1, 0x38, 0x54, 0x10, 0x98, 0x56, 0xda, 0xda, 0x24, 0xb9, 0xc9, 0xba, 0x3e, 0xcf, 0xa9, 0x89, 0x52, 0xcb, 0x6c, 0x21, 0x37, 0xdc, 0xdb, 0xdc, 0x86, 0x0e, 0xa3, 0x6e, 0xe4, 0x56, 0x03, 0xbc, 0x7c, 0x61, 0xd8, 0x12, 0xeb, 0x7e, 0x92, 0xe4, 0xfc, 0xc9, 0xbc, 0x3b, 0x18, 0x5b, 0x09, 0xdb, 0x97, 0xd6, 0xd6, 0x6f, 0xa1, 0xbd, 0x17, 0xfb, 0x18, 0xc1, 0x8e, 0xf2, 0x03, 0x32, 0x4d, 0x18, 0x38, 0x31, 0x50, 0xe7, 0x56, 0xc6, 0xaa, 0x1c, 0x27, 0xb9, 0xb6, 0x0f, 0x5c, 0x11, 0x0d, 0x7d, 0xd2, 0xdd, 0x72, 0xe4, 0x30, 0xbb, 0xa9, 0x7a, 0xa4, 0x17, 0xeb, 0x0e, 0x8d, 0xe4, 0xfd, 0x3c, 0xd5, 0x81, 0xea, 0x53, 0x05, 0xbb, 0xa5, 0x5a, 0xdc, 0xfe, 0x58, 0x40, 0x4d, 0xf0, 0xdb, 0xc8, 0x48, 0x05, 0x2e, 0x06, 0xb4, 0x21, 0x43, 0x10, 0x3d, 0x3d, 0x66, 0xfe, 0x47, 0x91, 0x5b, 0x93, 0xde, 0x27, 0x60, 0x9e, 0x15, 0x23, 0xc7, 0x24, 0xeb, 0xa3, 0x1b, 0x4c, 0xff, 0x32, 0x95, 0xb5, 0xd2, 0x96, 0x1c, 0x1d, 0xa9, 0x02, 0x57, 0xbe, 0x93, 0xd0, 0x35, 0x3d, 0xc9, 0xeb, 0xd9, 0x6a, 0x3e, 0x9b, 0x0d, 0x33, 0x20, 0xa2, 0x44, 0x5f, 0x81, 0x75, 0x8c, 0xd7, 0x92, 0xbc, 0xb6, 0x57, 0x84, 0xce, 0xe8, 0xe4, 0x7e, 0x6b, 0xed, 0x95, 0x69, 0x25, 0x96, 0xae, 0x78, 0x67, 0x90, 0x02, 0xee, 0xe5, 0x11, 0x2d, 0x6c, 0x68, 0x02, 0x49, 0xb1, 0x00, 0xda, 0x84, 0x07, 0x7a, 0x53, 0x24, 0x9d, 0xb4, 0xfc, 0xf3, 0x38, 0x3b, 0xc2, 0xed, 0x36, 0x66, 0x62, 0x84, 0xee, 0x53, 0x37, 0x48, 0xb2, 0xb8, 0xfa, 0x1a, 0x40, 0xf7, 0xa1, 0x10, 0x49, 0x32, 0x97, 0xf8, 0xee, 0x64, 0x94, 0x20, 0x82, 0xac, 0x19, 0x34, 0x6a, 0x33, 0xce, 0x1a, 0x14, 0xb3, 0x9e, 0x62, 0x83, 0xea, 0xc5, 0x29, 0xf1, 0xed, 0xa4, 0xae, 0xb8, 0x54, 0x72, 0xd1, 0xce, 0x94, 0xfc, 0x94, 0xf6, 0x52, 0x6b, 0xbb, 0xde, 0x34, 0x37, 0xec, 0xdd, 0x82, 0x94, 0xae, 0xae, 0x20, 0x0b, 0x4a, 0xa2, 0xc5, 0x89, 0x96, 0xbd, 0x07, 0xf1, 0x02, 0xf5, 0x45, 0x9c, 0xb3, 0xa4, 0x91, 0xcd, 0xf5, 0xb3, 0x7c, 0xaf, 0x82, 0xe8, 0xeb, 0xd7, 0xc9, 0xd8, 0x72, 0x46, 0x2e, 0xd5, 0x4e, 0x89, 0x96, 0x3f, 0x67, 0xe4, 0xba, 0x6c, 0x7f, 0xef, 0x49, 0x39, 0xef, 0x17, 0x33, 0x4b, 0x24, 0xf6, 0xb2, 0x5d, 0x01, 0x58, 0x91, 0x95, 0x80, 0xfe, 0xd8, 0x99, 0xc6, 0x0c, 0xfa, 0x85, 0x77, 0xc8, 0x18, 0x44, 0x2e, 0xa6, 0xbb, 0x2b, 0xfb, 0xa4, 0x23, 0x8e, 0xbe, 0xde, 0x19, 0xff, 0x71, 0x83, 0x72, 0x4e, 0xbb, 0x84, 0xae, 0x8a, 0x0a, 0x52, 0xa4, 0x0a, 0x90, 0x7b, 0xb3, 0x11, 0xf3, 0xe8, 0xb3, 0x6f, 0x91, 0xf3, 0xca, 0xd0, 0x9e, 0xf8, 0xfb, 0x7a, 0x1f, 0x4a, 0x9a, 0x26, 0x3c, 0x5f, 0x96, 0xf4, 0x58, 0x2a, 0x27, 0x8c, 0x00, 0x00, 0x01, 0xb7 }; +constexpr AccessUnit M2V_BEGIN_OF_AU_SPLIT_EXPECTED_AU = { std::numeric_limits::max(), std::numeric_limits::max(), false, 0, {}, { 0x82, 0x81, 0xd3, 0x81, 0x99, 0x42, 0xa6, 0x9c, 0xe1, 0x8b, 0xab, 0x3e, 0xdb, 0x1c, 0x00, 0x03, 0xae, 0x8a, 0x24, 0x51 } }; + +const std::vector ATRACX_BEGIN_OF_AU_SPLIT_STREAM = { 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xbd, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x00, 0x00, 0x00, 0x00, 0x6c, 0xa7, 0x0b, 0x60, 0xfe, 0xb5, 0x2e, 0x3b, 0x4e, 0x6b, 0xaf, 0x90, 0x57, 0xc4, 0x99, 0xd0, 0x4e, 0xfa, 0x04, 0x29, 0x4c, 0x23, 0xcd, 0x8a, 0x9a, 0xac, 0x64, 0x27, 0x65, 0x27, 0xa2, 0x5c, 0xe2, 0xfd, 0x1d, 0x15, 0xcf, 0x72, 0x70, 0x1e, 0xb5, 0x08, 0x9f, 0x6f, 0x3d, 0x0b, 0x22, 0x22, 0x99, 0xbe, 0xcc, 0xb6, 0xdd, 0x99, 0xb9, 0x2b, 0xba, 0xa6, 0x32, 0xf0, 0x11, 0xc3, 0x4f, 0xc9, 0x06, 0xb1, 0x27, 0xee, 0x0b, 0xc6, 0xa6, 0x26, 0xf8, 0x02, 0x35, 0x7f, 0x64, 0x4a, 0x5d, 0x87, 0x1e, 0x20, 0xc9, 0x2a, 0x48, 0x0a, 0x57, 0x90, 0x65, 0x5a, 0x14, 0x62, 0x31, 0xbd, 0x5c, 0x28, 0xc6, 0x17, 0xcc, 0x3f, 0xde, 0x22, 0x35, 0xcf, 0xe2, 0xdc, 0xbe, 0x9b, 0xcb, 0x22, 0x96, 0xf1, 0xe1, 0xe9, 0x74, 0x7f, 0xc4, 0x79, 0xca, 0xe4, 0xeb, 0x68, 0x16, 0xeb, 0x39, 0x57, 0x65, 0xed, 0xd1, 0xc3, 0x6b, 0x21, 0x3a, 0xca, 0x94, 0xa2, 0xf7, 0x5f, 0x8e, 0x02, 0x47, 0x02, 0x35, 0xe4, 0x65, 0x3a, 0x34, 0x09, 0x15, 0x63, 0x8d, 0x0b, 0x1f, 0xdc, 0x1e, 0x8d, 0x6b, 0xfd, 0x16, 0xe7, 0xf6, 0x12, 0x2f, 0x75, 0x30, 0x31, 0x72, 0xd1, 0x8e, 0x68, 0x15, 0x5a, 0xbc, 0xf7, 0x0e, 0x89, 0x07, 0x20, 0xa0, 0x9b, 0xae, 0x14, 0x2a, 0xe7, 0x74, 0xa5, 0xf0, 0x15, 0xec, 0xda, 0x9a, 0x6e, 0xe2, 0x80, 0xc6, 0x98, 0xac, 0x8e, 0xc4, 0xfb, 0xdc, 0x73, 0x5b, 0x97, 0xcd, 0xa4, 0x99, 0xea, 0x92, 0x39, 0x50, 0xcc, 0xdc, 0x09, 0x89, 0x09, 0xed, 0x61, 0x44, 0x7a, 0xa3, 0x9b, 0x70, 0x86, 0x36, 0x0e, 0x81, 0x1d, 0xc5, 0x7a, 0x6a, 0xcf, 0x2e, 0x3f, 0x17, 0xbb, 0xf3, 0xe1, 0x4b, 0x44, 0xe9, 0xdb, 0x1b, 0x69, 0x59, 0x4e, 0xd2, 0x37, 0x1f, 0xe1, 0x22, 0x9a, 0x10, 0xdd, 0x72, 0xc7, 0x56, 0x7c, 0x6f, 0xc4, 0xb3, 0x36, 0xa7, 0xce, 0x69, 0xad, 0x7c, 0xc4, 0x1c, 0xed, 0xa0, 0x55, 0x8d, 0x44, 0x37, 0x96, 0x41, 0x3c, 0x06, 0xe1, 0xbb, 0x58, 0x35, 0x43, 0x5b, 0x0b, 0x10, 0xed, 0x13, 0x02, 0xe2, 0xb2, 0xeb, 0x2f, 0x7d, 0x89, 0x63, 0x2e, 0x52, 0x51, 0xc5, 0x05, 0x06, 0xbd, 0x64, 0xc0, 0x16, 0xfe, 0x41, 0xc9, 0x36, 0xb1, 0xe6, 0xf3, 0x14, 0x06, 0x6e, 0x05, 0x04, 0x02, 0x70, 0x1f, 0xa7, 0xed, 0x2b, 0x80, 0x94, 0x7f, 0x73, 0xb6, 0xf8, 0xa6, 0x16, 0x10, 0x6d, 0x1d, 0xe2, 0xf4, 0x9e, 0x5c, 0x48, 0x1f, 0x00, 0x9d, 0xb4, 0xc1, 0x9f, 0xd4, 0x1a, 0x69, 0x3d, 0xbc, 0x1c, 0x2b, 0x07, 0xeb, 0xe4, 0xe4, 0xdc, 0xf1, 0x82, 0x5b, 0xba, 0xab, 0x9f, 0xf2, 0xdc, 0x21, 0x0c, 0xcd, 0xef, 0x70, 0x1b, 0xf4, 0xbd, 0x9a, 0x7d, 0xde, 0xad, 0x0e, 0x58, 0x68, 0xd2, 0x1b, 0x9b, 0x23, 0x4d, 0xe6, 0x94, 0x6c, 0xe3, 0x75, 0x4f, 0x7e, 0x0e, 0x89, 0x14, 0x79, 0x54, 0x2c, 0x93, 0x4f, 0x05, 0x52, 0x1d, 0x92, 0x15, 0x80, 0x58, 0x8d, 0x42, 0xb6, 0xf4, 0x14, 0x9c, 0x46, 0x45, 0x69, 0x9f, 0xbd, 0x74, 0xd8, 0xe4, 0x30, 0x31, 0x23, 0x78, 0xce, 0x4b, 0xb7, 0x2c, 0x51, 0x2d, 0x76, 0x21, 0x83, 0x41, 0x64, 0x29, 0xce, 0x29, 0x09, 0x4c, 0xe8, 0x0a, 0xbe, 0x12, 0x77, 0xaf, 0x31, 0x0e, 0x6c, 0xc8, 0x4f, 0x29, 0xe4, 0x84, 0xfa, 0x05, 0xe2, 0x1c, 0xdb, 0x56, 0x64, 0xe2, 0xb4, 0x28, 0x6e, 0x51, 0x4b, 0xc4, 0x90, 0xad, 0x5d, 0x8f, 0x90, 0x64, 0x78, 0xf9, 0x7b, 0x3e, 0xd4, 0xf7, 0x2a, 0xdc, 0x40, 0xc0, 0xee, 0x48, 0x69, 0x61, 0x53, 0xe7, 0x76, 0x2e, 0xcb, 0x73, 0x4b, 0xad, 0xe5, 0x93, 0x45, 0x3f, 0x4a, 0x8c, 0x1d, 0x02, 0x2f, 0x02, 0xb7, 0xb3, 0xf7, 0xbe, 0x95, 0x6e, 0x48, 0x63, 0x55, 0x1d, 0xe2, 0xdb, 0xf0, 0x17, 0x22, 0x5f, 0xda, 0xb3, 0xf2, 0x54, 0x08, 0xbc, 0x8b, 0x08, 0x7b, 0x99, 0x37, 0xef, 0xfb, 0x10, 0xc6, 0x7b, 0xdd, 0x43, 0x98, 0xa2, 0x67, 0x55, 0x41, 0xd6, 0x43, 0x5b, 0xfe, 0x59, 0xfa, 0xd1, 0x1c, 0xb5, 0x18, 0x1b, 0x50, 0x68, 0xbd, 0x8f, 0x4a, 0x6f, 0x81, 0xfd, 0x6e, 0x85, 0x76, 0xe3, 0x43, 0x8d, 0x18, 0x2a, 0x1f, 0x8d, 0x75, 0x78, 0xa5, 0xaa, 0xb1, 0x6a, 0xa1, 0x59, 0xa1, 0x7e, 0x40, 0x62, 0x2c, 0x8d, 0x5b, 0xda, 0xa7, 0x32, 0x1c, 0xe2, 0xb9, 0xdd, 0x8d, 0x77, 0x6d, 0xcc, 0x13, 0x5f, 0x0a, 0x40, 0x74, 0xf6, 0xe1, 0x66, 0xda, 0xc3, 0x9c, 0x5c, 0x60, 0x61, 0xed, 0x2f, 0x2c, 0x89, 0x72, 0x7a, 0x11, 0xc6, 0x3a, 0x5d, 0x45, 0x55, 0xd8, 0xa8, 0x03, 0xc6, 0x6d, 0x78, 0xe7, 0xb9, 0x54, 0xb3, 0x6b, 0xc9, 0xcb, 0xc1, 0xac, 0x41, 0x1c, 0x4a, 0x10, 0x21, 0x56, 0x17, 0xa3, 0x1d, 0x1e, 0x78, 0x40, 0x6f, 0x0c, 0x3b, 0x9e, 0xcc, 0x7b, 0xc4, 0xa3, 0x07, 0x90, 0xa3, 0x6c, 0xa4, 0x63, 0xdf, 0xc3, 0xea, 0xf0, 0x85, 0xbc, 0x14, 0xda, 0x31, 0xd8, 0x49, 0x2f, 0x70, 0x85, 0x5c, 0x7b, 0x6d, 0x92, 0x3c, 0x0d, 0x35, 0x61, 0xe7, 0x8d, 0x65, 0xee, 0x37, 0xa3, 0x9a, 0xdb, 0x9c, 0x44, 0x18, 0x7c, 0x01, 0x90, 0xc2, 0xae, 0x37, 0x34, 0x07, 0x9e, 0xb9, 0xf2, 0x53, 0x86, 0x09, 0x9b, 0xc4, 0xda, 0xf8, 0xe2, 0x0e, 0x52, 0x8d, 0xb5, 0xe8, 0xd5, 0x0c, 0x75, 0xe9, 0x1d, 0x9e, 0x52, 0xa3, 0x60, 0x15, 0x50, 0x94, 0xcd, 0x1c, 0x7d, 0xfe, 0x75, 0x61, 0x30, 0x6b, 0xc9, 0x4f, 0xcd, 0xe1, 0x97, 0xa0, 0x9d, 0xaf, 0xfc, 0x57, 0xdf, 0xca, 0xff, 0xd6, 0x23, 0x8d, 0x0a, 0x38, 0x89, 0xdd, 0x9c, 0x60, 0x1e, 0xaf, 0xed, 0x83, 0xac, 0x84, 0x6b, 0xd8, 0xc2, 0x06, 0x5f, 0xc0, 0xef, 0xac, 0x59, 0x96, 0xcc, 0xc4, 0x2f, 0xb7, 0x57, 0x73, 0x9f, 0xee, 0x70, 0x82, 0xe9, 0x3c, 0x54, 0xdf, 0x2c, 0x35, 0xfe, 0xa4, 0x78, 0x0c, 0x75, 0xb4, 0x90, 0x12, 0xd3, 0x1f, 0xbf, 0x92, 0x7b, 0xd7, 0x10, 0xa6, 0x98, 0xb2, 0x0e, 0x9f, 0xfd, 0x3d, 0xd5, 0x4e, 0x4d, 0x55, 0xa8, 0xf0, 0xa8, 0xa4, 0x74, 0x74, 0xf7, 0x8b, 0x7f, 0xda, 0xfe, 0xe3, 0xc2, 0xf7, 0x31, 0xe4, 0x0a, 0x20, 0xf2, 0x2e, 0x0b, 0x47, 0x5c, 0x29, 0x2c, 0x33, 0xd7, 0xf7, 0x7d, 0x02, 0x0b, 0x17, 0x01, 0xf4, 0x0b, 0x1e, 0xa2, 0x63, 0xaa, 0x80, 0xbc, 0xb9, 0x21, 0xd7, 0xfa, 0x7c, 0x2a, 0xa1, 0xa6, 0x90, 0x30, 0x8e, 0xd1, 0x94, 0x75, 0x78, 0xc1, 0x6e, 0x78, 0xdc, 0x8a, 0xd8, 0x65, 0x00, 0x2e, 0xf7, 0x99, 0x67, 0xfe, 0x5e, 0x49, 0x3e, 0x87, 0xd5, 0x92, 0x7b, 0x2d, 0x23, 0xfe, 0xcc, 0xce, 0x44, 0xe4, 0x94, 0x1b, 0xa6, 0xd3, 0x48, 0x88, 0x17, 0x71, 0x2b, 0x94, 0xd8, 0x47, 0xc6, 0x68, 0xc2, 0x89, 0xa7, 0xab, 0x65, 0x9a, 0xa0, 0x9a, 0xcd, 0xee, 0x36, 0x8c, 0x1d, 0xba, 0xcb, 0x75, 0x8d, 0xbe, 0x09, 0x1e, 0x48, 0xad, 0xd4, 0xc6, 0x16, 0xf3, 0xfe, 0x6a, 0x77, 0xa9, 0xed, 0x2c, 0xd3, 0x7e, 0xc0, 0x16, 0xa9, 0x11, 0x57, 0xfc, 0x36, 0xa8, 0x68, 0xb1, 0xb0, 0x57, 0x59, 0x1b, 0xea, 0x4c, 0xe9, 0x47, 0xf7, 0xa9, 0xa1, 0x88, 0xfc, 0x47, 0x84, 0x28, 0xd6, 0xca, 0x39, 0xc4, 0xde, 0x88, 0xad, 0x8c, 0xff, 0x68, 0xe1, 0x81, 0x83, 0x8b, 0x71, 0x0e, 0xda, 0x98, 0xf8, 0x63, 0xd7, 0x25, 0x81, 0x57, 0x12, 0x19, 0x8e, 0x03, 0xf3, 0x3a, 0x58, 0xfb, 0xf5, 0x34, 0x93, 0xc0, 0x1f, 0xd5, 0x43, 0xac, 0x92, 0x13, 0x48, 0x7e, 0x9a, 0x66, 0x69, 0x2e, 0x0c, 0x77, 0x00, 0xa3, 0xe1, 0x16, 0x76, 0x51, 0x7a, 0xc7, 0x5f, 0xf4, 0x66, 0x3f, 0xe6, 0x2f, 0x90, 0x6a, 0xfd, 0xba, 0x0b, 0x87, 0x29, 0x3e, 0xa4, 0xc4, 0xde, 0x6b, 0x25, 0xce, 0x45, 0x16, 0x9f, 0x54, 0x10, 0x20, 0xea, 0xb5, 0xd7, 0x9b, 0xc0, 0x79, 0xef, 0x90, 0x0e, 0xca, 0x5e, 0x4c, 0x1a, 0x73, 0x5a, 0xc2, 0xfb, 0x7a, 0x1a, 0x6b, 0x6b, 0x51, 0x55, 0x85, 0x0b, 0xf3, 0x60, 0x6c, 0x92, 0x94, 0x37, 0x45, 0x89, 0x48, 0xb8, 0x17, 0xa3, 0xa4, 0x70, 0x33, 0xdb, 0x12, 0x39, 0x48, 0x6e, 0x8f, 0x83, 0x9c, 0xea, 0x24, 0x46, 0x50, 0x15, 0xa4, 0xe5, 0x57, 0x5f, 0x73, 0xdc, 0xbb, 0xad, 0xc9, 0x08, 0x03, 0x8d, 0x7a, 0x89, 0x17, 0x91, 0x9e, 0x7e, 0x1c, 0x9f, 0xdc, 0xb3, 0x61, 0x0a, 0x0b, 0x16, 0x2c, 0x5a, 0xbf, 0xab, 0x25, 0x66, 0xdc, 0x21, 0x4a, 0xd6, 0xb9, 0x22, 0xa1, 0x0b, 0xed, 0x54, 0xf9, 0xf3, 0xc6, 0xe9, 0xf5, 0xd8, 0x39, 0x90, 0xa2, 0xad, 0xd8, 0xa4, 0xdf, 0x6e, 0xe0, 0x07, 0x3b, 0xe2, 0x6c, 0x04, 0x92, 0x03, 0x05, 0x6a, 0x54, 0x2c, 0xfb, 0xb3, 0xcb, 0xe8, 0xd0, 0x19, 0x0a, 0x4d, 0xdd, 0xf6, 0xf8, 0x84, 0xb6, 0xe8, 0xae, 0xd9, 0x73, 0xbe, 0xca, 0x44, 0x59, 0x2c, 0x7a, 0x83, 0xf4, 0xd3, 0x45, 0x72, 0x78, 0x50, 0xd8, 0xc7, 0xcd, 0xb6, 0x93, 0x1f, 0x87, 0x56, 0xc3, 0xf8, 0xb1, 0xb7, 0x6f, 0xd5, 0xda, 0x98, 0xa4, 0x84, 0x59, 0x69, 0x6d, 0xa0, 0xcc, 0xcf, 0x29, 0xac, 0x6a, 0x1a, 0xd8, 0x08, 0x73, 0x2a, 0x70, 0x2e, 0x76, 0xc0, 0x87, 0xc5, 0xb7, 0x06, 0xec, 0x9d, 0x1d, 0xce, 0xbe, 0x99, 0x1c, 0xcf, 0x45, 0x2d, 0xdf, 0x35, 0x14, 0xad, 0xa6, 0x9e, 0xcb, 0x86, 0xe8, 0x24, 0xaa, 0x79, 0x36, 0x84, 0xe1, 0x78, 0x1e, 0xdd, 0x41, 0x67, 0x74, 0x45, 0x24, 0x41, 0x62, 0x59, 0x77, 0xf1, 0xaf, 0xbf, 0xca, 0x21, 0x85, 0xf9, 0xc8, 0xb2, 0xf6, 0x07, 0x91, 0x54, 0x98, 0x25, 0xc8, 0x66, 0x3b, 0xb7, 0x1b, 0xcf, 0x3e, 0xe7, 0xb0, 0x53, 0x6b, 0x11, 0x6f, 0xb1, 0x79, 0xd5, 0xdb, 0xbd, 0x72, 0x0a, 0xdb, 0x79, 0x86, 0x4a, 0x22, 0x55, 0x09, 0xf2, 0x0d, 0x19, 0x90, 0xc9, 0x0a, 0x20, 0x7a, 0x67, 0x7e, 0x8b, 0x26, 0x47, 0x04, 0x60, 0xd7, 0x04, 0x6b, 0x9b, 0x85, 0x32, 0x12, 0xc6, 0x3e, 0xbb, 0x2d, 0xd3, 0x0f, 0x1a, 0x33, 0x6d, 0x4d, 0x88, 0xda, 0xd8, 0xb5, 0xe3, 0x0c, 0xc6, 0x12, 0x4d, 0x7b, 0x77, 0x55, 0x5c, 0xf6, 0xfd, 0xaa, 0xed, 0xa5, 0x13, 0x3e, 0x8b, 0xce, 0x37, 0xc3, 0x21, 0xe2, 0x80, 0x25, 0x35, 0x55, 0xae, 0x03, 0x38, 0x60, 0x8f, 0x57, 0x05, 0x65, 0xd8, 0x35, 0x5c, 0x8a, 0xd7, 0x9b, 0x6b, 0x7c, 0x31, 0xe0, 0x82, 0xbf, 0xf5, 0x21, 0x41, 0x6c, 0xab, 0xe3, 0x44, 0xd0, 0x64, 0x80, 0xce, 0x9a, 0x28, 0x50, 0x5d, 0x71, 0x28, 0xab, 0x2a, 0x1f, 0x5b, 0xca, 0x16, 0xc4, 0x81, 0x52, 0xa1, 0x39, 0xa6, 0x08, 0xb4, 0x31, 0x38, 0x0d, 0xe6, 0xc6, 0x2a, 0xaf, 0x1f, 0xd9, 0x52, 0x43, 0xd8, 0xb5, 0xb9, 0xc9, 0x84, 0x08, 0x53, 0x91, 0xd9, 0x5d, 0xa8, 0x78, 0x21, 0x2c, 0x2c, 0xa5, 0x49, 0x8c, 0xf5, 0x0d, 0xee, 0xdc, 0xb7, 0xdf, 0xf3, 0x66, 0x40, 0x68, 0xc9, 0xa4, 0x94, 0xbc, 0x37, 0x16, 0x2d, 0x61, 0xb5, 0x58, 0x47, 0x09, 0x95, 0xc5, 0xf0, 0xbb, 0x43, 0xee, 0x60, 0x32, 0xa4, 0xd1, 0xbf, 0xe1, 0xf1, 0xd5, 0x54, 0xbc, 0xd3, 0x81, 0xc5, 0x26, 0xbb, 0xb4, 0xd8, 0xd6, 0x3d, 0x4a, 0x86, 0x50, 0x90, 0xbd, 0x8b, 0x36, 0xfb, 0xe3, 0x78, 0x94, 0xb2, 0x3a, 0x76, 0x1b, 0x72, 0x5a, 0x29, 0x20, 0x31, 0x12, 0xf3, 0xaa, 0x03, 0xcb, 0x2c, 0xdf, 0x59, 0x78, 0x8e, 0x99, 0x1f, 0x23, 0x9d, 0x13, 0xd1, 0xac, 0xef, 0x2e, 0xfb, 0x0b, 0x86, 0xfa, 0x28, 0xc6, 0x62, 0x82, 0x9b, 0xf2, 0x75, 0x13, 0x24, 0xfe, 0x2f, 0x06, 0x0c, 0xf1, 0x4f, 0x92, 0xda, 0xda, 0x67, 0x58, 0x5e, 0x52, 0x85, 0xbf, 0xa0, 0x6d, 0xdb, 0xb2, 0x2f, 0xf0, 0xe9, 0x98, 0x97, 0xd1, 0x4c, 0x53, 0x93, 0xf9, 0x44, 0xc6, 0x84, 0x0e, 0x8a, 0xcd, 0xfb, 0x60, 0xf3, 0xfe, 0x75, 0xbc, 0x46, 0xef, 0x00, 0x5c, 0xfa, 0xbc, 0xf7, 0x60, 0x30, 0xc3, 0xe7, 0xc0, 0x10, 0xa4, 0xd4, 0x69, 0xf3, 0xea, 0x10, 0x54, 0x9e, 0xd1, 0x1d, 0xd7, 0x09, 0xcc, 0x0f, 0x7b, 0x28, 0xec, 0x75, 0x82, 0x3c, 0x18, 0xb4, 0x5d, 0x1b, 0xbb, 0x90, 0xe0, 0xd3, 0xed, 0x99, 0x67, 0x72, 0x2d, 0xa6, 0x35, 0xf4, 0x92, 0x2d, 0x77, 0x62, 0x67, 0x32, 0x1d, 0xba, 0xd6, 0xb2, 0x97, 0xe9, 0xd7, 0x83, 0x0d, 0x37, 0xe9, 0xad, 0x3a, 0xd8, 0x7b, 0xfb, 0xd3, 0xc8, 0xeb, 0xd2, 0xb1, 0x3a, 0xab, 0xc9, 0xd6, 0x61, 0x8f, 0x90, 0xbc, 0xa5, 0x1b, 0xa9, 0xc6, 0x47, 0x8d, 0x75, 0xb7, 0x59, 0x84, 0xb7, 0xb4, 0x07, 0x22, 0x66, 0xac, 0x7f, 0xbf, 0xbb, 0xe2, 0x13, 0x6d, 0x41, 0x74, 0xcf, 0x1e, 0x67, 0xd3, 0x01, 0x9a, 0xd8, 0xe9, 0x3c, 0xcc, 0xde, 0x08, 0x5b, 0x32, 0xa5, 0xf2, 0x8b, 0x0f, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xbd, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0xc3, 0xa9, 0xb9, 0x73, 0x50, 0xe3, 0x6a, 0x08, 0xb4, 0x2e, 0x64, 0x6d, 0x05, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x00, 0xd8, 0x1d, 0xe7, 0x46, 0x25, 0x7e, 0x8c, 0x8e, 0xd0, 0xf5, 0xbe, 0x16, 0xfa, 0x95, 0x4f, 0xf2, 0x70, 0xa3, 0xbb, 0x44, 0x58, 0x07, 0x72, 0xef, 0x92, 0xaf, 0x0e, 0x5b, 0xcb, 0x5f, 0x84, 0x33, 0x71, 0xad, 0x81, 0x00, 0x39, 0xab, 0x5c, 0xfa, 0x36, 0xfd, 0xcd, 0x41, 0xdb, 0x64, 0xfc, 0xba, 0x97, 0x46, 0x3f, 0x10, 0x92, 0xe6, 0xa1, 0xb4, 0xc4, 0x2d, 0x53, 0x2c, 0x11, 0xea, 0x7a, 0x8b, 0x82, 0x44, 0x7d, 0xdf, 0xf6, 0x7c, 0x8b, 0xf4, 0xd5, 0x1e, 0xcf, 0xb7, 0x49, 0xdd, 0x14, 0x81, 0x08, 0x6d, 0x2b, 0x90, 0x99, 0x57, 0x44, 0xfe, 0xb2, 0xf2, 0xaa, 0x3e, 0x9a, 0xac, 0x55, 0x30, 0x73, 0x3e, 0x97, 0xcd, 0x99, 0x08, 0x37, 0x65, 0x14, 0x55, 0xf2, 0xaf, 0xfd, 0x2f, 0x02, 0xbc, 0x80, 0x52, 0x16, 0x46, 0xd2, 0xae, 0xcc, 0x8c, 0xd1, 0x1a, 0x3d, 0xd6, 0x6a, 0x53, 0xdb, 0xcf, 0x75, 0x55, 0x39, 0x97, 0x1b, 0x21, 0x38, 0x04, 0xbe, 0xb2, 0xfb, 0xb2, 0x5b, 0x4d, 0x50, 0x41, 0xf4, 0x8a, 0xc4, 0xb2, 0xcd, 0xba, 0x98, 0xf3, 0x87, 0x58, 0xdc, 0xc7, 0xdf, 0x70, 0xc6, 0x91, 0xa2, 0x67, 0x0f, 0xe4, 0xe0, 0x61, 0xfa, 0xa8, 0xc6, 0x0c, 0xf9, 0xfe, 0x3d, 0xee, 0xb7, 0xdc, 0x94, 0x02, 0xd1, 0x62, 0x76, 0x7f, 0xa2, 0xf5, 0xca, 0xfb, 0x7d, 0x00, 0x92, 0xf0, 0x50, 0xc9, 0xac, 0x39, 0x53, 0x59, 0x67, 0x2f, 0x55, 0x00, 0x8d, 0x07, 0xdb, 0x6d, 0x0b, 0x32, 0xe3, 0x18, 0x55, 0xc4, 0x8d, 0xb7, 0x1b, 0x28, 0xf3, 0x65, 0xb7, 0x1c, 0x8c, 0xf5, 0x39, 0x7e, 0xa4, 0x29, 0x31, 0x28, 0x4f, 0x23, 0x44, 0xd6, 0xbd, 0x46, 0x00, 0x18, 0x0d, 0x2a, 0x2c, 0xcc, 0x4f, 0xb3, 0x1b, 0x78, 0x43, 0x36, 0x41, 0x4a, 0x9c, 0xd7, 0x02, 0xfc, 0x80, 0xfb, 0x2b, 0xcc, 0x0f, 0x51, 0x78, 0x1e, 0x82, 0xf5, 0x75, 0xb8, 0x1c, 0xf6, 0x43, 0xd0, 0x50, 0x27, 0x66, 0x18, 0x2d, 0x99, 0x4e, 0x16, 0x52, 0x1e, 0x62, 0x17, 0x87, 0x3e, 0xeb, 0xa6, 0x02, 0xa8, 0xc3, 0x3e, 0x03, 0x3b, 0x1a, 0x59, 0xe4, 0xe3, 0xfa, 0xb2, 0x9b, 0xae, 0x91, 0x0d, 0x45, 0x18, 0xac, 0x25, 0x52, 0x07, 0xf4, 0x15, 0xcc, 0x8b, 0xe3, 0xc2, 0xce, 0x63, 0xc6, 0x2c, 0xc9, 0xa0, 0x7c, 0xa1, 0x98, 0x31, 0x97, 0xc5, 0x5e, 0x48, 0xbb, 0x0e, 0x52, 0x14, 0xf3, 0x36, 0xcf, 0x2c, 0x4d, 0x6d, 0xaa, 0x73, 0x67, 0x63, 0x0a, 0xcb, 0x11, 0xe1, 0x6d, 0xf9, 0x78, 0x1c, 0x46, 0x38, 0xd3, 0xea, 0x1e, 0xe0, 0x92, 0xfa, 0xc1, 0x9e, 0x6c, 0x8f, 0x30, 0x96, 0x50, 0xd6, 0x3c, 0x19, 0x04, 0xdb, 0x72, 0x1b, 0x52, 0xd0, 0x6c, 0x59, 0x59, 0x29, 0x92, 0xdb, 0x75, 0x9c, 0xbf, 0x84, 0x60, 0x02, 0x31, 0x4f, 0x67, 0x6a, 0x1e, 0x2d, 0x6a, 0x2c, 0x0e, 0xc3, 0x7f, 0xa3, 0x34, 0xaa, 0x58, 0x08, 0xd7, 0xc2, 0xf5, 0xef, 0x9a, 0xd0, 0x72, 0xda, 0xb1, 0xb8, 0xd4, 0xd0, 0x69, 0x13, 0x81, 0x48, 0x7e, 0x99, 0x65, 0x39, 0x63, 0x4b, 0x66, 0x69, 0x34, 0x26, 0xb4, 0x52, 0xc0, 0xce, 0x47, 0x9a, 0x2c, 0xdf, 0x17, 0x7f, 0x78, 0xbf, 0x69, 0x8e, 0x54, 0x70, 0x9d, 0xb1, 0x87, 0x2a, 0xa7, 0x7c, 0x32, 0x84, 0xc5, 0xf7, 0x91, 0x5b, 0xd3, 0x8f, 0xf9, 0x3a, 0x03, 0xfa, 0xf0, 0x20, 0x9e, 0xe0, 0xc9, 0x0d, 0xb1, 0x03, 0x07, 0x62, 0xd8, 0xbc, 0x48, 0x42, 0x42, 0x81, 0x29, 0x14, 0x84, 0x44, 0x0a, 0x66, 0x8e, 0xc5, 0xb6, 0xea, 0x0d, 0xdc, 0x7c, 0xde, 0xd3, 0xfc, 0xcb, 0x9b, 0xc2, 0xcc, 0x1d, 0xe4, 0x65, 0xe8, 0xae, 0xe6, 0x82, 0x50, 0xfe, 0x8c, 0x7a, 0x34, 0xdb, 0x0f, 0xa7, 0x6e, 0x02, 0x9b, 0x85, 0xc1, 0xed, 0xa0, 0x4c, 0x68, 0x91, 0x5d, 0xd5, 0xae, 0x7c, 0x18, 0xbd, 0xb1, 0x04, 0x5f, 0x28, 0xe6, 0x75, 0x25, 0x22, 0xe0, 0x6e, 0xb1, 0xe7, 0xc5, 0xfb, 0x69, 0x91, 0x39, 0x59, 0x4f, 0x5f, 0xda, 0xc9, 0x39, 0x30, 0xad, 0x5d, 0x2d, 0x4c, 0x88, 0xc5, 0xff, 0x17, 0xc9, 0x76, 0x30, 0x25, 0xda, 0x86, 0x37, 0x1c, 0x7e, 0x97, 0xc3, 0xf1, 0xea, 0xcc, 0xef, 0x20, 0xc0, 0xf3, 0xbd, 0xdf, 0xbf, 0x92, 0x28, 0xba, 0x93, 0x5f, 0x4a, 0xae, 0xc0, 0xa3, 0xbb, 0xbb, 0xaf, 0xa0, 0x8e, 0x3e, 0x5a, 0xb5, 0x44, 0x7a, 0x08, 0x33, 0x60, 0x3a, 0xf1, 0xcd, 0x52, 0x05, 0xb8, 0x16, 0x3b, 0xab, 0xde, 0xd1, 0x3d, 0x7b, 0x3d, 0xc5, 0x44, 0xda, 0xdc, 0xa5, 0xe2, 0x80, 0x0b, 0x7f, 0xfa, 0xb9, 0xc9, 0xa9, 0x32, 0x46, 0xf3, 0x89, 0x0f, 0xe3, 0xeb, 0x68, 0xac, 0x96, 0x13, 0xff, 0xef, 0x76, 0xec, 0x19, 0xca, 0x09, 0x1a, 0x9a, 0x49, 0x4d, 0xa8, 0x54, 0xfa, 0x74, 0x85, 0x80, 0x3d, 0xb8, 0x61, 0x75, 0x13, 0xc2, 0x2e, 0xe9, 0x4c, 0x9a, 0x69, 0x41, 0xcb, 0x72, 0xce, 0x9e, 0x30, 0x4b, 0x1d, 0x3f, 0x8d, 0xc6, 0xfe, 0xe4, 0x87, 0xb9, 0x29, 0x1a, 0xdc, 0xb8, 0x57, 0xd0, 0xe8, 0xbf, 0x04, 0xb7, 0x06, 0x97, 0x38, 0x21, 0xb7, 0xd8, 0x17, 0xb1, 0xef, 0xb6, 0xfc, 0x09, 0x74, 0xdf, 0x73, 0x4a, 0x42, 0x1f, 0x13, 0x49, 0x48, 0x7b, 0x28, 0x0d, 0x3e, 0x55, 0x02, 0x93, 0x39, 0x1c, 0x87, 0x66, 0x7b, 0x2e, 0x10, 0x75, 0x1e, 0x85, 0x64, 0xf9, 0xd6, 0x2f, 0x40, 0x18, 0x86, 0xf3, 0xa7, 0x81, 0xb7, 0xb0, 0x1e, 0x95, 0x57, 0x02, 0x3e, 0x0f, 0xe5, 0x87, 0x9f, 0x72, 0x30, 0x80, 0xaa, 0x63, 0xf1, 0xdd, 0xb0, 0xd5, 0x83, 0x3b, 0x58, 0x19, 0x42, 0xc6, 0x27, 0xdf, 0x6b, 0x26, 0x07, 0x15, 0x4d, 0xc1, 0x83, 0x40, 0xa0, 0x36, 0xbb, 0xaf, 0xf7, 0x7a, 0xcf, 0x9e, 0x37, 0x9d, 0x32, 0xec, 0x64, 0x49, 0xd5, 0xe0, 0x17, 0x2d, 0x25, 0x67, 0xce, 0x31, 0xb7, 0x1e, 0x09, 0x2f, 0x2a, 0x6e, 0x7c, 0xcd, 0xf4, 0x1c, 0xc4, 0x74, 0x63, 0x89, 0xc1, 0xd8, 0xda, 0x33, 0x6c, 0x46, 0x44, 0x74, 0x7c, 0xa4, 0xf0, 0x4f, 0x03, 0x16, 0xd5, 0x27, 0x38, 0xda, 0x36, 0x08, 0x62, 0xd0, 0xbc, 0xa2, 0x00, 0x7a, 0x58, 0x2e, 0x1a, 0x7b, 0x2d, 0xf6, 0x02, 0xf1, 0x41, 0xce, 0x60, 0x32, 0xdd, 0x11, 0xd9, 0x7f, 0x2b, 0xbe, 0x40, 0x1b, 0xdb, 0xe5, 0x65, 0xc4, 0xa2, 0x7f, 0xc6, 0x78, 0x38, 0x16, 0xe2, 0x13, 0x29, 0x34, 0x1c, 0xda, 0x36, 0xae, 0xc3, 0x05, 0xc9, 0xf2, 0x5c, 0xa5, 0xa2, 0x5b, 0xae, 0xb6, 0xe3, 0x5d, 0x6e, 0xa6, 0x36, 0x9e, 0x5b, 0x11, 0x1f, 0x0a, 0xa4, 0xf0, 0x35, 0x70, 0x3d, 0x82, 0xee, 0xa2, 0x9f, 0xd9, 0x7b, 0xec, 0xe8, 0xaa, 0xee, 0xb9, 0x05, 0x2f, 0xca, 0xdd, 0x80, 0x19, 0x0f, 0x81, 0x6e, 0xdd, 0x8f, 0x71, 0xc1, 0x0b, 0x36, 0x2d, 0xcf, 0x8e, 0xfa, 0xb9, 0x8a, 0x70, 0xf5, 0x20, 0x61, 0x9f, 0x20, 0xde, 0xe7, 0xed, 0xd6, 0x24, 0x4a, 0xd7, 0x29, 0xb7, 0x3a, 0xe1, 0x88, 0x64, 0x20, 0x0c, 0x43, 0x57, 0xa5, 0x18, 0x85, 0x52, 0x92, 0xb1, 0xc5, 0x98, 0xf6, 0x6e, 0x4c, 0x3d, 0x60, 0x03, 0xb7, 0x82, 0x01, 0xec, 0x7d, 0xcf, 0xe3, 0x4e, 0xcb, 0x58, 0x49, 0xdb, 0xb1, 0xb3, 0xd3, 0xfc, 0x31, 0x9d, 0x1d, 0xb1, 0xcd, 0x50, 0x64, 0x2b, 0x2c, 0x30, 0x0f, 0xd7, 0x11, 0x42, 0xa5, 0x1f, 0x45, 0x33, 0xf8, 0xc6, 0x97, 0x9f, 0xc7, 0xce, 0x96, 0xb0, 0x0c, 0xf2, 0xcd, 0x5f, 0x65, 0x9e, 0x81, 0x58, 0x41, 0xfa, 0xf8, 0xe2, 0x79, 0xa6, 0x73, 0x65, 0xf6, 0xbe, 0x15, 0x98, 0x20, 0xe5, 0xda, 0xd3, 0x31, 0x9d, 0x97, 0x13, 0x47, 0x14, 0xf6, 0x2c, 0xd8, 0xbc, 0xea, 0xbb, 0x80, 0x60, 0x9d, 0x1f, 0x50, 0x59, 0x9f, 0x82, 0x4f, 0x6f, 0x18, 0x4d, 0x79, 0x48, 0x99, 0x6b, 0x55, 0xcb, 0x1a, 0xac, 0x4c, 0x8c, 0x38, 0xbf, 0x80, 0xad, 0x0b, 0x7c, 0xc5, 0x72, 0xe7, 0x60, 0x0e, 0xbf, 0xc3, 0x78, 0x73, 0xd7, 0x98, 0x96, 0xc1, 0x31, 0x16, 0xd5, 0x92, 0x06, 0x09, 0xd6, 0x92, 0x85, 0x1a, 0xa6, 0xd1, 0x77, 0x8e, 0x0f, 0xbe, 0x82, 0x40, 0x25, 0x97, 0x7b, 0x10, 0xfc, 0x1f, 0x65, 0x40, 0x58, 0x19, 0x7d, 0x08, 0x28, 0xfa, 0x8a, 0x85, 0xfa, 0x4b, 0x9b, 0xe6, 0xa0, 0xea, 0x62, 0xa9, 0x64, 0xd5, 0x3c, 0x60, 0x6b, 0x33, 0x33, 0x95, 0x97, 0xc2, 0x6f, 0x9e, 0x9d, 0xe2, 0x85, 0x83, 0x10, 0x7d, 0x56, 0x69, 0x68, 0x07, 0x2e, 0xb6, 0x84, 0x79, 0x1a, 0xc6, 0x7e, 0x75, 0x89, 0x42, 0xc7, 0xdf, 0x46, 0x35, 0x82, 0x3d, 0x42, 0x35, 0x95, 0x41, 0x33, 0x8b, 0xdd, 0xf7, 0xc2, 0x27, 0xbd, 0x3a, 0xc4, 0xb2, 0x5d, 0xc5, 0xc6, 0xa9, 0xea, 0x05, 0x33, 0x3c, 0x3a, 0xe0, 0xe5, 0x0e, 0x44, 0xfd, 0xc8, 0xb0, 0x90, 0x29, 0x70, 0xae, 0x3a, 0x55, 0x42, 0xd0, 0x08, 0x7e, 0xc2, 0xc8, 0xf2, 0x1e, 0xd9, 0x2e, 0x9d, 0xc8, 0xa0, 0x8a, 0x77, 0x3e, 0xf4, 0xa0, 0xfb, 0x0a, 0xbd, 0xaf, 0x12, 0xde, 0xc9, 0x5a, 0xa8, 0xcd, 0xa8, 0x3c, 0xb0, 0x6d, 0x27, 0x9c, 0xed, 0xb5, 0x41, 0x84, 0x55, 0x4e, 0x61, 0x30, 0x15, 0x71, 0x7a, 0x19, 0xd9, 0x79, 0x78, 0x9a, 0x9e, 0xd8, 0xed, 0x9e, 0x24, 0x2c, 0x6b, 0x7d, 0x8c, 0x2c, 0x3c, 0x70, 0x5d, 0x16, 0x56, 0x19, 0x0c, 0xac, 0xde, 0x76, 0xef, 0xb3, 0xaa, 0xe7, 0xac, 0xac, 0x27, 0x75, 0xd9, 0xb9, 0x47, 0x4d, 0x86, 0x8d, 0xdd, 0xc5, 0xd6, 0x70, 0xd1, 0xd3, 0x00, 0xfa, 0xf6, 0x84, 0x60, 0x16, 0x53, 0x4b, 0x35, 0x74, 0xd9, 0x0d, 0xd5, 0xa1, 0x13, 0x1a, 0x08, 0xdd, 0x73, 0x9b, 0xf0, 0x44, 0xf3, 0xdd, 0x0a, 0x5b, 0xbb, 0x01, 0xf1, 0x74, 0x81, 0x79, 0x4d, 0x80, 0x5f, 0xfd, 0x0d, 0x7a, 0x1b, 0x7b, 0x78, 0xde, 0x1a, 0x95, 0x53, 0xf1, 0xf7, 0x91, 0x5d, 0xac, 0xa2, 0x53, 0x10, 0xe8, 0xd0, 0x86, 0x77, 0x83, 0x6f, 0x92, 0x0b, 0x84, 0x6c, 0xb3, 0x1a, 0xfa, 0x14, 0x25, 0xbb, 0x72, 0xbc, 0xd1, 0xa9, 0xae, 0xc0, 0xb8, 0x1b, 0x42, 0x32, 0x25, 0x30, 0xc2, 0xfa, 0xb1, 0x63, 0xbf, 0x7e, 0x81, 0xb8, 0xa9, 0x0a, 0x8c, 0x18, 0x1b, 0x44, 0x02, 0xa8, 0xe3, 0xc0, 0xff, 0xbf, 0x62, 0xf0, 0x18, 0x08, 0xdc, 0xfa, 0x0a, 0xe6, 0x1c, 0x04, 0xff, 0xd8, 0x08, 0x0c, 0x08, 0x62, 0xaf, 0x3c, 0x0e, 0xde, 0x24, 0x54, 0x47, 0x3e, 0x2c, 0x8c, 0xec, 0xe7, 0xcd, 0x5a, 0x04, 0x90, 0x7a, 0x70, 0x6f, 0x66, 0x44, 0xab, 0x57, 0x08, 0x70, 0x17, 0xb8, 0xf0, 0xc2, 0xff, 0x2f, 0xa2, 0x2d, 0x6e, 0x5f, 0xbd, 0x8c, 0x8a, 0xf0, 0x28, 0x37, 0xff, 0x04, 0x01, 0x5f, 0xac, 0x11, 0x53, 0x25, 0xc1, 0x52, 0xf3, 0x27, 0xed, 0xac, 0x60, 0x99, 0xd8, 0x25, 0x8e, 0x54, 0x7f, 0x9c, 0xf1, 0x3f, 0x4e, 0xc8, 0x57, 0xf6, 0x2b, 0x2d, 0x6d, 0xe9, 0xa4, 0xd8, 0x4b, 0x2e, 0x7a, 0xc3, 0x63, 0xcd, 0xe1, 0xf0, 0xf0, 0x39, 0xf0, 0x0a, 0xbb, 0x0c, 0x82, 0xd3, 0x0e, 0x49, 0x9e, 0x22, 0xcb, 0x5c, 0xd7, 0x3d, 0xd3, 0x58, 0x76, 0x84, 0x2d, 0x8a, 0x5a, 0x02, 0xee, 0x2a, 0xbc, 0xc1, 0xc4, 0x57, 0x5d, 0x06, 0x04, 0x6c, 0x93, 0x70, 0x26, 0x2b, 0x5c, 0xc9, 0xff, 0x22, 0x51, 0x25, 0xa2, 0xec, 0xdc, 0x29, 0xf2, 0x72, 0x41, 0x8c, 0x47, 0x70, 0xa9, 0xe3, 0x4c, 0xf5, 0xef, 0x16, 0xbf, 0x6d, 0x7d, 0xc1, 0xad, 0x1f, 0x14, 0x9e, 0x86, 0x43, 0xd1, 0x7e, 0xac, 0x67, 0x6f, 0x4c, 0x84, 0xdc, 0x68, 0x25, 0xd3, 0xfc, 0x5f, 0x5e, 0x01, 0xb4, 0xe6, 0x6b, 0xf0, 0x19, 0x54, 0x5a, 0xc7, 0x1c, 0xff, 0x0b, 0x4a, 0x73, 0xda, 0xc4, 0xb5, 0xd4, 0x79, 0xc4, 0x79, 0x7c, 0x13, 0x61, 0xd4, 0x77, 0x86, 0x57, 0x90, 0x91, 0x4b, 0x27, 0x81, 0x2a, 0xd6, 0x52, 0x33, 0x04, 0x2e, 0xc5, 0xa9, 0x56, 0xbf, 0xbc, 0x44, 0x40, 0x0f, 0x6b, 0x92, 0xda, 0xb0, 0x39, 0xe5, 0x45, 0x51, 0x21, 0x5d, 0x26, 0xb4, 0x4e, 0xe5, 0x2f, 0x4e, 0x7a, 0x02, 0x7c, 0x20, 0xa0, 0xe3, 0x74, 0x8c, 0xdb, 0x76, 0xf2, 0xcd, 0xdc, 0x29, 0x13, 0x63, 0x84, 0x54, 0xe7, 0x3e, 0xb2, 0x14, 0xf4, 0x90, 0x98, 0x51, 0x67, 0x66, 0xbd, 0x36, 0xc7, 0x5f, 0x00, 0x61, 0x93, 0x30, 0xe5, 0x9f, 0xe9, 0xb1, 0x15, 0x4e, 0xf3, 0x55, 0x7b, 0x34, 0x41, 0xa4, 0xc0, 0xc1, 0xa7, 0xe3, 0x58, 0xb3, 0x6b, 0x13, 0x4e, 0xca, 0x54, 0xca, 0x31, 0xe7, 0xc3, 0x5b, 0xfa, 0x58, 0x83, 0x5e, 0xf5, 0x82, 0xe8, 0x67, 0xb8, 0x33, 0xe1, 0x71, 0x5d, 0x6c, 0xa9, 0xc1, 0x3a, 0x4a, 0x7f, 0xa7, 0x02, 0xac, 0x96, 0xc2, 0x06, 0x89, 0x0f, 0xd0, 0x13, 0x34, 0xd9, 0x12, 0x6c, 0xf7, 0x0f, 0xd0, 0x46, 0x29, 0x4a }; +constexpr AccessUnit ATRACX_BEGIN_OF_AU_SPLIT_EXPECTED_AU = { std::numeric_limits::max(), std::numeric_limits::max(), false, 0, {}, { 0x35, 0x1b, 0x6a, 0x2a, 0x8e, 0x4d, 0xf1, 0x87, 0x92, 0xa9, 0xff, 0x8c, 0x7f, 0xcc, 0x5c, 0x1c, 0x5a, 0x7a, 0x05, 0xdd } }; + +const std::vector AC3_BEGIN_OF_AU_SPLIT_STREAM = { 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xbd, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x30, 0x00, 0x00, 0x00, 0x6e, 0xc9, 0xfb, 0xc5, 0x67, 0xe9, 0x8d, 0x68, 0x46, 0x00, 0x0d, 0x37, 0x95, 0xba, 0x1f, 0xda, 0x13, 0x05, 0xa0, 0x64, 0xd4, 0x9f, 0x4f, 0xdb, 0x14, 0x4d, 0x18, 0x4e, 0xb1, 0x3c, 0x2c, 0x9e, 0xca, 0x40, 0x57, 0xbd, 0x5e, 0xce, 0xf5, 0xd7, 0xae, 0x0d, 0xce, 0x9f, 0x77, 0xc5, 0xbf, 0xff, 0x00, 0x19, 0xbf, 0xe2, 0x98, 0x6a, 0x77, 0xd7, 0x78, 0x6a, 0xe4, 0x97, 0x5a, 0x98, 0xd1, 0xe2, 0x55, 0x64, 0xff, 0x08, 0x0b, 0xe5, 0xab, 0x41, 0xb5, 0x30, 0x25, 0xa9, 0x10, 0xd4, 0x4c, 0xd6, 0x33, 0xb0, 0x14, 0x2d, 0x2e, 0xb4, 0xc8, 0x9b, 0x5b, 0x9b, 0xd8, 0x1a, 0x88, 0xab, 0xf2, 0xdb, 0x6f, 0xc1, 0x99, 0xd6, 0x5c, 0x3a, 0xc5, 0xcf, 0xf7, 0x30, 0x90, 0x76, 0x26, 0x8f, 0x22, 0x20, 0xc7, 0xdb, 0xec, 0xad, 0xee, 0x45, 0x12, 0x52, 0x01, 0x8e, 0x1c, 0xa7, 0xb5, 0x71, 0x76, 0x33, 0x44, 0xf8, 0x54, 0xf6, 0x5c, 0x92, 0x38, 0xfc, 0xf3, 0x2d, 0x53, 0x73, 0xbe, 0x7a, 0x7d, 0x26, 0xb1, 0x93, 0xda, 0x46, 0xae, 0xae, 0xf2, 0xc7, 0x1c, 0xc2, 0x57, 0xfd, 0x5d, 0xaf, 0xdd, 0xf0, 0x4d, 0xad, 0xb6, 0x70, 0x8c, 0x09, 0xd7, 0xbd, 0x53, 0x9e, 0xbc, 0x64, 0x78, 0x0d, 0xe0, 0x7d, 0xf9, 0xd7, 0x6f, 0xf9, 0x31, 0x71, 0xc5, 0xef, 0xfe, 0xaf, 0x50, 0x74, 0x3a, 0x62, 0x82, 0x4f, 0x72, 0x9d, 0x68, 0xf7, 0x12, 0xd9, 0x3a, 0x0e, 0xc9, 0x77, 0x86, 0x9d, 0xe8, 0x86, 0x78, 0x03, 0xc2, 0x1a, 0x97, 0xa8, 0xfc, 0xac, 0x41, 0x9f, 0x58, 0x5c, 0x33, 0xf0, 0x04, 0x11, 0xd6, 0x8d, 0x09, 0x5e, 0xb3, 0xee, 0x99, 0x89, 0x33, 0xdc, 0x76, 0x4a, 0xf5, 0x4a, 0xb7, 0x14, 0x95, 0x31, 0x7e, 0x0f, 0xf4, 0xac, 0x89, 0xdb, 0x24, 0x9b, 0x92, 0x08, 0x3b, 0xca, 0xd4, 0x87, 0x84, 0x65, 0xad, 0x8b, 0x77, 0xb7, 0x81, 0xec, 0x1b, 0xcd, 0x9f, 0x8f, 0x38, 0x65, 0xbe, 0xda, 0x7a, 0x78, 0x9a, 0xbf, 0x9a, 0xc7, 0x24, 0x97, 0x37, 0x6b, 0x56, 0x30, 0xc4, 0xa9, 0xe7, 0xd1, 0x15, 0x47, 0xe6, 0x8d, 0xce, 0x25, 0xc6, 0xc3, 0x2c, 0xb9, 0xa1, 0x65, 0xda, 0x26, 0x25, 0x5c, 0x66, 0x22, 0x95, 0x5d, 0xa4, 0xcb, 0x9c, 0x72, 0xd5, 0xd6, 0xd6, 0x02, 0xe9, 0xa2, 0x10, 0xe7, 0xf6, 0xbe, 0x10, 0x03, 0x1a, 0xee, 0xdb, 0x60, 0xc2, 0x0f, 0x09, 0x1c, 0x56, 0x48, 0x04, 0x72, 0x95, 0x5d, 0x88, 0x7d, 0x77, 0xe0, 0x22, 0x3d, 0xc9, 0x15, 0x3f, 0x9c, 0x12, 0x9f, 0xf2, 0xcc, 0xc7, 0xc5, 0xb8, 0x1c, 0x76, 0x26, 0x87, 0x61, 0x3b, 0xe2, 0x31, 0x22, 0x33, 0x4e, 0x3f, 0xb1, 0x7f, 0x2d, 0x31, 0xd7, 0x0f, 0x93, 0x1d, 0x91, 0xc2, 0x3a, 0xb1, 0xdb, 0xbe, 0xf3, 0x16, 0x5a, 0x64, 0x52, 0x3d, 0x33, 0x7b, 0x6c, 0xa9, 0xf2, 0x26, 0x69, 0xb7, 0xb8, 0xcd, 0x1d, 0xde, 0x8b, 0x88, 0xc5, 0xdc, 0x55, 0x05, 0x6f, 0x17, 0x61, 0x60, 0x44, 0xf8, 0x87, 0xba, 0xd2, 0xa3, 0x66, 0x00, 0xf5, 0x4d, 0xc1, 0x74, 0x6d, 0x51, 0x5b, 0x3d, 0x95, 0xbb, 0x89, 0xb5, 0xf5, 0x05, 0xf5, 0x67, 0x65, 0x2a, 0xc8, 0x86, 0xe6, 0x45, 0x10, 0x09, 0x81, 0xce, 0x19, 0x94, 0x57, 0xe1, 0xeb, 0xde, 0xa9, 0xda, 0x44, 0xd6, 0x33, 0xd5, 0xaf, 0x2c, 0x77, 0xa5, 0x2d, 0xe9, 0xa7, 0xce, 0xe5, 0xc2, 0x49, 0x30, 0x53, 0x04, 0x1d, 0xa9, 0xa3, 0xf4, 0x8e, 0x05, 0xf1, 0x8a, 0x7f, 0x0d, 0xc4, 0x0f, 0x80, 0x0f, 0x67, 0x29, 0x44, 0x17, 0x7d, 0x4d, 0x28, 0x20, 0xf2, 0x05, 0xcd, 0x33, 0x05, 0xac, 0x5d, 0x65, 0xbd, 0xe3, 0x5e, 0xdc, 0x08, 0xf4, 0x80, 0x11, 0x73, 0x39, 0x31, 0x15, 0xe1, 0x24, 0xd0, 0x4d, 0xd5, 0xf5, 0xa4, 0x02, 0x84, 0x34, 0x74, 0x25, 0x7c, 0x4e, 0x4a, 0x93, 0xa6, 0x84, 0x38, 0x88, 0x0a, 0x07, 0x68, 0xab, 0xa2, 0xe9, 0x06, 0x86, 0xfc, 0x17, 0x3b, 0x2d, 0xf6, 0xef, 0x99, 0x41, 0xdc, 0x35, 0xb2, 0xb2, 0x0a, 0x00, 0x11, 0xcb, 0x26, 0x8a, 0xa1, 0xab, 0xe1, 0xea, 0x40, 0xb2, 0xa6, 0xf2, 0x6d, 0x19, 0x8a, 0xb1, 0x57, 0xe4, 0x27, 0xb5, 0x4e, 0x11, 0xa8, 0xc5, 0x39, 0x44, 0xca, 0x6b, 0x8c, 0xfa, 0x35, 0x19, 0xfa, 0x91, 0xfe, 0xb5, 0xc8, 0x5b, 0xc4, 0x42, 0x39, 0x8a, 0xfe, 0x4e, 0xd3, 0x8b, 0xcc, 0x80, 0xf0, 0x15, 0xa1, 0xa8, 0x61, 0x2a, 0xb2, 0x4a, 0x7c, 0xf3, 0x0e, 0xda, 0x91, 0xfa, 0x30, 0xdf, 0x21, 0xda, 0x43, 0x42, 0x21, 0xf4, 0x5a, 0x89, 0xcc, 0xef, 0xda, 0xb3, 0xae, 0x16, 0xc8, 0x98, 0xc9, 0x47, 0xc5, 0xf0, 0x6a, 0xac, 0xaf, 0x16, 0x6b, 0x44, 0x77, 0xa6, 0x89, 0x87, 0x3d, 0x21, 0xb8, 0x2e, 0x4a, 0xc2, 0x53, 0xe7, 0xdc, 0x2f, 0x93, 0x35, 0x37, 0xf7, 0xf3, 0x83, 0xdf, 0xa2, 0x56, 0x14, 0x43, 0x4e, 0x0e, 0x8d, 0x09, 0x5c, 0x6c, 0x5b, 0x63, 0xbc, 0xe8, 0xa1, 0x55, 0x0b, 0x66, 0xdd, 0x44, 0x2e, 0x16, 0x08, 0xf2, 0x96, 0x28, 0x71, 0x28, 0xa3, 0xe8, 0xb8, 0x4a, 0xfb, 0x22, 0x00, 0xbe, 0x01, 0x79, 0x2d, 0x82, 0x88, 0xb7, 0xfa, 0xcb, 0xe0, 0xdf, 0x22, 0xe0, 0x8b, 0xe1, 0x78, 0xcb, 0x08, 0xd1, 0x2e, 0x93, 0xf7, 0x28, 0xbc, 0x43, 0x27, 0x57, 0x55, 0x2c, 0x11, 0x81, 0xe0, 0xc6, 0xd6, 0x28, 0x60, 0x80, 0x66, 0x01, 0x68, 0x47, 0x7b, 0x7b, 0x83, 0xa3, 0x0c, 0x34, 0x9b, 0x3b, 0x54, 0xc6, 0x59, 0x38, 0x56, 0x22, 0xc9, 0xa1, 0xc6, 0x7f, 0xc5, 0x1a, 0x77, 0xec, 0x13, 0x90, 0x2d, 0x56, 0x16, 0x59, 0x6a, 0x26, 0x48, 0x81, 0x3a, 0x25, 0xfe, 0xd2, 0x08, 0x7f, 0x04, 0x10, 0xd1, 0x48, 0xa1, 0x08, 0x26, 0xb8, 0x6f, 0x5a, 0xbe, 0x93, 0x77, 0x6f, 0x9e, 0x8c, 0x2d, 0x5f, 0xf6, 0xf0, 0xa0, 0x72, 0xa3, 0xad, 0x5e, 0x8b, 0x7a, 0x84, 0x47, 0x49, 0xcc, 0x72, 0xf8, 0x5e, 0x5a, 0xdf, 0x62, 0x11, 0x5c, 0x25, 0x8d, 0xde, 0x32, 0x00, 0x3b, 0x0f, 0xe1, 0x26, 0x7b, 0x93, 0xa9, 0xf1, 0x4c, 0x1b, 0x7e, 0x98, 0x14, 0xc8, 0xbf, 0x79, 0x34, 0x93, 0x6c, 0x9f, 0x8c, 0x9d, 0x98, 0x17, 0x40, 0x14, 0x9f, 0x9d, 0x09, 0x07, 0xd2, 0x3f, 0x9f, 0x25, 0xa9, 0x4c, 0x3b, 0x3f, 0x5c, 0x94, 0x7b, 0xa8, 0x49, 0x29, 0x6c, 0xd9, 0xc2, 0x26, 0xe7, 0xce, 0x90, 0x20, 0x96, 0x5e, 0xd8, 0x87, 0x2e, 0x02, 0xf8, 0xc4, 0xf2, 0xf2, 0x3e, 0x0b, 0x9f, 0x1c, 0xcc, 0x4b, 0x3f, 0x7d, 0x56, 0x41, 0xb3, 0x47, 0xbb, 0xd7, 0x52, 0xc4, 0xdd, 0x0f, 0xeb, 0x4c, 0xd8, 0x84, 0x3e, 0xdd, 0xd9, 0xad, 0xc3, 0xf2, 0xdc, 0xaa, 0xd9, 0xfd, 0x19, 0xdc, 0xf1, 0x02, 0xb4, 0x6e, 0xdd, 0xe5, 0x99, 0xc2, 0x09, 0xbc, 0x98, 0x6a, 0x48, 0xcb, 0x49, 0x89, 0x8c, 0xd2, 0x59, 0x4e, 0x55, 0xbc, 0x6b, 0xee, 0x1d, 0xf4, 0x30, 0x91, 0x67, 0x27, 0x05, 0x55, 0x97, 0xb9, 0x68, 0x52, 0x82, 0xc3, 0x57, 0xd1, 0xf7, 0xee, 0xd4, 0x80, 0x12, 0xd1, 0x6c, 0xa7, 0x03, 0xc9, 0x10, 0x63, 0xce, 0x20, 0x63, 0x05, 0x03, 0x77, 0xdc, 0xe2, 0xe3, 0x37, 0x6d, 0x43, 0x47, 0xd6, 0x83, 0xea, 0x09, 0xdf, 0xd3, 0x57, 0x86, 0x86, 0xee, 0x86, 0x01, 0x6b, 0x5e, 0xe9, 0x24, 0x5e, 0x6f, 0x8a, 0xba, 0xda, 0x79, 0x44, 0x0d, 0x42, 0xe6, 0x69, 0x43, 0xb3, 0x5d, 0xc4, 0x9a, 0x2d, 0x87, 0x5e, 0xb2, 0x4c, 0xb4, 0xe8, 0x06, 0x02, 0x73, 0x3f, 0x8e, 0x15, 0x37, 0x68, 0x8c, 0x97, 0x14, 0xb2, 0xbc, 0x28, 0x4c, 0xb9, 0x09, 0x4b, 0x7b, 0xae, 0xf6, 0x08, 0xd1, 0xf2, 0x2f, 0x0b, 0x98, 0x2a, 0xb0, 0xeb, 0xed, 0xf8, 0x71, 0xd9, 0x5b, 0xdf, 0xdd, 0x87, 0x9b, 0xdf, 0x2a, 0x62, 0x8a, 0x00, 0x4b, 0x03, 0xae, 0x37, 0x38, 0xf1, 0x94, 0x59, 0x1b, 0x2e, 0x79, 0x56, 0x8d, 0xcc, 0x36, 0xe5, 0xcc, 0xec, 0x50, 0x38, 0x37, 0x15, 0xb8, 0x84, 0x07, 0x5a, 0x6e, 0xb1, 0xda, 0xa1, 0x52, 0xe6, 0x32, 0x08, 0x4a, 0x91, 0xce, 0x0e, 0x2e, 0x78, 0xe2, 0xcc, 0xac, 0xb3, 0xc1, 0xeb, 0xce, 0x3e, 0x51, 0x21, 0x18, 0x5d, 0x96, 0xf9, 0x31, 0x18, 0xab, 0x54, 0x67, 0x61, 0xa5, 0x5c, 0x5b, 0x4b, 0x27, 0xa4, 0x61, 0xe1, 0x82, 0x58, 0xfd, 0xa7, 0x18, 0x1c, 0x8e, 0xdc, 0xbe, 0xd3, 0xdf, 0x3f, 0xdf, 0x2e, 0xbf, 0xe5, 0x5c, 0xb1, 0x5a, 0xcf, 0x49, 0xac, 0x66, 0x3b, 0x90, 0xf0, 0xba, 0x41, 0x3f, 0x6d, 0x4f, 0x1c, 0x60, 0x27, 0x76, 0xfe, 0x1a, 0xbf, 0x32, 0x8c, 0x81, 0xec, 0xe0, 0x56, 0xd3, 0x8b, 0xac, 0x17, 0x67, 0x7e, 0x8b, 0x22, 0x4a, 0x61, 0x38, 0xf8, 0xa6, 0x37, 0xcb, 0x1f, 0x29, 0x80, 0x0b, 0x48, 0x19, 0xff, 0x9f, 0x83, 0x48, 0x83, 0x62, 0x33, 0xa6, 0xd8, 0xac, 0xf7, 0xe8, 0x10, 0x01, 0xea, 0x6d, 0x0b, 0x2f, 0x2d, 0x57, 0x02, 0x89, 0xcc, 0x07, 0x2a, 0x79, 0x6d, 0x22, 0x1f, 0x1c, 0xb8, 0xe8, 0x89, 0xcb, 0x24, 0x3a, 0x90, 0x30, 0xd2, 0xc1, 0xf1, 0x6f, 0x26, 0xea, 0x91, 0xfb, 0xcb, 0xa1, 0xb1, 0x0f, 0xd9, 0x22, 0xd9, 0x53, 0x14, 0xa2, 0x12, 0x8c, 0x0f, 0x9a, 0x38, 0x53, 0x34, 0x43, 0x54, 0x77, 0x6c, 0x60, 0xc0, 0xca, 0xf2, 0x88, 0xc0, 0xba, 0x96, 0x15, 0xf7, 0xd9, 0x11, 0x44, 0x5b, 0x57, 0x9b, 0xc9, 0x72, 0x6d, 0x93, 0xda, 0xc6, 0xaa, 0xb2, 0x01, 0x0b, 0x0e, 0x44, 0x0d, 0xb4, 0x1e, 0xff, 0xf4, 0x7e, 0x3e, 0xe3, 0x1a, 0xa1, 0xae, 0x5c, 0x02, 0xe4, 0x89, 0x29, 0x56, 0x4d, 0xc8, 0x13, 0x43, 0x56, 0x72, 0x65, 0xda, 0x4f, 0x2a, 0xb4, 0xb9, 0x7a, 0x6a, 0x93, 0x1c, 0x23, 0x6d, 0x77, 0x19, 0x82, 0x26, 0x2e, 0xc0, 0x5c, 0x9c, 0x5c, 0x2f, 0xeb, 0x19, 0x19, 0x7a, 0x62, 0x3b, 0x0f, 0xa5, 0xde, 0xb6, 0x56, 0x68, 0xb3, 0x06, 0x01, 0x81, 0x1d, 0x89, 0x23, 0xd5, 0xa4, 0xa1, 0xd6, 0xd2, 0x81, 0x0d, 0x0e, 0xcf, 0xb7, 0x5d, 0xe8, 0x57, 0x78, 0xbc, 0x09, 0x5d, 0xd4, 0x0f, 0x91, 0x66, 0xad, 0x4f, 0xc3, 0x0b, 0x37, 0x9d, 0x7d, 0xb5, 0x3d, 0xc5, 0x66, 0x63, 0x49, 0x40, 0xa8, 0x85, 0xcb, 0x4b, 0x74, 0xec, 0x4d, 0xc9, 0xee, 0x0f, 0xc4, 0xf8, 0x73, 0x29, 0xf2, 0x5e, 0xa0, 0x84, 0x95, 0x7f, 0x98, 0x65, 0x9f, 0x20, 0x1d, 0x12, 0x60, 0x9a, 0xec, 0x33, 0xf5, 0x66, 0x33, 0x32, 0xa8, 0x98, 0x7c, 0x91, 0xf5, 0x9f, 0x63, 0xeb, 0xf1, 0x77, 0x1c, 0xc6, 0x0f, 0x15, 0xc7, 0x18, 0xf8, 0x38, 0xe1, 0x87, 0x2b, 0xaf, 0x89, 0x1d, 0xb4, 0xe2, 0x76, 0x35, 0x51, 0x02, 0xf6, 0x4e, 0xd5, 0xd3, 0xda, 0xbe, 0x03, 0x3a, 0x0d, 0xaa, 0xf0, 0xe9, 0x0e, 0x3a, 0xaa, 0x5f, 0x8f, 0x56, 0x2e, 0x08, 0x10, 0x3c, 0x37, 0x81, 0xae, 0xfc, 0xae, 0x21, 0x44, 0x92, 0x88, 0x4f, 0xd8, 0x98, 0xf7, 0x08, 0x1c, 0x37, 0x62, 0xb5, 0xad, 0x4b, 0x03, 0x63, 0x4a, 0x05, 0x65, 0x31, 0xf8, 0xd6, 0x3c, 0x26, 0x6c, 0xf4, 0x26, 0x08, 0xaa, 0xfe, 0x5c, 0xb7, 0x62, 0x73, 0x1e, 0xc8, 0x48, 0xcf, 0x04, 0xb8, 0x16, 0x7c, 0x27, 0x91, 0x45, 0x7a, 0x88, 0xb8, 0x0f, 0xa3, 0x7f, 0x00, 0x4f, 0xf3, 0xc7, 0x09, 0xef, 0x99, 0xae, 0x05, 0x93, 0x6a, 0xd5, 0xd7, 0x2f, 0x94, 0xc8, 0xb5, 0x5a, 0x87, 0x7b, 0xaf, 0x7c, 0x62, 0xe5, 0x85, 0x3a, 0x95, 0x58, 0xeb, 0xf0, 0x77, 0x6b, 0x97, 0x4a, 0xc7, 0xb8, 0xc8, 0x36, 0x0e, 0x8f, 0xf5, 0x61, 0x82, 0xcf, 0x91, 0x4b, 0xd5, 0x76, 0xab, 0xb6, 0x00, 0x92, 0xcd, 0x6c, 0x71, 0x69, 0x7a, 0x10, 0x9d, 0x0b, 0xa8, 0xff, 0x34, 0x4c, 0x7f, 0xab, 0x4e, 0xc2, 0x4f, 0xba, 0x4b, 0xe9, 0xe2, 0xc5, 0x8e, 0x18, 0xa1, 0x8f, 0x91, 0x3e, 0x38, 0x8b, 0x9a, 0xac, 0xe1, 0x4f, 0x67, 0xf7, 0x23, 0xab, 0x4f, 0xa7, 0x47, 0x72, 0xed, 0xfc, 0x90, 0xa0, 0x3a, 0x67, 0x69, 0x7d, 0xea, 0xa5, 0x70, 0x3b, 0x65, 0xc5, 0xb7, 0xa4, 0x30, 0x19, 0x8e, 0x10, 0x70, 0xe3, 0x8a, 0x79, 0xf6, 0xae, 0xa0, 0x51, 0x17, 0xfa, 0xdc, 0x93, 0xe7, 0x38, 0x81, 0xd0, 0xe2, 0xed, 0xf6, 0x23, 0x5e, 0xb4, 0x73, 0x09, 0x89, 0xf7, 0x9e, 0x18, 0x0e, 0x42, 0xdf, 0x74, 0x36, 0x9d, 0x28, 0xd6, 0xea, 0x8f, 0x6a, 0xfa, 0x03, 0x44, 0x1d, 0x0b, 0x70, 0x72, 0xea, 0x2c, 0x50, 0x8f, 0xcb, 0x58, 0x14, 0x7e, 0x3d, 0x4a, 0x2a, 0xbf, 0x1e, 0xf8, 0x94, 0xa8, 0x8b, 0xd9, 0xcd, 0x92, 0x19, 0xe0, 0x01, 0x49, 0xa2, 0x55, 0x4e, 0x28, 0xb0, 0x64, 0xf0, 0x7f, 0x4b, 0x2f, 0x5d, 0x96, 0xa7, 0x40, 0x54, 0x56, 0x1b, 0xe1, 0x13, 0x30, 0xa0, 0x48, 0x2c, 0xb6, 0x30, 0xe9, 0xc8, 0x0b, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xbd, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0xc3, 0xa9, 0xb9, 0x73, 0x50, 0xe3, 0x6a, 0x08, 0xb4, 0x2e, 0x64, 0x6d, 0x05, 0x30, 0x00, 0x00, 0x00, 0x77, 0x82, 0x23, 0x5c, 0x1a, 0x92, 0xad, 0x54, 0xb4, 0x09, 0xb7, 0x88, 0x9e, 0x52, 0x6e, 0x19, 0xc5, 0xfa, 0xfe, 0x28, 0x20, 0x5a, 0x4d, 0xcf, 0xd3, 0xbc, 0x46, 0xbe, 0x0e, 0x52, 0xef, 0x4d, 0xad, 0x71, 0xdb, 0x51, 0x79, 0x70, 0x29, 0xd9, 0x13, 0x91, 0x58, 0x41, 0x68, 0x62, 0x25, 0x52, 0xf9, 0x8e, 0xc9, 0xca, 0x46, 0x94, 0x70, 0xc4, 0xa4, 0x78, 0xad, 0xc5, 0xd4, 0x07, 0x07, 0x0f, 0xd5, 0x15, 0x7b, 0x4e, 0x8d, 0x13, 0x9f, 0x26, 0x02, 0xb1, 0x1a, 0x95, 0xc9, 0x89, 0xbc, 0x38, 0xbb, 0x3f, 0xb3, 0x41, 0x8e, 0xc9, 0x76, 0x7e, 0x97, 0xeb, 0xb3, 0xcc, 0x4a, 0x3b, 0xf9, 0x97, 0xbc, 0x7e, 0xd3, 0x9e, 0x6e, 0x0c, 0x76, 0x85, 0x6f, 0xff, 0x4a, 0x56, 0x67, 0xe7, 0x51, 0xc0, 0x91, 0xa0, 0xc9, 0xa8, 0xef, 0xe0, 0x98, 0x69, 0x41, 0x6b, 0x86, 0x16, 0x94, 0x2a, 0x37, 0x31, 0xfa, 0x54, 0x7d, 0x73, 0x6f, 0x81, 0xff, 0xdd, 0xc3, 0x8c, 0x89, 0xa6, 0xb7, 0x8f, 0xbf, 0x1d, 0x7c, 0xab, 0x18, 0xef, 0x49, 0x0b, 0xa1, 0x59, 0x42, 0x2d, 0x51, 0xec, 0x36, 0xdd, 0xb9, 0x24, 0x48, 0xee, 0xa4, 0xbb, 0x42, 0xfd, 0x5a, 0x27, 0x41, 0x70, 0xb7, 0xe5, 0x2c, 0xb7, 0x68, 0x62, 0x6c, 0x9c, 0xe0, 0x1c, 0xf0, 0x59, 0x1b, 0xd7, 0x8f, 0x0e, 0xc4, 0x9f, 0x55, 0x23, 0x3c, 0x8d, 0x4d, 0x6a, 0xbe, 0x10, 0xb4, 0xa9, 0x18, 0x9c, 0xd1, 0x23, 0x5f, 0xb8, 0x8f, 0xc0, 0x8e, 0x65, 0xec, 0x2c, 0x39, 0x10, 0x31, 0x0e, 0xb9, 0x5a, 0xad, 0xeb, 0x26, 0x1a, 0x62, 0xc1, 0xd4, 0xa2, 0xdf, 0x09, 0x2b, 0xc6, 0x8b, 0x0c, 0xa3, 0xf8, 0x0f, 0x21, 0xc3, 0x9a, 0x7f, 0x4d, 0xc3, 0xe8, 0xc9, 0xa5, 0x46, 0x67, 0xfc, 0x2d, 0x76, 0x85, 0xa4, 0x8a, 0xa7, 0x49, 0xed, 0xf8, 0x45, 0xb4, 0xab, 0xbe, 0x48, 0xff, 0xe1, 0x4c, 0x25, 0x0a, 0x2d, 0x85, 0x8b, 0x75, 0x1a, 0x7e, 0x21, 0xf6, 0xf5, 0x91, 0x12, 0xae, 0xc9, 0x9c, 0x27, 0x4e, 0x8f, 0x29, 0xd7, 0x01, 0xa1, 0x3c, 0x32, 0xf4, 0xda, 0xf7, 0x25, 0x24, 0xfa, 0xfb, 0x9c, 0xa5, 0x96, 0xd2, 0x99, 0x9c, 0xcf, 0xba, 0x12, 0x40, 0x93, 0x9b, 0xf3, 0x40, 0xf6, 0x86, 0xaf, 0xcd, 0xe7, 0x53, 0xa4, 0x7d, 0x02, 0xeb, 0x91, 0x1b, 0x8c, 0xbc, 0xe4, 0xfb, 0x7e, 0x3e, 0x40, 0x14, 0x0d, 0xe2, 0x79, 0x97, 0x18, 0x1c, 0x7d, 0x58, 0x9d, 0xe2, 0x9e, 0x83, 0x81, 0xf7, 0x23, 0x68, 0xae, 0xcd, 0x2f, 0x1f, 0x54, 0x8e, 0xbb, 0x4a, 0x41, 0xc9, 0x19, 0xfd, 0x93, 0xe9, 0x65, 0x4f, 0x2d, 0xaa, 0x1e, 0x04, 0x67, 0x99, 0xfa, 0xe4, 0x58, 0xe2, 0x03, 0x9d, 0xd0, 0x76, 0x2b, 0x69, 0x15, 0x23, 0x19, 0x13, 0x8d, 0xa5, 0x61, 0x08, 0x3b, 0x91, 0xe5, 0x64, 0xd1, 0xa8, 0xb7, 0xfb, 0xa5, 0xc6, 0xac, 0xd8, 0x2a, 0xf1, 0xbb, 0xb2, 0x40, 0x5a, 0x40, 0xab, 0x57, 0xcb, 0x96, 0x55, 0x41, 0x04, 0x90, 0x1f, 0x40, 0xe8, 0xc6, 0x05, 0xd0, 0x78, 0x16, 0x81, 0x6b, 0xe3, 0xbb, 0x8a, 0xc8, 0xd4, 0x61, 0x7b, 0x16, 0xef, 0x09, 0xf5, 0x38, 0x2f, 0xf4, 0xa0, 0x6f, 0x4d, 0x0b, 0x04, 0x47, 0xdd, 0xf9, 0x7f, 0x24, 0x6a, 0x21, 0x18, 0x2f, 0xcf, 0xc9, 0xba, 0x22, 0x11, 0xdb, 0x45, 0xbd, 0xe3, 0x20, 0x48, 0xac, 0xa2, 0x83, 0x5c, 0xa4, 0xbd, 0xb7, 0xc3, 0x08, 0xd0, 0x90, 0xb1, 0x6e, 0xce, 0x1c, 0x7f, 0xc1, 0xff, 0xed, 0x5d, 0xbd, 0x38, 0x26, 0x39, 0x97, 0x22, 0x26, 0xf4, 0x71, 0x80, 0xd6, 0xae, 0xf3, 0x17, 0x98, 0x30, 0x36, 0xf8, 0x53, 0xf3, 0x66, 0x93, 0xf3, 0x7c, 0x3d, 0x4b, 0x6d, 0x8b, 0xb0, 0xa1, 0x52, 0xb5, 0x33, 0x4f, 0x71, 0x93, 0xfa, 0x11, 0xd2, 0xb1, 0x70, 0x92, 0x20, 0x19, 0x83, 0x8f, 0xb5, 0xc0, 0xa0, 0x94, 0x5c, 0xcf, 0x85, 0xcd, 0x46, 0xef, 0x79, 0xb9, 0xd1, 0xdf, 0xaa, 0x87, 0x71, 0x8e, 0x8c, 0x0b, 0x50, 0x0f, 0x8f, 0x1d, 0x78, 0x1f, 0x89, 0x44, 0x37, 0x67, 0xe1, 0x9d, 0xb5, 0x88, 0xee, 0x07, 0xe6, 0x59, 0x87, 0xcf, 0x49, 0xce, 0xab, 0x3f, 0x59, 0x83, 0x4e, 0xe1, 0x49, 0x97, 0x05, 0x67, 0x03, 0xff, 0x1e, 0x4a, 0x00, 0xcc, 0x1d, 0x3c, 0x6f, 0x14, 0x70, 0xa7, 0x1d, 0xc0, 0x0c, 0x02, 0x49, 0x62, 0xb6, 0x18, 0xaf, 0x08, 0xb4, 0xf7, 0xe8, 0xfe, 0x1c, 0x1c, 0x07, 0x1e, 0x13, 0x4d, 0xbd, 0x5d, 0x98, 0x02, 0x31, 0xb0, 0x88, 0x69, 0x14, 0x0e, 0x75, 0xa0, 0xc0, 0xb8, 0x0e, 0xe2, 0xe7, 0x43, 0x43, 0x80, 0x9b, 0x3a, 0x6e, 0xde, 0x33, 0xd7, 0xca, 0xba, 0x6e, 0x11, 0x56, 0x87, 0x71, 0x86, 0xa6, 0xf4, 0xf7, 0x43, 0xfe, 0x88, 0x76, 0xed, 0x65, 0x62, 0x2c, 0xc0, 0x93, 0xe5, 0x67, 0xf9, 0x03, 0xf3, 0x47, 0x14, 0xa3, 0xd6, 0xe5, 0x3e, 0x4d, 0xc4, 0x17, 0x4f, 0x20, 0xaf, 0x3e, 0x4a, 0x40, 0x4c, 0x1b, 0x77, 0x5b, 0x02, 0xac, 0x9e, 0xd6, 0x95, 0xf0, 0xf7, 0x49, 0xc8, 0x6e, 0x9b, 0x6d, 0x0f, 0x30, 0x48, 0x8a, 0x56, 0xcd, 0xd1, 0x73, 0x04, 0x97, 0x5a, 0x89, 0x17, 0x80, 0x0f, 0x60, 0x1a, 0x34, 0x77, 0x83, 0x57, 0x95, 0xda, 0x35, 0xda, 0x69, 0xef, 0xb8, 0x01, 0x31, 0x47, 0x4f, 0x19, 0x6f, 0x46, 0x0c, 0x3b, 0x8c, 0xe1, 0xb0, 0x47, 0x38, 0xe8, 0x72, 0x7d, 0x87, 0x14, 0x48, 0x46, 0x39, 0x35, 0x22, 0xc5, 0x53, 0x3f, 0x4e, 0x98, 0x81, 0xb5, 0x0c, 0x29, 0x5e, 0x0e, 0x28, 0x4e, 0xe1, 0x33, 0xb1, 0x8d, 0x22, 0x65, 0x24, 0x38, 0x2d, 0xac, 0xdf, 0xbc, 0x76, 0x67, 0xfe, 0x91, 0xae, 0x6f, 0x45, 0x1c, 0xce, 0xa8, 0xdc, 0xde, 0x96, 0x53, 0x49, 0xf9, 0x2b, 0x1a, 0xf9, 0x89, 0xe3, 0xff, 0xcc, 0x83, 0xbf, 0x09, 0xa5, 0x88, 0x26, 0xb4, 0x96, 0xd5, 0x1f, 0x12, 0x26, 0x5a, 0x5a, 0xd3, 0x82, 0xf1, 0xe0, 0xe3, 0x97, 0xf7, 0xc7, 0x5c, 0x1f, 0x80, 0x8b, 0x8e, 0x03, 0x7c, 0x51, 0x15, 0x10, 0x79, 0x36, 0x84, 0x3e, 0x58, 0xc7, 0xb5, 0x37, 0xa9, 0x8d, 0xb3, 0x1a, 0x32, 0xac, 0xc4, 0x49, 0xe1, 0xaa, 0xec, 0xd2, 0xe5, 0x8d, 0x26, 0x5b, 0x07, 0x4a, 0xb0, 0x09, 0xb8, 0x7a, 0x1b, 0x0e, 0xaf, 0x4f, 0x41, 0x4f, 0x8f, 0xf8, 0x70, 0x77, 0x36, 0x0c, 0x4f, 0x8c, 0xeb, 0xda, 0x67, 0x6a, 0xa8, 0x31, 0x01, 0x00, 0x08, 0x31, 0x72, 0x9b, 0xde, 0x2b, 0x4b, 0x2d, 0xad, 0x3c, 0x53, 0x55, 0x12, 0xb8, 0x24, 0xd8, 0xb4, 0xc1, 0xed, 0xad, 0x56, 0x5e, 0x93, 0x69, 0x3e, 0xf3, 0x4d, 0xf6, 0x60, 0xa0, 0x8e, 0x3f, 0xb7, 0x43, 0x30, 0x2a, 0xbd, 0x80, 0xf4, 0x5d, 0x2d, 0xb6, 0xa2, 0xab, 0x10, 0x06, 0xd5, 0xa7, 0xac, 0xb0, 0x7e, 0x41, 0xb9, 0x4b, 0xa5, 0x94, 0x5f, 0x90, 0xa1, 0x08, 0xd6, 0x38, 0x0a, 0x2d, 0xf9, 0xed, 0xa0, 0x94, 0x7f, 0xbe, 0xd4, 0xce, 0x04, 0xaf, 0xfa, 0xdb, 0x91, 0xb0, 0xc0, 0xa9, 0xf0, 0x6f, 0x30, 0x10, 0xab, 0x6c, 0xed, 0xa5, 0x50, 0x26, 0x12, 0x1f, 0x53, 0x0c, 0xc0, 0x0c, 0x29, 0x40, 0x4b, 0xff, 0x7e, 0x26, 0x42, 0x62, 0xfb, 0xe8, 0x9c, 0xf2, 0x27, 0xbb, 0xf8, 0xf3, 0xb2, 0x93, 0x37, 0x02, 0x32, 0x88, 0x24, 0x3d, 0x5f, 0x8a, 0x04, 0x8d, 0x9b, 0x08, 0x53, 0x3e, 0x30, 0xba, 0x32, 0x25, 0x0a, 0x3f, 0x81, 0x1e, 0xf2, 0x16, 0x74, 0xf0, 0x37, 0x4d, 0x69, 0x49, 0x87, 0xa0, 0x77, 0xb5, 0x87, 0xbf, 0x5d, 0x72, 0x7b, 0xf0, 0x61, 0x73, 0xa8, 0xb3, 0x18, 0x09, 0xce, 0x29, 0x78, 0x8e, 0x48, 0xdf, 0x2a, 0xd7, 0x23, 0xa9, 0xaf, 0x46, 0x43, 0xbb, 0x9b, 0xdb, 0x06, 0x2d, 0xaf, 0x6a, 0x16, 0x15, 0x74, 0x24, 0xe5, 0xa6, 0xc8, 0x39, 0x47, 0xb3, 0x43, 0x62, 0xc9, 0xdb, 0x75, 0xc1, 0x06, 0xad, 0xee, 0x08, 0x47, 0xf5, 0x77, 0xae, 0x3d, 0x50, 0x96, 0x4f, 0x24, 0x20, 0x6b, 0x52, 0x03, 0x80, 0x72, 0x2b, 0xed, 0xdc, 0x9f, 0x24, 0xda, 0xe2, 0xba, 0x81, 0x87, 0xa9, 0x7d, 0xfc, 0x06, 0xd4, 0x23, 0xb5, 0x0a, 0x52, 0x94, 0xc7, 0x63, 0xe7, 0x51, 0xad, 0x1e, 0xac, 0xa6, 0xbe, 0x8f, 0xd2, 0x9d, 0xe5, 0xb8, 0xa3, 0xdf, 0x99, 0x7a, 0xe7, 0x5e, 0x06, 0x38, 0x70, 0x5b, 0x4d, 0x27, 0x03, 0x2c, 0xa8, 0x0a, 0x3f, 0x93, 0xbb, 0x38, 0x7e, 0xae, 0xab, 0x9a, 0x7b, 0xd2, 0xc9, 0x8b, 0x53, 0xee, 0xcb, 0x80, 0x6f, 0x1d, 0x83, 0xdd, 0x81, 0xb8, 0xa0, 0xb9, 0xb6, 0xdc, 0x5e, 0xf1, 0x6b, 0x54, 0x0d, 0x32, 0xd7, 0xb0, 0xd5, 0x2b, 0xa2, 0xe5, 0xf7, 0x18, 0xa5, 0x28, 0x54, 0xb6, 0x7c, 0xea, 0x47, 0x8c, 0x7a, 0xb5, 0xce, 0x9d, 0x0f, 0xd8, 0x89, 0xfa, 0xd7, 0x21, 0xd8, 0x4b, 0x14, 0x5a, 0x86, 0x32, 0xd1, 0x40, 0x21, 0x75, 0x4b, 0xbf, 0x1c, 0x66, 0x54, 0x84, 0xb2, 0x1f, 0xd4, 0x32, 0x06, 0x7a, 0x52, 0x1f, 0x7d, 0xd8, 0x59, 0x99, 0x86, 0xb9, 0x6c, 0x26, 0xec, 0x5e, 0x74, 0x38, 0x5d, 0xb9, 0x38, 0xdd, 0xf6, 0x9c, 0x28, 0xbe, 0xb6, 0x87, 0xb7, 0xaf, 0x5b, 0x47, 0x7a, 0xbb, 0x79, 0x55, 0x53, 0x9c, 0xc1, 0x74, 0x73, 0x01, 0xde, 0xdf, 0xae, 0x0f, 0x63, 0xb2, 0xab, 0xc6, 0x01, 0x63, 0xea, 0xf2, 0xb5, 0x9a, 0x57, 0x2b, 0x62, 0x8b, 0x35, 0x21, 0x4d, 0xbc, 0x06, 0xb8, 0x7c, 0x31, 0x98, 0xc4, 0xbb, 0xd5, 0x83, 0x45, 0xd8, 0xc3, 0xa9, 0x2b, 0xab, 0x3e, 0x10, 0xfc, 0x60, 0x63, 0x6f, 0xbb, 0xbf, 0x90, 0x54, 0xe8, 0x63, 0x3f, 0x78, 0xf8, 0x8b, 0xa2, 0xa0, 0x75, 0x26, 0x21, 0x8d, 0xa4, 0xb2, 0xde, 0xa8, 0xaf, 0xb3, 0x3b, 0x65, 0x90, 0xac, 0xba, 0xad, 0x37, 0xac, 0xaf, 0x6a, 0xc1, 0x0a, 0x36, 0x5d, 0x95, 0x86, 0x13, 0x15, 0xbc, 0xf9, 0x7b, 0xc6, 0x62, 0x27, 0x88, 0xdb, 0x50, 0x16, 0x1a, 0x16, 0xe0, 0x5c, 0x3c, 0x0a, 0xf7, 0x5c, 0x69, 0xb8, 0xfe, 0x2a, 0x3c, 0x54, 0x3c, 0x57, 0x7e, 0xb5, 0xbb, 0x30, 0x32, 0x23, 0x59, 0x98, 0x0f, 0x83, 0x81, 0x3c, 0x2c, 0xaa, 0xdf, 0x28, 0xf3, 0xa0, 0x97, 0x28, 0xee, 0xad, 0x9a, 0xb5, 0x22, 0x2a, 0x43, 0x99, 0x51, 0x08, 0x82, 0x04, 0x9d, 0x9f, 0x56, 0x77, 0xfd, 0x8f, 0xaa, 0xb9, 0x17, 0xfb, 0xd0, 0x3b, 0x20, 0xc6, 0x31, 0xf4, 0x4f, 0x8b, 0x5d, 0x4b, 0x7c, 0x5e, 0x87, 0x9b, 0x75, 0x21, 0x31, 0x98, 0x05, 0xa8, 0x4c, 0xac, 0xde, 0x2b, 0x10, 0x4a, 0xc9, 0x79, 0x75, 0xd2, 0xb1, 0xf4, 0x23, 0x10, 0x80, 0x99, 0x52, 0xa6, 0x9c, 0xcb, 0x70, 0x75, 0xa2, 0x7a, 0x8b, 0x12, 0x50, 0xa4, 0x2c, 0x00, 0xe0, 0x86, 0x39, 0xda, 0x57, 0x10, 0x80, 0xe6, 0x4a, 0xc7, 0x0a, 0x9e, 0x40, 0x53, 0x22, 0xf3, 0xca, 0x19, 0x7c, 0xa2, 0xb2, 0xab, 0xa8, 0x2c, 0x32, 0xd5, 0x5e, 0xce, 0x54, 0x67, 0x02, 0x66, 0xe1, 0x00, 0x01, 0x60, 0xf8, 0xa5, 0x58, 0xd9, 0x44, 0x9d, 0xa2, 0x26, 0x2b, 0xd0, 0x9c, 0x99, 0xf3, 0x0c, 0x33, 0x57, 0xc0, 0xcf, 0x83, 0x02, 0xdb, 0x8f, 0x06, 0xa9, 0x12, 0x4b, 0xa9, 0x35, 0x00, 0x14, 0xab, 0xd5, 0x9f, 0x66, 0x4c, 0x57, 0xb8, 0xfc, 0xa9, 0x47, 0xb4, 0xae, 0xd3, 0xaa, 0xc8, 0x39, 0x70, 0x82, 0x93, 0x7d, 0xfb, 0xa3, 0x67, 0x33, 0x44, 0x2b, 0xf1, 0x09, 0xa7, 0x24, 0x5a, 0x66, 0x64, 0x72, 0xa3, 0xb8, 0x29, 0x65, 0xfc, 0xbe, 0xfa, 0xc9, 0x6b, 0x8e, 0x3d, 0xcf, 0x0f, 0x6f, 0x75, 0x30, 0xcf, 0xa7, 0x92, 0x7c, 0x5a, 0xcd, 0x0f, 0xd1, 0xcb, 0xa2, 0x9f, 0x75, 0xb9, 0x59, 0x67, 0x54, 0x24, 0xc0, 0xc1, 0x64, 0x14, 0xfa, 0xee, 0x14, 0xb8, 0x80, 0x56, 0x66, 0x18, 0xc3, 0xb4, 0xd2, 0x74, 0x83, 0x28, 0x8d, 0xe8, 0x1a, 0xb7, 0x5f, 0x6a, 0xb6, 0x9e, 0x2e, 0x27, 0xdd, 0xa1, 0xfb, 0xac, 0xeb, 0x9a, 0x76, 0xc3, 0x61, 0xf2, 0x2b, 0x70, 0x26, 0xf5, 0x35, 0x6b, 0x68, 0x12, 0x20, 0x1c, 0xa5, 0x6b, 0x51, 0x8a, 0xcc, 0xb4, 0xf8, 0x33, 0xbf, 0x00, 0x01, 0x46, 0x2d, 0x31, 0xc3, 0xd5, 0x98, 0x8f, 0xc5, 0x05, 0x39, 0x77, 0xde, 0x18, 0x8d, 0x0b, 0x77, 0x5a, 0x6a, 0x68, 0xe0, 0x27, 0x99, 0xdd, 0x6f, 0x79, 0x2c, 0xcb, 0x00, 0x9b, 0x1b, 0xf3, 0xf5, 0x76, 0x7b, 0x7c, 0xc2, 0xea, 0xb9, 0x60, 0xcc, 0x03, 0xbb, 0x9c, 0xa7, 0xc6, 0xad, 0x78, 0x26, 0xac, 0xa8, 0xfb, 0xdf, 0xaa, 0x1e, 0xab, 0x6f, 0x6c, 0xe3, 0xd6, 0x8f, 0x94, 0x5c, 0x30, 0x82, 0xba, 0xc9, 0xe5, 0xd2, 0x80, 0xe1, 0x30, 0xb4, 0x30, 0x24, 0xae, 0xb4, 0x6b, 0xcd, 0xf7, 0x17, 0x68, 0x65, 0x26, 0x0c, 0xa2, 0x8b, 0x9d, 0x7c, 0x03, 0xf2, 0xcd, 0xec, 0xee }; +constexpr AccessUnit AC3_BEGIN_OF_AU_SPLIT_EXPECTED_AU = { std::numeric_limits::max(), std::numeric_limits::max(), false, 0, {}, { 0xa6, 0x64, 0x73, 0xed, 0x20, 0xed, 0x51, 0x95, 0x8a, 0xc7, 0xee, 0xd3, 0x6f, 0x52, 0x8c, 0x0b, 0xcd, 0xe2, 0x4f, 0x51 } }; + + +const std::vector ATRACX_SIZE_MISMATCH_STREAM = { 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xbd, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xd0, 0x00, 0xbf, 0xa6, 0x85, 0x42, 0x98, 0xc5, 0x19, 0x4a, 0xdc, 0xcf, 0x38, 0x32, 0x5d, 0x7d, 0x6f, 0x99, 0xb2, 0x66, 0x6a, 0x9c, 0xe6, 0x6d, 0xaa, 0x5a, 0xbc, 0xcb, 0x31, 0x5c, 0xc9, 0x53, 0x87, 0x6c, 0x69, 0x2d, 0x3e, 0x35, 0xe6, 0xba, 0x7b, 0x05, 0x66, 0xfe, 0xea, 0xfe, 0x76, 0x9e, 0x0e, 0x53, 0xfe, 0xdc, 0x52, 0x31, 0x7a, 0xea, 0x93, 0xab, 0x90, 0xba, 0x50, 0x17, 0xc9, 0xe8, 0xa4, 0xdc, 0x3a, 0x10, 0xdc, 0x91, 0xed, 0x0d, 0x95, 0xdd, 0x15, 0x21, 0x8e, 0xf3, 0xd3, 0xfc, 0x6b, 0xb5, 0xc6, 0xac, 0x63, 0x72, 0x78, 0x72, 0xfe, 0x04, 0xc3, 0x55, 0xa3, 0x65, 0x7e, 0x50, 0x83, 0xfe, 0x92, 0xdd, 0x47, 0xa0, 0x5b, 0x10, 0x8f, 0xb6, 0x30, 0xb6, 0xac, 0x5e, 0x9a, 0x0b, 0xb0, 0xea, 0x43, 0xcf, 0x4c, 0xc5, 0x64, 0xe1, 0x14, 0x58, 0x5e, 0x4a, 0x4b, 0xc5, 0x14, 0xf0, 0xe7, 0xbc, 0xeb, 0x10, 0xc5, 0xf1, 0x98, 0x25, 0xab, 0x77, 0x04, 0xb2, 0xaf, 0x2c, 0xa1, 0x7e, 0x3f, 0x59, 0x9d, 0x6d, 0xc0, 0x64, 0xea, 0x1d, 0x98, 0x8f, 0x00, 0xfd, 0xc5, 0x8e, 0x57, 0x38, 0x71, 0x64, 0x9f, 0xd7, 0x57, 0x7d, 0xc4, 0x6c, 0x0f, 0x15, 0x8d, 0x84, 0xaa, 0xf3, 0xef, 0xd2, 0x66, 0x5b, 0xc4, 0xf0, 0xcf, 0x6b, 0x89, 0xd5, 0x9b, 0x55, 0x87, 0x5d, 0x63, 0xf6, 0x24, 0x17, 0x28, 0x33, 0xb8, 0xcd, 0x78, 0x9f, 0x2c, 0x00, 0x91, 0xe1, 0x79, 0x45, 0xe6, 0x8b, 0x3e, 0xab, 0xf5, 0xc4, 0x98, 0x00, 0xb7, 0xc7, 0x2a, 0x34, 0x47, 0xd6, 0xd3, 0x29, 0xd2, 0x2b, 0x4c, 0x3f, 0x6e, 0x06, 0x43, 0x60, 0x60, 0x69, 0xf1, 0x1b, 0xd4, 0x3f, 0xb8, 0x47, 0x7f, 0x2f, 0xc9, 0x4b, 0x23, 0xdd, 0x83, 0x6e, 0x4f, 0x69, 0x21, 0xc4, 0x48, 0x98, 0x53, 0x81, 0xd9, 0xfa, 0xba, 0xb6, 0xf9, 0x38, 0x64, 0x27, 0x24, 0xc9, 0xcb, 0x5f, 0xd8, 0x4f, 0x97, 0x06, 0x8e, 0xce, 0xa2, 0x88, 0xe2, 0x8b, 0x4c, 0xb6, 0x76, 0x49, 0xf6, 0x0c, 0x2a, 0xab, 0x06, 0x59, 0xde, 0x51, 0x73, 0xd6, 0x33, 0xe7, 0x4a, 0x85, 0x4a, 0x46, 0x83, 0x4e, 0xe4, 0x73, 0x19, 0xc4, 0x6d, 0x3c, 0xea, 0x36, 0xb8, 0xdb, 0x0d, 0xc7, 0x67, 0xe3, 0x72, 0x52, 0x08, 0x9d, 0x88, 0xd4, 0xb2, 0xec, 0x24, 0x0b, 0x9f, 0x2a, 0x9c, 0x34, 0xf2, 0x20, 0x6d, 0x7a, 0xbd, 0x2e, 0x9c, 0x22, 0x52, 0x34, 0xc6, 0xa6, 0x7a, 0x88, 0x76, 0xe4, 0x7a, 0x6d, 0x23, 0xba, 0xd7, 0x12, 0x3f, 0xf3, 0x31, 0x8b, 0x6d, 0xd8, 0xdc, 0x23, 0xf1, 0x21, 0x45, 0xdb, 0x2b, 0x92, 0x3f, 0x52, 0xbc, 0xf6, 0x1f, 0x57, 0x91, 0x5c, 0xef, 0xde, 0x64, 0x60, 0xcb, 0xfc, 0x27, 0x54, 0x9b, 0xf3, 0x94, 0x6a, 0x88, 0xed, 0x7c, 0xaf, 0x0c, 0x01, 0xc6, 0xb6, 0xe1, 0x98, 0x61, 0xbd, 0x17, 0xd8, 0x41, 0xc3, 0x89, 0x81, 0x55, 0x01, 0x80, 0xb7, 0x39, 0x0e, 0x18, 0x46, 0xea, 0xdb, 0x41, 0x59, 0xc0, 0x89, 0x11, 0x49, 0x99, 0x37, 0xcb, 0x1f, 0xe5, 0x21, 0xbf, 0xa0, 0x4d, 0xf9, 0x48, 0x8d, 0xef, 0xb3, 0x48, 0x90, 0xa5, 0xa1, 0x6a, 0xd6, 0x2b, 0xf2, 0x7e, 0x55, 0x34, 0xa9, 0xe6, 0x44, 0x8d, 0x26, 0xf3, 0x4c, 0xe4, 0x2c, 0xe5, 0x95, 0xc4, 0x63, 0x1c, 0x8d, 0x44, 0x81, 0x6a, 0x11, 0x16, 0xa9, 0xe3, 0x26, 0x49, 0xe3, 0x24, 0x04, 0x5d, 0x2d, 0xe0, 0x50, 0xfd, 0x47, 0x4c, 0x47, 0xfa, 0x8a, 0xa8, 0xf5, 0x82, 0x45, 0xff, 0x13, 0xda, 0x71, 0x93, 0x3b, 0x1c, 0xcc, 0x04, 0x75, 0x17, 0x2f, 0x2e, 0x5d, 0x0f, 0xdd, 0x33, 0xfa, 0x9c, 0xfa, 0x50, 0x9e, 0xa8, 0x29, 0x84, 0xee, 0x9c, 0xb2, 0xb2, 0xc4, 0xa9, 0xc0, 0x85, 0xb1, 0x42, 0x54, 0x4c, 0xd2, 0x62, 0x0d, 0xa4, 0xdf, 0xb3, 0xb7, 0x70, 0xe4, 0x9e, 0x8e, 0xa1, 0x9d, 0x4c, 0x1d, 0xdd, 0xc5, 0xfa, 0x8e, 0x67, 0x06, 0x17, 0x7d, 0xc6, 0xef, 0xb4, 0x5c, 0x1b, 0xac, 0xfd, 0xf7, 0x89, 0x36, 0xd0, 0x45, 0xf5, 0x95, 0xaa, 0xad, 0x23, 0x61, 0x4f, 0xd5, 0xdb, 0x52, 0x83, 0xa0, 0xb3, 0xba, 0xd1, 0x66, 0x0d, 0xe0, 0xa2, 0xb9, 0xd6, 0x73, 0xfa, 0xed, 0xe6, 0x96, 0xaf, 0x8b, 0x27, 0xf9, 0xe9, 0x24, 0xcb, 0x18, 0xc2, 0xa3, 0x41, 0x70, 0x89, 0xe9, 0x99, 0xb4, 0x58, 0x53, 0x80, 0x79, 0x55, 0x60, 0x88, 0x1e, 0xd7, 0x5d, 0x06, 0x5d, 0x67, 0x16, 0x48, 0xef, 0x25, 0xff, 0x76, 0x1d, 0x76, 0x94, 0x73, 0xf4, 0x48, 0xcd, 0x88, 0x58, 0xda, 0x46, 0x26, 0xf2, 0x0a, 0x0e, 0xc5, 0x59, 0x1c, 0xc4, 0xbd, 0xae, 0x00, 0x90, 0xe2, 0xed, 0xc8, 0xe7, 0xc4, 0x36, 0x5c, 0x5f, 0x1a, 0x72, 0xce, 0xbe, 0x7f, 0x9a, 0x25, 0xf1, 0x7d, 0x62, 0x78, 0x21, 0xe9, 0x8a, 0xca, 0x6f, 0x08, 0x91, 0x26, 0x9c, 0xa8, 0xeb, 0xf4, 0x56, 0xc9, 0x4d, 0x04, 0xaa, 0x36, 0x05, 0x4f, 0x67, 0x03, 0xf0, 0x7d, 0xd5, 0x60, 0x19, 0xd9, 0x5d, 0xf7, 0x05, 0xa1, 0x7c, 0xe9, 0xa2, 0x5b, 0xc7, 0x9b, 0x8e, 0x3d, 0xae, 0xc5, 0x89, 0x06, 0x4a, 0x4e, 0x66, 0x7d, 0x22, 0xbc, 0x98, 0x54, 0x7e, 0x95, 0xa5, 0x6d, 0xce, 0x09, 0xbc, 0x8e, 0x59, 0xda, 0x34, 0x7d, 0x9e, 0x83, 0x99, 0xf6, 0x0b, 0xa3, 0x69, 0xc3, 0xf1, 0xc7, 0x50, 0x1a, 0xde, 0xe3, 0xe3, 0x85, 0xf2, 0xc5, 0x7f, 0x01, 0x96, 0xb9, 0x68, 0x83, 0xd8, 0xb6, 0x62, 0x12, 0x52, 0x09, 0xf0, 0xf6, 0x73, 0xad, 0xe4, 0x40, 0xaa, 0x21, 0x7b, 0x5c, 0xf7, 0x1a, 0x39, 0x7d, 0x41, 0xed, 0x9b, 0x42, 0x3a, 0x48, 0xa9, 0xac, 0x5c, 0x16, 0x9c, 0x52, 0x7b, 0xcb, 0x5b, 0x48, 0xf0, 0x3c, 0x30, 0xeb, 0xae, 0x9e, 0xc0, 0xc9, 0xa7, 0xb7, 0x18, 0x84, 0x4e, 0x55, 0x44, 0xe1, 0xf1, 0x2b, 0x80, 0xfd, 0x4f, 0x63, 0xa7, 0x57, 0x35, 0x39, 0xba, 0xaa, 0xb4, 0xc7, 0x22, 0x08, 0xed, 0x0e, 0x2a, 0x24, 0x83, 0x62, 0xc9, 0x59, 0x19, 0xec, 0xa5, 0xb7, 0x36, 0xff, 0x10, 0xe9, 0x67, 0x82, 0x27, 0x38, 0xdc, 0x66, 0x66, 0x4f, 0xb9, 0x03, 0xb3, 0xd8, 0x6f, 0xc4, 0x7f, 0x61, 0xac, 0x72, 0x29, 0x71, 0x4b, 0x49, 0x99, 0xbc, 0x01, 0x6c, 0x30, 0x78, 0x94, 0x06, 0x7d, 0xd6, 0x75, 0xbb, 0xa4, 0x1b, 0x4a, 0xc9, 0xd4, 0x6c, 0x41, 0x65, 0xac, 0x7f, 0x47, 0xf6, 0x59, 0x75, 0xda, 0xfe, 0x0c, 0xf6, 0xa9, 0xb2, 0xf3, 0xfb, 0xac, 0xdd, 0x77, 0x02, 0x3b, 0x28, 0xd4, 0x0b, 0xa1, 0x1e, 0x2c, 0xef, 0xf9, 0x0d, 0x5b, 0x31, 0x8c, 0xeb, 0xbe, 0x07, 0x19, 0x2b, 0x67, 0xb1, 0x78, 0xe9, 0x0e, 0x08, 0x20, 0x51, 0xf1, 0xc2, 0x55, 0xa1, 0x33, 0xfe, 0x28, 0xc2, 0x75, 0xc0, 0xeb, 0x41, 0x0b, 0xaa, 0x98, 0x98, 0x92, 0x1d, 0xd6, 0xbf, 0xbd, 0xa9, 0x9e, 0xc8, 0x34, 0xd8, 0xeb, 0x3b, 0x9a, 0x65, 0x8f, 0x5f, 0xdd, 0x0d, 0x8b, 0xc5, 0x77, 0x31, 0x1b, 0x04, 0x42, 0x97, 0x16, 0x96, 0x89, 0x39, 0xac, 0xc3, 0x06, 0xe8, 0x9d, 0x36, 0x83, 0xf9, 0x8d, 0x71, 0x83, 0xe2, 0x5c, 0x0e, 0xc1, 0xc0, 0x12, 0x21, 0x0e, 0xae, 0x40, 0x67, 0xbd, 0x0c, 0xe0, 0xf6, 0x8b, 0x18, 0x77, 0x1a, 0x19, 0x8f, 0x1b, 0x9f, 0x6e, 0x5b, 0xfa, 0xf7, 0xf5, 0x93, 0xaf, 0xe6, 0xd2, 0x80, 0x4d, 0x11, 0x33, 0xc6, 0xff, 0x0c, 0x1b, 0x92, 0x99, 0x2e, 0xc3, 0x33, 0xc1, 0x89, 0x51, 0x36, 0x35, 0xda, 0x52, 0x60, 0x7c, 0x94, 0x33, 0xff, 0xd8, 0x46, 0x70, 0xd5, 0x6d, 0x0f, 0x17, 0x42, 0x20, 0x50, 0xc7, 0xb6, 0xa4, 0xa9, 0x35, 0x91, 0x8b, 0x4c, 0xdf, 0xe4, 0xd1, 0x5d, 0xfc, 0x45, 0x27, 0x5a, 0x66, 0x99, 0x63, 0xa2, 0x6b, 0x01, 0x84, 0x7a, 0x28, 0x34, 0x74, 0x29, 0xa6, 0x1e, 0xbf, 0x47, 0x3a, 0x90, 0x93, 0x62, 0xc1, 0xf1, 0xbc, 0xd3, 0x8b, 0x16, 0x45, 0xd5, 0xd0, 0xf9, 0xab, 0x58, 0x75, 0x0e, 0xa2, 0x10, 0xfe, 0xa3, 0xcc, 0x56, 0x8b, 0x2a, 0x9d, 0x62, 0x9e, 0x80, 0x68, 0xd4, 0x35, 0xd8, 0xd5, 0x0d, 0x73, 0x2b, 0xac, 0x90, 0x0c, 0xbe, 0xd3, 0x36, 0xd7, 0x0b, 0xfc, 0x10, 0x0e, 0x3d, 0x49, 0x7b, 0xa8, 0x64, 0xad, 0xa5, 0x2f, 0x04, 0x8d, 0x9d, 0x42, 0xee, 0x7e, 0x24, 0xb6, 0xd8, 0x8a, 0x47, 0x23, 0x87, 0xf9, 0xee, 0x6d, 0x39, 0x5c, 0x4a, 0x7e, 0xdc, 0xfa, 0x03, 0x5f, 0xe9, 0x18, 0xbe, 0x0b, 0x12, 0x10, 0x64, 0xae, 0x5a, 0x17, 0x20, 0x41, 0xaf, 0x82, 0xb1, 0x6c, 0x14, 0xa8, 0x9b, 0x1e, 0x43, 0x7c, 0x45, 0x24, 0xe0, 0x81, 0xf5, 0x13, 0xe0, 0x92, 0xc1, 0x77, 0xb2, 0x7c, 0xd6, 0x54, 0xad, 0x8f, 0x69, 0x32, 0xcf, 0x87, 0x8e, 0x72, 0xa5, 0xac, 0x8c, 0x89, 0xec, 0x22, 0x99, 0x84, 0x08, 0x70, 0x9e, 0xcb, 0x48, 0x0d, 0xe3, 0x2e, 0x06, 0x16, 0xe3, 0x4a, 0x08, 0x24, 0xf7, 0xfb, 0xda, 0x91, 0x7b, 0xd5, 0x95, 0xf0, 0x8a, 0x2f, 0x23, 0x40, 0xaf, 0x64, 0x7b, 0xab, 0x46, 0x41, 0x49, 0x01, 0xd1, 0xd3, 0x08, 0xf9, 0x07, 0x69, 0x4d, 0x78, 0x69, 0xbf, 0x4c, 0x6c, 0x12, 0x7c, 0xb1, 0xc2, 0xaf, 0x7c, 0x23, 0x30, 0x29, 0x70, 0xc4, 0x79, 0xcc, 0x97, 0xe1, 0x23, 0x01, 0xeb, 0x02, 0xe8, 0x01, 0x53, 0xbb, 0x37, 0x3b, 0xf5, 0x46, 0x9e, 0x00, 0xba, 0xf6, 0x5d, 0xae, 0xeb, 0x02, 0xae, 0xf6, 0x45, 0x22, 0x00, 0xac, 0x7a, 0x3b, 0x53, 0xbd, 0x6a, 0x6c, 0x59, 0xd5, 0x24, 0x4a, 0xb3, 0x41, 0xf1, 0x27, 0x0f, 0x5e, 0x12, 0x33, 0x91, 0xad, 0xc8, 0xac, 0x2a, 0x06, 0x73, 0x5a, 0x94, 0x19, 0x7a, 0x8b, 0x0f, 0x8a, 0xd6, 0x86, 0x9d, 0x18, 0x22, 0x5f, 0x7d, 0x7d, 0xd9, 0x8e, 0x0f, 0x36, 0xcc, 0x6d, 0x39, 0xe9, 0x9d, 0xd7, 0xfd, 0xe3, 0xdc, 0xbe, 0xff, 0x72, 0x67, 0xa8, 0x27, 0xb8, 0x56, 0xcd, 0xde, 0x79, 0x11, 0x0d, 0xf7, 0x8e, 0xaf, 0xad, 0xd3, 0x32, 0x57, 0x2a, 0xb0, 0xaa, 0xe5, 0xf3, 0x9a, 0xc4, 0xa6, 0x62, 0x89, 0x53, 0x5a, 0x89, 0xd7, 0x04, 0x96, 0xfd, 0x3d, 0x78, 0x61, 0x44, 0xfe, 0x43, 0x8d, 0xda, 0x00, 0xc2, 0x95, 0xcf, 0x4d, 0x6b, 0xd4, 0x17, 0x0d, 0xec, 0x4a, 0x84, 0x1c, 0xc1, 0x6f, 0x29, 0xe5, 0xf8, 0x40, 0x1a, 0x5f, 0x29, 0x97, 0x7a, 0xa3, 0x1c, 0x2d, 0x7a, 0x31, 0x9b, 0xd1, 0x7f, 0x44, 0x0b, 0x7d, 0xa9, 0xbf, 0xb8, 0xf8, 0xdb, 0x2b, 0x94, 0x32, 0x21, 0xa5, 0x8f, 0xb8, 0x13, 0x13, 0x43, 0x84, 0x18, 0x90, 0xc9, 0x0c, 0x5a, 0x6d, 0x07, 0x8b, 0xff, 0xe1, 0x67, 0xec, 0x10, 0x51, 0x25, 0xe3, 0x2a, 0xd9, 0x7a, 0xaa, 0x82, 0x17, 0xb8, 0x4d, 0xa5, 0xd9, 0xb8, 0x3f, 0x55, 0x88, 0xa1, 0x1c, 0x7f, 0x07, 0x06, 0x43, 0xce, 0xf5, 0x1e, 0x5d, 0x31, 0x02, 0x12, 0xfc, 0x5d, 0xd6, 0x9b, 0xfb, 0xb7, 0xf7, 0x0c, 0xd5, 0x57, 0xac, 0xbe, 0x28, 0x62, 0xc3, 0xfa, 0xa0, 0x4c, 0x39, 0xaf, 0xfa, 0x65, 0xe2, 0x12, 0x11, 0x7a, 0x42, 0x11, 0x07, 0xb6, 0x66, 0x23, 0xb5, 0xa5, 0xbc, 0xbc, 0xa5, 0x04, 0x97, 0x6d, 0xc7, 0x25, 0x36, 0xa8, 0x44, 0xaa, 0x84, 0x38, 0xec, 0xe4, 0x54, 0xd2, 0x2b, 0xaa, 0x8c, 0x06, 0x21, 0xed, 0x40, 0x3b, 0x02, 0x02, 0x38, 0xa8, 0xbf, 0x41, 0x74, 0xbe, 0x78, 0x76, 0x2f, 0xb9, 0x85, 0x32, 0xf6, 0xca, 0x93, 0x1f, 0x2e, 0xfd, 0xe9, 0x4c, 0xcc, 0x09, 0x9d, 0x32, 0x9c, 0xec, 0xb5, 0x1c, 0x96, 0xe9, 0x09, 0xea, 0x6d, 0x64, 0x12, 0xd6, 0x45, 0x3a, 0x57, 0x19, 0x51, 0x5f, 0x27, 0x30, 0x0a, 0x28, 0xbd, 0x65, 0x25, 0xbb, 0xc8, 0x28, 0x9d, 0x95, 0x7c, 0xd6, 0x03, 0x2c, 0xaf, 0x01, 0x3d, 0x68, 0x38, 0x3f, 0x92, 0xee, 0x7e, 0xe8, 0x39, 0xfc, 0x39, 0x4f, 0xb8, 0x3b, 0x1e, 0x00, 0xef, 0x00, 0x5a, 0x0e, 0x2d, 0xf9, 0x3e, 0x74, 0x57, 0x91, 0x03, 0xa0, 0x33, 0x4a, 0xea, 0x07, 0x3b, 0x1e, 0x3d, 0x48, 0x7d, 0xb1, 0x01, 0xd1, 0xf7, 0xbf, 0x89, 0x3f, 0x2d, 0x3e, 0x81, 0x41, 0xd8, 0xc0, 0xf6, 0x2d, 0x4a, 0x26, 0xe0, 0x2b, 0x0f, 0xee, 0x42, 0xc5, 0x47, 0x88, 0xa9, 0x81, 0x6b, 0xbc, 0xb3, 0x13, 0x66, 0xc5, 0x9f, 0x18, 0x41, 0xdb, 0xd4, 0xff, 0x1c, 0x9a, 0x4a, 0xb9, 0x3e, 0x29, 0xd0, 0xaf, 0xd1, 0xf6, 0xce, 0x64, 0x46, 0xc4, 0xcb, 0x95, 0xeb, 0x90, 0x31, 0xb1, 0xd9, 0xf2, 0x2c, 0x6c, 0xee, 0x96, 0x9b, 0xee, 0x0c, 0x46, 0x18, 0xa7, 0xa8, 0xaa, 0x0b, 0xfe, 0x30, 0x94, 0x00, 0x51, 0x48, 0xd8, 0x6b, 0xe5, 0x4d, 0x87, 0x46, 0x10, 0x8f, 0x50, 0x1c, 0xec, 0xe0, 0xc7, 0xf7, 0x24, 0x16, 0xf5, 0xa8, 0xa2, 0xd4, 0x71, 0xd7, 0x1f, 0x26, 0xa6, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xbd, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x00, 0x00, 0x00, 0x00, 0xbc, 0xc5, 0x39, 0x13, 0xe5, 0x6a, 0x03, 0x84, 0xdc, 0x27, 0x67, 0xc2, 0x48, 0xe4, 0xb1, 0xab, 0x7b, 0x3f, 0x94, 0xdd, 0x91, 0x15, 0x9e, 0xd7, 0xdb, 0x7a, 0x60, 0xc4, 0x79, 0xa0, 0x79, 0x4f, 0x93, 0x16, 0xb0, 0x48, 0x25, 0x38, 0x29, 0x1e, 0x45, 0x14, 0x77, 0x05, 0x1d, 0x29, 0x39, 0x03, 0xdd, 0xcd, 0xff, 0x2d, 0x6a, 0x02, 0xf1, 0x26, 0x6a, 0xd4, 0x7e, 0x3c, 0x19, 0xae, 0x69, 0xf7, 0xc4, 0xc6, 0xa5, 0xe6, 0x21, 0x31, 0x08, 0xc8, 0x05, 0x0e, 0xf2, 0x7a, 0x53, 0x86, 0x3e, 0xe7, 0xf4, 0x57, 0x6b, 0x44, 0x1d, 0x10, 0xdf, 0xfb, 0x77, 0x15, 0x5d, 0x65, 0xf8, 0x59, 0x95, 0xbd, 0x66, 0xbc, 0x00, 0xec, 0xbf, 0xf8, 0xa3, 0x15, 0x99, 0x7b, 0x7f, 0xea, 0x11, 0x8d, 0x0b, 0x77, 0xee, 0x8e, 0x0b, 0x34, 0xb9, 0x39, 0x70, 0xb7, 0x2d, 0x2d, 0x58, 0x54, 0x34, 0x7b, 0x4c, 0x5f, 0x8d, 0x23, 0xe0, 0xa6, 0xc6, 0xb9, 0xc4, 0x77, 0x0f, 0xfc, 0x55, 0xb7, 0x3f, 0xd8, 0x39, 0x61, 0x37, 0xa4, 0xb8, 0xf2, 0x8a, 0xc8, 0x17, 0x82, 0x42, 0x08, 0xee, 0x26, 0x1b, 0x75, 0xb7, 0xdc, 0x44, 0x60, 0x57, 0x85, 0x8e, 0x3b, 0xaa, 0x71, 0xb5, 0x73, 0xb9, 0x1f, 0x59, 0x35, 0x35, 0xe6, 0x3d, 0x56, 0x61, 0x20, 0xc5, 0x4e, 0xf0, 0xc2, 0x4b, 0xa9, 0x01, 0xfb, 0xd0, 0xba, 0xa1, 0x7e, 0xf7, 0x00, 0x4b, 0xe1, 0x56, 0x22, 0x16, 0xd3, 0xbf, 0x1d, 0x17, 0xb6, 0x8d, 0xac, 0xdb, 0xba, 0x5a, 0x09, 0x15, 0x06, 0x2f, 0x77, 0x8a, 0xd5, 0xbd, 0xc4, 0x3c, 0x2d, 0xe3, 0xcc, 0x4e, 0x42, 0x68, 0xad, 0x44, 0xf9, 0x05, 0x13, 0xf2, 0x4d, 0x70, 0x50, 0x74, 0x62, 0xcd, 0xfa, 0xc8, 0xba, 0x19, 0x51, 0x38, 0xcc, 0x37, 0x63, 0x27, 0x94, 0xbc, 0x8f, 0x3d, 0x64, 0xba, 0xfd, 0x3f, 0x11, 0xcd, 0x6c, 0x45, 0x28, 0xf3, 0xf9, 0x65, 0x92, 0xd3, 0x05, 0xdb, 0xc5, 0xc4, 0x2a, 0xe0, 0x99, 0xbe, 0x26, 0x9e, 0xf5, 0xc3, 0x0b, 0xd1, 0x03, 0x45, 0xaf, 0xc6, 0x8f, 0x37, 0x25, 0x6b, 0xf0, 0x1a, 0x04, 0x6e, 0x8e, 0x4c, 0x82, 0x8a, 0x9b, 0x02, 0x10, 0x4a, 0x02, 0xf5, 0x25, 0x56, 0xbb, 0x5e, 0x24, 0x95, 0x94, 0x69, 0x8a, 0x98, 0xd3, 0x62, 0x9c, 0x5f, 0x5e, 0xe1, 0x3c, 0xc7, 0x20, 0x7c, 0xd9, 0xcd, 0x17, 0x90, 0x53, 0xa0, 0xb7, 0x8b, 0x87, 0x8c, 0x14, 0x54, 0xdd, 0x46, 0x70, 0xfc, 0x43, 0x9d, 0xb3, 0xb1, 0xe9, 0x58, 0xcd, 0x7b, 0x72, 0x4c, 0xf1, 0x6e, 0x56, 0x61, 0x1b, 0xaf, 0xda, 0x58, 0xee, 0xaa, 0x81, 0x72, 0xe6, 0xa5, 0x9e, 0xee, 0xde, 0x76, 0x2d, 0x71, 0x23, 0x7c, 0x54, 0x03, 0x46, 0x19, 0x5b, 0x3d, 0x08, 0x5e, 0x87, 0x30, 0x89, 0xb2, 0xdb, 0x79, 0x52, 0x80, 0xd9, 0x58, 0xb4, 0x74, 0x2b, 0x83, 0xa1, 0x8d, 0x41, 0x59, 0xd4, 0x75, 0xbe, 0xe6, 0xf5, 0x9e, 0x65, 0x82, 0x38, 0x4c, 0x5a, 0xae, 0x3b, 0x37, 0x5e, 0xe1, 0xcc, 0xac, 0x69, 0xf0, 0x38, 0x64, 0x1f, 0xfe, 0xdf, 0xff, 0xf6, 0x6f, 0x07, 0x55, 0x18, 0x8f, 0xab, 0x52, 0x4a, 0x5d, 0xbd, 0x4f, 0x31, 0xa5, 0x87, 0xda, 0x25, 0xf3, 0xbf, 0xcf, 0x70, 0xae, 0xa3, 0x97, 0xb9, 0x33, 0x2c, 0xb7, 0xc9, 0x7f, 0x1b, 0x82, 0xe2, 0x19, 0x97, 0x0b, 0xab, 0xf8, 0xbc, 0x53, 0x75, 0xcd, 0x7e, 0x07, 0x4b, 0xea, 0x60, 0x05, 0xfb, 0x0a, 0xde, 0xcc, 0xe2, 0x18, 0xf7, 0xb6, 0x92, 0x75, 0x4b, 0x10, 0x6f, 0x04, 0x33, 0x08, 0xfb, 0x03, 0x0a, 0x02, 0x28, 0xb2, 0xe8, 0xcd, 0x03, 0xf0, 0x9c, 0x22, 0xa3, 0x2e, 0x5c, 0x99, 0x7d, 0xa5, 0xd2, 0xf2, 0xf4, 0x00, 0x60, 0xf0, 0xe0, 0x67, 0x1b, 0xe4, 0x1a, 0x79, 0xea, 0xa0, 0x68, 0xe8, 0x6e, 0xd5, 0x75, 0xa2, 0xbb, 0xca, 0x5d, 0x66, 0xe8, 0x0f, 0x1e, 0x1a, 0xd5, 0x16, 0xe7, 0x99, 0x13, 0x69, 0x0a, 0xec, 0x43, 0x9e, 0x66, 0x44, 0xc4, 0x89, 0xfe, 0x87, 0x9c, 0x34, 0x7e, 0x3c, 0x5b, 0x9c, 0x95, 0x9c, 0x88, 0x56, 0xd2, 0x16, 0xa3, 0x49, 0x0e, 0x30, 0x50, 0x2e, 0x84, 0x79, 0xe0, 0xdb, 0x82, 0x68, 0x37, 0x96, 0x0d, 0x85, 0x0c, 0x47, 0x85, 0xbd, 0xb5, 0x27, 0xb7, 0x70, 0x91, 0xad, 0x7f, 0x81, 0xb4, 0x04, 0xd3, 0x78, 0x0b, 0xab, 0xd4, 0xf0, 0xe4, 0x6d, 0xcd, 0xa4, 0x1a, 0xd2, 0xdb, 0x58, 0x10, 0x36, 0x92, 0xe2, 0xdd, 0xc8, 0xb1, 0xda, 0xc4, 0x00, 0xe5, 0x0c, 0xdc, 0x25, 0xdc, 0xac, 0x95, 0xff, 0x0a, 0xaa, 0x2b, 0xa3, 0x28, 0x34, 0xbd, 0x66, 0xd4, 0xaa, 0x76, 0x31, 0x05, 0x04, 0x70, 0xc1, 0x3a, 0x46, 0x6c, 0x98, 0x24, 0x74, 0x02, 0xd4, 0xd3, 0xb0, 0x0c, 0x5b, 0x4f, 0x8d, 0x83, 0x74, 0xa2, 0x72, 0x58, 0xc2, 0xa2, 0x43, 0x11, 0x13, 0x45, 0xe6, 0x50, 0xc7, 0x3e, 0x80, 0x45, 0x43, 0xf8, 0x8a, 0x03, 0xa3, 0x29, 0x6c, 0x9a, 0x03, 0x64, 0x05, 0xf9, 0xd9, 0x59, 0xfc, 0xbc, 0x29, 0xd5, 0x6d, 0xb2, 0x94, 0xeb, 0xbc, 0x23, 0xc1, 0x4f, 0xba, 0xaa, 0x08, 0x7b, 0x73, 0x0c, 0x51, 0x36, 0xef, 0xaf, 0xb4, 0x06, 0xf1, 0x9f, 0xbd, 0x03, 0x95, 0xcb, 0x16, 0xf0, 0xc1, 0xab, 0x94, 0xc6, 0xd2, 0xc9, 0xf9, 0xe4, 0x84, 0x49, 0xd3, 0x9a, 0x58, 0x11, 0x98, 0x69, 0x48, 0xcb, 0xc2, 0xfb, 0x73, 0x5b, 0xc6, 0x9d, 0xdc, 0x27, 0x81, 0xca, 0x8c, 0xf2, 0x00, 0x6a, 0x19, 0xc3, 0xc2, 0x89, 0xbe, 0x01, 0x2f, 0xda, 0x6a, 0xad, 0x6f, 0x93, 0x4c, 0x0e, 0xc9, 0x0b, 0x99, 0xc0, 0xaf, 0xc0, 0xa9, 0x7a, 0xc9, 0x68, 0x2c, 0xca, 0x94, 0xae, 0xfa, 0xcc, 0xbe, 0x59, 0x5f, 0xe7, 0xc3, 0x41, 0xa4, 0x13, 0xf0, 0x64, 0xa5, 0x7c, 0xd1, 0x96, 0x22, 0x1a, 0x79, 0x81, 0x3d, 0x28, 0x22, 0xfe, 0xa1, 0x4f, 0x87, 0x17, 0x0b, 0xa3, 0x75, 0x91, 0xae, 0x9d, 0xa7, 0xfc, 0xfc, 0xba, 0x02, 0xe1, 0xcb, 0x0d, 0x20, 0xae, 0x53, 0xa3, 0x93, 0x10, 0xc5, 0x58, 0xd8, 0x01, 0xc1, 0xc9, 0x62, 0x5a, 0xc4, 0x5a, 0x77, 0xd8, 0x67, 0x3f, 0x2c, 0xd3, 0x2d, 0x0d, 0x16, 0x2f, 0xbe, 0x14, 0x66, 0x63, 0xd6, 0x7a, 0x52, 0xb6, 0xbf, 0x22, 0x69, 0xc4, 0xad, 0x20, 0x66, 0x0e, 0x65, 0x4a, 0x33, 0x8a, 0x74, 0x0b, 0x67, 0xe9, 0x72, 0x1d, 0x67, 0x48, 0xcb, 0xde, 0x02, 0xb0, 0xd3, 0xc3, 0x5e, 0x3c, 0xe8, 0xd2, 0x9d, 0x36, 0x9c, 0x66, 0x1c, 0xa9, 0x54, 0x3e, 0x3c, 0x7d, 0x77, 0x2e, 0x63, 0x8c, 0x07, 0x77, 0x69, 0xf4, 0x0a, 0x24, 0x9a, 0x06, 0x04, 0x9a, 0xa9, 0xcc, 0x4b, 0x3d, 0x23, 0x4a, 0x34, 0x14, 0x67, 0x16, 0xb0, 0x9b, 0x77, 0xa2, 0x59, 0xa2, 0x31, 0xda, 0xd6, 0xa9, 0x68, 0x2f, 0xa3, 0xea, 0x29, 0xd0, 0xab, 0x2c, 0x10, 0xde, 0x65, 0x57, 0x15, 0x70, 0xdc, 0xa9, 0x3c, 0x87, 0x07, 0x13, 0x1a, 0x10, 0xfb, 0x57, 0xac, 0xb3, 0x03, 0x76, 0x5a, 0xc7, 0x8e, 0x38, 0xf3, 0xce, 0x00, 0xf1, 0x68, 0x5a, 0xc6, 0x92, 0x74, 0x21, 0x81, 0xa9, 0x0f, 0x98, 0x22, 0x2b, 0xa5, 0x00, 0x5d, 0x63, 0x6a, 0x89, 0xc6, 0xfa, 0x6c, 0x87, 0x2c, 0xe6, 0x07, 0x1e, 0x6e, 0x99, 0xa2, 0x44, 0xa8, 0x8b, 0xef, 0xdb, 0x03, 0x02, 0x7e, 0x44, 0x4b, 0xdc, 0xeb, 0xe7, 0x90, 0xc7, 0x11, 0x91, 0xd3, 0x80, 0xd3, 0x4e, 0x46, 0x20, 0x67, 0xbe, 0xbb, 0x30, 0x0f, 0x4c, 0x2a, 0xdc, 0x58, 0x4a, 0xf8, 0xed, 0x56, 0x6d, 0x4e, 0xe2, 0x1b, 0xea, 0x2c, 0x09, 0x72, 0x83, 0x95, 0xb3, 0xe5, 0x53, 0x15, 0x66, 0x31, 0xcb, 0x32, 0x10, 0xac, 0xe2, 0xab, 0xa7, 0x33, 0xeb, 0xcc, 0xeb, 0xb5, 0xd4, 0xbf, 0x1d, 0x47, 0xd3, 0x61, 0x08, 0x87, 0x48, 0xa9, 0x5e, 0xa7, 0xa6, 0x06, 0xfd, 0xc5, 0xb4, 0xe6, 0x60, 0xcc, 0xf0, 0xcf, 0x35, 0xaf, 0x41, 0xee, 0xa2, 0x1e, 0x72, 0xd5, 0xda, 0x16, 0x33, 0xd6, 0xd5, 0x03, 0x05, 0xec, 0x6e, 0x3d, 0x51, 0x7d, 0x22, 0xf3, 0x9d, 0x2a, 0xef, 0x45, 0xb9, 0x61, 0x5f, 0x53, 0xcf, 0x9c, 0xd3, 0xeb, 0x46, 0x36, 0xf3, 0xf5, 0xe8, 0xcc, 0xec, 0xcf, 0x9b, 0xf6, 0x83, 0x52, 0xd4, 0x12, 0x88, 0x0d, 0xbd, 0x65, 0x41, 0x5a, 0x11, 0x37, 0x64, 0xad, 0xbc, 0x15, 0xb1, 0xd6, 0x37, 0x3d, 0xcd, 0xca, 0x07, 0xa1, 0x0d, 0x65, 0x42, 0x56, 0xae, 0x86, 0x0d, 0xec, 0xc1, 0x6c, 0x4b, 0x52, 0x7b, 0x42, 0x3d, 0x4b, 0xf9, 0x04, 0x86, 0xb1, 0xdf, 0x34, 0x24, 0xd7, 0x8e, 0xc4, 0x51, 0x0e, 0x37, 0x7b, 0xfc, 0x5d, 0xf8, 0x3c, 0x18, 0x69, 0xaa, 0xce, 0xca, 0x3c, 0xce, 0x76, 0xbf, 0x98, 0x91, 0x9b, 0xcc, 0x07, 0x9c, 0x0a, 0x9a, 0xa4, 0x21, 0x95, 0x91, 0xee, 0x73, 0xc3, 0xc9, 0x4a, 0xf2, 0x4e, 0x46, 0x32, 0x51, 0xd2, 0xd9, 0x5f, 0xb5, 0x31, 0x4f, 0x33, 0xc7, 0x14, 0xe2, 0x23, 0xe3, 0x22, 0xbe, 0xe0, 0xe2, 0xa5, 0x95, 0x2f, 0x2a, 0xf8, 0x7f, 0x6e, 0x96, 0x88, 0x36, 0x9b, 0xca, 0x66, 0x6b, 0xac, 0xd3, 0x93, 0x5f, 0x93, 0xfb, 0x5c, 0xf3, 0xb7, 0xb2, 0x16, 0xfb, 0x95, 0x21, 0xcc, 0xdc, 0xdb, 0xe9, 0xbf, 0x87, 0x9b, 0x23, 0xf9, 0x50, 0x8f, 0x58, 0xfa, 0x4e, 0xe5, 0x8c, 0xcd, 0xda, 0x0e, 0x3a, 0xca, 0x8a, 0x5e, 0x12, 0xc5, 0xdb, 0x08, 0xec, 0x36, 0x4a, 0xac, 0x5b, 0xf0, 0x53, 0x30, 0x47, 0xbf, 0xa7, 0x45, 0xb3, 0x37, 0x7b, 0x1b, 0xad, 0x47, 0x85, 0x4d, 0xdd, 0xcb, 0x11, 0x08, 0x26, 0x31, 0x5d, 0x33, 0xa1, 0x02, 0xba, 0xe1, 0x9c, 0x53, 0x0e, 0xee, 0xaa, 0xc0, 0x96, 0x37, 0xc0, 0xf5, 0xec, 0xa4, 0x89, 0xd9, 0xaf, 0x18, 0x2a, 0x24, 0x36, 0x07, 0xff, 0x1c, 0x56, 0x08, 0x06, 0x8f, 0xb5, 0xb0, 0x04, 0x49, 0x36, 0xa4, 0xcb, 0x66, 0x69, 0xae, 0x48, 0xd1, 0xc6, 0x60, 0x7b, 0x51, 0x06, 0x34, 0xe9, 0x25, 0x5e, 0x41, 0xfc, 0x8a, 0xf3, 0xbb, 0xe3, 0xa4, 0xc0, 0x45, 0xed, 0x12, 0x8e, 0x47, 0xdb, 0x94, 0x4f, 0x1d, 0x23, 0xfe, 0x97, 0x7d, 0x05, 0x11, 0x78, 0x67, 0x46, 0xcd, 0x01, 0x2e, 0x22, 0x3b, 0x48, 0x87, 0x08, 0xb1, 0x2d, 0x5d, 0xe4, 0xd8, 0x3d, 0xe2, 0x10, 0xab, 0xf1, 0xcd, 0xd6, 0x5f, 0x5c, 0xde, 0x11, 0x5f, 0xd3, 0xf4, 0x8d, 0xcd, 0xb7, 0xd1, 0x44, 0xd5, 0xf7, 0x10, 0x64, 0x00, 0x7c, 0xf7, 0xcd, 0xfb, 0x24, 0x03, 0x7a, 0xd4, 0x70, 0x16, 0x2f, 0x02, 0x0b, 0xca, 0x81, 0x9f, 0x6e, 0x9e, 0x9e, 0x22, 0x29, 0x24, 0x23, 0xdf, 0xe5, 0x8f, 0xba, 0x82, 0x7b, 0x50, 0xfe, 0x91, 0x3c, 0x22, 0x4d, 0xbc, 0xd8, 0xec, 0x4a, 0x66, 0xa8, 0xf0, 0x0e, 0xbb, 0x13, 0x12, 0x82, 0x38, 0x82, 0x9f, 0xa0, 0x99, 0x20, 0x9f, 0x4d, 0x3b, 0x69, 0x50, 0xeb, 0x78, 0x51, 0x6d, 0xaf, 0x09, 0xdb, 0x72, 0xb3, 0x16, 0x80, 0x61, 0xc4, 0x1b, 0x2f, 0x46, 0x0a, 0xbf, 0xda, 0x67, 0x44, 0xd2, 0xd8, 0xbf, 0xca, 0x1a, 0x50, 0x01, 0x47, 0x78, 0x05, 0x2f, 0x8a, 0x88, 0x11, 0xd0, 0xe3, 0x93, 0xd5, 0x3f, 0xe7, 0xe9, 0xc3, 0x3b, 0xe0, 0x6e, 0x63, 0xf6, 0x77, 0x1f, 0x90, 0xa7, 0x62, 0xe6, 0x33, 0x98, 0x16, 0xdd, 0x3c, 0x8a, 0xa6, 0x35, 0x43, 0x0a, 0x16, 0xb9, 0x08, 0x4d, 0x24, 0x60, 0xe8, 0x1c, 0x47, 0x21, 0x38, 0x6e, 0xd1, 0x74, 0x7c, 0x40, 0x07, 0x92, 0xc4, 0x0b, 0x07, 0x91, 0x74, 0xc2, 0x10, 0xe9, 0x50, 0xf9, 0xe7, 0x68, 0x44, 0x16, 0x99, 0x96, 0x67, 0x2b, 0xa3, 0x8b, 0x60, 0x90, 0xdc, 0x63, 0xcc, 0x8c, 0xf5, 0x29, 0xdc, 0x19, 0xe5, 0xda, 0x95, 0x9a, 0x35, 0x2a, 0xa8, 0x3c, 0x36, 0xb1, 0x47, 0xff, 0xcd, 0xeb, 0xc5, 0x01, 0xa6, 0x41, 0x79, 0x2d, 0x9e, 0x4b, 0x22, 0xa0, 0x4f, 0x37, 0x62, 0x10, 0xc5, 0x70, 0x1b, 0x8a, 0xa0, 0xd9, 0x81, 0xdf, 0xf7, 0x33, 0x4d, 0xa1, 0x88, 0x92, 0x07, 0xee, 0xcb, 0xa1, 0x23, 0x1d, 0x8c, 0xd7, 0xbb, 0x1f, 0xbb, 0xa7, 0xa8, 0xe1, 0xbc, 0xcf, 0x7d, 0x8e, 0x79, 0xf6, 0x7b, 0x60, 0x76, 0x86, 0xba, 0x23, 0x7a, 0x4b, 0x18, 0x4c, 0xac, 0xc5, 0xdf, 0xc8, 0xab, 0x98, 0xab, 0x17, 0x1a, 0x5c, 0x76, 0x06, 0x14, 0xc3, 0x69, 0xde, 0x66, 0x95, 0x5b, 0x3a, 0x03, 0xb0, 0x83, 0x9e, 0x5d, 0x4d, 0x8f, 0x4e, 0x60, 0x77, 0x2e, 0x79, 0xbe, 0x05, 0x2a, 0x2e, 0x24, 0xe2, 0x9f, 0x62, 0x93, 0x28, 0x97, 0x3f, 0x82, 0x5a, 0x1a, 0x15, 0xa6, 0x74, 0x1d, 0x38, 0x9d, 0xab, 0x48, 0x93, 0x44, 0x0e, 0xc3, 0x58, 0xb9, 0x22, 0xa1, 0x9a, 0x75, 0x95, 0x32, 0x82, 0xd4, 0x61, 0x1f, 0xc5, 0x06, 0x8f, 0x89, 0xb6, 0x17, 0xfd, 0x01, 0x27, 0xff, 0x92, 0x0f, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xbd, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x9f, 0xb4, 0x80, 0x33, 0x18, 0xed, 0x17, 0xb5, 0xc4, 0xac, 0xb0, 0xba, 0xa8, 0x13, 0xe4, 0x96, 0x6f, 0x61, 0xe8, 0xce, 0xdf, 0x72, 0xb2, 0x56, 0xaa, 0xa4, 0xe7, 0xd1, 0x0b, 0x8c, 0xa4, 0x7e, 0x94, 0x28, 0x2c, 0xba, 0x69, 0x66, 0xdc, 0x96, 0x79, 0xab, 0x7f, 0xcc, 0x41, 0xf6, 0xd7, 0x48, 0x8a, 0x15, 0x40, 0xf3, 0x4f, 0x31, 0x90, 0x1e, 0xb6, 0xfd, 0xda, 0x34, 0xe5, 0xbb, 0x69, 0x1c, 0xf4, 0x17, 0x18, 0xd0, 0x89, 0x17, 0xe6, 0x83, 0xfa, 0x3d, 0xd6, 0x28, 0x3c, 0x92, 0x2d, 0x58, 0x46, 0xcb, 0x4f, 0x4c, 0x29, 0xa5, 0xdb, 0x56, 0xfb, 0xce, 0xf9, 0x0a, 0xe3, 0x4e, 0x3d, 0x2e, 0xdc, 0x42, 0x47, 0x15, 0x3a, 0xea, 0x66, 0xc8, 0x79, 0xc3, 0xd5, 0x93, 0x8d, 0xc9, 0xa1, 0xae, 0x8c, 0xed, 0x35, 0xd6, 0xcb, 0xea, 0x15, 0x72, 0xb5, 0x54, 0xf2, 0x10, 0xbb, 0x01, 0x5e, 0x68, 0x3b, 0xdb, 0x17, 0xf3, 0x18, 0x49, 0x72, 0xbc, 0x24, 0xba, 0xc3, 0x2f, 0x30, 0xf6, 0x79, 0x7f, 0x38, 0x6a, 0x36, 0x36, 0x04, 0xdb, 0xd3, 0x17, 0xd1, 0x34, 0x81, 0x4d, 0xcf, 0x67, 0x74, 0xb3, 0x21, 0x94, 0xd9, 0xb1, 0x1d, 0x3a, 0x1c, 0x22, 0x24, 0xd2, 0xe3, 0x3b, 0xf5, 0x60, 0x97, 0xaa, 0xdf, 0xba, 0x16, 0xf8, 0x27, 0xf4, 0xcd, 0xc1, 0x3b, 0xc1, 0xe6, 0x0a, 0x6a, 0x59, 0xa7, 0xff, 0xef, 0x5d, 0xc8, 0xd3, 0x4c, 0xb4, 0xa8, 0x86, 0x00, 0x53, 0x50, 0x6b, 0x1c, 0x7b, 0xa5, 0x61, 0x20, 0xe3, 0x01, 0x1b, 0x66, 0x1a, 0x4e, 0xf4, 0x80, 0xdc, 0x46, 0xb6, 0x94, 0x77, 0x43, 0xc1, 0x37, 0xf0, 0xe9, 0x7c, 0x27, 0xae, 0x30, 0x70, 0x67, 0x84, 0x3f, 0x33, 0x1c, 0x27, 0xc9, 0xda, 0xc2, 0x7d, 0xc6, 0x5d, 0x9f, 0x7a, 0xb9, 0x71, 0xbc, 0xb6, 0x3c, 0xfe, 0x4a, 0x28, 0xd3, 0x24, 0x94, 0x43, 0x7d, 0xee, 0x84, 0xb1, 0xc5, 0xe6, 0x27, 0x54, 0xb9, 0xef, 0x0a, 0xf8, 0xdb, 0xb5, 0xa8, 0x5c, 0xb8, 0x42, 0x11, 0x12, 0x94, 0xd5, 0xa6, 0xba, 0x5e, 0x54, 0xe2, 0x6f, 0x79, 0x48, 0xd2, 0xf0, 0xd7, 0x1f, 0x23, 0x90, 0x95, 0x3e, 0x8f, 0xed, 0x2b, 0xf7, 0xe6, 0x65, 0xfe, 0x1d, 0x68, 0x4a, 0xb8, 0xef, 0x9f, 0xce, 0x74, 0x92, 0xa9, 0xb0, 0xa4, 0x83, 0x91, 0x2b, 0xa8, 0x90, 0xa3, 0x23, 0x09, 0x58, 0x7a, 0x51, 0x36, 0x6b, 0xaa, 0x06, 0x73, 0x46, 0xd2, 0x38, 0x6e, 0x2c, 0x87, 0x2c, 0x20, 0x6f, 0xf3, 0x13, 0xf3, 0x49, 0x2b, 0xc8, 0x0c, 0x1d, 0xfe, 0x0d, 0xa1, 0x20, 0x13, 0x0b, 0x5a, 0xac, 0x16, 0xac, 0x0e, 0xb1, 0x1f, 0xc9, 0x14, 0xf7, 0xbc, 0xda, 0x48, 0xd3, 0x5d, 0xf5, 0x4b, 0x3d, 0x9c, 0xc8, 0x56, 0xd8, 0x9e, 0x88, 0xbc, 0x60, 0xae, 0xe6, 0xfc, 0xaa, 0xba, 0x3d, 0xb1, 0xe1, 0x07, 0x8c, 0xc8, 0x05, 0xae, 0x2d, 0x4c, 0x1b, 0x2a, 0xec, 0xad, 0xe6, 0x2b, 0x34, 0xb2, 0x29, 0xf2, 0x19, 0x51, 0x5e, 0xb6, 0x55, 0x8e, 0xa5, 0x4d, 0x74, 0x1c, 0x5f, 0xa0, 0xc8, 0xae, 0x21, 0x2d, 0x48, 0x15, 0x04, 0x78, 0x0e, 0xd0, 0xce, 0xfd, 0x6b, 0x80, 0xcf, 0xc5, 0xa2, 0x32, 0x15, 0xfb, 0x8c, 0xa8, 0x38, 0xc3, 0xab, 0x70, 0x04, 0x04, 0xcc, 0x75, 0x40, 0x2c, 0x5b, 0x78, 0x2e, 0x1d, 0xfc, 0x71, 0xff, 0x38, 0x63, 0x1b, 0x77, 0x3b, 0x0c, 0x65, 0x8f, 0xc9, 0x21, 0xdd, 0x28, 0x40, 0x5c, 0xaa, 0xf2, 0x9e, 0x5a, 0x24, 0x7b, 0x44, 0xc0, 0xdb, 0x7c, 0x82, 0x1e, 0x1d, 0xe8, 0xb7, 0x99, 0xe2, 0x7d, 0xfa, 0x75, 0xc9, 0x74, 0x43, 0xcf, 0x95, 0x23, 0xe2, 0xe8, 0x08, 0x49, 0x5e, 0x45, 0x2d, 0xb5, 0x5a, 0x2a, 0x57, 0xf3, 0xe0, 0x01, 0xf7, 0xd8, 0x41, 0x83, 0xae, 0xac, 0xd3, 0x1d, 0xe4, 0x3b, 0x89, 0x2f, 0x2d, 0xdc, 0x2f, 0x3c, 0xd2, 0x3b, 0x9b, 0xd5, 0x0b, 0x8c, 0x68, 0xee, 0xee, 0x72, 0x7e, 0x0e, 0x97, 0x9e, 0xd6, 0x8b, 0x57, 0xaa, 0xd8, 0x61, 0xb1, 0x10, 0xf1, 0xc1, 0x5c, 0x29, 0x72, 0x48, 0xc0, 0xaf, 0x8c, 0x58, 0x1b, 0x3d, 0xad, 0xe5, 0xe8, 0x10, 0x90, 0x35, 0x0f, 0xa6, 0xfe, 0x7b, 0xc9, 0xbf, 0x2f, 0x3d, 0x60, 0xc5, 0x1f, 0xc2, 0x27, 0x14, 0xff, 0x14, 0xd3, 0x10, 0x1d, 0xa0, 0x96, 0xa6, 0xb4, 0x5f, 0x93, 0xd5, 0xc5, 0xd9, 0x5f, 0xea, 0x99, 0xac, 0x4b, 0xa7, 0x89, 0x09, 0x59, 0x94, 0xb2, 0x77, 0x37, 0xa9, 0x85, 0xc6, 0xa5, 0xb9, 0x2c, 0x1d, 0xe8, 0x7e, 0x16, 0xa1, 0xb5, 0xbe, 0xfa, 0x12, 0x54, 0x32, 0xb9, 0x55, 0xf8, 0x0b, 0x77, 0x89, 0xf6, 0xc5, 0xd7, 0x8f, 0x8f, 0x0b, 0xa1, 0x3c, 0x08, 0x08, 0x90, 0xe9, 0xdd, 0x97, 0xc4, 0xb0, 0xdd, 0x23, 0x55, 0x69, 0x8a, 0x80, 0x8e, 0x7f, 0x7c, 0xe1, 0x38, 0xe7, 0xff, 0xe1, 0xfd, 0x79, 0x55, 0x11, 0xbf, 0x1d, 0x94, 0x87, 0xa1, 0x38, 0x66, 0x82, 0xc6, 0x9d, 0x4d, 0x46, 0x3b, 0x64, 0x99, 0x28, 0x0c, 0x2f, 0xe1, 0x63, 0x2b, 0xdb, 0x2f, 0x08, 0xcb, 0x42, 0xa8, 0xd7, 0xcd, 0x48, 0x58, 0x64, 0xa0, 0xa4, 0x08, 0x98, 0x55, 0x9c, 0x4f, 0xcf, 0x1a, 0x83, 0xf6, 0xfa, 0x59, 0x61, 0x7c, 0x34, 0x8c, 0xb6, 0x20, 0x2e, 0xea, 0x5d, 0x3a, 0x0c, 0xc0, 0x33, 0xbd, 0xf5, 0x64, 0x26, 0x67, 0xba, 0xc5, 0x6e, 0xa5, 0x09, 0xe4, 0x95, 0x3e, 0x9b, 0x8e, 0x52, 0x0b, 0xdc, 0x31, 0x06, 0xe4, 0xc5, 0x61, 0x89, 0xa1, 0x89, 0x16, 0x47, 0x23, 0xa9, 0x51, 0x2d, 0x93, 0xd5, 0x34, 0xbd, 0x77, 0x3d, 0x02, 0x7b, 0x86, 0x42, 0xe4, 0xfc, 0xab, 0xa7, 0x20, 0xa7, 0x3e, 0xc3, 0x89, 0x35, 0xf5, 0xd8, 0x18, 0x1c, 0xa6, 0x03, 0x39, 0x6d, 0xdd, 0x82, 0xfa, 0x35, 0xaa, 0x9b, 0xfa, 0x05, 0xc5, 0x56, 0x7c, 0x09, 0xd7, 0xa9, 0x7d, 0xbf, 0xf1, 0x3d, 0xed, 0xec, 0xa3, 0x3b, 0x4c, 0x28, 0x23, 0x96, 0x8a, 0x76, 0xf5, 0x29, 0xda, 0x72, 0x01, 0x7b, 0xb7, 0x20, 0x11, 0x1d, 0xd0, 0xea, 0xdc, 0x8d, 0x96, 0x6e, 0x2f, 0x53, 0x9e, 0xb5, 0x4c, 0x8e, 0x45, 0xbf, 0xf0, 0x0d, 0x88, 0xad, 0x0b, 0x4c, 0xd3, 0x9d, 0x90, 0xef, 0x53, 0x65, 0x8d, 0xc0, 0xee, 0x3e, 0x7d, 0x8b, 0xbd, 0xc8, 0x15, 0xdf, 0x51, 0x83, 0xbe, 0x61, 0x76, 0xac, 0xfc, 0x34, 0x07, 0xc0, 0x26, 0xd1, 0x6a, 0xe4, 0xd0, 0x20, 0xfb, 0x15, 0x07, 0x5d, 0xea, 0x40, 0xca, 0x4e, 0xff, 0x8d, 0xf7, 0x44, 0xd5, 0x6f, 0x1e, 0x26, 0x1d, 0x87, 0xce, 0xdc, 0xbe, 0xc9, 0x04, 0x3f, 0x45, 0xd3, 0x36, 0x7d, 0x04, 0xa2, 0x46, 0xcd, 0xb1, 0x62, 0x82, 0x07, 0xc3, 0x76, 0x63, 0xc6, 0x2b, 0x83, 0x5a, 0xe3, 0x27, 0xb6, 0xad, 0x67, 0x3d, 0x82, 0x6f, 0x5c, 0xae, 0x09, 0xcf, 0xca, 0xc2, 0x48, 0xc8, 0x35, 0xe1, 0x2a, 0x4a, 0xf2, 0xbd, 0xa0, 0x4e, 0xe1, 0xf9, 0xb3, 0x23, 0x1f, 0x1f, 0x01, 0xd7, 0x64, 0x20, 0x1c, 0xdb, 0xfe, 0x92, 0xd2, 0x99, 0x8c, 0x26, 0x1f, 0x8e, 0x40, 0x77, 0x03, 0x72, 0x78, 0x18, 0x6f, 0xe2, 0x0a, 0x77, 0x4c, 0x55, 0x6e, 0x98, 0x08, 0x20, 0xe9, 0x44, 0x79, 0x9c, 0xbc, 0x33, 0x72, 0x6e, 0x69, 0x84, 0x6e, 0xb7, 0x2f, 0x63, 0x29, 0xe0, 0x6a, 0xd2, 0x66, 0xd3, 0x19, 0x7f, 0x03, 0x39, 0x4d, 0xee, 0x66, 0xcb, 0xca, 0xcb, 0x8f, 0xb3, 0xf8, 0x98, 0x6d, 0x37, 0xca, 0xf3, 0x5b, 0xc6, 0x5a, 0xe8, 0x6f, 0xe4, 0x7a, 0x8d, 0xb9, 0xe2, 0x28, 0x25, 0x56, 0xd1, 0x56, 0xc9, 0xb3, 0x8e, 0x12, 0xb9, 0x55, 0x9b, 0x7b, 0x19, 0xc8, 0xf5, 0x7a, 0x9c, 0x53, 0xac, 0xe9, 0xac, 0xe1, 0xce, 0xb9, 0x29, 0xca, 0x2d, 0x4e, 0xfc, 0x81, 0xfb, 0xfe, 0x0d, 0x7c, 0xec, 0x0c, 0x83, 0x6f, 0x4d, 0xba, 0xf9, 0xde, 0xc9, 0xa0, 0xf1, 0x37, 0xbc, 0x12, 0xeb, 0xcb, 0xa7, 0x95, 0x47, 0x5c, 0x78, 0x3a, 0xdd, 0x4f, 0xfa, 0xdf, 0x2b, 0x36, 0x82, 0xf8, 0x7d, 0x97, 0x8e, 0x74, 0x73, 0xc3, 0x8e, 0x43, 0xcf, 0x63, 0x40, 0xc0, 0x01, 0x99, 0x9a, 0xe8, 0x11, 0xef, 0x69, 0xd2, 0x95, 0x30, 0xee, 0x5d, 0x52, 0x94, 0x04, 0xf5, 0x53, 0xbc, 0x8f, 0x46, 0xde, 0xbd, 0x31, 0x35, 0x18, 0x74, 0x67, 0x16, 0x9e, 0x67, 0xd3, 0x47, 0x41, 0x6e, 0xb5, 0x79, 0x06, 0x6d, 0x73, 0xd1, 0xdb, 0x4a, 0x58, 0x7c, 0x1e, 0xb7, 0xb0, 0xab, 0x76, 0x81, 0x5e, 0xee, 0x3d, 0x38, 0x2c, 0xb1, 0x06, 0x25, 0xbc, 0xd6, 0x69, 0xa6, 0x41, 0xea, 0x7d, 0xfa, 0x89, 0x27, 0xd6, 0x75, 0x55, 0x08, 0x4a, 0x93, 0xe1, 0x2a, 0x2b, 0xac, 0x10, 0x86, 0xf6, 0xc8, 0x7a, 0xa4, 0xc4, 0x2c, 0x49, 0xc1, 0x80, 0x94, 0x3d, 0xc5, 0xb9, 0x9b, 0x7b, 0xee, 0xfe, 0x1d, 0x79, 0x81, 0x5a, 0x69, 0xa3, 0x02, 0x5b, 0x26, 0xbd, 0xeb, 0x28, 0xa0, 0x3e, 0x6c, 0xc7, 0xe3, 0x23, 0xb9, 0x8c, 0xd4, 0x3c, 0x61, 0x66, 0xf6, 0xb7, 0xf4, 0x3b, 0x60, 0x1f, 0xb8, 0x66, 0xcb, 0x97, 0xd8, 0x58, 0x26, 0x2f, 0x2e, 0xb2, 0xfb, 0xe0, 0xf5, 0x3e, 0xd2, 0x49, 0x87, 0xc0, 0xb6, 0xa4, 0x84, 0x38, 0xa7, 0xc6, 0x14, 0xf3, 0x98, 0x8a, 0x01, 0x70, 0xd8, 0x7c, 0x14, 0x6b, 0x5a, 0x56, 0x06, 0x39, 0xa5, 0x4c, 0x2d, 0x00, 0x91, 0x6a, 0x6b, 0x92, 0x56, 0x21, 0x18, 0x59, 0xe6, 0x2d, 0xb9, 0x78, 0xdd, 0x8e, 0xe6, 0x07, 0xfe, 0x81, 0x7f, 0x0e, 0x7c, 0xf4, 0x1b, 0x78, 0x78, 0x86, 0xbb, 0x9d, 0xb1, 0x43, 0xad, 0x78, 0x04, 0x00, 0x88, 0x8e, 0xcd, 0x7b, 0x33, 0xdc, 0x1c, 0x8b, 0x7b, 0x7e, 0x33, 0x1f, 0x03, 0xdc, 0xc7, 0x84, 0xd9, 0x9e, 0xdd, 0x41, 0x8d, 0xe1, 0xe4, 0x4d, 0x04, 0xc1, 0xd5, 0x51, 0x08, 0x5f, 0x3e, 0xf8, 0x55, 0x8c, 0x9b, 0xae, 0xe4, 0x5a, 0x6a, 0x3f, 0x42, 0xb9, 0x01, 0x6b, 0x83, 0xb7, 0x3e, 0x82, 0x0a, 0xde, 0xfd, 0x67, 0x9a, 0x76, 0xfe, 0x16, 0x38, 0x0f, 0xc3, 0x6e, 0x24, 0xe5, 0xbf, 0x25, 0xfb, 0x41, 0x00, 0x0b, 0xfb, 0xd2, 0x5d, 0x37, 0x39, 0xaa, 0xb3, 0xb8, 0x8b, 0xee, 0x74, 0xb3, 0xfb, 0x0e, 0xe3, 0xed, 0xc2, 0x00, 0x7f, 0xd9, 0xd9, 0xd1, 0x2c, 0x9e, 0x30, 0xda, 0x7a, 0x71, 0x0d, 0x28, 0x38, 0x14, 0xe7, 0x64, 0xae, 0x88, 0x28, 0x15, 0x24, 0x0f, 0x46, 0x78, 0x23, 0xdd, 0x98, 0x4a, 0xdb, 0x39, 0xd6, 0x2d, 0x2c, 0x6a, 0x34, 0xd5, 0xe7, 0xce, 0x81, 0xdb, 0x0f, 0x77, 0x5f, 0xa1, 0xcc, 0x50, 0x1f, 0xe3, 0x2a, 0x3e, 0x1b, 0xf5, 0xb8, 0x72, 0x8a, 0x73, 0xf8, 0x80, 0x64, 0x41, 0xd2, 0x35, 0xa8, 0x59, 0xa3, 0x4f, 0x46, 0xd4, 0xac, 0x9f, 0x72, 0xe2, 0x62, 0x65, 0x04, 0xfb, 0x7e, 0x4a, 0x21, 0x33, 0xcf, 0x91, 0x2e, 0x5d, 0xa9, 0xfa, 0xee, 0xb8, 0x0e, 0xe2, 0xf0, 0x57, 0x2c, 0xa9, 0x45, 0xb7, 0x6d, 0xc3, 0x96, 0x6d, 0x52, 0xae, 0x69, 0xd8, 0x1a, 0x15, 0x54, 0x3c, 0x6b, 0xa3, 0x1e, 0x51, 0x24, 0x25, 0x83, 0xb6, 0x89, 0x98, 0xc4, 0xc7, 0xa3, 0x6e, 0x50, 0xda, 0x3d, 0xaf, 0xd5, 0x32, 0x7c, 0xb8, 0xd1, 0xf4, 0x08, 0x15, 0x7f, 0x95, 0xfe, 0x8d, 0x37, 0x25, 0xe9, 0x8b, 0x0c, 0x2a, 0xd4, 0x03, 0x57, 0xec, 0xee, 0x53, 0x38, 0x29, 0xe6, 0x60, 0xa7, 0x82, 0x8b, 0xa6, 0x33, 0xee, 0xb7, 0xbc, 0x0c, 0x30, 0x5e, 0xc1, 0x92, 0x4b, 0x21, 0xa6, 0xcb, 0xf7, 0xa6, 0x77, 0xc2, 0xac, 0xc6, 0x0a, 0x1d, 0x05, 0xae, 0xee, 0xe9, 0x7d, 0x91, 0xe6, 0xce, 0xed, 0x3d, 0xcc, 0xf5, 0x67, 0xa4, 0x08, 0x49, 0xf0, 0xd8, 0x28, 0x4c, 0xb4, 0x57, 0x36, 0x79, 0xc4, 0xdf, 0xc4, 0x40, 0x10, 0xc5, 0x96, 0xb5, 0xc1, 0x43, 0xc9, 0x14, 0x3d, 0x86, 0x65, 0x5d, 0xc4, 0xb4, 0xbf, 0x69, 0x10, 0x76, 0xb5, 0xe5, 0x98, 0xe1, 0xe7, 0x19, 0x47, 0xcf, 0x9d, 0x77, 0x0e, 0xcb, 0xd1, 0x20, 0x1d, 0xee, 0x2e, 0x6e, 0x5b, 0xa5, 0xd3, 0x59, 0x28, 0x3b, 0x1b, 0xa3, 0xf4, 0xcc, 0x55, 0xfa, 0x27, 0x9e, 0xf8, 0x00, 0xe8, 0x3f, 0xa0, 0xa5, 0x14, 0x9b, 0x31, 0x13, 0x6c, 0xa5, 0xfb, 0x05, 0x04, 0xa1, 0xba, 0x1c, 0xf4, 0xfd, 0xf4, 0x30, 0x16, 0x55, 0x61, 0x4a, 0x0f, 0xda, 0x7f, 0xa1, 0x1d, 0xf6, 0xa9, 0x2d, 0x4c, 0x2d, 0xec, 0x1e, 0xac, 0xba, 0x31, 0xae, 0x28, 0xaa, 0xc9, 0xb0, 0xc8, 0x39, 0x8c, 0x4f, 0xa1, 0xb8, 0xb4, 0x92, 0x4b, 0xe7, 0xf7, 0x6c, 0xf0, 0x07, 0x5b, 0xd1, 0x70, 0x40, 0xef, 0x67, 0x7b, 0x9e, 0xde, 0x54, 0x0a, 0xb9, 0x04, 0xfd, 0xb3, 0xc4, 0xdb, 0x90, 0x9b, 0xab, 0xa9, 0xc5, 0xdd, 0xaf, 0x9b, 0x9f, 0x46, 0x1f, 0x9c, 0xe8, 0x01, 0xa3, 0x92, 0xe7, 0x3b, 0xea, 0x31, 0xef, 0xba, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xbd, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x00, 0x00, 0x00, 0x00, 0x58, 0xd0, 0xfa, 0x1b, 0xf4, 0x76, 0x32, 0x3a, 0xc8, 0xd3, 0x5d, 0x75, 0x65, 0x33, 0x3a, 0x8d, 0x35, 0xc3, 0x0b, 0x5c, 0xba, 0xb8, 0xb1, 0xe5, 0x97, 0x00, 0x66, 0x7f, 0x98, 0xd3, 0xa0, 0x41, 0xb7, 0x4b, 0xd5, 0xe6, 0x54, 0x49, 0x8d, 0x21, 0x29, 0xd8, 0xbf, 0x41, 0x56, 0x2f, 0xb5, 0xe6, 0x78, 0x3c, 0x91, 0xdf, 0x78, 0x9f, 0xf3, 0x87, 0xcc, 0xce, 0x27, 0x87, 0xa3, 0x9f, 0x32, 0x62, 0x70, 0x5a, 0x9a, 0x50, 0x4e, 0xeb, 0x74, 0x4f, 0xae, 0x35, 0x19, 0x7f, 0xf8, 0x49, 0xdc, 0xbc, 0x95, 0x7d, 0x7e, 0x21, 0xdb, 0x69, 0x11, 0x4f, 0xb1, 0xd5, 0x12, 0x7b, 0x69, 0xe0, 0x60, 0x8a, 0xeb, 0x82, 0x6b, 0x92, 0xbd, 0xa4, 0x6f, 0x78, 0xb9, 0x93, 0xdd, 0x7e, 0x6c, 0x63, 0xfb, 0x91, 0xfc, 0xb1, 0x65, 0xf7, 0xbd, 0xd5, 0x7c, 0xcc, 0xb0, 0xb3, 0x95, 0x96, 0xd6, 0x90, 0x4b, 0x39, 0xd0, 0x8a, 0xf0, 0xfb, 0xae, 0x00, 0x20, 0x07, 0x81, 0x79, 0xc6, 0x03, 0x23, 0x11, 0x68, 0x97, 0x3a, 0x3a, 0x8c, 0x84, 0xa4, 0x97, 0xcf, 0x71, 0x2b, 0x2a, 0x67, 0x5b, 0x19, 0x40, 0x3e, 0xf3, 0x72, 0x68, 0x8b, 0x0f, 0x7f, 0xd7, 0x72, 0xe0, 0x61, 0x13, 0x8a, 0xfd, 0x81, 0xbb, 0x88, 0x32, 0x83, 0x70, 0xb2, 0x21, 0xf7, 0xf2, 0xf9, 0x62, 0xb6, 0x95, 0xd7, 0x86, 0xec, 0x0e, 0xdc, 0x45, 0x2b, 0x82, 0x03, 0x7e, 0x96, 0x64, 0xb8, 0x60, 0xa2, 0x34, 0xa9, 0x43, 0x1b, 0xb4, 0x1e, 0xbe, 0x50, 0x8c, 0x47, 0x15, 0x29, 0xc1, 0xa1, 0x0d, 0x0f, 0x11, 0xde, 0xa1, 0xbb, 0x79, 0x60, 0x4b, 0x3b, 0xc1, 0xf5, 0xd1, 0x32, 0x21, 0x02, 0xf3, 0x94, 0x1f, 0xa1, 0xbb, 0x10, 0x05, 0x3e, 0xcf, 0x37, 0xef, 0x16, 0x63, 0x0f, 0x5d, 0x89, 0x2b, 0x1c, 0xe9, 0x95, 0x48, 0xab, 0x1f, 0xa3, 0xfb, 0x12, 0xe6, 0xd3, 0xd8, 0xa7, 0x48, 0xa4, 0xd0, 0xc9, 0x91, 0xe4, 0xfb, 0x1a, 0xe7, 0xf2, 0x2c, 0xaf, 0x0e, 0xa4, 0x9d, 0x2e, 0xac, 0x0f, 0x6c, 0x33, 0xdb, 0xdd, 0x8b, 0x14, 0x1c, 0x98, 0x06, 0x93, 0x1f, 0x27, 0x7a, 0x35, 0xea, 0xcb, 0x89, 0x05, 0x76, 0x09, 0x23, 0x5a, 0x1a, 0x75, 0x8c, 0x1d, 0xea, 0x10, 0x91, 0xcc, 0x56, 0x29, 0x7d, 0x71, 0x38, 0x29, 0x44, 0x68, 0x8a, 0xdb, 0xf1, 0x24, 0x36, 0xb1, 0x85, 0x78, 0x6e, 0x46, 0x1e, 0xb7, 0x92, 0x99, 0x1d, 0xf3, 0x02, 0x03, 0x80, 0x84, 0x67, 0x23, 0x7c, 0xe1, 0xe0, 0x3b, 0xbf, 0x21, 0x26, 0x4f, 0xad, 0xfb, 0x1c, 0xc1, 0xc7, 0x68, 0x2b, 0xde, 0x47, 0xf6, 0x41, 0xd8, 0xc6, 0xd6, 0x39, 0x41, 0x58, 0xce, 0x60, 0x1c, 0xb6, 0x49, 0x41, 0xb8, 0x66, 0x41, 0x02, 0x0e, 0xed, 0x62, 0x44, 0x8e, 0x19, 0x2f, 0xe9, 0x19, 0x85, 0x9c, 0x17, 0xc9, 0xdf, 0xa3, 0xf5, 0xc8, 0x45, 0x7c, 0x05, 0x7f, 0x74, 0xfd, 0x77, 0x7b, 0xab, 0xc4, 0xfc, 0x36, 0xb9, 0xa6, 0xbc, 0x70, 0xbc, 0x0d, 0x88, 0x32, 0xfa, 0xeb, 0x9c, 0x98, 0x7d, 0x50, 0x09, 0x80, 0xfa, 0xfc, 0xa1, 0x16, 0xf1, 0x84, 0x4e, 0xf9, 0xca, 0x5f, 0xdc, 0x18, 0x6b, 0x2b, 0xce, 0xf6, 0xfe, 0x37, 0xa9, 0x6b, 0xf2, 0x6d, 0xa3, 0xa2, 0x37, 0xfa, 0x8d, 0xd8, 0x7d, 0xa6, 0x82, 0xe0, 0xb8, 0x2e, 0x1e, 0x3c, 0xa3, 0x9d, 0x8f, 0x5d, 0xe3, 0x45, 0xec, 0x80, 0x3d, 0x9d, 0x61, 0x43, 0xbd, 0x93, 0xca, 0x27, 0xfd, 0x6d, 0x29, 0x2d, 0xff, 0x7a, 0xe2, 0x13, 0xc1, 0xc1, 0x16, 0x62, 0x80, 0x7c, 0xa1, 0x38, 0x2b, 0x41, 0x2e, 0x3c, 0x4f, 0xf8, 0xc0, 0xd9, 0xd8, 0x96, 0x17, 0xbb, 0x42, 0x89, 0x74, 0x8c, 0x4b, 0x4c, 0x4b, 0xeb, 0x58, 0xfc, 0x12, 0x97, 0x1b, 0xc0, 0x98, 0xbe, 0x82, 0x33, 0x40, 0x92, 0x7b, 0xb2, 0x87, 0xf8, 0xca, 0x9e, 0xa8, 0x8a, 0x44, 0x49, 0xe5, 0x9d, 0x59, 0x37, 0x8d, 0xe9, 0x30, 0xaf, 0x46, 0x4f, 0xb0, 0xe3, 0xc7, 0xff, 0x89, 0x81, 0x33, 0xa7, 0x9e, 0xe2, 0x73, 0x1d, 0x97, 0x4d, 0x54, 0x62, 0xf9, 0xf6, 0x5d, 0x27, 0x56, 0xef, 0x72, 0xd5, 0x30, 0xfc, 0x5e, 0x9a, 0xc8, 0xb9, 0x32, 0x7b, 0xbd, 0x2f, 0x54, 0x2d, 0xa5, 0x40, 0x9f, 0xf8, 0xe4, 0xc8, 0x7a, 0x11, 0x6c, 0xdf, 0x39, 0xcb, 0xc1, 0x9d, 0xef, 0x40, 0x13, 0xac, 0x26, 0xb8, 0xa4, 0x21, 0xf8, 0x1d, 0x66, 0x46, 0xa7, 0xee, 0x2f, 0xa2, 0x4a, 0xf3, 0x9f, 0x0d, 0x63, 0x87, 0x6d, 0xe0, 0x4f, 0x41, 0x62, 0xad, 0xbb, 0x6a, 0x27, 0x70, 0x10, 0xd3, 0x8a, 0x84, 0x12, 0xb5, 0x17, 0xef, 0x72, 0x64, 0x87, 0xdd, 0xda, 0xca, 0x21, 0x52, 0x17, 0x83, 0x53, 0x70, 0x41, 0x7d, 0x93, 0x17, 0x9d, 0x30, 0x8a, 0x99, 0x79, 0xd1, 0xf2, 0x6a, 0x2d, 0x04, 0x65, 0x97, 0x07, 0x37, 0xc0, 0x7a, 0x16, 0xbf, 0x2a, 0x31, 0x52, 0xe2, 0x8c, 0x91, 0x70, 0xf5, 0x1c, 0xe1, 0xa3, 0xe4, 0x8d, 0x48, 0xbb, 0x41, 0xf1, 0x2f, 0x2a, 0x46, 0x9f, 0xa1, 0x20, 0x0b, 0x9e, 0xe9, 0xc5, 0x14, 0x37, 0x0e, 0x4f, 0x99, 0x3d, 0x3e, 0x6d, 0x33, 0x47, 0x02, 0x5e, 0xae, 0x29, 0x61, 0x16, 0x46, 0xe2, 0x37, 0x62, 0x44, 0xcc, 0x3d, 0xfe, 0x5e, 0xcf, 0xb6, 0x92, 0x09, 0x6a, 0x55, 0xa5, 0x20, 0x48, 0xd1, 0x37, 0x80, 0xa8, 0xf5, 0x37, 0x17, 0x36, 0x99, 0x1b, 0x49, 0x30, 0x99, 0x11, 0x6b, 0x29, 0x6b, 0x16, 0x5b, 0x63, 0x81, 0x74, 0xbc, 0xcb, 0xc8, 0x37, 0xff, 0xff, 0x61, 0x85, 0x3a, 0x50, 0xb7, 0xaf, 0x88, 0x38, 0x2f, 0xc1, 0x0b, 0xa6, 0xa8, 0xcc, 0x27, 0x19, 0x2e, 0xb0, 0x0c, 0xfb, 0x8e, 0xfa, 0xa4, 0x4f, 0xb2, 0x1c, 0x16, 0x8c, 0xc6, 0xae, 0x7b, 0x4e, 0xf4, 0x19, 0x27, 0x7e, 0xdb, 0xa6, 0x4b, 0xb0, 0x93, 0xa8, 0x46, 0x1c, 0x5b, 0xcc, 0x89, 0x37, 0x64, 0x04, 0x3c, 0x96, 0x74, 0xba, 0x60, 0x55, 0x74, 0x33, 0xbf, 0xbc, 0xad, 0x07, 0x35, 0xef, 0xbc, 0x6e, 0x49, 0x94, 0x47, 0xc3, 0xdb, 0x70, 0x53, 0x80, 0x08, 0xd1, 0x7d, 0x0e, 0xbc, 0x2c, 0x3c, 0xb1, 0x5d, 0x77, 0xae, 0x76, 0xb5, 0x5c, 0x5f, 0xf3, 0x3a, 0x5a, 0xfc, 0xad, 0x2d, 0x7b, 0x8e, 0xf5, 0x33, 0x60, 0x04, 0x6b, 0x9c, 0xec, 0x89, 0x5c, 0xa6, 0x5c, 0xb7, 0xfa, 0x2d, 0x09, 0xa7, 0x96, 0x7f, 0x84, 0xc6, 0x26, 0xae, 0x75, 0x46, 0x39, 0x2b, 0x4b, 0xd5, 0x26, 0x0c, 0x4e, 0x57, 0x30, 0xf8, 0x57, 0x3b, 0xb7, 0x2b, 0xfa, 0x7b, 0x45, 0x4e, 0xb8, 0xf0, 0x05, 0x76, 0x9d, 0xc1, 0xbe, 0x64, 0x59, 0xce, 0xc7, 0xbb, 0x55, 0xd2, 0x05, 0x15, 0x34, 0xc8, 0x52, 0x31, 0xdf, 0x43, 0x92, 0xe3, 0x3a, 0x09, 0x50, 0xe4, 0x18, 0x43, 0x0c, 0x42, 0xc0, 0x56, 0x80, 0x5c, 0xeb, 0xc0, 0x58, 0xec, 0x3e, 0x58, 0xc7, 0x0a, 0xd2, 0xb8, 0x06, 0x6a, 0xeb, 0xec, 0x30, 0xf8, 0x0a, 0xa5, 0xde, 0xa4, 0x4d, 0x87, 0xde, 0xc7, 0x36, 0x41, 0xb0, 0xea, 0xad, 0x5e, 0x00, 0x2a, 0x73, 0x9d, 0x92, 0x34, 0xae, 0x96, 0xfb, 0xb5, 0xb8, 0x05, 0xa6, 0x62, 0x33, 0xb6, 0xb5, 0xad, 0xa2, 0x0a, 0x06, 0x69, 0x5d, 0xcb, 0x47, 0xe8, 0x6a, 0xbc, 0x5f, 0x6c, 0xc8, 0xea, 0x60, 0x53, 0x9e, 0x42, 0x80, 0x37, 0x45, 0xc7, 0x3e, 0xfd, 0xa8, 0xb2, 0x3c, 0x4e, 0x77, 0xd0, 0x25, 0xb4, 0x5a, 0x24, 0xce, 0x55, 0xc9, 0xa7, 0x88, 0x83, 0x71, 0x8e, 0x67, 0xda, 0x3b, 0xd3, 0x4a, 0x45, 0xae, 0x57, 0xbe, 0x9b, 0x64, 0xf8, 0x98, 0x11, 0xbe, 0x17, 0xa9, 0xac, 0xbe, 0x79, 0x98, 0x38, 0xc7, 0x5d, 0x19, 0x9e, 0x96, 0x41, 0xa4, 0x5d, 0xc7, 0x97, 0xa6, 0x0b, 0x4d, 0xdf, 0x0a, 0xf3, 0x85, 0xb9, 0x57, 0x34, 0x4d, 0xd3, 0xb3, 0xdd, 0x69, 0x6f, 0x42, 0x5c, 0xf7, 0xb7, 0x36, 0xff, 0x1e, 0x2c, 0x7f, 0xe9, 0x6b, 0xb8, 0x44, 0x5e, 0xbe, 0xd3, 0xed, 0x1f, 0xed, 0x1d, 0x81, 0xf1, 0x5b, 0xb4, 0x10, 0xc9, 0x7f, 0x03, 0x7a, 0xaa, 0x03, 0x7f, 0x0e, 0x4e, 0xba, 0x8a, 0x6e, 0x76, 0x60, 0xd7, 0xb7, 0x9a, 0xc2, 0xbf, 0x72, 0x54, 0x39, 0x23, 0x67, 0x55, 0x31, 0x27, 0xf7, 0xb1, 0x96, 0xd9, 0x6e, 0x55, 0xeb, 0x4f, 0xd9, 0xca, 0xe6, 0x12, 0xa9, 0x12, 0xd8, 0x12, 0xba, 0x71, 0x5d, 0xff, 0x69, 0xf3, 0xc2, 0x54, 0x1e, 0xd6, 0xb8, 0x7f, 0x72, 0x0c, 0x7c, 0xa5, 0xaf, 0x74, 0xff, 0xcb, 0x35, 0x77, 0x33, 0x14, 0xc3, 0xdc, 0x4e, 0xe8, 0xd8, 0xf0, 0x95, 0x05, 0xef, 0x8c, 0xf1, 0xf3, 0x5f, 0x5a, 0xed, 0xbd, 0x1d, 0x3e, 0x8c, 0xf9, 0x51, 0xad, 0xef, 0x97, 0x57, 0xaf, 0x82, 0x3f, 0x96, 0x96, 0x4b, 0x8e, 0xe2, 0x3c, 0x80, 0x71, 0x24, 0xd7, 0x68, 0x6d, 0xda, 0x0c, 0x1f, 0xa8, 0x0c, 0x5c, 0x6c, 0x7d, 0x83, 0xab, 0x6f, 0x9f, 0x23, 0xee, 0xbb, 0xc1, 0xca, 0x4c, 0xb4, 0x04, 0xcc, 0xb6, 0x9b, 0x5b, 0x9f, 0x61, 0x57, 0xf8, 0x25, 0x10, 0xa9, 0x18, 0x9d, 0x2f, 0x77, 0xdd, 0xc4, 0xe7, 0xa7, 0x7e, 0x0b, 0x97, 0x28, 0xc3, 0x31, 0xd4, 0xd9, 0xf9, 0x18, 0x07, 0x43, 0x19, 0xdd, 0x81, 0x08, 0x43, 0x73, 0xe4, 0x69, 0x0e, 0x91, 0x0a, 0xf1, 0x88, 0xbb, 0x9b, 0xa2, 0x90, 0x9d, 0xd1, 0x95, 0xc8, 0x0f, 0xdf, 0x70, 0x36, 0x60, 0xcb, 0xb4, 0x2e, 0xca, 0x02, 0x95, 0x52, 0x64, 0x64, 0x62, 0x60, 0x3d, 0xb1, 0xaa, 0x1f, 0xbc, 0xd5, 0x56, 0x6c, 0x42, 0x92, 0xdd, 0xfc, 0xb6, 0x4c, 0x91, 0x6c, 0x33, 0x04, 0xad, 0x74, 0x89, 0x46, 0x5a, 0xef, 0xa7, 0xe8, 0x30, 0xd8, 0x63, 0x9d, 0x4f, 0xe5, 0x8e, 0xa3, 0x14, 0x31, 0x65, 0x4b, 0x37, 0xde, 0x88, 0x29, 0xa6, 0x3b, 0x6a, 0x87, 0x2b, 0x1c, 0xa3, 0x0e, 0xef, 0x6f, 0x2f, 0xa3, 0x6d, 0xad, 0x32, 0x5e, 0x69, 0xed, 0x00, 0x1b, 0x8b, 0x90, 0xc3, 0xfa, 0x52, 0xfe, 0xea, 0xb5, 0x9f, 0xc4, 0xc5, 0x46, 0x31, 0x61, 0xf7, 0xa1, 0x33, 0xf0, 0x7c, 0xbf, 0xb4, 0xa4, 0x58, 0x16, 0xd8, 0x88, 0xba, 0xef, 0xc1, 0x9b, 0x6d, 0x3c, 0x6d, 0x1a, 0x48, 0x3c, 0x4f, 0x0b, 0x2b, 0x5e, 0x67, 0xb6, 0x62, 0x17, 0x50, 0xe4, 0x69, 0xfb, 0x0c, 0x5c, 0xe7, 0x3f, 0xfa, 0x4f, 0x68, 0x6b, 0x27, 0x52, 0x7e, 0xdc, 0xa1, 0xf3, 0x8e, 0xeb, 0x67, 0x06, 0xe0, 0xee, 0xe8, 0x13, 0xab, 0xa1, 0x6c, 0xe1, 0x3b, 0x19, 0x2f, 0xed, 0xa8, 0xe0, 0x57, 0x4f, 0x28, 0xd6, 0x67, 0xd2, 0x33, 0x7d, 0xb5, 0x54, 0x41, 0x79, 0x5a, 0x8e, 0xbd, 0x74, 0xeb, 0x50, 0x01, 0xf2, 0x59, 0x0b, 0xa0, 0x84, 0xbd, 0x9c, 0xcb, 0x18, 0xf0, 0x89, 0x17, 0xef, 0x54, 0x33, 0x7b, 0x08, 0xda, 0x59, 0xaa, 0x60, 0x83, 0xa2, 0x5c, 0xdc, 0x3d, 0xae, 0x38, 0xf8, 0x2f, 0x73, 0xfb, 0x25, 0x4b, 0x97, 0xee, 0xfd, 0xc6, 0x50, 0x4a, 0x50, 0xc8, 0x40, 0x0e, 0x49, 0xd1, 0x29, 0x0a, 0xc9, 0xf3, 0x87, 0x6d, 0x0b, 0x0f, 0x90, 0x7b, 0x77, 0xeb, 0x1f, 0x31, 0x23, 0x9b, 0x7d, 0xfd, 0xa8, 0x83, 0xe8, 0x93, 0x01, 0x29, 0x52, 0x10, 0xb0, 0x9e, 0x74, 0x52, 0x87, 0x92, 0x96, 0x1a, 0xf5, 0xf2, 0x99, 0xf0, 0x96, 0xe8, 0x08, 0xd2, 0xcc, 0x54, 0x5a, 0xe1, 0xd8, 0xf6, 0x42, 0xc2, 0xb6, 0x20, 0x7e, 0x41, 0x33, 0xb5, 0xdf, 0xde, 0x20, 0x0a, 0x94, 0x8b, 0x7f, 0xec, 0x23, 0x29, 0x77, 0xfb, 0xda, 0xc9, 0x53, 0x28, 0x5e, 0x45, 0x0a, 0xd6, 0xa3, 0x13, 0x45, 0x17, 0x24, 0x22, 0xa3, 0x7e, 0x2a, 0xf2, 0x78, 0xce, 0x9b, 0x78, 0xc9, 0xe5, 0x22, 0xad, 0x6b, 0xcd, 0xcb, 0xc6, 0x7b, 0x41, 0xce, 0x38, 0x38, 0x46, 0x6a, 0xe0, 0xff, 0xc7, 0x42, 0x06, 0x1a, 0x38, 0xe0, 0xa1, 0x92, 0xab, 0x4b, 0x79, 0xf2, 0x22, 0x1b, 0x86, 0xeb, 0x9c, 0x2c, 0xcd, 0x75, 0x3d, 0xc3, 0xe8, 0x6c, 0x2f, 0xb0, 0x51, 0x70, 0x9f, 0x5f, 0x08, 0x9c, 0xb1, 0x15, 0x12, 0x75, 0x60, 0xfc, 0x15, 0x15, 0x95, 0x90, 0x55, 0x42, 0x3a, 0xc4, 0x2a, 0x25, 0x98, 0x89, 0x74, 0xbe, 0x5c, 0x4b, 0xd7, 0xcb, 0xa8, 0xed, 0x36, 0xe3, 0x82, 0x41, 0xd3, 0x7e, 0x57, 0xb7, 0x06, 0x36, 0x6e, 0xcf, 0xbb, 0x04, 0xbc, 0xa0, 0xfa, 0x61, 0xcb, 0x29, 0x8a, 0x49, 0xbb, 0x70, 0xc1, 0x9e, 0xc7, 0xea, 0xe3, 0xd5, 0xfb, 0x8c, 0xff, 0xee, 0xc4, 0x7e, 0x0f, 0xe0, 0x7a, 0xd9, 0xc3, 0x81, 0x2d, 0x97, 0x4a, 0x1f, 0x6a, 0xd2, 0x1f, 0xa3, 0x36, 0x05, 0x84, 0xda, 0xa8, 0x24, 0x8b, 0x73, 0x64, 0x18, 0xa2, 0x05, 0x5a, 0x6c, 0x87, 0xfc, 0x94, 0x4a, 0x41, 0x6e, 0x13, 0xbd, 0x5c, 0x4b, 0xa6, 0x17, 0x08, 0xaa, 0x8d, 0x99, 0xe1, 0xb2, 0x2b, 0x77, 0x37, 0x0f, 0xd0, 0x72, 0x24 }; +constexpr AccessUnit ATRACX_SIZE_MISMATCH_EXPECTED_AU = { 0x15f90, 0x159b2, false, 0, {}, { 0x71, 0x4c, 0x99, 0x14, 0x4a, 0x0d, 0x1d, 0xe6, 0x05, 0x5c, 0x64, 0xa7, 0xa0, 0xd6, 0x4b, 0x56, 0x87, 0xe4, 0x5d, 0x61 } }; + +const std::vector AC3_SIZE_MISMATCH_STREAM = { 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xbd, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x30, 0x00, 0x00, 0x00, 0x0b, 0x77, 0x31, 0xfd, 0x1c, 0x4b, 0x30, 0xa2, 0xe6, 0x40, 0x35, 0x38, 0xe1, 0xea, 0xc9, 0xcb, 0x6d, 0x24, 0x95, 0x8e, 0x57, 0xe6, 0xfc, 0x72, 0xf4, 0x35, 0xca, 0x6d, 0x13, 0x5a, 0x24, 0xa4, 0x03, 0x6e, 0x1d, 0x22, 0x04, 0xc8, 0xdc, 0xa5, 0x99, 0x12, 0x6d, 0xc6, 0x69, 0x0e, 0x5e, 0x59, 0x09, 0x64, 0x9d, 0xa7, 0x5e, 0xc2, 0x7f, 0xe8, 0x0f, 0xe9, 0x09, 0xc5, 0x5f, 0xe7, 0x52, 0x84, 0x3a, 0xdf, 0xf7, 0x73, 0x53, 0x36, 0x46, 0xc9, 0x02, 0xf5, 0x33, 0xc9, 0x73, 0x46, 0xe2, 0x68, 0xbd, 0xf5, 0x51, 0x86, 0xd9, 0x16, 0x54, 0x38, 0x35, 0xf5, 0xf6, 0xe5, 0x0b, 0xa4, 0xe3, 0xcb, 0xea, 0x2d, 0x55, 0x22, 0xcb, 0xf8, 0xbc, 0x8f, 0x53, 0xa4, 0xf9, 0xaa, 0x85, 0x4f, 0x7e, 0xab, 0xec, 0x25, 0xca, 0x27, 0x9c, 0xc6, 0x99, 0xbf, 0xb0, 0x68, 0x5d, 0x57, 0xb8, 0x60, 0x0a, 0xa6, 0x95, 0xeb, 0xdf, 0x64, 0x11, 0x73, 0x18, 0x6e, 0x64, 0x19, 0xd3, 0x7b, 0x52, 0xc9, 0x05, 0x18, 0x39, 0x20, 0xb2, 0x07, 0xf0, 0x87, 0xe7, 0xff, 0xa3, 0x3a, 0x4b, 0xa4, 0xf2, 0xce, 0xcf, 0xf5, 0xcc, 0x0f, 0xdf, 0x67, 0x31, 0x8c, 0x77, 0x99, 0x81, 0x28, 0xa9, 0x58, 0xd3, 0x55, 0x8e, 0xdc, 0xb6, 0xae, 0x9f, 0x1f, 0x3b, 0xb8, 0x45, 0x97, 0xfb, 0x7b, 0xc1, 0x27, 0x4e, 0x65, 0xcc, 0xc7, 0xa5, 0xea, 0xd2, 0x0e, 0xbf, 0x68, 0x9a, 0xb5, 0x4e, 0xee, 0x2e, 0xc7, 0x18, 0x5a, 0x89, 0x3d, 0x54, 0x0d, 0x62, 0x6d, 0x68, 0x71, 0x91, 0xc4, 0x05, 0x4e, 0xd5, 0x11, 0x8e, 0x16, 0xe3, 0x54, 0xd2, 0xa4, 0x30, 0xf4, 0xde, 0xfc, 0xdc, 0x85, 0xf0, 0xf4, 0x0a, 0xb4, 0xd5, 0xfb, 0xc7, 0xff, 0x65, 0xfe, 0x1c, 0x4f, 0xda, 0xfc, 0x38, 0x77, 0xc4, 0xfc, 0xfe, 0xe4, 0x78, 0x25, 0xe6, 0xd4, 0x0c, 0x43, 0x51, 0xea, 0x9d, 0x46, 0xb2, 0xd6, 0x9e, 0xc2, 0x82, 0x5f, 0xbb, 0x0e, 0xfb, 0xb6, 0xf4, 0x7a, 0x54, 0x92, 0x08, 0x8d, 0xcf, 0xae, 0x37, 0x63, 0x18, 0xc1, 0xf3, 0xa9, 0xa2, 0x8f, 0x7c, 0xd1, 0x06, 0xfe, 0xfc, 0x4d, 0xdc, 0xb1, 0x6b, 0x42, 0xa1, 0xaf, 0xc6, 0x4a, 0xd4, 0x3b, 0x4a, 0xad, 0xb4, 0x16, 0x9b, 0x39, 0x85, 0x29, 0x97, 0xd0, 0x94, 0xc6, 0x48, 0x6c, 0x2f, 0xa9, 0x19, 0x48, 0x62, 0x8d, 0x3b, 0x8b, 0xec, 0x0b, 0xa7, 0xca, 0xd0, 0x11, 0x93, 0xe3, 0xb8, 0x50, 0x93, 0x16, 0x42, 0xe9, 0x4f, 0x8c, 0x43, 0xfe, 0x6b, 0xcc, 0x17, 0x06, 0x18, 0x3b, 0xd3, 0xd1, 0xb0, 0xb4, 0xa5, 0x4c, 0xb3, 0xaa, 0x04, 0xbf, 0xc3, 0x08, 0xe1, 0x7d, 0xae, 0xa4, 0x5f, 0x95, 0xf3, 0x17, 0x62, 0x9c, 0x64, 0x5f, 0x26, 0x4f, 0x06, 0xed, 0x4e, 0x79, 0x18, 0x03, 0x4b, 0xb8, 0x61, 0xbb, 0x5a, 0xae, 0x51, 0xc3, 0x32, 0x67, 0xe5, 0xc2, 0x5a, 0x03, 0x2e, 0xee, 0xf8, 0x07, 0x4b, 0x06, 0x47, 0xe2, 0x6b, 0x0e, 0x08, 0xa7, 0xab, 0x1e, 0xa0, 0xf4, 0x85, 0x87, 0xb9, 0xec, 0xf7, 0x53, 0x8b, 0xbf, 0xf3, 0x4e, 0xb6, 0x5f, 0x00, 0x32, 0x5c, 0x07, 0xce, 0xc6, 0x9a, 0x24, 0xb7, 0x9e, 0x31, 0x20, 0xb5, 0x54, 0x79, 0x0e, 0x53, 0xca, 0x95, 0x09, 0xc9, 0x12, 0x8a, 0xb5, 0xed, 0xab, 0xc8, 0xb4, 0xdb, 0x76, 0x13, 0xb5, 0x10, 0x0a, 0x45, 0x78, 0xd4, 0xc5, 0x81, 0x3a, 0x11, 0x99, 0x14, 0x44, 0x43, 0x19, 0x6f, 0x16, 0x77, 0xd7, 0x14, 0xeb, 0x59, 0xb3, 0x55, 0xae, 0x69, 0xc9, 0x72, 0xd7, 0xb6, 0x50, 0x2a, 0xc2, 0xe0, 0x27, 0x72, 0xc7, 0xcf, 0xc5, 0x42, 0x32, 0x38, 0x92, 0xf3, 0x1a, 0x46, 0x90, 0x90, 0xa5, 0x5d, 0xf6, 0x46, 0xf7, 0x3e, 0x0c, 0x1a, 0x6e, 0x71, 0x2b, 0x30, 0xe0, 0x46, 0x6b, 0x9a, 0xc6, 0x2b, 0xb2, 0x89, 0xdb, 0x52, 0xe9, 0x5a, 0x58, 0x9b, 0x50, 0xb5, 0x75, 0xe1, 0xfa, 0x66, 0xf3, 0x69, 0x1e, 0x78, 0x90, 0x8e, 0x4c, 0x0c, 0xd4, 0xe7, 0x9d, 0xbc, 0x02, 0x8b, 0x2a, 0xfb, 0xca, 0x6d, 0x68, 0x28, 0x1e, 0x47, 0x08, 0x24, 0xe3, 0xce, 0x05, 0x60, 0x0e, 0xe1, 0xf7, 0x17, 0x13, 0xbd, 0xd3, 0x97, 0x78, 0x9b, 0xd5, 0x5a, 0x61, 0x4a, 0x16, 0x41, 0xb9, 0x37, 0xa4, 0x92, 0xe5, 0xc5, 0x99, 0x73, 0xf6, 0x14, 0xcd, 0xfd, 0x7a, 0x9e, 0x6c, 0x39, 0x00, 0x9a, 0xb1, 0x77, 0x7e, 0x78, 0x11, 0xef, 0x63, 0xec, 0xcc, 0x47, 0x71, 0xed, 0xd5, 0x64, 0xa5, 0xe6, 0xc7, 0xf9, 0x6c, 0xf0, 0x6d, 0x7b, 0x3a, 0x78, 0x4e, 0x8e, 0x8e, 0x9c, 0xbd, 0x69, 0x62, 0xdc, 0xec, 0xd1, 0xe0, 0xe1, 0x8f, 0x7f, 0x4e, 0x57, 0x7a, 0x7e, 0xa6, 0x25, 0x7d, 0xfa, 0xee, 0x6a, 0x7c, 0x67, 0x79, 0x80, 0x83, 0xb7, 0x7e, 0xb0, 0x4b, 0xba, 0x2f, 0x97, 0xba, 0x90, 0xae, 0x1a, 0xe5, 0x28, 0xea, 0xf6, 0x18, 0xe8, 0xc7, 0xfb, 0xb8, 0xa9, 0xa0, 0x0f, 0x15, 0x34, 0x14, 0x92, 0xfe, 0x84, 0x9b, 0x76, 0x83, 0xba, 0xe4, 0x07, 0xd6, 0x4e, 0x7f, 0xa7, 0xfc, 0x42, 0xd2, 0x50, 0x37, 0x96, 0x25, 0xe3, 0x2e, 0xfd, 0x4c, 0xdc, 0xbe, 0x6b, 0x09, 0x49, 0xa5, 0x46, 0xa9, 0xdd, 0x96, 0x70, 0x5c, 0x30, 0x6d, 0xbf, 0x5a, 0x3c, 0xda, 0x39, 0x56, 0xe4, 0x42, 0x73, 0x99, 0xcf, 0x1c, 0x0b, 0x2d, 0x22, 0x8d, 0x6e, 0xd0, 0x1e, 0xb9, 0x6c, 0x90, 0xc8, 0xfd, 0xe2, 0xe8, 0xdc, 0x81, 0x14, 0x34, 0xdd, 0x59, 0xdf, 0xce, 0xc0, 0x05, 0x43, 0xb6, 0x49, 0xbd, 0x15, 0xd0, 0xe9, 0xea, 0x3b, 0x46, 0xe3, 0x88, 0xe8, 0xa2, 0x0a, 0xf4, 0x28, 0xf1, 0xc5, 0xa4, 0xdd, 0x8b, 0x06, 0xe2, 0x84, 0x93, 0xa2, 0xc1, 0x87, 0xdd, 0x3f, 0x49, 0x4b, 0x88, 0x58, 0x2c, 0x93, 0x3c, 0x89, 0xb9, 0x30, 0xda, 0x8b, 0x22, 0x23, 0x35, 0x57, 0x3e, 0x2c, 0xe9, 0x09, 0x2c, 0xd0, 0x3a, 0x12, 0xe7, 0x9b, 0xb0, 0xd5, 0x3c, 0x12, 0xc3, 0x7c, 0x41, 0x51, 0x5b, 0x58, 0x3e, 0xf0, 0x0c, 0x90, 0x26, 0xa5, 0xab, 0xe9, 0x50, 0x6b, 0x50, 0x89, 0x0d, 0x66, 0xc0, 0x82, 0x5e, 0x49, 0xd2, 0x55, 0xea, 0xbc, 0x8f, 0x98, 0x21, 0x91, 0xad, 0xed, 0x23, 0x58, 0xda, 0xa9, 0x7f, 0xa6, 0xd5, 0xca, 0x63, 0x37, 0x72, 0x95, 0x6e, 0x76, 0xc7, 0x0c, 0x6e, 0xe1, 0xa9, 0x5e, 0x91, 0x66, 0xab, 0xa3, 0x63, 0xa1, 0xc0, 0xd9, 0x6a, 0x28, 0x79, 0xdd, 0xf1, 0xb1, 0x8a, 0x8f, 0x3c, 0xee, 0x62, 0x22, 0x73, 0x72, 0xb4, 0xfa, 0x2d, 0x1a, 0x2e, 0x72, 0x97, 0xb0, 0x8f, 0x78, 0x8c, 0x8e, 0xd8, 0xa7, 0xfb, 0xb4, 0xfa, 0x78, 0xee, 0x16, 0x6c, 0x8c, 0x7e, 0x64, 0xc3, 0xe6, 0xef, 0x3b, 0xbb, 0x95, 0xbb, 0xc4, 0x92, 0xaf, 0x9d, 0x0a, 0xca, 0xd5, 0x29, 0xf8, 0x51, 0x2f, 0xbf, 0x53, 0xc3, 0x6f, 0x0d, 0x90, 0x7e, 0x82, 0x05, 0x01, 0xfb, 0xee, 0x15, 0x8b, 0x04, 0xcc, 0xae, 0xb6, 0x7c, 0x57, 0x58, 0xba, 0x6a, 0xfc, 0x17, 0x40, 0x3b, 0x1c, 0x08, 0xed, 0xb9, 0xdf, 0x70, 0x4f, 0x3b, 0x02, 0xbf, 0x2d, 0x5f, 0x06, 0x74, 0x34, 0x45, 0x41, 0x4f, 0xef, 0x40, 0x79, 0x02, 0x57, 0x0d, 0x74, 0xd7, 0x2a, 0x03, 0x92, 0xa1, 0xa8, 0x03, 0xc2, 0x4e, 0x34, 0x82, 0xf5, 0x70, 0x6d, 0x00, 0x6b, 0x3a, 0xc3, 0x87, 0x73, 0x74, 0xec, 0xa4, 0xf6, 0xd7, 0xda, 0x8f, 0x4d, 0xef, 0x73, 0x79, 0x3e, 0x1b, 0x45, 0xcb, 0x27, 0x10, 0x5b, 0xc8, 0xe7, 0xd4, 0x88, 0x7d, 0x45, 0xdd, 0x12, 0x26, 0xf1, 0x66, 0x7e, 0xfd, 0xa9, 0xb7, 0x71, 0xd8, 0xbd, 0x43, 0x69, 0x51, 0xe4, 0x37, 0xcd, 0x27, 0x21, 0x9a, 0x73, 0xef, 0xf0, 0x7f, 0x76, 0xbf, 0xfe, 0x15, 0xbd, 0x68, 0x6e, 0x6e, 0xbc, 0xf8, 0xad, 0x76, 0xd5, 0x19, 0xd0, 0x01, 0x0c, 0xa1, 0xe1, 0x9e, 0xdd, 0x61, 0x37, 0xe8, 0x80, 0x08, 0xcb, 0x21, 0x4a, 0xf9, 0x2c, 0x32, 0xf4, 0x30, 0x9e, 0x51, 0x2a, 0x7f, 0xda, 0x74, 0x72, 0x23, 0x7f, 0x33, 0xa7, 0xe8, 0xa6, 0x18, 0xe5, 0x3c, 0xa6, 0x11, 0x1c, 0x43, 0x1f, 0x4f, 0xb0, 0xb6, 0x15, 0x8b, 0x89, 0x6e, 0xb8, 0xc3, 0x97, 0xe3, 0xe5, 0x65, 0x32, 0x0a, 0xe4, 0xae, 0x28, 0x4d, 0x76, 0x33, 0x66, 0x8a, 0x58, 0x36, 0xce, 0xa3, 0xab, 0x36, 0x3f, 0x42, 0x21, 0xa8, 0xa9, 0x8f, 0xe5, 0x6b, 0x75, 0x36, 0x4e, 0x60, 0x8f, 0x06, 0x1d, 0x19, 0x9d, 0x99, 0xba, 0x34, 0xe7, 0xe9, 0x6c, 0xd7, 0x90, 0xc7, 0x3d, 0x12, 0x9b, 0xc8, 0x6b, 0x11, 0xb5, 0x46, 0xf0, 0x1b, 0x1d, 0xdb, 0xe3, 0xc0, 0x3d, 0x2f, 0x85, 0xa9, 0x64, 0xe2, 0x74, 0xa7, 0x2d, 0xe1, 0x81, 0x6b, 0x96, 0xa2, 0x81, 0xba, 0xd4, 0x5c, 0x95, 0xc8, 0xa3, 0xc1, 0x95, 0x65, 0x5d, 0x91, 0xca, 0xa6, 0x9e, 0x1d, 0x1b, 0x41, 0x3a, 0x9a, 0x68, 0x9f, 0x51, 0x59, 0x1a, 0x81, 0xe0, 0x46, 0x02, 0x46, 0xfd, 0x11, 0xe5, 0x48, 0x86, 0xde, 0x7d, 0xed, 0x3c, 0xb1, 0x0d, 0x81, 0x1d, 0x13, 0x47, 0x0c, 0xda, 0xd8, 0xe0, 0xac, 0x42, 0xb8, 0x0b, 0x29, 0x73, 0x36, 0xe8, 0xaf, 0x95, 0xf3, 0xce, 0xdf, 0xe1, 0xd7, 0x62, 0xe3, 0xac, 0x53, 0x8d, 0x7b, 0x63, 0x13, 0x3b, 0xdc, 0xd3, 0x9a, 0xc9, 0x3f, 0x71, 0x2d, 0x3e, 0xef, 0x48, 0x82, 0x15, 0xe6, 0xb7, 0xbb, 0x56, 0xd6, 0x7d, 0xda, 0xb3, 0x97, 0x39, 0x96, 0xc5, 0xa6, 0x66, 0x8b, 0xb1, 0x94, 0x93, 0x40, 0xa5, 0xc2, 0x52, 0x34, 0x04, 0xce, 0xeb, 0xf4, 0x93, 0x37, 0xa5, 0xa6, 0xd0, 0xef, 0x38, 0x74, 0x19, 0x82, 0x7d, 0x77, 0x47, 0x8c, 0xac, 0x33, 0x82, 0x2b, 0x23, 0x71, 0x28, 0xb0, 0xa5, 0x93, 0xc2, 0x30, 0x5b, 0x6e, 0x30, 0xa8, 0xcc, 0x42, 0x59, 0x10, 0xb9, 0x91, 0x1f, 0xe0, 0x2c, 0x5d, 0x54, 0x1e, 0xef, 0x03, 0x3d, 0x76, 0xb4, 0x6e, 0xc3, 0x0a, 0x6a, 0x35, 0xac, 0xda, 0x96, 0xfa, 0xb5, 0x33, 0x48, 0xe1, 0x2f, 0x2d, 0x7d, 0xec, 0x53, 0x6e, 0xfe, 0xa5, 0x50, 0x2f, 0x9b, 0x00, 0x22, 0xed, 0x02, 0x90, 0xe1, 0xa1, 0xb8, 0x5d, 0x86, 0x28, 0xac, 0x45, 0xee, 0xfa, 0x84, 0x72, 0x30, 0xe8, 0xe7, 0x21, 0x65, 0xe6, 0xcc, 0x3c, 0x99, 0x35, 0x97, 0x25, 0xd8, 0x86, 0x49, 0x14, 0xde, 0x2e, 0x5e, 0x1c, 0xf7, 0x8f, 0x2c, 0xd1, 0x5d, 0x83, 0x9a, 0x43, 0xf8, 0x6c, 0x93, 0xdd, 0x8a, 0x51, 0xab, 0xd4, 0x3b, 0x28, 0xa8, 0x02, 0x40, 0x94, 0x67, 0x23, 0x83, 0x7b, 0xff, 0xc2, 0xcd, 0x2a, 0x06, 0x05, 0x9e, 0xae, 0x0f, 0x5f, 0xfa, 0x80, 0x2a, 0xa9, 0x25, 0xab, 0x32, 0x38, 0x4a, 0x19, 0x2b, 0x51, 0x57, 0xb1, 0x15, 0xba, 0x1b, 0x1d, 0x0b, 0xee, 0xfb, 0xe5, 0xe1, 0x31, 0x10, 0x63, 0x36, 0x56, 0x0a, 0xd9, 0x13, 0xfe, 0x85, 0x0a, 0xf0, 0x8e, 0x2b, 0xc0, 0x9e, 0xf8, 0x90, 0xc5, 0x9d, 0xf3, 0x8c, 0x2f, 0xb8, 0x3f, 0x67, 0x46, 0x8c, 0xec, 0xab, 0xac, 0x29, 0xcf, 0x5d, 0x6b, 0x26, 0x94, 0x9a, 0x90, 0x65, 0x6a, 0x7f, 0x76, 0xad, 0xc2, 0x88, 0x31, 0xcc, 0x10, 0xaa, 0xf2, 0x26, 0xc8, 0x0c, 0x30, 0xf0, 0x9d, 0xcd, 0xf0, 0x9c, 0xfe, 0xb3, 0x34, 0x4f, 0x7f, 0x9d, 0x8d, 0xdb, 0x46, 0x04, 0x2c, 0x8a, 0xa3, 0x1a, 0xab, 0x9a, 0xa6, 0x7f, 0xad, 0xec, 0x05, 0x76, 0x43, 0xd5, 0x42, 0x94, 0x2c, 0xea, 0x4e, 0x2a, 0x89, 0x11, 0x4a, 0x0b, 0x3c, 0x80, 0xde, 0x86, 0x61, 0x90, 0x9d, 0x2a, 0x44, 0xe7, 0xcf, 0x8c, 0xae, 0xce, 0xf0, 0xa8, 0xeb, 0xaf, 0x8d, 0xd9, 0xd0, 0x09, 0xb8, 0xce, 0x28, 0x0e, 0x28, 0xe0, 0xeb, 0x7b, 0x7c, 0x44, 0xc4, 0x91, 0x02, 0x34, 0xdc, 0x27, 0xbf, 0xd4, 0x75, 0x7a, 0xa5, 0x4f, 0x6b, 0x70, 0xf5, 0x96, 0x80, 0x43, 0xe0, 0xb3, 0x93, 0x06, 0xc0, 0xdc, 0x29, 0x14, 0x3e, 0x80, 0x82, 0x95, 0x03, 0xf8, 0xe5, 0xbf, 0x95, 0xe9, 0x9c, 0xdc, 0xbf, 0xc6, 0xac, 0xb6, 0x0f, 0xb7, 0x95, 0xc9, 0x8e, 0x15, 0xc7, 0x9c, 0x1f, 0xd4, 0xae, 0xfe, 0xa1, 0xe8, 0x19, 0x72, 0xb4, 0xd1, 0x14, 0x49, 0xe3, 0x53, 0x9a, 0x3a, 0x30, 0x45, 0x2c, 0xa0, 0xf0, 0x21, 0xc8, 0xee, 0x61, 0x8e, 0x2a, 0xa3, 0x1b, 0xfd, 0xd7, 0xf4, 0x04, 0xd6, 0xa6, 0xa4, 0xb7, 0x1e, 0x13, 0x5c, 0x5a, 0x0e, 0xf8, 0x7b, 0xb6, 0x10, 0x07, 0x35, 0xc4, 0x1b, 0x50, 0xa9, 0xd9, 0x9b, 0xdb, 0xa8, 0xf0, 0x67, 0xa8, 0x3e, 0x50, 0x71, 0x32, 0xfb, 0x37, 0xfe, 0x51, 0xff, 0x18, 0x57, 0x3a, 0xce, 0x7f, 0x50, 0x5c, 0xb2, 0xd6, 0xd8, 0xc1, 0xb4, 0x71, 0xe6, 0x49, 0xf1, 0x39, 0xad, 0x9b, 0xea, 0x2e, 0x8f, 0x68, 0x6d, 0x05, 0x34, 0x30, 0x9d, 0x72, 0x7c, 0x50, 0x98, 0xcc, 0x55, 0x18, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xbd, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x30, 0x00, 0x00, 0x00, 0x1d, 0x0b, 0x3f, 0xee, 0x73, 0x16, 0x75, 0x44, 0x00, 0x0f, 0x64, 0xd1, 0x17, 0xe7, 0x11, 0xdc, 0x36, 0x45, 0xe8, 0x21, 0x49, 0x4b, 0x34, 0x34, 0xc7, 0x5a, 0x5d, 0x6e, 0xbd, 0x78, 0xae, 0xcd, 0x9d, 0xe4, 0xe3, 0xfc, 0x3c, 0x3c, 0x75, 0x39, 0x2e, 0xb3, 0x7b, 0xea, 0x8f, 0xd8, 0x26, 0xca, 0x15, 0x60, 0xd2, 0x25, 0x61, 0xf9, 0x0b, 0x6a, 0x6b, 0x98, 0xc3, 0x6b, 0x8c, 0xeb, 0x17, 0xa5, 0x44, 0x7a, 0xe0, 0x82, 0xc5, 0xc8, 0xc2, 0xb5, 0xdd, 0x62, 0x10, 0xce, 0x4c, 0xa8, 0x1f, 0x5d, 0xe1, 0x84, 0xdd, 0xa4, 0x45, 0xdf, 0x0c, 0xb1, 0xb8, 0x93, 0x2b, 0x4d, 0x72, 0x4d, 0x1c, 0x4b, 0xbe, 0x9c, 0x89, 0xfa, 0xdf, 0xb4, 0x10, 0x9b, 0x67, 0x40, 0xa2, 0xaf, 0x44, 0xd2, 0x3f, 0xe1, 0x8d, 0xbb, 0xa0, 0x3f, 0x04, 0xf5, 0xd2, 0x29, 0x7d, 0x2e, 0xfa, 0x10, 0x0f, 0x1d, 0x94, 0xa1, 0x69, 0x0f, 0x42, 0x69, 0x21, 0xb0, 0xf3, 0x7a, 0x0a, 0xb3, 0xee, 0xc6, 0x31, 0x48, 0xb8, 0xda, 0xb7, 0x1a, 0xcf, 0xdb, 0x7f, 0x77, 0x5e, 0x10, 0xa3, 0x7b, 0xfa, 0x4e, 0x51, 0x9d, 0x20, 0x92, 0x11, 0x15, 0x2e, 0xed, 0x22, 0x77, 0x17, 0x3d, 0xf9, 0x98, 0x3f, 0x86, 0x9f, 0x96, 0x62, 0xbf, 0xdf, 0x1c, 0xb9, 0x46, 0xfa, 0xa0, 0xf5, 0x6c, 0x08, 0x9f, 0x61, 0x9a, 0x79, 0x6b, 0xc2, 0x4b, 0x47, 0xfc, 0x8d, 0xfd, 0x49, 0x10, 0x63, 0x32, 0x5b, 0x78, 0xd7, 0x36, 0x75, 0x42, 0x86, 0xba, 0xf4, 0x23, 0x12, 0xe1, 0xa2, 0x4d, 0x8f, 0x33, 0x0d, 0xb6, 0xe6, 0x87, 0x93, 0x8b, 0xdd, 0x01, 0x60, 0x80, 0xb3, 0xe9, 0xa5, 0x8f, 0xd4, 0x91, 0x5d, 0x8f, 0xd5, 0x52, 0x75, 0x11, 0xae, 0xb1, 0xd1, 0x3b, 0x18, 0x01, 0x6b, 0x83, 0xba, 0xa9, 0x9d, 0xa5, 0x8d, 0x4d, 0xe9, 0x7c, 0x11, 0x19, 0x45, 0x30, 0xb7, 0xbb, 0xd2, 0x07, 0x60, 0x92, 0x54, 0x2f, 0xb4, 0xe3, 0xa1, 0xb2, 0xa6, 0xf9, 0x14, 0xb5, 0xc4, 0x30, 0x7a, 0x4d, 0x27, 0x1c, 0x2f, 0xfc, 0xbf, 0x34, 0xa6, 0xa8, 0xf4, 0x78, 0x0f, 0x16, 0x27, 0xeb, 0xac, 0xd7, 0x0f, 0x6a, 0xac, 0xf4, 0x4a, 0x73, 0xff, 0x30, 0x2b, 0xeb, 0x6a, 0x92, 0xd3, 0x09, 0xc4, 0xcd, 0x8a, 0x74, 0x3c, 0x6d, 0x61, 0x18, 0xd2, 0xcb, 0x61, 0xfb, 0x0c, 0x61, 0x6d, 0xb2, 0xe9, 0x1e, 0xfb, 0x8b, 0x15, 0xc3, 0x84, 0xdd, 0x7b, 0x34, 0xd7, 0x81, 0x99, 0xae, 0x1f, 0xce, 0xc3, 0x61, 0x95, 0x27, 0x5d, 0x25, 0xb2, 0x41, 0x7f, 0x9e, 0x21, 0xc7, 0xb9, 0x56, 0x6b, 0x41, 0xcd, 0x19, 0xef, 0xaa, 0x85, 0x14, 0x62, 0x53, 0xde, 0x13, 0x52, 0x8d, 0x25, 0x4b, 0xf8, 0xad, 0x8d, 0x09, 0xfb, 0x86, 0x30, 0xcf, 0xb5, 0xb9, 0xc8, 0x4e, 0x2b, 0x45, 0x74, 0x03, 0x87, 0xde, 0x51, 0x28, 0x65, 0x20, 0xfc, 0xf1, 0x27, 0x73, 0x7a, 0xfb, 0xff, 0xa6, 0x2f, 0x82, 0xb1, 0xe1, 0xca, 0xb7, 0x92, 0x60, 0x4e, 0xfd, 0xf6, 0x4f, 0x48, 0x4e, 0xfe, 0xd8, 0x80, 0xaf, 0xc7, 0xb2, 0xc4, 0xa1, 0x82, 0x86, 0x7d, 0x4b, 0x1e, 0x3c, 0xac, 0x76, 0xc5, 0x9b, 0x9b, 0x46, 0x5f, 0xdc, 0x67, 0xde, 0xa1, 0x04, 0x2a, 0x1e, 0x6e, 0x7f, 0xf8, 0x92, 0x60, 0x4d, 0xa4, 0x09, 0x1b, 0xeb, 0x38, 0x70, 0x5a, 0xd5, 0xa0, 0x61, 0xae, 0xf7, 0x7b, 0xcd, 0xa6, 0xe8, 0x75, 0x81, 0xb4, 0x11, 0x8b, 0xa0, 0x1e, 0x3a, 0xeb, 0x3a, 0xa8, 0x57, 0xcb, 0x61, 0xa2, 0x7a, 0x59, 0x91, 0xc1, 0x4e, 0x1a, 0x17, 0x22, 0x68, 0xd9, 0x9e, 0xa1, 0x82, 0xb4, 0xf9, 0xd4, 0x22, 0x32, 0xc5, 0x2f, 0x5f, 0xd5, 0xee, 0x73, 0xef, 0x81, 0xf1, 0x86, 0x3d, 0x73, 0xc2, 0xd0, 0x39, 0x2f, 0xe8, 0x1c, 0xb4, 0xbf, 0x28, 0xdb, 0xe6, 0xc0, 0xd2, 0xff, 0x03, 0xdb, 0xa2, 0xe6, 0x68, 0x2e, 0xfa, 0x67, 0xd4, 0x21, 0x25, 0xa6, 0xce, 0x5c, 0x97, 0xb8, 0x7d, 0x5b, 0x3d, 0x68, 0x2a, 0x35, 0x47, 0xf8, 0x7d, 0x26, 0x6f, 0x1d, 0x8a, 0x34, 0x6a, 0x3f, 0x0c, 0x58, 0x93, 0xa2, 0x4b, 0x8b, 0xa2, 0xd7, 0x4f, 0x14, 0x8b, 0xac, 0x4a, 0x0e, 0xbc, 0xee, 0x97, 0x14, 0xb7, 0x43, 0x41, 0xee, 0xda, 0xb3, 0xbf, 0x30, 0x1d, 0xba, 0xdf, 0x44, 0x50, 0x17, 0x80, 0x9b, 0x63, 0x6a, 0xf5, 0x3b, 0x9c, 0x34, 0x67, 0x8d, 0x99, 0x89, 0x61, 0x41, 0xf4, 0x6a, 0x0f, 0x5e, 0x4a, 0x0a, 0x29, 0x0f, 0x35, 0x5c, 0xa1, 0x17, 0xae, 0x6e, 0xdd, 0x78, 0x0a, 0xbc, 0xfd, 0x96, 0x5c, 0x4f, 0x89, 0xdc, 0x33, 0x59, 0x38, 0xfb, 0x29, 0xd5, 0xcc, 0xa7, 0x3c, 0x3c, 0xeb, 0xfc, 0xc8, 0x11, 0xfc, 0xbe, 0xe1, 0x61, 0x97, 0xad, 0x12, 0x98, 0xed, 0xc5, 0x45, 0x6f, 0xbc, 0x49, 0xd8, 0x45, 0x32, 0xe4, 0x2a, 0xa5, 0x4d, 0x86, 0xae, 0xb4, 0xfd, 0x4a, 0xf5, 0xa0, 0x0d, 0x01, 0x61, 0x52, 0x8c, 0x43, 0x6f, 0x8a, 0xb6, 0x43, 0xd3, 0x0c, 0x53, 0x2b, 0xf1, 0x66, 0xb5, 0x3c, 0xc8, 0xde, 0xe7, 0x93, 0x08, 0x61, 0x74, 0xb4, 0x4e, 0x42, 0xfb, 0x37, 0x65, 0xa6, 0x30, 0x43, 0x59, 0x26, 0x7a, 0x9d, 0x22, 0x36, 0x1a, 0xee, 0x3f, 0x77, 0x79, 0xc6, 0xcd, 0xb6, 0xd3, 0x2c, 0x57, 0xea, 0xad, 0x14, 0x57, 0x77, 0x60, 0xae, 0x05, 0xee, 0x61, 0xa3, 0xad, 0x9c, 0x85, 0xe2, 0xe5, 0xf7, 0x6a, 0x8f, 0xf2, 0x8b, 0xed, 0xde, 0xb8, 0x2a, 0xbe, 0xaa, 0x67, 0x7f, 0xf9, 0x2a, 0x40, 0xc9, 0x8c, 0x19, 0x8d, 0x35, 0x7d, 0x15, 0x39, 0x64, 0x92, 0x02, 0x0d, 0x93, 0x48, 0x9f, 0x4a, 0xda, 0x91, 0xc7, 0x5b, 0x51, 0xba, 0xf0, 0x2e, 0x0a, 0xc0, 0xa4, 0x37, 0xd7, 0x66, 0x03, 0x43, 0xc7, 0x03, 0x40, 0x8b, 0xd1, 0x90, 0x0b, 0x96, 0x84, 0x5d, 0x25, 0x64, 0xda, 0x8c, 0xbf, 0x4d, 0x3e, 0x21, 0x2a, 0x53, 0xef, 0x33, 0xd1, 0xb5, 0xe2, 0x39, 0xbf, 0x91, 0xbf, 0x53, 0xd7, 0xef, 0xcf, 0x5d, 0xd9, 0xd7, 0x28, 0x5f, 0x8c, 0xde, 0x3e, 0x9e, 0x74, 0x64, 0x39, 0xb5, 0x3f, 0xd6, 0xaa, 0x76, 0xe8, 0x0d, 0x0c, 0xc2, 0x96, 0x74, 0x09, 0xc6, 0xc4, 0x4e, 0x15, 0x9b, 0x7b, 0x27, 0xb5, 0xcd, 0x8c, 0x12, 0x49, 0xc2, 0x3c, 0xbb, 0x40, 0x04, 0x0f, 0x02, 0x85, 0xe7, 0x48, 0x7b, 0xb8, 0xac, 0x4c, 0xf0, 0x25, 0x9a, 0xd1, 0x97, 0x41, 0x71, 0xb6, 0x53, 0xd5, 0xe7, 0xfe, 0x23, 0x97, 0x91, 0xff, 0x98, 0x7a, 0x3c, 0xfb, 0x34, 0x25, 0xef, 0x21, 0xe9, 0x46, 0x3d, 0x18, 0x84, 0x20, 0xab, 0x85, 0x1d, 0x4e, 0x0c, 0x80, 0x19, 0xf2, 0x88, 0xb5, 0xae, 0x10, 0x8f, 0x6e, 0xaf, 0x52, 0xe4, 0x42, 0x4c, 0xa5, 0xe3, 0x62, 0x73, 0x87, 0xa6, 0x46, 0x83, 0xbc, 0xba, 0x42, 0x9f, 0x9f, 0xd3, 0x04, 0xc0, 0x09, 0x21, 0xfe, 0x1d, 0x42, 0xdf, 0x01, 0xb8, 0x93, 0x11, 0x9f, 0x67, 0x4b, 0xf4, 0x0a, 0x9b, 0xf9, 0x40, 0x2c, 0x6f, 0x6f, 0x28, 0x9d, 0xb2, 0x23, 0xd1, 0x3c, 0x34, 0x86, 0x99, 0xab, 0xd1, 0x92, 0xc1, 0x18, 0xbb, 0x10, 0xef, 0xda, 0xbe, 0x66, 0xe8, 0x86, 0xdf, 0xd9, 0xff, 0x2f, 0xf6, 0x67, 0xe1, 0x91, 0xfc, 0x59, 0x11, 0xdb, 0xfb, 0x05, 0x89, 0x36, 0x25, 0x55, 0xfd, 0x98, 0xb8, 0xaa, 0x06, 0xaa, 0x39, 0x18, 0x1f, 0xcf, 0x36, 0xd3, 0x18, 0xc3, 0xd7, 0x46, 0x90, 0x6a, 0x12, 0x19, 0x10, 0xef, 0x50, 0x80, 0x7d, 0xe4, 0xcd, 0xf1, 0x91, 0xc7, 0x61, 0xfd, 0x50, 0x9b, 0xc4, 0x34, 0x47, 0x80, 0x23, 0x76, 0x05, 0x95, 0x9a, 0xff, 0xbb, 0x6d, 0xb7, 0xa1, 0xa7, 0x07, 0x42, 0x42, 0x60, 0x24, 0x5f, 0x2f, 0xbc, 0xd6, 0x77, 0x88, 0x35, 0x19, 0x50, 0x12, 0x11, 0xbc, 0xf0, 0x48, 0xd4, 0xee, 0x85, 0x26, 0xb1, 0xfb, 0x22, 0xef, 0xe0, 0x7f, 0x82, 0x7c, 0x49, 0xca, 0x9b, 0xfc, 0x30, 0x44, 0xa7, 0x10, 0xee, 0xbb, 0x5e, 0x36, 0x61, 0x65, 0xb5, 0x4a, 0xdf, 0xb2, 0x94, 0x7c, 0x87, 0x39, 0xc4, 0x46, 0x4a, 0xa4, 0x2d, 0x31, 0xe7, 0x58, 0xb9, 0xb8, 0x30, 0x6f, 0x87, 0x12, 0xc0, 0x02, 0xca, 0x5e, 0xbf, 0xae, 0xff, 0xf0, 0xd6, 0xde, 0x64, 0x4a, 0xa5, 0x75, 0x47, 0xfd, 0xd5, 0xfb, 0x6e, 0xa7, 0xce, 0x45, 0xfb, 0xf2, 0xc4, 0xe2, 0x24, 0xf9, 0x05, 0xc4, 0xbc, 0xd0, 0x79, 0xb2, 0xec, 0x8f, 0x8d, 0x29, 0x9d, 0xca, 0x68, 0xe4, 0x3a, 0x92, 0xd8, 0x9c, 0xad, 0x66, 0x2c, 0x80, 0x65, 0x93, 0x78, 0x7f, 0xd1, 0x86, 0x2d, 0xc7, 0xf9, 0x2a, 0xe1, 0x8a, 0xd1, 0xba, 0xd0, 0xf7, 0xef, 0xaf, 0x70, 0x85, 0x1a, 0xb1, 0xda, 0x78, 0x77, 0x9e, 0xa5, 0x04, 0x9a, 0xd7, 0x1d, 0x56, 0x49, 0x5d, 0xa2, 0x66, 0x0f, 0xbc, 0x6d, 0x34, 0x0c, 0x1f, 0xf3, 0xd7, 0x91, 0x58, 0xeb, 0x49, 0x1b, 0xf3, 0xf1, 0xde, 0xb1, 0xd9, 0x70, 0xf5, 0x10, 0x10, 0xf9, 0xcc, 0x80, 0x1b, 0x4e, 0xac, 0x01, 0xde, 0x54, 0x0e, 0x8b, 0xe0, 0xd2, 0xa3, 0xbe, 0x99, 0x65, 0x8f, 0x68, 0x0a, 0x97, 0x32, 0xc1, 0xeb, 0xdb, 0x8d, 0xb8, 0x7d, 0xcc, 0xe7, 0x65, 0x94, 0xf6, 0x9a, 0xc2, 0x8f, 0x93, 0xfc, 0xe5, 0xf6, 0x16, 0x0c, 0xb9, 0x5f, 0xec, 0x59, 0xae, 0x81, 0x6f, 0x83, 0x16, 0x83, 0xb7, 0xd5, 0xa4, 0x18, 0xaa, 0xff, 0x22, 0xed, 0x77, 0x6e, 0xf3, 0x47, 0x82, 0xe9, 0xd3, 0x12, 0x59, 0x6f, 0x62, 0xd3, 0xd6, 0x61, 0x24, 0x61, 0x85, 0xdb, 0x4b, 0xe0, 0x41, 0xd4, 0x87, 0x68, 0x1c, 0x22, 0xb9, 0x0a, 0x70, 0xda, 0xba, 0xe0, 0x80, 0xb4, 0x38, 0x8f, 0x68, 0x7b, 0x58, 0x5c, 0x5e, 0x45, 0xf4, 0xae, 0x6f, 0x39, 0xed, 0xbd, 0xdb, 0x16, 0xe9, 0x35, 0x05, 0xfb, 0xe4, 0x0b, 0x72, 0x89, 0xa6, 0xd1, 0x6e, 0x29, 0x54, 0xb9, 0x78, 0x94, 0x4c, 0xaa, 0xb8, 0x9f, 0x3d, 0xd6, 0x3e, 0x60, 0x4a, 0xdf, 0x14, 0xfb, 0x4f, 0x7b, 0xfb, 0xd0, 0x39, 0xbb, 0xb9, 0x85, 0x26, 0xc5, 0xae, 0xc7, 0x99, 0x43, 0xbd, 0x5a, 0x89, 0x82, 0x5b, 0x5c, 0x8a, 0xb7, 0x90, 0xe5, 0x49, 0xa4, 0xdd, 0x87, 0x16, 0x0c, 0x60, 0xe3, 0xb9, 0x1b, 0x42, 0x62, 0x9d, 0x2c, 0x2d, 0xba, 0x60, 0x13, 0x34, 0x09, 0xe2, 0x30, 0xdd, 0xf0, 0xe9, 0xbe, 0x02, 0x1f, 0xdf, 0x17, 0x18, 0x06, 0x1f, 0x66, 0xa5, 0x92, 0x0c, 0x6f, 0xee, 0xef, 0x64, 0x82, 0x4e, 0x3e, 0x98, 0xb6, 0xaa, 0xf7, 0x2f, 0xdd, 0xe8, 0xc3, 0x3e, 0xd6, 0x43, 0x8a, 0x54, 0x2f, 0xd3, 0xc9, 0x04, 0xf8, 0xa0, 0x2c, 0x0b, 0x44, 0x67, 0x0c, 0xb7, 0xe2, 0xa9, 0x7a, 0x48, 0x5d, 0x8a, 0x50, 0x67, 0xc1, 0x25, 0xde, 0x32, 0x43, 0x94, 0x37, 0xd3, 0xe2, 0x47, 0xa2, 0xe9, 0x7f, 0x99, 0x5d, 0x04, 0x9b, 0x79, 0xe2, 0x29, 0x6d, 0x21, 0x27, 0x28, 0x67, 0x75, 0xd3, 0x98, 0xbd, 0x61, 0x4f, 0xcd, 0x20, 0x5a, 0x1d, 0x17, 0xca, 0x65, 0x37, 0xb1, 0x7d, 0xb7, 0xc0, 0xc8, 0x80, 0x6c, 0x3b, 0xe7, 0xc1, 0xdf, 0xdc, 0x97, 0xe6, 0xf3, 0x20, 0xdc, 0xd9, 0x4b, 0xd9, 0xe3, 0x1f, 0x6d, 0xba, 0xf5, 0x68, 0x2d, 0x74, 0xbd, 0xb9, 0x49, 0x23, 0x2b, 0x36, 0x89, 0x10, 0x1d, 0xe2, 0x30, 0xe6, 0x3e, 0xb1, 0x6f, 0x6e, 0x50, 0x6b, 0x1b, 0x23, 0x5b, 0xcb, 0xf0, 0x3f, 0x32, 0x03, 0xf5, 0x0d, 0x37, 0x78, 0x60, 0x49, 0x86, 0x52, 0x84, 0x5a, 0xf0, 0x80, 0xf9, 0x8f, 0xfa, 0x61, 0x0d, 0x50, 0x67, 0x62, 0x5b, 0x7e, 0x41, 0x2b, 0xf3, 0x2a, 0xc4, 0xe2, 0xbc, 0x25, 0x5a, 0xb0, 0x3c, 0xe5, 0x56, 0x5c, 0x8d, 0x00, 0x5f, 0x67, 0x41, 0x35, 0x16, 0x1d, 0x12, 0x4d, 0xa1, 0x6c, 0x99, 0xe7, 0x09, 0x45, 0xd9, 0x65, 0x7d, 0x05, 0x13, 0x61, 0x84, 0xc8, 0x3b, 0x23, 0x5e, 0x72, 0xe7, 0x04, 0x4d, 0xf9, 0xf6, 0x58, 0x8d, 0x2f, 0x9f, 0x32, 0xc0, 0x1b, 0x90, 0x9e, 0xc2, 0x6f, 0x71, 0xf3, 0xe1, 0x74, 0x94, 0x9b, 0x18, 0xa7, 0xdd, 0x6b, 0xb5, 0xf4, 0xa8, 0x00, 0x2b, 0x90, 0x8f, 0x21, 0xd2, 0xd3, 0xb8, 0x09, 0xf0, 0x68, 0x61, 0x9a, 0xb2, 0x12, 0x3c, 0x52, 0x30, 0xae, 0x77, 0x25, 0x97, 0xbb, 0xa0, 0x23, 0x81, 0x41, 0x09, 0x0b, 0x91, 0x21, 0x95, 0x34, 0x55, 0x5e, 0xb2, 0x1d, 0x6f, 0xb7, 0x07, 0x5d, 0xe5, 0xd8, 0xea, 0xf9, 0xa1, 0x6f, 0x81, 0x98, 0x8c, 0x8b, 0x95, 0x15, 0x26, 0xaa, 0xf6, 0xd1, 0x27, 0xb7, 0x9c, 0x34, 0xbb, 0xe8, 0x1f, 0xa1, 0xd1, 0x92, 0xcc, 0x01, 0x77, 0xad, 0x9d, 0xba, 0x35, 0x71, 0x58, 0xdd, 0xb8, 0x8f, 0xe5, 0x34, 0xfc, 0x6b, 0x26, 0x70, 0xeb, 0x17, 0x50, 0xec, 0x66, 0x4a, 0xde, 0xdb, 0x5b, 0x3b, 0xcc, 0xae, 0x2e, 0x53, 0x66, 0xbd, 0x1e, 0xdd, 0xe5, 0xed, 0x0b, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xbd, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x30, 0x00, 0x00, 0x00, 0x77, 0xd0, 0x5d, 0x32, 0xfd, 0x25, 0x3e, 0x44, 0x23, 0x3c, 0xe7, 0x13, 0xca, 0xd0, 0xef, 0x0b, 0x0c, 0xc8, 0xc4, 0xd7, 0x20, 0x45, 0x2b, 0x66, 0x0e, 0x64, 0x5d, 0x30, 0x85, 0x34, 0x31, 0x64, 0x76, 0x7a, 0x23, 0xa1, 0x02, 0xda, 0x0e, 0xf9, 0x2a, 0xa2, 0x4a, 0xc1, 0xa5, 0xfb, 0xa3, 0xb8, 0x07, 0x0d, 0x03, 0xb0, 0x33, 0xa4, 0x09, 0x49, 0xe3, 0x15, 0x4c, 0x98, 0x56, 0xef, 0xac, 0x71, 0xa0, 0xa1, 0x22, 0x1c, 0xc1, 0x26, 0xdc, 0xd8, 0xee, 0xeb, 0x71, 0xb8, 0xd7, 0x9e, 0x7a, 0xb9, 0x3e, 0x55, 0x7f, 0x9a, 0xf7, 0x4a, 0xfe, 0x75, 0x1a, 0x3a, 0x16, 0xf7, 0x69, 0xfb, 0x63, 0x5a, 0x90, 0xfa, 0xf3, 0xb4, 0x82, 0x60, 0x78, 0x96, 0x88, 0x1c, 0x3a, 0x3f, 0xb5, 0x8c, 0xda, 0x10, 0x56, 0x9c, 0x82, 0x10, 0x36, 0x9c, 0x44, 0x3a, 0xab, 0xe8, 0xfb, 0x47, 0xd9, 0xd2, 0x80, 0xfe, 0xc9, 0x2c, 0x27, 0xb4, 0xe0, 0xfc, 0xf6, 0xa4, 0x92, 0x3a, 0x4f, 0x70, 0x60, 0xe6, 0x16, 0x31, 0x71, 0x5b, 0x06, 0x6d, 0xa3, 0xc3, 0xfb, 0xe8, 0xcc, 0xfe, 0x08, 0x10, 0x22, 0x1d, 0xc4, 0x73, 0xe1, 0x79, 0xf4, 0xbf, 0x07, 0xa1, 0x8d, 0x37, 0xe2, 0x10, 0xfb, 0x89, 0x7b, 0x47, 0x3e, 0xac, 0xc8, 0x7e, 0xa0, 0xf8, 0x0a, 0x16, 0xaa, 0x4a, 0x60, 0x20, 0x4f, 0x2e, 0x1f, 0xaf, 0xd3, 0xe1, 0x97, 0xb4, 0xea, 0x60, 0x82, 0x76, 0x17, 0x77, 0x0a, 0x59, 0xb7, 0x7a, 0x41, 0x4a, 0x34, 0xd2, 0x3a, 0x4d, 0x03, 0xab, 0x4f, 0x11, 0x0a, 0x1a, 0x23, 0xc5, 0x17, 0x13, 0x5a, 0x4c, 0xca, 0x90, 0xbf, 0xa1, 0x31, 0x9c, 0xed, 0x66, 0xc3, 0x2f, 0x30, 0x9e, 0xdb, 0x3f, 0xfe, 0x0b, 0x46, 0xfa, 0xc8, 0x20, 0x61, 0x87, 0xa2, 0xb0, 0xa9, 0x41, 0x70, 0x2b, 0x6e, 0x67, 0x0c, 0x7f, 0x35, 0xbd, 0xe8, 0xa9, 0x44, 0xd3, 0xa2, 0x73, 0xa7, 0x9f, 0x15, 0xa6, 0xda, 0xba, 0x27, 0xe0, 0x43, 0x6e, 0x61, 0xd9, 0x16, 0x2a, 0x7f, 0x31, 0xad, 0xb7, 0x80, 0xad, 0x03, 0x0a, 0x34, 0x54, 0xf4, 0x85, 0x45, 0xd1, 0x9c, 0x8b, 0x87, 0xf7, 0x0c, 0xa8, 0x47, 0x07, 0x64, 0xb2, 0x18, 0x07, 0x25, 0x70, 0x14, 0xc3, 0xf7, 0xc3, 0xd6, 0xab, 0x00, 0x94, 0x17, 0x74, 0x9b, 0xa3, 0x46, 0xb3, 0x5e, 0x52, 0xf5, 0x9b, 0x04, 0xea, 0x33, 0xc8, 0xe9, 0xc9, 0xe7, 0xf9, 0x77, 0x2a, 0x15, 0xda, 0xee, 0x44, 0x70, 0xc7, 0xc4, 0xce, 0x3f, 0xea, 0x69, 0xb2, 0xab, 0xd8, 0xb0, 0xc5, 0xfc, 0x7a, 0x75, 0x12, 0x53, 0xf1, 0x95, 0xfe, 0x70, 0xfa, 0xed, 0x4f, 0xc4, 0xfd, 0xdc, 0x35, 0xea, 0x8e, 0x6e, 0x1e, 0xef, 0xe3, 0x89, 0x52, 0x7b, 0xba, 0x35, 0x85, 0x37, 0x54, 0x52, 0x0e, 0x29, 0x3e, 0xff, 0xc4, 0xb9, 0x36, 0x91, 0x8d, 0x8a, 0xdb, 0xa7, 0x3f, 0xaa, 0x47, 0x2b, 0x40, 0x35, 0xfc, 0x1c, 0xdb, 0xfa, 0x4d, 0x8a, 0x60, 0x7b, 0xba, 0xf3, 0x22, 0x3e, 0xeb, 0xfd, 0x79, 0x7b, 0x43, 0xb2, 0x91, 0x95, 0xce, 0x22, 0x49, 0xa7, 0x50, 0x12, 0xd5, 0xfe, 0x55, 0x78, 0xa8, 0xc8, 0x4a, 0x66, 0xaa, 0x5e, 0xa7, 0xc6, 0x20, 0x02, 0xab, 0x82, 0x23, 0xf2, 0xee, 0xd0, 0x6c, 0xf5, 0xa3, 0x90, 0x3f, 0x50, 0x02, 0xc8, 0xbe, 0x97, 0xac, 0x70, 0x83, 0xa5, 0xb3, 0xa0, 0x58, 0x29, 0xc7, 0x20, 0x27, 0x35, 0x3a, 0xaf, 0xa5, 0x1a, 0xaa, 0xaa, 0x87, 0x7c, 0x10, 0x2d, 0xd9, 0x04, 0xa9, 0x29, 0x8e, 0x02, 0x73, 0x70, 0x21, 0xe1, 0x71, 0xe7, 0x9d, 0xaf, 0x3d, 0xf7, 0xc1, 0x10, 0x27, 0x1a, 0x97, 0x7c, 0x68, 0xc5, 0x7e, 0xeb, 0x80, 0xbf, 0x19, 0x1d, 0x2b, 0x33, 0xd1, 0xfb, 0x90, 0xac, 0xb3, 0xf7, 0xe1, 0x7d, 0x96, 0x94, 0xea, 0xd9, 0xc6, 0x45, 0x3b, 0xaf, 0x6e, 0x70, 0xf4, 0x03, 0x00, 0x80, 0x76, 0x64, 0x1c, 0xef, 0x6e, 0x71, 0xda, 0x92, 0x59, 0x0d, 0x47, 0xbb, 0x73, 0x38, 0xec, 0x27, 0xec, 0x8a, 0x28, 0xf2, 0x42, 0xb7, 0x6d, 0xf9, 0x0c, 0xdd, 0x3e, 0xbe, 0xfe, 0x4b, 0x12, 0xeb, 0x86, 0xdb, 0x11, 0x1a, 0xf1, 0xb7, 0x41, 0x8a, 0xff, 0x30, 0x5f, 0xed, 0x2c, 0x03, 0xa4, 0xca, 0xac, 0xd8, 0xec, 0xe2, 0x3f, 0x19, 0x57, 0x91, 0x72, 0x7a, 0xf4, 0x5f, 0x37, 0x8d, 0x8c, 0x0e, 0xd1, 0x80, 0xd6, 0x6a, 0x65, 0x6c, 0x42, 0x0f, 0x3a, 0x81, 0x7a, 0x83, 0xf9, 0xf3, 0xdc, 0x52, 0x44, 0x34, 0x3a, 0xed, 0xc0, 0xb2, 0x56, 0x27, 0x4f, 0x31, 0xb1, 0x05, 0x73, 0xb0, 0x86, 0x3c, 0x3f, 0x6b, 0xe4, 0xaf, 0x83, 0x4f, 0x19, 0xae, 0x5c, 0xdf, 0xcf, 0x1d, 0x5b, 0x7e, 0x88, 0xbb, 0xa4, 0x44, 0x05, 0xcf, 0xb3, 0x4e, 0xe3, 0x42, 0xa8, 0x45, 0x44, 0x58, 0x24, 0xb9, 0xd8, 0x62, 0x12, 0x34, 0x27, 0x47, 0xc4, 0x0b, 0x30, 0x05, 0x2f, 0x2e, 0x38, 0x81, 0x9d, 0xcd, 0xd0, 0x27, 0x79, 0x3a, 0xbc, 0x27, 0x29, 0x19, 0xd6, 0xe8, 0x69, 0x2e, 0x1b, 0x4d, 0xc0, 0xf6, 0x47, 0x2a, 0x70, 0xad, 0x36, 0x37, 0xf9, 0x31, 0x0c, 0xe2, 0x95, 0x97, 0x36, 0xad, 0xd3, 0xd1, 0x46, 0x3f, 0x3c, 0x3e, 0xd0, 0xef, 0xb5, 0x1a, 0x7a, 0xf8, 0x33, 0xcb, 0xb8, 0x46, 0x23, 0x3e, 0x9d, 0x2d, 0x53, 0x65, 0x99, 0x67, 0x8f, 0x2e, 0x37, 0x6a, 0xbe, 0x22, 0x94, 0x1c, 0xc9, 0xbd, 0x87, 0x0b, 0xea, 0xfe, 0xf0, 0xe2, 0xd4, 0xf5, 0xd5, 0xcc, 0x1a, 0xbb, 0x19, 0x17, 0x73, 0x24, 0x8e, 0xa5, 0xfa, 0x07, 0x12, 0x61, 0x48, 0x32, 0x7b, 0x5b, 0x06, 0x6c, 0xf0, 0x11, 0xbb, 0xd1, 0xed, 0x4e, 0x5e, 0x4e, 0x18, 0xc3, 0x5a, 0x64, 0x00, 0xba, 0x3d, 0x0b, 0x80, 0x5c, 0x50, 0x02, 0x20, 0xcc, 0xa3, 0x05, 0x9f, 0xab, 0x4a, 0x28, 0x26, 0x78, 0xc0, 0xd0, 0x5f, 0xc3, 0x32, 0x86, 0xaa, 0x00, 0xfa, 0xfb, 0x52, 0xe0, 0x62, 0x4a, 0xa9, 0xcd, 0x49, 0x4e, 0x24, 0x64, 0xf0, 0x3f, 0x67, 0xd8, 0x96, 0xcd, 0xe4, 0xaf, 0xb4, 0xcc, 0x15, 0x1a, 0x96, 0x67, 0x3b, 0xc1, 0xd3, 0x97, 0xe4, 0x8e, 0x2e, 0xa2, 0x86, 0xd0, 0x82, 0x68, 0x3a, 0x9e, 0xf7, 0x89, 0x5c, 0x79, 0xb9, 0x92, 0x90, 0xe3, 0x28, 0x39, 0x0e, 0xc2, 0xc3, 0xd6, 0xb8, 0x39, 0x31, 0x54, 0x9a, 0x9c, 0x6c, 0x46, 0x40, 0xb1, 0xa2, 0xc1, 0x53, 0xe7, 0x12, 0x92, 0x18, 0xd4, 0x61, 0x63, 0x36, 0xd8, 0xda, 0xb3, 0xef, 0x64, 0x54, 0x5b, 0xa7, 0xce, 0x08, 0xff, 0xc6, 0xe7, 0x65, 0x1f, 0x15, 0xc3, 0xc8, 0x93, 0x56, 0xc9, 0xe0, 0x2e, 0xdb, 0x9e, 0x3c, 0x30, 0x28, 0x41, 0x15, 0x41, 0x46, 0xda, 0xb9, 0xda, 0x98, 0x6e, 0x62, 0x30, 0xc3, 0x9a, 0x87, 0x3f, 0x5f, 0x71, 0x65, 0x27, 0x80, 0x8b, 0xe5, 0xd3, 0xc3, 0x67, 0xd1, 0xab, 0x8b, 0xa7, 0xcc, 0x63, 0x75, 0xe7, 0x8e, 0x4a, 0x70, 0x1a, 0xfc, 0x5f, 0xc5, 0x25, 0x52, 0xa5, 0xaa, 0x35, 0x82, 0x03, 0xfd, 0x74, 0xb4, 0x42, 0x55, 0x6a, 0xf6, 0xc3, 0x89, 0x0f, 0x09, 0x2a, 0x1a, 0x82, 0xb3, 0xa4, 0x9e, 0x50, 0xff, 0x3c, 0x99, 0xbf, 0x98, 0x91, 0xce, 0xbf, 0x63, 0x54, 0x65, 0x07, 0xd8, 0xfe, 0x71, 0xe6, 0xb4, 0xf9, 0x45, 0x68, 0xbb, 0x08, 0xe6, 0xa7, 0x0f, 0x58, 0x9c, 0x2b, 0x01, 0xe8, 0x41, 0xe9, 0xe0, 0xb8, 0xc2, 0x96, 0xe6, 0x76, 0x9b, 0xd5, 0x3f, 0x87, 0xbb, 0x5d, 0xf4, 0x90, 0xdb, 0xa9, 0x62, 0xe6, 0x3f, 0xb6, 0xdb, 0x9a, 0xf7, 0x2c, 0xfb, 0xf5, 0xcf, 0x72, 0xbe, 0xdd, 0xd9, 0xa0, 0xde, 0xe4, 0x31, 0x12, 0x4f, 0x8c, 0x3c, 0x13, 0xfb, 0xcb, 0x77, 0x53, 0x6a, 0xdf, 0x77, 0x87, 0x6e, 0x0b, 0x2b, 0x9a, 0x0d, 0x6f, 0xe3, 0xa9, 0x20, 0x6b, 0x75, 0x57, 0x31, 0xad, 0x84, 0x2f, 0xa9, 0x51, 0xc7, 0x1f, 0xd2, 0x03, 0xc2, 0xca, 0xf9, 0xdc, 0xab, 0xf2, 0x23, 0xd6, 0x9c, 0x83, 0xce, 0x9a, 0x63, 0x92, 0x04, 0xe0, 0xc4, 0x91, 0x24, 0xb5, 0x78, 0xdb, 0x4a, 0xb6, 0x8b, 0xa5, 0x0f, 0xbd, 0x7d, 0x01, 0x6f, 0xb5, 0x79, 0x18, 0x83, 0x78, 0x65, 0x0b, 0x88, 0xd0, 0xbe, 0x8e, 0x77, 0xe0, 0x10, 0xd2, 0x2c, 0xa1, 0x7d, 0x47, 0x09, 0x63, 0x99, 0xfc, 0xec, 0x92, 0x9a, 0xee, 0x3e, 0xf0, 0x6b, 0x4f, 0xda, 0x54, 0x03, 0x5d, 0x87, 0x77, 0x13, 0x7c, 0x72, 0xf6, 0xa3, 0x45, 0x6f, 0x27, 0x74, 0xdb, 0xc9, 0x8f, 0x5e, 0xb2, 0xd9, 0x60, 0xe8, 0xf3, 0x89, 0x9d, 0x7d, 0x68, 0x23, 0xf3, 0x60, 0x7e, 0xc7, 0x96, 0x90, 0x60, 0xad, 0x2d, 0x40, 0x61, 0x4f, 0x8d, 0x1b, 0x03, 0xbf, 0x0e, 0x1f, 0x7c, 0xf8, 0x89, 0xfc, 0xa3, 0xf6, 0xff, 0x80, 0x3a, 0x5d, 0x5d, 0x79, 0x39, 0x4e, 0xad, 0xa7, 0x8a, 0xb7, 0x04, 0x68, 0x8d, 0x80, 0x51, 0xa6, 0x99, 0x06, 0xda, 0x23, 0xae, 0x31, 0xcf, 0x95, 0x4b, 0xb9, 0x5b, 0x45, 0x0c, 0x96, 0x80, 0x0e, 0x93, 0xdc, 0x0c, 0x65, 0xe2, 0x19, 0x88, 0x69, 0x18, 0x1c, 0x46, 0x8f, 0xba, 0xd5, 0xdb, 0xb2, 0xc3, 0xd2, 0xb3, 0x8a, 0xd0, 0xb2, 0x71, 0x95, 0xeb, 0x48, 0x0d, 0x70, 0x39, 0x93, 0x1e, 0x05, 0xcd, 0xc7, 0x54, 0xa3, 0xb4, 0xad, 0x88, 0xce, 0x6f, 0x53, 0x35, 0xeb, 0x5e, 0xe7, 0x83, 0xad, 0xb2, 0x9a, 0xb8, 0x17, 0x23, 0x69, 0x87, 0x77, 0xb5, 0x99, 0xb3, 0x78, 0x7b, 0x03, 0xb3, 0xfa, 0x5a, 0xa1, 0xc5, 0x6c, 0x36, 0xf5, 0x67, 0x77, 0xbf, 0x4b, 0xe7, 0x02, 0x34, 0xc5, 0xfd, 0x5e, 0xa4, 0x3e, 0x3d, 0xc9, 0x50, 0xcc, 0x15, 0x0e, 0xef, 0x09, 0x69, 0xf5, 0x4f, 0x18, 0x52, 0x21, 0xb0, 0x84, 0x59, 0x4b, 0xc3, 0x30, 0xc7, 0x7a, 0xe3, 0xfa, 0xfa, 0xfa, 0x53, 0xa4, 0x08, 0x5e, 0xd0, 0x58, 0xef, 0x93, 0x08, 0xac, 0x8a, 0x5b, 0xfa, 0x0d, 0x02, 0x4a, 0x7b, 0x23, 0x7f, 0x08, 0x72, 0xb9, 0x39, 0x1a, 0x52, 0x3d, 0x64, 0x7b, 0x49, 0x22, 0x0d, 0xb0, 0xb2, 0x81, 0x07, 0xe1, 0xce, 0x8a, 0x46, 0x18, 0x99, 0xeb, 0x9a, 0xd7, 0x0e, 0x0f, 0x58, 0x02, 0x36, 0xed, 0x43, 0x3e, 0x6d, 0xef, 0xcc, 0x24, 0x11, 0x4e, 0x9d, 0xd5, 0x08, 0x99, 0x37, 0x28, 0x8e, 0x2e, 0x67, 0x2b, 0xad, 0x4e, 0x5c, 0x27, 0x0f, 0x7a, 0xc3, 0x99, 0xa0, 0xa0, 0x7f, 0x74, 0xb8, 0x17, 0x59, 0x7c, 0x5e, 0x5e, 0x70, 0xc9, 0x5a, 0x81, 0x93, 0xb0, 0xeb, 0x6d, 0xfb, 0x1a, 0x4b, 0x18, 0x0d, 0x63, 0x0c, 0xff, 0x90, 0xff, 0x9e, 0xd5, 0x26, 0x75, 0x1f, 0x04, 0x1e, 0x65, 0xbe, 0xb8, 0x82, 0xc4, 0x71, 0xc3, 0x97, 0xc5, 0x98, 0x74, 0x98, 0xa9, 0xeb, 0x93, 0x46, 0xfa, 0xdd, 0x95, 0x72, 0x30, 0x71, 0xf9, 0xb6, 0xd1, 0x9f, 0x96, 0x30, 0xc6, 0x6d, 0x42, 0xf9, 0x24, 0x24, 0xf8, 0x58, 0xca, 0xd8, 0x72, 0x1b, 0x26, 0x08, 0xac, 0x77, 0x3c, 0xd2, 0x5d, 0x4b, 0xbd, 0xb7, 0xfd, 0xa7, 0x71, 0x2f, 0xed, 0x3d, 0x59, 0x87, 0x18, 0xb3, 0x36, 0x88, 0xf6, 0xe9, 0x4d, 0xb6, 0x62, 0xa7, 0x87, 0xc1, 0x6b, 0x83, 0x6c, 0x7c, 0x82, 0xa3, 0x7a, 0x5c, 0x1e, 0x81, 0xb5, 0xd6, 0x36, 0x91, 0x11, 0x5e, 0xbd, 0xf4, 0x3e, 0xdd, 0xe8, 0xfc, 0x89, 0x25, 0x12, 0x00, 0x26, 0x46, 0x58, 0xf7, 0xb3, 0x03, 0x4c, 0x5b, 0x37, 0x8b, 0x9c, 0xd1, 0x02, 0x80, 0x1a, 0xb3, 0x48, 0xf9, 0xb2, 0x10, 0x98, 0x67, 0x3f, 0x99, 0x59, 0xf3, 0xd9, 0x00, 0xb1, 0x83, 0xe1, 0xb2, 0x1c, 0xd9, 0x4d, 0x2f, 0xf5, 0x56, 0x1b, 0xc6, 0x80, 0x36, 0xa0, 0x5d, 0x41, 0x67, 0xf8, 0xbf, 0xfe, 0x00, 0x18, 0xdb, 0x52, 0xf2, 0xac, 0x7c, 0xd6, 0x42, 0x70, 0xe2, 0x14, 0xc2, 0x33, 0xac, 0x14, 0x1f, 0xfa, 0xd0, 0x28, 0x30, 0x22, 0xba, 0xbe, 0xac, 0x53, 0xf7, 0xc5, 0x42, 0xb0, 0x64, 0xc7, 0xe5, 0xf7, 0xc4, 0x2a, 0x4d, 0xc5, 0x83, 0xa0, 0x6b, 0x4f, 0x49, 0x8d, 0xd7, 0x9a, 0x23, 0xdf, 0xbd, 0x07, 0x75, 0x34, 0xc0, 0xde, 0x66, 0x34, 0x7e, 0x94, 0xb7, 0x17, 0x02, 0xd1, 0x39, 0x5a, 0x42, 0xe9, 0x52, 0x54, 0xbf, 0x9d, 0xb6, 0xfe, 0xe2, 0x8e, 0x7d, 0x19, 0xa9, 0x85, 0xdb, 0x67, 0xee, 0xdd, 0x74, 0xa8, 0xba, 0x16, 0x81, 0x01, 0x37, 0x40, 0x30, 0x32, 0x88, 0x66, 0xa4, 0x85, 0x60, 0x0f, 0x5b, 0x4a, 0x0d, 0xd5, 0x81, 0x02, 0xb5, 0xf4, 0xd3, 0xda, 0x6e, 0x03, 0x63, 0xa5, 0x0e, 0xdc, 0x81, 0xfe, 0x9b, 0xf7, 0x59, 0xc1, 0x38, 0xeb, 0x2c, 0xed, 0x12, 0xf9, 0x15, 0x45, 0x7d, 0x90, 0x0f, 0xea, 0x7d, 0x41, 0xd7, 0x7e, 0xf3, 0x68, 0x78, 0xe5, 0x4c, 0x77, 0xa7, 0x83, 0x4b, 0xe4, 0xed, 0xd6, 0x6f, 0xb9, 0x98, 0x04, 0x76, 0x82, 0x1e, 0xb2, 0xc9, 0x8f, 0xc6, 0x5b, 0xdc, 0x1e, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xbd, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x30, 0x00, 0x00, 0x00, 0x9b, 0x7b, 0xdc, 0x1c, 0xac, 0x09, 0x71, 0x73, 0x18, 0x64, 0x92, 0xcc, 0x53, 0x4f, 0x46, 0xe1, 0x19, 0xe2, 0x23, 0x65, 0x1b, 0x3b, 0xb1, 0xd7, 0xc0, 0xb3, 0x61, 0x3b, 0x42, 0x1f, 0xb1, 0xec, 0x08, 0x2b, 0x15, 0x32, 0xa1, 0xe7, 0xf1, 0x02, 0x9e, 0x60, 0x44, 0x1b, 0x7d, 0x6b, 0x87, 0xe9, 0xcf, 0xdc, 0x0c, 0x54, 0x1e, 0x96, 0xf7, 0xb6, 0x7b, 0x6a, 0x47, 0x37, 0xb1, 0xa6, 0xf7, 0x60, 0x73, 0xe2, 0x4b, 0x9e, 0xc6, 0x8d, 0xfe, 0x12, 0xfc, 0xee, 0x1d, 0x40, 0xb4, 0x91, 0x5d, 0x37, 0x0b, 0xfd, 0x13, 0x17, 0xdb, 0x75, 0x52, 0x68, 0x3b, 0x02, 0x56, 0x42, 0x6b, 0x75, 0x6c, 0x1f, 0xcc, 0x5d, 0xfc, 0x3e, 0x6d, 0xc2, 0xb5, 0x8f, 0x08, 0x66, 0x58, 0x93, 0x74, 0x3a, 0x28, 0xc1, 0x9d, 0x57, 0x13, 0x0c, 0xad, 0x1a, 0xb5, 0x2f, 0xc8, 0x2b, 0x0d, 0x4a, 0x20, 0x5a, 0x49, 0xb1, 0x8c, 0x1e, 0x34, 0x93, 0x7c, 0xe8, 0x15, 0x04, 0xa2, 0xf6, 0x15, 0x00, 0x9c, 0xd4, 0x5a, 0x63, 0xa2, 0x1a, 0xef, 0x92, 0x6e, 0x39, 0xf3, 0xe1, 0x6e, 0x55, 0x7b, 0xfe, 0xbc, 0x45, 0x1f, 0x4e, 0x42, 0xa2, 0xdf, 0x08, 0xd6, 0x67, 0x0b, 0x47, 0x27, 0x4b, 0x40, 0x31, 0xef, 0x0f, 0xc7, 0xbd, 0x20, 0xe9, 0x4e, 0x95, 0xa7, 0x5f, 0xe3, 0x04, 0x70, 0xb7, 0x02, 0x76, 0x6b, 0xe7, 0x13, 0xc4, 0x18, 0x9e, 0xf7, 0xad, 0x38, 0xdf, 0x9b, 0x65, 0xcd, 0x69, 0xf4, 0xc0, 0xb4, 0x88, 0x59, 0x28, 0x14, 0xfe, 0x68, 0x84, 0x30, 0x80, 0xae, 0x2d, 0x11, 0xb0, 0xd6, 0x02, 0xdd, 0x48, 0xbf, 0x25, 0x48, 0xa5, 0x05, 0xa3, 0xbc, 0x02, 0xef, 0xad, 0xa0, 0xb1, 0xc3, 0xbb, 0xe1, 0xc8, 0xc3, 0x42, 0x4c, 0x37, 0x29, 0x10, 0x91, 0x7a, 0x11, 0x1b, 0x19, 0x24, 0x5b, 0xb5, 0x81, 0xa2, 0xdc, 0x51, 0xa0, 0x85, 0x15, 0x5a, 0x7c, 0xb3, 0xfa, 0x56, 0x0a, 0xc3, 0x16, 0xfa, 0x7d, 0x51, 0xdc, 0x4a, 0x87, 0xad, 0x97, 0x2e, 0xb6, 0x1c, 0xca, 0x6d, 0x12, 0x3b, 0xc9, 0x27, 0x41, 0x02, 0xe4, 0x8c, 0x40, 0x28, 0xf0, 0xff, 0x83, 0x6c, 0x85, 0x27, 0xad, 0xf4, 0xaf, 0x53, 0x28, 0x8b, 0x3e, 0xbd, 0x45, 0x1c, 0x2c, 0xe5, 0x5c, 0xbd, 0x51, 0xa7, 0xa0, 0x1b, 0xe7, 0x72, 0x77, 0xea, 0x08, 0xb2, 0xad, 0x0d, 0x38, 0x3f, 0x4f, 0x4e, 0xfa, 0x68, 0x0d, 0x74, 0xaa, 0x70, 0x2c, 0x1b, 0x96, 0x04, 0x73, 0x63, 0x20, 0x4a, 0x84, 0xad, 0xfd, 0x5b, 0xd2, 0xee, 0x43, 0x2a, 0xad, 0xbb, 0x77, 0x46, 0x59, 0x7c, 0x82, 0x51, 0xf3, 0x5b, 0xaf, 0x39, 0xe5, 0xdf, 0xed, 0x7c, 0xff, 0x9e, 0xf7, 0x9a, 0xd3, 0x2d, 0x5c, 0x58, 0x44, 0x99, 0x2d, 0xed, 0x89, 0xac, 0x99, 0x72, 0x73, 0x06, 0x0e, 0x33, 0xd3, 0x43, 0xe6, 0x68, 0x47, 0x51, 0xcc, 0x52, 0xb6, 0x76, 0x06, 0xa2, 0xa2, 0x79, 0x57, 0x92, 0x01, 0xc8, 0xfd, 0x0d, 0x8e, 0xb1, 0x84, 0x0f, 0x66, 0x6c, 0x3f, 0xb5, 0x1c, 0xef, 0x15, 0x8e, 0x70, 0xfa, 0x55, 0x86, 0x4a, 0x61, 0x56, 0x9b, 0xad, 0x2a, 0xa2, 0xfa, 0x83, 0x6c, 0xc3, 0x42, 0xee, 0x1b, 0x84, 0x13, 0xa3, 0xed, 0x47, 0xde, 0x99, 0x50, 0x06, 0xfa, 0xf4, 0x39, 0x6c, 0xc0, 0x99, 0xe9, 0xf9, 0x3d, 0xb4, 0x31, 0x40, 0xdf, 0xde, 0x57, 0xf4, 0x49, 0x3f, 0xfd, 0xd7, 0x46, 0xad, 0x57, 0xb3, 0x25, 0x2c, 0xef, 0x5a, 0x7c, 0xe8, 0x7e, 0x03, 0xaf, 0x8e, 0x2c, 0xa6, 0xce, 0xe9, 0x35, 0xb4, 0x9e, 0x0d, 0xa8, 0x7e, 0x47, 0xcb, 0x3c, 0xe0, 0xd6, 0x5e, 0xeb, 0xb8, 0xcf, 0x74, 0xc2, 0xea, 0x09, 0xba, 0x4b, 0x51, 0x48, 0x0f, 0xef, 0x6a, 0xb7, 0xc1, 0x30, 0xf6, 0x65, 0xdc, 0x0f, 0x9c, 0xe6, 0x15, 0xff, 0xcc, 0x0a, 0x3f, 0x8f, 0xde, 0x86, 0x14, 0x66, 0xdd, 0xbe, 0xbf, 0x1e, 0xb4, 0x68, 0x92, 0xda, 0x12, 0xab, 0x88, 0xb9, 0x2f, 0x94, 0x8b, 0xf1, 0x9a, 0x5c, 0xee, 0x38, 0x5a, 0x30, 0xb3, 0x94, 0x52, 0x50, 0x0b, 0x2a, 0x76, 0xc3, 0x90, 0x81, 0xf5, 0xe9, 0xc7, 0x2b, 0xfa, 0x2d, 0x91, 0xf8, 0xfc, 0x6b, 0x13, 0x75, 0x71, 0x4c, 0xb4, 0x54, 0xa5, 0xd7, 0xe6, 0xc9, 0x7b, 0xd0, 0xb8, 0xf4, 0x2f, 0x61, 0xcf, 0x49, 0xb6, 0x57, 0x1a, 0xd4, 0xdb, 0x5e, 0x4d, 0x4f, 0x18, 0x53, 0xe0, 0xf4, 0x27, 0x03, 0xd8, 0x08, 0xcb, 0x9e, 0xee, 0xdc, 0x72, 0x5a, 0x6c, 0x3b, 0x13, 0x78, 0x28, 0xf5, 0xf8, 0x6e, 0x1a, 0x7a, 0xda, 0xc5, 0xf0, 0x4f, 0xbd, 0x0e, 0xcd, 0xc7, 0x22, 0x44, 0x0c, 0x85, 0x4b, 0xe0, 0x96, 0x80, 0xbb, 0x96, 0x26, 0xd2, 0x5d, 0x5f, 0x69, 0x8b, 0x3a, 0x29, 0xaa, 0x04, 0xdd, 0x95, 0xd2, 0x71, 0xf2, 0x62, 0x32, 0x11, 0x3b, 0xe1, 0x00, 0x94, 0x8d, 0x94, 0xf7, 0x9d, 0x5f, 0x57, 0xc3, 0xca, 0x82, 0xc4, 0x70, 0x9f, 0x47, 0x4c, 0x2a, 0xdc, 0x3a, 0x2b, 0xc6, 0x86, 0xc1, 0x9e, 0xf6, 0x04, 0x39, 0x8c, 0x1f, 0x67, 0xd4, 0xc2, 0x5c, 0x8d, 0xf4, 0x80, 0xc7, 0x6b, 0x71, 0xcb, 0x2a, 0x8d, 0x5a, 0x17, 0xae, 0x48, 0x2e, 0x9e, 0x90, 0xd2, 0xdb, 0x6e, 0x8b, 0xd3, 0x8c, 0xe1, 0x06, 0xd4, 0xef, 0x43, 0xf0, 0x3f, 0x53, 0x4c, 0xfb, 0x38, 0x0d, 0xc9, 0xa5, 0x0c, 0xc5, 0x37, 0x92, 0x50, 0x5b, 0x10, 0x39, 0xa5, 0x9e, 0x01, 0x18, 0x62, 0x6c, 0xd6, 0x48, 0xdc, 0xec, 0x68, 0x3a, 0x60, 0xb2, 0x0d, 0x7a, 0x0b, 0x07, 0x93, 0x4b, 0xa3, 0x2d, 0xfb, 0x8b, 0x8b, 0x14, 0x14, 0x4f, 0x3a, 0x47, 0xff, 0xdd, 0x5a, 0x8f, 0x07, 0x7b, 0x01, 0x16, 0x06, 0xe3, 0xe9, 0x02, 0xdc, 0xa8, 0x28, 0x34, 0x0b, 0xcb, 0x7a, 0x6d, 0xe6, 0xce, 0x41, 0xac, 0x13, 0xfa, 0x22, 0x54, 0x03, 0x46, 0x7a, 0x66, 0x75, 0x25, 0x7d, 0xfc, 0x74, 0x67, 0xa4, 0x4d, 0x3e, 0x0c, 0x4a, 0x19, 0xa3, 0xd9, 0x1d, 0x08, 0xc2, 0xe0, 0x4e, 0x90, 0xfd, 0x74, 0x4b, 0x8a, 0x07, 0xcd, 0x49, 0x23, 0x58, 0xe9, 0xa7, 0x1e, 0xbc, 0x64, 0x6d, 0xcb, 0xe0, 0xd3, 0x06, 0x7e, 0x39, 0x57, 0x03, 0x50, 0x76, 0x81, 0x25, 0xe4, 0x7e, 0xc6, 0xf9, 0x8c, 0xce, 0x05, 0x53, 0xaa, 0x7f, 0x0d, 0xe5, 0xef, 0x5f, 0xdb, 0xec, 0x91, 0xd9, 0x34, 0x34, 0xef, 0x27, 0xc1, 0x82, 0x56, 0x16, 0x02, 0x20, 0x23, 0xfc, 0x36, 0xa7, 0x62, 0x57, 0x9e, 0xe6, 0x62, 0x9f, 0xc6, 0x52, 0x2c, 0x2f, 0x33, 0x22, 0xd4, 0x94, 0x87, 0x17, 0xd8, 0x0d, 0x3d, 0x72, 0x2e, 0x8f, 0x04, 0x3b, 0x1e, 0xf4, 0xac, 0x90, 0x5d, 0x27, 0x63, 0x7b, 0xdb, 0xa5, 0x0a, 0x10, 0x9e, 0x79, 0xbd, 0x21, 0x2a, 0xa3, 0x7e, 0xf6, 0x72, 0x34, 0xa6, 0x64, 0x09, 0x0f, 0x82, 0x6e, 0xe7, 0x71, 0xca, 0x21, 0x2f, 0x29, 0x0c, 0xe2, 0x9d, 0x28, 0x6b, 0x5f, 0x9a, 0xd9, 0x68, 0x6f, 0xbe, 0xd8, 0x3b, 0xd3, 0x75, 0x52, 0x58, 0x7c, 0x51, 0x35, 0xfc, 0x6e, 0xe7, 0x7d, 0xab, 0xa9, 0x8b, 0x0d, 0x47, 0x42, 0x00, 0x73, 0x4c, 0xae, 0x02, 0xef, 0xd4, 0xa0, 0x6f, 0x6f, 0xa6, 0x56, 0xf9, 0x0d, 0xb2, 0x8a, 0xa3, 0x09, 0xe2, 0x7f, 0xc3, 0x22, 0x0f, 0x9a, 0xf5, 0x0f, 0x6e, 0x66, 0xe6, 0x85, 0x99, 0x67, 0x13, 0x94, 0xe8, 0x15, 0x55, 0x0f, 0x37, 0x8f, 0x43, 0x8e, 0x32, 0x88, 0x35, 0x8d, 0xb8, 0x19, 0xbd, 0xe4, 0x3f, 0x1d, 0x44, 0x65, 0xd3, 0xbe, 0xbb, 0x7f, 0xdf, 0x21, 0x4e, 0xe6, 0x87, 0x81, 0x86, 0xc0, 0x66, 0xad, 0x52, 0x98, 0x56, 0x02, 0xe0, 0x09, 0xe9, 0xa1, 0x96, 0x0a, 0xfb, 0x75, 0xbd, 0x9c, 0xeb, 0x23, 0x99, 0x9e, 0x93, 0x5c, 0x65, 0xde, 0xc4, 0x68, 0xa4, 0xac, 0x1d, 0xbb, 0xa7, 0x7f, 0x7c, 0x7f, 0xe8, 0xc7, 0x41, 0xd6, 0xd5, 0x1f, 0x1f, 0x66, 0x59, 0xb2, 0xe0, 0xab, 0xa0, 0x52, 0x9a, 0x07, 0x8c, 0xb6, 0x6d, 0x9f, 0x61, 0xfe, 0x06, 0x55, 0x19, 0x22, 0x38, 0x25, 0xc6, 0x20, 0x99, 0xd5, 0xac, 0x8e, 0xfb, 0x43, 0x3d, 0xa6, 0x23, 0xb4, 0xa0, 0x6d, 0x83, 0x4e, 0xd5, 0xd6, 0x14, 0xfd, 0xb6, 0xe2, 0xf2, 0xe2, 0xae, 0x15, 0x39, 0x66, 0x12, 0x5c, 0x0c, 0xa5, 0xc2, 0xa3, 0x5c, 0x4e, 0x55, 0x9a, 0x71, 0xcf, 0xfc, 0x26, 0x54, 0x44, 0x72, 0x2f, 0xed, 0x2a, 0x93, 0x94, 0xce, 0x04, 0x66, 0x66, 0x51, 0x37, 0x02, 0x11, 0xee, 0xbc, 0xe9, 0x6c, 0x4e, 0xba, 0x2c, 0x54, 0x15, 0x25, 0x40, 0x19, 0x2c, 0x6e, 0x2b, 0x1b, 0x7e, 0x8d, 0x29, 0x45, 0x1e, 0x12, 0xbb, 0xe3, 0x44, 0xc8, 0x8b, 0xe6, 0xd3, 0x6b, 0xc8, 0x27, 0x22, 0x40, 0x33, 0xa5, 0x2e, 0x87, 0x59, 0xa9, 0xac, 0x78, 0x23, 0x98, 0x84, 0x75, 0xfc, 0xa4, 0x4e, 0x6f, 0x1b, 0x76, 0x45, 0xd9, 0x91, 0x58, 0xf7, 0x1a, 0x95, 0xad, 0xdd, 0x33, 0x20, 0xfb, 0x25, 0x5d, 0x3d, 0xfb, 0xdf, 0xc2, 0x35, 0x27, 0x38, 0xf0, 0x2f, 0x0f, 0xb6, 0x82, 0x3e, 0x61, 0x64, 0x4b, 0xa4, 0xc2, 0x9d, 0x9e, 0x86, 0xa7, 0xd9, 0xfe, 0xea, 0x0d, 0x87, 0x7a, 0xad, 0x9e, 0x8d, 0x13, 0xd1, 0x0b, 0x53, 0x0c, 0x17, 0x29, 0x40, 0x17, 0xe7, 0x07, 0x75, 0x75, 0x66, 0xfb, 0x94, 0x9d, 0xa7, 0x2c, 0xc2, 0x65, 0x6b, 0xc9, 0xd9, 0xc0, 0xe6, 0x87, 0x31, 0x54, 0x29, 0x64, 0x28, 0x45, 0x63, 0x6c, 0x22, 0xed, 0xaa, 0x3b, 0xcf, 0x97, 0xd5, 0x7a, 0x16, 0xec, 0x06, 0x1d, 0xbf, 0x8a, 0x92, 0x68, 0xa9, 0xdd, 0x6d, 0xe2, 0x2a, 0x4b, 0xca, 0x49, 0xa9, 0x3d, 0x37, 0x2b, 0xdc, 0x00, 0xd9, 0xe4, 0x5e, 0x3c, 0x2c, 0xfd, 0x5f, 0x01, 0xcf, 0xd4, 0x08, 0x38, 0x1b, 0x2a, 0xa5, 0x56, 0xea, 0xfe, 0x53, 0xc9, 0xbd, 0x39, 0xcb, 0x93, 0x5f, 0x06, 0xf0, 0x14, 0x82, 0xfb, 0xe6, 0xe1, 0x24, 0x93, 0xeb, 0xdc, 0x71, 0xc1, 0xac, 0xd9, 0x0a, 0xda, 0x94, 0x1e, 0xcf, 0xf4, 0x27, 0x36, 0x91, 0x8a, 0x47, 0x8c, 0xda, 0xe2, 0x7c, 0x31, 0xbf, 0x70, 0x04, 0x98, 0xfb, 0x3b, 0xf3, 0x70, 0x78, 0xa3, 0x0b, 0x67, 0x69, 0x2b, 0x82, 0x5d, 0xb1, 0xcc, 0x1a, 0x0d, 0x82, 0xf2, 0xe3, 0x6f, 0x0e, 0x54, 0x5b, 0x2a, 0xb9, 0x6a, 0x1d, 0x11, 0x10, 0x20, 0x35, 0x76, 0x7b, 0xa1, 0x64, 0x2b, 0x96, 0x12, 0x5c, 0x62, 0xab, 0x42, 0xc8, 0x30, 0xb7, 0xba, 0x51, 0xb3, 0xe7, 0xe1, 0xa5, 0x21, 0xdc, 0xe5, 0xad, 0x7c, 0xf8, 0x83, 0x7a, 0xa3, 0xec, 0xd4, 0xd1, 0x0d, 0x8b, 0x2e, 0xbf, 0xc4, 0x1f, 0x47, 0x07, 0x5a, 0xa6, 0x4d, 0x5b, 0xc9, 0x21, 0xa2, 0x31, 0x7b, 0xcd, 0x61, 0xcd, 0x1b, 0x51, 0xfc, 0xea, 0xff, 0xb0, 0x86, 0xce, 0x10, 0x51, 0xcb, 0x77, 0xcd, 0x74, 0x4b, 0x3e, 0x6b, 0x0b, 0x9d, 0x42, 0x9f, 0x0f, 0xfa, 0x7c, 0x1e, 0x30, 0x11, 0xc1, 0x02, 0x96, 0x85, 0xd3, 0x8b, 0xdd, 0xc2, 0xc7, 0xf8, 0x09, 0x77, 0x8b, 0x8d, 0xef, 0x3a, 0xfc, 0x21, 0xd6, 0x0b, 0x62, 0x8a, 0x16, 0xd8, 0x5a, 0x75, 0x32, 0x23, 0xd3, 0x5f, 0xa8, 0x9b, 0xba, 0xac, 0x78, 0x64, 0xbf, 0xc4, 0x41, 0x01, 0x5e, 0x95, 0x17, 0x52, 0xf1, 0x53, 0x77, 0xdc, 0x68, 0x62, 0x64, 0xd0, 0x62, 0x9b, 0x73, 0xd0, 0xec, 0xd6, 0x1e, 0x9a, 0xef, 0xea, 0xc6, 0xb7, 0x17, 0x83, 0x74, 0x70, 0xb4, 0x0b, 0x77, 0x7b, 0xab, 0xb5, 0x00, 0x9f, 0xe9, 0x20, 0xc6, 0xf3, 0x3e, 0xc3, 0x1b, 0x5f, 0x53, 0x08, 0x46, 0x5c, 0x4e, 0x03, 0x8f, 0x4f, 0xdc, 0xdc, 0x9d, 0x02, 0xba, 0x9c, 0xd9, 0xca, 0x0d, 0x6d, 0xe7, 0x33, 0xb0, 0xf5, 0x37, 0x8d, 0x04, 0xb0, 0x95, 0x1e, 0x39, 0x8b, 0x15, 0xcc, 0xc6, 0x15, 0x86, 0x41, 0x41, 0x71, 0xb4, 0x48, 0x29, 0x67, 0x97, 0x3f, 0x96, 0x52, 0x1f, 0x75, 0x8a, 0xd7, 0x68, 0xae, 0xa1, 0x66, 0xc5, 0x18, 0xaa, 0x59, 0xbd, 0x8e, 0xa5, 0xa2, 0x89, 0x73, 0x36, 0xa5, 0x01, 0xdd, 0x4a, 0x29, 0xea, 0x1f, 0x03, 0x9a, 0xbc, 0x30, 0x80, 0xa5, 0xa8, 0x44, 0xc1, 0xa3, 0xc5, 0x32, 0xd7, 0x6b, 0xdf, 0x6e, 0xba, 0xd2, 0x02, 0x61, 0x7a, 0x48, 0xb4, 0x8a, 0xa3, 0x7b, 0x26, 0x4d, 0x1b, 0x76, 0x52, 0xd7, 0x4b, 0x18, 0xe7, 0xa0, 0x5a, 0xf3, 0x5e, 0x05, 0x4a, 0x16, 0x65, 0xe3, 0xa2, 0x52, 0x06, 0xa2, 0x68, 0x52, 0x14, 0x00, 0xd3, 0x76, 0xb4, 0xdc, 0x9c, 0xe1, 0x7d, 0xaf, 0xb3, 0x78, 0xe1, 0x1a, 0xf0, 0xa6, 0xbb, 0x72, 0x8b, 0x4c, 0xc7, 0x44, 0xc7, 0xa0, 0xcf, 0x96, 0xf1, 0xfc, 0x1b, 0x6d, 0x92, 0x96, 0x37, 0x21, 0x2b, 0xfa, 0x00, 0xa5, 0x92, 0xd2, 0x38, 0xe9, 0x22, 0xf9, 0x7c, 0xf6, 0x6e, 0x7d, 0xad, 0xd0, 0xd6, 0x46, 0xa7, 0x4a, 0x38, 0x85, 0xe8, 0xce, 0x6a, 0xc8 }; +constexpr AccessUnit AC3_SIZE_MISMATCH_EXPECTED_AU = { 0x15f90, 0x159b2, false, 0, {}, { 0x3d, 0x29, 0x18, 0x6e, 0x61, 0xd9, 0x34, 0x8e, 0x10, 0xc9, 0x57, 0xdd, 0x59, 0x03, 0xca, 0x97, 0x43, 0xdf, 0x1f, 0xd3 } }; + + +const std::vector M2V_SEQUENCE_END_SPLIT_STREAM = { 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xe0, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0xf2, 0x26, 0xae, 0xd3, 0xf0, 0x56, 0xd2, 0xd9, 0x26, 0xf4, 0x15, 0xd1, 0x9e, 0xbd, 0x68, 0x9d, 0x99, 0x4a, 0x77, 0xcf, 0x6c, 0xea, 0x0a, 0xbe, 0x4b, 0x6c, 0x0f, 0x35, 0x82, 0xf6, 0xef, 0x3d, 0xce, 0x01, 0x6c, 0x79, 0x05, 0x4e, 0xff, 0xb3, 0xca, 0x99, 0xd2, 0x78, 0xdd, 0xf0, 0x68, 0xea, 0x2c, 0x8f, 0x8f, 0xcd, 0x9e, 0x33, 0x8e, 0x0d, 0xe4, 0xf7, 0x67, 0x03, 0x2c, 0x75, 0x5c, 0x05, 0xbf, 0x6a, 0x5d, 0x78, 0x35, 0x68, 0x9d, 0x40, 0xaa, 0xde, 0x5e, 0xde, 0x1c, 0xcb, 0x4a, 0x61, 0x54, 0x61, 0x3a, 0x88, 0xee, 0x47, 0x71, 0xe1, 0xaa, 0xca, 0x47, 0x21, 0xeb, 0x9d, 0x5b, 0xf5, 0x51, 0xc1, 0x08, 0xdb, 0xd1, 0x75, 0x1b, 0x7f, 0x41, 0x7c, 0x99, 0xd1, 0xaa, 0x55, 0x84, 0xf7, 0xac, 0x85, 0xdc, 0x38, 0xf2, 0x26, 0x70, 0xe1, 0x73, 0x49, 0x19, 0x19, 0x1d, 0xbd, 0x77, 0x7a, 0xc5, 0xc5, 0xeb, 0xb9, 0x12, 0x07, 0x4b, 0x06, 0x6b, 0x83, 0x27, 0x8b, 0x66, 0x5a, 0xf5, 0x81, 0x38, 0x77, 0x75, 0x59, 0xda, 0xac, 0x22, 0x41, 0xe6, 0xcf, 0x49, 0xaf, 0xd1, 0x9e, 0x1d, 0xf3, 0x3d, 0x98, 0x05, 0x11, 0x64, 0x8c, 0x86, 0x36, 0x75, 0xc5, 0xd4, 0x7a, 0xda, 0x76, 0x11, 0x6f, 0x5f, 0x60, 0x6f, 0x36, 0xd5, 0x8f, 0x0a, 0xa4, 0x1c, 0x51, 0x9e, 0x10, 0x9c, 0x66, 0xe9, 0xac, 0xdf, 0xde, 0x6f, 0xcc, 0xb8, 0xd6, 0x24, 0xee, 0xe2, 0xaf, 0x5e, 0x75, 0xe0, 0x34, 0x0f, 0x6f, 0xa3, 0x85, 0xbe, 0x61, 0x7b, 0xcf, 0xca, 0x06, 0xf6, 0xf5, 0x02, 0x3b, 0xdb, 0x4f, 0x17, 0x0f, 0x72, 0xdf, 0x97, 0x88, 0xe5, 0xb1, 0x89, 0x9e, 0xec, 0xca, 0x65, 0xb2, 0x40, 0x1f, 0xb4, 0x94, 0x15, 0x34, 0xfe, 0xa6, 0xb4, 0x0f, 0xa7, 0x7f, 0x0b, 0xf7, 0x59, 0x1d, 0x39, 0xef, 0x70, 0xcc, 0x5d, 0x70, 0x01, 0x0e, 0xee, 0xb5, 0x85, 0x56, 0xe8, 0x04, 0xe3, 0x10, 0xae, 0x6e, 0x70, 0xad, 0xf5, 0x56, 0xbe, 0xc8, 0x01, 0xbc, 0x42, 0xd0, 0x50, 0x05, 0xb7, 0xfd, 0x0f, 0x5a, 0x73, 0xec, 0x0c, 0xef, 0x18, 0xd0, 0xb5, 0xbb, 0x9f, 0x62, 0xac, 0x8e, 0xfc, 0x53, 0xac, 0xec, 0x4f, 0x81, 0x98, 0xef, 0x24, 0x46, 0xb5, 0x71, 0x8d, 0xd2, 0xf4, 0xec, 0x60, 0x34, 0x2c, 0x5f, 0xd3, 0x33, 0xfb, 0xcb, 0x20, 0xe1, 0xb2, 0x66, 0x66, 0x4d, 0x39, 0xb0, 0xa2, 0xfc, 0x0f, 0x5f, 0x52, 0xfc, 0x69, 0xe7, 0xf7, 0xc0, 0xd7, 0xc6, 0x36, 0xe0, 0x23, 0x1d, 0x62, 0xe3, 0x3f, 0xb2, 0x66, 0x6b, 0x1f, 0x88, 0x39, 0x21, 0xf0, 0x81, 0xf7, 0x73, 0x41, 0x07, 0xb7, 0x04, 0xb6, 0x22, 0xd3, 0xbb, 0x19, 0xd9, 0xfb, 0xd0, 0xb9, 0xa7, 0xfc, 0x58, 0x88, 0x4d, 0xa9, 0xaa, 0x19, 0xaf, 0xfb, 0x1d, 0x1a, 0xec, 0x50, 0x3f, 0xb2, 0x02, 0x63, 0x30, 0xba, 0x50, 0x42, 0xa0, 0x5e, 0x55, 0xc9, 0xb4, 0x92, 0xb6, 0x31, 0x0d, 0x21, 0xa3, 0x8f, 0xd1, 0x76, 0x48, 0x26, 0xa5, 0xf5, 0xa8, 0x86, 0x26, 0xc3, 0x52, 0x66, 0x92, 0x38, 0x0d, 0x0e, 0xf5, 0xd7, 0xee, 0x53, 0x3c, 0x34, 0xa4, 0xf0, 0xdf, 0xda, 0x98, 0x33, 0x28, 0x3e, 0x66, 0xea, 0x5e, 0xec, 0xd1, 0xf1, 0xca, 0x0b, 0x1e, 0x6d, 0x93, 0x59, 0xf8, 0xb6, 0xec, 0x75, 0x1f, 0xe0, 0xa9, 0xd9, 0x47, 0x34, 0xfc, 0x40, 0x10, 0x72, 0xc7, 0xd3, 0x9c, 0x35, 0x58, 0x02, 0x1d, 0x2b, 0x5f, 0x2c, 0xa1, 0xcc, 0xbf, 0x3a, 0x4d, 0xde, 0x03, 0xc8, 0x51, 0x1e, 0x6a, 0xd3, 0xe8, 0x71, 0x50, 0x63, 0x9f, 0x1b, 0x42, 0xd0, 0x0a, 0xca, 0xc5, 0x19, 0xc8, 0x7f, 0xf0, 0xd1, 0x65, 0x6e, 0x49, 0xb1, 0x55, 0xbf, 0x14, 0x12, 0x07, 0xfe, 0xb1, 0xda, 0x1b, 0xc0, 0xd0, 0xf8, 0x5f, 0x03, 0xf0, 0x92, 0x8e, 0x45, 0xd8, 0xe7, 0xaa, 0x46, 0x4b, 0x10, 0xfa, 0xc2, 0xdd, 0x67, 0xdd, 0x9b, 0x67, 0x3d, 0xbd, 0xa9, 0xd7, 0x63, 0x08, 0x74, 0xd9, 0xc3, 0x64, 0x2c, 0x5f, 0xc8, 0x1c, 0x70, 0x8e, 0x01, 0x4f, 0x72, 0x83, 0xe3, 0x80, 0x21, 0x9e, 0xb6, 0x3f, 0x31, 0xe4, 0x07, 0xb0, 0xfa, 0xf6, 0xd3, 0x4b, 0xc7, 0xb8, 0xf0, 0xf9, 0xcd, 0xe3, 0x81, 0x30, 0xfd, 0x29, 0xdd, 0xc5, 0xc7, 0x01, 0xc3, 0xef, 0xd2, 0xff, 0x45, 0x1c, 0xff, 0x16, 0x72, 0x5a, 0x65, 0x4a, 0x61, 0x97, 0xf1, 0xc1, 0xa6, 0xee, 0x69, 0xa5, 0xc8, 0x74, 0x79, 0x9e, 0xf0, 0x27, 0xc4, 0x2d, 0x45, 0xb3, 0x91, 0x41, 0x41, 0xd9, 0x7b, 0x6f, 0x12, 0x55, 0xe9, 0x01, 0x6c, 0xeb, 0x3c, 0x90, 0x2f, 0xee, 0x9d, 0xa0, 0x5c, 0x7a, 0x5b, 0xa7, 0x01, 0xca, 0x31, 0xd3, 0xfc, 0xb4, 0xd7, 0x25, 0xbe, 0xc3, 0xa0, 0xde, 0xa9, 0x74, 0x7c, 0x6d, 0x0b, 0xd2, 0x47, 0x76, 0x4a, 0x3f, 0x8e, 0xbd, 0xe3, 0x38, 0xfb, 0xf6, 0x4d, 0xaf, 0x9b, 0xb8, 0xba, 0x50, 0xaa, 0x60, 0x81, 0xd4, 0x0e, 0x8d, 0x6b, 0xd2, 0x9b, 0xdd, 0x22, 0xf0, 0x38, 0x4b, 0xef, 0xd0, 0x34, 0x76, 0x65, 0x53, 0xd5, 0xcf, 0x41, 0xe3, 0xaa, 0x1d, 0xa1, 0xd7, 0xa7, 0xdb, 0x75, 0xc6, 0x69, 0xf0, 0x71, 0xbe, 0x98, 0x06, 0xe6, 0x8e, 0x04, 0x6e, 0x7d, 0x89, 0x24, 0xc6, 0xa4, 0x53, 0xa6, 0x68, 0x6a, 0xdf, 0xb3, 0xa3, 0xbe, 0x9f, 0x76, 0x17, 0xa1, 0x5f, 0x18, 0x60, 0xf0, 0x85, 0x23, 0x67, 0x04, 0x0e, 0x48, 0x93, 0x49, 0x84, 0xc3, 0x11, 0x30, 0x0a, 0x8c, 0x86, 0x00, 0x42, 0x0b, 0x71, 0xc0, 0x6c, 0xb9, 0xd2, 0x7f, 0x75, 0x30, 0x17, 0x37, 0x2c, 0x48, 0x96, 0xe0, 0xc0, 0x1d, 0xdf, 0x45, 0xcd, 0xc5, 0x69, 0xcb, 0xcf, 0x2d, 0x55, 0x7b, 0x0a, 0x14, 0x44, 0x68, 0xd2, 0x55, 0x6a, 0xa4, 0xe7, 0x62, 0x87, 0x43, 0x9d, 0x04, 0x26, 0x7e, 0x2e, 0x6a, 0x25, 0x8c, 0x45, 0x20, 0x26, 0xfc, 0x6a, 0x10, 0xfc, 0x41, 0x04, 0x1e, 0x1c, 0x0e, 0xf4, 0x0c, 0xdb, 0x82, 0x60, 0xc5, 0x1c, 0x11, 0xdc, 0x17, 0x07, 0x01, 0xa5, 0x83, 0x24, 0xa8, 0x7b, 0x4c, 0x7f, 0xf2, 0x92, 0x3e, 0x5f, 0xce, 0x2a, 0xf5, 0xa9, 0x73, 0x17, 0xe2, 0x0a, 0x11, 0x8b, 0x10, 0x18, 0x1e, 0x0a, 0x97, 0xcd, 0xdb, 0x51, 0x6a, 0x5a, 0x69, 0x69, 0x61, 0x06, 0x9c, 0xd3, 0x80, 0xfa, 0xe3, 0xac, 0x8b, 0x9e, 0xbf, 0xbe, 0x1d, 0x35, 0x95, 0xda, 0xd8, 0x42, 0xcf, 0x01, 0xca, 0x88, 0x02, 0x2a, 0x93, 0x1e, 0xa8, 0xd7, 0xe6, 0x60, 0x4c, 0xac, 0x14, 0x16, 0x4b, 0x50, 0xda, 0x7a, 0x72, 0x3b, 0x1a, 0xeb, 0x52, 0x2e, 0xc9, 0xa1, 0x96, 0x2a, 0xc9, 0x73, 0x4d, 0xe2, 0x06, 0xff, 0xe4, 0xa7, 0xf1, 0xf4, 0x32, 0x4e, 0x5f, 0xd8, 0x37, 0x9a, 0x51, 0x48, 0x6c, 0xf3, 0x31, 0xb5, 0x3c, 0x10, 0xb6, 0xc1, 0x74, 0xa8, 0xad, 0x53, 0x64, 0x7d, 0xc5, 0xa2, 0x21, 0xf8, 0x00, 0xd6, 0x48, 0x05, 0xd7, 0x59, 0x65, 0xa2, 0xaa, 0x61, 0xd1, 0x69, 0xd6, 0xf7, 0xe2, 0xf3, 0x03, 0xd3, 0x1a, 0xeb, 0xaa, 0x99, 0x5f, 0xc6, 0x9f, 0x97, 0x3b, 0x80, 0x7c, 0x98, 0xdd, 0xf0, 0x87, 0xde, 0x03, 0xec, 0x82, 0xe4, 0xce, 0x55, 0xb3, 0xda, 0x42, 0x8b, 0xbf, 0xc6, 0x51, 0xfd, 0x20, 0x21, 0xff, 0xb6, 0x0b, 0xe6, 0x80, 0x74, 0x6d, 0x45, 0x9a, 0xe5, 0x63, 0x6d, 0x30, 0xe9, 0x1a, 0x0c, 0x42, 0x48, 0x08, 0xa5, 0xd5, 0xa3, 0x91, 0x38, 0x7d, 0xc7, 0x73, 0x4c, 0xef, 0x26, 0xad, 0x46, 0x61, 0xed, 0x38, 0x73, 0xa5, 0x1e, 0x0d, 0x7b, 0x1e, 0xe6, 0x62, 0xa4, 0x96, 0x7b, 0x6d, 0x52, 0x7b, 0x3d, 0x56, 0xb5, 0x41, 0xab, 0xe4, 0xa8, 0xd0, 0x94, 0x1a, 0x15, 0x7e, 0x34, 0x23, 0xab, 0x77, 0xcb, 0xee, 0x85, 0x0e, 0x2f, 0x1b, 0xf7, 0x74, 0x49, 0x31, 0xd8, 0xfa, 0xf2, 0xd5, 0xbf, 0xa6, 0xe3, 0x65, 0x46, 0x77, 0x9c, 0x69, 0x67, 0x13, 0x20, 0xd9, 0xfc, 0xed, 0xc7, 0x12, 0x2b, 0xf1, 0x98, 0x40, 0xbb, 0x8e, 0x87, 0xe2, 0x1a, 0xa2, 0x4a, 0xe7, 0x7f, 0x3a, 0xda, 0xbe, 0x21, 0xcd, 0x9e, 0xb2, 0x75, 0x52, 0xb2, 0x97, 0x48, 0x08, 0xe2, 0x9a, 0x84, 0x2b, 0x47, 0x00, 0x94, 0xe0, 0x81, 0x4e, 0xef, 0x6c, 0xca, 0x21, 0x7c, 0x65, 0xe9, 0x0a, 0x41, 0x16, 0xc3, 0x8e, 0x59, 0xd2, 0xf1, 0x18, 0x31, 0xde, 0xef, 0xfb, 0x2b, 0xcc, 0x42, 0x8d, 0x51, 0xcd, 0x07, 0x98, 0x76, 0x90, 0x3c, 0x75, 0xb7, 0x68, 0x77, 0xec, 0x41, 0xd5, 0xca, 0x38, 0x8e, 0x10, 0xf8, 0xe3, 0xa5, 0x05, 0x14, 0xac, 0xc7, 0x78, 0x61, 0xde, 0xc6, 0xe0, 0x14, 0x2e, 0x04, 0x4f, 0xe6, 0x3b, 0x76, 0x9c, 0xa5, 0x43, 0xbf, 0xdb, 0x7e, 0x24, 0xae, 0x62, 0x28, 0x7d, 0xbb, 0x98, 0x98, 0x30, 0x29, 0x56, 0x9f, 0x9d, 0xb5, 0x8a, 0xa5, 0x3d, 0x75, 0xb8, 0x35, 0xea, 0x34, 0xa9, 0x4c, 0xdb, 0xf3, 0x4d, 0x62, 0x19, 0x52, 0x4b, 0xfa, 0x3d, 0xee, 0x93, 0xb6, 0xff, 0x4f, 0x56, 0x0e, 0x84, 0x36, 0x4a, 0xb3, 0x58, 0x36, 0x30, 0x23, 0x72, 0xc8, 0x7c, 0xd2, 0x01, 0x5d, 0xbc, 0xb0, 0xc5, 0x4b, 0x78, 0xf9, 0x7c, 0x66, 0x17, 0x5e, 0x10, 0x80, 0xef, 0x7c, 0xa5, 0x2a, 0xe8, 0x67, 0x01, 0xfa, 0xe3, 0xf0, 0x6d, 0x50, 0x80, 0x6b, 0x88, 0x74, 0x6e, 0x46, 0xd3, 0xad, 0x04, 0xc1, 0x43, 0xb3, 0xe5, 0x17, 0x87, 0x24, 0xfe, 0x6d, 0x46, 0x58, 0x4b, 0xec, 0xf3, 0x62, 0x66, 0x39, 0x2d, 0xbb, 0xfe, 0x8b, 0x5c, 0xf0, 0x81, 0x4f, 0xe4, 0x82, 0xdd, 0x9d, 0xac, 0x6d, 0x7e, 0xb1, 0x77, 0x16, 0x49, 0xbe, 0xd3, 0x28, 0x10, 0xc7, 0xb3, 0xbf, 0xc6, 0x0b, 0x5e, 0x8a, 0xd9, 0x5c, 0xf6, 0xd7, 0x5d, 0xde, 0x27, 0xba, 0x04, 0xd9, 0xdc, 0xbb, 0x01, 0xd4, 0x10, 0x46, 0xdd, 0x60, 0x75, 0xea, 0xf1, 0x8e, 0xbc, 0xf1, 0xf8, 0x67, 0xee, 0x1c, 0x51, 0x3e, 0xe9, 0xd5, 0xfa, 0x25, 0xa1, 0x0f, 0x0f, 0x8c, 0x8e, 0x89, 0x77, 0xe5, 0xe6, 0x1a, 0x28, 0x34, 0x16, 0x85, 0x94, 0x5b, 0x83, 0xe3, 0xde, 0xfe, 0x91, 0x29, 0xdc, 0xe1, 0xe6, 0x75, 0xa8, 0x0a, 0xf6, 0x08, 0xe7, 0x4d, 0xad, 0xb5, 0x0e, 0x63, 0xf3, 0x7d, 0xbf, 0xf0, 0xeb, 0xd1, 0x71, 0xe7, 0x76, 0xf5, 0x87, 0xb6, 0x95, 0x44, 0xae, 0x2f, 0x6b, 0x72, 0xbd, 0xd6, 0x69, 0xa3, 0x42, 0xf4, 0x2f, 0x3b, 0xaf, 0x03, 0x6b, 0x56, 0x86, 0x50, 0xa1, 0xfd, 0xcc, 0x93, 0xb3, 0xff, 0xc3, 0x72, 0xfe, 0x7c, 0x56, 0x94, 0x74, 0x70, 0xeb, 0xea, 0x83, 0x9c, 0xcc, 0xed, 0xcf, 0xf9, 0xae, 0xce, 0xfe, 0xa7, 0x3f, 0xf8, 0xb0, 0xba, 0xdf, 0x7a, 0x85, 0x13, 0xb4, 0xe5, 0xf7, 0x6b, 0x24, 0xc6, 0x2c, 0x01, 0x8e, 0x32, 0xb9, 0x29, 0xa6, 0xf1, 0xb7, 0x2e, 0xc6, 0x94, 0xbd, 0xd4, 0x3e, 0x07, 0x57, 0x3a, 0x32, 0xaf, 0x27, 0xbe, 0x66, 0x90, 0x20, 0x8a, 0x45, 0xc9, 0xc5, 0x4f, 0x21, 0x42, 0x95, 0x4a, 0xbc, 0x3c, 0x0d, 0x8d, 0x4e, 0x22, 0xaa, 0x1c, 0xba, 0x2a, 0xb3, 0x69, 0xd9, 0xf4, 0x33, 0x89, 0xde, 0x8f, 0xc5, 0xf0, 0x65, 0x90, 0xb3, 0x62, 0x74, 0x4c, 0x7f, 0xb3, 0xa5, 0x1e, 0x67, 0x62, 0x1e, 0x29, 0x88, 0x6d, 0x2e, 0x65, 0x5c, 0x57, 0xbe, 0x3b, 0xed, 0x77, 0xd0, 0x55, 0xe9, 0xcc, 0x6b, 0xe6, 0x0a, 0xcb, 0xa6, 0x7a, 0x6e, 0x9d, 0xbe, 0x6f, 0xba, 0x87, 0xc8, 0x0d, 0x5d, 0x03, 0xaf, 0xeb, 0xa9, 0x24, 0xb8, 0x51, 0x17, 0x17, 0x1b, 0x73, 0xd8, 0x26, 0xbf, 0x89, 0xeb, 0x27, 0x68, 0xff, 0x18, 0x9e, 0xc6, 0x70, 0xb5, 0x15, 0x17, 0xc0, 0x5b, 0x7b, 0x93, 0xd2, 0x0f, 0x26, 0x8f, 0x36, 0x2a, 0x1b, 0x6c, 0x97, 0x77, 0x69, 0xaf, 0x17, 0xeb, 0xf2, 0x3e, 0x96, 0xc4, 0xf9, 0xba, 0xce, 0xb8, 0x57, 0xb7, 0x46, 0x79, 0xe8, 0x5c, 0xfd, 0x75, 0xdd, 0x03, 0xbe, 0x37, 0x5a, 0x51, 0x63, 0xc1, 0xa7, 0xb9, 0x92, 0x68, 0x23, 0xb1, 0x74, 0x84, 0x49, 0xe2, 0x8e, 0xc1, 0x94, 0x6f, 0x3d, 0x89, 0xdf, 0x11, 0xc0, 0xfc, 0x00, 0x0c, 0x17, 0xdc, 0x6e, 0x92, 0x37, 0xde, 0x91, 0xf5, 0x18, 0x41, 0x90, 0x58, 0xc4, 0x8b, 0xe8, 0x58, 0xd7, 0x87, 0xe6, 0x27, 0xc9, 0xce, 0x7b, 0xc0, 0x2e, 0xf8, 0xd6, 0x1c, 0x7c, 0xe3, 0x79, 0x95, 0x92, 0x1f, 0x71, 0xd8, 0x9f, 0x7f, 0x0f, 0x25, 0x99, 0x03, 0x0f, 0x81, 0xc7, 0x25, 0x5d, 0x49, 0x51, 0xad, 0xc8, 0x9b, 0x62, 0x87, 0x32, 0x62, 0x18, 0xef, 0xb0, 0x72, 0x56, 0xb4, 0x99, 0xa9, 0xff, 0xb0, 0xa0, 0x6a, 0xb6, 0xf7, 0xad, 0x53, 0xd4, 0xd8, 0xc4, 0xc5, 0xa6, 0x9a, 0x94, 0x37, 0x8d, 0x0d, 0xc6, 0x56, 0x90, 0x00, 0x4a, 0x35, 0x70, 0x60, 0x5a, 0x47, 0x58, 0x1d, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x11, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0xb7, 0xde, 0xad, 0xbe, 0xef, 0x92, 0x8a, 0xad, 0x4b, 0x8e, 0x21, 0x89, 0xdc, 0xf8, 0x7d, 0x5b, 0x89, 0xa1, 0x2a, 0x4b, 0xb2, 0xff, 0xa4, 0x5e, 0x1c, 0x1f, 0x0f, 0x4c, 0x68, 0x16, 0x18, 0x5e, 0x99, 0xbd, 0x17, 0x33, 0x71, 0x7c, 0x20, 0x20, 0xf1, 0xab, 0x29, 0x8f, 0x99, 0xd3, 0x63, 0xd7, 0x9d, 0x6e, 0xac, 0x4e, 0x23, 0x68, 0xb2, 0x51, 0x45, 0x5e, 0xe4, 0x57, 0x53, 0x49, 0x2c, 0x78, 0x20, 0xba, 0xd2, 0xb6, 0xf8, 0xef, 0x3e, 0xb8, 0xea, 0x7f, 0x79, 0xc8, 0x57, 0xbc, 0x72, 0xdf, 0x31, 0x38, 0x38, 0x33, 0xd8, 0xe4, 0x9c, 0x00, 0x0f, 0x94, 0xb3, 0x63, 0xbd, 0x27, 0xde, 0x73, 0x58, 0x24, 0xaf, 0x73, 0xd1, 0x63, 0xc8, 0xb3, 0x28, 0x0d, 0x12, 0x88, 0x20, 0xbe, 0x3c, 0x67, 0x72, 0x1c, 0x71, 0x92, 0x8a, 0xc8, 0x64, 0x53, 0xaf, 0x30, 0xd3, 0xd3, 0xe8, 0xa1, 0x36, 0x39, 0xba, 0xe6, 0x63, 0xe7, 0x72, 0x8d, 0x78, 0xc0, 0xf3, 0xf4, 0xaf, 0x5a, 0xc8, 0xc1, 0x08, 0x20, 0xe4, 0xf9, 0x49, 0xdb, 0xcf, 0x85, 0x4e, 0x5d, 0x63, 0x7f, 0xcf, 0x8e, 0xdf, 0xaf, 0xa3, 0x3a, 0xfd, 0x6e, 0x05, 0xc7, 0xe7, 0x34, 0xd6, 0x78, 0x05, 0x0c, 0x8a, 0xe3, 0xd6, 0x4c, 0x55, 0x2a, 0xfa, 0xa4, 0xd0, 0x27, 0x0a, 0xde, 0x36, 0xa1, 0x92, 0xd2, 0xb2, 0xf0, 0x09, 0xd5, 0xf6, 0xf2, 0x8b, 0x2c, 0x13, 0x7c, 0xe9, 0xfc, 0xe5, 0x3f, 0xd3, 0x74, 0x5d, 0xd4, 0x99, 0x3c, 0xd4, 0xc9, 0x64, 0x7a, 0x65, 0xf8, 0x13, 0x34, 0x50, 0x0b, 0xab, 0x08, 0x77, 0x1a, 0x94, 0x0d, 0xcd, 0xb2, 0xef, 0x20, 0x15, 0xf9, 0x5b, 0x33, 0x21, 0x95, 0xf5, 0x70, 0x19, 0x3d, 0x1c, 0x26, 0xe9, 0x54, 0x8c, 0x46, 0x32, 0x13, 0x36, 0x64, 0x4f, 0x19, 0x7f, 0xd9, 0xa4, 0xc8, 0xd7, 0x1a, 0x8d, 0x20, 0xb0, 0x30, 0xba, 0xcf, 0x2b, 0xd5, 0x7e, 0x30, 0x67, 0x83, 0x88, 0xf0, 0x3b, 0x5d, 0x9d, 0x6b, 0x59, 0x51, 0xd4, 0xdc, 0x5d, 0xa4, 0x65, 0xa2, 0x81, 0x4b, 0x19, 0xcd, 0xab, 0x37, 0x76, 0x67, 0x44, 0xaf, 0x3f, 0xdd, 0x74, 0xd6, 0x01, 0x61, 0xf2, 0x8f, 0xf7, 0x9e, 0x55, 0x3f, 0xe7, 0xb0, 0x2f, 0x65, 0x1f, 0x64, 0xf2, 0x47, 0x61, 0x48, 0xa3, 0x12, 0xad, 0x4e, 0x0d, 0x11, 0x31, 0x08, 0xba, 0x4a, 0x76, 0x32, 0x3f, 0x90, 0x69, 0x80, 0x3e, 0x42, 0x8e, 0xea, 0x18, 0xac, 0x25, 0x6f, 0x7e, 0x95, 0xff, 0x41, 0xd7, 0x84, 0xf3, 0x5e, 0xea, 0x7f, 0x40, 0x2d, 0xbf, 0x63, 0xf7, 0xe3, 0xe7, 0xbf, 0x6b, 0xdb, 0xdb, 0x44, 0x40, 0x78, 0x9c, 0x6c, 0xa1, 0x17, 0x1a, 0xf4, 0x8f, 0x55, 0xe7, 0x41, 0xf2, 0x1b, 0x52, 0xe9, 0x6e, 0x3b, 0x66, 0x63, 0x3a, 0x89, 0x81, 0x40, 0x02, 0xea, 0x6b, 0x2e, 0x81, 0xd5, 0xbe, 0x4b, 0x73, 0x8a, 0x7f, 0xd7, 0x9e, 0x8b, 0xf7, 0xc8, 0x05, 0xb7, 0x48, 0xbb, 0xb0, 0x5d, 0xe8, 0x92, 0xbf, 0x5f, 0xdd, 0xcc, 0x32, 0x42, 0xb7, 0x6b, 0xff, 0x1d, 0x8a, 0x45, 0xe3, 0x9e, 0xaa, 0x57, 0x3a, 0x2d, 0x54, 0xbf, 0x98, 0x04, 0x5b, 0x29, 0xb3, 0x10, 0xcc, 0x4c, 0x4b, 0xec, 0x5f, 0x94, 0xfe, 0xba, 0x04, 0x77, 0x4d, 0x1c, 0x84, 0x2e, 0x44, 0xe5, 0x4a, 0xcb, 0x11, 0x89, 0x30, 0x46, 0xda, 0x8a, 0xb9, 0x1a, 0xda, 0x6f, 0xc5, 0x24, 0xc9, 0xff, 0xa1, 0xf8, 0x00, 0x6c, 0x44, 0xaa, 0x48, 0x5d, 0x9e, 0xa8, 0xe5, 0x74, 0xda, 0xe3, 0x11, 0x0a, 0x67, 0xca, 0xb9, 0x5c, 0x68, 0xed, 0x21, 0x5b, 0x09, 0x65, 0x3c, 0x4a, 0xe9, 0x72, 0xbb, 0xad, 0x27, 0xb7, 0xe5, 0x5f, 0x0c, 0xfd, 0x04, 0xba, 0xcf, 0x71, 0x6b, 0x71, 0x62, 0x9e, 0xec, 0x40, 0x2c, 0x29, 0x87, 0x5a, 0xef, 0x1d, 0x18, 0xee, 0xd1, 0x67, 0x9b, 0xea, 0x35, 0x9c, 0xc5, 0xb3, 0x7a, 0xcd, 0x80, 0xbc, 0xd4, 0xf7, 0x38, 0x56, 0x9b, 0x02, 0xca, 0x61, 0xa1, 0x8d, 0x15, 0x96, 0x8d, 0xe8, 0xb6, 0xb1, 0xb9, 0x74, 0xc8, 0x9b, 0x73, 0xa9, 0xe6, 0x16, 0x81, 0x9e, 0xb2, 0xf8, 0x5a, 0x56, 0xf2, 0x9e, 0x8c, 0x26, 0xe7, 0xc5, 0x40, 0xbf, 0xd8, 0x94, 0x91, 0x04, 0x21, 0x0c, 0x00, 0x04, 0x7e, 0x78, 0x12, 0x5a, 0x6e, 0x69, 0x57, 0xb6, 0x27, 0xa6, 0x39, 0xe5, 0xe5, 0x00, 0x0e, 0xe0, 0xe2, 0xe1, 0x4b, 0x83, 0x9d, 0x51, 0x00, 0xfc, 0xa9, 0xb7, 0x46, 0xf5, 0x99, 0x1a, 0x1f, 0xfe, 0x54, 0x81, 0x2e, 0xe3, 0x63, 0xcb, 0x73, 0xc4, 0x5b, 0x8f, 0x2d, 0x0d, 0x76, 0x83, 0x3c, 0xe1, 0x80, 0x5b, 0xdc, 0x71, 0x8d, 0x6a, 0x3b, 0xdc, 0xae, 0x31, 0x4a, 0xc6, 0xfb, 0x6e, 0x1c, 0xc3, 0xdb, 0xb5, 0xa0, 0x83, 0x7a, 0x34, 0xfb, 0x89, 0x57, 0xa4, 0xd5, 0x7c, 0x46, 0x5e, 0xa7, 0x79, 0xf7, 0x75, 0x01, 0x72, 0x43, 0x4e, 0x7a, 0x1f, 0xed, 0x39, 0x09, 0xd2, 0x80, 0xf9, 0x6a, 0x7a, 0x41, 0x6f, 0x0b, 0x5f, 0x97, 0x35, 0xe1, 0xa0, 0x35, 0xaf, 0xba, 0x36, 0x45, 0xad, 0xf4, 0x49, 0xbe, 0x74, 0x42, 0x02, 0xea, 0x3b, 0xf1, 0xd5, 0x7d, 0x67, 0x7e, 0x66, 0x98, 0xb8, 0x76, 0x00, 0xbd, 0x9a, 0xd7, 0x17, 0x2d, 0xd7, 0x8e, 0xe6, 0xed, 0xe6, 0xf0, 0x3e, 0x67, 0x94, 0xde, 0xf3, 0x39, 0x78, 0xb6, 0x0e, 0x60, 0xe2, 0xd6, 0xeb, 0xfe, 0x98, 0x84, 0xcc, 0xb1, 0xa2, 0xa2, 0x8f, 0x28, 0x10, 0x60, 0xd8, 0xbd, 0x6d, 0x00, 0x8d, 0xb8, 0x9d, 0x11, 0x2f, 0x73, 0xf9, 0x79, 0xbf, 0xf2, 0x18, 0xa2, 0x27, 0x5d, 0x0c, 0xef, 0x29, 0x40, 0x3f, 0x0d, 0x45, 0xb4, 0x96, 0xb9, 0xc6, 0x44, 0xa3, 0x4b, 0x09, 0x9b, 0xa9, 0x93, 0x16, 0xf0, 0x3d, 0xa1, 0x24, 0x13, 0xcd, 0x39, 0x13, 0xe6, 0x4b, 0x48, 0x1b, 0xc7, 0x3a, 0x4a, 0xcf, 0x9e, 0xbd, 0x5c, 0x18, 0x1f, 0x36, 0xbc, 0x83, 0xbe, 0x79, 0xb6, 0x96, 0xe0, 0x55, 0x76, 0x9f, 0x29, 0x7b, 0xac, 0x6e, 0x5a, 0x7b, 0xb2, 0x83, 0x5a, 0xbe, 0xe4, 0x41, 0xe1, 0xfb, 0x1c, 0x3f, 0x32, 0x42, 0x79, 0x57, 0x93, 0xdd, 0x8a, 0xd6, 0x65, 0x8d, 0x60, 0x46, 0xda, 0xc8, 0x84, 0x60, 0xdb, 0x78, 0x69, 0xef, 0xe5, 0xa6, 0x7c, 0xa5, 0x22, 0xef, 0x23, 0x51, 0xd6, 0xe6, 0x04, 0x66, 0xf4, 0x62, 0xd8, 0x0b, 0x59, 0x94, 0x16, 0xd8, 0xf6, 0xce, 0x9f, 0xa1, 0x0e, 0x81, 0x8a, 0x54, 0xab, 0x78, 0x1e, 0xff, 0xb9, 0x59, 0x25, 0x7a, 0x43, 0x52, 0xa3, 0xc2, 0x74, 0xb8, 0xa0, 0x29, 0x27, 0x98, 0xf3, 0x18, 0xe2, 0x6e, 0x7b, 0x8b, 0x48, 0x73, 0xc5, 0x3b, 0x1c, 0xb1, 0x16, 0x40, 0x68, 0x9a, 0xbe, 0x16, 0x48, 0xaa, 0x07, 0xef, 0x40, 0xc1, 0xec, 0xdb, 0x4e, 0x94, 0x8c, 0x54, 0x41, 0xa2, 0x66, 0x33, 0x53, 0xf9, 0x6e, 0x4d, 0xcc, 0x62, 0x24, 0x33, 0x02, 0xeb, 0x91, 0xbe, 0xeb, 0x95, 0x34, 0xa7, 0x0e, 0x88, 0xfb, 0x1f, 0x6b, 0x15, 0xe0, 0x17, 0xc0, 0x6d, 0x6b, 0x4f, 0x78, 0x5a, 0x7c, 0x36, 0xae, 0xe6, 0x7e, 0xff, 0x00, 0x7c, 0x27, 0x94, 0xc6, 0xd4, 0xa1, 0x22, 0x2a, 0x83, 0x64, 0x34, 0x6e, 0x71, 0x0f, 0x4e, 0x98, 0xb7, 0xc9, 0x78, 0xfb, 0x6d, 0xaa, 0x35, 0x56, 0x16, 0x20, 0x1b, 0x9f, 0x66, 0xec, 0x80, 0x3e, 0xc5, 0x5a, 0x61, 0x69, 0x7c, 0x0c, 0x70, 0x03, 0x23, 0xe8, 0xa5, 0x97, 0x22, 0x62, 0xe6, 0x47, 0xb3, 0x61, 0xe3, 0x1e, 0xd7, 0x77, 0xc8, 0xea, 0x12, 0xf6, 0x0c, 0xf5, 0xca, 0xde, 0xc3, 0x33, 0x97, 0x93, 0xcc, 0x7b, 0xca, 0x75, 0xda, 0x71, 0x10, 0x3e, 0xf5, 0xd3, 0xa7, 0x61, 0xd9, 0xa0, 0x3e, 0xe3, 0x2f, 0x78, 0x5f, 0xef, 0xcb, 0x89, 0xa8, 0x8d, 0xb6, 0xb6, 0x9c, 0xe9, 0x55, 0x45, 0x12, 0xf9, 0x46, 0x55, 0x94, 0xd3, 0x96, 0x0f, 0x12, 0xb6, 0xdc, 0x25, 0x86, 0xbe, 0xca, 0x13, 0x04, 0xbe, 0xda, 0x39, 0xab, 0x9a, 0x1e, 0xa3, 0x0d, 0x13, 0xa6, 0x19, 0x7b, 0xe5, 0x17, 0xcd, 0x63, 0x4a, 0x6a, 0xab, 0xd7, 0xde, 0xbc, 0x0f, 0x70, 0xa6, 0xb2, 0x60, 0xae, 0xcd, 0xdb, 0x52, 0x59, 0x17, 0x28, 0x15, 0x5c, 0xa9, 0xec, 0x89, 0x29, 0xb4, 0x39, 0x7d, 0x71, 0x2b, 0x47, 0x75, 0x29, 0x43, 0x66, 0xa8, 0x8f, 0x15, 0xb9, 0xb5, 0xc5, 0x69, 0x03, 0xc1, 0x12, 0xf5, 0x3c, 0xeb, 0x22, 0x76, 0x2a, 0x36, 0xc1, 0x5b, 0x5b, 0x4a, 0x21, 0xa7, 0xdd, 0xb5, 0xed, 0x53, 0x93, 0x9f, 0xd1, 0xac, 0xb2, 0x51, 0x08, 0x68, 0x03, 0x73, 0xd3, 0x36, 0x40, 0xca, 0xe1, 0x7b, 0xb8, 0x0b, 0xca, 0xc0, 0x3d, 0xa6, 0x12, 0xf2, 0x55, 0x30, 0xe5, 0xba, 0x2c, 0x26, 0x43, 0xbf, 0x2b, 0x0a, 0x94, 0xcc, 0xb1, 0xd9, 0x3a, 0x2a, 0xa0, 0xb4, 0xeb, 0xaf, 0x7e, 0xb5, 0xad, 0xb9, 0x0b, 0xda, 0xd3, 0xa1, 0x91, 0x25, 0x11, 0x2e, 0x52, 0xc8, 0xf1, 0xd1, 0xba, 0x1a, 0xef, 0xd5, 0x5d, 0x7b, 0x02, 0x1b, 0x8d, 0x34, 0x0f, 0x48, 0x5b, 0x66, 0x68, 0xd2, 0xab, 0xda, 0x16, 0x76, 0x63, 0x13, 0x17, 0x83, 0x60, 0xe4, 0xb0, 0x8f, 0x19, 0x33, 0x2d, 0x38, 0x6a, 0x28, 0x85, 0x5c, 0xbc, 0xea, 0xb1, 0xfb, 0xf8, 0xf2, 0xc6, 0x59, 0x21, 0xb6, 0xf2, 0xc7, 0x7a, 0x7c, 0x9b, 0xd4, 0x58, 0x82, 0xed, 0xac, 0x6a, 0xc4, 0x71, 0xfc, 0x2e, 0xeb, 0x9c, 0xe4, 0xcc, 0x8b, 0x66, 0x5d, 0xd5, 0x1c, 0x12, 0x16, 0x5d, 0x98, 0xa6, 0x2d, 0x6b, 0x75, 0x4e, 0x00, 0x59, 0x36, 0xfe, 0x6c, 0x87, 0x48, 0x47, 0xa9, 0xec, 0x8f, 0xc8, 0x88, 0x66, 0x00, 0xb3, 0x5a, 0xe7, 0xe1, 0xc5, 0x13, 0x3b, 0x57, 0xe7, 0x81, 0xa1, 0xfb, 0x6a, 0x7e, 0xc4, 0xf4, 0xf4, 0xc7, 0xbe, 0x90, 0x3c, 0x6a, 0xcc, 0xed, 0xe9, 0x35, 0xf2, 0x19, 0xc8, 0x6e, 0xa2, 0xbe, 0xae, 0xa0, 0x46, 0x3d, 0x76, 0xcd, 0xcf, 0xae, 0xd6, 0x8c, 0x0c, 0xdf, 0x05, 0x1a, 0x2b, 0xde, 0xbf, 0xc4, 0x0d, 0xe6, 0x74, 0x88, 0xad, 0xc7, 0x39, 0x8c, 0x33, 0x9b, 0x31, 0xaa, 0xc4, 0xc0, 0xab, 0x8d, 0x4b, 0xad, 0x88, 0x87, 0x4a, 0x1b, 0x59, 0xaa, 0xac, 0xfe, 0x11, 0x19, 0xa4, 0xd5, 0x40, 0xb1, 0x18, 0x7c, 0x05, 0xa8, 0x7e, 0x89, 0xda, 0x57, 0x0e, 0xfd, 0x70, 0x59, 0xa5, 0xa0, 0x8c, 0x85, 0x3f, 0xaf, 0x05, 0x8a, 0xe5, 0xd3, 0x98, 0x0a, 0x30, 0x8b, 0x47, 0x44, 0x32, 0x13, 0x97, 0x61, 0xef, 0x11, 0xca, 0x96, 0x8f, 0x78, 0x9c, 0x64, 0x4f, 0x56, 0xb1, 0x5c, 0xdc, 0x3f, 0x24, 0x6c, 0xf2, 0xb6, 0x5b, 0x8b, 0x59, 0x8b, 0xab, 0xa6, 0xb8, 0xfc, 0x41, 0xf5, 0xc1, 0xa4, 0xcc, 0x98, 0xdf, 0x72, 0xe7, 0x8a, 0x3a, 0x9a, 0xe6, 0xd7, 0xbf, 0xf7, 0xa0, 0xc7, 0xf9, 0xe1, 0x51, 0xc0, 0xce, 0x7f, 0x8f, 0x07, 0x36, 0xfa, 0x9d, 0xe6, 0x9f, 0xe6, 0x44, 0xe1, 0xf8, 0xe7, 0x0b, 0xe9, 0xde, 0xe9, 0x6a, 0x7f, 0x08, 0x9e, 0xe9, 0x08, 0xfa, 0x28, 0x87, 0xc5, 0xc7, 0x6d, 0x08, 0xd2, 0xf2, 0x59, 0x20, 0x81, 0xdf, 0xe6, 0x0c, 0x85, 0xb5, 0x10, 0xcd, 0x39, 0x24, 0x0d, 0x67, 0x5c, 0x49, 0x2d, 0x84, 0xc8, 0x2c, 0x81, 0x11, 0xfa, 0x49, 0x27, 0x25, 0xd4, 0x40, 0x7d, 0xee, 0xb1, 0x83, 0x72, 0xd6, 0x53, 0xf2, 0xb6, 0x3c, 0x08, 0x58, 0xf8, 0xe3, 0x5a, 0x9e, 0xa7, 0x9d, 0x8d, 0x26, 0xf2, 0xfd, 0xe0, 0x4e, 0xb8, 0x4a, 0x49, 0x99, 0x97, 0x38, 0xe8, 0xc8, 0xc6, 0x6f, 0x54, 0xe7, 0xa7, 0x64, 0xdd, 0x34, 0x2b, 0x71, 0x60, 0xc9, 0x80, 0xbb, 0x42, 0xbe, 0xfb, 0x57, 0x4f, 0x6c, 0xc4, 0x4d, 0x9b, 0x53, 0x07, 0x58, 0x5b, 0xec, 0x02, 0x00, 0x83, 0xec, 0x5b, 0x6d, 0x9f, 0x03, 0xe2, 0x75, 0x60, 0x18, 0x10, 0xa2, 0xa1, 0xc0, 0xad, 0xe2, 0xad, 0xd1, 0x27, 0x7f, 0x45, 0xdf, 0xa6, 0x9c, 0xb7, 0x9b, 0x62, 0xc7, 0x9c, 0x78, 0xc0, 0x5a, 0x63, 0x7b, 0xda, 0x57, 0x89, 0x32, 0x4c, 0x10, 0x25, 0x38, 0xa8, 0x0a, 0x45, 0x37, 0x3e, 0x10, 0x73, 0xe5, 0x12, 0x65, 0x12, 0x21, 0x9f, 0x1a, 0x74, 0x03, 0x8c, 0xf7, 0x6e, 0xdd, 0x14, 0x32, 0x58, 0xea, 0x80, 0xe0, 0xa7, 0xa1, 0xb5, 0xa8, 0x16, 0xab, 0x62, 0x6f, 0x7d, 0xf1, 0xf2, 0x8f, 0xb0, 0x9d, 0xd6, 0x32, 0x31, 0x15, 0x2e, 0xfe, 0xec, 0xcd, 0xb8, 0x5c, 0xe6, 0x9e, 0x64, 0x04, 0x29, 0xe8, 0xe2, 0xcb, 0x48, 0x11, 0x02, 0x68, 0x56, 0xce, 0xad, 0xf6, 0x5d, 0xd3, 0x90, 0x65, 0x32, 0x75, 0x4d, 0x85, 0xce, 0x15, 0x47, 0x77, 0x90, 0x00, 0xbc, 0x08, 0x38, 0x30, 0xb3, 0x71, 0x49, 0x61, 0xcd, 0x1f, 0xea, 0x12, 0xbe, 0x87, 0x77, 0x32, 0x4c, 0x31, 0xe6, 0xc8, 0x7e, 0x22, 0x37, 0x9b, 0x44, 0x2f, 0xb9, 0x73, 0x46, 0x7a, 0x40, 0x24, 0x07, 0x54, 0x0c, 0xc2, 0x31, 0x9d, 0xa4, 0x2b, 0xc5, 0x7f, 0x4f, 0x6d, 0x23, 0x8a, 0xf9, 0x3e, 0xc0, 0x71, 0xab, 0x32, 0xa9, 0xb9, 0x99, 0x40, 0xbd, 0x06, 0x7b, 0xa4, 0xf6, 0x92, 0xec, 0xab, 0x51, 0xec, 0x46, 0x79, 0x6e, 0x40, 0xbf, 0x69, 0x33, 0xad, 0xe6, 0x37, 0x2b, 0x2d, 0xf9, 0xf5, 0x8b, 0x03, 0xeb, 0x72, 0x80, 0x15, 0xb2, 0x0e, 0xb7, 0x60, 0x51, 0xad, 0xdf, 0x6b, 0x5f, 0xf2, 0x2f, 0xe9, 0x48, 0x86, 0x17, 0xe9, 0x21, 0x9d, 0x00, 0x9c, 0x72, 0x14, 0xa3, 0x6c, 0x08, 0xdb, 0x78, 0x3d, 0x3c, 0xce, 0x60, 0x55, 0x5c, 0x12, 0x17, 0x09, 0x7e, 0xaf, 0x0e, 0x5c, 0x2e, 0xc0, 0x5d, 0xf7, 0xec, 0xb1, 0xa7, 0x84, 0xa7, 0x7c, 0x78, 0x52, 0x9c, 0x75, 0xf6, 0x8d, 0x3b, 0x65, 0x18, 0xc5, 0x06, 0x15, 0x95, 0xdb, 0x35, 0x36, 0x16, 0xc4, 0xd3, 0x78, 0xe9, 0x6c, 0x2c, 0x9a, 0x01, 0x90, 0x80, 0x8c, 0xd4, 0x76, 0xf7, 0x19, 0x84, 0x08, 0xfa, 0x62, 0x6d, 0x97, 0xce, 0x60, 0xd9, 0xdf, 0x2b, 0xb5, 0x72, 0xb0, 0x85, 0x69, 0x76, 0x50, 0x08, 0x84, 0xd2, 0xf2, 0xf1, 0xe0, 0x5e, 0x42, 0x97, 0xac, 0x03, 0x76, 0x9a, 0x1a, 0x88, 0xaa, 0x3a, 0x51, 0xb8, 0x49, 0xa0, 0x0c, 0xf4, 0xd2, 0xca, 0x43, 0x7c, 0xa2, 0xf5, 0xb2, 0x2d, 0x78, 0x19, 0x31, 0x7c, 0xe7, 0x4f, 0xdd, 0x67, 0x57, 0x7c, 0x8e, 0x4b, 0x00, 0x54, 0x17, 0xa0, 0xe5, 0xfc, 0x39, 0x9c, 0x37, 0x91, 0x4e, 0xae, 0xe3, 0xb3, 0x78, 0xa4, 0xcd, 0xc6, 0x7d, 0xe5, 0xa9, 0x63, 0x5e, 0xfd, 0x77, 0x78, 0x98, 0x81, 0x53, 0x5e, 0x25, 0x53, 0x79, 0x9b, 0x21, 0x74, 0xc7, 0x66, 0x63, 0x2c, 0x7c, 0x1e, 0x75, 0x3e, 0x86, 0x98, 0x6b, 0xf1, 0xaa, 0xe6, 0x6f, 0xea, 0x62, 0x84, 0xa4, 0xc1, 0x6e, 0x42, 0x93, 0x06, 0x18, 0x4c, 0xdf, 0x9a, 0xd8, 0x8e, 0x03, 0x08, 0xdb }; +constexpr AccessUnit M2V_SEQUENCE_END_SPLIT_EXPECTED_AU = { 0x15f90, 0x159b2, true, 0, {}, { 0x6f, 0x00, 0x25, 0xed, 0x88, 0xfb, 0x17, 0x95, 0x83, 0x1c, 0xb6, 0x9b, 0xbc, 0x41, 0xd8, 0x1f, 0xf1, 0xb0, 0xd5, 0xa3 } }; + + +constexpr std::array AVC_MULTIPLE_PACK_STREAM = { 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xe0, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x00, 0x00, 0x00, 0x01, 0x09, 0x9a, 0xc4, 0xa0, 0x2d, 0x49, 0x55, 0xcd, 0xbe, 0x15, 0xf7, 0x93, 0xa4, 0xa7, 0x61, 0x41, 0x82, 0xa8, 0x30, 0xe6, 0xd2, 0x14, 0xe8, 0xa4, 0xa4, 0xdd, 0xf1, 0x6b, 0x6a, 0x44, 0x31, 0xfe, 0x64, 0x2c, 0x95, 0x3a, 0x7a, 0x71, 0x21, 0xc7, 0x11, 0x98, 0x91, 0x63, 0x6d, 0x79, 0xec, 0x89, 0x63, 0x3d, 0xe8, 0x95, 0x7e, 0x4e, 0xfc, 0xe3, 0x7e, 0x8b, 0xd8, 0xe7, 0xe8, 0xaa, 0x15, 0x68, 0x28, 0x35, 0x8e, 0x0a, 0x1c, 0xc3, 0x99, 0xeb, 0x1a, 0x76, 0xae, 0x86, 0x8a, 0x33, 0xb3, 0x11, 0xd7, 0x96, 0x2b, 0x32, 0xaf, 0x6b, 0x07, 0xb0, 0x9d, 0x53, 0xb0, 0x5a, 0x87, 0x2f, 0xe8, 0xa0, 0x30, 0xc2, 0x06, 0x69, 0xfa, 0x07, 0x49, 0xf5, 0x6f, 0xca, 0x0a, 0x3d, 0xcc, 0x72, 0x79, 0x9f, 0x66, 0x1f, 0x8f, 0x75, 0x24, 0x79, 0x2a, 0x43, 0x38, 0x07, 0xd4, 0x6e, 0xcc, 0x2b, 0xf1, 0x81, 0xff, 0x73, 0x99, 0x1e, 0x1a, 0x74, 0xfe, 0xc7, 0xad, 0x01, 0x10, 0x40, 0xb7, 0x48, 0x48, 0x1f, 0x00, 0xd3, 0x02, 0xec, 0x3c, 0x60, 0x1e, 0xf0, 0x4f, 0xa3, 0x97, 0xfb, 0x45, 0x49, 0xc8, 0x4a, 0x6a, 0x9b, 0x6f, 0xbc, 0x82, 0xda, 0x6b, 0xfb, 0x40, 0x5b, 0x04, 0x02, 0x6e, 0x19, 0x1d, 0xc7, 0x90, 0x68, 0xa9, 0xde, 0xae, 0x17, 0xf8, 0xed, 0x64, 0x2c, 0xef, 0x7e, 0x4c, 0x83, 0x1f, 0x28, 0xe9, 0x60, 0x09, 0x80, 0xa4, 0x22, 0x38, 0xd6, 0x0c, 0x2b, 0xb0, 0xc8, 0x46, 0x51, 0x0c, 0x56, 0xe9, 0xc3, 0x94, 0x66, 0x35, 0xc0, 0x13, 0x26, 0xda, 0x02, 0x45, 0x07, 0x89, 0x11, 0xcf, 0xdc, 0x4d, 0x31, 0x95, 0x29, 0xbf, 0x31, 0xe1, 0xfc, 0x44, 0x90, 0x1d, 0x56, 0xbe, 0x33, 0x75, 0x9a, 0xc8, 0xc9, 0xe4, 0xb6, 0x74, 0x89, 0x25, 0xd8, 0x55, 0xa2, 0xa4, 0x66, 0xd2, 0x09, 0xbd, 0x88, 0xfa, 0x89, 0x8a, 0x38, 0x8c, 0x20, 0x8c, 0xd2, 0x32, 0xf5, 0x99, 0x26, 0xb9, 0x90, 0x12, 0xe2, 0x40, 0xd9, 0xce, 0xda, 0x39, 0x8d, 0xb7, 0x14, 0xe3, 0x0b, 0x7f, 0xf7, 0x3f, 0xf7, 0x5c, 0x9a, 0xd2, 0xd6, 0x79, 0xe2, 0xc7, 0x5a, 0xd9, 0x8b, 0xd7, 0x37, 0x63, 0x27, 0x5e, 0x8f, 0x41, 0xc5, 0xff, 0x24, 0x28, 0xcc, 0x27, 0x88, 0xc2, 0x87, 0xd0, 0xf2, 0xd6, 0x21, 0x0e, 0x91, 0x3a, 0x40, 0xc5, 0x3c, 0x44, 0x63, 0x6c, 0xa1, 0x20, 0x13, 0x86, 0x86, 0x03, 0x72, 0x91, 0x37, 0x08, 0x35, 0xfb, 0xb8, 0xf0, 0xdb, 0x23, 0x69, 0x33, 0xe0, 0xde, 0x3d, 0x5b, 0x20, 0xc2, 0xf6, 0x35, 0x0f, 0x32, 0xc9, 0x98, 0xdc, 0x7e, 0xf8, 0xd8, 0x7a, 0xd1, 0x54, 0x34, 0xa2, 0x10, 0x0c, 0xf6, 0x2d, 0xab, 0x24, 0x95, 0x50, 0xbf, 0xd9, 0xb4, 0x42, 0xc3, 0x55, 0xb0, 0x97, 0xec, 0x74, 0x72, 0x6e, 0x61, 0xf6, 0x03, 0x97, 0x47, 0x51, 0xf1, 0x64, 0xb2, 0x90, 0x05, 0xa4, 0x6f, 0xda, 0xeb, 0xf8, 0xa2, 0x77, 0x02, 0x5b, 0xb9, 0xbc, 0xe7, 0x5b, 0xfd, 0x34, 0xb5, 0xf4, 0x8c, 0xd1, 0xe0, 0xa0, 0xd6, 0x06, 0xa8, 0x44, 0x85, 0x8c, 0xfb, 0x9b, 0x73, 0x87, 0xfa, 0x25, 0xeb, 0x17, 0x0c, 0xf3, 0x41, 0xe4, 0x2c, 0xe8, 0xfb, 0x7d, 0x6b, 0x1a, 0x16, 0xe4, 0x5c, 0x20, 0xf6, 0x80, 0x2d, 0x4f, 0x19, 0x61, 0x98, 0x48, 0x22, 0xc2, 0x32, 0xfc, 0xb8, 0x96, 0x92, 0xa1, 0xcd, 0x1d, 0x71, 0x2e, 0xb5, 0x2d, 0xe9, 0xe4, 0xc3, 0x0b, 0x5b, 0xe9, 0xee, 0x85, 0xb2, 0xaf, 0x8d, 0x25, 0xe0, 0x43, 0xb0, 0x1d, 0x82, 0x78, 0xa4, 0xd0, 0x66, 0x61, 0x96, 0x2f, 0xd6, 0x3d, 0x10, 0xe6, 0xda, 0xab, 0xcf, 0xa5, 0x59, 0x95, 0x07, 0x88, 0x7d, 0xae, 0xd7, 0x1d, 0x64, 0x76, 0xdc, 0x60, 0x8e, 0x38, 0x4f, 0xe6, 0x6d, 0xb5, 0xc2, 0x72, 0xd1, 0xe1, 0xa0, 0x84, 0x1f, 0x98, 0x9b, 0x11, 0x31, 0xd3, 0x93, 0x0f, 0x23, 0xff, 0xa8, 0xb0, 0x2b, 0x90, 0xe0, 0x60, 0x40, 0xeb, 0x0c, 0x98, 0xd5, 0x98, 0xe6, 0x3a, 0x42, 0x95, 0xb3, 0x76, 0x90, 0x4c, 0x4a, 0x8d, 0x46, 0x42, 0x0e, 0x39, 0x4c, 0x54, 0x52, 0xa6, 0x2b, 0x87, 0x72, 0x6f, 0xee, 0x41, 0xaf, 0xe0, 0xc3, 0xfe, 0x0d, 0xd1, 0xa2, 0xd4, 0xc6, 0x9d, 0xa9, 0x89, 0x78, 0xcd, 0x8a, 0x33, 0x50, 0x89, 0xe7, 0x4c, 0x85, 0x7a, 0xc2, 0x91, 0x0b, 0x88, 0xd2, 0xe0, 0x0d, 0xfe, 0x21, 0x82, 0x81, 0xc7, 0x4c, 0xfc, 0x00, 0xcb, 0x86, 0x03, 0x38, 0xa5, 0xa4, 0xcf, 0xb0, 0xbd, 0x77, 0x38, 0x4a, 0xd5, 0x92, 0x45, 0x07, 0x96, 0x23, 0xe7, 0x3e, 0x43, 0x50, 0x48, 0xe6, 0x1d, 0x3f, 0x79, 0x67, 0x61, 0xe1, 0xae, 0x5f, 0x57, 0xe4, 0xbd, 0x79, 0x67, 0x0d, 0x11, 0x81, 0xb9, 0xa5, 0xc5, 0xb8, 0x11, 0x0c, 0x02, 0x78, 0x0f, 0x93, 0x51, 0xd6, 0x6a, 0x07, 0xd8, 0xcd, 0x50, 0x60, 0xf6, 0x59, 0x97, 0x0f, 0x25, 0xb6, 0xc7, 0x1f, 0x94, 0xbb, 0xd4, 0xe0, 0x05, 0x44, 0x88, 0x03, 0x44, 0xa4, 0x93, 0x07, 0x80, 0x23, 0x7c, 0x3f, 0xf7, 0xf9, 0x7a, 0x60, 0x39, 0xf6, 0x37, 0xbc, 0x67, 0x56, 0xa1, 0x58, 0x79, 0xd8, 0xb6, 0x05, 0x53, 0xb4, 0xa1, 0x77, 0x57, 0x94, 0xb0, 0xfd, 0xbc, 0xaf, 0x25, 0x52, 0x2c, 0x73, 0xcb, 0x4a, 0x87, 0xcd, 0xda, 0xb4, 0x51, 0x57, 0xaa, 0x1e, 0xc9, 0x2d, 0x6c, 0x51, 0x9d, 0xc6, 0x67, 0x7a, 0x82, 0x76, 0xf2, 0x8b, 0xef, 0xc4, 0xd9, 0xad, 0x96, 0xc4, 0x1c, 0x78, 0x0a, 0x98, 0xb0, 0x16, 0x43, 0x1d, 0xea, 0x3a, 0xe6, 0x77, 0xe8, 0xc7, 0x86, 0x28, 0x1e, 0x24, 0xe3, 0xd4, 0xa8, 0x4a, 0x6f, 0xe1, 0xde, 0x3b, 0x38, 0xd6, 0xa4, 0x3b, 0x4f, 0xaa, 0x6e, 0xe6, 0x80, 0x00, 0xa9, 0xbd, 0xd1, 0xca, 0x35, 0x41, 0x97, 0xca, 0x94, 0x28, 0xd1, 0x0f, 0x52, 0x62, 0x29, 0x23, 0xa3, 0xfd, 0x35, 0x34, 0x57, 0xd3, 0x22, 0x69, 0xf1, 0x17, 0xf5, 0x29, 0x0d, 0xf1, 0xa7, 0xee, 0xe2, 0x2d, 0xe5, 0x19, 0x8c, 0x6b, 0xe7, 0x93, 0x3e, 0xb4, 0xb7, 0xee, 0x65, 0x70, 0x45, 0x4c, 0xd6, 0xe8, 0xe9, 0x9f, 0x33, 0x9a, 0xf8, 0xf9, 0xbd, 0x21, 0xe6, 0x3c, 0x93, 0x5f, 0xa4, 0x5e, 0x6d, 0xab, 0x26, 0xf3, 0xab, 0x07, 0x01, 0x81, 0xa7, 0xea, 0x11, 0xb1, 0x58, 0x5e, 0x49, 0xc2, 0xab, 0x1b, 0xaf, 0xba, 0xe5, 0xae, 0xb4, 0x2d, 0x98, 0x00, 0x40, 0x89, 0x76, 0x18, 0x03, 0x6f, 0x43, 0xe9, 0x48, 0x39, 0x91, 0xa3, 0x6d, 0x61, 0xe7, 0xea, 0x6a, 0xd9, 0x3d, 0x43, 0xf1, 0xd5, 0xcc, 0xb1, 0x2e, 0xe6, 0xbb, 0x10, 0xd9, 0x6a, 0xd2, 0x34, 0x4e, 0xd1, 0x83, 0xef, 0x8a, 0x26, 0x15, 0x04, 0xbf, 0x74, 0xce, 0xbb, 0x25, 0x80, 0xea, 0xc1, 0xc7, 0x25, 0xee, 0x99, 0x9a, 0x25, 0x73, 0x2c, 0xe7, 0x99, 0x33, 0xad, 0x89, 0x69, 0x9e, 0x58, 0xf5, 0x0f, 0x26, 0xba, 0x3e, 0x33, 0x06, 0x0b, 0xb7, 0x8d, 0xbd, 0xc1, 0x38, 0x04, 0x66, 0xa0, 0x94, 0xf6, 0xe2, 0x87, 0x56, 0xde, 0x3f, 0x60, 0x48, 0x1a, 0xbb, 0xc2, 0x05, 0x20, 0xc5, 0xfb, 0x27, 0xcf, 0xc8, 0x2e, 0xb9, 0x6a, 0x8b, 0x37, 0x6f, 0x1e, 0x0f, 0xa5, 0xd1, 0x34, 0xaf, 0x3b, 0xea, 0xfe, 0xc6, 0xaa, 0x76, 0x13, 0x16, 0x1b, 0xb3, 0x33, 0xd2, 0x4b, 0x1e, 0x4d, 0x9c, 0xe6, 0xa7, 0x76, 0x49, 0xe7, 0x6d, 0xf1, 0xb5, 0x9f, 0x6f, 0xbb, 0xaf, 0x49, 0x38, 0xb9, 0xdd, 0x4e, 0xb3, 0x05, 0x00, 0x7d, 0x5a, 0xb8, 0xe0, 0x5c, 0xb7, 0x61, 0xf0, 0x72, 0x7c, 0x71, 0xf8, 0x7d, 0x46, 0xf0, 0x15, 0x30, 0xd7, 0x0a, 0x19, 0x71, 0x1c, 0x68, 0x5e, 0xa9, 0xcf, 0x16, 0xbe, 0x94, 0xa5, 0x95, 0xc9, 0xd7, 0x78, 0x95, 0x29, 0x43, 0x0d, 0xb7, 0xa2, 0xce, 0x7c, 0xa3, 0x1a, 0xc6, 0x2d, 0x55, 0x6f, 0x4c, 0x2f, 0xee, 0x48, 0x20, 0x32, 0x60, 0x60, 0xa7, 0xe3, 0x1c, 0xdf, 0xad, 0x53, 0xb1, 0x88, 0x0d, 0x55, 0x25, 0xd5, 0xf2, 0xb6, 0x80, 0x37, 0xe5, 0x3a, 0x64, 0xfd, 0x02, 0xae, 0xf3, 0x57, 0xfa, 0x6c, 0xbd, 0x69, 0xa3, 0x6e, 0x32, 0x6e, 0xc2, 0x0f, 0x6e, 0x9b, 0xb9, 0x3a, 0xa6, 0x39, 0x27, 0xb4, 0xa0, 0x0f, 0xe0, 0x51, 0xdf, 0xf5, 0x8d, 0xaf, 0x35, 0xc6, 0x55, 0x86, 0x54, 0xcc, 0x28, 0xa0, 0xf8, 0xd2, 0x32, 0x03, 0x6c, 0x09, 0xd3, 0xfb, 0x3b, 0x74, 0x69, 0x44, 0x71, 0x49, 0xf8, 0x87, 0xb6, 0xd9, 0xdc, 0xfc, 0xc4, 0x7f, 0x45, 0xdc, 0x73, 0x99, 0x79, 0xf0, 0x95, 0x78, 0xce, 0x4e, 0x99, 0xc8, 0x35, 0xca, 0xea, 0xba, 0x92, 0xab, 0xe3, 0xba, 0xed, 0x4d, 0xec, 0x32, 0x99, 0x65, 0x48, 0x12, 0x24, 0x3a, 0xaa, 0xbe, 0x54, 0xf0, 0x63, 0xbb, 0x3c, 0x06, 0x38, 0x35, 0x2c, 0xbc, 0x05, 0xe6, 0x1c, 0xc6, 0xe1, 0x9f, 0x77, 0x2c, 0xfa, 0xd5, 0x8d, 0xec, 0x7e, 0x19, 0x8c, 0x7c, 0x29, 0x26, 0xb9, 0x61, 0xba, 0x7c, 0xfa, 0xc4, 0x10, 0x8f, 0x48, 0xf0, 0xed, 0x11, 0xbd, 0xd0, 0xc8, 0x46, 0x9d, 0x06, 0x67, 0xbe, 0xd5, 0x3e, 0x7c, 0xbe, 0x37, 0x7c, 0xf5, 0x4e, 0x77, 0x63, 0xb4, 0x12, 0xb9, 0x37, 0xe3, 0x8d, 0xdc, 0x2f, 0xa4, 0xb8, 0x92, 0xec, 0x06, 0xd7, 0x56, 0x77, 0x02, 0xa2, 0x55, 0xbc, 0x1b, 0x9a, 0x12, 0x05, 0x89, 0x40, 0x59, 0x27, 0x80, 0x74, 0x01, 0xb9, 0xa2, 0x12, 0xb8, 0xcb, 0xd5, 0xd5, 0xe0, 0xd6, 0x78, 0xc1, 0x23, 0x24, 0x23, 0x77, 0x84, 0x60, 0xb3, 0xe5, 0x9c, 0x35, 0x3f, 0xb1, 0x7b, 0x38, 0xe2, 0x35, 0x68, 0xbc, 0x14, 0x8b, 0x89, 0xc2, 0xae, 0x41, 0x48, 0x2e, 0x3a, 0xad, 0x28, 0x3c, 0xc2, 0x7b, 0x8c, 0x20, 0x63, 0xfe, 0x74, 0x6d, 0xf9, 0xd8, 0x57, 0xe0, 0xdb, 0x6e, 0xba, 0xd0, 0x06, 0x4a, 0x50, 0x2f, 0x05, 0x5f, 0x0f, 0x64, 0x7c, 0x6a, 0xe2, 0x10, 0x1f, 0xd7, 0x18, 0xe0, 0x40, 0xcd, 0x06, 0x2c, 0x7c, 0xe9, 0x1a, 0x7c, 0x2c, 0x93, 0x9a, 0x6a, 0x9d, 0x92, 0x26, 0xb6, 0x7e, 0xb6, 0xb7, 0xdf, 0x51, 0xc4, 0x48, 0x0d, 0x37, 0x15, 0xba, 0x02, 0x58, 0xda, 0x07, 0x64, 0x4b, 0x59, 0xf7, 0x0a, 0x1f, 0x2c, 0xe3, 0xce, 0x74, 0x3f, 0x84, 0xb8, 0xd1, 0x96, 0x4a, 0x9f, 0x93, 0x3a, 0x1d, 0x7b, 0x0b, 0x53, 0x5b, 0xc8, 0x6a, 0xc0, 0x60, 0x37, 0xa6, 0xd5, 0x5f, 0x96, 0x12, 0x08, 0xd1, 0x41, 0x3b, 0xc0, 0xde, 0x51, 0x4a, 0x0a, 0x4d, 0xdc, 0xcf, 0x3f, 0xe5, 0x58, 0x76, 0x99, 0x2d, 0x41, 0x16, 0xbf, 0xc7, 0x08, 0x11, 0x80, 0x88, 0x12, 0xd7, 0xba, 0x85, 0x2b, 0xe7, 0x55, 0x23, 0x74, 0x69, 0x62, 0xfe, 0xb4, 0x1b, 0x47, 0xe3, 0xc3, 0xac, 0x74, 0xa6, 0xcd, 0x96, 0xa9, 0x84, 0x60, 0xb6, 0x4d, 0xdc, 0xcb, 0xa1, 0x18, 0xd2, 0xce, 0xb2, 0xa6, 0x37, 0x49, 0x1e, 0x99, 0xbd, 0xdc, 0xcf, 0x69, 0xd0, 0x3f, 0x90, 0xee, 0x52, 0x33, 0x45, 0xd3, 0x9a, 0x3f, 0x64, 0x0d, 0x00, 0x0b, 0xff, 0x5d, 0xbf, 0x1b, 0x43, 0xd3, 0xf5, 0x53, 0xe8, 0x37, 0x63, 0xba, 0xad, 0x01, 0xd6, 0x01, 0x86, 0x48, 0x2d, 0xee, 0x07, 0x0d, 0x0b, 0x85, 0xb2, 0xf9, 0x7e, 0x6c, 0xb9, 0x79, 0x77, 0x1d, 0xff, 0x68, 0xfa, 0xb6, 0xad, 0x0a, 0x0f, 0x43, 0xf6, 0x65, 0x6f, 0x7d, 0x79, 0x5d, 0x70, 0x55, 0x29, 0xc7, 0x41, 0x67, 0xfb, 0x3e, 0xc5, 0xcd, 0x0f, 0x7d, 0x69, 0x5b, 0x64, 0x47, 0x5a, 0x2e, 0x6a, 0xfb, 0xe9, 0x8e, 0x66, 0x80, 0x38, 0x3d, 0x4c, 0xdd, 0x64, 0xc0, 0xfc, 0x07, 0x86, 0xae, 0x90, 0x30, 0xa9, 0x81, 0x18, 0x35, 0xd3, 0x65, 0xf6, 0x7b, 0xe8, 0x1c, 0x92, 0x4b, 0xcb, 0x7a, 0x9d, 0x96, 0x8a, 0x42, 0x2c, 0x72, 0x6f, 0x24, 0xce, 0x7f, 0x5d, 0x6b, 0xf2, 0x50, 0x6c, 0x6a, 0x8d, 0x63, 0x4b, 0x64, 0x23, 0x31, 0x21, 0x60, 0xe2, 0xdb, 0xb9, 0xe6, 0x4e, 0x8e, 0x95, 0x91, 0x59, 0xc1, 0xb3, 0x49, 0x6c, 0x81, 0x1a, 0x08, 0xc0, 0xf3, 0xf4, 0x99, 0x5a, 0x2f, 0x53, 0xfd, 0x6e, 0xf7, 0x58, 0x0e, 0x50, 0xc7, 0x1d, 0xc9, 0xe0, 0xcb, 0x49, 0x07, 0x3b, 0x70, 0xa0, 0x43, 0xc8, 0xb1, 0x88, 0xd2, 0x7d, 0x98, 0xd7, 0xf7, 0xff, 0xdd, 0xdf, 0x6d, 0x06, 0x79, 0x80, 0xcf, 0xfa, 0xa2, 0x39, 0xd0, 0xe9, 0xe1, 0xee, 0x70, 0xc9, 0xb5, 0x03, 0xd3, 0x4a, 0xec, 0x3f, 0x1c, 0xa6, 0xe5, 0x73, 0x35, 0xe7, 0x01, 0xe3, 0xea, 0xd5, 0xab, 0xc1, 0xa7, 0x3d, 0x4c, 0xbd, 0x2f, 0xce, 0x49, 0x0c, 0x48, 0x34, 0xc5, 0xd3, 0x17, 0x62, 0xeb, 0x5f, 0x3c, 0xf8, 0x33, 0x7a, 0x60, 0x71, 0x87, 0x12, 0xb2, 0x46, 0x50, 0x85, 0xad, 0x0e, 0x0b, 0xa3, 0x29, 0xa4, 0xd3, 0x9b, 0xd1, 0xcb, 0x1a, 0x00, 0x30, 0xbc, 0xaa, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xe0, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x33, 0x91, 0x85, 0xbf, 0x29, 0x11, 0xf0, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x09, 0xc2, 0x61, 0x4a, 0x53, 0xd7, 0x45, 0xd1, 0xb4, 0x87, 0x33, 0x02, 0x7c, 0xce, 0x58, 0xc3, 0x62, 0x61, 0xb1, 0x48, 0x93, 0x12, 0x99, 0x43, 0x51, 0x04, 0x23, 0xaf, 0x35, 0x48, 0x29, 0xe1, 0x71, 0x0d, 0x4b, 0x12, 0x0e, 0x9a, 0xf5, 0x1a, 0x64, 0xc1, 0xa6, 0xf5, 0x7d, 0x99, 0x0a, 0x1b, 0x9f, 0xa1, 0xf5, 0xa4, 0xc1, 0xa9, 0x7b, 0xe7, 0x7f, 0xd1, 0x0a, 0x25, 0xc8, 0x04, 0x30, 0xf8, 0x89, 0x9e, 0xa9, 0x58, 0xff, 0xb0, 0x9c, 0x72, 0x25, 0x10, 0xe6, 0xb1, 0xdd, 0xf1, 0x62, 0xde, 0x8f, 0x4c, 0x36, 0x9b, 0xdd, 0xa1, 0xd2, 0x4f, 0x82, 0x65, 0xa8, 0xb6, 0xd3, 0x69, 0x30, 0x4f, 0x53, 0x17, 0xc6, 0x34, 0x6e, 0x99, 0x6c, 0xf3, 0x2d, 0x43, 0x24, 0x27, 0xc8, 0x3f, 0xda, 0x62, 0x8e, 0xa0, 0xbe, 0x8d, 0xa6, 0x4f, 0x72, 0x2b, 0x21, 0x62, 0x45, 0x69, 0x3f, 0x00, 0x97, 0xf3, 0xee, 0x7f, 0x5a, 0xb2, 0xf8, 0x99, 0x69, 0x28, 0xa0, 0x94, 0x52, 0x0b, 0x98, 0x9e, 0xb1, 0xfa, 0x6a, 0x0f, 0x22, 0x23, 0x63, 0xb5, 0xbf, 0x64, 0x05, 0xb6, 0xcc, 0x2d, 0x69, 0x99, 0x12, 0x8f, 0xa8, 0xbb, 0xc4, 0x8a, 0x61, 0xb2, 0x6b, 0x94, 0x66, 0x7f, 0x61, 0xab, 0xc5, 0xc5, 0x9b, 0x75, 0x31, 0x73, 0x58, 0xaa, 0x3b, 0x37, 0xd1, 0x28, 0xbc, 0x45, 0x3b, 0xb2, 0x75, 0x95, 0xb5, 0x42, 0xd0, 0xd6, 0xe3, 0x13, 0xbd, 0xfd, 0x69, 0xde, 0xe6, 0xb3, 0x61, 0x44, 0x93, 0xa0, 0xb0, 0x95, 0xa5, 0x90, 0x1e, 0x05, 0xcd, 0x4e, 0xf3, 0x83, 0x64, 0xd3, 0x51, 0xf6, 0x58, 0x6c, 0x12, 0x2d, 0xe5, 0x3c, 0x79, 0x60, 0xf8, 0x5c, 0xab, 0x41, 0x47, 0x3d, 0xb7, 0xb5, 0x65, 0xd0, 0xd8, 0x23, 0xf4, 0xb5, 0xcd, 0x2e, 0xbb, 0x5b, 0x73, 0xf7, 0xdd, 0xa9, 0x1d, 0xe1, 0xea, 0x9c, 0x43, 0xef, 0x86, 0x05, 0x7d, 0x0a, 0x8a, 0x82, 0xc0, 0xc4, 0x27, 0xc2, 0xa9, 0xc8, 0x8e, 0x0a, 0xeb, 0x42, 0xd9, 0x83, 0x7c, 0xd5, 0x95, 0x71, 0x9c, 0x61, 0x5e, 0xb7, 0x22, 0xe6, 0xa7, 0xa9, 0x7c, 0x18, 0x29, 0x7c, 0x10, 0xcd, 0x6d, 0x2e, 0xfc, 0xc6, 0x3e, 0xc1, 0xfe, 0x32, 0x60, 0x1f, 0xa5, 0xfa, 0x01, 0x29, 0xf1, 0x25, 0xa2, 0xad, 0x80, 0xc4, 0xfe, 0x2d, 0xf8, 0x94, 0x43, 0x01, 0xe3, 0xe9, 0x8e, 0x4f, 0x57, 0xfa, 0xca, 0xc5, 0xb2, 0x4d, 0xb5, 0x36, 0xf6, 0xda, 0x5a, 0xaa, 0x5f, 0xd5, 0xff, 0x1e, 0xc0, 0x7f, 0xea, 0x36, 0xfe, 0xc8, 0xdf, 0x83, 0x83, 0xa2, 0xca, 0xb8, 0xcd, 0x36, 0x78, 0x24, 0xbd, 0xb6, 0x58, 0x66, 0x0a, 0x3e, 0x08, 0x5a, 0x18, 0x73, 0x18, 0xaf, 0x11, 0x4d, 0x3e, 0xd8, 0x29, 0xd1, 0x48, 0x11, 0xad, 0x36, 0x98, 0x8a, 0xe5, 0xb4, 0xcd, 0x53, 0x56, 0xd2, 0xfc, 0x89, 0x00, 0x14, 0x8e, 0x2c, 0xde, 0xbc, 0x05, 0x97, 0x72, 0xe2, 0xad, 0x40, 0xae, 0x8f, 0x3d, 0x7f, 0xb6, 0x4a, 0x55, 0x55, 0x03, 0x8a, 0xa3, 0x08, 0x0b, 0xbd, 0xcb, 0x76, 0x0a, 0xf8, 0x6d, 0x3d, 0x32, 0xb2, 0xe5, 0x50, 0xa4, 0x3c, 0x2d, 0xdf, 0x42, 0x70, 0x9f, 0x64, 0xdb, 0x5c, 0x8e, 0xd9, 0xfe, 0x48, 0xd5, 0x43, 0x3e, 0x97, 0x25, 0x52, 0x0a, 0xef, 0x60, 0x38, 0xba, 0x6c, 0x51, 0xed, 0xbc, 0xbc, 0x8b, 0xe9, 0x59, 0x8f, 0xe7, 0xdf, 0xa2, 0x18, 0xcb, 0x11, 0x0e, 0x90, 0x6d, 0x30, 0xcd, 0x24, 0xff, 0x62, 0x62, 0x2c, 0x0d, 0x9c, 0x9a, 0x12, 0x65, 0x37, 0x2c, 0xdf, 0x64, 0x76, 0xf6, 0x60, 0x8d, 0x9a, 0x2d, 0xdd, 0x94, 0xec, 0xee, 0x87, 0x9c, 0x01, 0xcc, 0x34, 0x68, 0x6d, 0xe6, 0xb6, 0x42, 0x33, 0x3c, 0xef, 0x7a, 0x0f, 0xb7, 0xbf, 0x69, 0x7e, 0x72, 0x71, 0x74, 0xd8, 0xc1, 0xd8, 0x1a, 0x7a, 0x9f, 0x4d, 0x47, 0xd7, 0x63, 0x00, 0x0d, 0xdb, 0x1b, 0x20, 0x06, 0x91, 0x0a, 0xf1, 0x20, 0x8c, 0x96, 0x1c, 0x13, 0x7b, 0xd2, 0x3d, 0x0f, 0x01, 0x27, 0x60, 0xbc, 0xd6, 0xa7, 0x8d, 0x7c, 0x05, 0x30, 0x92, 0x35, 0xfc, 0xa8, 0x06, 0x52, 0x2b, 0xda, 0xd4, 0x2c, 0x42, 0x4a, 0xb3, 0x0d, 0x6d, 0x66, 0xec, 0x28, 0xb6, 0x8f, 0xc7, 0x0b, 0xcd, 0x9d, 0xae, 0xcb, 0xad, 0xd8, 0x9d, 0xec, 0x08, 0x4e, 0xab, 0x25, 0x09, 0x3a, 0xd8, 0xc7, 0x01, 0x49, 0x5e, 0xa9, 0x83, 0x65, 0x34, 0x87, 0x67, 0x38, 0x1e, 0x40, 0x91, 0xf2, 0x54, 0x18, 0x92, 0xa7, 0x17, 0xf3, 0x6c, 0xa1, 0x8a, 0x28, 0xe0, 0x56, 0xb3, 0xbf, 0x6c, 0xe2, 0xb7, 0xb8, 0xa3, 0x72, 0x6c, 0x3c, 0x81, 0x16, 0xdc, 0x7b, 0xd3, 0xa7, 0xfa, 0xb3, 0x0b, 0x24, 0xfa, 0x4c, 0xdb, 0xa2, 0x14, 0xd1, 0xb1, 0xab, 0x68, 0x20, 0x2e, 0x7b, 0xc2, 0x9d, 0x85, 0x12, 0xf6, 0xc8, 0x09, 0xf0, 0xec, 0x10, 0x0a, 0x69, 0x97, 0x11, 0x55, 0x19, 0xad, 0x3b, 0x93, 0xb5, 0xf1, 0x75, 0x2e, 0x7c, 0x16, 0xc6, 0xd4, 0xfc, 0xff, 0xc6, 0x8b, 0x7a, 0x38, 0x5a, 0x6c, 0x8b, 0xe7, 0x61, 0x15, 0x6e, 0x70, 0xd1, 0x44, 0xa3, 0x39, 0xae, 0x09, 0xe2, 0x52, 0x1c, 0xbb, 0xa0, 0xcc, 0x55, 0x3b, 0x4c, 0x11, 0x9e, 0x2f, 0x59, 0x9a, 0x57, 0x72, 0xce, 0xf7, 0xcd, 0x50, 0x37, 0x5d, 0xea, 0x83, 0xfd, 0x67, 0x7e, 0x64, 0x8b, 0x7e, 0x88, 0xd2, 0x31, 0xf3, 0xae, 0xcd, 0xfd, 0x65, 0x6a, 0x07, 0x92, 0x63, 0xc2, 0xaf, 0x4e, 0x8a, 0x54, 0x87, 0x77, 0xb9, 0x0e, 0x8c, 0x21, 0x16, 0x5f, 0xa7, 0xf2, 0xd6, 0x50, 0xfa, 0xe0, 0x5d, 0x3e, 0x63, 0x9c, 0x67, 0x0b, 0xde, 0x91, 0xe6, 0xe1, 0x09, 0x87, 0x4f, 0xcb, 0xf2, 0xa8, 0x24, 0xa7, 0x92, 0xc5, 0x1b, 0xec, 0x44, 0x74, 0xf4, 0xe7, 0x53, 0xaf, 0x6d, 0xc2, 0x46, 0x38, 0xd5, 0x6f, 0x9e, 0x93, 0x7f, 0x46, 0xfb, 0x41, 0x3f, 0x83, 0x74, 0x7b, 0xbb, 0x39, 0xe3, 0x2d, 0x5d, 0x85, 0x7c, 0xb3, 0xce, 0xdb, 0xa6, 0x39, 0x5d, 0xea, 0xd2, 0xe2, 0x9d, 0x4e, 0xfa, 0x70, 0xcc, 0x77, 0x37, 0xf0, 0x58, 0xa9, 0xef, 0x56, 0x12, 0x59, 0xd9, 0x4a, 0xbf, 0xba, 0xa5, 0x30, 0x15, 0xa3, 0xa1, 0x85, 0x4a, 0x7b, 0xf4, 0x5f, 0x84, 0x92, 0x54, 0xce, 0x4a, 0x68, 0x9c, 0x9c, 0x6d, 0x0a, 0x95, 0x9a, 0xfc, 0xe6, 0x1c, 0xa4, 0x6f, 0x2c, 0x8e, 0x5a, 0xd8, 0x4b, 0x3c, 0xbc, 0x62, 0x6b, 0x18, 0x5a, 0x1e, 0x3d, 0xb6, 0xac, 0x29, 0x69, 0x22, 0xda, 0xca, 0xd6, 0xdf, 0x48, 0x36, 0xeb, 0x7f, 0x15, 0x98, 0xb1, 0xcd, 0x92, 0xce, 0x14, 0x32, 0x93, 0x5c, 0x44, 0xe9, 0x17, 0x05, 0x22, 0xb0, 0xc6, 0x16, 0xf2, 0x22, 0x9c, 0x80, 0x48, 0xbf, 0x29, 0x98, 0x48, 0x85, 0xa8, 0xdd, 0xc2, 0x40, 0x22, 0x3f, 0x5c, 0xde, 0x52, 0x7e, 0xf1, 0xf2, 0x8b, 0xbe, 0xfe, 0x6f, 0xfa, 0xb0, 0xa2, 0x42, 0x22, 0xc4, 0x0b, 0x87, 0xdd, 0xc8, 0x69, 0x0c, 0x92, 0xaa, 0x37, 0xe6, 0x59, 0xe9, 0x8d, 0xa9, 0xed, 0xeb, 0xb8, 0xb8, 0x80, 0x33, 0xa7, 0xf5, 0xde, 0x33, 0xd2, 0xfc, 0x1c, 0x00, 0x6c, 0x18, 0x82, 0xb5, 0xc8, 0x11, 0x65, 0xfe, 0x7c, 0x9a, 0x0d, 0x43, 0xba, 0x16, 0x5c, 0xb1, 0xa0, 0xf6, 0xec, 0x4f, 0x24, 0x56, 0xfb, 0x70, 0x01, 0x21, 0x42, 0xd0, 0x5f, 0xbb, 0xbc, 0x8d, 0xad, 0x5c, 0x83, 0x70, 0x58, 0x23, 0xb5, 0x91, 0xa7, 0x1a, 0x1d, 0xc6, 0x00, 0x25, 0xd3, 0x7a, 0x7b, 0xc3, 0xbf, 0xbd, 0x57, 0xe6, 0xab, 0xf9, 0x91, 0x4d, 0xb4, 0x91, 0x92, 0x64, 0x2e, 0x02, 0xd8, 0x6e, 0x37, 0x6b, 0x19, 0x8d, 0xbb, 0xf1, 0x8e, 0xfe, 0x58, 0xd7, 0xe7, 0xac, 0x33, 0x46, 0x01, 0xd5, 0x15, 0x51, 0x7a, 0xae, 0x07, 0x9f, 0x6e, 0xca, 0x22, 0x94, 0x87, 0xfd, 0xc9, 0xad, 0x13, 0x85, 0xd5, 0xca, 0x97, 0xcc, 0x0a, 0x07, 0x7b, 0x33, 0xd1, 0x7a, 0x5e, 0x0d, 0xff, 0xa6, 0x44, 0xfe, 0x20, 0xbf, 0xfa, 0x7e, 0xc7, 0x46, 0x0d, 0x15, 0x5c, 0xaa, 0xaa, 0xe2, 0x41, 0x9f, 0x42, 0x03, 0xfe, 0x60, 0x79, 0xdf, 0x5e, 0xdf, 0x60, 0x94, 0xa1, 0x01, 0x8a, 0xf7, 0xc3, 0xf4, 0x02, 0x8a, 0xf0, 0xb4, 0x27, 0xf4, 0x19, 0x45, 0x00, 0x71, 0xe4, 0x44, 0xd0, 0xd3, 0xec, 0x39, 0x0c, 0xa7, 0xe7, 0xf7, 0x5a, 0xeb, 0x43, 0xfb, 0x2c, 0x4f, 0x38, 0xe7, 0x0f, 0xd6, 0x08, 0x44, 0x2e, 0xd2, 0x88, 0xcb, 0xa6, 0x0f, 0x28, 0x84, 0xf0, 0x78, 0xee, 0x5a, 0x60, 0xea, 0x49, 0x3a, 0x09, 0xff, 0xf0, 0x25, 0xbf, 0x50, 0x62, 0xcf, 0x4e, 0x43, 0x5b, 0xd7, 0xbb, 0x44, 0xe5, 0x3d, 0x1e, 0xf5, 0x88, 0x38, 0xe0, 0x3f, 0xe2, 0x07, 0xaa, 0x8a, 0x42, 0x40, 0x1a, 0x9e, 0x32, 0x14, 0x37, 0x40, 0x1a, 0x7b, 0xe1, 0x6b, 0x07, 0x63, 0xb0, 0xbb, 0x92, 0x6c, 0x94, 0xe4, 0x13, 0x88, 0x4d, 0x5e, 0x00, 0xbf, 0xb4, 0xc3, 0xc2, 0x10, 0xdd, 0x2f, 0x1c, 0xdf, 0xc8, 0xdb, 0xab, 0x61, 0xa7, 0x6a, 0x67, 0x19, 0x4f, 0xa2, 0xfc, 0x3e, 0x11, 0xa0, 0xf4, 0x83, 0x58, 0xb8, 0x88, 0x29, 0xe4, 0xc4, 0x7c, 0x85, 0x74, 0x26, 0xb8, 0x76, 0xe4, 0xce, 0xcc, 0x19, 0xf6, 0xaa, 0x64, 0x4e, 0xfa, 0xe0, 0x2f, 0xa1, 0xca, 0x5b, 0x67, 0x92, 0x76, 0x15, 0x2b, 0x03, 0x8e, 0x97, 0x8c, 0x4c, 0xb0, 0x4b, 0xc0, 0x99, 0xc1, 0xf8, 0xa3, 0x0c, 0xa9, 0xfe, 0x96, 0x9f, 0x09, 0xfd, 0xe9, 0xa2, 0x2b, 0x7e, 0xe2, 0xe2, 0xb8, 0x21, 0xb6, 0x35, 0xde, 0x72, 0xdf, 0xbb, 0x2b, 0xdc, 0x90, 0xee, 0x66, 0x64, 0xe6, 0xd4, 0x2b, 0x93, 0xf3, 0xb9, 0xc7, 0xd9, 0x77, 0xdf, 0x47, 0x21, 0xbe, 0x53, 0x9d, 0xe9, 0xc9, 0x69, 0xcd, 0xa0, 0x7b, 0x4b, 0xd6, 0x00, 0x2b, 0x80, 0x50, 0x4c, 0x38, 0x03, 0x77, 0xac, 0xa1, 0x43, 0xcb, 0xb7, 0xdb, 0x12, 0x23, 0x45, 0x14, 0x8c, 0x36, 0x60, 0x84, 0xbd, 0x5e, 0x53, 0xa4, 0x94, 0xbc, 0x40, 0x0f, 0x9c, 0x3e, 0x4a, 0x8b, 0x98, 0xb4, 0xc7, 0xe6, 0xc9, 0xbf, 0x45, 0x42, 0x3c, 0xf8, 0xea, 0x54, 0x8c, 0xdf, 0x3f, 0x75, 0x39, 0x82, 0xd8, 0xc4, 0x72, 0x40, 0x8a, 0xd8, 0x5b, 0x8c, 0x27, 0x2a, 0x37, 0xdc, 0x17, 0xec, 0x1e, 0xff, 0x15, 0x98, 0xeb, 0xf9, 0xd0, 0x46, 0x38, 0x5a, 0x58, 0xb9, 0x0a, 0xba, 0xb1, 0x56, 0x10, 0x3d, 0xcb, 0x25, 0x13, 0x02, 0x8b, 0x50, 0x5e, 0xb4, 0x93, 0x14, 0xd9, 0x2e, 0x4c, 0x35, 0xf0, 0xa2, 0xf0, 0xf9, 0xbc, 0x17, 0xe2, 0x53, 0xb1, 0x56, 0xe4, 0x7c, 0x87, 0x06, 0xbe, 0xe2, 0xdd, 0x08, 0x17, 0xbe, 0x04, 0xdb, 0xb5, 0x30, 0x0c, 0xdf, 0x2d, 0x18, 0x5f, 0x85, 0x3d, 0x99, 0xe2, 0xe4, 0xd0, 0xe5, 0x38, 0x04, 0x56, 0x01, 0xc3, 0x05, 0xdc, 0x68, 0xc1, 0xf3, 0x39, 0x67, 0x60, 0xea, 0x94, 0x8f, 0xd8, 0xd7, 0xa6, 0x23, 0x45, 0x80, 0x5f, 0xc9, 0x97, 0x57, 0xf0, 0x92, 0xb7, 0x4b, 0xa3, 0x05, 0x84, 0x06, 0x15, 0xcd, 0x2a, 0xc9, 0xf8, 0xd6, 0x15, 0x37, 0xcd, 0x74, 0xc0, 0x63, 0x4b, 0xf2, 0xa3, 0x10, 0x64, 0x0f, 0xf9, 0xdb, 0xb6, 0xe6, 0x54, 0x1e, 0xde, 0x01, 0x94, 0x81, 0x26, 0x45, 0xb8, 0x5b, 0x93, 0x7a, 0x3b, 0xea, 0xf4, 0x98, 0x48, 0x09, 0x15, 0xc0, 0x16, 0x4a, 0xba, 0x19, 0x91, 0x6e, 0xe5, 0xcf, 0x02, 0xbb, 0xe5, 0xa2, 0x84, 0x3a, 0xc8, 0x25, 0x0d, 0x11, 0x25, 0x21, 0x76, 0x02, 0x5a, 0xa6, 0x8a, 0xb5, 0x7e, 0xd5, 0xda, 0x00, 0x61, 0xb3, 0x30, 0x4d, 0x48, 0x53, 0x78, 0xf3, 0x0c, 0x6d, 0xd0, 0x81, 0xf9, 0x89, 0x04, 0x1a, 0x9e, 0xac, 0xb7, 0x3e, 0x7f, 0x95, 0x92, 0x67, 0xb4, 0x63, 0x66, 0xe6, 0x9d, 0x34, 0x98, 0xa4, 0x17, 0xdc, 0xc9, 0xbc, 0x47, 0xc9, 0xf4, 0xa6, 0xa5, 0x9e, 0x9f, 0x18, 0x91, 0xe5, 0xc8, 0xf2, 0x76, 0x88, 0xc4, 0xec, 0x10, 0x06, 0x0a, 0x70, 0x58, 0xed, 0x9a, 0xa8, 0x68, 0x57, 0xfb, 0xf6, 0x2d, 0x1c, 0x78, 0xb3, 0xdd, 0x3f, 0x26, 0xc2, 0x5b, 0x88, 0xb1, 0x3b, 0x55, 0x26, 0x2b, 0x74, 0xba, 0xc3, 0x4c, 0xa0, 0xec, 0x25, 0x85, 0x18, 0x18, 0xd5, 0x50, 0xd5, 0xb4, 0x46, 0x77, 0x3e, 0x01, 0x6b, 0x56, 0xe6, 0xb0, 0x83, 0x8e, 0x5b, 0x36, 0x82, 0x4b, 0xe9, 0x6a, 0x5a, 0x40, 0xe1, 0xd2, 0xe5, 0xb9, 0x27, 0xc3, 0xce, 0x67, 0x86, 0x46, 0x25, 0xa7, 0x53, 0x1b, 0x63, 0x92, 0x9c, 0x5a, 0xd9, 0x82, 0x4b, 0x4f, 0x71, 0x90, 0x7b, 0xf4, 0x6b, 0x7d, 0x13, 0x6a, 0xe6, 0xb7, 0x5c, 0x11, 0x9e, 0x2e, 0x1c, 0x17, 0x7f, 0x6f, 0x90, 0x4f, 0x20, 0xc7, 0xe0, 0x75, 0x68, 0x40, 0x59, 0xa0, 0x8e, 0xea, 0x91, 0xb6, 0xc2, 0x8e, 0xfa, 0xb2, 0x16, 0xe8, 0xe2, 0x02, 0xdb, 0xac, 0x7c, 0x0b, 0x9d, 0xa2, 0x4a, 0x89, 0xc2, 0xeb, 0x00, 0x00, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xe0, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x01, 0x09, 0x2d, 0x0f, 0xf6, 0x4d, 0x95, 0x3e, 0x3a, 0x22, 0xe0, 0x6b, 0xf4, 0xc7, 0x1f, 0x61, 0x19, 0x68, 0x7d, 0xa1, 0x25, 0xe0, 0x51, 0xca, 0x80, 0x6f, 0x30, 0x0e, 0xdb, 0x46, 0x51, 0xe6, 0x18, 0x8a, 0x85, 0x40, 0x01, 0xef, 0xca, 0x74, 0xd7, 0xc1, 0xb9, 0x01, 0x17, 0x45, 0xda, 0x3f, 0x12, 0x94, 0xd8, 0x72, 0xb8, 0xdd, 0x39, 0x4c, 0x3f, 0x60, 0x8b, 0x42, 0xae, 0x7d, 0x0f, 0x89, 0xc1, 0xc7, 0xae, 0x86, 0x0e, 0xd5, 0x3d, 0xd1, 0x95, 0x7b, 0xd7, 0x0a, 0xac, 0x14, 0x9e, 0xd5, 0x2b, 0xa0, 0x9b, 0xff, 0x30, 0xc9, 0xcc, 0x8d, 0x07, 0xc2, 0x17, 0xe5, 0xe1, 0xdf, 0x9b, 0x4d, 0xa8, 0xf7, 0x0f, 0x81, 0x72, 0xb5, 0x8d, 0xa5, 0x89, 0xac, 0x43, 0x78, 0x9a, 0x88, 0x9c, 0x76, 0xa0, 0x37, 0x63, 0x43, 0xbd, 0xbb, 0x54, 0x93, 0x27, 0x92, 0x87, 0x1d, 0x35, 0xca, 0x03, 0x36, 0x20, 0x8e, 0xa0, 0x56, 0x49, 0xd6, 0x76, 0x7d, 0x79, 0x69, 0x0d, 0x5f, 0xfc, 0xe6, 0x7d, 0xf6, 0x81, 0x0c, 0xec, 0xd1, 0x33, 0x3f, 0xd2, 0xb3, 0x5d, 0x27, 0x07, 0x70, 0x1a, 0x64, 0xd8, 0x5e, 0x47, 0x93, 0xfa, 0xbc, 0x61, 0x68, 0x15, 0xe4, 0x93, 0x7e, 0xba, 0x34, 0x0b, 0xb2, 0x60, 0x8f, 0xf1, 0x01, 0x86, 0xc1, 0x04, 0xdf, 0x40, 0x0a, 0x01, 0x25, 0x86, 0xb0, 0xf8, 0xe5, 0xf5, 0xb4, 0xee, 0x0a, 0xa6, 0xb1, 0x89, 0x6e, 0x93, 0xca, 0x11, 0x4b, 0xe9, 0x35, 0x2b, 0x4e, 0x3b, 0x9f, 0x69, 0xc4, 0xe5, 0x77, 0x85, 0x72, 0xd2, 0x73, 0x2a, 0x08, 0xbb, 0xd3, 0x4b, 0x9d, 0xb7, 0xc8, 0xe5, 0x25, 0xcb, 0x99, 0x5f, 0xe3, 0xd5, 0x5b, 0x24, 0x8e, 0xcd, 0xdd, 0x3c, 0x8a, 0x91, 0xef, 0x99, 0xf0, 0x0c, 0xe8, 0xb5, 0xe5, 0x43, 0x32, 0x26, 0x0c, 0x0f, 0xe4, 0x38, 0x17, 0xc9, 0x56, 0x39, 0x58, 0x1b, 0x04, 0x71, 0xf3, 0xd2, 0x3d, 0x0d, 0x29, 0x80, 0x74, 0x84, 0x8d, 0x91, 0x2c, 0xaf, 0x8c, 0xa4, 0x90, 0x6a, 0x3c, 0x15, 0xda, 0x4c, 0xda, 0x7f, 0x3f, 0xfe, 0xeb, 0x96, 0x09, 0x3d, 0x44, 0x32, 0x49, 0x06, 0x65, 0x63, 0xab, 0xc2, 0x6a, 0xdd, 0xe5, 0x02, 0x7a, 0x33, 0x9c, 0x54, 0x16, 0x4c, 0x0b, 0x5b, 0xe9, 0xe4, 0x27, 0xe9, 0x7a, 0x92, 0xbd, 0x22, 0xd7, 0x5e, 0x21, 0x6d, 0xb8, 0x97, 0x0d, 0xb5, 0x09, 0xe2, 0x55, 0xc0, 0xbd, 0x95, 0x17, 0xd0, 0x52, 0xcc, 0xee, 0x6d, 0x1e, 0xf8, 0x45, 0xe6, 0x34, 0x6d, 0xb2, 0xf1, 0xa8, 0x37, 0x7d, 0x4b, 0x3e, 0x86, 0x9d, 0x4f, 0xc0, 0x3c, 0xfa, 0xa2, 0x9a, 0xad, 0x06, 0xba, 0x83, 0x10, 0xb2, 0xc0, 0x02, 0xf0, 0x82, 0xce, 0x01, 0x07, 0xc4, 0x01, 0xb2, 0x6c, 0x01, 0x70, 0x68, 0x01, 0x42, 0xd4, 0x9a, 0x90, 0x16, 0xb3, 0x1d, 0xb0, 0x4b, 0xc7, 0x47, 0x6d, 0x4c, 0x04, 0x4a, 0xb3, 0x83, 0x31, 0x46, 0x75, 0xf4, 0x4c, 0x28, 0x10, 0x88, 0x7b, 0x03, 0x48, 0x4d, 0xd3, 0xdb, 0xba, 0xbd, 0xca, 0x74, 0xbc, 0xfd, 0x43, 0x60, 0x76, 0xba, 0xa5, 0x63, 0xbc, 0xe9, 0x46, 0x00, 0xd7, 0x31, 0xff, 0xff, 0x19, 0x29, 0x4d, 0x01, 0x9d, 0x09, 0x30, 0xc1, 0xe7, 0x79, 0x66, 0xe1, 0x74, 0xbd, 0x03, 0x31, 0xe9, 0xbf, 0xca, 0x7e, 0xc1, 0x06, 0x94, 0x7b, 0x64, 0xe5, 0xc3, 0xe9, 0x99, 0x3f, 0x2f, 0x0c, 0x41, 0x57, 0x4c, 0x0d, 0xcd, 0xfd, 0xb2, 0x62, 0x9b, 0xf0, 0xc1, 0x34, 0x39, 0xaa, 0x04, 0x67, 0x3c, 0x23, 0x71, 0x28, 0xa9, 0x87, 0x90, 0x7d, 0x64, 0xc0, 0x0b, 0xa8, 0x51, 0x34, 0x6f, 0xfe, 0xe2, 0xf1, 0xdd, 0xa0, 0x0e, 0x68, 0xa6, 0xf1, 0x35, 0x6a, 0xbd, 0x92, 0x4c, 0x45, 0xd6, 0x3e, 0x9c, 0xea, 0x20, 0xd6, 0x67, 0xcf, 0xdb, 0xc4, 0x0b, 0xf6, 0xdd, 0xaf, 0xb8, 0xd5, 0x97, 0xc4, 0x05, 0xe1, 0x5a, 0x5e, 0xef, 0xb7, 0x0d, 0x82, 0x1f, 0xdc, 0x5e, 0x3a, 0x50, 0x51, 0x8a, 0xce, 0x6e, 0x88, 0x75, 0xea, 0x9f, 0x90, 0x17, 0x12, 0x99, 0xed, 0xe8, 0x2b, 0x44, 0x8d, 0xf2, 0xab, 0x93, 0xc1, 0xf0, 0xad, 0xd1, 0x6d, 0x14, 0x63, 0x21, 0x97, 0x83, 0x32, 0x9c, 0xeb, 0x6c, 0x59, 0xd6, 0x2a, 0x27, 0xac, 0xde, 0xb5, 0x7f, 0x69, 0x37, 0x4c, 0x60, 0xb6, 0xfd, 0x0e, 0x21, 0x27, 0x37, 0xc4, 0x3a, 0xdd, 0x4f, 0xd7, 0x1f, 0xfd, 0x28, 0x4a, 0xf1, 0x5e, 0x9d, 0x8b, 0x87, 0x3c, 0x71, 0xdc, 0xc7, 0x58, 0x88, 0x11, 0x7a, 0xb3, 0x63, 0x31, 0x48, 0x6d, 0xe6, 0x7a, 0x3d, 0xad, 0xf8, 0xd7, 0xd7, 0xe3, 0x7d, 0x19, 0x69, 0x4b, 0xf9, 0xdf, 0xab, 0x44, 0x4d, 0x8b, 0x03, 0x9d, 0x8d, 0xf5, 0x43, 0xa0, 0x12, 0x15, 0x04, 0x85, 0x2c, 0x7b, 0xec, 0x78, 0x94, 0x71, 0x50, 0xcc, 0xb8, 0x88, 0x5e, 0xe8, 0xcd, 0xbe, 0xa6, 0xe7, 0x14, 0xe1, 0x93, 0xe5, 0x68, 0x86, 0xe0, 0x0d, 0xbc, 0x0a, 0x46, 0xc6, 0xe3, 0x63, 0xaf, 0x06, 0x99, 0x22, 0x16, 0x8c, 0x8d, 0x6f, 0x2a, 0xbf, 0x21, 0xb8, 0xf3, 0x7c, 0x75, 0xf1, 0xca, 0x03, 0x26, 0x95, 0x4b, 0xad, 0xa4, 0xf4, 0x29, 0xb5, 0x07, 0x16, 0x8e, 0xb3, 0x79, 0x9b, 0xbe, 0xec, 0xdd, 0x64, 0x1f, 0xf8, 0x93, 0x7c, 0xf5, 0x0c, 0xb6, 0xdc, 0x74, 0xf6, 0xe8, 0xe7, 0x63, 0x26, 0xe8, 0x86, 0x18, 0x59, 0x5d, 0xc3, 0x13, 0xa8, 0x8d, 0xe1, 0xe9, 0x43, 0xc9, 0x58, 0xb2, 0x6c, 0x8c, 0x6d, 0x95, 0xc9, 0xa7, 0xcd, 0xc2, 0xc3, 0xfb, 0x77, 0xda, 0xf7, 0x05, 0x5e, 0x16, 0xf5, 0xc9, 0xa3, 0xa4, 0x33, 0xfe, 0x3f, 0xd4, 0x4e, 0xa1, 0xb2, 0xd7, 0x79, 0xcd, 0x5a, 0xce, 0x2b, 0xfc, 0xda, 0x5e, 0x5a, 0x8b, 0x79, 0x1c, 0xd7, 0x86, 0x62, 0x87, 0x8d, 0xcf, 0x6f, 0x52, 0x28, 0x30, 0x03, 0x97, 0xb1, 0x49, 0x7c, 0x7b, 0x05, 0x04, 0x07, 0xae, 0x2d, 0x94, 0x54, 0x06, 0xd5, 0x3d, 0x1b, 0x18, 0x3c, 0x13, 0xce, 0x3d, 0x2b, 0x4e, 0xac, 0xbe, 0x98, 0x60, 0x89, 0xcf, 0xb8, 0x25, 0xf4, 0x44, 0xe9, 0xda, 0x9d, 0xc8, 0x77, 0x33, 0x4f, 0xc0, 0x4b, 0x58, 0xaf, 0xf2, 0xd4, 0x12, 0xb8, 0xfb, 0x3a, 0x07, 0x3b, 0x7f, 0xaf, 0x3d, 0x7b, 0xf1, 0x8b, 0x09, 0xe3, 0x9c, 0x97, 0xb1, 0xd0, 0x4a, 0x32, 0xb6, 0x04, 0x23, 0x2e, 0xe5, 0xbe, 0xca, 0xad, 0xeb, 0x53, 0xfa, 0xc2, 0x8c, 0xea, 0xa0, 0x91, 0xe2, 0x9f, 0xa8, 0x68, 0xb2, 0x3f, 0x28, 0x80, 0xd6, 0x3f, 0x98, 0x5a, 0xf9, 0x96, 0xae, 0x01, 0x4c, 0xce, 0x2f, 0x1b, 0x6a, 0xd3, 0x1a, 0xd9, 0x69, 0x32, 0xc7, 0xba, 0x0e, 0x06, 0xed, 0x3e, 0x74, 0xec, 0xce, 0x80, 0x39, 0xee, 0x2e, 0x9b, 0x43, 0x44, 0xd2, 0x2d, 0x52, 0x8d, 0xf2, 0x9a, 0x20, 0x77, 0xb5, 0x21, 0xdf, 0x72, 0x8c, 0x85, 0x46, 0x4d, 0x93, 0xd1, 0x6a, 0xb2, 0x21, 0xcc, 0x97, 0x31, 0x3a, 0x89, 0xa6, 0x19, 0x77, 0x76, 0xc1, 0x7c, 0xfd, 0x2b, 0x99, 0x10, 0xbb, 0xfa, 0x16, 0xe5, 0xbf, 0xa3, 0x27, 0x19, 0x7c, 0xaf, 0xdc, 0xf9, 0x11, 0xb0, 0x00, 0xc6, 0x16, 0x9e, 0x5c, 0x4a, 0xcc, 0x19, 0x3f, 0xe0, 0x8b, 0x9a, 0x40, 0xfc, 0x44, 0x51, 0xa0, 0xab, 0xa4, 0x31, 0x13, 0x22, 0x0a, 0x1b, 0x4b, 0x37, 0x33, 0xdb, 0x21, 0x45, 0x7a, 0xfc, 0xfc, 0xc3, 0xd0, 0x3b, 0xe2, 0x27, 0x38, 0x78, 0x17, 0x0d, 0xd6, 0x4b, 0x8f, 0x77, 0x05, 0x52, 0x8f, 0xdd, 0x8d, 0xcd, 0x22, 0x48, 0x6e, 0x8d, 0x47, 0xfe, 0xbd, 0x66, 0x73, 0x2d, 0xa5, 0x95, 0x13, 0xe8, 0x5d, 0xce, 0xc2, 0xa7, 0xa5, 0xc0, 0xf5, 0x98, 0x78, 0xf5, 0x7d, 0x1a, 0x19, 0x8b, 0xd2, 0xbd, 0x7f, 0xe3, 0x07, 0xef, 0x57, 0x20, 0xd4, 0xbd, 0x4e, 0x29, 0xfc, 0xf6, 0x3c, 0x5e, 0xc8, 0x99, 0xa5, 0xf5, 0xf6, 0x26, 0x98, 0x6a, 0x1d, 0x83, 0x47, 0x52, 0x7e, 0x71, 0x53, 0xa5, 0x93, 0x95, 0x57, 0xf5, 0x12, 0x0f, 0x03, 0xc4, 0xdf, 0x30, 0x6d, 0x9d, 0x1f, 0x3a, 0x09, 0x03, 0xcc, 0x54, 0xf1, 0xea, 0xd8, 0x67, 0x30, 0x61, 0x2a, 0xa1, 0x85, 0xce, 0x62, 0x97, 0xb8, 0x90, 0x87, 0x5b, 0x34, 0x55, 0x59, 0xe8, 0x6d, 0x5b, 0x11, 0x3c, 0x0b, 0xa0, 0x3c, 0x4d, 0x15, 0x8a, 0xe8, 0x99, 0xda, 0x37, 0xce, 0xf9, 0xd2, 0x47, 0xf1, 0x84, 0xcf, 0x97, 0x1f, 0x50, 0x57, 0x5c, 0xa0, 0x74, 0x2c, 0x97, 0x83, 0x92, 0x1d, 0x2d, 0x2f, 0x00, 0xcd, 0xa9, 0xb9, 0x77, 0xad, 0x84, 0xe1, 0xaa, 0x4a, 0xdb, 0x9f, 0x83, 0x8a, 0x43, 0xc3, 0xb7, 0xe2, 0x94, 0xb1, 0xe6, 0xc5, 0x7d, 0xa9, 0x50, 0x46, 0x78, 0x1a, 0x4d, 0xcf, 0xad, 0x3f, 0x88, 0x3a, 0x30, 0x7c, 0x63, 0x9a, 0x2f, 0xb8, 0x86, 0x6f, 0xff, 0x55, 0x90, 0xa7, 0x5d, 0xd7, 0x92, 0xee, 0xe9, 0x2e, 0x39, 0xa6, 0x4c, 0x98, 0xeb, 0xa8, 0xd6, 0x06, 0xd5, 0xd3, 0x2c, 0xe1, 0x6d, 0xe0, 0xaa, 0x82, 0x4f, 0xac, 0x81, 0xa2, 0xd3, 0xdf, 0x3e, 0xf6, 0x2d, 0x0f, 0x3b, 0x93, 0x1c, 0xc4, 0xdc, 0x82, 0x13, 0xf1, 0xc4, 0x97, 0x56, 0xcc, 0x64, 0xeb, 0xf9, 0x40, 0xb5, 0x90, 0x5a, 0xc7, 0x05, 0xed, 0xa4, 0xc6, 0x53, 0x62, 0xe0, 0x3d, 0xc2, 0xde, 0xc6, 0xaf, 0xbf, 0x47, 0x8e, 0x51, 0x51, 0x3e, 0x74, 0xe8, 0x4a, 0xc6, 0x88, 0xfc, 0xcd, 0xcb, 0x19, 0xa4, 0x59, 0x4e, 0x72, 0x15, 0x73, 0xa9, 0x32, 0xa3, 0x48, 0x94, 0xd7, 0x4a, 0x4b, 0xbf, 0xec, 0x0a, 0x1f, 0xef, 0x00, 0x63, 0x4e, 0xf6, 0x12, 0x8f, 0x27, 0x97, 0x59, 0x93, 0xdd, 0xb8, 0xaa, 0xca, 0xe9, 0x23, 0x83, 0x68, 0x8f, 0x67, 0x47, 0xbd, 0xa4, 0x0f, 0x69, 0x37, 0xdc, 0xa2, 0xae, 0x4d, 0x2c, 0xcb, 0x9c, 0xb9, 0x4f, 0x56, 0xf9, 0x1e, 0xd5, 0x04, 0x55, 0xfc, 0x11, 0xfe, 0x3e, 0xd8, 0x72, 0x22, 0x03, 0xc7, 0x2d, 0x0d, 0x56, 0x19, 0xf0, 0x4b, 0xa8, 0x10, 0x2d, 0xc6, 0xed, 0xfe, 0xbe, 0xe1, 0x2d, 0x23, 0x2f, 0x5c, 0x56, 0x95, 0xde, 0xdd, 0x1b, 0x25, 0x71, 0x64, 0xfc, 0x69, 0x29, 0xf5, 0x21, 0x84, 0xb4, 0x6f, 0xab, 0x3f, 0x09, 0xdf, 0x7c, 0xd4, 0xc1, 0x11, 0x86, 0xd3, 0x8b, 0xaa, 0xfd, 0x71, 0xcf, 0xb7, 0x74, 0x81, 0xa9, 0x9e, 0xae, 0xa4, 0x8b, 0x95, 0x0d, 0x9b, 0x29, 0x63, 0xd6, 0x76, 0x08, 0xa5, 0xff, 0x6c, 0x20, 0x46, 0x4e, 0xba, 0xac, 0xa9, 0xa6, 0x68, 0xa0, 0x1a, 0xdb, 0x09, 0x38, 0x02, 0x45, 0xf9, 0xf0, 0x5d, 0x0e, 0x4a, 0xaf, 0x34, 0x40, 0x53, 0x60, 0x61, 0x91, 0x65, 0xcd, 0xb5, 0xe2, 0x5b, 0xee, 0xa4, 0x88, 0x16, 0x55, 0xbf, 0xf2, 0x82, 0x77, 0x79, 0x54, 0x2b, 0x0d, 0xec, 0xc3, 0x4b, 0xab, 0xec, 0x16, 0xd7, 0x48, 0xb8, 0x4b, 0x25, 0x79, 0xa9, 0x94, 0x1e, 0xb3, 0x22, 0xaf, 0x56, 0x10, 0x9d, 0x8f, 0x3c, 0x54, 0x65, 0xf0, 0xf4, 0xd7, 0x82, 0x21, 0x39, 0x0f, 0x42, 0x1e, 0xc9, 0xfb, 0x7f, 0x4a, 0xa1, 0x36, 0x92, 0xcd, 0x40, 0x00, 0xa2, 0xda, 0xe3, 0x4b, 0x42, 0xad, 0x00, 0xf0, 0x56, 0x37, 0x7a, 0x88, 0xfc, 0x2f, 0x88, 0xde, 0x56, 0x28, 0xe8, 0x22, 0x75, 0x38, 0x41, 0x32, 0xd5, 0x09, 0xdf, 0x75, 0x70, 0x11, 0x3c, 0x00, 0x41, 0x89, 0x8f, 0xb8, 0xda, 0xbc, 0x5a, 0x21, 0x0a, 0x3d, 0x21, 0xd5, 0x1c, 0x03, 0x73, 0x60, 0x12, 0xfc, 0x5e, 0x2a, 0x1f, 0xb7, 0x27, 0x11, 0xd8, 0x8b, 0x73, 0x1b, 0x46, 0xe1, 0xaa, 0xcc, 0x16, 0xa9, 0x04, 0xa0, 0xde, 0xbe, 0x17, 0xc8, 0x53, 0xd9, 0xcf, 0xf0, 0x93, 0x1d, 0x54, 0x9b, 0x38, 0x40, 0x23, 0xff, 0xc8, 0x86, 0xb2, 0xae, 0xd0, 0xb8, 0x25, 0xc2, 0xf5, 0x05, 0xcd, 0x68, 0xa2, 0x11, 0xcd, 0x8b, 0xe4, 0x00, 0xa9, 0xaa, 0x90, 0x31, 0x70, 0x8d, 0x4f, 0x6b, 0x48, 0x3c, 0x02, 0x76, 0x70, 0x4a, 0x91, 0xca, 0x13, 0x59, 0xbb, 0x7a, 0x87, 0x30, 0xaf, 0xbe, 0x71, 0x26, 0xa3, 0x70, 0xfa, 0xe2, 0x73, 0x41, 0xac, 0xc0, 0x5a, 0xf2, 0x7b, 0xa2, 0xaa, 0xbb, 0xb5, 0x04, 0x51, 0x36, 0x3c, 0x7f, 0x14, 0x69, 0x61, 0x99, 0xbd, 0xde, 0xb1, 0xfa, 0xa1, 0xf0, 0x1a, 0x10, 0x76, 0x2e, 0xce, 0x86, 0x2d, 0x91, 0x51, 0x76, 0x53, 0xeb, 0x89, 0x6e, 0xf2, 0x55, 0x31, 0x40, 0x84, 0x91, 0x15, 0xcc, 0x3d, 0x2b, 0xf8, 0xd1, 0x9a, 0x33, 0xa2, 0x60, 0x17, 0x1c, 0xa0, 0x73, 0x1f, 0xe9, 0x1d, 0x28, 0xa4, 0xc6, 0xd3, 0xbd, 0x0c, 0x82, 0xc0, 0xad, 0xbc, 0xf8, 0x17, 0x8d, 0x07, 0x5c, 0x3d, 0x78, 0x65, 0xb0, 0x67, 0x69, 0x8f, 0xdb, 0xbb, 0x48, 0x93, 0x26, 0x00, 0x81, 0xa7, 0x56, 0xb1, 0xec, 0xf9, 0xfe, 0x6f, 0xd6, 0x47, 0xa6, 0x0f, 0x57, 0xfb, 0x7d, 0x52, 0x2a, 0x73, 0xdc, 0x44, 0x25, 0x4b, 0x52, 0x90, 0x00, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xe0, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x44, 0x22, 0x38, 0x56, 0x12, 0x66, 0x2a, 0x86, 0x62, 0x1e, 0x69, 0xb2, 0x00, 0x01, 0x09, 0x0a, 0xf8, 0x53, 0x35, 0x2a, 0xd5, 0xc7, 0x8e, 0x2f, 0xdd, 0xc0, 0x53, 0xbe, 0x03, 0xea, 0x3f, 0x96, 0xbe, 0xe9, 0x75, 0xac, 0xf3, 0xda, 0xd1, 0x24, 0xed, 0xda, 0x19, 0x6d, 0xf3, 0xad, 0xb8, 0xa9, 0xc4, 0xe6, 0xde, 0xd9, 0x9c, 0xc6, 0x58, 0xcf, 0xe0, 0x17, 0xc5, 0x8e, 0xd9, 0x49, 0x65, 0x41, 0x1b, 0xb4, 0x1f, 0x79, 0xef, 0x0a, 0x37, 0x83, 0x1f, 0xf5, 0x08, 0x60, 0x31, 0xe1, 0x87, 0xfd, 0x04, 0x06, 0xe5, 0xe2, 0x8c, 0xc2, 0x02, 0xdc, 0x6b, 0xe0, 0xf4, 0x4a, 0x7b, 0x36, 0x4e, 0xfc, 0xeb, 0xc6, 0x5f, 0xc0, 0xaa, 0x8c, 0x19, 0xd4, 0xad, 0x90, 0xd3, 0xad, 0xbe, 0xc3, 0xef, 0x0c, 0xed, 0xfa, 0x26, 0xac, 0xcd, 0x04, 0x24, 0x3a, 0xa0, 0x23, 0x89, 0xa0, 0x13, 0x59, 0xdf, 0xed, 0x6d, 0x91, 0xa1, 0x9e, 0xd7, 0x8e, 0xaa, 0xf4, 0xc3, 0xd5, 0xb2, 0xa2, 0xe4, 0xab, 0xcf, 0x92, 0xab, 0x69, 0x16, 0xa7, 0x01, 0x26, 0x8f, 0x1c, 0xa5, 0x4d, 0x4f, 0x39, 0x1e, 0x46, 0x16, 0xa9, 0x59, 0x20, 0xf0, 0xb4, 0x14, 0x14, 0xe2, 0x75, 0x59, 0x50, 0x31, 0x30, 0x57, 0x91, 0x66, 0x76, 0xdd, 0xef, 0xe2, 0xb2, 0xb3, 0xbe, 0x0c, 0x5b, 0x06, 0xf5, 0xd7, 0x33, 0x83, 0x3a, 0x5b, 0x33, 0x94, 0x6b, 0x88, 0xbf, 0x87, 0xe7, 0xbb, 0xd1, 0x7d, 0xc3, 0xaf, 0x02, 0xd7, 0x96, 0xfb, 0x5b, 0xe9, 0xb9, 0x98, 0xea, 0x95, 0xda, 0x2e, 0x45, 0x05, 0x0d, 0x2c, 0x76, 0x67, 0xc7, 0x5e, 0x7a, 0x89, 0x00, 0x5a, 0xb7, 0x34, 0x1f, 0xb6, 0x1c, 0xa0, 0xe1, 0x1c, 0x58, 0xc9, 0x70, 0xc2, 0xf5, 0xb0, 0x5b, 0x2e, 0x5d, 0xf2, 0x07, 0x02, 0xed, 0xf1, 0x71, 0x87, 0x83, 0x56, 0x24, 0xf0, 0x9d, 0x74, 0x2e, 0x10, 0x8e, 0x60, 0x3b, 0x14, 0xde, 0xa1, 0xae, 0xbf, 0x96, 0x30, 0x1d, 0x3a, 0x3e, 0xaa, 0x65, 0x37, 0x31, 0x5b, 0x98, 0x82, 0x80, 0xc3, 0x59, 0x82, 0x61, 0xfd, 0xfa, 0x1f, 0x01, 0x85, 0x97, 0x16, 0x19, 0x73, 0xaf, 0x45, 0x16, 0x67, 0x62, 0x2b, 0x46, 0x15, 0x50, 0x9d, 0xc7, 0x86, 0x7a, 0xd5, 0xc2, 0x2a, 0x7d, 0x52, 0x4b, 0x8f, 0x86, 0x73, 0x30, 0x2c, 0x0d, 0xdc, 0x5a, 0x99, 0xb3, 0x8e, 0x82, 0xdf, 0x1a, 0x2e, 0x43, 0xa8, 0x54, 0xea, 0x7f, 0x78, 0x10, 0x9c, 0xe0, 0x81, 0x0c, 0xac, 0x45, 0x7c, 0x15, 0xaa, 0x9f, 0x7a, 0xca, 0x9d, 0x88, 0x08, 0xe6, 0xfa, 0xf2, 0xe1, 0xb5, 0xdd, 0x90, 0x0e, 0x4e, 0xb5, 0xf9, 0xbc, 0x7c, 0x57, 0xeb, 0xd4, 0x69, 0x28, 0xef, 0x0e, 0xcd, 0x5f, 0x73, 0xa8, 0xb6, 0x49, 0xf9, 0xfc, 0x55, 0x20, 0xa3, 0x0b, 0x72, 0xfd, 0x69, 0x4f, 0x6b, 0x99, 0x1d, 0x0f, 0xf9, 0xd7, 0x95, 0x82, 0x7a, 0x1c, 0x34, 0x21, 0x49, 0xbe, 0x26, 0x9b, 0x48, 0x5f, 0x1e, 0x92, 0x76, 0x93, 0xce, 0x4e, 0xbc, 0x82, 0xe7, 0x19, 0x62, 0xf2, 0x3d, 0x76, 0x1e, 0x64, 0xb2, 0xd5, 0xaa, 0xc8, 0x35, 0x76, 0xaf, 0x65, 0xb4, 0xce, 0xe5, 0x76, 0xc9, 0xce, 0xc8, 0x5c, 0xa4, 0x8d, 0xd2, 0x49, 0xac, 0xae, 0x97, 0xdd, 0x86, 0x4d, 0xe8, 0x6c, 0x70, 0x7e, 0x1b, 0x2f, 0xea, 0xe7, 0x3c, 0xdf, 0x17, 0x92, 0x20, 0x88, 0x00, 0xa5, 0x61, 0xc6, 0x4c, 0x12, 0xf9, 0x43, 0xa8, 0xee, 0x6d, 0x15, 0x69, 0xd6, 0x68, 0x9a, 0xbb, 0xcf, 0x07, 0x0b, 0x17, 0x00, 0x11, 0xc0, 0x95, 0x6e, 0xce, 0x69, 0x35, 0x9b, 0xd6, 0x48, 0xc4, 0xf9, 0xd3, 0x35, 0x3d, 0xb9, 0x17, 0xae, 0x31, 0x28, 0xf2, 0xc9, 0xf8, 0xde, 0xbd, 0x40, 0x29, 0x03, 0xc8, 0x0f, 0x7a, 0xe9, 0x06, 0x86, 0x33, 0x9f, 0x09, 0x2d, 0xa3, 0x00, 0x8b, 0x06, 0x4c, 0x3d, 0xde, 0x45, 0x39, 0xd5, 0xc8, 0xa6, 0x4d, 0x23, 0x00, 0x46, 0x82, 0xea, 0x54, 0x69, 0x59, 0xa0, 0xcb, 0x09, 0x85, 0x42, 0x83, 0x7c, 0xab, 0x6e, 0xab, 0xf9, 0x95, 0x6f, 0x1c, 0xb5, 0x59, 0x28, 0x63, 0xed, 0x2c, 0xae, 0x55, 0x80, 0xce, 0x67, 0x2f, 0xf0, 0xff, 0x42, 0x48, 0x43, 0x79, 0x32, 0xbb, 0x4d, 0x66, 0x89, 0x95, 0xcd, 0x83, 0x8f, 0x02, 0xa2, 0x2f, 0xe9, 0xea, 0x06, 0x59, 0x6f, 0x24, 0xa6, 0xe0, 0xd7, 0x23, 0x03, 0x5e, 0xe1, 0x23, 0x10, 0xee, 0x65, 0x94, 0x49, 0x88, 0xf5, 0xf4, 0x0b, 0x6a, 0x12, 0xab, 0xe7, 0xe0, 0x7d, 0x34, 0xa0, 0xcd, 0xfc, 0x39, 0x6a, 0xb3, 0xc7, 0x55, 0xe6, 0xe6, 0x2c, 0xc6, 0x38, 0xec, 0x13, 0xf8, 0x77, 0x27, 0x29, 0xad, 0x64, 0x5c, 0x76, 0x6a, 0x71, 0x62, 0xf8, 0x19, 0x92, 0x78, 0xba, 0x96, 0x1d, 0x0c, 0x39, 0x66, 0xe5, 0x3e, 0x71, 0x01, 0x96, 0x3a, 0x29, 0x6e, 0x9d, 0x82, 0x22, 0x58, 0x35, 0xa6, 0xef, 0xb3, 0x88, 0xbe, 0x34, 0xca, 0x44, 0xdb, 0x8f, 0x4b, 0xcf, 0x6d, 0xff, 0x5d, 0x5f, 0xa0, 0x27, 0x52, 0x8c, 0x5d, 0xd0, 0x50, 0xf4, 0xd2, 0x42, 0x14, 0x98, 0xbd, 0xdb, 0x36, 0xa1, 0x5b, 0x86, 0x60, 0x4a, 0x37, 0x0f, 0x80, 0xf0, 0x47, 0xb6, 0x79, 0xff, 0xe7, 0xd3, 0xec, 0x13, 0x0c, 0x99, 0x97, 0xd2, 0x3d, 0x85, 0x51, 0x28, 0xe4, 0x89, 0xa4, 0x3f, 0x2a, 0x1c, 0xda, 0x06, 0x1b, 0xf9, 0xc1, 0x8c, 0xaa, 0x50, 0x50, 0x43, 0x6e, 0x4f, 0xae, 0x13, 0x20, 0x6f, 0x1f, 0x60, 0xe1, 0xf6, 0x65, 0x94, 0xf2, 0x67, 0xbc, 0x0e, 0x1f, 0x6a, 0xb6, 0xf3, 0xcc, 0x8f, 0x81, 0x7b, 0xab, 0xfb, 0xbb, 0x24, 0xf1, 0x00, 0x29, 0x01, 0xce, 0xfe, 0x79, 0xdc, 0x7b, 0xc8, 0xa5, 0x3a, 0x6f, 0x0d, 0x38, 0x06, 0x15, 0xe4, 0xc3, 0xb7, 0x91, 0xf8, 0xff, 0xc5, 0x2c, 0x20, 0x25, 0x2d, 0x8e, 0x5f, 0x5f, 0x7d, 0xc9, 0x10, 0x3b, 0x84, 0xf8, 0x2b, 0x91, 0x39, 0x96, 0x19, 0x8b, 0x0d, 0x15, 0x12, 0xff, 0xab, 0x25, 0xbf, 0xde, 0x48, 0x78, 0x3e, 0xb4, 0x8c, 0xa6, 0x2d, 0xf0, 0xa1, 0x9d, 0x17, 0xe7, 0x00, 0xfe, 0x86, 0x58, 0x01, 0x1f, 0x14, 0x9a, 0x84, 0xb1, 0x99, 0x79, 0xaa, 0xcb, 0x32, 0x77, 0x92, 0x0d, 0x4c, 0xa3, 0xf3, 0xd9, 0xf5, 0xbd, 0xb8, 0x54, 0x1e, 0x92, 0x76, 0x71, 0x26, 0x0d, 0xc9, 0x50, 0x32, 0xda, 0xeb, 0xbc, 0xd8, 0x22, 0x9d, 0xf5, 0xed, 0xa2, 0xa8, 0xe6, 0xc7, 0x7b, 0xf3, 0x99, 0xfd, 0xbf, 0x6d, 0xed, 0x79, 0xe8, 0xc4, 0xc8, 0xed, 0xbb, 0xb3, 0x92, 0xf7, 0x28, 0xb8, 0x0a, 0x38, 0x32, 0xfd, 0xa4, 0xbc, 0xd5, 0x6b, 0x8f, 0x37, 0x41, 0xd5, 0xab, 0x63, 0x59, 0xb4, 0xd4, 0x4f, 0x95, 0x25, 0xcc, 0x8d, 0x1b, 0x3b, 0xc2, 0x9f, 0xff, 0xa0, 0x52, 0xfd, 0x3b, 0x4e, 0x52, 0x31, 0x91, 0x86, 0xbd, 0xbf, 0xda, 0xc6, 0x1d, 0x87, 0x9c, 0x94, 0x9b, 0xe7, 0x4f, 0x23, 0x2c, 0x9d, 0xe0, 0x04, 0x18, 0x64, 0x30, 0x98, 0xe9, 0xcd, 0x1c, 0x1a, 0x93, 0xe7, 0x5e, 0x9b, 0x13, 0x23, 0x7b, 0xc1, 0x0c, 0xa1, 0xc3, 0x62, 0x49, 0x6b, 0x39, 0x12, 0x48, 0x70, 0xbe, 0xe5, 0xa7, 0xb8, 0xcf, 0x4e, 0xaa, 0x49, 0x91, 0xb8, 0x06, 0x7c, 0xf4, 0x63, 0xb0, 0x19, 0x52, 0x39, 0xbd, 0x4f, 0x5e, 0xf8, 0xf7, 0x60, 0x83, 0x49, 0x5c, 0x31, 0x7e, 0x91, 0x47, 0x3c, 0x98, 0x5c, 0x04, 0x86, 0x7d, 0xf1, 0x0f, 0xac, 0x29, 0xae, 0x5a, 0xaf, 0x25, 0x11, 0x3e, 0xf7, 0xd8, 0xed, 0x64, 0x70, 0xe9, 0x14, 0x8a, 0xfd, 0x28, 0xbe, 0x9a, 0x95, 0x64, 0x98, 0x56, 0x7f, 0x64, 0x49, 0x33, 0x4a, 0xa6, 0x94, 0xfc, 0x5a, 0xf7, 0xff, 0xe9, 0x26, 0x93, 0x85, 0xae, 0xe4, 0x05, 0x99, 0xf4, 0x6d, 0x95, 0x25, 0x0c, 0x79, 0xc4, 0x20, 0xc8, 0x81, 0xe3, 0x03, 0x76, 0x7e, 0xa1, 0xb6, 0xd1, 0x2c, 0xa6, 0x16, 0xbb, 0x95, 0xa9, 0xcd, 0x41, 0x47, 0xba, 0x7b, 0x76, 0xad, 0x4b, 0x06, 0xbb, 0x8e, 0x0a, 0x17, 0xec, 0xcc, 0x67, 0x89, 0x53, 0xd3, 0x22, 0x7f, 0x11, 0xc1, 0x09, 0x91, 0xd3, 0xf6, 0x0e, 0x5a, 0x09, 0x9e, 0x1b, 0x41, 0x2b, 0x80, 0x80, 0x2f, 0xfe, 0x65, 0xcd, 0x34, 0x9b, 0x91, 0x1e, 0x32, 0xce, 0xe2, 0x6d, 0xc5, 0xd5, 0xf8, 0x0c, 0xbd, 0x6a, 0xd7, 0x16, 0x32, 0x79, 0x75, 0xc5, 0x2d, 0xc4, 0xa1, 0x22, 0x9e, 0x52, 0xaa, 0x95, 0x2a, 0x2f, 0xa6, 0x0d, 0x93, 0x25, 0x52, 0x79, 0xf8, 0x32, 0x6a, 0xba, 0x03, 0x08, 0xdb, 0xf6, 0x3c, 0x96, 0x25, 0x85, 0x4b, 0x76, 0x71, 0x92, 0x29, 0x48, 0x29, 0x4f, 0xac, 0x53, 0xe2, 0xdf, 0x41, 0xf3, 0xc0, 0xb7, 0x19, 0x1b, 0x50, 0xa8, 0x3b, 0x45, 0x38, 0x9a, 0x35, 0x4a, 0x20, 0xf1, 0x21, 0x20, 0xb5, 0x96, 0x03, 0xe2, 0x9f, 0x02, 0xd9, 0x9c, 0xc4, 0x37, 0xd9, 0xd4, 0x95, 0x32, 0xfb, 0x6e, 0x74, 0xe8, 0xf7, 0x42, 0xcb, 0x57, 0xbb, 0x2c, 0xe8, 0x54, 0x9f, 0x6a, 0x65, 0xa2, 0x2a, 0x75, 0x2e, 0xb9, 0x47, 0x14, 0xcd, 0xd2, 0xb9, 0xa0, 0xff, 0x5b, 0x45, 0x26, 0x89, 0x7e, 0xf9, 0xac, 0xef, 0x42, 0xc0, 0xd8, 0x73, 0x35, 0x67, 0x32, 0x8e, 0xcc, 0x65, 0x79, 0xf8, 0x42, 0x07, 0xa1, 0x86, 0xd8, 0x22, 0xe6, 0x07, 0xda, 0x10, 0xc9, 0xfa, 0xf5, 0x1f, 0x21, 0xb7, 0xef, 0x4b, 0x7c, 0x17, 0x5c, 0x7b, 0x69, 0x8a, 0x22, 0x56, 0x2c, 0xb8, 0xb2, 0x7c, 0xc7, 0x1b, 0x7d, 0x00, 0x7d, 0x4b, 0xb8, 0xab, 0x17, 0x5f, 0xd9, 0xc2, 0x1b, 0x4d, 0xac, 0x9b, 0xa0, 0xbd, 0xc8, 0xd1, 0xf7, 0x52, 0xeb, 0xf7, 0x90, 0x66, 0x3c, 0x6d, 0x17, 0x7d, 0xee, 0x06, 0xbb, 0xbf, 0xb1, 0xed, 0x8a, 0x6b, 0x76, 0x74, 0x89, 0x7d, 0xc8, 0xc6, 0x8f, 0xfc, 0x5f, 0x68, 0xba, 0x70, 0x4c, 0x44, 0xa4, 0x4c, 0xb4, 0x0d, 0x7a, 0x3e, 0xb0, 0x46, 0x8e, 0xc9, 0x5c, 0xff, 0x26, 0x94, 0x71, 0x4c, 0x3b, 0xaa, 0xa4, 0x22, 0xbe, 0xaa, 0x28, 0x5b, 0xc6, 0x63, 0xac, 0xe0, 0x8c, 0x5f, 0xf8, 0xfe, 0xc7, 0x14, 0xb4, 0x56, 0xa9, 0xcc, 0xc2, 0x67, 0xd4, 0x38, 0x6d, 0x18, 0x99, 0x3f, 0xb4, 0x79, 0x9b, 0x02, 0x37, 0xa1, 0x67, 0x01, 0x07, 0xd3, 0x57, 0xee, 0x42, 0x95, 0xc4, 0xee, 0x02, 0x6c, 0x64, 0x07, 0xc5, 0x10, 0xc5, 0xc1, 0x42, 0xe6, 0x12, 0x84, 0xc1, 0xac, 0xc7, 0x99, 0xaa, 0x82, 0x4f, 0x61, 0xb3, 0x90, 0xa5, 0x49, 0xec, 0x0b, 0x3e, 0xf7, 0x18, 0xad, 0x2f, 0xc6, 0x61, 0x88, 0xc8, 0xc9, 0x8e, 0x7c, 0x6d, 0x8e, 0x07, 0x74, 0x0c, 0x03, 0x95, 0x8b, 0x47, 0x27, 0x37, 0xa7, 0xeb, 0xc6, 0xe2, 0x7d, 0x7e, 0x1c, 0x12, 0x48, 0xef, 0x60, 0x4a, 0xd5, 0x34, 0x21, 0x6e, 0xc0, 0x11, 0x8d, 0xec, 0x1e, 0x50, 0x91, 0x99, 0xce, 0x67, 0xa4, 0xf0, 0xcb, 0x25, 0x0e, 0x00, 0xca, 0xd7, 0xc6, 0x40, 0xaf, 0xd4, 0x35, 0xb4, 0xd8, 0x39, 0x27, 0xde, 0x05, 0x4f, 0xb1, 0xa4, 0x74, 0x92, 0x59, 0x03, 0xc1, 0xd9, 0x71, 0xfd, 0xf3, 0x2d, 0x3a, 0xf9, 0xf0, 0x67, 0xd3, 0xd0, 0x95, 0x2a, 0x3f, 0x76, 0xf9, 0x9f, 0x8e, 0x22, 0xd1, 0xb9, 0x11, 0x02, 0x42, 0x1a, 0x95, 0xb0, 0x4d, 0x58, 0x5e, 0x2f, 0x24, 0xbe, 0xbb, 0xb8, 0x43, 0xa3, 0xcd, 0xc8, 0x87, 0x3d, 0x4b, 0xeb, 0x80, 0x4a, 0x5e, 0x77, 0x0e, 0xec, 0x06, 0xc4, 0x31, 0x7b, 0x82, 0xa4, 0x69, 0x72, 0x94, 0x1d, 0xc5, 0x13, 0x85, 0x2a, 0x84, 0xeb, 0xd4, 0x2f, 0x8f, 0xcb, 0xcb, 0xa2, 0x3f, 0x48, 0xa4, 0xed, 0x59, 0x40, 0x57, 0xca, 0x8b, 0xe2, 0xa2, 0x10, 0x59, 0x92, 0x92, 0x4f, 0x29, 0x50, 0x2d, 0x52, 0xe1, 0xee, 0xdc, 0xbe, 0x05, 0x2a, 0x76, 0x7d, 0x38, 0x6c, 0x3e, 0x7f, 0xb7, 0x48, 0x57, 0x35, 0x75, 0xc4, 0x41, 0x93, 0x21, 0xca, 0x87, 0xd5, 0x14, 0x30, 0x95, 0x2b, 0x4f, 0xc3, 0x6c, 0xc3, 0xce, 0x78, 0xe5, 0x25, 0x8e, 0xfe, 0x6b, 0x09, 0xfa, 0xf3, 0xd3, 0x13, 0x22, 0x14, 0xfb, 0x95, 0x50, 0x15, 0x67, 0x09, 0x4d, 0xc8, 0x91, 0x4b, 0x82, 0xd3, 0x9b, 0xf3, 0x14, 0xd9, 0xfb, 0xb2, 0x1a, 0x03, 0x30, 0xff, 0x58, 0x7e, 0xce, 0x51, 0xda, 0xb2, 0xa2, 0xc9, 0x66, 0x18, 0x84, 0x04, 0xd3, 0xe0, 0x57, 0x60, 0x8b, 0xf8, 0x74, 0x15, 0x12, 0x1c, 0x41, 0x09, 0x16, 0x59, 0xf9, 0xe7, 0x3b, 0x89, 0xe3, 0x27, 0xa9, 0x3d, 0xcd, 0x08, 0xa8, 0xe3, 0x14, 0x49, 0x87, 0x61, 0x28, 0x8f, 0x54, 0x7f, 0xdb, 0x9d, 0x0f, 0x7c, 0xde, 0x1f, 0xa2, 0x3a, 0xc8, 0xad, 0x37, 0x0a, 0x60, 0x86, 0x3f, 0x81, 0xd9, 0x52, 0x21, 0x5b, 0x49, 0xae, 0xb5, 0x18, 0x03, 0x56, 0xba, 0x46, 0x7c, 0xcc, 0xc7, 0xec, 0xf2, 0x6a, 0x29, 0xc8, 0xcc, 0x64, 0xbe, 0x5a, 0x61, 0xda, 0xf0, 0x34, 0xcb, 0x95, 0xed, 0xf2, 0x23, 0xbd, 0x6c, 0x09, 0x79, 0x68, 0x00, 0x00, 0x01, 0x09 }; +constexpr AccessUnit AVC_MULTIPLE_PACK_EXPECTED_AU_1 = { 0x15f90, 0x159b2, true, 0, {}, { 0xf3, 0x15, 0xed, 0x63, 0x82, 0x7c, 0xb1, 0xdf, 0x38, 0x75, 0x9e, 0x5e, 0xb4, 0x5e, 0xe2, 0xf2, 0x65, 0x6a, 0x58, 0xb1 } }; +constexpr AccessUnit AVC_MULTIPLE_PACK_EXPECTED_AU_2 = { 0x64615f94, 0x3c0159b2, true, 0, {}, { 0xbe, 0x1d, 0x4f, 0x54, 0x72, 0x44, 0x77, 0xa3, 0x09, 0x5e, 0x3b, 0xea, 0xc2, 0x55, 0x07, 0xb5, 0xcd, 0x33, 0x28, 0x6d } }; +constexpr AccessUnit AVC_MULTIPLE_PACK_EXPECTED_AU_3 = { 0x15f90, 0x159b2, true, 0, {}, { 0x37, 0xdb, 0xa1, 0x63, 0x9e, 0x5a, 0xff, 0x92, 0xd0, 0x54, 0xbd, 0xc6, 0x69, 0x4f, 0x38, 0x89, 0xb8, 0x4b, 0x66, 0xfb } }; +constexpr AccessUnit AVC_MULTIPLE_PACK_EXPECTED_AU_4 = { std::numeric_limits::max(), std::numeric_limits::max(), false, 0, {}, { 0x03, 0x31, 0xd3, 0xe2, 0xbb, 0x54, 0x06, 0xdb, 0xda, 0xe8, 0x0b, 0xfd, 0x96, 0x81, 0x66, 0x3f, 0x5c, 0x1b, 0xac, 0x69 } }; + +constexpr std::array M2V_MULTIPLE_PACK_STREAM = { 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xe0, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x00, 0x00, 0x01, 0x00, 0xb8, 0x7e, 0x91, 0xe4, 0x7b, 0x15, 0x52, 0x0c, 0x57, 0xe9, 0x3f, 0x05, 0x04, 0x5c, 0x02, 0x72, 0xde, 0x18, 0x8d, 0x08, 0x31, 0x03, 0x75, 0xa4, 0xfe, 0xfe, 0x0b, 0xda, 0xcb, 0x2f, 0x8d, 0xe9, 0xb3, 0xc0, 0x32, 0x65, 0x3e, 0xf8, 0x3d, 0x89, 0xd1, 0xe1, 0xcb, 0xe0, 0x8f, 0xad, 0x2e, 0x97, 0x22, 0x75, 0x3a, 0xcd, 0xcd, 0x6d, 0x5b, 0x4b, 0xff, 0x04, 0x9a, 0x4a, 0xfe, 0x8a, 0xc5, 0xd7, 0x10, 0x0a, 0xb1, 0x71, 0x50, 0x0b, 0x2f, 0x82, 0x31, 0x15, 0x66, 0xab, 0xe4, 0x4b, 0x25, 0x4f, 0x62, 0xf6, 0xe0, 0xab, 0x11, 0x11, 0x55, 0x65, 0x65, 0x79, 0x9b, 0xfb, 0xd8, 0x85, 0x6b, 0x53, 0x19, 0xc6, 0x1c, 0xfc, 0x24, 0x2d, 0x00, 0x9b, 0x57, 0xac, 0xd9, 0xfa, 0x7a, 0xe4, 0x60, 0x1f, 0x8a, 0xb8, 0x0c, 0x92, 0x85, 0x06, 0xe4, 0x34, 0xd7, 0xce, 0x80, 0x4b, 0x21, 0xf4, 0x5a, 0xea, 0x19, 0x4a, 0xb2, 0x0d, 0x25, 0x58, 0x07, 0x96, 0x58, 0xad, 0xde, 0x80, 0x5d, 0xa8, 0xff, 0x74, 0x8d, 0xaf, 0x1d, 0xd7, 0x90, 0x0e, 0x3d, 0xa1, 0x85, 0x1f, 0xf8, 0x1e, 0xf5, 0xc5, 0x35, 0x0d, 0x79, 0x50, 0xd4, 0x28, 0x5a, 0x8e, 0xae, 0xe3, 0x2f, 0xd1, 0x6b, 0xb7, 0xaf, 0x30, 0xa3, 0xf5, 0x00, 0xf6, 0xe5, 0x05, 0x8c, 0x5b, 0x3f, 0xb3, 0xb0, 0xb2, 0x35, 0x88, 0x65, 0x62, 0x3a, 0x7e, 0x20, 0x17, 0x61, 0x1f, 0x98, 0x10, 0x68, 0xf7, 0x8b, 0x29, 0x5a, 0x7e, 0x51, 0xe0, 0x09, 0x72, 0xde, 0xbc, 0xfd, 0x0b, 0xdf, 0x67, 0xa3, 0x8b, 0x4f, 0xe0, 0xa3, 0xfe, 0x33, 0x09, 0x38, 0x77, 0x97, 0x53, 0xa6, 0x11, 0x57, 0xb8, 0x5e, 0xed, 0x75, 0x1a, 0x66, 0xf4, 0x5f, 0x74, 0x13, 0x80, 0xb5, 0xfe, 0xce, 0x8c, 0x04, 0x32, 0x7e, 0xa1, 0x91, 0x39, 0x04, 0xcd, 0x4c, 0x2f, 0x59, 0x5d, 0xa6, 0xdb, 0x3d, 0xc6, 0x58, 0x66, 0x55, 0xca, 0x53, 0xdc, 0xc2, 0x3a, 0x07, 0xc0, 0xc2, 0x74, 0x7b, 0x28, 0xfc, 0xd0, 0xcd, 0x17, 0x03, 0xb3, 0x26, 0x8c, 0x9e, 0x60, 0x9c, 0x5b, 0x57, 0x3e, 0x44, 0x6f, 0xc0, 0x1f, 0xa7, 0xdd, 0xb7, 0xa0, 0x59, 0x3e, 0xd8, 0x25, 0x2d, 0xf1, 0x4e, 0x8a, 0x76, 0x86, 0x84, 0xe3, 0xf0, 0xec, 0x70, 0x87, 0xc2, 0x45, 0xc9, 0x3a, 0xd6, 0x4d, 0x4d, 0xc5, 0x18, 0x4b, 0x11, 0x29, 0x13, 0x05, 0x8e, 0x44, 0x90, 0xbb, 0x8c, 0xa6, 0x77, 0xeb, 0x64, 0x0c, 0xcf, 0x06, 0x14, 0x72, 0xeb, 0xfa, 0xca, 0x63, 0xc5, 0x7e, 0x9b, 0x7f, 0x83, 0x7c, 0x18, 0xd8, 0x21, 0xf0, 0xb7, 0xb6, 0x51, 0xf3, 0x7d, 0x4c, 0xb4, 0x38, 0xb4, 0xca, 0x25, 0xa9, 0x16, 0x5f, 0x48, 0xea, 0xef, 0x83, 0x92, 0x07, 0xc5, 0xec, 0x08, 0xa2, 0x39, 0x26, 0x98, 0xbb, 0x1c, 0x02, 0xba, 0xf8, 0xe4, 0xe4, 0xbb, 0xb3, 0x77, 0x19, 0x17, 0xbf, 0x97, 0xb2, 0x9a, 0x1f, 0x20, 0xea, 0xdc, 0xc5, 0x4e, 0xaa, 0xf5, 0x2e, 0x0e, 0xb8, 0x8a, 0x73, 0x8d, 0xab, 0xc3, 0x2b, 0x05, 0xe4, 0x43, 0xed, 0xbc, 0xc0, 0xd2, 0x18, 0x96, 0x1f, 0x65, 0xd0, 0xc7, 0x2b, 0x59, 0x12, 0xf3, 0x69, 0x48, 0x32, 0x47, 0xc5, 0x58, 0x8c, 0x00, 0x60, 0x8f, 0xb4, 0x29, 0x0b, 0xf0, 0x03, 0x88, 0x88, 0xfc, 0xbe, 0x7b, 0x80, 0x7d, 0x9f, 0x99, 0xae, 0xa4, 0xf2, 0x2d, 0xc0, 0x1a, 0xb3, 0xa5, 0x79, 0x7e, 0x16, 0x72, 0x74, 0xf4, 0x92, 0x77, 0x19, 0xbc, 0xfc, 0x8d, 0xf1, 0x0c, 0xf8, 0x32, 0xfc, 0xf3, 0xcf, 0x93, 0xb8, 0xc0, 0x82, 0x4e, 0x0e, 0x2f, 0x5c, 0xf2, 0x88, 0x38, 0x39, 0x0e, 0x30, 0x00, 0x7e, 0xcd, 0x84, 0xd1, 0xc6, 0x8b, 0xdd, 0x8c, 0x12, 0x0a, 0x81, 0x27, 0x23, 0x3f, 0xd4, 0x78, 0x99, 0xec, 0x53, 0xa1, 0xad, 0x71, 0x8a, 0xf8, 0x73, 0xf7, 0xb6, 0x6c, 0x07, 0xa9, 0xc0, 0xa7, 0x59, 0x70, 0x4f, 0xbd, 0x00, 0x7f, 0x65, 0xf3, 0x7f, 0x6a, 0xec, 0xe9, 0xec, 0x66, 0xce, 0x86, 0x26, 0x90, 0x01, 0x87, 0x0f, 0x4a, 0xfe, 0x13, 0xbc, 0x1b, 0xe5, 0xb2, 0x82, 0x1c, 0x5c, 0xf0, 0xcc, 0x89, 0x69, 0x0e, 0xda, 0x58, 0x2b, 0x4b, 0x42, 0x87, 0xcc, 0xd1, 0x6f, 0xc1, 0x7a, 0x80, 0x63, 0x2a, 0xc3, 0x28, 0x4c, 0xae, 0xf0, 0x77, 0x9a, 0xa9, 0xc2, 0x8b, 0x0d, 0xa3, 0xfc, 0x7e, 0xb9, 0x99, 0xa6, 0x2c, 0x9a, 0x4e, 0x10, 0x77, 0x20, 0xb5, 0x7c, 0x2d, 0xa6, 0x02, 0xee, 0x08, 0x6e, 0x4f, 0x5b, 0x8b, 0x9e, 0x35, 0xc3, 0x64, 0xdf, 0xf7, 0x7f, 0xc0, 0x57, 0xf4, 0x42, 0x0f, 0x16, 0xdd, 0xb2, 0xf5, 0x9c, 0x04, 0x0c, 0x97, 0x64, 0x48, 0x94, 0x0c, 0xc4, 0xfe, 0x9e, 0xce, 0x78, 0x0c, 0xda, 0xcd, 0x9d, 0x3d, 0x38, 0xd6, 0x83, 0x5d, 0x36, 0x52, 0x61, 0x86, 0x19, 0x23, 0x39, 0x51, 0x9f, 0xb5, 0x95, 0x5f, 0x1a, 0x6d, 0x36, 0x68, 0x3a, 0x01, 0xe3, 0x5f, 0x6e, 0x73, 0x0f, 0xf4, 0xb6, 0xc2, 0x3f, 0x14, 0x66, 0xa3, 0x77, 0x07, 0x6b, 0xed, 0x76, 0x85, 0x81, 0x0b, 0x16, 0x48, 0x34, 0x68, 0x8d, 0x50, 0xe7, 0x91, 0x85, 0x61, 0xff, 0x30, 0x37, 0x1f, 0x2f, 0x15, 0x9c, 0xa6, 0xa8, 0xcb, 0xfc, 0x0a, 0x92, 0x1a, 0xd8, 0x4c, 0x09, 0xa5, 0x40, 0x65, 0xb6, 0xbd, 0x2b, 0xca, 0xce, 0x72, 0xac, 0xb8, 0xe8, 0x46, 0xd5, 0x9a, 0x7e, 0xf1, 0x5f, 0x60, 0x2c, 0x05, 0xce, 0xb5, 0x71, 0xdd, 0xb8, 0x2f, 0xa8, 0xaa, 0x0e, 0xea, 0x37, 0x86, 0xf5, 0x06, 0x73, 0xae, 0x24, 0x9c, 0x02, 0x9d, 0x36, 0xb7, 0x0b, 0x3f, 0x5e, 0x0f, 0x80, 0xa0, 0xb1, 0xcb, 0x2a, 0x56, 0xe6, 0xa6, 0xac, 0x57, 0xe0, 0x92, 0x8d, 0xee, 0x28, 0x2b, 0x8f, 0xd3, 0x09, 0x67, 0xac, 0x37, 0xa9, 0x2d, 0x5b, 0x67, 0x38, 0xf0, 0xe0, 0x87, 0x8c, 0x6f, 0x05, 0x12, 0xff, 0xd4, 0x72, 0x02, 0x8c, 0x08, 0x05, 0xc3, 0x50, 0x3b, 0xaf, 0x97, 0x5f, 0xa3, 0xa9, 0x39, 0x63, 0xfa, 0x5a, 0x31, 0x32, 0x08, 0xbb, 0x5b, 0xf6, 0xd0, 0xd4, 0xd4, 0xb3, 0xe3, 0xa1, 0x52, 0x74, 0xd7, 0x46, 0xfe, 0x00, 0x88, 0x09, 0xaa, 0xed, 0xa3, 0x7b, 0x6b, 0x88, 0x72, 0x75, 0xf1, 0xdb, 0xc7, 0x8e, 0x49, 0x45, 0xd1, 0x02, 0x8f, 0xc0, 0x52, 0x33, 0x15, 0x9b, 0xd8, 0x5a, 0xb1, 0xf1, 0x61, 0x2a, 0x4a, 0xb0, 0x59, 0x0c, 0x5d, 0x08, 0xa7, 0xc6, 0x62, 0x4f, 0xfe, 0x5d, 0xa9, 0x54, 0xb5, 0xcd, 0xb8, 0x49, 0x7f, 0x62, 0x06, 0xa4, 0x38, 0x90, 0x0f, 0x39, 0x06, 0x3a, 0x52, 0xf1, 0x69, 0xd2, 0x98, 0x23, 0x0c, 0xbd, 0x72, 0x98, 0xf5, 0xf1, 0x12, 0x5e, 0xdf, 0xfc, 0x22, 0x00, 0x9e, 0x4b, 0xc8, 0x12, 0xf3, 0xe4, 0x84, 0xb0, 0x4e, 0xd3, 0xf2, 0xec, 0xf0, 0x11, 0x44, 0x0f, 0xb3, 0x8f, 0x12, 0xbf, 0x92, 0xa9, 0x51, 0x00, 0x00, 0x1b, 0x07, 0xf4, 0x2d, 0xa0, 0xce, 0xa3, 0x2b, 0xa0, 0x4c, 0xa7, 0x07, 0xa2, 0x05, 0x0e, 0xca, 0xd0, 0x1e, 0x85, 0xb9, 0x10, 0x6b, 0x4f, 0x21, 0x7e, 0x11, 0x46, 0x12, 0x64, 0xde, 0x78, 0x02, 0x97, 0xee, 0xe6, 0xfa, 0x1b, 0xa7, 0xe7, 0x77, 0x91, 0x11, 0x07, 0xfe, 0x06, 0x10, 0x8c, 0x8f, 0x4c, 0x3c, 0x72, 0x9d, 0x14, 0x57, 0xb1, 0x93, 0xbf, 0xad, 0x8b, 0xb1, 0x27, 0xfa, 0x0d, 0xdb, 0xae, 0xac, 0x76, 0xd8, 0xed, 0x76, 0x56, 0xb3, 0x2c, 0x5f, 0x56, 0x69, 0x06, 0x27, 0xaa, 0x24, 0x13, 0x71, 0x8d, 0x41, 0x93, 0x4f, 0x70, 0xa1, 0x3b, 0x16, 0xc6, 0xeb, 0x06, 0x20, 0x06, 0x7a, 0xb2, 0x9e, 0x48, 0x3c, 0x41, 0x94, 0xf7, 0x84, 0x41, 0x7d, 0x35, 0x58, 0xfe, 0x26, 0x8c, 0xb5, 0xd3, 0x69, 0x0f, 0x59, 0xf6, 0xf6, 0x36, 0x35, 0xb6, 0xa8, 0x9e, 0xa5, 0xbf, 0xfe, 0x7f, 0x31, 0x92, 0x28, 0x8c, 0xc3, 0x8b, 0x4a, 0x3b, 0x25, 0x9b, 0x2d, 0xdf, 0xc5, 0xfd, 0xa5, 0x45, 0x35, 0xfa, 0x7a, 0xec, 0x30, 0x4d, 0x9e, 0x10, 0x69, 0xf3, 0xa0, 0x10, 0x73, 0x67, 0x94, 0xc9, 0x63, 0x24, 0xe5, 0x46, 0x71, 0x48, 0x29, 0x48, 0x0e, 0xfa, 0xa6, 0xa8, 0xa6, 0x4b, 0x9f, 0xe6, 0x3c, 0xb5, 0x76, 0xa3, 0x4a, 0xc0, 0xeb, 0x34, 0x8f, 0x13, 0x44, 0x5e, 0x83, 0x44, 0x72, 0xd3, 0x99, 0xa1, 0x34, 0x35, 0x9c, 0x3b, 0xfd, 0xb4, 0x6c, 0x3b, 0x58, 0xf7, 0x86, 0xc0, 0x22, 0xa3, 0x02, 0xfc, 0xef, 0x4c, 0x3a, 0xf3, 0x89, 0x5f, 0x31, 0x7f, 0x9f, 0x5d, 0xab, 0x07, 0x0e, 0x8a, 0x0a, 0xed, 0x5d, 0x94, 0x90, 0xea, 0xf5, 0x28, 0x1c, 0x96, 0x3d, 0xd0, 0x3e, 0x5a, 0x6a, 0xef, 0xb4, 0x81, 0x06, 0x3c, 0x29, 0xfc, 0x1d, 0x5c, 0x79, 0x43, 0x91, 0xe0, 0xec, 0x93, 0xdc, 0xa4, 0xed, 0x66, 0xe0, 0xb9, 0xc0, 0x6a, 0x3e, 0x3b, 0x64, 0x39, 0x37, 0x8d, 0xb4, 0x0a, 0xdf, 0x46, 0x0d, 0x3f, 0xdb, 0x1a, 0x37, 0xd5, 0x96, 0x7b, 0x70, 0x09, 0x6d, 0xf8, 0xa5, 0xe0, 0xe8, 0x6e, 0xf3, 0xa4, 0x68, 0x16, 0xa3, 0xc5, 0x3a, 0x06, 0xc5, 0x31, 0x38, 0xa5, 0x15, 0xf2, 0x4d, 0xc3, 0x9f, 0x50, 0x04, 0xc9, 0x67, 0x90, 0x1a, 0x13, 0x8f, 0x48, 0x05, 0xec, 0x1d, 0x71, 0xf2, 0xae, 0x4a, 0x2b, 0x7f, 0x50, 0xef, 0x57, 0x7d, 0x68, 0x31, 0x7f, 0xf5, 0xfd, 0x9f, 0xf0, 0x74, 0x7c, 0x3b, 0xfb, 0x39, 0x33, 0xe9, 0xbb, 0x49, 0xb9, 0x01, 0xd7, 0x32, 0xb5, 0x64, 0x23, 0xb1, 0x83, 0x91, 0x2a, 0xbd, 0x4e, 0xdf, 0x84, 0x3a, 0x55, 0x62, 0x66, 0x9d, 0x16, 0x51, 0xd8, 0x2d, 0xf8, 0x86, 0x21, 0x15, 0x09, 0x00, 0xf1, 0xd2, 0x9f, 0x3b, 0x17, 0x25, 0x60, 0x5f, 0xbe, 0x6e, 0x40, 0x40, 0x58, 0xa3, 0xe3, 0x0b, 0x64, 0x34, 0x00, 0x00, 0x01, 0xba, 0xea, 0xd0, 0xb3, 0x4e, 0x2a, 0x24, 0x44, 0x53, 0xdd, 0x8b, 0x0d, 0x11, 0xf4, 0xb1, 0x4e, 0xe4, 0x56, 0x1b, 0xc1, 0x19, 0x97, 0xca, 0xf7, 0x5f, 0x52, 0x60, 0x22, 0xac, 0xa3, 0x25, 0xcd, 0xbd, 0x5c, 0xb7, 0x93, 0xaa, 0x44, 0x18, 0x08, 0xc8, 0x87, 0xa6, 0x5a, 0x21, 0x2d, 0x37, 0x8c, 0x92, 0xb4, 0xe8, 0xf2, 0x18, 0x97, 0x04, 0x71, 0x9a, 0xda, 0x51, 0x77, 0x05, 0xd7, 0x24, 0xdb, 0x9d, 0x32, 0x46, 0xbf, 0xcd, 0x6a, 0xbd, 0x05, 0xac, 0x29, 0xca, 0x20, 0x95, 0xc9, 0x6a, 0x1f, 0x02, 0x76, 0x11, 0xf6, 0x62, 0x7b, 0x09, 0x85, 0xca, 0x2e, 0x75, 0x09, 0xf9, 0x62, 0x00, 0x3f, 0x9f, 0x2d, 0xbc, 0x8f, 0x36, 0x45, 0xe0, 0x8d, 0xd1, 0xa7, 0xac, 0x32, 0x90, 0x73, 0xde, 0xd7, 0x1c, 0x98, 0xd4, 0xea, 0x97, 0x3c, 0x8b, 0xa2, 0x2a, 0x17, 0xaa, 0xfe, 0xf6, 0x20, 0x05, 0x1a, 0xdd, 0xf3, 0xef, 0xec, 0xa2, 0x2e, 0xc0, 0x57, 0x15, 0x48, 0xa0, 0x1d, 0x8a, 0x2f, 0x37, 0xc0, 0x31, 0xaa, 0x22, 0xb2, 0x1b, 0x13, 0xf4, 0xd0, 0xeb, 0xb6, 0x12, 0xeb, 0x87, 0xd1, 0xa0, 0x49, 0xe2, 0x71, 0x0b, 0x36, 0x91, 0xa2, 0x0b, 0x42, 0x1e, 0x9c, 0xfd, 0x88, 0x55, 0x41, 0x4a, 0x03, 0x05, 0xb9, 0xba, 0xfd, 0x3a, 0x39, 0x44, 0x5e, 0xf6, 0xf4, 0x29, 0x75, 0x67, 0xec, 0xfb, 0xad, 0x97, 0xf6, 0x14, 0x4f, 0xa9, 0xce, 0x6d, 0xb4, 0x6f, 0xa7, 0xec, 0xcd, 0xb8, 0xe8, 0xda, 0x38, 0x6e, 0x12, 0xa5, 0x29, 0xa9, 0x21, 0x08, 0xde, 0x5d, 0x45, 0x5b, 0x07, 0x35, 0xa5, 0xa6, 0x87, 0x55, 0x5e, 0xe8, 0x35, 0xbf, 0xe4, 0x4b, 0xcb, 0x82, 0xa0, 0x40, 0xe9, 0x2c, 0xfa, 0x5b, 0xc0, 0xee, 0xb4, 0x6b, 0xae, 0x1e, 0xeb, 0xa3, 0x2e, 0x94, 0x56, 0x14, 0x08, 0x54, 0x32, 0xcc, 0xcf, 0xa1, 0x66, 0x09, 0x9e, 0xdc, 0xae, 0xcd, 0xb7, 0x59, 0x82, 0x98, 0x55, 0x49, 0x5c, 0x64, 0xd0, 0x20, 0x90, 0x55, 0x8b, 0x68, 0xcf, 0x52, 0x3a, 0x4f, 0x66, 0xcd, 0x45, 0x6c, 0xe6, 0x55, 0xcf, 0xfe, 0x08, 0x05, 0x20, 0xae, 0xd1, 0x75, 0xed, 0x81, 0xf8, 0x07, 0xa1, 0xb7, 0xeb, 0xf4, 0x4b, 0xa2, 0x05, 0x32, 0x15, 0xbe, 0x72, 0x3c, 0x30, 0x93, 0xa1, 0xe8, 0x6a, 0x0c, 0x17, 0xb9, 0x59, 0x9f, 0xcf, 0x40, 0xdf, 0x3b, 0xe2, 0xc6, 0xb5, 0x17, 0x7f, 0xd3, 0x35, 0xdd, 0xcc, 0x90, 0x65, 0x06, 0x3a, 0x87, 0x77, 0xea, 0x45, 0x03, 0xe9, 0xbc, 0x4b, 0xf7, 0xcd, 0x4a, 0x94, 0x95, 0xc0, 0x48, 0xa9, 0xa5, 0xb0, 0x09, 0x3a, 0x2a, 0x9a, 0xf5, 0xda, 0x0b, 0x53, 0xbc, 0xf4, 0x3d, 0x29, 0xb2, 0x91, 0x9c, 0xe4, 0xc4, 0xa0, 0x31, 0xa3, 0xb6, 0x00, 0x00, 0x01, 0x09, 0x00, 0xb7, 0x03, 0xa3, 0xb5, 0xa3, 0x5f, 0x54, 0x42, 0x54, 0x25, 0x60, 0x23, 0x30, 0x0c, 0xfe, 0xe7, 0x82, 0x82, 0x62, 0x90, 0x80, 0x7e, 0x8a, 0x42, 0x04, 0x28, 0x08, 0x05, 0x25, 0x3c, 0x3e, 0xc8, 0xf0, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xe0, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0xe8, 0xa0, 0x50, 0x98, 0x8e, 0xe2, 0xf9, 0x39, 0xd1, 0xa9, 0x47, 0x6e, 0x97, 0x00, 0x1b, 0x58, 0x50, 0x91, 0xc4, 0x7e, 0x2b, 0xe4, 0x20, 0x64, 0xba, 0x27, 0x9b, 0x42, 0x41, 0x03, 0x96, 0x5e, 0x5c, 0x00, 0x5b, 0x9d, 0x08, 0xbf, 0x25, 0xba, 0xf7, 0x3b, 0xbb, 0xc0, 0xe9, 0x38, 0x77, 0x14, 0x46, 0x4b, 0xca, 0xa3, 0x1c, 0x3f, 0xa9, 0xed, 0x5c, 0x88, 0x99, 0x54, 0x00, 0xeb, 0xe5, 0xb0, 0x23, 0xe5, 0x84, 0x74, 0x29, 0x15, 0xb1, 0x37, 0x2d, 0xf6, 0x5b, 0xa4, 0xf0, 0x63, 0x9d, 0x9c, 0xd4, 0x78, 0x41, 0xfb, 0xd6, 0xf9, 0xf2, 0xb8, 0xe2, 0x0d, 0xc0, 0x32, 0x28, 0x29, 0xc5, 0xa7, 0x7b, 0xec, 0x87, 0x5f, 0x58, 0xdd, 0x8d, 0xb9, 0x47, 0xe9, 0x89, 0x27, 0x86, 0x3e, 0x9e, 0x69, 0x40, 0x15, 0xd6, 0xfc, 0x1a, 0x1c, 0xdb, 0x22, 0xbb, 0xd2, 0xc7, 0x80, 0x25, 0x6a, 0x1a, 0xe1, 0xef, 0x2d, 0x4a, 0xc8, 0xe2, 0xab, 0x48, 0x16, 0x45, 0x04, 0xad, 0x04, 0xb2, 0x63, 0x99, 0xc9, 0x09, 0x3b, 0xa3, 0xda, 0x4b, 0xcd, 0xd0, 0x5e, 0xe0, 0x64, 0x95, 0x8f, 0x48, 0x9a, 0x39, 0x99, 0x43, 0x6d, 0x4c, 0x5d, 0x03, 0xee, 0x15, 0xa2, 0x7a, 0xfa, 0xb2, 0x5f, 0xa1, 0xfe, 0x52, 0x6b, 0xc3, 0x25, 0xf6, 0xc7, 0x5b, 0x48, 0x9d, 0xea, 0xfc, 0xbd, 0xc9, 0x41, 0x8b, 0xbd, 0x3b, 0x29, 0x65, 0x92, 0xc5, 0x9f, 0x03, 0xec, 0xda, 0xa4, 0x61, 0xe3, 0x67, 0x47, 0xaf, 0xd0, 0x4b, 0xe3, 0xa4, 0x01, 0xd2, 0xef, 0x78, 0x29, 0x39, 0xf1, 0xcf, 0xf3, 0x56, 0x82, 0x0c, 0xb0, 0x37, 0x4a, 0xae, 0x48, 0x78, 0xd1, 0x7d, 0x8a, 0xdf, 0x05, 0x70, 0xe5, 0xed, 0x72, 0xe0, 0x22, 0xed, 0x16, 0x4b, 0xee, 0xec, 0x72, 0xf6, 0xb1, 0x54, 0x53, 0x2c, 0x25, 0xcb, 0x26, 0x02, 0xf3, 0x66, 0xf4, 0xec, 0x33, 0x4f, 0x99, 0x1a, 0xce, 0x2d, 0x4b, 0x9d, 0x50, 0x71, 0xd0, 0x1d, 0xf3, 0x06, 0xdb, 0x70, 0xe4, 0x58, 0xf2, 0xde, 0xb0, 0xef, 0x0d, 0xff, 0xfc, 0xe4, 0xe5, 0x0c, 0x36, 0x3a, 0x68, 0xa9, 0x25, 0x13, 0x1f, 0xed, 0xde, 0x39, 0x5e, 0x56, 0x4e, 0x29, 0x78, 0x12, 0x5c, 0x64, 0xff, 0xb2, 0xf7, 0x9e, 0x52, 0x14, 0x2d, 0xdd, 0x7d, 0x5f, 0x14, 0x87, 0xb4, 0x14, 0xa0, 0x58, 0xae, 0xf4, 0x9b, 0x83, 0x17, 0x30, 0x9c, 0xd1, 0x0c, 0x96, 0x55, 0xfb, 0x1d, 0x28, 0xc5, 0x97, 0xcf, 0x67, 0x4c, 0x68, 0x09, 0x33, 0x38, 0x4e, 0x39, 0xcc, 0x48, 0x88, 0xd6, 0xe8, 0x46, 0x95, 0x11, 0x28, 0xca, 0xf4, 0x18, 0xfc, 0xd3, 0x62, 0xea, 0x7e, 0x85, 0x3b, 0x1e, 0xbc, 0x13, 0x99, 0xc0, 0x3c, 0xd4, 0xad, 0x76, 0x8b, 0x54, 0xd4, 0x9b, 0x7c, 0xa7, 0xa1, 0xc8, 0x35, 0x2f, 0xa7, 0xfa, 0x6e, 0xe4, 0x5f, 0xf8, 0x14, 0xe5, 0x02, 0x0e, 0x7b, 0xee, 0x95, 0x21, 0x02, 0x31, 0x83, 0xd1, 0x8b, 0x40, 0x37, 0x54, 0xb4, 0x2d, 0x57, 0xad, 0x6d, 0xac, 0x1e, 0xf7, 0x13, 0x9b, 0x6b, 0xaf, 0xa3, 0x99, 0xa6, 0x06, 0x5e, 0x2d, 0x6b, 0x7c, 0xb7, 0xb0, 0x5f, 0x19, 0x0e, 0x73, 0x48, 0x77, 0xf5, 0x19, 0xb1, 0xa6, 0xec, 0x28, 0xa8, 0xb7, 0x60, 0xf4, 0x59, 0x18, 0x9f, 0xe1, 0x5a, 0x59, 0x60, 0x17, 0xa7, 0xdf, 0x53, 0x54, 0x74, 0x18, 0x50, 0x1a, 0x85, 0xb0, 0xe1, 0xa2, 0x13, 0x58, 0xd3, 0x94, 0x11, 0xa4, 0x8f, 0x63, 0xaa, 0xf0, 0x43, 0xb2, 0x64, 0x7b, 0x4f, 0x05, 0x86, 0xa0, 0xcf, 0xec, 0x4a, 0x93, 0x07, 0xf9, 0xbf, 0x85, 0x8a, 0x47, 0x24, 0x06, 0xf1, 0x56, 0xc4, 0xf3, 0x77, 0xe3, 0xb9, 0x40, 0x10, 0x73, 0x07, 0x68, 0x01, 0xce, 0x35, 0xfc, 0x5a, 0x53, 0x02, 0xfc, 0x99, 0xde, 0xdd, 0xbc, 0x0d, 0xf8, 0x8a, 0xe6, 0x0f, 0x80, 0xaf, 0xbd, 0xb1, 0xb6, 0x4f, 0x1b, 0x7a, 0x4a, 0xc4, 0x85, 0xec, 0xc1, 0x31, 0x36, 0xd7, 0x50, 0x8f, 0x98, 0x14, 0xd2, 0x1f, 0xb3, 0xac, 0x5c, 0xaa, 0x43, 0x07, 0xb0, 0xca, 0x6a, 0x0a, 0x14, 0x39, 0xfa, 0xa1, 0x0a, 0x59, 0xc8, 0xab, 0x50, 0x6a, 0xb7, 0x45, 0xbe, 0x97, 0xe4, 0xf0, 0xd3, 0xde, 0x26, 0x52, 0x55, 0x2f, 0x80, 0xc0, 0x60, 0x13, 0x08, 0xb3, 0x52, 0xbf, 0xac, 0xc0, 0xdd, 0x01, 0xac, 0xb9, 0xc8, 0xd7, 0x85, 0xf1, 0x3e, 0xf1, 0x95, 0xb5, 0x13, 0xc5, 0xc1, 0x99, 0x75, 0xf2, 0x13, 0xf3, 0x1f, 0x3b, 0x0d, 0x5b, 0xa2, 0xa7, 0x53, 0x78, 0xde, 0x12, 0x94, 0xda, 0x47, 0x67, 0xe6, 0x48, 0x9b, 0xb4, 0x0a, 0x24, 0x57, 0x46, 0x44, 0x57, 0x5e, 0x67, 0x56, 0x9c, 0xde, 0x40, 0x8b, 0x2e, 0x7c, 0xe1, 0x8a, 0x55, 0x9f, 0x7d, 0xe0, 0x91, 0xa8, 0xae, 0xbc, 0x00, 0x47, 0x7f, 0x71, 0x36, 0x7b, 0x5c, 0x6d, 0x0e, 0x64, 0xa7, 0x90, 0xf0, 0x21, 0x9c, 0x3d, 0xff, 0xcf, 0x34, 0x70, 0x7c, 0x52, 0x32, 0x79, 0xa6, 0x4d, 0xb3, 0x44, 0xb8, 0x19, 0x89, 0x10, 0x35, 0x19, 0xb7, 0x4e, 0xb5, 0x6e, 0x55, 0xe9, 0x98, 0x1c, 0x55, 0xfe, 0x83, 0xaf, 0xa4, 0xe9, 0x63, 0xa9, 0xa2, 0xd2, 0x30, 0xdb, 0xaf, 0xcb, 0xc3, 0x06, 0x59, 0xc3, 0x67, 0x98, 0x6a, 0xf4, 0xb4, 0x9c, 0x2b, 0x73, 0x97, 0x43, 0x47, 0x37, 0xec, 0x0c, 0xe9, 0x31, 0x8b, 0xf0, 0x2e, 0x6b, 0x50, 0x5f, 0x2f, 0xb4, 0x90, 0xde, 0x70, 0xc7, 0xcb, 0x68, 0x7a, 0x28, 0xa7, 0x78, 0x5d, 0xf2, 0x30, 0x80, 0xdb, 0x34, 0xde, 0xac, 0x78, 0x5a, 0xcd, 0xd8, 0xb4, 0x14, 0x77, 0x47, 0xa4, 0xdd, 0x88, 0xcf, 0x68, 0x86, 0x1b, 0x20, 0xec, 0xb1, 0xb8, 0x03, 0xc4, 0xca, 0x4e, 0x48, 0x34, 0x27, 0x24, 0x79, 0x55, 0x63, 0x9f, 0x39, 0x6c, 0x36, 0x47, 0x75, 0x91, 0x37, 0xaf, 0xb8, 0x96, 0x4e, 0x2d, 0xd3, 0x2d, 0xda, 0x60, 0x32, 0xd1, 0xc1, 0x4b, 0x6d, 0xd4, 0x68, 0xd1, 0x0f, 0x77, 0x27, 0x78, 0x22, 0x2f, 0xb6, 0x65, 0x98, 0xee, 0xd1, 0x9f, 0xa6, 0xa3, 0xeb, 0xe9, 0x12, 0xd3, 0x7a, 0x96, 0x25, 0x32, 0x29, 0xce, 0x70, 0x8b, 0xe5, 0xfc, 0x14, 0x8f, 0xd6, 0x9f, 0x0c, 0x19, 0x0d, 0x45, 0x55, 0x95, 0x5a, 0xcb, 0x97, 0x44, 0x1a, 0x5b, 0x80, 0xac, 0x62, 0xe9, 0xce, 0x14, 0x87, 0x42, 0x44, 0x04, 0x20, 0xc8, 0x88, 0x19, 0x25, 0x3a, 0xeb, 0x84, 0x67, 0x9a, 0xf2, 0x5a, 0x99, 0x3c, 0x28, 0x43, 0xb3, 0xca, 0xac, 0xfe, 0x01, 0x60, 0x91, 0x6f, 0x0d, 0x48, 0xbf, 0xf1, 0x46, 0xb9, 0x06, 0x2a, 0x95, 0xb9, 0x40, 0x6a, 0x8d, 0x9b, 0x1e, 0x61, 0xf3, 0x72, 0x43, 0xd5, 0x58, 0x2d, 0x73, 0x2f, 0x38, 0xc4, 0xc1, 0xd3, 0x15, 0xcf, 0x85, 0x82, 0x42, 0x52, 0x7d, 0x25, 0x29, 0xd0, 0x08, 0xcf, 0xab, 0x0a, 0x27, 0x60, 0x8c, 0xd3, 0xbb, 0x79, 0x73, 0x53, 0xc6, 0xdf, 0x74, 0x77, 0x3e, 0xfe, 0x6a, 0x83, 0x0a, 0x87, 0x45, 0x35, 0x9c, 0xb0, 0x1a, 0xb8, 0x41, 0x92, 0x95, 0xc7, 0x0e, 0xca, 0x0d, 0x4b, 0xf6, 0xf8, 0xf0, 0x97, 0xfc, 0x7b, 0x67, 0xb0, 0xc2, 0xe9, 0x3b, 0x38, 0xbe, 0x0a, 0x3d, 0x41, 0xed, 0x7f, 0x9c, 0x5d, 0xeb, 0x1a, 0xc6, 0x71, 0x06, 0xb4, 0x74, 0xbf, 0x7c, 0x39, 0x2f, 0xd2, 0x9a, 0x56, 0xec, 0xaf, 0x90, 0x0c, 0x57, 0x6e, 0xd7, 0x28, 0x86, 0xf4, 0xd7, 0x4f, 0x48, 0x02, 0xe7, 0xb4, 0xa9, 0xd0, 0x3e, 0x18, 0xe1, 0xc3, 0xdf, 0xf4, 0x99, 0xa6, 0x3b, 0xd1, 0xfe, 0x7f, 0xd3, 0x99, 0xbc, 0x11, 0xaf, 0x22, 0xaa, 0xcf, 0x55, 0x05, 0x45, 0x61, 0x5b, 0x3b, 0x84, 0x31, 0x53, 0x44, 0xab, 0x71, 0x57, 0xc7, 0x69, 0xd8, 0x40, 0xa4, 0x2f, 0x26, 0x3c, 0x7c, 0xc7, 0xfc, 0x61, 0x8b, 0xb3, 0xba, 0x7e, 0xf3, 0x43, 0xed, 0x71, 0xd7, 0x73, 0xa9, 0x36, 0x5d, 0x2f, 0x12, 0xe1, 0xe9, 0x18, 0x5a, 0xca, 0x6a, 0xce, 0x48, 0x54, 0x9b, 0x4c, 0x96, 0x02, 0xa8, 0xa6, 0x23, 0x92, 0x5e, 0xeb, 0x1d, 0xd2, 0x88, 0x50, 0x01, 0xa1, 0x40, 0x2b, 0x31, 0xba, 0xd4, 0x61, 0x8a, 0x4c, 0x22, 0x74, 0x87, 0x99, 0x74, 0x12, 0xff, 0x21, 0x13, 0x43, 0x7f, 0x25, 0x08, 0x8d, 0xf0, 0xdd, 0x47, 0x3a, 0x83, 0x17, 0xb4, 0x33, 0x4d, 0x25, 0xcc, 0xdd, 0x5c, 0xce, 0xed, 0xf4, 0xf1, 0x89, 0x2c, 0x2b, 0x89, 0x9a, 0x39, 0xf4, 0xc3, 0x0c, 0x7f, 0x37, 0x9d, 0xb6, 0xde, 0xdb, 0xb2, 0x3f, 0x01, 0xde, 0x1c, 0xd0, 0xe1, 0xf8, 0x2d, 0xf4, 0xbf, 0x1a, 0x8a, 0x8a, 0xc3, 0x15, 0x04, 0x4e, 0x83, 0x00, 0x06, 0xfd, 0xcb, 0xf4, 0xd1, 0x1c, 0xa7, 0x43, 0x02, 0x75, 0xa6, 0x66, 0x7d, 0x56, 0x60, 0xcc, 0x22, 0x51, 0xa9, 0xf9, 0x13, 0x51, 0x13, 0x89, 0x41, 0xfc, 0x13, 0x24, 0xcb, 0xf5, 0x2c, 0x65, 0x79, 0x7f, 0x7b, 0x6d, 0xa8, 0xdf, 0xee, 0xa2, 0x42, 0xf2, 0xe7, 0x23, 0xfe, 0xc0, 0x67, 0x5b, 0x27, 0x1c, 0x8f, 0x00, 0x3d, 0xe4, 0x37, 0x94, 0x05, 0x2e, 0xb7, 0x03, 0xb9, 0xa7, 0x69, 0xd4, 0xb8, 0xc4, 0x3c, 0xd0, 0x19, 0xc3, 0xf9, 0x78, 0x70, 0xf0, 0x2b, 0x6f, 0x89, 0xec, 0x73, 0xb7, 0xd6, 0xda, 0x55, 0xa5, 0xed, 0x39, 0xe1, 0x84, 0x7f, 0x87, 0x2a, 0x46, 0x3e, 0xa7, 0xa9, 0xcb, 0x04, 0x3e, 0xd2, 0xbf, 0xb2, 0x09, 0x35, 0x36, 0xa0, 0x14, 0xed, 0x51, 0xf8, 0x1d, 0xba, 0x98, 0xdc, 0x4e, 0x37, 0x93, 0x28, 0xc0, 0xda, 0xc9, 0xaa, 0x30, 0x8c, 0x87, 0x47, 0x60, 0xf2, 0xcc, 0xdf, 0xa2, 0xb6, 0xa6, 0xef, 0x1c, 0xa7, 0x02, 0x21, 0x39, 0xc1, 0x07, 0x85, 0xe1, 0x1a, 0x6f, 0xe3, 0xc8, 0xa4, 0x20, 0xb2, 0x8f, 0x7b, 0xfb, 0xfc, 0xe4, 0xc1, 0x9d, 0xaa, 0x10, 0x3d, 0x34, 0x70, 0xcf, 0xdf, 0x4a, 0x77, 0x40, 0x37, 0x0f, 0x81, 0xea, 0x5e, 0x96, 0x9c, 0xaf, 0x16, 0x79, 0x96, 0xb7, 0x0e, 0x5f, 0x1a, 0xc9, 0x97, 0x15, 0x79, 0x7f, 0x8e, 0x63, 0xdb, 0xcd, 0x99, 0xed, 0xdc, 0xf8, 0xbe, 0x82, 0xa6, 0x91, 0xe8, 0xb2, 0x3f, 0x91, 0x4a, 0x85, 0xf3, 0xe6, 0x1e, 0xa3, 0x55, 0x68, 0xdc, 0xe3, 0xaa, 0xe0, 0xf3, 0x20, 0x9e, 0xed, 0x30, 0x2f, 0xfb, 0xf6, 0x7e, 0x4c, 0xf3, 0x4b, 0xe8, 0xbb, 0x7c, 0x02, 0xc8, 0x78, 0x60, 0x4e, 0xe1, 0xe8, 0xe7, 0x5f, 0x0e, 0x66, 0xf1, 0x67, 0x3b, 0x98, 0x0c, 0xc2, 0xf4, 0x81, 0x95, 0xc4, 0x91, 0x94, 0xdf, 0xf9, 0x2e, 0x6d, 0x92, 0xd2, 0xf5, 0xa0, 0xa8, 0x13, 0x84, 0x5c, 0x3f, 0xc5, 0x9e, 0xf1, 0xab, 0xb7, 0x73, 0x16, 0x7b, 0x83, 0xe5, 0xf8, 0xe9, 0xfd, 0xce, 0xa4, 0x32, 0xa5, 0xeb, 0x33, 0x3c, 0x62, 0x14, 0x71, 0x2e, 0xe5, 0xa7, 0xa6, 0xf2, 0x48, 0x98, 0x2e, 0x43, 0xf0, 0xbb, 0xd0, 0xba, 0x26, 0x02, 0xd5, 0x41, 0xba, 0xcf, 0xd3, 0xf0, 0xcd, 0xd1, 0xf2, 0x49, 0xcf, 0x59, 0x30, 0x6a, 0x4c, 0xbf, 0xea, 0xb3, 0x03, 0x0b, 0x59, 0xb4, 0x13, 0x85, 0x03, 0xbe, 0xe2, 0xa1, 0xe3, 0x4c, 0x86, 0x71, 0xc7, 0x21, 0xdd, 0x80, 0xc1, 0x6a, 0x29, 0xda, 0x81, 0xb1, 0x0c, 0xcc, 0xa9, 0x75, 0xa0, 0x0c, 0x1f, 0xf1, 0x6b, 0xd5, 0x04, 0xf1, 0x9e, 0x46, 0x69, 0x07, 0x7b, 0x05, 0x76, 0xbf, 0xe3, 0x9a, 0xb5, 0x03, 0x2f, 0xb8, 0x4d, 0xbc, 0xca, 0x88, 0xa1, 0x06, 0x5b, 0xce, 0x06, 0x52, 0xa6, 0x1d, 0x80, 0x9d, 0x14, 0xca, 0xc0, 0xd8, 0x08, 0x7c, 0x94, 0x75, 0x17, 0x42, 0xd4, 0x1f, 0x6a, 0xca, 0x98, 0xf9, 0x0f, 0x45, 0x34, 0x8a, 0xac, 0xbe, 0x4d, 0x65, 0x7f, 0x4e, 0x9e, 0xd2, 0x2c, 0xc3, 0x75, 0x9e, 0x6f, 0xe9, 0x83, 0xb0, 0x3e, 0x9c, 0xee, 0x7c, 0x52, 0x04, 0x53, 0x59, 0x77, 0x68, 0x5c, 0x8c, 0x10, 0xfb, 0x3a, 0x34, 0x57, 0x22, 0xa2, 0xf0, 0xb1, 0x32, 0x3c, 0x4d, 0x33, 0xf9, 0xd8, 0x7b, 0xed, 0xbc, 0xbc, 0x00, 0xf2, 0x7d, 0x1a, 0xd9, 0x0e, 0x6e, 0xdc, 0x43, 0xa1, 0x7d, 0xa4, 0x1c, 0x72, 0x59, 0xf2, 0x04, 0xb7, 0x4e, 0x9e, 0xe0, 0x03, 0xe7, 0xcd, 0xe7, 0xfe, 0x2c, 0x81, 0x54, 0xc4, 0x48, 0x30, 0x9b, 0x4e, 0x07, 0x85, 0x34, 0x5b, 0xf5, 0xb5, 0x55, 0xb9, 0xb7, 0x36, 0xc8, 0xa2, 0xa7, 0xbb, 0xfd, 0xfd, 0x9b, 0x26, 0x91, 0xa6, 0x37, 0x0a, 0xbf, 0x7f, 0xd5, 0x4d, 0xf9, 0xf3, 0x50, 0x7c, 0x84, 0x63, 0xbe, 0x66, 0x01, 0x5f, 0x37, 0x78, 0xc5, 0x23, 0x93, 0x30, 0xbe, 0x1d, 0x8f, 0x51, 0xa3, 0x87, 0x38, 0x24, 0xb1, 0x36, 0xc6, 0xd5, 0xf3, 0x85, 0x47, 0xf0, 0xef, 0x1f, 0xdb, 0x95, 0xcf, 0x10, 0xb7, 0x10, 0x0c, 0xb5, 0x5d, 0x0a, 0x0d, 0x2a, 0xde, 0xd1, 0x0e, 0xf0, 0x28, 0x53, 0x24, 0x9b, 0xd6, 0x91, 0x79, 0x6e, 0x8f, 0xae, 0x73, 0x3c, 0x86, 0x2e, 0xb8, 0x9b, 0xf2, 0x29, 0xe8, 0xfc, 0x4b, 0x08, 0xd6, 0x81, 0xbb, 0xc3, 0x50, 0xb0, 0x5b, 0x8a, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xe0, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x01, 0x00, 0x0e, 0x6b, 0x6b, 0x11, 0xaf, 0x22, 0x52, 0x3f, 0x82, 0x51, 0x0e, 0xd7, 0x03, 0xd4, 0xae, 0x54, 0x10, 0x1e, 0x83, 0x75, 0x11, 0x11, 0xeb, 0xa0, 0xde, 0x5e, 0x24, 0x28, 0x9d, 0x29, 0x11, 0x45, 0xfd, 0x06, 0x89, 0xb8, 0x3a, 0x3d, 0xd5, 0x11, 0xa1, 0xb8, 0xb7, 0x7f, 0x02, 0xf0, 0x1b, 0xcf, 0xbd, 0x27, 0xf3, 0xd9, 0x5a, 0x92, 0xf4, 0x7f, 0x18, 0x4f, 0x61, 0x9a, 0x26, 0x0d, 0xe4, 0x2a, 0x7a, 0xab, 0x21, 0x9a, 0xa5, 0xa0, 0x12, 0x9a, 0x81, 0xab, 0xff, 0x10, 0xdb, 0x43, 0x61, 0x77, 0x7f, 0xe6, 0xc8, 0xb8, 0x96, 0x84, 0xa1, 0x2d, 0x0f, 0x0a, 0xbb, 0x8c, 0x68, 0x83, 0x7b, 0x6b, 0xc0, 0xf8, 0x51, 0xbb, 0x27, 0x2d, 0x70, 0x80, 0x90, 0x71, 0x4e, 0x0e, 0x21, 0x23, 0xe9, 0xb8, 0x6e, 0x49, 0x1f, 0x67, 0xea, 0x01, 0x3d, 0xff, 0xe0, 0xdc, 0xbe, 0xd6, 0x6a, 0x95, 0xcb, 0xda, 0xaf, 0x2b, 0x51, 0xce, 0xba, 0xa4, 0x9f, 0x09, 0x29, 0x8a, 0x20, 0x48, 0xd8, 0xa0, 0x37, 0xed, 0xc8, 0x75, 0xba, 0xc0, 0x01, 0x47, 0x47, 0x15, 0x15, 0xb5, 0xe2, 0x07, 0x7d, 0x89, 0x9d, 0x07, 0x7e, 0xa7, 0xcf, 0xe3, 0xe8, 0xe0, 0xa2, 0xf5, 0x12, 0x2b, 0xc0, 0x79, 0xc6, 0x64, 0xcd, 0xa4, 0x9f, 0xda, 0x2a, 0x39, 0x30, 0x69, 0x07, 0xbe, 0x6d, 0xb5, 0x4a, 0xa4, 0x79, 0x31, 0xef, 0xda, 0x88, 0x65, 0xc6, 0x95, 0x17, 0xfd, 0x0e, 0x13, 0xf2, 0x76, 0x47, 0xb4, 0x64, 0x7e, 0x4f, 0xb4, 0xa5, 0xb5, 0x36, 0xa3, 0x92, 0xa7, 0xc5, 0x3d, 0xfe, 0xb1, 0x64, 0x4a, 0xd6, 0x76, 0x5e, 0x17, 0xf9, 0x01, 0xe1, 0xc5, 0x42, 0x11, 0xf0, 0xcf, 0x96, 0x8f, 0x1c, 0x21, 0x64, 0x8a, 0x14, 0xb4, 0x80, 0xc8, 0x97, 0x31, 0x04, 0xff, 0xce, 0x5e, 0xc0, 0x10, 0xf7, 0xf2, 0x09, 0x80, 0x6f, 0x05, 0xc3, 0x44, 0xdc, 0xa7, 0xfe, 0x2f, 0x47, 0x43, 0xcc, 0xc7, 0xf9, 0xdf, 0x0f, 0xe4, 0x23, 0xdc, 0x44, 0xc5, 0xd8, 0x32, 0x5d, 0x8b, 0xda, 0x51, 0xf7, 0x34, 0xc7, 0xc1, 0xc8, 0xdd, 0x79, 0x18, 0x68, 0xb2, 0x33, 0xa5, 0x85, 0xec, 0xa2, 0x5f, 0xf8, 0x21, 0xf5, 0x4c, 0xb6, 0xb4, 0xd4, 0xdf, 0xaa, 0x7a, 0x93, 0x1b, 0x83, 0x26, 0x11, 0x06, 0xdb, 0x45, 0x65, 0x83, 0xb7, 0xe2, 0xba, 0xc9, 0x02, 0x4a, 0x29, 0x0f, 0xa7, 0x74, 0x3a, 0xd7, 0x8f, 0x23, 0xfa, 0x90, 0x29, 0x27, 0xf9, 0xa9, 0x13, 0x0b, 0x2d, 0x3d, 0x6c, 0xbe, 0xd4, 0xa0, 0xbc, 0x37, 0x28, 0x7f, 0x69, 0x82, 0x2f, 0xa7, 0x4d, 0x22, 0x87, 0x9f, 0xa7, 0x96, 0x6c, 0x93, 0xaa, 0x91, 0xe9, 0x1d, 0x36, 0x9c, 0x87, 0x7e, 0x27, 0x7f, 0x13, 0x59, 0xea, 0x3d, 0xcb, 0xe4, 0xe3, 0x56, 0x31, 0xb0, 0x9a, 0xfb, 0xc1, 0xe8, 0xe6, 0xf3, 0x10, 0x62, 0x80, 0x8b, 0x53, 0x1d, 0xe0, 0x1d, 0xc5, 0x44, 0x59, 0xb1, 0x29, 0xe2, 0x0c, 0x24, 0x37, 0xad, 0x7a, 0xd6, 0x7c, 0xb2, 0x68, 0xf6, 0x00, 0xa4, 0x30, 0x22, 0x0a, 0xd9, 0x06, 0xf5, 0xd2, 0x36, 0x0a, 0x27, 0x90, 0x11, 0x2b, 0x17, 0x6f, 0x22, 0x77, 0x6f, 0x19, 0x91, 0x73, 0x24, 0xfd, 0x42, 0x1f, 0x1d, 0x20, 0x8b, 0x45, 0x76, 0x35, 0x10, 0xcb, 0x21, 0x9f, 0x6d, 0x01, 0xd7, 0xda, 0x1c, 0xbd, 0x98, 0x0d, 0x19, 0x8b, 0x4a, 0x5b, 0x3d, 0x99, 0x73, 0x98, 0x7d, 0x7e, 0xac, 0xeb, 0x5b, 0xad, 0x97, 0xd1, 0xbc, 0x6f, 0x60, 0xed, 0x05, 0xe5, 0xa6, 0xa8, 0xda, 0x87, 0x34, 0x22, 0xad, 0x6d, 0xd9, 0x71, 0x3c, 0xc0, 0xce, 0x25, 0xef, 0xcd, 0x30, 0x54, 0x6d, 0xc5, 0xd4, 0xf7, 0x37, 0x89, 0x78, 0x89, 0x41, 0x0b, 0x65, 0xaa, 0x7b, 0x1b, 0xe0, 0xe7, 0x14, 0x0d, 0xe7, 0x24, 0xe4, 0x73, 0xa6, 0xd4, 0x06, 0xd2, 0x7a, 0x36, 0x44, 0xfe, 0xfd, 0xb8, 0x8f, 0xd9, 0x45, 0xc6, 0xb2, 0x35, 0x82, 0xdc, 0x1c, 0xf5, 0x9b, 0x2a, 0x4f, 0x30, 0xa0, 0xb6, 0x27, 0xc6, 0x93, 0x95, 0x35, 0x00, 0x2f, 0xfe, 0xab, 0x6f, 0xc6, 0x9d, 0xa3, 0x1e, 0x31, 0xe6, 0xd9, 0x7f, 0x53, 0x5d, 0x14, 0x56, 0xb2, 0x79, 0xf9, 0x06, 0xd9, 0x9e, 0x6a, 0x1d, 0x39, 0xba, 0x40, 0x26, 0xa1, 0xae, 0xf8, 0x57, 0xaf, 0x45, 0xad, 0x54, 0x31, 0x0c, 0x4a, 0xb0, 0xdd, 0x8c, 0xc2, 0xa3, 0x9b, 0x10, 0xe9, 0x67, 0x0f, 0x25, 0x5b, 0x53, 0x12, 0x0a, 0xda, 0x90, 0x7f, 0x62, 0x01, 0xba, 0x03, 0xd0, 0x6a, 0x61, 0x19, 0x88, 0x18, 0x0f, 0xe5, 0x7f, 0xec, 0x0e, 0x49, 0x25, 0x16, 0x0e, 0x9a, 0xd1, 0x3d, 0xf7, 0x5f, 0xfb, 0x92, 0x27, 0x85, 0x68, 0x9a, 0xbb, 0xf2, 0xc6, 0x98, 0xa2, 0xf2, 0x3b, 0xb5, 0x9f, 0xfe, 0x5f, 0x9d, 0x6e, 0xb6, 0xc4, 0x1e, 0xcc, 0xbd, 0x4c, 0x10, 0x24, 0xe1, 0x03, 0xf9, 0x7f, 0x7f, 0x3f, 0xb2, 0xe1, 0x63, 0x28, 0xfd, 0x8c, 0x2b, 0xff, 0xa7, 0xf9, 0x05, 0xc9, 0xd3, 0x92, 0xfd, 0xf8, 0x2f, 0x48, 0x0d, 0xa2, 0x9f, 0xb3, 0x23, 0xfe, 0xae, 0x95, 0x1d, 0x6e, 0xa6, 0xd8, 0xe1, 0x1a, 0x9f, 0xd7, 0x98, 0x34, 0x5e, 0x97, 0x26, 0xd1, 0xfe, 0x2e, 0xbb, 0xe2, 0x39, 0xa8, 0x09, 0xec, 0xcb, 0xb2, 0x07, 0xf1, 0x83, 0xf4, 0x5e, 0x1d, 0xa9, 0x0c, 0xa4, 0x8f, 0xa4, 0x7e, 0xba, 0x09, 0x30, 0xb0, 0x20, 0x1e, 0x23, 0xb6, 0x45, 0x1b, 0x6f, 0x44, 0x39, 0x3b, 0x28, 0xf0, 0xca, 0xe1, 0xf1, 0xc3, 0x4e, 0x6c, 0xb0, 0x57, 0xcf, 0x4f, 0xb5, 0x7a, 0x1b, 0xce, 0x45, 0x67, 0xd3, 0x36, 0xc7, 0x41, 0x84, 0x01, 0xb5, 0x57, 0xab, 0x0f, 0x34, 0xe0, 0xb8, 0x2c, 0xfe, 0xb2, 0x2f, 0x70, 0x9a, 0x5c, 0xbe, 0x7b, 0xc3, 0xdc, 0x6c, 0x9e, 0x76, 0xf2, 0xa2, 0xf6, 0x76, 0xbe, 0xb0, 0x70, 0x44, 0x77, 0x17, 0x69, 0x55, 0x7e, 0x85, 0xc5, 0xd7, 0x09, 0x55, 0x5a, 0x7f, 0x9b, 0xf3, 0x6a, 0xfa, 0x1e, 0x37, 0xad, 0xac, 0xe8, 0x75, 0x22, 0x32, 0xe8, 0x5c, 0xfc, 0x11, 0xf7, 0xb2, 0x5b, 0xce, 0xb7, 0x3b, 0x90, 0xaf, 0xec, 0xe2, 0x14, 0x1c, 0xdd, 0x56, 0x2e, 0xaf, 0x00, 0x24, 0x8c, 0x46, 0x64, 0x60, 0x51, 0x55, 0x1f, 0x62, 0xf5, 0x1c, 0x20, 0x11, 0x0a, 0x3a, 0x2c, 0x5c, 0xf1, 0x21, 0x04, 0x2e, 0x6a, 0x61, 0xc2, 0x11, 0x27, 0x1e, 0xf3, 0xfc, 0x26, 0x5a, 0x9f, 0x52, 0x02, 0xd4, 0x3a, 0xd8, 0x6d, 0xca, 0x4e, 0x34, 0x2a, 0x36, 0x41, 0xd3, 0x29, 0x71, 0xf7, 0x8c, 0xdb, 0x6d, 0x76, 0x3b, 0x1f, 0xfa, 0x3b, 0x83, 0xeb, 0x56, 0xcc, 0x46, 0x57, 0x43, 0x5e, 0x24, 0x2d, 0x6a, 0xb1, 0x42, 0xb8, 0x14, 0xe4, 0xdd, 0xc6, 0xed, 0xb0, 0x93, 0xc7, 0xbf, 0x1c, 0xcc, 0xc3, 0x0c, 0x5c, 0x32, 0x42, 0x73, 0xca, 0x71, 0x39, 0x5b, 0xfa, 0x8e, 0x8f, 0x28, 0xba, 0xa8, 0x69, 0xdc, 0xe7, 0x08, 0xa1, 0x8f, 0xdf, 0x6f, 0x3f, 0xb3, 0x8f, 0xc0, 0x86, 0xfb, 0xf7, 0xb2, 0x55, 0xd5, 0x77, 0x48, 0x27, 0x60, 0xdb, 0x12, 0x6f, 0x32, 0xc2, 0x4d, 0xd3, 0xbc, 0x34, 0xf4, 0xb4, 0x28, 0xf4, 0x90, 0xab, 0x78, 0x4d, 0xc8, 0x9f, 0x34, 0x4a, 0x66, 0x2c, 0x57, 0x73, 0xac, 0xde, 0x00, 0xc2, 0x23, 0x29, 0xd7, 0x47, 0x52, 0xc6, 0x36, 0x4d, 0xba, 0xbc, 0xce, 0x6c, 0xe6, 0xf2, 0xa2, 0x05, 0x59, 0x32, 0x99, 0x18, 0x38, 0xd4, 0x1b, 0x02, 0x03, 0x99, 0x06, 0xbe, 0x77, 0x42, 0xa0, 0x22, 0x2d, 0x01, 0x41, 0x58, 0x4b, 0x58, 0x7a, 0x0e, 0xf8, 0x94, 0x53, 0xe5, 0x24, 0xe5, 0xec, 0x23, 0x6b, 0x88, 0x65, 0xd3, 0x4e, 0xb9, 0xe9, 0x26, 0xab, 0x0b, 0x4f, 0xfb, 0xb3, 0x2d, 0x30, 0x7e, 0x27, 0x6d, 0x22, 0xd7, 0x06, 0x34, 0x35, 0xf4, 0x8b, 0x7f, 0xe0, 0x38, 0xc2, 0xbb, 0x30, 0xc9, 0x0d, 0xbe, 0x57, 0xcd, 0x5c, 0xa2, 0x48, 0x91, 0x9b, 0x11, 0x03, 0x65, 0xb1, 0x18, 0x81, 0x84, 0x56, 0x20, 0x54, 0xfc, 0x86, 0xc0, 0x6e, 0x7c, 0xdf, 0x59, 0x01, 0x67, 0x0e, 0x1d, 0x44, 0x21, 0xf7, 0xb4, 0xf4, 0xcc, 0x44, 0xb7, 0xf7, 0x27, 0xd7, 0xd4, 0xde, 0x82, 0xba, 0xac, 0xd2, 0x6c, 0x7d, 0x70, 0x79, 0x76, 0xf7, 0x56, 0x12, 0xf6, 0x69, 0x7c, 0x1c, 0x08, 0x98, 0x84, 0x90, 0x3e, 0x8d, 0x7f, 0x81, 0x2a, 0x65, 0xe4, 0x08, 0xc2, 0xb7, 0x84, 0x15, 0x92, 0x14, 0x70, 0xc9, 0xb3, 0xaf, 0x2c, 0x21, 0x32, 0x9d, 0x99, 0x60, 0xed, 0xf7, 0x81, 0x48, 0x41, 0x57, 0x51, 0xfb, 0x34, 0x26, 0x98, 0x8e, 0x21, 0x28, 0x29, 0xb9, 0x5c, 0xf3, 0x3b, 0x3b, 0x92, 0x49, 0x01, 0xd4, 0x71, 0x92, 0x39, 0x2a, 0x1a, 0xda, 0x2c, 0xa0, 0x2b, 0xed, 0xba, 0xe2, 0xb4, 0x27, 0x1f, 0x6a, 0x7c, 0x9b, 0xe9, 0xf7, 0x8a, 0x50, 0xc5, 0xc8, 0x89, 0xb4, 0xfe, 0x50, 0x46, 0x5b, 0xae, 0x52, 0x03, 0x52, 0x87, 0xcf, 0x2e, 0x31, 0x39, 0xa8, 0x16, 0xa6, 0xee, 0x39, 0x12, 0x55, 0x3c, 0xc7, 0xec, 0xba, 0x63, 0x14, 0xc8, 0x15, 0xa5, 0xae, 0x1f, 0x7e, 0x31, 0xb8, 0x05, 0xf7, 0xb8, 0xf3, 0x72, 0xb0, 0xe6, 0x6b, 0x63, 0x0e, 0x18, 0x5c, 0x87, 0xde, 0x18, 0x83, 0xc6, 0xb4, 0x44, 0x7c, 0xcc, 0x19, 0xdc, 0x63, 0x1d, 0x87, 0x9b, 0x39, 0xd5, 0x07, 0x90, 0xf0, 0x7b, 0x22, 0x7e, 0x72, 0x17, 0xe0, 0x6a, 0x87, 0x6f, 0xf3, 0x42, 0x62, 0x17, 0x84, 0x23, 0x63, 0xc0, 0xf4, 0x9a, 0x05, 0x63, 0x37, 0xae, 0x97, 0xf0, 0x33, 0xe0, 0x40, 0xc5, 0x2c, 0x27, 0x4e, 0x5a, 0xf3, 0x88, 0xab, 0xe8, 0x35, 0x84, 0x59, 0x50, 0xeb, 0x03, 0xab, 0x3a, 0x9e, 0xe9, 0x50, 0xf7, 0x54, 0x04, 0xb5, 0x9b, 0xf2, 0x75, 0xbd, 0xad, 0x03, 0xca, 0xce, 0x94, 0x79, 0x7c, 0x78, 0x4b, 0x0b, 0xd0, 0x3d, 0xfb, 0x99, 0xd3, 0x71, 0x35, 0x10, 0x4c, 0x29, 0xbd, 0xee, 0xcb, 0x16, 0xd8, 0xdc, 0x41, 0xb4, 0x81, 0xe3, 0xd9, 0x3a, 0xf8, 0x2f, 0x5c, 0xb4, 0x58, 0xb5, 0xf8, 0x55, 0x73, 0x56, 0xa2, 0x68, 0x8f, 0xb4, 0xe1, 0xe5, 0x5c, 0xbc, 0xe8, 0xad, 0x78, 0x72, 0x6e, 0x7d, 0x1e, 0xed, 0x4d, 0x1f, 0xa4, 0x95, 0x5d, 0x3b, 0x96, 0x3e, 0x8c, 0x2c, 0x2e, 0x7a, 0x34, 0x0d, 0xb2, 0xd7, 0x94, 0x44, 0x75, 0x92, 0x2d, 0xa3, 0x80, 0x49, 0x5f, 0x58, 0x2d, 0x08, 0x63, 0x50, 0x98, 0x59, 0x14, 0xe7, 0xf0, 0x0c, 0xb3, 0xb9, 0x38, 0x43, 0xaf, 0x93, 0x22, 0x2f, 0x73, 0x0a, 0xed, 0xd2, 0xdc, 0xe8, 0xdf, 0x02, 0x4b, 0xfe, 0x55, 0xda, 0x37, 0xfe, 0x4c, 0xb4, 0xce, 0x8f, 0x23, 0xb8, 0x2d, 0x1d, 0xde, 0x3b, 0x07, 0x48, 0x39, 0xee, 0x80, 0x36, 0x9f, 0x54, 0xfb, 0x99, 0xfe, 0xad, 0xac, 0x30, 0x08, 0x8e, 0x96, 0xdd, 0xca, 0x51, 0xd0, 0x69, 0xbd, 0x5d, 0xec, 0x34, 0x33, 0x41, 0xa9, 0x62, 0xbd, 0xac, 0x86, 0x83, 0x3e, 0xb9, 0x11, 0x2d, 0x35, 0xa8, 0xac, 0xba, 0x8c, 0xd2, 0xfe, 0x6c, 0xdf, 0xc5, 0xf6, 0x6b, 0xd8, 0x90, 0xc6, 0x9c, 0x6f, 0xf3, 0x49, 0x5d, 0x44, 0x89, 0xc7, 0x74, 0xdb, 0xe4, 0xf5, 0x7c, 0xe1, 0x82, 0x23, 0x74, 0x53, 0xf7, 0xa1, 0x22, 0xbf, 0xc0, 0xb7, 0xaf, 0xb6, 0xdf, 0x47, 0x15, 0x81, 0x64, 0x1c, 0xca, 0x21, 0xb9, 0x78, 0xa8, 0x70, 0x1d, 0x43, 0xdd, 0x54, 0xda, 0xd8, 0x51, 0xb9, 0xc8, 0x02, 0x7f, 0xe0, 0xaa, 0xd1, 0x35, 0x6c, 0x66, 0x2b, 0xff, 0x64, 0x5f, 0x82, 0xca, 0xd2, 0x09, 0xb8, 0x95, 0x23, 0xd5, 0x32, 0x31, 0xef, 0x30, 0xa3, 0x3b, 0x4d, 0xe5, 0xe2, 0x04, 0x07, 0xb6, 0x09, 0x1e, 0x4f, 0x87, 0xb8, 0x7e, 0xae, 0x34, 0x62, 0xe3, 0x73, 0x5c, 0xa8, 0x67, 0x76, 0x9f, 0xd2, 0xf5, 0x08, 0x36, 0x5a, 0x15, 0x42, 0x77, 0x54, 0x7f, 0x38, 0x54, 0x33, 0x11, 0xda, 0xf4, 0x96, 0x3e, 0x41, 0xcf, 0xe8, 0x59, 0x47, 0xb5, 0xd2, 0x77, 0x69, 0xf2, 0x7e, 0xd9, 0x12, 0x1c, 0xfa, 0x3f, 0x67, 0xc3, 0x12, 0x1e, 0x8d, 0x94, 0xa3, 0x5e, 0x8c, 0x5c, 0x89, 0x0d, 0xe6, 0xf4, 0x18, 0xeb, 0x8b, 0x03, 0x97, 0xd7, 0x3f, 0xb1, 0xda, 0x8d, 0x76, 0x2c, 0x04, 0x86, 0xd1, 0x20, 0xbf, 0x93, 0xa5, 0x79, 0xb3, 0xe2, 0x33, 0x22, 0xef, 0x14, 0x59, 0x03, 0x03, 0x7a, 0x05, 0xed, 0x30, 0x2c, 0x76, 0xf1, 0x12, 0x00, 0x5f, 0x0c, 0x13, 0xc0, 0xef, 0x79, 0xd6, 0xb6, 0x19, 0xa0, 0xb3, 0xc8, 0xf7, 0xbf, 0x29, 0xc7, 0x78, 0xcf, 0x6a, 0x39, 0x04, 0x1e, 0x78, 0x78, 0xbf, 0x52, 0xc1, 0x56, 0xfd, 0xd1, 0x2c, 0xcf, 0xe2, 0xb8, 0x6c, 0x2a, 0xbc, 0xdb, 0x57, 0xec, 0xba, 0x83, 0xaa, 0x07, 0xb4, 0xd4, 0x11, 0xe2, 0xbf, 0xa7, 0x24, 0x79, 0x3b, 0x84, 0x8c, 0x05, 0x4d, 0x94, 0xaf, 0x7a, 0x0d, 0x96, 0xc5, 0x00, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xe0, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x08, 0x5c, 0x89, 0xee, 0xed, 0x68, 0xbf, 0x74, 0xa2, 0x2c, 0x63, 0x0a, 0x80, 0x00, 0x01, 0x00, 0x25, 0x9f, 0xe4, 0x7b, 0xd4, 0xac, 0x7c, 0x3f, 0x34, 0xd5, 0xc5, 0xca, 0x11, 0xd2, 0xef, 0xbf, 0x83, 0xf5, 0x1e, 0x60, 0x48, 0x26, 0x6e, 0x5a, 0xe3, 0x03, 0xe5, 0x7e, 0xa4, 0xee, 0x66, 0xbb, 0x68, 0xcb, 0x37, 0x3a, 0x38, 0x3b, 0x0f, 0x99, 0x78, 0xa7, 0x2c, 0x99, 0x9c, 0xc3, 0xa6, 0xc5, 0x97, 0x72, 0x0e, 0x27, 0x48, 0xce, 0xe6, 0x5e, 0x98, 0xd0, 0xb2, 0xce, 0x4f, 0xf3, 0xff, 0xe7, 0x80, 0x16, 0xb9, 0x0a, 0x4f, 0xcc, 0x5c, 0xc6, 0x05, 0x48, 0xd2, 0xfa, 0x56, 0x3b, 0x7e, 0xe8, 0x8c, 0x67, 0x6a, 0xb0, 0x86, 0x95, 0x56, 0x86, 0x94, 0x7b, 0xac, 0x41, 0xef, 0xdf, 0x25, 0xcf, 0xc3, 0x91, 0xc7, 0x8e, 0xfb, 0xde, 0xca, 0x7b, 0xe5, 0x0c, 0x6d, 0x72, 0x27, 0xad, 0x5e, 0xd0, 0x57, 0x20, 0x99, 0x62, 0x02, 0x13, 0x26, 0x28, 0x1f, 0xc8, 0x38, 0x49, 0xcd, 0x80, 0xe6, 0x50, 0xea, 0xcd, 0x4c, 0xe9, 0x71, 0xfa, 0xca, 0xfd, 0xbd, 0xb1, 0xc5, 0x42, 0x31, 0x04, 0xa4, 0x79, 0x92, 0x55, 0xdf, 0x08, 0x8d, 0x42, 0x9d, 0xd6, 0x3c, 0x38, 0x0c, 0x5f, 0x3d, 0xf9, 0x0d, 0x41, 0xc4, 0xc5, 0xf7, 0x41, 0x9f, 0x37, 0x05, 0xc3, 0x94, 0xa6, 0x45, 0xbe, 0x9e, 0x32, 0x07, 0x64, 0x71, 0x2d, 0x04, 0x4c, 0x36, 0x89, 0xd3, 0xbc, 0x36, 0xfb, 0x40, 0x9c, 0x4f, 0x74, 0x34, 0xd1, 0x44, 0x75, 0x34, 0x3c, 0xf2, 0x2c, 0x89, 0x02, 0xe2, 0xc3, 0xb7, 0xcd, 0x37, 0x39, 0xa6, 0xf1, 0x5a, 0x84, 0xff, 0xfe, 0xbb, 0xd2, 0x50, 0xa8, 0x71, 0x16, 0xc7, 0xf1, 0x37, 0x4f, 0xc5, 0x2b, 0x14, 0x56, 0x7d, 0xd2, 0x94, 0xa3, 0x57, 0x36, 0xb0, 0xe6, 0x40, 0x6b, 0xa6, 0xbb, 0x43, 0xe9, 0x08, 0x41, 0x07, 0x65, 0x96, 0x7c, 0x60, 0xaa, 0x6d, 0x9b, 0xc6, 0x22, 0x56, 0x93, 0x55, 0x08, 0x60, 0x21, 0xa9, 0xd4, 0xda, 0x4d, 0x53, 0x05, 0x4f, 0xf1, 0x30, 0x06, 0xc4, 0x19, 0xa4, 0xc8, 0x2e, 0xd5, 0x82, 0xca, 0x79, 0xff, 0xea, 0x4f, 0x4f, 0xd4, 0xf7, 0x40, 0x84, 0x2e, 0x00, 0x23, 0xc6, 0x0a, 0xd8, 0xfc, 0xb8, 0x58, 0xd8, 0x71, 0xf6, 0xb0, 0xbc, 0x77, 0x7a, 0x12, 0xf2, 0xbe, 0xb1, 0xdb, 0x7f, 0xe4, 0xde, 0x2e, 0x49, 0x19, 0xb4, 0xc6, 0xee, 0xa0, 0x07, 0x51, 0x96, 0x81, 0xa1, 0xc2, 0x05, 0xac, 0xb5, 0x1d, 0x58, 0xc0, 0xba, 0x11, 0xb7, 0x93, 0xbf, 0x32, 0xd3, 0x0c, 0xb3, 0x0a, 0xbe, 0x96, 0xc7, 0x89, 0xfc, 0x89, 0x80, 0x4f, 0x59, 0x2a, 0xf8, 0xf4, 0x7d, 0x2c, 0x27, 0xf9, 0x3b, 0x6e, 0xc7, 0xc0, 0x86, 0x68, 0x08, 0xe8, 0x7f, 0x69, 0x22, 0xab, 0xe3, 0x1d, 0x1e, 0x5d, 0x2d, 0x0a, 0xd9, 0x40, 0x0b, 0x3d, 0x62, 0x18, 0xac, 0xf0, 0x77, 0x89, 0xd1, 0x96, 0x12, 0xdb, 0x07, 0xc5, 0x7e, 0xa3, 0xf5, 0x59, 0xcb, 0xd7, 0xae, 0x1d, 0x91, 0xf9, 0xb8, 0x62, 0xf4, 0x5f, 0x95, 0x79, 0x2f, 0x3c, 0x2e, 0x53, 0xb5, 0x85, 0xe0, 0x60, 0x68, 0x5b, 0x30, 0xf3, 0xa7, 0xd9, 0xc0, 0x69, 0x4b, 0xf7, 0x80, 0x5b, 0x52, 0x3d, 0xf8, 0x82, 0x9e, 0x08, 0xfb, 0xfe, 0x1d, 0x19, 0xc9, 0xd0, 0xb6, 0xaf, 0x56, 0x55, 0xd4, 0x92, 0x3b, 0x74, 0x5b, 0x71, 0x4b, 0x59, 0x36, 0xed, 0x8b, 0x40, 0xb8, 0xd6, 0xd2, 0x84, 0x49, 0x86, 0x29, 0x3d, 0x7e, 0xb7, 0x54, 0xdc, 0x87, 0xf8, 0xc9, 0x05, 0x8a, 0xef, 0x58, 0x80, 0x6b, 0xa3, 0x93, 0x04, 0x85, 0x7c, 0x88, 0xbf, 0x7b, 0xba, 0x22, 0xa5, 0x7f, 0x6f, 0xd3, 0x3e, 0xa2, 0x10, 0x8c, 0x7d, 0x7c, 0x93, 0x72, 0xb4, 0xb0, 0xed, 0xd7, 0x5e, 0xd4, 0x7c, 0x6b, 0x2b, 0x56, 0xca, 0x72, 0x14, 0xbd, 0xef, 0xe9, 0xb5, 0xa8, 0x49, 0x96, 0x62, 0x08, 0x09, 0x2c, 0xdd, 0xe7, 0xc7, 0x93, 0x7c, 0x58, 0x0b, 0x39, 0x94, 0x4b, 0xac, 0x82, 0x88, 0x3a, 0x99, 0x17, 0x21, 0xad, 0x27, 0x9a, 0xb4, 0x30, 0x72, 0x88, 0x4c, 0x17, 0x42, 0xe8, 0x34, 0xb9, 0xcb, 0x0d, 0xc8, 0x16, 0x18, 0xde, 0x70, 0xdd, 0xdf, 0x95, 0x36, 0xd1, 0x95, 0x98, 0x69, 0x42, 0x84, 0x11, 0xfa, 0xd1, 0xee, 0x17, 0xe5, 0x3d, 0xdc, 0x85, 0x6d, 0x05, 0xfe, 0x8c, 0x80, 0x48, 0x8e, 0x8a, 0xdc, 0xe7, 0x67, 0x16, 0x81, 0xeb, 0xfc, 0xae, 0x00, 0x3f, 0x23, 0xdc, 0xd1, 0x75, 0x12, 0x7c, 0x70, 0x71, 0xb6, 0x4b, 0xdd, 0xc8, 0x1e, 0x2f, 0x28, 0x62, 0x53, 0x72, 0xfe, 0x9e, 0x07, 0xe4, 0x5e, 0x23, 0x1a, 0xb5, 0xf0, 0xd9, 0xd7, 0xcb, 0x21, 0x22, 0xa8, 0x2b, 0x48, 0x46, 0xed, 0x96, 0xfc, 0x01, 0x65, 0x91, 0xe4, 0x5b, 0xd9, 0x9d, 0xdd, 0x74, 0x0c, 0x49, 0x11, 0x16, 0x60, 0x08, 0x14, 0x95, 0x88, 0x4f, 0x2a, 0xb6, 0x1a, 0x7a, 0x1c, 0x15, 0x79, 0xd2, 0x7e, 0xbc, 0xa3, 0x4f, 0x58, 0xd8, 0xa9, 0x85, 0xf4, 0xf5, 0x78, 0x72, 0x78, 0xd5, 0xcd, 0x61, 0x24, 0xef, 0x3b, 0xcf, 0x88, 0xa9, 0x86, 0xd5, 0xea, 0x8e, 0x66, 0xbb, 0x9d, 0x68, 0xd4, 0xca, 0x8a, 0x9b, 0x71, 0x31, 0x7c, 0x30, 0x9d, 0xb3, 0x33, 0xc4, 0xfd, 0xfb, 0x5d, 0xae, 0xe5, 0x8f, 0x63, 0xcd, 0xa0, 0x09, 0x5d, 0x8d, 0x63, 0xf3, 0xba, 0xa1, 0x80, 0xa5, 0xe3, 0x53, 0x84, 0x2c, 0x37, 0x4f, 0xf1, 0x82, 0xb6, 0x3a, 0x74, 0x12, 0xc3, 0xc2, 0x76, 0x3d, 0x2e, 0x87, 0x8b, 0xd6, 0x47, 0x38, 0x8b, 0x04, 0x19, 0x74, 0x86, 0xc5, 0x0e, 0xd0, 0x8c, 0xd4, 0x2c, 0xeb, 0x75, 0xfc, 0xa6, 0xaf, 0x3e, 0xdf, 0xac, 0x41, 0x17, 0x69, 0x91, 0x16, 0x73, 0xe0, 0x0e, 0xdc, 0x4b, 0x41, 0xa3, 0x7a, 0x72, 0x2c, 0xaa, 0xa7, 0xb6, 0x10, 0x3f, 0x51, 0x8c, 0xfe, 0xdb, 0x64, 0x2b, 0x3f, 0xee, 0xca, 0x94, 0x74, 0x13, 0x53, 0xa3, 0xa8, 0x8f, 0x5f, 0x6b, 0x4e, 0xbd, 0x8c, 0xc9, 0xd2, 0x9f, 0x4f, 0x01, 0xf0, 0xec, 0xdd, 0x4b, 0x77, 0x01, 0xd8, 0x7f, 0x16, 0x37, 0xec, 0xbf, 0xee, 0x54, 0xcc, 0xf0, 0x8d, 0xb0, 0x34, 0xc6, 0x31, 0x2d, 0xea, 0x07, 0x31, 0xe8, 0xdd, 0x45, 0x9b, 0x35, 0x47, 0x56, 0xe4, 0x61, 0x2f, 0xfe, 0x45, 0xdf, 0xde, 0xe8, 0x59, 0x25, 0x75, 0x75, 0xef, 0x69, 0x66, 0x33, 0x89, 0x9e, 0x2b, 0x8a, 0x44, 0x04, 0x6a, 0x81, 0x50, 0xad, 0x78, 0x39, 0xad, 0x16, 0x3e, 0x21, 0xd6, 0xbd, 0x98, 0x7e, 0x58, 0x25, 0xf5, 0x31, 0x3f, 0xcc, 0xce, 0xd0, 0x7d, 0x62, 0xe2, 0x2b, 0x3e, 0xe5, 0xec, 0xe3, 0x3b, 0xb5, 0x3d, 0x34, 0xc7, 0xf8, 0x64, 0x4b, 0x8c, 0xa2, 0xd8, 0x28, 0x32, 0xaa, 0xa7, 0x16, 0x55, 0xd8, 0xe8, 0x44, 0x20, 0x90, 0xc8, 0xb1, 0x7c, 0xbb, 0x99, 0xd1, 0xb1, 0x2d, 0x7a, 0x25, 0xaa, 0x85, 0x0d, 0xb1, 0xaf, 0x71, 0x66, 0x9a, 0x12, 0xc9, 0xe6, 0xc2, 0x27, 0xea, 0x69, 0x7d, 0xd3, 0x42, 0x6a, 0x3e, 0x22, 0x47, 0x62, 0xa6, 0x46, 0x21, 0xd3, 0xbe, 0x9d, 0x83, 0x0c, 0xcf, 0xa6, 0x11, 0xe7, 0x7a, 0xfd, 0x15, 0xd1, 0x9b, 0xd4, 0x2b, 0x0b, 0x16, 0x93, 0x68, 0x49, 0xdc, 0xd2, 0x00, 0x92, 0x1d, 0x08, 0xb2, 0x2f, 0x84, 0xfd, 0xda, 0xc0, 0xb1, 0x90, 0xf2, 0x63, 0x9c, 0xe0, 0x9e, 0x16, 0x91, 0x18, 0xc1, 0x6e, 0xc0, 0xde, 0xbf, 0x1d, 0xa3, 0xa7, 0xaa, 0x24, 0xde, 0x41, 0x1a, 0x8a, 0x77, 0xba, 0x18, 0xcc, 0x0e, 0xc7, 0x77, 0x34, 0x07, 0xaa, 0xfb, 0xfd, 0x6e, 0x6e, 0x8b, 0x34, 0x52, 0x20, 0x9d, 0x1c, 0xdf, 0x0e, 0x57, 0xef, 0x8c, 0xba, 0xcc, 0x26, 0x00, 0x7c, 0xf5, 0xf6, 0x23, 0x3e, 0x9b, 0x48, 0x54, 0xe3, 0x9c, 0x6e, 0xdc, 0x98, 0x79, 0xa7, 0xc4, 0x74, 0x7e, 0x15, 0xcf, 0x0e, 0x9c, 0xae, 0xca, 0xaa, 0x98, 0xbf, 0xaf, 0xd7, 0x0a, 0x05, 0x6d, 0xf7, 0xf3, 0xcb, 0x7c, 0x07, 0x03, 0x2a, 0x11, 0xc0, 0x66, 0x8e, 0x27, 0x16, 0xfc, 0x67, 0x58, 0x6f, 0x01, 0x21, 0x92, 0xe4, 0x68, 0x0c, 0x80, 0x97, 0x37, 0xb8, 0x1e, 0xd2, 0x07, 0x57, 0x8f, 0xe0, 0x3f, 0xc3, 0xda, 0xf1, 0x22, 0x43, 0xc2, 0x95, 0xa8, 0x0d, 0xd5, 0x7c, 0xc9, 0x8a, 0x87, 0x14, 0xd7, 0xb2, 0xb9, 0x4e, 0xdf, 0x5b, 0xd1, 0x59, 0xe5, 0xe4, 0x99, 0x8f, 0xa4, 0x8d, 0xdc, 0x2a, 0x6f, 0x87, 0x00, 0x22, 0x23, 0xe0, 0x58, 0xff, 0xf6, 0x37, 0xea, 0x7a, 0xbf, 0x38, 0x98, 0x56, 0x64, 0xb6, 0x01, 0xc3, 0x7a, 0x43, 0x1b, 0x15, 0x96, 0x80, 0x69, 0xc2, 0xa8, 0x9c, 0xac, 0x79, 0x8b, 0x2a, 0xd6, 0x58, 0xa3, 0x0b, 0x9a, 0x41, 0xc3, 0x57, 0xc0, 0x91, 0x91, 0x2a, 0x68, 0x23, 0xd2, 0x0f, 0xeb, 0x80, 0x16, 0xf0, 0x0c, 0xff, 0x96, 0xb4, 0x4f, 0x31, 0x65, 0xd7, 0x3d, 0xc5, 0xaf, 0xf6, 0x68, 0x15, 0xa5, 0x34, 0x3a, 0xb7, 0x34, 0x16, 0x0d, 0x42, 0xda, 0xde, 0x1e, 0x4a, 0x3c, 0xde, 0x3a, 0xd0, 0x5e, 0x25, 0xb6, 0x95, 0x8c, 0x07, 0x8d, 0xd6, 0x22, 0xac, 0x83, 0x75, 0x64, 0xa4, 0x8d, 0x8a, 0xa4, 0x60, 0x21, 0xb7, 0x1d, 0xf5, 0xc9, 0xb0, 0x0c, 0xca, 0xfe, 0x63, 0xd8, 0x16, 0xb2, 0xad, 0x63, 0xc4, 0xdb, 0x61, 0x36, 0xb0, 0x11, 0x29, 0xe6, 0xa2, 0xfe, 0xdf, 0x66, 0x89, 0x3f, 0xa9, 0xe0, 0xfc, 0x4e, 0x6b, 0x83, 0xdd, 0x75, 0x09, 0x66, 0x36, 0x20, 0x95, 0xb3, 0xdb, 0x3c, 0x9b, 0xba, 0x3e, 0xb4, 0xe8, 0xad, 0xc2, 0x24, 0xee, 0xb3, 0x8d, 0xc3, 0xa8, 0x0b, 0xa2, 0x95, 0x0d, 0xd0, 0x68, 0xba, 0x64, 0x4b, 0xdb, 0x20, 0x10, 0xb7, 0xcc, 0x1d, 0xb9, 0x3a, 0x4c, 0xf5, 0x7c, 0xf5, 0xd6, 0x24, 0x82, 0xec, 0x17, 0x3e, 0x1f, 0x7b, 0xdd, 0x63, 0xfe, 0xc3, 0xed, 0x93, 0x34, 0x78, 0x90, 0xe4, 0xe1, 0xec, 0xa8, 0x3d, 0xb9, 0x52, 0xee, 0x7b, 0x1b, 0xf6, 0x33, 0x53, 0x5b, 0xb9, 0x08, 0x96, 0x04, 0x9e, 0xdd, 0xe1, 0x6f, 0xbe, 0x59, 0xe0, 0xdf, 0x8a, 0x9a, 0x2c, 0x64, 0x17, 0xf1, 0x2d, 0x86, 0x1e, 0xe1, 0x66, 0xa9, 0xe6, 0xaa, 0x81, 0x2c, 0xca, 0x6f, 0xc9, 0xe1, 0xe1, 0x48, 0x0b, 0xdf, 0xe6, 0x39, 0xda, 0xd0, 0x14, 0x45, 0x44, 0x6b, 0x96, 0xe1, 0xb2, 0xbb, 0x78, 0xaa, 0x40, 0xe5, 0x89, 0xba, 0x56, 0x83, 0x8b, 0x70, 0x80, 0x18, 0xa4, 0x9f, 0x4c, 0xb2, 0x94, 0x72, 0xdf, 0x42, 0xa6, 0x3b, 0xd4, 0xe4, 0x88, 0x97, 0x29, 0x4f, 0x82, 0xa1, 0xde, 0xfd, 0x6c, 0x4c, 0xdc, 0x01, 0x6b, 0x1f, 0x89, 0x31, 0x6b, 0x71, 0x87, 0x7f, 0xe8, 0x9f, 0xf3, 0xd4, 0x0b, 0xc8, 0x0e, 0x1c, 0xc8, 0x4f, 0x4c, 0x66, 0xe3, 0x86, 0x7c, 0xb4, 0x8b, 0x24, 0xb6, 0x3d, 0x65, 0x13, 0x97, 0xea, 0x3f, 0x3c, 0xfd, 0x02, 0x1f, 0xe6, 0x10, 0x0f, 0x6d, 0xc4, 0xe3, 0x5a, 0x82, 0xd5, 0x61, 0xc1, 0xd3, 0x72, 0x66, 0x7f, 0xf4, 0x0c, 0xe5, 0x9f, 0x98, 0x04, 0xd2, 0x59, 0x5b, 0x89, 0xe1, 0xc4, 0x13, 0x66, 0x8b, 0xed, 0x49, 0x44, 0x06, 0x00, 0x0a, 0xab, 0x6b, 0x45, 0x4a, 0x44, 0x51, 0xcc, 0x02, 0x0b, 0x86, 0x9f, 0xdb, 0xb2, 0xa7, 0x49, 0x58, 0x09, 0xdc, 0x81, 0x79, 0x5b, 0x7c, 0x36, 0x8c, 0x8f, 0x88, 0x37, 0x8e, 0x22, 0x3e, 0x39, 0xb6, 0xa7, 0x46, 0x8f, 0x4f, 0x2c, 0x3c, 0x7a, 0xe8, 0xf2, 0xaf, 0x1b, 0x34, 0xa7, 0xf7, 0x1f, 0x3f, 0x94, 0x6e, 0xba, 0xb5, 0xae, 0xdb, 0xe5, 0xfa, 0x7d, 0x41, 0x3f, 0xfe, 0xdd, 0x67, 0x62, 0x31, 0xa7, 0xdf, 0x7f, 0x0a, 0x81, 0xcb, 0x56, 0x0f, 0xde, 0x40, 0x0c, 0x75, 0x22, 0xe4, 0x06, 0x0a, 0x97, 0x9a, 0x81, 0x33, 0xa3, 0xd5, 0xa9, 0x5d, 0xb6, 0x4b, 0xf9, 0x11, 0x9b, 0xb7, 0xac, 0x7a, 0xc9, 0x70, 0x33, 0x9a, 0xa8, 0x63, 0x13, 0x84, 0x94, 0x69, 0x41, 0xf1, 0x82, 0xf3, 0x03, 0x6c, 0x27, 0x64, 0xb9, 0xfc, 0x8c, 0xc9, 0x66, 0x6d, 0x89, 0x87, 0x64, 0x04, 0xa8, 0xf6, 0x93, 0x5e, 0x0a, 0x73, 0x9e, 0xcb, 0xee, 0x60, 0x15, 0x04, 0xeb, 0x9b, 0x7e, 0x8d, 0x51, 0x45, 0xc5, 0x54, 0x3e, 0x51, 0xdb, 0x7e, 0x07, 0x51, 0x0d, 0x1d, 0x2f, 0xf8, 0x9f, 0xe7, 0xef, 0x0b, 0x13, 0x4d, 0xa2, 0x37, 0xdd, 0x38, 0x7d, 0x8c, 0x97, 0x2f, 0xcb, 0xbd, 0x1b, 0x56, 0x61, 0xd1, 0xe3, 0x6c, 0x02, 0x4f, 0x6b, 0x41, 0xff, 0xc9, 0xa5, 0x49, 0x0f, 0x92, 0x03, 0x1b, 0x32, 0xc4, 0xdf, 0x84, 0x02, 0x4f, 0x59, 0x47, 0xe4, 0x1d, 0xd2, 0x95, 0x5f, 0x6c, 0x9f, 0x3e, 0x2c, 0x6a, 0xd4, 0xae, 0x69, 0x5a, 0xed, 0xc6, 0xcb, 0x92, 0xee, 0xb8, 0x58, 0x0e, 0x51, 0xed, 0x72, 0xab, 0x58, 0xa4, 0x11, 0x5c, 0x02, 0x9f, 0xb0, 0xce, 0x88, 0x7d, 0x35, 0xca, 0xa3, 0xd9, 0xc7, 0x62, 0x75, 0x36, 0xc4, 0xe4, 0xec, 0x00, 0x00, 0x01, 0xb7 }; +constexpr AccessUnit M2V_MULTIPLE_PACK_EXPECTED_AU_1 = { 0x15f90, 0x159b2, true, 0, {}, { 0xb2, 0x5b, 0x25, 0x1f, 0x28, 0xf8, 0x1e, 0x80, 0xc8, 0x72, 0x45, 0xed, 0xef, 0xe9, 0xb6, 0x08, 0x83, 0x20, 0xcd, 0x25 } }; +constexpr AccessUnit M2V_MULTIPLE_PACK_EXPECTED_AU_2 = { 0x28144c47, 0x7e4e68d4, true, 0, {}, { 0xee, 0x18, 0x40, 0x38, 0x32, 0xb8, 0x2d, 0xa4, 0xe1, 0x8b, 0x09, 0x40, 0xfa, 0x8e, 0xfa, 0x64, 0x8f, 0xcd, 0x7c, 0x40 } }; +constexpr AccessUnit M2V_MULTIPLE_PACK_EXPECTED_AU_3 = { 0x15f90, 0x159b2, true, 0, {}, { 0xf5, 0x44, 0x36, 0x81, 0xe4, 0xff, 0x09, 0x3d, 0xd8, 0x28, 0xd3, 0x2b, 0xf2, 0x04, 0x7e, 0xdb, 0x90, 0x88, 0x6d, 0xdb } }; +constexpr AccessUnit M2V_MULTIPLE_PACK_EXPECTED_AU_4 = { std::numeric_limits::max(), std::numeric_limits::max(), false, 0, {}, { 0xd4, 0x82, 0xc6, 0x8d, 0x56, 0x01, 0x42, 0x07, 0x40, 0x81, 0xeb, 0x25, 0xc5, 0xc9, 0x24, 0x24, 0x0e, 0x24, 0x39, 0x4c } }; + +constexpr std::array ATRACX_MULTIPLE_PACK_STREAM = { 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xbd, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x00, 0x00, 0x00, 0x00, 0xfb, 0xb7, 0x4a, 0xf6, 0xa9, 0xd4, 0x7b, 0x0f, 0xd0, 0x00, 0xd7, 0xe7, 0x12, 0x43, 0x4c, 0x62, 0x89, 0xa6, 0xc2, 0x04, 0x70, 0x0e, 0x0b, 0xab, 0x92, 0x01, 0x5f, 0x90, 0x5c, 0x0a, 0x9a, 0xc6, 0x0c, 0x34, 0x34, 0xae, 0x42, 0x9c, 0x20, 0x2e, 0x01, 0x84, 0xbf, 0xf9, 0x16, 0x5f, 0xab, 0xb7, 0x91, 0xaa, 0xb2, 0x45, 0xc8, 0x5d, 0x83, 0x75, 0xbc, 0x67, 0xfe, 0xe8, 0x4f, 0xa0, 0xf6, 0x59, 0x01, 0xbb, 0xeb, 0x58, 0x61, 0x1f, 0x2b, 0xe1, 0x29, 0x19, 0x59, 0x6f, 0xfc, 0x3b, 0x04, 0xb2, 0xb2, 0x44, 0x0a, 0xa3, 0xd7, 0x5c, 0x13, 0x8c, 0x75, 0x89, 0x3a, 0x08, 0xce, 0xe8, 0x88, 0xc7, 0x31, 0xf1, 0x29, 0x74, 0x45, 0xc8, 0x34, 0x89, 0xac, 0xc3, 0x83, 0x21, 0xed, 0x1c, 0x70, 0xea, 0x47, 0x92, 0x74, 0x8f, 0xa7, 0x81, 0xf6, 0xae, 0x70, 0x64, 0xae, 0xb0, 0x73, 0xad, 0x6e, 0x54, 0xcb, 0x98, 0x46, 0x39, 0x41, 0x45, 0x11, 0xad, 0xde, 0xb6, 0xdd, 0xa9, 0xe3, 0x8c, 0xf8, 0xe2, 0x3d, 0x73, 0x98, 0x81, 0xf3, 0x70, 0x8e, 0x7e, 0xe1, 0x5a, 0x1f, 0x25, 0x47, 0x01, 0x74, 0x39, 0xf0, 0xe7, 0x85, 0x9d, 0x37, 0x6e, 0x12, 0xed, 0x4d, 0x12, 0x52, 0x21, 0xc1, 0xc2, 0xf8, 0x68, 0xc1, 0xf9, 0x18, 0x0d, 0xda, 0x8c, 0x6f, 0x30, 0xa2, 0x39, 0x5d, 0x4d, 0x7f, 0x7f, 0x93, 0x72, 0xf6, 0x17, 0x9a, 0xd5, 0xa0, 0x03, 0x64, 0xfe, 0x33, 0xfd, 0xc9, 0x9d, 0xab, 0x30, 0xb1, 0x04, 0x4c, 0x85, 0x95, 0xb5, 0x00, 0xb4, 0x53, 0x8c, 0xbb, 0x93, 0x99, 0x86, 0x47, 0x51, 0x94, 0x39, 0x96, 0xcc, 0x87, 0x1a, 0x05, 0xdf, 0xff, 0xbe, 0x29, 0xa3, 0x76, 0xe4, 0x4a, 0xcd, 0xaf, 0x68, 0xc8, 0xb2, 0x30, 0x03, 0x29, 0x51, 0x15, 0xd5, 0xb1, 0x75, 0xcb, 0x5d, 0xba, 0xfe, 0x04, 0x98, 0x48, 0x86, 0xe1, 0xcc, 0x16, 0x3d, 0x9e, 0x3c, 0xab, 0x8f, 0xf2, 0xec, 0x05, 0x24, 0xeb, 0xa8, 0x17, 0xd5, 0xe1, 0x86, 0xac, 0x86, 0x49, 0xb8, 0xe3, 0xc5, 0x88, 0x2e, 0xc7, 0xaf, 0xa4, 0xa9, 0x56, 0x98, 0x82, 0xc3, 0x1f, 0x4c, 0x4c, 0x39, 0x3a, 0x40, 0x58, 0x16, 0x1f, 0x75, 0x35, 0x47, 0x13, 0x82, 0x58, 0xb6, 0xd7, 0xb6, 0x31, 0xed, 0x6e, 0x4b, 0x69, 0x7e, 0x9d, 0x51, 0xc6, 0x43, 0x95, 0x42, 0xd7, 0xe7, 0x25, 0x94, 0x3c, 0xf0, 0xd1, 0xc8, 0x2d, 0xac, 0x01, 0x31, 0x1a, 0x13, 0xe5, 0xf7, 0x0f, 0x51, 0xef, 0x59, 0xb8, 0x36, 0x02, 0xe1, 0xe5, 0x47, 0x98, 0x36, 0x90, 0x2a, 0xc0, 0x20, 0x50, 0xc4, 0xe2, 0x32, 0x02, 0xa0, 0xe2, 0x91, 0x7d, 0x6f, 0x54, 0xf0, 0x84, 0xf9, 0xcb, 0xcf, 0x8b, 0x45, 0xe9, 0x88, 0x5c, 0xa9, 0x56, 0xe5, 0x3a, 0x0d, 0x98, 0x9d, 0xf8, 0x23, 0x3d, 0x90, 0xd6, 0x59, 0x5e, 0x1c, 0xdc, 0x4e, 0x4a, 0x70, 0x80, 0x20, 0xdb, 0x52, 0x8a, 0x08, 0x69, 0xea, 0x78, 0x2f, 0xf9, 0x72, 0xd5, 0x66, 0x1d, 0x9f, 0x9f, 0xc0, 0x00, 0xd0, 0x55, 0x55, 0xd1, 0x5d, 0xbd, 0x3a, 0x41, 0x13, 0x39, 0x71, 0x1c, 0xbc, 0x9a, 0xd1, 0x00, 0x17, 0x6a, 0xfd, 0x81, 0xea, 0xb6, 0x83, 0xb9, 0xb0, 0x86, 0xd2, 0x65, 0xcc, 0xc8, 0x2b, 0x15, 0x07, 0xb1, 0x13, 0xde, 0xf5, 0x30, 0xac, 0x48, 0x75, 0xd9, 0x50, 0xee, 0x0a, 0x12, 0x91, 0x4d, 0x5f, 0xe8, 0x0d, 0x6c, 0xc3, 0x50, 0xc8, 0xdb, 0x33, 0x2c, 0x9f, 0x01, 0xe9, 0x97, 0xe9, 0xb8, 0x4d, 0x18, 0xe2, 0xcd, 0x65, 0x6d, 0xcb, 0x18, 0x46, 0x00, 0x1f, 0x76, 0x96, 0x22, 0x5d, 0x1d, 0xa7, 0x6c, 0xf6, 0x5c, 0x4f, 0x60, 0xf0, 0xe3, 0x47, 0xd5, 0xef, 0x8f, 0xba, 0x37, 0xcc, 0xc0, 0x33, 0xe9, 0x60, 0x0f, 0xaa, 0x8d, 0x13, 0xca, 0xda, 0x04, 0xd7, 0xab, 0x51, 0x1d, 0x9d, 0x11, 0x5e, 0x9b, 0x7b, 0x59, 0x65, 0x4e, 0x43, 0x47, 0x84, 0xb2, 0x2a, 0x9c, 0xb3, 0x9f, 0x1d, 0x6e, 0x72, 0x3b, 0x18, 0x30, 0x19, 0xee, 0xba, 0xd7, 0x50, 0xce, 0x76, 0x3e, 0x6d, 0xe2, 0x68, 0xd3, 0xe3, 0xa8, 0x26, 0x63, 0x1b, 0x3b, 0xbb, 0x03, 0x15, 0x6d, 0xb7, 0x6b, 0x84, 0x38, 0xe7, 0x6e, 0xc0, 0x0f, 0x24, 0x60, 0x81, 0xfc, 0x3d, 0x4c, 0x07, 0xd9, 0xb4, 0xd0, 0x87, 0xc5, 0x1c, 0xb4, 0x2c, 0x8a, 0xe4, 0xb3, 0xbc, 0x0e, 0x39, 0xd5, 0x8b, 0xd3, 0xd1, 0xaf, 0x5c, 0x48, 0x54, 0x2e, 0xa9, 0xeb, 0x49, 0xa4, 0x36, 0x6f, 0x60, 0xc4, 0x88, 0x48, 0x75, 0xc2, 0x9b, 0xf7, 0x61, 0x15, 0x1e, 0xd4, 0x8d, 0x70, 0xbe, 0x73, 0x6d, 0xb7, 0x5c, 0x8b, 0xd1, 0x30, 0x61, 0x0e, 0xec, 0x5d, 0x9a, 0x03, 0x19, 0xc9, 0xe4, 0xce, 0x65, 0x38, 0xee, 0x2c, 0xf5, 0x58, 0x84, 0x83, 0x9a, 0x8f, 0xe1, 0x73, 0xe6, 0x38, 0x04, 0xc1, 0x54, 0x6b, 0xde, 0x22, 0x73, 0xd6, 0x3c, 0x91, 0x91, 0x38, 0x64, 0xda, 0x6e, 0x39, 0x76, 0xac, 0x85, 0x46, 0x48, 0x3b, 0x50, 0x17, 0x7f, 0x55, 0xd0, 0x50, 0x96, 0xbc, 0xb0, 0x46, 0xc4, 0x9e, 0xfb, 0xfe, 0xaf, 0xc4, 0x50, 0xb5, 0xc8, 0xfd, 0x38, 0xda, 0x50, 0xde, 0x46, 0x8f, 0xa7, 0x9f, 0xb2, 0x75, 0x04, 0x8f, 0xad, 0x7e, 0x95, 0x51, 0x53, 0xb2, 0xb0, 0xe4, 0xde, 0x31, 0x90, 0x5c, 0x2d, 0x34, 0x5c, 0xc7, 0x8e, 0x77, 0x39, 0xc8, 0xe8, 0x18, 0x66, 0x30, 0x38, 0x87, 0xc9, 0x6d, 0x27, 0x80, 0xf9, 0x89, 0xf3, 0xcf, 0x6b, 0x40, 0x20, 0x39, 0x29, 0x3e, 0xb2, 0xf7, 0x05, 0x08, 0x0e, 0xdc, 0x34, 0xf5, 0x9e, 0x55, 0xce, 0xa5, 0xa7, 0x1a, 0xaf, 0xcf, 0x1c, 0x1a, 0x4d, 0x89, 0x94, 0x4f, 0x02, 0x7b, 0x0c, 0x5a, 0xb9, 0x8e, 0x62, 0x76, 0x1d, 0x3e, 0x5b, 0x74, 0x2f, 0x8d, 0x7c, 0x54, 0xf4, 0x54, 0x3c, 0x9a, 0x0c, 0xde, 0x7a, 0xfc, 0x65, 0x39, 0x95, 0x39, 0xf8, 0x93, 0xde, 0x57, 0x32, 0x41, 0xfd, 0xb4, 0x15, 0xc4, 0xce, 0xdb, 0xab, 0x6d, 0xf5, 0x37, 0x0c, 0x1a, 0x92, 0x4b, 0xe9, 0xb5, 0xfc, 0x82, 0xa7, 0x3e, 0xee, 0xa2, 0x98, 0x85, 0xfb, 0x52, 0xdb, 0xd8, 0x19, 0xf2, 0xdf, 0xe1, 0xcb, 0x62, 0x57, 0x49, 0x80, 0x74, 0x63, 0xfc, 0x1e, 0xbb, 0x8b, 0x8f, 0xf7, 0x7a, 0x7b, 0xd8, 0x43, 0x14, 0x25, 0xb9, 0x13, 0x33, 0xed, 0x32, 0x7c, 0x92, 0x18, 0x05, 0xd0, 0xe6, 0xc9, 0xd2, 0x6d, 0x7b, 0xb8, 0x4c, 0x87, 0x51, 0x53, 0xde, 0x07, 0x41, 0xc7, 0xa7, 0x18, 0xb5, 0x78, 0xa6, 0x62, 0xa3, 0x75, 0xaf, 0x58, 0x52, 0x11, 0x0b, 0xd6, 0x8d, 0x6e, 0x37, 0x07, 0x88, 0xa7, 0x12, 0xaa, 0xce, 0x58, 0xa2, 0x9e, 0x50, 0x3b, 0x58, 0xfe, 0xff, 0x96, 0x37, 0x85, 0xec, 0xa9, 0x0b, 0x64, 0x5a, 0x2d, 0xbc, 0xa4, 0x57, 0x25, 0x4e, 0x97, 0x4d, 0x0c, 0x81, 0xeb, 0xb7, 0xa1, 0xcc, 0x1e, 0x27, 0x8c, 0xd5, 0x80, 0x41, 0x52, 0xab, 0x0b, 0x89, 0xa3, 0x97, 0x27, 0xeb, 0x17, 0x32, 0x92, 0x9c, 0x83, 0x81, 0xaf, 0x7e, 0xb4, 0x5e, 0x80, 0xa3, 0x6e, 0x68, 0x13, 0x49, 0x82, 0x8b, 0x80, 0x23, 0xb2, 0x5e, 0x4c, 0x6f, 0xb1, 0x51, 0xb9, 0xf8, 0xb6, 0xea, 0xbf, 0x07, 0x7a, 0x3c, 0x47, 0x69, 0x68, 0xc1, 0x14, 0xc7, 0xfe, 0x46, 0x74, 0x47, 0x5c, 0xca, 0xb7, 0x80, 0xa8, 0xeb, 0x0b, 0x78, 0x4e, 0xd0, 0x95, 0x56, 0x8d, 0x65, 0x21, 0x03, 0xf1, 0x2a, 0x3f, 0xcf, 0x7a, 0xd2, 0x7c, 0xef, 0x5c, 0xcf, 0x22, 0x6f, 0x88, 0xf2, 0x40, 0xec, 0x02, 0x0c, 0x5e, 0xd4, 0x2a, 0x9e, 0x07, 0xfc, 0x51, 0xd4, 0xf2, 0x10, 0xcc, 0x27, 0xee, 0x69, 0xbf, 0xbd, 0x72, 0x9c, 0x72, 0xf2, 0x99, 0x11, 0xf9, 0xd0, 0xcf, 0x56, 0x4a, 0x56, 0x2c, 0x10, 0x94, 0x08, 0x41, 0x84, 0xc5, 0x06, 0x07, 0x30, 0x13, 0x29, 0x9a, 0xc3, 0x06, 0x97, 0xe4, 0x1d, 0x61, 0x4d, 0x78, 0x93, 0xe3, 0xd5, 0xf7, 0xc8, 0xd1, 0x21, 0x76, 0x14, 0x25, 0xaf, 0xb6, 0x3d, 0x74, 0x48, 0xa8, 0xcb, 0x4d, 0x99, 0x03, 0xed, 0xc1, 0x37, 0x2e, 0x80, 0x05, 0xab, 0x79, 0xdc, 0x74, 0x60, 0x79, 0x35, 0xf0, 0xb2, 0xac, 0x20, 0xe5, 0xb2, 0x7a, 0x31, 0xe0, 0x74, 0x9b, 0x3d, 0x95, 0x22, 0x97, 0xa0, 0x28, 0x6f, 0x30, 0x2c, 0x0b, 0xe5, 0x5e, 0x9b, 0x01, 0xef, 0x46, 0xf4, 0x4b, 0xd9, 0x83, 0xe7, 0xcc, 0x56, 0x92, 0x5a, 0x96, 0xa1, 0x57, 0xcb, 0xec, 0xa4, 0x32, 0x0e, 0x5d, 0xc7, 0x3e, 0x5b, 0x8b, 0x67, 0xca, 0xd9, 0xf9, 0xb0, 0xfb, 0x11, 0xe5, 0x12, 0x0e, 0xe4, 0xf0, 0x98, 0x91, 0xbf, 0x1d, 0xea, 0x2d, 0x7a, 0x4a, 0x29, 0x85, 0x14, 0x75, 0xb1, 0xa9, 0x5c, 0xd2, 0xb1, 0x79, 0x01, 0x70, 0xcf, 0x83, 0x01, 0xff, 0xc0, 0x1d, 0xa5, 0x28, 0xd3, 0x38, 0xe6, 0xc5, 0x38, 0xee, 0x0b, 0xf7, 0x13, 0x10, 0x34, 0xf1, 0x78, 0xfc, 0x93, 0x14, 0xa4, 0x7a, 0x03, 0x0a, 0x77, 0x30, 0xae, 0xe2, 0x48, 0x78, 0x4e, 0x2c, 0xff, 0xac, 0x83, 0xee, 0x31, 0x6d, 0x49, 0x55, 0x41, 0x4a, 0x4a, 0x44, 0xf4, 0x65, 0x66, 0x79, 0xb0, 0x05, 0xb7, 0xf9, 0x9b, 0xb4, 0x12, 0xb8, 0xa0, 0xdc, 0xe2, 0xec, 0x90, 0x5b, 0xca, 0x70, 0xdf, 0xb0, 0x2c, 0x63, 0x75, 0x6b, 0x2a, 0x4c, 0x14, 0x3d, 0x0e, 0x01, 0x6b, 0x1a, 0x25, 0xac, 0x9b, 0x4b, 0x2b, 0x62, 0x1d, 0x71, 0xb8, 0x86, 0x65, 0x16, 0xc4, 0x37, 0xa2, 0x7f, 0x63, 0x43, 0xb9, 0xf9, 0x44, 0x2b, 0x0a, 0x32, 0xa8, 0xdd, 0x7d, 0x33, 0x1d, 0xb7, 0xae, 0x6a, 0x97, 0xa2, 0xb4, 0xd5, 0xe8, 0x3e, 0x7d, 0x87, 0x5e, 0x88, 0x8d, 0xa8, 0x3c, 0xb0, 0x76, 0xab, 0x0b, 0x12, 0x73, 0x2f, 0x3c, 0xfe, 0xcb, 0x17, 0xbf, 0xa5, 0x8a, 0xf1, 0xef, 0x99, 0x25, 0xd6, 0x63, 0x15, 0xb7, 0xb8, 0xbc, 0xf3, 0x21, 0x05, 0x0f, 0x03, 0x75, 0xa8, 0xb4, 0xca, 0xeb, 0x37, 0xa7, 0x29, 0x5a, 0x9c, 0xf3, 0xcc, 0x08, 0x2b, 0xaa, 0x39, 0x74, 0xcd, 0xeb, 0xc7, 0xd5, 0xd3, 0x4a, 0xf3, 0x34, 0x05, 0xba, 0xd0, 0xbe, 0x00, 0x90, 0xb0, 0x2f, 0x33, 0xfd, 0x34, 0x51, 0xc6, 0xd5, 0xf5, 0x68, 0xd3, 0xa6, 0xb9, 0xa9, 0xf4, 0xcb, 0xdb, 0x28, 0x1a, 0x8e, 0x06, 0x04, 0xd7, 0x75, 0x82, 0x11, 0x6f, 0x88, 0xaf, 0x9b, 0x71, 0x53, 0x90, 0xe7, 0xb9, 0x7b, 0xc9, 0x4c, 0xe3, 0x13, 0x20, 0xdd, 0x1e, 0xa3, 0x7c, 0x27, 0x0b, 0xdd, 0x66, 0xc9, 0xad, 0x02, 0xf9, 0x50, 0xd6, 0xe6, 0x01, 0x83, 0x85, 0x8c, 0x60, 0x9c, 0x45, 0xee, 0xed, 0x91, 0x2d, 0xa4, 0xc5, 0x80, 0x37, 0x08, 0x00, 0x2b, 0x52, 0xe6, 0x1b, 0xb5, 0x14, 0x3b, 0x67, 0x3e, 0x6b, 0x02, 0xc5, 0x4f, 0x39, 0xf2, 0xc7, 0x48, 0xf2, 0x25, 0x4c, 0x9b, 0x07, 0x41, 0x05, 0x43, 0xa5, 0x2e, 0xb7, 0xbb, 0x9f, 0x07, 0xdb, 0x5e, 0xc8, 0x91, 0x75, 0x3a, 0x06, 0x46, 0x01, 0x5f, 0xd1, 0x8b, 0x6c, 0xab, 0xcd, 0xe2, 0xe7, 0xde, 0x29, 0x6b, 0x2e, 0x41, 0xbc, 0x97, 0x21, 0x51, 0x1d, 0x9e, 0x45, 0x2e, 0x4d, 0x88, 0xe0, 0xea, 0x61, 0x87, 0xf6, 0xed, 0x3f, 0xa0, 0x28, 0x70, 0x59, 0x89, 0xe4, 0x9c, 0xba, 0xd0, 0x14, 0x8f, 0x10, 0x85, 0x34, 0xd6, 0x9a, 0x2e, 0xc0, 0x23, 0xc7, 0xfe, 0x64, 0xd2, 0xdd, 0x11, 0x31, 0x1e, 0xbc, 0xb5, 0x2e, 0x06, 0xbb, 0xd0, 0x44, 0xbe, 0xeb, 0x4b, 0x90, 0x2a, 0xb9, 0x1a, 0x61, 0x05, 0x52, 0x13, 0x4f, 0x4b, 0xed, 0xb0, 0x22, 0x2d, 0xe4, 0xef, 0x2d, 0x40, 0x02, 0x58, 0x6f, 0xb5, 0x7b, 0x90, 0x1e, 0x41, 0xb7, 0xab, 0x40, 0x53, 0x72, 0x35, 0x10, 0x0c, 0x6e, 0xf0, 0xd1, 0x88, 0x21, 0x75, 0x29, 0xd0, 0xc3, 0xe4, 0x39, 0xa1, 0xec, 0x53, 0xc1, 0xf2, 0xcb, 0x62, 0x4c, 0x8d, 0xee, 0x78, 0x80, 0x34, 0x60, 0x5f, 0x64, 0x3f, 0x3f, 0xe1, 0x1e, 0xca, 0x56, 0x7f, 0xb5, 0xde, 0x0f, 0x85, 0x33, 0x93, 0x8f, 0x85, 0x6c, 0xf9, 0xd3, 0xf4, 0x86, 0xe8, 0xc2, 0xb7, 0x48, 0xe3, 0x3a, 0xa4, 0xf2, 0x43, 0xf6, 0x21, 0xff, 0xec, 0x11, 0x7c, 0x11, 0x53, 0xbb, 0xf1, 0x15, 0x9b, 0xdb, 0x30, 0x95, 0xa0, 0xa3, 0x42, 0x6e, 0x7d, 0x70, 0xc5, 0x6e, 0x8c, 0x58, 0x35, 0xf5, 0xde, 0xd1, 0xce, 0x2e, 0xb0, 0x15, 0x97, 0xbc, 0x33, 0x88, 0x62, 0xdd, 0xfe, 0xe2, 0x69, 0xe7, 0x46, 0x98, 0x41, 0xc8, 0xe6, 0x55, 0x60, 0x3e, 0xf6, 0x1c, 0x3d, 0x8e, 0x46, 0x0c, 0xf3, 0xff, 0xd0, 0xbd, 0xc5, 0x96, 0x62, 0x1a, 0x50, 0x02, 0x45, 0xc0, 0xe6, 0xa5, 0x98, 0x62, 0xea, 0x41, 0xa9, 0x56, 0x28, 0x45, 0xc8, 0xc3, 0x64, 0xf7, 0x37, 0x95, 0x29, 0x97, 0xbd, 0xe2, 0x39, 0x46, 0x1b, 0xa6, 0xbb, 0x4b, 0x10, 0x0f, 0xd0, 0x00, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xbd, 0x06, 0xe6, 0x81, 0xc1, 0x10, 0xf0, 0xab, 0xbf, 0xd5, 0xd3, 0xcb, 0xde, 0x20, 0x0d, 0x88, 0x1e, 0x69, 0xb2, 0x13, 0xa2, 0x45, 0x00, 0x00, 0x00, 0x00, 0xd8, 0x35, 0xf3, 0xe5, 0x17, 0x48, 0x8f, 0x5c, 0x96, 0xa3, 0xe9, 0x58, 0xd7, 0xb6, 0xfc, 0xc5, 0xc5, 0x11, 0xa2, 0x74, 0x77, 0x19, 0xfa, 0x7b, 0x58, 0x17, 0x28, 0x89, 0x78, 0xf3, 0xd7, 0x98, 0x7b, 0x1a, 0xf9, 0x9f, 0x05, 0x83, 0x87, 0xd3, 0x42, 0x55, 0xa2, 0x02, 0x37, 0x64, 0xa7, 0xac, 0x38, 0x13, 0x5d, 0x06, 0xe7, 0xbb, 0xcb, 0xc2, 0x92, 0x4d, 0x2a, 0xc4, 0xcd, 0x2a, 0x4b, 0x85, 0x5a, 0xfc, 0x70, 0xbc, 0x79, 0xbe, 0x48, 0x90, 0x35, 0xfb, 0x25, 0x0e, 0x93, 0xfd, 0x7d, 0x6c, 0x25, 0x8a, 0x59, 0x7e, 0x9c, 0x0b, 0xa0, 0x58, 0x3b, 0x4e, 0x64, 0x16, 0xef, 0x30, 0x6b, 0xcc, 0xf9, 0x62, 0xe0, 0x68, 0x57, 0x65, 0x93, 0xcc, 0xeb, 0x07, 0xfd, 0xd6, 0x31, 0x38, 0xb5, 0x75, 0xd8, 0xfe, 0x27, 0x86, 0x3b, 0x0a, 0xdc, 0x7c, 0x6f, 0x65, 0x9c, 0x82, 0x08, 0x43, 0x2a, 0x91, 0x45, 0x23, 0x3e, 0x8a, 0x49, 0x34, 0x7e, 0x0a, 0x99, 0x84, 0x11, 0xd2, 0x4a, 0x93, 0xae, 0x8e, 0xcd, 0x1b, 0x6f, 0xa7, 0xf1, 0x50, 0xed, 0x95, 0x97, 0x5c, 0x3d, 0xf9, 0xd1, 0xb7, 0xdb, 0xcf, 0xa3, 0x60, 0xb1, 0x28, 0xe6, 0xa5, 0x22, 0x2c, 0xd1, 0xac, 0x1f, 0x9c, 0x15, 0xd0, 0xe8, 0x8c, 0xab, 0xcb, 0xe0, 0xe9, 0xe9, 0x77, 0xa0, 0x7f, 0x02, 0x02, 0xa1, 0xfb, 0x07, 0x42, 0x72, 0xb8, 0x1a, 0x0f, 0x8d, 0x97, 0x53, 0xa9, 0x75, 0xa1, 0x8b, 0xff, 0x09, 0x21, 0xc3, 0x1e, 0xf9, 0xa3, 0xb9, 0xd7, 0x72, 0x33, 0x62, 0x6e, 0x9a, 0x54, 0xb0, 0x0c, 0x98, 0x0a, 0xbd, 0x30, 0xc7, 0x38, 0x7e, 0x4d, 0xf9, 0xb6, 0x38, 0x3c, 0xb3, 0x7b, 0x4f, 0x86, 0xa2, 0xf3, 0xac, 0x9e, 0x81, 0x15, 0xe4, 0xb5, 0x30, 0x3c, 0xe5, 0x11, 0xf9, 0x05, 0x5c, 0x28, 0x50, 0x0a, 0xa2, 0x9d, 0xe1, 0xfa, 0xe9, 0x80, 0xcd, 0x9d, 0x9e, 0x9a, 0x90, 0x42, 0x2e, 0xe6, 0xd2, 0x4b, 0x1a, 0xd6, 0x84, 0x6e, 0x95, 0x0c, 0x17, 0xc1, 0xb8, 0x1d, 0x84, 0x3a, 0x76, 0xae, 0xfc, 0xd1, 0x32, 0x4d, 0x52, 0xac, 0x6e, 0xe6, 0x4f, 0xcd, 0x76, 0x4d, 0xd3, 0x00, 0x81, 0x82, 0x2e, 0x60, 0xbd, 0x8f, 0x42, 0xe8, 0x83, 0xcb, 0xdd, 0x9b, 0xeb, 0x6f, 0x5a, 0xe8, 0xf9, 0x0c, 0x7a, 0x90, 0x92, 0x2b, 0xe6, 0x04, 0x17, 0x58, 0xd4, 0xa4, 0x43, 0x13, 0xb3, 0xec, 0xb1, 0x39, 0xfe, 0x0e, 0x1d, 0x55, 0xe8, 0x96, 0xa1, 0x13, 0xd6, 0x59, 0xef, 0x36, 0x69, 0xa5, 0x20, 0x83, 0x21, 0xfc, 0xed, 0x6f, 0xa5, 0x85, 0x64, 0x27, 0xeb, 0xdb, 0x53, 0x7f, 0x89, 0x4d, 0xe6, 0x00, 0x61, 0xc4, 0x1e, 0x69, 0x36, 0x74, 0xbe, 0xa3, 0xc0, 0x28, 0x7e, 0x60, 0x97, 0x46, 0xae, 0x9b, 0x9c, 0x70, 0xee, 0xa2, 0x5f, 0x67, 0x18, 0x98, 0x21, 0xef, 0x79, 0xad, 0x4d, 0xff, 0x42, 0xc8, 0x32, 0x28, 0x6e, 0x45, 0xa4, 0x3c, 0x0a, 0x75, 0x19, 0x8a, 0x6b, 0x68, 0x71, 0x11, 0x97, 0x07, 0x8d, 0xf7, 0xcf, 0xdc, 0x61, 0x99, 0xb4, 0xfb, 0xab, 0x7e, 0x0a, 0xf0, 0xf5, 0x08, 0x8b, 0x7e, 0x03, 0x75, 0x4d, 0x75, 0xd8, 0xef, 0x07, 0x3f, 0x80, 0xf4, 0xa1, 0x8e, 0xbc, 0x5b, 0xa5, 0x25, 0x4f, 0xfe, 0x9c, 0xb7, 0x0e, 0x76, 0x39, 0xad, 0xc8, 0x07, 0x2b, 0x87, 0x16, 0xdc, 0x2b, 0xb2, 0xcf, 0x40, 0x4d, 0x23, 0xc0, 0xb9, 0x26, 0xf9, 0xe2, 0x52, 0x55, 0x4a, 0x34, 0x95, 0x5f, 0xbb, 0x14, 0x52, 0x8f, 0xfa, 0x59, 0xd1, 0x2e, 0x53, 0x35, 0x9e, 0x43, 0xcf, 0xa3, 0x1b, 0x24, 0x0b, 0x03, 0xb3, 0x2e, 0x42, 0xb9, 0x85, 0x23, 0x47, 0x4f, 0xfb, 0x69, 0xb6, 0x15, 0x1e, 0x2b, 0xa6, 0xa5, 0x2b, 0xf9, 0x60, 0xae, 0x36, 0x5d, 0x13, 0x10, 0x33, 0xf8, 0x40, 0x61, 0x3a, 0x07, 0x6f, 0xa2, 0x57, 0xdf, 0x38, 0xc1, 0xaf, 0x5b, 0xe6, 0x15, 0x3a, 0x24, 0xaf, 0xb8, 0x2a, 0x43, 0x9f, 0x18, 0xe6, 0xec, 0x89, 0x4d, 0x98, 0x4a, 0xc9, 0x8b, 0x77, 0xf2, 0x4e, 0x50, 0xbd, 0x1e, 0x80, 0x45, 0xcf, 0x94, 0xff, 0xfd, 0xca, 0x9e, 0x57, 0x01, 0x28, 0xf1, 0x4d, 0x1c, 0xd5, 0xd7, 0xe6, 0x1b, 0xcb, 0x4c, 0xac, 0xc7, 0x7c, 0x84, 0x3e, 0xbe, 0x16, 0xab, 0xf2, 0xe8, 0x72, 0xee, 0x69, 0xe4, 0xe2, 0x73, 0x9f, 0x34, 0xec, 0xdb, 0x56, 0x8a, 0xa1, 0x01, 0x53, 0x65, 0x85, 0x23, 0x45, 0xb7, 0xed, 0x85, 0x7a, 0xc5, 0x4e, 0xb4, 0x1e, 0x06, 0x13, 0x54, 0x43, 0xa5, 0x4b, 0xf9, 0x90, 0x8e, 0x4e, 0x55, 0xb5, 0xeb, 0xa7, 0xb6, 0xc0, 0x1f, 0x8d, 0x7d, 0x35, 0xd4, 0xc8, 0xa2, 0xc6, 0x2d, 0x2f, 0xb1, 0xcd, 0xf0, 0xa3, 0x71, 0x5a, 0x67, 0x76, 0xd7, 0x51, 0x3c, 0x9b, 0x14, 0xc8, 0xb6, 0x30, 0x16, 0xbc, 0x4c, 0x95, 0xf0, 0xd2, 0x4f, 0xb0, 0xc3, 0x68, 0x0c, 0xb0, 0x57, 0x3f, 0xa1, 0xa4, 0xda, 0x9d, 0x8f, 0xeb, 0x27, 0xf7, 0x72, 0x22, 0x84, 0xc8, 0xae, 0x81, 0x7e, 0xb9, 0x0f, 0x98, 0xb3, 0x60, 0xa7, 0x27, 0x7b, 0x45, 0x12, 0xf3, 0xa8, 0x2d, 0xff, 0x1b, 0xac, 0x95, 0x80, 0xa3, 0x67, 0x83, 0x5e, 0x6c, 0x54, 0xe9, 0xdb, 0x6e, 0x9a, 0xdf, 0x96, 0x42, 0xbb, 0x44, 0xb9, 0xd2, 0x60, 0xd2, 0x68, 0x37, 0x2a, 0x8d, 0x09, 0xdf, 0xa5, 0x0e, 0x23, 0xc8, 0xb4, 0x65, 0x65, 0x05, 0xc5, 0x75, 0x3e, 0x6b, 0xe5, 0xa4, 0x3e, 0xbe, 0xed, 0xa8, 0x8e, 0xd1, 0x32, 0xe8, 0x5f, 0x5c, 0x0c, 0x73, 0x4a, 0xc9, 0xc7, 0x07, 0xc8, 0x2c, 0xa0, 0x95, 0x79, 0x42, 0xe9, 0x46, 0xae, 0x99, 0x41, 0xc8, 0xfa, 0xa8, 0xdf, 0x36, 0xa2, 0x1d, 0x6e, 0x3d, 0x90, 0x76, 0x59, 0xd4, 0x53, 0x96, 0xa7, 0x66, 0x3c, 0x42, 0x30, 0xfa, 0x41, 0xe5, 0x38, 0x76, 0x51, 0x1a, 0x8d, 0x94, 0x57, 0xee, 0x5d, 0x0b, 0x30, 0xbe, 0x91, 0x72, 0x18, 0xf4, 0x87, 0xd0, 0xc7, 0x7e, 0xbc, 0xce, 0xe8, 0x98, 0x17, 0xc1, 0x0d, 0xbf, 0xa7, 0xe9, 0x1c, 0x57, 0x47, 0x03, 0x88, 0x04, 0xb4, 0x8f, 0xbb, 0x15, 0xda, 0x12, 0x0a, 0x7d, 0xc6, 0x66, 0xb8, 0x74, 0xf0, 0xaa, 0x3c, 0xf0, 0x96, 0x6a, 0x59, 0x3d, 0x5a, 0x28, 0x08, 0xdd, 0x56, 0xb6, 0x8b, 0xa2, 0xbf, 0x45, 0xcc, 0xe5, 0x2f, 0xa1, 0x56, 0xa9, 0xe5, 0x4e, 0x73, 0x3f, 0x41, 0xf9, 0x0b, 0x05, 0x25, 0xcd, 0x65, 0x15, 0x83, 0xf8, 0xfc, 0x12, 0x97, 0x3b, 0xfb, 0xe6, 0xac, 0xab, 0x29, 0x3f, 0x57, 0xb3, 0x8f, 0x40, 0xd7, 0x70, 0x81, 0x55, 0xa2, 0x1d, 0xc7, 0x2a, 0x4a, 0x5c, 0xc4, 0x08, 0x2b, 0x11, 0x5a, 0xac, 0x22, 0x34, 0xcd, 0xa0, 0x42, 0x4b, 0xf6, 0xd2, 0x1f, 0x14, 0xeb, 0xce, 0x99, 0x70, 0xcf, 0xe8, 0x45, 0xbe, 0xd2, 0xe3, 0x12, 0x27, 0xc5, 0x16, 0xc8, 0xa8, 0xa3, 0xff, 0xd3, 0x3b, 0xff, 0x7e, 0x88, 0xef, 0xff, 0xbf, 0xa1, 0x8b, 0x9d, 0xfe, 0xbc, 0xb1, 0xbe, 0x6b, 0xd3, 0x92, 0x9b, 0x7a, 0xaf, 0xfd, 0x2b, 0x5d, 0xc4, 0xe1, 0x3f, 0xfc, 0x1e, 0xc5, 0xe8, 0xf3, 0xd2, 0x84, 0x86, 0x07, 0x06, 0x96, 0xd3, 0x61, 0x72, 0x75, 0x6b, 0xa3, 0x02, 0x2c, 0x9e, 0x75, 0x27, 0xa4, 0xfd, 0x8d, 0x57, 0xde, 0x00, 0xa8, 0x9c, 0x80, 0xa6, 0xe2, 0x53, 0xa2, 0x66, 0x5c, 0x5b, 0x0d, 0xb1, 0x97, 0xc2, 0x40, 0xda, 0x55, 0x51, 0x9a, 0x36, 0x4c, 0xc6, 0xbc, 0x29, 0xd9, 0x1e, 0x5a, 0x58, 0x36, 0x2d, 0x3d, 0x8e, 0x7d, 0xa1, 0x50, 0x58, 0x6a, 0x0f, 0xf2, 0x4f, 0xb0, 0x6f, 0xc9, 0x20, 0x09, 0x55, 0xc4, 0x86, 0x2a, 0x0f, 0x75, 0x85, 0x6d, 0x51, 0xbd, 0x75, 0x5f, 0xc3, 0xfe, 0x0c, 0xee, 0x03, 0xd0, 0xad, 0x89, 0x20, 0x4c, 0x92, 0xda, 0xbf, 0xa5, 0x3c, 0x87, 0xc0, 0x34, 0x08, 0x44, 0x58, 0x6c, 0x66, 0xee, 0x93, 0x6f, 0x46, 0x1b, 0x2e, 0x97, 0x86, 0x6c, 0x9a, 0x2c, 0xb7, 0x55, 0x48, 0xb4, 0x16, 0x9d, 0xcd, 0xfc, 0x89, 0xb5, 0x72, 0x9b, 0x89, 0xc1, 0x6c, 0x16, 0x8d, 0x9d, 0x15, 0x14, 0x5c, 0xe6, 0x5d, 0x08, 0x4d, 0x75, 0xf1, 0x7f, 0x40, 0xee, 0x9e, 0x51, 0xaf, 0xf6, 0xca, 0x29, 0x1b, 0xca, 0x8e, 0x5a, 0x43, 0x3b, 0x3f, 0x39, 0x4e, 0xff, 0x02, 0xdb, 0x76, 0x56, 0x33, 0xfe, 0xf4, 0xfb, 0xc3, 0xbe, 0x5f, 0xf9, 0x42, 0xe9, 0x53, 0x1c, 0x83, 0x52, 0x44, 0x07, 0x91, 0x0e, 0x11, 0x20, 0x60, 0xdd, 0xaf, 0x16, 0xc8, 0xca, 0xf1, 0x89, 0x31, 0x7c, 0xd3, 0xde, 0xe2, 0xd3, 0x59, 0x17, 0x27, 0xc5, 0xc0, 0x2b, 0x80, 0x7a, 0xdc, 0x25, 0x31, 0x83, 0xc4, 0x00, 0xb5, 0x4e, 0x88, 0x8a, 0x71, 0xdc, 0xcc, 0xbe, 0xfc, 0xbd, 0x47, 0x81, 0xac, 0xa1, 0xa6, 0xa8, 0x29, 0x2d, 0x91, 0x41, 0xff, 0x2e, 0x2c, 0xc7, 0x3c, 0x76, 0x3a, 0xa1, 0x0f, 0x1e, 0xbe, 0xf1, 0x09, 0xd5, 0x32, 0xfe, 0x63, 0x7e, 0x50, 0x06, 0x0f, 0x42, 0x0d, 0xf6, 0xa6, 0xb1, 0xd2, 0x76, 0x78, 0x13, 0xe1, 0xd3, 0x44, 0x33, 0xda, 0x48, 0xe5, 0x96, 0x4f, 0xa2, 0x1a, 0x9d, 0x21, 0xf1, 0x29, 0x28, 0x38, 0x47, 0xff, 0xc6, 0xb1, 0xbd, 0x93, 0xc5, 0x4a, 0x55, 0x33, 0xcb, 0xd7, 0x0d, 0x06, 0x7d, 0x06, 0xd9, 0x9b, 0x35, 0x62, 0x32, 0x6e, 0x35, 0xe5, 0x95, 0x9f, 0x68, 0x11, 0xba, 0x80, 0x22, 0xd7, 0xdb, 0x9d, 0x9f, 0x3b, 0xd6, 0x3d, 0x61, 0x75, 0x47, 0x07, 0x64, 0x2e, 0x3e, 0x72, 0xdc, 0x1b, 0xfe, 0x0e, 0xc3, 0x33, 0xa9, 0x13, 0x82, 0xa7, 0x54, 0x67, 0x0c, 0xe2, 0x88, 0x30, 0x69, 0x73, 0xdb, 0xcb, 0x61, 0xab, 0x46, 0xb6, 0x5b, 0x2d, 0x7b, 0x92, 0xfb, 0xe9, 0xb0, 0xcc, 0x0d, 0xf2, 0x2c, 0xfb, 0x42, 0x15, 0x33, 0x73, 0x03, 0xc2, 0xf7, 0x96, 0x66, 0x22, 0xb5, 0x2f, 0x17, 0x29, 0xca, 0xd7, 0xfd, 0xec, 0x7d, 0x2c, 0x72, 0xcc, 0x88, 0x65, 0x07, 0x6d, 0x9b, 0x4f, 0xea, 0xf4, 0x20, 0x56, 0x8c, 0x7f, 0x5a, 0x17, 0x92, 0xa1, 0x30, 0x09, 0x05, 0x85, 0xab, 0x32, 0x42, 0x4c, 0x9f, 0x67, 0xcd, 0xcc, 0xa3, 0x4d, 0x1a, 0xe7, 0x22, 0x03, 0x8b, 0x0d, 0x6a, 0x36, 0xef, 0xf0, 0xcd, 0x50, 0x20, 0x53, 0xdf, 0xa2, 0xdf, 0xe8, 0xb9, 0x94, 0xc3, 0xec, 0x2e, 0x49, 0xe7, 0x24, 0xe0, 0x9d, 0x12, 0xe7, 0x2e, 0x31, 0xfe, 0xd6, 0xa3, 0x2b, 0xd2, 0x38, 0x62, 0x6e, 0x9a, 0xbd, 0xe1, 0xea, 0xe6, 0x82, 0xa5, 0xff, 0x7e, 0x63, 0x87, 0x22, 0xf5, 0x42, 0x56, 0xc9, 0xa8, 0xc4, 0xa2, 0xa4, 0xa1, 0xf3, 0x6a, 0x76, 0x8b, 0x47, 0xb9, 0xe7, 0xb4, 0xe1, 0xe2, 0x18, 0xa7, 0x70, 0x94, 0xc8, 0x2f, 0xa0, 0xd9, 0xac, 0x55, 0x7d, 0x41, 0x34, 0x50, 0xfa, 0x24, 0x1c, 0x8e, 0xcb, 0x7e, 0xaf, 0xe3, 0x81, 0x5f, 0xaa, 0x44, 0x16, 0xad, 0xd0, 0x26, 0x1c, 0x19, 0xf3, 0xcd, 0x08, 0xc7, 0x51, 0x0b, 0x8d, 0xc0, 0xe9, 0xa4, 0xa2, 0xea, 0xeb, 0x4f, 0x1c, 0xc6, 0x73, 0x5c, 0x0c, 0xae, 0x8d, 0x59, 0xe0, 0x85, 0xdf, 0x82, 0x04, 0xa7, 0x9a, 0xa2, 0x08, 0xf7, 0x97, 0xfe, 0xc8, 0xe6, 0x66, 0xd5, 0x66, 0x3e, 0xc3, 0x73, 0xbf, 0x45, 0x42, 0xbd, 0x68, 0xf0, 0x47, 0xd1, 0xcd, 0xcc, 0xeb, 0xfd, 0x45, 0xe7, 0xa6, 0x71, 0x1f, 0xef, 0x78, 0x74, 0x37, 0xdb, 0x3d, 0xea, 0xbb, 0xcb, 0xe3, 0xe7, 0xbc, 0x2c, 0x88, 0xa8, 0xe6, 0x69, 0x31, 0xa5, 0x39, 0x7b, 0x47, 0x89, 0x5f, 0x4b, 0xfa, 0x12, 0xca, 0xb3, 0xd7, 0xcf, 0xcc, 0xb7, 0xe8, 0x29, 0x13, 0xbe, 0x08, 0xc7, 0xc4, 0x8d, 0x00, 0x5a, 0x8e, 0x22, 0x54, 0x1e, 0x9b, 0x6c, 0x30, 0x57, 0x41, 0x87, 0x04, 0x5d, 0x4e, 0x57, 0xa5, 0x34, 0x08, 0xb1, 0xa6, 0x70, 0xf2, 0x9a, 0x3e, 0x52, 0xce, 0x4b, 0xb1, 0x67, 0x35, 0x92, 0xb8, 0x12, 0x01, 0x61, 0x9b, 0x51, 0x2d, 0x00, 0xfc, 0xf7, 0x1a, 0xe8, 0x83, 0x1c, 0xd1, 0x4a, 0x9b, 0xed, 0x5e, 0x79, 0xa1, 0x30, 0x59, 0x6d, 0x29, 0x5f, 0xe2, 0x9e, 0x56, 0x68, 0x04, 0xa2, 0x65, 0x82, 0x72, 0xa0, 0x09, 0x78, 0x54, 0x82, 0x86, 0xb8, 0x82, 0x33, 0x19, 0x1d, 0xa3, 0xf7, 0x5f, 0x31, 0x72, 0xf9, 0x53, 0x8f, 0x6d, 0x60, 0xd4, 0x5e, 0x56, 0x89, 0x11, 0x70, 0x46, 0x61, 0x4a, 0x2d, 0xc7, 0x89, 0xdb, 0x31, 0x9e, 0x6e, 0x9d, 0xbc, 0x2a, 0x1f, 0x3d, 0xda, 0x19, 0x9c, 0x90, 0x5a, 0x28, 0x9f, 0xc9, 0x5f, 0x7a, 0x4a, 0xf9, 0xc7, 0xe2, 0xbe, 0x51, 0x01, 0x37, 0x0e, 0x81, 0x41, 0xb6, 0x2a, 0x66, 0xed, 0xc2, 0xf0, 0x7b, 0xfc, 0xb2, 0x50, 0xf6, 0xbb, 0x59, 0xe3, 0x48, 0x24, 0xea, 0x29, 0x86, 0x87, 0x75, 0x37, 0xaf, 0xee, 0x43, 0x7d, 0xe7, 0x49, 0xb8, 0x16, 0x36, 0x0f, 0xd0, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xbd, 0x06, 0xe6, 0x81, 0xc1, 0x10, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0xda, 0xf8, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0xb3, 0x11, 0x81, 0x8c, 0xab, 0xb1, 0x64, 0x58, 0x83, 0x44, 0xea, 0xca, 0x89, 0xf8, 0x82, 0x03, 0x91, 0x6b, 0xef, 0xe8, 0x74, 0x4a, 0x34, 0xeb, 0xfc, 0x82, 0xd4, 0xab, 0xbb, 0x0d, 0x01, 0x7d, 0x87, 0xbf, 0x9c, 0x88, 0x78, 0xa2, 0xdb, 0x7e, 0x84, 0x22, 0xd7, 0xc7, 0x1f, 0x0c, 0x11, 0xe4, 0xea, 0xfe, 0x86, 0x42, 0xff, 0xe2, 0x10, 0x43, 0x61, 0x8a, 0xa2, 0xc3, 0x22, 0x18, 0x71, 0xbe, 0x17, 0x50, 0x3e, 0xd0, 0x4f, 0x33, 0x63, 0x31, 0x25, 0x6e, 0x5c, 0xd9, 0xac, 0x33, 0xc9, 0x28, 0xda, 0xbc, 0x89, 0xc6, 0xac, 0xd6, 0x64, 0x77, 0xf2, 0x35, 0x51, 0xee, 0xdc, 0x9a, 0x68, 0x67, 0xbc, 0xd4, 0x4f, 0x55, 0xc9, 0x30, 0x2a, 0x4a, 0x75, 0x23, 0xb5, 0x84, 0x2f, 0x03, 0xd9, 0x1a, 0xe2, 0xc8, 0xbb, 0xae, 0x95, 0xc9, 0xb1, 0xf4, 0xe7, 0xa2, 0x19, 0x13, 0xad, 0xd8, 0xcc, 0x0c, 0x9f, 0x75, 0xc9, 0xd4, 0x31, 0x6c, 0xfa, 0xb5, 0x5e, 0x57, 0xad, 0xe3, 0xad, 0xbc, 0x21, 0xc6, 0x42, 0xf5, 0x11, 0x4a, 0x48, 0x3d, 0x22, 0xf8, 0x91, 0x73, 0xbe, 0x51, 0x81, 0x1f, 0xd3, 0x44, 0xf9, 0x2a, 0xce, 0x34, 0x62, 0x8e, 0x1e, 0x3d, 0x57, 0x77, 0x8e, 0x7c, 0x12, 0x5b, 0x82, 0x97, 0x83, 0x9b, 0x91, 0x21, 0x8c, 0xde, 0xfa, 0x2b, 0xcc, 0xd0, 0x04, 0x2e, 0xe4, 0xaf, 0x05, 0x97, 0x22, 0x2d, 0x08, 0xf0, 0x2c, 0x5d, 0x41, 0xb8, 0xc6, 0x5e, 0xf1, 0x32, 0x4e, 0xa7, 0xc6, 0x71, 0xe4, 0x37, 0xb8, 0x3d, 0x70, 0xee, 0x96, 0xf6, 0x0b, 0x67, 0xd3, 0xb7, 0x60, 0x49, 0x17, 0x20, 0xec, 0x9a, 0xab, 0x38, 0x54, 0xd8, 0xdd, 0x6e, 0xd5, 0x43, 0xfd, 0x30, 0xfb, 0x9c, 0xdd, 0x2c, 0x38, 0xe3, 0x04, 0xed, 0x2d, 0x2f, 0x7a, 0x00, 0x87, 0xcf, 0x8e, 0xd4, 0x29, 0x2e, 0x55, 0xbc, 0x31, 0x03, 0xe9, 0x84, 0x97, 0x77, 0xca, 0x59, 0x4a, 0x4f, 0x4b, 0x51, 0x71, 0xc8, 0x3d, 0x28, 0x15, 0xd8, 0x83, 0xad, 0x19, 0x04, 0x70, 0x8e, 0xf8, 0xfc, 0xe3, 0x19, 0xa2, 0x54, 0x76, 0x32, 0xd1, 0xac, 0xdb, 0x20, 0x43, 0xfb, 0xbd, 0xfb, 0x34, 0x44, 0x67, 0xfc, 0x30, 0x69, 0xb4, 0x7a, 0x30, 0x0b, 0xf8, 0x89, 0xa9, 0x2f, 0x72, 0xc5, 0x48, 0x2e, 0x38, 0x76, 0xaa, 0x2b, 0xb3, 0xf8, 0xe4, 0xf5, 0xcb, 0x5f, 0xd7, 0xb9, 0x89, 0xfc, 0xf1, 0x2c, 0x6e, 0x68, 0xd8, 0x42, 0x7b, 0xb7, 0x36, 0xee, 0xe0, 0xff, 0x5f, 0x88, 0x58, 0x53, 0x37, 0x2e, 0xd5, 0x73, 0x21, 0x04, 0x59, 0x57, 0x68, 0xcd, 0xcb, 0xfa, 0x42, 0x3e, 0x77, 0x30, 0x0d, 0x7f, 0x5e, 0x38, 0x4c, 0xf2, 0x90, 0xac, 0x42, 0x6c, 0xc7, 0x5f, 0x3c, 0xc7, 0x82, 0x75, 0x61, 0xa8, 0xd3, 0xea, 0x09, 0x8a, 0xaa, 0xaf, 0x18, 0x22, 0x1b, 0x35, 0x4a, 0x30, 0x0d, 0x69, 0x0f, 0x4e, 0x6b, 0x48, 0xa3, 0x44, 0x50, 0xc4, 0xa8, 0x18, 0xc0, 0x1a, 0x53, 0xce, 0x84, 0x88, 0xab, 0x38, 0x1b, 0xc5, 0xe1, 0x6b, 0x23, 0x4e, 0x87, 0x6a, 0x71, 0xbd, 0x04, 0x7d, 0x0f, 0x6e, 0x3a, 0x62, 0x8d, 0xf7, 0x9d, 0xcc, 0x3d, 0xf4, 0x8e, 0xe3, 0xdc, 0x53, 0x75, 0x17, 0x56, 0xd0, 0x13, 0xe1, 0x35, 0x8a, 0x4f, 0xe0, 0xc9, 0xce, 0x2c, 0x50, 0x90, 0xbb, 0xbe, 0xd6, 0xf0, 0x75, 0xf3, 0x2e, 0xbc, 0xbd, 0x91, 0x34, 0xf5, 0x71, 0x12, 0x48, 0x91, 0x4d, 0xe2, 0x9b, 0xcb, 0x53, 0xdf, 0xa4, 0x87, 0xaf, 0x90, 0xc7, 0x8a, 0xad, 0x1a, 0xc6, 0x28, 0xd6, 0x12, 0x59, 0x8f, 0x31, 0x39, 0xf3, 0xb0, 0xb2, 0x7a, 0x43, 0xef, 0x69, 0x4e, 0xa9, 0x6e, 0xaf, 0x94, 0xbc, 0x10, 0x78, 0x60, 0x44, 0x54, 0x35, 0x7a, 0xfe, 0x36, 0x4a, 0xdd, 0xca, 0x55, 0x01, 0x55, 0xd7, 0x78, 0xcc, 0x7d, 0x4c, 0xeb, 0xd6, 0x0b, 0x81, 0x23, 0x33, 0x27, 0x2f, 0xaf, 0xfd, 0x8b, 0xf2, 0x59, 0x42, 0x77, 0x1e, 0xb7, 0x51, 0x58, 0xaf, 0xcf, 0x21, 0xd5, 0x8b, 0x04, 0x41, 0xb3, 0xc6, 0xb3, 0x8a, 0xf0, 0x07, 0xcb, 0x57, 0x80, 0xac, 0xb3, 0x4a, 0xfc, 0xb4, 0x55, 0x10, 0x5f, 0xc6, 0x21, 0xba, 0xfb, 0x52, 0x5a, 0xbb, 0x4f, 0x76, 0x35, 0x10, 0xa3, 0x7a, 0xff, 0x65, 0xe6, 0x43, 0x7a, 0xb6, 0x85, 0x35, 0x23, 0xa0, 0x9b, 0x22, 0x49, 0x04, 0x7c, 0x4a, 0xb2, 0xb0, 0x9e, 0x2b, 0xda, 0x4f, 0xf5, 0xac, 0xeb, 0x25, 0x71, 0x90, 0x9a, 0x47, 0xd7, 0xc1, 0x5c, 0x54, 0x2b, 0x10, 0xeb, 0x9f, 0xdd, 0x06, 0x80, 0xe0, 0x09, 0xd9, 0x34, 0x39, 0x5d, 0x94, 0x0d, 0x27, 0x99, 0xd4, 0x37, 0xba, 0xdf, 0xd4, 0x29, 0x1e, 0x15, 0x34, 0xe5, 0xe1, 0x72, 0x6b, 0x67, 0x3e, 0x7a, 0x1b, 0xd0, 0x42, 0x90, 0x91, 0x4a, 0xbe, 0x7d, 0x5c, 0xdb, 0x52, 0x4c, 0x59, 0xab, 0x9d, 0xa4, 0x2b, 0x8b, 0x9a, 0xb3, 0xf5, 0x3b, 0xa6, 0x30, 0xa9, 0x0a, 0x15, 0xb0, 0xa9, 0xd8, 0x86, 0x8e, 0x37, 0xf5, 0xbe, 0x0d, 0xb2, 0x59, 0x86, 0x3b, 0xf0, 0xec, 0xd0, 0xcb, 0x3c, 0x25, 0x10, 0xa6, 0x13, 0x0a, 0x82, 0xc8, 0xc4, 0x6a, 0xc3, 0x91, 0xdb, 0x46, 0x9a, 0x70, 0xc5, 0x58, 0xca, 0x4d, 0x84, 0x48, 0x48, 0x69, 0xc8, 0x9c, 0x17, 0xe3, 0x10, 0x1a, 0xba, 0x0e, 0x80, 0x75, 0x1f, 0xc3, 0xf9, 0x88, 0x93, 0xf6, 0x6d, 0x18, 0x9c, 0x93, 0xe8, 0xa0, 0x44, 0xef, 0x32, 0x03, 0xdd, 0xc0, 0x6b, 0xf7, 0x1c, 0x2c, 0x3f, 0x2f, 0xaa, 0x95, 0x5c, 0x2f, 0xd9, 0x3c, 0xeb, 0xc3, 0xd4, 0x22, 0x41, 0x20, 0x95, 0xf7, 0x50, 0xdc, 0x29, 0x54, 0x64, 0xbf, 0x1c, 0x3e, 0x21, 0x88, 0x74, 0xb9, 0x1c, 0x63, 0x2d, 0x7c, 0xe3, 0x91, 0xe5, 0x0e, 0xee, 0xae, 0xbf, 0x16, 0xeb, 0x4c, 0xa0, 0x3a, 0xa2, 0xab, 0xec, 0x3b, 0x7c, 0x9f, 0xe4, 0x82, 0xf8, 0xae, 0x3e, 0x0a, 0xab, 0x3b, 0xba, 0x7a, 0xc6, 0x5b, 0x98, 0x6c, 0x65, 0x7a, 0xcb, 0x8c, 0x98, 0x93, 0x76, 0x00, 0xc6, 0x2b, 0xcf, 0x52, 0x71, 0xec, 0x85, 0x29, 0xa0, 0xbc, 0xe3, 0xfc, 0xa3, 0x4a, 0xd0, 0x71, 0xe0, 0x13, 0x54, 0xbb, 0x1d, 0xb1, 0xe4, 0xfe, 0xd8, 0x97, 0xb0, 0x76, 0xa2, 0x7b, 0x8f, 0x47, 0xec, 0xa2, 0xdf, 0xa2, 0xb4, 0xf4, 0xee, 0x6c, 0x8d, 0x0d, 0x81, 0x6b, 0x36, 0x9b, 0x09, 0xd0, 0xb6, 0x80, 0x05, 0x93, 0x5d, 0x64, 0x99, 0xf5, 0xeb, 0xa1, 0xce, 0x57, 0xc4, 0x4a, 0x2c, 0x41, 0x7d, 0xd1, 0x58, 0x48, 0x40, 0x46, 0x70, 0xf2, 0x89, 0x56, 0xcc, 0x3d, 0xdf, 0xb1, 0x92, 0xb1, 0x6f, 0x9b, 0x2a, 0x39, 0xb8, 0xa9, 0xc8, 0x6b, 0x03, 0xf8, 0x21, 0x85, 0xf4, 0x59, 0x54, 0xb4, 0x92, 0xa4, 0xb5, 0x8d, 0x13, 0xf7, 0x4e, 0xfb, 0xc4, 0x56, 0x50, 0xc6, 0xe0, 0xcf, 0x17, 0x7e, 0x13, 0x3b, 0xfd, 0x94, 0x37, 0xbb, 0xc1, 0x8a, 0x59, 0x13, 0x6f, 0x02, 0xfe, 0x3e, 0xea, 0xff, 0x9b, 0x40, 0xed, 0xe3, 0x35, 0x77, 0x6a, 0x2b, 0x18, 0xab, 0xce, 0xea, 0x36, 0xfb, 0x68, 0x00, 0xba, 0xf1, 0xaa, 0xc6, 0x19, 0x9d, 0x9f, 0x8a, 0x90, 0xa5, 0xc1, 0xd5, 0xb5, 0x62, 0xdd, 0x39, 0xa4, 0x4c, 0x71, 0x0c, 0x4e, 0x7d, 0x23, 0xaf, 0x55, 0x87, 0x7f, 0x07, 0xf7, 0x31, 0x87, 0x75, 0xb6, 0x9f, 0x9f, 0x28, 0xa2, 0x54, 0xa8, 0x21, 0x06, 0x47, 0x3f, 0xbf, 0x29, 0x26, 0x3f, 0x9a, 0x4c, 0x2b, 0x15, 0x28, 0xb1, 0x3a, 0xc2, 0x2d, 0xda, 0x28, 0x52, 0xbb, 0x58, 0x6e, 0x96, 0xa3, 0x50, 0xe3, 0xd0, 0x5c, 0xe1, 0xd6, 0x98, 0xa5, 0x2e, 0xbb, 0x33, 0x9f, 0xd8, 0x55, 0x37, 0x85, 0x99, 0xd9, 0x49, 0x31, 0xe0, 0xfe, 0xbb, 0x9a, 0x8d, 0x01, 0x09, 0x52, 0x38, 0xac, 0xe6, 0x56, 0x6d, 0x8b, 0x16, 0x32, 0x96, 0xce, 0xac, 0x8e, 0x94, 0xfc, 0xf7, 0xd8, 0x4e, 0x56, 0x16, 0xea, 0xf3, 0x94, 0xf1, 0xe6, 0xa7, 0xf8, 0x30, 0xbc, 0x26, 0x58, 0x6b, 0x72, 0x92, 0xe1, 0x06, 0x8c, 0x41, 0x1f, 0x78, 0x8d, 0xca, 0x4f, 0x76, 0xff, 0x46, 0xe2, 0x18, 0xe0, 0xac, 0x7c, 0x0e, 0x46, 0x91, 0x59, 0x2c, 0x20, 0x42, 0x24, 0x70, 0xa8, 0x3d, 0x35, 0xfe, 0xae, 0x06, 0x9f, 0xc0, 0x62, 0x20, 0x6e, 0xcb, 0x5c, 0xe3, 0xcd, 0x7c, 0x8b, 0xbd, 0x1d, 0xe6, 0x67, 0x0e, 0x6e, 0xf1, 0xb3, 0x9b, 0xf2, 0xd0, 0x68, 0x1c, 0x7c, 0x34, 0x6f, 0xa1, 0x0c, 0x03, 0x75, 0x9d, 0x9d, 0x0d, 0x11, 0xc7, 0x32, 0x60, 0x3c, 0x44, 0x0e, 0x8d, 0x4e, 0xa8, 0x90, 0xc7, 0x6b, 0x2a, 0x37, 0x7f, 0x9c, 0x8b, 0x27, 0xe9, 0xde, 0xb4, 0xe4, 0x1a, 0xe9, 0x4f, 0x6b, 0x03, 0x0e, 0x4a, 0xb4, 0x03, 0x35, 0x58, 0x6b, 0xf4, 0x44, 0x19, 0x45, 0xc7, 0xb6, 0xca, 0x4a, 0xe6, 0xc3, 0x77, 0x81, 0x74, 0x19, 0x66, 0x7b, 0xdf, 0x38, 0x5e, 0x9a, 0x44, 0xef, 0xf7, 0x30, 0x84, 0x11, 0xb6, 0x1e, 0xd8, 0xd1, 0x0e, 0x9c, 0x7c, 0x56, 0x86, 0xc4, 0xa9, 0x0f, 0x68, 0x1c, 0xfc, 0x7d, 0x08, 0xf7, 0x0b, 0x96, 0x32, 0xee, 0x77, 0xdd, 0xdd, 0xed, 0x79, 0x0c, 0x77, 0x0f, 0x7c, 0x87, 0xae, 0xbe, 0x3a, 0x8c, 0xcd, 0x68, 0x55, 0xa3, 0xc2, 0xca, 0x88, 0x19, 0x01, 0xa2, 0x25, 0x11, 0x1b, 0x5b, 0x3b, 0xad, 0xe6, 0x46, 0xe0, 0xac, 0xc6, 0xca, 0x58, 0x7f, 0xd1, 0x04, 0xa1, 0x45, 0x65, 0xff, 0x45, 0x2e, 0x68, 0xef, 0xcf, 0x2f, 0x20, 0x65, 0xaa, 0x86, 0x23, 0x2a, 0xa9, 0x42, 0xcd, 0x98, 0xd7, 0x09, 0x79, 0xff, 0xbb, 0xb3, 0x7e, 0x93, 0x51, 0x8a, 0x01, 0xcd, 0x19, 0xad, 0xd3, 0xb3, 0xf8, 0x07, 0xea, 0x58, 0xed, 0xe7, 0x96, 0x0a, 0xf7, 0x0c, 0x10, 0xf4, 0x51, 0xb9, 0xa9, 0x4e, 0x2e, 0x6a, 0xd4, 0x05, 0x11, 0x6d, 0xab, 0xf4, 0xc5, 0x0f, 0xc9, 0xa9, 0x86, 0xe5, 0x4e, 0x05, 0xcb, 0xab, 0xea, 0x01, 0x68, 0x1a, 0xd4, 0x21, 0x0f, 0x61, 0x08, 0x65, 0x98, 0xac, 0x22, 0xc6, 0xd5, 0x01, 0x04, 0xfc, 0x2f, 0x5f, 0xf7, 0x55, 0x21, 0x23, 0x90, 0xb7, 0xf9, 0x3e, 0x3a, 0x47, 0x8b, 0x60, 0x60, 0x13, 0x09, 0x92, 0xd1, 0xe3, 0x5c, 0x03, 0x42, 0xad, 0xc4, 0x24, 0x35, 0x02, 0xc5, 0x86, 0xbc, 0x62, 0x13, 0x43, 0x31, 0xa0, 0x93, 0x83, 0x3c, 0xe1, 0x11, 0x36, 0x15, 0xa7, 0x30, 0x7d, 0x9b, 0x28, 0x36, 0x79, 0x16, 0xf8, 0xfd, 0xd0, 0x9e, 0x61, 0x40, 0x10, 0x52, 0xa0, 0x3b, 0x2f, 0xe8, 0x92, 0x7d, 0x5d, 0x73, 0x96, 0xb9, 0xfc, 0xcb, 0x93, 0x49, 0xcb, 0xc1, 0xa5, 0x25, 0xb6, 0x7b, 0x2e, 0x76, 0x14, 0xb3, 0x42, 0x80, 0xf7, 0xdb, 0xfe, 0xf0, 0x44, 0x42, 0x35, 0xd7, 0x78, 0x14, 0x2c, 0x06, 0x73, 0xa2, 0x9a, 0x50, 0xaf, 0x5c, 0x11, 0x56, 0x6c, 0x99, 0x27, 0x85, 0xad, 0x29, 0x06, 0x28, 0x5f, 0x32, 0xd1, 0x3b, 0x08, 0x24, 0xdf, 0x78, 0x7d, 0xeb, 0x4f, 0x18, 0x66, 0x14, 0xab, 0x5e, 0x25, 0x03, 0x79, 0xd4, 0x96, 0x9f, 0x47, 0xe0, 0x94, 0x57, 0x27, 0x3a, 0xd1, 0x17, 0x1e, 0xa4, 0x58, 0x9f, 0x81, 0x06, 0x77, 0x45, 0xbc, 0x3a, 0x0a, 0x21, 0x11, 0x91, 0xa1, 0xf9, 0x0d, 0xd3, 0xfb, 0xb0, 0x94, 0x43, 0xee, 0x0c, 0xed, 0x73, 0x13, 0xb1, 0x1b, 0x1a, 0xd7, 0xd8, 0xbe, 0xc3, 0xe2, 0xde, 0x2b, 0x48, 0x77, 0xaa, 0x8e, 0x41, 0x69, 0x55, 0x37, 0xec, 0x65, 0xf2, 0x28, 0xf1, 0xcd, 0x31, 0xf8, 0xe5, 0x12, 0x01, 0xf6, 0x96, 0xd2, 0x68, 0x94, 0x22, 0xd0, 0x5b, 0x02, 0xf7, 0x58, 0x5d, 0x29, 0x35, 0xc8, 0xba, 0xeb, 0xf1, 0x79, 0x85, 0x35, 0x90, 0x78, 0x85, 0xd9, 0xe7, 0xd4, 0xa3, 0x80, 0x81, 0x76, 0x32, 0xb1, 0x0a, 0xfc, 0x75, 0xd9, 0x89, 0x87, 0x53, 0x4d, 0xf2, 0x98, 0x69, 0x81, 0xc3, 0xf9, 0x19, 0x61, 0xd2, 0x88, 0xf8, 0x62, 0xf7, 0x24, 0xf7, 0x27, 0x77, 0x51, 0x96, 0x83, 0x85, 0x86, 0xe9, 0xdc, 0x8e, 0xb6, 0x8f, 0xef, 0x35, 0xff, 0xa9, 0xe3, 0x34, 0x29, 0x6e, 0x3b, 0x94, 0x5a, 0xf6, 0x7b, 0x17, 0x76, 0x7a, 0x5b, 0xde, 0x2b, 0x09, 0xf1, 0x33, 0x5d, 0x74, 0xe4, 0x62, 0x99, 0xdb, 0x7a, 0x4b, 0xc3, 0xdc, 0x7c, 0x26, 0x72, 0xbe, 0x66, 0x11, 0xde, 0xcf, 0xdc, 0xed, 0x3c, 0x06, 0x51, 0xae, 0x51, 0x39, 0x68, 0x72, 0x00, 0x87, 0x1a, 0x97, 0x19, 0x61, 0x56, 0xe6, 0x1d, 0x8b, 0x47, 0xb2, 0x82, 0x19, 0x7d, 0xe3, 0x0f, 0xbc, 0xab, 0x72, 0xdc, 0x5d, 0x32, 0x71, 0x5e, 0xcc, 0x96, 0x3d, 0x2b, 0x02, 0x57, 0x34, 0x84, 0xfc, 0x3f, 0x81, 0xb6, 0x94, 0xca, 0x93, 0xef, 0x5b, 0x94, 0x0e, 0xc0, 0xaf, 0xb7, 0x57, 0x62, 0x31, 0x0e, 0x01, 0x8d, 0xef, 0x50, 0x12, 0x96, 0xca, 0xc7, 0x4b, 0x0f, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xbd, 0x06, 0xe6, 0x81, 0xc1, 0x14, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x33, 0xc2, 0x90, 0xa3, 0x43, 0x52, 0x20, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x00, 0xd7, 0x18, 0xa6, 0xad, 0x12, 0x6a, 0x1a, 0xaa, 0xe9, 0xfb, 0x77, 0x1a, 0x30, 0x10, 0x87, 0x2d, 0xaa, 0x12, 0x77, 0x0a, 0x87, 0x16, 0x82, 0x84, 0xc6, 0x2b, 0xc0, 0x05, 0x5f, 0xfd, 0x4c, 0x34, 0xd3, 0x24, 0xde, 0x70, 0xd4, 0xaa, 0x4f, 0x07, 0x56, 0x02, 0xca, 0xe5, 0xb1, 0x3d, 0xfa, 0x58, 0xbf, 0x2b, 0x08, 0x68, 0x8d, 0x6d, 0x9f, 0x2e, 0x81, 0x52, 0x95, 0xba, 0xcf, 0x71, 0xb3, 0xe2, 0xe9, 0x11, 0xce, 0x92, 0x3a, 0xab, 0x95, 0x92, 0x40, 0xb8, 0x35, 0xc0, 0x18, 0x0c, 0xff, 0x41, 0x16, 0x53, 0x0a, 0xe2, 0x36, 0xd8, 0x4c, 0x4e, 0xb3, 0x93, 0x88, 0xac, 0x8a, 0xcd, 0x23, 0xa5, 0xb7, 0x1b, 0x1c, 0x28, 0x91, 0x74, 0x1a, 0x86, 0x9a, 0xcb, 0x1b, 0x8d, 0xc4, 0x00, 0xf1, 0x30, 0x95, 0xa3, 0x36, 0x25, 0xd6, 0x07, 0x6b, 0x41, 0x23, 0xdc, 0x6b, 0x0b, 0xd3, 0x02, 0x7c, 0xd2, 0xfc, 0x03, 0xf6, 0xaa, 0xf6, 0x49, 0xc9, 0x8a, 0x45, 0x19, 0xc7, 0xf9, 0x96, 0x06, 0xc2, 0xe6, 0x6e, 0x2e, 0x1e, 0xbc, 0x49, 0x68, 0xa8, 0x37, 0x57, 0x7a, 0xeb, 0x09, 0x52, 0xd4, 0x1c, 0x8a, 0xe1, 0x09, 0x53, 0xe9, 0x93, 0x82, 0x96, 0xe7, 0x0a, 0x8b, 0x03, 0x63, 0x9a, 0x24, 0x96, 0xd0, 0xfc, 0x33, 0xe0, 0xdc, 0x77, 0x41, 0x1d, 0xd5, 0x1f, 0x1b, 0x05, 0x16, 0x1e, 0x31, 0x4f, 0xdf, 0x3c, 0xa6, 0x26, 0xc3, 0x4f, 0xef, 0x13, 0x3a, 0x39, 0x72, 0x18, 0x9b, 0x8e, 0x54, 0x77, 0x69, 0xf9, 0x71, 0x4a, 0x3e, 0x01, 0x19, 0x59, 0x8d, 0xe5, 0x3b, 0x45, 0xe4, 0xb1, 0x2a, 0xa7, 0xc8, 0x17, 0xb3, 0xd5, 0x9b, 0x75, 0xd5, 0xab, 0x03, 0x36, 0x11, 0xf7, 0xab, 0x75, 0xf3, 0x60, 0x4a, 0xc3, 0x5a, 0xed, 0xd4, 0x27, 0xfb, 0x1b, 0xc5, 0xce, 0x33, 0x5b, 0x76, 0x54, 0x8d, 0xe8, 0x00, 0xc9, 0xa7, 0x20, 0x4b, 0xc8, 0x1d, 0x67, 0xe8, 0xdd, 0x07, 0x47, 0x8d, 0x5c, 0xd9, 0xb3, 0x7d, 0xf7, 0x02, 0x64, 0x50, 0x89, 0xae, 0x89, 0x41, 0x65, 0x09, 0xa3, 0x86, 0x28, 0x38, 0xf0, 0x56, 0x19, 0x11, 0x0a, 0x6c, 0x8d, 0x0c, 0x1f, 0x3c, 0x3b, 0x83, 0x22, 0xd3, 0x1d, 0x8d, 0xab, 0x22, 0x13, 0xad, 0x7a, 0x82, 0x27, 0x66, 0x97, 0x02, 0x80, 0xc1, 0xa0, 0x29, 0xcc, 0x71, 0x1f, 0x34, 0xe6, 0x9f, 0x9e, 0x35, 0xb2, 0x5e, 0x78, 0x52, 0xa9, 0x23, 0xac, 0x23, 0xd5, 0x6b, 0x69, 0x2e, 0xa8, 0xdd, 0x3e, 0x33, 0x62, 0x99, 0x6d, 0x1f, 0xa1, 0xfb, 0xd4, 0x8f, 0xb7, 0xba, 0x05, 0x9b, 0x74, 0x36, 0x44, 0xa8, 0xe3, 0x4e, 0xfe, 0xba, 0x9f, 0x63, 0x10, 0x2f, 0x96, 0xfa, 0x9b, 0xec, 0x87, 0x41, 0x05, 0xc4, 0x41, 0xf4, 0x81, 0x02, 0xc8, 0x6e, 0x30, 0x81, 0x8b, 0xfa, 0x67, 0x55, 0x8a, 0xed, 0xa6, 0x6c, 0xd7, 0x66, 0xad, 0x15, 0x2b, 0x00, 0xbc, 0x69, 0x04, 0x4b, 0x7d, 0x81, 0x3e, 0x80, 0xed, 0x0a, 0xb2, 0x68, 0x88, 0xc5, 0x56, 0x32, 0x7c, 0x4c, 0xb2, 0x0f, 0xef, 0xfe, 0x3c, 0x1b, 0x6e, 0xfe, 0x28, 0x08, 0x2c, 0x71, 0x48, 0xaf, 0x4a, 0xe0, 0xb6, 0x42, 0x9e, 0x0b, 0x9e, 0xce, 0x8e, 0xed, 0x58, 0x8b, 0x50, 0x63, 0xd0, 0x2e, 0x66, 0x04, 0x7f, 0xc8, 0xea, 0xb4, 0x38, 0xc5, 0x76, 0xe6, 0xba, 0xb4, 0x17, 0xaa, 0x80, 0xd5, 0x64, 0x98, 0x50, 0x78, 0xa3, 0xce, 0x1d, 0x6d, 0x6f, 0xb4, 0x65, 0x7e, 0xd8, 0xd4, 0x17, 0xdf, 0x68, 0x0c, 0xf7, 0x56, 0xcf, 0xfa, 0x8a, 0xca, 0x5d, 0x1c, 0xa6, 0x72, 0x00, 0x39, 0xea, 0x79, 0xca, 0x4e, 0x63, 0x93, 0x51, 0x20, 0xbc, 0xea, 0xa4, 0x69, 0x05, 0xbd, 0xd4, 0xc1, 0xa4, 0xd4, 0xd0, 0xbd, 0x1a, 0x66, 0xc4, 0x4e, 0xbc, 0xca, 0xf7, 0x25, 0xd8, 0x9a, 0x42, 0x63, 0x7d, 0x15, 0x2f, 0xd1, 0x46, 0x63, 0xf3, 0xf9, 0x6a, 0x2e, 0x8f, 0x4e, 0xe5, 0xc2, 0x46, 0xee, 0x22, 0x93, 0x3b, 0x2c, 0x07, 0x5d, 0xfe, 0x7d, 0x8f, 0x75, 0x84, 0xbc, 0x22, 0x06, 0x58, 0x38, 0x76, 0x9e, 0x8f, 0x71, 0xbe, 0x07, 0x16, 0x61, 0xff, 0x25, 0x64, 0x7f, 0x32, 0x84, 0x88, 0xe1, 0xd2, 0xb1, 0x1e, 0xd6, 0xba, 0x24, 0x0c, 0x72, 0xbf, 0xf3, 0x7a, 0xa1, 0xfe, 0x76, 0x65, 0xab, 0xaa, 0x27, 0xfb, 0x68, 0x1e, 0x67, 0x59, 0x75, 0xec, 0x6d, 0x8d, 0x68, 0xe3, 0xb3, 0x42, 0x20, 0x3a, 0x76, 0x65, 0xa5, 0x7e, 0xd2, 0xca, 0x62, 0xb2, 0x7e, 0xe0, 0x24, 0xae, 0x2d, 0x3b, 0x2a, 0x89, 0xc2, 0xf0, 0xc2, 0xc8, 0x66, 0xb8, 0xbe, 0xfb, 0x53, 0x89, 0x2f, 0x1f, 0x2c, 0xda, 0x5c, 0x02, 0x50, 0x7a, 0x11, 0x6f, 0x64, 0x52, 0xd5, 0x53, 0x8f, 0x9a, 0xa9, 0x0f, 0x30, 0xfa, 0xee, 0x5c, 0x68, 0xd6, 0x6f, 0x5f, 0xb7, 0x95, 0xd9, 0xa9, 0x1b, 0x62, 0x51, 0xd2, 0xf8, 0x99, 0x7a, 0x6c, 0xb5, 0xe1, 0x27, 0x4b, 0x06, 0xed, 0xbc, 0x18, 0x25, 0x21, 0xe5, 0x62, 0x5e, 0x15, 0xb8, 0x14, 0x24, 0xb1, 0xd1, 0x40, 0x1f, 0x36, 0xf7, 0x8d, 0xa6, 0xb2, 0xfd, 0xb2, 0x07, 0x2c, 0xbe, 0x05, 0x4d, 0x75, 0x72, 0xbc, 0xf1, 0xbc, 0xc9, 0x0c, 0xc2, 0x8c, 0xa0, 0x70, 0x63, 0x14, 0xe2, 0xec, 0x7e, 0x6c, 0xf6, 0xbb, 0xb5, 0x40, 0x53, 0xda, 0x97, 0x27, 0x21, 0xb0, 0x46, 0x48, 0x59, 0x35, 0xd2, 0x98, 0xb0, 0x84, 0x03, 0x3d, 0xe6, 0x0f, 0xb5, 0xf0, 0x5d, 0xa6, 0xc0, 0xcd, 0xf3, 0x75, 0x02, 0xda, 0xce, 0x20, 0x06, 0x12, 0x15, 0xac, 0xe0, 0xae, 0xe8, 0x06, 0x1c, 0x8d, 0x4c, 0x96, 0xca, 0x03, 0x45, 0x74, 0xc1, 0x02, 0x96, 0xe1, 0xeb, 0x8f, 0xc4, 0xb2, 0xe7, 0xae, 0xd8, 0xbe, 0x52, 0x9b, 0x0f, 0xa5, 0xf9, 0x4e, 0x27, 0xab, 0x96, 0xc9, 0x27, 0xed, 0x89, 0xd0, 0x3c, 0x45, 0xa5, 0x18, 0xe3, 0x4c, 0xc6, 0x99, 0x9d, 0xe9, 0x9b, 0x83, 0x56, 0x16, 0x5d, 0x3a, 0x21, 0x82, 0x19, 0x48, 0x6c, 0x73, 0x3f, 0x0d, 0xf0, 0x3e, 0xce, 0x86, 0x70, 0x0c, 0x22, 0xdb, 0x7d, 0x0e, 0x5b, 0x35, 0x98, 0x73, 0x7a, 0x33, 0x94, 0xf9, 0x78, 0xd8, 0xee, 0x5e, 0x99, 0xb0, 0x8b, 0xd3, 0x42, 0x46, 0x6e, 0x93, 0x1b, 0x25, 0xa8, 0x14, 0xa8, 0x7d, 0xc4, 0x7b, 0x01, 0xc1, 0x01, 0xdd, 0x05, 0x57, 0x4b, 0x2a, 0x74, 0xda, 0x2e, 0x04, 0x58, 0x10, 0x34, 0xd1, 0x0e, 0xaa, 0xca, 0x24, 0x66, 0x91, 0x17, 0xec, 0xca, 0xab, 0xb7, 0x6d, 0xa2, 0x35, 0xad, 0x0d, 0x60, 0xd3, 0x36, 0xbd, 0x63, 0x40, 0x8b, 0xd7, 0xad, 0x42, 0x17, 0xe8, 0xda, 0xc6, 0x27, 0x72, 0xcc, 0x78, 0x18, 0x8e, 0x66, 0x20, 0xc8, 0x84, 0x86, 0x5d, 0x59, 0x20, 0x3e, 0x7c, 0x08, 0x7e, 0x66, 0xaf, 0x9b, 0x38, 0x3e, 0x34, 0x4b, 0x33, 0xa7, 0xf1, 0xce, 0x27, 0x04, 0x6d, 0xc1, 0x2f, 0xa7, 0x85, 0xa7, 0x96, 0x84, 0x42, 0xb0, 0x73, 0x70, 0xd1, 0xe5, 0xa1, 0xbf, 0xec, 0x65, 0xce, 0xe8, 0x50, 0x2e, 0x2d, 0x61, 0xca, 0xb6, 0x7d, 0xb5, 0x4e, 0x48, 0x20, 0xc8, 0x80, 0x52, 0x5e, 0xca, 0xfb, 0xc4, 0x1b, 0xdb, 0x4e, 0x46, 0xcc, 0x49, 0xe6, 0xef, 0xb5, 0xde, 0x99, 0xdb, 0x65, 0x74, 0x05, 0xe3, 0x47, 0xa1, 0xd6, 0x7a, 0xed, 0x91, 0xd6, 0xe3, 0x81, 0x27, 0x50, 0x0d, 0x41, 0xc1, 0xf5, 0x93, 0x25, 0x2b, 0x6c, 0xa9, 0x36, 0xd2, 0xe7, 0x1e, 0xe0, 0xa9, 0x95, 0x68, 0xfd, 0xa7, 0xb9, 0xe1, 0x81, 0x95, 0xd0, 0x8c, 0xce, 0x12, 0x6c, 0xe0, 0x29, 0x6f, 0xee, 0x33, 0xde, 0x46, 0x64, 0xa9, 0x72, 0x82, 0x03, 0x1d, 0x1e, 0xdd, 0x9f, 0x1c, 0x5c, 0x39, 0xc8, 0xc3, 0x16, 0x9c, 0xf6, 0xb3, 0x7b, 0xec, 0x86, 0xb9, 0xe9, 0xe1, 0x4e, 0xb1, 0x14, 0xfd, 0x9c, 0x26, 0xb3, 0x81, 0x25, 0xab, 0x4c, 0x25, 0xd3, 0xa2, 0x63, 0x77, 0x0f, 0xf5, 0x26, 0xc5, 0x14, 0x0c, 0x53, 0x35, 0xa7, 0x7d, 0xa0, 0xce, 0x4e, 0x04, 0x97, 0x77, 0x4c, 0x74, 0x6a, 0xf3, 0xeb, 0xdd, 0xae, 0x27, 0xfc, 0xf7, 0xd0, 0x21, 0xea, 0x46, 0x36, 0x22, 0x84, 0x9d, 0x8c, 0x0c, 0xef, 0x87, 0x0c, 0xac, 0x3a, 0xcc, 0x76, 0xf3, 0xe0, 0xac, 0x7d, 0x01, 0x93, 0x1a, 0x2d, 0x42, 0x99, 0xf3, 0x46, 0xc6, 0xa5, 0x87, 0x9a, 0x44, 0xa4, 0x29, 0xa2, 0xb3, 0x5c, 0x80, 0x10, 0xd4, 0xb7, 0x35, 0x58, 0xc0, 0xd2, 0x65, 0x14, 0x28, 0x4c, 0x95, 0x6e, 0x9b, 0x33, 0x6c, 0x9a, 0xf5, 0x8b, 0x33, 0x92, 0xae, 0x89, 0x53, 0xc5, 0x08, 0x62, 0xbd, 0x57, 0x72, 0xad, 0xb9, 0x35, 0x2c, 0xe5, 0xf6, 0xa4, 0x70, 0xeb, 0xd1, 0xb9, 0x6c, 0x58, 0x1a, 0x12, 0xf5, 0x55, 0xb9, 0x95, 0x69, 0x22, 0xcf, 0x58, 0x88, 0xd2, 0x3f, 0x1f, 0x1d, 0xca, 0x90, 0x5e, 0x73, 0xce, 0x9d, 0xd6, 0x8b, 0x74, 0xa6, 0xb2, 0xe2, 0x62, 0x64, 0xa0, 0xa6, 0xc4, 0xfe, 0xf7, 0x4b, 0x07, 0x37, 0xd2, 0xe3, 0xd3, 0xe1, 0xc3, 0x92, 0xd0, 0x7c, 0x1c, 0x93, 0x08, 0xd9, 0xc5, 0x76, 0xeb, 0x45, 0x58, 0x3f, 0xf4, 0x2c, 0xab, 0xca, 0x93, 0x5c, 0x6c, 0x75, 0xed, 0x1e, 0xa1, 0x15, 0xc5, 0xfa, 0x22, 0xbd, 0x40, 0x6b, 0x96, 0xae, 0xa3, 0x4c, 0x49, 0xee, 0xb9, 0xd7, 0x85, 0x53, 0x24, 0x11, 0x86, 0x43, 0x18, 0x9b, 0x3c, 0x00, 0x89, 0x48, 0x73, 0x5c, 0x91, 0x1b, 0x80, 0x9a, 0x19, 0x0e, 0x19, 0x35, 0x95, 0x51, 0x88, 0xfe, 0xe9, 0x2c, 0x59, 0xdd, 0x95, 0x19, 0xe6, 0x71, 0xa8, 0x84, 0x66, 0x2c, 0xee, 0xc0, 0xa7, 0x4b, 0x9d, 0xef, 0xbf, 0xa5, 0x11, 0x0f, 0xb7, 0xa8, 0x38, 0xb6, 0x4c, 0x1c, 0x93, 0x3d, 0x00, 0x32, 0xb2, 0x4b, 0xb4, 0x7d, 0xf7, 0xb0, 0xab, 0xdb, 0xc0, 0xb0, 0xb1, 0x71, 0x2c, 0xd7, 0x83, 0x2e, 0xe8, 0x88, 0x3b, 0x01, 0xb2, 0xe1, 0x36, 0xcf, 0xca, 0xea, 0x6f, 0xd8, 0x09, 0xa7, 0x6d, 0x61, 0x99, 0x29, 0x35, 0x46, 0xc7, 0xf2, 0x0d, 0xf6, 0xd0, 0x4b, 0x4e, 0x8f, 0x66, 0x58, 0x31, 0x0b, 0x0b, 0x74, 0xbc, 0x31, 0x3d, 0x35, 0x7d, 0x54, 0x3f, 0x13, 0x47, 0x24, 0xb9, 0xea, 0x94, 0x48, 0x4c, 0x3c, 0xdc, 0xb1, 0x97, 0x0f, 0xbe, 0x74, 0x07, 0xe1, 0x80, 0x98, 0x6c, 0xd4, 0xc5, 0xd1, 0xe9, 0x7e, 0x00, 0xf1, 0x79, 0x26, 0x2e, 0xdc, 0x90, 0x91, 0xb1, 0x44, 0x7e, 0xa4, 0x8f, 0x48, 0xe8, 0xea, 0xbf, 0x39, 0xfe, 0xb3, 0xb3, 0x60, 0xed, 0xfa, 0xc8, 0x89, 0x27, 0x16, 0x76, 0x58, 0x51, 0xcc, 0xa7, 0xf5, 0x24, 0x8a, 0xaa, 0x0d, 0x19, 0x36, 0x92, 0x66, 0x1b, 0xe9, 0x9f, 0xb7, 0x26, 0x12, 0xf2, 0xf5, 0x36, 0x33, 0x88, 0x5a, 0xa1, 0x54, 0x41, 0x69, 0x3b, 0x05, 0x46, 0x2d, 0x8c, 0x00, 0xc5, 0xf9, 0x67, 0x63, 0xba, 0x6f, 0x01, 0x4f, 0x4a, 0x82, 0x2f, 0x28, 0x35, 0xc8, 0x01, 0xce, 0x6f, 0xc8, 0x5a, 0xea, 0x24, 0x14, 0xeb, 0xf0, 0x69, 0x93, 0x50, 0xd9, 0x2b, 0x96, 0x8c, 0x5e, 0x75, 0x50, 0x92, 0xea, 0xcb, 0xcd, 0x38, 0x87, 0xdf, 0x0f, 0x21, 0x2c, 0x8c, 0x28, 0xdc, 0xc7, 0x94, 0x6a, 0x32, 0xe6, 0x67, 0xa0, 0x6b, 0x54, 0xf8, 0x10, 0x92, 0xa6, 0xc7, 0x55, 0xba, 0xc5, 0x82, 0xf8, 0x98, 0x96, 0x1f, 0x0a, 0x54, 0x86, 0xd9, 0x6c, 0xa7, 0xa8, 0x1f, 0x0d, 0x15, 0x54, 0x89, 0x10, 0xe5, 0xe5, 0xb5, 0xe2, 0x2c, 0x21, 0x0a, 0x70, 0x49, 0x43, 0x5f, 0xa5, 0xa2, 0xa9, 0x38, 0x4a, 0x93, 0x43, 0x5f, 0xfe, 0xd2, 0x8b, 0xfb, 0x56, 0x3d, 0x05, 0x2a, 0xd8, 0x74, 0x49, 0x15, 0x2b, 0xcb, 0xcb, 0xf0, 0x01, 0x54, 0x50, 0x9d, 0xed, 0x71, 0xcf, 0x19, 0x6d, 0x49, 0x68, 0xdc, 0x66, 0x33, 0xa9, 0x42, 0x6f, 0xe6, 0x0e, 0xd8, 0xd1, 0x4b, 0x22, 0x3a, 0x8c, 0xc0, 0x81, 0x5a, 0xc8, 0x64, 0x97, 0x18, 0x3d, 0xf8, 0xad, 0x3b, 0xec, 0x6f, 0x9a, 0x17, 0x90, 0x47, 0x38, 0x6a, 0xfe, 0x56, 0x80, 0x88, 0x6d, 0xfa, 0x00, 0xba, 0xda, 0x66, 0x45, 0x41, 0x06, 0x3e, 0xe0, 0x4b, 0xdc, 0x83, 0x59, 0x71, 0x16, 0x99, 0x6e, 0xc9, 0x41, 0xa3, 0x81, 0x3c, 0xf7, 0x18, 0x96, 0x6a, 0x24, 0x40, 0x6f, 0x3f, 0xbd, 0x6a, 0xe7, 0xba, 0x63, 0xff, 0xe8, 0x4b, 0x75, 0xc3, 0x54, 0xe6, 0xc8, 0xc8, 0x89, 0x29, 0x2e, 0x4a, 0xec, 0xf3, 0x2f, 0x6d, 0x84, 0x31, 0xc3, 0x22, 0x52, 0x62, 0xf6, 0xf3, 0x16, 0xe9, 0xcb, 0xe0, 0x68, 0xef, 0x75, 0x7a, 0x6d, 0x95, 0xdf, 0x84, 0x3a, 0xa0, 0x10, 0xf8, 0x7d, 0x1d, 0xda, 0x8d, 0x8a, 0x30, 0x18, 0xd5, 0x80, 0xd4, 0x4e, 0x05, 0xbc, 0x6d, 0x1f, 0x79, 0x3d, 0x83, 0x0a, 0x5a, 0x4f, 0x41, 0xb4, 0x46, 0xba, 0xcb, 0x0f, 0xd0, 0xc9, 0x87 }; +constexpr AccessUnit ATRACX_MULTIPLE_PACK_EXPECTED_AU_1 = { 0x15f90, 0x159b2, false, 0, {}, { 0x78, 0x2c, 0xd2, 0xa4, 0x87, 0x7f, 0xa1, 0xcb, 0x57, 0xad, 0x86, 0x2b, 0xe4, 0xb7, 0xe1, 0xfc, 0xa1, 0xab, 0xb8, 0xc5 } }; +constexpr AccessUnit ATRACX_MULTIPLE_PACK_EXPECTED_AU_2 = { 0x2aefeae9, 0x778806c4, false, 0, {}, { 0x0e, 0x9b, 0x87, 0x06, 0x59, 0x9a, 0xe2, 0xb6, 0xf7, 0x53, 0xfc, 0x2d, 0x47, 0x60, 0xca, 0x7d, 0x52, 0xd1, 0xd4, 0x61 } }; +constexpr AccessUnit ATRACX_MULTIPLE_PACK_EXPECTED_AU_3 = { 0x15f90, 0x159b2, false, 0, {}, { 0x59, 0x1b, 0x5e, 0x0b, 0x45, 0xe7, 0x7d, 0xfb, 0x30, 0x15, 0xce, 0x9b, 0xc1, 0xea, 0xc7, 0x1c, 0xad, 0x4d, 0x3c, 0xe1 } }; +constexpr AccessUnit ATRACX_MULTIPLE_PACK_EXPECTED_AU_4 = { std::numeric_limits::max(), std::numeric_limits::max(), false, 0, {}, { 0x8c, 0xf7, 0x8f, 0x01, 0x95, 0x33, 0x90, 0xf4, 0xb6, 0x81, 0xcf, 0x8f, 0x9f, 0xd2, 0xf0, 0x9c, 0xd9, 0xae, 0xc1, 0xe4 } }; + +constexpr std::array AC3_MULTIPLE_PACK_STREAM = { 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xbd, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x30, 0x00, 0x00, 0x00, 0xf3, 0xa6, 0x50, 0x0c, 0xe5, 0x05, 0x0e, 0x03, 0xb9, 0x70, 0x70, 0xf1, 0xfa, 0xac, 0xf5, 0xd7, 0x56, 0x65, 0xa2, 0x06, 0x5a, 0x45, 0xc1, 0x76, 0x51, 0xd2, 0xde, 0x1a, 0xcd, 0x4c, 0xa4, 0x7c, 0xb5, 0xaf, 0xc9, 0xc6, 0xd5, 0xd5, 0x4b, 0x35, 0x5b, 0x70, 0x38, 0xbb, 0xf4, 0x89, 0x9d, 0x5d, 0xa7, 0x5d, 0x05, 0x21, 0x84, 0x11, 0xf6, 0xdc, 0x83, 0x0a, 0x1b, 0xa7, 0x79, 0x16, 0xe5, 0xdc, 0x2a, 0x8e, 0x45, 0x86, 0xe5, 0x45, 0xdc, 0x0b, 0x77, 0x56, 0xd1, 0x5d, 0x71, 0x45, 0xf7, 0xb6, 0xbe, 0x24, 0xd4, 0x03, 0xce, 0xea, 0x38, 0xed, 0xc8, 0x79, 0xb8, 0x05, 0xbb, 0x49, 0x5c, 0x08, 0xbe, 0x2c, 0x9c, 0x06, 0xf2, 0x58, 0x04, 0x30, 0x62, 0x75, 0x45, 0x3e, 0xf8, 0xda, 0x1b, 0x63, 0x06, 0x96, 0x35, 0xc2, 0x03, 0xdc, 0x2a, 0x0c, 0xb9, 0x61, 0x06, 0x1f, 0x66, 0x46, 0xa1, 0xe5, 0x40, 0xba, 0xec, 0xf2, 0x4b, 0xdc, 0xab, 0xd3, 0xaa, 0xe0, 0xf4, 0x3a, 0xdd, 0x40, 0x0d, 0xfb, 0x6e, 0x2e, 0x79, 0x1c, 0xd4, 0xd0, 0x41, 0xd1, 0x3b, 0x26, 0x9e, 0x84, 0xc7, 0x3b, 0x94, 0x6a, 0x46, 0x67, 0xef, 0x5c, 0x96, 0x31, 0xa4, 0xea, 0xb8, 0xfa, 0x4d, 0x1b, 0xac, 0x8b, 0x4c, 0xe5, 0x90, 0xc7, 0xda, 0x98, 0x01, 0xcb, 0x2e, 0x86, 0x8f, 0xbe, 0xb5, 0x8a, 0x3e, 0x01, 0xad, 0xb9, 0x24, 0x7f, 0x7a, 0xb8, 0xe9, 0xb3, 0x64, 0xe0, 0xe1, 0x32, 0x40, 0xed, 0x30, 0x1c, 0x3a, 0x1b, 0x22, 0x86, 0xee, 0xf1, 0x7d, 0xbc, 0x2a, 0xd6, 0x2e, 0x01, 0x1b, 0x0d, 0xb0, 0x54, 0xdd, 0xe7, 0xbf, 0x64, 0x98, 0x4a, 0x48, 0x9e, 0x7c, 0x6e, 0x35, 0x04, 0x38, 0x5b, 0x7b, 0x18, 0xbd, 0x06, 0x51, 0x66, 0xe3, 0x1b, 0x61, 0xf4, 0x35, 0xbc, 0x4b, 0xbd, 0x67, 0x2d, 0x95, 0x55, 0x06, 0xb8, 0x20, 0xb3, 0xac, 0xdc, 0x1c, 0x2c, 0x5d, 0x3f, 0xf1, 0xb6, 0x6c, 0xdb, 0x81, 0x6c, 0xc3, 0xca, 0x03, 0x7e, 0x6a, 0x39, 0x53, 0x8e, 0xd0, 0xbe, 0xe3, 0x24, 0x45, 0x3a, 0x40, 0xd1, 0xba, 0x90, 0x61, 0x4d, 0xfe, 0x59, 0xfd, 0x90, 0x0d, 0x66, 0xe9, 0x79, 0x78, 0x5f, 0x52, 0xce, 0xf8, 0xc6, 0x6c, 0xeb, 0x83, 0x42, 0xba, 0xe2, 0x20, 0x93, 0x39, 0xa7, 0x3b, 0xfc, 0x7c, 0x6a, 0x44, 0xaa, 0x21, 0x76, 0xbb, 0xc2, 0x05, 0x7e, 0xfd, 0xc7, 0x0c, 0x9e, 0x1b, 0xf0, 0xa3, 0x09, 0x0d, 0xb8, 0xbe, 0x4a, 0x14, 0xa6, 0x1c, 0x8a, 0xf0, 0xf8, 0x8a, 0x63, 0x9a, 0xb6, 0x87, 0xd4, 0x40, 0xd9, 0x65, 0xa3, 0x14, 0xf2, 0x43, 0x75, 0x47, 0x0a, 0xb1, 0xf6, 0x8a, 0xa1, 0x5c, 0xe9, 0x44, 0xe6, 0x89, 0x6d, 0x94, 0xc3, 0x2b, 0xe4, 0x6e, 0xba, 0xb8, 0x3b, 0x40, 0xff, 0xa0, 0x9a, 0x32, 0x17, 0x35, 0x3c, 0xea, 0x5e, 0x7b, 0x43, 0x4e, 0x0e, 0x7c, 0xfd, 0x2a, 0x19, 0x3d, 0xf7, 0x88, 0xab, 0x64, 0xa8, 0x3b, 0xcd, 0x6b, 0x41, 0x09, 0x21, 0xa9, 0xe3, 0x0c, 0x20, 0x5a, 0xa5, 0xda, 0x0e, 0xb7, 0xb4, 0x4a, 0xe2, 0xef, 0x14, 0x38, 0xe3, 0xc0, 0xac, 0x0e, 0x24, 0xb3, 0xc4, 0xbe, 0x01, 0x9c, 0x61, 0xbf, 0x04, 0x85, 0xc2, 0x9b, 0x18, 0xea, 0x65, 0xf0, 0x3f, 0x1b, 0xba, 0xff, 0x40, 0x70, 0x46, 0x86, 0x74, 0x7b, 0x45, 0x5a, 0x36, 0x8f, 0x7c, 0xc6, 0x4a, 0xfd, 0x97, 0xa8, 0x13, 0x3e, 0xf1, 0xec, 0xe5, 0x88, 0x13, 0xfc, 0xc6, 0x0c, 0x4a, 0x14, 0xb3, 0xa4, 0x04, 0x97, 0x66, 0x8c, 0x9d, 0xb3, 0x65, 0x4e, 0x05, 0xf9, 0x33, 0x0d, 0x3f, 0xe8, 0x5f, 0x69, 0xf2, 0x2b, 0x6b, 0x1b, 0x8f, 0x81, 0xf7, 0xca, 0x06, 0xf4, 0xe4, 0x81, 0x1f, 0xa8, 0x20, 0x25, 0xc5, 0x48, 0x3c, 0xaa, 0xfb, 0x78, 0x01, 0x3c, 0xc4, 0x04, 0x46, 0x80, 0x57, 0x77, 0x2d, 0x64, 0x60, 0x8e, 0x60, 0x52, 0x5e, 0x9e, 0xc1, 0x3e, 0x22, 0x4d, 0xc8, 0x39, 0x76, 0x24, 0x11, 0x9a, 0x1f, 0xfc, 0xe7, 0x4f, 0x04, 0xfa, 0xed, 0x65, 0xca, 0x83, 0xc4, 0xfe, 0x30, 0xd8, 0xe5, 0x2c, 0x99, 0x5d, 0x2c, 0x86, 0xb8, 0xf2, 0x88, 0x3d, 0x2c, 0x84, 0xe2, 0x62, 0x94, 0xa6, 0x1a, 0x3f, 0xed, 0x56, 0x29, 0x18, 0x7b, 0x0b, 0x02, 0xa7, 0x3b, 0xe5, 0x48, 0xfe, 0xbf, 0xa6, 0xad, 0x55, 0x52, 0x1b, 0x50, 0x5a, 0xec, 0x4f, 0x1b, 0xa2, 0x09, 0x52, 0xc3, 0xbc, 0x8a, 0x6b, 0xb1, 0x8e, 0xd1, 0x44, 0xc4, 0x96, 0x21, 0xc0, 0x03, 0x04, 0xfd, 0x7f, 0x49, 0x0a, 0x66, 0x24, 0x58, 0x00, 0xb1, 0x1a, 0xbe, 0x91, 0x0c, 0x92, 0x9a, 0xe8, 0x53, 0x67, 0x08, 0xfc, 0xbf, 0xb0, 0x7c, 0xaa, 0x38, 0xf8, 0x03, 0x88, 0x44, 0xd0, 0xeb, 0x48, 0x08, 0xa4, 0x35, 0x17, 0x98, 0x7a, 0x12, 0xb2, 0x30, 0x8c, 0xa4, 0xbd, 0xa1, 0xf2, 0x19, 0x60, 0xd2, 0xa2, 0xb9, 0x7f, 0x2a, 0xbc, 0xc6, 0x8e, 0xbd, 0xa8, 0xc0, 0xcb, 0xb3, 0x57, 0xea, 0x67, 0x0e, 0xd2, 0xf8, 0x22, 0x93, 0x1e, 0x71, 0x0e, 0xb5, 0x08, 0x00, 0x74, 0xd3, 0x8a, 0x9c, 0xc6, 0xf5, 0x61, 0x31, 0x65, 0xb8, 0x1c, 0x31, 0xa0, 0xb6, 0x20, 0x1d, 0xf8, 0x5d, 0x50, 0xdd, 0xde, 0x0f, 0x41, 0xd9, 0x67, 0xac, 0xc2, 0x42, 0x65, 0x34, 0xb9, 0x8d, 0x02, 0x2c, 0x10, 0x33, 0x77, 0x25, 0x9d, 0xfc, 0x0c, 0x1b, 0xed, 0xe8, 0x21, 0x06, 0x33, 0xf5, 0xe8, 0xb9, 0x63, 0x9a, 0x89, 0x34, 0x1b, 0x4e, 0xb5, 0x0c, 0xbe, 0x10, 0xd1, 0x30, 0x30, 0x92, 0xef, 0x34, 0xf8, 0xcf, 0x61, 0x90, 0x29, 0x9b, 0x65, 0x64, 0x95, 0xac, 0xbe, 0xce, 0x24, 0x38, 0x1c, 0xa3, 0xd6, 0xf4, 0x7d, 0x7a, 0x47, 0x2e, 0xa4, 0x0d, 0x86, 0x6b, 0xd2, 0xa1, 0x7c, 0xce, 0x30, 0x37, 0xfa, 0x9b, 0x9e, 0xe2, 0xbe, 0x0f, 0xad, 0x0e, 0x43, 0xed, 0x5f, 0xa0, 0x9f, 0xae, 0xaf, 0x93, 0x5f, 0xcd, 0x44, 0xc5, 0xc7, 0x87, 0xaf, 0xc2, 0xda, 0x30, 0x50, 0x8d, 0x71, 0xda, 0x0c, 0x81, 0x16, 0x7a, 0xb3, 0xb9, 0xda, 0x49, 0x49, 0x3f, 0x46, 0xcd, 0x5f, 0xe6, 0xda, 0xa0, 0xf5, 0x76, 0x5d, 0x78, 0xeb, 0x9e, 0xdf, 0xf3, 0x59, 0x7c, 0x1a, 0x12, 0x54, 0x9b, 0xe9, 0x39, 0x4c, 0xe2, 0x89, 0xe6, 0x33, 0x96, 0xf9, 0xd7, 0xe8, 0x21, 0x9f, 0x20, 0x5c, 0xd8, 0xdb, 0x3d, 0xeb, 0x20, 0xc9, 0xa1, 0x42, 0xad, 0x54, 0xb7, 0xbd, 0x88, 0x13, 0x58, 0x11, 0x3c, 0xcc, 0x77, 0xae, 0xfe, 0xef, 0xea, 0xd5, 0x7b, 0x5f, 0xde, 0xf5, 0xbb, 0xd9, 0xbf, 0xea, 0x2c, 0x33, 0xca, 0xaa, 0xf2, 0x1e, 0x76, 0xbb, 0x52, 0x12, 0x00, 0xf7, 0xcb, 0xe1, 0x4a, 0x9b, 0x77, 0x25, 0xdf, 0xff, 0x4f, 0x5f, 0x26, 0x53, 0x76, 0x62, 0x0e, 0x9d, 0xe8, 0x04, 0x58, 0x4a, 0x41, 0x19, 0xe4, 0x21, 0x70, 0xe6, 0xd1, 0xef, 0x43, 0x45, 0x36, 0x6d, 0xf9, 0x66, 0xa3, 0x3e, 0xc3, 0xac, 0x2a, 0x92, 0x84, 0xf3, 0xea, 0xbd, 0x0c, 0xac, 0xd8, 0x6e, 0x83, 0x32, 0x5f, 0x3f, 0x0b, 0xbb, 0x52, 0xa8, 0xdc, 0xec, 0xcf, 0x2c, 0xe0, 0xbc, 0x39, 0x2c, 0xb2, 0xf2, 0x10, 0x96, 0x35, 0xf1, 0xe7, 0xff, 0x21, 0xe4, 0x3f, 0x24, 0xeb, 0x6c, 0x10, 0x9e, 0x35, 0xcb, 0x4f, 0x29, 0xcf, 0xcf, 0x00, 0xe6, 0xc2, 0xd0, 0xda, 0x11, 0x30, 0xb2, 0x38, 0x24, 0x5c, 0x18, 0xec, 0x96, 0x1f, 0x69, 0x30, 0xc9, 0x74, 0xc0, 0x20, 0xd7, 0x04, 0xe1, 0xb1, 0x4c, 0xc9, 0x04, 0x70, 0x39, 0xbf, 0xae, 0x53, 0x0e, 0xa4, 0x21, 0xfe, 0xd5, 0xdb, 0x88, 0x6a, 0x75, 0xf0, 0xb8, 0x51, 0xf6, 0xd2, 0xce, 0x45, 0x9a, 0x03, 0x0c, 0x64, 0xea, 0x3f, 0x16, 0x41, 0x7e, 0x79, 0xe1, 0x99, 0x41, 0x40, 0xa6, 0x71, 0x06, 0x15, 0x31, 0x8f, 0x88, 0x24, 0x41, 0xf7, 0xed, 0x1a, 0xb9, 0xac, 0x22, 0x74, 0x74, 0xf6, 0x90, 0x41, 0x57, 0x9f, 0xae, 0x85, 0xb7, 0xe2, 0xa4, 0x20, 0xa1, 0x56, 0xec, 0x76, 0x3c, 0x5c, 0x60, 0x24, 0xc9, 0xd5, 0xca, 0xfb, 0xa1, 0x8c, 0x34, 0x6e, 0xca, 0x3a, 0xea, 0x25, 0xaf, 0xd8, 0x49, 0x87, 0xf7, 0x39, 0x25, 0x52, 0x7c, 0xc0, 0xec, 0xb3, 0x36, 0x62, 0xac, 0xc3, 0x5f, 0x84, 0x5a, 0x26, 0xb6, 0xd2, 0x95, 0x2a, 0xf2, 0x7e, 0xc7, 0x70, 0x4e, 0xbf, 0x45, 0x57, 0x04, 0x4b, 0xb5, 0xb7, 0xfc, 0xd6, 0x6c, 0xae, 0xef, 0xe2, 0x25, 0xff, 0xa1, 0xaa, 0x2c, 0x31, 0xd9, 0xe5, 0xa0, 0xca, 0x8d, 0x87, 0xbc, 0x45, 0x42, 0x7a, 0x87, 0x1d, 0x29, 0x18, 0x9f, 0xa1, 0x75, 0x41, 0x0d, 0x96, 0xa7, 0x61, 0xf1, 0xd9, 0x24, 0x35, 0xc6, 0xdf, 0xf8, 0x6e, 0x66, 0x36, 0xea, 0x59, 0xcd, 0xb8, 0xd8, 0xb0, 0x10, 0xa2, 0x03, 0xf2, 0x3f, 0x83, 0x12, 0xb7, 0xc3, 0x85, 0x47, 0x03, 0x95, 0xea, 0x3a, 0x6d, 0xe4, 0xb9, 0xa6, 0x3b, 0x9b, 0x4d, 0xb4, 0x29, 0x63, 0xf4, 0xac, 0x14, 0xc6, 0xb7, 0xca, 0xec, 0xe7, 0xab, 0x9a, 0xf9, 0x68, 0xb6, 0xf1, 0x8c, 0x7b, 0xca, 0x9a, 0xb2, 0xc5, 0x90, 0x47, 0xbc, 0x39, 0xd0, 0x36, 0x1f, 0xe1, 0x2e, 0xaa, 0x1d, 0x08, 0x1c, 0xfa, 0x7e, 0x30, 0x31, 0x82, 0x5f, 0xf8, 0x98, 0xc7, 0x9d, 0xaa, 0x5c, 0x99, 0xbc, 0x0c, 0x0c, 0xa0, 0x31, 0xf5, 0x75, 0xb8, 0x03, 0x5d, 0xa1, 0x13, 0x6c, 0xd9, 0x0b, 0x50, 0xca, 0x7b, 0xad, 0x9b, 0xbc, 0x7a, 0xde, 0x31, 0x67, 0xad, 0xf9, 0x35, 0x61, 0xf5, 0x26, 0xcc, 0x27, 0xb7, 0xa1, 0x70, 0xa5, 0x60, 0x5e, 0xf2, 0x94, 0xe6, 0xf9, 0x88, 0x59, 0xdf, 0xf1, 0xc1, 0x50, 0x2e, 0xed, 0xe7, 0x92, 0xf5, 0x2a, 0x40, 0x75, 0x5f, 0x40, 0xa3, 0xce, 0x8e, 0xb0, 0x4b, 0xcb, 0x0e, 0x6f, 0x11, 0xb3, 0xa1, 0x46, 0x7f, 0x3f, 0x2a, 0xcb, 0x7f, 0xa8, 0xb0, 0x9f, 0x31, 0xcd, 0x85, 0xcb, 0x35, 0xde, 0x34, 0x12, 0x16, 0x61, 0x5d, 0x18, 0xda, 0x04, 0x85, 0xa1, 0xf0, 0x08, 0xe7, 0xad, 0x57, 0xab, 0x37, 0xbd, 0x63, 0x38, 0x0f, 0xc5, 0x5f, 0x89, 0x0a, 0x40, 0xa7, 0x38, 0x3c, 0x95, 0x5a, 0x33, 0xa3, 0x12, 0x19, 0x73, 0x72, 0x1b, 0x58, 0x0b, 0x65, 0xd7, 0x11, 0x9c, 0x6e, 0x44, 0xff, 0x6f, 0x31, 0x64, 0x50, 0x57, 0xe1, 0x88, 0xad, 0x11, 0xa8, 0xd8, 0x71, 0x67, 0x52, 0xa1, 0xcb, 0x49, 0x88, 0x05, 0x3f, 0x6e, 0xb1, 0x50, 0x33, 0xd0, 0x28, 0x08, 0x2f, 0x5a, 0xd4, 0x6b, 0xcb, 0xc0, 0x08, 0xfd, 0xbc, 0xc2, 0x49, 0xe7, 0x29, 0x15, 0x4f, 0x01, 0x82, 0x0c, 0x75, 0xd8, 0xc1, 0xc5, 0xa4, 0x98, 0x78, 0x61, 0x3f, 0xf5, 0x72, 0x78, 0x7c, 0x15, 0xb6, 0xe9, 0x58, 0x90, 0x1c, 0x0c, 0xa8, 0x63, 0xe3, 0x37, 0x15, 0xc3, 0xfe, 0xa9, 0xe0, 0x22, 0x0f, 0x35, 0x28, 0xd9, 0x6c, 0x33, 0x92, 0x3a, 0x3c, 0xd2, 0x26, 0x52, 0x7f, 0xa8, 0x0b, 0xde, 0x77, 0x93, 0x03, 0xc2, 0x1c, 0x19, 0xa7, 0x99, 0x6f, 0x98, 0xa2, 0x12, 0x5b, 0xa2, 0xce, 0xcc, 0x7b, 0x87, 0x30, 0x13, 0x04, 0x9e, 0x6b, 0xc1, 0xf5, 0x4d, 0x4d, 0xb1, 0xcb, 0xf2, 0x7e, 0xce, 0x90, 0x14, 0x7f, 0xd4, 0xca, 0x52, 0xb0, 0xf9, 0xd6, 0xeb, 0x16, 0x3f, 0x4a, 0x55, 0x43, 0xdf, 0x09, 0xa8, 0xfa, 0x8e, 0x7c, 0xed, 0x61, 0x62, 0xc3, 0x89, 0x96, 0xc3, 0x67, 0xef, 0x8d, 0xf4, 0x34, 0xde, 0x87, 0x20, 0x8e, 0x70, 0x93, 0x0e, 0xf8, 0x34, 0xc0, 0x99, 0xb5, 0x8c, 0xa9, 0xe8, 0x40, 0x99, 0x03, 0xb9, 0xe1, 0x00, 0x10, 0x3e, 0xd0, 0x1c, 0x7e, 0xd5, 0xa0, 0x71, 0x10, 0xef, 0xf3, 0xc2, 0x54, 0x14, 0x57, 0x22, 0xf5, 0x5b, 0xc8, 0x6c, 0x60, 0xbd, 0xe9, 0x20, 0x7b, 0x67, 0xbe, 0x3b, 0xfe, 0xa4, 0xcf, 0x32, 0x1c, 0x45, 0xa7, 0xd8, 0x20, 0x22, 0xf7, 0xac, 0x16, 0x00, 0xb1, 0x5a, 0xcc, 0x41, 0x6d, 0x76, 0x6b, 0x85, 0xc7, 0x22, 0x29, 0x21, 0x78, 0x21, 0xf0, 0x5c, 0xa0, 0xfb, 0x52, 0x50, 0x40, 0xbb, 0x7a, 0x9e, 0x65, 0x08, 0xd8, 0x84, 0xa5, 0xed, 0x22, 0x87, 0x65, 0x88, 0x07, 0x6b, 0x19, 0x3d, 0x43, 0xc9, 0x81, 0xa6, 0x9a, 0xd9, 0x45, 0xb7, 0x1d, 0xf5, 0x18, 0x35, 0x5c, 0x0e, 0xbc, 0x69, 0x0d, 0x5a, 0x63, 0x6a, 0x88, 0x24, 0xb2, 0x83, 0x1f, 0x7c, 0xb4, 0x4d, 0xc9, 0xd9, 0x52, 0x98, 0xbf, 0x64, 0x2d, 0x6c, 0xe9, 0x03, 0x39, 0xb9, 0x26, 0x2f, 0x61, 0x62, 0xed, 0x21, 0xf5, 0x8d, 0xce, 0x86, 0xa5, 0x68, 0xe3, 0x79, 0x4c, 0x8e, 0x2e, 0xb7, 0xee, 0x47, 0xe6, 0xb5, 0x3f, 0xff, 0x51, 0x0f, 0x93, 0x10, 0xd9, 0x0d, 0xd8, 0x16, 0x01, 0xb1, 0x65, 0x6a, 0x3f, 0x63, 0x7a, 0x43, 0x4b, 0x8e, 0x1b, 0x3a, 0xee, 0x99, 0x1f, 0x76, 0xe1, 0xf6, 0x05, 0xff, 0x29, 0xf0, 0x94, 0x0b, 0x77, 0xc6, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xbd, 0x06, 0xe6, 0x81, 0xc1, 0x58, 0x2a, 0xb0, 0xc3, 0x77, 0x15, 0xd0, 0x4c, 0xad, 0x77, 0xba, 0x27, 0x93, 0x3f, 0x6d, 0x5e, 0x55, 0x75, 0x54, 0x80, 0x0d, 0x1b, 0xba, 0x36, 0x05, 0xea, 0xe2, 0xca, 0xcb, 0xc8, 0xfd, 0xae, 0x63, 0x21, 0xc6, 0xc9, 0x82, 0x33, 0x86, 0xd2, 0x0e, 0x59, 0xa4, 0xf9, 0xc6, 0x89, 0xfa, 0xd2, 0x68, 0x50, 0x72, 0xee, 0x6e, 0xc5, 0xdb, 0x28, 0xf9, 0x98, 0x8d, 0xdd, 0x19, 0x58, 0x92, 0xa2, 0x82, 0x6a, 0xcd, 0x22, 0x7f, 0xc8, 0x39, 0x19, 0x43, 0x3c, 0x65, 0x09, 0xe8, 0x61, 0x95, 0xc8, 0x66, 0x33, 0x0b, 0xf7, 0x1e, 0x92, 0x43, 0xee, 0x1a, 0x30, 0x00, 0x00, 0x00, 0xf0, 0x5d, 0xfc, 0x8d, 0xcc, 0x31, 0x59, 0x61, 0x35, 0xf5, 0xd4, 0xcb, 0x69, 0xca, 0x76, 0x4f, 0x43, 0x12, 0xb0, 0xf5, 0x3c, 0xd7, 0x74, 0x3f, 0xef, 0x25, 0xd5, 0x66, 0xa2, 0xd5, 0x87, 0x45, 0x2f, 0x90, 0x3b, 0x55, 0x86, 0x64, 0xc3, 0x57, 0xba, 0x23, 0xaf, 0x96, 0x69, 0xa8, 0x66, 0xf2, 0x35, 0x58, 0xbd, 0xe5, 0x3a, 0xef, 0x07, 0x20, 0x06, 0xf1, 0x83, 0xc9, 0xdc, 0x34, 0xb0, 0xd6, 0x6c, 0x23, 0x1f, 0xb2, 0x5b, 0x49, 0xa7, 0xdf, 0x85, 0x3b, 0x04, 0x27, 0x61, 0x8d, 0x83, 0xa6, 0xce, 0x31, 0xd4, 0x08, 0x40, 0xaf, 0x7c, 0x0b, 0xcf, 0x9b, 0xfc, 0xe7, 0x54, 0x6d, 0x7a, 0x17, 0x04, 0xe8, 0xcb, 0xd7, 0x14, 0x45, 0x31, 0xcd, 0x79, 0xd5, 0x68, 0x33, 0xdf, 0x6a, 0x15, 0x1d, 0x8d, 0x0f, 0xb6, 0x9e, 0xf2, 0xde, 0x8a, 0x16, 0x4c, 0x79, 0xd1, 0x03, 0x74, 0xb6, 0x09, 0xf0, 0x1e, 0x22, 0xd6, 0x62, 0x79, 0x58, 0x35, 0x60, 0xfc, 0x2f, 0xec, 0xb8, 0xf4, 0xf2, 0x30, 0x87, 0x6f, 0xc6, 0x53, 0x21, 0xf1, 0x8f, 0x27, 0x57, 0x93, 0xe2, 0xb0, 0x89, 0x95, 0x26, 0xd3, 0x03, 0xfe, 0xfa, 0x81, 0x0e, 0x78, 0xeb, 0x96, 0xca, 0x6e, 0x02, 0x31, 0x07, 0xcb, 0x1c, 0x7e, 0x82, 0xe2, 0xbb, 0x89, 0xce, 0xaa, 0xf3, 0xfd, 0x7d, 0x19, 0x7c, 0x6c, 0x21, 0xb6, 0x6c, 0xba, 0xa0, 0xf7, 0x7e, 0xb0, 0xb3, 0x87, 0xfd, 0xe9, 0x69, 0x59, 0x8a, 0xdf, 0x50, 0x0e, 0x38, 0x28, 0x46, 0x21, 0x7f, 0x98, 0x3e, 0x94, 0x63, 0x24, 0xcb, 0xbb, 0xad, 0x62, 0xaa, 0x24, 0x4b, 0x62, 0x7d, 0xa7, 0x3a, 0x1b, 0xfe, 0xa4, 0xa4, 0xbb, 0x0a, 0x88, 0x7d, 0x7d, 0x49, 0xe0, 0x3f, 0xce, 0x91, 0xf0, 0x73, 0xc0, 0x56, 0x31, 0xee, 0x6c, 0xec, 0x66, 0x2e, 0x27, 0xa3, 0x32, 0xc8, 0xbb, 0xd9, 0x19, 0x66, 0x48, 0x32, 0x66, 0xd3, 0x33, 0xc1, 0x59, 0xf1, 0xeb, 0xab, 0x73, 0x42, 0x81, 0xb5, 0x57, 0x48, 0x93, 0xda, 0x74, 0x58, 0x4a, 0x39, 0xbd, 0x98, 0x4a, 0x88, 0xf8, 0xdc, 0x87, 0x9d, 0xa2, 0xb0, 0xde, 0xc7, 0x36, 0xbb, 0xb0, 0x8d, 0x37, 0xe0, 0x84, 0x34, 0x28, 0xca, 0x35, 0xc9, 0xeb, 0x00, 0x3f, 0xd1, 0x1f, 0x84, 0x7e, 0xf3, 0x58, 0x5f, 0x7c, 0x6d, 0x66, 0x7d, 0xdc, 0x8e, 0x9c, 0xa8, 0xed, 0x1f, 0x81, 0x62, 0x0f, 0x92, 0xae, 0x75, 0x60, 0x6b, 0x75, 0x5c, 0x48, 0x19, 0x90, 0xea, 0x45, 0x63, 0x5a, 0x2f, 0x79, 0x78, 0x06, 0x20, 0x8f, 0xc4, 0xc2, 0x29, 0xa6, 0x03, 0xc9, 0xd9, 0x05, 0x06, 0xbe, 0xf4, 0x98, 0x28, 0x48, 0x8f, 0xa6, 0xb9, 0xee, 0xd1, 0x6d, 0x41, 0x3e, 0x35, 0x63, 0x87, 0x49, 0x5b, 0x35, 0x51, 0x27, 0x3e, 0x1d, 0x8c, 0x5b, 0x25, 0xeb, 0x98, 0x47, 0x0f, 0x5b, 0xed, 0x76, 0x36, 0x5f, 0x03, 0xc8, 0xdd, 0x6f, 0x2f, 0x8c, 0x4f, 0xf4, 0xe7, 0xda, 0xaa, 0xbc, 0x47, 0xdc, 0x76, 0xca, 0xe0, 0x67, 0xcc, 0x3d, 0xb8, 0xcf, 0xe3, 0x0b, 0x81, 0x64, 0xbf, 0x89, 0x60, 0x54, 0x32, 0xcd, 0x90, 0x5c, 0xc9, 0x5d, 0xc0, 0xdb, 0xdf, 0x4d, 0x3f, 0xce, 0x96, 0x87, 0xe5, 0x29, 0x7d, 0xbd, 0xde, 0x9e, 0xda, 0xd3, 0xfa, 0x8c, 0xd1, 0xa0, 0x2b, 0x6b, 0x84, 0x66, 0xb8, 0x65, 0x31, 0xcf, 0x56, 0xaf, 0x79, 0x43, 0x48, 0x70, 0x5f, 0xaa, 0xb1, 0xd9, 0xe9, 0x40, 0xc0, 0xfd, 0xc6, 0xa2, 0xf5, 0xf5, 0x6f, 0x9d, 0xa6, 0x0a, 0x22, 0x84, 0xa8, 0x28, 0x59, 0xdf, 0x1d, 0xff, 0xbf, 0x05, 0xe9, 0x5f, 0x3f, 0x65, 0x31, 0x2c, 0x2a, 0x02, 0x14, 0x92, 0xcf, 0xab, 0x70, 0xc0, 0x5d, 0x60, 0xe3, 0x29, 0x34, 0x7a, 0x8a, 0x73, 0xdd, 0xa1, 0x85, 0x31, 0x49, 0x35, 0x90, 0xba, 0xf3, 0x2e, 0x0f, 0xf9, 0x1f, 0xbb, 0xa9, 0x75, 0x0c, 0xc8, 0xf4, 0xe9, 0x1f, 0x2e, 0x79, 0x7f, 0xc3, 0x84, 0x0e, 0x71, 0xb0, 0x82, 0x1b, 0x59, 0x75, 0xae, 0xe8, 0xe1, 0xf9, 0x86, 0x31, 0xa8, 0x6e, 0x05, 0xa8, 0x35, 0x76, 0x68, 0x22, 0x45, 0xd7, 0x55, 0x5b, 0x70, 0x36, 0xb2, 0x46, 0x36, 0x7d, 0xcc, 0x3b, 0xe7, 0x9e, 0x43, 0x2c, 0xd2, 0xb0, 0x2b, 0x3e, 0x17, 0xe6, 0xf7, 0xd9, 0xaf, 0x16, 0xba, 0x5c, 0x86, 0x20, 0x22, 0x1d, 0xee, 0xa1, 0x32, 0x7c, 0xc1, 0xa2, 0x9a, 0xc2, 0xde, 0xe1, 0xd9, 0x8d, 0x3d, 0x9a, 0xbe, 0xf4, 0x46, 0x83, 0x07, 0x91, 0x01, 0xa4, 0x89, 0xa3, 0x1e, 0x1f, 0x6e, 0xbe, 0x9c, 0x54, 0x41, 0x0a, 0x5a, 0x74, 0x1b, 0xfb, 0x0c, 0xd7, 0xb6, 0x43, 0x6d, 0x8b, 0x61, 0x5e, 0x86, 0x34, 0x87, 0xb1, 0x9e, 0xce, 0xa4, 0xa2, 0x06, 0x3f, 0x69, 0xfe, 0xfd, 0xb1, 0x20, 0xfe, 0x4b, 0x23, 0x8d, 0x99, 0x26, 0x14, 0xb8, 0x4c, 0x24, 0xcf, 0xd7, 0xf8, 0x10, 0x94, 0xb5, 0x29, 0xe6, 0x7b, 0xb6, 0xdf, 0xc1, 0xb6, 0x71, 0xd2, 0x55, 0x1e, 0x1c, 0x26, 0x3a, 0x63, 0x02, 0x20, 0x89, 0xf3, 0xd4, 0xe1, 0x89, 0xc5, 0x1c, 0xdc, 0x2f, 0xf2, 0x54, 0x10, 0xc7, 0xa2, 0x25, 0x49, 0x7d, 0x1f, 0x67, 0x21, 0x53, 0xc8, 0x30, 0xdc, 0xf2, 0x2d, 0x55, 0x5d, 0xf0, 0x8e, 0x56, 0x18, 0xc0, 0xf4, 0xd1, 0x17, 0xd2, 0x9e, 0x94, 0x71, 0x6b, 0x5e, 0xa4, 0xa4, 0xf7, 0xb6, 0xe1, 0x04, 0xf3, 0xfe, 0xcf, 0x39, 0xa1, 0x71, 0xe6, 0xb6, 0xa9, 0x54, 0x73, 0xb2, 0xf0, 0xfb, 0x4f, 0x08, 0x85, 0x99, 0xb7, 0x74, 0xe5, 0x5e, 0x0c, 0x41, 0xc3, 0x87, 0x3d, 0x33, 0x51, 0x51, 0x81, 0xe9, 0xce, 0x26, 0x4f, 0x9c, 0x0c, 0xc3, 0xc3, 0xef, 0xea, 0xd2, 0x45, 0x3c, 0xbf, 0xd1, 0x79, 0xb0, 0x7a, 0x95, 0x80, 0xae, 0x79, 0x56, 0xca, 0xe0, 0x1d, 0x02, 0xf9, 0xb3, 0xab, 0x37, 0x84, 0x52, 0x09, 0x1e, 0x7d, 0x3b, 0xf7, 0x89, 0x97, 0x4e, 0xc0, 0x7b, 0xb0, 0x75, 0xae, 0xef, 0x47, 0x9a, 0xbd, 0x21, 0x13, 0xfc, 0x12, 0x5f, 0x66, 0xd6, 0xad, 0xab, 0xe8, 0x38, 0xdf, 0x8b, 0xf3, 0xbe, 0xee, 0x53, 0xb0, 0x07, 0x89, 0xa6, 0xed, 0x18, 0x6d, 0x5d, 0xa8, 0x15, 0xfd, 0x8e, 0x8f, 0x28, 0x29, 0x89, 0xec, 0x99, 0xf6, 0x17, 0x39, 0xbe, 0xdb, 0x67, 0xb3, 0x4b, 0x87, 0x1a, 0x70, 0x5d, 0xf1, 0xdc, 0xae, 0x3f, 0x38, 0xaa, 0x44, 0xae, 0xcb, 0x6d, 0xdc, 0x13, 0x16, 0xbc, 0x84, 0x30, 0xb0, 0xeb, 0xe1, 0xa6, 0x74, 0x7d, 0x60, 0x55, 0x26, 0x29, 0x60, 0xce, 0xda, 0x4a, 0xb2, 0x82, 0xb0, 0x46, 0xd9, 0xae, 0xea, 0x7b, 0x30, 0x79, 0x29, 0xe3, 0x79, 0x08, 0x06, 0xbd, 0x2a, 0x20, 0x34, 0xba, 0xf4, 0xe7, 0x3e, 0x4c, 0x40, 0xb2, 0x6e, 0x49, 0xeb, 0x6e, 0x75, 0x03, 0xec, 0xe8, 0xb6, 0x1f, 0xd1, 0xd4, 0x4f, 0x07, 0x72, 0x05, 0x16, 0x8d, 0x3e, 0xc7, 0xa6, 0xe3, 0x88, 0x3b, 0xb4, 0xdf, 0xcb, 0x0d, 0x4e, 0xd2, 0xf4, 0xad, 0x31, 0x2d, 0xca, 0x33, 0x03, 0x8a, 0x2b, 0xc9, 0x2b, 0xdf, 0x3d, 0xe2, 0xf3, 0xfd, 0xfc, 0xe9, 0x09, 0x07, 0xbd, 0xee, 0x03, 0xf6, 0xbf, 0xbd, 0x93, 0x2b, 0x6a, 0x38, 0xa8, 0xc3, 0x20, 0x8e, 0x8f, 0x6b, 0xef, 0x29, 0x9b, 0x92, 0xee, 0x88, 0x99, 0x8c, 0xf2, 0x28, 0xba, 0xe4, 0x53, 0x4b, 0x2a, 0x5b, 0x3e, 0x0b, 0x96, 0x6c, 0xa7, 0x16, 0x86, 0x95, 0xf7, 0x0e, 0xed, 0xff, 0xc5, 0xe6, 0xbb, 0x6f, 0xa0, 0x95, 0xf7, 0xf4, 0xd1, 0xc6, 0xb6, 0xed, 0x0e, 0xc1, 0xbb, 0xf5, 0x2d, 0xcf, 0x04, 0x30, 0x19, 0xf9, 0x53, 0x38, 0x68, 0x5e, 0x07, 0xe1, 0xd3, 0x9b, 0xd0, 0x28, 0x41, 0xdb, 0x99, 0x74, 0x59, 0xc2, 0xc0, 0x92, 0xcb, 0xf1, 0xcc, 0xc3, 0xdd, 0x9c, 0x87, 0x20, 0x41, 0x8c, 0xcf, 0x2e, 0xfe, 0x95, 0x4b, 0xb1, 0x84, 0xbb, 0xed, 0x37, 0xa4, 0x51, 0xb3, 0xd9, 0xa5, 0x1f, 0xe8, 0xdc, 0x97, 0x7a, 0x8d, 0xa7, 0x86, 0xa4, 0x25, 0x05, 0xa4, 0x5e, 0x2a, 0xe7, 0x6a, 0xf2, 0x93, 0x97, 0xca, 0xb4, 0x72, 0xaf, 0xd4, 0x52, 0x66, 0x12, 0x90, 0x34, 0xa4, 0x20, 0x6f, 0x20, 0x56, 0x4c, 0xb2, 0x20, 0x39, 0x1c, 0x05, 0x30, 0x98, 0x76, 0x7a, 0x8d, 0x8f, 0x42, 0x48, 0x00, 0x81, 0xa7, 0xb7, 0x8c, 0xfd, 0xb1, 0xc1, 0xab, 0x47, 0x16, 0x37, 0x66, 0xbe, 0xf6, 0x02, 0x91, 0x4c, 0x75, 0x6a, 0x60, 0x2e, 0x5e, 0xfd, 0x5d, 0x00, 0x5a, 0x90, 0x37, 0x0f, 0xe2, 0x30, 0xf1, 0x61, 0xa2, 0xee, 0x35, 0x7a, 0x04, 0xcc, 0xae, 0x08, 0x11, 0xa5, 0xda, 0xee, 0x47, 0xff, 0x73, 0x6f, 0x7d, 0x4e, 0x2d, 0x6f, 0x57, 0x60, 0xd1, 0xf6, 0x53, 0xeb, 0xa7, 0x8b, 0x22, 0x41, 0x90, 0xc4, 0x9f, 0xd6, 0x0e, 0xa9, 0x24, 0x01, 0xdb, 0xe0, 0xbd, 0x9f, 0xe1, 0xf8, 0x5a, 0xf3, 0x84, 0xc0, 0xdf, 0xd9, 0xc8, 0x17, 0x43, 0x04, 0x3e, 0x2e, 0xf4, 0xba, 0x06, 0x76, 0xbe, 0x66, 0x48, 0x3f, 0xfe, 0x10, 0xf5, 0x0f, 0xbe, 0xad, 0x01, 0x4a, 0xb7, 0x43, 0xef, 0xf6, 0xb4, 0x1d, 0xed, 0x0a, 0x99, 0xd5, 0x4b, 0x97, 0xca, 0x69, 0xf3, 0xee, 0xaa, 0xff, 0x8e, 0x82, 0xb7, 0x89, 0x83, 0xfb, 0x2b, 0x39, 0xbb, 0x56, 0x15, 0xfc, 0x82, 0x32, 0x90, 0xcb, 0x88, 0x4c, 0x23, 0x4c, 0x3a, 0x87, 0x36, 0xe8, 0xf0, 0x79, 0x12, 0xf3, 0xb4, 0x35, 0x93, 0xaa, 0xac, 0xd1, 0x83, 0x19, 0x55, 0x0b, 0x9d, 0xaf, 0x50, 0x71, 0xb0, 0x48, 0x53, 0xa4, 0xb6, 0x4c, 0x58, 0x4a, 0x6a, 0xad, 0x0a, 0xa8, 0x8a, 0x33, 0x09, 0x09, 0x8e, 0xf0, 0x6f, 0x95, 0x83, 0xc2, 0xb1, 0x87, 0xd6, 0xa0, 0xf7, 0x9a, 0x0c, 0x68, 0x0a, 0x70, 0x36, 0xf2, 0x77, 0x8e, 0x06, 0x09, 0x1d, 0x44, 0x36, 0xaf, 0xb2, 0xb9, 0x05, 0x65, 0xf0, 0x7b, 0xb4, 0x30, 0x12, 0x14, 0xe9, 0x92, 0x69, 0x85, 0x11, 0xac, 0xd5, 0x50, 0xc4, 0x8e, 0x39, 0xf1, 0x38, 0x84, 0x55, 0x17, 0x88, 0xda, 0x52, 0x91, 0x80, 0xd5, 0xb8, 0x64, 0x23, 0x0e, 0x12, 0x4e, 0x59, 0xbb, 0x12, 0x90, 0xbd, 0xca, 0xd7, 0x93, 0xd1, 0x03, 0x73, 0xe5, 0x3f, 0x84, 0xb3, 0xc7, 0x51, 0x1b, 0x96, 0xcb, 0x87, 0x23, 0x01, 0x54, 0x20, 0x0b, 0xd5, 0x1e, 0xfc, 0x96, 0x36, 0xc4, 0x4e, 0x85, 0xbd, 0xb4, 0x8f, 0x07, 0x6c, 0x7e, 0x75, 0xb9, 0x54, 0x86, 0x0b, 0x07, 0x80, 0xe2, 0x5f, 0xe9, 0xfe, 0x5d, 0x71, 0xcd, 0xc2, 0x7b, 0xdd, 0x05, 0x73, 0xbf, 0x5b, 0x86, 0x2f, 0xe1, 0x0e, 0x12, 0x7d, 0x29, 0x4b, 0x2f, 0x30, 0xdd, 0xb0, 0xf9, 0xed, 0xfb, 0x97, 0x96, 0x9e, 0x7a, 0x1e, 0x73, 0x11, 0x9a, 0xa7, 0xe3, 0x33, 0xc4, 0x2e, 0xc7, 0x5f, 0x8a, 0x69, 0xe3, 0xfc, 0x85, 0xf0, 0x97, 0x45, 0xfd, 0x7f, 0x25, 0x1f, 0xa6, 0xd3, 0xf6, 0x12, 0x0d, 0x2e, 0xd1, 0x73, 0xdb, 0xc9, 0x48, 0x07, 0xa8, 0xbe, 0xfa, 0x5e, 0x95, 0x9c, 0xcf, 0x08, 0x28, 0xad, 0x16, 0x4c, 0x92, 0x58, 0xd0, 0x71, 0xa9, 0xb4, 0x84, 0x83, 0xa3, 0x3b, 0xa6, 0x2b, 0x2f, 0x08, 0x18, 0xe8, 0x5d, 0x7f, 0x21, 0xfd, 0x5d, 0x53, 0xe7, 0x2e, 0x6b, 0xed, 0x83, 0x2f, 0xab, 0x56, 0x88, 0xd5, 0x5c, 0x5d, 0xe3, 0x9f, 0xdd, 0xe2, 0x21, 0xd4, 0xda, 0x96, 0x7e, 0x56, 0x3d, 0xa3, 0xaf, 0x93, 0xb2, 0xbb, 0x9b, 0xb4, 0x2e, 0xe8, 0xe6, 0x73, 0x0b, 0x9b, 0xa8, 0xbe, 0x3b, 0x34, 0x7d, 0x2e, 0x20, 0x8b, 0x07, 0xfc, 0xfa, 0x5f, 0x78, 0x49, 0x66, 0xdc, 0xb6, 0x14, 0x25, 0xb2, 0x8e, 0x92, 0xb0, 0x9a, 0x40, 0xff, 0x1b, 0x66, 0xd2, 0xde, 0x32, 0x68, 0x79, 0xdf, 0x2f, 0x01, 0x57, 0x6e, 0x48, 0x6b, 0xc0, 0x3e, 0x49, 0x5f, 0x2e, 0xe3, 0x7f, 0xdc, 0xcf, 0x24, 0xcd, 0x7a, 0x01, 0x3d, 0x84, 0xf8, 0x5c, 0x70, 0x54, 0xfc, 0xe3, 0xdf, 0x4d, 0x56, 0x6a, 0xe3, 0xee, 0x20, 0xfa, 0x9b, 0xe2, 0x41, 0x62, 0x9c, 0x7d, 0x94, 0x03, 0xc7, 0x48, 0xf7, 0x02, 0x00, 0xa2, 0x78, 0xaa, 0x43, 0xa3, 0xdb, 0xf5, 0xf9, 0x13, 0x3b, 0x2b, 0x31, 0xbb, 0x65, 0xaf, 0xaf, 0x59, 0x09, 0x4e, 0x66, 0x43, 0x5d, 0xd6, 0xc5, 0xe4, 0x97, 0x89, 0x00, 0x10, 0xe4, 0x9d, 0x73, 0x0c, 0x9d, 0x23, 0x32, 0xf3, 0x0b, 0x77, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xbd, 0x06, 0xe6, 0x81, 0xc1, 0x58, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x8f, 0x30, 0xcd, 0xaf, 0x26, 0x40, 0x2c, 0xf9, 0x92, 0xb8, 0x31, 0x61, 0x6a, 0x06, 0x23, 0x24, 0xde, 0xf7, 0xf9, 0x2a, 0x7c, 0xa5, 0xc3, 0x99, 0x4d, 0x6f, 0x15, 0xcc, 0xdc, 0x17, 0xb3, 0x74, 0x5b, 0xd4, 0xa2, 0x68, 0xab, 0x5d, 0x2c, 0x2b, 0xc5, 0xc1, 0x3e, 0xc5, 0x6a, 0x17, 0xbd, 0xb0, 0x57, 0x61, 0x5a, 0x48, 0xe3, 0x48, 0x99, 0x93, 0xde, 0xb0, 0x5e, 0x70, 0x9f, 0xcd, 0xd0, 0xf2, 0x07, 0xd5, 0xed, 0xe9, 0x4c, 0x3a, 0x08, 0xe6, 0x8e, 0xec, 0x78, 0x30, 0x00, 0x00, 0x00, 0x81, 0x9f, 0x5d, 0x92, 0x15, 0xe7, 0x37, 0x10, 0x4c, 0x42, 0xec, 0x9a, 0x12, 0x0a, 0x79, 0x55, 0x54, 0x02, 0x01, 0xb1, 0xc1, 0x08, 0x02, 0x31, 0x10, 0xd0, 0x03, 0x32, 0xae, 0x6a, 0x84, 0x3f, 0xcf, 0x82, 0x53, 0x9d, 0xf0, 0x9a, 0xce, 0x68, 0x6f, 0x07, 0xeb, 0x47, 0x19, 0xa4, 0x62, 0x79, 0x4c, 0x83, 0xcd, 0xfa, 0x1c, 0x78, 0x4e, 0xad, 0x5a, 0x6e, 0xc9, 0x63, 0x1f, 0x6d, 0x56, 0x33, 0x11, 0xd3, 0xfb, 0x35, 0x29, 0xc1, 0x8e, 0x39, 0xf7, 0xaa, 0x54, 0x44, 0x05, 0x4e, 0x81, 0x96, 0x77, 0xc4, 0x22, 0xbd, 0x85, 0xaf, 0x4e, 0xf5, 0x1e, 0xfb, 0x09, 0x83, 0x8c, 0x8f, 0x1c, 0x51, 0x89, 0xc5, 0x9a, 0xaa, 0xa0, 0xc0, 0x81, 0xac, 0x35, 0xe0, 0x12, 0x88, 0xb0, 0xdd, 0x79, 0xa4, 0x13, 0x54, 0x83, 0xde, 0x57, 0x98, 0x0d, 0xcc, 0x4c, 0xf2, 0x14, 0x17, 0xcc, 0x5e, 0x31, 0x53, 0x7d, 0x01, 0xa1, 0x09, 0xe7, 0x0a, 0x73, 0xbc, 0x1f, 0xd8, 0x50, 0xfa, 0x4e, 0x9b, 0x3d, 0x46, 0x7a, 0x11, 0xf2, 0xfb, 0x16, 0xac, 0x4b, 0x61, 0x7a, 0xae, 0xbf, 0xd6, 0x32, 0x10, 0x66, 0xe6, 0xcb, 0xf5, 0x3b, 0x56, 0xa5, 0xed, 0xfa, 0x48, 0x48, 0xbf, 0x39, 0xf9, 0xba, 0xc3, 0x9b, 0xcb, 0xbf, 0x1d, 0x49, 0xd9, 0xb4, 0x5a, 0x70, 0xa0, 0x2c, 0x7b, 0x21, 0x8c, 0x84, 0xda, 0x44, 0x8a, 0xa8, 0x85, 0xdb, 0x06, 0x89, 0x43, 0xc1, 0x81, 0x2c, 0xd9, 0xad, 0xa6, 0xc3, 0xa1, 0x24, 0x90, 0x31, 0x15, 0xab, 0xc6, 0x58, 0xd9, 0x60, 0xac, 0xcf, 0x2e, 0x5a, 0xa1, 0x61, 0x14, 0x71, 0x72, 0xc0, 0x14, 0x0a, 0xb8, 0x9e, 0xc3, 0x93, 0xe2, 0xb2, 0x74, 0x54, 0x55, 0x72, 0x47, 0x21, 0xfb, 0xb5, 0x76, 0xde, 0x08, 0xfc, 0x57, 0xda, 0x3f, 0x56, 0x44, 0xbe, 0x69, 0x1d, 0x49, 0xad, 0xb9, 0xe0, 0x30, 0x68, 0xfd, 0xd4, 0xeb, 0xde, 0x96, 0x66, 0x13, 0xfa, 0x20, 0x7c, 0x82, 0xcb, 0xf6, 0x62, 0x70, 0xac, 0x62, 0x1a, 0xae, 0x1e, 0x50, 0xee, 0x78, 0x61, 0x79, 0x7f, 0xe7, 0xe2, 0xdd, 0x98, 0x56, 0x43, 0xfb, 0x1c, 0x37, 0x50, 0x31, 0xab, 0x0a, 0xd0, 0x99, 0x22, 0x5e, 0x85, 0xae, 0x64, 0xde, 0xdc, 0xb5, 0xae, 0x35, 0x20, 0x00, 0xfb, 0x0b, 0xb4, 0x81, 0xc4, 0xb7, 0x17, 0x04, 0xc0, 0x6e, 0xa0, 0x04, 0x74, 0x4f, 0xef, 0x9c, 0xa0, 0xb6, 0x77, 0xa7, 0x7d, 0x80, 0x0b, 0x46, 0x2b, 0xa9, 0x1f, 0x7c, 0xb1, 0xd6, 0x92, 0xc1, 0x53, 0x64, 0x7c, 0x7e, 0x44, 0xbb, 0x66, 0xee, 0xf0, 0x19, 0x1c, 0xc4, 0xff, 0xae, 0xde, 0x4f, 0xc7, 0x80, 0xe2, 0xb1, 0x54, 0x58, 0xf2, 0x7d, 0xe3, 0x0c, 0xd2, 0x8c, 0x38, 0x70, 0x2f, 0x88, 0xf5, 0x3e, 0x10, 0x91, 0xa5, 0x5b, 0x10, 0x6b, 0xad, 0xf1, 0x1b, 0x23, 0x36, 0xb9, 0x47, 0x57, 0xf7, 0x4c, 0x41, 0x14, 0xd4, 0x48, 0xb1, 0x2c, 0x6a, 0x6a, 0xcd, 0xc4, 0x90, 0x8c, 0x2e, 0xc5, 0xae, 0xaf, 0x5f, 0x96, 0xdd, 0x82, 0x07, 0x04, 0x47, 0x17, 0x98, 0x5c, 0xb1, 0x20, 0xcb, 0xae, 0xec, 0x57, 0x70, 0x9a, 0xbc, 0xd2, 0xd5, 0x42, 0x3a, 0x17, 0x05, 0xe8, 0xae, 0x98, 0x94, 0xe1, 0xc3, 0x70, 0xa0, 0x68, 0x1d, 0xf6, 0x3b, 0x08, 0xc7, 0xb3, 0xfc, 0xcb, 0x7e, 0xd2, 0xf6, 0xbc, 0x44, 0xe0, 0x05, 0x54, 0xfb, 0xd8, 0xfd, 0x25, 0x6d, 0xe6, 0x99, 0xca, 0x89, 0x58, 0x55, 0x53, 0xcb, 0x66, 0xc3, 0x70, 0x11, 0x09, 0xb6, 0xd7, 0x00, 0xb5, 0x74, 0xa7, 0x05, 0x74, 0xf0, 0xdc, 0x53, 0x17, 0x9b, 0x13, 0xe1, 0x25, 0xda, 0xc5, 0x16, 0x00, 0x9b, 0xc5, 0x06, 0x8b, 0xa2, 0x77, 0x22, 0x3d, 0xa4, 0x53, 0xff, 0x01, 0xfe, 0x6d, 0x61, 0x9b, 0x89, 0x5e, 0x26, 0xe0, 0xa7, 0xee, 0xb9, 0xbb, 0x4a, 0x29, 0x5b, 0x0e, 0xb9, 0x16, 0x94, 0xa8, 0x66, 0x80, 0xfd, 0xa1, 0x76, 0x02, 0x0b, 0x9c, 0x2f, 0x7e, 0x6a, 0x8b, 0xcb, 0xf3, 0x3b, 0xf8, 0x85, 0xc8, 0xef, 0x8b, 0xc2, 0xfd, 0xbd, 0xf0, 0x00, 0xd8, 0xe8, 0xed, 0xc7, 0xf5, 0x67, 0xa3, 0x64, 0xb5, 0x13, 0x87, 0xec, 0x11, 0x03, 0x47, 0xfb, 0x08, 0x99, 0x0b, 0x1f, 0x3e, 0x00, 0xb9, 0x9e, 0x41, 0x58, 0xd8, 0x0a, 0xa9, 0x20, 0x9a, 0xe8, 0xf2, 0x15, 0x39, 0xd1, 0xf9, 0xee, 0xe4, 0x8d, 0x18, 0xda, 0x27, 0x83, 0xe0, 0xea, 0xd0, 0xe2, 0x02, 0xda, 0xe3, 0xe2, 0xeb, 0x88, 0x87, 0xce, 0xc2, 0x85, 0x0f, 0xb5, 0x7b, 0x81, 0xba, 0x64, 0x26, 0x3a, 0xea, 0x57, 0x3e, 0xd5, 0xcc, 0xac, 0x5c, 0xf2, 0x36, 0x6c, 0x37, 0xcb, 0xe0, 0x5c, 0xec, 0xb1, 0x06, 0xe6, 0xfa, 0x0a, 0xe4, 0x43, 0x6c, 0xdf, 0xec, 0xe2, 0xfa, 0x6e, 0xd5, 0x13, 0xea, 0x6f, 0x14, 0x23, 0x2a, 0x0b, 0x56, 0x7c, 0x1e, 0xb8, 0x73, 0x18, 0xba, 0x47, 0x0c, 0x7f, 0xcd, 0xf1, 0x3d, 0xff, 0xb7, 0x96, 0x30, 0x12, 0x7a, 0xf0, 0x73, 0xa2, 0x52, 0xfc, 0x3b, 0xd1, 0x3b, 0xd2, 0xbf, 0x65, 0xfc, 0xc0, 0xdc, 0x51, 0x75, 0x69, 0xf9, 0xcf, 0x8b, 0x2f, 0xf3, 0x56, 0x1f, 0x18, 0x96, 0xdd, 0xa9, 0x36, 0x5e, 0x73, 0x3e, 0x52, 0xef, 0x58, 0x49, 0x65, 0x71, 0x88, 0xaf, 0xe9, 0x78, 0xc9, 0x45, 0xab, 0xb6, 0x50, 0xf2, 0xe9, 0xa5, 0x3e, 0xf1, 0xe6, 0x59, 0x0b, 0x4e, 0x7d, 0x76, 0x01, 0xfd, 0x0b, 0x20, 0x8f, 0xdc, 0x0d, 0xd5, 0xb6, 0xa8, 0xd1, 0xf7, 0x4d, 0xf8, 0x32, 0x5e, 0xcd, 0x9e, 0x52, 0x21, 0xc9, 0xa9, 0x70, 0x6f, 0x4e, 0x6d, 0x6b, 0x22, 0x36, 0x20, 0x8a, 0x5d, 0x46, 0x4b, 0x77, 0x36, 0x41, 0xe4, 0xc8, 0xed, 0x80, 0x93, 0x1f, 0x0f, 0xc1, 0x2e, 0x62, 0x80, 0x8e, 0x02, 0xf9, 0xa9, 0xaf, 0xf5, 0x0c, 0x78, 0xc5, 0x17, 0x87, 0xb0, 0x52, 0x0a, 0x9e, 0x58, 0x68, 0x22, 0x1f, 0x87, 0x78, 0xe1, 0x7b, 0x6c, 0x3e, 0x5c, 0x37, 0x28, 0x13, 0x5a, 0x74, 0x7e, 0x73, 0xf1, 0xf7, 0xc8, 0xf1, 0xb9, 0xa1, 0x75, 0x3b, 0x75, 0x81, 0xd2, 0xe3, 0x97, 0x0b, 0x86, 0x0f, 0x27, 0x9f, 0x62, 0x14, 0x6d, 0x84, 0x21, 0xf3, 0x2e, 0x52, 0x4d, 0x44, 0x6f, 0x98, 0x59, 0x14, 0xdc, 0x20, 0xb6, 0xe0, 0x70, 0xb2, 0xd5, 0x9a, 0xde, 0x24, 0xde, 0x90, 0x33, 0xba, 0x20, 0xc0, 0x85, 0x1e, 0x5d, 0x0e, 0xac, 0x14, 0x9e, 0xb9, 0x4d, 0x79, 0xb0, 0x08, 0x45, 0xdf, 0x33, 0x36, 0x38, 0x68, 0xb6, 0x99, 0xf5, 0x70, 0x9c, 0x14, 0xf0, 0x8e, 0xeb, 0x8f, 0xc9, 0xc7, 0x5c, 0x99, 0xd2, 0x9e, 0x16, 0x35, 0x00, 0x94, 0xf1, 0xb3, 0x62, 0x54, 0x1d, 0xbd, 0x2c, 0x21, 0x87, 0x4f, 0xe0, 0xa7, 0x22, 0x25, 0xf2, 0x43, 0x18, 0x0a, 0x5d, 0xf1, 0x4e, 0xf0, 0x48, 0x2d, 0x49, 0x2b, 0x02, 0x7c, 0xb4, 0x69, 0xb8, 0x2d, 0x6f, 0xa4, 0x67, 0x8a, 0x28, 0xc1, 0xaa, 0xe3, 0x8e, 0x41, 0x31, 0xd1, 0xbe, 0x81, 0xb5, 0x6f, 0xa2, 0xfd, 0x0c, 0xee, 0xea, 0x7a, 0x82, 0xd3, 0xb1, 0x4f, 0xc7, 0x35, 0x43, 0x22, 0x3d, 0xfa, 0xb8, 0x21, 0x2e, 0x43, 0xf9, 0x44, 0xcc, 0x7c, 0x3c, 0x01, 0xda, 0x0a, 0xd1, 0xcf, 0x9c, 0xba, 0x8b, 0x14, 0xac, 0x84, 0x98, 0xa6, 0x13, 0x0b, 0x54, 0xd3, 0xcd, 0x9e, 0x4b, 0x20, 0x19, 0x55, 0xae, 0xdc, 0x3b, 0xcd, 0x01, 0xda, 0xdd, 0xb7, 0x20, 0x39, 0x00, 0x16, 0x98, 0x4d, 0xee, 0x06, 0x0d, 0x1b, 0xf1, 0x4f, 0x1f, 0x97, 0x4d, 0x7f, 0x33, 0x05, 0xf6, 0x2b, 0x38, 0x50, 0xe9, 0xbc, 0xe6, 0xa1, 0xb7, 0x40, 0xcf, 0xed, 0x6e, 0x64, 0xce, 0xc7, 0xec, 0x12, 0x0d, 0x01, 0x3e, 0x56, 0x95, 0xd6, 0x32, 0x87, 0xd8, 0x82, 0x5b, 0x83, 0x58, 0xa8, 0xe1, 0xbd, 0x32, 0xea, 0x39, 0x69, 0x57, 0x34, 0x7a, 0x5a, 0xb3, 0xf7, 0x83, 0x39, 0xc7, 0x9a, 0xbc, 0x4c, 0x5d, 0xce, 0x93, 0xcf, 0x38, 0xf8, 0x03, 0x62, 0x78, 0xbf, 0x19, 0x8f, 0x8b, 0xdb, 0x35, 0x7b, 0xdf, 0x93, 0x1d, 0x49, 0x42, 0x6a, 0x6f, 0x87, 0xdf, 0xdf, 0xd3, 0x05, 0xe7, 0xbe, 0xec, 0x47, 0xc0, 0xb6, 0xa9, 0xa5, 0x40, 0x76, 0x53, 0x66, 0x8c, 0x54, 0x44, 0xc5, 0x09, 0xfa, 0x09, 0xa2, 0x4d, 0x78, 0x76, 0x96, 0x47, 0x4e, 0xbe, 0xda, 0xb3, 0xed, 0xc8, 0x7e, 0xb6, 0x69, 0x26, 0xed, 0x4e, 0x18, 0x4e, 0x9f, 0x02, 0x84, 0x6b, 0xb3, 0x73, 0x07, 0x16, 0x2e, 0x3d, 0xd5, 0xe8, 0x0e, 0xe2, 0x32, 0xa3, 0x20, 0x52, 0x26, 0x92, 0xa4, 0xcf, 0x47, 0xf9, 0xbc, 0x11, 0xc1, 0x1a, 0xa8, 0x6e, 0x0a, 0x7a, 0x44, 0x2f, 0xf7, 0xa4, 0xd4, 0x68, 0x24, 0x68, 0x1d, 0xc6, 0x18, 0x37, 0xb6, 0x3b, 0x2c, 0x55, 0x60, 0x6c, 0xd9, 0x29, 0x85, 0xbe, 0x72, 0xe8, 0xae, 0x74, 0xf1, 0xdb, 0x26, 0xc5, 0x27, 0xce, 0xad, 0x40, 0x76, 0x37, 0x70, 0x77, 0x17, 0x6c, 0xa0, 0x95, 0x99, 0x50, 0x25, 0xe1, 0xf7, 0x49, 0x6d, 0x41, 0x9f, 0x47, 0x1b, 0x9b, 0x87, 0x78, 0x2f, 0xc4, 0x69, 0xbb, 0x5f, 0xd0, 0x81, 0xac, 0x79, 0xe0, 0x43, 0xa3, 0x63, 0x9f, 0x74, 0x89, 0x7b, 0x7c, 0x9f, 0x75, 0xed, 0xa9, 0x0d, 0x4d, 0xb6, 0x7e, 0x03, 0x78, 0xa3, 0xa1, 0xe4, 0x63, 0x69, 0x54, 0x83, 0xe2, 0x2c, 0x60, 0xc9, 0xa9, 0x15, 0x90, 0xb4, 0xd6, 0x92, 0x6c, 0x1b, 0x09, 0x1e, 0x66, 0xae, 0xc7, 0xa4, 0x25, 0x25, 0x58, 0x1b, 0x49, 0xbb, 0xf3, 0x10, 0xcf, 0xf7, 0x88, 0x69, 0xc5, 0x5e, 0x78, 0x2e, 0xa6, 0x34, 0xce, 0x66, 0x61, 0xa3, 0x3e, 0xed, 0xea, 0xea, 0x1c, 0x35, 0xf8, 0xfa, 0xf1, 0xb7, 0x3c, 0xd5, 0x08, 0x63, 0x83, 0x54, 0x0c, 0x3b, 0x39, 0x30, 0x47, 0xce, 0x7d, 0x59, 0x5c, 0xf4, 0x98, 0xec, 0x0a, 0x2e, 0x78, 0xcb, 0x25, 0x77, 0x35, 0x97, 0x7a, 0x2b, 0x0a, 0x7b, 0x7d, 0x47, 0x3c, 0xf2, 0x7f, 0x3b, 0x6b, 0x20, 0x74, 0x7c, 0x8e, 0x1d, 0xad, 0x03, 0x57, 0x7f, 0x17, 0x14, 0x78, 0xb3, 0xfe, 0x1d, 0xc6, 0xcd, 0x0e, 0x8c, 0xc6, 0x4e, 0xe0, 0x80, 0x8f, 0x12, 0x88, 0x27, 0x79, 0x32, 0xd3, 0xcc, 0xa7, 0x42, 0x66, 0x7e, 0x30, 0x62, 0x6b, 0x64, 0xf8, 0x49, 0xf4, 0x0a, 0x04, 0x04, 0x2c, 0x70, 0xe7, 0x9b, 0xf0, 0xba, 0xb5, 0xd9, 0x8a, 0x54, 0x61, 0xfd, 0x38, 0x1f, 0x5a, 0x81, 0xc6, 0xca, 0x48, 0x3a, 0x32, 0x3a, 0xa4, 0xf1, 0xcd, 0x06, 0xde, 0x00, 0xa6, 0x69, 0x56, 0xeb, 0x36, 0x6a, 0x79, 0xad, 0x41, 0x59, 0x8f, 0xa2, 0x38, 0xd0, 0x2d, 0x36, 0x69, 0x3d, 0xb1, 0x1a, 0xb9, 0x78, 0x52, 0x49, 0xa0, 0x53, 0x15, 0xae, 0xb7, 0x98, 0xbe, 0x0c, 0xf5, 0x87, 0x3d, 0x2e, 0xfc, 0xf8, 0x76, 0xda, 0x20, 0xca, 0xfb, 0xbb, 0xf4, 0xc2, 0x7d, 0x40, 0xe6, 0x2e, 0x7c, 0x4e, 0x4f, 0xbd, 0x0e, 0xec, 0xe3, 0x3c, 0xf9, 0xc5, 0x20, 0xa0, 0x81, 0x05, 0xec, 0x6b, 0x53, 0xdc, 0x14, 0x58, 0xfb, 0xdc, 0x57, 0xdd, 0xca, 0x1d, 0x47, 0xa3, 0x7c, 0x55, 0x08, 0x2a, 0x67, 0xe2, 0xc9, 0xcb, 0x2b, 0x09, 0xd6, 0x9f, 0x20, 0x2e, 0xc6, 0xe6, 0x92, 0x23, 0x57, 0x37, 0x2b, 0x90, 0x1d, 0xa4, 0x99, 0x3c, 0x1c, 0x3c, 0x3a, 0xa7, 0x0e, 0x8d, 0x43, 0xba, 0x0b, 0xa8, 0x48, 0xfe, 0xed, 0xaf, 0x0c, 0xc9, 0x1c, 0x3a, 0xe6, 0xbe, 0x88, 0x33, 0x9f, 0x2e, 0x52, 0x0e, 0x5d, 0xa9, 0x56, 0xcc, 0xb1, 0xe9, 0x24, 0x57, 0xba, 0x84, 0x32, 0xbb, 0xbb, 0x70, 0xf3, 0x15, 0xc7, 0xb8, 0x9d, 0x65, 0xe4, 0x0e, 0x46, 0x0a, 0xcb, 0xe4, 0xc5, 0xe0, 0xd6, 0x97, 0x31, 0x61, 0xff, 0x7c, 0xd1, 0x58, 0xab, 0xf0, 0x49, 0x79, 0x6d, 0xce, 0x74, 0xdb, 0x1f, 0x61, 0xd6, 0xed, 0xb9, 0xa2, 0x3d, 0x45, 0x38, 0x2a, 0xa3, 0x01, 0xbd, 0x13, 0x9a, 0x89, 0x2d, 0xc0, 0xc6, 0x65, 0x7c, 0xa8, 0x78, 0x21, 0xf9, 0x14, 0xd6, 0xcf, 0x2e, 0xfb, 0xbb, 0x32, 0x8c, 0x54, 0x3a, 0xd2, 0x59, 0xef, 0xfa, 0x86, 0x8b, 0xa9, 0xf5, 0xca, 0x21, 0x43, 0x64, 0x04, 0x1f, 0xe6, 0x34, 0x86, 0x0a, 0x78, 0x7e, 0x5b, 0x77, 0xe2, 0x33, 0x4c, 0x03, 0x28, 0x4a, 0x43, 0x43, 0xed, 0xab, 0x5d, 0x71, 0x27, 0x89, 0x1e, 0x60, 0x0b, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xbd, 0x06, 0xe6, 0x81, 0xc1, 0x54, 0x6f, 0xac, 0xd2, 0xf5, 0x33, 0x2c, 0xba, 0x45, 0x07, 0x6c, 0x61, 0x0b, 0x2e, 0x28, 0x8f, 0x00, 0x2e, 0x36, 0x6f, 0xb2, 0x4f, 0x99, 0x02, 0xde, 0x8a, 0xe7, 0xa3, 0xf3, 0x49, 0xc1, 0x44, 0xab, 0x21, 0x21, 0x35, 0x07, 0x00, 0x05, 0x27, 0x1f, 0xe9, 0x04, 0xfe, 0xe7, 0xbb, 0x2e, 0x02, 0xfa, 0xc3, 0xd2, 0xb1, 0x9f, 0x33, 0x25, 0x56, 0xe2, 0x92, 0x48, 0x31, 0xaf, 0xf7, 0xbc, 0x67, 0x59, 0x3b, 0x2d, 0xb6, 0x46, 0x08, 0xd5, 0x59, 0xc2, 0x98, 0x68, 0xe2, 0xa6, 0xb9, 0x9a, 0x92, 0x53, 0xbc, 0xa8, 0xff, 0x6b, 0x30, 0x00, 0x00, 0x00, 0x77, 0xe3, 0xef, 0x5d, 0x5d, 0x23, 0xc7, 0x48, 0x6b, 0xe5, 0x94, 0xbe, 0x8f, 0x9b, 0xa7, 0x8b, 0xf2, 0xc3, 0x8e, 0x70, 0xde, 0xd2, 0xfb, 0x50, 0x7a, 0x12, 0x4a, 0x40, 0xcc, 0x9b, 0x51, 0x91, 0xef, 0x1c, 0xdc, 0x5a, 0x60, 0xf0, 0xfa, 0xab, 0xac, 0xaf, 0xfb, 0x9a, 0x29, 0xce, 0xa3, 0x6f, 0x23, 0x35, 0x9d, 0x23, 0x51, 0xc2, 0x2f, 0xda, 0x93, 0x03, 0x76, 0x77, 0x28, 0xd7, 0x6f, 0x00, 0xca, 0x1c, 0xf2, 0x59, 0x0a, 0xab, 0x03, 0xe3, 0x3f, 0xac, 0xbf, 0x3c, 0x75, 0x52, 0x00, 0xd0, 0xc4, 0x1f, 0x60, 0xc2, 0x01, 0x52, 0xed, 0xa3, 0x34, 0x87, 0x2e, 0xc1, 0xd5, 0x82, 0xe0, 0xb4, 0x2c, 0xa9, 0x27, 0xab, 0x7f, 0x46, 0x66, 0x21, 0xb9, 0x84, 0x85, 0x0a, 0xfe, 0x7a, 0x71, 0xe8, 0x1c, 0xa1, 0x3f, 0xae, 0xfe, 0x00, 0xf1, 0x09, 0x0b, 0xf0, 0x20, 0x8d, 0xcb, 0x0b, 0x96, 0x91, 0xbd, 0x27, 0xee, 0x7a, 0xee, 0xde, 0x42, 0x5c, 0x69, 0x4b, 0x07, 0xb3, 0xd1, 0xef, 0xec, 0xd6, 0x91, 0x0f, 0x22, 0x70, 0x81, 0x63, 0xd6, 0xfd, 0x7e, 0x29, 0xc6, 0xbe, 0xfe, 0x1a, 0x18, 0xe8, 0x14, 0x91, 0xc5, 0xee, 0x81, 0x63, 0xd8, 0xa9, 0x0a, 0x49, 0xb7, 0x1d, 0x8f, 0x8b, 0x5c, 0xb5, 0xce, 0x46, 0x92, 0x4c, 0xa5, 0xff, 0xc9, 0x54, 0x09, 0xa1, 0xf9, 0x73, 0x23, 0xbc, 0x16, 0x9d, 0xac, 0x28, 0xa5, 0x85, 0x68, 0xea, 0x09, 0xd5, 0x0d, 0xde, 0x11, 0xde, 0xf9, 0x9b, 0x0a, 0x30, 0xf0, 0x60, 0xa3, 0xb1, 0x96, 0x6c, 0x6d, 0x97, 0xa7, 0x0a, 0xb9, 0x3a, 0xba, 0xa1, 0xc6, 0xfa, 0x63, 0xc3, 0x01, 0x2d, 0x2e, 0xd5, 0xc5, 0x29, 0xfb, 0x12, 0x8a, 0x88, 0x5a, 0x92, 0x13, 0xc0, 0x9c, 0xc9, 0xe8, 0xa2, 0x93, 0xac, 0x1d, 0xdd, 0xa6, 0xda, 0xd0, 0xa0, 0xb6, 0xb2, 0xd1, 0xb8, 0xa7, 0x1a, 0x1f, 0x21, 0xef, 0x07, 0xd0, 0xae, 0xeb, 0x54, 0x12, 0x94, 0x80, 0x25, 0x3b, 0x0f, 0xaf, 0x4b, 0x0d, 0x8a, 0xa3, 0x8d, 0xf7, 0x4b, 0x3d, 0x37, 0x8b, 0xcf, 0xf0, 0x6b, 0x84, 0x30, 0x5d, 0x20, 0xd8, 0x9a, 0xf6, 0x73, 0xb6, 0xd3, 0xc4, 0x2a, 0xc2, 0xe9, 0xc0, 0x01, 0xa6, 0x9c, 0xc8, 0x56, 0xa0, 0x0e, 0xc0, 0x1f, 0x29, 0xb2, 0xcb, 0x8c, 0x49, 0xb9, 0xf9, 0xe0, 0x85, 0x47, 0x05, 0x7d, 0xb4, 0xe9, 0xdb, 0x92, 0xbd, 0x24, 0xd5, 0xda, 0x30, 0x4e, 0xd2, 0x75, 0x55, 0x42, 0x62, 0x6a, 0x74, 0xa9, 0xb8, 0xe8, 0xd0, 0xfd, 0x88, 0xa9, 0xde, 0x84, 0x89, 0x3d, 0x9e, 0x5b, 0xc8, 0x08, 0x3c, 0x8e, 0x96, 0x47, 0x4c, 0x2d, 0x91, 0x28, 0x5c, 0xee, 0xf9, 0x74, 0xb4, 0x74, 0xc3, 0xe5, 0xb8, 0xda, 0x35, 0xf9, 0x9c, 0x83, 0x0a, 0x21, 0x70, 0xff, 0xcb, 0x95, 0x0c, 0x5a, 0xfa, 0x96, 0x01, 0x0a, 0x2c, 0x7b, 0x7d, 0x3c, 0x0e, 0xcf, 0x78, 0x81, 0x83, 0x64, 0x8c, 0x55, 0x64, 0xe2, 0xdb, 0x6e, 0x4b, 0xdd, 0xd8, 0x49, 0x23, 0x89, 0x34, 0x97, 0x86, 0x87, 0xe7, 0x36, 0x31, 0x9a, 0xb9, 0xdc, 0x60, 0x80, 0xb2, 0xea, 0x55, 0xbc, 0x82, 0x31, 0xc7, 0xb2, 0x35, 0x46, 0x2a, 0x7a, 0xe7, 0x7f, 0x94, 0xfc, 0x18, 0xef, 0x90, 0x6b, 0xe1, 0x71, 0xf0, 0x79, 0xff, 0xf8, 0xcd, 0x05, 0x2b, 0x16, 0x00, 0x3e, 0x5a, 0x3c, 0x57, 0x7d, 0x67, 0x7c, 0x13, 0x02, 0x3d, 0xed, 0xc6, 0x05, 0x29, 0x90, 0x60, 0x1c, 0x46, 0x40, 0x6f, 0xf0, 0xaa, 0xb5, 0xde, 0x7c, 0x75, 0xeb, 0x51, 0x99, 0xa7, 0xbb, 0x40, 0x85, 0xd4, 0x13, 0x9c, 0x99, 0xb5, 0x03, 0xc6, 0xbc, 0x27, 0x04, 0x65, 0x49, 0xc7, 0x3b, 0xff, 0x21, 0xa0, 0x28, 0xb2, 0x06, 0x66, 0x29, 0xdf, 0x29, 0x00, 0x3c, 0x66, 0x30, 0x8b, 0x98, 0xe5, 0xea, 0x0d, 0xf9, 0xe3, 0xbb, 0x2c, 0x45, 0x06, 0x3b, 0xff, 0x78, 0xfb, 0xf8, 0x67, 0xca, 0xe4, 0x92, 0x29, 0xd7, 0xb2, 0x3c, 0x06, 0xf3, 0x16, 0x40, 0x35, 0x3b, 0xdd, 0xd2, 0xd2, 0xdb, 0xc0, 0x73, 0xd6, 0x3e, 0xd1, 0x0a, 0xb2, 0xa6, 0x82, 0x56, 0x75, 0xf2, 0xcf, 0xa4, 0x97, 0x21, 0xbf, 0xc2, 0xa6, 0x8c, 0xc6, 0xfb, 0x5b, 0xe2, 0xf4, 0xe0, 0x6f, 0x9c, 0x73, 0x36, 0x53, 0x05, 0x09, 0x59, 0x03, 0xba, 0x28, 0xca, 0xe2, 0x68, 0xd6, 0xee, 0x38, 0x14, 0x7a, 0x74, 0xe9, 0xe4, 0x13, 0xcb, 0x82, 0xde, 0x11, 0x1a, 0x97, 0x75, 0x6a, 0xc4, 0xa6, 0x55, 0x27, 0x11, 0xc1, 0x67, 0xfb, 0xe9, 0xbf, 0x0e, 0x45, 0x02, 0x0c, 0xbf, 0xce, 0x7e, 0xde, 0xdc, 0xf7, 0x18, 0xf5, 0xff, 0x8e, 0xc7, 0xf4, 0xd5, 0xe9, 0xa4, 0x37, 0x05, 0xc8, 0x68, 0xfc, 0xc3, 0x81, 0x62, 0x15, 0x97, 0x22, 0xa6, 0x61, 0x7d, 0x58, 0x8d, 0x21, 0xc8, 0x4e, 0x0f, 0x30, 0x20, 0x4f, 0x5a, 0x8c, 0x37, 0x81, 0x8d, 0x60, 0xcb, 0xd5, 0x7d, 0x89, 0x14, 0x16, 0xc2, 0x0e, 0x7f, 0x48, 0xe3, 0x26, 0x77, 0x75, 0xc2, 0x27, 0xa6, 0xa6, 0x43, 0xeb, 0xcf, 0x37, 0xc2, 0xfa, 0x10, 0x23, 0xa9, 0xdc, 0xe1, 0x94, 0xb8, 0xf9, 0xc9, 0xd8, 0xff, 0xc8, 0xd5, 0xc5, 0xd9, 0xdf, 0xb5, 0x9e, 0x60, 0x64, 0xe1, 0x6a, 0x62, 0x1a, 0xf5, 0xcb, 0x05, 0x88, 0x15, 0xd4, 0x94, 0xc5, 0x3f, 0xdc, 0x26, 0x89, 0x7f, 0x7d, 0x63, 0x34, 0x53, 0x81, 0x8e, 0xb9, 0x4b, 0xd9, 0x5c, 0x06, 0xf6, 0x95, 0xe3, 0x4a, 0xac, 0x67, 0xed, 0x2c, 0x8d, 0x1f, 0x53, 0xf0, 0xd4, 0x10, 0x34, 0xcd, 0x50, 0x3f, 0x1b, 0x1f, 0xbe, 0x9c, 0x68, 0x16, 0x9d, 0x02, 0x66, 0xc8, 0x92, 0x5c, 0x2e, 0x22, 0xe4, 0x25, 0xa1, 0x78, 0x93, 0xfb, 0xbe, 0x4b, 0x1f, 0x50, 0x7c, 0x10, 0x99, 0xda, 0x35, 0x16, 0xb8, 0x35, 0x38, 0x79, 0x5d, 0xcd, 0xa2, 0x1c, 0x5a, 0xa4, 0x9b, 0x26, 0x56, 0x37, 0x2f, 0xa3, 0x63, 0x7e, 0x8f, 0xf7, 0x89, 0xbd, 0x62, 0x30, 0xec, 0x49, 0x5b, 0xc9, 0x13, 0x75, 0x96, 0x6e, 0x2d, 0x92, 0x32, 0x27, 0x67, 0x31, 0x4d, 0xf9, 0xf3, 0x2e, 0xc7, 0xbe, 0x01, 0x69, 0xac, 0x5a, 0x20, 0xf3, 0xfd, 0xa0, 0xf1, 0x44, 0xba, 0x45, 0x89, 0x71, 0x2a, 0xca, 0x82, 0xfa, 0x28, 0x22, 0xd9, 0x4b, 0xc4, 0x00, 0xb7, 0xa1, 0x4d, 0xd1, 0xe8, 0xa3, 0xc7, 0xd5, 0x25, 0xf5, 0xcb, 0x0e, 0xa6, 0x3e, 0xa3, 0x7a, 0x10, 0x99, 0xad, 0xc0, 0x84, 0x4d, 0x43, 0x7d, 0x04, 0x9e, 0xea, 0xf1, 0xbe, 0xa7, 0xb0, 0xf0, 0x44, 0xfa, 0x0a, 0x2f, 0xed, 0x27, 0xf6, 0x9e, 0x96, 0x0a, 0x89, 0x10, 0x07, 0x6f, 0x19, 0x3b, 0x21, 0x0e, 0xac, 0x89, 0xa1, 0xb7, 0xeb, 0x25, 0x21, 0xea, 0x4c, 0x53, 0xcc, 0x4b, 0xfc, 0xc0, 0xb9, 0x86, 0x65, 0x98, 0x92, 0xbe, 0x64, 0x26, 0x12, 0xac, 0x80, 0x74, 0x90, 0x15, 0x47, 0x67, 0x3d, 0x69, 0x56, 0x98, 0x6c, 0xaf, 0x4d, 0x04, 0x4a, 0xac, 0xcb, 0xc8, 0xe2, 0xb1, 0x75, 0xf8, 0xcf, 0xf6, 0xa2, 0x3f, 0xa1, 0x6e, 0xfe, 0xd6, 0xf7, 0x03, 0x30, 0x1f, 0x0c, 0x59, 0x3a, 0xd0, 0x31, 0x75, 0xf2, 0xd2, 0x33, 0x94, 0xdc, 0xe1, 0xb4, 0xe2, 0xe8, 0xdf, 0xaf, 0x65, 0xa3, 0x92, 0x83, 0x56, 0x27, 0x71, 0x28, 0xf6, 0x38, 0x1d, 0x25, 0x60, 0xa7, 0x0f, 0x4b, 0xb8, 0x50, 0xe9, 0x67, 0xeb, 0x72, 0x5d, 0x31, 0xae, 0x5e, 0x40, 0x23, 0x38, 0xe1, 0x5f, 0x0f, 0x10, 0x27, 0xa6, 0x6d, 0x6f, 0x11, 0xf8, 0x62, 0xc3, 0x23, 0x4f, 0x19, 0x4a, 0x7d, 0x7f, 0xdb, 0x2a, 0x39, 0x34, 0x73, 0x65, 0x45, 0x0e, 0x0d, 0xee, 0x31, 0x55, 0x60, 0x64, 0x07, 0xb9, 0x59, 0x12, 0xa0, 0x27, 0xc1, 0xc7, 0xdf, 0x65, 0x31, 0x7f, 0x8e, 0x6f, 0x32, 0x7c, 0xcc, 0x6b, 0x1d, 0xfa, 0x42, 0x4b, 0x34, 0xec, 0xd3, 0x7e, 0x65, 0x68, 0x66, 0x64, 0x86, 0x47, 0x20, 0x69, 0x21, 0xfb, 0x82, 0x06, 0x75, 0x40, 0x37, 0x18, 0x6e, 0x30, 0x6c, 0xe6, 0x8d, 0xcb, 0x2f, 0x4d, 0xf7, 0xcb, 0xe4, 0x65, 0x06, 0x75, 0xe3, 0xd8, 0x9a, 0x47, 0x09, 0x5a, 0x50, 0x07, 0x1e, 0x2e, 0xe0, 0xda, 0x77, 0xe3, 0xbb, 0x52, 0x0d, 0xf5, 0x52, 0xc0, 0xd4, 0x33, 0xbf, 0xec, 0x6e, 0x41, 0x10, 0x4f, 0xda, 0x37, 0x53, 0xfa, 0x96, 0x4f, 0x39, 0xcf, 0x06, 0xf2, 0x92, 0x3a, 0xe5, 0x43, 0x7e, 0x5a, 0x3d, 0x8d, 0xcf, 0xb1, 0x6c, 0xc6, 0x09, 0xdd, 0xda, 0x64, 0x43, 0xd5, 0xbb, 0x46, 0x56, 0x59, 0x36, 0x3d, 0x70, 0xe4, 0xd1, 0xea, 0x48, 0xd4, 0x49, 0x49, 0xb5, 0x1a, 0xbc, 0x45, 0x16, 0x04, 0x78, 0xb6, 0xa1, 0x6e, 0xea, 0x53, 0x14, 0x1a, 0x77, 0xb9, 0x01, 0x98, 0xa3, 0x66, 0x19, 0x4d, 0x5d, 0x86, 0x24, 0x08, 0x3b, 0x21, 0xbb, 0x99, 0x96, 0x90, 0x9e, 0xe3, 0x2e, 0xcb, 0xb2, 0xc4, 0x38, 0x55, 0xb5, 0x4c, 0xe4, 0x5a, 0x52, 0xe2, 0xdf, 0xc2, 0xa1, 0xfc, 0xa4, 0xe7, 0x1f, 0x10, 0xc7, 0x20, 0xc4, 0xf3, 0x21, 0x41, 0xfd, 0x42, 0x34, 0x0d, 0xa2, 0x4c, 0x56, 0x7d, 0xd4, 0xc5, 0xc1, 0x7d, 0x97, 0x6a, 0xed, 0x8a, 0x10, 0xfc, 0xec, 0x21, 0xa6, 0xfb, 0x94, 0x16, 0x6b, 0xf9, 0xe4, 0xae, 0x85, 0xbd, 0x86, 0x08, 0x35, 0xbc, 0x7e, 0x52, 0x7a, 0xb5, 0x24, 0x70, 0x81, 0x29, 0xb2, 0x6e, 0x84, 0xbd, 0x53, 0xb1, 0x0b, 0x90, 0xf1, 0x6f, 0x87, 0xe8, 0x57, 0x2d, 0x5c, 0x57, 0x2a, 0x7a, 0x11, 0xc9, 0x39, 0x60, 0x3c, 0xda, 0x5f, 0xa5, 0x20, 0x85, 0xa7, 0x5d, 0x30, 0x56, 0x78, 0xfe, 0x2c, 0x6f, 0x92, 0x99, 0x32, 0x9d, 0x28, 0x26, 0xd5, 0x4a, 0x72, 0xb0, 0x86, 0x25, 0x43, 0x21, 0xc8, 0x7b, 0x93, 0x3e, 0xdb, 0x8a, 0x6b, 0xcd, 0x1d, 0x28, 0x99, 0x9f, 0x51, 0x4b, 0x1a, 0x49, 0x49, 0x93, 0x99, 0xa8, 0x4b, 0xfd, 0xe6, 0x42, 0xaa, 0x41, 0x66, 0xec, 0xf1, 0xf2, 0xae, 0x9d, 0x6f, 0x6f, 0x17, 0xf6, 0x6d, 0x74, 0x61, 0x81, 0xb9, 0x3e, 0x80, 0x17, 0xec, 0x08, 0xe8, 0x73, 0x63, 0x0b, 0x5e, 0x3e, 0x37, 0xfd, 0x1c, 0xd8, 0x5f, 0xf4, 0xfd, 0x65, 0x7b, 0x88, 0xe8, 0x45, 0xf6, 0x02, 0x29, 0x5c, 0xab, 0xbd, 0xed, 0x34, 0xff, 0x8b, 0xcb, 0x8c, 0xd6, 0x0c, 0x4c, 0xc4, 0xa7, 0xff, 0x44, 0xd2, 0xa9, 0xf1, 0x35, 0x55, 0x5f, 0x89, 0x08, 0xa5, 0x92, 0xd9, 0x69, 0xe0, 0x8e, 0x1b, 0xa3, 0xc4, 0xdb, 0x6e, 0x10, 0xfe, 0xb9, 0x2b, 0x89, 0xfa, 0x5d, 0xf0, 0x15, 0x4c, 0xa7, 0x5c, 0xa9, 0x0d, 0x23, 0x2f, 0xf0, 0xc1, 0x29, 0xf6, 0xd6, 0x7e, 0xce, 0xc1, 0x44, 0xd9, 0xdd, 0x13, 0x2f, 0x7a, 0x72, 0x17, 0xaf, 0x89, 0xd4, 0xee, 0x9d, 0x1b, 0xb6, 0xbf, 0xc1, 0x58, 0x98, 0x22, 0xc3, 0x24, 0x89, 0xf5, 0x48, 0xb1, 0xbb, 0x84, 0x1b, 0x67, 0x5e, 0x49, 0x0b, 0xd3, 0xee, 0xa4, 0xe6, 0x34, 0x45, 0xb7, 0xeb, 0x0b, 0xd4, 0x62, 0x2e, 0x4b, 0x4b, 0xe4, 0x41, 0xc2, 0xda, 0x41, 0x58, 0x56, 0x06, 0x83, 0xdc, 0xe1, 0xda, 0xff, 0x8f, 0x57, 0x83, 0xe6, 0xeb, 0x0d, 0xfd, 0x7a, 0x2f, 0x4b, 0x33, 0x48, 0x19, 0x5f, 0xa0, 0xe0, 0x8c, 0xae, 0x03, 0x92, 0xeb, 0xb9, 0xbd, 0xef, 0xdf, 0x6c, 0x66, 0x8e, 0x5e, 0xf0, 0xd7, 0x74, 0xaa, 0xf6, 0xe6, 0x56, 0x4e, 0x51, 0x0f, 0x23, 0x68, 0xb5, 0xcb, 0x6b, 0x41, 0x0d, 0x8a, 0x6c, 0x2b, 0x0f, 0x19, 0xaf, 0xf1, 0xe5, 0xc8, 0xad, 0x43, 0x2f, 0x94, 0x44, 0xa9, 0xcb, 0x54, 0x29, 0x79, 0xa1, 0xab, 0x76, 0xec, 0x29, 0x7c, 0xaf, 0xa0, 0x83, 0x9a, 0x89, 0x0d, 0x51, 0xed, 0x19, 0xec, 0x75, 0xea, 0x72, 0xa9, 0x7d, 0x67, 0x22, 0x7d, 0x65, 0x7d, 0xc4, 0xf6, 0xd5, 0xc9, 0x0a, 0x8b, 0xba, 0x16, 0x02, 0xb5, 0x98, 0x63, 0x4a, 0x36, 0xc2, 0xae, 0x68, 0xec, 0x60, 0x0b, 0xdc, 0x53, 0x8e, 0xfd, 0x3a, 0x9c, 0xf9, 0x4e, 0x8f, 0x70, 0xec, 0x69, 0x4f, 0x6e, 0x02, 0xf3, 0x5f, 0x23, 0xf8, 0xa4, 0x28, 0xdd, 0x42, 0xaf, 0xc9, 0xaa, 0xaf, 0x2f, 0x9c, 0x10, 0xa1, 0x78, 0x26, 0x76, 0x39, 0x6f, 0x4f, 0x32, 0x60, 0xf5, 0x88, 0xb6, 0xf4, 0x98, 0x01, 0x6e, 0x65, 0x92, 0xfd, 0x86, 0x98, 0xfe, 0x11, 0xaa, 0x0f, 0xb6, 0x4f, 0x36, 0xfb, 0x0b, 0x77, 0x58, 0xfa }; +constexpr AccessUnit AC3_MULTIPLE_PACK_EXPECTED_AU_1 = { 0x15f90, 0x159b2, false, 0, {}, { 0x79, 0x8a, 0x07, 0x46, 0x57, 0xa6, 0x1d, 0x59, 0x7a, 0xdd, 0x08, 0xfc, 0xd0, 0xe3, 0x3b, 0xef, 0xe7, 0x60, 0xa5, 0x91 } }; +constexpr AccessUnit AC3_MULTIPLE_PACK_EXPECTED_AU_2 = { 0x6c30bb8a, 0x132b3bdd, false, 0, {}, { 0x67, 0x41, 0xc8, 0x5f, 0xec, 0xad, 0xd9, 0x3d, 0xce, 0x0f, 0x03, 0x89, 0x70, 0x81, 0x04, 0x15, 0xa1, 0x4a, 0x0c, 0xf9 } }; +constexpr AccessUnit AC3_MULTIPLE_PACK_EXPECTED_AU_3 = { 0x15f90, 0x159b2, false, 0, {}, { 0x7c, 0x0e, 0xf4, 0xe5, 0x3e, 0x5d, 0x1f, 0xaa, 0x37, 0x09, 0x54, 0x74, 0x63, 0x57, 0xae, 0xc3, 0x72, 0x53, 0x53, 0xab } }; +constexpr AccessUnit AC3_MULTIPLE_PACK_EXPECTED_AU_4 = { std::numeric_limits::max(), std::numeric_limits::max(), false, 0, {}, { 0xa0, 0xcf, 0xde, 0x0c, 0x55, 0x6a, 0x70, 0x0b, 0x74, 0x55, 0x2b, 0x81, 0x2e, 0x70, 0xe7, 0x55, 0x67, 0xfa, 0x32, 0xa4 } }; + + +constexpr std::array AVC_TINY_PACKETS_STREAM = { 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xe9, 0xb2, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0xee, 0x01, 0xe0, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x37, 0x00, 0x80, 0xbe, 0x21, 0x00, 0x80, 0x0a, 0xd8, 0x00, 0x00, 0x0a, 0xb1, 0x00, 0x80, 0x09, 0xa5, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x80, 0x09, 0x53, 0x00, 0x00, 0x09, 0x6d, 0x00, 0x80, 0x08, 0xca, 0x00, 0x00, 0x09, 0x5b, 0x00, 0x80, 0x08, 0xa2, 0x00, 0x00, 0x08, 0xda, 0x00, 0x80, 0x08, 0x73, 0x00, 0x00, 0x09, 0x16, 0x00, 0x80, 0x08, 0x61, 0x00, 0x00, 0x08, 0x9f, 0x00, 0x80, 0x08, 0x10, 0x00, 0x00, 0x08, 0x82, 0x00, 0x80, 0x08, 0x56, 0x00, 0x00, 0x08, 0x61, 0x00, 0x80, 0x08, 0x20, 0x00, 0x00, 0x08, 0x67, 0x00, 0x80, 0x07, 0xcc, 0x00, 0x00, 0x08, 0x8f, 0x00, 0x80, 0x08, 0x25, 0x00, 0x00, 0x08, 0x53, 0x00, 0x80, 0x07, 0xa0, 0x00, 0x00, 0x08, 0x14, 0x00, 0x80, 0x07, 0xc9, 0x00, 0x00, 0x08, 0x17, 0x00, 0x80, 0x07, 0xc1, 0x00, 0x00, 0x08, 0x46, 0x00, 0x80, 0x07, 0xb0, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x80, 0x07, 0x91, 0x00, 0x00, 0x08, 0x5d, 0x00, 0x80, 0x07, 0x8f, 0x00, 0x00, 0x07, 0xdd, 0x00, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xe6, 0x00, 0x80, 0x07, 0x7f, 0x00, 0x00, 0x08, 0x1e, 0x00, 0x80, 0x07, 0x94, 0x00, 0x00, 0x07, 0xc5, 0x00, 0x80, 0x07, 0xab, 0x00, 0x00, 0x07, 0xec, 0x00, 0x80, 0x07, 0x74, 0x00, 0x00, 0x07, 0xb6, 0x00, 0x80, 0x07, 0x79, 0x00, 0x00, 0x07, 0xff, 0x00, 0x80, 0x07, 0x76, 0x00, 0x00, 0x07, 0xe2, 0x00, 0x80, 0x07, 0xd1, 0x00, 0x00, 0x07, 0xb3, 0x00, 0x00, 0x01, 0xe0, 0x06, 0xe6, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xb3, 0x65, 0x1e, 0x69, 0xb2, 0x75, 0x62, 0x06, 0xcf, 0xeb, 0x38, 0xf4, 0x91, 0x03, 0xac, 0x06, 0xee, 0xf5, 0x5a, 0x22, 0x5e, 0xb8, 0xd5, 0xf1, 0x50, 0x3f, 0x49, 0xd9, 0x47, 0x75, 0xc3, 0x8c, 0x6d, 0xac, 0x33, 0xc5, 0xc6, 0xc8, 0x25, 0x8f, 0x11, 0xd3, 0xf6, 0xf6, 0xdb, 0xad, 0xca, 0x5d, 0x4e, 0x0f, 0xb9, 0x1f, 0x1d, 0xe5, 0x5d, 0xb7, 0xd3, 0xfa, 0x76, 0xa6, 0x64, 0x99, 0xd0, 0x7b, 0x8e, 0xc2, 0x09, 0xf4, 0x2a, 0x11, 0x3c, 0x1b, 0xe4, 0xe5, 0xee, 0xe4, 0x36, 0x2f, 0x63, 0xa5, 0x8e, 0x5e, 0x32, 0x59, 0x17, 0xcd, 0x22, 0xb5, 0xf0, 0xea, 0xe3, 0xef, 0x22, 0x1e, 0x67, 0x46, 0xeb, 0x93, 0x3f, 0x90, 0x49, 0x38, 0x0c, 0xa0, 0xe5, 0x1c, 0x11, 0x94, 0xec, 0x8f, 0xc0, 0x4f, 0x87, 0xaf, 0xcb, 0x41, 0xa8, 0x17, 0xa7, 0x2e, 0xdb, 0x53, 0xaf, 0x6c, 0x07, 0x54, 0x78, 0xba, 0x15, 0xf0, 0xdc, 0xd7, 0x18, 0x9d, 0x9e, 0x6d, 0x3b, 0x0b, 0xac, 0xfb, 0x58, 0x04, 0x1c, 0x96, 0x36, 0xe8, 0x40, 0xf2, 0x76, 0xb8, 0x71, 0x30, 0x6c, 0x66, 0x24, 0x50, 0xa4, 0x58, 0x7b, 0x45, 0xaa, 0x5e, 0x04, 0x1d, 0x17, 0xf8, 0x5b, 0x68, 0x51, 0xf0, 0xb1, 0x06, 0xe5, 0x47, 0xb0, 0xb0, 0x55, 0xe1, 0xb8, 0x3d, 0x28, 0x6e, 0x8e, 0x63, 0x4c, 0x61, 0x05, 0xa8, 0xfd, 0x5a, 0x15, 0xf3, 0xed, 0xbb, 0x7d, 0xe3, 0x7e, 0x35, 0x93, 0x55, 0xb2, 0x8d, 0x0c, 0xe9, 0x89, 0xbc, 0xaa, 0xf5, 0x9f, 0x6a, 0xc3, 0x41, 0xf8, 0x34, 0xb7, 0xd5, 0x09, 0x41, 0x37, 0x6b, 0x0e, 0xc3, 0xd1, 0x1a, 0x3e, 0xe4, 0x68, 0xb9, 0x9a, 0xc4, 0x24, 0x7c, 0x57, 0x8a, 0x2c, 0x69, 0xf9, 0x4b, 0x4d, 0xd0, 0x4a, 0x9b, 0x0e, 0x93, 0x4f, 0xcd, 0xb5, 0x41, 0xc6, 0x2e, 0x98, 0x0a, 0x14, 0x8d, 0xa4, 0xf7, 0x3a, 0x19, 0x85, 0x89, 0x56, 0xcb, 0x85, 0x0b, 0x4b, 0x99, 0x8b, 0xb0, 0x11, 0xd6, 0xd7, 0xbe, 0x0c, 0xf8, 0x6d, 0x9c, 0xd9, 0xb0, 0x96, 0x8c, 0x70, 0x74, 0x10, 0x54, 0xd7, 0x98, 0x50, 0x5d, 0x4e, 0x24, 0xb9, 0x41, 0xe3, 0x6f, 0xe6, 0x9d, 0x89, 0x9e, 0xef, 0x3f, 0xc0, 0x4e, 0x11, 0x59, 0xe6, 0x5d, 0x94, 0x4e, 0x5d, 0xb6, 0x21, 0xf6, 0xcd, 0x2b, 0x8e, 0x82, 0x6e, 0xc1, 0xb1, 0x1a, 0xcd, 0xad, 0xfc, 0x4c, 0x16, 0x9b, 0x98, 0xa9, 0x6b, 0xcd, 0xd0, 0xd5, 0x78, 0x0e, 0x97, 0x97, 0x1a, 0xa2, 0xf0, 0xdb, 0xea, 0xf9, 0x88, 0x74, 0xea, 0x85, 0x8a, 0x80, 0xcb, 0x70, 0xfd, 0x6b, 0xf6, 0x31, 0xab, 0xaf, 0x8d, 0xee, 0xba, 0x67, 0xcc, 0xdc, 0x0c, 0xe7, 0x59, 0xd2, 0xba, 0x5e, 0xb7, 0x5d, 0x2f, 0x82, 0xa0, 0x77, 0xc1, 0x4a, 0x0b, 0x77, 0xd1, 0xaa, 0x1c, 0x19, 0xfa, 0xaf, 0xbc, 0xb3, 0xa0, 0x96, 0x27, 0x9c, 0x32, 0x9d, 0x34, 0x23, 0xc9, 0x7f, 0xf9, 0x7a, 0x68, 0x46, 0xa7, 0x8b, 0x0e, 0x2a, 0x4c, 0xe4, 0xbe, 0x3a, 0xca, 0x56, 0x52, 0xa2, 0x6c, 0x22, 0x00, 0x67, 0xef, 0x7a, 0x7d, 0x70, 0x7b, 0x52, 0x4a, 0xcd, 0xcd, 0xe9, 0x3e, 0x5e, 0x81, 0xf0, 0xe2, 0x41, 0x08, 0x6f, 0x4a, 0x93, 0xf2, 0xbd, 0xf2, 0xe0, 0xfa, 0x6b, 0x98, 0xc5, 0xdc, 0xea, 0xc5, 0xc3, 0x07, 0x6a, 0x15, 0x0e, 0x5e, 0xe7, 0xf0, 0xe6, 0x48, 0xe7, 0x48, 0x2f, 0x3c, 0xc1, 0x12, 0xa5, 0xe3, 0xdc, 0x49, 0x0a, 0xa2, 0x5c, 0x14, 0x37, 0x29, 0xf0, 0x29, 0x9a, 0x0c, 0xeb, 0xf9, 0xd0, 0x6e, 0x13, 0xb4, 0x3f, 0xc3, 0x35, 0x28, 0x63, 0x76, 0x89, 0xa4, 0xf2, 0x8a, 0x47, 0x7b, 0x97, 0xef, 0xa7, 0x0e, 0x86, 0xe3, 0x89, 0xa4, 0xae, 0x7d, 0xa3, 0x8e, 0x0a, 0xee, 0x17, 0x99, 0x1c, 0x56, 0xba, 0xc7, 0xca, 0x32, 0xea, 0x9b, 0x23, 0xf0, 0x88, 0xe3, 0x1c, 0xd6, 0xb0, 0xc7, 0xad, 0x6f, 0x58, 0x03, 0xaa, 0xd6, 0x79, 0x33, 0xc2, 0x43, 0xbd, 0xae, 0x1b, 0xcb, 0x17, 0xac, 0x34, 0x35, 0xfc, 0xb3, 0x50, 0x16, 0xd5, 0x1b, 0xcf, 0x99, 0xd3, 0xea, 0xe0, 0x59, 0xc8, 0x1b, 0x4d, 0xad, 0xb0, 0xa2, 0x37, 0x88, 0xa7, 0x2a, 0x45, 0x4a, 0x3b, 0xd2, 0xcd, 0x81, 0x7e, 0x4d, 0x3e, 0x9d, 0x9d, 0xe6, 0xb1, 0xfc, 0x7b, 0x1e, 0xf3, 0x7b, 0x74, 0x0a, 0x3d, 0x66, 0x02, 0x99, 0xf7, 0xdb, 0x6d, 0x4d, 0x3f, 0x1f, 0x7f, 0x6e, 0xd4, 0x57, 0x62, 0x51, 0xd6, 0x62, 0xae, 0x28, 0x3e, 0xed, 0xc3, 0x8b, 0x8d, 0x0f, 0xb9, 0x1a, 0xe6, 0x79, 0xa7, 0x28, 0xb8, 0xf9, 0xb3, 0x39, 0x50, 0x55, 0x30, 0x59, 0xef, 0x17, 0xb5, 0x18, 0xff, 0xdc, 0xbc, 0xd0, 0x22, 0x6b, 0x79, 0x62, 0x70, 0x5e, 0xdc, 0x5c, 0x24, 0xa1, 0x65, 0xb5, 0x5b, 0x96, 0x1f, 0x1b, 0xe2, 0x3c, 0xd4, 0x15, 0xf4, 0xc8, 0x1f, 0xd7, 0x9e, 0x72, 0xc2, 0x0f, 0x9e, 0x00, 0x9a, 0xf8, 0x68, 0x70, 0x6e, 0x07, 0xac, 0xde, 0x61, 0x03, 0x7d, 0x09, 0xd0, 0x45, 0xae, 0x2e, 0x98, 0x7c, 0x8f, 0xc9, 0x9a, 0x3a, 0x47, 0xd2, 0x70, 0x80, 0xd2, 0x9d, 0x19, 0xd7, 0xf4, 0x26, 0x05, 0x17, 0x0c, 0x12, 0x0d, 0x3a, 0xd8, 0xf6, 0xeb, 0x21, 0xa4, 0xd9, 0x2a, 0x83, 0x00, 0x8b, 0x9d, 0x07, 0xf9, 0x44, 0xc2, 0x18, 0x9e, 0xf9, 0xb9, 0xa0, 0xa0, 0x2a, 0x4c, 0x77, 0x50, 0xc4, 0x25, 0x3f, 0x9d, 0xab, 0x35, 0x9d, 0x41, 0x1e, 0x79, 0x5c, 0xd5, 0x61, 0x01, 0x95, 0x01, 0x26, 0x7f, 0x57, 0xe3, 0xaa, 0xfd, 0x02, 0x21, 0x01, 0xeb, 0x38, 0xfa, 0xa7, 0x4c, 0x99, 0x26, 0x46, 0xdf, 0x8d, 0x34, 0xc2, 0xc5, 0x6a, 0xc8, 0xda, 0x90, 0x48, 0xdc, 0x48, 0x3b, 0x87, 0x0b, 0x1b, 0x4f, 0xf1, 0x5b, 0x2f, 0x1e, 0x1e, 0x12, 0xd6, 0x9e, 0x7d, 0x01, 0x1d, 0x10, 0xd4, 0x1d, 0x42, 0x30, 0x08, 0xf1, 0xa8, 0x9e, 0x5c, 0xdf, 0xfe, 0xdb, 0x6f, 0x62, 0x12, 0x5d, 0x70, 0x7d, 0xe7, 0x81, 0x7b, 0xa7, 0xb2, 0xed, 0xa4, 0x3c, 0x6e, 0x51, 0xf3, 0x08, 0x44, 0xf7, 0x76, 0xaa, 0x6b, 0xb2, 0x8b, 0xd8, 0xb7, 0x9d, 0x65, 0x2a, 0x3d, 0x4a, 0xeb, 0x08, 0xfc, 0xd6, 0xc6, 0x4e, 0x52, 0xbb, 0x43, 0xd1, 0x05, 0x5e, 0x76, 0x09, 0x98, 0x2e, 0x6d, 0xcb, 0xfa, 0x22, 0x41, 0x73, 0x84, 0x00, 0x6b, 0xab, 0xf0, 0x38, 0x90, 0x2e, 0x3e, 0xe7, 0x9e, 0x16, 0xee, 0x67, 0x51, 0xb5, 0xe2, 0x49, 0x1d, 0xb1, 0x19, 0xa9, 0x0f, 0x58, 0x13, 0xec, 0x43, 0xb4, 0x6b, 0x82, 0xaf, 0x1b, 0x9a, 0x17, 0xe0, 0xab, 0x0f, 0xfe, 0xf7, 0x03, 0xf8, 0xf3, 0xc8, 0x6f, 0x09, 0x1a, 0x7a, 0x72, 0x4e, 0xa7, 0x2f, 0x9e, 0x1f, 0x63, 0x91, 0x7c, 0xca, 0x37, 0x3b, 0x26, 0x2b, 0x08, 0x75, 0x76, 0x38, 0xbb, 0xec, 0x9a, 0xa0, 0x6f, 0x8d, 0x33, 0xd4, 0xf2, 0x36, 0x31, 0x9d, 0x40, 0xb1, 0xc7, 0xe5, 0xbb, 0x8e, 0x0a, 0x23, 0xa3, 0x74, 0x90, 0xe3, 0xb2, 0x25, 0x1e, 0xab, 0x07, 0x1f, 0x0c, 0x5a, 0xe3, 0x56, 0x7f, 0xf4, 0x9c, 0x1b, 0x55, 0x07, 0x6b, 0x4b, 0xab, 0xd6, 0x49, 0xdf, 0xaf, 0x62, 0xdf, 0x6b, 0x53, 0x14, 0x1e, 0xa5, 0xa2, 0x54, 0xcb, 0xe7, 0xce, 0x41, 0x0c, 0x37, 0xe0, 0x3a, 0x54, 0xe3, 0x2e, 0x4e, 0x9a, 0x64, 0x11, 0x36, 0x59, 0xc2, 0xda, 0xc3, 0x60, 0xdd, 0x57, 0xab, 0xa4, 0xa5, 0xbc, 0x11, 0x7a, 0xf1, 0x34, 0x65, 0x95, 0x75, 0xc8, 0x60, 0x77, 0x36, 0x73, 0x7d, 0x12, 0x9b, 0xd7, 0xa5, 0x7c, 0x28, 0xe5, 0x71, 0x67, 0x6d, 0xd3, 0x0f, 0x3c, 0x10, 0x37, 0xc3, 0xfd, 0x04, 0x11, 0x3b, 0xdd, 0x83, 0x3c, 0xcc, 0x58, 0x11, 0x01, 0x4f, 0xbc, 0xb7, 0x9c, 0x0d, 0x63, 0x4a, 0xc5, 0x87, 0xf9, 0x53, 0xd2, 0xb1, 0x95, 0x2e, 0x41, 0x8d, 0x8b, 0x02, 0x0b, 0x81, 0x1d, 0x5c, 0x39, 0x5b, 0xfd, 0xc6, 0x73, 0xc9, 0x6e, 0xed, 0xe2, 0xe3, 0x2d, 0x4e, 0xb3, 0xfb, 0x95, 0xe6, 0x9a, 0x7f, 0x2f, 0x64, 0xc1, 0x83, 0xb8, 0x55, 0xb1, 0x05, 0xcb, 0xaa, 0xdc, 0xaa, 0xed, 0xf7, 0x56, 0xd5, 0xdc, 0x3b, 0x5b, 0x5c, 0xa8, 0xd4, 0x2b, 0x4c, 0xf1, 0xbf, 0xe7, 0x37, 0x47, 0x28, 0x9c, 0x74, 0x54, 0x19, 0x9d, 0xe7, 0x64, 0x09, 0x35, 0xd0, 0x78, 0xdf, 0x8d, 0xcc, 0x9e, 0x9c, 0x19, 0xa5, 0xb6, 0xe2, 0x85, 0x0e, 0x7e, 0x1f, 0x3b, 0x69, 0x63, 0xbd, 0xda, 0x79, 0xd0, 0x9d, 0x67, 0x31, 0x6a, 0xf3, 0xcf, 0xdf, 0x4e, 0x55, 0x01, 0xe8, 0x22, 0xf1, 0x4a, 0x2a, 0x06, 0xb3, 0x3a, 0x82, 0x6c, 0xa8, 0xb3, 0x39, 0xb3, 0x98, 0x09, 0xf8, 0xde, 0x66, 0x39, 0xaf, 0xb1, 0x71, 0xf9, 0x01, 0xe3, 0x5f, 0x83, 0x8c, 0x42, 0xbb, 0x66, 0x5c, 0xcc, 0xaf, 0xce, 0x38, 0xad, 0x08, 0x99, 0xf2, 0x47, 0xc7, 0xf4, 0xe6, 0xeb, 0x15, 0x68, 0x7f, 0xf3, 0xc7, 0xe6, 0x3e, 0xcc, 0x2c, 0x74, 0xdc, 0xb7, 0x57, 0xfc, 0x2d, 0x70, 0x74, 0xa0, 0xf0, 0xf2, 0x97, 0x69, 0x31, 0x14, 0x96, 0x18, 0x6d, 0x23, 0xb1, 0xd6, 0x69, 0x8d, 0x53, 0xeb, 0x46, 0xde, 0xb3, 0xb4, 0x2b, 0x45, 0x1b, 0x2c, 0x48, 0x44, 0x22, 0x72, 0x0d, 0xc2, 0xa4, 0x9b, 0x86, 0x16, 0xc7, 0x9c, 0x34, 0x47, 0xc5, 0x97, 0xd0, 0x56, 0xd7, 0x54, 0x63, 0x5d, 0x64, 0xa0, 0xbb, 0x85, 0x46, 0x77, 0xe7, 0x05, 0x1c, 0x50, 0x90, 0x4d, 0x73, 0xac, 0x2c, 0x38, 0xb5, 0xb1, 0x36, 0x34, 0x63, 0x13, 0xa8, 0x40, 0x8d, 0x6b, 0xea, 0x99, 0x71, 0x11, 0x43, 0xf3, 0x4b, 0x96, 0x19, 0x6b, 0x28, 0xf3, 0x8b, 0xaa, 0x7c, 0x19, 0x36, 0xc5, 0x64, 0xce, 0x05, 0x43, 0x58, 0x27, 0x21, 0xaa, 0x3e, 0xb1, 0xed, 0x06, 0x41, 0x8a, 0x54, 0x8f, 0xfc, 0x49, 0xbe, 0x4b, 0xf6, 0x9c, 0x39, 0xc8, 0xaa, 0xbd, 0xa8, 0xba, 0x0b, 0x8a, 0x5c, 0x2b, 0xc7, 0x85, 0x56, 0x0e, 0x75, 0x86, 0x9e, 0x24, 0x5e, 0x62, 0xd7, 0x9f, 0xbc, 0xc0, 0x55, 0x52, 0xb9, 0xca, 0xe0, 0xa8, 0xa0, 0xa6, 0x27, 0xc4, 0x26, 0xf7, 0x60, 0x5e, 0x67, 0xe8, 0xd4, 0x1b, 0x76, 0x7c, 0x9c, 0x74, 0x79, 0x1a, 0xe2, 0x14, 0xc3, 0x6e, 0xe8, 0xe1, 0x62, 0xba, 0x65, 0x06, 0xba, 0x86, 0xa1, 0x45, 0x75, 0x26, 0x18, 0xcd, 0x1f, 0x8c, 0x6e, 0x10, 0x9d, 0x7e, 0x3a, 0x21, 0x29, 0x25, 0xcb, 0x4f, 0x74, 0xb5, 0xff, 0x35, 0x2b, 0xd4, 0xd8, 0x66, 0x0b, 0x48, 0x6c, 0x86, 0xd5, 0x8b, 0x08, 0x70, 0xad, 0xf3, 0xf6, 0x5d, 0x3c, 0x36, 0x41, 0xd5, 0x92, 0xee, 0xab, 0x3e, 0x5b, 0x30, 0x4e, 0xf3, 0xfe, 0x2d, 0x1b, 0xe2, 0x68, 0xf2, 0x95, 0x8c, 0xd0, 0xb2, 0x09, 0x47, 0xc5, 0x57, 0x1b, 0x33, 0xcc, 0x63, 0xbd, 0x96, 0x44, 0xdc, 0xe1, 0xff, 0x17, 0x6a, 0xa1, 0x49, 0x2c, 0xc4, 0xab, 0x93, 0xc6, 0x3b, 0x8d, 0x60, 0xe8, 0x57, 0x43, 0x58, 0xe4, 0x20, 0x41, 0x43, 0xa3, 0x07, 0xc9, 0xeb, 0x3d, 0xfa, 0xd1, 0x21, 0xef, 0x82, 0x9a, 0x09, 0xcb, 0xf0, 0x09, 0x1f, 0xad, 0xa1, 0x0d, 0x41, 0xdd, 0x8d, 0x9d, 0x63, 0xbb, 0xcf, 0xf4, 0xee, 0x9a, 0xbc, 0x5a, 0xf2, 0x58, 0xdf, 0xcd, 0x08, 0x9c, 0xf3, 0x48, 0xd9, 0x52, 0xc2, 0x7d, 0x3a, 0xd3, 0x7b, 0x1e, 0xce, 0xf4, 0xd4, 0x90, 0x36, 0x88, 0xf3, 0xff, 0xb1, 0x11, 0x1c, 0x80, 0xa5, 0x78, 0xaa, 0xe7, 0x32, 0x78, 0x53, 0xba, 0x29, 0x24, 0x2f, 0x20, 0x6a, 0x67, 0x36, 0x66, 0x0e, 0x4b, 0x16, 0xc7, 0xf2, 0xc1, 0x69, 0xe2, 0x45, 0x04, 0x73, 0xc9, 0x15, 0x50, 0x04, 0x0d, 0x25, 0x96, 0xf6, 0xc9, 0x23, 0xb5, 0x61, 0x6c, 0x4b, 0x64, 0x3a, 0x9f, 0xa9, 0x3a, 0x13, 0xc6, 0x7c, 0x03, 0xda, 0xee, 0x4a, 0x67, 0xbb, 0xf3, 0xd7, 0xc2, 0x01, 0xd2, 0xd4, 0x9c, 0x32, 0x88, 0x04, 0x9a, 0x9b, 0xb8, 0x0d, 0xa5, 0x95, 0xe6, 0xd8, 0x10, 0x41, 0x6f, 0xf7, 0x1a, 0x00, 0x85, 0xa2, 0xa9, 0x26, 0xfd, 0xc3, 0x2c, 0xe1, 0xe7, 0xdf, 0x7d, 0x63, 0xba, 0x0d, 0xc9, 0x2e, 0x28, 0x34, 0xff, 0x40, 0x03, 0x79, 0x00, 0xcb, 0xa4, 0x97, 0xce, 0xd7, 0x14, 0x08, 0x54, 0x4c, 0xaa, 0x9e, 0x51, 0x03, 0x82, 0xcf, 0xf6, 0xe2, 0xee, 0x05, 0x2f, 0xd3, 0x70, 0x2b, 0x71, 0x62, 0xf7, 0xbc, 0xa6, 0x38, 0x56, 0x0b, 0xdc, 0xd0, 0x60, 0x59, 0x60, 0x99, 0x17, 0x7f, 0x7a, 0x0d, 0x2c, 0xd0, 0x94, 0x05, 0x88, 0x2b, 0x40, 0x91, 0xb2, 0x83, 0xd9, 0xfa, 0xd8, 0x05, 0x62, 0xec, 0xd0, 0xbf, 0xb4, 0xa2, 0xf4, 0x3d, 0x34, 0xbe, 0x8d, 0xcd, 0x9c, 0xbe, 0xe8, 0x16, 0xac, 0x4e, 0x2f, 0x71, 0xd9, 0xab, 0x3f, 0x84, 0x87, 0xb7, 0xce, 0xd7, 0xf5, 0x54, 0x75, 0x34, 0xb0, 0x63, 0xb7, 0x50, 0x3c, 0xb5, 0x32, 0xed, 0x7e, 0x6a, 0xd7, 0x7a, 0x00, 0x00, 0x01, 0x09, 0x06, 0x4c, 0x64, 0xe2, 0x00, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x04, 0x81, 0x01, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x04, 0x81, 0x01, 0x00, 0x01, 0xbb, 0xbb, 0xbb, 0xbb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x04, 0x81, 0x01, 0x00, 0x09, 0xcc, 0xcc, 0xcc, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; +constexpr std::array M2V_TINY_PACKETS_STREAM = { 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xbb, 0x00, 0x0c, 0x83, 0xa9, 0x81, 0x80, 0xf0, 0x7f, 0xb9, 0xf3, 0x3b, 0xbd, 0xe7, 0x28, 0x00, 0x00, 0x01, 0xbf, 0x00, 0x7a, 0x01, 0xe0, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6a, 0x00, 0x1a, 0x00, 0x80, 0x20, 0x90, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x4f, 0x00, 0x00, 0x01, 0xe0, 0x07, 0x5a, 0x81, 0xc1, 0x0d, 0x31, 0x00, 0x05, 0xbf, 0x21, 0x11, 0x00, 0x05, 0xa7, 0xab, 0x1e, 0x73, 0x3b, 0x00, 0x00, 0x01, 0x00, 0x35, 0xf9, 0x2e, 0x87, 0xf2, 0x56, 0x91, 0x4f, 0xcc, 0x26, 0x6b, 0x91, 0x91, 0xb1, 0x2f, 0x9c, 0xd6, 0xe6, 0x70, 0xa4, 0xe1, 0x20, 0xae, 0x5b, 0x09, 0x39, 0x8b, 0xc5, 0x59, 0xd8, 0x6a, 0xee, 0x7a, 0x50, 0x8e, 0x52, 0x41, 0x71, 0x40, 0x1f, 0x55, 0x19, 0x85, 0xa4, 0xd1, 0x7b, 0x75, 0x89, 0xdf, 0x58, 0x41, 0xba, 0x9b, 0xa2, 0x66, 0x0a, 0xcf, 0x53, 0xb2, 0xfe, 0x4c, 0x60, 0x09, 0x51, 0xf3, 0x12, 0x11, 0x11, 0xb6, 0x41, 0x3d, 0x71, 0x22, 0x23, 0xd6, 0xaa, 0x31, 0xb6, 0xf0, 0x8a, 0x86, 0xfb, 0x86, 0x89, 0x46, 0x7b, 0x0c, 0x82, 0x2f, 0xe0, 0x48, 0x71, 0xad, 0x88, 0x3a, 0xc9, 0xf9, 0x64, 0x55, 0x3f, 0x9b, 0x93, 0x74, 0x33, 0xc3, 0x72, 0x2a, 0x01, 0x60, 0x29, 0x67, 0xe1, 0xf0, 0xe7, 0x97, 0x2e, 0x54, 0x4c, 0xa3, 0x34, 0x42, 0xbf, 0x93, 0xdd, 0x13, 0xa9, 0x9e, 0xd8, 0xfd, 0xd1, 0xee, 0x1b, 0x0d, 0x5b, 0x82, 0xda, 0x5c, 0x1b, 0xc2, 0x4a, 0x61, 0x40, 0xd5, 0xd2, 0x56, 0x99, 0xc1, 0x8b, 0x0e, 0xd9, 0xe4, 0x16, 0xb7, 0xb7, 0x4d, 0x43, 0x6c, 0xc2, 0x08, 0x05, 0x81, 0x48, 0x63, 0xaa, 0xfd, 0xb0, 0xb8, 0x5e, 0xa5, 0x13, 0x52, 0x67, 0x89, 0x0b, 0x67, 0xa7, 0x06, 0xf0, 0x47, 0x44, 0x8d, 0x0c, 0x39, 0xa2, 0xcf, 0x70, 0xa5, 0xea, 0xf6, 0x73, 0x82, 0xdc, 0x1c, 0x19, 0x2f, 0xb2, 0x30, 0xcc, 0x1c, 0x3b, 0xe9, 0x38, 0x01, 0x83, 0x84, 0x3d, 0x80, 0xab, 0x5e, 0x32, 0x5c, 0xc5, 0xc3, 0xf1, 0xc2, 0xd7, 0x60, 0x77, 0x3b, 0x5d, 0x48, 0x04, 0x49, 0xeb, 0x78, 0xfd, 0xc0, 0xbf, 0x41, 0x0d, 0x67, 0x70, 0x0a, 0x47, 0x6d, 0x09, 0x4e, 0x2f, 0xb8, 0x31, 0xd6, 0x05, 0x2b, 0x3a, 0x72, 0xb8, 0x52, 0x36, 0xd4, 0x3e, 0x27, 0x6b, 0x48, 0x5d, 0xcc, 0xc5, 0x55, 0x0c, 0x7b, 0x20, 0x9b, 0xf8, 0x07, 0x81, 0x79, 0xe4, 0xa4, 0xaa, 0x3c, 0xdb, 0xd8, 0x8d, 0xf5, 0x77, 0xcf, 0x95, 0x31, 0xb7, 0x73, 0xc4, 0x29, 0x1b, 0xf2, 0x24, 0x34, 0x0c, 0xb0, 0x02, 0x85, 0xc5, 0xb5, 0xe9, 0x82, 0x31, 0x1e, 0x78, 0x3f, 0x96, 0x2b, 0x5a, 0xf2, 0xe2, 0xdf, 0x19, 0x58, 0xf8, 0x5b, 0x8a, 0x6c, 0x66, 0x5e, 0x0d, 0xf0, 0x45, 0x9b, 0xe1, 0x9c, 0x44, 0xcf, 0x3b, 0xf0, 0x0a, 0xbb, 0xf1, 0x09, 0x85, 0x81, 0xdf, 0xf9, 0xc8, 0xfa, 0x53, 0x6c, 0x87, 0x00, 0x30, 0xb0, 0x5b, 0xd3, 0x94, 0x62, 0x61, 0x03, 0x1e, 0x50, 0xdc, 0x94, 0x3c, 0x64, 0xd9, 0x34, 0x11, 0x8f, 0x21, 0xcb, 0xd5, 0x1b, 0xe1, 0xba, 0xc6, 0xd6, 0xca, 0x7e, 0x0f, 0xf8, 0xb2, 0xa1, 0x35, 0xc3, 0xd9, 0x30, 0xf0, 0x26, 0x6b, 0x07, 0x89, 0x02, 0xde, 0xc2, 0x12, 0xc4, 0x45, 0x20, 0x26, 0x72, 0xb5, 0x19, 0xf2, 0x74, 0x59, 0x07, 0xc2, 0x99, 0xcf, 0x95, 0x50, 0x38, 0xef, 0x5e, 0x8c, 0x68, 0x0f, 0x60, 0xa0, 0xa0, 0x66, 0xc1, 0x64, 0x54, 0x33, 0x81, 0x87, 0x49, 0xa6, 0x08, 0x21, 0xbc, 0xd4, 0xcb, 0x6d, 0xa6, 0x22, 0x59, 0xea, 0x9a, 0xee, 0x96, 0x1b, 0x22, 0x6d, 0x04, 0x9e, 0x8c, 0xfc, 0x43, 0x69, 0x8c, 0x5d, 0x3c, 0x49, 0x29, 0xa3, 0x9d, 0x01, 0xd3, 0xbf, 0x95, 0xad, 0xa4, 0xf1, 0xfd, 0x2e, 0x16, 0x99, 0x55, 0xdb, 0xc7, 0x22, 0x46, 0xb7, 0x01, 0x01, 0x96, 0xd8, 0x31, 0x05, 0xaf, 0xd4, 0x78, 0x7b, 0x38, 0x55, 0xf5, 0xdb, 0x59, 0x2b, 0x97, 0xf4, 0xa2, 0x79, 0x74, 0xe0, 0xbd, 0xdf, 0xff, 0x3b, 0x55, 0xb4, 0x9d, 0x4b, 0xe3, 0xb1, 0x73, 0x21, 0x4b, 0xab, 0x6c, 0xf1, 0x6c, 0x2f, 0xc8, 0x12, 0x28, 0x2c, 0xc2, 0x6d, 0x6b, 0xf2, 0x1c, 0x4f, 0x41, 0x38, 0x8b, 0xdd, 0x0f, 0xf0, 0x6c, 0xac, 0x67, 0x1a, 0x31, 0x2b, 0x1d, 0xda, 0x6b, 0xea, 0x8d, 0x8c, 0x65, 0xee, 0x39, 0x8c, 0xb2, 0x96, 0x35, 0xf2, 0x30, 0xce, 0xfe, 0x8a, 0x3f, 0x7e, 0xb6, 0xa1, 0x5d, 0x85, 0xea, 0x95, 0x3f, 0xb2, 0x4d, 0x33, 0x2c, 0x6b, 0x18, 0x46, 0x2e, 0x1c, 0xfb, 0xf4, 0x58, 0x8b, 0xc5, 0xbf, 0x44, 0xa0, 0x39, 0x53, 0x6e, 0x57, 0xaf, 0x69, 0x31, 0xd2, 0x7a, 0x6f, 0x6f, 0xdc, 0x39, 0xc5, 0x2f, 0x37, 0x7c, 0xae, 0xc8, 0x94, 0x6c, 0x4e, 0x58, 0x19, 0x68, 0x60, 0x98, 0xbd, 0xb7, 0x63, 0x5b, 0xed, 0xc5, 0x7b, 0x44, 0x44, 0x90, 0x49, 0x76, 0x42, 0x39, 0x61, 0x5d, 0x47, 0xdc, 0x3c, 0xc3, 0x4b, 0x1d, 0xb8, 0xd6, 0x17, 0x24, 0x8e, 0xd6, 0xea, 0xd9, 0x50, 0x88, 0xdb, 0xa6, 0xd4, 0xac, 0x5d, 0x1b, 0x1d, 0x0b, 0xb9, 0x28, 0x28, 0xe6, 0x68, 0xd4, 0x3a, 0xd6, 0x90, 0xa4, 0x79, 0x5a, 0x20, 0x0f, 0x07, 0xb9, 0x46, 0xc2, 0xe6, 0xeb, 0x3b, 0x8b, 0x4b, 0xa2, 0xa2, 0x21, 0x35, 0xbd, 0xf5, 0x34, 0x6e, 0xb0, 0xb9, 0x70, 0x4a, 0xae, 0x80, 0x60, 0xc0, 0x9c, 0xe6, 0x59, 0xbf, 0x24, 0x0d, 0xe2, 0xd2, 0x69, 0x59, 0x39, 0x7b, 0x2d, 0x5b, 0xeb, 0xd8, 0x72, 0x33, 0xa8, 0x6a, 0xea, 0xdd, 0xbb, 0x29, 0xb7, 0x2e, 0xd7, 0x35, 0x4d, 0x6d, 0x25, 0xc0, 0x86, 0xda, 0xb7, 0x16, 0x28, 0x8d, 0xdd, 0xd5, 0x73, 0x6b, 0xf1, 0xb6, 0x87, 0x3e, 0x9b, 0x85, 0x9a, 0x11, 0xb0, 0x1e, 0x62, 0x63, 0x10, 0x8c, 0x34, 0xe5, 0x3f, 0xb3, 0x99, 0xb4, 0x9f, 0x07, 0x80, 0x64, 0x6c, 0x49, 0x3d, 0x3d, 0xf8, 0x50, 0xf6, 0x7b, 0xc6, 0x43, 0x36, 0x7c, 0x74, 0xe3, 0xcd, 0x25, 0xa3, 0xbd, 0x29, 0xf8, 0x46, 0x59, 0xd1, 0x8f, 0xfe, 0xd2, 0xb9, 0x7f, 0x80, 0x69, 0x87, 0xdc, 0x1c, 0xe9, 0x13, 0xe2, 0xe3, 0x07, 0xa5, 0x6d, 0x09, 0x12, 0xce, 0x50, 0x7e, 0x87, 0xd6, 0xba, 0xde, 0x79, 0x16, 0x2f, 0x25, 0xd5, 0xcd, 0xc2, 0xde, 0xe6, 0x2a, 0x9b, 0xac, 0xbd, 0xb0, 0x03, 0x5e, 0x48, 0x2a, 0x62, 0xfd, 0x43, 0xca, 0x07, 0x7d, 0x58, 0x35, 0x9a, 0xf9, 0x0a, 0x90, 0x82, 0xb1, 0x48, 0xd4, 0xc2, 0x28, 0xcb, 0xf8, 0xf6, 0x1d, 0x84, 0xbc, 0x7c, 0x3b, 0xdd, 0x20, 0xf9, 0xbc, 0x7d, 0xd7, 0xc8, 0x5d, 0xce, 0x3e, 0xf6, 0x5b, 0x8d, 0xa4, 0xdd, 0x57, 0x08, 0xed, 0x90, 0x62, 0xe4, 0xe3, 0x8d, 0x7f, 0x88, 0xba, 0x8a, 0x6d, 0x88, 0x94, 0x35, 0x7a, 0xa9, 0x13, 0x45, 0xb6, 0x65, 0x44, 0x41, 0xcd, 0xfa, 0x73, 0xc7, 0x4e, 0x6e, 0xaa, 0x43, 0x40, 0x22, 0xf1, 0x5c, 0x29, 0xc8, 0x95, 0x92, 0x0e, 0xdf, 0x0c, 0xbe, 0xf4, 0x0e, 0x2a, 0x81, 0xea, 0x04, 0xd7, 0xd1, 0xbe, 0x9f, 0x6e, 0x21, 0xc9, 0x99, 0x6d, 0xef, 0x78, 0xfb, 0x2a, 0x95, 0x8c, 0xff, 0xb5, 0xc3, 0x35, 0x38, 0x13, 0xf4, 0x6d, 0x25, 0x7b, 0xb7, 0x4c, 0x7b, 0x4a, 0xbe, 0x3f, 0xd4, 0xcf, 0xeb, 0x3d, 0x8e, 0x27, 0xe0, 0x84, 0x05, 0xc2, 0xc4, 0x6b, 0x79, 0x5b, 0x45, 0x4c, 0x46, 0x67, 0x05, 0xa6, 0x38, 0x58, 0xfd, 0xe6, 0x35, 0x29, 0x7f, 0x84, 0x75, 0x14, 0xed, 0x62, 0x05, 0x72, 0x46, 0x8d, 0x5a, 0x13, 0x16, 0xe3, 0x18, 0x9f, 0x82, 0x30, 0x71, 0xc5, 0x65, 0xc1, 0xa4, 0x47, 0xc7, 0x91, 0x92, 0x33, 0x19, 0x79, 0x6c, 0xcd, 0x03, 0x1e, 0xe5, 0xfe, 0xb4, 0x6f, 0x85, 0x4c, 0xf8, 0xfd, 0xee, 0xad, 0x84, 0x80, 0x33, 0xc4, 0x48, 0x44, 0xae, 0x48, 0xae, 0x63, 0xcb, 0xa9, 0x0f, 0xff, 0xd4, 0x47, 0xd9, 0xdb, 0xac, 0xb0, 0x14, 0x0f, 0xfb, 0xcf, 0x5d, 0xb8, 0x48, 0xfa, 0x7a, 0xd1, 0xf9, 0x41, 0x0b, 0xa8, 0x3b, 0x85, 0x19, 0x95, 0x41, 0x16, 0x7a, 0xdc, 0x70, 0xf7, 0x4c, 0xed, 0x4e, 0x0b, 0xf1, 0x72, 0x5c, 0xb0, 0x67, 0xc2, 0x28, 0xa4, 0xd6, 0xc0, 0x44, 0x2f, 0xac, 0x3f, 0xf0, 0xf1, 0xb3, 0x5d, 0x96, 0xc9, 0xdc, 0x89, 0x7e, 0xb5, 0xcb, 0x0a, 0x4a, 0xae, 0x4c, 0x4d, 0x17, 0xcc, 0x3b, 0x5b, 0x65, 0x3f, 0x95, 0x15, 0x24, 0xec, 0xaf, 0x40, 0x75, 0xb3, 0xd0, 0x72, 0x09, 0xb2, 0xa6, 0x55, 0x30, 0x0c, 0x5d, 0xf7, 0xff, 0x00, 0x43, 0xff, 0x19, 0x5e, 0x44, 0x04, 0x07, 0xa8, 0xb3, 0x64, 0x36, 0x63, 0x1d, 0x59, 0xe9, 0x6d, 0x20, 0x26, 0xd9, 0x61, 0x8b, 0x8a, 0x40, 0x4e, 0x33, 0xf9, 0x7b, 0x5f, 0x4b, 0x2c, 0x9f, 0x25, 0x2a, 0x04, 0x9c, 0xad, 0xcd, 0xea, 0xbd, 0x93, 0x7a, 0x11, 0xbf, 0xb5, 0x5e, 0x56, 0xb5, 0x3f, 0x01, 0x90, 0x74, 0x26, 0xe8, 0x99, 0x55, 0x62, 0xcd, 0x66, 0x69, 0x64, 0x39, 0xe7, 0x80, 0xa6, 0x6d, 0x92, 0x98, 0x52, 0xe2, 0xcc, 0x9a, 0x54, 0xd5, 0x9b, 0x78, 0x64, 0x9e, 0x45, 0x0b, 0xcd, 0xd1, 0xd5, 0x4c, 0x06, 0x55, 0xa7, 0xcb, 0x5f, 0x0a, 0x6f, 0x73, 0x54, 0x9e, 0x5d, 0x05, 0x5a, 0x9a, 0x58, 0xd6, 0x1b, 0xe3, 0x6d, 0xc3, 0x86, 0x2b, 0xec, 0x5a, 0x30, 0x07, 0xd4, 0xb1, 0xd9, 0xb0, 0x7c, 0x6c, 0x19, 0xa4, 0xaf, 0xe9, 0x8a, 0xa6, 0x99, 0x95, 0xfb, 0xd6, 0x36, 0xd6, 0x6b, 0xe6, 0x38, 0x24, 0xe9, 0x96, 0x80, 0x21, 0x99, 0x0b, 0xa5, 0xe4, 0x71, 0xa6, 0x25, 0xb1, 0x77, 0x66, 0x43, 0xe4, 0x87, 0x0c, 0xa0, 0xbb, 0xfd, 0x7e, 0x1d, 0x4e, 0xb9, 0x20, 0x8d, 0xe2, 0x58, 0x27, 0x49, 0x52, 0xb1, 0x22, 0xb0, 0x63, 0xd0, 0x24, 0x18, 0x16, 0x10, 0x6b, 0xcf, 0x5b, 0x0f, 0x5b, 0x19, 0xc5, 0x92, 0x27, 0x5d, 0x11, 0xa6, 0x96, 0xe9, 0xa3, 0x80, 0x9e, 0xf3, 0x57, 0xf2, 0xdb, 0xd5, 0x35, 0x7a, 0x13, 0x98, 0xf9, 0x43, 0x4c, 0x4d, 0x77, 0x8b, 0x2c, 0xdb, 0x41, 0x5d, 0x9d, 0x23, 0x28, 0x8b, 0xf2, 0xbd, 0x7d, 0x45, 0x14, 0x9f, 0x1c, 0xda, 0x59, 0x6d, 0xaa, 0x60, 0x20, 0x5c, 0xa6, 0x64, 0x59, 0xcb, 0x1a, 0xdc, 0x7b, 0x01, 0x12, 0xf3, 0xa3, 0xc8, 0x38, 0x72, 0xde, 0xbb, 0x27, 0xd9, 0xd1, 0x8c, 0x58, 0x71, 0x43, 0x94, 0xc4, 0xe2, 0x3b, 0x71, 0x94, 0x1d, 0xba, 0x90, 0x83, 0x9d, 0x4a, 0xcd, 0xbe, 0x5b, 0xce, 0xa2, 0x74, 0xee, 0x6c, 0x87, 0x5c, 0xb1, 0x74, 0x6c, 0xe2, 0xf6, 0x8a, 0x87, 0xbd, 0x91, 0x92, 0xd2, 0x2c, 0x48, 0x13, 0xed, 0x12, 0xf6, 0x12, 0x57, 0xac, 0x6b, 0x9d, 0x17, 0xa3, 0x54, 0x85, 0x54, 0xae, 0xb7, 0x09, 0x7f, 0x0c, 0xd5, 0x58, 0xf8, 0x7a, 0x73, 0x45, 0x64, 0x8b, 0xe4, 0x93, 0x16, 0x67, 0x4f, 0x95, 0x40, 0x63, 0x0e, 0x32, 0xcc, 0x06, 0x27, 0x6d, 0x16, 0x4b, 0x2e, 0x06, 0xef, 0x58, 0x1b, 0xdf, 0x8a, 0xe8, 0xe8, 0x28, 0x52, 0x18, 0xf2, 0x93, 0xc7, 0x66, 0x7b, 0xfd, 0xd3, 0x0d, 0xd0, 0x59, 0x3e, 0x0d, 0xdc, 0xcb, 0x3d, 0x79, 0x3e, 0x3d, 0x2d, 0xfa, 0x24, 0xd9, 0xfe, 0x8b, 0x7c, 0x36, 0xf6, 0xd9, 0x4b, 0x26, 0xa4, 0xe5, 0x29, 0x65, 0x4d, 0xb4, 0x3c, 0xac, 0x2d, 0x3b, 0x37, 0xd8, 0x30, 0xd7, 0x2a, 0x30, 0x2e, 0xf4, 0x30, 0xee, 0xaf, 0xbb, 0x45, 0xaa, 0xc2, 0xe4, 0xd0, 0x3e, 0x85, 0x08, 0xb3, 0x38, 0x49, 0x12, 0xe3, 0x11, 0x85, 0xa3, 0xdf, 0x9c, 0xfe, 0x91, 0x82, 0x73, 0xd2, 0xcf, 0x16, 0x59, 0x54, 0x67, 0x93, 0xcb, 0xe5, 0x5b, 0x75, 0x4b, 0x2c, 0x86, 0xa0, 0x05, 0x6d, 0xe4, 0x27, 0xe7, 0xd3, 0xd0, 0x00, 0x52, 0xf2, 0x21, 0xf2, 0xf3, 0xd4, 0x32, 0x47, 0x6d, 0x53, 0x44, 0x12, 0xe1, 0x9b, 0xc7, 0x0f, 0x7f, 0x0e, 0x6c, 0x6c, 0xb0, 0xe6, 0x18, 0x0b, 0x83, 0x58, 0x1f, 0x05, 0x61, 0x06, 0x58, 0x72, 0x45, 0x0a, 0xe1, 0xd6, 0xf5, 0xf1, 0xc6, 0xad, 0xed, 0x58, 0xcb, 0xe5, 0x09, 0x21, 0x0d, 0x60, 0x1a, 0x59, 0x42, 0xb3, 0xf2, 0x4b, 0xc2, 0xc3, 0x90, 0x65, 0xb1, 0xfc, 0x77, 0xdb, 0xe3, 0x40, 0x6d, 0x3a, 0x5b, 0xc1, 0x0e, 0x49, 0x79, 0x6f, 0xfe, 0xf9, 0x3d, 0xa9, 0xb3, 0x38, 0x36, 0x59, 0x11, 0xec, 0xf7, 0xac, 0x4e, 0x6a, 0x32, 0x0c, 0xe8, 0x25, 0xd2, 0x11, 0xa0, 0x7e, 0xb2, 0x84, 0xb1, 0xdf, 0xcb, 0xbd, 0xcc, 0x87, 0xfc, 0xde, 0x8f, 0xc1, 0xb6, 0xcd, 0x69, 0x68, 0x43, 0xdd, 0x3c, 0xe1, 0x6a, 0x89, 0x24, 0x07, 0x9c, 0xc2, 0x2f, 0x9e, 0x03, 0x9c, 0xf5, 0x51, 0x06, 0x6f, 0x59, 0x4e, 0x30, 0xa5, 0xe3, 0x09, 0x82, 0xde, 0x74, 0xb2, 0x96, 0x13, 0x55, 0x6a, 0x38, 0xe6, 0xd6, 0x44, 0x3a, 0x52, 0xf9, 0x99, 0xb4, 0x51, 0xe8, 0x4b, 0x04, 0x4a, 0x34, 0xe6, 0x27, 0x41, 0x16, 0xcd, 0x4e, 0x2d, 0x28, 0xdf, 0xc3, 0xe6, 0x63, 0x3f, 0x83, 0x91, 0x47, 0x2d, 0x20, 0x80, 0x81, 0x16, 0xcf, 0xe1, 0x76, 0x4c, 0xb5, 0xbc, 0x7d, 0x1a, 0xdd, 0x1b, 0xbf, 0x08, 0x60, 0x53, 0xf8, 0x97, 0xab, 0xd8, 0x98, 0xcf, 0xfb, 0x02, 0xf9, 0x50, 0x64, 0xb1, 0xb4, 0xd5, 0x06, 0xcd, 0x40, 0x4c, 0x50, 0xe7, 0x67, 0x00, 0x5d, 0x99, 0x3a, 0x6d, 0xd9, 0x62, 0x9a, 0xb3, 0x00, 0x10, 0x76, 0xdc, 0x94, 0x01, 0x4f, 0x54, 0xeb, 0xd2, 0xb3, 0x42, 0x65, 0x32, 0xb1, 0xb6, 0xfc, 0x00, 0x7c, 0xd0, 0xac, 0xe6, 0xbd, 0x49, 0xed, 0x11, 0x53, 0x19, 0x85, 0xca, 0x71, 0x17, 0x59, 0xf5, 0x6b, 0xbe, 0x18, 0xd4, 0x92, 0x9a, 0xd5, 0x89, 0xf6, 0xe4, 0xf9, 0x27, 0xfd, 0x5d, 0x17, 0x64, 0x01, 0x7e, 0x95, 0x36, 0x8e, 0x6d, 0x2c, 0xe3, 0xdb, 0x6a, 0xb4, 0x4d, 0x91, 0x98, 0xc4, 0x96, 0x14, 0x55, 0x0a, 0x54, 0xc6, 0x83, 0x83, 0xf1, 0x09, 0x7a, 0xd2, 0xf5, 0xf5, 0x88, 0x6f, 0x54, 0xff, 0x28, 0x7e, 0x03, 0x11, 0x69, 0x64, 0x5f, 0xcb, 0x1c, 0x7d, 0x3c, 0xeb, 0xd0, 0x99, 0x99, 0x13, 0xac, 0x02, 0x55, 0x00, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x04, 0x81, 0x01, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x04, 0x81, 0x01, 0x00, 0x01, 0xbb, 0xbb, 0xbb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xba, 0x44, 0x00, 0x04, 0x00, 0xf5, 0xb1, 0x07, 0x53, 0x03, 0xf8, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x04, 0x81, 0x01, 0x00, 0x00, 0xcc, 0xcc, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + + +constexpr std::array AVC_FLUSH_EXPECTED_AU_SHA1 = { 0xe6, 0xf9, 0x41, 0x5f, 0x85, 0x80, 0x14, 0x9d, 0xf1, 0x24, 0x8a, 0xf5, 0x4d, 0x4b, 0x9f, 0x22, 0xd6, 0x60, 0x46, 0x0d }; From bd7d5faa9f175f9728c873cb74934d04b2d30690 Mon Sep 17 00:00:00 2001 From: capriots <29807355+capriots@users.noreply.github.com> Date: Thu, 10 Jul 2025 19:39:49 +0200 Subject: [PATCH 034/295] cellDmuxPamf implementation part 2: PPU thread --- rpcs3/Emu/Cell/Modules/cellDmux.cpp | 42 +- rpcs3/Emu/Cell/Modules/cellDmux.h | 168 +-- rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp | 1663 ++++++++++++++++++++++- rpcs3/Emu/Cell/Modules/cellDmuxPamf.h | 374 ++++- rpcs3/Emu/Cell/lv2/sys_prx.cpp | 2 +- 5 files changed, 2040 insertions(+), 209 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/cellDmux.cpp b/rpcs3/Emu/Cell/Modules/cellDmux.cpp index d7f6f84f3f..fb1f32837d 100644 --- a/rpcs3/Emu/Cell/Modules/cellDmux.cpp +++ b/rpcs3/Emu/Cell/Modules/cellDmux.cpp @@ -169,18 +169,18 @@ public: static const u32 id_count = 1023; SAVESTATE_INIT_POS(34); - ElementaryStream(Demuxer* dmux, u32 addr, u32 size, u32 fidMajor, u32 fidMinor, u32 sup1, u32 sup2, vm::ptr cbFunc, u32 cbArg, u32 spec); + ElementaryStream(Demuxer* dmux, vm::ptr addr, u32 size, u32 fidMajor, u32 fidMinor, u32 sup1, u32 sup2, vm::ptr cbFunc, vm::ptr cbArg, u32 spec); Demuxer* dmux; const u32 id = idm::last_id(); - const u32 memAddr; + const vm::ptr memAddr; const u32 memSize; const u32 fidMajor; const u32 fidMinor; const u32 sup1; const u32 sup2; const vm::ptr cbFunc; - const u32 cbArg; + const vm::ptr cbArg; const u32 spec; //addr std::vector raw_data; // demultiplexed data stream (managed by demuxer thread) @@ -208,13 +208,13 @@ public: const u32 memAddr; const u32 memSize; const vm::ptr cbFunc; - const u32 cbArg; + const vm::ptr cbArg; volatile bool is_finished = false; volatile bool is_closed = false; atomic_t is_running = false; atomic_t is_working = false; - Demuxer(u32 addr, u32 size, vm::ptr func, u32 arg) + Demuxer(u32 addr, u32 size, vm::ptr func, vm::ptr arg) : ppu_thread({}, "", 0) , memAddr(addr) , memSize(size) @@ -755,11 +755,11 @@ PesHeader::PesHeader(DemuxerStream& stream) is_ok = true; } -ElementaryStream::ElementaryStream(Demuxer* dmux, u32 addr, u32 size, u32 fidMajor, u32 fidMinor, u32 sup1, u32 sup2, vm::ptr cbFunc, u32 cbArg, u32 spec) - : put(utils::align(addr, 128)) +ElementaryStream::ElementaryStream(Demuxer* dmux, vm::ptr addr, u32 size, u32 fidMajor, u32 fidMinor, u32 sup1, u32 sup2, vm::ptr cbFunc, vm::ptr cbArg, u32 spec) + : put(utils::align(addr.addr(), 128)) , dmux(dmux) - , memAddr(utils::align(addr, 128)) - , memSize(size - (addr - memAddr)) + , memAddr(vm::ptr::make(utils::align(addr.addr(), 128))) + , memSize(size - (addr.addr() - memAddr.addr())) , fidMajor(fidMajor) , fidMinor(fidMinor) , sup1(sup1) @@ -788,9 +788,9 @@ bool ElementaryStream::is_full(u32 space) { return first - put < space + 128; } - else if (put + space + 128 > memAddr + memSize) + else if (put + space + 128 > memAddr.addr() + memSize) { - return first - memAddr < space + 128; + return first - memAddr.addr() < space + 128; } else { @@ -816,35 +816,35 @@ void ElementaryStream::push_au(u32 size, u64 dts, u64 pts, u64 userdata, bool ra std::lock_guard lock(m_mutex); ensure(!is_full(size)); - if (put + size + 128 > memAddr + memSize) + if (put + size + 128 > memAddr.addr() + memSize) { - put = memAddr; + put = memAddr.addr(); } std::memcpy(vm::base(put + 128), raw_data.data(), size); raw_data.erase(raw_data.begin(), raw_data.begin() + size); auto info = vm::ptr::make(put); - info->auAddr = put + 128; + info->auAddr.set(put + 128); info->auSize = size; info->dts.lower = static_cast(dts); info->dts.upper = static_cast(dts >> 32); info->pts.lower = static_cast(pts); info->pts.upper = static_cast(pts >> 32); info->isRap = rap; - info->reserved = 0; + info->auMaxSize = 0; info->userData = userdata; auto spec = vm::ptr::make(put + u32{sizeof(CellDmuxAuInfoEx)}); *spec = specific; auto inf = vm::ptr::make(put + 64); - inf->auAddr = put + 128; + inf->auAddr.set(put + 128); inf->auSize = size; - inf->dtsLower = static_cast(dts); - inf->dtsUpper = static_cast(dts >> 32); - inf->ptsLower = static_cast(pts); - inf->ptsUpper = static_cast(pts >> 32); + inf->dts.lower = static_cast(dts); + inf->dts.upper = static_cast(dts >> 32); + inf->pts.lower = static_cast(pts); + inf->pts.upper = static_cast(pts >> 32); inf->auMaxSize = 0; // ????? inf->userData = userdata; @@ -927,7 +927,7 @@ bool ElementaryStream::peek(u32& out_data, bool no_ex, u32& out_spec, bool updat void ElementaryStream::reset() { std::lock_guard lock(m_mutex); - put = memAddr; + put = memAddr.addr(); entries.clear(); put_count = 0; got_count = 0; diff --git a/rpcs3/Emu/Cell/Modules/cellDmux.h b/rpcs3/Emu/Cell/Modules/cellDmux.h index 7c31bbf105..dc17cb3314 100644 --- a/rpcs3/Emu/Cell/Modules/cellDmux.h +++ b/rpcs3/Emu/Cell/Modules/cellDmux.h @@ -33,118 +33,6 @@ enum CellDmuxEsMsgType : s32 CELL_DMUX_ES_MSG_TYPE_FLUSH_DONE = 1, }; -enum CellDmuxPamfM2vLevel : s32 -{ - CELL_DMUX_PAMF_M2V_MP_LL = 0, - CELL_DMUX_PAMF_M2V_MP_ML, - CELL_DMUX_PAMF_M2V_MP_H14, - CELL_DMUX_PAMF_M2V_MP_HL, -}; - -enum CellDmuxPamfAvcLevel : s32 -{ - CELL_DMUX_PAMF_AVC_LEVEL_2P1 = 21, - CELL_DMUX_PAMF_AVC_LEVEL_3P0 = 30, - CELL_DMUX_PAMF_AVC_LEVEL_3P1 = 31, - CELL_DMUX_PAMF_AVC_LEVEL_3P2 = 32, - CELL_DMUX_PAMF_AVC_LEVEL_4P1 = 41, - CELL_DMUX_PAMF_AVC_LEVEL_4P2 = 42, -}; - -struct CellDmuxPamfAuSpecificInfoM2v -{ - be_t reserved1; -}; - -struct CellDmuxPamfAuSpecificInfoAvc -{ - be_t reserved1; -}; - -struct CellDmuxPamfAuSpecificInfoLpcm -{ - u8 channelAssignmentInfo; - u8 samplingFreqInfo; - u8 bitsPerSample; -}; - -struct CellDmuxPamfAuSpecificInfoAc3 -{ - be_t reserved1; -}; - -struct CellDmuxPamfAuSpecificInfoAtrac3plus -{ - be_t reserved1; -}; - -struct CellDmuxPamfAuSpecificInfoUserData -{ - be_t reserved1; -}; - -struct CellDmuxPamfEsSpecificInfoM2v -{ - be_t profileLevel; -}; - -struct CellDmuxPamfEsSpecificInfoAvc -{ - be_t level; -}; - -struct CellDmuxPamfEsSpecificInfoLpcm -{ - be_t samplingFreq; - be_t numOfChannels; - be_t bitsPerSample; -}; - -struct CellDmuxPamfEsSpecificInfoAc3 -{ - be_t reserved1; -}; - -struct CellDmuxPamfEsSpecificInfoAtrac3plus -{ - be_t reserved1; -}; - -struct CellDmuxPamfEsSpecificInfoUserData -{ - be_t reserved1; -}; - -enum CellDmuxPamfSamplingFrequency : s32 -{ - CELL_DMUX_PAMF_FS_48K = 48000, -}; - -enum CellDmuxPamfBitsPerSample : s32 -{ - CELL_DMUX_PAMF_BITS_PER_SAMPLE_16 = 16, - CELL_DMUX_PAMF_BITS_PER_SAMPLE_24 = 24, -}; - -enum CellDmuxPamfLpcmChannelAssignmentInfo : s32 -{ - CELL_DMUX_PAMF_LPCM_CH_M1 = 1, - CELL_DMUX_PAMF_LPCM_CH_LR = 3, - CELL_DMUX_PAMF_LPCM_CH_LRCLSRSLFE = 9, - CELL_DMUX_PAMF_LPCM_CH_LRCLSCS1CS2RSLFE = 11, -}; - -enum CellDmuxPamfLpcmFs : s32 -{ - CELL_DMUX_PAMF_LPCM_FS_48K = 1, -}; - -enum CellDmuxPamfLpcmBitsPerSamples : s32 -{ - CELL_DMUX_PAMF_LPCM_BITS_PER_SAMPLE_16 = 1, - CELL_DMUX_PAMF_LPCM_BITS_PER_SAMPLE_24 = 3, -}; - struct CellDmuxMsg { be_t msgType; // CellDmuxMsgType @@ -163,12 +51,6 @@ struct CellDmuxType be_t reserved[2]; }; -struct CellDmuxPamfSpecificInfo -{ - be_t thisSize; - b8 programEndCodeCb; -}; - struct CellDmuxType2 { be_t streamType; // CellDmuxStreamType @@ -177,7 +59,7 @@ struct CellDmuxType2 struct CellDmuxResource { - be_t memAddr; + vm::bptr memAddr; be_t memSize; be_t ppuThreadPriority; be_t ppuThreadStackSize; @@ -187,7 +69,7 @@ struct CellDmuxResource struct CellDmuxResourceEx { - be_t memAddr; + vm::bptr memAddr; be_t memSize; be_t ppuThreadPriority; be_t ppuThreadStackSize; @@ -227,16 +109,16 @@ struct CellDmuxResource2 be_t shit[4]; }; -using CellDmuxCbMsg = u32(u32 demuxerHandle, vm::ptr demuxerMsg, u32 cbArg); +using CellDmuxCbMsg = u32(u32 demuxerHandle, vm::cptr demuxerMsg, vm::ptr cbArg); -using CellDmuxCbEsMsg = u32(u32 demuxerHandle, u32 esHandle, vm::ptr esMsg, u32 cbArg); +using CellDmuxCbEsMsg = u32(u32 demuxerHandle, u32 esHandle, vm::cptr esMsg, vm::ptr cbArg); // Used for internal callbacks as well template struct DmuxCb { vm::bptr cbFunc; - be_t cbArg; + vm::bptr cbArg; }; using CellDmuxCb = DmuxCb; @@ -250,42 +132,50 @@ struct CellDmuxAttr be_t demuxerVerLower; }; +struct CellDmuxPamfAttr +{ + be_t maxEnabledEsNum; + be_t version; + be_t memSize; +}; + struct CellDmuxEsAttr { be_t memSize; }; +struct CellDmuxPamfEsAttr +{ + be_t auQueueMaxSize; + be_t memSize; + be_t specificInfoSize; +}; + struct CellDmuxEsResource { - be_t memAddr; + vm::bptr memAddr; be_t memSize; }; struct CellDmuxAuInfo { - be_t auAddr; + vm::bptr auAddr; be_t auSize; be_t auMaxSize; - be_t userData; - be_t ptsUpper; - be_t ptsLower; - be_t dtsUpper; - be_t dtsLower; -}; - -struct CellDmuxAuInfoEx -{ - be_t auAddr; - be_t auSize; - be_t reserved; b8 isRap; be_t userData; CellCodecTimeStamp pts; CellCodecTimeStamp dts; }; -struct CellDmuxPamfAttr; -struct CellDmuxPamfEsAttr; +using CellDmuxAuInfoEx = CellDmuxAuInfo; + +struct DmuxAuInfo +{ + CellDmuxAuInfo info; + vm::bptr specific_info; + be_t specific_info_size; +}; using DmuxNotifyDemuxDone = error_code(vm::ptr, u32, vm::ptr); using DmuxNotifyFatalErr = error_code(vm::ptr, u32, vm::ptr); diff --git a/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp b/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp index 7c0fd8ec39..cc2fd6af42 100644 --- a/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp +++ b/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp @@ -1,6 +1,11 @@ #include "stdafx.h" #include "Emu/Cell/PPUModule.h" +#include "Emu/Cell/lv2/sys_cond.h" +#include "Emu/Cell/lv2/sys_mutex.h" +#include "Emu/Cell/lv2/sys_ppu_thread.h" #include "Emu/Cell/lv2/sys_sync.h" +#include "sysPrxForUser.h" +#include "util/asm.hpp" #include "cellDmuxPamf.h" #include @@ -10,6 +15,24 @@ vm::gvar g_cell_dmux_core_ops_raw_es; LOG_CHANNEL(cellDmuxPamf) +template <> +void fmt_class_string::format(std::string& out, u64 arg) +{ + format_enum(out, arg, [](CellDmuxPamfError value) + { + switch (value) + { + STR_CASE(CELL_DMUX_PAMF_ERROR_BUSY); + STR_CASE(CELL_DMUX_PAMF_ERROR_ARG); + STR_CASE(CELL_DMUX_PAMF_ERROR_UNKNOWN_STREAM); + STR_CASE(CELL_DMUX_PAMF_ERROR_NO_MEMORY); + STR_CASE(CELL_DMUX_PAMF_ERROR_FATAL); + } + + return unknown; + }); +} + inline std::pair dmuxPamfStreamIdToTypeChannel(u16 stream_id, u16 private_stream_id) { if ((stream_id & 0xf0) == 0xe0) @@ -1121,109 +1144,1659 @@ void dmux_pamf_spu_context::save(utils::serial& ar) // PPU thread +template +void DmuxPamfContext::send_spu_command_and_wait(ppu_thread& ppu, bool waiting_for_spu_state, auto&&... cmd_params) +{ + if (!waiting_for_spu_state) + { + // The caller is supposed to own the mutex until the SPU thread has consumed the command, so the queue should always be empty here + ensure(cmd_queue.emplace(type, std::forward(cmd_params)...), "The command queue wasn't empty"); + } + + lv2_obj::sleep(ppu); + + // Block until the SPU thread has consumed the command + cmd_result_queue.wait(); + + if (ppu.check_state()) + { + ppu.state += cpu_flag::again; + return; + } + + be_t result{}; + ensure(cmd_result_queue.pop(result), "The result queue was empty"); + ensure(result == static_cast(type) + 1, "The HLE SPU thread sent an invalid result"); +} + +DmuxPamfElementaryStream* DmuxPamfContext::find_es(u16 stream_id, u16 private_stream_id) +{ + const auto it = dmuxPamfStreamIdToTypeChannel(stream_id, private_stream_id).first == DMUX_PAMF_STREAM_TYPE_INDEX_VIDEO + ? std::ranges::find_if(elementary_streams | std::views::reverse, [&](const auto& es){ return es && es->stream_id == stream_id; }) + : std::ranges::find_if(elementary_streams | std::views::reverse, [&](const auto& es){ return es && es->stream_id == stream_id && es->private_stream_id == private_stream_id; }); + + return it != std::ranges::rend(elementary_streams) ? it->get_ptr() : nullptr; +} + +error_code DmuxPamfContext::wait_au_released_or_stream_reset(ppu_thread& ppu, u64 au_queue_full_bitset, b8& stream_reset_started, dmux_pamf_state& savestate) +{ + if (savestate == dmux_pamf_state::waiting_for_au_released) + { + goto label1_waiting_for_au_released_state; + } + + if (sys_mutex_lock(ppu, mutex, 0) != CELL_OK) + { + return CELL_DMUX_PAMF_ERROR_FATAL; + } + + if (ppu.state & cpu_flag::again) + { + return {}; + } + + if (au_queue_full_bitset) + { + cellDmuxPamf.trace("Access unit queue of elementary stream no. %d is full. Waiting for access unit to be released...", std::countr_zero(au_queue_full_bitset)); + + while (!(au_queue_full_bitset & au_released_bitset) && !stream_reset_requested) + { + savestate = dmux_pamf_state::waiting_for_au_released; + label1_waiting_for_au_released_state: + + if (sys_cond_wait(ppu, cond, 0) != CELL_OK) + { + sys_mutex_unlock(ppu, mutex); + return CELL_DMUX_PAMF_ERROR_FATAL; + } + + if (ppu.state & cpu_flag::again) + { + return {}; + } + } + + cellDmuxPamf.trace("Access unit released"); + } + + stream_reset_started = stream_reset_requested; + stream_reset_requested = false; + + au_released_bitset = 0; + + return sys_mutex_unlock(ppu, mutex) != CELL_OK ? static_cast(CELL_DMUX_PAMF_ERROR_FATAL) : CELL_OK; +} + +template +error_code DmuxPamfContext::set_au_reset(ppu_thread& ppu) +{ + if (sys_mutex_lock(ppu, mutex, 0) != CELL_OK) + { + return CELL_DMUX_PAMF_ERROR_FATAL; + } + + if (ppu.state & cpu_flag::again) + { + return {}; + } + + std::ranges::for_each(elementary_streams | std::views::filter([](auto es){ return !!es; }), [](auto& reset_next_au) { reset_next_au = reset; }, &DmuxPamfElementaryStream::reset_next_au); + + return sys_mutex_unlock(ppu, mutex) == CELL_OK ? static_cast(CELL_OK) : CELL_DMUX_PAMF_ERROR_FATAL; +} + +template +error_code DmuxPamfContext::callback(ppu_thread& ppu, DmuxCb cb, auto&&... args) +{ + std::unique_lock savestate_lock{ g_fxo->get(), std::try_to_lock }; + + if (!savestate_lock.owns_lock()) + { + ppu.state += cpu_flag::again; + return {}; + } + + return cb.cbFunc(ppu, std::forward(args)..., cb.cbArg); +} + +void DmuxPamfContext::run_spu_thread() +{ + hle_spu_thread_id = idm::make(cmd_queue_addr, cmd_result_queue_addr, stream_info_queue_addr, event_queue_addr); +} + +void DmuxPamfContext::exec(ppu_thread& ppu) +{ + // These are repeated a lot in this function, in my opinion using defines here makes it more readable +#define SEND_FATAL_ERR_AND_CONTINUE()\ + savestate = dmux_pamf_state::sending_fatal_err;\ + callback(ppu, notify_fatal_err, _this, CELL_OK); /* LLE uses CELL_OK as error code */\ + if (ppu.state & cpu_flag::again)\ + {\ + return;\ + }\ + continue + +#define RETURN_ON_CPU_FLAG_AGAIN()\ + if (ppu.state & cpu_flag::again)\ + return + + switch (savestate) + { + case dmux_pamf_state::initial: break; + case dmux_pamf_state::waiting_for_au_released: goto label1_waiting_for_au_released_state; + case dmux_pamf_state::waiting_for_au_released_error: goto label2_waiting_for_au_released_error_state; + case dmux_pamf_state::waiting_for_event: goto label3_waiting_for_event_state; + case dmux_pamf_state::starting_demux_done: goto label4_starting_demux_done_state; + case dmux_pamf_state::starting_demux_done_mutex_lock_error: goto label5_starting_demux_done_mutex_lock_error_state; + case dmux_pamf_state::starting_demux_done_mutex_unlock_error: goto label6_starting_demux_done_mutex_unlock_error_state; + case dmux_pamf_state::starting_demux_done_checking_stream_reset: goto label7_starting_demux_done_check_stream_reset_state; + case dmux_pamf_state::starting_demux_done_checking_stream_reset_error: goto label8_start_demux_done_check_stream_reset_error_state; + case dmux_pamf_state::setting_au_reset: goto label9_setting_au_reset_state; + case dmux_pamf_state::setting_au_reset_error: goto label10_setting_au_reset_error_state; + case dmux_pamf_state::processing_event: goto label11_processing_event_state; + case dmux_pamf_state::au_found_waiting_for_spu: goto label12_au_found_waiting_for_spu_state; + case dmux_pamf_state::unsetting_au_cancel: goto label13_unsetting_au_cancel_state; + case dmux_pamf_state::demux_done_notifying: goto label14_demux_done_notifying_state; + case dmux_pamf_state::demux_done_mutex_lock: goto label15_demux_done_mutex_lock_state; + case dmux_pamf_state::demux_done_cond_signal: goto label16_demux_done_cond_signal_state; + case dmux_pamf_state::resuming_demux_mutex_lock: goto label17_resuming_demux_mutex_lock_state; + case dmux_pamf_state::resuming_demux_waiting_for_spu: goto label18_resuming_demux_waiting_for_spu_state; + case dmux_pamf_state::sending_fatal_err: + callback(ppu, notify_fatal_err, _this, CELL_OK); + RETURN_ON_CPU_FLAG_AGAIN(); + } + + for (;;) + { + savestate = dmux_pamf_state::initial; + + stream_reset_started = false; + + // If the access unit queue of an enabled elementary stream is full, wait until the user releases an access unit or requests a stream reset before processing the next event + label1_waiting_for_au_released_state: + + if (wait_au_released_or_stream_reset(ppu, au_queue_full_bitset, stream_reset_started, savestate) != CELL_OK) + { + savestate = dmux_pamf_state::waiting_for_au_released_error; + label2_waiting_for_au_released_error_state: + + callback(ppu, notify_fatal_err, _this, CELL_OK); + } + + RETURN_ON_CPU_FLAG_AGAIN(); + + // Wait for the next event + if (!event_queue.peek(event)) + { + savestate = dmux_pamf_state::waiting_for_event; + label3_waiting_for_event_state: + + cellDmuxPamf.trace("Waiting for the next event..."); + + lv2_obj::sleep(ppu); + event_queue.wait(); + + if (ppu.check_state()) + { + ppu.state += cpu_flag::again; + return; + } + + ensure(event_queue.peek(event)); + } + + cellDmuxPamf.trace("Event type: %d", static_cast(event.type.get())); + + // If the event is a demux done event, set the sequence state to resetting and check for a potential stream reset request again + if (event.type == DmuxPamfEventType::demux_done) + { + savestate = dmux_pamf_state::starting_demux_done; + label4_starting_demux_done_state: + + if (sys_mutex_lock(ppu, mutex, 0) != CELL_OK) + { + savestate = dmux_pamf_state::starting_demux_done_mutex_lock_error; + label5_starting_demux_done_mutex_lock_error_state: + + callback(ppu, notify_fatal_err, _this, CELL_OK); + } + + RETURN_ON_CPU_FLAG_AGAIN(); + + sequence_state = DmuxPamfSequenceState::resetting; + + if (sys_mutex_unlock(ppu, mutex) != CELL_OK) + { + savestate = dmux_pamf_state::starting_demux_done_mutex_unlock_error; + label6_starting_demux_done_mutex_unlock_error_state: + + callback(ppu, notify_fatal_err, _this, CELL_OK); + + RETURN_ON_CPU_FLAG_AGAIN(); + } + + if (!stream_reset_started) + { + savestate = dmux_pamf_state::starting_demux_done_checking_stream_reset; + label7_starting_demux_done_check_stream_reset_state: + + if (wait_au_released_or_stream_reset(ppu, 0, stream_reset_started, savestate) != CELL_OK) + { + savestate = dmux_pamf_state::starting_demux_done_checking_stream_reset_error; + label8_start_demux_done_check_stream_reset_error_state: + + callback(ppu, notify_fatal_err, _this, CELL_OK); + } + + RETURN_ON_CPU_FLAG_AGAIN(); + } + } + + // If the user requested a stream reset, set the reset flag for every enabled elementary stream + if (stream_reset_started) + { + stream_reset_in_progress = true; + + savestate = dmux_pamf_state::setting_au_reset; + label9_setting_au_reset_state: + + if (set_au_reset(ppu) != CELL_OK) + { + savestate = dmux_pamf_state::setting_au_reset_error; + label10_setting_au_reset_error_state: + + callback(ppu, notify_fatal_err, _this, CELL_OK); + } + + RETURN_ON_CPU_FLAG_AGAIN(); + } + + savestate = dmux_pamf_state::processing_event; + label11_processing_event_state: + + switch (event.type) + { + case DmuxPamfEventType::au_found: + { + if (sys_mutex_lock(ppu, mutex, 0) != CELL_OK) + { + SEND_FATAL_ERR_AND_CONTINUE(); + } + + RETURN_ON_CPU_FLAG_AGAIN(); + + label12_au_found_waiting_for_spu_state: + + DmuxPamfElementaryStream* const es = find_es(event.au_found.stream_id, event.au_found.private_stream_id); + + // If the elementary stream of the found access unit is not enabled, don't do anything + if (!es || es->_this.get_ptr() != es || es->es_id != event.au_found.user_data) + { + if (sys_mutex_unlock(ppu, mutex) != CELL_OK) + { + SEND_FATAL_ERR_AND_CONTINUE(); + } + + break; + } + + // If a stream reset was requested, don't notify the user of any found access units that are still in the event queue + // We need to send the SPU thread the address of the first found access unit for each elementary stream still in the event queue, + // so that it can remove the access units from the queue. + if (stream_reset_in_progress) + { + if (es->reset_next_au) + { + send_spu_command_and_wait(ppu, savestate == dmux_pamf_state::au_found_waiting_for_spu, + event.au_found.stream_id, event.au_found.private_stream_id, event.au_found.au_addr); + + if (ppu.state & cpu_flag::again) + { + savestate = dmux_pamf_state::au_found_waiting_for_spu; + return; + } + + es->reset_next_au = false; + } + + if (sys_mutex_unlock(ppu, mutex) != CELL_OK) + { + SEND_FATAL_ERR_AND_CONTINUE(); + } + + break; + } + + const vm::var au_info; + au_info->addr = std::bit_cast>(event.au_found.au_addr); + au_info->size = event.au_found.au_size; + au_info->pts = event.au_found.pts; + au_info->dts = event.au_found.dts; + au_info->user_data = user_data; + au_info->specific_info = es->_this.ptr(&DmuxPamfElementaryStream::au_specific_info); + au_info->specific_info_size = es->au_specific_info_size; + au_info->is_rap = static_cast(event.au_found.is_rap); + + if (!is_raw_es) + { + if (dmuxPamfStreamIdToTypeChannel(event.au_found.stream_id, event.au_found.private_stream_id).first == DMUX_PAMF_STREAM_TYPE_INDEX_LPCM) + { + es->au_specific_info[0] = read_from_ptr(event.au_found.stream_header_buf) >> 4; + es->au_specific_info[1] = read_from_ptr(event.au_found.stream_header_buf) & 0xf; + es->au_specific_info[2] = read_from_ptr(&event.au_found.stream_header_buf[1]) >> 6; + } + } + + if (sys_mutex_unlock(ppu, mutex) != CELL_OK) + { + SEND_FATAL_ERR_AND_CONTINUE(); + } + + if (callback(ppu, es->notify_au_found, es->_this, au_info) != CELL_OK) + { + // If the callback returns an error, the access unit queue for this elementary stream is full + au_queue_full_bitset |= 1ull << es->this_index; + continue; + } + + RETURN_ON_CPU_FLAG_AGAIN(); + + break; + } + case DmuxPamfEventType::demux_done: + { + if (stream_reset_in_progress) + { + stream_reset_in_progress = false; + + savestate = dmux_pamf_state::unsetting_au_cancel; + label13_unsetting_au_cancel_state: + + if (set_au_reset(ppu) != CELL_OK) + { + SEND_FATAL_ERR_AND_CONTINUE(); + } + + RETURN_ON_CPU_FLAG_AGAIN(); + } + + savestate = dmux_pamf_state::demux_done_notifying; + label14_demux_done_notifying_state: + + callback(ppu, notify_demux_done, _this, CELL_OK); + + RETURN_ON_CPU_FLAG_AGAIN(); + + savestate = dmux_pamf_state::demux_done_mutex_lock; + label15_demux_done_mutex_lock_state: + + if (sys_mutex_lock(ppu, mutex, 0) != CELL_OK) + { + SEND_FATAL_ERR_AND_CONTINUE(); + } + + RETURN_ON_CPU_FLAG_AGAIN(); + + if (sequence_state == DmuxPamfSequenceState::resetting) + { + sequence_state = DmuxPamfSequenceState::dormant; + + savestate = dmux_pamf_state::demux_done_cond_signal; + label16_demux_done_cond_signal_state: + + if (sys_cond_signal_all(ppu, cond) != CELL_OK) + { + sys_mutex_unlock(ppu, mutex); + SEND_FATAL_ERR_AND_CONTINUE(); + } + + RETURN_ON_CPU_FLAG_AGAIN(); + } + + if (sys_mutex_unlock(ppu, mutex) != CELL_OK) + { + SEND_FATAL_ERR_AND_CONTINUE(); + } + + break; + } + case DmuxPamfEventType::close: + { + while (event_queue.pop()){} // Clear the event queue + return; + } + case DmuxPamfEventType::flush_done: + { + if (sys_mutex_lock(ppu, mutex, 0) != CELL_OK) + { + SEND_FATAL_ERR_AND_CONTINUE(); + } + + RETURN_ON_CPU_FLAG_AGAIN(); + + DmuxPamfElementaryStream* const es = find_es(event.flush_done.stream_id, event.flush_done.private_stream_id); + const bool valid = es && es->_this.get_ptr() == es && es->es_id == event.flush_done.user_data; + + if (sys_mutex_unlock(ppu, mutex) != CELL_OK) + { + SEND_FATAL_ERR_AND_CONTINUE(); + } + + if (valid) + { + callback(ppu, es->notify_flush_done, es->_this); + + RETURN_ON_CPU_FLAG_AGAIN(); + } + + break; + } + case DmuxPamfEventType::prog_end_code: + { + callback(ppu, notify_prog_end_code, _this); + + RETURN_ON_CPU_FLAG_AGAIN(); + + break; + } + case DmuxPamfEventType::fatal_error: + { + ensure(event_queue.pop()); + + SEND_FATAL_ERR_AND_CONTINUE(); + } + default: + fmt::throw_exception("Invalid event"); + } + + ensure(event_queue.pop()); + + // If there are too many events enqueued, the SPU thread will stop demuxing until it receives a new command. + // Once the event queue size is reduced to two, send a resume command + if (enabled_es_num >= 0 && event_queue.size() == 2) + { + savestate = dmux_pamf_state::resuming_demux_mutex_lock; + label17_resuming_demux_mutex_lock_state: + + if (sys_mutex_lock(ppu, mutex, 0) != CELL_OK) + { + SEND_FATAL_ERR_AND_CONTINUE(); + } + + RETURN_ON_CPU_FLAG_AGAIN(); + + if (enabled_es_num >= 0) + { + ensure(cmd_queue.emplace(DmuxPamfCommandType::resume)); + + savestate = dmux_pamf_state::resuming_demux_waiting_for_spu; + label18_resuming_demux_waiting_for_spu_state: + + lv2_obj::sleep(ppu); + cmd_result_queue.wait(); + + if (ppu.check_state()) + { + ppu.state += cpu_flag::again; + return; + } + + ensure(cmd_result_queue.pop()); + } + + if (sys_mutex_unlock(ppu, mutex) != CELL_OK) + { + SEND_FATAL_ERR_AND_CONTINUE(); + } + } + + au_queue_full_bitset = 0; + } +} + +void dmuxPamfEntry(ppu_thread& ppu, vm::ptr dmux) +{ + dmux->exec(ppu); + + if (ppu.state & cpu_flag::again) + { + ppu.syscall_args[0] = dmux.addr(); + return; + } + + ppu_execute<&sys_ppu_thread_exit>(ppu, CELL_OK); +} + +error_code dmuxPamfVerifyEsSpecificInfo(u16 stream_id, u16 private_stream_id, bool is_avc, vm::cptr es_specific_info) +{ + // The meaning of error code value 5 in here is inconsistent with how it's used elsewhere for some reason + + if (!es_specific_info) + { + return CELL_OK; + } + + switch (dmuxPamfStreamIdToTypeChannel(stream_id, private_stream_id).first) + { + case DMUX_PAMF_STREAM_TYPE_INDEX_VIDEO: + if (is_avc) + { + if (const u32 level = vm::static_ptr_cast(es_specific_info)->level; + level != CELL_DMUX_PAMF_AVC_LEVEL_2P1 && level != CELL_DMUX_PAMF_AVC_LEVEL_3P0 && level != CELL_DMUX_PAMF_AVC_LEVEL_3P1 + && level != CELL_DMUX_PAMF_AVC_LEVEL_3P2 && level != CELL_DMUX_PAMF_AVC_LEVEL_4P1 && level != CELL_DMUX_PAMF_AVC_LEVEL_4P2) + { + return 5; + } + } + else if (vm::static_ptr_cast(es_specific_info)->profileLevel > CELL_DMUX_PAMF_M2V_MP_HL) + { + return 5; + } + + return CELL_OK; + + case DMUX_PAMF_STREAM_TYPE_INDEX_LPCM: + if (const auto [sampling_freq, nch, bps] = *vm::static_ptr_cast(es_specific_info); + sampling_freq != CELL_DMUX_PAMF_FS_48K || (nch != 1u && nch != 2u && nch != 6u && nch != 8u) || (bps != CELL_DMUX_PAMF_BITS_PER_SAMPLE_16 && bps != CELL_DMUX_PAMF_BITS_PER_SAMPLE_24)) + { + return 5; + } + + return CELL_OK; + + case DMUX_PAMF_STREAM_TYPE_INDEX_AC3: + case DMUX_PAMF_STREAM_TYPE_INDEX_ATRACX: + case DMUX_PAMF_STREAM_TYPE_INDEX_USER_DATA: + return CELL_OK; + + default: + return 5; + } +} + +template +u32 dmuxPamfGetAuSpecificInfoSize(u16 stream_id, u16 private_stream_id, bool is_avc) +{ + if constexpr (raw_es) + { + return 0; + } + + switch (dmuxPamfStreamIdToTypeChannel(stream_id, private_stream_id).first) + { + case DMUX_PAMF_STREAM_TYPE_INDEX_VIDEO: + if (is_avc) + { + return 4; // LLE returns four, even though CellDmuxPamfAuSpecificInfoAvc only has a reserved field like the others + } + + return 0; + + case DMUX_PAMF_STREAM_TYPE_INDEX_LPCM: + case DMUX_PAMF_STREAM_TYPE_INDEX_AC3: // LLE returns three, even though CellDmuxPamfAuSpecificInfoAc3 only has a reserved field like the others + return 3; + + case DMUX_PAMF_STREAM_TYPE_INDEX_ATRACX: + case DMUX_PAMF_STREAM_TYPE_INDEX_USER_DATA: + default: + return 0; + } +} + +u32 dmuxPamfGetAuQueueMaxSize(u16 stream_id, u16 private_stream_id) +{ + switch (dmuxPamfStreamIdToTypeChannel(stream_id, private_stream_id).first) + { + case DMUX_PAMF_STREAM_TYPE_INDEX_LPCM: + return 0x100; + + case DMUX_PAMF_STREAM_TYPE_INDEX_VIDEO: + case DMUX_PAMF_STREAM_TYPE_INDEX_AC3: + case DMUX_PAMF_STREAM_TYPE_INDEX_ATRACX: + case DMUX_PAMF_STREAM_TYPE_INDEX_USER_DATA: + return 0x40; + + default: + return 0; + } +} + +u32 dmuxPamfGetLpcmAuSize(vm::cptr lpcm_info) +{ + return lpcm_info->samplingFreq * lpcm_info->bitsPerSample * (lpcm_info->numOfChannels + (lpcm_info->numOfChannels & 1)) / 1600; // Streams with an odd number of channels contain an empty dummy channel +} + +u32 dmuxPamfGetAuQueueBufferSize(u16 stream_id, u16 private_stream_id, bool is_avc, vm::cptr es_specific_info) +{ + switch (dmuxPamfStreamIdToTypeChannel(stream_id, private_stream_id).first) + { + case DMUX_PAMF_STREAM_TYPE_INDEX_VIDEO: + if (is_avc) + { + if (!es_specific_info) + { + return 0x46a870; + } + + switch (vm::static_ptr_cast(es_specific_info)->level) + { + case CELL_DMUX_PAMF_AVC_LEVEL_2P1: return 0xb00c0; + case CELL_DMUX_PAMF_AVC_LEVEL_3P0: return 0x19f2e0; + case CELL_DMUX_PAMF_AVC_LEVEL_3P1: return 0x260120; + case CELL_DMUX_PAMF_AVC_LEVEL_3P2: return 0x35f6c0; + case CELL_DMUX_PAMF_AVC_LEVEL_4P1: return 0x45e870; + case CELL_DMUX_PAMF_AVC_LEVEL_4P2: // Same as below + default: return 0x46a870; + } + } + + if (es_specific_info && vm::static_ptr_cast(es_specific_info)->profileLevel > CELL_DMUX_PAMF_M2V_MP_ML) + { + return 0x255000; + } + + return 0x70000; + + case DMUX_PAMF_STREAM_TYPE_INDEX_LPCM: + { + if (!es_specific_info) + { + return 0x104380; + } + + const u32 nch = vm::static_ptr_cast(es_specific_info)->numOfChannels; + const u32 lpcm_au_size = dmuxPamfGetLpcmAuSize(vm::static_ptr_cast(es_specific_info)); + + if (vm::static_ptr_cast(es_specific_info)->samplingFreq <= 96000) + { + if (nch > 0 && nch <= 2) + { + return 0x20000 + lpcm_au_size; + } + + if (nch <= 6) + { + return 0x60000 + lpcm_au_size; + } + + if (nch <= 8) + { + return 0x80000 + lpcm_au_size; + } + + return lpcm_au_size; + } + + if (nch > 0 && nch <= 2) + { + return 0x60000 + lpcm_au_size; + } + + if (nch <= 6) + { + return 0x100000 + lpcm_au_size; + } + + return lpcm_au_size; + } + case DMUX_PAMF_STREAM_TYPE_INDEX_AC3: + return 0xa000; + + case DMUX_PAMF_STREAM_TYPE_INDEX_ATRACX: + return 0x6400; + + case DMUX_PAMF_STREAM_TYPE_INDEX_USER_DATA: + return 0x160000; + + default: + return 0; + } +} + +template +u32 dmuxPamfGetEsMemSize(u16 stream_id, u16 private_stream_id, bool is_avc, vm::cptr es_specific_info) +{ + return dmuxPamfGetAuSpecificInfoSize(stream_id, private_stream_id, is_avc) * dmuxPamfGetAuQueueMaxSize(stream_id, private_stream_id) + + dmuxPamfGetAuQueueBufferSize(stream_id, private_stream_id, is_avc, es_specific_info) + 0x7f + static_cast(sizeof(DmuxPamfElementaryStream)) + 0xf; +} + +error_code dmuxPamfNotifyDemuxDone(ppu_thread& ppu, [[maybe_unused]] vm::ptr core_handle, error_code error, vm::ptr handle) +{ + handle->notify_demux_done.cbFunc(ppu, handle, error, handle->notify_demux_done.cbArg); + return CELL_OK; +} + +error_code dmuxPamfNotifyProgEndCode(ppu_thread& ppu, [[maybe_unused]] vm::ptr core_handle, vm::ptr handle) +{ + if (handle->notify_prog_end_code.cbFunc) + { + handle->notify_prog_end_code.cbFunc(ppu, handle, handle->notify_prog_end_code.cbArg); + } + + return CELL_OK; +} + +error_code dmuxPamfNotifyFatalErr(ppu_thread& ppu, [[maybe_unused]] vm::ptr core_handle, error_code error, vm::ptr handle) +{ + handle->notify_fatal_err.cbFunc(ppu, handle, error, handle->notify_fatal_err.cbArg); + return CELL_OK; +} + +error_code dmuxPamfEsNotifyAuFound(ppu_thread& ppu, [[maybe_unused]] vm::ptr core_handle, vm::cptr au_info, vm::ptr handle) +{ + const vm::var _au_info; + _au_info->info.auAddr = au_info->addr; + _au_info->info.auSize = au_info->size; + _au_info->info.isRap = au_info->is_rap; + _au_info->info.userData = au_info->user_data; + _au_info->info.pts = au_info->pts; + _au_info->info.dts = au_info->dts; + _au_info->specific_info = au_info->specific_info; + _au_info->specific_info_size = au_info->specific_info_size; + // _au_info->info.auMaxSize is left uninitialized + + return handle->notify_au_found.cbFunc(ppu, handle, _au_info, handle->notify_au_found.cbArg); +} + +error_code dmuxPamfEsNotifyFlushDone(ppu_thread& ppu, [[maybe_unused]] vm::ptr core_handle, vm::ptr handle) +{ + return handle->notify_flush_done.cbFunc(ppu, handle, handle->notify_flush_done.cbArg); +} + error_code _CellDmuxCoreOpQueryAttr(vm::cptr pamfSpecificInfo, vm::ptr pamfAttr) { - cellDmuxPamf.todo("_CellDmuxCoreOpQueryAttr(pamfSpecificInfo=*0x%x, pamfAttr=*0x%x)", pamfSpecificInfo, pamfAttr); + cellDmuxPamf.notice("_CellDmuxCoreOpQueryAttr(pamfSpecificInfo=*0x%x, pamfAttr=*0x%x)", pamfSpecificInfo, pamfAttr); + + if (!pamfAttr || (pamfSpecificInfo && pamfSpecificInfo->thisSize != sizeof(CellDmuxPamfSpecificInfo))) + { + return CELL_DMUX_PAMF_ERROR_ARG; + } + + pamfAttr->maxEnabledEsNum = DMUX_PAMF_MAX_ENABLED_ES_NUM; + pamfAttr->version = DMUX_PAMF_VERSION; + pamfAttr->memSize = sizeof(CellDmuxPamfHandle) + sizeof(DmuxPamfContext) + 0xe7b; return CELL_OK; } -error_code _CellDmuxCoreOpOpen(vm::cptr pamfSpecificInfo, vm::cptr demuxerResource, vm::cptr demuxerResourceSpurs, vm::cptr> notifyDemuxDone, - vm::cptr> notifyProgEndCode, vm::cptr> notifyFatalErr, vm::pptr handle) +error_code DmuxPamfContext::open(ppu_thread& ppu, const CellDmuxPamfResource& res, const DmuxCb& notify_dmux_done, const DmuxCb& notify_prog_end_code, + const DmuxCb& notify_fatal_err, vm::bptr& handle) { - cellDmuxPamf.todo("_CellDmuxCoreOpOpen(pamfSpecificInfo=*0x%x, demuxerResource=*0x%x, demuxerResourceSpurs=*0x%x, notifyDemuxDone=*0x%x, notifyProgEndCode=*0x%x, notifyFatalErr=*0x%x, handle=**0x%x)", + if (res.ppuThreadPriority >= 0xc00u || res.ppuThreadStackSize < 0x1000u || res.spuThreadPriority >= 0x100u || res.numOfSpus != 1u || !res.memAddr || res.memSize < sizeof(DmuxPamfContext) + 0xe7b) + { + return CELL_DMUX_PAMF_ERROR_ARG; + } + + const auto _this = vm::ptr::make(utils::align(+res.memAddr.addr(), 0x80)); + + _this->_this = _this; + _this->this_size = res.memSize; + _this->version = DMUX_PAMF_VERSION; + _this->notify_demux_done = notify_dmux_done; + _this->notify_prog_end_code = notify_prog_end_code; + _this->notify_fatal_err = notify_fatal_err; + _this->resource = res; + _this->unk = 0; + _this->ppu_thread_stack_size = res.ppuThreadStackSize; + _this->au_released_bitset = 0; + _this->stream_reset_requested = false; + _this->sequence_state = DmuxPamfSequenceState::dormant; + _this->max_enabled_es_num = DMUX_PAMF_MAX_ENABLED_ES_NUM; + _this->enabled_es_num = 0; + std::ranges::fill(_this->elementary_streams, vm::null); + _this->next_es_id = 0; + + const vm::var mutex_attr = {{ SYS_SYNC_PRIORITY, SYS_SYNC_NOT_RECURSIVE, SYS_SYNC_NOT_PROCESS_SHARED, SYS_SYNC_NOT_ADAPTIVE, 0, 0, 0, { "_dxpmtx"_u64 } }}; + const vm::var cond_attr = {{ SYS_SYNC_NOT_PROCESS_SHARED, 0, 0, { "_dxpcnd"_u64 } }}; + + if (sys_mutex_create(ppu, _this.ptr(&DmuxPamfContext::mutex), mutex_attr) != CELL_OK + || sys_cond_create(ppu, _this.ptr(&DmuxPamfContext::cond), _this->mutex, cond_attr) != CELL_OK) + { + return CELL_DMUX_PAMF_ERROR_FATAL; + } + + _this->spurs_context_addr = _this.ptr(&DmuxPamfContext::spurs_context); + _this->cmd_queue_addr_ = _this.ptr(&DmuxPamfContext::cmd_queue); + _this->cmd_queue_buffer_addr_ = _this.ptr(&DmuxPamfContext::cmd_queue_buffer); + _this->cmd_queue_addr = _this.ptr(&DmuxPamfContext::cmd_queue); + _this->cmd_result_queue_addr = _this.ptr(&DmuxPamfContext::cmd_result_queue); + _this->stream_info_queue_addr = _this.ptr(&DmuxPamfContext::stream_info_queue); + _this->event_queue_addr = _this.ptr(&DmuxPamfContext::event_queue); + _this->cmd_queue_buffer_addr = _this.ptr(&DmuxPamfContext::cmd_queue_buffer); + _this->cmd_result_queue_buffer_addr = _this.ptr(&DmuxPamfContext::cmd_result_queue_buffer); + _this->event_queue_buffer_addr = _this.ptr(&DmuxPamfContext::event_queue_buffer); + _this->stream_info_queue_buffer_addr = _this.ptr(&DmuxPamfContext::stream_info_queue_buffer); + _this->cmd_queue_addr__ = _this.ptr(&DmuxPamfContext::cmd_queue); + + ensure(std::snprintf(_this->spurs_taskset_name, sizeof(_this->spurs_taskset_name), "_libdmux_pamf_%08x", _this.addr()) == 22); + + _this->cmd_queue.init(_this->cmd_queue_buffer); + _this->cmd_result_queue.init(_this->cmd_result_queue_buffer); + _this->stream_info_queue.init(_this->stream_info_queue_buffer); + _this->event_queue.init(_this->event_queue_buffer); + + // HLE exclusive + _this->savestate = {}; + _this->au_queue_full_bitset = 0; + _this->stream_reset_started = false; + _this->stream_reset_in_progress = false; + + _this->run_spu_thread(); + + handle = _this; + return _this->create_thread(ppu); +} + +error_code _CellDmuxCoreOpOpen(ppu_thread& ppu, vm::cptr pamfSpecificInfo, vm::cptr demuxerResource, vm::cptr demuxerResourceSpurs, vm::cptr> notifyDemuxDone, + vm::cptr> notifyProgEndCode, vm::cptr> notifyFatalErr, vm::pptr handle) +{ + // Block savestates during ppu_execute + std::unique_lock savestate_lock{ g_fxo->get(), std::try_to_lock }; + + if (!savestate_lock.owns_lock()) + { + ppu.state += cpu_flag::again; + return {}; + } + + cellDmuxPamf.notice("_CellDmuxCoreOpOpen(pamfSpecificInfo=*0x%x, demuxerResource=*0x%x, demuxerResourceSpurs=*0x%x, notifyDemuxDone=*0x%x, notifyProgEndCode=*0x%x, notifyFatalErr=*0x%x, handle=**0x%x)", pamfSpecificInfo, demuxerResource, demuxerResourceSpurs, notifyDemuxDone, notifyProgEndCode, notifyFatalErr, handle); - return CELL_OK; + if ((pamfSpecificInfo && pamfSpecificInfo->thisSize != sizeof(CellDmuxPamfSpecificInfo)) + || !demuxerResource + || (demuxerResourceSpurs && !demuxerResourceSpurs->spurs) + || !notifyDemuxDone || !notifyDemuxDone->cbFunc || !notifyDemuxDone->cbArg + || !notifyProgEndCode + || !notifyFatalErr || !notifyFatalErr->cbFunc || !notifyFatalErr->cbArg + || !handle) + { + return CELL_DMUX_PAMF_ERROR_ARG; + } + + ensure(demuxerResource->memAddr.aligned(0x10)); // Not checked on LLE + + const auto _handle = vm::static_ptr_cast(demuxerResource->memAddr); + + _handle->notify_demux_done = *notifyDemuxDone; + _handle->notify_fatal_err = *notifyFatalErr; + _handle->notify_prog_end_code = *notifyProgEndCode; + + if (!pamfSpecificInfo || !pamfSpecificInfo->programEndCodeCb) + { + _handle->notify_prog_end_code.cbFunc = vm::null; + } + + const CellDmuxPamfResource res{ demuxerResource->ppuThreadPriority, demuxerResource->ppuThreadStackSize, demuxerResource->numOfSpus, demuxerResource->spuThreadPriority, + vm::bptr::make(demuxerResource->memAddr.addr() + sizeof(CellDmuxPamfHandle)), demuxerResource->memSize - sizeof(CellDmuxPamfHandle) }; + + const auto demux_done_func = vm::bptr::make(g_fxo->get().func_addr(FIND_FUNC(dmuxPamfNotifyDemuxDone))); + const auto prog_end_code_func = vm::bptr::make(g_fxo->get().func_addr(FIND_FUNC(dmuxPamfNotifyProgEndCode))); + const auto fatal_err_func = vm::bptr::make(g_fxo->get().func_addr(FIND_FUNC(dmuxPamfNotifyFatalErr))); + + const error_code ret = DmuxPamfContext::open(ppu, res, { demux_done_func, _handle }, { prog_end_code_func, _handle }, { fatal_err_func, _handle }, _handle->demuxer); + + *handle = _handle; + + return ret; } -error_code _CellDmuxCoreOpClose(vm::ptr handle) +error_code DmuxPamfContext::close(ppu_thread& ppu) { - cellDmuxPamf.todo("_CellDmuxCoreOpClose(handle=*0x%x)", handle); + if (join_thread(ppu) != CELL_OK) + { + return CELL_DMUX_PAMF_ERROR_FATAL; + } + + ensure(idm::remove(hle_spu_thread_id)); return CELL_OK; } -error_code _CellDmuxCoreOpResetStream(vm::ptr handle) +error_code _CellDmuxCoreOpClose(ppu_thread& ppu, vm::ptr handle) { - cellDmuxPamf.todo("_CellDmuxCoreOpResetStream(handle=*0x%x)", handle); + // The PPU thread is going to use ppu_execute + std::unique_lock savestate_lock{ g_fxo->get(), std::try_to_lock }; + + if (!savestate_lock.owns_lock()) + { + ppu.state += cpu_flag::again; + return {}; + } + + cellDmuxPamf.notice("_CellDmuxCoreOpClose(handle=*0x%x)", handle); + + if (!handle) + { + return CELL_DMUX_PAMF_ERROR_ARG; + } + + return handle->demuxer->close(ppu); +} + +error_code DmuxPamfContext::reset_stream(ppu_thread& ppu) +{ + auto& ar = *ppu.optional_savestate_state; + const u8 savestate = ar.try_read().second; + ar.clear(); + + switch (savestate) + { + case 0: + if (sys_mutex_lock(ppu, mutex, 0) != CELL_OK) + { + return CELL_DMUX_PAMF_ERROR_FATAL; + } + + if (ppu.state & cpu_flag::again) + { + ar(0); + return {}; + } + + if (sequence_state != DmuxPamfSequenceState::running) + { + return sys_mutex_unlock(ppu, mutex) == CELL_OK ? static_cast(CELL_OK) : CELL_DMUX_PAMF_ERROR_FATAL; + } + + [[fallthrough]]; + + case 1: + send_spu_command_and_wait(ppu, savestate); + + if (ppu.state & cpu_flag::again) + { + ar(1); + return {}; + } + + stream_reset_requested = true; + [[fallthrough]]; + + case 2: + if (const error_code ret = sys_cond_signal_to(ppu, cond, static_cast(thread_id)); ret != CELL_OK && ret != static_cast(CELL_EPERM)) + { + sys_mutex_unlock(ppu, mutex); + return CELL_DMUX_PAMF_ERROR_FATAL; + } + + if (ppu.state & cpu_flag::again) + { + ar(2); + return {}; + } + + return sys_mutex_unlock(ppu, mutex) == CELL_OK ? static_cast(CELL_OK) : CELL_DMUX_PAMF_ERROR_FATAL; + + default: + fmt::throw_exception("Unexpected savestate value: 0x%x", savestate); + } +} + +error_code _CellDmuxCoreOpResetStream(ppu_thread& ppu, vm::ptr handle) +{ + cellDmuxPamf.notice("_CellDmuxCoreOpResetStream(handle=*0x%x)", handle); + + if (!handle) + { + return CELL_DMUX_PAMF_ERROR_ARG; + } + + return handle->demuxer->reset_stream(ppu); +} + +error_code DmuxPamfContext::create_thread(ppu_thread& ppu) +{ + const vm::var name = vm::make_str("HLE PAMF demuxer"); + const auto entry = g_fxo->get().func_addr(FIND_FUNC(dmuxPamfEntry)); + + if (ppu_execute<&sys_ppu_thread_create>(ppu, _this.ptr(&DmuxPamfContext::thread_id), entry, +_this.addr(), +resource.ppuThreadPriority, +resource.ppuThreadStackSize, SYS_PPU_THREAD_CREATE_JOINABLE, +name) != CELL_OK) + { + return CELL_DMUX_PAMF_ERROR_FATAL; + } return CELL_OK; } -error_code _CellDmuxCoreOpCreateThread(vm::ptr handle) +error_code _CellDmuxCoreOpCreateThread(ppu_thread& ppu, vm::ptr handle) { - cellDmuxPamf.todo("_CellDmuxCoreOpCreateThread(handle=*0x%x)", handle); + // Block savestates during ppu_execute + std::unique_lock savestate_lock{ g_fxo->get(), std::try_to_lock }; - return CELL_OK; + if (!savestate_lock.owns_lock()) + { + ppu.state += cpu_flag::again; + return {}; + } + + cellDmuxPamf.notice("_CellDmuxCoreOpCreateThread(handle=*0x%x)", handle); + + if (!handle) + { + return CELL_DMUX_PAMF_ERROR_ARG; + } + + return handle->demuxer->create_thread(ppu); } -error_code _CellDmuxCoreOpJoinThread(vm::ptr handle) +error_code DmuxPamfContext::join_thread(ppu_thread& ppu) { - cellDmuxPamf.todo("_CellDmuxCoreOpJoinThread(handle=*0x%x)", handle); + if (sys_mutex_lock(ppu, mutex, 0) != CELL_OK) + { + return CELL_DMUX_PAMF_ERROR_FATAL; + } + + std::ranges::fill_n(elementary_streams, enabled_es_num, vm::null); + + enabled_es_num = -1; + + send_spu_command_and_wait(ppu, false); + + if (sys_mutex_unlock(ppu, mutex) != CELL_OK) + { + return CELL_DMUX_PAMF_ERROR_FATAL; + } + + return sys_ppu_thread_join(ppu, static_cast(thread_id), +vm::var{}) == CELL_OK ? static_cast(CELL_OK) : CELL_DMUX_PAMF_ERROR_FATAL; +} + +error_code _CellDmuxCoreOpJoinThread(ppu_thread& ppu, vm::ptr handle) +{ + // The PPU thread is going to use ppu_execute + std::unique_lock savestate_lock{ g_fxo->get(), std::try_to_lock }; + + if (!savestate_lock.owns_lock()) + { + ppu.state += cpu_flag::again; + return {}; + } + + cellDmuxPamf.notice("_CellDmuxCoreOpJoinThread(handle=*0x%x)", handle); + + if (!handle) + { + return CELL_DMUX_PAMF_ERROR_ARG; + } + + return handle->demuxer->join_thread(ppu); +} + +template +error_code DmuxPamfContext::set_stream(ppu_thread& ppu, vm::cptr stream_address, u32 stream_size, b8 discontinuity, u32 user_data) +{ + auto& ar = *ppu.optional_savestate_state; + const bool waiting_for_spu_state = ar.try_read().second; + ar.clear(); + + if (!waiting_for_spu_state) + { + if (sys_mutex_lock(ppu, mutex, 0) != CELL_OK) + { + return CELL_DMUX_PAMF_ERROR_FATAL; + } + + if (ppu.state & cpu_flag::again) + { + ar(false); + return {}; + } + + this->user_data = user_data; + + if (!stream_info_queue.emplace(stream_address, stream_size, user_data, !discontinuity, raw_es)) + { + return sys_mutex_unlock(ppu, mutex) == CELL_OK ? CELL_DMUX_PAMF_ERROR_BUSY : CELL_DMUX_PAMF_ERROR_FATAL; + } + } + + send_spu_command_and_wait(ppu, waiting_for_spu_state); + + if (ppu.state & cpu_flag::again) + { + ar(true); + return {}; + } + + sequence_state = DmuxPamfSequenceState::running; + + return sys_mutex_unlock(ppu, mutex) == CELL_OK ? static_cast(CELL_OK) : CELL_DMUX_PAMF_ERROR_FATAL; +} + +template +error_code _CellDmuxCoreOpSetStream(ppu_thread& ppu, vm::ptr handle, vm::cptr streamAddress, u32 streamSize, b8 discontinuity, u64 userData) +{ + cellDmuxPamf.trace("_CellDmuxCoreOpSetStream(handle=*0x%x, streamAddress=*0x%x, streamSize=0x%x, discontinuity=%d, userData=0x%llx)", raw_es, handle, streamAddress, streamSize, +discontinuity, userData); + + if (!streamAddress || streamSize == 0) + { + return CELL_DMUX_PAMF_ERROR_ARG; + } + + ensure(!!handle); // Not checked on LLE + + return handle->demuxer->set_stream(ppu, streamAddress, streamSize, discontinuity, static_cast(userData)); +} + +error_code DmuxPamfElementaryStream::release_au(ppu_thread& ppu, vm::ptr au_addr, u32 au_size) const +{ + auto& ar = *ppu.optional_savestate_state; + const u8 savestate = ar.try_read().second; + ar.clear(); + + switch (savestate) + { + case 0: + if (sys_mutex_lock(ppu, demuxer->mutex, 0) != CELL_OK) + { + return CELL_DMUX_PAMF_ERROR_FATAL; + } + + if (ppu.state & cpu_flag::again) + { + ar(0); + return {}; + } + + [[fallthrough]]; + + case 1: + demuxer->send_spu_command_and_wait(ppu, savestate, au_addr, au_size, static_cast>(stream_id), static_cast>(private_stream_id)); + + if (ppu.state & cpu_flag::again) + { + ar(1); + return {}; + } + + demuxer->au_released_bitset |= 1ull << this_index; + [[fallthrough]]; + + case 2: + if (const error_code ret = sys_cond_signal_to(ppu, demuxer->cond, static_cast(demuxer->thread_id)); ret != CELL_OK && ret != static_cast(CELL_EPERM)) + { + sys_mutex_unlock(ppu, demuxer->mutex); + return CELL_DMUX_PAMF_ERROR_FATAL; + } + + if (ppu.state & cpu_flag::again) + { + ar(2); + return {}; + } + + return sys_mutex_unlock(ppu, demuxer->mutex) == CELL_OK ? static_cast(CELL_OK) : CELL_DMUX_PAMF_ERROR_FATAL; + + default: + fmt::throw_exception("Unexpected savestate value: 0x%x", savestate); + } +} + +error_code _CellDmuxCoreOpReleaseAu(ppu_thread& ppu, vm::ptr esHandle, vm::ptr auAddr, u32 auSize) +{ + cellDmuxPamf.trace("_CellDmuxCoreOpReleaseAu(esHandle=*0x%x, auAddr=*0x%x, auSize=0x%x)", esHandle, auAddr, auSize); + + if (!auAddr || auSize == 0) + { + return CELL_DMUX_PAMF_ERROR_ARG; + } + + ensure(!!esHandle); // Not checked on LLE + + return esHandle->es->release_au(ppu, auAddr, auSize); +} + +template +error_code dmuxPamfGetEsAttr(u16 stream_id, u16 private_stream_id, bool is_avc, vm::cptr es_specific_info, CellDmuxPamfEsAttr& attr) +{ + if (dmuxPamfStreamIdToTypeChannel(stream_id, private_stream_id).first == DMUX_PAMF_STREAM_TYPE_INDEX_INVALID) + { + return CELL_DMUX_PAMF_ERROR_UNKNOWN_STREAM; + } + + if (dmuxPamfVerifyEsSpecificInfo(stream_id, private_stream_id, is_avc, es_specific_info) != CELL_OK) + { + return CELL_DMUX_PAMF_ERROR_ARG; + } + + attr.auQueueMaxSize = dmuxPamfGetAuQueueMaxSize(stream_id, private_stream_id); + attr.memSize = dmuxPamfGetEsMemSize(stream_id, private_stream_id, is_avc, es_specific_info); + attr.specificInfoSize = dmuxPamfGetAuSpecificInfoSize(stream_id, private_stream_id, is_avc); return CELL_OK; } template -error_code _CellDmuxCoreOpSetStream(vm::ptr handle, vm::cptr streamAddress, u32 streamSize, b8 discontinuity, u64 userData) +static inline std::tuple get_stream_ids(vm::cptr esFilterId) { - cellDmuxPamf.todo("_CellDmuxCoreOpSetStream(handle=*0x%x, streamAddress=*0x%x, streamSize=0x%x, discontinuity=%d, userData=0x%llx)", raw_es, handle, streamAddress, streamSize, +discontinuity, userData); + if constexpr (raw_es) + { + const auto filter_id = vm::static_ptr_cast(esFilterId); + return { filter_id[2], filter_id[3], filter_id[8] >> 7 }; + } - return CELL_OK; -} - -error_code _CellDmuxCoreOpReleaseAu(vm::ptr esHandle, vm::ptr memAddr, u32 memSize) -{ - cellDmuxPamf.todo("_CellDmuxCoreOpReleaseAu(esHandle=*0x%x, memAddr=*0x%x, memSize=0x%x)", esHandle, memAddr, memSize); - - return CELL_OK; + const auto filter_id = vm::static_ptr_cast(esFilterId); + return { filter_id->filterIdMajor, filter_id->filterIdMinor, filter_id->supplementalInfo1 }; } template error_code _CellDmuxCoreOpQueryEsAttr(vm::cptr esFilterId, vm::cptr esSpecificInfo, vm::ptr attr) { - cellDmuxPamf.todo("_CellDmuxCoreOpQueryEsAttr(esFilterId=*0x%x, esSpecificInfo=*0x%x, attr=*0x%x)", raw_es, esFilterId, esSpecificInfo, attr); + cellDmuxPamf.notice("_CellDmuxCoreOpQueryEsAttr(esFilterId=*0x%x, esSpecificInfo=*0x%x, attr=*0x%x)", raw_es, esFilterId, esSpecificInfo, attr); + if (!esFilterId || !attr) + { + return CELL_DMUX_PAMF_ERROR_ARG; + } + + const auto [stream_id, private_stream_id, is_avc] = get_stream_ids(esFilterId); + + CellDmuxPamfEsAttr es_attr; + + const error_code ret = dmuxPamfGetEsAttr(stream_id, private_stream_id, is_avc, esSpecificInfo, es_attr); + + *attr = es_attr; + attr->memSize += static_cast(sizeof(CellDmuxPamfEsHandle)); + + return ret; +} + +template +error_code DmuxPamfContext::enable_es(ppu_thread& ppu, u16 stream_id, u16 private_stream_id, bool is_avc, vm::cptr es_specific_info, vm::ptr mem_addr, u32 mem_size, const DmuxCb& notify_au_found, + const DmuxCb& notify_flush_done, vm::bptr& es) +{ + auto& ar = *ppu.optional_savestate_state; + const bool waiting_for_spu_state = ar.try_read().second; + ar.clear(); + + if (mem_size < dmuxPamfGetEsMemSize(stream_id, private_stream_id, is_avc, es_specific_info)) + { + return CELL_DMUX_PAMF_ERROR_ARG; + } + + const auto stream_type = dmuxPamfStreamIdToTypeChannel(stream_id, private_stream_id).first; + + if (!waiting_for_spu_state) + { + if (stream_type == DMUX_PAMF_STREAM_TYPE_INDEX_INVALID) + { + return CELL_DMUX_PAMF_ERROR_UNKNOWN_STREAM; + } + + if (dmuxPamfVerifyEsSpecificInfo(stream_id, private_stream_id, is_avc, es_specific_info) != CELL_OK) + { + return CELL_DMUX_PAMF_ERROR_ARG; + } + + if (const error_code ret = sys_mutex_lock(ppu, mutex, 0); ret != CELL_OK) + { + return CELL_DMUX_PAMF_ERROR_FATAL; + } + + if (ppu.state & cpu_flag::again) + { + ar(false); + return {}; + } + + this->is_raw_es = raw_es; + + if (enabled_es_num == max_enabled_es_num) + { + return sys_mutex_unlock(ppu, mutex) == CELL_OK ? CELL_DMUX_PAMF_ERROR_NO_MEMORY : CELL_DMUX_PAMF_ERROR_FATAL; + } + + if (find_es(stream_id, private_stream_id)) + { + // Elementary stream is already enabled + return sys_mutex_unlock(ppu, mutex) == CELL_OK ? CELL_DMUX_PAMF_ERROR_ARG : CELL_DMUX_PAMF_ERROR_FATAL; + } + } + + const be_t au_max_size = [&]() -> be_t + { + switch (stream_type) + { + case DMUX_PAMF_STREAM_TYPE_INDEX_VIDEO: + if (is_avc) + { + if (!es_specific_info || vm::static_ptr_cast(es_specific_info)->level == CELL_DMUX_PAMF_AVC_LEVEL_4P2) + { + return 0xcc000u; + } + + switch (vm::static_ptr_cast(es_specific_info)->level) + { + case CELL_DMUX_PAMF_AVC_LEVEL_2P1: return 0x12900u; + case CELL_DMUX_PAMF_AVC_LEVEL_3P0: return 0x25f80u; + case CELL_DMUX_PAMF_AVC_LEVEL_3P1: return 0x54600u; + case CELL_DMUX_PAMF_AVC_LEVEL_3P2: return 0x78000u; + case CELL_DMUX_PAMF_AVC_LEVEL_4P1: return 0xc0000u; + default: fmt::throw_exception("Unreachable"); // es_specific_info was already checked for invalid values in dmuxPamfVerifyEsSpecificInfo() + } + } + + if (!es_specific_info || vm::static_ptr_cast(es_specific_info)->profileLevel > CELL_DMUX_PAMF_M2V_MP_ML) + { + return 0x12a800u; + } + + return 0x38000u; + + case DMUX_PAMF_STREAM_TYPE_INDEX_LPCM: return dmuxPamfGetLpcmAuSize(vm::static_ptr_cast(es_specific_info)); + case DMUX_PAMF_STREAM_TYPE_INDEX_AC3: return 0xf00u; + case DMUX_PAMF_STREAM_TYPE_INDEX_ATRACX: return 0x1008u; + case DMUX_PAMF_STREAM_TYPE_INDEX_USER_DATA: return 0xa0000u; + default: fmt::throw_exception("Unreachable"); // stream_type was already checked + } + }(); + + const auto _es = vm::bptr::make(utils::align(mem_addr.addr(), 0x10)); + + const auto au_queue_buffer = vm::bptr::make(utils::align(_es.addr() + static_cast(sizeof(DmuxPamfElementaryStream)), 0x80)); + const be_t au_specific_info_size = dmuxPamfGetAuSpecificInfoSize(stream_id, private_stream_id, is_avc); + + send_spu_command_and_wait(ppu, waiting_for_spu_state, stream_id, private_stream_id, is_avc, au_queue_buffer, + dmuxPamfGetAuQueueBufferSize(stream_id, private_stream_id, is_avc, es_specific_info), au_max_size, au_specific_info_size, raw_es, next_es_id); + + if (ppu.state & cpu_flag::again) + { + ar(true); + return {}; + } + + u32 es_idx = umax; + while (elementary_streams[++es_idx]){} // There is guaranteed to be an empty slot, this was already checked above + + _es->_this = _es; + _es->this_size = mem_size; + _es->this_index = es_idx; + _es->demuxer = _this; + _es->notify_au_found = notify_au_found; + _es->notify_flush_done = notify_flush_done; + _es->stream_id = stream_id; + _es->private_stream_id = private_stream_id; + _es->is_avc = is_avc; + _es->au_queue_buffer = au_queue_buffer; + _es->au_max_size = au_max_size; + _es->au_specific_info_size = au_specific_info_size; + _es->reset_next_au = false; + _es->es_id = next_es_id++; + + elementary_streams[es_idx] = _es; + + enabled_es_num++; + + if (sys_mutex_unlock(ppu, mutex) != CELL_OK) + { + return CELL_DMUX_PAMF_ERROR_FATAL; + } + + es = _es; return CELL_OK; } template -error_code _CellDmuxCoreOpEnableEs(vm::ptr handle, vm::cptr esFilterId, vm::cptr esResource, vm::cptr> notifyAuFound, - vm::cptr> notifyFlushDone, vm::cptr esSpecificInfo, vm::pptr esHandle) +error_code _CellDmuxCoreOpEnableEs(ppu_thread& ppu, vm::ptr handle, vm::cptr esFilterId, vm::cptr esResource, vm::cptr> notifyAuFound, + vm::cptr> notifyFlushDone, vm::cptr esSpecificInfo, vm::pptr esHandle) { - cellDmuxPamf.todo("_CellDmuxCoreOpEnableEs(handle=*0x%x, esFilterId=*0x%x, esResource=*0x%x, notifyAuFound=*0x%x, notifyFlushDone=*0x%x, esSpecificInfo=*0x%x, esHandle)", + cellDmuxPamf.notice("_CellDmuxCoreOpEnableEs(handle=*0x%x, esFilterId=*0x%x, esResource=*0x%x, notifyAuFound=*0x%x, notifyFlushDone=*0x%x, esSpecificInfo=*0x%x, esHandle)", raw_es, handle, esFilterId, esResource, notifyAuFound, notifyFlushDone, esSpecificInfo, esHandle); - return CELL_OK; + if (!handle || !esFilterId || !esResource || !esResource->memAddr || esResource->memSize == 0u || !notifyAuFound || !notifyAuFound->cbFunc || !notifyAuFound->cbArg || !notifyFlushDone || !notifyFlushDone->cbFunc || !notifyFlushDone->cbArg) + { + return CELL_DMUX_PAMF_ERROR_ARG; + } + + ensure(!!esHandle && esResource->memAddr.aligned(0x10)); // Not checked on LLE + + const auto es_handle = vm::static_ptr_cast(esResource->memAddr); + + es_handle->notify_au_found = *notifyAuFound; + es_handle->notify_flush_done = *notifyFlushDone; + + const auto au_found_func = vm::bptr::make(g_fxo->get().func_addr(FIND_FUNC(dmuxPamfEsNotifyAuFound))); + const auto flush_done_func = vm::bptr::make(g_fxo->get().func_addr(FIND_FUNC(dmuxPamfEsNotifyFlushDone))); + + const auto [stream_id, private_stream_id, is_avc] = get_stream_ids(esFilterId); + + const error_code ret = handle->demuxer->enable_es(ppu, stream_id, private_stream_id, is_avc, esSpecificInfo, vm::ptr::make(esResource->memAddr.addr() + sizeof(CellDmuxPamfEsHandle)), + esResource->memSize - sizeof(CellDmuxPamfEsHandle), { au_found_func, es_handle }, { flush_done_func, es_handle }, es_handle->es); + + *esHandle = es_handle; + + return ret; } -error_code _CellDmuxCoreOpDisableEs(vm::ptr esHandle) +error_code DmuxPamfElementaryStream::disable_es(ppu_thread& ppu) { - cellDmuxPamf.todo("_CellDmuxCoreOpDisableEs(esHandle=*0x%x)", esHandle); + const auto dmux = demuxer.get_ptr(); - return CELL_OK; + auto& ar = *ppu.optional_savestate_state; + const u8 savestate = ar.try_read().second; + ar.clear(); + + switch (savestate) + { + case 0: + if (sys_mutex_lock(ppu, dmux->mutex, 0) != CELL_OK) + { + return CELL_DMUX_PAMF_ERROR_FATAL; + } + + if (ppu.state & cpu_flag::again) + { + ar(0); + return {}; + } + + if (!dmux->find_es(stream_id, private_stream_id)) + { + // Elementary stream is already disabled + return sys_mutex_unlock(ppu, dmux->mutex) == CELL_OK ? CELL_DMUX_PAMF_ERROR_ARG : CELL_DMUX_PAMF_ERROR_FATAL; + } + + [[fallthrough]]; + + case 1: + dmux->send_spu_command_and_wait(ppu, savestate, static_cast>(stream_id), static_cast>(private_stream_id)); + + if (ppu.state & cpu_flag::again) + { + ar(1); + return {}; + } + + _this = vm::null; + this_size = 0; + demuxer = vm::null; + notify_au_found = {}; + au_queue_buffer = vm::null; + unk = 0; + au_max_size = 0; + + dmux->elementary_streams[this_index] = vm::null; + dmux->enabled_es_num--; + + dmux->au_released_bitset |= 1ull << this_index; + + this_index = 0; + [[fallthrough]]; + + case 2: + if (const error_code ret = sys_cond_signal_to(ppu, dmux->cond, static_cast(dmux->thread_id)); ret != CELL_OK && ret != static_cast(CELL_EPERM)) + { + sys_mutex_unlock(ppu, dmux->mutex); + return CELL_DMUX_PAMF_ERROR_FATAL; + } + + if (ppu.state & cpu_flag::again) + { + ar(2); + return {}; + } + + return sys_mutex_unlock(ppu, dmux->mutex) == CELL_OK ? static_cast(CELL_OK) : CELL_DMUX_PAMF_ERROR_FATAL; + + default: + fmt::throw_exception("Unexpected savestate value: 0x%x", savestate); + } } -error_code _CellDmuxCoreOpFlushEs(vm::ptr esHandle) +error_code _CellDmuxCoreOpDisableEs(ppu_thread& ppu, vm::ptr esHandle) { - cellDmuxPamf.todo("_CellDmuxCoreOpFlushEs(esHandle=*0x%x)", esHandle); + cellDmuxPamf.notice("_CellDmuxCoreOpDisableEs(esHandle=*0x%x)", esHandle); - return CELL_OK; + if (!esHandle) + { + return CELL_DMUX_PAMF_ERROR_ARG; + } + + return esHandle->es->disable_es(ppu); } -error_code _CellDmuxCoreOpResetEs(vm::ptr esHandle) +error_code DmuxPamfElementaryStream::flush_es(ppu_thread& ppu) const { - cellDmuxPamf.todo("_CellDmuxCoreOpResetEs(esHandle=*0x%x)", esHandle); + auto& ar = *ppu.optional_savestate_state; + const bool waiting_for_spu_state = ar.try_read().second; + ar.clear(); - return CELL_OK; + if (!waiting_for_spu_state) + { + if (sys_mutex_lock(ppu, demuxer->mutex, 0) != CELL_OK) + { + return CELL_DMUX_PAMF_ERROR_FATAL; + } + + if (ppu.state & cpu_flag::again) + { + ar(false); + return {}; + } + } + + demuxer->send_spu_command_and_wait(ppu, waiting_for_spu_state, static_cast>(stream_id), static_cast>(private_stream_id)); + + if (ppu.state & cpu_flag::again) + { + ar(true); + return {}; + } + + return sys_mutex_unlock(ppu, demuxer->mutex) == CELL_OK ? static_cast(CELL_OK) : CELL_DMUX_PAMF_ERROR_FATAL; } -error_code _CellDmuxCoreOpResetStreamAndWaitDone(vm::ptr handle) +error_code _CellDmuxCoreOpFlushEs(ppu_thread& ppu, vm::ptr esHandle) { - cellDmuxPamf.todo("_CellDmuxCoreOpResetStreamAndWaitDone(handle=*0x%x)", handle); + cellDmuxPamf.notice("_CellDmuxCoreOpFlushEs(esHandle=*0x%x)", esHandle); - return CELL_OK; + if (!esHandle) + { + return CELL_DMUX_PAMF_ERROR_ARG; + } + + return esHandle->es->flush_es(ppu); +} + +error_code DmuxPamfElementaryStream::reset_es(ppu_thread& ppu) const +{ + auto& ar = *ppu.optional_savestate_state; + const bool waiting_for_spu_state = ar.try_read().second; + ar.clear(); + + if (!waiting_for_spu_state) + { + if (sys_mutex_lock(ppu, demuxer->mutex, 0) != CELL_OK) + { + return CELL_DMUX_PAMF_ERROR_FATAL; + } + + if (ppu.state & cpu_flag::again) + { + ar(false); + return {}; + } + } + + demuxer->send_spu_command_and_wait(ppu, waiting_for_spu_state, static_cast>(stream_id), static_cast>(private_stream_id), vm::null); + + if (ppu.state & cpu_flag::again) + { + ar(true); + return {}; + } + + return sys_mutex_unlock(ppu, demuxer->mutex) == CELL_OK ? static_cast(CELL_OK) : CELL_DMUX_PAMF_ERROR_FATAL; +} + +error_code _CellDmuxCoreOpResetEs(ppu_thread& ppu, vm::ptr esHandle) +{ + cellDmuxPamf.notice("_CellDmuxCoreOpResetEs(esHandle=*0x%x)", esHandle); + + if (!esHandle) + { + return CELL_DMUX_PAMF_ERROR_ARG; + } + + return esHandle->es->reset_es(ppu); +} + +error_code DmuxPamfContext::reset_stream_and_wait_done(ppu_thread& ppu) +{ + // Both sys_cond_wait() and DmuxPamfContext::reset_stream() are already using ppu_thread::optional_savestate_state, so we can't save this function currently + std::unique_lock savestate_lock{ g_fxo->get(), std::try_to_lock }; + + if (!savestate_lock.owns_lock()) + { + ppu.state += cpu_flag::again; + return {}; + } + + if (reset_stream(ppu) != CELL_OK) + { + return CELL_DMUX_PAMF_ERROR_FATAL; + } + + if (ppu.state & cpu_flag::again) + { + return {}; + } + + if (sys_mutex_lock(ppu, mutex, 0) != CELL_OK) + { + return CELL_DMUX_PAMF_ERROR_FATAL; + } + + if (ppu.state & cpu_flag::again) + { + return {}; + } + + while (sequence_state != DmuxPamfSequenceState::dormant) + { + if (sys_cond_wait(ppu, cond, 0) != CELL_OK) + { + sys_mutex_unlock(ppu, mutex); + return CELL_DMUX_PAMF_ERROR_FATAL; + } + + if (ppu.state & cpu_flag::again) + { + return {}; + } + } + + return sys_mutex_unlock(ppu, mutex) == CELL_OK ? static_cast(CELL_OK) : CELL_DMUX_PAMF_ERROR_FATAL; +} + +error_code _CellDmuxCoreOpResetStreamAndWaitDone(ppu_thread& ppu, vm::ptr handle) +{ + cellDmuxPamf.notice("_CellDmuxCoreOpResetStreamAndWaitDone(handle=*0x%x)", handle); + + if (!handle) + { + return CELL_DMUX_PAMF_ERROR_ARG; + } + + return handle->demuxer->reset_stream_and_wait_done(ppu); } template @@ -1267,4 +2840,12 @@ DECLARE(ppu_module_manager::cellDmuxPamf)("cellDmuxPamf", [] REG_HIDDEN_FUNC(_CellDmuxCoreOpFlushEs); REG_HIDDEN_FUNC(_CellDmuxCoreOpResetEs); REG_HIDDEN_FUNC(_CellDmuxCoreOpResetStreamAndWaitDone); + + REG_HIDDEN_FUNC(dmuxPamfNotifyDemuxDone); + REG_HIDDEN_FUNC(dmuxPamfNotifyProgEndCode); + REG_HIDDEN_FUNC(dmuxPamfNotifyFatalErr); + REG_HIDDEN_FUNC(dmuxPamfEsNotifyAuFound); + REG_HIDDEN_FUNC(dmuxPamfEsNotifyFlushDone); + + REG_HIDDEN_FUNC(dmuxPamfEntry); }); diff --git a/rpcs3/Emu/Cell/Modules/cellDmuxPamf.h b/rpcs3/Emu/Cell/Modules/cellDmuxPamf.h index c720fb89c5..dea9fef073 100644 --- a/rpcs3/Emu/Cell/Modules/cellDmuxPamf.h +++ b/rpcs3/Emu/Cell/Modules/cellDmuxPamf.h @@ -661,16 +661,376 @@ using dmux_pamf_spu_thread = named_thread; // PPU thread -struct CellDmuxPamfAttr +// For some reason, cellDmuxPamf doesn't use regular error code values and also has a second set of error codes that's only used internally +enum CellDmuxPamfError { - be_t maxEnabledEsNum; - be_t version; + CELL_DMUX_PAMF_ERROR_BUSY = 1, + CELL_DMUX_PAMF_ERROR_ARG = 2, + CELL_DMUX_PAMF_ERROR_UNKNOWN_STREAM = 3, + CELL_DMUX_PAMF_ERROR_NO_MEMORY = 5, + CELL_DMUX_PAMF_ERROR_FATAL = 6, +}; + +enum CellDmuxPamfM2vLevel +{ + CELL_DMUX_PAMF_M2V_MP_LL = 0, + CELL_DMUX_PAMF_M2V_MP_ML, + CELL_DMUX_PAMF_M2V_MP_H14, + CELL_DMUX_PAMF_M2V_MP_HL, +}; + +enum CellDmuxPamfAvcLevel +{ + CELL_DMUX_PAMF_AVC_LEVEL_2P1 = 21, + CELL_DMUX_PAMF_AVC_LEVEL_3P0 = 30, + CELL_DMUX_PAMF_AVC_LEVEL_3P1 = 31, + CELL_DMUX_PAMF_AVC_LEVEL_3P2 = 32, + CELL_DMUX_PAMF_AVC_LEVEL_4P1 = 41, + CELL_DMUX_PAMF_AVC_LEVEL_4P2 = 42, +}; + +struct CellDmuxPamfAuSpecificInfoM2v +{ + be_t reserved1; +}; + +struct CellDmuxPamfAuSpecificInfoAvc +{ + be_t reserved1; +}; + +struct CellDmuxPamfAuSpecificInfoLpcm +{ + u8 channelAssignmentInfo; + u8 samplingFreqInfo; + u8 bitsPerSample; +}; + +struct CellDmuxPamfAuSpecificInfoAc3 +{ + be_t reserved1; +}; + +struct CellDmuxPamfAuSpecificInfoAtrac3plus +{ + be_t reserved1; +}; + +struct CellDmuxPamfAuSpecificInfoUserData +{ + be_t reserved1; +}; + +struct CellDmuxPamfEsSpecificInfoM2v +{ + be_t profileLevel; +}; + +struct CellDmuxPamfEsSpecificInfoAvc +{ + be_t level; +}; + +struct CellDmuxPamfEsSpecificInfoLpcm +{ + be_t samplingFreq; + be_t numOfChannels; + be_t bitsPerSample; +}; + +struct CellDmuxPamfEsSpecificInfoAc3 +{ + be_t reserved1; +}; + +struct CellDmuxPamfEsSpecificInfoAtrac3plus +{ + be_t reserved1; +}; + +struct CellDmuxPamfEsSpecificInfoUserData +{ + be_t reserved1; +}; + +enum CellDmuxPamfSamplingFrequency +{ + CELL_DMUX_PAMF_FS_48K = 48000, +}; + +enum CellDmuxPamfBitsPerSample +{ + CELL_DMUX_PAMF_BITS_PER_SAMPLE_16 = 16, + CELL_DMUX_PAMF_BITS_PER_SAMPLE_24 = 24, +}; + +enum CellDmuxPamfLpcmChannelAssignmentInfo +{ + CELL_DMUX_PAMF_LPCM_CH_M1 = 1, + CELL_DMUX_PAMF_LPCM_CH_LR = 3, + CELL_DMUX_PAMF_LPCM_CH_LRCLSRSLFE = 9, + CELL_DMUX_PAMF_LPCM_CH_LRCLSCS1CS2RSLFE = 11, +}; + +enum CellDmuxPamfLpcmFs +{ + CELL_DMUX_PAMF_LPCM_FS_48K = 1, +}; + +enum CellDmuxPamfLpcmBitsPerSamples +{ + CELL_DMUX_PAMF_LPCM_BITS_PER_SAMPLE_16 = 1, + CELL_DMUX_PAMF_LPCM_BITS_PER_SAMPLE_24 = 3, +}; + +struct CellDmuxPamfSpecificInfo +{ + be_t thisSize; + b8 programEndCodeCb; +}; + +struct CellDmuxPamfResource +{ + be_t ppuThreadPriority; + be_t ppuThreadStackSize; + be_t numOfSpus; + be_t spuThreadPriority; + vm::bptr memAddr; be_t memSize; }; -struct CellDmuxPamfEsAttr +struct DmuxPamfAuInfo { - be_t auQueueMaxSize; - be_t memSize; - be_t specificInfoSize; + vm::bptr addr; + be_t size; + CellCodecTimeStamp pts; + CellCodecTimeStamp dts; + be_t user_data; + vm::bptr specific_info; + be_t specific_info_size; + b8 is_rap; }; + +CHECK_SIZE(DmuxPamfAuInfo, 0x30); + +constexpr u32 DMUX_PAMF_VERSION = 0x280000; +constexpr s32 DMUX_PAMF_MAX_ENABLED_ES_NUM = 0x40; + +// HLE exclusive, for savestates +enum class dmux_pamf_state : u8 +{ + initial, + waiting_for_au_released, + waiting_for_au_released_error, + waiting_for_event, + starting_demux_done, + starting_demux_done_mutex_lock_error, + starting_demux_done_mutex_unlock_error, + starting_demux_done_checking_stream_reset, + starting_demux_done_checking_stream_reset_error, + setting_au_reset, + setting_au_reset_error, + processing_event, + au_found_waiting_for_spu, + unsetting_au_cancel, + demux_done_notifying, + demux_done_mutex_lock, + demux_done_cond_signal, + resuming_demux_mutex_lock, + resuming_demux_waiting_for_spu, + sending_fatal_err +}; + +enum class DmuxPamfSequenceState : u32 +{ + dormant, + resetting, + running +}; + +struct DmuxPamfElementaryStream; + +class DmuxPamfContext +{ + // HLE exclusive + // These are local variables in the PPU thread function, they're here for savestates + DmuxPamfEvent event; + u64 au_queue_full_bitset; + b8 stream_reset_started; + b8 stream_reset_in_progress; + + u32 hle_spu_thread_id; + dmux_pamf_state savestate; + + [[maybe_unused]] u8 spurs[0xf6b]; // CellSpurs, 0x1000 bytes on LLE + [[maybe_unused]] vm::bptr spurs_addr; // CellSpurs* + [[maybe_unused]] b8 use_existing_spurs; + + [[maybe_unused]] alignas(0x80) u8 spurs_taskset[0x1900]; // CellSpursTaskset + [[maybe_unused]] be_t spurs_task_id; // CellSpursTaskId + vm::bptr spurs_context_addr; + + [[maybe_unused]] u8 reserved1[0x10]; + + vm::bptr _this; + be_t this_size; + be_t version; + + DmuxCb notify_demux_done; + DmuxCb notify_prog_end_code; + DmuxCb notify_fatal_err; + + CellDmuxPamfResource resource; + + be_t thread_id; // sys_ppu_thread_t + + be_t unk; // Unused + + be_t ppu_thread_stack_size; + + be_t au_released_bitset; // Each bit corresponds to an elementary stream, if a bit is set then cellDmuxReleaseAu() was called for that elementary stream + + b8 stream_reset_requested; + + be_t sequence_state; + + be_t max_enabled_es_num; + be_t enabled_es_num; + vm::bptr elementary_streams[DMUX_PAMF_MAX_ENABLED_ES_NUM]; + + be_t mutex; // sys_mutex_t + be_t cond; // sys_cond_t + + vm::bptr> cmd_queue_addr_; // Same as cmd_queue_addr, unused + vm::bptr cmd_queue_buffer_addr_; // Same as cmd_queue_buffer_addr, unused + + vm::bptr> cmd_queue_addr; // CellSpursQueue* + vm::bptr, 1>> cmd_result_queue_addr; // CellSpursQueue* + vm::bptr> stream_info_queue_addr; // CellSpursQueue* + vm::bptr> event_queue_addr; // CellSpursQueue* + + vm::bptr cmd_queue_buffer_addr; + vm::bptr[1]> cmd_result_queue_buffer_addr; + vm::bptr event_queue_buffer_addr; + vm::bptr stream_info_queue_buffer_addr; + + vm::bptr> cmd_queue_addr__; // Same as cmd_queue_addr, unused + + be_t user_data; + + b8 is_raw_es; + + be_t next_es_id; + + char spurs_taskset_name[24]; + + [[maybe_unused]] u8 reserved2[928]; // Unused + + dmux_pamf_hle_spurs_queue cmd_queue; // CellSpursQueue + dmux_pamf_hle_spurs_queue, 1> cmd_result_queue; // CellSpursQueue + dmux_pamf_hle_spurs_queue stream_info_queue; // CellSpursQueue + dmux_pamf_hle_spurs_queue event_queue; // CellSpursQueue + + DmuxPamfCommand cmd_queue_buffer[1]; + alignas(0x80) be_t cmd_result_queue_buffer[1]; + DmuxPamfStreamInfo stream_info_queue_buffer[1]; + DmuxPamfEvent event_queue_buffer[4 + 2 * DMUX_PAMF_MAX_ENABLED_ES_NUM]; + + alignas(0x80) u8 spurs_context[0x36400]; + + + template + void send_spu_command_and_wait(ppu_thread& ppu, bool waiting_for_spu_state, auto&&... cmd_params); + + error_code wait_au_released_or_stream_reset(ppu_thread& ppu, u64 au_queue_full_bitset, b8& stream_reset_started, dmux_pamf_state& savestate); + + template + error_code set_au_reset(ppu_thread& ppu); + + template + static error_code callback(ppu_thread& ppu, DmuxCb cb, auto&&... args); + + friend struct DmuxPamfElementaryStream; + +public: + void run_spu_thread(); + + DmuxPamfElementaryStream* find_es(u16 stream_id, u16 private_stream_id); + + void exec(ppu_thread& ppu); + + static error_code open(ppu_thread& ppu, const CellDmuxPamfResource& res, const DmuxCb& notify_dmux_done, const DmuxCb& notify_prog_end_code, const DmuxCb& notify_fatal_err, vm::bptr& handle); + error_code create_thread(ppu_thread& ppu); + error_code close(ppu_thread& ppu); + error_code reset_stream(ppu_thread& ppu); + error_code join_thread(ppu_thread& ppu); + + template + error_code set_stream(ppu_thread& ppu, vm::cptr stream_address, u32 stream_size, b8 discontinuity, u32 user_data); + + template + error_code enable_es(ppu_thread& ppu, u16 stream_id, u16 private_stream_id, bool is_avc, vm::cptr es_specific_info, vm::ptr mem_addr, u32 mem_size, const DmuxCb& notify_au_found, + const DmuxCb& notify_flush_done, vm::bptr& es); + + error_code reset_stream_and_wait_done(ppu_thread& ppu); +}; + +static_assert(std::is_standard_layout_v && std::is_trivial_v); +CHECK_SIZE_ALIGN(DmuxPamfContext, 0x3d880, 0x80); + +struct CellDmuxPamfHandle +{ + vm::bptr demuxer; + + DmuxCb notify_demux_done; + DmuxCb notify_prog_end_code; + DmuxCb notify_fatal_err; +}; + +CHECK_SIZE(CellDmuxPamfHandle, 0x1c); + +struct DmuxPamfElementaryStream +{ + vm::bptr _this; + be_t this_size; + u8 this_index; + + vm::bptr demuxer; + + DmuxCb notify_au_found; + DmuxCb notify_flush_done; + + be_t stream_id; + be_t private_stream_id; + b8 is_avc; + + vm::bptr au_queue_buffer; + be_t unk; // Likely au_queue_buffer_size, unused + be_t au_max_size; + u8 au_specific_info[0x10]; + be_t au_specific_info_size; + + b8 reset_next_au; + + be_t es_id; + + u8 reserved[72]; + + error_code release_au(ppu_thread& ppu, vm::ptr au_addr, u32 au_size) const; + error_code disable_es(ppu_thread& ppu); + error_code flush_es(ppu_thread& ppu) const; + error_code reset_es(ppu_thread& ppu) const; +}; + +static_assert(std::is_standard_layout_v && std::is_trivial_v); +CHECK_SIZE_ALIGN(DmuxPamfElementaryStream, 0x98, 4); + +struct CellDmuxPamfEsHandle +{ + vm::bptr es; + + DmuxCb notify_au_found; + DmuxCb notify_flush_done; +}; + +CHECK_SIZE(CellDmuxPamfEsHandle, 0x14); diff --git a/rpcs3/Emu/Cell/lv2/sys_prx.cpp b/rpcs3/Emu/Cell/lv2/sys_prx.cpp index f20b6be6cb..f46f3bdafa 100644 --- a/rpcs3/Emu/Cell/lv2/sys_prx.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_prx.cpp @@ -64,7 +64,7 @@ extern const std::map g_prx_list { "libddpdec.sprx", 0 }, { "libdivxdec.sprx", 0 }, { "libdmux.sprx", 0 }, - { "libdmuxpamf.sprx", 0 }, + { "libdmuxpamf.sprx", 1 }, { "libdtslbrdec.sprx", 0 }, { "libfiber.sprx", 0 }, { "libfont.sprx", 0 }, From f2aa3476089378da9f5b5f3d61237455f397bde6 Mon Sep 17 00:00:00 2001 From: capriots <29807355+capriots@users.noreply.github.com> Date: Sat, 27 Sep 2025 17:14:17 +0200 Subject: [PATCH 035/295] cellDmuxPamf: review fixes + improvements --- rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp | 23 ++++++++++++----------- rpcs3/Emu/Cell/Modules/cellDmuxPamf.h | 4 +++- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp b/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp index cc2fd6af42..19d85c4fb1 100644 --- a/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp +++ b/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp @@ -1295,7 +1295,7 @@ void DmuxPamfContext::exec(ppu_thread& ppu) case dmux_pamf_state::setting_au_reset_error: goto label10_setting_au_reset_error_state; case dmux_pamf_state::processing_event: goto label11_processing_event_state; case dmux_pamf_state::au_found_waiting_for_spu: goto label12_au_found_waiting_for_spu_state; - case dmux_pamf_state::unsetting_au_cancel: goto label13_unsetting_au_cancel_state; + case dmux_pamf_state::unsetting_au_reset: goto label13_unsetting_au_reset_state; case dmux_pamf_state::demux_done_notifying: goto label14_demux_done_notifying_state; case dmux_pamf_state::demux_done_mutex_lock: goto label15_demux_done_mutex_lock_state; case dmux_pamf_state::demux_done_cond_signal: goto label16_demux_done_cond_signal_state; @@ -1477,14 +1477,11 @@ void DmuxPamfContext::exec(ppu_thread& ppu) au_info->specific_info_size = es->au_specific_info_size; au_info->is_rap = static_cast(event.au_found.is_rap); - if (!is_raw_es) + if (!is_raw_es && dmuxPamfStreamIdToTypeChannel(event.au_found.stream_id, event.au_found.private_stream_id).first == DMUX_PAMF_STREAM_TYPE_INDEX_LPCM) { - if (dmuxPamfStreamIdToTypeChannel(event.au_found.stream_id, event.au_found.private_stream_id).first == DMUX_PAMF_STREAM_TYPE_INDEX_LPCM) - { - es->au_specific_info[0] = read_from_ptr(event.au_found.stream_header_buf) >> 4; - es->au_specific_info[1] = read_from_ptr(event.au_found.stream_header_buf) & 0xf; - es->au_specific_info[2] = read_from_ptr(&event.au_found.stream_header_buf[1]) >> 6; - } + es->au_specific_info[0] = read_from_ptr(event.au_found.stream_header_buf) >> 4; + es->au_specific_info[1] = read_from_ptr(event.au_found.stream_header_buf) & 0xf; + es->au_specific_info[2] = read_from_ptr(&event.au_found.stream_header_buf[1]) >> 6; } if (sys_mutex_unlock(ppu, mutex) != CELL_OK) @@ -1509,8 +1506,8 @@ void DmuxPamfContext::exec(ppu_thread& ppu) { stream_reset_in_progress = false; - savestate = dmux_pamf_state::unsetting_au_cancel; - label13_unsetting_au_cancel_state: + savestate = dmux_pamf_state::unsetting_au_reset; + label13_unsetting_au_reset_state: if (set_au_reset(ppu) != CELL_OK) { @@ -1763,7 +1760,7 @@ u32 dmuxPamfGetAuQueueMaxSize(u16 stream_id, u16 private_stream_id) u32 dmuxPamfGetLpcmAuSize(vm::cptr lpcm_info) { - return lpcm_info->samplingFreq * lpcm_info->bitsPerSample * (lpcm_info->numOfChannels + (lpcm_info->numOfChannels & 1)) / 1600; // Streams with an odd number of channels contain an empty dummy channel + return lpcm_info->samplingFreq * lpcm_info->bitsPerSample / CHAR_BIT * (lpcm_info->numOfChannels + (lpcm_info->numOfChannels & 1)) / DMUX_PAMF_LPCM_FRAMES_PER_SEC; // Streams with an odd number of channels contain an empty dummy channel } u32 dmuxPamfGetAuQueueBufferSize(u16 stream_id, u16 private_stream_id, bool is_avc, vm::cptr es_specific_info) @@ -2014,6 +2011,8 @@ error_code _CellDmuxCoreOpOpen(ppu_thread& ppu, vm::cptrmemAddr.aligned(0x10)); // Not checked on LLE + ensure(demuxerResource->memSize >= sizeof(CellDmuxPamfHandle)); // Not checked on LLE + ensure(vm::check_addr(demuxerResource->memAddr.addr(), vm::page_readable | vm::page_writable, demuxerResource->memSize)); const auto _handle = vm::static_ptr_cast(demuxerResource->memAddr); @@ -2547,6 +2546,8 @@ error_code _CellDmuxCoreOpEnableEs(ppu_thread& ppu, vm::ptr } ensure(!!esHandle && esResource->memAddr.aligned(0x10)); // Not checked on LLE + ensure(esResource->memSize >= sizeof(CellDmuxPamfEsHandle)); // Not checked on LLE + ensure(vm::check_addr(esResource->memAddr.addr(), vm::page_readable | vm::page_writable, esResource->memSize)); const auto es_handle = vm::static_ptr_cast(esResource->memAddr); diff --git a/rpcs3/Emu/Cell/Modules/cellDmuxPamf.h b/rpcs3/Emu/Cell/Modules/cellDmuxPamf.h index dea9fef073..e04b618785 100644 --- a/rpcs3/Emu/Cell/Modules/cellDmuxPamf.h +++ b/rpcs3/Emu/Cell/Modules/cellDmuxPamf.h @@ -783,6 +783,8 @@ enum CellDmuxPamfLpcmBitsPerSamples CELL_DMUX_PAMF_LPCM_BITS_PER_SAMPLE_24 = 3, }; +constexpr u8 DMUX_PAMF_LPCM_FRAMES_PER_SEC = 200; + struct CellDmuxPamfSpecificInfo { be_t thisSize; @@ -832,7 +834,7 @@ enum class dmux_pamf_state : u8 setting_au_reset_error, processing_event, au_found_waiting_for_spu, - unsetting_au_cancel, + unsetting_au_reset, demux_done_notifying, demux_done_mutex_lock, demux_done_cond_signal, From 4d6da6542e48eaaaef136c94364ccf8df51ba798 Mon Sep 17 00:00:00 2001 From: capriots <29807355+capriots@users.noreply.github.com> Date: Sat, 21 Feb 2026 22:16:39 +0100 Subject: [PATCH 036/295] tests: enable cellDmuxPamf tests in CMakeLists --- rpcs3/CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rpcs3/CMakeLists.txt b/rpcs3/CMakeLists.txt index 41597127b8..2aa8120752 100644 --- a/rpcs3/CMakeLists.txt +++ b/rpcs3/CMakeLists.txt @@ -195,6 +195,7 @@ if(BUILD_RPCS3_TESTS) tests/test_address_range.cpp tests/test_rsx_cfg.cpp tests/test_rsx_fp_asm.cpp + tests/test_dmux_pamf.cpp ) target_link_libraries(rpcs3_test @@ -202,6 +203,7 @@ if(BUILD_RPCS3_TESTS) rpcs3_lib rpcs3_emu GTest::gtest + GTest::gmock ) target_include_directories(rpcs3_test From 3616424b26cae2b06081b0f11dc449555cf42c04 Mon Sep 17 00:00:00 2001 From: capriots <29807355+capriots@users.noreply.github.com> Date: Sat, 21 Feb 2026 22:22:21 +0100 Subject: [PATCH 037/295] cellDmuxPamf: fix lv2 mutex + cond not being destroyed on close --- rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp b/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp index 19d85c4fb1..7281b0edf9 100644 --- a/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp +++ b/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp @@ -2048,6 +2048,12 @@ error_code DmuxPamfContext::close(ppu_thread& ppu) ensure(idm::remove(hle_spu_thread_id)); + if (sys_cond_destroy(ppu, cond) != CELL_OK + || sys_mutex_destroy(ppu, mutex) != CELL_OK) + { + return CELL_DMUX_PAMF_ERROR_FATAL; + } + return CELL_OK; } From b839d4d1a6de3e21605ea6f25d53c79a4c031b65 Mon Sep 17 00:00:00 2001 From: capriots <29807355+capriots@users.noreply.github.com> Date: Sat, 21 Feb 2026 22:28:10 +0100 Subject: [PATCH 038/295] cellDmuxPamf: consume guest memory on SPU thread group creation --- rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp | 19 ++++++++++++++++--- rpcs3/Emu/Cell/Modules/cellDmuxPamf.h | 3 ++- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp b/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp index 7281b0edf9..ba621ac3bd 100644 --- a/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp +++ b/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp @@ -1,6 +1,7 @@ #include "stdafx.h" #include "Emu/Cell/PPUModule.h" #include "Emu/Cell/lv2/sys_cond.h" +#include "Emu/Cell/lv2/sys_memory.h" #include "Emu/Cell/lv2/sys_mutex.h" #include "Emu/Cell/lv2/sys_ppu_thread.h" #include "Emu/Cell/lv2/sys_sync.h" @@ -1916,8 +1917,8 @@ error_code _CellDmuxCoreOpQueryAttr(vm::cptr pamfSpeci return CELL_OK; } -error_code DmuxPamfContext::open(ppu_thread& ppu, const CellDmuxPamfResource& res, const DmuxCb& notify_dmux_done, const DmuxCb& notify_prog_end_code, - const DmuxCb& notify_fatal_err, vm::bptr& handle) +error_code DmuxPamfContext::open(ppu_thread& ppu, const CellDmuxPamfResource& res, vm::cptr res_spurs, const DmuxCb& notify_dmux_done, + const DmuxCb& notify_prog_end_code, const DmuxCb& notify_fatal_err, vm::bptr& handle) { if (res.ppuThreadPriority >= 0xc00u || res.ppuThreadStackSize < 0x1000u || res.spuThreadPriority >= 0x100u || res.numOfSpus != 1u || !res.memAddr || res.memSize < sizeof(DmuxPamfContext) + 0xe7b) { @@ -1967,6 +1968,13 @@ error_code DmuxPamfContext::open(ppu_thread& ppu, const CellDmuxPamfResource& re ensure(std::snprintf(_this->spurs_taskset_name, sizeof(_this->spurs_taskset_name), "_libdmux_pamf_%08x", _this.addr()) == 22); + _this->use_existing_spurs = !!res_spurs; + + if (!res_spurs && g_fxo->get().take(0x40000) != 0x40000) + { + return CELL_DMUX_PAMF_ERROR_FATAL; + } + _this->cmd_queue.init(_this->cmd_queue_buffer); _this->cmd_result_queue.init(_this->cmd_result_queue_buffer); _this->stream_info_queue.init(_this->stream_info_queue_buffer); @@ -2032,7 +2040,7 @@ error_code _CellDmuxCoreOpOpen(ppu_thread& ppu, vm::cptr::make(g_fxo->get().func_addr(FIND_FUNC(dmuxPamfNotifyProgEndCode))); const auto fatal_err_func = vm::bptr::make(g_fxo->get().func_addr(FIND_FUNC(dmuxPamfNotifyFatalErr))); - const error_code ret = DmuxPamfContext::open(ppu, res, { demux_done_func, _handle }, { prog_end_code_func, _handle }, { fatal_err_func, _handle }, _handle->demuxer); + const error_code ret = DmuxPamfContext::open(ppu, res, demuxerResourceSpurs, { demux_done_func, _handle }, { prog_end_code_func, _handle }, { fatal_err_func, _handle }, _handle->demuxer); *handle = _handle; @@ -2048,6 +2056,11 @@ error_code DmuxPamfContext::close(ppu_thread& ppu) ensure(idm::remove(hle_spu_thread_id)); + if (!use_existing_spurs) + { + g_fxo->get().free(0x40000); + } + if (sys_cond_destroy(ppu, cond) != CELL_OK || sys_mutex_destroy(ppu, mutex) != CELL_OK) { diff --git a/rpcs3/Emu/Cell/Modules/cellDmuxPamf.h b/rpcs3/Emu/Cell/Modules/cellDmuxPamf.h index e04b618785..5b42103ca7 100644 --- a/rpcs3/Emu/Cell/Modules/cellDmuxPamf.h +++ b/rpcs3/Emu/Cell/Modules/cellDmuxPamf.h @@ -961,7 +961,8 @@ public: void exec(ppu_thread& ppu); - static error_code open(ppu_thread& ppu, const CellDmuxPamfResource& res, const DmuxCb& notify_dmux_done, const DmuxCb& notify_prog_end_code, const DmuxCb& notify_fatal_err, vm::bptr& handle); + static error_code open(ppu_thread& ppu, const CellDmuxPamfResource& res, vm::cptr res_spurs, const DmuxCb& notify_dmux_done, + const DmuxCb& notify_prog_end_code, const DmuxCb& notify_fatal_err, vm::bptr& handle); error_code create_thread(ppu_thread& ppu); error_code close(ppu_thread& ppu); error_code reset_stream(ppu_thread& ppu); From c5f278ed37f7b3bb60ad4b020077c165e680a39c Mon Sep 17 00:00:00 2001 From: capriots <29807355+capriots@users.noreply.github.com> Date: Sat, 28 Feb 2026 10:59:44 +0100 Subject: [PATCH 039/295] cellDmuxPamf: properly handle streams smaller than 0x800 bytes --- rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp | 22 ++++++++++++++-------- rpcs3/tests/test_dmux_pamf.cpp | 8 ++++++++ 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp b/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp index ba621ac3bd..99234de01e 100644 --- a/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp +++ b/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp @@ -671,19 +671,19 @@ bool dmux_pamf_base::process_next_pack() case state::initial: { // Search for the next pack start code or prog end code - std::span pack{ static_cast(nullptr), PACK_SIZE }; // This initial value is not used, can't be default constructed + std::span pack; for (;;) { - if (stream->empty()) + if (stream->size() < PACK_STUFFING_LENGTH_OFFSET + sizeof(u8)) { stream.reset(); demux_done_notified = on_demux_done(); return true; } - pack = stream->subspan<0, PACK_SIZE>(); - stream = stream->subspan(); + pack = stream->first(std::min(stream->size(), PACK_SIZE)); + stream = stream->subspan(std::min(stream->size(), PACK_SIZE)); // If the input stream is a raw elementary stream, skip everything MPEG-PS related and go straight to elementary stream parsing if (raw_es) @@ -719,6 +719,14 @@ bool dmux_pamf_base::process_next_pack() // Skip over pack header const u8 pack_stuffing_length = read_from_ptr(pack.subspan()) & 0x7; + + // Not checked on LLE, the SPU task would just increment the reading position and read random data in the SPU local store + if (PACK_STUFFING_LENGTH_OFFSET + sizeof(u8) + pack_stuffing_length + PES_HEADER_DATA_LENGTH_OFFSET + sizeof(u8) > pack.size()) + { + cellDmuxPamf.error("Invalid pack stuffing length"); + return false; + } + std::span current_pes_packet = pack.subspan(PACK_STUFFING_LENGTH_OFFSET + sizeof(u8) + pack_stuffing_length); if (read_from_ptr>(current_pes_packet) >> 8 != PACKET_START_CODE_PREFIX) @@ -785,10 +793,8 @@ bool dmux_pamf_base::process_next_pack() return false; } - // The size of the stream is not checked here because if coming from a pack header, it is guaranteed that there is enough space, - // and if coming from a system header or private stream 2, it was already checked above - const u16 pes_packet_length = read_from_ptr>(current_pes_packet.begin() + PES_PACKET_LENGTH_OFFSET) + PES_PACKET_LENGTH_OFFSET + sizeof(u16); - const u8 pes_header_data_length = read_from_ptr(current_pes_packet.begin() + PES_HEADER_DATA_LENGTH_OFFSET) + PES_HEADER_DATA_LENGTH_OFFSET + sizeof(u8); + const u16 pes_packet_length = read_from_ptr>(current_pes_packet.begin(), PES_PACKET_LENGTH_OFFSET) + PES_PACKET_LENGTH_OFFSET + sizeof(u16); + const u8 pes_header_data_length = read_from_ptr(current_pes_packet.begin(), PES_HEADER_DATA_LENGTH_OFFSET) + PES_HEADER_DATA_LENGTH_OFFSET + sizeof(u8); // Not checked on LLE, the SPU task would just increment the reading position and read random data in the SPU local store if (pes_packet_length > current_pes_packet.size() || pes_packet_length <= pes_header_data_length) diff --git a/rpcs3/tests/test_dmux_pamf.cpp b/rpcs3/tests/test_dmux_pamf.cpp index 40a8a02b32..b6fdbf73b4 100644 --- a/rpcs3/tests/test_dmux_pamf.cpp +++ b/rpcs3/tests/test_dmux_pamf.cpp @@ -228,6 +228,14 @@ INSTANTIATE_TEST_SUITE_P(Instance, DmuxPamfInvalidStream, Values []() consteval { auto pack = AVC_SINGLE_PACK_STREAM; pack[0x118] = 0x00; pack[0x119] = 0x03; pack[0x11c] = 0x00; return pack; }() // PES packet header size too large )); +// Since the "pack stuffing length" field only has a size of three bits, this can only occur if the stream is not a multiple of 0x800 bytes large. +// Like the other invalid streams above, LLE does not check for this +TEST_F(DmuxPamfTest, InvalidPackStuffingLength) +{ + demuxer.set_stream({ AVC_SINGLE_PACK_STREAM.cbegin(), AVC_SINGLE_PACK_STREAM.cbegin() + 0x16 }, false); + EXPECT_FALSE(demuxer.process_next_pack()); +} + // Tests if the program end code is properly detected and the corresponding event is fired TEST_F(DmuxPamfTest, ProgEnd) { From 4828d4d2d6128afad95998ce5056e27c3eda3028 Mon Sep 17 00:00:00 2001 From: capriots <29807355+capriots@users.noreply.github.com> Date: Sat, 28 Feb 2026 16:33:08 +0100 Subject: [PATCH 040/295] cellDmuxPamf: review fixes --- rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp | 97 ++++++++++++++----------- 1 file changed, 53 insertions(+), 44 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp b/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp index 99234de01e..f8fd42f4a4 100644 --- a/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp +++ b/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp @@ -308,7 +308,7 @@ u32 dmux_pamf_base::video_stream::parse_stream(std::span stream) // Search for delimiter in cache for (; cache_idx < static_cast(cache.size()); cache_idx++) { - if (const be_t code = read_from_ptr>(buf.data() + cache_idx); + if (const be_t code = read_from_ptr>(buf.data(), cache_idx); (avc && code == AVC_AU_DELIMITER) || (!avc && (code == M2V_PIC_START || code == M2V_SEQUENCE_HEADER || code == M2V_SEQUENCE_END))) { if (current_au.state != access_unit::state::none && (avc || current_au.state != access_unit::state::m2v_sequence)) @@ -438,7 +438,7 @@ u32 dmux_pamf_base::audio_stream::parse_stream(std::span stream) // Search for delimiter in cache for (; cache_idx <= static_cast(cache.size() + std::min(sizeof(u16) - 1, stream.size()) - sizeof(u16)); cache_idx++) { - if (const be_t tmp = read_from_ptr>(buf.data() + cache_idx); current_au.size_info_offset != 0) + if (const be_t tmp = read_from_ptr>(buf.data(), cache_idx); current_au.size_info_offset != 0) { if (--current_au.size_info_offset == 0) { @@ -521,7 +521,7 @@ u32 dmux_pamf_base::user_data_stream::parse_stream_header(std::span pe return umax; } - au_size_unk = read_from_ptr>(pes_packet_data.begin() + 2) - sizeof(u32); + au_size_unk = read_from_ptr>(pes_packet_data.begin(), 2) - sizeof(u32); return 10; } @@ -718,7 +718,7 @@ bool dmux_pamf_base::process_next_pack() } // Skip over pack header - const u8 pack_stuffing_length = read_from_ptr(pack.subspan()) & 0x7; + const u8 pack_stuffing_length = read_from_ptr>(pack, PACK_STUFFING_LENGTH_OFFSET); // Not checked on LLE, the SPU task would just increment the reading position and read random data in the SPU local store if (PACK_STUFFING_LENGTH_OFFSET + sizeof(u8) + pack_stuffing_length + PES_HEADER_DATA_LENGTH_OFFSET + sizeof(u8) > pack.size()) @@ -729,7 +729,7 @@ bool dmux_pamf_base::process_next_pack() std::span current_pes_packet = pack.subspan(PACK_STUFFING_LENGTH_OFFSET + sizeof(u8) + pack_stuffing_length); - if (read_from_ptr>(current_pes_packet) >> 8 != PACKET_START_CODE_PREFIX) + if (read_from_ptr, 8, 24>>(current_pes_packet) != PACKET_START_CODE_PREFIX) { cellDmuxPamf.error("Invalid start code after pack header"); return false; @@ -738,7 +738,7 @@ bool dmux_pamf_base::process_next_pack() // Skip over system header if present if (read_from_ptr>(current_pes_packet) == SYSTEM_HEADER) { - const u32 system_header_length = read_from_ptr>(current_pes_packet.begin() + PES_PACKET_LENGTH_OFFSET) + PES_PACKET_LENGTH_OFFSET + sizeof(u16); + const u32 system_header_length = read_from_ptr>(current_pes_packet.begin(), PES_PACKET_LENGTH_OFFSET) + PES_PACKET_LENGTH_OFFSET + sizeof(u16); // Not checked on LLE, the SPU task would just increment the reading position and read random data in the SPU local store if (system_header_length + PES_HEADER_DATA_LENGTH_OFFSET + sizeof(u8) > current_pes_packet.size()) @@ -763,7 +763,7 @@ bool dmux_pamf_base::process_next_pack() // A system header is optionally followed by a private stream 2 // The first two bytes of the stream are the stream id of a video stream. The next access unit of that stream is a random access point/keyframe - const u16 pes_packet_length = read_from_ptr>(current_pes_packet.begin() + PES_PACKET_LENGTH_OFFSET) + PES_PACKET_LENGTH_OFFSET + sizeof(u16); + const u16 pes_packet_length = read_from_ptr>(current_pes_packet.begin(), PES_PACKET_LENGTH_OFFSET) + PES_PACKET_LENGTH_OFFSET + sizeof(u16); // Not checked on LLE, the SPU task would just increment the reading position and read random data in the SPU local store if (pes_packet_length + PES_HEADER_DATA_LENGTH_OFFSET + sizeof(u8) > current_pes_packet.size()) @@ -772,7 +772,7 @@ bool dmux_pamf_base::process_next_pack() return false; } - if (const u8 channel = read_from_ptr>(current_pes_packet.begin() + PES_PACKET_LENGTH_OFFSET + sizeof(u16)) & 0xf; + if (const u8 channel = read_from_ptr>(current_pes_packet.begin(), PES_PACKET_LENGTH_OFFSET + sizeof(u16)) & 0xf; elementary_stream::is_enabled(elementary_streams[0][channel])) { elementary_streams[0][channel]->set_rap(); @@ -818,23 +818,23 @@ bool dmux_pamf_base::process_next_pack() if (elementary_stream::is_enabled(elementary_streams[type_idx][channel])) { - const s8 pts_dts_flag = read_from_ptr(current_pes_packet.begin() + PTS_DTS_FLAG_OFFSET); + const s8 pts_dts_flag = read_from_ptr(current_pes_packet.begin(), PTS_DTS_FLAG_OFFSET); if (pts_dts_flag < 0) { // The timestamps should be unsigned, but are sign-extended from s32 to u64 on LLE. They probably forgot about integer promotion - const s32 PTS_32_30 = read_from_ptr(current_pes_packet.begin() + 9) >> 1; - const s32 PTS_29_15 = read_from_ptr>(current_pes_packet.begin() + 10) >> 1; - const s32 PTS_14_0 = read_from_ptr>(current_pes_packet.begin() + 12) >> 1; + const s32 PTS_32_30 = read_from_ptr>(current_pes_packet.begin(), 9); + const s32 PTS_29_15 = read_from_ptr, 1, 15>>(current_pes_packet.begin(), 10); + const s32 PTS_14_0 = read_from_ptr, 1, 15>>(current_pes_packet.begin(), 12); elementary_streams[type_idx][channel]->set_pts(PTS_32_30 << 30 | PTS_29_15 << 15 | PTS_14_0); // Bit 32 is discarded } if (pts_dts_flag & 0x40) { - const s32 DTS_32_30 = read_from_ptr(current_pes_packet.begin() + 14) >> 1; - const s32 DTS_29_15 = read_from_ptr>(current_pes_packet.begin() + 15) >> 1; - const s32 DTS_14_0 = read_from_ptr>(current_pes_packet.begin() + 17) >> 1; + const s32 DTS_32_30 = read_from_ptr>(current_pes_packet.begin(), 14); + const s32 DTS_29_15 = read_from_ptr, 1, 15>>(current_pes_packet.begin(), 15); + const s32 DTS_14_0 = read_from_ptr, 1, 15>>(current_pes_packet.begin(), 17); elementary_streams[type_idx][channel]->set_dts(DTS_32_30 << 30 | DTS_29_15 << 15 | DTS_14_0); // Bit 32 is discarded } @@ -1273,16 +1273,7 @@ void DmuxPamfContext::run_spu_thread() void DmuxPamfContext::exec(ppu_thread& ppu) { - // These are repeated a lot in this function, in my opinion using defines here makes it more readable -#define SEND_FATAL_ERR_AND_CONTINUE()\ - savestate = dmux_pamf_state::sending_fatal_err;\ - callback(ppu, notify_fatal_err, _this, CELL_OK); /* LLE uses CELL_OK as error code */\ - if (ppu.state & cpu_flag::again)\ - {\ - return;\ - }\ - continue - + // This is repeated a lot in this function, in my opinion using a define here makes it more readable #define RETURN_ON_CPU_FLAG_AGAIN()\ if (ppu.state & cpu_flag::again)\ return @@ -1308,13 +1299,17 @@ void DmuxPamfContext::exec(ppu_thread& ppu) case dmux_pamf_state::demux_done_cond_signal: goto label16_demux_done_cond_signal_state; case dmux_pamf_state::resuming_demux_mutex_lock: goto label17_resuming_demux_mutex_lock_state; case dmux_pamf_state::resuming_demux_waiting_for_spu: goto label18_resuming_demux_waiting_for_spu_state; - case dmux_pamf_state::sending_fatal_err: - callback(ppu, notify_fatal_err, _this, CELL_OK); - RETURN_ON_CPU_FLAG_AGAIN(); + case dmux_pamf_state::sending_fatal_err: ; // Handled below } for (;;) { + if (savestate == dmux_pamf_state::sending_fatal_err) + { + callback(ppu, notify_fatal_err, _this, CELL_OK); + RETURN_ON_CPU_FLAG_AGAIN(); + } + savestate = dmux_pamf_state::initial; stream_reset_started = false; @@ -1427,7 +1422,8 @@ void DmuxPamfContext::exec(ppu_thread& ppu) { if (sys_mutex_lock(ppu, mutex, 0) != CELL_OK) { - SEND_FATAL_ERR_AND_CONTINUE(); + savestate = dmux_pamf_state::sending_fatal_err; + continue; } RETURN_ON_CPU_FLAG_AGAIN(); @@ -1441,7 +1437,8 @@ void DmuxPamfContext::exec(ppu_thread& ppu) { if (sys_mutex_unlock(ppu, mutex) != CELL_OK) { - SEND_FATAL_ERR_AND_CONTINUE(); + savestate = dmux_pamf_state::sending_fatal_err; + continue; } break; @@ -1468,7 +1465,8 @@ void DmuxPamfContext::exec(ppu_thread& ppu) if (sys_mutex_unlock(ppu, mutex) != CELL_OK) { - SEND_FATAL_ERR_AND_CONTINUE(); + savestate = dmux_pamf_state::sending_fatal_err; + continue; } break; @@ -1486,14 +1484,15 @@ void DmuxPamfContext::exec(ppu_thread& ppu) if (!is_raw_es && dmuxPamfStreamIdToTypeChannel(event.au_found.stream_id, event.au_found.private_stream_id).first == DMUX_PAMF_STREAM_TYPE_INDEX_LPCM) { - es->au_specific_info[0] = read_from_ptr(event.au_found.stream_header_buf) >> 4; - es->au_specific_info[1] = read_from_ptr(event.au_found.stream_header_buf) & 0xf; - es->au_specific_info[2] = read_from_ptr(&event.au_found.stream_header_buf[1]) >> 6; + es->au_specific_info[0] = read_from_ptr>(event.au_found.stream_header_buf); + es->au_specific_info[1] = read_from_ptr>(event.au_found.stream_header_buf); + es->au_specific_info[2] = read_from_ptr>(event.au_found.stream_header_buf, 1); } if (sys_mutex_unlock(ppu, mutex) != CELL_OK) { - SEND_FATAL_ERR_AND_CONTINUE(); + savestate = dmux_pamf_state::sending_fatal_err; + continue; } if (callback(ppu, es->notify_au_found, es->_this, au_info) != CELL_OK) @@ -1518,7 +1517,8 @@ void DmuxPamfContext::exec(ppu_thread& ppu) if (set_au_reset(ppu) != CELL_OK) { - SEND_FATAL_ERR_AND_CONTINUE(); + savestate = dmux_pamf_state::sending_fatal_err; + continue; } RETURN_ON_CPU_FLAG_AGAIN(); @@ -1536,7 +1536,8 @@ void DmuxPamfContext::exec(ppu_thread& ppu) if (sys_mutex_lock(ppu, mutex, 0) != CELL_OK) { - SEND_FATAL_ERR_AND_CONTINUE(); + savestate = dmux_pamf_state::sending_fatal_err; + continue; } RETURN_ON_CPU_FLAG_AGAIN(); @@ -1551,7 +1552,9 @@ void DmuxPamfContext::exec(ppu_thread& ppu) if (sys_cond_signal_all(ppu, cond) != CELL_OK) { sys_mutex_unlock(ppu, mutex); - SEND_FATAL_ERR_AND_CONTINUE(); + + savestate = dmux_pamf_state::sending_fatal_err; + continue; } RETURN_ON_CPU_FLAG_AGAIN(); @@ -1559,7 +1562,8 @@ void DmuxPamfContext::exec(ppu_thread& ppu) if (sys_mutex_unlock(ppu, mutex) != CELL_OK) { - SEND_FATAL_ERR_AND_CONTINUE(); + savestate = dmux_pamf_state::sending_fatal_err; + continue; } break; @@ -1573,7 +1577,8 @@ void DmuxPamfContext::exec(ppu_thread& ppu) { if (sys_mutex_lock(ppu, mutex, 0) != CELL_OK) { - SEND_FATAL_ERR_AND_CONTINUE(); + savestate = dmux_pamf_state::sending_fatal_err; + continue; } RETURN_ON_CPU_FLAG_AGAIN(); @@ -1583,7 +1588,8 @@ void DmuxPamfContext::exec(ppu_thread& ppu) if (sys_mutex_unlock(ppu, mutex) != CELL_OK) { - SEND_FATAL_ERR_AND_CONTINUE(); + savestate = dmux_pamf_state::sending_fatal_err; + continue; } if (valid) @@ -1607,7 +1613,8 @@ void DmuxPamfContext::exec(ppu_thread& ppu) { ensure(event_queue.pop()); - SEND_FATAL_ERR_AND_CONTINUE(); + savestate = dmux_pamf_state::sending_fatal_err; + continue; } default: fmt::throw_exception("Invalid event"); @@ -1624,7 +1631,8 @@ void DmuxPamfContext::exec(ppu_thread& ppu) if (sys_mutex_lock(ppu, mutex, 0) != CELL_OK) { - SEND_FATAL_ERR_AND_CONTINUE(); + savestate = dmux_pamf_state::sending_fatal_err; + continue; } RETURN_ON_CPU_FLAG_AGAIN(); @@ -1650,7 +1658,8 @@ void DmuxPamfContext::exec(ppu_thread& ppu) if (sys_mutex_unlock(ppu, mutex) != CELL_OK) { - SEND_FATAL_ERR_AND_CONTINUE(); + savestate = dmux_pamf_state::sending_fatal_err; + continue; } } From 2573cc5fd08a2d5e4b38768ae1c69779397d70b4 Mon Sep 17 00:00:00 2001 From: capriots <29807355+capriots@users.noreply.github.com> Date: Sat, 7 Mar 2026 16:30:38 +0100 Subject: [PATCH 041/295] cellDmuxPamf: fix stream cache not being consumed in some cases --- rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp b/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp index f8fd42f4a4..91ee7e2426 100644 --- a/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp +++ b/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp @@ -354,9 +354,10 @@ u32 dmux_pamf_base::video_stream::parse_stream(std::span stream) { au_chunk.data = { au_chunk_begin, stream_it }; std::copy_n(cache.begin(), cache_idx, std::back_inserter(au_chunk.cached_data)); - cache.erase(cache.begin(), cache.begin() + cache_idx); } + cache.erase(cache.begin(), cache.begin() + cache_idx); + // Cache the end of the stream if an access unit wasn't completed. There could be the beginning of a delimiter in the last three bytes if (current_au.state != access_unit::state::complete) { @@ -499,9 +500,10 @@ u32 dmux_pamf_base::audio_stream::parse_stream(std::span stream) { au_chunk.data = { au_chunk_begin, stream_it }; std::copy_n(cache.begin(), cache_idx, std::back_inserter(au_chunk.cached_data)); - cache.erase(cache.begin(), cache.begin() + cache_idx); } + cache.erase(cache.begin(), cache.begin() + cache_idx); + // Cache the end of the stream if an access unit wasn't completed. There could be the beginning of a delimiter in the last three bytes if (current_au.state != access_unit::state::complete && current_au.state != access_unit::state::size_mismatch) { From 43b295892ff7c10316bf12f6368026731f071d49 Mon Sep 17 00:00:00 2001 From: RipleyTom Date: Fri, 6 Mar 2026 20:41:02 +0100 Subject: [PATCH 042/295] PPUAnalyzer: Fix SLDI shift operand --- rpcs3/Emu/Cell/PPUAnalyser.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpcs3/Emu/Cell/PPUAnalyser.cpp b/rpcs3/Emu/Cell/PPUAnalyser.cpp index 56d4398d09..783ed9e477 100644 --- a/rpcs3/Emu/Cell/PPUAnalyser.cpp +++ b/rpcs3/Emu/Cell/PPUAnalyser.cpp @@ -2535,7 +2535,7 @@ bool ppu_module::analyse(u32 lib_toc, u32 entry, const u32 sec_end, con // SLDI mnemonic reg_state_t rs = get_reg(op.rs); - if (!rs.shift_left(op.sh32, reg_tag_allocator)) + if (!rs.shift_left(sh, reg_tag_allocator)) { unmap_reg(op.ra); } From c38bf70464f3784d3278471c9836912bb05a70e1 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sun, 8 Mar 2026 13:54:25 +0100 Subject: [PATCH 043/295] cellCamera: improve error logging --- rpcs3/Emu/Cell/Modules/cellCamera.cpp | 10 +++++----- rpcs3/Emu/Cell/lv2/sys_gamepad.cpp | 1 - 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/cellCamera.cpp b/rpcs3/Emu/Cell/Modules/cellCamera.cpp index 096f9330f4..10f9a89cf0 100644 --- a/rpcs3/Emu/Cell/Modules/cellCamera.cpp +++ b/rpcs3/Emu/Cell/Modules/cellCamera.cpp @@ -919,7 +919,7 @@ error_code cellCameraGetAttribute(s32 dev_num, s32 attrib, vm::ptr arg1, vm if (!check_dev_num(dev_num)) { - return CELL_CAMERA_ERROR_PARAM; + return { CELL_CAMERA_ERROR_PARAM, "dev_num=%d", dev_num }; } if (g_cfg.io.camera == camera_handler::null) @@ -935,7 +935,7 @@ error_code cellCameraGetAttribute(s32 dev_num, s32 attrib, vm::ptr arg1, vm if (!arg1) { - return CELL_CAMERA_ERROR_PARAM; + return { CELL_CAMERA_ERROR_PARAM, "arg1=null" }; } if (error_code error = check_resolution(dev_num)) @@ -952,7 +952,7 @@ error_code cellCameraGetAttribute(s32 dev_num, s32 attrib, vm::ptr arg1, vm if (!attr_name) // invalid attributes don't have a name { - return CELL_CAMERA_ERROR_PARAM; + return { CELL_CAMERA_ERROR_PARAM, "attrib=0x%x", attrib }; } if (arg1) @@ -983,7 +983,7 @@ error_code cellCameraSetAttribute(s32 dev_num, s32 attrib, u32 arg1, u32 arg2) if (!check_dev_num(dev_num)) { - return CELL_CAMERA_ERROR_PARAM; + return { CELL_CAMERA_ERROR_PARAM, "dev_num=%d", dev_num }; } if (g_cfg.io.camera == camera_handler::null) @@ -1004,7 +1004,7 @@ error_code cellCameraSetAttribute(s32 dev_num, s32 attrib, u32 arg1, u32 arg2) if (!attr_name) // invalid attributes don't have a name { - return CELL_CAMERA_ERROR_PARAM; + return { CELL_CAMERA_ERROR_PARAM, "attrib=0x%x", attrib }; } g_camera.set_attr(attrib, arg1, arg2); diff --git a/rpcs3/Emu/Cell/lv2/sys_gamepad.cpp b/rpcs3/Emu/Cell/lv2/sys_gamepad.cpp index 26ffbc2696..55fd7cb885 100644 --- a/rpcs3/Emu/Cell/lv2/sys_gamepad.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_gamepad.cpp @@ -67,7 +67,6 @@ u32 sys_gamepad_ycon_is_gem(vm::ptr in, vm::ptr out) // syscall(621,packet_id,u8 *in,u8 *out) Talk:LV2_Functions_and_Syscalls#Syscall_621_.280x26D.29 gamepad_if usage u32 sys_gamepad_ycon_if(u8 packet_id, vm::ptr in, vm::ptr out) { - switch (packet_id) { case 0: From eeda9c7738b729f8ef282e831a484f9cd958c1c1 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sun, 8 Mar 2026 13:56:49 +0100 Subject: [PATCH 044/295] cellGem: improve quaternion rotation rotate_vector caused wrong results for default_orientation and 0,0,x --- rpcs3/Emu/Io/ps_move_data.cpp | 46 +++++++++++++++++------------------ rpcs3/Emu/Io/ps_move_data.h | 23 ++++++++++++++++++ 2 files changed, 46 insertions(+), 23 deletions(-) diff --git a/rpcs3/Emu/Io/ps_move_data.cpp b/rpcs3/Emu/Io/ps_move_data.cpp index 0a167eed39..bf35f26a19 100644 --- a/rpcs3/Emu/Io/ps_move_data.cpp +++ b/rpcs3/Emu/Io/ps_move_data.cpp @@ -24,34 +24,34 @@ void ps_move_data::reset_sensors() angaccel_world = {}; } +ps_move_data::vect<3> ps_move_data::rotate_vector(const vect<4>& q, const vect<3>& v) +{ + const auto cross = [](const vect<3>& a, const vect<3>& b) + { + return vect<3>({ + a.y() * b.z() - a.z() * b.y(), + a.z() * b.x() - a.x() * b.z(), + a.x() * b.y() - a.y() * b.x() + }); + }; + + // q = (x, y, z, w) + const vect<3> q_vec({q.x(), q.y(), q.z()}); + + // t = 2 * cross(q_vec, v) + const vect<3> t = cross(q_vec, v) * 2.0f; + + // v' = v + w * t + cross(q_vec, t) + const vect<3> v_prime = v + t * q.w() + cross(q_vec, t); + + return v_prime; +} + void ps_move_data::update_orientation(f32 delta_time) { if (!delta_time) return; - // Rotate vector v by quaternion q - const auto rotate_vector = [](const vect<4>& q, const vect<3>& v) - { - const vect<4> qv({0.0f, v.x(), v.y(), v.z()}); - const vect<4> q_inv({q.w(), -q.x(), -q.y(), -q.z()}); - - // t = q * v - vect<4> t; - t.w() = -q.x() * qv.x() - q.y() * qv.y() - q.z() * qv.z(); - t.x() = q.w() * qv.x() + q.y() * qv.z() - q.z() * qv.y(); - t.y() = q.w() * qv.y() - q.x() * qv.z() + q.z() * qv.x(); - t.z() = q.w() * qv.z() + q.x() * qv.y() - q.y() * qv.x(); - - // r = t * q_inv - vect<4> r; - r.w() = -t.x() * q_inv.x() - t.y() * q_inv.y() - t.z() * q_inv.z(); - r.x() = t.w() * q_inv.x() + t.y() * q_inv.z() - t.z() * q_inv.y(); - r.y() = t.w() * q_inv.y() - t.x() * q_inv.z() + t.z() * q_inv.x(); - r.z() = t.w() * q_inv.z() + t.x() * q_inv.y() - t.y() * q_inv.x(); - - return vect<3>({r.x(), r.y(), r.z()}); - }; - if constexpr (use_imu_for_velocity) { // Gravity in world frame diff --git a/rpcs3/Emu/Io/ps_move_data.h b/rpcs3/Emu/Io/ps_move_data.h index 1ae30f5c66..2470e47e8c 100644 --- a/rpcs3/Emu/Io/ps_move_data.h +++ b/rpcs3/Emu/Io/ps_move_data.h @@ -15,6 +15,26 @@ struct ps_move_data template const T& operator[](I i) const { return data[i]; } + vect operator*(f32 s) const + { + vect result = *this; + for (int i = 0; i < Size; ++i) + { + result[i] *= s; + } + return result; + } + + vect operator+(const vect& other) const + { + vect result = *this; + for (int i = 0; i < Size; ++i) + { + result[i] += other[i]; + } + return result; + } + T x() const requires (Size >= 1) { return data[0]; } T y() const requires (Size >= 2) { return data[1]; } T z() const requires (Size >= 3) { return data[2]; } @@ -72,4 +92,7 @@ struct ps_move_data void reset_sensors(); void update_orientation(f32 delta_time); void update_velocity(u64 timestamp, be_t pos_world[4]); + + // Rotate vector v by quaternion q + static vect<3> rotate_vector(const vect<4>& q, const vect<3>& v); }; From 41db06b53f906fbe2941552008ea8b468fa38482 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sun, 8 Mar 2026 14:00:57 +0100 Subject: [PATCH 045/295] cellGem: fix handle_pos calculation The handle position depends on the sphere position and the orientation --- rpcs3/Emu/Cell/Modules/cellGem.cpp | 49 ++++++++++++++++-------------- 1 file changed, 26 insertions(+), 23 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/cellGem.cpp b/rpcs3/Emu/Cell/Modules/cellGem.cpp index 1a1e8a7d04..f87b4349a1 100644 --- a/rpcs3/Emu/Cell/Modules/cellGem.cpp +++ b/rpcs3/Emu/Cell/Modules/cellGem.cpp @@ -1883,21 +1883,10 @@ static inline void pos_to_gem_state(u32 gem_num, gem_config::gem_controller& con gem_state->pos[2] = controller.distance_mm; gem_state->pos[3] = 0.f; - // TODO: calculate handle position based on our world coordinate and the angles - gem_state->handle_pos[0] = camera_x; - gem_state->handle_pos[1] = camera_y; - gem_state->handle_pos[2] = controller.distance_mm + 10.0f; - gem_state->handle_pos[3] = 0.f; - // Calculate orientation - if (g_cfg.io.move == move_handler::real || (g_cfg.io.move == move_handler::fake && move_data.orientation_enabled)) - { - gem_state->quat[0] = move_data.quaternion.x(); - gem_state->quat[1] = move_data.quaternion.y(); - gem_state->quat[2] = move_data.quaternion.z(); - gem_state->quat[3] = move_data.quaternion.w(); - } - else + ps_move_data::vect<4> quat = move_data.quaternion; + + if (g_cfg.io.move != move_handler::real && !(g_cfg.io.move == move_handler::fake && move_data.orientation_enabled)) { const f32 max_angle_per_side_h = g_cfg.io.fake_move_rotation_cone_h / 2.0f; const f32 max_angle_per_side_v = g_cfg.io.fake_move_rotation_cone_v / 2.0f; @@ -1911,17 +1900,27 @@ static inline void pos_to_gem_state(u32 gem_num, gem_config::gem_controller& con const f32 cy = std::cos(yaw * 0.5f); const f32 sy = std::sin(yaw * 0.5f); - const f32 q_x = sr * cp * cy - cr * sp * sy; - const f32 q_y = cr * sp * cy + sr * cp * sy; - const f32 q_z = cr * cp * sy - sr * sp * cy; - const f32 q_w = cr * cp * cy + sr * sp * sy; - - gem_state->quat[0] = q_x; - gem_state->quat[1] = q_y; - gem_state->quat[2] = q_z; - gem_state->quat[3] = q_w; + quat.x() = sr * cp * cy - cr * sp * sy; + quat.y() = cr * sp * cy + sr * cp * sy; + quat.z() = cr * cp * sy - sr * sp * cy; + quat.w() = cr * cp * cy + sr * sp * sy; } + gem_state->quat[0] = quat.x(); + gem_state->quat[1] = quat.y(); + gem_state->quat[2] = quat.z(); + gem_state->quat[3] = quat.w(); + + // Calculate handle position based on our world coordinate and the current orientation + constexpr ps_move_data::vect<3> offset_local_mm({0.f, 0.f, -45.f}); // handle is ~45 mm below sphere + const ps_move_data::vect<3> offset_world = ps_move_data::rotate_vector(quat, offset_local_mm); + + gem_state->handle_pos[0] = gem_state->pos[0] - offset_world.x(); // Flip x offset + gem_state->handle_pos[1] = gem_state->pos[1] - offset_world.y(); // Flip y offset + gem_state->handle_pos[2] = gem_state->pos[2] + offset_world.z(); + gem_state->handle_pos[3] = 0.f; + + // Calculate velocity if constexpr (!ps_move_data::use_imu_for_velocity) { move_data.update_velocity(shared_data.frame_timestamp_us, gem_state->pos); @@ -1930,6 +1929,10 @@ static inline void pos_to_gem_state(u32 gem_num, gem_config::gem_controller& con { gem_state->vel[i] = move_data.vel_world[i]; gem_state->accel[i] = move_data.accel_world[i]; + + // TODO: maybe this also needs to be adjusted depending on the orientation + gem_state->handle_vel[i] = gem_state->vel[i]; + gem_state->handle_accel[i] = gem_state->accel[i]; } } From 77cbdd82ab02d64bfe95048fcf8be3afd968bcc5 Mon Sep 17 00:00:00 2001 From: RipleyTom Date: Mon, 9 Mar 2026 04:27:50 +0100 Subject: [PATCH 046/295] LLVM 22 fixups From https://releases.llvm.org/22.1.0/docs/ReleaseNotes.html: The alignment argument of the @llvm.masked.load, @llvm.masked.store, @llvm.masked.gather and @llvm.masked.scatter intrinsics has been removed. Instead, the align attribute should be placed on the pointer (or vector of pointers) argument. They also changed(not in changelog for some reason): vpdpbusd_128: [v4i32] -> [v4i32, v4i32, v4i32] to vpdpbusd_128: [v4i32] -> [v4i32, v16i8, v16i8] --- rpcs3/Emu/CPU/CPUTranslator.h | 7 +++++++ rpcs3/Emu/Cell/PPUTranslator.cpp | 8 ++------ 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/rpcs3/Emu/CPU/CPUTranslator.h b/rpcs3/Emu/CPU/CPUTranslator.h index 99ddafde0a..27abb22219 100644 --- a/rpcs3/Emu/CPU/CPUTranslator.h +++ b/rpcs3/Emu/CPU/CPUTranslator.h @@ -3647,7 +3647,14 @@ public: const auto data0 = a.eval(m_ir); const auto data1 = b.eval(m_ir); const auto data2 = c.eval(m_ir); + +#if LLVM_VERSION_MAJOR >= 22 + // LLVM 22+ changed the intrinsic signature from v4i32 to v16i8 for operands 2 and 3 + result.value = m_ir->CreateCall(get_intrinsic(llvm::Intrinsic::x86_avx512_vpdpbusd_128), + {data0, m_ir->CreateBitCast(data1, get_type()), m_ir->CreateBitCast(data2, get_type())}); +#else result.value = m_ir->CreateCall(get_intrinsic(llvm::Intrinsic::x86_avx512_vpdpbusd_128), {data0, data1, data2}); +#endif return result; } diff --git a/rpcs3/Emu/Cell/PPUTranslator.cpp b/rpcs3/Emu/Cell/PPUTranslator.cpp index ddf7d330a0..b12cd9c55d 100644 --- a/rpcs3/Emu/Cell/PPUTranslator.cpp +++ b/rpcs3/Emu/Cell/PPUTranslator.cpp @@ -3681,9 +3681,7 @@ void PPUTranslator::STVLX(ppu_opcode_t op) const auto addr = op.ra ? m_ir->CreateAdd(GetGpr(op.ra), GetGpr(op.rb)) : GetGpr(op.rb); const auto data = pshufb(get_vr(op.vs), build(127, 126, 125, 124, 123, 122, 121, 120, 119, 118, 117, 116, 115, 114, 113, 112) + vsplat(trunc(value(addr) & 0xf))); const auto mask = bitcast(splat(0xffff) << trunc(value(addr) & 0xf)); - const auto ptr = value(GetMemory(m_ir->CreateAnd(addr, ~0xfull))); - const auto align = splat(16); - eval(llvm_calli{"llvm.masked.store.v16i8.p0", {data, ptr, align, mask}}); + m_ir->CreateMaskedStore(data.eval(m_ir), GetMemory(m_ir->CreateAnd(addr, ~0xfull)), llvm::Align(16), mask.eval(m_ir)); } void PPUTranslator::STDBRX(ppu_opcode_t op) @@ -3711,9 +3709,7 @@ void PPUTranslator::STVRX(ppu_opcode_t op) const auto addr = op.ra ? m_ir->CreateAdd(GetGpr(op.ra), GetGpr(op.rb)) : GetGpr(op.rb); const auto data = pshufb(get_vr(op.vs), build(255, 254, 253, 252, 251, 250, 249, 248, 247, 246, 245, 244, 243, 242, 241, 240) + vsplat(trunc(value(addr) & 0xf))); const auto mask = bitcast(trunc(splat(0xffff) << (value(addr) & 0xf) >> 16)); - const auto ptr = value(GetMemory(m_ir->CreateAnd(addr, ~0xfull))); - const auto align = splat(16); - eval(llvm_calli{"llvm.masked.store.v16i8.p0", {data, ptr, align, mask}}); + m_ir->CreateMaskedStore(data.eval(m_ir), GetMemory(m_ir->CreateAnd(addr, ~0xfull)), llvm::Align(16), mask.eval(m_ir)); } void PPUTranslator::STFSUX(ppu_opcode_t op) From 302e87c920038bae1d35f631b7c3bb8ec909379a Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sat, 21 Feb 2026 21:20:11 +0300 Subject: [PATCH 047/295] rsx/vk: Improve robustness when encountering corrupted shaders --- .../Emu/RSX/Program/FragmentProgramDecompiler.cpp | 3 +++ rpcs3/Emu/RSX/VK/VKDraw.cpp | 14 ++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/rpcs3/Emu/RSX/Program/FragmentProgramDecompiler.cpp b/rpcs3/Emu/RSX/Program/FragmentProgramDecompiler.cpp index c00cef47e6..8f134ebfae 100644 --- a/rpcs3/Emu/RSX/Program/FragmentProgramDecompiler.cpp +++ b/rpcs3/Emu/RSX/Program/FragmentProgramDecompiler.cpp @@ -868,8 +868,11 @@ std::string FragmentProgramDecompiler::BuildCode() if (!m_is_valid_ucode) { // If the code is broken, do not compile. Simply NOP main and write empty outputs + m_parr.params[PF_PARAM_UNIFORM].clear(); insertHeader(OS); OS << "\n"; + insertConstants(OS); + OS << "\n"; OS << "void main()\n"; OS << "{\n"; OS << "#if 0\n"; diff --git a/rpcs3/Emu/RSX/VK/VKDraw.cpp b/rpcs3/Emu/RSX/VK/VKDraw.cpp index 634131b13b..b18ebaed3a 100644 --- a/rpcs3/Emu/RSX/VK/VKDraw.cpp +++ b/rpcs3/Emu/RSX/VK/VKDraw.cpp @@ -635,9 +635,16 @@ bool VKGSRender::bind_texture_env() { if (!(textures_ref & 1)) { + // Unused TIU continue; } + if (m_fs_binding_table->ftex_location[i] == umax) + { + // Corrupt shader table + break; + } + vk::image_view* view = nullptr; auto sampler_state = static_cast(fs_sampler_state[i].get()); @@ -707,9 +714,16 @@ bool VKGSRender::bind_texture_env() { if (!(textures_ref & 1)) { + // Unused TIU continue; } + if (m_vs_binding_table->vtex_location[i] == umax) + { + // Corrupt shader + break; + } + if (!rsx::method_registers.vertex_textures[i].enabled()) { const auto view_type = vk::get_view_type(current_vertex_program.get_texture_dimension(i)); From 5f6822042dff8f9324efa6e4775944329d461739 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Mon, 9 Mar 2026 04:10:29 +0300 Subject: [PATCH 048/295] gl: Silence warnings --- rpcs3/Emu/RSX/GL/glutils/common.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/glutils/common.h b/rpcs3/Emu/RSX/GL/glutils/common.h index a147a6e754..24e62a9189 100644 --- a/rpcs3/Emu/RSX/GL/glutils/common.h +++ b/rpcs3/Emu/RSX/GL/glutils/common.h @@ -87,7 +87,7 @@ namespace gl void set_name(std::string_view name) { m_name = name.data(); - glObjectLabel(Ns, m_id, name.length(), name.data()); + glObjectLabel(Ns, m_id, static_cast(name.length()), name.data()); } std::string_view name() const @@ -97,9 +97,9 @@ namespace gl }; // Very useful util when capturing traces with RenderDoc - static inline void push_debug_label(const char* label) + static inline void push_debug_label(std::string_view label) { - glInsertEventMarkerEXT(static_cast(strlen(label)), label); + glInsertEventMarkerEXT(static_cast(label.size()), label.data()); } // Checks if GL state is still valid From 65320446f019281ed44d240f86b9b9771b2e7e83 Mon Sep 17 00:00:00 2001 From: Ani Date: Mon, 9 Mar 2026 11:34:07 +0100 Subject: [PATCH 049/295] vk: Add 0x13C0 NAVI2 device ID (Raphael Mendocino) This is the iGPU on 9800X3D --- rpcs3/Emu/RSX/VK/vkutils/chip_class.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/rpcs3/Emu/RSX/VK/vkutils/chip_class.cpp b/rpcs3/Emu/RSX/VK/vkutils/chip_class.cpp index de9bf8a124..fd98fe1ca0 100644 --- a/rpcs3/Emu/RSX/VK/vkutils/chip_class.cpp +++ b/rpcs3/Emu/RSX/VK/vkutils/chip_class.cpp @@ -28,6 +28,7 @@ namespace vk table.add(0x7420, 0x743F, chip_class::AMD_navi2x); // Navi 24 (Beige Goby) table.add(0x163F, chip_class::AMD_navi2x); // Navi 2X (Van Gogh) table.add(0x164D, 0x1681, chip_class::AMD_navi2x); // Navi 2X (Yellow Carp) + table.add(0x13C0, chip_class::AMD_navi2x); // Navi 2X (Raphael Mendocino) table.add(0x7440, 0x745F, chip_class::AMD_navi3x); // Navi 31 (Only 744c, NAVI31XTX is confirmed) table.add(0x7460, 0x747F, chip_class::AMD_navi3x); // Navi 32 (Unverified) table.add(0x7480, 0x749F, chip_class::AMD_navi3x); // Navi 33 (Unverified) From e0a0d736c4df546cdf250f534d5b912f239134ae Mon Sep 17 00:00:00 2001 From: Megamouse Date: Tue, 10 Mar 2026 01:45:05 +0100 Subject: [PATCH 050/295] cellGem: remove redundant check --- rpcs3/Emu/Cell/Modules/cellGem.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/cellGem.cpp b/rpcs3/Emu/Cell/Modules/cellGem.cpp index f87b4349a1..2ed6d8911d 100644 --- a/rpcs3/Emu/Cell/Modules/cellGem.cpp +++ b/rpcs3/Emu/Cell/Modules/cellGem.cpp @@ -1609,12 +1609,6 @@ public: return false; } - if (!m_camera_info.bytesize) - { - cellGem.error("gem_tracker: unexpected image size: %d", m_camera_info.bytesize); - return false; - } - m_tracker.set_image_data(m_camera_info.buffer.get_ptr(), m_camera_info.bytesize, m_camera_info.width, m_camera_info.height, m_camera_info.format); m_framenumber++; // using framenumber instead of timestamp since the timestamp could be identical return true; From 0f92ea2578a48ee21aff2430be2d28baefde8c48 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Tue, 10 Mar 2026 01:50:56 +0100 Subject: [PATCH 051/295] cellGem: fix memcpy in cellGemReadExternalPortDeviceInfo It was copying from dst to src, and the wrong size at that --- rpcs3/Emu/Cell/Modules/cellGem.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpcs3/Emu/Cell/Modules/cellGem.cpp b/rpcs3/Emu/Cell/Modules/cellGem.cpp index 2ed6d8911d..11cc18e547 100644 --- a/rpcs3/Emu/Cell/Modules/cellGem.cpp +++ b/rpcs3/Emu/Cell/Modules/cellGem.cpp @@ -3619,7 +3619,7 @@ error_code cellGemReadExternalPortDeviceInfo(u32 gem_num, vm::ptr ext_id, v if (!pad->move_data.external_device_read_requested) { *ext_id = controller.ext_id = pad->move_data.external_device_id; - std::memcpy(pad->move_data.external_device_read.data(), ext_info.get_ptr(), CELL_GEM_EXTERNAL_PORT_OUTPUT_SIZE); + std::memcpy(ext_info.get_ptr(), pad->move_data.external_device_read.data(), CELL_GEM_EXTERNAL_PORT_DEVICE_INFO_SIZE); break; } } From 763001ee91c515fc77c050258bba383acb75f25e Mon Sep 17 00:00:00 2001 From: Megamouse Date: Tue, 10 Mar 2026 01:53:51 +0100 Subject: [PATCH 052/295] cellGem: fix gain channels --- rpcs3/Emu/Cell/Modules/cellGem.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/cellGem.cpp b/rpcs3/Emu/Cell/Modules/cellGem.cpp index 11cc18e547..9731474b51 100644 --- a/rpcs3/Emu/Cell/Modules/cellGem.cpp +++ b/rpcs3/Emu/Cell/Modules/cellGem.cpp @@ -770,8 +770,8 @@ namespace gem if constexpr (use_gain) { dst0[0] = static_cast(std::clamp(r * gain_r, 0.0f, 255.0f)); - dst0[1] = static_cast(std::clamp(b * gain_b, 0.0f, 255.0f)); - dst0[2] = static_cast(std::clamp(g * gain_g, 0.0f, 255.0f)); + dst0[1] = static_cast(std::clamp(g * gain_g, 0.0f, 255.0f)); + dst0[2] = static_cast(std::clamp(b * gain_b, 0.0f, 255.0f)); } else { @@ -822,8 +822,8 @@ namespace gem if constexpr (use_gain) { dst0[0] = static_cast(std::clamp(r * gain_r, 0.0f, 255.0f)); - dst0[1] = static_cast(std::clamp(b * gain_b, 0.0f, 255.0f)); - dst0[2] = static_cast(std::clamp(g * gain_g, 0.0f, 255.0f)); + dst0[1] = static_cast(std::clamp(g * gain_g, 0.0f, 255.0f)); + dst0[2] = static_cast(std::clamp(b * gain_b, 0.0f, 255.0f)); } else { @@ -881,9 +881,9 @@ namespace gem const u8* src_data = video_data_in.data(); const u8 alpha = vc.alpha; - const f32 gain_r = vc.gain * vc.blue_gain; + const f32 gain_r = vc.gain * vc.red_gain; const f32 gain_g = vc.gain * vc.green_gain; - const f32 gain_b = vc.gain * vc.red_gain; + const f32 gain_b = vc.gain * vc.blue_gain; // Only RAW8 should be relevant for cellGem unless I'm mistaken if (input_format == CELL_CAMERA_RAW8) From 71f0d5c60233494e7fe2c3f2ff416a00c87480fb Mon Sep 17 00:00:00 2001 From: Megamouse Date: Tue, 10 Mar 2026 03:38:24 +0100 Subject: [PATCH 053/295] cellGem: fix RAW8 to RGBA_320x240 We were basically writing two rows into dst for each other src line. This means we were writing 480 lines in total instead of 240, overwriting one of the lines written in the previous iteration. This led to writing one line out of bounds last iteration. Let's just use a simple debayer technique which perfectly matches here. This also applies the previously missing gain factors. I also tried to first demosaic and then drop every other pixel. The result was comparatively blurred and the performance worse. --- rpcs3/Emu/Cell/Modules/cellGem.cpp | 76 +++++++++++++++++++----------- 1 file changed, 48 insertions(+), 28 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/cellGem.cpp b/rpcs3/Emu/Cell/Modules/cellGem.cpp index 9731474b51..d45dace1ca 100644 --- a/rpcs3/Emu/Cell/Modules/cellGem.cpp +++ b/rpcs3/Emu/Cell/Modules/cellGem.cpp @@ -845,6 +845,53 @@ namespace gem debayer_raw8_impl(src, dst, alpha, gain_r, gain_g, gain_b); } + template + static inline void debayer_raw8_downscale_impl(const u8* src, u8* dst, u8 alpha, f32 gain_r, f32 gain_g, f32 gain_b) + { + constexpr u32 in_pitch = 640; + constexpr u32 out_pitch = 320 * 4; + + // Simple debayer + for (s32 y = 0; y < 240; y++) + { + const u8* src0 = src + y * 2 * in_pitch; + const u8* src1 = src0 + in_pitch; + + u8* dst0 = dst + y * out_pitch; + + for (s32 x = 0; x < 320; x++, dst0 += 4, src0 += 2, src1 += 2) + { + const u8 b = src0[0]; + const u8 g0 = src0[1]; + const u8 g1 = src1[0]; + const u8 r = src1[1]; + const u8 g = (g0 + g1) >> 1; + + if constexpr (use_gain) + { + dst0[0] = static_cast(std::clamp(r * gain_r, 0.0f, 255.0f)); + dst0[1] = static_cast(std::clamp(g * gain_g, 0.0f, 255.0f)); + dst0[2] = static_cast(std::clamp(b * gain_b, 0.0f, 255.0f)); + } + else + { + dst0[0] = r; + dst0[1] = g; + dst0[2] = b; + } + dst0[3] = alpha; + } + } + } + + static void debayer_raw8_downscale(const u8* src, u8* dst, u8 alpha, f32 gain_r, f32 gain_g, f32 gain_b) + { + if (gain_r != 1.0f || gain_g != 1.0f || gain_b != 1.0f) + debayer_raw8_downscale_impl(src, dst, alpha, gain_r, gain_g, gain_b); + else + debayer_raw8_downscale_impl(src, dst, alpha, gain_r, gain_g, gain_b); + } + bool convert_image_format(CellCameraFormat input_format, const CellGemVideoConvertAttribute& vc, const std::vector& video_data_in, u32 width, u32 height, u8* video_data_out, u32 video_data_out_size, u8* buffer_memory, @@ -1183,34 +1230,7 @@ namespace gem { case CELL_CAMERA_RAW8: { - const u32 in_pitch = width; - const u32 out_pitch = width * 4 / 2; - - for (u32 y = 0; y < height - 1; y += 2) - { - const u8* src0 = src_data + y * in_pitch; - const u8* src1 = src0 + in_pitch; - - u8* dst0 = video_data_out + (y / 2) * out_pitch; - u8* dst1 = dst0 + out_pitch; - - for (u32 x = 0; x < width - 1; x += 2, src0 += 2, src1 += 2, dst0 += 4, dst1 += 4) - { - const u8 b = src0[0]; - const u8 g0 = src0[1]; - const u8 g1 = src1[0]; - const u8 r = src1[1]; - - const u8 top[4] = { r, g0, b, alpha }; - const u8 bottom[4] = { r, g1, b, alpha }; - - // Top-Left - std::memcpy(dst0, top, 4); - - // Bottom-Left Pixel - std::memcpy(dst1, bottom, 4); - } - } + debayer_raw8_downscale(src_data, video_data_out, alpha, gain_r, gain_g, gain_b); break; } case CELL_CAMERA_RGBA: From 0603d24a911013051a29b3794567ec75b760de61 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Tue, 10 Mar 2026 05:33:55 +0100 Subject: [PATCH 054/295] Qt: play SND0.AT3 in game lists when a movie would play --- rpcs3/Emu/GameInfo.h | 1 + rpcs3/rpcs3qt/game_list_frame.cpp | 6 ++ rpcs3/rpcs3qt/game_list_grid.cpp | 18 +++++- rpcs3/rpcs3qt/game_list_table.cpp | 18 +++++- rpcs3/rpcs3qt/gui_game_info.h | 1 + rpcs3/rpcs3qt/qt_video_source.cpp | 89 ++++++++++++++++++++++++++- rpcs3/rpcs3qt/qt_video_source.h | 7 +++ rpcs3/rpcs3qt/save_manager_dialog.cpp | 6 ++ rpcs3/util/video_source.h | 1 + 9 files changed, 140 insertions(+), 7 deletions(-) diff --git a/rpcs3/Emu/GameInfo.h b/rpcs3/Emu/GameInfo.h index 3efca1410a..da8b2638ba 100644 --- a/rpcs3/Emu/GameInfo.h +++ b/rpcs3/Emu/GameInfo.h @@ -8,6 +8,7 @@ struct GameInfo std::string path; std::string icon_path; std::string movie_path; + std::string audio_path; std::string name; std::string serial; diff --git a/rpcs3/rpcs3qt/game_list_frame.cpp b/rpcs3/rpcs3qt/game_list_frame.cpp index ea7b87ff6d..5ba31d9d77 100644 --- a/rpcs3/rpcs3qt/game_list_frame.cpp +++ b/rpcs3/rpcs3qt/game_list_frame.cpp @@ -637,6 +637,12 @@ void game_list_frame::OnParsingFinished() game.has_hover_pam = true; } + if (std::string audio_path = sfo_dir + "/SND0.AT3"; file_exists(audio_path)) + { + game.info.audio_path = std::move(audio_path); + game.has_audio_file = true; + } + const QString serial = QString::fromStdString(game.info.serial); m_games_mutex.lock(); diff --git a/rpcs3/rpcs3qt/game_list_grid.cpp b/rpcs3/rpcs3qt/game_list_grid.cpp index a33755ff54..4dfcf9744a 100644 --- a/rpcs3/rpcs3qt/game_list_grid.cpp +++ b/rpcs3/rpcs3qt/game_list_grid.cpp @@ -109,11 +109,23 @@ void game_list_grid::populate( } }); - if (play_hover_movies && (game->has_hover_gif || game->has_hover_pam)) + if (play_hover_movies && (game->has_hover_gif || game->has_hover_pam || game->has_audio_file)) { - item->set_video_path(game->info.movie_path); + bool check_iso = false; - if (!fs::exists(game->info.movie_path) && is_file_iso(game->info.path)) + if (game->has_hover_gif || game->has_hover_pam) + { + item->set_video_path(game->info.movie_path); + check_iso |= !fs::exists(game->info.movie_path); + } + + if (game->has_audio_file) + { + item->set_audio_path(game->info.audio_path); + check_iso |= !fs::exists(game->info.audio_path); + } + + if (check_iso && is_file_iso(game->info.path)) { item->set_iso_path(game->info.path); } diff --git a/rpcs3/rpcs3qt/game_list_table.cpp b/rpcs3/rpcs3qt/game_list_table.cpp index 98b9ef344d..737709dabb 100644 --- a/rpcs3/rpcs3qt/game_list_table.cpp +++ b/rpcs3/rpcs3qt/game_list_table.cpp @@ -299,11 +299,23 @@ void game_list_table::populate( } }); - if (play_hover_movies && (game->has_hover_gif || game->has_hover_pam)) + if (play_hover_movies && (game->has_hover_gif || game->has_hover_pam || game->has_audio_file)) { - icon_item->set_video_path(game->info.movie_path); + bool check_iso = false; - if (!fs::exists(game->info.movie_path) && is_file_iso(game->info.path)) + if (game->has_hover_gif || game->has_hover_pam) + { + icon_item->set_video_path(game->info.movie_path); + check_iso |= !fs::exists(game->info.movie_path); + } + + if (game->has_audio_file) + { + icon_item->set_audio_path(game->info.audio_path); + check_iso |= !fs::exists(game->info.audio_path); + } + + if (check_iso && is_file_iso(game->info.path)) { icon_item->set_iso_path(game->info.path); } diff --git a/rpcs3/rpcs3qt/gui_game_info.h b/rpcs3/rpcs3qt/gui_game_info.h index 08483fa7fb..693483dd6a 100644 --- a/rpcs3/rpcs3qt/gui_game_info.h +++ b/rpcs3/rpcs3qt/gui_game_info.h @@ -21,6 +21,7 @@ struct gui_game_info bool has_custom_icon = false; bool has_hover_gif = false; bool has_hover_pam = false; + bool has_audio_file = false; bool icon_in_archive = false; movie_item_base* item = nullptr; diff --git a/rpcs3/rpcs3qt/qt_video_source.cpp b/rpcs3/rpcs3qt/qt_video_source.cpp index d74d395c58..2d4ce34aa3 100644 --- a/rpcs3/rpcs3qt/qt_video_source.cpp +++ b/rpcs3/rpcs3qt/qt_video_source.cpp @@ -1,11 +1,19 @@ #include "stdafx.h" #include "Emu/System.h" +#include "Emu/system_config.h" #include "qt_video_source.h" #include "Loader/ISO.h" +#include #include +static video_source* s_audio_source = nullptr; +static std::unique_ptr s_audio_player = nullptr; +static std::unique_ptr s_audio_output = nullptr; +static std::unique_ptr s_audio_buffer = nullptr; +static std::unique_ptr s_audio_data = nullptr; + qt_video_source::qt_video_source() : video_source() { @@ -21,6 +29,11 @@ void qt_video_source::set_video_path(const std::string& video_path) m_video_path = QString::fromStdString(video_path); } +void qt_video_source::set_audio_path(const std::string& audio_path) +{ + m_audio_path = QString::fromStdString(audio_path); +} + void qt_video_source::set_iso_path(const std::string& iso_path) { m_iso_path = iso_path; @@ -89,7 +102,6 @@ void qt_video_source::init_movie() m_video_buffer = std::make_unique(&m_video_data); m_video_buffer->open(QIODevice::ReadOnly); m_movie = std::make_unique(m_video_buffer.get()); - } if (!m_movie->isValid()) @@ -179,6 +191,8 @@ void qt_video_source::start_movie() m_media_player->play(); } + start_audio(); + m_active = true; } @@ -196,6 +210,71 @@ void qt_video_source::stop_movie() m_media_player.reset(); m_video_buffer.reset(); m_video_data.clear(); + + stop_audio(); +} + +void qt_video_source::start_audio() +{ + if (m_audio_path.isEmpty() || s_audio_source == this) return; + + if (!s_audio_player) + { + s_audio_output = std::make_unique(); + s_audio_player = std::make_unique(); + s_audio_player->setAudioOutput(s_audio_output.get()); + } + + if (m_iso_path.empty()) + { + s_audio_player->setSource(QUrl::fromLocalFile(m_audio_path)); + } + else + { + iso_archive archive(m_iso_path); + auto audio_file = archive.open(m_audio_path.toStdString()); + const auto audio_size = audio_file.size(); + if (audio_size == 0) return; + + std::unique_ptr old_audio_data = std::move(s_audio_data); + s_audio_data = std::make_unique(audio_size, 0); + audio_file.read(s_audio_data->data(), audio_size); + + if (!s_audio_buffer) + { + s_audio_buffer = std::make_unique(); + } + + s_audio_buffer->setBuffer(s_audio_data.get()); + s_audio_buffer->open(QIODevice::ReadOnly); + s_audio_player->setSourceDevice(s_audio_buffer.get()); + + if (old_audio_data) + { + old_audio_data.reset(); + } + } + + s_audio_output->setVolume(g_cfg.audio.volume.get() / 100.0f); + s_audio_player->play(); + s_audio_source = this; +} + +void qt_video_source::stop_audio() +{ + if (s_audio_source != this) return; + + s_audio_source = nullptr; + + if (s_audio_player) + { + s_audio_player->stop(); + s_audio_player.reset(); + } + + s_audio_output.reset(); + s_audio_buffer.reset(); + s_audio_data.reset(); } QPixmap qt_video_source::get_movie_image(const QVideoFrame& frame) const @@ -288,6 +367,14 @@ void qt_video_source_wrapper::set_video_path(const std::string& video_path) }); } +void qt_video_source_wrapper::set_audio_path(const std::string& audio_path) +{ + Emu.CallFromMainThread([this, path = audio_path]() + { + // TODO + }); +} + void qt_video_source_wrapper::set_active(bool active) { Emu.CallFromMainThread([this, active]() diff --git a/rpcs3/rpcs3qt/qt_video_source.h b/rpcs3/rpcs3qt/qt_video_source.h index ce43d593d7..cda92671a2 100644 --- a/rpcs3/rpcs3qt/qt_video_source.h +++ b/rpcs3/rpcs3qt/qt_video_source.h @@ -19,7 +19,9 @@ public: void set_iso_path(const std::string& iso_path); void set_video_path(const std::string& video_path) override; + void set_audio_path(const std::string& audio_path) override; const QString& video_path() const { return m_video_path; } + const QString& audio_path() const { return m_audio_path; } void get_image(std::vector& data, int& w, int& h, int& ch, int& bpp) override; bool has_new() const override { return m_has_new; } @@ -30,6 +32,9 @@ public: void start_movie(); void stop_movie(); + void start_audio(); + void stop_audio(); + QPixmap get_movie_image(const QVideoFrame& frame) const; void image_change_callback(const QVideoFrame& frame = {}) const; @@ -44,6 +49,7 @@ protected: atomic_t m_has_new = false; QString m_video_path; + QString m_audio_path; std::string m_iso_path; // path of the source archive QByteArray m_video_data{}; QImage m_image{}; @@ -67,6 +73,7 @@ public: virtual ~qt_video_source_wrapper(); void set_video_path(const std::string& video_path) override; + void set_audio_path(const std::string& audio_path) override; void set_active(bool active) override; bool get_active() const override; bool has_new() const override { return m_qt_video_source && m_qt_video_source->has_new(); } diff --git a/rpcs3/rpcs3qt/save_manager_dialog.cpp b/rpcs3/rpcs3qt/save_manager_dialog.cpp index 2dd2a14e86..002df8d527 100644 --- a/rpcs3/rpcs3qt/save_manager_dialog.cpp +++ b/rpcs3/rpcs3qt/save_manager_dialog.cpp @@ -360,6 +360,11 @@ void save_manager_dialog::UpdateList() icon_item->set_video_path(movie_path); } + if (const std::string audio_path = dir_path + "SND0.AT3"; fs::is_file(audio_path)) + { + icon_item->set_audio_path(audio_path); + } + icon_item->set_image_change_callback([this, icon_item](const QVideoFrame& frame) { if (!icon_item) @@ -686,6 +691,7 @@ void save_manager_dialog::UpdateDetails() const SaveDataEntry& save = ::at32(m_save_entries, idx); m_details_icon->set_video_path(icon_item->video_path().toStdString()); + m_details_icon->set_audio_path(icon_item->audio_path().toStdString()); m_details_icon->set_thumbnail(icon_item->data(SaveUserRole::Pixmap).value()); m_details_icon->set_active(false); diff --git a/rpcs3/util/video_source.h b/rpcs3/util/video_source.h index 9449ed238e..a18b564209 100644 --- a/rpcs3/util/video_source.h +++ b/rpcs3/util/video_source.h @@ -9,6 +9,7 @@ public: video_source() {}; virtual ~video_source() {}; virtual void set_video_path(const std::string& video_path) = 0; + virtual void set_audio_path(const std::string& audio_path) = 0; virtual void set_active(bool active) = 0; virtual bool get_active() const = 0; virtual bool has_new() const = 0; From 6d52415d5025a593e643d2a823a392c1a07ec920 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Mon, 9 Mar 2026 17:53:45 +0300 Subject: [PATCH 055/295] gl: Ignore range offset when doing readback operations - OGL desperately needs a functioning DMA layer --- rpcs3/Emu/RSX/GL/GLTextureCache.h | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/GLTextureCache.h b/rpcs3/Emu/RSX/GL/GLTextureCache.h index 8bfc92f902..7fb932681b 100644 --- a/rpcs3/Emu/RSX/GL/GLTextureCache.h +++ b/rpcs3/Emu/RSX/GL/GLTextureCache.h @@ -171,14 +171,6 @@ namespace gl { static_cast(src_area.width()), static_cast(src_area.height()), 1 } }; - u32 pbo_offset = 0; - if (valid_range.valid()) - { - const u32 section_base = get_section_base(); - pbo_offset = valid_range.start - section_base; - ensure(valid_range.start >= section_base && pbo_offset <= pbo.size()); - } - bool use_driver_pixel_transform = true; if (get_driver_caps().ARB_compute_shader_supported) [[likely]] { @@ -214,7 +206,7 @@ namespace gl real_pitch = pack_info.size * src->width(); const u64 data_length = pack_info.size * mem_info.image_size_in_texels; - scratch_mem.copy_to(&pbo, reinterpret_cast(out_offset), pbo_offset, data_length); + scratch_mem.copy_to(&pbo, reinterpret_cast(out_offset), 0, data_length); } else { @@ -237,7 +229,7 @@ namespace gl pack_settings.alignment(1); pack_settings.swap_bytes(pack_unpack_swap_bytes); - src->copy_to(pbo, pbo_offset, format, type, 0, src_rgn, pack_settings); + src->copy_to(pbo, 0, format, type, 0, src_rgn, pack_settings); } if (auto error = glGetError()) From 36cdaac3276736b0d0d719ec6948620b92697e18 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Mon, 9 Mar 2026 17:54:05 +0300 Subject: [PATCH 056/295] overlays: Fix image size estimation --- rpcs3/Emu/RSX/Overlays/overlay_controls.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpcs3/Emu/RSX/Overlays/overlay_controls.h b/rpcs3/Emu/RSX/Overlays/overlay_controls.h index f64fdfa47f..350a1c5901 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_controls.h +++ b/rpcs3/Emu/RSX/Overlays/overlay_controls.h @@ -40,7 +40,7 @@ namespace rsx image_info_base() {} virtual ~image_info_base() {} virtual const u8* get_data() const = 0; - virtual usz size_bytes() const { return static_cast(w * h * bpp); } + virtual usz size_bytes() const { return static_cast(w * h * 4); } // UI images get converted to RGBA8 std::span as_span() const { return { get_data(), size_bytes() }; } }; From ab72ce418eb9d0a7b3f0482dbdc47ed565f04e29 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Mon, 9 Mar 2026 18:14:54 +0300 Subject: [PATCH 057/295] gl: Minor enhancements to blitter - Move some functions to cpp. Makes it easier to debug failing image operations - Add fbo validation before blit operations --- rpcs3/Emu/RSX/GL/glutils/blitter.cpp | 15 +++++++++++++++ rpcs3/Emu/RSX/GL/glutils/blitter.h | 12 ++---------- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/glutils/blitter.cpp b/rpcs3/Emu/RSX/GL/glutils/blitter.cpp index 57998b761d..47c7d7b1ca 100644 --- a/rpcs3/Emu/RSX/GL/glutils/blitter.cpp +++ b/rpcs3/Emu/RSX/GL/glutils/blitter.cpp @@ -8,6 +8,18 @@ namespace gl { blitter* g_hw_blitter = nullptr; + void blitter::init() + { + blit_src.create(); + blit_dst.create(); + } + + void blitter::destroy() + { + blit_dst.remove(); + blit_src.remove(); + } + void blitter::copy_image(gl::command_context&, const texture* src, const texture* dst, int src_level, int dst_level, const position3i& src_offset, const position3i& dst_offset, const size3i& size) const { ensure(src_level == 0); @@ -147,6 +159,9 @@ namespace gl gl::fbo::attachment dst_att{ blit_dst, static_cast(attachment) }; dst_att = *real_dst; + blit_src.check(); + blit_dst.check(); + blit_src.blit(blit_dst, src_rect, dst_rect, target, interp); // Release the attachments explicitly (not doing so causes glitches, e.g Journey Menu) diff --git a/rpcs3/Emu/RSX/GL/glutils/blitter.h b/rpcs3/Emu/RSX/GL/glutils/blitter.h index d7adc1dd14..d56754fcae 100644 --- a/rpcs3/Emu/RSX/GL/glutils/blitter.h +++ b/rpcs3/Emu/RSX/GL/glutils/blitter.h @@ -30,17 +30,9 @@ namespace gl public: - void init() - { - blit_src.create(); - blit_dst.create(); - } + void init(); - void destroy() - { - blit_dst.remove(); - blit_src.remove(); - } + void destroy(); void scale_image(gl::command_context& cmd, const texture* src, texture* dst, areai src_rect, areai dst_rect, bool linear_interpolation, const rsx::typeless_xfer& xfer_info); From 5f86315ae05eea9efe92e1169007cd166a4da231 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Mon, 9 Mar 2026 20:51:27 +0300 Subject: [PATCH 058/295] gl: Fix shader interpreter compilation --- rpcs3/Emu/RSX/GL/GLShaderInterpreter.cpp | 1 + rpcs3/Emu/RSX/VK/VKShaderInterpreter.cpp | 1 + 2 files changed, 2 insertions(+) diff --git a/rpcs3/Emu/RSX/GL/GLShaderInterpreter.cpp b/rpcs3/Emu/RSX/GL/GLShaderInterpreter.cpp index c7f9ec2622..fa5b3627c4 100644 --- a/rpcs3/Emu/RSX/GL/GLShaderInterpreter.cpp +++ b/rpcs3/Emu/RSX/GL/GLShaderInterpreter.cpp @@ -300,6 +300,7 @@ namespace gl } builder << "\n" + "#undef TEX_PARAM\n" "#define TEX_PARAM(index) texture_parameters[index + texture_base_index]\n" "#define IS_TEXTURE_RESIDENT(index) (texture_handles[index] < 0xFF)\n" "#define SAMPLER1D(index) sampler1D_array[texture_handles[index]]\n" diff --git a/rpcs3/Emu/RSX/VK/VKShaderInterpreter.cpp b/rpcs3/Emu/RSX/VK/VKShaderInterpreter.cpp index 9315ac1593..7f6db33317 100644 --- a/rpcs3/Emu/RSX/VK/VKShaderInterpreter.cpp +++ b/rpcs3/Emu/RSX/VK/VKShaderInterpreter.cpp @@ -264,6 +264,7 @@ namespace vk } builder << "\n" + "#undef TEX_PARAM\n" "#define TEX_PARAM(index) texture_parameters[index + texture_base_index]\n" "#define IS_TEXTURE_RESIDENT(index) true\n" "#define SAMPLER1D(index) sampler1D_array[index]\n" From 0869ef421d0eecbe977e7ed35c0e59f2d2943bd6 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Mon, 9 Mar 2026 20:51:36 +0300 Subject: [PATCH 059/295] gl: Silence compiler warning --- rpcs3/Emu/RSX/GL/GLTextureCache.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpcs3/Emu/RSX/GL/GLTextureCache.h b/rpcs3/Emu/RSX/GL/GLTextureCache.h index 7fb932681b..d4e50fd066 100644 --- a/rpcs3/Emu/RSX/GL/GLTextureCache.h +++ b/rpcs3/Emu/RSX/GL/GLTextureCache.h @@ -148,7 +148,7 @@ namespace gl } } - void dma_transfer(gl::command_context& cmd, gl::texture* src, const areai& src_area, const utils::address_range32& valid_range, u32 pitch) + void dma_transfer(gl::command_context& cmd, gl::texture* src, const areai& src_area, const utils::address_range32& /*valid_range*/, u32 pitch) { init_buffer(src); glGetError(); From ef70a6e82584d291b889a1ab04f46ecfa7ee032e Mon Sep 17 00:00:00 2001 From: kd-11 Date: Mon, 9 Mar 2026 21:09:25 +0300 Subject: [PATCH 060/295] gl: Move ownership of the global blitter object from texture cache to global --- rpcs3/Emu/RSX/GL/GLGSRender.cpp | 1 + rpcs3/Emu/RSX/GL/GLTexture.cpp | 9 +++++++++ rpcs3/Emu/RSX/GL/GLTexture.h | 1 + rpcs3/Emu/RSX/GL/GLTextureCache.h | 11 ++--------- 4 files changed, 13 insertions(+), 9 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/GLGSRender.cpp b/rpcs3/Emu/RSX/GL/GLGSRender.cpp index 408ea9f784..4ad9619d7f 100644 --- a/rpcs3/Emu/RSX/GL/GLGSRender.cpp +++ b/rpcs3/Emu/RSX/GL/GLGSRender.cpp @@ -398,6 +398,7 @@ void GLGSRender::on_init_thread() m_ui_renderer.create(); m_video_output_pass.create(); + gl::init_global_texture_resources(); m_gl_texture_cache.initialize(); m_prog_buffer.initialize diff --git a/rpcs3/Emu/RSX/GL/GLTexture.cpp b/rpcs3/Emu/RSX/GL/GLTexture.cpp index 40c3af180c..5dfc663c68 100644 --- a/rpcs3/Emu/RSX/GL/GLTexture.cpp +++ b/rpcs3/Emu/RSX/GL/GLTexture.cpp @@ -22,6 +22,13 @@ namespace gl legacy_ring_buffer g_upload_transfer_buffer; scratch_ring_buffer g_compute_decode_buffer; scratch_ring_buffer g_deswizzle_scratch_buffer; + blitter g_blitter; + + void init_global_texture_resources() + { + g_blitter.init(); + g_hw_blitter = &g_blitter; + } void destroy_global_texture_resources() { @@ -29,6 +36,8 @@ namespace gl g_upload_transfer_buffer.remove(); g_compute_decode_buffer.remove(); g_deswizzle_scratch_buffer.remove(); + g_blitter.destroy(); + g_hw_blitter = nullptr; } template diff --git a/rpcs3/Emu/RSX/GL/GLTexture.h b/rpcs3/Emu/RSX/GL/GLTexture.h index 10c26dc536..7b3ff73db4 100644 --- a/rpcs3/Emu/RSX/GL/GLTexture.h +++ b/rpcs3/Emu/RSX/GL/GLTexture.h @@ -86,5 +86,6 @@ namespace gl extern std::unique_ptr g_vis_texture; } + void init_global_texture_resources(); void destroy_global_texture_resources(); } diff --git a/rpcs3/Emu/RSX/GL/GLTextureCache.h b/rpcs3/Emu/RSX/GL/GLTextureCache.h index d4e50fd066..6d724c216f 100644 --- a/rpcs3/Emu/RSX/GL/GLTextureCache.h +++ b/rpcs3/Emu/RSX/GL/GLTextureCache.h @@ -431,9 +431,7 @@ namespace gl using gl::viewable_image::viewable_image; }; - blitter m_hw_blitter; std::vector> m_temporary_surfaces; - const u32 max_cached_image_pool_size = 256; private: @@ -815,16 +813,11 @@ namespace gl using baseclass::texture_cache; void initialize() - { - m_hw_blitter.init(); - g_hw_blitter = &m_hw_blitter; - } + {} void destroy() override { clear(); - g_hw_blitter = nullptr; - m_hw_blitter.destroy(); } bool is_depth_texture(u32 rsx_address, u32 rsx_size) override @@ -870,7 +863,7 @@ namespace gl bool blit(gl::command_context& cmd, const rsx::blit_src_info& src, const rsx::blit_dst_info& dst, bool linear_interpolate, gl_render_targets& m_rtts) { - auto result = upload_scaled_image(src, dst, linear_interpolate, cmd, m_rtts, m_hw_blitter); + auto result = upload_scaled_image(src, dst, linear_interpolate, cmd, m_rtts, *g_hw_blitter); if (result.succeeded) { From 8651875e5971a6db9ac7bc253be7493f65f9ef12 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Mon, 9 Mar 2026 22:08:43 +0300 Subject: [PATCH 061/295] gl: Add optional row length to GPU image routines --- rpcs3/Emu/RSX/GL/GLCompute.cpp | 6 ++-- rpcs3/Emu/RSX/GL/GLOverlays.cpp | 3 +- rpcs3/Emu/RSX/GL/GLTexture.cpp | 46 +++++++++++++++---------------- rpcs3/Emu/RSX/GL/GLTexture.h | 4 ++- rpcs3/Emu/RSX/GL/GLTextureCache.h | 6 ++-- 5 files changed, 34 insertions(+), 31 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/GLCompute.cpp b/rpcs3/Emu/RSX/GL/GLCompute.cpp index 5607c149ed..fd31708df7 100644 --- a/rpcs3/Emu/RSX/GL/GLCompute.cpp +++ b/rpcs3/Emu/RSX/GL/GLCompute.cpp @@ -340,7 +340,7 @@ namespace gl void cs_d24x8_to_ssbo::run(gl::command_context& cmd, gl::viewable_image* src, const gl::buffer* dst, u32 out_offset, const coordu& region, const gl::pixel_buffer_layout& layout) { - const auto row_pitch = region.width; + const auto row_pitch = layout.row_length ? layout.row_length : region.width; m_program.uniforms["swap_bytes"] = layout.swap_bytes; m_program.uniforms["output_pitch"] = row_pitch; @@ -390,14 +390,14 @@ namespace gl void cs_rgba8_to_ssbo::run(gl::command_context& cmd, gl::viewable_image* src, const gl::buffer* dst, u32 out_offset, const coordu& region, const gl::pixel_buffer_layout& layout) { - const auto row_pitch = region.width; + const auto row_pitch = layout.row_length ? layout.row_length : region.width; m_program.uniforms["swap_bytes"] = layout.swap_bytes; m_program.uniforms["output_pitch"] = row_pitch; m_program.uniforms["region_offset"] = color2i(region.x, region.y); m_program.uniforms["region_size"] = color2i(region.width, region.height); m_program.uniforms["is_bgra"] = (layout.format == static_cast(gl::texture::format::bgra)); - m_program.uniforms["block_width"] = static_cast(layout.size); + m_program.uniforms["block_width"] = static_cast(layout.block_size); auto data_view = src->get_view(rsx::default_remap_vector.with_encoding(GL_REMAP_IDENTITY), gl::image_aspect::color); diff --git a/rpcs3/Emu/RSX/GL/GLOverlays.cpp b/rpcs3/Emu/RSX/GL/GLOverlays.cpp index 0c4732430c..6be9aba6a0 100644 --- a/rpcs3/Emu/RSX/GL/GLOverlays.cpp +++ b/rpcs3/Emu/RSX/GL/GLOverlays.cpp @@ -551,7 +551,8 @@ namespace gl const pixel_buffer_layout& layout) { const u32 bpp = dst->image()->pitch() / dst->image()->width(); - const u32 row_length = utils::align(dst_region.width * bpp, std::max(layout.alignment, 1)) / bpp; + const u32 aligned_width = utils::align(dst_region.width * bpp, std::max(layout.alignment, 1)) / bpp; + const u32 row_length = layout.row_length ? layout.row_length : aligned_width; program_handle.uniforms["src_pitch"] = row_length; program_handle.uniforms["swap_bytes"] = layout.swap_bytes; diff --git a/rpcs3/Emu/RSX/GL/GLTexture.cpp b/rpcs3/Emu/RSX/GL/GLTexture.cpp index 5dfc663c68..5c85f71c2e 100644 --- a/rpcs3/Emu/RSX/GL/GLTexture.cpp +++ b/rpcs3/Emu/RSX/GL/GLTexture.cpp @@ -166,42 +166,42 @@ namespace gl case texture::internal_format::compressed_rgba_s3tc_dxt1: case texture::internal_format::compressed_rgba_s3tc_dxt3: case texture::internal_format::compressed_rgba_s3tc_dxt5: - return { GL_RGBA, GL_UNSIGNED_BYTE, 1, false }; + return { .format = GL_RGBA, .type = GL_UNSIGNED_BYTE, .block_size = 1, .swap_bytes = false }; case texture::internal_format::r8: - return { GL_RED, GL_UNSIGNED_BYTE, 1, false }; + return { .format = GL_RED, .type = GL_UNSIGNED_BYTE, .block_size = 1, .swap_bytes = false }; case texture::internal_format::r16: - return { GL_RED, GL_UNSIGNED_SHORT, 2, true }; + return { .format = GL_RED, .type = GL_UNSIGNED_SHORT, .block_size = 2, .swap_bytes = true }; case texture::internal_format::r32f: - return { GL_RED, GL_FLOAT, 4, true }; + return { .format = GL_RED, .type = GL_FLOAT, .block_size = 4, .swap_bytes = true }; case texture::internal_format::rg8: - return { GL_RG, GL_UNSIGNED_SHORT, 2, true }; + return { .format = GL_RG, .type = GL_UNSIGNED_SHORT, .block_size = 2, .swap_bytes = true }; case texture::internal_format::rg16: - return { GL_RG, GL_UNSIGNED_SHORT, 2, true }; + return { .format = GL_RG, .type = GL_UNSIGNED_SHORT, .block_size = 2, .swap_bytes = true }; case texture::internal_format::rg16f: - return { GL_RG, GL_HALF_FLOAT, 2, true }; + return { .format = GL_RG, .type = GL_HALF_FLOAT, .block_size = 2, .swap_bytes = true }; case texture::internal_format::rgb565: - return { GL_RGB, GL_UNSIGNED_SHORT_5_6_5, 2, true }; + return { .format = GL_RGB, .type = GL_UNSIGNED_SHORT_5_6_5, .block_size = 2, .swap_bytes = true }; case texture::internal_format::rgb5a1: - return { GL_RGB, GL_UNSIGNED_SHORT_5_5_5_1, 2, true }; + return { .format = GL_RGB, .type = GL_UNSIGNED_SHORT_5_5_5_1, .block_size = 2, .swap_bytes = true }; case texture::internal_format::bgr5a1: - return { GL_RGB, GL_UNSIGNED_SHORT_1_5_5_5_REV, 2, true }; + return { .format = GL_RGB, .type = GL_UNSIGNED_SHORT_1_5_5_5_REV, .block_size = 2, .swap_bytes = true }; case texture::internal_format::rgba4: - return { GL_BGRA, GL_UNSIGNED_SHORT_4_4_4_4, 2, false }; + return { .format = GL_BGRA, .type = GL_UNSIGNED_SHORT_4_4_4_4, .block_size = 2, .swap_bytes = false }; case texture::internal_format::rgba8: - return { GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, 4, true }; + return { .format = GL_RGBA, .type = GL_UNSIGNED_INT_8_8_8_8_REV, .block_size = 4, .swap_bytes = true }; case texture::internal_format::bgra8: - return { GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, 4, true }; + return { .format = GL_BGRA, .type = GL_UNSIGNED_INT_8_8_8_8_REV, .block_size = 4, .swap_bytes = true }; case texture::internal_format::rgba16f: - return { GL_RGBA, GL_HALF_FLOAT, 2, true }; + return { .format = GL_RGBA, .type = GL_HALF_FLOAT, .block_size = 2, .swap_bytes = true }; case texture::internal_format::rgba32f: - return { GL_RGBA, GL_FLOAT, 4, true }; + return { .format = GL_RGBA, .type = GL_FLOAT, .block_size = 4, .swap_bytes = true }; case texture::internal_format::depth16: - return { GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, 2, true }; + return { .format = GL_DEPTH_COMPONENT, .type = GL_UNSIGNED_SHORT, .block_size = 2, .swap_bytes = true }; case texture::internal_format::depth32f: - return { GL_DEPTH_COMPONENT, GL_FLOAT, 2, true }; + return { .format = GL_DEPTH_COMPONENT, .type = GL_FLOAT, .block_size = 2, .swap_bytes = true }; case texture::internal_format::depth24_stencil8: case texture::internal_format::depth32f_stencil8: - return { GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, 4, true }; + return { .format = GL_DEPTH_STENCIL, .type = GL_UNSIGNED_INT_24_8, .block_size = 4, .swap_bytes = true }; default: fmt::throw_exception("Unexpected internal format 0x%X", static_cast(format)); } @@ -320,7 +320,7 @@ namespace gl return nullptr; } - switch (pack_info.size) + switch (pack_info.block_size) { case 1: return nullptr; @@ -780,7 +780,7 @@ namespace gl mem_layout.swap_bytes = op.require_swap; mem_layout.format = gl_format; mem_layout.type = gl_type; - mem_layout.size = block_size_in_bytes; + mem_layout.block_size = block_size_in_bytes; // 2. Upload memory to GPU if (!op.require_deswizzle) @@ -1061,7 +1061,7 @@ namespace gl skip_transform = (pack_info.format == unpack_info.format && pack_info.type == unpack_info.type && pack_info.swap_bytes == unpack_info.swap_bytes && - pack_info.size == unpack_info.size); + pack_info.block_size == unpack_info.block_size); } if (skip_transform) [[likely]] @@ -1142,7 +1142,7 @@ namespace gl if (src->aspect() & image_aspect::depth) { // Source is depth, modify unpack rule - if (pack_info.size == 4 && unpack_info.size == 4) + if (pack_info.block_size == 4 && unpack_info.block_size == 4) { unpack_info.swap_bytes = !unpack_info.swap_bytes; } @@ -1150,7 +1150,7 @@ namespace gl else { // Dest is depth, modify pack rule - if (pack_info.size == 4 && unpack_info.size == 4) + if (pack_info.block_size == 4 && unpack_info.block_size == 4) { pack_info.swap_bytes = !pack_info.swap_bytes; } diff --git a/rpcs3/Emu/RSX/GL/GLTexture.h b/rpcs3/Emu/RSX/GL/GLTexture.h index 7b3ff73db4..4a17dae081 100644 --- a/rpcs3/Emu/RSX/GL/GLTexture.h +++ b/rpcs3/Emu/RSX/GL/GLTexture.h @@ -16,9 +16,11 @@ namespace gl { GLenum format; GLenum type; - u8 size; + u32 row_length; + u8 block_size; bool swap_bytes; u8 alignment; + u8 reserved; }; struct image_memory_requirements diff --git a/rpcs3/Emu/RSX/GL/GLTextureCache.h b/rpcs3/Emu/RSX/GL/GLTextureCache.h index 6d724c216f..1a4b4f9e1e 100644 --- a/rpcs3/Emu/RSX/GL/GLTextureCache.h +++ b/rpcs3/Emu/RSX/GL/GLTextureCache.h @@ -186,7 +186,7 @@ namespace gl pack_info.format = static_cast(format); pack_info.type = static_cast(type); - pack_info.size = (src->aspect() & image_aspect::stencil) ? 4 : 2; + pack_info.block_size = (src->aspect() & image_aspect::stencil) ? 4 : 2; pack_info.swap_bytes = true; mem_info.image_size_in_texels = src->width() * src->height(); @@ -204,8 +204,8 @@ namespace gl glBindBuffer(GL_SHADER_STORAGE_BUFFER, GL_NONE); glMemoryBarrier(GL_BUFFER_UPDATE_BARRIER_BIT); - real_pitch = pack_info.size * src->width(); - const u64 data_length = pack_info.size * mem_info.image_size_in_texels; + real_pitch = pack_info.block_size * src->width(); + const u64 data_length = pack_info.block_size * mem_info.image_size_in_texels; scratch_mem.copy_to(&pbo, reinterpret_cast(out_offset), 0, data_length); } else From 7917520633490458968b833e93131bb5c8207d54 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Mon, 9 Mar 2026 22:20:39 +0300 Subject: [PATCH 062/295] gl: Support packing/unpacking images with padding --- rpcs3/Emu/RSX/GL/GLTexture.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/GLTexture.cpp b/rpcs3/Emu/RSX/GL/GLTexture.cpp index 5c85f71c2e..64e451e579 100644 --- a/rpcs3/Emu/RSX/GL/GLTexture.cpp +++ b/rpcs3/Emu/RSX/GL/GLTexture.cpp @@ -372,7 +372,10 @@ namespace gl } } - src->copy_to(*dst, dst_offset, static_cast(pack_info.format), static_cast(pack_info.type), src_level, src_region, {}); + pixel_pack_settings pack_settings{}; + if (pack_info.alignment) pack_settings.alignment(pack_info.alignment); + if (pack_info.row_length) pack_settings.row_length(pack_info.row_length); + src->copy_to(*dst, dst_offset, static_cast(pack_info.format), static_cast(pack_info.type), src_level, src_region, pack_settings); return false; }; @@ -620,8 +623,11 @@ namespace gl glBindBuffer(GL_SHADER_STORAGE_BUFFER, GL_NONE); + pixel_unpack_settings unpack_settings{}; + if (unpack_info.alignment) unpack_settings.alignment(unpack_info.alignment); + if (unpack_info.format) unpack_settings.row_length(unpack_info.row_length); dst->copy_from(*transfer_buf, out_offset, static_cast(unpack_info.format), - static_cast(unpack_info.type), dst_level, dst_region, {}); + static_cast(unpack_info.type), dst_level, dst_region, unpack_settings); } } From aa094ca9487873cb6c960b6e2125f53bb31fc887 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Tue, 10 Mar 2026 03:06:08 +0300 Subject: [PATCH 063/295] gl: Trace memory readback operations to debug tracking when renderdoc compat is enabled - Renderdoc does not show these calls so we need to insert the debug message --- rpcs3/Emu/RSX/GL/glutils/capabilities.cpp | 3 +++ rpcs3/Emu/RSX/GL/glutils/capabilities.h | 1 + rpcs3/Emu/RSX/GL/glutils/image.cpp | 8 ++++++++ 3 files changed, 12 insertions(+) diff --git a/rpcs3/Emu/RSX/GL/glutils/capabilities.cpp b/rpcs3/Emu/RSX/GL/glutils/capabilities.cpp index d6a51beb09..a6999d6f9c 100644 --- a/rpcs3/Emu/RSX/GL/glutils/capabilities.cpp +++ b/rpcs3/Emu/RSX/GL/glutils/capabilities.cpp @@ -2,6 +2,7 @@ #include "capabilities.h" #include "Utilities/StrUtil.h" +#include "Emu/system_config.h" #include @@ -43,6 +44,8 @@ namespace gl all_extensions.emplace(reinterpret_cast(glGetStringi(GL_EXTENSIONS, i))); } + RENDERDOC_debug = !!g_cfg.video.renderdoc_compatiblity; + #define CHECK_EXTENSION_SUPPORT(extension_short_name)\ do {\ if (all_extensions.contains("GL_"#extension_short_name)) {\ diff --git a/rpcs3/Emu/RSX/GL/glutils/capabilities.h b/rpcs3/Emu/RSX/GL/glutils/capabilities.h index 756250430b..cfe104ffbe 100644 --- a/rpcs3/Emu/RSX/GL/glutils/capabilities.h +++ b/rpcs3/Emu/RSX/GL/glutils/capabilities.h @@ -23,6 +23,7 @@ namespace gl bool initialized = false; version_info glsl_version; + bool RENDERDOC_debug = false; bool EXT_direct_state_access_supported = false; bool EXT_depth_bounds_test_supported = false; bool AMD_pinned_memory_supported = false; diff --git a/rpcs3/Emu/RSX/GL/glutils/image.cpp b/rpcs3/Emu/RSX/GL/glutils/image.cpp index e99a6e15b2..7dd3442f84 100644 --- a/rpcs3/Emu/RSX/GL/glutils/image.cpp +++ b/rpcs3/Emu/RSX/GL/glutils/image.cpp @@ -246,6 +246,14 @@ namespace gl pixel_settings.apply(); const auto& caps = get_driver_caps(); + if (caps.RENDERDOC_debug) + { + const auto msg = fmt::format("glGetTextureSubImage('[%u] %s', %u, %u, %u, %u, %u, %u, %u, %u, %u, %d, %p)", + m_id, m_name.c_str(), level, region.x, region.y, region.z, region.width, region.height, region.depth, + static_cast(format), static_cast(type), s32{ smax }, dst.data()); + push_debug_label(msg); + } + if (!region.x && !region.y && !region.z && region.width == m_width && region.height == m_height && region.depth == m_depth) { From 040a79ddd1794bf9ba09b3f0d09cfad1b993038b Mon Sep 17 00:00:00 2001 From: kd-11 Date: Tue, 10 Mar 2026 04:03:17 +0300 Subject: [PATCH 064/295] gl: Improve object annotation for renderdoc debugging --- rpcs3/Emu/RSX/GL/GLRenderTargets.cpp | 2 ++ rpcs3/Emu/RSX/GL/GLRenderTargets.h | 5 +++ rpcs3/Emu/RSX/GL/glutils/image.cpp | 52 ++++++++++++++++++++++++++-- 3 files changed, 57 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/GLRenderTargets.cpp b/rpcs3/Emu/RSX/GL/GLRenderTargets.cpp index 18058842aa..a61fb4b365 100644 --- a/rpcs3/Emu/RSX/GL/GLRenderTargets.cpp +++ b/rpcs3/Emu/RSX/GL/GLRenderTargets.cpp @@ -689,6 +689,8 @@ gl::viewable_image* gl::render_target::get_resolve_target_safe(gl::command_conte static_cast(get_internal_format()), format_class() )); + + resolve_surface->set_name(fmt::format("MSAA_Resolve_%u@0x%x", resolve_surface->id(), base_addr)); } return static_cast(resolve_surface.get()); diff --git a/rpcs3/Emu/RSX/GL/GLRenderTargets.h b/rpcs3/Emu/RSX/GL/GLRenderTargets.h index 9b01746a87..ee3bc03956 100644 --- a/rpcs3/Emu/RSX/GL/GLRenderTargets.h +++ b/rpcs3/Emu/RSX/GL/GLRenderTargets.h @@ -160,6 +160,7 @@ struct gl_render_target_traits std::unique_ptr result(new gl::render_target(width_, height_, samples, static_cast(format.internal_format), RSX_FORMAT_CLASS_COLOR)); + result->set_name(fmt::format("RTV_%u@0x%x", result->id(), address)); result->set_aa_mode(antialias); result->set_native_pitch(static_cast(width) * get_format_block_size_in_bytes(surface_color_format) * result->samples_x); result->set_surface_dimensions(static_cast(width), static_cast(height), static_cast(pitch)); @@ -203,6 +204,7 @@ struct gl_render_target_traits std::unique_ptr result(new gl::render_target(width_, height_, samples, static_cast(format.internal_format), rsx::classify_format(surface_depth_format))); + result->set_name(fmt::format("DSV_%u@0x%x", result->id(), address)); result->set_aa_mode(antialias); result->set_surface_dimensions(static_cast(width), static_cast(height), static_cast(pitch)); result->set_format(surface_depth_format); @@ -238,6 +240,7 @@ struct gl_render_target_traits sink->state_flags = rsx::surface_state_flags::erase_bkgnd; sink->format_info = ref->format_info; + sink->set_name(fmt::format("SINK_%u@0x%x", sink->id(), address)); sink->set_spp(ref->get_spp()); sink->set_native_pitch(static_cast(prev.width) * ref->get_bpp() * ref->samples_x); sink->set_rsx_pitch(ref->get_rsx_pitch()); @@ -325,6 +328,7 @@ struct gl_render_target_traits std::array native_layout = { static_cast(fmt.swizzle.a), static_cast(fmt.swizzle.r), static_cast(fmt.swizzle.g), static_cast(fmt.swizzle.b) }; surface->set_native_component_layout(native_layout); surface->set_format(format); + surface->set_name(fmt::format("RTV_%u@0x%x", surface->id(), address)); int_invalidate_surface_contents(cmd, surface, address, pitch); } @@ -338,6 +342,7 @@ struct gl_render_target_traits usz pitch) { surface->set_format(format); + surface->set_name(fmt::format("DSV_%u@0x%x", surface->id(), address)); int_invalidate_surface_contents(cmd, surface, address, pitch); } diff --git a/rpcs3/Emu/RSX/GL/glutils/image.cpp b/rpcs3/Emu/RSX/GL/glutils/image.cpp index 7dd3442f84..e2f02afdfa 100644 --- a/rpcs3/Emu/RSX/GL/glutils/image.cpp +++ b/rpcs3/Emu/RSX/GL/glutils/image.cpp @@ -19,6 +19,54 @@ namespace gl } } + static const char* gl_type_to_str(texture::type type) + { + switch (type) + { + case texture::type::ubyte: return "GL_UNSIGNED_BYTE"; + case texture::type::ushort: return "GL_UNSIGNED_SHORT"; + case texture::type::uint: return "GL_UNSIGNED_INT"; + case texture::type::ubyte_3_3_2: return "GL_UNSIGNED_BYTE_3_3_2"; + case texture::type::ubyte_2_3_3_rev: return "GL_UNSIGNED_BYTE_2_3_3_REV"; + case texture::type::ushort_5_6_5: return "GL_UNSIGNED_SHORT_5_6_5"; + case texture::type::ushort_5_6_5_rev: return "GL_UNSIGNED_SHORT_5_6_5_REV"; + case texture::type::ushort_4_4_4_4: return "GL_UNSIGNED_SHORT_4_4_4_4"; + case texture::type::ushort_4_4_4_4_rev: return "GL_UNSIGNED_SHORT_4_4_4_4_REV"; + case texture::type::ushort_5_5_5_1: return "GL_UNSIGNED_SHORT_5_5_5_1"; + case texture::type::ushort_1_5_5_5_rev: return "GL_UNSIGNED_SHORT_1_5_5_5_REV"; + case texture::type::uint_8_8_8_8: return "GL_UNSIGNED_INT_8_8_8_8"; + case texture::type::uint_8_8_8_8_rev: return "GL_UNSIGNED_INT_8_8_8_8_REV"; + case texture::type::uint_10_10_10_2: return "GL_UNSIGNED_INT_10_10_10_2"; + case texture::type::uint_2_10_10_10_rev: return "GL_UNSIGNED_INT_2_10_10_10_REV"; + case texture::type::uint_24_8: return "GL_UNSIGNED_INT_24_8"; + case texture::type::float32_uint8: return "GL_FLOAT_32_UNSIGNED_INT_24_8_REV"; + case texture::type::sbyte: return "GL_BYTE"; + case texture::type::sshort: return "GL_SHORT"; + case texture::type::sint: return "GL_INT"; + case texture::type::f16: return "GL_HALF_FLOAT"; + case texture::type::f32: return "GL_FLOAT"; + case texture::type::f64: return "GL_DOUBLE"; + default: return "UNKNOWN"; + } + } + + static const char* gl_format_to_str(texture::format format) + { + switch (format) + { + case texture::format::r: return "GL_RED"; + case texture::format::rg: return "GL_RG"; + case texture::format::rgb: return "GL_RGB"; + case texture::format::rgba: return "GL_RGBA"; + case texture::format::bgr: return "GL_BGR"; + case texture::format::bgra: return "GL_BGRA"; + case texture::format::stencil: return "GL_STENCIL_INDEX"; + case texture::format::depth: return "GL_DEPTH_COMPONENT"; + case texture::format::depth_stencil: return "GL_DEPTH_STENCIL"; + default: return "UNKNOWN"; + } + } + texture::texture(GLenum target, GLuint width, GLuint height, GLuint depth, GLuint mipmaps, GLubyte samples, GLenum sized_format, rsx::format_class format_class) { // Upgrade targets for MSAA @@ -248,9 +296,9 @@ namespace gl if (caps.RENDERDOC_debug) { - const auto msg = fmt::format("glGetTextureSubImage('[%u] %s', %u, %u, %u, %u, %u, %u, %u, %u, %u, %d, %p)", + const auto msg = fmt::format("glGetTextureSubImage('[%u] %s', %u, %u, %u, %u, %u, %u, %u, %s, %s, %d, %p)", m_id, m_name.c_str(), level, region.x, region.y, region.z, region.width, region.height, region.depth, - static_cast(format), static_cast(type), s32{ smax }, dst.data()); + gl_format_to_str(format), gl_type_to_str(type), s32{ smax }, dst.data()); push_debug_label(msg); } From c72d54bd6aa3d7aa21dade03301b297be40d26fc Mon Sep 17 00:00:00 2001 From: kd-11 Date: Tue, 10 Mar 2026 04:03:48 +0300 Subject: [PATCH 065/295] gl: Add guards to catch invalid configuration in image transfer functions --- rpcs3/Emu/RSX/GL/GLCompute.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/rpcs3/Emu/RSX/GL/GLCompute.cpp b/rpcs3/Emu/RSX/GL/GLCompute.cpp index fd31708df7..12d10d2368 100644 --- a/rpcs3/Emu/RSX/GL/GLCompute.cpp +++ b/rpcs3/Emu/RSX/GL/GLCompute.cpp @@ -341,6 +341,7 @@ namespace gl void cs_d24x8_to_ssbo::run(gl::command_context& cmd, gl::viewable_image* src, const gl::buffer* dst, u32 out_offset, const coordu& region, const gl::pixel_buffer_layout& layout) { const auto row_pitch = layout.row_length ? layout.row_length : region.width; + ensure(row_pitch >= region.width); m_program.uniforms["swap_bytes"] = layout.swap_bytes; m_program.uniforms["output_pitch"] = row_pitch; @@ -391,6 +392,7 @@ namespace gl void cs_rgba8_to_ssbo::run(gl::command_context& cmd, gl::viewable_image* src, const gl::buffer* dst, u32 out_offset, const coordu& region, const gl::pixel_buffer_layout& layout) { const auto row_pitch = layout.row_length ? layout.row_length : region.width; + ensure(row_pitch >= region.width); m_program.uniforms["swap_bytes"] = layout.swap_bytes; m_program.uniforms["output_pitch"] = row_pitch; @@ -441,6 +443,7 @@ namespace gl { const u32 bpp = dst->image()->pitch() / dst->image()->width(); const u32 row_length = utils::align(dst_region.width * bpp, std::max(layout.alignment, 1)) / bpp; + ensure(row_length >= dst_region.width); m_program.uniforms["swap_bytes"] = layout.swap_bytes; m_program.uniforms["src_pitch"] = row_length; From c7a576edcea465e280c6708d9cb797080890313f Mon Sep 17 00:00:00 2001 From: kd-11 Date: Tue, 10 Mar 2026 04:05:33 +0300 Subject: [PATCH 066/295] gl: Implement proper, sectioned DMA transfers - Allows to transfer partial contents when needed --- rpcs3/Emu/RSX/GL/GLTextureCache.h | 61 +++++++++++++++++++++++++++---- 1 file changed, 53 insertions(+), 8 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/GLTextureCache.h b/rpcs3/Emu/RSX/GL/GLTextureCache.h index 1a4b4f9e1e..a4b931186f 100644 --- a/rpcs3/Emu/RSX/GL/GLTextureCache.h +++ b/rpcs3/Emu/RSX/GL/GLTextureCache.h @@ -148,7 +148,7 @@ namespace gl } } - void dma_transfer(gl::command_context& cmd, gl::texture* src, const areai& src_area, const utils::address_range32& /*valid_range*/, u32 pitch) + void dma_transfer(gl::command_context& cmd, gl::texture* src, const areai& src_area, const utils::address_range32& valid_range, u32 pitch) { init_buffer(src); glGetError(); @@ -171,6 +171,14 @@ namespace gl { static_cast(src_area.width()), static_cast(src_area.height()), 1 } }; + u32 pbo_offset = 0; + if (valid_range.valid()) + { + const u32 section_base = get_section_base(); + pbo_offset = valid_range.start - section_base; + ensure(valid_range.start >= section_base && pbo_offset <= pbo.size()); + } + bool use_driver_pixel_transform = true; if (get_driver_caps().ARB_compute_shader_supported) [[likely]] { @@ -188,9 +196,10 @@ namespace gl pack_info.type = static_cast(type); pack_info.block_size = (src->aspect() & image_aspect::stencil) ? 4 : 2; pack_info.swap_bytes = true; + pack_info.row_length = rsx_pitch / pack_info.block_size; - mem_info.image_size_in_texels = src->width() * src->height(); - mem_info.image_size_in_bytes = src->pitch() * src->height(); + mem_info.image_size_in_texels = pack_info.row_length * src_area.height(); + mem_info.image_size_in_bytes = rsx_pitch * src_area.height(); mem_info.memory_required = 0; if (pack_info.type == GL_FLOAT_32_UNSIGNED_INT_24_8_REV) @@ -200,13 +209,15 @@ namespace gl } void* out_offset = copy_image_to_buffer(cmd, pack_info, src, &scratch_mem, 0, 0, src_rgn, &mem_info); + real_pitch = rsx_pitch; glBindBuffer(GL_SHADER_STORAGE_BUFFER, GL_NONE); glMemoryBarrier(GL_BUFFER_UPDATE_BARRIER_BIT); - real_pitch = pack_info.block_size * src->width(); - const u64 data_length = pack_info.block_size * mem_info.image_size_in_texels; - scratch_mem.copy_to(&pbo, reinterpret_cast(out_offset), 0, data_length); + const u64 data_length = mem_info.image_size_in_bytes - rsx_pitch + (src_area.width() * pack_info.block_size); + ensure(data_length + pbo_offset <= static_cast(pbo.size()), "Memory allocation cannot fit image contents. Report to developers."); + + scratch_mem.copy_to(&pbo, reinterpret_cast(out_offset), pbo_offset, data_length); } else { @@ -225,11 +236,16 @@ namespace gl pack_unpack_swap_bytes = false; } + const auto bpp = src->pitch() / src->width(); + real_pitch = rsx_pitch; + ensure((real_pitch % bpp) == 0); + pixel_pack_settings pack_settings; pack_settings.alignment(1); pack_settings.swap_bytes(pack_unpack_swap_bytes); + pack_settings.row_length(rsx_pitch / bpp); - src->copy_to(pbo, 0, format, type, 0, src_rgn, pack_settings); + src->copy_to(pbo, pbo_offset, format, type, 0, src_rgn, pack_settings); } if (auto error = glGetError()) @@ -270,6 +286,7 @@ namespace gl gl::texture* target_texture = vram_texture; u32 transfer_width = width; u32 transfer_height = height; + u32 transfer_x = 0, transfer_y = 0; if (context == rsx::texture_upload_context::framebuffer_storage) { @@ -315,7 +332,35 @@ namespace gl } } - dma_transfer(cmd, target_texture, {}, {}, rsx_pitch); + const auto valid_range = get_confirmed_range(); + if (const auto section_range = get_section_range(); section_range != valid_range) + { + if (const auto offset = (valid_range.start - get_section_base())) + { + transfer_y = offset / rsx_pitch; + transfer_x = (offset % rsx_pitch) / rsx::get_format_block_size_in_bytes(gcm_format); + + ensure(transfer_width >= transfer_x); + ensure(transfer_height >= transfer_y); + transfer_width -= transfer_x; + transfer_height -= transfer_y; + } + + if (const auto tail = (section_range.end - valid_range.end)) + { + const auto row_count = tail / rsx_pitch; + + ensure(transfer_height >= row_count); + transfer_height -= row_count; + } + } + + areai src_area; + src_area.x1 = static_cast(transfer_x); + src_area.y1 = static_cast(transfer_y); + src_area.x2 = s32(transfer_x + transfer_width); + src_area.y2 = s32(transfer_y + transfer_height); + dma_transfer(cmd, target_texture, src_area, valid_range, rsx_pitch); } /** From 8afa40eaa7d55c158d71baccd693179eb9f06650 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Tue, 10 Mar 2026 16:43:20 +0100 Subject: [PATCH 067/295] rpcn: Fix segfault in rpcn_settings_dialog destructor This will happen if m_rpcn failed to connect in the constructor. --- rpcs3/rpcs3qt/rpcn_settings_dialog.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/rpcs3/rpcs3qt/rpcn_settings_dialog.cpp b/rpcs3/rpcs3qt/rpcn_settings_dialog.cpp index 6de6007b31..cab71be3bc 100644 --- a/rpcs3/rpcs3qt/rpcn_settings_dialog.cpp +++ b/rpcs3/rpcs3qt/rpcn_settings_dialog.cpp @@ -1347,7 +1347,10 @@ rpcn_friends_dialog::rpcn_friends_dialog(QWidget* parent) rpcn_friends_dialog::~rpcn_friends_dialog() { - m_rpcn->remove_friend_cb(friend_callback, this); + if (m_rpcn) + { + m_rpcn->remove_friend_cb(friend_callback, this); + } } bool rpcn_friends_dialog::add_friend_with_error_dialog(const std::string& friend_username) From 3803c864f747b2d64fdb4531c4a78c9c05cc1c87 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Tue, 10 Mar 2026 16:26:40 +0100 Subject: [PATCH 068/295] rpcn: Fix file access error when loading rpcn.yml with version 1 The file was still in use when saving. --- rpcs3/Emu/NP/rpcn_config.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/rpcs3/Emu/NP/rpcn_config.cpp b/rpcs3/Emu/NP/rpcn_config.cpp index 0b5cabe768..6665adbf7d 100644 --- a/rpcs3/Emu/NP/rpcn_config.cpp +++ b/rpcs3/Emu/NP/rpcn_config.cpp @@ -10,8 +10,7 @@ void cfg_rpcn::load() { const std::string path = cfg_rpcn::get_path(); - fs::file cfg_file(path, fs::read); - if (cfg_file) + if (fs::file cfg_file(path, fs::read); cfg_file) { rpcn_log.notice("Loading RPCN config. Path: %s", path); from_string(cfg_file.to_string()); From 9e573a9ff2083800444251a508d9f44800b4e1e6 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Tue, 10 Mar 2026 16:26:56 +0100 Subject: [PATCH 069/295] rpcn: set default version to 2 --- rpcs3/Emu/NP/rpcn_config.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpcs3/Emu/NP/rpcn_config.h b/rpcs3/Emu/NP/rpcn_config.h index 3ea6b707b1..113d83e408 100644 --- a/rpcs3/Emu/NP/rpcn_config.h +++ b/rpcs3/Emu/NP/rpcn_config.h @@ -4,7 +4,7 @@ struct cfg_rpcn : cfg::node { - cfg::uint32 version{this, "Version", 1}; + cfg::uint32 version{this, "Version", 2}; cfg::string host{this, "Host", "np.rpcs3.net"}; cfg::string npid{this, "NPID", ""}; cfg::string password{this, "Password", ""}; From 234f2b4648b38e41aa236752e5e5dde1f4af4360 Mon Sep 17 00:00:00 2001 From: Elad <18193363+elad335@users.noreply.github.com> Date: Sat, 7 Mar 2026 09:46:22 +0200 Subject: [PATCH 070/295] Silence sys_memory_get_user_memory_size --- rpcs3/Emu/Cell/lv2/sys_memory.cpp | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/Cell/lv2/sys_memory.cpp b/rpcs3/Emu/Cell/lv2/sys_memory.cpp index 6110d7d4d5..0f6fb09865 100644 --- a/rpcs3/Emu/Cell/lv2/sys_memory.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_memory.cpp @@ -15,6 +15,18 @@ LOG_CHANNEL(sys_memory); // static shared_mutex s_memstats_mtx; +// This struct is for reduced logging repetition +struct last_reported_memory_stats +{ + struct inner_body + { + u32 prev_total = umax; + u32 prev_avail = umax; + }; + + atomic_t body{}; +}; + lv2_memory_container::lv2_memory_container(u32 size, bool from_idm) noexcept : size(size) , id{from_idm ? idm::last_id() : SYS_MEMORY_CONTAINER_ID_INVALID} @@ -313,8 +325,6 @@ error_code sys_memory_get_user_memory_size(cpu_thread& cpu, vm::ptrget(); @@ -332,6 +342,22 @@ error_code sys_memory_get_user_memory_size(cpu_thread& cpu, vm::ptrget().body.exchange(now); + + if (now.prev_total != out.total_user_memory || now.prev_avail != out.available_user_memory) + { + // Log on change + sys_memory.warning("sys_memory_get_user_memory_size(mem_info=*0x%x): Avail=0x%x, Total=0x%x", mem_info, out.available_user_memory, out.total_user_memory); + } + else + { + sys_memory.trace("sys_memory_get_user_memory_size(mem_info=*0x%x): Avail=0x%x, Total=0x%x", mem_info, out.available_user_memory, out.total_user_memory); + } + cpu.check_state(); *mem_info = out; return CELL_OK; From 9811e1cc3b5bf025ec38551faa81e37035e39bea Mon Sep 17 00:00:00 2001 From: Elad <18193363+elad335@users.noreply.github.com> Date: Sun, 1 Mar 2026 10:07:25 +0200 Subject: [PATCH 071/295] Debugger: Add HW PPU threads view --- rpcs3/Emu/CPU/CPUThread.cpp | 2 +- rpcs3/Emu/Cell/lv2/lv2.cpp | 22 +++++ rpcs3/Emu/Cell/lv2/sys_sync.h | 1 + rpcs3/rpcs3qt/debugger_frame.cpp | 155 +++++++++++++++++++++++++------ rpcs3/rpcs3qt/debugger_frame.h | 7 +- 5 files changed, 156 insertions(+), 31 deletions(-) diff --git a/rpcs3/Emu/CPU/CPUThread.cpp b/rpcs3/Emu/CPU/CPUThread.cpp index e37e6ed0da..3ab011aa04 100644 --- a/rpcs3/Emu/CPU/CPUThread.cpp +++ b/rpcs3/Emu/CPU/CPUThread.cpp @@ -1373,7 +1373,7 @@ std::vector> cpu_thread::dump_callstack_list() const std::string cpu_thread::dump_misc() const { - return fmt::format("Type: %s; State: %s\n", get_class() == thread_class::ppu ? "PPU" : get_class() == thread_class::spu ? "SPU" : "RSX", state.load()); + return fmt::format("%s[0x%x]; State: %s\n", get_class() == thread_class::ppu ? "PPU" : get_class() == thread_class::spu ? "SPU" : "RSX", id, state.load()); } bool cpu_thread::suspend_work::push(cpu_thread* _this) noexcept diff --git a/rpcs3/Emu/Cell/lv2/lv2.cpp b/rpcs3/Emu/Cell/lv2/lv2.cpp index 3b923e8c41..dbe11039e7 100644 --- a/rpcs3/Emu/Cell/lv2/lv2.cpp +++ b/rpcs3/Emu/Cell/lv2/lv2.cpp @@ -2219,6 +2219,28 @@ void lv2_obj::prepare_for_sleep(cpu_thread& cpu) cpu_counter::remove(&cpu); } +ppu_thread* lv2_obj::get_running_ppu(u32 index) +{ + usz thread_count = g_cfg.core.ppu_threads; + + if (index >= thread_count) + { + return nullptr; + } + + auto target = atomic_storage::load(g_ppu); + + for (usz cur = 0; target; target = atomic_storage::load(target->next_ppu), cur++) + { + if (cur == index) + { + return target; + } + } + + return nullptr; +} + void lv2_obj::notify_all() noexcept { for (auto cpu : g_to_notify) diff --git a/rpcs3/Emu/Cell/lv2/sys_sync.h b/rpcs3/Emu/Cell/lv2/sys_sync.h index 0aff5e1e7a..6d55f4b1f0 100644 --- a/rpcs3/Emu/Cell/lv2/sys_sync.h +++ b/rpcs3/Emu/Cell/lv2/sys_sync.h @@ -453,6 +453,7 @@ public: // Can be called before the actual sleep call in order to move it out of mutex scope static void prepare_for_sleep(cpu_thread& cpu); + static ppu_thread* get_running_ppu(u32 index); struct notify_all_t { diff --git a/rpcs3/rpcs3qt/debugger_frame.cpp b/rpcs3/rpcs3qt/debugger_frame.cpp index 7ffe1b32a2..f1dd9cf892 100644 --- a/rpcs3/rpcs3qt/debugger_frame.cpp +++ b/rpcs3/rpcs3qt/debugger_frame.cpp @@ -16,6 +16,7 @@ #include "Emu/IdManager.h" #include "Emu/RSX/RSXThread.h" #include "Emu/RSX/RSXDisAsm.h" +#include "Emu/Cell/lv2/sys_sync.h" #include "Emu/Cell/PPUAnalyser.h" #include "Emu/Cell/PPUDisAsm.h" #include "Emu/Cell/PPUThread.h" @@ -804,12 +805,47 @@ cpu_thread* debugger_frame::get_cpu() return nullptr; } + if (u32 cur = m_choice_units->currentIndex(); cur >= m_hw_ppu_idx && cur < g_cfg.core.ppu_threads + m_hw_ppu_idx) + { + reader_lock lock(lv2_obj::g_mutex); + + const auto ppu = lv2_obj::get_running_ppu(cur - m_hw_ppu_idx); + + if (ppu == m_cpu.get()) + { + // Nothing to do + } + else if (ppu) + { + m_cpu = idm::get_unlocked>(ppu->id); + } + else + { + m_cpu.reset(); + } + } + + if (!!m_disasm != !!m_cpu) + { + // Fixup for HW PPU viewer + if (m_cpu) + { + m_disasm = make_disasm(m_cpu.get(), m_cpu); + } + else + { + m_disasm.reset(); + } + + m_debugger_list->UpdateCPUData(m_disasm); + m_breakpoint_list->UpdateCPUData(m_disasm); + } + // Wait flag is raised by the thread itself, acknowledging exit if (m_cpu) { if (m_cpu->state.all_of(cpu_flag::wait + cpu_flag::exit)) { - m_cpu.reset(); return nullptr; } @@ -823,12 +859,13 @@ cpu_thread* debugger_frame::get_cpu() { if (g_fxo->try_get() != m_rsx || !m_rsx->ctrl || m_rsx->state.all_of(cpu_flag::wait + cpu_flag::exit)) { - m_rsx = nullptr; return nullptr; } + + return m_rsx; } - return m_rsx; + return nullptr; } std::function debugger_frame::make_check_cpu(cpu_thread* cpu, bool unlocked) @@ -922,19 +959,20 @@ std::function debugger_frame::make_check_cpu(cpu_thread* cpu, boo void debugger_frame::UpdateUI() { - const auto cpu = get_cpu(); + auto cpu = get_cpu(); // Refresh at a high rate during initialization (looks weird otherwise) if (m_ui_update_ctr % (cpu || m_ui_update_ctr < 200 || m_debugger_list->m_dirty_flag ? 5 : 50) == 0) { // If no change to instruction position happened, update instruction list at 20hz - ShowPC(); + ShowPC(false, cpu); } if (m_ui_update_ctr % 20 == 0 && !m_thread_list_pending_update) { // Update threads list at 5hz (low priority) UpdateUnitList(); + cpu = get_cpu(); } if (!cpu) @@ -945,12 +983,13 @@ void debugger_frame::UpdateUI() { // Update threads list (thread exited) UpdateUnitList(); + cpu = get_cpu(); } - ShowPC(); + ShowPC(false, cpu); m_last_query_state.clear(); m_last_pc = -1; - DoUpdate(); + DoUpdate(cpu); } } else if (m_ui_update_ctr % 5 == 0 || m_ui_update_ctr < m_ui_fast_update_permission_deadline) @@ -966,7 +1005,7 @@ void debugger_frame::UpdateUI() std::memcpy(m_last_query_state.data(), static_cast(cpu), size_context); m_last_pc = cia; - DoUpdate(); + DoUpdate(cpu); const bool paused = !!(cpu->state & s_pause_flags); @@ -982,7 +1021,7 @@ void debugger_frame::UpdateUI() if (m_ui_update_ctr % 5) { // Call if it hasn't been called before - ShowPC(); + ShowPC(false, cpu); } if (is_using_interpreter(cpu->get_class())) @@ -1022,9 +1061,17 @@ void debugger_frame::UpdateUnitList() } std::vector>> cpu_list; - cpu_list.reserve(threads_created >= threads_deleted ? 0 : threads_created - threads_deleted); + cpu_list.reserve(threads_created >= threads_deleted ? threads_created - threads_deleted : 0); usz reselected_index = umax; + usz hw_ppu_idx = umax; + + if (u32 cur = m_choice_units->currentIndex(); cur >= m_hw_ppu_idx && cur < g_cfg.core.ppu_threads + m_hw_ppu_idx) + { + hw_ppu_idx = cur - m_hw_ppu_idx; + } + + m_hw_ppu_idx = umax; const auto on_select = [&](u32 id, cpu_thread& cpu) { @@ -1033,7 +1080,7 @@ void debugger_frame::UpdateUnitList() // Space at the end is to pad a gap on the right cpu_list.emplace_back(QString::fromStdString((id >> 24 == 0x55 ? "RSX[0x55555555]" : cpu.get_name()) + ' '), std::move(func_cpu)); - if (old_cpu_ptr == std::addressof(cpu)) + if (old_cpu_ptr == std::addressof(cpu) && hw_ppu_idx == umax) { reselected_index = cpu_list.size() - 1; } @@ -1046,6 +1093,40 @@ void debugger_frame::UpdateUnitList() idm::select>(on_select, idm::unlocked); } + m_hw_ppu_idx = cpu_list.size() + 1; // Account for NoThreadString thread + + for (u32 i = 0; i < g_cfg.core.ppu_threads + 0u; i++) + { + std::function get_ppu_at = [index = i, cpu_storage = shared_ptr>()]() mutable + { + reader_lock lock(lv2_obj::g_mutex); + + const auto ppu = lv2_obj::get_running_ppu(index); + + if (ppu == cpu_storage.get()) + { + // Nothing to do + } + else if (ppu) + { + cpu_storage = idm::get_unlocked>(ppu->id); + } + else + { + cpu_storage.reset(); + } + + return cpu_storage.get(); + }; + + if (hw_ppu_idx == i) + { + reselected_index = cpu_list.size(); + } + + cpu_list.emplace_back(tr("HwPPU[%0]: Hardware PPU Thread #%1").arg(i + 1).arg(i + 1), std::move(get_ppu_at)); + } + if (g_fxo->is_init>>()) { idm::select>(on_select, idm::unlocked); @@ -1114,6 +1195,7 @@ void debugger_frame::OnSelectUnit() } cpu_thread* selected = nullptr; + usz hw_ppu_idx = umax; if (m_emu_state != system_state::stopped) { @@ -1135,7 +1217,14 @@ void debugger_frame::OnSelectUnit() if (!selected && !m_rsx && !m_cpu) { - return; + if (u32 cur = m_choice_units->currentIndex(); cur >= m_hw_ppu_idx && cur < g_cfg.core.ppu_threads + m_hw_ppu_idx) + { + hw_ppu_idx = cur - m_hw_ppu_idx; + } + else + { + return; + } } } @@ -1144,6 +1233,15 @@ void debugger_frame::OnSelectUnit() m_rsx = nullptr; m_spu_disasm_memory.reset(); + if (hw_ppu_idx != umax) + { + if (hw_ppu_idx > 1) + { + // Sample PPU + selected = ::at32(m_threads_info, 1)(); + } + } + if (selected) { const u32 cpu_id = selected->id; @@ -1198,8 +1296,8 @@ void debugger_frame::OnSelectUnit() m_debugger_list->UpdateCPUData(m_disasm); m_breakpoint_list->UpdateCPUData(m_disasm); - ShowPC(true); - DoUpdate(); + ShowPC(true, selected); + DoUpdate(selected); UpdateUI(); } @@ -1339,30 +1437,28 @@ void debugger_frame::OnSelectSPUDisassembler() m_debugger_list->UpdateCPUData(m_disasm); m_breakpoint_list->UpdateCPUData(m_disasm); - ShowPC(true); - DoUpdate(); + ShowPC(true, nullptr); + DoUpdate(nullptr); UpdateUI(); }); m_spu_disasm_dialog->show(); } -void debugger_frame::DoUpdate() +void debugger_frame::DoUpdate(cpu_thread* cpu0) { // Check if we need to disable a step over bp - if (const auto cpu0 = get_cpu(); cpu0 && m_last_step_over_breakpoint != umax && cpu0->get_pc() == m_last_step_over_breakpoint) + if (cpu0 && m_last_step_over_breakpoint != umax && cpu0->get_pc() == m_last_step_over_breakpoint) { m_ppu_breakpoint_handler->RemoveBreakpoint(m_last_step_over_breakpoint); m_last_step_over_breakpoint = -1; } - WritePanels(); + WritePanels(cpu0); } -void debugger_frame::WritePanels() +void debugger_frame::WritePanels(cpu_thread* cpu) { - const auto cpu = get_cpu(); - if (!cpu) { m_misc_state->clear(); @@ -1412,7 +1508,9 @@ void debugger_frame::ShowGotoAddressDialog() QLineEdit* expression_input(new QLineEdit(m_goto_dialog)); expression_input->setFont(m_mono); - if (const auto thread = get_cpu(); !thread || thread->get_class() != thread_class::spu) + const auto thread = get_cpu(); + + if (!thread || thread->get_class() != thread_class::spu) { expression_input->setValidator(new HexValidator(expression_input)); } @@ -1436,8 +1534,8 @@ void debugger_frame::ShowGotoAddressDialog() m_goto_dialog->setLayout(vbox_panel); - const auto cpu_check = make_check_cpu(get_cpu()); - const auto cpu = cpu_check(); + const auto cpu_check = make_check_cpu(thread); + const auto cpu = thread; const QFont font = expression_input->font(); // -1 from get_pc() turns into 0 @@ -1544,9 +1642,12 @@ void debugger_frame::ClearCallStack() Q_EMIT CallStackUpdateRequested({}); } -void debugger_frame::ShowPC(bool user_requested) +void debugger_frame::ShowPC(bool user_requested, cpu_thread* cpu0) { - const auto cpu0 = get_cpu(); + if (!cpu0) + { + cpu0 = get_cpu(); + } const u32 pc = (cpu0 ? cpu0->get_pc() : (m_is_spu_disasm_mode ? m_spu_disasm_pc : 0)); diff --git a/rpcs3/rpcs3qt/debugger_frame.h b/rpcs3/rpcs3qt/debugger_frame.h index 6837347c3f..eb22d74680 100644 --- a/rpcs3/rpcs3qt/debugger_frame.h +++ b/rpcs3/rpcs3qt/debugger_frame.h @@ -79,6 +79,7 @@ class debugger_frame : public custom_dock_widget std::shared_ptr m_disasm; // Only shared to allow base/derived functionality shared_ptr m_cpu; rsx::thread* m_rsx = nullptr; + u32 m_hw_ppu_idx = umax; std::shared_ptr m_spu_disasm_memory; u32 m_spu_disasm_origin_eal = 0; u32 m_spu_disasm_pc = 0; @@ -107,8 +108,8 @@ public: void UpdateUI(); void UpdateUnitList(); - void DoUpdate(); - void WritePanels(); + void DoUpdate(cpu_thread* cpu0); + void WritePanels(cpu_thread* cpu); void EnableButtons(bool enable); void ShowGotoAddressDialog(); void PerformGoToRequest(const QString& text_argument); @@ -138,7 +139,7 @@ private Q_SLOTS: void OnSelectUnit(); void OnSelectSPUDisassembler(); void OnRegsContextMenu(const QPoint& pos); - void ShowPC(bool user_requested = false); + void ShowPC(bool user_requested = false, cpu_thread* cpu = nullptr); void EnableUpdateTimer(bool enable) const; void RunBtnPress(); void RegsShowMemoryViewerAction(); From fecb53f86c55fde6e260617f6b1289cabf1687bf Mon Sep 17 00:00:00 2001 From: Elad <18193363+elad335@users.noreply.github.com> Date: Tue, 10 Mar 2026 17:35:23 +0200 Subject: [PATCH 072/295] Fix SaveStates cellDumxPamf regression --- rpcs3/Emu/savestate_utils.cpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/savestate_utils.cpp b/rpcs3/Emu/savestate_utils.cpp index 167a060262..9306968dcf 100644 --- a/rpcs3/Emu/savestate_utils.cpp +++ b/rpcs3/Emu/savestate_utils.cpp @@ -23,7 +23,7 @@ struct serial_ver_t std::set compatible_versions; }; -static std::array s_serial_versions; +static std::array s_serial_versions; #define SERIALIZATION_VER(name, identifier, ...) \ \ @@ -40,7 +40,7 @@ static std::array s_serial_versions; return ::s_serial_versions[identifier].current_version;\ } -SERIALIZATION_VER(global_version, 0, 19) // For stuff not listed here +SERIALIZATION_VER(global_version, 0, 20) // For stuff not listed here SERIALIZATION_VER(ppu, 1, 1, 2/*PPU sleep order*/, 3/*PPU FNID and module*/) SERIALIZATION_VER(spu, 2, 1) SERIALIZATION_VER(lv2_sync, 3, 1) @@ -87,6 +87,15 @@ SERIALIZATION_VER(HLE, 25, 1) SERIALIZATION_VER(cellSysutil, 26, 1, 2/*AVC2 Muting,Volume*/) SERIALIZATION_VER(cellDmuxPamf, 27, 1) +// For future modules +SERIALIZATION_VER(cellReserved1, 27, 1) +SERIALIZATION_VER(cellReserved2, 28, 1) +SERIALIZATION_VER(cellReserved3, 29, 1) +SERIALIZATION_VER(cellReserved4, 30, 1) +SERIALIZATION_VER(cellReserved6, 31, 1) +SERIALIZATION_VER(cellReserved7, 32, 1) +SERIALIZATION_VER(cellReserved8, 33, 1) + template <> void fmt_class_string>::format(std::string& out, u64 arg) { From 29346412375d5eba0f5fb8eea721223aa1a1ab44 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Tue, 10 Mar 2026 07:34:45 +0100 Subject: [PATCH 073/295] overlays: support playing audio with video_view --- .../Emu/RSX/Overlays/overlay_save_dialog.cpp | 7 ++++--- rpcs3/Emu/RSX/Overlays/overlay_video.cpp | 19 +++++++++---------- rpcs3/Emu/RSX/Overlays/overlay_video.h | 8 ++++---- rpcs3/rpcs3qt/qt_video_source.cpp | 14 ++++++++++++-- 4 files changed, 29 insertions(+), 19 deletions(-) diff --git a/rpcs3/Emu/RSX/Overlays/overlay_save_dialog.cpp b/rpcs3/Emu/RSX/Overlays/overlay_save_dialog.cpp index 604dee7fc4..2847db969c 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_save_dialog.cpp +++ b/rpcs3/Emu/RSX/Overlays/overlay_save_dialog.cpp @@ -9,10 +9,11 @@ namespace rsx { save_dialog::save_dialog_entry::save_dialog_entry(const std::string& text1, const std::string& text2, const std::string& text3, u8 resource_id, const std::vector& icon_buf, const std::string& video_path) { + const std::string audio_path; // no audio here std::unique_ptr image = resource_id != image_resource_id::raw_image - ? std::make_unique(video_path, resource_id) - : !icon_buf.empty() ? std::make_unique(video_path, icon_buf) - : std::make_unique(video_path, resource_config::standard_image_resource::save); // Fallback + ? std::make_unique(video_path, audio_path, resource_id) + : !icon_buf.empty() ? std::make_unique(video_path, audio_path, icon_buf) + : std::make_unique(video_path, audio_path, resource_config::standard_image_resource::save); // Fallback image->set_size(160, 110); image->set_padding(36, 36, 11, 11); // Square image, 88x88 diff --git a/rpcs3/Emu/RSX/Overlays/overlay_video.cpp b/rpcs3/Emu/RSX/Overlays/overlay_video.cpp index ac6017d35f..44ca1f53ef 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_video.cpp +++ b/rpcs3/Emu/RSX/Overlays/overlay_video.cpp @@ -6,9 +6,9 @@ namespace rsx { namespace overlays { - video_view::video_view(const std::string& video_path, const std::string& thumbnail_path) + video_view::video_view(const std::string& video_path, const std::string& audio_path, const std::string& thumbnail_path) { - init_video(video_path); + init_video(video_path, audio_path); if (!thumbnail_path.empty()) { @@ -17,9 +17,9 @@ namespace rsx } } - video_view::video_view(const std::string& video_path, const std::vector& thumbnail_buf) + video_view::video_view(const std::string& video_path, const std::string& audio_path, const std::vector& thumbnail_buf) { - init_video(video_path); + init_video(video_path, audio_path); if (!thumbnail_buf.empty()) { @@ -28,10 +28,10 @@ namespace rsx } } - video_view::video_view(const std::string& video_path, u8 thumbnail_id) + video_view::video_view(const std::string& video_path, const std::string& audio_path, u8 thumbnail_id) : m_thumbnail_id(thumbnail_id) { - init_video(video_path); + init_video(video_path, audio_path); set_image_resource(thumbnail_id); } @@ -39,13 +39,11 @@ namespace rsx { } - void video_view::init_video(const std::string& video_path) + void video_view::init_video(const std::string& video_path, const std::string& audio_path) { if (video_path.empty()) return; - m_video_source = Emu.GetCallbacks().make_video_source(); - ensure(!!m_video_source); - + m_video_source = ensure(Emu.GetCallbacks().make_video_source()); m_video_source->set_update_callback([this]() { if (m_video_active) @@ -54,6 +52,7 @@ namespace rsx } }); m_video_source->set_video_path(video_path); + m_video_source->set_audio_path(audio_path); } void video_view::set_active(bool active) diff --git a/rpcs3/Emu/RSX/Overlays/overlay_video.h b/rpcs3/Emu/RSX/Overlays/overlay_video.h index 92297dee42..ab148c508d 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_video.h +++ b/rpcs3/Emu/RSX/Overlays/overlay_video.h @@ -19,9 +19,9 @@ namespace rsx class video_view final : public image_view { public: - video_view(const std::string& video_path, const std::string& thumbnail_path); - video_view(const std::string& video_path, const std::vector& thumbnail_buf); - video_view(const std::string& video_path, u8 thumbnail_id); + video_view(const std::string& video_path, const std::string& audio_path, const std::string& thumbnail_path); + video_view(const std::string& video_path, const std::string& audio_path, const std::vector& thumbnail_buf); + video_view(const std::string& video_path, const std::string& audio_path, u8 thumbnail_id); virtual ~video_view(); void set_active(bool active); @@ -30,7 +30,7 @@ namespace rsx compiled_resource& get_compiled() override; private: - void init_video(const std::string& video_path); + void init_video(const std::string& video_path, const std::string& audio_path); usz m_buffer_index = 0; std::array, 2> m_video_info; // double buffer diff --git a/rpcs3/rpcs3qt/qt_video_source.cpp b/rpcs3/rpcs3qt/qt_video_source.cpp index 2d4ce34aa3..8877e00c0c 100644 --- a/rpcs3/rpcs3qt/qt_video_source.cpp +++ b/rpcs3/rpcs3qt/qt_video_source.cpp @@ -335,7 +335,11 @@ void qt_video_source_wrapper::set_video_path(const std::string& video_path) { Emu.CallFromMainThread([this, path = video_path]() { - m_qt_video_source = std::make_unique(); + if (!m_qt_video_source) + { + m_qt_video_source = std::make_unique(); + } + m_qt_video_source->m_image_change_callback = [this](const QVideoFrame& frame) { std::unique_lock lock(m_qt_video_source->m_image_mutex); @@ -371,7 +375,12 @@ void qt_video_source_wrapper::set_audio_path(const std::string& audio_path) { Emu.CallFromMainThread([this, path = audio_path]() { - // TODO + if (!m_qt_video_source) + { + m_qt_video_source = std::make_unique(); + } + + m_qt_video_source->set_audio_path(path); }); } @@ -379,6 +388,7 @@ void qt_video_source_wrapper::set_active(bool active) { Emu.CallFromMainThread([this, active]() { + ensure(m_qt_video_source); m_qt_video_source->set_active(true); }); } From ee01d1186ffe80042a5f61830a6407ac739d07df Mon Sep 17 00:00:00 2001 From: Megamouse Date: Tue, 10 Mar 2026 08:56:04 +0100 Subject: [PATCH 074/295] overlays: play SND0.AT3 during initialization --- rpcs3/Emu/CMakeLists.txt | 1 + rpcs3/Emu/RSX/Overlays/overlay_audio.cpp | 30 ++++++++++++++++++++++ rpcs3/Emu/RSX/Overlays/overlay_audio.h | 23 +++++++++++++++++ rpcs3/Emu/RSX/Overlays/overlay_manager.cpp | 17 ++++++++++++ rpcs3/Emu/RSX/Overlays/overlay_manager.h | 6 +++++ rpcs3/Emu/RSX/RSXThread.cpp | 10 ++++++++ rpcs3/emucore.vcxproj | 4 ++- rpcs3/emucore.vcxproj.filters | 6 +++++ 8 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 rpcs3/Emu/RSX/Overlays/overlay_audio.cpp create mode 100644 rpcs3/Emu/RSX/Overlays/overlay_audio.h diff --git a/rpcs3/Emu/CMakeLists.txt b/rpcs3/Emu/CMakeLists.txt index edb98a6fa8..63951cfe92 100644 --- a/rpcs3/Emu/CMakeLists.txt +++ b/rpcs3/Emu/CMakeLists.txt @@ -500,6 +500,7 @@ target_sources(rpcs3_emu PRIVATE RSX/Overlays/overlays.cpp RSX/Overlays/overlay_animated_icon.cpp RSX/Overlays/overlay_animation.cpp + RSX/Overlays/overlay_audio.cpp RSX/Overlays/overlay_compile_notification.cpp RSX/Overlays/overlay_controls.cpp RSX/Overlays/overlay_cursor.cpp diff --git a/rpcs3/Emu/RSX/Overlays/overlay_audio.cpp b/rpcs3/Emu/RSX/Overlays/overlay_audio.cpp new file mode 100644 index 0000000000..5483a5242e --- /dev/null +++ b/rpcs3/Emu/RSX/Overlays/overlay_audio.cpp @@ -0,0 +1,30 @@ +#include "stdafx.h" +#include "overlay_audio.h" +#include "Emu/System.h" + +namespace rsx +{ + namespace overlays + { + audio_player::audio_player(const std::string& audio_path) + { + init_audio(audio_path); + } + + void audio_player::init_audio(const std::string& audio_path) + { + if (audio_path.empty()) return; + + m_video_source = ensure(Emu.GetCallbacks().make_video_source()); + m_video_source->set_audio_path(audio_path); + } + + void audio_player::set_active(bool active) + { + if (m_video_source) + { + m_video_source->set_active(active); + } + } + } +} diff --git a/rpcs3/Emu/RSX/Overlays/overlay_audio.h b/rpcs3/Emu/RSX/Overlays/overlay_audio.h new file mode 100644 index 0000000000..cb37569225 --- /dev/null +++ b/rpcs3/Emu/RSX/Overlays/overlay_audio.h @@ -0,0 +1,23 @@ +#pragma once + +#include "util/video_source.h" + +namespace rsx +{ + namespace overlays + { + class audio_player + { + public: + audio_player(const std::string& audio_path); + ~audio_player() = default; + + void set_active(bool active); + + private: + void init_audio(const std::string& audio_path); + + std::unique_ptr m_video_source; + }; + } +} diff --git a/rpcs3/Emu/RSX/Overlays/overlay_manager.cpp b/rpcs3/Emu/RSX/Overlays/overlay_manager.cpp index 485a59443e..9ffa9b14e3 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_manager.cpp +++ b/rpcs3/Emu/RSX/Overlays/overlay_manager.cpp @@ -167,6 +167,23 @@ namespace rsx } } + void display_manager::start_audio(const std::string& audio_path) + { + if (audio_path.empty()) + { + m_audio_player.reset(); + return; + } + + m_audio_player = std::make_unique(audio_path); + m_audio_player->set_active(true); + } + + void display_manager::stop_audio() + { + m_audio_player.reset(); + } + void display_manager::on_overlay_activated(const std::shared_ptr& /*item*/) { // TODO: Internal management, callbacks, etc diff --git a/rpcs3/Emu/RSX/Overlays/overlay_manager.h b/rpcs3/Emu/RSX/Overlays/overlay_manager.h index 7146be3dda..e42f3721b3 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_manager.h +++ b/rpcs3/Emu/RSX/Overlays/overlay_manager.h @@ -1,6 +1,7 @@ #pragma once #include "overlays.h" +#include "overlay_audio.h" #include "Emu/IdManager.h" #include "Utilities/mutex.h" @@ -25,6 +26,8 @@ namespace rsx lf_queue m_type_ids_to_remove; atomic_t m_pending_removals_count = 0; + std::unique_ptr m_audio_player; + bool remove_type(u32 type_id); bool remove_uid(u32 uid); @@ -167,6 +170,9 @@ namespace rsx std::function on_input_loop_exit = nullptr, // [optional] What to do with the result if any std::function input_loop_override = nullptr); // [optional] What to do during the input loop. By default calls user_interface::run_input_loop + void start_audio(const std::string& audio_path); + void stop_audio(); + private: struct overlay_input_thread { diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index a8aa7cdf60..7d634de677 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -711,6 +711,11 @@ namespace rsx if (g_cfg.misc.use_native_interface && (g_cfg.video.renderer == video_renderer::opengl || g_cfg.video.renderer == video_renderer::vulkan)) { m_overlay_manager = g_fxo->init(0); + + if (const std::string audio_path = Emu.GetSfoDir(true) + "/SND0.AT3"; fs::is_file(audio_path)) + { + m_overlay_manager->start_audio(audio_path); + } } if (!_ar) @@ -1101,6 +1106,11 @@ namespace rsx thread_ctrl::set_thread_affinity_mask(thread_ctrl::get_affinity_mask(thread_class::rsx)); } + if (auto manager = g_fxo->try_get()) + { + manager->stop_audio(); + } + while (!test_stopped()) { // Wait for external pause events diff --git a/rpcs3/emucore.vcxproj b/rpcs3/emucore.vcxproj index 8df2ef3092..0e07226729 100644 --- a/rpcs3/emucore.vcxproj +++ b/rpcs3/emucore.vcxproj @@ -145,6 +145,7 @@ + @@ -704,6 +705,7 @@ + @@ -1103,4 +1105,4 @@ - + \ No newline at end of file diff --git a/rpcs3/emucore.vcxproj.filters b/rpcs3/emucore.vcxproj.filters index 5ca602fbec..7dfd6a3f34 100644 --- a/rpcs3/emucore.vcxproj.filters +++ b/rpcs3/emucore.vcxproj.filters @@ -1411,6 +1411,9 @@ Loader + + Emu\GPU\RSX\Overlays + @@ -2833,6 +2836,9 @@ Loader + + Emu\GPU\RSX\Overlays + From 6b6dd6c43260311aa5a99c128fd61b442d19865d Mon Sep 17 00:00:00 2001 From: Megamouse Date: Mon, 9 Mar 2026 18:42:13 +0100 Subject: [PATCH 075/295] Qt: Rename Shortcuts to Keyboard Shortcuts --- rpcs3/rpcs3qt/main_window.ui | 2 +- rpcs3/rpcs3qt/shortcut_dialog.ui | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/rpcs3/rpcs3qt/main_window.ui b/rpcs3/rpcs3qt/main_window.ui index 1f6a75c6f7..ba72c86a1e 100644 --- a/rpcs3/rpcs3qt/main_window.ui +++ b/rpcs3/rpcs3qt/main_window.ui @@ -1379,7 +1379,7 @@ - Shortcuts + Keyboard Shortcuts diff --git a/rpcs3/rpcs3qt/shortcut_dialog.ui b/rpcs3/rpcs3qt/shortcut_dialog.ui index efafa998a2..04dbdb2157 100644 --- a/rpcs3/rpcs3qt/shortcut_dialog.ui +++ b/rpcs3/rpcs3qt/shortcut_dialog.ui @@ -11,7 +11,7 @@ - Shortcuts + Keyboard Shortcuts @@ -25,10 +25,10 @@ - Qt::Vertical + Qt::Orientation::Vertical - QSizePolicy::MinimumExpanding + QSizePolicy::Policy::MinimumExpanding @@ -50,10 +50,10 @@ - Qt::Vertical + Qt::Orientation::Vertical - QSizePolicy::MinimumExpanding + QSizePolicy::Policy::MinimumExpanding @@ -71,7 +71,7 @@ - QDialogButtonBox::Apply|QDialogButtonBox::Cancel|QDialogButtonBox::Save + QDialogButtonBox::StandardButton::Apply|QDialogButtonBox::StandardButton::Cancel|QDialogButtonBox::StandardButton::Save From e6cf05cfb73e156818685495814b0b7b8edaa97b Mon Sep 17 00:00:00 2001 From: Megamouse Date: Wed, 11 Mar 2026 12:58:09 +0100 Subject: [PATCH 076/295] Qt: Fix log levels tooltip --- rpcs3/rpcs3qt/settings_dialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpcs3/rpcs3qt/settings_dialog.cpp b/rpcs3/rpcs3qt/settings_dialog.cpp index b903db0f52..66f0ae3476 100644 --- a/rpcs3/rpcs3qt/settings_dialog.cpp +++ b/rpcs3/rpcs3qt/settings_dialog.cpp @@ -2497,7 +2497,7 @@ settings_dialog::settings_dialog(std::shared_ptr gui_settings, std SubscribeTooltip(ui->gb_vulkansched, tooltips.settings.vulkan_async_scheduler); // Log levels - SubscribeTooltip(ui->gb_log_levels, tooltips.settings.vulkan_async_scheduler); + SubscribeTooltip(ui->gb_log_levels, tooltips.settings.log_levels); connect(ui->pb_log_levels, &QAbstractButton::clicked, this, [this]() { log_level_dialog* dlg = new log_level_dialog(this, m_emu_settings); From 6f07e8453a8cb84ac400bd96f825751c9cf661c8 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sat, 10 Jan 2026 18:57:39 +0100 Subject: [PATCH 077/295] Update curl to 8.19.0 --- 3rdparty/curl/curl | 2 +- 3rdparty/curl/libcurl.vcxproj | 28 ++++----- 3rdparty/curl/libcurl.vcxproj.filters | 84 +++++++++++++-------------- 3 files changed, 57 insertions(+), 57 deletions(-) diff --git a/3rdparty/curl/curl b/3rdparty/curl/curl index 400fffa90f..8c908d2d0a 160000 --- a/3rdparty/curl/curl +++ b/3rdparty/curl/curl @@ -1 +1 @@ -Subproject commit 400fffa90f30c7a2dc762fa33009d24851bd2016 +Subproject commit 8c908d2d0a6d32abdedda2c52e90bd56ec76c24d diff --git a/3rdparty/curl/libcurl.vcxproj b/3rdparty/curl/libcurl.vcxproj index dae28be346..4db28782a3 100644 --- a/3rdparty/curl/libcurl.vcxproj +++ b/3rdparty/curl/libcurl.vcxproj @@ -79,12 +79,16 @@ + + + + @@ -106,6 +110,7 @@ + @@ -169,14 +174,13 @@ - + - @@ -184,10 +188,8 @@ - - @@ -204,6 +206,7 @@ + @@ -224,13 +227,11 @@ - - @@ -272,6 +273,7 @@ + @@ -280,6 +282,9 @@ + + + @@ -300,9 +305,7 @@ - - @@ -312,6 +315,7 @@ + @@ -352,7 +356,6 @@ - @@ -367,7 +370,7 @@ - + @@ -376,7 +379,6 @@ - @@ -384,7 +386,6 @@ - @@ -405,6 +406,7 @@ + @@ -418,12 +420,10 @@ - - diff --git a/3rdparty/curl/libcurl.vcxproj.filters b/3rdparty/curl/libcurl.vcxproj.filters index 17f760c54b..d38316e767 100644 --- a/3rdparty/curl/libcurl.vcxproj.filters +++ b/3rdparty/curl/libcurl.vcxproj.filters @@ -204,9 +204,6 @@ Source Files - - Source Files - Source Files @@ -222,9 +219,6 @@ Source Files - - Source Files - Source Files @@ -246,18 +240,12 @@ Source Files - - Source Files - Source Files Source Files - - Source Files - Source Files @@ -318,9 +306,6 @@ Source Files - - Source Files - Source Files @@ -333,9 +318,6 @@ Source Files - - Source Files - Source Files @@ -549,6 +531,27 @@ Source Files + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + @@ -653,9 +656,6 @@ Header Files - - Header Files - Header Files @@ -758,9 +758,6 @@ Header Files - - Header Files - Header Files @@ -791,9 +788,6 @@ Header Files - - Header Files - Header Files @@ -812,9 +806,6 @@ Header Files - - Header Files - Header Files @@ -836,9 +827,6 @@ Header Files - - Header Files - Header Files @@ -887,9 +875,6 @@ Header Files - - Header Files - Header Files @@ -899,9 +884,6 @@ Header Files - - Header Files - Header Files @@ -1103,9 +1085,6 @@ Header Files - - Header Files - Header Files @@ -1121,6 +1100,27 @@ Header Files + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + From 951d47c94c1428a40f1f676129a3ab901bd41860 Mon Sep 17 00:00:00 2001 From: qurious-pixel <62252937+qurious-pixel@users.noreply.github.com> Date: Fri, 13 Mar 2026 21:54:15 -0700 Subject: [PATCH 078/295] Use System Protobuf for Intel Mac --- .ci/build-mac.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/.ci/build-mac.sh b/.ci/build-mac.sh index 300f69cb06..f386866264 100755 --- a/.ci/build-mac.sh +++ b/.ci/build-mac.sh @@ -122,6 +122,7 @@ cmake .. \ -DUSE_SYSTEM_MVK=ON \ -DUSE_SYSTEM_SDL=ON \ -DUSE_SYSTEM_OPENCV=ON \ + -DUSE_SYSTEM_PROTOBUF=ON \ -G Ninja fi From b734ceb2e7ad279567bd2fad88c8e778f27264e9 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Fri, 13 Mar 2026 13:55:10 +0100 Subject: [PATCH 079/295] overlays: allow to reset current setting --- .../HomeMenu/overlay_home_menu_page.cpp | 21 +++++- .../HomeMenu/overlay_home_menu_page.h | 3 + .../HomeMenu/overlay_home_menu_settings.h | 75 ++++++++++++++++--- rpcs3/Emu/localized_string_id.h | 1 + rpcs3/rpcs3qt/localized_emu.h | 1 + 5 files changed, 87 insertions(+), 14 deletions(-) diff --git a/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_page.cpp b/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_page.cpp index edfb932d26..551f3dc82b 100644 --- a/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_page.cpp +++ b/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_page.cpp @@ -11,6 +11,7 @@ namespace rsx : list_view(width, height, use_separators) , parent(parent) , title(title) + , m_reset_btn(120, 30) , m_save_btn(120, 30) , m_discard_btn(120, 30) { @@ -20,15 +21,19 @@ namespace rsx m_config_changed = parent->m_config_changed; } + m_reset_btn.set_image_resource(resource_config::standard_image_resource::select); m_save_btn.set_image_resource(resource_config::standard_image_resource::square); m_discard_btn.set_image_resource(resource_config::standard_image_resource::triangle); + m_reset_btn.set_pos((width - 120) / 2, height + 20); m_save_btn.set_pos(width - 2 * (30 + 120), height + 20); m_discard_btn.set_pos(width - (30 + 120), height + 20); + m_reset_btn.set_text(localized_string_id::HOME_MENU_SETTINGS_RESET_BUTTON); m_save_btn.set_text(localized_string_id::HOME_MENU_SETTINGS_SAVE_BUTTON); m_discard_btn.set_text(localized_string_id::HOME_MENU_SETTINGS_DISCARD_BUTTON); + m_reset_btn.set_font("Arial", 16); m_save_btn.set_font("Arial", 16); m_discard_btn.set_font("Arial", 16); @@ -152,6 +157,7 @@ namespace rsx case pad_button::ls_left: case pad_button::ls_right: case pad_button::cross: + case pad_button::select: { if (const usz index = static_cast(get_selected_index()); index < m_callbacks.size()) { @@ -266,6 +272,7 @@ namespace rsx list_view::translate(_x, _y); m_save_btn.translate(_x, _y); m_discard_btn.translate(_x, _y); + m_reset_btn.translate(_x, _y); } compiled_resource& home_menu_page::get_compiled() @@ -286,10 +293,18 @@ namespace rsx { compiled_resources.add(m_message_box->get_compiled()); } - else if (m_config_changed && *m_config_changed) + else { - compiled_resources.add(m_save_btn.get_compiled()); - compiled_resources.add(m_discard_btn.get_compiled()); + if (show_reset_button()) + { + compiled_resources.add(m_reset_btn.get_compiled()); + } + + if (m_config_changed && *m_config_changed) + { + compiled_resources.add(m_save_btn.get_compiled()); + compiled_resources.add(m_discard_btn.get_compiled()); + } } } diff --git a/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_page.h b/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_page.h index 862baf5062..dcbfcc805f 100644 --- a/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_page.h +++ b/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_page.h @@ -20,6 +20,8 @@ namespace rsx void translate(s16 _x, s16 _y) override; compiled_resource& get_compiled() override; + virtual bool show_reset_button() const { return false; } + bool is_current_page = false; home_menu_page* parent = nullptr; std::string title; @@ -36,6 +38,7 @@ namespace rsx std::vector> m_pages; private: + image_button m_reset_btn; image_button m_save_btn; image_button m_discard_btn; std::vector> m_entries; diff --git a/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_settings.h b/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_settings.h index 9e54cfd441..3bff68138a 100644 --- a/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_settings.h +++ b/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_settings.h @@ -21,6 +21,8 @@ namespace rsx { using home_menu_page::home_menu_page; + bool show_reset_button() const override { return true; } + void add_checkbox(cfg::_bool* setting, localized_string_id loc_id) { ensure(setting && setting->get_is_dynamic()); @@ -30,16 +32,30 @@ namespace rsx add_item(elem, [this, setting](pad_button btn) -> page_navigation { - if (btn != pad_button::cross) return page_navigation::stay; - if (setting) { - const bool value = !setting->get(); - rsx_log.notice("User toggled checkbox in '%s'. Setting '%s' to %d", title, setting->get_name(), value); - setting->set(value); - Emu.GetCallbacks().update_emu_settings(); - if (m_config_changed) *m_config_changed = true; - refresh(); + bool value = setting->get(); + + switch (btn) + { + case pad_button::cross: + value = !value; + break; + case pad_button::select: + value = setting->def; + break; + default: + return page_navigation::stay; + } + + if (value != setting->get()) + { + rsx_log.notice("User toggled checkbox in '%s'. Setting '%s' to %d", title, setting->get_name(), value); + setting->set(value); + Emu.GetCallbacks().update_emu_settings(); + if (m_config_changed) *m_config_changed = true; + refresh(); + } } return page_navigation::stay; @@ -56,12 +72,33 @@ namespace rsx add_item(elem, [this, setting](pad_button btn) -> page_navigation { - if (btn != pad_button::cross) return page_navigation::stay; - if (setting) { + bool set_default = false; + switch (btn) + { + case pad_button::cross: + break; + case pad_button::select: + set_default = true; + break; + default: + return page_navigation::stay; + } + + T value = setting->get(); + + if (set_default) + { + if (value == setting->def) + { + return page_navigation::stay; + } + + value = setting->def; + } + usz new_index = 0; - const T value = setting->get(); const std::string val = fmt::format("%s", value); const std::vector list = setting->to_list(); @@ -70,10 +107,17 @@ namespace rsx const std::string& entry = list[i]; if (entry == val) { + if (set_default) + { + new_index = i; + break; + } + new_index = (i + 1) % list.size(); break; } } + if (const std::string& next_value = ::at32(list, new_index); setting->from_string(next_value)) { rsx_log.notice("User toggled dropdown in '%s'. Setting '%s' to %s", title, setting->get_name(), next_value); @@ -114,6 +158,9 @@ namespace rsx case pad_button::ls_right: value = std::min(value + step_size, maximum); break; + case pad_button::select: + value = setting->def; + break; default: return page_navigation::stay; } @@ -164,6 +211,9 @@ namespace rsx } while (exceptions.contains(value)); break; + case pad_button::select: + value = setting->def; + break; default: return page_navigation::stay; } @@ -205,6 +255,9 @@ namespace rsx case pad_button::ls_right: value = std::min(value + step_size, static_cast(maximum)); break; + case pad_button::select: + value = setting->def; + break; default: return page_navigation::stay; } diff --git a/rpcs3/Emu/localized_string_id.h b/rpcs3/Emu/localized_string_id.h index 9ab9f57a9b..b4ef2516fe 100644 --- a/rpcs3/Emu/localized_string_id.h +++ b/rpcs3/Emu/localized_string_id.h @@ -204,6 +204,7 @@ enum class localized_string_id HOME_MENU_SETTINGS_SAVE_BUTTON, HOME_MENU_SETTINGS_DISCARD, HOME_MENU_SETTINGS_DISCARD_BUTTON, + HOME_MENU_SETTINGS_RESET_BUTTON, HOME_MENU_SETTINGS_AUDIO, HOME_MENU_SETTINGS_AUDIO_MASTER_VOLUME, HOME_MENU_SETTINGS_AUDIO_BACKEND, diff --git a/rpcs3/rpcs3qt/localized_emu.h b/rpcs3/rpcs3qt/localized_emu.h index d05d3e52ee..920f9d9d14 100644 --- a/rpcs3/rpcs3qt/localized_emu.h +++ b/rpcs3/rpcs3qt/localized_emu.h @@ -225,6 +225,7 @@ private: case localized_string_id::HOME_MENU_SETTINGS_SAVE_BUTTON: return tr("Save"); case localized_string_id::HOME_MENU_SETTINGS_DISCARD: return tr("Discard the current settings' changes?"); case localized_string_id::HOME_MENU_SETTINGS_DISCARD_BUTTON: return tr("Discard"); + case localized_string_id::HOME_MENU_SETTINGS_RESET_BUTTON: return tr("To default"); case localized_string_id::HOME_MENU_SETTINGS_AUDIO: return tr("Audio"); case localized_string_id::HOME_MENU_SETTINGS_AUDIO_MASTER_VOLUME: return tr("Master Volume", "Audio"); case localized_string_id::HOME_MENU_SETTINGS_AUDIO_BACKEND: return tr("Audio Backend", "Audio"); From 4542020c869f044fca2bf5b630587e5b47148afb Mon Sep 17 00:00:00 2001 From: Malcolm Date: Tue, 17 Feb 2026 18:27:32 -0500 Subject: [PATCH 080/295] SPU LLVM: ARM64: Use UDOT for emulating SUMB --- rpcs3/Emu/CPU/CPUTranslator.cpp | 7 ++++++ rpcs3/Emu/CPU/CPUTranslator.h | 37 ++++++++++++++++++++++++++++ rpcs3/Emu/Cell/SPULLVMRecompiler.cpp | 13 +++++++++- 3 files changed, 56 insertions(+), 1 deletion(-) diff --git a/rpcs3/Emu/CPU/CPUTranslator.cpp b/rpcs3/Emu/CPU/CPUTranslator.cpp index f799e4b6be..08e8e9ad30 100644 --- a/rpcs3/Emu/CPU/CPUTranslator.cpp +++ b/rpcs3/Emu/CPU/CPUTranslator.cpp @@ -201,6 +201,13 @@ void cpu_translator::initialize(llvm::LLVMContext& context, llvm::ExecutionEngin m_use_vnni = true; m_use_gfni = true; } + +#ifdef ARCH_ARM64 + if (utils::has_dotprod()) + { + m_use_dotprod = true; + } +#endif } llvm::Value* cpu_translator::bitcast(llvm::Value* val, llvm::Type* type) const diff --git a/rpcs3/Emu/CPU/CPUTranslator.h b/rpcs3/Emu/CPU/CPUTranslator.h index 27abb22219..81049c6074 100644 --- a/rpcs3/Emu/CPU/CPUTranslator.h +++ b/rpcs3/Emu/CPU/CPUTranslator.h @@ -3090,6 +3090,9 @@ protected: // For now, setting this flag will speed up SPU verification // but I will remove this later with explicit parralelism - Whatcookie bool m_use_avx = true; + + // ARMv8 SDOT/UDOT + bool m_use_dotprod = false; #else // Allow FMA bool m_use_fma = false; @@ -3658,6 +3661,40 @@ public: return result; } +template + value_t udot(T1 a, T2 b, T3 c) + { + value_t result; + + const auto data0 = a.eval(m_ir); + const auto data1 = b.eval(m_ir); + const auto data2 = c.eval(m_ir); + + // ARM hardware requires the multipliers to be treated as 16-byte vectors + //const auto op1 = bitcast(data1, get_type()); + //const auto op2 = bitcast(data2, get_type()); + + // Use the variadic get_intrinsic to resolve the overloaded AArch64 intrinsic + result.value = m_ir->CreateCall(get_intrinsic(llvm::Intrinsic::aarch64_neon_udot), {data0, data1, data2}); + return result; + } + + template + value_t sdot(T1 a, T2 b, T3 c) + { + value_t result; + + const auto data0 = a.eval(m_ir); + const auto data1 = b.eval(m_ir); + const auto data2 = c.eval(m_ir); + + //const auto op1 = bitcast(data1, get_type()); + //const auto op2 = bitcast(data2, get_type()); + + result.value = m_ir->CreateCall(get_intrinsic(llvm::Intrinsic::aarch64_neon_sdot), {data0, data1, data2}); + return result; + } + template value_t vpermb(T1 a, T2 b) { diff --git a/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp b/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp index d42acd3560..45b4c83ecf 100644 --- a/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp +++ b/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp @@ -5313,13 +5313,24 @@ public: return; } +#ifdef ARCH_ARM64 + if (m_use_dotprod) +#else if (m_use_vnni) +#endif { - const auto [a, b] = get_vrs(op.ra, op.rb); const auto zeroes = splat(0); +#ifdef ARCH_ARM64 + const auto [a, b] = get_vrs(op.ra, op.rb); + const auto ones = splat(0x01); + const auto ax = bitcast(udot(zeroes, a, ones)); + const auto bx = bitcast(udot(zeroes, b, ones)); +#else + const auto [a, b] = get_vrs(op.ra, op.rb); const auto ones = splat(0x01010101); const auto ax = bitcast(vpdpbusd(zeroes, a, ones)); const auto bx = bitcast(vpdpbusd(zeroes, b, ones)); +#endif set_vr(op.rt, shuffle2(ax, bx, 0, 8, 2, 10, 4, 12, 6, 14)); return; } From 16277576089e1733987deeac54b627b25d67d800 Mon Sep 17 00:00:00 2001 From: Malcolm Date: Wed, 18 Feb 2026 23:53:48 -0500 Subject: [PATCH 081/295] SPU LLVM: Emulate GBB with udot/sdot Greatly simplifies GB, GBH, and GBH. Uses udot/sdot with power of two masks to shift values and sum them in a single step, effectively gathering them --- rpcs3/Emu/CPU/CPUTranslator.h | 24 +++-- rpcs3/Emu/Cell/SPULLVMRecompiler.cpp | 139 +++++++++++++++++++++++++++ 2 files changed, 155 insertions(+), 8 deletions(-) diff --git a/rpcs3/Emu/CPU/CPUTranslator.h b/rpcs3/Emu/CPU/CPUTranslator.h index 81049c6074..9b9804fd39 100644 --- a/rpcs3/Emu/CPU/CPUTranslator.h +++ b/rpcs3/Emu/CPU/CPUTranslator.h @@ -3661,6 +3661,7 @@ public: return result; } +#ifdef ARCH_ARM64 template value_t udot(T1 a, T2 b, T3 c) { @@ -3670,11 +3671,6 @@ template const auto data1 = b.eval(m_ir); const auto data2 = c.eval(m_ir); - // ARM hardware requires the multipliers to be treated as 16-byte vectors - //const auto op1 = bitcast(data1, get_type()); - //const auto op2 = bitcast(data2, get_type()); - - // Use the variadic get_intrinsic to resolve the overloaded AArch64 intrinsic result.value = m_ir->CreateCall(get_intrinsic(llvm::Intrinsic::aarch64_neon_udot), {data0, data1, data2}); return result; } @@ -3688,12 +3684,24 @@ template const auto data1 = b.eval(m_ir); const auto data2 = c.eval(m_ir); - //const auto op1 = bitcast(data1, get_type()); - //const auto op2 = bitcast(data2, get_type()); - result.value = m_ir->CreateCall(get_intrinsic(llvm::Intrinsic::aarch64_neon_sdot), {data0, data1, data2}); return result; } + +template + auto addp(T1 a, T2 b) + { + using T_vector = typename is_llvm_expr::type; + const auto data1 = a.eval(m_ir); + const auto data2 = b.eval(m_ir); + + const auto func = get_intrinsic(llvm::Intrinsic::aarch64_neon_addp); + + value_t result; + result.value = m_ir->CreateCall(func, {data1, data2}); + return result; + } +#endif template value_t vpermb(T1 a, T2 b) diff --git a/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp b/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp index 45b4c83ecf..856a039e5e 100644 --- a/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp +++ b/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp @@ -4759,6 +4759,50 @@ public: } const auto a = get_vr(op.ra); + +#ifdef ARCH_ARM64 + // Use dot product instructions with special values to shift then sum results into the preferred slot + if (m_use_dotprod) + { + if (match_vr(op.ra, [&](auto c, auto MP) + { + using VT = typename decltype(MP)::type; + + if (auto [ok, x] = match_expr(c, sext(match]>())); ok) + { + const auto zeroes = splat(0); + + const auto es = zshuffle(bitcast(a), 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 4, 8, 12); + + set_vr(op.rt, sdot(zeroes, es, build( + -0x01, -0x02, -0x04, -0x08, + -0x01, -0x02, -0x04, -0x08, + -0x01, -0x02, -0x04, -0x08, + -0x01, -0x02, -0x04, -0x08 + ))); + return true; + } + return false; + })) + { + return; + } + + const auto zeroes = splat(0); + const auto masked = a & 0x01; + + const auto es = zshuffle(bitcast(masked), 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 4, 8, 12); + + set_vr(op.rt, udot(zeroes, es, build( + 0x01, 0x02, 0x04, 0x08, + 0x01, 0x02, 0x04, 0x08, + 0x01, 0x02, 0x04, 0x08, + 0x01, 0x02, 0x04, 0x08 + ))); + return; + } +#endif + const auto m = zext(bitcast(trunc(a))); set_vr(op.rt, insert(splat(0), 3, eval(m))); } @@ -4774,6 +4818,54 @@ public: } const auto a = get_vr(op.ra); + +#ifdef ARCH_ARM64 + // Use dot product instructions with special values to shift then sum results into the preferred slot + if (m_use_dotprod) + { + if (match_vr(op.ra, [&](auto c, auto MP) + { + using VT = typename decltype(MP)::type; + + if (auto [ok, x] = match_expr(c, sext(match]>())); ok) + { + const auto zeroes = splat(0); + + const auto es = zshuffle(bitcast(a), 16, 16, 16, 16, 16, 16, 16, 16, 0, 2, 4, 6, 8, 10, 12, 14); + + const auto extracted = sdot(zeroes, es, build( + -0x01, -0x02, -0x04, -0x08, + -0x10, -0x20, -0x40, -0x80, + -0x01, -0x02, -0x04, -0x08, + -0x10, -0x20, -0x40, -0x80 + )); + + set_vr(op.rt, addp(zeroes, bitcast(extracted))); + return true; + } + return false; + })) + { + return; + } + + const auto zeroes = splat(0); + const auto masked = a & 0x01; + + const auto es = zshuffle(bitcast(masked), 16, 16, 16, 16, 16, 16, 16, 16, 0, 2, 4, 6, 8, 10, 12, 14); + + const auto extracted = udot(zeroes, es, build( + 0x01, 0x02, 0x04, 0x08, + 0x10, 0x20, 0x40, 0x80, + 0x01, 0x02, 0x04, 0x08, + 0x10, 0x20, 0x40, 0x80 + )); + + set_vr(op.rt, addp(zeroes, bitcast(extracted))); + return; + } +#endif + const auto m = zext(bitcast(trunc(a))); set_vr(op.rt, insert(splat(0), 3, eval(m))); } @@ -4782,6 +4874,53 @@ public: { const auto a = get_vr(op.ra); +#ifdef ARCH_ARM64 + // Use dot product instructions with special values to shift then sum results into the preferred slot + if (m_use_dotprod) + { + if (match_vr(op.ra, [&](auto c, auto MP) + { + using VT = typename decltype(MP)::type; + + if (auto [ok, x] = match_expr(c, sext(match]>())); ok) + { + const auto zeroes = splat(0); + + const auto extracted = sdot(zeroes, a, build( + -0x01, -0x02, -0x04, -0x08, + -0x10, -0x20, -0x40, -0x80, + -0x01, -0x02, -0x04, -0x08, + -0x10, -0x20, -0x40, -0x80 + )); + + const auto es = zshuffle(bitcast(extracted), 16, 16, 16, 16, 16, 16, 16, 16, 0, 8, 4, 12, 16, 16, 16, 16); + const auto zeroes16 = splat(0); + set_vr(op.rt, addp(zeroes16, bitcast(es))); + return true; + } + return false; + })) + { + return; + } + + const auto zeroes = splat(0); + const auto masked = a & 0x01; + + const auto extracted = udot(zeroes, masked, build( + 0x01, 0x02, 0x04, 0x08, + 0x10, 0x20, 0x40, 0x80, + 0x01, 0x02, 0x04, 0x08, + 0x10, 0x20, 0x40, 0x80 + )); + + const auto es = zshuffle(bitcast(extracted), 16, 16, 16, 16, 16, 16, 16, 16, 0, 8, 4, 12, 16, 16, 16, 16); + const auto zeroes16 = splat(0); + set_vr(op.rt, addp(zeroes16, bitcast(es))); + return; + } +#endif + if (m_use_gfni) { const auto as = zshuffle(a, 7, 6, 5, 4, 3, 2, 1, 0, 15, 14, 13, 12, 11, 10, 9, 8); From 5274210ba8307f1c0a45a8398d3ba9e9c8840f19 Mon Sep 17 00:00:00 2001 From: jfleezy23 Date: Sun, 15 Mar 2026 01:53:07 -0700 Subject: [PATCH 082/295] VK: scale auto shader compiler workers on wide CPUs --- rpcs3/Emu/RSX/VK/VKPipelineCompiler.cpp | 44 ++++++++++++++++--------- 1 file changed, 29 insertions(+), 15 deletions(-) diff --git a/rpcs3/Emu/RSX/VK/VKPipelineCompiler.cpp b/rpcs3/Emu/RSX/VK/VKPipelineCompiler.cpp index 26e0b64098..99462e0602 100644 --- a/rpcs3/Emu/RSX/VK/VKPipelineCompiler.cpp +++ b/rpcs3/Emu/RSX/VK/VKPipelineCompiler.cpp @@ -216,16 +216,27 @@ namespace vk return {}; } - void initialize_pipe_compiler(int num_worker_threads) - { - if (num_worker_threads == 0) - { - // Select optimal number of compiler threads - const auto hw_threads = utils::get_thread_count(); - if (hw_threads > 12) - { - num_worker_threads = 6; - } + void initialize_pipe_compiler(int num_worker_threads) + { + if (num_worker_threads == 0) + { + // Select a conservative but modern default for async pipeline compilation. + // Older heuristics topped out too early on high-core CPUs and left large + // shader bursts queued longer than necessary. + const auto hw_threads = utils::get_thread_count(); + + if (hw_threads >= 24) + { + num_worker_threads = 12; + } + else if (hw_threads >= 16) + { + num_worker_threads = 8; + } + else if (hw_threads > 12) + { + num_worker_threads = 6; + } else if (hw_threads > 8) { num_worker_threads = 4; @@ -234,11 +245,14 @@ namespace vk { num_worker_threads = 2; } - else - { - num_worker_threads = 1; - } - } + else + { + num_worker_threads = 1; + } + + rsx_log.notice("Async pipeline compiler auto-selected %d worker(s) for %u host thread(s).", + num_worker_threads, hw_threads); + } ensure(num_worker_threads >= 1); ensure(g_render_device); // "Cannot initialize pipe compiler before creating a logical device" From 9733d8c8572ba6c32a830e0fc251f7220ddc71b6 Mon Sep 17 00:00:00 2001 From: Ani Date: Sun, 22 Feb 2026 15:37:20 +0100 Subject: [PATCH 083/295] config: Move FSR CAS out of Vulkan subcategory FSR1 was already implemented for OpenGL as well, so this setting is no longer exclusive to the Vulkan render --- rpcs3/Emu/RSX/GL/upscalers/fsr1/fsr_pass.cpp | 2 +- rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_settings.cpp | 2 +- rpcs3/Emu/RSX/VK/upscalers/fsr1/fsr_pass.cpp | 2 +- rpcs3/Emu/system_config.h | 2 +- rpcs3/rpcs3qt/emu_settings_type.h | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/upscalers/fsr1/fsr_pass.cpp b/rpcs3/Emu/RSX/GL/upscalers/fsr1/fsr_pass.cpp index cfd7b1cc08..75e2d3f3db 100644 --- a/rpcs3/Emu/RSX/GL/upscalers/fsr1/fsr_pass.cpp +++ b/rpcs3/Emu/RSX/GL/upscalers/fsr1/fsr_pass.cpp @@ -152,7 +152,7 @@ namespace gl void rcas_pass::configure() { // 0 is actually the sharpest with 2 being the chosen limit. Each progressive unit 'halves' the sharpening intensity. - auto cas_attenuation = 2.f - (g_cfg.video.vk.rcas_sharpening_intensity / 50.f); + auto cas_attenuation = 2.f - (g_cfg.video.rcas_sharpening_intensity / 50.f); FsrRcasCon(&m_constants_buf[0], cas_attenuation); } } diff --git a/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_settings.cpp b/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_settings.cpp index c0e3a72b6f..34999eb775 100644 --- a/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_settings.cpp +++ b/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_settings.cpp @@ -44,7 +44,7 @@ namespace rsx add_dropdown(&g_cfg.video.output_scaling, localized_string_id::HOME_MENU_SETTINGS_VIDEO_OUTPUT_SCALING); if (g_cfg.video.renderer == video_renderer::vulkan && g_cfg.video.output_scaling == output_scaling_mode::fsr) { - add_unsigned_slider(&g_cfg.video.vk.rcas_sharpening_intensity, localized_string_id::HOME_MENU_SETTINGS_VIDEO_RCAS_SHARPENING, " %", 1); + add_unsigned_slider(&g_cfg.video.rcas_sharpening_intensity, localized_string_id::HOME_MENU_SETTINGS_VIDEO_RCAS_SHARPENING, " %", 1); } add_checkbox(&g_cfg.video.stretch_to_display_area, localized_string_id::HOME_MENU_SETTINGS_VIDEO_STRETCH_TO_DISPLAY); diff --git a/rpcs3/Emu/RSX/VK/upscalers/fsr1/fsr_pass.cpp b/rpcs3/Emu/RSX/VK/upscalers/fsr1/fsr_pass.cpp index 869dba6fa9..fbd4e868f9 100644 --- a/rpcs3/Emu/RSX/VK/upscalers/fsr1/fsr_pass.cpp +++ b/rpcs3/Emu/RSX/VK/upscalers/fsr1/fsr_pass.cpp @@ -176,7 +176,7 @@ namespace vk void rcas_pass::configure(const vk::command_buffer& cmd) { // 0 is actually the sharpest with 2 being the chosen limit. Each progressive unit 'halves' the sharpening intensity. - auto cas_attenuation = 2.f - (g_cfg.video.vk.rcas_sharpening_intensity / 50.f); + auto cas_attenuation = 2.f - (g_cfg.video.rcas_sharpening_intensity / 50.f); FsrRcasCon(&m_constants_buf[0], cas_attenuation); vkCmdPushConstants(cmd, m_program->layout(), VK_SHADER_STAGE_COMPUTE_BIT, 0, push_constants_size, m_constants_buf); diff --git a/rpcs3/Emu/system_config.h b/rpcs3/Emu/system_config.h index 8ccf91db0e..1f13629878 100644 --- a/rpcs3/Emu/system_config.h +++ b/rpcs3/Emu/system_config.h @@ -177,6 +177,7 @@ struct cfg_root : cfg::node cfg::_enum output_scaling{ this, "Output Scaling Mode", output_scaling_mode::bilinear, true }; cfg::_bool record_with_overlays{ this, "Record With Overlays", true, true }; cfg::_bool disable_hardware_texel_remapping{ this, "Disable Hardware ColorSpace Remapping", false, true }; + cfg::uint<0, 100> rcas_sharpening_intensity{ this, "FidelityFX CAS Sharpening Intensity", 50, true }; struct node_vk : cfg::node { @@ -187,7 +188,6 @@ struct cfg_root : cfg::node cfg::_bool force_primitive_restart{ this, "Force primitive restart flag" }; cfg::_enum exclusive_fullscreen_mode{ this, "Exclusive Fullscreen Mode", vk_exclusive_fs_mode::unspecified}; cfg::_bool asynchronous_texture_streaming{ this, "Asynchronous Texture Streaming 2", false }; - cfg::uint<0, 100> rcas_sharpening_intensity{ this, "FidelityFX CAS Sharpening Intensity", 50, true }; cfg::_enum asynchronous_scheduler{ this, "Asynchronous Queue Scheduler", vk_gpu_scheduler_mode::safe }; cfg::uint<256, 65536> vram_allocation_limit{ this, "VRAM allocation limit (MB)", 65536, false }; cfg::_bool use_rebar_upload_heap{ this, "Use Re-BAR for GPU uploads", true, false }; diff --git a/rpcs3/rpcs3qt/emu_settings_type.h b/rpcs3/rpcs3qt/emu_settings_type.h index 67238571d3..73ed86e267 100644 --- a/rpcs3/rpcs3qt/emu_settings_type.h +++ b/rpcs3/rpcs3qt/emu_settings_type.h @@ -317,11 +317,11 @@ inline static const std::map settings_location { emu_settings_type::DisableAsyncHostMM, { "Video", "Disable Asynchronous Memory Manager"}}, { emu_settings_type::RecordWithOverlays, { "Video", "Record With Overlays"}}, { emu_settings_type::DisableHWTexelRemapping, { "Video", "Disable Hardware ColorSpace Remapping"}}, + { emu_settings_type::FsrSharpeningStrength, { "Video", "FidelityFX CAS Sharpening Intensity"}}, // Vulkan { emu_settings_type::VulkanAsyncTextureUploads, { "Video", "Vulkan", "Asynchronous Texture Streaming 2"}}, { emu_settings_type::VulkanAsyncSchedulerDriver, { "Video", "Vulkan", "Asynchronous Queue Scheduler"}}, - { emu_settings_type::FsrSharpeningStrength, { "Video", "Vulkan", "FidelityFX CAS Sharpening Intensity"}}, { emu_settings_type::ExclusiveFullscreenMode, { "Video", "Vulkan", "Exclusive Fullscreen Mode"}}, { emu_settings_type::UseReBAR, { "Video", "Vulkan", "Use Re-BAR for GPU uploads"}}, From 60eb1ce2ecf95cd9de7f7ebf54eb234de9fd4960 Mon Sep 17 00:00:00 2001 From: Ani Date: Sun, 22 Feb 2026 15:38:42 +0100 Subject: [PATCH 084/295] config: Fix naming of Asynchronous Texture Streaming Rename from 'Asynchronous Texture Streaming 2' to 'Asynchronous Texture Streaming' --- rpcs3/Emu/system_config.h | 2 +- rpcs3/rpcs3qt/emu_settings_type.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/system_config.h b/rpcs3/Emu/system_config.h index 1f13629878..89da08e884 100644 --- a/rpcs3/Emu/system_config.h +++ b/rpcs3/Emu/system_config.h @@ -187,7 +187,7 @@ struct cfg_root : cfg::node cfg::_bool force_fifo{ this, "Force FIFO present mode" }; cfg::_bool force_primitive_restart{ this, "Force primitive restart flag" }; cfg::_enum exclusive_fullscreen_mode{ this, "Exclusive Fullscreen Mode", vk_exclusive_fs_mode::unspecified}; - cfg::_bool asynchronous_texture_streaming{ this, "Asynchronous Texture Streaming 2", false }; + cfg::_bool asynchronous_texture_streaming{ this, "Asynchronous Texture Streaming", false }; cfg::_enum asynchronous_scheduler{ this, "Asynchronous Queue Scheduler", vk_gpu_scheduler_mode::safe }; cfg::uint<256, 65536> vram_allocation_limit{ this, "VRAM allocation limit (MB)", 65536, false }; cfg::_bool use_rebar_upload_heap{ this, "Use Re-BAR for GPU uploads", true, false }; diff --git a/rpcs3/rpcs3qt/emu_settings_type.h b/rpcs3/rpcs3qt/emu_settings_type.h index 73ed86e267..b2014dd7bc 100644 --- a/rpcs3/rpcs3qt/emu_settings_type.h +++ b/rpcs3/rpcs3qt/emu_settings_type.h @@ -320,7 +320,7 @@ inline static const std::map settings_location { emu_settings_type::FsrSharpeningStrength, { "Video", "FidelityFX CAS Sharpening Intensity"}}, // Vulkan - { emu_settings_type::VulkanAsyncTextureUploads, { "Video", "Vulkan", "Asynchronous Texture Streaming 2"}}, + { emu_settings_type::VulkanAsyncTextureUploads, { "Video", "Vulkan", "Asynchronous Texture Streaming"}}, { emu_settings_type::VulkanAsyncSchedulerDriver, { "Video", "Vulkan", "Asynchronous Queue Scheduler"}}, { emu_settings_type::ExclusiveFullscreenMode, { "Video", "Vulkan", "Exclusive Fullscreen Mode"}}, { emu_settings_type::UseReBAR, { "Video", "Vulkan", "Use Re-BAR for GPU uploads"}}, From b24524fc753ca4584a1da93d25dc0bda21852e13 Mon Sep 17 00:00:00 2001 From: Ani Date: Sun, 22 Feb 2026 15:40:12 +0100 Subject: [PATCH 085/295] config: Fix naming of SPU XFloat Accuracy Rename from 'XFloat Accuracy' to 'SPU XFloat Accuracy' --- rpcs3/Emu/system_config.h | 2 +- rpcs3/rpcs3qt/emu_settings_type.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/system_config.h b/rpcs3/Emu/system_config.h index 89da08e884..3d7dba8798 100644 --- a/rpcs3/Emu/system_config.h +++ b/rpcs3/Emu/system_config.h @@ -61,7 +61,7 @@ struct cfg_root : cfg::node cfg::uint<0, 16> mfc_transfers_shuffling{ this, "MFC Commands Shuffling Limit", 0 }; cfg::uint<0, 10000> mfc_transfers_timeout{ this, "MFC Commands Timeout", 0, true }; cfg::_bool mfc_shuffling_in_steps{ this, "MFC Commands Shuffling In Steps", false, true }; - cfg::_enum spu_xfloat_accuracy{ this, "XFloat Accuracy", xfloat_accuracy::approximate, false }; + cfg::_enum spu_xfloat_accuracy{ this, "SPU XFloat Accuracy", xfloat_accuracy::approximate, false }; cfg::_int<-1, 14> ppu_128_reservations_loop_max_length{ this, "Accurate PPU 128-byte Reservation Op Max Length", 0, true }; // -1: Always accurate, 0: Never accurate, 1-14: max accurate loop length cfg::_int<-64, 64> stub_ppu_traps{ this, "Stub PPU Traps", 0, true }; // Hack, skip PPU traps for rare cases where the trap is continueable (specify relative instructions to skip) cfg::_bool precise_spu_verification{ this, "Precise SPU Verification", false }; // Disables use of xorsum based spu verification if enabled. diff --git a/rpcs3/rpcs3qt/emu_settings_type.h b/rpcs3/rpcs3qt/emu_settings_type.h index b2014dd7bc..a3e47fe733 100644 --- a/rpcs3/rpcs3qt/emu_settings_type.h +++ b/rpcs3/rpcs3qt/emu_settings_type.h @@ -241,7 +241,7 @@ inline static const std::map settings_location { emu_settings_type::AccurateClineStores, { "Core", "Accurate Cache Line Stores"}}, { emu_settings_type::AccurateRSXAccess, { "Core", "Accurate RSX reservation access"}}, { emu_settings_type::FIFOAccuracy, { "Core", "RSX FIFO Fetch Accuracy"}}, - { emu_settings_type::XFloatAccuracy, { "Core", "XFloat Accuracy"}}, + { emu_settings_type::XFloatAccuracy, { "Core", "SPU XFloat Accuracy"}}, { emu_settings_type::MFCCommandsShuffling, { "Core", "MFC Commands Shuffling Limit"}}, { emu_settings_type::SetDAZandFTZ, { "Core", "Set DAZ and FTZ"}}, { emu_settings_type::SPUBlockSize, { "Core", "SPU Block Size"}}, From 0bb6299e39c904722e5297fd46dc6f423a86dc4d Mon Sep 17 00:00:00 2001 From: Ani Date: Sun, 22 Feb 2026 15:41:55 +0100 Subject: [PATCH 086/295] ui: Specify Anti-Aliasing as MSAA --- rpcs3/rpcs3qt/settings_dialog.ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpcs3/rpcs3qt/settings_dialog.ui b/rpcs3/rpcs3qt/settings_dialog.ui index 76a418298d..7a5e8b6865 100644 --- a/rpcs3/rpcs3qt/settings_dialog.ui +++ b/rpcs3/rpcs3qt/settings_dialog.ui @@ -473,7 +473,7 @@ - Anti-Aliasing + Anti-Aliasing (MSAA) From bc58dff7154ad014df6ea606bc3c77af141bec84 Mon Sep 17 00:00:00 2001 From: Ani Date: Sun, 22 Feb 2026 15:52:48 +0100 Subject: [PATCH 087/295] ui: Rename depth buffers to depth buffer Removes ambiguity between config and ui --- rpcs3/rpcs3qt/settings_dialog.ui | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rpcs3/rpcs3qt/settings_dialog.ui b/rpcs3/rpcs3qt/settings_dialog.ui index 7a5e8b6865..4ced973883 100644 --- a/rpcs3/rpcs3qt/settings_dialog.ui +++ b/rpcs3/rpcs3qt/settings_dialog.ui @@ -2674,14 +2674,14 @@ - Read Depth Buffers + Read Depth Buffer - Write Depth Buffers + Write Depth Buffer From 7712584bd492796784d971edf11c4dffb1f6a317 Mon Sep 17 00:00:00 2001 From: AniLeo Date: Sun, 8 Mar 2026 10:46:51 +0100 Subject: [PATCH 088/295] ui: Merge exit/boot game dialog options --- rpcs3/rpcs3qt/settings_dialog.cpp | 5 ----- rpcs3/rpcs3qt/settings_dialog.ui | 9 +-------- rpcs3/rpcs3qt/tooltips.h | 3 +-- 3 files changed, 2 insertions(+), 15 deletions(-) diff --git a/rpcs3/rpcs3qt/settings_dialog.cpp b/rpcs3/rpcs3qt/settings_dialog.cpp index 66f0ae3476..d206a40de8 100644 --- a/rpcs3/rpcs3qt/settings_dialog.cpp +++ b/rpcs3/rpcs3qt/settings_dialog.cpp @@ -2165,7 +2165,6 @@ settings_dialog::settings_dialog(std::shared_ptr gui_settings, std SubscribeTooltip(ui->cb_custom_colors, tooltips.settings.custom_colors); SubscribeTooltip(ui->cb_show_welcome, tooltips.settings.show_welcome); SubscribeTooltip(ui->cb_show_exit_game, tooltips.settings.show_exit_game); - SubscribeTooltip(ui->cb_show_boot_game, tooltips.settings.show_boot_game); SubscribeTooltip(ui->cb_show_pkg_install, tooltips.settings.show_pkg_install); SubscribeTooltip(ui->cb_show_pup_install, tooltips.settings.show_pup_install); SubscribeTooltip(ui->cb_show_obsolete_cfg_dialog, tooltips.settings.show_obsolete_cfg); @@ -2273,7 +2272,6 @@ settings_dialog::settings_dialog(std::shared_ptr gui_settings, std ui->cb_show_welcome->setChecked(m_gui_settings->GetValue(gui::ib_show_welcome).toBool()); ui->cb_show_exit_game->setChecked(m_gui_settings->GetValue(gui::ib_confirm_exit).toBool()); - ui->cb_show_boot_game->setChecked(m_gui_settings->GetValue(gui::ib_confirm_boot).toBool()); ui->cb_show_pkg_install->setChecked(m_gui_settings->GetValue(gui::ib_pkg_success).toBool()); ui->cb_show_pup_install->setChecked(m_gui_settings->GetValue(gui::ib_pup_success).toBool()); ui->cb_show_obsolete_cfg_dialog->setChecked(m_gui_settings->GetValue(gui::ib_obsolete_cfg).toBool()); @@ -2305,9 +2303,6 @@ settings_dialog::settings_dialog(std::shared_ptr gui_settings, std connect(ui->cb_show_exit_game, &QCheckBox::toggled, [this](bool checked) { m_gui_settings->SetValue(gui::ib_confirm_exit, checked); - }); - connect(ui->cb_show_boot_game, &QCheckBox::toggled, [this](bool checked) - { m_gui_settings->SetValue(gui::ib_confirm_boot, checked); }); connect(ui->cb_show_pkg_install, &QCheckBox::toggled, [this](bool checked) diff --git a/rpcs3/rpcs3qt/settings_dialog.ui b/rpcs3/rpcs3qt/settings_dialog.ui index 4ced973883..3b6a5b5776 100644 --- a/rpcs3/rpcs3qt/settings_dialog.ui +++ b/rpcs3/rpcs3qt/settings_dialog.ui @@ -4007,14 +4007,7 @@ - Show Exit Game Dialog - - - - - - - Show Boot Game Dialog + Show Exit Game Confirmation diff --git a/rpcs3/rpcs3qt/tooltips.h b/rpcs3/rpcs3qt/tooltips.h index b56e093dff..def114e4dd 100644 --- a/rpcs3/rpcs3qt/tooltips.h +++ b/rpcs3/rpcs3qt/tooltips.h @@ -216,8 +216,7 @@ public: const QString tty_limit = tr("Sets the maximum amount of blocks that the TTY can display.\nThis usually equals the number of lines.\nSet 0 in order to remove the limit."); const QString stylesheets = tr("Changes the overall look of RPCS3.\nChoose a stylesheet and click Apply to change between styles."); const QString show_welcome = tr("Shows the initial welcome screen upon starting RPCS3."); - const QString show_exit_game = tr("Shows a confirmation dialog when the game window is being closed."); - const QString show_boot_game = tr("Shows a confirmation dialog when a game was booted while another game is running."); + const QString show_exit_game = tr("Shows a confirmation dialog when the game window is being closed and when a game was booted while another game is running."); const QString show_pkg_install = tr("Shows a dialog when packages were installed successfully."); const QString show_pup_install = tr("Shows a dialog when firmware was installed successfully."); const QString show_obsolete_cfg = tr("Shows a dialog when obsolete settings were found."); From 86f453f67702b150c922f2379f138e7142e86b98 Mon Sep 17 00:00:00 2001 From: AniLeo Date: Sun, 8 Mar 2026 11:02:20 +0100 Subject: [PATCH 089/295] ui: Merge pkg/pup install dialog options --- rpcs3/rpcs3qt/settings_dialog.cpp | 5 ----- rpcs3/rpcs3qt/settings_dialog.ui | 9 +-------- rpcs3/rpcs3qt/tooltips.h | 3 +-- 3 files changed, 2 insertions(+), 15 deletions(-) diff --git a/rpcs3/rpcs3qt/settings_dialog.cpp b/rpcs3/rpcs3qt/settings_dialog.cpp index d206a40de8..add8f3e798 100644 --- a/rpcs3/rpcs3qt/settings_dialog.cpp +++ b/rpcs3/rpcs3qt/settings_dialog.cpp @@ -2166,7 +2166,6 @@ settings_dialog::settings_dialog(std::shared_ptr gui_settings, std SubscribeTooltip(ui->cb_show_welcome, tooltips.settings.show_welcome); SubscribeTooltip(ui->cb_show_exit_game, tooltips.settings.show_exit_game); SubscribeTooltip(ui->cb_show_pkg_install, tooltips.settings.show_pkg_install); - SubscribeTooltip(ui->cb_show_pup_install, tooltips.settings.show_pup_install); SubscribeTooltip(ui->cb_show_obsolete_cfg_dialog, tooltips.settings.show_obsolete_cfg); SubscribeTooltip(ui->cb_show_same_buttons_dialog, tooltips.settings.show_same_buttons); SubscribeTooltip(ui->cb_show_restart_hint, tooltips.settings.show_restart_hint); @@ -2273,7 +2272,6 @@ settings_dialog::settings_dialog(std::shared_ptr gui_settings, std ui->cb_show_welcome->setChecked(m_gui_settings->GetValue(gui::ib_show_welcome).toBool()); ui->cb_show_exit_game->setChecked(m_gui_settings->GetValue(gui::ib_confirm_exit).toBool()); ui->cb_show_pkg_install->setChecked(m_gui_settings->GetValue(gui::ib_pkg_success).toBool()); - ui->cb_show_pup_install->setChecked(m_gui_settings->GetValue(gui::ib_pup_success).toBool()); ui->cb_show_obsolete_cfg_dialog->setChecked(m_gui_settings->GetValue(gui::ib_obsolete_cfg).toBool()); ui->cb_show_same_buttons_dialog->setChecked(m_gui_settings->GetValue(gui::ib_same_buttons).toBool()); ui->cb_show_restart_hint->setChecked(m_gui_settings->GetValue(gui::ib_restart_hint).toBool()); @@ -2308,9 +2306,6 @@ settings_dialog::settings_dialog(std::shared_ptr gui_settings, std connect(ui->cb_show_pkg_install, &QCheckBox::toggled, [this](bool checked) { m_gui_settings->SetValue(gui::ib_pkg_success, checked); - }); - connect(ui->cb_show_pup_install, &QCheckBox::toggled, [this](bool checked) - { m_gui_settings->SetValue(gui::ib_pup_success, checked); }); connect(ui->cb_show_obsolete_cfg_dialog, &QCheckBox::toggled, [this](bool checked) diff --git a/rpcs3/rpcs3qt/settings_dialog.ui b/rpcs3/rpcs3qt/settings_dialog.ui index 3b6a5b5776..eefc4e499c 100644 --- a/rpcs3/rpcs3qt/settings_dialog.ui +++ b/rpcs3/rpcs3qt/settings_dialog.ui @@ -4014,14 +4014,7 @@ - Show PKG Installation Dialog - - - - - - - Show PUP Installation Dialog + Show PKG/PUP Installation Result diff --git a/rpcs3/rpcs3qt/tooltips.h b/rpcs3/rpcs3qt/tooltips.h index def114e4dd..6152506c1d 100644 --- a/rpcs3/rpcs3qt/tooltips.h +++ b/rpcs3/rpcs3qt/tooltips.h @@ -217,8 +217,7 @@ public: const QString stylesheets = tr("Changes the overall look of RPCS3.\nChoose a stylesheet and click Apply to change between styles."); const QString show_welcome = tr("Shows the initial welcome screen upon starting RPCS3."); const QString show_exit_game = tr("Shows a confirmation dialog when the game window is being closed and when a game was booted while another game is running."); - const QString show_pkg_install = tr("Shows a dialog when packages were installed successfully."); - const QString show_pup_install = tr("Shows a dialog when firmware was installed successfully."); + const QString show_pkg_install = tr("Shows a dialog when packages and firmware were installed successfully."); const QString show_obsolete_cfg = tr("Shows a dialog when obsolete settings were found."); const QString show_same_buttons = tr("Shows a dialog in the game pad configuration when the same button was assigned twice."); const QString show_restart_hint = tr("Shows a dialog when RPCS3 is ready to restart after an update."); From 5a921bca462516029a0c171f624382bdf7460f88 Mon Sep 17 00:00:00 2001 From: AniLeo Date: Sun, 8 Mar 2026 12:11:54 +0100 Subject: [PATCH 090/295] ui: Allow toggling pad navigation on BSD --- rpcs3/rpcs3qt/settings_dialog.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/rpcs3/rpcs3qt/settings_dialog.cpp b/rpcs3/rpcs3qt/settings_dialog.cpp index add8f3e798..d25d3ad9fb 100644 --- a/rpcs3/rpcs3qt/settings_dialog.cpp +++ b/rpcs3/rpcs3qt/settings_dialog.cpp @@ -2177,7 +2177,6 @@ settings_dialog::settings_dialog(std::shared_ptr gui_settings, std SubscribeTooltip(ui->cb_global_pad_navigation, tooltips.settings.global_navigation); ui->cb_pad_navigation->setChecked(m_gui_settings->GetValue(gui::nav_enabled).toBool()); ui->cb_global_pad_navigation->setChecked(m_gui_settings->GetValue(gui::nav_global).toBool()); -#if defined(_WIN32) || defined(__linux__) || defined(__APPLE__) connect(ui->cb_pad_navigation, &QCheckBox::toggled, [this](bool checked) { m_gui_settings->SetValue(gui::nav_enabled, checked); @@ -2186,9 +2185,6 @@ settings_dialog::settings_dialog(std::shared_ptr gui_settings, std { m_gui_settings->SetValue(gui::nav_global, checked); }); -#else - ui->gb_gui_pad_input->setEnabled(false); -#endif // Discord: SubscribeTooltip(ui->useRichPresence, tooltips.settings.use_rich_presence); From 9bdacc64aae4e390200563859cf1a8a1f27e6b6a Mon Sep 17 00:00:00 2001 From: AniLeo Date: Sun, 8 Mar 2026 12:12:56 +0100 Subject: [PATCH 091/295] config: Enable pad navigation by default --- rpcs3/rpcs3qt/gui_settings.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpcs3/rpcs3qt/gui_settings.h b/rpcs3/rpcs3qt/gui_settings.h index 21a46259c2..bdc6401031 100644 --- a/rpcs3/rpcs3qt/gui_settings.h +++ b/rpcs3/rpcs3qt/gui_settings.h @@ -315,7 +315,7 @@ namespace gui const gui_save sc_shortcuts = gui_save(sc, "shortcuts", QVariantMap()); - const gui_save nav_enabled = gui_save(navigation, "pad_input_enabled", false); + const gui_save nav_enabled = gui_save(navigation, "pad_input_enabled", true); const gui_save nav_global = gui_save(navigation, "allow_global_pad_input", false); } From 67a67feb68426c72850f26813ecfea63f636ba54 Mon Sep 17 00:00:00 2001 From: AniLeo Date: Sun, 8 Mar 2026 12:42:28 +0100 Subject: [PATCH 092/295] ui: A-Z order advanced tab settings --- rpcs3/rpcs3qt/settings_dialog.ui | 98 ++++++++++++++++---------------- 1 file changed, 49 insertions(+), 49 deletions(-) diff --git a/rpcs3/rpcs3qt/settings_dialog.ui b/rpcs3/rpcs3qt/settings_dialog.ui index eefc4e499c..8e6c64e1d3 100644 --- a/rpcs3/rpcs3qt/settings_dialog.ui +++ b/rpcs3/rpcs3qt/settings_dialog.ui @@ -2414,13 +2414,6 @@ Core - - - - Debug Console Mode - - - @@ -2431,7 +2424,7 @@ - Accurate RSX reservation access + Accurate RSX Reservation Access @@ -2442,6 +2435,27 @@ + + + + Anti-Cheat Savestates Mode + + + + + + + Debug Console Mode + + + + + + + Delay each odd MFC Command + + + @@ -2471,30 +2485,16 @@ - + - Delay each odd MFC Command - - - - - - - Anti-Cheat Savestates Mode + Silence All Logs - SPU-Compatible Savestates Mode - - - - - - - Silence All Logs + SPU Compatible Savestates Mode @@ -2672,30 +2672,16 @@ - + - Read Depth Buffer + Allow Host GPU Labels (Experimental) - + - Write Depth Buffer - - - - - - - Read Color Buffers - - - - - - - Handle RSX memory tiling + Disable MSL Fast Math @@ -2707,16 +2693,30 @@ - + - Allow Host GPU Labels (Experimental) + Force Hardware MSAA Resolve - + - Force Hardware MSAA Resolve + Handle RSX Memory Tiling + + + + + + + Read Depth Buffer + + + + + + + Read Color Buffers @@ -2728,9 +2728,9 @@ - + - Disable MSL Fast Math + Write Depth Buffer From 90ebc7f319b81ae2dae419ed5af7a720c089dbf6 Mon Sep 17 00:00:00 2001 From: AniLeo Date: Sun, 8 Mar 2026 13:07:11 +0100 Subject: [PATCH 093/295] ui: Move Accurate DFMA to debug --- rpcs3/rpcs3qt/settings_dialog.ui | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/rpcs3/rpcs3qt/settings_dialog.ui b/rpcs3/rpcs3qt/settings_dialog.ui index 8e6c64e1d3..601ea5ec92 100644 --- a/rpcs3/rpcs3qt/settings_dialog.ui +++ b/rpcs3/rpcs3qt/settings_dialog.ui @@ -2414,13 +2414,6 @@ Core - - - - Accurate DFMA - - - @@ -4334,6 +4327,13 @@ Core + + + + Accurate DFMA + + + From e2a26f937fc0c1a670ad28fcc7f106b40624b804 Mon Sep 17 00:00:00 2001 From: AniLeo Date: Sun, 8 Mar 2026 13:09:33 +0100 Subject: [PATCH 094/295] ui: Move PPU Non-Java Fixup to debug --- rpcs3/rpcs3qt/settings_dialog.ui | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/rpcs3/rpcs3qt/settings_dialog.ui b/rpcs3/rpcs3qt/settings_dialog.ui index 601ea5ec92..5e38fd787d 100644 --- a/rpcs3/rpcs3qt/settings_dialog.ui +++ b/rpcs3/rpcs3qt/settings_dialog.ui @@ -2463,13 +2463,6 @@ - - - - PPU Non-Java Mode Fixup - - - @@ -4397,6 +4390,13 @@ + + + + PPU Non-Java Mode Fixup + + + From 8587fca5dbffd3334e52feb237df06ccd9b0b7db Mon Sep 17 00:00:00 2001 From: AniLeo Date: Sun, 8 Mar 2026 13:36:27 +0100 Subject: [PATCH 095/295] ui: Move SPU Loop Detection to advanced --- rpcs3/rpcs3qt/settings_dialog.ui | 23 +++++++---------------- 1 file changed, 7 insertions(+), 16 deletions(-) diff --git a/rpcs3/rpcs3qt/settings_dialog.ui b/rpcs3/rpcs3qt/settings_dialog.ui index 5e38fd787d..f663266206 100644 --- a/rpcs3/rpcs3qt/settings_dialog.ui +++ b/rpcs3/rpcs3qt/settings_dialog.ui @@ -181,22 +181,6 @@ - - - - Additional Settings - - - - - - Enable SPU loop detection - - - - - - @@ -2463,6 +2447,13 @@ + + + + Enable SPU loop detection + + + From 315f88b0e48e97f7e6d0dc007e4ff6b509f37577 Mon Sep 17 00:00:00 2001 From: Ani Date: Mon, 9 Mar 2026 16:50:45 +0100 Subject: [PATCH 096/295] ui: Split overlay settings, A-Z order emulator tab settings --- rpcs3/rpcs3qt/settings_dialog.ui | 149 ++++++++++++++++--------------- 1 file changed, 79 insertions(+), 70 deletions(-) diff --git a/rpcs3/rpcs3qt/settings_dialog.ui b/rpcs3/rpcs3qt/settings_dialog.ui index f663266206..30100b7935 100644 --- a/rpcs3/rpcs3qt/settings_dialog.ui +++ b/rpcs3/rpcs3qt/settings_dialog.ui @@ -2922,16 +2922,16 @@ - + - Exit RPCS3 when process finishes + Enable GameMode - + - Pause emulation on RPCS3 focus loss + Exit RPCS3 when process finishes @@ -2949,6 +2949,13 @@ + + + + Pause emulation on RPCS3 focus loss + + + @@ -2956,69 +2963,6 @@ - - - - Show trophy popups - - - - - - - Show RPCN popups - - - - - - - Show shader compilation hint - - - - - - - Show PPU compilation hint - - - - - - - Show autosave/autoload hint - - - - - - - Show analog limiter toggle hint - - - - - - - Show pressure intensity toggle hint - - - - - - - Show mouse and keyboard toggle hint - - - - - - - Show capture hints - - - @@ -3033,17 +2977,82 @@ + + + + + + + Overlay Settings + + - Record with overlays + Record and screenshot with overlays - + - Enable GameMode + Show analog limiter toggle hint + + + + + + + Show autosave/autoload hint + + + + + + + Show capture hints + + + + + + + Show mouse and keyboard toggle hint + + + + + + + Show netplay popups + + + + + + + Show pressure intensity toggle hint + + + + + + + Show PPU compilation hint + + + + + + + Show shader compilation hint + + + + + + + Show trophy popups From 5714eb0ba537dc7efe5b50e9e6d08f8e66b12dfb Mon Sep 17 00:00:00 2001 From: Ani Date: Sat, 14 Mar 2026 17:44:50 +0100 Subject: [PATCH 097/295] config/ui: Unify Shader Mode values Have the same values between UI and Config for easing automatic configuration --- rpcs3/Emu/system_config_types.cpp | 6 +++--- rpcs3/rpcs3qt/emu_settings.cpp | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/rpcs3/Emu/system_config_types.cpp b/rpcs3/Emu/system_config_types.cpp index 7c9c5ef592..beb13db4d5 100644 --- a/rpcs3/Emu/system_config_types.cpp +++ b/rpcs3/Emu/system_config_types.cpp @@ -522,9 +522,9 @@ void fmt_class_string::format(std::string& out, u64 arg) { switch (value) { - case shader_mode::recompiler: return "Shader Recompiler"; - case shader_mode::async_recompiler: return "Async Shader Recompiler"; - case shader_mode::async_with_interpreter: return "Async with Shader Interpreter"; + case shader_mode::recompiler: return "Legacy Recompiler (single-threaded)"; + case shader_mode::async_recompiler: return "Async Recompiler (multi-threaded)"; + case shader_mode::async_with_interpreter: return "Async Recompiler with Shader Interpreter"; case shader_mode::interpreter_only: return "Shader Interpreter only"; } diff --git a/rpcs3/rpcs3qt/emu_settings.cpp b/rpcs3/rpcs3qt/emu_settings.cpp index c686394c10..22cf9b4032 100644 --- a/rpcs3/rpcs3qt/emu_settings.cpp +++ b/rpcs3/rpcs3qt/emu_settings.cpp @@ -1054,9 +1054,9 @@ QString emu_settings::GetLocalizedSetting(const QString& original, emu_settings_ case emu_settings_type::ShaderMode: switch (static_cast(index)) { - case shader_mode::recompiler: return tr("Legacy (single threaded)", "Shader Mode"); - case shader_mode::async_recompiler: return tr("Async (multi threaded)", "Shader Mode"); - case shader_mode::async_with_interpreter: return tr("Async with Shader Interpreter", "Shader Mode"); + case shader_mode::recompiler: return tr("Legacy Recompiler (single-threaded)", "Shader Mode"); + case shader_mode::async_recompiler: return tr("Async Recompiler (multi-threaded)", "Shader Mode"); + case shader_mode::async_with_interpreter: return tr("Async Recompiler with Shader Interpreter", "Shader Mode"); case shader_mode::interpreter_only: return tr("Shader Interpreter only", "Shader Mode"); } break; From 433816148a30ed79e395f10810d47dd681787e98 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sun, 15 Mar 2026 16:19:45 +0100 Subject: [PATCH 098/295] Fix iso shortcuts --- rpcs3/Emu/System.cpp | 36 ++++++++++++++++++----------- rpcs3/rpcs3qt/game_list_actions.cpp | 7 +++++- 2 files changed, 28 insertions(+), 15 deletions(-) diff --git a/rpcs3/Emu/System.cpp b/rpcs3/Emu/System.cpp index 717e4ab59a..3548df869d 100644 --- a/rpcs3/Emu/System.cpp +++ b/rpcs3/Emu/System.cpp @@ -1329,18 +1329,18 @@ game_boot_result Emulator::Load(const std::string& title_id, bool is_disc_patch, argv.emplace_back(m_path); } - resolve_path_as_vfs_path = true; + resolve_path_as_vfs_path = true; } else if (m_path.starts_with(game_id_boot_prefix)) { // Try to boot a game through game ID only - m_title_id = m_path.substr(game_id_boot_prefix.size()); - m_title_id = m_title_id.substr(0, m_title_id.find_first_of(fs::delim)); + const std::string_view boot_suffix = std::string_view(m_path).substr(game_id_boot_prefix.size()); + m_title_id = boot_suffix.substr(0, boot_suffix.find_first_of(fs::delim)); if (m_title_id.size() < 3 && m_title_id.find_first_not_of('.') == umax) { // Do not allow if TITLE_ID result in path redirection - sys_log.fatal("Game directory not found using GAMEID token. ('%s')", m_title_id); + sys_log.fatal("Game directory not found using GAMEID token. (m_path='%s', title_id='%s')", m_title_id); return game_boot_result::invalid_file_or_folder; } @@ -1361,19 +1361,27 @@ game_boot_result Emulator::Load(const std::string& title_id, bool is_disc_patch, title_path = std::move(game_path); } - for (std::string test_path : + if (is_file_iso(title_path)) { - rpcs3::utils::get_hdd0_dir() + "game/" + m_title_id + "/USRDIR/EBOOT.BIN" - , tail.empty() ? "" : title_path + tail + "/USRDIR/EBOOT.BIN" - , title_path + "/PS3_GAME/USRDIR/EBOOT.BIN" - , title_path + "/USRDIR/EBOOT.BIN" - }) + m_path = std::move(title_path); + ok = true; + } + else { - if (!test_path.empty() && fs::is_file(test_path)) + for (std::string test_path : { - m_path = std::move(test_path); - ok = true; - break; + rpcs3::utils::get_hdd0_dir() + "game/" + m_title_id + "/USRDIR/EBOOT.BIN" + , tail.empty() ? "" : title_path + tail + "/USRDIR/EBOOT.BIN" + , title_path + "/PS3_GAME/USRDIR/EBOOT.BIN" + , title_path + "/USRDIR/EBOOT.BIN" + }) + { + if (!test_path.empty() && fs::is_file(test_path)) + { + m_path = std::move(test_path); + ok = true; + break; + } } } diff --git a/rpcs3/rpcs3qt/game_list_actions.cpp b/rpcs3/rpcs3qt/game_list_actions.cpp index b37348f49d..5e3e305860 100644 --- a/rpcs3/rpcs3qt/game_list_actions.cpp +++ b/rpcs3/rpcs3qt/game_list_actions.cpp @@ -7,6 +7,7 @@ #include "progress_dialog.h" #include "Utilities/File.h" +#include "Loader/ISO.h" #include "Emu/System.h" #include "Emu/system_utils.hpp" @@ -1460,7 +1461,11 @@ void game_list_actions::CreateShortcuts(const std::vector& games, con const std::string dev_flash = g_cfg_vfs.get_dev_flash(); - if (gameinfo->info.category == "DG" && !fs::is_file(rpcs3::utils::get_hdd0_dir() + "/game/" + gameinfo->info.serial + "/USRDIR/EBOOT.BIN")) + if (is_file_iso(gameinfo->info.path)) + { + gameid_token_value = gameinfo->info.serial; + } + else if (gameinfo->info.category == "DG" && !fs::is_file(rpcs3::utils::get_hdd0_dir() + "/game/" + gameinfo->info.serial + "/USRDIR/EBOOT.BIN")) { const usz ps3_game_dir_pos = fs::get_parent_dir(gameinfo->info.path).size(); std::string relative_boot_dir = gameinfo->info.path.substr(ps3_game_dir_pos); From 74fbca8c809475cb5acee29761d42d8723593436 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sun, 15 Mar 2026 11:17:23 +0100 Subject: [PATCH 099/295] input: simplify mmjoy handler --- rpcs3/Emu/Io/PadHandler.cpp | 147 +++++++++++++-------- rpcs3/Emu/Io/PadHandler.h | 91 ++----------- rpcs3/Input/ds3_pad_handler.cpp | 14 +- rpcs3/Input/ds3_pad_handler.h | 12 +- rpcs3/Input/ds4_pad_handler.cpp | 16 +-- rpcs3/Input/ds4_pad_handler.h | 14 +- rpcs3/Input/dualsense_pad_handler.cpp | 16 +-- rpcs3/Input/dualsense_pad_handler.h | 14 +- rpcs3/Input/evdev_joystick_handler.cpp | 38 +++--- rpcs3/Input/evdev_joystick_handler.h | 10 +- rpcs3/Input/keyboard_pad_handler.cpp | 2 +- rpcs3/Input/mm_joystick_handler.cpp | 170 ++++++++++++------------- rpcs3/Input/mm_joystick_handler.h | 39 +++--- rpcs3/Input/ps_move_handler.cpp | 10 +- rpcs3/Input/ps_move_handler.h | 8 +- rpcs3/Input/sdl_pad_handler.cpp | 16 +-- rpcs3/Input/sdl_pad_handler.h | 14 +- rpcs3/Input/skateboard_pad_handler.cpp | 6 +- rpcs3/Input/skateboard_pad_handler.h | 4 +- rpcs3/Input/xinput_pad_handler.cpp | 22 ++-- rpcs3/Input/xinput_pad_handler.h | 18 ++- 21 files changed, 325 insertions(+), 356 deletions(-) diff --git a/rpcs3/Emu/Io/PadHandler.cpp b/rpcs3/Emu/Io/PadHandler.cpp index a2ae41349e..953e6be55f 100644 --- a/rpcs3/Emu/Io/PadHandler.cpp +++ b/rpcs3/Emu/Io/PadHandler.cpp @@ -11,17 +11,69 @@ PadHandlerBase::PadHandlerBase(pad_handler type) : m_type(type) { } -std::set PadHandlerBase::narrow_set(const std::set& src) +std::set PadHandlerBase::FindKeyCodes(const std::unordered_map& map, const cfg::string& cfg_string, bool fallback) { - if (src.empty()) - return {}; + std::set key_codes; - std::set dst; - for (const u64& s : src) + const std::string& def = cfg_string.def; + const std::vector names = cfg_pad::get_buttons(cfg_string.to_string()); + u32 def_code = umax; + + for (const std::string& nam : names) { - dst.insert(::narrow(s)); + for (const auto& [code, name] : map) + { + if (name == nam) + { + key_codes.insert(code); + } + + if (fallback && name == def) + def_code = code; + } } - return dst; + + if (!key_codes.empty()) + { + return key_codes; + } + + if (fallback) + { + if (!names.empty()) + input_log.error("FindKeyCode for [name = %s] returned with [def_code = %d] for [def = %s]", cfg_string.to_string(), def_code, def); + + if (def_code != umax) + { + return { def_code }; + } + } + + return {}; +} + +std::set PadHandlerBase::FindKeyCodes(const std::unordered_map& map, const std::vector& names) +{ + std::set key_codes; + + for (const std::string& name : names) + { + for (const auto& [code, nam] : map) + { + if (nam == name) + { + key_codes.insert(code); + break; + } + } + } + + if (!key_codes.empty()) + { + return key_codes; + } + + return {}; } s32 PadHandlerBase::MultipliedInput(s32 raw_value, s32 multiplier) @@ -396,7 +448,7 @@ void PadHandlerBase::convert_stick_values(u16& x_out, u16& y_out, s32 x_in, s32 } // Update the pad button values based on their type and thresholds. With this you can use axis or triggers as buttons or vice versa -void PadHandlerBase::TranslateButtonPress(const std::shared_ptr& device, u64 keyCode, bool& pressed, u16& val, bool use_stick_multipliers, bool ignore_stick_threshold, bool ignore_trigger_threshold) +void PadHandlerBase::TranslateButtonPress(const std::shared_ptr& device, u32 keyCode, bool& pressed, u16& val, bool use_stick_multipliers, bool ignore_stick_threshold, bool ignore_trigger_threshold) { if (!device || !device->config) { @@ -556,63 +608,52 @@ std::array, PadHandlerBase::button::button_count> PadHandlerBase:: if (!device || !cfg) return mapping; - device->trigger_code_left = FindKeyCodes(button_list, cfg->l2); - device->trigger_code_right = FindKeyCodes(button_list, cfg->r2); - device->axis_code_left[0] = FindKeyCodes(button_list, cfg->ls_left); - device->axis_code_left[1] = FindKeyCodes(button_list, cfg->ls_right); - device->axis_code_left[2] = FindKeyCodes(button_list, cfg->ls_down); - device->axis_code_left[3] = FindKeyCodes(button_list, cfg->ls_up); - device->axis_code_right[0] = FindKeyCodes(button_list, cfg->rs_left); - device->axis_code_right[1] = FindKeyCodes(button_list, cfg->rs_right); - device->axis_code_right[2] = FindKeyCodes(button_list, cfg->rs_down); - device->axis_code_right[3] = FindKeyCodes(button_list, cfg->rs_up); + mapping[button::up] = FindKeyCodes(button_list, cfg->up); + mapping[button::down] = FindKeyCodes(button_list, cfg->down); + mapping[button::left] = FindKeyCodes(button_list, cfg->left); + mapping[button::right] = FindKeyCodes(button_list, cfg->right); + mapping[button::cross] = FindKeyCodes(button_list, cfg->cross); + mapping[button::square] = FindKeyCodes(button_list, cfg->square); + mapping[button::circle] = FindKeyCodes(button_list, cfg->circle); + mapping[button::triangle] = FindKeyCodes(button_list, cfg->triangle); + mapping[button::start] = FindKeyCodes(button_list, cfg->start); + mapping[button::select] = FindKeyCodes(button_list, cfg->select); + mapping[button::l1] = FindKeyCodes(button_list, cfg->l1); + mapping[button::l2] = FindKeyCodes(button_list, cfg->l2); + mapping[button::l3] = FindKeyCodes(button_list, cfg->l3); + mapping[button::r1] = FindKeyCodes(button_list, cfg->r1); + mapping[button::r2] = FindKeyCodes(button_list, cfg->r2); + mapping[button::r3] = FindKeyCodes(button_list, cfg->r3); + mapping[button::ls_left] = FindKeyCodes(button_list, cfg->ls_left); + mapping[button::ls_right] = FindKeyCodes(button_list, cfg->ls_right); + mapping[button::ls_down] = FindKeyCodes(button_list, cfg->ls_down); + mapping[button::ls_up] = FindKeyCodes(button_list, cfg->ls_up); + mapping[button::rs_left] = FindKeyCodes(button_list, cfg->rs_left); + mapping[button::rs_right] = FindKeyCodes(button_list, cfg->rs_right); + mapping[button::rs_down] = FindKeyCodes(button_list, cfg->rs_down); + mapping[button::rs_up] = FindKeyCodes(button_list, cfg->rs_up); + mapping[button::ps] = FindKeyCodes(button_list, cfg->ps); - mapping[button::up] = FindKeyCodes(button_list, cfg->up); - mapping[button::down] = FindKeyCodes(button_list, cfg->down); - mapping[button::left] = FindKeyCodes(button_list, cfg->left); - mapping[button::right] = FindKeyCodes(button_list, cfg->right); - mapping[button::cross] = FindKeyCodes(button_list, cfg->cross); - mapping[button::square] = FindKeyCodes(button_list, cfg->square); - mapping[button::circle] = FindKeyCodes(button_list, cfg->circle); - mapping[button::triangle] = FindKeyCodes(button_list, cfg->triangle); - mapping[button::start] = FindKeyCodes(button_list, cfg->start); - mapping[button::select] = FindKeyCodes(button_list, cfg->select); - mapping[button::l1] = FindKeyCodes(button_list, cfg->l1); - mapping[button::l2] = narrow_set(device->trigger_code_left); - mapping[button::l3] = FindKeyCodes(button_list, cfg->l3); - mapping[button::r1] = FindKeyCodes(button_list, cfg->r1); - mapping[button::r2] = narrow_set(device->trigger_code_right); - mapping[button::r3] = FindKeyCodes(button_list, cfg->r3); - mapping[button::ls_left] = narrow_set(device->axis_code_left[0]); - mapping[button::ls_right] = narrow_set(device->axis_code_left[1]); - mapping[button::ls_down] = narrow_set(device->axis_code_left[2]); - mapping[button::ls_up] = narrow_set(device->axis_code_left[3]); - mapping[button::rs_left] = narrow_set(device->axis_code_right[0]); - mapping[button::rs_right] = narrow_set(device->axis_code_right[1]); - mapping[button::rs_down] = narrow_set(device->axis_code_right[2]); - mapping[button::rs_up] = narrow_set(device->axis_code_right[3]); - mapping[button::ps] = FindKeyCodes(button_list, cfg->ps); - - mapping[button::skateboard_ir_nose] = FindKeyCodes(button_list, cfg->ir_nose); - mapping[button::skateboard_ir_tail] = FindKeyCodes(button_list, cfg->ir_tail); - mapping[button::skateboard_ir_left] = FindKeyCodes(button_list, cfg->ir_left); - mapping[button::skateboard_ir_right] = FindKeyCodes(button_list, cfg->ir_right); - mapping[button::skateboard_tilt_left] = FindKeyCodes(button_list, cfg->tilt_left); - mapping[button::skateboard_tilt_right] = FindKeyCodes(button_list, cfg->tilt_right); + mapping[button::skateboard_ir_nose] = FindKeyCodes(button_list, cfg->ir_nose); + mapping[button::skateboard_ir_tail] = FindKeyCodes(button_list, cfg->ir_tail); + mapping[button::skateboard_ir_left] = FindKeyCodes(button_list, cfg->ir_left); + mapping[button::skateboard_ir_right] = FindKeyCodes(button_list, cfg->ir_right); + mapping[button::skateboard_tilt_left] = FindKeyCodes(button_list, cfg->tilt_left); + mapping[button::skateboard_tilt_right] = FindKeyCodes(button_list, cfg->tilt_right); if (b_has_pressure_intensity_button) { - mapping[button::pressure_intensity_button] = FindKeyCodes(button_list, cfg->pressure_intensity_button); + mapping[button::pressure_intensity_button] = FindKeyCodes(button_list, cfg->pressure_intensity_button); } if (b_has_analog_limiter_button) { - mapping[button::analog_limiter_button] = FindKeyCodes(button_list, cfg->analog_limiter_button); + mapping[button::analog_limiter_button] = FindKeyCodes(button_list, cfg->analog_limiter_button); } if (b_has_orientation) { - mapping[button::orientation_reset_button] = FindKeyCodes(button_list, cfg->orientation_reset_button); + mapping[button::orientation_reset_button] = FindKeyCodes(button_list, cfg->orientation_reset_button); } return mapping; diff --git a/rpcs3/Emu/Io/PadHandler.h b/rpcs3/Emu/Io/PadHandler.h index a273beb3de..f6d18a63ca 100644 --- a/rpcs3/Emu/Io/PadHandler.h +++ b/rpcs3/Emu/Io/PadHandler.h @@ -36,10 +36,6 @@ public: u8 small_motor{0}; bool new_output_data{true}; steady_clock::time_point last_output; - std::set trigger_code_left{}; - std::set trigger_code_right{}; - std::array, 4> axis_code_left{}; - std::array, 4> axis_code_right{}; struct color { @@ -196,76 +192,11 @@ protected: std::shared_ptr m_pad_for_pad_settings; - static std::set narrow_set(const std::set& src); + // Search an unordered map for a string value and return found keycode + static std::set FindKeyCodes(const std::unordered_map& map, const cfg::string& cfg_string, bool fallback = true); // Search an unordered map for a string value and return found keycode - template - static std::set FindKeyCodes(const std::unordered_map& map, const cfg::string& cfg_string, bool fallback = true) - { - std::set key_codes; - - const std::string& def = cfg_string.def; - const std::vector names = cfg_pad::get_buttons(cfg_string.to_string()); - T def_code = umax; - - for (const std::string& nam : names) - { - for (const auto& [code, name] : map) - { - if (name == nam) - { - key_codes.insert(static_cast(code)); - } - - if (fallback && name == def) - def_code = static_cast(code); - } - } - - if (!key_codes.empty()) - { - return key_codes; - } - - if (fallback) - { - if (!names.empty()) - input_log.error("FindKeyCode for [name = %s] returned with [def_code = %d] for [def = %s]", cfg_string.to_string(), def_code, def); - - if (def_code != umax) - { - return { def_code }; - } - } - - return {}; - } - - // Search an unordered map for a string value and return found keycode - template - static std::set FindKeyCodes(const std::unordered_map& map, const std::vector& names) - { - std::set key_codes; - - for (const std::string& name : names) - { - for (const auto& [code, nam] : map) - { - if (nam == name) - { - key_codes.insert(static_cast(code)); - break; - } - } - } - - if (!key_codes.empty()) - { - return key_codes; - } - - return {}; - } + static std::set FindKeyCodes(const std::unordered_map& map, const std::vector& names); // Get normalized trigger value based on the range defined by a threshold u16 NormalizeTriggerInput(u16 value, u32 threshold) const; @@ -375,23 +306,23 @@ public: private: virtual std::shared_ptr get_device(const std::string& /*device*/) { return nullptr; } - virtual bool get_is_left_trigger(const std::shared_ptr& /*device*/, u64 /*keyCode*/) { return false; } - virtual bool get_is_right_trigger(const std::shared_ptr& /*device*/, u64 /*keyCode*/) { return false; } - virtual bool get_is_left_stick(const std::shared_ptr& /*device*/, u64 /*keyCode*/) { return false; } - virtual bool get_is_right_stick(const std::shared_ptr& /*device*/, u64 /*keyCode*/) { return false; } - virtual bool get_is_touch_pad_motion(const std::shared_ptr& /*device*/, u64 /*keyCode*/) { return false; } + virtual bool get_is_left_trigger(const std::shared_ptr& /*device*/, u32 /*keyCode*/) { return false; } + virtual bool get_is_right_trigger(const std::shared_ptr& /*device*/, u32 /*keyCode*/) { return false; } + virtual bool get_is_left_stick(const std::shared_ptr& /*device*/, u32 /*keyCode*/) { return false; } + virtual bool get_is_right_stick(const std::shared_ptr& /*device*/, u32 /*keyCode*/) { return false; } + virtual bool get_is_touch_pad_motion(const std::shared_ptr& /*device*/, u32 /*keyCode*/) { return false; } virtual PadHandlerBase::connection update_connection(const std::shared_ptr& /*device*/) { return connection::disconnected; } virtual void get_extended_info(const pad_ensemble& /*binding*/) {} virtual void apply_pad_data(const pad_ensemble& /*binding*/) {} - virtual std::unordered_map get_button_values(const std::shared_ptr& /*device*/) { return {}; } - virtual pad_preview_values get_preview_values(const std::unordered_map& /*data*/) { return {}; } + virtual std::unordered_map get_button_values(const std::shared_ptr& /*device*/) { return {}; } + virtual pad_preview_values get_preview_values(const std::unordered_map& /*data*/) { return {}; } void get_orientation(const pad_ensemble& binding) const; protected: virtual std::array, PadHandlerBase::button::button_count> get_mapped_key_codes(const std::shared_ptr& device, const cfg_pad* cfg); virtual void get_mapping(const pad_ensemble& binding); - void TranslateButtonPress(const std::shared_ptr& device, u64 keyCode, bool& pressed, u16& val, bool use_stick_multipliers, bool ignore_stick_threshold = false, bool ignore_trigger_threshold = false); + void TranslateButtonPress(const std::shared_ptr& device, u32 keyCode, bool& pressed, u16& val, bool use_stick_multipliers, bool ignore_stick_threshold = false, bool ignore_trigger_threshold = false); void init_configs(); cfg_pad* get_config(const std::string& pad_id); diff --git a/rpcs3/Input/ds3_pad_handler.cpp b/rpcs3/Input/ds3_pad_handler.cpp index 8d8318ce45..dfeb174a2c 100644 --- a/rpcs3/Input/ds3_pad_handler.cpp +++ b/rpcs3/Input/ds3_pad_handler.cpp @@ -348,9 +348,9 @@ ds3_pad_handler::DataStatus ds3_pad_handler::get_data(ds3_device* ds3dev) return DataStatus::NoNewData; } -std::unordered_map ds3_pad_handler::get_button_values(const std::shared_ptr& device) +std::unordered_map ds3_pad_handler::get_button_values(const std::shared_ptr& device) { - std::unordered_map key_buf; + std::unordered_map key_buf; ds3_device* dev = static_cast(device.get()); if (!dev) return key_buf; @@ -397,7 +397,7 @@ std::unordered_map ds3_pad_handler::get_button_values(const std::share return key_buf; } -pad_preview_values ds3_pad_handler::get_preview_values(const std::unordered_map& data) +pad_preview_values ds3_pad_handler::get_preview_values(const std::unordered_map& data) { return { ::at32(data, L2), @@ -460,17 +460,17 @@ void ds3_pad_handler::get_extended_info(const pad_ensemble& binding) set_raw_orientation(*pad); } -bool ds3_pad_handler::get_is_left_trigger(const std::shared_ptr& /*device*/, u64 keyCode) +bool ds3_pad_handler::get_is_left_trigger(const std::shared_ptr& /*device*/, u32 keyCode) { return keyCode == DS3KeyCodes::L2; } -bool ds3_pad_handler::get_is_right_trigger(const std::shared_ptr& /*device*/, u64 keyCode) +bool ds3_pad_handler::get_is_right_trigger(const std::shared_ptr& /*device*/, u32 keyCode) { return keyCode == DS3KeyCodes::R2; } -bool ds3_pad_handler::get_is_left_stick(const std::shared_ptr& /*device*/, u64 keyCode) +bool ds3_pad_handler::get_is_left_stick(const std::shared_ptr& /*device*/, u32 keyCode) { switch (keyCode) { @@ -484,7 +484,7 @@ bool ds3_pad_handler::get_is_left_stick(const std::shared_ptr& /*devi } } -bool ds3_pad_handler::get_is_right_stick(const std::shared_ptr& /*device*/, u64 keyCode) +bool ds3_pad_handler::get_is_right_stick(const std::shared_ptr& /*device*/, u32 keyCode) { switch (keyCode) { diff --git a/rpcs3/Input/ds3_pad_handler.h b/rpcs3/Input/ds3_pad_handler.h index 47dfbf4587..6b0423903c 100644 --- a/rpcs3/Input/ds3_pad_handler.h +++ b/rpcs3/Input/ds3_pad_handler.h @@ -147,13 +147,13 @@ private: int send_output_report(ds3_device* ds3dev) override; void check_add_device(hid_device* hidDevice, hid_enumerated_device_view path, std::wstring_view serial) override; - bool get_is_left_trigger(const std::shared_ptr& device, u64 keyCode) override; - bool get_is_right_trigger(const std::shared_ptr& device, u64 keyCode) override; - bool get_is_left_stick(const std::shared_ptr& device, u64 keyCode) override; - bool get_is_right_stick(const std::shared_ptr& device, u64 keyCode) override; + bool get_is_left_trigger(const std::shared_ptr& device, u32 keyCode) override; + bool get_is_right_trigger(const std::shared_ptr& device, u32 keyCode) override; + bool get_is_left_stick(const std::shared_ptr& device, u32 keyCode) override; + bool get_is_right_stick(const std::shared_ptr& device, u32 keyCode) override; PadHandlerBase::connection update_connection(const std::shared_ptr& device) override; void get_extended_info(const pad_ensemble& binding) override; void apply_pad_data(const pad_ensemble& binding) override; - std::unordered_map get_button_values(const std::shared_ptr& device) override; - pad_preview_values get_preview_values(const std::unordered_map& data) override; + std::unordered_map get_button_values(const std::shared_ptr& device) override; + pad_preview_values get_preview_values(const std::unordered_map& data) override; }; diff --git a/rpcs3/Input/ds4_pad_handler.cpp b/rpcs3/Input/ds4_pad_handler.cpp index 77c59fc48f..50d38773a3 100644 --- a/rpcs3/Input/ds4_pad_handler.cpp +++ b/rpcs3/Input/ds4_pad_handler.cpp @@ -250,9 +250,9 @@ void ds4_pad_handler::SetPadData(const std::string& padId, u8 player_id, u8 larg } } -std::unordered_map ds4_pad_handler::get_button_values(const std::shared_ptr& device) +std::unordered_map ds4_pad_handler::get_button_values(const std::shared_ptr& device) { - std::unordered_map keyBuffer; + std::unordered_map keyBuffer; DS4Device* dev = static_cast(device.get()); if (!dev) return keyBuffer; @@ -405,7 +405,7 @@ std::unordered_map ds4_pad_handler::get_button_values(const std::share return keyBuffer; } -pad_preview_values ds4_pad_handler::get_preview_values(const std::unordered_map& data) +pad_preview_values ds4_pad_handler::get_preview_values(const std::unordered_map& data) { return { ::at32(data, L2), @@ -774,17 +774,17 @@ ds4_pad_handler::DataStatus ds4_pad_handler::get_data(DS4Device* device) return DataStatus::NewData; } -bool ds4_pad_handler::get_is_left_trigger(const std::shared_ptr& /*device*/, u64 keyCode) +bool ds4_pad_handler::get_is_left_trigger(const std::shared_ptr& /*device*/, u32 keyCode) { return keyCode == DS4KeyCodes::L2; } -bool ds4_pad_handler::get_is_right_trigger(const std::shared_ptr& /*device*/, u64 keyCode) +bool ds4_pad_handler::get_is_right_trigger(const std::shared_ptr& /*device*/, u32 keyCode) { return keyCode == DS4KeyCodes::R2; } -bool ds4_pad_handler::get_is_left_stick(const std::shared_ptr& /*device*/, u64 keyCode) +bool ds4_pad_handler::get_is_left_stick(const std::shared_ptr& /*device*/, u32 keyCode) { switch (keyCode) { @@ -798,7 +798,7 @@ bool ds4_pad_handler::get_is_left_stick(const std::shared_ptr& /*devi } } -bool ds4_pad_handler::get_is_right_stick(const std::shared_ptr& /*device*/, u64 keyCode) +bool ds4_pad_handler::get_is_right_stick(const std::shared_ptr& /*device*/, u32 keyCode) { switch (keyCode) { @@ -812,7 +812,7 @@ bool ds4_pad_handler::get_is_right_stick(const std::shared_ptr& /*dev } } -bool ds4_pad_handler::get_is_touch_pad_motion(const std::shared_ptr& /*device*/, u64 keyCode) +bool ds4_pad_handler::get_is_touch_pad_motion(const std::shared_ptr& /*device*/, u32 keyCode) { switch (keyCode) { diff --git a/rpcs3/Input/ds4_pad_handler.h b/rpcs3/Input/ds4_pad_handler.h index 4fdb829d73..da663090ad 100644 --- a/rpcs3/Input/ds4_pad_handler.h +++ b/rpcs3/Input/ds4_pad_handler.h @@ -186,14 +186,14 @@ private: int send_output_report(DS4Device* device) override; void check_add_device(hid_device* hidDevice, hid_enumerated_device_view path, std::wstring_view serial) override; - bool get_is_left_trigger(const std::shared_ptr& device, u64 keyCode) override; - bool get_is_right_trigger(const std::shared_ptr& device, u64 keyCode) override; - bool get_is_left_stick(const std::shared_ptr& device, u64 keyCode) override; - bool get_is_right_stick(const std::shared_ptr& device, u64 keyCode) override; - bool get_is_touch_pad_motion(const std::shared_ptr& device, u64 keyCode) override; + bool get_is_left_trigger(const std::shared_ptr& device, u32 keyCode) override; + bool get_is_right_trigger(const std::shared_ptr& device, u32 keyCode) override; + bool get_is_left_stick(const std::shared_ptr& device, u32 keyCode) override; + bool get_is_right_stick(const std::shared_ptr& device, u32 keyCode) override; + bool get_is_touch_pad_motion(const std::shared_ptr& device, u32 keyCode) override; PadHandlerBase::connection update_connection(const std::shared_ptr& device) override; void get_extended_info(const pad_ensemble& binding) override; void apply_pad_data(const pad_ensemble& binding) override; - std::unordered_map get_button_values(const std::shared_ptr& device) override; - pad_preview_values get_preview_values(const std::unordered_map& data) override; + std::unordered_map get_button_values(const std::shared_ptr& device) override; + pad_preview_values get_preview_values(const std::unordered_map& data) override; }; diff --git a/rpcs3/Input/dualsense_pad_handler.cpp b/rpcs3/Input/dualsense_pad_handler.cpp index 5585c0ef12..91713afa34 100644 --- a/rpcs3/Input/dualsense_pad_handler.cpp +++ b/rpcs3/Input/dualsense_pad_handler.cpp @@ -505,17 +505,17 @@ bool dualsense_pad_handler::get_calibration_data(DualSenseDevice* dev) const return true; } -bool dualsense_pad_handler::get_is_left_trigger(const std::shared_ptr& /*device*/, u64 keyCode) +bool dualsense_pad_handler::get_is_left_trigger(const std::shared_ptr& /*device*/, u32 keyCode) { return keyCode == DualSenseKeyCodes::L2; } -bool dualsense_pad_handler::get_is_right_trigger(const std::shared_ptr& /*device*/, u64 keyCode) +bool dualsense_pad_handler::get_is_right_trigger(const std::shared_ptr& /*device*/, u32 keyCode) { return keyCode == DualSenseKeyCodes::R2; } -bool dualsense_pad_handler::get_is_left_stick(const std::shared_ptr& /*device*/, u64 keyCode) +bool dualsense_pad_handler::get_is_left_stick(const std::shared_ptr& /*device*/, u32 keyCode) { switch (keyCode) { @@ -529,7 +529,7 @@ bool dualsense_pad_handler::get_is_left_stick(const std::shared_ptr& } } -bool dualsense_pad_handler::get_is_right_stick(const std::shared_ptr& /*device*/, u64 keyCode) +bool dualsense_pad_handler::get_is_right_stick(const std::shared_ptr& /*device*/, u32 keyCode) { switch (keyCode) { @@ -543,7 +543,7 @@ bool dualsense_pad_handler::get_is_right_stick(const std::shared_ptr& } } -bool dualsense_pad_handler::get_is_touch_pad_motion(const std::shared_ptr& /*device*/, u64 keyCode) +bool dualsense_pad_handler::get_is_touch_pad_motion(const std::shared_ptr& /*device*/, u32 keyCode) { switch (keyCode) { @@ -635,9 +635,9 @@ void dualsense_pad_handler::get_extended_info(const pad_ensemble& binding) set_raw_orientation(pad->move_data, accel_x, accel_y, accel_z, gyro_x, gyro_y, gyro_z); } -std::unordered_map dualsense_pad_handler::get_button_values(const std::shared_ptr& device) +std::unordered_map dualsense_pad_handler::get_button_values(const std::shared_ptr& device) { - std::unordered_map keyBuffer; + std::unordered_map keyBuffer; DualSenseDevice* dev = static_cast(device.get()); if (!dev) return keyBuffer; @@ -777,7 +777,7 @@ std::unordered_map dualsense_pad_handler::get_button_values(const std: return keyBuffer; } -pad_preview_values dualsense_pad_handler::get_preview_values(const std::unordered_map& data) +pad_preview_values dualsense_pad_handler::get_preview_values(const std::unordered_map& data) { return { ::at32(data, L2), diff --git a/rpcs3/Input/dualsense_pad_handler.h b/rpcs3/Input/dualsense_pad_handler.h index 77b85f320b..c4bc8687c8 100644 --- a/rpcs3/Input/dualsense_pad_handler.h +++ b/rpcs3/Input/dualsense_pad_handler.h @@ -248,14 +248,14 @@ private: void check_add_device(hid_device* hidDevice, hid_enumerated_device_view path, std::wstring_view wide_serial) override; int send_output_report(DualSenseDevice* device) override; - bool get_is_left_trigger(const std::shared_ptr& device, u64 keyCode) override; - bool get_is_right_trigger(const std::shared_ptr& device, u64 keyCode) override; - bool get_is_left_stick(const std::shared_ptr& device, u64 keyCode) override; - bool get_is_right_stick(const std::shared_ptr& device, u64 keyCode) override; - bool get_is_touch_pad_motion(const std::shared_ptr& device, u64 keyCode) override; + bool get_is_left_trigger(const std::shared_ptr& device, u32 keyCode) override; + bool get_is_right_trigger(const std::shared_ptr& device, u32 keyCode) override; + bool get_is_left_stick(const std::shared_ptr& device, u32 keyCode) override; + bool get_is_right_stick(const std::shared_ptr& device, u32 keyCode) override; + bool get_is_touch_pad_motion(const std::shared_ptr& device, u32 keyCode) override; PadHandlerBase::connection update_connection(const std::shared_ptr& device) override; - std::unordered_map get_button_values(const std::shared_ptr& device) override; - pad_preview_values get_preview_values(const std::unordered_map& data) override; + std::unordered_map get_button_values(const std::shared_ptr& device) override; + pad_preview_values get_preview_values(const std::unordered_map& data) override; void get_extended_info(const pad_ensemble& binding) override; void apply_pad_data(const pad_ensemble& binding) override; }; diff --git a/rpcs3/Input/evdev_joystick_handler.cpp b/rpcs3/Input/evdev_joystick_handler.cpp index 03f2016c27..07c39aab26 100644 --- a/rpcs3/Input/evdev_joystick_handler.cpp +++ b/rpcs3/Input/evdev_joystick_handler.cpp @@ -259,9 +259,9 @@ void evdev_joystick_handler::close_devices() } } -std::unordered_map> evdev_joystick_handler::GetButtonValues(const std::shared_ptr& device) +std::unordered_map> evdev_joystick_handler::GetButtonValues(const std::shared_ptr& device) { - std::unordered_map> button_values; + std::unordered_map> button_values; if (!device) return button_values; @@ -379,23 +379,23 @@ PadHandlerBase::connection evdev_joystick_handler::get_next_button_press(const s const auto set_value = [&value, &data](u32 code, bool dir) { - if (const auto it = data.find(static_cast(code)); it != data.cend() && dir == it->second.second) + if (const auto it = data.find(code); it != data.cend() && dir == it->second.second) { value = std::max(value, it->second.first); } }; - for (const u32 code : FindKeyCodes(rev_axis_list, names)) + for (const u32 code : FindKeyCodes(rev_axis_list, names)) { set_value(code, true); } - for (const u32 code : FindKeyCodes(axis_list, names)) + for (const u32 code : FindKeyCodes(axis_list, names)) { set_value(code, false); } - for (const u32 code : FindKeyCodes(button_list, names)) + for (const u32 code : FindKeyCodes(button_list, names)) { set_value(code, false); } @@ -435,7 +435,7 @@ PadHandlerBase::connection evdev_joystick_handler::get_next_button_press(const s return; // Ignore codes that aren't part of the latest events. Otherwise we will get value 0 which will reset our min_value. - const auto it = data.find(static_cast(code)); + const auto it = data.find(code); if (it == data.cend()) { if (call_type == gui_call_type::reset_input) @@ -1351,17 +1351,17 @@ bool evdev_joystick_handler::bindPadToDevice(std::shared_ptr pad) // In evdev we store indices to an EvdevButton vector in our pad objects instead of the usual key codes. std::set indices; - for (const u32 code : FindKeyCodes(axis_list, names)) + for (const u32 code : FindKeyCodes(axis_list, names)) { indices.insert(register_evdevbutton(code, true, false)); } - for (const u32 code : FindKeyCodes(rev_axis_list, names)) + for (const u32 code : FindKeyCodes(rev_axis_list, names)) { indices.insert(register_evdevbutton(code, true, true)); } - for (const u32 code : FindKeyCodes(button_list, names)) + for (const u32 code : FindKeyCodes(button_list, names)) { indices.insert(register_evdevbutton(code, false, false)); } @@ -1376,7 +1376,7 @@ bool evdev_joystick_handler::bindPadToDevice(std::shared_ptr pad) e_sensor.mirrored = sensor.mirrored.get(); e_sensor.shift = sensor.shift.get(); - const std::set keys = FindKeyCodes(motion_axis_list, sensor.axis); + const std::set keys = FindKeyCodes(motion_axis_list, sensor.axis); if (!keys.empty()) e_sensor.code = *keys.begin(); // We should only have one key for each of our sensors return e_sensor; }; @@ -1533,24 +1533,24 @@ bool evdev_joystick_handler::check_button_sets(const std::array, 4 return std::any_of(sets.begin(), sets.end(), [this, code](const std::set& indices) { return check_button_set(indices, code); }); }; -bool evdev_joystick_handler::get_is_left_trigger(const std::shared_ptr& /*device*/, u64 keyCode) +bool evdev_joystick_handler::get_is_left_trigger(const std::shared_ptr& /*device*/, u32 keyCode) { - return check_button_set(m_dev->trigger_left, static_cast(keyCode)); + return check_button_set(m_dev->trigger_left, keyCode); } -bool evdev_joystick_handler::get_is_right_trigger(const std::shared_ptr& /*device*/, u64 keyCode) +bool evdev_joystick_handler::get_is_right_trigger(const std::shared_ptr& /*device*/, u32 keyCode) { - return check_button_set(m_dev->trigger_right, static_cast(keyCode)); + return check_button_set(m_dev->trigger_right, keyCode); } -bool evdev_joystick_handler::get_is_left_stick(const std::shared_ptr& /*device*/, u64 keyCode) +bool evdev_joystick_handler::get_is_left_stick(const std::shared_ptr& /*device*/, u32 keyCode) { - return check_button_sets(m_dev->axis_left, static_cast(keyCode)); + return check_button_sets(m_dev->axis_left, keyCode); } -bool evdev_joystick_handler::get_is_right_stick(const std::shared_ptr& /*device*/, u64 keyCode) +bool evdev_joystick_handler::get_is_right_stick(const std::shared_ptr& /*device*/, u32 keyCode) { - return check_button_sets(m_dev->axis_right, static_cast(keyCode)); + return check_button_sets(m_dev->axis_right, keyCode); } #endif diff --git a/rpcs3/Input/evdev_joystick_handler.h b/rpcs3/Input/evdev_joystick_handler.h index 6919a32205..a76426e3fb 100644 --- a/rpcs3/Input/evdev_joystick_handler.h +++ b/rpcs3/Input/evdev_joystick_handler.h @@ -397,7 +397,7 @@ private: bool update_device(const std::shared_ptr& device); std::shared_ptr add_device(const std::string& device, bool in_settings = false); std::shared_ptr add_motion_device(const std::string& device, bool in_settings); - std::unordered_map> GetButtonValues(const std::shared_ptr& device); + std::unordered_map> GetButtonValues(const std::shared_ptr& device); void SetRumble(EvdevDevice* device, u8 large, u8 small); positive_axis m_pos_axis_config; @@ -420,10 +420,10 @@ protected: void get_mapping(const pad_ensemble& binding) override; void get_extended_info(const pad_ensemble& binding) override; void apply_pad_data(const pad_ensemble& binding) override; - bool get_is_left_trigger(const std::shared_ptr& device, u64 keyCode) override; - bool get_is_right_trigger(const std::shared_ptr& device, u64 keyCode) override; - bool get_is_left_stick(const std::shared_ptr& device, u64 keyCode) override; - bool get_is_right_stick(const std::shared_ptr& device, u64 keyCode) override; + bool get_is_left_trigger(const std::shared_ptr& device, u32 keyCode) override; + bool get_is_right_trigger(const std::shared_ptr& device, u32 keyCode) override; + bool get_is_left_stick(const std::shared_ptr& device, u32 keyCode) override; + bool get_is_right_stick(const std::shared_ptr& device, u32 keyCode) override; }; #endif diff --git a/rpcs3/Input/keyboard_pad_handler.cpp b/rpcs3/Input/keyboard_pad_handler.cpp index e70cf8d45b..3aca96100d 100644 --- a/rpcs3/Input/keyboard_pad_handler.cpp +++ b/rpcs3/Input/keyboard_pad_handler.cpp @@ -980,7 +980,7 @@ bool keyboard_pad_handler::bindPadToDevice(std::shared_ptr pad) const auto find_keys = [this](const cfg::string& name) { - std::set keys = FindKeyCodes(mouse_list, name, false); + std::set keys = FindKeyCodes(mouse_list, name, false); for (const u32& key : GetKeyCodes(name)) keys.insert(key); if (!keys.empty()) diff --git a/rpcs3/Input/mm_joystick_handler.cpp b/rpcs3/Input/mm_joystick_handler.cpp index fed1f428df..8861f74b0d 100644 --- a/rpcs3/Input/mm_joystick_handler.cpp +++ b/rpcs3/Input/mm_joystick_handler.cpp @@ -34,23 +34,23 @@ void mm_joystick_handler::init_config(cfg_pad* cfg) cfg->rs_down.def = ::at32(axis_list, mmjoy_axis::joy_r_neg); cfg->rs_right.def = ::at32(axis_list, mmjoy_axis::joy_z_pos); cfg->rs_up.def = ::at32(axis_list, mmjoy_axis::joy_r_pos); - cfg->start.def = ::at32(button_list, JOY_BUTTON9); - cfg->select.def = ::at32(button_list, JOY_BUTTON10); - cfg->ps.def = ::at32(button_list, JOY_BUTTON17); - cfg->square.def = ::at32(button_list, JOY_BUTTON4); - cfg->cross.def = ::at32(button_list, JOY_BUTTON3); - cfg->circle.def = ::at32(button_list, JOY_BUTTON2); - cfg->triangle.def = ::at32(button_list, JOY_BUTTON1); - cfg->left.def = ::at32(pov_list, JOY_POVLEFT); - cfg->down.def = ::at32(pov_list, JOY_POVBACKWARD); - cfg->right.def = ::at32(pov_list, JOY_POVRIGHT); - cfg->up.def = ::at32(pov_list, JOY_POVFORWARD); - cfg->r1.def = ::at32(button_list, JOY_BUTTON8); - cfg->r2.def = ::at32(button_list, JOY_BUTTON6); - cfg->r3.def = ::at32(button_list, JOY_BUTTON12); - cfg->l1.def = ::at32(button_list, JOY_BUTTON7); - cfg->l2.def = ::at32(button_list, JOY_BUTTON5); - cfg->l3.def = ::at32(button_list, JOY_BUTTON11); + cfg->start.def = ::at32(button_list, static_cast(JOY_BUTTON9)); + cfg->select.def = ::at32(button_list, static_cast(JOY_BUTTON10)); + cfg->ps.def = ::at32(button_list, static_cast(JOY_BUTTON17)); + cfg->square.def = ::at32(button_list, static_cast(JOY_BUTTON4)); + cfg->cross.def = ::at32(button_list, static_cast(JOY_BUTTON3)); + cfg->circle.def = ::at32(button_list, static_cast(JOY_BUTTON2)); + cfg->triangle.def = ::at32(button_list, static_cast(JOY_BUTTON1)); + cfg->left.def = ::at32(pov_list, static_cast(JOY_POVLEFT)); + cfg->down.def = ::at32(pov_list, static_cast(JOY_POVBACKWARD)); + cfg->right.def = ::at32(pov_list, static_cast(JOY_POVRIGHT)); + cfg->up.def = ::at32(pov_list, static_cast(JOY_POVFORWARD)); + cfg->r1.def = ::at32(button_list, static_cast(JOY_BUTTON8)); + cfg->r2.def = ::at32(button_list, static_cast(JOY_BUTTON6)); + cfg->r3.def = ::at32(button_list, static_cast(JOY_BUTTON12)); + cfg->l1.def = ::at32(button_list, static_cast(JOY_BUTTON7)); + cfg->l2.def = ::at32(button_list, static_cast(JOY_BUTTON5)); + cfg->l3.def = ::at32(button_list, static_cast(JOY_BUTTON11)); cfg->pressure_intensity_button.def = ::at32(button_list, NO_BUTTON); cfg->analog_limiter_button.def = ::at32(button_list, NO_BUTTON); @@ -102,7 +102,7 @@ void mm_joystick_handler::enumerate_devices() { MMJOYDevice dev; - if (GetMMJOYDevice(i, &dev) == false) + if (get_device(i, &dev) == false) continue; auto it = m_devices.find(dev.device_name); @@ -145,20 +145,18 @@ std::vector mm_joystick_handler::list_devices() return devices; } -template -std::set mm_joystick_handler::find_keys(const cfg::string& cfg_string) const +std::set mm_joystick_handler::find_keys(const cfg::string& cfg_string) const { - return find_keys(cfg_pad::get_buttons(cfg_string.to_string())); + return find_keys(cfg_pad::get_buttons(cfg_string.to_string())); } -template -std::set mm_joystick_handler::find_keys(const std::vector& names) const +std::set mm_joystick_handler::find_keys(const std::vector& names) const { - std::set keys; + std::set keys; - for (const T& k : FindKeyCodes(axis_list, names)) keys.insert(k); - for (const T& k : FindKeyCodes(pov_list, names)) keys.insert(k); - for (const T& k : FindKeyCodes(button_list, names)) keys.insert(k); + for (u32 k : FindKeyCodes(axis_list, names)) keys.insert(k); + for (u32 k : FindKeyCodes(pov_list, names)) keys.insert(k); + for (u32 k : FindKeyCodes(button_list, names)) keys.insert(k); return keys; } @@ -171,58 +169,58 @@ std::array, PadHandlerBase::button::button_count> mm_joystick_hand if (!dev || !cfg) return mapping; - dev->trigger_code_left = find_keys(cfg->l2); - dev->trigger_code_right = find_keys(cfg->r2); - dev->axis_code_left[0] = find_keys(cfg->ls_left); - dev->axis_code_left[1] = find_keys(cfg->ls_right); - dev->axis_code_left[2] = find_keys(cfg->ls_down); - dev->axis_code_left[3] = find_keys(cfg->ls_up); - dev->axis_code_right[0] = find_keys(cfg->rs_left); - dev->axis_code_right[1] = find_keys(cfg->rs_right); - dev->axis_code_right[2] = find_keys(cfg->rs_down); - dev->axis_code_right[3] = find_keys(cfg->rs_up); + dev->trigger_code_left = find_keys(cfg->l2); + dev->trigger_code_right = find_keys(cfg->r2); + dev->axis_code_left[0] = find_keys(cfg->ls_left); + dev->axis_code_left[1] = find_keys(cfg->ls_right); + dev->axis_code_left[2] = find_keys(cfg->ls_down); + dev->axis_code_left[3] = find_keys(cfg->ls_up); + dev->axis_code_right[0] = find_keys(cfg->rs_left); + dev->axis_code_right[1] = find_keys(cfg->rs_right); + dev->axis_code_right[2] = find_keys(cfg->rs_down); + dev->axis_code_right[3] = find_keys(cfg->rs_up); - mapping[button::up] = find_keys(cfg->up); - mapping[button::down] = find_keys(cfg->down); - mapping[button::left] = find_keys(cfg->left); - mapping[button::right] = find_keys(cfg->right); - mapping[button::cross] = find_keys(cfg->cross); - mapping[button::square] = find_keys(cfg->square); - mapping[button::circle] = find_keys(cfg->circle); - mapping[button::triangle] = find_keys(cfg->triangle); - mapping[button::l1] = find_keys(cfg->l1); - mapping[button::l2] = narrow_set(dev->trigger_code_left); - mapping[button::l3] = find_keys(cfg->l3); - mapping[button::r1] = find_keys(cfg->r1); - mapping[button::r2] = narrow_set(dev->trigger_code_right); - mapping[button::r3] = find_keys(cfg->r3); - mapping[button::start] = find_keys(cfg->start); - mapping[button::select] = find_keys(cfg->select); - mapping[button::ps] = find_keys(cfg->ps); - mapping[button::ls_left] = narrow_set(dev->axis_code_left[0]); - mapping[button::ls_right] = narrow_set(dev->axis_code_left[1]); - mapping[button::ls_down] = narrow_set(dev->axis_code_left[2]); - mapping[button::ls_up] = narrow_set(dev->axis_code_left[3]); - mapping[button::rs_left] = narrow_set(dev->axis_code_right[0]); - mapping[button::rs_right] = narrow_set(dev->axis_code_right[1]); - mapping[button::rs_down] = narrow_set(dev->axis_code_right[2]); - mapping[button::rs_up] = narrow_set(dev->axis_code_right[3]); + mapping[button::up] = find_keys(cfg->up); + mapping[button::down] = find_keys(cfg->down); + mapping[button::left] = find_keys(cfg->left); + mapping[button::right] = find_keys(cfg->right); + mapping[button::cross] = find_keys(cfg->cross); + mapping[button::square] = find_keys(cfg->square); + mapping[button::circle] = find_keys(cfg->circle); + mapping[button::triangle] = find_keys(cfg->triangle); + mapping[button::l1] = find_keys(cfg->l1); + mapping[button::l2] = dev->trigger_code_left; + mapping[button::l3] = find_keys(cfg->l3); + mapping[button::r1] = find_keys(cfg->r1); + mapping[button::r2] = dev->trigger_code_right; + mapping[button::r3] = find_keys(cfg->r3); + mapping[button::start] = find_keys(cfg->start); + mapping[button::select] = find_keys(cfg->select); + mapping[button::ps] = find_keys(cfg->ps); + mapping[button::ls_left] = dev->axis_code_left[0]; + mapping[button::ls_right] = dev->axis_code_left[1]; + mapping[button::ls_down] = dev->axis_code_left[2]; + mapping[button::ls_up] = dev->axis_code_left[3]; + mapping[button::rs_left] = dev->axis_code_right[0]; + mapping[button::rs_right] = dev->axis_code_right[1]; + mapping[button::rs_down] = dev->axis_code_right[2]; + mapping[button::rs_up] = dev->axis_code_right[3]; - mapping[button::skateboard_ir_nose] = find_keys(cfg->ir_nose); - mapping[button::skateboard_ir_tail] = find_keys(cfg->ir_tail); - mapping[button::skateboard_ir_left] = find_keys(cfg->ir_left); - mapping[button::skateboard_ir_right] = find_keys(cfg->ir_right); - mapping[button::skateboard_tilt_left] = find_keys(cfg->tilt_left); - mapping[button::skateboard_tilt_right] = find_keys(cfg->tilt_right); + mapping[button::skateboard_ir_nose] = find_keys(cfg->ir_nose); + mapping[button::skateboard_ir_tail] = find_keys(cfg->ir_tail); + mapping[button::skateboard_ir_left] = find_keys(cfg->ir_left); + mapping[button::skateboard_ir_right] = find_keys(cfg->ir_right); + mapping[button::skateboard_tilt_left] = find_keys(cfg->tilt_left); + mapping[button::skateboard_tilt_right] = find_keys(cfg->tilt_right); if (b_has_pressure_intensity_button) { - mapping[button::pressure_intensity_button] = find_keys(cfg->pressure_intensity_button); + mapping[button::pressure_intensity_button] = find_keys(cfg->pressure_intensity_button); } if (b_has_analog_limiter_button) { - mapping[button::analog_limiter_button] = find_keys(cfg->analog_limiter_button); + mapping[button::analog_limiter_button] = find_keys(cfg->analog_limiter_button); } return mapping; @@ -295,7 +293,7 @@ PadHandlerBase::connection mm_joystick_handler::get_next_button_press(const std: std::string name; } pressed_button{}; - const auto set_button_press = [&](const u64& keycode, const std::string& name, std::string_view type, u16 threshold) + const auto set_button_press = [&](u32 keycode, const std::string& name, std::string_view type, u16 threshold) { if (call_type != gui_call_type::blacklist && m_blacklist.contains(keycode)) return; @@ -365,7 +363,7 @@ PadHandlerBase::connection mm_joystick_handler::get_next_button_press(const std: const auto get_key_value = [this, &data](const std::string& str) -> u16 { u16 value{}; - for (u32 key_code : find_keys(cfg_pad::get_buttons(str))) + for (u32 key_code : find_keys(cfg_pad::get_buttons(str))) { if (const auto it = data.find(key_code); it != data.cend()) { @@ -399,9 +397,9 @@ PadHandlerBase::connection mm_joystick_handler::get_next_button_press(const std: return connection::no_data; } -std::unordered_map mm_joystick_handler::GetButtonValues(const JOYINFOEX& js_info, const JOYCAPS& js_caps) +std::unordered_map mm_joystick_handler::GetButtonValues(const JOYINFOEX& js_info, const JOYCAPS& js_caps) { - std::unordered_map button_values; + std::unordered_map button_values; for (const auto& entry : button_list) { @@ -424,7 +422,7 @@ std::unordered_map mm_joystick_handler::GetButtonValues(const JOYINFOE } else { - auto emplacePOVs = [&](float val, u64 pov_neg, u64 pov_pos) + const auto emplacePOVs = [&](float val, u32 pov_neg, u32 pov_pos) { if (val < 0) { @@ -461,7 +459,7 @@ std::unordered_map mm_joystick_handler::GetButtonValues(const JOYINFOE } } - auto add_axis_value = [&](DWORD axis, UINT min, UINT max, u64 pos, u64 neg) + auto add_axis_value = [&](DWORD axis, UINT min, UINT max, u32 pos, u32 neg) { constexpr f32 deadzone = 0.0f; const float val = ScaledAxisInput(static_cast(axis), static_cast(min), static_cast(max), deadzone); @@ -495,11 +493,11 @@ std::unordered_map mm_joystick_handler::GetButtonValues(const JOYINFOE return button_values; } -std::unordered_map mm_joystick_handler::get_button_values(const std::shared_ptr& device) +std::unordered_map mm_joystick_handler::get_button_values(const std::shared_ptr& device) { MMJOYDevice* dev = static_cast(device.get()); if (!dev) - return std::unordered_map(); + return std::unordered_map(); return GetButtonValues(dev->device_info, dev->device_caps); } @@ -539,7 +537,7 @@ std::shared_ptr mm_joystick_handler::create_de return dev; } -bool mm_joystick_handler::GetMMJOYDevice(int index, MMJOYDevice* dev) const +bool mm_joystick_handler::get_device(int index, MMJOYDevice* dev) const { if (!dev) return false; @@ -578,28 +576,28 @@ std::shared_ptr mm_joystick_handler::get_device(const std::string& de return get_device_by_name(device); } -bool mm_joystick_handler::get_is_left_trigger(const std::shared_ptr& device, u64 keyCode) +bool mm_joystick_handler::get_is_left_trigger(const std::shared_ptr& device, u32 keyCode) { const MMJOYDevice* dev = static_cast(device.get()); return dev && dev->trigger_code_left.contains(keyCode); } -bool mm_joystick_handler::get_is_right_trigger(const std::shared_ptr& device, u64 keyCode) +bool mm_joystick_handler::get_is_right_trigger(const std::shared_ptr& device, u32 keyCode) { const MMJOYDevice* dev = static_cast(device.get()); return dev && dev->trigger_code_right.contains(keyCode); } -bool mm_joystick_handler::get_is_left_stick(const std::shared_ptr& device, u64 keyCode) +bool mm_joystick_handler::get_is_left_stick(const std::shared_ptr& device, u32 keyCode) { const MMJOYDevice* dev = static_cast(device.get()); - return dev && std::any_of(dev->axis_code_left.cbegin(), dev->axis_code_left.cend(), [&keyCode](const std::set& s){ return s.contains(keyCode); }); + return dev && std::any_of(dev->axis_code_left.cbegin(), dev->axis_code_left.cend(), [&keyCode](const std::set& s){ return s.contains(keyCode); }); } -bool mm_joystick_handler::get_is_right_stick(const std::shared_ptr& device, u64 keyCode) +bool mm_joystick_handler::get_is_right_stick(const std::shared_ptr& device, u32 keyCode) { const MMJOYDevice* dev = static_cast(device.get()); - return dev && std::any_of(dev->axis_code_right.cbegin(), dev->axis_code_right.cend(), [&keyCode](const std::set& s){ return s.contains(keyCode); }); + return dev && std::any_of(dev->axis_code_right.cbegin(), dev->axis_code_right.cend(), [&keyCode](const std::set& s){ return s.contains(keyCode); }); } PadHandlerBase::connection mm_joystick_handler::update_connection(const std::shared_ptr& device) @@ -630,7 +628,7 @@ PadHandlerBase::connection mm_joystick_handler::update_connection(const std::sha } // Try to connect properly again - if (GetMMJOYDevice(dev->device_id, dev)) + if (get_device(dev->device_id, dev)) return connection::connected; return connection::disconnected; diff --git a/rpcs3/Input/mm_joystick_handler.h b/rpcs3/Input/mm_joystick_handler.h index 1459e9be82..e8cad683b3 100644 --- a/rpcs3/Input/mm_joystick_handler.h +++ b/rpcs3/Input/mm_joystick_handler.h @@ -16,10 +16,10 @@ class mm_joystick_handler final : public PadHandlerBase { - static constexpr u64 NO_BUTTON = u64{umax}; + static constexpr u32 NO_BUTTON = u32{umax}; // Unique names for the config files and our pad settings dialog - const std::unordered_map button_list = + const std::unordered_map button_list = { { NO_BUTTON , "" }, { JOY_BUTTON1 , "Button 1" }, @@ -57,7 +57,7 @@ class mm_joystick_handler final : public PadHandlerBase }; // Unique names for the config files and our pad settings dialog - const std::unordered_map pov_list = + const std::unordered_map pov_list = { { JOY_POVFORWARD, "POV Up" }, { JOY_POVRIGHT, "POV Right" }, @@ -65,7 +65,7 @@ class mm_joystick_handler final : public PadHandlerBase { JOY_POVLEFT, "POV Left" } }; - enum mmjoy_axis + enum mmjoy_axis : u32 { joy_x_pos = 9700, joy_x_neg, @@ -82,7 +82,7 @@ class mm_joystick_handler final : public PadHandlerBase }; // Unique names for the config files and our pad settings dialog - const std::unordered_map axis_list = + const std::unordered_map axis_list = { { joy_x_pos, "X+" }, { joy_x_neg, "X-" }, @@ -106,6 +106,10 @@ class mm_joystick_handler final : public PadHandlerBase JOYCAPS device_caps{}; MMRESULT device_status = JOYERR_UNPLUGGED; steady_clock::time_point last_update{}; + std::set trigger_code_left{}; + std::set trigger_code_right{}; + std::array, 4> axis_code_left{}; + std::array, 4> axis_code_right{}; }; public: @@ -118,31 +122,28 @@ public: void init_config(cfg_pad* cfg) override; private: - std::unordered_map GetButtonValues(const JOYINFOEX& js_info, const JOYCAPS& js_caps); + std::unordered_map GetButtonValues(const JOYINFOEX& js_info, const JOYCAPS& js_caps); std::shared_ptr get_device_by_name(const std::string& name); std::shared_ptr create_device_by_name(const std::string& name); - bool GetMMJOYDevice(int index, MMJOYDevice* dev) const; + bool get_device(int index, MMJOYDevice* dev) const; void enumerate_devices(); bool m_is_init = false; - std::set m_blacklist; - std::unordered_map m_min_button_values; + std::set m_blacklist; + std::unordered_map m_min_button_values; std::map> m_devices; - template - std::set find_keys(const std::vector& names) const; - - template - std::set find_keys(const cfg::string& cfg_string) const; + std::set find_keys(const std::vector& names) const; + std::set find_keys(const cfg::string& cfg_string) const; std::array, PadHandlerBase::button::button_count> get_mapped_key_codes(const std::shared_ptr& device, const cfg_pad* cfg) override; std::shared_ptr get_device(const std::string& device) override; - bool get_is_left_trigger(const std::shared_ptr& device, u64 keyCode) override; - bool get_is_right_trigger(const std::shared_ptr& device, u64 keyCode) override; - bool get_is_left_stick(const std::shared_ptr& device, u64 keyCode) override; - bool get_is_right_stick(const std::shared_ptr& device, u64 keyCode) override; + bool get_is_left_trigger(const std::shared_ptr& device, u32 keyCode) override; + bool get_is_right_trigger(const std::shared_ptr& device, u32 keyCode) override; + bool get_is_left_stick(const std::shared_ptr& device, u32 keyCode) override; + bool get_is_right_stick(const std::shared_ptr& device, u32 keyCode) override; PadHandlerBase::connection update_connection(const std::shared_ptr& device) override; - std::unordered_map get_button_values(const std::shared_ptr& device) override; + std::unordered_map get_button_values(const std::shared_ptr& device) override; }; #endif diff --git a/rpcs3/Input/ps_move_handler.cpp b/rpcs3/Input/ps_move_handler.cpp index 059ffee2bf..38c89a1de0 100644 --- a/rpcs3/Input/ps_move_handler.cpp +++ b/rpcs3/Input/ps_move_handler.cpp @@ -580,21 +580,21 @@ void ps_move_handler::handle_external_device(const pad_ensemble& binding) move_data.external_device_write_requested = false; } -bool ps_move_handler::get_is_left_trigger(const std::shared_ptr& /*device*/, u64 keyCode) +bool ps_move_handler::get_is_left_trigger(const std::shared_ptr& /*device*/, u32 keyCode) { // We also report the T button as left trigger return keyCode == ps_move_key_codes::L2 || keyCode == ps_move_key_codes::t; } -bool ps_move_handler::get_is_right_trigger(const std::shared_ptr& /*device*/, u64 keyCode) +bool ps_move_handler::get_is_right_trigger(const std::shared_ptr& /*device*/, u32 keyCode) { // We also report the Throttle button as right trigger return keyCode == ps_move_key_codes::R2 || keyCode == ps_move_key_codes::throttle; } -std::unordered_map ps_move_handler::get_button_values(const std::shared_ptr& device) +std::unordered_map ps_move_handler::get_button_values(const std::shared_ptr& device) { - std::unordered_map key_buf; + std::unordered_map key_buf; ps_move_device* dev = static_cast(device.get()); if (!dev) return key_buf; @@ -760,7 +760,7 @@ void ps_move_handler::get_extended_info(const pad_ensemble& binding) handle_external_device(binding); } -pad_preview_values ps_move_handler::get_preview_values(const std::unordered_map& data) +pad_preview_values ps_move_handler::get_preview_values(const std::unordered_map& data) { return { std::max(::at32(data, ps_move_key_codes::L2), ::at32(data, ps_move_key_codes::t)), diff --git a/rpcs3/Input/ps_move_handler.h b/rpcs3/Input/ps_move_handler.h index 6584364556..deac588862 100644 --- a/rpcs3/Input/ps_move_handler.h +++ b/rpcs3/Input/ps_move_handler.h @@ -192,11 +192,11 @@ private: void check_add_device(hid_device* hidDevice, hid_enumerated_device_view path, std::wstring_view wide_serial) override; int send_output_report(ps_move_device* device) override; - bool get_is_left_trigger(const std::shared_ptr& device, u64 keyCode) override; - bool get_is_right_trigger(const std::shared_ptr& device, u64 keyCode) override; + bool get_is_left_trigger(const std::shared_ptr& device, u32 keyCode) override; + bool get_is_right_trigger(const std::shared_ptr& device, u32 keyCode) override; PadHandlerBase::connection update_connection(const std::shared_ptr& device) override; - std::unordered_map get_button_values(const std::shared_ptr& device) override; - pad_preview_values get_preview_values(const std::unordered_map& data) override; + std::unordered_map get_button_values(const std::shared_ptr& device) override; + pad_preview_values get_preview_values(const std::unordered_map& data) override; void get_extended_info(const pad_ensemble& binding) override; void apply_pad_data(const pad_ensemble& binding) override; diff --git a/rpcs3/Input/sdl_pad_handler.cpp b/rpcs3/Input/sdl_pad_handler.cpp index c47514f6ae..f681018d80 100644 --- a/rpcs3/Input/sdl_pad_handler.cpp +++ b/rpcs3/Input/sdl_pad_handler.cpp @@ -881,17 +881,17 @@ void sdl_pad_handler::set_rumble(SDLDevice* dev, u8 speed_large, u8 speed_small) } } -bool sdl_pad_handler::get_is_left_trigger(const std::shared_ptr& /*device*/, u64 keyCode) +bool sdl_pad_handler::get_is_left_trigger(const std::shared_ptr& /*device*/, u32 keyCode) { return keyCode == SDLKeyCodes::LT; } -bool sdl_pad_handler::get_is_right_trigger(const std::shared_ptr& /*device*/, u64 keyCode) +bool sdl_pad_handler::get_is_right_trigger(const std::shared_ptr& /*device*/, u32 keyCode) { return keyCode == SDLKeyCodes::RT; } -bool sdl_pad_handler::get_is_left_stick(const std::shared_ptr& /*device*/, u64 keyCode) +bool sdl_pad_handler::get_is_left_stick(const std::shared_ptr& /*device*/, u32 keyCode) { switch (keyCode) { @@ -905,7 +905,7 @@ bool sdl_pad_handler::get_is_left_stick(const std::shared_ptr& /*devi } } -bool sdl_pad_handler::get_is_right_stick(const std::shared_ptr& /*device*/, u64 keyCode) +bool sdl_pad_handler::get_is_right_stick(const std::shared_ptr& /*device*/, u32 keyCode) { switch (keyCode) { @@ -919,7 +919,7 @@ bool sdl_pad_handler::get_is_right_stick(const std::shared_ptr& /*dev } } -bool sdl_pad_handler::get_is_touch_pad_motion(const std::shared_ptr& /*device*/, u64 keyCode) +bool sdl_pad_handler::get_is_touch_pad_motion(const std::shared_ptr& /*device*/, u32 keyCode) { switch (keyCode) { @@ -933,9 +933,9 @@ bool sdl_pad_handler::get_is_touch_pad_motion(const std::shared_ptr& } } -std::unordered_map sdl_pad_handler::get_button_values(const std::shared_ptr& device) +std::unordered_map sdl_pad_handler::get_button_values(const std::shared_ptr& device) { - std::unordered_map values; + std::unordered_map values; SDLDevice* dev = static_cast(device.get()); if (!dev || !dev->sdl.gamepad) return values; @@ -1086,7 +1086,7 @@ std::unordered_map sdl_pad_handler::get_button_values(const std::share return values; } -pad_preview_values sdl_pad_handler::get_preview_values(const std::unordered_map& data) +pad_preview_values sdl_pad_handler::get_preview_values(const std::unordered_map& data) { return { ::at32(data, LT), diff --git a/rpcs3/Input/sdl_pad_handler.h b/rpcs3/Input/sdl_pad_handler.h index d889463934..f65d31a78a 100644 --- a/rpcs3/Input/sdl_pad_handler.h +++ b/rpcs3/Input/sdl_pad_handler.h @@ -171,13 +171,13 @@ private: PadHandlerBase::connection update_connection(const std::shared_ptr& device) override; void get_extended_info(const pad_ensemble& binding) override; void apply_pad_data(const pad_ensemble& binding) override; - bool get_is_left_trigger(const std::shared_ptr& device, u64 keyCode) override; - bool get_is_right_trigger(const std::shared_ptr& device, u64 keyCode) override; - bool get_is_left_stick(const std::shared_ptr& device, u64 keyCode) override; - bool get_is_right_stick(const std::shared_ptr& device, u64 keyCode) override; - bool get_is_touch_pad_motion(const std::shared_ptr& device, u64 keyCode) override; - std::unordered_map get_button_values(const std::shared_ptr& device) override; - pad_preview_values get_preview_values(const std::unordered_map& data) override; + bool get_is_left_trigger(const std::shared_ptr& device, u32 keyCode) override; + bool get_is_right_trigger(const std::shared_ptr& device, u32 keyCode) override; + bool get_is_left_stick(const std::shared_ptr& device, u32 keyCode) override; + bool get_is_right_stick(const std::shared_ptr& device, u32 keyCode) override; + bool get_is_touch_pad_motion(const std::shared_ptr& device, u32 keyCode) override; + std::unordered_map get_button_values(const std::shared_ptr& device) override; + pad_preview_values get_preview_values(const std::unordered_map& data) override; u32 get_battery_color(int power_level, u32 brightness) const; void set_rumble(SDLDevice* dev, u8 speed_large, u8 speed_small); diff --git a/rpcs3/Input/skateboard_pad_handler.cpp b/rpcs3/Input/skateboard_pad_handler.cpp index fdcc5be727..577d30d8e3 100644 --- a/rpcs3/Input/skateboard_pad_handler.cpp +++ b/rpcs3/Input/skateboard_pad_handler.cpp @@ -272,9 +272,9 @@ PadHandlerBase::connection skateboard_pad_handler::update_connection(const std:: return connection::connected; } -std::unordered_map skateboard_pad_handler::get_button_values(const std::shared_ptr& device) +std::unordered_map skateboard_pad_handler::get_button_values(const std::shared_ptr& device) { - std::unordered_map key_buf; + std::unordered_map key_buf; skateboard_device* dev = static_cast(device.get()); if (!dev) return key_buf; @@ -328,7 +328,7 @@ void skateboard_pad_handler::get_extended_info(const pad_ensemble& binding) set_raw_orientation(*pad); } -pad_preview_values skateboard_pad_handler::get_preview_values(const std::unordered_map& /*data*/) +pad_preview_values skateboard_pad_handler::get_preview_values(const std::unordered_map& /*data*/) { // There is no proper user interface for skateboard values yet return {}; diff --git a/rpcs3/Input/skateboard_pad_handler.h b/rpcs3/Input/skateboard_pad_handler.h index e7f15c494e..92e4174acc 100644 --- a/rpcs3/Input/skateboard_pad_handler.h +++ b/rpcs3/Input/skateboard_pad_handler.h @@ -183,8 +183,8 @@ private: int send_output_report(skateboard_device* device) override; PadHandlerBase::connection update_connection(const std::shared_ptr& device) override; - std::unordered_map get_button_values(const std::shared_ptr& device) override; - pad_preview_values get_preview_values(const std::unordered_map& data) override; + std::unordered_map get_button_values(const std::shared_ptr& device) override; + pad_preview_values get_preview_values(const std::unordered_map& data) override; void get_extended_info(const pad_ensemble& binding) override; void apply_pad_data(const pad_ensemble& binding) override; }; diff --git a/rpcs3/Input/xinput_pad_handler.cpp b/rpcs3/Input/xinput_pad_handler.cpp index 4feec000e3..b9d4450200 100644 --- a/rpcs3/Input/xinput_pad_handler.cpp +++ b/rpcs3/Input/xinput_pad_handler.cpp @@ -201,9 +201,9 @@ int xinput_pad_handler::GetDeviceNumber(const std::string& padId) return device_number; } -std::unordered_map xinput_pad_handler::get_button_values(const std::shared_ptr& device) +std::unordered_map xinput_pad_handler::get_button_values(const std::shared_ptr& device) { - PadButtonValues values; + std::unordered_map values; XInputDevice* dev = static_cast(device.get()); if (!dev || dev->state != ERROR_SUCCESS) // the state has to be aquired with update_connection before calling this function return values; @@ -217,9 +217,9 @@ std::unordered_map xinput_pad_handler::get_button_values(const std::sh return get_button_values_base(dev->state_base, m_trigger_recognition_mode); } -xinput_pad_handler::PadButtonValues xinput_pad_handler::get_button_values_base(const XINPUT_STATE& state, trigger_recognition_mode trigger_mode) +std::unordered_map xinput_pad_handler::get_button_values_base(const XINPUT_STATE& state, trigger_recognition_mode trigger_mode) { - PadButtonValues values; + std::unordered_map values; // Triggers if (trigger_mode == trigger_recognition_mode::any || trigger_mode == trigger_recognition_mode::one_directional) @@ -291,9 +291,9 @@ xinput_pad_handler::PadButtonValues xinput_pad_handler::get_button_values_base(c return values; } -xinput_pad_handler::PadButtonValues xinput_pad_handler::get_button_values_scp(const SCP_EXTN& state, trigger_recognition_mode trigger_mode) +std::unordered_map xinput_pad_handler::get_button_values_scp(const SCP_EXTN& state, trigger_recognition_mode trigger_mode) { - PadButtonValues values; + std::unordered_map values; // Triggers if (trigger_mode == trigger_recognition_mode::any || trigger_mode == trigger_recognition_mode::one_directional) @@ -359,7 +359,7 @@ xinput_pad_handler::PadButtonValues xinput_pad_handler::get_button_values_scp(co return values; } -pad_preview_values xinput_pad_handler::get_preview_values(const std::unordered_map& data) +pad_preview_values xinput_pad_handler::get_preview_values(const std::unordered_map& data) { return { ::at32(data, LT), @@ -455,17 +455,17 @@ std::shared_ptr xinput_pad_handler::get_device(const std::string& dev return dev; } -bool xinput_pad_handler::get_is_left_trigger(const std::shared_ptr& /*device*/, u64 keyCode) +bool xinput_pad_handler::get_is_left_trigger(const std::shared_ptr& /*device*/, u32 keyCode) { return keyCode == XInputKeyCodes::LT; } -bool xinput_pad_handler::get_is_right_trigger(const std::shared_ptr& /*device*/, u64 keyCode) +bool xinput_pad_handler::get_is_right_trigger(const std::shared_ptr& /*device*/, u32 keyCode) { return keyCode == XInputKeyCodes::RT; } -bool xinput_pad_handler::get_is_left_stick(const std::shared_ptr& /*device*/, u64 keyCode) +bool xinput_pad_handler::get_is_left_stick(const std::shared_ptr& /*device*/, u32 keyCode) { switch (keyCode) { @@ -479,7 +479,7 @@ bool xinput_pad_handler::get_is_left_stick(const std::shared_ptr& /*d } } -bool xinput_pad_handler::get_is_right_stick(const std::shared_ptr& /*device*/, u64 keyCode) +bool xinput_pad_handler::get_is_right_stick(const std::shared_ptr& /*device*/, u32 keyCode) { switch (keyCode) { diff --git a/rpcs3/Input/xinput_pad_handler.h b/rpcs3/Input/xinput_pad_handler.h index 899e649b13..d4233bae4a 100644 --- a/rpcs3/Input/xinput_pad_handler.h +++ b/rpcs3/Input/xinput_pad_handler.h @@ -93,8 +93,6 @@ class xinput_pad_handler final : public PadHandlerBase RSYPos }; - using PadButtonValues = std::unordered_map; - struct XInputDevice : public PadDevice { u32 deviceNumber{ 0 }; @@ -123,8 +121,8 @@ private: using PFN_XINPUTGETBATTERYINFORMATION = DWORD(WINAPI*)(DWORD, BYTE, XINPUT_BATTERY_INFORMATION*); int GetDeviceNumber(const std::string& padId); - static PadButtonValues get_button_values_base(const XINPUT_STATE& state, trigger_recognition_mode trigger_mode); - static PadButtonValues get_button_values_scp(const SCP_EXTN& state, trigger_recognition_mode trigger_mode); + static std::unordered_map get_button_values_base(const XINPUT_STATE& state, trigger_recognition_mode trigger_mode); + static std::unordered_map get_button_values_scp(const SCP_EXTN& state, trigger_recognition_mode trigger_mode); PFN_XINPUTGETEXTENDED xinputGetExtended{ nullptr }; PFN_XINPUTGETCUSTOMDATA xinputGetCustomData{ nullptr }; @@ -134,13 +132,13 @@ private: utils::dynamic_library library; std::shared_ptr get_device(const std::string& device) override; - bool get_is_left_trigger(const std::shared_ptr& device, u64 keyCode) override; - bool get_is_right_trigger(const std::shared_ptr& device, u64 keyCode) override; - bool get_is_left_stick(const std::shared_ptr& device, u64 keyCode) override; - bool get_is_right_stick(const std::shared_ptr& device, u64 keyCode) override; + bool get_is_left_trigger(const std::shared_ptr& device, u32 keyCode) override; + bool get_is_right_trigger(const std::shared_ptr& device, u32 keyCode) override; + bool get_is_left_stick(const std::shared_ptr& device, u32 keyCode) override; + bool get_is_right_stick(const std::shared_ptr& device, u32 keyCode) override; PadHandlerBase::connection update_connection(const std::shared_ptr& device) override; void get_extended_info(const pad_ensemble& binding) override; void apply_pad_data(const pad_ensemble& binding) override; - std::unordered_map get_button_values(const std::shared_ptr& device) override; - pad_preview_values get_preview_values(const std::unordered_map& data) override; + std::unordered_map get_button_values(const std::shared_ptr& device) override; + pad_preview_values get_preview_values(const std::unordered_map& data) override; }; From 477ae6c6dfa5beaa46f892beed27cf469e59db20 Mon Sep 17 00:00:00 2001 From: p0yr4s Date: Sat, 14 Mar 2026 18:20:02 +0100 Subject: [PATCH 100/295] cmake: Only use Qt6::GuiPrivate for Qt >= 6.10 --- 3rdparty/qt6.cmake | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/3rdparty/qt6.cmake b/3rdparty/qt6.cmake index e15e0abdcb..969967fa40 100644 --- a/3rdparty/qt6.cmake +++ b/3rdparty/qt6.cmake @@ -6,15 +6,22 @@ find_package(Qt6 ${QT_MIN_VER} CONFIG COMPONENTS Widgets Concurrent Multimedia M if(WIN32) target_link_libraries(3rdparty_qt6 INTERFACE Qt6::Widgets Qt6::Concurrent Qt6::Multimedia Qt6::MultimediaWidgets Qt6::Svg Qt6::SvgWidgets) else() - set(QT_NO_PRIVATE_MODULE_WARNING ON) - find_package(Qt6 ${QT_MIN_VER} COMPONENTS DBus Gui GuiPrivate) + find_package(Qt6 ${QT_MIN_VER} COMPONENTS DBus Gui) + if(Qt6_VERSION VERSION_GREATER_EQUAL "6.10.0") + set(QT_NO_PRIVATE_MODULE_WARNING ON) + find_package(Qt6 ${QT_MIN_VER} COMPONENTS GuiPrivate) + endif() if(Qt6DBus_FOUND) target_link_libraries(3rdparty_qt6 INTERFACE Qt6::Widgets Qt6::DBus Qt6::Concurrent Qt6::Multimedia Qt6::MultimediaWidgets Qt6::Svg Qt6::SvgWidgets) target_compile_definitions(3rdparty_qt6 INTERFACE -DHAVE_QTDBUS) else() target_link_libraries(3rdparty_qt6 INTERFACE Qt6::Widgets Qt6::Concurrent Qt6::Multimedia Qt6::MultimediaWidgets Qt6::Svg Qt6::SvgWidgets) endif() - target_link_libraries(3rdparty_qt6 INTERFACE Qt6::GuiPrivate) + if(Qt6_VERSION VERSION_GREATER_EQUAL "6.10.0") + target_link_libraries(3rdparty_qt6 INTERFACE Qt6::GuiPrivate) + else() + target_include_directories(3rdparty_qt6 INTERFACE ${Qt6Gui_PRIVATE_INCLUDE_DIRS}) + endif() endif() if(Qt6Widgets_FOUND) From 297db8713fbb02bfb156edb6c03c68850825a83e Mon Sep 17 00:00:00 2001 From: p0yr4s Date: Sat, 14 Mar 2026 18:20:15 +0100 Subject: [PATCH 101/295] qt: import QJsonDocument --- rpcs3/rpcs3qt/downloader.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/rpcs3/rpcs3qt/downloader.cpp b/rpcs3/rpcs3qt/downloader.cpp index 65f481bff8..852449c0af 100644 --- a/rpcs3/rpcs3qt/downloader.cpp +++ b/rpcs3/rpcs3qt/downloader.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include "downloader.h" #include "curl_handle.h" From 722101259383b21fedd681559a40bec4785bba16 Mon Sep 17 00:00:00 2001 From: Ani Date: Mon, 16 Mar 2026 01:19:40 +0100 Subject: [PATCH 102/295] config: Disable pad navigation by default Pad navigation is currently crashing with the SDL handler, see #18362. Disable it until the issue is fixed. --- rpcs3/rpcs3qt/gui_settings.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpcs3/rpcs3qt/gui_settings.h b/rpcs3/rpcs3qt/gui_settings.h index bdc6401031..21a46259c2 100644 --- a/rpcs3/rpcs3qt/gui_settings.h +++ b/rpcs3/rpcs3qt/gui_settings.h @@ -315,7 +315,7 @@ namespace gui const gui_save sc_shortcuts = gui_save(sc, "shortcuts", QVariantMap()); - const gui_save nav_enabled = gui_save(navigation, "pad_input_enabled", true); + const gui_save nav_enabled = gui_save(navigation, "pad_input_enabled", false); const gui_save nav_global = gui_save(navigation, "allow_global_pad_input", false); } From 1fb97734a0ee70588bd9124ec204782d874c0b47 Mon Sep 17 00:00:00 2001 From: Ani Date: Mon, 16 Mar 2026 01:12:51 +0100 Subject: [PATCH 103/295] cellDmuxPamf: LLE by default again HLE implementation is crashing on a few games, see #18360, revert it back to LLE until issues with HLE are fixed --- rpcs3/Emu/Cell/lv2/sys_prx.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpcs3/Emu/Cell/lv2/sys_prx.cpp b/rpcs3/Emu/Cell/lv2/sys_prx.cpp index f46f3bdafa..f20b6be6cb 100644 --- a/rpcs3/Emu/Cell/lv2/sys_prx.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_prx.cpp @@ -64,7 +64,7 @@ extern const std::map g_prx_list { "libddpdec.sprx", 0 }, { "libdivxdec.sprx", 0 }, { "libdmux.sprx", 0 }, - { "libdmuxpamf.sprx", 1 }, + { "libdmuxpamf.sprx", 0 }, { "libdtslbrdec.sprx", 0 }, { "libfiber.sprx", 0 }, { "libfont.sprx", 0 }, From b422cb86f277f9ce668048d084e91e69564ea31f Mon Sep 17 00:00:00 2001 From: Ani Date: Mon, 16 Mar 2026 01:07:29 +0100 Subject: [PATCH 104/295] cmake: Build with SDL by default --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 738d9bbf17..e5b77091cb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -37,7 +37,7 @@ option(USE_LIBEVDEV "libevdev-based joystick support" ON) option(USE_DISCORD_RPC "Discord rich presence integration" OFF) option(USE_VULKAN "Vulkan render backend" ON) option(USE_PRECOMPILED_HEADERS "Use precompiled headers" OFF) -option(USE_SDL "Enables SDL input handler" OFF) +option(USE_SDL "Enables SDL input handler" ON) option(USE_SYSTEM_CUBEB "Prefer system cubeb instead of the builtin one" OFF) option(USE_SYSTEM_CURL "Prefer system Curl instead of the prebuild one" ON) option(USE_SYSTEM_FAUDIO "Prefer system FAudio instead of the builtin one" OFF) From 6c48bd8f93fee36cafa4438d8bd262673191c437 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Mon, 16 Mar 2026 08:08:36 +0100 Subject: [PATCH 105/295] Fix callback initialization order We need to initialize the emu callbacks before creating the main window. Otherwise CallFromMainThread segs since call_from_main_thread is null. The same goes for the CallFromMainThread connect in gui_application. If we create the connection too late, we will simply never wake up the caller and therefore softlock eventually. --- rpcs3/Emu/System.cpp | 4 ++- rpcs3/rpcs3qt/gui_application.cpp | 45 +++++++++++++++---------------- rpcs3/rpcs3qt/gui_settings.h | 2 +- 3 files changed, 25 insertions(+), 26 deletions(-) diff --git a/rpcs3/Emu/System.cpp b/rpcs3/Emu/System.cpp index 3548df869d..85b753d130 100644 --- a/rpcs3/Emu/System.cpp +++ b/rpcs3/Emu/System.cpp @@ -166,6 +166,8 @@ void fmt_class_string::format(std::string& out, u64 arg) void Emulator::CallFromMainThread(std::function&& func, atomic_t* wake_up, bool track_emu_state, u64 stop_ctr, std::source_location src_loc) const { + ensure(func); + std::function final_func = [this, before = IsStopped(true), track_emu_state, thread_name = thread_ctrl::get_name(), src = src_loc , count = (stop_ctr == umax ? +m_stop_ctr : stop_ctr), func = std::move(func)] { @@ -179,7 +181,7 @@ void Emulator::CallFromMainThread(std::function&& func, atomic_t* w } }; - m_cb.call_from_main_thread(std::move(final_func), wake_up); + ensure(m_cb.call_from_main_thread)(std::move(final_func), wake_up); } void Emulator::BlockingCallFromMainThread(std::function&& func, bool track_emu_state, std::source_location src_loc) const diff --git a/rpcs3/rpcs3qt/gui_application.cpp b/rpcs3/rpcs3qt/gui_application.cpp index 113f5a6ebb..606a081fff 100644 --- a/rpcs3/rpcs3qt/gui_application.cpp +++ b/rpcs3/rpcs3qt/gui_application.cpp @@ -154,6 +154,12 @@ bool gui_application::Init() // Force init the emulator InitializeEmulator(m_active_user, m_show_gui); + // Create callbacks from the emulator, which reference the handlers. + InitializeCallbacks(); + + // Create connects to propagate events throughout Gui. + InitializeConnects(); + // Create the main window if (m_show_gui) { @@ -164,14 +170,23 @@ bool gui_application::Init() const auto index = codes.indexOf(language); LoadLanguage(index < 0 ? QLocale(QLocale::English).bcp47Name() : ::at32(codes, index)); + + connect(m_main_window, &main_window::RequestLanguageChange, this, &gui_application::LoadLanguage); + connect(m_main_window, &main_window::RequestGlobalStylesheetChange, this, &gui_application::OnChangeStyleSheetRequest); + connect(m_main_window, &main_window::NotifyEmuSettingsChange, this, [this](){ OnEmuSettingsChange(); }); + connect(m_main_window, &main_window::NotifyShortcutHandlers, this, &gui_application::OnShortcutChange); + + connect(this, &gui_application::OnEmulatorRun, m_main_window, &main_window::OnEmuRun); + connect(this, &gui_application::OnEmulatorStop, m_main_window, &main_window::OnEmuStop); + connect(this, &gui_application::OnEmulatorPause, m_main_window, &main_window::OnEmuPause); + connect(this, &gui_application::OnEmulatorResume, m_main_window, &main_window::OnEmuResume); + connect(this, &gui_application::OnEmulatorReady, m_main_window, &main_window::OnEmuReady); + connect(this, &gui_application::OnEnableDiscEject, m_main_window, &main_window::OnEnableDiscEject); + connect(this, &gui_application::OnEnableDiscInsert, m_main_window, &main_window::OnEnableDiscInsert); + + connect(QGuiApplication::styleHints(), &QStyleHints::colorSchemeChanged, this, [this](){ OnChangeStyleSheetRequest(); }); } - // Create callbacks from the emulator, which reference the handlers. - InitializeCallbacks(); - - // Create connects to propagate events throughout Gui. - InitializeConnects(); - if (m_gui_settings->GetValue(gui::ib_show_welcome).toBool()) { welcome_dialog* welcome = new welcome_dialog(m_gui_settings, false); @@ -438,24 +453,6 @@ void gui_application::InitializeConnects() connect(this, &gui_application::OnEmulatorResume, this, &gui_application::StartPlaytime); connect(this, &QGuiApplication::applicationStateChanged, this, &gui_application::OnAppStateChanged); - if (m_main_window) - { - connect(m_main_window, &main_window::RequestLanguageChange, this, &gui_application::LoadLanguage); - connect(m_main_window, &main_window::RequestGlobalStylesheetChange, this, &gui_application::OnChangeStyleSheetRequest); - connect(m_main_window, &main_window::NotifyEmuSettingsChange, this, [this](){ OnEmuSettingsChange(); }); - connect(m_main_window, &main_window::NotifyShortcutHandlers, this, &gui_application::OnShortcutChange); - - connect(this, &gui_application::OnEmulatorRun, m_main_window, &main_window::OnEmuRun); - connect(this, &gui_application::OnEmulatorStop, m_main_window, &main_window::OnEmuStop); - connect(this, &gui_application::OnEmulatorPause, m_main_window, &main_window::OnEmuPause); - connect(this, &gui_application::OnEmulatorResume, m_main_window, &main_window::OnEmuResume); - connect(this, &gui_application::OnEmulatorReady, m_main_window, &main_window::OnEmuReady); - connect(this, &gui_application::OnEnableDiscEject, m_main_window, &main_window::OnEnableDiscEject); - connect(this, &gui_application::OnEnableDiscInsert, m_main_window, &main_window::OnEnableDiscInsert); - - connect(QGuiApplication::styleHints(), &QStyleHints::colorSchemeChanged, this, [this](){ OnChangeStyleSheetRequest(); }); - } - #ifdef WITH_DISCORD_RPC connect(this, &gui_application::OnEmulatorRun, [this](bool /*start_playtime*/) { diff --git a/rpcs3/rpcs3qt/gui_settings.h b/rpcs3/rpcs3qt/gui_settings.h index 21a46259c2..bdc6401031 100644 --- a/rpcs3/rpcs3qt/gui_settings.h +++ b/rpcs3/rpcs3qt/gui_settings.h @@ -315,7 +315,7 @@ namespace gui const gui_save sc_shortcuts = gui_save(sc, "shortcuts", QVariantMap()); - const gui_save nav_enabled = gui_save(navigation, "pad_input_enabled", false); + const gui_save nav_enabled = gui_save(navigation, "pad_input_enabled", true); const gui_save nav_global = gui_save(navigation, "allow_global_pad_input", false); } From 2c2ec6e109f0314080e1e40fe65bdc1e4d9d915c Mon Sep 17 00:00:00 2001 From: Megamouse Date: Thu, 12 Mar 2026 18:08:14 +0100 Subject: [PATCH 106/295] VS: Add missing test files I'm having some gmock issues, so let's just exclude them for now. --- rpcs3/tests/rpcs3_test.vcxproj | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/rpcs3/tests/rpcs3_test.vcxproj b/rpcs3/tests/rpcs3_test.vcxproj index 263334d19e..fb9d0d21d4 100644 --- a/rpcs3/tests/rpcs3_test.vcxproj +++ b/rpcs3/tests/rpcs3_test.vcxproj @@ -85,8 +85,16 @@ + + + true + + + + true + From 8b74ea8757889eed03e3e11975e78ceb9b2a4faa Mon Sep 17 00:00:00 2001 From: Megamouse Date: Tue, 10 Mar 2026 20:20:12 +0100 Subject: [PATCH 107/295] Qt: Add steam shortcuts --- rpcs3/rpcs3.cpp | 2 +- rpcs3/rpcs3.vcxproj | 2 + rpcs3/rpcs3.vcxproj.filters | 6 + rpcs3/rpcs3qt/CMakeLists.txt | 1 + rpcs3/rpcs3qt/debugger_frame.cpp | 2 +- rpcs3/rpcs3qt/game_list_actions.cpp | 23 +- rpcs3/rpcs3qt/game_list_context_menu.cpp | 27 + rpcs3/rpcs3qt/main_window.cpp | 95 +-- rpcs3/rpcs3qt/main_window.h | 3 +- rpcs3/rpcs3qt/pkg_install_dialog.cpp | 12 + rpcs3/rpcs3qt/pkg_install_dialog.h | 2 + rpcs3/rpcs3qt/shortcut_utils.cpp | 125 +++- rpcs3/rpcs3qt/shortcut_utils.h | 1 + rpcs3/rpcs3qt/steam_utils.cpp | 807 +++++++++++++++++++++++ rpcs3/rpcs3qt/steam_utils.h | 104 +++ 15 files changed, 1136 insertions(+), 76 deletions(-) create mode 100644 rpcs3/rpcs3qt/steam_utils.cpp create mode 100644 rpcs3/rpcs3qt/steam_utils.h diff --git a/rpcs3/rpcs3.cpp b/rpcs3/rpcs3.cpp index 6c2130eca6..cb2058874e 100644 --- a/rpcs3/rpcs3.cpp +++ b/rpcs3/rpcs3.cpp @@ -131,7 +131,7 @@ std::set get_one_drive_paths() do { path_buffer.resize(path_buffer.size() + MAX_PATH); - DWORD buffer_size = static_cast(path_buffer.size() - 1); + DWORD buffer_size = static_cast((path_buffer.size() - 1) * sizeof(wchar_t)); status = RegQueryValueExW(hkey, L"UserFolder", NULL, &type, reinterpret_cast(path_buffer.data()), &buffer_size); } while (status == ERROR_MORE_DATA); diff --git a/rpcs3/rpcs3.vcxproj b/rpcs3/rpcs3.vcxproj index cd5d7c8bc4..5401efb323 100644 --- a/rpcs3/rpcs3.vcxproj +++ b/rpcs3/rpcs3.vcxproj @@ -891,6 +891,7 @@ + @@ -1719,6 +1720,7 @@ "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DMINIUPNP_STATICLIB -DHAVE_SDL3 -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\protobuf\protobuf\src" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I.\..\3rdparty\libsdl-org\SDL\include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" + $(QTDIR)\bin\moc.exe;%(FullPath) diff --git a/rpcs3/rpcs3.vcxproj.filters b/rpcs3/rpcs3.vcxproj.filters index 6c7841b4fc..d9ebc34ef6 100644 --- a/rpcs3/rpcs3.vcxproj.filters +++ b/rpcs3/rpcs3.vcxproj.filters @@ -1278,6 +1278,9 @@ Gui\settings + + Gui\utils + @@ -1523,6 +1526,9 @@ Gui\settings + + Gui\utils + diff --git a/rpcs3/rpcs3qt/CMakeLists.txt b/rpcs3/rpcs3qt/CMakeLists.txt index 6fe8d9db13..5c330c7ae4 100644 --- a/rpcs3/rpcs3qt/CMakeLists.txt +++ b/rpcs3/rpcs3qt/CMakeLists.txt @@ -104,6 +104,7 @@ add_library(rpcs3_ui STATIC shortcut_settings.cpp skylander_dialog.cpp sound_effect_manager_dialog.cpp + steam_utils.cpp syntax_highlighter.cpp system_cmd_dialog.cpp table_item_delegate.cpp diff --git a/rpcs3/rpcs3qt/debugger_frame.cpp b/rpcs3/rpcs3qt/debugger_frame.cpp index f1dd9cf892..0859e19856 100644 --- a/rpcs3/rpcs3qt/debugger_frame.cpp +++ b/rpcs3/rpcs3qt/debugger_frame.cpp @@ -1093,7 +1093,7 @@ void debugger_frame::UpdateUnitList() idm::select>(on_select, idm::unlocked); } - m_hw_ppu_idx = cpu_list.size() + 1; // Account for NoThreadString thread + m_hw_ppu_idx = ::size32(cpu_list) + 1; // Account for NoThreadString thread for (u32 i = 0; i < g_cfg.core.ppu_threads + 0u; i++) { diff --git a/rpcs3/rpcs3qt/game_list_actions.cpp b/rpcs3/rpcs3qt/game_list_actions.cpp index 5e3e305860..af295b5176 100644 --- a/rpcs3/rpcs3qt/game_list_actions.cpp +++ b/rpcs3/rpcs3qt/game_list_actions.cpp @@ -1496,13 +1496,6 @@ void game_list_actions::CreateShortcuts(const std::vector& games, con gameid_token_value = gameinfo->info.serial; } -#ifdef __linux__ - const std::string target_cli_args = gameinfo->info.path.starts_with(dev_flash) ? fmt::format("--no-gui \"%%%%RPCS3_VFS%%%%:dev_flash/%s\"", gameinfo->info.path.substr(dev_flash.size())) - : fmt::format("--no-gui \"%%%%RPCS3_GAMEID%%%%:%s\"", gameid_token_value); -#else - const std::string target_cli_args = gameinfo->info.path.starts_with(dev_flash) ? fmt::format("--no-gui \"%%RPCS3_VFS%%:dev_flash/%s\"", gameinfo->info.path.substr(dev_flash.size())) - : fmt::format("--no-gui \"%%RPCS3_GAMEID%%:%s\"", gameid_token_value); -#endif const std::string target_icon_dir = fmt::format("%sIcons/game_icons/%s/", fs::get_config_dir(), gameinfo->info.serial); if (!fs::create_path(target_icon_dir)) @@ -1512,7 +1505,11 @@ void game_list_actions::CreateShortcuts(const std::vector& games, con continue; } - for (const gui::utils::shortcut_location& location : locations) + const bool is_vsh = gameinfo->info.path.starts_with(dev_flash); + const std::string cli_arg_token = is_vsh ? "RPCS3_VFS" : "RPCS3_GAMEID"; + const std::string cli_arg_value = is_vsh ? ("dev_flash/" + gameinfo->info.path.substr(dev_flash.size())) : gameid_token_value; + + for (gui::utils::shortcut_location location : locations) { std::string destination; @@ -1524,6 +1521,9 @@ void game_list_actions::CreateShortcuts(const std::vector& games, con case gui::utils::shortcut_location::applications: destination = "application menu"; break; + case gui::utils::shortcut_location::steam: + destination = "Steam"; + break; #ifdef _WIN32 case gui::utils::shortcut_location::rpcs3_shortcuts: destination = "/games/shortcuts/"; @@ -1531,6 +1531,13 @@ void game_list_actions::CreateShortcuts(const std::vector& games, con #endif } +#ifdef __linux__ + const std::string percent = location == gui::utils::shortcut_location::steam ? "%" : "%%"; +#else + const std::string percent = "%"; +#endif + const std::string target_cli_args = fmt::format("--no-gui \"%s%s%s:%s\"", percent, cli_arg_token, percent, cli_arg_value); + if (!gameid_token_value.empty() && gui::utils::create_shortcut(gameinfo->info.name, gameinfo->icon_in_archive ? gameinfo->info.path : "", gameinfo->info.serial, target_cli_args, gameinfo->info.name, gameinfo->info.icon_path, target_icon_dir, location)) { game_list_log.success("Created %s shortcut for %s", destination, QString::fromStdString(gameinfo->info.name).simplified()); diff --git a/rpcs3/rpcs3qt/game_list_context_menu.cpp b/rpcs3/rpcs3qt/game_list_context_menu.cpp index 720aac8596..81f6f6e973 100644 --- a/rpcs3/rpcs3qt/game_list_context_menu.cpp +++ b/rpcs3/rpcs3qt/game_list_context_menu.cpp @@ -6,6 +6,7 @@ #include "input_dialog.h" #include "qt_utils.h" #include "shortcut_utils.h" +#include "steam_utils.h" #include "settings_dialog.h" #include "pad_settings_dialog.h" #include "patch_manager_dialog.h" @@ -273,6 +274,7 @@ void game_list_context_menu::show_single_selection_context_menu(const game_info& { m_game_list_actions->CreateShortcuts({gameinfo}, {gui::utils::shortcut_location::desktop}); }); + #ifdef _WIN32 QAction* create_start_menu_shortcut = manage_game_menu->addAction(tr("&Create Start Menu Shortcut")); #elif defined(__APPLE__) @@ -285,6 +287,17 @@ void game_list_context_menu::show_single_selection_context_menu(const game_info& m_game_list_actions->CreateShortcuts({gameinfo}, {gui::utils::shortcut_location::applications}); }); + if (gui::utils::steam_shortcut::steam_installed()) + { + const bool steam_running = gui::utils::steam_shortcut::is_steam_running(); + QAction* create_steam_shortcut = manage_game_menu->addAction(steam_running ? tr("&Create Steam Shortcut (Steam must be closed)") : tr("&Create Steam Shortcut")); + connect(create_steam_shortcut, &QAction::triggered, this, [this, gameinfo]() + { + m_game_list_actions->CreateShortcuts({gameinfo}, {gui::utils::shortcut_location::steam}); + }); + create_steam_shortcut->setEnabled(!steam_running); + } + manage_game_menu->addSeparator(); // Hide/rename game in game list @@ -843,6 +856,20 @@ void game_list_context_menu::show_multi_selection_context_menu(const std::vector m_game_list_actions->CreateShortcuts(games, {gui::utils::shortcut_location::applications}); }); + if (gui::utils::steam_shortcut::steam_installed()) + { + const bool steam_running = gui::utils::steam_shortcut::is_steam_running(); + QAction* create_steam_shortcut = manage_game_menu->addAction(steam_running ? tr("&Create Steam Shortcut (Steam must be closed)") : tr("&Create Steam Shortcut")); + connect(create_steam_shortcut, &QAction::triggered, this, [this, games]() + { + if (QMessageBox::question(m_game_list_frame, tr("Confirm Creation"), tr("Create Steam shortcut?")) != QMessageBox::Yes) + return; + + m_game_list_actions->CreateShortcuts(games, {gui::utils::shortcut_location::steam}); + }); + create_steam_shortcut->setEnabled(!steam_running); + } + manage_game_menu->addSeparator(); // Hide game in game list diff --git a/rpcs3/rpcs3qt/main_window.cpp b/rpcs3/rpcs3qt/main_window.cpp index 687358d625..1b77f8f2b1 100644 --- a/rpcs3/rpcs3qt/main_window.cpp +++ b/rpcs3/rpcs3qt/main_window.cpp @@ -35,9 +35,9 @@ #include "camera_settings_dialog.h" #include "ps_move_tracker_dialog.h" #include "ipc_settings_dialog.h" -#include "shortcut_utils.h" #include "config_checker.h" #include "shortcut_dialog.h" +#include "steam_utils.h" #include "system_cmd_dialog.h" #include "emulated_pad_settings_dialog.h" #include "emulated_logitech_g27_settings_dialog.h" @@ -935,9 +935,8 @@ bool main_window::HandlePackageInstallation(QStringList file_paths, bool from_bo } std::vector packages; + std::set shortcut_locations; bool precompile_caches = false; - bool create_desktop_shortcuts = false; - bool create_app_shortcut = false; bool canceled = false; game_compatibility* compat = m_game_list_frame ? m_game_list_frame->GetGameCompatibility() : nullptr; @@ -954,8 +953,15 @@ bool main_window::HandlePackageInstallation(QStringList file_paths, bool from_bo packages = dlg.get_paths_to_install(); precompile_caches = dlg.precompile_caches(); - create_desktop_shortcuts = dlg.create_desktop_shortcuts(); - create_app_shortcut = dlg.create_app_shortcut(); + + if (dlg.create_desktop_shortcuts()) + shortcut_locations.insert(gui::utils::shortcut_location::desktop); + + if (dlg.create_app_shortcut()) + shortcut_locations.insert(gui::utils::shortcut_location::applications); + + if (dlg.create_steam_shortcut()) + shortcut_locations.insert(gui::utils::shortcut_location::steam); }); dlg.exec(); @@ -1136,7 +1142,7 @@ bool main_window::HandlePackageInstallation(QStringList file_paths, bool from_bo if (!bootable_paths_installed.empty()) { - m_game_list_frame->AddRefreshedSlot([this, create_desktop_shortcuts, precompile_caches, create_app_shortcut, paths = std::move(bootable_paths_installed)](std::set& claimed_paths) mutable + m_game_list_frame->AddRefreshedSlot([this, shortcut_locations, precompile_caches, paths = std::move(bootable_paths_installed)](std::set& claimed_paths) mutable { // Try to claim operations on ID for (auto it = paths.begin(); it != paths.end();) @@ -1154,7 +1160,7 @@ bool main_window::HandlePackageInstallation(QStringList file_paths, bool from_bo } } - CreateShortCuts(paths, create_desktop_shortcuts, create_app_shortcut); + CreateShortCuts(paths, shortcut_locations); if (precompile_caches) { @@ -2370,6 +2376,7 @@ void main_window::ShowOptionalGamePreparations(const QString& title, const QStri #else QCheckBox* quick_check = new QCheckBox(tr("Add launcher shortcut(s)")); #endif + QLabel* label = new QLabel(tr("%1\nWould you like to precompile caches and install shortcuts to the installed software? (%2 new software detected)\n\n").arg(message).arg(bootable_paths.size()), dlg); vlayout->addWidget(label); @@ -2381,6 +2388,17 @@ void main_window::ShowOptionalGamePreparations(const QString& title, const QStri vlayout->addWidget(quick_check); vlayout->addStretch(3); + QCheckBox* steam_check = nullptr; + if (gui::utils::steam_shortcut::steam_installed()) + { + const bool steam_running = gui::utils::steam_shortcut::is_steam_running(); + steam_check = new QCheckBox(steam_running ? tr("Add Steam Shortcut(s) (Steam must be closed)") : tr("Add Steam shortcut(s)")); + steam_check->setEnabled(!steam_running); + + vlayout->addWidget(steam_check); + vlayout->addStretch(3); + } + QDialogButtonBox* btn_box = new QDialogButtonBox(QDialogButtonBox::Ok); vlayout->addWidget(btn_box); @@ -2389,13 +2407,22 @@ void main_window::ShowOptionalGamePreparations(const QString& title, const QStri connect(btn_box, &QDialogButtonBox::accepted, this, [=, this, paths = std::move(bootable_paths)]() { const bool precompile_caches = precompile_check->isChecked(); - const bool create_desktop_shortcuts = desk_check->isChecked(); - const bool create_app_shortcut = quick_check->isChecked(); + + std::set shortcut_locations; + + if (desk_check->isChecked()) + shortcut_locations.insert(gui::utils::shortcut_location::desktop); + + if (quick_check->isChecked()) + shortcut_locations.insert(gui::utils::shortcut_location::applications); + + if (steam_check && steam_check->isChecked()) + shortcut_locations.insert(gui::utils::shortcut_location::steam); dlg->hide(); dlg->accept(); - CreateShortCuts(paths, create_desktop_shortcuts, create_app_shortcut); + CreateShortCuts(paths, shortcut_locations); if (precompile_caches) { @@ -2407,52 +2434,40 @@ void main_window::ShowOptionalGamePreparations(const QString& title, const QStri dlg->open(); } -void main_window::CreateShortCuts(const std::map& paths, bool create_desktop_shortcuts, bool create_app_shortcut) +void main_window::CreateShortCuts(const std::map& paths, std::set locations) { if (paths.empty()) return; - std::set locations; - #ifdef _WIN32 locations.insert(gui::utils::shortcut_location::rpcs3_shortcuts); +#else + if (locations.empty()) + { + return; + } #endif - if (create_desktop_shortcuts) - { - locations.insert(gui::utils::shortcut_location::desktop); - } - if (create_app_shortcut) - { - locations.insert(gui::utils::shortcut_location::applications); - } + std::vector game_data_shortcuts; - if (!locations.empty()) + for (const auto& [boot_path, title_id] : paths) { - std::vector game_data_shortcuts; - - for (const auto& [boot_path, title_id] : paths) + for (const game_info& gameinfo : m_game_list_frame->GetGameInfo()) { - for (const game_info& gameinfo : m_game_list_frame->GetGameInfo()) + if (gameinfo && gameinfo->info.serial == title_id.toStdString()) { - if (gameinfo && gameinfo->info.serial == title_id.toStdString()) + if (Emu.IsPathInsideDir(boot_path, gameinfo->info.path)) { - if (Emu.IsPathInsideDir(boot_path, gameinfo->info.path)) - { - if (!locations.empty()) - { - game_data_shortcuts.push_back(gameinfo); - } - } - - break; + game_data_shortcuts.push_back(gameinfo); } + + break; } } + } - if (!game_data_shortcuts.empty() && !locations.empty()) - { - m_game_list_frame->actions()->CreateShortcuts(game_data_shortcuts, locations); - } + if (!game_data_shortcuts.empty()) + { + m_game_list_frame->actions()->CreateShortcuts(game_data_shortcuts, locations); } } diff --git a/rpcs3/rpcs3qt/main_window.h b/rpcs3/rpcs3qt/main_window.h index 588c6e6918..7f0bb8e2ea 100644 --- a/rpcs3/rpcs3qt/main_window.h +++ b/rpcs3/rpcs3qt/main_window.h @@ -10,6 +10,7 @@ #include "update_manager.h" #include "settings.h" #include "shortcut_handler.h" +#include "shortcut_utils.h" #include "Emu/config_mode.h" #include "Emu/System.h" @@ -145,7 +146,7 @@ private: static bool InstallFileInExData(const std::string& extension, const QString& path, const std::string& filename); bool HandlePackageInstallation(QStringList file_paths, bool from_boot); - void CreateShortCuts(const std::map& paths, bool create_desktop_shortcuts, bool create_app_shortcut); + void CreateShortCuts(const std::map& paths, std::set locations); void HandlePupInstallation(const QString& file_path, const QString& dir_path = ""); void ExtractPup(); diff --git a/rpcs3/rpcs3qt/pkg_install_dialog.cpp b/rpcs3/rpcs3qt/pkg_install_dialog.cpp index 9b0f926484..3d4193d4e5 100644 --- a/rpcs3/rpcs3qt/pkg_install_dialog.cpp +++ b/rpcs3/rpcs3qt/pkg_install_dialog.cpp @@ -3,6 +3,7 @@ #include "numbered_widget_item.h" #include "richtext_item_delegate.h" #include "qt_utils.h" +#include "steam_utils.h" #include "Emu/system_utils.hpp" #include "Utilities/File.h" @@ -194,6 +195,17 @@ pkg_install_dialog::pkg_install_dialog(const QStringList& paths, game_compatibil vbox->addWidget(precompile_check); vbox->addWidget(desk_check); vbox->addWidget(quick_check); + + if (gui::utils::steam_shortcut::steam_installed()) + { + const bool steam_running = gui::utils::steam_shortcut::is_steam_running(); + QCheckBox* steam_check = new QCheckBox(steam_running ? tr("Add Steam Shortcut(s) (Steam must be closed)") : tr("Add Steam shortcut(s)")); + connect(steam_check, &QCheckBox::checkStateChanged, this, [this](Qt::CheckState state){ m_create_steam_shortcut = state != Qt::CheckState::Unchecked; }); + steam_check->setEnabled(!steam_running); + + vbox->addWidget(steam_check); + } + vbox->addWidget(installation_info); vbox->addWidget(buttons); diff --git a/rpcs3/rpcs3qt/pkg_install_dialog.h b/rpcs3/rpcs3qt/pkg_install_dialog.h index f1a623009d..b1f3dbeb9d 100644 --- a/rpcs3/rpcs3qt/pkg_install_dialog.h +++ b/rpcs3/rpcs3qt/pkg_install_dialog.h @@ -22,6 +22,7 @@ public: bool precompile_caches() const { return m_precompile_caches; } bool create_desktop_shortcuts() const { return m_create_desktop_shortcuts; } bool create_app_shortcut() const { return m_create_app_shortcut; } + bool create_steam_shortcut() const { return m_create_steam_shortcut; } private: void update_info(QLabel* installation_info, QDialogButtonBox* buttons) const; @@ -31,4 +32,5 @@ private: bool m_precompile_caches = false; bool m_create_desktop_shortcuts = false; bool m_create_app_shortcut = false; + bool m_create_steam_shortcut = false; }; diff --git a/rpcs3/rpcs3qt/shortcut_utils.cpp b/rpcs3/rpcs3qt/shortcut_utils.cpp index 2bc2bfc578..8194bd184b 100644 --- a/rpcs3/rpcs3qt/shortcut_utils.cpp +++ b/rpcs3/rpcs3qt/shortcut_utils.cpp @@ -1,5 +1,6 @@ #include "stdafx.h" #include "shortcut_utils.h" +#include "steam_utils.h" #include "qt_utils.h" #include "Emu/VFS.h" #include "Utilities/File.h" @@ -30,6 +31,25 @@ LOG_CHANNEL(sys_log, "SYS"); +template <> +void fmt_class_string::format(std::string& out, u64 arg) +{ + format_enum(out, arg, [](gui::utils::shortcut_location value) + { + switch (value) + { + case gui::utils::shortcut_location::desktop: return "desktop"; + case gui::utils::shortcut_location::applications: return "applications"; + case gui::utils::shortcut_location::steam: return "steam"; +#ifdef _WIN32 + case gui::utils::shortcut_location::rpcs3_shortcuts: return "rpcs3"; +#endif + } + + return unknown; + }); +} + namespace gui::utils { #ifdef _WIN32 @@ -109,6 +129,7 @@ namespace gui::utils } std::string link_path; + bool append_rpcs3 = false; switch (location) { @@ -117,6 +138,13 @@ namespace gui::utils break; case shortcut_location::applications: link_path = QStandardPaths::writableLocation(QStandardPaths::StandardLocation::ApplicationsLocation).toStdString(); + append_rpcs3 = true; + break; + case shortcut_location::steam: +#ifdef __APPLE__ + link_path = QStandardPaths::writableLocation(QStandardPaths::StandardLocation::ApplicationsLocation).toStdString(); + append_rpcs3 = true; +#endif break; #ifdef _WIN32 case shortcut_location::rpcs3_shortcuts: @@ -126,13 +154,13 @@ namespace gui::utils #endif } - if (!fs::is_dir(link_path) && !fs::create_dir(link_path)) + if (!link_path.empty() && !fs::is_dir(link_path) && !fs::create_dir(link_path)) { sys_log.error("Failed to create shortcut. Folder does not exist: %s", link_path); return false; } - if (location == shortcut_location::applications) + if (append_rpcs3) { link_path += "/RPCS3"; @@ -144,6 +172,29 @@ namespace gui::utils } #ifdef _WIN32 + const std::string working_dir{fs::get_executable_dir()}; + const std::string rpcs3_path{fs::get_executable_path()}; + std::string target_icon_path; + + if (!src_icon_path.empty() && !target_icon_dir.empty()) + { + if (!create_square_shortcut_icon_file(path, src_icon_path, target_icon_dir, target_icon_path, 512)) + { + sys_log.error("Failed to create shortcut: .ico creation failed"); + return false; + } + } + + if (location == shortcut_location::steam) + { + sys_log.notice("Creating %s shortcut with arguments '%s' and icon path '%s'", location, target_cli_args, target_icon_path); + steam_shortcut steam_sc{}; + steam_sc.add_shortcut(simple_name, rpcs3_path, working_dir, target_cli_args, target_icon_path); + return steam_sc.write_file(); + } + + sys_log.notice("Creating %s shortcut '%s' with arguments '%s' and .ico dir '%s'", location, link_path, target_cli_args, target_icon_dir); + const auto str_error = [](HRESULT hr) -> std::string { _com_error err(hr); @@ -153,8 +204,6 @@ namespace gui::utils fmt::append(link_path, "/%s.lnk", simple_name); - sys_log.notice("Creating shortcut '%s' with arguments '%s' and .ico dir '%s'", link_path, target_cli_args, target_icon_dir); - // https://stackoverflow.com/questions/3906974/how-to-programmatically-create-a-shortcut-using-win32 HRESULT res = CoInitialize(NULL); if (FAILED(res)) @@ -177,9 +226,6 @@ namespace gui::utils if (FAILED(res)) return cleanup(false, "CoCreateInstance failed"); - const std::string working_dir{ fs::get_executable_dir() }; - const std::string rpcs3_path{ working_dir + "rpcs3.exe" }; - const std::wstring w_target_file = utf8_to_wchar(rpcs3_path); res = pShellLink->SetPath(w_target_file.c_str()); if (FAILED(res)) @@ -206,12 +252,8 @@ namespace gui::utils return cleanup(false, fmt::format("SetDescription failed (%s)", str_error(res))); } - if (!src_icon_path.empty() && !target_icon_dir.empty()) + if (!target_icon_path.empty()) { - std::string target_icon_path; - if (!create_square_shortcut_icon_file(path, src_icon_path, target_icon_dir, target_icon_path, 512)) - return cleanup(false, ".ico creation failed"); - const std::wstring w_icon_path = utf8_to_wchar(target_icon_path); res = pShellLink->SetIconLocation(w_icon_path.c_str(), 0); if (FAILED(res)) @@ -241,9 +283,10 @@ namespace gui::utils return cleanup(true, {}); #elif defined(__APPLE__) + fmt::append(link_path, "/%s.app", simple_name); - sys_log.notice("Creating shortcut '%s' with arguments '%s'", link_path, target_cli_args); + sys_log.notice("Creating %s shortcut '%s' with arguments '%s'", location, link_path, target_cli_args); const std::string contents_dir = link_path + "/Contents/"; const std::string macos_dir = contents_dir + "MacOS/"; @@ -320,9 +363,10 @@ namespace gui::utils } plist_file.close(); + std::string target_icon_path; if (!src_icon_path.empty()) { - std::string target_icon_path = resources_dir; + target_icon_path = resources_dir; if (!create_square_shortcut_icon_file(path, src_icon_path, resources_dir, target_icon_path, 512)) { // Error is logged in create_square_shortcut_icon_file @@ -330,10 +374,16 @@ namespace gui::utils } } + if (location == shortcut_location::steam) + { + steam_shortcut steam_sc{}; + steam_sc.add_shortcut(simple_name, launcher_path, macos_dir, ""/*target_cli_args are already in the launcher*/, target_icon_path); + return steam_sc.write_file(); + } + return true; #else - const std::string exe_path = fs::get_executable_path(); if (exe_path.empty()) { @@ -341,9 +391,28 @@ namespace gui::utils return false; } + std::string target_icon_path; + if (!src_icon_path.empty() && !target_icon_dir.empty()) + { + if (!create_square_shortcut_icon_file(path, src_icon_path, target_icon_dir, target_icon_path, 512)) + { + // Error is logged in create_square_shortcut_icon_file + return false; + } + } + + if (location == shortcut_location::steam) + { + sys_log.notice("Creating %s shortcut with arguments '%s' and icon path '%s'", location, target_cli_args, target_icon_path); + const std::string working_dir{fs::get_executable_dir()}; + steam_shortcut steam_sc{}; + steam_sc.add_shortcut(simple_name, exe_path, working_dir, target_cli_args, target_icon_path); + return steam_sc.write_file(); + } + fmt::append(link_path, "/%s.desktop", simple_name); - sys_log.notice("Creating shortcut '%s' for '%s' with arguments '%s'", link_path, exe_path, target_cli_args); + sys_log.notice("Creating %s shortcut '%s' for '%s' with arguments '%s'", location, link_path, exe_path, target_cli_args); std::string file_content; fmt::append(file_content, "[Desktop Entry]\n"); @@ -360,15 +429,8 @@ namespace gui::utils fmt::append(file_content, "Comment=%s\n", QString::fromStdString(description).simplified()); } - if (!src_icon_path.empty() && !target_icon_dir.empty()) + if (!target_icon_path.empty()) { - std::string target_icon_path; - if (!create_square_shortcut_icon_file(path, src_icon_path, target_icon_dir, target_icon_path, 512)) - { - // Error is logged in create_square_shortcut_icon_file - return false; - } - fmt::append(file_content, "Icon=%s\n", target_icon_path); } @@ -438,7 +500,8 @@ namespace gui::utils std::vector locations = { shortcut_location::desktop, - shortcut_location::applications + shortcut_location::applications, + shortcut_location::steam, }; #ifdef _WIN32 locations.push_back(shortcut_location::rpcs3_shortcuts); @@ -457,6 +520,18 @@ namespace gui::utils link_path = QStandardPaths::writableLocation(QStandardPaths::StandardLocation::ApplicationsLocation).toStdString(); link_path += "/RPCS3"; break; + case shortcut_location::steam: + { + const std::string exe_path = fs::get_executable_path(); + const std::string working_dir = fs::get_executable_dir(); + steam_shortcut steam_sc{}; + steam_sc.remove_shortcut(simple_name, exe_path, working_dir); + if (!steam_sc.write_file()) + { + sys_log.error("Failed to remove steam shortcut for '%s'", simple_name); + } + continue; + } #ifdef _WIN32 case shortcut_location::rpcs3_shortcuts: link_path = rpcs3::utils::get_games_shortcuts_dir(); diff --git a/rpcs3/rpcs3qt/shortcut_utils.h b/rpcs3/rpcs3qt/shortcut_utils.h index 4e7fcdf0ce..2b5d302710 100644 --- a/rpcs3/rpcs3qt/shortcut_utils.h +++ b/rpcs3/rpcs3qt/shortcut_utils.h @@ -6,6 +6,7 @@ namespace gui::utils { desktop, applications, + steam, #ifdef _WIN32 rpcs3_shortcuts, #endif diff --git a/rpcs3/rpcs3qt/steam_utils.cpp b/rpcs3/rpcs3qt/steam_utils.cpp new file mode 100644 index 0000000000..24ceec273e --- /dev/null +++ b/rpcs3/rpcs3qt/steam_utils.cpp @@ -0,0 +1,807 @@ +#include "stdafx.h" +#include "steam_utils.h" + +#include + +#ifdef _WIN32 +#include +#include +#else +#include +#include +#endif + +LOG_CHANNEL(sys_log, "SYS"); + +namespace gui::utils +{ + void steam_shortcut::add_shortcut( + const std::string& app_name, + const std::string& exe, + const std::string& start_dir, + const std::string& launch_options, + const std::string& icon_path) + { + shortcut_entry entry{}; + entry.app_name = app_name; + entry.exe = quote(fix_slashes(exe), true); + entry.start_dir = quote(fix_slashes(start_dir), false); + entry.launch_options = launch_options; + entry.icon = quote(fix_slashes(icon_path), false); + entry.appid = steam_appid(exe, app_name); + + m_entries_to_add.push_back(std::move(entry)); + } + + void steam_shortcut::remove_shortcut( + const std::string& app_name, + const std::string& exe, + const std::string& start_dir) + { + shortcut_entry entry{}; + entry.app_name = app_name; + entry.exe = quote(fix_slashes(exe), true); + entry.start_dir = quote(fix_slashes(start_dir), false); + entry.appid = steam_appid(exe, app_name); + + m_entries_to_remove.push_back(std::move(entry)); + } + + bool steam_shortcut::parse_file(const std::string& path) + { + m_vdf_entries.clear(); + + fs::file vdf(path); + if (!vdf) + { + sys_log.error("Failed to parse steam shortcut file '%s': %s", path, fs::g_tls_error); + return false; + } + + const std::vector data = vdf.to_vector(); + usz last_pos = 0; + usz pos = 0; + + const auto read_type_id = [&]() -> u8 + { + if (pos >= data.size()) + { + sys_log.error("Failed to parse steam shortcut file '%s' at pos 0x%x: read_type_id: end of file", path, pos); + return umax; + } + + last_pos = pos; + return data[pos++]; + }; + + const auto read_u32 = [&]() -> std::optional + { + if ((pos + sizeof(u32)) > data.size()) + { + sys_log.error("Failed to parse steam shortcut file '%s' at pos 0x%x: read_u32: end of file", path, pos); + return {}; + } + + last_pos = pos; + + u32 v {}; + std::memcpy(&v, &data[pos], sizeof(u32)); + pos += sizeof(u32); + return v; + }; + + const auto read_string = [&]() -> std::optional + { + if (pos >= data.size()) + { + sys_log.error("Failed to parse steam shortcut file '%s' at pos 0x%x: read_string: end of file", path, pos); + return {}; + } + + last_pos = pos; + + std::string str; + + while (pos < data.size()) + { + const u8 c = data[pos++]; + if (!c) break; + str += c; + } + + if (pos >= data.size()) + { + sys_log.error("Failed to parse steam shortcut file '%s' at pos 0x%x: read_string: not null terminated", path, last_pos); + return {}; + } + + return str; + }; + + #define CHECK_VDF(cond, msg) \ + if (!(cond)) \ + { \ + sys_log.error("Failed to parse steam shortcut file '%s' at pos 0x%x: %s", path, last_pos, msg); \ + return false; \ + } + + #define READ_VDF_STRING(name) \ + const std::optional name##_opt = read_string(); \ + if (!name##_opt.has_value()) return false; \ + std::string name = name##_opt.value(); + + #define READ_VDF_U32(name) \ + const std::optional name##_opt = read_u32(); \ + if (!name##_opt.has_value()) return false; \ + const u32 name = name##_opt.value(); + + CHECK_VDF(read_type_id() == type_id::Start, "expected type_id::Start for shortcuts"); + READ_VDF_STRING(shortcuts); + CHECK_VDF(shortcuts == "shortcuts", "expected 'shortcuts' key"); + + for (usz index = 0; true; index++) + { + vdf_shortcut_entry entry {}; + + u8 type = read_type_id(); + if (type == type_id::End) + { + // End of shortcuts + break; + } + + CHECK_VDF(type == type_id::Start, "expected type_id::Start for entry"); + + READ_VDF_STRING(entry_index_str); + u64 entry_index = 0; + CHECK_VDF(try_to_uint64(&entry_index, entry_index_str, 0, umax), "failed to convert entry index"); + CHECK_VDF(entry_index == index, "unexpected entry index"); + + type = umax; + while (type != type_id::Start) + { + type = read_type_id(); + + switch (type) + { + case type_id::String: + { + READ_VDF_STRING(key); + READ_VDF_STRING(value); + CHECK_VDF(!key.empty(), "key is empty"); + entry.values.push_back({std::move(key), std::move(value)}); + break; + } + case type_id::Integer: + { + READ_VDF_STRING(key); + READ_VDF_U32(value); + CHECK_VDF(!key.empty(), "key is empty"); + entry.values.push_back({std::move(key), value}); + break; + } + case type_id::Start: + // Expect tags next + break; + default: + sys_log.error("Failed to parse steam shortcut file '%s' at pos 0x%x: unexpected type id 0x%x", path, last_pos, type); + return false; + } + } + + CHECK_VDF(type == type_id::Start, "expected type_id::Start for tags"); + READ_VDF_STRING(tags); + CHECK_VDF(tags == "tags", "key is empty"); + type = umax; + while (type != type_id::End) + { + type = read_type_id(); + + switch (type) + { + case type_id::String: + { + READ_VDF_STRING(key); + READ_VDF_STRING(value); + CHECK_VDF(!key.empty(), "key is empty"); + entry.tags.push_back({std::move(key), std::move(value)}); + break; + } + case type_id::End: + break; + default: + sys_log.error("Failed to parse steam shortcut file '%s' at pos 0x%x: unexpected type id 0x%x", path, last_pos, type); + return false; + } + } + CHECK_VDF(type == type_id::End, "expected type_id::End for tags"); + + CHECK_VDF(read_type_id() == type_id::End, "expected type_id::End for entry"); + + m_vdf_entries.push_back(std::move(entry)); + } + + CHECK_VDF(read_type_id() == type_id::End, "expected type_id::End for end of file"); + CHECK_VDF(pos == data.size(), fmt::format("bytes found at end of file (pos=%d, size=%d)", pos, data.size())); + + #undef CHECK_VDF_OPT + #undef CHECK_VDF + return true; + } + + bool steam_shortcut::write_file() + { + if (m_entries_to_add.empty() && m_entries_to_remove.empty()) + { + sys_log.error("Failed to create steam shortcut: No entries."); + return false; + } + + const std::string steam_path = get_steam_path(); + if (steam_path.empty()) + { + sys_log.error("Failed to create steam shortcut: Steam directory not found."); + return false; + } + + if (!fs::is_dir(steam_path)) + { + sys_log.error("Failed to create steam shortcut: '%s' not a directory.", steam_path); + return false; + } + + const std::string user_id = get_last_active_steam_user(steam_path); + if (user_id.empty()) + { + sys_log.error("Failed to create steam shortcut: last active user not found."); + return false; + } + + const std::string user_dir = steam_path + "/userdata/" + user_id + "/config/"; + if (!fs::is_dir(user_dir)) + { + sys_log.error("Failed to create steam shortcut: '%s' not a directory.", user_dir); + return false; + } + + if (is_steam_running()) + { + sys_log.error("Failed to create steam shortcut: steam is running."); + return false; + } + + const std::string file_path = user_dir + "shortcuts.vdf"; + const std::string backup_path = fs::get_config_dir() + "/shortcuts.vdf.backup"; + + if (fs::is_file(file_path)) + { + if (!fs::copy_file(file_path, backup_path, true)) + { + sys_log.error("Failed to backup steam shortcut file '%s'", file_path); + return false; + } + + if (!parse_file(file_path)) + { + sys_log.error("Failed to parse steam shortcut file '%s'", file_path); + return false; + } + } + + std::vector removed_entries; + + for (const shortcut_entry& entry : m_entries_to_remove) + { + bool removed_entry = false; + for (auto it = m_vdf_entries.begin(); it != m_vdf_entries.end();) + { + const auto appid = it->value("appid"); + const auto exe = it->value("Exe"); + const auto start_dir = it->value("StartDir"); + + if (appid.has_value() && appid.value() == entry.appid && + exe.has_value() && exe.value() == entry.exe && + start_dir.has_value() && start_dir.value() == entry.start_dir) + { + sys_log.notice("Removing steam shortcut for '%s'", entry.app_name); + it = m_vdf_entries.erase(it); + removed_entry = true; + } + else + { + it++; + } + } + + if (removed_entry) + { + removed_entries.push_back(entry); + } + + if (m_vdf_entries.empty()) + { + break; + } + } + + for (const vdf_shortcut_entry& entry : m_vdf_entries) + { + for (auto it = m_entries_to_add.begin(); it != m_entries_to_add.end();) + { + const auto appid = entry.value("appid"); + const auto exe = entry.value("Exe"); + const auto start_dir = entry.value("StartDir"); + const auto launch_options = entry.value("LaunchOptions"); + const auto icon = entry.value("icon"); + + if (appid.has_value() && appid.value() == it->appid && + exe.has_value() && exe.value() == it->exe && + start_dir.has_value() && start_dir.value() == it->start_dir && + launch_options.has_value() && launch_options.value() == it->launch_options && + icon.has_value() && icon.value() == it->icon) + { + sys_log.notice("Entry '%s' already exists in steam shortcut file '%s'.", it->app_name, file_path); + it = m_entries_to_add.erase(it); + } + else + { + it++; + } + } + + if (m_entries_to_add.empty()) + { + break; + } + } + + if (m_entries_to_add.empty() && removed_entries.empty()) + { + sys_log.notice("No matching entries found in steam shortcut file '%s'.", file_path); + return true; + } + + usz index = 0; + std::string content; + + content += type_id::Start; + append(content, "shortcuts"); + for (const vdf_shortcut_entry& entry : m_vdf_entries) + { + const auto val = entry.build_binary_blob(index++); + if (!val.has_value()) + { + sys_log.error("Failed to create steam shortcut '%s': '%s'", file_path, val.error()); + return false; + } + content += val.value(); + } + for (const shortcut_entry& entry : m_entries_to_add) + { + content += entry.build_binary_blob(index++); + } + content += type_id::End; + content += type_id::End; // End of file + + if (!fs::write_file(file_path, fs::rewrite, content)) + { + sys_log.error("Failed to create steam shortcut '%s': '%s'", file_path, fs::g_tls_error); + + if (!fs::copy_file(backup_path, file_path, true)) + { + sys_log.error("Failed to restore steam shortcuts backup: '%s'", fs::g_tls_error); + } + + return false; + } + + for (const shortcut_entry& entry : m_entries_to_add) + { + sys_log.success("Created steam shortcut for '%s'", entry.app_name); + } + for (const shortcut_entry& entry : removed_entries) + { + sys_log.success("Removed steam shortcut(s) for '%s'", entry.app_name); + } + return true; + } + + u32 steam_shortcut::crc32(const std::string& data) + { + u32 crc = 0xFFFFFFFF; + + for (u8 c : data) + { + crc ^= c; + + for (int i = 0; i < 8; i++) + { + crc = (crc >> 1) ^ (0xEDB88320 & -static_cast(crc & 1)); + } + } + + return ~crc; + } + + bool steam_shortcut::steam_installed() + { + const std::string path = get_steam_path(); + return !path.empty() && fs::is_dir(path); + } + + u32 steam_shortcut::steam_appid(const std::string& exe, const std::string& name) + { + return crc32(exe + name) | 0x80000000; + } + + void steam_shortcut::append(std::string& s, const std::string& val) + { + s += val; + s += '\0'; // append null terminator + } + + std::string steam_shortcut::quote(const std::string& s, bool force) + { + if (force || s.contains(" ")) + { + return "\"" + s + "\""; + } + + return s; + } + + std::string steam_shortcut::fix_slashes(const std::string& s) + { +#ifdef _WIN32 + return fmt::replace_all(s, "/", "\\"); +#else + return s; +#endif + } + + std::string steam_shortcut::kv_string(const std::string& key, const std::string& value) + { + std::string ret; + ret += type_id::String; + append(ret, key); + append(ret, value); + return ret; + } + + std::string steam_shortcut::kv_int(const std::string& key, u32 value) + { + std::string str; + str.reserve(64); + str += type_id::Integer; + append(str, key); + str += static_cast(value & 0xFF); + str += static_cast((value >> 8) & 0xFF); + str += static_cast((value >> 16) & 0xFF); + str += static_cast((value >> 24) & 0xFF); + return str; + } + + std::string steam_shortcut::shortcut_entry::build_binary_blob(usz index) const + { + std::string str; + str.reserve(1024); + str += type_id::Start; + + append(str, std::to_string(index)); + + str += kv_int("appid", appid); + str += kv_string("AppName", app_name); + str += kv_string("Exe", exe); + str += kv_string("StartDir", start_dir); + str += kv_string("icon", icon); + str += kv_string("ShortcutPath", ""); + str += kv_string("LaunchOptions", launch_options); + str += kv_int("IsHidden", 0); + str += kv_int("AllowDesktopConfig", 1); + str += kv_int("AllowOverlay", 1); + str += kv_int("OpenVR", 0); + str += kv_int("Devkit", 0); + str += kv_string("DevkitGameID", ""); + str += kv_int("DevkitOverrideAppID", 0); + str += kv_int("LastPlayTime", 0); + str += kv_string("FlatpakAppID", ""); + str += kv_string("sortas", ""); + + str += type_id::Start; + append(str, "tags"); + str += type_id::End; + + str += type_id::End; + return str; + } + + std::expected steam_shortcut::vdf_shortcut_entry::build_binary_blob(usz index) const + { + std::string str; + str.reserve(1024); + str += type_id::Start; + + append(str, std::to_string(index)); + + std::optional error = std::nullopt; + for (const auto& [key, value] : values) + { + std::visit([&key, &str, &error](const auto& value) + { + using T = std::decay_t; + + if constexpr (std::is_same_v) + { + str += kv_string(key, value); + } + else if constexpr (std::is_same_v) + { + str += kv_int(key, value); + } + else + { + error = fmt::format("vdf entry for key '%s' has unexpected type '%s'", key, typeid(value).name()); + } + }, + value); + + if (error.has_value()) + { + return std::unexpected(error.value()); + } + } + + str += type_id::Start; + append(str, "tags"); + for (const auto& [key, value] : tags) + { + str += kv_string(key, value); + } + str += type_id::End; + + str += type_id::End; + return str; + } + +#ifdef _WIN32 + std::string get_registry_string(const wchar_t* key, const wchar_t* name) + { + HKEY hkey = NULL; + LSTATUS status = RegOpenKeyW(HKEY_CURRENT_USER, key, &hkey); + if (status != ERROR_SUCCESS) + { + sys_log.trace("get_registry_string: RegOpenKeyW failed: %s (key='%s', name='%s')", fmt::win_error{static_cast(status), nullptr}, wchar_to_utf8(key), wchar_to_utf8(name)); + return ""; + } + + std::wstring path_buffer; + DWORD type = 0U; + do + { + path_buffer.resize(path_buffer.size() + MAX_PATH); + DWORD buffer_size = static_cast((path_buffer.size() - 1) * sizeof(wchar_t)); + status = RegQueryValueExW(hkey, name, NULL, &type, reinterpret_cast(path_buffer.data()), &buffer_size); + } + while (status == ERROR_MORE_DATA); + + const LSTATUS close_status = RegCloseKey(hkey); + if (close_status != ERROR_SUCCESS) + { + sys_log.error("get_registry_string: RegCloseKey failed: %s (key='%s', name='%s')", fmt::win_error{static_cast(close_status), nullptr}, wchar_to_utf8(key), wchar_to_utf8(name)); + } + + if (status != ERROR_SUCCESS) + { + sys_log.trace("get_registry_string: RegQueryValueExW failed: %s (key='%s', name='%s')", fmt::win_error{static_cast(status), nullptr}, wchar_to_utf8(key), wchar_to_utf8(name)); + return ""; + } + + if ((type == REG_SZ) || (type == REG_EXPAND_SZ) || (type == REG_MULTI_SZ)) + { + return wchar_to_utf8(path_buffer.data()); + } + + return ""; + } +#endif + + std::string steam_shortcut::steamid64_to_32(const std::string& steam_id) + { + u64 id = 0; + if (!try_to_uint64(&id, steam_id, 0, umax)) + { + sys_log.error("Failed to convert steam id '%s' to u64", steam_id); + return ""; + } + constexpr u64 base = 76561197960265728ULL; + const u32 id32 = static_cast(id - base); + return std::to_string(id32); + } + + std::string steam_shortcut::get_steam_path() + { +#ifdef _WIN32 + const std::string path = get_registry_string(L"Software\\Valve\\Steam", L"SteamPath"); + if (path.empty()) + { + sys_log.notice("get_steam_path: SteamPath not found in registry"); + return ""; + } + + // The path might be lowercase... sigh + std::error_code ec; + const std::filesystem::path canonical_path = std::filesystem::canonical(std::filesystem::path(path), ec); + if (ec) + { + sys_log.error("get_steam_path: Failed to canonicalize path '%s': %s", path, ec.message()); + return ""; + } + + const std::string path_fixed = canonical_path.string(); + sys_log.notice("get_steam_path: Found steam registry path: '%s'", path_fixed); + return path_fixed; +#else + if (const char* home = ::getenv("HOME")) + { +#if __APPLE__ + const std::string path = std::string(home) + "/Library/Application Support/Steam/"; +#else + const std::string path = std::string(home) + "/.local/share/Steam/"; +#endif + return path; + } + + return ""; +#endif + } + + std::string steam_shortcut::get_last_active_steam_user(const std::string& steam_path) + { + const std::string vdf_path = steam_path + "/config/loginusers.vdf"; + fs::file vdf(vdf_path); + if (!vdf) + { + sys_log.error("get_last_active_steam_user: Failed to parse steam loginusers file '%s': %s", vdf_path, fs::g_tls_error); + return ""; + } + + // The file looks roughly like this. We need the numerical ID. + // "users" + // { + // "12345678901234567" + // { + // "AccountName" "myusername" + // "MostRecent" "1" + // ... + // } + // ... + // } + + const std::string content = vdf.to_string(); + + usz user_count = 0; + + const auto find_user_id = [&content, &user_count](const std::string& key, const std::string& comp) -> std::string + { + user_count = 0; + usz pos = 0; + while (true) + { + pos = content.find(key, pos); + if (pos == umax) break; + + user_count++; + + const usz val_start = content.find('"', pos + key.size()); + if (val_start == umax) break; + + const usz val_end = content.find('"', val_start + 1); + if (val_end == umax) break; + + const std::string value = content.substr(val_start + 1, val_end - val_start - 1); + + if (value != comp) + { + pos = val_end + 1; + continue; + } + + const usz pos_brace = content.rfind('{', pos - 2); + if (pos_brace == umax) return ""; + + const usz pos_end = content.rfind('"', pos_brace - 2); + if (pos_end == umax) return ""; + + const usz pos_start = content.rfind('"', pos_end - 1); + if (pos_start == umax) return ""; + + const std::string user_id_64 = content.substr(pos_start + 1, pos_end - pos_start - 1); + return steamid64_to_32(user_id_64); + } + + return ""; + }; + + if (const std::string id = find_user_id("\"MostRecent\"", "1"); !id.empty()) + { + return id; + } + +#ifdef _WIN32 + // Fallback to AutoLoginUser + const std::string username = get_registry_string(L"Software\\Valve\\Steam", L"AutoLoginUser"); + if (username.empty()) + { + sys_log.notice("get_last_active_steam_user: AutoLoginUser not found in registry"); + return ""; + } + + sys_log.notice("get_last_active_steam_user: Found steam user: '%s'", username); + + if (const std::string id = find_user_id("\"AccountName\"", username); !id.empty()) + { + return id; + } +#endif + + sys_log.error("get_last_active_steam_user: Failed to parse steam loginusers file '%s' (user_count=%d)", vdf_path, user_count); + return ""; + } + + bool steam_shortcut::is_steam_running() + { +#ifdef _WIN32 + if (HANDLE mutex = OpenMutexA(SYNCHRONIZE, FALSE, "Global\\SteamClientRunning")) + { + CloseHandle(mutex); + return true; + } + + // Fallback to check process + PROCESSENTRY32 entry{}; + entry.dwSize = sizeof(entry); + + HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); + + if (Process32First(snapshot, &entry)) + { + do + { + if (lstrcmpiW(entry.szExeFile, L"steam.exe") == 0) + { + CloseHandle(snapshot); + return true; + } + } while (Process32Next(snapshot, &entry)); + } + + CloseHandle(snapshot); +#else + std::vector pid_paths = { get_steam_path() }; +#ifdef __linux__ + if (const char* home = ::getenv("HOME")) + { + pid_paths.push_back(std::string(home) + "/.steam"); + pid_paths.push_back(std::string(home) + "/.steam/steam"); + } +#endif + for (const std::string& pid_path : pid_paths) + { + if (fs::file pid_file(pid_path + "/steam.pid"); pid_file) + { + const std::string pid = pid_file.to_string(); + pid_file.close(); + + if (pid.empty()) + { + continue; + } + + const pid_t pid_val = std::stoi(pid); + return kill(pid_val, 0) == 0 || errno != ESRCH; + } + } +#endif + return false; + } +} diff --git a/rpcs3/rpcs3qt/steam_utils.h b/rpcs3/rpcs3qt/steam_utils.h new file mode 100644 index 0000000000..3a1ce2c3a1 --- /dev/null +++ b/rpcs3/rpcs3qt/steam_utils.h @@ -0,0 +1,104 @@ +#pragma once + +#include "util/types.hpp" +#include "Utilities/StrFmt.h" +#include +#include + +namespace gui::utils +{ + class steam_shortcut + { + public: + steam_shortcut() {} + ~steam_shortcut() {} + + void add_shortcut( + const std::string& app_name, + const std::string& exe, + const std::string& start_dir, + const std::string& launch_options, + const std::string& icon_path); + + void remove_shortcut( + const std::string& app_name, + const std::string& exe, + const std::string& start_dir); + + bool write_file(); + + static bool steam_installed(); + static bool is_steam_running(); + + private: + enum type_id + { + Null = 0x00, + Start = Null, + String = 0x01, + Integer = 0x02, + Float = 0x03, + Pointer = 0x04, + Nested = 0x05, + Array = 0x06, + Bool = 0x07, + End = 0x08, + }; + + struct shortcut_entry + { + std::string app_name; + std::string exe; + std::string start_dir; + std::string launch_options; + std::string icon; + u32 appid = 0; + + std::string build_binary_blob(usz index) const; + }; + + struct vdf_shortcut_entry + { + std::vector>> values; + std::vector> tags; + + template + std::expected value(const std::string& key) const + { + const auto it = std::find_if(values.cbegin(), values.cend(), [&key](const auto& v){ return v.first == key; }); + if (it == values.cend()) + { + return std::unexpected(fmt::format("key '%s' not found", key)); + } + + if (const auto* p = std::get_if(&it->second)) + { + return *p; + } + + return std::unexpected(fmt::format("value for key '%s' has wrong type", key)); + } + + std::expected build_binary_blob(usz index) const; + }; + + bool parse_file(const std::string& path); + + static u32 crc32(const std::string& data); + static u32 steam_appid(const std::string& exe, const std::string& name); + + static void append(std::string& s, const std::string& val); + + static std::string quote(const std::string& s, bool force); + static std::string fix_slashes(const std::string& s); + static std::string kv_string(const std::string& key, const std::string& value); + static std::string kv_int(const std::string& key, u32 value); + static std::string steamid64_to_32(const std::string& steam_id); + static std::string get_steam_path(); + static std::string get_last_active_steam_user(const std::string& steam_path); + + std::vector m_entries_to_add; + std::vector m_entries_to_remove; + std::vector m_vdf_entries; + }; +} From 7859a5f9d2dc6a578241d620fbd33c53e696829c Mon Sep 17 00:00:00 2001 From: Megamouse Date: Mon, 16 Mar 2026 10:37:40 +0100 Subject: [PATCH 108/295] input: log warning instead of throwing an exception when the dpad has an unknown value --- rpcs3/Input/ds4_pad_handler.cpp | 7 ++++++- rpcs3/Input/dualsense_pad_handler.cpp | 7 ++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/rpcs3/Input/ds4_pad_handler.cpp b/rpcs3/Input/ds4_pad_handler.cpp index 50d38773a3..d983a95e2c 100644 --- a/rpcs3/Input/ds4_pad_handler.cpp +++ b/rpcs3/Input/ds4_pad_handler.cpp @@ -334,7 +334,12 @@ std::unordered_map ds4_pad_handler::get_button_values(const std::share keyBuffer[DS4KeyCodes::Right] = 0; break; default: - fmt::throw_exception("ds4 dpad state encountered unexpected input"); + keyBuffer[DS4KeyCodes::Up] = 0; + keyBuffer[DS4KeyCodes::Down] = 0; + keyBuffer[DS4KeyCodes::Left] = 0; + keyBuffer[DS4KeyCodes::Right] = 0; + ds4_log.warning("dpad state encountered unexpected input: 0x%x", dpadState); + break; } // square, cross, circle, triangle diff --git a/rpcs3/Input/dualsense_pad_handler.cpp b/rpcs3/Input/dualsense_pad_handler.cpp index 91713afa34..8c07e5f028 100644 --- a/rpcs3/Input/dualsense_pad_handler.cpp +++ b/rpcs3/Input/dualsense_pad_handler.cpp @@ -723,7 +723,12 @@ std::unordered_map dualsense_pad_handler::get_button_values(const std: keyBuffer[DualSenseKeyCodes::Right] = 0; break; default: - fmt::throw_exception("dualsense dpad state encountered unexpected input"); + keyBuffer[DualSenseKeyCodes::Up] = 0; + keyBuffer[DualSenseKeyCodes::Down] = 0; + keyBuffer[DualSenseKeyCodes::Left] = 0; + keyBuffer[DualSenseKeyCodes::Right] = 0; + dualsense_log.warning("dpad state encountered unexpected input: 0x%x", data); + break; } data = (is_simple_mode ? input.z : input.buttons[0]) >> 4; From 5cb688f30900be302d4c7baed30e06c72122b529 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sun, 1 Mar 2026 17:17:42 +0300 Subject: [PATCH 109/295] rsx/overlays: Implement tabbed containers --- rpcs3/Emu/CMakeLists.txt | 1 + rpcs3/Emu/RSX/Overlays/overlay_controls.cpp | 316 +++++++++++-------- rpcs3/Emu/RSX/Overlays/overlay_controls.h | 5 +- rpcs3/Emu/RSX/Overlays/overlay_list_view.cpp | 87 +++-- rpcs3/Emu/RSX/Overlays/overlay_list_view.hpp | 4 + rpcs3/Emu/RSX/Overlays/overlay_tabs.cpp | 142 +++++++++ rpcs3/Emu/RSX/Overlays/overlay_tabs.h | 40 +++ rpcs3/emucore.vcxproj | 2 + rpcs3/emucore.vcxproj.filters | 6 + 9 files changed, 442 insertions(+), 161 deletions(-) create mode 100644 rpcs3/Emu/RSX/Overlays/overlay_tabs.cpp create mode 100644 rpcs3/Emu/RSX/Overlays/overlay_tabs.h diff --git a/rpcs3/Emu/CMakeLists.txt b/rpcs3/Emu/CMakeLists.txt index 63951cfe92..c7eea83995 100644 --- a/rpcs3/Emu/CMakeLists.txt +++ b/rpcs3/Emu/CMakeLists.txt @@ -517,6 +517,7 @@ target_sources(rpcs3_emu PRIVATE RSX/Overlays/overlay_perf_metrics.cpp RSX/Overlays/overlay_progress_bar.cpp RSX/Overlays/overlay_save_dialog.cpp + RSX/Overlays/overlay_tabs.cpp RSX/Overlays/overlay_trophy_notification.cpp RSX/Overlays/overlay_user_list_dialog.cpp RSX/Overlays/overlay_utils.cpp diff --git a/rpcs3/Emu/RSX/Overlays/overlay_controls.cpp b/rpcs3/Emu/RSX/Overlays/overlay_controls.cpp index 65ef78be4d..96ffaac93d 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_controls.cpp +++ b/rpcs3/Emu/RSX/Overlays/overlay_controls.cpp @@ -579,43 +579,49 @@ namespace rsx compiled_resource& overlay_element::get_compiled() { - if (!is_compiled()) + if (is_compiled()) { - compiled_resources.clear(); + return compiled_resources; + } - compiled_resource compiled_resources_temp = {}; - auto& cmd_bg = compiled_resources_temp.append({}); - auto& config = cmd_bg.config; + m_is_compiled = true; + compiled_resources.clear(); - config.color = back_color; - config.pulse_glow = pulse_effect_enabled; - config.pulse_sinus_offset = pulse_sinus_offset; - config.pulse_speed_modifier = pulse_speed_modifier; + if (!is_visible()) + { + return compiled_resources; + } - auto& verts = compiled_resources_temp.draw_commands.front().verts; - verts.resize(4); + compiled_resource compiled_resources_temp = {}; + auto& cmd_bg = compiled_resources_temp.append({}); + auto& config = cmd_bg.config; - verts[0].vec4(x, y, 0.f, 0.f); - verts[1].vec4(f32(x + w), y, 1.f, 0.f); - verts[2].vec4(x, f32(y + h), 0.f, 1.f); - verts[3].vec4(f32(x + w), f32(y + h), 1.f, 1.f); + config.color = back_color; + config.pulse_glow = pulse_effect_enabled; + config.pulse_sinus_offset = pulse_sinus_offset; + config.pulse_speed_modifier = pulse_speed_modifier; - compiled_resources.add(std::move(compiled_resources_temp), margin_left, margin_top); + auto& verts = compiled_resources_temp.draw_commands.front().verts; + verts.resize(4); - if (!text.empty()) - { - compiled_resources_temp.clear(); - auto& cmd_text = compiled_resources_temp.append({}); + verts[0].vec4(x, y, 0.f, 0.f); + verts[1].vec4(f32(x + w), y, 1.f, 0.f); + verts[2].vec4(x, f32(y + h), 0.f, 1.f); + verts[3].vec4(f32(x + w), f32(y + h), 1.f, 1.f); - cmd_text.config.set_font(get_font()); - cmd_text.config.color = fore_color; - cmd_text.verts = render_text(text.c_str(), static_cast(x), static_cast(y)); + compiled_resources.add(std::move(compiled_resources_temp), margin_left, margin_top); - if (!cmd_text.verts.empty()) - compiled_resources.add(std::move(compiled_resources_temp), margin_left - horizontal_scroll_offset, margin_top - vertical_scroll_offset); - } + if (!text.empty()) + { + compiled_resources_temp.clear(); + auto& cmd_text = compiled_resources_temp.append({}); - m_is_compiled = true; + cmd_text.config.set_font(get_font()); + cmd_text.config.color = fore_color; + cmd_text.verts = render_text(text.c_str(), static_cast(x), static_cast(y)); + + if (!cmd_text.verts.empty()) + compiled_resources.add(std::move(compiled_resources_temp), margin_left - horizontal_scroll_offset, margin_top - vertical_scroll_offset); } return compiled_resources; @@ -722,6 +728,13 @@ namespace rsx add_element(spacer_element); } + void layout_container::clear_items() + { + m_items.clear(); + advance_pos = 0; + scroll_offset_value = 0; + } + overlay_element* vertical_layout::add_element(std::unique_ptr& item, int offset) { if (auto_resize) @@ -888,27 +901,36 @@ namespace rsx compiled_resource& image_view::get_compiled() { - if (!is_compiled()) + if (is_compiled()) { - auto& result = overlay_element::get_compiled(); - auto& cmd_img = result.draw_commands.front(); - - cmd_img.config.set_image_resource(image_resource_ref); - cmd_img.config.color = fore_color; - cmd_img.config.external_data_ref = external_ref; - cmd_img.config.blur_strength = blur_strength; - - // Make padding work for images (treat them as the content instead of the 'background') - auto& verts = cmd_img.verts; - - verts[0] += vertex(padding_left, padding_bottom, 0, 0); - verts[1] += vertex(-padding_right, padding_bottom, 0, 0); - verts[2] += vertex(padding_left, -padding_top, 0, 0); - verts[3] += vertex(-padding_right, -padding_top, 0, 0); - - m_is_compiled = true; + return compiled_resources; } + compiled_resources.clear(); + + if (!is_visible()) + { + m_is_compiled = true; + return compiled_resources; + } + + auto& result = overlay_element::get_compiled(); + auto& cmd_img = result.draw_commands.front(); + + cmd_img.config.set_image_resource(image_resource_ref); + cmd_img.config.color = fore_color; + cmd_img.config.external_data_ref = external_ref; + cmd_img.config.blur_strength = blur_strength; + + // Make padding work for images (treat them as the content instead of the 'background') + auto& verts = cmd_img.verts; + + verts[0] += vertex(padding_left, padding_bottom, 0, 0); + verts[1] += vertex(-padding_right, padding_bottom, 0, 0); + verts[2] += vertex(padding_left, -padding_top, 0, 0); + verts[3] += vertex(-padding_right, -padding_top, 0, 0); + + m_is_compiled = true; return compiled_resources; } @@ -961,29 +983,40 @@ namespace rsx compiled_resource& image_button::get_compiled() { - if (!is_compiled()) + if (is_compiled()) { - auto& compiled = image_view::get_compiled(); - for (auto& cmd : compiled.draw_commands) + return compiled_resources; + } + + compiled_resources.clear(); + + if (!is_visible()) + { + m_is_compiled = true; + return compiled_resources; + } + + auto& compiled = image_view::get_compiled(); + for (auto& cmd : compiled.draw_commands) + { + if (cmd.config.texture_ref == image_resource_id::font_file) { - if (cmd.config.texture_ref == image_resource_id::font_file) + // Text, translate geometry to the right + for (auto &v : cmd.verts) { - // Text, translate geometry to the right - for (auto &v : cmd.verts) - { - v.values[0] += m_text_offset_x; - v.values[1] += m_text_offset_y; - } + v.values[0] += m_text_offset_x; + v.values[1] += m_text_offset_y; } } } + m_is_compiled = true; return compiled_resources; } - label::label(const std::string& text) + label::label(std::string_view text) { - set_text(text); + set_text(text.data()); } bool label::auto_resize(bool grow_only, u16 limit_w, u16 limit_h) @@ -1013,90 +1046,97 @@ namespace rsx compiled_resource& rounded_rect::get_compiled() { - if (!is_compiled()) + if (is_compiled()) { - compiled_resources.clear(); - -#ifdef __APPLE__ - if (true) -#else - if (radius == 0 || radius > (w / 2)) -#endif - { - // Invalid radius - compiled_resources = overlay_element::get_compiled(); - } - else - { - compiled_resource compiled_resources_temp = {}; - compiled_resources_temp.append({}); // Bg horizontal mid - compiled_resources_temp.append({}); // Bg horizontal top - compiled_resources_temp.append({}); // Bg horizontal bottom - compiled_resources_temp.append({}); // Bg upper-left - compiled_resources_temp.append({}); // Bg lower-left - compiled_resources_temp.append({}); // Bg upper-right - compiled_resources_temp.append({}); // Bg lower-right - - for (auto& draw_cmd : compiled_resources_temp.draw_commands) - { - auto& config = draw_cmd.config; - config.color = back_color; - config.disable_vertex_snap = true; - config.pulse_glow = pulse_effect_enabled; - config.pulse_sinus_offset = pulse_sinus_offset; - config.pulse_speed_modifier = pulse_speed_modifier; - } - - auto& bg0 = compiled_resources_temp.draw_commands[0]; - auto& bg1 = compiled_resources_temp.draw_commands[1]; - auto& bg2 = compiled_resources_temp.draw_commands[2]; - - bg0.verts.emplace_back(f32(x), f32(y + radius), 0.f, 0.f); - bg0.verts.emplace_back(f32(x + w), f32(y + radius), 0.f, 0.f); - bg0.verts.emplace_back(f32(x), f32(y + h) - radius, 0.f, 0.f); - bg0.verts.emplace_back(f32(x + w), f32(y + h) - radius, 0.f, 0.f); - - bg1.verts.emplace_back(f32(x + radius), f32(y), 0.f, 0.f); - bg1.verts.emplace_back(f32(x + w) - radius, f32(y), 0.f, 0.f); - bg1.verts.emplace_back(f32(x + radius), f32(y + radius), 0.f, 0.f); - bg1.verts.emplace_back(f32(x + w) - radius, f32(y + radius), 0.f, 0.f); - - bg2.verts.emplace_back(f32(x + radius), f32(y + h) - radius, 0.f, 0.f); - bg2.verts.emplace_back(f32(x + w) - radius, f32(y + h) - radius, 0.f, 0.f); - bg2.verts.emplace_back(f32(x + radius), f32(y + h), 0.f, 0.f); - bg2.verts.emplace_back(f32(x + w) - radius, f32(y + h), 0.f, 0.f); - - // Generate the quadrants - const f32 corners[4][2] = - { - { f32(x + radius), f32(y + radius) }, - { f32(x + radius), f32(y + h) - radius }, - { f32(x + w) - radius, f32(y + radius) }, - { f32(x + w) - radius, f32(y + h) - radius } - }; - - const f32 radius_f = static_cast(radius); - const f32 scale[4][2] = - { - { -radius_f, -radius_f }, - { -radius_f, +radius_f }, - { +radius_f, -radius_f }, - { +radius_f, +radius_f } - }; - - for (int i = 0; i < 4; ++i) - { - auto& command = compiled_resources_temp.draw_commands[i + 3]; - command.config.primitives = rsx::overlays::primitive_type::triangle_fan; - command.verts = generate_unit_quadrant(num_control_points, corners[i], scale[i]); - } - - compiled_resources.add(std::move(compiled_resources_temp), margin_left, margin_top); - } - - m_is_compiled = true; + return compiled_resources; } + compiled_resources.clear(); + + if (!is_visible()) + { + m_is_compiled = true; + return compiled_resources; + } + +#ifdef __APPLE__ + if (true) +#else + if (radius == 0 || radius > (w / 2)) +#endif + { + // Invalid radius + compiled_resources = overlay_element::get_compiled(); + m_is_compiled = true; + return compiled_resources; + } + + compiled_resource compiled_resources_temp = {}; + compiled_resources_temp.append({}); // Bg horizontal mid + compiled_resources_temp.append({}); // Bg horizontal top + compiled_resources_temp.append({}); // Bg horizontal bottom + compiled_resources_temp.append({}); // Bg upper-left + compiled_resources_temp.append({}); // Bg lower-left + compiled_resources_temp.append({}); // Bg upper-right + compiled_resources_temp.append({}); // Bg lower-right + + for (auto& draw_cmd : compiled_resources_temp.draw_commands) + { + auto& config = draw_cmd.config; + config.color = back_color; + config.disable_vertex_snap = true; + config.pulse_glow = pulse_effect_enabled; + config.pulse_sinus_offset = pulse_sinus_offset; + config.pulse_speed_modifier = pulse_speed_modifier; + } + + auto& bg0 = compiled_resources_temp.draw_commands[0]; + auto& bg1 = compiled_resources_temp.draw_commands[1]; + auto& bg2 = compiled_resources_temp.draw_commands[2]; + + bg0.verts.emplace_back(f32(x), f32(y + radius), 0.f, 0.f); + bg0.verts.emplace_back(f32(x + w), f32(y + radius), 0.f, 0.f); + bg0.verts.emplace_back(f32(x), f32(y + h) - radius, 0.f, 0.f); + bg0.verts.emplace_back(f32(x + w), f32(y + h) - radius, 0.f, 0.f); + + bg1.verts.emplace_back(f32(x + radius), f32(y), 0.f, 0.f); + bg1.verts.emplace_back(f32(x + w) - radius, f32(y), 0.f, 0.f); + bg1.verts.emplace_back(f32(x + radius), f32(y + radius), 0.f, 0.f); + bg1.verts.emplace_back(f32(x + w) - radius, f32(y + radius), 0.f, 0.f); + + bg2.verts.emplace_back(f32(x + radius), f32(y + h) - radius, 0.f, 0.f); + bg2.verts.emplace_back(f32(x + w) - radius, f32(y + h) - radius, 0.f, 0.f); + bg2.verts.emplace_back(f32(x + radius), f32(y + h), 0.f, 0.f); + bg2.verts.emplace_back(f32(x + w) - radius, f32(y + h), 0.f, 0.f); + + // Generate the quadrants + const f32 corners[4][2] = + { + { f32(x + radius), f32(y + radius) }, + { f32(x + radius), f32(y + h) - radius }, + { f32(x + w) - radius, f32(y + radius) }, + { f32(x + w) - radius, f32(y + h) - radius } + }; + + const f32 radius_f = static_cast(radius); + const f32 scale[4][2] = + { + { -radius_f, -radius_f }, + { -radius_f, +radius_f }, + { +radius_f, -radius_f }, + { +radius_f, +radius_f } + }; + + for (int i = 0; i < 4; ++i) + { + auto& command = compiled_resources_temp.draw_commands[i + 3]; + command.config.primitives = rsx::overlays::primitive_type::triangle_fan; + command.verts = generate_unit_quadrant(num_control_points, corners[i], scale[i]); + } + + compiled_resources.add(std::move(compiled_resources_temp), margin_left, margin_top); + + m_is_compiled = true; return compiled_resources; } } diff --git a/rpcs3/Emu/RSX/Overlays/overlay_controls.h b/rpcs3/Emu/RSX/Overlays/overlay_controls.h index 350a1c5901..7b95ce4950 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_controls.h +++ b/rpcs3/Emu/RSX/Overlays/overlay_controls.h @@ -219,6 +219,8 @@ namespace rsx virtual compiled_resource& get_compiled(); void measure_text(u16& width, u16& height, bool ignore_word_wrap = false) const; virtual void set_selected(bool selected) { static_cast(selected); } + virtual void set_visible(bool visible) { this->visible = visible; m_is_compiled = false; } + virtual bool is_visible() const { return visible; } protected: bool m_is_compiled = false; // Only use m_is_compiled as a getter in is_compiled() if possible @@ -233,6 +235,7 @@ namespace rsx bool auto_resize = true; virtual overlay_element* add_element(std::unique_ptr&, int = -1) = 0; + void clear_items(); layout_container(); @@ -320,7 +323,7 @@ namespace rsx struct label : public overlay_element { label() = default; - label(const std::string& text); + label(std::string_view text); bool auto_resize(bool grow_only = false, u16 limit_w = -1, u16 limit_h = -1); }; diff --git a/rpcs3/Emu/RSX/Overlays/overlay_list_view.cpp b/rpcs3/Emu/RSX/Overlays/overlay_list_view.cpp index 1b6f4e8fc6..2ff654254c 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_list_view.cpp +++ b/rpcs3/Emu/RSX/Overlays/overlay_list_view.cpp @@ -18,8 +18,8 @@ namespace rsx m_cancel_btn = std::make_unique(120, 20); m_highlight_box = std::make_unique(width, 0); - m_scroll_indicator_top->set_size(width, 40); - m_scroll_indicator_bottom->set_size(width, 40); + m_scroll_indicator_top->set_size(width, 10); + m_scroll_indicator_bottom->set_size(width, 10); m_accept_btn->set_size(120, 30); m_cancel_btn->set_size(120, 30); @@ -37,7 +37,7 @@ namespace rsx m_cancel_btn->set_image_resource(resource_config::standard_image_resource::circle); } - m_scroll_indicator_bottom->set_pos(0, height - 40); + m_scroll_indicator_bottom->set_pos(0, height - 10); m_accept_btn->set_pos(30, height + 20); if (can_deny) @@ -199,6 +199,37 @@ namespace rsx return m_selected_entry; } + void list_view::hide_prompt_buttons(bool hidden) + { + m_accept_btn->set_visible(!hidden); + m_cancel_btn->set_visible(!hidden); + + if (m_deny_btn) + { + m_deny_btn->set_visible(!hidden); + } + + refresh(); + } + + void list_view::hide_scroll_indicators(bool hidden) + { + m_scroll_indicator_top->set_visible(!hidden); + m_scroll_indicator_bottom->set_visible(!hidden); + m_highlight_box->set_visible(!hidden); + + refresh(); + } + + void list_view::disable_selection_pulse(bool disabled) + { + m_highlight_box->pulse_effect_enabled = !disabled; + m_highlight_box->set_sinus_offset(1.5f); + m_highlight_box->refresh(); + + refresh(); + } + void list_view::set_cancel_only(bool cancel_only) { if (cancel_only) @@ -209,7 +240,7 @@ namespace rsx m_cancel_btn->set_pos(x + 180, y + h + 20); m_cancel_only = cancel_only; - m_is_compiled = false; + refresh(); } bool list_view::get_cancel_only() const @@ -233,27 +264,39 @@ namespace rsx compiled_resource& list_view::get_compiled() { - if (!is_compiled()) + if (is_compiled()) { - auto& compiled = vertical_layout::get_compiled(); - compiled.add(m_highlight_box->get_compiled()); - compiled.add(m_scroll_indicator_top->get_compiled()); - compiled.add(m_scroll_indicator_bottom->get_compiled()); - compiled.add(m_cancel_btn->get_compiled()); - - if (!m_cancel_only) - { - compiled.add(m_accept_btn->get_compiled()); - - if (m_deny_btn) - { - compiled.add(m_deny_btn->get_compiled()); - } - } - - compiled_resources = compiled; + return compiled_resources; } + compiled_resources.clear(); + + if (!is_visible()) + { + m_is_compiled = true; + return compiled_resources; + } + + auto& compiled = vertical_layout::get_compiled(); + compiled.add(m_highlight_box->get_compiled()); + compiled.add(m_scroll_indicator_top->get_compiled()); + compiled.add(m_scroll_indicator_bottom->get_compiled()); + compiled.add(m_cancel_btn->get_compiled()); + + if (m_cancel_only) + { + m_is_compiled = true; + return compiled_resources; + } + + compiled.add(m_accept_btn->get_compiled()); + + if (m_deny_btn) + { + compiled.add(m_deny_btn->get_compiled()); + } + + m_is_compiled = true; return compiled_resources; } } // namespace overlays diff --git a/rpcs3/Emu/RSX/Overlays/overlay_list_view.hpp b/rpcs3/Emu/RSX/Overlays/overlay_list_view.hpp index 8f191dd404..ffe2b2f9bf 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_list_view.hpp +++ b/rpcs3/Emu/RSX/Overlays/overlay_list_view.hpp @@ -39,6 +39,10 @@ namespace rsx bool get_cancel_only() const; const overlay_element* get_selected_entry() const; + void hide_prompt_buttons(bool hidden = true); + void hide_scroll_indicators(bool hidden = true); + void disable_selection_pulse(bool disabled = true); + void set_cancel_only(bool cancel_only); void translate(s16 _x, s16 _y) override; diff --git a/rpcs3/Emu/RSX/Overlays/overlay_tabs.cpp b/rpcs3/Emu/RSX/Overlays/overlay_tabs.cpp new file mode 100644 index 0000000000..91ff87899e --- /dev/null +++ b/rpcs3/Emu/RSX/Overlays/overlay_tabs.cpp @@ -0,0 +1,142 @@ +#include "stdafx.h" +#include "overlay_tabs.h" + +namespace rsx::overlays +{ + tabbed_container::tabbed_container(u16 header_width) + : m_headers_width(header_width) + { + auto_resize = false; + } + + overlay_element* tabbed_container::add_element(std::unique_ptr& item, int offset) + { + return horizontal_layout::add_element(item, offset); + } + + void tabbed_container::add_tab(std::string_view title, std::shared_ptr& panel) + { + std::unique_ptr label_widget = std::make_unique @@ -2839,6 +2842,9 @@ Emu\GPU\RSX\Overlays + + Emu\GPU\RSX\Overlays + From 3c16105c3bcad260416b27421ebf0254802d6cd9 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sun, 8 Mar 2026 18:07:06 +0300 Subject: [PATCH 110/295] overlays/home: Refactor to support having some home pages inside other containers --- .../HomeMenu/overlay_home_menu_components.cpp | 4 +-- .../HomeMenu/overlay_home_menu_components.h | 2 +- .../HomeMenu/overlay_home_menu_main_menu.cpp | 16 ++++----- .../HomeMenu/overlay_home_menu_page.cpp | 35 +++++++++++++++++-- .../HomeMenu/overlay_home_menu_page.h | 4 +++ .../HomeMenu/overlay_home_menu_savestate.cpp | 4 +-- 6 files changed, 50 insertions(+), 15 deletions(-) diff --git a/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_components.cpp b/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_components.cpp index d0ed9dc460..62a7f3614e 100644 --- a/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_components.cpp +++ b/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_components.cpp @@ -5,14 +5,14 @@ namespace rsx { namespace overlays { - home_menu_entry::home_menu_entry(const std::string& text) + home_menu_entry::home_menu_entry(const std::string& text, u16 width) { std::unique_ptr text_stack = std::make_unique(); std::unique_ptr padding = std::make_unique(); std::unique_ptr title = std::make_unique