Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,775 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim Many From ... | 16563087 | 750 days ago | IN | 0.0036 ETH | 0.00340134 | ||||
Claim Many From ... | 16382096 | 776 days ago | IN | 0.0018 ETH | 0.00311736 | ||||
Claim Many From ... | 16382090 | 776 days ago | IN | 0.0018 ETH | 0.00327523 | ||||
Claim Many Alpha... | 16289043 | 789 days ago | IN | 0 ETH | 0.00397128 | ||||
Claim Many Alpha... | 16289013 | 789 days ago | IN | 0 ETH | 0.00311601 | ||||
Claim Many From ... | 16033709 | 824 days ago | IN | 0.0018 ETH | 0.00270749 | ||||
Claim Many From ... | 16006946 | 828 days ago | IN | 0.0864 ETH | 0.01355695 | ||||
Claim Many Alpha... | 15922283 | 840 days ago | IN | 0 ETH | 0.00104317 | ||||
Claim Many Alpha... | 15922280 | 840 days ago | IN | 0 ETH | 0.00110465 | ||||
Claim Many Alpha... | 15921276 | 840 days ago | IN | 0 ETH | 0.00492836 | ||||
Claim Many Alpha... | 15921271 | 840 days ago | IN | 0 ETH | 0.00243254 | ||||
Claim Many From ... | 15913446 | 841 days ago | IN | 0.0018 ETH | 0.00215295 | ||||
Claim Many From ... | 15913437 | 841 days ago | IN | 0.009 ETH | 0.00498486 | ||||
Claim Many Alpha... | 15908878 | 842 days ago | IN | 0 ETH | 0.00170623 | ||||
Claim Many From ... | 15907295 | 842 days ago | IN | 0.0414 ETH | 0.01503314 | ||||
Claim Many Alpha... | 15903097 | 843 days ago | IN | 0 ETH | 0.00181349 | ||||
Claim Many Alpha... | 15903096 | 843 days ago | IN | 0 ETH | 0.00129268 | ||||
Claim Many From ... | 15901648 | 843 days ago | IN | 0.0072 ETH | 0.00478224 | ||||
Claim Many From ... | 15901640 | 843 days ago | IN | 0.0018 ETH | 0.00267792 | ||||
Claim Many Alpha... | 15900544 | 843 days ago | IN | 0 ETH | 0.00217068 | ||||
Claim Many Alpha... | 15900542 | 843 days ago | IN | 0 ETH | 0.00173302 | ||||
Claim Many Alpha... | 15900539 | 843 days ago | IN | 0 ETH | 0.00183471 | ||||
Claim Many From ... | 15893982 | 844 days ago | IN | 0.0018 ETH | 0.00288021 | ||||
Add Many To Stak... | 15890234 | 844 days ago | IN | 0 ETH | 0.00559161 | ||||
Claim Many From ... | 15876967 | 846 days ago | IN | 0.0018 ETH | 0.00300983 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
16563087 | 750 days ago | 0.0036 ETH | ||||
16382096 | 776 days ago | 0.0018 ETH | ||||
16382090 | 776 days ago | 0.0018 ETH | ||||
16033709 | 824 days ago | 0.0018 ETH | ||||
15913446 | 841 days ago | 0.0018 ETH | ||||
15913437 | 841 days ago | 0.009 ETH | ||||
15907295 | 842 days ago | 0.0414 ETH | ||||
15901648 | 843 days ago | 0.0072 ETH | ||||
15901640 | 843 days ago | 0.0018 ETH | ||||
15893982 | 844 days ago | 0.0018 ETH | ||||
15876967 | 846 days ago | 0.0018 ETH | ||||
15845342 | 851 days ago | 0.0018 ETH | ||||
15845334 | 851 days ago | 0.0072 ETH | ||||
15845327 | 851 days ago | 0.009 ETH | ||||
15845324 | 851 days ago | 0.0072 ETH | ||||
15845321 | 851 days ago | 0.0072 ETH | ||||
15845315 | 851 days ago | 0.0576 ETH | ||||
15844939 | 851 days ago | 0.0018 ETH | ||||
15844588 | 851 days ago | 0.0054 ETH | ||||
15844555 | 851 days ago | 0.0018 ETH | ||||
15844471 | 851 days ago | 0.0018 ETH | ||||
15844442 | 851 days ago | 0.0054 ETH | ||||
15844438 | 851 days ago | 0.0018 ETH | ||||
15844058 | 851 days ago | 0.0018 ETH | ||||
15843323 | 851 days ago | 0.0018 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
PYEMarket
Compiler Version
v0.8.16+commit.07a7930e
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT LICENSE pragma solidity ^0.8.0; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol"; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; import "@openzeppelin/contracts/security/Pausable.sol"; import "./interfaces/INFT.sol"; import "./interfaces/ITOPIA.sol"; import "./interfaces/IHub.sol"; import "./interfaces/IPYEMarket.sol"; import "./interfaces/IRandomizer.sol"; contract PYEMarket is IPYEMarket, Ownable, ReentrancyGuard, IERC721Receiver, Pausable { using EnumerableSet for EnumerableSet.UintSet; // maximum rank for a Foodie/Baker uint8 public constant MAX_RANK = 8; // struct to store a stake's token, owner, and earning values struct Stake { uint16 tokenId; uint80 value; address owner; uint80 stakedAt; } // struct to store a stake's token, owner, and earning values struct StakeAlpha { uint16 tokenId; uint80 value; address owner; uint80 stakedAt; } mapping(uint16 => uint8) public genesisType; // number of Bakers staked uint256 private numBakersStaked; // number of Foodie staked uint256 private numFoodieStaked; // number of ShopOwner staked uint256 private numShopOwnerStaked; // number of Alpha staked uint256 private numAlphasStaked; uint256 public PERIOD = 1 days; event TokenStaked(address indexed owner, uint256 indexed tokenId, uint8 tokenType, uint256 value); event BakerClaimed(uint256 indexed tokenId, bool indexed unstaked, uint256 earned); event BakerUnStaked(address indexed owner, uint256 indexed tokenId, uint256 blockNum, uint256 timeStamp); event BakerStolen(uint16 indexed tokenId, address indexed victim, address indexed thief, uint256 blockNum, uint256 timeStamp); event FoodieClaimed(uint256 indexed tokenId, bool indexed unstaked, uint256 earned); event FoodieUnStaked(address indexed owner, uint256 indexed tokenId, uint256 blockNum, uint256 timeStamp); event FoodieStolen(uint16 indexed tokenId, address indexed victim, address indexed thief, uint256 blockNum, uint256 timeStamp); event ShopOwnerClaimed(uint256 indexed tokenId, bool indexed unstaked, uint256 earned); event ShopOwnerUnStaked(address indexed owner, uint256 indexed tokenId, uint256 blockNum, uint256 timeStamp); event BoughtPYE(address indexed owner, uint256 indexed tokenId, uint8 boughtPYEType, uint256 rewardInPYE); event AlphaStaked(address indexed owner, uint256 indexed tokenId, uint256 value); event AlphaClaimed(uint256 indexed tokenId, bool indexed unstaked, uint256 earned); event AlphaUnstaked(address indexed owner, uint256 indexed tokenId, uint256 blockNum, uint256 timeStamp); // reference to the NFT contract INFT public lfGenesis; INFT public lfAlpha; // reference to the $TOPIA contract for minting $TOPIA earnings ITOPIA public TOPIAToken; IHub public HUB; // reference to Randomizer IRandomizer public randomizer; address payable vrf; // maps Baker tokenId to stake mapping(uint256 => Stake) private baker; // maps Alpha tokenId to stakeAlpha mapping(uint256 => StakeAlpha) private alpha; // maps Foodie tokenId to stake mapping(uint256 => Stake) private foodie; // array of Foodie token ids; // uint256[] private yieldIds; EnumerableSet.UintSet private foodieIds; // maps ShopOwner tokenId to stake mapping(uint256 => Stake) private shopOwner; // array of ShopOwner token ids; EnumerableSet.UintSet private shopOwnerIds; mapping(address => uint256) ownerBalanceStaked; // array of Owned Genesis token ids; mapping(address => EnumerableSet.UintSet) genesisOwnedIds; // array of Owned Alpha token ids; mapping(address => EnumerableSet.UintSet) alphaOwnedIds; // any rewards distributed when no Foodies are staked uint256 private unaccountedFoodieRewards; // amount of $TOPIA due for each foodie staked uint256 private TOPIAPerFoodie; // any rewards distributed when no ShopOwners are staked uint256 private unaccountedShopOwnerRewards; // amount of $TOPIA due for each ShopOwner staked uint256 private TOPIAPerShopOwner; // Bakers earn 20 $TOPIA per day uint256 public DAILY_BAKER_RATE = 20 * 10**18; // Bakers earn 35 $TOPIA per day uint256 public DAILY_ALPHA_RATE = 35 * 10**18; // Bakers must have 2 days worth of $TOPIA to un-stake or else they're still remaining the armory uint256 public MINIMUM = 40 * 10**18; // rolling price uint256 public PYE_COST = 40 * 10**18; // ShopOwners take a 3% tax on all $TOPIA claimed uint256 public FOODIE_TAX_RATE = 300; // ShopOwners take a 3% tax on all $TOPIA from upgrades uint256 public SHOP_OWNER_TAX_RATE = 300; mapping(uint8 => uint256) pyeFilling; // tx cost for getting random numbers uint256 public SEED_COST = .0008 ether; // amount of $TOPIA earned so far uint256 public totalTOPIAEarned; // the last time $TOPIA was claimed uint80 public claimEndTime; // emergency rescue to allow un-staking without any checks but without $TOPIA bool public rescueEnabled = false; /** */ constructor() { _pause(); } /** CRITICAL TO SETUP */ modifier requireContractsSet() { require(address(lfGenesis) != address(0) && address(TOPIAToken) != address(0) && address(randomizer) != address(0) && address(HUB) != address(0), "Contracts not set"); _; } function setContracts(address _lfGenesis, address _lfAlpha, address _TOPIA, address _HUB, address payable _rand) external onlyOwner { lfGenesis = INFT(_lfGenesis); lfAlpha = INFT(_lfAlpha); TOPIAToken = ITOPIA(_TOPIA); randomizer = IRandomizer(_rand); HUB = IHub(_HUB); vrf = _rand; } // mass update the nftType mapping function setBatchNFTType(uint16[] calldata tokenIds, uint8[] calldata _types) external onlyOwner { require(tokenIds.length == _types.length , " _idNumbers.length != _types.length: Each token ID must have exactly 1 corresponding type!"); for (uint16 i = 0; i < tokenIds.length; i++) { require(_types[i] != 0 , "Invalid nft type - cannot be 0"); genesisType[tokenIds[i]] = _types[i]; } } /** STAKING */ /** * adds Foodies and Baker * @param account the address of the staker * @param tokenIds the IDs of the Foodies and Baker to stake */ function addManyToStakingPool(address account, uint16[] calldata tokenIds) external override nonReentrant { require(tx.origin == msg.sender, "Only EOA"); require(account == tx.origin, "account to send mismatch"); for (uint i = 0; i < tokenIds.length; i++) { require(lfGenesis.ownerOf(tokenIds[i]) == msg.sender, "You don't own this token"); if (genesisType[tokenIds[i]] == 1) { lfGenesis.transferFrom(msg.sender, address(this), tokenIds[i]); _addBakerToStakingPool(account, tokenIds[i]); } else if (genesisType[tokenIds[i]] == 2) { lfGenesis.transferFrom(msg.sender, address(this), tokenIds[i]); _addFoodieToStakingPool(account, tokenIds[i]); } else if (genesisType[tokenIds[i]] == 3) { lfGenesis.transferFrom(msg.sender, address(this), tokenIds[i]); _addShopOwnerToStakingPool(account, tokenIds[i]); } else if (genesisType[tokenIds[i]] == 0) { revert('invalid token id'); } } HUB.emitGenesisStaked(account, tokenIds, 3); } /** * adds a single Foodie to the Armory * @param account the address of the staker * @param tokenId the ID of the Foodie/ShopOwner to add to the Staking Pool */ function _addFoodieToStakingPool(address account, uint256 tokenId) internal whenNotPaused { foodie[tokenId] = Stake({ owner : account, tokenId : uint16(tokenId), value : uint80(TOPIAPerFoodie), stakedAt : uint80(block.timestamp) }); foodieIds.add(tokenId); genesisOwnedIds[account].add(tokenId); numFoodieStaked += 1; emit TokenStaked(account, tokenId, 2, TOPIAPerFoodie); } /** * adds a single ShopOwner to the Armory * @param account the address of the staker * @param tokenId the ID of the Foodie/ShopOwner to add to the Staking Pool */ function _addShopOwnerToStakingPool(address account, uint256 tokenId) internal whenNotPaused { shopOwner[tokenId] = Stake({ owner : account, tokenId : uint16(tokenId), value : uint80(TOPIAPerShopOwner), stakedAt : uint80(block.timestamp) }); shopOwnerIds.add(tokenId); genesisOwnedIds[account].add(tokenId); numShopOwnerStaked += 1; emit TokenStaked(account, tokenId, 3, TOPIAPerShopOwner); } /** * adds a single Baker to the armory * @param account the address of the staker * @param tokenId the ID of the Baker to add to the Staking Pool */ function _addBakerToStakingPool(address account, uint256 tokenId) internal { baker[tokenId] = Stake({ owner : account, tokenId : uint16(tokenId), value : uint80(block.timestamp), stakedAt : uint80(block.timestamp) }); // Add the baker to the armory genesisOwnedIds[account].add(tokenId); numBakersStaked += 1; emit TokenStaked(account, tokenId, 1, block.timestamp); } /** CLAIMING / UNSTAKING */ /** * realize $TOPIA earnings and optionally unstake tokens from the Armory / Yield * to unstake a Baker it will require it has 2 days worth of $TOPIA unclaimed * @param tokenIds the IDs of the tokens to claim earnings from * @param unstake whether or not to unstake ALL of the tokens listed in tokenIds */ function claimManyFromArmoryAndYield(uint16[] calldata tokenIds, bool unstake) external payable whenNotPaused nonReentrant returns (uint16[] memory stolenNFTs){ require(tx.origin == msg.sender, "Only EOA"); uint256 numWords = tokenIds.length; require(msg.value == SEED_COST * numWords, "Invalid value for randomness"); if(unstake) { stolenNFTs = new uint16[](numWords); HUB.emitGenesisUnstaked(msg.sender, tokenIds); } else { stolenNFTs = new uint16[](1); stolenNFTs[0] = 0; } uint256 remainingWords = randomizer.getRemainingWords(); require(remainingWords >= numWords, "Not enough random numbers. Please try again soon."); uint256[] memory seed = randomizer.getRandomWords(numWords); uint256 owed = 0; for (uint i = 0; i < tokenIds.length; i++) { if (genesisType[tokenIds[i]] == 1) { (uint256 _owed, uint16 _stolen) = _claimBakerFromArmory(tokenIds[i], unstake, seed[i]); owed += _owed; if(unstake) {stolenNFTs[i] = _stolen;} } else if (genesisType[tokenIds[i]] == 2) { owed += _claimFoodieFromYield(tokenIds[i], unstake); } else if (genesisType[tokenIds[i]] == 3) { owed += _claimShopOwnerFromYield(tokenIds[i], unstake); } else if (genesisType[tokenIds[i]] == 0) { revert('invalid token id'); } } if (owed == 0) { return stolenNFTs; } totalTOPIAEarned += owed; TOPIAToken.mint(msg.sender, owed); HUB.emitTopiaClaimed(msg.sender, owed); vrf.transfer(msg.value); } /** * realize $TOPIA earnings for a single Baker and optionally unstake it * if not unstaking, lose x% chance * y% percent of accumulated $TOPIA to the staked Foodies based on it's upgrade * if unstaking, there is a % chanc of losing Baker NFT * @param tokenId the ID of the Baker to claim earnings from * @param unstake whether or not to unstake the Baker * @return owed - the amount of $TOPIA earned */ function _claimBakerFromArmory(uint16 tokenId, bool unstake, uint256 seed) internal returns (uint256 owed , uint16 tokId) { require(baker[tokenId].owner == msg.sender, "Don't own the given token"); if(block.timestamp <= claimEndTime) { owed = (block.timestamp - baker[tokenId].value) * DAILY_BAKER_RATE / PERIOD; } else if (baker[tokenId].value < claimEndTime) { owed = (claimEndTime - baker[tokenId].value) * DAILY_BAKER_RATE / PERIOD; } else { owed = 0; } uint256 shopOwnerTax = owed * SHOP_OWNER_TAX_RATE / 10000; _payShopOwnerTax(shopOwnerTax); uint256 foodieTax = owed * FOODIE_TAX_RATE / 10000; _payFoodieTax(foodieTax); owed = owed - shopOwnerTax - foodieTax; bool stolen = false; address thief; if (unstake) { if ((seed & 0xFFFF) % 100 < 10) { thief = randomFoodieOwner(seed); lfGenesis.safeTransferFrom(address(this), thief, tokenId); stolen = true; } delete baker[tokenId]; numBakersStaked -= 1; genesisOwnedIds[msg.sender].remove(tokenId); // reset baker to unarmed if (stolen) { emit BakerStolen(tokenId, msg.sender, thief, block.number, block.timestamp); tokId = tokenId; } else { // Always transfer last to guard against reentrance lfGenesis.safeTransferFrom(address(this), msg.sender, tokenId, ""); } emit BakerUnStaked(msg.sender, tokenId, block.number, block.timestamp); } else {// Claiming baker[tokenId].value = uint80(block.timestamp); // reset stake } emit BakerClaimed(tokenId, unstake, owed); } /** * realize $TOPIA earnings for a single Foodie and optionally unstake it * Foodies earn $TOPIA * @param tokenId the ID of the Foodie to claim earnings from * @param unstake whether or not to unstake the Foodie */ function _claimFoodieFromYield(uint16 tokenId, bool unstake) internal returns (uint256 owed) { require(foodie[tokenId].owner == msg.sender, "Doesn't own given token"); owed = TOPIAPerFoodie - foodie[tokenId].value; if (unstake) { delete foodie[tokenId]; foodieIds.remove(tokenId); genesisOwnedIds[msg.sender].remove(tokenId); numFoodieStaked -= 1; // Always remove last to guard against reentrance lfGenesis.safeTransferFrom(address(this), msg.sender, tokenId, ""); emit FoodieUnStaked(msg.sender, tokenId, block.number, block.timestamp); } else { foodie[tokenId].value = uint80(TOPIAPerFoodie); // reset stake } emit FoodieClaimed(tokenId, unstake, owed); } /** * realize $TOPIA earnings for a ShopOwner Foodie and optionally unstake it * Foodies earn $TOPIA * @param tokenId the ID of the Foodie to claim earnings from * @param unstake whether or not to unstake the ShopOwner Foodie */ function _claimShopOwnerFromYield(uint256 tokenId, bool unstake) internal returns (uint256 owed) { require(shopOwner[tokenId].owner == msg.sender, "Doesn't own given token"); owed = TOPIAPerShopOwner - shopOwner[tokenId].value; if (unstake) { delete shopOwner[tokenId]; shopOwnerIds.remove(tokenId); genesisOwnedIds[msg.sender].remove(tokenId); numShopOwnerStaked -= 1; // Always remove last to guard against reentrance lfGenesis.safeTransferFrom(address(this), msg.sender, tokenId, ""); // Send back ShopOwner emit ShopOwnerUnStaked(msg.sender, tokenId, block.number, block.timestamp); } else { shopOwner[tokenId].value = uint80(TOPIAPerShopOwner); // reset stake } emit ShopOwnerClaimed(tokenId, unstake, owed); } /** * emergency unstake tokens * @param tokenIds the IDs of the tokens to claim earnings from */ function rescue(uint16[] calldata tokenIds) external nonReentrant { require(rescueEnabled, "RESCUE DISABLED"); uint16 tokenId; for (uint i = 0; i < tokenIds.length; i++) { tokenId = tokenIds[i]; if (genesisType[tokenId] == 1) { require(baker[tokenId].owner == msg.sender, "SWIPER, NO SWIPING"); delete baker[tokenId]; genesisOwnedIds[msg.sender].remove(tokenId); numBakersStaked -= 1; lfGenesis.safeTransferFrom(address(this), msg.sender, tokenId, ""); emit BakerClaimed(tokenId, true, 0); } else if (genesisType[tokenId] == 2) { require(foodie[tokenId].owner == msg.sender, "SWIPER, NO SWIPING"); delete foodie[tokenId]; foodieIds.remove(tokenId); genesisOwnedIds[msg.sender].remove(tokenId); numFoodieStaked -= 1; lfGenesis.safeTransferFrom(address(this), msg.sender, tokenId, ""); emit FoodieClaimed(tokenId, true, 0); } else if (genesisType[tokenId] == 3) { require(shopOwner[tokenId].owner == msg.sender, "SWIPER, NO SWIPING"); delete shopOwner[tokenId]; shopOwnerIds.remove(tokenId); genesisOwnedIds[msg.sender].remove(tokenId); numShopOwnerStaked -= 1; lfGenesis.safeTransferFrom(address(this), msg.sender, tokenId, ""); emit ShopOwnerClaimed(tokenId, true, 0); } else if (genesisType[tokenIds[i]] == 0) { revert('invalid token id'); } } HUB.emitGenesisUnstaked(msg.sender, tokenIds); } /* * implement foodie buy pye */ function buyPYE(uint16 tokenId) external payable whenNotPaused nonReentrant returns(uint8) { require(tx.origin == msg.sender, "Only EOA"); require(foodie[tokenId].owner == msg.sender, "Don't own the given token"); require(genesisType[tokenId] == 2, "affected only for Foodie NFTs"); require(msg.value == SEED_COST, "Invalid value for randomness"); TOPIAToken.burnFrom(msg.sender, PYE_COST); uint256 remainingWords = randomizer.getRemainingWords(); require(remainingWords >= 1, "Not enough random numbers. Please try again soon."); uint256[] memory seed = randomizer.getRandomWords(1); uint8 boughtPYE; /* * Odds of PYE: * Dud: 70% * Filled PYE: 25% * Golden Ticket PYE: 5% */ if ((seed[0] & 0xFFFF) % 100 < 5) { boughtPYE = 3; } else if((seed[0] & 0xFFFF) % 100 < 30) { boughtPYE = 2; } else { boughtPYE = 1; } if(pyeFilling[boughtPYE] > 0) { TOPIAToken.mint(msg.sender, pyeFilling[boughtPYE]); HUB.emitTopiaClaimed(msg.sender, pyeFilling[boughtPYE]); } vrf.transfer(msg.value); emit BoughtPYE(msg.sender, tokenId, boughtPYE, pyeFilling[boughtPYE]); return boughtPYE; } /** ACCOUNTING */ /** * add $TOPIA to claimable pot for the Foodie Yield * @param amount $TOPIA to add to the pot */ function _payFoodieTax(uint256 amount) internal { if (numFoodieStaked == 0) {// if there's no staked Foodies unaccountedFoodieRewards += amount; // keep track of $TOPIA due to Foodies return; } // makes sure to include any unaccounted $GP TOPIAPerFoodie += (amount + unaccountedFoodieRewards) / numFoodieStaked; unaccountedFoodieRewards = 0; } /** * add $TOPIA to claimable pot for the ShopOwner Yield * @param amount $TOPIA to add to the pot */ function _payShopOwnerTax(uint256 amount) internal { if (numShopOwnerStaked == 0) {// if there's no staked shopOwners unaccountedShopOwnerRewards += amount; // keep track of $TOPIA due to shopOwners return; } // makes sure to include any unaccounted $GP TOPIAPerShopOwner += (amount + unaccountedShopOwnerRewards) / numShopOwnerStaked; unaccountedShopOwnerRewards = 0; } /** ALPHA FUNCTIONS */ /** * adds Foodies and Baker * @param account the address of the staker * @param tokenIds the IDs of the Foodies and Baker to stake */ function addManyAlphaToStakingPool(address account, uint16[] calldata tokenIds) external nonReentrant { require(tx.origin == msg.sender, "Only EOA"); require(account == tx.origin, "account to send mismatch"); for (uint i = 0; i < tokenIds.length; i++) { require(lfAlpha.ownerOf(tokenIds[i]) == msg.sender, "You don't own this token"); lfAlpha.transferFrom(msg.sender, address(this), tokenIds[i]); alpha[tokenIds[i]] = StakeAlpha({ owner : account, tokenId : uint16(tokenIds[i]), value : uint80(block.timestamp), stakedAt : uint80(block.timestamp) }); // Add the baker to the armory alphaOwnedIds[account].add(tokenIds[i]); numAlphasStaked += 1; emit AlphaStaked(account, tokenIds[i], block.timestamp); } HUB.emitAlphaStaked(account, tokenIds, 3); } /** * realize $TOPIA earnings and optionally unstake Alpha tokens * @param tokenIds the IDs of the tokens to claim earnings from * @param unstake whether or not to unstake ALL of the tokens listed in tokenIds */ function claimManyAlphas(uint16[] calldata tokenIds, bool unstake) external whenNotPaused nonReentrant { require(tx.origin == msg.sender, "Only EOA"); uint256 owed = 0; for (uint i = 0; i < tokenIds.length; i++) { require(alpha[tokenIds[i]].owner == msg.sender, "Don't own the given token"); if(block.timestamp <= claimEndTime) { owed += (block.timestamp - alpha[tokenIds[i]].value) * DAILY_ALPHA_RATE / PERIOD; } else if (alpha[tokenIds[i]].value < claimEndTime) { owed += (claimEndTime - alpha[tokenIds[i]].value) * DAILY_ALPHA_RATE / PERIOD; } else { owed += 0; } if (unstake) { delete alpha[tokenIds[i]]; numAlphasStaked -= 1; alphaOwnedIds[msg.sender].remove(tokenIds[i]); lfAlpha.transferFrom(address(this), msg.sender, tokenIds[i]); emit AlphaUnstaked(msg.sender, tokenIds[i], block.number, block.timestamp); } else { alpha[tokenIds[i]].value = uint80(block.timestamp); } emit AlphaClaimed(tokenIds[i], unstake, owed); } if (owed == 0) { return; } if(unstake) { HUB.emitAlphaUnstaked(msg.sender, tokenIds); } HUB.emitTopiaClaimed(msg.sender, owed); TOPIAToken.mint(msg.sender, owed); totalTOPIAEarned += owed; } /** * emergency unstake tokens * @param tokenIds the IDs of the tokens to claim earnings from */ function rescueAlpha(uint16[] calldata tokenIds) external nonReentrant { require(rescueEnabled, "RESCUE DISABLED"); uint16 tokenId; for (uint i = 0; i < tokenIds.length; i++) { tokenId = tokenIds[i]; require(alpha[tokenId].owner == msg.sender, "SWIPER, NO SWIPING"); delete alpha[tokenId]; numAlphasStaked -= 1; alphaOwnedIds[msg.sender].remove(tokenId); lfAlpha.transferFrom(address(this), msg.sender, tokenId); emit AlphaUnstaked(msg.sender, tokenId, block.number, block.timestamp); } HUB.emitAlphaUnstaked(msg.sender, tokenIds); } /** ADMIN */ /** * allows owner to enable "rescue mode" * simplifies accounting, prioritizes tokens out in emergency */ function setRescueEnabled(bool _enabled) external onlyOwner { rescueEnabled = _enabled; } function isOwner(uint16 tokenId, address owner) external view override returns (bool validOwner) { if (genesisType[tokenId] == 1) { return baker[tokenId].owner == owner; } else if (genesisType[tokenId] == 2) { return foodie[tokenId].owner == owner; } else if (genesisType[tokenId] == 3) { return shopOwner[tokenId].owner == owner; } } /** * enables owner to pause / unpause contract */ function setPaused(bool _paused) external requireContractsSet onlyOwner { if (_paused) _pause(); else _unpause(); } /** READ ONLY */ function getUnclaimedAlpha(uint16 tokenId) external view returns (uint256) { if(alpha[tokenId].value > 0) { if(block.timestamp <= claimEndTime) { return (block.timestamp - alpha[tokenId].value) * DAILY_ALPHA_RATE / PERIOD; } else if (alpha[tokenId].value < claimEndTime) { return (claimEndTime - alpha[tokenId].value) * DAILY_ALPHA_RATE / PERIOD; } else { return 0; } } else { return 0; } } function getUnclaimedGenesis(uint16 tokenId) external view returns (uint256 owed) { owed = 0; if (genesisType[tokenId] == 1 && baker[tokenId].value > 0) { if(block.timestamp <= claimEndTime) { return (block.timestamp - baker[tokenId].value) * DAILY_BAKER_RATE / PERIOD; } else if (baker[tokenId].value < claimEndTime) { return (claimEndTime - baker[tokenId].value) * DAILY_BAKER_RATE / PERIOD; } else { return 0; } } else if (genesisType[tokenId] == 2 && foodie[tokenId].owner != address(0)) { return TOPIAPerFoodie - foodie[tokenId].value; } else if (genesisType[tokenId] == 3 && shopOwner[tokenId].owner != address(0)) { return TOPIAPerShopOwner - shopOwner[tokenId].value; } return owed; } function getUnclaimedTopiaForUser(address _account) external view returns (uint256) { uint256 owed; uint256 genesisLength = genesisOwnedIds[_account].length(); uint256 alphaLength = alphaOwnedIds[_account].length(); for (uint i = 0; i < genesisLength; i++) { uint16 tokenId = uint16(genesisOwnedIds[_account].at(i)); if (genesisType[tokenId] == 1) { if(block.timestamp <= claimEndTime) { owed += (block.timestamp - baker[tokenId].value) * DAILY_BAKER_RATE / PERIOD; } else if (baker[tokenId].value < claimEndTime) { owed += (claimEndTime - baker[tokenId].value) * DAILY_BAKER_RATE / PERIOD; } else { owed += 0; } } else if (genesisType[tokenId] == 2) { owed += TOPIAPerFoodie - foodie[tokenId].value; } else if (genesisType[tokenId] == 3) { owed += TOPIAPerShopOwner - shopOwner[tokenId].value; } else if (genesisType[tokenId] == 0) { continue; } } for (uint i = 0; i < alphaLength; i++) { uint16 tokenId = uint16(alphaOwnedIds[_account].at(i)); if(block.timestamp <= claimEndTime) { owed += (block.timestamp - alpha[tokenId].value) * DAILY_ALPHA_RATE / PERIOD; } else if (alpha[tokenId].value < claimEndTime) { owed += (claimEndTime - alpha[tokenId].value) * DAILY_ALPHA_RATE / PERIOD; } else { owed += 0; } } return owed; } function getStakedGenesisForUser(address _account) external view returns (uint16[] memory stakedGensis) { uint256 length = genesisOwnedIds[_account].length(); stakedGensis = new uint16[](length); for (uint i = 0; i < length; i++) { stakedGensis[i] = uint16(genesisOwnedIds[_account].at(i)); } } function getStakedAlphasForUser(address _account) external view returns (uint16[] memory stakedAlphas) { uint256 length = alphaOwnedIds[_account].length(); stakedAlphas = new uint16[](length); for (uint i = 0; i < length; i++) { stakedAlphas[i] = uint16(alphaOwnedIds[_account].at(i)); } } /** * chooses a random Foodie thief when an unstaking token is stolen * @param seed a random value to choose a Foodie from * @return the owner of the randomly selected Baker thief */ function randomFoodieOwner(uint256 seed) internal view returns (address) { if (foodieIds.length() == 0) { return address(0x0); } uint256 bucket = (seed & 0xFFFFFFFF) % foodieIds.length(); return foodie[foodieIds.at(bucket)].owner; } /** * chooses a random ShopOwner thief when a an unstaking token is stolen * @param seed a random value to choose a ShopOwner from * @return the owner of the randomly selected Foodie thief */ function randomShopOwnerOwner(uint256 seed) internal view returns (address) { if (shopOwnerIds.length() == 0) { return address(0x0); } uint256 bucket = (seed & 0xFFFFFFFF) % shopOwnerIds.length(); return shopOwner[shopOwnerIds.at(bucket)].owner; } function onERC721Received( address, address, uint256, bytes calldata ) external pure override returns (bytes4) { return IERC721Receiver.onERC721Received.selector; } function updateMinimumExit(uint256 _minimum) external onlyOwner { MINIMUM = _minimum; } function updatePeriod(uint256 _period) external onlyOwner { PERIOD = _period; } function updateDailyBakerRate(uint256 _rate) external onlyOwner { DAILY_BAKER_RATE = _rate; } function updateDailyAlphaRate(uint256 _rate) external onlyOwner { DAILY_ALPHA_RATE = _rate; } function updateTaxRates(uint8 _foodieRate, uint8 _vetRate) external onlyOwner { FOODIE_TAX_RATE = _foodieRate; SHOP_OWNER_TAX_RATE = _vetRate; } function updatePYEFillings(uint256 dudPYE, uint256 filledPYE, uint256 goldenTicketPYE) external onlyOwner { pyeFilling[1] = dudPYE; pyeFilling[2] = filledPYE; pyeFilling[3] = goldenTicketPYE; } function updatePYECost(uint256 _cost) external onlyOwner { PYE_COST = _cost; } function updateSeedCost(uint256 _cost) external onlyOwner { SEED_COST = _cost; } function closeSeasonEearnings(uint80 _timestamp) external onlyOwner { claimEndTime = _timestamp; } }
// SPDX-License-Identifier: MIT LICENSE pragma solidity ^0.8.0; interface IRandomizer { function requestRandomWords() external returns (uint256); function requestManyRandomWords(uint256 numWords) external returns (uint256); function getRandomWords(uint256 number) external returns (uint256[] memory); function getRemainingWords() external view returns (uint256); }
// SPDX-License-Identifier: MIT LICENSE pragma solidity ^0.8.0; interface IPYEMarket { function addManyToStakingPool(address account, uint16[] calldata tokenIds) external; function isOwner(uint16 tokenId, address owner) external view returns (bool); }
// SPDX-License-Identifier: MIT LICENSE pragma solidity ^0.8.0; interface IHub { function emitGenesisStaked(address owner, uint16[] calldata tokenIds, uint8 gameId) external; function emitAlphaStaked(address owner, uint16[] calldata tokenIds, uint8 gameId) external; function emitGenesisUnstaked(address owner, uint16[] calldata tokenIds) external; function emitAlphaUnstaked(address owner, uint16[] calldata tokenIds) external; function emitTopiaClaimed(address owner, uint256 amount) external; function balanceOf(address owner) external view returns (uint256); }
// SPDX-License-Identifier: MIT LICENSE pragma solidity ^0.8.0; interface ITOPIA { function mint(address to, uint256 amount) external; function burn(uint256 amount) external; function burnFrom(address from, uint256 amount) external; function updateOriginAccess() external; function transferFrom(address sender, address recipient, uint256 amount) external returns(bool); }
// SPDX-License-Identifier: MIT LICENSE pragma solidity ^0.8.0; import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol"; interface INFT is IERC721Enumerable { }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/structs/EnumerableSet.sol) pragma solidity ^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. * * [WARNING] * ==== * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure unusable. * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info. * * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an array of EnumerableSet. * ==== */ 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; if (lastIndex != toDeleteIndex) { 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] = valueIndex; // Replace lastValue's index to valueIndex } // 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) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // 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); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { return _values(set._inner); } // 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)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // 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)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^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 `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/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() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^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); /** * @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 // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/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`. * * 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; /** * @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 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 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 the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^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); }
{ "optimizer": { "enabled": true, "runs": 200 }, "evmVersion": "byzantium", "viaIR": true, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"bool","name":"unstaked","type":"bool"},{"indexed":false,"internalType":"uint256","name":"earned","type":"uint256"}],"name":"AlphaClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"AlphaStaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"blockNum","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timeStamp","type":"uint256"}],"name":"AlphaUnstaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"bool","name":"unstaked","type":"bool"},{"indexed":false,"internalType":"uint256","name":"earned","type":"uint256"}],"name":"BakerClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"tokenId","type":"uint16"},{"indexed":true,"internalType":"address","name":"victim","type":"address"},{"indexed":true,"internalType":"address","name":"thief","type":"address"},{"indexed":false,"internalType":"uint256","name":"blockNum","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timeStamp","type":"uint256"}],"name":"BakerStolen","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"blockNum","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timeStamp","type":"uint256"}],"name":"BakerUnStaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"boughtPYEType","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"rewardInPYE","type":"uint256"}],"name":"BoughtPYE","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"bool","name":"unstaked","type":"bool"},{"indexed":false,"internalType":"uint256","name":"earned","type":"uint256"}],"name":"FoodieClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"tokenId","type":"uint16"},{"indexed":true,"internalType":"address","name":"victim","type":"address"},{"indexed":true,"internalType":"address","name":"thief","type":"address"},{"indexed":false,"internalType":"uint256","name":"blockNum","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timeStamp","type":"uint256"}],"name":"FoodieStolen","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"blockNum","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timeStamp","type":"uint256"}],"name":"FoodieUnStaked","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":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"bool","name":"unstaked","type":"bool"},{"indexed":false,"internalType":"uint256","name":"earned","type":"uint256"}],"name":"ShopOwnerClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"blockNum","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timeStamp","type":"uint256"}],"name":"ShopOwnerUnStaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"tokenType","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TokenStaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DAILY_ALPHA_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DAILY_BAKER_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FOODIE_TAX_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HUB","outputs":[{"internalType":"contract IHub","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_RANK","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINIMUM","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERIOD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PYE_COST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SEED_COST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SHOP_OWNER_TAX_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOPIAToken","outputs":[{"internalType":"contract ITOPIA","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint16[]","name":"tokenIds","type":"uint16[]"}],"name":"addManyAlphaToStakingPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint16[]","name":"tokenIds","type":"uint16[]"}],"name":"addManyToStakingPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"tokenId","type":"uint16"}],"name":"buyPYE","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"claimEndTime","outputs":[{"internalType":"uint80","name":"","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"tokenIds","type":"uint16[]"},{"internalType":"bool","name":"unstake","type":"bool"}],"name":"claimManyAlphas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"tokenIds","type":"uint16[]"},{"internalType":"bool","name":"unstake","type":"bool"}],"name":"claimManyFromArmoryAndYield","outputs":[{"internalType":"uint16[]","name":"stolenNFTs","type":"uint16[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint80","name":"_timestamp","type":"uint80"}],"name":"closeSeasonEearnings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"genesisType","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"getStakedAlphasForUser","outputs":[{"internalType":"uint16[]","name":"stakedAlphas","type":"uint16[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"getStakedGenesisForUser","outputs":[{"internalType":"uint16[]","name":"stakedGensis","type":"uint16[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"tokenId","type":"uint16"}],"name":"getUnclaimedAlpha","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"tokenId","type":"uint16"}],"name":"getUnclaimedGenesis","outputs":[{"internalType":"uint256","name":"owed","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"getUnclaimedTopiaForUser","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"tokenId","type":"uint16"},{"internalType":"address","name":"owner","type":"address"}],"name":"isOwner","outputs":[{"internalType":"bool","name":"validOwner","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lfAlpha","outputs":[{"internalType":"contract INFT","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lfGenesis","outputs":[{"internalType":"contract INFT","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"randomizer","outputs":[{"internalType":"contract IRandomizer","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"tokenIds","type":"uint16[]"}],"name":"rescue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"tokenIds","type":"uint16[]"}],"name":"rescueAlpha","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rescueEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"tokenIds","type":"uint16[]"},{"internalType":"uint8[]","name":"_types","type":"uint8[]"}],"name":"setBatchNFTType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lfGenesis","type":"address"},{"internalType":"address","name":"_lfAlpha","type":"address"},{"internalType":"address","name":"_TOPIA","type":"address"},{"internalType":"address","name":"_HUB","type":"address"},{"internalType":"address payable","name":"_rand","type":"address"}],"name":"setContracts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setRescueEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalTOPIAEarned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rate","type":"uint256"}],"name":"updateDailyAlphaRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rate","type":"uint256"}],"name":"updateDailyBakerRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minimum","type":"uint256"}],"name":"updateMinimumExit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"updatePYECost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"dudPYE","type":"uint256"},{"internalType":"uint256","name":"filledPYE","type":"uint256"},{"internalType":"uint256","name":"goldenTicketPYE","type":"uint256"}],"name":"updatePYEFillings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"updatePeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"updateSeedCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_foodieRate","type":"uint8"},{"internalType":"uint8","name":"_vetRate","type":"uint8"}],"name":"updateTaxRates","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608080604052346100f1576000805433600160a060020a03198216811783557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258936020939092600160a060020a0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09084a360018055600160ff1960025416620151806008556801158e460913d00000601e556801e5b8fa8fe2ac0000601f5568022b1c8c1227a0000080855560215561012c806022556023556602d79883d200006025556aff00000000000000000000196027541660275517600255338152a160405161471d90816100f78239f35b600080fdfe6080604052600436101561001257600080fd5b7c01000000000000000000000000000000000000000000000000000000006000350480630a6b6f1c1461235d57806313667ed814611d78578063140233cf14611d5a578063150b7a0214611cd857806316c38b3c14611b5257806318f5c77114611ad95780631b218df514611ab257806321c8da9a1461163b5780632813fdc51461161a5780632b6c88bf146115dc5780632da43dc5146115be57806338f7ba781461152a57806339db714f146114fa5780633e18842d146114dc57806340d1d255146114b55780634f047196146114705780635c975abb1461144d5780635fd191261461105157806367efe7491461102a5780636f7c0d4614610fe9578063715018a614610f8b57806372bbccf314610f6d5780637653100814610f155780637bc09e3e14610ef45780637d5f954714610ed6578063887dd1db14610e3f5780638a73092b14610e215780638aca0cad14610e005780638da5cb5b14610dd95780639073c1b314610db65780639c484b5c14610d995780639e3bcb8d14610d7d578063a2bddd1714610d56578063a4c52b8614610d2f578063a6d2de9814610d04578063b4d1d79514610ce6578063bd48652e14610cc8578063be07528b14610c92578063c2286ab514610995578063dbce286414610962578063dfd1f6f714610941578063e270d1df14610920578063e4e85a9e1461062d578063e5d7c2bc146105f5578063e835bae3146105d4578063efa09d6814610405578063f10fb584146103de578063f2fde38b146102fe5763f63bf8bd1461025357600080fd5b346102f95760a03660031901126102f95761026c61257b565b610274612591565b90604435600160a060020a03908181168091036102f957606435918083168093036102f957608435948186168096036102f9576102af612686565b81600160a060020a031995168560095416176009551683600a541617600a5582600b541617600b558282600d541617600d5581600c541617600c55600e541617600e556000604051f35b600080fd5b346102f95760203660031901126102f95761031761257b565b61031f612686565b600160a060020a038091169081156103715760009182549181600160a060020a0319841617845560405192167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08484a3f35b608460405160e560020a62461bcd02815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152fd5b346102f95760003660031901126102f9576020600160a060020a03600d5416604051908152f35b346102f95760403660031901126102f95767ffffffffffffffff6004358181116102f95761043790369060040161254b565b9060249283359081116102f95761045290369060040161254b565b9261045b612686565b8381036105415760005b61ffff808216908382101561053f5760ff908161048b610486858b8a6126e1565b61270a565b16156104f8576104b26104ad6104a5610486868c8b6126e1565b94878a6126e1565b612718565b1660005260036020526040600020911660ff1982541617905561ffff8091169081146104e057600101610465565b8560e060020a634e487b710260005260116004526000fd5b606489601e6040519160e560020a62461bcd028352602060048401528201527f496e76616c6964206e66742074797065202d2063616e6e6f74206265203000006044820152fd5b005b60a485605a6040519160e560020a62461bcd028352602060048401528201527f205f69644e756d626572732e6c656e67746820213d205f74797065732e6c656e60448201527f6774683a204561636820746f6b656e204944206d75737420686176652065786160648201527f63746c79203120636f72726573706f6e64696e672074797065210000000000006084820152fd5b346102f95760203660031901126102f9576105ed612686565b600435602055005b346102f95760203660031901126102f95761ffff610611612639565b166000526003602052602060ff60406000205416604051908152f35b346102f95761063b366125a7565b61064d60026001949394541415612727565b600260015561065d333214612775565b61067132600160a060020a038416146127c3565b60005b8181106106fd5750600160a060020a03600c5416803b156102f9576106cd9360008094604051968795869485937fdca3b79e00000000000000000000000000000000000000000000000000000000855260048501612966565b03925af180156106f1576106e2575b60018055005b6106eb90612820565b806106dc565b6040513d6000823e3d90fd5b600160a060020a03600a54166107176104ad8385886126e1565b61ffff604051917f6352211e000000000000000000000000000000000000000000000000000000008352166004820152602081602481855afa80156106f157610773916000916108f1575b50600160a060020a031633146128aa565b6107816104ad8385886126e1565b90803b156102f9576107b360009291839260405194858094819360e060020a6323b872dd0283523033600485016128f8565b03925af180156106f1576108e2575b506108306107d46104ad8385886126e1565b61ffff604051916107e48361284d565b168152426001605060020a031660208201819052600160a060020a0386166040830152606082015261ffff61081d6104ad85878a6126e1565b16600052601060205260406000206129c8565b600160a060020a0383166000526019602052610862604060002061ffff61085b6104ad85878a6126e1565b1690612bfa565b506007908154600181018091116108c9576108c4925561ffff6108896104ad8386896126e1565b166040514281527f9a3548e7da710b05c129b310e734c5830e4c53cc9255c7d47219adf7f1098ea16020600160a060020a03881692a3612811565b610674565b60e060020a634e487b7102600052601160045260246000fd5b6108eb90612820565b846107c2565b610913915060203d602011610919575b61090b8183612869565b81019061288b565b87610762565b503d610901565b346102f95760203660031901126102f957610939612686565b600435600855005b346102f95760203660031901126102f95761095a612686565b600435602155005b346102f9576106dc6109733661264a565b9161097c612a45565b61098b60026001541415612727565b6002600155613f64565b346102f9576020806003193601126102f9576109af61257b565b600160a060020a0360009116806000526018808452604060002054601991828652604060002054916000915b818310610aeb575050506000916001605060020a039081602754169081421115955b848610610a0e578888604051908152f35b9091929394959796610a8c908260005283895261ffff610a32896040600020612b06565b905460089291830260020a9004168b15610a9a57610a869291610a809160005260108c52610a78610a6f8a62010000604060002054041642613b0f565b601f5490612c70565b905490613aec565b90612a38565b96612811565b9493929190979596976109fd565b60005260108a528662010000878282604060002054041610600014610ae25791610a78610ad7610a8093610a86969560406000205404168a613ad3565b8a601f549116612c70565b50505096612811565b9091949392969584600052818752610b07866040600020612b06565b91905461ffff6008918260029502850a900416806000526003808b5260ff946001866040600020541614600014610bf0575050602754610b8f94506001605060020a03918b918316428110610b9c5750610b80610a8093600f610b89979694610a78946000525262010000604060002054041642613b0f565b601e5490612c70565b95612811565b91909692939495966109db565b9150600052600f8b5262010000818382604060002054041610600014610be65782610bdc610b89969593610a8095610a7894604060002054041690613ad3565b601e549116612c70565b5050505095612811565b909193948093506040600020541614600014610c3d575050610b8f91610a80610b8992601b549060005260118b526001605060020a0362010000604060002054041690613b0f565b612811565b908092506040600020541614600014610c7c5750610b89610b8f91610a80601d5460148b526001605060020a0362010000604060002054041690613b0f565b95610b8f919660406000205416610c3857612811565b346102f95760403660031901126102f9576020610cbe610cb0612639565b610cb8612591565b906143c3565b6040519015158152f35b346102f95760003660031901126102f9576020602654604051908152f35b346102f95760003660031901126102f9576020600854604051908152f35b346102f95760203660031901126102f9576020610d27610d22612639565b614505565b604051908152f35b346102f95760003660031901126102f9576020600160a060020a03600c5416604051908152f35b346102f95760003660031901126102f9576020600160a060020a03600a5416604051908152f35b346102f95760003660031901126102f957602060405160088152f35b346102f95760003660031901126102f95760208054604051908152f35b346102f95760203660031901126102f9576020610d27610dd4612639565b614474565b346102f95760003660031901126102f9576020600160a060020a0360005416604051908152f35b346102f95760203660031901126102f957610e19612686565b600435602555005b346102f95760003660031901126102f9576020602254604051908152f35b346102f9576020806003193601126102f957600160a060020a03610e6161257b565b169081600052601880825260406000205491610e7c83612ce9565b9360005b848110610e995760405180610e9588826125fa565b0390f35b610ed1908260005284845261ffff6008610eb7836040600020612b06565b9054910260020a900416610ecb8289612d28565b52612811565b610e80565b346102f95760003660031901126102f9576020602554604051908152f35b346102f95760203660031901126102f957610f0d612686565b600435601f55005b346102f95760203660031901126102f957610f2e6125eb565b610f36612686565b602780546aff0000000000000000000019169115156a0100000000000000000000026aff0000000000000000000016919091179055005b346102f95760003660031901126102f9576020602154604051908152f35b346102f95760003660031901126102f957610fa4612686565b60008054600160a060020a03198116825581600160a060020a0360405192167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08284a3f35b610e9561101a610ff83661264a565b91611001612a45565b61101060026001541415612727565b6002600155612e66565b60018055604051918291826125fa565b346102f95760003660031901126102f9576020600160a060020a0360095416604051908152f35b6020806003193601126102f957611066612639565b61106e612a45565b600161107e600282541415612727565b6002815561108d333214612775565b61ffff8092168060005260118452600160a060020a03926110bc3385606060020a604060002054041614613a85565b8160005260038552600260ff6040600020541603611406576110e16025543414612c83565b83600b541660215490803b156102f9576111306000929183926040519485809481937f79cc67900000000000000000000000000000000000000000000000000000000083523360048401612e4b565b03925af180156106f1576113f7575b5083600d54166040517f4ea943e70000000000000000000000000000000000000000000000000000000081528681600481855afa80156106f15785916000916113c4575b50916111956000939284931015612d5e565b6024604051809481937f4b3c08f30000000000000000000000000000000000000000000000000000000083528960048401525af19081156106f1576000916113a1575b5060056064836111e784612d1b565b511606101561137957505060ff60035b1692836000526024855260406000205461127a575b600080808093600e541681903415611270575b3491f1156106f157826000526024845260406000205460405190848252858201527fcc4bf3c87e65beb79510f170f073a60e195b51f699e8ad36a6c7fb464a2c59b160403392a38055604051908152f35b6108fc915061121f565b80600b541660406000205490803b156102f9576112cc6000929183926040519485809481937f40c10f190000000000000000000000000000000000000000000000000000000083523360048401612e4b565b03925af180156106f15761136a575b5080600c541690846000526024865260406000205491803b156102f9576113376000939184926040519586809481937f1fb2e3e70000000000000000000000000000000000000000000000000000000083523360048401612e4b565b03925af19182156106f15760009283928392839261135b575b50935050505061120c565b61136490612820565b89611350565b61137390612820565b856112db565b601e91611387606492612d1b565b51160610156113995760ff60026111f7565b60ff826111f7565b6113be91503d806000833e6113b68183612869565b810190612dd2565b866111d8565b809250888092503d83116113f0575b6113dd8183612869565b810103126102f957518490611195611183565b503d6113d3565b61140090612820565b8561113f565b6064856040519060e560020a62461bcd0282526004820152601d60248201527f6166666563746564206f6e6c7920666f7220466f6f646965204e4654730000006044820152fd5b346102f95760003660031901126102f957602060ff600254166040519015158152f35b346102f95760203660031901126102f9576004356001605060020a0381168091036102f95761149d612686565b6001605060020a031960275416176027556000604051f35b346102f95760003660031901126102f95760206001605060020a0360275416604051908152f35b346102f95760003660031901126102f9576020601e54604051908152f35b346102f95760003660031901126102f957602060ff6a010000000000000000000060275404166040519015158152f35b346102f95760603660031901126102f957611543612686565b602460208190526004357fbbbb3b1da0cb0951f34c5e9db4606f934b7367b5284f29163e9e6fe67e1e97d655357f47bb5529a97e2b401b32950f6360fbc9e3f4e70b887dc0f9b9ad1f7402ca11da5560036000526044357f8a6809e43cef135a96df89aa3c0800baae7c497913adf6156625c15a6f57cdf055005b346102f95760003660031901126102f9576020602354604051908152f35b346102f95760403660031901126102f95760043560ff81168091036102f9576024359060ff82168092036102f957611612612686565b602255602355005b346102f95760203660031901126102f957611633612686565b600435601e55005b346102f95760203660031901126102f95760043567ffffffffffffffff81116102f95761166c90369060040161254b565b9061167c60026001541415612727565b600260015561169c60ff6a01000000000000000000006027540416613e3f565b60005b8281106116f95750600160a060020a03600c541691823b156102f9576106cd92600092836040518096819582947fd8cd1ec40000000000000000000000000000000000000000000000000000000084523360048501612d3b565b6117076104ad8285856126e1565b9061ffff808316600052600380602052600160ff604060002054161460001461182c5750808316600052600f80602052600160a060020a039061175882606060020a60406000205404163314613e8d565b828516600052602052600060016040822082815501553360005260186020526117878285166040600020613cf4565b5060045460001981019081116108c9576004556009541692833b156102f9576000604051809560e160020a635c46a7ef0282528183816117cc87333060048501613b1c565b03925af19384156106f15760206001937fea1381bbef2d85e346847379f861f1298d054ba6f36007c75a53286883c294a4926118189761181d575b5060405193600085521692a3612811565b61169f565b61182690612820565b89611807565b60406000205460ff1660020361193357508083166000526011602052600160a060020a0361186881606060020a60406000205404163314613e8d565b83821660008181526011602052604081208181556001015561188990613c47565b503360005260186020526118a38285166040600020613cf4565b50600580546000198101919082116108c957556009541692833b156102f9576000604051809560e160020a635c46a7ef0282528183816118e887333060048501613b1c565b03925af19384156106f15760206001937f1e8252626aabb1c7dbde4ada8f5d81140eac89c522f5374e184e858cdf2b6058926118189761181d575060405193600085521692a3612811565b60406000205460ff168103611a3b5750808316600052601480602052600160a060020a039061197082606060020a60406000205404163314613e8d565b82851660005260205260006001604082208281550155611991828516613b50565b503360005260186020526119ab8285166040600020613cf4565b50600680546000198101919082116108c957556009541692833b156102f9576000604051809560e160020a635c46a7ef0282528183816119f087333060048501613b1c565b03925af19384156106f15760206001937f217dd63172e0276a9a451c75b92122fbc5f58d04762a180557200d33502fa366926118189761181d575060405193600085521692a3612811565b919250611a4c6104ad8487876126e1565b1660005260205260ff6040600020541615611a6a5761181890612811565b60405160e560020a62461bcd02815260206004820152601060248201527f696e76616c696420746f6b656e206964000000000000000000000000000000006044820152606490fd5b346102f95760003660031901126102f9576020600160a060020a03600b5416604051908152f35b346102f9576020806003193601126102f957600160a060020a03611afb61257b565b169081600052601980825260406000205491611b1683612ce9565b9360005b848110611b2f5760405180610e9588826125fa565b611b4d908260005284845261ffff6008610eb7836040600020612b06565b611b1a565b346102f95760203660031901126102f957611b6b6125eb565b600160a060020a03806009541615159081611cca575b81611cbc575b81611cae575b5015611c6757611b9b612686565b15611be157611ba8612a45565b600160ff1960025416176002557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586020604051338152a1005b60025460ff811615611c205760ff19166002557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6020604051338152a1005b606460405160e560020a62461bcd02815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152fd5b606460405160e560020a62461bcd02815260206004820152601160248201527f436f6e747261637473206e6f74207365740000000000000000000000000000006044820152fd5b9050600c5416151582611b8d565b600d54811615159150611b87565b600b54811615159150611b81565b346102f95760803660031901126102f957611cf161257b565b50611cfa612591565b5060643567ffffffffffffffff8082116102f957366023830112156102f95781600401359081116102f957369101602401116102f95760206040517f150b7a02000000000000000000000000000000000000000000000000000000008152f35b346102f95760003660031901126102f9576020601f54604051908152f35b346102f957611d86366125a7565b611d9860026001949394541415612727565b6002600155611da8333214612775565b611dbc32600160a060020a038416146127c3565b60005b818110611e185750600160a060020a03600c5416803b156102f9576106cd9360008094604051968795869485937fb25ada4a00000000000000000000000000000000000000000000000000000000855260048501612966565b929190600160a060020a0360095416611e356104ad8684876126e1565b61ffff604051917f6352211e000000000000000000000000000000000000000000000000000000008352166004820152602081602481855afa80156106f157611e90916000916108f15750600160a060020a031633146128aa565b61ffff611ea16104ad8785886126e1565b16600052600360205260ff6001816040600020541614600014612008575050909192600160a060020a0360095416611edd6104ad8385886126e1565b90803b156102f957611f0f60009291839260405194858094819360e060020a6323b872dd0283523033600485016128f8565b03925af180156106f157611ff9575b5061ffff611f306104ad8385886126e1565b1690611f7c6001605060020a03421660405190611f4c8261284d565b848252806020830152600160a060020a0387166040830152606082015283600052600f60205260406000206129c8565b600160a060020a0384166000526018602052611f9c826040600020612bfa565b5060045491600183018093116108c957611ff492600455604051600181524260208201527fadd17b9d82cb146eaff151f4f864faa55b09599b4eff7714935025b99054fe1c6040600160a060020a03881692a3612811565b611dbf565b61200290612820565b84611f1e565b61ffff6120196104ad8886896126e1565b16600052600360205260028160406000205416146000146121ad575050600160a060020a03600954166120506104ad8684876126e1565b90803b156102f95761208260009291839260405194858094819360e060020a6323b872dd0283523033600485016128f8565b03925af180156106f15761219e575b5061ffff6120a36104ad8684876126e1565b16936120ad612a45565b6001605060020a0394601b8681541696604051976120ca8961284d565b8389526020890152600160a060020a038616604089015242166060880152816000526121006011978860205260406000206129c8565b61210982612ba8565b50600160a060020a038516600052601860205261212a826040600020612bfa565b5060058054906001820180921161218657611ff495969798505554604051906002825260208201527fadd17b9d82cb146eaff151f4f864faa55b09599b4eff7714935025b99054fe1c6040600160a060020a03881692a3612811565b8860e060020a634e487b710260005260045260246000fd5b6121a790612820565b84612091565b61ffff6121c26104ad8886899a9798996126e1565b166000526003602052600381604060002054161460001461232c57506121ec6104ad8385886126e1565b90803b156102f95761221e60009291839260405194858094819360e060020a6323b872dd0283523033600485016128f8565b03925af180156106f15761231d575b5061ffff61223f6104ad8385886126e1565b1690612249612a45565b6001605060020a039161229b601d9380855416906040519161226a8361284d565b8483526020830152600160a060020a03881660408301524216606082015282600052601460205260406000206129c8565b6122a481612b1e565b50600160a060020a03851660005260186020526122c5816040600020612bfa565b506006928354600181018091116108c957611ff4945554604051906003825260208201527fadd17b9d82cb146eaff151f4f864faa55b09599b4eff7714935025b99054fe1c6040600160a060020a03881692a3612811565b61232690612820565b8461222d565b905061ffff61233f6104ad8486896126e1565b1660005260036020526040600020541615611a6a57611ff490612811565b346102f9576020806003193601126102f95760043567ffffffffffffffff81116102f95761238f90369060040161254b565b906001926123a1600285541415612727565b600284556123c060ff6a01000000000000000000006027540416613e3f565b60005b83811061243e575050600160a060020a03600c541691823b156102f95761241e92600092836040518096819582947fc5f520960000000000000000000000000000000000000000000000000000000084523360048501612d3b565b03925af180156106f15761243157508055005b61243a90612820565b8055005b61244c6104ad8286866126e1565b9061ffff8216806000526010808552600160a060020a039061247c3383606060020a604060002054041614613e8d565b826000528552600088604082208281550155600780549060001982019182116108c9575533600052601985526124b6826040600020613cf4565b50600a5416803b156102f9576124ec60009491859260405196878094819360e060020a6323b872dd0283523330600485016128f8565b03925af19283156106f1576125379361253c575b5060405143815242858201527f01284f151397024a42410c824f8bbe00dc1e79227f1bd99799bdf4878c9385d060403392a3612811565b6123c3565b61254590612820565b87612500565b9181601f840112156102f95782359167ffffffffffffffff83116102f9576020808501948185020101116102f957565b60043590600160a060020a03821682036102f957565b60243590600160a060020a03821682036102f957565b9060406003198301126102f957600435600160a060020a03811681036102f957916024359067ffffffffffffffff82116102f9576125e79160040161254b565b9091565b6004359081151582036102f957565b6020908160408183019282815285518094520193019160005b828110612621575050505090565b835161ffff1685529381019392810192600101612613565b6004359061ffff821682036102f957565b60406003198201126102f9576004359067ffffffffffffffff82116102f9576126759160040161254b565b909160243580151581036102f95790565b600160a060020a0360005416330361269a57565b606460405160e560020a62461bcd02815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b91908110156126f1576020020190565b60e060020a634e487b7102600052603260045260246000fd5b3560ff811681036102f95790565b3561ffff811681036102f95790565b1561272e57565b606460405160e560020a62461bcd02815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b1561277c57565b606460405160e560020a62461bcd02815260206004820152600860248201527f4f6e6c7920454f410000000000000000000000000000000000000000000000006044820152fd5b156127ca57565b606460405160e560020a62461bcd02815260206004820152601860248201527f6163636f756e7420746f2073656e64206d69736d6174636800000000000000006044820152fd5b60001981146108c95760010190565b67ffffffffffffffff811161283457604052565b60e060020a634e487b7102600052604160045260246000fd5b6080810190811067ffffffffffffffff82111761283457604052565b90601f8019910116810190811067ffffffffffffffff82111761283457604052565b908160209103126102f95751600160a060020a03811681036102f95790565b156128b157565b606460405160e560020a62461bcd02815260206004820152601860248201527f596f7520646f6e2774206f776e207468697320746f6b656e00000000000000006044820152fd5b600160a060020a0391821681529116602082015261ffff909116604082015260600190565b9190808252602080920192916000805b83821061293c57505050505090565b9091929394853561ffff811680910361296257815283019483019392916001019061292d565b8280fd5b939260039261298e91600160a060020a0360409416875260606020880152606087019161291d565b930152565b906bffffffffffffffffffff0000620100006001605060020a03845493160216906bffffffffffffffffffff00001916179055565b61ffff82511661ffff19825416178155606060016001605060020a03926129f58460208701511682612993565b600160a060020a036040860151166bffffffffffffffffffffffff825491606060020a8219910216911617815501920151166001605060020a0319825416179055565b919082018092116108c957565b60ff60025416612a5157565b606460405160e560020a62461bcd02815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152fd5b6015548110156126f15760156000527f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec4750190600090565b6012548110156126f15760126000527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec34440190600090565b80548210156126f15760005260206000200190600090565b600081815260166020526040812054612ba35760155468010000000000000000811015612b8c579082612b78612b5c84600160409601601555612a98565b819391549060080260020a918260000392839102169119161790565b905560155492815260166020522055600190565b60248260e060020a634e487b710281526041600452fd5b905090565b600081815260136020526040812054612ba35760125468010000000000000000811015612b8c579082612be6612b5c84600160409601601255612acf565b905560125492815260136020522055600190565b91906001830160009082825280602052604082205415600014612c6a5784549468010000000000000000861015612c535783612c43612b5c886001604098999a01855584612b06565b9055549382526020522055600190565b60248360e060020a634e487b710281526041600452fd5b50925050565b80600019048211811515166108c9570290565b15612c8a57565b606460405160e560020a62461bcd02815260206004820152601c60248201527f496e76616c69642076616c756520666f722072616e646f6d6e657373000000006044820152fd5b67ffffffffffffffff81116128345760208091020190565b90612cf382612cd1565b612d006040519182612869565b8281528092612d11601f1991612cd1565b0190602036910137565b8051156126f15760200190565b80518210156126f1576020809202010190565b604090600160a060020a03612d5b9593168152816020820152019161291d565b90565b15612d6557565b608460405160e560020a62461bcd02815260206004820152603160248201527f4e6f7420656e6f7567682072616e646f6d206e756d626572732e20506c65617360448201527f652074727920616761696e20736f6f6e2e0000000000000000000000000000006064820152fd5b60209081818403126102f95780519067ffffffffffffffff82116102f957019180601f840112156102f9578251612e0881612cd1565b93612e166040519586612869565b818552838080870193028201019283116102f9578301905b828210612e3c575050505090565b81518152908301908301612e2e565b60209093929193600160a060020a0360408201951681520152565b90929192612e75333214612775565b60255491612e8f612e8883600095612c70565b3414612c83565b8415613a1d57612e9e82612ce9565b94600160a060020a03600c5416803b15613a19578460405180927fd8cd1ec4000000000000000000000000000000000000000000000000000000008252818381612eed8a8a3360048501612d3b565b03925af180156139b657613a06575b505b600160a060020a03600d54166040517f4ea943e7000000000000000000000000000000000000000000000000000000008152602081600481855afa9081156139fb5786939291869185916139c1575b50849291612f5c911015612d5e565b6024604051809581937f4b3c08f30000000000000000000000000000000000000000000000000000000083528960048401525af19182156139b657859261399a575b509190849396959496845b818110613114575050505050909192801561311057612fca81602654612a38565b602655600160a060020a03600b5416803b15612962578260405180927f40c10f1900000000000000000000000000000000000000000000000000000000825281838161301a883360048401612e4b565b03925af18015613105579083916130ed575b5050600160a060020a03600c541690813b156129625761307f839283926040519485809481937f1fb2e3e70000000000000000000000000000000000000000000000000000000083523360048401612e4b565b03925af180156130e2579082916130cb575b50808080600160a060020a03600e5416819034156130c1575b3491f1156130b55750565b604051903d90823e3d90fd5b6108fc91506130aa565b6130d490612820565b6130df578038613091565b80fd5b6040513d84823e3d90fd5b6130f690612820565b61310157813861302c565b5080fd5b6040513d85823e3d90fd5b5050565b61ffff6131256104ad8385886126e1565b1686526003602052604086205460ff166001036135685761314a6104ad8284876126e1565b6131548285612d28565b51879a61ffff83168952600f60205261318133600160a060020a03606060020a60408d2054041614613a85565b60275489906001605060020a03164281106134f557506131d16131c8610b806001605060020a0362010000604061320b9661ffff8b168152600f6020522054041642613b0f565b60085490613aec565b613206612710806131e460235485612c70565b04906131ef82613f22565b6131fb60225485612c70565b049261320684613edb565b613b0f565b91899c8a918a6000146134b657600a606461ffff8316061061342a575b5061ffff85168b52600f6020528a60016040822082815501556004549d8e600019810111613413578a9b9c9d9e60009b999a9b1901600455338d52601860205261327a8d604061ffff89169120613cf4565b50156133735750916133429161334e959493600160a060020a0360405191438352426020840152169033907f5a0b57045b6ea3ffa3c6399bf4f77c40c20e3f3e547914376d7adedbc2e1dc16604061ffff891692a4835b60405143815242602082015261ffff8216907f104d4b17c35fc8fefbf947699636a26c5be8e6ab92f10db54e284afc0dd2ee7860403392a35b6040518381527fea1381bbef2d85e346847379f861f1298d054ba6f36007c75a53286883c294a4602061ffff8c1515941692a3612a38565b9761335c575b50612811565b979695949793929193612fa9565b61ffff613369838d612d28565b9116905238613348565b94959650509091600160a060020a0360095416803b1561340f578a604051809260e160020a635c46a7ef0282528183816133b288333060048501613b1c565b03925af18015613404578a979695949392918c916133dd575b5050916133429161334e9594936132d1565b6133ee919293949596979850612820565b61340057908895949392918a386133cb565b8980fd5b6040513d8d823e3d90fd5b8a80fd5b60248c60e060020a634e487b710281526011600452fd5b909d506134379150614682565b600160a060020a0360095416803b1561340f578a60405180927f42842e0e0000000000000000000000000000000000000000000000000000000082528183816134858b8930600485016128f8565b03925af1801561340457908b916134a2575b505060019c38613228565b6134ab90612820565b613400578938613497565b5092905088999a9b9c50613342918461ffff61334e97969b999a9b168d52600f6020526134f08d60406001605060020a0342169120612993565b61330a565b905061ffff84168a52600f60205262010000908a816001605060020a0384604084205404161060001461355c57613545613557926001605060020a0361320b9560406131c8952054041690613ad3565b6001605060020a03601e549116612c70565b6131d1565b905061320b91506131d1565b9495969761ffff6135806104ad8885889997986126e1565b1687526003602052604087205460ff1660020361376e576135a56104ad8784886126e1565b9061ffff8216808952601192836020526135d48a600160a060020a03606060020a604033932054041614613df1565b601b5493828b528060205260406135fe8c620100006001605060020a039384922054041687613b0f565b958c891561374857905084915052806020528a600160408220828155015561362583613c47565b50338b52601860205261363b8360408d20613cf4565b5060058054600019810192908311613733575055600160a060020a036009541690813b1561340f5761368b8b92839260405194858094819360e160020a635c46a7ef028352333060048501613b1c565b03925af1801561372857908a91613710575b505091610b89918361334e946040514381524260208201527f902cce6e64dc8098d457f205480c5cc9b3b2d85b4bf7c36460154d844aab7db760403392a35b604051908382527f1e8252626aabb1c7dbde4ada8f5d81140eac89c522f5374e184e858cdf2b6058602089151593a3612a38565b61371990612820565b61372457883861369d565b8880fd5b6040513d8c823e3d90fd5b60e060020a634e487b71028d5260045260248cfd5b610b8996945090859361334e98966137699493526020521660408d20612993565b6136dc565b61ffff61377f6104ad8885896126e1565b1687526003602052600360ff6040892054161460001461396a5761ffff6137aa6104ad8885896126e1565b1690818852601491826020526137d433600160a060020a03606060020a60408d2054041614613df1565b601d5492818a528060205260406137fe8b620100006001605060020a039384922054041686613b0f565b948b88156139465790508391505260205288600160408220828155015561382481613b50565b50338952601860205261383a8160408b20613cf4565b506006805460001981019190821161392f5755600160a060020a0360095416803b156134005789809160a46040518094819360e160020a635c46a7ef028352306004840152336024840152876044840152608060648401528160848401525af1801561372857908a9161391b575b505091610b89918361334e946040514381524260208201527fdd0dd4487ac01d9f3b56787910d0c490692c9df815eaa30263fe9b41e99c990f60403392a35b604051908382527f217dd63172e0276a9a451c75b92122fbc5f58d04762a180557200d33502fa366602089151593a3612a38565b61392490612820565b6137245788386138a8565b60248b60e060020a634e487b710281526011600452fd5b9161396591610b8996948661334e999795526020521660408d20612993565b6138e7565b9461ffff61397c6104ad8385896126e1565b168752600360205260ff60408820541615611a6a5761334e90612811565b6139af9192503d8087833e6113b68183612869565b9038612f9e565b6040513d87823e3d90fd5b92945050506020813d6020116139f3575b816139df60209383612869565b810103126102f95751859290859084612f4d565b3d91506139d2565b6040513d88823e3d90fd5b613a1290949194612820565b9238612efc565b8480fd5b604051946040860186811067ffffffffffffffff821117613a6e5760405260018652602086016020368237865115613a5757849052612efe565b60248560e060020a634e487b710281526032600452fd5b60248560e060020a634e487b710281526041600452fd5b15613a8c57565b606460405160e560020a62461bcd02815260206004820152601960248201527f446f6e2774206f776e2074686520676976656e20746f6b656e000000000000006044820152fd5b6001605060020a0391821690821603919082116108c957565b8115613af6570490565b60e060020a634e487b7102600052601260045260246000fd5b919082039182116108c957565b919261ffff9160a094600160a060020a03809216855216602084015216604082015260806060820152600060808201520190565b6000818152601660205260408120549091908015613c425760001990808201818111613c2b5760155490838201918211613c1457808203613bdc575b5050506015548015613bc55701613ba281612a98565b60088254910260020a850319169055601555815260166020526040812055600190565b60248460e060020a634e487b710281526031600452fd5b613bfe6008613bed612b5c94612a98565b9054910260020a9004928392612a98565b9055845260166020526040842055388080613b8c565b60248660e060020a634e487b710281526011600452fd5b60248560e060020a634e487b710281526011600452fd5b505090565b6000818152601360205260408120549091908015613c425760001990808201818111613c2b5760125490838201918211613c1457808203613cbc575b5050506012548015613bc55701613c9981612acf565b60088254910260020a850319169055601255815260136020526040812055600190565b613cde6008613ccd612b5c94612acf565b9054910260020a9004928392612acf565b9055845260136020526040842055388080613c83565b906001820190600092818452826020526040842054801515600014613dea5760001990808201818111613dd357835490838201918211613dbc57808203613d83575b50505081548015613d6c570190613d4d8282612b06565b60088254910260020a8703191690555582526020526040812055600190565b60248660e060020a634e487b710281526031600452fd5b613da76008613d95612b5c9488612b06565b9054910260020a900492839287612b06565b90558652846020526040862055388080613d36565b60248860e060020a634e487b710281526011600452fd5b60248760e060020a634e487b710281526011600452fd5b5050505090565b15613df857565b606460405160e560020a62461bcd02815260206004820152601760248201527f446f65736e2774206f776e20676976656e20746f6b656e0000000000000000006044820152fd5b15613e4657565b606460405160e560020a62461bcd02815260206004820152600f60248201527f5245534355452044495341424c454400000000000000000000000000000000006044820152fd5b15613e9457565b606460405160e560020a62461bcd02815260206004820152601260248201527f5357495045522c204e4f2053574950494e4700000000000000000000000000006044820152fd5b600554908115613f1057613f0691613ef9613efe92601a5490612a38565b613aec565b601b54612a38565b601b556000601a55565b613f1d9150601a54612a38565b601a55565b600654908115613f5257613f4891613ef9613f4092601c5490612a38565b601d54612a38565b601d556000601c55565b613f5f9150601c54612a38565b601c55565b613f6f333214612775565b600092835b8381106140eb575083156140e55761406f575b5050600160a060020a0380600c5416803b156102f957600060405180927f1fb2e3e7000000000000000000000000000000000000000000000000000000008252818381613fd8893360048401612e4b565b03925af180156106f157614060575b50600b541690813b156102f957600060405180937f40c10f1900000000000000000000000000000000000000000000000000000000825281838161402f873360048401612e4b565b03925af19182156106f15761404c92614051575b50602654612a38565b602655565b61405a90612820565b38614043565b61406990612820565b38613fe7565b600160a060020a03600c541691823b156102f9576140c192600092836040518096819582947fc5f520960000000000000000000000000000000000000000000000000000000084523360048501612d3b565b03925af180156106f1576140d6575b80613f87565b6140df90612820565b386140d0565b50505050565b61ffff806140fd6104ad8488886126e1565b166000526010602091818352600160a060020a0360409261412b3383606060020a8760002054041614613a85565b876001605060020a039a8b85898d83602754168a888d8342111560001461433a5750505050926131c89261416c6104ad610a6f94610a80976141849a6126e1565b16600052868b52620100008a60002054041642613b0f565b995b898989156142e6578592508861419f926104ad926126e1565b166000528452600060018482208281550155600780549060001982019182116108c9575533600052601984526141e883600020836141e16104ad898d8d6126e1565b1690613cf4565b50600a54166141fb6104ad868a8a6126e1565b90803b156102f95761422c600092918392865194858094819360e060020a6323b872dd0283523330600485016128f8565b03925af180156142db57917fe9083238ed5c128b67831b957929cef6c82beb49da6f7f4d156f6391a5a65131916142c7969594936142cc575b506142746104ad868b8b6126e1565b81845191438352428784015216907f01284f151397024a42410c824f8bbe00dc1e79227f1bd99799bdf4878c9385d0853392a35b6142b66104ad868b8b6126e1565b1691519289845286151593a3612811565b613f74565b6142d590612820565b38614265565b83513d6000823e3d90fd5b7fe9083238ed5c128b67831b957929cef6c82beb49da6f7f4d156f6391a5a65131945092856143246104ad8b61433596956142c79d9c9b9a986126e1565b166000528652421684600020612993565b6142a8565b939094919592969798836143526104ad8585856126e1565b166000528585528789620100008099600020540416106000146143b457946143a494610a8098946143926104ad8c99966131c89b966143ae9f9e986126e1565b16600052528c60002054041690613ad3565b601f549116612c70565b99614186565b50505050505050505099614186565b60009061ffff600091168082526003602052604092600160ff85852054161460001461440b57508152600f602052606060020a600160a060020a039283922054041691161490565b8383205460ff1660020361443b575081526011602052606060020a600160a060020a039283922054041691161490565b949392919050600360ff83832054161461445457505050565b60146020522054606060020a9004600160a060020a039081169116149150565b61ffff1660009080825260106020526001605060020a0390620100009082826040862054041615156000146144ff5760275483164281106144d0575091610a6f916040856131c895612d5b975260106020522054041642613b0f565b82915083819360408720540416106000146144ff5782916131c8936143a4926040612d5b972054041690613ad3565b50505090565b600061ffff6000921690818352602060038152604091600160ff84872054161480614664575b156145a057506027546001605060020a03939084164281106145695750610b809285600f6131c896946201000094612d5b9952522054041642613b0f565b9291600f91865252620100009082848383882054041610600014613dea579183610bdc926131c89594612d5b972054041690613ad3565b600382959252600260ff84842054161480614645575b156145e157506001605060020a039162010000916011612d5b96601b54968352522054041690613b0f565b93925060038352600360ff83832054161480614626575b6146025750505090565b612d5b93506001605060020a039162010000916014601d5495522054041690613b0f565b5060148352600160a060020a03606060020a83832054041615156145f8565b5060118552600160a060020a03606060020a84842054041615156145b6565b50600f82526001605060020a0362010000848720540416151561452b565b6012549081156146e05763ffffffff82911606908110156126f1577fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec344401546000526011602052600160a060020a03606060020a604060002054041690565b505060009056fea264697066735822122021f0627286d8b1e760d275d2b43132ee9948bfa7a0fdc73fbbf7b018bbec0d3a64736f6c63430008100033
Deployed Bytecode
0x6080604052600436101561001257600080fd5b7c01000000000000000000000000000000000000000000000000000000006000350480630a6b6f1c1461235d57806313667ed814611d78578063140233cf14611d5a578063150b7a0214611cd857806316c38b3c14611b5257806318f5c77114611ad95780631b218df514611ab257806321c8da9a1461163b5780632813fdc51461161a5780632b6c88bf146115dc5780632da43dc5146115be57806338f7ba781461152a57806339db714f146114fa5780633e18842d146114dc57806340d1d255146114b55780634f047196146114705780635c975abb1461144d5780635fd191261461105157806367efe7491461102a5780636f7c0d4614610fe9578063715018a614610f8b57806372bbccf314610f6d5780637653100814610f155780637bc09e3e14610ef45780637d5f954714610ed6578063887dd1db14610e3f5780638a73092b14610e215780638aca0cad14610e005780638da5cb5b14610dd95780639073c1b314610db65780639c484b5c14610d995780639e3bcb8d14610d7d578063a2bddd1714610d56578063a4c52b8614610d2f578063a6d2de9814610d04578063b4d1d79514610ce6578063bd48652e14610cc8578063be07528b14610c92578063c2286ab514610995578063dbce286414610962578063dfd1f6f714610941578063e270d1df14610920578063e4e85a9e1461062d578063e5d7c2bc146105f5578063e835bae3146105d4578063efa09d6814610405578063f10fb584146103de578063f2fde38b146102fe5763f63bf8bd1461025357600080fd5b346102f95760a03660031901126102f95761026c61257b565b610274612591565b90604435600160a060020a03908181168091036102f957606435918083168093036102f957608435948186168096036102f9576102af612686565b81600160a060020a031995168560095416176009551683600a541617600a5582600b541617600b558282600d541617600d5581600c541617600c55600e541617600e556000604051f35b600080fd5b346102f95760203660031901126102f95761031761257b565b61031f612686565b600160a060020a038091169081156103715760009182549181600160a060020a0319841617845560405192167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08484a3f35b608460405160e560020a62461bcd02815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152fd5b346102f95760003660031901126102f9576020600160a060020a03600d5416604051908152f35b346102f95760403660031901126102f95767ffffffffffffffff6004358181116102f95761043790369060040161254b565b9060249283359081116102f95761045290369060040161254b565b9261045b612686565b8381036105415760005b61ffff808216908382101561053f5760ff908161048b610486858b8a6126e1565b61270a565b16156104f8576104b26104ad6104a5610486868c8b6126e1565b94878a6126e1565b612718565b1660005260036020526040600020911660ff1982541617905561ffff8091169081146104e057600101610465565b8560e060020a634e487b710260005260116004526000fd5b606489601e6040519160e560020a62461bcd028352602060048401528201527f496e76616c6964206e66742074797065202d2063616e6e6f74206265203000006044820152fd5b005b60a485605a6040519160e560020a62461bcd028352602060048401528201527f205f69644e756d626572732e6c656e67746820213d205f74797065732e6c656e60448201527f6774683a204561636820746f6b656e204944206d75737420686176652065786160648201527f63746c79203120636f72726573706f6e64696e672074797065210000000000006084820152fd5b346102f95760203660031901126102f9576105ed612686565b600435602055005b346102f95760203660031901126102f95761ffff610611612639565b166000526003602052602060ff60406000205416604051908152f35b346102f95761063b366125a7565b61064d60026001949394541415612727565b600260015561065d333214612775565b61067132600160a060020a038416146127c3565b60005b8181106106fd5750600160a060020a03600c5416803b156102f9576106cd9360008094604051968795869485937fdca3b79e00000000000000000000000000000000000000000000000000000000855260048501612966565b03925af180156106f1576106e2575b60018055005b6106eb90612820565b806106dc565b6040513d6000823e3d90fd5b600160a060020a03600a54166107176104ad8385886126e1565b61ffff604051917f6352211e000000000000000000000000000000000000000000000000000000008352166004820152602081602481855afa80156106f157610773916000916108f1575b50600160a060020a031633146128aa565b6107816104ad8385886126e1565b90803b156102f9576107b360009291839260405194858094819360e060020a6323b872dd0283523033600485016128f8565b03925af180156106f1576108e2575b506108306107d46104ad8385886126e1565b61ffff604051916107e48361284d565b168152426001605060020a031660208201819052600160a060020a0386166040830152606082015261ffff61081d6104ad85878a6126e1565b16600052601060205260406000206129c8565b600160a060020a0383166000526019602052610862604060002061ffff61085b6104ad85878a6126e1565b1690612bfa565b506007908154600181018091116108c9576108c4925561ffff6108896104ad8386896126e1565b166040514281527f9a3548e7da710b05c129b310e734c5830e4c53cc9255c7d47219adf7f1098ea16020600160a060020a03881692a3612811565b610674565b60e060020a634e487b7102600052601160045260246000fd5b6108eb90612820565b846107c2565b610913915060203d602011610919575b61090b8183612869565b81019061288b565b87610762565b503d610901565b346102f95760203660031901126102f957610939612686565b600435600855005b346102f95760203660031901126102f95761095a612686565b600435602155005b346102f9576106dc6109733661264a565b9161097c612a45565b61098b60026001541415612727565b6002600155613f64565b346102f9576020806003193601126102f9576109af61257b565b600160a060020a0360009116806000526018808452604060002054601991828652604060002054916000915b818310610aeb575050506000916001605060020a039081602754169081421115955b848610610a0e578888604051908152f35b9091929394959796610a8c908260005283895261ffff610a32896040600020612b06565b905460089291830260020a9004168b15610a9a57610a869291610a809160005260108c52610a78610a6f8a62010000604060002054041642613b0f565b601f5490612c70565b905490613aec565b90612a38565b96612811565b9493929190979596976109fd565b60005260108a528662010000878282604060002054041610600014610ae25791610a78610ad7610a8093610a86969560406000205404168a613ad3565b8a601f549116612c70565b50505096612811565b9091949392969584600052818752610b07866040600020612b06565b91905461ffff6008918260029502850a900416806000526003808b5260ff946001866040600020541614600014610bf0575050602754610b8f94506001605060020a03918b918316428110610b9c5750610b80610a8093600f610b89979694610a78946000525262010000604060002054041642613b0f565b601e5490612c70565b95612811565b91909692939495966109db565b9150600052600f8b5262010000818382604060002054041610600014610be65782610bdc610b89969593610a8095610a7894604060002054041690613ad3565b601e549116612c70565b5050505095612811565b909193948093506040600020541614600014610c3d575050610b8f91610a80610b8992601b549060005260118b526001605060020a0362010000604060002054041690613b0f565b612811565b908092506040600020541614600014610c7c5750610b89610b8f91610a80601d5460148b526001605060020a0362010000604060002054041690613b0f565b95610b8f919660406000205416610c3857612811565b346102f95760403660031901126102f9576020610cbe610cb0612639565b610cb8612591565b906143c3565b6040519015158152f35b346102f95760003660031901126102f9576020602654604051908152f35b346102f95760003660031901126102f9576020600854604051908152f35b346102f95760203660031901126102f9576020610d27610d22612639565b614505565b604051908152f35b346102f95760003660031901126102f9576020600160a060020a03600c5416604051908152f35b346102f95760003660031901126102f9576020600160a060020a03600a5416604051908152f35b346102f95760003660031901126102f957602060405160088152f35b346102f95760003660031901126102f95760208054604051908152f35b346102f95760203660031901126102f9576020610d27610dd4612639565b614474565b346102f95760003660031901126102f9576020600160a060020a0360005416604051908152f35b346102f95760203660031901126102f957610e19612686565b600435602555005b346102f95760003660031901126102f9576020602254604051908152f35b346102f9576020806003193601126102f957600160a060020a03610e6161257b565b169081600052601880825260406000205491610e7c83612ce9565b9360005b848110610e995760405180610e9588826125fa565b0390f35b610ed1908260005284845261ffff6008610eb7836040600020612b06565b9054910260020a900416610ecb8289612d28565b52612811565b610e80565b346102f95760003660031901126102f9576020602554604051908152f35b346102f95760203660031901126102f957610f0d612686565b600435601f55005b346102f95760203660031901126102f957610f2e6125eb565b610f36612686565b602780546aff0000000000000000000019169115156a0100000000000000000000026aff0000000000000000000016919091179055005b346102f95760003660031901126102f9576020602154604051908152f35b346102f95760003660031901126102f957610fa4612686565b60008054600160a060020a03198116825581600160a060020a0360405192167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08284a3f35b610e9561101a610ff83661264a565b91611001612a45565b61101060026001541415612727565b6002600155612e66565b60018055604051918291826125fa565b346102f95760003660031901126102f9576020600160a060020a0360095416604051908152f35b6020806003193601126102f957611066612639565b61106e612a45565b600161107e600282541415612727565b6002815561108d333214612775565b61ffff8092168060005260118452600160a060020a03926110bc3385606060020a604060002054041614613a85565b8160005260038552600260ff6040600020541603611406576110e16025543414612c83565b83600b541660215490803b156102f9576111306000929183926040519485809481937f79cc67900000000000000000000000000000000000000000000000000000000083523360048401612e4b565b03925af180156106f1576113f7575b5083600d54166040517f4ea943e70000000000000000000000000000000000000000000000000000000081528681600481855afa80156106f15785916000916113c4575b50916111956000939284931015612d5e565b6024604051809481937f4b3c08f30000000000000000000000000000000000000000000000000000000083528960048401525af19081156106f1576000916113a1575b5060056064836111e784612d1b565b511606101561137957505060ff60035b1692836000526024855260406000205461127a575b600080808093600e541681903415611270575b3491f1156106f157826000526024845260406000205460405190848252858201527fcc4bf3c87e65beb79510f170f073a60e195b51f699e8ad36a6c7fb464a2c59b160403392a38055604051908152f35b6108fc915061121f565b80600b541660406000205490803b156102f9576112cc6000929183926040519485809481937f40c10f190000000000000000000000000000000000000000000000000000000083523360048401612e4b565b03925af180156106f15761136a575b5080600c541690846000526024865260406000205491803b156102f9576113376000939184926040519586809481937f1fb2e3e70000000000000000000000000000000000000000000000000000000083523360048401612e4b565b03925af19182156106f15760009283928392839261135b575b50935050505061120c565b61136490612820565b89611350565b61137390612820565b856112db565b601e91611387606492612d1b565b51160610156113995760ff60026111f7565b60ff826111f7565b6113be91503d806000833e6113b68183612869565b810190612dd2565b866111d8565b809250888092503d83116113f0575b6113dd8183612869565b810103126102f957518490611195611183565b503d6113d3565b61140090612820565b8561113f565b6064856040519060e560020a62461bcd0282526004820152601d60248201527f6166666563746564206f6e6c7920666f7220466f6f646965204e4654730000006044820152fd5b346102f95760003660031901126102f957602060ff600254166040519015158152f35b346102f95760203660031901126102f9576004356001605060020a0381168091036102f95761149d612686565b6001605060020a031960275416176027556000604051f35b346102f95760003660031901126102f95760206001605060020a0360275416604051908152f35b346102f95760003660031901126102f9576020601e54604051908152f35b346102f95760003660031901126102f957602060ff6a010000000000000000000060275404166040519015158152f35b346102f95760603660031901126102f957611543612686565b602460208190526004357fbbbb3b1da0cb0951f34c5e9db4606f934b7367b5284f29163e9e6fe67e1e97d655357f47bb5529a97e2b401b32950f6360fbc9e3f4e70b887dc0f9b9ad1f7402ca11da5560036000526044357f8a6809e43cef135a96df89aa3c0800baae7c497913adf6156625c15a6f57cdf055005b346102f95760003660031901126102f9576020602354604051908152f35b346102f95760403660031901126102f95760043560ff81168091036102f9576024359060ff82168092036102f957611612612686565b602255602355005b346102f95760203660031901126102f957611633612686565b600435601e55005b346102f95760203660031901126102f95760043567ffffffffffffffff81116102f95761166c90369060040161254b565b9061167c60026001541415612727565b600260015561169c60ff6a01000000000000000000006027540416613e3f565b60005b8281106116f95750600160a060020a03600c541691823b156102f9576106cd92600092836040518096819582947fd8cd1ec40000000000000000000000000000000000000000000000000000000084523360048501612d3b565b6117076104ad8285856126e1565b9061ffff808316600052600380602052600160ff604060002054161460001461182c5750808316600052600f80602052600160a060020a039061175882606060020a60406000205404163314613e8d565b828516600052602052600060016040822082815501553360005260186020526117878285166040600020613cf4565b5060045460001981019081116108c9576004556009541692833b156102f9576000604051809560e160020a635c46a7ef0282528183816117cc87333060048501613b1c565b03925af19384156106f15760206001937fea1381bbef2d85e346847379f861f1298d054ba6f36007c75a53286883c294a4926118189761181d575b5060405193600085521692a3612811565b61169f565b61182690612820565b89611807565b60406000205460ff1660020361193357508083166000526011602052600160a060020a0361186881606060020a60406000205404163314613e8d565b83821660008181526011602052604081208181556001015561188990613c47565b503360005260186020526118a38285166040600020613cf4565b50600580546000198101919082116108c957556009541692833b156102f9576000604051809560e160020a635c46a7ef0282528183816118e887333060048501613b1c565b03925af19384156106f15760206001937f1e8252626aabb1c7dbde4ada8f5d81140eac89c522f5374e184e858cdf2b6058926118189761181d575060405193600085521692a3612811565b60406000205460ff168103611a3b5750808316600052601480602052600160a060020a039061197082606060020a60406000205404163314613e8d565b82851660005260205260006001604082208281550155611991828516613b50565b503360005260186020526119ab8285166040600020613cf4565b50600680546000198101919082116108c957556009541692833b156102f9576000604051809560e160020a635c46a7ef0282528183816119f087333060048501613b1c565b03925af19384156106f15760206001937f217dd63172e0276a9a451c75b92122fbc5f58d04762a180557200d33502fa366926118189761181d575060405193600085521692a3612811565b919250611a4c6104ad8487876126e1565b1660005260205260ff6040600020541615611a6a5761181890612811565b60405160e560020a62461bcd02815260206004820152601060248201527f696e76616c696420746f6b656e206964000000000000000000000000000000006044820152606490fd5b346102f95760003660031901126102f9576020600160a060020a03600b5416604051908152f35b346102f9576020806003193601126102f957600160a060020a03611afb61257b565b169081600052601980825260406000205491611b1683612ce9565b9360005b848110611b2f5760405180610e9588826125fa565b611b4d908260005284845261ffff6008610eb7836040600020612b06565b611b1a565b346102f95760203660031901126102f957611b6b6125eb565b600160a060020a03806009541615159081611cca575b81611cbc575b81611cae575b5015611c6757611b9b612686565b15611be157611ba8612a45565b600160ff1960025416176002557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586020604051338152a1005b60025460ff811615611c205760ff19166002557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6020604051338152a1005b606460405160e560020a62461bcd02815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152fd5b606460405160e560020a62461bcd02815260206004820152601160248201527f436f6e747261637473206e6f74207365740000000000000000000000000000006044820152fd5b9050600c5416151582611b8d565b600d54811615159150611b87565b600b54811615159150611b81565b346102f95760803660031901126102f957611cf161257b565b50611cfa612591565b5060643567ffffffffffffffff8082116102f957366023830112156102f95781600401359081116102f957369101602401116102f95760206040517f150b7a02000000000000000000000000000000000000000000000000000000008152f35b346102f95760003660031901126102f9576020601f54604051908152f35b346102f957611d86366125a7565b611d9860026001949394541415612727565b6002600155611da8333214612775565b611dbc32600160a060020a038416146127c3565b60005b818110611e185750600160a060020a03600c5416803b156102f9576106cd9360008094604051968795869485937fb25ada4a00000000000000000000000000000000000000000000000000000000855260048501612966565b929190600160a060020a0360095416611e356104ad8684876126e1565b61ffff604051917f6352211e000000000000000000000000000000000000000000000000000000008352166004820152602081602481855afa80156106f157611e90916000916108f15750600160a060020a031633146128aa565b61ffff611ea16104ad8785886126e1565b16600052600360205260ff6001816040600020541614600014612008575050909192600160a060020a0360095416611edd6104ad8385886126e1565b90803b156102f957611f0f60009291839260405194858094819360e060020a6323b872dd0283523033600485016128f8565b03925af180156106f157611ff9575b5061ffff611f306104ad8385886126e1565b1690611f7c6001605060020a03421660405190611f4c8261284d565b848252806020830152600160a060020a0387166040830152606082015283600052600f60205260406000206129c8565b600160a060020a0384166000526018602052611f9c826040600020612bfa565b5060045491600183018093116108c957611ff492600455604051600181524260208201527fadd17b9d82cb146eaff151f4f864faa55b09599b4eff7714935025b99054fe1c6040600160a060020a03881692a3612811565b611dbf565b61200290612820565b84611f1e565b61ffff6120196104ad8886896126e1565b16600052600360205260028160406000205416146000146121ad575050600160a060020a03600954166120506104ad8684876126e1565b90803b156102f95761208260009291839260405194858094819360e060020a6323b872dd0283523033600485016128f8565b03925af180156106f15761219e575b5061ffff6120a36104ad8684876126e1565b16936120ad612a45565b6001605060020a0394601b8681541696604051976120ca8961284d565b8389526020890152600160a060020a038616604089015242166060880152816000526121006011978860205260406000206129c8565b61210982612ba8565b50600160a060020a038516600052601860205261212a826040600020612bfa565b5060058054906001820180921161218657611ff495969798505554604051906002825260208201527fadd17b9d82cb146eaff151f4f864faa55b09599b4eff7714935025b99054fe1c6040600160a060020a03881692a3612811565b8860e060020a634e487b710260005260045260246000fd5b6121a790612820565b84612091565b61ffff6121c26104ad8886899a9798996126e1565b166000526003602052600381604060002054161460001461232c57506121ec6104ad8385886126e1565b90803b156102f95761221e60009291839260405194858094819360e060020a6323b872dd0283523033600485016128f8565b03925af180156106f15761231d575b5061ffff61223f6104ad8385886126e1565b1690612249612a45565b6001605060020a039161229b601d9380855416906040519161226a8361284d565b8483526020830152600160a060020a03881660408301524216606082015282600052601460205260406000206129c8565b6122a481612b1e565b50600160a060020a03851660005260186020526122c5816040600020612bfa565b506006928354600181018091116108c957611ff4945554604051906003825260208201527fadd17b9d82cb146eaff151f4f864faa55b09599b4eff7714935025b99054fe1c6040600160a060020a03881692a3612811565b61232690612820565b8461222d565b905061ffff61233f6104ad8486896126e1565b1660005260036020526040600020541615611a6a57611ff490612811565b346102f9576020806003193601126102f95760043567ffffffffffffffff81116102f95761238f90369060040161254b565b906001926123a1600285541415612727565b600284556123c060ff6a01000000000000000000006027540416613e3f565b60005b83811061243e575050600160a060020a03600c541691823b156102f95761241e92600092836040518096819582947fc5f520960000000000000000000000000000000000000000000000000000000084523360048501612d3b565b03925af180156106f15761243157508055005b61243a90612820565b8055005b61244c6104ad8286866126e1565b9061ffff8216806000526010808552600160a060020a039061247c3383606060020a604060002054041614613e8d565b826000528552600088604082208281550155600780549060001982019182116108c9575533600052601985526124b6826040600020613cf4565b50600a5416803b156102f9576124ec60009491859260405196878094819360e060020a6323b872dd0283523330600485016128f8565b03925af19283156106f1576125379361253c575b5060405143815242858201527f01284f151397024a42410c824f8bbe00dc1e79227f1bd99799bdf4878c9385d060403392a3612811565b6123c3565b61254590612820565b87612500565b9181601f840112156102f95782359167ffffffffffffffff83116102f9576020808501948185020101116102f957565b60043590600160a060020a03821682036102f957565b60243590600160a060020a03821682036102f957565b9060406003198301126102f957600435600160a060020a03811681036102f957916024359067ffffffffffffffff82116102f9576125e79160040161254b565b9091565b6004359081151582036102f957565b6020908160408183019282815285518094520193019160005b828110612621575050505090565b835161ffff1685529381019392810192600101612613565b6004359061ffff821682036102f957565b60406003198201126102f9576004359067ffffffffffffffff82116102f9576126759160040161254b565b909160243580151581036102f95790565b600160a060020a0360005416330361269a57565b606460405160e560020a62461bcd02815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b91908110156126f1576020020190565b60e060020a634e487b7102600052603260045260246000fd5b3560ff811681036102f95790565b3561ffff811681036102f95790565b1561272e57565b606460405160e560020a62461bcd02815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b1561277c57565b606460405160e560020a62461bcd02815260206004820152600860248201527f4f6e6c7920454f410000000000000000000000000000000000000000000000006044820152fd5b156127ca57565b606460405160e560020a62461bcd02815260206004820152601860248201527f6163636f756e7420746f2073656e64206d69736d6174636800000000000000006044820152fd5b60001981146108c95760010190565b67ffffffffffffffff811161283457604052565b60e060020a634e487b7102600052604160045260246000fd5b6080810190811067ffffffffffffffff82111761283457604052565b90601f8019910116810190811067ffffffffffffffff82111761283457604052565b908160209103126102f95751600160a060020a03811681036102f95790565b156128b157565b606460405160e560020a62461bcd02815260206004820152601860248201527f596f7520646f6e2774206f776e207468697320746f6b656e00000000000000006044820152fd5b600160a060020a0391821681529116602082015261ffff909116604082015260600190565b9190808252602080920192916000805b83821061293c57505050505090565b9091929394853561ffff811680910361296257815283019483019392916001019061292d565b8280fd5b939260039261298e91600160a060020a0360409416875260606020880152606087019161291d565b930152565b906bffffffffffffffffffff0000620100006001605060020a03845493160216906bffffffffffffffffffff00001916179055565b61ffff82511661ffff19825416178155606060016001605060020a03926129f58460208701511682612993565b600160a060020a036040860151166bffffffffffffffffffffffff825491606060020a8219910216911617815501920151166001605060020a0319825416179055565b919082018092116108c957565b60ff60025416612a5157565b606460405160e560020a62461bcd02815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152fd5b6015548110156126f15760156000527f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec4750190600090565b6012548110156126f15760126000527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec34440190600090565b80548210156126f15760005260206000200190600090565b600081815260166020526040812054612ba35760155468010000000000000000811015612b8c579082612b78612b5c84600160409601601555612a98565b819391549060080260020a918260000392839102169119161790565b905560155492815260166020522055600190565b60248260e060020a634e487b710281526041600452fd5b905090565b600081815260136020526040812054612ba35760125468010000000000000000811015612b8c579082612be6612b5c84600160409601601255612acf565b905560125492815260136020522055600190565b91906001830160009082825280602052604082205415600014612c6a5784549468010000000000000000861015612c535783612c43612b5c886001604098999a01855584612b06565b9055549382526020522055600190565b60248360e060020a634e487b710281526041600452fd5b50925050565b80600019048211811515166108c9570290565b15612c8a57565b606460405160e560020a62461bcd02815260206004820152601c60248201527f496e76616c69642076616c756520666f722072616e646f6d6e657373000000006044820152fd5b67ffffffffffffffff81116128345760208091020190565b90612cf382612cd1565b612d006040519182612869565b8281528092612d11601f1991612cd1565b0190602036910137565b8051156126f15760200190565b80518210156126f1576020809202010190565b604090600160a060020a03612d5b9593168152816020820152019161291d565b90565b15612d6557565b608460405160e560020a62461bcd02815260206004820152603160248201527f4e6f7420656e6f7567682072616e646f6d206e756d626572732e20506c65617360448201527f652074727920616761696e20736f6f6e2e0000000000000000000000000000006064820152fd5b60209081818403126102f95780519067ffffffffffffffff82116102f957019180601f840112156102f9578251612e0881612cd1565b93612e166040519586612869565b818552838080870193028201019283116102f9578301905b828210612e3c575050505090565b81518152908301908301612e2e565b60209093929193600160a060020a0360408201951681520152565b90929192612e75333214612775565b60255491612e8f612e8883600095612c70565b3414612c83565b8415613a1d57612e9e82612ce9565b94600160a060020a03600c5416803b15613a19578460405180927fd8cd1ec4000000000000000000000000000000000000000000000000000000008252818381612eed8a8a3360048501612d3b565b03925af180156139b657613a06575b505b600160a060020a03600d54166040517f4ea943e7000000000000000000000000000000000000000000000000000000008152602081600481855afa9081156139fb5786939291869185916139c1575b50849291612f5c911015612d5e565b6024604051809581937f4b3c08f30000000000000000000000000000000000000000000000000000000083528960048401525af19182156139b657859261399a575b509190849396959496845b818110613114575050505050909192801561311057612fca81602654612a38565b602655600160a060020a03600b5416803b15612962578260405180927f40c10f1900000000000000000000000000000000000000000000000000000000825281838161301a883360048401612e4b565b03925af18015613105579083916130ed575b5050600160a060020a03600c541690813b156129625761307f839283926040519485809481937f1fb2e3e70000000000000000000000000000000000000000000000000000000083523360048401612e4b565b03925af180156130e2579082916130cb575b50808080600160a060020a03600e5416819034156130c1575b3491f1156130b55750565b604051903d90823e3d90fd5b6108fc91506130aa565b6130d490612820565b6130df578038613091565b80fd5b6040513d84823e3d90fd5b6130f690612820565b61310157813861302c565b5080fd5b6040513d85823e3d90fd5b5050565b61ffff6131256104ad8385886126e1565b1686526003602052604086205460ff166001036135685761314a6104ad8284876126e1565b6131548285612d28565b51879a61ffff83168952600f60205261318133600160a060020a03606060020a60408d2054041614613a85565b60275489906001605060020a03164281106134f557506131d16131c8610b806001605060020a0362010000604061320b9661ffff8b168152600f6020522054041642613b0f565b60085490613aec565b613206612710806131e460235485612c70565b04906131ef82613f22565b6131fb60225485612c70565b049261320684613edb565b613b0f565b91899c8a918a6000146134b657600a606461ffff8316061061342a575b5061ffff85168b52600f6020528a60016040822082815501556004549d8e600019810111613413578a9b9c9d9e60009b999a9b1901600455338d52601860205261327a8d604061ffff89169120613cf4565b50156133735750916133429161334e959493600160a060020a0360405191438352426020840152169033907f5a0b57045b6ea3ffa3c6399bf4f77c40c20e3f3e547914376d7adedbc2e1dc16604061ffff891692a4835b60405143815242602082015261ffff8216907f104d4b17c35fc8fefbf947699636a26c5be8e6ab92f10db54e284afc0dd2ee7860403392a35b6040518381527fea1381bbef2d85e346847379f861f1298d054ba6f36007c75a53286883c294a4602061ffff8c1515941692a3612a38565b9761335c575b50612811565b979695949793929193612fa9565b61ffff613369838d612d28565b9116905238613348565b94959650509091600160a060020a0360095416803b1561340f578a604051809260e160020a635c46a7ef0282528183816133b288333060048501613b1c565b03925af18015613404578a979695949392918c916133dd575b5050916133429161334e9594936132d1565b6133ee919293949596979850612820565b61340057908895949392918a386133cb565b8980fd5b6040513d8d823e3d90fd5b8a80fd5b60248c60e060020a634e487b710281526011600452fd5b909d506134379150614682565b600160a060020a0360095416803b1561340f578a60405180927f42842e0e0000000000000000000000000000000000000000000000000000000082528183816134858b8930600485016128f8565b03925af1801561340457908b916134a2575b505060019c38613228565b6134ab90612820565b613400578938613497565b5092905088999a9b9c50613342918461ffff61334e97969b999a9b168d52600f6020526134f08d60406001605060020a0342169120612993565b61330a565b905061ffff84168a52600f60205262010000908a816001605060020a0384604084205404161060001461355c57613545613557926001605060020a0361320b9560406131c8952054041690613ad3565b6001605060020a03601e549116612c70565b6131d1565b905061320b91506131d1565b9495969761ffff6135806104ad8885889997986126e1565b1687526003602052604087205460ff1660020361376e576135a56104ad8784886126e1565b9061ffff8216808952601192836020526135d48a600160a060020a03606060020a604033932054041614613df1565b601b5493828b528060205260406135fe8c620100006001605060020a039384922054041687613b0f565b958c891561374857905084915052806020528a600160408220828155015561362583613c47565b50338b52601860205261363b8360408d20613cf4565b5060058054600019810192908311613733575055600160a060020a036009541690813b1561340f5761368b8b92839260405194858094819360e160020a635c46a7ef028352333060048501613b1c565b03925af1801561372857908a91613710575b505091610b89918361334e946040514381524260208201527f902cce6e64dc8098d457f205480c5cc9b3b2d85b4bf7c36460154d844aab7db760403392a35b604051908382527f1e8252626aabb1c7dbde4ada8f5d81140eac89c522f5374e184e858cdf2b6058602089151593a3612a38565b61371990612820565b61372457883861369d565b8880fd5b6040513d8c823e3d90fd5b60e060020a634e487b71028d5260045260248cfd5b610b8996945090859361334e98966137699493526020521660408d20612993565b6136dc565b61ffff61377f6104ad8885896126e1565b1687526003602052600360ff6040892054161460001461396a5761ffff6137aa6104ad8885896126e1565b1690818852601491826020526137d433600160a060020a03606060020a60408d2054041614613df1565b601d5492818a528060205260406137fe8b620100006001605060020a039384922054041686613b0f565b948b88156139465790508391505260205288600160408220828155015561382481613b50565b50338952601860205261383a8160408b20613cf4565b506006805460001981019190821161392f5755600160a060020a0360095416803b156134005789809160a46040518094819360e160020a635c46a7ef028352306004840152336024840152876044840152608060648401528160848401525af1801561372857908a9161391b575b505091610b89918361334e946040514381524260208201527fdd0dd4487ac01d9f3b56787910d0c490692c9df815eaa30263fe9b41e99c990f60403392a35b604051908382527f217dd63172e0276a9a451c75b92122fbc5f58d04762a180557200d33502fa366602089151593a3612a38565b61392490612820565b6137245788386138a8565b60248b60e060020a634e487b710281526011600452fd5b9161396591610b8996948661334e999795526020521660408d20612993565b6138e7565b9461ffff61397c6104ad8385896126e1565b168752600360205260ff60408820541615611a6a5761334e90612811565b6139af9192503d8087833e6113b68183612869565b9038612f9e565b6040513d87823e3d90fd5b92945050506020813d6020116139f3575b816139df60209383612869565b810103126102f95751859290859084612f4d565b3d91506139d2565b6040513d88823e3d90fd5b613a1290949194612820565b9238612efc565b8480fd5b604051946040860186811067ffffffffffffffff821117613a6e5760405260018652602086016020368237865115613a5757849052612efe565b60248560e060020a634e487b710281526032600452fd5b60248560e060020a634e487b710281526041600452fd5b15613a8c57565b606460405160e560020a62461bcd02815260206004820152601960248201527f446f6e2774206f776e2074686520676976656e20746f6b656e000000000000006044820152fd5b6001605060020a0391821690821603919082116108c957565b8115613af6570490565b60e060020a634e487b7102600052601260045260246000fd5b919082039182116108c957565b919261ffff9160a094600160a060020a03809216855216602084015216604082015260806060820152600060808201520190565b6000818152601660205260408120549091908015613c425760001990808201818111613c2b5760155490838201918211613c1457808203613bdc575b5050506015548015613bc55701613ba281612a98565b60088254910260020a850319169055601555815260166020526040812055600190565b60248460e060020a634e487b710281526031600452fd5b613bfe6008613bed612b5c94612a98565b9054910260020a9004928392612a98565b9055845260166020526040842055388080613b8c565b60248660e060020a634e487b710281526011600452fd5b60248560e060020a634e487b710281526011600452fd5b505090565b6000818152601360205260408120549091908015613c425760001990808201818111613c2b5760125490838201918211613c1457808203613cbc575b5050506012548015613bc55701613c9981612acf565b60088254910260020a850319169055601255815260136020526040812055600190565b613cde6008613ccd612b5c94612acf565b9054910260020a9004928392612acf565b9055845260136020526040842055388080613c83565b906001820190600092818452826020526040842054801515600014613dea5760001990808201818111613dd357835490838201918211613dbc57808203613d83575b50505081548015613d6c570190613d4d8282612b06565b60088254910260020a8703191690555582526020526040812055600190565b60248660e060020a634e487b710281526031600452fd5b613da76008613d95612b5c9488612b06565b9054910260020a900492839287612b06565b90558652846020526040862055388080613d36565b60248860e060020a634e487b710281526011600452fd5b60248760e060020a634e487b710281526011600452fd5b5050505090565b15613df857565b606460405160e560020a62461bcd02815260206004820152601760248201527f446f65736e2774206f776e20676976656e20746f6b656e0000000000000000006044820152fd5b15613e4657565b606460405160e560020a62461bcd02815260206004820152600f60248201527f5245534355452044495341424c454400000000000000000000000000000000006044820152fd5b15613e9457565b606460405160e560020a62461bcd02815260206004820152601260248201527f5357495045522c204e4f2053574950494e4700000000000000000000000000006044820152fd5b600554908115613f1057613f0691613ef9613efe92601a5490612a38565b613aec565b601b54612a38565b601b556000601a55565b613f1d9150601a54612a38565b601a55565b600654908115613f5257613f4891613ef9613f4092601c5490612a38565b601d54612a38565b601d556000601c55565b613f5f9150601c54612a38565b601c55565b613f6f333214612775565b600092835b8381106140eb575083156140e55761406f575b5050600160a060020a0380600c5416803b156102f957600060405180927f1fb2e3e7000000000000000000000000000000000000000000000000000000008252818381613fd8893360048401612e4b565b03925af180156106f157614060575b50600b541690813b156102f957600060405180937f40c10f1900000000000000000000000000000000000000000000000000000000825281838161402f873360048401612e4b565b03925af19182156106f15761404c92614051575b50602654612a38565b602655565b61405a90612820565b38614043565b61406990612820565b38613fe7565b600160a060020a03600c541691823b156102f9576140c192600092836040518096819582947fc5f520960000000000000000000000000000000000000000000000000000000084523360048501612d3b565b03925af180156106f1576140d6575b80613f87565b6140df90612820565b386140d0565b50505050565b61ffff806140fd6104ad8488886126e1565b166000526010602091818352600160a060020a0360409261412b3383606060020a8760002054041614613a85565b876001605060020a039a8b85898d83602754168a888d8342111560001461433a5750505050926131c89261416c6104ad610a6f94610a80976141849a6126e1565b16600052868b52620100008a60002054041642613b0f565b995b898989156142e6578592508861419f926104ad926126e1565b166000528452600060018482208281550155600780549060001982019182116108c9575533600052601984526141e883600020836141e16104ad898d8d6126e1565b1690613cf4565b50600a54166141fb6104ad868a8a6126e1565b90803b156102f95761422c600092918392865194858094819360e060020a6323b872dd0283523330600485016128f8565b03925af180156142db57917fe9083238ed5c128b67831b957929cef6c82beb49da6f7f4d156f6391a5a65131916142c7969594936142cc575b506142746104ad868b8b6126e1565b81845191438352428784015216907f01284f151397024a42410c824f8bbe00dc1e79227f1bd99799bdf4878c9385d0853392a35b6142b66104ad868b8b6126e1565b1691519289845286151593a3612811565b613f74565b6142d590612820565b38614265565b83513d6000823e3d90fd5b7fe9083238ed5c128b67831b957929cef6c82beb49da6f7f4d156f6391a5a65131945092856143246104ad8b61433596956142c79d9c9b9a986126e1565b166000528652421684600020612993565b6142a8565b939094919592969798836143526104ad8585856126e1565b166000528585528789620100008099600020540416106000146143b457946143a494610a8098946143926104ad8c99966131c89b966143ae9f9e986126e1565b16600052528c60002054041690613ad3565b601f549116612c70565b99614186565b50505050505050505099614186565b60009061ffff600091168082526003602052604092600160ff85852054161460001461440b57508152600f602052606060020a600160a060020a039283922054041691161490565b8383205460ff1660020361443b575081526011602052606060020a600160a060020a039283922054041691161490565b949392919050600360ff83832054161461445457505050565b60146020522054606060020a9004600160a060020a039081169116149150565b61ffff1660009080825260106020526001605060020a0390620100009082826040862054041615156000146144ff5760275483164281106144d0575091610a6f916040856131c895612d5b975260106020522054041642613b0f565b82915083819360408720540416106000146144ff5782916131c8936143a4926040612d5b972054041690613ad3565b50505090565b600061ffff6000921690818352602060038152604091600160ff84872054161480614664575b156145a057506027546001605060020a03939084164281106145695750610b809285600f6131c896946201000094612d5b9952522054041642613b0f565b9291600f91865252620100009082848383882054041610600014613dea579183610bdc926131c89594612d5b972054041690613ad3565b600382959252600260ff84842054161480614645575b156145e157506001605060020a039162010000916011612d5b96601b54968352522054041690613b0f565b93925060038352600360ff83832054161480614626575b6146025750505090565b612d5b93506001605060020a039162010000916014601d5495522054041690613b0f565b5060148352600160a060020a03606060020a83832054041615156145f8565b5060118552600160a060020a03606060020a84842054041615156145b6565b50600f82526001605060020a0362010000848720540416151561452b565b6012549081156146e05763ffffffff82911606908110156126f1577fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec344401546000526011602052600160a060020a03606060020a604060002054041690565b505060009056fea264697066735822122021f0627286d8b1e760d275d2b43132ee9948bfa7a0fdc73fbbf7b018bbec0d3a64736f6c63430008100033
Deployed Bytecode Sourcemap
547:30771:9:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4659:36;547:30771;4659:36;;;547:30771;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;547:30771:9;;;;;;:::i;:::-;;;:::i;:::-;;;;-1:-1:-1;;;;;547:30771:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1063:62:0;;:::i;:::-;547:30771:9;-1:-1:-1;;;;;547:30771:9;;;;5843:28;547:30771;;;5843:28;547:30771;;;5881:24;547:30771;;;5881:24;547:30771;;5915:27;547:30771;;;5915:27;547:30771;;;5952:31;547:30771;;;5952:31;547:30771;;5993:16;547:30771;;;5993:16;547:30771;6019:11;547:30771;;;6019:11;547:30771;;;;;;;;;;;;;;;-1:-1:-1;;547:30771:9;;;;;;:::i;:::-;1063:62:0;;:::i;:::-;-1:-1:-1;;;;;547:30771:9;;;2169:22:0;;;547:30771:9;;;;;;;;-1:-1:-1;;;;;547:30771:9;;;;;;;;;;2573:40:0;;;;547:30771:9;;;;;-1:-1:-1;;;;;547:30771:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;547:30771:9;;;;;-1:-1:-1;;;;;3122:29:9;547:30771;;;;;;;;;;;;;;-1:-1:-1;;547:30771:9;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;1063:62:0;;;:::i;:::-;6197:32:9;;;547:30771;;;6375:3;547:30771;;;;6354:19;;;;;;;547:30771;6402:9;;;;;;;;:::i;:::-;;:::i;:::-;547:30771;6402:14;547:30771;;6478:11;;6493:9;;;;;;:::i;:::-;6478:11;;;;:::i;:::-;;:::i;:::-;547:30771;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6340:12;;547:30771;;-1:-1:-1;;;;;547:30771:9;;;;;;;;;;;;;;-1:-1:-1;;;;;547:30771:9;;;;;;;;;;;;;;;;6354:19;547:30771;;;;;;;;-1:-1:-1;;;;;547:30771:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;547:30771:9;;;;1063:62:0;;:::i;:::-;547:30771:9;;;1744:1:2;547:30771:9;;;;;;;-1:-1:-1;;547:30771:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2317:63:2;1744:1;2325:7;547:30771:9;;;;2325:19:2;;2317:63;:::i;:::-;1744:1;2325:7;1744:1;20991:44:9;21012:10;20999:9;:23;20991:44;:::i;:::-;21045:57;20999:9;-1:-1:-1;;;;;547:30771:9;;21053:20;21045:57;:::i;:::-;547:30771;21129:19;;;;;;547:30771;-1:-1:-1;;;;;21768:3:9;547:30771;;21768:41;;;;;;547:30771;;;;;;21768:41;;;;;;;547:30771;21768:41;;547:30771;21768:41;;;:::i;:::-;;;;;;;;;;;21112:647;2325:7:2;1744:1;;547:30771:9;21768:41;;;;:::i;:::-;;;;;547:30771;;;;;;;;;21150:3;-1:-1:-1;;;;;21177:7:9;547:30771;;21193:11;;;;;;:::i;:::-;547:30771;;;21177:28;547:30771;21177:28;;547:30771;;21177:28;;547:30771;21177:28;;547:30771;21177:28;;;;;;;;21169:79;21177:28;547:30771;21177:28;;;21150:3;-1:-1:-1;;;;;;547:30771:9;21012:10;21177:42;21169:79;:::i;:::-;21310:11;;;;;;:::i;:::-;21262:60;;;;;;;547:30771;;;;;;;21262:60;;;;;;-1:-1:-1;;;;;21262:60:9;;21303:4;21012:10;547:30771;21262:60;;;:::i;:::-;;;;;;;;;;;21150:3;21429:11;547:30771;21429:11;;;;;;:::i;:::-;547:30771;;;;;;;:::i;:::-;;;;21470:15;-1:-1:-1;;;;;547:30771:9;21177:28;21358:191;;547:30771;;;-1:-1:-1;;;;;547:30771:9;;;21358:191;;547:30771;21358:191;;;547:30771;;21343:11;;;;;;:::i;:::-;547:30771;;;21337:5;21177:28;547:30771;;;;;:::i;:::-;-1:-1:-1;;;;;547:30771:9;;;;21606:13;21177:28;547:30771;10606:32:8;547:30771:9;;;;21633:11;;;;;;:::i;:::-;547:30771;10606:32:8;;:::i;:::-;;21659:20:9;547:30771;;;2325:7:2;547:30771:9;;;;;;;21150:3;1744:1:2;;547:30771:9;21719:11;;;;;;:::i;:::-;547:30771;;;21470:15;547:30771;;21698:50;21177:28;-1:-1:-1;;;;;547:30771:9;;21698:50;;21150:3;:::i;:::-;21117:10;;547:30771;-1:-1:-1;;;;;547:30771:9;;;;;;;;21262:60;;;;:::i;:::-;;;;21177:28;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;547:30771;;;;;;-1:-1:-1;;547:30771:9;;;;1063:62:0;;:::i;:::-;547:30771:9;;30356:16;1744:1:2;547:30771:9;;;;;;;-1:-1:-1;;547:30771:9;;;;1063:62:0;;:::i;:::-;547:30771:9;;31079:16;1744:1:2;547:30771:9;;;;;2484:1:2;547:30771:9;;;:::i;:::-;1204:72:1;;;:::i;:::-;2317:63:2;1744:1;2325:7;547:30771:9;2325:19:2;;2317:63;:::i;:::-;1744:1;2325:7;1744:1;2484;:::i;547:30771:9:-;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;547:30771:9;;;;;;26756:15;547:30771;;;;;;;26822:13;547:30771;;;;;;;;26869:10;547:30771;26864:884;26881:17;;;;;;27762:10;;;547:30771;;-1:-1:-1;;;;;547:30771:9;;27900:12;547:30771;;27881:15;;;:31;;27757:477;27774:15;;;;;;547:30771;;;;;;;;27791:3;547:30771;;;;;;;;27791:3;547:30771;;;;;;;;4904:18:8;547:30771:9;;;;4904:18:8;:::i;:::-;547:30771:9;;;;;;;;;;;;27878:346;;;;27932:76;547:30771;;27940:68;547:30771;;;27959:5;547:30771;;27940:59;27941:38;547:30771;;;;;;;;27881:15;27941:38;:::i;:::-;27983:16;547:30771;27940:59;;:::i;:::-;547:30771;;27940:68;;:::i;:::-;27932:76;;:::i;:::-;27878:346;27791:3;:::i;:::-;27762:10;;;;;;;;;;;27878:346;547:30771;;28033:5;547:30771;;;;;;;;;;;;;28033:35;28029:195;28033:35;;;547:30771;28096:56;28097:35;28096:65;547:30771;28088:73;547:30771;;;;;;;;28097:35;;:::i;:::-;547:30771;28136:16;547:30771;;;28096:56;:::i;28029:195::-;28200:9;;;28029:195;27791:3;:::i;26900:::-;547:30771;;;;;;;;;;;;;4904:18:8;547:30771:9;;;;4904:18:8;:::i;:::-;547:30771:9;;;;;;;;;;;;;;;;;;;;;;;;27017:1;547:30771;;;;;;26993:25;26989:749;27017:1;;;-1:-1:-1;;27060:12:9;547:30771;26900:3;;-1:-1:-1;;;;;;547:30771:9;;;;;27041:15;:31;-1:-1:-1;27041:31:9;;547:30771;27105:38;27104:68;547:30771;27123:5;27096:76;547:30771;;;27104:59;547:30771;;;;;;;;;;;27041:15;27105:38;:::i;:::-;27147:16;547:30771;27104:59;;:::i;27096:76::-;27038:370;26900:3;:::i;:::-;26869:10;;;;;;;;;;27038:370;547:30771;;;;27201:5;547:30771;;;;;;;;;;;;27201:35;27197:211;27201:35;;;547:30771;27269:35;27260:73;547:30771;;;27268:65;547:30771;27268:56;547:30771;;;;;;;27269:35;;:::i;:::-;27308:16;547:30771;;;27268:56;:::i;27197:211::-;27380:9;;;;27197:211;27791:3;:::i;26989:749::-;547:30771;;;;;;;;;;;;27432:25;27428:310;547:30771;;;;;26900:3;547:30771;27485:38;27477:46;547:30771;27485:14;547:30771;;;;27502:6;547:30771;;-1:-1:-1;;;;;547:30771:9;;;;;;;27485:38;;:::i;27428:310::-;27791:3;:::i;27428:310::-;547:30771;;;;;;;;;27548:25;27544:194;26993:11;;;547:30771;27593:52;26900:3;547:30771;27601:44;:17;547:30771;27621:9;547:30771;;-1:-1:-1;;;;;547:30771:9;;;;;;;27601:44;;:::i;27544:194::-;547:30771;26900:3;547:30771;;;;;;;27428:310;27666:72;26900:3;:::i;547:30771::-;;;;;;-1:-1:-1;;547:30771:9;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;547:30771:9;;;;;5139:31;547:30771;;;;;;;;;;;;;-1:-1:-1;;547:30771:9;;;;;1476:30;547:30771;;;;;;;;;;;;;-1:-1:-1;;547:30771:9;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;547:30771:9;;;;;-1:-1:-1;;;;;3069:15:9;547:30771;;;;;;;;;;;;;;-1:-1:-1;;547:30771:9;;;;;-1:-1:-1;;;;;2944:19:9;547:30771;;;;;;;;;;;;;;-1:-1:-1;;547:30771:9;;;;;;;763:1;547:30771;;;;;;;;;-1:-1:-1;;547:30771:9;;;;4659:36;547:30771;;;;;;;;;;;;;;-1:-1:-1;;547:30771:9;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;-1:-1:-1;;547:30771:9;;;;;-1:-1:-1;;;;;547:30771:9;;;;;;;;;;;;;;;-1:-1:-1;;547:30771:9;;;;1063:62:0;;:::i;:::-;547:30771:9;;31176:17;1744:1:2;547:30771:9;;;;;;;-1:-1:-1;;547:30771:9;;;;;4821:36;547:30771;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;547:30771:9;;:::i;:::-;;;;;;28399:15;547:30771;;;;;;;28458:20;;;;:::i;:::-;28493:10;547:30771;28505:10;;;;;;547:30771;;;;;;;:::i;:::-;;;;28517:3;;547:30771;;;;;;;;;4904:18:8;547:30771:9;;;;4904:18:8;:::i;:::-;547:30771:9;;;;;;;;;28536:57;;;;:::i;:::-;547:30771;28517:3;:::i;:::-;28493:10;;547:30771;;;;;;-1:-1:-1;;547:30771:9;;;;;5056:38;547:30771;;;;;;;;;;;;;-1:-1:-1;;547:30771:9;;;;1063:62:0;;:::i;:::-;547:30771:9;;30570:24;1744:1:2;547:30771:9;;;;;;;-1:-1:-1;;547:30771:9;;;;;;:::i;:::-;1063:62:0;;:::i;:::-;24537:24:9;547:30771;;-1:-1:-1;;547:30771:9;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;547:30771:9;;;;;4723:37;547:30771;;;;;;;;;;;;;-1:-1:-1;;547:30771:9;;;;1063:62:0;;:::i;:::-;547:30771:9;;;-1:-1:-1;;;;;547:30771:9;;;;;;-1:-1:-1;;;;;547:30771:9;;;;2573:40:0;;;;547:30771:9;;;2484:1:2;547:30771:9;;;:::i;:::-;1204:72:1;;;:::i;:::-;2317:63:2;1744:1;2325:7;547:30771:9;2325:19:2;;2317:63;:::i;:::-;1744:1;2325:7;1744:1;2484;:::i;:::-;2325:7;1744:1;;547:30771:9;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;547:30771:9;;;;;-1:-1:-1;;;;;2916:21:9;547:30771;;;;;;;;;;;;;;;;;;;;:::i;:::-;1204:72:1;;:::i;:::-;2325:7:2;2317:63;1744:1;547:30771:9;;2325:19:2;;2317:63;:::i;:::-;1744:1;;;18428:44:9;18449:10;18436:9;:23;18428:44;:::i;:::-;547:30771;;;;;;;18495:6;547:30771;;-1:-1:-1;;;;;18449:10:9;18487:73;18449:10;547:30771;-1:-1:-1;;;547:30771:9;;;;;;18495:35;18487:73;:::i;:::-;547:30771;;;;;;1744:1:2;547:30771:9;;;;;;18574:25;547:30771;;18639:63;18660:9;547:30771;18647:9;:22;18639:63;:::i;:::-;547:30771;18709:10;547:30771;;18741:8;547:30771;18709:41;;;;;;;547:30771;;;;;;;18709:41;;;;;;547:30771;18709:41;;18449:10;547:30771;18709:41;;;:::i;:::-;;;;;;;;;;;547:30771;;;18781:10;547:30771;;;;;18781:30;;;;547:30771;18781:30;;;;;;;;;;547:30771;18781:30;;;547:30771;18825:19;;18817:81;547:30771;18825:19;;;;;;18817:81;:::i;:::-;547:30771;;;18928:28;;;;547:30771;18928:28;;;547:30771;18928:28;;547:30771;18928:28;;;;;;;547:30771;18928:28;;;547:30771;18962:15;19113:1;19107:3;19087:7;;;;:::i;:::-;547:30771;19087:16;547:30771;19086:28;19113:1;;;19124:13;;547:30771;;19082:164;547:30771;;;;;;;;;;;;19252:164;;19082;547:30771;;;;;19421:3;547:30771;;19421:23;18647:9;;19421:23;;;19082:164;18647:9;19421:23;;;;;547:30771;;;;;;;;;;;;;;;;;;;;19456:64;547:30771;18449:10;19456:64;;1744:1:2;;547:30771:9;;;;;;19421:23;;;-1:-1:-1;19421:23:9;;19252:164;547:30771;18709:10;547:30771;;;;;;19293:50;;;;;;;547:30771;;;;;;;19293:50;;;;;;547:30771;19293:50;;18449:10;547:30771;19293:50;;;:::i;:::-;;;;;;;;;;;19252:164;547:30771;;19354:3;547:30771;;;;;;;;;;;;;19354:55;;;;;;;547:30771;;;;;;;19354:55;;;;;;547:30771;19354:55;;18449:10;547:30771;19354:55;;;:::i;:::-;;;;;;;;;;547:30771;;;;;;;;19354:55;;19252:164;;;;;;;;;19354:55;;;;:::i;:::-;;;;19293:50;;;;:::i;:::-;;;;19082:164;19180:2;19154:7;;19107:3;19154:7;;:::i;:::-;547:30771;19154:16;547:30771;19153:29;19180:2;;;547:30771;1744:1:2;19082:164:9;;19150:96;547:30771;19226:13;19082:164;;18928:28;;;;;;547:30771;18928:28;;;;;;:::i;:::-;;;;;:::i;:::-;;;;18781:30;;;;;;;;;;;;;;;;;;:::i;:::-;;;547:30771;;;;;;;18817:81;18781:30;;;;;;;18709:41;;;;:::i;:::-;;;;547:30771;;;;;;-1:-1:-1;;;;;547:30771:9;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;547:30771:9;;;;;;1685:7:1;547:30771:9;;;;;;;;;;;;;;;;-1:-1:-1;;547:30771:9;;;;;;-1:-1:-1;;;;;547:30771:9;;;;;;;1063:62:0;;:::i;:::-;-1:-1:-1;;;;;547:30771:9;31284:25;547:30771;;;31284:25;547:30771;;;;;;;;;;;-1:-1:-1;;547:30771:9;;;;;-1:-1:-1;;;;;5216:26:9;547:30771;;;;;;;;;;;;;;-1:-1:-1;;547:30771:9;;;;;4416:45;547:30771;;;;;;;;;;;;;-1:-1:-1;;547:30771:9;;;;;;;5331:33;547:30771;;;;;;;;;;;;;;;;;-1:-1:-1;;547:30771:9;;;;1063:62:0;;:::i;:::-;547:30771:9;;;;;;;;1744:1:2;547:30771:9;;1744:1:2;547:30771:9;;;;;;1744:1:2;547:30771:9;;;;;;;-1:-1:-1;;547:30771:9;;;;;4924:40;547:30771;;;;;;;;;;;;;-1:-1:-1;;547:30771:9;;;;;;;;;;;;;;;;;;;;;;;;;1063:62:0;;:::i;:::-;30699:29:9;1744:1:2;30738:30:9;1744:1:2;547:30771:9;;;;;;;-1:-1:-1;;547:30771:9;;;;1063:62:0;;:::i;:::-;547:30771:9;;30459:24;1744:1:2;547:30771:9;;;;;;;-1:-1:-1;;547:30771:9;;;;;;;;;;;;;;;;;;:::i;:::-;;2317:63:2;1744:1;2325:7;547:30771:9;2325:19:2;;2317:63;:::i;:::-;1744:1;2325:7;1744:1;16604:41:9;547:30771;;16612:13;547:30771;;;16604:41;:::i;:::-;547:30771;16696:19;;;;;;547:30771;-1:-1:-1;;;;;18234:3:9;547:30771;;18234:45;;;;;;;547:30771;;;;;;18234:45;;;;;;547:30771;18234:45;;18258:10;547:30771;18234:45;;;:::i;16717:3::-;16746:11;;;;;;:::i;:::-;547:30771;;;;;;;;;;;2325:7:2;547:30771:9;;;;;;16788:25;16784:1431;2325:7:2;;;547:30771:9;;;;;;16841:5;547:30771;;;-1:-1:-1;;;;;547:30771:9;16833:65;547:30771;-1:-1:-1;;;547:30771:9;;;;;;16865:10;16841:34;16833:65;:::i;:::-;547:30771;;;;;;;;2325:7:2;547:30771:9;;;;;;;;16865:10;547:30771;;16955:15;547:30771;;10906:35:8;547:30771:9;;;;;;10906:35:8;:::i;:::-;-1:-1:-1;547:30771:9;;-1:-1:-1;;547:30771:9;;;;;;;;1744:1:2;17054:9:9;547:30771;;17054:66;;;;;;547:30771;;;17054:66;;-1:-1:-1;;;;;17054:66:9;;16865:10;;;17054:66;16865:10;;17089:4;547:30771;17054:66;;;:::i;:::-;;;;;;;;;;547:30771;2325:7:2;17054:66:9;17143:30;17054:66;16717:3;17054:66;;;16784:1431;547:30771;;;;;;;;17143:30;;16717:3;:::i;:::-;16684:10;;17054:66;;;;:::i;:::-;;;;16784:1431;547:30771;;;;;;1744:1:2;17198:25:9;1744:1:2;;547:30771:9;;;;;;17251:6;547:30771;;-1:-1:-1;;;;;17243:66:9;547:30771;-1:-1:-1;;;547:30771:9;;;;;;17276:10;17251:35;17243:66;:::i;:::-;547:30771;;;;;;;17251:6;547:30771;;;;;;;;2325:7:2;547:30771:9;;10906:35:8;;;:::i;:::-;;17276:10:9;547:30771;;17410:15;547:30771;;10906:35:8;547:30771:9;;;;;;10906:35:8;:::i;:::-;-1:-1:-1;17471:20:9;547:30771;;-1:-1:-1;;547:30771:9;;;17471:20;547:30771;;;;1744:1:2;17509:9:9;547:30771;;17509:66;;;;;;547:30771;;;17509:66;;-1:-1:-1;;;;;17509:66:9;;17276:10;;;17509:66;17276:10;;17544:4;547:30771;17509:66;;;:::i;:::-;;;;;;;;;;547:30771;2325:7:2;17509:66:9;17598:31;17509:66;16717:3;17509:66;;;547:30771;;;;;;;;17598:31;;16717:3;:::i;17194:1021::-;547:30771;;;;;;17654:25;;16788:11;;547:30771;;;;;;17707:9;547:30771;;;-1:-1:-1;;;;;547:30771:9;17699:69;547:30771;-1:-1:-1;;;547:30771:9;;;;;;17735:10;17707:38;17699:69;:::i;:::-;547:30771;;;;;;;;2325:7:2;547:30771:9;;;;;;;;10906:35:8;547:30771:9;;;10906:35:8;:::i;:::-;;17735:10:9;547:30771;;17875:15;547:30771;;10906:35:8;547:30771:9;;;;;;10906:35:8;:::i;:::-;-1:-1:-1;17936:23:9;547:30771;;-1:-1:-1;;547:30771:9;;;17936:23;547:30771;;;;1744:1:2;17977:9:9;547:30771;;17977:66;;;;;;547:30771;;;17977:66;;-1:-1:-1;;;;;17977:66:9;;17735:10;;;17977:66;17735:10;;18012:4;547:30771;17977:66;;;:::i;:::-;;;;;;;;;;547:30771;2325:7:2;17977:66:9;18066:34;17977:66;16717:3;17977:66;;;547:30771;;;;;;;;18066:34;;27791:3;:::i;17650:565::-;18137:11;;;;;;;;;:::i;:::-;547:30771;;;;;;;;;;;18125:29;18121:94;;16717:3;17650:565;27791:3;:::i;18121:94::-;547:30771;;-1:-1:-1;;;;;18174:26:9;;547:30771;;18174:26;;547:30771;;;;;;;;;;;;;18174:26;547:30771;;;;;;-1:-1:-1;;547:30771:9;;;;;-1:-1:-1;;;;;3038:24:9;547:30771;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;547:30771:9;;:::i;:::-;;;;;;28746:13;547:30771;;;;;;;28803:20;;;;:::i;:::-;28838:10;547:30771;28850:10;;;;;;547:30771;;;;;;;:::i;28862:3::-;;547:30771;;;;;;;;;4904:18:8;547:30771:9;;;;4904:18:8;:::i;28862:3:9:-;28838:10;;547:30771;;;;;;-1:-1:-1;;547:30771:9;;;;;;:::i;:::-;-1:-1:-1;;;;;547:30771:9;5519:9;547:30771;;5511:32;;:69;;;;547:30771;5511:114;;;547:30771;5511:144;;;547:30771;;;;;1063:62:0;;:::i;:::-;25133:46:9;;;1204:72:1;;:::i;:::-;2255:4;547:30771:9;;2245:14:1;547:30771:9;;;2245:14:1;547:30771:9;2274:20:1;547:30771:9;;;719:10:6;547:30771:9;;2274:20:1;547:30771:9;25133:46;1685:7:1;547:30771:9;;;;;;;;;;1685:7:1;547:30771:9;2521:22:1;547:30771:9;;;719:10:6;547:30771:9;;2521:22:1;547:30771:9;;;;;-1:-1:-1;;;;;547:30771:9;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;547:30771:9;;;;;;;;;;;;;;;;;;5511:144;547:30771;;5637:3;547:30771;;5629:26;;5511:144;;;:114;5600:10;547:30771;;;5592:33;;;-1:-1:-1;5511:114:9;;:69;5555:10;547:30771;;;5547:33;;;-1:-1:-1;5511:69:9;;547:30771;;;;;;-1:-1:-1;;547:30771:9;;;;;;:::i;:::-;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30125:41;547:30771;;;;;;;;;-1:-1:-1;;547:30771:9;;;;;4505:45;547:30771;;;;;;;;;;;;;;:::i;:::-;2317:63:2;1744:1;2325:7;547:30771:9;;;;2325:19:2;;2317:63;:::i;:::-;1744:1;2325:7;1744:1;6817:44:9;6838:10;6825:9;:23;6817:44;:::i;:::-;6871:57;6825:9;-1:-1:-1;;;;;547:30771:9;;6879:20;6871:57;:::i;:::-;547:30771;6955:19;;;;;;547:30771;-1:-1:-1;;;;;7804:3:9;547:30771;;7804:43;;;;;;547:30771;;;;;;7804:43;;;;;;;547:30771;7804:43;;547:30771;7804:43;;;:::i;6976:3::-;547:30771;;;-1:-1:-1;;;;;7003:9:9;547:30771;;7021:11;;;;;;:::i;:::-;547:30771;;;7003:30;547:30771;7003:30;;547:30771;;7003:30;;547:30771;7003:30;;547:30771;7003:30;;;;;;;;6995:81;7003:30;547:30771;7003:30;;;-1:-1:-1;;;;;;547:30771:9;6838:10;7003:44;6995:81;:::i;:::-;547:30771;7107:11;;;;;;:::i;:::-;547:30771;;;7095:11;7003:30;547:30771;;2325:7:2;547:30771:9;;;;;;7095:29;7091:693;2325:7:2;;;547:30771:9;;;;;-1:-1:-1;;;;;7003:9:9;547:30771;;7194:11;;;;;;:::i;:::-;7144:62;;;;;;;547:30771;;;;;;;7144:62;;;;;;-1:-1:-1;;;;;7144:62:9;;7187:4;6838:10;547:30771;7144:62;;;:::i;:::-;;;;;;;;;;;7091:693;7256:11;547:30771;7256:11;;;;;;:::i;:::-;547:30771;9538:15;547:30771;-1:-1:-1;;;;;9538:15:9;547:30771;;;;;;;:::i;:::-;;;;9447:162;7003:30;9447:162;;547:30771;-1:-1:-1;;;;;547:30771:9;;;9447:162;;547:30771;9447:162;;;547:30771;;;;9430:5;7003:30;547:30771;;;;;:::i;:::-;-1:-1:-1;;;;;547:30771:9;;;;9658:15;7003:30;547:30771;10606:32:8;547:30771:9;;;;10606:32:8;:::i;:::-;;547:30771:9;;;2325:7:2;547:30771:9;;;;;;;6976:3;1744:1:2;547:30771:9;1744:1:2;547:30771:9;;2325:7:2;547:30771:9;;9538:15;7003:30;547:30771;;;9740:49;547:30771;-1:-1:-1;;;;;547:30771:9;;9740:49;;6976:3;:::i;:::-;6943:10;;7144:62;;;;:::i;:::-;;;;7091:693;547:30771;7305:11;;;;;;:::i;:::-;547:30771;;;7095:11;7003:30;547:30771;1744:1:2;547:30771:9;;;;;;7293:29;7289:495;1744:1:2;;;547:30771:9;;-1:-1:-1;;;;;7003:9:9;547:30771;;7392:11;;;;;;:::i;:::-;7342:62;;;;;;;547:30771;;;;;;;7342:62;;;;;;-1:-1:-1;;;;;7342:62:9;;7385:4;6838:10;547:30771;7342:62;;;:::i;:::-;;;;;;;;;;;7289:495;7455:11;547:30771;7455:11;;;;;;:::i;:::-;547:30771;1204:72:1;;;:::i;:::-;-1:-1:-1;;;;;8251:14:9;;547:30771;;;;;;;;;;;:::i;:::-;;;;7003:30;8160:161;;547:30771;-1:-1:-1;;;;;547:30771:9;;;8160:161;;547:30771;8294:15;547:30771;8160:161;;;547:30771;;;;;8142:6;547:30771;;7003:30;547:30771;;;;;:::i;:::-;10606:32:8;;;:::i;:::-;;-1:-1:-1;;;;;547:30771:9;;;;8363:15;7003:30;547:30771;10606:32:8;547:30771:9;;;;10606:32:8;:::i;:::-;;8410:20:9;547:30771;;;2325:7:2;547:30771:9;;;;;;;6976:3;1744:1:2;;;;;;547:30771:9;;;;1744:1:2;547:30771:9;;7003:30;547:30771;;;8445:48;547:30771;-1:-1:-1;;;;;547:30771:9;;8445:48;;6976:3;:::i;547:30771::-;;-1:-1:-1;;;;;547:30771:9;;;;;;;7342:62;;;;:::i;:::-;;;;7289:495;547:30771;7504:11;;;;;;;;;;:::i;:::-;547:30771;;;7095:11;7003:30;547:30771;7095:11;547:30771;;;;;;7492:29;7488:296;7095:11;;;7591;;;;;;;:::i;:::-;7541:62;;;;;;;547:30771;;;;;;;7541:62;;;;;;-1:-1:-1;;;;;7541:62:9;;7584:4;6838:10;547:30771;7541:62;;;:::i;:::-;;;;;;;;;;;7488:296;7657:11;547:30771;7657:11;;;;;;:::i;:::-;547:30771;1204:72:1;;;:::i;:::-;-1:-1:-1;;;;;8907:17:9;547:30771;8907:17;547:30771;;;;;;;;;;;;:::i;:::-;;;;7003:30;8816:164;;547:30771;-1:-1:-1;;;;;547:30771:9;;;8816:164;;547:30771;8953:15;547:30771;8816:164;;;547:30771;;;;8795:9;7003:30;547:30771;;;;;:::i;:::-;10606:32:8;;;:::i;:::-;;-1:-1:-1;;;;;547:30771:9;;;;9025:15;7003:30;547:30771;10606:32:8;547:30771:9;;;;10606:32:8;:::i;:::-;;9072:23:9;547:30771;;;2325:7:2;547:30771:9;;;;;;;6976:3;1744:1:2;;547:30771:9;;;;7095:11;547:30771;;7003:30;547:30771;;;9110:51;547:30771;-1:-1:-1;;;;;547:30771:9;;9110:51;;27791:3;:::i;7541:62::-;;;;:::i;:::-;;;;7488:296;7706:11;;547:30771;7706:11;;;;;;:::i;:::-;547:30771;;;7095:11;7003:30;547:30771;;;;;;7694:29;7690:94;;6976:3;7488:296;27791:3;:::i;547:30771::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2325:7:2;;547:30771:9;2317:63:2;1744:1;547:30771:9;;2325:19:2;;2317:63;:::i;:::-;1744:1;;;23736:41:9;547:30771;;23744:13;547:30771;;;23736:41;:::i;:::-;547:30771;23828:19;;;;;;547:30771;;-1:-1:-1;;;;;24267:3:9;547:30771;;24267:43;;;;;;;547:30771;;;;;;24267:43;;;;;;547:30771;24267:43;;23935:10;547:30771;24267:43;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;1744:1:2;;547:30771:9;24267:43;;;;:::i;:::-;1744:1:2;;547:30771:9;23849:3;23878:11;;;;;;:::i;:::-;547:30771;;;;;;;23911:5;547:30771;;;-1:-1:-1;;;;;23935:10:9;23903:65;23935:10;547:30771;-1:-1:-1;;;547:30771:9;;;;;;23911:34;23903:65;:::i;:::-;547:30771;;;;;;;;;;;;;;;24018:20;547:30771;;;;;;;;;;;;1744:1:2;23935:10:9;547:30771;;24052:13;547:30771;;10906:35:8;547:30771:9;;;;10906:35:8;:::i;:::-;;24107:7:9;547:30771;;24107:56;;;;;;547:30771;;;;;;;24107:56;;;;;;-1:-1:-1;;;;;24107:56:9;;23935:10;24136:4;547:30771;24107:56;;;:::i;:::-;;;;;;;;;;23849:3;24107:56;;;23849:3;547:30771;;;24217:12;547:30771;;24231:15;547:30771;;;;24182:65;547:30771;23935:10;24182:65;;23849:3;:::i;:::-;23816:10;;24107:56;;;;:::i;:::-;;;;547:30771;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;-1:-1:-1;;;;;547:30771:9;;;;;;:::o;:::-;;;;-1:-1:-1;;;;;547:30771:9;;;;;;:::o;:::-;;;-1:-1:-1;;547:30771:9;;;;;;;-1:-1:-1;;;;;547:30771:9;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;;547:30771:9;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::o;1359:130:0:-;-1:-1:-1;;;;;1273:6:0;547:30771:9;;719:10:6;1422:23:0;547:30771:9;;1359:130:0:o;547:30771:9:-;;;;-1:-1:-1;;;;;547:30771:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;-1:-1:-1;;;;;547:30771:9;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;1744:1:2:-;;;;:::o;:::-;;547:30771:9;;-1:-1:-1;;;;;1744:1:2;;;;;;;;;;;547:30771:9;1744:1:2;547:30771:9;;;1744:1:2;;547:30771:9;;;;:::o;:::-;;;;-1:-1:-1;;;;;547:30771:9;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;-1:-1:-1;;;;;547:30771:9;;;;;;;;;;;;;;;;;;;-1:-1:-1;;547:30771:9;;;;;;;:::o;:::-;;;;;;;;:::o;:::-;-1:-1:-1;;;;;547:30771:9;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;-1:-1:-1;;;;;547:30771:9;;;;;;;:::o;:::-;;;;:::o;:::-;;;;-1:-1:-1;;;;;547:30771:9;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;547:30771:9;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;-1:-1:-1;547:30771:9;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7095:11;547:30771;;;-1:-1:-1;;;;;547:30771:9;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;-1:-1:-1;;;;;547:30771:9;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;547:30771:9;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;547:30771:9;;;;;;;;;-1:-1:-1;;;547:30771:9;;;;;;;;;;;;;;;-1:-1:-1;;;;;547:30771:9;;;;;;;:::o;:::-;;;;;;;;;;:::o;1767:106:1:-;547:30771:9;1685:7:1;547:30771:9;;;;1767:106:1:o;547:30771:9:-;;;;-1:-1:-1;;;;;547:30771:9;;;;;;;;;;;;;;;;;;;8990:12;547:30771;;;;;;8990:12;-1:-1:-1;547:30771:9;;;;-1:-1:-1;547:30771:9;:::o;:::-;8331:9;547:30771;;;;;;8331:9;-1:-1:-1;547:30771:9;;;;-1:-1:-1;547:30771:9;:::o;:::-;;;;;;;;-1:-1:-1;547:30771:9;;-1:-1:-1;547:30771:9;;;-1:-1:-1;547:30771:9;:::o;2113:404:8:-;-1:-1:-1;547:30771:9;;;4250:12:8;547:30771:9;;;;;;;;8990:12;547:30771;;;;;;;;;;;;4250:12:8;547:30771:9;;;8990:12;547:30771;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;8990:12;547:30771;;;;4250:12:8;547:30771:9;;;1744:1:2;4250:12:8;2446:11;:::o;547:30771:9:-;;;-1:-1:-1;;;;;547:30771:9;;;;;;2192:319:8;2488:12;;;:::o;2113:404::-;-1:-1:-1;547:30771:9;;;4250:12:8;547:30771:9;;;;;;;;8331:9;547:30771;;;;;;;;;;;;4250:12:8;547:30771:9;;;8331:9;547:30771;;:::i;:::-;;;8331:9;547:30771;;;;4250:12:8;547:30771:9;;;1744:1:2;4250:12:8;2446:11;:::o;2113:404::-;;;4250:12;;;-1:-1:-1;547:30771:9;;;;;;;;;;;4250:24:8;2192:319;547:30771:9;;;;;;;;;;;;;;;;4250:12:8;547:30771:9;;;;;;;;;:::i;:::-;;;;;;;;;;1744:1:2;4250:12:8;2446:11;:::o;547:30771:9:-;;;-1:-1:-1;;;;;547:30771:9;;;;;;2192:319:8;-1:-1:-1;2488:12:8;-1:-1:-1;;2488:12:8:o;547:30771:9:-;;;;;;;;;;;;;;;:::o;:::-;;;;:::o;:::-;;;;-1:-1:-1;;;;;547:30771:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;:::o;:::-;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;;;547:30771:9;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;;-1:-1:-1;;;;;547:30771:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;547:30771:9;;;;;;;;;:::o;10167:1731::-;;;;;10336:44;10357:10;10344:9;:23;10336:44;:::i;:::-;10455:9;547:30771;;10434:74;10455:20;547:30771;-1:-1:-1;10455:20:9;;:::i;:::-;10442:9;:33;10434:74;:::i;:::-;10519:222;;;;10559:22;;;:::i;:::-;547:30771;-1:-1:-1;;;;;10595:3:9;547:30771;;10595:45;;;;;547:30771;;;10595:45;;547:30771;10595:45;;10357:10;;;10595:45;10357:10;;;10595:45;;;;:::i;:::-;;;;;;;;;;;10519:222;;;-1:-1:-1;;;;;10775:10:9;547:30771;;;;;10775:30;;;;;;;;;;;;;;;;;;;;;;;;10519:222;10823:26;;;;10815:88;10823:26;;;10815:88;:::i;:::-;547:30771;;;10937:35;;;;547:30771;10937:35;;;10775:30;10937:35;;547:30771;10937:35;;;;;;;;;;;10519:222;10982:16;;;;;;;;11013:10;;11025:19;;;;;;11681:9;;;;;;;;;;11677:57;;11743:24;547:30771;11743:24;547:30771;11743:24;:::i;:::-;;1744:1:2;-1:-1:-1;;;;;11777:10:9;547:30771;;11777:33;;;;;547:30771;;;11777:33;;547:30771;11777:33;;10357:10;;;11777:33;10357:10;;10775:30;11777:33;;;:::i;:::-;;;;;;;;;;;;;;11008:660;547:30771;;-1:-1:-1;;;;;11820:3:9;547:30771;;11820:38;;;;;;;547:30771;;;;;;11820:38;;;;;;547:30771;11820:38;;10357:10;10775:30;11820:38;;;:::i;:::-;;;;;;;;;;;;;;11008:660;547:30771;;;;-1:-1:-1;;;;;11868:3:9;547:30771;;11868:23;10442:9;;11868:23;;;11008:660;10442:9;11868:23;;;;;10167:1731;:::o;11868:23::-;547:30771;;;;;;;;;;11868:23;;;-1:-1:-1;11868:23:9;;11820:38;;;;:::i;:::-;547:30771;;11820:38;;;;547:30771;;;11820:38;547:30771;;;;;;;;;11777:33;;;;:::i;:::-;547:30771;;11777:33;;;;547:30771;;;;11777:33;547:30771;;;;;;;;;11677:57;11706:17;;:::o;11046:3::-;547:30771;11081:11;;;;;;:::i;:::-;547:30771;;;11069:11;10775:30;547:30771;;;;;;;11097:1;11069:29;11097:1;;11174:11;;;;;;:::i;:::-;11196:7;;;;:::i;:::-;547:30771;12451:12;547:30771;;;;;;12490:5;10775:30;547:30771;12482:72;10357:10;-1:-1:-1;;;;;;;;547:30771:9;;;;;;12490:34;12482:72;:::i;:::-;12586:12;547:30771;;;-1:-1:-1;;;;;547:30771:9;12567:15;:31;-1:-1:-1;12567:31:9;;547:30771;12621:68;:59;12622:38;-1:-1:-1;;;;;547:30771:9;;13101:31;547:30771;;;;;;12490:5;10775:30;547:30771;;;;;12567:15;12622:38;:::i;12621:59::-;12683:6;547:30771;12621:68;;:::i;:::-;13101:19;12945:5;547:30771;12916:26;12923:19;547:30771;12916:26;;:::i;:::-;547:30771;12977:12;;;;:::i;:::-;13020:22;13027:15;547:30771;13020:22;;:::i;:::-;547:30771;13074:9;;;;:::i;:::-;13101:19;:::i;:31::-;13172:13;13143:19;13172:13;;13195:941;;;;;;13250:2;13244:3;547:30771;13227:13;;547:30771;13226:26;13222:202;;13195:941;547:30771;;;;;;12490:5;10775:30;547:30771;;11097:1;547:30771;;;;;;;;10775:30;547:30771;;;;;;;;;;;;;;;;;;;;;;10775:30;1744:1:2;10357:10:9;547:30771;;13506:15;10775:30;547:30771;10906:35:8;547:30771:9;;;;;;;10906:35:8;:::i;:::-;-1:-1:-1;13601:326:9;;;547:30771;;11222:13;547:30771;11046:3;547:30771;;;-1:-1:-1;;;;;547:30771:9;;13676:12;;547:30771;;12567:15;10775:30;547:30771;;;;10357:10;;547:30771;13636:70;547:30771;;;;13636:70;;13724:15;13601:326;547:30771;;13980:12;547:30771;;12567:15;10775:30;547:30771;;;;;;10357:10;13945:65;547:30771;10357:10;13945:65;;13195:941;547:30771;;;;;14150:36;10775:30;547:30771;;;;;;14150:36;;11222:13;:::i;:::-;11253:38;;;13195:941;11065:593;11046:3;:::i;:::-;11013:10;;;;;;;;;;;11253:38;547:30771;11266:23;;;;:::i;:::-;547:30771;;;;11253:38;;;13601:326;547:30771;;;;;;;-1:-1:-1;;;;;13846:9:9;547:30771;;13846:66;;;;;547:30771;;;13846:66;;-1:-1:-1;;;;;13846:66:9;;10357:10;;;13846:66;10357:10;;13881:4;10775:30;13846:66;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;13601:326;;;;11222:13;13601:326;11046:3;13601:326;;;;;13846:66;;;;;;;;;;;;:::i;:::-;547:30771;;13846:66;;;;;;;;;;;547:30771;;;;13846:66;547:30771;;;;;;;;;13846:66;547:30771;;;;;;-1:-1:-1;;;;;547:30771:9;;;10775:30;547:30771;;13222:202;13280:23;;;;;;;:::i;:::-;-1:-1:-1;;;;;13321:9:9;547:30771;;13321:57;;;;;547:30771;;;13321:57;;547:30771;13321:57;;13356:4;;;13321:57;13356:4;;;10775:30;13321:57;;;:::i;:::-;;;;;;;;;;;;;;13222:202;13396:13;;11097:1;13222:202;;;;13321:57;;;;:::i;:::-;547:30771;;13321:57;;;;13195:941;547:30771;;;;;;;;;;11222:13;547:30771;;;11046:3;547:30771;;;;;;;;;12490:5;10775:30;547:30771;14052:46;12567:15;547:30771;-1:-1:-1;;;;;12567:15:9;547:30771;;;14052:46;:::i;:::-;13195:941;;12564:319;547:30771;;;;;;;12490:5;10775:30;547:30771;;;;;-1:-1:-1;;;;;547:30771:9;;;;;;;12710:35;12706:177;12710:35;;;12769;12768:65;547:30771;-1:-1:-1;;;;;13101:31:9;547:30771;;12768:56;547:30771;;;;;12769:35;;:::i;:::-;-1:-1:-1;;;;;12808:16:9;547:30771;;;12768:56;:::i;:65::-;12564:319;;12706:177;12864:8;;13101:31;12864:8;;12564:319;;11065:593;11327:11;;;;547:30771;11327:11;;;;;;;;;:::i;:::-;547:30771;;;11069:11;10775:30;547:30771;;;;;;;11343:1;11315:29;11343:1;;11394:11;;;;;;:::i;:::-;547:30771;;;;;;;14551:6;547:30771;;10775:30;547:30771;14543:71;10357:10;-1:-1:-1;;;;;;;;547:30771:9;10357:10;547:30771;;;;;14551:35;14543:71;:::i;:::-;14631:14;547:30771;;;;;;10775:30;547:30771;;14631:38;547:30771;;-1:-1:-1;;;;;547:30771:9;;;;;;;14631:38;;:::i;:::-;14679:522;;;;;;547:30771;;;;;;;10775:30;547:30771;;11097:1;547:30771;;;;;;;;10906:35:8;;;:::i;:::-;;10357:10:9;547:30771;;14781:15;10775:30;547:30771;10906:35:8;547:30771:9;;;;10906:35:8;:::i;:::-;-1:-1:-1;14838:20:9;547:30771;;-1:-1:-1;;547:30771:9;;;;;;;;1744:1:2;;-1:-1:-1;;;;;14934:9:9;547:30771;;14934:66;;;;;;;547:30771;;;;;;14934:66;;;;;;-1:-1:-1;;;;;14934:66:9;;10357:10;14969:4;10775:30;14934:66;;;:::i;:::-;;;;;;;;;;;;;;14679:522;547:30771;;;11364:51;547:30771;;11046:3;547:30771;;;15055:12;547:30771;;15069:15;10775:30;547:30771;;;15019:66;547:30771;10357:10;15019:66;;14679:522;547:30771;;;;;;15215:37;10775:30;547:30771;;;15215:37;;11364:51;:::i;14934:66::-;;;;:::i;:::-;547:30771;;14934:66;;;;547:30771;;;;14934:66;547:30771;;;;;;;;;;-1:-1:-1;;;;;547:30771:9;;10775:30;547:30771;;;;14679:522;11364:51;547:30771;;;;;;11046:3;547:30771;;15116:46;547:30771;;;10775:30;547:30771;;;;;15116:46;:::i;:::-;14679:522;;11311:347;547:30771;11452:11;;;;;;:::i;:::-;547:30771;;;11069:11;10775:30;547:30771;11069:11;547:30771;;;;;;11440:29;11436:222;11069:11;;;547:30771;11522:11;;;;;;:::i;:::-;547:30771;;;;;15634:9;547:30771;;10775:30;547:30771;15626:74;10357:10;-1:-1:-1;;;;;;;;547:30771:9;;;;;;15634:38;15626:74;:::i;:::-;15717:17;547:30771;;;;;;10775:30;547:30771;;15717:44;547:30771;;-1:-1:-1;;;;;547:30771:9;;;;;;;15717:44;;:::i;:::-;15771:575;;;;;;547:30771;;;;;;10775:30;547:30771;;11097:1;547:30771;;;;;;;;10906:35:8;;;:::i;:::-;;10357:10:9;547:30771;;15879:15;10775:30;547:30771;10906:35:8;547:30771:9;;;;10906:35:8;:::i;:::-;-1:-1:-1;15936:23:9;547:30771;;-1:-1:-1;;547:30771:9;;;15936:23;547:30771;;;;1744:1:2;-1:-1:-1;;;;;16035:9:9;547:30771;;16035:66;;;;;547:30771;;;;;;16035:66;;;;-1:-1:-1;;;;;16035:66:9;;16070:4;10775:30;16035:66;;547:30771;10357:10;547:30771;;;;;;;;;;;;;;;;;;;16035:66;;;;;;;;;;;15771:575;547:30771;;;11489:54;547:30771;;11046:3;547:30771;;;16194:12;547:30771;;16208:15;10775:30;547:30771;;;16155:69;547:30771;10357:10;16155:69;;15771:575;547:30771;;;;;;16360:40;10775:30;547:30771;;;16360:40;;11489:54;:::i;16035:66::-;;;;:::i;:::-;547:30771;;16035:66;;;;547:30771;;;-1:-1:-1;;;;;547:30771:9;;;10775:30;547:30771;;15771:575;547:30771;16255:52;547:30771;11489:54;547:30771;;;11046:3;547:30771;;;;10775:30;547:30771;;;;;16255:52;:::i;:::-;15771:575;;11436:222;11580:11;547:30771;11580:11;;;;;;:::i;:::-;547:30771;;;11069:11;10775:30;547:30771;;;;;;;11568:29;11564:94;;11046:3;11436:222;27791:3;:::i;10937:35::-;;;;;;;;;;;;;;:::i;:::-;;;;;;547:30771;;;;;;;;;10775:30;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;547:30771;;;;;;;;;;;10775:30;;;;;-1:-1:-1;10775:30:9;;;547:30771;;;;;;;;;10595:45;;;;;;;:::i;:::-;;;;;;547:30771;;;10519:222;547:30771;;;;;;;;;;;;;;;;;10697:1;547:30771;;;;;;;;;10671:28;547:30771;;;;;;;10519:222;;547:30771;;;-1:-1:-1;;;;;547:30771:9;;;;;;;;;-1:-1:-1;;;;;547:30771:9;;;;;;;;;;:::o;:::-;;;;-1:-1:-1;;;;;547:30771:9;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;547:30771:9;;;;;;;;;;;;;:::o;:::-;;;;;;;:::o;:::-;-1:-1:-1;;;;;547:30771:9;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;-1:-1:-1;;;;;547:30771:9;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2685:1388:8:-;-1:-1:-1;547:30771:9;;;2888:12:8;547:30771:9;;;;;;-1:-1:-1;;547:30771:9;2922:15:8;;;;-1:-1:-1;;547:30771:9;;;;;;;;;17829:12;547:30771;;;;;;;;;;3404:26:8;;;3400:398;;2918:1149;547:30771:9;;;17829:12;547:30771;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;17829:12;547:30771;;;2888:12:8;547:30771:9;;;;;;2888:12:8;4002:11;:::o;547:30771:9:-;;;-1:-1:-1;;;;;547:30771:9;;;;;;3400:398:8;547:30771:9;;3470:22:8;3592:26;3470:22;;:::i;:::-;547:30771:9;;;;;;;;;;;3592:26:8;:::i;547:30771:9:-;;;;;2888:12:8;547:30771:9;;;;;1744:1:2;3400:398:8;;;;;547:30771:9;;;-1:-1:-1;;;;;547:30771:9;;;;;;;;;-1:-1:-1;;;;;547:30771:9;;;;;;2918:1149:8;4044:12;;;:::o;2685:1388::-;-1:-1:-1;547:30771:9;;;2888:12:8;547:30771:9;;;;;;-1:-1:-1;;547:30771:9;2922:15:8;;;;-1:-1:-1;;547:30771:9;;;;;;;;;17367:9;547:30771;;;;;;;;;;3404:26:8;;;3400:398;;2918:1149;547:30771:9;;;17367:9;547:30771;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;17367:9;547:30771;;;2888:12:8;547:30771:9;;;;;;2888:12:8;4002:11;:::o;3400:398::-;547:30771:9;;3470:22:8;3592:26;3470:22;;:::i;:::-;547:30771:9;;;;;;;;;;;3592:26:8;:::i;547:30771:9:-;;;;;2888:12:8;547:30771:9;;;;;1744:1:2;3400:398:8;;;;;2685:1388;;2888:12;;;-1:-1:-1;;547:30771:9;;;;;;;;;;;2922:15:8;;;2918:1149;2922:15;;;-1:-1:-1;;547:30771:9;;;;;;;;;;;;;;;;;;;;3404:26:8;;;3400:398;;2918:1149;547:30771:9;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;2888:12:8;4002:11;:::o;547:30771:9:-;;;-1:-1:-1;;;;;547:30771:9;;;;;;3400:398:8;547:30771:9;;3470:22:8;3592:26;3470:22;;;:::i;:::-;547:30771:9;;;;;;;;;;;3592:26:8;;:::i;547:30771:9:-;;;;;;;;;;;1744:1:2;3400:398:8;;;;;547:30771:9;;;-1:-1:-1;;;;;547:30771:9;;;;;;;;;-1:-1:-1;;;;;547:30771:9;;;;;;2918:1149:8;4044:12;;;;;:::o;547:30771:9:-;;;;:::o;:::-;;;;-1:-1:-1;;;;;547:30771:9;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;-1:-1:-1;;;;;547:30771:9;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;-1:-1:-1;;;;;547:30771:9;;;;;;;;;;;;;;;;;;19692:423;19754:15;547:30771;19754:20;;;19750:187;;19999:71;547:30771;20018:33;20017:53;547:30771;20027:24;547:30771;20018:33;;:::i;:::-;20017:53;:::i;:::-;19999:71;547:30771;19999:71;:::i;:::-;;1744:1:2;-1:-1:-1;20027:24:9;1744:1:2;19692:423:9:o;19750:187::-;19821:34;547:30771;;19821:34;547:30771;19821:34;:::i;:::-;;1744:1:2;19920:7:9:o;20240:450::-;20305:18;547:30771;20305:23;;;20301:199;;20562:80;547:30771;20584:36;20583:59;547:30771;20593:27;547:30771;20584:36;;:::i;20583:59::-;20562:80;547:30771;20562:80;:::i;:::-;;1744:1:2;-1:-1:-1;20593:27:9;1744:1:2;20240:450:9:o;20301:199::-;20378:37;547:30771;;20378:37;547:30771;20378:37;:::i;:::-;;1744:1:2;20483:7:9:o;22054:1481::-;22167:44;22188:10;22175:9;:23;22167:44;:::i;:::-;22236:1;22252:10;;22264:19;;;;;;23293:9;;;23289:46;;23344:60;;22247:1033;547:30771;;-1:-1:-1;;;;;547:30771:9;23413:3;547:30771;;23413:38;;;;;22236:1;547:30771;;23413:38;;547:30771;23413:38;;22188:10;;;23413:38;22188:10;;23413:38;;;;:::i;:::-;;;;;;;;;;;22247:1033;547:30771;23461:10;547:30771;;23461:33;;;;;;22236:1;547:30771;;23461:33;;547:30771;23461:33;;22188:10;;;23461:33;22188:10;;23413:38;23461:33;;;:::i;:::-;;;;;;;;;;23504:24;23461:33;;;22247:1033;547:30771;23504:24;547:30771;23504:24;:::i;:::-;;1744:1:2;22054:1481:9:o;23461:33::-;;;;:::i;:::-;;;;23413:38;;;;:::i;:::-;;;;23344:60;-1:-1:-1;;;;;23358:3:9;547:30771;;23358:43;;;;;;;547:30771;22236:1;547:30771;;;;23358:43;;;;;;547:30771;23358:43;;22188:10;23358:43;;;;:::i;:::-;;;;;;;;;;;23344:60;;;;23358:43;;;;:::i;:::-;;;;23289:46;23318:7;;;;:::o;22285:3::-;547:30771;22319:11;;;;;;;:::i;:::-;547:30771;22236:1;547:30771;22313:5;547:30771;;;;;-1:-1:-1;;;;;547:30771:9;22188:10;22305:76;22188:10;547:30771;-1:-1:-1;;;547:30771:9;22236:1;547:30771;;;;22313:38;22305:76;:::i;:::-;547:30771;-1:-1:-1;;;;;547:30771:9;;;;;;22430:12;547:30771;;22411:15;;;;;:31;;22408:358;22411:31;;;22495:11;;;;;22470:63;22495:11;;;22471:42;22495:11;22470:72;22495:11;22462:80;22495:11;;:::i;:::-;547:30771;22236:1;547:30771;;;;;;22236:1;547:30771;;;;22411:15;22471:42;:::i;22462:80::-;22408:358;;22780:431;;;;;;22824:11;;;;;;;;;:::i;:::-;547:30771;22236:1;547:30771;;;22236:1;547:30771;;;;;;;;;22854:20;547:30771;;;;;;;;;;;;1744:1:2;22188:10:9;22236:1;547:30771;22892:13;547:30771;;10906:35:8;547:30771:9;22236:1;547:30771;22925:11;;;;;;;:::i;:::-;547:30771;10906:35:8;;:::i;:::-;;22955:7:9;547:30771;;23003:11;;;;;;:::i;:::-;22955:60;;;;;;;22236:1;547:30771;;;;;;22955:60;;;;;;-1:-1:-1;;;;;22955:60:9;;22188:10;22984:4;22955:60;;;;:::i;:::-;;;;;;;;;;23229:40;22955:60;22285:3;22955:60;;;;;;22780:431;23064:11;;;;;;;:::i;:::-;547:30771;;;23077:12;;547:30771;;22411:15;547:30771;;;;;22188:10;23038:69;22188:10;;23038:69;;22780:431;23242:11;;;;;;:::i;:::-;547:30771;;;;;;;;;;23229:40;;22285:3;:::i;:::-;22252:10;;22955:60;;;;:::i;:::-;;;;;547:30771;;;22236:1;547:30771;;;;;22780:431;23229:40;23152:11;;;;;;;23146:50;23152:11;;22285:3;23152:11;;;;;;:::i;:::-;547:30771;22236:1;547:30771;;;22411:15;547:30771;;22236:1;547:30771;23146:50;:::i;:::-;22780:431;;22408:358;22573:11;;;;;;;;;;;;;;;;:::i;:::-;547:30771;22236:1;547:30771;;;;;;;;;22236:1;547:30771;;;;22567:39;22563:203;22567:39;;;22656:11;22635:39;22656:11;22634:69;22656:11;;;;;;;22634:60;22656:11;;22626:77;22656:11;;;;:::i;:::-;547:30771;22236:1;547:30771;;;22236:1;547:30771;;;;22635:39;;:::i;:::-;22678:16;547:30771;;;22634:60;:::i;22626:77::-;22563:203;22408:358;;22563:203;22742:9;;;;;;;;;22563:203;22408:358;;24574:406;547:30771;24654:15;547:30771;;;;;;;24685:11;547:30771;;;;24709:1;547:30771;;;;;;24685:25;24681:293;24709:1;;;547:30771;;;24733:5;547:30771;;-1:-1:-1;;;;;;;;547:30771:9;;;;;;;;;24733:29;24726:36;:::o;24681:293::-;547:30771;;;;;;24807:1;24783:25;24807:1;;547:30771;;;24831:6;547:30771;;-1:-1:-1;;;;;;;;547:30771:9;;;;;;;;;24831:30;24824:37;:::o;24779:195::-;547:30771;;;;;;24685:11;547:30771;;;;;;24882:25;24878:96;;24779:195;;;24574:406::o;24878:96::-;24930:9;547:30771;;;;-1:-1:-1;;;547:30771:9;;-1:-1:-1;;;;;547:30771:9;;;;;24930:33;;-1:-1:-1;24923:40:9:o;25214:526::-;547:30771;;-1:-1:-1;547:30771:9;;;;25302:5;547:30771;;-1:-1:-1;;;;;547:30771:9;;;;;;;;;;;25302:24;;25299:435;547:30771;;;25364:12;547:30771;;;25345:15;:31;-1:-1:-1;25345:31:9;;547:30771;;25404:38;547:30771;;;25403:59;547:30771;25403:68;547:30771;;25302:5;547:30771;;;;;;25345:15;25404:38;:::i;25342:343::-;547:30771;;;;;;;;;;;;25496:35;25492:193;25496:35;;;547:30771;;25558:56;547:30771;25559:35;547:30771;;25558:65;547:30771;;;;;25559:35;;:::i;25492:193::-;25662:8;;;;:::o;25746:864::-;25845:1;547:30771;25845:1;547:30771;;;;;;;25860:11;547:30771;;;;25884:1;547:30771;;;;;;25860:25;:53;;;25746:864;25856:727;;;-1:-1:-1;25951:12:9;547:30771;-1:-1:-1;;;;;547:30771:9;;;;25932:15;:31;-1:-1:-1;25932:31:9;;547:30771;25991:38;547:30771;;26009:5;25990:59;547:30771;;;;25990:68;547:30771;;;;;;;25932:15;25991:38;:::i;25929:343::-;547:30771;;26083:5;547:30771;;;;;;;;;;;;;;;26083:35;26079:193;26083:35;;;547:30771;;26146:35;547:30771;26145:56;547:30771;;26145:65;547:30771;;;;;26146:35;;:::i;25856:727::-;25860:11;547:30771;;;;26316:1;547:30771;;;;;;26292:25;:64;;;25856:727;26288:295;;;547:30771;-1:-1:-1;;;;;547:30771:9;;;26396:6;26379:38;547:30771;26379:14;547:30771;;;;;;;;;26379:38;;:::i;26288:295::-;547:30771;;;25860:11;547:30771;;25860:11;547:30771;;;;;;26438:25;:67;;;26288:295;26434:149;;26288:295;;;25746:864;:::o;26434:149::-;26528:44;547:30771;;-1:-1:-1;;;;;547:30771:9;;;26548:9;26528:17;547:30771;;;;;;;26528:44;;:::i;26438:67::-;547:30771;26467:9;547:30771;;-1:-1:-1;;;;;;;;547:30771:9;;;;;;26467:38;;26438:67;;26292:64;547:30771;26321:6;547:30771;;-1:-1:-1;;;;;;;;547:30771:9;;;;;;26321:35;;26292:64;;25860:53;547:30771;25889:5;547:30771;;-1:-1:-1;;;;;547:30771:9;;;;;;;25889:24;;25860:53;;29162:280;29249:9;547:30771;29249:23;;;29245:73;;29352:10;29345:17;;;547:30771;;;;;;;;;;-1:-1:-1;547:30771:9;29401:6;547:30771;;-1:-1:-1;;;;;;;;547:30771:9;-1:-1:-1;547:30771:9;;;;29162:280;:::o;29245:73::-;29288:19;;-1:-1:-1;29288:19:9;:::o
Swarm Source
ipfs://21f0627286d8b1e760d275d2b43132ee9948bfa7a0fdc73fbbf7b018bbec0d3a
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $2,403.17 | 0.126 | $302.8 |
Loading...
Loading
[ Download: CSV Export ]
[ 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.