More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 2,215 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Buy | 15514526 | 808 days ago | IN | 0.0018 ETH | 0.0059928 | ||||
List Item | 15249364 | 850 days ago | IN | 0 ETH | 0.0005121 | ||||
List Item | 15249364 | 850 days ago | IN | 0 ETH | 0.00042301 | ||||
List Item | 15224568 | 854 days ago | IN | 0 ETH | 0.00072324 | ||||
List Item | 15224566 | 854 days ago | IN | 0 ETH | 0.00078634 | ||||
Confirm Dividend... | 13165917 | 1179 days ago | IN | 0 ETH | 0.0018619 | ||||
Confirm Dividend... | 13165917 | 1179 days ago | IN | 0 ETH | 0.00555722 | ||||
Buy | 13012004 | 1202 days ago | IN | 0.28589 ETH | 0.06953701 | ||||
Buy | 12754629 | 1243 days ago | IN | 0.00709 ETH | 0.00694141 | ||||
Withdraw | 12715506 | 1249 days ago | IN | 0 ETH | 0.00585623 | ||||
Confirm Dividend... | 12715490 | 1249 days ago | IN | 0 ETH | 0.00093033 | ||||
Confirm Dividend... | 12554934 | 1274 days ago | IN | 0 ETH | 0.0014327 | ||||
List Item | 12553469 | 1274 days ago | IN | 0 ETH | 0.00208183 | ||||
Confirm Dividend... | 11732167 | 1400 days ago | IN | 0 ETH | 0.00644803 | ||||
Confirm Dividend... | 11535891 | 1431 days ago | IN | 0 ETH | 0.0088233 | ||||
Confirm Dividend... | 11427978 | 1447 days ago | IN | 0 ETH | 0.00241869 | ||||
Buy | 11427955 | 1447 days ago | IN | 0.1738 ETH | 0.04197306 | ||||
Confirm Dividend... | 11332636 | 1462 days ago | IN | 0 ETH | 0.00465455 | ||||
Withdraw | 11275029 | 1471 days ago | IN | 0 ETH | 0.0220356 | ||||
Confirm Dividend... | 11255592 | 1474 days ago | IN | 0 ETH | 0.00118839 | ||||
Withdraw | 11235147 | 1477 days ago | IN | 0 ETH | 0.01762848 | ||||
Confirm Dividend... | 11184445 | 1485 days ago | IN | 0 ETH | 0.00287195 | ||||
Confirm Dividend... | 11120407 | 1494 days ago | IN | 0 ETH | 0.00158452 | ||||
Withdraw | 11120391 | 1494 days ago | IN | 0 ETH | 0.0165267 | ||||
Confirm Dividend... | 10874708 | 1532 days ago | IN | 0 ETH | 0.00693231 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
15514526 | 808 days ago | 0.000005 ETH | ||||
15514526 | 808 days ago | 0.00008975 ETH | ||||
15514526 | 808 days ago | 0.00110841 ETH | ||||
13012004 | 1202 days ago | 0.00028814 ETH | ||||
13012004 | 1202 days ago | 0.01142407 ETH | ||||
13012004 | 1202 days ago | 0.23819194 ETH | ||||
12754629 | 1243 days ago | 0.000035 ETH | ||||
12754629 | 1243 days ago | 0.00035275 ETH | ||||
12754629 | 1243 days ago | 0.00435646 ETH | ||||
12715506 | 1249 days ago | 0.04882309 ETH | ||||
11427955 | 1447 days ago | 0.00017426 ETH | ||||
11427955 | 1447 days ago | 0.00694502 ETH | ||||
11427955 | 1447 days ago | 0.14480385 ETH | ||||
11275029 | 1471 days ago | 0.05780517 ETH | ||||
11235147 | 1477 days ago | 0.07707356 ETH | ||||
11120391 | 1494 days ago | 0.10276475 ETH | ||||
10744491 | 1552 days ago | 0.00003315 ETH | ||||
10744491 | 1552 days ago | 0.00177684 ETH | ||||
10744491 | 1552 days ago | 0.027852 ETH | ||||
10661214 | 1565 days ago | 0.2025755 ETH | ||||
10617043 | 1572 days ago | 0.2025755 ETH | ||||
10562282 | 1580 days ago | 0.40515101 ETH | ||||
10560772 | 1581 days ago | 0.40515101 ETH | ||||
10518267 | 1587 days ago | 0.81030203 ETH | ||||
10509417 | 1589 days ago | 0.81030203 ETH |
Loading...
Loading
Contract Name:
SuperCountriesEth
Compiler Version
v0.4.24+commit.e67f0147
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2018-06-07 */ pragma solidity ^0.4.24; /* ███████╗██╗ ██╗██████╗ ███████╗██████╗ ██╔════╝██║ ██║██╔══██╗██╔════╝██╔══██╗ ███████╗██║ ██║██████╔╝█████╗ ██████╔╝ ╚════██║██║ ██║██╔═══╝ ██╔══╝ ██╔══██╗ ███████║╚██████╔╝██║ ███████╗██║ ██║ ╚══════╝ ╚═════╝ ╚═╝ ╚══════╝╚═╝ ╚═╝ ██████╗ ██████╗ ██╗ ██╗███╗ ██╗████████╗██████╗ ██╗███████╗███████╗ ██╔════╝██╔═══██╗██║ ██║████╗ ██║╚══██╔══╝██╔══██╗██║██╔════╝██╔════╝ ██║ ██║ ██║██║ ██║██╔██╗ ██║ ██║ ██████╔╝██║█████╗ ███████╗ ██║ ██║ ██║██║ ██║██║╚██╗██║ ██║ ██╔══██╗██║██╔══╝ ╚════██║ ╚██████╗╚██████╔╝╚██████╔╝██║ ╚████║ ██║ ██║ ██║██║███████╗███████║ ╚═════╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝ ╚═╝╚═╝╚══════╝╚══════╝ © 2018 SuperCountries 所有权 - 4CE434B6058EC7C24889EC2512734B5DBA26E39891C09DF50C3CE3191CE9C51E Xuxuxu - LB - Xufo */ library SafeMath { /** * @dev Multiplies two numbers, throws on overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; assert(c / a == b); return c; } /** * @dev Integer division of two numbers, truncating the quotient. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { // assert(b > 0); // Solidity automatically throws when dividing by 0 uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend). */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { assert(b <= a); return a - b; } /** * @dev Adds two numbers, throws on overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; assert(c >= a); return c; } } contract SuperCountriesEth { using SafeMath for uint256; //////////////////////////// /// CONSTRUCTOR /// //////////////////////////// constructor () public { owner = msg.sender; } address public owner; /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner == msg.sender); _; } /** * @dev Allows the current owner to transfer control of the contract to a newOwner. * @param newOwner The address to transfer ownership to. */ function transferOwnership(address newOwner) public onlyOwner { require(newOwner != address(0)); emit OwnershipTransferred(owner, newOwner); owner = newOwner; } event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); //////////////////////// /// EVENTS /// //////////////////////// event Bought (uint256 indexed _itemId, address indexed _owner, uint256 _price); event Sold (uint256 indexed _itemId, address indexed _owner, uint256 _price); event Transfer(address indexed _from, address indexed _to, uint256 _tokenId); event Approval(address indexed _owner, address indexed _approved, uint256 _tokenId); event SetReferrerEvent(address indexed referral, address indexed referrer); event PayReferrerEvent(address indexed oldOwner, address indexed referrer1, address indexed referrer2, uint256 referralPart); event BonusConstant(uint256 bonusToDispatch_, uint256 bonusDispatched_, uint256 notYetDispatched_, uint256 indexed _itemSoldId_, uint256 kBonus, uint256 indexed countryScore); event BonusDispatch(uint256 bonusToGet_, uint256 indexed playerScoreForThisCountry_, address indexed player_, uint256 pendingBalanceTotal_, uint256 indexed _itemSoldId); event DivsDispatch(uint256 dividendsCut_, uint256 dividendsScore, uint256 indexed _itemId, uint256 price, uint256 worldScore_); event newRichest(address indexed richest_, uint256 richestScore_, uint256 indexed blocktimestamp_, uint256 indexed blocknumber_); event Withdrawal(address indexed playerAddress, uint256 indexed ethereumWithdrawn, uint256 indexed potVersion_); event ConfirmWithdraw(address indexed playerAddress, uint256 refbonus_, uint256 divs_, uint256 totalPending_, uint256 playerSc_, uint256 _handicap_); event ConfirmPotWithdraw(uint256 contractBalance, address indexed richest_, uint256 richestBalance_, address indexed lastBuyer_, uint256 lastBalance_, uint256 indexed potVersion); event PotWithdrawConstant(uint256 indexed blocktimestamp_, uint256 indexed timestamplimit_, uint256 dividendsScore_, uint256 indexed potVersion, uint256 lastWithdrawPotVersion_); event WithdrawOwner(uint256 indexed potVersion, uint256 indexed lastWithdrawPotVersion_, uint256 indexed balance_); /////////////////////////////////////////// /// VARIABLES, MAPPINGS, STRUCTS /// /////////////////////////////////////////// bool private erc721Enabled = false; /// Price increase limits uint256 private increaseLimit1 = 0.04 ether; uint256 private increaseLimit2 = 0.6 ether; uint256 private increaseLimit3 = 2.5 ether; uint256 private increaseLimit4 = 7.0 ether; /// All countries uint256[] private listedItems; mapping (uint256 => address) private ownerOfItem; mapping (uint256 => uint256) private priceOfItem; mapping (uint256 => uint256) private previousPriceOfItem; mapping (uint256 => address) private approvedOfItem; /// Referrals and their referrers mapping(address => address) public referrerOf; /// Dividends and score uint256 private worldScore ; /// Worldscore = cumulated price of all owned countries + all spent ethers in this game mapping (address => uint256) private playerScore; /// For each player, the sum of each owned country + the sum of all spent ethers since the beginning of the game uint256 private dividendsScore ; /// Balance of dividends divided by the worldScore mapping(uint256 => mapping(address => uint256)) private pendingBalance; /// Divs from referrals, bonus and dividends calculated after the playerScore change ; if the playerScore didn't change recently, there are some pending divs that can be calculated using dividendsScore and playerScore. The first mapping (uint256) is the jackpot version to use, the value goes up after each pot distribution and the previous pendingBalance are reseted. mapping(uint256 => mapping(address => uint256)) private handicap; /// a player cannot claim a % of all dividends but a % of the cumulated dividends after his join date, this is a handicap mapping(uint256 => mapping(address => uint256)) private balanceToWithdraw; /// A player cannot withdraw pending divs, he must request a withdraw first (pending divs move to balanceToWithdraw) then withdraw. uint256 private potVersion = 1; /// Number of jackpots uint256 private lastWithdrawPotVersion = 1; /// Latest withdraw in the game (pot version) address private richestBuyer ; /// current player with the highest PlayerScore address private lastBuyer ; /// current latest buyer in the game uint256 private timestampLimit = 1528108990; /// after this timestamp, the richestBuyer and the lastBuyer will be allowed to withdraw 1/2 of the contract balance (1/4 each) struct CountryStruct { address[] itemToAddressArray; /// addresses that owned the same country uint256 priceHistory; /// cumulated price of the country uint256 startingPrice; /// starting price of the country } mapping (uint256 => CountryStruct) public countryStructs; mapping (uint256 => mapping(address => uint256)) private itemHistory; /// Store price history (cumulated) for each address for each country uint256 private HUGE = 1e13; //////////////////////////////// /// USEFUL MODIFIER /// //////////////////////////////// modifier onlyRealAddress() { require(msg.sender != address(0)); _; } //////////////////////////////// /// ERC721 PRIVILEGES /// //////////////////////////////// modifier onlyERC721() { require(erc721Enabled); _; } /** * @dev Unlocks ERC721 behaviour, allowing for trading on third party platforms. */ function enableERC721 () onlyOwner() public { erc721Enabled = true; } /////////////////////////////////// /// LISTING NEW COUNTRIES /// /////////////////////////////////// function listMultipleItems (uint256[] _itemIds, uint256 _price, address _owner) onlyOwner() external { for (uint256 i = 0; i < _itemIds.length; i++) { listItem(_itemIds[i], _price, _owner); } } function listItem (uint256 _itemId, uint256 _price, address _owner) onlyOwner() public { require(_price > 0); require(priceOfItem[_itemId] == 0); require(ownerOfItem[_itemId] == address(0)); ownerOfItem[_itemId] = _owner; priceOfItem[_itemId] = _price; previousPriceOfItem[_itemId] = 0; listedItems.push(_itemId); newEntity(_itemId, _price); } /** * @dev Creates new Struct for a country each time a new country is listed. */ function newEntity(uint256 countryId, uint256 startPrice) private returns(bool success) { countryStructs[countryId].startingPrice = startPrice; return true; } /** * @dev Update the Struc each time a country is sold. * Push the newOwner, update the price history */ function updateEntity(uint256 countryId, address newOwner, uint256 priceUpdate) internal { countryStructs[countryId].priceHistory += priceUpdate; if (itemHistory[countryId][newOwner] == 0 ){ countryStructs[countryId].itemToAddressArray.push(newOwner); } } /////////////////////// /// CALCULATE PRICE /// /////////////////////// function calculateNextPrice (uint256 _price) public view returns (uint256 _nextPrice) { if (_price < increaseLimit1) { return _price.mul(200).div(95); } else if (_price < increaseLimit2) { return _price.mul(160).div(96); } else if (_price < increaseLimit3) { return _price.mul(148).div(97); } else if (_price < increaseLimit4) { return _price.mul(136).div(97); } else { return _price.mul(124).div(98); } } function calculateDevCut (uint256 _price) public view returns (uint256 _devCut) { if (_price < increaseLimit1) { return _price.mul(5).div(100); // 5% } else if (_price < increaseLimit2) { return _price.mul(4).div(100); // 4% } else if (_price < increaseLimit4) { return _price.mul(3).div(100); // 3% } else { return _price.mul(2).div(100); // 2% } } ////////////////////////////// /// BALANCES & WITHDRAWALS /// ////////////////////////////// function getBalance(address _playerAddress) public view returns(uint256 pendingRefBonus_, uint256 pendingFromScore_, uint256 totalPending_, uint256 balanceReadyToWithdraw_, uint256 playerScore_, uint256 handicap_, uint256 dividendsScore_) { uint256 refbonus = pendingBalance[potVersion][_playerAddress]; uint256 playerSc = playerScore[_playerAddress]; uint256 playerHandicap = handicap[potVersion][_playerAddress]; uint256 divs = playerSc.mul(dividendsScore.sub(playerHandicap)).div(HUGE); uint256 totalPending = refbonus.add(divs); uint256 ready = balanceToWithdraw[potVersion][_playerAddress]; return (refbonus, divs, totalPending, ready, playerSc, playerHandicap, dividendsScore); } function getOldBalance(uint256 _potVersion, address _playerAddress) public view returns(uint256 oldPendingRefBonus_, uint256 oldHandicap_, uint256 oldReadyToWithdraw_) { uint256 oldRefBonus = pendingBalance[_potVersion][_playerAddress]; uint256 oldPlayerHandicap = handicap[_potVersion][_playerAddress]; uint256 oldReady = balanceToWithdraw[_potVersion][_playerAddress]; return (oldRefBonus, oldPlayerHandicap, oldReady); } /** * @dev First step to withdraw : players must confirm their pending Divs before withdrawing * this function sums the pending balances (pendingDividends and the pending divs from playerScore) * Then this sum moves to balanceReadyToWithdraw, the player can call the next function and withdraw divs */ function confirmDividends() public onlyRealAddress { require(playerScore[msg.sender] > 0);/// the player exists require (dividendsScore >= handicap[potVersion][msg.sender]); require (dividendsScore >= 0); address _playerAddress = msg.sender; uint256 playerSc = playerScore[_playerAddress]; uint256 handicap_ = handicap[potVersion][_playerAddress]; uint256 refbonus = pendingBalance[potVersion][_playerAddress]; uint256 divs = playerSc.mul(dividendsScore.sub(handicap_)).div(HUGE); uint256 totalPending = refbonus.add(divs); /// Reset the values pendingBalance[potVersion][_playerAddress] = 0; /// Reset the pending balance handicap[potVersion][_playerAddress] = dividendsScore; /// Now the player is ready to withdraw /// balanceToWithdraw[potVersion][_playerAddress] += totalPending; // fire event emit ConfirmWithdraw(_playerAddress, refbonus, divs, totalPending, playerSc, handicap_); } /** * @dev Second step to withdraw : after confirming divs, players can withdraw divs to their wallet */ function withdraw() public onlyRealAddress { require(balanceOf(msg.sender) > 0); require(balanceToWithdraw[potVersion][msg.sender] > 0); address _playerAddress = msg.sender; if (lastWithdrawPotVersion != potVersion){ lastWithdrawPotVersion = potVersion; } /// Add referrals earnings, bonus and divs uint256 divToTransfer = balanceToWithdraw[potVersion][_playerAddress]; balanceToWithdraw[potVersion][_playerAddress] = 0; _playerAddress.transfer(divToTransfer); /// fire event emit Withdrawal(_playerAddress, divToTransfer, potVersion); } /** * @dev After 7 days without any buy, the richest user and the latest player will share the contract balance ! */ function confirmDividendsFromPot() public { require(richestBuyer != address(0) && lastBuyer != address(0)) ; require(address(this).balance > 100000000); /// mini 1e8 wei require(block.timestamp > timestampLimit); uint256 confirmation_TimeStamp = timestampLimit; potVersion ++; uint256 balance = address(this).balance; uint256 balanceQuarter = balance.div(4); dividendsScore = 0; /// reset dividends updateTimestampLimit(); /// Reset the timer, if no new buys, the richest and the last buyers will be able to withdraw the left quarter in a week or so balanceToWithdraw[potVersion][richestBuyer] = balanceQuarter; balanceToWithdraw[potVersion][lastBuyer] += balanceQuarter; /// if the richest = last, dividends cumulate // fire events emit ConfirmPotWithdraw( balance, richestBuyer, balanceToWithdraw[potVersion][richestBuyer], lastBuyer, balanceToWithdraw[potVersion][lastBuyer], potVersion ); emit PotWithdrawConstant( block.timestamp, confirmation_TimeStamp, dividendsScore, potVersion, lastWithdrawPotVersion ); } /** * @dev If no new buys occur (dividendsScore = 0) and the richest and latest players don't withdraw their dividends after 3 jackpots, the game can be stuck forever * Prevent from jackpot vicious circle : same dividends are shared between latest and richest users again and again * If the richest and/or the latest player withdraw(s) at least once between 3 jackpots, it means the game is alive * Or if contract balance drops down to 1e8 wei (that means many successful jackpots and that a current withdrawal could cost too much gas for players) */ function withdrawAll() public onlyOwner { require((potVersion > lastWithdrawPotVersion.add(3) && dividendsScore == 0) || (address(this).balance < 100000001) ); require (address(this).balance >0); potVersion ++; updateTimestampLimit(); uint256 balance = address(this).balance; owner.transfer(balance); // fire event emit WithdrawOwner(potVersion, lastWithdrawPotVersion, balance); } /////////////////////////////////////// /// REFERRERS - Setting and payment /// /////////////////////////////////////// /** * @dev Get the referrer of a player. * @param player The address of the player to get the referrer of. */ function getReferrerOf(address player) public view returns (address) { return referrerOf[player]; } /** * @dev Set a referrer. * @param newReferral The address to set the referrer for. * @param referrer The address of the referrer to set. * The referrer must own at least one country to keep his reflink active * Referrals got with an active link are forever, even if all the referrer's countries are sold */ function setReferrer(address newReferral, address referrer) internal { if (getReferrerOf(newReferral) == address(0x0) && newReferral != referrer && balanceOf(referrer) > 0 && playerScore[newReferral] == 0) { /// Set the referrer, if no referrer has been set yet, and the player /// and referrer are not the same address. referrerOf[newReferral] = referrer; /// Emit event. emit SetReferrerEvent(newReferral, referrer); } } /** * @dev Dispatch the referrer bonus when a country is sold * @param referralDivToPay which dividends percentage will be dispatched to refererrs : 0 if no referrer, 2.5% if 1 referrer, 5% if 2 */ function payReferrer (address _oldOwner, uint256 _netProfit) internal returns (uint256 referralDivToPay) { address referrer_1 = referrerOf[_oldOwner]; if (referrer_1 != 0x0) { referralDivToPay = _netProfit.mul(25).div(1000); pendingBalance[potVersion][referrer_1] += referralDivToPay; /// 2.5% for the first referrer address referrer_2 = referrerOf[referrer_1]; if (referrer_2 != 0x0) { pendingBalance[potVersion][referrer_2] += referralDivToPay; /// 2.5% for the 2nd referrer referralDivToPay += referralDivToPay; } } emit PayReferrerEvent(_oldOwner, referrer_1, referrer_2, referralDivToPay); return referralDivToPay; } /////////////////////////////////// /// INTERNAL FUNCTIONS WHEN BUY /// /////////////////////////////////// /** * @dev Dispatch dividends to former owners of a country */ function bonusPreviousOwner(uint256 _itemSoldId, uint256 _paidPrice, uint256 _bonusToDispatch) private { require(_bonusToDispatch < (_paidPrice.mul(5).div(100))); require(countryStructs[_itemSoldId].priceHistory > 0); CountryStruct storage c = countryStructs[_itemSoldId]; uint256 countryScore = c.priceHistory; uint256 kBonus = _bonusToDispatch.mul(HUGE).div(countryScore); uint256 bonusDispatched = 0; for (uint256 i = 0; i < c.itemToAddressArray.length && bonusDispatched < _bonusToDispatch ; i++) { address listedBonusPlayer = c.itemToAddressArray[i]; uint256 playerBonusScore = itemHistory[_itemSoldId][listedBonusPlayer]; uint256 bonusToGet = playerBonusScore.mul(kBonus).div(HUGE); if (bonusDispatched.add(bonusToGet) <= _bonusToDispatch) { pendingBalance[potVersion][listedBonusPlayer] += bonusToGet; bonusDispatched += bonusToGet; emitInfo(bonusToGet, playerBonusScore, listedBonusPlayer, pendingBalance[potVersion][listedBonusPlayer], _itemSoldId); } } emit BonusConstant(_bonusToDispatch, bonusDispatched, _bonusToDispatch.sub(bonusDispatched), _itemSoldId, kBonus, countryScore); } function emitInfo(uint256 dividendsToG_, uint256 playerSc_, address player_, uint256 divsBalance_, uint256 itemId_) private { emit BonusDispatch(dividendsToG_, playerSc_, player_, divsBalance_, itemId_); } /** * @dev we need to update the oldOwner and newOwner balances each time a country is sold, their handicap and playerscore will also change * Worldscore and dividendscore : we don't care, it will be updated later. * If accurate, set a new richest player */ function updateScoreAndBalance(uint256 _paidPrice, uint256 _itemId, address _oldOwner, address _newOwner) internal { uint256 _previousPaidPrice = previousPriceOfItem[_itemId]; assert (_paidPrice > _previousPaidPrice); /// OLD OWNER /// uint256 scoreSubHandicap = dividendsScore.sub(handicap[potVersion][_oldOwner]); uint256 playerScore_ = playerScore[_oldOwner]; /// If the old owner is the owner of this contract, we skip this part, the owner of the contract won't get dividends if (_oldOwner != owner && scoreSubHandicap >= 0 && playerScore_ > _previousPaidPrice) { pendingBalance[potVersion][_oldOwner] += playerScore_.mul(scoreSubHandicap).div(HUGE); playerScore[_oldOwner] -= _previousPaidPrice; ///for the oldOwner, the playerScore goes down the previous price handicap[potVersion][_oldOwner] = dividendsScore; /// and setting his handicap to dividendsScore after updating his balance } /// NEW OWNER /// scoreSubHandicap = dividendsScore.sub(handicap[potVersion][_newOwner]); /// Rewrite the var with the newOwner values playerScore_ = playerScore[_newOwner]; /// Rewrite the var playerScore with the newOwner PlayerScore /// If new player, his playerscore = 0, handicap = 0, so the pendingBalance math = 0 if (scoreSubHandicap >= 0) { pendingBalance[potVersion][_newOwner] += playerScore_.mul(scoreSubHandicap).div(HUGE); playerScore[_newOwner] += _paidPrice.mul(2); ///for the newOwner, the playerScore goes up twice the value of the purchase price handicap[potVersion][_newOwner] = dividendsScore; /// and setting his handicap to dividendsScore after updating his balance } /// Change the richest user if this is the case... if (playerScore[_newOwner] > playerScore[richestBuyer]) { richestBuyer = _newOwner; emit newRichest(_newOwner, playerScore[_newOwner], block.timestamp, block.number); } /// Change the last Buyer in any case lastBuyer = _newOwner; } /** * @dev Update the worldScore * After each buy, the worldscore increases : 2x current purchase price - 1x previousPrice */ function updateWorldScore(uint256 _countryId, uint256 _price) internal { worldScore += _price.mul(2).sub(previousPriceOfItem[_countryId]); } /** * @dev Update timestampLimit : the date on which the richest player and the last buyer will be able to share the contract balance (1/4 each) */ function updateTimestampLimit() internal { timestampLimit = block.timestamp.add(604800).add(potVersion.mul(28800)); /// add 7 days + (pot version * X 8hrs) } /** * @dev Refund the buyer if excess */ function excessRefund(address _newOwner, uint256 _price) internal { uint256 excess = msg.value.sub(_price); if (excess > 0) { _newOwner.transfer(excess); } } /////////////////////////// /// BUY A COUNTRY /// /////////////////////////// /* Buy a country directly from the contract for the calculated price which ensures that the owner gets a profit. All countries that have been listed can be bought by this method. User funds are sent directly to the previous owner and are never stored in the contract. */ function buy (uint256 _itemId, address referrerAddress) payable public onlyRealAddress { require(priceOf(_itemId) > 0); require(ownerOf(_itemId) != address(0)); require(msg.value >= priceOf(_itemId)); require(ownerOf(_itemId) != msg.sender); require(!isContract(msg.sender)); require(msg.sender != owner); require(block.timestamp < timestampLimit || block.timestamp > timestampLimit.add(3600)); address oldOwner = ownerOf(_itemId); address newOwner = msg.sender; uint256 price = priceOf(_itemId); //////////////////////// /// Set the referrer /// //////////////////////// setReferrer(newOwner, referrerAddress); /////////////////////////////////// /// Update scores and timestamp /// /////////////////////////////////// /// Dividends are dispatched among players accordingly to their "playerScore". /// The playerScore equals the sum of all their countries (owned now, paid price) + sum of all their previously owned countries /// After each sell / buy, players that owned at least one country can claim dividends /// DIVS of a player = playerScore * DIVS to dispatch / worldScore /// If a player is a seller or a buyer, his playerScore will change, we need to adjust his parameters /// If a player is not a buyer / seller, his playerScore doesn't change, no need to adjust updateScoreAndBalance(price, _itemId, oldOwner, newOwner); /// worldScore change after each flip, we need to adjust /// To calculate the worldScore after a flip: add buy price x 2, subtract previous price updateWorldScore(_itemId, price); /// If 7 days with no buys, the richest player and the last buyer win the jackpot (1/2 of contract balance ; 1/4 each) /// Waiting time increases after each pot distribution updateTimestampLimit(); /////////////////////// /// Who earns what? /// /////////////////////// /// When a country flips, who earns how much? /// Devs : 2% to 5% of country price /// Seller's reward : current paidPrice - previousPrice - devsCut = net profit. The seller gets the previous Price + ca.65% of net Profit /// The referrers of the seller : % of netProfit from their referrals R+1 & R+2. If no referrers, all the referrers' cut goes to dividends to all players. /// All players, with or without a country now : dividends (% of netProfit) /// All previous owners of the flipped country : a special part of dividends called Bonus. If no previous buyer, all the bonus is also added up to dividends to all players. /// Calculate the devs cut uint256 devCut_ = calculateDevCut(price); /// Calculate the netProfit uint256 netProfit = price.sub(devCut_).sub(previousPriceOfItem[_itemId]); /// Calculate dividends cut from netProfit and what referrers left uint256 dividendsCut_ = netProfit.mul(30).div(100); /// Calculate the seller's reward /// Price sub the cuts : dev cut and 35% including referrer cut (5% max), 30% (25% if referrers) dividends (including 80% divs / 20% bonus max) and 5% (jackpot) uint256 oldOwnerReward = price.sub(devCut_).sub(netProfit.mul(35).div(100)); /// Calculate the referrers cut and store the referrer's cut in the referrer's pending balance /// /// Update dividend's cut : 30% max ; 27,5% if 1 referrer ; 25% if 2 referrers uint256 refCut = payReferrer(oldOwner, netProfit); dividendsCut_ -= refCut; //////////////////////////////////////////////////////////// /// Dispatch dividends to all players /// /// Dispatch bonuses to previous owners of this country /// //////////////////////////////////////////////////////////// /// Dividends = 80% to all country owners (previous and current owners, no matter the country) + 20% bonus to previous owners of this country /// If no previous owners, 100% to all countries owners /// Are there previous owners for the current flipped country? if (price > countryStructs[_itemId].startingPrice && dividendsCut_ > 1000000 && worldScore > 0) { /// Yes, there are previous owners, they will get 20% of dividends of this country bonusPreviousOwner(_itemId, price, dividendsCut_.mul(20).div(100)); /// So dividends for all the country owners are 100% - 20% = 80% dividendsCut_ = dividendsCut_.mul(80).div(100); } /// If else... nothing special to do, there are no previous owners, dividends remain 100% /// Dispatch dividends to all country owners, no matter the country /// Note : to avoid floating numbers, we divide a constant called HUGE (1e13) by worldScore, of course we will multiply by HUGE when retrieving if (worldScore > 0) { /// worldScore must be greater than 0, the opposite is impossible and dividends are not calculated dividendsScore += HUGE.mul(dividendsCut_).div(worldScore); } //////////////////////////////////////////////// /// Update the price history of the newOwner /// //////////////////////////////////////////////// /// The newOwner is now known as an OWNER for this country /// We'll store his cumulated buy price for this country in a mapping /// Bonus : each time a country is flipped, players that previously owned this country get bonuses proportionally to the sum of their buys updateEntity(_itemId, newOwner, price); itemHistory[_itemId][newOwner] += price; //////////////////////// /// Update the price /// //////////////////////// /// The price of purchase becomes the "previousPrice", and the "price" is the next price previousPriceOfItem[_itemId] = price; priceOfItem[_itemId] = nextPriceOf(_itemId); ///////////////////////////////////////// /// Transfer the reward to the seller /// ///////////////////////////////////////// /// The seller's reward is transfered automatically to his wallet /// The dev cut is transfered automatically out the contract /// The other rewards (bonus, dividends, referrer's cut) will be stored in a pending balance oldOwner.transfer(oldOwnerReward); owner.transfer(devCut_); /// Transfer the token from oldOwner to newOwner _transfer(oldOwner, newOwner, _itemId); /// Emit the events emit Bought(_itemId, newOwner, price); emit Sold(_itemId, oldOwner, price); /////////////////////////////////////////// /// Transfer the excess to the newOwner /// /////////////////////////////////////////// /// If the newOwner sent a higher price than the asked price, the excess is refunded excessRefund(newOwner, price); /// Send informations emit DivsDispatch(dividendsCut_, dividendsScore, _itemId, price, worldScore); /// END OF THE BUY FUNCTION /// } ////////////////////////////// /// Practical informations /// ////////////////////////////// function itemHistoryOfPlayer(uint256 _itemId, address _owner) public view returns (uint256 _valueAddressOne) { return itemHistory[_itemId][_owner]; } function implementsERC721() public view returns (bool _implements) { return erc721Enabled; } function name() public pure returns (string _name) { return "SuperCountries"; } function symbol() public pure returns (string _symbol) { return "SUP"; } function totalSupply() public view returns (uint256 _totalSupply) { return listedItems.length; } function balanceOf (address _owner) public view returns (uint256 _balance) { uint256 counter = 0; for (uint256 i = 0; i < listedItems.length; i++) { if (ownerOf(listedItems[i]) == _owner) { counter++; } } return counter; } function ownerOf (uint256 _itemId) public view returns (address _owner) { return ownerOfItem[_itemId]; } function tokensOf (address _owner) public view returns (uint256[] _tokenIds) { uint256[] memory items = new uint256[](balanceOf(_owner)); uint256 itemCounter = 0; for (uint256 i = 0; i < listedItems.length; i++) { if (ownerOf(listedItems[i]) == _owner) { items[itemCounter] = listedItems[i]; itemCounter += 1; } } return items; } function tokenExists (uint256 _itemId) public view returns (bool _exists) { return priceOf(_itemId) > 0; } function approvedFor(uint256 _itemId) public view returns (address _approved) { return approvedOfItem[_itemId]; } function approve(address _to, uint256 _itemId) onlyERC721() public { require(msg.sender != _to); require(tokenExists(_itemId)); require(ownerOf(_itemId) == msg.sender); if (_to == 0) { if (approvedOfItem[_itemId] != 0) { delete approvedOfItem[_itemId]; emit Approval(msg.sender, 0, _itemId); } } else { approvedOfItem[_itemId] = _to; emit Approval(msg.sender, _to, _itemId); } } /* Transferring a country to another owner will entitle the new owner the profits from `buy` */ function transfer(address _to, uint256 _itemId) onlyERC721() public { require(msg.sender == ownerOf(_itemId)); _transfer(msg.sender, _to, _itemId); } function transferFrom(address _from, address _to, uint256 _itemId) onlyERC721() public { require(approvedFor(_itemId) == msg.sender); _transfer(_from, _to, _itemId); } function _transfer(address _from, address _to, uint256 _itemId) internal { require(tokenExists(_itemId)); require(ownerOf(_itemId) == _from); require(_to != address(0)); require(_to != address(this)); ownerOfItem[_itemId] = _to; approvedOfItem[_itemId] = 0; emit Transfer(_from, _to, _itemId); } /////////////////////////// /// READ ONLY FUNCTIONS /// /////////////////////////// function gameInfo() public view returns (address richestPlayer_, address lastBuyer_, uint256 thisBalance_, uint256 lastWithdrawPotVersion_, uint256 worldScore_, uint256 potVersion_, uint256 timestampLimit_) { return (richestBuyer, lastBuyer, address(this).balance, lastWithdrawPotVersion, worldScore, potVersion, timestampLimit); } function priceOf(uint256 _itemId) public view returns (uint256 _price) { return priceOfItem[_itemId]; } function nextPriceOf(uint256 _itemId) public view returns (uint256 _nextPrice) { return calculateNextPrice(priceOf(_itemId)); } function allOf(uint256 _itemId) external view returns (address _owner, uint256 _price, uint256 previous_, uint256 _nextPrice) { return (ownerOf(_itemId), priceOf(_itemId), previousPriceOfItem[_itemId], nextPriceOf(_itemId)); } /// is Contract /// function isContract(address addr) internal view returns (bool) { uint size; assembly { size := extcodesize(addr) } // solium-disable-line return size > 0; } //////////////////////// /// USEFUL FUNCTIONS /// //////////////////////// /** * @dev Fallback function to accept all ether sent directly to the contract * Nothing is lost, it will raise the jackpot ! */ function() payable public { } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":true,"inputs":[{"name":"_itemId","type":"uint256"}],"name":"tokenExists","outputs":[{"name":"_exists","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"_name","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_itemId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"implementsERC721","outputs":[{"name":"_implements","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"_totalSupply","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_itemId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_itemId","type":"uint256"}],"name":"approvedFor","outputs":[{"name":"_approved","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_itemId","type":"uint256"}],"name":"allOf","outputs":[{"name":"_owner","type":"address"},{"name":"_price","type":"uint256"},{"name":"previous_","type":"uint256"},{"name":"_nextPrice","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"confirmDividendsFromPot","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_itemId","type":"uint256"},{"name":"_price","type":"uint256"},{"name":"_owner","type":"address"}],"name":"listItem","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"tokensOf","outputs":[{"name":"_tokenIds","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_itemId","type":"uint256"}],"name":"nextPriceOf","outputs":[{"name":"_nextPrice","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_itemId","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"_owner","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_price","type":"uint256"}],"name":"calculateDevCut","outputs":[{"name":"_devCut","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"_balance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"enableERC721","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_itemId","type":"uint256"},{"name":"referrerAddress","type":"address"}],"name":"buy","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[],"name":"withdrawAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_potVersion","type":"uint256"},{"name":"_playerAddress","type":"address"}],"name":"getOldBalance","outputs":[{"name":"oldPendingRefBonus_","type":"uint256"},{"name":"oldHandicap_","type":"uint256"},{"name":"oldReadyToWithdraw_","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_itemId","type":"uint256"},{"name":"_owner","type":"address"}],"name":"itemHistoryOfPlayer","outputs":[{"name":"_valueAddressOne","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"_symbol","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[],"name":"confirmDividends","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_itemId","type":"uint256"}],"name":"transfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_itemId","type":"uint256"}],"name":"priceOf","outputs":[{"name":"_price","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_itemIds","type":"uint256[]"},{"name":"_price","type":"uint256"},{"name":"_owner","type":"address"}],"name":"listMultipleItems","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"player","type":"address"}],"name":"getReferrerOf","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"countryStructs","outputs":[{"name":"priceHistory","type":"uint256"},{"name":"startingPrice","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"referrerOf","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"gameInfo","outputs":[{"name":"richestPlayer_","type":"address"},{"name":"lastBuyer_","type":"address"},{"name":"thisBalance_","type":"uint256"},{"name":"lastWithdrawPotVersion_","type":"uint256"},{"name":"worldScore_","type":"uint256"},{"name":"potVersion_","type":"uint256"},{"name":"timestampLimit_","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_price","type":"uint256"}],"name":"calculateNextPrice","outputs":[{"name":"_nextPrice","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_playerAddress","type":"address"}],"name":"getBalance","outputs":[{"name":"pendingRefBonus_","type":"uint256"},{"name":"pendingFromScore_","type":"uint256"},{"name":"totalPending_","type":"uint256"},{"name":"balanceReadyToWithdraw_","type":"uint256"},{"name":"playerScore_","type":"uint256"},{"name":"handicap_","type":"uint256"},{"name":"dividendsScore_","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_itemId","type":"uint256"},{"indexed":true,"name":"_owner","type":"address"},{"indexed":false,"name":"_price","type":"uint256"}],"name":"Bought","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_itemId","type":"uint256"},{"indexed":true,"name":"_owner","type":"address"},{"indexed":false,"name":"_price","type":"uint256"}],"name":"Sold","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_approved","type":"address"},{"indexed":false,"name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"referral","type":"address"},{"indexed":true,"name":"referrer","type":"address"}],"name":"SetReferrerEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"oldOwner","type":"address"},{"indexed":true,"name":"referrer1","type":"address"},{"indexed":true,"name":"referrer2","type":"address"},{"indexed":false,"name":"referralPart","type":"uint256"}],"name":"PayReferrerEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"bonusToDispatch_","type":"uint256"},{"indexed":false,"name":"bonusDispatched_","type":"uint256"},{"indexed":false,"name":"notYetDispatched_","type":"uint256"},{"indexed":true,"name":"_itemSoldId_","type":"uint256"},{"indexed":false,"name":"kBonus","type":"uint256"},{"indexed":true,"name":"countryScore","type":"uint256"}],"name":"BonusConstant","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"bonusToGet_","type":"uint256"},{"indexed":true,"name":"playerScoreForThisCountry_","type":"uint256"},{"indexed":true,"name":"player_","type":"address"},{"indexed":false,"name":"pendingBalanceTotal_","type":"uint256"},{"indexed":true,"name":"_itemSoldId","type":"uint256"}],"name":"BonusDispatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"dividendsCut_","type":"uint256"},{"indexed":false,"name":"dividendsScore","type":"uint256"},{"indexed":true,"name":"_itemId","type":"uint256"},{"indexed":false,"name":"price","type":"uint256"},{"indexed":false,"name":"worldScore_","type":"uint256"}],"name":"DivsDispatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"richest_","type":"address"},{"indexed":false,"name":"richestScore_","type":"uint256"},{"indexed":true,"name":"blocktimestamp_","type":"uint256"},{"indexed":true,"name":"blocknumber_","type":"uint256"}],"name":"newRichest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"playerAddress","type":"address"},{"indexed":true,"name":"ethereumWithdrawn","type":"uint256"},{"indexed":true,"name":"potVersion_","type":"uint256"}],"name":"Withdrawal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"playerAddress","type":"address"},{"indexed":false,"name":"refbonus_","type":"uint256"},{"indexed":false,"name":"divs_","type":"uint256"},{"indexed":false,"name":"totalPending_","type":"uint256"},{"indexed":false,"name":"playerSc_","type":"uint256"},{"indexed":false,"name":"_handicap_","type":"uint256"}],"name":"ConfirmWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"contractBalance","type":"uint256"},{"indexed":true,"name":"richest_","type":"address"},{"indexed":false,"name":"richestBalance_","type":"uint256"},{"indexed":true,"name":"lastBuyer_","type":"address"},{"indexed":false,"name":"lastBalance_","type":"uint256"},{"indexed":true,"name":"potVersion","type":"uint256"}],"name":"ConfirmPotWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"blocktimestamp_","type":"uint256"},{"indexed":true,"name":"timestamplimit_","type":"uint256"},{"indexed":false,"name":"dividendsScore_","type":"uint256"},{"indexed":true,"name":"potVersion","type":"uint256"},{"indexed":false,"name":"lastWithdrawPotVersion_","type":"uint256"}],"name":"PotWithdrawConstant","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"potVersion","type":"uint256"},{"indexed":true,"name":"lastWithdrawPotVersion_","type":"uint256"},{"indexed":true,"name":"balance_","type":"uint256"}],"name":"WithdrawOwner","type":"event"}]
Contract Creation Code
608060405260008060146101000a81548160ff021916908315150217905550668e1bc9bf040000600155670853a0d2313c00006002556722b1c8c1227a0000600355676124fee993bc000060045560016011556001601255635b1517be6015556509184e72a00060185534801561007557600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061425c806100c56000396000f3006080604052600436106101ab576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168062923f9e146101ad57806306fdde03146101f2578063095ea7b3146102825780631051db34146102cf57806318160ddd146102fe57806323b872dd146103295780632a6dd48f146103965780632e4f43bf146104035780633ccfd60b14610485578063418f14871461049c578063442edd03146104b35780635a3f26721461050a5780635ba9e48e146105a25780636352211e146105e3578063651212051461065057806370a082311461069157806371dc761e146106e85780637deb6025146106ff578063853828b61461073f5780638bda1540146107565780638da5cb5b146107c557806394bb7d641461081c57806395d89b411461087d578063a12077081461090d578063a9059cbb14610924578063b9186d7d14610971578063baddee6f146109b2578063bc7f25e414610a17578063cc2e2e8a14610a9a578063d21cacdf14610ae2578063db73bfce14610b65578063e08503ec14610c12578063f2fde38b14610c53578063f8b2cb4f14610c96575b005b3480156101b957600080fd5b506101d860048036038101908080359060200190929190505050610d17565b604051808215151515815260200191505060405180910390f35b3480156101fe57600080fd5b50610207610d2b565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561024757808201518184015260208101905061022c565b50505050905090810190601f1680156102745780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561028e57600080fd5b506102cd600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610d68565b005b3480156102db57600080fd5b506102e4610fce565b604051808215151515815260200191505060405180910390f35b34801561030a57600080fd5b50610313610fe4565b6040518082815260200191505060405180910390f35b34801561033557600080fd5b50610394600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610ff1565b005b3480156103a257600080fd5b506103c16004803603810190808035906020019092919050505061105e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561040f57600080fd5b5061042e6004803603810190808035906020019092919050505061109b565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200182815260200194505050505060405180910390f35b34801561049157600080fd5b5061049a6110df565b005b3480156104a857600080fd5b506104b16112ef565b005b3480156104bf57600080fd5b506105086004803603810190808035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611728565b005b34801561051657600080fd5b5061054b600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506118e1565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561058e578082015181840152602081019050610573565b505050509050019250505060405180910390f35b3480156105ae57600080fd5b506105cd600480360381019080803590602001909291905050506119e1565b6040518082815260200191505060405180910390f35b3480156105ef57600080fd5b5061060e600480360381019080803590602001909291905050506119fb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561065c57600080fd5b5061067b60048036038101908080359060200190929190505050611a38565b6040518082815260200191505060405180910390f35b34801561069d57600080fd5b506106d2600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b11565b6040518082815260200191505060405180910390f35b3480156106f457600080fd5b506106fd611ba0565b005b61073d60048036038101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c18565b005b34801561074b57600080fd5b506107546121ff565b005b34801561076257600080fd5b506107a160048036038101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506123ac565b60405180848152602001838152602001828152602001935050505060405180910390f35b3480156107d157600080fd5b506107da6124c1565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561082857600080fd5b5061086760048036038101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506124e6565b6040518082815260200191505060405180910390f35b34801561088957600080fd5b50610892612541565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156108d25780820151818401526020810190506108b7565b50505050905090810190601f1680156108ff5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561091957600080fd5b5061092261257e565b005b34801561093057600080fd5b5061096f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061294e565b005b34801561097d57600080fd5b5061099c600480360381019080803590602001909291905050506129ba565b6040518082815260200191505060405180910390f35b3480156109be57600080fd5b50610a1560048036038101908080359060200190820180359060200191909192939192939080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506129d7565b005b348015610a2357600080fd5b50610a58600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612a77565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610aa657600080fd5b50610ac560048036038101908080359060200190929190505050612ae0565b604051808381526020018281526020019250505060405180910390f35b348015610aee57600080fd5b50610b23600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612b04565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610b7157600080fd5b50610b7a612b37565b604051808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200186815260200185815260200184815260200183815260200182815260200197505050505050505060405180910390f35b348015610c1e57600080fd5b50610c3d60048036038101908080359060200190929190505050612bc3565b6040518082815260200191505060405180910390f35b348015610c5f57600080fd5b50610c94600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612cd4565b005b348015610ca257600080fd5b50610cd7600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612e29565b6040518088815260200187815260200186815260200185815260200184815260200183815260200182815260200197505050505050505060405180910390f35b600080610d23836129ba565b119050919050565b60606040805190810160405280600e81526020017f5375706572436f756e7472696573000000000000000000000000000000000000815250905090565b600060149054906101000a900460ff161515610d8357600080fd5b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151515610dbe57600080fd5b610dc781610d17565b1515610dd257600080fd5b3373ffffffffffffffffffffffffffffffffffffffff16610df2826119fb565b73ffffffffffffffffffffffffffffffffffffffff16141515610e1457600080fd5b60008273ffffffffffffffffffffffffffffffffffffffff161415610f125760006009600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515610f0d576009600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560003373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a35b610fca565b816009600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a35b5050565b60008060149054906101000a900460ff16905090565b6000600580549050905090565b600060149054906101000a900460ff16151561100c57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff1661102c8261105e565b73ffffffffffffffffffffffffffffffffffffffff1614151561104e57600080fd5b611059838383612ff8565b505050565b60006009600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000806000806110aa856119fb565b6110b3866129ba565b60086000888152602001908152602001600020546110d0886119e1565b93509350935093509193509193565b600080600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415151561111e57600080fd5b600061112933611b11565b11151561113557600080fd5b600060106000601154815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411151561119657600080fd5b3391506011546012541415156111b0576011546012819055505b60106000601154815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600060106000601154815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156112a3573d6000803e3d6000fd5b50601154818373ffffffffffffffffffffffffffffffffffffffff167fdf273cb619d95419a9cd0ec88123a0538c85064229baa6363788f743fff90deb60405160405180910390a45050565b60008060008073ffffffffffffffffffffffffffffffffffffffff16601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141580156113a15750600073ffffffffffffffffffffffffffffffffffffffff16601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b15156113ac57600080fd5b6305f5e1003073ffffffffffffffffffffffffffffffffffffffff16311115156113d557600080fd5b601554421115156113e557600080fd5b60155492506011600081548092919060010191905055503073ffffffffffffffffffffffffffffffffffffffff1631915061142a6004836131d490919063ffffffff16565b90506000600d8190555061143c6131ef565b806010600060115481526020019081526020016000206000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806010600060115481526020019081526020016000206000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550601154601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f7d52b961c8da712caedc7332724540baef718e9ef738de74e08dafcdfb4d923b856010600060115481526020019081526020016000206000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546010600060115481526020019081526020016000206000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460405180848152602001838152602001828152602001935050505060405180910390a460115483427f47b47b8c7743492a3f458380fb4e05eea566f4535b9d8432c9b37bc12fc8a0d0600d54601254604051808381526020018281526020019250505060405180910390a4505050565b3373ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561178357600080fd5b60008211151561179257600080fd5b600060076000858152602001908152602001600020541415156117b457600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166006600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561182257600080fd5b806006600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160076000858152602001908152602001600020819055506000600860008581526020019081526020016000208190555060058390806001815401808255809150509060018203906000526020600020016000909192909190915055506118db8383613235565b50505050565b6060806000806118f085611b11565b60405190808252806020026020018201604052801561191e5781602001602082028038833980820191505090505b50925060009150600090505b6005805490508110156119d6578473ffffffffffffffffffffffffffffffffffffffff1661197060058381548110151561196057fe5b90600052602060002001546119fb565b73ffffffffffffffffffffffffffffffffffffffff1614156119c95760058181548110151561199b57fe5b906000526020600020015483838151811015156119b457fe5b90602001906020020181815250506001820191505b808060010191505061192a565b829350505050919050565b60006119f46119ef836129ba565b612bc3565b9050919050565b60006006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600154821015611a7257611a6b6064611a5d60058561325c90919063ffffffff16565b6131d490919063ffffffff16565b9050611b0c565b600254821015611aaa57611aa36064611a9560048561325c90919063ffffffff16565b6131d490919063ffffffff16565b9050611b0c565b600454821015611ae257611adb6064611acd60038561325c90919063ffffffff16565b6131d490919063ffffffff16565b9050611b0c565b611b096064611afb60028561325c90919063ffffffff16565b6131d490919063ffffffff16565b90505b919050565b6000806000809150600090505b600580549050811015611b96578373ffffffffffffffffffffffffffffffffffffffff16611b64600583815481101515611b5457fe5b90600052602060002001546119fb565b73ffffffffffffffffffffffffffffffffffffffff161415611b895781806001019250505b8080600101915050611b1e565b8192505050919050565b3373ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515611bfb57600080fd5b6001600060146101000a81548160ff021916908315150217905550565b600080600080600080600080600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151515611c6057600080fd5b6000611c6b8b6129ba565b111515611c7757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16611c988b6119fb565b73ffffffffffffffffffffffffffffffffffffffff1614151515611cbb57600080fd5b611cc48a6129ba565b3410151515611cd257600080fd5b3373ffffffffffffffffffffffffffffffffffffffff16611cf28b6119fb565b73ffffffffffffffffffffffffffffffffffffffff1614151515611d1557600080fd5b611d1e33613297565b151515611d2a57600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151515611d8657600080fd5b601554421080611dab5750611da8610e106015546132aa90919063ffffffff16565b42115b1515611db657600080fd5b611dbf8a6119fb565b9750339650611dcd8a6129ba565b9550611dd9878a6132c8565b611de5868b8a8a613479565b611def8a87613a9d565b611df76131ef565b611e0086611a38565b9450611e3a600860008c815260200190815260200160002054611e2c8789613ae990919063ffffffff16565b613ae990919063ffffffff16565b9350611e636064611e55601e8761325c90919063ffffffff16565b6131d490919063ffffffff16565b9250611eb0611e8f6064611e8160238861325c90919063ffffffff16565b6131d490919063ffffffff16565b611ea28789613ae990919063ffffffff16565b613ae990919063ffffffff16565b9150611ebc8885613b02565b90508083039250601660008b81526020019081526020016000206002015486118015611eea5750620f424083115b8015611ef857506000600b54115b15611f5857611f2e8a87611f296064611f1b60148961325c90919063ffffffff16565b6131d490919063ffffffff16565b613d83565b611f556064611f4760508661325c90919063ffffffff16565b6131d490919063ffffffff16565b92505b6000600b541115611f9c57611f8c600b54611f7e8560185461325c90919063ffffffff16565b6131d490919063ffffffff16565b600d600082825401925050819055505b611fa78a8888614067565b85601760008c815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555085600860008c8152602001908152602001600020819055506120268a6119e1565b600760008c8152602001908152602001600020819055508773ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015612083573d6000803e3d6000fd5b506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc869081150290604051600060405180830381858888f193505050501580156120eb573d6000803e3d6000fd5b506120f788888c612ff8565b8673ffffffffffffffffffffffffffffffffffffffff168a7fd2728f908c7e0feb83c6278798370fcb86b62f236c9dbf1a3f541096c2159040886040518082815260200191505060405180910390a38773ffffffffffffffffffffffffffffffffffffffff168a7f66f5cd880edf48cdde6c966e5da0784fcc4c5e85572b8b3b62c4357798d447d7886040518082815260200191505060405180910390a361219f8787614164565b897fc2d38df9d158fa63a4d22026daa0c1962b6e04743f50d7551dfdc0fe8b4d140484600d5489600b546040518085815260200184815260200183815260200182815260200194505050505060405180910390a250505050505050505050565b60003373ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561225c57600080fd5b61227260036012546132aa90919063ffffffff16565b60115411801561228457506000600d54145b806122a957506305f5e1013073ffffffffffffffffffffffffffffffffffffffff1631105b15156122b457600080fd5b60003073ffffffffffffffffffffffffffffffffffffffff16311115156122da57600080fd5b6011600081548092919060010191905055506122f46131ef565b3073ffffffffffffffffffffffffffffffffffffffff163190506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612375573d6000803e3d6000fd5b50806012546011547f23852d00014f909bc66902f9565357935dbd78450e7e9a46b8caa5accbc8285160405160405180910390a450565b600080600080600080600e600089815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549250600f600089815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205491506010600089815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508282829550955095505050509250925092565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006017600084815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60606040805190810160405280600381526020017f5355500000000000000000000000000000000000000000000000000000000000815250905090565b600080600080600080600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515156125c357600080fd5b6000600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411151561261157600080fd5b600f6000601154815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600d541015151561267457600080fd5b6000600d541015151561268657600080fd5b339550600c60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549450600f6000601154815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549350600e6000601154815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205492506127b06018546127a261279387600d54613ae990919063ffffffff16565b8861325c90919063ffffffff16565b6131d490919063ffffffff16565b91506127c582846132aa90919063ffffffff16565b90506000600e6000601154815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600d54600f6000601154815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508060106000601154815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508573ffffffffffffffffffffffffffffffffffffffff167f4324e1fbcfc75073846dc7188f546ae390ff4c589a22422c75df55c26ed59bdc8484848989604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a2505050505050565b600060149054906101000a900460ff16151561296957600080fd5b612972816119fb565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156129ab57600080fd5b6129b6338383612ff8565b5050565b600060076000838152602001908152602001600020549050919050565b60003373ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515612a3457600080fd5b600090505b84849050811015612a7057612a638585838181101515612a5557fe5b905060200201358484611728565b8080600101915050612a39565b5050505050565b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60166020528060005260406000206000915090508060010154908060020154905082565b600a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000806000806000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1631601254600b54601154601554965096509650965096509650965090919293949596565b6000600154821015612bfd57612bf6605f612be860c88561325c90919063ffffffff16565b6131d490919063ffffffff16565b9050612ccf565b600254821015612c3557612c2e6060612c2060a08561325c90919063ffffffff16565b6131d490919063ffffffff16565b9050612ccf565b600354821015612c6d57612c666061612c5860948561325c90919063ffffffff16565b6131d490919063ffffffff16565b9050612ccf565b600454821015612ca557612c9e6061612c9060888561325c90919063ffffffff16565b6131d490919063ffffffff16565b9050612ccf565b612ccc6062612cbe607c8561325c90919063ffffffff16565b6131d490919063ffffffff16565b90505b919050565b3373ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515612d2f57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515612d6b57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806000806000806000806000806000806000600e6000601154815260200190815260200160002060008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549550600c60008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549450600f6000601154815260200190815260200160002060008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549350612f64601854612f56612f4787600d54613ae990919063ffffffff16565b8861325c90919063ffffffff16565b6131d490919063ffffffff16565b9250612f7983876132aa90919063ffffffff16565b915060106000601154815260200190815260200160002060008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050858383838888600d549c509c509c509c509c509c509c50505050505050919395979092949650565b61300181610d17565b151561300c57600080fd5b8273ffffffffffffffffffffffffffffffffffffffff1661302c826119fb565b73ffffffffffffffffffffffffffffffffffffffff1614151561304e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561308a57600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156130c557600080fd5b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060006009600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b60008082848115156131e257fe5b0490508091505092915050565b61322d61320961708060115461325c90919063ffffffff16565b61321f62093a80426132aa90919063ffffffff16565b6132aa90919063ffffffff16565b601581905550565b60008160166000858152602001908152602001600020600201819055506001905092915050565b60008060008414156132715760009150613290565b828402905082848281151561328257fe5b0414151561328c57fe5b8091505b5092915050565b600080823b905060008111915050919050565b60008082840190508381101515156132be57fe5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff166132e983612a77565b73ffffffffffffffffffffffffffffffffffffffff1614801561333857508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561334c5750600061334a82611b11565b115b801561339757506000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054145b156134755780600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fb450fc051a97f4be9c19179858075d55dcd18451137b75b621aa642ebceadb3760405160405180910390a35b5050565b600080600060086000878152602001908152602001600020549250828711151561349f57fe5b613506600f6000601154815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600d54613ae990919063ffffffff16565b9150600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141580156135a8575060008210155b80156135b357508281115b156136e5576135df6018546135d1848461325c90919063ffffffff16565b6131d490919063ffffffff16565b600e6000601154815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555082600c60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540392505081905550600d54600f6000601154815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b61374c600f6000601154815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600d54613ae990919063ffffffff16565b9150600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000821015156138da576137c16018546137b3848461325c90919063ffffffff16565b6131d490919063ffffffff16565b600e6000601154815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061383460028861325c90919063ffffffff16565b600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550600d54600f6000601154815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600c6000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115613a535783601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555043428573ffffffffffffffffffffffffffffffffffffffff167f67cd21f46fbb7e468ddcd4e93dcf0fc228d9df2f5669959539eb8adb39cc0564600c60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a45b83601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050505050565b613ad66008600084815260200190815260200160002054613ac860028461325c90919063ffffffff16565b613ae990919063ffffffff16565b600b600082825401925050819055505050565b6000828211151515613af757fe5b818303905092915050565b6000806000600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915060008273ffffffffffffffffffffffffffffffffffffffff16141515613cfc57613bb16103e8613ba360198761325c90919063ffffffff16565b6131d490919063ffffffff16565b925082600e6000601154815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff16141515613cfb5782600e6000601154815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555082830192505b5b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f79937abffcfdfa40d3f12bf61cd7a05b3cbd14369ebfe8a5a5a35d8d14b4d384866040518082815260200191505060405180910390a4829250505092915050565b600080600080600080600080613db66064613da860058d61325c90919063ffffffff16565b6131d490919063ffffffff16565b89101515613dc357600080fd5b6000601660008d815260200190815260200160002060010154111515613de857600080fd5b601660008c8152602001908152602001600020975087600101549650613e2b87613e1d6018548c61325c90919063ffffffff16565b6131d490919063ffffffff16565b955060009450600093505b876000018054905084108015613e4b57508885105b15613ff7578760000184815481101515613e6157fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169250601760008c815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549150613f08601854613efa888561325c90919063ffffffff16565b6131d490919063ffffffff16565b905088613f1e82876132aa90919063ffffffff16565b111515613fea5780600e6000601154815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508085019450613fe9818385600e6000601154815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548f6141d1565b5b8380600101945050613e36565b868b7fceb4b13ccc641c5bc314f7f19734f73e88b54f41fb9651e44e59ffaabcf02cdd8b8861402f8a8f613ae990919063ffffffff16565b8b6040518085815260200184815260200183815260200182815260200194505050505060405180910390a35050505050505050505050565b80601660008581526020019081526020016000206001016000828254019250508190555060006017600085815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054141561415f57601660008481526020019081526020016000206000018290806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505b505050565b60006141798234613ae990919063ffffffff16565b905060008111156141cc578273ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156141ca573d6000803e3d6000fd5b505b505050565b808373ffffffffffffffffffffffffffffffffffffffff16857f4cda2925eea274e308d19b94cf807a899810844448d5959cbbdd21b2c5d64bdd8886604051808381526020018281526020019250505060405180910390a450505050505600a165627a7a72305820b191ed1a8bdcdc035763bb752add4a85ba678083b74d57e4430ece4780fc1f660029
Deployed Bytecode
0x6080604052600436106101ab576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168062923f9e146101ad57806306fdde03146101f2578063095ea7b3146102825780631051db34146102cf57806318160ddd146102fe57806323b872dd146103295780632a6dd48f146103965780632e4f43bf146104035780633ccfd60b14610485578063418f14871461049c578063442edd03146104b35780635a3f26721461050a5780635ba9e48e146105a25780636352211e146105e3578063651212051461065057806370a082311461069157806371dc761e146106e85780637deb6025146106ff578063853828b61461073f5780638bda1540146107565780638da5cb5b146107c557806394bb7d641461081c57806395d89b411461087d578063a12077081461090d578063a9059cbb14610924578063b9186d7d14610971578063baddee6f146109b2578063bc7f25e414610a17578063cc2e2e8a14610a9a578063d21cacdf14610ae2578063db73bfce14610b65578063e08503ec14610c12578063f2fde38b14610c53578063f8b2cb4f14610c96575b005b3480156101b957600080fd5b506101d860048036038101908080359060200190929190505050610d17565b604051808215151515815260200191505060405180910390f35b3480156101fe57600080fd5b50610207610d2b565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561024757808201518184015260208101905061022c565b50505050905090810190601f1680156102745780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561028e57600080fd5b506102cd600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610d68565b005b3480156102db57600080fd5b506102e4610fce565b604051808215151515815260200191505060405180910390f35b34801561030a57600080fd5b50610313610fe4565b6040518082815260200191505060405180910390f35b34801561033557600080fd5b50610394600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610ff1565b005b3480156103a257600080fd5b506103c16004803603810190808035906020019092919050505061105e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561040f57600080fd5b5061042e6004803603810190808035906020019092919050505061109b565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200182815260200194505050505060405180910390f35b34801561049157600080fd5b5061049a6110df565b005b3480156104a857600080fd5b506104b16112ef565b005b3480156104bf57600080fd5b506105086004803603810190808035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611728565b005b34801561051657600080fd5b5061054b600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506118e1565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561058e578082015181840152602081019050610573565b505050509050019250505060405180910390f35b3480156105ae57600080fd5b506105cd600480360381019080803590602001909291905050506119e1565b6040518082815260200191505060405180910390f35b3480156105ef57600080fd5b5061060e600480360381019080803590602001909291905050506119fb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561065c57600080fd5b5061067b60048036038101908080359060200190929190505050611a38565b6040518082815260200191505060405180910390f35b34801561069d57600080fd5b506106d2600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b11565b6040518082815260200191505060405180910390f35b3480156106f457600080fd5b506106fd611ba0565b005b61073d60048036038101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c18565b005b34801561074b57600080fd5b506107546121ff565b005b34801561076257600080fd5b506107a160048036038101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506123ac565b60405180848152602001838152602001828152602001935050505060405180910390f35b3480156107d157600080fd5b506107da6124c1565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561082857600080fd5b5061086760048036038101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506124e6565b6040518082815260200191505060405180910390f35b34801561088957600080fd5b50610892612541565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156108d25780820151818401526020810190506108b7565b50505050905090810190601f1680156108ff5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561091957600080fd5b5061092261257e565b005b34801561093057600080fd5b5061096f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061294e565b005b34801561097d57600080fd5b5061099c600480360381019080803590602001909291905050506129ba565b6040518082815260200191505060405180910390f35b3480156109be57600080fd5b50610a1560048036038101908080359060200190820180359060200191909192939192939080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506129d7565b005b348015610a2357600080fd5b50610a58600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612a77565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610aa657600080fd5b50610ac560048036038101908080359060200190929190505050612ae0565b604051808381526020018281526020019250505060405180910390f35b348015610aee57600080fd5b50610b23600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612b04565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610b7157600080fd5b50610b7a612b37565b604051808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200186815260200185815260200184815260200183815260200182815260200197505050505050505060405180910390f35b348015610c1e57600080fd5b50610c3d60048036038101908080359060200190929190505050612bc3565b6040518082815260200191505060405180910390f35b348015610c5f57600080fd5b50610c94600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612cd4565b005b348015610ca257600080fd5b50610cd7600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612e29565b6040518088815260200187815260200186815260200185815260200184815260200183815260200182815260200197505050505050505060405180910390f35b600080610d23836129ba565b119050919050565b60606040805190810160405280600e81526020017f5375706572436f756e7472696573000000000000000000000000000000000000815250905090565b600060149054906101000a900460ff161515610d8357600080fd5b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151515610dbe57600080fd5b610dc781610d17565b1515610dd257600080fd5b3373ffffffffffffffffffffffffffffffffffffffff16610df2826119fb565b73ffffffffffffffffffffffffffffffffffffffff16141515610e1457600080fd5b60008273ffffffffffffffffffffffffffffffffffffffff161415610f125760006009600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515610f0d576009600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560003373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a35b610fca565b816009600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a35b5050565b60008060149054906101000a900460ff16905090565b6000600580549050905090565b600060149054906101000a900460ff16151561100c57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff1661102c8261105e565b73ffffffffffffffffffffffffffffffffffffffff1614151561104e57600080fd5b611059838383612ff8565b505050565b60006009600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000806000806110aa856119fb565b6110b3866129ba565b60086000888152602001908152602001600020546110d0886119e1565b93509350935093509193509193565b600080600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415151561111e57600080fd5b600061112933611b11565b11151561113557600080fd5b600060106000601154815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411151561119657600080fd5b3391506011546012541415156111b0576011546012819055505b60106000601154815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600060106000601154815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156112a3573d6000803e3d6000fd5b50601154818373ffffffffffffffffffffffffffffffffffffffff167fdf273cb619d95419a9cd0ec88123a0538c85064229baa6363788f743fff90deb60405160405180910390a45050565b60008060008073ffffffffffffffffffffffffffffffffffffffff16601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141580156113a15750600073ffffffffffffffffffffffffffffffffffffffff16601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b15156113ac57600080fd5b6305f5e1003073ffffffffffffffffffffffffffffffffffffffff16311115156113d557600080fd5b601554421115156113e557600080fd5b60155492506011600081548092919060010191905055503073ffffffffffffffffffffffffffffffffffffffff1631915061142a6004836131d490919063ffffffff16565b90506000600d8190555061143c6131ef565b806010600060115481526020019081526020016000206000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806010600060115481526020019081526020016000206000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550601154601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f7d52b961c8da712caedc7332724540baef718e9ef738de74e08dafcdfb4d923b856010600060115481526020019081526020016000206000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546010600060115481526020019081526020016000206000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460405180848152602001838152602001828152602001935050505060405180910390a460115483427f47b47b8c7743492a3f458380fb4e05eea566f4535b9d8432c9b37bc12fc8a0d0600d54601254604051808381526020018281526020019250505060405180910390a4505050565b3373ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561178357600080fd5b60008211151561179257600080fd5b600060076000858152602001908152602001600020541415156117b457600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166006600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561182257600080fd5b806006600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160076000858152602001908152602001600020819055506000600860008581526020019081526020016000208190555060058390806001815401808255809150509060018203906000526020600020016000909192909190915055506118db8383613235565b50505050565b6060806000806118f085611b11565b60405190808252806020026020018201604052801561191e5781602001602082028038833980820191505090505b50925060009150600090505b6005805490508110156119d6578473ffffffffffffffffffffffffffffffffffffffff1661197060058381548110151561196057fe5b90600052602060002001546119fb565b73ffffffffffffffffffffffffffffffffffffffff1614156119c95760058181548110151561199b57fe5b906000526020600020015483838151811015156119b457fe5b90602001906020020181815250506001820191505b808060010191505061192a565b829350505050919050565b60006119f46119ef836129ba565b612bc3565b9050919050565b60006006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600154821015611a7257611a6b6064611a5d60058561325c90919063ffffffff16565b6131d490919063ffffffff16565b9050611b0c565b600254821015611aaa57611aa36064611a9560048561325c90919063ffffffff16565b6131d490919063ffffffff16565b9050611b0c565b600454821015611ae257611adb6064611acd60038561325c90919063ffffffff16565b6131d490919063ffffffff16565b9050611b0c565b611b096064611afb60028561325c90919063ffffffff16565b6131d490919063ffffffff16565b90505b919050565b6000806000809150600090505b600580549050811015611b96578373ffffffffffffffffffffffffffffffffffffffff16611b64600583815481101515611b5457fe5b90600052602060002001546119fb565b73ffffffffffffffffffffffffffffffffffffffff161415611b895781806001019250505b8080600101915050611b1e565b8192505050919050565b3373ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515611bfb57600080fd5b6001600060146101000a81548160ff021916908315150217905550565b600080600080600080600080600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151515611c6057600080fd5b6000611c6b8b6129ba565b111515611c7757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16611c988b6119fb565b73ffffffffffffffffffffffffffffffffffffffff1614151515611cbb57600080fd5b611cc48a6129ba565b3410151515611cd257600080fd5b3373ffffffffffffffffffffffffffffffffffffffff16611cf28b6119fb565b73ffffffffffffffffffffffffffffffffffffffff1614151515611d1557600080fd5b611d1e33613297565b151515611d2a57600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151515611d8657600080fd5b601554421080611dab5750611da8610e106015546132aa90919063ffffffff16565b42115b1515611db657600080fd5b611dbf8a6119fb565b9750339650611dcd8a6129ba565b9550611dd9878a6132c8565b611de5868b8a8a613479565b611def8a87613a9d565b611df76131ef565b611e0086611a38565b9450611e3a600860008c815260200190815260200160002054611e2c8789613ae990919063ffffffff16565b613ae990919063ffffffff16565b9350611e636064611e55601e8761325c90919063ffffffff16565b6131d490919063ffffffff16565b9250611eb0611e8f6064611e8160238861325c90919063ffffffff16565b6131d490919063ffffffff16565b611ea28789613ae990919063ffffffff16565b613ae990919063ffffffff16565b9150611ebc8885613b02565b90508083039250601660008b81526020019081526020016000206002015486118015611eea5750620f424083115b8015611ef857506000600b54115b15611f5857611f2e8a87611f296064611f1b60148961325c90919063ffffffff16565b6131d490919063ffffffff16565b613d83565b611f556064611f4760508661325c90919063ffffffff16565b6131d490919063ffffffff16565b92505b6000600b541115611f9c57611f8c600b54611f7e8560185461325c90919063ffffffff16565b6131d490919063ffffffff16565b600d600082825401925050819055505b611fa78a8888614067565b85601760008c815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555085600860008c8152602001908152602001600020819055506120268a6119e1565b600760008c8152602001908152602001600020819055508773ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015612083573d6000803e3d6000fd5b506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc869081150290604051600060405180830381858888f193505050501580156120eb573d6000803e3d6000fd5b506120f788888c612ff8565b8673ffffffffffffffffffffffffffffffffffffffff168a7fd2728f908c7e0feb83c6278798370fcb86b62f236c9dbf1a3f541096c2159040886040518082815260200191505060405180910390a38773ffffffffffffffffffffffffffffffffffffffff168a7f66f5cd880edf48cdde6c966e5da0784fcc4c5e85572b8b3b62c4357798d447d7886040518082815260200191505060405180910390a361219f8787614164565b897fc2d38df9d158fa63a4d22026daa0c1962b6e04743f50d7551dfdc0fe8b4d140484600d5489600b546040518085815260200184815260200183815260200182815260200194505050505060405180910390a250505050505050505050565b60003373ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561225c57600080fd5b61227260036012546132aa90919063ffffffff16565b60115411801561228457506000600d54145b806122a957506305f5e1013073ffffffffffffffffffffffffffffffffffffffff1631105b15156122b457600080fd5b60003073ffffffffffffffffffffffffffffffffffffffff16311115156122da57600080fd5b6011600081548092919060010191905055506122f46131ef565b3073ffffffffffffffffffffffffffffffffffffffff163190506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612375573d6000803e3d6000fd5b50806012546011547f23852d00014f909bc66902f9565357935dbd78450e7e9a46b8caa5accbc8285160405160405180910390a450565b600080600080600080600e600089815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549250600f600089815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205491506010600089815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508282829550955095505050509250925092565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006017600084815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60606040805190810160405280600381526020017f5355500000000000000000000000000000000000000000000000000000000000815250905090565b600080600080600080600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515156125c357600080fd5b6000600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411151561261157600080fd5b600f6000601154815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600d541015151561267457600080fd5b6000600d541015151561268657600080fd5b339550600c60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549450600f6000601154815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549350600e6000601154815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205492506127b06018546127a261279387600d54613ae990919063ffffffff16565b8861325c90919063ffffffff16565b6131d490919063ffffffff16565b91506127c582846132aa90919063ffffffff16565b90506000600e6000601154815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600d54600f6000601154815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508060106000601154815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508573ffffffffffffffffffffffffffffffffffffffff167f4324e1fbcfc75073846dc7188f546ae390ff4c589a22422c75df55c26ed59bdc8484848989604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a2505050505050565b600060149054906101000a900460ff16151561296957600080fd5b612972816119fb565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156129ab57600080fd5b6129b6338383612ff8565b5050565b600060076000838152602001908152602001600020549050919050565b60003373ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515612a3457600080fd5b600090505b84849050811015612a7057612a638585838181101515612a5557fe5b905060200201358484611728565b8080600101915050612a39565b5050505050565b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60166020528060005260406000206000915090508060010154908060020154905082565b600a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000806000806000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1631601254600b54601154601554965096509650965096509650965090919293949596565b6000600154821015612bfd57612bf6605f612be860c88561325c90919063ffffffff16565b6131d490919063ffffffff16565b9050612ccf565b600254821015612c3557612c2e6060612c2060a08561325c90919063ffffffff16565b6131d490919063ffffffff16565b9050612ccf565b600354821015612c6d57612c666061612c5860948561325c90919063ffffffff16565b6131d490919063ffffffff16565b9050612ccf565b600454821015612ca557612c9e6061612c9060888561325c90919063ffffffff16565b6131d490919063ffffffff16565b9050612ccf565b612ccc6062612cbe607c8561325c90919063ffffffff16565b6131d490919063ffffffff16565b90505b919050565b3373ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515612d2f57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515612d6b57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806000806000806000806000806000806000600e6000601154815260200190815260200160002060008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549550600c60008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549450600f6000601154815260200190815260200160002060008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549350612f64601854612f56612f4787600d54613ae990919063ffffffff16565b8861325c90919063ffffffff16565b6131d490919063ffffffff16565b9250612f7983876132aa90919063ffffffff16565b915060106000601154815260200190815260200160002060008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050858383838888600d549c509c509c509c509c509c509c50505050505050919395979092949650565b61300181610d17565b151561300c57600080fd5b8273ffffffffffffffffffffffffffffffffffffffff1661302c826119fb565b73ffffffffffffffffffffffffffffffffffffffff1614151561304e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561308a57600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156130c557600080fd5b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060006009600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b60008082848115156131e257fe5b0490508091505092915050565b61322d61320961708060115461325c90919063ffffffff16565b61321f62093a80426132aa90919063ffffffff16565b6132aa90919063ffffffff16565b601581905550565b60008160166000858152602001908152602001600020600201819055506001905092915050565b60008060008414156132715760009150613290565b828402905082848281151561328257fe5b0414151561328c57fe5b8091505b5092915050565b600080823b905060008111915050919050565b60008082840190508381101515156132be57fe5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff166132e983612a77565b73ffffffffffffffffffffffffffffffffffffffff1614801561333857508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561334c5750600061334a82611b11565b115b801561339757506000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054145b156134755780600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fb450fc051a97f4be9c19179858075d55dcd18451137b75b621aa642ebceadb3760405160405180910390a35b5050565b600080600060086000878152602001908152602001600020549250828711151561349f57fe5b613506600f6000601154815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600d54613ae990919063ffffffff16565b9150600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141580156135a8575060008210155b80156135b357508281115b156136e5576135df6018546135d1848461325c90919063ffffffff16565b6131d490919063ffffffff16565b600e6000601154815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555082600c60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540392505081905550600d54600f6000601154815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b61374c600f6000601154815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600d54613ae990919063ffffffff16565b9150600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000821015156138da576137c16018546137b3848461325c90919063ffffffff16565b6131d490919063ffffffff16565b600e6000601154815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061383460028861325c90919063ffffffff16565b600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550600d54600f6000601154815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600c6000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115613a535783601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555043428573ffffffffffffffffffffffffffffffffffffffff167f67cd21f46fbb7e468ddcd4e93dcf0fc228d9df2f5669959539eb8adb39cc0564600c60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a45b83601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050505050565b613ad66008600084815260200190815260200160002054613ac860028461325c90919063ffffffff16565b613ae990919063ffffffff16565b600b600082825401925050819055505050565b6000828211151515613af757fe5b818303905092915050565b6000806000600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915060008273ffffffffffffffffffffffffffffffffffffffff16141515613cfc57613bb16103e8613ba360198761325c90919063ffffffff16565b6131d490919063ffffffff16565b925082600e6000601154815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff16141515613cfb5782600e6000601154815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555082830192505b5b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f79937abffcfdfa40d3f12bf61cd7a05b3cbd14369ebfe8a5a5a35d8d14b4d384866040518082815260200191505060405180910390a4829250505092915050565b600080600080600080600080613db66064613da860058d61325c90919063ffffffff16565b6131d490919063ffffffff16565b89101515613dc357600080fd5b6000601660008d815260200190815260200160002060010154111515613de857600080fd5b601660008c8152602001908152602001600020975087600101549650613e2b87613e1d6018548c61325c90919063ffffffff16565b6131d490919063ffffffff16565b955060009450600093505b876000018054905084108015613e4b57508885105b15613ff7578760000184815481101515613e6157fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169250601760008c815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549150613f08601854613efa888561325c90919063ffffffff16565b6131d490919063ffffffff16565b905088613f1e82876132aa90919063ffffffff16565b111515613fea5780600e6000601154815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508085019450613fe9818385600e6000601154815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548f6141d1565b5b8380600101945050613e36565b868b7fceb4b13ccc641c5bc314f7f19734f73e88b54f41fb9651e44e59ffaabcf02cdd8b8861402f8a8f613ae990919063ffffffff16565b8b6040518085815260200184815260200183815260200182815260200194505050505060405180910390a35050505050505050505050565b80601660008581526020019081526020016000206001016000828254019250508190555060006017600085815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054141561415f57601660008481526020019081526020016000206000018290806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505b505050565b60006141798234613ae990919063ffffffff16565b905060008111156141cc578273ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156141ca573d6000803e3d6000fd5b505b505050565b808373ffffffffffffffffffffffffffffffffffffffff16857f4cda2925eea274e308d19b94cf807a899810844448d5959cbbdd21b2c5d64bdd8886604051808381526020018281526020019250505060405180910390a450505050505600a165627a7a72305820b191ed1a8bdcdc035763bb752add4a85ba678083b74d57e4430ece4780fc1f660029
Swarm Source
bzzr://b191ed1a8bdcdc035763bb752add4a85ba678083b74d57e4430ece4780fc1f66
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | Ether (ETH) | 100.00% | $3,489.31 | 0.1854 | $646.91 |
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.