From b17af41e67322f8c4d3bf538a24a5c56a532bda7 Mon Sep 17 00:00:00 2001 From: Mordred Date: Mon, 21 Oct 2019 23:24:26 +0200 Subject: [PATCH] Major rewrite of zonelines, aetherytes and discoveries --- deps/datReader/DatCategories/bg/LgbTypes.h | 198 + deps/datReader/DatCategories/bg/lgb.h | 243 +- deps/datReader/DatCategories/bg/sgb.h | 12 +- deps/datReader/Index.cpp | 2 +- sql/schema/inserts.sql | 4377 ----------------- sql/schema/schema.sql | 7 - src/common/Exd/ExdDataGenerated.h | 5 + .../Network/PacketDef/Zone/ServerZoneDef.h | 5 +- src/tools/discovery_parser/main.cpp | 260 +- src/tools/event_object_parser/main.cpp | 14 +- src/tools/exd_struct_gen/ExdData.h.tmpl | 5 + src/tools/nav_export/lgb.h | 86 +- src/tools/nav_export/main.cpp | 2 +- src/tools/pcb_reader/lgb.h | 85 +- src/tools/pcb_reader/main.cpp | 2 +- src/world/Actor/Player.cpp | 21 + src/world/Manager/DebugCommandMgr.cpp | 25 +- src/world/Network/Handlers/PacketHandlers.cpp | 80 +- src/world/ServerMgr.cpp | 6 + src/world/Territory/InstanceObjectCache.cpp | 118 + src/world/Territory/InstanceObjectCache.h | 84 + 21 files changed, 738 insertions(+), 4899 deletions(-) create mode 100644 deps/datReader/DatCategories/bg/LgbTypes.h create mode 100644 src/world/Territory/InstanceObjectCache.cpp create mode 100644 src/world/Territory/InstanceObjectCache.h diff --git a/deps/datReader/DatCategories/bg/LgbTypes.h b/deps/datReader/DatCategories/bg/LgbTypes.h new file mode 100644 index 00000000..71c2319f --- /dev/null +++ b/deps/datReader/DatCategories/bg/LgbTypes.h @@ -0,0 +1,198 @@ +#ifndef SAPPHIRE_LGBTYPES_H +#define SAPPHIRE_LGBTYPES_H + +#include "vec3.h" + +enum class LgbEntryType : uint32_t +{ + BgParts = 1, + Attribute = 2, + Light = 3, + Vfx = 4, + PositionMarker = 5, + Gimmick = 6, + SharedGroup6 = 6,// secondary variable is set to 2 + Sound = 7, + EventNpc = 8, + BattleNpc = 9, + RoutePath = 10, + Character = 11, + Aetheryte = 12, + EnvSpace = 13, + Gathering = 14, + SharedGroup15 = 15,// secondary variable is set to 13 + Treasure = 16, + Player = 37, + Monster = 38, + Weapon = 39, + PopRange = 40, + ExitRange = 41, + LVB = 42, + MapRange = 43, + NaviMeshRange = 44, + EventObject = 45, + DemiHuman = 46, + EnvLocation = 47, + ControlPoint = 48, + EventRange = 49, + RestBonusRange = 50, + QuestMarker = 51, + TimeLine = 52, + ObjectBehaviorSet = 53, + Movie = 54, + ScenarioEXD = 55, + ScenarioText = 56, + CollisionBox = 57, + DoorRange = 58, + LineVfx = 59, + SoundEnvSet = 60, + CutActionTimeline = 61, + CharaScene = 62, + CutAction = 63, + EquipPreset = 64, + ClientPath = 65, + ServerPath = 66, + GimmickRange = 67, + TargetMarker = 68, + ChairMarker = 69, + ClickableRange = 70, + PrefetchRange = 71, + FateRange = 72, + PartyMember = 73, + KeepRange = 74, + SphereCastRange = 75, + IndoorObject = 76, + OutdoorObject = 77, + EditGroup = 78, + StableChocobo = 79 +}; + +enum PopType : uint32_t +{ + PopTypePC = 0x1, + PopTypeNPC = 0x2, + PopTypeBNPC = 0x2, + PopTypeContent = 0x3, +}; + +struct Transformation +{ + vec3 translation; + vec3 rotation; + vec3 scale; +}; + +struct InstanceObject +{ + LgbEntryType type; + uint32_t instanceId; + uint32_t nameOffset; + Transformation transform; +}; + +struct BgPartsData : public InstanceObject +{ + uint32_t modelFileOffset; + uint32_t collisionFileOffset; + uint32_t unknown4; + uint32_t unknown5; + uint32_t unknown6; + uint32_t unknown7; + uint32_t unknown8; + uint32_t unknown9; +}; + +struct RelativePositions +{ + int32_t Pos; + int32_t PosCount; +}; + +struct PopRangeData : InstanceObject +{ + PopType popType; + RelativePositions relativePositions; + float innerRadiusRatio; + uint8_t index; + uint8_t padding00[3]; + uint32_t reserved; +}; + +struct GimmickData : public InstanceObject +{ + uint32_t gimmickFileOffset; + char unknownBytes[100]; +}; + +struct ENpcData : public InstanceObject +{ + uint32_t enpcId; + uint8_t unknown1[0x24]; +}; + +struct EObjData : public InstanceObject +{ + uint32_t eobjId; + uint32_t levelHierachyId; + uint8_t unknown1[0xC]; +}; + +enum TriggerBoxShape : uint32_t +{ + TriggerBoxShapeBox = 0x1, + TriggerBoxShapeSphere = 0x2, + TriggerBoxShapeCylinder = 0x3, + TriggerBoxShapeBoard = 0x4, + TriggerBoxShapeMesh = 0x5, + TriggerBoxShapeBoardBothSides = 0x6, +}; + +struct TriggerBoxInstanceObject +{ + TriggerBoxShape triggerBoxShape; + int16_t priority; + int8_t enabled; + uint8_t padding; + uint32_t reserved; +}; + +struct ExitRangeData : public InstanceObject +{ + TriggerBoxInstanceObject triggerBoxType; + uint32_t exitType; + uint16_t zoneId; + uint16_t destTerritoryType; + int index; + uint32_t destInstanceObjectId; + uint32_t returnInstanceObjectId; + float direction; + uint32_t reserved; +}; + +struct MapRangeData : public InstanceObject +{ + TriggerBoxInstanceObject triggerBoxType; + uint32_t mapId; + uint32_t placeNameBlock; + uint32_t placeNameSpot; + uint32_t bGM; + uint32_t weather; + uint32_t reserved; + uint32_t reserved2; + uint16_t reserved3; + uint8_t housingBlockId; + int8_t restBonusEffective; + uint8_t discoveryIndex; + int8_t mapEnabled; + int8_t placeNameEnabled; + int8_t discoveryEnabled; + int8_t bGMEnabled; + int8_t weatherEnabled; + int8_t restBonusEnabled; + int8_t bGMPlayZoneInOnly; + int8_t liftEnabled; + int8_t housingEnabled; + uint16_t padding; +}; + +#endif //SAPPHIRE_LGBTYPES_H diff --git a/deps/datReader/DatCategories/bg/lgb.h b/deps/datReader/DatCategories/bg/lgb.h index 50097735..00697184 100644 --- a/deps/datReader/DatCategories/bg/lgb.h +++ b/deps/datReader/DatCategories/bg/lgb.h @@ -12,87 +12,33 @@ #include "matrix4.h" #include "vec3.h" #include "sgb.h" +#include "LgbTypes.h" -// garbage to skip model loading -extern bool ignoreModels; - -// all credit to -// https://github.com/ufx/SaintCoinach/blob/master/SaintCoinach/Graphics/Lgb/ -// this is simply their work ported to c++ since we dont c# +// based on https://github.com/ufx/SaintCoinach/blob/master/SaintCoinach/Graphics/Lgb/ struct LGB_FILE; struct LGB_FILE_HEADER; struct LGB_GROUP; struct LGB_GROUP_HEADER; -enum class LgbEntryType : - uint32_t -{ - BgParts = 1, - Light = 3, - Vfx = 4, - PositionMarker = 5, - Gimmick = 6, - SharedGroup6 = 6,// secondary variable is set to 2 - Sound = 7, - EventNpc = 8, - BattleNpc = 9, - Aetheryte = 12, - EnvSpace = 13, - Gathering = 14, - SharedGroup15 = 15,// secondary variable is set to 13 - Treasure = 16, - Weapon = 39, - PopRange = 40, - ExitRange = 41, - MapRange = 43, - NaviMeshRange = 44, - EventObject = 45, - EnvLocation = 47, - EventRange = 49, - QuestMarker = 51, - CollisionBox = 57, - DoorRange = 58, - LineVfx = 59, - ClientPath = 65, - ServerPath = 66, - GimmickRange = 67, - TargetMarker = 68, - ChairMarker = 69, - ClickableRange = 70, - PrefetchRange = 71, - FateRange = 72, - SphereCastRange = 75, -}; - -struct LGB_ENTRY_HEADER -{ - LgbEntryType type; - uint32_t unknown; - uint32_t nameOffset; - vec3 translation; - vec3 rotation; - vec3 scale; -}; - -class LGB_ENTRY +class LgbEntry { public: char* m_buf; uint32_t m_offset; - LGB_ENTRY_HEADER header; + InstanceObject header; - LGB_ENTRY() + LgbEntry() { m_buf = nullptr; m_offset = 0; memset( &header, 0, sizeof( header ) ); }; - LGB_ENTRY( char* buf, uint32_t offset ) + LgbEntry( char* buf, uint32_t offset ) { m_buf = buf; m_offset = offset; - header = *reinterpret_cast< LGB_ENTRY_HEADER* >( buf + offset ); + header = *reinterpret_cast< InstanceObject* >( buf + offset ); }; const LgbEntryType getType() const @@ -100,30 +46,16 @@ public: return header.type; }; - virtual ~LGB_ENTRY() + virtual ~LgbEntry() { }; }; -struct LGB_BGPARTS_HEADER : - public LGB_ENTRY_HEADER -{ - uint32_t modelFileOffset; - uint32_t collisionFileOffset; - uint32_t unknown4; - uint32_t unknown5; - uint32_t unknown6; - uint32_t unknown7; - uint32_t unknown8; - uint32_t unknown9; -}; - -class LGB_BGPARTS_ENTRY : - public LGB_ENTRY +class LGB_BGPARTS_ENTRY : public LgbEntry { public: - LGB_BGPARTS_HEADER header; + BgPartsData header; std::string name; std::string modelFileName; std::string collisionFileName; @@ -132,124 +64,95 @@ public: { }; - LGB_BGPARTS_ENTRY( char* buf, uint32_t offset ) : - LGB_ENTRY( buf, offset ) + LGB_BGPARTS_ENTRY( char* buf, uint32_t offset ) : LgbEntry( buf, offset ) { - header = *reinterpret_cast( buf + offset ); + header = *reinterpret_cast< BgPartsData* >( buf + offset ); name = std::string( buf + offset + header.nameOffset ); modelFileName = std::string( buf + offset + header.modelFileOffset ); collisionFileName = std::string( buf + offset + header.collisionFileOffset ); }; }; -struct LGB_GIMMICK_HEADER : - public LGB_ENTRY_HEADER -{ - uint32_t gimmickFileOffset; - char unknownBytes[100]; -}; - -class LGB_GIMMICK_ENTRY : - public LGB_ENTRY +class LGB_GIMMICK_ENTRY : public LgbEntry { public: - LGB_GIMMICK_HEADER header; + GimmickData header; std::string name; std::string gimmickFileName; - LGB_GIMMICK_ENTRY( char* buf, uint32_t offset ) : - LGB_ENTRY( buf, offset ) + LGB_GIMMICK_ENTRY( char* buf, uint32_t offset ) : LgbEntry( buf, offset ) { - header = *reinterpret_cast( buf + offset ); + header = *reinterpret_cast< GimmickData* >( buf + offset ); name = std::string( buf + offset + header.nameOffset ); gimmickFileName = std::string( buf + offset + header.gimmickFileOffset ); - //std::cout << "\t " << gimmickFileName << " unknown: " << header.unknown << "\n"; }; }; -struct LGB_ENPC_HEADER : - public LGB_ENTRY_HEADER -{ - uint32_t enpcId; - uint8_t unknown1[0x24]; -}; - -class LGB_ENPC_ENTRY : - public LGB_ENTRY +class LGB_ENPC_ENTRY : public LgbEntry { public: - LGB_ENPC_HEADER header; + ENpcData header; std::string name; LGB_ENPC_ENTRY( char* buf, uint32_t offset ) : - LGB_ENTRY( buf, offset ) + LgbEntry( buf, offset ) { - header = *reinterpret_cast< LGB_ENPC_HEADER* >( buf + offset ); - name = std::string( buf + offset + header.nameOffset ); - //std::cout << "\t ENpc " << header.enpcId << " " << name << "\n"; - }; -}; - -struct LGB_EOBJ_HEADER : - public LGB_ENTRY_HEADER -{ - uint32_t eobjId; - uint32_t levelHierachyId; - uint8_t unknown1[0xC]; -}; - -class LGB_EOBJ_ENTRY : - public LGB_ENTRY -{ -public: - LGB_EOBJ_HEADER header; - std::string name; - - LGB_EOBJ_ENTRY( char* buf, uint32_t offset ) : - LGB_ENTRY( buf, offset ) - { - header = *reinterpret_cast< LGB_EOBJ_HEADER* >( buf + offset ); - //std::cout << "\t " << header.eobjId << " " << name << " unknown: " << header.unknown << "\n"; + header = *reinterpret_cast< ENpcData* >( buf + offset ); name = std::string( buf + offset + header.nameOffset ); }; }; -struct LGB_MAPRANGE_HEADER : - public LGB_ENTRY_HEADER -{ - uint32_t type; - uint8_t unknown2; - uint8_t unknown2_1; - uint16_t unknown3; - uint32_t unknown5; - uint32_t mapId; - uint32_t offsetX; - uint32_t offsetY; - uint32_t unkInts[4]; - uint16_t unkShort; - uint8_t unkFlag; - uint8_t unkFlag2; - uint8_t discoveryIndex; - uint8_t unkFlag3; - uint8_t unkFlag4; - uint8_t unknown4[0x09]; -}; - -struct LGB_MAPRANGE_ENTRY : - public LGB_ENTRY +class LGB_EOBJ_ENTRY : public LgbEntry { public: - LGB_MAPRANGE_HEADER header; + EObjData header; std::string name; - LGB_MAPRANGE_ENTRY( char* buf, uint32_t offset ) : - LGB_ENTRY( buf, offset ) + LGB_EOBJ_ENTRY( char* buf, uint32_t offset ) : LgbEntry( buf, offset ) { - header = *reinterpret_cast< LGB_MAPRANGE_HEADER* >( buf + offset ); + header = *reinterpret_cast< EObjData* >( buf + offset ); name = std::string( buf + offset + header.nameOffset ); }; }; +struct LGB_MAP_RANGE_ENTRY : public LgbEntry +{ +public: + MapRangeData header; + std::string name; + + LGB_MAP_RANGE_ENTRY( char* buf, uint32_t offset ) : LgbEntry( buf, offset ) + { + header = *reinterpret_cast< MapRangeData* >( buf + offset ); + name = std::string( buf + offset + header.nameOffset ); + }; +}; + +struct LGB_EXIT_RANGE_ENTRY : public LgbEntry +{ +public: + ExitRangeData header; + std::string name; + + LGB_EXIT_RANGE_ENTRY( char* buf, uint32_t offset ) : LgbEntry( buf, offset ) + { + header = *reinterpret_cast< ExitRangeData* >( buf + offset ); + name = std::string( buf + offset + header.nameOffset ); + + }; +}; + +struct LGB_POP_RANGE_ENTRY : public LgbEntry +{ +public: + PopRangeData header; + + LGB_POP_RANGE_ENTRY( char* buf, uint32_t offset ) : LgbEntry( buf, offset ) + { + header = *reinterpret_cast< PopRangeData* >( buf + offset ); + }; +}; + struct LGB_GROUP_HEADER { uint32_t id; @@ -272,15 +175,13 @@ struct LGB_GROUP LGB_FILE* parent; LGB_GROUP_HEADER header; std::string name; - std::vector< std::shared_ptr< LGB_ENTRY > > entries; + std::vector< std::shared_ptr< LgbEntry > > entries; LGB_GROUP( char* buf, LGB_FILE* parentStruct, uint32_t offset ) { parent = parentStruct; header = *reinterpret_cast< LGB_GROUP_HEADER* >( buf + offset ); name = std::string( buf + offset + header.groupNameOffset ); - //entries.resize( header.entryCount ); - //std::cout << name << "\n\t unknown: " << header.unknown << "\n"; const auto entriesOffset = offset + header.entriesOffset; for( auto i = 0; i < header.entryCount; ++i ) { @@ -288,8 +189,7 @@ struct LGB_GROUP try { - const auto type = *reinterpret_cast( buf + entryOffset ); - // garbage to skip model loading + const auto type = *reinterpret_cast< LgbEntryType* >( buf + entryOffset ); if( type == LgbEntryType::BgParts ) { entries.push_back( std::make_shared< LGB_BGPARTS_ENTRY >( buf, entryOffset ) ); @@ -306,16 +206,18 @@ struct LGB_GROUP { entries.push_back( std::make_shared< LGB_EOBJ_ENTRY >( buf, entryOffset ) ); } + else if( type == LgbEntryType::ExitRange ) + { + entries.push_back( std::make_shared< LGB_EXIT_RANGE_ENTRY >( buf, entryOffset ) ); + } else if( type == LgbEntryType::MapRange ) { - entries.push_back( std::make_shared< LGB_MAPRANGE_ENTRY >( buf, entryOffset ) ); + entries.push_back( std::make_shared< LGB_MAP_RANGE_ENTRY >( buf, entryOffset ) ); } else { - entries.push_back( std::make_shared< LGB_ENTRY >( buf, entryOffset ) ); + entries.push_back( std::make_shared< LgbEntry >( buf, entryOffset ) ); } - - } catch( std::exception& e ) { @@ -344,8 +246,7 @@ struct LGB_FILE std::vector< LGB_GROUP > groups; std::string m_name; - LGB_FILE( char* buf, const std::string& name ) : - LGB_FILE( buf ) + LGB_FILE( char* buf, const std::string& name ) : LGB_FILE( buf ) { m_name = name; } @@ -356,8 +257,6 @@ struct LGB_FILE if( strncmp( &header.magic[ 0 ], "LGB1", 4 ) != 0 || strncmp( &header.magic2[ 0 ], "LGP1", 4 ) != 0 ) throw std::runtime_error( "Invalid LGB file!" ); - //groups.resize(header.groupCount); - constexpr auto baseOffset = sizeof( header ); for( auto i = 0; i < header.groupCount; ++i ) { diff --git a/deps/datReader/DatCategories/bg/sgb.h b/deps/datReader/DatCategories/bg/sgb.h index fb384b69..fbf23f5a 100644 --- a/deps/datReader/DatCategories/bg/sgb.h +++ b/deps/datReader/DatCategories/bg/sgb.h @@ -22,15 +22,13 @@ struct SGB_GROUP; struct SGB_GROUP_HEADER; -enum SgbDataType : - uint32_t +enum SgbDataType : uint32_t { Unknown0008 = 0x0008, Group = 0x0100, }; -enum SgbGroupEntryType : - uint32_t +enum SgbGroupEntryType : uint32_t { Model = 0x01, Gimmick = 0x06, @@ -124,15 +122,13 @@ struct SGB_ENTRY_HEADER vec3 scale; }; -struct SGB_MODEL_HEADER : - public SGB_ENTRY_HEADER +struct SGB_MODEL_HEADER : public SGB_ENTRY_HEADER { int32_t modelFileOffset; int32_t collisionFileOffset; }; -struct SGB_MODEL_ENTRY : - public SGB_GROUP_ENTRY +struct SGB_MODEL_ENTRY : public SGB_GROUP_ENTRY { SGB_MODEL_HEADER header; SgbGroupEntryType type; diff --git a/deps/datReader/Index.cpp b/deps/datReader/Index.cpp index 92dfb5da..e7985396 100644 --- a/deps/datReader/Index.cpp +++ b/deps/datReader/Index.cpp @@ -84,7 +84,7 @@ Index::Index(const std::experimental::filesystem::path& path) : // The dat number is found in the offset, last four bits hashTableEntry.datNum = ( indexHashTableEntry.datOffset & 0xF ) / 0x2; // The offset in the dat file, needs to strip the dat number indicator - hashTableEntry.datOffset = ( indexHashTableEntry.datOffset & 0xFFFFFFF0 ) * 0x08; + hashTableEntry.datOffset = ( indexHashTableEntry.datOffset - ( indexHashTableEntry.datOffset & 0x000F ) ) * 0x08; hashTableEntry.dirHash = indexHashTableEntry.dirHash; hashTableEntry.filenameHash = indexHashTableEntry.filenameHash; } diff --git a/sql/schema/inserts.sql b/sql/schema/inserts.sql index bcecda18..cb94763b 100644 --- a/sql/schema/inserts.sql +++ b/sql/schema/inserts.sql @@ -424,4383 +424,6 @@ INSERT IGNORE INTO `bnpctemplate` ( `Name`, `bNPCBaseId`, `bNPCNameId`, `mainWea INSERT IGNORE INTO `bnpctemplate` ( `Name`, `bNPCBaseId`, `bNPCNameId`, `mainWeaponModel`, `secWeaponModel`, `aggressionMode`, `enemyType`, `pose`, `modelChara`, `displayFlags`, `Look`, `Models`) VALUES ( "servantofthesage_8754", 8754, 7205, 0, 0, 3, 4, 0, 2270, 262147, UNHEX( '0000000000000000000000000000000000000000000000000000'), UNHEX( '00000000000000000000000000000000000000000000000000000000000000000000000000000000') ); INSERT IGNORE INTO `bnpctemplate` ( `Name`, `bNPCBaseId`, `bNPCNameId`, `mainWeaponModel`, `secWeaponModel`, `aggressionMode`, `enemyType`, `pose`, `modelChara`, `displayFlags`, `Look`, `Models`) VALUES ( "saitaisui_8780", 8780, 7206, 4295302988, 0, 1, 4, 0, 2218, 12, UNHEX( '0000000000000000000000000000000000000000000000000000'), UNHEX( '00000000000000000000000000000000000000000000000000000000000000000000000000000000') ); -INSERT INTO `discoveryinfo` (`id`, `map_id`, `discover_id`) VALUES -(1367775, 4, 2), -(1367776, 4, 2), -(1367777, 4, 2), -(1367778, 4, 1), -(1367779, 4, 2), -(1367780, 4, 3), -(1367785, 4, 3), -(1367793, 4, 2), -(1367798, 4, 1), -(1367800, 4, 2), -(1367801, 4, 2), -(1367823, 4, 2), -(1420009, 4, 5), -(1420010, 4, 5), -(1420011, 4, 2), -(1420012, 4, 5), -(1420013, 4, 5), -(1436587, 4, 2), -(1436597, 4, 5), -(1436598, 4, 5), -(1436599, 4, 5), -(1436600, 4, 2), -(1436601, 4, 2), -(1436602, 4, 2), -(1436603, 4, 2), -(1436604, 4, 2), -(1436605, 4, 2), -(1436606, 4, 2), -(2052662, 4, 7), -(2052668, 4, 8), -(2052672, 4, 13), -(2052682, 4, 9), -(2052693, 4, 12), -(2052695, 4, 12), -(2052698, 4, 10), -(2052699, 4, 10), -(2052705, 4, 11), -(2052706, 4, 11), -(2052708, 4, 10), -(2052710, 4, 6), -(2052711, 4, 6), -(2052714, 4, 5), -(2052716, 4, 5), -(2052721, 4, 5), -(2052722, 4, 5), -(2052724, 4, 5), -(2065858, 9, 1), -(2065859, 9, 6), -(2065860, 9, 6), -(2065861, 9, 3), -(2065866, 9, 4), -(2065867, 9, 4), -(2065868, 9, 4), -(2065869, 9, 4), -(2065870, 9, 4), -(2065871, 9, 2), -(2065872, 9, 7), -(2065873, 9, 9), -(2065875, 9, 9), -(2065877, 9, 5), -(2065879, 9, 3), -(2065880, 9, 5), -(2065882, 9, 8), -(2065883, 9, 8), -(2065961, 5, 1), -(2065962, 5, 1), -(2065963, 5, 1), -(2065970, 5, 2), -(2065974, 5, 17), -(2065975, 5, 13), -(2065981, 5, 16), -(2065986, 5, 4), -(2065987, 5, 5), -(2065988, 5, 5), -(2065992, 5, 4), -(2065994, 5, 4), -(2065995, 5, 5), -(2065996, 5, 4), -(2065997, 5, 3), -(2065998, 5, 3), -(2065999, 5, 3), -(2066000, 5, 3), -(2066001, 5, 3), -(2066002, 5, 6), -(2066003, 5, 6), -(2066004, 5, 7), -(2066007, 5, 7), -(2066011, 5, 7), -(2066013, 5, 9), -(2066018, 5, 10), -(2066019, 5, 10), -(2066021, 5, 10), -(2066022, 5, 12), -(2066023, 5, 12), -(2066024, 5, 15), -(2066027, 5, 11), -(2066029, 5, 19), -(2066030, 5, 18), -(2112183, 9, 6), -(2112184, 9, 6), -(2112186, 9, 7), -(2112188, 9, 5), -(2112189, 9, 4), -(2152921, 4, 3), -(2152922, 4, 3), -(2152923, 4, 4), -(2152925, 4, 4), -(2152926, 4, 1), -(2152928, 4, 2), -(2152930, 4, 5), -(2152931, 4, 5), -(2152933, 4, 5), -(2152934, 4, 5), -(2152935, 4, 5), -(2152936, 4, 5), -(2152937, 4, 5), -(2152938, 4, 5), -(2152939, 4, 8), -(2152941, 4, 8), -(2152942, 4, 8), -(2152943, 4, 8), -(2152944, 4, 7), -(2152945, 4, 7), -(2152946, 4, 7), -(2152949, 4, 7), -(2152950, 4, 7), -(2152951, 4, 7), -(2152952, 4, 7), -(2152953, 4, 7), -(2152954, 4, 7), -(2152955, 4, 8), -(2152956, 4, 9), -(2152957, 4, 11), -(2152963, 4, 11), -(2152965, 4, 11), -(2152966, 4, 13), -(2152967, 4, 13), -(2264614, 7, 1), -(2264620, 7, 1), -(2264625, 7, 1), -(2264626, 7, 2), -(2264633, 7, 3), -(2264634, 7, 3), -(2264636, 7, 3), -(2264637, 7, 3), -(2264640, 7, 10), -(2264642, 7, 10), -(2264643, 7, 10), -(2264649, 7, 11), -(2264653, 7, 12), -(2264660, 7, 12), -(2264662, 7, 13), -(2264669, 7, 2), -(2264671, 7, 14), -(2264672, 7, 15), -(2264673, 7, 16), -(2264674, 7, 4), -(2264675, 7, 5), -(2264676, 7, 6), -(2264682, 7, 8), -(2264685, 7, 9), -(2264705, 7, 1), -(2264721, 7, 1), -(2264728, 7, 1), -(2264731, 7, 3), -(2264736, 7, 8), -(2264772, 7, 16), -(2264773, 7, 7), -(2264775, 7, 11), -(2264791, 7, 15), -(2264796, 7, 3), -(2264798, 7, 16), -(2264807, 7, 1), -(2280307, 6, 1), -(2280313, 6, 2), -(2280316, 6, 3), -(2280318, 6, 3), -(2280320, 6, 4), -(2280327, 6, 4), -(2280330, 6, 4), -(2280347, 6, 5), -(2280351, 6, 5), -(2280358, 6, 5), -(2280362, 6, 6), -(2280365, 6, 7), -(2280369, 6, 7), -(2280371, 6, 8), -(2280375, 6, 15), -(2280388, 6, 13), -(2280391, 6, 14), -(2280395, 6, 14), -(2280400, 6, 9), -(2280402, 6, 10), -(2280403, 6, 10), -(2280404, 6, 12), -(2280406, 6, 11), -(2280409, 6, 1), -(2280410, 6, 2), -(2280414, 6, 4), -(2280425, 6, 3), -(2280426, 6, 3), -(2280428, 6, 2), -(2280430, 6, 9), -(2280432, 6, 9), -(2280448, 6, 10), -(2280451, 6, 12), -(2280453, 6, 11), -(2280455, 6, 7), -(2280456, 6, 5), -(2280458, 6, 8), -(2280461, 6, 16), -(2280464, 6, 6), -(2299601, 6, 6), -(2308332, 5, 1), -(2308333, 5, 3), -(2308340, 5, 3), -(2308346, 5, 3), -(2308354, 5, 5), -(2308355, 5, 4), -(2308361, 5, 8), -(2308363, 5, 16), -(2308364, 5, 13), -(2308366, 5, 17), -(2341847, 7, 4), -(2341870, 7, 6), -(2341892, 7, 10), -(2349784, 4, 5), -(2349791, 4, 2), -(2349792, 4, 5), -(2349794, 4, 5), -(2349857, 4, 5), -(2349858, 4, 5), -(2349860, 4, 5), -(2351856, 6, 4), -(2351858, 6, 4), -(2351870, 6, 4), -(2381027, 6, 4), -(2381028, 6, 4), -(2381029, 6, 10), -(2381030, 6, 8), -(2381031, 6, 6), -(2381032, 6, 7), -(2381033, 6, 4), -(2381034, 6, 4), -(2381035, 6, 4), -(2381036, 6, 4), -(2381037, 6, 4), -(2381038, 6, 4), -(2381039, 6, 7), -(2381040, 6, 13), -(2381041, 6, 7), -(2381044, 6, 4), -(2422825, 6, 4), -(2453661, 6, 4), -(2453677, 7, 1), -(2453678, 7, 13), -(2453679, 7, 15), -(2453681, 7, 13), -(2453682, 7, 13), -(2453685, 7, 5), -(2453686, 7, 8), -(2453687, 7, 8), -(2453688, 7, 8), -(2453689, 7, 8), -(2453690, 7, 8), -(2465005, 4, 4), -(2465008, 4, 6), -(2465009, 4, 6), -(2465010, 4, 2), -(2465013, 4, 2), -(2465017, 4, 10), -(2465018, 4, 13), -(2465019, 4, 10), -(2465025, 4, 9), -(2465028, 4, 9), -(2465029, 4, 9), -(2465059, 5, 3), -(2465060, 5, 19), -(2465061, 5, 19), -(2465064, 5, 12), -(2465069, 5, 15), -(2465072, 5, 17), -(2496282, 4, 11), -(2496289, 4, 5), -(2496437, 4, 2), -(2499345, 7, 1), -(2563317, 5, 1), -(2563790, 6, 5), -(2563792, 6, 5), -(2563798, 6, 4), -(2563804, 6, 12), -(2563859, 6, 9), -(2563867, 6, 9), -(2563868, 6, 9), -(2563872, 6, 9), -(2563875, 6, 9), -(2563882, 7, 1), -(2564149, 4, 11), -(2564152, 4, 11), -(2564171, 4, 11), -(2622826, 4, 5), -(2622881, 4, 11), -(2622884, 4, 11), -(2622886, 4, 11), -(2652480, 4, 1), -(2652490, 4, 1), -(2763450, 6, 7), -(2763451, 6, 7), -(2763452, 6, 7), -(2927639, 5, 6), -(3643234, 16, 1), -(3643236, 16, 1), -(3643414, 16, 2), -(3643415, 16, 2), -(3643457, 16, 3), -(3643485, 16, 3), -(3643486, 16, 3), -(3643487, 16, 3), -(3643488, 16, 3), -(3643489, 16, 4), -(3643491, 16, 6), -(3643495, 16, 7), -(3643496, 16, 7), -(3643498, 16, 7), -(3643499, 16, 7), -(3643500, 16, 10), -(3643501, 16, 7), -(3643502, 16, 10), -(3643503, 16, 10), -(3643504, 16, 10), -(3643505, 16, 10), -(3643506, 16, 9), -(3643507, 16, 9), -(3643509, 16, 8), -(3643556, 16, 2), -(3643588, 16, 2), -(3643589, 16, 2), -(3643590, 16, 1), -(3643597, 16, 3), -(3643598, 16, 4), -(3643602, 16, 5), -(3643604, 16, 9), -(3643605, 16, 8), -(3643606, 16, 10), -(3643607, 16, 8), -(3643649, 21, 1), -(3643706, 21, 1), -(3643707, 21, 3), -(3643708, 21, 1), -(3643709, 21, 2), -(3643715, 21, 4), -(3643728, 21, 4), -(3643815, 21, 5), -(3643825, 21, 5), -(3643831, 21, 3), -(3643841, 21, 6), -(3643859, 21, 7), -(3643862, 21, 5), -(3643864, 21, 8), -(3643865, 21, 5), -(3643871, 21, 8), -(3643879, 21, 6), -(3645046, 21, 10), -(3645058, 21, 10), -(3645548, 21, 9), -(3645576, 21, 9), -(3645590, 21, 11), -(3645591, 21, 9), -(3645607, 21, 9), -(3645675, 21, 11), -(3645684, 21, 11), -(3645746, 21, 12), -(3645751, 21, 13), -(3645793, 21, 12), -(3645800, 21, 12), -(3646818, 21, 1), -(3646820, 21, 1), -(3646848, 21, 3), -(3646849, 21, 3), -(3647060, 21, 4), -(3647062, 21, 5), -(3647073, 21, 6), -(3647079, 21, 7), -(3647131, 21, 8), -(3647136, 21, 10), -(3647138, 21, 6), -(3647142, 21, 9), -(3647308, 21, 12), -(3649749, 21, 6), -(3649760, 21, 6), -(3692932, 16, 2), -(3692933, 16, 1), -(3692941, 16, 7), -(3692942, 16, 2), -(3692943, 16, 7), -(3692944, 16, 7), -(3692948, 16, 2), -(3692961, 16, 3), -(3692965, 16, 3), -(3692973, 16, 4), -(3692975, 16, 4), -(3692976, 16, 4), -(3692977, 16, 4), -(3693075, 16, 4), -(3693080, 16, 4), -(3693104, 16, 6), -(3693126, 16, 5), -(3693128, 16, 5), -(3693148, 16, 7), -(3693159, 16, 7), -(3693168, 16, 7), -(3693169, 16, 7), -(3693181, 16, 10), -(3693182, 16, 7), -(3693189, 16, 8), -(3693190, 16, 8), -(3746497, 9, 1), -(3746504, 9, 10), -(3746513, 9, 1), -(3746515, 9, 11), -(3746546, 9, 7), -(3746643, 9, 8), -(3746648, 9, 12), -(3746649, 9, 13), -(3746650, 9, 13), -(3762950, 9, 2), -(3784410, 9, 1), -(3784508, 9, 2), -(3784514, 9, 2), -(3784517, 9, 2), -(3784520, 9, 2), -(3784522, 9, 2), -(3784563, 9, 7), -(3784565, 9, 7), -(3861103, 16, 2), -(3861106, 16, 2), -(3861109, 16, 2), -(3861111, 16, 2), -(3861113, 16, 2), -(3899968, 7, 15), -(3907414, 4, 5), -(3907879, 4, 1), -(3907888, 4, 1), -(3907897, 4, 2), -(3907899, 4, 2), -(3907901, 4, 2), -(3907902, 4, 2), -(3907903, 4, 2), -(3907908, 4, 2), -(3907909, 4, 2), -(3908308, 4, 9), -(3908312, 4, 9), -(3908313, 4, 9), -(3923782, 16, 3), -(3923784, 16, 3), -(3923785, 16, 3), -(3923789, 16, 3), -(3923790, 16, 3), -(3925825, 4, 11), -(3929402, 4, 1), -(3975004, 15, 1), -(3975007, 15, 2), -(3975011, 15, 3), -(3975015, 15, 6), -(3975127, 15, 1), -(3975132, 15, 1), -(3975135, 15, 3), -(3975138, 15, 2), -(3975183, 15, 3), -(3975188, 15, 3), -(3975191, 15, 3), -(3975192, 15, 3), -(3975196, 15, 4), -(3975198, 15, 4), -(3975202, 15, 4), -(3975204, 15, 4), -(3975205, 15, 4), -(3975208, 15, 4), -(3975212, 15, 4), -(3975215, 15, 3), -(3975217, 15, 3), -(3975223, 15, 3), -(3975229, 15, 3), -(3975232, 15, 3), -(3975233, 15, 5), -(3975242, 15, 5), -(3975244, 15, 5), -(3975251, 15, 6), -(3975256, 15, 5), -(3975261, 15, 7), -(3975267, 15, 6), -(3975272, 15, 6), -(3975278, 15, 6), -(3975282, 15, 6), -(3975283, 15, 6), -(3975285, 15, 6), -(4091012, 31, 1), -(4091018, 31, 2), -(4091019, 31, 2), -(4092388, 31, 1), -(4092418, 31, 3), -(4092425, 31, 4), -(4092429, 31, 4), -(4092430, 31, 7), -(4092431, 31, 9), -(4092432, 31, 8), -(4092433, 31, 4), -(4092435, 31, 7), -(4092436, 31, 4), -(4092437, 31, 4), -(4092438, 31, 10), -(4092439, 31, 10), -(4092440, 31, 10), -(4092444, 31, 11), -(4092449, 31, 11), -(4092471, 31, 3), -(4092472, 31, 3), -(4092534, 31, 1), -(4092536, 31, 2), -(4092537, 31, 2), -(4092538, 31, 3), -(4092539, 31, 3), -(4092540, 31, 4), -(4092541, 31, 4), -(4092542, 31, 7), -(4092543, 31, 7), -(4092544, 31, 8), -(4092545, 31, 4), -(4092546, 31, 9), -(4092547, 31, 10), -(4092548, 31, 11), -(4098244, 20, 1), -(4098246, 20, 2), -(4098252, 20, 2), -(4098653, 20, 2), -(4098655, 20, 3), -(4098662, 20, 5), -(4098665, 20, 6), -(4098675, 20, 6), -(4098680, 20, 7), -(4098686, 20, 8), -(4098719, 20, 10), -(4098723, 20, 10), -(4098733, 20, 12), -(4098786, 20, 1), -(4098790, 20, 1), -(4098794, 20, 1), -(4098812, 20, 1), -(4098843, 20, 4), -(4098858, 20, 2), -(4098869, 20, 2), -(4098978, 20, 5), -(4098984, 20, 3), -(4098990, 20, 3), -(4098991, 20, 3), -(4098996, 20, 4), -(4099007, 20, 4), -(4099014, 20, 7), -(4099017, 20, 6), -(4099024, 20, 6), -(4099214, 20, 6), -(4099220, 20, 6), -(4099234, 20, 6), -(4099313, 20, 8), -(4099338, 20, 8), -(4099357, 20, 8), -(4099376, 20, 9), -(4099424, 20, 10), -(4099430, 20, 10), -(4099464, 20, 12), -(4101783, 24, 1), -(4101846, 24, 2), -(4101870, 24, 3), -(4101889, 24, 4), -(4101896, 24, 4), -(4101900, 24, 5), -(4101904, 24, 5), -(4101907, 24, 6), -(4101914, 24, 8), -(4102354, 24, 1), -(4102358, 24, 1), -(4102359, 24, 1), -(4102360, 24, 1), -(4102361, 24, 2), -(4102365, 24, 3), -(4102371, 24, 3), -(4102372, 24, 3), -(4102373, 24, 3), -(4102375, 24, 6), -(4102377, 24, 4), -(4102378, 24, 4), -(4102379, 24, 4), -(4102381, 24, 8), -(4103415, 31, 4), -(4107623, 41, 8), -(4121883, 45, 1), -(4121897, 45, 2), -(4121909, 45, 3), -(4121915, 45, 3), -(4121922, 45, 4), -(4123952, 45, 4), -(4123953, 45, 5), -(4125929, 45, 6), -(4125941, 45, 7), -(4125947, 45, 8), -(4125950, 45, 8), -(4125987, 45, 9), -(4125993, 45, 10), -(4126016, 45, 11), -(4126017, 45, 8), -(4126028, 45, 11), -(4126039, 45, 12), -(4126040, 45, 13), -(4126043, 45, 13), -(4126044, 45, 13), -(4126049, 45, 14), -(4126052, 45, 15), -(4126375, 45, 2), -(4126377, 45, 3), -(4126378, 45, 7), -(4126383, 45, 11), -(4126384, 45, 11), -(4126386, 45, 11), -(4126394, 45, 15), -(4127125, 45, 8), -(4127126, 45, 8), -(4127132, 45, 9), -(4127137, 45, 12), -(4127141, 45, 12), -(4142953, 41, 10), -(4142959, 41, 13), -(4142960, 41, 9), -(4143007, 41, 8), -(4143009, 41, 9), -(4143011, 41, 8), -(4143012, 41, 11), -(4143014, 41, 9), -(4143143, 41, 13), -(4143144, 41, 13), -(4143146, 41, 13), -(4143147, 41, 13), -(4143154, 41, 13), -(4161435, 15, 1), -(4161439, 15, 3), -(4161440, 15, 3), -(4161442, 15, 3), -(4161449, 15, 4), -(4161453, 15, 4), -(4161456, 15, 6), -(4161457, 15, 6), -(4161462, 15, 5), -(4162133, 17, 1), -(4162142, 17, 3), -(4162143, 17, 4), -(4162144, 17, 5), -(4162145, 17, 6), -(4162147, 17, 8), -(4162148, 17, 9), -(4162150, 17, 11), -(4162153, 17, 12), -(4162154, 17, 13), -(4162155, 17, 13), -(4162317, 17, 10), -(4162319, 17, 7), -(4162320, 17, 6), -(4162321, 17, 6), -(4162322, 17, 12), -(4162323, 17, 4), -(4162324, 17, 5), -(4162325, 17, 2), -(4162326, 17, 2), -(4162328, 17, 2), -(4162329, 17, 1), -(4164611, 17, 12), -(4164620, 17, 6), -(4164648, 17, 8), -(4164654, 17, 8), -(4164656, 17, 8), -(4164663, 17, 10), -(4164693, 17, 6), -(4164698, 17, 4), -(4164699, 17, 4), -(4164700, 17, 5), -(4164701, 17, 5), -(4164706, 17, 5), -(4164707, 17, 5), -(4164708, 17, 5), -(4164715, 17, 2), -(4164723, 17, 1), -(4164725, 17, 2), -(4164727, 17, 2), -(4164728, 17, 2), -(4164731, 17, 4), -(4164732, 17, 4), -(4164735, 17, 1), -(4164739, 17, 3), -(4164740, 17, 1), -(4164742, 17, 1), -(4164846, 18, 2), -(4164858, 18, 1), -(4164859, 18, 1), -(4164861, 18, 1), -(4164905, 18, 3), -(4164912, 18, 4), -(4164914, 18, 4), -(4164917, 18, 5), -(4164923, 18, 6), -(4164924, 18, 7), -(4164926, 18, 7), -(4164929, 18, 7), -(4164931, 18, 8), -(4164934, 18, 6), -(4164937, 18, 9), -(4164938, 18, 9), -(4164940, 18, 10), -(4164942, 18, 11), -(4164944, 18, 11), -(4164947, 18, 13), -(4164950, 18, 15), -(4164952, 18, 16), -(4164953, 18, 17), -(4164955, 18, 18), -(4164956, 18, 18), -(4164957, 18, 18), -(4164958, 18, 19), -(4165006, 18, 1), -(4165007, 18, 1), -(4165009, 18, 1), -(4165010, 18, 1), -(4165044, 18, 3), -(4165045, 18, 3), -(4165048, 18, 2), -(4165049, 18, 2), -(4165050, 18, 2), -(4165051, 18, 2), -(4165052, 18, 2), -(4165053, 18, 2), -(4165054, 18, 2), -(4165055, 18, 2), -(4165056, 18, 1), -(4165057, 18, 3), -(4165058, 18, 3), -(4165059, 18, 3), -(4165061, 18, 4), -(4165063, 18, 4), -(4165064, 18, 4), -(4165065, 18, 4), -(4165066, 18, 4), -(4165079, 18, 7), -(4165089, 18, 7), -(4165091, 18, 6), -(4165095, 18, 7), -(4165097, 18, 8), -(4165098, 18, 8), -(4165101, 18, 9), -(4165132, 18, 10), -(4165138, 18, 11), -(4165141, 18, 13), -(4165146, 18, 4), -(4165147, 18, 14), -(4165587, 18, 13), -(4165761, 19, 1), -(4165762, 19, 3), -(4165763, 19, 4), -(4165767, 19, 2), -(4165768, 19, 1), -(4165770, 19, 3), -(4165774, 19, 1), -(4165784, 19, 7), -(4165786, 19, 6), -(4165787, 19, 6), -(4165788, 19, 7), -(4165789, 19, 1), -(4165790, 19, 4), -(4165791, 19, 1), -(4165792, 19, 3), -(4165793, 19, 7), -(4165795, 19, 7), -(4165798, 19, 1), -(4165826, 19, 2), -(4165830, 30, 1), -(4165834, 30, 3), -(4165838, 30, 6), -(4165843, 30, 1), -(4165845, 30, 4), -(4165862, 30, 3), -(4165870, 30, 5), -(4170242, 8, 1), -(4170252, 8, 2), -(4170268, 8, 2), -(4170279, 8, 3), -(4170285, 8, 4), -(4170288, 8, 5), -(4170294, 8, 6), -(4170300, 8, 7), -(4170349, 8, 8), -(4170358, 8, 9), -(4170364, 8, 10), -(4170368, 8, 11), -(4170389, 8, 11), -(4170407, 8, 4), -(4170413, 8, 6), -(4170416, 8, 3), -(4170420, 8, 5), -(4170421, 8, 5), -(4170429, 8, 9), -(4170439, 8, 10), -(4170443, 8, 11), -(4170448, 8, 11), -(4175720, 16, 7), -(4191057, 6, 4), -(4191058, 6, 5), -(4191060, 6, 5), -(4191062, 6, 4), -(4191063, 6, 4), -(4191065, 6, 4), -(4191066, 6, 7), -(4191069, 6, 7), -(4191070, 6, 6), -(4191075, 6, 5), -(4191081, 6, 6), -(4200506, 17, 4), -(4200508, 17, 2), -(4203968, 20, 5), -(4203976, 20, 5), -(4203984, 20, 5), -(4204051, 21, 11), -(4204061, 21, 3), -(4204069, 21, 6), -(4204078, 21, 12), -(4204084, 21, 12), -(4204092, 21, 6), -(4218112, 20, 2), -(4218256, 20, 6), -(4218258, 20, 6), -(4218268, 21, 6), -(4230667, 32, 1), -(4230669, 32, 2), -(4230670, 32, 3), -(4230673, 32, 6), -(4230674, 32, 6), -(4230675, 32, 6), -(4230676, 32, 7), -(4230677, 32, 9), -(4230682, 32, 4), -(4230684, 32, 6), -(4230685, 32, 6), -(4230686, 32, 6), -(4230687, 32, 7), -(4230689, 32, 9), -(4230690, 32, 1), -(4235276, 38, 2), -(4235277, 38, 4), -(4235282, 38, 6), -(4235309, 38, 7), -(4235312, 38, 10), -(4236358, 15, 6), -(4237484, 38, 3), -(4237485, 38, 4), -(4237487, 38, 8), -(4237488, 38, 10), -(4238993, 86, 6), -(4238994, 86, 7), -(4238996, 86, 7), -(4239000, 86, 7), -(4239001, 86, 7), -(4239002, 86, 8), -(4239003, 86, 9), -(4239004, 86, 10), -(4239005, 86, 10), -(4239009, 86, 12), -(4241594, 20, 1), -(4241611, 21, 1), -(4241612, 21, 2), -(4241928, 45, 12), -(4242048, 45, 7), -(4242604, 15, 1), -(4242605, 15, 1), -(4242609, 15, 1), -(4242610, 15, 1), -(4247747, 53, 1), -(4247847, 53, 1), -(4247850, 53, 1), -(4247852, 53, 1), -(4247856, 53, 1), -(4247877, 53, 2), -(4247879, 53, 2), -(4247884, 53, 3), -(4247885, 53, 2), -(4247888, 53, 3), -(4247906, 53, 4), -(4247927, 53, 4), -(4248224, 53, 5), -(4248230, 53, 5), -(4248232, 53, 5), -(4248236, 53, 5), -(4248241, 53, 5), -(4248262, 53, 6), -(4248265, 53, 6), -(4248272, 53, 7), -(4248277, 53, 7), -(4248291, 53, 8), -(4248293, 53, 9), -(4248308, 53, 9), -(4248340, 53, 6), -(4248346, 53, 10), -(4248351, 53, 10), -(4248359, 53, 11), -(4248390, 53, 12), -(4248398, 53, 12), -(4248402, 53, 12), -(4248430, 53, 12), -(4248444, 53, 13), -(4248486, 53, 13), -(4248488, 53, 13), -(4248490, 53, 14), -(4248491, 53, 15), -(4248517, 53, 16), -(4248520, 53, 16), -(4248523, 53, 16), -(4248529, 53, 16), -(4248537, 53, 16), -(4248539, 53, 17), -(4248613, 53, 16), -(4248638, 53, 16), -(4248684, 53, 16), -(4248689, 53, 18), -(4248796, 53, 19), -(4248833, 53, 19), -(4248837, 53, 19), -(4248842, 53, 20), -(4248886, 53, 21), -(4248889, 53, 21), -(4248890, 53, 21), -(4248892, 53, 22), -(4248922, 53, 1), -(4248924, 53, 1), -(4248926, 53, 1), -(4248931, 53, 1), -(4248933, 53, 1), -(4248935, 53, 1), -(4248936, 53, 1), -(4248942, 53, 1), -(4248943, 53, 1), -(4248947, 53, 1), -(4248950, 53, 1), -(4248965, 53, 3), -(4248968, 53, 3), -(4248971, 53, 3), -(4248972, 53, 4), -(4248975, 53, 4), -(4248976, 53, 4), -(4248982, 53, 4), -(4248988, 53, 4), -(4249002, 53, 5), -(4249008, 53, 5), -(4249027, 53, 7), -(4249037, 53, 9), -(4249038, 53, 9), -(4249041, 53, 9), -(4249047, 53, 8), -(4249060, 53, 19), -(4249068, 53, 19), -(4249070, 53, 18), -(4249075, 53, 18), -(4249078, 53, 16), -(4249084, 53, 16), -(4249089, 53, 16), -(4249092, 53, 20), -(4249093, 53, 1), -(4249094, 53, 20), -(4249565, 53, 10), -(4249569, 53, 12), -(4249570, 53, 12), -(4249572, 53, 12), -(4249573, 53, 12), -(4249574, 53, 12), -(4249577, 53, 12), -(4249587, 53, 12), -(4249589, 53, 12), -(4249605, 53, 15), -(4249617, 53, 14), -(4249639, 53, 1), -(4249643, 53, 1), -(4251428, 53, 4), -(4262477, 38, 6), -(4262478, 38, 6), -(4278339, 43, 2), -(4278406, 43, 2), -(4278410, 43, 2), -(4278415, 43, 4), -(4278417, 43, 5), -(4278419, 43, 5), -(4278420, 43, 5), -(4278432, 43, 5), -(4278438, 43, 4), -(4278461, 43, 7), -(4278472, 43, 8), -(4278474, 43, 8), -(4278494, 43, 8), -(4279992, 43, 9), -(4280840, 43, 10), -(4282568, 43, 11), -(4282573, 43, 12), -(4282574, 43, 13), -(4282585, 43, 14), -(4282592, 43, 13), -(4282598, 43, 16), -(4283510, 43, 8), -(4283661, 43, 10), -(4284218, 43, 2), -(4284220, 43, 8), -(4284346, 43, 9), -(4284350, 43, 10), -(4284353, 43, 12), -(4284354, 43, 13), -(4284356, 43, 11), -(4284479, 43, 14), -(4284483, 43, 16), -(4284485, 43, 8), -(4284655, 71, 1), -(4284668, 71, 7), -(4284672, 71, 10), -(4284679, 71, 3), -(4287170, 86, 8), -(4287171, 86, 8), -(4287437, 71, 9), -(4287440, 71, 12), -(4303212, 71, 13), -(4303238, 71, 2), -(4303276, 71, 1), -(4303280, 71, 2), -(4303285, 71, 6), -(4303288, 71, 10), -(4310468, 19, 1), -(4310490, 19, 4), -(4310494, 19, 4), -(4311173, 19, 3), -(4311182, 19, 4), -(4313896, 32, 4), -(4313898, 32, 8), -(4313956, 38, 3), -(4313961, 38, 5), -(4313968, 38, 7), -(4313975, 103, 15), -(4317154, 71, 4), -(4317155, 71, 5), -(4317176, 71, 3), -(4317193, 71, 8), -(4317200, 71, 11), -(4322392, 47, 1), -(4322393, 47, 2), -(4322394, 47, 2), -(4322395, 47, 2), -(4322396, 47, 3), -(4322398, 47, 2), -(4322399, 47, 3), -(4322400, 47, 3), -(4322404, 47, 4), -(4322408, 47, 4), -(4322411, 47, 4), -(4322417, 47, 6), -(4322427, 47, 7), -(4322428, 47, 7), -(4322429, 47, 7), -(4322431, 47, 8), -(4322434, 47, 7), -(4322439, 47, 5), -(4322441, 47, 15), -(4322442, 47, 10), -(4322444, 47, 10), -(4322445, 47, 10), -(4322449, 47, 11), -(4322453, 47, 11), -(4322455, 47, 13), -(4322458, 47, 12), -(4322459, 47, 12), -(4322841, 103, 12), -(4322860, 37, 1), -(4322861, 37, 1), -(4322862, 37, 1), -(4322864, 37, 1), -(4322867, 37, 3), -(4322868, 37, 3), -(4322870, 37, 3), -(4322871, 37, 4), -(4322872, 37, 5), -(4322969, 37, 5), -(4322970, 37, 5), -(4322971, 37, 6), -(4322973, 37, 6), -(4322974, 37, 7), -(4322975, 37, 8), -(4322976, 37, 8), -(4322977, 37, 8), -(4322978, 37, 8), -(4322979, 37, 9), -(4323354, 85, 11), -(4323360, 85, 11), -(4323383, 85, 8), -(4323387, 85, 8), -(4323412, 85, 8), -(4323414, 85, 8), -(4323419, 85, 9), -(4323420, 85, 9), -(4323427, 85, 10), -(4323428, 85, 10), -(4323429, 85, 10), -(4323431, 85, 11), -(4323432, 85, 8), -(4328706, 103, 13), -(4328707, 103, 12), -(4328816, 103, 12), -(4328833, 103, 12), -(4328892, 103, 13), -(4328894, 103, 13), -(4328897, 103, 15), -(4328902, 103, 15), -(4332187, 21, 6), -(4332188, 21, 6), -(4332189, 21, 6), -(4332518, 20, 6), -(4332767, 53, 12), -(4332770, 53, 12), -(4333235, 20, 9), -(4334276, 20, 4), -(4334728, 16, 3), -(4334730, 16, 7), -(4334751, 30, 5), -(4334881, 21, 7), -(4334882, 21, 13), -(4334885, 7, 7), -(4335536, 5, 2), -(4335666, 43, 2), -(4335670, 43, 8), -(4373250, 20, 10), -(4373251, 20, 10), -(4373252, 20, 10), -(4373253, 20, 10), -(4374258, 18, 15), -(4374678, 16, 7), -(4374738, 20, 8), -(4374739, 20, 8), -(4395364, 134, 12), -(4404417, 134, 12), -(4404426, 134, 12), -(4404431, 134, 12), -(4404435, 134, 12), -(4404439, 134, 12), -(4404440, 134, 12), -(4404442, 134, 12), -(4404445, 134, 12), -(4404450, 134, 12), -(4404451, 134, 12), -(4404452, 134, 12), -(4481391, 142, 12), -(4481392, 142, 15), -(4481393, 142, 11), -(4481404, 142, 11), -(4481407, 142, 13), -(4481409, 142, 12), -(4481412, 142, 15), -(4481413, 142, 15), -(4481414, 142, 15), -(4481415, 142, 15), -(4481416, 142, 15), -(4481418, 142, 15), -(4488408, 139, 12), -(4488410, 139, 12), -(4488411, 139, 12), -(4488413, 139, 14), -(4488416, 139, 13), -(4488417, 139, 12), -(4488419, 139, 11), -(4488420, 139, 12), -(4488421, 139, 13), -(4488422, 139, 13), -(4488423, 139, 14), -(4488425, 139, 14), -(4488427, 139, 13), -(4488428, 139, 13), -(4488429, 139, 12), -(4488430, 139, 12), -(4488431, 139, 12), -(4488432, 139, 12), -(4488433, 139, 14), -(4488435, 139, 11), -(4488438, 139, 12), -(4489186, 71, 3), -(4489187, 71, 3), -(4489188, 71, 3), -(4489189, 71, 3), -(4489190, 71, 3), -(4489192, 71, 3), -(4489193, 71, 3), -(4489194, 71, 3), -(4489195, 71, 3), -(4489236, 71, 1), -(4489237, 71, 10), -(4515268, 142, 11), -(4515306, 142, 12), -(4515308, 142, 12), -(4515382, 142, 13), -(4515386, 142, 15), -(4515612, 139, 12), -(4515623, 139, 13), -(4515624, 139, 13), -(4515625, 139, 13), -(4515681, 139, 12), -(4515697, 139, 12), -(4515699, 139, 13), -(4515701, 139, 14), -(4515702, 139, 14), -(4515703, 139, 13), -(4515704, 139, 13), -(4515705, 139, 13), -(4515706, 139, 12), -(4515707, 139, 12), -(4515708, 139, 12), -(4515709, 139, 12), -(4515711, 139, 14), -(4515713, 139, 11), -(4516011, 139, 12), -(4517194, 139, 12), -(4559071, 157, 1), -(4559075, 157, 3), -(4559076, 157, 4), -(4559077, 157, 4), -(4559078, 157, 5), -(4559085, 157, 6), -(4559086, 157, 6), -(4559087, 157, 7), -(4559088, 157, 5), -(4559091, 157, 8), -(4559092, 157, 8), -(4559093, 157, 10), -(4559094, 157, 9), -(4569450, 145, 1), -(4569451, 145, 5), -(4569461, 145, 3), -(4569464, 145, 3), -(4569465, 145, 4), -(4569471, 145, 10), -(4569472, 145, 11), -(4569479, 145, 6), -(4586009, 4, 7), -(4627320, 145, 6), -(4627322, 145, 7), -(4627324, 145, 7), -(4627332, 145, 9), -(4630742, 145, 11), -(4634055, 151, 4), -(4634056, 151, 6), -(4634059, 151, 1), -(4634062, 151, 1), -(4634065, 151, 2), -(4634083, 151, 4), -(4634094, 151, 5), -(4634095, 151, 6), -(4634104, 151, 7), -(4634106, 151, 7), -(4634712, 151, 6), -(4634715, 151, 7), -(4635476, 148, 1), -(4635477, 148, 2), -(4635478, 148, 3), -(4635479, 148, 5), -(4635480, 148, 6), -(4639200, 151, 4), -(4639204, 151, 8), -(4639208, 151, 6), -(4660176, 165, 1), -(4660177, 165, 1), -(4660178, 165, 2), -(4660179, 165, 2), -(4660180, 165, 3), -(4660181, 165, 3), -(4660182, 165, 4), -(4660183, 165, 5), -(4660184, 165, 6), -(4660185, 165, 7), -(4660186, 165, 8), -(4660187, 165, 9), -(4660189, 165, 11), -(4660190, 165, 2), -(4660194, 165, 3), -(4660195, 165, 11), -(4660197, 165, 12), -(4660198, 165, 13), -(4665752, 18, 11), -(4665756, 18, 11), -(4665759, 18, 11), -(4665766, 18, 11), -(4665773, 18, 11), -(4665788, 30, 4), -(4695119, 148, 5), -(4721268, 157, 10), -(4721270, 157, 11), -(4721271, 157, 11), -(4721272, 157, 12), -(4721273, 157, 13), -(4755366, 18, 18), -(4755385, 165, 11), -(4755389, 165, 12), -(4755390, 165, 13), -(4757557, 168, 4), -(4757558, 168, 5), -(4757560, 168, 5), -(4757561, 168, 6), -(4757563, 168, 8), -(4757565, 168, 9), -(4757566, 168, 10), -(4757569, 168, 11), -(4759603, 164, 12), -(4759604, 164, 12), -(4759652, 164, 13), -(4759654, 164, 14), -(4760563, 164, 12), -(4760674, 164, 12), -(4760676, 164, 12), -(4760683, 164, 12), -(4760685, 164, 12), -(4760689, 164, 14), -(4768065, 169, 1), -(4768067, 169, 1), -(4768073, 169, 7), -(4768082, 169, 8), -(4768083, 169, 8), -(4768084, 169, 8), -(4768085, 169, 9), -(4768087, 169, 1), -(4768094, 169, 7), -(4768099, 169, 6), -(4768100, 169, 8), -(4768101, 169, 8), -(4768102, 169, 9), -(4768103, 169, 7), -(4889986, 7, 10), -(4889987, 7, 3), -(4889991, 7, 3), -(4889995, 7, 3), -(4890336, 182, 1), -(4890497, 182, 1), -(4890506, 182, 3), -(4890535, 182, 3), -(4890651, 182, 3), -(4890664, 182, 12), -(4890679, 182, 9), -(4890766, 182, 9), -(4890770, 182, 10), -(4890776, 182, 10), -(4890780, 182, 11), -(4890784, 182, 12), -(4890786, 182, 13), -(4890788, 182, 14), -(4890791, 182, 15), -(4902564, 190, 6), -(4902565, 190, 6), -(4902566, 190, 7), -(4902567, 190, 8), -(4902568, 190, 8), -(4902569, 190, 8), -(4902571, 190, 10), -(4902572, 190, 11), -(4902573, 190, 8), -(4972550, 168, 1), -(4972551, 168, 2), -(4980983, 174, 1), -(4980985, 174, 2), -(4980993, 174, 2), -(4980994, 174, 4), -(4980995, 174, 4), -(4980997, 174, 5), -(4980998, 174, 5), -(4980999, 174, 5), -(4981002, 174, 6), -(4981003, 174, 6), -(4981004, 174, 7), -(4981005, 174, 7), -(4981006, 174, 7), -(4981007, 174, 8), -(4981009, 174, 9), -(4981010, 174, 10), -(4982004, 169, 2), -(4982007, 169, 3), -(4982009, 169, 3), -(4982039, 169, 4), -(4982041, 169, 5), -(4982050, 169, 5), -(4982051, 169, 6), -(5018506, 169, 3), -(5018517, 169, 4), -(5018518, 169, 4), -(5018519, 169, 5), -(5018520, 169, 5), -(5018524, 169, 7), -(5018525, 169, 7), -(5018526, 169, 9), -(5018528, 169, 9), -(5032226, 182, 3), -(5034828, 182, 15), -(5034833, 182, 15), -(5034834, 182, 15), -(5119555, 169, 3), -(5119560, 169, 3), -(5321547, 190, 11), -(5321639, 190, 7), -(5348496, 182, 10), -(5476910, 182, 3), -(5485941, 182, 9), -(5579669, 203, 10), -(5680661, 203, 10), -(5681112, 203, 9), -(5681115, 203, 11), -(5681121, 203, 10), -(5681124, 85, 11), -(5681153, 203, 10), -(5681166, 203, 11), -(5759673, 243, 1), -(5759683, 243, 5), -(5759685, 243, 5), -(5759692, 243, 6), -(5759696, 243, 7), -(5759698, 243, 9), -(5759701, 243, 11), -(5759705, 243, 12), -(5759706, 243, 14), -(5759708, 243, 14), -(5762435, 243, 4), -(5762437, 243, 8), -(5762441, 243, 14), -(5795788, 252, 3), -(5795795, 252, 3), -(5795796, 252, 3), -(5840909, 252, 5), -(5840914, 252, 6), -(5840915, 252, 7), -(5840920, 252, 10), -(5840923, 252, 6), -(5858542, 239, 5), -(5864957, 230, 1), -(5865261, 230, 2), -(5865270, 230, 2), -(5865275, 230, 5), -(5865286, 230, 1), -(5865289, 230, 2), -(5868146, 243, 2), -(5868148, 243, 3), -(5868150, 243, 4), -(5868156, 243, 8), -(5868159, 243, 9), -(5868162, 243, 13), -(5868163, 243, 15), -(5874028, 237, 3), -(5874029, 237, 4), -(5874030, 237, 1), -(5874031, 237, 2), -(5874032, 237, 3), -(5878769, 248, 1), -(5879221, 241, 1), -(5896017, 211, 15), -(5908552, 252, 12), -(5908839, 248, 1), -(5908841, 248, 2), -(5908844, 248, 2), -(5908846, 248, 3), -(5908848, 248, 3), -(5908851, 248, 5), -(5908859, 248, 6), -(5908863, 248, 6), -(5908868, 248, 6), -(5908869, 248, 6), -(5909356, 248, 3), -(5909364, 248, 1), -(5909385, 248, 1), -(5909746, 211, 15), -(5909768, 211, 15), -(5909769, 211, 15), -(5909770, 211, 15), -(5909773, 211, 15), -(5909778, 211, 15), -(5909929, 214, 13), -(5909946, 214, 13), -(5909947, 214, 13), -(5909948, 214, 13), -(5909950, 214, 13), -(5909951, 214, 13), -(5909952, 214, 13), -(5909953, 214, 13), -(5909980, 214, 13), -(5910101, 216, 28), -(5910102, 216, 28), -(5910115, 216, 28), -(5910122, 216, 28), -(5910126, 216, 28), -(5910127, 216, 28), -(5910134, 216, 28), -(5910141, 216, 28), -(5910144, 216, 28), -(5910157, 216, 28), -(5910168, 216, 28), -(5910298, 255, 3), -(5910299, 255, 4), -(5910301, 239, 3), -(5910302, 239, 2), -(5910303, 239, 3), -(5910305, 239, 2), -(5910306, 239, 2), -(5910307, 239, 2), -(5910308, 239, 2), -(5911128, 241, 2), -(5911129, 241, 2), -(5911131, 241, 3), -(5911132, 241, 3), -(5911133, 241, 3), -(5911136, 241, 4), -(5911137, 241, 4), -(5911139, 241, 4), -(5911141, 241, 4), -(5911142, 241, 5), -(5911143, 241, 6), -(5911144, 241, 6), -(5911145, 241, 6), -(5911146, 241, 6), -(5911147, 241, 6), -(5911148, 241, 7), -(5911151, 241, 6), -(5911154, 241, 8), -(5911155, 241, 7), -(5911158, 241, 8), -(5911159, 241, 10), -(5911164, 241, 11), -(5911166, 241, 12), -(5911167, 241, 12), -(5911168, 241, 12), -(5911169, 241, 12), -(5911173, 241, 13), -(5911174, 241, 13), -(5911175, 241, 13), -(5911176, 241, 13), -(5911184, 241, 14), -(5911193, 241, 12), -(5911200, 241, 13), -(5911204, 241, 12), -(5911207, 241, 13), -(5911208, 241, 15), -(5913190, 213, 6), -(5913193, 214, 13), -(5913203, 216, 28), -(5915489, 211, 15), -(5915512, 211, 15), -(5915513, 211, 15), -(5915517, 211, 15), -(5915539, 211, 15), -(5915553, 211, 15), -(5915580, 211, 15), -(5915598, 211, 15), -(5915620, 211, 15), -(5915630, 211, 15), -(5915631, 211, 15), -(5915632, 211, 15), -(5915635, 211, 15), -(5915734, 211, 15), -(5915736, 211, 15), -(5915737, 211, 15), -(5915739, 211, 15), -(5915740, 211, 15), -(5915742, 211, 15), -(5917284, 211, 15), -(5917285, 211, 15), -(5917286, 211, 15), -(5917287, 211, 15), -(5917288, 211, 15), -(5917289, 211, 15), -(5917290, 211, 15), -(5917292, 211, 15), -(5917294, 211, 15), -(5917313, 211, 15), -(5917314, 211, 15), -(5917315, 211, 15), -(5917318, 211, 15), -(5917319, 211, 15), -(5917320, 211, 15), -(5917322, 211, 15), -(5917323, 211, 15), -(5917330, 211, 15), -(5917338, 211, 15), -(5917350, 211, 15), -(5917360, 211, 15), -(5917362, 211, 15), -(5917363, 211, 15), -(5917364, 211, 15), -(5919748, 213, 6), -(5919753, 213, 6), -(5919755, 213, 6), -(5919756, 213, 6), -(5919791, 213, 6), -(5919812, 213, 6), -(5919814, 213, 6), -(5919815, 213, 6), -(5919816, 213, 6), -(5919818, 213, 6), -(5919824, 213, 6), -(5919826, 213, 6), -(5919832, 213, 6), -(5919835, 213, 6), -(5919848, 213, 6), -(5919851, 213, 6), -(5919853, 213, 6), -(5919854, 213, 6), -(5919855, 213, 6), -(5919859, 213, 6), -(5919860, 213, 6), -(5919868, 213, 6), -(5919870, 213, 6), -(5919908, 213, 6), -(5919912, 213, 6), -(5919927, 213, 6), -(5919931, 213, 6), -(5919973, 213, 6), -(5920107, 213, 6), -(5920109, 213, 6), -(5920110, 213, 6), -(5920131, 213, 6), -(5920132, 213, 6), -(5920134, 213, 6), -(5920142, 213, 6), -(5920147, 213, 6), -(5921241, 214, 13), -(5921242, 214, 13), -(5921246, 214, 13), -(5921247, 214, 13), -(5921249, 214, 13), -(5921250, 214, 13), -(5921251, 214, 13), -(5921252, 214, 13), -(5921253, 214, 13), -(5921254, 214, 13), -(5921260, 214, 13), -(5921262, 214, 13), -(5921264, 214, 13), -(5921265, 214, 13), -(5921266, 214, 13), -(5921267, 214, 13), -(5921268, 214, 13), -(5921273, 214, 13), -(5921274, 214, 13), -(5921275, 214, 13), -(5921276, 214, 13), -(5921277, 214, 13), -(5921278, 214, 13), -(5921279, 214, 13), -(5921280, 214, 13), -(5921281, 214, 13), -(5921283, 214, 13), -(5921287, 214, 13), -(5921288, 214, 13), -(5921290, 214, 13), -(5921292, 214, 13), -(5921858, 216, 28), -(5921871, 216, 28), -(5921880, 216, 28), -(5921881, 216, 28), -(5921882, 216, 28), -(5921937, 216, 28), -(5921940, 216, 28), -(5921941, 216, 28), -(5921942, 216, 28), -(5921945, 216, 28), -(5921953, 216, 28), -(5921955, 216, 28), -(5921956, 216, 28), -(5921962, 216, 28), -(5921966, 216, 28), -(5921968, 216, 28), -(5921969, 216, 28), -(5921970, 216, 28), -(5921980, 216, 28), -(5921981, 216, 28), -(5921982, 216, 28), -(5921987, 216, 28), -(5921988, 216, 28), -(5921996, 216, 28), -(5921998, 216, 28), -(5921999, 216, 28), -(5922000, 216, 28), -(5922002, 216, 28), -(5922004, 216, 28), -(5922005, 216, 28), -(5922006, 216, 28), -(5922007, 216, 28), -(5922008, 216, 28), -(5922009, 216, 28), -(5922010, 216, 28), -(5922013, 216, 28), -(5922559, 216, 28), -(5922560, 216, 28), -(5925606, 211, 15), -(5925609, 211, 15), -(5925610, 211, 15), -(5925611, 211, 15), -(5925612, 211, 15), -(5925613, 211, 15), -(5925616, 211, 15), -(5925618, 211, 15), -(5925619, 211, 15), -(5925620, 211, 15), -(5925622, 211, 15), -(5925623, 211, 15), -(5925808, 211, 15), -(5925812, 211, 15), -(5925813, 211, 15), -(5925814, 211, 15), -(5925815, 211, 15), -(5925817, 211, 15), -(5925819, 211, 15), -(5925820, 211, 15), -(5925821, 211, 15), -(5925823, 211, 15), -(5925825, 211, 15), -(5925827, 211, 15), -(5925830, 211, 15), -(5925835, 211, 15), -(5925836, 211, 15), -(5925837, 211, 15), -(5925838, 211, 15), -(5925840, 211, 15), -(5925841, 211, 15), -(5925842, 211, 15), -(5925844, 211, 15), -(5925845, 211, 15), -(5925848, 211, 15), -(5925849, 211, 15), -(5925850, 211, 15), -(5925852, 211, 15), -(5925854, 211, 15), -(5925858, 211, 15), -(5925860, 211, 15), -(5926068, 211, 15), -(5926069, 211, 15), -(5926070, 211, 15), -(5926071, 211, 15), -(5926072, 211, 15), -(5926073, 211, 15), -(5926074, 211, 15), -(5926075, 211, 15), -(5926076, 211, 15), -(5926078, 211, 15), -(5926079, 211, 15), -(5926080, 211, 15), -(5926081, 211, 15), -(5926082, 211, 15), -(5926083, 211, 15), -(5926085, 211, 15), -(5926086, 211, 15), -(5926088, 211, 15), -(5926090, 211, 15), -(5926091, 211, 15), -(5926092, 211, 15), -(5926093, 211, 15), -(5926094, 211, 15), -(5926095, 211, 15), -(5926096, 211, 15), -(5926097, 211, 15), -(5926099, 211, 15), -(5926100, 211, 15), -(5926103, 211, 15), -(5926104, 211, 15), -(5926105, 211, 15), -(5926106, 211, 15), -(5926107, 211, 15), -(5926109, 211, 15), -(5926110, 211, 15), -(5926111, 211, 15), -(5926112, 211, 15), -(5926113, 211, 15), -(5926114, 211, 15), -(5926115, 211, 15), -(5926117, 211, 15), -(5926118, 211, 15), -(5926119, 211, 15), -(5926128, 211, 15), -(5926129, 211, 15), -(5926130, 211, 15), -(5926131, 211, 15), -(5926132, 211, 15), -(5926133, 211, 15), -(5926134, 211, 15), -(5926135, 211, 15), -(5926136, 211, 15), -(5926138, 211, 15), -(5926139, 211, 15), -(5926141, 211, 15), -(5926142, 211, 15), -(5926143, 211, 15), -(5926144, 211, 15), -(5926146, 211, 15), -(5926157, 211, 15), -(5926158, 211, 15), -(5926160, 211, 15), -(5926161, 211, 15), -(5926162, 211, 15), -(5926163, 211, 15), -(5926164, 211, 15), -(5926563, 211, 15), -(5926566, 211, 15), -(5926610, 211, 15), -(5926611, 211, 15), -(5926614, 211, 15), -(5926615, 211, 15), -(5926616, 211, 15), -(5926619, 211, 15), -(5926622, 211, 15), -(5926623, 211, 15), -(5926627, 211, 15), -(5926630, 211, 15), -(5926637, 211, 15), -(5926639, 211, 15), -(5926644, 211, 15), -(5926651, 211, 15), -(5926653, 211, 15), -(5926654, 211, 15), -(5926663, 211, 15), -(5926665, 211, 15), -(5926666, 211, 15), -(5926667, 211, 15), -(5926668, 211, 15), -(5926670, 211, 15), -(5926671, 211, 15), -(5926672, 211, 15), -(5926674, 211, 15), -(5926676, 211, 15), -(5926680, 211, 15), -(5926681, 211, 15), -(5926683, 211, 15), -(5926685, 211, 15), -(5926686, 211, 15), -(5926687, 211, 15), -(5926696, 211, 15), -(5926702, 211, 15), -(5926709, 211, 15), -(5926710, 211, 15), -(5926711, 211, 15), -(5926713, 211, 15), -(5926717, 211, 15), -(5926718, 211, 15), -(5926720, 211, 15), -(5926723, 211, 15), -(5926724, 211, 15), -(5926727, 211, 15), -(5926729, 211, 15), -(5926734, 211, 15), -(5926736, 211, 15), -(5926737, 211, 15), -(5926739, 211, 15), -(5926740, 211, 15), -(5926742, 211, 15), -(5926744, 211, 15), -(5926745, 211, 15), -(5926753, 211, 15), -(5926757, 211, 15), -(5926758, 211, 15), -(5926759, 211, 15), -(5926760, 211, 15), -(5927843, 248, 1), -(5927869, 248, 5), -(5927903, 248, 1), -(5927964, 241, 1), -(5927966, 241, 5), -(5927968, 241, 6), -(5927969, 241, 7), -(5927970, 241, 8), -(5927971, 241, 10), -(5927972, 241, 14), -(5927973, 241, 15), -(5930418, 213, 6), -(5930419, 213, 6), -(5930420, 213, 6), -(5930421, 213, 6), -(5930422, 213, 6), -(5930423, 213, 6), -(5930424, 213, 6), -(5930425, 213, 6), -(5930426, 213, 6), -(5930427, 213, 6), -(5930428, 213, 6), -(5930429, 213, 6), -(5930430, 213, 6), -(5930431, 213, 6), -(5930432, 213, 6), -(5930433, 213, 6), -(5930434, 213, 6), -(5930435, 213, 6), -(5930436, 213, 6), -(5930437, 213, 6), -(5930438, 213, 6), -(5930439, 213, 6), -(5930440, 213, 6), -(5930441, 213, 6), -(5930442, 213, 6), -(5930443, 213, 6), -(5930444, 213, 6), -(5930445, 213, 6), -(5930446, 213, 6), -(5930447, 213, 6), -(5930448, 213, 6), -(5930449, 213, 6), -(5930450, 213, 6), -(5930451, 213, 6), -(5930452, 213, 6), -(5930453, 213, 6), -(5930454, 213, 6), -(5930455, 213, 6), -(5930456, 213, 6), -(5930457, 213, 6), -(5930458, 213, 6), -(5930459, 213, 6), -(5930460, 213, 6), -(5930461, 213, 6), -(5930462, 213, 6), -(5930463, 213, 6), -(5930464, 213, 6), -(5930465, 213, 6), -(5930466, 213, 6), -(5930467, 213, 6), -(5930468, 213, 6), -(5930469, 213, 6), -(5930470, 213, 6), -(5930471, 213, 6), -(5930472, 213, 6), -(5930473, 213, 6), -(5930474, 213, 6), -(5930475, 213, 6), -(5930476, 213, 6), -(5930477, 213, 6), -(5930478, 213, 6), -(5930479, 213, 6), -(5930480, 213, 6), -(5930481, 213, 6), -(5930482, 213, 6), -(5930483, 213, 6), -(5930484, 213, 6), -(5930485, 213, 6), -(5930486, 213, 6), -(5930487, 213, 6), -(5930488, 213, 6), -(5930489, 213, 6), -(5930490, 213, 6), -(5930491, 213, 6), -(5930492, 213, 6), -(5930493, 213, 6), -(5930494, 213, 6), -(5930495, 213, 6), -(5930496, 213, 6), -(5930497, 213, 6), -(5930498, 213, 6), -(5930499, 213, 6), -(5930500, 213, 6), -(5933083, 216, 28), -(5933084, 216, 28), -(5933085, 216, 28), -(5933086, 216, 28), -(5933087, 216, 28), -(5933088, 216, 28), -(5933089, 216, 28), -(5933090, 216, 28), -(5933091, 216, 28), -(5933092, 216, 28), -(5933093, 216, 28), -(5933094, 216, 28), -(5933095, 216, 28), -(5933096, 216, 28), -(5933097, 216, 28), -(5933098, 216, 28), -(5933099, 216, 28), -(5933100, 216, 28), -(5933101, 216, 28), -(5933102, 216, 28), -(5933103, 216, 28), -(5933104, 216, 28), -(5933105, 216, 28), -(5933106, 216, 28), -(5933107, 216, 28), -(5933108, 216, 28), -(5933109, 216, 28), -(5933110, 216, 28), -(5933111, 216, 28), -(5933112, 216, 28), -(5933113, 216, 28), -(5933114, 216, 28), -(5933115, 216, 28), -(5933116, 216, 28), -(5933117, 216, 28), -(5933118, 216, 28), -(5933119, 216, 28), -(5933120, 216, 28), -(5933121, 216, 28), -(5933122, 216, 28), -(5933123, 216, 28), -(5933124, 216, 28), -(5933125, 216, 28), -(5933126, 216, 28), -(5933127, 216, 28), -(5933128, 216, 28), -(5933129, 216, 28), -(5933130, 216, 28), -(5933131, 216, 28), -(5933132, 216, 28), -(5933133, 216, 28), -(5933134, 216, 28), -(5933135, 216, 28), -(5933136, 216, 28), -(5933137, 216, 28), -(5933138, 216, 28), -(5933139, 216, 28), -(5933140, 216, 28), -(5933141, 216, 28), -(5933142, 216, 28), -(5933143, 216, 28), -(5933144, 216, 28), -(5933145, 216, 28), -(5933146, 216, 28), -(5933147, 216, 28), -(5933148, 216, 28), -(5933149, 216, 28), -(5933150, 216, 28), -(5933151, 216, 28), -(5933152, 216, 28), -(5933153, 216, 28), -(5933154, 216, 28), -(5933155, 216, 28), -(5933156, 216, 28), -(5933157, 216, 28), -(5933158, 216, 28), -(5933159, 216, 28), -(5933160, 216, 28), -(5933161, 216, 28), -(5933162, 216, 28), -(5933163, 216, 28), -(5933164, 216, 28), -(5933165, 216, 28), -(5933166, 216, 28), -(5933167, 216, 28), -(5933168, 216, 28), -(5933169, 216, 28), -(5933170, 216, 28), -(5933171, 216, 28), -(5933172, 216, 28), -(5933173, 216, 28), -(5933174, 216, 28), -(5933175, 216, 28), -(5933176, 216, 28), -(5933177, 216, 28), -(5933178, 216, 28), -(5933179, 216, 28), -(5933180, 216, 28), -(5933181, 216, 28), -(5933182, 216, 28), -(5933183, 216, 28), -(5933184, 216, 28), -(5933185, 216, 28), -(5933186, 216, 28), -(5933187, 216, 28), -(5933188, 216, 28), -(5933189, 216, 28), -(5933190, 216, 28), -(5933191, 216, 28), -(5933192, 216, 28), -(5933193, 216, 28), -(5933194, 216, 28), -(5933195, 216, 28), -(5933196, 216, 28), -(5933197, 216, 28), -(5933198, 216, 28), -(5933199, 216, 28), -(5933200, 216, 28), -(5933201, 216, 28), -(5933202, 216, 28), -(5933203, 216, 28), -(5933204, 216, 28), -(5933205, 216, 28), -(5933206, 216, 28), -(5933207, 216, 28), -(5933208, 216, 28), -(5933209, 216, 28), -(5933210, 216, 28), -(5933211, 216, 28), -(5933212, 216, 28), -(5933213, 216, 28), -(5933214, 216, 28), -(5933215, 216, 28), -(5933216, 216, 28), -(5933217, 216, 28), -(5933218, 216, 28), -(5933371, 214, 13), -(5933372, 214, 13), -(5933373, 214, 13), -(5933374, 214, 13), -(5933375, 214, 13), -(5933376, 214, 13), -(5933377, 214, 13), -(5933378, 214, 13), -(5933379, 214, 13), -(5933380, 214, 13), -(5933381, 214, 13), -(5933382, 214, 13), -(5933383, 214, 13), -(5933384, 214, 13), -(5933385, 214, 13), -(5933386, 214, 13), -(5933387, 214, 13), -(5933388, 214, 13), -(5933389, 214, 13), -(5933390, 214, 13), -(5933391, 214, 13), -(5933392, 214, 13), -(5933393, 214, 13), -(5933394, 214, 13), -(5933395, 214, 13), -(5933396, 214, 13), -(5933397, 214, 13), -(5933398, 214, 13), -(5933399, 214, 13), -(5933400, 214, 13), -(5933401, 214, 13), -(5933402, 214, 13), -(5933403, 214, 13), -(5933404, 214, 13), -(5933405, 214, 13), -(5933406, 214, 13), -(5933407, 214, 13), -(5933408, 214, 13), -(5933409, 214, 13), -(5933410, 214, 13), -(5933411, 214, 13), -(5933412, 214, 13), -(5933413, 214, 13), -(5933414, 214, 13), -(5933415, 214, 13), -(5933416, 214, 13), -(5933417, 214, 13), -(5933418, 214, 13), -(5933419, 214, 13), -(5933420, 214, 13), -(5933421, 214, 13), -(5933422, 214, 13), -(5933423, 214, 13), -(5933424, 214, 13), -(5933425, 214, 13), -(5933426, 214, 13), -(5933427, 214, 13), -(5933428, 214, 13), -(5933429, 214, 13), -(5933430, 214, 13), -(5933431, 214, 13), -(5933432, 214, 13), -(5933433, 214, 13), -(5933434, 214, 13), -(5933435, 214, 13), -(5933436, 214, 13), -(5933437, 214, 13), -(5933438, 214, 13), -(5933439, 214, 13), -(5933440, 214, 13), -(5933441, 214, 13), -(5933442, 214, 13), -(5933443, 214, 13), -(5933444, 214, 13), -(5933445, 214, 13), -(5933446, 214, 13), -(5933447, 214, 13), -(5933448, 214, 13), -(5933449, 214, 13), -(5933450, 214, 13), -(5933451, 214, 13), -(5933452, 214, 13), -(5933453, 214, 13), -(5933454, 214, 13), -(5933455, 214, 13), -(5933456, 214, 13), -(5933457, 214, 13), -(5933458, 214, 13), -(5933459, 214, 13), -(5933460, 214, 13), -(5933461, 214, 13), -(5933462, 214, 13), -(5933463, 214, 13), -(5933464, 214, 13), -(5933465, 214, 13), -(5933466, 214, 13), -(5933467, 214, 13), -(5933468, 214, 13), -(5933469, 214, 13), -(5933470, 214, 13), -(5933471, 214, 13), -(5933472, 214, 13), -(5933473, 214, 13), -(5933474, 214, 13), -(5933475, 214, 13), -(5933476, 214, 13), -(5933477, 214, 13), -(5933478, 214, 13), -(5933479, 214, 13), -(5933480, 214, 13), -(5933481, 214, 13), -(5933482, 214, 13), -(5933483, 214, 13), -(5933484, 214, 13), -(5933485, 214, 13), -(5933486, 214, 13), -(5933487, 214, 13), -(5933488, 214, 13), -(5933489, 214, 13), -(5933490, 214, 13), -(5933491, 214, 13), -(5933492, 214, 13), -(5933493, 214, 13), -(5933494, 214, 13), -(5933495, 214, 13), -(5933496, 214, 13), -(5933497, 214, 13), -(5933498, 214, 13), -(5933499, 214, 13), -(5934961, 211, 15), -(5934962, 211, 15), -(5934964, 211, 15), -(5934965, 211, 15), -(5935045, 213, 6), -(5935100, 214, 13), -(5935104, 214, 13), -(5935105, 214, 13), -(5935119, 214, 13), -(5935490, 216, 28), -(5935520, 216, 28), -(5935521, 216, 28), -(5935525, 216, 28), -(5936097, 216, 28), -(5936102, 216, 28), -(5936113, 216, 28), -(5936125, 216, 28), -(5936127, 216, 28), -(5936562, 213, 6), -(5937520, 252, 3), -(5937536, 252, 10), -(5937626, 211, 15), -(5937643, 211, 15), -(5937644, 211, 15), -(5937659, 211, 15), -(5937660, 211, 15), -(5937661, 211, 15), -(5937662, 211, 15), -(5937663, 211, 15), -(5937665, 211, 15), -(5937666, 211, 15), -(5937667, 211, 15), -(5937668, 211, 15), -(5937669, 211, 15), -(5937670, 211, 15), -(5937671, 211, 15), -(5937672, 211, 15), -(5937673, 211, 15), -(5937674, 211, 15), -(5937675, 211, 15), -(5937676, 211, 15), -(5937677, 211, 15), -(5937678, 211, 15), -(5937679, 211, 15), -(5937680, 211, 15), -(5937681, 211, 15), -(5937682, 211, 15), -(5937683, 211, 15), -(5937684, 211, 15), -(5937685, 211, 15), -(5937686, 211, 15), -(5937687, 211, 15), -(5937688, 211, 15), -(5937689, 211, 15), -(5937690, 211, 15), -(5937691, 211, 15), -(5937692, 211, 15), -(5937788, 213, 6), -(5937789, 213, 6), -(5937791, 213, 6), -(5937798, 213, 6), -(5937800, 213, 6), -(5937801, 213, 6), -(5937802, 213, 6), -(5937803, 213, 6), -(5937804, 213, 6), -(5937805, 213, 6), -(5938265, 213, 6), -(5938270, 213, 6), -(5938281, 213, 6), -(5938291, 213, 6), -(5938292, 213, 6), -(5938293, 213, 6), -(5938296, 213, 6), -(5938298, 213, 6), -(5938299, 213, 6), -(5938300, 213, 6), -(5938302, 213, 6), -(5938305, 213, 6), -(5938307, 213, 6), -(5938308, 213, 6), -(5938310, 213, 6), -(5938311, 213, 6), -(5938314, 213, 6), -(5938315, 213, 6), -(5938317, 213, 6), -(5938318, 213, 6), -(5938319, 213, 6), -(5938321, 213, 6), -(5938323, 213, 6), -(5938344, 214, 13), -(5938387, 214, 13), -(5938388, 214, 13), -(5938389, 214, 13), -(5938390, 214, 13), -(5938391, 214, 13), -(5938392, 214, 13), -(5938393, 214, 13), -(5938394, 214, 13), -(5938395, 214, 13), -(5938396, 214, 13), -(5938397, 214, 13), -(5938398, 214, 13), -(5938399, 214, 13), -(5938400, 214, 13), -(5938401, 214, 13), -(5938402, 214, 13), -(5938403, 214, 13), -(5938404, 214, 13), -(5938405, 214, 13), -(5938406, 214, 13), -(5938407, 214, 13), -(5938408, 214, 13), -(5938409, 214, 13), -(5938410, 214, 13), -(5938411, 214, 13), -(5938412, 214, 13), -(5938413, 214, 13), -(5938414, 214, 13), -(5938416, 214, 13), -(5938417, 214, 13), -(5938418, 214, 13), -(5938419, 214, 13), -(5938781, 216, 28), -(5938782, 216, 28), -(5938783, 216, 28), -(5938784, 216, 28), -(5938785, 216, 28), -(5938786, 216, 28), -(5938787, 216, 28), -(5938788, 216, 28), -(5938789, 216, 28), -(5938790, 216, 28), -(5938791, 216, 28), -(5938792, 216, 28), -(5938793, 216, 28), -(5938794, 216, 28), -(5938795, 216, 28), -(5938796, 216, 28), -(5938797, 216, 28), -(5938798, 216, 28), -(5938799, 216, 28), -(5938800, 216, 28), -(5938801, 216, 28), -(5938802, 216, 28), -(5938803, 216, 28), -(5938804, 216, 28), -(5938805, 216, 28), -(5938806, 216, 28), -(5938807, 216, 28), -(5938808, 216, 28), -(5938809, 216, 28), -(5938810, 216, 28), -(5938811, 216, 28), -(5938812, 216, 28), -(5938813, 216, 28), -(5938814, 216, 28), -(5938815, 216, 28), -(5938816, 216, 28), -(5953591, 248, 1), -(5953592, 248, 3), -(5960788, 216, 28), -(5960797, 211, 15), -(5960798, 211, 15), -(5960799, 211, 15), -(5960800, 211, 15), -(5960801, 211, 15), -(5960802, 211, 15), -(5960803, 211, 15), -(5960805, 211, 15), -(5960806, 211, 15), -(5960807, 211, 15), -(5964409, 262, 1), -(5964410, 262, 1), -(5964418, 262, 1), -(5964439, 262, 2), -(5964441, 262, 1), -(5964449, 262, 1), -(5964457, 262, 1), -(6032372, 262, 2), -(6046582, 255, 3), -(6070090, 273, 9), -(6070269, 273, 9), -(6070278, 273, 9), -(6095410, 272, 13), -(6098955, 272, 12), -(6123737, 276, 12), -(6123738, 276, 1), -(6123739, 276, 1), -(6123740, 276, 1), -(6123741, 276, 1), -(6123742, 276, 1), -(6123743, 276, 1), -(6123744, 276, 1), -(6123745, 276, 1), -(6123746, 276, 12), -(6161036, 276, 12), -(6161039, 276, 1), -(6161040, 276, 1), -(6161041, 276, 1), -(6161042, 276, 1), -(6161048, 276, 17), -(6161083, 279, 12), -(6163807, 276, 1), -(6163808, 276, 19), -(6163809, 276, 20), -(6163810, 276, 21), -(6163811, 276, 9), -(6163812, 276, 8), -(6163813, 276, 7), -(6163814, 276, 6), -(6163815, 276, 4), -(6163816, 276, 16), -(6163817, 276, 16), -(6163818, 276, 16), -(6170636, 276, 17), -(6170637, 276, 2), -(6170638, 276, 2), -(6170639, 276, 3), -(6170640, 276, 2), -(6170641, 276, 3), -(6170642, 276, 3), -(6170643, 276, 3), -(6170644, 276, 10), -(6170645, 276, 10), -(6170646, 276, 10), -(6170647, 276, 11), -(6170648, 276, 11), -(6170649, 276, 2), -(6170650, 276, 11), -(6170651, 276, 1), -(6170652, 276, 1), -(6170653, 276, 4), -(6170654, 276, 4), -(6170655, 276, 6), -(6170656, 276, 6), -(6170657, 276, 5), -(6170658, 276, 7), -(6170659, 276, 7), -(6170660, 276, 8), -(6170661, 276, 8), -(6170662, 276, 9), -(6170663, 276, 12), -(6170664, 276, 13), -(6170665, 276, 14), -(6170666, 276, 15), -(6170667, 276, 16), -(6170668, 276, 1), -(6170669, 276, 19), -(6170670, 276, 20), -(6170671, 276, 21), -(6170672, 276, 9), -(6170673, 276, 8), -(6170674, 276, 7), -(6170675, 276, 6), -(6170676, 276, 4), -(6170677, 276, 1), -(6171334, 276, 17), -(6171335, 276, 12), -(6171336, 276, 13), -(6171337, 276, 12), -(6171338, 276, 11), -(6171339, 276, 8), -(6171340, 276, 5), -(6171341, 276, 1), -(6171342, 276, 12), -(6234179, 297, 1), -(6234181, 297, 3), -(6234182, 297, 4), -(6234184, 297, 5), -(6234185, 297, 6), -(6234186, 297, 7), -(6234187, 297, 8), -(6234188, 297, 8), -(6234189, 297, 9), -(6234190, 297, 10), -(6236450, 279, 13), -(6236452, 279, 14), -(6236476, 286, 3), -(6236478, 286, 1), -(6236479, 286, 2), -(6236480, 286, 3), -(6236481, 286, 4), -(6236486, 286, 5), -(6236497, 288, 5), -(6236500, 288, 5), -(6236501, 288, 6), -(6236502, 288, 6), -(6236519, 289, 2), -(6238456, 213, 6), -(6238457, 213, 6), -(6238459, 213, 6), -(6242634, 279, 12), -(6242635, 279, 13), -(6242683, 279, 14), -(6268735, 303, 15), -(6268736, 303, 15), -(6271621, 303, 15), -(6280057, 297, 2), -(6280060, 297, 2), -(6280251, 297, 12), -(6280417, 297, 1), -(6280446, 297, 4), -(6280447, 297, 5), -(6280449, 297, 7), -(6280451, 297, 5), -(6280453, 297, 12), -(6288695, 303, 15), -(6331526, 312, 12), -(6402356, 313, 6), -(6402704, 313, 11), -(6407718, 214, 13), -(6407719, 214, 13), -(6407720, 214, 13), -(6407721, 214, 13), -(6407722, 214, 13), -(6421882, 297, 8), -(6515982, 313, 11), -(6564487, 340, 12), -(6599910, 356, 12), -(6599911, 356, 1), -(6599912, 356, 1), -(6599913, 356, 1), -(6599914, 356, 1), -(6599915, 356, 1), -(6599916, 356, 1), -(6599917, 356, 1), -(6599918, 356, 1), -(6599919, 356, 12), -(6599920, 356, 12), -(6599922, 356, 1), -(6599923, 356, 1), -(6599924, 356, 1), -(6599925, 356, 1), -(6599926, 356, 17), -(6599927, 356, 1), -(6599928, 356, 19), -(6599929, 356, 20), -(6599930, 356, 21), -(6599931, 356, 9), -(6599932, 356, 8), -(6599933, 356, 7), -(6599934, 356, 6), -(6599935, 356, 4), -(6599936, 356, 16), -(6599937, 356, 16), -(6599938, 356, 16), -(6599939, 356, 17), -(6599940, 356, 2), -(6599941, 356, 2), -(6599942, 356, 3), -(6599943, 356, 2), -(6599944, 356, 3), -(6599945, 356, 3), -(6599946, 356, 3), -(6599947, 356, 10), -(6599948, 356, 10), -(6599949, 356, 10), -(6599950, 356, 11), -(6599951, 356, 11), -(6599952, 356, 2), -(6599953, 356, 11), -(6599954, 356, 1), -(6599955, 356, 1), -(6599956, 356, 4), -(6599957, 356, 4), -(6599958, 356, 6), -(6599959, 356, 6), -(6599960, 356, 5), -(6599961, 356, 7), -(6599962, 356, 7), -(6599963, 356, 8), -(6599964, 356, 8), -(6599965, 356, 9), -(6599966, 356, 12), -(6599967, 356, 13), -(6599968, 356, 14), -(6599969, 356, 15), -(6599970, 356, 16), -(6599971, 356, 1), -(6599972, 356, 19), -(6599973, 356, 20), -(6599974, 356, 21), -(6599975, 356, 9), -(6599976, 356, 8), -(6599977, 356, 7), -(6599978, 356, 6), -(6599979, 356, 4), -(6599980, 356, 1), -(6599981, 356, 17), -(6599982, 356, 12), -(6599983, 356, 13), -(6599984, 356, 12), -(6599985, 356, 11), -(6599986, 356, 8), -(6599987, 356, 5), -(6599988, 356, 1), -(6599989, 356, 12), -(6622965, 356, 17), -(6627252, 345, 13), -(6627266, 345, 13), -(6740473, 345, 13), -(6782060, 352, 12), -(6784914, 356, 2), -(6784915, 356, 2), -(6787121, 356, 3), -(6886431, 356, 2), -(6890477, 389, 1), -(6891617, 336, 1), -(6891627, 336, 1), -(6891637, 336, 2), -(6891692, 336, 3), -(6891694, 336, 5), -(6893032, 336, 6), -(6893241, 336, 7), -(6893758, 336, 9), -(6893761, 336, 11), -(6893762, 336, 11), -(6922034, 375, 1), -(6942997, 371, 13), -(6942999, 354, 10), -(6943038, 372, 30), -(6943043, 367, 8), -(6943044, 368, 21), -(6943045, 369, 17), -(6950667, 359, 1), -(6950676, 359, 2), -(6950680, 359, 3), -(6950685, 359, 4), -(6950720, 359, 4), -(6950723, 359, 5), -(6950726, 359, 6), -(6950727, 359, 7), -(6950728, 359, 8), -(6950731, 359, 8), -(6950777, 359, 9), -(6950784, 359, 9), -(6950788, 359, 10), -(6950798, 359, 11), -(6950799, 359, 12), -(6950811, 359, 14), -(6950815, 359, 15), -(6950824, 359, 15), -(6950847, 359, 8), -(6950853, 359, 8), -(6951063, 361, 9), -(6953721, 367, 2), -(6953722, 367, 4), -(6953723, 367, 3), -(6953726, 367, 3), -(6953738, 367, 5), -(6953772, 367, 1), -(6953773, 367, 1), -(6953776, 367, 1), -(6953780, 367, 6), -(6953786, 367, 7), -(6953788, 367, 8), -(6953789, 367, 2), -(6953790, 367, 10), -(6953792, 367, 22), -(6953800, 367, 23), -(6953802, 367, 27), -(6953804, 367, 19), -(6953807, 367, 21), -(6953811, 367, 24), -(6953814, 367, 27), -(6953815, 367, 27), -(6953816, 367, 27), -(6953817, 367, 27), -(6953818, 367, 27), -(6953819, 367, 27), -(6953820, 367, 27), -(6954096, 367, 1), -(6954100, 367, 1), -(6954246, 389, 3), -(6954248, 389, 4), -(6954278, 367, 1), -(6954280, 367, 3), -(6954281, 367, 3), -(6954284, 367, 4), -(6954287, 367, 5), -(6954295, 367, 6), -(6954296, 367, 6), -(6954297, 367, 5), -(6954298, 367, 6), -(6954300, 367, 8), -(6954302, 367, 8), -(6954311, 367, 8), -(6954328, 367, 11), -(6954522, 367, 4), -(6954780, 367, 11), -(6954781, 367, 11), -(6954784, 367, 11), -(6954791, 367, 11), -(6955593, 367, 15), -(6955601, 367, 15), -(6955610, 367, 18), -(6955618, 367, 18), -(6955619, 367, 18), -(6955623, 367, 22), -(6955625, 367, 22), -(6955627, 367, 22), -(6955631, 367, 22), -(6955632, 367, 22), -(6955633, 367, 22), -(6955643, 367, 17), -(6955645, 367, 17), -(6955646, 367, 17), -(6955647, 367, 17), -(6955648, 367, 17), -(6955649, 367, 17), -(6955650, 367, 22), -(6955651, 367, 28), -(6955652, 367, 28), -(6955653, 367, 28), -(6955654, 367, 28), -(6955655, 367, 28), -(6955656, 367, 28), -(6955657, 367, 28), -(6955658, 367, 28), -(6955659, 367, 28), -(6955660, 367, 28), -(6955661, 367, 28), -(6955662, 367, 22), -(6955663, 367, 28), -(6955664, 367, 28), -(6955666, 367, 28), -(6955667, 367, 20), -(6957295, 375, 1), -(6957309, 375, 2), -(6957314, 375, 2), -(6957316, 375, 2), -(6957345, 375, 4), -(6957347, 375, 5), -(6957348, 375, 5), -(6957349, 375, 6), -(6957357, 375, 6), -(6957359, 375, 7), -(6957361, 375, 8), -(6957363, 375, 8), -(6957364, 375, 10), -(6957365, 375, 10), -(6957366, 375, 11), -(6957367, 375, 11), -(6957368, 375, 12), -(6957369, 375, 13), -(6957370, 375, 13), -(6958837, 368, 1), -(6958838, 368, 16), -(6958839, 368, 13), -(6958840, 368, 13), -(6958841, 368, 13), -(6958842, 368, 17), -(6958843, 368, 17), -(6959180, 368, 18), -(6959190, 368, 30), -(6959196, 368, 29), -(6959201, 368, 29), -(6959202, 368, 29), -(6959204, 368, 29), -(6959205, 368, 29), -(6959210, 368, 28), -(6959270, 368, 20), -(6959276, 368, 20), -(6959284, 368, 20), -(6959315, 368, 20), -(6959321, 368, 20), -(6959322, 368, 20), -(6959332, 368, 20), -(6959337, 368, 21), -(6959418, 368, 9), -(6959448, 368, 6), -(6967602, 368, 22), -(6967981, 368, 22), -(6968551, 368, 22), -(6969053, 368, 22), -(6969094, 368, 8), -(6969098, 368, 8), -(6969100, 368, 8), -(6969102, 368, 8), -(6969105, 368, 8), -(6969117, 368, 8), -(6969118, 368, 8), -(6969119, 368, 8), -(6969120, 368, 8), -(6969121, 368, 8), -(6969122, 368, 8), -(6969455, 396, 1), -(6969457, 396, 2), -(6969461, 396, 2), -(6969463, 396, 3), -(6969464, 396, 3), -(6969467, 396, 3), -(6969468, 396, 3), -(6969470, 396, 5), -(6969475, 396, 6), -(6969478, 396, 6), -(6969486, 396, 7), -(6969492, 396, 7), -(6969496, 396, 7), -(6969507, 396, 7), -(6969509, 396, 8), -(6969513, 396, 7), -(6969517, 396, 9), -(6969520, 396, 10), -(6969521, 396, 10), -(6969607, 396, 11), -(6969611, 396, 12), -(6969612, 396, 13), -(6969618, 368, 24), -(6969620, 368, 22), -(6969622, 368, 22), -(6969626, 368, 26), -(6969630, 368, 25), -(6969632, 368, 25), -(6969633, 368, 25), -(6969635, 368, 25), -(6970815, 369, 29), -(6970818, 369, 30), -(6970820, 369, 28), -(6970822, 369, 28), -(6970824, 369, 26), -(6970826, 369, 28), -(6970827, 369, 28), -(6970858, 369, 30), -(6970860, 369, 30), -(6970861, 369, 21), -(6970863, 369, 22), -(6971003, 369, 15), -(6971057, 369, 13), -(6971058, 369, 15), -(6971059, 369, 12), -(6971060, 369, 13), -(6971062, 369, 13), -(6971063, 369, 1), -(6971064, 369, 1), -(6971065, 369, 2), -(6971068, 369, 2), -(6971069, 369, 2), -(6971070, 369, 2), -(6971072, 369, 2), -(6971073, 369, 2), -(6971075, 369, 13), -(6971077, 369, 26), -(6971084, 369, 17), -(6971185, 369, 5), -(6971191, 369, 5), -(6971193, 369, 6), -(6971194, 369, 6), -(6971199, 369, 4), -(6971201, 369, 4), -(6971202, 369, 4), -(6971218, 369, 7), -(6971225, 369, 3), -(6971339, 369, 3), -(6971342, 369, 3), -(6971343, 369, 4), -(6971345, 369, 9), -(6971346, 369, 9), -(6971347, 369, 8), -(6971349, 369, 8), -(6971350, 369, 8), -(6971351, 369, 9), -(6971352, 369, 9), -(6971353, 369, 9), -(6971386, 369, 8), -(6971395, 369, 8), -(6971398, 369, 8), -(6971399, 369, 8), -(6971401, 369, 8), -(6971402, 369, 8), -(6971404, 369, 8), -(6971406, 369, 8), -(6971407, 369, 8), -(6971412, 369, 19), -(6971414, 369, 19), -(6971416, 369, 19), -(6971418, 369, 19), -(6971424, 369, 20), -(6971428, 369, 21), -(6971432, 369, 21), -(6971460, 369, 18), -(6971461, 369, 16), -(6971463, 369, 16), -(6971464, 369, 1), -(6971465, 369, 1), -(6971466, 369, 1), -(6971467, 369, 1), -(6971468, 369, 1), -(6971471, 369, 13), -(6971479, 369, 27), -(6971482, 369, 27), -(6971969, 369, 27), -(6971973, 369, 26), -(6971977, 369, 25), -(6971980, 369, 25), -(6971982, 369, 25), -(6971983, 369, 25), -(6971984, 369, 25), -(6971985, 369, 25), -(6971986, 369, 25), -(6971989, 369, 15), -(6971991, 369, 13), -(6971993, 369, 13), -(6971994, 369, 15), -(6971996, 369, 17), -(6971998, 369, 17), -(6972099, 371, 4), -(6972116, 371, 4), -(6972119, 371, 2), -(6972120, 371, 2), -(6972122, 371, 3), -(6972123, 371, 2), -(6972124, 371, 10), -(6972127, 371, 1), -(6972129, 371, 10), -(6972130, 371, 1), -(6972131, 371, 27), -(6972132, 371, 7), -(6972136, 371, 2), -(6972138, 371, 1), -(6972141, 371, 2); -INSERT INTO `discoveryinfo` (`id`, `map_id`, `discover_id`) VALUES -(6972145, 371, 2), -(6972153, 371, 4), -(6972155, 371, 3), -(6972157, 371, 3), -(6972158, 371, 3), -(6972169, 371, 10), -(6972171, 371, 12), -(6972175, 371, 12), -(6972176, 371, 12), -(6972422, 371, 12), -(6972423, 371, 12), -(6972424, 371, 12), -(6973154, 371, 12), -(6973156, 371, 12), -(6973157, 371, 11), -(6973158, 371, 11), -(6973160, 371, 11), -(6973163, 371, 11), -(6973166, 371, 11), -(6973168, 371, 22), -(6973172, 371, 21), -(6973186, 371, 20), -(6973189, 371, 23), -(6973192, 371, 23), -(6973193, 371, 24), -(6973200, 371, 26), -(6973201, 371, 23), -(6973209, 371, 28), -(6973213, 371, 30), -(6973214, 371, 29), -(6973215, 371, 23), -(6973223, 371, 29), -(6973224, 371, 29), -(6973225, 371, 17), -(6973231, 371, 17), -(6973232, 371, 16), -(6973233, 371, 15), -(6973236, 371, 16), -(6973237, 371, 16), -(6973238, 371, 17), -(6973241, 371, 17), -(6973242, 371, 16), -(6973243, 371, 17), -(6973251, 371, 13), -(6973906, 371, 8), -(6973923, 371, 8), -(6973969, 371, 7), -(6973991, 371, 7), -(6973998, 371, 7), -(6974005, 371, 19), -(6974006, 371, 19), -(6974007, 371, 19), -(6975746, 371, 12), -(6976755, 354, 5), -(6976758, 354, 3), -(6976760, 354, 10), -(6976762, 354, 9), -(6976763, 354, 8), -(6976765, 354, 28), -(6976768, 354, 30), -(6976773, 354, 21), -(6976823, 354, 10), -(6977088, 354, 23), -(6977089, 354, 22), -(6977100, 354, 24), -(6977101, 354, 24), -(6977102, 354, 25), -(6977106, 354, 19), -(6977145, 354, 18), -(6977146, 354, 17), -(6977148, 354, 1), -(6977200, 354, 3), -(6977202, 354, 6), -(6977203, 354, 6), -(6977204, 354, 6), -(6977205, 354, 3), -(6977208, 354, 6), -(6977254, 354, 28), -(6977257, 354, 30), -(6977258, 354, 30), -(6977260, 354, 30), -(6977261, 354, 30), -(6977262, 354, 30), -(6977275, 354, 30), -(6977280, 354, 30), -(6977285, 354, 30), -(6977286, 354, 30), -(6977287, 354, 30), -(6977290, 354, 30), -(6977293, 354, 30), -(6977335, 354, 30), -(6977436, 354, 28), -(6977459, 354, 26), -(6977464, 354, 26), -(6977465, 354, 26), -(6977467, 354, 26), -(6977470, 354, 26), -(6977472, 354, 26), -(6977478, 354, 25), -(6977481, 354, 25), -(6977488, 354, 25), -(6977489, 354, 25), -(6977495, 354, 24), -(6977497, 354, 24), -(6977499, 354, 22), -(6977502, 354, 22), -(6977509, 354, 22), -(6977514, 354, 22), -(6977518, 354, 22), -(6977533, 354, 22), -(6977552, 354, 22), -(6977561, 354, 10), -(6977566, 354, 16), -(6977567, 354, 16), -(6977570, 354, 19), -(6977576, 354, 19), -(6977579, 354, 19), -(6977581, 354, 13), -(6977586, 354, 12), -(6977591, 354, 12), -(6977592, 354, 12), -(6977594, 354, 13), -(6977649, 354, 19), -(6977651, 354, 19), -(6979969, 372, 3), -(6979985, 372, 3), -(6979987, 372, 3), -(6980003, 372, 3), -(6980011, 372, 5), -(6980019, 372, 5), -(6980024, 372, 8), -(6980026, 372, 8), -(6980073, 372, 5), -(6980078, 372, 30), -(6980079, 372, 30), -(6980080, 372, 30), -(6980082, 372, 30), -(6980083, 372, 30), -(6980084, 372, 30), -(6980087, 372, 30), -(6980090, 372, 30), -(6980108, 372, 21), -(6980117, 372, 20), -(6980124, 372, 20), -(6980126, 372, 20), -(6980128, 372, 18), -(6980134, 372, 17), -(6980135, 372, 17), -(6980136, 372, 17), -(6980137, 372, 17), -(6980138, 372, 16), -(6980140, 372, 15), -(6980142, 372, 16), -(6980143, 372, 16), -(6980145, 372, 15), -(6980150, 372, 1), -(6980155, 372, 2), -(6980157, 372, 29), -(6980160, 372, 29), -(6980161, 372, 29), -(6980187, 372, 22), -(6980188, 372, 26), -(6980190, 372, 7), -(6980212, 372, 30), -(6980214, 372, 9), -(6980218, 372, 11), -(6980223, 372, 7), -(6980229, 372, 8), -(6980250, 372, 8), -(6980251, 372, 8), -(6980252, 372, 3), -(6980253, 372, 3), -(6980256, 372, 3), -(6980257, 372, 3), -(6980258, 372, 3), -(6980259, 372, 17), -(6980260, 372, 19), -(6980262, 372, 18), -(6980263, 372, 18), -(6980264, 372, 18), -(6980265, 372, 18), -(6980266, 372, 18), -(6980267, 372, 18), -(6980271, 372, 18), -(6980273, 372, 18), -(6980275, 372, 30), -(6980277, 372, 22), -(6980283, 372, 20), -(6980284, 372, 23), -(6980285, 372, 25), -(6980311, 372, 26), -(6980313, 372, 26), -(6980323, 372, 25), -(6980325, 372, 25), -(6980333, 372, 24), -(6980334, 372, 25), -(6980336, 372, 25), -(6980337, 372, 26), -(6980347, 372, 27), -(6980355, 372, 27), -(6980357, 372, 27), -(6980358, 372, 2), -(6980359, 372, 2), -(6980366, 372, 1), -(6980368, 372, 2), -(6980383, 372, 25), -(6980387, 372, 26), -(6983070, 336, 3), -(6983076, 336, 7), -(6987034, 367, 1), -(6987035, 367, 1), -(6987036, 367, 1), -(6987037, 367, 2), -(6987038, 367, 2), -(6987039, 367, 2), -(6987040, 367, 2), -(6987041, 367, 3), -(6987042, 367, 3), -(6987043, 367, 3), -(6987044, 367, 4), -(6987045, 367, 4), -(6987046, 367, 4), -(6987047, 367, 5), -(6987048, 367, 5), -(6987049, 367, 5), -(6987050, 367, 6), -(6987051, 367, 6), -(6987052, 367, 6), -(6987053, 367, 7), -(6987054, 367, 7), -(6987055, 367, 7), -(6987056, 367, 8), -(6987057, 367, 8), -(6987058, 367, 8), -(6987059, 367, 2), -(6987060, 367, 10), -(6987061, 367, 11), -(6987062, 367, 11), -(6987063, 367, 11), -(6987064, 367, 11), -(6987065, 367, 11), -(6987067, 367, 25), -(6987068, 367, 25), -(6987070, 367, 13), -(6987071, 367, 13), -(6987072, 367, 13), -(6987073, 367, 12), -(6987074, 367, 14), -(6987075, 367, 14), -(6987076, 367, 15), -(6987077, 367, 15), -(6987078, 367, 15), -(6987079, 367, 24), -(6987080, 367, 25), -(6987081, 367, 25), -(6987082, 367, 26), -(6987083, 367, 27), -(6987084, 367, 27), -(6987085, 367, 27), -(6987086, 367, 27), -(6987087, 367, 28), -(6987088, 367, 28), -(6987089, 367, 28), -(6987090, 367, 28), -(6987091, 367, 28), -(6987092, 367, 30), -(6987093, 367, 30), -(6987094, 367, 30), -(6987095, 367, 29), -(6987096, 367, 23), -(6987097, 367, 23), -(6987098, 367, 8), -(6987099, 367, 16), -(6987100, 367, 16), -(6987101, 367, 17), -(6987102, 367, 17), -(6987103, 367, 22), -(6987104, 367, 22), -(6987105, 367, 22), -(6987106, 367, 21), -(6987107, 367, 21), -(6987108, 367, 18), -(6987109, 367, 18), -(6987110, 367, 19), -(6987111, 367, 20), -(6987112, 367, 10), -(6987113, 367, 10), -(6989593, 368, 1), -(6989594, 368, 1), -(6989595, 368, 1), -(6989596, 368, 1), -(6989597, 368, 3), -(6989598, 368, 3), -(6989599, 368, 2), -(6989600, 368, 1), -(6989601, 368, 2), -(6989602, 368, 2), -(6989603, 368, 14), -(6989604, 368, 14), -(6989605, 368, 14), -(6989606, 368, 15), -(6989607, 368, 15), -(6989608, 368, 15), -(6989609, 368, 17), -(6989610, 368, 17), -(6989611, 368, 17), -(6989612, 368, 16), -(6989613, 368, 16), -(6989614, 368, 16), -(6989615, 368, 16), -(6989616, 368, 16), -(6989617, 368, 18), -(6989618, 368, 18), -(6989619, 368, 18), -(6989620, 368, 18), -(6989621, 368, 18), -(6989622, 368, 30), -(6989623, 368, 30), -(6989624, 368, 30), -(6989625, 368, 30), -(6989626, 368, 30), -(6989627, 368, 29), -(6989628, 368, 29), -(6989629, 368, 31), -(6989630, 368, 28), -(6989631, 368, 28), -(6989632, 368, 19), -(6989633, 368, 19), -(6989634, 368, 20), -(6989635, 368, 20), -(6989636, 368, 19), -(6989637, 368, 20), -(6989638, 368, 27), -(6989639, 368, 27), -(6989640, 368, 27), -(6989641, 368, 26), -(6989642, 368, 26), -(6989643, 368, 26), -(6989644, 368, 24), -(6989645, 368, 24), -(6989646, 368, 25), -(6989647, 368, 25), -(6989648, 368, 25), -(6989649, 368, 25), -(6989650, 368, 25), -(6989651, 368, 23), -(6989652, 368, 21), -(6989653, 368, 21), -(6989654, 368, 21), -(6989655, 368, 21), -(6989656, 368, 11), -(6989657, 368, 11), -(6989658, 368, 11), -(6989659, 368, 11), -(6989660, 368, 11), -(6989661, 368, 11), -(6989662, 368, 11), -(6989663, 368, 11), -(6989664, 368, 13), -(6989665, 368, 12), -(6989666, 368, 4), -(6989667, 368, 4), -(6989668, 368, 4), -(6989669, 368, 5), -(6989670, 368, 5), -(6989671, 368, 5), -(6989672, 368, 10), -(6989673, 368, 10), -(6989674, 368, 10), -(6989675, 368, 22), -(6989676, 368, 22), -(6989677, 368, 22), -(6989678, 368, 22), -(6989679, 368, 9), -(6989680, 368, 9), -(6989681, 368, 9), -(6989682, 368, 8), -(6989683, 368, 7), -(6989685, 368, 6), -(6994517, 375, 1), -(6994518, 375, 2), -(6994519, 375, 4), -(6994521, 375, 8), -(6994536, 375, 12), -(6994537, 375, 13), -(6994636, 396, 5), -(6994637, 396, 9), -(6994638, 396, 11), -(6994639, 396, 13), -(6997567, 389, 1), -(6997901, 368, 17), -(6997902, 368, 17), -(6997903, 368, 15), -(6997904, 368, 16), -(6997905, 368, 16), -(6997906, 368, 11), -(6997907, 368, 2), -(6997908, 368, 20), -(6997909, 368, 16), -(6997910, 368, 20), -(6997911, 368, 28), -(6997912, 368, 21), -(6997913, 368, 21), -(6997914, 368, 22), -(6997915, 368, 22), -(6997916, 368, 22), -(6997917, 368, 9), -(6997918, 368, 26), -(6997919, 368, 20), -(6998414, 372, 8), -(6998415, 372, 8), -(6998416, 372, 18), -(6998468, 372, 3), -(6998470, 369, 1), -(6998471, 369, 1), -(6998472, 369, 1), -(6998474, 369, 1), -(6998479, 369, 1), -(6998483, 369, 2), -(6998486, 369, 2), -(6998487, 369, 2), -(6998488, 369, 2), -(6998490, 369, 2), -(6998491, 369, 1), -(6998492, 369, 3), -(6998493, 369, 3), -(6998494, 369, 3), -(6998495, 369, 3), -(6998496, 369, 3), -(6998499, 369, 4), -(6998502, 369, 4), -(6998503, 369, 4), -(6998504, 369, 4), -(6998506, 369, 5), -(6998507, 369, 5), -(6998508, 369, 5), -(6998509, 369, 5), -(6998510, 369, 6), -(6998512, 369, 6), -(6998513, 369, 6), -(6998514, 369, 6), -(6998515, 369, 6), -(6998523, 369, 6), -(6998529, 369, 7), -(6998530, 369, 7), -(6998533, 369, 7), -(6998535, 369, 20), -(6998536, 369, 20), -(6998537, 369, 20), -(6998538, 369, 20), -(6998541, 369, 19), -(6998543, 369, 19), -(6998545, 369, 19), -(6998546, 369, 19), -(6998547, 369, 19), -(6998548, 369, 20), -(6998551, 369, 19), -(6998552, 369, 21), -(6998553, 369, 21), -(6998555, 369, 21), -(6998556, 369, 21), -(6998559, 369, 31), -(6998561, 369, 31), -(6998565, 369, 21), -(6998569, 369, 30), -(6998571, 369, 30), -(6998573, 369, 29), -(6998575, 369, 28), -(6998576, 369, 28), -(6998577, 369, 28), -(6998579, 369, 28), -(6998580, 369, 28), -(6998581, 369, 28), -(6998582, 369, 26), -(6998583, 369, 28), -(6998592, 369, 28), -(6998593, 369, 28), -(6998594, 369, 27), -(6998595, 369, 27), -(6998596, 369, 27), -(6998598, 369, 26), -(6998599, 369, 26), -(6998600, 369, 26), -(6998601, 369, 25), -(6998603, 369, 25), -(6998605, 369, 25), -(6998607, 369, 14), -(6998608, 369, 14), -(6998609, 369, 14), -(6998610, 369, 14), -(6998611, 369, 14), -(6998612, 369, 15), -(6998613, 369, 15), -(6998618, 369, 15), -(6998620, 369, 25), -(6998622, 369, 13), -(6998623, 369, 13), -(6998625, 369, 13), -(6998627, 369, 12), -(6998628, 369, 12), -(6998637, 369, 12), -(6998638, 369, 12), -(6998639, 369, 12), -(6998640, 369, 11), -(6998641, 369, 3), -(6998642, 369, 10), -(6998643, 369, 10), -(6998644, 369, 10), -(6998646, 369, 10), -(6998647, 369, 9), -(6998648, 369, 9), -(6998649, 369, 9), -(6998653, 369, 8), -(6998654, 369, 8), -(6998655, 369, 8), -(6998656, 369, 8), -(6998657, 369, 22), -(6998658, 369, 22), -(6998659, 369, 22), -(6998661, 369, 18), -(6998666, 369, 17), -(6998667, 369, 17), -(6998668, 369, 17), -(6998669, 369, 23), -(6998670, 369, 24), -(6998676, 369, 24), -(6998682, 369, 16), -(6998684, 369, 1), -(6998685, 369, 1), -(6998686, 369, 1), -(6998687, 369, 1), -(6998688, 369, 1), -(6998689, 369, 2), -(6998690, 369, 2), -(6998691, 369, 2), -(6998692, 369, 2), -(6998693, 369, 2), -(6998694, 369, 1), -(6998695, 369, 3), -(6998696, 369, 3), -(6998697, 369, 3), -(6998698, 369, 3), -(6998699, 369, 3), -(6998700, 369, 4), -(6998701, 369, 4), -(6998702, 369, 4), -(6998703, 369, 4), -(6998704, 369, 5), -(6998705, 369, 5), -(6998706, 369, 5), -(6998707, 369, 5), -(6998708, 369, 6), -(6998709, 369, 6), -(6998710, 369, 6), -(6998711, 369, 6), -(6998712, 369, 6), -(6998713, 369, 6), -(6998714, 369, 7), -(6998715, 369, 7), -(6998716, 369, 7), -(6998717, 369, 20), -(6998718, 369, 20), -(6998719, 369, 20), -(6998720, 369, 20), -(6998722, 369, 19), -(6998723, 369, 19), -(6998724, 369, 19), -(6998725, 369, 19), -(6998726, 369, 19), -(6998727, 369, 20), -(6998728, 369, 19), -(6998729, 369, 21), -(6998730, 369, 21), -(6998731, 369, 21), -(6998732, 369, 21), -(6998735, 369, 31), -(6998736, 369, 31), -(6998737, 369, 21), -(6998738, 369, 30), -(6998739, 369, 30), -(6998740, 369, 29), -(6998741, 369, 28), -(6998742, 369, 28), -(6998743, 369, 28), -(6998744, 369, 28), -(6998745, 369, 28), -(6998746, 369, 28), -(6998747, 369, 26), -(6998748, 369, 28), -(6998749, 369, 28), -(6998750, 369, 28), -(6998751, 369, 27), -(6998752, 369, 27), -(6998753, 369, 27), -(6998754, 369, 26), -(6998755, 369, 26), -(6998756, 369, 26), -(6998757, 369, 25), -(6998758, 369, 25), -(6998759, 369, 25), -(6998760, 369, 14), -(6998761, 369, 14), -(6998762, 369, 14), -(6998763, 369, 14), -(6998764, 369, 14), -(6998765, 369, 15), -(6998766, 369, 15), -(6998767, 369, 15), -(6998768, 369, 25), -(6998769, 369, 13), -(6998770, 369, 13), -(6998771, 369, 13), -(6998772, 369, 12), -(6998773, 369, 12), -(6998774, 369, 12), -(6998775, 369, 12), -(6998776, 369, 12), -(6998777, 369, 11), -(6998778, 369, 3), -(6998779, 369, 10), -(6998780, 369, 10), -(6998781, 369, 10), -(6998782, 369, 10), -(6998783, 369, 9), -(6998784, 369, 9), -(6998785, 369, 9), -(6998786, 369, 8), -(6998787, 369, 8), -(6998788, 369, 8), -(6998789, 369, 8), -(6998790, 369, 22), -(6998791, 369, 22), -(6998792, 369, 22), -(6998793, 369, 18), -(6998794, 369, 17), -(6998795, 369, 17), -(6998796, 369, 17), -(6998797, 369, 23), -(6998798, 369, 24), -(6998799, 369, 24), -(6998800, 369, 16), -(6998818, 371, 1), -(6998896, 371, 1), -(6998897, 371, 1), -(6998898, 371, 1), -(6998899, 371, 2), -(6998900, 371, 2), -(6998901, 371, 2), -(6998902, 371, 2), -(6998946, 371, 3), -(6998947, 371, 3), -(6998982, 371, 3), -(6998983, 371, 3), -(6998984, 371, 3), -(6998986, 371, 4), -(6998987, 371, 4), -(6998988, 371, 4), -(6998990, 371, 4), -(6998991, 371, 4), -(6999007, 371, 6), -(6999008, 371, 6), -(6999009, 371, 6), -(6999010, 371, 6), -(6999011, 371, 15), -(6999012, 371, 15), -(6999013, 371, 15), -(6999014, 371, 5), -(6999015, 371, 16), -(6999016, 371, 16), -(6999017, 371, 16), -(6999020, 371, 17), -(6999021, 371, 17), -(6999022, 371, 17), -(6999023, 371, 17), -(6999024, 371, 17), -(6999025, 371, 17), -(6999026, 371, 29), -(6999028, 371, 29), -(6999029, 371, 30), -(6999030, 371, 27), -(6999032, 371, 27), -(6999034, 371, 27), -(6999147, 371, 28), -(6999150, 371, 23), -(6999152, 371, 23), -(6999153, 371, 23), -(6999154, 371, 23), -(6999156, 371, 23), -(6999157, 371, 23), -(6999158, 371, 23), -(6999159, 371, 23), -(6999160, 371, 23), -(6999163, 371, 23), -(6999166, 371, 23), -(6999169, 371, 24), -(6999170, 371, 24), -(6999171, 371, 24), -(6999172, 371, 24), -(6999173, 371, 26), -(6999174, 371, 26), -(6999175, 371, 23), -(6999176, 371, 25), -(6999177, 371, 21), -(6999179, 371, 21), -(6999180, 371, 21), -(6999181, 371, 21), -(6999182, 371, 21), -(6999183, 371, 21), -(6999184, 371, 22), -(6999185, 371, 12), -(6999186, 371, 12), -(6999188, 371, 12), -(6999189, 371, 12), -(6999190, 371, 12), -(6999191, 371, 12), -(6999192, 371, 11), -(6999193, 371, 11), -(6999194, 371, 11), -(6999195, 371, 10), -(6999196, 371, 10), -(6999197, 371, 10), -(6999200, 371, 10), -(6999201, 371, 10), -(6999202, 371, 9), -(6999203, 371, 9), -(6999204, 371, 9), -(6999206, 371, 8), -(6999207, 371, 8), -(6999209, 371, 8), -(6999212, 371, 7), -(6999213, 371, 7), -(6999214, 371, 7), -(6999216, 371, 14), -(6999217, 371, 19), -(6999218, 371, 19), -(6999219, 371, 7), -(6999220, 371, 19), -(6999221, 371, 18), -(6999222, 371, 20), -(6999223, 371, 23), -(6999224, 371, 13), -(6999476, 371, 1), -(6999477, 371, 1), -(6999478, 371, 1), -(6999479, 371, 1), -(6999480, 371, 2), -(6999481, 371, 2), -(6999482, 371, 2), -(6999483, 371, 2), -(6999484, 371, 3), -(6999485, 371, 3), -(6999486, 371, 3), -(6999487, 371, 3), -(6999488, 371, 3), -(6999489, 371, 4), -(6999490, 371, 4), -(6999491, 371, 4), -(6999492, 371, 4), -(6999493, 371, 4), -(6999494, 371, 6), -(6999495, 371, 6), -(6999496, 371, 6), -(6999497, 371, 6), -(6999498, 371, 15), -(6999499, 371, 15), -(6999500, 371, 15), -(6999501, 371, 5), -(6999502, 371, 16), -(6999503, 371, 16), -(6999504, 371, 16), -(6999505, 371, 17), -(6999506, 371, 17), -(6999507, 371, 17), -(6999508, 371, 17), -(6999509, 371, 17), -(6999510, 371, 17), -(6999511, 371, 29), -(6999512, 371, 29), -(6999513, 371, 30), -(6999514, 371, 27), -(6999515, 371, 27), -(6999516, 371, 27), -(6999517, 371, 28), -(6999518, 371, 23), -(6999519, 371, 23), -(6999520, 371, 23), -(6999521, 371, 23), -(6999522, 371, 23), -(6999523, 371, 23), -(6999524, 371, 23), -(6999525, 371, 23), -(6999526, 371, 23), -(6999527, 371, 23), -(6999528, 371, 23), -(6999529, 371, 24), -(6999530, 371, 24), -(6999531, 371, 24), -(6999532, 371, 24), -(6999533, 371, 26), -(6999534, 371, 26), -(6999535, 371, 23), -(6999536, 371, 25), -(6999537, 371, 21), -(6999538, 371, 21), -(6999539, 371, 21), -(6999540, 371, 21), -(6999541, 371, 21), -(6999542, 371, 21), -(6999543, 371, 22), -(6999544, 371, 12), -(6999545, 371, 12), -(6999546, 371, 12), -(6999547, 371, 12), -(6999548, 371, 12), -(6999549, 371, 12), -(6999550, 371, 11), -(6999551, 371, 11), -(6999552, 371, 11), -(6999553, 371, 10), -(6999554, 371, 10), -(6999555, 371, 10), -(6999556, 371, 10), -(6999557, 371, 10), -(6999558, 371, 9), -(6999559, 371, 9), -(6999560, 371, 9), -(6999561, 371, 8), -(6999562, 371, 8), -(6999563, 371, 8), -(6999564, 371, 7), -(6999565, 371, 7), -(6999566, 371, 7), -(6999567, 371, 14), -(6999568, 371, 19), -(6999569, 371, 19), -(6999570, 371, 7), -(6999571, 371, 19), -(6999572, 371, 18), -(6999573, 371, 20), -(6999574, 371, 23), -(6999575, 371, 13), -(7001712, 354, 1), -(7002280, 354, 1), -(7002282, 354, 1), -(7002283, 354, 1), -(7002284, 354, 3), -(7002286, 354, 3), -(7002287, 354, 3), -(7002289, 354, 3), -(7002290, 354, 3), -(7002292, 354, 3), -(7002297, 354, 4), -(7002298, 354, 4), -(7002324, 354, 6), -(7002325, 354, 6), -(7002327, 354, 3), -(7002328, 354, 2), -(7002329, 354, 2), -(7002333, 354, 8), -(7002334, 354, 8), -(7002335, 354, 8), -(7002336, 354, 7), -(7002337, 354, 30), -(7002338, 354, 30), -(7002339, 354, 30), -(7002360, 354, 30), -(7002361, 354, 29), -(7002363, 354, 9), -(7002364, 354, 9), -(7002365, 354, 10), -(7002366, 354, 10), -(7002370, 354, 10), -(7002371, 354, 10), -(7002372, 354, 10), -(7002373, 354, 9), -(7002374, 354, 9), -(7002376, 354, 28), -(7002378, 354, 28), -(7002382, 354, 28), -(7002385, 354, 28), -(7002387, 354, 27), -(7002388, 354, 27), -(7002390, 354, 26), -(7002391, 354, 26), -(7002392, 354, 25), -(7002393, 354, 26), -(7002394, 354, 25), -(7002395, 354, 25), -(7002396, 354, 25), -(7002397, 354, 25), -(7002398, 354, 24), -(7002399, 354, 24), -(7002401, 354, 24), -(7002404, 354, 24), -(7002410, 354, 23), -(7002412, 354, 23), -(7002413, 354, 23), -(7002414, 354, 23), -(7002415, 354, 23), -(7002416, 354, 23), -(7002417, 354, 23), -(7002418, 354, 22), -(7002419, 354, 19), -(7002420, 354, 22), -(7002422, 354, 21), -(7002423, 354, 17), -(7002424, 354, 17), -(7002425, 354, 17), -(7002426, 354, 16), -(7002427, 354, 17), -(7002428, 354, 16), -(7002430, 354, 16), -(7002431, 354, 16), -(7002432, 354, 16), -(7002434, 354, 15), -(7002436, 354, 15), -(7002437, 354, 15), -(7002439, 354, 19), -(7002694, 354, 19), -(7002695, 354, 19), -(7002696, 354, 19), -(7002697, 354, 19), -(7002698, 354, 18), -(7002700, 354, 20), -(7002701, 354, 20), -(7002703, 354, 20), -(7002705, 354, 11), -(7002708, 354, 11), -(7002710, 354, 14), -(7002711, 354, 14), -(7002712, 354, 14), -(7002713, 354, 13), -(7002714, 354, 12), -(7002715, 354, 1), -(7002716, 354, 1), -(7002717, 354, 1), -(7002718, 354, 1), -(7002719, 354, 3), -(7002720, 354, 3), -(7002721, 354, 3), -(7002722, 354, 3), -(7002723, 354, 3), -(7002725, 354, 3), -(7002726, 354, 4), -(7002727, 354, 4), -(7002730, 354, 6), -(7002731, 354, 6), -(7002732, 354, 3), -(7002733, 354, 2), -(7002734, 354, 2), -(7002735, 354, 8), -(7002736, 354, 8), -(7002737, 354, 8), -(7002738, 354, 7), -(7002739, 354, 30), -(7002740, 354, 30), -(7002741, 354, 30), -(7002742, 354, 30), -(7002743, 354, 29), -(7002744, 354, 9), -(7002745, 354, 9), -(7002746, 354, 10), -(7002747, 354, 10), -(7002748, 354, 10), -(7002749, 354, 10), -(7002750, 354, 10), -(7002751, 354, 9), -(7002752, 354, 9), -(7002753, 354, 28), -(7002754, 354, 28), -(7002755, 354, 28), -(7002756, 354, 28), -(7002757, 354, 27), -(7002758, 354, 27), -(7002759, 354, 26), -(7002760, 354, 26), -(7002761, 354, 25), -(7002762, 354, 26), -(7002763, 354, 25), -(7002764, 354, 25), -(7002765, 354, 25), -(7002766, 354, 25), -(7002767, 354, 24), -(7002768, 354, 24), -(7002769, 354, 24), -(7002770, 354, 24), -(7002771, 354, 23), -(7002772, 354, 23), -(7002773, 354, 23), -(7002774, 354, 23), -(7002775, 354, 23), -(7002776, 354, 23), -(7002777, 354, 23), -(7002778, 354, 22), -(7002779, 354, 19), -(7002780, 354, 22), -(7002781, 354, 21), -(7002782, 354, 17), -(7002783, 354, 17), -(7002784, 354, 17), -(7002785, 354, 16), -(7002786, 354, 17), -(7002787, 354, 16), -(7002789, 354, 16), -(7002790, 354, 16), -(7002791, 354, 16), -(7002793, 354, 15), -(7002794, 354, 15), -(7002795, 354, 15), -(7002796, 354, 19), -(7002797, 354, 19), -(7002798, 354, 19), -(7002799, 354, 19), -(7002800, 354, 19), -(7002801, 354, 18), -(7002802, 354, 20), -(7002803, 354, 20), -(7002804, 354, 20), -(7002805, 354, 11), -(7002806, 354, 11), -(7002807, 354, 14), -(7002808, 354, 14), -(7002809, 354, 14), -(7002810, 354, 13), -(7002811, 354, 12), -(7005090, 372, 1), -(7005094, 372, 1), -(7005096, 372, 1), -(7005098, 372, 1), -(7005107, 372, 1), -(7005115, 372, 5), -(7005118, 372, 5), -(7005165, 372, 5), -(7005166, 372, 5), -(7005167, 372, 5), -(7005168, 372, 8), -(7005169, 372, 8), -(7005170, 372, 18), -(7005171, 372, 8), -(7005172, 372, 3), -(7005173, 372, 3), -(7005174, 372, 3), -(7005175, 372, 3), -(7005176, 372, 9), -(7005177, 372, 9), -(7005179, 372, 9), -(7005180, 372, 9), -(7005181, 372, 10), -(7005183, 372, 15), -(7005184, 372, 14), -(7005186, 372, 14), -(7005210, 372, 14), -(7005211, 372, 14), -(7005212, 372, 14), -(7005213, 372, 14), -(7005214, 372, 14), -(7005215, 372, 11), -(7005217, 372, 11), -(7005240, 372, 7), -(7005401, 372, 7), -(7005404, 372, 7), -(7005406, 372, 6), -(7005408, 372, 12), -(7005409, 372, 12), -(7005410, 372, 12), -(7005411, 372, 12), -(7005412, 372, 13), -(7005413, 372, 13), -(7005414, 372, 13), -(7005415, 372, 13), -(7005417, 372, 15), -(7005418, 372, 15), -(7005419, 372, 15), -(7005420, 372, 15), -(7005422, 372, 18), -(7005423, 372, 18), -(7005424, 372, 18), -(7005425, 372, 18), -(7005426, 372, 16), -(7005427, 372, 19), -(7005429, 372, 19), -(7005431, 372, 19), -(7005432, 372, 19), -(7005433, 372, 19), -(7005434, 372, 19), -(7005435, 372, 19), -(7005436, 372, 19), -(7005437, 372, 19), -(7005438, 372, 17), -(7005441, 372, 17), -(7005442, 372, 17), -(7005444, 372, 17), -(7005445, 372, 20), -(7005446, 372, 20), -(7005447, 372, 20), -(7005451, 372, 20), -(7005452, 372, 21), -(7005453, 372, 21), -(7005454, 372, 21), -(7005455, 372, 23), -(7005456, 372, 23), -(7005457, 372, 23), -(7005458, 372, 23), -(7005459, 372, 23), -(7005460, 372, 23), -(7005465, 372, 22), -(7005468, 372, 22), -(7005469, 372, 22), -(7005470, 372, 22), -(7005471, 372, 22), -(7005472, 372, 22), -(7005473, 372, 22), -(7005474, 372, 22), -(7005475, 372, 22), -(7005477, 372, 24), -(7005481, 372, 24), -(7005482, 372, 24), -(7005584, 372, 25), -(7005585, 372, 25), -(7005586, 372, 30), -(7005587, 372, 30), -(7005588, 372, 30), -(7005589, 372, 4), -(7005590, 372, 4), -(7005591, 372, 4), -(7005592, 372, 30), -(7005593, 372, 2), -(7005594, 372, 2), -(7005595, 372, 2), -(7005596, 372, 29), -(7005598, 372, 29), -(7005600, 372, 27), -(7005601, 372, 27), -(7005602, 372, 27), -(7005606, 372, 28), -(7005607, 372, 28), -(7005608, 372, 26), -(7005609, 372, 10), -(7005610, 372, 14), -(7007424, 372, 1), -(7007425, 372, 1), -(7007426, 372, 1), -(7007427, 372, 1), -(7007428, 372, 1), -(7007429, 372, 5), -(7007430, 372, 5), -(7007431, 372, 5), -(7007432, 372, 5), -(7007433, 372, 5), -(7007434, 372, 8), -(7007435, 372, 8), -(7007436, 372, 18), -(7007437, 372, 8), -(7007438, 372, 3), -(7007439, 372, 3), -(7007440, 372, 3), -(7007441, 372, 3), -(7007442, 372, 9), -(7007443, 372, 9), -(7007444, 372, 9), -(7007445, 372, 9), -(7007446, 372, 10), -(7007447, 372, 15), -(7007448, 372, 14), -(7007449, 372, 14), -(7007450, 372, 14), -(7007451, 372, 14), -(7007452, 372, 14), -(7007453, 372, 14), -(7007454, 372, 14), -(7007455, 372, 11), -(7007456, 372, 11), -(7007457, 372, 7), -(7007458, 372, 7), -(7007459, 372, 7), -(7007460, 372, 6), -(7007461, 372, 12), -(7007462, 372, 12), -(7007463, 372, 12), -(7007464, 372, 12), -(7007465, 372, 13), -(7007466, 372, 13), -(7007467, 372, 13), -(7007468, 372, 13), -(7007469, 372, 15), -(7007470, 372, 15), -(7007471, 372, 15), -(7007472, 372, 15), -(7007473, 372, 18), -(7007474, 372, 18), -(7007475, 372, 18), -(7007476, 372, 18), -(7007477, 372, 16), -(7007478, 372, 19), -(7007479, 372, 19), -(7007480, 372, 19), -(7007481, 372, 19), -(7007482, 372, 19), -(7007483, 372, 19), -(7007484, 372, 19), -(7007485, 372, 19), -(7007486, 372, 19), -(7007487, 372, 17), -(7007488, 372, 17), -(7007489, 372, 17), -(7007490, 372, 17), -(7007491, 372, 20), -(7007492, 372, 20), -(7007493, 372, 20), -(7007494, 372, 20), -(7007495, 372, 21), -(7007496, 372, 21), -(7007497, 372, 21), -(7007498, 372, 23), -(7007499, 372, 23), -(7007500, 372, 23), -(7007501, 372, 23), -(7007502, 372, 23), -(7007503, 372, 23), -(7007504, 372, 22), -(7007505, 372, 22), -(7007506, 372, 22), -(7007507, 372, 22), -(7007508, 372, 22), -(7007509, 372, 22), -(7007510, 372, 22), -(7007511, 372, 22), -(7007512, 372, 22), -(7007513, 372, 24), -(7007514, 372, 24), -(7007515, 372, 24), -(7007516, 372, 25), -(7007517, 372, 25), -(7007518, 372, 30), -(7007519, 372, 30), -(7007520, 372, 30), -(7007521, 372, 4), -(7007522, 372, 4), -(7007523, 372, 4), -(7007524, 372, 30), -(7007525, 372, 2), -(7007526, 372, 2), -(7007527, 372, 2), -(7007528, 372, 29), -(7007529, 372, 29), -(7007530, 372, 27), -(7007531, 372, 27), -(7007532, 372, 27), -(7007533, 372, 28), -(7007534, 372, 28), -(7007535, 372, 26), -(7007536, 372, 10), -(7007537, 372, 14), -(7008614, 368, 17), -(7008615, 368, 17), -(7008616, 368, 17), -(7008617, 368, 17), -(7008977, 372, 16), -(7011528, 369, 23), -(7011608, 368, 16), -(7011609, 368, 16), -(7011611, 368, 16), -(7011612, 368, 16), -(7011613, 368, 16), -(7011909, 369, 23), -(7011910, 369, 16), -(7011911, 369, 16), -(7011912, 369, 17), -(7011913, 369, 18), -(7011914, 369, 22), -(7011915, 369, 24), -(7011916, 369, 17), -(7011917, 369, 24), -(7011918, 369, 16), -(7011919, 369, 24), -(7011920, 369, 16), -(7011921, 369, 18), -(7011922, 369, 16), -(7011923, 369, 10), -(7015554, 371, 12), -(7015555, 371, 12), -(7015556, 371, 12), -(7015557, 371, 12), -(7015559, 371, 12), -(7015560, 371, 12), -(7015561, 371, 12), -(7015562, 371, 12), -(7015563, 371, 1), -(7015564, 371, 1), -(7015565, 371, 1), -(7015639, 371, 1), -(7015809, 371, 29), -(7015810, 371, 29), -(7015811, 371, 29), -(7015831, 371, 29), -(7017072, 368, 21), -(7017073, 368, 21), -(7017074, 368, 21), -(7017821, 368, 21), -(7017822, 368, 21), -(7017823, 368, 21), -(7017824, 368, 21), -(7017825, 368, 21), -(7018030, 372, 8), -(7018032, 372, 8), -(7021959, 354, 6), -(7022000, 371, 8), -(7022001, 371, 8), -(7022002, 371, 8), -(7022080, 369, 13), -(7022081, 369, 13), -(7022082, 369, 10), -(7022083, 369, 10), -(7022084, 369, 10), -(7022085, 369, 10), -(7022086, 369, 3), -(7022088, 369, 3), -(7022089, 369, 3), -(7022221, 372, 1), -(7022434, 371, 21), -(7022435, 371, 7), -(7022436, 371, 6), -(7022437, 371, 15), -(7022438, 371, 5), -(7022439, 371, 5), -(7022472, 369, 12), -(7022480, 369, 12), -(7022482, 369, 12), -(7022484, 369, 12), -(7031210, 369, 31), -(7031211, 369, 31), -(7031212, 369, 31), -(7031213, 369, 31), -(7031219, 369, 31), -(7031225, 369, 31), -(7031226, 369, 30), -(7031228, 369, 31), -(7031229, 369, 31), -(7031230, 369, 31), -(7031233, 369, 30), -(7031341, 369, 31), -(7031346, 369, 31), -(7031381, 369, 31), -(7031993, 369, 30), -(7032050, 369, 21), -(7032051, 369, 21), -(7036942, 369, 30), -(7082919, 415, 14), -(7082925, 415, 14), -(7082926, 415, 14), -(7171388, 415, 15), -(7171970, 439, 1), -(7171972, 439, 2), -(7171973, 439, 3), -(7171974, 439, 4), -(7171977, 439, 7), -(7171981, 439, 11), -(7171982, 439, 11), -(7171983, 439, 6), -(7171987, 439, 7), -(7171988, 439, 7), -(7171997, 439, 4), -(7171998, 439, 9), -(7171999, 439, 13), -(7247207, 445, 1), -(7257150, 414, 1), -(7309598, 414, 1), -(7309601, 414, 2), -(7309602, 414, 2), -(7309603, 414, 2), -(7309608, 414, 2), -(7309609, 414, 2), -(7309615, 414, 13), -(7309629, 414, 13), -(7309632, 414, 12), -(7309633, 414, 12), -(7309634, 414, 12), -(7309640, 414, 12), -(7309641, 414, 11), -(7309642, 414, 11), -(7309679, 414, 8), -(7309688, 414, 9), -(7309690, 414, 9), -(7309692, 414, 9), -(7309694, 414, 9), -(7309695, 414, 7), -(7309697, 414, 7), -(7309698, 414, 7), -(7309699, 414, 7), -(7310021, 414, 5), -(7310031, 414, 5), -(7310032, 414, 5), -(7310046, 414, 10), -(7310052, 414, 3), -(7310119, 414, 7), -(7310228, 414, 12), -(7310233, 414, 11), -(7310337, 414, 5), -(7329610, 414, 10), -(7329613, 414, 12), -(7329615, 414, 12), -(7329616, 414, 12), -(7329617, 414, 13), -(7329620, 414, 13), -(7329621, 414, 13), -(7329623, 414, 2), -(7329624, 414, 2), -(7329625, 414, 2), -(7329626, 414, 2), -(7329627, 414, 2), -(7329629, 414, 2), -(7329630, 414, 2), -(7329631, 414, 2), -(7329635, 414, 4), -(7329639, 414, 5), -(7329641, 414, 7), -(7329643, 414, 7), -(7329644, 414, 7), -(7329645, 414, 7), -(7329646, 414, 7), -(7329648, 414, 7), -(7329650, 414, 8), -(7329651, 414, 8), -(7329653, 414, 8), -(7329654, 414, 2), -(7329655, 414, 9), -(7329656, 414, 9), -(7329658, 414, 9); - - INSERT INTO `land` (`LandSetId`, `LandId`, `Type`, `Size`, `Status`, `LandPrice`, `UpdateTime`, `OwnerId`, `HouseId`, `UPDATE_DATE`) VALUES (22216704, 0, 0, 1, 1, 19000000, 0, 0, 0, '2018-12-02 23:28:14'), (22216704, 1, 0, 2, 1, 47500000, 0, 0, 0, '2018-12-02 23:28:14'), diff --git a/sql/schema/schema.sql b/sql/schema/schema.sql index e58df240..0017310c 100644 --- a/sql/schema/schema.sql +++ b/sql/schema/schema.sql @@ -400,13 +400,6 @@ CREATE TABLE `dbupdate` ( PRIMARY KEY(`name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -CREATE TABLE `discoveryinfo` ( - `id` int(10) NOT NULL, - `map_id` int(3) NOT NULL, - `discover_id` int(3) NOT NULL, - PRIMARY KEY(`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - CREATE TABLE `house` ( `HouseId` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, `LandSetId` int(10) UNSIGNED DEFAULT NULL, diff --git a/src/common/Exd/ExdDataGenerated.h b/src/common/Exd/ExdDataGenerated.h index 725fb2a7..831412cc 100644 --- a/src/common/Exd/ExdDataGenerated.h +++ b/src/common/Exd/ExdDataGenerated.h @@ -5594,6 +5594,11 @@ struct ZoneSharedGroup std::shared_ptr< xiv::dat::GameData > m_data; std::shared_ptr< xiv::exd::ExdData > m_exd_data; + std::shared_ptr< xiv::dat::GameData > getGameData() + { + return m_data; + } + template< class T > std::shared_ptr< T > get( uint32_t id ) { diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index 8812e17f..49a5eea1 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -1550,11 +1550,10 @@ namespace Sapphire::Network::Packets::Server */ struct FFXIVIpcDiscovery : FFXIVIpcBasePacket< Discovery > { - /* 0000 */ uint32_t map_part_id; - /* 0004 */ uint32_t map_id; + /* 0000 */ uint32_t mapPartId; + /* 0004 */ uint32_t mapId; }; - /** * UNKOWN TYPE */ diff --git a/src/tools/discovery_parser/main.cpp b/src/tools/discovery_parser/main.cpp index 0ded1f58..0125222b 100644 --- a/src/tools/discovery_parser/main.cpp +++ b/src/tools/discovery_parser/main.cpp @@ -36,10 +36,11 @@ struct ZoneInfo uint16_t id; std::string name; std::string path; + uint16_t mapId; }; // parsing shit -std::string gamePath( "C:\\Program Files (x86)\\SquareEnix\\FINAL FANTASY XIV - A Realm Reborn\\game\\sqpack" ); +std::string gamePath( "C:\\SquareEnix\\FINAL FANTASY XIV - A Realm Reborn\\game\\sqpack" ); std::unordered_map< uint32_t, std::string > eobjNameMap; std::unordered_map< uint16_t, ZoneInfo > zoneInfoMap; std::unordered_map< uint16_t, std::vector< std::pair< uint16_t, std::string > > > zoneInstanceMap; @@ -60,8 +61,7 @@ struct vec2 float x, y; }; -struct DiscoveryMap : - std::enable_shared_from_this< DiscoveryMap > +struct DiscoveryMap : std::enable_shared_from_this< DiscoveryMap > { std::string path; Image img; @@ -120,11 +120,11 @@ struct DiscoveryMap : std::map< uint16_t, std::map< uint16_t, std::map< uint16_t, std::shared_ptr< DiscoveryMap > > > > discoveryMaps; -enum class TerritoryTypeExdIndexes : - size_t +enum class TerritoryTypeExdIndexes : size_t { TerritoryType = 0, - Path = 1 + Path = 1, + Map = 6 }; using namespace std::chrono_literals; @@ -165,6 +165,8 @@ std::string zoneNameToPath( const std::string& name ) info.id = row.first; info.path = teriPath; info.name = teriName; + info.mapId = std::get< uint16_t >( + fields.at( static_cast< size_t >( TerritoryTypeExdIndexes::Map ) ) ); zoneInfoMap[ row.first ] = info; if( !found && ( Common::Util::toLowerCopy( name ) == Common::Util::toLowerCopy( teriName ) ) ) @@ -217,69 +219,31 @@ void loadEobjNames() } } -void writeEobjEntry( std::ofstream& out, LGB_ENTRY* pObj ) +void writeMapRangeEntry( std::ofstream& out, LgbEntry* pObj ) { - static std::string mapRangeStr( "\"MapRange\", " ); - std::ofstream discoverySql( zoneName + "_poprange.txt", std::ios::app ); - uint32_t id; - uint32_t unknown2 = 0, unknown2_1 = 0, unknown3 = 0; - std::string name; - std::string typeStr; - uint32_t eobjlevelHierachyId = 0; - static std::map< uint32_t, std::map< uint32_t, uint32_t > > exportedMapRange; + auto pMapRange = reinterpret_cast< LGB_MAP_RANGE_ENTRY* >( pObj ); + if( !pMapRange->header.discoveryEnabled ) + return; - auto pMapRange = reinterpret_cast< LGB_MAPRANGE_ENTRY* >( pObj ); - id = pMapRange->header.unknown; - unknown2 = pMapRange->header.unknown2; - unknown2_1 = pMapRange->header.unknown2_1; - unknown3 = pMapRange->header.unknown3; - typeStr = mapRangeStr; - - // discovery shit - vec2 pos{ 0 }; auto subArea = 0; auto mapId = -1; auto discoveryIndex = pMapRange->header.discoveryIndex; - vec3 translation = pObj->header.translation; + vec3 translation = pObj->header.transform.translation; - bool found = false; - float scale = 100.f; //pMapRange->header.unknown2 - - std::string outStr( pMapRange->name + " " + std::to_string( pMapRange->header.unknown ) + " " + - std::to_string( pMapRange->header.translation.x ) + " " + - std::to_string( pMapRange->header.translation.y ) + " " + - std::to_string( pMapRange->header.translation.z ) + " " + - std::to_string( pMapRange->header.rotation.y ) + "\n" + std::string outStr( pMapRange->name + " " + std::to_string( pMapRange->header.instanceId ) + " " + + std::to_string( pMapRange->header.transform.translation.x ) + " " + + std::to_string( pMapRange->header.transform.translation.y ) + " " + + std::to_string( pMapRange->header.transform.translation.z ) + " " + + std::to_string( pMapRange->header.transform.rotation.y ) + " " + + std::to_string( pMapRange->header.mapId ) + " " + + std::to_string( pMapRange->header.discoveryIndex ) + "\n" ); - //std::to_string( pObj->header.translation.x ) + ", " + std::to_string( pObj->header.translation.y ) + ", " + std::to_string( pObj->header.translation.z ) + - //", " + std::to_string( subArea ) + "" + "\n" - //); - discoverySql.write( outStr.c_str(), outStr.size() ); - //out.write( outStr.c_str(), outStr.size() ); -} + out.write( outStr.c_str(), outStr.size() ); -void readFileToBuffer( const std::string& path, std::vector< char >& buf ) -{ - auto inFile = std::ifstream( path, std::ios::binary ); - if( inFile.good() ) - { - inFile.seekg( 0, inFile.end ); - int32_t fileSize = ( int32_t ) inFile.tellg(); - buf.resize( fileSize ); - inFile.seekg( 0, inFile.beg ); - inFile.read( &buf[ 0 ], fileSize ); - inFile.close(); - } - else - { - throw std::runtime_error( "Unable to open " + path ); - } } -bool isEx = false; - int main( int argc, char* argv[] ) { auto startTime = std::chrono::system_clock::now(); @@ -288,10 +252,6 @@ int main( int argc, char* argv[] ) std::vector< std::string > argVec( argv + 1, argv + argc ); zoneName = "s1h1"; - bool dumpAll = ignoreModels = std::remove_if( argVec.begin(), argVec.end(), []( auto arg ) - { return arg == "--dump-all"; } ) != argVec.end(); - dumpAll = true; - ignoreModels = true; if( argc > 1 ) { zoneName = argv[ 1 ]; @@ -304,118 +264,42 @@ int main( int argc, char* argv[] ) } initExd( gamePath ); - std::ofstream discoverySql( zoneName + "_poprange.txt", std::ios::trunc ); - discoverySql.close(); + std::ofstream discoverySql( "maprange_export.txt", std::ios::trunc ); - if( dumpAll ) + zoneNameToPath( "f1f1" ); + zoneDumpList.emplace( "f1f1" ); + zoneDumpList.emplace( "f1f2" ); + + for( const auto& zoneName : zoneDumpList ) { - zoneNameToPath( "s1h1" ); - - zoneDumpList.emplace( "s1h1" ); - zoneDumpList.emplace( "f1h1" ); - zoneDumpList.emplace( "w1h1" ); - zoneDumpList.emplace( "e1h1" ); - } - else - { - zoneDumpList.emplace( zoneName ); - } - - LABEL_DUMP: - entryStartTime = std::chrono::system_clock::now(); - zoneName = *zoneDumpList.begin(); - discoverySql.open( zoneName + "_poprange.txt", std::ios::trunc ); - discoverySql.write( ( zoneName + "\n" ).c_str() , zoneName.size() + 1 ); - try - { - const auto zonePath = zoneNameToPath( zoneName ); - - std::string listPcbPath( zonePath + "/collision/list.pcb" ); - std::string bgLgbPath( zonePath + "/level/bg.lgb" ); - std::string planmapLgbPath( zonePath + "/level/planmap.lgb" ); - std::string collisionFilePath( zonePath + "/collision/" ); - - isEx = bgLgbPath.find( "ex1" ) != -1 || bgLgbPath.find( "ex2" ) != -1; - std::vector< char > section; - std::vector< char > section1; - std::vector< char > section2; - - auto test_file = gameData->getFile( bgLgbPath ); - section = test_file->access_data_sections().at( 0 ); - - auto planmap_file = gameData->getFile( planmapLgbPath ); - section2 = planmap_file->access_data_sections().at( 0 ); - - auto test_file1 = gameData->getFile( listPcbPath ); - section1 = test_file1->access_data_sections().at( 0 ); - - std::vector< std::string > stringList; - - uint32_t offset1 = 0x20; - - //loadEobjNames(); - //getMapExdEntries( zoneId ); - - std::string eobjFileName( zoneName + "_eobj.csv" ); - std::ofstream eobjOut( eobjFileName, std::ios::trunc ); - if( !eobjOut.good() ) - throw std::string( "Unable to create " + zoneName + - "_eobj.csv for eobj entries. Run as admin or check there isnt already a handle on the file." ).c_str(); - - eobjOut.close(); - eobjOut.open( eobjFileName, std::ios::app ); - - if( !eobjOut.good() ) - throw std::string( "Unable to create " + zoneName + - "_eobj.csv for eobj entries. Run as admin or check there isnt already a handle on the file." ).c_str(); - - if( 0 ) + entryStartTime = std::chrono::system_clock::now(); + discoverySql.write( ( zoneName + "\n" ).c_str(), zoneName.size() + 1 ); + try { - for( ;; ) - { + const auto zonePath = zoneNameToPath( zoneName ); - uint16_t trId = *( uint16_t* ) §ion1[ offset1 ]; + std::string bgLgbPath( zonePath + "/level/bg.lgb" ); + std::string planmapLgbPath( zonePath + "/level/planmap.lgb" ); + std::vector< char > section; + std::vector< char > section2; - char someString[200]; - sprintf( someString, "%str%04d.pcb", collisionFilePath.c_str(), trId ); - stringList.push_back( std::string( someString ) ); - //std::cout << someString << "\n"; - offset1 += 0x20; + auto test_file = gameData->getFile( bgLgbPath ); + section = test_file->access_data_sections().at( 0 ); - if( offset1 >= section1.size() ) - { - break; - } - } - } - LGB_FILE bgLgb( §ion[ 0 ], "bg" ); - LGB_FILE planmapLgb( §ion2[ 0 ], "planmap" ); + auto planmap_file = gameData->getFile( planmapLgbPath ); + section2 = planmap_file->access_data_sections().at( 0 ); - std::vector< LGB_FILE > lgbList{ bgLgb, planmapLgb }; - uint32_t max_index = 0; + std::vector< std::string > stringList; - // dont bother if we cant write to a file - FILE* fp_out = nullptr; - //auto fp_out = ignoreModels ? ( FILE* )nullptr : fopen( ( zoneName + ".obj" ).c_str(), "w" ); - if( fp_out ) - { - fprintf( fp_out, "\n" ); - fclose( fp_out ); - } - else if( /*!ignoreModels*/ false ) - { - std::string errorMessage( "Cannot create " + zoneName + ".obj\n" + - " Check no programs have a handle to file and run as admin.\n" ); - std::cout << errorMessage; - throw std::runtime_error( errorMessage.c_str() ); - return 0; - } + uint32_t offset1 = 0x20; + LGB_FILE bgLgb( §ion[ 0 ], "bg" ); + LGB_FILE planmapLgb( §ion2[ 0 ], "planmap" ); - { - std::map< std::string, PCB_FILE > pcbFiles; + std::vector< LGB_FILE > lgbList{ bgLgb, planmapLgb }; + uint32_t max_index = 0; - std::cout << "[Info] " << ( ignoreModels ? "Dumping MapRange and EObj" : "Writing obj file " ) << "\n"; + std::cout << "[Info] " << "Dumping MapRange and EObj" << "\n"; uint32_t totalGroups = 0; uint32_t totalGroupEntries = 0; @@ -423,48 +307,46 @@ int main( int argc, char* argv[] ) { for( const auto& group : lgb.groups ) { - //std::cout << "\t" << group.name << " Size " << group.header.entryCount << "\n"; totalGroups++; for( const auto& pEntry : group.entries ) { - if( pEntry->getType() == LgbEntryType::PopRange ) + if( pEntry->getType() == LgbEntryType::MapRange ) { totalGroupEntries++; - writeEobjEntry( eobjOut, pEntry.get() ); + writeMapRangeEntry( discoverySql, pEntry.get() ); + } + else if( pEntry->getType() == LgbEntryType::ExitRange ) + { + auto pExitRange = reinterpret_cast< LGB_EXIT_RANGE_ENTRY* >( pEntry.get() ); + } } } } - std::cout << "[Info] " << "Loaded " << pcbFiles.size() << " PCB Files \n"; std::cout << "[Info] " << "Total Groups " << totalGroups << " Total entries " << totalGroupEntries << "\n"; + + std::cout << "[Success] " << "Exported " << zoneName << " in " << + std::chrono::duration_cast< std::chrono::seconds >( + std::chrono::system_clock::now() - entryStartTime ).count() << " seconds\n"; } - std::cout << "[Success] " << "Exported " << zoneName << " in " << - std::chrono::duration_cast< std::chrono::seconds >( - std::chrono::system_clock::now() - entryStartTime ).count() << " seconds\n"; + catch( std::exception& e ) + { + std::cout << "[Error] " << e.what() << std::endl; + std::cout << "[Error] " + << "Unable to extract collision data.\n\tIf using standalone ensure your working directory folder layout is \n\tbg/[ffxiv|ex1|ex2]/teri/type/zone/[level|collision]" + << std::endl; + std::cout << std::endl; + std::cout << "[Info] " << "Usage: pcb_reader2 territory \"path/to/game/sqpack/ffxiv\" " << std::endl; + } + std::cout << "\n"; + if( discoverySql.good() ) + discoverySql.flush(); } - catch( std::exception& e ) - { - std::cout << "[Error] " << e.what() << std::endl; - std::cout << "[Error] " - << "Unable to extract collision data.\n\tIf using standalone ensure your working directory folder layout is \n\tbg/[ffxiv|ex1|ex2]/teri/type/zone/[level|collision]" - << std::endl; - std::cout << std::endl; - std::cout << "[Info] " << "Usage: pcb_reader2 territory \"path/to/game/sqpack/ffxiv\" " << std::endl; - } - std::cout << "\n\n\n"; - if( discoverySql.good() ) - discoverySql.flush(); - - LABEL_NEXT_ZONE_ENTRY: - zoneDumpList.erase( zoneName ); - if( !zoneDumpList.empty() ) - goto LABEL_DUMP; - - - std::cout << "\n\n\n[Success] Finished all tasks in " << + std::cout << "\n[Success] Finished all tasks in " << std::chrono::duration_cast< std::chrono::seconds >( std::chrono::system_clock::now() - startTime ).count() << " seconds\n"; + std::cout << "Press any key to exit..."; getchar(); if( eData ) diff --git a/src/tools/event_object_parser/main.cpp b/src/tools/event_object_parser/main.cpp index a4d451a9..7615939a 100644 --- a/src/tools/event_object_parser/main.cpp +++ b/src/tools/event_object_parser/main.cpp @@ -285,7 +285,7 @@ int main( int argc, char* argv[] ) auto pEobj = reinterpret_cast< LGB_EOBJ_ENTRY* >( pObj ); id = pEobj->header.eobjId; - unknown = pEobj->header.unknown; + unknown = pEobj->header.instanceId; eobjlevelHierachyId = pEobj->header.levelHierachyId; @@ -295,7 +295,7 @@ int main( int argc, char* argv[] ) { auto pGObj = pEntry1.get(); if( pGObj->getType() == LgbEntryType::Gimmick && - pGObj->header.unknown == pEobj->header.levelHierachyId ) + pGObj->header.instanceId == pEobj->header.levelHierachyId ) { auto pGObjR = reinterpret_cast< LGB_GIMMICK_ENTRY* >( pGObj ); char* dataSection = nullptr; @@ -361,13 +361,13 @@ int main( int argc, char* argv[] ) eobjects += " instance.registerEObj( \"" + name + "\", " + std::to_string( id ) + ", " + std::to_string( eobjlevelHierachyId ) + ", " + std::to_string( state ) + ", " + - "{ " + std::to_string( pObj->header.translation.x ) + "f, " - + std::to_string( pObj->header.translation.y ) + "f, " - + std::to_string( pObj->header.translation.z ) + "f }, " + - std::to_string( pObj->header.scale.x ) + "f, " + + "{ " + std::to_string( pObj->header.transform.translation.x ) + "f, " + + std::to_string( pObj->header.transform.translation.y ) + "f, " + + std::to_string( pObj->header.transform.translation.z ) + "f }, " + + std::to_string( pObj->header.transform.scale.x ) + "f, " + // the rotation inside the sgbs is the inverse of what the game uses - std::to_string( pObj->header.rotation.y * -1.f ) + "f ); \n" + states; + std::to_string( pObj->header.transform.rotation.y * -1.f ) + "f ); \n" + states; } } } diff --git a/src/tools/exd_struct_gen/ExdData.h.tmpl b/src/tools/exd_struct_gen/ExdData.h.tmpl index 4b344f7b..d5612d74 100644 --- a/src/tools/exd_struct_gen/ExdData.h.tmpl +++ b/src/tools/exd_struct_gen/ExdData.h.tmpl @@ -43,6 +43,11 @@ STRUCTS std::shared_ptr< xiv::dat::GameData > m_data; std::shared_ptr< xiv::exd::ExdData > m_exd_data; + std::shared_ptr< xiv::dat::GameData > getGameData() + { + return m_data; + } + template< class T > std::shared_ptr< T > get( uint32_t id ) { diff --git a/src/tools/nav_export/lgb.h b/src/tools/nav_export/lgb.h index b363dcb3..937f2f77 100644 --- a/src/tools/nav_export/lgb.h +++ b/src/tools/nav_export/lgb.h @@ -68,7 +68,7 @@ enum class LgbEntryType : SphereCastRange = 75, }; -struct LGB_ENTRY_HEADER +struct InstanceObject { LgbEntryType type; uint32_t unknown; @@ -78,25 +78,25 @@ struct LGB_ENTRY_HEADER vec3 scale; }; -class LGB_ENTRY +class LgbEntry { public: char* m_buf; uint32_t m_offset; - LGB_ENTRY_HEADER header; + InstanceObject header; - LGB_ENTRY() + LgbEntry() { m_buf = nullptr; m_offset = 0; memset( &header, 0, sizeof( header ) ); }; - LGB_ENTRY( char* buf, uint32_t offset ) + LgbEntry( char* buf, uint32_t offset ) { m_buf = buf; m_offset = offset; - header = *reinterpret_cast< LGB_ENTRY_HEADER* >( buf + offset ); + header = *reinterpret_cast< InstanceObject* >( buf + offset ); }; const LgbEntryType getType() const @@ -104,14 +104,14 @@ public: return header.type; }; - virtual ~LGB_ENTRY() + virtual ~LgbEntry() { }; }; -struct LGB_BGPARTS_HEADER : - public LGB_ENTRY_HEADER +struct BgPartsData : + public InstanceObject { uint32_t modelFileOffset; uint32_t collisionFileOffset; @@ -124,10 +124,10 @@ struct LGB_BGPARTS_HEADER : }; class LGB_BGPARTS_ENTRY : - public LGB_ENTRY + public LgbEntry { public: - LGB_BGPARTS_HEADER header; + BgPartsData header; std::string name; std::string modelFileName; std::string collisionFileName; @@ -137,65 +137,65 @@ public: }; LGB_BGPARTS_ENTRY( char* buf, uint32_t offset ) : - LGB_ENTRY( buf, offset ) + LgbEntry( buf, offset ) { - header = *reinterpret_cast( buf + offset ); + header = *reinterpret_cast( buf + offset ); name = std::string( buf + offset + header.nameOffset ); modelFileName = std::string( buf + offset + header.modelFileOffset ); collisionFileName = std::string( buf + offset + header.collisionFileOffset ); }; }; -struct LGB_GIMMICK_HEADER : - public LGB_ENTRY_HEADER +struct GimmickData : + public InstanceObject { uint32_t gimmickFileOffset; char unknownBytes[100]; }; class LGB_GIMMICK_ENTRY : - public LGB_ENTRY + public LgbEntry { public: - LGB_GIMMICK_HEADER header; + GimmickData header; std::string name; std::string gimmickFileName; LGB_GIMMICK_ENTRY( char* buf, uint32_t offset ) : - LGB_ENTRY( buf, offset ) + LgbEntry( buf, offset ) { - header = *reinterpret_cast( buf + offset ); + header = *reinterpret_cast( buf + offset ); name = std::string( buf + offset + header.nameOffset ); gimmickFileName = std::string( buf + offset + header.gimmickFileOffset ); //std::cout << "\t " << gimmickFileName << " unknown: " << header.unknown << "\n"; }; }; -struct LGB_ENPC_HEADER : - public LGB_ENTRY_HEADER +struct ENpcData : + public InstanceObject { uint32_t enpcId; uint8_t unknown1[0x24]; }; class LGB_ENPC_ENTRY : - public LGB_ENTRY + public LgbEntry { public: - LGB_ENPC_HEADER header; + ENpcData header; std::string name; LGB_ENPC_ENTRY( char* buf, uint32_t offset ) : - LGB_ENTRY( buf, offset ) + LgbEntry( buf, offset ) { - header = *reinterpret_cast< LGB_ENPC_HEADER* >( buf + offset ); + header = *reinterpret_cast< ENpcData* >( buf + offset ); name = std::string( buf + offset + header.nameOffset ); //std::cout << "\t ENpc " << header.enpcId << " " << name << "\n"; }; }; -struct LGB_EOBJ_HEADER : - public LGB_ENTRY_HEADER +struct EObjData : + public InstanceObject { uint32_t eobjId; uint32_t levelHierachyId; @@ -203,23 +203,23 @@ struct LGB_EOBJ_HEADER : }; class LGB_EOBJ_ENTRY : - public LGB_ENTRY + public LgbEntry { public: - LGB_EOBJ_HEADER header; + EObjData header; std::string name; LGB_EOBJ_ENTRY( char* buf, uint32_t offset ) : - LGB_ENTRY( buf, offset ) + LgbEntry( buf, offset ) { - header = *reinterpret_cast< LGB_EOBJ_HEADER* >( buf + offset ); + header = *reinterpret_cast< EObjData* >( buf + offset ); //std::cout << "\t " << header.eobjId << " " << name << " unknown: " << header.unknown << "\n"; name = std::string( buf + offset + header.nameOffset ); }; }; -struct LGB_MAPRANGE_HEADER : - public LGB_ENTRY_HEADER +struct MapRangeData : + public InstanceObject { uint32_t type; uint16_t unknown2; @@ -227,35 +227,35 @@ struct LGB_MAPRANGE_HEADER : uint8_t unknown4[0x10]; }; -struct LGB_MAPRANGE_ENTRY : - public LGB_ENTRY +struct LGB_MAP_RANGE_ENTRY : + public LgbEntry { public: - LGB_MAPRANGE_HEADER header; + MapRangeData header; std::string name; - LGB_MAPRANGE_ENTRY( char* buf, uint32_t offset ) : - LGB_ENTRY( buf, offset ) + LGB_MAP_RANGE_ENTRY( char* buf, uint32_t offset ) : + LgbEntry( buf, offset ) { - header = *reinterpret_cast< LGB_MAPRANGE_HEADER* >( buf + offset ); + header = *reinterpret_cast< MapRangeData* >( buf + offset ); name = std::string( buf + offset + header.nameOffset ); }; }; struct LGB_COLLISION_BOX_HEADER : - public LGB_ENTRY_HEADER + public InstanceObject { uint8_t unk[100]; }; struct LGB_COLLISION_BOX_ENTRY : - public LGB_ENTRY + public LgbEntry { LGB_COLLISION_BOX_HEADER header; std::string name; LGB_COLLISION_BOX_ENTRY( char* buf, uint32_t offset ) : - LGB_ENTRY( buf, offset ) + LgbEntry( buf, offset ) { header = *reinterpret_cast< LGB_COLLISION_BOX_HEADER* >( buf + offset ); header.type = LgbEntryType::CollisionBox; @@ -305,7 +305,7 @@ struct LGB_GROUP LGB_FILE* parent; LGB_GROUP_HEADER header; std::string name; - std::vector< std::shared_ptr< LGB_ENTRY > > entries; + std::vector< std::shared_ptr< LgbEntry > > entries; LGB_GROUP( char* buf, LGB_FILE* parentStruct, uint32_t offset ) { diff --git a/src/tools/nav_export/main.cpp b/src/tools/nav_export/main.cpp index 12e1c840..c42f8c17 100644 --- a/src/tools/nav_export/main.cpp +++ b/src/tools/nav_export/main.cpp @@ -257,7 +257,7 @@ bool pcbTransformModel( const std::string& fileName, const vec3* scale, const ve return true; }; -void exportSgbModel( const std::string& sgbFilePath, LGB_ENTRY* pGimmick, ExportedGroup& exportgroup, bool isEobj = false ) +void exportSgbModel( const std::string& sgbFilePath, LgbEntry* pGimmick, ExportedGroup& exportgroup, bool isEobj = false ) { if( auto pSgbFile = pCache->getSgbFile( sgbFilePath ) ) { diff --git a/src/tools/pcb_reader/lgb.h b/src/tools/pcb_reader/lgb.h index b363dcb3..d87a2809 100644 --- a/src/tools/pcb_reader/lgb.h +++ b/src/tools/pcb_reader/lgb.h @@ -68,7 +68,7 @@ enum class LgbEntryType : SphereCastRange = 75, }; -struct LGB_ENTRY_HEADER +struct InstanceObject { LgbEntryType type; uint32_t unknown; @@ -78,25 +78,25 @@ struct LGB_ENTRY_HEADER vec3 scale; }; -class LGB_ENTRY +class LgbEntry { public: char* m_buf; uint32_t m_offset; - LGB_ENTRY_HEADER header; + InstanceObject header; - LGB_ENTRY() + LgbEntry() { m_buf = nullptr; m_offset = 0; memset( &header, 0, sizeof( header ) ); }; - LGB_ENTRY( char* buf, uint32_t offset ) + LgbEntry( char* buf, uint32_t offset ) { m_buf = buf; m_offset = offset; - header = *reinterpret_cast< LGB_ENTRY_HEADER* >( buf + offset ); + header = *reinterpret_cast< InstanceObject* >( buf + offset ); }; const LgbEntryType getType() const @@ -104,14 +104,14 @@ public: return header.type; }; - virtual ~LGB_ENTRY() + virtual ~LgbEntry() { }; }; -struct LGB_BGPARTS_HEADER : - public LGB_ENTRY_HEADER +struct BgPartsData : + public InstanceObject { uint32_t modelFileOffset; uint32_t collisionFileOffset; @@ -124,10 +124,10 @@ struct LGB_BGPARTS_HEADER : }; class LGB_BGPARTS_ENTRY : - public LGB_ENTRY + public LgbEntry { public: - LGB_BGPARTS_HEADER header; + BgPartsData header; std::string name; std::string modelFileName; std::string collisionFileName; @@ -137,65 +137,65 @@ public: }; LGB_BGPARTS_ENTRY( char* buf, uint32_t offset ) : - LGB_ENTRY( buf, offset ) + LgbEntry( buf, offset ) { - header = *reinterpret_cast( buf + offset ); + header = *reinterpret_cast( buf + offset ); name = std::string( buf + offset + header.nameOffset ); modelFileName = std::string( buf + offset + header.modelFileOffset ); collisionFileName = std::string( buf + offset + header.collisionFileOffset ); }; }; -struct LGB_GIMMICK_HEADER : - public LGB_ENTRY_HEADER +struct GimmickData : + public InstanceObject { uint32_t gimmickFileOffset; char unknownBytes[100]; }; class LGB_GIMMICK_ENTRY : - public LGB_ENTRY + public LgbEntry { public: - LGB_GIMMICK_HEADER header; + GimmickData header; std::string name; std::string gimmickFileName; LGB_GIMMICK_ENTRY( char* buf, uint32_t offset ) : - LGB_ENTRY( buf, offset ) + LgbEntry( buf, offset ) { - header = *reinterpret_cast( buf + offset ); + header = *reinterpret_cast( buf + offset ); name = std::string( buf + offset + header.nameOffset ); gimmickFileName = std::string( buf + offset + header.gimmickFileOffset ); //std::cout << "\t " << gimmickFileName << " unknown: " << header.unknown << "\n"; }; }; -struct LGB_ENPC_HEADER : - public LGB_ENTRY_HEADER +struct ENpcData : + public InstanceObject { uint32_t enpcId; uint8_t unknown1[0x24]; }; class LGB_ENPC_ENTRY : - public LGB_ENTRY + public LgbEntry { public: - LGB_ENPC_HEADER header; + ENpcData header; std::string name; LGB_ENPC_ENTRY( char* buf, uint32_t offset ) : - LGB_ENTRY( buf, offset ) + LgbEntry( buf, offset ) { - header = *reinterpret_cast< LGB_ENPC_HEADER* >( buf + offset ); + header = *reinterpret_cast< ENpcData* >( buf + offset ); name = std::string( buf + offset + header.nameOffset ); //std::cout << "\t ENpc " << header.enpcId << " " << name << "\n"; }; }; -struct LGB_EOBJ_HEADER : - public LGB_ENTRY_HEADER +struct EObjData : + public InstanceObject { uint32_t eobjId; uint32_t levelHierachyId; @@ -203,23 +203,23 @@ struct LGB_EOBJ_HEADER : }; class LGB_EOBJ_ENTRY : - public LGB_ENTRY + public LgbEntry { public: - LGB_EOBJ_HEADER header; + EObjData header; std::string name; LGB_EOBJ_ENTRY( char* buf, uint32_t offset ) : - LGB_ENTRY( buf, offset ) + LgbEntry( buf, offset ) { - header = *reinterpret_cast< LGB_EOBJ_HEADER* >( buf + offset ); + header = *reinterpret_cast< EObjData* >( buf + offset ); //std::cout << "\t " << header.eobjId << " " << name << " unknown: " << header.unknown << "\n"; name = std::string( buf + offset + header.nameOffset ); }; }; -struct LGB_MAPRANGE_HEADER : - public LGB_ENTRY_HEADER +struct MapRangeData : + public InstanceObject { uint32_t type; uint16_t unknown2; @@ -227,35 +227,34 @@ struct LGB_MAPRANGE_HEADER : uint8_t unknown4[0x10]; }; -struct LGB_MAPRANGE_ENTRY : - public LGB_ENTRY +struct LGB_MAP_RANGE_ENTRY : public LgbEntry { public: - LGB_MAPRANGE_HEADER header; + MapRangeData header; std::string name; - LGB_MAPRANGE_ENTRY( char* buf, uint32_t offset ) : - LGB_ENTRY( buf, offset ) + LGB_MAP_RANGE_ENTRY( char* buf, uint32_t offset ) : + LgbEntry( buf, offset ) { - header = *reinterpret_cast< LGB_MAPRANGE_HEADER* >( buf + offset ); + header = *reinterpret_cast< MapRangeData* >( buf + offset ); name = std::string( buf + offset + header.nameOffset ); }; }; struct LGB_COLLISION_BOX_HEADER : - public LGB_ENTRY_HEADER + public InstanceObject { uint8_t unk[100]; }; struct LGB_COLLISION_BOX_ENTRY : - public LGB_ENTRY + public LgbEntry { LGB_COLLISION_BOX_HEADER header; std::string name; LGB_COLLISION_BOX_ENTRY( char* buf, uint32_t offset ) : - LGB_ENTRY( buf, offset ) + LgbEntry( buf, offset ) { header = *reinterpret_cast< LGB_COLLISION_BOX_HEADER* >( buf + offset ); header.type = LgbEntryType::CollisionBox; @@ -305,7 +304,7 @@ struct LGB_GROUP LGB_FILE* parent; LGB_GROUP_HEADER header; std::string name; - std::vector< std::shared_ptr< LGB_ENTRY > > entries; + std::vector< std::shared_ptr< LgbEntry > > entries; LGB_GROUP( char* buf, LGB_FILE* parentStruct, uint32_t offset ) { diff --git a/src/tools/pcb_reader/main.cpp b/src/tools/pcb_reader/main.cpp index f4d29d2a..e34c33f6 100644 --- a/src/tools/pcb_reader/main.cpp +++ b/src/tools/pcb_reader/main.cpp @@ -429,7 +429,7 @@ int main( int argc, char* argv[] ) } return true; }; - auto exportSgbModel = [&]( const std::string& sgbFilePath, LGB_ENTRY* pGimmick, bool isEobj = false ) + auto exportSgbModel = [&]( const std::string& sgbFilePath, LgbEntry* pGimmick, bool isEobj = false ) { if( auto pSgbFile = pCache->getSgbFile( sgbFilePath ) ) { diff --git a/src/world/Actor/Player.cpp b/src/world/Actor/Player.cpp index fde14915..11421e06 100644 --- a/src/world/Actor/Player.cpp +++ b/src/world/Actor/Player.cpp @@ -19,8 +19,10 @@ #include "Territory/Territory.h" #include "Territory/ZonePosition.h" #include "Territory/InstanceContent.h" +#include "Territory/InstanceObjectCache.h" #include "Territory/Land.h" + #include "Network/GameConnection.h" #include "Network/PacketWrappers/ActorControlPacket.h" #include "Network/PacketWrappers/ActorControlSelfPacket.h" @@ -350,8 +352,27 @@ void Sapphire::Entity::Player::teleport( uint16_t aetheryteId, uint8_t type ) } setStateFlag( PlayerStateFlag::BetweenAreas ); + + auto pInstanceObjectCache = m_pFw->get< InstanceObjectCache >(); + auto targetPos = pTeriMgr->getTerritoryPosition( data->level.at( 0 ) ); + auto pop = pInstanceObjectCache->getPopRange( data->territory, data->level[ 0 ] ); + auto pop1 = pInstanceObjectCache->getPopRange( data->territory, data->level[ 1 ] ); + + if( pop ) + { + sendDebug( "Teleport: popRange {0} found!", data->level.at( 0 ) ); + } + else if( pop1 ) + { + sendDebug( "Teleport: popRange {0} found!", data->level.at( 1 ) ); + } + else + { + sendDebug( "Teleport: popRange not found!" ); + } + Common::FFXIVARR_POSITION3 pos; pos.x = 0; pos.y = 0; diff --git a/src/world/Manager/DebugCommandMgr.cpp b/src/world/Manager/DebugCommandMgr.cpp index 9fef637d..1fb97d66 100644 --- a/src/world/Manager/DebugCommandMgr.cpp +++ b/src/world/Manager/DebugCommandMgr.cpp @@ -209,31 +209,10 @@ void Sapphire::World::Manager::DebugCommandMgr::set( char* data, Entity::Player& sscanf( params.c_str(), "%i %i", &map_id, &discover_id ); auto discoveryPacket = makeZonePacket< FFXIVIpcDiscovery >( player.getId() ); - discoveryPacket->data().map_id = map_id; - discoveryPacket->data().map_part_id = discover_id; + discoveryPacket->data().mapId = map_id; + discoveryPacket->data().mapPartId = discover_id; player.queuePacket( discoveryPacket ); } - - else if( ( subCommand == "discovery_pos" ) && ( params != "" ) ) - { - int32_t map_id; - int32_t discover_id; - int32_t pos_id; - sscanf( params.c_str(), "%i %i %i", &pos_id, &map_id, &discover_id ); - - std::string query2 = "UPDATE IGNORE `discoveryinfo` SET `discover_id` = '" + std::to_string( discover_id ) + - "' WHERE `discoveryinfo`.`id` = " + std::to_string( pos_id ) + ";"; - - std::string query1 = - "INSERT IGNORE INTO `discoveryinfo` (`id`, `map_id`, `discover_id`) VALUES ('" + std::to_string( pos_id ) + - "', '" + std::to_string( map_id ) + - "', '" + std::to_string( discover_id ) + "')"; - - pDb->execute( query1 ); - pDb->execute( query2 ); - - } - else if( subCommand == "discovery_reset" ) { player.resetDiscovery(); diff --git a/src/world/Network/Handlers/PacketHandlers.cpp b/src/world/Network/Handlers/PacketHandlers.cpp index 4b3c83a4..e411456e 100644 --- a/src/world/Network/Handlers/PacketHandlers.cpp +++ b/src/world/Network/Handlers/PacketHandlers.cpp @@ -9,6 +9,9 @@ #include #include +#include +#include + #include #include #include @@ -20,6 +23,7 @@ #include "Territory/Land.h" #include "Territory/ZonePosition.h" #include "Territory/House.h" +#include "Territory/InstanceObjectCache.h" #include "Network/PacketWrappers/PlayerSetupPacket.h" #include "Network/PacketWrappers/PingPacket.h" @@ -274,22 +278,56 @@ void Sapphire::Network::GameConnection::zoneLineHandler( FrameworkPtr pFw, const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { - auto pTeriMgr = pFw->get< TerritoryMgr >(); const auto packet = ZoneChannelPacket< Client::FFXIVIpcZoneLineHandler >( inPacket ); const auto zoneLineId = packet.data().zoneLineId; + auto pTeriMgr = pFw->get< TerritoryMgr >(); + auto pInstanceObjectCache = pFw->get< InstanceObjectCache >(); + auto tInfo = player.getCurrentTerritory()->getTerritoryTypeInfo(); + + auto pExitRange = pInstanceObjectCache->getExitRange( player.getTerritoryTypeId(), zoneLineId ); + + Common::FFXIVARR_POSITION3 targetPos{}; + uint32_t targetZone; + if( pExitRange ) + { + player.sendDebug( "Found ExitRange#{0}", zoneLineId ); + player.sendDebug( "destTerritoryType#{0}", pExitRange->header.destTerritoryType ); + player.sendDebug( "destInstanceObjectId#{0}", pExitRange->header.destInstanceObjectId ); + + auto pPopRange = pInstanceObjectCache->getPopRange( pExitRange->header.destTerritoryType, + pExitRange->header.destInstanceObjectId ); + if( pPopRange ) + { + targetZone = pExitRange->header.destTerritoryType; + player.sendDebug( "\tFound PopRange#{0}", pExitRange->header.destInstanceObjectId ); + player.sendDebug( "\t{0}", pPopRange->header.transform.translation.x ); + player.sendDebug( "\t{0}", pPopRange->header.transform.translation.y ); + player.sendDebug( "\t{0}", pPopRange->header.transform.translation.z ); + targetPos = Common::FFXIVARR_POSITION3 { pPopRange->header.transform.translation.x, + pPopRange->header.transform.translation.y, + pPopRange->header.transform.translation.z }; + + player.sendDebug( "ZoneLine #{0} found.", zoneLineId ); + + auto preparePacket = makeZonePacket< FFXIVIpcPrepareZoning >( player.getId() ); + preparePacket->data().targetZone = pExitRange->header.destTerritoryType; + + //ActorControlSelfPacket controlPacket( pPlayer, ActorControlType::DespawnZoneScreenMsg, + // 0x03, player.getId(), 0x01, targetZone ); + player.queuePacket( preparePacket ); + + } + } + player.sendDebug( "Walking ZoneLine#{0}", zoneLineId ); auto pZone = player.getCurrentTerritory(); - auto pLine = pTeriMgr->getTerritoryPosition( zoneLineId ); - - Common::FFXIVARR_POSITION3 targetPos{}; - uint32_t targetZone; float rotation = 0.0f; - if( pLine != nullptr ) +/* if( pLine != nullptr ) { player.sendDebug( "ZoneLine #{0} found.", zoneLineId ); targetPos = pLine->getTargetPosition(); @@ -311,7 +349,7 @@ void Sapphire::Network::GameConnection::zoneLineHandler( FrameworkPtr pFw, targetPos.y = 0; targetPos.z = 0; targetZone = pZone->getTerritoryTypeId(); - } + }*/ player.performZoning( targetZone, targetPos, rotation ); } @@ -321,29 +359,23 @@ void Sapphire::Network::GameConnection::discoveryHandler( FrameworkPtr pFw, const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { + auto pInstanceObjectCache = pFw->get< InstanceObjectCache >(); + auto tInfo = player.getCurrentTerritory()->getTerritoryTypeInfo(); const auto packet = ZoneChannelPacket< Client::FFXIVIpcDiscoveryHandler >( inPacket ); const auto positionRef = packet.data().positionRef; - auto pDb = pFw->get< Db::DbWorkerPool< Db::ZoneDbConnection > >(); + auto pRefInfo = pInstanceObjectCache->getMapRange( player.getTerritoryTypeId(), positionRef ); - auto pQR = pDb->query( "SELECT id, map_id, discover_id " - "FROM discoveryinfo " - "WHERE id = " + std::to_string( positionRef ) + ";" ); - - if( !pQR->next() ) - { - player.sendDebug( "Discovery ref pos id#{0} not found!", positionRef ); - return; - } - - auto discoveryPacket = makeZonePacket< FFXIVIpcDiscovery >( player.getId() ); - discoveryPacket->data().map_id = pQR->getUInt( 2 ); - discoveryPacket->data().map_part_id = pQR->getUInt( 3 ); - - player.queuePacket( discoveryPacket ); player.sendDebug( "Discovery ref pos id#{0}", positionRef ); - player.discover( pQR->getUInt16( 2 ), pQR->getUInt16( 3 ) ); + if( pRefInfo ) + { + auto discoveryPacket = makeZonePacket< FFXIVIpcDiscovery >( player.getId() ); + discoveryPacket->data().mapId = tInfo->map; + discoveryPacket->data().mapPartId = pRefInfo->header.discoveryIndex; + player.queuePacket( discoveryPacket ); + player.discover( tInfo->map, pRefInfo->header.discoveryIndex ); + } } diff --git a/src/world/ServerMgr.cpp b/src/world/ServerMgr.cpp index 5fbd66e6..0186d396 100644 --- a/src/world/ServerMgr.cpp +++ b/src/world/ServerMgr.cpp @@ -44,6 +44,8 @@ #include "Manager/NaviMgr.h" #include "Manager/ActionMgr.h" +#include "Territory/InstanceObjectCache.h" + using namespace Sapphire::World::Manager; Sapphire::World::ServerMgr::ServerMgr( const std::string& configName, FrameworkPtr pFw ) : @@ -171,6 +173,10 @@ void Sapphire::World::ServerMgr::run( int32_t argc, char* argv[] ) } framework()->set< Scripting::ScriptMgr >( pScript ); + Logger::info( "Setting up InstanceObjectCache" ); + auto pInstanceObjCache = std::make_shared< Sapphire::InstanceObjectCache >( framework() ); + framework()->set< Sapphire::InstanceObjectCache >( pInstanceObjCache ); + auto pActionMgr = std::make_shared< Manager::ActionMgr >( framework() ); framework()->set< Manager::ActionMgr >( pActionMgr ); diff --git a/src/world/Territory/InstanceObjectCache.cpp b/src/world/Territory/InstanceObjectCache.cpp new file mode 100644 index 00000000..81363cab --- /dev/null +++ b/src/world/Territory/InstanceObjectCache.cpp @@ -0,0 +1,118 @@ +#include "InstanceObjectCache.h" +#include "Exd/ExdDataGenerated.h" +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +Sapphire::InstanceObjectCache::InstanceObjectCache( std::shared_ptr< Framework > pFramework ) : + m_pFramework( pFramework ) +{ + + auto pExd = pFramework->get< Sapphire::Data::ExdDataGenerated >(); + auto idList = pExd->getTerritoryTypeIdList(); + + size_t count = 0; + for( const auto& id : idList ) + { + // show some loading indication... + if( count++ % 10 == 0 ) + std::cout << "."; + + auto territoryType = pExd->get< Sapphire::Data::TerritoryType >( id ); + if( !territoryType ) + continue; + + auto path = territoryType->bg; + + if( path.empty() ) + continue; + + // TODO: Horrible workaround... Fails if expansion is not installed + if( path.find( "ex3" ) != std::string::npos ) + continue; + + path = std::string( "bg/" ) + path.substr( 0, path.find( "/level/" ) ); + + // TODO: it does feel like this needs to be streamlined into the datReader instead of being done here... + std::string bgLgbPath( path + "/level/bg.lgb" ); + std::string planmapLgbPath( path + "/level/planmap.lgb" ); + std::vector< char > bgSection; + std::vector< char > planmapSection; + + auto test_file = pExd->getGameData()->getFile( bgLgbPath ); + bgSection = test_file->access_data_sections().at( 0 ); + + auto planmap_file = pExd->getGameData()->getFile( planmapLgbPath ); + planmapSection = planmap_file->access_data_sections().at( 0 ); + + std::vector< std::string > stringList; + + uint32_t offset1 = 0x20; + + LGB_FILE bgLgb( &bgSection[ 0 ], "bg" ); + LGB_FILE planmapLgb( &planmapSection[ 0 ], "planmap" ); + + std::vector< LGB_FILE > lgbList{ bgLgb, planmapLgb }; + uint32_t max_index = 0; + + for( const auto& lgb : lgbList ) + { + for( const auto& group : lgb.groups ) + { + for( const auto& pEntry : group.entries ) + { + + if( pEntry->getType() == LgbEntryType::MapRange ) + { + auto pMapRange = reinterpret_cast< LGB_MAP_RANGE_ENTRY* >( pEntry.get() ); + m_mapRangeCache.insert( id, *pMapRange ); + } + else if( pEntry->getType() == LgbEntryType::ExitRange ) + { + auto pExitRange = reinterpret_cast< LGB_EXIT_RANGE_ENTRY* >( pEntry.get() ); + m_exitRangeCache.insert( id, *pExitRange); + } + else if( pEntry->getType() == LgbEntryType::PopRange ) + { + if( pEntry->header.instanceId == 1359242 ) + { + std::cout << ">>>" << id << "__" << static_cast< uint32_t >( pEntry->getType() ) << ">>>\n"; + //break; + } + + auto pPopRange = reinterpret_cast< LGB_POP_RANGE_ENTRY* >( pEntry.get() ); + m_popRangeCache.insert( id, *pPopRange ); + } + } + } + } + } + std::cout << "\n"; +} + + +Sapphire::InstanceObjectCache::MapRangePtr + Sapphire::InstanceObjectCache::getMapRange( uint16_t zoneId, uint32_t mapRangeId ) +{ + return m_mapRangeCache.get( zoneId, mapRangeId ); +} + +Sapphire::InstanceObjectCache::ExitRangePtr + Sapphire::InstanceObjectCache::getExitRange( uint16_t zoneId, uint32_t exitRangeId ) +{ + return m_exitRangeCache.get( zoneId, exitRangeId ); +} + +Sapphire::InstanceObjectCache::PopRangePtr + Sapphire::InstanceObjectCache::getPopRange( uint16_t zoneId, uint32_t popRangeId ) +{ + return m_popRangeCache.get( zoneId, popRangeId ); +} \ No newline at end of file diff --git a/src/world/Territory/InstanceObjectCache.h b/src/world/Territory/InstanceObjectCache.h new file mode 100644 index 00000000..83e9a6a3 --- /dev/null +++ b/src/world/Territory/InstanceObjectCache.h @@ -0,0 +1,84 @@ +#ifndef SAPPHIRE_INSTANCEOBJECTCACHE_H +#define SAPPHIRE_INSTANCEOBJECTCACHE_H + +#include +#include + +struct LGB_MAP_RANGE_ENTRY; +struct LGB_EXIT_RANGE_ENTRY; +struct LGB_POP_RANGE_ENTRY; + + +namespace Sapphire +{ + class Framework; + + template< typename T > + class ObjectCache + { + + using ObjectPtr = std::shared_ptr< T >; + using ObjectMap = std::unordered_map< uint32_t, ObjectPtr >; + using ZoneObjectCache = std::unordered_map< uint16_t, ObjectMap >; + + ZoneObjectCache m_objectCache; + + public: + ObjectPtr get( uint16_t zoneId, uint32_t id ) + { + auto it = m_objectCache.find( zoneId ); + if( it != m_objectCache.end() ) + { + auto rangeIt = it->second.find( id ); + if( rangeIt != it->second.end() ) + { + return rangeIt->second; + } + } + return nullptr; + } + + template< typename T > + void insert( uint16_t zoneId, T& entry ) + { + auto pShared = std::make_shared< T >( entry ); + if( m_objectCache.find( zoneId ) == m_objectCache.end() ) + { + ObjectMap cache; + cache[ entry.header.instanceId ] = pShared; + m_objectCache[ zoneId ] = cache; + } + else + { + auto it = m_objectCache.find( zoneId ); + it->second[ entry.header.instanceId ] = pShared; + } + } + }; + + class InstanceObjectCache + { + public: + using MapRangePtr = std::shared_ptr< LGB_MAP_RANGE_ENTRY >; + using ExitRangePtr = std::shared_ptr< LGB_EXIT_RANGE_ENTRY >; + using PopRangePtr = std::shared_ptr< LGB_POP_RANGE_ENTRY >; + + InstanceObjectCache( std::shared_ptr< Framework > pFramework ); + ~InstanceObjectCache() = default; + + MapRangePtr getMapRange( uint16_t zoneId, uint32_t mapRangeId ); + ExitRangePtr getExitRange( uint16_t zoneId, uint32_t exitRangeId ); + PopRangePtr getPopRange( uint16_t zoneId, uint32_t popRangeId ); + + private: + ObjectCache< LGB_MAP_RANGE_ENTRY > m_mapRangeCache; + ObjectCache< LGB_EXIT_RANGE_ENTRY > m_exitRangeCache; + ObjectCache< LGB_POP_RANGE_ENTRY > m_popRangeCache; + std::shared_ptr< Framework > m_pFramework; + + }; + +} + + +#endif //SAPPHIRE_INSTANCEOBJECTCACHE_H