diff options
Diffstat (limited to 'src/core')
83 files changed, 1128 insertions, 706 deletions
diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index eb1fbcb61..2dad18e4d 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt | |||
| @@ -41,6 +41,7 @@ add_library(core STATIC | |||
| 41 | file_sys/bis_factory.h | 41 | file_sys/bis_factory.h |
| 42 | file_sys/card_image.cpp | 42 | file_sys/card_image.cpp |
| 43 | file_sys/card_image.h | 43 | file_sys/card_image.h |
| 44 | file_sys/common_funcs.h | ||
| 44 | file_sys/content_archive.cpp | 45 | file_sys/content_archive.cpp |
| 45 | file_sys/content_archive.h | 46 | file_sys/content_archive.h |
| 46 | file_sys/control_metadata.cpp | 47 | file_sys/control_metadata.cpp |
diff --git a/src/core/core.cpp b/src/core/core.cpp index 77d21d41c..0961c0819 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp | |||
| @@ -237,7 +237,7 @@ struct System::Impl { | |||
| 237 | Kernel::Process::Create(system, "main", Kernel::Process::ProcessType::Userland); | 237 | Kernel::Process::Create(system, "main", Kernel::Process::ProcessType::Userland); |
| 238 | const auto [load_result, load_parameters] = app_loader->Load(*main_process, system); | 238 | const auto [load_result, load_parameters] = app_loader->Load(*main_process, system); |
| 239 | if (load_result != Loader::ResultStatus::Success) { | 239 | if (load_result != Loader::ResultStatus::Success) { |
| 240 | LOG_CRITICAL(Core, "Failed to load ROM (Error {})!", static_cast<int>(load_result)); | 240 | LOG_CRITICAL(Core, "Failed to load ROM (Error {})!", load_result); |
| 241 | Shutdown(); | 241 | Shutdown(); |
| 242 | 242 | ||
| 243 | return static_cast<ResultStatus>(static_cast<u32>(ResultStatus::ErrorLoader) + | 243 | return static_cast<ResultStatus>(static_cast<u32>(ResultStatus::ErrorLoader) + |
| @@ -267,8 +267,7 @@ struct System::Impl { | |||
| 267 | 267 | ||
| 268 | u64 title_id{0}; | 268 | u64 title_id{0}; |
| 269 | if (app_loader->ReadProgramId(title_id) != Loader::ResultStatus::Success) { | 269 | if (app_loader->ReadProgramId(title_id) != Loader::ResultStatus::Success) { |
| 270 | LOG_ERROR(Core, "Failed to find title id for ROM (Error {})", | 270 | LOG_ERROR(Core, "Failed to find title id for ROM (Error {})", load_result); |
| 271 | static_cast<u32>(load_result)); | ||
| 272 | } | 271 | } |
| 273 | perf_stats = std::make_unique<PerfStats>(title_id); | 272 | perf_stats = std::make_unique<PerfStats>(title_id); |
| 274 | // Reset counters and set time origin to current frame | 273 | // Reset counters and set time origin to current frame |
diff --git a/src/core/file_sys/common_funcs.h b/src/core/file_sys/common_funcs.h new file mode 100644 index 000000000..7ed97aa50 --- /dev/null +++ b/src/core/file_sys/common_funcs.h | |||
| @@ -0,0 +1,56 @@ | |||
| 1 | // Copyright 2020 yuzu Emulator Project | ||
| 2 | // Licensed under GPLv2 or any later version | ||
| 3 | // Refer to the license.txt file included. | ||
| 4 | |||
| 5 | #pragma once | ||
| 6 | |||
| 7 | #include "common/common_types.h" | ||
| 8 | |||
| 9 | namespace FileSys { | ||
| 10 | |||
| 11 | constexpr u64 AOC_TITLE_ID_MASK = 0x7FF; | ||
| 12 | constexpr u64 AOC_TITLE_ID_OFFSET = 0x1000; | ||
| 13 | constexpr u64 BASE_TITLE_ID_MASK = 0xFFFFFFFFFFFFE000; | ||
| 14 | |||
| 15 | /** | ||
| 16 | * Gets the base title ID from a given title ID. | ||
| 17 | * | ||
| 18 | * @param title_id The title ID. | ||
| 19 | * @returns The base title ID. | ||
| 20 | */ | ||
| 21 | [[nodiscard]] constexpr u64 GetBaseTitleID(u64 title_id) { | ||
| 22 | return title_id & BASE_TITLE_ID_MASK; | ||
| 23 | } | ||
| 24 | |||
| 25 | /** | ||
| 26 | * Gets the base title ID with a program index offset from a given title ID. | ||
| 27 | * | ||
| 28 | * @param title_id The title ID. | ||
| 29 | * @param program_index The program index. | ||
| 30 | * @returns The base title ID with a program index offset. | ||
| 31 | */ | ||
| 32 | [[nodiscard]] constexpr u64 GetBaseTitleIDWithProgramIndex(u64 title_id, u64 program_index) { | ||
| 33 | return GetBaseTitleID(title_id) + program_index; | ||
| 34 | } | ||
| 35 | |||
| 36 | /** | ||
| 37 | * Gets the AOC (Add-On Content) base title ID from a given title ID. | ||
| 38 | * | ||
| 39 | * @param title_id The title ID. | ||
| 40 | * @returns The AOC base title ID. | ||
| 41 | */ | ||
| 42 | [[nodiscard]] constexpr u64 GetAOCBaseTitleID(u64 title_id) { | ||
| 43 | return GetBaseTitleID(title_id) + AOC_TITLE_ID_OFFSET; | ||
| 44 | } | ||
| 45 | |||
| 46 | /** | ||
| 47 | * Gets the AOC (Add-On Content) ID from a given AOC title ID. | ||
| 48 | * | ||
| 49 | * @param aoc_title_id The AOC title ID. | ||
| 50 | * @returns The AOC ID. | ||
| 51 | */ | ||
| 52 | [[nodiscard]] constexpr u64 GetAOCID(u64 aoc_title_id) { | ||
| 53 | return aoc_title_id & AOC_TITLE_ID_MASK; | ||
| 54 | } | ||
| 55 | |||
| 56 | } // namespace FileSys | ||
diff --git a/src/core/file_sys/content_archive.cpp b/src/core/file_sys/content_archive.cpp index 76af47ff9..a6c0337fa 100644 --- a/src/core/file_sys/content_archive.cpp +++ b/src/core/file_sys/content_archive.cpp | |||
| @@ -410,8 +410,9 @@ u8 NCA::GetCryptoRevision() const { | |||
| 410 | std::optional<Core::Crypto::Key128> NCA::GetKeyAreaKey(NCASectionCryptoType type) const { | 410 | std::optional<Core::Crypto::Key128> NCA::GetKeyAreaKey(NCASectionCryptoType type) const { |
| 411 | const auto master_key_id = GetCryptoRevision(); | 411 | const auto master_key_id = GetCryptoRevision(); |
| 412 | 412 | ||
| 413 | if (!keys.HasKey(Core::Crypto::S128KeyType::KeyArea, master_key_id, header.key_index)) | 413 | if (!keys.HasKey(Core::Crypto::S128KeyType::KeyArea, master_key_id, header.key_index)) { |
| 414 | return {}; | 414 | return std::nullopt; |
| 415 | } | ||
| 415 | 416 | ||
| 416 | std::vector<u8> key_area(header.key_area.begin(), header.key_area.end()); | 417 | std::vector<u8> key_area(header.key_area.begin(), header.key_area.end()); |
| 417 | Core::Crypto::AESCipher<Core::Crypto::Key128> cipher( | 418 | Core::Crypto::AESCipher<Core::Crypto::Key128> cipher( |
| @@ -420,15 +421,17 @@ std::optional<Core::Crypto::Key128> NCA::GetKeyAreaKey(NCASectionCryptoType type | |||
| 420 | cipher.Transcode(key_area.data(), key_area.size(), key_area.data(), Core::Crypto::Op::Decrypt); | 421 | cipher.Transcode(key_area.data(), key_area.size(), key_area.data(), Core::Crypto::Op::Decrypt); |
| 421 | 422 | ||
| 422 | Core::Crypto::Key128 out; | 423 | Core::Crypto::Key128 out; |
| 423 | if (type == NCASectionCryptoType::XTS) | 424 | if (type == NCASectionCryptoType::XTS) { |
| 424 | std::copy(key_area.begin(), key_area.begin() + 0x10, out.begin()); | 425 | std::copy(key_area.begin(), key_area.begin() + 0x10, out.begin()); |
| 425 | else if (type == NCASectionCryptoType::CTR || type == NCASectionCryptoType::BKTR) | 426 | } else if (type == NCASectionCryptoType::CTR || type == NCASectionCryptoType::BKTR) { |
| 426 | std::copy(key_area.begin() + 0x20, key_area.begin() + 0x30, out.begin()); | 427 | std::copy(key_area.begin() + 0x20, key_area.begin() + 0x30, out.begin()); |
| 427 | else | 428 | } else { |
| 428 | LOG_CRITICAL(Crypto, "Called GetKeyAreaKey on invalid NCASectionCryptoType type={:02X}", | 429 | LOG_CRITICAL(Crypto, "Called GetKeyAreaKey on invalid NCASectionCryptoType type={:02X}", |
| 429 | static_cast<u8>(type)); | 430 | type); |
| 431 | } | ||
| 432 | |||
| 430 | u128 out_128{}; | 433 | u128 out_128{}; |
| 431 | memcpy(out_128.data(), out.data(), 16); | 434 | std::memcpy(out_128.data(), out.data(), sizeof(u128)); |
| 432 | LOG_TRACE(Crypto, "called with crypto_rev={:02X}, kak_index={:02X}, key={:016X}{:016X}", | 435 | LOG_TRACE(Crypto, "called with crypto_rev={:02X}, kak_index={:02X}, key={:016X}{:016X}", |
| 433 | master_key_id, header.key_index, out_128[1], out_128[0]); | 436 | master_key_id, header.key_index, out_128[1], out_128[0]); |
| 434 | 437 | ||
| @@ -507,7 +510,7 @@ VirtualFile NCA::Decrypt(const NCASectionHeader& s_header, VirtualFile in, u64 s | |||
| 507 | // TODO(DarkLordZach): Find a test case for XTS-encrypted NCAs | 510 | // TODO(DarkLordZach): Find a test case for XTS-encrypted NCAs |
| 508 | default: | 511 | default: |
| 509 | LOG_ERROR(Crypto, "called with unhandled crypto type={:02X}", | 512 | LOG_ERROR(Crypto, "called with unhandled crypto type={:02X}", |
| 510 | static_cast<u8>(s_header.raw.header.crypto_type)); | 513 | s_header.raw.header.crypto_type); |
| 511 | return nullptr; | 514 | return nullptr; |
| 512 | } | 515 | } |
| 513 | } | 516 | } |
| @@ -516,15 +519,17 @@ Loader::ResultStatus NCA::GetStatus() const { | |||
| 516 | return status; | 519 | return status; |
| 517 | } | 520 | } |
| 518 | 521 | ||
| 519 | std::vector<std::shared_ptr<VfsFile>> NCA::GetFiles() const { | 522 | std::vector<VirtualFile> NCA::GetFiles() const { |
| 520 | if (status != Loader::ResultStatus::Success) | 523 | if (status != Loader::ResultStatus::Success) { |
| 521 | return {}; | 524 | return {}; |
| 525 | } | ||
| 522 | return files; | 526 | return files; |
| 523 | } | 527 | } |
| 524 | 528 | ||
| 525 | std::vector<std::shared_ptr<VfsDirectory>> NCA::GetSubdirectories() const { | 529 | std::vector<VirtualDir> NCA::GetSubdirectories() const { |
| 526 | if (status != Loader::ResultStatus::Success) | 530 | if (status != Loader::ResultStatus::Success) { |
| 527 | return {}; | 531 | return {}; |
| 532 | } | ||
| 528 | return dirs; | 533 | return dirs; |
| 529 | } | 534 | } |
| 530 | 535 | ||
| @@ -532,7 +537,7 @@ std::string NCA::GetName() const { | |||
| 532 | return file->GetName(); | 537 | return file->GetName(); |
| 533 | } | 538 | } |
| 534 | 539 | ||
| 535 | std::shared_ptr<VfsDirectory> NCA::GetParentDirectory() const { | 540 | VirtualDir NCA::GetParentDirectory() const { |
| 536 | return file->GetContainingDirectory(); | 541 | return file->GetContainingDirectory(); |
| 537 | } | 542 | } |
| 538 | 543 | ||
diff --git a/src/core/file_sys/content_archive.h b/src/core/file_sys/content_archive.h index 69292232a..e9eccdea3 100644 --- a/src/core/file_sys/content_archive.h +++ b/src/core/file_sys/content_archive.h | |||
| @@ -82,7 +82,7 @@ struct NCAHeader { | |||
| 82 | }; | 82 | }; |
| 83 | static_assert(sizeof(NCAHeader) == 0x400, "NCAHeader has incorrect size."); | 83 | static_assert(sizeof(NCAHeader) == 0x400, "NCAHeader has incorrect size."); |
| 84 | 84 | ||
| 85 | inline bool IsDirectoryExeFS(const std::shared_ptr<VfsDirectory>& pfs) { | 85 | inline bool IsDirectoryExeFS(const VirtualDir& pfs) { |
| 86 | // According to switchbrew, an exefs must only contain these two files: | 86 | // According to switchbrew, an exefs must only contain these two files: |
| 87 | return pfs->GetFile("main") != nullptr && pfs->GetFile("main.npdm") != nullptr; | 87 | return pfs->GetFile("main") != nullptr && pfs->GetFile("main.npdm") != nullptr; |
| 88 | } | 88 | } |
| @@ -104,10 +104,10 @@ public: | |||
| 104 | 104 | ||
| 105 | Loader::ResultStatus GetStatus() const; | 105 | Loader::ResultStatus GetStatus() const; |
| 106 | 106 | ||
| 107 | std::vector<std::shared_ptr<VfsFile>> GetFiles() const override; | 107 | std::vector<VirtualFile> GetFiles() const override; |
| 108 | std::vector<std::shared_ptr<VfsDirectory>> GetSubdirectories() const override; | 108 | std::vector<VirtualDir> GetSubdirectories() const override; |
| 109 | std::string GetName() const override; | 109 | std::string GetName() const override; |
| 110 | std::shared_ptr<VfsDirectory> GetParentDirectory() const override; | 110 | VirtualDir GetParentDirectory() const override; |
| 111 | 111 | ||
| 112 | NCAContentType GetType() const; | 112 | NCAContentType GetType() const; |
| 113 | u64 GetTitleId() const; | 113 | u64 GetTitleId() const; |
diff --git a/src/core/file_sys/nca_patch.cpp b/src/core/file_sys/nca_patch.cpp index 5990a2fd5..adcf0732f 100644 --- a/src/core/file_sys/nca_patch.cpp +++ b/src/core/file_sys/nca_patch.cpp | |||
| @@ -191,7 +191,7 @@ bool BKTR::Resize(std::size_t new_size) { | |||
| 191 | return false; | 191 | return false; |
| 192 | } | 192 | } |
| 193 | 193 | ||
| 194 | std::shared_ptr<VfsDirectory> BKTR::GetContainingDirectory() const { | 194 | VirtualDir BKTR::GetContainingDirectory() const { |
| 195 | return base_romfs->GetContainingDirectory(); | 195 | return base_romfs->GetContainingDirectory(); |
| 196 | } | 196 | } |
| 197 | 197 | ||
diff --git a/src/core/file_sys/nca_patch.h b/src/core/file_sys/nca_patch.h index 60c544f8e..503cf473e 100644 --- a/src/core/file_sys/nca_patch.h +++ b/src/core/file_sys/nca_patch.h | |||
| @@ -106,7 +106,7 @@ public: | |||
| 106 | 106 | ||
| 107 | bool Resize(std::size_t new_size) override; | 107 | bool Resize(std::size_t new_size) override; |
| 108 | 108 | ||
| 109 | std::shared_ptr<VfsDirectory> GetContainingDirectory() const override; | 109 | VirtualDir GetContainingDirectory() const override; |
| 110 | 110 | ||
| 111 | bool IsWritable() const override; | 111 | bool IsWritable() const override; |
| 112 | 112 | ||
diff --git a/src/core/file_sys/patch_manager.cpp b/src/core/file_sys/patch_manager.cpp index e9d1607d0..7c3284df8 100644 --- a/src/core/file_sys/patch_manager.cpp +++ b/src/core/file_sys/patch_manager.cpp | |||
| @@ -12,6 +12,7 @@ | |||
| 12 | #include "common/logging/log.h" | 12 | #include "common/logging/log.h" |
| 13 | #include "common/string_util.h" | 13 | #include "common/string_util.h" |
| 14 | #include "core/core.h" | 14 | #include "core/core.h" |
| 15 | #include "core/file_sys/common_funcs.h" | ||
| 15 | #include "core/file_sys/content_archive.h" | 16 | #include "core/file_sys/content_archive.h" |
| 16 | #include "core/file_sys/control_metadata.h" | 17 | #include "core/file_sys/control_metadata.h" |
| 17 | #include "core/file_sys/ips_layer.h" | 18 | #include "core/file_sys/ips_layer.h" |
| @@ -30,7 +31,6 @@ namespace FileSys { | |||
| 30 | namespace { | 31 | namespace { |
| 31 | 32 | ||
| 32 | constexpr u32 SINGLE_BYTE_MODULUS = 0x100; | 33 | constexpr u32 SINGLE_BYTE_MODULUS = 0x100; |
| 33 | constexpr u64 DLC_BASE_TITLE_ID_MASK = 0xFFFFFFFFFFFFE000; | ||
| 34 | 34 | ||
| 35 | constexpr std::array<const char*, 14> EXEFS_FILE_NAMES{ | 35 | constexpr std::array<const char*, 14> EXEFS_FILE_NAMES{ |
| 36 | "main", "main.npdm", "rtld", "sdk", "subsdk0", "subsdk1", "subsdk2", | 36 | "main", "main.npdm", "rtld", "sdk", "subsdk0", "subsdk1", "subsdk2", |
| @@ -532,7 +532,7 @@ PatchManager::PatchVersionNames PatchManager::GetPatchVersionNames(VirtualFile u | |||
| 532 | dlc_match.reserve(dlc_entries.size()); | 532 | dlc_match.reserve(dlc_entries.size()); |
| 533 | std::copy_if(dlc_entries.begin(), dlc_entries.end(), std::back_inserter(dlc_match), | 533 | std::copy_if(dlc_entries.begin(), dlc_entries.end(), std::back_inserter(dlc_match), |
| 534 | [this](const ContentProviderEntry& entry) { | 534 | [this](const ContentProviderEntry& entry) { |
| 535 | return (entry.title_id & DLC_BASE_TITLE_ID_MASK) == title_id && | 535 | return GetBaseTitleID(entry.title_id) == title_id && |
| 536 | content_provider.GetEntry(entry)->GetStatus() == | 536 | content_provider.GetEntry(entry)->GetStatus() == |
| 537 | Loader::ResultStatus::Success; | 537 | Loader::ResultStatus::Success; |
| 538 | }); | 538 | }); |
diff --git a/src/core/file_sys/romfs_factory.cpp b/src/core/file_sys/romfs_factory.cpp index 987199747..f4e16e4be 100644 --- a/src/core/file_sys/romfs_factory.cpp +++ b/src/core/file_sys/romfs_factory.cpp | |||
| @@ -7,6 +7,7 @@ | |||
| 7 | #include "common/common_types.h" | 7 | #include "common/common_types.h" |
| 8 | #include "common/logging/log.h" | 8 | #include "common/logging/log.h" |
| 9 | #include "core/file_sys/card_image.h" | 9 | #include "core/file_sys/card_image.h" |
| 10 | #include "core/file_sys/common_funcs.h" | ||
| 10 | #include "core/file_sys/content_archive.h" | 11 | #include "core/file_sys/content_archive.h" |
| 11 | #include "core/file_sys/nca_metadata.h" | 12 | #include "core/file_sys/nca_metadata.h" |
| 12 | #include "core/file_sys/patch_manager.h" | 13 | #include "core/file_sys/patch_manager.h" |
| @@ -47,6 +48,27 @@ ResultVal<VirtualFile> RomFSFactory::OpenCurrentProcess(u64 current_process_titl | |||
| 47 | patch_manager.PatchRomFS(file, ivfc_offset, ContentRecordType::Program, update_raw)); | 48 | patch_manager.PatchRomFS(file, ivfc_offset, ContentRecordType::Program, update_raw)); |
| 48 | } | 49 | } |
| 49 | 50 | ||
| 51 | ResultVal<VirtualFile> RomFSFactory::OpenPatchedRomFS(u64 title_id, ContentRecordType type) const { | ||
| 52 | auto nca = content_provider.GetEntry(title_id, type); | ||
| 53 | |||
| 54 | if (nca == nullptr) { | ||
| 55 | // TODO: Find the right error code to use here | ||
| 56 | return RESULT_UNKNOWN; | ||
| 57 | } | ||
| 58 | |||
| 59 | const PatchManager patch_manager{title_id, filesystem_controller, content_provider}; | ||
| 60 | |||
| 61 | return MakeResult<VirtualFile>( | ||
| 62 | patch_manager.PatchRomFS(nca->GetRomFS(), nca->GetBaseIVFCOffset(), type)); | ||
| 63 | } | ||
| 64 | |||
| 65 | ResultVal<VirtualFile> RomFSFactory::OpenPatchedRomFSWithProgramIndex( | ||
| 66 | u64 title_id, u8 program_index, ContentRecordType type) const { | ||
| 67 | const auto res_title_id = GetBaseTitleIDWithProgramIndex(title_id, program_index); | ||
| 68 | |||
| 69 | return OpenPatchedRomFS(res_title_id, type); | ||
| 70 | } | ||
| 71 | |||
| 50 | ResultVal<VirtualFile> RomFSFactory::Open(u64 title_id, StorageId storage, | 72 | ResultVal<VirtualFile> RomFSFactory::Open(u64 title_id, StorageId storage, |
| 51 | ContentRecordType type) const { | 73 | ContentRecordType type) const { |
| 52 | const std::shared_ptr<NCA> res = GetEntry(title_id, storage, type); | 74 | const std::shared_ptr<NCA> res = GetEntry(title_id, storage, type); |
diff --git a/src/core/file_sys/romfs_factory.h b/src/core/file_sys/romfs_factory.h index ec704dfa8..96dd0d578 100644 --- a/src/core/file_sys/romfs_factory.h +++ b/src/core/file_sys/romfs_factory.h | |||
| @@ -42,6 +42,10 @@ public: | |||
| 42 | 42 | ||
| 43 | void SetPackedUpdate(VirtualFile update_raw); | 43 | void SetPackedUpdate(VirtualFile update_raw); |
| 44 | [[nodiscard]] ResultVal<VirtualFile> OpenCurrentProcess(u64 current_process_title_id) const; | 44 | [[nodiscard]] ResultVal<VirtualFile> OpenCurrentProcess(u64 current_process_title_id) const; |
| 45 | [[nodiscard]] ResultVal<VirtualFile> OpenPatchedRomFS(u64 title_id, | ||
| 46 | ContentRecordType type) const; | ||
| 47 | [[nodiscard]] ResultVal<VirtualFile> OpenPatchedRomFSWithProgramIndex( | ||
| 48 | u64 title_id, u8 program_index, ContentRecordType type) const; | ||
| 45 | [[nodiscard]] ResultVal<VirtualFile> Open(u64 title_id, StorageId storage, | 49 | [[nodiscard]] ResultVal<VirtualFile> Open(u64 title_id, StorageId storage, |
| 46 | ContentRecordType type) const; | 50 | ContentRecordType type) const; |
| 47 | 51 | ||
diff --git a/src/core/file_sys/system_archive/data/font_nintendo_extended.cpp b/src/core/file_sys/system_archive/data/font_nintendo_extended.cpp index 69d62ce8f..29ef110a6 100644 --- a/src/core/file_sys/system_archive/data/font_nintendo_extended.cpp +++ b/src/core/file_sys/system_archive/data/font_nintendo_extended.cpp | |||
| @@ -6,191 +6,384 @@ | |||
| 6 | 6 | ||
| 7 | namespace FileSys::SystemArchive::SharedFontData { | 7 | namespace FileSys::SystemArchive::SharedFontData { |
| 8 | 8 | ||
| 9 | const std::array<unsigned char, 2932> FONT_NINTENDO_EXTENDED{{ | 9 | const std::array<unsigned char, 6024> FONT_NINTENDO_EXTENDED{{ |
| 10 | 0x00, 0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x80, 0x00, 0x03, 0x00, 0x70, 0x44, 0x53, 0x49, 0x47, | 10 | 0x00, 0x01, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x80, 0x00, 0x03, 0x00, 0x60, 0x4F, 0x53, 0x2F, 0x32, |
| 11 | 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0b, 0x6c, 0x00, 0x00, 0x00, 0x08, 0x4f, 0x53, 0x2f, 0x32, | 11 | 0x34, 0x00, 0x1E, 0x26, 0x00, 0x00, 0x01, 0x68, 0x00, 0x00, 0x00, 0x60, 0x63, 0x6D, 0x61, 0x70, |
| 12 | 0x33, 0x86, 0x1d, 0x9b, 0x00, 0x00, 0x01, 0x78, 0x00, 0x00, 0x00, 0x60, 0x63, 0x6d, 0x61, 0x70, | 12 | 0xC1, 0xE7, 0xC8, 0xF3, 0x00, 0x00, 0x02, 0x0C, 0x00, 0x00, 0x01, 0x72, 0x63, 0x76, 0x74, 0x20, |
| 13 | 0xc2, 0x06, 0x20, 0xde, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x63, 0x76, 0x74, 0x20, | 13 | 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0C, 0x00, 0x00, 0x00, 0x06, 0x66, 0x70, 0x67, 0x6D, |
| 14 | 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x04, 0x2c, 0x00, 0x00, 0x00, 0x06, 0x66, 0x70, 0x67, 0x6d, | 14 | 0x06, 0x59, 0x9C, 0x37, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x01, 0x73, 0x67, 0x61, 0x73, 0x70, |
| 15 | 0x06, 0x59, 0x9c, 0x37, 0x00, 0x00, 0x02, 0xa0, 0x00, 0x00, 0x01, 0x73, 0x67, 0x61, 0x73, 0x70, | 15 | 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x17, 0x80, 0x00, 0x00, 0x00, 0x08, 0x67, 0x6C, 0x79, 0x66, |
| 16 | 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0b, 0x64, 0x00, 0x00, 0x00, 0x08, 0x67, 0x6c, 0x79, 0x66, | 16 | 0x50, 0x0B, 0xEA, 0xFA, 0x00, 0x00, 0x05, 0x50, 0x00, 0x00, 0x0F, 0x04, 0x68, 0x65, 0x61, 0x64, |
| 17 | 0x10, 0x31, 0x88, 0x00, 0x00, 0x00, 0x04, 0x34, 0x00, 0x00, 0x04, 0x64, 0x68, 0x65, 0x61, 0x64, | 17 | 0x18, 0x65, 0x81, 0x09, 0x00, 0x00, 0x00, 0xEC, 0x00, 0x00, 0x00, 0x36, 0x68, 0x68, 0x65, 0x61, |
| 18 | 0x15, 0x9d, 0xef, 0x91, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x36, 0x68, 0x68, 0x65, 0x61, | 18 | 0x09, 0x88, 0x03, 0x86, 0x00, 0x00, 0x01, 0x24, 0x00, 0x00, 0x00, 0x24, 0x68, 0x6D, 0x74, 0x78, |
| 19 | 0x09, 0x60, 0x03, 0x71, 0x00, 0x00, 0x01, 0x34, 0x00, 0x00, 0x00, 0x24, 0x68, 0x6d, 0x74, 0x78, | 19 | 0x0A, 0xF0, 0x01, 0x94, 0x00, 0x00, 0x01, 0xC8, 0x00, 0x00, 0x00, 0x42, 0x6C, 0x6F, 0x63, 0x61, |
| 20 | 0x0d, 0x2e, 0x03, 0xa7, 0x00, 0x00, 0x01, 0xd8, 0x00, 0x00, 0x00, 0x26, 0x6c, 0x6f, 0x63, 0x61, | 20 | 0x34, 0x80, 0x30, 0x6E, 0x00, 0x00, 0x05, 0x14, 0x00, 0x00, 0x00, 0x3A, 0x6D, 0x61, 0x78, 0x70, |
| 21 | 0x05, 0xc0, 0x04, 0x6c, 0x00, 0x00, 0x08, 0x98, 0x00, 0x00, 0x00, 0x1e, 0x6d, 0x61, 0x78, 0x70, | 21 | 0x02, 0x2C, 0x00, 0x72, 0x00, 0x00, 0x01, 0x48, 0x00, 0x00, 0x00, 0x20, 0x6E, 0x61, 0x6D, 0x65, |
| 22 | 0x02, 0x1c, 0x00, 0x5f, 0x00, 0x00, 0x01, 0x58, 0x00, 0x00, 0x00, 0x20, 0x6e, 0x61, 0x6d, 0x65, | 22 | 0xDB, 0xC5, 0x42, 0x4D, 0x00, 0x00, 0x14, 0x54, 0x00, 0x00, 0x01, 0xFE, 0x70, 0x6F, 0x73, 0x74, |
| 23 | 0x7c, 0xe0, 0x84, 0x5c, 0x00, 0x00, 0x08, 0xb8, 0x00, 0x00, 0x02, 0x09, 0x70, 0x6f, 0x73, 0x74, | 23 | 0xF4, 0xB4, 0xAC, 0xAB, 0x00, 0x00, 0x16, 0x54, 0x00, 0x00, 0x01, 0x2A, 0x70, 0x72, 0x65, 0x70, |
| 24 | 0x47, 0x4e, 0x74, 0x19, 0x00, 0x00, 0x0a, 0xc4, 0x00, 0x00, 0x00, 0x9e, 0x70, 0x72, 0x65, 0x70, | 24 | 0x1C, 0xFC, 0x7D, 0x9C, 0x00, 0x00, 0x04, 0xF4, 0x00, 0x00, 0x00, 0x16, 0x00, 0x01, 0x00, 0x00, |
| 25 | 0x1c, 0xfc, 0x7d, 0x9c, 0x00, 0x00, 0x04, 0x14, 0x00, 0x00, 0x00, 0x16, 0x00, 0x01, 0x00, 0x00, | 25 | 0x00, 0x01, 0x00, 0x00, 0xC9, 0x16, 0x5B, 0x71, 0x5F, 0x0F, 0x3C, 0xF5, 0x00, 0x0B, 0x04, 0x00, |
| 26 | 0x00, 0x01, 0x00, 0x00, 0x7c, 0xc7, 0xb1, 0x63, 0x5f, 0x0f, 0x3c, 0xf5, 0x00, 0x1b, 0x03, 0xe8, | 26 | 0x00, 0x00, 0x00, 0x00, 0xD9, 0x44, 0x2F, 0x5D, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x02, 0x0D, 0xA7, |
| 27 | 0x00, 0x00, 0x00, 0x00, 0xd9, 0x44, 0x2f, 0x5d, 0x00, 0x00, 0x00, 0x00, 0xd9, 0x45, 0x7b, 0x69, | 27 | 0x00, 0x14, 0xFF, 0x98, 0x03, 0xEC, 0x03, 0x70, 0x00, 0x00, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, |
| 28 | 0x00, 0x00, 0x00, 0x00, 0x03, 0xe6, 0x03, 0xe8, 0x00, 0x00, 0x00, 0x06, 0x00, 0x02, 0x00, 0x00, | 28 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0x9A, 0xFF, 0x80, 0x02, 0x00, 0x04, 0x00, |
| 29 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0x84, 0xff, 0x83, 0x01, 0xf4, 0x03, 0xe8, | 29 | 0x00, 0x00, 0x00, 0x00, 0x03, 0xEC, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
| 30 | 0x00, 0x00, 0x00, 0x00, 0x03, 0xe6, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | 30 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x71, |
| 31 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x5e, | 31 | 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, |
| 32 | 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, | 32 | 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0xC4, 0x01, 0x90, 0x00, 0x05, |
| 33 | 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x74, 0x01, 0x90, 0x00, 0x05, | 33 | 0x00, 0x04, 0x00, 0xD2, 0x00, 0xD2, 0x00, 0x00, 0x01, 0x26, 0x00, 0xD2, 0x00, 0xD2, 0x00, 0x00, |
| 34 | 0x00, 0x04, 0x00, 0xcd, 0x00, 0xcd, 0x00, 0x00, 0x01, 0x1f, 0x00, 0xcd, 0x00, 0xcd, 0x00, 0x00, | 34 | 0x03, 0xDA, 0x00, 0x68, 0x02, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
| 35 | 0x03, 0xc3, 0x00, 0x66, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
| 36 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | 35 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
| 37 | 0x00, 0x00, 0x20, 0x20, 0x20, 0x20, 0x00, 0xc0, 0x00, 0x00, 0xe0, 0xe9, 0x03, 0x84, 0xff, 0x83, | 36 | 0x00, 0x00, 0x20, 0x20, 0x20, 0x20, 0x00, 0xC0, 0x00, 0x0D, 0xE0, 0xF0, 0x03, 0x9A, 0xFF, 0x80, |
| 38 | 0x01, 0xf4, 0x02, 0xee, 0x00, 0xfa, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x03, 0xe8, | 37 | 0x02, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, |
| 39 | 0x02, 0xbc, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x03, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | 38 | 0x02, 0xCD, 0x00, 0x00, 0x00, 0x20, 0x00, 0x01, 0x04, 0x00, 0x00, 0xA4, 0x00, 0x00, 0x00, 0x00, |
| 40 | 0x00, 0xfa, 0x00, 0x00, 0x00, 0xfa, 0x00, 0x00, 0x03, 0xe8, 0x00, 0xeb, 0x01, 0x21, 0x00, 0xff, | 39 | 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, |
| 41 | 0x00, 0xff, 0x01, 0x3d, 0x01, 0x17, 0x00, 0x42, 0x00, 0x1c, 0x00, 0x3e, 0x00, 0x17, 0x00, 0x00, | 40 | 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, |
| 42 | 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x68, 0x00, 0x01, 0x00, 0x00, | 41 | 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, |
| 43 | 0x00, 0x00, 0x00, 0x1c, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x68, 0x00, 0x06, 0x00, 0x4c, | 42 | 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, |
| 44 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | 43 | 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6C, |
| 44 | 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x04, 0x00, 0x50, 0x00, 0x00, 0x00, 0x10, | ||
| 45 | 0x00, 0x10, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x20, 0xE0, 0xA9, 0xE0, 0xB4, | ||
| 46 | 0xE0, 0xE9, 0xE0, 0xF0, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x20, 0xE0, 0xA0, | ||
| 47 | 0xE0, 0xB3, 0xE0, 0xE0, 0xE0, 0xEF, 0xFF, 0xFF, 0x00, 0x01, 0xFF, 0xF5, 0xFF, 0xE3, 0x1F, 0x64, | ||
| 48 | 0x1F, 0x5B, 0x1F, 0x30, 0x1F, 0x2B, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
| 49 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x00, 0x00, 0x01, 0x00, | ||
| 50 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, | ||
| 51 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0x00, | ||
| 45 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | 52 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
| 46 | 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
| 47 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | 53 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
| 48 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x04, 0x00, 0x38, 0x00, 0x00, 0x00, 0x0a, | ||
| 49 | 0x00, 0x08, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x20, 0xe0, 0xe9, 0xff, 0xff, | ||
| 50 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x20, 0xe0, 0xe0, 0xff, 0xff, 0x00, 0x01, 0xff, 0xf5, | ||
| 51 | 0xff, 0xe3, 0x1f, 0x24, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
| 52 | 0xb8, 0x00, 0x00, 0x2c, 0x4b, 0xb8, 0x00, 0x09, 0x50, 0x58, 0xb1, 0x01, 0x01, 0x8e, 0x59, 0xb8, | ||
| 53 | 0x01, 0xff, 0x85, 0xb8, 0x00, 0x44, 0x1d, 0xb9, 0x00, 0x09, 0x00, 0x03, 0x5f, 0x5e, 0x2d, 0xb8, | ||
| 54 | 0x00, 0x01, 0x2c, 0x20, 0x20, 0x45, 0x69, 0x44, 0xb0, 0x01, 0x60, 0x2d, 0xb8, 0x00, 0x02, 0x2c, | ||
| 55 | 0xb8, 0x00, 0x01, 0x2a, 0x21, 0x2d, 0xb8, 0x00, 0x03, 0x2c, 0x20, 0x46, 0xb0, 0x03, 0x25, 0x46, | ||
| 56 | 0x52, 0x58, 0x23, 0x59, 0x20, 0x8a, 0x20, 0x8a, 0x49, 0x64, 0x8a, 0x20, 0x46, 0x20, 0x68, 0x61, | ||
| 57 | 0x64, 0xb0, 0x04, 0x25, 0x46, 0x20, 0x68, 0x61, 0x64, 0x52, 0x58, 0x23, 0x65, 0x8a, 0x59, 0x2f, | ||
| 58 | 0x20, 0xb0, 0x00, 0x53, 0x58, 0x69, 0x20, 0xb0, 0x00, 0x54, 0x58, 0x21, 0xb0, 0x40, 0x59, 0x1b, | ||
| 59 | 0x69, 0x20, 0xb0, 0x00, 0x54, 0x58, 0x21, 0xb0, 0x40, 0x65, 0x59, 0x59, 0x3a, 0x2d, 0xb8, 0x00, | ||
| 60 | 0x04, 0x2c, 0x20, 0x46, 0xb0, 0x04, 0x25, 0x46, 0x52, 0x58, 0x23, 0x8a, 0x59, 0x20, 0x46, 0x20, | ||
| 61 | 0x6a, 0x61, 0x64, 0xb0, 0x04, 0x25, 0x46, 0x20, 0x6a, 0x61, 0x64, 0x52, 0x58, 0x23, 0x8a, 0x59, | ||
| 62 | 0x2f, 0xfd, 0x2d, 0xb8, 0x00, 0x05, 0x2c, 0x4b, 0x20, 0xb0, 0x03, 0x26, 0x50, 0x58, 0x51, 0x58, | ||
| 63 | 0xb0, 0x80, 0x44, 0x1b, 0xb0, 0x40, 0x44, 0x59, 0x1b, 0x21, 0x21, 0x20, 0x45, 0xb0, 0xc0, 0x50, | ||
| 64 | 0x58, 0xb0, 0xc0, 0x44, 0x1b, 0x21, 0x59, 0x59, 0x2d, 0xb8, 0x00, 0x06, 0x2c, 0x20, 0x20, 0x45, | ||
| 65 | 0x69, 0x44, 0xb0, 0x01, 0x60, 0x20, 0x20, 0x45, 0x7d, 0x69, 0x18, 0x44, 0xb0, 0x01, 0x60, 0x2d, | ||
| 66 | 0xb8, 0x00, 0x07, 0x2c, 0xb8, 0x00, 0x06, 0x2a, 0x2d, 0xb8, 0x00, 0x08, 0x2c, 0x4b, 0x20, 0xb0, | ||
| 67 | 0x03, 0x26, 0x53, 0x58, 0xb0, 0x40, 0x1b, 0xb0, 0x00, 0x59, 0x8a, 0x8a, 0x20, 0xb0, 0x03, 0x26, | ||
| 68 | 0x53, 0x58, 0x23, 0x21, 0xb0, 0x80, 0x8a, 0x8a, 0x1b, 0x8a, 0x23, 0x59, 0x20, 0xb0, 0x03, 0x26, | ||
| 69 | 0x53, 0x58, 0x23, 0x21, 0xb8, 0x00, 0xc0, 0x8a, 0x8a, 0x1b, 0x8a, 0x23, 0x59, 0x20, 0xb0, 0x03, | ||
| 70 | 0x26, 0x53, 0x58, 0x23, 0x21, 0xb8, 0x01, 0x00, 0x8a, 0x8a, 0x1b, 0x8a, 0x23, 0x59, 0x20, 0xb0, | ||
| 71 | 0x03, 0x26, 0x53, 0x58, 0x23, 0x21, 0xb8, 0x01, 0x40, 0x8a, 0x8a, 0x1b, 0x8a, 0x23, 0x59, 0x20, | ||
| 72 | 0xb8, 0x00, 0x03, 0x26, 0x53, 0x58, 0xb0, 0x03, 0x25, 0x45, 0xb8, 0x01, 0x80, 0x50, 0x58, 0x23, | ||
| 73 | 0x21, 0xb8, 0x01, 0x80, 0x23, 0x21, 0x1b, 0xb0, 0x03, 0x25, 0x45, 0x23, 0x21, 0x23, 0x21, 0x59, | ||
| 74 | 0x1b, 0x21, 0x59, 0x44, 0x2d, 0xb8, 0x00, 0x09, 0x2c, 0x4b, 0x53, 0x58, 0x45, 0x44, 0x1b, 0x21, | ||
| 75 | 0x21, 0x59, 0x2d, 0x00, 0xb8, 0x00, 0x00, 0x2b, 0x00, 0xba, 0x00, 0x01, 0x00, 0x01, 0x00, 0x07, | ||
| 76 | 0x2b, 0xb8, 0x00, 0x00, 0x20, 0x45, 0x7d, 0x69, 0x18, 0x44, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, | ||
| 77 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x03, 0xe6, 0x03, 0xe8, 0x00, 0x06, | ||
| 78 | 0x00, 0x00, 0x35, 0x01, 0x33, 0x15, 0x01, 0x23, 0x35, 0x03, 0x52, 0x94, 0xfc, 0xa6, 0x8c, 0x90, | ||
| 79 | 0x03, 0x58, 0x86, 0xfc, 0xa0, 0x8e, 0x00, 0x00, 0x00, 0x02, 0x00, 0xeb, 0x00, 0xcc, 0x02, 0xfb, | ||
| 80 | 0x03, 0x1e, 0x00, 0x08, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x33, 0x13, 0x23, 0x27, 0x23, 0x07, 0x23, | ||
| 81 | 0x13, 0x17, 0x07, 0x06, 0x15, 0x33, 0x27, 0x07, 0x01, 0xbc, 0x6d, 0xd2, 0x7c, 0x26, 0xcc, 0x26, | ||
| 82 | 0x7c, 0xd1, 0x35, 0x40, 0x02, 0x89, 0x45, 0x02, 0x03, 0x1e, 0xfd, 0xae, 0x77, 0x77, 0x02, 0x52, | ||
| 83 | 0x9b, 0xcc, 0x08, 0x04, 0xda, 0x02, 0x00, 0x00, 0x00, 0x03, 0x01, 0x21, 0x00, 0xcc, 0x02, 0xc5, | ||
| 84 | 0x03, 0x1e, 0x00, 0x15, 0x00, 0x1f, 0x00, 0x2b, 0x00, 0x00, 0x25, 0x11, 0x33, 0x32, 0x1e, 0x02, | ||
| 85 | 0x15, 0x14, 0x0e, 0x02, 0x07, 0x1e, 0x01, 0x15, 0x14, 0x0e, 0x02, 0x2b, 0x01, 0x13, 0x33, 0x32, | ||
| 86 | 0x36, 0x35, 0x34, 0x26, 0x2b, 0x01, 0x1d, 0x01, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x26, 0x2b, | ||
| 87 | 0x01, 0x15, 0x01, 0x21, 0xea, 0x25, 0x3f, 0x2e, 0x1a, 0x0e, 0x15, 0x1b, 0x0e, 0x2d, 0x2d, 0x1a, | ||
| 88 | 0x2e, 0x3f, 0x25, 0xf8, 0x76, 0x62, 0x20, 0x2a, 0x28, 0x22, 0x62, 0x76, 0x10, 0x18, 0x11, 0x09, | ||
| 89 | 0x22, 0x22, 0x74, 0xcc, 0x02, 0x52, 0x18, 0x2b, 0x3c, 0x24, 0x1d, 0x1f, 0x17, 0x17, 0x14, 0x0f, | ||
| 90 | 0x48, 0x2f, 0x24, 0x3f, 0x2e, 0x1a, 0x01, 0x5b, 0x29, 0x20, 0x20, 0x2b, 0x94, 0xf8, 0x0e, 0x16, | ||
| 91 | 0x1c, 0x0e, 0x1f, 0x31, 0x9e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0x00, 0xcc, 0x02, 0xe7, | ||
| 92 | 0x03, 0x1e, 0x00, 0x0c, 0x00, 0x00, 0x01, 0x33, 0x17, 0x37, 0x33, 0x03, 0x13, 0x23, 0x27, 0x07, | ||
| 93 | 0x23, 0x13, 0x03, 0x01, 0x04, 0x86, 0x69, 0x69, 0x86, 0xa3, 0xa8, 0x88, 0x6c, 0x6c, 0x88, 0xa8, | ||
| 94 | 0xa3, 0x03, 0x1e, 0xcb, 0xcb, 0xfe, 0xda, 0xfe, 0xd4, 0xcf, 0xcf, 0x01, 0x2c, 0x01, 0x26, 0x00, | ||
| 95 | 0x00, 0x01, 0x00, 0xff, 0x00, 0xcc, 0x02, 0xe7, 0x03, 0x1e, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x03, | ||
| 96 | 0x33, 0x17, 0x32, 0x15, 0x1e, 0x01, 0x15, 0x1b, 0x01, 0x33, 0x03, 0x15, 0x23, 0x35, 0x01, 0xb8, | ||
| 97 | 0xb9, 0x7e, 0x01, 0x01, 0x01, 0x03, 0x70, 0x75, 0x7f, 0xb9, 0x76, 0x01, 0xa3, 0x01, 0x7b, 0x01, | ||
| 98 | 0x01, 0x01, 0x05, 0x02, 0xff, 0x00, 0x01, 0x0a, 0xfe, 0x85, 0xd7, 0xd7, 0x00, 0x01, 0x01, 0x3d, | ||
| 99 | 0x00, 0xcc, 0x02, 0xa9, 0x03, 0x1e, 0x00, 0x06, 0x00, 0x00, 0x25, 0x11, 0x33, 0x11, 0x33, 0x15, | ||
| 100 | 0x21, 0x01, 0x3d, 0x75, 0xf7, 0xfe, 0x94, 0xcc, 0x02, 0x52, 0xfe, 0x10, 0x62, 0x00, 0x00, 0x00, | ||
| 101 | 0x00, 0x02, 0x01, 0x17, 0x00, 0xbc, 0x02, 0xcf, 0x03, 0x0e, 0x00, 0x15, 0x00, 0x21, 0x00, 0x00, | ||
| 102 | 0x25, 0x11, 0x33, 0x32, 0x1e, 0x02, 0x1d, 0x01, 0x0e, 0x03, 0x1d, 0x01, 0x17, 0x15, 0x23, 0x27, | ||
| 103 | 0x23, 0x15, 0x23, 0x13, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x26, 0x2b, 0x01, 0x15, 0x01, 0x17, | ||
| 104 | 0xf4, 0x27, 0x40, 0x2e, 0x19, 0x01, 0x1f, 0x24, 0x1e, 0x78, 0x7d, 0x6a, 0x5c, 0x75, 0x76, 0x72, | ||
| 105 | 0x12, 0x19, 0x11, 0x08, 0x26, 0x26, 0x6a, 0xbc, 0x02, 0x52, 0x1d, 0x31, 0x42, 0x25, 0x16, 0x18, | ||
| 106 | 0x32, 0x2a, 0x1b, 0x02, 0x01, 0xef, 0x06, 0xd7, 0xd7, 0x01, 0x3f, 0x10, 0x1a, 0x1e, 0x0f, 0x23, | ||
| 107 | 0x36, 0xb0, 0x00, 0x00, 0x00, 0x02, 0x00, 0x42, 0x00, 0xbc, 0x03, 0xa4, 0x03, 0x0e, 0x00, 0x0a, | ||
| 108 | 0x00, 0x11, 0x00, 0x00, 0x13, 0x35, 0x21, 0x15, 0x01, 0x21, 0x15, 0x21, 0x35, 0x01, 0x21, 0x01, | ||
| 109 | 0x11, 0x33, 0x11, 0x33, 0x15, 0x21, 0x42, 0x01, 0xa7, 0xfe, 0xeb, 0x01, 0x1b, 0xfe, 0x53, 0x01, | ||
| 110 | 0x15, 0xfe, 0xeb, 0x01, 0xf7, 0x75, 0xf6, 0xfe, 0x95, 0x02, 0xac, 0x62, 0x45, 0xfe, 0x55, 0x62, | ||
| 111 | 0x47, 0x01, 0xa9, 0xfe, 0x10, 0x02, 0x52, 0xfe, 0x10, 0x62, 0x00, 0x00, 0x00, 0x03, 0x00, 0x1c, | ||
| 112 | 0x00, 0xbc, 0x03, 0xca, 0x03, 0x0e, 0x00, 0x0a, 0x00, 0x21, 0x00, 0x2f, 0x00, 0x00, 0x13, 0x35, | ||
| 113 | 0x21, 0x15, 0x01, 0x21, 0x15, 0x21, 0x35, 0x01, 0x21, 0x01, 0x11, 0x33, 0x32, 0x1e, 0x02, 0x15, | ||
| 114 | 0x14, 0x06, 0x07, 0x0e, 0x03, 0x15, 0x17, 0x15, 0x23, 0x27, 0x23, 0x15, 0x23, 0x13, 0x33, 0x32, | ||
| 115 | 0x3e, 0x02, 0x35, 0x34, 0x2e, 0x02, 0x2b, 0x01, 0x15, 0x1c, 0x01, 0xa7, 0xfe, 0xeb, 0x01, 0x1b, | ||
| 116 | 0xfe, 0x53, 0x01, 0x15, 0xfe, 0xeb, 0x01, 0xf7, 0xf3, 0x27, 0x41, 0x2d, 0x19, 0x1c, 0x20, 0x01, | ||
| 117 | 0x0d, 0x0e, 0x0a, 0x78, 0x7d, 0x69, 0x5c, 0x75, 0x76, 0x71, 0x11, 0x1a, 0x12, 0x09, 0x0a, 0x14, | ||
| 118 | 0x1d, 0x13, 0x69, 0x02, 0xac, 0x62, 0x45, 0xfe, 0x55, 0x62, 0x47, 0x01, 0xa9, 0xfe, 0x10, 0x02, | ||
| 119 | 0x52, 0x1d, 0x31, 0x42, 0x25, 0x2b, 0x44, 0x1d, 0x01, 0x08, 0x09, 0x07, 0x01, 0xf1, 0x06, 0xd7, | ||
| 120 | 0xd7, 0x01, 0x3f, 0x11, 0x19, 0x1f, 0x0e, 0x11, 0x20, 0x19, 0x0f, 0xb0, 0x00, 0x02, 0x00, 0x3e, | ||
| 121 | 0x00, 0xb3, 0x03, 0xa8, 0x03, 0x17, 0x00, 0x3a, 0x00, 0x41, 0x00, 0x00, 0x13, 0x34, 0x3e, 0x02, | ||
| 122 | 0x33, 0x32, 0x1e, 0x02, 0x15, 0x23, 0x27, 0x34, 0x27, 0x2e, 0x01, 0x23, 0x22, 0x0e, 0x02, 0x15, | ||
| 123 | 0x14, 0x16, 0x15, 0x1e, 0x05, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x33, 0x1e, | ||
| 124 | 0x01, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x2e, 0x04, 0x35, 0x01, 0x11, 0x33, 0x11, 0x33, 0x15, | ||
| 125 | 0x21, 0x50, 0x24, 0x3b, 0x4a, 0x27, 0x28, 0x4b, 0x39, 0x22, 0x73, 0x01, 0x01, 0x08, 0x2b, 0x29, | ||
| 126 | 0x10, 0x20, 0x19, 0x0f, 0x01, 0x0b, 0x35, 0x41, 0x46, 0x3b, 0x25, 0x23, 0x3a, 0x4b, 0x27, 0x2b, | ||
| 127 | 0x50, 0x3f, 0x26, 0x74, 0x05, 0x34, 0x33, 0x10, 0x20, 0x1a, 0x11, 0x2c, 0x42, 0x4d, 0x42, 0x2c, | ||
| 128 | 0x01, 0xef, 0x73, 0xf6, 0xfe, 0x97, 0x02, 0x70, 0x2a, 0x3f, 0x2a, 0x14, 0x18, 0x2e, 0x44, 0x2c, | ||
| 129 | 0x02, 0x03, 0x01, 0x27, 0x27, 0x07, 0x10, 0x1a, 0x12, 0x02, 0x0b, 0x02, 0x1f, 0x22, 0x19, 0x17, | ||
| 130 | 0x27, 0x3f, 0x34, 0x2c, 0x3e, 0x28, 0x13, 0x1a, 0x32, 0x48, 0x2e, 0x30, 0x30, 0x06, 0x0f, 0x1a, | ||
| 131 | 0x13, 0x21, 0x27, 0x1e, 0x1b, 0x29, 0x3e, 0x31, 0xfe, 0x4c, 0x02, 0x53, 0xfe, 0x10, 0x63, 0x00, | ||
| 132 | 0x00, 0x03, 0x00, 0x17, 0x00, 0xb3, 0x03, 0xce, 0x03, 0x17, 0x00, 0x38, 0x00, 0x4f, 0x00, 0x5d, | ||
| 133 | 0x00, 0x00, 0x13, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x23, 0x27, 0x34, 0x23, 0x2e, | ||
| 134 | 0x01, 0x23, 0x22, 0x0e, 0x02, 0x15, 0x14, 0x1e, 0x04, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, | ||
| 135 | 0x02, 0x35, 0x33, 0x1e, 0x01, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x26, 0x27, 0x2e, 0x03, 0x35, | ||
| 136 | 0x01, 0x11, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x07, 0x30, 0x0e, 0x02, 0x31, 0x17, 0x15, | ||
| 137 | 0x23, 0x27, 0x23, 0x15, 0x23, 0x13, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x2e, 0x02, 0x2b, 0x01, | ||
| 138 | 0x15, 0x2a, 0x24, 0x3a, 0x4a, 0x26, 0x29, 0x4b, 0x39, 0x23, 0x73, 0x01, 0x01, 0x08, 0x2a, 0x2a, | ||
| 139 | 0x10, 0x1f, 0x1a, 0x10, 0x2c, 0x42, 0x4d, 0x42, 0x2c, 0x23, 0x39, 0x4b, 0x27, 0x2b, 0x51, 0x3f, | ||
| 140 | 0x27, 0x75, 0x05, 0x34, 0x33, 0x10, 0x20, 0x1a, 0x10, 0x1f, 0x1c, 0x25, 0x53, 0x47, 0x2e, 0x01, | ||
| 141 | 0xed, 0xf3, 0x27, 0x41, 0x2d, 0x19, 0x1c, 0x20, 0x0c, 0x0e, 0x0c, 0x78, 0x7d, 0x68, 0x5d, 0x75, | ||
| 142 | 0x76, 0x71, 0x11, 0x1a, 0x12, 0x09, 0x0a, 0x14, 0x1d, 0x13, 0x69, 0x02, 0x71, 0x2a, 0x3e, 0x2a, | ||
| 143 | 0x14, 0x18, 0x2e, 0x44, 0x2c, 0x02, 0x02, 0x27, 0x29, 0x07, 0x11, 0x1a, 0x12, 0x1d, 0x24, 0x1c, | ||
| 144 | 0x1d, 0x2b, 0x40, 0x32, 0x2c, 0x3f, 0x29, 0x13, 0x1a, 0x31, 0x49, 0x2e, 0x30, 0x30, 0x06, 0x0f, | ||
| 145 | 0x19, 0x13, 0x1e, 0x22, 0x0b, 0x0e, 0x20, 0x2f, 0x43, 0x30, 0xfe, 0x4b, 0x02, 0x52, 0x1d, 0x32, | ||
| 146 | 0x42, 0x25, 0x2c, 0x42, 0x1d, 0x08, 0x0a, 0x08, 0xf1, 0x06, 0xd7, 0xd7, 0x01, 0x3f, 0x11, 0x19, | ||
| 147 | 0x1f, 0x0e, 0x11, 0x20, 0x19, 0x0f, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x12, 0x00, 0x12, | ||
| 148 | 0x00, 0x12, 0x00, 0x32, 0x00, 0x72, 0x00, 0x8e, 0x00, 0xac, 0x00, 0xbe, 0x00, 0xf0, 0x01, 0x14, | ||
| 149 | 0x01, 0x5c, 0x01, 0xb6, 0x02, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0xa2, 0x00, 0x01, | ||
| 150 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, | ||
| 151 | 0x00, 0x02, 0x00, 0x07, 0x00, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x2f, | ||
| 152 | 0x00, 0x17, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x12, 0x00, 0x46, 0x00, 0x01, | ||
| 153 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x0d, 0x00, 0x58, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, | ||
| 154 | 0x00, 0x06, 0x00, 0x12, 0x00, 0x65, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x01, 0x00, 0x20, | ||
| 155 | 0x00, 0x77, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x02, 0x00, 0x0e, 0x00, 0x97, 0x00, 0x03, | ||
| 156 | 0x00, 0x01, 0x04, 0x09, 0x00, 0x03, 0x00, 0x5e, 0x00, 0xa5, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, | ||
| 157 | 0x00, 0x04, 0x00, 0x24, 0x01, 0x03, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x05, 0x00, 0x1a, | ||
| 158 | 0x01, 0x27, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x06, 0x00, 0x24, 0x01, 0x41, 0x00, 0x03, | ||
| 159 | 0x00, 0x01, 0x04, 0x09, 0x00, 0x11, 0x00, 0x02, 0x01, 0x65, 0x59, 0x75, 0x7a, 0x75, 0x4f, 0x53, | ||
| 160 | 0x53, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x67, 0x75, 0x6c, 0x61, | ||
| 161 | 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x31, 0x2e, 0x30, 0x30, 0x30, 0x3b, 0x3b, | ||
| 162 | 0x59, 0x75, 0x7a, 0x75, 0x4f, 0x53, 0x53, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, | ||
| 163 | 0x2d, 0x52, 0x3b, 0x32, 0x30, 0x31, 0x39, 0x3b, 0x46, 0x4c, 0x56, 0x49, 0x2d, 0x36, 0x31, 0x34, | ||
| 164 | 0x59, 0x75, 0x7a, 0x75, 0x4f, 0x53, 0x53, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, | ||
| 165 | 0x20, 0x52, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x31, 0x2e, 0x30, 0x30, 0x30, 0x59, | ||
| 166 | 0x75, 0x7a, 0x75, 0x4f, 0x53, 0x53, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2d, | ||
| 167 | 0x52, 0x00, 0x59, 0x00, 0x75, 0x00, 0x7a, 0x00, 0x75, 0x00, 0x4f, 0x00, 0x53, 0x00, 0x53, 0x00, | ||
| 168 | 0x45, 0x00, 0x78, 0x00, 0x74, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6f, 0x00, | ||
| 169 | 0x6e, 0x00, 0x52, 0x00, 0x65, 0x00, 0x67, 0x00, 0x75, 0x00, 0x6c, 0x00, 0x61, 0x00, 0x72, 0x00, | ||
| 170 | 0x56, 0x00, 0x65, 0x00, 0x72, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x20, 0x00, | ||
| 171 | 0x31, 0x00, 0x2e, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x3b, 0x00, 0x3b, 0x00, 0x59, 0x00, | ||
| 172 | 0x75, 0x00, 0x7a, 0x00, 0x75, 0x00, 0x4f, 0x00, 0x53, 0x00, 0x53, 0x00, 0x45, 0x00, 0x78, 0x00, | ||
| 173 | 0x74, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x2d, 0x00, | ||
| 174 | 0x52, 0x00, 0x3b, 0x00, 0x32, 0x00, 0x30, 0x00, 0x31, 0x00, 0x39, 0x00, 0x3b, 0x00, 0x46, 0x00, | ||
| 175 | 0x4c, 0x00, 0x56, 0x00, 0x49, 0x00, 0x2d, 0x00, 0x36, 0x00, 0x31, 0x00, 0x34, 0x00, 0x59, 0x00, | ||
| 176 | 0x75, 0x00, 0x7a, 0x00, 0x75, 0x00, 0x4f, 0x00, 0x53, 0x00, 0x53, 0x00, 0x45, 0x00, 0x78, 0x00, | ||
| 177 | 0x74, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x20, 0x00, | ||
| 178 | 0x52, 0x00, 0x56, 0x00, 0x65, 0x00, 0x72, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, | ||
| 179 | 0x20, 0x00, 0x31, 0x00, 0x2e, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x59, 0x00, 0x75, 0x00, | ||
| 180 | 0x7a, 0x00, 0x75, 0x00, 0x4f, 0x00, 0x53, 0x00, 0x53, 0x00, 0x45, 0x00, 0x78, 0x00, 0x74, 0x00, | ||
| 181 | 0x65, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x2d, 0x00, 0x52, 0x00, | ||
| 182 | 0x52, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x9c, 0x00, 0x32, | ||
| 183 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | 54 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
| 184 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x01, 0x02, 0x01, 0x03, 0x00, 0x03, 0x01, 0x04, | 55 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
| 185 | 0x01, 0x05, 0x01, 0x06, 0x01, 0x07, 0x01, 0x08, 0x01, 0x09, 0x01, 0x0a, 0x01, 0x0b, 0x01, 0x0c, | 56 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
| 186 | 0x01, 0x0d, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x30, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x30, | 57 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
| 187 | 0x30, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x45, 0x30, 0x45, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x45, 0x30, | 58 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
| 188 | 0x45, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x45, 0x30, 0x45, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x45, 0x30, | 59 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
| 189 | 0x45, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x45, 0x30, 0x45, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x45, 0x30, | 60 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
| 190 | 0x45, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x45, 0x30, 0x45, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x45, 0x30, | 61 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
| 191 | 0x45, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x45, 0x30, 0x45, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x45, 0x30, | 62 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
| 192 | 0x45, 0x39, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0xff, 0xff, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x01, | 63 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
| 193 | 0x00, 0x00, 0x00, 0x00, | 64 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
| 65 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
| 66 | 0xB8, 0x00, 0x00, 0x2C, 0x4B, 0xB8, 0x00, 0x09, 0x50, 0x58, 0xB1, 0x01, 0x01, 0x8E, 0x59, 0xB8, | ||
| 67 | 0x01, 0xFF, 0x85, 0xB8, 0x00, 0x44, 0x1D, 0xB9, 0x00, 0x09, 0x00, 0x03, 0x5F, 0x5E, 0x2D, 0xB8, | ||
| 68 | 0x00, 0x01, 0x2C, 0x20, 0x20, 0x45, 0x69, 0x44, 0xB0, 0x01, 0x60, 0x2D, 0xB8, 0x00, 0x02, 0x2C, | ||
| 69 | 0xB8, 0x00, 0x01, 0x2A, 0x21, 0x2D, 0xB8, 0x00, 0x03, 0x2C, 0x20, 0x46, 0xB0, 0x03, 0x25, 0x46, | ||
| 70 | 0x52, 0x58, 0x23, 0x59, 0x20, 0x8A, 0x20, 0x8A, 0x49, 0x64, 0x8A, 0x20, 0x46, 0x20, 0x68, 0x61, | ||
| 71 | 0x64, 0xB0, 0x04, 0x25, 0x46, 0x20, 0x68, 0x61, 0x64, 0x52, 0x58, 0x23, 0x65, 0x8A, 0x59, 0x2F, | ||
| 72 | 0x20, 0xB0, 0x00, 0x53, 0x58, 0x69, 0x20, 0xB0, 0x00, 0x54, 0x58, 0x21, 0xB0, 0x40, 0x59, 0x1B, | ||
| 73 | 0x69, 0x20, 0xB0, 0x00, 0x54, 0x58, 0x21, 0xB0, 0x40, 0x65, 0x59, 0x59, 0x3A, 0x2D, 0xB8, 0x00, | ||
| 74 | 0x04, 0x2C, 0x20, 0x46, 0xB0, 0x04, 0x25, 0x46, 0x52, 0x58, 0x23, 0x8A, 0x59, 0x20, 0x46, 0x20, | ||
| 75 | 0x6A, 0x61, 0x64, 0xB0, 0x04, 0x25, 0x46, 0x20, 0x6A, 0x61, 0x64, 0x52, 0x58, 0x23, 0x8A, 0x59, | ||
| 76 | 0x2F, 0xFD, 0x2D, 0xB8, 0x00, 0x05, 0x2C, 0x4B, 0x20, 0xB0, 0x03, 0x26, 0x50, 0x58, 0x51, 0x58, | ||
| 77 | 0xB0, 0x80, 0x44, 0x1B, 0xB0, 0x40, 0x44, 0x59, 0x1B, 0x21, 0x21, 0x20, 0x45, 0xB0, 0xC0, 0x50, | ||
| 78 | 0x58, 0xB0, 0xC0, 0x44, 0x1B, 0x21, 0x59, 0x59, 0x2D, 0xB8, 0x00, 0x06, 0x2C, 0x20, 0x20, 0x45, | ||
| 79 | 0x69, 0x44, 0xB0, 0x01, 0x60, 0x20, 0x20, 0x45, 0x7D, 0x69, 0x18, 0x44, 0xB0, 0x01, 0x60, 0x2D, | ||
| 80 | 0xB8, 0x00, 0x07, 0x2C, 0xB8, 0x00, 0x06, 0x2A, 0x2D, 0xB8, 0x00, 0x08, 0x2C, 0x4B, 0x20, 0xB0, | ||
| 81 | 0x03, 0x26, 0x53, 0x58, 0xB0, 0x40, 0x1B, 0xB0, 0x00, 0x59, 0x8A, 0x8A, 0x20, 0xB0, 0x03, 0x26, | ||
| 82 | 0x53, 0x58, 0x23, 0x21, 0xB0, 0x80, 0x8A, 0x8A, 0x1B, 0x8A, 0x23, 0x59, 0x20, 0xB0, 0x03, 0x26, | ||
| 83 | 0x53, 0x58, 0x23, 0x21, 0xB8, 0x00, 0xC0, 0x8A, 0x8A, 0x1B, 0x8A, 0x23, 0x59, 0x20, 0xB0, 0x03, | ||
| 84 | 0x26, 0x53, 0x58, 0x23, 0x21, 0xB8, 0x01, 0x00, 0x8A, 0x8A, 0x1B, 0x8A, 0x23, 0x59, 0x20, 0xB0, | ||
| 85 | 0x03, 0x26, 0x53, 0x58, 0x23, 0x21, 0xB8, 0x01, 0x40, 0x8A, 0x8A, 0x1B, 0x8A, 0x23, 0x59, 0x20, | ||
| 86 | 0xB8, 0x00, 0x03, 0x26, 0x53, 0x58, 0xB0, 0x03, 0x25, 0x45, 0xB8, 0x01, 0x80, 0x50, 0x58, 0x23, | ||
| 87 | 0x21, 0xB8, 0x01, 0x80, 0x23, 0x21, 0x1B, 0xB0, 0x03, 0x25, 0x45, 0x23, 0x21, 0x23, 0x21, 0x59, | ||
| 88 | 0x1B, 0x21, 0x59, 0x44, 0x2D, 0xB8, 0x00, 0x09, 0x2C, 0x4B, 0x53, 0x58, 0x45, 0x44, 0x1B, 0x21, | ||
| 89 | 0x21, 0x59, 0x2D, 0x00, 0xB8, 0x00, 0x00, 0x2B, 0x00, 0xBA, 0x00, 0x01, 0x00, 0x01, 0x00, 0x07, | ||
| 90 | 0x2B, 0xB8, 0x00, 0x00, 0x20, 0x45, 0x7D, 0x69, 0x18, 0x44, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, | ||
| 91 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x70, | ||
| 92 | 0x00, 0xDC, 0x01, 0x34, 0x01, 0x7C, 0x01, 0xA2, 0x01, 0xF4, 0x02, 0x3C, 0x02, 0xA8, 0x03, 0x4C, | ||
| 93 | 0x03, 0xE2, 0x04, 0x20, 0x04, 0x58, 0x04, 0x9A, 0x04, 0xEE, 0x05, 0x32, 0x05, 0x64, 0x05, 0x80, | ||
| 94 | 0x05, 0xC6, 0x05, 0xF6, 0x06, 0x54, 0x06, 0xB2, 0x07, 0x38, 0x07, 0x60, 0x07, 0x82, 0x00, 0x00, | ||
| 95 | 0x00, 0x02, 0x00, 0xA4, 0xFF, 0xFF, 0x03, 0x5C, 0x03, 0x09, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, | ||
| 96 | 0x13, 0x11, 0x21, 0x11, 0x25, 0x21, 0x11, 0x21, 0xCD, 0x02, 0x66, 0xFD, 0x71, 0x02, 0xB8, 0xFD, | ||
| 97 | 0x48, 0x02, 0xE0, 0xFD, 0x48, 0x02, 0xB8, 0x29, 0xFC, 0xF6, 0x00, 0x00, 0x00, 0x04, 0x00, 0x14, | ||
| 98 | 0xFF, 0x98, 0x03, 0xEC, 0x03, 0x70, 0x00, 0x0F, 0x00, 0x1F, 0x00, 0x2F, 0x00, 0x39, 0x00, 0x00, | ||
| 99 | 0x00, 0x22, 0x0E, 0x02, 0x14, 0x1E, 0x02, 0x32, 0x3E, 0x02, 0x34, 0x2E, 0x01, 0x24, 0x32, 0x1E, | ||
| 100 | 0x02, 0x14, 0x0E, 0x02, 0x22, 0x2E, 0x02, 0x34, 0x3E, 0x01, 0x13, 0x12, 0x37, 0x33, 0x13, 0x12, | ||
| 101 | 0x15, 0x16, 0x23, 0x2F, 0x01, 0x23, 0x07, 0x23, 0x22, 0x26, 0x25, 0x30, 0x27, 0x26, 0x2F, 0x01, | ||
| 102 | 0x06, 0x07, 0x06, 0x32, 0x02, 0x5A, 0xB4, 0xA4, 0x77, 0x46, 0x46, 0x77, 0xA4, 0xB4, 0xA4, 0x77, | ||
| 103 | 0x46, 0x46, 0x77, 0xFE, 0x9E, 0xC8, 0xB7, 0x83, 0x4E, 0x4E, 0x83, 0xB7, 0xC8, 0xB7, 0x83, 0x4E, | ||
| 104 | 0x4E, 0x83, 0x23, 0x6C, 0x5E, 0x6D, 0x68, 0x68, 0x01, 0x39, 0x38, 0x2E, 0xD1, 0x2B, 0x37, 0x33, | ||
| 105 | 0x04, 0x01, 0x48, 0x1D, 0x1C, 0x0A, 0x05, 0x01, 0x45, 0x01, 0x89, 0x03, 0x3F, 0x46, 0x77, 0xA4, | ||
| 106 | 0xB4, 0xA4, 0x77, 0x46, 0x46, 0x77, 0xA4, 0xB4, 0xA4, 0x77, 0x77, 0x4E, 0x83, 0xB7, 0xC8, 0xB7, | ||
| 107 | 0x83, 0x4E, 0x4E, 0x83, 0xB7, 0xC8, 0xB7, 0x83, 0xFD, 0x64, 0x01, 0x1A, 0xEB, 0xFE, 0xFE, 0xFE, | ||
| 108 | 0xFD, 0x03, 0x01, 0x01, 0x77, 0x78, 0x01, 0xCF, 0x4C, 0x4C, 0x1C, 0x0C, 0x02, 0xBE, 0x02, 0x00, | ||
| 109 | 0x00, 0x05, 0x00, 0x14, 0xFF, 0x98, 0x03, 0xEC, 0x03, 0x70, 0x00, 0x0F, 0x00, 0x1B, 0x00, 0x2F, | ||
| 110 | 0x00, 0x3A, 0x00, 0x44, 0x00, 0x00, 0x12, 0x14, 0x1E, 0x02, 0x32, 0x3E, 0x02, 0x34, 0x2E, 0x02, | ||
| 111 | 0x22, 0x0E, 0x01, 0x02, 0x10, 0x3E, 0x01, 0x20, 0x1E, 0x01, 0x10, 0x0E, 0x01, 0x20, 0x26, 0x01, | ||
| 112 | 0x16, 0x17, 0x14, 0x06, 0x07, 0x06, 0x2B, 0x01, 0x19, 0x01, 0x17, 0x32, 0x17, 0x16, 0x17, 0x16, | ||
| 113 | 0x07, 0x06, 0x0F, 0x01, 0x36, 0x37, 0x34, 0x2E, 0x01, 0x27, 0x23, 0x15, 0x33, 0x32, 0x27, 0x32, | ||
| 114 | 0x37, 0x36, 0x26, 0x27, 0x26, 0x2B, 0x01, 0x15, 0x45, 0x46, 0x77, 0xA4, 0xB4, 0xA4, 0x77, 0x46, | ||
| 115 | 0x46, 0x77, 0xA4, 0xB4, 0xA4, 0x77, 0x77, 0x84, 0xE2, 0x01, 0x0C, 0xE2, 0x84, 0x84, 0xE2, 0xFE, | ||
| 116 | 0xF4, 0xE2, 0x01, 0xF7, 0x61, 0x01, 0x4E, 0x3E, 0x29, 0xAF, 0x4E, 0x81, 0x8B, 0x1D, 0x3C, 0x1F, | ||
| 117 | 0x19, 0x04, 0x06, 0x39, 0x57, 0x44, 0x01, 0x1B, 0x2D, 0x51, 0x46, 0x46, 0x47, 0x66, 0x70, 0x16, | ||
| 118 | 0x1F, 0x01, 0x2C, 0x08, 0x4B, 0x4C, 0x01, 0xDE, 0xB4, 0xA4, 0x77, 0x46, 0x46, 0x77, 0xA4, 0xB4, | ||
| 119 | 0xA4, 0x77, 0x46, 0x46, 0x77, 0xFE, 0x7C, 0x01, 0x0C, 0xE2, 0x84, 0x84, 0xE2, 0xFE, 0xF4, 0xE2, | ||
| 120 | 0x84, 0x84, 0x01, 0x6D, 0x21, 0x5B, 0x40, 0x50, 0x05, 0x03, 0x01, 0x03, 0x01, 0x05, 0x01, 0x05, | ||
| 121 | 0x09, 0x30, 0x25, 0x29, 0x40, 0x21, 0xC2, 0x06, 0x3E, 0x1A, 0x21, 0x0B, 0x01, 0x8C, 0xE1, 0x0A, | ||
| 122 | 0x0E, 0x54, 0x0B, 0x02, 0x79, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x14, 0xFF, 0x98, 0x03, 0xEC, | ||
| 123 | 0x03, 0x70, 0x00, 0x0F, 0x00, 0x1B, 0x00, 0x38, 0x00, 0x00, 0x12, 0x14, 0x1E, 0x02, 0x32, 0x3E, | ||
| 124 | 0x02, 0x34, 0x2E, 0x02, 0x22, 0x0E, 0x01, 0x02, 0x10, 0x3E, 0x01, 0x20, 0x1E, 0x01, 0x10, 0x0E, | ||
| 125 | 0x01, 0x20, 0x26, 0x36, 0x34, 0x3F, 0x01, 0x27, 0x26, 0x27, 0x33, 0x17, 0x16, 0x33, 0x36, 0x3F, | ||
| 126 | 0x02, 0x32, 0x14, 0x06, 0x16, 0x12, 0x14, 0x2B, 0x01, 0x27, 0x26, 0x06, 0x0F, 0x01, 0x23, 0x45, | ||
| 127 | 0x46, 0x77, 0xA4, 0xB4, 0xA4, 0x77, 0x46, 0x46, 0x77, 0xA4, 0xB4, 0xA4, 0x77, 0x77, 0x84, 0xE2, | ||
| 128 | 0x01, 0x0C, 0xE2, 0x84, 0x84, 0xE2, 0xFE, 0xF4, 0xE2, 0x7B, 0x58, 0x58, 0x4D, 0x4F, 0x05, 0x7A, | ||
| 129 | 0x34, 0x34, 0x02, 0x01, 0x33, 0x32, 0x3C, 0x3C, 0xA1, 0x01, 0xB0, 0x3E, 0x3F, 0x39, 0x3B, 0x02, | ||
| 130 | 0x3A, 0x38, 0x3F, 0x01, 0xDE, 0xB4, 0xA4, 0x77, 0x46, 0x46, 0x77, 0xA4, 0xB4, 0xA4, 0x77, 0x46, | ||
| 131 | 0x46, 0x77, 0xFE, 0x7C, 0x01, 0x0C, 0xE2, 0x84, 0x84, 0xE2, 0xFE, 0xF4, 0xE2, 0x84, 0x84, 0x60, | ||
| 132 | 0x02, 0x87, 0x88, 0x79, 0x7A, 0x06, 0x54, 0x54, 0x01, 0x53, 0x53, 0x01, 0x01, 0xFB, 0x04, 0xFE, | ||
| 133 | 0xF8, 0x02, 0x5B, 0x5A, 0x03, 0x59, 0x59, 0x00, 0x00, 0x03, 0x00, 0x14, 0xFF, 0x98, 0x03, 0xEC, | ||
| 134 | 0x03, 0x70, 0x00, 0x0F, 0x00, 0x1B, 0x00, 0x2B, 0x00, 0x00, 0x00, 0x22, 0x0E, 0x02, 0x14, 0x1E, | ||
| 135 | 0x02, 0x32, 0x3E, 0x02, 0x34, 0x2E, 0x01, 0x24, 0x20, 0x1E, 0x01, 0x10, 0x0E, 0x01, 0x20, 0x2E, | ||
| 136 | 0x01, 0x10, 0x36, 0x01, 0x35, 0x27, 0x26, 0x34, 0x3B, 0x01, 0x17, 0x16, 0x36, 0x3F, 0x01, 0x33, | ||
| 137 | 0x03, 0x15, 0x23, 0x02, 0x5A, 0xB4, 0xA4, 0x77, 0x46, 0x46, 0x77, 0xA4, 0xB4, 0xA4, 0x77, 0x46, | ||
| 138 | 0x46, 0x77, 0xFE, 0x7C, 0x01, 0x0C, 0xE2, 0x84, 0x84, 0xE2, 0xFE, 0xF4, 0xE2, 0x84, 0x84, 0x01, | ||
| 139 | 0x36, 0x5E, 0x5F, 0x3C, 0x3D, 0x3D, 0x3D, 0x03, 0x3B, 0x3B, 0x77, 0xBE, 0x68, 0x03, 0x3F, 0x46, | ||
| 140 | 0x77, 0xA4, 0xB4, 0xA4, 0x77, 0x46, 0x46, 0x77, 0xA4, 0xB4, 0xA4, 0x77, 0x77, 0x84, 0xE2, 0xFE, | ||
| 141 | 0xF4, 0xE2, 0x84, 0x84, 0xE2, 0x01, 0x0C, 0xE2, 0xFD, 0xF9, 0x6E, 0x96, 0x95, 0x01, 0x67, 0x67, | ||
| 142 | 0x03, 0x66, 0x65, 0xFE, 0xD3, 0xDA, 0x00, 0x00, 0x00, 0x03, 0x00, 0x14, 0xFF, 0xBD, 0x03, 0xEC, | ||
| 143 | 0x03, 0x4B, 0x00, 0x06, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x00, 0x01, 0x21, 0x22, 0x15, 0x30, 0x11, | ||
| 144 | 0x21, 0x17, 0x21, 0x11, 0x10, 0x25, 0x21, 0x01, 0x11, 0x33, 0x11, 0x21, 0x15, 0x03, 0xBB, 0xFD, | ||
| 145 | 0x77, 0xED, 0x03, 0x76, 0x31, 0xFC, 0x28, 0x01, 0x1E, 0x02, 0xBA, 0xFD, 0x5C, 0x68, 0x01, 0x08, | ||
| 146 | 0x03, 0x1A, 0xEE, 0xFD, 0xC2, 0x31, 0x02, 0x6F, 0x01, 0x1E, 0x01, 0xFD, 0x36, 0x02, 0x07, 0xFE, | ||
| 147 | 0x50, 0x57, 0x00, 0x00, 0x00, 0x04, 0x00, 0x14, 0xFF, 0xBD, 0x03, 0xEC, 0x03, 0x4B, 0x00, 0x06, | ||
| 148 | 0x00, 0x0C, 0x00, 0x27, 0x00, 0x32, 0x00, 0x00, 0x05, 0x11, 0x34, 0x27, 0x30, 0x21, 0x11, 0x07, | ||
| 149 | 0x11, 0x21, 0x20, 0x19, 0x01, 0x25, 0x11, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x07, | ||
| 150 | 0x06, 0x07, 0x06, 0x07, 0x1E, 0x02, 0x15, 0x07, 0x23, 0x27, 0x2E, 0x01, 0x2F, 0x01, 0x15, 0x13, | ||
| 151 | 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x23, 0x15, 0x33, 0x36, 0x03, 0xBB, 0xED, 0xFD, 0x77, 0x31, | ||
| 152 | 0x02, 0xBA, 0x01, 0x1E, 0xFD, 0x2A, 0x77, 0x76, 0x15, 0x49, 0x20, 0x35, 0x08, 0x04, 0x06, 0x13, | ||
| 153 | 0x66, 0x0C, 0x01, 0x1F, 0x2E, 0x65, 0x3D, 0x3D, 0x2A, 0x56, 0x28, 0x2E, 0x19, 0x99, 0x3C, 0x20, | ||
| 154 | 0x10, 0x56, 0x4F, 0x46, 0x47, 0x12, 0x02, 0x3E, 0xED, 0x01, 0xFC, 0xD4, 0x31, 0x03, 0x8E, 0xFE, | ||
| 155 | 0xE1, 0xFD, 0x91, 0xC4, 0x02, 0x07, 0x01, 0x04, 0x13, 0x21, 0x44, 0x1D, 0x19, 0x58, 0x15, 0x02, | ||
| 156 | 0x01, 0x13, 0x2D, 0xA2, 0x01, 0x01, 0x3D, 0x81, 0x1A, 0x01, 0x01, 0xDA, 0x01, 0x2D, 0x08, 0x3A, | ||
| 157 | 0x29, 0x0F, 0x08, 0x01, 0x85, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x14, 0xFF, 0xF5, 0x03, 0xEC, | ||
| 158 | 0x03, 0x13, 0x00, 0x09, 0x00, 0x11, 0x00, 0x26, 0x00, 0x32, 0x00, 0x00, 0x37, 0x21, 0x34, 0x10, | ||
| 159 | 0x35, 0x34, 0x27, 0x21, 0x04, 0x11, 0x23, 0x10, 0x25, 0x21, 0x16, 0x15, 0x11, 0x21, 0x37, 0x35, | ||
| 160 | 0x37, 0x36, 0x22, 0x2B, 0x01, 0x3D, 0x01, 0x3B, 0x01, 0x1D, 0x01, 0x0F, 0x01, 0x3B, 0x01, 0x1D, | ||
| 161 | 0x01, 0x2B, 0x01, 0x25, 0x35, 0x3B, 0x01, 0x1D, 0x01, 0x3B, 0x01, 0x1D, 0x01, 0x2B, 0x01, 0x45, | ||
| 162 | 0x03, 0x76, 0x45, 0xFE, 0x2D, 0xFE, 0xA2, 0x31, 0x01, 0x8F, 0x01, 0xD3, 0x76, 0xFC, 0x28, 0xA7, | ||
| 163 | 0x68, 0x68, 0x01, 0x5B, 0x5D, 0x90, 0x91, 0x6C, 0x6D, 0x71, 0x70, 0xA0, 0xA0, 0x01, 0x75, 0x27, | ||
| 164 | 0x28, 0x63, 0x63, 0x8B, 0x8A, 0x27, 0x69, 0x01, 0xA4, 0x69, 0x44, 0x01, 0x02, 0xFE, 0xA4, 0x01, | ||
| 165 | 0x8C, 0x03, 0x01, 0x75, 0xFD, 0x58, 0xBB, 0x24, 0x80, 0x80, 0x21, 0x21, 0x1F, 0x1E, 0x85, 0x86, | ||
| 166 | 0x20, 0x22, 0xC3, 0xC3, 0xA1, 0xA3, 0x20, 0x22, 0x00, 0x05, 0x00, 0x14, 0xFF, 0xF5, 0x03, 0xEC, | ||
| 167 | 0x03, 0x13, 0x00, 0x08, 0x00, 0x10, 0x00, 0x2B, 0x00, 0x37, 0x00, 0x44, 0x00, 0x00, 0x37, 0x21, | ||
| 168 | 0x11, 0x10, 0x25, 0x30, 0x21, 0x06, 0x15, 0x03, 0x11, 0x34, 0x37, 0x21, 0x04, 0x19, 0x01, 0x01, | ||
| 169 | 0x35, 0x17, 0x32, 0x17, 0x16, 0x17, 0x16, 0x07, 0x06, 0x07, 0x06, 0x17, 0x16, 0x17, 0x16, 0x17, | ||
| 170 | 0x16, 0x23, 0x2F, 0x01, 0x2E, 0x01, 0x2F, 0x01, 0x15, 0x23, 0x37, 0x32, 0x36, 0x37, 0x36, 0x35, | ||
| 171 | 0x26, 0x27, 0x26, 0x2B, 0x01, 0x15, 0x05, 0x35, 0x37, 0x36, 0x26, 0x2B, 0x01, 0x35, 0x21, 0x15, | ||
| 172 | 0x03, 0x17, 0x15, 0x45, 0x03, 0x76, 0xFE, 0xA2, 0xFE, 0x2D, 0x45, 0x31, 0x76, 0x01, 0xD3, 0x01, | ||
| 173 | 0x8F, 0xFE, 0x1E, 0x65, 0x6F, 0x15, 0x46, 0x10, 0x05, 0x04, 0x0D, 0x4F, 0x09, 0x09, 0x1F, 0x1D, | ||
| 174 | 0x3A, 0x06, 0x01, 0x30, 0x2F, 0x22, 0x37, 0x1E, 0x29, 0x14, 0x4E, 0x82, 0x34, 0x19, 0x0E, 0x13, | ||
| 175 | 0x0A, 0x22, 0x07, 0x38, 0x37, 0xFE, 0x3E, 0x68, 0x68, 0x01, 0x5C, 0x5C, 0x01, 0x20, 0xD8, 0xE1, | ||
| 176 | 0x27, 0x01, 0x5D, 0x01, 0x5B, 0x03, 0x01, 0x44, 0xFD, 0x58, 0x02, 0xA8, 0x75, 0x01, 0x03, 0xFE, | ||
| 177 | 0x74, 0xFE, 0x71, 0x01, 0x5C, 0xC5, 0x01, 0x04, 0x0C, 0x43, 0x15, 0x1D, 0x44, 0x10, 0x04, 0x06, | ||
| 178 | 0x14, 0x2B, 0x56, 0x10, 0x01, 0x01, 0x34, 0x52, 0x1C, 0x01, 0x01, 0xA5, 0xE3, 0x04, 0x06, 0x0A, | ||
| 179 | 0x20, 0x2C, 0x04, 0x01, 0x65, 0xE3, 0x47, 0x80, 0x80, 0x01, 0x42, 0x3D, 0xFE, 0xF5, 0x01, 0x41, | ||
| 180 | 0x00, 0x04, 0x00, 0x14, 0x00, 0x52, 0x03, 0xEC, 0x02, 0xB6, 0x00, 0x08, 0x00, 0x16, 0x00, 0x64, | ||
| 181 | 0x00, 0x70, 0x00, 0x00, 0x25, 0x11, 0x21, 0x22, 0x15, 0x30, 0x15, 0x14, 0x33, 0x11, 0x21, 0x32, | ||
| 182 | 0x15, 0x11, 0x14, 0x27, 0x21, 0x22, 0x26, 0x3D, 0x01, 0x34, 0x36, 0x13, 0x26, 0x27, 0x26, 0x27, | ||
| 183 | 0x26, 0x37, 0x33, 0x36, 0x37, 0x36, 0x33, 0x16, 0x17, 0x16, 0x17, 0x16, 0x37, 0x36, 0x37, 0x36, | ||
| 184 | 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, | ||
| 185 | 0x36, 0x37, 0x36, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x0F, 0x01, 0x22, 0x06, 0x23, | ||
| 186 | 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x06, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, | ||
| 187 | 0x17, 0x16, 0x17, 0x16, 0x07, 0x06, 0x07, 0x06, 0x27, 0x37, 0x35, 0x3B, 0x01, 0x1D, 0x01, 0x3B, | ||
| 188 | 0x01, 0x1D, 0x01, 0x2B, 0x01, 0x03, 0xBB, 0xFD, 0x2A, 0xA0, 0xA0, 0x02, 0xEE, 0x19, 0x19, 0xFD, | ||
| 189 | 0x12, 0x57, 0x7A, 0x7A, 0xCA, 0x38, 0x1D, 0x16, 0x08, 0x03, 0x01, 0x02, 0x0F, 0x0C, 0x1E, 0x01, | ||
| 190 | 0x02, 0x04, 0x0C, 0x2B, 0x0F, 0x0E, 0x18, 0x0C, 0x09, 0x04, 0x15, 0x32, 0x23, 0x12, 0x1C, 0x0E, | ||
| 191 | 0x09, 0x03, 0x01, 0x01, 0x09, 0x21, 0x0F, 0x14, 0x2E, 0x2A, 0x13, 0x0F, 0x0C, 0x08, 0x0B, 0x05, | ||
| 192 | 0x02, 0x01, 0x02, 0x03, 0x36, 0x03, 0x02, 0x03, 0x08, 0x0D, 0x23, 0x16, 0x0E, 0x10, 0x01, 0x01, | ||
| 193 | 0x07, 0x0B, 0x32, 0x25, 0x13, 0x26, 0x0F, 0x09, 0x01, 0x01, 0x0F, 0x11, 0x24, 0x21, 0x2A, 0xE3, | ||
| 194 | 0x20, 0x20, 0x52, 0x50, 0x71, 0x71, 0x84, 0x02, 0x00, 0xAF, 0xA2, 0xAF, 0x02, 0x32, 0x19, 0xFD, | ||
| 195 | 0xCE, 0x19, 0x01, 0x84, 0x5C, 0xA2, 0x5C, 0x85, 0xFE, 0x29, 0x04, 0x1E, 0x18, 0x26, 0x0F, 0x01, | ||
| 196 | 0x02, 0x01, 0x03, 0x05, 0x0B, 0x29, 0x06, 0x02, 0x03, 0x04, 0x11, 0x0B, 0x0D, 0x0A, 0x06, 0x12, | ||
| 197 | 0x0D, 0x0A, 0x07, 0x0C, 0x18, 0x0D, 0x10, 0x06, 0x18, 0x05, 0x27, 0x14, 0x09, 0x03, 0x0A, 0x0D, | ||
| 198 | 0x06, 0x09, 0x09, 0x0D, 0x0F, 0x14, 0x0C, 0x06, 0x03, 0x02, 0x04, 0x10, 0x0A, 0x11, 0x08, 0x09, | ||
| 199 | 0x0E, 0x0C, 0x07, 0x0C, 0x0C, 0x0A, 0x07, 0x0F, 0x20, 0x11, 0x18, 0x1E, 0x1A, 0x1E, 0x0C, 0x0B, | ||
| 200 | 0x03, 0xAA, 0xA5, 0x89, 0x8A, 0x1C, 0x1B, 0x00, 0x00, 0x05, 0x00, 0x14, 0x00, 0x53, 0x03, 0xEC, | ||
| 201 | 0x02, 0xB6, 0x00, 0x08, 0x00, 0x16, 0x00, 0x2E, 0x00, 0x38, 0x00, 0x65, 0x00, 0x00, 0x01, 0x30, | ||
| 202 | 0x21, 0x11, 0x21, 0x32, 0x3D, 0x01, 0x34, 0x27, 0x32, 0x16, 0x1D, 0x01, 0x14, 0x06, 0x23, 0x21, | ||
| 203 | 0x26, 0x35, 0x11, 0x34, 0x33, 0x01, 0x11, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x07, 0x06, 0x07, | ||
| 204 | 0x17, 0x1E, 0x01, 0x1F, 0x01, 0x23, 0x2A, 0x01, 0x2E, 0x01, 0x23, 0x27, 0x15, 0x37, 0x32, 0x37, | ||
| 205 | 0x36, 0x27, 0x2E, 0x01, 0x2B, 0x01, 0x15, 0x05, 0x26, 0x27, 0x37, 0x32, 0x3F, 0x01, 0x16, 0x17, | ||
| 206 | 0x1E, 0x01, 0x37, 0x36, 0x27, 0x2E, 0x04, 0x37, 0x3E, 0x01, 0x33, 0x32, 0x17, 0x16, 0x17, 0x14, | ||
| 207 | 0x06, 0x27, 0x26, 0x27, 0x26, 0x0E, 0x01, 0x1E, 0x02, 0x17, 0x16, 0x06, 0x07, 0x06, 0x07, 0x06, | ||
| 208 | 0x03, 0x1B, 0xFD, 0x2A, 0x02, 0xD6, 0xA0, 0xA0, 0x57, 0x7A, 0x7A, 0x57, 0xFD, 0x12, 0x19, 0x19, | ||
| 209 | 0x01, 0xD3, 0x47, 0x44, 0x11, 0x3E, 0x18, 0x21, 0x0B, 0x0C, 0x43, 0x04, 0x17, 0x1C, 0x1E, 0x16, | ||
| 210 | 0x26, 0x26, 0x03, 0x4D, 0x18, 0x1E, 0x11, 0x25, 0x3A, 0x0C, 0x22, 0x08, 0x03, 0x1B, 0x3E, 0x29, | ||
| 211 | 0xFE, 0xAC, 0x0D, 0x04, 0x02, 0x02, 0x1E, 0x1D, 0x03, 0x02, 0x0C, 0x4C, 0x13, 0x20, 0x07, 0x04, | ||
| 212 | 0x1B, 0x56, 0x2D, 0x1C, 0x01, 0x02, 0x44, 0x35, 0x49, 0x1F, 0x10, 0x03, 0x41, 0x01, 0x06, 0x0A, | ||
| 213 | 0x16, 0x3C, 0x18, 0x0C, 0x16, 0x5D, 0x15, 0x33, 0x03, 0x2B, 0x1E, 0x34, 0x59, 0x02, 0x84, 0xFE, | ||
| 214 | 0x00, 0xAF, 0xA2, 0xAF, 0x32, 0x85, 0x5C, 0xA2, 0x5C, 0x84, 0x01, 0x17, 0x02, 0x32, 0x19, 0xFE, | ||
| 215 | 0x2F, 0x01, 0x45, 0x01, 0x02, 0x19, 0x22, 0x32, 0x39, 0x0B, 0x08, 0x0F, 0x27, 0x2F, 0x24, 0x75, | ||
| 216 | 0x12, 0x01, 0x88, 0xBB, 0x04, 0x09, 0x2A, 0x0F, 0x0D, 0x53, 0x8A, 0x17, 0x1E, 0x04, 0x03, 0x03, | ||
| 217 | 0x0C, 0x04, 0x26, 0x0E, 0x0C, 0x14, 0x1A, 0x0E, 0x0E, 0x16, 0x16, 0x2C, 0x1A, 0x2D, 0x2D, 0x2A, | ||
| 218 | 0x16, 0x1D, 0x06, 0x04, 0x01, 0x1A, 0x09, 0x11, 0x09, 0x17, 0x18, 0x0D, 0x17, 0x0C, 0x1B, 0x71, | ||
| 219 | 0x1B, 0x12, 0x01, 0x03, 0x00, 0x03, 0x00, 0x14, 0xFF, 0x98, 0x03, 0xEC, 0x03, 0x70, 0x00, 0x0F, | ||
| 220 | 0x00, 0x1B, 0x00, 0x27, 0x00, 0x00, 0x00, 0x22, 0x0E, 0x02, 0x14, 0x1E, 0x02, 0x32, 0x3E, 0x02, | ||
| 221 | 0x34, 0x2E, 0x01, 0x24, 0x20, 0x1E, 0x01, 0x10, 0x0E, 0x01, 0x20, 0x2E, 0x01, 0x10, 0x36, 0x13, | ||
| 222 | 0x33, 0x35, 0x33, 0x15, 0x33, 0x15, 0x23, 0x15, 0x23, 0x35, 0x23, 0x02, 0x5A, 0xB4, 0xA4, 0x77, | ||
| 223 | 0x46, 0x46, 0x77, 0xA4, 0xB4, 0xA4, 0x77, 0x46, 0x46, 0x77, 0xFE, 0x7C, 0x01, 0x0C, 0xE2, 0x84, | ||
| 224 | 0x84, 0xE2, 0xFE, 0xF4, 0xE2, 0x84, 0x84, 0x7C, 0xC5, 0x4E, 0xC5, 0xC4, 0x50, 0xC4, 0x03, 0x3F, | ||
| 225 | 0x46, 0x77, 0xA4, 0xB4, 0xA4, 0x77, 0x46, 0x46, 0x77, 0xA4, 0xB4, 0xA4, 0x77, 0x77, 0x84, 0xE2, | ||
| 226 | 0xFE, 0xF4, 0xE2, 0x84, 0x84, 0xE2, 0x01, 0x0C, 0xE2, 0xFE, 0xC0, 0xC4, 0xC5, 0x4E, 0xC5, 0xC5, | ||
| 227 | 0x00, 0x03, 0x00, 0x14, 0xFF, 0x98, 0x03, 0xEC, 0x03, 0x70, 0x00, 0x0F, 0x00, 0x1B, 0x00, 0x1F, | ||
| 228 | 0x00, 0x00, 0x00, 0x22, 0x0E, 0x02, 0x14, 0x1E, 0x02, 0x32, 0x3E, 0x02, 0x34, 0x2E, 0x01, 0x24, | ||
| 229 | 0x20, 0x1E, 0x01, 0x10, 0x0E, 0x01, 0x20, 0x2E, 0x01, 0x10, 0x36, 0x13, 0x35, 0x21, 0x15, 0x02, | ||
| 230 | 0x5A, 0xB4, 0xA4, 0x77, 0x46, 0x46, 0x77, 0xA4, 0xB4, 0xA4, 0x77, 0x46, 0x46, 0x77, 0xFE, 0x7C, | ||
| 231 | 0x01, 0x0C, 0xE2, 0x84, 0x84, 0xE2, 0xFE, 0xF4, 0xE2, 0x84, 0x84, 0x7C, 0x01, 0xD8, 0x03, 0x3F, | ||
| 232 | 0x46, 0x77, 0xA4, 0xB4, 0xA4, 0x77, 0x46, 0x46, 0x77, 0xA4, 0xB4, 0xA4, 0x77, 0x77, 0x84, 0xE2, | ||
| 233 | 0xFE, 0xF4, 0xE2, 0x84, 0x84, 0xE2, 0x01, 0x0C, 0xE2, 0xFE, 0x71, 0x4E, 0x4E, 0x00, 0x00, 0x00, | ||
| 234 | 0x00, 0x03, 0x00, 0x14, 0xFF, 0x98, 0x03, 0xEC, 0x03, 0x70, 0x00, 0x0B, 0x00, 0x1B, 0x00, 0x25, | ||
| 235 | 0x00, 0x00, 0x00, 0x20, 0x0E, 0x01, 0x10, 0x1E, 0x01, 0x20, 0x3E, 0x01, 0x10, 0x26, 0x01, 0x12, | ||
| 236 | 0x37, 0x33, 0x13, 0x12, 0x15, 0x16, 0x23, 0x2F, 0x01, 0x23, 0x07, 0x23, 0x22, 0x26, 0x25, 0x30, | ||
| 237 | 0x27, 0x26, 0x2F, 0x01, 0x06, 0x07, 0x06, 0x32, 0x02, 0x86, 0xFE, 0xF4, 0xE2, 0x84, 0x84, 0xE2, | ||
| 238 | 0x01, 0x0C, 0xE2, 0x84, 0x84, 0xFD, 0xA0, 0x6C, 0x5E, 0x6D, 0x68, 0x68, 0x01, 0x39, 0x38, 0x2E, | ||
| 239 | 0xD1, 0x2B, 0x37, 0x33, 0x04, 0x01, 0x48, 0x1D, 0x1C, 0x0A, 0x05, 0x01, 0x45, 0x01, 0x89, 0x03, | ||
| 240 | 0x70, 0x84, 0xE2, 0xFE, 0xF4, 0xE2, 0x84, 0x84, 0xE2, 0x01, 0x0C, 0xE2, 0xFD, 0x9A, 0x01, 0x1A, | ||
| 241 | 0xEB, 0xFE, 0xFE, 0xFE, 0xFD, 0x03, 0x01, 0x01, 0x77, 0x78, 0x01, 0xCF, 0x4C, 0x4C, 0x1C, 0x0C, | ||
| 242 | 0x02, 0xBE, 0x02, 0x00, 0x00, 0x04, 0x00, 0x14, 0xFF, 0x98, 0x03, 0xEC, 0x03, 0x70, 0x00, 0x0B, | ||
| 243 | 0x00, 0x20, 0x00, 0x2B, 0x00, 0x35, 0x00, 0x00, 0x36, 0x10, 0x3E, 0x01, 0x20, 0x1E, 0x01, 0x10, | ||
| 244 | 0x0E, 0x01, 0x20, 0x26, 0x01, 0x30, 0x37, 0x36, 0x37, 0x36, 0x27, 0x26, 0x27, 0x26, 0x23, 0x27, | ||
| 245 | 0x19, 0x01, 0x33, 0x32, 0x37, 0x3E, 0x01, 0x35, 0x26, 0x07, 0x06, 0x2B, 0x01, 0x35, 0x33, 0x1E, | ||
| 246 | 0x02, 0x15, 0x06, 0x27, 0x23, 0x35, 0x33, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x14, 0x84, 0xE2, | ||
| 247 | 0x01, 0x0C, 0xE2, 0x84, 0x84, 0xE2, 0xFE, 0xF4, 0xE2, 0x01, 0xF7, 0x0A, 0x3A, 0x05, 0x04, 0x19, | ||
| 248 | 0x20, 0x3B, 0x1D, 0x8B, 0x81, 0x4E, 0xAF, 0x29, 0x3E, 0x4E, 0x01, 0xAE, 0x0D, 0x47, 0x46, 0x46, | ||
| 249 | 0x52, 0x2C, 0x1B, 0x01, 0xB7, 0x27, 0x4C, 0x4C, 0x07, 0x2C, 0x1E, 0x16, 0xFE, 0x01, 0x0C, 0xE2, | ||
| 250 | 0x84, 0x84, 0xE2, 0xFE, 0xF4, 0xE2, 0x84, 0x84, 0x01, 0x6D, 0x06, 0x21, 0x40, 0x2A, 0x24, 0x30, | ||
| 251 | 0x09, 0x05, 0x01, 0xFE, 0xFB, 0xFE, 0xFD, 0x03, 0x05, 0x4F, 0x41, 0x5B, 0x9B, 0x01, 0x8C, 0x01, | ||
| 252 | 0x0B, 0x21, 0x1A, 0x3E, 0xDA, 0x79, 0x01, 0x01, 0x0B, 0x54, 0x0E, 0x0A, 0x00, 0x02, 0x00, 0x14, | ||
| 253 | 0xFF, 0x98, 0x03, 0xEC, 0x03, 0x70, 0x00, 0x0B, 0x00, 0x29, 0x00, 0x00, 0x36, 0x10, 0x3E, 0x01, | ||
| 254 | 0x20, 0x1E, 0x01, 0x10, 0x0E, 0x01, 0x20, 0x26, 0x36, 0x14, 0x3B, 0x01, 0x37, 0x36, 0x37, 0x36, | ||
| 255 | 0x1F, 0x01, 0x33, 0x32, 0x34, 0x02, 0x26, 0x36, 0x34, 0x23, 0x0F, 0x01, 0x06, 0x07, 0x22, 0x2F, | ||
| 256 | 0x01, 0x23, 0x16, 0x1F, 0x01, 0x07, 0x14, 0x84, 0xE2, 0x01, 0x0C, 0xE2, 0x84, 0x84, 0xE2, 0xFE, | ||
| 257 | 0xF4, 0xE2, 0x7B, 0x3D, 0x3F, 0x38, 0x3A, 0x01, 0x02, 0x3A, 0x39, 0x3F, 0x3E, 0xB0, 0x01, 0xA1, | ||
| 258 | 0x3C, 0x3C, 0x32, 0x33, 0x01, 0x02, 0x34, 0x34, 0x7A, 0x05, 0x4F, 0x4D, 0x58, 0xFE, 0x01, 0x0C, | ||
| 259 | 0xE2, 0x84, 0x84, 0xE2, 0xFE, 0xF4, 0xE2, 0x84, 0x84, 0x62, 0x02, 0x59, 0x59, 0x02, 0x01, 0x5A, | ||
| 260 | 0x5B, 0x02, 0x01, 0x08, 0x04, 0xFB, 0x01, 0x01, 0x53, 0x53, 0x01, 0x54, 0x54, 0x06, 0x7A, 0x79, | ||
| 261 | 0x88, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x14, 0xFF, 0x98, 0x03, 0xEC, 0x03, 0x70, 0x00, 0x0B, | ||
| 262 | 0x00, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x01, 0x10, 0x0E, 0x01, 0x20, 0x2E, 0x01, 0x10, 0x36, | ||
| 263 | 0x01, 0x15, 0x33, 0x35, 0x13, 0x23, 0x07, 0x0E, 0x01, 0x2F, 0x01, 0x23, 0x22, 0x16, 0x1F, 0x01, | ||
| 264 | 0x01, 0x7A, 0x01, 0x0C, 0xE2, 0x84, 0x84, 0xE2, 0xFE, 0xF4, 0xE2, 0x84, 0x84, 0x01, 0x36, 0x68, | ||
| 265 | 0xBE, 0x77, 0x3B, 0x3C, 0x02, 0x3D, 0x3D, 0x3D, 0x3D, 0x01, 0x5F, 0x5E, 0x03, 0x70, 0x84, 0xE2, | ||
| 266 | 0xFE, 0xF4, 0xE2, 0x84, 0x84, 0xE2, 0x01, 0x0C, 0xE2, 0xFD, 0xF9, 0x6D, 0xDA, 0x01, 0x2D, 0x65, | ||
| 267 | 0x66, 0x03, 0x67, 0x67, 0x01, 0x95, 0x96, 0x00, 0x00, 0x02, 0x00, 0x14, 0xFF, 0xBF, 0x03, 0xEC, | ||
| 268 | 0x03, 0x4A, 0x00, 0x05, 0x00, 0x0B, 0x00, 0x00, 0x05, 0x21, 0x11, 0x10, 0x05, 0x21, 0x01, 0x21, | ||
| 269 | 0x35, 0x21, 0x11, 0x23, 0x03, 0xEC, 0xFC, 0x28, 0x01, 0x14, 0x02, 0xC4, 0xFD, 0x5C, 0x01, 0x70, | ||
| 270 | 0xFE, 0xF8, 0x68, 0x41, 0x02, 0x77, 0x01, 0x14, 0x01, 0xFD, 0x38, 0x57, 0x01, 0xB0, 0x00, 0x00, | ||
| 271 | 0x00, 0x03, 0x00, 0x14, 0xFF, 0xBF, 0x03, 0xEC, 0x03, 0x49, 0x00, 0x05, 0x00, 0x20, 0x00, 0x2B, | ||
| 272 | 0x00, 0x00, 0x17, 0x11, 0x21, 0x20, 0x19, 0x01, 0x25, 0x33, 0x35, 0x17, 0x1E, 0x01, 0x1F, 0x01, | ||
| 273 | 0x33, 0x37, 0x2E, 0x02, 0x27, 0x34, 0x37, 0x36, 0x37, 0x36, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, | ||
| 274 | 0x2B, 0x01, 0x05, 0x06, 0x2B, 0x01, 0x35, 0x33, 0x16, 0x17, 0x16, 0x15, 0x14, 0x14, 0x02, 0xC4, | ||
| 275 | 0x01, 0x14, 0xFD, 0x2A, 0x69, 0x19, 0x2E, 0x28, 0x56, 0x2A, 0x3D, 0x3D, 0x01, 0x65, 0x2C, 0x20, | ||
| 276 | 0x0D, 0x66, 0x13, 0x06, 0x04, 0x09, 0x34, 0x20, 0x49, 0x15, 0x76, 0x77, 0x01, 0x02, 0x0C, 0x47, | ||
| 277 | 0x46, 0x4F, 0x56, 0x10, 0x20, 0x41, 0x03, 0x8A, 0xFE, 0xED, 0xFD, 0x89, 0xC2, 0xDA, 0x01, 0x01, | ||
| 278 | 0x1A, 0x81, 0x3D, 0x01, 0x01, 0xA3, 0x2C, 0x13, 0x01, 0x02, 0x13, 0x5A, 0x1A, 0x1C, 0x44, 0x21, | ||
| 279 | 0x13, 0x04, 0x01, 0xDA, 0x02, 0x85, 0x01, 0x08, 0x0F, 0x29, 0x3A, 0x00, 0x00, 0x03, 0x00, 0x14, | ||
| 280 | 0xFF, 0xFB, 0x03, 0xEC, 0x03, 0x0E, 0x00, 0x08, 0x00, 0x15, 0x00, 0x1B, 0x00, 0x00, 0x05, 0x21, | ||
| 281 | 0x11, 0x10, 0x21, 0x30, 0x21, 0x32, 0x15, 0x01, 0x21, 0x35, 0x23, 0x13, 0x35, 0x21, 0x15, 0x33, | ||
| 282 | 0x32, 0x22, 0x0F, 0x01, 0x05, 0x21, 0x35, 0x23, 0x11, 0x23, 0x03, 0xEC, 0xFC, 0x28, 0x01, 0x8A, | ||
| 283 | 0x01, 0xEC, 0x62, 0xFC, 0xCF, 0x01, 0x40, 0xE1, 0xD9, 0xFE, 0xDF, 0x5D, 0x5C, 0x01, 0x67, 0x68, | ||
| 284 | 0x01, 0x75, 0x01, 0x15, 0xC6, 0x4F, 0x05, 0x01, 0x89, 0x01, 0x8A, 0x63, 0xFD, 0xE1, 0x42, 0x01, | ||
| 285 | 0x0B, 0x3D, 0x42, 0x80, 0x80, 0x48, 0x42, 0x01, 0x44, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x14, | ||
| 286 | 0xFF, 0xFB, 0x03, 0xEC, 0x03, 0x0E, 0x00, 0x07, 0x00, 0x22, 0x00, 0x2F, 0x00, 0x3C, 0x00, 0x00, | ||
| 287 | 0x17, 0x11, 0x34, 0x37, 0x21, 0x20, 0x19, 0x01, 0x01, 0x15, 0x33, 0x35, 0x17, 0x1E, 0x01, 0x1F, | ||
| 288 | 0x02, 0x32, 0x35, 0x26, 0x27, 0x26, 0x27, 0x26, 0x37, 0x36, 0x37, 0x36, 0x27, 0x26, 0x27, 0x26, | ||
| 289 | 0x23, 0x27, 0x17, 0x30, 0x23, 0x35, 0x33, 0x32, 0x17, 0x16, 0x17, 0x14, 0x07, 0x0E, 0x01, 0x05, | ||
| 290 | 0x21, 0x35, 0x27, 0x13, 0x35, 0x21, 0x15, 0x33, 0x32, 0x14, 0x0F, 0x01, 0x14, 0x62, 0x01, 0xEC, | ||
| 291 | 0x01, 0x8A, 0xFE, 0x1E, 0x4E, 0x14, 0x29, 0x1E, 0x37, 0x22, 0x2F, 0x2F, 0x06, 0x3A, 0x1D, 0x1F, | ||
| 292 | 0x09, 0x09, 0x4E, 0x0E, 0x04, 0x05, 0x0F, 0x47, 0x15, 0x6F, 0x65, 0x82, 0x34, 0x37, 0x38, 0x07, | ||
| 293 | 0x23, 0x09, 0x13, 0x0D, 0x1A, 0xFD, 0xD6, 0x01, 0x40, 0xE1, 0xD8, 0xFE, 0xE0, 0x5C, 0x5C, 0x67, | ||
| 294 | 0x68, 0x05, 0x02, 0xB0, 0x62, 0x01, 0xFE, 0x76, 0xFE, 0x77, 0x01, 0x56, 0xC5, 0xA5, 0x01, 0x01, | ||
| 295 | 0x1C, 0x52, 0x34, 0x01, 0x01, 0x0E, 0x58, 0x2C, 0x13, 0x06, 0x04, 0x0F, 0x45, 0x1E, 0x14, 0x42, | ||
| 296 | 0x0D, 0x04, 0x01, 0xA7, 0x65, 0x01, 0x04, 0x2C, 0x21, 0x09, 0x07, 0x03, 0xE3, 0x41, 0x01, 0x01, | ||
| 297 | 0x0B, 0x3D, 0x42, 0x01, 0x80, 0x80, 0x00, 0x00, 0x00, 0x03, 0x00, 0x14, 0x00, 0x5D, 0x03, 0xEC, | ||
| 298 | 0x02, 0xAB, 0x00, 0x08, 0x00, 0x37, 0x00, 0x3D, 0x00, 0x00, 0x13, 0x30, 0x21, 0x11, 0x21, 0x22, | ||
| 299 | 0x3D, 0x01, 0x34, 0x05, 0x37, 0x34, 0x27, 0x26, 0x27, 0x26, 0x07, 0x06, 0x07, 0x0E, 0x01, 0x17, | ||
| 300 | 0x1E, 0x01, 0x17, 0x16, 0x14, 0x07, 0x06, 0x26, 0x27, 0x26, 0x27, 0x22, 0x06, 0x07, 0x22, 0x17, | ||
| 301 | 0x1E, 0x01, 0x17, 0x16, 0x37, 0x36, 0x27, 0x26, 0x27, 0x2E, 0x02, 0x37, 0x36, 0x33, 0x32, 0x1F, | ||
| 302 | 0x02, 0x33, 0x35, 0x23, 0x11, 0x23, 0xD6, 0x03, 0x16, 0xFC, 0xEA, 0xC2, 0x01, 0xC6, 0x02, 0x01, | ||
| 303 | 0x0C, 0x3A, 0x2B, 0x2D, 0x13, 0x10, 0x2B, 0x01, 0x33, 0x17, 0x55, 0x15, 0x04, 0x09, 0x14, 0x58, | ||
| 304 | 0x0C, 0x04, 0x02, 0x02, 0x26, 0x14, 0x01, 0x03, 0x08, 0x33, 0x38, 0x5F, 0x20, 0x10, 0x01, 0x03, | ||
| 305 | 0x3C, 0x12, 0x59, 0x11, 0x01, 0x02, 0x39, 0x2C, 0x09, 0x02, 0x9D, 0xE2, 0xA2, 0x40, 0x02, 0xAB, | ||
| 306 | 0xFD, 0xB2, 0xD2, 0xAA, 0xD2, 0xDC, 0x03, 0x07, 0x0B, 0x38, 0x10, 0x0C, 0x09, 0x04, 0x08, 0x19, | ||
| 307 | 0x6C, 0x17, 0x0B, 0x17, 0x11, 0x07, 0x17, 0x0A, 0x1A, 0x0A, 0x29, 0x0C, 0x04, 0x04, 0x02, 0x10, | ||
| 308 | 0x25, 0x37, 0x04, 0x06, 0x37, 0x1D, 0x1C, 0x3F, 0x19, 0x08, 0x16, 0x13, 0x0B, 0x1F, 0x2B, 0x04, | ||
| 309 | 0xE9, 0x37, 0x01, 0x13, 0x00, 0x04, 0x00, 0x14, 0x00, 0x5D, 0x03, 0xEC, 0x02, 0xAB, 0x00, 0x07, | ||
| 310 | 0x00, 0x1F, 0x00, 0x2A, 0x00, 0x58, 0x00, 0x00, 0x01, 0x32, 0x1D, 0x01, 0x14, 0x23, 0x21, 0x11, | ||
| 311 | 0x01, 0x33, 0x35, 0x17, 0x1E, 0x03, 0x3B, 0x01, 0x27, 0x2E, 0x01, 0x2F, 0x01, 0x36, 0x37, 0x36, | ||
| 312 | 0x27, 0x26, 0x27, 0x26, 0x2B, 0x01, 0x17, 0x30, 0x23, 0x35, 0x33, 0x32, 0x16, 0x17, 0x16, 0x07, | ||
| 313 | 0x06, 0x05, 0x16, 0x37, 0x36, 0x37, 0x3E, 0x01, 0x27, 0x2E, 0x03, 0x3E, 0x01, 0x17, 0x16, 0x17, | ||
| 314 | 0x30, 0x37, 0x36, 0x27, 0x26, 0x27, 0x26, 0x27, 0x22, 0x06, 0x07, 0x06, 0x1E, 0x03, 0x17, 0x16, | ||
| 315 | 0x07, 0x06, 0x26, 0x27, 0x26, 0x27, 0x07, 0x06, 0x23, 0x07, 0x16, 0x03, 0x2A, 0xC2, 0xC2, 0xFC, | ||
| 316 | 0xEA, 0x01, 0xEC, 0x41, 0x11, 0x1F, 0x17, 0x4D, 0x02, 0x27, 0x26, 0x16, 0x1E, 0x1C, 0x17, 0x04, | ||
| 317 | 0x43, 0x0C, 0x0B, 0x21, 0x18, 0x3E, 0x0F, 0x46, 0x47, 0x66, 0x25, 0x29, 0x3E, 0x1B, 0x03, 0x08, | ||
| 318 | 0x22, 0x0C, 0xFE, 0x4D, 0x22, 0x59, 0x34, 0x1E, 0x2B, 0x03, 0x33, 0x16, 0x5C, 0x16, 0x0C, 0x18, | ||
| 319 | 0x3C, 0x16, 0x0B, 0x05, 0x22, 0x21, 0x01, 0x03, 0x10, 0x1F, 0x49, 0x36, 0x43, 0x02, 0x01, 0x1C, | ||
| 320 | 0x2D, 0x56, 0x1B, 0x04, 0x07, 0x20, 0x13, 0x4B, 0x0D, 0x01, 0x04, 0x1D, 0x1E, 0x02, 0x02, 0x04, | ||
| 321 | 0x02, 0xAB, 0xD2, 0xAA, 0xD2, 0x02, 0x4E, 0xFE, 0x39, 0x89, 0x01, 0x01, 0x11, 0x75, 0x01, 0x25, | ||
| 322 | 0x2F, 0x27, 0x0F, 0x08, 0x0C, 0x38, 0x33, 0x21, 0x19, 0x02, 0x01, 0x8A, 0x53, 0x0D, 0x0F, 0x2A, | ||
| 323 | 0x09, 0x04, 0x8A, 0x3A, 0x03, 0x01, 0x12, 0x1B, 0x71, 0x1B, 0x0C, 0x17, 0x0D, 0x18, 0x17, 0x09, | ||
| 324 | 0x11, 0x09, 0x1A, 0x01, 0x01, 0x07, 0x1E, 0x15, 0x29, 0x01, 0x2D, 0x2D, 0x1A, 0x2C, 0x16, 0x16, | ||
| 325 | 0x0D, 0x0F, 0x1A, 0x14, 0x0C, 0x0D, 0x27, 0x04, 0x0C, 0x03, 0x03, 0x04, 0x1E, 0x00, 0x00, 0x00, | ||
| 326 | 0x00, 0x02, 0x00, 0x14, 0xFF, 0x98, 0x03, 0xEC, 0x03, 0x70, 0x00, 0x0B, 0x00, 0x17, 0x00, 0x00, | ||
| 327 | 0x00, 0x20, 0x1E, 0x01, 0x10, 0x0E, 0x01, 0x20, 0x2E, 0x01, 0x10, 0x36, 0x13, 0x15, 0x33, 0x15, | ||
| 328 | 0x33, 0x35, 0x33, 0x35, 0x23, 0x35, 0x23, 0x15, 0x01, 0x7A, 0x01, 0x0C, 0xE2, 0x84, 0x84, 0xE2, | ||
| 329 | 0xFE, 0xF4, 0xE2, 0x84, 0x84, 0x7C, 0xC4, 0x50, 0xC4, 0xC5, 0x4E, 0x03, 0x70, 0x84, 0xE2, 0xFE, | ||
| 330 | 0xF4, 0xE2, 0x84, 0x84, 0xE2, 0x01, 0x0C, 0xE2, 0xFE, 0xC0, 0x4F, 0xC5, 0xC5, 0x4E, 0xC5, 0xC4, | ||
| 331 | 0x00, 0x02, 0x00, 0x14, 0xFF, 0x98, 0x03, 0xEC, 0x03, 0x70, 0x00, 0x0B, 0x00, 0x0F, 0x00, 0x00, | ||
| 332 | 0x00, 0x20, 0x1E, 0x01, 0x10, 0x0E, 0x01, 0x20, 0x2E, 0x01, 0x10, 0x36, 0x13, 0x21, 0x35, 0x21, | ||
| 333 | 0x01, 0x7A, 0x01, 0x0C, 0xE2, 0x84, 0x84, 0xE2, 0xFE, 0xF4, 0xE2, 0x84, 0x84, 0x7C, 0x01, 0xD8, | ||
| 334 | 0xFE, 0x28, 0x03, 0x70, 0x84, 0xE2, 0xFE, 0xF4, 0xE2, 0x84, 0x84, 0xE2, 0x01, 0x0C, 0xE2, 0xFE, | ||
| 335 | 0x71, 0x4E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0xAE, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, | ||
| 336 | 0x00, 0x00, 0x00, 0x15, 0x00, 0x2C, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, | ||
| 337 | 0x00, 0x64, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x07, 0x00, 0x85, 0x00, 0x01, | ||
| 338 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x10, 0x00, 0xAF, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, | ||
| 339 | 0x00, 0x04, 0x00, 0x10, 0x00, 0xE2, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x0D, | ||
| 340 | 0x01, 0x0F, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x10, 0x01, 0x3F, 0x00, 0x03, | ||
| 341 | 0x00, 0x01, 0x04, 0x09, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, | ||
| 342 | 0x00, 0x01, 0x00, 0x20, 0x00, 0x42, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x02, 0x00, 0x0E, | ||
| 343 | 0x00, 0x75, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x03, 0x00, 0x20, 0x00, 0x8D, 0x00, 0x03, | ||
| 344 | 0x00, 0x01, 0x04, 0x09, 0x00, 0x04, 0x00, 0x20, 0x00, 0xC0, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, | ||
| 345 | 0x00, 0x05, 0x00, 0x1A, 0x00, 0xF3, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x06, 0x00, 0x20, | ||
| 346 | 0x01, 0x1D, 0x00, 0x59, 0x00, 0x75, 0x00, 0x7A, 0x00, 0x75, 0x00, 0x20, 0x00, 0x45, 0x00, 0x6D, | ||
| 347 | 0x00, 0x75, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x20, 0x00, 0x50, | ||
| 348 | 0x00, 0x72, 0x00, 0x6F, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x00, 0x59, 0x75, | ||
| 349 | 0x7A, 0x75, 0x20, 0x45, 0x6D, 0x75, 0x6C, 0x61, 0x74, 0x6F, 0x72, 0x20, 0x50, 0x72, 0x6F, 0x6A, | ||
| 350 | 0x65, 0x63, 0x74, 0x00, 0x00, 0x59, 0x00, 0x75, 0x00, 0x7A, 0x00, 0x75, 0x00, 0x4F, 0x00, 0x53, | ||
| 351 | 0x00, 0x53, 0x00, 0x45, 0x00, 0x78, 0x00, 0x74, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x69, | ||
| 352 | 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x00, 0x59, 0x75, 0x7A, 0x75, 0x4F, 0x53, 0x53, 0x45, 0x78, 0x74, | ||
| 353 | 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x00, 0x00, 0x52, 0x00, 0x65, 0x00, 0x67, 0x00, 0x75, 0x00, | ||
| 354 | 0x6C, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x52, 0x65, 0x67, 0x75, 0x6C, 0x61, 0x72, 0x00, 0x00, | ||
| 355 | 0x59, 0x00, 0x75, 0x00, 0x7A, 0x00, 0x75, 0x00, 0x4F, 0x00, 0x53, 0x00, 0x53, 0x00, 0x45, 0x00, | ||
| 356 | 0x78, 0x00, 0x74, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, | ||
| 357 | 0x00, 0x59, 0x75, 0x7A, 0x75, 0x4F, 0x53, 0x53, 0x45, 0x78, 0x74, 0x65, 0x6E, 0x73, 0x69, 0x6F, | ||
| 358 | 0x6E, 0x00, 0x00, 0x59, 0x00, 0x75, 0x00, 0x7A, 0x00, 0x75, 0x00, 0x4F, 0x00, 0x53, 0x00, 0x53, | ||
| 359 | 0x00, 0x45, 0x00, 0x78, 0x00, 0x74, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6F, | ||
| 360 | 0x00, 0x6E, 0x00, 0x00, 0x59, 0x75, 0x7A, 0x75, 0x4F, 0x53, 0x53, 0x45, 0x78, 0x74, 0x65, 0x6E, | ||
| 361 | 0x73, 0x69, 0x6F, 0x6E, 0x00, 0x00, 0x56, 0x00, 0x65, 0x00, 0x72, 0x00, 0x73, 0x00, 0x69, 0x00, | ||
| 362 | 0x6F, 0x00, 0x6E, 0x00, 0x20, 0x00, 0x31, 0x00, 0x2E, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, | ||
| 363 | 0x00, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x20, 0x31, 0x2E, 0x30, 0x30, 0x30, 0x00, 0x00, | ||
| 364 | 0x59, 0x00, 0x75, 0x00, 0x7A, 0x00, 0x75, 0x00, 0x4F, 0x00, 0x53, 0x00, 0x53, 0x00, 0x45, 0x00, | ||
| 365 | 0x78, 0x00, 0x74, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, | ||
| 366 | 0x00, 0x59, 0x75, 0x7A, 0x75, 0x4F, 0x53, 0x53, 0x45, 0x78, 0x74, 0x65, 0x6E, 0x73, 0x69, 0x6F, | ||
| 367 | 0x6E, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xB5, 0x00, 0x32, | ||
| 368 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
| 369 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x01, 0x02, 0x01, 0x03, 0x00, 0x03, 0x01, 0x04, | ||
| 370 | 0x01, 0x05, 0x01, 0x06, 0x01, 0x07, 0x01, 0x08, 0x01, 0x09, 0x01, 0x0A, 0x01, 0x0B, 0x01, 0x0C, | ||
| 371 | 0x01, 0x0D, 0x01, 0x0E, 0x01, 0x0F, 0x01, 0x10, 0x01, 0x11, 0x01, 0x12, 0x01, 0x13, 0x01, 0x14, | ||
| 372 | 0x01, 0x15, 0x01, 0x16, 0x01, 0x17, 0x01, 0x18, 0x01, 0x19, 0x01, 0x1A, 0x01, 0x1B, 0x07, 0x75, | ||
| 373 | 0x6E, 0x69, 0x30, 0x30, 0x30, 0x30, 0x07, 0x75, 0x6E, 0x69, 0x30, 0x30, 0x30, 0x44, 0x07, 0x75, | ||
| 374 | 0x6E, 0x69, 0x45, 0x30, 0x41, 0x30, 0x07, 0x75, 0x6E, 0x69, 0x45, 0x30, 0x41, 0x31, 0x07, 0x75, | ||
| 375 | 0x6E, 0x69, 0x45, 0x30, 0x41, 0x32, 0x07, 0x75, 0x6E, 0x69, 0x45, 0x30, 0x41, 0x33, 0x07, 0x75, | ||
| 376 | 0x6E, 0x69, 0x45, 0x30, 0x41, 0x34, 0x07, 0x75, 0x6E, 0x69, 0x45, 0x30, 0x41, 0x35, 0x07, 0x75, | ||
| 377 | 0x6E, 0x69, 0x45, 0x30, 0x41, 0x36, 0x07, 0x75, 0x6E, 0x69, 0x45, 0x30, 0x41, 0x37, 0x07, 0x75, | ||
| 378 | 0x6E, 0x69, 0x45, 0x30, 0x41, 0x38, 0x07, 0x75, 0x6E, 0x69, 0x45, 0x30, 0x41, 0x39, 0x07, 0x75, | ||
| 379 | 0x6E, 0x69, 0x45, 0x30, 0x42, 0x33, 0x07, 0x75, 0x6E, 0x69, 0x45, 0x30, 0x42, 0x34, 0x07, 0x75, | ||
| 380 | 0x6E, 0x69, 0x45, 0x30, 0x45, 0x30, 0x07, 0x75, 0x6E, 0x69, 0x45, 0x30, 0x45, 0x31, 0x07, 0x75, | ||
| 381 | 0x6E, 0x69, 0x45, 0x30, 0x45, 0x32, 0x07, 0x75, 0x6E, 0x69, 0x45, 0x30, 0x45, 0x33, 0x07, 0x75, | ||
| 382 | 0x6E, 0x69, 0x45, 0x30, 0x45, 0x34, 0x07, 0x75, 0x6E, 0x69, 0x45, 0x30, 0x45, 0x35, 0x07, 0x75, | ||
| 383 | 0x6E, 0x69, 0x45, 0x30, 0x45, 0x36, 0x07, 0x75, 0x6E, 0x69, 0x45, 0x30, 0x45, 0x37, 0x07, 0x75, | ||
| 384 | 0x6E, 0x69, 0x45, 0x30, 0x45, 0x38, 0x07, 0x75, 0x6E, 0x69, 0x45, 0x30, 0x45, 0x39, 0x07, 0x75, | ||
| 385 | 0x6E, 0x69, 0x45, 0x30, 0x45, 0x46, 0x07, 0x75, 0x6E, 0x69, 0x45, 0x30, 0x46, 0x30, 0x00, 0x00, | ||
| 386 | 0x00, 0x01, 0x00, 0x01, 0xFF, 0xFF, 0x00, 0x0F, | ||
| 194 | }}; | 387 | }}; |
| 195 | 388 | ||
| 196 | } // namespace FileSys::SystemArchive::SharedFontData | 389 | } // namespace FileSys::SystemArchive::SharedFontData |
diff --git a/src/core/file_sys/system_archive/data/font_nintendo_extended.h b/src/core/file_sys/system_archive/data/font_nintendo_extended.h index 2089f3db9..edb9df914 100644 --- a/src/core/file_sys/system_archive/data/font_nintendo_extended.h +++ b/src/core/file_sys/system_archive/data/font_nintendo_extended.h | |||
| @@ -8,6 +8,6 @@ | |||
| 8 | 8 | ||
| 9 | namespace FileSys::SystemArchive::SharedFontData { | 9 | namespace FileSys::SystemArchive::SharedFontData { |
| 10 | 10 | ||
| 11 | extern const std::array<unsigned char, 2932> FONT_NINTENDO_EXTENDED; | 11 | extern const std::array<unsigned char, 6024> FONT_NINTENDO_EXTENDED; |
| 12 | 12 | ||
| 13 | } // namespace FileSys::SystemArchive::SharedFontData | 13 | } // namespace FileSys::SystemArchive::SharedFontData |
diff --git a/src/core/file_sys/vfs.cpp b/src/core/file_sys/vfs.cpp index b2f026b6d..f497e9396 100644 --- a/src/core/file_sys/vfs.cpp +++ b/src/core/file_sys/vfs.cpp | |||
| @@ -203,7 +203,7 @@ std::string VfsFile::GetFullPath() const { | |||
| 203 | return GetContainingDirectory()->GetFullPath() + "/" + GetName(); | 203 | return GetContainingDirectory()->GetFullPath() + "/" + GetName(); |
| 204 | } | 204 | } |
| 205 | 205 | ||
| 206 | std::shared_ptr<VfsFile> VfsDirectory::GetFileRelative(std::string_view path) const { | 206 | VirtualFile VfsDirectory::GetFileRelative(std::string_view path) const { |
| 207 | auto vec = Common::FS::SplitPathComponents(path); | 207 | auto vec = Common::FS::SplitPathComponents(path); |
| 208 | vec.erase(std::remove_if(vec.begin(), vec.end(), [](const auto& str) { return str.empty(); }), | 208 | vec.erase(std::remove_if(vec.begin(), vec.end(), [](const auto& str) { return str.empty(); }), |
| 209 | vec.end()); | 209 | vec.end()); |
| @@ -231,7 +231,7 @@ std::shared_ptr<VfsFile> VfsDirectory::GetFileRelative(std::string_view path) co | |||
| 231 | return dir->GetFile(vec.back()); | 231 | return dir->GetFile(vec.back()); |
| 232 | } | 232 | } |
| 233 | 233 | ||
| 234 | std::shared_ptr<VfsFile> VfsDirectory::GetFileAbsolute(std::string_view path) const { | 234 | VirtualFile VfsDirectory::GetFileAbsolute(std::string_view path) const { |
| 235 | if (IsRoot()) { | 235 | if (IsRoot()) { |
| 236 | return GetFileRelative(path); | 236 | return GetFileRelative(path); |
| 237 | } | 237 | } |
| @@ -239,7 +239,7 @@ std::shared_ptr<VfsFile> VfsDirectory::GetFileAbsolute(std::string_view path) co | |||
| 239 | return GetParentDirectory()->GetFileAbsolute(path); | 239 | return GetParentDirectory()->GetFileAbsolute(path); |
| 240 | } | 240 | } |
| 241 | 241 | ||
| 242 | std::shared_ptr<VfsDirectory> VfsDirectory::GetDirectoryRelative(std::string_view path) const { | 242 | VirtualDir VfsDirectory::GetDirectoryRelative(std::string_view path) const { |
| 243 | auto vec = Common::FS::SplitPathComponents(path); | 243 | auto vec = Common::FS::SplitPathComponents(path); |
| 244 | vec.erase(std::remove_if(vec.begin(), vec.end(), [](const auto& str) { return str.empty(); }), | 244 | vec.erase(std::remove_if(vec.begin(), vec.end(), [](const auto& str) { return str.empty(); }), |
| 245 | vec.end()); | 245 | vec.end()); |
| @@ -261,7 +261,7 @@ std::shared_ptr<VfsDirectory> VfsDirectory::GetDirectoryRelative(std::string_vie | |||
| 261 | return dir; | 261 | return dir; |
| 262 | } | 262 | } |
| 263 | 263 | ||
| 264 | std::shared_ptr<VfsDirectory> VfsDirectory::GetDirectoryAbsolute(std::string_view path) const { | 264 | VirtualDir VfsDirectory::GetDirectoryAbsolute(std::string_view path) const { |
| 265 | if (IsRoot()) { | 265 | if (IsRoot()) { |
| 266 | return GetDirectoryRelative(path); | 266 | return GetDirectoryRelative(path); |
| 267 | } | 267 | } |
| @@ -269,14 +269,14 @@ std::shared_ptr<VfsDirectory> VfsDirectory::GetDirectoryAbsolute(std::string_vie | |||
| 269 | return GetParentDirectory()->GetDirectoryAbsolute(path); | 269 | return GetParentDirectory()->GetDirectoryAbsolute(path); |
| 270 | } | 270 | } |
| 271 | 271 | ||
| 272 | std::shared_ptr<VfsFile> VfsDirectory::GetFile(std::string_view name) const { | 272 | VirtualFile VfsDirectory::GetFile(std::string_view name) const { |
| 273 | const auto& files = GetFiles(); | 273 | const auto& files = GetFiles(); |
| 274 | const auto iter = std::find_if(files.begin(), files.end(), | 274 | const auto iter = std::find_if(files.begin(), files.end(), |
| 275 | [&name](const auto& file1) { return name == file1->GetName(); }); | 275 | [&name](const auto& file1) { return name == file1->GetName(); }); |
| 276 | return iter == files.end() ? nullptr : *iter; | 276 | return iter == files.end() ? nullptr : *iter; |
| 277 | } | 277 | } |
| 278 | 278 | ||
| 279 | std::shared_ptr<VfsDirectory> VfsDirectory::GetSubdirectory(std::string_view name) const { | 279 | VirtualDir VfsDirectory::GetSubdirectory(std::string_view name) const { |
| 280 | const auto& subs = GetSubdirectories(); | 280 | const auto& subs = GetSubdirectories(); |
| 281 | const auto iter = std::find_if(subs.begin(), subs.end(), | 281 | const auto iter = std::find_if(subs.begin(), subs.end(), |
| 282 | [&name](const auto& file1) { return name == file1->GetName(); }); | 282 | [&name](const auto& file1) { return name == file1->GetName(); }); |
| @@ -301,7 +301,7 @@ std::size_t VfsDirectory::GetSize() const { | |||
| 301 | return file_total + subdir_total; | 301 | return file_total + subdir_total; |
| 302 | } | 302 | } |
| 303 | 303 | ||
| 304 | std::shared_ptr<VfsFile> VfsDirectory::CreateFileRelative(std::string_view path) { | 304 | VirtualFile VfsDirectory::CreateFileRelative(std::string_view path) { |
| 305 | auto vec = Common::FS::SplitPathComponents(path); | 305 | auto vec = Common::FS::SplitPathComponents(path); |
| 306 | vec.erase(std::remove_if(vec.begin(), vec.end(), [](const auto& str) { return str.empty(); }), | 306 | vec.erase(std::remove_if(vec.begin(), vec.end(), [](const auto& str) { return str.empty(); }), |
| 307 | vec.end()); | 307 | vec.end()); |
| @@ -324,7 +324,7 @@ std::shared_ptr<VfsFile> VfsDirectory::CreateFileRelative(std::string_view path) | |||
| 324 | return dir->CreateFileRelative(Common::FS::GetPathWithoutTop(path)); | 324 | return dir->CreateFileRelative(Common::FS::GetPathWithoutTop(path)); |
| 325 | } | 325 | } |
| 326 | 326 | ||
| 327 | std::shared_ptr<VfsFile> VfsDirectory::CreateFileAbsolute(std::string_view path) { | 327 | VirtualFile VfsDirectory::CreateFileAbsolute(std::string_view path) { |
| 328 | if (IsRoot()) { | 328 | if (IsRoot()) { |
| 329 | return CreateFileRelative(path); | 329 | return CreateFileRelative(path); |
| 330 | } | 330 | } |
| @@ -332,7 +332,7 @@ std::shared_ptr<VfsFile> VfsDirectory::CreateFileAbsolute(std::string_view path) | |||
| 332 | return GetParentDirectory()->CreateFileAbsolute(path); | 332 | return GetParentDirectory()->CreateFileAbsolute(path); |
| 333 | } | 333 | } |
| 334 | 334 | ||
| 335 | std::shared_ptr<VfsDirectory> VfsDirectory::CreateDirectoryRelative(std::string_view path) { | 335 | VirtualDir VfsDirectory::CreateDirectoryRelative(std::string_view path) { |
| 336 | auto vec = Common::FS::SplitPathComponents(path); | 336 | auto vec = Common::FS::SplitPathComponents(path); |
| 337 | vec.erase(std::remove_if(vec.begin(), vec.end(), [](const auto& str) { return str.empty(); }), | 337 | vec.erase(std::remove_if(vec.begin(), vec.end(), [](const auto& str) { return str.empty(); }), |
| 338 | vec.end()); | 338 | vec.end()); |
| @@ -355,7 +355,7 @@ std::shared_ptr<VfsDirectory> VfsDirectory::CreateDirectoryRelative(std::string_ | |||
| 355 | return dir->CreateDirectoryRelative(Common::FS::GetPathWithoutTop(path)); | 355 | return dir->CreateDirectoryRelative(Common::FS::GetPathWithoutTop(path)); |
| 356 | } | 356 | } |
| 357 | 357 | ||
| 358 | std::shared_ptr<VfsDirectory> VfsDirectory::CreateDirectoryAbsolute(std::string_view path) { | 358 | VirtualDir VfsDirectory::CreateDirectoryAbsolute(std::string_view path) { |
| 359 | if (IsRoot()) { | 359 | if (IsRoot()) { |
| 360 | return CreateDirectoryRelative(path); | 360 | return CreateDirectoryRelative(path); |
| 361 | } | 361 | } |
| @@ -446,27 +446,27 @@ bool ReadOnlyVfsDirectory::IsReadable() const { | |||
| 446 | return true; | 446 | return true; |
| 447 | } | 447 | } |
| 448 | 448 | ||
| 449 | std::shared_ptr<VfsDirectory> ReadOnlyVfsDirectory::CreateSubdirectory(std::string_view name) { | 449 | VirtualDir ReadOnlyVfsDirectory::CreateSubdirectory(std::string_view name) { |
| 450 | return nullptr; | 450 | return nullptr; |
| 451 | } | 451 | } |
| 452 | 452 | ||
| 453 | std::shared_ptr<VfsFile> ReadOnlyVfsDirectory::CreateFile(std::string_view name) { | 453 | VirtualFile ReadOnlyVfsDirectory::CreateFile(std::string_view name) { |
| 454 | return nullptr; | 454 | return nullptr; |
| 455 | } | 455 | } |
| 456 | 456 | ||
| 457 | std::shared_ptr<VfsFile> ReadOnlyVfsDirectory::CreateFileAbsolute(std::string_view path) { | 457 | VirtualFile ReadOnlyVfsDirectory::CreateFileAbsolute(std::string_view path) { |
| 458 | return nullptr; | 458 | return nullptr; |
| 459 | } | 459 | } |
| 460 | 460 | ||
| 461 | std::shared_ptr<VfsFile> ReadOnlyVfsDirectory::CreateFileRelative(std::string_view path) { | 461 | VirtualFile ReadOnlyVfsDirectory::CreateFileRelative(std::string_view path) { |
| 462 | return nullptr; | 462 | return nullptr; |
| 463 | } | 463 | } |
| 464 | 464 | ||
| 465 | std::shared_ptr<VfsDirectory> ReadOnlyVfsDirectory::CreateDirectoryAbsolute(std::string_view path) { | 465 | VirtualDir ReadOnlyVfsDirectory::CreateDirectoryAbsolute(std::string_view path) { |
| 466 | return nullptr; | 466 | return nullptr; |
| 467 | } | 467 | } |
| 468 | 468 | ||
| 469 | std::shared_ptr<VfsDirectory> ReadOnlyVfsDirectory::CreateDirectoryRelative(std::string_view path) { | 469 | VirtualDir ReadOnlyVfsDirectory::CreateDirectoryRelative(std::string_view path) { |
| 470 | return nullptr; | 470 | return nullptr; |
| 471 | } | 471 | } |
| 472 | 472 | ||
diff --git a/src/core/file_sys/vfs.h b/src/core/file_sys/vfs.h index 954094772..afd64e95c 100644 --- a/src/core/file_sys/vfs.h +++ b/src/core/file_sys/vfs.h | |||
| @@ -91,7 +91,7 @@ public: | |||
| 91 | // Resizes the file to new_size. Returns whether or not the operation was successful. | 91 | // Resizes the file to new_size. Returns whether or not the operation was successful. |
| 92 | virtual bool Resize(std::size_t new_size) = 0; | 92 | virtual bool Resize(std::size_t new_size) = 0; |
| 93 | // Gets a pointer to the directory containing this file, returning nullptr if there is none. | 93 | // Gets a pointer to the directory containing this file, returning nullptr if there is none. |
| 94 | virtual std::shared_ptr<VfsDirectory> GetContainingDirectory() const = 0; | 94 | virtual VirtualDir GetContainingDirectory() const = 0; |
| 95 | 95 | ||
| 96 | // Returns whether or not the file can be written to. | 96 | // Returns whether or not the file can be written to. |
| 97 | virtual bool IsWritable() const = 0; | 97 | virtual bool IsWritable() const = 0; |
| @@ -183,27 +183,27 @@ public: | |||
| 183 | 183 | ||
| 184 | // Retrives the file located at path as if the current directory was root. Returns nullptr if | 184 | // Retrives the file located at path as if the current directory was root. Returns nullptr if |
| 185 | // not found. | 185 | // not found. |
| 186 | virtual std::shared_ptr<VfsFile> GetFileRelative(std::string_view path) const; | 186 | virtual VirtualFile GetFileRelative(std::string_view path) const; |
| 187 | // Calls GetFileRelative(path) on the root of the current directory. | 187 | // Calls GetFileRelative(path) on the root of the current directory. |
| 188 | virtual std::shared_ptr<VfsFile> GetFileAbsolute(std::string_view path) const; | 188 | virtual VirtualFile GetFileAbsolute(std::string_view path) const; |
| 189 | 189 | ||
| 190 | // Retrives the directory located at path as if the current directory was root. Returns nullptr | 190 | // Retrives the directory located at path as if the current directory was root. Returns nullptr |
| 191 | // if not found. | 191 | // if not found. |
| 192 | virtual std::shared_ptr<VfsDirectory> GetDirectoryRelative(std::string_view path) const; | 192 | virtual VirtualDir GetDirectoryRelative(std::string_view path) const; |
| 193 | // Calls GetDirectoryRelative(path) on the root of the current directory. | 193 | // Calls GetDirectoryRelative(path) on the root of the current directory. |
| 194 | virtual std::shared_ptr<VfsDirectory> GetDirectoryAbsolute(std::string_view path) const; | 194 | virtual VirtualDir GetDirectoryAbsolute(std::string_view path) const; |
| 195 | 195 | ||
| 196 | // Returns a vector containing all of the files in this directory. | 196 | // Returns a vector containing all of the files in this directory. |
| 197 | virtual std::vector<std::shared_ptr<VfsFile>> GetFiles() const = 0; | 197 | virtual std::vector<VirtualFile> GetFiles() const = 0; |
| 198 | // Returns the file with filename matching name. Returns nullptr if directory dosen't have a | 198 | // Returns the file with filename matching name. Returns nullptr if directory dosen't have a |
| 199 | // file with name. | 199 | // file with name. |
| 200 | virtual std::shared_ptr<VfsFile> GetFile(std::string_view name) const; | 200 | virtual VirtualFile GetFile(std::string_view name) const; |
| 201 | 201 | ||
| 202 | // Returns a vector containing all of the subdirectories in this directory. | 202 | // Returns a vector containing all of the subdirectories in this directory. |
| 203 | virtual std::vector<std::shared_ptr<VfsDirectory>> GetSubdirectories() const = 0; | 203 | virtual std::vector<VirtualDir> GetSubdirectories() const = 0; |
| 204 | // Returns the directory with name matching name. Returns nullptr if directory dosen't have a | 204 | // Returns the directory with name matching name. Returns nullptr if directory dosen't have a |
| 205 | // directory with name. | 205 | // directory with name. |
| 206 | virtual std::shared_ptr<VfsDirectory> GetSubdirectory(std::string_view name) const; | 206 | virtual VirtualDir GetSubdirectory(std::string_view name) const; |
| 207 | 207 | ||
| 208 | // Returns whether or not the directory can be written to. | 208 | // Returns whether or not the directory can be written to. |
| 209 | virtual bool IsWritable() const = 0; | 209 | virtual bool IsWritable() const = 0; |
| @@ -219,31 +219,31 @@ public: | |||
| 219 | virtual std::size_t GetSize() const; | 219 | virtual std::size_t GetSize() const; |
| 220 | // Returns the parent directory of this directory. Returns nullptr if this directory is root or | 220 | // Returns the parent directory of this directory. Returns nullptr if this directory is root or |
| 221 | // has no parent. | 221 | // has no parent. |
| 222 | virtual std::shared_ptr<VfsDirectory> GetParentDirectory() const = 0; | 222 | virtual VirtualDir GetParentDirectory() const = 0; |
| 223 | 223 | ||
| 224 | // Creates a new subdirectory with name name. Returns a pointer to the new directory or nullptr | 224 | // Creates a new subdirectory with name name. Returns a pointer to the new directory or nullptr |
| 225 | // if the operation failed. | 225 | // if the operation failed. |
| 226 | virtual std::shared_ptr<VfsDirectory> CreateSubdirectory(std::string_view name) = 0; | 226 | virtual VirtualDir CreateSubdirectory(std::string_view name) = 0; |
| 227 | // Creates a new file with name name. Returns a pointer to the new file or nullptr if the | 227 | // Creates a new file with name name. Returns a pointer to the new file or nullptr if the |
| 228 | // operation failed. | 228 | // operation failed. |
| 229 | virtual std::shared_ptr<VfsFile> CreateFile(std::string_view name) = 0; | 229 | virtual VirtualFile CreateFile(std::string_view name) = 0; |
| 230 | 230 | ||
| 231 | // Creates a new file at the path relative to this directory. Also creates directories if | 231 | // Creates a new file at the path relative to this directory. Also creates directories if |
| 232 | // they do not exist and is supported by this implementation. Returns nullptr on any failure. | 232 | // they do not exist and is supported by this implementation. Returns nullptr on any failure. |
| 233 | virtual std::shared_ptr<VfsFile> CreateFileRelative(std::string_view path); | 233 | virtual VirtualFile CreateFileRelative(std::string_view path); |
| 234 | 234 | ||
| 235 | // Creates a new file at the path relative to root of this directory. Also creates directories | 235 | // Creates a new file at the path relative to root of this directory. Also creates directories |
| 236 | // if they do not exist and is supported by this implementation. Returns nullptr on any failure. | 236 | // if they do not exist and is supported by this implementation. Returns nullptr on any failure. |
| 237 | virtual std::shared_ptr<VfsFile> CreateFileAbsolute(std::string_view path); | 237 | virtual VirtualFile CreateFileAbsolute(std::string_view path); |
| 238 | 238 | ||
| 239 | // Creates a new directory at the path relative to this directory. Also creates directories if | 239 | // Creates a new directory at the path relative to this directory. Also creates directories if |
| 240 | // they do not exist and is supported by this implementation. Returns nullptr on any failure. | 240 | // they do not exist and is supported by this implementation. Returns nullptr on any failure. |
| 241 | virtual std::shared_ptr<VfsDirectory> CreateDirectoryRelative(std::string_view path); | 241 | virtual VirtualDir CreateDirectoryRelative(std::string_view path); |
| 242 | 242 | ||
| 243 | // Creates a new directory at the path relative to root of this directory. Also creates | 243 | // Creates a new directory at the path relative to root of this directory. Also creates |
| 244 | // directories if they do not exist and is supported by this implementation. Returns nullptr on | 244 | // directories if they do not exist and is supported by this implementation. Returns nullptr on |
| 245 | // any failure. | 245 | // any failure. |
| 246 | virtual std::shared_ptr<VfsDirectory> CreateDirectoryAbsolute(std::string_view path); | 246 | virtual VirtualDir CreateDirectoryAbsolute(std::string_view path); |
| 247 | 247 | ||
| 248 | // Deletes the subdirectory with the given name and returns true on success. | 248 | // Deletes the subdirectory with the given name and returns true on success. |
| 249 | virtual bool DeleteSubdirectory(std::string_view name) = 0; | 249 | virtual bool DeleteSubdirectory(std::string_view name) = 0; |
| @@ -280,12 +280,12 @@ class ReadOnlyVfsDirectory : public VfsDirectory { | |||
| 280 | public: | 280 | public: |
| 281 | bool IsWritable() const override; | 281 | bool IsWritable() const override; |
| 282 | bool IsReadable() const override; | 282 | bool IsReadable() const override; |
| 283 | std::shared_ptr<VfsDirectory> CreateSubdirectory(std::string_view name) override; | 283 | VirtualDir CreateSubdirectory(std::string_view name) override; |
| 284 | std::shared_ptr<VfsFile> CreateFile(std::string_view name) override; | 284 | VirtualFile CreateFile(std::string_view name) override; |
| 285 | std::shared_ptr<VfsFile> CreateFileAbsolute(std::string_view path) override; | 285 | VirtualFile CreateFileAbsolute(std::string_view path) override; |
| 286 | std::shared_ptr<VfsFile> CreateFileRelative(std::string_view path) override; | 286 | VirtualFile CreateFileRelative(std::string_view path) override; |
| 287 | std::shared_ptr<VfsDirectory> CreateDirectoryAbsolute(std::string_view path) override; | 287 | VirtualDir CreateDirectoryAbsolute(std::string_view path) override; |
| 288 | std::shared_ptr<VfsDirectory> CreateDirectoryRelative(std::string_view path) override; | 288 | VirtualDir CreateDirectoryRelative(std::string_view path) override; |
| 289 | bool DeleteSubdirectory(std::string_view name) override; | 289 | bool DeleteSubdirectory(std::string_view name) override; |
| 290 | bool DeleteSubdirectoryRecursive(std::string_view name) override; | 290 | bool DeleteSubdirectoryRecursive(std::string_view name) override; |
| 291 | bool CleanSubdirectoryRecursive(std::string_view name) override; | 291 | bool CleanSubdirectoryRecursive(std::string_view name) override; |
diff --git a/src/core/file_sys/vfs_concat.cpp b/src/core/file_sys/vfs_concat.cpp index e0ff70174..3c5a7d87a 100644 --- a/src/core/file_sys/vfs_concat.cpp +++ b/src/core/file_sys/vfs_concat.cpp | |||
| @@ -46,7 +46,7 @@ VirtualFile ConcatenatedVfsFile::MakeConcatenatedFile(std::vector<VirtualFile> f | |||
| 46 | if (files.size() == 1) | 46 | if (files.size() == 1) |
| 47 | return files[0]; | 47 | return files[0]; |
| 48 | 48 | ||
| 49 | return std::shared_ptr<VfsFile>(new ConcatenatedVfsFile(std::move(files), std::move(name))); | 49 | return VirtualFile(new ConcatenatedVfsFile(std::move(files), std::move(name))); |
| 50 | } | 50 | } |
| 51 | 51 | ||
| 52 | VirtualFile ConcatenatedVfsFile::MakeConcatenatedFile(u8 filler_byte, | 52 | VirtualFile ConcatenatedVfsFile::MakeConcatenatedFile(u8 filler_byte, |
| @@ -71,20 +71,23 @@ VirtualFile ConcatenatedVfsFile::MakeConcatenatedFile(u8 filler_byte, | |||
| 71 | if (files.begin()->first != 0) | 71 | if (files.begin()->first != 0) |
| 72 | files.emplace(0, std::make_shared<StaticVfsFile>(filler_byte, files.begin()->first)); | 72 | files.emplace(0, std::make_shared<StaticVfsFile>(filler_byte, files.begin()->first)); |
| 73 | 73 | ||
| 74 | return std::shared_ptr<VfsFile>(new ConcatenatedVfsFile(std::move(files), std::move(name))); | 74 | return VirtualFile(new ConcatenatedVfsFile(std::move(files), std::move(name))); |
| 75 | } | 75 | } |
| 76 | 76 | ||
| 77 | std::string ConcatenatedVfsFile::GetName() const { | 77 | std::string ConcatenatedVfsFile::GetName() const { |
| 78 | if (files.empty()) | 78 | if (files.empty()) { |
| 79 | return ""; | 79 | return ""; |
| 80 | if (!name.empty()) | 80 | } |
| 81 | if (!name.empty()) { | ||
| 81 | return name; | 82 | return name; |
| 83 | } | ||
| 82 | return files.begin()->second->GetName(); | 84 | return files.begin()->second->GetName(); |
| 83 | } | 85 | } |
| 84 | 86 | ||
| 85 | std::size_t ConcatenatedVfsFile::GetSize() const { | 87 | std::size_t ConcatenatedVfsFile::GetSize() const { |
| 86 | if (files.empty()) | 88 | if (files.empty()) { |
| 87 | return 0; | 89 | return 0; |
| 90 | } | ||
| 88 | return files.rbegin()->first + files.rbegin()->second->GetSize(); | 91 | return files.rbegin()->first + files.rbegin()->second->GetSize(); |
| 89 | } | 92 | } |
| 90 | 93 | ||
| @@ -92,9 +95,10 @@ bool ConcatenatedVfsFile::Resize(std::size_t new_size) { | |||
| 92 | return false; | 95 | return false; |
| 93 | } | 96 | } |
| 94 | 97 | ||
| 95 | std::shared_ptr<VfsDirectory> ConcatenatedVfsFile::GetContainingDirectory() const { | 98 | VirtualDir ConcatenatedVfsFile::GetContainingDirectory() const { |
| 96 | if (files.empty()) | 99 | if (files.empty()) { |
| 97 | return nullptr; | 100 | return nullptr; |
| 101 | } | ||
| 98 | return files.begin()->second->GetContainingDirectory(); | 102 | return files.begin()->second->GetContainingDirectory(); |
| 99 | } | 103 | } |
| 100 | 104 | ||
diff --git a/src/core/file_sys/vfs_concat.h b/src/core/file_sys/vfs_concat.h index 7a26343c0..287c72555 100644 --- a/src/core/file_sys/vfs_concat.h +++ b/src/core/file_sys/vfs_concat.h | |||
| @@ -31,7 +31,7 @@ public: | |||
| 31 | std::string GetName() const override; | 31 | std::string GetName() const override; |
| 32 | std::size_t GetSize() const override; | 32 | std::size_t GetSize() const override; |
| 33 | bool Resize(std::size_t new_size) override; | 33 | bool Resize(std::size_t new_size) override; |
| 34 | std::shared_ptr<VfsDirectory> GetContainingDirectory() const override; | 34 | VirtualDir GetContainingDirectory() const override; |
| 35 | bool IsWritable() const override; | 35 | bool IsWritable() const override; |
| 36 | bool IsReadable() const override; | 36 | bool IsReadable() const override; |
| 37 | std::size_t Read(u8* data, std::size_t length, std::size_t offset) const override; | 37 | std::size_t Read(u8* data, std::size_t length, std::size_t offset) const override; |
diff --git a/src/core/file_sys/vfs_layered.cpp b/src/core/file_sys/vfs_layered.cpp index 338e398da..434b03cec 100644 --- a/src/core/file_sys/vfs_layered.cpp +++ b/src/core/file_sys/vfs_layered.cpp | |||
| @@ -20,10 +20,10 @@ VirtualDir LayeredVfsDirectory::MakeLayeredDirectory(std::vector<VirtualDir> dir | |||
| 20 | if (dirs.size() == 1) | 20 | if (dirs.size() == 1) |
| 21 | return dirs[0]; | 21 | return dirs[0]; |
| 22 | 22 | ||
| 23 | return std::shared_ptr<VfsDirectory>(new LayeredVfsDirectory(std::move(dirs), std::move(name))); | 23 | return VirtualDir(new LayeredVfsDirectory(std::move(dirs), std::move(name))); |
| 24 | } | 24 | } |
| 25 | 25 | ||
| 26 | std::shared_ptr<VfsFile> LayeredVfsDirectory::GetFileRelative(std::string_view path) const { | 26 | VirtualFile LayeredVfsDirectory::GetFileRelative(std::string_view path) const { |
| 27 | for (const auto& layer : dirs) { | 27 | for (const auto& layer : dirs) { |
| 28 | const auto file = layer->GetFileRelative(path); | 28 | const auto file = layer->GetFileRelative(path); |
| 29 | if (file != nullptr) | 29 | if (file != nullptr) |
| @@ -33,23 +33,23 @@ std::shared_ptr<VfsFile> LayeredVfsDirectory::GetFileRelative(std::string_view p | |||
| 33 | return nullptr; | 33 | return nullptr; |
| 34 | } | 34 | } |
| 35 | 35 | ||
| 36 | std::shared_ptr<VfsDirectory> LayeredVfsDirectory::GetDirectoryRelative( | 36 | VirtualDir LayeredVfsDirectory::GetDirectoryRelative(std::string_view path) const { |
| 37 | std::string_view path) const { | ||
| 38 | std::vector<VirtualDir> out; | 37 | std::vector<VirtualDir> out; |
| 39 | for (const auto& layer : dirs) { | 38 | for (const auto& layer : dirs) { |
| 40 | auto dir = layer->GetDirectoryRelative(path); | 39 | auto dir = layer->GetDirectoryRelative(path); |
| 41 | if (dir != nullptr) | 40 | if (dir != nullptr) { |
| 42 | out.push_back(std::move(dir)); | 41 | out.push_back(std::move(dir)); |
| 42 | } | ||
| 43 | } | 43 | } |
| 44 | 44 | ||
| 45 | return MakeLayeredDirectory(std::move(out)); | 45 | return MakeLayeredDirectory(std::move(out)); |
| 46 | } | 46 | } |
| 47 | 47 | ||
| 48 | std::shared_ptr<VfsFile> LayeredVfsDirectory::GetFile(std::string_view name) const { | 48 | VirtualFile LayeredVfsDirectory::GetFile(std::string_view name) const { |
| 49 | return GetFileRelative(name); | 49 | return GetFileRelative(name); |
| 50 | } | 50 | } |
| 51 | 51 | ||
| 52 | std::shared_ptr<VfsDirectory> LayeredVfsDirectory::GetSubdirectory(std::string_view name) const { | 52 | VirtualDir LayeredVfsDirectory::GetSubdirectory(std::string_view name) const { |
| 53 | return GetDirectoryRelative(name); | 53 | return GetDirectoryRelative(name); |
| 54 | } | 54 | } |
| 55 | 55 | ||
| @@ -57,7 +57,7 @@ std::string LayeredVfsDirectory::GetFullPath() const { | |||
| 57 | return dirs[0]->GetFullPath(); | 57 | return dirs[0]->GetFullPath(); |
| 58 | } | 58 | } |
| 59 | 59 | ||
| 60 | std::vector<std::shared_ptr<VfsFile>> LayeredVfsDirectory::GetFiles() const { | 60 | std::vector<VirtualFile> LayeredVfsDirectory::GetFiles() const { |
| 61 | std::vector<VirtualFile> out; | 61 | std::vector<VirtualFile> out; |
| 62 | for (const auto& layer : dirs) { | 62 | for (const auto& layer : dirs) { |
| 63 | for (const auto& file : layer->GetFiles()) { | 63 | for (const auto& file : layer->GetFiles()) { |
| @@ -72,7 +72,7 @@ std::vector<std::shared_ptr<VfsFile>> LayeredVfsDirectory::GetFiles() const { | |||
| 72 | return out; | 72 | return out; |
| 73 | } | 73 | } |
| 74 | 74 | ||
| 75 | std::vector<std::shared_ptr<VfsDirectory>> LayeredVfsDirectory::GetSubdirectories() const { | 75 | std::vector<VirtualDir> LayeredVfsDirectory::GetSubdirectories() const { |
| 76 | std::vector<std::string> names; | 76 | std::vector<std::string> names; |
| 77 | for (const auto& layer : dirs) { | 77 | for (const auto& layer : dirs) { |
| 78 | for (const auto& sd : layer->GetSubdirectories()) { | 78 | for (const auto& sd : layer->GetSubdirectories()) { |
| @@ -101,15 +101,15 @@ std::string LayeredVfsDirectory::GetName() const { | |||
| 101 | return name.empty() ? dirs[0]->GetName() : name; | 101 | return name.empty() ? dirs[0]->GetName() : name; |
| 102 | } | 102 | } |
| 103 | 103 | ||
| 104 | std::shared_ptr<VfsDirectory> LayeredVfsDirectory::GetParentDirectory() const { | 104 | VirtualDir LayeredVfsDirectory::GetParentDirectory() const { |
| 105 | return dirs[0]->GetParentDirectory(); | 105 | return dirs[0]->GetParentDirectory(); |
| 106 | } | 106 | } |
| 107 | 107 | ||
| 108 | std::shared_ptr<VfsDirectory> LayeredVfsDirectory::CreateSubdirectory(std::string_view name) { | 108 | VirtualDir LayeredVfsDirectory::CreateSubdirectory(std::string_view name) { |
| 109 | return nullptr; | 109 | return nullptr; |
| 110 | } | 110 | } |
| 111 | 111 | ||
| 112 | std::shared_ptr<VfsFile> LayeredVfsDirectory::CreateFile(std::string_view name) { | 112 | VirtualFile LayeredVfsDirectory::CreateFile(std::string_view name) { |
| 113 | return nullptr; | 113 | return nullptr; |
| 114 | } | 114 | } |
| 115 | 115 | ||
diff --git a/src/core/file_sys/vfs_layered.h b/src/core/file_sys/vfs_layered.h index 8a25c3428..6d7513ac6 100644 --- a/src/core/file_sys/vfs_layered.h +++ b/src/core/file_sys/vfs_layered.h | |||
| @@ -21,20 +21,20 @@ public: | |||
| 21 | /// Wrapper function to allow for more efficient handling of dirs.size() == 0, 1 cases. | 21 | /// Wrapper function to allow for more efficient handling of dirs.size() == 0, 1 cases. |
| 22 | static VirtualDir MakeLayeredDirectory(std::vector<VirtualDir> dirs, std::string name = ""); | 22 | static VirtualDir MakeLayeredDirectory(std::vector<VirtualDir> dirs, std::string name = ""); |
| 23 | 23 | ||
| 24 | std::shared_ptr<VfsFile> GetFileRelative(std::string_view path) const override; | 24 | VirtualFile GetFileRelative(std::string_view path) const override; |
| 25 | std::shared_ptr<VfsDirectory> GetDirectoryRelative(std::string_view path) const override; | 25 | VirtualDir GetDirectoryRelative(std::string_view path) const override; |
| 26 | std::shared_ptr<VfsFile> GetFile(std::string_view name) const override; | 26 | VirtualFile GetFile(std::string_view name) const override; |
| 27 | std::shared_ptr<VfsDirectory> GetSubdirectory(std::string_view name) const override; | 27 | VirtualDir GetSubdirectory(std::string_view name) const override; |
| 28 | std::string GetFullPath() const override; | 28 | std::string GetFullPath() const override; |
| 29 | 29 | ||
| 30 | std::vector<std::shared_ptr<VfsFile>> GetFiles() const override; | 30 | std::vector<VirtualFile> GetFiles() const override; |
| 31 | std::vector<std::shared_ptr<VfsDirectory>> GetSubdirectories() const override; | 31 | std::vector<VirtualDir> GetSubdirectories() const override; |
| 32 | bool IsWritable() const override; | 32 | bool IsWritable() const override; |
| 33 | bool IsReadable() const override; | 33 | bool IsReadable() const override; |
| 34 | std::string GetName() const override; | 34 | std::string GetName() const override; |
| 35 | std::shared_ptr<VfsDirectory> GetParentDirectory() const override; | 35 | VirtualDir GetParentDirectory() const override; |
| 36 | std::shared_ptr<VfsDirectory> CreateSubdirectory(std::string_view name) override; | 36 | VirtualDir CreateSubdirectory(std::string_view name) override; |
| 37 | std::shared_ptr<VfsFile> CreateFile(std::string_view name) override; | 37 | VirtualFile CreateFile(std::string_view name) override; |
| 38 | bool DeleteSubdirectory(std::string_view name) override; | 38 | bool DeleteSubdirectory(std::string_view name) override; |
| 39 | bool DeleteFile(std::string_view name) override; | 39 | bool DeleteFile(std::string_view name) override; |
| 40 | bool Rename(std::string_view name) override; | 40 | bool Rename(std::string_view name) override; |
diff --git a/src/core/file_sys/vfs_offset.cpp b/src/core/file_sys/vfs_offset.cpp index 7714d3de5..056737b54 100644 --- a/src/core/file_sys/vfs_offset.cpp +++ b/src/core/file_sys/vfs_offset.cpp | |||
| @@ -9,7 +9,7 @@ | |||
| 9 | 9 | ||
| 10 | namespace FileSys { | 10 | namespace FileSys { |
| 11 | 11 | ||
| 12 | OffsetVfsFile::OffsetVfsFile(std::shared_ptr<VfsFile> file_, std::size_t size_, std::size_t offset_, | 12 | OffsetVfsFile::OffsetVfsFile(VirtualFile file_, std::size_t size_, std::size_t offset_, |
| 13 | std::string name_, VirtualDir parent_) | 13 | std::string name_, VirtualDir parent_) |
| 14 | : file(file_), offset(offset_), size(size_), name(std::move(name_)), | 14 | : file(file_), offset(offset_), size(size_), name(std::move(name_)), |
| 15 | parent(parent_ == nullptr ? file->GetContainingDirectory() : std::move(parent_)) {} | 15 | parent(parent_ == nullptr ? file->GetContainingDirectory() : std::move(parent_)) {} |
| @@ -37,7 +37,7 @@ bool OffsetVfsFile::Resize(std::size_t new_size) { | |||
| 37 | return true; | 37 | return true; |
| 38 | } | 38 | } |
| 39 | 39 | ||
| 40 | std::shared_ptr<VfsDirectory> OffsetVfsFile::GetContainingDirectory() const { | 40 | VirtualDir OffsetVfsFile::GetContainingDirectory() const { |
| 41 | return parent; | 41 | return parent; |
| 42 | } | 42 | } |
| 43 | 43 | ||
diff --git a/src/core/file_sys/vfs_offset.h b/src/core/file_sys/vfs_offset.h index f7b7a3256..b2ccc5c7b 100644 --- a/src/core/file_sys/vfs_offset.h +++ b/src/core/file_sys/vfs_offset.h | |||
| @@ -17,14 +17,14 @@ namespace FileSys { | |||
| 17 | // the size of this wrapper. | 17 | // the size of this wrapper. |
| 18 | class OffsetVfsFile : public VfsFile { | 18 | class OffsetVfsFile : public VfsFile { |
| 19 | public: | 19 | public: |
| 20 | OffsetVfsFile(std::shared_ptr<VfsFile> file, std::size_t size, std::size_t offset = 0, | 20 | OffsetVfsFile(VirtualFile file, std::size_t size, std::size_t offset = 0, |
| 21 | std::string new_name = "", VirtualDir new_parent = nullptr); | 21 | std::string new_name = "", VirtualDir new_parent = nullptr); |
| 22 | ~OffsetVfsFile() override; | 22 | ~OffsetVfsFile() override; |
| 23 | 23 | ||
| 24 | std::string GetName() const override; | 24 | std::string GetName() const override; |
| 25 | std::size_t GetSize() const override; | 25 | std::size_t GetSize() const override; |
| 26 | bool Resize(std::size_t new_size) override; | 26 | bool Resize(std::size_t new_size) override; |
| 27 | std::shared_ptr<VfsDirectory> GetContainingDirectory() const override; | 27 | VirtualDir GetContainingDirectory() const override; |
| 28 | bool IsWritable() const override; | 28 | bool IsWritable() const override; |
| 29 | bool IsReadable() const override; | 29 | bool IsReadable() const override; |
| 30 | std::size_t Read(u8* data, std::size_t length, std::size_t offset) const override; | 30 | std::size_t Read(u8* data, std::size_t length, std::size_t offset) const override; |
| @@ -42,7 +42,7 @@ public: | |||
| 42 | private: | 42 | private: |
| 43 | std::size_t TrimToFit(std::size_t r_size, std::size_t r_offset) const; | 43 | std::size_t TrimToFit(std::size_t r_size, std::size_t r_offset) const; |
| 44 | 44 | ||
| 45 | std::shared_ptr<VfsFile> file; | 45 | VirtualFile file; |
| 46 | std::size_t offset; | 46 | std::size_t offset; |
| 47 | std::size_t size; | 47 | std::size_t size; |
| 48 | std::string name; | 48 | std::string name; |
diff --git a/src/core/file_sys/vfs_real.cpp b/src/core/file_sys/vfs_real.cpp index 488687ba9..a287eebe3 100644 --- a/src/core/file_sys/vfs_real.cpp +++ b/src/core/file_sys/vfs_real.cpp | |||
| @@ -263,7 +263,7 @@ bool RealVfsFile::Resize(std::size_t new_size) { | |||
| 263 | return backing->Resize(new_size); | 263 | return backing->Resize(new_size); |
| 264 | } | 264 | } |
| 265 | 265 | ||
| 266 | std::shared_ptr<VfsDirectory> RealVfsFile::GetContainingDirectory() const { | 266 | VirtualDir RealVfsFile::GetContainingDirectory() const { |
| 267 | return base.OpenDirectory(parent_path, perms); | 267 | return base.OpenDirectory(parent_path, perms); |
| 268 | } | 268 | } |
| 269 | 269 | ||
| @@ -352,7 +352,7 @@ RealVfsDirectory::RealVfsDirectory(RealVfsFilesystem& base_, const std::string& | |||
| 352 | 352 | ||
| 353 | RealVfsDirectory::~RealVfsDirectory() = default; | 353 | RealVfsDirectory::~RealVfsDirectory() = default; |
| 354 | 354 | ||
| 355 | std::shared_ptr<VfsFile> RealVfsDirectory::GetFileRelative(std::string_view path) const { | 355 | VirtualFile RealVfsDirectory::GetFileRelative(std::string_view path) const { |
| 356 | const auto full_path = FS::SanitizePath(this->path + DIR_SEP + std::string(path)); | 356 | const auto full_path = FS::SanitizePath(this->path + DIR_SEP + std::string(path)); |
| 357 | if (!FS::Exists(full_path) || FS::IsDirectory(full_path)) { | 357 | if (!FS::Exists(full_path) || FS::IsDirectory(full_path)) { |
| 358 | return nullptr; | 358 | return nullptr; |
| @@ -360,7 +360,7 @@ std::shared_ptr<VfsFile> RealVfsDirectory::GetFileRelative(std::string_view path | |||
| 360 | return base.OpenFile(full_path, perms); | 360 | return base.OpenFile(full_path, perms); |
| 361 | } | 361 | } |
| 362 | 362 | ||
| 363 | std::shared_ptr<VfsDirectory> RealVfsDirectory::GetDirectoryRelative(std::string_view path) const { | 363 | VirtualDir RealVfsDirectory::GetDirectoryRelative(std::string_view path) const { |
| 364 | const auto full_path = FS::SanitizePath(this->path + DIR_SEP + std::string(path)); | 364 | const auto full_path = FS::SanitizePath(this->path + DIR_SEP + std::string(path)); |
| 365 | if (!FS::Exists(full_path) || !FS::IsDirectory(full_path)) { | 365 | if (!FS::Exists(full_path) || !FS::IsDirectory(full_path)) { |
| 366 | return nullptr; | 366 | return nullptr; |
| @@ -368,20 +368,20 @@ std::shared_ptr<VfsDirectory> RealVfsDirectory::GetDirectoryRelative(std::string | |||
| 368 | return base.OpenDirectory(full_path, perms); | 368 | return base.OpenDirectory(full_path, perms); |
| 369 | } | 369 | } |
| 370 | 370 | ||
| 371 | std::shared_ptr<VfsFile> RealVfsDirectory::GetFile(std::string_view name) const { | 371 | VirtualFile RealVfsDirectory::GetFile(std::string_view name) const { |
| 372 | return GetFileRelative(name); | 372 | return GetFileRelative(name); |
| 373 | } | 373 | } |
| 374 | 374 | ||
| 375 | std::shared_ptr<VfsDirectory> RealVfsDirectory::GetSubdirectory(std::string_view name) const { | 375 | VirtualDir RealVfsDirectory::GetSubdirectory(std::string_view name) const { |
| 376 | return GetDirectoryRelative(name); | 376 | return GetDirectoryRelative(name); |
| 377 | } | 377 | } |
| 378 | 378 | ||
| 379 | std::shared_ptr<VfsFile> RealVfsDirectory::CreateFileRelative(std::string_view path) { | 379 | VirtualFile RealVfsDirectory::CreateFileRelative(std::string_view path) { |
| 380 | const auto full_path = FS::SanitizePath(this->path + DIR_SEP + std::string(path)); | 380 | const auto full_path = FS::SanitizePath(this->path + DIR_SEP + std::string(path)); |
| 381 | return base.CreateFile(full_path, perms); | 381 | return base.CreateFile(full_path, perms); |
| 382 | } | 382 | } |
| 383 | 383 | ||
| 384 | std::shared_ptr<VfsDirectory> RealVfsDirectory::CreateDirectoryRelative(std::string_view path) { | 384 | VirtualDir RealVfsDirectory::CreateDirectoryRelative(std::string_view path) { |
| 385 | const auto full_path = FS::SanitizePath(this->path + DIR_SEP + std::string(path)); | 385 | const auto full_path = FS::SanitizePath(this->path + DIR_SEP + std::string(path)); |
| 386 | return base.CreateDirectory(full_path, perms); | 386 | return base.CreateDirectory(full_path, perms); |
| 387 | } | 387 | } |
| @@ -391,11 +391,11 @@ bool RealVfsDirectory::DeleteSubdirectoryRecursive(std::string_view name) { | |||
| 391 | return base.DeleteDirectory(full_path); | 391 | return base.DeleteDirectory(full_path); |
| 392 | } | 392 | } |
| 393 | 393 | ||
| 394 | std::vector<std::shared_ptr<VfsFile>> RealVfsDirectory::GetFiles() const { | 394 | std::vector<VirtualFile> RealVfsDirectory::GetFiles() const { |
| 395 | return IterateEntries<RealVfsFile, VfsFile>(); | 395 | return IterateEntries<RealVfsFile, VfsFile>(); |
| 396 | } | 396 | } |
| 397 | 397 | ||
| 398 | std::vector<std::shared_ptr<VfsDirectory>> RealVfsDirectory::GetSubdirectories() const { | 398 | std::vector<VirtualDir> RealVfsDirectory::GetSubdirectories() const { |
| 399 | return IterateEntries<RealVfsDirectory, VfsDirectory>(); | 399 | return IterateEntries<RealVfsDirectory, VfsDirectory>(); |
| 400 | } | 400 | } |
| 401 | 401 | ||
| @@ -411,7 +411,7 @@ std::string RealVfsDirectory::GetName() const { | |||
| 411 | return path_components.back(); | 411 | return path_components.back(); |
| 412 | } | 412 | } |
| 413 | 413 | ||
| 414 | std::shared_ptr<VfsDirectory> RealVfsDirectory::GetParentDirectory() const { | 414 | VirtualDir RealVfsDirectory::GetParentDirectory() const { |
| 415 | if (path_components.size() <= 1) { | 415 | if (path_components.size() <= 1) { |
| 416 | return nullptr; | 416 | return nullptr; |
| 417 | } | 417 | } |
| @@ -419,12 +419,12 @@ std::shared_ptr<VfsDirectory> RealVfsDirectory::GetParentDirectory() const { | |||
| 419 | return base.OpenDirectory(parent_path, perms); | 419 | return base.OpenDirectory(parent_path, perms); |
| 420 | } | 420 | } |
| 421 | 421 | ||
| 422 | std::shared_ptr<VfsDirectory> RealVfsDirectory::CreateSubdirectory(std::string_view name) { | 422 | VirtualDir RealVfsDirectory::CreateSubdirectory(std::string_view name) { |
| 423 | const std::string subdir_path = (path + DIR_SEP).append(name); | 423 | const std::string subdir_path = (path + DIR_SEP).append(name); |
| 424 | return base.CreateDirectory(subdir_path, perms); | 424 | return base.CreateDirectory(subdir_path, perms); |
| 425 | } | 425 | } |
| 426 | 426 | ||
| 427 | std::shared_ptr<VfsFile> RealVfsDirectory::CreateFile(std::string_view name) { | 427 | VirtualFile RealVfsDirectory::CreateFile(std::string_view name) { |
| 428 | const std::string file_path = (path + DIR_SEP).append(name); | 428 | const std::string file_path = (path + DIR_SEP).append(name); |
| 429 | return base.CreateFile(file_path, perms); | 429 | return base.CreateFile(file_path, perms); |
| 430 | } | 430 | } |
diff --git a/src/core/file_sys/vfs_real.h b/src/core/file_sys/vfs_real.h index 0b537b22c..23e99865e 100644 --- a/src/core/file_sys/vfs_real.h +++ b/src/core/file_sys/vfs_real.h | |||
| @@ -50,7 +50,7 @@ public: | |||
| 50 | std::string GetName() const override; | 50 | std::string GetName() const override; |
| 51 | std::size_t GetSize() const override; | 51 | std::size_t GetSize() const override; |
| 52 | bool Resize(std::size_t new_size) override; | 52 | bool Resize(std::size_t new_size) override; |
| 53 | std::shared_ptr<VfsDirectory> GetContainingDirectory() const override; | 53 | VirtualDir GetContainingDirectory() const override; |
| 54 | bool IsWritable() const override; | 54 | bool IsWritable() const override; |
| 55 | bool IsReadable() const override; | 55 | bool IsReadable() const override; |
| 56 | std::size_t Read(u8* data, std::size_t length, std::size_t offset) const override; | 56 | std::size_t Read(u8* data, std::size_t length, std::size_t offset) const override; |
| @@ -79,21 +79,21 @@ class RealVfsDirectory : public VfsDirectory { | |||
| 79 | public: | 79 | public: |
| 80 | ~RealVfsDirectory() override; | 80 | ~RealVfsDirectory() override; |
| 81 | 81 | ||
| 82 | std::shared_ptr<VfsFile> GetFileRelative(std::string_view path) const override; | 82 | VirtualFile GetFileRelative(std::string_view path) const override; |
| 83 | std::shared_ptr<VfsDirectory> GetDirectoryRelative(std::string_view path) const override; | 83 | VirtualDir GetDirectoryRelative(std::string_view path) const override; |
| 84 | std::shared_ptr<VfsFile> GetFile(std::string_view name) const override; | 84 | VirtualFile GetFile(std::string_view name) const override; |
| 85 | std::shared_ptr<VfsDirectory> GetSubdirectory(std::string_view name) const override; | 85 | VirtualDir GetSubdirectory(std::string_view name) const override; |
| 86 | std::shared_ptr<VfsFile> CreateFileRelative(std::string_view path) override; | 86 | VirtualFile CreateFileRelative(std::string_view path) override; |
| 87 | std::shared_ptr<VfsDirectory> CreateDirectoryRelative(std::string_view path) override; | 87 | VirtualDir CreateDirectoryRelative(std::string_view path) override; |
| 88 | bool DeleteSubdirectoryRecursive(std::string_view name) override; | 88 | bool DeleteSubdirectoryRecursive(std::string_view name) override; |
| 89 | std::vector<std::shared_ptr<VfsFile>> GetFiles() const override; | 89 | std::vector<VirtualFile> GetFiles() const override; |
| 90 | std::vector<std::shared_ptr<VfsDirectory>> GetSubdirectories() const override; | 90 | std::vector<VirtualDir> GetSubdirectories() const override; |
| 91 | bool IsWritable() const override; | 91 | bool IsWritable() const override; |
| 92 | bool IsReadable() const override; | 92 | bool IsReadable() const override; |
| 93 | std::string GetName() const override; | 93 | std::string GetName() const override; |
| 94 | std::shared_ptr<VfsDirectory> GetParentDirectory() const override; | 94 | VirtualDir GetParentDirectory() const override; |
| 95 | std::shared_ptr<VfsDirectory> CreateSubdirectory(std::string_view name) override; | 95 | VirtualDir CreateSubdirectory(std::string_view name) override; |
| 96 | std::shared_ptr<VfsFile> CreateFile(std::string_view name) override; | 96 | VirtualFile CreateFile(std::string_view name) override; |
| 97 | bool DeleteSubdirectory(std::string_view name) override; | 97 | bool DeleteSubdirectory(std::string_view name) override; |
| 98 | bool DeleteFile(std::string_view name) override; | 98 | bool DeleteFile(std::string_view name) override; |
| 99 | bool Rename(std::string_view name) override; | 99 | bool Rename(std::string_view name) override; |
diff --git a/src/core/file_sys/vfs_static.h b/src/core/file_sys/vfs_static.h index 8b27c30fa..c840b24b9 100644 --- a/src/core/file_sys/vfs_static.h +++ b/src/core/file_sys/vfs_static.h | |||
| @@ -31,7 +31,7 @@ public: | |||
| 31 | return true; | 31 | return true; |
| 32 | } | 32 | } |
| 33 | 33 | ||
| 34 | std::shared_ptr<VfsDirectory> GetContainingDirectory() const override { | 34 | VirtualDir GetContainingDirectory() const override { |
| 35 | return parent; | 35 | return parent; |
| 36 | } | 36 | } |
| 37 | 37 | ||
diff --git a/src/core/file_sys/vfs_vector.cpp b/src/core/file_sys/vfs_vector.cpp index 75fc04302..c1ec1e645 100644 --- a/src/core/file_sys/vfs_vector.cpp +++ b/src/core/file_sys/vfs_vector.cpp | |||
| @@ -25,7 +25,7 @@ bool VectorVfsFile::Resize(size_t new_size) { | |||
| 25 | return true; | 25 | return true; |
| 26 | } | 26 | } |
| 27 | 27 | ||
| 28 | std::shared_ptr<VfsDirectory> VectorVfsFile::GetContainingDirectory() const { | 28 | VirtualDir VectorVfsFile::GetContainingDirectory() const { |
| 29 | return parent; | 29 | return parent; |
| 30 | } | 30 | } |
| 31 | 31 | ||
| @@ -68,11 +68,11 @@ VectorVfsDirectory::VectorVfsDirectory(std::vector<VirtualFile> files_, | |||
| 68 | 68 | ||
| 69 | VectorVfsDirectory::~VectorVfsDirectory() = default; | 69 | VectorVfsDirectory::~VectorVfsDirectory() = default; |
| 70 | 70 | ||
| 71 | std::vector<std::shared_ptr<VfsFile>> VectorVfsDirectory::GetFiles() const { | 71 | std::vector<VirtualFile> VectorVfsDirectory::GetFiles() const { |
| 72 | return files; | 72 | return files; |
| 73 | } | 73 | } |
| 74 | 74 | ||
| 75 | std::vector<std::shared_ptr<VfsDirectory>> VectorVfsDirectory::GetSubdirectories() const { | 75 | std::vector<VirtualDir> VectorVfsDirectory::GetSubdirectories() const { |
| 76 | return dirs; | 76 | return dirs; |
| 77 | } | 77 | } |
| 78 | 78 | ||
| @@ -88,7 +88,7 @@ std::string VectorVfsDirectory::GetName() const { | |||
| 88 | return name; | 88 | return name; |
| 89 | } | 89 | } |
| 90 | 90 | ||
| 91 | std::shared_ptr<VfsDirectory> VectorVfsDirectory::GetParentDirectory() const { | 91 | VirtualDir VectorVfsDirectory::GetParentDirectory() const { |
| 92 | return parent; | 92 | return parent; |
| 93 | } | 93 | } |
| 94 | 94 | ||
| @@ -116,11 +116,11 @@ bool VectorVfsDirectory::Rename(std::string_view name_) { | |||
| 116 | return true; | 116 | return true; |
| 117 | } | 117 | } |
| 118 | 118 | ||
| 119 | std::shared_ptr<VfsDirectory> VectorVfsDirectory::CreateSubdirectory(std::string_view name) { | 119 | VirtualDir VectorVfsDirectory::CreateSubdirectory(std::string_view name) { |
| 120 | return nullptr; | 120 | return nullptr; |
| 121 | } | 121 | } |
| 122 | 122 | ||
| 123 | std::shared_ptr<VfsFile> VectorVfsDirectory::CreateFile(std::string_view name) { | 123 | VirtualFile VectorVfsDirectory::CreateFile(std::string_view name) { |
| 124 | return nullptr; | 124 | return nullptr; |
| 125 | } | 125 | } |
| 126 | 126 | ||
diff --git a/src/core/file_sys/vfs_vector.h b/src/core/file_sys/vfs_vector.h index 95d3da2f2..2aff9ca34 100644 --- a/src/core/file_sys/vfs_vector.h +++ b/src/core/file_sys/vfs_vector.h | |||
| @@ -17,9 +17,9 @@ namespace FileSys { | |||
| 17 | template <std::size_t size> | 17 | template <std::size_t size> |
| 18 | class ArrayVfsFile : public VfsFile { | 18 | class ArrayVfsFile : public VfsFile { |
| 19 | public: | 19 | public: |
| 20 | explicit ArrayVfsFile(const std::array<u8, size>& data, std::string name = "", | 20 | explicit ArrayVfsFile(const std::array<u8, size>& data_, std::string name_ = "", |
| 21 | VirtualDir parent = nullptr) | 21 | VirtualDir parent_ = nullptr) |
| 22 | : data(data), name(std::move(name)), parent(std::move(parent)) {} | 22 | : data(data_), name(std::move(name_)), parent(std::move(parent_)) {} |
| 23 | 23 | ||
| 24 | std::string GetName() const override { | 24 | std::string GetName() const override { |
| 25 | return name; | 25 | return name; |
| @@ -33,7 +33,7 @@ public: | |||
| 33 | return false; | 33 | return false; |
| 34 | } | 34 | } |
| 35 | 35 | ||
| 36 | std::shared_ptr<VfsDirectory> GetContainingDirectory() const override { | 36 | VirtualDir GetContainingDirectory() const override { |
| 37 | return parent; | 37 | return parent; |
| 38 | } | 38 | } |
| 39 | 39 | ||
| @@ -51,12 +51,12 @@ public: | |||
| 51 | return read; | 51 | return read; |
| 52 | } | 52 | } |
| 53 | 53 | ||
| 54 | std::size_t Write(const u8* data, std::size_t length, std::size_t offset) override { | 54 | std::size_t Write(const u8* data_, std::size_t length, std::size_t offset) override { |
| 55 | return 0; | 55 | return 0; |
| 56 | } | 56 | } |
| 57 | 57 | ||
| 58 | bool Rename(std::string_view name) override { | 58 | bool Rename(std::string_view new_name) override { |
| 59 | this->name = name; | 59 | name = new_name; |
| 60 | return true; | 60 | return true; |
| 61 | } | 61 | } |
| 62 | 62 | ||
| @@ -82,7 +82,7 @@ public: | |||
| 82 | std::string GetName() const override; | 82 | std::string GetName() const override; |
| 83 | std::size_t GetSize() const override; | 83 | std::size_t GetSize() const override; |
| 84 | bool Resize(std::size_t new_size) override; | 84 | bool Resize(std::size_t new_size) override; |
| 85 | std::shared_ptr<VfsDirectory> GetContainingDirectory() const override; | 85 | VirtualDir GetContainingDirectory() const override; |
| 86 | bool IsWritable() const override; | 86 | bool IsWritable() const override; |
| 87 | bool IsReadable() const override; | 87 | bool IsReadable() const override; |
| 88 | std::size_t Read(u8* data, std::size_t length, std::size_t offset) const override; | 88 | std::size_t Read(u8* data, std::size_t length, std::size_t offset) const override; |
| @@ -106,17 +106,17 @@ public: | |||
| 106 | VirtualDir parent = nullptr); | 106 | VirtualDir parent = nullptr); |
| 107 | ~VectorVfsDirectory() override; | 107 | ~VectorVfsDirectory() override; |
| 108 | 108 | ||
| 109 | std::vector<std::shared_ptr<VfsFile>> GetFiles() const override; | 109 | std::vector<VirtualFile> GetFiles() const override; |
| 110 | std::vector<std::shared_ptr<VfsDirectory>> GetSubdirectories() const override; | 110 | std::vector<VirtualDir> GetSubdirectories() const override; |
| 111 | bool IsWritable() const override; | 111 | bool IsWritable() const override; |
| 112 | bool IsReadable() const override; | 112 | bool IsReadable() const override; |
| 113 | std::string GetName() const override; | 113 | std::string GetName() const override; |
| 114 | std::shared_ptr<VfsDirectory> GetParentDirectory() const override; | 114 | VirtualDir GetParentDirectory() const override; |
| 115 | bool DeleteSubdirectory(std::string_view name) override; | 115 | bool DeleteSubdirectory(std::string_view name) override; |
| 116 | bool DeleteFile(std::string_view name) override; | 116 | bool DeleteFile(std::string_view name) override; |
| 117 | bool Rename(std::string_view name) override; | 117 | bool Rename(std::string_view name) override; |
| 118 | std::shared_ptr<VfsDirectory> CreateSubdirectory(std::string_view name) override; | 118 | VirtualDir CreateSubdirectory(std::string_view name) override; |
| 119 | std::shared_ptr<VfsFile> CreateFile(std::string_view name) override; | 119 | VirtualFile CreateFile(std::string_view name) override; |
| 120 | 120 | ||
| 121 | virtual void AddFile(VirtualFile file); | 121 | virtual void AddFile(VirtualFile file); |
| 122 | virtual void AddDirectory(VirtualDir dir); | 122 | virtual void AddDirectory(VirtualDir dir); |
diff --git a/src/core/file_sys/xts_archive.cpp b/src/core/file_sys/xts_archive.cpp index 24c58e7ae..814fd5680 100644 --- a/src/core/file_sys/xts_archive.cpp +++ b/src/core/file_sys/xts_archive.cpp | |||
| @@ -152,11 +152,11 @@ NAXContentType NAX::GetContentType() const { | |||
| 152 | return type; | 152 | return type; |
| 153 | } | 153 | } |
| 154 | 154 | ||
| 155 | std::vector<std::shared_ptr<VfsFile>> NAX::GetFiles() const { | 155 | std::vector<VirtualFile> NAX::GetFiles() const { |
| 156 | return {dec_file}; | 156 | return {dec_file}; |
| 157 | } | 157 | } |
| 158 | 158 | ||
| 159 | std::vector<std::shared_ptr<VfsDirectory>> NAX::GetSubdirectories() const { | 159 | std::vector<VirtualDir> NAX::GetSubdirectories() const { |
| 160 | return {}; | 160 | return {}; |
| 161 | } | 161 | } |
| 162 | 162 | ||
| @@ -164,7 +164,7 @@ std::string NAX::GetName() const { | |||
| 164 | return file->GetName(); | 164 | return file->GetName(); |
| 165 | } | 165 | } |
| 166 | 166 | ||
| 167 | std::shared_ptr<VfsDirectory> NAX::GetParentDirectory() const { | 167 | VirtualDir NAX::GetParentDirectory() const { |
| 168 | return file->GetContainingDirectory(); | 168 | return file->GetContainingDirectory(); |
| 169 | } | 169 | } |
| 170 | 170 | ||
diff --git a/src/core/file_sys/xts_archive.h b/src/core/file_sys/xts_archive.h index c472e226e..63a032b68 100644 --- a/src/core/file_sys/xts_archive.h +++ b/src/core/file_sys/xts_archive.h | |||
| @@ -47,13 +47,13 @@ public: | |||
| 47 | 47 | ||
| 48 | NAXContentType GetContentType() const; | 48 | NAXContentType GetContentType() const; |
| 49 | 49 | ||
| 50 | std::vector<std::shared_ptr<VfsFile>> GetFiles() const override; | 50 | std::vector<VirtualFile> GetFiles() const override; |
| 51 | 51 | ||
| 52 | std::vector<std::shared_ptr<VfsDirectory>> GetSubdirectories() const override; | 52 | std::vector<VirtualDir> GetSubdirectories() const override; |
| 53 | 53 | ||
| 54 | std::string GetName() const override; | 54 | std::string GetName() const override; |
| 55 | 55 | ||
| 56 | std::shared_ptr<VfsDirectory> GetParentDirectory() const override; | 56 | VirtualDir GetParentDirectory() const override; |
| 57 | 57 | ||
| 58 | private: | 58 | private: |
| 59 | Loader::ResultStatus Parse(std::string_view path); | 59 | Loader::ResultStatus Parse(std::string_view path); |
diff --git a/src/core/frontend/applets/error.cpp b/src/core/frontend/applets/error.cpp index 4002a9211..dceb20ff8 100644 --- a/src/core/frontend/applets/error.cpp +++ b/src/core/frontend/applets/error.cpp | |||
| @@ -2,6 +2,7 @@ | |||
| 2 | // Licensed under GPLv2 or any later version | 2 | // Licensed under GPLv2 or any later version |
| 3 | // Refer to the license.txt file included. | 3 | // Refer to the license.txt file included. |
| 4 | 4 | ||
| 5 | #include "common/logging/log.h" | ||
| 5 | #include "core/frontend/applets/error.h" | 6 | #include "core/frontend/applets/error.h" |
| 6 | 7 | ||
| 7 | namespace Core::Frontend { | 8 | namespace Core::Frontend { |
| @@ -10,7 +11,7 @@ ErrorApplet::~ErrorApplet() = default; | |||
| 10 | 11 | ||
| 11 | void DefaultErrorApplet::ShowError(ResultCode error, std::function<void()> finished) const { | 12 | void DefaultErrorApplet::ShowError(ResultCode error, std::function<void()> finished) const { |
| 12 | LOG_CRITICAL(Service_Fatal, "Application requested error display: {:04}-{:04} (raw={:08X})", | 13 | LOG_CRITICAL(Service_Fatal, "Application requested error display: {:04}-{:04} (raw={:08X})", |
| 13 | static_cast<u32>(error.module.Value()), error.description.Value(), error.raw); | 14 | error.module.Value(), error.description.Value(), error.raw); |
| 14 | } | 15 | } |
| 15 | 16 | ||
| 16 | void DefaultErrorApplet::ShowErrorWithTimestamp(ResultCode error, std::chrono::seconds time, | 17 | void DefaultErrorApplet::ShowErrorWithTimestamp(ResultCode error, std::chrono::seconds time, |
| @@ -18,7 +19,7 @@ void DefaultErrorApplet::ShowErrorWithTimestamp(ResultCode error, std::chrono::s | |||
| 18 | LOG_CRITICAL( | 19 | LOG_CRITICAL( |
| 19 | Service_Fatal, | 20 | Service_Fatal, |
| 20 | "Application requested error display: {:04X}-{:04X} (raw={:08X}) with timestamp={:016X}", | 21 | "Application requested error display: {:04X}-{:04X} (raw={:08X}) with timestamp={:016X}", |
| 21 | static_cast<u32>(error.module.Value()), error.description.Value(), error.raw, time.count()); | 22 | error.module.Value(), error.description.Value(), error.raw, time.count()); |
| 22 | } | 23 | } |
| 23 | 24 | ||
| 24 | void DefaultErrorApplet::ShowCustomErrorText(ResultCode error, std::string main_text, | 25 | void DefaultErrorApplet::ShowCustomErrorText(ResultCode error, std::string main_text, |
| @@ -26,7 +27,7 @@ void DefaultErrorApplet::ShowCustomErrorText(ResultCode error, std::string main_ | |||
| 26 | std::function<void()> finished) const { | 27 | std::function<void()> finished) const { |
| 27 | LOG_CRITICAL(Service_Fatal, | 28 | LOG_CRITICAL(Service_Fatal, |
| 28 | "Application requested custom error with error_code={:04X}-{:04X} (raw={:08X})", | 29 | "Application requested custom error with error_code={:04X}-{:04X} (raw={:08X})", |
| 29 | static_cast<u32>(error.module.Value()), error.description.Value(), error.raw); | 30 | error.module.Value(), error.description.Value(), error.raw); |
| 30 | LOG_CRITICAL(Service_Fatal, " Main Text: {}", main_text); | 31 | LOG_CRITICAL(Service_Fatal, " Main Text: {}", main_text); |
| 31 | LOG_CRITICAL(Service_Fatal, " Detail Text: {}", detail_text); | 32 | LOG_CRITICAL(Service_Fatal, " Detail Text: {}", detail_text); |
| 32 | } | 33 | } |
diff --git a/src/core/hle/ipc_helpers.h b/src/core/hle/ipc_helpers.h index d57776ce9..56cc911d1 100644 --- a/src/core/hle/ipc_helpers.h +++ b/src/core/hle/ipc_helpers.h | |||
| @@ -166,8 +166,23 @@ public: | |||
| 166 | ValidateHeader(); | 166 | ValidateHeader(); |
| 167 | } | 167 | } |
| 168 | 168 | ||
| 169 | void PushImpl(s8 value); | ||
| 170 | void PushImpl(s16 value); | ||
| 171 | void PushImpl(s32 value); | ||
| 172 | void PushImpl(s64 value); | ||
| 173 | void PushImpl(u8 value); | ||
| 174 | void PushImpl(u16 value); | ||
| 175 | void PushImpl(u32 value); | ||
| 176 | void PushImpl(u64 value); | ||
| 177 | void PushImpl(float value); | ||
| 178 | void PushImpl(double value); | ||
| 179 | void PushImpl(bool value); | ||
| 180 | void PushImpl(ResultCode value); | ||
| 181 | |||
| 169 | template <typename T> | 182 | template <typename T> |
| 170 | void Push(T value); | 183 | void Push(T value) { |
| 184 | return PushImpl(value); | ||
| 185 | } | ||
| 171 | 186 | ||
| 172 | template <typename First, typename... Other> | 187 | template <typename First, typename... Other> |
| 173 | void Push(const First& first_value, const Other&... other_values); | 188 | void Push(const First& first_value, const Other&... other_values); |
| @@ -215,13 +230,11 @@ private: | |||
| 215 | 230 | ||
| 216 | /// Push /// | 231 | /// Push /// |
| 217 | 232 | ||
| 218 | template <> | 233 | inline void ResponseBuilder::PushImpl(s32 value) { |
| 219 | inline void ResponseBuilder::Push(s32 value) { | ||
| 220 | cmdbuf[index++] = static_cast<u32>(value); | 234 | cmdbuf[index++] = static_cast<u32>(value); |
| 221 | } | 235 | } |
| 222 | 236 | ||
| 223 | template <> | 237 | inline void ResponseBuilder::PushImpl(u32 value) { |
| 224 | inline void ResponseBuilder::Push(u32 value) { | ||
| 225 | cmdbuf[index++] = value; | 238 | cmdbuf[index++] = value; |
| 226 | } | 239 | } |
| 227 | 240 | ||
| @@ -233,62 +246,52 @@ void ResponseBuilder::PushRaw(const T& value) { | |||
| 233 | index += (sizeof(T) + 3) / 4; // round up to word length | 246 | index += (sizeof(T) + 3) / 4; // round up to word length |
| 234 | } | 247 | } |
| 235 | 248 | ||
| 236 | template <> | 249 | inline void ResponseBuilder::PushImpl(ResultCode value) { |
| 237 | inline void ResponseBuilder::Push(ResultCode value) { | ||
| 238 | // Result codes are actually 64-bit in the IPC buffer, but only the high part is discarded. | 250 | // Result codes are actually 64-bit in the IPC buffer, but only the high part is discarded. |
| 239 | Push(value.raw); | 251 | Push(value.raw); |
| 240 | Push<u32>(0); | 252 | Push<u32>(0); |
| 241 | } | 253 | } |
| 242 | 254 | ||
| 243 | template <> | 255 | inline void ResponseBuilder::PushImpl(s8 value) { |
| 244 | inline void ResponseBuilder::Push(s8 value) { | ||
| 245 | PushRaw(value); | 256 | PushRaw(value); |
| 246 | } | 257 | } |
| 247 | 258 | ||
| 248 | template <> | 259 | inline void ResponseBuilder::PushImpl(s16 value) { |
| 249 | inline void ResponseBuilder::Push(s16 value) { | ||
| 250 | PushRaw(value); | 260 | PushRaw(value); |
| 251 | } | 261 | } |
| 252 | 262 | ||
| 253 | template <> | 263 | inline void ResponseBuilder::PushImpl(s64 value) { |
| 254 | inline void ResponseBuilder::Push(s64 value) { | 264 | PushImpl(static_cast<u32>(value)); |
| 255 | Push(static_cast<u32>(value)); | 265 | PushImpl(static_cast<u32>(value >> 32)); |
| 256 | Push(static_cast<u32>(value >> 32)); | ||
| 257 | } | 266 | } |
| 258 | 267 | ||
| 259 | template <> | 268 | inline void ResponseBuilder::PushImpl(u8 value) { |
| 260 | inline void ResponseBuilder::Push(u8 value) { | ||
| 261 | PushRaw(value); | 269 | PushRaw(value); |
| 262 | } | 270 | } |
| 263 | 271 | ||
| 264 | template <> | 272 | inline void ResponseBuilder::PushImpl(u16 value) { |
| 265 | inline void ResponseBuilder::Push(u16 value) { | ||
| 266 | PushRaw(value); | 273 | PushRaw(value); |
| 267 | } | 274 | } |
| 268 | 275 | ||
| 269 | template <> | 276 | inline void ResponseBuilder::PushImpl(u64 value) { |
| 270 | inline void ResponseBuilder::Push(u64 value) { | 277 | PushImpl(static_cast<u32>(value)); |
| 271 | Push(static_cast<u32>(value)); | 278 | PushImpl(static_cast<u32>(value >> 32)); |
| 272 | Push(static_cast<u32>(value >> 32)); | ||
| 273 | } | 279 | } |
| 274 | 280 | ||
| 275 | template <> | 281 | inline void ResponseBuilder::PushImpl(float value) { |
| 276 | inline void ResponseBuilder::Push(float value) { | ||
| 277 | u32 integral; | 282 | u32 integral; |
| 278 | std::memcpy(&integral, &value, sizeof(u32)); | 283 | std::memcpy(&integral, &value, sizeof(u32)); |
| 279 | Push(integral); | 284 | PushImpl(integral); |
| 280 | } | 285 | } |
| 281 | 286 | ||
| 282 | template <> | 287 | inline void ResponseBuilder::PushImpl(double value) { |
| 283 | inline void ResponseBuilder::Push(double value) { | ||
| 284 | u64 integral; | 288 | u64 integral; |
| 285 | std::memcpy(&integral, &value, sizeof(u64)); | 289 | std::memcpy(&integral, &value, sizeof(u64)); |
| 286 | Push(integral); | 290 | PushImpl(integral); |
| 287 | } | 291 | } |
| 288 | 292 | ||
| 289 | template <> | 293 | inline void ResponseBuilder::PushImpl(bool value) { |
| 290 | inline void ResponseBuilder::Push(bool value) { | 294 | PushImpl(static_cast<u8>(value)); |
| 291 | Push(static_cast<u8>(value)); | ||
| 292 | } | 295 | } |
| 293 | 296 | ||
| 294 | template <typename First, typename... Other> | 297 | template <typename First, typename... Other> |
diff --git a/src/core/hle/kernel/memory/memory_block.h b/src/core/hle/kernel/memory/memory_block.h index 9d7839d08..37fe19916 100644 --- a/src/core/hle/kernel/memory/memory_block.h +++ b/src/core/hle/kernel/memory/memory_block.h | |||
| @@ -222,9 +222,9 @@ public: | |||
| 222 | 222 | ||
| 223 | public: | 223 | public: |
| 224 | constexpr MemoryBlock() = default; | 224 | constexpr MemoryBlock() = default; |
| 225 | constexpr MemoryBlock(VAddr addr, std::size_t num_pages, MemoryState state, | 225 | constexpr MemoryBlock(VAddr addr_, std::size_t num_pages_, MemoryState state_, |
| 226 | MemoryPermission perm, MemoryAttribute attribute) | 226 | MemoryPermission perm_, MemoryAttribute attribute_) |
| 227 | : addr{addr}, num_pages(num_pages), state{state}, perm{perm}, attribute{attribute} {} | 227 | : addr{addr_}, num_pages(num_pages_), state{state_}, perm{perm_}, attribute{attribute_} {} |
| 228 | 228 | ||
| 229 | constexpr VAddr GetAddress() const { | 229 | constexpr VAddr GetAddress() const { |
| 230 | return addr; | 230 | return addr; |
diff --git a/src/core/hle/kernel/memory/memory_block_manager.h b/src/core/hle/kernel/memory/memory_block_manager.h index 6e1d41075..f57d1bbcc 100644 --- a/src/core/hle/kernel/memory/memory_block_manager.h +++ b/src/core/hle/kernel/memory/memory_block_manager.h | |||
| @@ -57,8 +57,8 @@ public: | |||
| 57 | private: | 57 | private: |
| 58 | void MergeAdjacent(iterator it, iterator& next_it); | 58 | void MergeAdjacent(iterator it, iterator& next_it); |
| 59 | 59 | ||
| 60 | const VAddr start_addr; | 60 | [[maybe_unused]] const VAddr start_addr; |
| 61 | const VAddr end_addr; | 61 | [[maybe_unused]] const VAddr end_addr; |
| 62 | 62 | ||
| 63 | MemoryBlockTree memory_block_tree; | 63 | MemoryBlockTree memory_block_tree; |
| 64 | }; | 64 | }; |
diff --git a/src/core/hle/kernel/physical_core.h b/src/core/hle/kernel/physical_core.h index b4d3c15de..f2b0911aa 100644 --- a/src/core/hle/kernel/physical_core.h +++ b/src/core/hle/kernel/physical_core.h | |||
| @@ -36,7 +36,7 @@ public: | |||
| 36 | PhysicalCore& operator=(const PhysicalCore&) = delete; | 36 | PhysicalCore& operator=(const PhysicalCore&) = delete; |
| 37 | 37 | ||
| 38 | PhysicalCore(PhysicalCore&&) = default; | 38 | PhysicalCore(PhysicalCore&&) = default; |
| 39 | PhysicalCore& operator=(PhysicalCore&&) = default; | 39 | PhysicalCore& operator=(PhysicalCore&&) = delete; |
| 40 | 40 | ||
| 41 | /// Initialize the core for the specified parameters. | 41 | /// Initialize the core for the specified parameters. |
| 42 | void Initialize(bool is_64_bit); | 42 | void Initialize(bool is_64_bit); |
diff --git a/src/core/hle/kernel/process_capability.cpp b/src/core/hle/kernel/process_capability.cpp index 63880f13d..0f128c586 100644 --- a/src/core/hle/kernel/process_capability.cpp +++ b/src/core/hle/kernel/process_capability.cpp | |||
| @@ -199,7 +199,7 @@ ResultCode ProcessCapabilities::ParseSingleFlagCapability(u32& set_flags, u32& s | |||
| 199 | break; | 199 | break; |
| 200 | } | 200 | } |
| 201 | 201 | ||
| 202 | LOG_ERROR(Kernel, "Invalid capability type! type={}", static_cast<u32>(type)); | 202 | LOG_ERROR(Kernel, "Invalid capability type! type={}", type); |
| 203 | return ERR_INVALID_CAPABILITY_DESCRIPTOR; | 203 | return ERR_INVALID_CAPABILITY_DESCRIPTOR; |
| 204 | } | 204 | } |
| 205 | 205 | ||
diff --git a/src/core/hle/kernel/resource_limit.cpp b/src/core/hle/kernel/resource_limit.cpp index 212e442f4..7bf50339d 100644 --- a/src/core/hle/kernel/resource_limit.cpp +++ b/src/core/hle/kernel/resource_limit.cpp | |||
| @@ -65,8 +65,8 @@ ResultCode ResourceLimit::SetLimitValue(ResourceType resource, s64 value) { | |||
| 65 | limit[index] = value; | 65 | limit[index] = value; |
| 66 | return RESULT_SUCCESS; | 66 | return RESULT_SUCCESS; |
| 67 | } else { | 67 | } else { |
| 68 | LOG_ERROR(Kernel, "Limit value is too large! resource={}, value={}, index={}", | 68 | LOG_ERROR(Kernel, "Limit value is too large! resource={}, value={}, index={}", resource, |
| 69 | static_cast<u32>(resource), value, index); | 69 | value, index); |
| 70 | return ERR_INVALID_STATE; | 70 | return ERR_INVALID_STATE; |
| 71 | } | 71 | } |
| 72 | } | 72 | } |
diff --git a/src/core/hle/kernel/server_session.cpp b/src/core/hle/kernel/server_session.cpp index 78e41b13e..a35c8aa4b 100644 --- a/src/core/hle/kernel/server_session.cpp +++ b/src/core/hle/kernel/server_session.cpp | |||
| @@ -130,8 +130,7 @@ ResultCode ServerSession::HandleDomainSyncRequest(Kernel::HLERequestContext& con | |||
| 130 | } | 130 | } |
| 131 | } | 131 | } |
| 132 | 132 | ||
| 133 | LOG_CRITICAL(IPC, "Unknown domain command={}", | 133 | LOG_CRITICAL(IPC, "Unknown domain command={}", domain_message_header.command.Value()); |
| 134 | static_cast<int>(domain_message_header.command.Value())); | ||
| 135 | ASSERT(false); | 134 | ASSERT(false); |
| 136 | return RESULT_SUCCESS; | 135 | return RESULT_SUCCESS; |
| 137 | } | 136 | } |
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp index 30d60aeb6..2d225392f 100644 --- a/src/core/hle/kernel/svc.cpp +++ b/src/core/hle/kernel/svc.cpp | |||
| @@ -235,8 +235,7 @@ static ResultCode SetMemoryAttribute(Core::System& system, VAddr address, u64 si | |||
| 235 | 235 | ||
| 236 | static ResultCode SetMemoryAttribute32(Core::System& system, u32 address, u32 size, u32 mask, | 236 | static ResultCode SetMemoryAttribute32(Core::System& system, u32 address, u32 size, u32 mask, |
| 237 | u32 attribute) { | 237 | u32 attribute) { |
| 238 | return SetMemoryAttribute(system, static_cast<VAddr>(address), static_cast<std::size_t>(size), | 238 | return SetMemoryAttribute(system, address, size, mask, attribute); |
| 239 | mask, attribute); | ||
| 240 | } | 239 | } |
| 241 | 240 | ||
| 242 | /// Maps a memory range into a different range. | 241 | /// Maps a memory range into a different range. |
| @@ -256,8 +255,7 @@ static ResultCode MapMemory(Core::System& system, VAddr dst_addr, VAddr src_addr | |||
| 256 | } | 255 | } |
| 257 | 256 | ||
| 258 | static ResultCode MapMemory32(Core::System& system, u32 dst_addr, u32 src_addr, u32 size) { | 257 | static ResultCode MapMemory32(Core::System& system, u32 dst_addr, u32 src_addr, u32 size) { |
| 259 | return MapMemory(system, static_cast<VAddr>(dst_addr), static_cast<VAddr>(src_addr), | 258 | return MapMemory(system, dst_addr, src_addr, size); |
| 260 | static_cast<std::size_t>(size)); | ||
| 261 | } | 259 | } |
| 262 | 260 | ||
| 263 | /// Unmaps a region that was previously mapped with svcMapMemory | 261 | /// Unmaps a region that was previously mapped with svcMapMemory |
| @@ -277,8 +275,7 @@ static ResultCode UnmapMemory(Core::System& system, VAddr dst_addr, VAddr src_ad | |||
| 277 | } | 275 | } |
| 278 | 276 | ||
| 279 | static ResultCode UnmapMemory32(Core::System& system, u32 dst_addr, u32 src_addr, u32 size) { | 277 | static ResultCode UnmapMemory32(Core::System& system, u32 dst_addr, u32 src_addr, u32 size) { |
| 280 | return UnmapMemory(system, static_cast<VAddr>(dst_addr), static_cast<VAddr>(src_addr), | 278 | return UnmapMemory(system, dst_addr, src_addr, size); |
| 281 | static_cast<std::size_t>(size)); | ||
| 282 | } | 279 | } |
| 283 | 280 | ||
| 284 | /// Connect to an OS service given the port name, returns the handle to the port to out | 281 | /// Connect to an OS service given the port name, returns the handle to the port to out |
| @@ -533,8 +530,7 @@ static ResultCode ArbitrateLock(Core::System& system, Handle holding_thread_hand | |||
| 533 | 530 | ||
| 534 | static ResultCode ArbitrateLock32(Core::System& system, Handle holding_thread_handle, | 531 | static ResultCode ArbitrateLock32(Core::System& system, Handle holding_thread_handle, |
| 535 | u32 mutex_addr, Handle requesting_thread_handle) { | 532 | u32 mutex_addr, Handle requesting_thread_handle) { |
| 536 | return ArbitrateLock(system, holding_thread_handle, static_cast<VAddr>(mutex_addr), | 533 | return ArbitrateLock(system, holding_thread_handle, mutex_addr, requesting_thread_handle); |
| 537 | requesting_thread_handle); | ||
| 538 | } | 534 | } |
| 539 | 535 | ||
| 540 | /// Unlock a mutex | 536 | /// Unlock a mutex |
| @@ -557,7 +553,7 @@ static ResultCode ArbitrateUnlock(Core::System& system, VAddr mutex_addr) { | |||
| 557 | } | 553 | } |
| 558 | 554 | ||
| 559 | static ResultCode ArbitrateUnlock32(Core::System& system, u32 mutex_addr) { | 555 | static ResultCode ArbitrateUnlock32(Core::System& system, u32 mutex_addr) { |
| 560 | return ArbitrateUnlock(system, static_cast<VAddr>(mutex_addr)); | 556 | return ArbitrateUnlock(system, mutex_addr); |
| 561 | } | 557 | } |
| 562 | 558 | ||
| 563 | enum class BreakType : u32 { | 559 | enum class BreakType : u32 { |
| @@ -674,7 +670,7 @@ static void Break(Core::System& system, u32 reason, u64 info1, u64 info2) { | |||
| 674 | } | 670 | } |
| 675 | 671 | ||
| 676 | static void Break32(Core::System& system, u32 reason, u32 info1, u32 info2) { | 672 | static void Break32(Core::System& system, u32 reason, u32 info1, u32 info2) { |
| 677 | Break(system, reason, static_cast<u64>(info1), static_cast<u64>(info2)); | 673 | Break(system, reason, info1, info2); |
| 678 | } | 674 | } |
| 679 | 675 | ||
| 680 | /// Used to output a message on a debug hardware unit - does nothing on a retail unit | 676 | /// Used to output a message on a debug hardware unit - does nothing on a retail unit |
| @@ -945,7 +941,7 @@ static ResultCode GetInfo(Core::System& system, u64* result, u64 info_id, u64 ha | |||
| 945 | 941 | ||
| 946 | static ResultCode GetInfo32(Core::System& system, u32* result_low, u32* result_high, u32 sub_id_low, | 942 | static ResultCode GetInfo32(Core::System& system, u32* result_low, u32* result_high, u32 sub_id_low, |
| 947 | u32 info_id, u32 handle, u32 sub_id_high) { | 943 | u32 info_id, u32 handle, u32 sub_id_high) { |
| 948 | const u64 sub_id{static_cast<u64>(sub_id_low | (static_cast<u64>(sub_id_high) << 32))}; | 944 | const u64 sub_id{u64{sub_id_low} | (u64{sub_id_high} << 32)}; |
| 949 | u64 res_value{}; | 945 | u64 res_value{}; |
| 950 | 946 | ||
| 951 | const ResultCode result{GetInfo(system, &res_value, info_id, handle, sub_id)}; | 947 | const ResultCode result{GetInfo(system, &res_value, info_id, handle, sub_id)}; |
| @@ -1006,7 +1002,7 @@ static ResultCode MapPhysicalMemory(Core::System& system, VAddr addr, u64 size) | |||
| 1006 | } | 1002 | } |
| 1007 | 1003 | ||
| 1008 | static ResultCode MapPhysicalMemory32(Core::System& system, u32 addr, u32 size) { | 1004 | static ResultCode MapPhysicalMemory32(Core::System& system, u32 addr, u32 size) { |
| 1009 | return MapPhysicalMemory(system, static_cast<VAddr>(addr), static_cast<std::size_t>(size)); | 1005 | return MapPhysicalMemory(system, addr, size); |
| 1010 | } | 1006 | } |
| 1011 | 1007 | ||
| 1012 | /// Unmaps memory previously mapped via MapPhysicalMemory | 1008 | /// Unmaps memory previously mapped via MapPhysicalMemory |
| @@ -1060,7 +1056,7 @@ static ResultCode UnmapPhysicalMemory(Core::System& system, VAddr addr, u64 size | |||
| 1060 | } | 1056 | } |
| 1061 | 1057 | ||
| 1062 | static ResultCode UnmapPhysicalMemory32(Core::System& system, u32 addr, u32 size) { | 1058 | static ResultCode UnmapPhysicalMemory32(Core::System& system, u32 addr, u32 size) { |
| 1063 | return UnmapPhysicalMemory(system, static_cast<VAddr>(addr), static_cast<std::size_t>(size)); | 1059 | return UnmapPhysicalMemory(system, addr, size); |
| 1064 | } | 1060 | } |
| 1065 | 1061 | ||
| 1066 | /// Sets the thread activity | 1062 | /// Sets the thread activity |
| @@ -1141,7 +1137,7 @@ static ResultCode GetThreadContext(Core::System& system, VAddr thread_context, H | |||
| 1141 | } | 1137 | } |
| 1142 | 1138 | ||
| 1143 | static ResultCode GetThreadContext32(Core::System& system, u32 thread_context, Handle handle) { | 1139 | static ResultCode GetThreadContext32(Core::System& system, u32 thread_context, Handle handle) { |
| 1144 | return GetThreadContext(system, static_cast<VAddr>(thread_context), handle); | 1140 | return GetThreadContext(system, thread_context, handle); |
| 1145 | } | 1141 | } |
| 1146 | 1142 | ||
| 1147 | /// Gets the priority for the specified thread | 1143 | /// Gets the priority for the specified thread |
| @@ -1278,8 +1274,7 @@ static ResultCode MapSharedMemory(Core::System& system, Handle shared_memory_han | |||
| 1278 | 1274 | ||
| 1279 | static ResultCode MapSharedMemory32(Core::System& system, Handle shared_memory_handle, u32 addr, | 1275 | static ResultCode MapSharedMemory32(Core::System& system, Handle shared_memory_handle, u32 addr, |
| 1280 | u32 size, u32 permissions) { | 1276 | u32 size, u32 permissions) { |
| 1281 | return MapSharedMemory(system, shared_memory_handle, static_cast<VAddr>(addr), | 1277 | return MapSharedMemory(system, shared_memory_handle, addr, size, permissions); |
| 1282 | static_cast<std::size_t>(size), permissions); | ||
| 1283 | } | 1278 | } |
| 1284 | 1279 | ||
| 1285 | static ResultCode QueryProcessMemory(Core::System& system, VAddr memory_info_address, | 1280 | static ResultCode QueryProcessMemory(Core::System& system, VAddr memory_info_address, |
| @@ -1549,8 +1544,7 @@ static ResultCode CreateThread(Core::System& system, Handle* out_handle, VAddr e | |||
| 1549 | 1544 | ||
| 1550 | static ResultCode CreateThread32(Core::System& system, Handle* out_handle, u32 priority, | 1545 | static ResultCode CreateThread32(Core::System& system, Handle* out_handle, u32 priority, |
| 1551 | u32 entry_point, u32 arg, u32 stack_top, s32 processor_id) { | 1546 | u32 entry_point, u32 arg, u32 stack_top, s32 processor_id) { |
| 1552 | return CreateThread(system, out_handle, static_cast<VAddr>(entry_point), static_cast<u64>(arg), | 1547 | return CreateThread(system, out_handle, entry_point, arg, stack_top, priority, processor_id); |
| 1553 | static_cast<VAddr>(stack_top), priority, processor_id); | ||
| 1554 | } | 1548 | } |
| 1555 | 1549 | ||
| 1556 | /// Starts the thread for the provided handle | 1550 | /// Starts the thread for the provided handle |
| @@ -1621,8 +1615,7 @@ static void SleepThread(Core::System& system, s64 nanoseconds) { | |||
| 1621 | } | 1615 | } |
| 1622 | 1616 | ||
| 1623 | static void SleepThread32(Core::System& system, u32 nanoseconds_low, u32 nanoseconds_high) { | 1617 | static void SleepThread32(Core::System& system, u32 nanoseconds_low, u32 nanoseconds_high) { |
| 1624 | const s64 nanoseconds = static_cast<s64>(static_cast<u64>(nanoseconds_low) | | 1618 | const auto nanoseconds = static_cast<s64>(u64{nanoseconds_low} | (u64{nanoseconds_high} << 32)); |
| 1625 | (static_cast<u64>(nanoseconds_high) << 32)); | ||
| 1626 | SleepThread(system, nanoseconds); | 1619 | SleepThread(system, nanoseconds); |
| 1627 | } | 1620 | } |
| 1628 | 1621 | ||
| @@ -1708,10 +1701,8 @@ static ResultCode WaitProcessWideKeyAtomic(Core::System& system, VAddr mutex_add | |||
| 1708 | static ResultCode WaitProcessWideKeyAtomic32(Core::System& system, u32 mutex_addr, | 1701 | static ResultCode WaitProcessWideKeyAtomic32(Core::System& system, u32 mutex_addr, |
| 1709 | u32 condition_variable_addr, Handle thread_handle, | 1702 | u32 condition_variable_addr, Handle thread_handle, |
| 1710 | u32 nanoseconds_low, u32 nanoseconds_high) { | 1703 | u32 nanoseconds_low, u32 nanoseconds_high) { |
| 1711 | const s64 nanoseconds = | 1704 | const auto nanoseconds = static_cast<s64>(nanoseconds_low | (u64{nanoseconds_high} << 32)); |
| 1712 | static_cast<s64>(nanoseconds_low | (static_cast<u64>(nanoseconds_high) << 32)); | 1705 | return WaitProcessWideKeyAtomic(system, mutex_addr, condition_variable_addr, thread_handle, |
| 1713 | return WaitProcessWideKeyAtomic(system, static_cast<VAddr>(mutex_addr), | ||
| 1714 | static_cast<VAddr>(condition_variable_addr), thread_handle, | ||
| 1715 | nanoseconds); | 1706 | nanoseconds); |
| 1716 | } | 1707 | } |
| 1717 | 1708 | ||
| @@ -1817,8 +1808,8 @@ static ResultCode WaitForAddress(Core::System& system, VAddr address, u32 type, | |||
| 1817 | 1808 | ||
| 1818 | static ResultCode WaitForAddress32(Core::System& system, u32 address, u32 type, s32 value, | 1809 | static ResultCode WaitForAddress32(Core::System& system, u32 address, u32 type, s32 value, |
| 1819 | u32 timeout_low, u32 timeout_high) { | 1810 | u32 timeout_low, u32 timeout_high) { |
| 1820 | s64 timeout = static_cast<s64>(timeout_low | (static_cast<u64>(timeout_high) << 32)); | 1811 | const auto timeout = static_cast<s64>(timeout_low | (u64{timeout_high} << 32)); |
| 1821 | return WaitForAddress(system, static_cast<VAddr>(address), type, value, timeout); | 1812 | return WaitForAddress(system, address, type, value, timeout); |
| 1822 | } | 1813 | } |
| 1823 | 1814 | ||
| 1824 | // Signals to an address (via Address Arbiter) | 1815 | // Signals to an address (via Address Arbiter) |
| @@ -1846,7 +1837,7 @@ static ResultCode SignalToAddress(Core::System& system, VAddr address, u32 type, | |||
| 1846 | 1837 | ||
| 1847 | static ResultCode SignalToAddress32(Core::System& system, u32 address, u32 type, s32 value, | 1838 | static ResultCode SignalToAddress32(Core::System& system, u32 address, u32 type, s32 value, |
| 1848 | s32 num_to_wake) { | 1839 | s32 num_to_wake) { |
| 1849 | return SignalToAddress(system, static_cast<VAddr>(address), type, value, num_to_wake); | 1840 | return SignalToAddress(system, address, type, value, num_to_wake); |
| 1850 | } | 1841 | } |
| 1851 | 1842 | ||
| 1852 | static void KernelDebug([[maybe_unused]] Core::System& system, | 1843 | static void KernelDebug([[maybe_unused]] Core::System& system, |
| @@ -1877,7 +1868,7 @@ static u64 GetSystemTick(Core::System& system) { | |||
| 1877 | } | 1868 | } |
| 1878 | 1869 | ||
| 1879 | static void GetSystemTick32(Core::System& system, u32* time_low, u32* time_high) { | 1870 | static void GetSystemTick32(Core::System& system, u32* time_low, u32* time_high) { |
| 1880 | u64 time = GetSystemTick(system); | 1871 | const auto time = GetSystemTick(system); |
| 1881 | *time_low = static_cast<u32>(time); | 1872 | *time_low = static_cast<u32>(time); |
| 1882 | *time_high = static_cast<u32>(time >> 32); | 1873 | *time_high = static_cast<u32>(time >> 32); |
| 1883 | } | 1874 | } |
| @@ -1968,8 +1959,7 @@ static ResultCode CreateTransferMemory(Core::System& system, Handle* handle, VAd | |||
| 1968 | 1959 | ||
| 1969 | static ResultCode CreateTransferMemory32(Core::System& system, Handle* handle, u32 addr, u32 size, | 1960 | static ResultCode CreateTransferMemory32(Core::System& system, Handle* handle, u32 addr, u32 size, |
| 1970 | u32 permissions) { | 1961 | u32 permissions) { |
| 1971 | return CreateTransferMemory(system, handle, static_cast<VAddr>(addr), | 1962 | return CreateTransferMemory(system, handle, addr, size, permissions); |
| 1972 | static_cast<std::size_t>(size), permissions); | ||
| 1973 | } | 1963 | } |
| 1974 | 1964 | ||
| 1975 | static ResultCode GetThreadCoreMask(Core::System& system, Handle thread_handle, u32* core, | 1965 | static ResultCode GetThreadCoreMask(Core::System& system, Handle thread_handle, u32* core, |
| @@ -2059,8 +2049,7 @@ static ResultCode SetThreadCoreMask(Core::System& system, Handle thread_handle, | |||
| 2059 | 2049 | ||
| 2060 | static ResultCode SetThreadCoreMask32(Core::System& system, Handle thread_handle, u32 core, | 2050 | static ResultCode SetThreadCoreMask32(Core::System& system, Handle thread_handle, u32 core, |
| 2061 | u32 affinity_mask_low, u32 affinity_mask_high) { | 2051 | u32 affinity_mask_low, u32 affinity_mask_high) { |
| 2062 | const u64 affinity_mask = | 2052 | const auto affinity_mask = u64{affinity_mask_low} | (u64{affinity_mask_high} << 32); |
| 2063 | static_cast<u64>(affinity_mask_low) | (static_cast<u64>(affinity_mask_high) << 32); | ||
| 2064 | return SetThreadCoreMask(system, thread_handle, core, affinity_mask); | 2053 | return SetThreadCoreMask(system, thread_handle, core, affinity_mask); |
| 2065 | } | 2054 | } |
| 2066 | 2055 | ||
| @@ -2325,9 +2314,10 @@ static ResultCode GetThreadList(Core::System& system, u32* out_num_threads, VAdd | |||
| 2325 | return RESULT_SUCCESS; | 2314 | return RESULT_SUCCESS; |
| 2326 | } | 2315 | } |
| 2327 | 2316 | ||
| 2328 | static ResultCode FlushProcessDataCache32(Core::System& system, Handle handle, u32 address, | 2317 | static ResultCode FlushProcessDataCache32([[maybe_unused]] Core::System& system, |
| 2329 | u32 size) { | 2318 | [[maybe_unused]] Handle handle, |
| 2330 | // Note(Blinkhawk): For emulation purposes of the data cache this is mostly a nope | 2319 | [[maybe_unused]] u32 address, [[maybe_unused]] u32 size) { |
| 2320 | // Note(Blinkhawk): For emulation purposes of the data cache this is mostly a no-op, | ||
| 2331 | // as all emulation is done in the same cache level in host architecture, thus data cache | 2321 | // as all emulation is done in the same cache level in host architecture, thus data cache |
| 2332 | // does not need flushing. | 2322 | // does not need flushing. |
| 2333 | LOG_DEBUG(Kernel_SVC, "called"); | 2323 | LOG_DEBUG(Kernel_SVC, "called"); |
diff --git a/src/core/hle/service/am/am.cpp b/src/core/hle/service/am/am.cpp index 38d877f6e..cb13210e5 100644 --- a/src/core/hle/service/am/am.cpp +++ b/src/core/hle/service/am/am.cpp | |||
| @@ -1092,14 +1092,14 @@ void ILibraryAppletCreator::CreateLibraryApplet(Kernel::HLERequestContext& ctx) | |||
| 1092 | const auto applet_id = rp.PopRaw<Applets::AppletId>(); | 1092 | const auto applet_id = rp.PopRaw<Applets::AppletId>(); |
| 1093 | const auto applet_mode = rp.PopRaw<u32>(); | 1093 | const auto applet_mode = rp.PopRaw<u32>(); |
| 1094 | 1094 | ||
| 1095 | LOG_DEBUG(Service_AM, "called with applet_id={:08X}, applet_mode={:08X}", | 1095 | LOG_DEBUG(Service_AM, "called with applet_id={:08X}, applet_mode={:08X}", applet_id, |
| 1096 | static_cast<u32>(applet_id), applet_mode); | 1096 | applet_mode); |
| 1097 | 1097 | ||
| 1098 | const auto& applet_manager{system.GetAppletManager()}; | 1098 | const auto& applet_manager{system.GetAppletManager()}; |
| 1099 | const auto applet = applet_manager.GetApplet(applet_id); | 1099 | const auto applet = applet_manager.GetApplet(applet_id); |
| 1100 | 1100 | ||
| 1101 | if (applet == nullptr) { | 1101 | if (applet == nullptr) { |
| 1102 | LOG_ERROR(Service_AM, "Applet doesn't exist! applet_id={}", static_cast<u32>(applet_id)); | 1102 | LOG_ERROR(Service_AM, "Applet doesn't exist! applet_id={}", applet_id); |
| 1103 | 1103 | ||
| 1104 | IPC::ResponseBuilder rb{ctx, 2}; | 1104 | IPC::ResponseBuilder rb{ctx, 2}; |
| 1105 | rb.Push(RESULT_UNKNOWN); | 1105 | rb.Push(RESULT_UNKNOWN); |
| @@ -1290,7 +1290,7 @@ void IApplicationFunctions::PopLaunchParameter(Kernel::HLERequestContext& ctx) { | |||
| 1290 | IPC::RequestParser rp{ctx}; | 1290 | IPC::RequestParser rp{ctx}; |
| 1291 | const auto kind = rp.PopEnum<LaunchParameterKind>(); | 1291 | const auto kind = rp.PopEnum<LaunchParameterKind>(); |
| 1292 | 1292 | ||
| 1293 | LOG_DEBUG(Service_AM, "called, kind={:08X}", static_cast<u8>(kind)); | 1293 | LOG_DEBUG(Service_AM, "called, kind={:08X}", kind); |
| 1294 | 1294 | ||
| 1295 | if (kind == LaunchParameterKind::ApplicationSpecific && !launch_popped_application_specific) { | 1295 | if (kind == LaunchParameterKind::ApplicationSpecific && !launch_popped_application_specific) { |
| 1296 | const auto backend = BCAT::CreateBackendFromSettings(system, [this](u64 tid) { | 1296 | const auto backend = BCAT::CreateBackendFromSettings(system, [this](u64 tid) { |
| @@ -1537,8 +1537,8 @@ void IApplicationFunctions::GetSaveDataSize(Kernel::HLERequestContext& ctx) { | |||
| 1537 | IPC::RequestParser rp{ctx}; | 1537 | IPC::RequestParser rp{ctx}; |
| 1538 | const auto [type, user_id] = rp.PopRaw<Parameters>(); | 1538 | const auto [type, user_id] = rp.PopRaw<Parameters>(); |
| 1539 | 1539 | ||
| 1540 | LOG_DEBUG(Service_AM, "called with type={:02X}, user_id={:016X}{:016X}", static_cast<u8>(type), | 1540 | LOG_DEBUG(Service_AM, "called with type={:02X}, user_id={:016X}{:016X}", type, user_id[1], |
| 1541 | user_id[1], user_id[0]); | 1541 | user_id[0]); |
| 1542 | 1542 | ||
| 1543 | const auto size = system.GetFileSystemController().ReadSaveDataSize( | 1543 | const auto size = system.GetFileSystemController().ReadSaveDataSize( |
| 1544 | type, system.CurrentProcess()->GetTitleID(), user_id); | 1544 | type, system.CurrentProcess()->GetTitleID(), user_id); |
diff --git a/src/core/hle/service/am/applets/controller.cpp b/src/core/hle/service/am/applets/controller.cpp index e8ea4248b..7edfca64e 100644 --- a/src/core/hle/service/am/applets/controller.cpp +++ b/src/core/hle/service/am/applets/controller.cpp | |||
| @@ -29,14 +29,14 @@ static Core::Frontend::ControllerParameters ConvertToFrontendParameters( | |||
| 29 | npad_style_set.raw = private_arg.style_set; | 29 | npad_style_set.raw = private_arg.style_set; |
| 30 | 30 | ||
| 31 | return { | 31 | return { |
| 32 | .min_players = std::max(s8(1), header.player_count_min), | 32 | .min_players = std::max(s8{1}, header.player_count_min), |
| 33 | .max_players = header.player_count_max, | 33 | .max_players = header.player_count_max, |
| 34 | .keep_controllers_connected = header.enable_take_over_connection, | 34 | .keep_controllers_connected = header.enable_take_over_connection, |
| 35 | .enable_single_mode = header.enable_single_mode, | 35 | .enable_single_mode = header.enable_single_mode, |
| 36 | .enable_border_color = header.enable_identification_color, | 36 | .enable_border_color = header.enable_identification_color, |
| 37 | .border_colors = identification_colors, | 37 | .border_colors = std::move(identification_colors), |
| 38 | .enable_explain_text = enable_text, | 38 | .enable_explain_text = enable_text, |
| 39 | .explain_text = text, | 39 | .explain_text = std::move(text), |
| 40 | .allow_pro_controller = npad_style_set.pro_controller == 1, | 40 | .allow_pro_controller = npad_style_set.pro_controller == 1, |
| 41 | .allow_handheld = npad_style_set.handheld == 1, | 41 | .allow_handheld = npad_style_set.handheld == 1, |
| 42 | .allow_dual_joycons = npad_style_set.joycon_dual == 1, | 42 | .allow_dual_joycons = npad_style_set.joycon_dual == 1, |
| @@ -227,15 +227,14 @@ void Controller::ConfigurationComplete() { | |||
| 227 | // If enable_single_mode is enabled, player_count is 1 regardless of any other parameters. | 227 | // If enable_single_mode is enabled, player_count is 1 regardless of any other parameters. |
| 228 | // Otherwise, only count connected players from P1-P8. | 228 | // Otherwise, only count connected players from P1-P8. |
| 229 | result_info.player_count = | 229 | result_info.player_count = |
| 230 | is_single_mode ? 1 | 230 | is_single_mode |
| 231 | : static_cast<s8>(std::count_if( | 231 | ? 1 |
| 232 | players.begin(), players.end() - 2, | 232 | : static_cast<s8>(std::count_if(players.begin(), players.end() - 2, |
| 233 | [](Settings::PlayerInput player) { return player.connected; })); | 233 | [](const auto& player) { return player.connected; })); |
| 234 | 234 | ||
| 235 | result_info.selected_id = HID::Controller_NPad::IndexToNPad( | 235 | result_info.selected_id = HID::Controller_NPad::IndexToNPad(std::distance( |
| 236 | std::distance(players.begin(), | 236 | players.begin(), std::find_if(players.begin(), players.end(), |
| 237 | std::find_if(players.begin(), players.end(), | 237 | [](const auto& player) { return player.connected; }))); |
| 238 | [](Settings::PlayerInput player) { return player.connected; }))); | ||
| 239 | 238 | ||
| 240 | result_info.result = 0; | 239 | result_info.result = 0; |
| 241 | 240 | ||
diff --git a/src/core/hle/service/am/applets/error.cpp b/src/core/hle/service/am/applets/error.cpp index dcd4b2a35..d85505082 100644 --- a/src/core/hle/service/am/applets/error.cpp +++ b/src/core/hle/service/am/applets/error.cpp | |||
| @@ -125,7 +125,7 @@ void Error::Initialize() { | |||
| 125 | error_code = Decode64BitError(args->error_record.error_code_64); | 125 | error_code = Decode64BitError(args->error_record.error_code_64); |
| 126 | break; | 126 | break; |
| 127 | default: | 127 | default: |
| 128 | UNIMPLEMENTED_MSG("Unimplemented LibAppletError mode={:02X}!", static_cast<u8>(mode)); | 128 | UNIMPLEMENTED_MSG("Unimplemented LibAppletError mode={:02X}!", mode); |
| 129 | } | 129 | } |
| 130 | } | 130 | } |
| 131 | 131 | ||
| @@ -179,7 +179,7 @@ void Error::Execute() { | |||
| 179 | error_code, std::chrono::seconds{args->error_record.posix_time}, callback); | 179 | error_code, std::chrono::seconds{args->error_record.posix_time}, callback); |
| 180 | break; | 180 | break; |
| 181 | default: | 181 | default: |
| 182 | UNIMPLEMENTED_MSG("Unimplemented LibAppletError mode={:02X}!", static_cast<u8>(mode)); | 182 | UNIMPLEMENTED_MSG("Unimplemented LibAppletError mode={:02X}!", mode); |
| 183 | DisplayCompleted(); | 183 | DisplayCompleted(); |
| 184 | } | 184 | } |
| 185 | } | 185 | } |
diff --git a/src/core/hle/service/am/applets/general_backend.cpp b/src/core/hle/service/am/applets/general_backend.cpp index bdb6fd464..4d1df5cbe 100644 --- a/src/core/hle/service/am/applets/general_backend.cpp +++ b/src/core/hle/service/am/applets/general_backend.cpp | |||
| @@ -90,7 +90,7 @@ void Auth::Execute() { | |||
| 90 | const auto unimplemented_log = [this] { | 90 | const auto unimplemented_log = [this] { |
| 91 | UNIMPLEMENTED_MSG("Unimplemented Auth applet type for type={:08X}, arg0={:02X}, " | 91 | UNIMPLEMENTED_MSG("Unimplemented Auth applet type for type={:08X}, arg0={:02X}, " |
| 92 | "arg1={:02X}, arg2={:02X}", | 92 | "arg1={:02X}, arg2={:02X}", |
| 93 | static_cast<u32>(type), arg0, arg1, arg2); | 93 | type, arg0, arg1, arg2); |
| 94 | }; | 94 | }; |
| 95 | 95 | ||
| 96 | switch (type) { | 96 | switch (type) { |
| @@ -136,7 +136,7 @@ void Auth::Execute() { | |||
| 136 | } | 136 | } |
| 137 | 137 | ||
| 138 | void Auth::AuthFinished(bool is_successful) { | 138 | void Auth::AuthFinished(bool is_successful) { |
| 139 | this->successful = is_successful; | 139 | successful = is_successful; |
| 140 | 140 | ||
| 141 | struct Return { | 141 | struct Return { |
| 142 | ResultCode result_code; | 142 | ResultCode result_code; |
| @@ -193,7 +193,7 @@ void PhotoViewer::Execute() { | |||
| 193 | frontend.ShowAllPhotos(callback); | 193 | frontend.ShowAllPhotos(callback); |
| 194 | break; | 194 | break; |
| 195 | default: | 195 | default: |
| 196 | UNIMPLEMENTED_MSG("Unimplemented PhotoViewer applet mode={:02X}!", static_cast<u8>(mode)); | 196 | UNIMPLEMENTED_MSG("Unimplemented PhotoViewer applet mode={:02X}!", mode); |
| 197 | } | 197 | } |
| 198 | } | 198 | } |
| 199 | 199 | ||
diff --git a/src/core/hle/service/aoc/aoc_u.cpp b/src/core/hle/service/aoc/aoc_u.cpp index 6abac3f78..23e28565b 100644 --- a/src/core/hle/service/aoc/aoc_u.cpp +++ b/src/core/hle/service/aoc/aoc_u.cpp | |||
| @@ -7,6 +7,7 @@ | |||
| 7 | #include <vector> | 7 | #include <vector> |
| 8 | #include "common/logging/log.h" | 8 | #include "common/logging/log.h" |
| 9 | #include "core/core.h" | 9 | #include "core/core.h" |
| 10 | #include "core/file_sys/common_funcs.h" | ||
| 10 | #include "core/file_sys/content_archive.h" | 11 | #include "core/file_sys/content_archive.h" |
| 11 | #include "core/file_sys/control_metadata.h" | 12 | #include "core/file_sys/control_metadata.h" |
| 12 | #include "core/file_sys/nca_metadata.h" | 13 | #include "core/file_sys/nca_metadata.h" |
| @@ -23,11 +24,8 @@ | |||
| 23 | 24 | ||
| 24 | namespace Service::AOC { | 25 | namespace Service::AOC { |
| 25 | 26 | ||
| 26 | constexpr u64 DLC_BASE_TITLE_ID_MASK = 0xFFFFFFFFFFFFE000; | ||
| 27 | constexpr u64 DLC_BASE_TO_AOC_ID = 0x1000; | ||
| 28 | |||
| 29 | static bool CheckAOCTitleIDMatchesBase(u64 title_id, u64 base) { | 27 | static bool CheckAOCTitleIDMatchesBase(u64 title_id, u64 base) { |
| 30 | return (title_id & DLC_BASE_TITLE_ID_MASK) == base; | 28 | return FileSys::GetBaseTitleID(title_id) == base; |
| 31 | } | 29 | } |
| 32 | 30 | ||
| 33 | static std::vector<u64> AccumulateAOCTitleIDs(Core::System& system) { | 31 | static std::vector<u64> AccumulateAOCTitleIDs(Core::System& system) { |
| @@ -48,6 +46,62 @@ static std::vector<u64> AccumulateAOCTitleIDs(Core::System& system) { | |||
| 48 | return add_on_content; | 46 | return add_on_content; |
| 49 | } | 47 | } |
| 50 | 48 | ||
| 49 | class IPurchaseEventManager final : public ServiceFramework<IPurchaseEventManager> { | ||
| 50 | public: | ||
| 51 | explicit IPurchaseEventManager(Core::System& system_) | ||
| 52 | : ServiceFramework{system_, "IPurchaseEventManager"} { | ||
| 53 | // clang-format off | ||
| 54 | static const FunctionInfo functions[] = { | ||
| 55 | {0, &IPurchaseEventManager::SetDefaultDeliveryTarget, "SetDefaultDeliveryTarget"}, | ||
| 56 | {1, &IPurchaseEventManager::SetDeliveryTarget, "SetDeliveryTarget"}, | ||
| 57 | {2, &IPurchaseEventManager::GetPurchasedEventReadableHandle, "GetPurchasedEventReadableHandle"}, | ||
| 58 | {3, nullptr, "PopPurchasedProductInfo"}, | ||
| 59 | {4, nullptr, "PopPurchasedProductInfoWithUid"}, | ||
| 60 | }; | ||
| 61 | // clang-format on | ||
| 62 | |||
| 63 | RegisterHandlers(functions); | ||
| 64 | |||
| 65 | purchased_event = Kernel::WritableEvent::CreateEventPair( | ||
| 66 | system.Kernel(), "IPurchaseEventManager:PurchasedEvent"); | ||
| 67 | } | ||
| 68 | |||
| 69 | private: | ||
| 70 | void SetDefaultDeliveryTarget(Kernel::HLERequestContext& ctx) { | ||
| 71 | IPC::RequestParser rp{ctx}; | ||
| 72 | |||
| 73 | const auto unknown_1 = rp.Pop<u64>(); | ||
| 74 | [[maybe_unused]] const auto unknown_2 = ctx.ReadBuffer(); | ||
| 75 | |||
| 76 | LOG_WARNING(Service_AOC, "(STUBBED) called, unknown_1={}", unknown_1); | ||
| 77 | |||
| 78 | IPC::ResponseBuilder rb{ctx, 2}; | ||
| 79 | rb.Push(RESULT_SUCCESS); | ||
| 80 | } | ||
| 81 | |||
| 82 | void SetDeliveryTarget(Kernel::HLERequestContext& ctx) { | ||
| 83 | IPC::RequestParser rp{ctx}; | ||
| 84 | |||
| 85 | const auto unknown_1 = rp.Pop<u64>(); | ||
| 86 | [[maybe_unused]] const auto unknown_2 = ctx.ReadBuffer(); | ||
| 87 | |||
| 88 | LOG_WARNING(Service_AOC, "(STUBBED) called, unknown_1={}", unknown_1); | ||
| 89 | |||
| 90 | IPC::ResponseBuilder rb{ctx, 2}; | ||
| 91 | rb.Push(RESULT_SUCCESS); | ||
| 92 | } | ||
| 93 | |||
| 94 | void GetPurchasedEventReadableHandle(Kernel::HLERequestContext& ctx) { | ||
| 95 | LOG_WARNING(Service_AOC, "called"); | ||
| 96 | |||
| 97 | IPC::ResponseBuilder rb{ctx, 2, 1}; | ||
| 98 | rb.Push(RESULT_SUCCESS); | ||
| 99 | rb.PushCopyObjects(purchased_event.readable); | ||
| 100 | } | ||
| 101 | |||
| 102 | Kernel::EventPair purchased_event; | ||
| 103 | }; | ||
| 104 | |||
| 51 | AOC_U::AOC_U(Core::System& system_) | 105 | AOC_U::AOC_U(Core::System& system_) |
| 52 | : ServiceFramework{system_, "aoc:u"}, add_on_content{AccumulateAOCTitleIDs(system)} { | 106 | : ServiceFramework{system_, "aoc:u"}, add_on_content{AccumulateAOCTitleIDs(system)} { |
| 53 | // clang-format off | 107 | // clang-format off |
| @@ -62,8 +116,8 @@ AOC_U::AOC_U(Core::System& system_) | |||
| 62 | {7, &AOC_U::PrepareAddOnContent, "PrepareAddOnContent"}, | 116 | {7, &AOC_U::PrepareAddOnContent, "PrepareAddOnContent"}, |
| 63 | {8, &AOC_U::GetAddOnContentListChangedEvent, "GetAddOnContentListChangedEvent"}, | 117 | {8, &AOC_U::GetAddOnContentListChangedEvent, "GetAddOnContentListChangedEvent"}, |
| 64 | {9, nullptr, "GetAddOnContentLostErrorCode"}, | 118 | {9, nullptr, "GetAddOnContentLostErrorCode"}, |
| 65 | {100, nullptr, "CreateEcPurchasedEventManager"}, | 119 | {100, &AOC_U::CreateEcPurchasedEventManager, "CreateEcPurchasedEventManager"}, |
| 66 | {101, nullptr, "CreatePermanentEcPurchasedEventManager"}, | 120 | {101, &AOC_U::CreatePermanentEcPurchasedEventManager, "CreatePermanentEcPurchasedEventManager"}, |
| 67 | }; | 121 | }; |
| 68 | // clang-format on | 122 | // clang-format on |
| 69 | 123 | ||
| @@ -123,11 +177,11 @@ void AOC_U::ListAddOnContent(Kernel::HLERequestContext& ctx) { | |||
| 123 | const auto& disabled = Settings::values.disabled_addons[current]; | 177 | const auto& disabled = Settings::values.disabled_addons[current]; |
| 124 | if (std::find(disabled.begin(), disabled.end(), "DLC") == disabled.end()) { | 178 | if (std::find(disabled.begin(), disabled.end(), "DLC") == disabled.end()) { |
| 125 | for (u64 content_id : add_on_content) { | 179 | for (u64 content_id : add_on_content) { |
| 126 | if ((content_id & DLC_BASE_TITLE_ID_MASK) != current) { | 180 | if (FileSys::GetBaseTitleID(content_id) != current) { |
| 127 | continue; | 181 | continue; |
| 128 | } | 182 | } |
| 129 | 183 | ||
| 130 | out.push_back(static_cast<u32>(content_id & 0x7FF)); | 184 | out.push_back(static_cast<u32>(FileSys::GetAOCID(content_id))); |
| 131 | } | 185 | } |
| 132 | } | 186 | } |
| 133 | 187 | ||
| @@ -169,7 +223,7 @@ void AOC_U::GetAddOnContentBaseId(Kernel::HLERequestContext& ctx) { | |||
| 169 | 223 | ||
| 170 | const auto res = pm.GetControlMetadata(); | 224 | const auto res = pm.GetControlMetadata(); |
| 171 | if (res.first == nullptr) { | 225 | if (res.first == nullptr) { |
| 172 | rb.Push(title_id + DLC_BASE_TO_AOC_ID); | 226 | rb.Push(FileSys::GetAOCBaseTitleID(title_id)); |
| 173 | return; | 227 | return; |
| 174 | } | 228 | } |
| 175 | 229 | ||
| @@ -201,6 +255,22 @@ void AOC_U::GetAddOnContentListChangedEvent(Kernel::HLERequestContext& ctx) { | |||
| 201 | rb.PushCopyObjects(aoc_change_event.readable); | 255 | rb.PushCopyObjects(aoc_change_event.readable); |
| 202 | } | 256 | } |
| 203 | 257 | ||
| 258 | void AOC_U::CreateEcPurchasedEventManager(Kernel::HLERequestContext& ctx) { | ||
| 259 | LOG_WARNING(Service_AOC, "(STUBBED) called"); | ||
| 260 | |||
| 261 | IPC::ResponseBuilder rb{ctx, 2, 0, 1}; | ||
| 262 | rb.Push(RESULT_SUCCESS); | ||
| 263 | rb.PushIpcInterface<IPurchaseEventManager>(system); | ||
| 264 | } | ||
| 265 | |||
| 266 | void AOC_U::CreatePermanentEcPurchasedEventManager(Kernel::HLERequestContext& ctx) { | ||
| 267 | LOG_WARNING(Service_AOC, "(STUBBED) called"); | ||
| 268 | |||
| 269 | IPC::ResponseBuilder rb{ctx, 2, 0, 1}; | ||
| 270 | rb.Push(RESULT_SUCCESS); | ||
| 271 | rb.PushIpcInterface<IPurchaseEventManager>(system); | ||
| 272 | } | ||
| 273 | |||
| 204 | void InstallInterfaces(SM::ServiceManager& service_manager, Core::System& system) { | 274 | void InstallInterfaces(SM::ServiceManager& service_manager, Core::System& system) { |
| 205 | std::make_shared<AOC_U>(system)->InstallAsService(service_manager); | 275 | std::make_shared<AOC_U>(system)->InstallAsService(service_manager); |
| 206 | } | 276 | } |
diff --git a/src/core/hle/service/aoc/aoc_u.h b/src/core/hle/service/aoc/aoc_u.h index 7628f4568..26ee51be0 100644 --- a/src/core/hle/service/aoc/aoc_u.h +++ b/src/core/hle/service/aoc/aoc_u.h | |||
| @@ -27,6 +27,8 @@ private: | |||
| 27 | void GetAddOnContentBaseId(Kernel::HLERequestContext& ctx); | 27 | void GetAddOnContentBaseId(Kernel::HLERequestContext& ctx); |
| 28 | void PrepareAddOnContent(Kernel::HLERequestContext& ctx); | 28 | void PrepareAddOnContent(Kernel::HLERequestContext& ctx); |
| 29 | void GetAddOnContentListChangedEvent(Kernel::HLERequestContext& ctx); | 29 | void GetAddOnContentListChangedEvent(Kernel::HLERequestContext& ctx); |
| 30 | void CreateEcPurchasedEventManager(Kernel::HLERequestContext& ctx); | ||
| 31 | void CreatePermanentEcPurchasedEventManager(Kernel::HLERequestContext& ctx); | ||
| 30 | 32 | ||
| 31 | std::vector<u64> add_on_content; | 33 | std::vector<u64> add_on_content; |
| 32 | Kernel::EventPair aoc_change_event; | 34 | Kernel::EventPair aoc_change_event; |
diff --git a/src/core/hle/service/apm/controller.cpp b/src/core/hle/service/apm/controller.cpp index ce993bad3..03636642b 100644 --- a/src/core/hle/service/apm/controller.cpp +++ b/src/core/hle/service/apm/controller.cpp | |||
| @@ -48,8 +48,7 @@ void Controller::SetPerformanceConfiguration(PerformanceMode mode, | |||
| 48 | [config](const auto& entry) { return entry.first == config; }); | 48 | [config](const auto& entry) { return entry.first == config; }); |
| 49 | 49 | ||
| 50 | if (iter == config_to_speed.cend()) { | 50 | if (iter == config_to_speed.cend()) { |
| 51 | LOG_ERROR(Service_APM, "Invalid performance configuration value provided: {}", | 51 | LOG_ERROR(Service_APM, "Invalid performance configuration value provided: {}", config); |
| 52 | static_cast<u32>(config)); | ||
| 53 | return; | 52 | return; |
| 54 | } | 53 | } |
| 55 | 54 | ||
diff --git a/src/core/hle/service/apm/interface.cpp b/src/core/hle/service/apm/interface.cpp index 89442e21e..298f6d520 100644 --- a/src/core/hle/service/apm/interface.cpp +++ b/src/core/hle/service/apm/interface.cpp | |||
| @@ -28,8 +28,7 @@ private: | |||
| 28 | 28 | ||
| 29 | const auto mode = rp.PopEnum<PerformanceMode>(); | 29 | const auto mode = rp.PopEnum<PerformanceMode>(); |
| 30 | const auto config = rp.PopEnum<PerformanceConfiguration>(); | 30 | const auto config = rp.PopEnum<PerformanceConfiguration>(); |
| 31 | LOG_DEBUG(Service_APM, "called mode={} config={}", static_cast<u32>(mode), | 31 | LOG_DEBUG(Service_APM, "called mode={} config={}", mode, config); |
| 32 | static_cast<u32>(config)); | ||
| 33 | 32 | ||
| 34 | controller.SetPerformanceConfiguration(mode, config); | 33 | controller.SetPerformanceConfiguration(mode, config); |
| 35 | 34 | ||
| @@ -41,7 +40,7 @@ private: | |||
| 41 | IPC::RequestParser rp{ctx}; | 40 | IPC::RequestParser rp{ctx}; |
| 42 | 41 | ||
| 43 | const auto mode = rp.PopEnum<PerformanceMode>(); | 42 | const auto mode = rp.PopEnum<PerformanceMode>(); |
| 44 | LOG_DEBUG(Service_APM, "called mode={}", static_cast<u32>(mode)); | 43 | LOG_DEBUG(Service_APM, "called mode={}", mode); |
| 45 | 44 | ||
| 46 | IPC::ResponseBuilder rb{ctx, 3}; | 45 | IPC::ResponseBuilder rb{ctx, 3}; |
| 47 | rb.Push(RESULT_SUCCESS); | 46 | rb.Push(RESULT_SUCCESS); |
| @@ -111,7 +110,7 @@ void APM_Sys::SetCpuBoostMode(Kernel::HLERequestContext& ctx) { | |||
| 111 | IPC::RequestParser rp{ctx}; | 110 | IPC::RequestParser rp{ctx}; |
| 112 | const auto mode = rp.PopEnum<CpuBoostMode>(); | 111 | const auto mode = rp.PopEnum<CpuBoostMode>(); |
| 113 | 112 | ||
| 114 | LOG_DEBUG(Service_APM, "called, mode={:08X}", static_cast<u32>(mode)); | 113 | LOG_DEBUG(Service_APM, "called, mode={:08X}", mode); |
| 115 | 114 | ||
| 116 | controller.SetFromCpuBoostMode(mode); | 115 | controller.SetFromCpuBoostMode(mode); |
| 117 | 116 | ||
diff --git a/src/core/hle/service/bcat/backend/boxcat.cpp b/src/core/hle/service/bcat/backend/boxcat.cpp index 3b6f7498e..e43f3f47f 100644 --- a/src/core/hle/service/bcat/backend/boxcat.cpp +++ b/src/core/hle/service/bcat/backend/boxcat.cpp | |||
| @@ -483,7 +483,7 @@ Boxcat::StatusResult Boxcat::GetStatus(std::optional<std::string>& global, | |||
| 483 | global = json["global"].get<std::string>(); | 483 | global = json["global"].get<std::string>(); |
| 484 | 484 | ||
| 485 | if (json["games"].is_array()) { | 485 | if (json["games"].is_array()) { |
| 486 | for (const auto object : json["games"]) { | 486 | for (const auto& object : json["games"]) { |
| 487 | if (object.is_object() && object.find("name") != object.end()) { | 487 | if (object.is_object() && object.find("name") != object.end()) { |
| 488 | EventStatus detail{}; | 488 | EventStatus detail{}; |
| 489 | if (object["header"].is_string()) { | 489 | if (object["header"].is_string()) { |
diff --git a/src/core/hle/service/fatal/fatal.cpp b/src/core/hle/service/fatal/fatal.cpp index 9b7672a91..13147472e 100644 --- a/src/core/hle/service/fatal/fatal.cpp +++ b/src/core/hle/service/fatal/fatal.cpp | |||
| @@ -111,8 +111,9 @@ static void GenerateErrorReport(Core::System& system, ResultCode error_code, | |||
| 111 | 111 | ||
| 112 | static void ThrowFatalError(Core::System& system, ResultCode error_code, FatalType fatal_type, | 112 | static void ThrowFatalError(Core::System& system, ResultCode error_code, FatalType fatal_type, |
| 113 | const FatalInfo& info) { | 113 | const FatalInfo& info) { |
| 114 | LOG_ERROR(Service_Fatal, "Threw fatal error type {} with error code 0x{:X}", | 114 | LOG_ERROR(Service_Fatal, "Threw fatal error type {} with error code 0x{:X}", fatal_type, |
| 115 | static_cast<u32>(fatal_type), error_code.raw); | 115 | error_code.raw); |
| 116 | |||
| 116 | switch (fatal_type) { | 117 | switch (fatal_type) { |
| 117 | case FatalType::ErrorReportAndScreen: | 118 | case FatalType::ErrorReportAndScreen: |
| 118 | GenerateErrorReport(system, error_code, info); | 119 | GenerateErrorReport(system, error_code, info); |
diff --git a/src/core/hle/service/filesystem/filesystem.cpp b/src/core/hle/service/filesystem/filesystem.cpp index ca93062cf..b15c737e1 100644 --- a/src/core/hle/service/filesystem/filesystem.cpp +++ b/src/core/hle/service/filesystem/filesystem.cpp | |||
| @@ -298,10 +298,35 @@ ResultVal<FileSys::VirtualFile> FileSystemController::OpenRomFSCurrentProcess() | |||
| 298 | return romfs_factory->OpenCurrentProcess(system.CurrentProcess()->GetTitleID()); | 298 | return romfs_factory->OpenCurrentProcess(system.CurrentProcess()->GetTitleID()); |
| 299 | } | 299 | } |
| 300 | 300 | ||
| 301 | ResultVal<FileSys::VirtualFile> FileSystemController::OpenPatchedRomFS( | ||
| 302 | u64 title_id, FileSys::ContentRecordType type) const { | ||
| 303 | LOG_TRACE(Service_FS, "Opening patched RomFS for title_id={:016X}", title_id); | ||
| 304 | |||
| 305 | if (romfs_factory == nullptr) { | ||
| 306 | // TODO: Find a better error code for this | ||
| 307 | return RESULT_UNKNOWN; | ||
| 308 | } | ||
| 309 | |||
| 310 | return romfs_factory->OpenPatchedRomFS(title_id, type); | ||
| 311 | } | ||
| 312 | |||
| 313 | ResultVal<FileSys::VirtualFile> FileSystemController::OpenPatchedRomFSWithProgramIndex( | ||
| 314 | u64 title_id, u8 program_index, FileSys::ContentRecordType type) const { | ||
| 315 | LOG_TRACE(Service_FS, "Opening patched RomFS for title_id={:016X}, program_index={}", title_id, | ||
| 316 | program_index); | ||
| 317 | |||
| 318 | if (romfs_factory == nullptr) { | ||
| 319 | // TODO: Find a better error code for this | ||
| 320 | return RESULT_UNKNOWN; | ||
| 321 | } | ||
| 322 | |||
| 323 | return romfs_factory->OpenPatchedRomFSWithProgramIndex(title_id, program_index, type); | ||
| 324 | } | ||
| 325 | |||
| 301 | ResultVal<FileSys::VirtualFile> FileSystemController::OpenRomFS( | 326 | ResultVal<FileSys::VirtualFile> FileSystemController::OpenRomFS( |
| 302 | u64 title_id, FileSys::StorageId storage_id, FileSys::ContentRecordType type) const { | 327 | u64 title_id, FileSys::StorageId storage_id, FileSys::ContentRecordType type) const { |
| 303 | LOG_TRACE(Service_FS, "Opening RomFS for title_id={:016X}, storage_id={:02X}, type={:02X}", | 328 | LOG_TRACE(Service_FS, "Opening RomFS for title_id={:016X}, storage_id={:02X}, type={:02X}", |
| 304 | title_id, static_cast<u8>(storage_id), static_cast<u8>(type)); | 329 | title_id, storage_id, type); |
| 305 | 330 | ||
| 306 | if (romfs_factory == nullptr) { | 331 | if (romfs_factory == nullptr) { |
| 307 | // TODO(bunnei): Find a better error code for this | 332 | // TODO(bunnei): Find a better error code for this |
| @@ -313,8 +338,8 @@ ResultVal<FileSys::VirtualFile> FileSystemController::OpenRomFS( | |||
| 313 | 338 | ||
| 314 | ResultVal<FileSys::VirtualDir> FileSystemController::CreateSaveData( | 339 | ResultVal<FileSys::VirtualDir> FileSystemController::CreateSaveData( |
| 315 | FileSys::SaveDataSpaceId space, const FileSys::SaveDataAttribute& save_struct) const { | 340 | FileSys::SaveDataSpaceId space, const FileSys::SaveDataAttribute& save_struct) const { |
| 316 | LOG_TRACE(Service_FS, "Creating Save Data for space_id={:01X}, save_struct={}", | 341 | LOG_TRACE(Service_FS, "Creating Save Data for space_id={:01X}, save_struct={}", space, |
| 317 | static_cast<u8>(space), save_struct.DebugInfo()); | 342 | save_struct.DebugInfo()); |
| 318 | 343 | ||
| 319 | if (save_data_factory == nullptr) { | 344 | if (save_data_factory == nullptr) { |
| 320 | return FileSys::ERROR_ENTITY_NOT_FOUND; | 345 | return FileSys::ERROR_ENTITY_NOT_FOUND; |
| @@ -325,8 +350,8 @@ ResultVal<FileSys::VirtualDir> FileSystemController::CreateSaveData( | |||
| 325 | 350 | ||
| 326 | ResultVal<FileSys::VirtualDir> FileSystemController::OpenSaveData( | 351 | ResultVal<FileSys::VirtualDir> FileSystemController::OpenSaveData( |
| 327 | FileSys::SaveDataSpaceId space, const FileSys::SaveDataAttribute& attribute) const { | 352 | FileSys::SaveDataSpaceId space, const FileSys::SaveDataAttribute& attribute) const { |
| 328 | LOG_TRACE(Service_FS, "Opening Save Data for space_id={:01X}, save_struct={}", | 353 | LOG_TRACE(Service_FS, "Opening Save Data for space_id={:01X}, save_struct={}", space, |
| 329 | static_cast<u8>(space), attribute.DebugInfo()); | 354 | attribute.DebugInfo()); |
| 330 | 355 | ||
| 331 | if (save_data_factory == nullptr) { | 356 | if (save_data_factory == nullptr) { |
| 332 | return FileSys::ERROR_ENTITY_NOT_FOUND; | 357 | return FileSys::ERROR_ENTITY_NOT_FOUND; |
| @@ -337,7 +362,7 @@ ResultVal<FileSys::VirtualDir> FileSystemController::OpenSaveData( | |||
| 337 | 362 | ||
| 338 | ResultVal<FileSys::VirtualDir> FileSystemController::OpenSaveDataSpace( | 363 | ResultVal<FileSys::VirtualDir> FileSystemController::OpenSaveDataSpace( |
| 339 | FileSys::SaveDataSpaceId space) const { | 364 | FileSys::SaveDataSpaceId space) const { |
| 340 | LOG_TRACE(Service_FS, "Opening Save Data Space for space_id={:01X}", static_cast<u8>(space)); | 365 | LOG_TRACE(Service_FS, "Opening Save Data Space for space_id={:01X}", space); |
| 341 | 366 | ||
| 342 | if (save_data_factory == nullptr) { | 367 | if (save_data_factory == nullptr) { |
| 343 | return FileSys::ERROR_ENTITY_NOT_FOUND; | 368 | return FileSys::ERROR_ENTITY_NOT_FOUND; |
| @@ -358,7 +383,7 @@ ResultVal<FileSys::VirtualDir> FileSystemController::OpenSDMC() const { | |||
| 358 | 383 | ||
| 359 | ResultVal<FileSys::VirtualDir> FileSystemController::OpenBISPartition( | 384 | ResultVal<FileSys::VirtualDir> FileSystemController::OpenBISPartition( |
| 360 | FileSys::BisPartitionId id) const { | 385 | FileSys::BisPartitionId id) const { |
| 361 | LOG_TRACE(Service_FS, "Opening BIS Partition with id={:08X}", static_cast<u32>(id)); | 386 | LOG_TRACE(Service_FS, "Opening BIS Partition with id={:08X}", id); |
| 362 | 387 | ||
| 363 | if (bis_factory == nullptr) { | 388 | if (bis_factory == nullptr) { |
| 364 | return FileSys::ERROR_ENTITY_NOT_FOUND; | 389 | return FileSys::ERROR_ENTITY_NOT_FOUND; |
| @@ -374,7 +399,7 @@ ResultVal<FileSys::VirtualDir> FileSystemController::OpenBISPartition( | |||
| 374 | 399 | ||
| 375 | ResultVal<FileSys::VirtualFile> FileSystemController::OpenBISPartitionStorage( | 400 | ResultVal<FileSys::VirtualFile> FileSystemController::OpenBISPartitionStorage( |
| 376 | FileSys::BisPartitionId id) const { | 401 | FileSys::BisPartitionId id) const { |
| 377 | LOG_TRACE(Service_FS, "Opening BIS Partition Storage with id={:08X}", static_cast<u32>(id)); | 402 | LOG_TRACE(Service_FS, "Opening BIS Partition Storage with id={:08X}", id); |
| 378 | 403 | ||
| 379 | if (bis_factory == nullptr) { | 404 | if (bis_factory == nullptr) { |
| 380 | return FileSys::ERROR_ENTITY_NOT_FOUND; | 405 | return FileSys::ERROR_ENTITY_NOT_FOUND; |
diff --git a/src/core/hle/service/filesystem/filesystem.h b/src/core/hle/service/filesystem/filesystem.h index 6dbbf0b2b..7102d3f9a 100644 --- a/src/core/hle/service/filesystem/filesystem.h +++ b/src/core/hle/service/filesystem/filesystem.h | |||
| @@ -66,6 +66,10 @@ public: | |||
| 66 | 66 | ||
| 67 | void SetPackedUpdate(FileSys::VirtualFile update_raw); | 67 | void SetPackedUpdate(FileSys::VirtualFile update_raw); |
| 68 | ResultVal<FileSys::VirtualFile> OpenRomFSCurrentProcess() const; | 68 | ResultVal<FileSys::VirtualFile> OpenRomFSCurrentProcess() const; |
| 69 | ResultVal<FileSys::VirtualFile> OpenPatchedRomFS(u64 title_id, | ||
| 70 | FileSys::ContentRecordType type) const; | ||
| 71 | ResultVal<FileSys::VirtualFile> OpenPatchedRomFSWithProgramIndex( | ||
| 72 | u64 title_id, u8 program_index, FileSys::ContentRecordType type) const; | ||
| 69 | ResultVal<FileSys::VirtualFile> OpenRomFS(u64 title_id, FileSys::StorageId storage_id, | 73 | ResultVal<FileSys::VirtualFile> OpenRomFS(u64 title_id, FileSys::StorageId storage_id, |
| 70 | FileSys::ContentRecordType type) const; | 74 | FileSys::ContentRecordType type) const; |
| 71 | ResultVal<FileSys::VirtualDir> CreateSaveData( | 75 | ResultVal<FileSys::VirtualDir> CreateSaveData( |
diff --git a/src/core/hle/service/filesystem/fsp_srv.cpp b/src/core/hle/service/filesystem/fsp_srv.cpp index b3480494c..9cc260515 100644 --- a/src/core/hle/service/filesystem/fsp_srv.cpp +++ b/src/core/hle/service/filesystem/fsp_srv.cpp | |||
| @@ -413,7 +413,7 @@ public: | |||
| 413 | 413 | ||
| 414 | const auto mode = static_cast<FileSys::Mode>(rp.Pop<u32>()); | 414 | const auto mode = static_cast<FileSys::Mode>(rp.Pop<u32>()); |
| 415 | 415 | ||
| 416 | LOG_DEBUG(Service_FS, "called. file={}, mode={}", name, static_cast<u32>(mode)); | 416 | LOG_DEBUG(Service_FS, "called. file={}, mode={}", name, mode); |
| 417 | 417 | ||
| 418 | auto result = backend.OpenFile(name, mode); | 418 | auto result = backend.OpenFile(name, mode); |
| 419 | if (result.Failed()) { | 419 | if (result.Failed()) { |
| @@ -553,8 +553,7 @@ private: | |||
| 553 | const auto save_root = fsc.OpenSaveDataSpace(space); | 553 | const auto save_root = fsc.OpenSaveDataSpace(space); |
| 554 | 554 | ||
| 555 | if (save_root.Failed() || *save_root == nullptr) { | 555 | if (save_root.Failed() || *save_root == nullptr) { |
| 556 | LOG_ERROR(Service_FS, "The save root for the space_id={:02X} was invalid!", | 556 | LOG_ERROR(Service_FS, "The save root for the space_id={:02X} was invalid!", space); |
| 557 | static_cast<u8>(space)); | ||
| 558 | return; | 557 | return; |
| 559 | } | 558 | } |
| 560 | 559 | ||
| @@ -718,7 +717,7 @@ FSP_SRV::FSP_SRV(Core::System& system_) | |||
| 718 | {202, &FSP_SRV::OpenDataStorageByDataId, "OpenDataStorageByDataId"}, | 717 | {202, &FSP_SRV::OpenDataStorageByDataId, "OpenDataStorageByDataId"}, |
| 719 | {203, &FSP_SRV::OpenPatchDataStorageByCurrentProcess, "OpenPatchDataStorageByCurrentProcess"}, | 718 | {203, &FSP_SRV::OpenPatchDataStorageByCurrentProcess, "OpenPatchDataStorageByCurrentProcess"}, |
| 720 | {204, nullptr, "OpenDataFileSystemByProgramIndex"}, | 719 | {204, nullptr, "OpenDataFileSystemByProgramIndex"}, |
| 721 | {205, nullptr, "OpenDataStorageByProgramIndex"}, | 720 | {205, &FSP_SRV::OpenDataStorageWithProgramIndex, "OpenDataStorageWithProgramIndex"}, |
| 722 | {400, nullptr, "OpenDeviceOperator"}, | 721 | {400, nullptr, "OpenDeviceOperator"}, |
| 723 | {500, nullptr, "OpenSdCardDetectionEventNotifier"}, | 722 | {500, nullptr, "OpenSdCardDetectionEventNotifier"}, |
| 724 | {501, nullptr, "OpenGameCardDetectionEventNotifier"}, | 723 | {501, nullptr, "OpenGameCardDetectionEventNotifier"}, |
| @@ -795,8 +794,7 @@ void FSP_SRV::OpenFileSystemWithPatch(Kernel::HLERequestContext& ctx) { | |||
| 795 | 794 | ||
| 796 | const auto type = rp.PopRaw<FileSystemType>(); | 795 | const auto type = rp.PopRaw<FileSystemType>(); |
| 797 | const auto title_id = rp.PopRaw<u64>(); | 796 | const auto title_id = rp.PopRaw<u64>(); |
| 798 | LOG_WARNING(Service_FS, "(STUBBED) called with type={}, title_id={:016X}", | 797 | LOG_WARNING(Service_FS, "(STUBBED) called with type={}, title_id={:016X}", type, title_id); |
| 799 | static_cast<u8>(type), title_id); | ||
| 800 | 798 | ||
| 801 | IPC::ResponseBuilder rb{ctx, 2, 0, 0}; | 799 | IPC::ResponseBuilder rb{ctx, 2, 0, 0}; |
| 802 | rb.Push(RESULT_UNKNOWN); | 800 | rb.Push(RESULT_UNKNOWN); |
| @@ -883,7 +881,7 @@ void FSP_SRV::OpenReadOnlySaveDataFileSystem(Kernel::HLERequestContext& ctx) { | |||
| 883 | void FSP_SRV::OpenSaveDataInfoReaderBySaveDataSpaceId(Kernel::HLERequestContext& ctx) { | 881 | void FSP_SRV::OpenSaveDataInfoReaderBySaveDataSpaceId(Kernel::HLERequestContext& ctx) { |
| 884 | IPC::RequestParser rp{ctx}; | 882 | IPC::RequestParser rp{ctx}; |
| 885 | const auto space = rp.PopRaw<FileSys::SaveDataSpaceId>(); | 883 | const auto space = rp.PopRaw<FileSys::SaveDataSpaceId>(); |
| 886 | LOG_INFO(Service_FS, "called, space={}", static_cast<u8>(space)); | 884 | LOG_INFO(Service_FS, "called, space={}", space); |
| 887 | 885 | ||
| 888 | IPC::ResponseBuilder rb{ctx, 2, 0, 1}; | 886 | IPC::ResponseBuilder rb{ctx, 2, 0, 1}; |
| 889 | rb.Push(RESULT_SUCCESS); | 887 | rb.Push(RESULT_SUCCESS); |
| @@ -915,10 +913,10 @@ void FSP_SRV::ReadSaveDataFileSystemExtraDataWithMaskBySaveDataAttribute( | |||
| 915 | "(STUBBED) called, flags={}, space_id={}, attribute.title_id={:016X}\n" | 913 | "(STUBBED) called, flags={}, space_id={}, attribute.title_id={:016X}\n" |
| 916 | "attribute.user_id={:016X}{:016X}, attribute.save_id={:016X}\n" | 914 | "attribute.user_id={:016X}{:016X}, attribute.save_id={:016X}\n" |
| 917 | "attribute.type={}, attribute.rank={}, attribute.index={}", | 915 | "attribute.type={}, attribute.rank={}, attribute.index={}", |
| 918 | flags, static_cast<u32>(parameters.space_id), parameters.attribute.title_id, | 916 | flags, parameters.space_id, parameters.attribute.title_id, |
| 919 | parameters.attribute.user_id[1], parameters.attribute.user_id[0], | 917 | parameters.attribute.user_id[1], parameters.attribute.user_id[0], |
| 920 | parameters.attribute.save_id, static_cast<u32>(parameters.attribute.type), | 918 | parameters.attribute.save_id, parameters.attribute.type, parameters.attribute.rank, |
| 921 | static_cast<u32>(parameters.attribute.rank), parameters.attribute.index); | 919 | parameters.attribute.index); |
| 922 | 920 | ||
| 923 | IPC::ResponseBuilder rb{ctx, 3}; | 921 | IPC::ResponseBuilder rb{ctx, 3}; |
| 924 | rb.Push(RESULT_SUCCESS); | 922 | rb.Push(RESULT_SUCCESS); |
| @@ -951,7 +949,7 @@ void FSP_SRV::OpenDataStorageByDataId(Kernel::HLERequestContext& ctx) { | |||
| 951 | const auto title_id = rp.PopRaw<u64>(); | 949 | const auto title_id = rp.PopRaw<u64>(); |
| 952 | 950 | ||
| 953 | LOG_DEBUG(Service_FS, "called with storage_id={:02X}, unknown={:08X}, title_id={:016X}", | 951 | LOG_DEBUG(Service_FS, "called with storage_id={:02X}, unknown={:08X}, title_id={:016X}", |
| 954 | static_cast<u8>(storage_id), unknown, title_id); | 952 | storage_id, unknown, title_id); |
| 955 | 953 | ||
| 956 | auto data = fsc.OpenRomFS(title_id, storage_id, FileSys::ContentRecordType::Data); | 954 | auto data = fsc.OpenRomFS(title_id, storage_id, FileSys::ContentRecordType::Data); |
| 957 | 955 | ||
| @@ -968,7 +966,7 @@ void FSP_SRV::OpenDataStorageByDataId(Kernel::HLERequestContext& ctx) { | |||
| 968 | // TODO(DarkLordZach): Find the right error code to use here | 966 | // TODO(DarkLordZach): Find the right error code to use here |
| 969 | LOG_ERROR(Service_FS, | 967 | LOG_ERROR(Service_FS, |
| 970 | "could not open data storage with title_id={:016X}, storage_id={:02X}", title_id, | 968 | "could not open data storage with title_id={:016X}, storage_id={:02X}", title_id, |
| 971 | static_cast<u8>(storage_id)); | 969 | storage_id); |
| 972 | IPC::ResponseBuilder rb{ctx, 2}; | 970 | IPC::ResponseBuilder rb{ctx, 2}; |
| 973 | rb.Push(RESULT_UNKNOWN); | 971 | rb.Push(RESULT_UNKNOWN); |
| 974 | return; | 972 | return; |
| @@ -987,21 +985,46 @@ void FSP_SRV::OpenDataStorageByDataId(Kernel::HLERequestContext& ctx) { | |||
| 987 | void FSP_SRV::OpenPatchDataStorageByCurrentProcess(Kernel::HLERequestContext& ctx) { | 985 | void FSP_SRV::OpenPatchDataStorageByCurrentProcess(Kernel::HLERequestContext& ctx) { |
| 988 | IPC::RequestParser rp{ctx}; | 986 | IPC::RequestParser rp{ctx}; |
| 989 | 987 | ||
| 990 | auto storage_id = rp.PopRaw<FileSys::StorageId>(); | 988 | const auto storage_id = rp.PopRaw<FileSys::StorageId>(); |
| 991 | auto title_id = rp.PopRaw<u64>(); | 989 | const auto title_id = rp.PopRaw<u64>(); |
| 992 | 990 | ||
| 993 | LOG_DEBUG(Service_FS, "called with storage_id={:02X}, title_id={:016X}", | 991 | LOG_DEBUG(Service_FS, "called with storage_id={:02X}, title_id={:016X}", storage_id, title_id); |
| 994 | static_cast<u8>(storage_id), title_id); | ||
| 995 | 992 | ||
| 996 | IPC::ResponseBuilder rb{ctx, 2}; | 993 | IPC::ResponseBuilder rb{ctx, 2}; |
| 997 | rb.Push(FileSys::ERROR_ENTITY_NOT_FOUND); | 994 | rb.Push(FileSys::ERROR_ENTITY_NOT_FOUND); |
| 998 | } | 995 | } |
| 999 | 996 | ||
| 997 | void FSP_SRV::OpenDataStorageWithProgramIndex(Kernel::HLERequestContext& ctx) { | ||
| 998 | IPC::RequestParser rp{ctx}; | ||
| 999 | |||
| 1000 | const auto program_index = rp.PopRaw<u8>(); | ||
| 1001 | |||
| 1002 | LOG_DEBUG(Service_FS, "called, program_index={}", program_index); | ||
| 1003 | |||
| 1004 | auto romfs = fsc.OpenPatchedRomFSWithProgramIndex( | ||
| 1005 | system.CurrentProcess()->GetTitleID(), program_index, FileSys::ContentRecordType::Program); | ||
| 1006 | |||
| 1007 | if (romfs.Failed()) { | ||
| 1008 | // TODO: Find the right error code to use here | ||
| 1009 | LOG_ERROR(Service_FS, "could not open storage with program_index={}", program_index); | ||
| 1010 | |||
| 1011 | IPC::ResponseBuilder rb{ctx, 2}; | ||
| 1012 | rb.Push(RESULT_UNKNOWN); | ||
| 1013 | return; | ||
| 1014 | } | ||
| 1015 | |||
| 1016 | auto storage = std::make_shared<IStorage>(system, std::move(romfs.Unwrap())); | ||
| 1017 | |||
| 1018 | IPC::ResponseBuilder rb{ctx, 2, 0, 1}; | ||
| 1019 | rb.Push(RESULT_SUCCESS); | ||
| 1020 | rb.PushIpcInterface<IStorage>(std::move(storage)); | ||
| 1021 | } | ||
| 1022 | |||
| 1000 | void FSP_SRV::SetGlobalAccessLogMode(Kernel::HLERequestContext& ctx) { | 1023 | void FSP_SRV::SetGlobalAccessLogMode(Kernel::HLERequestContext& ctx) { |
| 1001 | IPC::RequestParser rp{ctx}; | 1024 | IPC::RequestParser rp{ctx}; |
| 1002 | log_mode = rp.PopEnum<LogMode>(); | 1025 | log_mode = rp.PopEnum<LogMode>(); |
| 1003 | 1026 | ||
| 1004 | LOG_DEBUG(Service_FS, "called, log_mode={:08X}", static_cast<u32>(log_mode)); | 1027 | LOG_DEBUG(Service_FS, "called, log_mode={:08X}", log_mode); |
| 1005 | 1028 | ||
| 1006 | IPC::ResponseBuilder rb{ctx, 2}; | 1029 | IPC::ResponseBuilder rb{ctx, 2}; |
| 1007 | rb.Push(RESULT_SUCCESS); | 1030 | rb.Push(RESULT_SUCCESS); |
diff --git a/src/core/hle/service/filesystem/fsp_srv.h b/src/core/hle/service/filesystem/fsp_srv.h index 472286d6e..8ed933279 100644 --- a/src/core/hle/service/filesystem/fsp_srv.h +++ b/src/core/hle/service/filesystem/fsp_srv.h | |||
| @@ -49,6 +49,7 @@ private: | |||
| 49 | void OpenDataStorageByCurrentProcess(Kernel::HLERequestContext& ctx); | 49 | void OpenDataStorageByCurrentProcess(Kernel::HLERequestContext& ctx); |
| 50 | void OpenDataStorageByDataId(Kernel::HLERequestContext& ctx); | 50 | void OpenDataStorageByDataId(Kernel::HLERequestContext& ctx); |
| 51 | void OpenPatchDataStorageByCurrentProcess(Kernel::HLERequestContext& ctx); | 51 | void OpenPatchDataStorageByCurrentProcess(Kernel::HLERequestContext& ctx); |
| 52 | void OpenDataStorageWithProgramIndex(Kernel::HLERequestContext& ctx); | ||
| 52 | void SetGlobalAccessLogMode(Kernel::HLERequestContext& ctx); | 53 | void SetGlobalAccessLogMode(Kernel::HLERequestContext& ctx); |
| 53 | void GetGlobalAccessLogMode(Kernel::HLERequestContext& ctx); | 54 | void GetGlobalAccessLogMode(Kernel::HLERequestContext& ctx); |
| 54 | void OutputAccessLogToSdCard(Kernel::HLERequestContext& ctx); | 55 | void OutputAccessLogToSdCard(Kernel::HLERequestContext& ctx); |
diff --git a/src/core/hle/service/friend/friend.cpp b/src/core/hle/service/friend/friend.cpp index 40a289594..c5b053c31 100644 --- a/src/core/hle/service/friend/friend.cpp +++ b/src/core/hle/service/friend/friend.cpp | |||
| @@ -229,8 +229,7 @@ private: | |||
| 229 | break; | 229 | break; |
| 230 | default: | 230 | default: |
| 231 | // HOS seems not have an error case for an unknown notification | 231 | // HOS seems not have an error case for an unknown notification |
| 232 | LOG_WARNING(Service_ACC, "Unknown notification {:08X}", | 232 | LOG_WARNING(Service_ACC, "Unknown notification {:08X}", notification.notification_type); |
| 233 | static_cast<u32>(notification.notification_type)); | ||
| 234 | break; | 233 | break; |
| 235 | } | 234 | } |
| 236 | 235 | ||
diff --git a/src/core/hle/service/hid/controllers/npad.cpp b/src/core/hle/service/hid/controllers/npad.cpp index 66c4fe60a..f6a0770bf 100644 --- a/src/core/hle/service/hid/controllers/npad.cpp +++ b/src/core/hle/service/hid/controllers/npad.cpp | |||
| @@ -116,6 +116,31 @@ u32 Controller_NPad::IndexToNPad(std::size_t index) { | |||
| 116 | } | 116 | } |
| 117 | } | 117 | } |
| 118 | 118 | ||
| 119 | bool Controller_NPad::IsNpadIdValid(u32 npad_id) { | ||
| 120 | switch (npad_id) { | ||
| 121 | case 0: | ||
| 122 | case 1: | ||
| 123 | case 2: | ||
| 124 | case 3: | ||
| 125 | case 4: | ||
| 126 | case 5: | ||
| 127 | case 6: | ||
| 128 | case 7: | ||
| 129 | case NPAD_UNKNOWN: | ||
| 130 | case NPAD_HANDHELD: | ||
| 131 | return true; | ||
| 132 | default: | ||
| 133 | LOG_ERROR(Service_HID, "Invalid npad id {}", npad_id); | ||
| 134 | return false; | ||
| 135 | } | ||
| 136 | } | ||
| 137 | |||
| 138 | bool Controller_NPad::IsDeviceHandleValid(const DeviceHandle& device_handle) { | ||
| 139 | return IsNpadIdValid(device_handle.npad_id) && | ||
| 140 | device_handle.npad_type < NpadType::MaxNpadType && | ||
| 141 | device_handle.device_index < DeviceIndex::MaxDeviceIndex; | ||
| 142 | } | ||
| 143 | |||
| 119 | Controller_NPad::Controller_NPad(Core::System& system) : ControllerBase(system), system(system) {} | 144 | Controller_NPad::Controller_NPad(Core::System& system) : ControllerBase(system), system(system) {} |
| 120 | 145 | ||
| 121 | Controller_NPad::~Controller_NPad() { | 146 | Controller_NPad::~Controller_NPad() { |
| @@ -742,6 +767,10 @@ bool Controller_NPad::VibrateControllerAtIndex(std::size_t npad_index, std::size | |||
| 742 | 767 | ||
| 743 | void Controller_NPad::VibrateController(const DeviceHandle& vibration_device_handle, | 768 | void Controller_NPad::VibrateController(const DeviceHandle& vibration_device_handle, |
| 744 | const VibrationValue& vibration_value) { | 769 | const VibrationValue& vibration_value) { |
| 770 | if (!IsDeviceHandleValid(vibration_device_handle)) { | ||
| 771 | return; | ||
| 772 | } | ||
| 773 | |||
| 745 | if (!Settings::values.vibration_enabled.GetValue() && !permit_vibration_session_enabled) { | 774 | if (!Settings::values.vibration_enabled.GetValue() && !permit_vibration_session_enabled) { |
| 746 | return; | 775 | return; |
| 747 | } | 776 | } |
| @@ -798,12 +827,20 @@ void Controller_NPad::VibrateControllers(const std::vector<DeviceHandle>& vibrat | |||
| 798 | 827 | ||
| 799 | Controller_NPad::VibrationValue Controller_NPad::GetLastVibration( | 828 | Controller_NPad::VibrationValue Controller_NPad::GetLastVibration( |
| 800 | const DeviceHandle& vibration_device_handle) const { | 829 | const DeviceHandle& vibration_device_handle) const { |
| 830 | if (!IsDeviceHandleValid(vibration_device_handle)) { | ||
| 831 | return {}; | ||
| 832 | } | ||
| 833 | |||
| 801 | const auto npad_index = NPadIdToIndex(vibration_device_handle.npad_id); | 834 | const auto npad_index = NPadIdToIndex(vibration_device_handle.npad_id); |
| 802 | const auto device_index = static_cast<std::size_t>(vibration_device_handle.device_index); | 835 | const auto device_index = static_cast<std::size_t>(vibration_device_handle.device_index); |
| 803 | return latest_vibration_values[npad_index][device_index]; | 836 | return latest_vibration_values[npad_index][device_index]; |
| 804 | } | 837 | } |
| 805 | 838 | ||
| 806 | void Controller_NPad::InitializeVibrationDevice(const DeviceHandle& vibration_device_handle) { | 839 | void Controller_NPad::InitializeVibrationDevice(const DeviceHandle& vibration_device_handle) { |
| 840 | if (!IsDeviceHandleValid(vibration_device_handle)) { | ||
| 841 | return; | ||
| 842 | } | ||
| 843 | |||
| 807 | const auto npad_index = NPadIdToIndex(vibration_device_handle.npad_id); | 844 | const auto npad_index = NPadIdToIndex(vibration_device_handle.npad_id); |
| 808 | const auto device_index = static_cast<std::size_t>(vibration_device_handle.device_index); | 845 | const auto device_index = static_cast<std::size_t>(vibration_device_handle.device_index); |
| 809 | InitializeVibrationDeviceAtIndex(npad_index, device_index); | 846 | InitializeVibrationDeviceAtIndex(npad_index, device_index); |
| @@ -824,6 +861,10 @@ void Controller_NPad::SetPermitVibrationSession(bool permit_vibration_session) { | |||
| 824 | } | 861 | } |
| 825 | 862 | ||
| 826 | bool Controller_NPad::IsVibrationDeviceMounted(const DeviceHandle& vibration_device_handle) const { | 863 | bool Controller_NPad::IsVibrationDeviceMounted(const DeviceHandle& vibration_device_handle) const { |
| 864 | if (!IsDeviceHandleValid(vibration_device_handle)) { | ||
| 865 | return false; | ||
| 866 | } | ||
| 867 | |||
| 827 | const auto npad_index = NPadIdToIndex(vibration_device_handle.npad_id); | 868 | const auto npad_index = NPadIdToIndex(vibration_device_handle.npad_id); |
| 828 | const auto device_index = static_cast<std::size_t>(vibration_device_handle.device_index); | 869 | const auto device_index = static_cast<std::size_t>(vibration_device_handle.device_index); |
| 829 | return vibration_devices_mounted[npad_index][device_index]; | 870 | return vibration_devices_mounted[npad_index][device_index]; |
diff --git a/src/core/hle/service/hid/controllers/npad.h b/src/core/hle/service/hid/controllers/npad.h index 96f319294..9fac00231 100644 --- a/src/core/hle/service/hid/controllers/npad.h +++ b/src/core/hle/service/hid/controllers/npad.h | |||
| @@ -56,12 +56,14 @@ public: | |||
| 56 | JoyconLeft = 6, | 56 | JoyconLeft = 6, |
| 57 | JoyconRight = 7, | 57 | JoyconRight = 7, |
| 58 | Pokeball = 9, | 58 | Pokeball = 9, |
| 59 | MaxNpadType = 10, | ||
| 59 | }; | 60 | }; |
| 60 | 61 | ||
| 61 | enum class DeviceIndex : u8 { | 62 | enum class DeviceIndex : u8 { |
| 62 | Left = 0, | 63 | Left = 0, |
| 63 | Right = 1, | 64 | Right = 1, |
| 64 | None = 2, | 65 | None = 2, |
| 66 | MaxDeviceIndex = 3, | ||
| 65 | }; | 67 | }; |
| 66 | 68 | ||
| 67 | enum class GyroscopeZeroDriftMode : u32 { | 69 | enum class GyroscopeZeroDriftMode : u32 { |
| @@ -213,6 +215,8 @@ public: | |||
| 213 | static Settings::ControllerType MapNPadToSettingsType(Controller_NPad::NPadControllerType type); | 215 | static Settings::ControllerType MapNPadToSettingsType(Controller_NPad::NPadControllerType type); |
| 214 | static std::size_t NPadIdToIndex(u32 npad_id); | 216 | static std::size_t NPadIdToIndex(u32 npad_id); |
| 215 | static u32 IndexToNPad(std::size_t index); | 217 | static u32 IndexToNPad(std::size_t index); |
| 218 | static bool IsNpadIdValid(u32 npad_id); | ||
| 219 | static bool IsDeviceHandleValid(const DeviceHandle& device_handle); | ||
| 216 | 220 | ||
| 217 | private: | 221 | private: |
| 218 | struct CommonHeader { | 222 | struct CommonHeader { |
diff --git a/src/core/hle/service/lm/lm.cpp b/src/core/hle/service/lm/lm.cpp index f884b2735..8e49b068c 100644 --- a/src/core/hle/service/lm/lm.cpp +++ b/src/core/hle/service/lm/lm.cpp | |||
| @@ -68,7 +68,7 @@ private: | |||
| 68 | IPC::RequestParser rp{ctx}; | 68 | IPC::RequestParser rp{ctx}; |
| 69 | const auto destination = rp.PopEnum<DestinationFlag>(); | 69 | const auto destination = rp.PopEnum<DestinationFlag>(); |
| 70 | 70 | ||
| 71 | LOG_DEBUG(Service_LM, "called, destination={:08X}", static_cast<u32>(destination)); | 71 | LOG_DEBUG(Service_LM, "called, destination={:08X}", destination); |
| 72 | 72 | ||
| 73 | manager.SetDestination(destination); | 73 | manager.SetDestination(destination); |
| 74 | 74 | ||
diff --git a/src/core/hle/service/ncm/ncm.cpp b/src/core/hle/service/ncm/ncm.cpp index b8d627ca8..2dcda16f6 100644 --- a/src/core/hle/service/ncm/ncm.cpp +++ b/src/core/hle/service/ncm/ncm.cpp | |||
| @@ -45,7 +45,7 @@ public: | |||
| 45 | } | 45 | } |
| 46 | 46 | ||
| 47 | private: | 47 | private: |
| 48 | FileSys::StorageId storage; | 48 | [[maybe_unused]] FileSys::StorageId storage; |
| 49 | }; | 49 | }; |
| 50 | 50 | ||
| 51 | class IRegisteredLocationResolver final : public ServiceFramework<IRegisteredLocationResolver> { | 51 | class IRegisteredLocationResolver final : public ServiceFramework<IRegisteredLocationResolver> { |
diff --git a/src/core/hle/service/nim/nim.cpp b/src/core/hle/service/nim/nim.cpp index d33b26129..d16223064 100644 --- a/src/core/hle/service/nim/nim.cpp +++ b/src/core/hle/service/nim/nim.cpp | |||
| @@ -217,7 +217,7 @@ public: | |||
| 217 | {1, nullptr, "RefreshDebugAvailability"}, | 217 | {1, nullptr, "RefreshDebugAvailability"}, |
| 218 | {2, nullptr, "ClearDebugResponse"}, | 218 | {2, nullptr, "ClearDebugResponse"}, |
| 219 | {3, nullptr, "RegisterDebugResponse"}, | 219 | {3, nullptr, "RegisterDebugResponse"}, |
| 220 | {4, nullptr, "IsLargeResourceAvailable"}, | 220 | {4, &NIM_ECA::IsLargeResourceAvailable, "IsLargeResourceAvailable"}, |
| 221 | }; | 221 | }; |
| 222 | // clang-format on | 222 | // clang-format on |
| 223 | 223 | ||
| @@ -231,6 +231,18 @@ private: | |||
| 231 | rb.Push(RESULT_SUCCESS); | 231 | rb.Push(RESULT_SUCCESS); |
| 232 | rb.PushIpcInterface<IShopServiceAccessServer>(system); | 232 | rb.PushIpcInterface<IShopServiceAccessServer>(system); |
| 233 | } | 233 | } |
| 234 | |||
| 235 | void IsLargeResourceAvailable(Kernel::HLERequestContext& ctx) { | ||
| 236 | IPC::RequestParser rp{ctx}; | ||
| 237 | |||
| 238 | const auto unknown{rp.Pop<u64>()}; | ||
| 239 | |||
| 240 | LOG_INFO(Service_NIM, "(STUBBED) called, unknown={}", unknown); | ||
| 241 | |||
| 242 | IPC::ResponseBuilder rb{ctx, 3}; | ||
| 243 | rb.Push(RESULT_SUCCESS); | ||
| 244 | rb.Push(false); | ||
| 245 | } | ||
| 234 | }; | 246 | }; |
| 235 | 247 | ||
| 236 | class NIM_SHP final : public ServiceFramework<NIM_SHP> { | 248 | class NIM_SHP final : public ServiceFramework<NIM_SHP> { |
diff --git a/src/core/hle/service/ns/pl_u.cpp b/src/core/hle/service/ns/pl_u.cpp index ccc137e40..c8a215845 100644 --- a/src/core/hle/service/ns/pl_u.cpp +++ b/src/core/hle/service/ns/pl_u.cpp | |||
| @@ -182,21 +182,18 @@ PL_U::PL_U(Core::System& system_) | |||
| 182 | } | 182 | } |
| 183 | 183 | ||
| 184 | if (!romfs) { | 184 | if (!romfs) { |
| 185 | LOG_ERROR(Service_NS, "Failed to find or synthesize {:016X}! Skipping", | 185 | LOG_ERROR(Service_NS, "Failed to find or synthesize {:016X}! Skipping", font.first); |
| 186 | static_cast<u64>(font.first)); | ||
| 187 | continue; | 186 | continue; |
| 188 | } | 187 | } |
| 189 | 188 | ||
| 190 | const auto extracted_romfs = FileSys::ExtractRomFS(romfs); | 189 | const auto extracted_romfs = FileSys::ExtractRomFS(romfs); |
| 191 | if (!extracted_romfs) { | 190 | if (!extracted_romfs) { |
| 192 | LOG_ERROR(Service_NS, "Failed to extract RomFS for {:016X}! Skipping", | 191 | LOG_ERROR(Service_NS, "Failed to extract RomFS for {:016X}! Skipping", font.first); |
| 193 | static_cast<u64>(font.first)); | ||
| 194 | continue; | 192 | continue; |
| 195 | } | 193 | } |
| 196 | const auto font_fp = extracted_romfs->GetFile(font.second); | 194 | const auto font_fp = extracted_romfs->GetFile(font.second); |
| 197 | if (!font_fp) { | 195 | if (!font_fp) { |
| 198 | LOG_ERROR(Service_NS, "{:016X} has no file \"{}\"! Skipping", | 196 | LOG_ERROR(Service_NS, "{:016X} has no file \"{}\"! Skipping", font.first, font.second); |
| 199 | static_cast<u64>(font.first), font.second); | ||
| 200 | continue; | 197 | continue; |
| 201 | } | 198 | } |
| 202 | std::vector<u32> font_data_u32(font_fp->GetSize() / sizeof(u32)); | 199 | std::vector<u32> font_data_u32(font_fp->GetSize() / sizeof(u32)); |
diff --git a/src/core/hle/service/nvdrv/devices/nvhost_nvdec_common.h b/src/core/hle/service/nvdrv/devices/nvhost_nvdec_common.h index ab152bf0e..d9f95ba58 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_nvdec_common.h +++ b/src/core/hle/service/nvdrv/devices/nvhost_nvdec_common.h | |||
| @@ -18,39 +18,6 @@ public: | |||
| 18 | explicit nvhost_nvdec_common(Core::System& system, std::shared_ptr<nvmap> nvmap_dev); | 18 | explicit nvhost_nvdec_common(Core::System& system, std::shared_ptr<nvmap> nvmap_dev); |
| 19 | ~nvhost_nvdec_common() override; | 19 | ~nvhost_nvdec_common() override; |
| 20 | 20 | ||
| 21 | /** | ||
| 22 | * Handles an ioctl1 request. | ||
| 23 | * @param command The ioctl command id. | ||
| 24 | * @param input A buffer containing the input data for the ioctl. | ||
| 25 | * @param output A buffer where the output data will be written to. | ||
| 26 | * @returns The result code of the ioctl. | ||
| 27 | */ | ||
| 28 | virtual NvResult Ioctl1(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output, | ||
| 29 | IoctlCtrl& ctrl) = 0; | ||
| 30 | |||
| 31 | /** | ||
| 32 | * Handles an ioctl2 request. | ||
| 33 | * @param command The ioctl command id. | ||
| 34 | * @param input A buffer containing the input data for the ioctl. | ||
| 35 | * @param inline_input A buffer containing the input data for the ioctl which has been inlined. | ||
| 36 | * @param output A buffer where the output data will be written to. | ||
| 37 | * @returns The result code of the ioctl. | ||
| 38 | */ | ||
| 39 | virtual NvResult Ioctl2(Ioctl command, const std::vector<u8>& input, | ||
| 40 | const std::vector<u8>& inline_input, std::vector<u8>& output, | ||
| 41 | IoctlCtrl& ctrl) = 0; | ||
| 42 | |||
| 43 | /** | ||
| 44 | * Handles an ioctl3 request. | ||
| 45 | * @param command The ioctl command id. | ||
| 46 | * @param input A buffer containing the input data for the ioctl. | ||
| 47 | * @param output A buffer where the output data will be written to. | ||
| 48 | * @param inline_output A buffer where the inlined output data will be written to. | ||
| 49 | * @returns The result code of the ioctl. | ||
| 50 | */ | ||
| 51 | virtual NvResult Ioctl3(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output, | ||
| 52 | std::vector<u8>& inline_output, IoctlCtrl& ctrl) = 0; | ||
| 53 | |||
| 54 | protected: | 21 | protected: |
| 55 | class BufferMap final { | 22 | class BufferMap final { |
| 56 | public: | 23 | public: |
diff --git a/src/core/hle/service/nvflinger/buffer_queue.cpp b/src/core/hle/service/nvflinger/buffer_queue.cpp index b89a2d41b..377f47e8e 100644 --- a/src/core/hle/service/nvflinger/buffer_queue.cpp +++ b/src/core/hle/service/nvflinger/buffer_queue.cpp | |||
| @@ -22,10 +22,11 @@ BufferQueue::BufferQueue(Kernel::KernelCore& kernel, u32 id, u64 layer_id) | |||
| 22 | BufferQueue::~BufferQueue() = default; | 22 | BufferQueue::~BufferQueue() = default; |
| 23 | 23 | ||
| 24 | void BufferQueue::SetPreallocatedBuffer(u32 slot, const IGBPBuffer& igbp_buffer) { | 24 | void BufferQueue::SetPreallocatedBuffer(u32 slot, const IGBPBuffer& igbp_buffer) { |
| 25 | ASSERT(slot < buffer_slots); | ||
| 25 | LOG_WARNING(Service, "Adding graphics buffer {}", slot); | 26 | LOG_WARNING(Service, "Adding graphics buffer {}", slot); |
| 26 | 27 | ||
| 27 | free_buffers.push_back(slot); | 28 | free_buffers.push_back(slot); |
| 28 | queue.push_back({ | 29 | buffers[slot] = { |
| 29 | .slot = slot, | 30 | .slot = slot, |
| 30 | .status = Buffer::Status::Free, | 31 | .status = Buffer::Status::Free, |
| 31 | .igbp_buffer = igbp_buffer, | 32 | .igbp_buffer = igbp_buffer, |
| @@ -33,7 +34,7 @@ void BufferQueue::SetPreallocatedBuffer(u32 slot, const IGBPBuffer& igbp_buffer) | |||
| 33 | .crop_rect = {}, | 34 | .crop_rect = {}, |
| 34 | .swap_interval = 0, | 35 | .swap_interval = 0, |
| 35 | .multi_fence = {}, | 36 | .multi_fence = {}, |
| 36 | }); | 37 | }; |
| 37 | 38 | ||
| 38 | buffer_wait_event.writable->Signal(); | 39 | buffer_wait_event.writable->Signal(); |
| 39 | } | 40 | } |
| @@ -44,73 +45,57 @@ std::optional<std::pair<u32, Service::Nvidia::MultiFence*>> BufferQueue::Dequeue | |||
| 44 | if (free_buffers.empty()) { | 45 | if (free_buffers.empty()) { |
| 45 | return std::nullopt; | 46 | return std::nullopt; |
| 46 | } | 47 | } |
| 47 | |||
| 48 | auto f_itr = free_buffers.begin(); | 48 | auto f_itr = free_buffers.begin(); |
| 49 | auto itr = queue.end(); | 49 | auto slot = buffers.size(); |
| 50 | 50 | ||
| 51 | while (f_itr != free_buffers.end()) { | 51 | while (f_itr != free_buffers.end()) { |
| 52 | auto slot = *f_itr; | 52 | const Buffer& buffer = buffers[*f_itr]; |
| 53 | itr = std::find_if(queue.begin(), queue.end(), [&](const Buffer& buffer) { | 53 | if (buffer.status == Buffer::Status::Free && buffer.igbp_buffer.width == width && |
| 54 | // Only consider free buffers. Buffers become free once again after they've been | 54 | buffer.igbp_buffer.height == height) { |
| 55 | // Acquired and Released by the compositor, see the NVFlinger::Compose method. | 55 | slot = *f_itr; |
| 56 | if (buffer.status != Buffer::Status::Free) { | ||
| 57 | return false; | ||
| 58 | } | ||
| 59 | |||
| 60 | if (buffer.slot != slot) { | ||
| 61 | return false; | ||
| 62 | } | ||
| 63 | |||
| 64 | // Make sure that the parameters match. | ||
| 65 | return buffer.igbp_buffer.width == width && buffer.igbp_buffer.height == height; | ||
| 66 | }); | ||
| 67 | |||
| 68 | if (itr != queue.end()) { | ||
| 69 | free_buffers.erase(f_itr); | 56 | free_buffers.erase(f_itr); |
| 70 | break; | 57 | break; |
| 71 | } | 58 | } |
| 72 | ++f_itr; | 59 | ++f_itr; |
| 73 | } | 60 | } |
| 74 | 61 | if (slot == buffers.size()) { | |
| 75 | if (itr == queue.end()) { | ||
| 76 | return std::nullopt; | 62 | return std::nullopt; |
| 77 | } | 63 | } |
| 78 | 64 | buffers[slot].status = Buffer::Status::Dequeued; | |
| 79 | itr->status = Buffer::Status::Dequeued; | 65 | return {{buffers[slot].slot, &buffers[slot].multi_fence}}; |
| 80 | return {{itr->slot, &itr->multi_fence}}; | ||
| 81 | } | 66 | } |
| 82 | 67 | ||
| 83 | const IGBPBuffer& BufferQueue::RequestBuffer(u32 slot) const { | 68 | const IGBPBuffer& BufferQueue::RequestBuffer(u32 slot) const { |
| 84 | auto itr = std::find_if(queue.begin(), queue.end(), | 69 | ASSERT(slot < buffers.size()); |
| 85 | [&](const Buffer& buffer) { return buffer.slot == slot; }); | 70 | ASSERT(buffers[slot].status == Buffer::Status::Dequeued); |
| 86 | ASSERT(itr != queue.end()); | 71 | ASSERT(buffers[slot].slot == slot); |
| 87 | ASSERT(itr->status == Buffer::Status::Dequeued); | 72 | |
| 88 | return itr->igbp_buffer; | 73 | return buffers[slot].igbp_buffer; |
| 89 | } | 74 | } |
| 90 | 75 | ||
| 91 | void BufferQueue::QueueBuffer(u32 slot, BufferTransformFlags transform, | 76 | void BufferQueue::QueueBuffer(u32 slot, BufferTransformFlags transform, |
| 92 | const Common::Rectangle<int>& crop_rect, u32 swap_interval, | 77 | const Common::Rectangle<int>& crop_rect, u32 swap_interval, |
| 93 | Service::Nvidia::MultiFence& multi_fence) { | 78 | Service::Nvidia::MultiFence& multi_fence) { |
| 94 | auto itr = std::find_if(queue.begin(), queue.end(), | 79 | ASSERT(slot < buffers.size()); |
| 95 | [&](const Buffer& buffer) { return buffer.slot == slot; }); | 80 | ASSERT(buffers[slot].status == Buffer::Status::Dequeued); |
| 96 | ASSERT(itr != queue.end()); | 81 | ASSERT(buffers[slot].slot == slot); |
| 97 | ASSERT(itr->status == Buffer::Status::Dequeued); | 82 | |
| 98 | itr->status = Buffer::Status::Queued; | 83 | buffers[slot].status = Buffer::Status::Queued; |
| 99 | itr->transform = transform; | 84 | buffers[slot].transform = transform; |
| 100 | itr->crop_rect = crop_rect; | 85 | buffers[slot].crop_rect = crop_rect; |
| 101 | itr->swap_interval = swap_interval; | 86 | buffers[slot].swap_interval = swap_interval; |
| 102 | itr->multi_fence = multi_fence; | 87 | buffers[slot].multi_fence = multi_fence; |
| 103 | queue_sequence.push_back(slot); | 88 | queue_sequence.push_back(slot); |
| 104 | } | 89 | } |
| 105 | 90 | ||
| 106 | void BufferQueue::CancelBuffer(u32 slot, const Service::Nvidia::MultiFence& multi_fence) { | 91 | void BufferQueue::CancelBuffer(u32 slot, const Service::Nvidia::MultiFence& multi_fence) { |
| 107 | const auto itr = std::find_if(queue.begin(), queue.end(), | 92 | ASSERT(slot < buffers.size()); |
| 108 | [slot](const Buffer& buffer) { return buffer.slot == slot; }); | 93 | ASSERT(buffers[slot].status != Buffer::Status::Free); |
| 109 | ASSERT(itr != queue.end()); | 94 | ASSERT(buffers[slot].slot == slot); |
| 110 | ASSERT(itr->status != Buffer::Status::Free); | 95 | |
| 111 | itr->status = Buffer::Status::Free; | 96 | buffers[slot].status = Buffer::Status::Free; |
| 112 | itr->multi_fence = multi_fence; | 97 | buffers[slot].multi_fence = multi_fence; |
| 113 | itr->swap_interval = 0; | 98 | buffers[slot].swap_interval = 0; |
| 114 | 99 | ||
| 115 | free_buffers.push_back(slot); | 100 | free_buffers.push_back(slot); |
| 116 | 101 | ||
| @@ -118,42 +103,43 @@ void BufferQueue::CancelBuffer(u32 slot, const Service::Nvidia::MultiFence& mult | |||
| 118 | } | 103 | } |
| 119 | 104 | ||
| 120 | std::optional<std::reference_wrapper<const BufferQueue::Buffer>> BufferQueue::AcquireBuffer() { | 105 | std::optional<std::reference_wrapper<const BufferQueue::Buffer>> BufferQueue::AcquireBuffer() { |
| 121 | auto itr = queue.end(); | 106 | std::size_t buffer_slot = buffers.size(); |
| 122 | // Iterate to find a queued buffer matching the requested slot. | 107 | // Iterate to find a queued buffer matching the requested slot. |
| 123 | while (itr == queue.end() && !queue_sequence.empty()) { | 108 | while (buffer_slot == buffers.size() && !queue_sequence.empty()) { |
| 124 | const u32 slot = queue_sequence.front(); | 109 | const auto slot = static_cast<std::size_t>(queue_sequence.front()); |
| 125 | itr = std::find_if(queue.begin(), queue.end(), [&slot](const Buffer& buffer) { | 110 | ASSERT(slot < buffers.size()); |
| 126 | return buffer.status == Buffer::Status::Queued && buffer.slot == slot; | 111 | if (buffers[slot].status == Buffer::Status::Queued) { |
| 127 | }); | 112 | ASSERT(buffers[slot].slot == slot); |
| 113 | buffer_slot = slot; | ||
| 114 | } | ||
| 128 | queue_sequence.pop_front(); | 115 | queue_sequence.pop_front(); |
| 129 | } | 116 | } |
| 130 | if (itr == queue.end()) { | 117 | if (buffer_slot == buffers.size()) { |
| 131 | return std::nullopt; | 118 | return std::nullopt; |
| 132 | } | 119 | } |
| 133 | itr->status = Buffer::Status::Acquired; | 120 | buffers[buffer_slot].status = Buffer::Status::Acquired; |
| 134 | return *itr; | 121 | return {{buffers[buffer_slot]}}; |
| 135 | } | 122 | } |
| 136 | 123 | ||
| 137 | void BufferQueue::ReleaseBuffer(u32 slot) { | 124 | void BufferQueue::ReleaseBuffer(u32 slot) { |
| 138 | auto itr = std::find_if(queue.begin(), queue.end(), | 125 | ASSERT(slot < buffers.size()); |
| 139 | [&](const Buffer& buffer) { return buffer.slot == slot; }); | 126 | ASSERT(buffers[slot].status == Buffer::Status::Acquired); |
| 140 | ASSERT(itr != queue.end()); | 127 | ASSERT(buffers[slot].slot == slot); |
| 141 | ASSERT(itr->status == Buffer::Status::Acquired); | 128 | |
| 142 | itr->status = Buffer::Status::Free; | 129 | buffers[slot].status = Buffer::Status::Free; |
| 143 | free_buffers.push_back(slot); | 130 | free_buffers.push_back(slot); |
| 144 | 131 | ||
| 145 | buffer_wait_event.writable->Signal(); | 132 | buffer_wait_event.writable->Signal(); |
| 146 | } | 133 | } |
| 147 | 134 | ||
| 148 | void BufferQueue::Disconnect() { | 135 | void BufferQueue::Disconnect() { |
| 149 | queue.clear(); | 136 | buffers.fill({}); |
| 150 | queue_sequence.clear(); | 137 | queue_sequence.clear(); |
| 151 | id = 1; | 138 | buffer_wait_event.writable->Signal(); |
| 152 | layer_id = 1; | ||
| 153 | } | 139 | } |
| 154 | 140 | ||
| 155 | u32 BufferQueue::Query(QueryType type) { | 141 | u32 BufferQueue::Query(QueryType type) { |
| 156 | LOG_WARNING(Service, "(STUBBED) called type={}", static_cast<u32>(type)); | 142 | LOG_WARNING(Service, "(STUBBED) called type={}", type); |
| 157 | 143 | ||
| 158 | switch (type) { | 144 | switch (type) { |
| 159 | case QueryType::NativeWindowFormat: | 145 | case QueryType::NativeWindowFormat: |
diff --git a/src/core/hle/service/nvflinger/buffer_queue.h b/src/core/hle/service/nvflinger/buffer_queue.h index e7517c7e1..e610923cb 100644 --- a/src/core/hle/service/nvflinger/buffer_queue.h +++ b/src/core/hle/service/nvflinger/buffer_queue.h | |||
| @@ -21,6 +21,7 @@ class KernelCore; | |||
| 21 | 21 | ||
| 22 | namespace Service::NVFlinger { | 22 | namespace Service::NVFlinger { |
| 23 | 23 | ||
| 24 | constexpr u32 buffer_slots = 0x40; | ||
| 24 | struct IGBPBuffer { | 25 | struct IGBPBuffer { |
| 25 | u32_le magic; | 26 | u32_le magic; |
| 26 | u32_le width; | 27 | u32_le width; |
| @@ -114,7 +115,7 @@ private: | |||
| 114 | u64 layer_id; | 115 | u64 layer_id; |
| 115 | 116 | ||
| 116 | std::list<u32> free_buffers; | 117 | std::list<u32> free_buffers; |
| 117 | std::vector<Buffer> queue; | 118 | std::array<Buffer, buffer_slots> buffers; |
| 118 | std::list<u32> queue_sequence; | 119 | std::list<u32> queue_sequence; |
| 119 | Kernel::EventPair buffer_wait_event; | 120 | Kernel::EventPair buffer_wait_event; |
| 120 | }; | 121 | }; |
diff --git a/src/core/hle/service/prepo/prepo.cpp b/src/core/hle/service/prepo/prepo.cpp index 392fda73e..b417624c9 100644 --- a/src/core/hle/service/prepo/prepo.cpp +++ b/src/core/hle/service/prepo/prepo.cpp | |||
| @@ -65,7 +65,7 @@ private: | |||
| 65 | } | 65 | } |
| 66 | 66 | ||
| 67 | LOG_DEBUG(Service_PREPO, "called, type={:02X}, process_id={:016X}, data1_size={:016X}", | 67 | LOG_DEBUG(Service_PREPO, "called, type={:02X}, process_id={:016X}, data1_size={:016X}", |
| 68 | static_cast<u8>(Type), process_id, data[0].size()); | 68 | Type, process_id, data[0].size()); |
| 69 | 69 | ||
| 70 | const auto& reporter{system.GetReporter()}; | 70 | const auto& reporter{system.GetReporter()}; |
| 71 | reporter.SavePlayReport(Type, system.CurrentProcess()->GetTitleID(), data, process_id); | 71 | reporter.SavePlayReport(Type, system.CurrentProcess()->GetTitleID(), data, process_id); |
| @@ -92,7 +92,7 @@ private: | |||
| 92 | LOG_DEBUG( | 92 | LOG_DEBUG( |
| 93 | Service_PREPO, | 93 | Service_PREPO, |
| 94 | "called, type={:02X}, user_id={:016X}{:016X}, process_id={:016X}, data1_size={:016X}", | 94 | "called, type={:02X}, user_id={:016X}{:016X}, process_id={:016X}, data1_size={:016X}", |
| 95 | static_cast<u8>(Type), user_id[1], user_id[0], process_id, data[0].size()); | 95 | Type, user_id[1], user_id[0], process_id, data[0].size()); |
| 96 | 96 | ||
| 97 | const auto& reporter{system.GetReporter()}; | 97 | const auto& reporter{system.GetReporter()}; |
| 98 | reporter.SavePlayReport(Type, system.CurrentProcess()->GetTitleID(), data, process_id, | 98 | reporter.SavePlayReport(Type, system.CurrentProcess()->GetTitleID(), data, process_id, |
diff --git a/src/core/hle/service/service.cpp b/src/core/hle/service/service.cpp index 360e0bf37..abf3d1ea3 100644 --- a/src/core/hle/service/service.cpp +++ b/src/core/hle/service/service.cpp | |||
| @@ -181,7 +181,7 @@ ResultCode ServiceFrameworkBase::HandleSyncRequest(Kernel::HLERequestContext& co | |||
| 181 | break; | 181 | break; |
| 182 | } | 182 | } |
| 183 | default: | 183 | default: |
| 184 | UNIMPLEMENTED_MSG("command_type={}", static_cast<int>(context.GetCommandType())); | 184 | UNIMPLEMENTED_MSG("command_type={}", context.GetCommandType()); |
| 185 | } | 185 | } |
| 186 | 186 | ||
| 187 | context.WriteToOutgoingCommandBuffer(context.GetThread()); | 187 | context.WriteToOutgoingCommandBuffer(context.GetThread()); |
diff --git a/src/core/hle/service/set/set_sys.cpp b/src/core/hle/service/set/set_sys.cpp index 19b8f113d..b58b2c8c5 100644 --- a/src/core/hle/service/set/set_sys.cpp +++ b/src/core/hle/service/set/set_sys.cpp | |||
| @@ -34,9 +34,9 @@ void GetFirmwareVersionImpl(Kernel::HLERequestContext& ctx, GetFirmwareVersionTy | |||
| 34 | // consistence (currently reports as 5.1.0-0.0) | 34 | // consistence (currently reports as 5.1.0-0.0) |
| 35 | const auto archive = FileSys::SystemArchive::SystemVersion(); | 35 | const auto archive = FileSys::SystemArchive::SystemVersion(); |
| 36 | 36 | ||
| 37 | const auto early_exit_failure = [&ctx](const std::string& desc, ResultCode code) { | 37 | const auto early_exit_failure = [&ctx](std::string_view desc, ResultCode code) { |
| 38 | LOG_ERROR(Service_SET, "General failure while attempting to resolve firmware version ({}).", | 38 | LOG_ERROR(Service_SET, "General failure while attempting to resolve firmware version ({}).", |
| 39 | desc.c_str()); | 39 | desc); |
| 40 | IPC::ResponseBuilder rb{ctx, 2}; | 40 | IPC::ResponseBuilder rb{ctx, 2}; |
| 41 | rb.Push(code); | 41 | rb.Push(code); |
| 42 | }; | 42 | }; |
diff --git a/src/core/hle/service/sockets/bsd.cpp b/src/core/hle/service/sockets/bsd.cpp index a9875b9a6..67b419503 100644 --- a/src/core/hle/service/sockets/bsd.cpp +++ b/src/core/hle/service/sockets/bsd.cpp | |||
| @@ -30,7 +30,7 @@ bool IsConnectionBased(Type type) { | |||
| 30 | case Type::DGRAM: | 30 | case Type::DGRAM: |
| 31 | return false; | 31 | return false; |
| 32 | default: | 32 | default: |
| 33 | UNIMPLEMENTED_MSG("Unimplemented type={}", static_cast<int>(type)); | 33 | UNIMPLEMENTED_MSG("Unimplemented type={}", type); |
| 34 | return false; | 34 | return false; |
| 35 | } | 35 | } |
| 36 | } | 36 | } |
| @@ -489,18 +489,18 @@ std::pair<s32, Errno> BSD::PollImpl(std::vector<u8>& write_buffer, std::vector<u | |||
| 489 | } | 489 | } |
| 490 | 490 | ||
| 491 | for (PollFD& pollfd : fds) { | 491 | for (PollFD& pollfd : fds) { |
| 492 | ASSERT(pollfd.revents == 0); | 492 | ASSERT(False(pollfd.revents)); |
| 493 | 493 | ||
| 494 | if (pollfd.fd > static_cast<s32>(MAX_FD) || pollfd.fd < 0) { | 494 | if (pollfd.fd > static_cast<s32>(MAX_FD) || pollfd.fd < 0) { |
| 495 | LOG_ERROR(Service, "File descriptor handle={} is invalid", pollfd.fd); | 495 | LOG_ERROR(Service, "File descriptor handle={} is invalid", pollfd.fd); |
| 496 | pollfd.revents = 0; | 496 | pollfd.revents = PollEvents{}; |
| 497 | return {0, Errno::SUCCESS}; | 497 | return {0, Errno::SUCCESS}; |
| 498 | } | 498 | } |
| 499 | 499 | ||
| 500 | const std::optional<FileDescriptor>& descriptor = file_descriptors[pollfd.fd]; | 500 | const std::optional<FileDescriptor>& descriptor = file_descriptors[pollfd.fd]; |
| 501 | if (!descriptor) { | 501 | if (!descriptor) { |
| 502 | LOG_ERROR(Service, "File descriptor handle={} is not allocated", pollfd.fd); | 502 | LOG_ERROR(Service, "File descriptor handle={} is not allocated", pollfd.fd); |
| 503 | pollfd.revents = POLL_NVAL; | 503 | pollfd.revents = PollEvents::Nval; |
| 504 | return {0, Errno::SUCCESS}; | 504 | return {0, Errno::SUCCESS}; |
| 505 | } | 505 | } |
| 506 | } | 506 | } |
| @@ -510,7 +510,7 @@ std::pair<s32, Errno> BSD::PollImpl(std::vector<u8>& write_buffer, std::vector<u | |||
| 510 | Network::PollFD result; | 510 | Network::PollFD result; |
| 511 | result.socket = file_descriptors[pollfd.fd]->socket.get(); | 511 | result.socket = file_descriptors[pollfd.fd]->socket.get(); |
| 512 | result.events = TranslatePollEventsToHost(pollfd.events); | 512 | result.events = TranslatePollEventsToHost(pollfd.events); |
| 513 | result.revents = 0; | 513 | result.revents = Network::PollEvents{}; |
| 514 | return result; | 514 | return result; |
| 515 | }); | 515 | }); |
| 516 | 516 | ||
| @@ -636,7 +636,7 @@ std::pair<s32, Errno> BSD::FcntlImpl(s32 fd, FcntlCmd cmd, s32 arg) { | |||
| 636 | return {0, Errno::SUCCESS}; | 636 | return {0, Errno::SUCCESS}; |
| 637 | } | 637 | } |
| 638 | default: | 638 | default: |
| 639 | UNIMPLEMENTED_MSG("Unimplemented cmd={}", static_cast<int>(cmd)); | 639 | UNIMPLEMENTED_MSG("Unimplemented cmd={}", cmd); |
| 640 | return {-1, Errno::SUCCESS}; | 640 | return {-1, Errno::SUCCESS}; |
| 641 | } | 641 | } |
| 642 | } | 642 | } |
| @@ -679,7 +679,7 @@ Errno BSD::SetSockOptImpl(s32 fd, u32 level, OptName optname, size_t optlen, con | |||
| 679 | case OptName::RCVTIMEO: | 679 | case OptName::RCVTIMEO: |
| 680 | return Translate(socket->SetRcvTimeo(value)); | 680 | return Translate(socket->SetRcvTimeo(value)); |
| 681 | default: | 681 | default: |
| 682 | UNIMPLEMENTED_MSG("Unimplemented optname={}", static_cast<int>(optname)); | 682 | UNIMPLEMENTED_MSG("Unimplemented optname={}", optname); |
| 683 | return Errno::SUCCESS; | 683 | return Errno::SUCCESS; |
| 684 | } | 684 | } |
| 685 | } | 685 | } |
diff --git a/src/core/hle/service/sockets/sockets.h b/src/core/hle/service/sockets/sockets.h index 89a410076..5a65ed2a9 100644 --- a/src/core/hle/service/sockets/sockets.h +++ b/src/core/hle/service/sockets/sockets.h | |||
| @@ -69,10 +69,22 @@ struct SockAddrIn { | |||
| 69 | std::array<u8, 8> zeroes; | 69 | std::array<u8, 8> zeroes; |
| 70 | }; | 70 | }; |
| 71 | 71 | ||
| 72 | enum class PollEvents : u16 { | ||
| 73 | // Using Pascal case because IN is a macro on Windows. | ||
| 74 | In = 1 << 0, | ||
| 75 | Pri = 1 << 1, | ||
| 76 | Out = 1 << 2, | ||
| 77 | Err = 1 << 3, | ||
| 78 | Hup = 1 << 4, | ||
| 79 | Nval = 1 << 5, | ||
| 80 | }; | ||
| 81 | |||
| 82 | DECLARE_ENUM_FLAG_OPERATORS(PollEvents); | ||
| 83 | |||
| 72 | struct PollFD { | 84 | struct PollFD { |
| 73 | s32 fd; | 85 | s32 fd; |
| 74 | u16 events; | 86 | PollEvents events; |
| 75 | u16 revents; | 87 | PollEvents revents; |
| 76 | }; | 88 | }; |
| 77 | 89 | ||
| 78 | struct Linger { | 90 | struct Linger { |
| @@ -80,13 +92,6 @@ struct Linger { | |||
| 80 | u32 linger; | 92 | u32 linger; |
| 81 | }; | 93 | }; |
| 82 | 94 | ||
| 83 | constexpr u16 POLL_IN = 0x01; | ||
| 84 | constexpr u16 POLL_PRI = 0x02; | ||
| 85 | constexpr u16 POLL_OUT = 0x04; | ||
| 86 | constexpr u16 POLL_ERR = 0x08; | ||
| 87 | constexpr u16 POLL_HUP = 0x10; | ||
| 88 | constexpr u16 POLL_NVAL = 0x20; | ||
| 89 | |||
| 90 | constexpr u32 FLAG_MSG_DONTWAIT = 0x80; | 95 | constexpr u32 FLAG_MSG_DONTWAIT = 0x80; |
| 91 | 96 | ||
| 92 | constexpr u32 FLAG_O_NONBLOCK = 0x800; | 97 | constexpr u32 FLAG_O_NONBLOCK = 0x800; |
diff --git a/src/core/hle/service/sockets/sockets_translate.cpp b/src/core/hle/service/sockets/sockets_translate.cpp index 2e626fd86..c822d21b8 100644 --- a/src/core/hle/service/sockets/sockets_translate.cpp +++ b/src/core/hle/service/sockets/sockets_translate.cpp | |||
| @@ -27,7 +27,7 @@ Errno Translate(Network::Errno value) { | |||
| 27 | case Network::Errno::NOTCONN: | 27 | case Network::Errno::NOTCONN: |
| 28 | return Errno::NOTCONN; | 28 | return Errno::NOTCONN; |
| 29 | default: | 29 | default: |
| 30 | UNIMPLEMENTED_MSG("Unimplemented errno={}", static_cast<int>(value)); | 30 | UNIMPLEMENTED_MSG("Unimplemented errno={}", value); |
| 31 | return Errno::SUCCESS; | 31 | return Errno::SUCCESS; |
| 32 | } | 32 | } |
| 33 | } | 33 | } |
| @@ -41,7 +41,7 @@ Network::Domain Translate(Domain domain) { | |||
| 41 | case Domain::INET: | 41 | case Domain::INET: |
| 42 | return Network::Domain::INET; | 42 | return Network::Domain::INET; |
| 43 | default: | 43 | default: |
| 44 | UNIMPLEMENTED_MSG("Unimplemented domain={}", static_cast<int>(domain)); | 44 | UNIMPLEMENTED_MSG("Unimplemented domain={}", domain); |
| 45 | return {}; | 45 | return {}; |
| 46 | } | 46 | } |
| 47 | } | 47 | } |
| @@ -51,7 +51,7 @@ Domain Translate(Network::Domain domain) { | |||
| 51 | case Network::Domain::INET: | 51 | case Network::Domain::INET: |
| 52 | return Domain::INET; | 52 | return Domain::INET; |
| 53 | default: | 53 | default: |
| 54 | UNIMPLEMENTED_MSG("Unimplemented domain={}", static_cast<int>(domain)); | 54 | UNIMPLEMENTED_MSG("Unimplemented domain={}", domain); |
| 55 | return {}; | 55 | return {}; |
| 56 | } | 56 | } |
| 57 | } | 57 | } |
| @@ -63,7 +63,7 @@ Network::Type Translate(Type type) { | |||
| 63 | case Type::DGRAM: | 63 | case Type::DGRAM: |
| 64 | return Network::Type::DGRAM; | 64 | return Network::Type::DGRAM; |
| 65 | default: | 65 | default: |
| 66 | UNIMPLEMENTED_MSG("Unimplemented type={}", static_cast<int>(type)); | 66 | UNIMPLEMENTED_MSG("Unimplemented type={}", type); |
| 67 | } | 67 | } |
| 68 | } | 68 | } |
| 69 | 69 | ||
| @@ -84,48 +84,48 @@ Network::Protocol Translate(Type type, Protocol protocol) { | |||
| 84 | case Protocol::UDP: | 84 | case Protocol::UDP: |
| 85 | return Network::Protocol::UDP; | 85 | return Network::Protocol::UDP; |
| 86 | default: | 86 | default: |
| 87 | UNIMPLEMENTED_MSG("Unimplemented protocol={}", static_cast<int>(protocol)); | 87 | UNIMPLEMENTED_MSG("Unimplemented protocol={}", protocol); |
| 88 | return Network::Protocol::TCP; | 88 | return Network::Protocol::TCP; |
| 89 | } | 89 | } |
| 90 | } | 90 | } |
| 91 | 91 | ||
| 92 | u16 TranslatePollEventsToHost(u32 flags) { | 92 | Network::PollEvents TranslatePollEventsToHost(PollEvents flags) { |
| 93 | u32 result = 0; | 93 | Network::PollEvents result{}; |
| 94 | const auto translate = [&result, &flags](u32 from, u32 to) { | 94 | const auto translate = [&result, &flags](PollEvents from, Network::PollEvents to) { |
| 95 | if ((flags & from) != 0) { | 95 | if (True(flags & from)) { |
| 96 | flags &= ~from; | 96 | flags &= ~from; |
| 97 | result |= to; | 97 | result |= to; |
| 98 | } | 98 | } |
| 99 | }; | 99 | }; |
| 100 | translate(POLL_IN, Network::POLL_IN); | 100 | translate(PollEvents::In, Network::PollEvents::In); |
| 101 | translate(POLL_PRI, Network::POLL_PRI); | 101 | translate(PollEvents::Pri, Network::PollEvents::Pri); |
| 102 | translate(POLL_OUT, Network::POLL_OUT); | 102 | translate(PollEvents::Out, Network::PollEvents::Out); |
| 103 | translate(POLL_ERR, Network::POLL_ERR); | 103 | translate(PollEvents::Err, Network::PollEvents::Err); |
| 104 | translate(POLL_HUP, Network::POLL_HUP); | 104 | translate(PollEvents::Hup, Network::PollEvents::Hup); |
| 105 | translate(POLL_NVAL, Network::POLL_NVAL); | 105 | translate(PollEvents::Nval, Network::PollEvents::Nval); |
| 106 | 106 | ||
| 107 | UNIMPLEMENTED_IF_MSG(flags != 0, "Unimplemented flags={}", flags); | 107 | UNIMPLEMENTED_IF_MSG((u16)flags != 0, "Unimplemented flags={}", (u16)flags); |
| 108 | return static_cast<u16>(result); | 108 | return result; |
| 109 | } | 109 | } |
| 110 | 110 | ||
| 111 | u16 TranslatePollEventsToGuest(u32 flags) { | 111 | PollEvents TranslatePollEventsToGuest(Network::PollEvents flags) { |
| 112 | u32 result = 0; | 112 | PollEvents result{}; |
| 113 | const auto translate = [&result, &flags](u32 from, u32 to) { | 113 | const auto translate = [&result, &flags](Network::PollEvents from, PollEvents to) { |
| 114 | if ((flags & from) != 0) { | 114 | if (True(flags & from)) { |
| 115 | flags &= ~from; | 115 | flags &= ~from; |
| 116 | result |= to; | 116 | result |= to; |
| 117 | } | 117 | } |
| 118 | }; | 118 | }; |
| 119 | 119 | ||
| 120 | translate(Network::POLL_IN, POLL_IN); | 120 | translate(Network::PollEvents::In, PollEvents::In); |
| 121 | translate(Network::POLL_PRI, POLL_PRI); | 121 | translate(Network::PollEvents::Pri, PollEvents::Pri); |
| 122 | translate(Network::POLL_OUT, POLL_OUT); | 122 | translate(Network::PollEvents::Out, PollEvents::Out); |
| 123 | translate(Network::POLL_ERR, POLL_ERR); | 123 | translate(Network::PollEvents::Err, PollEvents::Err); |
| 124 | translate(Network::POLL_HUP, POLL_HUP); | 124 | translate(Network::PollEvents::Hup, PollEvents::Hup); |
| 125 | translate(Network::POLL_NVAL, POLL_NVAL); | 125 | translate(Network::PollEvents::Nval, PollEvents::Nval); |
| 126 | 126 | ||
| 127 | UNIMPLEMENTED_IF_MSG(flags != 0, "Unimplemented flags={}", flags); | 127 | UNIMPLEMENTED_IF_MSG((u16)flags != 0, "Unimplemented flags={}", (u16)flags); |
| 128 | return static_cast<u16>(result); | 128 | return result; |
| 129 | } | 129 | } |
| 130 | 130 | ||
| 131 | Network::SockAddrIn Translate(SockAddrIn value) { | 131 | Network::SockAddrIn Translate(SockAddrIn value) { |
| @@ -157,7 +157,7 @@ Network::ShutdownHow Translate(ShutdownHow how) { | |||
| 157 | case ShutdownHow::RDWR: | 157 | case ShutdownHow::RDWR: |
| 158 | return Network::ShutdownHow::RDWR; | 158 | return Network::ShutdownHow::RDWR; |
| 159 | default: | 159 | default: |
| 160 | UNIMPLEMENTED_MSG("Unimplemented how={}", static_cast<int>(how)); | 160 | UNIMPLEMENTED_MSG("Unimplemented how={}", how); |
| 161 | return {}; | 161 | return {}; |
| 162 | } | 162 | } |
| 163 | } | 163 | } |
diff --git a/src/core/hle/service/sockets/sockets_translate.h b/src/core/hle/service/sockets/sockets_translate.h index e498913d4..057d1ff22 100644 --- a/src/core/hle/service/sockets/sockets_translate.h +++ b/src/core/hle/service/sockets/sockets_translate.h | |||
| @@ -31,10 +31,10 @@ Network::Type Translate(Type type); | |||
| 31 | Network::Protocol Translate(Type type, Protocol protocol); | 31 | Network::Protocol Translate(Type type, Protocol protocol); |
| 32 | 32 | ||
| 33 | /// Translate abstract poll event flags to guest poll event flags | 33 | /// Translate abstract poll event flags to guest poll event flags |
| 34 | u16 TranslatePollEventsToHost(u32 flags); | 34 | Network::PollEvents TranslatePollEventsToHost(PollEvents flags); |
| 35 | 35 | ||
| 36 | /// Translate guest poll event flags to abstract poll event flags | 36 | /// Translate guest poll event flags to abstract poll event flags |
| 37 | u16 TranslatePollEventsToGuest(u32 flags); | 37 | PollEvents TranslatePollEventsToGuest(Network::PollEvents flags); |
| 38 | 38 | ||
| 39 | /// Translate guest socket address structure to abstract socket address structure | 39 | /// Translate guest socket address structure to abstract socket address structure |
| 40 | Network::SockAddrIn Translate(SockAddrIn value); | 40 | Network::SockAddrIn Translate(SockAddrIn value); |
diff --git a/src/core/hle/service/vi/vi.cpp b/src/core/hle/service/vi/vi.cpp index af5b8b0b9..45cfffe06 100644 --- a/src/core/hle/service/vi/vi.cpp +++ b/src/core/hle/service/vi/vi.cpp | |||
| @@ -282,18 +282,24 @@ public: | |||
| 282 | void DeserializeData() override { | 282 | void DeserializeData() override { |
| 283 | [[maybe_unused]] const std::u16string token = ReadInterfaceToken(); | 283 | [[maybe_unused]] const std::u16string token = ReadInterfaceToken(); |
| 284 | data = Read<Data>(); | 284 | data = Read<Data>(); |
| 285 | buffer = Read<NVFlinger::IGBPBuffer>(); | 285 | if (data.contains_object != 0) { |
| 286 | buffer_container = Read<BufferContainer>(); | ||
| 287 | } | ||
| 286 | } | 288 | } |
| 287 | 289 | ||
| 288 | struct Data { | 290 | struct Data { |
| 289 | u32_le slot; | 291 | u32_le slot; |
| 290 | INSERT_PADDING_WORDS(1); | 292 | u32_le contains_object; |
| 293 | }; | ||
| 294 | |||
| 295 | struct BufferContainer { | ||
| 291 | u32_le graphic_buffer_length; | 296 | u32_le graphic_buffer_length; |
| 292 | INSERT_PADDING_WORDS(1); | 297 | INSERT_PADDING_WORDS(1); |
| 298 | NVFlinger::IGBPBuffer buffer{}; | ||
| 293 | }; | 299 | }; |
| 294 | 300 | ||
| 295 | Data data; | 301 | Data data{}; |
| 296 | NVFlinger::IGBPBuffer buffer; | 302 | BufferContainer buffer_container{}; |
| 297 | }; | 303 | }; |
| 298 | 304 | ||
| 299 | class IGBPSetPreallocatedBufferResponseParcel : public Parcel { | 305 | class IGBPSetPreallocatedBufferResponseParcel : public Parcel { |
| @@ -528,7 +534,7 @@ private: | |||
| 528 | const u32 flags = rp.Pop<u32>(); | 534 | const u32 flags = rp.Pop<u32>(); |
| 529 | 535 | ||
| 530 | LOG_DEBUG(Service_VI, "called. id=0x{:08X} transaction={:X}, flags=0x{:08X}", id, | 536 | LOG_DEBUG(Service_VI, "called. id=0x{:08X} transaction={:X}, flags=0x{:08X}", id, |
| 531 | static_cast<u32>(transaction), flags); | 537 | transaction, flags); |
| 532 | 538 | ||
| 533 | const auto guard = nv_flinger.Lock(); | 539 | const auto guard = nv_flinger.Lock(); |
| 534 | auto& buffer_queue = nv_flinger.FindBufferQueue(id); | 540 | auto& buffer_queue = nv_flinger.FindBufferQueue(id); |
| @@ -547,7 +553,7 @@ private: | |||
| 547 | case TransactionId::SetPreallocatedBuffer: { | 553 | case TransactionId::SetPreallocatedBuffer: { |
| 548 | IGBPSetPreallocatedBufferRequestParcel request{ctx.ReadBuffer()}; | 554 | IGBPSetPreallocatedBufferRequestParcel request{ctx.ReadBuffer()}; |
| 549 | 555 | ||
| 550 | buffer_queue.SetPreallocatedBuffer(request.data.slot, request.buffer); | 556 | buffer_queue.SetPreallocatedBuffer(request.data.slot, request.buffer_container.buffer); |
| 551 | 557 | ||
| 552 | IGBPSetPreallocatedBufferResponseParcel response{}; | 558 | IGBPSetPreallocatedBufferResponseParcel response{}; |
| 553 | ctx.WriteBuffer(response.Serialize()); | 559 | ctx.WriteBuffer(response.Serialize()); |
| @@ -1066,8 +1072,8 @@ private: | |||
| 1066 | const auto scaling_mode = rp.PopEnum<NintendoScaleMode>(); | 1072 | const auto scaling_mode = rp.PopEnum<NintendoScaleMode>(); |
| 1067 | const u64 unknown = rp.Pop<u64>(); | 1073 | const u64 unknown = rp.Pop<u64>(); |
| 1068 | 1074 | ||
| 1069 | LOG_DEBUG(Service_VI, "called. scaling_mode=0x{:08X}, unknown=0x{:016X}", | 1075 | LOG_DEBUG(Service_VI, "called. scaling_mode=0x{:08X}, unknown=0x{:016X}", scaling_mode, |
| 1070 | static_cast<u32>(scaling_mode), unknown); | 1076 | unknown); |
| 1071 | 1077 | ||
| 1072 | IPC::ResponseBuilder rb{ctx, 2}; | 1078 | IPC::ResponseBuilder rb{ctx, 2}; |
| 1073 | 1079 | ||
| @@ -1210,7 +1216,7 @@ private: | |||
| 1210 | void ConvertScalingMode(Kernel::HLERequestContext& ctx) { | 1216 | void ConvertScalingMode(Kernel::HLERequestContext& ctx) { |
| 1211 | IPC::RequestParser rp{ctx}; | 1217 | IPC::RequestParser rp{ctx}; |
| 1212 | const auto mode = rp.PopEnum<NintendoScaleMode>(); | 1218 | const auto mode = rp.PopEnum<NintendoScaleMode>(); |
| 1213 | LOG_DEBUG(Service_VI, "called mode={}", static_cast<u32>(mode)); | 1219 | LOG_DEBUG(Service_VI, "called mode={}", mode); |
| 1214 | 1220 | ||
| 1215 | const auto converted_mode = ConvertScalingModeImpl(mode); | 1221 | const auto converted_mode = ConvertScalingModeImpl(mode); |
| 1216 | 1222 | ||
| @@ -1230,8 +1236,8 @@ private: | |||
| 1230 | const auto height = rp.Pop<u64>(); | 1236 | const auto height = rp.Pop<u64>(); |
| 1231 | LOG_DEBUG(Service_VI, "called width={}, height={}", width, height); | 1237 | LOG_DEBUG(Service_VI, "called width={}, height={}", width, height); |
| 1232 | 1238 | ||
| 1233 | constexpr std::size_t base_size = 0x20000; | 1239 | constexpr u64 base_size = 0x20000; |
| 1234 | constexpr std::size_t alignment = 0x1000; | 1240 | constexpr u64 alignment = 0x1000; |
| 1235 | const auto texture_size = width * height * 4; | 1241 | const auto texture_size = width * height * 4; |
| 1236 | const auto out_size = (texture_size + base_size - 1) / base_size * base_size; | 1242 | const auto out_size = (texture_size + base_size - 1) / base_size * base_size; |
| 1237 | 1243 | ||
| @@ -1311,7 +1317,7 @@ void detail::GetDisplayServiceImpl(Kernel::HLERequestContext& ctx, Core::System& | |||
| 1311 | const auto policy = rp.PopEnum<Policy>(); | 1317 | const auto policy = rp.PopEnum<Policy>(); |
| 1312 | 1318 | ||
| 1313 | if (!IsValidServiceAccess(permission, policy)) { | 1319 | if (!IsValidServiceAccess(permission, policy)) { |
| 1314 | LOG_ERROR(Service_VI, "Permission denied for policy {}", static_cast<u32>(policy)); | 1320 | LOG_ERROR(Service_VI, "Permission denied for policy {}", policy); |
| 1315 | IPC::ResponseBuilder rb{ctx, 2}; | 1321 | IPC::ResponseBuilder rb{ctx, 2}; |
| 1316 | rb.Push(ERR_PERMISSION_DENIED); | 1322 | rb.Push(ERR_PERMISSION_DENIED); |
| 1317 | return; | 1323 | return; |
diff --git a/src/core/loader/deconstructed_rom_directory.h b/src/core/loader/deconstructed_rom_directory.h index 35d340317..3c968580f 100644 --- a/src/core/loader/deconstructed_rom_directory.h +++ b/src/core/loader/deconstructed_rom_directory.h | |||
| @@ -32,7 +32,7 @@ public: | |||
| 32 | 32 | ||
| 33 | /** | 33 | /** |
| 34 | * Returns the type of the file | 34 | * Returns the type of the file |
| 35 | * @param file std::shared_ptr<VfsFile> open file | 35 | * @param file open file |
| 36 | * @return FileType found, or FileType::Error if this loader doesn't know it | 36 | * @return FileType found, or FileType::Error if this loader doesn't know it |
| 37 | */ | 37 | */ |
| 38 | static FileType IdentifyType(const FileSys::VirtualFile& file); | 38 | static FileType IdentifyType(const FileSys::VirtualFile& file); |
diff --git a/src/core/loader/elf.h b/src/core/loader/elf.h index 3527933ad..2067932c7 100644 --- a/src/core/loader/elf.h +++ b/src/core/loader/elf.h | |||
| @@ -21,7 +21,7 @@ public: | |||
| 21 | 21 | ||
| 22 | /** | 22 | /** |
| 23 | * Returns the type of the file | 23 | * Returns the type of the file |
| 24 | * @param file std::shared_ptr<VfsFile> open file | 24 | * @param file open file |
| 25 | * @return FileType found, or FileType::Error if this loader doesn't know it | 25 | * @return FileType found, or FileType::Error if this loader doesn't know it |
| 26 | */ | 26 | */ |
| 27 | static FileType IdentifyType(const FileSys::VirtualFile& file); | 27 | static FileType IdentifyType(const FileSys::VirtualFile& file); |
diff --git a/src/core/loader/kip.h b/src/core/loader/kip.h index dee05a7b5..14a85e295 100644 --- a/src/core/loader/kip.h +++ b/src/core/loader/kip.h | |||
| @@ -23,7 +23,7 @@ public: | |||
| 23 | 23 | ||
| 24 | /** | 24 | /** |
| 25 | * Returns the type of the file | 25 | * Returns the type of the file |
| 26 | * @param file std::shared_ptr<VfsFile> open file | 26 | * @param file open file |
| 27 | * @return FileType found, or FileType::Error if this loader doesn't know it | 27 | * @return FileType found, or FileType::Error if this loader doesn't know it |
| 28 | */ | 28 | */ |
| 29 | static FileType IdentifyType(const FileSys::VirtualFile& file); | 29 | static FileType IdentifyType(const FileSys::VirtualFile& file); |
diff --git a/src/core/loader/nax.h b/src/core/loader/nax.h index c2b7722b5..a5b5e2ae1 100644 --- a/src/core/loader/nax.h +++ b/src/core/loader/nax.h | |||
| @@ -28,7 +28,7 @@ public: | |||
| 28 | 28 | ||
| 29 | /** | 29 | /** |
| 30 | * Returns the type of the file | 30 | * Returns the type of the file |
| 31 | * @param file std::shared_ptr<VfsFile> open file | 31 | * @param file open file |
| 32 | * @return FileType found, or FileType::Error if this loader doesn't know it | 32 | * @return FileType found, or FileType::Error if this loader doesn't know it |
| 33 | */ | 33 | */ |
| 34 | static FileType IdentifyType(const FileSys::VirtualFile& file); | 34 | static FileType IdentifyType(const FileSys::VirtualFile& file); |
diff --git a/src/core/loader/nca.h b/src/core/loader/nca.h index 711070294..918792800 100644 --- a/src/core/loader/nca.h +++ b/src/core/loader/nca.h | |||
| @@ -28,7 +28,7 @@ public: | |||
| 28 | 28 | ||
| 29 | /** | 29 | /** |
| 30 | * Returns the type of the file | 30 | * Returns the type of the file |
| 31 | * @param file std::shared_ptr<VfsFile> open file | 31 | * @param file open file |
| 32 | * @return FileType found, or FileType::Error if this loader doesn't know it | 32 | * @return FileType found, or FileType::Error if this loader doesn't know it |
| 33 | */ | 33 | */ |
| 34 | static FileType IdentifyType(const FileSys::VirtualFile& file); | 34 | static FileType IdentifyType(const FileSys::VirtualFile& file); |
diff --git a/src/core/loader/nro.h b/src/core/loader/nro.h index a2aab2ecc..a82b66221 100644 --- a/src/core/loader/nro.h +++ b/src/core/loader/nro.h | |||
| @@ -32,7 +32,7 @@ public: | |||
| 32 | 32 | ||
| 33 | /** | 33 | /** |
| 34 | * Returns the type of the file | 34 | * Returns the type of the file |
| 35 | * @param file std::shared_ptr<VfsFile> open file | 35 | * @param file open file |
| 36 | * @return FileType found, or FileType::Error if this loader doesn't know it | 36 | * @return FileType found, or FileType::Error if this loader doesn't know it |
| 37 | */ | 37 | */ |
| 38 | static FileType IdentifyType(const FileSys::VirtualFile& file); | 38 | static FileType IdentifyType(const FileSys::VirtualFile& file); |
diff --git a/src/core/loader/nso.h b/src/core/loader/nso.h index d331096ae..3af461b5f 100644 --- a/src/core/loader/nso.h +++ b/src/core/loader/nso.h | |||
| @@ -75,7 +75,7 @@ public: | |||
| 75 | 75 | ||
| 76 | /** | 76 | /** |
| 77 | * Returns the type of the file | 77 | * Returns the type of the file |
| 78 | * @param file std::shared_ptr<VfsFile> open file | 78 | * @param file open file |
| 79 | * @return FileType found, or FileType::Error if this loader doesn't know it | 79 | * @return FileType found, or FileType::Error if this loader doesn't know it |
| 80 | */ | 80 | */ |
| 81 | static FileType IdentifyType(const FileSys::VirtualFile& file); | 81 | static FileType IdentifyType(const FileSys::VirtualFile& file); |
diff --git a/src/core/loader/nsp.h b/src/core/loader/nsp.h index f0518ac47..d48d87f2c 100644 --- a/src/core/loader/nsp.h +++ b/src/core/loader/nsp.h | |||
| @@ -34,7 +34,7 @@ public: | |||
| 34 | 34 | ||
| 35 | /** | 35 | /** |
| 36 | * Returns the type of the file | 36 | * Returns the type of the file |
| 37 | * @param file std::shared_ptr<VfsFile> open file | 37 | * @param file open file |
| 38 | * @return FileType found, or FileType::Error if this loader doesn't know it | 38 | * @return FileType found, or FileType::Error if this loader doesn't know it |
| 39 | */ | 39 | */ |
| 40 | static FileType IdentifyType(const FileSys::VirtualFile& file); | 40 | static FileType IdentifyType(const FileSys::VirtualFile& file); |
diff --git a/src/core/loader/xci.h b/src/core/loader/xci.h index 764dc8328..9f0ceb5ef 100644 --- a/src/core/loader/xci.h +++ b/src/core/loader/xci.h | |||
| @@ -34,7 +34,7 @@ public: | |||
| 34 | 34 | ||
| 35 | /** | 35 | /** |
| 36 | * Returns the type of the file | 36 | * Returns the type of the file |
| 37 | * @param file std::shared_ptr<VfsFile> open file | 37 | * @param file open file |
| 38 | * @return FileType found, or FileType::Error if this loader doesn't know it | 38 | * @return FileType found, or FileType::Error if this loader doesn't know it |
| 39 | */ | 39 | */ |
| 40 | static FileType IdentifyType(const FileSys::VirtualFile& file); | 40 | static FileType IdentifyType(const FileSys::VirtualFile& file); |
diff --git a/src/core/memory.cpp b/src/core/memory.cpp index b88aa5c40..b7f21698f 100644 --- a/src/core/memory.cpp +++ b/src/core/memory.cpp | |||
| @@ -667,8 +667,6 @@ struct Memory::Impl { | |||
| 667 | * @tparam T The data type to write to memory. This type *must* be | 667 | * @tparam T The data type to write to memory. This type *must* be |
| 668 | * trivially copyable, otherwise the behavior of this function | 668 | * trivially copyable, otherwise the behavior of this function |
| 669 | * is undefined. | 669 | * is undefined. |
| 670 | * | ||
| 671 | * @returns The instance of T write to the specified virtual address. | ||
| 672 | */ | 670 | */ |
| 673 | template <typename T> | 671 | template <typename T> |
| 674 | void Write(const VAddr vaddr, const T data) { | 672 | void Write(const VAddr vaddr, const T data) { |
diff --git a/src/core/network/network.cpp b/src/core/network/network.cpp index 5ef2e8511..681e93468 100644 --- a/src/core/network/network.cpp +++ b/src/core/network/network.cpp | |||
| @@ -11,7 +11,7 @@ | |||
| 11 | #ifdef _WIN32 | 11 | #ifdef _WIN32 |
| 12 | #define _WINSOCK_DEPRECATED_NO_WARNINGS // gethostname | 12 | #define _WINSOCK_DEPRECATED_NO_WARNINGS // gethostname |
| 13 | #include <winsock2.h> | 13 | #include <winsock2.h> |
| 14 | #elif __unix__ | 14 | #elif YUZU_UNIX |
| 15 | #include <errno.h> | 15 | #include <errno.h> |
| 16 | #include <fcntl.h> | 16 | #include <fcntl.h> |
| 17 | #include <netdb.h> | 17 | #include <netdb.h> |
| @@ -54,7 +54,7 @@ constexpr IPv4Address TranslateIPv4(in_addr addr) { | |||
| 54 | sockaddr TranslateFromSockAddrIn(SockAddrIn input) { | 54 | sockaddr TranslateFromSockAddrIn(SockAddrIn input) { |
| 55 | sockaddr_in result; | 55 | sockaddr_in result; |
| 56 | 56 | ||
| 57 | #ifdef __unix__ | 57 | #if YUZU_UNIX |
| 58 | result.sin_len = sizeof(result); | 58 | result.sin_len = sizeof(result); |
| 59 | #endif | 59 | #endif |
| 60 | 60 | ||
| @@ -63,7 +63,7 @@ sockaddr TranslateFromSockAddrIn(SockAddrIn input) { | |||
| 63 | result.sin_family = AF_INET; | 63 | result.sin_family = AF_INET; |
| 64 | break; | 64 | break; |
| 65 | default: | 65 | default: |
| 66 | UNIMPLEMENTED_MSG("Unhandled sockaddr family={}", static_cast<int>(input.family)); | 66 | UNIMPLEMENTED_MSG("Unhandled sockaddr family={}", input.family); |
| 67 | result.sin_family = AF_INET; | 67 | result.sin_family = AF_INET; |
| 68 | break; | 68 | break; |
| 69 | } | 69 | } |
| @@ -99,7 +99,7 @@ bool EnableNonBlock(SOCKET fd, bool enable) { | |||
| 99 | return ioctlsocket(fd, FIONBIO, &value) != SOCKET_ERROR; | 99 | return ioctlsocket(fd, FIONBIO, &value) != SOCKET_ERROR; |
| 100 | } | 100 | } |
| 101 | 101 | ||
| 102 | #elif __unix__ // ^ _WIN32 v __unix__ | 102 | #elif YUZU_UNIX // ^ _WIN32 v YUZU_UNIX |
| 103 | 103 | ||
| 104 | using SOCKET = int; | 104 | using SOCKET = int; |
| 105 | using WSAPOLLFD = pollfd; | 105 | using WSAPOLLFD = pollfd; |
| @@ -133,7 +133,7 @@ sockaddr TranslateFromSockAddrIn(SockAddrIn input) { | |||
| 133 | result.sin_family = AF_INET; | 133 | result.sin_family = AF_INET; |
| 134 | break; | 134 | break; |
| 135 | default: | 135 | default: |
| 136 | UNIMPLEMENTED_MSG("Unhandled sockaddr family={}", static_cast<int>(input.family)); | 136 | UNIMPLEMENTED_MSG("Unhandled sockaddr family={}", input.family); |
| 137 | result.sin_family = AF_INET; | 137 | result.sin_family = AF_INET; |
| 138 | break; | 138 | break; |
| 139 | } | 139 | } |
| @@ -186,7 +186,7 @@ int TranslateDomain(Domain domain) { | |||
| 186 | case Domain::INET: | 186 | case Domain::INET: |
| 187 | return AF_INET; | 187 | return AF_INET; |
| 188 | default: | 188 | default: |
| 189 | UNIMPLEMENTED_MSG("Unimplemented domain={}", static_cast<int>(domain)); | 189 | UNIMPLEMENTED_MSG("Unimplemented domain={}", domain); |
| 190 | return 0; | 190 | return 0; |
| 191 | } | 191 | } |
| 192 | } | 192 | } |
| @@ -198,7 +198,7 @@ int TranslateType(Type type) { | |||
| 198 | case Type::DGRAM: | 198 | case Type::DGRAM: |
| 199 | return SOCK_DGRAM; | 199 | return SOCK_DGRAM; |
| 200 | default: | 200 | default: |
| 201 | UNIMPLEMENTED_MSG("Unimplemented type={}", static_cast<int>(type)); | 201 | UNIMPLEMENTED_MSG("Unimplemented type={}", type); |
| 202 | return 0; | 202 | return 0; |
| 203 | } | 203 | } |
| 204 | } | 204 | } |
| @@ -210,7 +210,7 @@ int TranslateProtocol(Protocol protocol) { | |||
| 210 | case Protocol::UDP: | 210 | case Protocol::UDP: |
| 211 | return IPPROTO_UDP; | 211 | return IPPROTO_UDP; |
| 212 | default: | 212 | default: |
| 213 | UNIMPLEMENTED_MSG("Unimplemented protocol={}", static_cast<int>(protocol)); | 213 | UNIMPLEMENTED_MSG("Unimplemented protocol={}", protocol); |
| 214 | return 0; | 214 | return 0; |
| 215 | } | 215 | } |
| 216 | } | 216 | } |
| @@ -238,49 +238,49 @@ SockAddrIn TranslateToSockAddrIn(sockaddr input_) { | |||
| 238 | return result; | 238 | return result; |
| 239 | } | 239 | } |
| 240 | 240 | ||
| 241 | u16 TranslatePollEvents(u32 events) { | 241 | short TranslatePollEvents(PollEvents events) { |
| 242 | u32 result = 0; | 242 | short result = 0; |
| 243 | 243 | ||
| 244 | if ((events & POLL_IN) != 0) { | 244 | if (True(events & PollEvents::In)) { |
| 245 | events &= ~POLL_IN; | 245 | events &= ~PollEvents::In; |
| 246 | result |= POLLIN; | 246 | result |= POLLIN; |
| 247 | } | 247 | } |
| 248 | if ((events & POLL_PRI) != 0) { | 248 | if (True(events & PollEvents::Pri)) { |
| 249 | events &= ~POLL_PRI; | 249 | events &= ~PollEvents::Pri; |
| 250 | #ifdef _WIN32 | 250 | #ifdef _WIN32 |
| 251 | LOG_WARNING(Service, "Winsock doesn't support POLLPRI"); | 251 | LOG_WARNING(Service, "Winsock doesn't support POLLPRI"); |
| 252 | #else | 252 | #else |
| 253 | result |= POLL_PRI; | 253 | result |= POLLPRI; |
| 254 | #endif | 254 | #endif |
| 255 | } | 255 | } |
| 256 | if ((events & POLL_OUT) != 0) { | 256 | if (True(events & PollEvents::Out)) { |
| 257 | events &= ~POLL_OUT; | 257 | events &= ~PollEvents::Out; |
| 258 | result |= POLLOUT; | 258 | result |= POLLOUT; |
| 259 | } | 259 | } |
| 260 | 260 | ||
| 261 | UNIMPLEMENTED_IF_MSG(events != 0, "Unhandled guest events=0x{:x}", events); | 261 | UNIMPLEMENTED_IF_MSG((u16)events != 0, "Unhandled guest events=0x{:x}", (u16)events); |
| 262 | 262 | ||
| 263 | return static_cast<u16>(result); | 263 | return result; |
| 264 | } | 264 | } |
| 265 | 265 | ||
| 266 | u16 TranslatePollRevents(u32 revents) { | 266 | PollEvents TranslatePollRevents(short revents) { |
| 267 | u32 result = 0; | 267 | PollEvents result{}; |
| 268 | const auto translate = [&result, &revents](u32 host, u32 guest) { | 268 | const auto translate = [&result, &revents](short host, PollEvents guest) { |
| 269 | if ((revents & host) != 0) { | 269 | if ((revents & host) != 0) { |
| 270 | revents &= ~host; | 270 | revents &= static_cast<short>(~host); |
| 271 | result |= guest; | 271 | result |= guest; |
| 272 | } | 272 | } |
| 273 | }; | 273 | }; |
| 274 | 274 | ||
| 275 | translate(POLLIN, POLL_IN); | 275 | translate(POLLIN, PollEvents::In); |
| 276 | translate(POLLPRI, POLL_PRI); | 276 | translate(POLLPRI, PollEvents::Pri); |
| 277 | translate(POLLOUT, POLL_OUT); | 277 | translate(POLLOUT, PollEvents::Out); |
| 278 | translate(POLLERR, POLL_ERR); | 278 | translate(POLLERR, PollEvents::Err); |
| 279 | translate(POLLHUP, POLL_HUP); | 279 | translate(POLLHUP, PollEvents::Hup); |
| 280 | 280 | ||
| 281 | UNIMPLEMENTED_IF_MSG(revents != 0, "Unhandled host revents=0x{:x}", revents); | 281 | UNIMPLEMENTED_IF_MSG(revents != 0, "Unhandled host revents=0x{:x}", revents); |
| 282 | 282 | ||
| 283 | return static_cast<u16>(result); | 283 | return result; |
| 284 | } | 284 | } |
| 285 | 285 | ||
| 286 | template <typename T> | 286 | template <typename T> |
| @@ -350,7 +350,7 @@ std::pair<s32, Errno> Poll(std::vector<PollFD>& pollfds, s32 timeout) { | |||
| 350 | } | 350 | } |
| 351 | 351 | ||
| 352 | for (size_t i = 0; i < num; ++i) { | 352 | for (size_t i = 0; i < num; ++i) { |
| 353 | pollfds[i].revents = TranslatePollRevents(static_cast<u32>(host_pollfds[i].revents)); | 353 | pollfds[i].revents = TranslatePollRevents(host_pollfds[i].revents); |
| 354 | } | 354 | } |
| 355 | 355 | ||
| 356 | if (result > 0) { | 356 | if (result > 0) { |
| @@ -482,7 +482,7 @@ Errno Socket::Shutdown(ShutdownHow how) { | |||
| 482 | host_how = SD_BOTH; | 482 | host_how = SD_BOTH; |
| 483 | break; | 483 | break; |
| 484 | default: | 484 | default: |
| 485 | UNIMPLEMENTED_MSG("Unimplemented flag how={}", static_cast<int>(how)); | 485 | UNIMPLEMENTED_MSG("Unimplemented flag how={}", how); |
| 486 | return Errno::SUCCESS; | 486 | return Errno::SUCCESS; |
| 487 | } | 487 | } |
| 488 | if (shutdown(fd, host_how) != SOCKET_ERROR) { | 488 | if (shutdown(fd, host_how) != SOCKET_ERROR) { |
diff --git a/src/core/network/network.h b/src/core/network/network.h index 0622e4593..76b2821f2 100644 --- a/src/core/network/network.h +++ b/src/core/network/network.h | |||
| @@ -61,19 +61,25 @@ struct SockAddrIn { | |||
| 61 | }; | 61 | }; |
| 62 | 62 | ||
| 63 | /// Cross-platform poll fd structure | 63 | /// Cross-platform poll fd structure |
| 64 | |||
| 65 | enum class PollEvents : u16 { | ||
| 66 | // Using Pascal case because IN is a macro on Windows. | ||
| 67 | In = 1 << 0, | ||
| 68 | Pri = 1 << 1, | ||
| 69 | Out = 1 << 2, | ||
| 70 | Err = 1 << 3, | ||
| 71 | Hup = 1 << 4, | ||
| 72 | Nval = 1 << 5, | ||
| 73 | }; | ||
| 74 | |||
| 75 | DECLARE_ENUM_FLAG_OPERATORS(PollEvents); | ||
| 76 | |||
| 64 | struct PollFD { | 77 | struct PollFD { |
| 65 | Socket* socket; | 78 | Socket* socket; |
| 66 | u16 events; | 79 | PollEvents events; |
| 67 | u16 revents; | 80 | PollEvents revents; |
| 68 | }; | 81 | }; |
| 69 | 82 | ||
| 70 | constexpr u16 POLL_IN = 1 << 0; | ||
| 71 | constexpr u16 POLL_PRI = 1 << 1; | ||
| 72 | constexpr u16 POLL_OUT = 1 << 2; | ||
| 73 | constexpr u16 POLL_ERR = 1 << 3; | ||
| 74 | constexpr u16 POLL_HUP = 1 << 4; | ||
| 75 | constexpr u16 POLL_NVAL = 1 << 5; | ||
| 76 | |||
| 77 | class NetworkInstance { | 83 | class NetworkInstance { |
| 78 | public: | 84 | public: |
| 79 | explicit NetworkInstance(); | 85 | explicit NetworkInstance(); |
diff --git a/src/core/network/sockets.h b/src/core/network/sockets.h index 7bdff0fe4..a44393325 100644 --- a/src/core/network/sockets.h +++ b/src/core/network/sockets.h | |||
| @@ -9,7 +9,7 @@ | |||
| 9 | 9 | ||
| 10 | #if defined(_WIN32) | 10 | #if defined(_WIN32) |
| 11 | #include <winsock.h> | 11 | #include <winsock.h> |
| 12 | #elif !defined(__unix__) | 12 | #elif !YUZU_UNIX |
| 13 | #error "Platform not implemented" | 13 | #error "Platform not implemented" |
| 14 | #endif | 14 | #endif |
| 15 | 15 | ||
| @@ -84,7 +84,7 @@ public: | |||
| 84 | 84 | ||
| 85 | #if defined(_WIN32) | 85 | #if defined(_WIN32) |
| 86 | SOCKET fd = INVALID_SOCKET; | 86 | SOCKET fd = INVALID_SOCKET; |
| 87 | #elif defined(__unix__) | 87 | #elif YUZU_UNIX |
| 88 | int fd = -1; | 88 | int fd = -1; |
| 89 | #endif | 89 | #endif |
| 90 | }; | 90 | }; |
diff --git a/src/core/settings.cpp b/src/core/settings.cpp index e9997a263..47d9ecf9a 100644 --- a/src/core/settings.cpp +++ b/src/core/settings.cpp | |||
| @@ -72,8 +72,6 @@ void LogSettings() { | |||
| 72 | log_setting("DataStorage_UseVirtualSd", values.use_virtual_sd); | 72 | log_setting("DataStorage_UseVirtualSd", values.use_virtual_sd); |
| 73 | log_setting("DataStorage_NandDir", Common::FS::GetUserPath(Common::FS::UserPath::NANDDir)); | 73 | log_setting("DataStorage_NandDir", Common::FS::GetUserPath(Common::FS::UserPath::NANDDir)); |
| 74 | log_setting("DataStorage_SdmcDir", Common::FS::GetUserPath(Common::FS::UserPath::SDMCDir)); | 74 | log_setting("DataStorage_SdmcDir", Common::FS::GetUserPath(Common::FS::UserPath::SDMCDir)); |
| 75 | log_setting("Debugging_UseGdbstub", values.use_gdbstub); | ||
| 76 | log_setting("Debugging_GdbstubPort", values.gdbstub_port); | ||
| 77 | log_setting("Debugging_ProgramArgs", values.program_args); | 75 | log_setting("Debugging_ProgramArgs", values.program_args); |
| 78 | log_setting("Services_BCATBackend", values.bcat_backend); | 76 | log_setting("Services_BCATBackend", values.bcat_backend); |
| 79 | log_setting("Services_BCATBoxcatLocal", values.bcat_boxcat_local); | 77 | log_setting("Services_BCATBoxcatLocal", values.bcat_boxcat_local); |
diff --git a/src/core/settings.h b/src/core/settings.h index 8e076f7ef..d5f8d2b7e 100644 --- a/src/core/settings.h +++ b/src/core/settings.h | |||
| @@ -180,6 +180,8 @@ struct Values { | |||
| 180 | std::string motion_device; | 180 | std::string motion_device; |
| 181 | std::string udp_input_servers; | 181 | std::string udp_input_servers; |
| 182 | 182 | ||
| 183 | bool emulate_analog_keyboard; | ||
| 184 | |||
| 183 | bool mouse_enabled; | 185 | bool mouse_enabled; |
| 184 | std::string mouse_device; | 186 | std::string mouse_device; |
| 185 | MouseButtonsRaw mouse_buttons; | 187 | MouseButtonsRaw mouse_buttons; |