ETH Price: $3,276.06 (-3.94%)
Gas: 16 Gwei

Token

Landemic (LAND)
 

Overview

Max Total Supply

14,074 LAND

Holders

139

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
mkdragon.eth
Balance
42 LAND
0xA0ab8Eddf14a5174688E2eb1bdb69CDF377142C3
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Landemic

Compiler Version
v0.4.24+commit.e67f0147

Optimization Enabled:
Yes with 10000 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2019-08-01
*/

// File: openzeppelin-solidity/contracts/introspection/IERC165.sol

pragma solidity ^0.4.24;

/**
 * @title IERC165
 * @dev https://github.com/ethereum/EIPs/blob/master/EIPS/eip-165.md
 */
interface IERC165 {

  /**
   * @notice Query if a contract implements an interface
   * @param interfaceId The interface identifier, as specified in ERC-165
   * @dev Interface identification is specified in ERC-165. This function
   * uses less than 30,000 gas.
   */
  function supportsInterface(bytes4 interfaceId)
    external
    view
    returns (bool);
}

// File: openzeppelin-solidity/contracts/token/ERC721/IERC721.sol

pragma solidity ^0.4.24;


/**
 * @title ERC721 Non-Fungible Token Standard basic interface
 * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract IERC721 is IERC165 {

  event Transfer(
    address indexed from,
    address indexed to,
    uint256 indexed tokenId
  );
  event Approval(
    address indexed owner,
    address indexed approved,
    uint256 indexed tokenId
  );
  event ApprovalForAll(
    address indexed owner,
    address indexed operator,
    bool approved
  );

  function balanceOf(address owner) public view returns (uint256 balance);
  function ownerOf(uint256 tokenId) public view returns (address owner);

  function approve(address to, uint256 tokenId) public;
  function getApproved(uint256 tokenId)
    public view returns (address operator);

  function setApprovalForAll(address operator, bool _approved) public;
  function isApprovedForAll(address owner, address operator)
    public view returns (bool);

  function transferFrom(address from, address to, uint256 tokenId) public;
  function safeTransferFrom(address from, address to, uint256 tokenId)
    public;

  function safeTransferFrom(
    address from,
    address to,
    uint256 tokenId,
    bytes data
  )
    public;
}

// File: openzeppelin-solidity/contracts/token/ERC721/IERC721Receiver.sol

pragma solidity ^0.4.24;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
contract IERC721Receiver {
  /**
   * @notice Handle the receipt of an NFT
   * @dev The ERC721 smart contract calls this function on the recipient
   * after a `safeTransfer`. This function MUST return the function selector,
   * otherwise the caller will revert the transaction. The selector to be
   * returned can be obtained as `this.onERC721Received.selector`. This
   * function MAY throw to revert and reject the transfer.
   * Note: the ERC721 contract address is always the message sender.
   * @param operator The address which called `safeTransferFrom` function
   * @param from The address which previously owned the token
   * @param tokenId The NFT identifier which is being transferred
   * @param data Additional data with no specified format
   * @return `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
   */
  function onERC721Received(
    address operator,
    address from,
    uint256 tokenId,
    bytes data
  )
    public
    returns(bytes4);
}

// File: openzeppelin-solidity/contracts/math/SafeMath.sol

pragma solidity ^0.4.24;

/**
 * @title SafeMath
 * @dev Math operations with safety checks that revert on error
 */
library SafeMath {

  /**
  * @dev Multiplies two numbers, reverts on overflow.
  */
  function mul(uint256 a, uint256 b) internal pure returns (uint256) {
    // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
    // benefit is lost if 'b' is also tested.
    // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
    if (a == 0) {
      return 0;
    }

    uint256 c = a * b;
    require(c / a == b);

    return c;
  }

  /**
  * @dev Integer division of two numbers truncating the quotient, reverts on division by zero.
  */
  function div(uint256 a, uint256 b) internal pure returns (uint256) {
    require(b > 0); // Solidity only automatically asserts when dividing by 0
    uint256 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold

    return c;
  }

  /**
  * @dev Subtracts two numbers, reverts on overflow (i.e. if subtrahend is greater than minuend).
  */
  function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    require(b <= a);
    uint256 c = a - b;

    return c;
  }

  /**
  * @dev Adds two numbers, reverts on overflow.
  */
  function add(uint256 a, uint256 b) internal pure returns (uint256) {
    uint256 c = a + b;
    require(c >= a);

    return c;
  }

  /**
  * @dev Divides two numbers and returns the remainder (unsigned integer modulo),
  * reverts when dividing by zero.
  */
  function mod(uint256 a, uint256 b) internal pure returns (uint256) {
    require(b != 0);
    return a % b;
  }
}

// File: openzeppelin-solidity/contracts/utils/Address.sol

pragma solidity ^0.4.24;

/**
 * Utility library of inline functions on addresses
 */
library Address {

  /**
   * Returns whether the target address is a contract
   * @dev This function will return false if invoked during the constructor of a contract,
   * as the code is not actually created until after the constructor finishes.
   * @param account address of the account to check
   * @return whether the target address is a contract
   */
  function isContract(address account) internal view returns (bool) {
    uint256 size;
    // XXX Currently there is no better way to check if there is a contract in an address
    // than to check the size of the code at that address.
    // See https://ethereum.stackexchange.com/a/14016/36603
    // for more details about how this works.
    // TODO Check this again before the Serenity release, because all addresses will be
    // contracts then.
    // solium-disable-next-line security/no-inline-assembly
    assembly { size := extcodesize(account) }
    return size > 0;
  }

}

// File: openzeppelin-solidity/contracts/introspection/ERC165.sol

pragma solidity ^0.4.24;


/**
 * @title ERC165
 * @author Matt Condon (@shrugs)
 * @dev Implements ERC165 using a lookup table.
 */
contract ERC165 is IERC165 {

  bytes4 private constant _InterfaceId_ERC165 = 0x01ffc9a7;
  /**
   * 0x01ffc9a7 ===
   *   bytes4(keccak256('supportsInterface(bytes4)'))
   */

  /**
   * @dev a mapping of interface id to whether or not it's supported
   */
  mapping(bytes4 => bool) private _supportedInterfaces;

  /**
   * @dev A contract implementing SupportsInterfaceWithLookup
   * implement ERC165 itself
   */
  constructor()
    internal
  {
    _registerInterface(_InterfaceId_ERC165);
  }

  /**
   * @dev implement supportsInterface(bytes4) using a lookup table
   */
  function supportsInterface(bytes4 interfaceId)
    external
    view
    returns (bool)
  {
    return _supportedInterfaces[interfaceId];
  }

  /**
   * @dev internal method for registering an interface
   */
  function _registerInterface(bytes4 interfaceId)
    internal
  {
    require(interfaceId != 0xffffffff);
    _supportedInterfaces[interfaceId] = true;
  }
}

// File: openzeppelin-solidity/contracts/token/ERC721/ERC721.sol

pragma solidity ^0.4.24;






/**
 * @title ERC721 Non-Fungible Token Standard basic implementation
 * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721 is ERC165, IERC721 {

  using SafeMath for uint256;
  using Address for address;

  // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
  // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector`
  bytes4 private constant _ERC721_RECEIVED = 0x150b7a02;

  // Mapping from token ID to owner
  mapping (uint256 => address) private _tokenOwner;

  // Mapping from token ID to approved address
  mapping (uint256 => address) private _tokenApprovals;

  // Mapping from owner to number of owned token
  mapping (address => uint256) private _ownedTokensCount;

  // Mapping from owner to operator approvals
  mapping (address => mapping (address => bool)) private _operatorApprovals;

  bytes4 private constant _InterfaceId_ERC721 = 0x80ac58cd;
  /*
   * 0x80ac58cd ===
   *   bytes4(keccak256('balanceOf(address)')) ^
   *   bytes4(keccak256('ownerOf(uint256)')) ^
   *   bytes4(keccak256('approve(address,uint256)')) ^
   *   bytes4(keccak256('getApproved(uint256)')) ^
   *   bytes4(keccak256('setApprovalForAll(address,bool)')) ^
   *   bytes4(keccak256('isApprovedForAll(address,address)')) ^
   *   bytes4(keccak256('transferFrom(address,address,uint256)')) ^
   *   bytes4(keccak256('safeTransferFrom(address,address,uint256)')) ^
   *   bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)'))
   */

  constructor()
    public
  {
    // register the supported interfaces to conform to ERC721 via ERC165
    _registerInterface(_InterfaceId_ERC721);
  }

  /**
   * @dev Gets the balance of the specified address
   * @param owner address to query the balance of
   * @return uint256 representing the amount owned by the passed address
   */
  function balanceOf(address owner) public view returns (uint256) {
    require(owner != address(0));
    return _ownedTokensCount[owner];
  }

  /**
   * @dev Gets the owner of the specified token ID
   * @param tokenId uint256 ID of the token to query the owner of
   * @return owner address currently marked as the owner of the given token ID
   */
  function ownerOf(uint256 tokenId) public view returns (address) {
    address owner = _tokenOwner[tokenId];
    require(owner != address(0));
    return owner;
  }

  /**
   * @dev Approves another address to transfer the given token ID
   * The zero address indicates there is no approved address.
   * There can only be one approved address per token at a given time.
   * Can only be called by the token owner or an approved operator.
   * @param to address to be approved for the given token ID
   * @param tokenId uint256 ID of the token to be approved
   */
  function approve(address to, uint256 tokenId) public {
    address owner = ownerOf(tokenId);
    require(to != owner);
    require(msg.sender == owner || isApprovedForAll(owner, msg.sender));

    _tokenApprovals[tokenId] = to;
    emit Approval(owner, to, tokenId);
  }

  /**
   * @dev Gets the approved address for a token ID, or zero if no address set
   * Reverts if the token ID does not exist.
   * @param tokenId uint256 ID of the token to query the approval of
   * @return address currently approved for the given token ID
   */
  function getApproved(uint256 tokenId) public view returns (address) {
    require(_exists(tokenId));
    return _tokenApprovals[tokenId];
  }

  /**
   * @dev Sets or unsets the approval of a given operator
   * An operator is allowed to transfer all tokens of the sender on their behalf
   * @param to operator address to set the approval
   * @param approved representing the status of the approval to be set
   */
  function setApprovalForAll(address to, bool approved) public {
    require(to != msg.sender);
    _operatorApprovals[msg.sender][to] = approved;
    emit ApprovalForAll(msg.sender, to, approved);
  }

  /**
   * @dev Tells whether an operator is approved by a given owner
   * @param owner owner address which you want to query the approval of
   * @param operator operator address which you want to query the approval of
   * @return bool whether the given operator is approved by the given owner
   */
  function isApprovedForAll(
    address owner,
    address operator
  )
    public
    view
    returns (bool)
  {
    return _operatorApprovals[owner][operator];
  }

  /**
   * @dev Transfers the ownership of a given token ID to another address
   * Usage of this method is discouraged, use `safeTransferFrom` whenever possible
   * Requires the msg sender to be the owner, approved, or operator
   * @param from current owner of the token
   * @param to address to receive the ownership of the given token ID
   * @param tokenId uint256 ID of the token to be transferred
  */
  function transferFrom(
    address from,
    address to,
    uint256 tokenId
  )
    public
  {
    require(_isApprovedOrOwner(msg.sender, tokenId));
    require(to != address(0));

    _clearApproval(from, tokenId);
    _removeTokenFrom(from, tokenId);
    _addTokenTo(to, tokenId);

    emit Transfer(from, to, tokenId);
  }

  /**
   * @dev Safely transfers the ownership of a given token ID to another address
   * If the target address is a contract, it must implement `onERC721Received`,
   * which is called upon a safe transfer, and return the magic value
   * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
   * the transfer is reverted.
   *
   * Requires the msg sender to be the owner, approved, or operator
   * @param from current owner of the token
   * @param to address to receive the ownership of the given token ID
   * @param tokenId uint256 ID of the token to be transferred
  */
  function safeTransferFrom(
    address from,
    address to,
    uint256 tokenId
  )
    public
  {
    // solium-disable-next-line arg-overflow
    safeTransferFrom(from, to, tokenId, "");
  }

  /**
   * @dev Safely transfers the ownership of a given token ID to another address
   * If the target address is a contract, it must implement `onERC721Received`,
   * which is called upon a safe transfer, and return the magic value
   * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
   * the transfer is reverted.
   * Requires the msg sender to be the owner, approved, or operator
   * @param from current owner of the token
   * @param to address to receive the ownership of the given token ID
   * @param tokenId uint256 ID of the token to be transferred
   * @param _data bytes data to send along with a safe transfer check
   */
  function safeTransferFrom(
    address from,
    address to,
    uint256 tokenId,
    bytes _data
  )
    public
  {
    transferFrom(from, to, tokenId);
    // solium-disable-next-line arg-overflow
    require(_checkOnERC721Received(from, to, tokenId, _data));
  }

  /**
   * @dev Returns whether the specified token exists
   * @param tokenId uint256 ID of the token to query the existence of
   * @return whether the token exists
   */
  function _exists(uint256 tokenId) internal view returns (bool) {
    address owner = _tokenOwner[tokenId];
    return owner != address(0);
  }

  /**
   * @dev Returns whether the given spender can transfer a given token ID
   * @param spender address of the spender to query
   * @param tokenId uint256 ID of the token to be transferred
   * @return bool whether the msg.sender is approved for the given token ID,
   *  is an operator of the owner, or is the owner of the token
   */
  function _isApprovedOrOwner(
    address spender,
    uint256 tokenId
  )
    internal
    view
    returns (bool)
  {
    address owner = ownerOf(tokenId);
    // Disable solium check because of
    // https://github.com/duaraghav8/Solium/issues/175
    // solium-disable-next-line operator-whitespace
    return (
      spender == owner ||
      getApproved(tokenId) == spender ||
      isApprovedForAll(owner, spender)
    );
  }

  /**
   * @dev Internal function to mint a new token
   * Reverts if the given token ID already exists
   * @param to The address that will own the minted token
   * @param tokenId uint256 ID of the token to be minted by the msg.sender
   */
  function _mint(address to, uint256 tokenId) internal {
    require(to != address(0));
    _addTokenTo(to, tokenId);
    emit Transfer(address(0), to, tokenId);
  }

  /**
   * @dev Internal function to burn a specific token
   * Reverts if the token does not exist
   * @param tokenId uint256 ID of the token being burned by the msg.sender
   */
  function _burn(address owner, uint256 tokenId) internal {
    _clearApproval(owner, tokenId);
    _removeTokenFrom(owner, tokenId);
    emit Transfer(owner, address(0), tokenId);
  }

  /**
   * @dev Internal function to add a token ID to the list of a given address
   * Note that this function is left internal to make ERC721Enumerable possible, but is not
   * intended to be called by custom derived contracts: in particular, it emits no Transfer event.
   * @param to address representing the new owner of the given token ID
   * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
   */
  function _addTokenTo(address to, uint256 tokenId) internal {
    require(_tokenOwner[tokenId] == address(0));
    _tokenOwner[tokenId] = to;
    _ownedTokensCount[to] = _ownedTokensCount[to].add(1);
  }

  /**
   * @dev Internal function to remove a token ID from the list of a given address
   * Note that this function is left internal to make ERC721Enumerable possible, but is not
   * intended to be called by custom derived contracts: in particular, it emits no Transfer event,
   * and doesn't clear approvals.
   * @param from address representing the previous owner of the given token ID
   * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
   */
  function _removeTokenFrom(address from, uint256 tokenId) internal {
    require(ownerOf(tokenId) == from);
    _ownedTokensCount[from] = _ownedTokensCount[from].sub(1);
    _tokenOwner[tokenId] = address(0);
  }

  /**
   * @dev Internal function to invoke `onERC721Received` on a target address
   * The call is not executed if the target address is not a contract
   * @param from address representing the previous owner of the given token ID
   * @param to target address that will receive the tokens
   * @param tokenId uint256 ID of the token to be transferred
   * @param _data bytes optional data to send along with the call
   * @return whether the call correctly returned the expected magic value
   */
  function _checkOnERC721Received(
    address from,
    address to,
    uint256 tokenId,
    bytes _data
  )
    internal
    returns (bool)
  {
    if (!to.isContract()) {
      return true;
    }
    bytes4 retval = IERC721Receiver(to).onERC721Received(
      msg.sender, from, tokenId, _data);
    return (retval == _ERC721_RECEIVED);
  }

  /**
   * @dev Private function to clear current approval of a given token ID
   * Reverts if the given address is not indeed the owner of the token
   * @param owner owner of the token
   * @param tokenId uint256 ID of the token to be transferred
   */
  function _clearApproval(address owner, uint256 tokenId) private {
    require(ownerOf(tokenId) == owner);
    if (_tokenApprovals[tokenId] != address(0)) {
      _tokenApprovals[tokenId] = address(0);
    }
  }
}

// File: openzeppelin-solidity/contracts/token/ERC721/IERC721Enumerable.sol

pragma solidity ^0.4.24;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract IERC721Enumerable is IERC721 {
  function totalSupply() public view returns (uint256);
  function tokenOfOwnerByIndex(
    address owner,
    uint256 index
  )
    public
    view
    returns (uint256 tokenId);

  function tokenByIndex(uint256 index) public view returns (uint256);
}

// File: openzeppelin-solidity/contracts/token/ERC721/ERC721Enumerable.sol

pragma solidity ^0.4.24;




contract ERC721Enumerable is ERC165, ERC721, IERC721Enumerable {
  // Mapping from owner to list of owned token IDs
  mapping(address => uint256[]) private _ownedTokens;

  // Mapping from token ID to index of the owner tokens list
  mapping(uint256 => uint256) private _ownedTokensIndex;

  // Array with all token ids, used for enumeration
  uint256[] private _allTokens;

  // Mapping from token id to position in the allTokens array
  mapping(uint256 => uint256) private _allTokensIndex;

  bytes4 private constant _InterfaceId_ERC721Enumerable = 0x780e9d63;
  /**
   * 0x780e9d63 ===
   *   bytes4(keccak256('totalSupply()')) ^
   *   bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) ^
   *   bytes4(keccak256('tokenByIndex(uint256)'))
   */

  /**
   * @dev Constructor function
   */
  constructor() public {
    // register the supported interface to conform to ERC721 via ERC165
    _registerInterface(_InterfaceId_ERC721Enumerable);
  }

  /**
   * @dev Gets the token ID at a given index of the tokens list of the requested owner
   * @param owner address owning the tokens list to be accessed
   * @param index uint256 representing the index to be accessed of the requested tokens list
   * @return uint256 token ID at the given index of the tokens list owned by the requested address
   */
  function tokenOfOwnerByIndex(
    address owner,
    uint256 index
  )
    public
    view
    returns (uint256)
  {
    require(index < balanceOf(owner));
    return _ownedTokens[owner][index];
  }

  /**
   * @dev Gets the total amount of tokens stored by the contract
   * @return uint256 representing the total amount of tokens
   */
  function totalSupply() public view returns (uint256) {
    return _allTokens.length;
  }

  /**
   * @dev Gets the token ID at a given index of all the tokens in this contract
   * Reverts if the index is greater or equal to the total number of tokens
   * @param index uint256 representing the index to be accessed of the tokens list
   * @return uint256 token ID at the given index of the tokens list
   */
  function tokenByIndex(uint256 index) public view returns (uint256) {
    require(index < totalSupply());
    return _allTokens[index];
  }

  /**
   * @dev Internal function to add a token ID to the list of a given address
   * This function is internal due to language limitations, see the note in ERC721.sol.
   * It is not intended to be called by custom derived contracts: in particular, it emits no Transfer event.
   * @param to address representing the new owner of the given token ID
   * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
   */
  function _addTokenTo(address to, uint256 tokenId) internal {
    super._addTokenTo(to, tokenId);
    uint256 length = _ownedTokens[to].length;
    _ownedTokens[to].push(tokenId);
    _ownedTokensIndex[tokenId] = length;
  }

  /**
   * @dev Internal function to remove a token ID from the list of a given address
   * This function is internal due to language limitations, see the note in ERC721.sol.
   * It is not intended to be called by custom derived contracts: in particular, it emits no Transfer event,
   * and doesn't clear approvals.
   * @param from address representing the previous owner of the given token ID
   * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
   */
  function _removeTokenFrom(address from, uint256 tokenId) internal {
    super._removeTokenFrom(from, tokenId);

    // To prevent a gap in the array, we store the last token in the index of the token to delete, and
    // then delete the last slot.
    uint256 tokenIndex = _ownedTokensIndex[tokenId];
    uint256 lastTokenIndex = _ownedTokens[from].length.sub(1);
    uint256 lastToken = _ownedTokens[from][lastTokenIndex];

    _ownedTokens[from][tokenIndex] = lastToken;
    // This also deletes the contents at the last position of the array
    _ownedTokens[from].length--;

    // Note that this will handle single-element arrays. In that case, both tokenIndex and lastTokenIndex are going to
    // be zero. Then we can make sure that we will remove tokenId from the ownedTokens list since we are first swapping
    // the lastToken to the first position, and then dropping the element placed in the last position of the list

    _ownedTokensIndex[tokenId] = 0;
    _ownedTokensIndex[lastToken] = tokenIndex;
  }

  /**
   * @dev Internal function to mint a new token
   * Reverts if the given token ID already exists
   * @param to address the beneficiary that will own the minted token
   * @param tokenId uint256 ID of the token to be minted by the msg.sender
   */
  function _mint(address to, uint256 tokenId) internal {
    super._mint(to, tokenId);

    _allTokensIndex[tokenId] = _allTokens.length;
    _allTokens.push(tokenId);
  }

  /**
   * @dev Internal function to burn a specific token
   * Reverts if the token does not exist
   * @param owner owner of the token to burn
   * @param tokenId uint256 ID of the token being burned by the msg.sender
   */
  function _burn(address owner, uint256 tokenId) internal {
    super._burn(owner, tokenId);

    // Reorg all tokens array
    uint256 tokenIndex = _allTokensIndex[tokenId];
    uint256 lastTokenIndex = _allTokens.length.sub(1);
    uint256 lastToken = _allTokens[lastTokenIndex];

    _allTokens[tokenIndex] = lastToken;
    _allTokens[lastTokenIndex] = 0;

    _allTokens.length--;
    _allTokensIndex[tokenId] = 0;
    _allTokensIndex[lastToken] = tokenIndex;
  }
}

// File: openzeppelin-solidity/contracts/token/ERC721/IERC721Metadata.sol

pragma solidity ^0.4.24;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract IERC721Metadata is IERC721 {
  function name() external view returns (string);
  function symbol() external view returns (string);
  function tokenURI(uint256 tokenId) external view returns (string);
}

// File: openzeppelin-solidity/contracts/token/ERC721/ERC721Metadata.sol

pragma solidity ^0.4.24;




contract ERC721Metadata is ERC165, ERC721, IERC721Metadata {
  // Token name
  string private _name;

  // Token symbol
  string private _symbol;

  // Optional mapping for token URIs
  mapping(uint256 => string) private _tokenURIs;

  bytes4 private constant InterfaceId_ERC721Metadata = 0x5b5e139f;
  /**
   * 0x5b5e139f ===
   *   bytes4(keccak256('name()')) ^
   *   bytes4(keccak256('symbol()')) ^
   *   bytes4(keccak256('tokenURI(uint256)'))
   */

  /**
   * @dev Constructor function
   */
  constructor(string name, string symbol) public {
    _name = name;
    _symbol = symbol;

    // register the supported interfaces to conform to ERC721 via ERC165
    _registerInterface(InterfaceId_ERC721Metadata);
  }

  /**
   * @dev Gets the token name
   * @return string representing the token name
   */
  function name() external view returns (string) {
    return _name;
  }

  /**
   * @dev Gets the token symbol
   * @return string representing the token symbol
   */
  function symbol() external view returns (string) {
    return _symbol;
  }

  /**
   * @dev Returns an URI for a given token ID
   * Throws if the token ID does not exist. May return an empty string.
   * @param tokenId uint256 ID of the token to query
   */
  function tokenURI(uint256 tokenId) external view returns (string) {
    require(_exists(tokenId));
    return _tokenURIs[tokenId];
  }

  /**
   * @dev Internal function to set the token URI for a given token
   * Reverts if the token ID does not exist
   * @param tokenId uint256 ID of the token to set its URI
   * @param uri string URI to assign
   */
  function _setTokenURI(uint256 tokenId, string uri) internal {
    require(_exists(tokenId));
    _tokenURIs[tokenId] = uri;
  }

  /**
   * @dev Internal function to burn a specific token
   * Reverts if the token does not exist
   * @param owner owner of the token to burn
   * @param tokenId uint256 ID of the token being burned by the msg.sender
   */
  function _burn(address owner, uint256 tokenId) internal {
    super._burn(owner, tokenId);

    // Clear metadata (if any)
    if (bytes(_tokenURIs[tokenId]).length != 0) {
      delete _tokenURIs[tokenId];
    }
  }
}

// File: openzeppelin-solidity/contracts/token/ERC721/ERC721Full.sol

pragma solidity ^0.4.24;




/**
 * @title Full ERC721 Token
 * This implementation includes all the required and some optional functionality of the ERC721 standard
 * Moreover, it includes approve all functionality using operator terminology
 * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721Full is ERC721, ERC721Enumerable, ERC721Metadata {
  constructor(string name, string symbol) ERC721Metadata(name, symbol)
    public
  {
  }
}

// File: contracts/Landemic.sol

pragma solidity ^0.4.24;

/* The latest stable Truffle is Truffle 4, which also uses Solidity 4. The highest OpenZeppelin that is compatible with Solidity 4 is 2.0.0. */


contract Landemic is ERC721Full("Landemic","LAND") {

    uint256 public _basePrice = 810000000000000; // $0.25 ETH/USD as of May 2019
    uint8 public _bountyDivisor = 20; // 5% to each player
    uint16 public _defaultMultiple = 100; // using 1 decimal point divisibility, max 1000
    address public _owner = msg.sender;
    string public _baseURL = "https://landemic.io/";

    struct Price {
        uint240 lastPrice;
        uint16 multiple;
    }
    mapping(uint256 => Price) public _prices;

    // When recepient cannot receive the bounty,
    // it is stored here and can be pulled manually
    mapping(address => uint256) public failedPayouts;
    uint256 public failedPayoutsSum;

    /* Admin */

    modifier onlyContractOwner() {
        require(msg.sender == _owner);
        _;
    }

    function _lastPrice(uint256 tokenId) public view returns (uint256) {
        return uint256(_prices[tokenId].lastPrice);
    }

    function _multiple(uint256 tokenId) public view returns (uint16) {
        return _prices[tokenId].multiple;
    }

    function setBasePrice(uint256 basePrice) onlyContractOwner public {
        _basePrice = basePrice;
    }

    function setBountyDivisor(uint8 bountyDivisor) onlyContractOwner public {
        _bountyDivisor = bountyDivisor;
    }

    function setBaseURL(string baseURL) public onlyContractOwner {
        _baseURL = baseURL;
    }

    function setOwner(address owner) onlyContractOwner public {
        _owner = owner;
    }

    // Allows the owner to withdraw profits and failed payouts.
    // Owner should check failedPayoutsSum to not withdraw extra.
    function withdraw(uint256 amount) onlyContractOwner public {
        msg.sender.transfer(amount);
    }

    function withdrawProfit() onlyContractOwner public {
        msg.sender.transfer(address(this).balance.sub(failedPayoutsSum));
    }

    /* Temp Functions Until Server-Side Component */

    function getAllOwned() public view returns (uint256[], address[]) {

        uint totalOwned = totalSupply();

        uint256[] memory ownedUint256 = new uint256[](totalOwned);
        address[] memory ownersAddress = new address[](totalOwned);

        for (uint i = 0; i < totalOwned; i++) {
            ownedUint256[i] = tokenByIndex(i);
            ownersAddress[i] = ownerOf(ownedUint256[i]);
        }

        return (ownedUint256, ownersAddress);

    }

    function metadataForToken(uint256 tokenId) public view returns (uint256, address, uint16, uint256) {
        uint256 price = priceOf(tokenId);

        if (_exists(tokenId)) {
            return (_lastPrice(tokenId), ownerOf(tokenId), multipleOf(tokenId), price);
        }
        return (_basePrice, 0, 10, price);
    }

    function priceOf(uint256 tokenId) public view returns (uint256) {
        if (_exists(tokenId)) {
            return _lastPrice(tokenId).mul(uint256(multipleOf(tokenId))).div(10);
        }
        return _basePrice;
    }

    function multipleOf(uint256 tokenId) public view returns (uint16) {
        uint16 multiple = _multiple(tokenId);
        if (multiple > 0) {
            return multiple;
        }
        return _defaultMultiple;
    }

    /* Adjust metadata */

    modifier onlyTokenOwner(uint256 tokenId) {
        require(msg.sender == ownerOf(tokenId));
        _;
    }

    function setMultiple(uint256 tokenId, uint16 multiple) public onlyTokenOwner(tokenId) {
        require(multiple >= 1 && multiple <= 1000);
        _prices[tokenId].multiple = multiple;
    }

    /* Buy & Sell */

    // TODO:
    // function grabCodes(uint256[] tokens) public payable {
    //     for (uint i = 0; i < tokens.length; i++) {
    //         _mint(msg.sender, tokens[i]);
    //     }
    // }



    function _pushOrDelayBounty(address to, uint256 amount) internal {
        bool success = to.send(amount);
        if (!success) {
            failedPayouts[to] = failedPayouts[to].add(amount);
            failedPayoutsSum = failedPayoutsSum.add(amount);
        }
    }

    function grabCode(uint256 tokenId) public payable {
        // uint256 tokenId = uint256(stringToBytes32(code));

        uint256 price = priceOf(tokenId);  // _lastPrice * 0.1  <=  price  <=  _lastPrice * 10
        require(msg.value >= price);

        _prices[tokenId] = Price(uint240(msg.value), uint16(0));

        if (!_exists(tokenId)) {
            _mint(msg.sender, tokenId);
            return;
        }

        address owner = ownerOf(tokenId);
        require(owner != msg.sender);

        _burn(owner, tokenId);
        _mint(msg.sender, tokenId);

        uint256 bounty = msg.value.div(_bountyDivisor);  // 5%
        uint256 bountiesCount = 1; // Landemic.
        uint256[4] memory neighbors = neighborsOfToken(tokenId);
        for (uint i = 0; i < 4; i++) {
            uint256 neighbor = neighbors[i];
            if (!_exists(neighbor)) {
                continue;
            }
            _pushOrDelayBounty(ownerOf(neighbor), bounty);
            bountiesCount++;
        }

        _pushOrDelayBounty(owner, msg.value.sub(bounty.mul(bountiesCount)));  // 75%
    }

    function pullBounty(address to) public {
        uint256 bounty = failedPayouts[msg.sender];
        if (bounty == 0) {
            return;
        }
        failedPayouts[msg.sender] = 0;
        failedPayoutsSum = failedPayoutsSum.sub(bounty);
        to.transfer(bounty);
    }


    /* ERC721Metadata overrides */

    /**
    * @dev Returns an URI for a given token ID
    * @dev Throws if the token ID does not exist. May return an empty string.
    * @param _tokenId uint256 ID of the token to query
    */
    function tokenURI(uint256 _tokenId) external view returns (string) {
        require(_exists(_tokenId));
        return strConcat(strConcat(_baseURL, uint256ToString(_tokenId)),".json");
    }

    /* Utilities */

    // https://ethereum.stackexchange.com/a/9152/3847
    function uint256ToString(uint256 y) private pure returns (string) {
        bytes32 x = bytes32(y);
        bytes memory bytesString = new bytes(32);
        uint charCount = 0;
        for (uint j = 0; j < 32; j++) {
            byte char = byte(bytes32(uint(x) * 2 ** (8 * j)));
            if (char != 0) {
                bytesString[charCount] = char;
                charCount++;
            }
        }
        bytes memory bytesStringTrimmed = new bytes(charCount);
        for (j = 0; j < charCount; j++) {
            bytesStringTrimmed[j] = bytesString[j];
        }
        return string(bytesStringTrimmed);
    }

    function stringToBytes32(string memory source) private pure returns (bytes32 result) {
        bytes memory testEmptyStringTest = bytes(source);
        if (testEmptyStringTest.length == 0) {
            return 0x0;
        }

        assembly {
            result := mload(add(source, 32))
        }
    }

    // https://ethereum.stackexchange.com/questions/729/how-to-concatenate-strings-in-solidity
    function strConcat(string _a, string _b) private pure returns (string) {
        bytes memory bytes_a = bytes(_a);
        bytes memory bytes_b = bytes(_b);
        string memory ab = new string (bytes_a.length + bytes_b.length);
        bytes memory bytes_ab = bytes(ab);
        uint k = 0;
        for (uint i = 0; i < bytes_a.length; i++) bytes_ab[k++] = bytes_a[i];
        for (i = 0; i < bytes_b.length; i++) bytes_ab[k++] = bytes_b[i];
        return string(bytes_ab);
    }

    // TODO: This should be a separate library: OLC.sol

    bytes20 constant DIGITS = bytes20('23456789CFGHJMPQRVWX');
    bytes20 constant STIGID = bytes20('XWVRQPMJHGFC98765432');

    function nextChar(byte c, bytes20 digits) private pure returns (byte) {
        for (uint i = 0; i < 20; i++)
            if (c == digits[i])
                return (i == 19) ? digits[0] : digits[i+1];

    }

    function replaceChar(uint256 tokenId, uint pos, byte c) private pure returns (uint256) {

        uint shift = (8 - pos) * 8;
        uint256 insert = uint256(c) << shift;
        uint256 mask = ~(uint256(0xff) << shift);

        return tokenId & mask | insert;
    }

    function incrementChar(uint256 tokenId, int pos, bytes20 digits) private pure returns (uint256) {

        if (pos < 0)
            return tokenId;

        byte c = nextChar(bytes32(tokenId)[23 + uint(pos)], digits);
        uint256 updated = replaceChar(tokenId, uint(pos), c);
        if (c == digits[0]) {
            int nextPos = pos - 2;
            byte nextPosChar = bytes32(updated)[23 + uint(nextPos)];
            // Longitude has only 18 slices.
            if (nextPos == 1) {
                if (digits == DIGITS && nextPosChar == 'V') {
                    return replaceChar(updated, uint(nextPos), '2');
                }
                if (digits == STIGID && nextPosChar == '2') {
                    return replaceChar(updated, uint(nextPos), 'V');
                }
            }
            // Latitude has only 9 slices.
            if (nextPos == 0) {
                if (digits == DIGITS && nextPosChar == 'C') {
                    return replaceChar(updated, uint(nextPos), '2');
                }
                if (digits == STIGID && nextPosChar == '2') {
                    return replaceChar(updated, uint(nextPos), 'C');
                }
            }
            return incrementChar(updated, nextPos, digits);
        }
        return updated;
    }

    function northOfToken(uint256 tokenId) public pure returns (uint256) {
        return incrementChar(tokenId, 6, DIGITS);
    }

    function southOfToken(uint256 tokenId) public pure returns (uint256) {
        return incrementChar(tokenId, 6, STIGID);
    }

    function eastOfToken(uint256 tokenId) public pure returns (uint256) {
        return incrementChar(tokenId, 7, DIGITS);
    }

    function westOfToken(uint256 tokenId) public pure returns (uint256) {
        return incrementChar(tokenId, 7, STIGID);
    }

    function neighborsOfToken(uint256 tokenId) public pure returns (uint256[4]) {
        return [
            northOfToken(tokenId),
            eastOfToken(tokenId),
            southOfToken(tokenId),
            westOfToken(tokenId)
        ];
    }

}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[{"name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"owner","type":"address"}],"name":"setOwner","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":"tokenId","type":"uint256"}],"name":"northOfToken","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"southOfToken","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"westOfToken","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"_basePrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"_defaultMultiple","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"baseURL","type":"string"}],"name":"setBaseURL","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"_multiple","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"}],"name":"pullBounty","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"_bountyDivisor","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"neighborsOfToken","outputs":[{"name":"","type":"uint256[4]"}],"payable":false,"stateMutability":"pure","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":"withdrawProfit","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":"to","type":"address"},{"name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"metadataForToken","outputs":[{"name":"","type":"uint256"},{"name":"","type":"address"},{"name":"","type":"uint16"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"_owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"tokenId","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"priceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"tokenId","type":"uint256"},{"name":"multiple","type":"uint16"}],"name":"setMultiple","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"failedPayoutsSum","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"eastOfToken","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"_lastPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"basePrice","type":"uint256"}],"name":"setBasePrice","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"failedPayouts","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"grabCode","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"multipleOf","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"bountyDivisor","type":"uint8"}],"name":"setBountyDivisor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getAllOwned","outputs":[{"name":"","type":"uint256[]"},{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"_baseURL","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"_prices","outputs":[{"name":"lastPrice","type":"uint240"},{"name":"multiple","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":true,"name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"approved","type":"address"},{"indexed":true,"name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"operator","type":"address"},{"indexed":false,"name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"}]

6602e0b0d244a000600c55600d8054601460ff19909116811762ffff00191661640017630100000060b860020a031916336301000000021790915560c060405260808190527f68747470733a2f2f6c616e64656d69632e696f2f00000000000000000000000060a09081526200007991600e919062000258565b50604080518082018252600881527f4c616e64656d69630000000000000000000000000000000000000000000000006020808301919091528251808401909352600483527f4c414e440000000000000000000000000000000000000000000000000000000090830152908181620001197f01ffc9a700000000000000000000000000000000000000000000000000000000640100000000620001eb810204565b6200014d7f80ac58cd00000000000000000000000000000000000000000000000000000000640100000000620001eb810204565b620001817f780e9d6300000000000000000000000000000000000000000000000000000000640100000000620001eb810204565b81516200019690600990602085019062000258565b508051620001ac90600a90602084019062000258565b50620001e17f5b5e139f00000000000000000000000000000000000000000000000000000000640100000000620001eb810204565b50505050620002fd565b7fffffffff0000000000000000000000000000000000000000000000000000000080821614156200021b57600080fd5b7fffffffff00000000000000000000000000000000000000000000000000000000166000908152602081905260409020805460ff19166001179055565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200029b57805160ff1916838001178555620002cb565b82800160010185558215620002cb579182015b82811115620002cb578251825591602001919060010190620002ae565b50620002d9929150620002dd565b5090565b620002fa91905b80821115620002d95760008155600101620002e4565b90565b612e38806200030d6000396000f3006080604052600436106102195763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166301ffc9a7811461021e57806306fdde031461026c578063081812fc146102f6578063095ea7b31461033757806313af40351461036a57806318160ddd146103985780631c79b4fc146103bf57806322835acc146103d757806323b872dd146103ef57806329cc044d146104265780632e1a7d4d1461043e5780632f745c591461045657806342842e0e1461048757806344cf661f146104be5780634501efbe146104d357806349f2553a146104ff5780634e2e470e146105585780634f6ccce7146105705780635adadef7146105885780636352211e146105b657806365063805146105ce5780636a3dc446146105f957806370a0823114610649578063959499b61461067757806395d89b411461068c578063a22cb465146106a1578063a3bbe569146106d4578063b2bdfa7b1461072a578063b88d4fde1461073f578063b9186d7d146107bb578063c2b6fb61146107d3578063c87b56dd146107f2578063d13b89411461080a578063d2834a9b1461081f578063ddf3d15f14610837578063de4b32621461084f578063de64a76514610867578063e121ba7c14610895578063e566f2b2146108a0578063e58de971146108b8578063e985e9c5146108d3578063f071810014610907578063f9e0edae146109b5578063fe776dd0146109ca575b600080fd5b34801561022a57600080fd5b506102587fffffffff0000000000000000000000000000000000000000000000000000000060043516610a1f565b604080519115158252519081900360200190f35b34801561027857600080fd5b50610281610a5a565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102bb5781810151838201526020016102a3565b50505050905090810190601f1680156102e85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561030257600080fd5b5061030e600435610af1565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561034357600080fd5b5061036873ffffffffffffffffffffffffffffffffffffffff60043516602435610b30565b005b34801561037657600080fd5b5061036873ffffffffffffffffffffffffffffffffffffffff60043516610c18565b3480156103a457600080fd5b506103ad610c91565b60408051918252519081900360200190f35b3480156103cb57600080fd5b506103ad600435610c97565b3480156103e357600080fd5b506103ad600435610ccb565b3480156103fb57600080fd5b5061036873ffffffffffffffffffffffffffffffffffffffff60043581169060243516604435610cf9565b34801561043257600080fd5b506103ad600435610dae565b34801561044a57600080fd5b50610368600435610ddc565b34801561046257600080fd5b506103ad73ffffffffffffffffffffffffffffffffffffffff60043516602435610e38565b34801561049357600080fd5b5061036873ffffffffffffffffffffffffffffffffffffffff60043581169060243516604435610e92565b3480156104ca57600080fd5b506103ad610eb3565b3480156104df57600080fd5b506104e8610eb9565b6040805161ffff9092168252519081900360200190f35b34801561050b57600080fd5b506040805160206004803580820135601f8101849004840285018401909552848452610368943694929360249392840191908190840183828082843750949750610ec89650505050505050565b34801561056457600080fd5b506104e8600435610f06565b34801561057c57600080fd5b506103ad600435610f3e565b34801561059457600080fd5b5061036873ffffffffffffffffffffffffffffffffffffffff60043516610f73565b3480156105c257600080fd5b5061030e600435610ff8565b3480156105da57600080fd5b506105e3611033565b6040805160ff9092168252519081900360200190f35b34801561060557600080fd5b5061061160043561103c565b6040518082608080838360005b8381101561063657818101518382015260200161061e565b5050505090500191505060405180910390f35b34801561065557600080fd5b506103ad73ffffffffffffffffffffffffffffffffffffffff6004351661108b565b34801561068357600080fd5b506103686110d8565b34801561069857600080fd5b50610281611149565b3480156106ad57600080fd5b5061036873ffffffffffffffffffffffffffffffffffffffff6004351660243515156111aa565b3480156106e057600080fd5b506106ec600435611266565b6040805194855273ffffffffffffffffffffffffffffffffffffffff909316602085015261ffff909116838301526060830152519081900360800190f35b34801561073657600080fd5b5061030e6112c9565b34801561074b57600080fd5b50604080516020601f6064356004818101359283018490048402850184019095528184526103689473ffffffffffffffffffffffffffffffffffffffff81358116956024803590921695604435953695608494019181908401838280828437509497506112ec9650505050505050565b3480156107c757600080fd5b506103ad600435611314565b3480156107df57600080fd5b5061036860043561ffff60243516611369565b3480156107fe57600080fd5b5061028160043561141d565b34801561081657600080fd5b506103ad61150f565b34801561082b57600080fd5b506103ad600435611515565b34801561084357600080fd5b506103ad600435611543565b34801561085b57600080fd5b50610368600435611575565b34801561087357600080fd5b506103ad73ffffffffffffffffffffffffffffffffffffffff600435166115a5565b6103686004356115b7565b3480156108ac57600080fd5b506104e8600435611793565b3480156108c457600080fd5b5061036860ff600435166117c9565b3480156108df57600080fd5b5061025873ffffffffffffffffffffffffffffffffffffffff60043581169060243516611828565b34801561091357600080fd5b5061091c611863565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015610960578181015183820152602001610948565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561099f578181015183820152602001610987565b5050505090500194505050505060405180910390f35b3480156109c157600080fd5b50610281611965565b3480156109d657600080fd5b506109e26004356119f3565b604080517dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909316835261ffff90911660208301528051918290030190f35b7fffffffff00000000000000000000000000000000000000000000000000000000811660009081526020819052604090205460ff165b919050565b60098054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610ae65780601f10610abb57610100808354040283529160200191610ae6565b820191906000526020600020905b815481529060010190602001808311610ac957829003601f168201915b505050505090505b90565b6000610afc82611a4d565b1515610b0757600080fd5b5060009081526002602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b6000610b3b82610ff8565b905073ffffffffffffffffffffffffffffffffffffffff8381169082161415610b6357600080fd5b3373ffffffffffffffffffffffffffffffffffffffff82161480610b8c5750610b8c8133611828565b1515610b9757600080fd5b60008281526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff87811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600d546301000000900473ffffffffffffffffffffffffffffffffffffffff163314610c4357600080fd5b600d805473ffffffffffffffffffffffffffffffffffffffff9092166301000000027fffffffffffffffffff0000000000000000000000000000000000000000ffffff909216919091179055565b60075490565b6000610cc58260067f3233343536373839434647484a4d505152565758000000000000000000000000611a77565b92915050565b6000610cc58260067f5857565251504d4a484746433938373635343332000000000000000000000000611a77565b610d033382611edc565b1515610d0e57600080fd5b73ffffffffffffffffffffffffffffffffffffffff82161515610d3057600080fd5b610d3a8382611f71565b610d448382612012565b610d4e828261215a565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000610cc58260077f5857565251504d4a484746433938373635343332000000000000000000000000611a77565b600d546301000000900473ffffffffffffffffffffffffffffffffffffffff163314610e0757600080fd5b604051339082156108fc029083906000818181858888f19350505050158015610e34573d6000803e3d6000fd5b5050565b6000610e438361108b565b8210610e4e57600080fd5b73ffffffffffffffffffffffffffffffffffffffff83166000908152600560205260409020805483908110610e7f57fe5b9060005260206000200154905092915050565b610eae83838360206040519081016040528060008152506112ec565b505050565b600c5481565b600d54610100900461ffff1681565b600d546301000000900473ffffffffffffffffffffffffffffffffffffffff163314610ef357600080fd5b8051610e3490600e906020840190612cf1565b6000908152600f60205260409020547e01000000000000000000000000000000000000000000000000000000000000900461ffff1690565b6000610f48610c91565b8210610f5357600080fd5b6007805483908110610f6157fe5b90600052602060002001549050919050565b33600090815260106020526040902054801515610f8f57610e34565b33600090815260106020526040812055601154610fb2908263ffffffff6121b016565b60115560405173ffffffffffffffffffffffffffffffffffffffff83169082156108fc029083906000818181858888f19350505050158015610eae573d6000803e3d6000fd5b60008181526001602052604081205473ffffffffffffffffffffffffffffffffffffffff1680151561102957600080fd5b8091505b50919050565b600d5460ff1681565b611044612d6f565b60806040519081016040528061105984610c97565b815260200161106784611515565b815260200161107584610ccb565b815260200161108384610dae565b905292915050565b600073ffffffffffffffffffffffffffffffffffffffff821615156110af57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b600d546301000000900473ffffffffffffffffffffffffffffffffffffffff16331461110357600080fd5b60115433906108fc9061111e9030319063ffffffff6121b016565b6040518115909202916000818181858888f19350505050158015611146573d6000803e3d6000fd5b50565b600a8054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610ae65780601f10610abb57610100808354040283529160200191610ae6565b73ffffffffffffffffffffffffffffffffffffffff82163314156111cd57600080fd5b33600081815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b600080600080600061127786611314565b905061128286611a4d565b156112b05761129086611543565b61129987610ff8565b6112a288611793565b8394509450945094506112c1565b600c54945060009350600a92509050805b509193509193565b600d546301000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6112f7848484610cf9565b611303848484846121c7565b151561130e57600080fd5b50505050565b600061131f82611a4d565b156113615761135a600a61134e61133585611793565b61ffff1661134286611543565b9063ffffffff61236616565b9063ffffffff61239b16565b9050610a55565b5050600c5490565b8161137381610ff8565b73ffffffffffffffffffffffffffffffffffffffff16331461139457600080fd5b60018261ffff16101580156113af57506103e88261ffff1611155b15156113ba57600080fd5b506000918252600f6020526040909120805461ffff9092167e01000000000000000000000000000000000000000000000000000000000000027dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b606061142882611a4d565b151561143357600080fd5b600e805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152610cc5936114d693919290918301828280156114c35780601f10611498576101008083540402835291602001916114c3565b820191906000526020600020905b8154815290600101906020018083116114a657829003601f168201915b50505050506114d1856123be565b61256e565b60408051808201909152600581527f2e6a736f6e000000000000000000000000000000000000000000000000000000602082015261256e565b60115481565b6000610cc58260077f3233343536373839434647484a4d505152565758000000000000000000000000611a77565b6000908152600f60205260409020547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690565b600d546301000000900473ffffffffffffffffffffffffffffffffffffffff1633146115a057600080fd5b600c55565b60106020526000908152604090205481565b6000806000806115c5612d6f565b6000806115d188611314565b9650348711156115e057600080fd5b6040805180820182527dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3481168252600060208084018281528d8352600f90915293902091518254935161ffff167e01000000000000000000000000000000000000000000000000000000000000029082167fffff000000000000000000000000000000000000000000000000000000000000909416939093171691909117905561168888611a4d565b151561169d57611698338961272d565b611789565b6116a688610ff8565b955073ffffffffffffffffffffffffffffffffffffffff86163314156116cb57600080fd5b6116d5868961277c565b6116df338961272d565b600d546116f690349060ff1663ffffffff61239b16565b9450600193506117058861103c565b9250600091505b60048210156117605782826004811061172157fe5b6020020151905061173181611a4d565b151561173c57611755565b61174e61174882610ff8565b866127c4565b6001909301925b60019091019061170c565b61178986611784611777888863ffffffff61236616565b349063ffffffff6121b016565b6127c4565b5050505050505050565b60008061179f83610f06565b905060008161ffff1611156117b65780915061102d565b5050600d54610100900461ffff16919050565b600d546301000000900473ffffffffffffffffffffffffffffffffffffffff1633146117f457600080fd5b600d80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff92909216919091179055565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260046020908152604080832093909416825291909152205460ff1690565b60608060006060806000611875610c91565b9350836040519080825280602002602001820160405280156118a1578160200160208202803883390190505b509250836040519080825280602002602001820160405280156118ce578160200160208202803883390190505b509150600090505b8381101561195a576118e781610f3e565b83828151811015156118f557fe5b6020908102909101015282516119209084908390811061191157fe5b90602001906020020151610ff8565b828281518110151561192e57fe5b73ffffffffffffffffffffffffffffffffffffffff9092166020928302909101909101526001016118d6565b509094909350915050565b600e805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156119eb5780601f106119c0576101008083540402835291602001916119eb565b820191906000526020600020905b8154815290600101906020018083116119ce57829003601f168201915b505050505081565b600f602052600090815260409020547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116907e01000000000000000000000000000000000000000000000000000000000000900461ffff1682565b60009081526001602052604090205473ffffffffffffffffffffffffffffffffffffffff16151590565b600080600080600080871215611a8f57879450611ed1565b611aca886017890160208110611aa157fe5b1a7f01000000000000000000000000000000000000000000000000000000000000000287612878565b9350611ad7888886612974565b92508560001a7f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916847effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415611ecd577ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe87019150826015880160208110611b7e57fe5b1a7f01000000000000000000000000000000000000000000000000000000000000000290508160011415611d37577fffffffffffffffffffffffffffffffffffffffff00000000000000000000000086167f3233343536373839434647484a4d505152565758000000000000000000000000148015611c3e57507f56000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216145b15611c7557611c6e83837f3200000000000000000000000000000000000000000000000000000000000000612974565b9450611ed1565b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000086167f5857565251504d4a484746433938373635343332000000000000000000000000148015611d0757507f32000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216145b15611d3757611c6e83837f5600000000000000000000000000000000000000000000000000000000000000612974565b811515611ec2577fffffffffffffffffffffffffffffffffffffffff00000000000000000000000086167f3233343536373839434647484a4d505152565758000000000000000000000000148015611dd057507f43000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216145b15611e0057611c6e83837f3200000000000000000000000000000000000000000000000000000000000000612974565b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000086167f5857565251504d4a484746433938373635343332000000000000000000000000148015611e9257507f32000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216145b15611ec257611c6e83837f4300000000000000000000000000000000000000000000000000000000000000612974565b611c6e838388611a77565b8294505b505050509392505050565b600080611ee883610ff8565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611f5757508373ffffffffffffffffffffffffffffffffffffffff16611f3f84610af1565b73ffffffffffffffffffffffffffffffffffffffff16145b80611f675750611f678185611828565b91505b5092915050565b8173ffffffffffffffffffffffffffffffffffffffff16611f9182610ff8565b73ffffffffffffffffffffffffffffffffffffffff1614611fb157600080fd5b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff1615610e3457600090815260026020526040902080547fffffffffffffffffffffffff000000000000000000000000000000000000000016905550565b600080600061202185856129b2565b60008481526006602090815260408083205473ffffffffffffffffffffffffffffffffffffffff8916845260059092529091205490935061206990600163ffffffff6121b016565b73ffffffffffffffffffffffffffffffffffffffff861660009081526005602052604090208054919350908390811061209e57fe5b9060005260206000200154905080600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020848154811015156120f857fe5b600091825260208083209091019290925573ffffffffffffffffffffffffffffffffffffffff8716815260059091526040902080549061213c906000198301612d8e565b50600093845260066020526040808520859055908452909220555050565b60006121668383612a87565b5073ffffffffffffffffffffffffffffffffffffffff9091166000908152600560209081526040808320805460018101825590845282842081018590559383526006909152902055565b600080838311156121c057600080fd5b5050900390565b6000806121e98573ffffffffffffffffffffffffffffffffffffffff16612b49565b15156121f8576001915061235d565b6040517f150b7a02000000000000000000000000000000000000000000000000000000008152336004820181815273ffffffffffffffffffffffffffffffffffffffff898116602485015260448401889052608060648501908152875160848601528751918a169463150b7a0294938c938b938b93909160a490910190602085019080838360005b83811015612298578181015183820152602001612280565b50505050905090810190601f1680156122c55780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b1580156122e757600080fd5b505af11580156122fb573d6000803e3d6000fd5b505050506040513d602081101561231157600080fd5b50517fffffffff0000000000000000000000000000000000000000000000000000000081167f150b7a020000000000000000000000000000000000000000000000000000000014925090505b50949350505050565b6000808315156123795760009150611f6a565b5082820282848281151561238957fe5b041461239457600080fd5b9392505050565b6000808083116123aa57600080fd5b82848115156123b557fe5b04949350505050565b604080516020808252818301909252606091839183916000918291829185918082016104008038833901905050945060009350600092505b6020831015612483576008830260020a860291507fff000000000000000000000000000000000000000000000000000000000000008216156124785781858581518110151561244157fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506001909301925b6001909201916123f6565b836040519080825280601f01601f1916602001820160405280156124b1578160200160208202803883390190505b509050600092505b838310156125635784838151811015156124cf57fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002818481518110151561252857fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506001909201916124b9565b979650505050505050565b606080606080606060008088955087945084518651016040519080825280601f01601f1916602001820160405280156125b1578160200160208202803883390190505b50935083925060009150600090505b855181101561266e5785818151811015156125d757fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002838380600101945081518110151561263657fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506001016125c0565b5060005b845181101561272057848181518110151561268957fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f01000000000000000000000000000000000000000000000000000000000000000283838060010194508151811015156126e857fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600101612672565b5090979650505050505050565b6127378282612b51565b600780546000838152600860205260408120829055600182018355919091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688015550565b6127868282612bc6565b6000818152600b60205260409020546002600019610100600184161502019091160415610e34576000818152600b60205260408120610e3491612db2565b60405160009073ffffffffffffffffffffffffffffffffffffffff84169083156108fc0290849084818181858888f193505050509050801515610eae5773ffffffffffffffffffffffffffffffffffffffff8316600090815260106020526040902054612837908363ffffffff612c8216565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260106020526040902055601154612870908363ffffffff612c8216565b601155505050565b6000805b6014811015611f6a5782816014811061289157fe5b1a7f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916847effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141561296c578060131461293e5782600182016014811061291657fe5b1a7f010000000000000000000000000000000000000000000000000000000000000002612965565b8260001a7f0100000000000000000000000000000000000000000000000000000000000000025b9150611f6a565b60010161287c565b60ff600892830390920260020a91820219929092167f0100000000000000000000000000000000000000000000000000000000000000909204021790565b8173ffffffffffffffffffffffffffffffffffffffff166129d282610ff8565b73ffffffffffffffffffffffffffffffffffffffff16146129f257600080fd5b73ffffffffffffffffffffffffffffffffffffffff8216600090815260036020526040902054612a2990600163ffffffff6121b016565b73ffffffffffffffffffffffffffffffffffffffff90921660009081526003602090815260408083209490945591815260019091522080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60008181526001602052604090205473ffffffffffffffffffffffffffffffffffffffff1615612ab657600080fd5b600081815260016020818152604080842080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff88169081179091558452600390915290912054612b1c91612c82565b73ffffffffffffffffffffffffffffffffffffffff90921660009081526003602052604090209190915550565b6000903b1190565b73ffffffffffffffffffffffffffffffffffffffff82161515612b7357600080fd5b612b7d828261215a565b604051819073ffffffffffffffffffffffffffffffffffffffff8416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000806000612bd58585612c94565b600084815260086020526040902054600754909350612bfb90600163ffffffff6121b016565b9150600782815481101515612c0c57fe5b9060005260206000200154905080600784815481101515612c2957fe5b60009182526020822001919091556007805484908110612c4557fe5b6000918252602090912001556007805490612c64906000198301612d8e565b50600093845260086020526040808520859055908452909220555050565b60008282018381101561239457600080fd5b612c9e8282611f71565b612ca88282612012565b604051819060009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612d3257805160ff1916838001178555612d5f565b82800160010185558215612d5f579182015b82811115612d5f578251825591602001919060010190612d44565b50612d6b929150612df2565b5090565b6080604051908101604052806004906020820280388339509192915050565b815481835581811115610eae57600083815260209020610eae918101908301612df2565b50805460018160011615610100020316600290046000825580601f10612dd85750611146565b601f01602090049060005260206000209081019061114691905b610aee91905b80821115612d6b5760008155600101612df85600a165627a7a7230582004634b7278889d13c95e1a21bf89bf2c92f54ff1a10419167995cf7532f8e9d70029

Deployed Bytecode

0x6080604052600436106102195763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166301ffc9a7811461021e57806306fdde031461026c578063081812fc146102f6578063095ea7b31461033757806313af40351461036a57806318160ddd146103985780631c79b4fc146103bf57806322835acc146103d757806323b872dd146103ef57806329cc044d146104265780632e1a7d4d1461043e5780632f745c591461045657806342842e0e1461048757806344cf661f146104be5780634501efbe146104d357806349f2553a146104ff5780634e2e470e146105585780634f6ccce7146105705780635adadef7146105885780636352211e146105b657806365063805146105ce5780636a3dc446146105f957806370a0823114610649578063959499b61461067757806395d89b411461068c578063a22cb465146106a1578063a3bbe569146106d4578063b2bdfa7b1461072a578063b88d4fde1461073f578063b9186d7d146107bb578063c2b6fb61146107d3578063c87b56dd146107f2578063d13b89411461080a578063d2834a9b1461081f578063ddf3d15f14610837578063de4b32621461084f578063de64a76514610867578063e121ba7c14610895578063e566f2b2146108a0578063e58de971146108b8578063e985e9c5146108d3578063f071810014610907578063f9e0edae146109b5578063fe776dd0146109ca575b600080fd5b34801561022a57600080fd5b506102587fffffffff0000000000000000000000000000000000000000000000000000000060043516610a1f565b604080519115158252519081900360200190f35b34801561027857600080fd5b50610281610a5a565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102bb5781810151838201526020016102a3565b50505050905090810190601f1680156102e85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561030257600080fd5b5061030e600435610af1565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561034357600080fd5b5061036873ffffffffffffffffffffffffffffffffffffffff60043516602435610b30565b005b34801561037657600080fd5b5061036873ffffffffffffffffffffffffffffffffffffffff60043516610c18565b3480156103a457600080fd5b506103ad610c91565b60408051918252519081900360200190f35b3480156103cb57600080fd5b506103ad600435610c97565b3480156103e357600080fd5b506103ad600435610ccb565b3480156103fb57600080fd5b5061036873ffffffffffffffffffffffffffffffffffffffff60043581169060243516604435610cf9565b34801561043257600080fd5b506103ad600435610dae565b34801561044a57600080fd5b50610368600435610ddc565b34801561046257600080fd5b506103ad73ffffffffffffffffffffffffffffffffffffffff60043516602435610e38565b34801561049357600080fd5b5061036873ffffffffffffffffffffffffffffffffffffffff60043581169060243516604435610e92565b3480156104ca57600080fd5b506103ad610eb3565b3480156104df57600080fd5b506104e8610eb9565b6040805161ffff9092168252519081900360200190f35b34801561050b57600080fd5b506040805160206004803580820135601f8101849004840285018401909552848452610368943694929360249392840191908190840183828082843750949750610ec89650505050505050565b34801561056457600080fd5b506104e8600435610f06565b34801561057c57600080fd5b506103ad600435610f3e565b34801561059457600080fd5b5061036873ffffffffffffffffffffffffffffffffffffffff60043516610f73565b3480156105c257600080fd5b5061030e600435610ff8565b3480156105da57600080fd5b506105e3611033565b6040805160ff9092168252519081900360200190f35b34801561060557600080fd5b5061061160043561103c565b6040518082608080838360005b8381101561063657818101518382015260200161061e565b5050505090500191505060405180910390f35b34801561065557600080fd5b506103ad73ffffffffffffffffffffffffffffffffffffffff6004351661108b565b34801561068357600080fd5b506103686110d8565b34801561069857600080fd5b50610281611149565b3480156106ad57600080fd5b5061036873ffffffffffffffffffffffffffffffffffffffff6004351660243515156111aa565b3480156106e057600080fd5b506106ec600435611266565b6040805194855273ffffffffffffffffffffffffffffffffffffffff909316602085015261ffff909116838301526060830152519081900360800190f35b34801561073657600080fd5b5061030e6112c9565b34801561074b57600080fd5b50604080516020601f6064356004818101359283018490048402850184019095528184526103689473ffffffffffffffffffffffffffffffffffffffff81358116956024803590921695604435953695608494019181908401838280828437509497506112ec9650505050505050565b3480156107c757600080fd5b506103ad600435611314565b3480156107df57600080fd5b5061036860043561ffff60243516611369565b3480156107fe57600080fd5b5061028160043561141d565b34801561081657600080fd5b506103ad61150f565b34801561082b57600080fd5b506103ad600435611515565b34801561084357600080fd5b506103ad600435611543565b34801561085b57600080fd5b50610368600435611575565b34801561087357600080fd5b506103ad73ffffffffffffffffffffffffffffffffffffffff600435166115a5565b6103686004356115b7565b3480156108ac57600080fd5b506104e8600435611793565b3480156108c457600080fd5b5061036860ff600435166117c9565b3480156108df57600080fd5b5061025873ffffffffffffffffffffffffffffffffffffffff60043581169060243516611828565b34801561091357600080fd5b5061091c611863565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015610960578181015183820152602001610948565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561099f578181015183820152602001610987565b5050505090500194505050505060405180910390f35b3480156109c157600080fd5b50610281611965565b3480156109d657600080fd5b506109e26004356119f3565b604080517dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909316835261ffff90911660208301528051918290030190f35b7fffffffff00000000000000000000000000000000000000000000000000000000811660009081526020819052604090205460ff165b919050565b60098054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610ae65780601f10610abb57610100808354040283529160200191610ae6565b820191906000526020600020905b815481529060010190602001808311610ac957829003601f168201915b505050505090505b90565b6000610afc82611a4d565b1515610b0757600080fd5b5060009081526002602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b6000610b3b82610ff8565b905073ffffffffffffffffffffffffffffffffffffffff8381169082161415610b6357600080fd5b3373ffffffffffffffffffffffffffffffffffffffff82161480610b8c5750610b8c8133611828565b1515610b9757600080fd5b60008281526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff87811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600d546301000000900473ffffffffffffffffffffffffffffffffffffffff163314610c4357600080fd5b600d805473ffffffffffffffffffffffffffffffffffffffff9092166301000000027fffffffffffffffffff0000000000000000000000000000000000000000ffffff909216919091179055565b60075490565b6000610cc58260067f3233343536373839434647484a4d505152565758000000000000000000000000611a77565b92915050565b6000610cc58260067f5857565251504d4a484746433938373635343332000000000000000000000000611a77565b610d033382611edc565b1515610d0e57600080fd5b73ffffffffffffffffffffffffffffffffffffffff82161515610d3057600080fd5b610d3a8382611f71565b610d448382612012565b610d4e828261215a565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000610cc58260077f5857565251504d4a484746433938373635343332000000000000000000000000611a77565b600d546301000000900473ffffffffffffffffffffffffffffffffffffffff163314610e0757600080fd5b604051339082156108fc029083906000818181858888f19350505050158015610e34573d6000803e3d6000fd5b5050565b6000610e438361108b565b8210610e4e57600080fd5b73ffffffffffffffffffffffffffffffffffffffff83166000908152600560205260409020805483908110610e7f57fe5b9060005260206000200154905092915050565b610eae83838360206040519081016040528060008152506112ec565b505050565b600c5481565b600d54610100900461ffff1681565b600d546301000000900473ffffffffffffffffffffffffffffffffffffffff163314610ef357600080fd5b8051610e3490600e906020840190612cf1565b6000908152600f60205260409020547e01000000000000000000000000000000000000000000000000000000000000900461ffff1690565b6000610f48610c91565b8210610f5357600080fd5b6007805483908110610f6157fe5b90600052602060002001549050919050565b33600090815260106020526040902054801515610f8f57610e34565b33600090815260106020526040812055601154610fb2908263ffffffff6121b016565b60115560405173ffffffffffffffffffffffffffffffffffffffff83169082156108fc029083906000818181858888f19350505050158015610eae573d6000803e3d6000fd5b60008181526001602052604081205473ffffffffffffffffffffffffffffffffffffffff1680151561102957600080fd5b8091505b50919050565b600d5460ff1681565b611044612d6f565b60806040519081016040528061105984610c97565b815260200161106784611515565b815260200161107584610ccb565b815260200161108384610dae565b905292915050565b600073ffffffffffffffffffffffffffffffffffffffff821615156110af57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b600d546301000000900473ffffffffffffffffffffffffffffffffffffffff16331461110357600080fd5b60115433906108fc9061111e9030319063ffffffff6121b016565b6040518115909202916000818181858888f19350505050158015611146573d6000803e3d6000fd5b50565b600a8054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610ae65780601f10610abb57610100808354040283529160200191610ae6565b73ffffffffffffffffffffffffffffffffffffffff82163314156111cd57600080fd5b33600081815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b600080600080600061127786611314565b905061128286611a4d565b156112b05761129086611543565b61129987610ff8565b6112a288611793565b8394509450945094506112c1565b600c54945060009350600a92509050805b509193509193565b600d546301000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6112f7848484610cf9565b611303848484846121c7565b151561130e57600080fd5b50505050565b600061131f82611a4d565b156113615761135a600a61134e61133585611793565b61ffff1661134286611543565b9063ffffffff61236616565b9063ffffffff61239b16565b9050610a55565b5050600c5490565b8161137381610ff8565b73ffffffffffffffffffffffffffffffffffffffff16331461139457600080fd5b60018261ffff16101580156113af57506103e88261ffff1611155b15156113ba57600080fd5b506000918252600f6020526040909120805461ffff9092167e01000000000000000000000000000000000000000000000000000000000000027dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b606061142882611a4d565b151561143357600080fd5b600e805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152610cc5936114d693919290918301828280156114c35780601f10611498576101008083540402835291602001916114c3565b820191906000526020600020905b8154815290600101906020018083116114a657829003601f168201915b50505050506114d1856123be565b61256e565b60408051808201909152600581527f2e6a736f6e000000000000000000000000000000000000000000000000000000602082015261256e565b60115481565b6000610cc58260077f3233343536373839434647484a4d505152565758000000000000000000000000611a77565b6000908152600f60205260409020547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690565b600d546301000000900473ffffffffffffffffffffffffffffffffffffffff1633146115a057600080fd5b600c55565b60106020526000908152604090205481565b6000806000806115c5612d6f565b6000806115d188611314565b9650348711156115e057600080fd5b6040805180820182527dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3481168252600060208084018281528d8352600f90915293902091518254935161ffff167e01000000000000000000000000000000000000000000000000000000000000029082167fffff000000000000000000000000000000000000000000000000000000000000909416939093171691909117905561168888611a4d565b151561169d57611698338961272d565b611789565b6116a688610ff8565b955073ffffffffffffffffffffffffffffffffffffffff86163314156116cb57600080fd5b6116d5868961277c565b6116df338961272d565b600d546116f690349060ff1663ffffffff61239b16565b9450600193506117058861103c565b9250600091505b60048210156117605782826004811061172157fe5b6020020151905061173181611a4d565b151561173c57611755565b61174e61174882610ff8565b866127c4565b6001909301925b60019091019061170c565b61178986611784611777888863ffffffff61236616565b349063ffffffff6121b016565b6127c4565b5050505050505050565b60008061179f83610f06565b905060008161ffff1611156117b65780915061102d565b5050600d54610100900461ffff16919050565b600d546301000000900473ffffffffffffffffffffffffffffffffffffffff1633146117f457600080fd5b600d80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff92909216919091179055565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260046020908152604080832093909416825291909152205460ff1690565b60608060006060806000611875610c91565b9350836040519080825280602002602001820160405280156118a1578160200160208202803883390190505b509250836040519080825280602002602001820160405280156118ce578160200160208202803883390190505b509150600090505b8381101561195a576118e781610f3e565b83828151811015156118f557fe5b6020908102909101015282516119209084908390811061191157fe5b90602001906020020151610ff8565b828281518110151561192e57fe5b73ffffffffffffffffffffffffffffffffffffffff9092166020928302909101909101526001016118d6565b509094909350915050565b600e805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156119eb5780601f106119c0576101008083540402835291602001916119eb565b820191906000526020600020905b8154815290600101906020018083116119ce57829003601f168201915b505050505081565b600f602052600090815260409020547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116907e01000000000000000000000000000000000000000000000000000000000000900461ffff1682565b60009081526001602052604090205473ffffffffffffffffffffffffffffffffffffffff16151590565b600080600080600080871215611a8f57879450611ed1565b611aca886017890160208110611aa157fe5b1a7f01000000000000000000000000000000000000000000000000000000000000000287612878565b9350611ad7888886612974565b92508560001a7f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916847effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415611ecd577ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe87019150826015880160208110611b7e57fe5b1a7f01000000000000000000000000000000000000000000000000000000000000000290508160011415611d37577fffffffffffffffffffffffffffffffffffffffff00000000000000000000000086167f3233343536373839434647484a4d505152565758000000000000000000000000148015611c3e57507f56000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216145b15611c7557611c6e83837f3200000000000000000000000000000000000000000000000000000000000000612974565b9450611ed1565b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000086167f5857565251504d4a484746433938373635343332000000000000000000000000148015611d0757507f32000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216145b15611d3757611c6e83837f5600000000000000000000000000000000000000000000000000000000000000612974565b811515611ec2577fffffffffffffffffffffffffffffffffffffffff00000000000000000000000086167f3233343536373839434647484a4d505152565758000000000000000000000000148015611dd057507f43000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216145b15611e0057611c6e83837f3200000000000000000000000000000000000000000000000000000000000000612974565b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000086167f5857565251504d4a484746433938373635343332000000000000000000000000148015611e9257507f32000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216145b15611ec257611c6e83837f4300000000000000000000000000000000000000000000000000000000000000612974565b611c6e838388611a77565b8294505b505050509392505050565b600080611ee883610ff8565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611f5757508373ffffffffffffffffffffffffffffffffffffffff16611f3f84610af1565b73ffffffffffffffffffffffffffffffffffffffff16145b80611f675750611f678185611828565b91505b5092915050565b8173ffffffffffffffffffffffffffffffffffffffff16611f9182610ff8565b73ffffffffffffffffffffffffffffffffffffffff1614611fb157600080fd5b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff1615610e3457600090815260026020526040902080547fffffffffffffffffffffffff000000000000000000000000000000000000000016905550565b600080600061202185856129b2565b60008481526006602090815260408083205473ffffffffffffffffffffffffffffffffffffffff8916845260059092529091205490935061206990600163ffffffff6121b016565b73ffffffffffffffffffffffffffffffffffffffff861660009081526005602052604090208054919350908390811061209e57fe5b9060005260206000200154905080600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020848154811015156120f857fe5b600091825260208083209091019290925573ffffffffffffffffffffffffffffffffffffffff8716815260059091526040902080549061213c906000198301612d8e565b50600093845260066020526040808520859055908452909220555050565b60006121668383612a87565b5073ffffffffffffffffffffffffffffffffffffffff9091166000908152600560209081526040808320805460018101825590845282842081018590559383526006909152902055565b600080838311156121c057600080fd5b5050900390565b6000806121e98573ffffffffffffffffffffffffffffffffffffffff16612b49565b15156121f8576001915061235d565b6040517f150b7a02000000000000000000000000000000000000000000000000000000008152336004820181815273ffffffffffffffffffffffffffffffffffffffff898116602485015260448401889052608060648501908152875160848601528751918a169463150b7a0294938c938b938b93909160a490910190602085019080838360005b83811015612298578181015183820152602001612280565b50505050905090810190601f1680156122c55780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b1580156122e757600080fd5b505af11580156122fb573d6000803e3d6000fd5b505050506040513d602081101561231157600080fd5b50517fffffffff0000000000000000000000000000000000000000000000000000000081167f150b7a020000000000000000000000000000000000000000000000000000000014925090505b50949350505050565b6000808315156123795760009150611f6a565b5082820282848281151561238957fe5b041461239457600080fd5b9392505050565b6000808083116123aa57600080fd5b82848115156123b557fe5b04949350505050565b604080516020808252818301909252606091839183916000918291829185918082016104008038833901905050945060009350600092505b6020831015612483576008830260020a860291507fff000000000000000000000000000000000000000000000000000000000000008216156124785781858581518110151561244157fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506001909301925b6001909201916123f6565b836040519080825280601f01601f1916602001820160405280156124b1578160200160208202803883390190505b509050600092505b838310156125635784838151811015156124cf57fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002818481518110151561252857fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506001909201916124b9565b979650505050505050565b606080606080606060008088955087945084518651016040519080825280601f01601f1916602001820160405280156125b1578160200160208202803883390190505b50935083925060009150600090505b855181101561266e5785818151811015156125d757fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002838380600101945081518110151561263657fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506001016125c0565b5060005b845181101561272057848181518110151561268957fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f01000000000000000000000000000000000000000000000000000000000000000283838060010194508151811015156126e857fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600101612672565b5090979650505050505050565b6127378282612b51565b600780546000838152600860205260408120829055600182018355919091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688015550565b6127868282612bc6565b6000818152600b60205260409020546002600019610100600184161502019091160415610e34576000818152600b60205260408120610e3491612db2565b60405160009073ffffffffffffffffffffffffffffffffffffffff84169083156108fc0290849084818181858888f193505050509050801515610eae5773ffffffffffffffffffffffffffffffffffffffff8316600090815260106020526040902054612837908363ffffffff612c8216565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260106020526040902055601154612870908363ffffffff612c8216565b601155505050565b6000805b6014811015611f6a5782816014811061289157fe5b1a7f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916847effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141561296c578060131461293e5782600182016014811061291657fe5b1a7f010000000000000000000000000000000000000000000000000000000000000002612965565b8260001a7f0100000000000000000000000000000000000000000000000000000000000000025b9150611f6a565b60010161287c565b60ff600892830390920260020a91820219929092167f0100000000000000000000000000000000000000000000000000000000000000909204021790565b8173ffffffffffffffffffffffffffffffffffffffff166129d282610ff8565b73ffffffffffffffffffffffffffffffffffffffff16146129f257600080fd5b73ffffffffffffffffffffffffffffffffffffffff8216600090815260036020526040902054612a2990600163ffffffff6121b016565b73ffffffffffffffffffffffffffffffffffffffff90921660009081526003602090815260408083209490945591815260019091522080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60008181526001602052604090205473ffffffffffffffffffffffffffffffffffffffff1615612ab657600080fd5b600081815260016020818152604080842080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff88169081179091558452600390915290912054612b1c91612c82565b73ffffffffffffffffffffffffffffffffffffffff90921660009081526003602052604090209190915550565b6000903b1190565b73ffffffffffffffffffffffffffffffffffffffff82161515612b7357600080fd5b612b7d828261215a565b604051819073ffffffffffffffffffffffffffffffffffffffff8416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000806000612bd58585612c94565b600084815260086020526040902054600754909350612bfb90600163ffffffff6121b016565b9150600782815481101515612c0c57fe5b9060005260206000200154905080600784815481101515612c2957fe5b60009182526020822001919091556007805484908110612c4557fe5b6000918252602090912001556007805490612c64906000198301612d8e565b50600093845260086020526040808520859055908452909220555050565b60008282018381101561239457600080fd5b612c9e8282611f71565b612ca88282612012565b604051819060009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612d3257805160ff1916838001178555612d5f565b82800160010185558215612d5f579182015b82811115612d5f578251825591602001919060010190612d44565b50612d6b929150612df2565b5090565b6080604051908101604052806004906020820280388339509192915050565b815481835581811115610eae57600083815260209020610eae918101908301612df2565b50805460018160011615610100020316600290046000825580601f10612dd85750611146565b601f01602090049060005260206000209081019061114691905b610aee91905b80821115612d6b5760008155600101612df85600a165627a7a7230582004634b7278889d13c95e1a21bf89bf2c92f54ff1a10419167995cf7532f8e9d70029

Deployed Bytecode Sourcemap

29242:10481:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6944:147;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;6944:147:0;;;;;;;;;;;;;;;;;;;;;;;;;27049:72;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27049:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;27049:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10863:144;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;10863:144:0;;;;;;;;;;;;;;;;;;;;;;;;10307:277;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;10307:277:0;;;;;;;;;;;30686:91;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;30686:91:0;;;;;;;21629:90;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21629:90:0;;;;;;;;;;;;;;;;;;;;38921:128;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;38921:128:0;;;;;39057;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;39057:128:0;;;;;12410:341;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;12410:341:0;;;;;;;;;;;;;;39328:127;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;39328:127:0;;;;;30917:105;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;30917:105:0;;;;;21273:208;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;21273:208:0;;;;;;;;;13378:202;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;13378:202:0;;;;;;;;;;;;;;29302:43;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29302:43:0;;;;29444:36;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29444:36:0;;;;;;;;;;;;;;;;;;;;;;;30580:98;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;30580:98:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30580:98:0;;-1:-1:-1;30580:98:0;;-1:-1:-1;;;;;;;30580:98:0;30212:116;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;30212:116:0;;;;;22050:141;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;22050:141:0;;;;;34515:288;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;34515:288:0;;;;;;;9727:167;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;9727:167:0;;;;;29384:32;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29384:32:0;;;;;;;;;;;;;;;;;;;;;;;39463:255;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;39463:255:0;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;39463:255:0;;;;;;;;;;;;;;;;9365:143;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;9365:143:0;;;;;;;31030:134;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31030:134:0;;;;27225:76;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27225:76:0;;;;11293:203;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;11293:203:0;;;;;;;;;;;31712:329;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;31712:329:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29535:34;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29535:34:0;;;;14273:276;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;14273:276:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14273:276:0;;-1:-1:-1;14273:276:0;;-1:-1:-1;;;;;;;14273:276:0;32049:227;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;32049:227:0;;;;;32665:194;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;32665:194:0;;;;;;;;;35051:195;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;35051:195:0;;;;;29920:31;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29920:31:0;;;;39193:127;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;39193:127:0;;;;;30076:128;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;30076:128:0;;;;;30336:107;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;30336:107:0;;;;;29865:48;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;29865:48:0;;;;;;;33382:1125;;;;;;32284:225;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;32284:225:0;;;;;30451:121;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;30451:121:0;;;;;;;11811:174;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;11811:174:0;;;;;;;;;;;;31228:476;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31228:476:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;31228:476:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;31228:476:0;;;;;;;;;;;;;;;;;;;29576:47;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29576:47:0;;;;29713:40;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;29713:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6944:147;7052:33;;;7029:4;7052:33;;;;;;;;;;;;;6944:147;;;;:::o;27049:72::-;27110:5;27103:12;;;;;;;;-1:-1:-1;;27103:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27088:6;;27103:12;;27110:5;;27103:12;;27110:5;27103:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27049:72;;:::o;10863:144::-;10922:7;10946:16;10954:7;10946;:16::i;:::-;10938:25;;;;;;;;-1:-1:-1;10977:24:0;;;;:15;:24;;;;;;;;;10863:144::o;10307:277::-;10367:13;10383:16;10391:7;10383;:16::i;:::-;10367:32;-1:-1:-1;10414:11:0;;;;;;;;;10406:20;;;;;;10441:10;:19;;;;;:58;;;10464:35;10481:5;10488:10;10464:16;:35::i;:::-;10433:67;;;;;;;;10509:24;;;;:15;:24;;;;;;:29;;;;;;;;;;;;;;10550:28;;10509:24;;10550:28;;;;;;;10307:277;;;:::o;30686:91::-;30041:6;;;;;;;30027:10;:20;30019:29;;;;;;30755:6;:14;;;;;;;;;;;;;;;;;;30686:91::o;21629:90::-;21696:10;:17;21629:90;:::o;38921:128::-;38981:7;39008:33;39022:7;39031:1;36985:31;39008:13;:33::i;:::-;39001:40;38921:128;-1:-1:-1;;38921:128:0:o;39057:::-;39117:7;39144:33;39158:7;39167:1;37049:31;39144:13;:33::i;12410:341::-;12525:39;12544:10;12556:7;12525:18;:39::i;:::-;12517:48;;;;;;;;12580:16;;;;;12572:25;;;;;;12606:29;12621:4;12627:7;12606:14;:29::i;:::-;12642:31;12659:4;12665:7;12642:16;:31::i;:::-;12680:24;12692:2;12696:7;12680:11;:24::i;:::-;12737:7;12733:2;12718:27;;12727:4;12718:27;;;;;;;;;;;;12410:341;;;:::o;39328:127::-;39387:7;39414:33;39428:7;39437:1;37049:31;39414:13;:33::i;30917:105::-;30041:6;;;;;;;30027:10;:20;30019:29;;;;;;30987:27;;:10;;:27;;;;;31007:6;;30987:27;;;;31007:6;30987:10;:27;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30987:27:0;30917:105;:::o;21273:208::-;21383:7;21418:16;21428:5;21418:9;:16::i;:::-;21410:24;;21402:33;;;;;;21449:19;;;;;;;:12;:19;;;;;:26;;21469:5;;21449:26;;;;;;;;;;;;;;21442:33;;21273:208;;;;:::o;13378:202::-;13535:39;13552:4;13558:2;13562:7;13535:39;;;;;;;;;;;;;:16;:39::i;:::-;13378:202;;;:::o;29302:43::-;;;;:::o;29444:36::-;;;;;;;;;:::o;30580:98::-;30041:6;;;;;;;30027:10;:20;30019:29;;;;;;30652:18;;;;:8;;:18;;;;;:::i;30212:116::-;30269:6;30295:16;;;:7;:16;;;;;:25;;;;;;;30212:116::o;22050:141::-;22108:7;22140:13;:11;:13::i;:::-;22132:21;;22124:30;;;;;;22168:10;:17;;22179:5;;22168:17;;;;;;;;;;;;;;22161:24;;22050:141;;;:::o;34515:288::-;34596:10;34565:14;34582:25;;;:13;:25;;;;;;34622:11;;34618:50;;;34650:7;;34618:50;34692:10;34706:1;34678:25;;;:13;:25;;;;;:29;34737:16;;:28;;34758:6;34737:28;:20;:28;:::i;:::-;34718:16;:47;34776:19;;:11;;;;:19;;;;;34788:6;;34776:19;;;;34788:6;34776:11;:19;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;9727:167:0;9782:7;9814:20;;;:11;:20;;;;;;;;9849:19;;;9841:28;;;;;;9883:5;9876:12;;9727:167;;;;;:::o;29384:32::-;;;;;;:::o;39463:255::-;39527:10;;:::i;:::-;39550:160;;;;;;;;;39572:21;39585:7;39572:12;:21::i;:::-;39550:160;;;;39608:20;39620:7;39608:11;:20::i;:::-;39550:160;;;;39643:21;39656:7;39643:12;:21::i;:::-;39550:160;;;;39679:20;39691:7;39679:11;:20::i;:::-;39550:160;;;39463:255;-1:-1:-1;;39463:255:0:o;9365:143::-;9420:7;9444:19;;;;;9436:28;;;;;;-1:-1:-1;9478:24:0;;;;;;:17;:24;;;;;;;9365:143::o;31030:134::-;30041:6;;;;;;;30027:10;:20;30019:29;;;;;;31138:16;;31092:10;;:64;;31112:43;;31120:4;31112:21;;:43;:25;:43;:::i;:::-;31092:64;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31092:64:0;31030:134::o;27225:76::-;27288:7;27281:14;;;;;;;;-1:-1:-1;;27281:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27266:6;;27281:14;;27288:7;;27281:14;;27288:7;27281:14;;;;;;;;;;;;;;;;;;;;;;;;11293:203;11369:16;;;11375:10;11369:16;;11361:25;;;;;;11412:10;11393:30;;;;:18;:30;;;;;;;;;:34;;;;;;;;;;;;:45;;;;;;;;;;;;;11450:40;;;;;;;11393:34;;11412:10;11450:40;;;;;;;;;;;11293:203;;:::o;31712:329::-;31776:7;31785;31794:6;31802:7;31822:13;31838:16;31846:7;31838;:16::i;:::-;31822:32;;31871:16;31879:7;31871;:16::i;:::-;31867:123;;;31912:19;31923:7;31912:10;:19::i;:::-;31933:16;31941:7;31933;:16::i;:::-;31951:19;31962:7;31951:10;:19::i;:::-;31972:5;31904:74;;;;;;;;;;31867:123;32008:10;;;-1:-1:-1;32020:1:0;;-1:-1:-1;32023:2:0;;-1:-1:-1;32027:5:0;-1:-1:-1;32027:5:0;31712:329;;;;;;;:::o;29535:34::-;;;;;;;;;:::o;14273:276::-;14402:31;14415:4;14421:2;14425:7;14402:12;:31::i;:::-;14494:48;14517:4;14523:2;14527:7;14536:5;14494:22;:48::i;:::-;14486:57;;;;;;;;14273:276;;;;:::o;32049:227::-;32104:7;32128:16;32136:7;32128;:16::i;:::-;32124:117;;;32168:61;32226:2;32168:53;32200:19;32211:7;32200:10;:19::i;:::-;32192:28;;32168:19;32179:7;32168:10;:19::i;:::-;:23;:53;:23;:53;:::i;:::-;:57;:61;:57;:61;:::i;:::-;32161:68;;;;32124:117;-1:-1:-1;;32258:10:0;;;32049:227::o;32665:194::-;32742:7;32620:16;32628:7;32620;:16::i;:::-;32606:30;;:10;:30;32598:39;;;;;;32782:1;32770:8;:13;;;;:33;;;;;32799:4;32787:8;:16;;;;32770:33;32762:42;;;;;;;;-1:-1:-1;32815:16:0;;;;:7;:16;;;;;;:36;;;;;;;;;;;;;;;;;;32665:194::o;35051:195::-;35110:6;35137:17;35145:8;35137:7;:17::i;:::-;35129:26;;;;;;;;35193:8;35183:46;;;;;;;;;;;;;-1:-1:-1;;35183:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;35173:65;;35183:46;;;;35193:8;;35183:46;;35193:8;35183:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35203:25;35219:8;35203:15;:25::i;:::-;35183:9;:46::i;:::-;35173:65;;;;;;;;;;;;;;;;;:9;:65::i;29920:31::-;;;;:::o;39193:127::-;39252:7;39279:33;39293:7;39302:1;36985:31;39279:13;:33::i;30076:128::-;30134:7;30169:16;;;:7;:16;;;;;:26;;;;30076:128::o;30336:107::-;30041:6;;;;;;;30027:10;:20;30019:29;;;;;;30413:10;:22;30336:107::o;29865:48::-;;;;;;;;;;;;;:::o;33382:1125::-;33507:13;33820;33975:14;34039:21;34088:27;;:::i;:::-;34159:6;34198:16;33523;33531:7;33523;:16::i;:::-;33507:32;-1:-1:-1;33611:9:0;:18;-1:-1:-1;33611:18:0;33603:27;;;;;;33662:36;;;;;;;;;33676:9;33662:36;;;;-1:-1:-1;33662:36:0;;;;;;;33643:16;;;:7;:16;;;;;;:55;;;;;;33662:36;33643:55;;;;;;;;;;;;;;;;;;;;;33716:16;33651:7;33716;:16::i;:::-;33715:17;33711:97;;;33749:26;33755:10;33767:7;33749:5;:26::i;:::-;33790:7;;33711:97;33836:16;33844:7;33836;:16::i;:::-;33820:32;-1:-1:-1;33871:19:0;;;33880:10;33871:19;;33863:28;;;;;;33904:21;33910:5;33917:7;33904:5;:21::i;:::-;33936:26;33942:10;33954:7;33936:5;:26::i;:::-;34006:14;;33992:29;;:9;;34006:14;;33992:29;:13;:29;:::i;:::-;33975:46;;34063:1;34039:25;;34118;34135:7;34118:16;:25::i;:::-;34088:55;;34168:1;34159:10;;34154:258;34175:1;34171;:5;34154:258;;;34217:9;34227:1;34217:12;;;;;;;;;;;34198:31;;34249:17;34257:8;34249:7;:17::i;:::-;34248:18;34244:67;;;34287:8;;34244:67;34325:45;34344:17;34352:8;34344:7;:17::i;:::-;34363:6;34325:18;:45::i;:::-;34385:15;;;;;34154:258;34178:3;;;;;34154:258;;;34424:67;34443:5;34450:40;34464:25;:6;34475:13;34464:25;:10;:25;:::i;:::-;34450:9;;:40;:13;:40;:::i;:::-;34424:18;:67::i;:::-;33382:1125;;;;;;;;:::o;32284:225::-;32342:6;32361:15;32379:18;32389:7;32379:9;:18::i;:::-;32361:36;;32423:1;32412:8;:12;;;32408:60;;;32448:8;32441:15;;;;32408:60;-1:-1:-1;;32485:16:0;;;;;;;;32284:225;-1:-1:-1;32284:225:0:o;30451:121::-;30041:6;;;;;;;30027:10;:20;30019:29;;;;;;30534:14;:30;;;;;;;;;;;;;;;30451:121::o;11811:174::-;11944:25;;;;11921:4;11944:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;11811:174::o;31228:476::-;31272:9;31283;31307:15;31351:29;31419:30;31495:6;31325:13;:11;:13::i;:::-;31307:31;;31397:10;31383:25;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;31383:25:0;;31351:57;;31466:10;31452:25;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;31452:25:0;;31419:58;;31504:1;31495:10;;31490:156;31511:10;31507:1;:14;31490:156;;;31561:15;31574:1;31561:12;:15::i;:::-;31543:12;31556:1;31543:15;;;;;;;;;;;;;;;;;;:33;31618:15;;31610:24;;31618:12;;31631:1;;31618:15;;;;;;;;;;;;;;31610:7;:24::i;:::-;31591:13;31605:1;31591:16;;;;;;;;;;:43;;;;:16;;;;;;;;;;:43;31523:3;;31490:156;;;-1:-1:-1;31666:12:0;;31680:13;;-1:-1:-1;31228:476:0;-1:-1:-1;;31228:476:0:o;29576:47::-;;;;;;;;;;;;;;;-1:-1:-1;;29576:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;29713:40::-;;;;;;;;;;;;;;;;;;;;;;:::o;14733:145::-;14790:4;14819:20;;;:11;:20;;;;;;;;14853:19;;;14733:145::o;37593:1320::-;37680:7;37755:6;37825:15;37923:11;37959:16;37712:1;37706:3;:7;37702:40;;;37735:7;37728:14;;;;37702:40;37764:50;37781:7;37790:2;:14;;37773:32;;;;;;;;;;37807:6;37764:8;:50::i;:::-;37755:59;;37843:34;37855:7;37869:3;37875:1;37843:11;:34::i;:::-;37825:52;-1:-1:-1;37897:6:0;37904:1;37897:9;;;37892:14;;;:1;:14;;;;37888:993;;;37937:7;;;;-1:-1:-1;37986:7:0;37995:18;;;37978:36;;;;;;;;;;37959:55;;38079:7;38090:1;38079:12;38075:338;;;38116:16;;;36985:31;38116:16;:38;;;;-1:-1:-1;38136:18:0;;;;;38116:38;38112:134;;;38186:40;38198:7;38212;38186:40;:11;:40::i;:::-;38179:47;;;;38112:134;38268:16;;;37049:31;38268:16;:38;;;;-1:-1:-1;38288:18:0;;;;;38268:38;38264:134;;;38338:40;38350:7;38364;38338:40;:11;:40::i;38264:134::-;38475:12;;38471:338;;;38512:16;;;36985:31;38512:16;:38;;;;-1:-1:-1;38532:18:0;;;;;38512:38;38508:134;;;38582:40;38594:7;38608;38582:40;:11;:40::i;38508:134::-;38664:16;;;37049:31;38664:16;:38;;;;-1:-1:-1;38684:18:0;;;;;38664:38;38660:134;;;38734:40;38746:7;38760;38734:40;:11;:40::i;38660:134::-;38830:39;38844:7;38853;38862:6;38830:13;:39::i;37888:993::-;38898:7;38891:14;;37593:1320;;;;;;;;;;:::o;15232:449::-;15347:4;15363:13;15379:16;15387:7;15379;:16::i;:::-;15363:32;;15578:5;15567:16;;:7;:16;;;:58;;;;15618:7;15594:31;;:20;15606:7;15594:11;:20::i;:::-;:31;;;15567:58;:101;;;;15636:32;15653:5;15660:7;15636:16;:32::i;:::-;15551:124;;15232:449;;;;;;:::o;19011:215::-;19110:5;19090:25;;:16;19098:7;19090;:16::i;:::-;:25;;;19082:34;;;;;;19163:1;19127:24;;;:15;:24;;;;;;:38;:24;:38;19123:98;;19211:1;19176:24;;;:15;:24;;;;;:37;;;;;;-1:-1:-1;19011:215:0:o;23404:1039::-;23662:18;23716:22;23780:17;23477:37;23500:4;23506:7;23477:22;:37::i;:::-;23683:26;;;;:17;:26;;;;;;;;;23741:18;;;;;:12;:18;;;;;;:25;23683:26;;-1:-1:-1;23741:32:0;;23771:1;23741:32;:29;:32;:::i;:::-;23800:18;;;;;;;:12;:18;;;;;:34;;23716:57;;-1:-1:-1;23800:18:0;23716:57;;23800:34;;;;;;;;;;;;;;23780:54;;23876:9;23843:12;:18;23856:4;23843:18;;;;;;;;;;;;;;;23862:10;23843:30;;;;;;;;;;;;;;;;;;;;;:42;;;;23965:18;;;;;:12;:18;;;;;;:27;;;;;-1:-1:-1;;23965:27:0;;;:::i;:::-;-1:-1:-1;24388:1:0;24359:26;;;:17;:26;;;;;;:30;;;24396:28;;;;;;:41;-1:-1:-1;;23404:1039:0:o;22658:228::-;22761:14;22724:30;22742:2;22746:7;22724:17;:30::i;:::-;-1:-1:-1;22778:16:0;;;;;;;;:12;:16;;;;;;;;:23;;39:1:-1;23:18;;45:23;;22808:30:0;;;;;;;;;;;22845:26;;;:17;:26;;;;;:35;22658:228::o;4400:136::-;4458:7;;4482:6;;;;4474:15;;;;;;-1:-1:-1;;4508:5:0;;;4400:136::o;18389:355::-;18530:4;18602:13;18551:15;:2;:13;;;:15::i;:::-;18550:16;18546:50;;;18584:4;18577:11;;;;18546:50;18618:78;;;;;18663:10;18618:78;;;;;;:36;:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;:36;;;;;;18663:10;18675:4;;18681:7;;18690:5;;18618:78;;;;;;;;;;;;;;-1:-1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;18618:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18618:78:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18618:78:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18618:78:0;18711:26;;;18721:16;18711:26;;-1:-1:-1;18618:78:0;-1:-1:-1;18389:355:0;;;;;;;;:::o;3498:393::-;3556:7;;3784:6;;3780:37;;;3808:1;3801:8;;;;3780:37;-1:-1:-1;3837:5:0;;;3841:1;3837;:5;3857;;;;;;;;:10;3849:19;;;;;;3884:1;3498:393;-1:-1:-1;;;3498:393:0:o;4006:276::-;4064:7;;4088:5;;;4080:14;;;;;;4175:1;4171;:5;;;;;;;;;4006:276;-1:-1:-1;;;;4006:276:0:o;35332:642::-;35469:13;;;35479:2;35469:13;;;;;;;;;35390:6;;35429:1;;35390:6;;35409:9;;;;;;35390:6;;35469:13;;;17:15:-1;;105:10;35469:13:0;88:34:-1;136:17;;-1:-1;35469:13:0;35442:40;;35510:1;35493:18;;35536:1;35527:10;;35522:229;35543:2;35539:1;:6;35522:229;;;35608:1;:5;;35602:1;:12;35592:22;;;-1:-1:-1;35635:9:0;;;;35631:109;;35690:4;35665:11;35677:9;35665:22;;;;;;;;;;;;;;:29;;;;;;;;;;-1:-1:-1;35713:11:0;;;;;35631:109;35547:3;;;;;35522:229;;;35805:9;35795:20;;;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;35795:20:0;;35761:54;;35835:1;35831:5;;35826:97;35842:9;35838:1;:13;35826:97;;;35897:11;35909:1;35897:14;;;;;;;;;;;;;;;;;;;;35873:18;35892:1;35873:21;;;;;;;;;;;;;;:38;;;;;;;;;;-1:-1:-1;35853:3:0;;;;;35826:97;;;35947:18;35332:642;-1:-1:-1;;;;;;;35332:642:0:o;36401:491::-;36464:6;36483:20;36526;36569:16;36643:21;36687:6;36713;36512:2;36483:32;;36555:2;36526:32;;36617:7;:14;36600:7;:14;:31;36588:44;;;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;36588:44:0;;36569:63;;36673:2;36643:33;;36696:1;36687:10;;36722:1;36713:10;;36708:68;36729:7;:14;36725:1;:18;36708:68;;;36766:7;36774:1;36766:10;;;;;;;;;;;;;;;;;;;;36750:8;36759:3;;;;;;36750:13;;;;;;;;;;;;;;:26;;;;;;;;;;-1:-1:-1;36745:3:0;;36708:68;;;-1:-1:-1;36796:1:0;36787:63;36803:7;:14;36799:1;:18;36787:63;;;36840:7;36848:1;36840:10;;;;;;;;;;;;;;;;;;;;36824:8;36833:3;;;;;;36824:13;;;;;;;;;;;;;;:26;;;;;;;;;;-1:-1:-1;36819:3:0;;36787:63;;;-1:-1:-1;36875:8:0;;36401:491;-1:-1:-1;;;;;;;36401:491:0:o;24710:174::-;24770:24;24782:2;24786:7;24770:11;:24::i;:::-;24830:10;:17;;24803:24;;;;:15;:24;;;;;:44;;;39:1:-1;23:18;;45:23;;24854:24:0;;;;;;;-1:-1:-1;24710:174:0:o;28231:223::-;28294:27;28306:5;28313:7;28294:11;:27::i;:::-;28372:19;;;;:10;:19;;;;;28366:33;;-1:-1:-1;;28366:33:0;;;;;;;;;;;:38;28362:87;;28422:19;;;;:10;:19;;;;;28415:26;;;:::i;33098:276::-;33189:15;;33174:12;;33189:7;;;;:15;;;;;33197:6;;33174:12;33189:15;33174:12;33189:15;33197:6;33189:7;:15;;;;;;;33174:30;;33220:7;33219:8;33215:152;;;33264:17;;;;;;;:13;:17;;;;;;:29;;33286:6;33264:29;:21;:29;:::i;:::-;33244:17;;;;;;;:13;:17;;;;;:49;33327:16;;:28;;33348:6;33327:28;:20;:28;:::i;:::-;33308:16;:47;33098:276;;;:::o;37089:213::-;37153:4;;37170:122;37191:2;37187:1;:6;37170:122;;;37222:6;37229:1;37222:9;;;;;;;;;;37217:14;;;:1;:14;;;;37213:79;;;37258:1;37263:2;37258:7;37257:35;;37281:6;37290:1;37288:3;;37281:11;;;;;;;;;;37257:35;;;37269:6;37276:1;37269:9;;;37257:35;37250:42;;;;37213:79;37195:3;;37170:122;;37310:275;37519:4;37424:1;:7;;;37423:13;;;37464:19;;37511:22;;;37509:25;37554:14;;;;37464:10;;;;:19;37554:23;;37310:275::o;17660:215::-;17761:4;17741:24;;:16;17749:7;17741;:16::i;:::-;:24;;;17733:33;;;;;;17799:23;;;;;;;:17;:23;;;;;;:30;;17827:1;17799:30;:27;:30;:::i;:::-;17773:23;;;;;;;;:17;:23;;;;;;;;:56;;;;17836:20;;;:11;:20;;;;:33;;;;;;17660:215::o;16942:206::-;17048:1;17016:20;;;:11;:20;;;;;;:34;:20;:34;17008:43;;;;;;17058:20;;;;:11;:20;;;;;;;;:25;;;;;;;;;;;;;17114:21;;:17;:21;;;;;;;:28;;:25;:28::i;:::-;17090:21;;;;;;;;:17;:21;;;;;:52;;;;-1:-1:-1;16942:206:0:o;5524:593::-;5584:4;6068:20;;6103:8;;5524:593::o;15936:167::-;16004:16;;;;;15996:25;;;;;;16028:24;16040:2;16044:7;16028:11;:24::i;:::-;16064:33;;16089:7;;16064:33;;;;16081:1;;16064:33;;16081:1;;16064:33;15936:167;;:::o;25122:479::-;25252:18;25304:22;25360:17;25185:27;25197:5;25204:7;25185:11;:27::i;:::-;25273:24;;;;:15;:24;;;;;;25329:10;:17;25273:24;;-1:-1:-1;25329:24:0;;25351:1;25329:24;:21;:24;:::i;:::-;25304:49;;25380:10;25391:14;25380:26;;;;;;;;;;;;;;;;;;25360:46;;25440:9;25415:10;25426;25415:22;;;;;;;;;;;;;;;;;;:34;;;;25456:10;:26;;25467:14;;25456:26;;;;;;;;;;;;;;;:30;25495:10;:19;;;;;-1:-1:-1;;25495:19:0;;;:::i;:::-;-1:-1:-1;25548:1:0;25521:24;;;:15;:24;;;;;;:28;;;25556:26;;;;;;:39;-1:-1:-1;;25122:479:0:o;4604:136::-;4662:7;4690:5;;;4710:6;;;;4702:15;;;;;16295:186;16358:30;16373:5;16380:7;16358:14;:30::i;:::-;16395:32;16412:5;16419:7;16395:16;:32::i;:::-;16439:36;;16467:7;;16463:1;;16439:36;;;;;;16463:1;;16439:36;16295:186;;:::o;29242:10481::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29242:10481:0;;;-1:-1:-1;29242:10481:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;-1:-1;29242:10481:0;;;-1:-1:-1;;29242:10481:0:o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

bzzr://04634b7278889d13c95e1a21bf89bf2c92f54ff1a10419167995cf7532f8e9d7
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.