Feature Tip: Add private address tag to any address under My Name Tag !
ERC-20
Overview
Max Total Supply
1,000,000,000 PTNX
Holders
2,337
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Similar Match Source Code This contract matches the deployed Bytecode of the Source Code for Contract 0x8f9202a2...14D2c41Be The constructor portion of the code might be different and could alter the actual behaviour of the contract
Contract Name:
PlatinToken
Compiler Version
v0.4.25+commit.59dbf8f1
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2018-10-22 */ pragma solidity ^0.4.25; // solium-disable-line linebreak-style /** * @author Anatolii Kucheruk ([email protected]) * @author Platin Limited, platin.io ([email protected]) */ /** * @title SafeMath * @dev Math operations with safety checks that throw on error */ library SafeMath { /** * @dev Multiplies two numbers, throws on overflow. */ function mul(uint256 _a, uint256 _b) internal pure returns (uint256 c) { // Gas optimization: this is cheaper than asserting 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522 if (_a == 0) { return 0; } 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 _a / _b; } /** * @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 c) { c = _a + _b; assert(c >= _a); return c; } } /** * @title Ownable * @dev The Ownable contract has an owner address, and provides basic authorization control * functions, this simplifies the implementation of "user permissions". */ contract Ownable { address public owner; event OwnershipRenounced(address indexed previousOwner); event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev The Ownable constructor sets the original `owner` of the contract to the sender * account. */ constructor() public { owner = msg.sender; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(msg.sender == owner); _; } /** * @dev Allows the current owner to relinquish control of the contract. * @notice Renouncing to ownership will leave the contract without an owner. * It will not be possible to call the functions with the `onlyOwner` * modifier anymore. */ function renounceOwnership() public onlyOwner { emit OwnershipRenounced(owner); owner = address(0); } /** * @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 { _transferOwnership(_newOwner); } /** * @dev Transfers control of the contract to a newOwner. * @param _newOwner The address to transfer ownership to. */ function _transferOwnership(address _newOwner) internal { require(_newOwner != address(0)); emit OwnershipTransferred(owner, _newOwner); owner = _newOwner; } } /** * @title Contracts that should be able to recover tokens * @author SylTi * @dev This allow a contract to recover any ERC20 token received in a contract by transferring the balance to the contract owner. * This will prevent any accidental loss of tokens. */ contract CanReclaimToken is Ownable { using SafeERC20 for ERC20Basic; /** * @dev Reclaim all ERC20Basic compatible tokens * @param _token ERC20Basic The address of the token contract */ function reclaimToken(ERC20Basic _token) external onlyOwner { uint256 balance = _token.balanceOf(this); _token.safeTransfer(owner, balance); } } /** * @title ERC20Basic * @dev Simpler version of ERC20 interface * See https://github.com/ethereum/EIPs/issues/179 */ contract ERC20Basic { function totalSupply() public view returns (uint256); function balanceOf(address _who) public view returns (uint256); function transfer(address _to, uint256 _value) public returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); } /** * @title ERC20 interface * @dev see https://github.com/ethereum/EIPs/issues/20 */ contract ERC20 is ERC20Basic { function allowance(address _owner, address _spender) public view returns (uint256); function transferFrom(address _from, address _to, uint256 _value) public returns (bool); function approve(address _spender, uint256 _value) public returns (bool); event Approval( address indexed owner, address indexed spender, uint256 value ); } /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure. * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { function safeTransfer( ERC20Basic _token, address _to, uint256 _value ) internal { require(_token.transfer(_to, _value)); } function safeTransferFrom( ERC20 _token, address _from, address _to, uint256 _value ) internal { require(_token.transferFrom(_from, _to, _value)); } function safeApprove( ERC20 _token, address _spender, uint256 _value ) internal { require(_token.approve(_spender, _value)); } } /** * @title Contracts that should not own Ether * @author Remco Bloemen <remco@2π.com> * @dev This tries to block incoming ether to prevent accidental loss of Ether. Should Ether end up * in the contract, it will allow the owner to reclaim this Ether. * @notice Ether can still be sent to this contract by: * calling functions labeled `payable` * `selfdestruct(contract_address)` * mining directly to the contract address */ contract HasNoEther is Ownable { /** * @dev Constructor that rejects incoming Ether * The `payable` flag is added so we can access `msg.value` without compiler warning. If we * leave out payable, then Solidity will allow inheriting contracts to implement a payable * constructor. By doing it this way we prevent a payable constructor from working. Alternatively * we could use assembly to access msg.value. */ constructor() public payable { require(msg.value == 0); } /** * @dev Disallows direct send by setting a default function without the `payable` flag. */ function() external { } /** * @dev Transfer all Ether held by the contract to the owner. */ function reclaimEther() external onlyOwner { owner.transfer(address(this).balance); } } /** * @title Contracts that should not own Tokens * @author Remco Bloemen <remco@2π.com> * @dev This blocks incoming ERC223 tokens to prevent accidental loss of tokens. * Should tokens (any ERC20Basic compatible) end up in the contract, it allows the * owner to reclaim the tokens. */ contract HasNoTokens is CanReclaimToken { /** * @dev Reject all ERC223 compatible tokens * @param _from address The address that is transferring the tokens * @param _value uint256 the amount of the specified token * @param _data Bytes The data passed from the caller. */ function tokenFallback( address _from, uint256 _value, bytes _data ) external pure { _from; _value; _data; revert(); } } /** * @title Contracts that should not own Contracts * @author Remco Bloemen <remco@2π.com> * @dev Should contracts (anything Ownable) end up being owned by this contract, it allows the owner * of this contract to reclaim ownership of the contracts. */ contract HasNoContracts is Ownable { /** * @dev Reclaim ownership of Ownable contracts * @param _contractAddr The address of the Ownable to be reclaimed. */ function reclaimContract(address _contractAddr) external onlyOwner { Ownable contractInst = Ownable(_contractAddr); contractInst.transferOwnership(owner); } } /** * @title Base contract for contracts that should not own things. * @author Remco Bloemen <remco@2π.com> * @dev Solves a class of errors where a contract accidentally becomes owner of Ether, Tokens or * Owned contracts. See respective base contracts for details. */ contract NoOwner is HasNoEther, HasNoTokens, HasNoContracts { } /** * @title Pausable * @dev Base contract which allows children to implement an emergency stop mechanism. */ contract Pausable is Ownable { event Pause(); event Unpause(); bool public paused = false; /** * @dev Modifier to make a function callable only when the contract is not paused. */ modifier whenNotPaused() { require(!paused); _; } /** * @dev Modifier to make a function callable only when the contract is paused. */ modifier whenPaused() { require(paused); _; } /** * @dev called by the owner to pause, triggers stopped state */ function pause() public onlyOwner whenNotPaused { paused = true; emit Pause(); } /** * @dev called by the owner to unpause, returns to normal state */ function unpause() public onlyOwner whenPaused { paused = false; emit Unpause(); } } /** * @title Authorizable * @dev Authorizable contract holds a list of control addresses that authorized to do smth. */ contract Authorizable is Ownable { // List of authorized (control) addresses mapping (address => bool) public authorized; // Authorize event logging event Authorize(address indexed who); // UnAuthorize event logging event UnAuthorize(address indexed who); // onlyAuthorized modifier, restrict to the owner and the list of authorized addresses modifier onlyAuthorized() { require(msg.sender == owner || authorized[msg.sender], "Not Authorized."); _; } /** * @dev Authorize given address * @param _who address Address to authorize */ function authorize(address _who) public onlyOwner { require(_who != address(0), "Address can't be zero."); require(!authorized[_who], "Already authorized"); authorized[_who] = true; emit Authorize(_who); } /** * @dev unAuthorize given address * @param _who address Address to unauthorize */ function unAuthorize(address _who) public onlyOwner { require(_who != address(0), "Address can't be zero."); require(authorized[_who], "Address is not authorized"); authorized[_who] = false; emit UnAuthorize(_who); } } /** * @title Basic token * @dev Basic version of StandardToken, with no allowances. */ contract BasicToken is ERC20Basic { using SafeMath for uint256; mapping(address => uint256) internal balances; uint256 internal totalSupply_; /** * @dev Total number of tokens in existence */ function totalSupply() public view returns (uint256) { return totalSupply_; } /** * @dev Transfer token for a specified address * @param _to The address to transfer to. * @param _value The amount to be transferred. */ function transfer(address _to, uint256 _value) public returns (bool) { require(_value <= balances[msg.sender]); require(_to != address(0)); balances[msg.sender] = balances[msg.sender].sub(_value); balances[_to] = balances[_to].add(_value); emit Transfer(msg.sender, _to, _value); return true; } /** * @dev Gets the balance of the specified address. * @param _owner The address to query the the balance of. * @return An uint256 representing the amount owned by the passed address. */ function balanceOf(address _owner) public view returns (uint256) { return balances[_owner]; } } /** * @title Standard ERC20 token * * @dev Implementation of the basic standard token. * https://github.com/ethereum/EIPs/issues/20 * Based on code by FirstBlood: https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol */ contract StandardToken is ERC20, BasicToken { mapping (address => mapping (address => uint256)) internal allowed; /** * @dev Transfer tokens from one address to another * @param _from address The address which you want to send tokens from * @param _to address The address which you want to transfer to * @param _value uint256 the amount of tokens to be transferred */ function transferFrom( address _from, address _to, uint256 _value ) public returns (bool) { require(_value <= balances[_from]); require(_value <= allowed[_from][msg.sender]); require(_to != address(0)); balances[_from] = balances[_from].sub(_value); balances[_to] = balances[_to].add(_value); allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value); emit Transfer(_from, _to, _value); return true; } /** * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender. * Beware that changing an allowance with this method brings the risk that someone may use both the old * and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this * race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * @param _spender The address which will spend the funds. * @param _value The amount of tokens to be spent. */ function approve(address _spender, uint256 _value) public returns (bool) { allowed[msg.sender][_spender] = _value; emit Approval(msg.sender, _spender, _value); return true; } /** * @dev Function to check the amount of tokens that an owner allowed to a spender. * @param _owner address The address which owns the funds. * @param _spender address The address which will spend the funds. * @return A uint256 specifying the amount of tokens still available for the spender. */ function allowance( address _owner, address _spender ) public view returns (uint256) { return allowed[_owner][_spender]; } /** * @dev Increase the amount of tokens that an owner allowed to a spender. * approve should be called when allowed[_spender] == 0. To increment * allowed value is better to use this function to avoid 2 calls (and wait until * the first transaction is mined) * From MonolithDAO Token.sol * @param _spender The address which will spend the funds. * @param _addedValue The amount of tokens to increase the allowance by. */ function increaseApproval( address _spender, uint256 _addedValue ) public returns (bool) { allowed[msg.sender][_spender] = ( allowed[msg.sender][_spender].add(_addedValue)); emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]); return true; } /** * @dev Decrease the amount of tokens that an owner allowed to a spender. * approve should be called when allowed[_spender] == 0. To decrement * allowed value is better to use this function to avoid 2 calls (and wait until * the first transaction is mined) * From MonolithDAO Token.sol * @param _spender The address which will spend the funds. * @param _subtractedValue The amount of tokens to decrease the allowance by. */ function decreaseApproval( address _spender, uint256 _subtractedValue ) public returns (bool) { uint256 oldValue = allowed[msg.sender][_spender]; if (_subtractedValue >= oldValue) { allowed[msg.sender][_spender] = 0; } else { allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue); } emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]); return true; } } /** * @title Holders Token * @dev Extension to the OpenZepellin's StandardToken contract to track token holders. * Only holders with the non-zero balance are listed. */ contract HoldersToken is StandardToken { using SafeMath for uint256; // holders list address[] public holders; // holder number in the list mapping (address => uint256) public holderNumber; /** * @dev Get the holders count * @return uint256 Holders count */ function holdersCount() public view returns (uint256) { return holders.length; } /** * @dev Transfer tokens from one address to another preserving token holders * @param _to address The address which you want to transfer to * @param _value uint256 The amount of tokens to be transferred * @return bool Returns true if the transfer was succeeded */ function transfer(address _to, uint256 _value) public returns (bool) { _preserveHolders(msg.sender, _to, _value); return super.transfer(_to, _value); } /** * @dev Transfer tokens from one address to another preserving token holders * @param _from address The address which you want to send tokens from * @param _to address The address which you want to transfer to * @param _value uint256 The amount of tokens to be transferred * @return bool Returns true if the transfer was succeeded */ function transferFrom(address _from, address _to, uint256 _value) public returns (bool) { _preserveHolders(_from, _to, _value); return super.transferFrom(_from, _to, _value); } /** * @dev Remove holder from the holders list * @param _holder address Address of the holder to remove */ function _removeHolder(address _holder) internal { uint256 _number = holderNumber[_holder]; if (_number == 0 || holders.length == 0 || _number > holders.length) return; uint256 _index = _number.sub(1); uint256 _lastIndex = holders.length.sub(1); address _lastHolder = holders[_lastIndex]; if (_index != _lastIndex) { holders[_index] = _lastHolder; holderNumber[_lastHolder] = _number; } holderNumber[_holder] = 0; holders.length = _lastIndex; } /** * @dev Add holder to the holders list * @param _holder address Address of the holder to add */ function _addHolder(address _holder) internal { if (holderNumber[_holder] == 0) { holders.push(_holder); holderNumber[_holder] = holders.length; } } /** * @dev Preserve holders during transfers * @param _from address The address which you want to send tokens from * @param _to address The address which you want to transfer to * @param _value uint256 the amount of tokens to be transferred */ function _preserveHolders(address _from, address _to, uint256 _value) internal { _addHolder(_to); if (balanceOf(_from).sub(_value) == 0) _removeHolder(_from); } } /** * @title PlatinTGE * @dev Platin Token Generation Event contract. It holds token economic constants and makes initial token allocation. * Initial token allocation function should be called outside the blockchain at the TGE moment of time, * from here on out, Platin Token and other Platin contracts become functional. */ contract PlatinTGE { using SafeMath for uint256; // Token decimals uint8 public constant decimals = 18; // solium-disable-line uppercase // Total Tokens Supply uint256 public constant TOTAL_SUPPLY = 1000000000 * (10 ** uint256(decimals)); // 1,000,000,000 PTNX // SUPPLY // TOTAL_SUPPLY = 1,000,000,000 PTNX, is distributed as follows: uint256 public constant SALES_SUPPLY = 300000000 * (10 ** uint256(decimals)); // 300,000,000 PTNX - 30% uint256 public constant MINING_POOL_SUPPLY = 200000000 * (10 ** uint256(decimals)); // 200,000,000 PTNX - 20% uint256 public constant FOUNDERS_AND_EMPLOYEES_SUPPLY = 200000000 * (10 ** uint256(decimals)); // 200,000,000 PTNX - 20% uint256 public constant AIRDROPS_POOL_SUPPLY = 100000000 * (10 ** uint256(decimals)); // 100,000,000 PTNX - 10% uint256 public constant RESERVES_POOL_SUPPLY = 100000000 * (10 ** uint256(decimals)); // 100,000,000 PTNX - 10% uint256 public constant ADVISORS_POOL_SUPPLY = 70000000 * (10 ** uint256(decimals)); // 70,000,000 PTNX - 7% uint256 public constant ECOSYSTEM_POOL_SUPPLY = 30000000 * (10 ** uint256(decimals)); // 30,000,000 PTNX - 3% // HOLDERS address public PRE_ICO_POOL; // solium-disable-line mixedcase address public LIQUID_POOL; // solium-disable-line mixedcase address public ICO; // solium-disable-line mixedcase address public MINING_POOL; // solium-disable-line mixedcase address public FOUNDERS_POOL; // solium-disable-line mixedcase address public EMPLOYEES_POOL; // solium-disable-line mixedcase address public AIRDROPS_POOL; // solium-disable-line mixedcase address public RESERVES_POOL; // solium-disable-line mixedcase address public ADVISORS_POOL; // solium-disable-line mixedcase address public ECOSYSTEM_POOL; // solium-disable-line mixedcase // HOLDER AMOUNT AS PART OF SUPPLY // SALES_SUPPLY = PRE_ICO_POOL_AMOUNT + LIQUID_POOL_AMOUNT + ICO_AMOUNT uint256 public constant PRE_ICO_POOL_AMOUNT = 20000000 * (10 ** uint256(decimals)); // 20,000,000 PTNX uint256 public constant LIQUID_POOL_AMOUNT = 100000000 * (10 ** uint256(decimals)); // 100,000,000 PTNX uint256 public constant ICO_AMOUNT = 180000000 * (10 ** uint256(decimals)); // 180,000,000 PTNX // FOUNDERS_AND_EMPLOYEES_SUPPLY = FOUNDERS_POOL_AMOUNT + EMPLOYEES_POOL_AMOUNT uint256 public constant FOUNDERS_POOL_AMOUNT = 190000000 * (10 ** uint256(decimals)); // 190,000,000 PTNX uint256 public constant EMPLOYEES_POOL_AMOUNT = 10000000 * (10 ** uint256(decimals)); // 10,000,000 PTNX // Unsold tokens reserve address address public UNSOLD_RESERVE; // solium-disable-line mixedcase // Tokens ico sale with lockup period uint256 public constant ICO_LOCKUP_PERIOD = 182 days; // Platin Token ICO rate, regular uint256 public constant TOKEN_RATE = 1000; // Platin Token ICO rate with lockup, 20% bonus uint256 public constant TOKEN_RATE_LOCKUP = 1200; // Platin ICO min purchase amount uint256 public constant MIN_PURCHASE_AMOUNT = 1 ether; // Platin Token contract PlatinToken public token; // TGE time uint256 public tgeTime; /** * @dev Constructor * @param _tgeTime uint256 TGE moment of time * @param _token address Address of the Platin Token contract * @param _preIcoPool address Address of the Platin PreICO Pool * @param _liquidPool address Address of the Platin Liquid Pool * @param _ico address Address of the Platin ICO contract * @param _miningPool address Address of the Platin Mining Pool * @param _foundersPool address Address of the Platin Founders Pool * @param _employeesPool address Address of the Platin Employees Pool * @param _airdropsPool address Address of the Platin Airdrops Pool * @param _reservesPool address Address of the Platin Reserves Pool * @param _advisorsPool address Address of the Platin Advisors Pool * @param _ecosystemPool address Address of the Platin Ecosystem Pool * @param _unsoldReserve address Address of the Platin Unsold Reserve */ constructor( uint256 _tgeTime, PlatinToken _token, address _preIcoPool, address _liquidPool, address _ico, address _miningPool, address _foundersPool, address _employeesPool, address _airdropsPool, address _reservesPool, address _advisorsPool, address _ecosystemPool, address _unsoldReserve ) public { require(_tgeTime >= block.timestamp, "TGE time should be >= current time."); // solium-disable-line security/no-block-members require(_token != address(0), "Token address can't be zero."); require(_preIcoPool != address(0), "PreICO Pool address can't be zero."); require(_liquidPool != address(0), "Liquid Pool address can't be zero."); require(_ico != address(0), "ICO address can't be zero."); require(_miningPool != address(0), "Mining Pool address can't be zero."); require(_foundersPool != address(0), "Founders Pool address can't be zero."); require(_employeesPool != address(0), "Employees Pool address can't be zero."); require(_airdropsPool != address(0), "Airdrops Pool address can't be zero."); require(_reservesPool != address(0), "Reserves Pool address can't be zero."); require(_advisorsPool != address(0), "Advisors Pool address can't be zero."); require(_ecosystemPool != address(0), "Ecosystem Pool address can't be zero."); require(_unsoldReserve != address(0), "Unsold reserve address can't be zero."); // Setup tge time tgeTime = _tgeTime; // Setup token address token = _token; // Setup holder addresses PRE_ICO_POOL = _preIcoPool; LIQUID_POOL = _liquidPool; ICO = _ico; MINING_POOL = _miningPool; FOUNDERS_POOL = _foundersPool; EMPLOYEES_POOL = _employeesPool; AIRDROPS_POOL = _airdropsPool; RESERVES_POOL = _reservesPool; ADVISORS_POOL = _advisorsPool; ECOSYSTEM_POOL = _ecosystemPool; // Setup unsold reserve address UNSOLD_RESERVE = _unsoldReserve; } /** * @dev Allocate function. Token Generation Event entry point. * It makes initial token allocation according to the initial token supply constants. */ function allocate() public { // Should be called just after tge time require(block.timestamp >= tgeTime, "Should be called just after tge time."); // solium-disable-line security/no-block-members // Should not be allocated already require(token.totalSupply() == 0, "Allocation is already done."); // SALES token.allocate(PRE_ICO_POOL, PRE_ICO_POOL_AMOUNT); token.allocate(LIQUID_POOL, LIQUID_POOL_AMOUNT); token.allocate(ICO, ICO_AMOUNT); // MINING POOL token.allocate(MINING_POOL, MINING_POOL_SUPPLY); // FOUNDERS AND EMPLOYEES token.allocate(FOUNDERS_POOL, FOUNDERS_POOL_AMOUNT); token.allocate(EMPLOYEES_POOL, EMPLOYEES_POOL_AMOUNT); // AIRDROPS POOL token.allocate(AIRDROPS_POOL, AIRDROPS_POOL_SUPPLY); // RESERVES POOL token.allocate(RESERVES_POOL, RESERVES_POOL_SUPPLY); // ADVISORS POOL token.allocate(ADVISORS_POOL, ADVISORS_POOL_SUPPLY); // ECOSYSTEM POOL token.allocate(ECOSYSTEM_POOL, ECOSYSTEM_POOL_SUPPLY); // Check Token Total Supply require(token.totalSupply() == TOTAL_SUPPLY, "Total supply check error."); } } /** * @title PlatinToken * @dev Platin PTNX Token contract. Tokens are allocated during TGE. * Token contract is a standard ERC20 token with additional capabilities: TGE allocation, holders tracking and lockup. * Initial allocation should be invoked by the TGE contract at the TGE moment of time. * Token contract holds list of token holders, the list includes holders with positive balance only. * Authorized holders can transfer token with lockup(s). Lockups can be refundable. * Lockups is a list of releases dates and releases amounts. * In case of refund previous holder can get back locked up tokens. Only still locked up amounts can be transferred back. */ contract PlatinToken is HoldersToken, NoOwner, Authorizable, Pausable { using SafeMath for uint256; string public constant name = "Platin Token"; // solium-disable-line uppercase string public constant symbol = "PTNX"; // solium-disable-line uppercase uint8 public constant decimals = 18; // solium-disable-line uppercase // lockup sruct struct Lockup { uint256 release; // release timestamp uint256 amount; // amount of tokens to release } // list of lockups mapping (address => Lockup[]) public lockups; // list of lockups that can be refunded mapping (address => mapping (address => Lockup[])) public refundable; // idexes mapping from refundable to lockups lists mapping (address => mapping (address => mapping (uint256 => uint256))) public indexes; // Platin TGE contract PlatinTGE public tge; // allocation event logging event Allocate(address indexed to, uint256 amount); // lockup event logging event SetLockups(address indexed to, uint256 amount, uint256 fromIdx, uint256 toIdx); // refund event logging event Refund(address indexed from, address indexed to, uint256 amount); // spotTransfer modifier, check balance spot on transfer modifier spotTransfer(address _from, uint256 _value) { require(_value <= balanceSpot(_from), "Attempt to transfer more than balance spot."); _; } // onlyTGE modifier, restrict to the TGE contract only modifier onlyTGE() { require(msg.sender == address(tge), "Only TGE method."); _; } /** * @dev Set TGE contract * @param _tge address PlatinTGE contract address */ function setTGE(PlatinTGE _tge) external onlyOwner { require(tge == address(0), "TGE is already set."); require(_tge != address(0), "TGE address can't be zero."); tge = _tge; authorize(_tge); } /** * @dev Allocate tokens during TGE * @param _to address Address gets the tokens * @param _amount uint256 Amount to allocate */ function allocate(address _to, uint256 _amount) external onlyTGE { require(_to != address(0), "Allocate To address can't be zero"); require(_amount > 0, "Allocate amount should be > 0."); totalSupply_ = totalSupply_.add(_amount); balances[_to] = balances[_to].add(_amount); _addHolder(_to); require(totalSupply_ <= tge.TOTAL_SUPPLY(), "Can't allocate more than TOTAL SUPPLY."); emit Allocate(_to, _amount); emit Transfer(address(0), _to, _amount); } /** * @dev Transfer tokens from one address to another * @param _to address The address which you want to transfer to * @param _value uint256 The amount of tokens to be transferred * @return bool Returns true if the transfer was succeeded */ function transfer(address _to, uint256 _value) public whenNotPaused spotTransfer(msg.sender, _value) returns (bool) { return super.transfer(_to, _value); } /** * @dev Transfer tokens from one address to another * @param _from address The address which you want to send tokens from * @param _to address The address which you want to transfer to * @param _value uint256 The amount of tokens to be transferred * @return bool Returns true if the transfer was succeeded */ function transferFrom(address _from, address _to, uint256 _value) public whenNotPaused spotTransfer(_from, _value) returns (bool) { return super.transferFrom(_from, _to, _value); } /** * @dev Transfer tokens from one address to another with lockup * @param _to address The address which you want to transfer to * @param _value uint256 The amount of tokens to be transferred * @param _lockupReleases uint256[] List of lockup releases * @param _lockupAmounts uint256[] List of lockup amounts * @param _refundable bool Is locked up amount refundable * @return bool Returns true if the transfer was succeeded */ function transferWithLockup( address _to, uint256 _value, uint256[] _lockupReleases, uint256[] _lockupAmounts, bool _refundable ) public onlyAuthorized returns (bool) { transfer(_to, _value); _lockup(_to, _value, _lockupReleases, _lockupAmounts, _refundable); // solium-disable-line arg-overflow } /** * @dev Transfer tokens from one address to another with lockup * @param _from address The address which you want to send tokens from * @param _to address The address which you want to transfer to * @param _value uint256 The amount of tokens to be transferred * @param _lockupReleases uint256[] List of lockup releases * @param _lockupAmounts uint256[] List of lockup amounts * @param _refundable bool Is locked up amount refundable * @return bool Returns true if the transfer was succeeded */ function transferFromWithLockup( address _from, address _to, uint256 _value, uint256[] _lockupReleases, uint256[] _lockupAmounts, bool _refundable ) public onlyAuthorized returns (bool) { transferFrom(_from, _to, _value); _lockup(_to, _value, _lockupReleases, _lockupAmounts, _refundable); // solium-disable-line arg-overflow } /** * @dev Refund refundable locked up amount * @param _from address The address which you want to refund tokens from * @return uint256 Returns amount of refunded tokens */ function refundLockedUp( address _from ) public onlyAuthorized returns (uint256) { address _sender = msg.sender; uint256 _balanceRefundable = 0; uint256 _refundableLength = refundable[_from][_sender].length; if (_refundableLength > 0) { uint256 _lockupIdx; for (uint256 i = 0; i < _refundableLength; i++) { if (refundable[_from][_sender][i].release > block.timestamp) { // solium-disable-line security/no-block-members _balanceRefundable = _balanceRefundable.add(refundable[_from][_sender][i].amount); refundable[_from][_sender][i].release = 0; refundable[_from][_sender][i].amount = 0; _lockupIdx = indexes[_from][_sender][i]; lockups[_from][_lockupIdx].release = 0; lockups[_from][_lockupIdx].amount = 0; } } if (_balanceRefundable > 0) { _preserveHolders(_from, _sender, _balanceRefundable); balances[_from] = balances[_from].sub(_balanceRefundable); balances[_sender] = balances[_sender].add(_balanceRefundable); emit Refund(_from, _sender, _balanceRefundable); emit Transfer(_from, _sender, _balanceRefundable); } } return _balanceRefundable; } /** * @dev Get the lockups list count * @param _who address Address owns locked up list * @return uint256 Lockups list count */ function lockupsCount(address _who) public view returns (uint256) { return lockups[_who].length; } /** * @dev Find out if the address has lockups * @param _who address Address checked for lockups * @return bool Returns true if address has lockups */ function hasLockups(address _who) public view returns (bool) { return lockups[_who].length > 0; } /** * @dev Get balance locked up at the current moment of time * @param _who address Address owns locked up amounts * @return uint256 Balance locked up at the current moment of time */ function balanceLockedUp(address _who) public view returns (uint256) { uint256 _balanceLokedUp = 0; uint256 _lockupsLength = lockups[_who].length; for (uint256 i = 0; i < _lockupsLength; i++) { if (lockups[_who][i].release > block.timestamp) // solium-disable-line security/no-block-members _balanceLokedUp = _balanceLokedUp.add(lockups[_who][i].amount); } return _balanceLokedUp; } /** * @dev Get refundable locked up balance at the current moment of time * @param _who address Address owns locked up amounts * @param _sender address Address owned locked up amounts * @return uint256 Locked up refundable balance at the current moment of time */ function balanceRefundable(address _who, address _sender) public view returns (uint256) { uint256 _balanceRefundable = 0; uint256 _refundableLength = refundable[_who][_sender].length; if (_refundableLength > 0) { for (uint256 i = 0; i < _refundableLength; i++) { if (refundable[_who][_sender][i].release > block.timestamp) // solium-disable-line security/no-block-members _balanceRefundable = _balanceRefundable.add(refundable[_who][_sender][i].amount); } } return _balanceRefundable; } /** * @dev Get balance spot for the current moment of time * @param _who address Address owns balance spot * @return uint256 Balance spot for the current moment of time */ function balanceSpot(address _who) public view returns (uint256) { uint256 _balanceSpot = balanceOf(_who); _balanceSpot = _balanceSpot.sub(balanceLockedUp(_who)); return _balanceSpot; } /** * @dev Lockup amount till release time * @param _who address Address gets the locked up amount * @param _amount uint256 Amount to lockup * @param _lockupReleases uint256[] List of lockup releases * @param _lockupAmounts uint256[] List of lockup amounts * @param _refundable bool Is locked up amount refundable */ function _lockup( address _who, uint256 _amount, uint256[] _lockupReleases, uint256[] _lockupAmounts, bool _refundable) internal { require(_lockupReleases.length == _lockupAmounts.length, "Length of lockup releases and amounts lists should be equal."); require(_lockupReleases.length.add(lockups[_who].length) <= 1000, "Can't be more than 1000 lockups per address."); if (_lockupReleases.length > 0) { uint256 _balanceLokedUp = 0; address _sender = msg.sender; uint256 _fromIdx = lockups[_who].length; uint256 _toIdx = _fromIdx + _lockupReleases.length - 1; uint256 _lockupIdx; uint256 _refundIdx; for (uint256 i = 0; i < _lockupReleases.length; i++) { if (_lockupReleases[i] > block.timestamp) { // solium-disable-line security/no-block-members lockups[_who].push(Lockup(_lockupReleases[i], _lockupAmounts[i])); _balanceLokedUp = _balanceLokedUp.add(_lockupAmounts[i]); if (_refundable) { refundable[_who][_sender].push(Lockup(_lockupReleases[i], _lockupAmounts[i])); _lockupIdx = lockups[_who].length - 1; _refundIdx = refundable[_who][_sender].length - 1; indexes[_who][_sender][_refundIdx] = _lockupIdx; } } } require(_balanceLokedUp <= _amount, "Can't lockup more than transferred amount."); emit SetLockups(_who, _amount, _fromIdx, _toIdx); // solium-disable-line arg-overflow } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"}],"name":"reclaimToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_who","type":"address"}],"name":"balanceLockedUp","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"address"},{"name":"","type":"uint256"}],"name":"refundable","outputs":[{"name":"release","type":"uint256"},{"name":"amount","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"holders","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_contractAddr","type":"address"}],"name":"reclaimContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_who","type":"address"}],"name":"unAuthorize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_who","type":"address"},{"name":"_sender","type":"address"}],"name":"balanceRefundable","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_who","type":"address"}],"name":"balanceSpot","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_subtractedValue","type":"uint256"}],"name":"decreaseApproval","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"holdersCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_who","type":"address"}],"name":"hasLockups","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tge","type":"address"}],"name":"setTGE","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"reclaimEther","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"tge","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"},{"name":"_lockupReleases","type":"uint256[]"},{"name":"_lockupAmounts","type":"uint256[]"},{"name":"_refundable","type":"bool"}],"name":"transferWithLockup","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_who","type":"address"}],"name":"authorize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"name":"allocate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"authorized","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"},{"name":"_lockupReleases","type":"uint256[]"},{"name":"_lockupAmounts","type":"uint256[]"},{"name":"_refundable","type":"bool"}],"name":"transferFromWithLockup","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_from","type":"address"},{"name":"_value","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"tokenFallback","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"uint256"}],"name":"lockups","outputs":[{"name":"release","type":"uint256"},{"name":"amount","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_who","type":"address"}],"name":"lockupsCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"address"},{"name":"","type":"uint256"}],"name":"indexes","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_addedValue","type":"uint256"}],"name":"increaseApproval","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"","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":"","type":"address"}],"name":"holderNumber","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"}],"name":"refundLockedUp","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"payable":false,"stateMutability":"nonpayable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Allocate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"fromIdx","type":"uint256"},{"indexed":false,"name":"toIdx","type":"uint256"}],"name":"SetLockups","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Refund","type":"event"},{"anonymous":false,"inputs":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"who","type":"address"}],"name":"Authorize","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"who","type":"address"}],"name":"UnAuthorize","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"}],"name":"OwnershipRenounced","type":"event"},{"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":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"}]
Contract Creation Code
60806040526000600760006101000a81548160ff02191690831515021790555033600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060003414151561006f57600080fd5b614e1b8061007e6000396000f3006080604052600436106101f9576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde0314610208578063095ea7b31461029857806317ffc320146102fd57806318160ddd14610340578063197cb5bc1461036b57806323b872dd146103c257806329e59fdd146104475780632a11ced0146104cf5780632aed7f3f1461053c578063313ce5671461057f5780633bbbc7c9146105b05780633f4ba83a146105f3578063437650791461060a578063549767c7146106815780635c975abb146106d857806366188463146107075780636b4ed21b1461076c57806370a0823114610797578063715018a6146107ee57806372781402146108055780638456cb59146108605780638da5cb5b1461087757806392aa43c0146108ce57806395d89b41146109115780639f727c27146109a1578063a7497fa5146109b8578063a9059cbb14610a0f578063ab4fc4b614610a74578063b6a5d7de14610b6b578063b78b52df14610bae578063b918161114610bfb578063ba412af014610c56578063c0ee0b8a14610d6d578063c93d0b1e14610dd2578063d1a1ad8114610e3a578063d2849f6a14610e91578063d73dd62314610f12578063dd62ed3e14610f77578063f2fde38b14610fee578063fb6e655814611031578063ffafa20a14611088575b34801561020557600080fd5b50005b34801561021457600080fd5b5061021d6110df565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561025d578082015181840152602081019050610242565b50505050905090810190601f16801561028a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102a457600080fd5b506102e3600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611118565b604051808215151515815260200191505060405180910390f35b34801561030957600080fd5b5061033e600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061120a565b005b34801561034c57600080fd5b50610355611391565b6040518082815260200191505060405180910390f35b34801561037757600080fd5b506103ac600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061139b565b6040518082815260200191505060405180910390f35b3480156103ce57600080fd5b5061042d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506114e7565b604051808215151515815260200191505060405180910390f35b34801561045357600080fd5b506104b2600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506115c3565b604051808381526020018281526020019250505060405180910390f35b3480156104db57600080fd5b506104fa60048036038101908080359060200190929190505050611610565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561054857600080fd5b5061057d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061164e565b005b34801561058b57600080fd5b50610594611788565b604051808260ff1660ff16815260200191505060405180910390f35b3480156105bc57600080fd5b506105f1600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061178d565b005b3480156105ff57600080fd5b506106086119ed565b005b34801561061657600080fd5b5061066b600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611aad565b6040518082815260200191505060405180910390f35b34801561068d57600080fd5b506106c2600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611cbb565b6040518082815260200191505060405180910390f35b3480156106e457600080fd5b506106ed611cef565b604051808215151515815260200191505060405180910390f35b34801561071357600080fd5b50610752600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611d02565b604051808215151515815260200191505060405180910390f35b34801561077857600080fd5b50610781611f94565b6040518082815260200191505060405180910390f35b3480156107a357600080fd5b506107d8600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611fa1565b6040518082815260200191505060405180910390f35b3480156107fa57600080fd5b50610803611fe9565b005b34801561081157600080fd5b50610846600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506120ee565b604051808215151515815260200191505060405180910390f35b34801561086c57600080fd5b5061087561213c565b005b34801561088357600080fd5b5061088c6121fd565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156108da57600080fd5b5061090f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612223565b005b34801561091d57600080fd5b50610926612437565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561096657808201518184015260208101905061094b565b50505050905090810190601f1680156109935780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156109ad57600080fd5b506109b6612470565b005b3480156109c457600080fd5b506109cd61254e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610a1b57600080fd5b50610a5a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612574565b604051808215151515815260200191505060405180910390f35b348015610a8057600080fd5b50610b51600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091929192908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919291929080351515906020019092919050505061264e565b604051808215151515815260200191505060405180910390f35b348015610b7757600080fd5b50610bac600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061278a565b005b348015610bba57600080fd5b50610bf9600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506129eb565b005b348015610c0757600080fd5b50610c3c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612ec2565b604051808215151515815260200191505060405180910390f35b348015610c6257600080fd5b50610d53600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919291929080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509192919290803515159060200190929190505050612ee2565b604051808215151515815260200191505060405180910390f35b348015610d7957600080fd5b50610dd0600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001908201803590602001919091929391929390505050613020565b005b348015610dde57600080fd5b50610e1d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613025565b604051808381526020018281526020019250505060405180910390f35b348015610e4657600080fd5b50610e7b600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613065565b6040518082815260200191505060405180910390f35b348015610e9d57600080fd5b50610efc600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506130b1565b6040518082815260200191505060405180910390f35b348015610f1e57600080fd5b50610f5d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506130e3565b604051808215151515815260200191505060405180910390f35b348015610f8357600080fd5b50610fd8600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506132df565b6040518082815260200191505060405180910390f35b348015610ffa57600080fd5b5061102f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613366565b005b34801561103d57600080fd5b50611072600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506133ce565b6040518082815260200191505060405180910390f35b34801561109457600080fd5b506110c9600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506133e6565b6040518082815260200191505060405180910390f35b6040805190810160405280600c81526020017f506c6174696e20546f6b656e000000000000000000000000000000000000000081525081565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561126857600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561130357600080fd5b505af1158015611317573d6000803e3d6000fd5b505050506040513d602081101561132d57600080fd5b8101908080519060200190929190505050905061138d600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16828473ffffffffffffffffffffffffffffffffffffffff16613baf9092919063ffffffff16565b5050565b6000600154905090565b60008060008060009250600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509150600090505b818110156114dc5742600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110151561144457fe5b90600052602060002090600202016000015411156114cf576114cc600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811015156114ab57fe5b90600052602060002090600202016001015484613c9d90919063ffffffff16565b92505b80806001019150506113ef565b829350505050919050565b6000600760009054906101000a900460ff1615151561150557600080fd5b838261151082611cbb565b81111515156115ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b8152602001807f417474656d707420746f207472616e73666572206d6f7265207468616e20626181526020017f6c616e63652073706f742e00000000000000000000000000000000000000000081525060400191505060405180910390fd5b6115b8868686613cb9565b925050509392505050565b6009602052826000526040600020602052816000526040600020818154811015156115ea57fe5b906000526020600020906002020160009250925050508060000154908060010154905082565b60038181548110151561161f57fe5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156116ac57600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff1663f2fde38b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b15801561176c57600080fd5b505af1158015611780573d6000803e3d6000fd5b505050505050565b601281565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156117e957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561188e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f416464726573732063616e2774206265207a65726f2e0000000000000000000081525060200191505060405180910390fd5b600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151561194f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f41646472657373206973206e6f7420617574686f72697a65640000000000000081525060200191505060405180910390fd5b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167fe77f37c48f501330ec86b1d4a5bf8a0c82d425eb709250a12e874e18c4bb7eef60405160405180910390a250565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611a4957600080fd5b600760009054906101000a900460ff161515611a6457600080fd5b6000600760006101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b60008060008060009250600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905091506000821115611caf57600090505b81811015611cae5742600960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481101515611bd957fe5b9060005260206000209060020201600001541115611ca157611c9e600960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481101515611c7d57fe5b90600052602060002090600202016001015484613c9d90919063ffffffff16565b92505b8080600101915050611b47565b5b82935050505092915050565b600080611cc783611fa1565b9050611ce4611cd58461139b565b82613cda90919063ffffffff16565b905080915050919050565b600760009054906101000a900460ff1681565b600080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508083101515611e14576000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611ea8565b611e278382613cda90919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a3600191505092915050565b6000600380549050905090565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561204557600080fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482060405160405180910390a26000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600080600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050119050919050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561219857600080fd5b600760009054906101000a900460ff161515156121b457600080fd5b6001600760006101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561227f57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515612345576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f54474520697320616c7265616479207365742e0000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156123ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f54474520616464726573732063616e2774206265207a65726f2e00000000000081525060200191505060405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506124348161278a565b50565b6040805190810160405280600481526020017f50544e580000000000000000000000000000000000000000000000000000000081525081565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156124cc57600080fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f1935050505015801561254b573d6000803e3d6000fd5b50565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600760009054906101000a900460ff1615151561259257600080fd5b338261259d82611cbb565b811115151561263a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b8152602001807f417474656d707420746f207472616e73666572206d6f7265207468616e20626181526020017f6c616e63652073706f742e00000000000000000000000000000000000000000081525060400191505060405180910390fd5b6126448585613cf3565b9250505092915050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806126f55750600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1515612769576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f4e6f7420417574686f72697a65642e000000000000000000000000000000000081525060200191505060405180910390fd5b6127738686612574565b506127818686868686613d12565b95945050505050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156127e657600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561288b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f416464726573732063616e2774206265207a65726f2e0000000000000000000081525060200191505060405180910390fd5b600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151561294d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f416c726561647920617574686f72697a6564000000000000000000000000000081525060200191505060405180910390fd5b6001600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f6d81a01b39982517ba331aeb4f387b0f9cc32334b65bb9a343a077973cf7adf560405160405180910390a250565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612ab0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f4f6e6c7920544745206d6574686f642e0000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612b7b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f416c6c6f6361746520546f20616464726573732063616e2774206265207a657281526020017f6f0000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600081111515612bf3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f416c6c6f6361746520616d6f756e742073686f756c64206265203e20302e000081525060200191505060405180910390fd5b612c0881600154613c9d90919063ffffffff16565b600181905550612c5f816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c9d90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612caa826143ad565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663902d55a56040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015612d3057600080fd5b505af1158015612d44573d6000803e3d6000fd5b505050506040513d6020811015612d5a57600080fd5b810190808051906020019092919050505060015411151515612e0a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f43616e277420616c6c6f63617465206d6f7265207468616e20544f54414c205381526020017f5550504c592e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff167f249d8eb76d5a22983620d741de2470148d1a9a26ab923aec4262770690d11ebc826040518082815260200191505060405180910390a28173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b60066020528060005260406000206000915054906101000a900460ff1681565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612f895750600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1515612ffd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f4e6f7420417574686f72697a65642e000000000000000000000000000000000081525060200191505060405180910390fd5b6130088787876114e7565b506130168686868686613d12565b9695505050505050565b600080fd5b60086020528160005260406000208181548110151561304057fe5b9060005260206000209060020201600091509150508060000154908060010154905082565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050919050565b600a60205282600052604060002060205281600052604060002060205280600052604060002060009250925050505481565b600061317482600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c9d90919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156133c257600080fd5b6133cb816144a8565b50565b60046020528060005260406000206000915090505481565b600080600080600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806134945750600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1515613508576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f4e6f7420417574686f72697a65642e000000000000000000000000000000000081525060200191505060405180910390fd5b33945060009350600960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905092506000831115613ba257600090505b8281101561399c5742600960008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110151561363157fe5b906000526020600020906002020160000154111561398f576136f6600960008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811015156136d557fe5b90600052602060002090600202016001015485613c9d90919063ffffffff16565b93506000600960008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110151561378357fe5b9060005260206000209060020201600001819055506000600960008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110151561382357fe5b906000526020600020906002020160010181905550600a60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008281526020019081526020016000205491506000600860008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208381548110151561391657fe5b9060005260206000209060020201600001819055506000600860008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208381548110151561397957fe5b9060005260206000209060020201600101819055505b808060010191505061359f565b6000841115613ba1576139b08786866145a4565b613a01846000808a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613cda90919063ffffffff16565b6000808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613a94846000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c9d90919063ffffffff16565b6000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167ff40cc8c1a1d17359049ba500cfc894596a692cffc9d03943cd92ec2e159cf6ae866040518082815260200191505060405180910390a38473ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040518082815260200191505060405180910390a35b5b8395505050505050919050565b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015613c5257600080fd5b505af1158015613c66573d6000803e3d6000fd5b505050506040513d6020811015613c7c57600080fd5b81019080805190602001909291905050501515613c9857600080fd5b505050565b60008183019050828110151515613cb057fe5b80905092915050565b6000613cc68484846145a4565b613cd18484846145df565b90509392505050565b6000828211151515613ce857fe5b818303905092915050565b6000613d003384846145a4565b613d0a838361499a565b905092915050565b600080600080600080600088518a51141515613dbc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c8152602001807f4c656e677468206f66206c6f636b75702072656c656173657320616e6420616d81526020017f6f756e7473206c697374732073686f756c6420626520657175616c2e0000000081525060400191505060405180910390fd5b6103e8613e15600860008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490508c51613c9d90919063ffffffff16565b11151515613eb1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001807f43616e2774206265206d6f7265207468616e2031303030206c6f636b7570732081526020017f70657220616464726573732e000000000000000000000000000000000000000081525060400191505060405180910390fd5b60008a51111561439f5760009650339550600860008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050945060018a518601039350600090505b89518110156142a257428a82815181101515613f2d57fe5b90602001906020020151111561429557600860008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060408051908101604052808c84815181101515613f9557fe5b9060200190602002015181526020018b84815181101515613fb257fe5b9060200190602002015181525090806001815401808255809150509060018203906000526020600020906002020160009091929091909150600082015181600001556020820151816001015550505061402b898281518110151561401257fe5b9060200190602002015188613c9d90919063ffffffff16565b9650871561429457600960008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060408051908101604052808c848151811015156140c857fe5b9060200190602002015181526020018b848151811015156140e557fe5b906020019060200201518152509080600181540180825580915050906001820390600052602060002090600202016000909192909190915060008201518160000155602082015181600101555050506001600860008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490500392506001600960008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905003915082600a60008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020819055505b5b8080600101915050613f15565b8a8711151515614340576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001807f43616e2774206c6f636b7570206d6f7265207468616e207472616e736665727281526020017f656420616d6f756e742e0000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8b73ffffffffffffffffffffffffffffffffffffffff167fafaf6b19e4b979c517c1dbda2afce8c62c629fddc148afcedeb73cb4caf8825b8c878760405180848152602001838152602001828152602001935050505060405180910390a25b505050505050505050505050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414156144a55760038190806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050600380549050600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b50565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156144e457600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6145ad826143ad565b60006145ca826145bc86611fa1565b613cda90919063ffffffff16565b14156145da576145d983614bba565b5b505050565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115151561462e57600080fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111515156146b957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141515156146f557600080fd5b614746826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613cda90919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506147d9826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c9d90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506148aa82600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613cda90919063ffffffff16565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b60008060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111515156149e957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515614a2557600080fd5b614a76826000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613cda90919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614b09826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c9d90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b600080600080600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205493506000841480614c1657506000600380549050145b80614c25575060038054905084115b15614c2f57614d97565b614c43600185613cda90919063ffffffff16565b9250614c5e6001600380549050613cda90919063ffffffff16565b9150600382815481101515614c6f57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508183141515614d425780600384815481101515614cb557fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6000600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600381614d959190614d9e565b505b5050505050565b815481835581811115614dc557818360005260206000209182019101614dc49190614dca565b5b505050565b614dec91905b80821115614de8576000816000905550600101614dd0565b5090565b905600a165627a7a7230582017386ed75286216469fd26a4d49c410d1a84c8c920e5356e9121a27ab970c1e10029
Deployed Bytecode
0x6080604052600436106101f9576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde0314610208578063095ea7b31461029857806317ffc320146102fd57806318160ddd14610340578063197cb5bc1461036b57806323b872dd146103c257806329e59fdd146104475780632a11ced0146104cf5780632aed7f3f1461053c578063313ce5671461057f5780633bbbc7c9146105b05780633f4ba83a146105f3578063437650791461060a578063549767c7146106815780635c975abb146106d857806366188463146107075780636b4ed21b1461076c57806370a0823114610797578063715018a6146107ee57806372781402146108055780638456cb59146108605780638da5cb5b1461087757806392aa43c0146108ce57806395d89b41146109115780639f727c27146109a1578063a7497fa5146109b8578063a9059cbb14610a0f578063ab4fc4b614610a74578063b6a5d7de14610b6b578063b78b52df14610bae578063b918161114610bfb578063ba412af014610c56578063c0ee0b8a14610d6d578063c93d0b1e14610dd2578063d1a1ad8114610e3a578063d2849f6a14610e91578063d73dd62314610f12578063dd62ed3e14610f77578063f2fde38b14610fee578063fb6e655814611031578063ffafa20a14611088575b34801561020557600080fd5b50005b34801561021457600080fd5b5061021d6110df565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561025d578082015181840152602081019050610242565b50505050905090810190601f16801561028a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102a457600080fd5b506102e3600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611118565b604051808215151515815260200191505060405180910390f35b34801561030957600080fd5b5061033e600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061120a565b005b34801561034c57600080fd5b50610355611391565b6040518082815260200191505060405180910390f35b34801561037757600080fd5b506103ac600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061139b565b6040518082815260200191505060405180910390f35b3480156103ce57600080fd5b5061042d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506114e7565b604051808215151515815260200191505060405180910390f35b34801561045357600080fd5b506104b2600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506115c3565b604051808381526020018281526020019250505060405180910390f35b3480156104db57600080fd5b506104fa60048036038101908080359060200190929190505050611610565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561054857600080fd5b5061057d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061164e565b005b34801561058b57600080fd5b50610594611788565b604051808260ff1660ff16815260200191505060405180910390f35b3480156105bc57600080fd5b506105f1600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061178d565b005b3480156105ff57600080fd5b506106086119ed565b005b34801561061657600080fd5b5061066b600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611aad565b6040518082815260200191505060405180910390f35b34801561068d57600080fd5b506106c2600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611cbb565b6040518082815260200191505060405180910390f35b3480156106e457600080fd5b506106ed611cef565b604051808215151515815260200191505060405180910390f35b34801561071357600080fd5b50610752600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611d02565b604051808215151515815260200191505060405180910390f35b34801561077857600080fd5b50610781611f94565b6040518082815260200191505060405180910390f35b3480156107a357600080fd5b506107d8600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611fa1565b6040518082815260200191505060405180910390f35b3480156107fa57600080fd5b50610803611fe9565b005b34801561081157600080fd5b50610846600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506120ee565b604051808215151515815260200191505060405180910390f35b34801561086c57600080fd5b5061087561213c565b005b34801561088357600080fd5b5061088c6121fd565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156108da57600080fd5b5061090f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612223565b005b34801561091d57600080fd5b50610926612437565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561096657808201518184015260208101905061094b565b50505050905090810190601f1680156109935780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156109ad57600080fd5b506109b6612470565b005b3480156109c457600080fd5b506109cd61254e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610a1b57600080fd5b50610a5a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612574565b604051808215151515815260200191505060405180910390f35b348015610a8057600080fd5b50610b51600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091929192908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919291929080351515906020019092919050505061264e565b604051808215151515815260200191505060405180910390f35b348015610b7757600080fd5b50610bac600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061278a565b005b348015610bba57600080fd5b50610bf9600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506129eb565b005b348015610c0757600080fd5b50610c3c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612ec2565b604051808215151515815260200191505060405180910390f35b348015610c6257600080fd5b50610d53600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919291929080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509192919290803515159060200190929190505050612ee2565b604051808215151515815260200191505060405180910390f35b348015610d7957600080fd5b50610dd0600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001908201803590602001919091929391929390505050613020565b005b348015610dde57600080fd5b50610e1d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613025565b604051808381526020018281526020019250505060405180910390f35b348015610e4657600080fd5b50610e7b600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613065565b6040518082815260200191505060405180910390f35b348015610e9d57600080fd5b50610efc600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506130b1565b6040518082815260200191505060405180910390f35b348015610f1e57600080fd5b50610f5d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506130e3565b604051808215151515815260200191505060405180910390f35b348015610f8357600080fd5b50610fd8600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506132df565b6040518082815260200191505060405180910390f35b348015610ffa57600080fd5b5061102f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613366565b005b34801561103d57600080fd5b50611072600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506133ce565b6040518082815260200191505060405180910390f35b34801561109457600080fd5b506110c9600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506133e6565b6040518082815260200191505060405180910390f35b6040805190810160405280600c81526020017f506c6174696e20546f6b656e000000000000000000000000000000000000000081525081565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561126857600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561130357600080fd5b505af1158015611317573d6000803e3d6000fd5b505050506040513d602081101561132d57600080fd5b8101908080519060200190929190505050905061138d600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16828473ffffffffffffffffffffffffffffffffffffffff16613baf9092919063ffffffff16565b5050565b6000600154905090565b60008060008060009250600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509150600090505b818110156114dc5742600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110151561144457fe5b90600052602060002090600202016000015411156114cf576114cc600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811015156114ab57fe5b90600052602060002090600202016001015484613c9d90919063ffffffff16565b92505b80806001019150506113ef565b829350505050919050565b6000600760009054906101000a900460ff1615151561150557600080fd5b838261151082611cbb565b81111515156115ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b8152602001807f417474656d707420746f207472616e73666572206d6f7265207468616e20626181526020017f6c616e63652073706f742e00000000000000000000000000000000000000000081525060400191505060405180910390fd5b6115b8868686613cb9565b925050509392505050565b6009602052826000526040600020602052816000526040600020818154811015156115ea57fe5b906000526020600020906002020160009250925050508060000154908060010154905082565b60038181548110151561161f57fe5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156116ac57600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff1663f2fde38b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b15801561176c57600080fd5b505af1158015611780573d6000803e3d6000fd5b505050505050565b601281565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156117e957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561188e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f416464726573732063616e2774206265207a65726f2e0000000000000000000081525060200191505060405180910390fd5b600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151561194f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f41646472657373206973206e6f7420617574686f72697a65640000000000000081525060200191505060405180910390fd5b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167fe77f37c48f501330ec86b1d4a5bf8a0c82d425eb709250a12e874e18c4bb7eef60405160405180910390a250565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611a4957600080fd5b600760009054906101000a900460ff161515611a6457600080fd5b6000600760006101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b60008060008060009250600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905091506000821115611caf57600090505b81811015611cae5742600960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481101515611bd957fe5b9060005260206000209060020201600001541115611ca157611c9e600960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481101515611c7d57fe5b90600052602060002090600202016001015484613c9d90919063ffffffff16565b92505b8080600101915050611b47565b5b82935050505092915050565b600080611cc783611fa1565b9050611ce4611cd58461139b565b82613cda90919063ffffffff16565b905080915050919050565b600760009054906101000a900460ff1681565b600080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508083101515611e14576000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611ea8565b611e278382613cda90919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a3600191505092915050565b6000600380549050905090565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561204557600080fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482060405160405180910390a26000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600080600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050119050919050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561219857600080fd5b600760009054906101000a900460ff161515156121b457600080fd5b6001600760006101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561227f57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515612345576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f54474520697320616c7265616479207365742e0000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156123ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f54474520616464726573732063616e2774206265207a65726f2e00000000000081525060200191505060405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506124348161278a565b50565b6040805190810160405280600481526020017f50544e580000000000000000000000000000000000000000000000000000000081525081565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156124cc57600080fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f1935050505015801561254b573d6000803e3d6000fd5b50565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600760009054906101000a900460ff1615151561259257600080fd5b338261259d82611cbb565b811115151561263a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b8152602001807f417474656d707420746f207472616e73666572206d6f7265207468616e20626181526020017f6c616e63652073706f742e00000000000000000000000000000000000000000081525060400191505060405180910390fd5b6126448585613cf3565b9250505092915050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806126f55750600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1515612769576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f4e6f7420417574686f72697a65642e000000000000000000000000000000000081525060200191505060405180910390fd5b6127738686612574565b506127818686868686613d12565b95945050505050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156127e657600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561288b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f416464726573732063616e2774206265207a65726f2e0000000000000000000081525060200191505060405180910390fd5b600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151561294d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f416c726561647920617574686f72697a6564000000000000000000000000000081525060200191505060405180910390fd5b6001600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f6d81a01b39982517ba331aeb4f387b0f9cc32334b65bb9a343a077973cf7adf560405160405180910390a250565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612ab0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f4f6e6c7920544745206d6574686f642e0000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612b7b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f416c6c6f6361746520546f20616464726573732063616e2774206265207a657281526020017f6f0000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600081111515612bf3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f416c6c6f6361746520616d6f756e742073686f756c64206265203e20302e000081525060200191505060405180910390fd5b612c0881600154613c9d90919063ffffffff16565b600181905550612c5f816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c9d90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612caa826143ad565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663902d55a56040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015612d3057600080fd5b505af1158015612d44573d6000803e3d6000fd5b505050506040513d6020811015612d5a57600080fd5b810190808051906020019092919050505060015411151515612e0a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f43616e277420616c6c6f63617465206d6f7265207468616e20544f54414c205381526020017f5550504c592e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff167f249d8eb76d5a22983620d741de2470148d1a9a26ab923aec4262770690d11ebc826040518082815260200191505060405180910390a28173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b60066020528060005260406000206000915054906101000a900460ff1681565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612f895750600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1515612ffd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f4e6f7420417574686f72697a65642e000000000000000000000000000000000081525060200191505060405180910390fd5b6130088787876114e7565b506130168686868686613d12565b9695505050505050565b600080fd5b60086020528160005260406000208181548110151561304057fe5b9060005260206000209060020201600091509150508060000154908060010154905082565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050919050565b600a60205282600052604060002060205281600052604060002060205280600052604060002060009250925050505481565b600061317482600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c9d90919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156133c257600080fd5b6133cb816144a8565b50565b60046020528060005260406000206000915090505481565b600080600080600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806134945750600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1515613508576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f4e6f7420417574686f72697a65642e000000000000000000000000000000000081525060200191505060405180910390fd5b33945060009350600960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905092506000831115613ba257600090505b8281101561399c5742600960008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110151561363157fe5b906000526020600020906002020160000154111561398f576136f6600960008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811015156136d557fe5b90600052602060002090600202016001015485613c9d90919063ffffffff16565b93506000600960008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110151561378357fe5b9060005260206000209060020201600001819055506000600960008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110151561382357fe5b906000526020600020906002020160010181905550600a60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008281526020019081526020016000205491506000600860008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208381548110151561391657fe5b9060005260206000209060020201600001819055506000600860008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208381548110151561397957fe5b9060005260206000209060020201600101819055505b808060010191505061359f565b6000841115613ba1576139b08786866145a4565b613a01846000808a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613cda90919063ffffffff16565b6000808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613a94846000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c9d90919063ffffffff16565b6000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167ff40cc8c1a1d17359049ba500cfc894596a692cffc9d03943cd92ec2e159cf6ae866040518082815260200191505060405180910390a38473ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040518082815260200191505060405180910390a35b5b8395505050505050919050565b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015613c5257600080fd5b505af1158015613c66573d6000803e3d6000fd5b505050506040513d6020811015613c7c57600080fd5b81019080805190602001909291905050501515613c9857600080fd5b505050565b60008183019050828110151515613cb057fe5b80905092915050565b6000613cc68484846145a4565b613cd18484846145df565b90509392505050565b6000828211151515613ce857fe5b818303905092915050565b6000613d003384846145a4565b613d0a838361499a565b905092915050565b600080600080600080600088518a51141515613dbc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c8152602001807f4c656e677468206f66206c6f636b75702072656c656173657320616e6420616d81526020017f6f756e7473206c697374732073686f756c6420626520657175616c2e0000000081525060400191505060405180910390fd5b6103e8613e15600860008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490508c51613c9d90919063ffffffff16565b11151515613eb1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001807f43616e2774206265206d6f7265207468616e2031303030206c6f636b7570732081526020017f70657220616464726573732e000000000000000000000000000000000000000081525060400191505060405180910390fd5b60008a51111561439f5760009650339550600860008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050945060018a518601039350600090505b89518110156142a257428a82815181101515613f2d57fe5b90602001906020020151111561429557600860008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060408051908101604052808c84815181101515613f9557fe5b9060200190602002015181526020018b84815181101515613fb257fe5b9060200190602002015181525090806001815401808255809150509060018203906000526020600020906002020160009091929091909150600082015181600001556020820151816001015550505061402b898281518110151561401257fe5b9060200190602002015188613c9d90919063ffffffff16565b9650871561429457600960008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060408051908101604052808c848151811015156140c857fe5b9060200190602002015181526020018b848151811015156140e557fe5b906020019060200201518152509080600181540180825580915050906001820390600052602060002090600202016000909192909190915060008201518160000155602082015181600101555050506001600860008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490500392506001600960008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905003915082600a60008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020819055505b5b8080600101915050613f15565b8a8711151515614340576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001807f43616e2774206c6f636b7570206d6f7265207468616e207472616e736665727281526020017f656420616d6f756e742e0000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8b73ffffffffffffffffffffffffffffffffffffffff167fafaf6b19e4b979c517c1dbda2afce8c62c629fddc148afcedeb73cb4caf8825b8c878760405180848152602001838152602001828152602001935050505060405180910390a25b505050505050505050505050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414156144a55760038190806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050600380549050600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b50565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156144e457600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6145ad826143ad565b60006145ca826145bc86611fa1565b613cda90919063ffffffff16565b14156145da576145d983614bba565b5b505050565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115151561462e57600080fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111515156146b957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141515156146f557600080fd5b614746826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613cda90919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506147d9826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c9d90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506148aa82600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613cda90919063ffffffff16565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b60008060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111515156149e957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515614a2557600080fd5b614a76826000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613cda90919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614b09826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c9d90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b600080600080600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205493506000841480614c1657506000600380549050145b80614c25575060038054905084115b15614c2f57614d97565b614c43600185613cda90919063ffffffff16565b9250614c5e6001600380549050613cda90919063ffffffff16565b9150600382815481101515614c6f57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508183141515614d425780600384815481101515614cb557fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6000600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600381614d959190614d9e565b505b5050505050565b815481835581811115614dc557818360005260206000209182019101614dc49190614dca565b5b505050565b614dec91905b80821115614de8576000816000905550600101614dd0565b5090565b905600a165627a7a7230582017386ed75286216469fd26a4d49c410d1a84c8c920e5356e9121a27ab970c1e10029
Swarm Source
bzzr://17386ed75286216469fd26a4d49c410d1a84c8c920e5356e9121a27ab970c1e1
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.