Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
b148d5f
Restore server-side vendor reputation turn-ins
gagefulwood Sep 16, 2026
a5834f7
Award owned faction engrams on newly crossed reputation ranks
gagefulwood Sep 16, 2026
c30bf7e
Reconstruct faction claim credits and atomic Vanguard rewards
gagefulwood Sep 17, 2026
f2f675a
Settle faction reward sales through shared credit transactions
gagefulwood Sep 17, 2026
727ae43
Support Gunsmith weapon rewards through shared faction claims
gagefulwood Sep 17, 2026
ba7e7a0
Merge Sunrise 0.5 while retaining faction reward transactions
gagefulwood Sep 18, 2026
8b0d1a1
Derive faction rank credits from installed progression steps
gagefulwood Sep 23, 2026
a70ccd8
Read faction reward gear from installed package lists
gagefulwood Sep 23, 2026
8b0284c
Extract runtime reward definitions and resolve server grants
throgsoft Sep 23, 2026
1f45472
Support version-3 investment saves in vendor reputation build
gagefulwood Sep 23, 2026
5455c17
Use authored faction rank costs and reward-list slot
gagefulwood Sep 23, 2026
101f63c
Merge remote-tracking branch 'refs/remotes/throg/runtime-item-definit…
gagefulwood Sep 23, 2026
f20c6ff
Update vendor reputation test fixture for runtime rewards
gagefulwood Sep 23, 2026
ce7a348
Route vendor rank claims through installed reward grants
gagefulwood Sep 23, 2026
ae6d359
Handle site-only entries in vendor rank rewards
gagefulwood Sep 23, 2026
fcba022
test: preserve vendor rank credit when gear bucket is full
gagefulwood Sep 23, 2026
35baf8b
Tighten reward definition ownership and validation
throgsoft Sep 23, 2026
8e28078
Preserve queued grants on presentation failure and correct pool selec…
throgsoft Sep 23, 2026
62935d9
Preserve required reward mappings and finish review cleanup
throgsoft Sep 23, 2026
cab821f
fix: publish spent vendor reward credit in character snapshot
gagefulwood Sep 23, 2026
d72907b
Report vendor rank reward refusal stages
gagefulwood Sep 23, 2026
af175a2
Resolve supplemental reward rows and drop the unused entry discriminator
throgsoft Sep 24, 2026
a444712
Remove residual vendor review changes
gagefulwood Sep 24, 2026
499fee2
Merge updated runtime item definitions
gagefulwood Sep 24, 2026
089226e
Share one unlock-expression evaluator and tighten reward layering
throgsoft Sep 24, 2026
481840e
Read faction rank repetition from installed progressions
gagefulwood Sep 24, 2026
395726f
Resolve vendor progression from installed faction rows
gagefulwood Sep 24, 2026
a861d87
Keep vendor verification outside contribution branch
gagefulwood Sep 24, 2026
5127ddd
Load faction turn-ins from build-era sale definitions
gagefulwood Sep 24, 2026
5385271
Decode native vendor condition programs
gagefulwood Sep 24, 2026
3266981
Evaluate installed vendor rank reward gates
gagefulwood Sep 24, 2026
6330711
Bind faction claim credit to native interaction value
gagefulwood Sep 24, 2026
b94a568
Resolve sale-backed faction rewards from installed vendor gates
gagefulwood Sep 24, 2026
6b5129f
Separate reconstructed rank-claim links from vendor settlement
gagefulwood Sep 24, 2026
28c3de8
Merge runtime item definitions with vendor rank rewards
gagefulwood Sep 24, 2026
09fac14
Extract runtime reward definitions and resolve server grants
throgsoft Sep 23, 2026
dc882fe
Tighten reward definition ownership and validation
throgsoft Sep 23, 2026
03ea7b4
Preserve queued grants on presentation failure and correct pool selec…
throgsoft Sep 23, 2026
5709f95
Preserve required reward mappings and finish review cleanup
throgsoft Sep 23, 2026
e07a7fe
Resolve supplemental reward rows and drop the unused entry discriminator
throgsoft Sep 24, 2026
dc6774b
Share one unlock-expression evaluator and tighten reward layering
throgsoft Sep 24, 2026
6510bc0
Retire unresolvable world rewards and load cached pass rows
throgsoft Sep 27, 2026
6ac6117
Bump the cache format version past upstream
throgsoft Sep 27, 2026
05ce3ea
Defer unlock-gated rewards, draw record rewards in full frames, and w…
throgsoft Sep 27, 2026
4a9fe86
Merge runtime reward updates and finalize vendor rewards
gagefulwood Sep 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 20 additions & 2 deletions Sunrise/Sunrise.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,11 @@
<None Include="vendor\lua\UPSTREAM_README" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="src\state\build_data\cache\records\cache_reward_records.cpp" />
<ClCompile Include="src\client\content\items\packages\package_reward_build.cpp" />
<ClCompile Include="src\state\rewards\reward_resolver.cpp" />
<ClCompile Include="src\state\build_data\rewards\reward_catalog.cpp" />
<ClCompile Include="src\state\build_data\rewards\reward_build_data_runtime.cpp" />
<ClCompile Include="src\state\gameplay\external\entity_object_types.cpp" />
<ClCompile Include="src\state\investment\investment_account_store.cpp" />
<ClCompile Include="src\state\investment\investment_database.cpp" />
Expand Down Expand Up @@ -155,6 +160,8 @@
<ClCompile Include="src\state\runtime\state_account_equipment_runtime.cpp" />
<ClCompile Include="src\state\runtime\state_account_identity_runtime.cpp" />
<ClCompile Include="src\state\runtime\state_account_profile_runtime.cpp" />
<ClCompile Include="src\state\runtime\state_vendor_reputation_runtime.cpp" />
<ClInclude Include="src\state\runtime\state_vendor_reputation_runtime.h" />
<ClCompile Include="src\state\runtime\state_account_socket_runtime.cpp" />
<ClCompile Include="src\state\runtime\state_account_settings_runtime.cpp" />
<ClCompile Include="src\state\runtime\state_rolled_socket_plugs.cpp" />
Expand Down Expand Up @@ -641,9 +648,12 @@
<ClCompile Include="src\state\build_data\cache\records\cache_spawn_set_records.cpp" />
<ClCompile Include="src\state\build_data\cache\records\cache_vendor_records.cpp" />
<ClCompile Include="src\state\build_data\vendors\vendor_catalog.cpp" />
<ClCompile Include="src\state\build_data\vendors\reputation_sale_catalog.cpp" />
<ClCompile Include="src\state\build_data\vendors\artifact_sale_view.cpp" />
<ClCompile Include="src\state\build_data\vendors\vendor_expression.cpp" />
<ClCompile Include="src\state\build_data\vendors\vendor_gate_catalog.cpp" />
<ClCompile Include="src\state\unlocks\unlocks_expression.cpp" />
<ClCompile Include="src\client\content\vendors\package_vendor_build.cpp" />
<ClCompile Include="src\client\content\vendors\package_vendor_gate_build.cpp" />
<ClCompile Include="src\state\build_data\cache\records\cache_hash_name_records.cpp" />
<ClCompile Include="src\state\build_data\cache\records\cache_entity_metadata_records.cpp" />
<ClCompile Include="src\state\build_data\cache\records\cache_detail_links.cpp" />
Expand Down Expand Up @@ -1254,6 +1264,11 @@
<ClCompile Remove="vendor\lua\lzio.c" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="src\middleware\content\packages\tables\field_reader.h" />
<ClInclude Include="src\client\content\items\packages\package_reward_build.h" />
<ClInclude Include="src\state\rewards\reward_resolver.h" />
<ClInclude Include="src\state\build_data\rewards\reward_catalog.h" />
<ClInclude Include="src\state\build_data\rewards\definition.h" />
<ClInclude Include="resources\resource.h" />
<ClInclude Include="src\core\logging\log.h" />
<ClInclude Include="src\core\logging\snapshot\snapshot.h" />
Expand Down Expand Up @@ -1510,7 +1525,10 @@
<ClInclude Include="src\state\build_data\spawn_sets\definition.h" />
<ClInclude Include="src\state\build_data\vendors\definition.h" />
<ClInclude Include="src\state\build_data\vendors\vendor_catalog.h" />
<ClInclude Include="src\state\build_data\vendors\vendor_expression.h" />
<ClInclude Include="src\state\build_data\vendors\reconstructed_rank_claim_links.h" />
<ClInclude Include="src\state\build_data\vendors\reputation_sale_catalog.h" />
<ClInclude Include="src\state\build_data\vendors\vendor_gate_catalog.h" />
<ClInclude Include="src\state\unlocks\unlocks_expression.h" />
<ClInclude Include="src\client\content\vendors\layout.h" />
<ClInclude Include="src\client\content\vendors\vendor_build.h" />
<ClInclude Include="src\state\build_data\scenarios\definition.h" />
Expand Down
9 changes: 8 additions & 1 deletion Sunrise/resources/database/investment_schema.sql
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
PRAGMA application_id = 1397902921;
PRAGMA user_version = 2;
PRAGMA user_version = 3;

CREATE TABLE account (
id INTEGER PRIMARY KEY CHECK (id = 1),
Expand Down Expand Up @@ -99,6 +99,13 @@ CREATE TABLE family5 (
UNIQUE (kind, slot)
) STRICT;

CREATE TABLE character_objective_values (
character_soid INTEGER NOT NULL REFERENCES characters(soid) DEFERRABLE INITIALLY DEFERRED,
slot INTEGER NOT NULL CHECK (slot BETWEEN 0 AND 32767),
value INTEGER NOT NULL CHECK (value BETWEEN 0 AND 2147483647),
PRIMARY KEY (character_soid, slot)
) STRICT;

CREATE TABLE entitlements (
position INTEGER PRIMARY KEY,
name TEXT NOT NULL,
Expand Down
68 changes: 68 additions & 0 deletions Sunrise/resources/database/vendor_reputation_content.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
-- Build 86657.20.08.23.1800-9: authored Vendor itemList and Faction tokenValues.
-- Faction/Progression component: 83e9ee00-d5d1-453c-b454-ea08c1acefb4.
-- Decompressed Vendor SHA256: 649c78fc84b97070c7e859d6d587f162d7264a21f403d319de5a087d6ccc05c1.
-- Decompressed Faction SHA256: 8f6a3ec405b8c891935764e4a3c27a202029207f9d951c2054e6ae135bf2288e.
-- Static build data is memory-only, not player state; vendor sales and faction links are rechecked.

-- Sale/category indexes are vendor-local. Hash columns name manifest definitions.
-- Each transaction awards cost_quantity * xp_per_unit; the rate is per charged item.
CREATE TABLE reputation_sales (
vendor_hash INTEGER NOT NULL,
sale_index INTEGER NOT NULL,
faction_hash INTEGER NOT NULL,
placeholder_hash INTEGER NOT NULL,
cost_hash INTEGER NOT NULL,
category_index INTEGER NOT NULL,
cost_quantity INTEGER NOT NULL,
xp_per_unit INTEGER NOT NULL,
PRIMARY KEY (vendor_hash, sale_index)
) WITHOUT ROWID;

-- Zavala (69482069), Vanguard Tactical faction (611314723), turn-in category 2.
-- Vanguard Tactician Rewards placeholder (3987308529), Vanguard Tactician Token (3899548068).
INSERT INTO reputation_sales
(vendor_hash, sale_index, faction_hash, placeholder_hash, cost_hash,
category_index, cost_quantity, xp_per_unit) VALUES
(69482069, 2, 611314723, 3987308529, 3899548068, 2, 1, 100),
(69482069, 3, 611314723, 3987308529, 3899548068, 2, 5, 100),
(69482069, 4, 611314723, 3987308529, 3899548068, 2, 10, 100);

-- Devrim Kay (396892126), EDZ faction (4235119312), turn-in category 4.
-- EDZ Rewards placeholder (61430328), EDZ Token (2640973641).
INSERT INTO reputation_sales
(vendor_hash, sale_index, faction_hash, placeholder_hash, cost_hash,
category_index, cost_quantity, xp_per_unit) VALUES
(396892126, 32, 4235119312, 61430328, 2640973641, 4, 1, 100),
(396892126, 33, 4235119312, 61430328, 2640973641, 4, 5, 100),
(396892126, 34, 4235119312, 61430328, 2640973641, 4, 10, 100),
-- Destination-material placeholder (1317670974), Dusklight Shard (950899352).
(396892126, 35, 4235119312, 1317670974, 950899352, 4, 1, 50),
(396892126, 36, 4235119312, 1317670974, 950899352, 4, 5, 50),
(396892126, 37, 4235119312, 1317670974, 950899352, 4, 10, 50),
-- The same placeholder accepts Dusklight Crystal (478751073) at a separate XP rate.
(396892126, 38, 4235119312, 1317670974, 478751073, 4, 1, 250),
(396892126, 39, 4235119312, 1317670974, 478751073, 4, 5, 250),
(396892126, 40, 4235119312, 1317670974, 478751073, 4, 10, 250);

-- Banshee-44 (672118013), Gunsmith faction (1021210278), turn-in category 7.
-- Gunsmith Rewards placeholder (3831705402), Gunsmith Materials (685157383).
INSERT INTO reputation_sales
(vendor_hash, sale_index, faction_hash, placeholder_hash, cost_hash,
category_index, cost_quantity, xp_per_unit) VALUES
(672118013, 2, 1021210278, 3831705402, 685157383, 7, 1, 30),
(672118013, 3, 1021210278, 3831705402, 685157383, 7, 5, 30),
(672118013, 4, 1021210278, 3831705402, 685157383, 7, 10, 30),
(672118013, 5, 1021210278, 3831705402, 685157383, 7, 25, 30),
-- The same placeholder accepts Weapon Telemetry (685157381) at a separate XP rate.
(672118013, 6, 1021210278, 3831705402, 685157381, 7, 1, 25),
(672118013, 7, 1021210278, 3831705402, 685157381, 7, 5, 25),
(672118013, 8, 1021210278, 3831705402, 685157381, 7, 10, 25);

-- Shaxx (3603221665), Crucible faction (697030790), turn-in category 8.
-- Crucible Rewards placeholder (265113466), Crucible Token (183980811).
INSERT INTO reputation_sales
(vendor_hash, sale_index, faction_hash, placeholder_hash, cost_hash,
category_index, cost_quantity, xp_per_unit) VALUES
(3603221665, 2, 697030790, 265113466, 183980811, 8, 1, 100),
(3603221665, 3, 697030790, 265113466, 183980811, 8, 5, 100),
(3603221665, 4, 697030790, 265113466, 183980811, 8, 10, 100);
2 changes: 2 additions & 0 deletions Sunrise/resources/resource.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,3 +47,5 @@
/** Account preferences have their own schema and seed data in the save. */
#define IDR_ACCOUNT_SETTINGS_SCHEMA 109
#define IDR_ACCOUNT_SETTINGS_DEFAULTS 110
/** Build-scoped vendor turn-in definitions are static content, not player-save rows. */
#define IDR_VENDOR_REPUTATION_CONTENT 111
1 change: 1 addition & 0 deletions Sunrise/resources/sunrise.rc
Original file line number Diff line number Diff line change
Expand Up @@ -61,3 +61,4 @@ IDR_SQLITE_NOTICE RCDATA "../vendor/sqlite/NOTICE.txt"

IDR_ACCOUNT_SETTINGS_SCHEMA RCDATA "database/account_settings_schema.sql"
IDR_ACCOUNT_SETTINGS_DEFAULTS RCDATA "database/account_settings_defaults.sql"
IDR_VENDOR_REPUTATION_CONTENT RCDATA "database/vendor_reputation_content.sql"
19 changes: 11 additions & 8 deletions Sunrise/src/client/content/items/packages/internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
#include "../../../../state/build_data/runtime.h"
#include "../../../../state/build_data/season_pass/definition.h"
#include "../../../../state/build_data/sobjects/sobject_catalog.h"
#include "package_reward_build.h"

namespace sunrise::client::content::items::packages {

Expand Down Expand Up @@ -70,9 +71,10 @@ static_assert(kUnmappedSlot
/** Bank index per unlock slot, indexed by slot. The first mapping row of a slot wins. */
using SlotMap = std::array<std::uint16_t, kSlotSpace>;

/** The four maps one root's two unlock mapping tables carry. 256 KiB together. */
/** Saved-bank indices resolved from the root's flag and value mapping tables. */
struct SlotMaps {
SlotMap accountFlag{};
SlotMap profileFlag{};
SlotMap characterFlag{};
SlotMap accountValue{};
SlotMap characterValue{};
Expand All @@ -83,6 +85,8 @@ struct Storage {
reader::Scratch scratch{};
/** Read once per root. Every domain resolves its unlock slots through these. */
SlotMaps slotMaps{};
/** Reward pools, wrappers and condition tables read alongside the item walk. */
RewardBuild rewardBuild{};
/** Node rows held until the value slot and owned records are resolved. */
std::array<state::build_data::nodes::Definition, state::build_data::nodes::kDefinitionCapacity>
nodeRows{};
Expand Down Expand Up @@ -154,15 +158,11 @@ struct Storage {
state::build_data::progressions::kStepCapacity>
progressionSteps{};
std::size_t progressionStepCount{};
/** Season pass reward rows and the wrapper items they grant. */
/** Season pass reward rows in native claim order. */
std::array<state::build_data::season_pass::Reward,
state::build_data::season_pass::kRewardCapacity>
seasonPassRewards{};
std::array<state::build_data::season_pass::Package,
state::build_data::season_pass::kPackageCapacity>
seasonPassPackages{};
std::size_t seasonPassRewardCount{};
std::size_t seasonPassPackageCount{};
/** Repeatable bounty rows, keyed by the item-type pair their pool shares. */
std::array<state::build_data::bounties::Definition,
state::build_data::bounties::kDefinitionCapacity>
Expand Down Expand Up @@ -207,6 +207,9 @@ struct Storage {
/** @return True when the catalyst catalog is published or cannot exist on this executable. */
[[nodiscard]] bool exotic_catalysts_settled() noexcept;

/** @return True when the reward graph is published or can never be. */
[[nodiscard]] bool reward_definitions_settled() noexcept;

/** Adds one native definition index to the deduplicated request set. */
void request(std::uint16_t definitionIndex, DetailRequests& requested) noexcept;

Expand Down Expand Up @@ -324,7 +327,7 @@ read_investment_constants(const reader::Source& source,
/**
* Reads one root's two unlock mapping tables into the pass slot maps.
* @param source Package source.
* @param storage Pass storage receiving the four maps.
* @param storage Pass storage receiving the five maps.
* @param root Investment root bytes.
* @return True when both account maps read. A character map may stay unmapped.
*/
Expand Down Expand Up @@ -379,7 +382,7 @@ read_investment_constants(const reader::Source& source,
std::span<state::build_data::progressions::Step> steps,
std::size_t& stepCount) noexcept;

/** Reads the season pass reward list and the wrapper items it grants. */
/** Reads the season pass reward list, keeping an unreadable row as an unavailable one. */
[[nodiscard]] bool build_season_pass(const reader::Source& source,
Storage& storage,
std::span<const std::byte> root) noexcept;
Expand Down
41 changes: 31 additions & 10 deletions Sunrise/src/client/content/items/packages/package_item_build.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#include "../../../../middleware/content/packages/tables/definition_index_table.h"
#include "../../../../state/build_data/activities/activity_catalog.h"
#include "../../../../state/build_data/runtime.h"
#include "../../../../state/build_data/vendors/vendor_gate_catalog.h"
#include "../../activity/activity_catalog_build.h"
#include "../../activity/entity_position_profile_build.h"
#include "../../hash_names/hash_name_build.h"
Expand All @@ -17,6 +18,7 @@
#include "../../vendors/vendor_build.h"
#include "build.h"
#include "internal.h"
#include "package_reward_build.h"
#include "package_socket_plug_build.h"

namespace sunrise::client::content::items::packages {
Expand All @@ -34,7 +36,7 @@ namespace {
&& state::build_data::ability_buckets_ready()
&& state::build_data::socket_entry_buckets_ready()
&& state::build_data::progression_definitions_ready()
&& state::build_data::season_pass_ready()
&& state::build_data::season_pass_ready() && reward_definitions_settled()
&& state::build_data::repeatable_bounties_ready()
&& state::build_data::record_definitions_ready()
&& state::build_data::node_definitions_ready()
Expand All @@ -48,7 +50,7 @@ namespace {
bool ready() noexcept {
return root_domains_ready() && state::build_data::scenario_layouts_ready()
&& state::build_data::spawn_sets_ready() && state::build_data::hash_names_ready()
&& state::build_data::vendor_catalog_ready()
&& state::build_data::vendor_catalog_ready() && state::build_data::vendors::gates_ready()
&& content::activity::entity_position_profiles::ready()
&& (state::build_data::activities::ready()
|| state::build_data::activities::extraction_failed());
Expand Down Expand Up @@ -89,7 +91,7 @@ bool build() noexcept {
return true;
}
}
if (root_domains_ready()) {
if (root_domains_ready() && state::build_data::vendors::gates_ready()) {
SecureZeroMemory(&keys, sizeof keys);
return ready();
}
Expand Down Expand Up @@ -126,7 +128,8 @@ bool build() noexcept {
if (!state::build_data::item_definitions_ready()
|| !state::build_data::record_definitions_ready()
|| !state::build_data::node_definitions_ready()
|| !state::build_data::season_pass_ready() || !exotic_catalysts_settled()) {
|| !state::build_data::season_pass_ready() || !reward_definitions_settled()
|| !exotic_catalysts_settled() || !state::build_data::vendors::gates_ready()) {
reason = "unlock_maps";
if (!read_unlock_slot_maps(
source, storage, std::span<const std::byte>{storage.root})) {
Expand Down Expand Up @@ -184,11 +187,18 @@ bool build() noexcept {
std::span(storage.progressionSteps).first(storage.progressionStepCount));
}
}
if (!state::build_data::season_pass_ready()
&& build_season_pass(source, storage, std::span<const std::byte>{storage.root})) {
(void)state::build_data::publish_season_pass(
std::span(storage.seasonPassRewards).first(storage.seasonPassRewardCount),
std::span(storage.seasonPassPackages).first(storage.seasonPassPackageCount));
// Pass rows bind through the reward condition tables, which load before the pools.
if (!reward_definitions_settled() || !state::build_data::season_pass_ready()) {
(void)storage.rewardBuild.load(
source, storage.scratch, storage.root, storage.slotMaps);
}
if (!state::build_data::season_pass_ready() && storage.rewardBuild.conditions.loaded()
&& build_season_pass(source, storage, std::span<const std::byte>{storage.root})
&& !state::build_data::publish_season_pass(
std::span(storage.seasonPassRewards).first(storage.seasonPassRewardCount))) {
core::log::write(core::log::Channel::client,
core::log::Level::warn,
"ev=pkg stage=season_pass result=fail reason=publish");
}
// Records are read before nodes: a node's lore-book flag and its parent bar come
// from the records it owns, so the record rows must already be in pass storage.
Expand Down Expand Up @@ -232,7 +242,9 @@ bool build() noexcept {
table)
&& table.elementClass == tables::kItemIndexTableClass;
}
if (located && build_item_rows(source, storage, table, rowCount, reason)) {
const bool rowsBuilt = located && !root_domains_ready()
&& build_item_rows(source, storage, table, rowCount, reason);
if (rowsBuilt) {
if (!build_material_requirements(
source, storage, std::span<const std::byte>{storage.root}, table.count)) {
reason = "materials";
Expand All @@ -247,6 +259,15 @@ bool build() noexcept {
std::span(storage.bountyRows).first(storage.bountyCount));
}
}
if (root_domains_ready() && !state::build_data::vendors::gates_ready()) {
reason = "vendor_gates";
const content::vendors::GateMaps maps{storage.slotMaps.accountFlag,
storage.slotMaps.profileFlag,
storage.slotMaps.characterFlag,
storage.slotMaps.accountValue,
storage.slotMaps.characterValue};
(void)content::vendors::build_gates(source, storage.scratch, maps);
}
}
SecureZeroMemory(&keys, sizeof keys);
const bool complete = ready();
Expand Down
Loading
Loading