diff options
| author | 2021-01-10 22:09:56 -0700 | |
|---|---|---|
| committer | 2021-01-10 22:09:56 -0700 | |
| commit | 7a3c884e39fccfbb498b855080bffabc9ce2e7f1 (patch) | |
| tree | 5056f9406dec188439cb0deb87603498243a9412 /src/core/file_sys | |
| parent | More forgetting... duh (diff) | |
| parent | Merge pull request #5229 from Morph1984/fullscreen-opt (diff) | |
| download | yuzu-7a3c884e39fccfbb498b855080bffabc9ce2e7f1.tar.gz yuzu-7a3c884e39fccfbb498b855080bffabc9ce2e7f1.tar.xz yuzu-7a3c884e39fccfbb498b855080bffabc9ce2e7f1.zip | |
Merge remote-tracking branch 'upstream/master' into int-flags
Diffstat (limited to 'src/core/file_sys')
38 files changed, 763 insertions, 445 deletions
diff --git a/src/core/file_sys/card_image.cpp b/src/core/file_sys/card_image.cpp index 956da68f7..8dee5590b 100644 --- a/src/core/file_sys/card_image.cpp +++ b/src/core/file_sys/card_image.cpp | |||
| @@ -29,7 +29,7 @@ constexpr std::array partition_names{ | |||
| 29 | "logo", | 29 | "logo", |
| 30 | }; | 30 | }; |
| 31 | 31 | ||
| 32 | XCI::XCI(VirtualFile file_) | 32 | XCI::XCI(VirtualFile file_, std::size_t program_index) |
| 33 | : file(std::move(file_)), program_nca_status{Loader::ResultStatus::ErrorXCIMissingProgramNCA}, | 33 | : file(std::move(file_)), program_nca_status{Loader::ResultStatus::ErrorXCIMissingProgramNCA}, |
| 34 | partitions(partition_names.size()), | 34 | partitions(partition_names.size()), |
| 35 | partitions_raw(partition_names.size()), keys{Core::Crypto::KeyManager::Instance()} { | 35 | partitions_raw(partition_names.size()), keys{Core::Crypto::KeyManager::Instance()} { |
| @@ -62,7 +62,8 @@ XCI::XCI(VirtualFile file_) | |||
| 62 | } | 62 | } |
| 63 | 63 | ||
| 64 | secure_partition = std::make_shared<NSP>( | 64 | secure_partition = std::make_shared<NSP>( |
| 65 | main_hfs.GetFile(partition_names[static_cast<std::size_t>(XCIPartition::Secure)])); | 65 | main_hfs.GetFile(partition_names[static_cast<std::size_t>(XCIPartition::Secure)]), |
| 66 | program_index); | ||
| 66 | 67 | ||
| 67 | ncas = secure_partition->GetNCAsCollapsed(); | 68 | ncas = secure_partition->GetNCAsCollapsed(); |
| 68 | program = | 69 | program = |
diff --git a/src/core/file_sys/card_image.h b/src/core/file_sys/card_image.h index 2d0a0f285..4960e90fe 100644 --- a/src/core/file_sys/card_image.h +++ b/src/core/file_sys/card_image.h | |||
| @@ -78,7 +78,7 @@ enum class XCIPartition : u8 { Update, Normal, Secure, Logo }; | |||
| 78 | 78 | ||
| 79 | class XCI : public ReadOnlyVfsDirectory { | 79 | class XCI : public ReadOnlyVfsDirectory { |
| 80 | public: | 80 | public: |
| 81 | explicit XCI(VirtualFile file); | 81 | explicit XCI(VirtualFile file, std::size_t program_index = 0); |
| 82 | ~XCI() override; | 82 | ~XCI() override; |
| 83 | 83 | ||
| 84 | Loader::ResultStatus GetStatus() const; | 84 | Loader::ResultStatus GetStatus() const; |
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/fsmitm_romfsbuild.cpp b/src/core/file_sys/fsmitm_romfsbuild.cpp index 2aff2708a..c52fafb6f 100644 --- a/src/core/file_sys/fsmitm_romfsbuild.cpp +++ b/src/core/file_sys/fsmitm_romfsbuild.cpp | |||
| @@ -266,8 +266,9 @@ std::multimap<u64, VirtualFile> RomFSBuildContext::Build() { | |||
| 266 | cur_file->offset = file_partition_size; | 266 | cur_file->offset = file_partition_size; |
| 267 | file_partition_size += cur_file->size; | 267 | file_partition_size += cur_file->size; |
| 268 | cur_file->entry_offset = entry_offset; | 268 | cur_file->entry_offset = entry_offset; |
| 269 | entry_offset += sizeof(RomFSFileEntry) + | 269 | entry_offset += |
| 270 | Common::AlignUp(cur_file->path_len - cur_file->cur_path_ofs, 4); | 270 | static_cast<u32>(sizeof(RomFSFileEntry) + |
| 271 | Common::AlignUp(cur_file->path_len - cur_file->cur_path_ofs, 4)); | ||
| 271 | prev_file = cur_file; | 272 | prev_file = cur_file; |
| 272 | } | 273 | } |
| 273 | // Assign deferred parent/sibling ownership. | 274 | // Assign deferred parent/sibling ownership. |
| @@ -284,8 +285,9 @@ std::multimap<u64, VirtualFile> RomFSBuildContext::Build() { | |||
| 284 | for (const auto& it : directories) { | 285 | for (const auto& it : directories) { |
| 285 | cur_dir = it.second; | 286 | cur_dir = it.second; |
| 286 | cur_dir->entry_offset = entry_offset; | 287 | cur_dir->entry_offset = entry_offset; |
| 287 | entry_offset += sizeof(RomFSDirectoryEntry) + | 288 | entry_offset += |
| 288 | Common::AlignUp(cur_dir->path_len - cur_dir->cur_path_ofs, 4); | 289 | static_cast<u32>(sizeof(RomFSDirectoryEntry) + |
| 290 | Common::AlignUp(cur_dir->path_len - cur_dir->cur_path_ofs, 4)); | ||
| 289 | } | 291 | } |
| 290 | // Assign deferred parent/sibling ownership. | 292 | // Assign deferred parent/sibling ownership. |
| 291 | for (auto it = directories.rbegin(); it->second != root; ++it) { | 293 | for (auto it = directories.rbegin(); it->second != root; ++it) { |
diff --git a/src/core/file_sys/ips_layer.cpp b/src/core/file_sys/ips_layer.cpp index dd779310f..a6101f1c0 100644 --- a/src/core/file_sys/ips_layer.cpp +++ b/src/core/file_sys/ips_layer.cpp | |||
| @@ -299,7 +299,7 @@ void IPSwitchCompiler::Parse() { | |||
| 299 | patch_text->GetName(), offset, Common::HexToString(replace)); | 299 | patch_text->GetName(), offset, Common::HexToString(replace)); |
| 300 | } | 300 | } |
| 301 | 301 | ||
| 302 | patch.records.insert_or_assign(offset, std::move(replace)); | 302 | patch.records.insert_or_assign(static_cast<u32>(offset), std::move(replace)); |
| 303 | } | 303 | } |
| 304 | 304 | ||
| 305 | patches.push_back(std::move(patch)); | 305 | patches.push_back(std::move(patch)); |
diff --git a/src/core/file_sys/nca_metadata.cpp b/src/core/file_sys/nca_metadata.cpp index 2d1476e3a..3596541b2 100644 --- a/src/core/file_sys/nca_metadata.cpp +++ b/src/core/file_sys/nca_metadata.cpp | |||
| @@ -108,7 +108,7 @@ std::vector<u8> CNMT::Serialize() const { | |||
| 108 | memcpy(out.data() + sizeof(CNMTHeader), &opt_header, sizeof(OptionalHeader)); | 108 | memcpy(out.data() + sizeof(CNMTHeader), &opt_header, sizeof(OptionalHeader)); |
| 109 | } | 109 | } |
| 110 | 110 | ||
| 111 | auto offset = header.table_offset; | 111 | u64_le offset = header.table_offset; |
| 112 | 112 | ||
| 113 | for (const auto& rec : content_records) { | 113 | for (const auto& rec : content_records) { |
| 114 | memcpy(out.data() + offset + sizeof(CNMTHeader), &rec, sizeof(ContentRecord)); | 114 | memcpy(out.data() + offset + sizeof(CNMTHeader), &rec, sizeof(ContentRecord)); |
diff --git a/src/core/file_sys/nca_patch.cpp b/src/core/file_sys/nca_patch.cpp index 5990a2fd5..a65ec6798 100644 --- a/src/core/file_sys/nca_patch.cpp +++ b/src/core/file_sys/nca_patch.cpp | |||
| @@ -51,8 +51,8 @@ std::pair<std::size_t, std::size_t> SearchBucketEntry(u64 offset, const BlockTyp | |||
| 51 | low = mid + 1; | 51 | low = mid + 1; |
| 52 | } | 52 | } |
| 53 | } | 53 | } |
| 54 | |||
| 55 | UNREACHABLE_MSG("Offset could not be found in BKTR block."); | 54 | UNREACHABLE_MSG("Offset could not be found in BKTR block."); |
| 55 | return {0, 0}; | ||
| 56 | } | 56 | } |
| 57 | } // Anonymous namespace | 57 | } // Anonymous namespace |
| 58 | 58 | ||
| @@ -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 b9c09b456..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" |
| @@ -29,8 +30,7 @@ | |||
| 29 | namespace FileSys { | 30 | namespace FileSys { |
| 30 | namespace { | 31 | namespace { |
| 31 | 32 | ||
| 32 | constexpr u64 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", |
| @@ -112,7 +112,10 @@ bool IsDirValidAndNonEmpty(const VirtualDir& dir) { | |||
| 112 | } | 112 | } |
| 113 | } // Anonymous namespace | 113 | } // Anonymous namespace |
| 114 | 114 | ||
| 115 | PatchManager::PatchManager(u64 title_id) : title_id(title_id) {} | 115 | PatchManager::PatchManager(u64 title_id_, |
| 116 | const Service::FileSystem::FileSystemController& fs_controller_, | ||
| 117 | const ContentProvider& content_provider_) | ||
| 118 | : title_id{title_id_}, fs_controller{fs_controller_}, content_provider{content_provider_} {} | ||
| 116 | 119 | ||
| 117 | PatchManager::~PatchManager() = default; | 120 | PatchManager::~PatchManager() = default; |
| 118 | 121 | ||
| @@ -128,34 +131,30 @@ VirtualDir PatchManager::PatchExeFS(VirtualDir exefs) const { | |||
| 128 | 131 | ||
| 129 | if (Settings::values.dump_exefs) { | 132 | if (Settings::values.dump_exefs) { |
| 130 | LOG_INFO(Loader, "Dumping ExeFS for title_id={:016X}", title_id); | 133 | LOG_INFO(Loader, "Dumping ExeFS for title_id={:016X}", title_id); |
| 131 | const auto dump_dir = | 134 | const auto dump_dir = fs_controller.GetModificationDumpRoot(title_id); |
| 132 | Core::System::GetInstance().GetFileSystemController().GetModificationDumpRoot(title_id); | ||
| 133 | if (dump_dir != nullptr) { | 135 | if (dump_dir != nullptr) { |
| 134 | const auto exefs_dir = GetOrCreateDirectoryRelative(dump_dir, "/exefs"); | 136 | const auto exefs_dir = GetOrCreateDirectoryRelative(dump_dir, "/exefs"); |
| 135 | VfsRawCopyD(exefs, exefs_dir); | 137 | VfsRawCopyD(exefs, exefs_dir); |
| 136 | } | 138 | } |
| 137 | } | 139 | } |
| 138 | 140 | ||
| 139 | const auto& installed = Core::System::GetInstance().GetContentProvider(); | ||
| 140 | |||
| 141 | const auto& disabled = Settings::values.disabled_addons[title_id]; | 141 | const auto& disabled = Settings::values.disabled_addons[title_id]; |
| 142 | const auto update_disabled = | 142 | const auto update_disabled = |
| 143 | std::find(disabled.cbegin(), disabled.cend(), "Update") != disabled.cend(); | 143 | std::find(disabled.cbegin(), disabled.cend(), "Update") != disabled.cend(); |
| 144 | 144 | ||
| 145 | // Game Updates | 145 | // Game Updates |
| 146 | const auto update_tid = GetUpdateTitleID(title_id); | 146 | const auto update_tid = GetUpdateTitleID(title_id); |
| 147 | const auto update = installed.GetEntry(update_tid, ContentRecordType::Program); | 147 | const auto update = content_provider.GetEntry(update_tid, ContentRecordType::Program); |
| 148 | 148 | ||
| 149 | if (!update_disabled && update != nullptr && update->GetExeFS() != nullptr && | 149 | if (!update_disabled && update != nullptr && update->GetExeFS() != nullptr && |
| 150 | update->GetStatus() == Loader::ResultStatus::ErrorMissingBKTRBaseRomFS) { | 150 | update->GetStatus() == Loader::ResultStatus::ErrorMissingBKTRBaseRomFS) { |
| 151 | LOG_INFO(Loader, " ExeFS: Update ({}) applied successfully", | 151 | LOG_INFO(Loader, " ExeFS: Update ({}) applied successfully", |
| 152 | FormatTitleVersion(installed.GetEntryVersion(update_tid).value_or(0))); | 152 | FormatTitleVersion(content_provider.GetEntryVersion(update_tid).value_or(0))); |
| 153 | exefs = update->GetExeFS(); | 153 | exefs = update->GetExeFS(); |
| 154 | } | 154 | } |
| 155 | 155 | ||
| 156 | // LayeredExeFS | 156 | // LayeredExeFS |
| 157 | const auto load_dir = | 157 | const auto load_dir = fs_controller.GetModificationLoadRoot(title_id); |
| 158 | Core::System::GetInstance().GetFileSystemController().GetModificationLoadRoot(title_id); | ||
| 159 | if (load_dir != nullptr && load_dir->GetSize() > 0) { | 158 | if (load_dir != nullptr && load_dir->GetSize() > 0) { |
| 160 | auto patch_dirs = load_dir->GetSubdirectories(); | 159 | auto patch_dirs = load_dir->GetSubdirectories(); |
| 161 | std::sort( | 160 | std::sort( |
| @@ -241,8 +240,7 @@ std::vector<u8> PatchManager::PatchNSO(const std::vector<u8>& nso, const std::st | |||
| 241 | if (Settings::values.dump_nso) { | 240 | if (Settings::values.dump_nso) { |
| 242 | LOG_INFO(Loader, "Dumping NSO for name={}, build_id={}, title_id={:016X}", name, build_id, | 241 | LOG_INFO(Loader, "Dumping NSO for name={}, build_id={}, title_id={:016X}", name, build_id, |
| 243 | title_id); | 242 | title_id); |
| 244 | const auto dump_dir = | 243 | const auto dump_dir = fs_controller.GetModificationDumpRoot(title_id); |
| 245 | Core::System::GetInstance().GetFileSystemController().GetModificationDumpRoot(title_id); | ||
| 246 | if (dump_dir != nullptr) { | 244 | if (dump_dir != nullptr) { |
| 247 | const auto nso_dir = GetOrCreateDirectoryRelative(dump_dir, "/nso"); | 245 | const auto nso_dir = GetOrCreateDirectoryRelative(dump_dir, "/nso"); |
| 248 | const auto file = nso_dir->CreateFile(fmt::format("{}-{}.nso", name, build_id)); | 246 | const auto file = nso_dir->CreateFile(fmt::format("{}-{}.nso", name, build_id)); |
| @@ -254,8 +252,7 @@ std::vector<u8> PatchManager::PatchNSO(const std::vector<u8>& nso, const std::st | |||
| 254 | 252 | ||
| 255 | LOG_INFO(Loader, "Patching NSO for name={}, build_id={}", name, build_id); | 253 | LOG_INFO(Loader, "Patching NSO for name={}, build_id={}", name, build_id); |
| 256 | 254 | ||
| 257 | const auto load_dir = | 255 | const auto load_dir = fs_controller.GetModificationLoadRoot(title_id); |
| 258 | Core::System::GetInstance().GetFileSystemController().GetModificationLoadRoot(title_id); | ||
| 259 | if (load_dir == nullptr) { | 256 | if (load_dir == nullptr) { |
| 260 | LOG_ERROR(Loader, "Cannot load mods for invalid title_id={:016X}", title_id); | 257 | LOG_ERROR(Loader, "Cannot load mods for invalid title_id={:016X}", title_id); |
| 261 | return nso; | 258 | return nso; |
| @@ -298,8 +295,7 @@ bool PatchManager::HasNSOPatch(const BuildID& build_id_) const { | |||
| 298 | 295 | ||
| 299 | LOG_INFO(Loader, "Querying NSO patch existence for build_id={}", build_id); | 296 | LOG_INFO(Loader, "Querying NSO patch existence for build_id={}", build_id); |
| 300 | 297 | ||
| 301 | const auto load_dir = | 298 | const auto load_dir = fs_controller.GetModificationLoadRoot(title_id); |
| 302 | Core::System::GetInstance().GetFileSystemController().GetModificationLoadRoot(title_id); | ||
| 303 | if (load_dir == nullptr) { | 299 | if (load_dir == nullptr) { |
| 304 | LOG_ERROR(Loader, "Cannot load mods for invalid title_id={:016X}", title_id); | 300 | LOG_ERROR(Loader, "Cannot load mods for invalid title_id={:016X}", title_id); |
| 305 | return false; | 301 | return false; |
| @@ -313,8 +309,8 @@ bool PatchManager::HasNSOPatch(const BuildID& build_id_) const { | |||
| 313 | } | 309 | } |
| 314 | 310 | ||
| 315 | std::vector<Core::Memory::CheatEntry> PatchManager::CreateCheatList( | 311 | std::vector<Core::Memory::CheatEntry> PatchManager::CreateCheatList( |
| 316 | const Core::System& system, const BuildID& build_id_) const { | 312 | const BuildID& build_id_) const { |
| 317 | const auto load_dir = system.GetFileSystemController().GetModificationLoadRoot(title_id); | 313 | const auto load_dir = fs_controller.GetModificationLoadRoot(title_id); |
| 318 | if (load_dir == nullptr) { | 314 | if (load_dir == nullptr) { |
| 319 | LOG_ERROR(Loader, "Cannot load mods for invalid title_id={:016X}", title_id); | 315 | LOG_ERROR(Loader, "Cannot load mods for invalid title_id={:016X}", title_id); |
| 320 | return {}; | 316 | return {}; |
| @@ -347,9 +343,9 @@ std::vector<Core::Memory::CheatEntry> PatchManager::CreateCheatList( | |||
| 347 | return out; | 343 | return out; |
| 348 | } | 344 | } |
| 349 | 345 | ||
| 350 | static void ApplyLayeredFS(VirtualFile& romfs, u64 title_id, ContentRecordType type) { | 346 | static void ApplyLayeredFS(VirtualFile& romfs, u64 title_id, ContentRecordType type, |
| 351 | const auto load_dir = | 347 | const Service::FileSystem::FileSystemController& fs_controller) { |
| 352 | Core::System::GetInstance().GetFileSystemController().GetModificationLoadRoot(title_id); | 348 | const auto load_dir = fs_controller.GetModificationLoadRoot(title_id); |
| 353 | if ((type != ContentRecordType::Program && type != ContentRecordType::Data) || | 349 | if ((type != ContentRecordType::Program && type != ContentRecordType::Data) || |
| 354 | load_dir == nullptr || load_dir->GetSize() <= 0) { | 350 | load_dir == nullptr || load_dir->GetSize() <= 0) { |
| 355 | return; | 351 | return; |
| @@ -411,19 +407,19 @@ VirtualFile PatchManager::PatchRomFS(VirtualFile romfs, u64 ivfc_offset, Content | |||
| 411 | const auto log_string = fmt::format("Patching RomFS for title_id={:016X}, type={:02X}", | 407 | const auto log_string = fmt::format("Patching RomFS for title_id={:016X}, type={:02X}", |
| 412 | title_id, static_cast<u8>(type)); | 408 | title_id, static_cast<u8>(type)); |
| 413 | 409 | ||
| 414 | if (type == ContentRecordType::Program || type == ContentRecordType::Data) | 410 | if (type == ContentRecordType::Program || type == ContentRecordType::Data) { |
| 415 | LOG_INFO(Loader, "{}", log_string); | 411 | LOG_INFO(Loader, "{}", log_string); |
| 416 | else | 412 | } else { |
| 417 | LOG_DEBUG(Loader, "{}", log_string); | 413 | LOG_DEBUG(Loader, "{}", log_string); |
| 414 | } | ||
| 418 | 415 | ||
| 419 | if (romfs == nullptr) | 416 | if (romfs == nullptr) { |
| 420 | return romfs; | 417 | return romfs; |
| 421 | 418 | } | |
| 422 | const auto& installed = Core::System::GetInstance().GetContentProvider(); | ||
| 423 | 419 | ||
| 424 | // Game Updates | 420 | // Game Updates |
| 425 | const auto update_tid = GetUpdateTitleID(title_id); | 421 | const auto update_tid = GetUpdateTitleID(title_id); |
| 426 | const auto update = installed.GetEntryRaw(update_tid, type); | 422 | const auto update = content_provider.GetEntryRaw(update_tid, type); |
| 427 | 423 | ||
| 428 | const auto& disabled = Settings::values.disabled_addons[title_id]; | 424 | const auto& disabled = Settings::values.disabled_addons[title_id]; |
| 429 | const auto update_disabled = | 425 | const auto update_disabled = |
| @@ -434,7 +430,7 @@ VirtualFile PatchManager::PatchRomFS(VirtualFile romfs, u64 ivfc_offset, Content | |||
| 434 | if (new_nca->GetStatus() == Loader::ResultStatus::Success && | 430 | if (new_nca->GetStatus() == Loader::ResultStatus::Success && |
| 435 | new_nca->GetRomFS() != nullptr) { | 431 | new_nca->GetRomFS() != nullptr) { |
| 436 | LOG_INFO(Loader, " RomFS: Update ({}) applied successfully", | 432 | LOG_INFO(Loader, " RomFS: Update ({}) applied successfully", |
| 437 | FormatTitleVersion(installed.GetEntryVersion(update_tid).value_or(0))); | 433 | FormatTitleVersion(content_provider.GetEntryVersion(update_tid).value_or(0))); |
| 438 | romfs = new_nca->GetRomFS(); | 434 | romfs = new_nca->GetRomFS(); |
| 439 | } | 435 | } |
| 440 | } else if (!update_disabled && update_raw != nullptr) { | 436 | } else if (!update_disabled && update_raw != nullptr) { |
| @@ -447,7 +443,7 @@ VirtualFile PatchManager::PatchRomFS(VirtualFile romfs, u64 ivfc_offset, Content | |||
| 447 | } | 443 | } |
| 448 | 444 | ||
| 449 | // LayeredFS | 445 | // LayeredFS |
| 450 | ApplyLayeredFS(romfs, title_id, type); | 446 | ApplyLayeredFS(romfs, title_id, type, fs_controller); |
| 451 | 447 | ||
| 452 | return romfs; | 448 | return romfs; |
| 453 | } | 449 | } |
| @@ -458,12 +454,11 @@ PatchManager::PatchVersionNames PatchManager::GetPatchVersionNames(VirtualFile u | |||
| 458 | } | 454 | } |
| 459 | 455 | ||
| 460 | std::map<std::string, std::string, std::less<>> out; | 456 | std::map<std::string, std::string, std::less<>> out; |
| 461 | const auto& installed = Core::System::GetInstance().GetContentProvider(); | ||
| 462 | const auto& disabled = Settings::values.disabled_addons[title_id]; | 457 | const auto& disabled = Settings::values.disabled_addons[title_id]; |
| 463 | 458 | ||
| 464 | // Game Updates | 459 | // Game Updates |
| 465 | const auto update_tid = GetUpdateTitleID(title_id); | 460 | const auto update_tid = GetUpdateTitleID(title_id); |
| 466 | PatchManager update{update_tid}; | 461 | PatchManager update{update_tid, fs_controller, content_provider}; |
| 467 | const auto metadata = update.GetControlMetadata(); | 462 | const auto metadata = update.GetControlMetadata(); |
| 468 | const auto& nacp = metadata.first; | 463 | const auto& nacp = metadata.first; |
| 469 | 464 | ||
| @@ -474,8 +469,8 @@ PatchManager::PatchVersionNames PatchManager::GetPatchVersionNames(VirtualFile u | |||
| 474 | if (nacp != nullptr) { | 469 | if (nacp != nullptr) { |
| 475 | out.insert_or_assign(update_label, nacp->GetVersionString()); | 470 | out.insert_or_assign(update_label, nacp->GetVersionString()); |
| 476 | } else { | 471 | } else { |
| 477 | if (installed.HasEntry(update_tid, ContentRecordType::Program)) { | 472 | if (content_provider.HasEntry(update_tid, ContentRecordType::Program)) { |
| 478 | const auto meta_ver = installed.GetEntryVersion(update_tid); | 473 | const auto meta_ver = content_provider.GetEntryVersion(update_tid); |
| 479 | if (meta_ver.value_or(0) == 0) { | 474 | if (meta_ver.value_or(0) == 0) { |
| 480 | out.insert_or_assign(update_label, ""); | 475 | out.insert_or_assign(update_label, ""); |
| 481 | } else { | 476 | } else { |
| @@ -487,8 +482,7 @@ PatchManager::PatchVersionNames PatchManager::GetPatchVersionNames(VirtualFile u | |||
| 487 | } | 482 | } |
| 488 | 483 | ||
| 489 | // General Mods (LayeredFS and IPS) | 484 | // General Mods (LayeredFS and IPS) |
| 490 | const auto mod_dir = | 485 | const auto mod_dir = fs_controller.GetModificationLoadRoot(title_id); |
| 491 | Core::System::GetInstance().GetFileSystemController().GetModificationLoadRoot(title_id); | ||
| 492 | if (mod_dir != nullptr && mod_dir->GetSize() > 0) { | 486 | if (mod_dir != nullptr && mod_dir->GetSize() > 0) { |
| 493 | for (const auto& mod : mod_dir->GetSubdirectories()) { | 487 | for (const auto& mod : mod_dir->GetSubdirectories()) { |
| 494 | std::string types; | 488 | std::string types; |
| @@ -532,13 +526,15 @@ PatchManager::PatchVersionNames PatchManager::GetPatchVersionNames(VirtualFile u | |||
| 532 | } | 526 | } |
| 533 | 527 | ||
| 534 | // DLC | 528 | // DLC |
| 535 | const auto dlc_entries = installed.ListEntriesFilter(TitleType::AOC, ContentRecordType::Data); | 529 | const auto dlc_entries = |
| 530 | content_provider.ListEntriesFilter(TitleType::AOC, ContentRecordType::Data); | ||
| 536 | std::vector<ContentProviderEntry> dlc_match; | 531 | std::vector<ContentProviderEntry> dlc_match; |
| 537 | dlc_match.reserve(dlc_entries.size()); | 532 | dlc_match.reserve(dlc_entries.size()); |
| 538 | 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), |
| 539 | [this, &installed](const ContentProviderEntry& entry) { | 534 | [this](const ContentProviderEntry& entry) { |
| 540 | return (entry.title_id & DLC_BASE_TITLE_ID_MASK) == title_id && | 535 | return GetBaseTitleID(entry.title_id) == title_id && |
| 541 | installed.GetEntry(entry)->GetStatus() == Loader::ResultStatus::Success; | 536 | content_provider.GetEntry(entry)->GetStatus() == |
| 537 | Loader::ResultStatus::Success; | ||
| 542 | }); | 538 | }); |
| 543 | if (!dlc_match.empty()) { | 539 | if (!dlc_match.empty()) { |
| 544 | // Ensure sorted so DLC IDs show in order. | 540 | // Ensure sorted so DLC IDs show in order. |
| @@ -559,19 +555,16 @@ PatchManager::PatchVersionNames PatchManager::GetPatchVersionNames(VirtualFile u | |||
| 559 | } | 555 | } |
| 560 | 556 | ||
| 561 | std::optional<u32> PatchManager::GetGameVersion() const { | 557 | std::optional<u32> PatchManager::GetGameVersion() const { |
| 562 | const auto& installed = Core::System::GetInstance().GetContentProvider(); | ||
| 563 | const auto update_tid = GetUpdateTitleID(title_id); | 558 | const auto update_tid = GetUpdateTitleID(title_id); |
| 564 | if (installed.HasEntry(update_tid, ContentRecordType::Program)) { | 559 | if (content_provider.HasEntry(update_tid, ContentRecordType::Program)) { |
| 565 | return installed.GetEntryVersion(update_tid); | 560 | return content_provider.GetEntryVersion(update_tid); |
| 566 | } | 561 | } |
| 567 | 562 | ||
| 568 | return installed.GetEntryVersion(title_id); | 563 | return content_provider.GetEntryVersion(title_id); |
| 569 | } | 564 | } |
| 570 | 565 | ||
| 571 | PatchManager::Metadata PatchManager::GetControlMetadata() const { | 566 | PatchManager::Metadata PatchManager::GetControlMetadata() const { |
| 572 | const auto& installed = Core::System::GetInstance().GetContentProvider(); | 567 | const auto base_control_nca = content_provider.GetEntry(title_id, ContentRecordType::Control); |
| 573 | |||
| 574 | const auto base_control_nca = installed.GetEntry(title_id, ContentRecordType::Control); | ||
| 575 | if (base_control_nca == nullptr) { | 568 | if (base_control_nca == nullptr) { |
| 576 | return {}; | 569 | return {}; |
| 577 | } | 570 | } |
diff --git a/src/core/file_sys/patch_manager.h b/src/core/file_sys/patch_manager.h index 1f28c6241..fb1853035 100644 --- a/src/core/file_sys/patch_manager.h +++ b/src/core/file_sys/patch_manager.h | |||
| @@ -17,8 +17,13 @@ namespace Core { | |||
| 17 | class System; | 17 | class System; |
| 18 | } | 18 | } |
| 19 | 19 | ||
| 20 | namespace Service::FileSystem { | ||
| 21 | class FileSystemController; | ||
| 22 | } | ||
| 23 | |||
| 20 | namespace FileSys { | 24 | namespace FileSys { |
| 21 | 25 | ||
| 26 | class ContentProvider; | ||
| 22 | class NCA; | 27 | class NCA; |
| 23 | class NACP; | 28 | class NACP; |
| 24 | 29 | ||
| @@ -29,7 +34,9 @@ public: | |||
| 29 | using Metadata = std::pair<std::unique_ptr<NACP>, VirtualFile>; | 34 | using Metadata = std::pair<std::unique_ptr<NACP>, VirtualFile>; |
| 30 | using PatchVersionNames = std::map<std::string, std::string, std::less<>>; | 35 | using PatchVersionNames = std::map<std::string, std::string, std::less<>>; |
| 31 | 36 | ||
| 32 | explicit PatchManager(u64 title_id); | 37 | explicit PatchManager(u64 title_id_, |
| 38 | const Service::FileSystem::FileSystemController& fs_controller_, | ||
| 39 | const ContentProvider& content_provider_); | ||
| 33 | ~PatchManager(); | 40 | ~PatchManager(); |
| 34 | 41 | ||
| 35 | [[nodiscard]] u64 GetTitleID() const; | 42 | [[nodiscard]] u64 GetTitleID() const; |
| @@ -50,7 +57,7 @@ public: | |||
| 50 | 57 | ||
| 51 | // Creates a CheatList object with all | 58 | // Creates a CheatList object with all |
| 52 | [[nodiscard]] std::vector<Core::Memory::CheatEntry> CreateCheatList( | 59 | [[nodiscard]] std::vector<Core::Memory::CheatEntry> CreateCheatList( |
| 53 | const Core::System& system, const BuildID& build_id) const; | 60 | const BuildID& build_id) const; |
| 54 | 61 | ||
| 55 | // Currently tracked RomFS patches: | 62 | // Currently tracked RomFS patches: |
| 56 | // - Game Updates | 63 | // - Game Updates |
| @@ -80,6 +87,8 @@ private: | |||
| 80 | const std::string& build_id) const; | 87 | const std::string& build_id) const; |
| 81 | 88 | ||
| 82 | u64 title_id; | 89 | u64 title_id; |
| 90 | const Service::FileSystem::FileSystemController& fs_controller; | ||
| 91 | const ContentProvider& content_provider; | ||
| 83 | }; | 92 | }; |
| 84 | 93 | ||
| 85 | } // namespace FileSys | 94 | } // namespace FileSys |
diff --git a/src/core/file_sys/registered_cache.cpp b/src/core/file_sys/registered_cache.cpp index da01002d5..431302f55 100644 --- a/src/core/file_sys/registered_cache.cpp +++ b/src/core/file_sys/registered_cache.cpp | |||
| @@ -105,7 +105,8 @@ ContentRecordType GetCRTypeFromNCAType(NCAContentType type) { | |||
| 105 | // TODO(DarkLordZach): Peek at NCA contents to differentiate Manual and Legal. | 105 | // TODO(DarkLordZach): Peek at NCA contents to differentiate Manual and Legal. |
| 106 | return ContentRecordType::HtmlDocument; | 106 | return ContentRecordType::HtmlDocument; |
| 107 | default: | 107 | default: |
| 108 | UNREACHABLE_MSG("Invalid NCAContentType={:02X}", static_cast<u8>(type)); | 108 | UNREACHABLE_MSG("Invalid NCAContentType={:02X}", type); |
| 109 | return ContentRecordType{}; | ||
| 109 | } | 110 | } |
| 110 | } | 111 | } |
| 111 | 112 | ||
diff --git a/src/core/file_sys/registered_cache.h b/src/core/file_sys/registered_cache.h index 5b414b0f0..b08a1687a 100644 --- a/src/core/file_sys/registered_cache.h +++ b/src/core/file_sys/registered_cache.h | |||
| @@ -67,18 +67,18 @@ public: | |||
| 67 | virtual void Refresh() = 0; | 67 | virtual void Refresh() = 0; |
| 68 | 68 | ||
| 69 | virtual bool HasEntry(u64 title_id, ContentRecordType type) const = 0; | 69 | virtual bool HasEntry(u64 title_id, ContentRecordType type) const = 0; |
| 70 | virtual bool HasEntry(ContentProviderEntry entry) const; | 70 | bool HasEntry(ContentProviderEntry entry) const; |
| 71 | 71 | ||
| 72 | virtual std::optional<u32> GetEntryVersion(u64 title_id) const = 0; | 72 | virtual std::optional<u32> GetEntryVersion(u64 title_id) const = 0; |
| 73 | 73 | ||
| 74 | virtual VirtualFile GetEntryUnparsed(u64 title_id, ContentRecordType type) const = 0; | 74 | virtual VirtualFile GetEntryUnparsed(u64 title_id, ContentRecordType type) const = 0; |
| 75 | virtual VirtualFile GetEntryUnparsed(ContentProviderEntry entry) const; | 75 | VirtualFile GetEntryUnparsed(ContentProviderEntry entry) const; |
| 76 | 76 | ||
| 77 | virtual VirtualFile GetEntryRaw(u64 title_id, ContentRecordType type) const = 0; | 77 | virtual VirtualFile GetEntryRaw(u64 title_id, ContentRecordType type) const = 0; |
| 78 | virtual VirtualFile GetEntryRaw(ContentProviderEntry entry) const; | 78 | VirtualFile GetEntryRaw(ContentProviderEntry entry) const; |
| 79 | 79 | ||
| 80 | virtual std::unique_ptr<NCA> GetEntry(u64 title_id, ContentRecordType type) const = 0; | 80 | virtual std::unique_ptr<NCA> GetEntry(u64 title_id, ContentRecordType type) const = 0; |
| 81 | virtual std::unique_ptr<NCA> GetEntry(ContentProviderEntry entry) const; | 81 | std::unique_ptr<NCA> GetEntry(ContentProviderEntry entry) const; |
| 82 | 82 | ||
| 83 | virtual std::vector<ContentProviderEntry> ListEntries() const; | 83 | virtual std::vector<ContentProviderEntry> ListEntries() const; |
| 84 | 84 | ||
diff --git a/src/core/file_sys/romfs_factory.cpp b/src/core/file_sys/romfs_factory.cpp index e967a254e..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" |
| @@ -37,14 +38,37 @@ void RomFSFactory::SetPackedUpdate(VirtualFile update_raw) { | |||
| 37 | } | 38 | } |
| 38 | 39 | ||
| 39 | ResultVal<VirtualFile> RomFSFactory::OpenCurrentProcess(u64 current_process_title_id) const { | 40 | ResultVal<VirtualFile> RomFSFactory::OpenCurrentProcess(u64 current_process_title_id) const { |
| 40 | if (!updatable) | 41 | if (!updatable) { |
| 41 | return MakeResult<VirtualFile>(file); | 42 | return MakeResult<VirtualFile>(file); |
| 43 | } | ||
| 42 | 44 | ||
| 43 | const PatchManager patch_manager(current_process_title_id); | 45 | const PatchManager patch_manager{current_process_title_id, filesystem_controller, |
| 46 | content_provider}; | ||
| 44 | return MakeResult<VirtualFile>( | 47 | return MakeResult<VirtualFile>( |
| 45 | patch_manager.PatchRomFS(file, ivfc_offset, ContentRecordType::Program, update_raw)); | 48 | patch_manager.PatchRomFS(file, ivfc_offset, ContentRecordType::Program, update_raw)); |
| 46 | } | 49 | } |
| 47 | 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 | |||
| 48 | ResultVal<VirtualFile> RomFSFactory::Open(u64 title_id, StorageId storage, | 72 | ResultVal<VirtualFile> RomFSFactory::Open(u64 title_id, StorageId storage, |
| 49 | ContentRecordType type) const { | 73 | ContentRecordType type) const { |
| 50 | 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/savedata_factory.cpp b/src/core/file_sys/savedata_factory.cpp index ba4efee3a..b7bfe0928 100644 --- a/src/core/file_sys/savedata_factory.cpp +++ b/src/core/file_sys/savedata_factory.cpp | |||
| @@ -70,7 +70,8 @@ std::string SaveDataAttribute::DebugInfo() const { | |||
| 70 | static_cast<u8>(rank), index); | 70 | static_cast<u8>(rank), index); |
| 71 | } | 71 | } |
| 72 | 72 | ||
| 73 | SaveDataFactory::SaveDataFactory(VirtualDir save_directory) : dir(std::move(save_directory)) { | 73 | SaveDataFactory::SaveDataFactory(Core::System& system_, VirtualDir save_directory_) |
| 74 | : dir{std::move(save_directory_)}, system{system_} { | ||
| 74 | // Delete all temporary storages | 75 | // Delete all temporary storages |
| 75 | // On hardware, it is expected that temporary storage be empty at first use. | 76 | // On hardware, it is expected that temporary storage be empty at first use. |
| 76 | dir->DeleteSubdirectoryRecursive("temp"); | 77 | dir->DeleteSubdirectoryRecursive("temp"); |
| @@ -83,7 +84,7 @@ ResultVal<VirtualDir> SaveDataFactory::Create(SaveDataSpaceId space, | |||
| 83 | PrintSaveDataAttributeWarnings(meta); | 84 | PrintSaveDataAttributeWarnings(meta); |
| 84 | 85 | ||
| 85 | const auto save_directory = | 86 | const auto save_directory = |
| 86 | GetFullPath(space, meta.type, meta.title_id, meta.user_id, meta.save_id); | 87 | GetFullPath(system, space, meta.type, meta.title_id, meta.user_id, meta.save_id); |
| 87 | 88 | ||
| 88 | auto out = dir->CreateDirectoryRelative(save_directory); | 89 | auto out = dir->CreateDirectoryRelative(save_directory); |
| 89 | 90 | ||
| @@ -100,7 +101,7 @@ ResultVal<VirtualDir> SaveDataFactory::Open(SaveDataSpaceId space, | |||
| 100 | const SaveDataAttribute& meta) const { | 101 | const SaveDataAttribute& meta) const { |
| 101 | 102 | ||
| 102 | const auto save_directory = | 103 | const auto save_directory = |
| 103 | GetFullPath(space, meta.type, meta.title_id, meta.user_id, meta.save_id); | 104 | GetFullPath(system, space, meta.type, meta.title_id, meta.user_id, meta.save_id); |
| 104 | 105 | ||
| 105 | auto out = dir->GetDirectoryRelative(save_directory); | 106 | auto out = dir->GetDirectoryRelative(save_directory); |
| 106 | 107 | ||
| @@ -135,13 +136,14 @@ std::string SaveDataFactory::GetSaveDataSpaceIdPath(SaveDataSpaceId space) { | |||
| 135 | } | 136 | } |
| 136 | } | 137 | } |
| 137 | 138 | ||
| 138 | std::string SaveDataFactory::GetFullPath(SaveDataSpaceId space, SaveDataType type, u64 title_id, | 139 | std::string SaveDataFactory::GetFullPath(Core::System& system, SaveDataSpaceId space, |
| 139 | u128 user_id, u64 save_id) { | 140 | SaveDataType type, u64 title_id, u128 user_id, |
| 141 | u64 save_id) { | ||
| 140 | // According to switchbrew, if a save is of type SaveData and the title id field is 0, it should | 142 | // According to switchbrew, if a save is of type SaveData and the title id field is 0, it should |
| 141 | // be interpreted as the title id of the current process. | 143 | // be interpreted as the title id of the current process. |
| 142 | if (type == SaveDataType::SaveData || type == SaveDataType::DeviceSaveData) { | 144 | if (type == SaveDataType::SaveData || type == SaveDataType::DeviceSaveData) { |
| 143 | if (title_id == 0) { | 145 | if (title_id == 0) { |
| 144 | title_id = Core::System::GetInstance().CurrentProcess()->GetTitleID(); | 146 | title_id = system.CurrentProcess()->GetTitleID(); |
| 145 | } | 147 | } |
| 146 | } | 148 | } |
| 147 | 149 | ||
| @@ -167,7 +169,7 @@ std::string SaveDataFactory::GetFullPath(SaveDataSpaceId space, SaveDataType typ | |||
| 167 | 169 | ||
| 168 | SaveDataSize SaveDataFactory::ReadSaveDataSize(SaveDataType type, u64 title_id, | 170 | SaveDataSize SaveDataFactory::ReadSaveDataSize(SaveDataType type, u64 title_id, |
| 169 | u128 user_id) const { | 171 | u128 user_id) const { |
| 170 | const auto path = GetFullPath(SaveDataSpaceId::NandUser, type, title_id, user_id, 0); | 172 | const auto path = GetFullPath(system, SaveDataSpaceId::NandUser, type, title_id, user_id, 0); |
| 171 | const auto dir = GetOrCreateDirectoryRelative(this->dir, path); | 173 | const auto dir = GetOrCreateDirectoryRelative(this->dir, path); |
| 172 | 174 | ||
| 173 | const auto size_file = dir->GetFile(SAVE_DATA_SIZE_FILENAME); | 175 | const auto size_file = dir->GetFile(SAVE_DATA_SIZE_FILENAME); |
| @@ -182,7 +184,7 @@ SaveDataSize SaveDataFactory::ReadSaveDataSize(SaveDataType type, u64 title_id, | |||
| 182 | 184 | ||
| 183 | void SaveDataFactory::WriteSaveDataSize(SaveDataType type, u64 title_id, u128 user_id, | 185 | void SaveDataFactory::WriteSaveDataSize(SaveDataType type, u64 title_id, u128 user_id, |
| 184 | SaveDataSize new_value) const { | 186 | SaveDataSize new_value) const { |
| 185 | const auto path = GetFullPath(SaveDataSpaceId::NandUser, type, title_id, user_id, 0); | 187 | const auto path = GetFullPath(system, SaveDataSpaceId::NandUser, type, title_id, user_id, 0); |
| 186 | const auto dir = GetOrCreateDirectoryRelative(this->dir, path); | 188 | const auto dir = GetOrCreateDirectoryRelative(this->dir, path); |
| 187 | 189 | ||
| 188 | const auto size_file = dir->CreateFile(SAVE_DATA_SIZE_FILENAME); | 190 | const auto size_file = dir->CreateFile(SAVE_DATA_SIZE_FILENAME); |
diff --git a/src/core/file_sys/savedata_factory.h b/src/core/file_sys/savedata_factory.h index 6625bbbd8..17f774baa 100644 --- a/src/core/file_sys/savedata_factory.h +++ b/src/core/file_sys/savedata_factory.h | |||
| @@ -12,6 +12,10 @@ | |||
| 12 | #include "core/file_sys/vfs.h" | 12 | #include "core/file_sys/vfs.h" |
| 13 | #include "core/hle/result.h" | 13 | #include "core/hle/result.h" |
| 14 | 14 | ||
| 15 | namespace Core { | ||
| 16 | class System; | ||
| 17 | } | ||
| 18 | |||
| 15 | namespace FileSys { | 19 | namespace FileSys { |
| 16 | 20 | ||
| 17 | enum class SaveDataSpaceId : u8 { | 21 | enum class SaveDataSpaceId : u8 { |
| @@ -84,7 +88,7 @@ struct SaveDataSize { | |||
| 84 | /// File system interface to the SaveData archive | 88 | /// File system interface to the SaveData archive |
| 85 | class SaveDataFactory { | 89 | class SaveDataFactory { |
| 86 | public: | 90 | public: |
| 87 | explicit SaveDataFactory(VirtualDir dir); | 91 | explicit SaveDataFactory(Core::System& system_, VirtualDir save_directory_); |
| 88 | ~SaveDataFactory(); | 92 | ~SaveDataFactory(); |
| 89 | 93 | ||
| 90 | ResultVal<VirtualDir> Create(SaveDataSpaceId space, const SaveDataAttribute& meta) const; | 94 | ResultVal<VirtualDir> Create(SaveDataSpaceId space, const SaveDataAttribute& meta) const; |
| @@ -93,8 +97,8 @@ public: | |||
| 93 | VirtualDir GetSaveDataSpaceDirectory(SaveDataSpaceId space) const; | 97 | VirtualDir GetSaveDataSpaceDirectory(SaveDataSpaceId space) const; |
| 94 | 98 | ||
| 95 | static std::string GetSaveDataSpaceIdPath(SaveDataSpaceId space); | 99 | static std::string GetSaveDataSpaceIdPath(SaveDataSpaceId space); |
| 96 | static std::string GetFullPath(SaveDataSpaceId space, SaveDataType type, u64 title_id, | 100 | static std::string GetFullPath(Core::System& system, SaveDataSpaceId space, SaveDataType type, |
| 97 | u128 user_id, u64 save_id); | 101 | u64 title_id, u128 user_id, u64 save_id); |
| 98 | 102 | ||
| 99 | SaveDataSize ReadSaveDataSize(SaveDataType type, u64 title_id, u128 user_id) const; | 103 | SaveDataSize ReadSaveDataSize(SaveDataType type, u64 title_id, u128 user_id) const; |
| 100 | void WriteSaveDataSize(SaveDataType type, u64 title_id, u128 user_id, | 104 | void WriteSaveDataSize(SaveDataType type, u64 title_id, u128 user_id, |
| @@ -102,6 +106,7 @@ public: | |||
| 102 | 106 | ||
| 103 | private: | 107 | private: |
| 104 | VirtualDir dir; | 108 | VirtualDir dir; |
| 109 | Core::System& system; | ||
| 105 | }; | 110 | }; |
| 106 | 111 | ||
| 107 | } // namespace FileSys | 112 | } // namespace FileSys |
diff --git a/src/core/file_sys/submission_package.cpp b/src/core/file_sys/submission_package.cpp index aab957bf2..c05735ddd 100644 --- a/src/core/file_sys/submission_package.cpp +++ b/src/core/file_sys/submission_package.cpp | |||
| @@ -19,41 +19,9 @@ | |||
| 19 | #include "core/loader/loader.h" | 19 | #include "core/loader/loader.h" |
| 20 | 20 | ||
| 21 | namespace FileSys { | 21 | namespace FileSys { |
| 22 | namespace { | ||
| 23 | void SetTicketKeys(const std::vector<VirtualFile>& files) { | ||
| 24 | auto& keys = Core::Crypto::KeyManager::Instance(); | ||
| 25 | 22 | ||
| 26 | for (const auto& ticket_file : files) { | 23 | NSP::NSP(VirtualFile file_, std::size_t program_index) |
| 27 | if (ticket_file == nullptr) { | 24 | : file(std::move(file_)), program_index(program_index), status{Loader::ResultStatus::Success}, |
| 28 | continue; | ||
| 29 | } | ||
| 30 | |||
| 31 | if (ticket_file->GetExtension() != "tik") { | ||
| 32 | continue; | ||
| 33 | } | ||
| 34 | |||
| 35 | if (ticket_file->GetSize() < | ||
| 36 | Core::Crypto::TICKET_FILE_TITLEKEY_OFFSET + sizeof(Core::Crypto::Key128)) { | ||
| 37 | continue; | ||
| 38 | } | ||
| 39 | |||
| 40 | Core::Crypto::Key128 key{}; | ||
| 41 | ticket_file->Read(key.data(), key.size(), Core::Crypto::TICKET_FILE_TITLEKEY_OFFSET); | ||
| 42 | |||
| 43 | // We get the name without the extension in order to create the rights ID. | ||
| 44 | std::string name_only(ticket_file->GetName()); | ||
| 45 | name_only.erase(name_only.size() - 4); | ||
| 46 | |||
| 47 | const auto rights_id_raw = Common::HexStringToArray<16>(name_only); | ||
| 48 | u128 rights_id; | ||
| 49 | std::memcpy(rights_id.data(), rights_id_raw.data(), sizeof(u128)); | ||
| 50 | keys.SetKey(Core::Crypto::S128KeyType::Titlekey, key, rights_id[1], rights_id[0]); | ||
| 51 | } | ||
| 52 | } | ||
| 53 | } // Anonymous namespace | ||
| 54 | |||
| 55 | NSP::NSP(VirtualFile file_) | ||
| 56 | : file(std::move(file_)), status{Loader::ResultStatus::Success}, | ||
| 57 | pfs(std::make_shared<PartitionFilesystem>(file)), keys{Core::Crypto::KeyManager::Instance()} { | 25 | pfs(std::make_shared<PartitionFilesystem>(file)), keys{Core::Crypto::KeyManager::Instance()} { |
| 58 | if (pfs->GetStatus() != Loader::ResultStatus::Success) { | 26 | if (pfs->GetStatus() != Loader::ResultStatus::Success) { |
| 59 | status = pfs->GetStatus(); | 27 | status = pfs->GetStatus(); |
| @@ -178,7 +146,7 @@ std::shared_ptr<NCA> NSP::GetNCA(u64 title_id, ContentRecordType type, TitleType | |||
| 178 | if (extracted) | 146 | if (extracted) |
| 179 | LOG_WARNING(Service_FS, "called on an NSP that is of type extracted."); | 147 | LOG_WARNING(Service_FS, "called on an NSP that is of type extracted."); |
| 180 | 148 | ||
| 181 | const auto title_id_iter = ncas.find(title_id); | 149 | const auto title_id_iter = ncas.find(title_id + program_index); |
| 182 | if (title_id_iter == ncas.end()) | 150 | if (title_id_iter == ncas.end()) |
| 183 | return nullptr; | 151 | return nullptr; |
| 184 | 152 | ||
| @@ -232,6 +200,35 @@ VirtualDir NSP::GetParentDirectory() const { | |||
| 232 | return file->GetContainingDirectory(); | 200 | return file->GetContainingDirectory(); |
| 233 | } | 201 | } |
| 234 | 202 | ||
| 203 | void NSP::SetTicketKeys(const std::vector<VirtualFile>& files) { | ||
| 204 | for (const auto& ticket_file : files) { | ||
| 205 | if (ticket_file == nullptr) { | ||
| 206 | continue; | ||
| 207 | } | ||
| 208 | |||
| 209 | if (ticket_file->GetExtension() != "tik") { | ||
| 210 | continue; | ||
| 211 | } | ||
| 212 | |||
| 213 | if (ticket_file->GetSize() < | ||
| 214 | Core::Crypto::TICKET_FILE_TITLEKEY_OFFSET + sizeof(Core::Crypto::Key128)) { | ||
| 215 | continue; | ||
| 216 | } | ||
| 217 | |||
| 218 | Core::Crypto::Key128 key{}; | ||
| 219 | ticket_file->Read(key.data(), key.size(), Core::Crypto::TICKET_FILE_TITLEKEY_OFFSET); | ||
| 220 | |||
| 221 | // We get the name without the extension in order to create the rights ID. | ||
| 222 | std::string name_only(ticket_file->GetName()); | ||
| 223 | name_only.erase(name_only.size() - 4); | ||
| 224 | |||
| 225 | const auto rights_id_raw = Common::HexStringToArray<16>(name_only); | ||
| 226 | u128 rights_id; | ||
| 227 | std::memcpy(rights_id.data(), rights_id_raw.data(), sizeof(u128)); | ||
| 228 | keys.SetKey(Core::Crypto::S128KeyType::Titlekey, key, rights_id[1], rights_id[0]); | ||
| 229 | } | ||
| 230 | } | ||
| 231 | |||
| 235 | void NSP::InitializeExeFSAndRomFS(const std::vector<VirtualFile>& files) { | 232 | void NSP::InitializeExeFSAndRomFS(const std::vector<VirtualFile>& files) { |
| 236 | exefs = pfs; | 233 | exefs = pfs; |
| 237 | 234 | ||
| @@ -286,12 +283,31 @@ void NSP::ReadNCAs(const std::vector<VirtualFile>& files) { | |||
| 286 | } | 283 | } |
| 287 | 284 | ||
| 288 | auto next_nca = std::make_shared<NCA>(std::move(next_file), nullptr, 0); | 285 | auto next_nca = std::make_shared<NCA>(std::move(next_file), nullptr, 0); |
| 286 | |||
| 289 | if (next_nca->GetType() == NCAContentType::Program) { | 287 | if (next_nca->GetType() == NCAContentType::Program) { |
| 290 | program_status[next_nca->GetTitleId()] = next_nca->GetStatus(); | 288 | program_status[next_nca->GetTitleId()] = next_nca->GetStatus(); |
| 291 | } | 289 | } |
| 292 | if (next_nca->GetStatus() == Loader::ResultStatus::Success || | 290 | |
| 293 | (next_nca->GetStatus() == Loader::ResultStatus::ErrorMissingBKTRBaseRomFS && | 291 | if (next_nca->GetStatus() != Loader::ResultStatus::Success && |
| 294 | (next_nca->GetTitleId() & 0x800) != 0)) { | 292 | next_nca->GetStatus() != Loader::ResultStatus::ErrorMissingBKTRBaseRomFS) { |
| 293 | continue; | ||
| 294 | } | ||
| 295 | |||
| 296 | // If the last 3 hexadecimal digits of the CNMT TitleID is 0x800 or is missing the | ||
| 297 | // BKTRBaseRomFS, this is an update NCA. Otherwise, this is a base NCA. | ||
| 298 | if ((cnmt.GetTitleID() & 0x800) != 0 || | ||
| 299 | next_nca->GetStatus() == Loader::ResultStatus::ErrorMissingBKTRBaseRomFS) { | ||
| 300 | // If the last 3 hexadecimal digits of the NCA's TitleID is between 0x1 and | ||
| 301 | // 0x7FF, this is a multi-program update NCA. Otherwise, this is a regular | ||
| 302 | // update NCA. | ||
| 303 | if ((next_nca->GetTitleId() & 0x7FF) != 0 && | ||
| 304 | (next_nca->GetTitleId() & 0x800) == 0) { | ||
| 305 | ncas[next_nca->GetTitleId()][{cnmt.GetType(), rec.type}] = | ||
| 306 | std::move(next_nca); | ||
| 307 | } else { | ||
| 308 | ncas[cnmt.GetTitleID()][{cnmt.GetType(), rec.type}] = std::move(next_nca); | ||
| 309 | } | ||
| 310 | } else { | ||
| 295 | ncas[next_nca->GetTitleId()][{cnmt.GetType(), rec.type}] = std::move(next_nca); | 311 | ncas[next_nca->GetTitleId()][{cnmt.GetType(), rec.type}] = std::move(next_nca); |
| 296 | } | 312 | } |
| 297 | } | 313 | } |
diff --git a/src/core/file_sys/submission_package.h b/src/core/file_sys/submission_package.h index 2db5e46b8..54581a6f3 100644 --- a/src/core/file_sys/submission_package.h +++ b/src/core/file_sys/submission_package.h | |||
| @@ -27,7 +27,7 @@ enum class ContentRecordType : u8; | |||
| 27 | 27 | ||
| 28 | class NSP : public ReadOnlyVfsDirectory { | 28 | class NSP : public ReadOnlyVfsDirectory { |
| 29 | public: | 29 | public: |
| 30 | explicit NSP(VirtualFile file); | 30 | explicit NSP(VirtualFile file, std::size_t program_index = 0); |
| 31 | ~NSP() override; | 31 | ~NSP() override; |
| 32 | 32 | ||
| 33 | Loader::ResultStatus GetStatus() const; | 33 | Loader::ResultStatus GetStatus() const; |
| @@ -63,11 +63,14 @@ public: | |||
| 63 | VirtualDir GetParentDirectory() const override; | 63 | VirtualDir GetParentDirectory() const override; |
| 64 | 64 | ||
| 65 | private: | 65 | private: |
| 66 | void SetTicketKeys(const std::vector<VirtualFile>& files); | ||
| 66 | void InitializeExeFSAndRomFS(const std::vector<VirtualFile>& files); | 67 | void InitializeExeFSAndRomFS(const std::vector<VirtualFile>& files); |
| 67 | void ReadNCAs(const std::vector<VirtualFile>& files); | 68 | void ReadNCAs(const std::vector<VirtualFile>& files); |
| 68 | 69 | ||
| 69 | VirtualFile file; | 70 | VirtualFile file; |
| 70 | 71 | ||
| 72 | const std::size_t program_index; | ||
| 73 | |||
| 71 | bool extracted = false; | 74 | bool extracted = false; |
| 72 | Loader::ResultStatus status; | 75 | Loader::ResultStatus status; |
| 73 | std::map<u64, Loader::ResultStatus> program_status; | 76 | std::map<u64, Loader::ResultStatus> program_status; |
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/system_archive/system_version.cpp b/src/core/file_sys/system_archive/system_version.cpp index aa313de66..7bfbc9a67 100644 --- a/src/core/file_sys/system_archive/system_version.cpp +++ b/src/core/file_sys/system_archive/system_version.cpp | |||
| @@ -12,17 +12,17 @@ namespace SystemVersionData { | |||
| 12 | // This section should reflect the best system version to describe yuzu's HLE api. | 12 | // This section should reflect the best system version to describe yuzu's HLE api. |
| 13 | // TODO(DarkLordZach): Update when HLE gets better. | 13 | // TODO(DarkLordZach): Update when HLE gets better. |
| 14 | 14 | ||
| 15 | constexpr u8 VERSION_MAJOR = 10; | 15 | constexpr u8 VERSION_MAJOR = 11; |
| 16 | constexpr u8 VERSION_MINOR = 0; | 16 | constexpr u8 VERSION_MINOR = 0; |
| 17 | constexpr u8 VERSION_MICRO = 2; | 17 | constexpr u8 VERSION_MICRO = 0; |
| 18 | 18 | ||
| 19 | constexpr u8 REVISION_MAJOR = 1; | 19 | constexpr u8 REVISION_MAJOR = 5; |
| 20 | constexpr u8 REVISION_MINOR = 0; | 20 | constexpr u8 REVISION_MINOR = 0; |
| 21 | 21 | ||
| 22 | constexpr char PLATFORM_STRING[] = "NX"; | 22 | constexpr char PLATFORM_STRING[] = "NX"; |
| 23 | constexpr char VERSION_HASH[] = "f90143fa8bbc061d4f68c35f95f04f8080c0ecdc"; | 23 | constexpr char VERSION_HASH[] = "34197eba8810e2edd5e9dfcfbde7b340882e856d"; |
| 24 | constexpr char DISPLAY_VERSION[] = "10.0.2"; | 24 | constexpr char DISPLAY_VERSION[] = "11.0.0"; |
| 25 | constexpr char DISPLAY_TITLE[] = "NintendoSDK Firmware for NX 10.0.2-1.0"; | 25 | constexpr char DISPLAY_TITLE[] = "NintendoSDK Firmware for NX 11.0.0-5.0"; |
| 26 | 26 | ||
| 27 | } // namespace SystemVersionData | 27 | } // namespace SystemVersionData |
| 28 | 28 | ||
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); |