Overview
S Balance
S Value
$0.00More Info
Private Name Tags
ContractCreator
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
FARPG_BasicInteractions
Compiler Version
v0.8.28+commit.7893614a
Contract Source Code (Solidity)
/** *Submitted for verification at SonicScan.org on 2025-02-09 */ // File: @openzeppelin/[email protected]/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/[email protected]/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: FINALdeployFA/LIB - Common Structs.sol pragma solidity ^0.8.9; library S { //Pet struct struct Unit { uint hp; //unit fainted when hp <= 0 uint attack; //attack - defense = damage on hp uint defense; //attack - defense = damage on hp uint speed; //how frequent to take a move uint intelligence; //how frequent to use skill uint genestrength; //depends on how many duplicates uint range; //range skill, id uint special; //special skill, id } struct Status { //uint32 types; //determine element and some skills. 0=none, 1=fire, 2=water, 3=ice, 4=electic, 5=nature, 6=light, 7=dark //linked to skill right now uint id; //unit id uint family; //determine which class of gear it can be wore. record while evolve, since its only has max 2 family, example Dragon+phantom, and 30gene max, so can use *100 // family to gene is tricky, need to +1 to make sure 0 means nothing. Thus 1 is Dragon, althought for trainerGene, 0 is dragon // because player wont submit a transaction to set their trainer gene when start. uint stage; //1 is rookie, 2 is mature, 3 is perfect //e.g. start with dragon, so family = 1, later if evolve with phantom, then 2*100 + family = 201, 102 or 201 also represent Dragon+phantom //0=none, 1=dragon, 2=phantom, 3=aqua, 4=wombat // uint32 bond; //how many action you took on this unit // uint64 stamina; //how much you can train it per day. it should follow saturation graph } struct Time { uint bond; //how many time you took on this unit , use to evolve uint stamina; //how much you can train it per day. it should follow saturation graph uint hunger; //how much you feed it per day. it should follow saturation graph } /* struct PlayerData { //----Player Quest variables-------- uint mainquest; // mainquest 77 digits. Each digit represents a quest progress uint sidequest; // side quest 77 digits. Each digit represents a quest progress uint premiumscore; // serves like premium exp, gained from events, quests, marketing campaigns, etc. // also indicates player activeness. //----Player Stats variables-------- // uint exp; // player experience, increases based on activity // uint rankscore; // player ranking score for PvP // uint32 energy1; // energy of the player, for time-gated Quest/SideQuest // uint32 energy2; // energy of the player, for time-gated PvP-ranking // uint32 energy22; // energy of the player, for time-gated PvP-kingofthehill // uint32 energy3; // energy of the player, for time-gated WorldBoss //-----limits for restriction------- uint limit1; // limit free openbox/mint. Default: 2 per day uint limit2; // reserve uint limit3; // reserve uint timebound1; // for limit free openbox/mint. Set it to now if >24hr and reset limit1 uint timebound2; // reserve */ } // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == _ENTERED; } } // File: FINALdeployFA/INTERFACE - StorageV2.sol pragma solidity ^0.8.20; // Import your custom structs /** * @title IFARPG_Storage * @dev Interface for FARPG_Storage so other contracts can call it */ interface IFARPG_Storage { //------------------------------------------------------------------------- // Administrative / Master Contract Access //------------------------------------------------------------------------- function owner() external view returns (address); function masterContracts(uint index) external view returns (address); function masterIndex(address) external view returns (uint); function addMasterContract(address _address, uint _index) external; function addMasterContractBatch(address[] memory _addresses, uint[] memory _indices) external; function removeMasterContract(uint _index) external; function getAllMasterContracts() external view returns (address[] memory, uint[] memory); //------------------------------------------------------------------------- // UID Management //------------------------------------------------------------------------- function UIDmain(address) external view returns (uint); function UID_ownedby(uint) external view returns (address); function UIDcounter() external view returns (uint); function getUID(address player) external view returns (uint _UID); function transferUID(address player, address newplayerwallet) external; function registerUID(address player) external; function setUIDmain (address playerAddress, uint UID) external; function setUID_ownedby (uint UID, address playerAddress) external; //------------------------------------------------------------------------- // Quest (setters) //------------------------------------------------------------------------- function setMainQuest(address player, uint index, uint8 progress) external; function setSideQuest(address player, uint index, uint8 progress) external; function setPremiumScore(address player, uint score) external; function setPlayerGeneStrength(address player, uint index, uint strength) external; function setPlayerVitamin(address player, uint index, uint amount) external; //------------------------------------------------------------------------- // Quest (getters) //------------------------------------------------------------------------- function getMainQuestProgress(address player, uint index) external view returns (uint8); function getSideQuestProgress(address player, uint index) external view returns (uint8); function getPremiumScore(address player) external view returns (uint); function getPlayerQuestAndScore(address player, uint index) external view returns (uint, uint, uint); function getMainQuestProgressArray(address player) external view returns (uint8[64] memory); function getSideQuestProgressArray(address player) external view returns (uint8[64] memory); //------------------------------------------------------------------------- // Player Stats (setters) //------------------------------------------------------------------------- function setPersonalWallet(address player, address personal) external; function setGiveControlTo(address player, address web2wallet) external; function setExp(address player, uint experience) external; function setRankScore(address player, uint score) external; function setEnergy1(address player, uint energy) external; function setEnergy2(address player, uint energy) external; function setEnergy22(address player, uint energy) external; function setEnergy3(address player, uint energy) external; function setTeamFormat(address player, uint[60] calldata format) external; function setUsernameToUID(string memory username, uint _UID) external; function setUIDToUsername(uint _UID, string memory username) external; function deleteUsernameToAddress (string memory username) external; // Points function setPoint1(address player, uint point) external; function setPoint2(address player, uint point) external; function setPoint3(address player, uint point) external; function setPoint4(address player, uint point) external; function setPoint5(address player, uint point) external; function addPoint1(address player, uint point) external; function addPoint2(address player, uint point) external; function addPoint3(address player, uint point) external; function addPoint4(address player, uint point) external; function addPoint5(address player, uint point) external; //------------------------------------------------------------------------- // Player Stats (getters) //------------------------------------------------------------------------- function personalwallet(address) external view returns (address); function givecontrolto(address) external view returns (address); function getExperience(address player) external view returns (uint); function getRankingScore(address player) external view returns (uint); function getEnergy1(address player) external view returns (uint); function getEnergy2(address player) external view returns (uint); function getEnergy22(address player) external view returns (uint); function getEnergy3(address player) external view returns (uint); function getPlayerStats(address player) external view returns (uint, uint, uint, uint, uint, uint); function UIDToUsername(uint) external view returns (string memory); function usernameToUID(string memory) external view returns (uint); function getPoint1(address player) external view returns (uint); function getPoint2(address player) external view returns (uint); function getPoint3(address player) external view returns (uint); function getPoint4(address player) external view returns (uint); function getPoint5(address player) external view returns (uint); function getPlayerPoints(address player) external view returns (uint, uint, uint, uint, uint); function getPlayergenestrengthArray(address player) external view returns (uint[50] memory); function getPlayerGeneStrength(address player, uint index) external view returns (uint); function getPlayervitaminArray(address player) external view returns (uint[50] memory); function getPlayerVitamin(address player, uint index) external view returns (uint); //------------------------------------------------------------------------- // Limits (setters) //------------------------------------------------------------------------- function setLimit1(address player, uint limit) external; function setLimit2(address player, uint limit) external; function setLimit3(address player, uint limit) external; function setTimebound1(address player, uint timestamp) external; function setTimebound2(address player, uint timestamp) external; function setTimebound3(address player, uint timestamp) external; //------------------------------------------------------------------------- // Limits (getters) //------------------------------------------------------------------------- function getLimit1(address player) external view returns (uint); function getLimit2(address player) external view returns (uint); function getLimit3(address player) external view returns (uint); function getTimebound1(address player) external view returns (uint); function getTimebound2(address player) external view returns (uint); function getTimebound3(address player) external view returns (uint); function getPlayerLimits(address player) external view returns (uint, uint, uint, uint, uint, uint); //------------------------------------------------------------------------- // Numberset (setters) //------------------------------------------------------------------------- function setNumberSet1(address player, uint[6] memory number) external; function setNumberSet2(address player, uint[5] memory number) external; function setNumberSet3(address player, uint[5] memory number) external; function setNumberSet4(address player, uint[5] memory number) external; function setNumberSet5(address player, uint[5] memory number) external; function setNumberSet6(address player, uint[5] memory number) external; function setNumberSet7(address player, uint[5] memory number) external; function setNumberSet8(address player, uint[5] memory number) external; function setNumberSet9(address player, uint[5] memory number) external; function setNumberSetA(address player, uint[5] memory number) external; function setNumberSetB(address player, uint[5] memory number) external; function setNumberSetC(address player, uint[5] memory number) external; function setNumberSetD(address player, uint[5] memory number) external; function setNumberSetE(address player, uint[10] memory number) external; function setNumberSetF(address player, uint[10] memory number) external; function setNumberSetG(address player, uint[10] memory number) external; function setNumberSetH(address player, uint[10] memory number) external; //------------------------------------------------------------------------- // Numberset (getters) //------------------------------------------------------------------------- function getNumberSet1(address player) external view returns (uint[6] memory); function getNumberSet2(address player) external view returns (uint[5] memory); function getNumberSet3(address player) external view returns (uint[5] memory); function getNumberSet4(address player) external view returns (uint[5] memory); function getNumberSet5(address player) external view returns (uint[5] memory); function getNumberSet6(address player) external view returns (uint[5] memory); function getNumberSet7(address player) external view returns (uint[5] memory); function getNumberSet8(address player) external view returns (uint[5] memory); function getNumberSet9(address player) external view returns (uint[5] memory); function getNumberSetA(address player) external view returns (uint[5] memory); function getNumberSetB(address player) external view returns (uint[5] memory); function getNumberSetC(address player) external view returns (uint[5] memory); function getNumberSetD(address player) external view returns (uint[5] memory); function getNumberSetE(address player) external view returns (uint[10] memory); function getNumberSetF(address player) external view returns (uint[10] memory); function getNumberSetG(address player) external view returns (uint[10] memory); function getNumberSetH(address player) external view returns (uint[10] memory); //------------------------------------------------------------------------- // PVP Ranks //------------------------------------------------------------------------- struct Player { uint256 rankPoints; uint256 league; uint256 indexInLeague; // Index of the player within their league array } function setPlayers(address player, Player memory rankpointleagueindexinleague) external; function setReset_Time_Attempts(address player, uint[2] memory resettimeattemps) external; function setEligible_Opponents(address player, address[5] memory eligibleOppo) external; function setFaught_Opponents(address player, uint[5] memory faughtOppo) external; function setDefending_Formation(address player, uint[3] memory defendingslot) external; function getPlayers(address player) external view returns (Player memory ) ; function getReset_Time_Attempts(address player ) external view returns (uint[2] memory ); function getEligible_Opponents(address player ) external view returns (address[5] memory); function getFaught_Opponents(address player ) external view returns(uint[5] memory) ; function getDefending_Formation(address player) external view returns (uint[3] memory ); //------------------------------------------------------------------------- // Pet data (setters) //------------------------------------------------------------------------- function setPetUnits(address player, uint index, S.Unit memory newUnit) external; function setPetUnitsMaxVitamined(address player, uint index, S.Unit memory newUnit) external; function setPetStatuses(address player, uint index, S.Status memory newStatus) external; function setPetTimes(address player, uint index, S.Time memory newTime) external; //------------------------------------------------------------------------- // Pet data (getters) //------------------------------------------------------------------------- function getPetUnitsAll(address player) external view returns (S.Unit[500] memory); function getPetUnits(address player, uint _index) external view returns (S.Unit memory); function getPetUnitsMaxVitaminedAll(address player) external view returns (S.Unit[500] memory); function getPetUnitsMaxVitamined(address player, uint _index) external view returns (S.Unit memory); function getPetStatusesAll(address player) external view returns (S.Status[500] memory); function getPetStatuses(address player, uint _index) external view returns (S.Status memory); function getPetTimesAll(address player) external view returns (S.Time[500] memory); function getPetTimes(address player, uint _index) external view returns (S.Time memory); //------------------------------------------------------------------------- // Party / Outfit //------------------------------------------------------------------------- function setPartyFormation(address player, uint[30] memory slots) external; function setTrainerOutfitPosition(address player, uint[150] memory outfitIds) external; function getPartyFormation(address player) external view returns (uint[30] memory); function getAllOutfits(address player) external view returns (uint[150] memory); //------------------------------------------------------------------------- // Trainer Gene Infusing //------------------------------------------------------------------------- function setTrainerGeneInfusingGene(address player, uint index, uint value) external; function setTrainerGeneInfusingGeneAll(address player, uint[50] memory newData) external; function setTrainerGeneInfusingTimer(address player, uint index, uint value) external; function setTrainerGeneInfusingTimerAll(address player, uint[50] memory newData) external; function getTrainerGeneInfusingGeneAll(address player) external view returns (uint[50] memory) ; function getTrainerGeneInfusingTimerAll(address player) external view returns (uint[50] memory); function getTrainerGeneInfusingGene(address player, uint Index)external view returns (uint ) ; function getTrainerGeneInfusingTimer(address player, uint Index)external view returns (uint ); //------------------------------------------------------------------------- // Additional Utility //------------------------------------------------------------------------- function getBattleUnit3(address player, uint[3] calldata slots) external view returns (S.Unit[3] memory Units3, uint[3] memory UnitIds); function getSlotUnitMore(address player, uint startindex, uint stopindex) external view returns (S.Unit[] memory Units, uint[] memory UnitIds); function getTeamFormat(address _addr) external view returns (uint[60] memory); //------------------------------------------------------------------------- // Weather System //------------------------------------------------------------------------- function getWeatherUnity() external view returns (uint _weather, uint _daylight, uint _blocktime); function getWeatherBattle(uint _timenow) external view returns (uint _weather); function setWeatherConstants(uint[12] memory _weatherIndices) external; function getWeatherIndexConstants() external view returns (uint[] memory); } // File: FINALdeployFA/PUBLIC - Basic Interactions V1.sol pragma solidity ^0.8.19; //_______________________________________________________________ // ___ __ __ _ ___ _ ___ _ __ // | _ )\ \ / / _ | | / _ \ _ | | / _ \ (_)\ \ // | _ \ \ V / | || || (_) || || || (_) | _ | | // |___/ |_| \__/ \___/ \__/ \___/ ( ) | | // |/ /_/ //_______________________________________________________________ // Interface for accessing Storage //------------------------------------------------------------------- // _____ _ _ _______ ______ _____ ______ _____ ______ // |_ _| \ | |__ __| ____| __ \| ____/\ / ____| ____| // | | | \| | | | | |__ | |__) | |__ / \ | | | |__ // | | | . ` | | | | __| | _ /| __/ /\ \| | | __| // _| |_| |\ | | | | |____| | \ \| | / ____ \ |____| |____ // |_____|_| \_| |_| |______|_| \_\_|/_/ \_\_____|______| // //------------------------------------------------------------------- interface FARPG_RAMInterface { // Read functions struct TrainerData { uint gene; uint[50] genestrength; uint hashed; } function genetoid_mapping(uint trainergene) external pure returns (uint); function petunitsmax(uint id) external pure returns (S.Unit calldata); function petunitsevolveid(S.Status calldata _status, S.Unit calldata _Unit, TrainerData calldata _trainerData) external pure returns (S.Status memory , uint ); } contract FARPG_BasicInteractions is Ownable, ReentrancyGuard { IFARPG_Storage public contractStorage; FARPG_RAMInterface public contractRAM; constructor() { } event StatChangedResult(S.Unit AfterUnit, S.Status AfterStatus, S.Time AfterTime); //------------------------------------------------------------------- // _____ _ ____ ____ _ __ __ // / ____| | / __ \| _ \ /\ | | \ \ / / // | | __| | | | | | |_) | / \ | | \ \ / / // | | |_ | | | | | | _ < / /\ \ | | \ \/ / // | |__| | |___| |__| | |_) / ____ \| |____ \ / _ // \_____|______\____/|____/_/ \_\______| \/ (_) // //------------------------------------------------------------------- uint public PRICE_TOOPENBOX = 8 ether; //Default 8S .openbox for 1st one in 24hr is free, next will be this PRICE, and 2x, 3x, and so on. uint public PRICE_EXPANDSLOT = 5 ether; //Default 5S.fixed for each attemps to expand 1 slot uint public TIME_BOXLIMITRESET = 24 hours; //0th box opened until next TIME, the limit is reset, and can open 0th box again for free. S.Unit[500] public petunitsMAX; uint public TIME_INITIALSTAMINA = 24 hours; //initial stamina uint public TIME_INITIALENDURANCE = 3 hours; //initial endurance/hunger uint public REENTRANT_TIMELIMIT = 2 seconds; // default 2 seconds. means u cannot run the nonreentrant functions >1 time within 3 seconds. uint public PET_STAMINA_MAX = 24 hours; //maximum stamina even rested for so long uint public PET_HUNGER_MAX = 24 hours; // if a pet left for very long time. the MAX hunger should be... uint public ROOKIETOMATURE_BOND = 35 hours; // if Bond more than this, evolve. BUT it is Stamina + Hunger, thus 48hr per day, open Box gave 24+21= 45 hours // so Rookie to Mature default set at 36 hours. Half of to perfect, Feed enough and Train enough, still can evolve immediately right after open box uint public MATURETOPERFECT_BOND = 81 hours; // on evolved, you gain max stamina and initial hunger again, means 45hours again. // to Perfect, I wish it to be at the same day, 36~45 hour + 45 hours = 81~90hours base, 12 hours away = 93hours. So default 93 hours // For debugging, make it 81hours // after rethink. it will cause fatigue to let them online twice per day. so 24 stamina + 21 hunger = 45hrs, twice = 90 hours. set at 81hr is good mapping (address => uint) private reentrant_time; //--------------------------------------------------------- // _____ __ __ _____ _ _ // /\ | __ \| \/ |_ _| \ | | // / \ | | | | \ / | | | | \| | // / /\ \ | | | | |\/| | | | | . ` | // / ____ \| |__| | | | |_| |_| |\ | // /_/ \_\_____/|_| |_|_____|_| \_| // //--------------------------------------------------------- address public treasury = msg.sender; //default function updateTreasury(address _newTreasury) external onlyOwner { require(_newTreasury != address(0), "Invalid treasury address"); treasury = _newTreasury; } function updateStorageContractAAddress(address _newContractAAddress) external onlyOwner { require(_newContractAAddress != address(0), "Invalid address"); contractStorage = IFARPG_Storage(_newContractAAddress); } function updateRAMContractAAddress(address _newContractAAddress) external onlyOwner { require(_newContractAAddress != address(0), "Invalid address"); contractRAM = FARPG_RAMInterface(_newContractAAddress); } function withdraw() external onlyOwner { // Function to withdraw all balance from the contract for revenue require(address(this).balance > 0, "Contract balance is zero"); payable(treasury).transfer(address(this).balance); } //------------ game setting ------------- function setPriceToOpenBox(uint _newPrice) external onlyOwner { PRICE_TOOPENBOX = _newPrice; } function setPriceExpandSlot(uint _newPrice) external onlyOwner { PRICE_EXPANDSLOT = _newPrice; } function setTimeBoxLimitReset(uint _newTime) external onlyOwner { TIME_BOXLIMITRESET = _newTime; } function setTimeInitialStamina(uint _newTime) external onlyOwner { TIME_INITIALSTAMINA = _newTime; } function setTimeInitialEndurance(uint _newTime) external onlyOwner { TIME_INITIALENDURANCE = _newTime; } function setReentrantTimeLimit(uint _newLimit) external onlyOwner { REENTRANT_TIMELIMIT = _newLimit; } function setPetStaminaMax(uint _newMax) external onlyOwner { PET_STAMINA_MAX = _newMax; } function setPetHungerMax(uint _newMax) external onlyOwner { PET_HUNGER_MAX = _newMax; } function setRookieToMatureBond(uint _newBond) external onlyOwner { ROOKIETOMATURE_BOND = _newBond; } function setMatureToPerfectBond(uint _newBond) external onlyOwner { MATURETOPERFECT_BOND = _newBond; } //--------------------------------------------------------- // // _____ _______ _____ _______ // / ____|__ __|/\ | __ \__ __| // | (___ | | / \ | |__) | | | // \___ \ | | / /\ \ | _ / | | // ____) | | |/ ____ \| | \ \ | | // |_____/ |_/_/ \_\_| \_\ |_| // //--------------------------------------------------------- //--------- sub functions --------------- function accountAddressToProceed() public view returns (address) { // Ready for account abstraction // If the player doesn't provide a personal wallet, all data will be recorded in the trainer wallet address playerAddress = contractStorage.personalwallet(msg.sender); if (playerAddress == address(0)) { return msg.sender; } else { return playerAddress; } } function forwardEtherToTreasury() internal { require(treasury != address(0), "Treasury address not set"); (bool sent, ) = treasury.call{value: msg.value}(""); require(sent, "Failed to forward Ether to treasury"); } function openBoxIn24Hr_paid() public view returns (uint boxOpened, uint remainingTimeReset_s, uint pricePerBox) { //check the timenow and minted 0th box whether the limit has reset address playerAddress = accountAddressToProceed(); uint timeElapsed = block.timestamp - contractStorage.getTimebound1(playerAddress); if (timeElapsed >= 24 hours) { //over the TIME limit for 0th box open boxOpened = 0; remainingTimeReset_s = 0; } else { //still within TIME limit since last 0th box opened boxOpened = contractStorage.getLimit1(playerAddress); remainingTimeReset_s = 24 hours - timeElapsed; pricePerBox = PRICE_TOOPENBOX*boxOpened; } } function subtract(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } function slotLimit_expansionCost(uint number_expansionrequest) public view returns (uint slotLimit, uint expansionCost) { address playerAddress = accountAddressToProceed(); slotLimit = contractStorage.getLimit2(playerAddress); require (number_expansionrequest + slotLimit < 499); //499 used as empty, so expanded to 498 only expansionCost = PRICE_EXPANDSLOT*number_expansionrequest; } function petTiming(uint slot) public view returns (uint bond, uint stamina, uint endurance) { //for front end only address playerAddress = accountAddressToProceed(); S.Time memory pettimes = contractStorage.getPetTimes(playerAddress,slot); bond = pettimes.bond; uint _timenow = block.timestamp; if (_timenow - pettimes.stamina > PET_STAMINA_MAX) { stamina = PET_STAMINA_MAX; } else { stamina = _timenow- pettimes.stamina; } if (pettimes.hunger < _timenow) { endurance = 0; } else if (pettimes.hunger - _timenow < PET_HUNGER_MAX) { endurance = pettimes.hunger - _timenow; } else { endurance = PET_HUNGER_MAX; } } modifier onlyEOA() { require(!isContract(msg.sender), "Smart contracts not allowed"); _; } function noneReentrant_time(address player) internal { //this is to prevent player spam an action or botting effectively. //this function must be Internal otherwise, it will congest a player reentrant time to make him/her unplayable require(block.timestamp - reentrant_time[player] >= REENTRANT_TIMELIMIT,"Non-Reentrant, slow down TX attempts."); reentrant_time[player] = block.timestamp; } function isContract(address _addr) internal view returns (bool) { uint256 size; assembly { size := extcodesize(_addr) } return size > 0; } /////////////////////////////////////// OPEN BOX ////////////////////////////////////////////////////////////////// function openBox(uint slot, uint trainergene) public payable nonReentrant { // This function is for the user to open a Pet daily. More than a pet needs to be paid. // The opening box - pet will be according to the active trainer. //---------------- // Check if the chosen slot is available // Check the reset time: Reset time is defined as after the first mint within 24hr // It means paid mint for 2nd and so on will not change the first mint time. //**** SLOT0 is reserved to be empty, cannot be used, for party setting**** //require(slot!=0,"Slot0 cannot be used."); front end need major update. postponed address playerAddress = accountAddressToProceed(); uint limit2 = contractStorage.getLimit2(playerAddress); //limit2 is slot limit uint genestrength = contractStorage.getPlayerGeneStrength(playerAddress,trainergene); uint _timenow = block.timestamp; //check to see the chosen slot has occupied or exceed the slotlimit S.Status memory _petstatus = contractStorage.getPetStatuses(playerAddress, slot); noneReentrant_time(playerAddress); //prevent spam if (limit2 == 0) { limit2 = 5; contractStorage.setLimit2(playerAddress, limit2); //initialize for the limit2 since its a new player } require(slot < limit2, "Chosen slot exceeds limit."); require(_petstatus.id == 0, "Chosen slot is occupied."); //if (trainergene !=0) { //if the trainer is not default Jojo, then make sure this player has different trainer //must play quest 0 to get Jojo genestrength to 1 for free. require(genestrength > 0, "Don't have the gene."); //} //if (genestrength == 0) {genestrength =1;} //after checking limited trainer, set genestr to 1 for default trainer. // Add the rest of your code here... (uint openedBox, uint remainingTimeReset, uint priceperbox) = openBoxIn24Hr_paid(); // drop the opened box memory, do not need it if (remainingTimeReset == 0) { // means player can start to openbox for free //...openbox in next sequence //then set the limit to 1 contractStorage.setLimit1(playerAddress, 1); contractStorage.setTimebound1(playerAddress, block.timestamp); } else { //means taken up the free chances, so need to pay if want to open box require(msg.value == priceperbox, "Insufficient payment to open the box"); //...openbox in next sequence //then increase the limit, do not need to reset the timebound contractStorage.setLimit1(playerAddress, openedBox+1); } //this is the next sequence, so open box safely // I dont use RAM on these setting because it is standard. nothing will change here over patch. S.Unit memory _petunit = S.Unit({ hp: 1000, attack: 100, defense: 50, speed: 100, intelligence: 100, genestrength: genestrength, range: 0, special: 0}); _petstatus = S.Status({id: contractRAM.genetoid_mapping(trainergene), family: trainergene + 1 , stage: 1}); S.Time memory _pettime = S.Time({bond: 0, stamina: _timenow - TIME_INITIALSTAMINA, hunger: _timenow + TIME_INITIALENDURANCE}); contractStorage.setPetUnits(playerAddress, slot ,_petunit); contractStorage.setPetStatuses(playerAddress,slot , _petstatus); contractStorage.setPetTimes(playerAddress, slot ,_pettime); //this need RAM to set max stat //********************************SET MAX STATSSSSS after opened box********************************** contractStorage.setPetUnitsMaxVitamined(playerAddress, slot ,contractRAM.petunitsmax(_petstatus.id)); //***//** evolve set bit based on ID/////////////// // Function to set the bit corresponding to the ID uint GENEbit = contractStorage.getPoint2(playerAddress); // Set the bit at the position corresponding to ID GENEbit |= (1 << (_petstatus.id%10000));//do not minus 1 bit as no shinning contractStorage.setPoint2(playerAddress,GENEbit); //**//***////////////////////////////////////////// if (msg.value > 0) { forwardEtherToTreasury(); } emit StatChangedResult(_petunit,_petstatus,_pettime); } /////////////////////////////////////// EXPAND SLOT ////////////////////////////////////////////////////////////////// function expandSlot(uint numberOfexpansion) public payable nonReentrant { address playerAddress = accountAddressToProceed(); // the slotLimit_expansionCost declare view function above has checked the request expansion slot is no more than 500 hard limit (uint slotlimit, uint expansionCost) = slotLimit_expansionCost(numberOfexpansion); require(msg.value == expansionCost, "Insufficient payment to expand"); contractStorage.setLimit2(playerAddress, slotlimit+numberOfexpansion); //confirmed payment, then expand slot forwardEtherToTreasury(); } /////////////////////////////////////// FEED PET ////////////////////////////////////////////////////////////////// struct PetData { //resolve stack too deep S.Status petstatuses; S.Unit petunits; S.Time pettimes; S.Unit petunitsmax; } function UnitUpdateStats(S.Unit memory petunits, S.Unit memory petunitsmax , uint stats_type, uint rate) internal pure returns (S.Unit memory petunitsout){ //************* rate in 100% = 1000 *********** petunitsout = petunits; if (stats_type == 0) { //hp if (petunitsmax.hp > petunits.hp) { //no overflow petunitsout.hp = petunits.hp + ((petunitsmax.hp - petunits.hp)*rate)/1000; } else {petunits.hp = petunitsmax.hp;} } else if (stats_type == 1) { // atk if (petunitsmax.attack > petunits.attack) { //no overflow petunitsout.attack = petunits.attack + ((petunitsmax.attack - petunits.attack)*rate)/1000; } else {petunits.attack = petunitsmax.attack;} } else if (stats_type == 2) { // def if (petunitsmax.defense > petunits.defense) { //no overflow petunitsout.defense = petunits.defense + ((petunitsmax.defense - petunits.defense)*rate)/1000; } else {petunits.defense = petunitsmax.defense;} } else if (stats_type == 3) { // spd if (petunitsmax.speed > petunits.speed) { //no overflow petunitsout.speed = petunits.speed + ((petunitsmax.speed - petunits.speed)*rate)/1000; } else {petunits.speed = petunitsmax.speed;} } else if (stats_type == 4) { // int if (petunitsmax.intelligence > petunits.intelligence) { //no overflow petunitsout.intelligence = petunits.intelligence + ((petunitsmax.intelligence - petunits.intelligence)*rate)/1000; } else {petunits.intelligence = petunitsmax.intelligence;} } } function feedPet(uint _slot, uint _foodtype, uint _trainergene) public onlyEOA nonReentrant { address playerAddress = accountAddressToProceed(); uint genestrength = contractStorage.getPlayerGeneStrength(playerAddress,_trainergene); //if (_trainergene !=0) { //if the trainer is not default Jojo, then make sure this player has different trainer require(genestrength > 0, "Don't have the gene."); require(_foodtype <= 10, "Wrong Food type"); //} PetData memory Lings; Lings.petstatuses = contractStorage.getPetStatuses(playerAddress,_slot); Lings.petunits = contractStorage.getPetUnits(playerAddress,_slot); Lings.pettimes = contractStorage.getPetTimes(playerAddress,_slot); Lings.petunitsmax = contractStorage.getPetUnitsMaxVitamined(playerAddress,_slot); uint _exp = contractStorage.getExperience(playerAddress); uint _full; //determine how full is the food after eaten in time uint _partialstat; // partial stat gain only. 100% = 10000 uint _timenow = block.timestamp; noneReentrant_time(playerAddress); //prevent spam require (Lings.petstatuses.id != 0, "empty slot"); if (_foodtype==0){_full = 6 hours;} //backpack food else if (_foodtype==1){_full = 12 hours; } //shop1 else if (_foodtype==2){_full = 10 hours; } else if (_foodtype==3){_full = 10 hours; } else if (_foodtype==4){_full = 11 hours; } //shop1.1 else if (_foodtype==5){_full = 11 hours; } else if (_foodtype==6){_full = 24 hours; } //shop2 else if (_foodtype==7){_full = 24 hours; } else if (_foodtype==8){_full = 24 hours; } else if (_foodtype==9){_full = 24 hours; } //shop2.2 else if (_foodtype==10){_full = 24 hours; } if (Lings.pettimes.hunger < _timenow) { //super hungry, endurance = 0 Lings.pettimes.bond = Lings.pettimes.bond + _full; _exp += _full; Lings.pettimes.hunger = _timenow + _full; _partialstat= 10; // 100% = 10 } else if (Lings.pettimes.hunger - _timenow + _full> PET_HUNGER_MAX) { //over feed, gain partial stat uint fullhittingcap = (PET_HUNGER_MAX- (Lings.pettimes.hunger - _timenow)); Lings.pettimes.bond = Lings.pettimes.bond + fullhittingcap; _exp += fullhittingcap; _partialstat = (fullhittingcap*10)/ (_full); //100 = 1 = 100% (upscale 2 0) //this has to run last otherwise alter the hunger variable for above Lings.pettimes.hunger = _timenow + PET_HUNGER_MAX; } else { //no over feed. stat gain all Lings.pettimes.bond = Lings.pettimes.bond + _full; _exp += _full; Lings.pettimes.hunger = Lings.pettimes.hunger + _full; _partialstat= 10; // 100% = 10 } // training percent over iteration function: (max-current)*(1-(1-rate)^iteration) // so i can use this (1-(1-rate)^iteration) to calculate // e.g 1 iteration 7%, with that function 3 iteration suppose to be 19.6% if (_foodtype==0){} //backpack food //**************************** rate from UnitUpdateStats assume 1000 = 100%, _partialstat already upscale 10 ********* //**************************** since 10% = 100 for UnitUpdateStats, and *_partialstat here already... **** //**************************** it turns out that 10 = 10% ***************************** else if (_foodtype==1){Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,0,10*_partialstat);} //hp + 10% //shop1 else if (_foodtype==2){Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,1,5*_partialstat);} //atk + 5% else if (_foodtype==3){Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,2,5*_partialstat);} //def + 5% else if (_foodtype==4){Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,3,5*_partialstat);} //spd + 5% //shop1.1 else if (_foodtype==5){Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,4,5*_partialstat);} //int + 5% else if (_foodtype==6){Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,0,19*_partialstat);} //hp + 19% //shop2 else if (_foodtype==7){Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,1,11*_partialstat);} //atk + 11% else if (_foodtype==8){Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,2,11*_partialstat);} //def + 11% else if (_foodtype==9){Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,3,11*_partialstat);} //spd + 11% //shop2.2 else if (_foodtype==10){Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,4,11*_partialstat);} //int + 11% //*************** check evolve ************** if ((Lings.petstatuses.stage == 1 && Lings.pettimes.bond > ROOKIETOMATURE_BOND)|| //check if rookie, then to mature (Lings.petstatuses.stage == 2 && Lings.pettimes.bond > MATURETOPERFECT_BOND)) { // check if mature, then to perfect //evolve id and maxstats //this need from RAM as update each patch FARPG_RAMInterface.TrainerData memory _trainerdata; _trainerdata.gene = _trainergene; _trainerdata.genestrength = contractStorage.getPlayergenestrengthArray(playerAddress); _trainerdata.hashed = uint(keccak256(abi.encodePacked(playerAddress,block.timestamp,block.prevrandao))); uint compiledGenestrength; (Lings.petstatuses, compiledGenestrength)= contractRAM.petunitsevolveid(Lings.petstatuses,Lings.petunits, _trainerdata); //****** after getting all details from RAM, time to update the storage ****** //4 stuff to update: Status | Times | Unit | Unitmax contractStorage.setPetStatuses(playerAddress,_slot , Lings.petstatuses); //update: ID, family, stage //ONCE evolve you gain Stamina and Endurance Lings.pettimes = S.Time({bond: Lings.pettimes.bond, stamina: _timenow - TIME_INITIALSTAMINA, hunger: _timenow + TIME_INITIALENDURANCE}); contractStorage.setPetTimes(playerAddress, _slot ,Lings.pettimes); //update: bond for evolve, stamina, hunger contractStorage.setPetUnitsMaxVitamined(playerAddress, _slot ,contractRAM.petunitsmax(Lings.petstatuses.id)); //use new id to get max stat, no genestrength and skills yet //evolve gain all stats by 20% Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,0,300); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,1,300); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,2,300); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,3,300); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,4,300); //gain new skill, with training stats above if (Lings.petstatuses.stage == 2) {//evolved into Mature Lings.petstatuses.id += 1; //add 1 to minus 1 back to retain consistent gas. if (Lings.petstatuses.id > 10000) { //if its shinning, normalized it first for skill Lings.petunits.range = Lings.petstatuses.id - 10001; } else { Lings.petunits.range = Lings.petstatuses.id - 1; } } if (Lings.petstatuses.stage == 3) {//**********evolved into Perfect, determine the genestrength, follow the lowest means it wont change. Lings.petstatuses.id += 1; //add 1 to minus 1 back to retain consistent gas. if (Lings.petstatuses.id > 10000) { //if its shinning, normalized it first for skill Lings.petunits.special = Lings.petstatuses.id - 10001; } else { Lings.petunits.special = Lings.petstatuses.id - 1; } } contractStorage.setPetUnits(playerAddress, _slot , Lings.petunits); //final write into petUnits (stats, genestrength, skills) //***//** evolve set bit based on ID/////////////// // Function to set the bit corresponding to the ID uint GENEbit = contractStorage.getPoint2(playerAddress); // Set the bit at the position corresponding to ID GENEbit |= (1 << ((Lings.petstatuses.id-1)%10000));//need to minus 1 bit because of previous add on shinning check contractStorage.setPoint2(playerAddress,GENEbit); //**//***////////////////////////////////////////// } else { //if no evolve, follow back the stamina and hunger, only update Units states and time, Status(ID, Family, stage) no change. contractStorage.setPetUnits(playerAddress, _slot , Lings.petunits); contractStorage.setPetTimes(playerAddress, _slot ,Lings.pettimes); } //************** check evolve end ****************** contractStorage.setExp(playerAddress, _exp); emit StatChangedResult(Lings.petunits,Lings.petstatuses,Lings.pettimes); } /////////////////////////////////////// TRAIN PET ////////////////////////////////////////////////////////////////// function trainPet(uint _slot, uint _traintype, uint _trainergene) public onlyEOA nonReentrant { address playerAddress = accountAddressToProceed(); uint _exp = contractStorage.getExperience(playerAddress); uint genestrength = contractStorage.getPlayerGeneStrength(playerAddress,_trainergene); //if (_trainergene !=0) { //if the trainer is not default Jojo, then make sure this player has different trainer require(genestrength > 0, "Don't have the gene."); require(_traintype <= 24, "Wrong Train type"); //} PetData memory Lings; Lings.petstatuses = contractStorage.getPetStatuses(playerAddress,_slot); Lings.petunits = contractStorage.getPetUnits(playerAddress,_slot); Lings.pettimes = contractStorage.getPetTimes(playerAddress,_slot); Lings.petunitsmax = contractStorage.getPetUnitsMaxVitamined(playerAddress,_slot); uint _effort; //determine how full is the food after eaten in time uint _timenow = block.timestamp; noneReentrant_time(playerAddress); //prevent spam require (Lings.petstatuses.id != 0, "empty slot"); // training percent over iteration function: (max-current)*(1-(1-rate)^iteration) // so i can use this (1-(1-rate)^iteration) to calculate // e.g 1 iteration 7%, with that function 3 iteration suppose to be 19.6% //**************************** since 100% = 1000, 10% = 100 for UnitUpdateStats **** if (_traintype==0){_effort = 3 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,0,170); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,1,100); } //basic 1, 0hp / 1atk / 2def/ 3spd / 4int else if (_traintype==1){_effort = 3 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,1,170); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,3,100); } else if (_traintype==2){_effort = 3 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,2,170); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,4,100); } else if (_traintype==3){_effort = 3 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,3,170); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,0,100); } else if (_traintype==4){_effort = 3 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,4,170); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,2,100); } else if (_traintype==5){_effort = 6 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,0,311); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,1,100); } else if (_traintype==6){_effort = 6 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,1,311); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,3,100); } else if (_traintype==7){_effort = 6 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,2,311); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,4,100); } else if (_traintype==8){_effort = 6 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,3,311); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,0,100); } else if (_traintype==9){_effort = 6 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,4,311); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,2,100); } else if (_traintype==10){_effort = 12 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,0,525); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,1,100); } //after upgrade training ground else if (_traintype==11){_effort = 12 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,1,525); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,3,100); } else if (_traintype==12){_effort = 12 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,2,525); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,4,100); } else if (_traintype==13){_effort = 12 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,3,525); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,0,100); } else if (_traintype==14){_effort = 12 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,4,525); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,2,100); } else if (_traintype==15){_effort = 18 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,0,673); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,1,100); } else if (_traintype==16){_effort = 18 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,1,673); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,3,100); } else if (_traintype==17){_effort = 18 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,2,673); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,4,100); } else if (_traintype==18){_effort = 18 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,3,673); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,0,100); } else if (_traintype==19){_effort = 18 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,4,673); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,2,100); } else if (_traintype==20){_effort = 24 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,0,775); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,1,100); } else if (_traintype==21){_effort = 24 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,1,775); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,3,100); } else if (_traintype==22){_effort = 24 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,2,775); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,4,100); } else if (_traintype==23){_effort = 24 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,3,775); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,0,100); } else if (_traintype==24){_effort = 24 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,4,775); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,2,100); } uint _staminaleft = _timenow - Lings.pettimes.stamina; //staminatime sure lower than timenow. NO WAY staminatime > timenow, really is, then revert require(_staminaleft >= _effort, "Not enough stamina."); if (_staminaleft > PET_STAMINA_MAX) {_staminaleft = PET_STAMINA_MAX;} //capping stamina before spending _staminaleft -= _effort; //remaining stamina Lings.pettimes.stamina = _timenow - _staminaleft; //timenow always larger than staminaleft. Lings.pettimes.bond += _effort; _exp += _effort; //*************** check evolve ************** if ((Lings.petstatuses.stage == 1 && Lings.pettimes.bond > ROOKIETOMATURE_BOND)|| //check if rookie, then to mature (Lings.petstatuses.stage == 2 && Lings.pettimes.bond > MATURETOPERFECT_BOND)) { // check if mature, then to perfect //evolve id and maxstats //this need from RAM as update each patch FARPG_RAMInterface.TrainerData memory _trainerdata; _trainerdata.gene = _trainergene; _trainerdata.genestrength = contractStorage.getPlayergenestrengthArray(playerAddress); _trainerdata.hashed = uint(keccak256(abi.encodePacked(playerAddress,block.timestamp,block.prevrandao))); uint compiledGenestrength; (Lings.petstatuses, compiledGenestrength)= contractRAM.petunitsevolveid(Lings.petstatuses,Lings.petunits, _trainerdata); //****** after getting all details from RAM, time to update the storage ****** //4 stuff to update: Status | Times | Unit | Unitmax contractStorage.setPetStatuses(playerAddress,_slot , Lings.petstatuses); //update: ID, family, stage //ONCE evolve you gain Stamina and Endurance Lings.pettimes = S.Time({bond: Lings.pettimes.bond, stamina: _timenow - TIME_INITIALSTAMINA, hunger: _timenow + TIME_INITIALENDURANCE}); contractStorage.setPetTimes(playerAddress, _slot ,Lings.pettimes); //update: bond for evolve, stamina, hunger contractStorage.setPetUnitsMaxVitamined(playerAddress, _slot ,contractRAM.petunitsmax(Lings.petstatuses.id)); //use new id to get max stat, no genestrength and skills yet //evolve gain all stats by 20% Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,0,300); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,1,300); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,2,300); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,3,300); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,4,300); //gain new skill, with training stats above if (Lings.petstatuses.stage == 2) {//evolved into Mature Lings.petstatuses.id += 1; //add 1 to minus 1 back to retain consistent gas. if (Lings.petstatuses.id > 10000) { //if its shinning, normalized it first for skill Lings.petunits.range = Lings.petstatuses.id - 10001; } else { Lings.petunits.range = Lings.petstatuses.id - 1; } } if (Lings.petstatuses.stage == 3) {//**********evolved into Perfect, determine the genestrength, follow the lowest means it wont change. Lings.petstatuses.id += 1; //add 1 to minus 1 back to retain consistent gas. if (Lings.petstatuses.id > 10000) { //if its shinning, normalized it first for skill Lings.petunits.special = Lings.petstatuses.id - 10001; } else { Lings.petunits.special = Lings.petstatuses.id - 1; } } contractStorage.setPetUnits(playerAddress, _slot , Lings.petunits); //final write into petUnits (stats, genestrength, skills) //***//** evolve set bit based on ID/////////////// // Function to set the bit corresponding to the ID uint GENEbit = contractStorage.getPoint2(playerAddress); // Set the bit at the position corresponding to ID GENEbit |= (1 << ((Lings.petstatuses.id-1)%10000));//need to minus 1 bit because of previous add on shinning check contractStorage.setPoint2(playerAddress,GENEbit); //**//***////////////////////////////////////////// } else { //if no evolve, follow back the stamina and hunger, only update Units states and time, Status(ID, Family, stage) no change. contractStorage.setPetUnits(playerAddress, _slot , Lings.petunits); contractStorage.setPetTimes(playerAddress, _slot ,Lings.pettimes); } //************** check evolve end ****************** contractStorage.setExp(playerAddress, _exp); emit StatChangedResult(Lings.petunits,Lings.petstatuses,Lings.pettimes); } ////////////////////////////////////////// REGISTER PLAYER NAME //////////////////////////////////////////// // Event to log new player registration event PlayerRegistered(address indexed playerAddress, string username); // Event to log username change event UsernameChanged(address indexed playerAddress, string oldUsername, string newUsername); uint changeNameCost = 1*10**16; //default 0.01 S to prevent spam register all name function registerUsername(string memory _username) public payable nonReentrant { require(msg.value == changeNameCost, "Insufficient payment to expand"); require(validateUsername(_username), "Invalid username"); address playerAddress = accountAddressToProceed(); // Attempt to get the caller's UID. // If they have never registered a UID, ensure your game logic // calls contractStorage.registerUID(msg.sender) // *before* calling registerPlayer, or do it inline below. uint playerUID = contractStorage.getUID(playerAddress); // Check if this UID is already assigned a username require(bytes(contractStorage.UIDToUsername(playerUID)).length == 0, "Player already has a registered name"); // Check if the desired username is taken require(contractStorage.usernameToUID(_username) == 0, "Username already exists"); // Map UID -> Username contractStorage.setUIDToUsername(playerUID, _username); // Map Username -> UID contractStorage.setUsernameToUID(_username, playerUID); // Emit an event emit PlayerRegistered(msg.sender, _username); } // Function to change player username function changeUsername(string memory _newUsername) public payable nonReentrant { require(msg.value == changeNameCost, "Insufficient payment to expand"); require(validateUsername(_newUsername), "Invalid new username"); address playerAddress = accountAddressToProceed(); // Retrieve caller's UID; must exist uint playerUID = contractStorage.getUID(playerAddress); // Retrieve their old username string memory oldUsername = contractStorage.UIDToUsername(playerUID); // Make sure the new username is free require(contractStorage.usernameToUID(_newUsername) == 0, "New username already exists"); // Update UID -> Username contractStorage.setUIDToUsername(playerUID, _newUsername); // Update Username -> UID contractStorage.setUsernameToUID(_newUsername, playerUID); // Clear the old username -> UID mapping contractStorage.deleteUsernameToAddress(oldUsername); // Emit event emit UsernameChanged(msg.sender, oldUsername, _newUsername); } // Function to validate the username function validateUsername(string memory _username) internal pure returns (bool) { bytes memory usernameBytes = bytes(_username); if (usernameBytes.length == 0 || usernameBytes.length > 15) { return false; } for (uint i = 0; i < usernameBytes.length; i++) { bytes8 char = usernameBytes[i]; if ( !(char >= '0' && char <= '9') && // 0-9 !(char == '_') && !(char >= 'A' && char <= 'Z') && // A-Z !(char >= 'a' && char <= 'z') // a-z ) { return false; } } return true; } function getUsername() public view returns (string memory) { // Check UID address playerAddress = accountAddressToProceed(); uint uid = contractStorage.UIDmain(playerAddress); return contractStorage.UIDToUsername(uid); } //////////////////////////////////////// SET TEAM FORMATION /////////////////////////////////////////// function changeTeamFormation (uint team, uint[3] calldata format) public nonReentrant { address playerAddress = accountAddressToProceed(); uint[60] memory allformat = contractStorage.getTeamFormat(playerAddress); require (team < 20, "Team 0 to 19 is only available right now."); require (format[0] != format[1] && format[0] != format[2] && format[1] != format[2], "Cannot have same slot on a team"); allformat[team*3]=format[0]; allformat[team*3+1]=format[1]; allformat[team*3+2]=format[2]; contractStorage.setTeamFormat(playerAddress, allformat); } function viewAllTeamFormation() public view returns (uint[60] memory allFormats) { address playerAddress = accountAddressToProceed(); allFormats = contractStorage.getTeamFormat(playerAddress); } //////////////////////////////////////////// READ FUNCTION ///////////////////////////////////////////////////////////////// //a quick function to determine which id is 0, which is empty, for Open Box. If non of these are 0, means Box/Slot full. //consider remind player to infuse their pet to empty out the slot (free), or expand slot (paid). //suggest max 100 elements per GET to prevent overflow. function readPetStatusesArray(address _player, uint _slot_start, uint _slot_stop) public view returns (S.Status[] memory petstatuses) { uint slotLimit = contractStorage.getLimit2(_player); require(_slot_start <= _slot_stop, "Invalid input: _slot_start needs <= _slot_stop"); require(_slot_stop < slotLimit, "Invalid input: _slot_stop > slotLimit"); uint numElements = _slot_stop - _slot_start + 1; petstatuses = new S.Status[](numElements); for (uint i = 0; i < numElements; i++) { petstatuses[i] = contractStorage.getPetStatuses(_player, _slot_start + i); } } //this is read full function, but it takes a lot of processing/gas. Do not return too much at once. suggest max 20 elements per GET. function readPetAllStatsArray(address _player,uint _slot_start,uint _slot_stop) public view returns ( S.Status[] memory petstatuses, S.Unit[] memory petUnits, S.Unit[] memory petUnitsMaxVitamined, S.Time[] memory petTimes) { uint slotLimit = contractStorage.getLimit2(_player); require(_slot_start <= _slot_stop, "Invalid input: _slot_start must be less than or equal to _slot_stop"); require(_slot_stop < slotLimit, "Invalid input: _slot_stop exceeds slotLimit"); uint numElements = _slot_stop - _slot_start + 1; petstatuses = new S.Status[](numElements); petUnits = new S.Unit[](numElements); petUnitsMaxVitamined = new S.Unit[](numElements); petTimes = new S.Time[](numElements); for (uint i = 0; i < numElements; i++) { uint currentIndex = _slot_start + i; petstatuses[i] = contractStorage.getPetStatuses(_player, currentIndex); petUnits[i] = contractStorage.getPetUnits(_player, currentIndex); petUnitsMaxVitamined[i] = contractStorage.getPetUnitsMaxVitamined(_player, currentIndex); petTimes[i] = contractStorage.getPetTimes(_player, currentIndex); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"playerAddress","type":"address"},{"indexed":false,"internalType":"string","name":"username","type":"string"}],"name":"PlayerRegistered","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint256","name":"hp","type":"uint256"},{"internalType":"uint256","name":"attack","type":"uint256"},{"internalType":"uint256","name":"defense","type":"uint256"},{"internalType":"uint256","name":"speed","type":"uint256"},{"internalType":"uint256","name":"intelligence","type":"uint256"},{"internalType":"uint256","name":"genestrength","type":"uint256"},{"internalType":"uint256","name":"range","type":"uint256"},{"internalType":"uint256","name":"special","type":"uint256"}],"indexed":false,"internalType":"struct S.Unit","name":"AfterUnit","type":"tuple"},{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"family","type":"uint256"},{"internalType":"uint256","name":"stage","type":"uint256"}],"indexed":false,"internalType":"struct S.Status","name":"AfterStatus","type":"tuple"},{"components":[{"internalType":"uint256","name":"bond","type":"uint256"},{"internalType":"uint256","name":"stamina","type":"uint256"},{"internalType":"uint256","name":"hunger","type":"uint256"}],"indexed":false,"internalType":"struct S.Time","name":"AfterTime","type":"tuple"}],"name":"StatChangedResult","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"playerAddress","type":"address"},{"indexed":false,"internalType":"string","name":"oldUsername","type":"string"},{"indexed":false,"internalType":"string","name":"newUsername","type":"string"}],"name":"UsernameChanged","type":"event"},{"inputs":[],"name":"MATURETOPERFECT_BOND","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PET_HUNGER_MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PET_STAMINA_MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE_EXPANDSLOT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE_TOOPENBOX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REENTRANT_TIMELIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROOKIETOMATURE_BOND","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TIME_BOXLIMITRESET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TIME_INITIALENDURANCE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TIME_INITIALSTAMINA","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"accountAddressToProceed","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"team","type":"uint256"},{"internalType":"uint256[3]","name":"format","type":"uint256[3]"}],"name":"changeTeamFormation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newUsername","type":"string"}],"name":"changeUsername","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"contractRAM","outputs":[{"internalType":"contract FARPG_RAMInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractStorage","outputs":[{"internalType":"contract IFARPG_Storage","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfexpansion","type":"uint256"}],"name":"expandSlot","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_slot","type":"uint256"},{"internalType":"uint256","name":"_foodtype","type":"uint256"},{"internalType":"uint256","name":"_trainergene","type":"uint256"}],"name":"feedPet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getUsername","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"slot","type":"uint256"},{"internalType":"uint256","name":"trainergene","type":"uint256"}],"name":"openBox","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"openBoxIn24Hr_paid","outputs":[{"internalType":"uint256","name":"boxOpened","type":"uint256"},{"internalType":"uint256","name":"remainingTimeReset_s","type":"uint256"},{"internalType":"uint256","name":"pricePerBox","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"slot","type":"uint256"}],"name":"petTiming","outputs":[{"internalType":"uint256","name":"bond","type":"uint256"},{"internalType":"uint256","name":"stamina","type":"uint256"},{"internalType":"uint256","name":"endurance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"petunitsMAX","outputs":[{"internalType":"uint256","name":"hp","type":"uint256"},{"internalType":"uint256","name":"attack","type":"uint256"},{"internalType":"uint256","name":"defense","type":"uint256"},{"internalType":"uint256","name":"speed","type":"uint256"},{"internalType":"uint256","name":"intelligence","type":"uint256"},{"internalType":"uint256","name":"genestrength","type":"uint256"},{"internalType":"uint256","name":"range","type":"uint256"},{"internalType":"uint256","name":"special","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_player","type":"address"},{"internalType":"uint256","name":"_slot_start","type":"uint256"},{"internalType":"uint256","name":"_slot_stop","type":"uint256"}],"name":"readPetAllStatsArray","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"family","type":"uint256"},{"internalType":"uint256","name":"stage","type":"uint256"}],"internalType":"struct S.Status[]","name":"petstatuses","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"hp","type":"uint256"},{"internalType":"uint256","name":"attack","type":"uint256"},{"internalType":"uint256","name":"defense","type":"uint256"},{"internalType":"uint256","name":"speed","type":"uint256"},{"internalType":"uint256","name":"intelligence","type":"uint256"},{"internalType":"uint256","name":"genestrength","type":"uint256"},{"internalType":"uint256","name":"range","type":"uint256"},{"internalType":"uint256","name":"special","type":"uint256"}],"internalType":"struct S.Unit[]","name":"petUnits","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"hp","type":"uint256"},{"internalType":"uint256","name":"attack","type":"uint256"},{"internalType":"uint256","name":"defense","type":"uint256"},{"internalType":"uint256","name":"speed","type":"uint256"},{"internalType":"uint256","name":"intelligence","type":"uint256"},{"internalType":"uint256","name":"genestrength","type":"uint256"},{"internalType":"uint256","name":"range","type":"uint256"},{"internalType":"uint256","name":"special","type":"uint256"}],"internalType":"struct S.Unit[]","name":"petUnitsMaxVitamined","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"bond","type":"uint256"},{"internalType":"uint256","name":"stamina","type":"uint256"},{"internalType":"uint256","name":"hunger","type":"uint256"}],"internalType":"struct S.Time[]","name":"petTimes","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_player","type":"address"},{"internalType":"uint256","name":"_slot_start","type":"uint256"},{"internalType":"uint256","name":"_slot_stop","type":"uint256"}],"name":"readPetStatusesArray","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"family","type":"uint256"},{"internalType":"uint256","name":"stage","type":"uint256"}],"internalType":"struct S.Status[]","name":"petstatuses","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_username","type":"string"}],"name":"registerUsername","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newBond","type":"uint256"}],"name":"setMatureToPerfectBond","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMax","type":"uint256"}],"name":"setPetHungerMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMax","type":"uint256"}],"name":"setPetStaminaMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPriceExpandSlot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPriceToOpenBox","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newLimit","type":"uint256"}],"name":"setReentrantTimeLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newBond","type":"uint256"}],"name":"setRookieToMatureBond","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newTime","type":"uint256"}],"name":"setTimeBoxLimitReset","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newTime","type":"uint256"}],"name":"setTimeInitialEndurance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newTime","type":"uint256"}],"name":"setTimeInitialStamina","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"number_expansionrequest","type":"uint256"}],"name":"slotLimit_expansionCost","outputs":[{"internalType":"uint256","name":"slotLimit","type":"uint256"},{"internalType":"uint256","name":"expansionCost","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_slot","type":"uint256"},{"internalType":"uint256","name":"_traintype","type":"uint256"},{"internalType":"uint256","name":"_trainergene","type":"uint256"}],"name":"trainPet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newContractAAddress","type":"address"}],"name":"updateRAMContractAAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newContractAAddress","type":"address"}],"name":"updateStorageContractAAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newTreasury","type":"address"}],"name":"updateTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"viewAllTeamFormation","outputs":[{"internalType":"uint256[60]","name":"allFormats","type":"uint256[60]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052676f05b59d3b200000600455674563918244f40000600555620151806006819055610fa7819055612a30610fa8556002610fa955610faa819055610fab556201ec30610fac5562047310610fad55610faf80546001600160a01b03191633179055662386f26fc10000610fb055348015607b575f5ffd5b50608333608b565b6001805560da565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b615b2b806100e75f395ff3fe608060405260043610610275575f3560e01c80636edb6aa01161014a578063b9f54f2c116100be578063e5ea43d411610078578063e5ea43d41461074b578063e9c634c91461077a578063eadfd89314610799578063f2fde38b146107b8578063f35dea5a146107d7578063feaa19bf146107ea575f5ffd5b8063b9f54f2c146106a4578063c2442589146106c3578063cf6621fc146106e2578063d82d7a0d14610701578063d9c17a1a14610717578063e1c361e214610736575f5ffd5b80637f51bb1f1161010f5780637f51bb1f146105b157806381069905146105d05780638197906e1461062a5780638da5cb5b1461065e57806396a33dc51461067a578063a46a6ab41461068e575f5ffd5b80636edb6aa01461052d578063715018a61461054c57806376e2fcd51461056057806377c846af1461057f5780637a44d04814610592575f5ffd5b80633ccfd60b116101ec57806361894434116101a6578063618944341461047c57806361d027b314610491578063635ab8a0146104b1578063647fed85146104c7578063681f3e6d146104f65780636ac5ef7014610517575f5ffd5b80633ccfd60b146103d657806348586b3d146103ea5780634af2fe6f146104095780635054cfe2146104285780635f76310c1461043d5780636070721614610469575f5ffd5b8063236a32c21161023d578063236a32c21461033557806324a22f481461035957806328d24d771461036f5780632fd4f060146103855780633149443c146103a457806336a94134146103c3575f5ffd5b80630549b27e1461027957806306f94913146102b55780630e13ae3b146102d65780631211759b146102f5578063194ace8a14610314575b5f5ffd5b348015610284575f5ffd5b50600254610298906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102c0575f5ffd5b506102d46102cf3660046151ea565b610809565b005b3480156102e1575f5ffd5b506102d46102f036600461520c565b610880565b348015610300575f5ffd5b506102d461030f366004615235565b611932565b34801561031f575f5ffd5b50610328611940565b6040516102ac9190615274565b348015610340575f5ffd5b5061034b610faa5481565b6040519081526020016102ac565b348015610364575f5ffd5b5061034b610fa75481565b34801561037a575f5ffd5b5061034b610fad5481565b348015610390575f5ffd5b506102d461039f366004615235565b6119c6565b3480156103af575f5ffd5b506102d46103be366004615235565b6119d3565b6102d46103d136600461531f565b6119e1565b3480156103e1575f5ffd5b506102d4611d5d565b3480156103f5575f5ffd5b506102d4610404366004615399565b611deb565b348015610414575f5ffd5b50600354610298906001600160a01b031681565b348015610433575f5ffd5b5061034b60045481565b348015610448575f5ffd5b5061045c6104573660046153c9565b612042565b6040516102ac9190615454565b6102d4610477366004615235565b6122af565b348015610487575f5ffd5b5061034b60055481565b34801561049c575f5ffd5b50610faf54610298906001600160a01b031681565b3480156104bc575f5ffd5b5061034b610fac5481565b3480156104d2575f5ffd5b506104db61236a565b604080519384526020840192909252908201526060016102ac565b348015610501575f5ffd5b5061050a61249d565b6040516102ac9190615494565b348015610522575f5ffd5b5061034b610fab5481565b348015610538575f5ffd5b506102d4610547366004615235565b61258e565b348015610557575f5ffd5b506102d461259b565b34801561056b575f5ffd5b506102d461057a366004615235565b6125ae565b6102d461058d36600461531f565b6125bc565b34801561059d575f5ffd5b506102d46105ac366004615235565b612944565b3480156105bc575f5ffd5b506102d46105cb3660046151ea565b612951565b3480156105db575f5ffd5b506105ef6105ea366004615235565b6129d2565b604080519889526020890197909752958701949094526060860192909252608085015260a084015260c083015260e0820152610100016102ac565b348015610635575f5ffd5b50610649610644366004615235565b612a1c565b604080519283526020830191909152016102ac565b348015610669575f5ffd5b505f546001600160a01b0316610298565b348015610685575f5ffd5b50610298612ac3565b348015610699575f5ffd5b5061034b610fa95481565b3480156106af575f5ffd5b506102d46106be3660046151ea565b612b4d565b3480156106ce575f5ffd5b506102d46106dd366004615235565b612bbf565b3480156106ed575f5ffd5b506104db6106fc366004615235565b612bcd565b34801561070c575f5ffd5b5061034b610fa85481565b348015610722575f5ffd5b506102d461073136600461520c565b612ce6565b348015610741575f5ffd5b5061034b60065481565b348015610756575f5ffd5b5061076a6107653660046153c9565b613c1d565b6040516102ac9493929190615530565b348015610785575f5ffd5b506102d4610794366004615235565b61417d565b3480156107a4575f5ffd5b506102d46107b3366004615235565b61418b565b3480156107c3575f5ffd5b506102d46107d23660046151ea565b614199565b6102d46107e53660046155cd565b61420f565b3480156107f5575f5ffd5b506102d4610804366004615235565b614ae5565b610811614af3565b6001600160a01b03811661085e5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b60448201526064015b60405180910390fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b333b156108cf5760405162461bcd60e51b815260206004820152601b60248201527f536d61727420636f6e747261637473206e6f7420616c6c6f77656400000000006044820152606401610855565b6108d7614b4c565b5f6108e0612ac3565b600254604051631add0e8b60e21b81526001600160a01b0380841660048301529293505f9290911690636b743a2c90602401602060405180830381865afa15801561092d573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061095191906155ed565b6002546040516315f67cf360e31b81529192505f916001600160a01b039091169063afb3e798906109889086908890600401615604565b602060405180830381865afa1580156109a3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109c791906155ed565b90505f81116109e85760405162461bcd60e51b81526004016108559061561d565b6018851115610a2c5760405162461bcd60e51b815260206004820152601060248201526f57726f6e6720547261696e207479706560801b6044820152606401610855565b610a346150c5565b6002546040516388e6c74d60e01b81526001600160a01b03909116906388e6c74d90610a669087908b90600401615604565b606060405180830381865afa158015610a81573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aa591906156a2565b8152600254604051636802761f60e01b81526001600160a01b0390911690636802761f90610ad99087908b90600401615604565b61010060405180830381865afa158015610af5573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b1991906156bc565b602082015260025460405163fd45e19160e01b81526001600160a01b039091169063fd45e19190610b509087908b90600401615604565b606060405180830381865afa158015610b6b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b8f91906156a2565b60408083019190915260025490516308ff748760e11b81526001600160a01b03909116906311fee90e90610bc99087908b90600401615604565b61010060405180830381865afa158015610be5573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c0991906156bc565b60608201525f42610c1986614ba5565b8251515f03610c575760405162461bcd60e51b815260206004820152600a602482015269195b5c1d1e481cdb1bdd60b21b6044820152606401610855565b875f03610c9c57612a309150610c78836020015184606001515f60aa614c44565b602084018190526060840151610c92919060016064614c44565b6020840152611080565b87600103610cd957612a309150610cbf83602001518460600151600160aa614c44565b602084018190526060840151610c92919060036064614c44565b87600203610d1657612a309150610cfc83602001518460600151600260aa614c44565b602084018190526060840151610c92919060046064614c44565b87600303610d5257612a309150610d3983602001518460600151600360aa614c44565b602084018190526060840151610c9291905f6064614c44565b87600403610d8f57612a309150610d7583602001518460600151600460aa614c44565b602084018190526060840151610c92919060026064614c44565b87600503610db2576154609150610c78836020015184606001515f610137614c44565b87600603610dd6576154609150610cbf836020015184606001516001610137614c44565b87600703610dfa576154609150610cfc836020015184606001516002610137614c44565b87600803610e1e576154609150610d39836020015184606001516003610137614c44565b87600903610e42576154609150610d75836020015184606001516004610137614c44565b87600a03610e655761a8c09150610c78836020015184606001515f61020d614c44565b87600b03610e895761a8c09150610cbf83602001518460600151600161020d614c44565b87600c03610ead5761a8c09150610cfc83602001518460600151600261020d614c44565b87600d03610ed15761a8c09150610d3983602001518460600151600361020d614c44565b87600e03610ef55761a8c09150610d7583602001518460600151600461020d614c44565b87600f03610f185761fd209150610c78836020015184606001515f6102a1614c44565b87601003610f3c5761fd209150610cbf8360200151846060015160016102a1614c44565b87601103610f605761fd209150610cfc8360200151846060015160026102a1614c44565b87601203610f845761fd209150610d398360200151846060015160036102a1614c44565b87601303610fa85761fd209150610d758360200151846060015160046102a1614c44565b87601403610fcc57620151809150610c78836020015184606001515f610307614c44565b87601503610ff157620151809150610cbf836020015184606001516001610307614c44565b8760160361101657620151809150610cfc836020015184606001516002610307614c44565b8760170361103b57620151809150610d39836020015184606001516003610307614c44565b8760180361108057620151809150611060836020015184606001516004610307614c44565b60208401819052606084015161107a919060026064614c44565b60208401525b5f83604001516020015182611095919061573e565b9050828110156110dd5760405162461bcd60e51b81526020600482015260136024820152722737ba1032b737bab3b41039ba30b6b4b7309760691b6044820152606401610855565b610faa548111156110ee5750610faa545b6110f8838261573e565b9050611104818361573e565b60408501805160200191909152518051849190611122908390615751565b90525061112f8387615751565b845160400151909650600114801561114e5750610fac54604085015151115b80611170575083516040015160021480156111705750610fad54604085015151115b156117af5761117d615136565b888152600254604051633f96d5e560e21b81526001600160a01b038a811660048301529091169063fe5b57949060240161064060405180830381865afa1580156111c9573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ed9190615764565b6020808301919091526040516bffffffffffffffffffffffff1960608b901b169181019190915242603482015244605482015260740160408051601f19818403018152918152815160209283012083820152600354875192880151915163f5a37ffb60e01b81525f936001600160a01b039092169263f5a37ffb926112799290919087906004016157cb565b608060405180830381865afa158015611294573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112b8919061583e565b875f01819350829052505060025f9054906101000a90046001600160a01b03166001600160a01b03166331ec4dea8a8e895f01516040518463ffffffff1660e01b815260040161130a93929190615869565b5f604051808303815f87803b158015611321575f5ffd5b505af1158015611333573d5f5f3e3d5ffd5b50505050604051806060016040528087604001515f01518152602001610fa7548661135e919061573e565b8152602001610fa854866113729190615751565b815250866040018190525060025f9054906101000a90046001600160a01b03166001600160a01b03166384583a788a8e89604001516040518463ffffffff1660e01b81526004016113c593929190615869565b5f604051808303815f87803b1580156113dc575f5ffd5b505af11580156113ee573d5f5f3e3d5ffd5b5050505060025f9054906101000a90046001600160a01b03166001600160a01b031663c10e83e18a8e60035f9054906101000a90046001600160a01b03166001600160a01b0316632bc7a01a8b5f01515f01516040518263ffffffff1660e01b815260040161145f91815260200190565b61010060405180830381865afa15801561147b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061149f91906156bc565b6040518463ffffffff1660e01b81526004016114bd939291906158a1565b5f604051808303815f87803b1580156114d4575f5ffd5b505af11580156114e6573d5f5f3e3d5ffd5b50505050611500866020015187606001515f61012c614c44565b60208701819052606087015161151b9190600161012c614c44565b6020870181905260608701516115369190600261012c614c44565b6020870181905260608701516115519190600361012c614c44565b60208701819052606087015161156c9190600461012c614c44565b60208701528551604001516002036115d7578551805160019190611591908390615751565b90525085515161271010156115be578551516115b0906127119061573e565b602087015160c001526115d7565b8551516115cd9060019061573e565b602087015160c001525b85516040015160030361163d5785518051600191906115f7908390615751565b905250855151612710101561162457855151611616906127119061573e565b602087015160e0015261163d565b8551516116339060019061573e565b602087015160e001525b60025f9054906101000a90046001600160a01b03166001600160a01b031663daa3f88b8a8e89602001516040518463ffffffff1660e01b8152600401611685939291906158a1565b5f604051808303815f87803b15801561169c575f5ffd5b505af11580156116ae573d5f5f3e3d5ffd5b505060025460405163b2cbbfad60e01b81526001600160a01b038d811660048301525f9450909116915063b2cbbfad90602401602060405180830381865afa1580156116fc573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061172091906155ed565b875151909150612710906117369060019061573e565b61174091906158da565b600254604051636ed6fed760e11b8152600190921b92909217916001600160a01b03169063ddadfdae9061177a908d908590600401615604565b5f604051808303815f87803b158015611791575f5ffd5b505af11580156117a3573d5f5f3e3d5ffd5b50505050505050611878565b600254602085015160405163daa3f88b60e01b81526001600160a01b039092169163daa3f88b916117e6918b918f916004016158a1565b5f604051808303815f87803b1580156117fd575f5ffd5b505af115801561180f573d5f5f3e3d5ffd5b5050600254604080880151905163108b074f60e31b81526001600160a01b0390921693506384583a78925061184a918b918f91600401615869565b5f604051808303815f87803b158015611861575f5ffd5b505af1158015611873573d5f5f3e3d5ffd5b505050505b600254604051631ba678ad60e01b81526001600160a01b0390911690631ba678ad906118aa908a908a90600401615604565b5f604051808303815f87803b1580156118c1575f5ffd5b505af11580156118d3573d5f5f3e3d5ffd5b505050507fc1e766b7fcdd3f4867b7cd3d80cf2616b5b7bc4340a7971becb6036c77aa65bd8460200151855f01518660400151604051611915939291906158ed565b60405180910390a15050505050505061192d60018055565b505050565b61193a614af3565b610fab55565b61194861515b565b5f611951612ac3565b600254604051633d52077560e01b81526001600160a01b038084166004830152929350911690633d5207759060240161078060405180830381865afa15801561199c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119c0919061593d565b91505090565b6119ce614af3565b600555565b6119db614af3565b610fac55565b6119e9614b4c565b610fb0543414611a0b5760405162461bcd60e51b81526004016108559061596c565b611a1481614e58565b611a535760405162461bcd60e51b815260206004820152601060248201526f496e76616c696420757365726e616d6560801b6044820152606401610855565b5f611a5c612ac3565b600254604051624165b160e71b81526001600160a01b0380841660048301529293505f92909116906320b2d88090602401602060405180830381865afa158015611aa8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611acc91906155ed565b6002546040516351a2c27760e01b8152600481018390529192506001600160a01b0316906351a2c277906024015f60405180830381865afa158015611b13573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611b3a91908101906159a3565b5115611b945760405162461bcd60e51b8152602060048201526024808201527f506c6179657220616c72656164792068617320612072656769737465726564206044820152636e616d6560e01b6064820152608401610855565b60025460405163589d1b5560e11b81526001600160a01b039091169063b13a36aa90611bc4908690600401615494565b602060405180830381865afa158015611bdf573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c0391906155ed565b15611c505760405162461bcd60e51b815260206004820152601760248201527f557365726e616d6520616c7265616479206578697374730000000000000000006044820152606401610855565b6002546040516368b0c7cf60e01b81526001600160a01b03909116906368b0c7cf90611c829084908790600401615a18565b5f604051808303815f87803b158015611c99575f5ffd5b505af1158015611cab573d5f5f3e3d5ffd5b5050600254604051630a15e13b60e01b81526001600160a01b039091169250630a15e13b9150611ce19086908590600401615a30565b5f604051808303815f87803b158015611cf8575f5ffd5b505af1158015611d0a573d5f5f3e3d5ffd5b50505050336001600160a01b03167fe04d23b73ae3d3b27074da9719b5a4cd521395aaf86bfe7e374933ecb567731a84604051611d479190615494565b60405180910390a25050611d5a60018055565b50565b611d65614af3565b5f4711611db45760405162461bcd60e51b815260206004820152601860248201527f436f6e74726163742062616c616e6365206973207a65726f00000000000000006044820152606401610855565b610faf546040516001600160a01b03909116904780156108fc02915f818181858888f19350505050158015611d5a573d5f5f3e3d5ffd5b611df3614b4c565b5f611dfc612ac3565b600254604051633d52077560e01b81526001600160a01b0380841660048301529293505f9290911690633d5207759060240161078060405180830381865afa158015611e4a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e6e919061593d565b905060148410611ed25760405162461bcd60e51b815260206004820152602960248201527f5465616d203020746f203139206973206f6e6c7920617661696c61626c65207260448201526834b3b43a103737bb9760b91b6064820152608401610855565b8235602084013514801590611eec57508235604084013514155b8015611f0057506020830135604084013514155b611f4c5760405162461bcd60e51b815260206004820152601f60248201527f43616e6e6f7420686176652073616d6520736c6f74206f6e2061207465616d006044820152606401610855565b823581611f5a866003615a65565b603c8110611f6a57611f6a615a51565b6020020152826001602002013581611f83866003615a65565b611f8e906001615751565b603c8110611f9e57611f9e615a51565b6020020152604083013581611fb4866003615a65565b611fbf906002615751565b603c8110611fcf57611fcf615a51565b602002015260025460405163ad9bc5fd60e01b81526001600160a01b039091169063ad9bc5fd906120069085908590600401615a7c565b5f604051808303815f87803b15801561201d575f5ffd5b505af115801561202f573d5f5f3e3d5ffd5b50505050505061203e60018055565b5050565b6002546040516329323b0d60e21b81526001600160a01b0385811660048301526060925f9291169063a4c8ec3490602401602060405180830381865afa15801561208e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120b291906155ed565b90508284111561211b5760405162461bcd60e51b815260206004820152602e60248201527f496e76616c696420696e7075743a205f736c6f745f7374617274206e6565647360448201526d0203c3d205f736c6f745f73746f760941b6064820152608401610855565b8083106121785760405162461bcd60e51b815260206004820152602560248201527f496e76616c696420696e7075743a205f736c6f745f73746f70203e20736c6f74604482015264131a5b5a5d60da1b6064820152608401610855565b5f612183858561573e565b61218e906001615751565b90508067ffffffffffffffff8111156121a9576121a9615289565b6040519080825280602002602001820160405280156121fb57816020015b6121e860405180606001604052805f81526020015f81526020015f81525090565b8152602001906001900390816121c75790505b5092505f5b818110156122a5576002546001600160a01b03166388e6c74d88612224848a615751565b6040518363ffffffff1660e01b8152600401612241929190615604565b606060405180830381865afa15801561225c573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061228091906156a2565b84828151811061229257612292615a51565b6020908102919091010152600101612200565b5050509392505050565b6122b7614b4c565b5f6122c0612ac3565b90505f5f6122cd84612a1c565b915091508034146122f05760405162461bcd60e51b81526004016108559061596c565b6002546001600160a01b031663ebd6180c8461230c8786615751565b6040518363ffffffff1660e01b8152600401612329929190615604565b5f604051808303815f87803b158015612340575f5ffd5b505af1158015612352573d5f5f3e3d5ffd5b5050505061235e614f70565b505050611d5a60018055565b5f5f5f5f612376612ac3565b60025460405163aa31497760e01b81526001600160a01b0380841660048301529293505f929091169063aa31497790602401602060405180830381865afa1580156123c3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123e791906155ed565b6123f1904261573e565b9050620151808110612408575f94505f9350612496565b60025460405163f9c0109b60e01b81526001600160a01b0384811660048301529091169063f9c0109b90602401602060405180830381865afa158015612450573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061247491906155ed565b9450612483816201518061573e565b9350846004546124939190615a65565b92505b5050909192565b60605f6124a8612ac3565b600254604051630bc7d91360e31b81526001600160a01b0380841660048301529293505f9290911690635e3ec89890602401602060405180830381865afa1580156124f5573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061251991906155ed565b6002546040516351a2c27760e01b8152600481018390529192506001600160a01b0316906351a2c277906024015f60405180830381865afa158015612560573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261258791908101906159a3565b9250505090565b612596614af3565b600655565b6125a3614af3565b6125ac5f615076565b565b6125b6614af3565b610faa55565b6125c4614b4c565b610fb05434146125e65760405162461bcd60e51b81526004016108559061596c565b6125ef81614e58565b6126325760405162461bcd60e51b8152602060048201526014602482015273496e76616c6964206e657720757365726e616d6560601b6044820152606401610855565b5f61263b612ac3565b600254604051624165b160e71b81526001600160a01b0380841660048301529293505f92909116906320b2d88090602401602060405180830381865afa158015612687573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126ab91906155ed565b6002546040516351a2c27760e01b8152600481018390529192505f916001600160a01b03909116906351a2c277906024015f60405180830381865afa1580156126f6573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261271d91908101906159a3565b60025460405163589d1b5560e11b81529192506001600160a01b03169063b13a36aa9061274e908790600401615494565b602060405180830381865afa158015612769573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061278d91906155ed565b156127da5760405162461bcd60e51b815260206004820152601b60248201527f4e657720757365726e616d6520616c72656164792065786973747300000000006044820152606401610855565b6002546040516368b0c7cf60e01b81526001600160a01b03909116906368b0c7cf9061280c9085908890600401615a18565b5f604051808303815f87803b158015612823575f5ffd5b505af1158015612835573d5f5f3e3d5ffd5b5050600254604051630a15e13b60e01b81526001600160a01b039091169250630a15e13b915061286b9087908690600401615a30565b5f604051808303815f87803b158015612882575f5ffd5b505af1158015612894573d5f5f3e3d5ffd5b5050600254604051632e9cdc6d60e21b81526001600160a01b03909116925063ba7371b491506128c8908490600401615494565b5f604051808303815f87803b1580156128df575f5ffd5b505af11580156128f1573d5f5f3e3d5ffd5b50505050336001600160a01b03167f10022a11494e4dcaccdda542dc8a420f8a1c3397f37d5bd035a805e79e1a32ee8286604051612930929190615a9a565b60405180910390a2505050611d5a60018055565b61294c614af3565b600455565b612959614af3565b6001600160a01b0381166129af5760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964207472656173757279206164647265737300000000000000006044820152606401610855565b610faf80546001600160a01b0319166001600160a01b0392909216919091179055565b6007816101f481106129e2575f80fd5b6008020180546001820154600283015460038401546004850154600586015460068701546007909701549597509395929491939092909188565b5f5f5f612a27612ac3565b6002546040516329323b0d60e21b81526001600160a01b03808416600483015292935091169063a4c8ec3490602401602060405180830381865afa158015612a71573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a9591906155ed565b92506101f3612aa48486615751565b10612aad575f5ffd5b83600554612abb9190615a65565b915050915091565b6002546040516302e6c26360e11b81523360048201525f9182916001600160a01b03909116906305cd84c690602401602060405180830381865afa158015612b0d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b319190615ac7565b90506001600160a01b038116612b48573391505090565b919050565b612b55614af3565b6001600160a01b038116612b9d5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610855565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b612bc7614af3565b610fa855565b5f5f5f5f612bd9612ac3565b60025460405163fd45e19160e01b81529192505f916001600160a01b039091169063fd45e19190612c109085908a90600401615604565b606060405180830381865afa158015612c2b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c4f91906156a2565b8051610faa546020830151919750919250429190612c6d908361573e565b1115612c7e57610faa549450612c90565b6020820151612c8d908261573e565b94505b8082604001511015612ca4575f9350612cdc565b610fab54818360400151612cb8919061573e565b1015612cd557808260400151612cce919061573e565b9350612cdc565b610fab5493505b5050509193909250565b333b15612d355760405162461bcd60e51b815260206004820152601b60248201527f536d61727420636f6e747261637473206e6f7420616c6c6f77656400000000006044820152606401610855565b612d3d614b4c565b5f612d46612ac3565b6002546040516315f67cf360e31b81529192505f916001600160a01b039091169063afb3e79890612d7d9085908790600401615604565b602060405180830381865afa158015612d98573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612dbc91906155ed565b90505f8111612ddd5760405162461bcd60e51b81526004016108559061561d565b600a841115612e205760405162461bcd60e51b815260206004820152600f60248201526e57726f6e6720466f6f64207479706560881b6044820152606401610855565b612e286150c5565b6002546040516388e6c74d60e01b81526001600160a01b03909116906388e6c74d90612e5a9086908a90600401615604565b606060405180830381865afa158015612e75573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e9991906156a2565b8152600254604051636802761f60e01b81526001600160a01b0390911690636802761f90612ecd9086908a90600401615604565b61010060405180830381865afa158015612ee9573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f0d91906156bc565b602082015260025460405163fd45e19160e01b81526001600160a01b039091169063fd45e19190612f449086908a90600401615604565b606060405180830381865afa158015612f5f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f8391906156a2565b60408083019190915260025490516308ff748760e11b81526001600160a01b03909116906311fee90e90612fbd9086908a90600401615604565b61010060405180830381865afa158015612fd9573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ffd91906156bc565b6060820152600254604051631add0e8b60e21b81526001600160a01b0385811660048301525f921690636b743a2c90602401602060405180830381865afa15801561304a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061306e91906155ed565b90505f804261307c87614ba5565b8451515f036130ba5760405162461bcd60e51b815260206004820152600a602482015269195b5c1d1e481cdb1bdd60b21b6044820152606401610855565b885f036130cb576154609250613180565b886001036130dd5761a8c09250613180565b886002036130ef57618ca09250613180565b8860030361310157618ca09250613180565b8860040361311357619ab09250613180565b8860050361312557619ab09250613180565b8860060361313857620151809250613180565b8860070361314b57620151809250613180565b8860080361315e57620151809250613180565b8860090361317157620151809250613180565b88600a03613180576201518092505b8085604001516040015110156131ce576040850151516131a1908490615751565b6040860151526131b18385615751565b93506131bd8382615751565b6040808701510152600a91506132b9565b610fab5483828760400151604001516131e7919061573e565b6131f19190615751565b1115613275575f8186604001516040015161320c919061573e565b610fab5461321a919061573e565b60408701515190915061322e908290615751565b60408701515261323e8186615751565b94508361324c82600a615a65565b6132569190615ae2565b9250610fab54826132679190615751565b6040808801510152506132b9565b604085015151613286908490615751565b6040860151526132968385615751565b9350828560400151604001516132ac9190615751565b6040808701510152600a91505b881561343a57886001036132f1576132e7856020015186606001515f85600a6132e29190615a65565b614c44565b602086015261343a565b88600203613315576132e78560200151866060015160018560056132e29190615a65565b88600303613339576132e78560200151866060015160028560056132e29190615a65565b8860040361335d576132e78560200151866060015160038560056132e29190615a65565b88600503613381576132e78560200151866060015160048560056132e29190615a65565b886006036133a4576132e7856020015186606001515f8560136132e29190615a65565b886007036133c8576132e785602001518660600151600185600b6132e29190615a65565b886008036133ec576132e785602001518660600151600285600b6132e29190615a65565b88600903613410576132e785602001518660600151600385600b6132e29190615a65565b88600a0361343a5761343485602001518660600151600485600b6132e29190615a65565b60208601525b84516040015160011480156134565750610fac54604086015151115b80613478575084516040015160021480156134785750610fad54604086015151115b15613ab757613485615136565b888152600254604051633f96d5e560e21b81526001600160a01b038a811660048301529091169063fe5b57949060240161064060405180830381865afa1580156134d1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134f59190615764565b6020808301919091526040516bffffffffffffffffffffffff1960608b901b169181019190915242603482015244605482015260740160408051601f19818403018152918152815160209283012083820152600354885192890151915163f5a37ffb60e01b81525f936001600160a01b039092169263f5a37ffb926135819290919087906004016157cb565b608060405180830381865afa15801561359c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906135c0919061583e565b885f01819350829052505060025f9054906101000a90046001600160a01b03166001600160a01b03166331ec4dea8a8e8a5f01516040518463ffffffff1660e01b815260040161361293929190615869565b5f604051808303815f87803b158015613629575f5ffd5b505af115801561363b573d5f5f3e3d5ffd5b50505050604051806060016040528088604001515f01518152602001610fa75485613666919061573e565b8152602001610fa8548561367a9190615751565b815250876040018190525060025f9054906101000a90046001600160a01b03166001600160a01b03166384583a788a8e8a604001516040518463ffffffff1660e01b81526004016136cd93929190615869565b5f604051808303815f87803b1580156136e4575f5ffd5b505af11580156136f6573d5f5f3e3d5ffd5b5050505060025f9054906101000a90046001600160a01b03166001600160a01b031663c10e83e18a8e60035f9054906101000a90046001600160a01b03166001600160a01b0316632bc7a01a8c5f01515f01516040518263ffffffff1660e01b815260040161376791815260200190565b61010060405180830381865afa158015613783573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137a791906156bc565b6040518463ffffffff1660e01b81526004016137c5939291906158a1565b5f604051808303815f87803b1580156137dc575f5ffd5b505af11580156137ee573d5f5f3e3d5ffd5b50505050613808876020015188606001515f61012c614c44565b6020880181905260608801516138239190600161012c614c44565b60208801819052606088015161383e9190600261012c614c44565b6020880181905260608801516138599190600361012c614c44565b6020880181905260608801516138749190600461012c614c44565b60208801528651604001516002036138df578651805160019190613899908390615751565b90525086515161271010156138c6578651516138b8906127119061573e565b602088015160c001526138df565b8651516138d59060019061573e565b602088015160c001525b8651604001516003036139455786518051600191906138ff908390615751565b905250865151612710101561392c5786515161391e906127119061573e565b602088015160e00152613945565b86515161393b9060019061573e565b602088015160e001525b60025f9054906101000a90046001600160a01b03166001600160a01b031663daa3f88b8a8e8a602001516040518463ffffffff1660e01b815260040161398d939291906158a1565b5f604051808303815f87803b1580156139a4575f5ffd5b505af11580156139b6573d5f5f3e3d5ffd5b505060025460405163b2cbbfad60e01b81526001600160a01b038d811660048301525f9450909116915063b2cbbfad90602401602060405180830381865afa158015613a04573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a2891906155ed565b88515190915061271090613a3e9060019061573e565b613a4891906158da565b600254604051636ed6fed760e11b8152600190921b92909217916001600160a01b03169063ddadfdae90613a82908d908590600401615604565b5f604051808303815f87803b158015613a99575f5ffd5b505af1158015613aab573d5f5f3e3d5ffd5b50505050505050613b80565b600254602086015160405163daa3f88b60e01b81526001600160a01b039092169163daa3f88b91613aee918b918f916004016158a1565b5f604051808303815f87803b158015613b05575f5ffd5b505af1158015613b17573d5f5f3e3d5ffd5b5050600254604080890151905163108b074f60e31b81526001600160a01b0390921693506384583a789250613b52918b918f91600401615869565b5f604051808303815f87803b158015613b69575f5ffd5b505af1158015613b7b573d5f5f3e3d5ffd5b505050505b600254604051631ba678ad60e01b81526001600160a01b0390911690631ba678ad90613bb2908a908890600401615604565b5f604051808303815f87803b158015613bc9575f5ffd5b505af1158015613bdb573d5f5f3e3d5ffd5b505050507fc1e766b7fcdd3f4867b7cd3d80cf2616b5b7bc4340a7971becb6036c77aa65bd8560200151865f01518760400151604051611915939291906158ed565b6002546040516329323b0d60e21b81526001600160a01b0385811660048301526060928392839283925f9291169063a4c8ec3490602401602060405180830381865afa158015613c6f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c9391906155ed565b905085871115613d175760405162461bcd60e51b815260206004820152604360248201527f496e76616c696420696e7075743a205f736c6f745f7374617274206d7573742060448201527f6265206c657373207468616e206f7220657175616c20746f205f736c6f745f736064820152620746f760ec1b608482015260a401610855565b808610613d7a5760405162461bcd60e51b815260206004820152602b60248201527f496e76616c696420696e7075743a205f736c6f745f73746f702065786365656460448201526a1cc81cdb1bdd131a5b5a5d60aa1b6064820152608401610855565b5f613d85888861573e565b613d90906001615751565b90508067ffffffffffffffff811115613dab57613dab615289565b604051908082528060200260200182016040528015613dfd57816020015b613dea60405180606001604052805f81526020015f81526020015f81525090565b815260200190600190039081613dc95790505b5095508067ffffffffffffffff811115613e1957613e19615289565b604051908082528060200260200182016040528015613e5257816020015b613e3f61517a565b815260200190600190039081613e375790505b5094508067ffffffffffffffff811115613e6e57613e6e615289565b604051908082528060200260200182016040528015613ea757816020015b613e9461517a565b815260200190600190039081613e8c5790505b5093508067ffffffffffffffff811115613ec357613ec3615289565b604051908082528060200260200182016040528015613f1557816020015b613f0260405180606001604052805f81526020015f81526020015f81525090565b815260200190600190039081613ee15790505b5092505f5b81811015614171575f613f2d828b615751565b6002546040516388e6c74d60e01b81529192506001600160a01b0316906388e6c74d90613f60908e908590600401615604565b606060405180830381865afa158015613f7b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f9f91906156a2565b888381518110613fb157613fb1615a51565b6020908102919091010152600254604051636802761f60e01b81526001600160a01b0390911690636802761f90613fee908e908590600401615604565b61010060405180830381865afa15801561400a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061402e91906156bc565b87838151811061404057614040615a51565b60209081029190910101526002546040516308ff748760e11b81526001600160a01b03909116906311fee90e9061407d908e908590600401615604565b61010060405180830381865afa158015614099573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140bd91906156bc565b8683815181106140cf576140cf615a51565b602090810291909101015260025460405163fd45e19160e01b81526001600160a01b039091169063fd45e1919061410c908e908590600401615604565b606060405180830381865afa158015614127573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061414b91906156a2565b85838151811061415d5761415d615a51565b602090810291909101015250600101613f1a565b50505093509350935093565b614185614af3565b610fa955565b614193614af3565b610fa755565b6141a1614af3565b6001600160a01b0381166142065760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610855565b611d5a81615076565b614217614b4c565b5f614220612ac3565b6002546040516329323b0d60e21b81526001600160a01b0380841660048301529293505f929091169063a4c8ec3490602401602060405180830381865afa15801561426d573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061429191906155ed565b6002546040516315f67cf360e31b81529192505f916001600160a01b039091169063afb3e798906142c89086908890600401615604565b602060405180830381865afa1580156142e3573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061430791906155ed565b6002546040516388e6c74d60e01b815291925042915f916001600160a01b0316906388e6c74d9061433e9088908b90600401615604565b606060405180830381865afa158015614359573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061437d91906156a2565b905061438885614ba5565b835f036143f357600254604051633af5860360e21b8152600595506001600160a01b039091169063ebd6180c906143c59088908890600401615604565b5f604051808303815f87803b1580156143dc575f5ffd5b505af11580156143ee573d5f5f3e3d5ffd5b505050505b8387106144425760405162461bcd60e51b815260206004820152601a60248201527f43686f73656e20736c6f742065786365656473206c696d69742e0000000000006044820152606401610855565b8051156144915760405162461bcd60e51b815260206004820152601860248201527f43686f73656e20736c6f74206973206f636375706965642e00000000000000006044820152606401610855565b5f83116144b05760405162461bcd60e51b81526004016108559061561d565b5f5f5f6144bb61236a565b925092509250815f0361458a5760025460405163356ba38360e11b81526001600160a01b0390911690636ad74706906144fb908b90600190600401615604565b5f604051808303815f87803b158015614512575f5ffd5b505af1158015614524573d5f5f3e3d5ffd5b5050600254604051625f880760e01b81526001600160a01b039091169250625f88079150614558908b904290600401615604565b5f604051808303815f87803b15801561456f575f5ffd5b505af1158015614581573d5f5f3e3d5ffd5b5050505061464d565b8034146145e55760405162461bcd60e51b8152602060048201526024808201527f496e73756666696369656e74207061796d656e7420746f206f70656e20746865604482015263040c4def60e31b6064820152608401610855565b6002546001600160a01b0316636ad7470689614602866001615751565b6040518363ffffffff1660e01b815260040161461f929190615604565b5f604051808303815f87803b158015614636575f5ffd5b505af1158015614648573d5f5f3e3d5ffd5b505050505b60408051610100810182526103e8815260646020820181905260328284015260608083018290526080830182905260a083018a90525f60c0840181905260e0840152835190810193849052600354634fa9782d60e01b9094529081018c9052909181906001600160a01b0316634fa9782d60848301602060405180830381865afa1580156146dd573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061470191906155ed565b81526020016147118c6001615751565b8152602001600181525094505f60405180606001604052805f8152602001610fa7548961473e919061573e565b8152602001610fa854896147529190615751565b815250905060025f9054906101000a90046001600160a01b03166001600160a01b031663daa3f88b8b8e856040518463ffffffff1660e01b815260040161479b939291906158a1565b5f604051808303815f87803b1580156147b2575f5ffd5b505af11580156147c4573d5f5f3e3d5ffd5b5050505060025f9054906101000a90046001600160a01b03166001600160a01b03166331ec4dea8b8e896040518463ffffffff1660e01b815260040161480c93929190615869565b5f604051808303815f87803b158015614823575f5ffd5b505af1158015614835573d5f5f3e3d5ffd5b5050505060025f9054906101000a90046001600160a01b03166001600160a01b03166384583a788b8e846040518463ffffffff1660e01b815260040161487d93929190615869565b5f604051808303815f87803b158015614894575f5ffd5b505af11580156148a6573d5f5f3e3d5ffd5b5050505060025f9054906101000a90046001600160a01b03166001600160a01b031663c10e83e18b8e60035f9054906101000a90046001600160a01b03166001600160a01b0316632bc7a01a8b5f01516040518263ffffffff1660e01b815260040161491491815260200190565b61010060405180830381865afa158015614930573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061495491906156bc565b6040518463ffffffff1660e01b8152600401614972939291906158a1565b5f604051808303815f87803b158015614989575f5ffd5b505af115801561499b573d5f5f3e3d5ffd5b505060025460405163b2cbbfad60e01b81526001600160a01b038e811660048301525f9450909116915063b2cbbfad90602401602060405180830381865afa1580156149e9573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614a0d91906155ed565b8751909150614a1f90612710906158da565b600254604051636ed6fed760e11b8152600190921b92909217916001600160a01b03169063ddadfdae90614a59908e908590600401615604565b5f604051808303815f87803b158015614a70575f5ffd5b505af1158015614a82573d5f5f3e3d5ffd5b505050505f341115614a9657614a96614f70565b7fc1e766b7fcdd3f4867b7cd3d80cf2616b5b7bc4340a7971becb6036c77aa65bd838884604051614ac9939291906158ed565b60405180910390a1505050505050505050505061203e60018055565b614aed614af3565b610fad55565b5f546001600160a01b031633146125ac5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610855565b600260015403614b9e5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610855565b6002600155565b610fa9546001600160a01b0382165f908152610fae6020526040902054614bcc904261573e565b1015614c285760405162461bcd60e51b815260206004820152602560248201527f4e6f6e2d5265656e7472616e742c20736c6f7720646f776e205458206174746560448201526436b83a399760d91b6064820152608401610855565b6001600160a01b03165f908152610fae60205260409020429055565b614c4c61517a565b849050825f03614ca457845184511115614c9b57845184516103e8918491614c74919061573e565b614c7e9190615a65565b614c889190615ae2565b8551614c949190615751565b8152614e50565b83518552614e50565b82600103614d1057846020015184602001511115614d01576103e88286602001518660200151614cd4919061573e565b614cde9190615a65565b614ce89190615ae2565b8560200151614cf79190615751565b6020820152614e50565b60208085015190860152614e50565b82600203614d7c57846040015184604001511115614d6d576103e88286604001518660400151614d40919061573e565b614d4a9190615a65565b614d549190615ae2565b8560400151614d639190615751565b6040820152614e50565b60408085015190860152614e50565b82600303614de857846060015184606001511115614dd9576103e88286606001518660600151614dac919061573e565b614db69190615a65565b614dc09190615ae2565b8560600151614dcf9190615751565b6060820152614e50565b60608085015190860152614e50565b82600403614e5057846080015184608001511115614e45576103e88286608001518660800151614e18919061573e565b614e229190615a65565b614e2c9190615ae2565b8560800151614e3b9190615751565b6080820152614e50565b608080850151908601525b949350505050565b80515f9082901580614e6b5750600f8151115b15614e7857505f92915050565b5f5b8151811015614f66575f828281518110614e9657614e96615a51565b01602001516001600160f81b0319169050600360fc1b8110801590614ec95750603960f81b6001600160c01b0319821611155b158015614ee45750605f60f81b6001600160c01b0319821614155b8015614f195750604160f81b6001600160c01b0319821610801590614f175750602d60f91b6001600160c01b0319821611155b155b8015614f4e5750606160f81b6001600160c01b0319821610801590614f4c5750603d60f91b6001600160c01b0319821611155b155b15614f5d57505f949350505050565b50600101614e7a565b5060019392505050565b610faf546001600160a01b0316614fc95760405162461bcd60e51b815260206004820152601860248201527f54726561737572792061646472657373206e6f742073657400000000000000006044820152606401610855565b610faf546040515f916001600160a01b03169034908381818185875af1925050503d805f8114615014576040519150601f19603f3d011682016040523d82523d5f602084013e615019565b606091505b5050905080611d5a5760405162461bcd60e51b815260206004820152602360248201527f4661696c656420746f20666f727761726420457468657220746f20747265617360448201526275727960e81b6064820152608401610855565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60405180608001604052806150f160405180606001604052805f81526020015f81526020015f81525090565b81526020016150fe61517a565b815260200161512460405180606001604052805f81526020015f81526020015f81525090565b815260200161513161517a565b905290565b60405180606001604052805f815260200161514f6151b7565b81526020015f81525090565b604051806107800160405280603c906020820280368337509192915050565b6040518061010001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81525090565b6040518061064001604052806032906020820280368337509192915050565b6001600160a01b0381168114611d5a575f5ffd5b5f602082840312156151fa575f5ffd5b8135615205816151d6565b9392505050565b5f5f5f6060848603121561521e575f5ffd5b505081359360208301359350604090920135919050565b5f60208284031215615245575f5ffd5b5035919050565b805f5b603c81101561526e57815184526020938401939091019060010161524f565b50505050565b6107808101615283828461524c565b92915050565b634e487b7160e01b5f52604160045260245ffd5b604051610100810167ffffffffffffffff811182821017156152c1576152c1615289565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156152f0576152f0615289565b604052919050565b5f67ffffffffffffffff82111561531157615311615289565b50601f01601f191660200190565b5f6020828403121561532f575f5ffd5b813567ffffffffffffffff811115615345575f5ffd5b8201601f81018413615355575f5ffd5b8035615368615363826152f8565b6152c7565b81815285602083850101111561537c575f5ffd5b816020840160208301375f91810160200191909152949350505050565b5f5f608083850312156153aa575f5ffd5b82359150608083018410156153bd575f5ffd5b50926020919091019150565b5f5f5f606084860312156153db575f5ffd5b83356153e6816151d6565b95602085013595506040909401359392505050565b5f8151808452602084019350602083015f5b8281101561544a576154348683518051825260208082015190830152604090810151910152565b606095909501946020919091019060010161540d565b5093949350505050565b602081525f61520560208301846153fb565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6152056020830184615466565b805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e08301525050565b5f8151808452602084019350602083015f5b8281101561544a576155198683516154a6565b610100959095019460209190910190600101615506565b608081525f61554260808301876153fb565b828103602084015261555481876154f4565b9050828103604084015261556881866154f4565b8381036060850152845180825260208087019350909101905f5b818110156155bf576155a98385518051825260208082015190830152604090810151910152565b6020939093019260609290920191600101615582565b509098975050505050505050565b5f5f604083850312156155de575f5ffd5b50508035926020909101359150565b5f602082840312156155fd575f5ffd5b5051919050565b6001600160a01b03929092168252602082015260400190565b6020808252601490820152732237b713ba103430bb32903a34329033b2b7329760611b604082015260600190565b5f6060828403121561565b575f5ffd5b6040516060810167ffffffffffffffff8111828210171561567e5761567e615289565b60409081528351825260208085015190830152928301519281019290925250919050565b5f606082840312156156b2575f5ffd5b615205838361564b565b5f6101008284031280156156ce575f5ffd5b506156d761529d565b825181526020808401519082015260408084015190820152606080840151908201526080808401519082015260a0808401519082015260c0808401519082015260e0928301519281019290925250919050565b634e487b7160e01b5f52601160045260245ffd5b818103818111156152835761528361572a565b808201808211156152835761528361572a565b5f6106408284031215615775575f5ffd5b5f83601f840112615784575f5ffd5b505f80610640615793816152c7565b92508291508401858111156157a6575f5ffd5b845b818110156157c05780518452602093840193016157a8565b509095945050505050565b8351815260208085015190820152604080850151908201526107e081016157f560608301856154a6565b8251610160830152602083015161018083015f5b6032811015615828578251825260209283019290910190600101615809565b50505060408301516107c0830152949350505050565b5f5f6080838503121561584f575f5ffd5b615859848461564b565b6060939093015192949293505050565b6001600160a01b03841681526020810183905260a08101614e5060408301848051825260208082015190830152604090810151910152565b6001600160a01b0384168152602081018390526101408101614e5060408301846154a6565b634e487b7160e01b5f52601260045260245ffd5b5f826158e8576158e86158c6565b500690565b6101c081016158fc82866154a6565b8351610100830152602084015161012083015260408401516101408301528251610160830152602083015161018083015260408301516101a0830152614e50565b5f610780828403121561594e575f5ffd5b5f83601f84011261595d575f5ffd5b505f80610780615793816152c7565b6020808252601e908201527f496e73756666696369656e74207061796d656e7420746f20657870616e640000604082015260600190565b5f602082840312156159b3575f5ffd5b815167ffffffffffffffff8111156159c9575f5ffd5b8201601f810184136159d9575f5ffd5b80516159e7615363826152f8565b8181528560208385010111156159fb575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b828152604060208201525f614e506040830184615466565b604081525f615a426040830185615466565b90508260208301529392505050565b634e487b7160e01b5f52603260045260245ffd5b80820281158282048414176152835761528361572a565b6001600160a01b03831681526107a08101615205602083018461524c565b604081525f615aac6040830185615466565b8281036020840152615abe8185615466565b95945050505050565b5f60208284031215615ad7575f5ffd5b8151615205816151d6565b5f82615af057615af06158c6565b50049056fea26469706673582212208128bd30507afdcb6d0cf48703936a76bf573ae9340eb3674259f63272316a3c64736f6c634300081c0033
Deployed Bytecode
0x608060405260043610610275575f3560e01c80636edb6aa01161014a578063b9f54f2c116100be578063e5ea43d411610078578063e5ea43d41461074b578063e9c634c91461077a578063eadfd89314610799578063f2fde38b146107b8578063f35dea5a146107d7578063feaa19bf146107ea575f5ffd5b8063b9f54f2c146106a4578063c2442589146106c3578063cf6621fc146106e2578063d82d7a0d14610701578063d9c17a1a14610717578063e1c361e214610736575f5ffd5b80637f51bb1f1161010f5780637f51bb1f146105b157806381069905146105d05780638197906e1461062a5780638da5cb5b1461065e57806396a33dc51461067a578063a46a6ab41461068e575f5ffd5b80636edb6aa01461052d578063715018a61461054c57806376e2fcd51461056057806377c846af1461057f5780637a44d04814610592575f5ffd5b80633ccfd60b116101ec57806361894434116101a6578063618944341461047c57806361d027b314610491578063635ab8a0146104b1578063647fed85146104c7578063681f3e6d146104f65780636ac5ef7014610517575f5ffd5b80633ccfd60b146103d657806348586b3d146103ea5780634af2fe6f146104095780635054cfe2146104285780635f76310c1461043d5780636070721614610469575f5ffd5b8063236a32c21161023d578063236a32c21461033557806324a22f481461035957806328d24d771461036f5780632fd4f060146103855780633149443c146103a457806336a94134146103c3575f5ffd5b80630549b27e1461027957806306f94913146102b55780630e13ae3b146102d65780631211759b146102f5578063194ace8a14610314575b5f5ffd5b348015610284575f5ffd5b50600254610298906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102c0575f5ffd5b506102d46102cf3660046151ea565b610809565b005b3480156102e1575f5ffd5b506102d46102f036600461520c565b610880565b348015610300575f5ffd5b506102d461030f366004615235565b611932565b34801561031f575f5ffd5b50610328611940565b6040516102ac9190615274565b348015610340575f5ffd5b5061034b610faa5481565b6040519081526020016102ac565b348015610364575f5ffd5b5061034b610fa75481565b34801561037a575f5ffd5b5061034b610fad5481565b348015610390575f5ffd5b506102d461039f366004615235565b6119c6565b3480156103af575f5ffd5b506102d46103be366004615235565b6119d3565b6102d46103d136600461531f565b6119e1565b3480156103e1575f5ffd5b506102d4611d5d565b3480156103f5575f5ffd5b506102d4610404366004615399565b611deb565b348015610414575f5ffd5b50600354610298906001600160a01b031681565b348015610433575f5ffd5b5061034b60045481565b348015610448575f5ffd5b5061045c6104573660046153c9565b612042565b6040516102ac9190615454565b6102d4610477366004615235565b6122af565b348015610487575f5ffd5b5061034b60055481565b34801561049c575f5ffd5b50610faf54610298906001600160a01b031681565b3480156104bc575f5ffd5b5061034b610fac5481565b3480156104d2575f5ffd5b506104db61236a565b604080519384526020840192909252908201526060016102ac565b348015610501575f5ffd5b5061050a61249d565b6040516102ac9190615494565b348015610522575f5ffd5b5061034b610fab5481565b348015610538575f5ffd5b506102d4610547366004615235565b61258e565b348015610557575f5ffd5b506102d461259b565b34801561056b575f5ffd5b506102d461057a366004615235565b6125ae565b6102d461058d36600461531f565b6125bc565b34801561059d575f5ffd5b506102d46105ac366004615235565b612944565b3480156105bc575f5ffd5b506102d46105cb3660046151ea565b612951565b3480156105db575f5ffd5b506105ef6105ea366004615235565b6129d2565b604080519889526020890197909752958701949094526060860192909252608085015260a084015260c083015260e0820152610100016102ac565b348015610635575f5ffd5b50610649610644366004615235565b612a1c565b604080519283526020830191909152016102ac565b348015610669575f5ffd5b505f546001600160a01b0316610298565b348015610685575f5ffd5b50610298612ac3565b348015610699575f5ffd5b5061034b610fa95481565b3480156106af575f5ffd5b506102d46106be3660046151ea565b612b4d565b3480156106ce575f5ffd5b506102d46106dd366004615235565b612bbf565b3480156106ed575f5ffd5b506104db6106fc366004615235565b612bcd565b34801561070c575f5ffd5b5061034b610fa85481565b348015610722575f5ffd5b506102d461073136600461520c565b612ce6565b348015610741575f5ffd5b5061034b60065481565b348015610756575f5ffd5b5061076a6107653660046153c9565b613c1d565b6040516102ac9493929190615530565b348015610785575f5ffd5b506102d4610794366004615235565b61417d565b3480156107a4575f5ffd5b506102d46107b3366004615235565b61418b565b3480156107c3575f5ffd5b506102d46107d23660046151ea565b614199565b6102d46107e53660046155cd565b61420f565b3480156107f5575f5ffd5b506102d4610804366004615235565b614ae5565b610811614af3565b6001600160a01b03811661085e5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b60448201526064015b60405180910390fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b333b156108cf5760405162461bcd60e51b815260206004820152601b60248201527f536d61727420636f6e747261637473206e6f7420616c6c6f77656400000000006044820152606401610855565b6108d7614b4c565b5f6108e0612ac3565b600254604051631add0e8b60e21b81526001600160a01b0380841660048301529293505f9290911690636b743a2c90602401602060405180830381865afa15801561092d573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061095191906155ed565b6002546040516315f67cf360e31b81529192505f916001600160a01b039091169063afb3e798906109889086908890600401615604565b602060405180830381865afa1580156109a3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109c791906155ed565b90505f81116109e85760405162461bcd60e51b81526004016108559061561d565b6018851115610a2c5760405162461bcd60e51b815260206004820152601060248201526f57726f6e6720547261696e207479706560801b6044820152606401610855565b610a346150c5565b6002546040516388e6c74d60e01b81526001600160a01b03909116906388e6c74d90610a669087908b90600401615604565b606060405180830381865afa158015610a81573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aa591906156a2565b8152600254604051636802761f60e01b81526001600160a01b0390911690636802761f90610ad99087908b90600401615604565b61010060405180830381865afa158015610af5573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b1991906156bc565b602082015260025460405163fd45e19160e01b81526001600160a01b039091169063fd45e19190610b509087908b90600401615604565b606060405180830381865afa158015610b6b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b8f91906156a2565b60408083019190915260025490516308ff748760e11b81526001600160a01b03909116906311fee90e90610bc99087908b90600401615604565b61010060405180830381865afa158015610be5573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c0991906156bc565b60608201525f42610c1986614ba5565b8251515f03610c575760405162461bcd60e51b815260206004820152600a602482015269195b5c1d1e481cdb1bdd60b21b6044820152606401610855565b875f03610c9c57612a309150610c78836020015184606001515f60aa614c44565b602084018190526060840151610c92919060016064614c44565b6020840152611080565b87600103610cd957612a309150610cbf83602001518460600151600160aa614c44565b602084018190526060840151610c92919060036064614c44565b87600203610d1657612a309150610cfc83602001518460600151600260aa614c44565b602084018190526060840151610c92919060046064614c44565b87600303610d5257612a309150610d3983602001518460600151600360aa614c44565b602084018190526060840151610c9291905f6064614c44565b87600403610d8f57612a309150610d7583602001518460600151600460aa614c44565b602084018190526060840151610c92919060026064614c44565b87600503610db2576154609150610c78836020015184606001515f610137614c44565b87600603610dd6576154609150610cbf836020015184606001516001610137614c44565b87600703610dfa576154609150610cfc836020015184606001516002610137614c44565b87600803610e1e576154609150610d39836020015184606001516003610137614c44565b87600903610e42576154609150610d75836020015184606001516004610137614c44565b87600a03610e655761a8c09150610c78836020015184606001515f61020d614c44565b87600b03610e895761a8c09150610cbf83602001518460600151600161020d614c44565b87600c03610ead5761a8c09150610cfc83602001518460600151600261020d614c44565b87600d03610ed15761a8c09150610d3983602001518460600151600361020d614c44565b87600e03610ef55761a8c09150610d7583602001518460600151600461020d614c44565b87600f03610f185761fd209150610c78836020015184606001515f6102a1614c44565b87601003610f3c5761fd209150610cbf8360200151846060015160016102a1614c44565b87601103610f605761fd209150610cfc8360200151846060015160026102a1614c44565b87601203610f845761fd209150610d398360200151846060015160036102a1614c44565b87601303610fa85761fd209150610d758360200151846060015160046102a1614c44565b87601403610fcc57620151809150610c78836020015184606001515f610307614c44565b87601503610ff157620151809150610cbf836020015184606001516001610307614c44565b8760160361101657620151809150610cfc836020015184606001516002610307614c44565b8760170361103b57620151809150610d39836020015184606001516003610307614c44565b8760180361108057620151809150611060836020015184606001516004610307614c44565b60208401819052606084015161107a919060026064614c44565b60208401525b5f83604001516020015182611095919061573e565b9050828110156110dd5760405162461bcd60e51b81526020600482015260136024820152722737ba1032b737bab3b41039ba30b6b4b7309760691b6044820152606401610855565b610faa548111156110ee5750610faa545b6110f8838261573e565b9050611104818361573e565b60408501805160200191909152518051849190611122908390615751565b90525061112f8387615751565b845160400151909650600114801561114e5750610fac54604085015151115b80611170575083516040015160021480156111705750610fad54604085015151115b156117af5761117d615136565b888152600254604051633f96d5e560e21b81526001600160a01b038a811660048301529091169063fe5b57949060240161064060405180830381865afa1580156111c9573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ed9190615764565b6020808301919091526040516bffffffffffffffffffffffff1960608b901b169181019190915242603482015244605482015260740160408051601f19818403018152918152815160209283012083820152600354875192880151915163f5a37ffb60e01b81525f936001600160a01b039092169263f5a37ffb926112799290919087906004016157cb565b608060405180830381865afa158015611294573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112b8919061583e565b875f01819350829052505060025f9054906101000a90046001600160a01b03166001600160a01b03166331ec4dea8a8e895f01516040518463ffffffff1660e01b815260040161130a93929190615869565b5f604051808303815f87803b158015611321575f5ffd5b505af1158015611333573d5f5f3e3d5ffd5b50505050604051806060016040528087604001515f01518152602001610fa7548661135e919061573e565b8152602001610fa854866113729190615751565b815250866040018190525060025f9054906101000a90046001600160a01b03166001600160a01b03166384583a788a8e89604001516040518463ffffffff1660e01b81526004016113c593929190615869565b5f604051808303815f87803b1580156113dc575f5ffd5b505af11580156113ee573d5f5f3e3d5ffd5b5050505060025f9054906101000a90046001600160a01b03166001600160a01b031663c10e83e18a8e60035f9054906101000a90046001600160a01b03166001600160a01b0316632bc7a01a8b5f01515f01516040518263ffffffff1660e01b815260040161145f91815260200190565b61010060405180830381865afa15801561147b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061149f91906156bc565b6040518463ffffffff1660e01b81526004016114bd939291906158a1565b5f604051808303815f87803b1580156114d4575f5ffd5b505af11580156114e6573d5f5f3e3d5ffd5b50505050611500866020015187606001515f61012c614c44565b60208701819052606087015161151b9190600161012c614c44565b6020870181905260608701516115369190600261012c614c44565b6020870181905260608701516115519190600361012c614c44565b60208701819052606087015161156c9190600461012c614c44565b60208701528551604001516002036115d7578551805160019190611591908390615751565b90525085515161271010156115be578551516115b0906127119061573e565b602087015160c001526115d7565b8551516115cd9060019061573e565b602087015160c001525b85516040015160030361163d5785518051600191906115f7908390615751565b905250855151612710101561162457855151611616906127119061573e565b602087015160e0015261163d565b8551516116339060019061573e565b602087015160e001525b60025f9054906101000a90046001600160a01b03166001600160a01b031663daa3f88b8a8e89602001516040518463ffffffff1660e01b8152600401611685939291906158a1565b5f604051808303815f87803b15801561169c575f5ffd5b505af11580156116ae573d5f5f3e3d5ffd5b505060025460405163b2cbbfad60e01b81526001600160a01b038d811660048301525f9450909116915063b2cbbfad90602401602060405180830381865afa1580156116fc573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061172091906155ed565b875151909150612710906117369060019061573e565b61174091906158da565b600254604051636ed6fed760e11b8152600190921b92909217916001600160a01b03169063ddadfdae9061177a908d908590600401615604565b5f604051808303815f87803b158015611791575f5ffd5b505af11580156117a3573d5f5f3e3d5ffd5b50505050505050611878565b600254602085015160405163daa3f88b60e01b81526001600160a01b039092169163daa3f88b916117e6918b918f916004016158a1565b5f604051808303815f87803b1580156117fd575f5ffd5b505af115801561180f573d5f5f3e3d5ffd5b5050600254604080880151905163108b074f60e31b81526001600160a01b0390921693506384583a78925061184a918b918f91600401615869565b5f604051808303815f87803b158015611861575f5ffd5b505af1158015611873573d5f5f3e3d5ffd5b505050505b600254604051631ba678ad60e01b81526001600160a01b0390911690631ba678ad906118aa908a908a90600401615604565b5f604051808303815f87803b1580156118c1575f5ffd5b505af11580156118d3573d5f5f3e3d5ffd5b505050507fc1e766b7fcdd3f4867b7cd3d80cf2616b5b7bc4340a7971becb6036c77aa65bd8460200151855f01518660400151604051611915939291906158ed565b60405180910390a15050505050505061192d60018055565b505050565b61193a614af3565b610fab55565b61194861515b565b5f611951612ac3565b600254604051633d52077560e01b81526001600160a01b038084166004830152929350911690633d5207759060240161078060405180830381865afa15801561199c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119c0919061593d565b91505090565b6119ce614af3565b600555565b6119db614af3565b610fac55565b6119e9614b4c565b610fb0543414611a0b5760405162461bcd60e51b81526004016108559061596c565b611a1481614e58565b611a535760405162461bcd60e51b815260206004820152601060248201526f496e76616c696420757365726e616d6560801b6044820152606401610855565b5f611a5c612ac3565b600254604051624165b160e71b81526001600160a01b0380841660048301529293505f92909116906320b2d88090602401602060405180830381865afa158015611aa8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611acc91906155ed565b6002546040516351a2c27760e01b8152600481018390529192506001600160a01b0316906351a2c277906024015f60405180830381865afa158015611b13573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611b3a91908101906159a3565b5115611b945760405162461bcd60e51b8152602060048201526024808201527f506c6179657220616c72656164792068617320612072656769737465726564206044820152636e616d6560e01b6064820152608401610855565b60025460405163589d1b5560e11b81526001600160a01b039091169063b13a36aa90611bc4908690600401615494565b602060405180830381865afa158015611bdf573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c0391906155ed565b15611c505760405162461bcd60e51b815260206004820152601760248201527f557365726e616d6520616c7265616479206578697374730000000000000000006044820152606401610855565b6002546040516368b0c7cf60e01b81526001600160a01b03909116906368b0c7cf90611c829084908790600401615a18565b5f604051808303815f87803b158015611c99575f5ffd5b505af1158015611cab573d5f5f3e3d5ffd5b5050600254604051630a15e13b60e01b81526001600160a01b039091169250630a15e13b9150611ce19086908590600401615a30565b5f604051808303815f87803b158015611cf8575f5ffd5b505af1158015611d0a573d5f5f3e3d5ffd5b50505050336001600160a01b03167fe04d23b73ae3d3b27074da9719b5a4cd521395aaf86bfe7e374933ecb567731a84604051611d479190615494565b60405180910390a25050611d5a60018055565b50565b611d65614af3565b5f4711611db45760405162461bcd60e51b815260206004820152601860248201527f436f6e74726163742062616c616e6365206973207a65726f00000000000000006044820152606401610855565b610faf546040516001600160a01b03909116904780156108fc02915f818181858888f19350505050158015611d5a573d5f5f3e3d5ffd5b611df3614b4c565b5f611dfc612ac3565b600254604051633d52077560e01b81526001600160a01b0380841660048301529293505f9290911690633d5207759060240161078060405180830381865afa158015611e4a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e6e919061593d565b905060148410611ed25760405162461bcd60e51b815260206004820152602960248201527f5465616d203020746f203139206973206f6e6c7920617661696c61626c65207260448201526834b3b43a103737bb9760b91b6064820152608401610855565b8235602084013514801590611eec57508235604084013514155b8015611f0057506020830135604084013514155b611f4c5760405162461bcd60e51b815260206004820152601f60248201527f43616e6e6f7420686176652073616d6520736c6f74206f6e2061207465616d006044820152606401610855565b823581611f5a866003615a65565b603c8110611f6a57611f6a615a51565b6020020152826001602002013581611f83866003615a65565b611f8e906001615751565b603c8110611f9e57611f9e615a51565b6020020152604083013581611fb4866003615a65565b611fbf906002615751565b603c8110611fcf57611fcf615a51565b602002015260025460405163ad9bc5fd60e01b81526001600160a01b039091169063ad9bc5fd906120069085908590600401615a7c565b5f604051808303815f87803b15801561201d575f5ffd5b505af115801561202f573d5f5f3e3d5ffd5b50505050505061203e60018055565b5050565b6002546040516329323b0d60e21b81526001600160a01b0385811660048301526060925f9291169063a4c8ec3490602401602060405180830381865afa15801561208e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120b291906155ed565b90508284111561211b5760405162461bcd60e51b815260206004820152602e60248201527f496e76616c696420696e7075743a205f736c6f745f7374617274206e6565647360448201526d0203c3d205f736c6f745f73746f760941b6064820152608401610855565b8083106121785760405162461bcd60e51b815260206004820152602560248201527f496e76616c696420696e7075743a205f736c6f745f73746f70203e20736c6f74604482015264131a5b5a5d60da1b6064820152608401610855565b5f612183858561573e565b61218e906001615751565b90508067ffffffffffffffff8111156121a9576121a9615289565b6040519080825280602002602001820160405280156121fb57816020015b6121e860405180606001604052805f81526020015f81526020015f81525090565b8152602001906001900390816121c75790505b5092505f5b818110156122a5576002546001600160a01b03166388e6c74d88612224848a615751565b6040518363ffffffff1660e01b8152600401612241929190615604565b606060405180830381865afa15801561225c573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061228091906156a2565b84828151811061229257612292615a51565b6020908102919091010152600101612200565b5050509392505050565b6122b7614b4c565b5f6122c0612ac3565b90505f5f6122cd84612a1c565b915091508034146122f05760405162461bcd60e51b81526004016108559061596c565b6002546001600160a01b031663ebd6180c8461230c8786615751565b6040518363ffffffff1660e01b8152600401612329929190615604565b5f604051808303815f87803b158015612340575f5ffd5b505af1158015612352573d5f5f3e3d5ffd5b5050505061235e614f70565b505050611d5a60018055565b5f5f5f5f612376612ac3565b60025460405163aa31497760e01b81526001600160a01b0380841660048301529293505f929091169063aa31497790602401602060405180830381865afa1580156123c3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123e791906155ed565b6123f1904261573e565b9050620151808110612408575f94505f9350612496565b60025460405163f9c0109b60e01b81526001600160a01b0384811660048301529091169063f9c0109b90602401602060405180830381865afa158015612450573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061247491906155ed565b9450612483816201518061573e565b9350846004546124939190615a65565b92505b5050909192565b60605f6124a8612ac3565b600254604051630bc7d91360e31b81526001600160a01b0380841660048301529293505f9290911690635e3ec89890602401602060405180830381865afa1580156124f5573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061251991906155ed565b6002546040516351a2c27760e01b8152600481018390529192506001600160a01b0316906351a2c277906024015f60405180830381865afa158015612560573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261258791908101906159a3565b9250505090565b612596614af3565b600655565b6125a3614af3565b6125ac5f615076565b565b6125b6614af3565b610faa55565b6125c4614b4c565b610fb05434146125e65760405162461bcd60e51b81526004016108559061596c565b6125ef81614e58565b6126325760405162461bcd60e51b8152602060048201526014602482015273496e76616c6964206e657720757365726e616d6560601b6044820152606401610855565b5f61263b612ac3565b600254604051624165b160e71b81526001600160a01b0380841660048301529293505f92909116906320b2d88090602401602060405180830381865afa158015612687573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126ab91906155ed565b6002546040516351a2c27760e01b8152600481018390529192505f916001600160a01b03909116906351a2c277906024015f60405180830381865afa1580156126f6573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261271d91908101906159a3565b60025460405163589d1b5560e11b81529192506001600160a01b03169063b13a36aa9061274e908790600401615494565b602060405180830381865afa158015612769573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061278d91906155ed565b156127da5760405162461bcd60e51b815260206004820152601b60248201527f4e657720757365726e616d6520616c72656164792065786973747300000000006044820152606401610855565b6002546040516368b0c7cf60e01b81526001600160a01b03909116906368b0c7cf9061280c9085908890600401615a18565b5f604051808303815f87803b158015612823575f5ffd5b505af1158015612835573d5f5f3e3d5ffd5b5050600254604051630a15e13b60e01b81526001600160a01b039091169250630a15e13b915061286b9087908690600401615a30565b5f604051808303815f87803b158015612882575f5ffd5b505af1158015612894573d5f5f3e3d5ffd5b5050600254604051632e9cdc6d60e21b81526001600160a01b03909116925063ba7371b491506128c8908490600401615494565b5f604051808303815f87803b1580156128df575f5ffd5b505af11580156128f1573d5f5f3e3d5ffd5b50505050336001600160a01b03167f10022a11494e4dcaccdda542dc8a420f8a1c3397f37d5bd035a805e79e1a32ee8286604051612930929190615a9a565b60405180910390a2505050611d5a60018055565b61294c614af3565b600455565b612959614af3565b6001600160a01b0381166129af5760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964207472656173757279206164647265737300000000000000006044820152606401610855565b610faf80546001600160a01b0319166001600160a01b0392909216919091179055565b6007816101f481106129e2575f80fd5b6008020180546001820154600283015460038401546004850154600586015460068701546007909701549597509395929491939092909188565b5f5f5f612a27612ac3565b6002546040516329323b0d60e21b81526001600160a01b03808416600483015292935091169063a4c8ec3490602401602060405180830381865afa158015612a71573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a9591906155ed565b92506101f3612aa48486615751565b10612aad575f5ffd5b83600554612abb9190615a65565b915050915091565b6002546040516302e6c26360e11b81523360048201525f9182916001600160a01b03909116906305cd84c690602401602060405180830381865afa158015612b0d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b319190615ac7565b90506001600160a01b038116612b48573391505090565b919050565b612b55614af3565b6001600160a01b038116612b9d5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610855565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b612bc7614af3565b610fa855565b5f5f5f5f612bd9612ac3565b60025460405163fd45e19160e01b81529192505f916001600160a01b039091169063fd45e19190612c109085908a90600401615604565b606060405180830381865afa158015612c2b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c4f91906156a2565b8051610faa546020830151919750919250429190612c6d908361573e565b1115612c7e57610faa549450612c90565b6020820151612c8d908261573e565b94505b8082604001511015612ca4575f9350612cdc565b610fab54818360400151612cb8919061573e565b1015612cd557808260400151612cce919061573e565b9350612cdc565b610fab5493505b5050509193909250565b333b15612d355760405162461bcd60e51b815260206004820152601b60248201527f536d61727420636f6e747261637473206e6f7420616c6c6f77656400000000006044820152606401610855565b612d3d614b4c565b5f612d46612ac3565b6002546040516315f67cf360e31b81529192505f916001600160a01b039091169063afb3e79890612d7d9085908790600401615604565b602060405180830381865afa158015612d98573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612dbc91906155ed565b90505f8111612ddd5760405162461bcd60e51b81526004016108559061561d565b600a841115612e205760405162461bcd60e51b815260206004820152600f60248201526e57726f6e6720466f6f64207479706560881b6044820152606401610855565b612e286150c5565b6002546040516388e6c74d60e01b81526001600160a01b03909116906388e6c74d90612e5a9086908a90600401615604565b606060405180830381865afa158015612e75573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e9991906156a2565b8152600254604051636802761f60e01b81526001600160a01b0390911690636802761f90612ecd9086908a90600401615604565b61010060405180830381865afa158015612ee9573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f0d91906156bc565b602082015260025460405163fd45e19160e01b81526001600160a01b039091169063fd45e19190612f449086908a90600401615604565b606060405180830381865afa158015612f5f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f8391906156a2565b60408083019190915260025490516308ff748760e11b81526001600160a01b03909116906311fee90e90612fbd9086908a90600401615604565b61010060405180830381865afa158015612fd9573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ffd91906156bc565b6060820152600254604051631add0e8b60e21b81526001600160a01b0385811660048301525f921690636b743a2c90602401602060405180830381865afa15801561304a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061306e91906155ed565b90505f804261307c87614ba5565b8451515f036130ba5760405162461bcd60e51b815260206004820152600a602482015269195b5c1d1e481cdb1bdd60b21b6044820152606401610855565b885f036130cb576154609250613180565b886001036130dd5761a8c09250613180565b886002036130ef57618ca09250613180565b8860030361310157618ca09250613180565b8860040361311357619ab09250613180565b8860050361312557619ab09250613180565b8860060361313857620151809250613180565b8860070361314b57620151809250613180565b8860080361315e57620151809250613180565b8860090361317157620151809250613180565b88600a03613180576201518092505b8085604001516040015110156131ce576040850151516131a1908490615751565b6040860151526131b18385615751565b93506131bd8382615751565b6040808701510152600a91506132b9565b610fab5483828760400151604001516131e7919061573e565b6131f19190615751565b1115613275575f8186604001516040015161320c919061573e565b610fab5461321a919061573e565b60408701515190915061322e908290615751565b60408701515261323e8186615751565b94508361324c82600a615a65565b6132569190615ae2565b9250610fab54826132679190615751565b6040808801510152506132b9565b604085015151613286908490615751565b6040860151526132968385615751565b9350828560400151604001516132ac9190615751565b6040808701510152600a91505b881561343a57886001036132f1576132e7856020015186606001515f85600a6132e29190615a65565b614c44565b602086015261343a565b88600203613315576132e78560200151866060015160018560056132e29190615a65565b88600303613339576132e78560200151866060015160028560056132e29190615a65565b8860040361335d576132e78560200151866060015160038560056132e29190615a65565b88600503613381576132e78560200151866060015160048560056132e29190615a65565b886006036133a4576132e7856020015186606001515f8560136132e29190615a65565b886007036133c8576132e785602001518660600151600185600b6132e29190615a65565b886008036133ec576132e785602001518660600151600285600b6132e29190615a65565b88600903613410576132e785602001518660600151600385600b6132e29190615a65565b88600a0361343a5761343485602001518660600151600485600b6132e29190615a65565b60208601525b84516040015160011480156134565750610fac54604086015151115b80613478575084516040015160021480156134785750610fad54604086015151115b15613ab757613485615136565b888152600254604051633f96d5e560e21b81526001600160a01b038a811660048301529091169063fe5b57949060240161064060405180830381865afa1580156134d1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134f59190615764565b6020808301919091526040516bffffffffffffffffffffffff1960608b901b169181019190915242603482015244605482015260740160408051601f19818403018152918152815160209283012083820152600354885192890151915163f5a37ffb60e01b81525f936001600160a01b039092169263f5a37ffb926135819290919087906004016157cb565b608060405180830381865afa15801561359c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906135c0919061583e565b885f01819350829052505060025f9054906101000a90046001600160a01b03166001600160a01b03166331ec4dea8a8e8a5f01516040518463ffffffff1660e01b815260040161361293929190615869565b5f604051808303815f87803b158015613629575f5ffd5b505af115801561363b573d5f5f3e3d5ffd5b50505050604051806060016040528088604001515f01518152602001610fa75485613666919061573e565b8152602001610fa8548561367a9190615751565b815250876040018190525060025f9054906101000a90046001600160a01b03166001600160a01b03166384583a788a8e8a604001516040518463ffffffff1660e01b81526004016136cd93929190615869565b5f604051808303815f87803b1580156136e4575f5ffd5b505af11580156136f6573d5f5f3e3d5ffd5b5050505060025f9054906101000a90046001600160a01b03166001600160a01b031663c10e83e18a8e60035f9054906101000a90046001600160a01b03166001600160a01b0316632bc7a01a8c5f01515f01516040518263ffffffff1660e01b815260040161376791815260200190565b61010060405180830381865afa158015613783573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137a791906156bc565b6040518463ffffffff1660e01b81526004016137c5939291906158a1565b5f604051808303815f87803b1580156137dc575f5ffd5b505af11580156137ee573d5f5f3e3d5ffd5b50505050613808876020015188606001515f61012c614c44565b6020880181905260608801516138239190600161012c614c44565b60208801819052606088015161383e9190600261012c614c44565b6020880181905260608801516138599190600361012c614c44565b6020880181905260608801516138749190600461012c614c44565b60208801528651604001516002036138df578651805160019190613899908390615751565b90525086515161271010156138c6578651516138b8906127119061573e565b602088015160c001526138df565b8651516138d59060019061573e565b602088015160c001525b8651604001516003036139455786518051600191906138ff908390615751565b905250865151612710101561392c5786515161391e906127119061573e565b602088015160e00152613945565b86515161393b9060019061573e565b602088015160e001525b60025f9054906101000a90046001600160a01b03166001600160a01b031663daa3f88b8a8e8a602001516040518463ffffffff1660e01b815260040161398d939291906158a1565b5f604051808303815f87803b1580156139a4575f5ffd5b505af11580156139b6573d5f5f3e3d5ffd5b505060025460405163b2cbbfad60e01b81526001600160a01b038d811660048301525f9450909116915063b2cbbfad90602401602060405180830381865afa158015613a04573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a2891906155ed565b88515190915061271090613a3e9060019061573e565b613a4891906158da565b600254604051636ed6fed760e11b8152600190921b92909217916001600160a01b03169063ddadfdae90613a82908d908590600401615604565b5f604051808303815f87803b158015613a99575f5ffd5b505af1158015613aab573d5f5f3e3d5ffd5b50505050505050613b80565b600254602086015160405163daa3f88b60e01b81526001600160a01b039092169163daa3f88b91613aee918b918f916004016158a1565b5f604051808303815f87803b158015613b05575f5ffd5b505af1158015613b17573d5f5f3e3d5ffd5b5050600254604080890151905163108b074f60e31b81526001600160a01b0390921693506384583a789250613b52918b918f91600401615869565b5f604051808303815f87803b158015613b69575f5ffd5b505af1158015613b7b573d5f5f3e3d5ffd5b505050505b600254604051631ba678ad60e01b81526001600160a01b0390911690631ba678ad90613bb2908a908890600401615604565b5f604051808303815f87803b158015613bc9575f5ffd5b505af1158015613bdb573d5f5f3e3d5ffd5b505050507fc1e766b7fcdd3f4867b7cd3d80cf2616b5b7bc4340a7971becb6036c77aa65bd8560200151865f01518760400151604051611915939291906158ed565b6002546040516329323b0d60e21b81526001600160a01b0385811660048301526060928392839283925f9291169063a4c8ec3490602401602060405180830381865afa158015613c6f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c9391906155ed565b905085871115613d175760405162461bcd60e51b815260206004820152604360248201527f496e76616c696420696e7075743a205f736c6f745f7374617274206d7573742060448201527f6265206c657373207468616e206f7220657175616c20746f205f736c6f745f736064820152620746f760ec1b608482015260a401610855565b808610613d7a5760405162461bcd60e51b815260206004820152602b60248201527f496e76616c696420696e7075743a205f736c6f745f73746f702065786365656460448201526a1cc81cdb1bdd131a5b5a5d60aa1b6064820152608401610855565b5f613d85888861573e565b613d90906001615751565b90508067ffffffffffffffff811115613dab57613dab615289565b604051908082528060200260200182016040528015613dfd57816020015b613dea60405180606001604052805f81526020015f81526020015f81525090565b815260200190600190039081613dc95790505b5095508067ffffffffffffffff811115613e1957613e19615289565b604051908082528060200260200182016040528015613e5257816020015b613e3f61517a565b815260200190600190039081613e375790505b5094508067ffffffffffffffff811115613e6e57613e6e615289565b604051908082528060200260200182016040528015613ea757816020015b613e9461517a565b815260200190600190039081613e8c5790505b5093508067ffffffffffffffff811115613ec357613ec3615289565b604051908082528060200260200182016040528015613f1557816020015b613f0260405180606001604052805f81526020015f81526020015f81525090565b815260200190600190039081613ee15790505b5092505f5b81811015614171575f613f2d828b615751565b6002546040516388e6c74d60e01b81529192506001600160a01b0316906388e6c74d90613f60908e908590600401615604565b606060405180830381865afa158015613f7b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f9f91906156a2565b888381518110613fb157613fb1615a51565b6020908102919091010152600254604051636802761f60e01b81526001600160a01b0390911690636802761f90613fee908e908590600401615604565b61010060405180830381865afa15801561400a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061402e91906156bc565b87838151811061404057614040615a51565b60209081029190910101526002546040516308ff748760e11b81526001600160a01b03909116906311fee90e9061407d908e908590600401615604565b61010060405180830381865afa158015614099573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140bd91906156bc565b8683815181106140cf576140cf615a51565b602090810291909101015260025460405163fd45e19160e01b81526001600160a01b039091169063fd45e1919061410c908e908590600401615604565b606060405180830381865afa158015614127573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061414b91906156a2565b85838151811061415d5761415d615a51565b602090810291909101015250600101613f1a565b50505093509350935093565b614185614af3565b610fa955565b614193614af3565b610fa755565b6141a1614af3565b6001600160a01b0381166142065760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610855565b611d5a81615076565b614217614b4c565b5f614220612ac3565b6002546040516329323b0d60e21b81526001600160a01b0380841660048301529293505f929091169063a4c8ec3490602401602060405180830381865afa15801561426d573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061429191906155ed565b6002546040516315f67cf360e31b81529192505f916001600160a01b039091169063afb3e798906142c89086908890600401615604565b602060405180830381865afa1580156142e3573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061430791906155ed565b6002546040516388e6c74d60e01b815291925042915f916001600160a01b0316906388e6c74d9061433e9088908b90600401615604565b606060405180830381865afa158015614359573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061437d91906156a2565b905061438885614ba5565b835f036143f357600254604051633af5860360e21b8152600595506001600160a01b039091169063ebd6180c906143c59088908890600401615604565b5f604051808303815f87803b1580156143dc575f5ffd5b505af11580156143ee573d5f5f3e3d5ffd5b505050505b8387106144425760405162461bcd60e51b815260206004820152601a60248201527f43686f73656e20736c6f742065786365656473206c696d69742e0000000000006044820152606401610855565b8051156144915760405162461bcd60e51b815260206004820152601860248201527f43686f73656e20736c6f74206973206f636375706965642e00000000000000006044820152606401610855565b5f83116144b05760405162461bcd60e51b81526004016108559061561d565b5f5f5f6144bb61236a565b925092509250815f0361458a5760025460405163356ba38360e11b81526001600160a01b0390911690636ad74706906144fb908b90600190600401615604565b5f604051808303815f87803b158015614512575f5ffd5b505af1158015614524573d5f5f3e3d5ffd5b5050600254604051625f880760e01b81526001600160a01b039091169250625f88079150614558908b904290600401615604565b5f604051808303815f87803b15801561456f575f5ffd5b505af1158015614581573d5f5f3e3d5ffd5b5050505061464d565b8034146145e55760405162461bcd60e51b8152602060048201526024808201527f496e73756666696369656e74207061796d656e7420746f206f70656e20746865604482015263040c4def60e31b6064820152608401610855565b6002546001600160a01b0316636ad7470689614602866001615751565b6040518363ffffffff1660e01b815260040161461f929190615604565b5f604051808303815f87803b158015614636575f5ffd5b505af1158015614648573d5f5f3e3d5ffd5b505050505b60408051610100810182526103e8815260646020820181905260328284015260608083018290526080830182905260a083018a90525f60c0840181905260e0840152835190810193849052600354634fa9782d60e01b9094529081018c9052909181906001600160a01b0316634fa9782d60848301602060405180830381865afa1580156146dd573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061470191906155ed565b81526020016147118c6001615751565b8152602001600181525094505f60405180606001604052805f8152602001610fa7548961473e919061573e565b8152602001610fa854896147529190615751565b815250905060025f9054906101000a90046001600160a01b03166001600160a01b031663daa3f88b8b8e856040518463ffffffff1660e01b815260040161479b939291906158a1565b5f604051808303815f87803b1580156147b2575f5ffd5b505af11580156147c4573d5f5f3e3d5ffd5b5050505060025f9054906101000a90046001600160a01b03166001600160a01b03166331ec4dea8b8e896040518463ffffffff1660e01b815260040161480c93929190615869565b5f604051808303815f87803b158015614823575f5ffd5b505af1158015614835573d5f5f3e3d5ffd5b5050505060025f9054906101000a90046001600160a01b03166001600160a01b03166384583a788b8e846040518463ffffffff1660e01b815260040161487d93929190615869565b5f604051808303815f87803b158015614894575f5ffd5b505af11580156148a6573d5f5f3e3d5ffd5b5050505060025f9054906101000a90046001600160a01b03166001600160a01b031663c10e83e18b8e60035f9054906101000a90046001600160a01b03166001600160a01b0316632bc7a01a8b5f01516040518263ffffffff1660e01b815260040161491491815260200190565b61010060405180830381865afa158015614930573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061495491906156bc565b6040518463ffffffff1660e01b8152600401614972939291906158a1565b5f604051808303815f87803b158015614989575f5ffd5b505af115801561499b573d5f5f3e3d5ffd5b505060025460405163b2cbbfad60e01b81526001600160a01b038e811660048301525f9450909116915063b2cbbfad90602401602060405180830381865afa1580156149e9573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614a0d91906155ed565b8751909150614a1f90612710906158da565b600254604051636ed6fed760e11b8152600190921b92909217916001600160a01b03169063ddadfdae90614a59908e908590600401615604565b5f604051808303815f87803b158015614a70575f5ffd5b505af1158015614a82573d5f5f3e3d5ffd5b505050505f341115614a9657614a96614f70565b7fc1e766b7fcdd3f4867b7cd3d80cf2616b5b7bc4340a7971becb6036c77aa65bd838884604051614ac9939291906158ed565b60405180910390a1505050505050505050505061203e60018055565b614aed614af3565b610fad55565b5f546001600160a01b031633146125ac5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610855565b600260015403614b9e5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610855565b6002600155565b610fa9546001600160a01b0382165f908152610fae6020526040902054614bcc904261573e565b1015614c285760405162461bcd60e51b815260206004820152602560248201527f4e6f6e2d5265656e7472616e742c20736c6f7720646f776e205458206174746560448201526436b83a399760d91b6064820152608401610855565b6001600160a01b03165f908152610fae60205260409020429055565b614c4c61517a565b849050825f03614ca457845184511115614c9b57845184516103e8918491614c74919061573e565b614c7e9190615a65565b614c889190615ae2565b8551614c949190615751565b8152614e50565b83518552614e50565b82600103614d1057846020015184602001511115614d01576103e88286602001518660200151614cd4919061573e565b614cde9190615a65565b614ce89190615ae2565b8560200151614cf79190615751565b6020820152614e50565b60208085015190860152614e50565b82600203614d7c57846040015184604001511115614d6d576103e88286604001518660400151614d40919061573e565b614d4a9190615a65565b614d549190615ae2565b8560400151614d639190615751565b6040820152614e50565b60408085015190860152614e50565b82600303614de857846060015184606001511115614dd9576103e88286606001518660600151614dac919061573e565b614db69190615a65565b614dc09190615ae2565b8560600151614dcf9190615751565b6060820152614e50565b60608085015190860152614e50565b82600403614e5057846080015184608001511115614e45576103e88286608001518660800151614e18919061573e565b614e229190615a65565b614e2c9190615ae2565b8560800151614e3b9190615751565b6080820152614e50565b608080850151908601525b949350505050565b80515f9082901580614e6b5750600f8151115b15614e7857505f92915050565b5f5b8151811015614f66575f828281518110614e9657614e96615a51565b01602001516001600160f81b0319169050600360fc1b8110801590614ec95750603960f81b6001600160c01b0319821611155b158015614ee45750605f60f81b6001600160c01b0319821614155b8015614f195750604160f81b6001600160c01b0319821610801590614f175750602d60f91b6001600160c01b0319821611155b155b8015614f4e5750606160f81b6001600160c01b0319821610801590614f4c5750603d60f91b6001600160c01b0319821611155b155b15614f5d57505f949350505050565b50600101614e7a565b5060019392505050565b610faf546001600160a01b0316614fc95760405162461bcd60e51b815260206004820152601860248201527f54726561737572792061646472657373206e6f742073657400000000000000006044820152606401610855565b610faf546040515f916001600160a01b03169034908381818185875af1925050503d805f8114615014576040519150601f19603f3d011682016040523d82523d5f602084013e615019565b606091505b5050905080611d5a5760405162461bcd60e51b815260206004820152602360248201527f4661696c656420746f20666f727761726420457468657220746f20747265617360448201526275727960e81b6064820152608401610855565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60405180608001604052806150f160405180606001604052805f81526020015f81526020015f81525090565b81526020016150fe61517a565b815260200161512460405180606001604052805f81526020015f81526020015f81525090565b815260200161513161517a565b905290565b60405180606001604052805f815260200161514f6151b7565b81526020015f81525090565b604051806107800160405280603c906020820280368337509192915050565b6040518061010001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81525090565b6040518061064001604052806032906020820280368337509192915050565b6001600160a01b0381168114611d5a575f5ffd5b5f602082840312156151fa575f5ffd5b8135615205816151d6565b9392505050565b5f5f5f6060848603121561521e575f5ffd5b505081359360208301359350604090920135919050565b5f60208284031215615245575f5ffd5b5035919050565b805f5b603c81101561526e57815184526020938401939091019060010161524f565b50505050565b6107808101615283828461524c565b92915050565b634e487b7160e01b5f52604160045260245ffd5b604051610100810167ffffffffffffffff811182821017156152c1576152c1615289565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156152f0576152f0615289565b604052919050565b5f67ffffffffffffffff82111561531157615311615289565b50601f01601f191660200190565b5f6020828403121561532f575f5ffd5b813567ffffffffffffffff811115615345575f5ffd5b8201601f81018413615355575f5ffd5b8035615368615363826152f8565b6152c7565b81815285602083850101111561537c575f5ffd5b816020840160208301375f91810160200191909152949350505050565b5f5f608083850312156153aa575f5ffd5b82359150608083018410156153bd575f5ffd5b50926020919091019150565b5f5f5f606084860312156153db575f5ffd5b83356153e6816151d6565b95602085013595506040909401359392505050565b5f8151808452602084019350602083015f5b8281101561544a576154348683518051825260208082015190830152604090810151910152565b606095909501946020919091019060010161540d565b5093949350505050565b602081525f61520560208301846153fb565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6152056020830184615466565b805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e08301525050565b5f8151808452602084019350602083015f5b8281101561544a576155198683516154a6565b610100959095019460209190910190600101615506565b608081525f61554260808301876153fb565b828103602084015261555481876154f4565b9050828103604084015261556881866154f4565b8381036060850152845180825260208087019350909101905f5b818110156155bf576155a98385518051825260208082015190830152604090810151910152565b6020939093019260609290920191600101615582565b509098975050505050505050565b5f5f604083850312156155de575f5ffd5b50508035926020909101359150565b5f602082840312156155fd575f5ffd5b5051919050565b6001600160a01b03929092168252602082015260400190565b6020808252601490820152732237b713ba103430bb32903a34329033b2b7329760611b604082015260600190565b5f6060828403121561565b575f5ffd5b6040516060810167ffffffffffffffff8111828210171561567e5761567e615289565b60409081528351825260208085015190830152928301519281019290925250919050565b5f606082840312156156b2575f5ffd5b615205838361564b565b5f6101008284031280156156ce575f5ffd5b506156d761529d565b825181526020808401519082015260408084015190820152606080840151908201526080808401519082015260a0808401519082015260c0808401519082015260e0928301519281019290925250919050565b634e487b7160e01b5f52601160045260245ffd5b818103818111156152835761528361572a565b808201808211156152835761528361572a565b5f6106408284031215615775575f5ffd5b5f83601f840112615784575f5ffd5b505f80610640615793816152c7565b92508291508401858111156157a6575f5ffd5b845b818110156157c05780518452602093840193016157a8565b509095945050505050565b8351815260208085015190820152604080850151908201526107e081016157f560608301856154a6565b8251610160830152602083015161018083015f5b6032811015615828578251825260209283019290910190600101615809565b50505060408301516107c0830152949350505050565b5f5f6080838503121561584f575f5ffd5b615859848461564b565b6060939093015192949293505050565b6001600160a01b03841681526020810183905260a08101614e5060408301848051825260208082015190830152604090810151910152565b6001600160a01b0384168152602081018390526101408101614e5060408301846154a6565b634e487b7160e01b5f52601260045260245ffd5b5f826158e8576158e86158c6565b500690565b6101c081016158fc82866154a6565b8351610100830152602084015161012083015260408401516101408301528251610160830152602083015161018083015260408301516101a0830152614e50565b5f610780828403121561594e575f5ffd5b5f83601f84011261595d575f5ffd5b505f80610780615793816152c7565b6020808252601e908201527f496e73756666696369656e74207061796d656e7420746f20657870616e640000604082015260600190565b5f602082840312156159b3575f5ffd5b815167ffffffffffffffff8111156159c9575f5ffd5b8201601f810184136159d9575f5ffd5b80516159e7615363826152f8565b8181528560208385010111156159fb575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b828152604060208201525f614e506040830184615466565b604081525f615a426040830185615466565b90508260208301529392505050565b634e487b7160e01b5f52603260045260245ffd5b80820281158282048414176152835761528361572a565b6001600160a01b03831681526107a08101615205602083018461524c565b604081525f615aac6040830185615466565b8281036020840152615abe8185615466565b95945050505050565b5f60208284031215615ad7575f5ffd5b8151615205816151d6565b5f82615af057615af06158c6565b50049056fea26469706673582212208128bd30507afdcb6d0cf48703936a76bf573ae9340eb3674259f63272316a3c64736f6c634300081c0033
Deployed Bytecode Sourcemap
28215:45282:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28283:37;;;;;;;;;;-1:-1:-1;28283:37:0;;;;-1:-1:-1;;;;;28283:37:0;;;;;;-1:-1:-1;;;;;201:32:1;;;183:51;;171:2;156:18;28283:37:0;;;;;;;;31871:230;;;;;;;;;;-1:-1:-1;31871:230:0;;;;;:::i;:::-;;:::i;:::-;;54578:11631;;;;;;;;;;-1:-1:-1;54578:11631:0;;;;;:::i;:::-;;:::i;33243:101::-;;;;;;;;;;-1:-1:-1;33243:101:0;;;;;:::i;:::-;;:::i;70814:217::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;29837:38::-;;;;;;;;;;;;;;;;;;;2039:25:1;;;2027:2;2012:18;29837:38:0;1893:177:1;29549:42:0;;;;;;;;;;;;;;;;30349:43;;;;;;;;;;;;;;;;32534:110;;;;;;;;;;-1:-1:-1;32534:110:0;;;;;:::i;:::-;;:::i;33350:114::-;;;;;;;;;;-1:-1:-1;33350:114:0;;;;;:::i;:::-;;:::i;66683:1228::-;;;;;;:::i;:::-;;:::i;32107:255::-;;;;;;;;;;;;;:::i;70182:626::-;;;;;;;;;;-1:-1:-1;70182:626:0;;;;;:::i;:::-;;:::i;28327:37::-;;;;;;;;;;-1:-1:-1;28327:37:0;;;;-1:-1:-1;;;;;28327:37:0;;;29132;;;;;;;;;;;;;;;;71460:645;;;;;;;;;;-1:-1:-1;71460:645:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;42452:604::-;;;;;;:::i;:::-;;:::i;29275:38::-;;;;;;;;;;;;;;;;31389:36;;;;;;;;;;-1:-1:-1;31389:36:0;;;;-1:-1:-1;;;;;31389:36:0;;;30035:42;;;;;;;;;;;;;;;;34860:756;;;;;;;;;;;;;:::i;:::-;;;;6122:25:1;;;6178:2;6163:18;;6156:34;;;;6206:18;;;6199:34;6110:2;6095:18;34860:756:0;5920:319:1;69804:261:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;29924:37::-;;;;;;;;;;;;;;;;32650:112;;;;;;;;;;-1:-1:-1;32650:112:0;;;;;:::i;:::-;;:::i;2788:103::-;;;;;;;;;;;;;:::i;33134:::-;;;;;;;;;;-1:-1:-1;33134:103:0;;;;;:::i;:::-;;:::i;67966:1101::-;;;;;;:::i;:::-;;:::i;32420:108::-;;;;;;;;;;-1:-1:-1;32420:108:0;;;;;:::i;:::-;;:::i;31444:181::-;;;;;;;;;;-1:-1:-1;31444:181:0;;;;;:::i;:::-;;:::i;29512:30::-;;;;;;;;;;-1:-1:-1;29512:30:0;;;;;:::i;:::-;;:::i;:::-;;;;7106:25:1;;;7162:2;7147:18;;7140:34;;;;7190:18;;;7183:34;;;;7248:2;7233:18;;7226:34;;;;7291:3;7276:19;;7269:35;7335:3;7320:19;;7313:35;7379:3;7364:19;;7357:35;7423:3;7408:19;;7401:35;7093:3;7078:19;29512:30:0;6763:679:1;35791:431:0;;;;;;;;;;-1:-1:-1;35791:431:0;;;;;:::i;:::-;;:::i;:::-;;;;7621:25:1;;;7677:2;7662:18;;7655:34;;;;7594:18;35791:431:0;7447:248:1;2140:87:0;;;;;;;;;;-1:-1:-1;2186:7:0;2213:6;-1:-1:-1;;;;;2213:6:0;2140:87;;34171:429;;;;;;;;;;;;;:::i;29693:43::-;;;;;;;;;;;;;;;;31631:234;;;;;;;;;;-1:-1:-1;31631:234:0;;;;;:::i;:::-;;:::i;32888:118::-;;;;;;;;;;-1:-1:-1;32888:118:0;;;;;:::i;:::-;;:::i;36228:780::-;;;;;;;;;;-1:-1:-1;36228:780:0;;;;;:::i;:::-;;:::i;29616:43::-;;;;;;;;;;;;;;;;45058:9384;;;;;;;;;;-1:-1:-1;45058:9384:0;;;;;:::i;:::-;;:::i;29373:41::-;;;;;;;;;;;;;;;;72251:1233;;;;;;;;;;-1:-1:-1;72251:1233:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;33012:116::-;;;;;;;;;;-1:-1:-1;33012:116:0;;;;;:::i;:::-;;:::i;32768:114::-;;;;;;;;;;-1:-1:-1;32768:114:0;;;;;:::i;:::-;;:::i;3046:201::-;;;;;;;;;;-1:-1:-1;3046:201:0;;;;;:::i;:::-;;:::i;37898:4425::-;;;;;;:::i;:::-;;:::i;33470:116::-;;;;;;;;;;-1:-1:-1;33470:116:0;;;;;:::i;:::-;;:::i;31871:230::-;2026:13;:11;:13::i;:::-;-1:-1:-1;;;;;31974:34:0;::::1;31966:62;;;::::0;-1:-1:-1;;;31966:62:0;;10588:2:1;31966:62:0::1;::::0;::::1;10570:21:1::0;10627:2;10607:18;;;10600:30;-1:-1:-1;;;10646:18:1;;;10639:45;10701:18;;31966:62:0::1;;;;;;;;;32039:11;:54:::0;;-1:-1:-1;;;;;;32039:54:0::1;-1:-1:-1::0;;;;;32039:54:0;;;::::1;::::0;;;::::1;::::0;;31871:230::o;54578:11631::-;37064:10;37700:18;37746:8;37044:63;;;;-1:-1:-1;;;37044:63:0;;10932:2:1;37044:63:0;;;10914:21:1;10971:2;10951:18;;;10944:30;11010:29;10990:18;;;10983:57;11057:18;;37044:63:0;10730:351:1;37044:63:0;9192:21:::1;:19;:21::i;:::-;54683::::2;54707:25;:23;:25::i;:::-;54755:15;::::0;:44:::2;::::0;-1:-1:-1;;;54755:44:0;;-1:-1:-1;;;;;201:32:1;;;54755:44:0::2;::::0;::::2;183:51:1::0;54683:49:0;;-1:-1:-1;54743:9:0::2;::::0;54755:15;;::::2;::::0;:29:::2;::::0;156:18:1;;54755:44:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54830:15;::::0;:65:::2;::::0;-1:-1:-1;;;54830:65:0;;54743:56;;-1:-1:-1;54810:17:0::2;::::0;-1:-1:-1;;;;;54830:15:0;;::::2;::::0;:37:::2;::::0;:65:::2;::::0;54868:13;;54882:12;;54830:65:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54810:85;;55055:1;55040:12;:16;55032:49;;;;-1:-1:-1::0;;;55032:49:0::2;;;;;;;:::i;:::-;55118:2;55104:10;:16;;55096:45;;;::::0;-1:-1:-1;;;55096:45:0;;12151:2:1;55096:45:0::2;::::0;::::2;12133:21:1::0;12190:2;12170:18;;;12163:30;-1:-1:-1;;;12209:18:1;;;12202:46;12265:18;;55096:45:0::2;11949:340:1::0;55096:45:0::2;55165:20;;:::i;:::-;55216:15;::::0;:51:::2;::::0;-1:-1:-1;;;55216:51:0;;-1:-1:-1;;;;;55216:15:0;;::::2;::::0;:30:::2;::::0;:51:::2;::::0;55247:13;;55261:5;;55216:51:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55196:71:::0;;55295:15:::2;::::0;:48:::2;::::0;-1:-1:-1;;;55295:48:0;;-1:-1:-1;;;;;55295:15:0;;::::2;::::0;:27:::2;::::0;:48:::2;::::0;55323:13;;55337:5;;55295:48:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55278:14;::::0;::::2;:65:::0;55371:15:::2;::::0;:48:::2;::::0;-1:-1:-1;;;55371:48:0;;-1:-1:-1;;;;;55371:15:0;;::::2;::::0;:27:::2;::::0;:48:::2;::::0;55399:13;;55413:5;;55371:48:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55354:14;::::0;;::::2;:65:::0;;;;55450:15:::2;::::0;:60;;-1:-1:-1;;;55450:60:0;;-1:-1:-1;;;;;55450:15:0;;::::2;::::0;:39:::2;::::0;:60:::2;::::0;55490:13;;55504:5;;55450:60:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55430:17;::::0;::::2;:80:::0;55521:12:::2;55613:15;55639:33;55658:13:::0;55639:18:::2;:33::i;:::-;55707:17:::0;;:20;:17:::2;:25:::0;55698:49:::2;;;::::0;-1:-1:-1;;;55698:49:0;;14855:2:1;55698:49:0::2;::::0;::::2;14837:21:1::0;14894:2;14874:18;;;14867:30;-1:-1:-1;;;14913:18:1;;;14906:40;14963:18;;55698:49:0::2;14653:334:1::0;55698:49:0::2;56102:10;56114:1;56102:13:::0;56093:5066:::2;;56127:7;56117:17;;56151:55;56167:5;:14;;;56182:5;:17;;;56200:1;56202:3;56151:15;:55::i;:::-;56136:14;::::0;::::2;:70:::0;;;56254:17:::2;::::0;::::2;::::0;56223:55:::2;::::0;56136:70;56272:1:::2;56274:3;56223:15;:55::i;:::-;56208:14;::::0;::::2;:70:::0;56093:5066:::2;;;56342:10;56354:1;56342:13:::0;56338:4821:::2;;56367:7;56357:17;;56391:55;56407:5;:14;;;56422:5;:17;;;56440:1;56442:3;56391:15;:55::i;:::-;56376:14;::::0;::::2;:70:::0;;;56494:17:::2;::::0;::::2;::::0;56463:55:::2;::::0;56376:70;56512:1:::2;56514:3;56463:15;:55::i;56338:4821::-;56541:10;56553:1;56541:13:::0;56537:4622:::2;;56566:7;56556:17;;56590:55;56606:5;:14;;;56621:5;:17;;;56639:1;56641:3;56590:15;:55::i;:::-;56575:14;::::0;::::2;:70:::0;;;56693:17:::2;::::0;::::2;::::0;56662:55:::2;::::0;56575:70;56711:1:::2;56713:3;56662:15;:55::i;56537:4622::-;56740:10;56752:1;56740:13:::0;56736:4423:::2;;56765:7;56755:17;;56789:55;56805:5;:14;;;56820:5;:17;;;56838:1;56840:3;56789:15;:55::i;:::-;56774:14;::::0;::::2;:70:::0;;;56892:17:::2;::::0;::::2;::::0;56861:55:::2;::::0;56774:70;56910:1:::2;56912:3;56861:15;:55::i;56736:4423::-;56939:10;56951:1;56939:13:::0;56935:4224:::2;;56964:7;56954:17;;56988:55;57004:5;:14;;;57019:5;:17;;;57037:1;57039:3;56988:15;:55::i;:::-;56973:14;::::0;::::2;:70:::0;;;57091:17:::2;::::0;::::2;::::0;57060:55:::2;::::0;56973:70;57109:1:::2;57111:3;57060:15;:55::i;56935:4224::-;57138:10;57150:1;57138:13:::0;57134:4025:::2;;57163:7;57153:17;;57187:55;57203:5;:14;;;57218:5;:17;;;57236:1;57238:3;57187:15;:55::i;57134:4025::-;57337:10;57349:1;57337:13:::0;57333:3826:::2;;57362:7;57352:17;;57386:55;57402:5;:14;;;57417:5;:17;;;57435:1;57437:3;57386:15;:55::i;57333:3826::-;57536:10;57548:1;57536:13:::0;57532:3627:::2;;57561:7;57551:17;;57585:55;57601:5;:14;;;57616:5;:17;;;57634:1;57636:3;57585:15;:55::i;57532:3627::-;57735:10;57747:1;57735:13:::0;57731:3428:::2;;57760:7;57750:17;;57784:55;57800:5;:14;;;57815:5;:17;;;57833:1;57835:3;57784:15;:55::i;57731:3428::-;57934:10;57946:1;57934:13:::0;57930:3229:::2;;57959:7;57949:17;;57983:55;57999:5;:14;;;58014:5;:17;;;58032:1;58034:3;57983:15;:55::i;57930:3229::-;58133:10;58145:2;58133:14:::0;58129:3030:::2;;58159:8;58149:18;;58184:55;58200:5;:14;;;58215:5;:17;;;58233:1;58235:3;58184:15;:55::i;58129:3030::-;58365:10;58377:2;58365:14:::0;58361:2798:::2;;58391:8;58381:18;;58416:55;58432:5;:14;;;58447:5;:17;;;58465:1;58467:3;58416:15;:55::i;58361:2798::-;58566:10;58578:2;58566:14:::0;58562:2597:::2;;58592:8;58582:18;;58617:55;58633:5;:14;;;58648:5;:17;;;58666:1;58668:3;58617:15;:55::i;58562:2597::-;58767:10;58779:2;58767:14:::0;58763:2396:::2;;58793:8;58783:18;;58818:55;58834:5;:14;;;58849:5;:17;;;58867:1;58869:3;58818:15;:55::i;58763:2396::-;58968:10;58980:2;58968:14:::0;58964:2195:::2;;58994:8;58984:18;;59019:55;59035:5;:14;;;59050:5;:17;;;59068:1;59070:3;59019:15;:55::i;58964:2195::-;59169:10;59181:2;59169:14:::0;59165:1994:::2;;59195:8;59185:18;;59220:55;59236:5;:14;;;59251:5;:17;;;59269:1;59271:3;59220:15;:55::i;59165:1994::-;59370:10;59382:2;59370:14:::0;59366:1793:::2;;59396:8;59386:18;;59421:55;59437:5;:14;;;59452:5;:17;;;59470:1;59472:3;59421:15;:55::i;59366:1793::-;59571:10;59583:2;59571:14:::0;59567:1592:::2;;59597:8;59587:18;;59622:55;59638:5;:14;;;59653:5;:17;;;59671:1;59673:3;59622:15;:55::i;59567:1592::-;59772:10;59784:2;59772:14:::0;59768:1391:::2;;59798:8;59788:18;;59823:55;59839:5;:14;;;59854:5;:17;;;59872:1;59874:3;59823:15;:55::i;59768:1391::-;59973:10;59985:2;59973:14:::0;59969:1190:::2;;59999:8;59989:18;;60024:55;60040:5;:14;;;60055:5;:17;;;60073:1;60075:3;60024:15;:55::i;59969:1190::-;60174:10;60186:2;60174:14:::0;60170:989:::2;;60200:8;60190:18;;60225:55;60241:5;:14;;;60256:5;:17;;;60274:1;60276:3;60225:15;:55::i;60170:989::-;60375:10;60387:2;60375:14:::0;60371:788:::2;;60401:8;60391:18;;60426:55;60442:5;:14;;;60457:5;:17;;;60475:1;60477:3;60426:15;:55::i;60371:788::-;60576:10;60588:2;60576:14:::0;60572:587:::2;;60602:8;60592:18;;60627:55;60643:5;:14;;;60658:5;:17;;;60676:1;60678:3;60627:15;:55::i;60572:587::-;60777:10;60789:2;60777:14:::0;60773:386:::2;;60803:8;60793:18;;60828:55;60844:5;:14;;;60859:5;:17;;;60877:1;60879:3;60828:15;:55::i;60773:386::-;60978:10;60990:2;60978:14:::0;60974:185:::2;;61004:8;60994:18;;61029:55;61045:5;:14;;;61060:5;:17;;;61078:1;61080:3;61029:15;:55::i;:::-;61014:14;::::0;::::2;:70:::0;;;61132:17:::2;::::0;::::2;::::0;61101:55:::2;::::0;61014:70;61150:1:::2;61152:3;61101:15;:55::i;:::-;61086:14;::::0;::::2;:70:::0;60974:185:::2;61170:17;61201:5;:14;;;:22;;;61190:8;:33;;;;:::i;:::-;61170:53;;61350:7;61334:12;:23;;61326:55;;;::::0;-1:-1:-1;;;61326:55:0;;15459:2:1;61326:55:0::2;::::0;::::2;15441:21:1::0;15498:2;15478:18;;;15471:30;-1:-1:-1;;;15517:18:1;;;15510:49;15576:18;;61326:55:0::2;15257:343:1::0;61326:55:0::2;61411:15;;61396:12;:30;61392:69;;;-1:-1:-1::0;61444:15:0::2;::::0;61392:69:::2;61505:23;61521:7:::0;61505:23;::::2;:::i;:::-;::::0;-1:-1:-1;61584:23:0::2;61505::::0;61584:8;:23:::2;:::i;:::-;61559:14;::::0;::::2;::::0;;:22:::2;;:48:::0;;;;61660:14;:30;;61683:7;;61660:14;:30:::2;::::0;61683:7;;61660:30:::2;:::i;:::-;::::0;;-1:-1:-1;61701:15:0::2;61709:7:::0;61701:15;::::2;:::i;:::-;61789:17:::0;;:23:::2;;::::0;61701:15;;-1:-1:-1;61816:1:0::2;61789:28;:77:::0;::::2;;;-1:-1:-1::0;61847:19:0::2;::::0;61825:14:::2;::::0;::::2;::::0;:19;:41:::2;61789:77;61788:209;;;-1:-1:-1::0;61918:17:0;;:23:::2;;::::0;61945:1:::2;61918:28;:78:::0;::::2;;;-1:-1:-1::0;61976:20:0::2;::::0;61954:14:::2;::::0;::::2;::::0;:19;:42:::2;61918:78;61784:4216;;;62143:50;;:::i;:::-;62208:32:::0;;;62283:15:::2;::::0;:57:::2;::::0;-1:-1:-1;;;62283:57:0;;-1:-1:-1;;;;;201:32:1;;;62283:57:0::2;::::0;::::2;183:51:1::0;62283:15:0;;::::2;::::0;:42:::2;::::0;156:18:1;;62283:57:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62255:25;::::0;;::::2;:85:::0;;;;62392:64:::2;::::0;-1:-1:-1;;16717:2:1;16713:15;;;16709:53;62392:64:0;;::::2;16697:66:1::0;;;;62423:15:0::2;16779:12:1::0;;;16772:28;62439:16:0::2;16816:12:1::0;;;16809:28;16853:12;;62392:64:0::2;::::0;;-1:-1:-1;;62392:64:0;;::::2;::::0;;;;;;62382:75;;62392:64:::2;62382:75:::0;;::::2;::::0;62355:19;;::::2;:103:::0;62556:11:::2;::::0;62585:17;;62603:14;;::::2;::::0;62556:76;;-1:-1:-1;;;62556:76:0;;62377:81:::2;::::0;-1:-1:-1;;;;;62556:11:0;;::::2;::::0;:28:::2;::::0;:76:::2;::::0;62585:17;;62603:14;62355:12;;62556:76:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62514:5;:17;;62513:119;;;;;;;;62806:15;;;;;;;;;-1:-1:-1::0;;;;;62806:15:0::2;-1:-1:-1::0;;;;;62806:30:0::2;;62837:13;62851:5;62859;:17;;;62806:71;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62995:118;;;;;;;;63009:5;:14;;;:19;;;62995:118;;;;63050:19;;63039:8;:30;;;;:::i;:::-;62995:118;;;;63090:21;;63079:8;:32;;;;:::i;:::-;62995:118;;::::0;62978:5:::2;:14;;:135;;;;63128:15;;;;;;;;;-1:-1:-1::0;;;;;63128:15:0::2;-1:-1:-1::0;;;;;63128:27:0::2;;63156:13;63171:5;63178;:14;;;63128:65;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63251:15;;;;;;;;;-1:-1:-1::0;;;;;63251:15:0::2;-1:-1:-1::0;;;;;63251:39:0::2;;63291:13;63306:5;63313:11;;;;;;;;;-1:-1:-1::0;;;;;63313:11:0::2;-1:-1:-1::0;;;;;63313:23:0::2;;63337:5;:17;;;:20;;;63313:45;;;;;;;;;;;;;2039:25:1::0;;2027:2;2012:18;;1893:177;63313:45:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63251:108;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63494:55;63510:5;:14;;;63525:5;:17;;;63543:1;63545:3;63494:15;:55::i;:::-;63479:14;::::0;::::2;:70:::0;;;63610:17:::2;::::0;::::2;::::0;63579:55:::2;::::0;63479:70;63628:1:::2;63630:3;63579:15;:55::i;:::-;63564:14;::::0;::::2;:70:::0;;;63695:17:::2;::::0;::::2;::::0;63664:55:::2;::::0;63564:70;63713:1:::2;63715:3;63664:15;:55::i;:::-;63649:14;::::0;::::2;:70:::0;;;63780:17:::2;::::0;::::2;::::0;63749:55:::2;::::0;63649:70;63798:1:::2;63800:3;63749:15;:55::i;:::-;63734:14;::::0;::::2;:70:::0;;;63865:17:::2;::::0;::::2;::::0;63834:55:::2;::::0;63734:70;63883:1:::2;63885:3;63834:15;:55::i;:::-;63819:14;::::0;::::2;:70:::0;63979:17;;:23:::2;;::::0;64006:1:::2;63979:28:::0;63975:484:::2;;64053:17:::0;;:25;;64077:1:::2;::::0;64053:17;:25:::2;::::0;64077:1;;64053:25:::2;:::i;:::-;::::0;;-1:-1:-1;64155:17:0;;:20;64178:5:::2;-1:-1:-1::0;64151:289:0::2;;;64284:17:::0;;:20;:28:::2;::::0;64307:5:::2;::::0;64284:28:::2;:::i;:::-;64261:14;::::0;::::2;::::0;:20:::2;;:51:::0;64151:289:::2;;;64392:17:::0;;:20;:24:::2;::::0;64415:1:::2;::::0;64392:24:::2;:::i;:::-;64369:14;::::0;::::2;::::0;:20:::2;;:47:::0;64151:289:::2;64477:17:::0;;:23:::2;;::::0;64504:1:::2;64477:28:::0;64473:540:::2;;64627:17:::0;;:25;;64651:1:::2;::::0;64627:17;:25:::2;::::0;64651:1;;64627:25:::2;:::i;:::-;::::0;;-1:-1:-1;64725:17:0;;:20;64748:5:::2;-1:-1:-1::0;64721:277:0::2;;;64852:17:::0;;:20;:28:::2;::::0;64875:5:::2;::::0;64852:28:::2;:::i;:::-;64827:14;::::0;::::2;::::0;:22:::2;;:53:::0;64721:277:::2;;;64954:17:::0;;:20;:24:::2;::::0;64977:1:::2;::::0;64954:24:::2;:::i;:::-;64929:14;::::0;::::2;::::0;:22:::2;;:49:::0;64721:277:::2;65027:15;;;;;;;;;-1:-1:-1::0;;;;;65027:15:0::2;-1:-1:-1::0;;;;;65027:27:0::2;;65055:13;65070:5;65078;:14;;;65027:66;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;65310:15:0::2;::::0;:40:::2;::::0;-1:-1:-1;;;65310:40:0;;-1:-1:-1;;;;;201:32:1;;;65310:40:0::2;::::0;::::2;183:51:1::0;65295:12:0::2;::::0;-1:-1:-1;65310:15:0;;::::2;::::0;-1:-1:-1;65310:25:0::2;::::0;156:18:1;;65310:40:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65448:17:::0;;:20;65295:55;;-1:-1:-1;65472:5:0::2;::::0;65448:22:::2;::::0;65469:1:::2;::::0;65448:22:::2;:::i;:::-;65447:30;;;;:::i;:::-;65557:15;::::0;:48:::2;::::0;-1:-1:-1;;;65557:48:0;;65441:1:::2;:37:::0;;::::2;65429:50:::0;;;::::2;::::0;-1:-1:-1;;;;;65557:15:0::2;::::0;:25:::2;::::0;:48:::2;::::0;65583:13;;65429:50;;65557:48:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61999:3697;;;61784:4216;;;65842:15;::::0;65893:14:::2;::::0;::::2;::::0;65842:66:::2;::::0;-1:-1:-1;;;65842:66:0;;-1:-1:-1;;;;;65842:15:0;;::::2;::::0;:27:::2;::::0;:66:::2;::::0;65870:13;;65885:5;;65842:66:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;65923:15:0::2;::::0;65973:14:::2;::::0;;::::2;::::0;65923:65;;-1:-1:-1;;;65923:65:0;;-1:-1:-1;;;;;65923:15:0;;::::2;::::0;-1:-1:-1;65923:27:0::2;::::0;-1:-1:-1;65923:65:0::2;::::0;65951:13;;65966:5;;65923:65:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61784:4216;66072:15;::::0;:43:::2;::::0;-1:-1:-1;;;66072:43:0;;-1:-1:-1;;;;;66072:15:0;;::::2;::::0;:22:::2;::::0;:43:::2;::::0;66095:13;;66110:4;;66072:43:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66131:66;66149:5;:14;;;66164:5;:17;;;66182:5;:14;;;66131:66;;;;;;;;:::i;:::-;;;;;;;;54672:11537;;;;;;;9236:20:::1;8630:1:::0;9756:22;;9573:213;9236:20:::1;54578:11631:::0;;;:::o;33243:101::-;2026:13;:11;:13::i;:::-;33312:14:::1;:24:::0;33243:101::o;70814:217::-;70867:26;;:::i;:::-;70906:21;70930:25;:23;:25::i;:::-;70979:15;;:44;;-1:-1:-1;;;70979:44:0;;-1:-1:-1;;;;;201:32:1;;;70979:44:0;;;183:51:1;70906:49:0;;-1:-1:-1;70979:15:0;;;:29;;156:18:1;;70979:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70966:57;;70895:136;70814:217;:::o;32534:110::-;2026:13;:11;:13::i;:::-;32608:16:::1;:28:::0;32534:110::o;33350:114::-;2026:13;:11;:13::i;:::-;33426:19:::1;:30:::0;33350:114::o;66683:1228::-;9192:21;:19;:21::i;:::-;66794:14:::1;;66781:9;:27;66773:70;;;;-1:-1:-1::0;;;66773:70:0::1;;;;;;;:::i;:::-;66862:27;66879:9;66862:16;:27::i;:::-;66854:56;;;::::0;-1:-1:-1;;;66854:56:0;;21488:2:1;66854:56:0::1;::::0;::::1;21470:21:1::0;21527:2;21507:18;;;21500:30;-1:-1:-1;;;21546:18:1;;;21539:46;21602:18;;66854:56:0::1;21286:340:1::0;66854:56:0::1;66921:21;66945:25;:23;:25::i;:::-;67244:15;::::0;:37:::1;::::0;-1:-1:-1;;;67244:37:0;;-1:-1:-1;;;;;201:32:1;;;67244:37:0::1;::::0;::::1;183:51:1::0;66921:49:0;;-1:-1:-1;67227:14:0::1;::::0;67244:15;;::::1;::::0;:22:::1;::::0;156:18:1;;67244:37:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67377:15;::::0;:40:::1;::::0;-1:-1:-1;;;67377:40:0;;::::1;::::0;::::1;2039:25:1::0;;;67227:54:0;;-1:-1:-1;;;;;;67377:15:0::1;::::0;:29:::1;::::0;2012:18:1;;67377:40:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;67377:40:0::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;67371:54:::0;:59;67363:108:::1;;;::::0;-1:-1:-1;;;67363:108:0;;22525:2:1;67363:108:0::1;::::0;::::1;22507:21:1::0;22564:2;22544:18;;;22537:30;22603:34;22583:18;;;22576:62;-1:-1:-1;;;22654:18:1;;;22647:34;22698:19;;67363:108:0::1;22323:400:1::0;67363:108:0::1;67551:15;::::0;:40:::1;::::0;-1:-1:-1;;;67551:40:0;;-1:-1:-1;;;;;67551:15:0;;::::1;::::0;:29:::1;::::0;:40:::1;::::0;67581:9;;67551:40:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:45:::0;67543:81:::1;;;::::0;-1:-1:-1;;;67543:81:0;;22930:2:1;67543:81:0::1;::::0;::::1;22912:21:1::0;22969:2;22949:18;;;22942:30;23008:25;22988:18;;;22981:53;23051:18;;67543:81:0::1;22728:347:1::0;67543:81:0::1;67669:15;::::0;:54:::1;::::0;-1:-1:-1;;;67669:54:0;;-1:-1:-1;;;;;67669:15:0;;::::1;::::0;:32:::1;::::0;:54:::1;::::0;67702:9;;67713;;67669:54:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;67766:15:0::1;::::0;:54:::1;::::0;-1:-1:-1;;;67766:54:0;;-1:-1:-1;;;;;67766:15:0;;::::1;::::0;-1:-1:-1;67766:32:0::1;::::0;-1:-1:-1;67766:54:0::1;::::0;67799:9;;67810;;67766:54:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67881:10;-1:-1:-1::0;;;;;67864:39:0::1;;67893:9;67864:39;;;;;;:::i;:::-;;;;;;;;66762:1149;;9236:20:::0;8630:1;9756:22;;9573:213;9236:20;66683:1228;:::o;32107:255::-;2026:13;:11;:13::i;:::-;32264:1:::1;32240:21;:25;32232:62;;;::::0;-1:-1:-1;;;32232:62:0;;23874:2:1;32232:62:0::1;::::0;::::1;23856:21:1::0;23913:2;23893:18;;;23886:30;23952:26;23932:18;;;23925:54;23996:18;;32232:62:0::1;23672:348:1::0;32232:62:0::1;32313:8;::::0;32305:49:::1;::::0;-1:-1:-1;;;;;32313:8:0;;::::1;::::0;32332:21:::1;32305:49:::0;::::1;;;::::0;32313:8:::1;32305:49:::0;32313:8;32305:49;32332:21;32313:8;32305:49;::::1;;;;;;;;;;;;;;;;;;70182:626:::0;9192:21;:19;:21::i;:::-;70279::::1;70303:25;:23;:25::i;:::-;70367:15;::::0;:44:::1;::::0;-1:-1:-1;;;70367:44:0;;-1:-1:-1;;;;;201:32:1;;;70367:44:0::1;::::0;::::1;183:51:1::0;70279:49:0;;-1:-1:-1;70339:25:0::1;::::0;70367:15;;::::1;::::0;:29:::1;::::0;156:18:1;;70367:44:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70339:72;;70438:2;70431:4;:9;70422:64;;;::::0;-1:-1:-1;;;70422:64:0;;24227:2:1;70422:64:0::1;::::0;::::1;24209:21:1::0;24266:2;24246:18;;;24239:30;24305:34;24285:18;;;24278:62;-1:-1:-1;;;24356:18:1;;;24349:39;24405:19;;70422:64:0::1;24025:405:1::0;70422:64:0::1;70506:9:::0;::::1;70519;::::0;::::1;;70506:22;::::0;::::1;::::0;:48:::1;;-1:-1:-1::0;70532:9:0;::::1;70545::::0;;::::1;;70532:22;;70506:48;:74;;;;-1:-1:-1::0;70571:9:0::1;70558::::0;::::1;;70571::::0;;::::1;;70558:22;;70506:74;70497:119;;;::::0;-1:-1:-1;;;70497:119:0;;24769:2:1;70497:119:0::1;::::0;::::1;24751:21:1::0;24808:2;24788:18;;;24781:30;24847:33;24827:18;;;24820:61;24898:18;;70497:119:0::1;24567:355:1::0;70497:119:0::1;70645:9:::0;::::1;70627::::0;70637:6:::1;:4:::0;70642:1:::1;70637:6;:::i;:::-;70627:17;;;;;;;:::i;:::-;;;;:27:::0;70685:6;70692:1:::1;70685:9;;;;70665::::0;70675:6:::1;:4:::0;70680:1:::1;70675:6;:::i;:::-;:8;::::0;70682:1:::1;70675:8;:::i;:::-;70665:19;;;;;;;:::i;:::-;;;;:29:::0;70725:9;;::::1;;70705::::0;70715:6:::1;:4:::0;70720:1:::1;70715:6;:::i;:::-;:8;::::0;70722:1:::1;70715:8;:::i;:::-;70705:19;;;;;;;:::i;:::-;;;;:29:::0;70745:15:::1;::::0;:55:::1;::::0;-1:-1:-1;;;70745:55:0;;-1:-1:-1;;;;;70745:15:0;;::::1;::::0;:29:::1;::::0;:55:::1;::::0;70775:13;;70790:9;;70745:55:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70268:540;;9236:20:::0;8630:1;9756:22;;9573:213;9236:20;70182:626;;:::o;71460:645::-;71622:15;;:34;;-1:-1:-1;;;71622:34:0;;-1:-1:-1;;;;;201:32:1;;;71622:34:0;;;183:51:1;71563:29:0;;71605:14;;71622:15;;;:25;;156:18:1;;71622:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71605:51;;71690:10;71675:11;:25;;71667:84;;;;-1:-1:-1;;;71667:84:0;;25649:2:1;71667:84:0;;;25631:21:1;25688:2;25668:18;;;25661:30;25727:34;25707:18;;;25700:62;-1:-1:-1;;;25778:18:1;;;25771:44;25832:19;;71667:84:0;25447:410:1;71667:84:0;71783:9;71770:10;:22;71762:72;;;;-1:-1:-1;;;71762:72:0;;26064:2:1;71762:72:0;;;26046:21:1;26103:2;26083:18;;;26076:30;26142:34;26122:18;;;26115:62;-1:-1:-1;;;26193:18:1;;;26186:35;26238:19;;71762:72:0;25862:401:1;71762:72:0;71847:16;71866:24;71879:11;71866:10;:24;:::i;:::-;:28;;71893:1;71866:28;:::i;:::-;71847:47;;71934:11;71919:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;71919:27:0;;;;;;;;;;;;;;;;-1:-1:-1;71905:41:0;-1:-1:-1;71964:6:0;71959:139;71980:11;71976:1;:15;71959:139;;;72030:15;;-1:-1:-1;;;;;72030:15:0;:30;72061:7;72070:15;72084:1;72070:11;:15;:::i;:::-;72030:56;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;72013:11;72025:1;72013:14;;;;;;;;:::i;:::-;;;;;;;;;;:73;71993:3;;71959:139;;;;71594:511;;71460:645;;;;;:::o;42452:604::-;9192:21;:19;:21::i;:::-;42535::::1;42559:25;:23;:25::i;:::-;42535:49;;42734:14;42750:18;42772:42;42796:17;42772:23;:42::i;:::-;42733:81;;;;42847:13;42834:9;:26;42826:69;;;;-1:-1:-1::0;;;42826:69:0::1;;;;;;;:::i;:::-;42906:15;::::0;-1:-1:-1;;;;;42906:15:0::1;:25;42932:13:::0;42947:27:::1;42957:17:::0;42947:9;:27:::1;:::i;:::-;42906:69;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43024:24;:22;:24::i;:::-;42524:532;;;9236:20:::0;8630:1;9756:22;;9573:213;34860:756;34911:14;34927:25;34954:16;35059:21;35083:25;:23;:25::i;:::-;35156:15;;:44;;-1:-1:-1;;;35156:44:0;;-1:-1:-1;;;;;201:32:1;;;35156:44:0;;;183:51:1;35059:49:0;;-1:-1:-1;35119:16:0;;35156:15;;;;:29;;156:18:1;;35156:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35138:62;;:15;:62;:::i;:::-;35119:81;;35230:8;35215:11;:23;35211:398;;35306:1;35294:13;;35345:1;35322:24;;35211:398;;;35443:15;;:40;;-1:-1:-1;;;35443:40:0;;-1:-1:-1;;;;;201:32:1;;;35443:40:0;;;183:51:1;35443:15:0;;;;:25;;156:18:1;;35443:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35431:52;-1:-1:-1;35521:22:0;35532:11;35521:8;:22;:::i;:::-;35498:45;;35588:9;35572:15;;:25;;;;:::i;:::-;35558:39;;35211:398;34972:644;;34860:756;;;:::o;69804:261::-;69848:13;69896:21;69920:25;:23;:25::i;:::-;69967:15;;:38;;-1:-1:-1;;;69967:38:0;;-1:-1:-1;;;;;201:32:1;;;69967:38:0;;;183:51:1;69896:49:0;;-1:-1:-1;69956:8:0;;69967:15;;;;:23;;156:18:1;;69967:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70023:15;;:34;;-1:-1:-1;;;70023:34:0;;;;;2039:25:1;;;69956:49:0;;-1:-1:-1;;;;;;70023:15:0;;:29;;2012:18:1;;70023:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;70023:34:0;;;;;;;;;;;;:::i;:::-;70016:41;;;;69804:261;:::o;32650:112::-;2026:13;:11;:13::i;:::-;32725:18:::1;:29:::0;32650:112::o;2788:103::-;2026:13;:11;:13::i;:::-;2853:30:::1;2880:1;2853:18;:30::i;:::-;2788:103::o:0;33134:::-;2026:13;:11;:13::i;:::-;33204:15:::1;:25:::0;33134:103::o;67966:1101::-;9192:21;:19;:21::i;:::-;68078:14:::1;;68065:9;:27;68057:70;;;;-1:-1:-1::0;;;68057:70:0::1;;;;;;;:::i;:::-;68146:30;68163:12;68146:16;:30::i;:::-;68138:63;;;::::0;-1:-1:-1;;;68138:63:0;;26470:2:1;68138:63:0::1;::::0;::::1;26452:21:1::0;26509:2;26489:18;;;26482:30;-1:-1:-1;;;26528:18:1;;;26521:50;26588:18;;68138:63:0::1;26268:344:1::0;68138:63:0::1;68212:21;68236:25;:23;:25::i;:::-;68335:15;::::0;:37:::1;::::0;-1:-1:-1;;;68335:37:0;;-1:-1:-1;;;;;201:32:1;;;68335:37:0::1;::::0;::::1;183:51:1::0;68212:49:0;;-1:-1:-1;68318:14:0::1;::::0;68335:15;;::::1;::::0;:22:::1;::::0;156:18:1;;68335:37:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68453:15;::::0;:40:::1;::::0;-1:-1:-1;;;68453:40:0;;::::1;::::0;::::1;2039:25:1::0;;;68318:54:0;;-1:-1:-1;68425:25:0::1;::::0;-1:-1:-1;;;;;68453:15:0;;::::1;::::0;:29:::1;::::0;2012:18:1;;68453:40:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;68453:40:0::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;68561:15;::::0;:43:::1;::::0;-1:-1:-1;;;68561:43:0;;68425:68;;-1:-1:-1;;;;;;68561:15:0::1;::::0;:29:::1;::::0;:43:::1;::::0;68591:12;;68561:43:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:48:::0;68553:88:::1;;;::::0;-1:-1:-1;;;68553:88:0;;26819:2:1;68553:88:0::1;::::0;::::1;26801:21:1::0;26858:2;26838:18;;;26831:30;26897:29;26877:18;;;26870:57;26944:18;;68553:88:0::1;26617:351:1::0;68553:88:0::1;68689:15;::::0;:57:::1;::::0;-1:-1:-1;;;68689:57:0;;-1:-1:-1;;;;;68689:15:0;;::::1;::::0;:32:::1;::::0;:57:::1;::::0;68722:9;;68733:12;;68689:57:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;68792:15:0::1;::::0;:57:::1;::::0;-1:-1:-1;;;68792:57:0;;-1:-1:-1;;;;;68792:15:0;;::::1;::::0;-1:-1:-1;68792:32:0::1;::::0;-1:-1:-1;68792:57:0::1;::::0;68825:12;;68839:9;;68792:57:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;68912:15:0::1;::::0;:52:::1;::::0;-1:-1:-1;;;68912:52:0;;-1:-1:-1;;;;;68912:15:0;;::::1;::::0;-1:-1:-1;68912:39:0::1;::::0;-1:-1:-1;68912:52:0::1;::::0;68952:11;;68912:52:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69021:10;-1:-1:-1::0;;;;;69005:54:0::1;;69033:11;69046:12;69005:54;;;;;;;:::i;:::-;;;;;;;;68046:1021;;;9236:20:::0;8630:1;9756:22;;9573:213;32420:108;2026:13;:11;:13::i;:::-;32493:15:::1;:27:::0;32420:108::o;31444:181::-;2026:13;:11;:13::i;:::-;-1:-1:-1;;;;;31528:26:0;::::1;31520:63;;;::::0;-1:-1:-1;;;31520:63:0;;27563:2:1;31520:63:0::1;::::0;::::1;27545:21:1::0;27602:2;27582:18;;;27575:30;27641:26;27621:18;;;27614:54;27685:18;;31520:63:0::1;27361:348:1::0;31520:63:0::1;31594:8;:23:::0;;-1:-1:-1;;;;;;31594:23:0::1;-1:-1:-1::0;;;;;31594:23:0;;;::::1;::::0;;;::::1;::::0;;31444:181::o;29512:30::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29512:30:0;;;;;;;;;;;:::o;35791:431::-;35875:14;35891:18;35922:21;35946:25;:23;:25::i;:::-;35994:15;;:40;;-1:-1:-1;;;35994:40:0;;-1:-1:-1;;;;;201:32:1;;;35994:40:0;;;183:51:1;35922:49:0;;-1:-1:-1;35994:15:0;;;:25;;156:18:1;;35994:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35982:52;-1:-1:-1;36092:3:0;36054:35;35982:52;36054:23;:35;:::i;:::-;:41;36045:51;;;;;;36185:23;36168:16;;:40;;;;:::i;:::-;36152:56;;35911:311;35791:431;;;:::o;34171:429::-;34410:15;;:42;;-1:-1:-1;;;34410:42:0;;34441:10;34410:42;;;183:51:1;34227:7:0;;;;-1:-1:-1;;;;;34410:15:0;;;;:30;;156:18:1;;34410:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34386:66;-1:-1:-1;;;;;;34467:27:0;;34463:130;;34518:10;34511:17;;;34171:429;:::o;34463:130::-;34568:13;34171:429;-1:-1:-1;34171:429:0:o;31631:234::-;2026:13;:11;:13::i;:::-;-1:-1:-1;;;;;31738:34:0;::::1;31730:62;;;::::0;-1:-1:-1;;;31730:62:0;;10588:2:1;31730:62:0::1;::::0;::::1;10570:21:1::0;10627:2;10607:18;;;10600:30;-1:-1:-1;;;10646:18:1;;;10639:45;10701:18;;31730:62:0::1;10386:339:1::0;31730:62:0::1;31803:15;:54:::0;;-1:-1:-1;;;;;;31803:54:0::1;-1:-1:-1::0;;;;;31803:54:0;;;::::1;::::0;;;::::1;::::0;;31631:234::o;32888:118::-;2026:13;:11;:13::i;:::-;32966:21:::1;:32:::0;32888:118::o;36228:780::-;36279:9;36290:12;36304:14;36352:21;36376:25;:23;:25::i;:::-;36437:15;;:47;;-1:-1:-1;;;36437:47:0;;36352:49;;-1:-1:-1;36412:22:0;;-1:-1:-1;;;;;36437:15:0;;;;:27;;:47;;36352:49;;36479:4;;36437:47;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36502:13;;36602:15;;36583:16;;;;36502:13;;-1:-1:-1;36412:72:0;;-1:-1:-1;36542:15:0;;36602;36572:27;;36542:15;36572:27;:::i;:::-;:45;36568:172;;;36644:15;;36634:25;;36568:172;;;36712:16;;;;36702:26;;:8;:26;:::i;:::-;36692:36;;36568:172;36772:8;36754;:15;;;:26;36750:251;;;36809:1;36797:13;;36750:251;;;36861:14;;36850:8;36832;:15;;;:26;;;;:::i;:::-;:43;36828:173;;;36922:8;36904;:15;;;:26;;;;:::i;:::-;36892:38;;36828:173;;;36975:14;;36963:26;;36828:173;36320:688;;;36228:780;;;;;:::o;45058:9384::-;37064:10;37700:18;37746:8;37044:63;;;;-1:-1:-1;;;37044:63:0;;10932:2:1;37044:63:0;;;10914:21:1;10971:2;10951:18;;;10944:30;11010:29;10990:18;;;10983:57;11057:18;;37044:63:0;10730:351:1;37044:63:0;9192:21:::1;:19;:21::i;:::-;45161::::2;45185:25;:23;:25::i;:::-;45241:15;::::0;:65:::2;::::0;-1:-1:-1;;;45241:65:0;;45161:49;;-1:-1:-1;45221:17:0::2;::::0;-1:-1:-1;;;;;45241:15:0;;::::2;::::0;:37:::2;::::0;:65:::2;::::0;45161:49;;45293:12;;45241:65:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45221:85;;45466:1;45451:12;:16;45443:49;;;;-1:-1:-1::0;;;45443:49:0::2;;;;;;;:::i;:::-;45528:2;45515:9;:15;;45507:43;;;::::0;-1:-1:-1;;;45507:43:0;;28172:2:1;45507:43:0::2;::::0;::::2;28154:21:1::0;28211:2;28191:18;;;28184:30;-1:-1:-1;;;28230:18:1;;;28223:45;28285:18;;45507:43:0::2;27970:339:1::0;45507:43:0::2;45574:20;;:::i;:::-;45625:15;::::0;:51:::2;::::0;-1:-1:-1;;;45625:51:0;;-1:-1:-1;;;;;45625:15:0;;::::2;::::0;:30:::2;::::0;:51:::2;::::0;45656:13;;45670:5;;45625:51:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45605:71:::0;;45704:15:::2;::::0;:48:::2;::::0;-1:-1:-1;;;45704:48:0;;-1:-1:-1;;;;;45704:15:0;;::::2;::::0;:27:::2;::::0;:48:::2;::::0;45732:13;;45746:5;;45704:48:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45687:14;::::0;::::2;:65:::0;45780:15:::2;::::0;:48:::2;::::0;-1:-1:-1;;;45780:48:0;;-1:-1:-1;;;;;45780:15:0;;::::2;::::0;:27:::2;::::0;:48:::2;::::0;45808:13;;45822:5;;45780:48:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45763:14;::::0;;::::2;:65:::0;;;;45859:15:::2;::::0;:60;;-1:-1:-1;;;45859:60:0;;-1:-1:-1;;;;;45859:15:0;;::::2;::::0;:39:::2;::::0;:60:::2;::::0;45899:13;;45913:5;;45859:60:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45839:17;::::0;::::2;:80:::0;45942:15:::2;::::0;:44:::2;::::0;-1:-1:-1;;;45942:44:0;;-1:-1:-1;;;;;201:32:1;;;45942:44:0::2;::::0;::::2;183:51:1::0;45930:9:0::2;::::0;45942:15:::2;::::0;:29:::2;::::0;156:18:1;;45942:44:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45930:56:::0;-1:-1:-1;45997:10:0::2;::::0;46155:15:::2;46181:33;46200:13:::0;46181:18:::2;:33::i;:::-;46249:17:::0;;:20;:17:::2;:25:::0;46240:49:::2;;;::::0;-1:-1:-1;;;46240:49:0;;14855:2:1;46240:49:0::2;::::0;::::2;14837:21:1::0;14894:2;14874:18;;;14867:30;-1:-1:-1;;;14913:18:1;;;14906:40;14963:18;;46240:49:0::2;14653:334:1::0;46240:49:0::2;46309:9;46320:1;46309:12:::0;46300:618:::2;;46331:7;46323:15;;46300:618;;;46375:9;46386:1;46375:12:::0;46371:547:::2;;46397:8;46389:16;;46371:547;;;46435:9;46446:1;46435:12:::0;46431:487:::2;;46457:8;46449:16;;46431:487;;;46488:9;46499:1;46488:12:::0;46484:434:::2;;46510:8;46502:16;;46484:434;;;46541:9;46552:1;46541:12:::0;46537:381:::2;;46563:8;46555:16;;46537:381;;;46603:9;46614:1;46603:12:::0;46599:319:::2;;46625:8;46617:16;;46599:319;;;46656:9;46667:1;46656:12:::0;46652:266:::2;;46678:8;46670:16;;46652:266;;;46716:9;46727:1;46716:12:::0;46712:206:::2;;46738:8;46730:16;;46712:206;;;46769:9;46780:1;46769:12:::0;46765:153:::2;;46791:8;46783:16;;46765:153;;;46822:9;46833:1;46822:12:::0;46818:100:::2;;46844:8;46836:16;;46818:100;;;46884:9;46895:2;46884:13:::0;46880:38:::2;;46907:8;46899:16;;46880:38;46957:8;46933:5;:14;;;:21;;;:32;46929:1071;;;47034:14;::::0;::::2;::::0;:19;:27:::2;::::0;47056:5;;47034:27:::2;:::i;:::-;47012:14;::::0;::::2;::::0;:49;47076:13:::2;47084:5:::0;47076:13;::::2;:::i;:::-;::::0;-1:-1:-1;47128:16:0::2;47139:5:::0;47128:8;:16:::2;:::i;:::-;47104:14;::::0;;::::2;::::0;:21:::2;:40:::0;47173:2:::2;::::0;-1:-1:-1;46929:1071:0::2;;;47252:14;;47245:5;47234:8;47210:5;:14;;;:21;;;:32;;;;:::i;:::-;:40;;;;:::i;:::-;:56;47206:794;;;47314:19;47378:8;47354:5;:14;;;:21;;;:32;;;;:::i;:::-;47337:14;;:50;;;;:::i;:::-;47425:14;::::0;::::2;::::0;:19;47314:74;;-1:-1:-1;47425:36:0::2;::::0;47314:74;;47425:36:::2;:::i;:::-;47403:14;::::0;::::2;::::0;:58;47477:22:::2;47485:14:::0;47477:22;::::2;:::i;:::-;::::0;-1:-1:-1;47551:5:0;47530:17:::2;:14:::0;47545:2:::2;47530:17;:::i;:::-;47529:28;;;;:::i;:::-;47514:43;;47720:14;;47709:8;:25;;;;:::i;:::-;47685:14;::::0;;::::2;::::0;:21:::2;:49:::0;-1:-1:-1;47206:794:0::2;;;47820:14;::::0;::::2;::::0;:19;:27:::2;::::0;47842:5;;47820:27:::2;:::i;:::-;47798:14;::::0;::::2;::::0;:49;47862:13:::2;47870:5:::0;47862:13;::::2;:::i;:::-;;;47938:5;47914;:14;;;:21;;;:29;;;;:::i;:::-;47890:14;::::0;;::::2;::::0;:21:::2;:53:::0;47973:2:::2;::::0;-1:-1:-1;47206:794:0::2;48250:1690:::0;;::::2;;48652:9;48663:1;48652:12:::0;48648:1292:::2;;48681:67;48697:5;:14;;;48712:5;:17;;;48730:1;48735:12;48732:2;:15;;;;:::i;:::-;48681;:67::i;:::-;48666:14;::::0;::::2;:82:::0;48648:1292:::2;;;48789:9;48800:1;48789:12:::0;48785:1155:::2;;48818:66;48834:5;:14;;;48849:5;:17;;;48867:1;48871:12;48869:1;:14;;;;:::i;48785:1155::-;48916:9;48927:1;48916:12:::0;48912:1028:::2;;48945:66;48961:5;:14;;;48976:5;:17;;;48994:1;48998:12;48996:1;:14;;;;:::i;48912:1028::-;49043:9;49054:1;49043:12:::0;49039:901:::2;;49072:66;49088:5;:14;;;49103:5;:17;;;49121:1;49125:12;49123:1;:14;;;;:::i;49039:901::-;49180:9;49191:1;49180:12:::0;49176:764:::2;;49209:66;49225:5;:14;;;49240:5;:17;;;49258:1;49262:12;49260:1;:14;;;;:::i;49176:764::-;49307:9;49318:1;49307:12:::0;49303:637:::2;;49336:67;49352:5;:14;;;49367:5;:17;;;49385:1;49390:12;49387:2;:15;;;;:::i;49303:637::-;49444:9;49455:1;49444:12:::0;49440:500:::2;;49473:67;49489:5;:14;;;49504:5;:17;;;49522:1;49527:12;49524:2;:15;;;;:::i;49440:500::-;49573:9;49584:1;49573:12:::0;49569:371:::2;;49602:67;49618:5;:14;;;49633:5;:17;;;49651:1;49656:12;49653:2;:15;;;;:::i;49569:371::-;49702:9;49713:1;49702:12:::0;49698:242:::2;;49731:67;49747:5;:14;;;49762:5;:17;;;49780:1;49785:12;49782:2;:15;;;;:::i;49698:242::-;49841:9;49852:2;49841:13:::0;49837:103:::2;;49871:67;49887:5;:14;;;49902:5;:17;;;49920:1;49925:12;49922:2;:15;;;;:::i;49871:67::-;49856:14;::::0;::::2;:82:::0;49837:103:::2;50040:17:::0;;:23:::2;;::::0;50067:1:::2;50040:28;:77:::0;::::2;;;-1:-1:-1::0;50098:19:0::2;::::0;50076:14:::2;::::0;::::2;::::0;:19;:41:::2;50040:77;50039:209;;;-1:-1:-1::0;50169:17:0;;:23:::2;;::::0;50196:1:::2;50169:28;:78:::0;::::2;;;-1:-1:-1::0;50227:20:0::2;::::0;50205:14:::2;::::0;::::2;::::0;:19;:42:::2;50169:78;50035:4202;;;50394:50;;:::i;:::-;50459:32:::0;;;50534:15:::2;::::0;:57:::2;::::0;-1:-1:-1;;;50534:57:0;;-1:-1:-1;;;;;201:32:1;;;50534:57:0::2;::::0;::::2;183:51:1::0;50534:15:0;;::::2;::::0;:42:::2;::::0;156:18:1;;50534:57:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50506:25;::::0;;::::2;:85:::0;;;;50643:64:::2;::::0;-1:-1:-1;;16717:2:1;16713:15;;;16709:53;50643:64:0;;::::2;16697:66:1::0;;;;50674:15:0::2;16779:12:1::0;;;16772:28;50690:16:0::2;16816:12:1::0;;;16809:28;16853:12;;50643:64:0::2;::::0;;-1:-1:-1;;50643:64:0;;::::2;::::0;;;;;;50633:75;;50643:64:::2;50633:75:::0;;::::2;::::0;50606:19;;::::2;:103:::0;50807:11:::2;::::0;50836:17;;50854:14;;::::2;::::0;50807:76;;-1:-1:-1;;;50807:76:0;;50628:81:::2;::::0;-1:-1:-1;;;;;50807:11:0;;::::2;::::0;:28:::2;::::0;:76:::2;::::0;50836:17;;50854:14;50606:12;;50807:76:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50765:5;:17;;50764:119;;;;;;;;51057:15;;;;;;;;;-1:-1:-1::0;;;;;51057:15:0::2;-1:-1:-1::0;;;;;51057:30:0::2;;51088:13;51102:5;51110;:17;;;51057:71;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51246:118;;;;;;;;51260:5;:14;;;:19;;;51246:118;;;;51301:19;;51290:8;:30;;;;:::i;:::-;51246:118;;;;51341:21;;51330:8;:32;;;;:::i;:::-;51246:118;;::::0;51229:5:::2;:14;;:135;;;;51379:15;;;;;;;;;-1:-1:-1::0;;;;;51379:15:0::2;-1:-1:-1::0;;;;;51379:27:0::2;;51407:13;51422:5;51429;:14;;;51379:65;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51502:15;;;;;;;;;-1:-1:-1::0;;;;;51502:15:0::2;-1:-1:-1::0;;;;;51502:39:0::2;;51542:13;51557:5;51564:11;;;;;;;;;-1:-1:-1::0;;;;;51564:11:0::2;-1:-1:-1::0;;;;;51564:23:0::2;;51588:5;:17;;;:20;;;51564:45;;;;;;;;;;;;;2039:25:1::0;;2027:2;2012:18;;1893:177;51564:45:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51502:108;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51745:55;51761:5;:14;;;51776:5;:17;;;51794:1;51796:3;51745:15;:55::i;:::-;51730:14;::::0;::::2;:70:::0;;;51861:17:::2;::::0;::::2;::::0;51830:55:::2;::::0;51730:70;51879:1:::2;51881:3;51830:15;:55::i;:::-;51815:14;::::0;::::2;:70:::0;;;51946:17:::2;::::0;::::2;::::0;51915:55:::2;::::0;51815:70;51964:1:::2;51966:3;51915:15;:55::i;:::-;51900:14;::::0;::::2;:70:::0;;;52031:17:::2;::::0;::::2;::::0;52000:55:::2;::::0;51900:70;52049:1:::2;52051:3;52000:15;:55::i;:::-;51985:14;::::0;::::2;:70:::0;;;52116:17:::2;::::0;::::2;::::0;52085:55:::2;::::0;51985:70;52134:1:::2;52136:3;52085:15;:55::i;:::-;52070:14;::::0;::::2;:70:::0;52230:17;;:23:::2;;::::0;52257:1:::2;52230:28:::0;52226:484:::2;;52304:17:::0;;:25;;52328:1:::2;::::0;52304:17;:25:::2;::::0;52328:1;;52304:25:::2;:::i;:::-;::::0;;-1:-1:-1;52406:17:0;;:20;52429:5:::2;-1:-1:-1::0;52402:289:0::2;;;52535:17:::0;;:20;:28:::2;::::0;52558:5:::2;::::0;52535:28:::2;:::i;:::-;52512:14;::::0;::::2;::::0;:20:::2;;:51:::0;52402:289:::2;;;52643:17:::0;;:20;:24:::2;::::0;52666:1:::2;::::0;52643:24:::2;:::i;:::-;52620:14;::::0;::::2;::::0;:20:::2;;:47:::0;52402:289:::2;52728:17:::0;;:23:::2;;::::0;52755:1:::2;52728:28:::0;52724:540:::2;;52878:17:::0;;:25;;52902:1:::2;::::0;52878:17;:25:::2;::::0;52902:1;;52878:25:::2;:::i;:::-;::::0;;-1:-1:-1;52976:17:0;;:20;52999:5:::2;-1:-1:-1::0;52972:277:0::2;;;53103:17:::0;;:20;:28:::2;::::0;53126:5:::2;::::0;53103:28:::2;:::i;:::-;53078:14;::::0;::::2;::::0;:22:::2;;:53:::0;52972:277:::2;;;53205:17:::0;;:20;:24:::2;::::0;53228:1:::2;::::0;53205:24:::2;:::i;:::-;53180:14;::::0;::::2;::::0;:22:::2;;:49:::0;52972:277:::2;53278:15;;;;;;;;;-1:-1:-1::0;;;;;53278:15:0::2;-1:-1:-1::0;;;;;53278:27:0::2;;53306:13;53321:5;53329;:14;;;53278:66;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;53561:15:0::2;::::0;:40:::2;::::0;-1:-1:-1;;;53561:40:0;;-1:-1:-1;;;;;201:32:1;;;53561:40:0::2;::::0;::::2;183:51:1::0;53546:12:0::2;::::0;-1:-1:-1;53561:15:0;;::::2;::::0;-1:-1:-1;53561:25:0::2;::::0;156:18:1;;53561:40:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53699:17:::0;;:20;53546:55;;-1:-1:-1;53723:5:0::2;::::0;53699:22:::2;::::0;53720:1:::2;::::0;53699:22:::2;:::i;:::-;53698:30;;;;:::i;:::-;53808:15;::::0;:48:::2;::::0;-1:-1:-1;;;53808:48:0;;53692:1:::2;:37:::0;;::::2;53680:50:::0;;;::::2;::::0;-1:-1:-1;;;;;53808:15:0::2;::::0;:25:::2;::::0;:48:::2;::::0;53834:13;;53680:50;;53808:48:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50250:3683;;;50035:4202;;;54079:15;::::0;54130:14:::2;::::0;::::2;::::0;54079:66:::2;::::0;-1:-1:-1;;;54079:66:0;;-1:-1:-1;;;;;54079:15:0;;::::2;::::0;:27:::2;::::0;:66:::2;::::0;54107:13;;54122:5;;54079:66:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;54160:15:0::2;::::0;54210:14:::2;::::0;;::::2;::::0;54160:65;;-1:-1:-1;;;54160:65:0;;-1:-1:-1;;;;;54160:15:0;;::::2;::::0;-1:-1:-1;54160:27:0::2;::::0;-1:-1:-1;54160:65:0::2;::::0;54188:13;;54203:5;;54160:65:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50035:4202;54309:15;::::0;:43:::2;::::0;-1:-1:-1;;;54309:43:0;;-1:-1:-1;;;;;54309:15:0;;::::2;::::0;:22:::2;::::0;:43:::2;::::0;54332:13;;54347:4;;54309:43:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54368:66;54386:5;:14;;;54401:5;:17;;;54419:5;:14;;;54368:66;;;;;;;;:::i;72251:1233::-:0;72508:15;;:34;;-1:-1:-1;;;72508:34:0;;-1:-1:-1;;;;;201:32:1;;;72508:34:0;;;183:51:1;72359:29:0;;;;;;;;72491:14;;72508:15;;;:25;;156:18:1;;72508:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;72491:51;;72576:10;72561:11;:25;;72553:105;;;;-1:-1:-1;;;72553:105:0;;28641:2:1;72553:105:0;;;28623:21:1;28680:2;28660:18;;;28653:30;28719:34;28699:18;;;28692:62;28790:34;28770:18;;;28763:62;-1:-1:-1;;;28841:19:1;;;28834:34;28885:19;;72553:105:0;28439:471:1;72553:105:0;72690:9;72677:10;:22;72669:78;;;;-1:-1:-1;;;72669:78:0;;29117:2:1;72669:78:0;;;29099:21:1;29156:2;29136:18;;;29129:30;29195:34;29175:18;;;29168:62;-1:-1:-1;;;29246:18:1;;;29239:41;29297:19;;72669:78:0;28915:407:1;72669:78:0;72760:16;72779:24;72792:11;72779:10;:24;:::i;:::-;:28;;72806:1;72779:28;:::i;:::-;72760:47;;72849:11;72834:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;72834:27:0;;;;;;;;;;;;;;;;;72820:41;;72896:11;72883:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;72872:36;;72955:11;72942:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;72919:48;;73002:11;72989:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;72989:25:0;;;;;;;;;;;;;;;;-1:-1:-1;72978:36:0;-1:-1:-1;73032:6:0;73027:450;73048:11;73044:1;:15;73027:450;;;73081:17;73101:15;73115:1;73101:11;:15;:::i;:::-;73148;;:53;;-1:-1:-1;;;73148:53:0;;73081:35;;-1:-1:-1;;;;;;73148:15:0;;:30;;:53;;73179:7;;73081:35;;73148:53;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;73131:11;73143:1;73131:14;;;;;;;;:::i;:::-;;;;;;;;;;:70;73230:15;;:50;;-1:-1:-1;;;73230:50:0;;-1:-1:-1;;;;;73230:15:0;;;;:27;;:50;;73258:7;;73267:12;;73230:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;73216:8;73225:1;73216:11;;;;;;;;:::i;:::-;;;;;;;;;;:64;73322:15;;:62;;-1:-1:-1;;;73322:62:0;;-1:-1:-1;;;;;73322:15:0;;;;:39;;:62;;73362:7;;73371:12;;73322:62;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;73296:20;73317:1;73296:23;;;;;;;;:::i;:::-;;;;;;;;;;:88;73414:15;;:50;;-1:-1:-1;;;73414:50:0;;-1:-1:-1;;;;;73414:15:0;;;;:27;;:50;;73442:7;;73451:12;;73414:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;73400:8;73409:1;73400:11;;;;;;;;:::i;:::-;;;;;;;;;;:64;-1:-1:-1;73061:3:0;;73027:450;;;;72480:1004;;72251:1233;;;;;;;:::o;33012:116::-;2026:13;:11;:13::i;:::-;33089:19:::1;:31:::0;33012:116::o;32768:114::-;2026:13;:11;:13::i;:::-;32844:19:::1;:30:::0;32768:114::o;3046:201::-;2026:13;:11;:13::i;:::-;-1:-1:-1;;;;;3135:22:0;::::1;3127:73;;;::::0;-1:-1:-1;;;3127:73:0;;29529:2:1;3127:73:0::1;::::0;::::1;29511:21:1::0;29568:2;29548:18;;;29541:30;29607:34;29587:18;;;29580:62;-1:-1:-1;;;29658:18:1;;;29651:36;29704:19;;3127:73:0::1;29327:402:1::0;3127:73:0::1;3211:28;3230:8;3211:18;:28::i;37898:4425::-:0;9192:21;:19;:21::i;:::-;38588::::1;38612:25;:23;:25::i;:::-;38662:15;::::0;:40:::1;::::0;-1:-1:-1;;;38662:40:0;;-1:-1:-1;;;;;201:32:1;;;38662:40:0::1;::::0;::::1;183:51:1::0;38588:49:0;;-1:-1:-1;38648:11:0::1;::::0;38662:15;;::::1;::::0;:25:::1;::::0;156:18:1;;38662:40:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38756:15;::::0;:64:::1;::::0;-1:-1:-1;;;38756:64:0;;38648:54;;-1:-1:-1;38736:17:0::1;::::0;-1:-1:-1;;;;;38756:15:0;;::::1;::::0;:37:::1;::::0;:64:::1;::::0;38794:13;;38808:11;;38756:64:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38979:15;::::0;:51:::1;::::0;-1:-1:-1;;;38979:51:0;;38736:84;;-1:-1:-1;38847:15:0::1;::::0;38831:13:::1;::::0;-1:-1:-1;;;;;38979:15:0::1;::::0;:30:::1;::::0;:51:::1;::::0;39010:13;;39025:4;;38979:51:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38950:80;;39041:33;39060:13;39041:18;:33::i;:::-;39104:6;39114:1;39104:11:::0;39100:168:::1;;39157:15;::::0;:48:::1;::::0;-1:-1:-1;;;39157:48:0;;39141:1:::1;::::0;-1:-1:-1;;;;;;39157:15:0;;::::1;::::0;:25:::1;::::0;:48:::1;::::0;39183:13;;39141:1;;39157:48:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39100:168;39293:6;39286:4;:13;39278:52;;;::::0;-1:-1:-1;;;39278:52:0;;29936:2:1;39278:52:0::1;::::0;::::1;29918:21:1::0;29975:2;29955:18;;;29948:30;30014:28;29994:18;;;29987:56;30060:18;;39278:52:0::1;29734:350:1::0;39278:52:0::1;39349:13:::0;;:18;39341:55:::1;;;::::0;-1:-1:-1;;;39341:55:0;;30291:2:1;39341:55:0::1;::::0;::::1;30273:21:1::0;30330:2;30310:18;;;30303:30;30369:26;30349:18;;;30342:54;30413:18;;39341:55:0::1;30089:348:1::0;39341:55:0::1;39624:1;39609:12;:16;39601:49;;;;-1:-1:-1::0;;;39601:49:0::1;;;;;;;:::i;:::-;39846:14;39862:23;39887:16;39907:20;:18;:20::i;:::-;39845:82;;;;;;39988:18;40010:1;39988:23:::0;39984:682:::1;;40158:15;::::0;:43:::1;::::0;-1:-1:-1;;;40158:43:0;;-1:-1:-1;;;;;40158:15:0;;::::1;::::0;:25:::1;::::0;:43:::1;::::0;40184:13;;40158:15;;:43:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;40216:15:0::1;::::0;:61:::1;::::0;-1:-1:-1;;;40216:61:0;;-1:-1:-1;;;;;40216:15:0;;::::1;::::0;-1:-1:-1;40216:29:0::1;::::0;-1:-1:-1;40216:61:0::1;::::0;40246:13;;40261:15:::1;::::0;40216:61:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39984:682;;;40414:11;40401:9;:24;40393:73;;;::::0;-1:-1:-1;;;40393:73:0;;30931:2:1;40393:73:0::1;::::0;::::1;30913:21:1::0;30970:2;30950:18;;;30943:30;31009:34;30989:18;;;30982:62;-1:-1:-1;;;31060:18:1;;;31053:34;31104:19;;40393:73:0::1;30729:400:1::0;40393:73:0::1;40601:15;::::0;-1:-1:-1;;;;;40601:15:0::1;:25;40627:13:::0;40642:11:::1;:9:::0;40601:15;40642:11:::1;:::i;:::-;40601:53;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39984:682;40863:126;::::0;;::::1;::::0;::::1;::::0;;40876:4:::1;40863:126:::0;;40890:3:::1;40863:126;::::0;::::1;::::0;;;40904:2:::1;40863:126:::0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40863:126:0;;;;;;;;;;41013:93;;;;::::1;::::0;;;;41027:11:::1;::::0;-1:-1:-1;;;41027:41:0;;;;;;2039:25:1;;;40863:126:0;;41013:93;;-1:-1:-1;;;;;41027:11:0::1;:28;2012:18:1::0;;;41027:41:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41013:93:::0;;::::1;;41078:15;:11:::0;41092:1:::1;41078:15;:::i;:::-;41013:93;;;;41103:1;41013:93;;::::0;41000:106:::1;;41117:22;41143:100;;;;;;;;41157:1;41143:100;;;;41180:19;;41169:8;:30;;;;:::i;:::-;41143:100;;;;41220:21;;41209:8;:32;;;;:::i;:::-;41143:100;;::::0;41117:126:::1;;41254:15;;;;;;;;;-1:-1:-1::0;;;;;41254:15:0::1;-1:-1:-1::0;;;;;41254:27:0::1;;41282:13;41297:4;41303:8;41254:58;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41323:15;;;;;;;;;-1:-1:-1::0;;;;;41323:15:0::1;-1:-1:-1::0;;;;;41323:30:0::1;;41354:13;41368:4;41375:10;41323:63;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41397:15;;;;;;;;;-1:-1:-1::0;;;;;41397:15:0::1;-1:-1:-1::0;;;;;41397:27:0::1;;41425:13;41440:4;41446:8;41397:58;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41619:15;;;;;;;;;-1:-1:-1::0;;;;;41619:15:0::1;-1:-1:-1::0;;;;;41619:39:0::1;;41659:13;41674:4;41680:11;;;;;;;;;-1:-1:-1::0;;;;;41680:11:0::1;-1:-1:-1::0;;;;;41680:23:0::1;;41704:10;:13;;;41680:38;;;;;;;;;;;;;2039:25:1::0;;2027:2;2012:18;;1893:177;41680:38:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41619:100;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;41866:15:0::1;::::0;:40:::1;::::0;-1:-1:-1;;;41866:40:0;;-1:-1:-1;;;;;201:32:1;;;41866:40:0::1;::::0;::::1;183:51:1::0;41851:12:0::1;::::0;-1:-1:-1;41866:15:0;;::::1;::::0;-1:-1:-1;41866:25:0::1;::::0;156:18:1;;41866:40:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41996:13:::0;;41851:55;;-1:-1:-1;41996:19:0::1;::::0;42010:5:::1;::::0;41996:19:::1;:::i;:::-;42063:15;::::0;:48:::1;::::0;-1:-1:-1;;;42063:48:0;;41990:1:::1;:26:::0;;::::1;41978:39:::0;;;::::1;::::0;-1:-1:-1;;;;;42063:15:0::1;::::0;:25:::1;::::0;:48:::1;::::0;42089:13;;41978:39;;42063:48:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42199:1;42187:9;:13;42183:70;;;42217:24;:22;:24::i;:::-;42268:47;42286:8;42295:10;42306:8;42268:47;;;;;;;;:::i;:::-;;;;;;;;37972:4351;;;;;;;;;;;9236:20:::0;8630:1;9756:22;;9573:213;33470:116;2026:13;:11;:13::i;:::-;33547:20:::1;:31:::0;33470:116::o;2305:132::-;2186:7;2213:6;-1:-1:-1;;;;;2213:6:0;765:10;2369:23;2361:68;;;;-1:-1:-1;;;2361:68:0;;31336:2:1;2361:68:0;;;31318:21:1;;;31355:18;;;31348:30;31414:34;31394:18;;;31387:62;31466:18;;2361:68:0;31134:356:1;9272:293:0;8674:1;9406:7;;:19;9398:63;;;;-1:-1:-1;;;9398:63:0;;31697:2:1;9398:63:0;;;31679:21:1;31736:2;31716:18;;;31709:30;31775:33;31755:18;;;31748:61;31826:18;;9398:63:0;31495:355:1;9398:63:0;8674:1;9539:7;:18;9272:293::o;37133:431::-;37445:19;;-1:-1:-1;;;;;37419:22:0;;;;;;:14;:22;;;;;;37401:40;;:15;:40;:::i;:::-;:63;;37393:112;;;;-1:-1:-1;;;37393:112:0;;32057:2:1;37393:112:0;;;32039:21:1;32096:2;32076:18;;;32069:30;32135:34;32115:18;;;32108:62;-1:-1:-1;;;32186:18:1;;;32179:35;32231:19;;37393:112:0;31855:401:1;37393:112:0;-1:-1:-1;;;;;37516:22:0;;;;;:14;:22;;;;;37541:15;37516:40;;37133:431::o;43350:1702::-;43478:25;;:::i;:::-;43586:8;43572:22;;43616:10;43630:1;43616:15;43605:1440;;43674:11;;43657:14;;:28;43653:193;;;43770:11;;43753:14;;43789:4;;43783;;43753:28;;43770:11;43753:28;:::i;:::-;43752:35;;;;:::i;:::-;43751:42;;;;:::i;:::-;43737:11;;:56;;;;:::i;:::-;43720:73;;43605:1440;;43653:193;43830:14;;43816:28;;43605:1440;;;43867:10;43881:1;43867:15;43863:1182;;43931:8;:15;;;43910:11;:18;;;:36;43906:225;;;44066:4;44060;44043:8;:15;;;44022:11;:18;;;:36;;;;:::i;:::-;44021:43;;;;:::i;:::-;44020:50;;;;:::i;:::-;44002:8;:15;;;:68;;;;:::i;:::-;43981:18;;;:89;43863:1182;;43906:225;44111:18;;;;;44093:15;;;:36;43863:1182;;;44152:10;44166:1;44152:15;44148:897;;44217:8;:16;;;44195:11;:19;;;:38;44191:233;;;44357:4;44351;44333:8;:16;;;44311:11;:19;;;:38;;;;:::i;:::-;44310:45;;;;:::i;:::-;44309:52;;;;:::i;:::-;44290:8;:16;;;:71;;;;:::i;:::-;44268:19;;;:93;44148:897;;44191:233;44403:19;;;;;44384:16;;;:38;44148:897;;;44445:10;44459:1;44445:15;44441:604;;44508:8;:14;;;44488:11;:17;;;:34;44484:217;;;44638:4;44632;44616:8;:14;;;44596:11;:17;;;:34;;;;:::i;:::-;44595:41;;;;:::i;:::-;44594:48;;;;:::i;:::-;44577:8;:14;;;:65;;;;:::i;:::-;44557:17;;;:85;44441:604;;44484:217;44682:17;;;;;44665:14;;;:34;44441:604;;;44722:10;44736:1;44722:15;44718:327;;44792:8;:21;;;44765:11;:24;;;:48;44761:273;;;44957:4;44951;44928:8;:21;;;44901:11;:24;;;:48;;;;:::i;:::-;44900:55;;;;:::i;:::-;44899:62;;;;:::i;:::-;44875:8;:21;;;:86;;;;:::i;:::-;44848:24;;;:113;44761:273;;;45008:24;;;;;44984:21;;;:48;44761:273;43350:1702;;;;;;:::o;69119:677::-;69270:20;;69193:4;;69245:9;;69270:25;;:54;;;69322:2;69299:13;:20;:25;69270:54;69266:99;;;-1:-1:-1;69348:5:0;;69119:677;-1:-1:-1;;69119:677:0:o;69266:99::-;69380:6;69375:392;69396:13;:20;69392:1;:24;69375:392;;;69438:11;69452:13;69466:1;69452:16;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;69452:16:0;;-1:-1:-1;;;;69507:11:0;;;;;:26;;-1:-1:-1;;;;;;;;;;69522:11:0;;;;69507:26;69505:29;:71;;;;-1:-1:-1;;;;;;;;;;69564:11:0;;;69562:14;69505:71;:121;;;;-1:-1:-1;;;;;;;;;;69599:11:0;;;;;;:26;;-1:-1:-1;;;;;;;;;;69614:11:0;;;;69599:26;69597:29;69505:121;:178;;;;-1:-1:-1;;;;;;;;;;69656:11:0;;;;;;:26;;-1:-1:-1;;;;;;;;;;69671:11:0;;;;69656:26;69654:29;69505:178;69483:273;;;-1:-1:-1;69735:5:0;;69119:677;-1:-1:-1;;;;69119:677:0:o;69483:273::-;-1:-1:-1;69418:3:0;;69375:392;;;-1:-1:-1;69784:4:0;;69119:677;-1:-1:-1;;;69119:677:0:o;34606:246::-;34668:8;;-1:-1:-1;;;;;34668:8:0;34660:59;;;;-1:-1:-1;;;34660:59:0;;32463:2:1;34660:59:0;;;32445:21:1;32502:2;32482:18;;;32475:30;32541:26;32521:18;;;32514:54;32585:18;;34660:59:0;32261:348:1;34660:59:0;34746:8;;:35;;34731:9;;-1:-1:-1;;;;;34746:8:0;;34767:9;;34731;34746:35;34731:9;34746:35;34767:9;34746:8;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34730:51;;;34800:4;34792:52;;;;-1:-1:-1;;;34792:52:0;;33026:2:1;34792:52:0;;;33008:21:1;33065:2;33045:18;;;33038:30;33104:34;33084:18;;;33077:62;-1:-1:-1;;;33155:18:1;;;33148:33;33198:19;;34792:52:0;32824:399:1;3407:191:0;3481:16;3500:6;;-1:-1:-1;;;;;3517:17:0;;;-1:-1:-1;;;;;;3517:17:0;;;;;;3550:40;;3500:6;;;;;;;3550:40;;3481:16;3550:40;3470:128;3407:191;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;245:131:1:-;-1:-1:-1;;;;;320:31:1;;310:42;;300:70;;366:1;363;356:12;381:247;440:6;493:2;481:9;472:7;468:23;464:32;461:52;;;509:1;506;499:12;461:52;548:9;535:23;567:31;592:5;567:31;:::i;:::-;617:5;381:247;-1:-1:-1;;;381:247:1:o;633:466::-;710:6;718;726;779:2;767:9;758:7;754:23;750:32;747:52;;;795:1;792;785:12;747:52;-1:-1:-1;;840:23:1;;;960:2;945:18;;932:32;;-1:-1:-1;1063:2:1;1048:18;;;1035:32;;633:466;-1:-1:-1;633:466:1:o;1104:226::-;1163:6;1216:2;1204:9;1195:7;1191:23;1187:32;1184:52;;;1232:1;1229;1222:12;1184:52;-1:-1:-1;1277:23:1;;1104:226;-1:-1:-1;1104:226:1:o;1335:303::-;1428:5;1451:1;1461:171;1475:4;1472:1;1469:11;1461:171;;;1534:13;;1522:26;;1577:4;1568:14;;;;1605:17;;;;1495:1;1488:9;1461:171;;;1465:3;;1335:303;;:::o;1643:245::-;1825:4;1810:20;;1839:43;1814:9;1864:6;1839:43;:::i;:::-;1643:245;;;;:::o;2075:127::-;2136:10;2131:3;2127:20;2124:1;2117:31;2167:4;2164:1;2157:15;2191:4;2188:1;2181:15;2207:252;2279:2;2273:9;2321:3;2309:16;;2355:18;2340:34;;2376:22;;;2337:62;2334:88;;;2402:18;;:::i;:::-;2438:2;2431:22;2207:252;:::o;2464:275::-;2535:2;2529:9;2600:2;2581:13;;-1:-1:-1;;2577:27:1;2565:40;;2635:18;2620:34;;2656:22;;;2617:62;2614:88;;;2682:18;;:::i;:::-;2718:2;2711:22;2464:275;;-1:-1:-1;2464:275:1:o;2744:187::-;2793:4;2826:18;2818:6;2815:30;2812:56;;;2848:18;;:::i;:::-;-1:-1:-1;2914:2:1;2893:15;-1:-1:-1;;2889:29:1;2920:4;2885:40;;2744:187::o;2936:697::-;3005:6;3058:2;3046:9;3037:7;3033:23;3029:32;3026:52;;;3074:1;3071;3064:12;3026:52;3114:9;3101:23;3147:18;3139:6;3136:30;3133:50;;;3179:1;3176;3169:12;3133:50;3202:22;;3255:4;3247:13;;3243:27;-1:-1:-1;3233:55:1;;3284:1;3281;3274:12;3233:55;3324:2;3311:16;3349:53;3365:36;3394:6;3365:36;:::i;:::-;3349:53;:::i;:::-;3425:6;3418:5;3411:21;3473:7;3468:2;3459:6;3455:2;3451:15;3447:24;3444:37;3441:57;;;3494:1;3491;3484:12;3441:57;3549:6;3544:2;3540;3536:11;3531:2;3524:5;3520:14;3507:49;3601:1;3576:18;;;3596:2;3572:27;3565:38;;;;3580:5;2936:697;-1:-1:-1;;;;2936:697:1:o;3638:367::-;3731:6;3739;3792:3;3780:9;3771:7;3767:23;3763:33;3760:53;;;3809:1;3806;3799:12;3760:53;3854:23;;;-1:-1:-1;3931:3:1;3916:19;;3913:32;-1:-1:-1;3910:52:1;;;3958:1;3955;3948:12;3910:52;-1:-1:-1;3638:367:1;3996:2;3981:18;;;;;-1:-1:-1;3638:367:1:o;4245:487::-;4322:6;4330;4338;4391:2;4379:9;4370:7;4366:23;4362:32;4359:52;;;4407:1;4404;4397:12;4359:52;4446:9;4433:23;4465:31;4490:5;4465:31;:::i;:::-;4515:5;4593:2;4578:18;;4565:32;;-1:-1:-1;4696:2:1;4681:18;;;4668:32;;4245:487;-1:-1:-1;;;4245:487:1:o;4945:444::-;5004:3;5042:5;5036:12;5069:6;5064:3;5057:19;5101:4;5096:3;5092:14;5085:21;;5140:4;5133:5;5129:16;5163:1;5173:191;5187:6;5184:1;5181:13;5173:191;;;5236:44;5276:3;5267:6;5261:13;4809:12;;4797:25;;4871:4;4860:16;;;4854:23;4838:14;;;4831:47;4927:4;4916:16;;;4910:23;4894:14;;4887:47;4737:203;5236:44;5309:4;5300:14;;;;;5349:4;5337:17;;;;;5209:1;5202:9;5173:191;;;-1:-1:-1;5380:3:1;;4945:444;-1:-1:-1;;;;4945:444:1:o;5394:313::-;5619:2;5608:9;5601:21;5582:4;5639:62;5697:2;5686:9;5682:18;5674:6;5639:62;:::i;6244:289::-;6286:3;6324:5;6318:12;6351:6;6346:3;6339:19;6407:6;6400:4;6393:5;6389:16;6382:4;6377:3;6373:14;6367:47;6459:1;6452:4;6443:6;6438:3;6434:16;6430:27;6423:38;6522:4;6515:2;6511:7;6506:2;6498:6;6494:15;6490:29;6485:3;6481:39;6477:50;6470:57;;;6244:289;;;;:::o;6538:220::-;6687:2;6676:9;6669:21;6650:4;6707:45;6748:2;6737:9;6733:18;6725:6;6707:45;:::i;7700:481::-;7776:5;7770:12;7765:3;7758:25;7832:4;7825:5;7821:16;7815:23;7808:4;7803:3;7799:14;7792:47;7888:4;7881:5;7877:16;7871:23;7864:4;7859:3;7855:14;7848:47;7944:4;7937:5;7933:16;7927:23;7920:4;7915:3;7911:14;7904:47;8000:4;7993:5;7989:16;7983:23;7976:4;7971:3;7967:14;7960:47;8056:4;8049:5;8045:16;8039:23;8032:4;8027:3;8023:14;8016:47;8112:4;8105:5;8101:16;8095:23;8088:4;8083:3;8079:14;8072:47;8168:4;8161:5;8157:16;8151:23;8144:4;8139:3;8135:14;8128:47;;;7700:481::o;8186:442::-;8243:3;8281:5;8275:12;8308:6;8303:3;8296:19;8340:4;8335:3;8331:14;8324:21;;8379:4;8372:5;8368:16;8402:1;8412:191;8426:6;8423:1;8420:13;8412:191;;;8475:42;8513:3;8504:6;8498:13;8475:42;:::i;:::-;8546:6;8537:16;;;;;8588:4;8576:17;;;;;8448:1;8441:9;8412:191;;8633:1397;9218:3;9207:9;9200:22;9181:4;9245:63;9303:3;9292:9;9288:19;9280:6;9245:63;:::i;:::-;9356:9;9348:6;9344:22;9339:2;9328:9;9324:18;9317:50;9390:48;9431:6;9423;9390:48;:::i;:::-;9376:62;;9486:9;9478:6;9474:22;9469:2;9458:9;9454:18;9447:50;9520:48;9561:6;9553;9520:48;:::i;:::-;9604:22;;;9599:2;9584:18;;9577:50;9676:13;;9698:22;;;9748:2;9774:15;;;;-1:-1:-1;9736:15:1;;;;9807:1;9817:187;9831:6;9828:1;9825:13;9817:187;;;9880:44;9920:3;9911:6;9905:13;4809:12;;4797:25;;4871:4;4860:16;;;4854:23;4838:14;;;4831:47;4927:4;4916:16;;;4910:23;4894:14;;4887:47;4737:203;9880:44;9991:2;9979:15;;;;;9953:2;9944:12;;;;;9853:1;9846:9;9817:187;;;-1:-1:-1;10021:3:1;;8633:1397;-1:-1:-1;;;;;;;;8633:1397:1:o;10035:346::-;10103:6;10111;10164:2;10152:9;10143:7;10139:23;10135:32;10132:52;;;10180:1;10177;10170:12;10132:52;-1:-1:-1;;10225:23:1;;;10345:2;10330:18;;;10317:32;;-1:-1:-1;10035:346:1:o;11086:230::-;11156:6;11209:2;11197:9;11188:7;11184:23;11180:32;11177:52;;;11225:1;11222;11215:12;11177:52;-1:-1:-1;11270:16:1;;11086:230;-1:-1:-1;11086:230:1:o;11321:274::-;-1:-1:-1;;;;;11513:32:1;;;;11495:51;;11577:2;11562:18;;11555:34;11483:2;11468:18;;11321:274::o;11600:344::-;11802:2;11784:21;;;11841:2;11821:18;;;11814:30;-1:-1:-1;;;11875:2:1;11860:18;;11853:50;11935:2;11920:18;;11600:344::o;12294:703::-;12358:5;12406:4;12394:9;12389:3;12385:19;12381:30;12378:50;;;12424:1;12421;12414:12;12378:50;12477:2;12471:9;12519:4;12507:17;;12554:18;12539:34;;12575:22;;;12536:62;12533:88;;;12601:18;;:::i;:::-;12637:2;12630:22;;;12721:16;;12746:23;;12835:2;12820:18;;;12814:25;12855:15;;;12848:32;12931:18;;;12925:25;12966:15;;;12959:32;;;;-1:-1:-1;12670:6:1;12294:703;-1:-1:-1;12294:703:1:o;13002:246::-;13095:6;13148:2;13136:9;13127:7;13123:23;13119:32;13116:52;;;13164:1;13161;13154:12;13116:52;13187:55;13234:7;13223:9;13187:55;:::i;13253:1146::-;13344:6;13404:3;13392:9;13383:7;13379:23;13375:33;13420:2;13417:22;;;13435:1;13432;13425:12;13417:22;-1:-1:-1;13477:22:1;;:::i;:::-;13544:16;;13569:22;;13657:2;13642:18;;;13636:25;13677:14;;;13670:31;13767:2;13752:18;;;13746:25;13787:14;;;13780:31;13877:2;13862:18;;;13856:25;13897:14;;;13890:31;13987:3;13972:19;;;13966:26;14008:15;;;14001:32;14099:3;14084:19;;;14078:26;14120:15;;;14113:32;14211:3;14196:19;;;14190:26;14232:15;;;14225:32;14323:3;14308:19;;;14302:26;14344:15;;;14337:32;;;;-1:-1:-1;13576:5:1;13253:1146;-1:-1:-1;13253:1146:1:o;14992:127::-;15053:10;15048:3;15044:20;15041:1;15034:31;15084:4;15081:1;15074:15;15108:4;15105:1;15098:15;15124:128;15191:9;;;15212:11;;;15209:37;;;15226:18;;:::i;15605:125::-;15670:9;;;15691:10;;;15688:36;;;15704:18;;:::i;15735:772::-;15829:6;15882:4;15870:9;15861:7;15857:23;15853:34;15850:54;;;15900:1;15897;15890:12;15850:54;15926:1;15972:7;15965:4;15954:9;15950:20;15946:34;15936:62;;15994:1;15991;15984:12;15936:62;-1:-1:-1;16022:1:1;;16081:4;16105:21;16081:4;16105:21;:::i;:::-;16094:32;-1:-1:-1;16094:32:1;;-1:-1:-1;16176:20:1;;16208:19;;;16205:39;;;16240:1;16237;16230:12;16205:39;16264:9;16282:193;16298:6;16293:3;16290:15;16282:193;;;16390:10;;16413:18;;16460:4;16451:14;;;;16315;16282:193;;;-1:-1:-1;16494:7:1;;15735:772;-1:-1:-1;;;;;15735:772:1:o;16876:917::-;4809:12;;4797:25;;4871:4;4860:16;;;4854:23;4838:14;;;4831:47;4927:4;4916:16;;;4910:23;4894:14;;;4887:47;17212:4;17197:20;;17278:50;17324:2;17313:9;17309:18;17301:6;17278:50;:::i;:::-;17371:6;17365:13;17359:3;17348:9;17344:19;17337:42;17426:4;17418:6;17414:17;17408:24;17467:3;17456:9;17452:19;17543:1;17553:171;17567:4;17564:1;17561:11;17553:171;;;17626:13;;17614:26;;17669:4;17697:17;;;;17660:14;;;;17587:1;17580:9;17553:171;;;17557:3;;;17780:4;17772:6;17768:17;17762:24;17755:4;17744:9;17740:20;17733:54;16876:917;;;;;;:::o;17798:354::-;17900:6;17908;17961:3;17949:9;17940:7;17936:23;17932:33;17929:53;;;17978:1;17975;17968:12;17929:53;18001:55;18048:7;18037:9;18001:55;:::i;:::-;18118:2;18103:18;;;;18097:25;17991:65;;18097:25;;-1:-1:-1;;;17798:354:1:o;18157:410::-;-1:-1:-1;;;;;18424:32:1;;18406:51;;18488:2;18473:18;;18466:34;;;18393:3;18378:19;;18509:52;18557:2;18542:18;;18534:6;4809:12;;4797:25;;4871:4;4860:16;;;4854:23;4838:14;;;4831:47;4927:4;4916:16;;;4910:23;4894:14;;4887:47;4737:203;18983:404;-1:-1:-1;;;;;19246:32:1;;19228:51;;19310:2;19295:18;;19288:34;;;19215:3;19200:19;;19331:50;19377:2;19362:18;;19354:6;19331:50;:::i;19392:127::-;19453:10;19448:3;19444:20;19441:1;19434:31;19484:4;19481:1;19474:15;19508:4;19505:1;19498:15;19524:112;19556:1;19582;19572:35;;19587:18;;:::i;:::-;-1:-1:-1;19621:9:1;;19524:112::o;19641:504::-;19961:3;19946:19;;19974:41;19950:9;19997:6;19974:41;:::i;:::-;4809:12;;20072:3;20057:19;;4797:25;4871:4;4860:16;;4854:23;4838:14;;;4831:47;4927:4;4916:16;;4910:23;4894:14;;;4887:47;4809:12;;20134:3;20119:19;;4797:25;4871:4;4860:16;;4854:23;4838:14;;;4831:47;4927:4;4916:16;;4910:23;4894:14;;;4887:47;20086:53;4737:203;20150:772;20244:6;20297:4;20285:9;20276:7;20272:23;20268:34;20265:54;;;20315:1;20312;20305:12;20265:54;20341:1;20387:7;20380:4;20369:9;20365:20;20361:34;20351:62;;20409:1;20406;20399:12;20351:62;-1:-1:-1;20437:1:1;;20496:4;20520:21;20496:4;20520:21;:::i;20927:354::-;21129:2;21111:21;;;21168:2;21148:18;;;21141:30;21207:32;21202:2;21187:18;;21180:60;21272:2;21257:18;;20927:354::o;21631:687::-;21711:6;21764:2;21752:9;21743:7;21739:23;21735:32;21732:52;;;21780:1;21777;21770:12;21732:52;21813:9;21807:16;21846:18;21838:6;21835:30;21832:50;;;21878:1;21875;21868:12;21832:50;21901:22;;21954:4;21946:13;;21942:27;-1:-1:-1;21932:55:1;;21983:1;21980;21973:12;21932:55;22016:2;22010:9;22041:53;22057:36;22086:6;22057:36;:::i;22041:53::-;22117:6;22110:5;22103:21;22165:7;22160:2;22151:6;22147:2;22143:15;22139:24;22136:37;22133:57;;;22186:1;22183;22176:12;22133:57;22234:6;22229:2;22225;22221:11;22216:2;22209:5;22205:14;22199:42;22286:1;22261:18;;;22281:2;22257:27;22250:38;;;;22265:5;21631:687;-1:-1:-1;;;;21631:687:1:o;23080:291::-;23257:6;23246:9;23239:25;23300:2;23295;23284:9;23280:18;23273:30;23220:4;23320:45;23361:2;23350:9;23346:18;23338:6;23320:45;:::i;23376:291::-;23553:2;23542:9;23535:21;23516:4;23573:45;23614:2;23603:9;23599:18;23591:6;23573:45;:::i;:::-;23565:53;;23654:6;23649:2;23638:9;23634:18;23627:34;23376:291;;;;;:::o;24435:127::-;24496:10;24491:3;24487:20;24484:1;24477:31;24527:4;24524:1;24517:15;24551:4;24548:1;24541:15;24927:168;25000:9;;;25031;;25048:15;;;25042:22;;25028:37;25018:71;;25069:18;;:::i;25100:342::-;-1:-1:-1;;;;;25342:32:1;;25324:51;;25310:4;25295:20;;25384:52;25432:2;25417:18;;25409:6;25384:52;:::i;26973:383::-;27170:2;27159:9;27152:21;27133:4;27196:45;27237:2;27226:9;27222:18;27214:6;27196:45;:::i;:::-;27289:9;27281:6;27277:22;27272:2;27261:9;27257:18;27250:50;27317:33;27343:6;27335;27317:33;:::i;:::-;27309:41;26973:383;-1:-1:-1;;;;;26973:383:1:o;27714:251::-;27784:6;27837:2;27825:9;27816:7;27812:23;27808:32;27805:52;;;27853:1;27850;27843:12;27805:52;27885:9;27879:16;27904:31;27929:5;27904:31;:::i;28314:120::-;28354:1;28380;28370:35;;28385:18;;:::i;:::-;-1:-1:-1;28419:9:1;;28314:120::o
Swarm Source
ipfs://8128bd30507afdcb6d0cf48703936a76bf573ae9340eb3674259f63272316a3c
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.