More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,309 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Reveal | 16170976 | 793 days ago | IN | 0 ETH | 0.00559802 | ||||
Harvest | 15660355 | 864 days ago | IN | 0 ETH | 0.00115978 | ||||
Harvest | 15660355 | 864 days ago | IN | 0 ETH | 0.00114662 | ||||
Reveal | 15248220 | 928 days ago | IN | 0 ETH | 0.00081917 | ||||
Stake One Tool | 14801128 | 1001 days ago | IN | 0 ETH | 0.00117765 | ||||
Stake One Tool | 14801128 | 1001 days ago | IN | 0 ETH | 0.00117765 | ||||
Unstake One Tool | 14801119 | 1001 days ago | IN | 0 ETH | 0.00107322 | ||||
Unstake One Tool | 14801117 | 1001 days ago | IN | 0 ETH | 0.00098775 | ||||
Stake One Tool | 14786319 | 1003 days ago | IN | 0 ETH | 0.00105392 | ||||
Stake One Tool | 14786316 | 1003 days ago | IN | 0 ETH | 0.00108239 | ||||
Harvest | 14782359 | 1004 days ago | IN | 0 ETH | 0.00515935 | ||||
Farm Deploy | 14728191 | 1012 days ago | IN | 0 ETH | 0.01331935 | ||||
Reveal | 14099133 | 1110 days ago | IN | 0 ETH | 0.02511307 | ||||
Farm Deploy | 14067107 | 1115 days ago | IN | 0 ETH | 0.04207458 | ||||
Stake One Tool | 14067023 | 1115 days ago | IN | 0 ETH | 0.00573338 | ||||
Stake One Tool | 14067019 | 1115 days ago | IN | 0 ETH | 0.00544002 | ||||
Harvest | 13993963 | 1127 days ago | IN | 0 ETH | 0.04251779 | ||||
Harvest | 13993952 | 1127 days ago | IN | 0 ETH | 0.04543408 | ||||
Farm Deploy | 13922997 | 1138 days ago | IN | 0 ETH | 0.03413522 | ||||
Farm Deploy | 13922975 | 1138 days ago | IN | 0 ETH | 0.03462802 | ||||
Harvest | 13922921 | 1138 days ago | IN | 0 ETH | 0.02323248 | ||||
Harvest | 13922920 | 1138 days ago | IN | 0 ETH | 0.03710917 | ||||
Harvest | 13922890 | 1138 days ago | IN | 0 ETH | 0.03862004 | ||||
Harvest | 13922866 | 1138 days ago | IN | 0 ETH | 0.04125704 | ||||
Farm Deploy | 13854580 | 1148 days ago | IN | 0 ETH | 0.01617696 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
DegenFarm
Compiler Version
v0.7.4+commit.3f05b770
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT // Degen'$ Farm: Collectible NFT game (https://degens.farm) pragma solidity ^0.7.4; pragma experimental ABIEncoderV2; import "./DegensFarmBase.sol"; contract DegenFarm is DegenFarmBase { uint8 constant public CREATURE_TYPE_COUNT= 20; // how much creatures types may be used uint256 constant public FARMING_DURATION = 168 hours; uint256 constant public TOOL_UNSTAKE_DELAY = 1 weeks; uint16 constant public NORMIE_COUNT_IN_TYPE = 100; uint16 constant public CHAD_COUNT_IN_TYPE = 20; uint16 constant public MAX_LANDS = 2500; constructor ( address _land, address _creatures, address _inventory, address _bagstoken, address _dungtoken, IEggs _eggs ) DegenFarmBase(_land, _creatures, _inventory, _bagstoken, _dungtoken, _eggs) { require(CREATURE_TYPE_COUNT <= CREATURE_TYPE_COUNT_MAX, "CREATURE_TYPE_COUNT is greater than CREATURE_TYPE_COUNT_MAX"); // Mainnet amulet addresses amulets[0] = 0xD533a949740bb3306d119CC777fa900bA034cd52; // Cow $CRV amulets[1] = 0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984; // Horse $UNI amulets[2] = 0xfA5047c9c78B8877af97BDcb85Db743fD7313d4a; // Rabbit $ROOK amulets[3] = 0xDADA00A9C23390112D08a1377cc59f7d03D9df55; // Chicken $DUNG amulets[4] = 0x6B3595068778DD592e39A122f4f5a5cF09C90fE2; // Pig $SUSHI amulets[5] = 0x0D8775F648430679A709E98d2b0Cb6250d2887EF; // Cat $BAT amulets[6] = 0x3472A5A71965499acd81997a54BBA8D852C6E53d; // Dog $BADGER amulets[7] = 0x0d438F3b5175Bebc262bF23753C1E53d03432bDE; // Goose $WNXM amulets[8] = 0x3155BA85D5F96b2d030a4966AF206230e46849cb; // Goat $RUNE amulets[9] = 0x7Fc66500c84A76Ad7e9c93437bFc5Ac33E2DDaE9; // Sheep $AAVE amulets[10] = 0xC011a73ee8576Fb46F5E1c5751cA3B9Fe0af2a6F; // Snake $SNX amulets[11] = 0x967da4048cD07aB37855c090aAF366e4ce1b9F48; // Fish $OCEAN amulets[12] = 0x0F5D2fB29fb7d3CFeE444a200298f468908cC942; // Frog $MANA amulets[13] = 0x514910771AF9Ca656af840dff83E8264EcF986CA; // Worm $LINK amulets[14] = 0x5A98FcBEA516Cf06857215779Fd812CA3beF1B32; // Lama $LDO amulets[15] = 0x1F573D6Fb3F13d689FF844B4cE37794d79a7FF1C; // Mouse $BNT amulets[16] = 0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2; // Camel $MKR amulets[17] = 0x111111111117dC0aa78b770fA6A738034120C302; // Donkey $1INCH amulets[18] = 0x0bc529c00C6401aEF6D220BE8C6Ea1667F6Ad93e; // Bee $YFI amulets[19] = 0xc00e94Cb662C3520282E6f5717214004A7f26888; // Duck $COMP } function getCreatureTypeCount() override internal view returns (uint16) { return CREATURE_TYPE_COUNT; } function getFarmingDuration() override internal view returns (uint) { return FARMING_DURATION; } function getNormieCountInType() override internal view returns (uint16) { return NORMIE_COUNT_IN_TYPE; } function getChadCountInType() override internal view returns (uint16) { return CHAD_COUNT_IN_TYPE; } function getMaxLands() override internal view returns (uint16) { return MAX_LANDS; } function getToolUnstakeDelay() override internal view returns (uint) { return TOOL_UNSTAKE_DELAY; } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.2 <0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <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 GSN 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 payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } }
// SPDX-License-Identifier: MIT // Degen'$ Farm: Collectible NFT game (https://degens.farm) pragma solidity ^0.7.4; pragma experimental ABIEncoderV2; import "./IERC20.sol"; import "./IERC1155.sol"; import "./ERC1155Receiver.sol"; import "./IERC721.sol"; import "./Ownable.sol"; interface IEggs is IERC721 { function mint(address to, uint256 tokenId) external; function burn(uint256 tokenId) external; function getUsersTokens(address _owner) external view returns (uint256[] memory); } interface ICreatures is IERC721 { function mint( address to, uint256 tokenId, uint8 _animalType, uint8 _rarity, uint32 index ) external; function getTypeAndRarity(uint256 _tokenId) external view returns(uint8, uint8); function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); } interface ILand is IERC721 { function mint( address to, uint256 tokenId, uint randomSeed ) external; function burn(uint256 tokenId) external; } interface IDung is IERC20 { function mint( address to, uint256 amount ) external; } interface IInventory is IERC1155 { function getToolBoost(uint8 _item) external view returns (uint16); } interface IAmuletPriceProvider { function getLastPrice(address _amulet) external view returns (uint256); } interface IOperatorManage { function addOperator(address _newOperator) external; function removeOperator(address _oldOperator) external; function withdrawERC20(IERC20 _tokenContract, address _admin) external; function setSigner(address _newSigner) external; } abstract contract DegenFarmBase is ERC1155Receiver, Ownable { enum AnimalType { Cow, Horse, Rabbit, Chicken, Pig, Cat, Dog, Goose, Goat, Sheep, Snake, Fish, Frog, Worm, Lama, Mouse, Camel, Donkey, Bee, Duck, GenesisEgg // 20 } enum Rarity { Normie, // 0 Chad, // 1 Degen, // 2 Unique // 3 } enum Result {Fail, Dung, Chad, Degen} // External contract addresses used with this farm struct AddressRegistry { address land; address creatures; address inventory; address bagstoken; address dungtoken; } // Degens Farm data for creature type struct CreaturesCount { uint16 totalNormie; uint16 leftNormie; uint16 totalChad; uint16 leftChadToDiscover; uint16 totalDegen; uint16 leftDegenToDiscover; uint16 chadFarmAttempts; uint16 degenFarmAttempts; } // Land count record struct LandCount { uint16 total; uint16 left; } // Record represent one farming act struct FarmRecord { uint256 creatureId; uint256 landId; uint256 harvestTime; uint256 amuletsPrice1; uint256 amuletsPrice2; Result harvest; uint256 harvestId; // new NFT tokenId bool[COMMON_AMULET_COUNT] commonAmuletInitialHold; } // Bonus for better harvest struct Bonus { uint256 commonAmuletHold; // common amulet hold uint256 creatureAmuletBullTrend; uint256 inventoryHold; uint256 creatureAmuletBalance; } uint8 constant public CREATURE_TYPE_COUNT_MAX = 20; //how much creatures types may be used // Creature probability multiplier, scaled with 100. 3.00 - 300, 3.05 - 305 etc uint32 constant public CREATURE_P_MULT = 230; uint16 public MAX_ALL_NORMIES = getCreatureTypeCount() * getNormieCountInType(); uint256 constant public NFT_ID_MULTIPLIER = 10000; //must be set more then all Normies count uint256 constant public FARM_DUNG_AMOUNT = 250e33; //per one harvest uint256 constant public BONUS_POINTS_AMULET_HOLD = 10; uint256 constant public COMMON_AMULET_COUNT = 2; uint256 constant public TOOL_TYPE_COUNT = 6; // Common Amulet addresses address[COMMON_AMULET_COUNT] public COMMON_AMULETS = [ 0x126c121f99e1E211dF2e5f8De2d96Fa36647c855, // $DEGEN token 0xa0246c9032bC3A600820415aE600c6388619A14D // $FARM token ]; bool public REVEAL_ENABLED = false; bool public FARMING_ENABLED = false; address public priceProvider; IEggs public eggs; address[CREATURE_TYPE_COUNT_MAX] public amulets; // amulets by creature type AddressRegistry public farm; LandCount public landCount; mapping(address => uint256) public maxAmuletBalances; // mapping from user to his(her) staked tools // Index of uint256[6] represent tool NFT itemID mapping(address => uint256[TOOL_TYPE_COUNT]) public userStakedTools; uint16 public allNormiesesLeft; CreaturesCount[CREATURE_TYPE_COUNT_MAX] public creaturesBorn; FarmRecord[] public farming; mapping(uint => uint) public parents; event Reveal(address _farmer, uint256 indexed _tokenId, bool _isCreature, uint8 _animalType); event Harvest( uint256 indexed _eggId, address farmer, uint8 result, uint256 baseChance, uint256 commonAmuletHold, uint256 amuletBullTrend, uint256 inventoryHold, uint256 amuletMaxBalance, uint256 resultChance ); event Stake(address owner, uint8 innventory); event UnStake(address owner, uint8 innventory); constructor ( address _land, address _creatures, address _inventory, address _bagstoken, address _dungtoken, IEggs _eggs ) { farm.land = _land; farm.creatures = _creatures; farm.inventory = _inventory; farm.bagstoken = _bagstoken; farm.dungtoken = _dungtoken; // Index of creaturesBorn in this initial setting // must NOT exceed CREATURE_TYPE_COUNT for (uint i = 0; i < getCreatureTypeCount(); i++) { creaturesBorn[i] = CreaturesCount( getNormieCountInType(), // totalNormie; getNormieCountInType(), // leftNormie; getChadCountInType(), // totalChad; getChadCountInType(), // leftChadToDiscover; 1, // totalDegen; 1, // leftDegenToDiscover; 0, // chadFarmAttempts; 0); // degenFarmAttempts; } landCount = LandCount(getMaxLands(), getMaxLands()); allNormiesesLeft = MAX_ALL_NORMIES; eggs = _eggs; } function reveal(uint count) external { require(_isRevelEnabled(), "Please wait for reveal enabled."); require(count > 0, "Count must be positive"); require(count <= 8, "Count must less than 9"); // random limit require( IERC20(farm.bagstoken).allowance(msg.sender, address(this)) >= count*1, "Please approve your BAGS token to this contract." ); require( IERC20(farm.bagstoken).transferFrom(msg.sender, address(this), count*1) ); uint randomSeed = uint(keccak256(abi.encodePacked(block.timestamp, msg.sender))); // random seed for 8 reveals (8x32=256) for (uint i = 0; i < count; i++) { _reveal(randomSeed); randomSeed = randomSeed / 0x100000000; // shift right 32 bits } } /** * @dev Start farming process. New NFT - Egg will minted for user * @param _creatureId - NFT tokenId, caller must be owner of this token * @param _landId -- NFT tokenId, caller must be owner of this token */ function farmDeploy(uint256 _creatureId, uint256 _landId) external { require(FARMING_ENABLED == true, "Chief Farmer not enable yet"); require(ICreatures(farm.creatures).ownerOf(_creatureId) == msg.sender, "Need to be Creature Owner" ); require(ILand(farm.land).ownerOf(_landId) == msg.sender, "Need to be Land Owner" ); (uint8 crType, uint8 crRarity) = ICreatures(farm.creatures).getTypeAndRarity(_creatureId); require((DegenFarmBase.Rarity)(crRarity) == Rarity.Normie || (DegenFarmBase.Rarity)(crRarity) == Rarity.Chad, "Can farm only Normie and Chad"); // Check that farming available yet if (crRarity == 0) { require(creaturesBorn[crType].leftChadToDiscover > 0, "No more chads left"); } else { require(creaturesBorn[crType].leftDegenToDiscover > 0, "No more Degen left"); } // Save deploy record farming.push( FarmRecord({ creatureId: _creatureId, landId: _landId, harvestTime: block.timestamp + getFarmingDuration(), amuletsPrice1: _getExistingAmuletsPrices(amulets[crType]), amuletsPrice2: 0, harvest: Result.Fail, harvestId: 0, commonAmuletInitialHold: _getCommonAmuletsHoldState(msg.sender) //save initial hold state }) ); // Let's mint Egg. eggs.mint( msg.sender, // farmer farming.length - 1 // tokenId ); // STAKE LAND and Creatures ILand(farm.land).transferFrom(msg.sender, address(this), _landId); ICreatures(farm.creatures).transferFrom(msg.sender, address(this), _creatureId); } /** * @dev Finish farming process. Egg NFT will be burn * @param _deployId - NFT tokenId, caller must be owner of this token */ function harvest(uint256 _deployId) external { require(eggs.ownerOf(_deployId) == msg.sender, "This is NOT YOUR EGG"); FarmRecord storage f = farming[_deployId]; require(f.harvestTime <= block.timestamp, "To early for harvest"); // Lets Calculate Dung/CHAD-DEGEN chance Result farmingResult; Bonus memory bonus; // 1. BaseChance (uint8 crType, uint8 crRarity) = ICreatures(farm.creatures).getTypeAndRarity( f.creatureId ); uint256 baseChance; if (crRarity == 0) { // Try farm CHAD. So if there is no CHADs any more we must return assets if (creaturesBorn[crType].leftChadToDiscover == 0) { _endFarming(_deployId, Result.Fail); return; } baseChance = 100 * creaturesBorn[crType].totalChad / creaturesBorn[crType].totalNormie; // by default 20% // Decrease appropriate farm ATTEMPTS COUNT creaturesBorn[crType].chadFarmAttempts += 1; } else { // Try farm DEGEN. So if there is no DEGENSs any more we must return assets if (creaturesBorn[crType].leftDegenToDiscover == 0) { _endFarming(_deployId, Result.Fail); return; } baseChance = 100 * creaturesBorn[crType].totalDegen / creaturesBorn[crType].totalChad; // by default 5% // Decrease appropriate farm ATTEMPTS COUNT creaturesBorn[crType].degenFarmAttempts += 1; } ////////////////////////////////////////////// // 2. Bonus for common amulet token ***HOLD*** - commonAmuletHold ////////////////////////////////////////////// // Get current hold stae for (uint8 i = 0; i < COMMON_AMULETS.length; i ++){ if (f.commonAmuletInitialHold[i] && _getCommonAmuletsHoldState(msg.sender)[i]) { bonus.commonAmuletHold = BONUS_POINTS_AMULET_HOLD; } } ////////////////////////////////////////////// // 3. Bonus for creatures amulets BULLs trend - creatureAmuletBullTrend // 4. Bonus for creatures amulets balance - creatureAmuletBalance ////////////////////////////////////////////// uint256 prices2 = 0; prices2 = _getExistingAmuletsPrices(amulets[crType]); if (f.amuletsPrice1 > 0 && prices2 > 0 && prices2 > f.amuletsPrice1){ bonus.creatureAmuletBullTrend = (prices2 - f.amuletsPrice1) * 100 / f.amuletsPrice1; } //Lets check max Balance, because //bonus.amuletHold = userAmuletBalance/maxAmuletBalances*BONUS_POINTS_AMULET_HOLD _checkAndSaveMaxAmuletPrice(amulets[crType]); if (maxAmuletBalances[amulets[crType]] > 0) { bonus.creatureAmuletBalance = IERC20(amulets[crType]).balanceOf(msg.sender) * 100 //100 used for scale / maxAmuletBalances[amulets[crType]] * BONUS_POINTS_AMULET_HOLD /100; } f.amuletsPrice2 = prices2; ////////////////////////////////////////////// //5. Bonus for inventory ////////////////////////////////////////////// bonus.inventoryHold = 0; if (userStakedTools[msg.sender].length > 0) { for (uint8 i=0; i < userStakedTools[msg.sender].length; i++) { if (userStakedTools[msg.sender][i] > 0) { bonus.inventoryHold = bonus.inventoryHold + IInventory(farm.inventory).getToolBoost(i); } } } ////////////////////////////////////////////// uint256 allBonus = bonus.commonAmuletHold + bonus.creatureAmuletBullTrend + bonus.creatureAmuletBalance + bonus.inventoryHold; if (allBonus > 100) { allBonus = 100; // limit bonus to 100% } uint32[] memory choiceWeight = new uint32[](2); choiceWeight[0] = uint32(baseChance * (100 + allBonus)); // chance of born new chad/degen choiceWeight[1] = uint32(10000 - choiceWeight[0]); // receive DUNG if (_getWeightedChoice(choiceWeight) == 0) { f.harvestId = (crRarity + 1) * NFT_ID_MULTIPLIER + _deployId; // Mint new chad/degen uint32 index; // Decrease appropriate CREATURE COUNT if (crRarity + 1 == uint8(Rarity.Chad)) { index = creaturesBorn[crType].totalChad - creaturesBorn[crType].leftChadToDiscover + 1; creaturesBorn[crType].leftChadToDiscover -= 1; farmingResult = Result.Chad; } else if (crRarity + 1 == uint8(Rarity.Degen)) { index = creaturesBorn[crType].totalDegen - creaturesBorn[crType].leftDegenToDiscover + 1; creaturesBorn[crType].leftDegenToDiscover -= 1; farmingResult = Result.Degen; } uint newCreatureId = (crRarity + 1) * NFT_ID_MULTIPLIER + _deployId; ICreatures(farm.creatures).mint( msg.sender, newCreatureId, // new iD crType, // AnimalType crRarity + 1, index // index ); parents[newCreatureId] = f.creatureId; } else { // Mint new dung IDung(farm.dungtoken).mint(msg.sender, FARM_DUNG_AMOUNT); farmingResult = Result.Dung; } // BURN Land ILand(farm.land).burn(f.landId); _endFarming(_deployId, farmingResult); emit Harvest( _deployId, msg.sender, uint8(farmingResult), baseChance, bonus.commonAmuletHold, bonus.creatureAmuletBullTrend, bonus.inventoryHold, bonus.creatureAmuletBalance, choiceWeight[0] ); } /** * @dev Stake one inventory item * @param _itemId - NFT tokenId, caller must be owner of this token */ function stakeOneTool(uint8 _itemId) external { _stakeOneTool(_itemId); emit Stake(msg.sender, _itemId); } /** * @dev UnStake one inventory item * @param _itemId - NFT tokenId */ function unstakeOneTool(uint8 _itemId) external { _unstakeOneTool(_itemId); emit UnStake(msg.sender, _itemId); } ///////////////////////////////////////////////////// //// Admin functions /////// ///////////////////////////////////////////////////// function setOneCommonAmulet(uint8 _index, address _token) external onlyOwner { COMMON_AMULETS[_index] = _token; } function setAmuletForOneCreature(uint8 _index, address _token) external onlyOwner { amulets[_index] = _token; } function setAmulets(address[] calldata _tokens) external onlyOwner { for (uint i = 0; i < _tokens.length; i++) { amulets[i] = _tokens[i]; } } function setPriceProvider(address _priceProvider) external onlyOwner { priceProvider = _priceProvider; } function enableReveal(bool _isEnabled) external onlyOwner { REVEAL_ENABLED = _isEnabled; } function enableFarming(bool _isEnabled) external onlyOwner { FARMING_ENABLED = _isEnabled; } //////////////////////////////////////// /// Proxy for NFT Operators mamnage // //////////////////////////////////////// function addOperator(address _contract, address newOperator) external onlyOwner { IOperatorManage(_contract).addOperator(newOperator); } function removeOperator(address _contract, address oldOperator) external onlyOwner { IOperatorManage(_contract).removeOperator(oldOperator); } function reclaimToken(address _contract, IERC20 anyTokens, address _admin) external onlyOwner { IOperatorManage(_contract).withdrawERC20(anyTokens, _admin); } function setSigner(address _contract, address _newSigner) external onlyOwner { IOperatorManage(_contract).setSigner(_newSigner); } //////////////////////////////////////////////////////// function getCreatureAmulets(uint8 _creatureType) external view returns (address) { return _getCreatureAmulets(_creatureType); } function _getCreatureAmulets(uint8 _creatureType) internal view returns (address) { return amulets[_creatureType]; } function getCreatureStat(uint8 _creatureType) external view returns ( uint16, uint16, uint16, uint16, uint16, uint16, uint16, uint16 ) { CreaturesCount storage stat = creaturesBorn[_creatureType]; return ( stat.totalNormie, stat.leftNormie, stat.totalChad, stat.leftChadToDiscover, stat.totalDegen, stat.leftDegenToDiscover, stat.chadFarmAttempts, stat.degenFarmAttempts ); } function getWeightedChoice(uint32[] memory _weights) external view returns (uint8){ return _getWeightedChoice(_weights); } function _getWeightedChoice(uint32[] memory _weights) internal view returns (uint8){ uint randomSeed = uint(keccak256(abi.encodePacked(block.timestamp, msg.sender))); return _getWeightedChoice2(_weights, randomSeed); } function getFarmingById(uint256 _farmingId) external view returns (FarmRecord memory) { return farming[_farmingId]; } function getOneAmuletPrice(address _token) external view returns (uint256) { return _getOneAmuletPrice(_token); } /////////////////////////////////////////////// /// Internals /////// /////////////////////////////////////////////// /** * @dev Save farming results in storage and mint * appropriate token (NFT, ERC20 or None) */ function _endFarming(uint256 _deployId, Result _res) internal { FarmRecord storage f = farming[_deployId]; f.harvest = _res; // unstake creature ICreatures(farm.creatures).transferFrom(address(this), msg.sender, f.creatureId); eggs.burn(_deployId); // Burn EGG if (_res == Result.Fail) { //unstake land (if staked) if (ILand(farm.land).ownerOf(f.landId) == address(this)){ ILand(farm.land).transferFrom(address(this), msg.sender, f.landId); } emit Harvest( _deployId, msg.sender, uint8(_res), 0, //baseChance 0, //bonus.commonAmuletHold 0, //bonus.creatureAmuletBullTrend, 0, //bonus.inventoryHold 0, // bonus.creatureAmuletBalance 0 ); } } function _stakeOneTool(uint8 _itemId) internal { require(IInventory(farm.inventory).balanceOf(msg.sender, _itemId) >= 1, "You must own this tool for stake!" ); // Before stake we need two checks. // 1. Removed // 2. Cant`t stake one tool more than one item require(userStakedTools[msg.sender][_itemId] == 0, "Tool is already staked"); // stake IInventory(farm.inventory).safeTransferFrom( msg.sender, address(this), _itemId, 1, bytes('0') ); userStakedTools[msg.sender][_itemId] = block.timestamp; } function _unstakeOneTool(uint8 _itemId) internal { require(userStakedTools[msg.sender][_itemId] > 0, "This tool is not staked yet"); require(block.timestamp - userStakedTools[msg.sender][_itemId] >= getToolUnstakeDelay(), "Cant unstake earlier than a week" ); userStakedTools[msg.sender][_itemId] = 0; IInventory(farm.inventory).safeTransferFrom( address(this), msg.sender, _itemId, 1, bytes('0') ); } function _checkAndSaveMaxAmuletPrice(address _amulet) internal { if (IERC20(_amulet).balanceOf(msg.sender) > maxAmuletBalances[_amulet] ) { maxAmuletBalances[_amulet] = IERC20(_amulet).balanceOf(msg.sender); } } function _getCommonAmuletsHoldState(address _farmer) internal view returns (bool[COMMON_AMULET_COUNT] memory) { // If token balance =0 - set false bool[COMMON_AMULET_COUNT] memory res; for (uint8 i = 0; i < COMMON_AMULETS.length; i++){ if (IERC20(COMMON_AMULETS[i]).balanceOf(_farmer) > 0){ res[i] = true; } else { // Set to zero if token balance is 0 res[i] = false; } } return res; } function _getExistingAmuletsPrices(address _token) internal view returns (uint256) { if (IERC20(_token).balanceOf(msg.sender) > 0){ return _getOneAmuletPrice(_token); } else { // Set to zero if token balance is 0 return 0; } } function _getOneAmuletPrice(address _token) internal view returns (uint256) { return IAmuletPriceProvider(priceProvider).getLastPrice(_token); } function _isRevelEnabled() internal view returns (bool) { return REVEAL_ENABLED; } function _reveal(uint randomSeed) internal { require ((landCount.left + allNormiesesLeft) > 0, "Sorry, no more reveal!"); //1. Lets choose Land OR Creature, % //So we have two possible results. 1 - Land, 0 - Creature. // sum of weights = 100, lets define weigth for Creature uint32[] memory choiceWeight = new uint32[](2); choiceWeight[0] = uint32(allNormiesesLeft) * CREATURE_P_MULT; choiceWeight[1] = uint32(landCount.left) * 100; uint8 choice = uint8(_getWeightedChoice2(choiceWeight, randomSeed)); randomSeed /= 0x10000; // shift right 16 bits //Check that choice can be executed if (choice != 0 && landCount.left == 0) { //There are no more Lands. So we need change choice choice = 0; } if (choice == 0) { // create creature uint32[] memory choiceWeight0 = new uint32[](getCreatureTypeCount()); //2. Ok, Creature will be born. But what kind of? for (uint8 i = 0; i < getCreatureTypeCount(); i ++) { choiceWeight0[i] = uint32(creaturesBorn[i].leftNormie); } choice = uint8(_getWeightedChoice2(choiceWeight0, randomSeed)); ICreatures(farm.creatures).mint( msg.sender, MAX_ALL_NORMIES - allNormiesesLeft, choice, //AnimalType 0, creaturesBorn[choice].totalNormie - creaturesBorn[choice].leftNormie + 1 // index ); emit Reveal(msg.sender, MAX_ALL_NORMIES - allNormiesesLeft, true, choice); allNormiesesLeft -= 1; creaturesBorn[choice].leftNormie -= 1; } else { // create land ILand(farm.land).mint( msg.sender, getMaxLands() - landCount.left, randomSeed ); emit Reveal(msg.sender, getMaxLands() - landCount.left , false, 0); landCount.left -= 1; } } function _getWeightedChoice2(uint32[] memory _weights, uint randomSeed) internal view returns (uint8){ uint256 sum_of_weights = 0; for (uint8 index = 0; index < _weights.length; index++) { sum_of_weights += _weights[index]; } uint256 rnd = randomSeed % sum_of_weights; for (uint8 kindex = 0; kindex < _weights.length; kindex++) { if (rnd < _weights[kindex]) { return kindex; } rnd -= _weights[kindex]; } return 0; } /** @dev Handles the receipt of a single ERC1155 token type. This function is called at the end of a `safeTransferFrom` after the balance has been updated. To accept the transfer, this must return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` (i.e. 0xf23a6e61, or its own function selector). @param operator The address which initiated the transfer (i.e. msg.sender) @param from The address which previously owned the token @param id The ID of the token being transferred @param value The amount of tokens being transferred @param data Additional data with no specified format @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external override returns(bytes4) { return bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)")); } /** @dev Handles the receipt of a multiple ERC1155 token types. This function is called at the end of a `safeBatchTransferFrom` after the balances have been updated. To accept the transfer(s), this must return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` (i.e. 0xbc197c81, or its own function selector). @param operator The address which initiated the batch transfer (i.e. msg.sender) @param from The address which previously owned the token @param ids An array containing ids of each token being transferred (order and length must match values array) @param values An array containing amounts of each token being transferred (order and length must match ids array) @param data Additional data with no specified format @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external override returns(bytes4) { return bytes4(keccak256("onERC1155BatchReceived(address,address,uint256,uint256,bytes)")); } function getCreatureTypeCount() virtual internal view returns (uint16); function getFarmingDuration() virtual internal view returns (uint); function getToolUnstakeDelay() virtual internal view returns (uint); function getNormieCountInType() virtual internal view returns (uint16); function getChadCountInType() virtual internal view returns (uint16); function getMaxLands() virtual internal view returns (uint16); function getUsersTokens(address _owner) external view returns (uint256[] memory) { return eggs.getUsersTokens(_owner); } /** * @dev Returns creatures owned by owner and that can be used for farming.this * Some creatures types and rarity are limited to farm because all chad/degens * was already discovered. * @param _owner - creatures owner */ function getFarmingAllowedCreatures(address _owner) external view returns (uint256[] memory) { uint256 n = ICreatures(farm.creatures).balanceOf(_owner); uint256[] memory result = new uint256[](n); uint256 count = 0; for (uint16 i = 0; i < n; i++) { uint creatureId = ICreatures(farm.creatures).tokenOfOwnerByIndex(_owner, i); if (isFarmingAllowedForCreature(creatureId)) { result[count] = creatureId; count++; } } uint256[] memory result2 = new uint256[](count); for (uint16 i = 0; i < count; i++) { result2[i] = result[i]; } return result2; } function getFarmingAllowedCreaturesWithRarity(address _owner, uint8 wantRarity) external view returns (uint256[] memory) { uint256 n = ICreatures(farm.creatures).balanceOf(_owner); uint256[] memory result = new uint256[](n); uint256 count = 0; for (uint16 i = 0; i < n; i++) { uint creatureId = ICreatures(farm.creatures).tokenOfOwnerByIndex(_owner, i); (uint8 _, uint8 rarity) = ICreatures(farm.creatures).getTypeAndRarity(creatureId); if (rarity == wantRarity && isFarmingAllowedForCreature(creatureId)) { result[count] = creatureId; count++; } } uint256[] memory result2 = new uint256[](count); for (uint16 i = 0; i < count; i++) { result2[i] = result[i]; } return result2; } function isFarmingAllowedForCreature(uint creatureId) public view returns (bool) { (uint8 _type, uint8 rarity) = ICreatures(farm.creatures).getTypeAndRarity(creatureId); if ((DegenFarmBase.Rarity)(rarity) == Rarity.Normie) { return creaturesBorn[_type].leftChadToDiscover > 0; } if ((DegenFarmBase.Rarity)(rarity) == Rarity.Chad) { return creaturesBorn[_type].leftDegenToDiscover > 0; } return false; } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /** * @dev Library for managing an enumerable variant of Solidity's * https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`] * type. * * Maps have the following properties: * * - Entries are added, removed, and checked for existence in constant time * (O(1)). * - Entries are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableMap for EnumerableMap.UintToAddressMap; * * // Declare a set state variable * EnumerableMap.UintToAddressMap private myMap; * } * ``` * * As of v3.0.0, only maps of type `uint256 -> address` (`UintToAddressMap`) are * supported. */ library EnumerableMap { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Map type with // bytes32 keys and values. // The Map implementation uses private functions, and user-facing // implementations (such as Uint256ToAddressMap) are just wrappers around // the underlying Map. // This means that we can only create new EnumerableMaps for types that fit // in bytes32. struct MapEntry { bytes32 _key; bytes32 _value; } struct Map { // Storage of map keys and values MapEntry[] _entries; // Position of the entry defined by a key in the `entries` array, plus 1 // because index 0 means a key is not in the map. mapping (bytes32 => uint256) _indexes; } /** * @dev Adds a key-value pair to a map, or updates the value for an existing * key. O(1). * * Returns true if the key was added to the map, that is if it was not * already present. */ function _set(Map storage map, bytes32 key, bytes32 value) private returns (bool) { // We read and store the key's index to prevent multiple reads from the same storage slot uint256 keyIndex = map._indexes[key]; if (keyIndex == 0) { // Equivalent to !contains(map, key) map._entries.push(MapEntry({ _key: key, _value: value })); // The entry is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value map._indexes[key] = map._entries.length; return true; } else { map._entries[keyIndex - 1]._value = value; return false; } } /** * @dev Removes a key-value pair from a map. O(1). * * Returns true if the key was removed from the map, that is if it was present. */ function _remove(Map storage map, bytes32 key) private returns (bool) { // We read and store the key's index to prevent multiple reads from the same storage slot uint256 keyIndex = map._indexes[key]; if (keyIndex != 0) { // Equivalent to contains(map, key) // To delete a key-value pair from the _entries array in O(1), we swap the entry to delete with the last one // in the array, and then remove the last entry (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = keyIndex - 1; uint256 lastIndex = map._entries.length - 1; // When the entry to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. MapEntry storage lastEntry = map._entries[lastIndex]; // Move the last entry to the index where the entry to delete is map._entries[toDeleteIndex] = lastEntry; // Update the index for the moved entry map._indexes[lastEntry._key] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved entry was stored map._entries.pop(); // Delete the index for the deleted slot delete map._indexes[key]; return true; } else { return false; } } /** * @dev Returns true if the key is in the map. O(1). */ function _contains(Map storage map, bytes32 key) private view returns (bool) { return map._indexes[key] != 0; } /** * @dev Returns the number of key-value pairs in the map. O(1). */ function _length(Map storage map) private view returns (uint256) { return map._entries.length; } /** * @dev Returns the key-value pair stored at position `index` in the map. O(1). * * Note that there are no guarantees on the ordering of entries inside the * array, and it may change when more entries are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Map storage map, uint256 index) private view returns (bytes32, bytes32) { require(map._entries.length > index, "EnumerableMap: index out of bounds"); MapEntry storage entry = map._entries[index]; return (entry._key, entry._value); } /** * @dev Tries to returns the value associated with `key`. O(1). * Does not revert if `key` is not in the map. */ function _tryGet(Map storage map, bytes32 key) private view returns (bool, bytes32) { uint256 keyIndex = map._indexes[key]; if (keyIndex == 0) return (false, 0); // Equivalent to contains(map, key) return (true, map._entries[keyIndex - 1]._value); // All indexes are 1-based } /** * @dev Returns the value associated with `key`. O(1). * * Requirements: * * - `key` must be in the map. */ function _get(Map storage map, bytes32 key) private view returns (bytes32) { uint256 keyIndex = map._indexes[key]; require(keyIndex != 0, "EnumerableMap: nonexistent key"); // Equivalent to contains(map, key) return map._entries[keyIndex - 1]._value; // All indexes are 1-based } /** * @dev Same as {_get}, with a custom error message when `key` is not in the map. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {_tryGet}. */ function _get(Map storage map, bytes32 key, string memory errorMessage) private view returns (bytes32) { uint256 keyIndex = map._indexes[key]; require(keyIndex != 0, errorMessage); // Equivalent to contains(map, key) return map._entries[keyIndex - 1]._value; // All indexes are 1-based } // UintToAddressMap struct UintToAddressMap { Map _inner; } /** * @dev Adds a key-value pair to a map, or updates the value for an existing * key. O(1). * * Returns true if the key was added to the map, that is if it was not * already present. */ function set(UintToAddressMap storage map, uint256 key, address value) internal returns (bool) { return _set(map._inner, bytes32(key), bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the key was removed from the map, that is if it was present. */ function remove(UintToAddressMap storage map, uint256 key) internal returns (bool) { return _remove(map._inner, bytes32(key)); } /** * @dev Returns true if the key is in the map. O(1). */ function contains(UintToAddressMap storage map, uint256 key) internal view returns (bool) { return _contains(map._inner, bytes32(key)); } /** * @dev Returns the number of elements in the map. O(1). */ function length(UintToAddressMap storage map) internal view returns (uint256) { return _length(map._inner); } /** * @dev Returns the element stored at position `index` in the set. O(1). * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintToAddressMap storage map, uint256 index) internal view returns (uint256, address) { (bytes32 key, bytes32 value) = _at(map._inner, index); return (uint256(key), address(uint160(uint256(value)))); } /** * @dev Tries to returns the value associated with `key`. O(1). * Does not revert if `key` is not in the map. * * _Available since v3.4._ */ function tryGet(UintToAddressMap storage map, uint256 key) internal view returns (bool, address) { (bool success, bytes32 value) = _tryGet(map._inner, bytes32(key)); return (success, address(uint160(uint256(value)))); } /** * @dev Returns the value associated with `key`. O(1). * * Requirements: * * - `key` must be in the map. */ function get(UintToAddressMap storage map, uint256 key) internal view returns (address) { return address(uint160(uint256(_get(map._inner, bytes32(key))))); } /** * @dev Same as {get}, with a custom error message when `key` is not in the map. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryGet}. */ function get(UintToAddressMap storage map, uint256 key, string memory errorMessage) internal view returns (address) { return address(uint160(uint256(_get(map._inner, bytes32(key), errorMessage)))); } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping (bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { require(set._values.length > index, "EnumerableSet: index out of bounds"); return set._values[index]; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; import "./IERC1155Receiver.sol"; import "./ERC165.sol"; /** * @dev _Available since v3.1._ */ abstract contract ERC1155Receiver is ERC165, IERC1155Receiver { constructor() internal { _registerInterface( ERC1155Receiver(address(0)).onERC1155Received.selector ^ ERC1155Receiver(address(0)).onERC1155BatchReceived.selector ); } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts may inherit from this and call {_registerInterface} to declare * their support of an interface. */ abstract contract ERC165 is IERC165 { /* * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7 */ bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7; /** * @dev Mapping of interface ids to whether or not it's supported. */ mapping(bytes4 => bool) private _supportedInterfaces; constructor () internal { // Derived contracts need only register support for their own interfaces, // we register support for ERC165 itself here _registerInterface(_INTERFACE_ID_ERC165); } /** * @dev See {IERC165-supportsInterface}. * * Time complexity O(1), guaranteed to always use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return _supportedInterfaces[interfaceId]; } /** * @dev Registers the contract as an implementer of the interface defined by * `interfaceId`. Support of the actual ERC165 interface is automatic and * registering its interface id is not required. * * See {IERC165-supportsInterface}. * * Requirements: * * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`). */ function _registerInterface(bytes4 interfaceId) internal virtual { require(interfaceId != 0xffffffff, "ERC165: invalid interface id"); _supportedInterfaces[interfaceId] = true; } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; import "./Context.sol"; import "./IERC721.sol"; import "./IERC721Metadata.sol"; import "./IERC721Enumerable.sol"; import "./IERC721Receiver.sol"; import "./ERC165.sol"; import "./SafeMath.sol"; import "./Address.sol"; import "./EnumerableSet.sol"; import "./EnumerableMap.sol"; import "./Strings.sol"; /** * @title ERC721 Non-Fungible Token Standard basic implementation * @dev see https://eips.ethereum.org/EIPS/eip-721 */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using SafeMath for uint256; using Address for address; using EnumerableSet for EnumerableSet.UintSet; using EnumerableMap for EnumerableMap.UintToAddressMap; using Strings for uint256; // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector` bytes4 private constant _ERC721_RECEIVED = 0x150b7a02; // Mapping from holder address to their (enumerable) set of owned tokens mapping (address => EnumerableSet.UintSet) private _holderTokens; // Enumerable mapping from token ids to their owners EnumerableMap.UintToAddressMap private _tokenOwners; // Mapping from token ID to approved address mapping (uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping (address => mapping (address => bool)) private _operatorApprovals; // Token name string private _name; // Token symbol string private _symbol; // Optional mapping for token URIs mapping (uint256 => string) private _tokenURIs; // Base URI string private _baseURI; /* * bytes4(keccak256('balanceOf(address)')) == 0x70a08231 * bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e * bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3 * bytes4(keccak256('getApproved(uint256)')) == 0x081812fc * bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465 * bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5 * bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd * bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e * bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde * * => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^ * 0xa22cb465 ^ 0xe985e9c5 ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd */ bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd; /* * bytes4(keccak256('name()')) == 0x06fdde03 * bytes4(keccak256('symbol()')) == 0x95d89b41 * bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd * * => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f */ bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f; /* * bytes4(keccak256('totalSupply()')) == 0x18160ddd * bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) == 0x2f745c59 * bytes4(keccak256('tokenByIndex(uint256)')) == 0x4f6ccce7 * * => 0x18160ddd ^ 0x2f745c59 ^ 0x4f6ccce7 == 0x780e9d63 */ bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor (string memory name_, string memory symbol_) public { _name = name_; _symbol = symbol_; // register the supported interfaces to conform to ERC721 via ERC165 _registerInterface(_INTERFACE_ID_ERC721); _registerInterface(_INTERFACE_ID_ERC721_METADATA); _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _holderTokens[owner].length(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return _tokenOwners.get(tokenId, "ERC721: owner query for nonexistent token"); } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI. return string(abi.encodePacked(base, tokenId.toString())); } /** * @dev Returns the base URI set via {_setBaseURI}. This will be * automatically added as a prefix in {tokenURI} to each token's URI, or * to the token ID if no specific URI is set for that token ID. */ function baseURI() public view virtual returns (string memory) { return _baseURI; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { return _holderTokens[owner].at(index); } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { // _tokenOwners are indexed by tokenIds, so .length() returns the number of tokenIds return _tokenOwners.length(); } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { (uint256 tokenId, ) = _tokenOwners.at(index); return tokenId; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require(_msgSender() == owner || ERC721.isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom(address from, address to, uint256 tokenId) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _tokenOwners.contains(tokenId); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || ERC721.isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: d* * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint(address to, uint256 tokenId, bytes memory _data) internal virtual { _mint(to, tokenId); require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _holderTokens[to].add(tokenId); _tokenOwners.set(tokenId, to); emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); // internal owner _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); // Clear metadata (if any) if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } _holderTokens[owner].remove(tokenId); _tokenOwners.remove(tokenId); emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer(address from, address to, uint256 tokenId) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); // internal owner require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _holderTokens[from].remove(tokenId); _holderTokens[to].add(tokenId); _tokenOwners.set(tokenId, to); emit Transfer(from, to, tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } /** * @dev Internal function to set the base URI for all token IDs. It is * automatically added as a prefix to the value returned in {tokenURI}, * or to the token ID if {tokenURI} is empty. */ function _setBaseURI(string memory baseURI_) internal virtual { _baseURI = baseURI_; } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data) private returns (bool) { if (!to.isContract()) { return true; } bytes memory returndata = to.functionCall(abi.encodeWithSelector( IERC721Receiver(to).onERC721Received.selector, _msgSender(), from, tokenId, _data ), "ERC721: transfer to non ERC721Receiver implementer"); bytes4 retval = abi.decode(returndata, (bytes4)); return (retval == _ERC721_RECEIVED); } function _approve(address to, uint256 tokenId) private { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); // internal owner } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual { } }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.4; pragma experimental ABIEncoderV2; import "./ERC721.sol"; import "./Operators.sol"; /** * @dev this contract used just for override some * OpneZeppelin tokenURI() behavior * so we need redeclare _tokenURIs becouse in OpenZeppelin * ERC721 it has private visibility */ abstract contract ERC721URIStorage is ERC721, Operators { using Strings for uint256; // Optional mapping for token URIs mapping (uint256 => string) private _tokenURIs; /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token"); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { //return string(abi.encodePacked(base, _tokenURI)); //Due customer requirements return _tokenURI; } return super.tokenURI(tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual override { require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual override { super._burn(tokenId); if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } } function setURI(uint256 tokenId, string calldata _tokenURI) external onlyOperator { _setTokenURI(tokenId, _tokenURI); } function setURIBatch(uint256[] calldata tokenId, string[] calldata _tokenURI) external onlyOperator { require(tokenId.length == _tokenURI.length, "tokenId length is not equal to _tokenURI length"); for (uint i = 0; i < tokenId.length; i++) { _setTokenURI(tokenId[i], _tokenURI[i]); } } address public signerAddress; function setSigner(address _newSigner) external onlyOwner { signerAddress = _newSigner; } function hashArguments(uint256 tokenId, string calldata _tokenURI) public pure returns (bytes32 msgHash) { msgHash = keccak256(abi.encode(tokenId, _tokenURI)); } function getSigner(uint256 tokenId, string calldata _tokenURI, uint8 _v, bytes32 _r, bytes32 _s) public pure returns (address) { bytes32 msgHash = hashArguments(tokenId, _tokenURI); return ecrecover(msgHash, _v, _r, _s); } function isValidSignature(uint256 tokenId, string calldata _tokenURI, uint8 _v, bytes32 _r, bytes32 _s) public view returns (bool) { return getSigner(tokenId, _tokenURI, _v, _r, _s) == signerAddress; } /** * @dev Sets token URI using signature * This method can be called by anyone, who has signature, * that was created by signer role */ function setURISigned(uint256 tokenId, string calldata _tokenURI, uint8 _v, bytes32 _r, bytes32 _s) external { require(isValidSignature(tokenId, _tokenURI, _v, _r, _s), "Invalid signature"); _setTokenURI(tokenId, _tokenURI); } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.2 <0.8.0; import "./IERC165.sol"; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes calldata data) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data) external; }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; import "./IERC165.sol"; /** * _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** @dev Handles the receipt of a single ERC1155 token type. This function is called at the end of a `safeTransferFrom` after the balance has been updated. To accept the transfer, this must return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` (i.e. 0xf23a6e61, or its own function selector). @param operator The address which initiated the transfer (i.e. msg.sender) @param from The address which previously owned the token @param id The ID of the token being transferred @param value The amount of tokens being transferred @param data Additional data with no specified format @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns(bytes4); /** @dev Handles the receipt of a multiple ERC1155 token types. This function is called at the end of a `safeBatchTransferFrom` after the balances have been updated. To accept the transfer(s), this must return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` (i.e. 0xbc197c81, or its own function selector). @param operator The address which initiated the batch transfer (i.e. msg.sender) @param from The address which previously owned the token @param ids An array containing ids of each token being transferred (order and length must match values array) @param values An array containing amounts of each token being transferred (order and length must match ids array) @param data Additional data with no specified format @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns(bytes4); }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.2 <0.8.0; import "./IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.2 <0.8.0; import "./IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.2 <0.8.0; import "./IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4); }
// SPDX-License-Identifier: MIT // Degen'$ Farm: Collectible NFT game (https://degens.farm) pragma solidity ^0.7.4; import "./IERC20.sol"; import "./Ownable.sol"; contract Operators is Ownable { mapping (address=>bool) operatorAddress; modifier onlyOperator() { require(isOperator(msg.sender), "Access denied"); _; } function isOwner(address _addr) public view returns (bool) { return owner() == _addr; } function isOperator(address _addr) public view returns (bool) { return operatorAddress[_addr] || isOwner(_addr); } function addOperator(address _newOperator) external onlyOwner { require(_newOperator != address(0), "New operator is empty"); operatorAddress[_newOperator] = true; } function removeOperator(address _oldOperator) external onlyOwner { delete(operatorAddress[_oldOperator]); } /** * @dev Owner can claim any tokens that transferred * to this contract address */ function withdrawERC20(IERC20 _tokenContract, address _admin) external onlyOwner { uint256 balance = _tokenContract.balanceOf(address(this)); _tokenContract.transfer(_admin, balance); } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; import "./Context.sol"; /** * @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 () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { 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 { emit OwnershipTransferred(_owner, address(0)); _owner = 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"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a % b; } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /** * @dev String operations. */ library Strings { /** * @dev Converts a `uint256` to its ASCII `string` representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); uint256 index = digits - 1; temp = value; while (temp != 0) { buffer[index--] = bytes1(uint8(48 + temp % 10)); temp /= 10; } return string(buffer); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_land","type":"address"},{"internalType":"address","name":"_creatures","type":"address"},{"internalType":"address","name":"_inventory","type":"address"},{"internalType":"address","name":"_bagstoken","type":"address"},{"internalType":"address","name":"_dungtoken","type":"address"},{"internalType":"contract IEggs","name":"_eggs","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_eggId","type":"uint256"},{"indexed":false,"internalType":"address","name":"farmer","type":"address"},{"indexed":false,"internalType":"uint8","name":"result","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"baseChance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"commonAmuletHold","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amuletBullTrend","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"inventoryHold","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amuletMaxBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"resultChance","type":"uint256"}],"name":"Harvest","type":"event"},{"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":false,"internalType":"address","name":"_farmer","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"_isCreature","type":"bool"},{"indexed":false,"internalType":"uint8","name":"_animalType","type":"uint8"}],"name":"Reveal","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint8","name":"innventory","type":"uint8"}],"name":"Stake","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint8","name":"innventory","type":"uint8"}],"name":"UnStake","type":"event"},{"inputs":[],"name":"BONUS_POINTS_AMULET_HOLD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CHAD_COUNT_IN_TYPE","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"COMMON_AMULETS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"COMMON_AMULET_COUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CREATURE_P_MULT","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CREATURE_TYPE_COUNT","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CREATURE_TYPE_COUNT_MAX","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FARMING_DURATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FARMING_ENABLED","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FARM_DUNG_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_ALL_NORMIES","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_LANDS","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NFT_ID_MULTIPLIER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NORMIE_COUNT_IN_TYPE","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REVEAL_ENABLED","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOOL_TYPE_COUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOOL_UNSTAKE_DELAY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"},{"internalType":"address","name":"newOperator","type":"address"}],"name":"addOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"allNormiesesLeft","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"amulets","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"creaturesBorn","outputs":[{"internalType":"uint16","name":"totalNormie","type":"uint16"},{"internalType":"uint16","name":"leftNormie","type":"uint16"},{"internalType":"uint16","name":"totalChad","type":"uint16"},{"internalType":"uint16","name":"leftChadToDiscover","type":"uint16"},{"internalType":"uint16","name":"totalDegen","type":"uint16"},{"internalType":"uint16","name":"leftDegenToDiscover","type":"uint16"},{"internalType":"uint16","name":"chadFarmAttempts","type":"uint16"},{"internalType":"uint16","name":"degenFarmAttempts","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eggs","outputs":[{"internalType":"contract IEggs","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_isEnabled","type":"bool"}],"name":"enableFarming","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isEnabled","type":"bool"}],"name":"enableReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"farm","outputs":[{"internalType":"address","name":"land","type":"address"},{"internalType":"address","name":"creatures","type":"address"},{"internalType":"address","name":"inventory","type":"address"},{"internalType":"address","name":"bagstoken","type":"address"},{"internalType":"address","name":"dungtoken","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_creatureId","type":"uint256"},{"internalType":"uint256","name":"_landId","type":"uint256"}],"name":"farmDeploy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"farming","outputs":[{"internalType":"uint256","name":"creatureId","type":"uint256"},{"internalType":"uint256","name":"landId","type":"uint256"},{"internalType":"uint256","name":"harvestTime","type":"uint256"},{"internalType":"uint256","name":"amuletsPrice1","type":"uint256"},{"internalType":"uint256","name":"amuletsPrice2","type":"uint256"},{"internalType":"enum DegenFarmBase.Result","name":"harvest","type":"uint8"},{"internalType":"uint256","name":"harvestId","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_creatureType","type":"uint8"}],"name":"getCreatureAmulets","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_creatureType","type":"uint8"}],"name":"getCreatureStat","outputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"getFarmingAllowedCreatures","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint8","name":"wantRarity","type":"uint8"}],"name":"getFarmingAllowedCreaturesWithRarity","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_farmingId","type":"uint256"}],"name":"getFarmingById","outputs":[{"components":[{"internalType":"uint256","name":"creatureId","type":"uint256"},{"internalType":"uint256","name":"landId","type":"uint256"},{"internalType":"uint256","name":"harvestTime","type":"uint256"},{"internalType":"uint256","name":"amuletsPrice1","type":"uint256"},{"internalType":"uint256","name":"amuletsPrice2","type":"uint256"},{"internalType":"enum DegenFarmBase.Result","name":"harvest","type":"uint8"},{"internalType":"uint256","name":"harvestId","type":"uint256"},{"internalType":"bool[2]","name":"commonAmuletInitialHold","type":"bool[2]"}],"internalType":"struct DegenFarmBase.FarmRecord","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"getOneAmuletPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"getUsersTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32[]","name":"_weights","type":"uint32[]"}],"name":"getWeightedChoice","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_deployId","type":"uint256"}],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"creatureId","type":"uint256"}],"name":"isFarmingAllowedForCreature","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"landCount","outputs":[{"internalType":"uint16","name":"total","type":"uint16"},{"internalType":"uint16","name":"left","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"maxAmuletBalances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"parents","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceProvider","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"},{"internalType":"contract IERC20","name":"anyTokens","type":"address"},{"internalType":"address","name":"_admin","type":"address"}],"name":"reclaimToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"},{"internalType":"address","name":"oldOperator","type":"address"}],"name":"removeOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_index","type":"uint8"},{"internalType":"address","name":"_token","type":"address"}],"name":"setAmuletForOneCreature","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"}],"name":"setAmulets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_index","type":"uint8"},{"internalType":"address","name":"_token","type":"address"}],"name":"setOneCommonAmulet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_priceProvider","type":"address"}],"name":"setPriceProvider","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"},{"internalType":"address","name":"_newSigner","type":"address"}],"name":"setSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_itemId","type":"uint8"}],"name":"stakeOneTool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_itemId","type":"uint8"}],"name":"unstakeOneTool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userStakedTools","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040526200000e6200064f565b6200001862000654565b6001805461ffff9390920292909216600160a01b0261ffff60a01b199091161790556040805180820190915273126c121f99e1e211df2e5f8de2d96fa36647c855815273a0246c9032bc3a600820415ae600c6388619a14d6020820152620000849060029081620006e8565b506004805461ffff191690553480156200009d57600080fd5b506040516200515638038062005156833981016040819052620000c0916200075c565b858585858585620000d86301ffc9a760e01b62000659565b620000ea630271189760e51b62000659565b6000620000f6620006de565b600180546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350601a80546001600160a01b03199081166001600160a01b0389811691909117909255601b80548216888416179055601c80548216878416179055601d80548216868416179055601e805490911691841691909117905560005b620001a762000654565b61ffff168110156200033357604051806101000160405280620001cf6200064f60201b60201c565b61ffff168152602001620001e26200064f565b61ffff168152602001620001f562000654565b61ffff1681526020016200020862000654565b61ffff1681526001602082018190526040820152600060608201819052608090910152602382601481106200023957fe5b825191018054602084015160408501516060860151608087015160a088015160c089015160e09099015161ffff1990961661ffff9889161763ffff0000191662010000958916959095029490941761ffff60201b1916640100000000938816939093029290921761ffff60301b19166601000000000000918716919091021761ffff60401b191668010000000000000000918616919091021761ffff60501b19166a0100000000000000000000918516919091021761ffff60601b19166c01000000000000000000000000948416949094029390931761ffff60701b1916600160701b92909316919091029190911790556001016200019d565b5060405180604001604052806200034f620006e260201b60201c565b61ffff16815260200162000362620006e2565b61ffff9081169091528151601f80546020909401518316620100000263ffff00001992841661ffff19958616179290921691909117905560015460228054909316600160a01b909104909116179055600580546001600160a01b039092166001600160a01b031990921691909117905550620003de9350505050565b5050600680546001600160a01b031990811673d533a949740bb3306d119cc777fa900ba034cd5217909155600780548216731f9840a85d5af5bf1d1762f925bdaddc4201f98417905560088054821673fa5047c9c78b8877af97bdcb85db743fd7313d4a17905560098054821673dada00a9c23390112d08a1377cc59f7d03d9df55179055600a80548216736b3595068778dd592e39a122f4f5a5cf09c90fe2179055600b80548216730d8775f648430679a709e98d2b0cb6250d2887ef179055600c80548216733472a5a71965499acd81997a54bba8d852c6e53d179055600d80548216730d438f3b5175bebc262bf23753c1e53d03432bde179055600e80548216733155ba85d5f96b2d030a4966af206230e46849cb179055600f80548216737fc66500c84a76ad7e9c93437bfc5ac33e2ddae917905560108054821673c011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f17905560118054821673967da4048cd07ab37855c090aaf366e4ce1b9f48179055601280548216730f5d2fb29fb7d3cfee444a200298f468908cc94217905560138054821673514910771af9ca656af840dff83e8264ecf986ca179055601480548216735a98fcbea516cf06857215779fd812ca3bef1b32179055601580548216731f573d6fb3f13d689ff844b4ce37794d79a7ff1c179055601680548216739f8f72aa9304c8b593d555f12ef6589cc3a579a217905560178054821673111111111117dc0aa78b770fa6a738034120c302179055601880548216730bc529c00c6401aef6d220be8c6ea1667f6ad93e1790556019805490911673c00e94cb662c3520282e6f5717214004a7f26888179055506200080892505050565b606490565b601490565b6001600160e01b03198082161415620006b9576040805162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015290519081900360640190fd5b6001600160e01b0319166000908152602081905260409020805460ff19166001179055565b3390565b6109c490565b826002810192821562000733579160200282015b828111156200073357825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190620006fc565b506200074192915062000745565b5090565b5b8082111562000741576000815560010162000746565b60008060008060008060c0878903121562000775578182fd5b86516200078281620007ef565b60208801519096506200079581620007ef565b6040880151909550620007a881620007ef565b6060880151909450620007bb81620007ef565b6080880151909350620007ce81620007ef565b60a0880151909250620007e181620007ef565b809150509295509295509295565b6001600160a01b03811681146200080557600080fd5b50565b61493e80620008186000396000f3fe608060405234801561001057600080fd5b506004361061038e5760003560e01c80638f0af328116101de578063c2ca0ac51161010f578063d7bce658116100ad578063e6f014851161007c578063e6f0148514610759578063ec10abc61461076c578063f23a6e6114610774578063f2fde38b146107875761038e565b8063d7bce65814610715578063db4d627b1461072b578063ddc632621461073e578063e33f76cf146107515761038e565b8063c5e179ad116100e9578063c5e179ad146106e7578063c5e9cb91146106ef578063ca845f3914610404578063cd09e9f6146107025761038e565b8063c2ca0ac5146106ae578063c35cff74146106c1578063c45e615a146106d45761038e565b8063a22b40f31161017c578063b888879e11610156578063b888879e14610660578063b92a7a7814610668578063ba068a991461067b578063bc197c811461068e5761038e565b8063a22b40f31461063d578063af67aabd14610645578063b61303bc146106585761038e565b806393a10c6f116101b857806393a10c6f146105db57806397e80083146105e35780639d2f15a914610603578063a028e033146106165761038e565b80638f0af328146105a2578063913486be146105c8578063925e3cdf1461044c5761038e565b806358d7f240116102c35780637a50e9b311610261578063898572a611610230578063898572a6146105615780638a1af4c4146105745780638ba5c1aa146105875780638da5cb5b1461059a5761038e565b80637a50e9b3146105345780637b345af814610549578063816b4156146105515780638175494f146105595761038e565b8063715018a61161029d578063715018a61461050957806371dcbe3e1461051157806371fc26f614610519578063769d4f01146105215761038e565b806358d7f240146104d05780635e2624b1146104e35780636bbbae1a146104f65761038e565b80632b569b3a11610330578063372aa2241161030a578063372aa2241461048f57806340b61fe9146104a2578063509044be146104b557806350cc17e2146104c85761038e565b80632b569b3a1461044c57806336e33b1e1461046157806336e9332d146104765761038e565b806317f9fad11161036c57806317f9fad1146103ef5780631ef99772146104045780632189cee51461041957806322bcc2a21461042c5761038e565b806301ffc9a7146103935780630db2e7e7146103bc578063168c74a2146103dc575b600080fd5b6103a66103a1366004613f3a565b61079a565b6040516103b3919061435a565b60405180910390f35b6103cf6103ca366004613f84565b6107bd565b6040516103b391906140b5565b6103a66103ea366004613f84565b6107dd565b6104026103fd366004613b8e565b610908565b005b61040c6109cc565b6040516103b391906147e6565b610402610427366004613fd5565b6109d3565b61043f61043a366004613b56565b610a18565b6040516103b39190614316565b610454610c4a565b6040516103b39190614842565b610469610c4a565b6040516103b3919061477d565b61047e610c4f565b6040516103b39594939291906142c7565b61040261049d366004613b56565b610c7a565b6104026104b0366004613b8e565b610d06565b61043f6104c3366004613b56565b610d94565b61040c610e1f565b6104026104de366004613f02565b610e25565b6104546104f1366004613e6e565b610ea1565b61040c610504366004613b56565b610eac565b610402610eb7565b6103a6610f63565b6103a6610f6c565b6103cf61052f366004613fd5565b610f7a565b61053c610f85565b6040516103b39190614831565b61040c610f8a565b61040c610f9d565b61040c610fa2565b61040c61056f366004613f84565b610fa7565b610402610582366004613b8e565b610fb9565b610402610595366004613cf9565b611047565b6103cf61110e565b6105b56105b0366004613f84565b61111d565b6040516103b397969594939291906147ef565b6104026105d6366004613fd5565b61116f565b6104696111a9565b6105f66105f1366004613f84565b6111ae565b6040516103b391906146f6565b61043f610611366004613d6e565b6112a1565b610629610624366004613f84565b61156d565b6040516103b39897969594939291906147a1565b6104696115cf565b6103cf610653366004613f84565b6115d9565b6104696115e9565b6103cf6115fa565b610402610676366004613ff1565b61160f565b610402610689366004613d9b565b6116a5565b6106a161069c366004613bc6565b61176c565b6040516103b39190614365565b6104026106bc366004613f84565b611799565b6106296106cf366004613fd5565b61198c565b61040c6106e2366004613b56565b611a06565b61040c611a17565b61040c6106fd366004613d43565b611a1c565b610402610710366004613ff1565b611a41565b61071d611ab4565b6040516103b392919061478c565b610402610739366004613fb4565b611ac8565b61040261074c366004613f84565b611ffb565b6103cf6129db565b610402610767366004613f02565b6129ea565b610469612a5f565b6106a1610782366004613c80565b612a65565b610402610795366004613b56565b612a90565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b600681601481106107cd57600080fd5b01546001600160a01b0316905081565b601b54604051634f6a792b60e11b8152600091829182916001600160a01b031690639ed4f256906108129087906004016147e6565b604080518083038186803b15801561082957600080fd5b505afa15801561083d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610861919061400e565b909250905060008160ff16600381111561087757fe5b600381111561088257fe5b14156108b257600060238360ff166014811061089a57fe5b0154600160301b900461ffff161192506107b8915050565b60018160ff1660038111156108c357fe5b60038111156108ce57fe5b14156108fe57600060238360ff16601481106108e657fe5b0154600160501b900461ffff161192506107b8915050565b5060009392505050565b610910612b93565b6001600160a01b031661092161110e565b6001600160a01b03161461096a576040805162461bcd60e51b815260206004820181905260248201526000805160206148e9833981519152604482015290519081900360640190fd5b604051636c19e78360e01b81526001600160a01b03831690636c19e783906109969084906004016140b5565b600060405180830381600087803b1580156109b057600080fd5b505af11580156109c4573d6000803e3d6000fd5b505050505050565b62093a8081565b6109dc81612b97565b7f81bcbe81d98a7f4713702ff6023b3bae4ec14f50ee1318ce409ae6ab32b7cfd23382604051610a0d92919061421d565b60405180910390a150565b601b546040516370a0823160e01b81526060916000916001600160a01b03909116906370a0823190610a4e9086906004016140b5565b60206040518083038186803b158015610a6657600080fd5b505afa158015610a7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a9e9190613f9c565b90506060816001600160401b0381118015610ab857600080fd5b50604051908082528060200260200182016040528015610ae2578160200160208202803683370190505b5090506000805b838161ffff161015610bb057601b54604051632f745c5960e01b81526000916001600160a01b031690632f745c5990610b28908a9086906004016142f9565b60206040518083038186803b158015610b4057600080fd5b505afa158015610b54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b789190613f9c565b9050610b83816107dd565b15610ba75780848481518110610b9557fe5b60209081029190910101526001909201915b50600101610ae9565b506060816001600160401b0381118015610bc957600080fd5b50604051908082528060200260200182016040528015610bf3578160200160208202803683370190505b50905060005b828161ffff161015610c4057838161ffff1681518110610c1557fe5b6020026020010151828261ffff1681518110610c2d57fe5b6020908102919091010152600101610bf9565b5095945050505050565b601481565b601a54601b54601c54601d54601e546001600160a01b03948516949384169392831692918216911685565b610c82612b93565b6001600160a01b0316610c9361110e565b6001600160a01b031614610cdc576040805162461bcd60e51b815260206004820181905260248201526000805160206148e9833981519152604482015290519081900360640190fd5b600480546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b610d0e612b93565b6001600160a01b0316610d1f61110e565b6001600160a01b031614610d68576040805162461bcd60e51b815260206004820181905260248201526000805160206148e9833981519152604482015290519081900360640190fd5b6040516356452c2560e11b81526001600160a01b0383169063ac8a584a906109969084906004016140b5565b600554604051632848225f60e11b81526060916001600160a01b03169063509044be90610dc59085906004016140b5565b60006040518083038186803b158015610ddd57600080fd5b505afa158015610df1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e199190810190613dda565b92915050565b61271081565b610e2d612b93565b6001600160a01b0316610e3e61110e565b6001600160a01b031614610e87576040805162461bcd60e51b815260206004820181905260248201526000805160206148e9833981519152604482015290519081900360640190fd5b600480549115156101000261ff0019909216919091179055565b6000610e1982612cbb565b6000610e1982612cfd565b610ebf612b93565b6001600160a01b0316610ed061110e565b6001600160a01b031614610f19576040805162461bcd60e51b815260206004820181905260248201526000805160206148e9833981519152604482015290519081900360640190fd5b6001546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600180546001600160a01b0319169055565b60045460ff1681565b600454610100900460ff1681565b6000610e1982612d84565b60e681565b6e3025f39ef241c56cd2e7c40000000081565b600681565b600a81565b60386020526000908152604090205481565b610fc1612b93565b6001600160a01b0316610fd261110e565b6001600160a01b03161461101b576040805162461bcd60e51b815260206004820181905260248201526000805160206148e9833981519152604482015290519081900360640190fd5b604051634c386bff60e11b81526001600160a01b03831690639870d7fe906109969084906004016140b5565b61104f612b93565b6001600160a01b031661106061110e565b6001600160a01b0316146110a9576040805162461bcd60e51b815260206004820181905260248201526000805160206148e9833981519152604482015290519081900360640190fd5b604051632515bef360e21b81526001600160a01b03841690639456fbcc906110d790859085906004016140c9565b600060405180830381600087803b1580156110f157600080fd5b505af1158015611105573d6000803e3d6000fd5b50505050505050565b6001546001600160a01b031690565b6037818154811061112d57600080fd5b600091825260209091206008909102018054600182015460028301546003840154600485015460058601546006909601549496509294919390929160ff169087565b61117881612da7565b7f70642bc9f0ed98964ed422f19871fdc92dbf18b331ba96af251c203a81865ed03382604051610a0d92919061421d565b606481565b6111b661398d565b603782815481106111c357fe5b90600052602060002090600802016040518061010001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820160009054906101000a900460ff16600381111561122d57fe5b600381111561123857fe5b815260068201546020820152604080518082018083529190920191906007840190600290826000855b825461010083900a900460ff1615158152602060019283018181049485019490930390920291018084116112615790505050505050815250509050919050565b601b546040516370a0823160e01b81526060916000916001600160a01b03909116906370a08231906112d79087906004016140b5565b60206040518083038186803b1580156112ef57600080fd5b505afa158015611303573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113279190613f9c565b90506060816001600160401b038111801561134157600080fd5b5060405190808252806020026020018201604052801561136b578160200160208202803683370190505b5090506000805b838161ffff1610156114d257601b54604051632f745c5960e01b81526000916001600160a01b031690632f745c59906113b1908b9086906004016142f9565b60206040518083038186803b1580156113c957600080fd5b505afa1580156113dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114019190613f9c565b601b54604051634f6a792b60e11b815291925060009182916001600160a01b031690639ed4f256906114379086906004016147e6565b604080518083038186803b15801561144e57600080fd5b505afa158015611462573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611486919061400e565b915091508860ff168160ff161480156114a357506114a3836107dd565b156114c757828686815181106114b557fe5b60209081029190910101526001909401935b505050600101611372565b506060816001600160401b03811180156114eb57600080fd5b50604051908082528060200260200182016040528015611515578160200160208202803683370190505b50905060005b828161ffff16101561156257838161ffff168151811061153757fe5b6020026020010151828261ffff168151811061154f57fe5b602090810291909101015260010161151b565b509695505050505050565b6023816014811061157d57600080fd5b015461ffff80821692506201000082048116916401000000008104821691600160301b8204811691600160401b8104821691600160501b8204811691600160601b8104821691600160701b9091041688565b60225461ffff1681565b600281600281106107cd57600080fd5b600154600160a01b900461ffff1681565b6004546201000090046001600160a01b031681565b611617612b93565b6001600160a01b031661162861110e565b6001600160a01b031614611671576040805162461bcd60e51b815260206004820181905260248201526000805160206148e9833981519152604482015290519081900360640190fd5b8060028360ff166002811061168257fe5b0180546001600160a01b0319166001600160a01b03929092169190911790555050565b6116ad612b93565b6001600160a01b03166116be61110e565b6001600160a01b031614611707576040805162461bcd60e51b815260206004820181905260248201526000805160206148e9833981519152604482015290519081900360640190fd5b60005b818110156117675782828281811061171e57fe5b90506020020160208101906117339190613b56565b6006826014811061174057fe5b0180546001600160a01b0319166001600160a01b039290921691909117905560010161170a565b505050565b7f0c97e564f805a65e37a0fcb84efbbbe39f4706b80a2ff60cbbf3f0bceb572aac98975050505050505050565b6117a1612f26565b6117c65760405162461bcd60e51b81526004016117bd9061460a565b60405180910390fd5b600081116117e65760405162461bcd60e51b81526004016117bd90614442565b60088111156118075760405162461bcd60e51b81526004016117bd906144d3565b601d54604051636eb1769f60e11b815282916001600160a01b03169063dd62ed3e9061183990339030906004016140c9565b60206040518083038186803b15801561185157600080fd5b505afa158015611865573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118899190613f9c565b10156118a75760405162461bcd60e51b81526004016117bd90614641565b601d546040516323b872dd60e01b81526001600160a01b03909116906323b872dd906118db903390309086906004016140e3565b602060405180830381600087803b1580156118f557600080fd5b505af1158015611909573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061192d9190613f1e565b61193657600080fd5b6000423360405160200161194b929190614095565b6040516020818303038152906040528051906020012060001c905060005b828110156117675761197a82612f2f565b64010000000082049150600101611969565b600080600080600080600080600060238a60ff16601481106119aa57fe5b015461ffff8082169c62010000830482169c50640100000000830482169b50600160301b830482169a50600160401b830482169950600160501b830482169850600160601b830482169750600160701b90920416945092505050565b602080526000908152604090205481565b600281565b60216020528160005260406000208160068110611a3857600080fd5b01549150829050565b611a49612b93565b6001600160a01b0316611a5a61110e565b6001600160a01b031614611aa3576040805162461bcd60e51b815260206004820181905260248201526000805160206148e9833981519152604482015290519081900360640190fd5b8060068360ff166014811061168257fe5b601f5461ffff808216916201000090041682565b60045460ff610100909104161515600114611af55760405162461bcd60e51b81526004016117bd90614691565b601b546040516331a9108f60e11b815233916001600160a01b031690636352211e90611b259086906004016147e6565b60206040518083038186803b158015611b3d57600080fd5b505afa158015611b51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b759190613b72565b6001600160a01b031614611b9b5760405162461bcd60e51b81526004016117bd9061440b565b601a546040516331a9108f60e11b815233916001600160a01b031690636352211e90611bcb9085906004016147e6565b60206040518083038186803b158015611be357600080fd5b505afa158015611bf7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c1b9190613b72565b6001600160a01b031614611c415760405162461bcd60e51b81526004016117bd906145ab565b601b54604051634f6a792b60e11b815260009182916001600160a01b0390911690639ed4f25690611c769087906004016147e6565b604080518083038186803b158015611c8d57600080fd5b505afa158015611ca1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cc5919061400e565b909250905060008160ff166003811115611cdb57fe5b6003811115611ce657fe5b1480611d0b575060018160ff166003811115611cfe57fe5b6003811115611d0957fe5b145b611d275760405162461bcd60e51b81526004016117bd90614544565b60ff8116611d7057600060238360ff1660148110611d4157fe5b0154600160301b900461ffff1611611d6b5760405162461bcd60e51b81526004016117bd90614472565b611dac565b600060238360ff1660148110611d8257fe5b0154600160501b900461ffff1611611dac5760405162461bcd60e51b81526004016117bd906143df565b6037604051806101000160405280868152602001858152602001611dce613373565b42018152602001611df860068660ff1660148110611de857fe5b01546001600160a01b031661337a565b81526020016000815260200160006003811115611e1157fe5b815260200160008152602001611e2633613417565b90528154600181810184556000938452602093849020835160089093020191825592820151818401556040820151600282015560608201516003808301919091556080830151600483015560a0830151600583018054949593949193909260ff19909216918490811115611e9657fe5b021790555060c0820151600682015560e0820151611eba90600783019060026139e2565b50506005546037546040516340c10f1960e01b81526001600160a01b0390921692506340c10f1991611ef7913391600019909101906004016141cd565b600060405180830381600087803b158015611f1157600080fd5b505af1158015611f25573d6000803e3d6000fd5b5050601a546040516323b872dd60e01b81526001600160a01b0390911692506323b872dd9150611f5d903390309088906004016140e3565b600060405180830381600087803b158015611f7757600080fd5b505af1158015611f8b573d6000803e3d6000fd5b5050601b546040516323b872dd60e01b81526001600160a01b0390911692506323b872dd9150611fc3903390309089906004016140e3565b600060405180830381600087803b158015611fdd57600080fd5b505af1158015611ff1573d6000803e3d6000fd5b5050505050505050565b6005546040516331a9108f60e11b815233916001600160a01b031690636352211e9061202b9085906004016147e6565b60206040518083038186803b15801561204357600080fd5b505afa158015612057573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061207b9190613b72565b6001600160a01b0316146120a15760405162461bcd60e51b81526004016117bd906146c8565b6000603782815481106120b057fe5b9060005260206000209060080201905042816002015411156120e45760405162461bcd60e51b81526004016117bd906143b1565b60006120ee613a74565b601b548354604051634f6a792b60e11b815260009283926001600160a01b0390911691639ed4f25691612123916004016147e6565b604080518083038186803b15801561213a57600080fd5b505afa15801561214e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612172919061400e565b9150915060008160ff16600014156122415760238360ff166014811061219457fe5b0154600160301b900461ffff166121bb576121b0876000613518565b5050505050506129d8565b60238360ff16601481106121cb57fe5b015461ffff16602360ff8516601481106121e157fe5b0154606461ffff64010000000090920482160216816121fc57fe5b0461ffff169050600160238460ff166014811061221557fe5b01805461ffff600160601b80830482169094011690920261ffff60601b199092169190911790556122f6565b60238360ff166014811061225157fe5b0154600160501b900461ffff1661226d576121b0876000613518565b60238360ff166014811061227d57fe5b0154640100000000900461ffff16602360ff85166014811061229b57fe5b0154606461ffff600160401b90920482160216816122b557fe5b0461ffff169050600160238460ff16601481106122ce57fe5b01805461ffff600160701b80830482169094011690920261ffff60701b199092169190911790555b60005b60028160ff16101561236357866007018160ff166002811061231757fe5b602081049091015460ff601f9092166101000a9004168015612351575061233d33613417565b8160ff166002811061234b57fe5b60200201515b1561235b57600a85525b6001016122f9565b50600061237960068560ff1660148110611de857fe5b90506000876003015411801561238f5750600081115b801561239e5750866003015481115b156123bc576003870154606481830302816123b557fe5b0460208601525b6123df60068560ff16601481106123cf57fe5b01546001600160a01b0316613795565b60006020600060068760ff16601481106123f557fe5b01546001600160a01b0316815260208101919091526040016000205411156124f4576064600a6020600060068860ff166014811061242f57fe5b01546001600160a01b03168152602081019190915260400160002054600660ff88166014811061245b57fe5b01546040516370a0823160e01b81526001600160a01b03909116906370a082319061248a9033906004016140b5565b60206040518083038186803b1580156124a257600080fd5b505afa1580156124b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124da9190613f9c565b606402816124e457fe5b0402816124ed57fe5b0460608601525b6004870181905560006040860181905233815260216020525b336000526021602052600660ff821610156125e35733600090815260216020526040812060ff83166006811061253f57fe5b015411156125db57601c546040516302fb365760e41b81526001600160a01b0390911690632fb3657090612577908490600401614842565b60206040518083038186803b15801561258f57600080fd5b505afa1580156125a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125c79190613f62565b61ffff168660400151018660400181815250505b60010161250d565b5060408501516060860151602087015187510101016064811115612605575060645b60408051600280825260608083018452926020830190803683370190505090508160640184028160008151811061263857fe5b602002602001019063ffffffff16908163ffffffff16815250508060008151811061265f57fe5b6020026020010151612710038160018151811061267857fe5b602002602001019063ffffffff16908163ffffffff168152505061269b81612cbb565b60ff1661287257612710600186810160ff169182028c0160068c0155600091141561274c5760238760ff16601481106126d057fe5b0154600160301b900461ffff16602360ff8916601481106126ed57fe5b0154600161ffff6401000000009092048216929092038201169150602360ff89166014811061271857fe5b01805461ffff600160301b8083048216949094031690920267ffff00000000000019909216919091179055600298506127df565b6001860160ff16600214156127df5760238760ff166014811061276b57fe5b0154600160501b900461ffff16602360ff89166014811061278857fe5b0154600161ffff600160401b9092048216929092038201169150602360ff8916601481106127b257fe5b01805461ffff600160501b8083048216949094031690920261ffff60501b19909216919091179055600398505b601b5460405163e8c9a3b360e01b815260ff60018901908116612710028e01926001600160a01b03169163e8c9a3b39161282491339186918e919089906004016141e6565b600060405180830381600087803b15801561283e57600080fd5b505af1158015612852573d6000803e3d6000fd5b50508c5460009384526038602052604090932092909255506128ea915050565b601e546040516340c10f1960e01b81526001600160a01b03909116906340c10f19906128b39033906e3025f39ef241c56cd2e7c400000000906004016141cd565b600060405180830381600087803b1580156128cd57600080fd5b505af11580156128e1573d6000803e3d6000fd5b50505050600197505b601a5460018a0154604051630852cd8d60e31b81526001600160a01b03909216916342966c689161291d916004016147e6565b600060405180830381600087803b15801561293757600080fd5b505af115801561294b573d6000803e3d6000fd5b505050506129598a89613518565b897ff5a66c57fbd305be0d443b6c59e9e9fa8b47efe1c1fd3c6b9346e6cbefa73e87338a600381111561298857fe5b878b600001518c602001518d604001518e60600151896000815181106129aa57fe5b60200260200101516040516129c698979695949392919061427d565b60405180910390a25050505050505050505b50565b6005546001600160a01b031681565b6129f2612b93565b6001600160a01b0316612a0361110e565b6001600160a01b031614612a4c576040805162461bcd60e51b815260206004820181905260248201526000805160206148e9833981519152604482015290519081900360640190fd5b6004805460ff1916911515919091179055565b6109c481565b7ff23a6e612e1ff4830e658fe43f4e3cb4a5f8170bd5d9e69fb5d7a7fa9e4fdf979695505050505050565b612a98612b93565b6001600160a01b0316612aa961110e565b6001600160a01b031614612af2576040805162461bcd60e51b815260206004820181905260248201526000805160206148e9833981519152604482015290519081900360640190fd5b6001600160a01b038116612b375760405162461bcd60e51b81526004018080602001828103825260268152602001806148c36026913960400191505060405180910390fd5b6001546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b33600090815260216020526040812060ff831660068110612bb457fe5b015411612bd35760405162461bcd60e51b81526004016117bd9061437a565b612bdb613373565b33600090815260216020526040902060ff831660068110612bf857fe5b015442031015612c1a5760405162461bcd60e51b81526004016117bd9061449e565b33600090815260216020526040812060ff831660068110612c3757fe5b0155601c546040805180820182526001808252600360fc1b60208301529151637921219560e11b81526001600160a01b039093169263f242432a92612c86923092339288929091600401614107565b600060405180830381600087803b158015612ca057600080fd5b505af1158015612cb4573d6000803e3d6000fd5b5050505050565b6000804233604051602001612cd1929190614095565b6040516020818303038152906040528051906020012060001c9050612cf683826138bf565b9392505050565b600480546040516331a4bf1d60e21b8152600092620100009092046001600160a01b03169163c692fc7491612d34918691016140b5565b60206040518083038186803b158015612d4c57600080fd5b505afa158015612d60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e199190613f9c565b600060068260ff1660148110612d9657fe5b01546001600160a01b031692915050565b601c54604051627eeac760e11b81526001916001600160a01b03169062fdd58e90612dd8903390869060040161421d565b60206040518083038186803b158015612df057600080fd5b505afa158015612e04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e289190613f9c565b1015612e465760405162461bcd60e51b81526004016117bd90614503565b33600090815260216020526040902060ff821660068110612e6357fe5b015415612e825760405162461bcd60e51b81526004016117bd906145da565b601c546040805180820182526001808252600360fc1b60208301529151637921219560e11b81526001600160a01b039093169263f242432a92612ecf923392309288929091600401614107565b600060405180830381600087803b158015612ee957600080fd5b505af1158015612efd573d6000803e3d6000fd5b5050336000908152602160205260409020429250905060ff831660068110612f2157fe5b015550565b60045460ff1690565b602254601f5461ffff9182166201000090910482160116612f625760405162461bcd60e51b81526004016117bd9061457b565b604080516002808252606080830184529260208301908036833701905050602254815191925061ffff1660e602908290600090612f9b57fe5b602002602001019063ffffffff16908163ffffffff1681525050601f60000160029054906101000a900461ffff1661ffff1660640281600181518110612fdd57fe5b602002602001019063ffffffff16908163ffffffff1681525050600061300382846138bf565b9050620100008304925060ff8116158015906130295750601f5462010000900461ffff16155b15613032575060005b60ff8116613273576060613044613982565b61ffff166001600160401b038111801561305d57600080fd5b50604051908082528060200260200182016040528015613087578160200160208202803683370190505b50905060005b613095613982565b61ffff168160ff1610156130ef5760238160ff16601481106130b357fe5b015482516201000090910461ffff1690839060ff84169081106130d257fe5b63ffffffff9092166020928302919091019091015260010161308d565b506130fa81856138bf565b601b546022546001549294506001600160a01b039091169163e8c9a3b391339161ffff918216600160a01b90910490911603856000602360ff83166014811061313f57fe5b015462010000900461ffff16602360ff8a166014811061315b57fe5b01546040516001600160e01b031960e089901b16815261318f969594939261ffff9092169190910360010190600401614197565b600060405180830381600087803b1580156131a957600080fd5b505af11580156131bd573d6000803e3d6000fd5b50506022546001805460405161ffff938416600160a01b90920484169190910390921693507f4972baf25cecc38a5abfad268dff962e913acca50b17a5c710324863eb739b0f925061321391339190879061414e565b60405180910390a26022805461ffff19811661ffff918216600019019091161790556001602360ff84166014811061324757fe5b01805461ffff620100008083048216949094031690920263ffff00001990921691909117905550611767565b601a54601f546001600160a01b039091169063156e29f690339062010000900461ffff1661329f613987565b03866040518463ffffffff1660e01b81526004016132bf93929190614172565b600060405180830381600087803b1580156132d957600080fd5b505af11580156132ed573d6000803e3d6000fd5b5050601f5462010000900461ffff1691506133089050613987565b0361ffff167f4972baf25cecc38a5abfad268dff962e913acca50b17a5c710324863eb739b0f336000806040516133419392919061414e565b60405180910390a2601f805460001961ffff62010000808404821692909201160263ffff000019909116179055505050565b62093a8090565b600080826001600160a01b03166370a08231336040518263ffffffff1660e01b81526004016133a991906140b5565b60206040518083038186803b1580156133c157600080fd5b505afa1580156133d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133f99190613f9c565b111561340f5761340882612cfd565b90506107b8565b5060006107b8565b61341f613a9c565b613427613a9c565b60005b60028160ff16101561351157600060028260ff166002811061344857fe5b01546040516370a0823160e01b81526001600160a01b03909116906370a08231906134779088906004016140b5565b60206040518083038186803b15801561348f57600080fd5b505afa1580156134a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134c79190613f9c565b11156134ed576001828260ff16600281106134de57fe5b91151560209092020152613509565b6000828260ff16600281106134fe57fe5b911515602090920201525b60010161342a565b5092915050565b60006037838154811061352757fe5b90600052602060002090600802019050818160050160006101000a81548160ff0219169083600381111561355757fe5b0217905550601b5481546040516323b872dd60e01b81526001600160a01b03909216916323b872dd9161359091309133916004016140e3565b600060405180830381600087803b1580156135aa57600080fd5b505af11580156135be573d6000803e3d6000fd5b5050600554604051630852cd8d60e31b81526001600160a01b0390911692506342966c6891506135f29086906004016147e6565b600060405180830381600087803b15801561360c57600080fd5b505af1158015613620573d6000803e3d6000fd5b506000925061362d915050565b82600381111561363957fe5b141561176757601a5460018201546040516331a9108f60e11b815230926001600160a01b031691636352211e9161367391906004016147e6565b60206040518083038186803b15801561368b57600080fd5b505afa15801561369f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136c39190613b72565b6001600160a01b0316141561373c57601a5460018201546040516323b872dd60e01b81526001600160a01b03909216916323b872dd9161370991309133916004016140e3565b600060405180830381600087803b15801561372357600080fd5b505af1158015613737573d6000803e3d6000fd5b505050505b827ff5a66c57fbd305be0d443b6c59e9e9fa8b47efe1c1fd3c6b9346e6cbefa73e873384600381111561376b57fe5b600080600080600080604051613788989796959493929190614239565b60405180910390a2505050565b6001600160a01b0381166000818152602080526040908190205490516370a0823160e01b81529091906370a08231906137d29033906004016140b5565b60206040518083038186803b1580156137ea57600080fd5b505afa1580156137fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138229190613f9c565b11156129d8576040516370a0823160e01b81526001600160a01b038216906370a08231906138549033906004016140b5565b60206040518083038186803b15801561386c57600080fd5b505afa158015613880573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138a49190613f9c565b6001600160a01b038216600090815260208052604090205550565b600080805b84518160ff1610156138fe57848160ff16815181106138df57fe5b602002602001015163ffffffff168201915080806001019150506138c4565b50600081848161390a57fe5b06905060005b85518160ff16101561397657858160ff168151811061392b57fe5b602002602001015163ffffffff1682101561394a579250610e19915050565b858160ff168151811061395957fe5b602090810291909101015163ffffffff1690910390600101613910565b50600095945050505050565b601490565b6109c490565b6040518061010001604052806000815260200160008152602001600081526020016000815260200160008152602001600060038111156139c957fe5b8152602001600081526020016139dd613a9c565b905290565b600183019183908215613a645791602002820160005b83821115613a3557835183826101000a81548160ff02191690831515021790555092602001926001016020816000010492830192600103026139f8565b8015613a625782816101000a81549060ff0219169055600101602081600001049283019260010302613a35565b505b50613a70929150613aba565b5090565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b60405180604001604052806002906020820280368337509192915050565b5b80821115613a705760008155600101613abb565b60008083601f840112613ae0578182fd5b5081356001600160401b03811115613af6578182fd5b6020830191508360208083028501011115613b1057600080fd5b9250929050565b60008083601f840112613b28578182fd5b5081356001600160401b03811115613b3e578182fd5b602083019150836020828501011115613b1057600080fd5b600060208284031215613b67578081fd5b8135612cf681614890565b600060208284031215613b83578081fd5b8151612cf681614890565b60008060408385031215613ba0578081fd5b8235613bab81614890565b91506020830135613bbb81614890565b809150509250929050565b60008060008060008060008060a0898b031215613be1578384fd5b8835613bec81614890565b97506020890135613bfc81614890565b965060408901356001600160401b0380821115613c17578586fd5b613c238c838d01613acf565b909850965060608b0135915080821115613c3b578586fd5b613c478c838d01613acf565b909650945060808b0135915080821115613c5f578384fd5b50613c6c8b828c01613b17565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215613c98578182fd5b8635613ca381614890565b95506020870135613cb381614890565b9450604087013593506060870135925060808701356001600160401b03811115613cdb578283fd5b613ce789828a01613b17565b979a9699509497509295939492505050565b600080600060608486031215613d0d578283fd5b8335613d1881614890565b92506020840135613d2881614890565b91506040840135613d3881614890565b809150509250925092565b60008060408385031215613d55578182fd5b8235613d6081614890565b946020939093013593505050565b60008060408385031215613d80578182fd5b8235613d8b81614890565b91506020830135613bbb816148b3565b60008060208385031215613dad578182fd5b82356001600160401b03811115613dc2578283fd5b613dce85828601613acf565b90969095509350505050565b60006020808385031215613dec578182fd5b82516001600160401b03811115613e01578283fd5b8301601f81018513613e11578283fd5b8051613e24613e1f82614873565b614850565b8181528381019083850185840285018601891015613e40578687fd5b8694505b83851015613e62578051835260019490940193918501918501613e44565b50979650505050505050565b60006020808385031215613e80578182fd5b82356001600160401b03811115613e95578283fd5b8301601f81018513613ea5578283fd5b8035613eb3613e1f82614873565b8181528381019083850185840285018601891015613ecf578687fd5b8694505b83851015613e6257803563ffffffff81168114613eee578788fd5b835260019490940193918501918501613ed3565b600060208284031215613f13578081fd5b8135612cf6816148a5565b600060208284031215613f2f578081fd5b8151612cf6816148a5565b600060208284031215613f4b578081fd5b81356001600160e01b031981168114612cf6578182fd5b600060208284031215613f73578081fd5b815161ffff81168114612cf6578182fd5b600060208284031215613f95578081fd5b5035919050565b600060208284031215613fad578081fd5b5051919050565b60008060408385031215613fc6578182fd5b50508035926020909101359150565b600060208284031215613fe6578081fd5b8135612cf6816148b3565b60008060408385031215614003578182fd5b8235613bab816148b3565b60008060408385031215614020578182fd5b825161402b816148b3565b6020840151909250613bbb816148b3565b60008151808452815b8181101561406157602081850181015186830182015201614045565b818111156140725782602083870101525b50601f01601f19169290920160200192915050565b6004811061409157fe5b9052565b91825260601b6bffffffffffffffffffffffff1916602082015260340190565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0386811682528516602082015260ff841660408201526060810183905260a0608082018190526000906141439083018461403c565b979650505050505050565b6001600160a01b03939093168352901515602083015260ff16604082015260600190565b6001600160a01b0393909316835261ffff919091166020830152604082015260600190565b6001600160a01b0395909516855261ffff938416602086015260ff92831660408601529116606084015216608082015260a00190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b03959095168552602085019390935260ff918216604085015216606083015263ffffffff16608082015260a00190565b6001600160a01b0392909216825260ff16602082015260400190565b6001600160a01b0398909816885260ff96909616602088015260408701949094526060860192909252608085015260a084015260c083015260e08201526101000190565b6001600160a01b0398909816885260ff96909616602088015260408701949094526060860192909252608085015260a084015260c083015263ffffffff1660e08201526101000190565b6001600160a01b0395861681529385166020850152918416604084015283166060830152909116608082015260a00190565b6001600160a01b0392909216825261ffff16602082015260400190565b6020808252825182820181905260009190848201906040850190845b8181101561434e57835183529284019291840191600101614332565b50909695505050505050565b901515815260200190565b6001600160e01b031991909116815260200190565b6020808252601b908201527f5468697320746f6f6c206973206e6f74207374616b6564207965740000000000604082015260600190565b602080825260149082015273151bc819585c9b1e48199bdc881a185c9d995cdd60621b604082015260600190565b602080825260129082015271139bc81b5bdc9948111959d95b881b19599d60721b604082015260600190565b60208082526019908201527f4e65656420746f206265204372656174757265204f776e657200000000000000604082015260600190565b602080825260169082015275436f756e74206d75737420626520706f73697469766560501b604082015260600190565b602080825260129082015271139bc81b5bdc994818da18591cc81b19599d60721b604082015260600190565b6020808252818101527f43616e7420756e7374616b65206561726c696572207468616e2061207765656b604082015260600190565b602080825260169082015275436f756e74206d757374206c657373207468616e203960501b604082015260600190565b60208082526021908201527f596f75206d757374206f776e207468697320746f6f6c20666f72207374616b656040820152602160f81b606082015260800190565b6020808252601d908201527f43616e206661726d206f6e6c79204e6f726d696520616e642043686164000000604082015260600190565b602080825260169082015275536f7272792c206e6f206d6f72652072657665616c2160501b604082015260600190565b6020808252601590820152742732b2b2103a37903132902630b7321027bbb732b960591b604082015260600190565b602080825260169082015275151bdbdb081a5cc8185b1c9958591e481cdd185ad95960521b604082015260600190565b6020808252601f908201527f506c65617365207761697420666f722072657665616c20656e61626c65642e00604082015260600190565b60208082526030908201527f506c6561736520617070726f766520796f7572204241475320746f6b656e207460408201526f37903a3434b99031b7b73a3930b1ba1760811b606082015260800190565b6020808252601b908201527f4368696566204661726d6572206e6f7420656e61626c65207965740000000000604082015260600190565b60208082526014908201527354686973206973204e4f5420594f55522045474760601b604082015260600190565b600061012082019050825182526020808401518184015260408401516040840152606084015160608401526080840151608084015260a084015161473d60a0850182614087565b5060c084015160c084015260e084015160e0840160005b6002811015614773578251151582529183019190830190600101614754565b5050505092915050565b61ffff91909116815260200190565b61ffff92831681529116602082015260400190565b61ffff98891681529688166020880152948716604087015292861660608601529085166080850152841660a0840152831660c083015290911660e08201526101000190565b90815260200190565b600060e08201905088825287602083015286604083015285606083015284608083015261481f60a0830185614087565b8260c083015298975050505050505050565b63ffffffff91909116815260200190565b60ff91909116815260200190565b6040518181016001600160401b038111828210171561486b57fe5b604052919050565b60006001600160401b0382111561488657fe5b5060209081020190565b6001600160a01b03811681146129d857600080fd5b80151581146129d857600080fd5b60ff811681146129d857600080fdfe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a2646970667358221220e175be1ab3a6f19a4805fb2d63bad6dfe8cfcc986659a32b520a5856e645a32764736f6c63430007040033000000000000000000000000e1d05ad0de9690cb553bde0705bccd1ee983f924000000000000000000000000d227df494367a8b769b4bf2bbebd0388a8758741000000000000000000000000123456c13537c42f713fb748fb086344b825b38d000000000000000000000000baba0d970e735c7e48bba07c1164c4e0449ae9b8000000000000000000000000dada00a9c23390112d08a1377cc59f7d03d9df55000000000000000000000000edd50bece1a87f7b3104633f2c10a1b20c5f49fc
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061038e5760003560e01c80638f0af328116101de578063c2ca0ac51161010f578063d7bce658116100ad578063e6f014851161007c578063e6f0148514610759578063ec10abc61461076c578063f23a6e6114610774578063f2fde38b146107875761038e565b8063d7bce65814610715578063db4d627b1461072b578063ddc632621461073e578063e33f76cf146107515761038e565b8063c5e179ad116100e9578063c5e179ad146106e7578063c5e9cb91146106ef578063ca845f3914610404578063cd09e9f6146107025761038e565b8063c2ca0ac5146106ae578063c35cff74146106c1578063c45e615a146106d45761038e565b8063a22b40f31161017c578063b888879e11610156578063b888879e14610660578063b92a7a7814610668578063ba068a991461067b578063bc197c811461068e5761038e565b8063a22b40f31461063d578063af67aabd14610645578063b61303bc146106585761038e565b806393a10c6f116101b857806393a10c6f146105db57806397e80083146105e35780639d2f15a914610603578063a028e033146106165761038e565b80638f0af328146105a2578063913486be146105c8578063925e3cdf1461044c5761038e565b806358d7f240116102c35780637a50e9b311610261578063898572a611610230578063898572a6146105615780638a1af4c4146105745780638ba5c1aa146105875780638da5cb5b1461059a5761038e565b80637a50e9b3146105345780637b345af814610549578063816b4156146105515780638175494f146105595761038e565b8063715018a61161029d578063715018a61461050957806371dcbe3e1461051157806371fc26f614610519578063769d4f01146105215761038e565b806358d7f240146104d05780635e2624b1146104e35780636bbbae1a146104f65761038e565b80632b569b3a11610330578063372aa2241161030a578063372aa2241461048f57806340b61fe9146104a2578063509044be146104b557806350cc17e2146104c85761038e565b80632b569b3a1461044c57806336e33b1e1461046157806336e9332d146104765761038e565b806317f9fad11161036c57806317f9fad1146103ef5780631ef99772146104045780632189cee51461041957806322bcc2a21461042c5761038e565b806301ffc9a7146103935780630db2e7e7146103bc578063168c74a2146103dc575b600080fd5b6103a66103a1366004613f3a565b61079a565b6040516103b3919061435a565b60405180910390f35b6103cf6103ca366004613f84565b6107bd565b6040516103b391906140b5565b6103a66103ea366004613f84565b6107dd565b6104026103fd366004613b8e565b610908565b005b61040c6109cc565b6040516103b391906147e6565b610402610427366004613fd5565b6109d3565b61043f61043a366004613b56565b610a18565b6040516103b39190614316565b610454610c4a565b6040516103b39190614842565b610469610c4a565b6040516103b3919061477d565b61047e610c4f565b6040516103b39594939291906142c7565b61040261049d366004613b56565b610c7a565b6104026104b0366004613b8e565b610d06565b61043f6104c3366004613b56565b610d94565b61040c610e1f565b6104026104de366004613f02565b610e25565b6104546104f1366004613e6e565b610ea1565b61040c610504366004613b56565b610eac565b610402610eb7565b6103a6610f63565b6103a6610f6c565b6103cf61052f366004613fd5565b610f7a565b61053c610f85565b6040516103b39190614831565b61040c610f8a565b61040c610f9d565b61040c610fa2565b61040c61056f366004613f84565b610fa7565b610402610582366004613b8e565b610fb9565b610402610595366004613cf9565b611047565b6103cf61110e565b6105b56105b0366004613f84565b61111d565b6040516103b397969594939291906147ef565b6104026105d6366004613fd5565b61116f565b6104696111a9565b6105f66105f1366004613f84565b6111ae565b6040516103b391906146f6565b61043f610611366004613d6e565b6112a1565b610629610624366004613f84565b61156d565b6040516103b39897969594939291906147a1565b6104696115cf565b6103cf610653366004613f84565b6115d9565b6104696115e9565b6103cf6115fa565b610402610676366004613ff1565b61160f565b610402610689366004613d9b565b6116a5565b6106a161069c366004613bc6565b61176c565b6040516103b39190614365565b6104026106bc366004613f84565b611799565b6106296106cf366004613fd5565b61198c565b61040c6106e2366004613b56565b611a06565b61040c611a17565b61040c6106fd366004613d43565b611a1c565b610402610710366004613ff1565b611a41565b61071d611ab4565b6040516103b392919061478c565b610402610739366004613fb4565b611ac8565b61040261074c366004613f84565b611ffb565b6103cf6129db565b610402610767366004613f02565b6129ea565b610469612a5f565b6106a1610782366004613c80565b612a65565b610402610795366004613b56565b612a90565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b600681601481106107cd57600080fd5b01546001600160a01b0316905081565b601b54604051634f6a792b60e11b8152600091829182916001600160a01b031690639ed4f256906108129087906004016147e6565b604080518083038186803b15801561082957600080fd5b505afa15801561083d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610861919061400e565b909250905060008160ff16600381111561087757fe5b600381111561088257fe5b14156108b257600060238360ff166014811061089a57fe5b0154600160301b900461ffff161192506107b8915050565b60018160ff1660038111156108c357fe5b60038111156108ce57fe5b14156108fe57600060238360ff16601481106108e657fe5b0154600160501b900461ffff161192506107b8915050565b5060009392505050565b610910612b93565b6001600160a01b031661092161110e565b6001600160a01b03161461096a576040805162461bcd60e51b815260206004820181905260248201526000805160206148e9833981519152604482015290519081900360640190fd5b604051636c19e78360e01b81526001600160a01b03831690636c19e783906109969084906004016140b5565b600060405180830381600087803b1580156109b057600080fd5b505af11580156109c4573d6000803e3d6000fd5b505050505050565b62093a8081565b6109dc81612b97565b7f81bcbe81d98a7f4713702ff6023b3bae4ec14f50ee1318ce409ae6ab32b7cfd23382604051610a0d92919061421d565b60405180910390a150565b601b546040516370a0823160e01b81526060916000916001600160a01b03909116906370a0823190610a4e9086906004016140b5565b60206040518083038186803b158015610a6657600080fd5b505afa158015610a7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a9e9190613f9c565b90506060816001600160401b0381118015610ab857600080fd5b50604051908082528060200260200182016040528015610ae2578160200160208202803683370190505b5090506000805b838161ffff161015610bb057601b54604051632f745c5960e01b81526000916001600160a01b031690632f745c5990610b28908a9086906004016142f9565b60206040518083038186803b158015610b4057600080fd5b505afa158015610b54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b789190613f9c565b9050610b83816107dd565b15610ba75780848481518110610b9557fe5b60209081029190910101526001909201915b50600101610ae9565b506060816001600160401b0381118015610bc957600080fd5b50604051908082528060200260200182016040528015610bf3578160200160208202803683370190505b50905060005b828161ffff161015610c4057838161ffff1681518110610c1557fe5b6020026020010151828261ffff1681518110610c2d57fe5b6020908102919091010152600101610bf9565b5095945050505050565b601481565b601a54601b54601c54601d54601e546001600160a01b03948516949384169392831692918216911685565b610c82612b93565b6001600160a01b0316610c9361110e565b6001600160a01b031614610cdc576040805162461bcd60e51b815260206004820181905260248201526000805160206148e9833981519152604482015290519081900360640190fd5b600480546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b610d0e612b93565b6001600160a01b0316610d1f61110e565b6001600160a01b031614610d68576040805162461bcd60e51b815260206004820181905260248201526000805160206148e9833981519152604482015290519081900360640190fd5b6040516356452c2560e11b81526001600160a01b0383169063ac8a584a906109969084906004016140b5565b600554604051632848225f60e11b81526060916001600160a01b03169063509044be90610dc59085906004016140b5565b60006040518083038186803b158015610ddd57600080fd5b505afa158015610df1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e199190810190613dda565b92915050565b61271081565b610e2d612b93565b6001600160a01b0316610e3e61110e565b6001600160a01b031614610e87576040805162461bcd60e51b815260206004820181905260248201526000805160206148e9833981519152604482015290519081900360640190fd5b600480549115156101000261ff0019909216919091179055565b6000610e1982612cbb565b6000610e1982612cfd565b610ebf612b93565b6001600160a01b0316610ed061110e565b6001600160a01b031614610f19576040805162461bcd60e51b815260206004820181905260248201526000805160206148e9833981519152604482015290519081900360640190fd5b6001546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600180546001600160a01b0319169055565b60045460ff1681565b600454610100900460ff1681565b6000610e1982612d84565b60e681565b6e3025f39ef241c56cd2e7c40000000081565b600681565b600a81565b60386020526000908152604090205481565b610fc1612b93565b6001600160a01b0316610fd261110e565b6001600160a01b03161461101b576040805162461bcd60e51b815260206004820181905260248201526000805160206148e9833981519152604482015290519081900360640190fd5b604051634c386bff60e11b81526001600160a01b03831690639870d7fe906109969084906004016140b5565b61104f612b93565b6001600160a01b031661106061110e565b6001600160a01b0316146110a9576040805162461bcd60e51b815260206004820181905260248201526000805160206148e9833981519152604482015290519081900360640190fd5b604051632515bef360e21b81526001600160a01b03841690639456fbcc906110d790859085906004016140c9565b600060405180830381600087803b1580156110f157600080fd5b505af1158015611105573d6000803e3d6000fd5b50505050505050565b6001546001600160a01b031690565b6037818154811061112d57600080fd5b600091825260209091206008909102018054600182015460028301546003840154600485015460058601546006909601549496509294919390929160ff169087565b61117881612da7565b7f70642bc9f0ed98964ed422f19871fdc92dbf18b331ba96af251c203a81865ed03382604051610a0d92919061421d565b606481565b6111b661398d565b603782815481106111c357fe5b90600052602060002090600802016040518061010001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820160009054906101000a900460ff16600381111561122d57fe5b600381111561123857fe5b815260068201546020820152604080518082018083529190920191906007840190600290826000855b825461010083900a900460ff1615158152602060019283018181049485019490930390920291018084116112615790505050505050815250509050919050565b601b546040516370a0823160e01b81526060916000916001600160a01b03909116906370a08231906112d79087906004016140b5565b60206040518083038186803b1580156112ef57600080fd5b505afa158015611303573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113279190613f9c565b90506060816001600160401b038111801561134157600080fd5b5060405190808252806020026020018201604052801561136b578160200160208202803683370190505b5090506000805b838161ffff1610156114d257601b54604051632f745c5960e01b81526000916001600160a01b031690632f745c59906113b1908b9086906004016142f9565b60206040518083038186803b1580156113c957600080fd5b505afa1580156113dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114019190613f9c565b601b54604051634f6a792b60e11b815291925060009182916001600160a01b031690639ed4f256906114379086906004016147e6565b604080518083038186803b15801561144e57600080fd5b505afa158015611462573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611486919061400e565b915091508860ff168160ff161480156114a357506114a3836107dd565b156114c757828686815181106114b557fe5b60209081029190910101526001909401935b505050600101611372565b506060816001600160401b03811180156114eb57600080fd5b50604051908082528060200260200182016040528015611515578160200160208202803683370190505b50905060005b828161ffff16101561156257838161ffff168151811061153757fe5b6020026020010151828261ffff168151811061154f57fe5b602090810291909101015260010161151b565b509695505050505050565b6023816014811061157d57600080fd5b015461ffff80821692506201000082048116916401000000008104821691600160301b8204811691600160401b8104821691600160501b8204811691600160601b8104821691600160701b9091041688565b60225461ffff1681565b600281600281106107cd57600080fd5b600154600160a01b900461ffff1681565b6004546201000090046001600160a01b031681565b611617612b93565b6001600160a01b031661162861110e565b6001600160a01b031614611671576040805162461bcd60e51b815260206004820181905260248201526000805160206148e9833981519152604482015290519081900360640190fd5b8060028360ff166002811061168257fe5b0180546001600160a01b0319166001600160a01b03929092169190911790555050565b6116ad612b93565b6001600160a01b03166116be61110e565b6001600160a01b031614611707576040805162461bcd60e51b815260206004820181905260248201526000805160206148e9833981519152604482015290519081900360640190fd5b60005b818110156117675782828281811061171e57fe5b90506020020160208101906117339190613b56565b6006826014811061174057fe5b0180546001600160a01b0319166001600160a01b039290921691909117905560010161170a565b505050565b7f0c97e564f805a65e37a0fcb84efbbbe39f4706b80a2ff60cbbf3f0bceb572aac98975050505050505050565b6117a1612f26565b6117c65760405162461bcd60e51b81526004016117bd9061460a565b60405180910390fd5b600081116117e65760405162461bcd60e51b81526004016117bd90614442565b60088111156118075760405162461bcd60e51b81526004016117bd906144d3565b601d54604051636eb1769f60e11b815282916001600160a01b03169063dd62ed3e9061183990339030906004016140c9565b60206040518083038186803b15801561185157600080fd5b505afa158015611865573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118899190613f9c565b10156118a75760405162461bcd60e51b81526004016117bd90614641565b601d546040516323b872dd60e01b81526001600160a01b03909116906323b872dd906118db903390309086906004016140e3565b602060405180830381600087803b1580156118f557600080fd5b505af1158015611909573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061192d9190613f1e565b61193657600080fd5b6000423360405160200161194b929190614095565b6040516020818303038152906040528051906020012060001c905060005b828110156117675761197a82612f2f565b64010000000082049150600101611969565b600080600080600080600080600060238a60ff16601481106119aa57fe5b015461ffff8082169c62010000830482169c50640100000000830482169b50600160301b830482169a50600160401b830482169950600160501b830482169850600160601b830482169750600160701b90920416945092505050565b602080526000908152604090205481565b600281565b60216020528160005260406000208160068110611a3857600080fd5b01549150829050565b611a49612b93565b6001600160a01b0316611a5a61110e565b6001600160a01b031614611aa3576040805162461bcd60e51b815260206004820181905260248201526000805160206148e9833981519152604482015290519081900360640190fd5b8060068360ff166014811061168257fe5b601f5461ffff808216916201000090041682565b60045460ff610100909104161515600114611af55760405162461bcd60e51b81526004016117bd90614691565b601b546040516331a9108f60e11b815233916001600160a01b031690636352211e90611b259086906004016147e6565b60206040518083038186803b158015611b3d57600080fd5b505afa158015611b51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b759190613b72565b6001600160a01b031614611b9b5760405162461bcd60e51b81526004016117bd9061440b565b601a546040516331a9108f60e11b815233916001600160a01b031690636352211e90611bcb9085906004016147e6565b60206040518083038186803b158015611be357600080fd5b505afa158015611bf7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c1b9190613b72565b6001600160a01b031614611c415760405162461bcd60e51b81526004016117bd906145ab565b601b54604051634f6a792b60e11b815260009182916001600160a01b0390911690639ed4f25690611c769087906004016147e6565b604080518083038186803b158015611c8d57600080fd5b505afa158015611ca1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cc5919061400e565b909250905060008160ff166003811115611cdb57fe5b6003811115611ce657fe5b1480611d0b575060018160ff166003811115611cfe57fe5b6003811115611d0957fe5b145b611d275760405162461bcd60e51b81526004016117bd90614544565b60ff8116611d7057600060238360ff1660148110611d4157fe5b0154600160301b900461ffff1611611d6b5760405162461bcd60e51b81526004016117bd90614472565b611dac565b600060238360ff1660148110611d8257fe5b0154600160501b900461ffff1611611dac5760405162461bcd60e51b81526004016117bd906143df565b6037604051806101000160405280868152602001858152602001611dce613373565b42018152602001611df860068660ff1660148110611de857fe5b01546001600160a01b031661337a565b81526020016000815260200160006003811115611e1157fe5b815260200160008152602001611e2633613417565b90528154600181810184556000938452602093849020835160089093020191825592820151818401556040820151600282015560608201516003808301919091556080830151600483015560a0830151600583018054949593949193909260ff19909216918490811115611e9657fe5b021790555060c0820151600682015560e0820151611eba90600783019060026139e2565b50506005546037546040516340c10f1960e01b81526001600160a01b0390921692506340c10f1991611ef7913391600019909101906004016141cd565b600060405180830381600087803b158015611f1157600080fd5b505af1158015611f25573d6000803e3d6000fd5b5050601a546040516323b872dd60e01b81526001600160a01b0390911692506323b872dd9150611f5d903390309088906004016140e3565b600060405180830381600087803b158015611f7757600080fd5b505af1158015611f8b573d6000803e3d6000fd5b5050601b546040516323b872dd60e01b81526001600160a01b0390911692506323b872dd9150611fc3903390309089906004016140e3565b600060405180830381600087803b158015611fdd57600080fd5b505af1158015611ff1573d6000803e3d6000fd5b5050505050505050565b6005546040516331a9108f60e11b815233916001600160a01b031690636352211e9061202b9085906004016147e6565b60206040518083038186803b15801561204357600080fd5b505afa158015612057573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061207b9190613b72565b6001600160a01b0316146120a15760405162461bcd60e51b81526004016117bd906146c8565b6000603782815481106120b057fe5b9060005260206000209060080201905042816002015411156120e45760405162461bcd60e51b81526004016117bd906143b1565b60006120ee613a74565b601b548354604051634f6a792b60e11b815260009283926001600160a01b0390911691639ed4f25691612123916004016147e6565b604080518083038186803b15801561213a57600080fd5b505afa15801561214e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612172919061400e565b9150915060008160ff16600014156122415760238360ff166014811061219457fe5b0154600160301b900461ffff166121bb576121b0876000613518565b5050505050506129d8565b60238360ff16601481106121cb57fe5b015461ffff16602360ff8516601481106121e157fe5b0154606461ffff64010000000090920482160216816121fc57fe5b0461ffff169050600160238460ff166014811061221557fe5b01805461ffff600160601b80830482169094011690920261ffff60601b199092169190911790556122f6565b60238360ff166014811061225157fe5b0154600160501b900461ffff1661226d576121b0876000613518565b60238360ff166014811061227d57fe5b0154640100000000900461ffff16602360ff85166014811061229b57fe5b0154606461ffff600160401b90920482160216816122b557fe5b0461ffff169050600160238460ff16601481106122ce57fe5b01805461ffff600160701b80830482169094011690920261ffff60701b199092169190911790555b60005b60028160ff16101561236357866007018160ff166002811061231757fe5b602081049091015460ff601f9092166101000a9004168015612351575061233d33613417565b8160ff166002811061234b57fe5b60200201515b1561235b57600a85525b6001016122f9565b50600061237960068560ff1660148110611de857fe5b90506000876003015411801561238f5750600081115b801561239e5750866003015481115b156123bc576003870154606481830302816123b557fe5b0460208601525b6123df60068560ff16601481106123cf57fe5b01546001600160a01b0316613795565b60006020600060068760ff16601481106123f557fe5b01546001600160a01b0316815260208101919091526040016000205411156124f4576064600a6020600060068860ff166014811061242f57fe5b01546001600160a01b03168152602081019190915260400160002054600660ff88166014811061245b57fe5b01546040516370a0823160e01b81526001600160a01b03909116906370a082319061248a9033906004016140b5565b60206040518083038186803b1580156124a257600080fd5b505afa1580156124b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124da9190613f9c565b606402816124e457fe5b0402816124ed57fe5b0460608601525b6004870181905560006040860181905233815260216020525b336000526021602052600660ff821610156125e35733600090815260216020526040812060ff83166006811061253f57fe5b015411156125db57601c546040516302fb365760e41b81526001600160a01b0390911690632fb3657090612577908490600401614842565b60206040518083038186803b15801561258f57600080fd5b505afa1580156125a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125c79190613f62565b61ffff168660400151018660400181815250505b60010161250d565b5060408501516060860151602087015187510101016064811115612605575060645b60408051600280825260608083018452926020830190803683370190505090508160640184028160008151811061263857fe5b602002602001019063ffffffff16908163ffffffff16815250508060008151811061265f57fe5b6020026020010151612710038160018151811061267857fe5b602002602001019063ffffffff16908163ffffffff168152505061269b81612cbb565b60ff1661287257612710600186810160ff169182028c0160068c0155600091141561274c5760238760ff16601481106126d057fe5b0154600160301b900461ffff16602360ff8916601481106126ed57fe5b0154600161ffff6401000000009092048216929092038201169150602360ff89166014811061271857fe5b01805461ffff600160301b8083048216949094031690920267ffff00000000000019909216919091179055600298506127df565b6001860160ff16600214156127df5760238760ff166014811061276b57fe5b0154600160501b900461ffff16602360ff89166014811061278857fe5b0154600161ffff600160401b9092048216929092038201169150602360ff8916601481106127b257fe5b01805461ffff600160501b8083048216949094031690920261ffff60501b19909216919091179055600398505b601b5460405163e8c9a3b360e01b815260ff60018901908116612710028e01926001600160a01b03169163e8c9a3b39161282491339186918e919089906004016141e6565b600060405180830381600087803b15801561283e57600080fd5b505af1158015612852573d6000803e3d6000fd5b50508c5460009384526038602052604090932092909255506128ea915050565b601e546040516340c10f1960e01b81526001600160a01b03909116906340c10f19906128b39033906e3025f39ef241c56cd2e7c400000000906004016141cd565b600060405180830381600087803b1580156128cd57600080fd5b505af11580156128e1573d6000803e3d6000fd5b50505050600197505b601a5460018a0154604051630852cd8d60e31b81526001600160a01b03909216916342966c689161291d916004016147e6565b600060405180830381600087803b15801561293757600080fd5b505af115801561294b573d6000803e3d6000fd5b505050506129598a89613518565b897ff5a66c57fbd305be0d443b6c59e9e9fa8b47efe1c1fd3c6b9346e6cbefa73e87338a600381111561298857fe5b878b600001518c602001518d604001518e60600151896000815181106129aa57fe5b60200260200101516040516129c698979695949392919061427d565b60405180910390a25050505050505050505b50565b6005546001600160a01b031681565b6129f2612b93565b6001600160a01b0316612a0361110e565b6001600160a01b031614612a4c576040805162461bcd60e51b815260206004820181905260248201526000805160206148e9833981519152604482015290519081900360640190fd5b6004805460ff1916911515919091179055565b6109c481565b7ff23a6e612e1ff4830e658fe43f4e3cb4a5f8170bd5d9e69fb5d7a7fa9e4fdf979695505050505050565b612a98612b93565b6001600160a01b0316612aa961110e565b6001600160a01b031614612af2576040805162461bcd60e51b815260206004820181905260248201526000805160206148e9833981519152604482015290519081900360640190fd5b6001600160a01b038116612b375760405162461bcd60e51b81526004018080602001828103825260268152602001806148c36026913960400191505060405180910390fd5b6001546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b33600090815260216020526040812060ff831660068110612bb457fe5b015411612bd35760405162461bcd60e51b81526004016117bd9061437a565b612bdb613373565b33600090815260216020526040902060ff831660068110612bf857fe5b015442031015612c1a5760405162461bcd60e51b81526004016117bd9061449e565b33600090815260216020526040812060ff831660068110612c3757fe5b0155601c546040805180820182526001808252600360fc1b60208301529151637921219560e11b81526001600160a01b039093169263f242432a92612c86923092339288929091600401614107565b600060405180830381600087803b158015612ca057600080fd5b505af1158015612cb4573d6000803e3d6000fd5b5050505050565b6000804233604051602001612cd1929190614095565b6040516020818303038152906040528051906020012060001c9050612cf683826138bf565b9392505050565b600480546040516331a4bf1d60e21b8152600092620100009092046001600160a01b03169163c692fc7491612d34918691016140b5565b60206040518083038186803b158015612d4c57600080fd5b505afa158015612d60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e199190613f9c565b600060068260ff1660148110612d9657fe5b01546001600160a01b031692915050565b601c54604051627eeac760e11b81526001916001600160a01b03169062fdd58e90612dd8903390869060040161421d565b60206040518083038186803b158015612df057600080fd5b505afa158015612e04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e289190613f9c565b1015612e465760405162461bcd60e51b81526004016117bd90614503565b33600090815260216020526040902060ff821660068110612e6357fe5b015415612e825760405162461bcd60e51b81526004016117bd906145da565b601c546040805180820182526001808252600360fc1b60208301529151637921219560e11b81526001600160a01b039093169263f242432a92612ecf923392309288929091600401614107565b600060405180830381600087803b158015612ee957600080fd5b505af1158015612efd573d6000803e3d6000fd5b5050336000908152602160205260409020429250905060ff831660068110612f2157fe5b015550565b60045460ff1690565b602254601f5461ffff9182166201000090910482160116612f625760405162461bcd60e51b81526004016117bd9061457b565b604080516002808252606080830184529260208301908036833701905050602254815191925061ffff1660e602908290600090612f9b57fe5b602002602001019063ffffffff16908163ffffffff1681525050601f60000160029054906101000a900461ffff1661ffff1660640281600181518110612fdd57fe5b602002602001019063ffffffff16908163ffffffff1681525050600061300382846138bf565b9050620100008304925060ff8116158015906130295750601f5462010000900461ffff16155b15613032575060005b60ff8116613273576060613044613982565b61ffff166001600160401b038111801561305d57600080fd5b50604051908082528060200260200182016040528015613087578160200160208202803683370190505b50905060005b613095613982565b61ffff168160ff1610156130ef5760238160ff16601481106130b357fe5b015482516201000090910461ffff1690839060ff84169081106130d257fe5b63ffffffff9092166020928302919091019091015260010161308d565b506130fa81856138bf565b601b546022546001549294506001600160a01b039091169163e8c9a3b391339161ffff918216600160a01b90910490911603856000602360ff83166014811061313f57fe5b015462010000900461ffff16602360ff8a166014811061315b57fe5b01546040516001600160e01b031960e089901b16815261318f969594939261ffff9092169190910360010190600401614197565b600060405180830381600087803b1580156131a957600080fd5b505af11580156131bd573d6000803e3d6000fd5b50506022546001805460405161ffff938416600160a01b90920484169190910390921693507f4972baf25cecc38a5abfad268dff962e913acca50b17a5c710324863eb739b0f925061321391339190879061414e565b60405180910390a26022805461ffff19811661ffff918216600019019091161790556001602360ff84166014811061324757fe5b01805461ffff620100008083048216949094031690920263ffff00001990921691909117905550611767565b601a54601f546001600160a01b039091169063156e29f690339062010000900461ffff1661329f613987565b03866040518463ffffffff1660e01b81526004016132bf93929190614172565b600060405180830381600087803b1580156132d957600080fd5b505af11580156132ed573d6000803e3d6000fd5b5050601f5462010000900461ffff1691506133089050613987565b0361ffff167f4972baf25cecc38a5abfad268dff962e913acca50b17a5c710324863eb739b0f336000806040516133419392919061414e565b60405180910390a2601f805460001961ffff62010000808404821692909201160263ffff000019909116179055505050565b62093a8090565b600080826001600160a01b03166370a08231336040518263ffffffff1660e01b81526004016133a991906140b5565b60206040518083038186803b1580156133c157600080fd5b505afa1580156133d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133f99190613f9c565b111561340f5761340882612cfd565b90506107b8565b5060006107b8565b61341f613a9c565b613427613a9c565b60005b60028160ff16101561351157600060028260ff166002811061344857fe5b01546040516370a0823160e01b81526001600160a01b03909116906370a08231906134779088906004016140b5565b60206040518083038186803b15801561348f57600080fd5b505afa1580156134a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134c79190613f9c565b11156134ed576001828260ff16600281106134de57fe5b91151560209092020152613509565b6000828260ff16600281106134fe57fe5b911515602090920201525b60010161342a565b5092915050565b60006037838154811061352757fe5b90600052602060002090600802019050818160050160006101000a81548160ff0219169083600381111561355757fe5b0217905550601b5481546040516323b872dd60e01b81526001600160a01b03909216916323b872dd9161359091309133916004016140e3565b600060405180830381600087803b1580156135aa57600080fd5b505af11580156135be573d6000803e3d6000fd5b5050600554604051630852cd8d60e31b81526001600160a01b0390911692506342966c6891506135f29086906004016147e6565b600060405180830381600087803b15801561360c57600080fd5b505af1158015613620573d6000803e3d6000fd5b506000925061362d915050565b82600381111561363957fe5b141561176757601a5460018201546040516331a9108f60e11b815230926001600160a01b031691636352211e9161367391906004016147e6565b60206040518083038186803b15801561368b57600080fd5b505afa15801561369f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136c39190613b72565b6001600160a01b0316141561373c57601a5460018201546040516323b872dd60e01b81526001600160a01b03909216916323b872dd9161370991309133916004016140e3565b600060405180830381600087803b15801561372357600080fd5b505af1158015613737573d6000803e3d6000fd5b505050505b827ff5a66c57fbd305be0d443b6c59e9e9fa8b47efe1c1fd3c6b9346e6cbefa73e873384600381111561376b57fe5b600080600080600080604051613788989796959493929190614239565b60405180910390a2505050565b6001600160a01b0381166000818152602080526040908190205490516370a0823160e01b81529091906370a08231906137d29033906004016140b5565b60206040518083038186803b1580156137ea57600080fd5b505afa1580156137fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138229190613f9c565b11156129d8576040516370a0823160e01b81526001600160a01b038216906370a08231906138549033906004016140b5565b60206040518083038186803b15801561386c57600080fd5b505afa158015613880573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138a49190613f9c565b6001600160a01b038216600090815260208052604090205550565b600080805b84518160ff1610156138fe57848160ff16815181106138df57fe5b602002602001015163ffffffff168201915080806001019150506138c4565b50600081848161390a57fe5b06905060005b85518160ff16101561397657858160ff168151811061392b57fe5b602002602001015163ffffffff1682101561394a579250610e19915050565b858160ff168151811061395957fe5b602090810291909101015163ffffffff1690910390600101613910565b50600095945050505050565b601490565b6109c490565b6040518061010001604052806000815260200160008152602001600081526020016000815260200160008152602001600060038111156139c957fe5b8152602001600081526020016139dd613a9c565b905290565b600183019183908215613a645791602002820160005b83821115613a3557835183826101000a81548160ff02191690831515021790555092602001926001016020816000010492830192600103026139f8565b8015613a625782816101000a81549060ff0219169055600101602081600001049283019260010302613a35565b505b50613a70929150613aba565b5090565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b60405180604001604052806002906020820280368337509192915050565b5b80821115613a705760008155600101613abb565b60008083601f840112613ae0578182fd5b5081356001600160401b03811115613af6578182fd5b6020830191508360208083028501011115613b1057600080fd5b9250929050565b60008083601f840112613b28578182fd5b5081356001600160401b03811115613b3e578182fd5b602083019150836020828501011115613b1057600080fd5b600060208284031215613b67578081fd5b8135612cf681614890565b600060208284031215613b83578081fd5b8151612cf681614890565b60008060408385031215613ba0578081fd5b8235613bab81614890565b91506020830135613bbb81614890565b809150509250929050565b60008060008060008060008060a0898b031215613be1578384fd5b8835613bec81614890565b97506020890135613bfc81614890565b965060408901356001600160401b0380821115613c17578586fd5b613c238c838d01613acf565b909850965060608b0135915080821115613c3b578586fd5b613c478c838d01613acf565b909650945060808b0135915080821115613c5f578384fd5b50613c6c8b828c01613b17565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215613c98578182fd5b8635613ca381614890565b95506020870135613cb381614890565b9450604087013593506060870135925060808701356001600160401b03811115613cdb578283fd5b613ce789828a01613b17565b979a9699509497509295939492505050565b600080600060608486031215613d0d578283fd5b8335613d1881614890565b92506020840135613d2881614890565b91506040840135613d3881614890565b809150509250925092565b60008060408385031215613d55578182fd5b8235613d6081614890565b946020939093013593505050565b60008060408385031215613d80578182fd5b8235613d8b81614890565b91506020830135613bbb816148b3565b60008060208385031215613dad578182fd5b82356001600160401b03811115613dc2578283fd5b613dce85828601613acf565b90969095509350505050565b60006020808385031215613dec578182fd5b82516001600160401b03811115613e01578283fd5b8301601f81018513613e11578283fd5b8051613e24613e1f82614873565b614850565b8181528381019083850185840285018601891015613e40578687fd5b8694505b83851015613e62578051835260019490940193918501918501613e44565b50979650505050505050565b60006020808385031215613e80578182fd5b82356001600160401b03811115613e95578283fd5b8301601f81018513613ea5578283fd5b8035613eb3613e1f82614873565b8181528381019083850185840285018601891015613ecf578687fd5b8694505b83851015613e6257803563ffffffff81168114613eee578788fd5b835260019490940193918501918501613ed3565b600060208284031215613f13578081fd5b8135612cf6816148a5565b600060208284031215613f2f578081fd5b8151612cf6816148a5565b600060208284031215613f4b578081fd5b81356001600160e01b031981168114612cf6578182fd5b600060208284031215613f73578081fd5b815161ffff81168114612cf6578182fd5b600060208284031215613f95578081fd5b5035919050565b600060208284031215613fad578081fd5b5051919050565b60008060408385031215613fc6578182fd5b50508035926020909101359150565b600060208284031215613fe6578081fd5b8135612cf6816148b3565b60008060408385031215614003578182fd5b8235613bab816148b3565b60008060408385031215614020578182fd5b825161402b816148b3565b6020840151909250613bbb816148b3565b60008151808452815b8181101561406157602081850181015186830182015201614045565b818111156140725782602083870101525b50601f01601f19169290920160200192915050565b6004811061409157fe5b9052565b91825260601b6bffffffffffffffffffffffff1916602082015260340190565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0386811682528516602082015260ff841660408201526060810183905260a0608082018190526000906141439083018461403c565b979650505050505050565b6001600160a01b03939093168352901515602083015260ff16604082015260600190565b6001600160a01b0393909316835261ffff919091166020830152604082015260600190565b6001600160a01b0395909516855261ffff938416602086015260ff92831660408601529116606084015216608082015260a00190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b03959095168552602085019390935260ff918216604085015216606083015263ffffffff16608082015260a00190565b6001600160a01b0392909216825260ff16602082015260400190565b6001600160a01b0398909816885260ff96909616602088015260408701949094526060860192909252608085015260a084015260c083015260e08201526101000190565b6001600160a01b0398909816885260ff96909616602088015260408701949094526060860192909252608085015260a084015260c083015263ffffffff1660e08201526101000190565b6001600160a01b0395861681529385166020850152918416604084015283166060830152909116608082015260a00190565b6001600160a01b0392909216825261ffff16602082015260400190565b6020808252825182820181905260009190848201906040850190845b8181101561434e57835183529284019291840191600101614332565b50909695505050505050565b901515815260200190565b6001600160e01b031991909116815260200190565b6020808252601b908201527f5468697320746f6f6c206973206e6f74207374616b6564207965740000000000604082015260600190565b602080825260149082015273151bc819585c9b1e48199bdc881a185c9d995cdd60621b604082015260600190565b602080825260129082015271139bc81b5bdc9948111959d95b881b19599d60721b604082015260600190565b60208082526019908201527f4e65656420746f206265204372656174757265204f776e657200000000000000604082015260600190565b602080825260169082015275436f756e74206d75737420626520706f73697469766560501b604082015260600190565b602080825260129082015271139bc81b5bdc994818da18591cc81b19599d60721b604082015260600190565b6020808252818101527f43616e7420756e7374616b65206561726c696572207468616e2061207765656b604082015260600190565b602080825260169082015275436f756e74206d757374206c657373207468616e203960501b604082015260600190565b60208082526021908201527f596f75206d757374206f776e207468697320746f6f6c20666f72207374616b656040820152602160f81b606082015260800190565b6020808252601d908201527f43616e206661726d206f6e6c79204e6f726d696520616e642043686164000000604082015260600190565b602080825260169082015275536f7272792c206e6f206d6f72652072657665616c2160501b604082015260600190565b6020808252601590820152742732b2b2103a37903132902630b7321027bbb732b960591b604082015260600190565b602080825260169082015275151bdbdb081a5cc8185b1c9958591e481cdd185ad95960521b604082015260600190565b6020808252601f908201527f506c65617365207761697420666f722072657665616c20656e61626c65642e00604082015260600190565b60208082526030908201527f506c6561736520617070726f766520796f7572204241475320746f6b656e207460408201526f37903a3434b99031b7b73a3930b1ba1760811b606082015260800190565b6020808252601b908201527f4368696566204661726d6572206e6f7420656e61626c65207965740000000000604082015260600190565b60208082526014908201527354686973206973204e4f5420594f55522045474760601b604082015260600190565b600061012082019050825182526020808401518184015260408401516040840152606084015160608401526080840151608084015260a084015161473d60a0850182614087565b5060c084015160c084015260e084015160e0840160005b6002811015614773578251151582529183019190830190600101614754565b5050505092915050565b61ffff91909116815260200190565b61ffff92831681529116602082015260400190565b61ffff98891681529688166020880152948716604087015292861660608601529085166080850152841660a0840152831660c083015290911660e08201526101000190565b90815260200190565b600060e08201905088825287602083015286604083015285606083015284608083015261481f60a0830185614087565b8260c083015298975050505050505050565b63ffffffff91909116815260200190565b60ff91909116815260200190565b6040518181016001600160401b038111828210171561486b57fe5b604052919050565b60006001600160401b0382111561488657fe5b5060209081020190565b6001600160a01b03811681146129d857600080fd5b80151581146129d857600080fd5b60ff811681146129d857600080fdfe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a2646970667358221220e175be1ab3a6f19a4805fb2d63bad6dfe8cfcc986659a32b520a5856e645a32764736f6c63430007040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000e1d05ad0de9690cb553bde0705bccd1ee983f924000000000000000000000000d227df494367a8b769b4bf2bbebd0388a8758741000000000000000000000000123456c13537c42f713fb748fb086344b825b38d000000000000000000000000baba0d970e735c7e48bba07c1164c4e0449ae9b8000000000000000000000000dada00a9c23390112d08a1377cc59f7d03d9df55000000000000000000000000edd50bece1a87f7b3104633f2c10a1b20c5f49fc
-----Decoded View---------------
Arg [0] : _land (address): 0xE1D05aD0DE9690Cb553Bde0705Bccd1Ee983F924
Arg [1] : _creatures (address): 0xd227DF494367a8B769b4bf2bbEBd0388A8758741
Arg [2] : _inventory (address): 0x123456C13537C42F713FB748FB086344b825b38d
Arg [3] : _bagstoken (address): 0xBABA0d970e735c7E48bba07C1164c4e0449AE9b8
Arg [4] : _dungtoken (address): 0xDADA00A9C23390112D08a1377cc59f7d03D9df55
Arg [5] : _eggs (address): 0xEDD50BeCE1a87F7b3104633f2C10a1b20C5F49fC
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 000000000000000000000000e1d05ad0de9690cb553bde0705bccd1ee983f924
Arg [1] : 000000000000000000000000d227df494367a8b769b4bf2bbebd0388a8758741
Arg [2] : 000000000000000000000000123456c13537c42f713fb748fb086344b825b38d
Arg [3] : 000000000000000000000000baba0d970e735c7e48bba07c1164c4e0449ae9b8
Arg [4] : 000000000000000000000000dada00a9c23390112d08a1377cc59f7d03d9df55
Arg [5] : 000000000000000000000000edd50bece1a87f7b3104633f2c10a1b20c5f49fc
Deployed Bytecode Sourcemap
183:3158:2:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;965:148:5;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4393:47:3;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;30839:479::-;;;;;;:::i;:::-;;:::i;17727:142::-;;;;;;:::i;:::-;;:::i;:::-;;320:54:2;;;:::i;:::-;;;;;;;:::i;16010:132:3:-;;;;;;:::i;:::-;;:::i;29278:701::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;226:47:2:-;;;:::i;:::-;;;;;;;:::i;494:::-;;;:::i;:::-;;;;;;;:::i;4474:44:3:-;;;:::i;:::-;;;;;;;;;;;:::i;16761:116::-;;;;;;:::i;:::-;;:::i;17390:154::-;;;;;;:::i;:::-;;:::i;28888:132::-;;;;;;:::i;:::-;;:::i;3652:50::-;;;:::i;16991:104::-;;;;;;:::i;:::-;;:::i;18868:134::-;;;;;;:::i;:::-;;:::i;19387:125::-;;;;;;:::i;:::-;;:::i;1710:145:19:-;;;:::i;4241:38:3:-;;;:::i;4285:::-;;;:::i;17937:139::-;;;;;;:::i;:::-;;:::i;3512:45::-;;;:::i;:::-;;;;;;;:::i;3754:51::-;;;:::i;3958:43::-;;;:::i;3834:59::-;;;:::i;4952:36::-;;;;;;:::i;:::-;;:::i;17236:148::-;;;;;;:::i;:::-;;:::i;17551:170::-;;;;;;:::i;:::-;;:::i;1078:85:19:-;;;:::i;4919:27:3:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;:::i;15785:127::-;;;;;;:::i;:::-;;:::i;438:50:2:-;;;:::i;19252:129:3:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;29985:848::-;;;;;;:::i;:::-;;:::i;4853:60::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;:::i;4817:30::-;;;:::i;4039:195::-;;;;;;:::i;:::-;;:::i;3563:83::-;;;:::i;4329:28::-;;;:::i;16322:125::-;;;;;;:::i;:::-;;:::i;16582:173::-;;;;;;:::i;:::-;;:::i;28086:352::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;6668:825::-;;;;;;:::i;:::-;;:::i;18217:645::-;;;;;;:::i;:::-;;:::i;4580:52::-;;;;;;:::i;:::-;;:::i;3899:53::-;;;:::i;4742:67::-;;;;;;:::i;:::-;;:::i;16453:123::-;;;;;;:::i;:::-;;:::i;4524:49::-;;;:::i;:::-;;;;;;;;:::i;7735:1840::-;;;;;;:::i;:::-;;:::i;9730:5923::-;;;;;;:::i;:::-;;:::i;4363:19::-;;;:::i;16883:102::-;;;;;;:::i;:::-;;:::i;547:40:2:-;;;:::i;26776:318:3:-;;;;;;:::i;:::-;;:::i;2004:240:19:-;;;;;;:::i;:::-;;:::i;965:148:5:-;-1:-1:-1;;;;;;1073:33:5;;1050:4;1073:33;;;;;;;;;;;;;965:148;;;;:::o;4393:47:3:-;;;;;;;;;;;;;;-1:-1:-1;;;;;4393:47:3;;-1:-1:-1;4393:47:3;:::o;30839:479::-;30971:14;;30960:55;;-1:-1:-1;;;30960:55:3;;30914:4;;;;;;-1:-1:-1;;;;;30971:14:3;;30960:43;;:55;;31004:10;;30960:55;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30930:85;;-1:-1:-1;30930:85:3;-1:-1:-1;31064:13:3;31053:6;31030:30;;;;;;;;;;:47;;;;;;;;;31026:128;;;31142:1;31100:13;31114:5;31100:20;;;;;;;;;;:39;-1:-1:-1;;;31100:39:3;;;;:43;;-1:-1:-1;31093:50:3;;-1:-1:-1;;31093:50:3;31026:128;31201:11;31190:6;31167:30;;;;;;;;;;:45;;;;;;;;;31163:127;;;31278:1;31235:13;31249:5;31235:20;;;;;;;;;;:40;-1:-1:-1;;;31235:40:3;;;;:44;;-1:-1:-1;31228:51:3;;-1:-1:-1;;31228:51:3;31163:127;-1:-1:-1;31306:5:3;;30839:479;-1:-1:-1;;;30839:479:3:o;17727:142::-;1301:12:19;:10;:12::i;:::-;-1:-1:-1;;;;;1290:23:19;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1290:23:19;;1282:68;;;;;-1:-1:-1;;;1282:68:19;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1282:68:19;;;;;;;;;;;;;;;17814:48:3::1;::::0;-1:-1:-1;;;17814:48:3;;-1:-1:-1;;;;;17814:36:3;::::1;::::0;::::1;::::0;:48:::1;::::0;17851:10;;17814:48:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;17727:142:::0;;:::o;320:54:2:-;365:9;320:54;:::o;16010:132:3:-;16068:24;16084:7;16068:15;:24::i;:::-;16107:28;16115:10;16127:7;16107:28;;;;;;;:::i;:::-;;;;;;;;16010:132;:::o;29278:701::-;29404:14;;29393:44;;-1:-1:-1;;;29393:44:3;;29353:16;;29381:9;;-1:-1:-1;;;;;29404:14:3;;;;29393:36;;:44;;29430:6;;29393:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29381:56;;29448:23;29488:1;-1:-1:-1;;;;;29474:16:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29474:16:3;;29448:42;;29500:13;29533:8;29528:273;29551:1;29547;:5;;;29528:273;;;29602:14;;29591:57;;-1:-1:-1;;;29591:57:3;;29573:15;;-1:-1:-1;;;;;29602:14:3;;29591:46;;:57;;29638:6;;29646:1;;29591:57;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29573:75;;29666:39;29694:10;29666:27;:39::i;:::-;29662:129;;;29741:10;29725:6;29732:5;29725:13;;;;;;;;;;;;;;;;;:26;29769:7;;;;;29662:129;-1:-1:-1;29554:3:3;;29528:273;;;;29810:24;29851:5;-1:-1:-1;;;;;29837:20:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29837:20:3;;29810:47;;29872:8;29867:82;29890:5;29886:1;:9;;;29867:82;;;29929:6;29936:1;29929:9;;;;;;;;;;;;;;;;29916:7;29924:1;29916:10;;;;;;;;;;;;;;;;;;;:22;29897:3;;29867:82;;;-1:-1:-1;29965:7:3;29278:701;-1:-1:-1;;;;;29278:701:3:o;226:47:2:-;271:2;226:47;:::o;4474:44:3:-;;;;;;;;;;;-1:-1:-1;;;;;4474:44:3;;;;;;;;;;;;;;;;;;:::o;16761:116::-;1301:12:19;:10;:12::i;:::-;-1:-1:-1;;;;;1290:23:19;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1290:23:19;;1282:68;;;;;-1:-1:-1;;;1282:68:19;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1282:68:19;;;;;;;;;;;;;;;16840:13:3::1;:30:::0;;-1:-1:-1;;;;;16840:30:3;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;16840:30:3;;::::1;::::0;;;::::1;::::0;;16761:116::o;17390:154::-;1301:12:19;:10;:12::i;:::-;-1:-1:-1;;;;;1290:23:19;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1290:23:19;;1282:68;;;;;-1:-1:-1;;;1282:68:19;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1282:68:19;;;;;;;;;;;;;;;17483:54:3::1;::::0;-1:-1:-1;;;17483:54:3;;-1:-1:-1;;;;;17483:41:3;::::1;::::0;::::1;::::0;:54:::1;::::0;17525:11;;17483:54:::1;;;:::i;28888:132::-:0;28986:4;;:27;;-1:-1:-1;;;28986:27:3;;28951:16;;-1:-1:-1;;;;;28986:4:3;;:19;;:27;;29006:6;;28986:27;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28986:27:3;;;;;;;;;;;;:::i;:::-;28979:34;28888:132;-1:-1:-1;;28888:132:3:o;3652:50::-;3697:5;3652:50;:::o;16991:104::-;1301:12:19;:10;:12::i;:::-;-1:-1:-1;;;;;1290:23:19;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1290:23:19;;1282:68;;;;;-1:-1:-1;;;1282:68:19;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1282:68:19;;;;;;;;;;;;;;;17060:15:3::1;:28:::0;;;::::1;;;;-1:-1:-1::0;;17060:28:3;;::::1;::::0;;;::::1;::::0;;16991:104::o;18868:134::-;18944:5;18967:28;18986:8;18967:18;:28::i;19387:125::-;19453:7;19479:26;19498:6;19479:18;:26::i;1710:145:19:-;1301:12;:10;:12::i;:::-;-1:-1:-1;;;;;1290:23:19;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1290:23:19;;1282:68;;;;;-1:-1:-1;;;1282:68:19;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1282:68:19;;;;;;;;;;;;;;;1800:6:::1;::::0;1779:40:::1;::::0;1816:1:::1;::::0;-1:-1:-1;;;;;1800:6:19::1;::::0;1779:40:::1;::::0;1816:1;;1779:40:::1;1829:6;:19:::0;;-1:-1:-1;;;;;;1829:19:19::1;::::0;;1710:145::o;4241:38:3:-;;;;;;:::o;4285:::-;;;;;;;;;:::o;17937:139::-;18009:7;18035:34;18055:13;18035:19;:34::i;3512:45::-;3554:3;3512:45;:::o;3754:51::-;3799:6;3754:51;:::o;3958:43::-;4000:1;3958:43;:::o;3834:59::-;3891:2;3834:59;:::o;4952:36::-;;;;;;;;;;;;;:::o;17236:148::-;1301:12:19;:10;:12::i;:::-;-1:-1:-1;;;;;1290:23:19;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1290:23:19;;1282:68;;;;;-1:-1:-1;;;1282:68:19;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1282:68:19;;;;;;;;;;;;;;;17326:51:3::1;::::0;-1:-1:-1;;;17326:51:3;;-1:-1:-1;;;;;17326:38:3;::::1;::::0;::::1;::::0;:51:::1;::::0;17365:11;;17326:51:::1;;;:::i;17551:170::-:0;1301:12:19;:10;:12::i;:::-;-1:-1:-1;;;;;1290:23:19;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1290:23:19;;1282:68;;;;;-1:-1:-1;;;1282:68:19;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1282:68:19;;;;;;;;;;;;;;;17655:59:3::1;::::0;-1:-1:-1;;;17655:59:3;;-1:-1:-1;;;;;17655:40:3;::::1;::::0;::::1;::::0;:59:::1;::::0;17696:9;;17707:6;;17655:59:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;17551:170:::0;;;:::o;1078:85:19:-;1150:6;;-1:-1:-1;;;;;1150:6:19;1078:85;:::o;4919:27:3:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4919:27:3;;;;;;;;;;;:::o;15785:127::-;15841:22;15855:7;15841:13;:22::i;:::-;15879:26;15885:10;15897:7;15879:26;;;;;;;:::i;438:50:2:-;485:3;438:50;:::o;19252:129:3:-;19319:17;;:::i;:::-;19355:7;19363:10;19355:19;;;;;;;;;;;;;;;;;;19348:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19348:26:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19252:129;;;:::o;29985:848::-;30139:14;;30128:44;;-1:-1:-1;;;30128:44:3;;30088:16;;30116:9;;-1:-1:-1;;;;;30139:14:3;;;;30128:36;;:44;;30165:6;;30128:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30116:56;;30183:23;30223:1;-1:-1:-1;;;;;30209:16:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30209:16:3;;30183:42;;30235:13;30268:8;30263:392;30286:1;30282;:5;;;30263:392;;;30337:14;;30326:57;;-1:-1:-1;;;30326:57:3;;30308:15;;-1:-1:-1;;;;;30337:14:3;;30326:46;;:57;;30373:6;;30381:1;;30326:57;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30434:14;;30423:55;;-1:-1:-1;;;30423:55:3;;30308:75;;-1:-1:-1;30398:7:3;;;;-1:-1:-1;;;;;30434:14:3;;30423:43;;:55;;30308:75;;30423:55;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30397:81;;;;30506:10;30496:20;;:6;:20;;;:63;;;;;30520:39;30548:10;30520:27;:39::i;:::-;30492:153;;;30595:10;30579:6;30586:5;30579:13;;;;;;;;;;;;;;;;;:26;30623:7;;;;;30492:153;-1:-1:-1;;;30289:3:3;;30263:392;;;;30664:24;30705:5;-1:-1:-1;;;;;30691:20:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30691:20:3;;30664:47;;30726:8;30721:82;30744:5;30740:1;:9;;;30721:82;;;30783:6;30790:1;30783:9;;;;;;;;;;;;;;;;30770:7;30778:1;30770:10;;;;;;;;;;;;;;;;;;;:22;30751:3;;30721:82;;;-1:-1:-1;30819:7:3;29985:848;-1:-1:-1;;;;;;29985:848:3:o;4853:60::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;4853:60:3;;;;;;;;;;;;-1:-1:-1;;;4853:60:3;;;;;-1:-1:-1;;;4853:60:3;;;;;-1:-1:-1;;;4853:60:3;;;;;-1:-1:-1;;;4853:60:3;;;;;-1:-1:-1;;;4853:60:3;;;;;:::o;4817:30::-;;;;;;:::o;4039:195::-;;;;;;;;;;;3563:83;;;-1:-1:-1;;;3563:83:3;;;;;:::o;4329:28::-;;;;;;-1:-1:-1;;;;;4329:28:3;;:::o;16322:125::-;1301:12:19;:10;:12::i;:::-;-1:-1:-1;;;;;1290:23:19;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1290:23:19;;1282:68;;;;;-1:-1:-1;;;1282:68:19;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1282:68:19;;;;;;;;;;;;;;;16434:6:3::1;16409:14;16424:6;16409:22;;;;;;;;;;:31:::0;;-1:-1:-1;;;;;;16409:31:3::1;-1:-1:-1::0;;;;;16409:31:3;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;16322:125:3:o;16582:173::-;1301:12:19;:10;:12::i;:::-;-1:-1:-1;;;;;1290:23:19;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1290:23:19;;1282:68;;;;;-1:-1:-1;;;1282:68:19;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1282:68:19;;;;;;;;;;;;;;;16664:6:3::1;16659:90;16676:18:::0;;::::1;16659:90;;;16728:7;;16736:1;16728:10;;;;;;;;;;;;;;;;;;;;:::i;:::-;16715:7;16723:1;16715:10;;;;;;;;:23:::0;;-1:-1:-1;;;;;;16715:23:3::1;-1:-1:-1::0;;;;;16715:23:3;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;16696:3:3::1;16659:90;;;;16582:173:::0;;:::o;28086:352::-;28354:74;28086:352;;;;;;;;;;:::o;6668:825::-;6723:17;:15;:17::i;:::-;6715:61;;;;-1:-1:-1;;;6715:61:3;;;;;;;:::i;:::-;;;;;;;;;6802:1;6794:5;:9;6786:44;;;;-1:-1:-1;;;6786:44:3;;;;;;;:::i;:::-;6857:1;6848:5;:10;;6840:45;;;;-1:-1:-1;;;6840:45:3;;;;;;;:::i;:::-;6939:14;;6932:59;;-1:-1:-1;;;6932:59:3;;6995:5;;-1:-1:-1;;;;;6939:14:3;;6932:32;;:59;;6965:10;;6985:4;;6932:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:70;;6911:165;;;;-1:-1:-1;;;6911:165:3;;;;;;;:::i;:::-;7114:14;;7107:71;;-1:-1:-1;;;7107:71:3;;-1:-1:-1;;;;;7114:14:3;;;;7107:35;;:71;;7143:10;;7163:4;;7170:5;;7107:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7086:102;;;;;;7198:15;7248;7265:10;7231:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;7221:56;;;;;;7216:62;;7198:80;;7341:6;7336:151;7357:5;7353:1;:9;7336:151;;;7383:19;7391:10;7383:7;:19::i;:::-;7442:11;7429:10;:24;;-1:-1:-1;7364:3:3;;7336:151;;18217:645;18326:6;18347;18368;18389;18410;18431;18451;18471;18503:27;18533:13;18547;18533:28;;;;;;;;;;18592:16;;;;;;18623:15;;;;;;-1:-1:-1;18653:14:3;;;;;;-1:-1:-1;;;;18682:23:3;;;;;-1:-1:-1;;;;18720:15:3;;;;;-1:-1:-1;;;;18750:24:3;;;;;-1:-1:-1;;;;18788:21:3;;;;;-1:-1:-1;;;;18823:22:3;;;;;-1:-1:-1;18217:645:3;-1:-1:-1;;;18217:645:3:o;4580:52::-;;;;;;;;;;;;;:::o;3899:53::-;3951:1;3899:53;:::o;4742:67::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4742:67:3;;-1:-1:-1;4742:67:3:o;16453:123::-;1301:12:19;:10;:12::i;:::-;-1:-1:-1;;;;;1290:23:19;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1290:23:19;;1282:68;;;;;-1:-1:-1;;;1282:68:19;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1282:68:19;;;;;;;;;;;;;;;16563:6:3::1;16545:7;16553:6;16545:15;;;;;;;;4524:49:::0;;;;;;;;;;;;;:::o;7735:1840::-;7820:15;;;;;;;;:23;;:15;:23;7812:63;;;;-1:-1:-1;;;7812:63:3;;;;;;;:::i;:::-;7904:14;;7893:47;;-1:-1:-1;;;7893:47:3;;7944:10;;-1:-1:-1;;;;;7904:14:3;;7893:34;;:47;;7928:11;;7893:47;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;7893:61:3;;7885:121;;;;-1:-1:-1;;;7885:121:3;;;;;;;:::i;:::-;8030:4;:9;8024:33;;-1:-1:-1;;;8024:33:3;;8061:10;;-1:-1:-1;;;;;8030:9:3;;8024:24;;:33;;8049:7;;8024:33;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;8024:47:3;;8016:102;;;;-1:-1:-1;;;8016:102:3;;;;;;;:::i;:::-;8172:14;;8161:56;;-1:-1:-1;;;8161:56:3;;8129:12;;;;-1:-1:-1;;;;;8172:14:3;;;;8161:43;;:56;;8205:11;;8161:56;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8128:89;;-1:-1:-1;8128:89:3;-1:-1:-1;8271:13:3;8258:8;8235:32;;;;;;;;;;:49;;;;;;;;;:112;;;-1:-1:-1;8336:11:3;8323:8;8300:32;;;;;;;;;;:47;;;;;;;;;8235:112;8227:166;;;;-1:-1:-1;;;8227:166:3;;;;;;;:::i;:::-;8451:13;;;8447:226;;8531:1;8488:13;8502:6;8488:21;;;;;;;;;;:40;-1:-1:-1;;;8488:40:3;;;;:44;8480:75;;;;-1:-1:-1;;;8480:75:3;;;;;;;:::i;:::-;8447:226;;;8638:1;8594:13;8608:6;8594:21;;;;;;;;;;:41;-1:-1:-1;;;8594:41:3;;;;:45;8586:76;;;;-1:-1:-1;;;8586:76:3;;;;;;;:::i;:::-;8713:7;8739:476;;;;;;;;8783:11;8739:476;;;;8827:7;8739:476;;;;8885:20;:18;:20::i;:::-;8867:15;:38;8739:476;;;;8938:42;8964:7;8972:6;8964:15;;;;;;;;;;;-1:-1:-1;;;;;8964:15:3;8938:25;:42::i;:::-;8739:476;;;;9013:1;8739:476;;;;9047:11;8739:476;;;;;;;;;;;;9091:1;8739:476;;;;9136:38;9163:10;9136:26;:38::i;:::-;8739:476;;8713:512;;;;;;;;-1:-1:-1;8713:512:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;8713:512:3;;;;;;;;;;;;;;;;;-1:-1:-1;8713:512:3;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;9263:4:3;;9328:7;:14;9263:105;;-1:-1:-1;;;9263:105:3;;-1:-1:-1;;;;;9263:4:3;;;;-1:-1:-1;9263:9:3;;:105;;9286:10;;-1:-1:-1;;9328:18:3;;;;9263:105;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9420:4:3;:9;9414:65;;-1:-1:-1;;;9414:65:3;;-1:-1:-1;;;;;9420:9:3;;;;-1:-1:-1;9414:29:3;;-1:-1:-1;9414:65:3;;9444:10;;9464:4;;9471:7;;9414:65;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9500:14:3;;9489:79;;-1:-1:-1;;;9489:79:3;;-1:-1:-1;;;;;9500:14:3;;;;-1:-1:-1;9489:39:3;;-1:-1:-1;9489:79:3;;9529:10;;9549:4;;9556:11;;9489:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7735:1840;;;;:::o;9730:5923::-;9794:4;;:23;;-1:-1:-1;;;9794:23:3;;9821:10;;-1:-1:-1;;;;;9794:4:3;;:12;;:23;;9807:9;;9794:23;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;9794:37:3;;9786:70;;;;-1:-1:-1;;;9786:70:3;;;;;;;:::i;:::-;9875:20;9898:7;9906:9;9898:18;;;;;;;;;;;;;;;;;;9875:41;;9951:15;9934:1;:13;;;:32;;9926:65;;;;-1:-1:-1;;;9926:65:3;;;;;;;:::i;:::-;10050:20;10080:18;;:::i;:::-;10177:14;;10223:12;;10166:79;;-1:-1:-1;;;10166:79:3;;10134:12;;;;-1:-1:-1;;;;;10177:14:3;;;;10166:43;;:79;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10133:112;;;;10255:18;10287:8;:13;;10299:1;10287:13;10283:994;;;10405:13;10419:6;10405:21;;;;;;;;;;:40;-1:-1:-1;;;10405:40:3;;;;10401:143;;10470:35;10482:9;10493:11;10470;:35::i;:::-;10523:7;;;;;;;;10401:143;10610:13;10624:6;10610:21;;;;;;;;;;:33;;;10576:13;:21;;;;;;;;;;;:31;10570:3;10576:31;;;;;;;10570:37;:73;;;;;;;10557:86;;;;10773:1;10731:13;10745:6;10731:21;;;;;;;;;;:43;;;-1:-1:-1;;;10731:43:3;;;;;;;;;;;;-1:-1:-1;;;;10731:43:3;;;;;;;;;10283:994;;;10897:13;10911:6;10897:21;;;;;;;;;;:41;-1:-1:-1;;;10897:41:3;;;;10893:144;;10963:35;10975:9;10986:11;10963;:35::i;10893:144::-;11104:13;11118:6;11104:21;;;;;;;;;;:31;;;;;;11069:13;:21;;;;;;;;;;;:32;11063:3;11069:32;-1:-1:-1;;;11069:32:3;;;;;11063:38;:72;;;;;;;11050:85;;;;11265:1;11222:13;11236:6;11222:21;;;;;;;;;;:44;;;-1:-1:-1;;;11222:44:3;;;;;;;;;;;;-1:-1:-1;;;;11222:44:3;;;;;;;;;10283:994;11513:7;11508:236;11530:21;11526:1;:25;;;11508:236;;;11576:1;:25;;11602:1;11576:28;;;;;;;;;;;;;;;;;;;;;;;;;;:74;;;;;11609:38;11636:10;11609:26;:38::i;:::-;11648:1;11609:41;;;;;;;;;;;;;11576:74;11572:162;;;3891:2;11670:49;;11572:162;11553:4;;11508:236;;;;12027:15;12066:42;12092:7;12100:6;12092:15;;;;;;;;12066:42;12056:52;;12140:1;12122;:15;;;:19;:34;;;;;12155:1;12145:7;:11;12122:34;:63;;;;;12170:1;:15;;;12160:7;:25;12122:63;12118:192;;;12284:15;;;;12278:3;12249:25;;;12248:33;12284:15;12248:51;;;;;12200:29;;;:99;12118:192;12451:44;12479:7;12487:6;12479:15;;;;;;;;;;;-1:-1:-1;;;;;12479:15:3;12451:27;:44::i;:::-;12546:1;12509:17;:34;12527:7;12535:6;12527:15;;;;;;;;;;;-1:-1:-1;;;;;12527:15:3;12509:34;;;;;;;;;;;12527:15;12509:34;;:38;12505:272;;;12763:3;3891:2;12700:17;:34;12718:7;12726:6;12718:15;;;;;;;;;;;-1:-1:-1;;;;;12718:15:3;12700:34;;;;;;;;;;;12718:15;12700:34;;12616:7;:15;;;;;;;;;;;;12609:45;;-1:-1:-1;;;12609:45:3;;-1:-1:-1;;;;;12616:15:3;;;;12609:33;;:45;;12643:10;;12609:45;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12657:3;12609:51;:125;;;;;;:152;:157;;;;;;12563:27;;;:203;12505:272;12786:15;;;:25;;;12993:1;12971:19;;;:23;;;13024:10;13008:27;;:15;:27;;13062:256;13098:10;13082:27;;:15;:27;;:34;13078:38;;;;13062:256;;;13160:10;13177:1;13144:27;;;:15;:27;;;;;:30;;;;;;;;;;;;:34;13140:165;;;13256:14;;13245:42;;-1:-1:-1;;;13245:42:3;;-1:-1:-1;;;;;13256:14:3;;;;13245:39;;:42;;13285:1;;13245:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13223:64;;:5;:19;;;:64;13201:5;:19;;:86;;;;;13140:165;13118:3;;13062:256;;;;13539:19;;;;13497:27;;;;13452:29;;;;13414:22;;:67;:110;:144;13584:3;13573:14;;13569:82;;;-1:-1:-1;13614:3:3;13569:82;13692:15;;;13705:1;13692:15;;;13661:28;13692:15;;;;;13661:28;13692:15;;;;;;;;;;-1:-1:-1;13692:15:3;13661:46;;13762:8;13756:3;:14;13742:10;:29;13717:12;13730:1;13717:15;;;;;;;;;;;;;:55;;;;;;;;;;;13848:12;13861:1;13848:15;;;;;;;;;;;;;;13840:5;:23;13815:12;13828:1;13815:15;;;;;;;;;;;;;:49;;;;;;;;;;;13895:32;13914:12;13895:18;:32::i;:::-;:37;;13891:1317;;3697:5;13974:1;13963:12;;;13962:34;;;;;:46;;13948:11;;;:60;14058:12;;14139:34;14135:545;;;14235:13;14249:6;14235:21;;;;;;;;;;:40;-1:-1:-1;;;14235:40:3;;;;14201:13;:21;;;;;;;;;;;:31;14278:1;14201:31;;;;;;;:74;;;;:78;;14193:86;;-1:-1:-1;14297:13:3;:21;;;;;;;;;;;:45;;;-1:-1:-1;;;14297:45:3;;;;;;;;;;;;;-1:-1:-1;;14297:45:3;;;;;;;;;14376:11;;-1:-1:-1;14135:545:3;;;14423:1;14412:12;;:35;;14434:12;14412:35;14408:272;;;14510:13;14524:6;14510:21;;;;;;;;;;:41;-1:-1:-1;;;14510:41:3;;;;14475:13;:21;;;;;;;;;;;:32;14554:1;14475:32;-1:-1:-1;;;14475:32:3;;;;;:76;;;;:80;;14467:88;;-1:-1:-1;14573:13:3;:21;;;;;;;;;;;:46;;;-1:-1:-1;;;14573:46:3;;;;;;;;;;;;;-1:-1:-1;;;;14573:46:3;;;;;;;;;14653:12;;-1:-1:-1;14408:272:3;14786:14;;14775:214;;-1:-1:-1;;;14775:214:3;;14715:34;14727:1;14716:12;;14715:34;;;3697:5;14715:34;:46;;;-1:-1:-1;;;;;14786:14:3;;14775:31;;:214;;14824:10;;14715:46;;14893:6;;14716:12;14961:5;;14775:214;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;15028:12:3;;;15003:22;;;:7;:22;;;;;;:37;;;;-1:-1:-1;13891:1317:3;;-1:-1:-1;;13891:1317:3;;15106:14;;15100:56;;-1:-1:-1;;;15100:56:3;;-1:-1:-1;;;;;15106:14:3;;;;15100:26;;:56;;15127:10;;3799:6;;15106:14;15100:56;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15186:11;15170:27;;13891:1317;15253:4;:9;;15269:8;;;15247:31;;-1:-1:-1;;;15247:31:3;;-1:-1:-1;;;;;15253:9:3;;;;15247:21;;:31;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15288:37;15300:9;15311:13;15288:11;:37::i;:::-;15361:9;15340:306;15385:10;15416:13;15410:20;;;;;;;;15444:10;15468:5;:22;;;15504:5;:29;;;15547:5;:19;;;15580:5;:27;;;15621:12;15634:1;15621:15;;;;;;;;;;;;;;15340:306;;;;;;;;;;;;;:::i;:::-;;;;;;;;9730:5923;;;;;;;;;;;:::o;4363:19::-;;;-1:-1:-1;;;;;4363:19:3;;:::o;16883:102::-;1301:12:19;:10;:12::i;:::-;-1:-1:-1;;;;;1290:23:19;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1290:23:19;;1282:68;;;;;-1:-1:-1;;;1282:68:19;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1282:68:19;;;;;;;;;;;;;;;16951:14:3::1;:27:::0;;-1:-1:-1;;16951:27:3::1;::::0;::::1;;::::0;;;::::1;::::0;;16883:102::o;547:40:2:-;583:4;547:40;:::o;26776:318:3:-;27015:69;26776:318;;;;;;;;:::o;2004:240:19:-;1301:12;:10;:12::i;:::-;-1:-1:-1;;;;;1290:23:19;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1290:23:19;;1282:68;;;;;-1:-1:-1;;;1282:68:19;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1282:68:19;;;;;;;;;;;;;;;-1:-1:-1;;;;;2092:22:19;::::1;2084:73;;;;-1:-1:-1::0;;;2084:73:19::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2193:6;::::0;2172:38:::1;::::0;-1:-1:-1;;;;;2172:38:19;;::::1;::::0;2193:6:::1;::::0;2172:38:::1;::::0;2193:6:::1;::::0;2172:38:::1;2220:6;:17:::0;;-1:-1:-1;;;;;;2220:17:19::1;-1:-1:-1::0;;;;;2220:17:19;;;::::1;::::0;;;::::1;::::0;;2004:240::o;598:104:1:-;685:10;598:104;:::o;21414:530:3:-;21497:10;21520:1;21481:27;;;:15;:27;;;;;:36;;;;;;;;;;;;:40;21473:80;;;;-1:-1:-1;;;21473:80:3;;;;;;;:::i;:::-;21629:21;:19;:21::i;:::-;21605:10;21589:27;;;;:15;:27;;;;;:36;;;;;;;;;;;;21571:15;:54;:79;;21563:145;;;;-1:-1:-1;;;21563:145:3;;;;;;;:::i;:::-;21734:10;21757:1;21718:27;;;:15;:27;;;;;:36;;;;;;;;;;;:40;21779:14;;21916:10;;;;;;;;21779:14;21916:10;;;-1:-1:-1;;;21916:10:3;;;;21768:168;;-1:-1:-1;;;21768:168:3;;-1:-1:-1;;;;;21779:14:3;;;;21768:43;;:168;;21833:4;;21853:10;;21878:7;;21779:14;;21768:168;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21414:530;:::o;19008:238::-;19085:5;19101:15;19151;19168:10;19134:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;19124:56;;;;;;19119:62;;19101:80;;19198:41;19218:8;19228:10;19198:19;:41::i;:::-;19191:48;19008:238;-1:-1:-1;;;19008:238:3:o;23127:156::-;23241:13;;;23220:56;;-1:-1:-1;;;23220:56:3;;23194:7;;23241:13;;;;-1:-1:-1;;;;;23241:13:3;;23220:48;;:56;;23269:6;;23220:56;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;18082:128::-;18155:7;18181;18189:13;18181:22;;;;;;;;;;;-1:-1:-1;;;;;18181:22:3;;18082:128;-1:-1:-1;;18082:128:3:o;20747:661::-;20823:14;;20812:57;;-1:-1:-1;;;20812:57:3;;20873:1;;-1:-1:-1;;;;;20823:14:3;;20812:36;;:57;;20849:10;;20861:7;;20812:57;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:62;;20804:129;;;;-1:-1:-1;;;20804:129:3;;;;;;;:::i;:::-;21089:10;21073:27;;;;:15;:27;;;;;:36;;;;;;;;;;;;:41;21065:76;;;;-1:-1:-1;;;21065:76:3;;;;;;;:::i;:::-;21180:14;;21317:10;;;;;;;;21180:14;21317:10;;;-1:-1:-1;;;21317:10:3;;;;21169:168;;-1:-1:-1;;;21169:168:3;;-1:-1:-1;;;;;21180:14:3;;;;21169:43;;:168;;21226:10;;21259:4;;21279:7;;21180:14;;21169:168;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;21363:10:3;21347:27;;;;:15;:27;;;;;21386:15;;-1:-1:-1;21347:27:3;-1:-1:-1;21347:36:3;;;;;;;;;;;:54;-1:-1:-1;20747:661:3:o;23289:94::-;23362:14;;;;23289:94;:::o;23389:2015::-;23469:16;;23452:9;:14;23469:16;;;;23452:14;;;;;;:33;23451:39;23442:75;;;;-1:-1:-1;;;23442:75:3;;;;;;;:::i;:::-;23735:15;;;23748:1;23735:15;;;23704:28;23735:15;;;;;23704:28;23735:15;;;;;;;;;;-1:-1:-1;;23785:16:3;;23760:15;;23704:46;;-1:-1:-1;23785:16:3;;3554:3;23778:42;;23704:46;;23785:16;;23760:15;;;;;;;;;:60;;;;;;;;;;;23855:9;:14;;;;;;;;;;;;23848:22;;23873:3;23848:28;23830:12;23843:1;23830:15;;;;;;;;;;;;;:46;;;;;;;;;;;23886:12;23907:45;23927:12;23941:10;23907:19;:45::i;:::-;23886:67;-1:-1:-1;23977:7:3;23963:21;;;-1:-1:-1;24065:11:3;;;;;;;:34;;-1:-1:-1;24080:9:3;:14;;;;;;:19;24065:34;24061:139;;;-1:-1:-1;24188:1:3;24061:139;24214:11;;;24210:1188;;24260:29;24305:22;:20;:22::i;:::-;24292:36;;-1:-1:-1;;;;;24292:36:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24292:36:3;;24260:68;;24410:7;24405:139;24427:22;:20;:22::i;:::-;24423:26;;:1;:26;;;24405:139;;;24501:13;24515:1;24501:16;;;;;;;;;;:27;24475:16;;24501:27;;;;;;;24475:16;;;;;;;;;;;;:54;;;;:16;;;;;;;;;;;:54;24451:4;;24405:139;;;;24572:46;24592:13;24607:10;24572:19;:46::i;:::-;24644:14;;24729:16;;24644:14;24711:15;24557:62;;-1:-1:-1;;;;;;24644:14:3;;;;24633:31;;24682:10;;24729:16;;;;-1:-1:-1;;;24711:15:3;;;;;;:34;24557:62;24644:14;24855:13;:21;;;24711:15;24855:21;;;;;;;:32;;;;;;24819:13;:21;;;;;;;;;;;:33;24633:281;;-1:-1:-1;;;;;;24633:281:3;;;;;;;;;;;;;24819:33;;;;:68;;;;:33;:72;;24633:281;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;24970:16:3;;;24952:15;;24933:68;;24970:16;;;;-1:-1:-1;;;24952:15:3;;;;;:34;;;;24933:68;;;;-1:-1:-1;24933:68:3;;-1:-1:-1;24933:68:3;;24940:10;;24970:16;24994:6;;24933:68;:::i;:::-;;;;;;;;25015:16;:21;;-1:-1:-1;;25015:21:3;;;;;;-1:-1:-1;;25015:21:3;;;;;;;-1:-1:-1;25050:13:3;:21;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;-1:-1:-1;;25050:37:3;;;;;;;;;-1:-1:-1;24210:1188:3;;;25139:4;:9;25217;:14;-1:-1:-1;;;;;25139:9:3;;;;25133:21;;25172:10;;25217:14;;;;;25201:13;:11;:13::i;:::-;:30;25249:10;25133:140;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;25327:9:3;:14;;;;;;;-1:-1:-1;25311:13:3;;-1:-1:-1;25311:11:3;:13::i;:::-;:30;25292:61;;;25299:10;25344:5;25351:1;25292:61;;;;;;;;:::i;:::-;;;;;;;;25367:9;:19;;-1:-1:-1;;25367:19:3;;;;;;;;;;;;;-1:-1:-1;;25367:19:3;;;;;;23389:2015;;;:::o;2771:108:2:-;365:9;2771:108;:::o;22792:329:3:-;22893:7;22960:1;22928:6;-1:-1:-1;;;;;22921:24:3;;22946:10;22921:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:40;22917:194;;;22983:26;23002:6;22983:18;:26::i;:::-;22976:33;;;;22917:194;-1:-1:-1;23099:1:3;23092:8;;22261:525;22337:32;;:::i;:::-;22433:36;;:::i;:::-;22484:7;22479:281;22501:21;22497:1;:25;;;22479:281;;;22593:1;22553:14;22568:1;22553:17;;;;;;;;;;;22546:44;;-1:-1:-1;;;22546:44:3;;-1:-1:-1;;;;;22553:17:3;;;;22546:35;;:44;;22582:7;;22546:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:48;22542:208;;;22622:4;22613:3;22617:1;22613:6;;;;;;;;;:13;;;:6;;;;;:13;22542:208;;;22730:5;22721:3;22725:1;22721:6;;;;;;;;;:14;;;:6;;;;;:14;22542:208;22524:3;;22479:281;;;-1:-1:-1;22776:3:3;22261:525;-1:-1:-1;;22261:525:3:o;19812:929::-;19885:20;19908:7;19916:9;19908:18;;;;;;;;;;;;;;;;;;19885:41;;19948:4;19936:1;:9;;;:16;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20001:14:3;;20057:12;;19990:80;;-1:-1:-1;;;19990:80:3;;-1:-1:-1;;;;;20001:14:3;;;;19990:39;;:80;;20038:4;;20045:10;;19990:80;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;20080:4:3;;:20;;-1:-1:-1;;;20080:20:3;;-1:-1:-1;;;;;20080:4:3;;;;-1:-1:-1;20080:9:3;;-1:-1:-1;20080:20:3;;20090:9;;20080:20;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20136:11:3;;-1:-1:-1;20127:20:3;;-1:-1:-1;;20127:20:3;;:4;:20;;;;;;;;;20123:612;;;20212:4;:9;;20231:8;;;20206:34;;-1:-1:-1;;;20206:34:3;;20252:4;;-1:-1:-1;;;;;20212:9:3;;20206:24;;:34;;20231:8;20206:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;20206:51:3;;20202:154;;;20281:4;:9;;20332:8;;;20275:66;;-1:-1:-1;;;20275:66:3;;-1:-1:-1;;;;;20281:9:3;;;;20275:29;;:66;;20313:4;;20320:10;;20275:66;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20202:154;20399:9;20374:347;20427:10;20462:4;20456:11;;;;;;;;20485:1;20517;20561;20613;20655;20706;20374:347;;;;;;;;;;;;;:::i;:::-;;;;;;;;19812:929;;;:::o;21950:305::-;-1:-1:-1;;;;;22083:26:3;;;;;;:17;:26;;;;;;;;22027:37;;-1:-1:-1;;;22027:37:3;;22083:26;;;22027:25;;:37;;22053:10;;22027:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:82;22023:226;;;22197:37;;-1:-1:-1;;;22197:37:3;;-1:-1:-1;;;;;22197:25:3;;;;;:37;;22223:10;;22197:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;22153:26:3;;;;;;:17;:26;;;;;:81;21950:305;:::o;25410:539::-;25505:5;;;25557:114;25587:8;:15;25579:5;:23;;;25557:114;;;25645:8;25654:5;25645:15;;;;;;;;;;;;;;;;25627:33;;;;;;25604:7;;;;;;;25557:114;;;;25680:11;25707:14;25694:10;:27;;;;;;25680:41;;25736:12;25731:194;25763:8;:15;25754:6;:24;;;25731:194;;;25814:8;25823:6;25814:16;;;;;;;;;;;;;;;;25808:22;;:3;:22;25804:74;;;25857:6;-1:-1:-1;25850:13:3;;-1:-1:-1;;25850:13:3;25804:74;25898:8;25907:6;25898:16;;;;;;;;;;;;;;;;;;;;25891:23;;;;;;25780:8;;25731:194;;;-1:-1:-1;25941:1:3;;25410:539;-1:-1:-1;;;;;25410:539:3:o;2650:115:2:-;271:2;2650:115;:::o;3125:96::-;583:4;3125:96;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;14:404:22;;;147:3;140:4;132:6;128:17;124:27;114:2;;172:8;162;155:26;114:2;-1:-1:-1;202:20:22;;-1:-1:-1;;;;;234:30:22;;231:2;;;284:8;274;267:26;231:2;328:4;320:6;316:17;304:29;;391:3;384:4;376;368:6;364:17;356:6;352:30;348:41;345:50;342:2;;;408:1;405;398:12;342:2;104:314;;;;;:::o;423:377::-;;;540:3;533:4;525:6;521:17;517:27;507:2;;565:8;555;548:26;507:2;-1:-1:-1;595:20:22;;-1:-1:-1;;;;;627:30:22;;624:2;;;677:8;667;660:26;624:2;721:4;713:6;709:17;697:29;;773:3;766:4;757:6;749;745:19;741:30;738:39;735:2;;;790:1;787;780:12;805:259;;917:2;905:9;896:7;892:23;888:32;885:2;;;938:6;930;923:22;885:2;982:9;969:23;1001:33;1028:5;1001:33;:::i;1069:263::-;;1192:2;1180:9;1171:7;1167:23;1163:32;1160:2;;;1213:6;1205;1198:22;1160:2;1250:9;1244:16;1269:33;1296:5;1269:33;:::i;1337:402::-;;;1466:2;1454:9;1445:7;1441:23;1437:32;1434:2;;;1487:6;1479;1472:22;1434:2;1531:9;1518:23;1550:33;1577:5;1550:33;:::i;:::-;1602:5;-1:-1:-1;1659:2:22;1644:18;;1631:32;1672:35;1631:32;1672:35;:::i;:::-;1726:7;1716:17;;;1424:315;;;;;:::o;1744:1396::-;;;;;;;;;2013:3;2001:9;1992:7;1988:23;1984:33;1981:2;;;2035:6;2027;2020:22;1981:2;2079:9;2066:23;2098:33;2125:5;2098:33;:::i;:::-;2150:5;-1:-1:-1;2207:2:22;2192:18;;2179:32;2220:35;2179:32;2220:35;:::i;:::-;2274:7;-1:-1:-1;2332:2:22;2317:18;;2304:32;-1:-1:-1;;;;;2385:14:22;;;2382:2;;;2417:6;2409;2402:22;2382:2;2461:76;2529:7;2520:6;2509:9;2505:22;2461:76;:::i;:::-;2556:8;;-1:-1:-1;2435:102:22;-1:-1:-1;2644:2:22;2629:18;;2616:32;;-1:-1:-1;2660:16:22;;;2657:2;;;2694:6;2686;2679:22;2657:2;2738:78;2808:7;2797:8;2786:9;2782:24;2738:78;:::i;:::-;2835:8;;-1:-1:-1;2712:104:22;-1:-1:-1;2923:3:22;2908:19;;2895:33;;-1:-1:-1;2940:16:22;;;2937:2;;;2974:6;2966;2959:22;2937:2;;3018:62;3072:7;3061:8;3050:9;3046:24;3018:62;:::i;:::-;1971:1169;;;;-1:-1:-1;1971:1169:22;;-1:-1:-1;1971:1169:22;;;;;;3099:8;-1:-1:-1;;;1971:1169:22:o;3145:849::-;;;;;;;3344:3;3332:9;3323:7;3319:23;3315:33;3312:2;;;3366:6;3358;3351:22;3312:2;3410:9;3397:23;3429:33;3456:5;3429:33;:::i;:::-;3481:5;-1:-1:-1;3538:2:22;3523:18;;3510:32;3551:35;3510:32;3551:35;:::i;:::-;3605:7;-1:-1:-1;3659:2:22;3644:18;;3631:32;;-1:-1:-1;3710:2:22;3695:18;;3682:32;;-1:-1:-1;3765:3:22;3750:19;;3737:33;-1:-1:-1;;;;;3782:30:22;;3779:2;;;3830:6;3822;3815:22;3779:2;3874:60;3926:7;3917:6;3906:9;3902:22;3874:60;:::i;:::-;3302:692;;;;-1:-1:-1;3302:692:22;;-1:-1:-1;3302:692:22;;3953:8;;3302:692;-1:-1:-1;;;3302:692:22:o;3999:560::-;;;;4160:2;4148:9;4139:7;4135:23;4131:32;4128:2;;;4181:6;4173;4166:22;4128:2;4225:9;4212:23;4244:33;4271:5;4244:33;:::i;:::-;4296:5;-1:-1:-1;4353:2:22;4338:18;;4325:32;4366:35;4325:32;4366:35;:::i;:::-;4420:7;-1:-1:-1;4479:2:22;4464:18;;4451:32;4492:35;4451:32;4492:35;:::i;:::-;4546:7;4536:17;;;4118:441;;;;;:::o;4564:327::-;;;4693:2;4681:9;4672:7;4668:23;4664:32;4661:2;;;4714:6;4706;4699:22;4661:2;4758:9;4745:23;4777:33;4804:5;4777:33;:::i;:::-;4829:5;4881:2;4866:18;;;;4853:32;;-1:-1:-1;;;4651:240:22:o;4896:398::-;;;5023:2;5011:9;5002:7;4998:23;4994:32;4991:2;;;5044:6;5036;5029:22;4991:2;5088:9;5075:23;5107:33;5134:5;5107:33;:::i;:::-;5159:5;-1:-1:-1;5216:2:22;5201:18;;5188:32;5229:33;5188:32;5229:33;:::i;5299:463::-;;;5446:2;5434:9;5425:7;5421:23;5417:32;5414:2;;;5467:6;5459;5452:22;5414:2;5512:9;5499:23;-1:-1:-1;;;;;5537:6:22;5534:30;5531:2;;;5582:6;5574;5567:22;5531:2;5626:76;5694:7;5685:6;5674:9;5670:22;5626:76;:::i;:::-;5721:8;;5600:102;;-1:-1:-1;5404:358:22;-1:-1:-1;;;;5404:358:22:o;5767:963::-;;5893:2;5936;5924:9;5915:7;5911:23;5907:32;5904:2;;;5957:6;5949;5942:22;5904:2;5995:9;5989:16;-1:-1:-1;;;;;6020:6:22;6017:30;6014:2;;;6065:6;6057;6050:22;6014:2;6093:22;;6146:4;6138:13;;6134:27;-1:-1:-1;6124:2:22;;6180:6;6172;6165:22;6124:2;6218;6212:9;6241:69;6256:53;6302:6;6256:53;:::i;:::-;6241:69;:::i;:::-;6344:19;;;6379:12;;;;6411:11;;;6449:15;;;6441:24;;6437:33;;6434:46;-1:-1:-1;6431:2:22;;;6498:6;6490;6483:22;6431:2;6525:6;6516:15;;6540:160;6554:6;6551:1;6548:13;6540:160;;;6615:10;;6603:23;;6576:1;6569:9;;;;;6646:12;;;;6678;;6540:160;;;-1:-1:-1;6719:5:22;5873:857;-1:-1:-1;;;;;;;5873:857:22:o;6735:1087::-;;6849:2;6892;6880:9;6871:7;6867:23;6863:32;6860:2;;;6913:6;6905;6898:22;6860:2;6958:9;6945:23;-1:-1:-1;;;;;6983:6:22;6980:30;6977:2;;;7028:6;7020;7013:22;6977:2;7056:22;;7109:4;7101:13;;7097:27;-1:-1:-1;7087:2:22;;7143:6;7135;7128:22;7087:2;7188;7175:16;7211:69;7226:53;7272:6;7226:53;:::i;7211:69::-;7314:19;;;7349:12;;;;7381:11;;;7419:15;;;7411:24;;7407:33;;7404:46;-1:-1:-1;7401:2:22;;;7468:6;7460;7453:22;7401:2;7495:6;7486:15;;7510:282;7524:6;7521:1;7518:13;7510:282;;;7599:3;7586:17;7647:10;7640:5;7636:22;7629:5;7626:33;7616:2;;7678:6;7670;7663:22;7616:2;7700:18;;7546:1;7539:9;;;;;7738:12;;;;7770;;7510:282;;7827:253;;7936:2;7924:9;7915:7;7911:23;7907:32;7904:2;;;7957:6;7949;7942:22;7904:2;8001:9;7988:23;8020:30;8044:5;8020:30;:::i;8085:257::-;;8205:2;8193:9;8184:7;8180:23;8176:32;8173:2;;;8226:6;8218;8211:22;8173:2;8263:9;8257:16;8282:30;8306:5;8282:30;:::i;8347:306::-;;8458:2;8446:9;8437:7;8433:23;8429:32;8426:2;;;8479:6;8471;8464:22;8426:2;8510:23;;-1:-1:-1;;;;;;8562:32:22;;8552:43;;8542:2;;8614:6;8606;8599:22;8658:296;;8780:2;8768:9;8759:7;8755:23;8751:32;8748:2;;;8801:6;8793;8786:22;8748:2;8838:9;8832:16;8888:6;8881:5;8877:18;8870:5;8867:29;8857:2;;8915:6;8907;8900:22;8959:190;;9071:2;9059:9;9050:7;9046:23;9042:32;9039:2;;;9092:6;9084;9077:22;9039:2;-1:-1:-1;9120:23:22;;9029:120;-1:-1:-1;9029:120:22:o;9154:194::-;;9277:2;9265:9;9256:7;9252:23;9248:32;9245:2;;;9298:6;9290;9283:22;9245:2;-1:-1:-1;9326:16:22;;9235:113;-1:-1:-1;9235:113:22:o;9353:258::-;;;9482:2;9470:9;9461:7;9457:23;9453:32;9450:2;;;9503:6;9495;9488:22;9450:2;-1:-1:-1;;9531:23:22;;;9601:2;9586:18;;;9573:32;;-1:-1:-1;9440:171:22:o;9616:255::-;;9726:2;9714:9;9705:7;9701:23;9697:32;9694:2;;;9747:6;9739;9732:22;9694:2;9791:9;9778:23;9810:31;9835:5;9810:31;:::i;9876:398::-;;;10003:2;9991:9;9982:7;9978:23;9974:32;9971:2;;;10024:6;10016;10009:22;9971:2;10068:9;10055:23;10087:31;10112:5;10087:31;:::i;10279:391::-;;;10415:2;10403:9;10394:7;10390:23;10386:32;10383:2;;;10436:6;10428;10421:22;10383:2;10473:9;10467:16;10492:31;10517:5;10492:31;:::i;:::-;10592:2;10577:18;;10571:25;10542:5;;-1:-1:-1;10605:33:22;10571:25;10605:33;:::i;10675:477::-;;10756:5;10750:12;10783:6;10778:3;10771:19;10808:3;10820:162;10834:6;10831:1;10828:13;10820:162;;;10896:4;10952:13;;;10948:22;;10942:29;10924:11;;;10920:20;;10913:59;10849:12;10820:162;;;11000:6;10997:1;10994:13;10991:2;;;11066:3;11059:4;11050:6;11045:3;11041:16;11037:27;11030:40;10991:2;-1:-1:-1;11134:2:22;11113:15;-1:-1:-1;;11109:29:22;11100:39;;;;11141:4;11096:50;;10726:426;-1:-1:-1;;10726:426:22:o;11157:131::-;11238:1;11231:5;11228:12;11218:2;;11244:9;11218:2;11264:18;;11208:80::o;11293:310::-;11466:19;;;11523:2;11519:15;-1:-1:-1;;11515:53:22;11510:2;11501:12;;11494:75;11594:2;11585:12;;11456:147::o;11608:203::-;-1:-1:-1;;;;;11772:32:22;;;;11754:51;;11742:2;11727:18;;11709:102::o;12032:312::-;-1:-1:-1;;;;;12270:15:22;;;12252:34;;12322:15;;12317:2;12302:18;;12295:43;12202:2;12187:18;;12169:175::o;12349:383::-;-1:-1:-1;;;;;12615:15:22;;;12597:34;;12667:15;;;;12662:2;12647:18;;12640:43;12714:2;12699:18;;12692:34;;;;12547:2;12532:18;;12514:218::o;12737:587::-;-1:-1:-1;;;;;13048:15:22;;;13030:34;;13100:15;;13095:2;13080:18;;13073:43;13164:4;13152:17;;13147:2;13132:18;;13125:45;13201:2;13186:18;;13179:34;;;13010:3;13244;13229:19;;13222:32;;;12737:587;;13271:47;;13298:19;;13290:6;13271:47;:::i;:::-;13263:55;12982:342;-1:-1:-1;;;;;;;12982:342:22:o;13329:380::-;-1:-1:-1;;;;;13557:32:22;;;;13539:51;;13633:14;;13626:22;13621:2;13606:18;;13599:50;13697:4;13685:17;13680:2;13665:18;;13658:45;13527:2;13512:18;;13494:215::o;14089:365::-;-1:-1:-1;;;;;14316:32:22;;;;14298:51;;14397:6;14385:19;;;;14380:2;14365:18;;14358:47;14436:2;14421:18;;14414:34;14286:2;14271:18;;14253:201::o;14459:561::-;-1:-1:-1;;;;;14743:32:22;;;;14725:51;;14795:6;14837:15;;;14832:2;14817:18;;14810:43;14901:4;14889:17;;;14884:2;14869:18;;14862:45;14943:17;;14938:2;14923:18;;14916:45;14998:15;14992:3;14977:19;;14970:44;14712:3;14697:19;;14679:341::o;15025:282::-;-1:-1:-1;;;;;15225:32:22;;;;15207:51;;15289:2;15274:18;;15267:34;15195:2;15180:18;;15162:145::o;15312:526::-;-1:-1:-1;;;;;15587:32:22;;;;15569:51;;15651:2;15636:18;;15629:34;;;;15711:4;15699:17;;;15694:2;15679:18;;15672:45;15753:17;15748:2;15733:18;;15726:45;15820:10;15808:23;15802:3;15787:19;;15780:52;15556:3;15541:19;;15523:315::o;15843:291::-;-1:-1:-1;;;;;16041:32:22;;;;16023:51;;16122:4;16110:17;16105:2;16090:18;;16083:45;16011:2;15996:18;;15978:156::o;16433:768::-;-1:-1:-1;;;;;16846:32:22;;;;16828:51;;16927:4;16915:17;;;;16910:2;16895:18;;16888:45;16964:2;16949:18;;16942:34;;;;17007:2;16992:18;;16985:34;;;;17050:3;17035:19;;17028:35;16866:3;17079:19;;17072:35;17138:3;17123:19;;17116:35;17182:3;17167:19;;17160:35;16815:3;16800:19;;16782:419::o;17206:736::-;-1:-1:-1;;;;;17570:32:22;;;;17552:51;;17651:4;17639:17;;;;17634:2;17619:18;;17612:45;17688:2;17673:18;;17666:34;;;;17731:2;17716:18;;17709:34;;;;17774:3;17759:19;;17752:35;17590:3;17803:19;;17796:35;17862:3;17847:19;;17840:35;17924:10;17912:23;17906:3;17891:19;;17884:52;17539:3;17524:19;;17506:436::o;18927:546::-;-1:-1:-1;;;;;19242:15:22;;;19224:34;;19294:15;;;19289:2;19274:18;;19267:43;19346:15;;;19341:2;19326:18;;19319:43;19398:15;;19393:2;19378:18;;19371:43;19451:15;;;19445:3;19430:19;;19423:44;19173:3;19158:19;;19140:333::o;19478:286::-;-1:-1:-1;;;;;19669:32:22;;;;19651:51;;19750:6;19738:19;19733:2;19718:18;;19711:47;19639:2;19624:18;;19606:158::o;19769:635::-;19940:2;19992:21;;;20062:13;;19965:18;;;20084:22;;;19769:635;;19940:2;20163:15;;;;20137:2;20122:18;;;19769:635;20209:169;20223:6;20220:1;20217:13;20209:169;;;20284:13;;20272:26;;20353:15;;;;20318:12;;;;20245:1;20238:9;20209:169;;;-1:-1:-1;20395:3:22;;19920:484;-1:-1:-1;;;;;;19920:484:22:o;20409:187::-;20574:14;;20567:22;20549:41;;20537:2;20522:18;;20504:92::o;20601:202::-;-1:-1:-1;;;;;;20763:33:22;;;;20745:52;;20733:2;20718:18;;20700:103::o;21353:351::-;21555:2;21537:21;;;21594:2;21574:18;;;21567:30;21633:29;21628:2;21613:18;;21606:57;21695:2;21680:18;;21527:177::o;21709:344::-;21911:2;21893:21;;;21950:2;21930:18;;;21923:30;-1:-1:-1;;;21984:2:22;21969:18;;21962:50;22044:2;22029:18;;21883:170::o;22058:342::-;22260:2;22242:21;;;22299:2;22279:18;;;22272:30;-1:-1:-1;;;22333:2:22;22318:18;;22311:48;22391:2;22376:18;;22232:168::o;22405:349::-;22607:2;22589:21;;;22646:2;22626:18;;;22619:30;22685:27;22680:2;22665:18;;22658:55;22745:2;22730:18;;22579:175::o;22759:346::-;22961:2;22943:21;;;23000:2;22980:18;;;22973:30;-1:-1:-1;;;23034:2:22;23019:18;;23012:52;23096:2;23081:18;;22933:172::o;23110:342::-;23312:2;23294:21;;;23351:2;23331:18;;;23324:30;-1:-1:-1;;;23385:2:22;23370:18;;23363:48;23443:2;23428:18;;23284:168::o;23457:356::-;23659:2;23641:21;;;23678:18;;;23671:30;23737:34;23732:2;23717:18;;23710:62;23804:2;23789:18;;23631:182::o;23818:346::-;24020:2;24002:21;;;24059:2;24039:18;;;24032:30;-1:-1:-1;;;24093:2:22;24078:18;;24071:52;24155:2;24140:18;;23992:172::o;24169:397::-;24371:2;24353:21;;;24410:2;24390:18;;;24383:30;24449:34;24444:2;24429:18;;24422:62;-1:-1:-1;;;24515:2:22;24500:18;;24493:31;24556:3;24541:19;;24343:223::o;24571:353::-;24773:2;24755:21;;;24812:2;24792:18;;;24785:30;24851:31;24846:2;24831:18;;24824:59;24915:2;24900:18;;24745:179::o;24929:346::-;25131:2;25113:21;;;25170:2;25150:18;;;25143:30;-1:-1:-1;;;25204:2:22;25189:18;;25182:52;25266:2;25251:18;;25103:172::o;25280:345::-;25482:2;25464:21;;;25521:2;25501:18;;;25494:30;-1:-1:-1;;;25555:2:22;25540:18;;25533:51;25616:2;25601:18;;25454:171::o;25630:346::-;25832:2;25814:21;;;25871:2;25851:18;;;25844:30;-1:-1:-1;;;25905:2:22;25890:18;;25883:52;25967:2;25952:18;;25804:172::o;25981:355::-;26183:2;26165:21;;;26222:2;26202:18;;;26195:30;26261:33;26256:2;26241:18;;26234:61;26327:2;26312:18;;26155:181::o;26341:412::-;26543:2;26525:21;;;26582:2;26562:18;;;26555:30;26621:34;26616:2;26601:18;;26594:62;-1:-1:-1;;;26687:2:22;26672:18;;26665:46;26743:3;26728:19;;26515:238::o;26758:351::-;26960:2;26942:21;;;26999:2;26979:18;;;26972:30;27038:29;27033:2;27018:18;;27011:57;27100:2;27085:18;;26932:177::o;27114:344::-;27316:2;27298:21;;;27355:2;27335:18;;;27328:30;-1:-1:-1;;;27389:2:22;27374:18;;27367:50;27449:2;27434:18;;27288:170::o;27463:1058::-;;27651:3;27640:9;27636:19;27628:27;;27688:6;27682:13;27671:9;27664:32;27715:4;27773:2;27765:6;27761:15;27755:22;27750:2;27739:9;27735:18;27728:50;27834:4;27826:6;27822:17;27816:24;27809:4;27798:9;27794:20;27787:54;27897:4;27889:6;27885:17;27879:24;27872:4;27861:9;27857:20;27850:54;27960:4;27952:6;27948:17;27942:24;27935:4;27924:9;27920:20;27913:54;28014:4;28006:6;28002:17;27996:24;28029:61;28084:4;28073:9;28069:20;28055:12;28029:61;:::i;:::-;;28146:4;28138:6;28134:17;28128:24;28121:4;28110:9;28106:20;28099:54;28202:4;28194:6;28190:17;28184:24;28243:4;28232:9;28228:20;28322:1;28332:183;28346:4;28343:1;28340:11;28332:183;;;28419:13;;28412:21;28405:29;28393:42;;28490:15;;;;28455:12;;;;28366:1;28359:9;28332:183;;;28336:3;;;;27618:903;;;;:::o;28526:188::-;28700:6;28688:19;;;;28670:38;;28658:2;28643:18;;28625:89::o;28719:287::-;28899:6;28932:15;;;28914:34;;28984:15;;28979:2;28964:18;;28957:43;28877:2;28862:18;;28844:162::o;29011:760::-;29348:6;29381:15;;;29363:34;;29433:15;;;29428:2;29413:18;;29406:43;29485:15;;;29480:2;29465:18;;29458:43;29537:15;;;29532:2;29517:18;;29510:43;29590:15;;;29584:3;29569:19;;29562:44;29643:15;;29637:3;29622:19;;29615:44;29696:15;;29690:3;29675:19;;29668:44;29749:15;;;29743:3;29728:19;;29721:44;29325:3;29310:19;;29292:479::o;29776:177::-;29922:25;;;29910:2;29895:18;;29877:76::o;29958:634::-;;30268:3;30257:9;30253:19;30245:27;;30299:6;30288:9;30281:25;30342:6;30337:2;30326:9;30322:18;30315:34;30385:6;30380:2;30369:9;30365:18;30358:34;30428:6;30423:2;30412:9;30408:18;30401:34;30472:6;30466:3;30455:9;30451:19;30444:35;30488:54;30537:3;30526:9;30522:19;30514:6;30488:54;:::i;:::-;30579:6;30573:3;30562:9;30558:19;30551:35;30235:357;;;;;;;;;;:::o;30597:192::-;30771:10;30759:23;;;;30741:42;;30729:2;30714:18;;30696:93::o;30794:184::-;30966:4;30954:17;;;;30936:36;;30924:2;30909:18;;30891:87::o;30983:242::-;31053:2;31047:9;31083:17;;;-1:-1:-1;;;;;31115:34:22;;31151:22;;;31112:62;31109:2;;;31177:9;31109:2;31204;31197:22;31027:198;;-1:-1:-1;31027:198:22:o;31230:183::-;;-1:-1:-1;;;;;31321:6:22;31318:30;31315:2;;;31351:9;31315:2;-1:-1:-1;31402:4:22;31383:17;;;31379:28;;31305:108::o;31418:133::-;-1:-1:-1;;;;;31495:31:22;;31485:42;;31475:2;;31541:1;31538;31531:12;31556:120;31644:5;31637:13;31630:21;31623:5;31620:32;31610:2;;31666:1;31663;31656:12;31681:116;31767:4;31760:5;31756:16;31749:5;31746:27;31736:2;;31787:1;31784;31777:12
Swarm Source
ipfs://e175be1ab3a6f19a4805fb2d63bad6dfe8cfcc986659a32b520a5856e645a327
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ 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.