From 695404165bc799f42bddf6e0987f50500cbca9b1 Mon Sep 17 00:00:00 2001 From: Martin Michelsen Date: Sun, 7 Jan 2024 21:33:10 -0800 Subject: [PATCH] add support for all versions in ItemParameterTable --- TODO.md | 1 + src/ItemNameIndex.cc | 360 ++++++- src/ItemNameIndex.hh | 2 + src/ItemParameterTable.cc | 982 ++++++++++++------ src/ItemParameterTable.hh | 449 +++++--- src/Main.cc | 52 +- src/PlayerSubordinates.cc | 11 +- src/ReceiveSubcommands.cc | 20 +- src/SendCommands.cc | 9 +- src/ServerState.cc | 103 +- src/ServerState.hh | 8 +- ...morRandom-gc.rel => ArmorRandom-gc-v3.rel} | Bin system/item-tables/ItemCT-dc-v2.afs | 1 + .../{ItemCT-v2.afs => ItemCT-pc-v2.afs} | Bin ...emMagEdit-bb.prs => ItemMagEdit-bb-v4.prs} | Bin system/item-tables/ItemMagEdit-dc-v1.prs | Bin 0 -> 639 bytes system/item-tables/ItemMagEdit-dc-v2.prs | 1 + system/item-tables/ItemMagEdit-gc-ep3-nte.prs | 1 + system/item-tables/ItemMagEdit-gc-ep3.prs | 1 + system/item-tables/ItemMagEdit-gc-nte.prs | Bin 0 -> 754 bytes system/item-tables/ItemMagEdit-gc-v3.prs | Bin 0 -> 743 bytes system/item-tables/ItemMagEdit-pc-nte.prs | 1 + system/item-tables/ItemMagEdit-pc-v2.prs | Bin 0 -> 748 bytes system/item-tables/ItemMagEdit-xb-v3.prs | Bin 0 -> 749 bytes .../{ItemPMT-bb.prs => ItemPMT-bb-v4.prs} | Bin system/item-tables/ItemPMT-dc-11-2000.prs | Bin 0 -> 4833 bytes system/item-tables/ItemPMT-dc-nte.prs | Bin 0 -> 4600 bytes system/item-tables/ItemPMT-dc-v1.prs | Bin 0 -> 5549 bytes system/item-tables/ItemPMT-dc-v2.prs | 1 + system/item-tables/ItemPMT-gc-ep3-nte.prs | 1 + system/item-tables/ItemPMT-gc-ep3.prs | 1 + system/item-tables/ItemPMT-gc-nte.prs | Bin 0 -> 5674 bytes .../{ItemPMT-gc.prs => ItemPMT-gc-v3.prs} | Bin system/item-tables/ItemPMT-pc-nte.prs | 1 + .../{ItemPMT-v2.prs => ItemPMT-pc-v2.prs} | Bin system/item-tables/ItemPMT-xb-v3.prs | Bin 0 -> 15685 bytes system/item-tables/ItemPT-dc-11-2000.afs | Bin 0 -> 587776 bytes system/item-tables/ItemPT-dc-nte.afs | Bin 0 -> 587776 bytes system/item-tables/ItemPT-dc-v1.afs | Bin 0 -> 587776 bytes system/item-tables/ItemPT-dc-v2.afs | 1 + system/item-tables/ItemPT-gc-ep3-nte.prs | 1 + system/item-tables/ItemPT-gc-ep3.prs | 1 + system/item-tables/ItemPT-gc-nte.gsl | Bin 0 -> 503808 bytes .../{ItemPT-gc-v4.gsl => ItemPT-gc-v3.gsl} | Bin system/item-tables/ItemPT-pc-nte.afs | 1 + .../{ItemPT-v2.afs => ItemPT-pc-v2.afs} | Bin system/item-tables/ItemPT-xb-v3.gsl | Bin 0 -> 667648 bytes .../{ItemRT-bb.rel => ItemRT-bb-v4.rel} | Bin system/item-tables/ItemRT-dc-11-2000.afs | Bin 0 -> 585728 bytes system/item-tables/ItemRT-dc-nte.afs | Bin 0 -> 585728 bytes system/item-tables/ItemRT-dc-v1.afs | Bin 0 -> 585728 bytes system/item-tables/ItemRT-dc-v2.afs | 1 + system/item-tables/ItemRT-gc-nte.gsl | Bin 0 -> 258048 bytes system/item-tables/ItemRT-pc-v2.afs | Bin 0 -> 606208 bytes system/item-tables/ItemRT-xb-v3.gsl | Bin 0 -> 258048 bytes .../{JudgeItem-gc.rel => JudgeItem-gc-v3.rel} | Bin ...ToolRandom-gc.rel => ToolRandom-gc-v3.rel} | Bin ...Hard-gc.rel => WeaponRandomHard-gc-v3.rel} | Bin ...al-gc.rel => WeaponRandomNormal-gc-v3.rel} | Bin ...-gc.rel => WeaponRandomUltimate-gc-v3.rel} | Bin ...-gc.rel => WeaponRandomVeryHard-gc-v3.rel} | Bin 61 files changed, 1431 insertions(+), 580 deletions(-) rename system/item-tables/{ArmorRandom-gc.rel => ArmorRandom-gc-v3.rel} (100%) create mode 120000 system/item-tables/ItemCT-dc-v2.afs rename system/item-tables/{ItemCT-v2.afs => ItemCT-pc-v2.afs} (100%) rename system/item-tables/{ItemMagEdit-bb.prs => ItemMagEdit-bb-v4.prs} (100%) create mode 100644 system/item-tables/ItemMagEdit-dc-v1.prs create mode 120000 system/item-tables/ItemMagEdit-dc-v2.prs create mode 120000 system/item-tables/ItemMagEdit-gc-ep3-nte.prs create mode 120000 system/item-tables/ItemMagEdit-gc-ep3.prs create mode 100755 system/item-tables/ItemMagEdit-gc-nte.prs create mode 100755 system/item-tables/ItemMagEdit-gc-v3.prs create mode 120000 system/item-tables/ItemMagEdit-pc-nte.prs create mode 100644 system/item-tables/ItemMagEdit-pc-v2.prs create mode 100644 system/item-tables/ItemMagEdit-xb-v3.prs rename system/item-tables/{ItemPMT-bb.prs => ItemPMT-bb-v4.prs} (100%) create mode 100755 system/item-tables/ItemPMT-dc-11-2000.prs create mode 100755 system/item-tables/ItemPMT-dc-nte.prs create mode 100755 system/item-tables/ItemPMT-dc-v1.prs create mode 120000 system/item-tables/ItemPMT-dc-v2.prs create mode 120000 system/item-tables/ItemPMT-gc-ep3-nte.prs create mode 120000 system/item-tables/ItemPMT-gc-ep3.prs create mode 100755 system/item-tables/ItemPMT-gc-nte.prs rename system/item-tables/{ItemPMT-gc.prs => ItemPMT-gc-v3.prs} (100%) create mode 120000 system/item-tables/ItemPMT-pc-nte.prs rename system/item-tables/{ItemPMT-v2.prs => ItemPMT-pc-v2.prs} (100%) create mode 100644 system/item-tables/ItemPMT-xb-v3.prs create mode 100644 system/item-tables/ItemPT-dc-11-2000.afs create mode 100644 system/item-tables/ItemPT-dc-nte.afs create mode 100644 system/item-tables/ItemPT-dc-v1.afs create mode 120000 system/item-tables/ItemPT-dc-v2.afs create mode 120000 system/item-tables/ItemPT-gc-ep3-nte.prs create mode 120000 system/item-tables/ItemPT-gc-ep3.prs create mode 100755 system/item-tables/ItemPT-gc-nte.gsl rename system/item-tables/{ItemPT-gc-v4.gsl => ItemPT-gc-v3.gsl} (100%) create mode 120000 system/item-tables/ItemPT-pc-nte.afs rename system/item-tables/{ItemPT-v2.afs => ItemPT-pc-v2.afs} (100%) create mode 100644 system/item-tables/ItemPT-xb-v3.gsl rename system/item-tables/{ItemRT-bb.rel => ItemRT-bb-v4.rel} (100%) create mode 100644 system/item-tables/ItemRT-dc-11-2000.afs create mode 100644 system/item-tables/ItemRT-dc-nte.afs create mode 100644 system/item-tables/ItemRT-dc-v1.afs create mode 120000 system/item-tables/ItemRT-dc-v2.afs create mode 100755 system/item-tables/ItemRT-gc-nte.gsl create mode 100644 system/item-tables/ItemRT-pc-v2.afs create mode 100644 system/item-tables/ItemRT-xb-v3.gsl rename system/item-tables/{JudgeItem-gc.rel => JudgeItem-gc-v3.rel} (100%) rename system/item-tables/{ToolRandom-gc.rel => ToolRandom-gc-v3.rel} (100%) rename system/item-tables/{WeaponRandomHard-gc.rel => WeaponRandomHard-gc-v3.rel} (100%) rename system/item-tables/{WeaponRandomNormal-gc.rel => WeaponRandomNormal-gc-v3.rel} (100%) rename system/item-tables/{WeaponRandomUltimate-gc.rel => WeaponRandomUltimate-gc-v3.rel} (100%) rename system/item-tables/{WeaponRandomVeryHard-gc.rel => WeaponRandomVeryHard-gc-v3.rel} (100%) diff --git a/TODO.md b/TODO.md index 9273a3e2..493f618f 100644 --- a/TODO.md +++ b/TODO.md @@ -4,6 +4,7 @@ - Implement decrypt/encrypt actions for VMS files - Make UI strings localizable (e.g. entries in menus, welcome message, etc.) - Add an idle connection timeout for proxy sessions +- Clean up ItemParameterTable implementation (see comment ad the top of the class definition) ## Episode 3 diff --git a/src/ItemNameIndex.cc b/src/ItemNameIndex.cc index 904a2d9f..b2b4fa9a 100644 --- a/src/ItemNameIndex.cc +++ b/src/ItemNameIndex.cc @@ -11,48 +11,22 @@ ItemNameIndex::ItemNameIndex( : version(version), item_parameter_table(item_parameter_table) { - auto find_items_1d = [&](uint64_t data1, size_t position) -> size_t { - ItemData item(data1, 0); - for (size_t x = 0; x < 0x100; x++) { - item.data1[position] = x; - uint32_t id; - try { - id = this->item_parameter_table->get_item_id(item); - } catch (const out_of_range&) { - return x; - } - const string* name = nullptr; - try { - name = &name_coll.at(id); - } catch (const out_of_range&) { - } - - if (name) { - auto meta = make_shared(); - meta->primary_identifier = item.primary_identifier(); - meta->name = *name; - this->primary_identifier_index.emplace(meta->primary_identifier, meta); - this->name_index.emplace(tolower(meta->name), meta); - } + for (uint32_t primary_identifier : item_parameter_table->compute_all_valid_primary_identifiers()) { + const string* name = nullptr; + try { + ItemData item = ItemData::from_primary_identifier(this->version, primary_identifier); + name = &name_coll.at(item_parameter_table->get_item_id(item)); + } catch (const out_of_range&) { } - return 0x100; - }; - auto find_items_2d = [&](uint64_t data1) { - for (size_t x = 0; x < 0x100; x++) { - size_t effective_data1 = data1 | (static_cast(x) << 48); - size_t data2_position = (effective_data1 == 0x0302000000000000) ? 4 : 2; - if (find_items_1d(effective_data1, data2_position) == 0) { - break; - } - } - }; - find_items_2d(0x0000000000000000); - find_items_1d(0x0101000000000000, 2); - find_items_1d(0x0102000000000000, 2); - find_items_1d(0x0103000000000000, 2); - find_items_1d(0x0200000000000000, 1); - find_items_2d(0x0300000000000000); + if (name) { + auto meta = make_shared(); + meta->primary_identifier = primary_identifier; + meta->name = *name; + this->primary_identifier_index.emplace(meta->primary_identifier, meta); + this->name_index.emplace(tolower(meta->name), meta); + } + } } static const char* s_rank_name_characters = "\0ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_"; @@ -645,3 +619,309 @@ ItemData ItemNameIndex::parse_item_description_phase(const std::string& descript return ret; } + +void ItemNameIndex::print_table(FILE* stream) const { + auto pmt = this->item_parameter_table; + + fprintf(stream, "WEAPON => ---ID--- TYPE SKIN POINTS FLAG ATPLO ATPHI ATPRQ MSTRQ ATARQ -MST- GND PH SP ATA SB PJ 1X 1Y 2X 2Y CL A1 A2 A3 A4 A5 TB CT V1 ST* USL ---DIVISOR--- NAME\n"); + for (size_t data1_1 = 0; data1_1 < pmt->num_weapon_classes; data1_1++) { + uint8_t v1_replacement = pmt->get_weapon_v1_replacement(data1_1); + float sale_divisor = pmt->get_sale_divisor(0x00, data1_1); + string divisor_str = string_printf("%g", sale_divisor); + divisor_str.resize(13, ' '); + + size_t data1_2_limit = pmt->num_weapons_in_class(data1_1); + for (size_t data1_2 = 0; data1_2 < data1_2_limit; data1_2++) { + const auto& w = pmt->get_weapon(data1_1, data1_2); + uint8_t stars = pmt->get_item_stars(w.base.id); + bool is_unsealable = pmt->is_unsealable_item(0x00, data1_1, data1_2); + + ItemData item; + item.data1[0] = 0x00; + item.data1[1] = data1_1; + item.data1[2] = data1_2; + string name = this->describe_item(item); + + fprintf(stream, "00%02zX%02zX => %08" PRIX32 " %04hX %04hX %6" PRIu32 " %04hX %5hu %5hu %5hu %5hu %5hu %5hu %3hhu %02hhX %02hhX %3hhu %02hhX %02hhX %02hhX %02hhX %02hhX %02hhX %02hhX %02hhX %02hhX %02hhX %02hhX %02hhX %02hhX %02hhX %02hhX %2hhu* %s %s %s\n", + data1_1, + data1_2, + w.base.id.load(), + w.base.type.load(), + w.base.skin.load(), + w.base.team_points.load(), + w.class_flags.load(), + w.atp_min.load(), + w.atp_max.load(), + w.atp_required.load(), + w.mst_required.load(), + w.ata_required.load(), + w.mst.load(), + w.max_grind, + w.photon, + w.special, + w.ata, + w.stat_boost, + w.projectile, + w.trail1_x, + w.trail1_y, + w.trail2_x, + w.trail2_y, + w.color, + w.unknown_a1, + w.unknown_a2, + w.unknown_a3, + w.unknown_a4, + w.unknown_a5, + w.tech_boost, + w.combo_type, + v1_replacement, + stars, + is_unsealable ? "YES" : " no", + divisor_str.c_str(), + name.c_str()); + } + } + + fprintf(stream, "ARMOR => ---ID--- TYPE SKIN POINTS -DFP- -EVP- BP BE FLAG LVL EFR ETH EIC EDK ELT DFR EVR SB TB -A2- ST* ---DIVISOR--- NAME\n"); + for (size_t data1_1 = 1; data1_1 < 3; data1_1++) { + float sale_divisor = pmt->get_sale_divisor(0x01, data1_1); + string divisor_str = string_printf("%g", sale_divisor); + divisor_str.resize(13, ' '); + + size_t data1_2_limit = pmt->num_armors_or_shields_in_class(data1_1); + for (size_t data1_2 = 0; data1_2 < data1_2_limit; data1_2++) { + const auto& a = pmt->get_armor_or_shield(data1_1, data1_2); + uint8_t stars = pmt->get_item_stars(a.base.id); + + ItemData item; + item.data1[0] = 0x01; + item.data1[1] = data1_1; + item.data1[2] = data1_2; + string name = this->describe_item(item); + + fprintf(stream, "01%02zX%02zX => %08" PRIX32 " %04hX %04hX %6" PRIu32 " %5hu %5hu %02hhX %02hhX %04hX %3hhu %3hhu %3hhu %3hhu %3hhu %3hhu %3hhu %3hhu %02hhX %02hhX %04hX %2hhu* %s %s\n", + data1_1, + data1_2, + a.base.id.load(), + a.base.type.load(), + a.base.skin.load(), + a.base.team_points.load(), + a.dfp.load(), + a.evp.load(), + a.block_particle, + a.block_effect, + a.class_flags.load(), + static_cast(a.required_level + 1), + a.efr, + a.eth, + a.eic, + a.edk, + a.elt, + a.dfp_range, + a.evp_range, + a.stat_boost, + a.tech_boost, + a.unknown_a2.load(), + stars, + divisor_str.c_str(), + name.c_str()); + } + } + + fprintf(stream, "UNIT => ---ID--- TYPE SKIN POINTS STAT COUNT ST-MOD ST* ---DIVISOR--- NAME\n"); + { + float sale_divisor = pmt->get_sale_divisor(0x01, 0x03); + string divisor_str = string_printf("%g", sale_divisor); + divisor_str.resize(13, ' '); + + size_t data1_2_limit = pmt->num_units(); + for (size_t data1_2 = 0; data1_2 < data1_2_limit; data1_2++) { + const auto& u = pmt->get_unit(data1_2); + uint8_t stars = pmt->get_item_stars(u.base.id); + + ItemData item; + item.data1[0] = 0x01; + item.data1[1] = 0x03; + item.data1[2] = data1_2; + string name = this->describe_item(item); + + fprintf(stream, "0103%02zX => %08" PRIX32 " %04hX %04hX %6" PRIu32 " %04hX %5hu %6hd %2hhu* %s %s\n", + data1_2, + u.base.id.load(), + u.base.type.load(), + u.base.skin.load(), + u.base.team_points.load(), + u.stat.load(), + u.stat_amount.load(), + u.modifier_amount.load(), + stars, + divisor_str.c_str(), + name.c_str()); + } + } + + fprintf(stream, "MAG => ---ID--- TYPE SKIN POINTS FTBL PB AC E1 E2 E3 E4 C1 C2 C3 C4 FLAG ST* ---DIVISOR--- NAME\n"); + { + size_t data1_1_limit = pmt->num_mags(); + for (size_t data1_1 = 0; data1_1 < data1_1_limit; data1_1++) { + const auto& m = pmt->get_mag(data1_1); + uint8_t stars = pmt->get_item_stars(m.base.id); + + float sale_divisor = pmt->get_sale_divisor(0x02, data1_1); + string divisor_str = string_printf("%g", sale_divisor); + divisor_str.resize(13, ' '); + + ItemData item; + item.data1[0] = 0x02; + item.data1[1] = data1_1; + item.data1[2] = 0x00; + string name = this->describe_item(item); + + fprintf(stream, "02%02zX00 => %08" PRIX32 " %04hX %04hX %6" PRIu32 " %04hX %02hhX %02hhX %02hhX %02hhX %02hhX %02hhX %02hhX %02hhX %02hhX %02hhX %04hX %2hhu* %s %s\n", + data1_1, + m.base.id.load(), + m.base.type.load(), + m.base.skin.load(), + m.base.team_points.load(), + m.feed_table.load(), + m.photon_blast, + m.activation, + m.on_pb_full, + m.on_low_hp, + m.on_death, + m.on_boss, + m.on_pb_full_flag, + m.on_low_hp_flag, + m.on_death_flag, + m.on_boss_flag, + m.class_flags.load(), + stars, + divisor_str.c_str(), + name.c_str()); + } + } + + fprintf(stream, "TOOL => ---ID--- TYPE SKIN POINTS COUNT TECH -COST- ITEMFLAG ST* ---DIVISOR--- NAME\n"); + for (size_t data1_1 = 0; data1_1 < pmt->num_tool_classes; data1_1++) { + float sale_divisor = pmt->get_sale_divisor(0x03, data1_1); + string divisor_str = string_printf("%g", sale_divisor); + divisor_str.resize(13, ' '); + + size_t data1_2_limit = pmt->num_tools_in_class(data1_1); + for (size_t data1_2 = 0; data1_2 < data1_2_limit; data1_2++) { + const auto& t = pmt->get_tool(data1_1, data1_2); + uint8_t stars = pmt->get_item_stars(t.base.id); + + ItemData item; + item.data1[0] = 0x03; + item.data1[1] = data1_1; + item.data1[(data1_1 == 0x02) ? 4 : 2] = data1_2; + item.set_tool_item_amount(this->version, 1); + string name = this->describe_item(item); + + fprintf(stream, "03%02zX%02zX => %08" PRIX32 " %04hX %04hX %6" PRIu32 " %5hu %04hX %6" PRId32 " %08" PRIX32 " %2hhu* %s %s\n", + data1_1, + data1_2, + t.base.id.load(), + t.base.type.load(), + t.base.skin.load(), + t.base.team_points.load(), + t.amount.load(), + t.tech.load(), + t.cost.load(), + t.item_flag.load(), + stars, + divisor_str.c_str(), + name.c_str()); + } + } + + fprintf(stream, "CLASS => F GF RF B GB RB Z GZ RZ GR DB JL ZL SH RY RS AT RV MG\n"); + for (size_t char_class = 0; char_class < 12; char_class++) { + fprintf(stream, "%9s =>", name_for_char_class(char_class)); + for (size_t tech_num = 0; tech_num < 0x13; tech_num++) { + uint8_t max_level = pmt->get_max_tech_level(char_class, tech_num) + 1; + if (max_level == 0x00) { + fprintf(stream, " "); + } else { + fprintf(stream, " %2hhu", max_level); + } + } + fprintf(stream, "\n"); + } + + fprintf(stream, "CLASS => F GF RF B GB RB Z GZ RZ GR DB JL ZL SH RY RS AT RV MG\n"); + for (size_t char_class = 0; char_class < 12; char_class++) { + fprintf(stream, "%9s =>", name_for_char_class(char_class)); + for (size_t tech_num = 0; tech_num < 0x13; tech_num++) { + uint8_t max_level = pmt->get_max_tech_level(char_class, tech_num) + 1; + if (max_level == 0x00) { + fprintf(stream, " "); + } else { + fprintf(stream, " %2hhu", max_level); + } + } + fprintf(stream, "\n"); + } + + for (size_t table_index = 0; table_index < 8; table_index++) { + static const char* names[11] = { + "Monomate", "Dimate", "Trimate", "Monofluid", + "Difluid", "Trifluid", "Antidote", "Antiparalysis", + "Sol Atomizer", "Moon Atomizer", "Star Atomizer"}; + fprintf(stream, "TABLE %02zX => -DEF -POW -DEX MIND -IQ- SYNC\n", table_index); + for (size_t which = 0; which < 11; which++) { + const auto& res = pmt->get_mag_feed_result(table_index, which); + fprintf(stream, "%14s => %4hhd %4hhd %4hhd %4hhd %4hhd %4hhd\n", + names[which], res.def, res.pow, res.dex, res.mind, res.iq, res.synchro); + } + } + + fprintf(stream, "SPECIAL => TYPE COUNT ST*\n"); + for (size_t index = 0; index < pmt->num_specials; index++) { + const auto& sp = pmt->get_special(index); + uint8_t stars = pmt->get_special_stars(index); + fprintf(stream, " %02zX => %04hX %5hu %2hu*\n", index, sp.type.load(), sp.amount.load(), stars); + } + + fprintf(stream, "---USE + -EQUIP => RESULT MLV GND LVL CLS\n"); + for (const auto& combo_list_it : pmt->get_all_item_combinations()) { + for (const auto& combo : combo_list_it.second) { + fprintf(stream, "%02hhX%02hhX%02hhX + %02hhX%02hhX%02hhX => %02hhX%02hhX%02hhX", + combo.used_item[0], combo.used_item[1], combo.used_item[2], + combo.equipped_item[0], combo.equipped_item[1], combo.equipped_item[2], + combo.result_item[0], combo.result_item[1], combo.result_item[2]); + if (combo.mag_level != 0xFF) { + fprintf(stream, " %3hu", combo.mag_level); + } else { + fprintf(stream, " "); + } + if (combo.grind != 0xFF) { + fprintf(stream, " %3hu", combo.grind); + } else { + fprintf(stream, " "); + } + if (combo.level != 0xFF) { + fprintf(stream, " %3hu", combo.level); + } else { + fprintf(stream, " "); + } + if (combo.char_class != 0xFF) { + fprintf(stream, " %3hu\n", combo.char_class); + } else { + fprintf(stream, " \n"); + } + } + } + + size_t num_events = pmt->num_events(); + for (size_t event_number = 0; event_number < num_events; event_number++) { + fprintf(stream, "EV %3zu => PRB\n", event_number); + auto events_list = pmt->get_event_items(event_number); + for (size_t z = 0; z < events_list.second; z++) { + const auto& event_item = events_list.first[z]; + fprintf(stream, "%02hhX%02hhX%02hhX => %3hhu\n", + event_item.item[0], event_item.item[1], event_item.item[2], event_item.probability); + } + } +} diff --git a/src/ItemNameIndex.hh b/src/ItemNameIndex.hh index 451249d4..27138a7a 100644 --- a/src/ItemNameIndex.hh +++ b/src/ItemNameIndex.hh @@ -38,6 +38,8 @@ public: std::string describe_item(const ItemData& item, bool include_color_escapes = false) const; ItemData parse_item_description(const std::string& description) const; + void print_table(FILE* stream) const; + private: ItemData parse_item_description_phase(const std::string& description, bool skip_special) const; diff --git a/src/ItemParameterTable.cc b/src/ItemParameterTable.cc index af76cdb4..941f0080 100644 --- a/src/ItemParameterTable.cc +++ b/src/ItemParameterTable.cc @@ -3,64 +3,462 @@ using namespace std; ItemParameterTable::ItemParameterTable(shared_ptr data, Version version) - : data(data), + : version(version), + data(data), r(*data), - offsets_v2(nullptr), - offsets_v3(nullptr), + offsets_dc_protos(nullptr), + offsets_v1_v2(nullptr), + offsets_gc_nte(nullptr), + offsets_v3_le(nullptr), + offsets_v3_be(nullptr), offsets_v4(nullptr) { - switch (version) { - case Version::V2: { - size_t offset_table_offset = this->r.pget_u32l(this->data->size() - 0x10); - this->offsets_v2 = &this->r.pget(offset_table_offset); + size_t offset_table_offset = is_big_endian(version) + ? this->r.pget_u32b(this->data->size() - 0x10) + : this->r.pget_u32l(this->data->size() - 0x10); + + switch (this->version) { + case Version::DC_NTE: { + this->offsets_dc_protos = &this->r.pget(offset_table_offset); + this->num_weapon_classes = 0x27; + this->num_tool_classes = 0x0D; + this->item_stars_first_id = 0x22; + this->item_stars_last_id = 0x168; + this->special_stars_begin_index = 0xAA; + this->num_specials = 0x28; + // TODO: Check if first_rare_mag_index is the same on this version + break; + } + case Version::DC_V1_11_2000_PROTOTYPE: { + this->offsets_dc_protos = &this->r.pget(offset_table_offset); + this->num_weapon_classes = 0x27; + this->num_tool_classes = 0x0E; + this->item_stars_first_id = 0x26; + this->item_stars_last_id = 0x16C; + this->special_stars_begin_index = 0xAE; + this->num_specials = 0x28; + // TODO: Check if first_rare_mag_index is the same on this version + break; + } + case Version::DC_V1: { + this->offsets_v1_v2 = &this->r.pget(offset_table_offset); + this->num_weapon_classes = 0x27; + this->num_tool_classes = 0x0E; + this->item_stars_first_id = 0x26; + this->item_stars_last_id = 0x16C; + this->special_stars_begin_index = 0xAE; + this->num_specials = 0x29; + // TODO: Check if first_rare_mag_index is the same on this version + break; + } + case Version::DC_V2: + case Version::PC_NTE: + case Version::PC_V2: { + this->offsets_v1_v2 = &this->r.pget(offset_table_offset); this->num_weapon_classes = 0x89; this->num_tool_classes = 0x10; this->item_stars_first_id = 0x4E; this->item_stars_last_id = 0x215; this->special_stars_begin_index = 0x138; - this->star_value_table_size = 0x1C7; + this->num_specials = 0x29; break; } - case Version::V3: { - size_t offset_table_offset = this->r.pget_u32b(this->data->size() - 0x10); - this->offsets_v3 = &this->r.pget>(offset_table_offset); + + case Version::GC_NTE: { + this->offsets_gc_nte = &this->r.pget(offset_table_offset); + this->num_weapon_classes = 0x8D; + this->num_tool_classes = 0x13; + this->item_stars_first_id = 0x76; + this->item_stars_last_id = 0x298; + this->special_stars_begin_index = 0x1A3; + this->num_specials = 0x29; + break; + } + + case Version::GC_EP3_NTE: + case Version::GC_EP3: + case Version::GC_V3: + case Version::XB_V3: { + if (is_big_endian(this->version)) { + this->offsets_v3_be = &this->r.pget>(offset_table_offset); + } else { + this->offsets_v3_le = &this->r.pget>(offset_table_offset); + } this->num_weapon_classes = 0xAA; this->num_tool_classes = 0x18; this->item_stars_first_id = 0x94; this->item_stars_last_id = 0x2F7; this->special_stars_begin_index = 0x1CB; - this->star_value_table_size = 0x263; + this->num_specials = 0x29; break; } - case Version::V4: { - size_t offset_table_offset = this->r.pget_u32l(this->data->size() - 0x10); + + case Version::BB_V4: { this->offsets_v4 = &this->r.pget>(offset_table_offset); this->num_weapon_classes = 0xED; this->num_tool_classes = 0x1B; this->item_stars_first_id = 0xB1; this->item_stars_last_id = 0x437; this->special_stars_begin_index = 0x256; - this->star_value_table_size = 0x330; + this->num_specials = 0x29; break; } default: throw logic_error("invalid item parameter table version"); } - this->num_specials = 0x29; this->first_rare_mag_index = 0x28; } +set ItemParameterTable::compute_all_valid_primary_identifiers() const { + set ret; + + auto find_items_1d = [&](uint64_t data1, size_t position) -> size_t { + ItemData item(data1, 0); + for (size_t x = 0; x < 0x100; x++) { + item.data1[position] = x; + try { + this->get_item_id(item); + } catch (const out_of_range&) { + return x; + } + ret.emplace(item.primary_identifier()); + } + return 0x100; + }; + auto find_items_2d = [&](uint64_t data1) { + for (size_t x = 0; x < 0x100; x++) { + size_t effective_data1 = data1 | (static_cast(x) << 48); + size_t data2_position = (effective_data1 == 0x0302000000000000) ? 4 : 2; + if (find_items_1d(effective_data1, data2_position) == 0) { + break; + } + } + }; + + find_items_2d(0x0000000000000000); + find_items_1d(0x0101000000000000, 2); + find_items_1d(0x0102000000000000, 2); + find_items_1d(0x0103000000000000, 2); + find_items_1d(0x0200000000000000, 1); + find_items_2d(0x0300000000000000); + return ret; +} + +ItemParameterTable::WeaponV4 ItemParameterTable::WeaponDCProtos::to_v4() const { + WeaponV4 ret; + ret.base.id = this->base.id; + ret.class_flags = this->class_flags; + ret.atp_min = this->atp_min; + ret.atp_max = this->atp_max; + ret.atp_required = this->atp_required; + ret.mst_required = this->mst_required; + ret.ata_required = this->ata_required; + ret.max_grind = this->max_grind; + ret.photon = this->photon; + ret.special = this->special; + ret.ata = this->ata; + return ret; +} + +ItemParameterTable::WeaponV4 ItemParameterTable::WeaponV1V2::to_v4() const { + WeaponV4 ret; + ret.base.id = this->base.id; + ret.class_flags = this->class_flags; + ret.atp_min = this->atp_min; + ret.atp_max = this->atp_max; + ret.atp_required = this->atp_required; + ret.mst_required = this->mst_required; + ret.ata_required = this->ata_required; + ret.max_grind = this->max_grind; + ret.photon = this->photon; + ret.special = this->special; + ret.ata = this->ata; + ret.stat_boost = this->stat_boost; + return ret; +} + +ItemParameterTable::WeaponV4 ItemParameterTable::WeaponGCNTE::to_v4() const { + WeaponV4 ret; + ret.base.id = this->base.id.load(); + ret.base.type = this->base.type.load(); + ret.base.skin = this->base.skin.load(); + ret.class_flags = this->class_flags.load(); + ret.atp_min = this->atp_min.load(); + ret.atp_max = this->atp_max.load(); + ret.atp_required = this->atp_required.load(); + ret.mst_required = this->mst_required.load(); + ret.ata_required = this->ata_required.load(); + ret.mst = this->mst.load(); + ret.max_grind = this->max_grind; + ret.photon = this->photon; + ret.special = this->special; + ret.ata = this->ata; + ret.stat_boost = this->stat_boost; + ret.projectile = this->projectile; + ret.trail1_x = this->trail1_x; + ret.trail1_y = this->trail1_y; + ret.trail2_x = this->trail2_x; + ret.trail2_y = this->trail2_y; + ret.color = this->color; + ret.unknown_a1 = this->unknown_a1; + ret.unknown_a2 = this->unknown_a2; + ret.unknown_a3 = this->unknown_a3; + return ret; +} + +template +ItemParameterTable::WeaponV4 ItemParameterTable::WeaponV3::to_v4() const { + WeaponV4 ret; + ret.base.id = this->base.id.load(); + ret.base.type = this->base.type.load(); + ret.base.skin = this->base.skin.load(); + ret.class_flags = this->class_flags.load(); + ret.atp_min = this->atp_min.load(); + ret.atp_max = this->atp_max.load(); + ret.atp_required = this->atp_required.load(); + ret.mst_required = this->mst_required.load(); + ret.ata_required = this->ata_required.load(); + ret.mst = this->mst.load(); + ret.max_grind = this->max_grind; + ret.photon = this->photon; + ret.special = this->special; + ret.ata = this->ata; + ret.stat_boost = this->stat_boost; + ret.projectile = this->projectile; + ret.trail1_x = this->trail1_x; + ret.trail1_y = this->trail1_y; + ret.trail2_x = this->trail2_x; + ret.trail2_y = this->trail2_y; + ret.color = this->color; + ret.unknown_a1 = this->unknown_a1; + ret.unknown_a2 = this->unknown_a2; + ret.unknown_a3 = this->unknown_a3; + ret.unknown_a4 = this->unknown_a4; + ret.unknown_a5 = this->unknown_a5; + ret.tech_boost = this->tech_boost; + ret.combo_type = this->combo_type; + return ret; +} + +ItemParameterTable::ArmorOrShieldV4 ItemParameterTable::ArmorOrShieldDCProtos::to_v4() const { + ArmorOrShieldV4 ret; + ret.base.id = this->base.id; + ret.dfp = this->dfp; + ret.evp = this->evp; + ret.block_particle = this->block_particle; + ret.block_effect = this->block_effect; + ret.class_flags = this->class_flags; + ret.required_level = this->required_level; + ret.efr = this->efr; + ret.eth = this->eth; + ret.eic = this->eic; + ret.edk = this->edk; + ret.elt = this->elt; + ret.dfp_range = this->dfp_range; + ret.evp_range = this->evp_range; + return ret; +} + +ItemParameterTable::ArmorOrShieldV4 ItemParameterTable::ArmorOrShieldV1V2::to_v4() const { + ArmorOrShieldV4 ret; + ret.base.id = this->base.id; + ret.dfp = this->dfp; + ret.evp = this->evp; + ret.block_particle = this->block_particle; + ret.block_effect = this->block_effect; + ret.class_flags = this->class_flags; + ret.required_level = this->required_level; + ret.efr = this->efr; + ret.eth = this->eth; + ret.eic = this->eic; + ret.edk = this->edk; + ret.elt = this->elt; + ret.dfp_range = this->dfp_range; + ret.evp_range = this->evp_range; + ret.stat_boost = this->stat_boost; + ret.tech_boost = this->tech_boost; + ret.unknown_a2 = this->unknown_a2; + return ret; +} + +template +ItemParameterTable::ArmorOrShieldV4 ItemParameterTable::ArmorOrShieldV3::to_v4() const { + ArmorOrShieldV4 ret; + ret.base.id = this->base.id.load(); + ret.base.type = this->base.type.load(); + ret.base.skin = this->base.skin.load(); + ret.dfp = this->dfp.load(); + ret.evp = this->evp.load(); + ret.block_particle = this->block_particle; + ret.block_effect = this->block_effect; + ret.class_flags = this->class_flags.load(); + ret.required_level = this->required_level; + ret.efr = this->efr; + ret.eth = this->eth; + ret.eic = this->eic; + ret.edk = this->edk; + ret.elt = this->elt; + ret.dfp_range = this->dfp_range; + ret.evp_range = this->evp_range; + ret.stat_boost = this->stat_boost; + ret.tech_boost = this->tech_boost; + ret.unknown_a2 = this->unknown_a2.load(); + return ret; +} + +ItemParameterTable::UnitV4 ItemParameterTable::UnitDCProtos::to_v4() const { + UnitV4 ret; + ret.base.id = this->base.id; + ret.stat = this->stat; + ret.stat_amount = this->stat_amount; + return ret; +} + +ItemParameterTable::UnitV4 ItemParameterTable::UnitV1V2::to_v4() const { + UnitV4 ret; + ret.base.id = this->base.id; + ret.stat = this->stat; + ret.stat_amount = this->stat_amount; + ret.modifier_amount = this->modifier_amount; + return ret; +} + +template +ItemParameterTable::UnitV4 ItemParameterTable::UnitV3::to_v4() const { + UnitV4 ret; + ret.base.id = this->base.id.load(); + ret.base.type = this->base.type.load(); + ret.base.skin = this->base.skin.load(); + ret.stat = this->stat.load(); + ret.stat_amount = this->stat_amount.load(); + ret.modifier_amount = this->modifier_amount.load(); + return ret; +} + +ItemParameterTable::MagV4 ItemParameterTable::MagV1::to_v4() const { + MagV4 ret; + ret.base.id = this->base.id; + ret.feed_table = this->feed_table; + ret.photon_blast = this->photon_blast; + ret.activation = this->activation; + ret.on_pb_full = this->on_pb_full; + ret.on_low_hp = this->on_low_hp; + ret.on_death = this->on_death; + ret.on_boss = this->on_boss; + ret.on_pb_full_flag = this->on_pb_full_flag; + ret.on_low_hp_flag = this->on_low_hp_flag; + ret.on_death_flag = this->on_death_flag; + ret.on_boss_flag = this->on_boss_flag; + return ret; +} + +ItemParameterTable::MagV4 ItemParameterTable::MagV2::to_v4() const { + MagV4 ret; + ret.base.id = this->base.id; + ret.feed_table = this->feed_table; + ret.photon_blast = this->photon_blast; + ret.activation = this->activation; + ret.on_pb_full = this->on_pb_full; + ret.on_low_hp = this->on_low_hp; + ret.on_death = this->on_death; + ret.on_boss = this->on_boss; + ret.on_pb_full_flag = this->on_pb_full_flag; + ret.on_low_hp_flag = this->on_low_hp_flag; + ret.on_death_flag = this->on_death_flag; + ret.on_boss_flag = this->on_boss_flag; + ret.class_flags = this->class_flags; + return ret; +} + +template +ItemParameterTable::MagV4 ItemParameterTable::MagV3::to_v4() const { + MagV4 ret; + ret.base.id = this->base.id.load(); + ret.base.type = this->base.type.load(); + ret.base.skin = this->base.skin.load(); + ret.feed_table = this->feed_table.load(); + ret.photon_blast = this->photon_blast; + ret.activation = this->activation; + ret.on_pb_full = this->on_pb_full; + ret.on_low_hp = this->on_low_hp; + ret.on_death = this->on_death; + ret.on_boss = this->on_boss; + ret.on_pb_full_flag = this->on_pb_full_flag; + ret.on_low_hp_flag = this->on_low_hp_flag; + ret.on_death_flag = this->on_death_flag; + ret.on_boss_flag = this->on_boss_flag; + ret.class_flags = this->class_flags.load(); + return ret; +} + +ItemParameterTable::ToolV4 ItemParameterTable::ToolV1V2::to_v4() const { + ToolV4 ret; + ret.base.id = this->base.id; + ret.amount = this->amount; + ret.tech = this->tech; + ret.cost = this->cost; + ret.item_flag = this->item_flag; + return ret; +} + +template +ItemParameterTable::ToolV4 ItemParameterTable::ToolV3::to_v4() const { + ToolV4 ret; + ret.base.id = this->base.id.load(); + ret.base.type = this->base.type.load(); + ret.base.skin = this->base.skin.load(); + ret.amount = this->amount.load(); + ret.tech = this->tech.load(); + ret.cost = this->cost.load(); + ret.item_flag = this->item_flag.load(); + return ret; +} + +template +size_t indirect_lookup_2d_count(const StringReader& r, size_t root_offset, size_t co_index) { + using ArrayRefT = typename std::conditional_t; + return r.pget(root_offset + sizeof(ArrayRefT) * co_index).count; +} + +template +const T& indirect_lookup_2d(const StringReader& r, size_t root_offset, size_t co_index, size_t item_index) { + using ArrayRefT = typename std::conditional_t; + + const auto& co = r.pget(root_offset + sizeof(ArrayRefT) * co_index); + if (item_index >= co.count) { + throw out_of_range("item ID out of range"); + } + return r.pget(co.offset + sizeof(T) * item_index); +} + +size_t ItemParameterTable::num_weapons_in_class(uint8_t data1_1) const { + if (data1_1 >= this->num_weapon_classes) { + throw out_of_range("weapon ID out of range"); + } + if (this->offsets_dc_protos) { + return indirect_lookup_2d_count(this->r, this->offsets_dc_protos->weapon_table, data1_1); + } else if (this->offsets_v1_v2) { + return indirect_lookup_2d_count(this->r, this->offsets_v1_v2->weapon_table, data1_1); + } else if (this->offsets_gc_nte) { + return indirect_lookup_2d_count(this->r, this->offsets_gc_nte->weapon_table, data1_1); + } else if (this->offsets_v3_le) { + return indirect_lookup_2d_count(this->r, this->offsets_v3_le->weapon_table, data1_1); + } else if (this->offsets_v3_be) { + return indirect_lookup_2d_count(this->r, this->offsets_v3_be->weapon_table, data1_1); + } else if (this->offsets_v4) { + return indirect_lookup_2d_count(this->r, this->offsets_v4->weapon_table, data1_1); + } else { + throw logic_error("table is not v2, v3, or v4"); + } +} + const ItemParameterTable::WeaponV4& ItemParameterTable::get_weapon(uint8_t data1_1, uint8_t data1_2) const { if (data1_1 >= this->num_weapon_classes) { throw out_of_range("weapon ID out of range"); } if (this->offsets_v4) { - const auto& co = this->r.pget(this->offsets_v4->weapon_table + sizeof(ArrayRefLE) * data1_1); - if (data1_2 >= co.count) { - throw out_of_range("weapon ID out of range"); - } - return this->r.pget(co.offset + sizeof(WeaponV4) * data1_2); + return indirect_lookup_2d(this->r, this->offsets_v4->weapon_table, data1_1, data1_2); } uint16_t key = (data1_1 << 8) | data1_2; @@ -68,79 +466,51 @@ const ItemParameterTable::WeaponV4& ItemParameterTable::get_weapon(uint8_t data1 return this->parsed_weapons.at(key); } catch (const std::out_of_range&) { WeaponV4 def_v4; - - if (this->offsets_v2) { - const auto& co = this->r.pget(this->offsets_v2->weapon_table + sizeof(ArrayRefLE) * data1_1); - if (data1_2 >= co.count) { - throw out_of_range("weapon ID out of range"); - } - const auto& def_v2 = this->r.pget(co.offset + sizeof(WeaponV2) * data1_2); - def_v4.base.id = def_v2.base.id; - def_v4.class_flags = def_v2.class_flags; - def_v4.atp_min = def_v2.atp_min; - def_v4.atp_max = def_v2.atp_max; - def_v4.atp_required = def_v2.atp_required; - def_v4.mst_required = def_v2.mst_required; - def_v4.ata_required = def_v2.ata_required; - def_v4.max_grind = def_v2.max_grind; - def_v4.photon = def_v2.photon; - def_v4.special = def_v2.special; - def_v4.ata = def_v2.ata; - - } else if (this->offsets_v3) { - const auto& co = this->r.pget(this->offsets_v3->weapon_table + sizeof(ArrayRefBE) * data1_1); - if (data1_2 >= co.count) { - throw out_of_range("weapon ID out of range"); - } - const auto& def_v3 = this->r.pget>(co.offset + sizeof(WeaponV3) * data1_2); - def_v4.base.id = def_v3.base.id.load(); - def_v4.base.type = def_v3.base.type.load(); - def_v4.base.skin = def_v3.base.skin.load(); - def_v4.class_flags = def_v3.class_flags.load(); - def_v4.atp_min = def_v3.atp_min.load(); - def_v4.atp_max = def_v3.atp_max.load(); - def_v4.atp_required = def_v3.atp_required.load(); - def_v4.mst_required = def_v3.mst_required.load(); - def_v4.ata_required = def_v3.ata_required.load(); - def_v4.mst = def_v3.mst.load(); - def_v4.max_grind = def_v3.max_grind; - def_v4.photon = def_v3.photon; - def_v4.special = def_v3.special; - def_v4.ata = def_v3.ata; - def_v4.stat_boost = def_v3.stat_boost; - def_v4.projectile = def_v3.projectile; - def_v4.trail1_x = def_v3.trail1_x; - def_v4.trail1_y = def_v3.trail1_y; - def_v4.trail2_x = def_v3.trail2_x; - def_v4.trail2_y = def_v3.trail2_y; - def_v4.color = def_v3.color; - def_v4.unknown_a1 = def_v3.unknown_a1; - def_v4.unknown_a2 = def_v3.unknown_a2; - def_v4.unknown_a3 = def_v3.unknown_a3; - def_v4.unknown_a4 = def_v3.unknown_a4; - def_v4.unknown_a5 = def_v3.unknown_a5; - def_v4.tech_boost = def_v3.tech_boost; - def_v4.combo_type = def_v3.combo_type; - + if (this->offsets_dc_protos) { + def_v4 = indirect_lookup_2d(this->r, this->offsets_dc_protos->weapon_table, data1_1, data1_2).to_v4(); + } else if (this->offsets_v1_v2) { + def_v4 = indirect_lookup_2d(this->r, this->offsets_v1_v2->weapon_table, data1_1, data1_2).to_v4(); + } else if (this->offsets_gc_nte) { + def_v4 = indirect_lookup_2d(this->r, this->offsets_gc_nte->weapon_table, data1_1, data1_2).to_v4(); + } else if (this->offsets_v3_le) { + def_v4 = indirect_lookup_2d, false>(this->r, this->offsets_v3_le->weapon_table, data1_1, data1_2).to_v4(); + } else if (this->offsets_v3_be) { + def_v4 = indirect_lookup_2d, true>(this->r, this->offsets_v3_be->weapon_table, data1_1, data1_2).to_v4(); } else { throw logic_error("table is not v2, v3, or v4"); } - return this->parsed_weapons.emplace(key, def_v4).first->second; } } +size_t ItemParameterTable::num_armors_or_shields_in_class(uint8_t data1_1) const { + if ((data1_1 < 1) || (data1_1 > 2)) { + throw out_of_range("armor/shield class ID out of range"); + } + if (this->offsets_dc_protos) { + return indirect_lookup_2d_count(this->r, this->offsets_dc_protos->armor_table, data1_1 - 1); + } else if (this->offsets_v1_v2) { + return indirect_lookup_2d_count(this->r, this->offsets_v1_v2->armor_table, data1_1 - 1); + } else if (this->offsets_gc_nte) { + return indirect_lookup_2d_count(this->r, this->offsets_gc_nte->armor_table, data1_1 - 1); + } else if (this->offsets_v3_le) { + return indirect_lookup_2d_count(this->r, this->offsets_v3_le->armor_table, data1_1 - 1); + } else if (this->offsets_v3_be) { + return indirect_lookup_2d_count(this->r, this->offsets_v3_be->armor_table, data1_1 - 1); + } else if (this->offsets_v4) { + return indirect_lookup_2d_count(this->r, this->offsets_v4->armor_table, data1_1 - 1); + } else { + throw logic_error("table is not v2, v3, or v4"); + } +} + const ItemParameterTable::ArmorOrShieldV4& ItemParameterTable::get_armor_or_shield(uint8_t data1_1, uint8_t data1_2) const { if ((data1_1 < 1) || (data1_1 > 2)) { throw out_of_range("armor/shield class ID out of range"); } if (this->offsets_v4) { - const auto& co = this->r.pget(this->offsets_v4->armor_table + sizeof(ArrayRefLE) * (data1_1 - 1)); - if (data1_2 >= co.count) { - throw out_of_range("armor/shield ID out of range"); - } - return this->r.pget(co.offset + sizeof(ArmorOrShieldV4) * data1_2); + return indirect_lookup_2d(this->r, this->offsets_v4->armor_table, data1_1 - 1, data1_2); } auto& parsed_vec = (data1_1 == 2) ? this->parsed_shields : this->parsed_armors; @@ -153,60 +523,19 @@ const ItemParameterTable::ArmorOrShieldV4& ItemParameterTable::get_armor_or_shie } catch (const std::out_of_range&) { ArmorOrShieldV4 def_v4; - if (this->offsets_v2) { - const auto& co = this->r.pget(this->offsets_v2->armor_table + sizeof(ArrayRefLE) * (data1_1 - 1)); - if (data1_2 >= co.count) { - throw out_of_range("armor/shield ID out of range"); - } - const auto& def_v2 = this->r.pget(co.offset + sizeof(ArmorOrShieldV2) * data1_2); - def_v4.base.id = def_v2.base.id; - def_v4.dfp = def_v2.dfp; - def_v4.evp = def_v2.evp; - def_v4.block_particle = def_v2.block_particle; - def_v4.block_effect = def_v2.block_effect; - def_v4.class_flags = def_v2.class_flags; - def_v4.required_level = def_v2.required_level; - def_v4.efr = def_v2.efr; - def_v4.eth = def_v2.eth; - def_v4.eic = def_v2.eic; - def_v4.edk = def_v2.edk; - def_v4.elt = def_v2.elt; - def_v4.dfp_range = def_v2.dfp_range; - def_v4.evp_range = def_v2.evp_range; - def_v4.stat_boost = def_v2.stat_boost; - def_v4.tech_boost = def_v2.tech_boost; - def_v4.unknown_a2 = def_v2.unknown_a2; - - } else if (this->offsets_v3) { - const auto& co = this->r.pget(this->offsets_v3->armor_table + sizeof(ArrayRefBE) * (data1_1 - 1)); - if (data1_2 >= co.count) { - throw out_of_range("armor/shield ID out of range"); - } - const auto& def_v3 = this->r.pget(co.offset + sizeof(ArmorOrShieldV3) * data1_2); - def_v4.base.id = def_v3.base.id.load(); - def_v4.base.type = def_v3.base.type.load(); - def_v4.base.skin = def_v3.base.skin.load(); - def_v4.dfp = def_v3.dfp.load(); - def_v4.evp = def_v3.evp.load(); - def_v4.block_particle = def_v3.block_particle; - def_v4.block_effect = def_v3.block_effect; - def_v4.class_flags = def_v3.class_flags.load(); - def_v4.required_level = def_v3.required_level; - def_v4.efr = def_v3.efr; - def_v4.eth = def_v3.eth; - def_v4.eic = def_v3.eic; - def_v4.edk = def_v3.edk; - def_v4.elt = def_v3.elt; - def_v4.dfp_range = def_v3.dfp_range; - def_v4.evp_range = def_v3.evp_range; - def_v4.stat_boost = def_v3.stat_boost; - def_v4.tech_boost = def_v3.tech_boost; - def_v4.unknown_a2 = def_v3.unknown_a2.load(); - + if (this->offsets_dc_protos) { + def_v4 = indirect_lookup_2d(this->r, this->offsets_dc_protos->armor_table, data1_1 - 1, data1_2).to_v4(); + } else if (this->offsets_v1_v2) { + def_v4 = indirect_lookup_2d(this->r, this->offsets_v1_v2->armor_table, data1_1 - 1, data1_2).to_v4(); + } else if (this->offsets_gc_nte) { + def_v4 = indirect_lookup_2d, true>(this->r, this->offsets_gc_nte->armor_table, data1_1 - 1, data1_2).to_v4(); + } else if (this->offsets_v3_le) { + def_v4 = indirect_lookup_2d, false>(this->r, this->offsets_v3_le->armor_table, data1_1 - 1, data1_2).to_v4(); + } else if (this->offsets_v3_be) { + def_v4 = indirect_lookup_2d, true>(this->r, this->offsets_v3_be->armor_table, data1_1 - 1, data1_2).to_v4(); } else { throw logic_error("table is not v2, v3, or v4"); } - if (data1_2 >= parsed_vec.size()) { parsed_vec.resize(data1_2 + 1); } @@ -215,13 +544,27 @@ const ItemParameterTable::ArmorOrShieldV4& ItemParameterTable::get_armor_or_shie } } +size_t ItemParameterTable::num_units() const { + if (this->offsets_dc_protos) { + return indirect_lookup_2d_count(this->r, this->offsets_dc_protos->unit_table, 0); + } else if (this->offsets_v1_v2) { + return indirect_lookup_2d_count(this->r, this->offsets_v1_v2->unit_table, 0); + } else if (this->offsets_gc_nte) { + return indirect_lookup_2d_count(this->r, this->offsets_gc_nte->unit_table, 0); + } else if (this->offsets_v3_le) { + return indirect_lookup_2d_count(this->r, this->offsets_v3_le->unit_table, 0); + } else if (this->offsets_v3_be) { + return indirect_lookup_2d_count(this->r, this->offsets_v3_be->unit_table, 0); + } else if (this->offsets_v4) { + return indirect_lookup_2d_count(this->r, this->offsets_v4->unit_table, 0); + } else { + throw logic_error("table is not v2, v3, or v4"); + } +} + const ItemParameterTable::UnitV4& ItemParameterTable::get_unit(uint8_t data1_2) const { if (this->offsets_v4) { - const auto& co = this->r.pget(this->offsets_v4->unit_table); - if (data1_2 >= co.count) { - throw out_of_range("unit ID out of range"); - } - return this->r.pget(co.offset + sizeof(UnitV4) * data1_2); + return indirect_lookup_2d(this->r, this->offsets_v4->unit_table, 0, data1_2); } try { @@ -232,35 +575,19 @@ const ItemParameterTable::UnitV4& ItemParameterTable::get_unit(uint8_t data1_2) return ret; } catch (const std::out_of_range&) { UnitV4 def_v4; - - if (this->offsets_v2) { - const auto& co = this->r.pget(this->offsets_v2->unit_table); - if (data1_2 >= co.count) { - throw out_of_range("unit ID out of range"); - } - const auto& def_v2 = this->r.pget(co.offset + sizeof(UnitV2) * data1_2); - def_v4.base.id = def_v2.base.id; - def_v4.stat = def_v2.stat; - def_v4.stat_amount = def_v2.stat_amount; - def_v4.modifier_amount = def_v2.modifier_amount; - - } else if (this->offsets_v3) { - const auto& co = this->r.pget(this->offsets_v3->unit_table); - if (data1_2 >= co.count) { - throw out_of_range("unit ID out of range"); - } - const auto& def_v3 = this->r.pget(co.offset + sizeof(UnitV3) * data1_2); - def_v4.base.id = def_v3.base.id.load(); - def_v4.base.type = def_v3.base.type.load(); - def_v4.base.skin = def_v3.base.skin.load(); - def_v4.stat = def_v3.stat.load(); - def_v4.stat_amount = def_v3.stat_amount.load(); - def_v4.modifier_amount = def_v3.modifier_amount.load(); - + if (this->offsets_dc_protos) { + def_v4 = indirect_lookup_2d(this->r, this->offsets_dc_protos->unit_table, 0, data1_2).to_v4(); + } else if (this->offsets_v1_v2) { + def_v4 = indirect_lookup_2d(this->r, this->offsets_v1_v2->unit_table, 0, data1_2).to_v4(); + } else if (this->offsets_gc_nte) { + def_v4 = indirect_lookup_2d, true>(this->r, this->offsets_gc_nte->unit_table, 0, data1_2).to_v4(); + } else if (this->offsets_v3_le) { + def_v4 = indirect_lookup_2d, false>(this->r, this->offsets_v3_le->unit_table, 0, data1_2).to_v4(); + } else if (this->offsets_v3_be) { + def_v4 = indirect_lookup_2d, true>(this->r, this->offsets_v3_be->unit_table, 0, data1_2).to_v4(); } else { throw logic_error("table is not v2, v3, or v4"); } - if (data1_2 >= this->parsed_units.size()) { this->parsed_units.resize(data1_2 + 1); } @@ -269,13 +596,27 @@ const ItemParameterTable::UnitV4& ItemParameterTable::get_unit(uint8_t data1_2) } } +size_t ItemParameterTable::num_mags() const { + if (this->offsets_dc_protos) { + return indirect_lookup_2d_count(this->r, this->offsets_dc_protos->mag_table, 0); + } else if (this->offsets_v1_v2) { + return indirect_lookup_2d_count(this->r, this->offsets_v1_v2->mag_table, 0); + } else if (this->offsets_gc_nte) { + return indirect_lookup_2d_count(this->r, this->offsets_gc_nte->mag_table, 0); + } else if (this->offsets_v3_le) { + return indirect_lookup_2d_count(this->r, this->offsets_v3_le->mag_table, 0); + } else if (this->offsets_v3_be) { + return indirect_lookup_2d_count(this->r, this->offsets_v3_be->mag_table, 0); + } else if (this->offsets_v4) { + return indirect_lookup_2d_count(this->r, this->offsets_v4->mag_table, 0); + } else { + throw logic_error("table is not v2, v3, or v4"); + } +} + const ItemParameterTable::MagV4& ItemParameterTable::get_mag(uint8_t data1_1) const { if (this->offsets_v4) { - const auto& co = this->r.pget(this->offsets_v4->mag_table); - if (data1_1 >= co.count) { - throw out_of_range("mag ID out of range"); - } - return this->r.pget(co.offset + sizeof(MagV4) * data1_1); + return indirect_lookup_2d(this->r, this->offsets_v4->mag_table, 0, data1_1); } try { @@ -286,53 +627,23 @@ const ItemParameterTable::MagV4& ItemParameterTable::get_mag(uint8_t data1_1) co return ret; } catch (const std::out_of_range&) { MagV4 def_v4; - - if (this->offsets_v2) { - const auto& co = this->r.pget(this->offsets_v2->mag_table); - if (data1_1 >= co.count) { - throw out_of_range("mag ID out of range"); + if (this->offsets_dc_protos) { + def_v4 = indirect_lookup_2d(this->r, this->offsets_dc_protos->mag_table, 0, data1_1).to_v4(); + } else if (this->offsets_v1_v2) { + if (is_v1(this->version)) { + def_v4 = indirect_lookup_2d(this->r, this->offsets_v1_v2->mag_table, 0, data1_1).to_v4(); + } else { + def_v4 = indirect_lookup_2d(this->r, this->offsets_v1_v2->mag_table, 0, data1_1).to_v4(); } - const auto& def_v2 = this->r.pget(co.offset + sizeof(MagV2) * data1_1); - def_v4.base.id = def_v2.base.id; - def_v4.feed_table = def_v2.feed_table; - def_v4.photon_blast = def_v2.photon_blast; - def_v4.activation = def_v2.activation; - def_v4.on_pb_full = def_v2.on_pb_full; - def_v4.on_low_hp = def_v2.on_low_hp; - def_v4.on_death = def_v2.on_death; - def_v4.on_boss = def_v2.on_boss; - def_v4.on_pb_full_flag = def_v2.on_pb_full_flag; - def_v4.on_low_hp_flag = def_v2.on_low_hp_flag; - def_v4.on_death_flag = def_v2.on_death_flag; - def_v4.on_boss_flag = def_v2.on_boss_flag; - def_v4.class_flags = def_v2.class_flags; - - } else if (this->offsets_v3) { - const auto& co = this->r.pget(this->offsets_v3->mag_table); - if (data1_1 >= co.count) { - throw out_of_range("mag ID out of range"); - } - const auto& def_v3 = this->r.pget(co.offset + sizeof(MagV3) * data1_1); - def_v4.base.id = def_v3.base.id.load(); - def_v4.base.type = def_v3.base.type.load(); - def_v4.base.skin = def_v3.base.skin.load(); - def_v4.feed_table = def_v3.feed_table.load(); - def_v4.photon_blast = def_v3.photon_blast; - def_v4.activation = def_v3.activation; - def_v4.on_pb_full = def_v3.on_pb_full; - def_v4.on_low_hp = def_v3.on_low_hp; - def_v4.on_death = def_v3.on_death; - def_v4.on_boss = def_v3.on_boss; - def_v4.on_pb_full_flag = def_v3.on_pb_full_flag; - def_v4.on_low_hp_flag = def_v3.on_low_hp_flag; - def_v4.on_death_flag = def_v3.on_death_flag; - def_v4.on_boss_flag = def_v3.on_boss_flag; - def_v4.class_flags = def_v3.class_flags.load(); - + } else if (this->offsets_gc_nte) { + def_v4 = indirect_lookup_2d, true>(this->r, this->offsets_gc_nte->mag_table, 0, data1_1).to_v4(); + } else if (this->offsets_v3_le) { + def_v4 = indirect_lookup_2d, false>(this->r, this->offsets_v3_le->mag_table, 0, data1_1).to_v4(); + } else if (this->offsets_v3_be) { + def_v4 = indirect_lookup_2d, true>(this->r, this->offsets_v3_be->mag_table, 0, data1_1).to_v4(); } else { throw logic_error("table is not v2, v3, or v4"); } - if (data1_1 >= this->parsed_mags.size()) { this->parsed_mags.resize(data1_1 + 1); } @@ -341,17 +652,34 @@ const ItemParameterTable::MagV4& ItemParameterTable::get_mag(uint8_t data1_1) co } } +size_t ItemParameterTable::num_tools_in_class(uint8_t data1_1) const { + if (data1_1 >= this->num_tool_classes) { + throw out_of_range("tool class ID out of range"); + } + if (this->offsets_dc_protos) { + return indirect_lookup_2d_count(this->r, this->offsets_dc_protos->tool_table, data1_1); + } else if (this->offsets_v1_v2) { + return indirect_lookup_2d_count(this->r, this->offsets_v1_v2->tool_table, data1_1); + } else if (this->offsets_gc_nte) { + return indirect_lookup_2d_count(this->r, this->offsets_gc_nte->tool_table, data1_1); + } else if (this->offsets_v3_le) { + return indirect_lookup_2d_count(this->r, this->offsets_v3_le->tool_table, data1_1); + } else if (this->offsets_v3_be) { + return indirect_lookup_2d_count(this->r, this->offsets_v3_be->tool_table, data1_1); + } else if (this->offsets_v4) { + return indirect_lookup_2d_count(this->r, this->offsets_v4->tool_table, data1_1); + } else { + throw logic_error("table is not v2, v3, or v4"); + } +} + const ItemParameterTable::ToolV4& ItemParameterTable::get_tool(uint8_t data1_1, uint8_t data1_2) const { if (data1_1 >= this->num_tool_classes) { throw out_of_range("tool class ID out of range"); } if (this->offsets_v4) { - const auto& co = this->r.pget(this->offsets_v4->tool_table + sizeof(ArrayRefLE) * data1_1); - if (data1_2 >= co.count) { - throw out_of_range("tool ID out of range"); - } - return this->r.pget(co.offset + sizeof(ToolV4) * data1_2); + return indirect_lookup_2d(this->r, this->offsets_v4->tool_table, data1_1, data1_2); } uint16_t key = (data1_1 << 8) | data1_2; @@ -360,32 +688,16 @@ const ItemParameterTable::ToolV4& ItemParameterTable::get_tool(uint8_t data1_1, } catch (const std::out_of_range&) { ToolV4 def_v4; - if (this->offsets_v2) { - const auto& co = this->r.pget(this->offsets_v2->tool_table + sizeof(ArrayRefLE) * data1_1); - if (data1_2 >= co.count) { - throw out_of_range("tool ID out of range"); - } - const auto& def_v2 = this->r.pget(co.offset + sizeof(ToolV2) * data1_2); - def_v4.base.id = def_v2.base.id; - def_v4.amount = def_v2.amount; - def_v4.tech = def_v2.tech; - def_v4.cost = def_v2.cost; - def_v4.item_flag = def_v2.item_flag; - - } else if (this->offsets_v3) { - const auto& co = this->r.pget(this->offsets_v3->tool_table + sizeof(ArrayRefBE) * data1_1); - if (data1_2 >= co.count) { - throw out_of_range("tool ID out of range"); - } - const auto& def_v3 = this->r.pget(co.offset + sizeof(ToolV3) * data1_2); - def_v4.base.id = def_v3.base.id.load(); - def_v4.base.type = def_v3.base.type.load(); - def_v4.base.skin = def_v3.base.skin.load(); - def_v4.amount = def_v3.amount.load(); - def_v4.tech = def_v3.tech.load(); - def_v4.cost = def_v3.cost.load(); - def_v4.item_flag = def_v3.item_flag.load(); - + if (this->offsets_dc_protos) { + def_v4 = indirect_lookup_2d(this->r, this->offsets_dc_protos->tool_table, data1_1, data1_2).to_v4(); + } else if (this->offsets_v1_v2) { + def_v4 = indirect_lookup_2d(this->r, this->offsets_v1_v2->tool_table, data1_1, data1_2).to_v4(); + } else if (this->offsets_gc_nte) { + def_v4 = indirect_lookup_2d, true>(this->r, this->offsets_gc_nte->tool_table, data1_1, data1_2).to_v4(); + } else if (this->offsets_v3_le) { + def_v4 = indirect_lookup_2d, false>(this->r, this->offsets_v3_le->tool_table, data1_1, data1_2).to_v4(); + } else if (this->offsets_v3_be) { + def_v4 = indirect_lookup_2d, true>(this->r, this->offsets_v3_be->tool_table, data1_1, data1_2).to_v4(); } else { throw logic_error("table is not v2, v3, or v4"); } @@ -411,10 +723,16 @@ pair ItemParameterTable::find_tool_by_id_t(uint32_t tool_table } pair ItemParameterTable::find_tool_by_id(uint32_t item_id) const { - if (this->offsets_v2) { - return this->find_tool_by_id_t(this->offsets_v2->tool_table, item_id); - } else if (this->offsets_v3) { - return this->find_tool_by_id_t(this->offsets_v3->tool_table, item_id); + if (this->offsets_dc_protos) { + return this->find_tool_by_id_t(this->offsets_dc_protos->tool_table, item_id); + } else if (this->offsets_v1_v2) { + return this->find_tool_by_id_t(this->offsets_v1_v2->tool_table, item_id); + } else if (this->offsets_gc_nte) { + return this->find_tool_by_id_t, true>(this->offsets_gc_nte->tool_table, item_id); + } else if (this->offsets_v3_le) { + return this->find_tool_by_id_t, false>(this->offsets_v3_le->tool_table, item_id); + } else if (this->offsets_v3_be) { + return this->find_tool_by_id_t, true>(this->offsets_v3_be->tool_table, item_id); } else if (this->offsets_v4) { return this->find_tool_by_id_t(this->offsets_v4->tool_table, item_id); } else { @@ -422,9 +740,8 @@ pair ItemParameterTable::find_tool_by_id(uint32_t item_id) con } } -template -float ItemParameterTable::get_sale_divisor_t( - uint32_t weapon_table_offset, uint32_t non_weapon_table_offset, uint8_t data1_0, uint8_t data1_1) const { +template +float ItemParameterTable::get_sale_divisor_t(const OffsetsT* offsets, uint8_t data1_0, uint8_t data1_1) const { using FloatT = typename std::conditional::type; switch (data1_0) { @@ -432,10 +749,10 @@ float ItemParameterTable::get_sale_divisor_t( if (data1_1 >= this->num_weapon_classes) { return 0.0f; } - return this->r.pget(weapon_table_offset + data1_1 * sizeof(FloatT)); + return this->r.pget(offsets->weapon_sale_divisor_table + data1_1 * sizeof(FloatT)); case 1: { - const auto& divisors = this->r.pget>(non_weapon_table_offset); + const auto& divisors = this->r.pget>(offsets->sale_divisor_table); switch (data1_1) { case 1: return divisors.armor_divisor; @@ -448,7 +765,7 @@ float ItemParameterTable::get_sale_divisor_t( } case 2: { - const auto& divisors = this->r.pget>(non_weapon_table_offset); + const auto& divisors = this->r.pget>(offsets->sale_divisor_table); return divisors.mag_divisor; } @@ -458,15 +775,18 @@ float ItemParameterTable::get_sale_divisor_t( } float ItemParameterTable::get_sale_divisor(uint8_t data1_0, uint8_t data1_1) const { - if (this->offsets_v2) { - return this->get_sale_divisor_t( - this->offsets_v2->weapon_sale_divisor_table, this->offsets_v2->sale_divisor_table, data1_0, data1_1); - } else if (this->offsets_v3) { - return this->get_sale_divisor_t( - this->offsets_v3->weapon_sale_divisor_table, this->offsets_v3->sale_divisor_table, data1_0, data1_1); + if (this->offsets_dc_protos) { + return this->get_sale_divisor_t(this->offsets_dc_protos, data1_0, data1_1); + } else if (this->offsets_v1_v2) { + return this->get_sale_divisor_t(this->offsets_v1_v2, data1_0, data1_1); + } else if (this->offsets_gc_nte) { + return this->get_sale_divisor_t(this->offsets_gc_nte, data1_0, data1_1); + } else if (this->offsets_v3_le) { + return this->get_sale_divisor_t(this->offsets_v3_le, data1_0, data1_1); + } else if (this->offsets_v3_be) { + return this->get_sale_divisor_t(this->offsets_v3_be, data1_0, data1_1); } else if (this->offsets_v4) { - return this->get_sale_divisor_t( - this->offsets_v4->weapon_sale_divisor_table, this->offsets_v4->sale_divisor_table, data1_0, data1_1); + return this->get_sale_divisor_t(this->offsets_v4, data1_0, data1_1); } else { throw logic_error("table is not v2, v3, or v4"); } @@ -482,11 +802,20 @@ const ItemParameterTable::MagFeedResult& ItemParameterTable::get_mag_feed_result } uint32_t offset; - if (this->offsets_v2) { - const auto& table_offsets = this->r.pget>(this->offsets_v2->mag_feed_table); + if (this->offsets_dc_protos) { + const auto& table_offsets = this->r.pget>(this->offsets_dc_protos->mag_feed_table); offset = table_offsets.offsets[table_index]; - } else if (this->offsets_v3) { - const auto& table_offsets = this->r.pget>(this->offsets_v3->mag_feed_table); + } else if (this->offsets_v1_v2) { + const auto& table_offsets = this->r.pget>(this->offsets_v1_v2->mag_feed_table); + offset = table_offsets.offsets[table_index]; + } else if (this->offsets_gc_nte) { + const auto& table_offsets = this->r.pget>(this->offsets_gc_nte->mag_feed_table); + offset = table_offsets.offsets[table_index]; + } else if (this->offsets_v3_le) { + const auto& table_offsets = this->r.pget>(this->offsets_v3_le->mag_feed_table); + offset = table_offsets.offsets[table_index]; + } else if (this->offsets_v3_be) { + const auto& table_offsets = this->r.pget>(this->offsets_v3_be->mag_feed_table); offset = table_offsets.offsets[table_index]; } else if (this->offsets_v4) { const auto& table_offsets = this->r.pget>(this->offsets_v4->mag_feed_table); @@ -500,10 +829,16 @@ const ItemParameterTable::MagFeedResult& ItemParameterTable::get_mag_feed_result uint8_t ItemParameterTable::get_item_stars(uint32_t item_id) const { uint32_t base_offset; - if (this->offsets_v2) { - base_offset = this->offsets_v2->star_value_table; - } else if (this->offsets_v3) { - base_offset = this->offsets_v3->star_value_table; + if (this->offsets_dc_protos) { + base_offset = this->offsets_dc_protos->star_value_table; + } else if (this->offsets_v1_v2) { + base_offset = this->offsets_v1_v2->star_value_table; + } else if (this->offsets_gc_nte) { + base_offset = this->offsets_gc_nte->star_value_table; + } else if (this->offsets_v3_le) { + base_offset = this->offsets_v3_le->star_value_table; + } else if (this->offsets_v3_be) { + base_offset = this->offsets_v3_be->star_value_table; } else if (this->offsets_v4) { base_offset = this->offsets_v4->star_value_table; } else { @@ -515,9 +850,9 @@ uint8_t ItemParameterTable::get_item_stars(uint32_t item_id) const { : 0; } -uint8_t ItemParameterTable::get_special_stars(uint8_t det) const { - return ((det & 0x3F) && !(det & 0x80)) - ? this->get_item_stars(det + this->special_stars_begin_index) +uint8_t ItemParameterTable::get_special_stars(uint8_t special) const { + return ((special & 0x3F) && !(special & 0x80)) + ? this->get_item_stars(special + this->special_stars_begin_index) : 0; } @@ -527,14 +862,28 @@ const ItemParameterTable::Special& ItemParameterTable::get_special(uint8_ throw out_of_range("invalid special index"); } - if (this->offsets_v2) { - return this->r.pget>(this->offsets_v2->special_data_table + sizeof(Special) * special); - } else if (this->offsets_v3) { + if (this->offsets_dc_protos) { + return this->r.pget>(this->offsets_dc_protos->special_data_table + sizeof(Special) * special); + } else if (this->offsets_v1_v2) { + return this->r.pget>(this->offsets_v1_v2->special_data_table + sizeof(Special) * special); + } else if (this->offsets_v3_le) { + return this->r.pget>(this->offsets_v3_le->special_data_table + sizeof(Special) * special); + } else if (this->offsets_gc_nte) { if ((special >= this->parsed_specials.size()) || (this->parsed_specials[special].type != 0xFFFF)) { if (special >= this->parsed_specials.size()) { this->parsed_specials.resize(special + 1); } - const auto& sp_be = this->r.pget>(this->offsets_v3->special_data_table + sizeof(Special) * special); + const auto& sp_be = this->r.pget>(this->offsets_gc_nte->special_data_table + sizeof(Special) * special); + this->parsed_specials[special].type = sp_be.type.load(); + this->parsed_specials[special].amount = sp_be.amount.load(); + } + return this->parsed_specials[special]; + } else if (this->offsets_v3_be) { + if ((special >= this->parsed_specials.size()) || (this->parsed_specials[special].type != 0xFFFF)) { + if (special >= this->parsed_specials.size()) { + this->parsed_specials.resize(special + 1); + } + const auto& sp_be = this->r.pget>(this->offsets_v3_be->special_data_table + sizeof(Special) * special); this->parsed_specials[special].type = sp_be.type.load(); this->parsed_specials[special].amount = sp_be.amount.load(); } @@ -554,14 +903,18 @@ uint8_t ItemParameterTable::get_max_tech_level(uint8_t char_class, uint8_t tech_ throw out_of_range("invalid technique number"); } - if (this->offsets_v2) { + if (this->offsets_dc_protos || this->offsets_v1_v2) { if ((tech_num == 14) || (tech_num == 17)) { // Ryuker or Reverser return 0; } else { return ((char_class == 6) || (char_class == 7) || (char_class == 8) || (char_class == 10)) ? 29 : 14; } - } else if (this->offsets_v3) { - return r.pget_u8(this->offsets_v3->max_tech_level_table + tech_num * 12 + char_class); + } else if (this->offsets_gc_nte) { + return r.pget_u8(this->offsets_gc_nte->max_tech_level_table + tech_num * 12 + char_class); + } else if (this->offsets_v3_le) { + return r.pget_u8(this->offsets_v3_le->max_tech_level_table + tech_num * 12 + char_class); + } else if (this->offsets_v3_be) { + return r.pget_u8(this->offsets_v3_be->max_tech_level_table + tech_num * 12 + char_class); } else if (this->offsets_v4) { return r.pget_u8(this->offsets_v4->max_tech_level_table + tech_num * 12 + char_class); } else { @@ -571,10 +924,16 @@ uint8_t ItemParameterTable::get_max_tech_level(uint8_t char_class, uint8_t tech_ uint8_t ItemParameterTable::get_weapon_v1_replacement(uint8_t data1_1) const { uint32_t offset; - if (this->offsets_v2) { - offset = this->offsets_v2->v1_replacement_table; - } else if (this->offsets_v3) { - offset = this->offsets_v3->v1_replacement_table; + if (this->offsets_dc_protos) { + offset = this->offsets_dc_protos->v1_replacement_table; + } else if (this->offsets_v1_v2) { + offset = this->offsets_v1_v2->v1_replacement_table; + } else if (this->offsets_gc_nte) { + offset = this->offsets_gc_nte->v1_replacement_table; + } else if (this->offsets_v3_le) { + offset = this->offsets_v3_le->v1_replacement_table; + } else if (this->offsets_v3_be) { + offset = this->offsets_v3_be->v1_replacement_table; } else if (this->offsets_v4) { offset = this->offsets_v4->v1_replacement_table; } else { @@ -682,12 +1041,16 @@ bool ItemParameterTable::is_item_rare(const ItemData& item) const { return (this->get_item_base_stars(item) >= 9); } -bool ItemParameterTable::is_unsealable_item(const ItemData& item) const { +bool ItemParameterTable::is_unsealable_item(uint8_t data1_0, uint8_t data1_1, uint8_t data1_2) const { uint32_t offset, count; - if (this->offsets_v2) { + if (this->offsets_dc_protos || this->offsets_v1_v2 || this->offsets_gc_nte) { return false; - } else if (this->offsets_v3) { - const auto& co = this->r.pget(this->offsets_v3->unsealable_table); + } else if (this->offsets_v3_le) { + const auto& co = this->r.pget(this->offsets_v3_le->unsealable_table); + offset = co.offset; + count = co.count; + } else if (this->offsets_v3_be) { + const auto& co = this->r.pget(this->offsets_v3_be->unsealable_table); offset = co.offset; count = co.count; } else if (this->offsets_v4) { @@ -700,15 +1063,19 @@ bool ItemParameterTable::is_unsealable_item(const ItemData& item) const { const auto* defs = &this->r.pget(offset, count * sizeof(UnsealableItem)); for (size_t z = 0; z < count; z++) { - if ((defs[z].item[0] == item.data1[0]) && - (defs[z].item[1] == item.data1[1]) && - (defs[z].item[2] == item.data1[2])) { + if ((defs[z].item[0] == data1_0) && + (defs[z].item[1] == data1_1) && + (defs[z].item[2] == data1_2)) { return true; } } return false; } +bool ItemParameterTable::is_unsealable_item(const ItemData& item) const { + return this->is_unsealable_item(item.data1[0], item.data1[1], item.data1[2]); +} + const ItemParameterTable::ItemCombination& ItemParameterTable::get_item_combination( const ItemData& used_item, const ItemData& equipped_item) const { for (const auto& def : this->get_all_combinations_for_used_item(used_item)) { @@ -735,11 +1102,15 @@ const std::vector& ItemParameterTable::get_ const std::map>& ItemParameterTable::get_all_item_combinations() const { if (this->item_combination_index.empty()) { uint32_t offset, count; - if (this->offsets_v2) { + if (this->offsets_dc_protos || this->offsets_v1_v2 || this->offsets_gc_nte) { static const std::map> empty_map; return empty_map; - } else if (this->offsets_v3) { - const auto& co = this->r.pget(this->offsets_v3->combination_table); + } else if (this->offsets_v3_le) { + const auto& co = this->r.pget(this->offsets_v3_le->combination_table); + offset = co.offset; + count = co.count; + } else if (this->offsets_v3_be) { + const auto& co = this->r.pget(this->offsets_v3_be->combination_table); offset = co.offset; count = co.count; } else if (this->offsets_v4) { @@ -760,6 +1131,25 @@ const std::map>& Item return this->item_combination_index; } +template +size_t ItemParameterTable::num_events_t(uint32_t base_offset) const { + return this->r.pget>(base_offset).count; +} + +size_t ItemParameterTable::num_events() const { + if (this->offsets_dc_protos || this->offsets_v1_v2 || this->offsets_gc_nte) { + return 0; + } else if (this->offsets_v3_le) { + return this->num_events_t(this->offsets_v3_le->unwrap_table); + } else if (this->offsets_v3_be) { + return this->num_events_t(this->offsets_v3_be->unwrap_table); + } else if (this->offsets_v4) { + return this->num_events_t(this->offsets_v4->unwrap_table); + } else { + throw logic_error("table is not v2, v3, or v4"); + } +} + template std::pair ItemParameterTable::get_event_items_t( uint32_t base_offset, uint8_t event_number) const { @@ -773,10 +1163,12 @@ std::pair ItemParameterTable::get_ } std::pair ItemParameterTable::get_event_items(uint8_t event_number) const { - if (this->offsets_v2) { + if (this->offsets_dc_protos || this->offsets_v1_v2 || this->offsets_gc_nte) { return make_pair(nullptr, 0); - } else if (this->offsets_v3) { - return this->get_event_items_t(this->offsets_v3->unwrap_table, event_number); + } else if (this->offsets_v3_le) { + return this->get_event_items_t(this->offsets_v3_le->unwrap_table, event_number); + } else if (this->offsets_v3_be) { + return this->get_event_items_t(this->offsets_v3_be->unwrap_table, event_number); } else if (this->offsets_v4) { return this->get_event_items_t(this->offsets_v4->unwrap_table, event_number); } else { diff --git a/src/ItemParameterTable.hh b/src/ItemParameterTable.hh index 68ada94d..cdf465b3 100644 --- a/src/ItemParameterTable.hh +++ b/src/ItemParameterTable.hh @@ -5,6 +5,7 @@ #include #include #include +#include #include #include @@ -13,11 +14,16 @@ class ItemParameterTable { public: + // TODO: This implementation is ugly. We should use real classes and virtual + // functions instead of manually branching on various offset table pointers + // being null or not in each public function. Rewrite this and make it better. + template struct ArrayRef { using U32T = typename std::conditional::type; - U32T count; - U32T offset; + /* 00 */ U32T count; + /* 04 */ U32T offset; + /* 08 */ } __attribute__((packed)); struct ArrayRefLE : ArrayRef { } __attribute__((packed)); @@ -29,152 +35,240 @@ public: using U32T = typename std::conditional::type; // id specifies several things; notably, it doubles as the index of the // item's name in the text archive (e.g. TextEnglish) collection 0. - U32T id = 0xFFFFFFFF; + /* 00 */ U32T id = 0xFFFFFFFF; + /* 04 */ } __attribute__((packed)); template struct ItemBaseV3 : ItemBaseV2 { using U16T = typename std::conditional::type; - U16T type = 0; - U16T skin = 0; + /* 04 */ U16T type = 0; + /* 06 */ U16T skin = 0; + /* 08 */ } __attribute__((packed)); template struct ItemBaseV4 : ItemBaseV3 { using U32T = typename std::conditional::type; - U32T team_points = 0; + /* 08 */ U32T team_points = 0; + /* 0C */ } __attribute__((packed)); - struct WeaponV2 { - ItemBaseV2 base; - le_uint16_t class_flags = 0; - le_uint16_t atp_min = 0; - le_uint16_t atp_max = 0; - le_uint16_t atp_required = 0; - le_uint16_t mst_required = 0; - le_uint16_t ata_required = 0; - uint8_t max_grind = 0; - uint8_t photon = 0; - uint8_t special = 0; - uint8_t ata = 0; - uint8_t stat_boost = 0; // TODO: This could be larger (16 or 32 bits) - parray unknown_a9; + struct WeaponV4; + struct WeaponDCProtos { + /* 00 */ ItemBaseV2 base; + /* 04 */ le_uint16_t class_flags = 0; + /* 06 */ le_uint16_t atp_min = 0; + /* 08 */ le_uint16_t atp_max = 0; + /* 0A */ le_uint16_t atp_required = 0; + /* 0C */ le_uint16_t mst_required = 0; + /* 0E */ le_uint16_t ata_required = 0; + /* 10 */ uint8_t max_grind = 0; + /* 11 */ uint8_t photon = 0; + /* 12 */ uint8_t special = 0; + /* 13 */ uint8_t ata = 0; + /* 14 */ + + WeaponV4 to_v4() const; + } __attribute__((packed)); + + struct WeaponV1V2 { + /* 00 */ ItemBaseV2 base; + /* 04 */ le_uint16_t class_flags = 0; + /* 06 */ le_uint16_t atp_min = 0; + /* 08 */ le_uint16_t atp_max = 0; + /* 0A */ le_uint16_t atp_required = 0; + /* 0C */ le_uint16_t mst_required = 0; + /* 0E */ le_uint16_t ata_required = 0; + /* 10 */ uint8_t max_grind = 0; + /* 11 */ uint8_t photon = 0; + /* 12 */ uint8_t special = 0; + /* 13 */ uint8_t ata = 0; + /* 14 */ uint8_t stat_boost = 0; // TODO: This could be larger (16 or 32 bits) + /* 15 */ parray unknown_a9; + /* 18 */ + + WeaponV4 to_v4() const; + } __attribute__((packed)); + + struct WeaponGCNTE { + /* 00 */ ItemBaseV3 base; + /* 08 */ be_uint16_t class_flags = 0; + /* 0A */ be_uint16_t atp_min = 0; + /* 0C */ be_uint16_t atp_max = 0; + /* 0E */ be_uint16_t atp_required = 0; + /* 10 */ be_uint16_t mst_required = 0; + /* 12 */ be_uint16_t ata_required = 0; + /* 14 */ be_uint16_t mst = 0; + /* 16 */ uint8_t max_grind = 0; + /* 17 */ uint8_t photon = 0; + /* 18 */ uint8_t special = 0; + /* 19 */ uint8_t ata = 0; + /* 1A */ uint8_t stat_boost = 0; + /* 1B */ uint8_t projectile = 0; + /* 1C */ int8_t trail1_x = 0; + /* 1D */ int8_t trail1_y = 0; + /* 1E */ int8_t trail2_x = 0; + /* 1F */ int8_t trail2_y = 0; + /* 20 */ int8_t color = 0; + /* 21 */ uint8_t unknown_a1 = 0; + /* 22 */ uint8_t unknown_a2 = 0; + /* 23 */ uint8_t unknown_a3 = 0; + /* 24 */ + + WeaponV4 to_v4() const; } __attribute__((packed)); template struct WeaponV3 { using U16T = typename std::conditional::type; - ItemBaseV3 base; - U16T class_flags = 0; - U16T atp_min = 0; - U16T atp_max = 0; - U16T atp_required = 0; - U16T mst_required = 0; - U16T ata_required = 0; - U16T mst = 0; - uint8_t max_grind = 0; - uint8_t photon = 0; - uint8_t special = 0; - uint8_t ata = 0; - uint8_t stat_boost = 0; - uint8_t projectile = 0; - int8_t trail1_x = 0; - int8_t trail1_y = 0; - int8_t trail2_x = 0; - int8_t trail2_y = 0; - int8_t color = 0; - uint8_t unknown_a1 = 0; - uint8_t unknown_a2 = 0; - uint8_t unknown_a3 = 0; - uint8_t unknown_a4 = 0; - uint8_t unknown_a5 = 0; - uint8_t tech_boost = 0; - uint8_t combo_type = 0; + /* 00 */ ItemBaseV3 base; + /* 08 */ U16T class_flags = 0; + /* 0A */ U16T atp_min = 0; + /* 0C */ U16T atp_max = 0; + /* 0E */ U16T atp_required = 0; + /* 10 */ U16T mst_required = 0; + /* 12 */ U16T ata_required = 0; + /* 14 */ U16T mst = 0; + /* 16 */ uint8_t max_grind = 0; + /* 17 */ uint8_t photon = 0; + /* 18 */ uint8_t special = 0; + /* 19 */ uint8_t ata = 0; + /* 1A */ uint8_t stat_boost = 0; + /* 1B */ uint8_t projectile = 0; + /* 1C */ int8_t trail1_x = 0; + /* 1D */ int8_t trail1_y = 0; + /* 1E */ int8_t trail2_x = 0; + /* 1F */ int8_t trail2_y = 0; + /* 20 */ int8_t color = 0; + /* 21 */ uint8_t unknown_a1 = 0; + /* 22 */ uint8_t unknown_a2 = 0; + /* 23 */ uint8_t unknown_a3 = 0; + /* 24 */ uint8_t unknown_a4 = 0; + /* 25 */ uint8_t unknown_a5 = 0; + /* 26 */ uint8_t tech_boost = 0; + /* 27 */ uint8_t combo_type = 0; + /* 28 */ + + WeaponV4 to_v4() const; } __attribute__((packed)); struct WeaponV4 { - ItemBaseV4 base; - le_uint16_t class_flags = 0x00FF; - le_uint16_t atp_min = 0; - le_uint16_t atp_max = 0; - le_uint16_t atp_required = 0; - le_uint16_t mst_required = 0; - le_uint16_t ata_required = 0; - le_uint16_t mst = 0; - uint8_t max_grind = 0; - uint8_t photon = 0; - uint8_t special = 0; - uint8_t ata = 0; - uint8_t stat_boost = 0; - uint8_t projectile = 0; - int8_t trail1_x = 0; - int8_t trail1_y = 0; - int8_t trail2_x = 0; - int8_t trail2_y = 0; - int8_t color = 0; - uint8_t unknown_a1 = 0; - uint8_t unknown_a2 = 0; - uint8_t unknown_a3 = 0; - uint8_t unknown_a4 = 0; - uint8_t unknown_a5 = 0; - uint8_t tech_boost = 0; - uint8_t combo_type = 0; + /* 00 */ ItemBaseV4 base; + /* 0C */ le_uint16_t class_flags = 0x00FF; + /* 0E */ le_uint16_t atp_min = 0; + /* 10 */ le_uint16_t atp_max = 0; + /* 12 */ le_uint16_t atp_required = 0; + /* 14 */ le_uint16_t mst_required = 0; + /* 16 */ le_uint16_t ata_required = 0; + /* 18 */ le_uint16_t mst = 0; + /* 1A */ uint8_t max_grind = 0; + /* 1B */ uint8_t photon = 0; + /* 1C */ uint8_t special = 0; + /* 1D */ uint8_t ata = 0; + /* 1E */ uint8_t stat_boost = 0; + /* 1F */ uint8_t projectile = 0; + /* 20 */ int8_t trail1_x = 0; + /* 21 */ int8_t trail1_y = 0; + /* 22 */ int8_t trail2_x = 0; + /* 23 */ int8_t trail2_y = 0; + /* 24 */ int8_t color = 0; + /* 25 */ uint8_t unknown_a1 = 0; + /* 26 */ uint8_t unknown_a2 = 0; + /* 27 */ uint8_t unknown_a3 = 0; + /* 28 */ uint8_t unknown_a4 = 0; + /* 29 */ uint8_t unknown_a5 = 0; + /* 2A */ uint8_t tech_boost = 0; + /* 2B */ uint8_t combo_type = 0; + /* 2C */ } __attribute__((packed)); template struct ArmorOrShield { using U16T = typename std::conditional::type; - BaseT base; - U16T dfp = 0; - U16T evp = 0; - uint8_t block_particle = 0; - uint8_t block_effect = 0; - U16T class_flags = 0x00FF; - uint8_t required_level = 0; - uint8_t efr = 0; - uint8_t eth = 0; - uint8_t eic = 0; - uint8_t edk = 0; - uint8_t elt = 0; - uint8_t dfp_range = 0; - uint8_t evp_range = 0; - uint8_t stat_boost = 0; - uint8_t tech_boost = 0; - U16T unknown_a2 = 0; + /* V1/V2 offsets */ + /* 00 */ BaseT base; + /* 04 */ U16T dfp = 0; + /* 06 */ U16T evp = 0; + /* 08 */ uint8_t block_particle = 0; + /* 09 */ uint8_t block_effect = 0; + /* 0A */ U16T class_flags = 0x00FF; + /* 0C */ uint8_t required_level = 0; + /* 0D */ uint8_t efr = 0; + /* 0E */ uint8_t eth = 0; + /* 0F */ uint8_t eic = 0; + /* 10 */ uint8_t edk = 0; + /* 11 */ uint8_t elt = 0; + /* 12 */ uint8_t dfp_range = 0; + /* 13 */ uint8_t evp_range = 0; + /* 14 */ } __attribute__((packed)); - struct ArmorOrShieldV2 : ArmorOrShield, false> { + + struct ArmorOrShieldV4; + struct ArmorOrShieldDCProtos : ArmorOrShield, false> { + ArmorOrShieldV4 to_v4() const; } __attribute__((packed)); - struct ArmorOrShieldV3 : ArmorOrShield, true> { + template + struct ArmorOrShieldFinal : ArmorOrShield { + using U16T = typename std::conditional::type; + /* 14 */ uint8_t stat_boost = 0; + /* 15 */ uint8_t tech_boost = 0; + /* 16 */ U16T unknown_a2 = 0; + /* 18 */ } __attribute__((packed)); - struct ArmorOrShieldV4 : ArmorOrShield, false> { + + struct ArmorOrShieldV1V2 : ArmorOrShieldFinal, false> { + ArmorOrShieldV4 to_v4() const; + } __attribute__((packed)); + template + struct ArmorOrShieldV3 : ArmorOrShieldFinal, IsBigEndian> { + ArmorOrShieldV4 to_v4() const; + } __attribute__((packed)); + struct ArmorOrShieldV4 : ArmorOrShieldFinal, false> { } __attribute__((packed)); template struct Unit { using U16T = typename std::conditional::type; using S16T = typename std::conditional::type; - BaseT base; - U16T stat = 0; - U16T stat_amount = 0; - S16T modifier_amount = 0; - parray unused; + /* V1/V2 offsets */ + /* 00 */ BaseT base; + /* 04 */ U16T stat = 0; + /* 06 */ U16T stat_amount = 0; + /* 08 */ } __attribute__((packed)); - struct UnitV2 : Unit, false> { + + struct UnitV4; + struct UnitDCProtos : Unit, false> { + UnitV4 to_v4() const; } __attribute__((packed)); - struct UnitV3 : Unit, true> { + template + struct UnitFinal : Unit { + using S16T = typename std::conditional::type; + /* 08 */ S16T modifier_amount = 0; + /* 0A */ parray unused; + /* 0C */ } __attribute__((packed)); - struct UnitV4 : Unit, false> { + struct UnitV1V2 : UnitFinal, false> { + UnitV4 to_v4() const; + } __attribute__((packed)); + template + struct UnitV3 : UnitFinal, IsBigEndian> { + UnitV4 to_v4() const; + } __attribute__((packed)); + struct UnitV4 : UnitFinal, false> { } __attribute__((packed)); template struct Mag { using U16T = typename std::conditional::type; - BaseT base; - U16T feed_table = 0; - uint8_t photon_blast = 0; - uint8_t activation = 0; - uint8_t on_pb_full = 0; - uint8_t on_low_hp = 0; - uint8_t on_death = 0; - uint8_t on_boss = 0; + /* V1/V2 offsets */ + /* 00 */ BaseT base; + /* 04 */ U16T feed_table = 0; + /* 06 */ uint8_t photon_blast = 0; + /* 07 */ uint8_t activation = 0; + /* 08 */ uint8_t on_pb_full = 0; + /* 09 */ uint8_t on_low_hp = 0; + /* 0A */ uint8_t on_death = 0; + /* 0B */ uint8_t on_boss = 0; // These flags control how likely each effect is to activate. First, the // game computes step_synchro as follows: // if synchro in [0, 30], step_synchro = 0 @@ -190,18 +284,37 @@ public: // flag == 3 => activation - 10 // flag == 4 => step_synchro - 10 // anything else => 0 (effect never occurs) - uint8_t on_pb_full_flag = 0; - uint8_t on_low_hp_flag = 0; - uint8_t on_death_flag = 0; - uint8_t on_boss_flag = 0; - U16T class_flags = 0x00FF; - parray unused; + /* 0C */ uint8_t on_pb_full_flag = 0; + /* 0D */ uint8_t on_low_hp_flag = 0; + /* 0E */ uint8_t on_death_flag = 0; + /* 0F */ uint8_t on_boss_flag = 0; + /* 10 */ + } __attribute__((packed)); + + struct MagV4; + struct MagV1 : Mag, false> { + MagV4 to_v4() const; } __attribute__((packed)); struct MagV2 : Mag, false> { + /* 10 */ le_uint16_t class_flags = 0x00FF; + /* 12 */ parray unused; + /* 14 */ + + MagV4 to_v4() const; } __attribute__((packed)); - struct MagV3 : Mag, true> { + template + struct MagV3 : Mag, IsBigEndian> { + using U16T = typename std::conditional::type; + /* 10 */ U16T class_flags = 0x00FF; + /* 12 */ parray unused; + /* 14 */ + + MagV4 to_v4() const; } __attribute__((packed)); struct MagV4 : Mag, false> { + /* 10 */ le_uint16_t class_flags = 0x00FF; + /* 12 */ parray unused; + /* 14 */ } __attribute__((packed)); template @@ -209,15 +322,22 @@ public: using U16T = typename std::conditional::type; using S32T = typename std::conditional::type; using U32T = typename std::conditional::type; - BaseT base; - U16T amount = 0; - U16T tech = 0; - S32T cost = 0; - U32T item_flag = 0; + /* V1/V2 offsets */ + /* 00 */ BaseT base; + /* 04 */ U16T amount = 0; + /* 06 */ U16T tech = 0; + /* 08 */ S32T cost = 0; + /* 0C */ U32T item_flag = 0; + /* 10 */ } __attribute__((packed)); - struct ToolV2 : Tool, false> { + + struct ToolV4; + struct ToolV1V2 : Tool, false> { + ToolV4 to_v4() const; } __attribute__((packed)); - struct ToolV3 : Tool, true> { + template + struct ToolV3 : Tool, IsBigEndian> { + ToolV4 to_v4() const; } __attribute__((packed)); struct ToolV4 : Tool, false> { } __attribute__((packed)); @@ -301,25 +421,28 @@ public: FloatT mag_divisor = 0.0f; } __attribute__((packed)); - enum class Version { - V2, - V3, - V4, - }; - ItemParameterTable(std::shared_ptr data, Version version); ~ItemParameterTable() = default; + void print(FILE* stream) const; + std::set compute_all_valid_primary_identifiers() const; + + size_t num_weapons_in_class(uint8_t data1_1) const; const WeaponV4& get_weapon(uint8_t data1_1, uint8_t data1_2) const; + size_t num_armors_or_shields_in_class(uint8_t data1_1) const; const ArmorOrShieldV4& get_armor_or_shield(uint8_t data1_1, uint8_t data1_2) const; + size_t num_units() const; const UnitV4& get_unit(uint8_t data1_2) const; + size_t num_mags() const; const MagV4& get_mag(uint8_t data1_1) const; + size_t num_tools_in_class(uint8_t data1_1) const; const ToolV4& get_tool(uint8_t data1_1, uint8_t data1_2) const; std::pair find_tool_by_id(uint32_t id) const; + float get_sale_divisor(uint8_t data1_0, uint8_t data1_1) const; const MagFeedResult& get_mag_feed_result(uint8_t table_index, uint8_t which) const; uint8_t get_item_stars(uint32_t id) const; - uint8_t get_special_stars(uint8_t det) const; + uint8_t get_special_stars(uint8_t special) const; const Special& get_special(uint8_t special) const; uint8_t get_max_tech_level(uint8_t char_class, uint8_t tech_num) const; uint8_t get_weapon_v1_replacement(uint8_t data1_1) const; @@ -329,10 +452,12 @@ public: uint8_t get_item_base_stars(const ItemData& item) const; uint8_t get_item_adjusted_stars(const ItemData& item) const; bool is_item_rare(const ItemData& item) const; + bool is_unsealable_item(uint8_t data1_0, uint8_t data1_1, uint8_t data1_2) const; bool is_unsealable_item(const ItemData& param_1) const; const ItemCombination& get_item_combination(const ItemData& used_item, const ItemData& equipped_item) const; const std::vector& get_all_combinations_for_used_item(const ItemData& used_item) const; const std::map>& get_all_item_combinations() const; + size_t num_events() const; std::pair get_event_items(uint8_t event_number) const; size_t price_for_item(const ItemData& item) const; @@ -344,10 +469,32 @@ public: size_t special_stars_begin_index; size_t num_specials; size_t first_rare_mag_index; - size_t star_value_table_size; private: - struct TableOffsetsV2 { + struct TableOffsetsDCProtos { + /* 00 */ le_uint32_t unknown_a0; + /* 04 */ le_uint32_t weapon_table; + /* 08 */ le_uint32_t armor_table; + /* 0C */ le_uint32_t unit_table; + /* 10 */ le_uint32_t tool_table; + /* 14 */ le_uint32_t mag_table; + /* 18 */ le_uint32_t v1_replacement_table; + /* 1C */ le_uint32_t photon_color_table; + /* 20 */ le_uint32_t weapon_range_table; + /* 24 */ le_uint32_t weapon_sale_divisor_table; + /* 28 */ le_uint32_t sale_divisor_table; + /* 2C */ le_uint32_t mag_feed_table; + /* 30 */ le_uint32_t star_value_table; + /* 34 */ le_uint32_t unknown_a1; + /* 38 */ le_uint32_t special_data_table; + /* 3C */ le_uint32_t stat_boost_table; + /* 40 */ le_uint32_t shield_effect_table; + /* 44 */ le_uint32_t unknown_a2; + /* 48 */ le_uint32_t unknown_a3; + /* 4C */ le_uint32_t unknown_a4; + } __attribute__((packed)); + + struct TableOffsetsV1V2 { // TODO: Is weapon count 0x89 or 0x8A? It could be that the last entry in // weapon_table is used for ???? items. /* 00 / 0013 */ le_uint32_t unknown_a0; @@ -363,14 +510,34 @@ private: /* 28 / 40A8 */ le_uint32_t sale_divisor_table; // -> NonWeaponSaleDivisors /* 2C / 5F4C */ le_uint32_t mag_feed_table; // -> MagFeedResultsTable /* 30 / 4378 */ le_uint32_t star_value_table; // -> [uint8_t](0x1C7) - /* 34 / 4540 */ le_uint32_t special_data_table; // -> [Special](0x29) - /* 38 / 45E4 */ le_uint32_t weapon_effect_table; // -> [16-byte structs] + /* 34 / 45E4 */ le_uint32_t unknown_a1; + /* 38 / 4540 */ le_uint32_t special_data_table; // -> [Special](0x29) /* 3C / 58DC */ le_uint32_t stat_boost_table; // -> [StatBoost] /* 40 / 5704 */ le_uint32_t shield_effect_table; // -> [8-byte structs] } __attribute__((packed)); - // TODO: The GC NTE ItemPMT format is intermediate between V2 and V3 - the - // Offsets struct is 0x50 bytes. Figure it out and add support here. + struct TableOffsetsGCNTE { + /* 00 / 6F0C */ be_uint32_t weapon_table; // -> [{count, offset -> [WeaponV3/WeaponV4]}](0xED) + /* 04 / 6E4C */ be_uint32_t armor_table; // -> [{count, offset -> [ArmorOrShieldV3/ArmorOrShieldV4]}](2; armors and shields) + /* 08 / 6E5C */ be_uint32_t unit_table; // -> {count, offset -> [UnitV3/UnitV4]} (last if out of range) + /* 0C / 6E6C */ be_uint32_t tool_table; // -> [{count, offset -> [ToolV3/ToolV4]}](0x1A) (last if out of range) + /* 10 / 6E64 */ be_uint32_t mag_table; // -> {count, offset -> [MagV3/MagV4]} + /* 14 / 47BC */ be_uint32_t v1_replacement_table; // -> [uint8_t](0xED) + /* 18 / 37A4 */ be_uint32_t photon_color_table; // -> [0x24-byte structs](0x20) + /* 1C / 3A74 */ be_uint32_t weapon_range_table; // -> ??? + /* 20 / 484C */ be_uint32_t weapon_sale_divisor_table; // -> [float](0xED) + /* 24 / 4A80 */ be_uint32_t sale_divisor_table; // -> NonWeaponSaleDivisors + /* 28 / 7384 */ be_uint32_t mag_feed_table; // -> MagFeedResultsTable + /* 2C / 4D50 */ be_uint32_t star_value_table; // -> [uint8_t](0x330) (indexed by .id from weapon, armor, etc.) + /* 30 / 4F72 */ be_uint32_t special_data_table; // -> [Special] + /* 34 / 5018 */ be_uint32_t weapon_effect_table; // -> [16-byte structs] + /* 38 / 68B8 */ be_uint32_t stat_boost_table; // -> [StatBoost] + /* 3C / 61B8 */ be_uint32_t shield_effect_table; // -> [8-byte structs] + /* 40 / 69D8 */ be_uint32_t max_tech_level_table; // -> MaxTechniqueLevels + /* 44 / 737C */ be_uint32_t combination_table; // -> {count, offset -> [ItemCombination]} + /* 48 / 68B0 */ be_uint32_t unknown_a1; + /* 4C / 6B1C */ be_uint32_t tech_boost_table; // -> [TechniqueBoost] (always 0x2C of them? from counts struct?) + } __attribute__((packed)); template struct TableOffsetsV3V4 { @@ -401,10 +568,14 @@ private: /* 58 / F600 / 15024 */ U32T ranged_special_table; // -> {count, offset -> [4-byte structs]} } __attribute__((packed)); + Version version; std::shared_ptr data; StringReader r; - const TableOffsetsV2* offsets_v2; - const TableOffsetsV3V4* offsets_v3; + const TableOffsetsDCProtos* offsets_dc_protos; + const TableOffsetsV1V2* offsets_v1_v2; + const TableOffsetsGCNTE* offsets_gc_nte; + const TableOffsetsV3V4* offsets_v3_le; + const TableOffsetsV3V4* offsets_v3_be; const TableOffsetsV3V4* offsets_v4; // These are unused if offsets_v4 is not null (in that case, we just return @@ -423,8 +594,10 @@ private: template std::pair find_tool_by_id_t(uint32_t tool_table_offset, uint32_t id) const; + template + float get_sale_divisor_t(const OffsetsT* offsets, uint8_t data1_0, uint8_t data1_1) const; template - float get_sale_divisor_t(uint32_t weapon_table_offset, uint32_t non_weapon_table_offset, uint8_t data1_0, uint8_t data1_1) const; + size_t num_events_t(uint32_t base_offset) const; template std::pair get_event_items_t(uint32_t base_offset, uint8_t event_number) const; }; diff --git a/src/Main.cc b/src/Main.cc index b3bdc330..7681b705 100644 --- a/src/Main.cc +++ b/src/Main.cc @@ -1402,27 +1402,27 @@ Action a_describe_item( item.data1[8], item.data1[9], item.data1[10], item.data1[11], item.data2[0], item.data2[1], item.data2[2], item.data2[3]); - ItemData item_v1 = item; - item_v1.encode_for_version(Version::PC_V2, s.item_parameter_table(Version::PC_V2)); - ItemData item_v1_decoded = item_v1; - item_v1_decoded.decode_for_version(Version::PC_V2); + ItemData item_v2 = item; + item_v2.encode_for_version(Version::PC_V2, s.item_parameter_table_for_encode(Version::PC_V2)); + ItemData item_v2_decoded = item_v2; + item_v2_decoded.decode_for_version(Version::PC_V2); - log_info("Data (V1-encoded): %02hhX%02hhX%02hhX%02hhX %02hhX%02hhX%02hhX%02hhX %02hhX%02hhX%02hhX%02hhX -------- %02hhX%02hhX%02hhX%02hhX", - item_v1.data1[0], item_v1.data1[1], item_v1.data1[2], item_v1.data1[3], - item_v1.data1[4], item_v1.data1[5], item_v1.data1[6], item_v1.data1[7], - item_v1.data1[8], item_v1.data1[9], item_v1.data1[10], item_v1.data1[11], - item_v1.data2[0], item_v1.data2[1], item_v1.data2[2], item_v1.data2[3]); - if (item_v1_decoded != item) { - log_warning("V1-decoded data does not match original data"); - log_warning("Data (V1-decoded): %02hhX%02hhX%02hhX%02hhX %02hhX%02hhX%02hhX%02hhX %02hhX%02hhX%02hhX%02hhX -------- %02hhX%02hhX%02hhX%02hhX", - item_v1_decoded.data1[0], item_v1_decoded.data1[1], item_v1_decoded.data1[2], item_v1_decoded.data1[3], - item_v1_decoded.data1[4], item_v1_decoded.data1[5], item_v1_decoded.data1[6], item_v1_decoded.data1[7], - item_v1_decoded.data1[8], item_v1_decoded.data1[9], item_v1_decoded.data1[10], item_v1_decoded.data1[11], - item_v1_decoded.data2[0], item_v1_decoded.data2[1], item_v1_decoded.data2[2], item_v1_decoded.data2[3]); + log_info("Data (V2-encoded): %02hhX%02hhX%02hhX%02hhX %02hhX%02hhX%02hhX%02hhX %02hhX%02hhX%02hhX%02hhX -------- %02hhX%02hhX%02hhX%02hhX", + item_v2.data1[0], item_v2.data1[1], item_v2.data1[2], item_v2.data1[3], + item_v2.data1[4], item_v2.data1[5], item_v2.data1[6], item_v2.data1[7], + item_v2.data1[8], item_v2.data1[9], item_v2.data1[10], item_v2.data1[11], + item_v2.data2[0], item_v2.data2[1], item_v2.data2[2], item_v2.data2[3]); + if (item_v2_decoded != item) { + log_warning("V2-decoded data does not match original data"); + log_warning("Data (V2-decoded): %02hhX%02hhX%02hhX%02hhX %02hhX%02hhX%02hhX%02hhX %02hhX%02hhX%02hhX%02hhX -------- %02hhX%02hhX%02hhX%02hhX", + item_v2_decoded.data1[0], item_v2_decoded.data1[1], item_v2_decoded.data1[2], item_v2_decoded.data1[3], + item_v2_decoded.data1[4], item_v2_decoded.data1[5], item_v2_decoded.data1[6], item_v2_decoded.data1[7], + item_v2_decoded.data1[8], item_v2_decoded.data1[9], item_v2_decoded.data1[10], item_v2_decoded.data1[11], + item_v2_decoded.data2[0], item_v2_decoded.data2[1], item_v2_decoded.data2[2], item_v2_decoded.data2[3]); } ItemData item_gc = item; - item_gc.encode_for_version(Version::GC_V3, s.item_parameter_table(Version::GC_V3)); + item_gc.encode_for_version(Version::GC_V3, s.item_parameter_table_for_encode(Version::GC_V3)); ItemData item_gc_decoded = item_gc; item_gc_decoded.decode_for_version(Version::GC_V3); @@ -1461,12 +1461,12 @@ Action a_name_all_items( } } - fprintf(stderr, "IDENT :"); + fprintf(stderr, "IDENT :"); for (size_t v_s = 0; v_s < NUM_VERSIONS; v_s++) { Version version = static_cast(v_s); const auto& index = s.item_name_indexes.at(v_s); if (index) { - fprintf(stderr, " %30s", name_for_enum(version)); + fprintf(stderr, " %30s ", name_for_enum(version)); } } fputc('\n', stderr); @@ -1492,6 +1492,20 @@ Action a_name_all_items( } }); +Action a_print_item_parameter_tables( + "print-item-tables", nullptr, +[](Arguments&) { + ServerState s; + s.load_objects_and_upstream_dependents("item_name_indexes"); + for (size_t v_s = 0; v_s < NUM_VERSIONS; v_s++) { + const auto& index = s.item_name_indexes.at(v_s); + if (index) { + Version v = static_cast(v_s); + fprintf(stdout, "======== %s\n", name_for_enum(v)); + index->print_table(stdout); + } + } + }); + Action a_show_ep3_cards( "show-ep3-cards", "\ show-ep3-cards\n\ diff --git a/src/PlayerSubordinates.cc b/src/PlayerSubordinates.cc index 32d9d783..a24e0564 100644 --- a/src/PlayerSubordinates.cc +++ b/src/PlayerSubordinates.cc @@ -659,7 +659,8 @@ void PlayerInventory::decode_from_client(shared_ptr c) { } void PlayerInventory::encode_for_client(shared_ptr c) { - if (c->version() == Version::DC_NTE) { + Version v = c->version(); + if (v == Version::DC_NTE) { // DC NTE has the item count as a 32-bit value here, whereas every other // version uses a single byte. To stop DC NTE from crashing by trying to // construct far more than 30 TItem objects, we clear the fields DC NTE @@ -668,7 +669,7 @@ void PlayerInventory::encode_for_client(shared_ptr c) { this->hp_from_materials = 0; this->tp_from_materials = 0; this->language = 0; - } else if ((c->version() != Version::PC_NTE) && (c->version() != Version::PC_V2)) { + } else if ((v != Version::PC_NTE) && (v != Version::PC_V2)) { if (this->language > 4) { this->language = 0; } @@ -678,9 +679,11 @@ void PlayerInventory::encode_for_client(shared_ptr c) { } } - auto item_parameter_table = c->require_server_state()->item_parameter_table(c->version()); + // For pre-V2 clients, use the V2 parameter table, since the V1 table doesn't + // have correct encodings for backward-compatible V2 items. + auto item_parameter_table = c->require_server_state()->item_parameter_table_for_encode(v); for (size_t z = 0; z < this->items.size(); z++) { - this->items[z].data.encode_for_version(c->version(), item_parameter_table); + this->items[z].data.encode_for_version(v, item_parameter_table); } } diff --git a/src/ReceiveSubcommands.cc b/src/ReceiveSubcommands.cc index 0ae4ed48..b199e3ee 100644 --- a/src/ReceiveSubcommands.cc +++ b/src/ReceiveSubcommands.cc @@ -779,14 +779,16 @@ static void on_sync_joining_player_disp_and_inventory( // we need to synthesize a 6x71 command to tell the target all state has been // sent. (If both are pre-V1, the target won't expect this command; if both // are V1 or later, the leader will send this command itself.) - if (is_pre_v1(c->version()) && !is_pre_v1(target->version())) { + Version target_v = target->version(); + Version c_v = c->version(); + if (is_pre_v1(c_v) && !is_pre_v1(target_v)) { static const be_uint32_t data = 0x71010000; send_command(target, 0x62, target->lobby_client_id, &data, sizeof(data)); } unique_ptr parsed; - switch (c->version()) { + switch (c_v) { case Version::DC_NTE: parsed = make_unique( check_size_t(data, size), @@ -807,7 +809,7 @@ static void on_sync_joining_player_disp_and_inventory( parsed = make_unique( check_size_t(data, size), c->license->serial_number); - if (c->version() == Version::DC_V1) { + if (c_v == Version::DC_V1) { parsed->clear_v1_unused_item_fields(); } break; @@ -833,10 +835,10 @@ static void on_sync_joining_player_disp_and_inventory( throw logic_error("6x70 command from unknown game version"); } - parsed->transcode_inventory_items(c->version(), target->version(), s->item_parameter_table(target->version())); - parsed->visual.enforce_lobby_join_limits_for_version(target->version()); + parsed->transcode_inventory_items(c_v, target_v, s->item_parameter_table_for_encode(target_v)); + parsed->visual.enforce_lobby_join_limits_for_version(target_v); - switch (target->version()) { + switch (target_v) { case Version::DC_NTE: forward_subcommand_t(target, command, flag, parsed->as_dc_nte()); break; @@ -1410,7 +1412,7 @@ void forward_subcommand_with_item_transcode_t(shared_ptr c, uint8_t comm out_cmd.header.subcommand = translate_subcommand_number(lc->version(), c->version(), out_cmd.header.subcommand); if (out_cmd.header.subcommand) { out_cmd.item_data.decode_for_version(c->version()); - out_cmd.item_data.encode_for_version(lc->version(), s->item_parameter_table(lc->version())); + out_cmd.item_data.encode_for_version(lc->version(), s->item_parameter_table_for_encode(lc->version())); send_command_t(lc, command, flag, out_cmd); } else { lc->log.info("Subcommand cannot be translated to client\'s version"); @@ -1623,7 +1625,7 @@ static void on_box_or_enemy_item_drop_t(shared_ptr c, uint8_t command, u out_cmd.header.subcommand = translate_subcommand_number(lc->version(), c->version(), out_cmd.header.subcommand); if (out_cmd.header.subcommand) { out_cmd.item.item.decode_for_version(c->version()); - out_cmd.item.item.encode_for_version(lc->version(), s->item_parameter_table(lc->version())); + out_cmd.item.item.encode_for_version(lc->version(), s->item_parameter_table_for_encode(lc->version())); send_command_t(lc, command, flag, out_cmd); } else { lc->log.info("Subcommand cannot be translated to client\'s version"); @@ -2809,7 +2811,7 @@ void on_exchange_item_for_team_points_bb(shared_ptr c, uint8_t command, auto p = c->character(); auto item = p->remove_item(cmd.item_id, cmd.amount, c->version()); - size_t points = s->item_parameter_table_v4->get_item_team_points(item); + size_t points = s->item_parameter_table(Version::BB_V4)->get_item_team_points(item); s->team_index->add_member_points(c->license->serial_number, points); if (l->log.should_log(LogLevel::INFO)) { diff --git a/src/SendCommands.cc b/src/SendCommands.cc index 2787c85e..8aa74124 100644 --- a/src/SendCommands.cc +++ b/src/SendCommands.cc @@ -2255,9 +2255,10 @@ void send_execute_item_trade(shared_ptr c, const vector& items } cmd.target_client_id = c->lobby_client_id; cmd.item_count = items.size(); + auto item_parameter_table = s->item_parameter_table_for_encode(c->version()); for (size_t x = 0; x < items.size(); x++) { cmd.item_datas[x] = items[x]; - cmd.item_datas[x].encode_for_version(c->version(), s->item_parameter_table(c->version())); + cmd.item_datas[x].encode_for_version(c->version(), item_parameter_table); } send_command_t(c, 0xD3, 0x00, cmd); } @@ -2433,7 +2434,7 @@ void send_game_item_state(shared_ptr c) { fi.unknown_a2 = 0; fi.drop_number = (floor == 0) ? 0xFFFF : (decompressed_header.next_drop_number_per_floor.at(floor - 1)++); fi.item = item->data; - fi.item.encode_for_version(c->version(), s->item_parameter_table(c->version())); + fi.item.encode_for_version(c->version(), s->item_parameter_table_for_encode(c->version())); floor_items_w.put(fi); decompressed_header.floor_item_count_per_floor.at(floor)++; @@ -2511,7 +2512,7 @@ void send_drop_item_to_channel(shared_ptr s, Channel& ch, const Ite uint8_t subcommand = get_pre_v1_subcommand(ch.version, 0x51, 0x58, 0x5F); G_DropItem_PC_V3_BB_6x5F cmd = { {{subcommand, 0x0B, 0x0000}, {floor, from_enemy, entity_id, x, z, 0, 0, item}}, 0}; - cmd.item.item.encode_for_version(ch.version, s->item_parameter_table(ch.version)); + cmd.item.item.encode_for_version(ch.version, s->item_parameter_table_for_encode(ch.version)); ch.send(0x60, 0x00, &cmd, sizeof(cmd)); } @@ -2530,7 +2531,7 @@ void send_drop_stacked_item_to_channel( shared_ptr s, Channel& ch, const ItemData& item, uint8_t floor, float x, float z) { uint8_t subcommand = get_pre_v1_subcommand(ch.version, 0x4F, 0x56, 0x5D); G_DropStackedItem_PC_V3_BB_6x5D cmd = {{{subcommand, 0x0A, 0x0000}, floor, 0, x, z, item}, 0}; - cmd.item_data.encode_for_version(ch.version, s->item_parameter_table(ch.version)); + cmd.item_data.encode_for_version(ch.version, s->item_parameter_table_for_encode(ch.version)); ch.send(0x60, 0x00, &cmd, sizeof(cmd)); } diff --git a/src/ServerState.cc b/src/ServerState.cc index 061f7ec1..ac48dd99 100644 --- a/src/ServerState.cc +++ b/src/ServerState.cc @@ -370,25 +370,19 @@ void ServerState::dispatch_destroy_lobbies(evutil_socket_t, short, void* ctx) { } shared_ptr ServerState::item_parameter_table(Version version) const { - switch (version) { - case Version::DC_NTE: - case Version::DC_V1_11_2000_PROTOTYPE: - case Version::DC_V1: - case Version::DC_V2: - case Version::PC_NTE: - case Version::PC_V2: - return this->item_parameter_table_v2; - case Version::GC_NTE: - case Version::GC_V3: - case Version::GC_EP3_NTE: - case Version::GC_EP3: - case Version::XB_V3: - return this->item_parameter_table_v3; - case Version::BB_V4: - return this->item_parameter_table_v4; - default: - throw out_of_range("no item parameter table exists for this version"); + auto ret = this->item_parameter_tables.at(static_cast(version)); + if (ret == nullptr) { + throw runtime_error("no item parameter table exists for this version"); } + return ret; +} + +shared_ptr ServerState::item_parameter_table_for_encode(Version version) const { + return this->item_parameter_table(is_v1(version) ? Version::PC_V2 : version); +} + +void ServerState::set_item_parameter_table(Version version, shared_ptr table) { + this->item_parameter_tables.at(static_cast(version)) = table; } shared_ptr ServerState::item_name_index(Version version) const { @@ -1195,37 +1189,11 @@ shared_ptr ServerState::create_item_name_index_for_version( } void ServerState::load_item_name_indexes() { - config_log.info("Generating item name indexes"); - // TODO: Get ItemPMT files for the versions for which we don't have them - // (especially DC_V1) and add support for them. Currently we only have three - // ItemPMTs (PC, GC, and BB), so we can't use them to generate all the name - // indexes. - - auto pc_v2_index = create_item_name_index_for_version( - Version::PC_V2, this->item_parameter_table(Version::PC_V2), this->text_index); - this->set_item_name_index(Version::DC_NTE, pc_v2_index); - this->set_item_name_index(Version::DC_V1, pc_v2_index); - this->set_item_name_index(Version::DC_V2, pc_v2_index); - this->set_item_name_index(Version::PC_NTE, pc_v2_index); - this->set_item_name_index(Version::PC_V2, pc_v2_index); - - // All tools are stackable on 11/2000, so make a separate index (still using - // V2 data) with the correct version - auto dc_112000_index = make_shared( - Version::DC_V1_11_2000_PROTOTYPE, - this->item_parameter_table(Version::PC_V2), - this->text_index->get(Version::PC_V2, 1, 3)); - this->set_item_name_index(Version::DC_V1_11_2000_PROTOTYPE, dc_112000_index); - - auto gc_v3_index = create_item_name_index_for_version( - Version::GC_V3, this->item_parameter_table(Version::GC_V3), this->text_index); - this->set_item_name_index(Version::GC_NTE, gc_v3_index); - this->set_item_name_index(Version::GC_V3, gc_v3_index); - this->set_item_name_index(Version::XB_V3, gc_v3_index); - - auto bb_v4_index = create_item_name_index_for_version( - Version::BB_V4, this->item_parameter_table(Version::BB_V4), this->text_index); - this->set_item_name_index(Version::BB_V4, bb_v4_index); + for (size_t v_s = NUM_PATCH_VERSIONS; v_s < NUM_VERSIONS; v_s++) { + Version v = static_cast(v_s); + config_log.info("Generating item name index for %s", name_for_enum(v)); + this->set_item_name_index(v, this->create_item_name_index_for_version(v, this->item_parameter_table(v), this->text_index)); + } } void ServerState::load_drop_tables() { @@ -1281,27 +1249,27 @@ void ServerState::load_drop_tables() { this->rare_item_sets.swap(new_rare_item_sets); config_log.info("Loading v2 common item table"); - auto ct_data_v2 = make_shared(load_file("system/item-tables/ItemCT-v2.afs")); - auto pt_data_v2 = make_shared(load_file("system/item-tables/ItemPT-v2.afs")); + auto ct_data_v2 = make_shared(load_file("system/item-tables/ItemCT-pc-v2.afs")); + auto pt_data_v2 = make_shared(load_file("system/item-tables/ItemPT-pc-v2.afs")); this->common_item_set_v2 = make_shared(pt_data_v2, ct_data_v2); config_log.info("Loading v3+v4 common item table"); - auto pt_data_v3_v4 = make_shared(load_file("system/item-tables/ItemPT-gc-v4.gsl")); + auto pt_data_v3_v4 = make_shared(load_file("system/item-tables/ItemPT-gc-v3.gsl")); this->common_item_set_v3_v4 = make_shared(pt_data_v3_v4, true); config_log.info("Loading armor table"); - auto armor_data = make_shared(load_file("system/item-tables/ArmorRandom-gc.rel")); + auto armor_data = make_shared(load_file("system/item-tables/ArmorRandom-gc-v3.rel")); this->armor_random_set = make_shared(armor_data); config_log.info("Loading tool table"); - auto tool_data = make_shared(load_file("system/item-tables/ToolRandom-gc.rel")); + auto tool_data = make_shared(load_file("system/item-tables/ToolRandom-gc-v3.rel")); this->tool_random_set = make_shared(tool_data); config_log.info("Loading weapon tables"); const char* filenames[4] = { - "system/item-tables/WeaponRandomNormal-gc.rel", - "system/item-tables/WeaponRandomHard-gc.rel", - "system/item-tables/WeaponRandomVeryHard-gc.rel", - "system/item-tables/WeaponRandomUltimate-gc.rel", + "system/item-tables/WeaponRandomNormal-gc-v3.rel", + "system/item-tables/WeaponRandomHard-gc-v3.rel", + "system/item-tables/WeaponRandomVeryHard-gc-v3.rel", + "system/item-tables/WeaponRandomUltimate-gc-v3.rel", }; for (size_t z = 0; z < 4; z++) { auto weapon_data = make_shared(load_file(filenames[z])); @@ -1309,21 +1277,22 @@ void ServerState::load_drop_tables() { } config_log.info("Loading tekker adjustment table"); - auto tekker_data = make_shared(load_file("system/item-tables/JudgeItem-gc.rel")); + auto tekker_data = make_shared(load_file("system/item-tables/JudgeItem-gc-v3.rel")); this->tekker_adjustment_set = make_shared(tekker_data); } void ServerState::load_item_definitions() { - config_log.info("Loading item definition tables"); - auto pmt_data_v2 = make_shared(prs_decompress(load_file("system/item-tables/ItemPMT-v2.prs"))); - this->item_parameter_table_v2 = make_shared(pmt_data_v2, ItemParameterTable::Version::V2); - auto pmt_data_v3 = make_shared(prs_decompress(load_file("system/item-tables/ItemPMT-gc.prs"))); - this->item_parameter_table_v3 = make_shared(pmt_data_v3, ItemParameterTable::Version::V3); - auto pmt_data_v4 = make_shared(prs_decompress(load_file("system/item-tables/ItemPMT-bb.prs"))); - this->item_parameter_table_v4 = make_shared(pmt_data_v4, ItemParameterTable::Version::V4); + for (size_t v_s = NUM_PATCH_VERSIONS; v_s < NUM_VERSIONS; v_s++) { + Version v = static_cast(v_s); + string path = string_printf("system/item-tables/ItemPMT-%s.prs", file_path_token_for_version(v)); + config_log.info("Loading item definition table %s", path.c_str()); + auto data = make_shared(prs_decompress(load_file(path))); + this->set_item_parameter_table(v, make_shared(data, v)); + } + // TODO: We should probably load the tables for other versions too. config_log.info("Loading mag evolution table"); - auto mag_data = make_shared(prs_decompress(load_file("system/item-tables/ItemMagEdit-bb.prs"))); + auto mag_data = make_shared(prs_decompress(load_file("system/item-tables/ItemMagEdit-bb-v4.prs"))); this->mag_evolution_table = make_shared(mag_data); } diff --git a/src/ServerState.hh b/src/ServerState.hh index de1189b6..acf972a5 100644 --- a/src/ServerState.hh +++ b/src/ServerState.hh @@ -142,9 +142,7 @@ struct ServerState : public std::enable_shared_from_this { std::shared_ptr tool_random_set; std::array, 4> weapon_random_sets; std::shared_ptr tekker_adjustment_set; - std::shared_ptr item_parameter_table_v2; - std::shared_ptr item_parameter_table_v3; - std::shared_ptr item_parameter_table_v4; + std::array, NUM_VERSIONS> item_parameter_tables; std::shared_ptr mag_evolution_table; std::shared_ptr text_index; std::array, NUM_VERSIONS> item_name_indexes; @@ -274,8 +272,10 @@ struct ServerState : public std::enable_shared_from_this { const std::vector>& proxy_destinations(Version version) const; std::shared_ptr item_parameter_table(Version version) const; + std::shared_ptr item_parameter_table_for_encode(Version version) const; + void set_item_parameter_table(Version version, std::shared_ptr table); std::shared_ptr item_name_index(Version version) const; - void set_item_name_index(Version version, std::shared_ptr); + void set_item_name_index(Version version, std::shared_ptr index); std::string describe_item(Version version, const ItemData& item, bool include_color_codes) const; ItemData parse_item_description(Version version, const std::string& description) const; diff --git a/system/item-tables/ArmorRandom-gc.rel b/system/item-tables/ArmorRandom-gc-v3.rel similarity index 100% rename from system/item-tables/ArmorRandom-gc.rel rename to system/item-tables/ArmorRandom-gc-v3.rel diff --git a/system/item-tables/ItemCT-dc-v2.afs b/system/item-tables/ItemCT-dc-v2.afs new file mode 120000 index 00000000..e8a6fc3e --- /dev/null +++ b/system/item-tables/ItemCT-dc-v2.afs @@ -0,0 +1 @@ +ItemCT-pc-v2.afs \ No newline at end of file diff --git a/system/item-tables/ItemCT-v2.afs b/system/item-tables/ItemCT-pc-v2.afs similarity index 100% rename from system/item-tables/ItemCT-v2.afs rename to system/item-tables/ItemCT-pc-v2.afs diff --git a/system/item-tables/ItemMagEdit-bb.prs b/system/item-tables/ItemMagEdit-bb-v4.prs similarity index 100% rename from system/item-tables/ItemMagEdit-bb.prs rename to system/item-tables/ItemMagEdit-bb-v4.prs diff --git a/system/item-tables/ItemMagEdit-dc-v1.prs b/system/item-tables/ItemMagEdit-dc-v1.prs new file mode 100644 index 0000000000000000000000000000000000000000..b94de46e56950a943d0e0a7ecf9aa6f0ab6b96a4 GIT binary patch literal 639 zcmWlVKTH#G9L0Za@7imx*B;1!u=FS*q9Q8)ltSAB0ks$%FmW?th;e0ca5zYj#OOj8 z{Ii@1rjx|PL1P>+Dd0dz7YrtZG)PDX(>4%GfxGXsE^qw2&wKUW9Ah@0$$qdW-XpDV z6*IleoktKZ>5%5Zagro)?_q^9O#Lwokw?a$N)EILWQXMp^?yD~76Io-@!?{OPNGdF zzlvU}7Z9Xp3DbtYRFPCuQ!h$xu};NhsuggF6dB~rx@Y70_IY&i{74+9I9#BE6qRrzDRMS7^+bA1jeMgzDl`(q zhUlljCmjJ72GNL_>>JF(GXV$eYhd_gftGC%9~1+PYiPhd1x4M7|Gp6J!hbAk*~n(N z(>9&uNBLA%)KRYON$V*p*Rqw&9MaKIwQwijY+c?eKzwU=B)~q90n2t~kvuDc)3soe zFuv=_7mmELmCF$?D3&dCzl=>SVN#gG?dJ`HaOcu`oT=ViurB?lHWyezWGtO142!gK-O?=D9$M4cB1*`qg7Rzit^)M~;)mUAP zCf29oFq%+ij6X(*!MO-;bTnRkV+T9tY(h81;Ld$WEc7~u7u}q^AO3B;GW`5UBg)UE dmy4r3ZIATUzbK&eXUVo>Z}%lOT`AMU*gu)5N2LG& literal 0 HcmV?d00001 diff --git a/system/item-tables/ItemMagEdit-dc-v2.prs b/system/item-tables/ItemMagEdit-dc-v2.prs new file mode 120000 index 00000000..84d5c062 --- /dev/null +++ b/system/item-tables/ItemMagEdit-dc-v2.prs @@ -0,0 +1 @@ +ItemMagEdit-pc-v2.prs \ No newline at end of file diff --git a/system/item-tables/ItemMagEdit-gc-ep3-nte.prs b/system/item-tables/ItemMagEdit-gc-ep3-nte.prs new file mode 120000 index 00000000..80054eb8 --- /dev/null +++ b/system/item-tables/ItemMagEdit-gc-ep3-nte.prs @@ -0,0 +1 @@ +ItemMagEdit-gc-v3.prs \ No newline at end of file diff --git a/system/item-tables/ItemMagEdit-gc-ep3.prs b/system/item-tables/ItemMagEdit-gc-ep3.prs new file mode 120000 index 00000000..80054eb8 --- /dev/null +++ b/system/item-tables/ItemMagEdit-gc-ep3.prs @@ -0,0 +1 @@ +ItemMagEdit-gc-v3.prs \ No newline at end of file diff --git a/system/item-tables/ItemMagEdit-gc-nte.prs b/system/item-tables/ItemMagEdit-gc-nte.prs new file mode 100755 index 0000000000000000000000000000000000000000..fbeb4c75f93dfb1dceef66abb01afb2879bfdfd2 GIT binary patch literal 754 zcmWlWT}V>_9L4XpySur&yWOd&rP=N@)6&#Z%lx{VUwvbRk3morSVTc!P!BVfeNa7E z1cAn_Ou=4yD2N_H>RJX83nZeFmWCfAa}>6 zjX|f@Fo82kCxiQN2pSE7Wd(uleGD^piqsrHJGty=Bgux1A>vRHr03EmGKEk|`64O< zv=$Y1@N|f7O^=%8&GDaOi0y~5keJZi>Q80S*XhDRp4BW z?IPuvv5mO!4swQTsrOiNKWdH;vz+F9KOC?-T*>{jJox=hUKXYw#K)R~uYRI&@5IFPc;67TBIIeupMk?D+)Z9`^tC~o z(~DI_=TA-^0Y9zY^CCRbZXshccO{!(J5!dtF9|r`buC+OXm`RI=l{;dE0?*Ce{B~T gR{}26QT-8fU5n$Ev5qa0dg+^558De7yqRJC0}y75ZU6uP literal 0 HcmV?d00001 diff --git a/system/item-tables/ItemMagEdit-gc-v3.prs b/system/item-tables/ItemMagEdit-gc-v3.prs new file mode 100755 index 0000000000000000000000000000000000000000..b71efbe8874bae7f92e3a042ea454edc4a350eb6 GIT binary patch literal 743 zcmWmAO-K}R9LDk4-Pv*6*==Xl%(u)@GwoH&m+WPCoy@E(tT2cOwulaP=@3yJYOHAu zJah=5cP6lmg6L2N*+FUx1FhTKSCm9Kv5~6qk&3fY*VQe zTSY2{vY8YfjpQ>RX>(FKlok?oY^QP=D^*&86(VIpsi90A)wDoH%?rv#b#~N%Hy3MV z%5kEOg!nr0#_K71IJpzG5#s))d*AdXs(awhckk%M;&WIT-6MG5@80sv@LRt*meqwN_l8PA~yv9W%{PZGK;0=iFd1f-LPZp?(~r zXWm(??ZdYZQH(Wb=!CR*5019axF`ke=UXg(?q1SD?$WnaVb&aF!;G&w!JdyW_XtOb bS6<_uwzCBOTNey);sLf8LXix~!Eyfpl!%Sg literal 0 HcmV?d00001 diff --git a/system/item-tables/ItemMagEdit-pc-nte.prs b/system/item-tables/ItemMagEdit-pc-nte.prs new file mode 120000 index 00000000..84d5c062 --- /dev/null +++ b/system/item-tables/ItemMagEdit-pc-nte.prs @@ -0,0 +1 @@ +ItemMagEdit-pc-v2.prs \ No newline at end of file diff --git a/system/item-tables/ItemMagEdit-pc-v2.prs b/system/item-tables/ItemMagEdit-pc-v2.prs new file mode 100644 index 0000000000000000000000000000000000000000..24a28fd14611c414b3bb41029fca6d702e094372 GIT binary patch literal 748 zcmWNNOGp%P9LN9r(phI`ch*;CrjDAaSy`!BYCAic_OP(fyQI`5$V+6f zhbguM^B_nh)In(t1B;D1NDta@@v-^Xh}KbOe&6=;y?o)r=ld=2#2K^Yn{0~pEgA?M zneIg+b4?|Hduaj%@zZV>1p6~sMI2M839THtA+=DdiV8{*QC>x_cBy1RrAYY-_R)3@ zRU{RnQKbSjbWzB(aX3OrRBkRWxOgcK2UOaI{UV79Wb$zEk(3TaB`^FU6)QMFB^-{E zRD`1{Nodwc10UGrB`4Zc;&4)=G6j2RCx_i6Wuiu<3{;D>ML`W^&!9S6gKMjZI)!p@ zaGb)20~DS(L_Hg)MbuUjTXVVw6IZK)a5zpi4PpoO_ELnr_EQBBa+a3X*LRo!%GZz` zAihR6_(CeyP;=%2+R>R*iLCNk+^b>lhmzGG&f>8KuNLFecHrFxKDEXWgnIy~qe#K; z`B7$p9IKe*lYx=}6pcbc5;B(@jwDD!mb@$sMJP*-ZDD4s zhWeqvtPoh-Cda&yx%zi?)X@+a8Te;;x;Rd5&Y3p$z=pYR7I&gx z!y{Vl&&k29c(0^qWLB9OlI2p-awfYziGH;YIk#C+3*x^PRHk_D#~ZpAmg2?TlkhKu zF6zw=_}juW@w~CJy09+34I`iZkZzzqVTZCj6N3C_HjS zyHPWwnS3h_Up>xR%Ov ch(fnz?bgHGHR$j}UQQqWQH!yN>9#WVALp`%5&!@I literal 0 HcmV?d00001 diff --git a/system/item-tables/ItemMagEdit-xb-v3.prs b/system/item-tables/ItemMagEdit-xb-v3.prs new file mode 100644 index 0000000000000000000000000000000000000000..13e844d27766d800bfa617fa43891f74914daf32 GIT binary patch literal 749 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 M+V^b?$uaEz0k$e;kpKVy literal 0 HcmV?d00001 diff --git a/system/item-tables/ItemPMT-dc-v1.prs b/system/item-tables/ItemPMT-dc-v1.prs new file mode 100755 index 0000000000000000000000000000000000000000..a3fecfcc46808cadf0f5760ec0ce15ce1426fa2d GIT binary patch literal 5549 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 literal 0 HcmV?d00001 diff --git a/system/item-tables/ItemPMT-dc-v2.prs b/system/item-tables/ItemPMT-dc-v2.prs new file mode 120000 index 00000000..1e1d0196 --- /dev/null +++ b/system/item-tables/ItemPMT-dc-v2.prs @@ -0,0 +1 @@ +ItemPMT-pc-v2.prs \ No newline at end of file diff --git a/system/item-tables/ItemPMT-gc-ep3-nte.prs b/system/item-tables/ItemPMT-gc-ep3-nte.prs new file mode 120000 index 00000000..de681f45 --- /dev/null +++ b/system/item-tables/ItemPMT-gc-ep3-nte.prs @@ -0,0 +1 @@ +ItemPMT-gc-v3.prs \ No newline at end of file diff --git a/system/item-tables/ItemPMT-gc-ep3.prs b/system/item-tables/ItemPMT-gc-ep3.prs new file mode 120000 index 00000000..de681f45 --- /dev/null +++ b/system/item-tables/ItemPMT-gc-ep3.prs @@ -0,0 +1 @@ +ItemPMT-gc-v3.prs \ No newline at end of file diff --git a/system/item-tables/ItemPMT-gc-nte.prs b/system/item-tables/ItemPMT-gc-nte.prs new file mode 100755 index 0000000000000000000000000000000000000000..3435fb34c5b31024707c08436e9fd0f3a61052eb GIT binary patch literal 5674 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 literal 0 HcmV?d00001 diff --git a/system/item-tables/ItemPMT-gc.prs b/system/item-tables/ItemPMT-gc-v3.prs similarity index 100% rename from system/item-tables/ItemPMT-gc.prs rename to system/item-tables/ItemPMT-gc-v3.prs diff --git a/system/item-tables/ItemPMT-pc-nte.prs b/system/item-tables/ItemPMT-pc-nte.prs new file mode 120000 index 00000000..1e1d0196 --- /dev/null +++ b/system/item-tables/ItemPMT-pc-nte.prs @@ -0,0 +1 @@ +ItemPMT-pc-v2.prs \ No newline at end of file diff --git a/system/item-tables/ItemPMT-v2.prs b/system/item-tables/ItemPMT-pc-v2.prs similarity index 100% rename from system/item-tables/ItemPMT-v2.prs rename to system/item-tables/ItemPMT-pc-v2.prs diff --git a/system/item-tables/ItemPMT-xb-v3.prs b/system/item-tables/ItemPMT-xb-v3.prs new file mode 100644 index 0000000000000000000000000000000000000000..fb00b644a97be897691e7623bd1378e5dc47fe79 GIT binary patch literal 15685 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 QUMBonM8-FF$`Sg10Jq;+E&u=k literal 0 HcmV?d00001 diff --git a/system/item-tables/ItemPT-dc-11-2000.afs b/system/item-tables/ItemPT-dc-11-2000.afs new file mode 100644 index 0000000000000000000000000000000000000000..4c3590d8fde757e5bc86cdbede7c5da94a46529d GIT binary patch literal 587776 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 literal 0 HcmV?d00001 diff --git a/system/item-tables/ItemPT-dc-nte.afs b/system/item-tables/ItemPT-dc-nte.afs new file mode 100644 index 0000000000000000000000000000000000000000..2c041c47931fd9322b9af56ea2eae5e4519a2883 GIT binary patch literal 587776 zcmeI*J%}9F9RTpRySMkT`WQ*9VK2qV5P{ba1+hvXm`g~CD28hkLLgkgq}U=R5CYe1 zV{j30%HZNiWmLLU;X;rUCRMtGG)W+ZOIJpPs>G41bUAGeaFlTK&JznR;8GqXGU z@w>P4-~Y^;w?DY?lXN-dVKcqEk&C9h(3FFwe6=ZuO?j;;ztfc8Z^}2D@@7;1tSNud zl)r4s-!$cj}pH2BmQ-0c%cbl?$ z@2&_CAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ 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 RiKIx~UE(8+!F^+v{eRP?%=-WU literal 0 HcmV?d00001 diff --git a/system/item-tables/ItemPT-dc-v2.afs b/system/item-tables/ItemPT-dc-v2.afs new file mode 120000 index 00000000..a021351d --- /dev/null +++ b/system/item-tables/ItemPT-dc-v2.afs @@ -0,0 +1 @@ +ItemPT-pc-v2.afs \ No newline at end of file diff --git a/system/item-tables/ItemPT-gc-ep3-nte.prs b/system/item-tables/ItemPT-gc-ep3-nte.prs new file mode 120000 index 00000000..846e97ba --- /dev/null +++ b/system/item-tables/ItemPT-gc-ep3-nte.prs @@ -0,0 +1 @@ +ItemPT-gc-v3.prs \ No newline at end of file diff --git a/system/item-tables/ItemPT-gc-ep3.prs b/system/item-tables/ItemPT-gc-ep3.prs new file mode 120000 index 00000000..846e97ba --- /dev/null +++ b/system/item-tables/ItemPT-gc-ep3.prs @@ -0,0 +1 @@ +ItemPT-gc-v3.prs \ No newline at end of file diff --git a/system/item-tables/ItemPT-gc-nte.gsl b/system/item-tables/ItemPT-gc-nte.gsl new file mode 100755 index 0000000000000000000000000000000000000000..7b3432d0dd72778f1b39926f201f0602b19325b1 GIT binary patch literal 503808 zcmeFa3yd7cnI;&K@5-vI>PPjX_$ZMoiYnV|$t+21i!Mo|E%a*GT2HM;ec<*Qq-QSI zD;>tfg7OV|2ukZA2+<&j17+Mb4wf)S?2(HZj$jD~f{ z5V+P1N4TL5w{6OO-yfM-&#Yv%y4l^N{)mdo$jFGu%rElw#s9}2zw_;X`K{WM2fldE z!GHOOBHmd-q<#@?`kf&E_JsUSO#Vtjem5rneF^z9G5POL$e)eL|3E_izL@+w67mnk zI{E`LJ% zz7&@~p?&`}E`LJ%o{Gz#(7yjRE`LJ%p6<;5KPJ6@|6N@Eg!cWjxcmw2dp0hALi@fP zmp`F>e-M{Hp?zPC%b(D`|5sf8g!Vlbmp`F>&&TCYXy4aj@+ZB2|1vIrLi=8b%b(D` zZ^Y$KXx}&E@+Y+K#kl+l?fb*H{0Z&*S8@3h+IKE4e?t4d9hX0$ecy@6pY;CyzvJ>J zwC|<3{0Z&*Ze0F^_I)ode?t5IEG~aS`~G!Y{)G1Zo4EW5?Rz;ce?t5IJT8Ai`~D&( zf71K+S8@3h+V^kc@+Y+K2XXlm+V@Ia{)G1ZbzJ_0_WirK{0Z%QH7N*A>Eaa3B_f9)=qp zSKlf9PvrN+kHt6BPiL;%C-g(&r{a%Ore)?b=5_rO?V9~<{eI^!vIouG`ahcA5*7Ue z=WE_!>%02zV=qtW?>IZWzn43NCem`!c*fc!UP9ayC3#stExsxw)@)G_KN6ouT%t^$ z_#A>zTXc~Tbj-n;t&W@GQWywdu|{yz8cr(KKCmpuazravU6I%1sXrIH?p0O6jP@fR} z1Np&x-#~u9iS7Ti-=srR+jL#;+mSnv`Vss$oPTTot@VFc+swZeb7D@vqF*t-VT>Bj z!M|$eRn3jRDeq;FCxcY?YOG#h&Ul;rGY%xw9VRH zm6j8E_@XF_F)=P`R9-#>zYSN!Jod0p%u{VtH|p7n{ai!1D5hh4Rdo6y>TdV6W7=yT zS5*O5S_S1=(<(@7cC=oCFSq4uq&4S`;$`FyN+joV1^FC29Zyje*KpN0dF?9N2komr zp`S+!{WHX%LDQR?pF8sG%#2?sObAh~)~5Ft3R9}2o6qMbdfAE+C|fL6C#PG=2K#sC z=LOX~dH4L>sk5_BKV2wHin*Eb%2>Hj!1G7A`6(A$!!uJg z;j$QA@y;H^A@hYBHGn7X?Q!2=R1kVucL-_I}@=gePo=qdq zGvZkNKn~#fNMS~t!~R^9okR_jSU-WhD2v#Pc!8dKcoOZUCuY4YMQH!GiCe&pg;T+s zQpdYUU99vL)-@^hg#}zp*owxq0!pb)hpzCC05ul?+PD0nqnG53a|JtMB6DW8N#s4>d zhjdhv`VNxl4IVtjM2fz5*f9c(03*N%Fan7Pc+#~j&$A8U|G!=M&3_larEuLa4f^4Y zX&B7^0b#@v2+eNsPNeZI!u+54Ke$N=K4AErR|&|G^0Xy6AM=0a{~%e+|C#^CJw{eO zjrl+G|CPV$c#n(#BftnS0!u{z)F1rcl^y(_xIfW<=Klf2-8g@9dS_!W|7ZDspgWMv z>zV(@XacbOzg32h$BUA!GXH1!f9I=abyArBGyh+mE06ce2rvSS03)yz1VH~i3$lL$ zeE==;|A7CK{NH5xKM-!_`Q7534Z-}M`9Jf2j2#GW4c7k;^`L|2NvN^g{@9>A>WM>R z7T_Zt{veI@|5^XP{fb$=b>{!f|5xwo<2^G1i~u9R2z*)uJl)m7|2?x^|G&ZiS^uBF z?Z)|=(>oi1`9Jf2=Ksw9lk5(3JT;jAcRUW`U*qk-_WuGkm>&Mw z{+}B2(?wH=E-AME*SN7b#t1M1i~u9hD*~P^Z5OhCr$hb^?oT=Z%>M%@yK(;J^iI&3 z|1=C;`Lov<&$V5vG+*|tc2(ON z1j+oL`9Jf2=Ksw98xKn6|IGixtAY7{dh<{?D^q2{nLt`M<&T z|EM{-$^4tsJDZK=|IGiH|143fs=*GOAoq7&TG7x;`}2Kad|B9UL4S*s|F%CkAa@Qrp3B z1DyRY?ECD0V&7r?d+RatqWO+_*!lzGIpbC1S7zRvFnx2zJd2PQb7Ef1%WVjI;IGM( zV%|Ju=8bPa&i`NZf1|J0@6~PmpI0*f$5F>i#;e%=DrVxI7jvrQHn~k6guEYRsRnsi z?vneEwo9B7m&Flz5q=j^ks?Qta!#B@E=nbjegbW8-5=NfRJ#Cw3E{Z5S5yS-ev@W_ zI7|D((wF}r|3ULK59J25tw{AnMb&f-dk_3Ys$WdU_^RmiMbYUi*mJ}Ca!~FIuaw5Z z$MH1sP^^2tMyW=um$H;Q4<8(1S(LFC(zGx;JzD5-=w*Bb|L|x(tT%R+9Gf{%t4&ra zW97>9l<)gfQh8%}btzl1-y)8AygF5`jEz;)K9XZ%9A{Y;B~kSK{ZqBc zD$0#lE2UDUQZA2;i?LvHkF5QFb zd0SD>$AY7gbVLZad2vMWIA%Jk=&0SLq@iBX9taT~hyX7jV!_+#xU|la zloB|#4bN3NW>NDC!uN|~8#a|H1;4UkQ*OOKT`q5^RVsJfQ7Y3_G*#YEEN{4DGp;PO z*#>I3#XDad)~}eC@jRGTg{Oocu1~4^yef8!2{DE3&xlvVTewG#=vVAZxc1H>egNSF z!Z`$#L;8$(9owc*#>ZRWjCc`uvoDURry(sV%p&~-q({ydhmd{ZSpMH^hp6d=5=43azYa(^fe~N?7y(A$ zh6s@L|G@sg+fXk@ETI2N{_nE>KVWR;`Q74eXfyw3{@-*-F#l)%-!blh`G35^dn&-|bHKac+xFkHdo|9jK{VEI43JXrqU^cv+TBftnS0*t_NAVBv2EKkz- zf3K7O!w7(Bn=Jna(#<@-TfD77R)YWM^Zf&ZgChe21H+p)rtC-a4%`1@`+v)3|8Ef^ z{5z}zwv@%Kanr~Do65c)*|H;Rc6QoHI~g68^b8Aj^lWT(tQ34`|4$mBO+960Z?(#H z$p1~vhV{SjsPXW1EF85B`+uK4t=;w?trH@!ho}&-UE6hBCmolTX#X$L|Hm=2{Xe$< z$NK+l|F7*6h*uc_Mt~7u1lA}5o-J(`vVW&T{vR3uB>R7xiyOqo;j9=O^u%BmwsBJ~ zY~eaMrO5Wb(aY(v{r}~+|KH&MX0e=ezcQ2}{!jfjm{x)9|Fix7rP=>);qb`}KY1&j z4>z6vFU1buYL)Ha|F@F;|Ilh7+y7_#|7&ObKTV8-AKrj!jvP(L%Mfe2VVRa~xpDUY zx8Hm3y<=lv_`(m%DKi{J(Ubl^bQV@n|NnXYig{VozzoSvi38#Keld--s+bfLu*hG-82eW+U%W3) z=vVAZqJmjSeKCVDi|_^l${~FQ^U7C{e*&}2OO$v~yo+ro#k|~sZlztKGFY4#9oQA#nXORDxc*D$_dF!-w+P;MSG`ljk-X?AZ?Ek%vmU&AY z5$}r=;+JT>55-xrAkN8@n3EgDyJ&;Ua=U3eflFb|0s7&ksos(ry*_mVZ&7H(Sxxf) z(a}PoFgiLsJhX%5|F_B2$fv;wFanGKBhV`X9^Q$bXSot;0P*sF=>HcBc~Kn6iF`gQ z@;OfkH!Xyn!ai(-Xbiv&cggzyH&g$g`9Jf2VG2{fVm$uY9RI&s9DXVLz4i6~dHz41 z|BvVYgMi>ogrCE*Mi${6`Y6KsdqOyKD%#~wdsJx_k``fi&-VYipvTFK03*N%Fan(%nnr5Om-NYZpkO%y~Gy?7q{-4WXY@Fi%umK>NZ2;Wx5I$@C zpX3j4fg~b~N+br+@$m;9c;LSKwr}4)JPi3iL=!YNad8&QwGyg@8yXrO8Xg`V85zl!imv%szpYDj=~x!&b=Y8n9p3zJ<|*@lSv6hbIpcBt zihfkz6v)lBt=eAgxOPE*Lc1WZA-)xobdsq50CIFg?$a(Wc&qLm}P5G0wj=cMjMm3W}kNjKVv4lDRs?;1La-F^kIbpjm zVuX6Tr@8}Ad)y{ZYI|Y5yWy!0q}OxJsw3;3FYX?R_Rw55E?;ntjekM}e81g;|NjcD z{t{Z2{84J-xa#84Y7@#;D&<-jov2i*Ds5`YU&>ahrB%D6H;{tK4qi~*GQXbGh=2j z0&11YYL-UY3E}aWu9>#HQ2L&>)G^uWT$Ym7u>aRkyrw;2Um5a1g?u(HEt3B?N@7;` zm}3@GenI$tajdwtG+yw>i>2Ipe|l`JI8_}lmBva!jE(IbE0*vp`96v6i*Xm=jngoS z#=NZL_9s;4DKV?okBL)|<)6mAegIE`V+d!&ES@z-#GHL8^+QpEJbwnV<5_7S+=K0} ztMoIFBaf^6vtVHF;~BG0T&90*EAHxf1jw9mhtJ8A^@9u2>1p&c)N=%-Kdy%pc($F9 zgLu;2O>%$tBljckW$)#BS&B@H4_el5;gtnVlNt>F-K_Eda#Ze;cgj6-2gZ`^l20La zP(CT2$J$A(otB5y+vzoo?N`om0{K5l{PC^~zGu`s*u-lTc8*f6a;a3V4=zV;H!0yg z_~7{Xc)cN(JpP|5VE$jnlOv1(BftnS0&5HbPr9T4K=%Lb=w+$+f4u{M`M+wi=5hYr z;%#k9-yh8Xng64|AnGS*yF%3J8sh)Y`jeBBzW?;oAZXBztyBW42C`PHR4Qug%nWF} z+Bz{YGc%*kpi)6vSk|vp;>w06j&JX9E9wi&w#C$bkybzl0JN)-%lC0i6kwOaUpBVW*uLA@K@($M44Qntb28?jcd zzpz03AN%j<6QI6>hHLDx5etra1^NH$%gg`KC&2u_(Zq|4G5?o`!1K=|yopek|1_m-WVL=KRg^dWImv{Ga)MI97o9 ze{f4M|G(+{pY$DA{@=U)Kg<8yUR#S=W&Y3ne^D0Xa2vM*B|ej z5nu!u0Y>1{Awc&3EKkz-e=p$w7_%P8|H=3t$^T83{{!1@oWD7}tqE3v|35mIV*7t& zjgUOs|68p6zgv6!zms+{sZ7dCd9LSX15b3@ah-H3jV+lVT~ToL=VVYquzxy%Aokwe0d)daQ|3=J)wFEln0I`JyLIzd(wZM?tw$TI1;@Ma=)l{J-tB zwW!s#!vA^xKbHS5>cZvBi~u9R2zWd8ra z1NYr`-}deI-h1!psN-N32G`AGGNYrzsg!MJ)avLc(sUgY7rXB0XcqMaP6;+3(tsNp z8Xg)R9v&GP$(M?*$^4)B{}tm`(EE4^y8q;l8jtH&+AhqltIYqI|63XIYDNGxCt&l% z(%M@QtgZO`fA5F$|D9DwHYHwB>&L_!Vn)0L-JTQ5_MeaVto*V#B0jJ$rG6-C@<}lx zQ%Kv0a1ZjluF}sSZCsqe`Z+w~KNj=yu(%AZ^NZT=A>Sx8fEKXaBj)6v*O3V77=(3` zU!&Y9@uK|Qdgw|2AN#yb+zRmjC*_@TpWGo2%3boX+#{ctPs;Bj<+OZCzJ`>G@}zuc z@%(>~+`zyvV&_5JDAZlCm`P_5rjD@K^Pt`gur<-!`@w z>yRIL$%>w~iQ@8~YkT!8=2`d|bHdCUuToi(FsnRUk^8u+;|Y}5inH7%-$2*~dD=!S z|0BY2xfTDA)`;Es-$s%+l%Z1CH+dapJdQNV3%(DoKTkEnpTwHq%KwqN z2YYSf|ElCPI6=Fo@&4^TZv6jJ#`^a=snu$z1y^|B%2A{k8^e7}R;}P_6VKrfl4?#2$0pdGwgJu+Xsk7xg#vx{uD13kz|_yn^=s=9ZWLEBQb57tG?x z|302E`^07X$5U(;&zxEDOFXIY1j17%azQ#hjedr5N6_2waXs`T{}&%bRo&{#wZi{l z@(a{{zi#oWD7}4Rq%J_-E`*Uqc!v}Su>KxIBy%d-?f-W`!U>E3BftnS0yjhe)F1rcm5TodB4z47SMq;Qf7J`X{2wqj z^Zah{Hnf@lGyjMDkoiBP{tYR8vedt^mF52}Itx9@`s4ZpnE$Ks|2r@~;6upr4TPrg z|7`!S?X|V2Rp$T9{}*+^aArn;5nu!ufi-~uS^p30|Dz8eat;2kbmf@;qp7-a{^sg=vPM1E8!!IR``9JgjwpY`#tup^-{=aM&6Ia9tFanGKBd}r! zc)F{D|9fQrKcfFl@_*+4QA;%Q{BH3mZ@6Us&-|bHKlA@2y93Ps+a8)XT4noxH$rGd zw=@4|{=cFZ9Pf+~U<4QeMqpVGAp3uoCu#h@7pea@_({T}xKY{v`|@y_?f=0tAnX>(Yc%Q}WAEE-|IvE8?LS&)`+u;sr`)Y-{}0yx z`XlRqqXV$uH@Gp|-#5@l*8hgV!VCTD`!@`1g!R9EW&Lj`JCYmCt;?%l}#a&+`AVk`QBKd&i0;{7Sy><4IX;ds_Cm%JTmnfm)etYlZ)_{eOI+ zD3_x7j@U5*i~u9R2rvSP2w|y}?1)KhI>)A|B#Hn>Kk~)^#yY@$m4bO`D*^7`l2-jluk% z`G3UxgC+BS=Kr@f|9{`SY+r&c|Fi0eJtbaI>&L_!NP7!odrk;noI!XCcK*LCj))KJ zOUnM=lVV1ukhZba{y);jRsM5eP#R63d*a99o9U-B*XgEcC+xqp9rLpBs`z+s zF-YuckOu981n4Q`*%6c%^Hdw;K^L*dt=d+365-;K?Ele@X|H))RRvsW71#-EO{*ZS z+0l9lzTB3tk=C3$ikFc;D3P4cRWkmZz`Y0`458LUi`TAF+rU4epGO=0GsMnEySdSF ze(uP#Gc&$lm=K~|txfOWUzk#5+QI_ui;O<|ovf&9d7SS=QbJ3-);R)MF6G$O{qqHDbR5mED zu!wfle7=^3Cpos#GX?u2PcFhLDw43Q`32$o#d4uERxbE8EUJE`R;$!1)k3L)d!$^c zRFH~aF#f;dZ`e|-!4=EXm5Fs*%3IxHxjY5a0LnZ-w_VkQk1P8Mp5Al~&?Qoo*Rby5 ze#qe-a*@&}*1>PVy*d?aH(nJraR7Ja7;=o`4&9A=r%F#Sqw6gLEEf zpXX?w(Y|8$9c^5uIH#};art$GLkM`n$~O^yE`*Uq zcn90zd)+&d7R^b+|0(=q(tt@D3DHPbz-cs}!g!a>ooh{F^2Xa0}-jQM|bGcLoD`9Jgj zWw?yE3PyktU<4R}6-EHmAN=2yivNE?{Qr~RF#lJL!2F-(|8ya+{GVj)4f#LwebE$ z=>PwgxIgs)G?eF9|6idQX$jLxw|FP)EdSrc`u~vrv;052H(35(XZOudk(MV%JqPpu z7F^T{>;KO{*Pr$OS^q!0H<0P2za`yga3PE|DVSHgZoq9@&By< z&*T4t@%1eKXZb(b6u4Qo13Dhj%>O$eX(TZJXa3LQ{~Py%VE*3(21gkIMt~7u1bRe( z?EhJwr1Ae=!2hq4{Qnb@|C_pIAh7*E!m?Rf*Dc()MP>@v z{vX@_yJ`0SSpT00dZ3{nJqea#cc9~`QLmll{~g$n9X!_mXZb(t|3|k5^Zy75UNQoV z03*N%^p1dMOWTF)-%;}a>q_?DA^+c6+AKx~vnph>uy32f{KW>WYr`Ts+5Qc}4R^}+ z|FxT8|3BpawHzAbcLpr7#|)#)Fo0~Z{eQOqzx?+9ng28Y?|jy?{eQOq&-VY>{(t9_ zfm0X(Mt~7u1lAw|9*BQ1{$D!c`fo%2f1UOJZyo)AmjCnoe@!z0-t_tZnEx~X?|hRn z|7ZTs{Ga)M=aYd`7y(9r5nu$?AOaBk+cy51#{YND|HtzGo1p)Hf9USLH|LUfRR|YB z0+J}5HqcK^$sNwi4Gn*qs~fr({mlQF|1cfTy`s1_Mt~7u1Q>ypK)|yw{hw#K5^4Z6{{NG}{y)qA zS^m%V|JeTD{=$@c3i14ZZ2vF$b;R<2mjAQ-pXL9_PYK@22rvSS03)zQ5Fq=15}g2P z=m030a`PV930rP*)b;uZI~)o?PkK+ z|H8h{{wMYw*1xwNGcTI&n1`)DFrG7BHGXC0%?Z;tXUww*c`+yE#k|~xum}E{JSpbQ zQ)b@yhJHo=FZ#dH*X#G{HvZ4+SB!PWIgFGyE z$$d!MCC-V<;)uKmzYD2Ik)udCC(a@lrIP=Jyr%7~`{UZ5Y8T)yAspBCiVE5Nf}a&< zX@6My@*m_sXrAVw+<>+fslKSFnyz8*fxk%gi|H6&6`j5)I(-FuZg^h~%6%P|xsT&% zw_6&`Vh=NAnN_M_7gwvmz#O#%8BS3q6iD`U?Kx(SBHu+ihIh%z;{MvQil< zSEi?Y-=CVAtW|_47K_#0leOwnwqkEZ9P@Z}s$3ZxtEhb>$HX|!vJ9DR(f9XH)h4Sb zH(srjN|j2vJT|UGx!A1wXizn3HXI{mq)eB*mA2A$+RkXEX6Y8LT^m~+GX?L`JqW8M zx-g_Eu^l;R>#CHcW5Ll#IwAy`XTZcUn>c1Vs_3ZQrKF)=(H;m99f$xgAY#GW>A1Ac zl7WtaI%=vFIMOkTkpGWu*i@<%{K|$+x%K{ZxxArPsoZf#sZ3YVRCz|`Ax-I3cZn0dR!X~vj?((EGUmVu2n3wT9m{wV)U=J`@pHlaERqPfM zVhY=z5wD21kpGB&#lD1V?=0d65KbVRLqIvC&xqHtZ3<<4Xic0EFXC?Y#WD3Xq$Pz} zq`!dl$ob+B(hnieMwG3I{n+Y@7xeR3PNRlrkpGxChi7cwI&Gb{FJV8;t}LF_uHqc% zE*`^^sDNXhMg3>RyJ8sk35C0G{nNG+;tl-Q;C-U!w zo1Df7FanGKBd`PnK>fl0UD?6^Nrp@+0L=dbbh~l>=Jd99VE)hY|E5cV`9I|U%>P^U z4sL1wue26e{?GD%Xn{x_wrG^W3D}+xx+W!b-5`C3J}s zBkAgx{{tuH|4pw^jxqv_03*N%EC&K){Xek(?>5xS5ew))^#Ir|>;D7kW}e?I-qs+@ z|C#?cT@uXyng4f;I|zBvt*QUd{GavzG1V-dam@c&|G()~$5BRr5nu!ufwhi+r@K1% zzeo1}n>zrS_&<;Tr$+3?`J2<*8k_k)^Z%wxg84u5f9C%@{$F6+Kac-s`M-KK@c93x zHzY?H0Y-okU<6hS0kZ#Rd6LHed!76rMgUCPWcfduqnYP-i?_AfO7Q=DzJFkFaAaU$ zV0iP!l>KPlVf%k<|8Lps|1DyKe}{Fzma@1tZuKbwH6Ff>g`>7%|L@bMwcGxqbwUL85EUY} zYrBr?q~p>O?f*sce;hO0|6}`qtpCsU|Jpu*c$E=g1Q-EEV2vW++0u3)`*%9z|Dgdu z8vnn!xIt_j&Wgc7PYh;Z8#m>`7OsO+ifsQIy__D~|JRn?{(po2o5ga@{mM{^_&@dA zm=@drXZ!z4wEy42;gcDD@>V<_ZaV*8iXFbyD%-*TZzcQx;iv_+|IhaS*UtEVnivN^ zyaCl5Ihu}_A=Y%mGA-M35^dmf7btJ{eRZ~XZ?S+|5tx4u>OA? z3XU)Wi~u9R2&^Ci5c}IU{u0Okv;6-i@c;WmckjJ9m%OV&xCj!EMCr7FetO-hnT^$2 zL;lbD|Dqx3#l(= z5M~kHKtMU9&tP8p3i3~2mU)R1FN$}u?WCBOJFt8~g;}J(fb_`u;waLOBG26@JB`vW zV*N$^JeJd#ukIP-KPKKV^Jd;UZJo9+VL#2TERJbcaSmma9>WnA#BLnb9OkuuR}4c> zhQeK#D}%P3z_C_wHgvvw5rT6#f}=eqT#?7}S)9WOl|CcR;fZ%L+Lg9f+p8bdk4Eb^ zW4Uni?f<=wb9_r25%1$He+isE1WpS$)0CK#8^yb5gUfQeX*+>SVa@^iL3E+sk{V?H z5dK3U02*;tll*^lv`{FFjt&nG?O^%;&A2qUPDX$cU<4R}HH?6VccSN6u7nyuy!;>f z|HVRH6i0F*pU;YX&J)5-3t^{lS~fy72H=Kg$@>2{Q~#g&Kl6WK3RAygJpS1n|G!!s zekuFC_4WUG{y(1okL~|MK=3BQ&tX|3i|`J86k+{6A)GlC?efR+|1Q9AG9$nUFanIg zO+|q0|4DQLq@e>q0%eSx!=I*^=uJ2AhcV;<|1XVz`-A`Iau^$@_&;m_h-MoAH$2YI z8viHx16&}92%{2-L3Bsxwr}rM{@>`Ip&C#v+|bbQ(D3l^$jC^(RCLY9`fXjJOUJTE zufqlt?C|D)Gf$ZZ%&O@c&l!(HK73T)6v)lBt&kWU*DmN!Xcy!)#J56{P7?JWK&oWO zecArRE@!>-1H~)Y^R!Qnz+bbqAjIxJ{na_Cjjc@KguV>$ymZmy|E=9*OqQ zTsAIWaE^_CLIixj-Gl%C3a$PUN&cyIsg2{Ri%Y9bC|9YJYhiSvQmLx6sVRRcTd9^> zt%h2Pkt;`$Vr&dj(R^@>wTWur%3~!}rc^4{H;P8hu=$s*vL@{P1=av* z8#JAesypy0BW1Wo+Dw}nGlLOOt5jCApq~J#dvH9aYo;wPl)k4ebxgK8m!+gN?EeM5 z4fIcY!oD)(feQI-Tv{amZ5N{o+`0YiYdTj~7e1_5SqOSaGU4UMh{1 zgcuv!J60^=SMq%l-5320TZ*_OYQ^$&Wn$fy@>aK4E>B^T+8lRzQW{3ln3t8@{)Eah zC1%z7F>wlV@YA^04fx`WeWP$5sAW z$p7ERGiIN-O#j+e+|~04kU8THpKHj~!*qHY{S5USLFtd{;RK#-XXGHBba#{7-~Gt_ z$a~p)x#e`G#Rs>I{9n_c%@17~snY`gI?Y$FYf{424PJGa9Z&}m4z3?;!CZm*BJ}^| zsN5y*lzZe3j3wJ8pF-@Qd{RD-wUbyoEf1@=(`y*pubktM@E`9-Nc`zdtKPNhWobhG z4?9OGQmAv?R4Ug8mm|0Pp`AN-KKS7H_;|gQmOTESDq#L!$CD$B03*N%Fam1~0Z+Q5 z06_Nt?dWBx_&Qi5QT6gZV%6|F+9y4e|eH{mIEm-+%gP zurO%HRw@Bi16eCpDiyVLW(Jf^ZJn5ynVC`NQmG&+hS_J zNGqTN0Q%9$<@-3MiZ4*25^W7*4Jc7_9ET^~(a!%HTsE2iuSD6#u~01F|G|E(7XIJJ z7xZIL??$&Y^mw$CZE*NTtd;98ED-<4{yX{vsPCZR8hdQSf@5Am{{Q;&@_+ORF#m5f z@gifO_{{%>JP)q_CPH2Q&-{Op7ZPV@1Q-EEfDu?x1VH`4|6Qs0KS`@e1pvgAWdE2R z3ZD7DYLIT6zd60F<(U6NLdNoc(iVvH1lq0;waWazr6(X__{{&C<^K)7eIx#_M(!_? z{|EAa=Kn1Jk9$BRr7{1Phrs)p|0i7}yp0iH1Q-EEV9g;w*8c(^KlK18{eNQr z=mW4_HU6LV|Dnkkx@OMb9FMk#OXmN~|HH8Y%>RRXg602;$T##38oZujEdTF8|DWam zH0EHf*#BesKlA^#?;c)d1Q-EEfDu^x2za`yga3PE|G$m@v;1Gfh|tJ2^Zah{C~vrA z{?GiM`F}8WAiO1*|1iB==|IGh+{D1vhBlR6b$x=%At&-}iZ{i3ezz8q`i~u9h z1p%`EXL*vw|9b)d$3XQ!{!hmLNd9lK{2$BC zf4BDde<$r^Qkj&O@?6i&2A=4)<2vb78e1|!x}xCf&&i;K%Dq};8^=O1bu?;RfA?dK zJCD}1_Ogvp|BaXpYYBAD0b&aagbb_zG^HU$r8Pg)T8}nZ3yzt`|A#gJ+5R8f|AYO1 z9{=C`+~7DPzz8q`jKEq$z_X?8LiX<{`G06FSMh)1{!0I!?f+AwHS_##@wUcY1^&M~ zpE5KU|967vkUOpa8;`U7f7l3bxBXA+?Y94EJ#K7%!}@VZAMt;e z`9C#$H_qRj-gbek0{>_EKg~tR^8Zgc{~z=J=D7n&zJ0Uj4rrCA^Z0)r|BqhBVT8Ld zE5R6gB~OSq@Lz-X#a;v-vlz1eKkNV3zcpC@zYYaQ7y(9r5nu#*MgY{`hV^H=%lLoN z|7ZSBXg2fwZt*tMlllMsp}Y6qoJ-zSAzTCrNTPJwK)-tbj1p`>qyaZHG(0psJUlWo zk}nlqlledM|0~9?p!e|-bpOd8H6GWmv|X58SDF7a|F<&a)rqrE348pp}uTjq_@uK|Q zdgw|2U#7IH=4IFhsVI(L5WBITIdN9JtGGY&|N4c7mUvR$Dfh`8@}S%$56eCBd8B+F zDW~OA@-?JflqcmoW<&l@^A|zluZA&3QySw<8OZ;gy8M5T+`zy%m1723Gn}2;QxET|MwyG6k-R#|5^TD|JGpne;o>rFanGKBftpsi~!mHljsCU z(-;6aMJvHBN$hOWADo}h=S6A66NS7d@;UU4XVOBrE_UJ|*a%iHJM259|B3vb__6qA z`svJd`-FZ-{8apL%CyW}#=Ne7qFuAUt>5qbMfRY%TmMJ%TcV{-Df56?HC^Mm$UcB}0sg9fR6h@i@!Q50 zV;%A%FImykHc?#ub8WAF#XJi?V@{ZP<5en45@wZWD{>!Kbv%I*TXB}#HClt z@_(f6!Cu?=zbZKmnP9u`b^QNQ#`^aLi0|AdI!>CrBqTK->~P_9xb z*TU#TrBYRCQ&av@wo)y%S`D=nBUg?h#n>3`W3p-uSDUB?t~^#!WlE)DeWPg9oa^r& z=pP)&4-5?q4~z^H2G-yHWl^q>iw=!kpjwSY(vZ{|R+*Oo`c0 z{(lPc|I@hB4?re=4B-qtVIcpX3+4Yiu>C`%83^t2f670LC;$6+#_SW9=^szAS=?c> z;+M#eClH=Gkqgr4Y4kIcJA%D^Tn|0T|HTI^|5xu>yo04CqKh(S*(?8t$s6TTDJA-c zxF6p#6b)XLB>X3{I8N|IL;vXvT$|6TBZJL3Pu{movmVgAqjpZR~sox=Q| z`F~4aM6cYu*L=4b|L6Jtc>I5d{Ga)MB)8!C|2p2VoWKY$0*nA7(18G`Klr~Z75@+V z%4z7FlK+GHD-{6d|A4Jo&%ax|4c&(RKg<6iD`WZp-nI)QSY`gt{Ga*%mhx7&ST3{v zKkNTDs{ye5A738LdWapb5Z3?ifP@nm0Y-okU<7W609pSJ?Ej+=AaV`f7`f&I9>W)<@&wmWBI?b|JOzTpXdK;du=Uh zb*;?*$MS!c|1avo<;;u#BftoJ#u4yzR|o(1$o_vs|C{9h%>Se7qnYP-i${6GCG&sg z|H?Wc^MAiFNAu>KxQB+aR4mp|=MC0U>^ite7}|6S1IWJZ7yU<4R}Pm2KA|Fb+v@mlk$Bok-qw|gB|2HnHu!^<+7lYpl+W+J6 z|2+P`WBh+({y(x}q??%TFEnR_2(7XGzt|@}Co%$z03*N%d^QpAY-ziY{X0tjA6m;* z`u~yjf7bt3S4K0>?-p;ngqZ)c{Ga9jm^}bm|0}}(+5Ug*dr|F7oS(WKNDpd6rMHXSnZAB^e8NOmERrr{4g>cJ+q|4-i&NuK5ZZC_Tr$_Ow5 zi~u9BR0J?pHY@-@_urEa>;K~|e2dNh$MS#0uzjBYFPaIE=l|pR|61oeWd6_k|4aQ& z=vJQf|5^XP+qJ>zi~u9R2rvR`7XeUz+r}S{|5t6ag8cvf(A|4)&L!`v5H5lQBvCqT zpdZvSLRaspF_`}||Bsk|uw?$v{QtJ*|L>cZ?Mq@toK;WkDe;P0KPKKl+FKagb3*vy z48mJtR(@F=5g*u>6#sux%*YhdHX_`E?XRo!Ge{d(`Ol&E_hZ;AJuEK6>ik9R_mFQC zPnQKO_h2m1pV!~wK^=qWbNn^xIVE0{zgrJI$^T_ayJ}t*Wl<4h7>iU8yRn}+oYA{t znC<_!+5dl1-YNIV9rB>uB@fFz@_G5B{611n%ctaPNVzCa%6HiQAFf{Ic>cfoeaaC= zfDvE>7=f+`cowGr^DI|F4WP~{!7_<;J3X3AX>o`v2<( zHpJTckI|)%v*EXtG?xFf{J-thv}~&^|7ZFCvRzDE5hK6|FanIgiXlMqf71V_Abz{> zoBu9;OW`_M0x-#v4uW4Q7DOSRQz4hj3E{dzm<|roLcs7oggm4efftBJzV$o`kWf0p z7AdglTs^KSxh19BsK*V{En%Q=klzv};wHR}K>G~VXg!J>s5x*tMj58UI7S=R(QC!{5&Lpqmb+cp6m#2!@41}GKJWk@=pCR{R!=lw66if4cY+eepGu@ok3f^|@T~c(v2VWQ$Gu;DfVAW@e_RY7^L8sZH+>Vpz$KS0|#alWkk`#bSNy{^?+A zbuz3aEF0}EUznV%O;pFnE0s!eEGj`yn@Y7>ovc)%fqjGxCM<6|<1d;zQZ0`AsKrd&kw&`3d@OL!XxasIzm5m=BKy$dlyUB`Pz$3I5= z<38&${y**#N=(CdLQ#~UB~gKnL{&_Rn%FO%7SD=j#4-H82>p&Th`oZhZ0OXxvF(pO zW|Rd$>*23H{Loh(+Fh;gZXjMP6!D|KdK#JUA4S-L+vIJ8pWsvHWrW9I&mYeo=M=Uf zF29ZtYyThH;n@CvfCK+C0*nA7zzD201U%`I0sz_nZ{`0c-kC)Hd*%N*yr}~(6t^cH z@3oz69%<26YaUyJNpdvgr#SI@UB%NXPCVR02`WRSg18m(e@eIN{GZ|x|EK&B|EH2s zdeDCm9FmD|+XnwPRQ3|u9)9?tYIWz%eBO0anubpl*B$8ZPo*3O$DDH0g9A>A&O}Pb9UL5_DyR;L?{+x) z-qA&7U=SbGaEkwbx!@X2{NH)o(X3t8E_23sRllzN8JOxmRmnACykN0^M$B0I8&z}r zA4#pV;K|^?=qsS!g5&L3x~&t(?!_yPO!d>z{GT|Mt9o!vbgP*7fAEzS&;P;tQ5V%l zy%*GfaY4mDE&o4=K7u=?AwCcvslI{B;v?vxu1XsAAN6S*!B;Q!0@UJQ($DKxFb1H- z$K{Jlo1Z)KEEx9m6c~QF3jRMmJ*D!wc^L5PW$S)bwpb+oKNXc7t5S~vIoCz&jaSEt zCF)PSK`bZ|{@13arl-Z+%y?z2jE=CDZM33lCguVDZ%RwE(LdwpDZ1ZqFKQChgn9mHt`tv|V)LE%#1dawiIBG5A@akykD8n;R=SFAHo)%NKbwAB(VXdeG zNMVn(H_g&4^q1Ls*niTTzdartv#9w6;rqq04Vy}pf?wINDYxFAE|)jd#w(jQmvOh2 z%TwhI#qx$bHv7JhLK{@UMgKuRUS89$;Mp8JzXwEKt*6x6r--Mwi>H4d-WKb?87HAn zUy|31SHT@8@Z>0gO^!kDejK?`57NiLD|6_K7z@*%!60(HLdQ<8N^?p9!7flP_JWDR4r-$w~1RT{2x6_`TQVWh4d~} zj(W?3SPEYR5Od(I>ZA&IR}K#kkBp2o8lY6V^UlqiH{VfgT$0TH8}M+95nu!u0Y>09 zL;%zu{NI%w{2#m@++R(i)06x^V*kX@NVd=XpRSgWr{kMBT&sUQGyf+!JjvIY|M%3N z!2F;2e+<`W{?GiM-Yu)-nE$i;HlMe^<8Y|LY|Cr#=AY z{{Wcf|1AHX7cBq3fp!4P{}-osQ11^^5%nNv`G3;;jOG7H=&blQ=Ksw9SNx*m9Wnxp z03*N%EExe$cXjZ8kL>@q@qgm}stbW zHH?FUfsAn6n`rIs>S2w>Y4kGwpY{Kt8>AfD|6lS)F;~C{FanIgX8-}uvR%uQH2&Y~ z{67pa=?0Jg=kfn!382>pSuZ2}ldS_V|7ZTs z{Ga*%O56V%AlKiIzjQjVlbePMVlM0n@%aB<-vOMD5nu!u0Y>1nfPiO9+lB1k>5%^` z?oa&R@VAyWi_yWX3fXKHw&`G%&LCU*WS5UD;E@f#$n*Grx^Uv`|G^wUUF5MmCGk2`O9PI4`tzqAQO_!6@t^Jg!7d-$|D(58 z&yMx~S^vN1i-j{X0*nA7zzD1v1UwM`VEn&yTIK&B{%ZWc+1vbo5&LKRe?i;E@qbtY zYUW`KimIj`~Mwt2h^WC9T7aP!np>S|1PGu zpGNLy6XyS;{oE#Q1^EA%YKID1qAI5Ge*pNNKs(I>F()|G!OcDLxHG zfDvE>Rs;dh!t{ThKMmhNRuc$ z9yY|@ThmCJUqdeB(+o}JtJD3CNLT~vVEKQ@|I6V2C&2%UV4Ra7|9_^5{~rMJq%afm z|1sn$BFv!FH1bn#0o(s$`+q{dCxkN>d=SL{Ymegoy^+_DqpM4O2b=N;VIH>s*A*(> zzz8q`i~u80M}X}ANpu3Fp#z|6WVHu>SkTOWf%?C$`^5sJB_oipO$lHNfwhwN~_C3GLsb!N=R&_cnUR;?SPE%Ah)s6kKiHhsJMZ` z4pJO=vNJ#ucnfjbAHD5#q|*M$(Kj&lM+8oy-pI+O^x$}-EkQlO8r2^;+Hd5jZzFPK z=OA(k@8c*74oXT5PS?o*aiW=7|3H3lbZ~HRV9RF5oEWt6*>9MJWm+)mV13`p znlonJcoj_i3H@R1xOTyK&Un@Mm6?nBxxd?jBNN90BL zT}VZW97W1GaTd8KmHaQ{HS7VtfnQUMq(AgsJqw8s_J^h4w6z{pHC>B(6|jc-kr!vC z{5~AdK9yDx6;<0Tj$#hSGB5Y3N+z(M8ouG_D}DwgDPP0;axlzS-y2W?%IvUDss8jK4P z8UitU6US`gnCYmZqjr~)7VM+-pAgZ32=D?T7QCH~OKUCFx+Y-Gop7XM7Osycxvy!q zt+`l2s|^2!MyG&hAfBoCL#l!FpzWeZcWX=X+O37aO_%@s;tcv)UV)tdE%dJZ7|-PQ z@ecS9&+U)#-bsmf<)FAMH-?t}u%K6NyVDJN8{)N^y8G^}cWu4vuDkEPyMgnzFMR&< zpZnbB?%uk!o|Zvu6k!YA+;1cN1fMxCBRqyrk}AR}Y(rdr9pMndd4x9+eh#}xu#aTC z6Mm#H{|8X)7y(9r5nu$?9s-_pNdbWD|1h}xPC9ZzP)~0 z@7za4^*ekj{vY%L#O)?7t%Kp$68ZlkwqkFJ|BG74`q2fD9BUk3$p6R3LGl& z6ZX31i^KXA^RnutqcT&%57(zuzg-ow`w67hpdtPWIHNC)=vVAZ=zBVg_yL3y2|Gs(}^Zz;&9AN|)0Y-okxE&Dy^#}iVCG-D!>)vksA77zL z{(ltm{|jCCe=CPy9RF|aJGlAs{~PdsZEs!ve-cvvrSbn>ID98xUqkYLXaX!^{y*mb zE3G?lOY?uFwGhhxng28Yr(r0XuEwJ*+x&k$%Kw@FqxVWV*8i`6$#H}cU<4QeMxZMK zWc@#||L-c*f7bsOw;TVD^#70QnXdf5mBYvJ|Kqo${C}zZzx}>h4A<|a@1VVYTJPKk z%l}FLpXL9ba!f$0)_$-Sr|Tb=7FRY(3$zxP|Firbqd@TCfFXL!|5^V(?w!VIi~u9R z2rvR`3;|Dfb?|?W?Emxlf7Lk5|Ci4HN%Q_@jsL%a{J$>!Cp!R3<^R2K_)fmg@_(`& z&@wszcNXjagE+U_9SFGeEvo;|@_*LN)GfvT^ZEXP!NHM%fq~)88&me9c?agW42*W{wEsur|GVk`-&p>CbH@K) zjM%z10R4jA?EkGK|8Ku_7Q^*>={snzpVm9~!Ser}>$pxjF0Hvtd%Q0H$1w}m|7ZPwmjAQ;zqmIVr!fMI03*N%tT_ZcTiPyU|4x$p ze{*qz*f^XOgM*$J%)&NK3iJP24o-&5+>-5lgYEx!HZ58Chr6lv{~P?@ES7WbSB6sH z|DgYtGI-o#|37K`|Bd-Stp6{<{$H>1|FzEld*Se%e4XY0EdTFu-hqHq-^%iT%x6OO z|C#?Y|7ZTs{J--vh*KB=Mt~7u1lAw|9*BQ1{$DyQ|5pw4S(N`TxBb6f?f;Esw{(pD*f2;1m;_Uygb^hNAhwtR; zEdOWu|7S-2zvBG=`Eb5JUp;-N#DQ>qKjz-^MO921|Mz30oCxRtqdEU( z5NPhuHxN)x&Hwin=J4B(G6!Hm{T0mK_b#@b#N2*6uvGKz(}xEdOWue_*S?($%qzX1OKBKZFqaZH>`;Q!CY-T1d++6wUhGvNQPfd9V*{{Lg}|M$WF zKNRQ0$Kd}d@c%*Z|BcN5ng8F4_YWU4BftnS0;`1p+5eO11V}>%z|aj{Hw^q~nrWCY zBWD@9X_|hqkQb$qtjOoHBA3JXe>W|J4I2QWVFO?o761zH>yVm*&%+P5omEa`;T>2F zkl0G`l&~RJ&xwrigp0V2Wd=DYPCVQ}iUUtJ26W`K5GR`hP`AUniClrBIfv<3qP0{M zMZQKl4!WKm*e-}xss6|<8~+c+{u8318305hivYSYKK{T158QX(_U+q;haJbZEZ5Cs zGQ-39RLZt9YIS%RX*!w!+lGfTREu($WLY&7Y91OI9vU7V9vKO#md$G0+4HO134`65ETT@gT*%Sz@ z{%Oaxt%h2Pkt;`$Vr;B&fVGKg;L2kq zRi;!bHnuiuhRwf>opCUv2|i0cl{I1SFR%tk+o0)$RNaA387adx(q`Jsm>GX3BQu>)6Lt|gpJ0$aSXj<=4Bfx`WbM@ag~1- z?~3;!)88j9)4#SAclA61WX`z5=kU~tT#!DG=fTfV&k>aVxE@YGHhl)1^mTc+eaXJ$ ze&l}Sz3jal6;;b=@j=V_ExfXzX_6-XyIJ%9$x*pW-YNIU9e954l20LaP(CT2S5Nb& z*BK|Fo25%qWFG+Q}%EukDJCz7A}o1n8;0hb=R(44?m1&Oq3!r zh>ap_!8_$`grDGZ0c~hKhEEdYa!z3z;_~YVhY-#qyopdB|4$WQ{XOKJQ_(Je+M~GY zZsak$LYLx5PJIV|d4w=est<8?i~u9R2rvSSKq3O3bV&h#?Ef?W50GO1zhwT8kCAOb z2stV^Zj?gHs84`czjgusDtYk#Yxw$(bF0Pwm%{bqczxWt^}3IU_eaZ{!2h51CnqO; z|LLbe&kZRP)sd_g}3 z^=@=aYwtT~Uo!uXRTtM!5Z5OV@&0JZ{J(z7 zB7&X;=Ks_u(5X8R$J|@_e<1&7{?GFN=3ANgA&2WB3fDvE>7=hJCz|&nF{NE${|IGhYdocfBGXIa``f+^%EdR$9 z7svJE`UE20A1#^xH$Og^|10k|2xfWwe`o`c?f;Q2UR{$?UqI)84y$xJUI)RI zBjPTg#5A`52fKc3|F8K;&v8b85nu!ufn`9zv!(4q_V2L#KSJ|X=Ks6%DMN$#e`WnY zlTp_HkLqmypY8ugS9ju)?f*5;9YDn7X4?*IB|mKcFY)rEjj-F#_Wy2((u!qZ`9I75 zSL|Zr9Wero03*N%EE@utDhn0>p!@GhhvokY)?1nXv;3dtB3!=t|9X|p_nI&6zU{Sa zB=?V&EdOstllA{u|DW~$o9~Dfi8KFa{=Xs@8t;S=U<4QeMqpVH0QI+F{n_U6|8-cI z|MU3&K>vQO=dt;5`ucIazJ8H4MS3k8@&0JZ{J#lAw*PN`R`~z>q5S`>YW^wlidsJ= z-Vih5Eio-lKu6#V!dsYg^vmLi_`trD`k|=FC&i3RA#EeVJ)}pV($64mT;)FpP3w=v zygV!}L+kva_It=TiYLGVmV3mU{PX(d7Su5)x5;0lo>SsQ`MdSdlm0*Ud7HQu;Qvp` zJLNvPLmrg7uawXIN z47UGIFf#vNGXKYy&$b|ld39xi<3=g8RH;bg@&CXguAd;TPaxv`(USSUy0pSSmj8cN z_&@9aH(&Rw9A5$czYF|-5BUE+@c*X}I|%;&Jl0NP?KJrR4-k8e`9FFQluPxk@+HB$ zX9O4lMt~8x1rQ+ne-fPlX&(O{wbrf7{~znOb!o!@fTJt`+=}D>WBUZ=1hL(DNZiPu z#F`Je&pxCDGI~E~JbVc*ul|1=5AT()$K{KzvF2s3`-pgdv?N3*K3m7;Bvq?lF@9w{ zZoH&lQU0j$xPGO1cS-TugmRTixfVtzDwV2Ao0{^MvXyG7)oQ4v7`bv3DaOV`LF9vD ztxZ5QN3J|pQe{e|Vtu1%)NH5ijGa*<_!Sp+vZ<_@!fbf3br)=drc>6*>JEI$NExn? zHq&Ot%wPo6DwWkN&C>1Yc!Kf&X3E4dTWL!jQy|x0O4`DLfZ;U?4M%%2(^iH&P$8d< zOY1BNt8V{)d)E#lHxY(sy!QIB>$^NoA%{c?Aa_cjT9LinafvP>I-yVyi9||)Qn^S) zk!pofAc~}+NOc7?DUt$&pg|}!2!$p>k!TQUA|#p=&_Y8KzJKhoy_?C!(UIE+-}uJ! zdpusxe)ih;&HorjpH-5D%F8@247~&;w5?eCUg(Fu=XrRhVue~C_4!o|x4RL!Z%PoD z6#kFlzarsodn~nlsQ)90i?h7Eba?6T;pOG!3gFjYJ9_lUkt54XOJ$v?@2USU;h;bS zhyW2F0<(rdsuM8)kofbRe0jRe;0=r#yiUYD;B&x|KE*ctG55&G7DT*-X0RF_3 z5yJrJj!EJQ0G|MH0mz35;&^@!(!8WoC)U>1R##V6R?0h_{J(^P0udkrM1Tm)A_AcP z;Qxsx|1YmD`TvgjzsuI&7o0u;miOC|{2#*rWg`DC?EfFP9jI7;B@Ofc zT>nr0ukORf=%RWcYi|jbHUA+0ZhV*S!s^JTyk4x4eue$b$LdI0I{~u!j^#2#=$^UoE|6N?)H74NV`mQknSh$bJ z{=cbizG*wxPrK={miOC|{Ga^4P{@nl!;|CxRjj{~hWS7B|Hh9-lmELOP}|j!|1$}DT#>W3$HvCQbx~pAz zlhuT#=dirrmgN8B|K$JY)m9Pz{|4g!-$eZX55VQGA>V@D{v~MV?-ud@``G^{>U`u{ z{D0J~nD$%Hpi=)|doVQ-$^Xg!o7^XCLj;Hb5g-DSg@DBWYo}WL|5Km(f4Ml*%>PgC zk6Stl<1xqob8&swn1GAxyT$~@#{XR$zA0aKwR8RWo1Vk+ep{0NkMRGf6LsTmoW^OA zCUf~B1UX8gPTawsZeCxIX4%ul5vKLHj;;D4lIacn@VD!;>w65>jeg%s>t9JBq9w?8 z&Jla`NRWXQK&=inrmlX=O3y}9-e>y%)Bm6T|D6A?{1c(3;AOe$%KpN^WLF~VX z@&D{anr8lgY9aPLiF2GJ9n5sh`2U!re2_cX53euebMDy=;1{?XxY(|3~;g|k{6fQt2367B!h zcg8N@7WM!2htadjlcN8Z0RKh&KLq^q{8j*Eh6(=X7g~)x{-3-VCDr5qZLF`Zt{y+$ z@Au1Z&-i~O6cmU65g-CYU=|TbLHu+7e;wI3r9{pR`~V?y+jx%#L3U_yLA~!GfgJ1`ScZf5BlI=1+ALGxDZl{x$*$z*;*lAYm?^Z&Iw!@NEx z`%kZ%asB^&vyn4H(qli2Q#=JT~*2)ZEmU^ljAKfmPSNXXpR>CGFd{ zZ|~j{Ynb}4-+$xSvGSr&|6f8ufd~)*B0vOY5rMRg>HpGpqG1L={lB@wqa?z)ow!hf0DtHEAzZC^b(X9RmR%) zLO=8|4?CWzSfSQOeSR<0O|fS2&HDfNPP@SWH^BeTfd5|v|Gxz3GWh>hY+c9JP4NG( zAl(k(^Cl@tV77?ApdFxq2>V4O{Fj3}QvBlJ6(^|!3r3qZ-`d#NIC*k?ecjf;22rVl z$gko}_7n2YFc{bl`q`7&Sr;+KEzON|Hi zf8xeRe(j5t;4(=2L9U(gi-G*jY4X`*`FfhXn=JpyH2FfZ{4Htn#bo(g)8q$|<+rBE z4<*Y_rOErr^0%eQmy_i`l_o!$DF0Au{a%$UpIX1;$?~c7TS=Brt=|pF@~QQEO|pDy z{ccK@Pp#k0$?~c7TT7Ntt=}7xZIBA-^j^C|La_4`i0;peCiAMn_TK%3#kx#4NKTMHN ztKa8Ri78+`Lz0dAw@o|e*Yv{KK1?kf2YW&)$dCw@@e(^a*BLf{l1bS zpH{yoQ{>a?_q!?bY4!W3De`Icdn!dft$trikx#4N*OTQ_-@kvJBA-^jr&Hw9>i5kQ z`Lz0dD@8u7e&0@!PpjX*N|8^i-@i_gPpjWEDe`Ic`%a2{TK)bYSw8js`?o3bY4!X6 zrO2n%?|UioY4!VlihNrA{xC&8t$zP&ihNrA{y0TGt$sg9kx#4N|CS=3R=;PHgp zKc>m2RPaBg$){BCVw!wP1%H?(pHjg;Pm@opV3ox0{?!-vr&O?!CZAHlR+@ZD1!vOa zQz|%{BA@mGcGKij>bH<4pHjcYH2IYJ9Y~W;so$YA`IP$g)8td?x11)QQoo~V@+tLu zRhoQC{f?)|r@eqHY4R!cyCF?JrGBqTlTWGNO=h}{V@@X&NdYXJn{oax$pHjbD)8td?_qH_ol={6rO+KZ5r_UUe3 zd`kUpPm@on-@DV~Q|fnTmpooi;sgOfKoAfF1OY)n5D)|e0YN|z5CjAPK|l}?1U|wD zcp1l4UM7?G9EW~>?q~mFB`M z%x|ji(dX&m{D+0Z&SU0Z&~K8RvonR#hxR|4XN@mAx0v6_K2qFa|AYA@yH4+!_hldV zzLEKyY0~}ly16y`civWIP@ZzTMmuUpV1A7E1cK>U5`LI z$D{)BDF<7QK5dRGvJe8tW!iD06%XV>A*4n!o#|12Y^~r7!#H>D91?j0vB1%;U3YEU zcIWi;?YH~B>*fptSiA1f;9xG7&EiCJZhm+uo8z$;N@d;Q;bFaB-U$w`SJ*Sr;E+G; z4-EN3*InZnpB=RM+>l`yrfH52G)mvfv;V!^@8ynX|FiQM=Mpv{Dxtr&6|3-J^-*g;B=Tu#S~xs6KEp_^(kj^uL=u)Ys^NdJ zWz630AL*hIG>CWYUG5)prF8pWBKhn#0vE~xpK574pi$@R4&+ng`-Az=R zZp`i5*PPXIu3z8LNXVT_&aKqC%Z5kuOI4z&>3Z$j^}~b9#Zab1gH&EzJp9bU{QTS; z&Z<6DpRBpwX0tLmzM)zl zYu3j%l-4)rYPIpkRDI*d8g8XpZMHUEsf}N~vDxH1VO$qH-$fZ${aN)s-Us~ZAsWK{ z$=f-7eOK@-cPWQwzDHN#?$}LbydBP}=d5Ymkz))9cae#u$**D4P|7@a4wo)+@#n+$9xlD}bS4nCQ9};uD2E!% z18EQSSVAogqRxg<%Ok+kakANrgV&|2Uw!)Z*N)*FOw%&)h8-Ln3SGVB%H=_Jr9wWa zl>%0y2%8XI!}-5~Z~~Xx48kj>=L!uBc1F6DLt zzU6%UJEVJGU&Z%fu3;z$E zI2UUv{9pM0#k!VcKZ1ZDAP5Komk$9@fAD`-_3-~d|8I-_Kd6f|&L2-ts5Sky9_jyu z|BL=V;Tl1b@PFa|%+U4Kq1y<9nCSnz?-$YkcO$a8+rs~a|F7;9C`T6r1OY)n5LgKU zp#NS5x_=9804e?dZR!6n`hV&FFa7_e|Nq4wJJ9M6q$BzXF8qIq7n$(?CBRvQEaCsc z|5xF%lS2vuf`A|(2wWfnp6Qz4|DN65|6j)c^Pt8Sx^X>!TD&FPj)?wW#{bLsf7lKP zZwVRyAMyOq?tt+B_QSHDnDGC8P`Z3F!vBT;U%snNjwA>O0)l`baIp|z`+pfv@%VqQ zSO0H|{l5_CG|nGSPpFg2!T$$`hx~!T;gRabthsxLCv1Xa+ed~W_W#Z*vHvIb|8PU- zJFz{MKH%Ltovj6m{lB=aMBUwq0gKry0br5!fTT7HvHvIb|HS^E*#F~i4{?HkARq_` z0&5=u&ryyG-G8=6{}1jT+5g{M-AJRuMIDMonA~Qo^p=Bv#}?sX_g9By|Ln)z{y&qD z*0=M;v;P1{y)@LT+g2tPpDSS zIxeyOzc~L7_5WJ=FZ2KDSqg>!3;*XESonWigC9Pr0!)Pe%lv-{ude=*g#Qcw@9#nH|9^4#e~146o_p?`p1%F|+i$zg_gyz<7-(y8-J!w3 zTrQi`#Z zog@AKqc#Bj4hk^2qWJ%M%>RB?y>Hrt$=KnBz}iQ#t)nnn!#GJw-1=cA6Tn-mwp1o(}2b@#0}R zsKWtz9!GOA1O0Bu?xq9iHNdhDL;3*ra0D})?lJZlPnb^x<4eLl@NqsW?$Y!B5;_@< zkpqNtsF^(7NFER`0mDJm&oJt01a*rZjMfYB^(G$~0A`Ye90Jg;m0)l`bAP5Ko%OT)pF#VsGaTU4& zBGuj|3HnuA=r{{Qju|NP~H4br^M8%8v1`|k9Xsy2YkGRRkk4ivjI*$^ z*<7*cxh~e3Og8Hli_lC!aba1GQz{jry3xDE2!D1XBZEW!@aXXH@X)4>S$o&8V=AsY z9=KuKk7pjwd>#IQ%=31`t{^PhU$LGGebb(|pF!~LQ?wZRd)2*a3;ZJeSL-(GMr)Hb zV*RT5IrG1nub97OzF@wO!2TWc^XB!|`{u8ji?Hy|@?7c>^#ka<7NK!Fq8?Y<)n24+ zM;KLG)k*m6Nad7KEVrl!AjPTde*mV=y0V=JdyFTI-!Wc-KaKFD@ux;z>*1QTK+oVj zPhowOexiP&Ji~*Qe+at%MfzR!w%${q_2=bDz5l5He|$X+%~7|n;LEbxM|1wg*WH(S zJTD$klIu?6?Rc3eo+Rhv3%J|wg66B+ziWOPb#|xqY3<(y|NperU5>Yt+t+AV|RjW(HCaYC^*w^5zywj}$oW%Y zX4U8af?ZeYb=$F>Og58sa!wAKzHort3tC9DH#J7uE@HeC$N54N-;bhZuR`69qoyk8Yq0^iUxRwv1jIL^25jj6wL?cbDE@JOTNby0!vBNXNaOtR z^zM2S{xAH$eN71e7yW;4zk`@2UG)F$n1@vF*|6S?-zq0ZF!vBT;w{K42|HA);|4aXW!pIfr|KGBMvrI(# z|6@AemUX}O+a!vK{l5qaSqlP!fFK|UoDTw?>6+mG9^3zqHvq)=zl{F}pm9BaTD%)~ z;s3(_+t-Bff8qba|Aqex|6hjkcVr9y7yjRVhe}Kk5CjAPLEvH`!1n(#p5pQUUN8TL z5daJn75)F(<^R4vI5a%G4s#lnH%{c7oqiUkyV&Ul9I^j*QpN55Me%Oif4tpo`;WJ~ z$K@w+_#~M$xum-`seF>0jQYKL7Fb?z+Al{r}ti zzpek*s(+dPPv-x_41hBKpUnR!`hU^?cfXr1*0%6};r|!wT9W+;0)l`bAP8JO1fceJ z94wX`|1bLgOThnk?!4=+yY9U6_SNx5?lxiZp zU_Onl)?2g#$f zfgYo4=xelzzCoMm-(o(?Y~XSRjBK!-4a?GRNrOkip|6i=*>)zA$rs=}cK6)1ZQHgx z?wFd|>b6`^E9l^e;}P~v^qL}i1K|XEI?fg_|BL=#`2Q~O80PyU)}7G(vlsop=>J9kFZ%ywU(PEOxb*zL4*ov{ zK0XcpzXSY#7x@2f+JF|GYiJf6eGdG8-wODDz2(-gE0@c|!=+L&073Zw3NHpJCI|=u zf`A}!#UQ};{}dVl^5_G=3S~nt48ulix{XDP|5w+6`-A_NN_ahL{tp`f6t@Ae?0^2a z@qgAozy+F!Fsiifo>Ql$ZoT!^Pk!>|n{O_cq5schToUe>K!=WnWJ)y$w{Dm3Y2GTg7jIc)d(XRThp2whgUf6eUm z|HnQ(&JhWHG1-zL+iMigrGe&**gYa`K#_gH$sM zpR?Gzwrl5EX0^&1Sp(<7-g0p^`dpIE`9jh<46274N&i<_kvHtfCzVY)XPRw}QL|Z@ ztZc4MjWwq#)zbRr9C~cbPES>i!8{b4OT zi+hK+57AL*_m6=M?uRb^5W;cfOsIp9Kka-s*ML5Mo_>ThOD)ii(Cxpd(~nb5O=NZuyM3=ZqnDeF1*{k7ZxFVqQ*;E{-M|Iui%5MN`#FfxKW&A>bPh)zRxhG&0PFof za6fQQcqhORB#~N-T&_j`>y`DRqoa87`k_&ji^2c-f+i6LhHiFdx7x(_C3{qO!$9t|9|2C z{a-^ODF_Gxf`A}!`4Is12mg1K=KsuAxeGvx|7Y!N)c;@jf2(rhoIf6K34{^h{}K1+ zweWw@|1($blm0_v9690t*~ESfNo^ZRX-OPj_L!ieyH;s4z|2)eHk zg5FX3|0lHxw2>12FZ@5c8ZLhSf8qZTwkuf+{}=whlIupw2m*qDARq{=E&`tEn&AH) z+yB?v|2F>z_ZR(tR6B8=pB9f~qqXpV;s3(_1N#B(UiwK~KPfG`iwMKYBiG(bJGY&d zq|;8)hfDu|>Hpsz|1bQ%eJ`DVO!&X>|MS0Uq=X$U!O*zUFd_pFs`x+ z-)jlh|NfJiR5s50qqy|{m;V3E)swh>Qd)Eu3IAuCg-Pug{iaF(|E28z3IA{3Y3Cmk z{xAIh{I41*AqWTpf`A~f+6Z`#a$M;Cvs(YJ?bU_+pN;?P{{O-Jf71WIRaI-4|L^c~ zmceF@*=MuD|Hb|v&jgTU+pu*x$0AEx_+L6#?EkG~-hm`rdj0bHe&vM!3;&PZG%_`mh zU-*B-{dq0?U-bXlG5|(6IYsVEFXR7Z{C|7=e@;!&akK|Mk7xW(X^|dRXJ{02iT<*& zfb{~MgN4p}@f7)k)&Q^tnn3z6W-tArYSK}9ntn+|;V|TnBkx7JPMvm6J0G|oxF@_5 zUi{rKN4eI%;^|jn{L=IP1-gO$J#C?5bR&I-K0$v>b$XF*p;u@t{YScu{+w>7za%?o z@J6RMgXb?YO-pxUjHWckyOM{*p<`Um)h?IYb^lGD>nh$eDlraa-08` z%YK{xm&= zfo7XyFw|I?tZc4MjWwq#)zbRr+~j0sc6zE>oy2U8laqTUD^>ieu;z$IWu^OZ+1Iw% z|L+T?%O-T``F|7q|6%a|{owzPg8$Eh{~rMVKM4MR2>kyr`2SNY;Q#fOtE?YIvwPY1 z{Qx%M|CjCZkpl?=f`A|(2&@tUZ2wQ85g^ZF0N|LdqUqe^)^M8_a7}(QR@Zqn=6mFq z@Omud(ZbD5+-M0W2LUbP%e$ikUo*d{zDJ*@hw~p64m*#Te?h-VcFxWeN*~()Y@Ri~ z?A&60C;Lcohy4%cm+U&dXWo~6-1|o6bEZl6)9dEe?B97?l|gyhtsb>DWWG%X*;J)7 z>X>;C^fv}hW{my}UkuF4O&Xx<5mGv! zk39u(Ypmrem3%&z$@soEJPZSAg#vnHc!-Z|*pSZ`vRPDt?{Cpj9= zm1H}xo7405o8bFLx|S!^5zYVO%WtXIp}p%|UI_o+f{UR$^rrB??@jGZVX0o1bbh^3 zgzLK3FF-fh_CYPYZ}$2I_4=e^%+J7msyd^p965M&M$P=v%*@q@tC`=d%piM{nwguK zsm#pGtC`}=%=N#BygBtt|J$2b&(GX{NX^_D6lm7f%qb*ZJvTG=Cu*h&SF2V_t_oxI zO&sC0I(!hj22?SOP1kMQ+1k6I_5Xd%dA1)|(k{v*R~ONHE)05pab4-Ef$_odq4D8y ze_~|3Q1S+g!=;gdb%SF=>-`CT9BH0cEDn^021W+g`4hwIby};eKcUOATv*nh;Ii0X zM_I^?b(bB)F+;idamRX(tIP8F#m*(zpFa^DH#q0v3H*->N+UXVt~1~X9{t~m!HJ=X z;206-H#2SDU6QwZ&v|70%H{v8|33u%{{o)&--rHxFPDA&ss5&M-4^|?k23Wi8X72-f+`UH ze??x3a?*l;ARq_`0_TB%r(Es;!1n*0=w+$-e?JS!3;!4XpLAy=r3wE}LS^;Rg#QcwU%jhOjw}cW0)l`buu=p((>1~WJ+}WJ(f^qK zU-*9rY~0RYTD-dsV5=_}^l!=d|04+&24ws{Uopb}h5rlx?|ycsZ43WTLuPf-h5rlx zU!5yYjw%QU0)l`ba3Kh={lAQ-c>KQ?b^mYk|G)@<=>ONQ{(ocywu{%VUq3OS?f>0T z&f6wW>BtVV3W)u`3!48guFsF+NqYS#FTPHaOS)5q{|o;Y{-1PbB&7-ePeNt&(uDsD z|6jeUPmU}I2m*qDAh1#dJV!Y$bpKhc|JT<4L;L@21AxN+uPpu_SVHEd@c(ZK|Hpg) zz1II5i4P31|33f={$l@sE!+PW`+teI?kXh;{}=whN|&A-RuB*b1OY+d0ub;({DblT zDl7f}ue|yHlJx(=|Kqa&Ch6Ckuo2$v>zG%%+sF0!Q9MbnALYf@NpeXyYSQ^7$@R|u zHwFvmaWC`#$^3swa|d?L{l_!-UCHzR3I9)eI;>Wj@PFa|t99+kaRmWEKoAfFR*nGF z{+Mmvab)~IV|Y3F|GJi|RPy;;Cgc0w@GvGgFBDKC9^xY#Hehye*DVwZA zwbWR`|BtAX@WJw1D$e|acoM(v=Kj3h&HZ^h&gY|e60eW);_D>2r291K{F3B^|2OAx zcT`H+VaCzGyVbyzT-BP>etd9T>+mN=#yk12KjDuf4R=*>An0@NPYkcuX@gPQf$0C+ z+J7^{tp(j7j$bfm;mA16Hpi&htV~umSEt6BQ`y>R}& z2h=>}6we8`KsPELN5Jy}9!J`gmVX{k|DVz#J+98sD4r<4Y%E~CKqdj5Zg zw$Zz^oqkAn)8Erh`X|~2jAtmL?j=ushJ1A&tydY0c4L>znLK}yW!btLqZRgO#G5md zVHs`ENH4Z;o1UJ&{r20YrrK#iO<;m!8b#QI@EU6B4TKYz<#+~RI!kmEVFq~*BKZM(J{=WeJ|1|jjQSkrc;Q!Bn|33@<{XE@^Hk{AU%XA;wdd{E!*IRD1 z?EC)E&_Jma;3)im^{yv5vLGM`2m*q@!r)yf6E>_l?ZwOq1@X*Uhcjzw@>#gYvXn zJ!);pe47lY0jqRI9W(Di8@NFZjnSXc4Z20$qyf4ff!Vu((=1TX7$3;-X$QRCYPFtU zT>U@q9uCt0oYS3dc>}S)(bmx2d~?ZV@9Ge)f&?USI%n{Y%LgvlG4GjZaL6C_2ZsEi z>#lK(&kox7ckE1_d*Iu}U-tsva2xKAvXj|wI?ur3{8`0*gSo+c&U()BZ4E_h(SY`B zfj)5GbibQpU(No#vpvI}MS@=DQTYu4j9q2l$C&dY(827c&Yxq&=TYuxIWK|J&*bl-O)+HiCaS2Ynm+z2TbU z)1kko6`O`WGVs^7Vu6N|k6HsFk>~SEO5=3WXBM0vZ?RmZRg$%y$*zVY)OA+S3n5vG zwMy(u@Z1}qlGtbAzZn18d>8(+<{#5(*Yu67CE*C?Y5)D#$aq;jo3-j}Hb2zK|RDH4r z7wm74is6n)?-?6>gBZ#*EYr3!7WCIafA=t*?+Yuu1B0AEI(!&h{<7_J;h6q2`WX?# z^!c>T`9jiyPor5}q7WbApR&o1Z*5bP^j2797L)5nEg;d`c539s}z^#A&@ z9vjnAsC%kh9V-4S%}TY>fU8s+HFOK8Rb4C^D2na@=ps<7CiM^~KBMwL^y*P2qX4t4DB@Zo2X^zkH$Hp0(@A*j_aSX@j=ioE+W-DBabK$(h;I}p8*THi4=qJfMmIrA+ z9m0`(tPh~y1NV8Dhku@er)qHIJ;om63G)ekZ8K(3XhM#kuv0kZg}QUK87KdLQl&cAqiLhbS= zG(JQ0H<0Egtq&XF|HA)U7mV=#q&5M-BmCdM^CN7t(3gvTqMUzP@Z1sp-@4_(i17bz zM9yzp_OaN9}VWh|8-@=d45_v zq1J@|xB38x{$KR}ftEgr>nEk*eiHsK{J-O|D*AuX|BL>=eM`vr|27s969fbSK|m1b z9|5-hAK3qQ75e}GGxz`3{6Fmf&)oo||G((}rT@S5|Cj#%7k}(Pt3QyA=;yZd|Cj#% zB>n$`J45>a^JvA$x?k^io$&u&Oe94R5CjAPL11|VJkvG7|2?+O|2wP1{-4O6z|H=G+(cA%1 zdk2p(2*()+|HlJc?Efdcwaz0+_`mS~^SE3@R1gpZ1OY){jUWKEzvEyL8~@+M|1tlc z=>IPc|L@TM-x9i;ZYsI#T^+(zkbopk=M4VoS&a1}_;lx)1&IcQ|Esg1m4OA!qy5|J z33XC!HiZ8R{}=u*{NJUs>NzXzbu0Wo4VnJZFFpUSP!2sa^5~)AQ5_S4e2NBXI}OvP zX@u@W`^_v}MGq2sFlIAOHkWgQ#&0x$o9&o>X<8*3WV^Zx-Pae{y# zAP5KoYZ3u3gX#agjH}QMfXDy;EN1`TjQamqD`Pa~mvktVN<^-UuK#!o65fc!V`qc$ zv&;O$kA44t^ai+e{r}tJ|M|N|^#8*Dh5rlx7yd8&pI^&o)%#`?n)Ey!q{B2trC@on#`F;^IczfXg zcvCvC0YGd6fZG7r4#2YR<;qaL6AX9UdMY z+O#oi?;3VY)E&>-XlHEu>zS`-j==BDyll_eH3Td3W$X7sKWFc^k0QACDOwEuz3N`I z1%8qK(Yo8Z&AQRL+WMUNKbs$#ubKbOJYl|r!2T`sLGx!08*UF{s++E?=kimI}!F6Pa3~tyaaz5 z;Ys69jXE{775xQz2IqMSTK=Q-6ZI428J=-g4MEqxNWZJz)_XdOJq7-x-hX8OFTS3} zS7W!Y;0v?c2Uhz#m))0nXKs5dNv=DMx7#J!u_QU4di^fy_3xUWwnnTwtxs$JuF2cI zCHSMd2>sZCaE>?Ui~>JqWZY84;&JS{?%{C$nN zMq~GMeR8rAIe#k5tor=luuZE|?ZV#=?0do%4mHMScF`>!kk+OD?dGpuMRv(smK! zrGk+I+=|&cYdbh+YBYUZ%9RSPt6HTQTwPpab&igW>4Yklm8)5VBh5;+!WUAd+Ne!d zsby|eUDuAHkH(W zrj4pW`|uB&#A%%WFwX5!I*!=$I2Zo+PlFZLXg~HfkGyXqeI9%9ZNK#{K9)I_Iqd}h zoiU37%dz|%y%(L*ir0Pe|FGRVuoYw~Txh1A)Q;bb1_q>r4#`n8T#p0I3hky1_|Mk> z*G)L<&A_GxY;FK5TY$igK*omtU%MPPee?ZoS^6!h?cm^EXXQV19r*&B$1Y<3_4@jC z<#Ks=xKx5=BX$>q|MN$Y=>IjGvJeCW0YN|zSc3?7%H<9KZ2v#x|IGfu|Jm@L=8?kx zx!U66{L|vy)e9Jf{|o;QFAHY(NsiOIeUe-fhwo+oyGZ!I@c+*Cj&26e+rs~YdrbI$ z(zB-jG~xfr{r`pk_kRtEq#z&&2m*q@Mhvf2Ur*-!TEA|Cj#%QQv=FOaFiA|DW`Rku*U-5D)|efsYRYp6Qz4{~p`_ z*NXqJ4S;+9!-@VsycFVk{{6E1GfQ5Dzu5m1`+s8pul;_I{{L+(Bqj(50)l`b&_4p6qZ}8y|7=_TAM$@~0Fe9tJI#%i zahfO>X?WP9;UdiA<}m+XCYt|`?G0P~98v85Uwr%jZT@dpY9;sXk({Z}X@jkr!wdfx z{xA0b#r{9R#Cm5C`+vb3OYHyk^X5*M5&M5)|1bUOkQ_lk5D)|efwhW&2jU-$|5w@A z@c&>AIXwcvmHGcrd1-zA!pH)M~W@C|lSG^6ke^Q-o z`IG91@PAYE|Dylz)cwo+f9)r==>OYTtR!~n`F{iBuzr;`&|bQRevLNK7ilv+N;P_n zZlJHx7WxL=NdFe|S!M&5Gcd^p&$D4!`Ymagi0J`www=jj@&!0H|L5Iv*S2lj?zm%W zYAe5D0~a8G4vsX6unFNc7}kFS;RGi1n?aaHug9YZGst@o>5n12fba^!I|xPegnS)A z=Kljg;sgOfKoAfF)+_=Z-ie-cp|JKmm zd~?72pX(=Z!vBxbPt;G8XLyG2|6LUK%=bsEJFQP^|E} zOV9szf&cHO4b%Ytp9LqM1OML#{@(=ue;E9KKluNnE8ze2mRrBBTrLj}mrBI|1L6NG zyB4IBARq_`0)oJmg8&TKHWn@ZUtL!u-!D?Bgx8~+Cvso| zfZ{d)mi^NoxAFhX(%}M4L>N^_45Amr|AXCP&m$w{5q!O@Ter^NRL!cHLB~{?jDw$( zb)0AHUjJ___J5(5yyn;<_4=zU_Mg;CUUTeoX0PupxkyK#dGGfB0($v>p_&w}ImTu8 zs&Q!VgEhxkf4@KvX)QjlITqvxN7}2m7U^wu2Q>cdqjjMF-(zqufRid(pQ2u$WOJ`h zy?%jueNx$8sfE7n`X!Z3x|PPL*B_!@AMpOpW$!<$Cmn*m&~lBItF>G!^9!xaMk}-S zP|GFdR$8vwr)!^Jv*lVlskC$3X-X>zYzsZzla;WkuewBcD_@>71$2^l`~oxMFIR zW>7tKSZvf6+Sr&*sA5^UI;^`&vr?__rBbOjYLk^}t?FXYK+z^{v1YSYja726KP;QL zo6p#%oq0N}(`IppvYV$LA!b1X+jdPl4z{?TPCMUCofZ8!<ncqua zpfhv`&&-4Pe+TF*^ey@=dXD}N`VRj6%izEbtdGL~KREkW=>NrjK5#$a_p)}Uozu<< z?}W!2j9C;|?irlJ9BoPbPeJMamgkIf%D_cJ$_y?Q!&Jlx=fVWVnZ!$u7}zT$3@r4N z^(L|m7^etbYcEm4xliDq*YV$P0R~%v>uvbQx6@Ow*SbL4=xN%He}6Zyw(-Jam(Ak! z%5PW;-!dHKH?V#O+tB|bKNo2FbGa7%uUFQOj*gbgz8?;Xx)}VQE8#7mdy2o1mT)@_ z)*vkH4GmTDPQ?CSGA@!T2nYg#fFQ6m0-kcY0|49qccPaizc`uu2Mqw||6dvNN%(&Y zNPb&KE*_84qIJadbx%a$|KRb$|D$W8y%zqT+#t|Ks73#qZLZ(WZKox1+9cjA{Qum! zB&;I#udImu8+MC`#UjH0+gG3Pf8qa0{r`pkx9<^&2?BzEARq{=Jp@4g!T(*Q`G3$> z&h6(R|IgalsQ09*eL?Ekx%H$HUC|DpYd$I@{{|GzT( zf5QKT|96fSNV+41{|o;Y{xAGr_`mRf)+Y3N;r~hRO-U031OY)n5V#NoJkvG7|2?+< zAJKoU|7UBu+yWr_e+_S3&z~0Wt_R`&!vBT;2NnX_z4VjWes5~~Zj%20*+e@ANn;z5 z(pt*YSVa2&2iKR3|8L)CD~ZYY|783B(*J)YSCfs-A)$wpq1Zoao9+YamX zNpeYdb#KYQqFJ|Wul2t%*u(1eotFQCt)&0fy?@?b+QQ$`xh?a54~hN1{_PGXjipcG z@E4L6qy4R@@c-cY7yh609Oyqy_`mS~{;w916a)kTK|l~#D+qXwa$M;Cvs(WjTFce^ zUylIb{{LeC50#as^N*)@*Xb(g|9AK~%Yfy7cy_}7PpV$)|HA*dJs`;~&G47b75=}H zc?X35i~WDG{~t9=iT!{6p6K?{|3B$nC24|yARq_`0vCb+Cdz^Z00;VimF?{RAMt-z z_&)%S^Zc}UcRj2E|JV9|ng37b|Lg1pAo_pkyJh~rh-P6e`v2f*E&BiNx7PV>i~e8q z|L1qbh_oOe2nYg#z*;~6)Zf9Ev6C|XU-bWBC8crxczSnzF3taM3EfRMm0b3&4&f?D zKoX~O2LD>^GkT&%OS_Sg@<_Q{Ubk+Yzp0v4!vEDCgW3Pd)>`!cpSFbm3;&Oif8qbF zN44<(78EOrTzdY$fWAuqo^GLIw3WU?x6vQd?ero|(<`)%{v&OtKc~CtFUijEhYb2L zW(}Ud$TTfIj4_(h81G6R5{LX8zffH_m)mvE_U+rZZJVB+4pMj-Kv2MH6k!v>YnbZy z4TKXJq8WtgEYVSf8RR{P^v4in{y%^rP7n|T1OY+dibBB4VER8V<0^Cmi1;OVE8G9i z+S~;|`v2?tjPv}ocz4Aw&HuNC?&h2O<^QVXc$|jt|2x#%+DGfRJ9vN84j}wr_`lY6 zi~c{>1R(nV;At)Vzx%Cqe%qIx|IdT}9{~S92>yQv{Qofc|5M=q3*i4xga01||3AJ0 z{$Fpo%KFjK(Q?`M{oua~|3ANLK%@l$K|l}?1g<;;*#4hFBS4DF?zgp-4Smht7?(Sfg--&EhD&(p*C4-1E#$IQQ=-y}O{ zX9}ec?SD4U8eev9F~5_2q`1TW2lGpIo!&F=%RcUXBl9`ar2FZ0b8GhRysgThJndGG zS{pLo#@x6zRq2d6X5NE7`UXyBjQ)&n(EasI8ldYDxc9z6CKZTJH`sEp9mEw`$Pb)C zYC9eucbCTbzd( zHT*w2V0HTU&G*f3S-pOX>h-?W>Ho_7tG>%_QF~RB;>*42h&qe3_;RmWphY^{u{?!s zE*D?!Rg19Kx20ow3VT{0-fMfw`#Xy^fcSE6!av*6w@rYgwu2;lef`R{E{#|uscbB} z6|GRO?=H)=$aUQ98`SGtJB~%v%*;W5X6C_}(=&+9%sh`U-&8YnYUXZ^&Zz%k=2J8O z;p&;&W?10V2qH}#otc?Kxl=*0xq~ymb?uD$zcw^yw)1X~8rt_SxhjlZvnh;JuZben zSlXtljXPU=H?;r1uQ|`N2$ZyoGRbZ4*`M(I;=0mR1LK3^L*v8a{`kmvq2x~#hf5;^ z>juY$)`w}HSM(=JLjxm&>xRa{v_UTGPjr^`2Dz+1(OI@Qz-9f3&a%OA{fX$fLD}HA z{)9dk95*N%9(Mxg*O|87ANMB;rFhxl34dbbg3^dEvsy>M6I}maob$xs#Lz@=48sn* znQ8m(lDyq}&Lb1lX!^KGD-~Q#wMsL%rs|WE6>Vr@Y)mIqv8-IpA{=Q}sueaBS*bQ^ zlQRFG%>S1(|KCn}hIY}j(6>KN_d@Ug8G4!SqgU}fJB2TT@6iMFCjAP1pE7~Ln`|zp zRsT@;<6DNK!K+f+!)2M^i-wmi`d=Sq>OV9zP$~sirttp&2U!XNf`A|(2z+!A@RZ9P z0NDP&6TK|?#n~eN%>OH6%>Rqz`$Z}-|98Rv9quj1gqpd(-48;-|Aqex|L?w2x;Z>= zC%InsUx8$&7yd8&zqjq6llwD+7ycjJVWR(!kXYIJQtSVP|FiBQ(n<8z(N}Xs+-)I} z7{InTK|l}?1Ox#=U^xUp{lWiTrTKr*R?b7`wEiE|Uv~iz{?G5%=nb15@5Wm6|LtA? zqW|Z914*uv!3SGOa>D;b|KIAza9(`^g#Ujxl@$s9PkPq$pC5D)|e0YTt`5%5gc1poKg z{(nUOWBPyL{~^M{|Aqex|CjOq?XmAN{y(&zApAe}7LGW*@PB1$Rwg25*#8Uc947U-Z$f9+?UUq0 z|1bJ~(f^D7KY0DJu0QUC|C>-)Gocs${}zS}o(fD3$1jnN_)epn?e}gA|L=fIHUt4d zKoAfFE&>9cqZ}8y|E$*kht_g+|NqGPzx4lSnE9<7xwLqcAFVIP`2QsSkEt6&C;VUR z|8tv9ul4^%bdh$f#s0t8|2OQm^?x(N%G>VH?gOFcF%bQK>>d*SFZ};?%<{v=k%j-q zZVZVE0)l`bAPB4}1UwM`VEn(zO8@^WZ~nhT{txwk&;TI(U--Z9f0_TUo573y|L7$w z_WvRzR<;)Ve`5b{Wmk@r5(ESRK|l~#O$4C!cN{Ea{6E*i<>ddjgzl!BN-ld>hj0}n zAc@mCgMa9j5xQ1OjV1hlfp~5KUhc*6tUB4T6#g&#U--Z9|Fn0k@c%Sq`b)p`{QnH? zqIYSAen|Jy-_vL4pXfe1M-9rT`^i%ekgtA))~ig|;+@NxJb#g8*%l9DjHWcUZ99`; z8GfAxZu_?B>FL{VzinzNN^x0f4~GekX%t}-!fWXE_XffV%yK+~Fpd8FM-gU__aM?A zLwEt<6@+&XiqQRw{vY6o69fbSK|l~#(+GHYEqY$YRpJ=-0K)%;{|o;Y{-5>|7XF`xOn>Q@p8r1s{{Jla_VeKXFM|KS4F3Nr`2Q)opT0*A z(3|ut^nE&i{$Fpo(X#LRLqh|lQt+RJ|Myq-A|(h20)l`baOEPv`hV{K&w+k^?q~m< ze$L@Twgg~f!A~K-;j6>4Ah7Y@z$rpAdFTx61P$lf znUuw@f-MVU=xl8;7{?+HQbA4zaVN}i&{pq;Ia$ghp3^xwtX+5q$H`*Jan9j#K~7em zI>!r0ad32}mBYv5GI^bDLNW)b;IDE{9{Dh1jD2Sy6`ZZ9_Z<8S(nr;Cr4(BM;O}qJ z@s_FMb5RS6>o#J8u^XKm(GH1_(Jp~q=^Y#9P<}IP` z5n3YQC6o?4ALS)|+$iNGedL#nv#QhY!FesQOX3eSUkg-H#k%eD?J@S?=zncE<~H*Q zc;>?op|8LZ_>=H_2Ad%h*!o+fMH*FsmB1}JZ;KjLmMW?oQm=uZG4D5j!?@4L8so+g z%I$>beRRuR>@+^VZu^8uAUtRF`Xsrew8h1v2j=JZ&&}>8s!ccM_U&uVYB|@h?`S0C z&L!toYTaeSqxq#O(bROkcJ2D%!R2Dn87?j!er92Qer^tDRiCO)*5IPN)>`iwTl&sW zreT@3m9a2>UEh0AI_^coYTtue-hgy)2dqNb_PMmrv>oHS91oE2ob`VV&hfm{I*-$V zNhek?%}$140ly6U?sC1`!C6tI=~JOuDENNCFEl}@3Wa8+Qt`*I>5t)dEfi`MB#*2c z(N61Ow^fpa+`cB@q~4zq1gT(E>q;<=8Ek9_g+5Bq?D*aRhpza z?VxGe4c@FFJ9 z#4BSJ{CE+hT@3!udy?`0ZHy%*2nYg#fFQ885b%`C9RS$=e<%M(|2a+m`{e&6aI?S@ z*37qE@bpgSBaN9eJ_qpi=jncS{OM5AaT|H2jx)cubqj%~_rqHR8Qy0`^KiDW!*S;A z%+@*1%@OSQ7`Y&dnB7X}cp%Run7c>L!gk~=ecWKnUAykuw(U;tg6R9Mo5MG^jm{QBgM+yo2JaK)-2CuRHphQOsjNFZ zJgoPwKWze*gB_bx7#hY$HJs-EcZ|6fPATI5uVszw_RRLoy#1W@q51n@s(bZ`1&sGM z!0wqD|8@LN=!5Wr`DPJ3nR)CNb!)+siE^z1u?TbQemw7+J@fDX6X)_{v^K zAAF=G^MB_4n+@I@w_b4j#Y;NAQvUx4+6b-z`+tu<02+&Q2J6*IJB9xi_=EWB<(7b0 zvr!DG7l8a{tWF=xUNX9P>LB=kb8dE5$p7c&TKs={S3kM?blFN}diUJyY*cn~8vE1E zby0m&)034dwp0cM?CjheotkISJf9?QaVicY5e_ipy|Cvwsdk^%({aHr%fB)?X!vBT;3;!4X-|sW{ z^2iDQPaglz=!^dU@?3**6hS}`5CjB)^GATK{|EN}UDeh9KQNwyHh_Nm|3}(?*3gRn zpA}--iT;1degMM%h5x7b1n790iT*$6t-!q$ME@`P|Bjnu^)`h63;$oet51$B2nYg# zfFQ6^1U%CLj}hF!w{2c$@qU6|Id~H`h8OLGs1sq>i{zT|NQI@bdIUl^(5o}m$+Po|1SZ~ zDrBt{{y)TSa1e`pKCqLUhYMmZ3<}Bk|5dm+If5V{2nYg#z{N%YYJbPUB4zx)=>J2&FUt7;ORE1D z{!e;-JemJb=KquV|30exf4!c!?|swmn*Xn;XYs3G?mw4`nE!7G^Z!j@PQLZw{C_(z z{~ymJ&vVI7BFESJdCuZ_9Kig4Ec-B|4=geNA0OwV;x0Y^pVakGM@>v)cEtu}UVIohKZ>{h|N2x&ME)GDbXK zH-}OQCjNQ;Z5wmc>yI#=+t?KSzv%zlSE|_m6Z?O2v$M1Mig5kO>0RNq;ksi)Q`3`` zbgTdE-1hZ^nArap`~SEMWc+`}U9svLm!AJ~tIZ^FJIyrOSQ=0_4#Lz%&e{c!8A_(0|LcO|w}UgSup0 z2`||q`6UnhKTqWFNHewpkU?NO0L!|z1${+rlVk>V5RR6ImHjM2uw_A$V~1AvZSo)$ z^WN^qI9vvPY9@?}qYwsF%FznZ|t&E+4QHO73ikW%ax1Y1# zH}5yMnNJ!o8DFuUv;Nld?Ok@$p0}St@a?qRzCCWWvZZKa$ zxjn{a;|26BzY1f^zhZqGdkOZtNT+nkEozH;MEyXQ2 zYR_qPd{6S;7H}4)aCVEdS6AaM9H#*-(;RZ=k;`&z-=tyeq5HT^?4d2gv2?lavb^1I zSzqfcE6`ik;92LGi~(!^ud?nAEdX#!O#k-(=35SzTj;cAO)pxR^HE--(QmFk`6^Xv zlhqo#$y&9#L~OEJZDX~sG1qA9o~}<$RwC!Oa|2wem3rNFY$ub=WSyLo%jRuZE|?ZV#=?0do%4mHwQP>WB1!+3 zv+-Di*GJ2k@UbGTC|faUowXgDGr3KNjHY2Yj^SdBUS(KXhGRJvo>q9=^G+RXI^k=8 zpSj|$bObIn|8Iid?+3p>NUuWc|2;gDzmIpokMP|7DW1DI^(LOlXJ|royc==Bbvo1H zw_z3!h3l@{eC_6Iuf6WN>)Oa~`Gp&9xc>UmT)@_g)fMueSE&5?p=KqA07NK z#G$kk{vQG%D?vaI5CjB)B@ytH%N+pN{{IE>|1vZ)=p=w%mxP{}Xexj&cOAKeo|#3> zycKde&dl3@bOD^6*}92!0TKaoC&ai#AglQ{_rT8}&Tm$J-vwMeID|r8`$el_OkBm% zgXW5$MDT`=;_>DSyu4eEyEa6w-Fne}+eUfG>wxm7@&8@BcI?=3*Im=o(}jFC>)5cj zh!2!v(Q{p_Gns7GEf(=v!@V%@)m$nSbi09G;OpkR`TrB5>|*AMuAXPdyv`9CxE{`fy1aqk83|L%G{AFkgIukYSJZ}%RfuG<|} z#{b#+|9SBL{UF-)`edy>H`{DBXJ;FYIuS_s^p4$)>G=!D#UHDn(PD}kHSqYlc1y?F z*fg8_X2Jibrs`AE^=eg@ZRc`K@48`St(=v!UG|xLChz2(f?*rXV;$2$Zr0AhyCKgt z$x^mLJ|sAIRmujWn!uaL`>`(cma_NypvB# zixugK66y8=ea_Tqj#0B&nH=9xt&cV9;~Prrn{&0=c%xpw`s!+pucF!7c%?Re^+sG- zsI&3TD(rKsNsrU}<{6t?>DbNUehIc`b-Ud(^u)W6+JJ`mS#ZWCnB)8AX{Qd>*aVYo zf<-pL9=SD<)92|$T$Zya)5JUFI5f(q5IdyX40+9A0qIX6J#tNY4C#+SW&$mVtdV{S z+fUI8=2JL_r*UM~Nk30MT2PN=j%7|er#l)uYS3JNRNPwO|4uG!0m!4zBLC2@5${co zB4%f7-5#FH!CEft<+5wnz>Yid68_YuZoTD`L7MRYHZ~Fy1Ox#=KoIz7A^_?S{_iT` z|55#Z)c8Mtg|hzt3F!Y{O5y*V9RB?He`njlrPu#2$N%>jQ4fG4TIc`q*8g*F4dMU7 z|GUY164y^k>n<1H4q7dOHVfhZ!vE1fj=R=yW4y^d3DK{Gx6o40R|-2c7@eo1K5D)|efu#^&>;HlMf9@8$^8Wv#|L;Y4t?B;@sr%!TKdx$gJqZ7o z{{P)?OxYF$1OY)n5LlZCc&2ND|9fozU-&=Q(ML`HAC3Qi!n}O^zq7CZ#U1~@oc=%3 z{`2}m`F}qg{(Ra5lAZzm9%E(w|3&{V{r{6xu1UK7q_m{6QJU!grT@S5|CjOqNpCet z69fbSK|l~#+X%4zzl^7N{J$sspX=(%;{U!sI5a%GZfIzzym2Du?DVr3j%#7GV~_nm z9{-=#|9^S?|D_rK-?r8_g#HEn+5fwo{J;C&Js+;$53lduKX3OQL&pF2H~!z&UpdOga1waWJB|82v;=>PDnVWkiD3^O?g zd9Tep{^|9_kR z+m%|$y?Z1F{tx<}(FTv>_Wzd}|Gzx{XY2p{+yCoV|G(Dxe?J_)m#?Rf3Fy5>F17uC z(f^D7zni!7c9O0?DJ`jNlopLzV4H=)|Aqex{}=wB^oEl(K|l}?1O$P#hkys-AB_K3 zS<(M<{d^qt{}-W=k(7k`&?mdR+|NGPbua*t}3psAUr6VSN zh1vg?@&97~ACm>+p(W%0fr8Bcm-If9G(kWR5CjB)wTJ-J{*HsilH>nH|BtF$oAdv* z_5aKF|GyCX|LOYw&b|ZZXa9e#^Z$N0d@o-Y{eSP=fw+Oh{vXJ`*#EoG`TxEi&iB{U zuhUt~=@-oZw-0mgHEEi5V=ljan3eAU=KuR1QVxgn|M8rE^9Ve5=*tLPj_3b-74!e? zLz(@U|L_FXJk70}%Z`L;lg#|6e}-FZ%yeU=?wn+$NB8 zi}$uCi2h&n|DmmdjH$=%W8{9$hD`ui1<1fJlNR;YkFS&Z`X{Bu%XG(E-t#ZzDNrK|l}?1TH%QZ2wQ85g?B~0G4T)re$Ga7`A1@j9kVtZQE{E z#(b)-E0XUQsZ_%Fe>YF$zy<)tZ2&BL?rjaaim_}1Mg+JEAv+U0G{Y^6T$mOJ%Gl&V zD#*zo?u0oG6(AMlWGRn$PUqyXcHtcyCyOP=Ifu&yIazJGfa3+EI5@V`%3+fRTqdv6 zO-SY-#ikBSos-9s`vX`=bHlUcoE%aE$47+(ray)QqKJi2)rz_;*JwoLh#H+69T}|x zF7FJxg&P?ukCe;hb?eso)rxD+3_7NAve{fV=eqg)6DIrn%?n*}>LH-sT z?-ahblU#5vQLh3nbxN1ni?iR0a_sqEHBp{DpI5N&Ezsn#-_=Uz9L^7Xu%{zHrABQ( z4SgdYA(9IA#%Gu;mvqkkmW|FiS~DU^?tSxbQLo=d{jh(+ znO}(V8jV(F?V*-S%B{3qwNKYRKlCODU27+mc5XY(DX`BLvKZ6^U(6PBMLVC#XLLGx zIeAXeL8_UB&spqU+y;4;S*@~0*1);2w_Kc!K9{6(zL2zT-p<=e{}(rT=(%Mf@JVHp z&Y5PLW7KR`CM%n(Q)A7kO0~4UIX5|3nVp`hRwt`OlaqTUD^>ies7zE}tP0zexonJE z$IjTSw?C|9XK{b>_8~e7?fx^iNyiFm%($ z!AW0)Ui!3i+WEl!z&+ue@Zx`Lj^2xJUeWP$m@}9s{<~E3|Bb5c>Kb*g+KT7*cJ&Zq zkEjRK*Y(ru(^O!0UeoVHz*?qX;v|dl2c5A-sU_3PQa9Kkwr$q@Cgq zfhF8d44+ueV{k?49=?i?4j;LZgz*1Vs3b!W5CjAPK_G^Jr(Es;!1n(g>jL<{*#C=x z8b({BKau}WP2GCyt)Kkl%{Sj%E@!h&CgZyJGAWn+T+VR{db3ZaUD; zTEolyRH{Ud_}>p2LEp}{Ti75`EmUuUZ3>e`aMR( z`=j-x;Qt4jyLazyHXnW%1Z`|=tX>bO8pv9uUa#xi`FYTLox5w-{QSKBNA)_=!m`bJ zJ*jN?&(VYx=3;+g*{+yAZj`1)noXQjy-6rh@6B!R88-i!|F_sb^MB^A!E6AU@uCGF ztJ4BrYk_au1-k$XD63SqlV5XdM8*rw8SNH9tAuXJXv+ovgIhP!(lGx)O4)Xau-&7O zfp>63ZW}pwPPadVX+e8QyF^+nIOog9|6jbw{QpNJ{6D;hRW9 zk3q!yqqXq=j#~~b3#-N9FXXtLtomZ`f1Bq&JWu`~aed+cqW|x>tCrmm{xAH0*^5L3 z1OY)n5D)~`90F|pKd}FgHUQE8qke?{UwHrjB(9&-CLsEMij5{%x{pD``=hn+|Bi>L z@c&jnf%E78qW|ZyK+^xe3=U;m*0Kc@oHJF{$*r>eza*}o)FvSMf6@P6 zJpP}}XA8MP&dYhO=N1Fc{5b1o^SL~73PF0i&pm7fLY`Ast8DvR^qKP6=yCn&=bZFE zI@8k2wvXmuv;_a>0I_rD7z6YIh@~MVJePK%!Uf1a0& zhzkOOfFK|UtN{c-{T*0;c4Yj2R2jnmW&D3+k3VS+zkd08l3a9+#n=5FBjWwhTKIn) zMH2r1G2#E;59j}TMpyqVJ*&45(aSVXuhJYHrY0Rncoi1??obEmJv!}tH`kyC)I8aO2YR{|D4HXuaL49#PxXht!`S z<)k{IURMtKys>j#%d+vaGd5O;+S+9@8GPq(zqmXm*@esJ+hFgyXZ!Z;+qO+lPX}oQ ztVR(wA-sl~dIRA^hG+(1I!kmEVFq~*BKuzZ;{r{IjQ1S!;K|l}?1XhB8hc~0=Wn6`B0G8PQ2ZX}^FP#6&`2Q_n4v`OfAskVA z;!{YrZq}rBf~e#|*n@$~M!Y{-3;%CH$PwZH9~1unV#xmw>*}AyU3SJk?HmFRpBMdq z$1QO=HZDE?-wytNFZlmn@c)Mpdj$Od>)1Mitz+Q-e~8$h2>%Z&dmwi?YF&;Y2nYg# zfFN+CBf$3m6dD2Y7dZaE9~|2BN5xpSK^e4v2hOA{tOW&I7P(}@_6<9mJV*sO8N{71 z$3Z*08|Gvwk9bb!_ zWTZS&E|=G>Tjy6Ru01p8nD`dTuCo2VBwK$;Z31Hde{I?S|03L%zPSHO^9OLbH6ECK zp!v|RSG1d`l$6f>(wFwnetftgWO7`sJ_H*|Ni~|t1dhH%d^dgKOg0mR5frV zH;P@eDNL$f6Gf`Av`y9arQZzPzUDmducTc&x4q}WpywCYm983?7@QcI7@qJaMkWd+ zZ?HIA8W~tOI5xCCO!K^AaiBCbFfzDqXl!`BKMuLoDw}jJN#}e4X`MC(f~}|Fdit=ep}QU%UC*Yp=WRx;FA#e&L22uD|~J>o#u=(nSB?#zta-fFK|U2m&8X z1U%((2LQJJFZ2KDD!!ui|7(Q*Cvp9xHUY8!FZTb_?EjC^7*QRb66gP`>v;m(4`mPl zC(rZXX$yW@7k;^H_+7|xJNfmcvHwRfyUrn41~ER8ozE25JKj?E|Nj5>zAnU$<4n7% z|GUqhG;=i4v7}>3$Ck!kO&}++#!`-zQ7nX!%$LE|fEa?b7tO8=u~;0~9gJjx5Ecku zjBj)ihamW*kHnbR7sl8iOprquf|m$m;*TJfO)iW`Aml<`_M30n+2^h5I^E|?&&(Ok z|M;yw-Cg}wRd=1If1i4*-ZzCQ8lrsTu_U$#xa$joz**4^BnwweE5h1~!%_cs3j%PgoHI=)`?|IGjOWyJme zH}vhqm1hJP0Y+fe5FqRS+WtS<0C@aAaA*F%bpD^m_4C>USpU!Zf7bt}teW-z3%&Tr zZXb>JpMae|3OxRQA;eZTo%ui8|6AEBjQ7q6FanGKBd`((lxsB^5Cw&> zfRv(^r+hmoqJ+x5R%O$=sG3r3&<}sUI_Le5PFeT=&FlZ~!&(CUXN}m*3?Tz602vu1 zN|t@kbkzZ}jV*S7Nzcw2ynK1jfjnP-d1Z~?KeOKK{{MLV|HF;{pP5y(_%m?L^m^4mmuubx5NPjP5ak)MApKJi|`2V%B|3?P? z6Z?NK_-8q`i@}V__@B{gX#0QkX6&~AH_|$M`0&$DA3AhMKcCtDU*3C)WsCqLzz8q` zn+bsuh`%2HF9Y+YB+I$3KsyCxpNMg>z9(*WYxP!VNJx zHgbB1)8Pd6pndV_{gcUIs*2f4J@LtmoP7MHLGMRzlRrNbHZ=cd{XbeVs4au0DM8ag zc@W;BX_{2ie(M3g+Vw=-oAS`NJeitriW4fu@c%p>-YZ|v%V(~!?7G)um^zy^^Z!~C z&H+roNBvUl@UKP;cZ}@*6hwqiI=jAikSa#j(F%0iFYv%vV|4r*br%!;*t^fZbvH$nB zx{1cbyK4KY_*hJcPsBJh@Uggs`4hD5eMepvUy8f_uftJsT26>iUKhJDe*-OmA1V1Q z$c9z^_tB>O6LjS)5ZHO;I|GxuyXRx1>XiNM>M*mOy=tsNapRu1C;w|xgY3APa z|6zMy*(bq9jITWZKP~s6?e>s-MUKde@}zuSo|Zp>M4B&SpUBfuSBjhBftnS0*t_75GZ+Y|5x%NiEaQ6+y4i2%>S3p z|9SlXK`;a}>0Stv@{E;tXXdpNn3CCX2Zr~XHS>Sw|LchVM=`o`#g^s!R)jTLm9caz z-|-#zVaG!i3rHQv^<9wdidkc?Z2%YL zFTwvmls?A1QHUaRTg1=xT&xg9|3w6R<=~2>ad8+GN1=coj3%6Tc4TDa=+RcIr6tV& z4KloD1Q-EEfDzcN2$24t`v21`{(I*C|3C5HH2;@PFHbCN%yFZRuKm@Dnk$tG`v0Tv zziayb+rWnA1w%@IWQJu^uYRKrq2B&>vgKeDfQx?p6kLo8@RAe{aX(4%FQUXyx zJX9$m))6Kj#|f~cIHgcIoubDPP`n5UeT(|-6gnQ2DJZ#({fEd!;|27Xg96g=J&S#N z$ffH}De0&KI;sj%N__p=Gc(vyar4Cvi(Bnbt5vJDTCE{O5_79nfx#9eqa|$#(P&gE zQ3UuAuq(A=%kCT4wYy$_6ru0HKHsV}D*+(WN41^*2)_~D^nUN%^zONX?&tPD*?(1l z2G$YlhZyVs8|x3&e_BuGo;_^~;OAD+F52HtCiS0sT-=5w0X@-CZmZ)O$!&Gy+vthk zIh{eh=G#3kJ&YWoP*=;mMarFZ>3*paNoXfpI6_HlkKqrWcfgk7MO+x za0fJddZOALlslv&%Q8f4AExJEPvM`f|78W%E~^jaj$_Kpx7;$SpW*&yo%jFWb7oI@ z`SN7b(>E?nOk5ZrI|aLhtOyUQj=t5$H854W0wkMHc? zx=_s2aC-WUx35o3jE|qHw}VM*uhpKhrS1%=MgTjWIh#Z5(>R`22tk#QerCO__XpGA{j;s2yr!(_%ogy$J zXQaSIAtYXM6f7G5Pmx3*5yi`rB#6+{9XTv4)Qc1M9X50#rJKF9B^6vW4Kaj~S;s_6 zoD!qroOnrG5OzgNN0mS^1m3(7linXIZ#zzO;bLI7y(A08-bFHr~?4m|L^4g)Ot?jzeoO0WB&C-3yX9zFU@t99f^ zwHies)MKt2Md*$Qu|7~CeBi@KN;lAhmm;G}v)w8N%+ScDcTR&IK_z&4Xp$A!9(b|yN&8#T#fBlh`&;N<>8=r#4x4=^P|0~cf?E@kD zQv6L>3Al&#TFFvtgqQKvODzDSv+yCo2SEOLSa!@#xfyeW(^Hqh|Ksto6AAwxA8+&j z)`?zH&#AKYdh68q*qA9h)WZH$h$5W6;nq;SLG6hP#5yWCIyN>wE~X}in?r+WIqOKH z4Yg<7q{Lud=~+G+XaYN=n+-Q3F_KJUx*TKQD!Cm#iU61Ysxkr&*s^DT51K@)X)VR7cClG%V76Ylz z&l!tsu$r>8rsHpxFoQ-T{1?0uZQMh+$rS$=wk3(mqv;B%MDq2ulQRAMYiYK$SN@OI zqH47tuR?m4COrX6EW{@PY5x(z8s3!y0|VQ)Z%@xaqp@$_-o1MtttXcx^ZyhZjxhp^ z03*N%Y)%9~{lWhuIg9^;_k;Vp%>VUyXZ}xoy4QQ47w%7anE&_Qp1}N{`9Jf2=KsAu zgI6aX^Z$JNe}q2k|5xW4cf~Szq$YaLRTB>|9j{4y^bef z{XgsfS^v-a|An5ttDDaJpZWjlUU7UhMt~7u1Q>zkK%nILkyny5{=YPv|HB9XS^${; zZv_6ot+6+-pW0dU&`^Q#{}_mAJ3RjXHpbsRy#2pkx%q13WB$+lpZP!Y|K)h=FW)}a z3;%~BKXT=VMWLV#>lP3a6T2`d#N+>$@0|0V7y(9r5nu#1J_03Q`Vn;h!7Tm1;{MwH z-~Ps4v7^7N=5o0V+jOu>=a4ZyZ3rLsf4KjDyU)M6D02J%gO|5094(LiKT8CaEnD!} z)8Aj%+b9K3?~GjL|BCao{lC-#V6V@qUM&30Zyk{B|1Hk$VEcKXBKpxmQL^CIZNm?# zvu*w5$#Tke9w)n%?3L~RDZ6}Z|F73)h0eEL_&?kK)8~Wj|1a+P<=l(_BftoJT@fgO z`0MfiGU(L*Yuo>h?e^sVkNJNO{D1k!|7ZBW(*HC6XZ!zb|DWyu&uTl!GXBmu-hA2v z0^9$GU4G{Oi~AB{{?GmY7k9;QZbpC+U<4R}^?(4>{=SdJ9OM64|DT+sWf}j!qWXX4 z{{r6s*#95<|6~7uv-=Koa{lZV9&j6o|L;_O`|jIrm;b-A^5R#A@4rZt;s37>{{M#I zlW%9@|L++5|B)wo@+Cinl&ad#dk*=P-(*mApuz8$hT2AJiXR09?#G z{(s$$|7ZPw$L+!VAKEC^|Fiy|_5a}i#LEZ39v{f}oEG?h4e>hI{UG=^`IRR*as5id z|4GjJ|BeUhf*UK(|Ebkx2DdztRUb38l z5nu!u0Y(4_ko`Z2Mt}nP0N9o#B`vTb&wtAOpKIH3y#{s3c6=sP%c5E-2@w^9@L>Z$ zkPQG2GuZ)HFr*grrEuE0E$ko}Ee|XE0cO4BK$GJpR`*>|LN1-+A?_zBz9=G>P6z z54m)0DTM&hfsP8b8qDw^*l<=waoRv1+nE`PODnNWgjKCpt=4L_h7d{2tyTrVCK)Yh zONd6JQi-C93bZHMuWfJJwzaR?zoWmuzwfcVfqSCghkG!`bv)ODQHP&+WpBc*y6-vn z?HBB$_BHFa^_ugZ^Cze3o^WG#!hIWa)twU4m=4NmaZ;X?59B0bHz5Cel)GZ@v2UZ? z8Ed~q-0~6UdFM6fr`U_$@3fdwB@fDj@)h~-sx0l{q8yQDAsdnJi+lJ^yCd%)eo;ww z$a~P+ye%dn)6>7>sAQ?{OnQ-MDAkg*KQX53C_~4)j(A?6eHovE4-lvQUswN(YIjym zBx~Y(lJ<5TwU|Qfro~xx8c*OjqtG&qBXt6)lrNoP(T_cJA2-Gx(mWKKJ70HM+U~V% zRp~72;4Oogh}-02aNmC3dBpi1&Js=JiQ)P5X3MKUMmEt7qwSzHYiiL>oMB>PCSaCD*1bo(9&;3_TZY2eap(9(i?MiY%+` zH}Smxt9lL4)8B%JLBa@=$)8=56_a+YU0r7p#i|zp-M)^MT$y;b!K(~O)KWc8Eho7e ztr-7_9)gyGAH+DWbM>k3W9kz=0IhgMatrlTSSH#DV?$wXBHM4$O~X z{w<#Ozr*|vUjNTwZsEm#1M_o8`vK&yV*UX0uQ2}`<}$ACPchTi!spnYq7Q+2!f{LD z3u68$>u;!gS3kx_2R#gNC>5ChCqVFu5nu!u0Y+e61WGcZ4gh5Te@Xm*0GgH>rbloz zvIRh2SsUiDSo( zefPVqR;ySD0^fzbMSP%?%cUs7+Vg@SDwpv|qncrSzfvixb_2D*_YJudhs*(UJt{GS+mZ~UK*cy>wrzx%W$~?)+p~|+RP7EA$NzOJK;CikWD^%aw42SL!RGiFDA?H8=x9?2knYy8Q=_e=q~d6G zG+GRc(LwO|rV8`N()z{mxiRqn;o;_RtJ!F%vS}*C)UHRJzzLnujcD=;UcoQ;Ma#83 z+p~S!M{3}Pm?EMUcwpGV!AJq5BL}6fNm)&Eh#wJa61GI0P-n1esqEQtG@7-zxob~lXFNVQxNEf8eDu-A zAYDacgS+a3yB^((D+}jrSLZ40aVr)V#eMspORaPi#&Eyr?J?DE*Mgq-1f-+T5Wfq~ z7=t<9x9|E*u*MinG6su`!5*nKk>nHNBV3kaC==tIatj*eDa5X-HbYv|d>!&PAvYlw zuR{JR^6W-SB59=G#P*x$dGjXf@D`3tI_dXC6)mVYy_?=$|87T9#vnA;n;=6bGb4-Z3F%Z0sM3h5a*_6%OahYvsX?Qdxr^ZyhZjxhp^ z03*N%Y)%9~{lWhu$^74(-_6GV=_{1<|5u>@zdZ;4@8s}{J7^ORjUQ_f9C&a1ww}r^pB%%Bh(mgQ%^$lYoRSP zw6*pBT`fopZ!-TUIOoRkCxAB@0U<4QeMqn`rkoA9U|DU?WK79Xw*8k5&eZA@b zi*xe-P7a^P|F3OG{Xg~jUkd;4KBu#F^KR>hb^1 zzW&QQ{(m9;ztR5Fda3-s7Y@IeHi5kRwbx@jT>pR8|8xKUJS}TpU;jK=URfj4y%t#i z&-#DX|NjaqdLI9u_kLp;BftnS0*t_VM1bu7c_m5X|4YpO=?rZw{$H(b?d$K~-q+VR zuy=RpAFl=&j_Y8w<1G7sH2#0C{{IW>|5s-Ge`>9-5B&>zv;Vi6{J;B-T@2Unh1YlQ zpSEWogUA2(HvZpLwrIU=QSEKCLs_ZQN zziasz{h!ntR{CJi&>enK{{E8aFT*@e7{PuX8Qddd zd}KV&;r{=#&+TgT|4;e9TOX`M-`f^~|AYQ}%HVO<{{MXA{}<-}Wc@$i{(qe#()RyZ|IhmWZr)DYdAj~QSzcKqGgb@O{vX@_z8BNBw^%htC`TKeztBv+ZDU_W##A|L?wM7sK^? zX*=lNKW)!G2J8QO)BmrP4gaMaS958@q;+5VrP%t#ICtyQ|6i*AU%3DOQtbcFt^d#C z|Gkd?U+?_C7Y;w0ue1Jtw(mgPKy3dH1e)#tE!F?u>xsX=SiMij;L}h0|2qfYd$DMV zQ}E??4qo{#!T;aCLh?r9|BrnBO<*S9p&w(Wa^(N-6Zro-hcXvnW&K@v@B0jClkn|# zNRm%Kny*9tCgdi>;tJ$fkmmsW|Ba*cTiAXJ{{P;>)-C0E@G6cmxBtJZW>*`2z4G?| zKEj##1YR7!z?u9b&c$Eg$#DkW6+<}%|BIjD9NZJ%l+NYfPuHI(%PVVStpDE){yz%-&;9?o|3CNt z&wHD(j1gc27y(9LeIh{i|0Eg#3g`pi*p6*G4i=W>Ixft}d5-P6Zd|WbMPqweRI6oC zsbKtnR1m_44FHj~0kGg7Of~2-!?G`Kz0*;V1MZIzfGA=~RJNm0JJf2`YOPjl2$96xYE=MilF^d3glIG> zl_;vHKs&>35w>j`*fuaQuzmaXYNH;x&u#T>=?6g=gi%x|T(N0-!QO-EXV!155A18! zXYLL6g4=Q<_ceHizmN1iHu3cbk}U9DgN?u!;3x2bB#r+A$nVHs%1I3IJu7cpy4?SD z{*UuWQu4MniPW_8U$Kun;Qd0Fc^Y-Uj;T|kWn@!8Tm8F+Bfo%pP^sBrN|+G}2a#hE znjfwG>&~g`VpB&QU;Ho54?XRJYy zPA%vg=?J~%>#i?t_gdD}*{lhXyl~(C6VB^TaeipJV$(U!%a9EQO`c5DvY@AI857T|vxs7H zRBqAp+Od+m6Hhpw9<9PrOZ7OloTP!(iY>>YXQ1Wa2eBow@KH3zB_7A=k)hzOJ6;=jBbbG1J@WL%j1s6`}~AE!qGsR*2&J1wq-vp*&Hcs6qi>FeaRM zc4TDa=+RcIr6u^l5j!wHhWWR6AN>yVJ9zy+hq;9p`wh&`A?*i{zl!+-%)i2%wf|51 z_#Cn+`Vg2W9JeICAm*Q}4h#f=?|D&#FOz|RY8d){QEd(kKxU%} z25AEWMQS=w!CvqDKacC1_5fO&HUVP&w=w-yO)uCF@Le|>M|?$Ln#M$2el_`j%Jc`p z^cTnV^LTyUf9v%ahWDHGO7QsXEu|&1O@jPE3H_tJD)G zCMG6SYO@JhQZ{Zj^U5aw9CR;9#r~4AT`_fBBU4%87!@#sksFsX0pZ*`zx-pk* z?y_l#q}`+FVe)ZAY8#oEQSA?jOt+V$CFY9hI*YNm2G(95s_$MEs-u*Yx|Na76 z@UCLMg_Pa$GM*fF{a=Tp=+8fazT?-0gVwrlpat+FCBFsPu*!cO9O?@^W6q*KIW6~F z*Rj5?`kWs`i{oVb$)x4dO!fwAN)U(%>NBo zj)`EMRh*{17t+@DOxBzzxcWT$|IN(*^SFLqn*i(o*O&gE`M>Eouv%>goveB}_`gg3 z59eq*NRQUZ{|(n?{?GhB=S4P;i1|P3|L3_pIEfKp1Q-EEV4WgB*8jErf3yLx{vT(F z`Tx@U|L1Z2yfy*W|BK9Mg8BOx7`?w)v;M#1kxG5d*GPxIl;ft1oMOwt|L5yFkRGj* z|Fiy|>;kg>zvGVTX@mJc^Z%YM6wbs5FanGKBe1RzDA|z>{$C>d|IGjC)G+^FI{(k( z`gv^vtp8{IKf3yNj0Bk7!=L;A&)wHwGy2Xk0gKoFGyiA)|8Sor%>SAHKirkWr5FK5 zfDvE>))E1-|L2t?jsGt(|EDvtq51#u{?L|zAFi?ezdWv=*CxRFf7bsmAO8;uK`|_b zrLYv0qOzWd9|uuT2n$FlYI&*!hpj;5C+S+1P3xj+O0`kr`sc25-v8*7&0RJ-AncV*Q;&*Ui0PMwY`=#$NzVr$>aaqege4vKimKB zxHndCgZV%6{}sHvc-M>oBftnS0xN_7sJ{>E&pwa;HvlvL=kfpAci$9jf|*ITBuvUP zRq%?HT*olH->jMcXHgW)|Gy^u|BJ-`-`nc+kBN5^|9>CD|KBI@ z|M!OS{TCyCU3>@r|GrH8|DA^azYxCvc6a&z3*|68_Qm3T*#G+q9{(=F|KAR@BEAU! ze>;$O2KzaQw!~kwov`VB^urVBpW*-ShImVSUz)kM{{LZnUme%*2HaSA{(oBTgICx? z@)bEEFUphhb$MF;1d^Nby!;T7J91KfDt+{MqYy=o?)TDtMlU?;PqESAdgU zghC+&`^2*&BO^zTwpuMMD`K?+^JAEQi!=2*%0Q0Xf z{~P8qJ|8~CO#Ap8+f&FpUpQ__TzB(N?Eh~*1UZcnU<4QeM&Mx(DB;amDtVDaHvot2 z{{uqi|4ZlpJpTV6n1h+pwu8JoG_Re&l+3mX7~XHz%>O&kWd8p(;r|~c{QnJg`p0mW z-E;5ySHZ(4#7*%33*hps|L?drR&ZnG`Tq#`|4H!wv*7>d5qkyv|8;ClV(TXO|1S~y zkokXdj<c(Qrdi~u9R2rvSh1_84FC(#H{SmOBqUI4M$nPi4#Tf#&8w+^-lU@b^* zIU*7+ObJnNMG3idiifzLr1)rOkCK!?6c7(pN{DrY$;WX5EGbSYR8FS^C?!<9h^3FX z-%g?9QJI30+sGN>IF#R3DFrMAYUV%|CAFoL^wmp8MGlxhLVy|qu_P+nQ4p3S)N0i# zte!W7NMdfaDukBNlD33sG%A%Ss;EFa!)_6_Z5!A&Ffg!v`}S(19=XqL^=*6$1#4{o zFVEIrUYh{h|6gDB|9^<^@((Y(JaK6h;q=()`20WBRoGpxNR|5X%NHhI)2T1UFI~{7 z^?F&pOyR@$%@M)nx)1`}c(&cze7KYa(7 zG`cTTz@Cd+OV#rB$|GBLZ{6LuyMK3e_qN@|N@;7kzp`!1_N}$Por$beDwnrZ`nGJ_ zy1lQ~zq7gv`PQmzUS0C)yaZXEUA4UbYq@%|y>!Ygn^R{I#bl_=qUW_^#rpK%`R3E3 zRXA#?9;cR*G_YE+f~(wj>rlipFT-ieu<&^*uuzEXDr+9q53j(Py4?RQrE5Q4^wx31sk8 z95-VDKY`7*cR(FWAIkXh_Y33)Pg(F&y6~VJDqH#8XK96562@ZsU%VSTML|Igm@9A^X=0Y-ok*o+8(`h)*RlKH*uuz zu>OC2>HpW0{eR~FUeaa}bhKG?a(&IivobeYJpVUbpZWi^IE(TBwA_#J|I=t&{3GUr z82>+MI;mls!trc^M8FQasU4fe@pQnU<4Qe zMqpJCAnX6y{y*9Pc>F&wXa2u*{-4M7^V$TKqW{mkJy`!Q#C`iu&hrlI|A{rT{-01_ z{r|7SQE>?N|Na8r?sVDz`->P>_5!YBB-a;;`7{5|d$#7wnE$i=zx*qMrHlY0zz8q` z>luNP9ogXjCAR->&Jy$grStzhuAkQ?!1{mI|2GlTy+;wmOb>t7|394mfA-h`=Ksw9 z&D(9c*UbN!|1bA7#rtCf7y(9r5m{ zKd()I_5VV!{r~0S|3M)rhQ+WHmZDNr))V!Q52BzD7LZcZ@^tKaP(%rpd#%c*bx}2? z+9;a^bJscVe{{;a%jWTaA2t!_KWoHhW(XNr0m#T8QL^kisI#_uOCeb1@&7#jpU3~R z|G(_hg5!(;BftnS0_zunk}v%Tw*LaQ|CgMk4bA_LRYS)jJI7H}fT!atu>W?&e!<>@ z>1Wn&tPkvK)@SYw_k!Dk*{;{nPn;~o?Xk7Zy#3Z0>zZ}jV*S7Nzc-b8+xE)W^YZ2G zFwfUtURmS!&#cM+AH~T>;ItZztVbww|9@ox5dGe{|G%&7Am;IZw*U8$xaa z{?Gb9ZA>LLO|Co4JZC@21iwW_G7>5P^Slq(=33|qSM_v|RCj9?2?Ei(Z{kOZz z{$D7ERsQ$Uru-G|sf)1xzXPp^FT(!+4&?|G$y0K&~qzzz8q`jKISnQ1amZujEA%-2hnsPY5#q zUpoKi@&5|M9ppiLrJk|!?$Erx{-z}L?Kfo&?>B4i|6fZC2Pjn0sn=Kj@)Y}L z{eQ-H;HvQdC`MPV*s^@zim*njGM0|zJH7)y?0BeR0jUGIz6-K_vGVQF>e&22;CO(b3GR;MA3f{0be<|B57P4 oM#WJmpa-J~C!QS{8992i)oN)8^M8X3uNeVGfDvE>HY)=E16Twe-~a#s literal 0 HcmV?d00001 diff --git a/system/item-tables/ItemRT-bb.rel b/system/item-tables/ItemRT-bb-v4.rel similarity index 100% rename from system/item-tables/ItemRT-bb.rel rename to system/item-tables/ItemRT-bb-v4.rel diff --git a/system/item-tables/ItemRT-dc-11-2000.afs b/system/item-tables/ItemRT-dc-11-2000.afs new file mode 100644 index 0000000000000000000000000000000000000000..adcdf19f776770b9e181ad74f8058a1c2590952f GIT binary patch literal 585728 zcmeI)A#W5>6b8_l?e6UCwxu`9d#JL3j2VyOaKGN< z$oVSgVb0e%-{gFo^C;)LobPjf$a$ReW6n=GKj-|C^J~s;Ilt#T$@wGa?`QUf009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlya9LnJjO+Cf zU*^kIe0TcitMB?n-)%)^kws)486wNb7+FQu^S;}T>_m3EzPl0GyZlEs`u-r^^)oW| z_3ek!HS009C7Qb7OvC=eh( zfB=E%3F!an?c5U+AV7cs0sZeYK!5-N0tBWfp#P`0b5Bfw009C7^uNyl0RjXF5SX5T z{-55?Juv|S1PBn&|2_i*2oNAZV0r@je|kIj!~_TsAkcz9+|9S#{5gidUgIzh7k2>0 z{eMH;{}-7>7Lj>mh%6&xWEEM*9e~@Boycw<_y0xqBDdoHz5U4T$eqaDYyC6b|934e zzf6Dt0Rj^f(EoMe$L{~FC{73vAV8og0sUXsssF2q69NPX5NJz4|JQx$|7zld009C7 z+7i(Jb)Wjbnm8dqfB=EE1oVI1r~a=dP6!YnK%gxF{a^Q~|Eq};0t5&UXiGr<*L~{$ zYT|?d0RjZt643v3pZdR=I3YlQ0D-my^ncx_{;wuZ2oNAZpe=#_+5h8uy}r2p@ANe8 z|69iWf00FG9vLFb$QW5g)^Y#ec4Q~AJBz#jB70}q>brYg-yKBmZv^iCzm3?ui2wlt z1STS&|Ldat|G%0zAwYltfwlznf8D44uO?0i5FkLHEdl*s_o@G@i4y_@2oPvXK>yc$ z>i=ruga82o1lkhN|8<}GznVB9K!5;&wgmKl-KYMqCQb+tAV8ok0sUY1ssF2q69NPX m5NJz4|JQx$|7zld009C7+7i(Jb)Wjbnm8dqfB=Di3;Y6j;uzHc literal 0 HcmV?d00001 diff --git a/system/item-tables/ItemRT-dc-nte.afs b/system/item-tables/ItemRT-dc-nte.afs new file mode 100644 index 0000000000000000000000000000000000000000..1e76474d25c85908f6d772e66fbe459c9fd552d2 GIT binary patch literal 585728 zcmeI)J&RpM00!Xq+`VVc-Me2RLZV_!84!$imf8f%K$;YSmR1t6u@M9dEiElAQ(9VD zrnI!&GXFy7Ze}6z13c$gIPjd^x$pfNcFr>kZ#N&@dyrc>T)W&J4$<;eA4pQmcO;U zZ27e1)jfM4K!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0Rja6dx76)UG?v8%Wl6f^V;PG21a^%rs^<=6KA0o0Dx$w>eAB zlZ$pUZ`b^&j>GGZ>-emWuj=@x>#Yp+XLI%Vci*|JZv5Yg>HZV0RjXF%ofo9v&l>#K!5-N0^JMf|L(WY4GaVAV7csf$jzVegCI^HQAIuUAwX?FP;JT>{W)6qf)=0vD8C@Qc9+h zUCD9De$2_3(=lg5&WBtKxslvVUQJ$0UVnyqeJzo-Z&po!009C7)(GhTHG1X}AV7csfj$NFf1mqi)dUC- zAV6S^fc{^jXD$H(1PBo5Q$YXsxo=iYfB*pk1l9=X|22B%5+Fc;0D(RQ^naiGX4M1; z5FkKcje!1Nqh~Gw0t5&U=u=>2|L^wu{a;W2%P{3=$~a{^rA(Qo?4}$~*_WJ@oR*wz za=yt${XNPX$*ttgYrpGr|6Zzo>e^yU`009C7mI&zoC2Hmn zAV7csfxZRwf8YCO^#lkIAV6S=fc{^iW)1-Y1PBo5TR{K!y?<6ufB*pk1eOTs|0QbX N5FkK+0D=FTz#m%GT>Ah3 literal 0 HcmV?d00001 diff --git a/system/item-tables/ItemRT-dc-v1.afs b/system/item-tables/ItemRT-dc-v1.afs new file mode 100644 index 0000000000000000000000000000000000000000..748ded74014dadf0694f0cdbc90546c17bb7845e GIT binary patch literal 585728 zcmeI*PmG-9eFyO8dEfc7_U<|x0>u2Wv9V1!R%&Uv1mPU29wYTqZat(@RjE?Msh6Of zDmXQYA|)UWDXzUyq*kUbsRcrd<;IXeNh>bREyt=-RppST4Jz*MdFOp+-3QfFSp05?eVSl_)dHL zr}p?S?eS;r@n73x^P2sG009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBmVR^at|Gkp}7{@2ZV*uOcw{y}}Tx&HH9pM0&}tfv2>z4D*A{_W>- zb$@sNm6Yqaecv1P_V~42-}ALxZN8ZE@t@S&^ z+gEb^rRJE9R9{PFSME;;X| z%{XqQi)ol{q$B0N>e}41mY=+uuaogK@5SZc=AQ1ERHZz3U;pOU<6qWsNB2En>8|v@ z$#nt*2oNA}8v>F4Ir4udS#H)x7CzHl{vY_BgZY27%m0nY|NGngf8ZARKfIhq%?FUk z{}bhhTuI{<<^PSj{NIcG-;@6b{*vw>K!5;&PrE?me--&ZQ~NGi|Id78C{73Sf7Ipw zsF(i_-Xi};z5M@DdEP6jT2cPb*Z=ar`1&G1fB=E@6Ik5;zh(V@V!8hRH2)X%|EG%# zbN&CS*Z*(p|G^6K|HfSZ|6=t2<^TG<`a|aOzwYIK zTmNsYApbAV<$qcKm;W<=U^fU5AV6Sk1Qz%IZ(0AB`M*W||KB`h{%@xL|9;H>{ZTqM zHSY5NC+S!_|97;R4cuS<-&#Tbm-)Yoz4iYa@_+glaD@N?0tD7gU~&I{TAI&r%+>!h zGXv!tWBq?F{}1&4Pxt2kN8OWm`TzbT|6~4dZvH>#t-CY-um11;295*>5FoH#0*m|q zOV$4epbqB$%=~|M{$Dr$e^~y<{NH^2KUz`!-_8GBY|sCb{|Ekv?jS&b0D-j-Sls_# zs{UW1|39t&XZrtT{{K?iIxPQV{%?BzU%URFN2{&>Z^-|(cz1h|1PBlyaG1d2{{K?- z{}TQG>Ha?@|GWCX+5hKb@;~PP=Ij6AitGPw|DPLi{{Kbi{~z||a6bV81PFX;1!9lB z;mx@8U*NBD^=P^MgV>kv#WsuoB3JkPeXPqrpYuZ>=K7J#x%&L~)8^pSG-~eqX0E>& z{r@k%9Q*xs&vhvs8GaCJ`tQ}-`So1?R;=@%zL4{oe~$Y9<=*_?rCgmYk9jWLm)=Y} z^@Vh#+5hjw_&KHSkK3bfrS1G5sT%(>=Tqf-`(KySV`<#(|2JB&``^u**W1Y*u{#ARaitFRJ4B}D`-a7DErvLnRdfonicPi-d1PBlyuxf$G|54=sv=?8V|HH`t zD>+YdynF`e=l`$v^M4fiKPsOIBLAO`{C_&~f4cwgr8HhP|C^Hmo=cxg@5cVW7t*-- zefINzJpNWXwxaxxHUIbwP}Q*)p!{F;+sX40AV7e?{}X}3^1uB0ZT;W$2HN}|J|Fe@ zf%-r0TU`HFqYq+F|6AAp`SJ4e+WLQZA?o~cdq4lH;p*!DlK(f<{{`3=0RjXFtgS%g z|2XRZCT}~01@-@^&Htv>@8y5g|C__Z>;FO2{|EB_?BV_Yrv4vYNQ1fjAFQzdU-G}} z|Hqzy`v2XZ-H`wR0tD7bU{U_ht^fDy|54QcgI@lZ_5acn7%Z;;H(~FW_CJivg8Dz7jQPJ|lmCaV z|8EU?_5bg*^M7sqf2R8t(xu$>|C{d{A^Z(~2{r`Uc&&>Z1 z;(Jb)zrr;CbAEWW^M76czs&z%H2=R|Z+Wkl009C7Lf}^Qe?clefa&~y+8G|m|G2N$ z|L@KJ*ZukbuKr(?|NZ&@nE$Ky*Z%K88QSZ{B{`Tx`WFXscioci^D*Z*(U z|6~4dvLC^;{!g2CY5vdo|7-V#_ksx!AV8oIi2VO#=l`djYA*lBG5=RBuK$P2*8lDP zKh64o%>NDd>;Go|pWzDY|Jd_yI{z>K{bxXc009E)DX^PPrJL!q>2f=RcP-}!ei{4m z{WvoH*<9WGUgYmf^;WtP_g#&B_+nq66F<%MsknXW2T|9*SN8XdJ%HZH`Q%5jf8VSXVXjRSoQC*FTgKi|Gz(t=bAn^uDl<8hEX*f4;JqI zSMGc#zW>d5#=Uq2*WXB zJ|+LZT5r{n|2gvhv8%B!Uz`8u$a?bNT;N`3$g|#*zQ`&FBBwlK(IE z_WzCif4JoTGwI|s|4ZIa^8dcb|3_1Nei+_a{$GpT2(QO0csqWp$p8A2Tixy>37m(xxzms0=7W7_)v^or{LYw_D(kKgF+=psb^5AK%e z!RM9#2Tj~VfB*pk|F;6WF;_p=|8Md?>i;(XoBn^P|D*puDD{8I|0nk1Jiq<^e;$_l z|7Mf*d0cw`ad~Pt_VMf0|HFR&f3E&NIjR32nb!Yr#Q)Q0QvZK8m-_$C`~TO{Ao70@ z`9CQ6-|TAi>#>*rzaD2lg#ZBp1eO=*<$u@zf3U6phjZ)y(f{8V{cW7nANl`eoBvJ! zKX%h=^1rPAKO6ObWdEu18DKYUH0%FyUs?a}>i;u;U2hNKzUeR7t^Yq$Z^zH<*8jWw zzqhUbPp3QW|8GS8Z$$oYl>BebYMA~CclC<=zpK2SoB#m=1a3p1D8onLBRph_HohP`v*n-*U|q!6Z8M)O8p<76Q+bw|Cj#%@iPDS!hHRo^P`jb|2xkAoR43RSNC?# z4@Ul*|C{=|LVy4P0_!KRn?5tY{@?Wf7q9=C^M57(oAdul{x4epUp)VJth)93|8n(z9sU10`v0~0zx8{gd&L9@5Fjuk(98d> z|KH93H|PKL&i{|~|IL#Brz8K*xA`CI|J$is|1a}@?fQQ?|3BvcViqv^|LyvJH~)8b z!TNtQ|G#+s|I8BW|I6h6_1Nj?hw*oS4G78YWmSl zvHkiI`^aH`X^DN+VZWiozRzKQS&97|hyBJ9`+kT0Eppzl$CAW&T~_urKrPQipw+f0sGz%ly0CVPEFo6%P9{{|-6q z%ly02VPEFoRg>-iwamZ64*N3yu6Ed$`S)CheVKpPIPA;(yVhY}=HK%i_GSJ(-(g?o z-wPb}W&XX;VPEFoizeG|D`NSc znajS!!5dxnB@VvaWnbdpD;)M^1iZ;*U*g{@UG^pZy~<@@;@=Or>`VOnL6?1rf3J4g zm-u(H%f7_FA9C53`1cx@eTjd!IPA*^_*$2JiGQzi*_ZhDdY65Pe{XQvm-zQamwkzU zKkTwE@$W}m_9gzk$z@;S-+yq~m-zQTIqb^__@gfS694{ZmwkzUZ+6+2`1fNj`x5_t z++|#R268~;@*_ZhDf4S^S{Cls`VN6pUb|)zh89Om-zSJT=pgY{gTVR#J~T?WnbdoFT3nZ{QDJ`eTjc} z=IztCGT(^+5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1l~Uc#w7|* z`Y0R6Yg}rwo$^X6O51tJXAOb{SrXoQ8?=8=g|9i_H zJR2fF1c<;)MS%R@Tb?EV_m)3+Hbj635P_MBz(Mr&JBgA1eeW6%&#e}D-gt{1PkQTp z*LZV(CMMct%;NWqzx;sl7CeKVf6q$AZu_3`ul_T}ljs|m?rT4K0Uk&HzhnM@dC~Zn zy=c6lea5W%wLjoLDXUX6*>AjIUAbT8%gZw8?~}er*B{4mcFGxo^~xR@Fn<&;ddHX* z`dR*UK=7FA8S<(`VKfK-+#LX4@kEYbpvz)#Bp&Ft7+~3sCNFjc5cdD;3as2I5g-CY zVCoS7|5w2OmHd(41OFd1CgX9v2gvjPyAA%Yfd4CcPXPYE2K;{w`2Xy5U;EKpxJ~}I zHv{*}S@Nn32Kywk=hNW-DB2@+^8d*O|3~0_JG3h^mhB+_r&8`2v%5gjk;MDrxtkvTs`aj$Uov-T+{`W%ae~kz<_}>HP z+X4P>+zTjbU42picNJdloCpvBA~1Cbfd3=tf6KS&Q62iflJLLP`Z@lG{_hW4>;C}y ze-i%>w~qf?{a@K9L4p4R#{X?Xpuzu*m_MGpi>Y5oj9$m;V22Qva9F|38ZQ{{y&JXw?6^ z`5(3XS=}IbeQ|;RSEBxZbsYcC^M6zQe*l{y{Q+72-;q2iyXg41c(3;=rIINrT_JGH3pE?|I1()$NzKuk8Qd5f3E)D&)5H_`rpO> zN&MgHf7Ji^jr>364PqVnf7bu!`M*)~KNi;kYCWLM)O7U%BmZ|5UhbR-5CI}EbqKih zzsCRd3=;isWAR!2pA1%V{2$N%!?xV~zlQ!t?Vry7d(9uHV*Y=||2iMwNy+Q~H2!b% z|ET|q`w?XNU;1ZJ{htl=xA-sB|5JB;6plpxF95<-B0vO)z;s0b{NLI9e;M=&{2!tI z&vWbluwDJ1^#8H?AN7A>L;u_UKOyzMy(38Ze=LsuYYqVM|3)of*RMkIf7c=A0f+z* zAOcf^z*BzRd%>^!2a+1RBgQOx2mSb70jKXU-n?Vr-@SfK4r1G3^x;Eaprt2_zXIzk zo`r%Xb&g?lgdF+5Be-Zx1c(3;=v@SI{C}>VrSkt@!1d3fr;qag zy?)IH{~PfAxrfo0FX8_!SYHnQ2cy*GQNI=x_HnN8tYm z{IA`XBl3R_{dMtFhyW2F0=VL%l1J(b^{~O0J&#w{x zH=*kPla}jEq_KaD&74`9WwHKWp6UOW@Jydr|DS18|16fgJy*@&9uY{T~+c|A_xr zE6-t0Klp!B!v8k@e*kJUjsNd}{s;H3(0hPUse=FK3ASneKh^)Me&i1X*p{7Bn*Sg1 z2XIV-Jiyh+|EK&vFVX))!uWs8|5fmR75rZX`c=mNv+IZpM1Tko0V2>o0i>ov^?ynJ|7M5& zAGZ1by;8>i_4a>ok6X4=|5ro(UJdnoHPr9b5btOGUynPLr$+>c01@ax1XBM0X;T0H zi(LKxZsh+DqZePJ{=Z-Of6ec}@6G&gLd+jn9@qa@H2$yke;bki4>kV(EUL`G|32dX zt5E;HTJ=Bf6EZYL@`}{C{>`ae)XB0U|&IS|gD1e{TMtjsLsz|Gwt`*J%A8_;HV4 z|HtQA|EK(K=l?1H7wZ3P{@-2ySNAmkKOz^G#Q$fP{`V38_Ywd15&!oQ|M$TE9{Aq_ z|9j;B))zZJAp%5z2oQk`fgJy*`Tw;3-_HNb&HqRKzhC)(2>ib#;eRmDfTa0_q+F7vyGnLe7W%HrejiZEv85jd$J~@>$sMc$GR%6H^$!Q6v&&tV?HLw+6e5WF?k2>(4&=m(f?pN{Vp0B zE`X~4k>jtN!1!%4ko%9&3ot_dKSC`4Dl+>b*kD^cKM->TE9eavoj@m_|HlKpf57z-csv6CN8tYme6HK#`T*1lfYW{Q ze|ov_od^&CB0vOy0JQr#dHp|un*Vn7|JyPo%Ktm$mL~pB_5W|=M){&&U$E1!pLv&G z*JCYK{r@Fd@6`WK%R1TS*B9pW|GEPI=k@=ksRL&l|9jwn5Bwhw)c%3%J@CH={`bKD z9{69k#r=WND;WGAk^j@nh3`aw2oM1x00fHqzY+ic`}M!(1(g5W*Z-T8{}-kD|6aLD z^8EjdUpG1ZKWpRv0r)=v|HlK*{sGqq;Qs*pAAtV@@V{>BM}L5R)C%;6=naVPF#gX! zc_KgrhyW2t5h(J1BmUoB{{K|^U-SRa|8w*4{|P+L&z1kbQ?8XS%ZJPI{~G^K^Z!}= zANLt{?n3&Trt^C{`Tr`oybAu02WtPo^;PhH75rZX|5w5Px{dMw>3k*d+=&1YAOhV* z;4%3?i~7H2{oknni}U|a`}O&0{a;!B{~5Vl8v6fZw*GGd&-vXdpU!?*n*Z1OKb!wg zY6Fn}Ux$3e0ZKn-&OYN+4SZLI&x zE-@|;0U|&Ih(G~>BLBD2|IpYA^7a3D{s%|T&)5H@`G2kdYmWb?{68P_16=ig*P`an ztk32DZT+^ry`u{px|CiJMMgGs%|IbYRPka98d)D_SUC{ae?~9H<-3ylU|4$b=evb$c z0V2?22(;$^X8o`E|84Ri^#3uJ{2u*(QvJUR{eO!2f7~l9PUrs@D)s+q`-ER40z`la%tQpxF(y3e*P}!J z8G`DuV9a<|>F+#*oIbk4h56r%NV8p6`~3F&GP=>Bi(KQ`e&aH^H!r%-p-XLlkpEt~ zj2Y}r$HaMjL_b57d(-yRUf&PNoWTADdy}u>9JF@T8*bC76FO~a~-hXKP8!)cJxDn%8jO!;I0WpHEy{P}Y1}%3? z1c(3;m|6tL|DEAY{x^F>%ySmC2gMUphM#v0KJ_sYEAK)q^F;)R01+SpJ%9lDzcVM0 z|H=QIT`{yK0z`la^d5K>qK{FXVsne`i+=t%(2;AOgLK zz(MrlJBg7$yLZv+U)P^E-lE6RTThq2YrMHX6BF$+X7PK*Uw#13<$VS{{GOGH-S$1> zU;Sr{C($=h?e(=Ey#SA+|KBlxz`SVu%U(3z&^}{U{TluMpOn?Hk=iBC@4H{-%gZw8 z@59sT^uxz-oSkxpV7;JKfiQ^cHTD|Lx7d{c@JPDucm3iR}3_ z_&(>+gZ({=q|A)Jv&nM}B zY;)^>uW}sE0ywq)H*58HiT)4wLFemwga5sd`oF0EmH+Xy1nPgiRQMtSM1TkofesM> z|3}dOP0#aj=>JN>|5oeg_#gVeKWwf41L*%r{6E|}{%`evWuF8E{tp=cxA}m4{9pM$ zjsK4`{@>wsPjezb1c<@gB<^B{$FDPfm{Dq+vWcx{%`aD-ab6B zR{he@|5e8So&0|w(fi-h`zbZS^{U(k7Tm6svzgmI+YmEOp`Cs+_)6D;8R}vS901+SpM4(*+ zT>Ag7N&R0w|NkiJ{}13^p;74`4H- z>zV#HW(n*6T>1Yr{;&1_PqY4CFB-mx01+SpM4&Nn~KCmI9D>i=ahjN|_~{>Qdl z{6AO!@8|3PQ~mGa|9t&F>i_&k{vY!Ov5x#d>;IeQ|K;=l%Kzi!|F*7p8W8~^Km>?@ zBH+^h8vobN68&#u@mc+!3|4adAJ6~8w%q)`hW@{(r{*Iv?Ok$?N|# z{%`aDsQ-)m5oG#b`dRN0Bm<79K zuDpcaf$06`{TR#Nmtol}b?*=83-BlO|GNkK%D#++Um?ygQ(hG>i~`H`uKy3O5f%1c(3;=pF(&{y$fbqWu3CaQ(CB>7)FAuV3@Q{|0=2 z?qT%hOZa~a)|Z3-E6V?m`n90I|C{w5U{s>$AnpkY{69P*8&FeVQ~vgcf&Z5%|Bs-( zY|8)2_c8y^2mh}W+&_fmf93xp=&E=Wp7N?L|3|U@AFPbX4WjxVT<@WWuN|Y}Rh0j+?t{OB zME|c={a@h!rON-e<5)UW|KmG}{vV?L&q4t)|9jwn5B%>b|J$cCOxcx3{+}|ac_1P{ z1c*R)5y=>KK0{$HNy|CjJgpIHB&X;l9+{;xLyG5-hP{{Z|SDF55;Oc|8j zULgN>8)5FB2oM1xFhvOD_&<&RpOfhSu#o>p{J&ax4s-g!|Cw`u-A)&Hx01Km=wW0xAFhG^zjpMXvsTH}e07(TlH9|KG3t zzvg$~_h$Y#A?6P(kL&*{8vob&zm3TMhZ_HX7X5?3|32dXt5E;HTJ=Bf6EZYM?D`v|1`pPT<@ zEL*8jDCq0^EG5CI}U1ey@Y@qe2CPwW5f{J-4%f8_uBmH&sp z|63CNNB)06()_>H|0Vf@V9zf|WBr1}4N{(qYPU)4tbe>U;| zQFLtj1)jS2|71?U`oE@&nJYwq2oM1x&^7`&{!i=wZU3KC|L5laqy9fk`9JOdWBEUw z{~y=?+xWlM|8IE;ef;A5f2i^QwEvHd|BuKgvUA*PJUjnyL>l$~n(vS6{|9XSKfYfw z|9>{||H~4h|4)eiKOyV?vTKM7M1Tko0V2>D0^gL+$ZOEv-!kSr{pMHXR(ad6&wEqW z$XAWGZYSdQZ_4#@NIoeq$Yt`F@z%a6cgP;Ue)bD;rR*}^1(^G{YCE|575SX(ME&0v zbcitQFS=l3-cjRut+=F$`VIILlejW1=yfxMc|2;i+FFlGUBt4C%D!hQ16Az)2;!#;4<8p=>N5$s9 zql4nVBN78o4Ph)&kLhT^|@H}|CeOFQ~y6L z>tvf>UzpSX>k9mz*Z-HMKWC=%e?D zZzE9D|Bd+n->?5Q%B=j~zW(2&{J$vG|M$vOlIQ>Y5$H_>iu~V*|F@U_Kb8L1{6F;n+|3>{^ zod18?ug_2G|H|_J&&cJ{(ElH^^?wtnPTMM<&Y({7|62cN^Z!Y00P_FqkdIiP^?&!H zM^Hik&))d|rKtbA>>*?0|1I=C)ul0Y;@&APov`G34;_W`&UxWqLdK<5A)#T)?i3w(d(05JYPEw3t` zG!Y;IL|`%kt@*!M{}=23Q~uA_{~t@{|K;odRsSRYf0ow&y&)<854DK@+x-8+H2)9% ze{q`sPxwDy|DW;ytgHV^c%S+I$=5Tt5CI}U1c*R;2o(9hQUBMR|A)q2>C*qF%KxkW z-zuM%Jpb$Sf86^2I$Qsj)Bi>O&)5IYdj9|W^Z)H#BRMPT{~Q=xBmzW$2ux=LTJwLi z{@48fHu(_x|CmdDkN!WY{@;cEKgIk%?iCiN^Z$$S|DTuk|B2`S<@A3x|KE}S&-fq5 zn>U?(kU#gf>i@F1f9v`G?dAX3|0j<Lhyb z9YRij3|;2&zC}MA6N9d^eyGcb{CYHoXZzu^8}Qt~C1Vm)#_){aljsI8CVjALJlk(v z;@-UD=voW=kBm#z?nC#}>FX`ojb4BcVLaIM)kEln-?U*GuNXg!s*MSMg{2=F{|1cf zFmA-S7UTLU{jt>lQwlc^Mg)ie5$GNQ$^X6O51tJXAOb{SrXp|^i za zV7jmU=mmHj{r`^n1Lj5JU-qK$hV~h=>euN1|D>!=&18S_{J#5TzPv1h{yyo8^uxz- zoSkxpV7;&8`2v%5gjk;MDrxtkvTs z`aj$Uov-T+{`W%ae+>aN_}>HP+X4P>+zTjbU42picNJdloCpvBA~1Cbfd3=tf6KS& zQ62iflJLLP`Z@lG{_hW4>;C}ye-i%>w~qf?{a@K9L4p4R#{X>wpuzu*m_MGp`r-oruSEU->Nx(N=YMZlPdLf{2e28^ z^(_By%o5iB=?y?5{vSgB+X4OGmG13W2t{h!AFZT=tie{ny8O#e&&EUN#rf&Lc%rTTyBu8+cz$o~aE zxJm?w01=q32!Q`PoBuC^UV;B3)c<*I{U5fg|C9K?)&Hpf3mf|1_Wuc~|Lq+?%Ku|= z>|b*Li2pZg0lR(`lK;C7F%LilhyW3o8U&v5>)s1~-9M1j;2kk$(L3nJ_X;?Dhw%qa)YD{{pUm7Cn8G|L^r{KKS2&@6SDqzI+M)Z^8O<@IM%(E|2=Ppuqo| z^&VhUqUa#*2@3o_JR%!VQ(#m678vmV66OC9S(fp?@_o$z^TGcs1@{jj`9J3W2z(xa z&m*88fzN&LzYqS`Y73wI-@AWoJToFd1c*QnA>iQug^B(Tl>aZ6K@;nLv-U75%)tLk zp#L`~{2#^of3PwlH;C$gaJ`2fzIKd?S5f}Qx)1&i68*ng^?!l?mn#3?j$`Ri{g3Y? z`hSS}zo7p;@V^KC_rU)i_&);wN8o?$wj7cFd+4u=r$PjX01@b21akaud+P|5g7Z{vW9RSN`8PhIxLC_`eBN|DUv6Zz7HTV{9HpAHSUb51Zrvw`8C||1XR6 z|ME=#zl3M{#QOhCqxzrmf4vEa^?v~V55WHc_&)&u_j~98=pV(?n2uvG{-0e~Tp$8O zfCvzQmI&ndKaKyNlj#4jkpD;gzgl??bNa#mn-c!F@&5x*qiOtq2lPLp@WB#v#|Eu8tD$uVo z{-0e(Tp$8OfCvzQ_7P~s|Iq)H9RDZz|C+}CE&soW=lntcBmR&6{<-=;jsJuDH|jmW z575U?`F|9uG*|yO?5O`s^8YtG^#8EU|L>JD{;#+HgL~Yvo%+8T>i24>->ad1uZDO( z>;HP(sXRR*Km>?D4^8ukDE%KvMA2Yzqne-mQxv6RfCvx)BG4Lvl>c+{|7`r?wA`M*&AXY>E=`oFrT`Tr5QxFr5R zyY#=0_`i?%zmNF8kNCd_{`bKD9{ArQ|F^!_`3Vsq0z`laWC-N=Kh6KA_5XJMUvBB0vO)z;r_($Ny>lzwQ5%>i^vQf7Jhn zDgUSae=Pr}^Z(=ee;fbT`u{CYp^smj{|`0(pZ5Q;@&6I|Ll-d{Sf-U3jJS&{@151SE>KA>xv6RfCvx) zBG4LvZ^~!nHE8c|8FQXmeMN4SxBdFOH)V}{)p+Z6B5wbtTrY>@lk$RGCXX3!?VECk z?D6YozaUr2F5_K*+W%GC!QHRO=VT}9|GpqM%M)@w?6=8wzixX2J#4)5-jL7A9@#7p zp#RSf`FM6x+mZLz*EYFJCNTH^C$cqOH{OL`mo4&^d{Dk4cMIkota}dg2p;n5n1|r4 zu}1jskwQPfbo+FCuNcn{!b()_b9Dh!{f``f`^~^8bXKX>OB^ zQsn<9$e_GbbHov|wr~lU#_&=}zFHIdd z+xXuD|9jy7c%b$VTHk?9{|~_b0r)>2c=ivtJ^=p*;Qs*p zAAtXLTR-{(^rKdwKSXape24LW{>c*oB0vO)K#D+-{~PiD_VWLy(*K(OhyI_NkN;2L zd48_^|DAHJd|5tRmjBoIf13Z#;{UkMuyYsE-!z@y+sXe|!R1x(e>_n82d=Mz|Eu8t zD)_$&{?~1c|4-*Df#*&HhyW4jE&`9q2U^tsHS7OI{a>8_f7-9lPwW56^8e4s<=M(|GO47e`b9y|8ML6?=$9N<$u)wZ^-HYEdGz<4;Oycv|VjS z|A)~3A@qMd&?D7Z7O8 z|IPZpSpT2$f4=_zSTg@FU;nTAAMyXQwEpi6N%?=MMf~69{}-nDf9U^<)BJzJ|M~j= zjQ?j_{hts1_rd@17(;D8V*TKMAN=ow|9$YkZi}A}jAsRd|2^`57yf#zW#q^@_*X%N8hu) zKk0(b|9@X}{OMk>od18i$nkqbfCvzQ9z&ot|2OM@&Hrzc5262$x#aig|C8$fUFiQ) z%>UzFVR1VDzZn1jd1?Qjc>Z5b|7Y|69r^!^|8cx|JqGJ(pU(Rk|Bs&!jAsQy|5vI1 SPunN_A`u`0L|~>N@c#j*7*Iq2 literal 0 HcmV?d00001 diff --git a/system/item-tables/ItemRT-pc-v2.afs b/system/item-tables/ItemRT-pc-v2.afs new file mode 100644 index 0000000000000000000000000000000000000000..ca640453f0cf30f8f2afbcbb33023f34f2646ab2 GIT binary patch literal 606208 zcmeI*eXL~VT?g>zoHH}`?(W^&EoEVW0=uxlw&k_F6kke#YSqNlR^v<57>#YpQX~Wu ztx-rdTB#DHhESmWLyOBcBO z+}&BrZoBN~Cc~MTojWu4b5Hx7-}C&Q=iczHpGiAX{#r~QF7u%|ZfcHOn&Z~yxT85< z-W;!Oj@LKGA8(HDX^y|p9DlVr-qaj#YmOgkjvsE0cQwa*n&bV=@h_X>r<>!R=JRJ zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk 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 Q|DO)t6#@hZoJ0cu2VDY{m;e9( literal 0 HcmV?d00001 diff --git a/system/item-tables/ItemRT-xb-v3.gsl b/system/item-tables/ItemRT-xb-v3.gsl new file mode 100644 index 0000000000000000000000000000000000000000..c024c9957a82bb0e09134bc990f960fc852f47c1 GIT binary patch literal 258048 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